instead-3.2.1/AUTHORS0000644000175000017500000000161413267071773013253 0ustar peterpeterINSTEAD was written by: Peter Kosyh Initial port to Windows: Ilya Ryndin Port to Android: Mahno Aleksey Anton Kolosov Port to Mac OS X: .dm Port to Windows CE: Andrey Afletdinov Debian package: Sam Protsenko FreeBSD port, cmake support and fixes: Dmitry Marakasov Ideas, games, advices, testing, bug reports, fixes ... Vadim Balashoff Evgeniy Efremov (jhekasoft) Oleg Gvozdev Heorhiy Kharvat (zaynyatyi) Serj Kalichev Vladimir Podobaev Alexander Soborov Vasily Voronkov Alexander Yakovlev Vladimir Zhirov Andrew Lobanov And many others... Web resources: https://instead-hub.github.io https://github.com/instead-hub/instead Join the chat at: https://gitter.im/instead-hub/instead Unofficial XMPP conference: instead@conference.jabber.ru instead-3.2.1/CMakeLists.txt0000644000175000017500000000466313267071773014752 0ustar peterpeterPROJECT(instead) CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0) SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) IF("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}") MESSAGE(FATAL_ERROR "In-source builds are not allowed. Please read ./INSTALL") ENDIF("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}") # global constants SET(INSTEAD_VERSION "3.2.1") # options OPTION(WITH_SDL2 "Use SDL2 instead of SDL 1" ON) OPTION(WITH_GTK2 "Use GTK2 file open dialog" ON) OPTION(WITH_GTK3 "Use GTK3 file open dialog" OFF) OPTION(WITH_ICONV "Build with iconv support" ON) # Note: there are three build modes for instead: # - SYSTEMWIDE # use it if you want to install it into your (unix) system # - STANDALONE # used to generate standalone relocatable package which # may be run from anywhere. `install' target stages all # required files in ${STANDALONEDIR} for you # - neither (both options disabled) # instead may be run from build directory, useful for # development OPTION(SYSTEMWIDE "Build for systemwide install" ON) OPTION(STANDALONE "Build for standalone package creation" OFF) IF(WITH_GTK2 AND WITH_GTK3) MESSAGE(WARNING "WITH_GTK2 and WITH_GTK3 are mutually exclusive, disabling WITH_GTK2") SET(WITH_GTK2 OFF) ENDIF(WITH_GTK2 AND WITH_GTK3) IF(SYSTEMWIDE AND STANDALONE) MESSAGE(WARNING "Both STANDALONE and SYSTEMWIDE specified, disabling SYSTEMWIDE") SET(SYSTEMWIDE OFF) ENDIF(SYSTEMWIDE AND STANDALONE) SET(BINDIR "bin" CACHE STRING "Where to install binaries") SET(DATADIR "share/instead" CACHE STRING "Where to install data files") SET(STEADDIR "${DATADIR}/stead" CACHE STRING "Where to install stead files") SET(THEMESDIR "${DATADIR}/themes" CACHE STRING "Where to install themes") SET(GAMESDIR "${DATADIR}/games" CACHE STRING "Where to install games") SET(ICONDIR "share/pixmaps" CACHE STRING "Where to install icons") SET(DOCDIR "share/doc/instead" CACHE STRING "Where to install documentation") SET(LANGDIR "${DATADIR}/lang" CACHE STRING "Where to install language files") SET(MANDIR "share/man" CACHE STRING "Where to install man pages") SET(DESKTOPDIR "share/applications" CACHE STRING "Where to install .desktop files") SET(STANDALONEDIR "${PROJECT_BINARY_DIR}/standalone" CACHE STRING "Where to stage stanalone package") # subdirectories ADD_SUBDIRECTORY(desktop) ADD_SUBDIRECTORY(doc) ADD_SUBDIRECTORY(games) ADD_SUBDIRECTORY(icon) ADD_SUBDIRECTORY(lang) ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(stead) ADD_SUBDIRECTORY(themes) instead-3.2.1/COPYING0000644000175000017500000000333513267071773013240 0ustar peterpeterCopyright 2009-2018 Peter Kosyh Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Please see each individual source file for a list of they copyright holders. INSTEAD links with the following libraries/sources: Lua (MIT) SDL (LGPL) SDL_image (LGPL) SDL_ttf (LGPL) SDL_mixer (LGPL) SDL_gfx (Zlib) SDL_anigif.c (LGPL) SDL2 (Zlib) SDL2_image (Zlib) SDL2_ttf (Zlib) SDL2_mixer (Zlib) SDL2_gfx (Zlib) zlib (Zlib) Freetype (LGPL) FFmpeg (LGPL) jpeg (JPEG License) libpng (PNG license) zlib (Zlib License) list routines (MIT) (http://ccodearchive.net/info/list.html) LuaFileSystem (http://keplerproject.github.io/luafilesystem/license.html) tinymt32 (The 3-clause BSD License) instead-3.2.1/ChangeLog0000644000175000017500000006402113267071773013756 0ustar peterpeter3.2.1 * fix: save in lua 5.2 (proxy objects); * new: {$fmt ... } substitution; * fix: instead.set_sound() and snd.play(); * fix: direct mode fix; * fix: bugs in documentation. * new: project moved to https://instead-hub.github.io -- Peter Kosyh Sun, 22 Apr 2018 13:34:00 +0300 3.2.0 * fix: segfault on path overflow fix; * fix: segfault in std.readdir fix; * fix: forever loop bug (unpaired {}); * fix: theme.restore(); * fix: fmt.anchor(), theme.snd.click(), push(), pop(); * fix: snapshots module bugs; * fix: gamefile with main3.lua; * fix: noinv/nolife modules ('step' mod_call error); * fix: xact booleans parameters; * fix: chnage_pl with string argument; * fix: always = true in dialog phrase; * fix: use opengl on Windows instead d3d (nvidia fullscreen bug); * fix: win32 and path encoding problem; * fix: instead.menu(); * fix: save declared functions in tables; * fix: sprite font:size with style; * enh: Android port improvements; * enh: click on bg not passed when xref selected (module click); * enh: documentation; * enh: speed improvements while theme updates; * enh: code cleanups; * new: walkback() in stdlib; * new: math.round; * new: std.var for variable extensions; * new: -renderer parameter; * new: -nocursor parameter; * new: SailfishOS port; * new: WinRT patches for upcoming port; * new: sprite.scr() returns background in non direct mode; * new: sprite.render_callback() (yahoooo!); * new: instead.clipboard() added (SDL2 only); * new: instead.wait_use(); * new: instead.grab_events(); * new: theme.scr.w(), theme.scr.h() (read only); -- Peter Kosyh Fri, 9 Feb 2018 21:07:00 +0300 3.1.2 * regression fix in fading and menu; -- Peter Kosyh Mon, 21 Aug 2017 16:45:00 +0300 3.1.1 * regression fix in fading (Android); * code cleanups; * doc cleanups; -- Peter Kosyh Mon, 21 Aug 2017 08:50:00 +0300 3.1.0 * emscripten port; * fix div by zero in rnd; * fix in loadmod (from gamefile); * fix in path (.walk as function); * fixes in doc; * code cleanups (compilation warnings); * instead.noise1/2/3/4 (Perlin Noise); * pixels:scale()/rotate(); -- Peter Kosyh Sun, 20 Aug 2017 10:16:00 +0300 3.0.1 * fix segfault while pause/resume; * stead3: start() logic fix; -- Peter Kosyh Wed, 24 May 2017 21:03:00 +0300 3.0.0 * refactoring (src/instead); * tiny-instead; * bug fixes; * completely new stead3; * sound.load_mem; * sprite.pixels; -- Peter Kosyh Wed, 19 Apr 2017 17:45:00 +0300 2.4.1 * sprite from sprite load bug fixed with scaling; * fix in themes pager; * fix in stead.menu_toggle(); * memory leak in free_font (sprtites) fixed; * new stead.mouse_show(); * fix in txtnb() escaping; * fix in stead.busy(); * fixes in fonts,cutscene and keyboard example modules; * ua -> uk language, fixes in translation; -- Peter Kosyh Sat, 16 Apr 2016 13:50:00 +0300 2.4.0 * txty (iface.y) -- y position in text; * menu_toggle ("themes", "settings" added), w/o return to top menu; * win.ways.mode = top|bottom in themes; * game themes support (themes/ directory in game); * set theme vars is not working when not using own themes; * fix stead.api_atleast/atleast when using with vv.mm format; * be more strict while loading combined images; * in -debug mode any "resource not found" messages are errors; * be more simple with walk from enter/exit (>= 2.4.0); * About menu shows game information; * -standalone mode; * scr.gfx.icon added (SDL2 only, experimental); * -noconfig parameter; * profiles support added (-profile parameter); * -hires parameter and HQ option (enabled by default); * -modes parameter; * Android-NG and IOS ports improvements; * font size scale is displayed in percents; * -fontscale argument; -- Peter Kosyh Thu, 18 Feb 2016 15:09:00 +0300 2.3.0 * audio default is 44100 hz; * fix segfault in windows version; * visits/visited -> stead.visits, stead.visited; * -nosound fix (volume 0 problem); * fix bug in fingers module; * fixes in Android version; * -resizable parameter and config option (resizable window mode); * SDL2: graphics rewrite (better full screen handling, resize, etc.) * SDL2: fix with alpha blended bg; -- Peter Kosyh Sun, 18 Oct 2015 13:15:00 +0300 2.2.7 * fix bug with fingers positions (forgotten patch) (SDL2); -- Peter Kosyh Sun, 20 Sep 2015 13:49:00 +0300 2.2.6 * fix bug with SDL2 and cursor draw; * fix bug with fingers and click modules; * fix bug with fingers positions (SDL2); * fix bug with cursor positions (SDL2); * fix bug with menu and 32 bit float (S60); * fix SDL window title on S60; -- Peter Kosyh Sun, 20 Sep 2015 13:22:00 +0300 2.2.5 * fix bug with SDL2 and idf format (segfault); * fix bug with SDL2 windows build (cursor coordinates); * fix some bugs with SDL2; * fix bug with music paused while run fullscreen mode; -- Peter Kosyh Sun, 30 Aug 2015 16:15:00 +0300 2.2.4 * fix in prefs module (Windows); * German language and tutorial; -- Peter Kosyh Sun, 2 Aug 2015 11:22:00 +0300 2.2.3 * fix in player_save; * always reset LC_CTYPE to C; * fallback to software renderer if can not create texture; * remove game dialog cleanup; * fix in gamereset() and init() call; * fix with gtk dialog open and SDL2; -- Peter Kosyh Fri, 20 Mar 2015 18:56:00 +0300 2.2.2 * last_disp regression fixed; -- Peter Kosyh Fri, 6 Feb 2015 19:17:00 +0300 2.2.1 * -alsa option removed, use SDL_AUDIODRIVER env instead; * -vsync added for SDL2 vsync feature; * *gray* and *grey* colors are both valid; * fix in sandbox with stead.type; * fix in sprites dirty screen logic; * no 48000 hz sound anymore; * windows build uses SDL2 and luajit; * debug and vsync options in rc file; -- Peter Kosyh Sat, 31 Jan 2015 16:27:00 +0300 2.2.0 * fix in debugger; * fix in links hl with events module; * fix in fr language; * fix segfault in fgetsesc; * space added in fixed gfx theme mode when ways are empty; * rnd is now Tiny Mersenne Twister algo; * scr.gfx.scalable & 4 -> disable font scaling; * stead.life_moved() to detect moves in life; * stead.last_disp() added; * stead.nop() added; * stead.rndseed() added; * ready for IOS build; * touch events via input.finger (finger module); * stead.mouse_pos now returns buttons mask; * do gfx sync in direct mode only after timer event (speedup); * SDL2: do not send key repeats in direct mode (speedup); * SDL2: use scancodes instead keycodes (dvorak fixed); * updated doc/examples/fonts.lua; * fix dropf with 2nd parameter; * added forgotten function dropto; * updated documentation (en/ru); -- Peter Kosyh Thu, 1 Jan 2015 10:52:00 +0300 2.1.1 * -debug parameter fixed; -- Peter Kosyh Wed, 9 Jul 2014 13:30:00 +0400 2.1.0 * fr.ini added; * fix in highlighting links; * sprites colorkey function; * events module (pause, resume, quit events); * stead.stop_sound/sound.stop second [fadeout] parameter; -- Peter Kosyh Tue, 3 Jun 2014 17:28:00 +0400 2.0.3 * sandbox fix for win32 systems; * fix bug while changing HZ; -- Peter Kosyh Thu, 20 Feb 2014 17:19:00 +0400 2.0.2 * sandbox fixes; * be more compatible with lua 5.2; * SDL2.0 gfx mode initialization; -- Peter Kosyh Thu, 30 Jan 2014 08:30:00 +0400 2.0.1 * lua5.2 compatible; -- Peter Kosyh Mon, 27 Jan 2014 19:40:00 +0400 2.0.0 * GPL2 code removed. Now INSTEAD is covered by MIT license; * code in now hosted on github (fixes in Makefiles); * sandbox (no write access from lua outside game); * window title contains the game name; * sdl-instead start variant; * fixes in Makefiles (PREFIX and DESTDIR); * experimental cmake support; * doc/examples addons; * -lua and -luac parameters; * in windows do not close -debug console until press return; * game.gui.hidetitle; * stead.api_atleast() and stead.atleast(); * stead.tonum, stead.tostr, stead.type, stead.ipairs, stead.pairs, stead.opairs; * potential bug with non ascii save path and non UTF-8 game codepage; * bug with language changing; * bug with anigif rotate and scale; * bug with anigif and cursor; * typo in Please, wait message; -- Peter Kosyh Sun, 26 Jan 2014 13:12:00 +0400 1.9.1 * INSTEAD moved to sourceforge.net; * pt_BR language added; * example code fixes; * -hinting option; * fixes in Makefiles and configure script; * lua5.2 fix; * bug fix in new/delete; -- Peter Kosyh Sat, 13 Jul 2013 14:30:00 +0400 1.9.0 * music track from svenzzon!!!; * SDL2.0 ready; * -owntheme option; * -noautosave option is not saved; * -software option; * bug fix: segfault while change and restart game; * img_t refactoring for future architecture upgrade; * fix in anigif scale; * fix in stead.dialog_rescan; * mp3 fix in windows binary; -- Peter Kosyh Fri, 12 Apr 2013 08:00:00 +0400 1.8.3 * bug fix in start() from gamefile; * bug fix do not remove xwalk after gamereset; * bug fix in txtnb (lua5.2 compat); * stead.savename function to redefine saves; * stead.restart() to restart current game; * p/pr/pn now do error when called from global context; * now math. and os. moved to stead; * debian friendly release; * ctrl-r is alt-r, ctrl-q is alt-q alias; * New documentation; * stead.menu_toggle 'load/save/quit' parameters; -- Peter Kosyh Sat, 26 Jan 2013 14:50:00 +0400 1.8.2 * bug fix in gfx_chnage_screen (sigsegv); * bug fix in sound system (sigsegv); * bug fix in input.lua and lua 5.2; * bug fix filter scr.w scr.h changing from lua; * fixes in ua tutorial; * icon fix in windows; * cleanup code for clang; -- Peter Kosyh Wed, 19 Dec 2012 10:34:00 +0400 1.8.1 * bug fix in onact (stop act on non-nil return); * bug fix in instead_gamespath/instead_themespath/instead_steadpath; * bug fix in vars, now do not empty [k] indexes in obj; * bug fix flickering while theme update; * new theme parameter: win.scroll.mode = [0|1|2|3] * new iface.anchor feature; * faster working with layouts; -- Peter Kosyh Sat, 17 Nov 2012 10:32:00 +0400 1.8.0 * bug fix in stead.need_scene() with parameter; * bug fix in click on sprite; * bug fix in save logic (table keys); * bug fixes in dbg; * bug fix in proxy_menu - possible to work with nam = true objects; * bug fix much more faster text output; * bug fix if use returns nil and used returns true; * bug fix in change theme on the fly via theme module (segfault); * bug fix in restore_snapshot (extra call to main.enter); * internal functions are moved in stead. table; * dbg module: use f7 key again to exit debugger; * enable and disable methods in list; * sprite.rotate, sprite.scale smooth parameter; * much better scr.gfx.scalable handling, uses /2^x scaler; * CPPFLAGS added in Makefile; * scaler is updated from SDL_gfx 2.0.24; -- Peter Kosyh Sat, 1 Sep 2012 12:08:00 +0400 1.7.0 * bug fix in phrase handling w/o parameter; * bug fix in zip unpack; * fix in doc/menu; * svg logo added; * busy dialog; * opt_fading; * normal fonts in MAEMO build; * wroom module added; * nouse module added; * nolife module added; * hideinv module is better now, noinv added; * new dlg module: * - better dlg syntax; * - psub/pret/pjump/pstart; * - stead.phrase_prefix; * compose in sprite; * game.onact/onwalk/onuse/oninv handlers; * counters module; * proxymenu module; * configure.sh now checks gtk+-3.0; * sprite.box and sprite.blank; * stead.add_var internal command; * stead.gui.hideways added; * xact now searches recursive; * xwalk xact added; * lifeon with order; * correct output from life methods while moving; * stead.need_scene() added; * stead.last_act() added; * move/purge/remove/replace now works with lists too; * dialog:visible added; -- Peter Kosyh Thu, 17 Apr 2012 13:40:00 +0400 1.6.2 * bugfix in build with SDL_mixer 1.2.12; * configure.sh script is now compatible with BSD; -- Peter Kosyh Thu, 08 Feb 2012 19:52:00 +0400 1.6.1 * bugfix in prefs; * justify text option; * new track in tutorial3 (svenzzon - The Titan Turrican, CC BY-NC-SA 3.0); * SDL_mixer 1.2.12 ready; * gentoo build fix; * fix build on systems w/o PATH_MAX; * fix SDL icon; -- Peter Kosyh Thu, 19 Jan 2012 09:43:00 +0400 1.6.0 * CJK support; * set_music_fading(out, in); * 1 bit transparent icon added for SDL; * stead.space_delim added; * get_themespath, get_gamespath; * goto -> walk, goXX -> walkXX; * lua5.2 ready; -- Peter Kosyh Tue, 20 Dec 2011 08:37:00 +0400 1.5.2 * bug fix in release kbd event; * improved motion mode; * align in float gfx mode; -- Peter Kosyh Sun, 10 Oct 2011 09:49:00 +0400 1.5.1 * bug fix in game_cmd logic; * bug fix in highlight logic; * bug fix in click sound logic; * bug fix in RAW_TEXT; * INSTEAD SDL -> INSTEAD; * languages are sorted now; * set_timer moved to stead; * code cleanup (no warnings); -- Peter Kosyh Mon, 05 Sep 2011 16:11:00 +0400 1.5.0 * bug fix in gamefile; * bug fix in lifes output; * bug fix in PLAYER_MOVED and lifes; * bug fix in stop_sound; * bug fix in set_music with parameter; * bug fix in highlighting; -- Peter Kosyh Mon, 17 Aug 2011 15:40:00 +0400 1.4.5 * bug fix in rnd() w/o parameter; * bug fix in for_each; * bug fix in txtnb and \; * bug fix in original theme picture scaling; * bug fix in left/right image alignment; * bug fix in change_pl; * callpush/callpop/cctx/strip do_ini and some others moved to stead; * win.align added to theme; * theme_name added; * now fading first value is new scene flag; * more information in error messages while checking lists; * fixes in input module; * added PLATFORM variable; -- Peter Kosyh Mon, 01 Aug 2011 12:24:00 +0400 1.4.4 * bug fix in direct mode (memory leak); -- Peter Kosyh Thu, 21 Jun 2011 08:57:00 +0400 1.4.3 * bug fix in nopara logic; * ukranian translation and tutorial; * multilang tutorial3; * sprites small fix (predefined handles); * cursor changing from direct mode support; -- Peter Kosyh Thu, 19 Jun 2011 10:24:00 +0400 1.4.2 * bug fix in idf gets; * bug fix in kbd hooking; -- Peter Kosyh Thu, 19 May 2011 20:14:00 +0400 1.4.1 * bug fix in use; -- Peter Kosyh Thu, 12 May 2011 23:53:00 +0400 1.4.0 * bug fix in imgl/imgr; * bug fix in xact; * bug fix in jump to pos logic; * bug fix lags in sound; * bug fix with wince/windows with themes load; * experemental sprites technology; * global dir is now readdir; * multichannal sound system (add_sound, stop_sound); * -appdata parameter; * -chunksize parameter; * show dir to be deleted while remove game; * theme reset features; * mouse_pos added; * start() init function added; * idf files support (instead data format); * menu font is now scalable too; * toggle_menu added; * get_ticks added; * bit_xxx bitwise operations added; * visits() added; -- Peter Kosyh Mon, 2 May 2011 08:35:00 +0400 1.3.4 * bug fix in text renderer with italic text; * bug fix with imgl/imgr in inv; * bug fix in video init; * bug fix in theme.get 'inv.mode' * font faces { } syntax; * new default font; * set light hinting for font; * added stead.dir iterator; * modules doc fix; * languages dir renamed to lang; * updated manual.pdf; -- Peter Kosyh Fri, 11 Mar 2011 12:10:00 +0300 1.3.3 * bug fix (kbd input); * modules docs; -- Peter Kosyh Thu, 27 Feb 2011 20:27:00 +0300 1.3.2 * bug fix (dates in save slots); * bug fix (dbg fixes); * bug fix (f8 and f9 error msg); * small bug fixes; * s60 build; * SDL 1.3 ready; * it lang and tutorial; -- Peter Kosyh Thu, 24 Feb 2011 13:12:00 +0300 1.3.1 * bug fix (imgl and justify); * bug fix (languages in WinCE version); * bug fix (prefs do not create save dir); * bug fix (alt+f4 != f4); * bug fix ( tag parsing) * visual.lua moved to doc/; -- Peter Kosyh Mon, 29 Nov 2010 15:44:00 +0300 1.3.0 * bug fix (resample sounds while HZ change); * bug fix (empty bg); * bug fix (cursor center scaling); * changing themes from game; * strike ougth text; * *.fnt.height theme parameter; * scroller positions in theme; * escaping ^ and delim; * box: and blank:; * pad: ; * speed up; * picture flow; * prefs:purge now removes vars; * dialog:empty added; * txttab; * tutorial update; -- Peter Kosyh Tue, 12 Nov 2010 22:42:00 +0300 1.2.3 * android build; * bug in xact; -- Peter Kosyh Sat, 2 Oct 2010 16:53:00 +0300 1.2.2 * xact now can be used from everywhere; * much speed improvments; * get_gamepath, get_steadpath; * wince port; * internal cleanups; -- Peter Kosyh Fri, 25 Sep 2010 13:59:00 +0300 1.2.1 * clearlooks bg; * fading fix; * fix in disable autosave; * disp fix; * savevars optimization; -- Peter Kosyh Sat, 28 Aug 2010 19:47:00 +0300 1.2.0 * unpack/install feature; * browse feature (win32 and gtk); * clever game/themes sorting; * time of save slots; * remove games; * aligned width for themes/games dialog; * local appdata mode (portable app); * clearlooks theme; * inv align modes; * prefs object; * init() function; * snapshots (not documented?); * hook and inherit; * entered/left human friendly actions; * stead.cmd, stead.args added; * require added (modules: goto, xact, input, click, vars, dbg, snapshot, prefs, format, kbd, hotkeys); * instead_version added; * taketo/takef added; * disable/enable/disable_all/enable_all added; * exist() added (seen over disabled objects); * path() added; * visited() added; * live() added; * nameof() added; * goback() added; * goin()/goout() added; * disp attribute added; * improved debugger; * save vars in _G; * no duplicated games while looking gamespaths; * code function!!!; * args in call; * var and global; * self() is now self; * psen/punseen for dlg; * no return goto needed; * disable_all/enable_all for lists; * purge and list_purge; * undocumented gamefile; * undocumented LANG; * many bugfixes... * mac os x port -- Peter Kosyh Wed, 04 Aug 2010 20:59:00 +0300 1.1.6 * bugfix (no closed files) * bugfix in line breaking with gfx * pr() function added in stead -- Peter Kosyh Wed, 19 May 2010 17:31:00 +0300 1.1.5 * multiple anigif in one layout fix * click in picture event * game.action callback * bug in parsing * pause game while minimize (-nopause option added) * 8 bit scaler fix -- Peter Kosyh Wed, 10 Mar 2010 15:20:51 +0300 1.1.4 * keyboard navigation fix * cursor while menu and lost focus * lower cpu usage (no gif logic if no gifs are drawn) -- Peter Kosyh Fri, 05 Mar 2010 18:28:40 +0300 1.1.3 * unix_path in get_img * " in variable names (save) * \\, in ways and inv * 32 bit bmp fix -- Peter Kosyh Wed, 16 Feb 2010 11:10:40 +0300 1.1.2 * bug in saves -- Peter Kosyh Wed, 10 Feb 2010 13:39:47 +0300 1.1.1 * encode path in save (' in paths); * mouse focus win problem; * cleanups in stead.lua; * doc updates; * alt-r in debug mode (restart game); * -version arg * timer * kbd input * mouse input * bluesteel theme * nop cmd added in stead.lua * anigif while menu bug * add inv.mode disabled * txtnb added to stead.lua * bg scaling fix * broken codepage fix * esc strings in tag * themes and games sorting -- Peter Kosyh Thu, 14 Jan 2010 15:47:50 +0300 1.0.5 * segfault while is_sound with -nosound * snd volume hack * arctic theme added -- Peter Kosyh Thu, 7 Jan 2010 14:34:00 +0300 1.0.4 * xref hl optimization * now, write save slots in game/saves if game/saves exist -- Peter Kosyh Tue, 12 Dec 2009 17:15:00 +0300 1.0.3 * autojump to text change * no cursor flickering * sdl_path (i18n M$ win sdl paths) -- Peter Kosyh Tue, 01 Dec 2009 14:12:36 +0300 1.0.2 * fix in box normalize * fix in scaling * fixed f5 key -- Peter Kosyh Tue, 24 Nov 2009 11:00:20 +0300 1.0.1 * bug: no fclose :( * i18n + esp lang and tutorial * cat removed -- Peter Kosyh Fri, 20 Nov 2009 13:33:36 +0300 1.0.0 * another mouse buttons -- escape * escape as use cancel * lifeoff from life method * bug fix in anigif logic * bug fix in img() * more clever linebreaking * kill empty lines at end of layout * typo in color table (graphics.c) by Alexander * manual.tex by Alexander and commiters * default-large theme is default * combined images! * page up, page down clever logic; * f8/f9 - quicksave/quickload * game.enable_save * lua stack overflow??? * autosave function -- Peter Kosyh Tue, 3 Nov 2009 19:43:00 +0400 0.9.3 * have and seen fixes * -encode option + doencfile * print reregister * from() with argument * new()/delete() (allocator object) * game:ini() fix * theme scaling (yahoo!!!) * scene_use attribute (scene objects using on each other) -- Peter Kosyh Mon, 12 Oct 2009 11:09:19 +0400 0.9.2 * animated gif support * graphics everywhere!!! (img cmd) * sound support (set_sound) * some cleanups -- Peter Kosyh Sun, 4 Oct 2009 16:10:09 +0400 0.9.1 * mouse gfx bug * noautosave option * make uninstall * === STEAD FIXES ==== * gui.lua is separated file * menus in gfx mode!!! :) * stead.lua fixes: * ref fix * phrases saver * player is object * disable_all enable_all for object * inherited inventory * save game bug * own stead namespace (table problem fixed!) * recurse for exit breaking * wrap into vroom not call exit twice -- Peter Kosyh Sun, 15 Sep 2009 14:42:44 +0400 0.9 * fixes in localization * srch method for player * english tutorial * separated games? * font with apache license :) * debian cleanups -- Peter Kosyh Tue, 15 Sep 2009 13:29:55 +0400 0.8.9 * -gamespath -game -themespath -theme options * runtime languages * disabled() function in stead * list_zap, list_concat * remove added * stead.lua fixes * full keyboard control! * alt enter fix * gfx cursor support! * no reset video while change game/theme * tutorial2 -- Peter Kosyh Sat, 5 Aug 2009 11:25:01 +0400 0.8.8 * Makefiles fixes * cat game fix * .insteadrc now in .instead/ by default * small fixes -- Peter Kosyh Mon, 31 Aug 2009 11:25:01 +0400 0.8.7 * highlight bug in nohl mode with filter * windows version now looks games and themes in appdir. -- Peter Kosyh Fri, 28 Aug 2009 12:51:08 +0400 0.8.6 * cat game fixes * seen extra parameter -- Peter Kosyh Thu, 27 Aug 2009 08:32:00 +0400 0.8.5 * possible segfaults in timer functions. * ways, objs, drop, take - extra parameters * put - function * set_music fixes -- Peter Kosyh Thu, 24 Aug 2009 08:32:00 +0400 0.8.4 * bug in savevar * bug in long strings -- Peter Kosyh Thu, 20 Aug 2009 14:09:14 +0400 0.8.3 * sge forgotten * set_music with loop argument bug -- Peter Kosyh Wed, 19 Aug 2009 14:09:14 +0400 0.8.2 * gfx_load_img -- Peter Kosyh Sat, 15 Aug 2009 14:09:14 +0400 0.8 * key_name attribute!!!! * do_ini * version in stead.lua * opairs!!! * vroom fix * typos * backtrace * list_set -- Peter Kosyh Fri, 07 Aug 2009 14:09:14 +0400 0.7.7-4 * Fixes :) -- Peter Kosyh Wed, 05 Aug 2009 17:26:55 +0400 0.7.7 * typos in games * local games now can be placed in ~/.instead/games * console version disabled by default * -- $Name: tag -- full name of games, not only dirname * fix of link color for title/ways * bug in text layout logic (last period in line) * embedded mode (picture and ways inside text!!!) * float mode (for books) * faster text renderer (x2-x5 times) * free motion mode of scrolling * click sound support in themes (in default theme too) * new options (click sound, music) * default theme changes * fullscreen with Alt-Enter * options -alsa, -fullscreen, -window * now italic font used for events * 48000Hz added in sound preferences * now scroll position is saved in embedded mode * themes support, one new theme added * vway and vroom added * updated tutorial * set_music now take an loop parameter * autosave is now default * now vars saved if they begins from uppercase letter (undescore too); * save slots !!! * a lot of bugs fixed (memory leaks, SDL cavities.. ) -- Peter Kosyh Thu, 30 Jul 2009 18:12:19 +0400 0.7.6-1 * debian file fixes -- Peter Kosyh Fri, 29 May 2009 14:17:01 +0400 0.7.6 * Keyboard scrolling * Font scaling * inv.horiz option -- Peter Kosyh Mon, 25 May 2009 10:58:29 +0400 0.7.5 * Initial release -- Peter Kosyh Thu, 21 May 2009 11:40:29 +0400 instead-3.2.1/INSTALL0000644000175000017500000000602113267071773013231 0ustar peterpeterINSTEAD 3.2.1 ============= WARNING! For successfull building you must install these development packages (names may vary in your distribution): sdl2, sdl2-mixer, sdl2-image, sdl2-ttf, lua5.1/luajit, iconv and gtk+2(3) (to build with open file dialog) Optionally you may use: sdl1 lua5.2/lua5.3 0) Prepare for building ======================= Unpack source package with this command: $ tar xzvf instead_.tar.gz Change current dir to project's build dir: $ cd instead- There are several ways to build package. 1) On Ubuntu ============ Install stable (old) version from repo: $ apt-get install instead Or use ppa with latest version: https://launchpad.net/~gl00my/+archive/ubuntu/instead 2) On Debian based systems you can build deb package ==================================================== $ sudo apt-get install liblua5.1-dev libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev $ sudo apt-get install build-essential debhelper $ debuild $ cd .. $ sudo dpkg -i instead_.deb 3) On arch linux ================ Install stable version from community: $ pacman -S instead Or build from svn: $ make PKGBUILD $ makepkg -s And, I think, you have enough skills to build package yourself. ;) 4) On FreeBSD ============= Install instead from ports with pkgng: # pkg install instead Or: # cd /usr/ports/games/instead # make install Or build from tarball: $ ./configure.sh $ gmake 5) On RPM based system ====================== There is .spec file in tarball. 6) For other distributions ========================== You have three choices: a) try to use cmake rules b) try run ./configure.sh and follow instructions c) do all things manually 7) Build using cmake ==================== $ mkdir build $ cd build $ cmake .. $ make $ sudo make install Warning, in some systems (like Arch linux) you need to define LUA dir, to help cmake. For example (Arch linux): $ LUA_DIR=/usr/include/lua5.1/ cmake .. To build standalone version, use this (in ./build/ directory): $ cmake .. -DSTANDALONE=1 $ make && make install $ cd standalone $ ./sdl-instead Some options: WITH_SDL2 Use SDL2 instead of SDL 1 (default on) WITH_GTK2 Use GTK2 file open dialog (default on) WITH_GTK3 Use GTK3 file open dialog For example, to build with SDL2, use: $ cmake .. -DWITH_SDL2=1 -DSTANDALONE=1 $ cmake .. -DWITH_SDL2=0 -DSTANDALONE=1 # build with SDL1 To build with GTK3: $ cmake .. -DWITH_GTK3=1 8) Manual build =============== To build game, that runs just from build dir use Rules.make.standalone ---------------------------------------------------------------------- $ rm -f Rules.make $ ln -s Rules.make.standalone Rules.make $ make clean $ make If build process has failed check Rules.make.standalone and make changes if needed. $ ./sdl-instead To build game for system install -------------------------------- $ rm -f Rules.make $ ln -s Rules.make.system Rules.make $ make clean $ make If build process has failed check Rules.make.system and make changes if needed. $ sudo make install $ sdl-instead Enjoy. instead-3.2.1/Makefile0000644000175000017500000000412213267071773013640 0ustar peterpeterinclude Rules.make include config.make VERTITLE := instead-$(VERSION) ARCHIVE := instead_$(VERSION).tar.gz# SUBDIRS += src/ stead games themes icon desktop doc lang all: @for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir $(@) || exit 1; \ done; Rules.make: ln -sf Rules.make.standalone Rules.make config.make: echo "# you can define own flags here" > config.make svnclean: { test -d .svn && svn st; } | grep "^?" | awk '{ print $$2 }' | grep -v "config.make" | while read l; do $(RM) -rf $$l; done gitclean: { test -d .git && git status -s; } | grep "^??" | awk '{ print $$2 }' | grep -v "config.make" | while read l; do $(RM) -rf $$l; done rules: $(RM) -f Rules.make ln -sf Rules.make.standalone Rules.make docs: rules make docs -C doc/ PKGBUILD: PKGBUILD.in tarball cat PKGBUILD.in | sed -e s/MD5SUM/`md5sum $(ARCHIVE) | cut -f1 -d' '`/g > PKGBUILD caanoo.tar.gz: wget "http://sourceforge.net/projects/instead/files/instead/build-bin-data/$(@)/download" -O $(@) mingw32ce.tar.gz: wget "http://sourceforge.net/projects/instead/files/instead/build-bin-data/$(@)/download" -O $(@) windows-sdl2.tar.gz: wget "http://sourceforge.net/projects/instead/files/instead/build-bin-data/windows-sdl2.tar.gz/download" -O $(@) build-bin-data: caanoo.tar.gz mingw32ce.tar.gz windows-sdl2.tar.gz tarball: clean svnclean gitclean docs rules echo "# you can define own flags here" > config.make ln -sf ./ $(VERTITLE) tar -cz --exclude $(VERTITLE)/$(VERTITLE) --exclude CJK.zip --exclude .git --exclude .svn --exclude $(ARCHIVE) --exclude mingw32ce.tar.gz --exclude windows-sdl2.tar.gz --exclude caanoo.tar.gz -f $(ARCHIVE) $(VERTITLE)/* $(RM) -f $(VERTITLE) clean: @for dir in $(SUBDIRS); do \ $(MAKE) clean -C $$dir $(@) || exit 1; \ done; $(RM) -f $(ARCHIVE) $(RM) -f PKGBUILD install: all ifeq ($(SYSTEMSETUP), yes) @for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir install || exit 1; \ done; else echo No install needed endif uninstall: ifeq ($(SYSTEMSETUP), yes) @for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir uninstall || exit 1; \ done; $(RM) -rf $(STEADPATH) else echo No uninstall needed endif instead-3.2.1/Makefile.mingw0000644000175000017500000000147113267071773014764 0ustar peterpeterMAKE=make ISCC = wine ~/.wine/drive_c/Program\ Files\ \(x86\)/Inno\ Setup\ 5/ISCC.exe all: config.make src/windows $(MAKE) -C src/zlib all $(MAKE) -C src all $(MAKE) -C themes all src/windows: tar xzvf windows-sdl2.tar.gz config.make: echo "# you can define own flags here" > config.make clean: $(RM) -rf bin $(RM) -rf src/windows $(MAKE) -C src/sdl-instead clean docs: # $(MAKE) pdf -C doc/ # man doc/instead.6 > doc/instead.txt # $(MAKE) wiki -C doc/ install: all cp src/sdl-instead.exe bin $(MAKE) DESTDIR=../bin/ -C themes install $(MAKE) DESTDIR=../bin/ -C games install $(MAKE) DESTDIR=../bin/ -C stead install $(MAKE) DESTDIR=../bin/ -C icon install $(MAKE) DESTDIR=../bin/ -C lang install $(MAKE) DESTDIR=../bin/ -C doc install setup: install docs cp setup.iss bin cd bin; $(ISCC) setup.iss instead-3.2.1/PKGBUILD.in0000644000175000017500000000116513267071773013735 0ustar peterpeter# Contributor: Peter Kosyh pkgname=instead pkgver=3.2.1 pkgrel=1 pkgdesc="instead quest interpreter" arch=('i686' 'x86_64') url="http://instead.sourceforge.net/" license=('MIT') depends=('sdl2_image' 'sdl2_mixer' 'sdl2_ttf' 'lua') source=(http://downloads.sourceforge.net/project/instead/instead/${pkgver}/instead_${pkgver}.tar.gz) md5sums=(MD5SUM) optdepends=('instead-launcher: install and update INSTEAD games from net') build() { cd "${srcdir}/instead-${pkgver}" echo "2" | ./configure.sh make PREFIX=/usr } package() { cd "${srcdir}/instead-${pkgver}" make DESTDIR="${pkgdir}" PREFIX=/usr install } instead-3.2.1/README0000644000175000017500000000135613267071773013066 0ustar peterpeter == INSTEAD == This program is covered by the terms of the MIT license. Check the COPYING file for license. Check the INSTALL file for install instructions. Web resources: https://instead-hub.github.io Code: https://github.com/instead-hub/instead Games: http://instead-games.sf.net To install games you may: Unzip game archive into ~/.instead/games/ or: $ instead or: Use instead-launcher or: press [f4] to open file dialog (build with gtk) Documentaion for game developers: See the doc/ directory or https://instead-hub.github.io/#doc $ man instead Join the chat at: https://gitter.im/instead-hub/instead Unofficial XMPP conference: instead@conference.jabber.ru Contacts: Check the AUTHORS file. instead-3.2.1/Rules.make0000777000175000017500000000000013267071775020211 2Rules.make.standaloneustar peterpeterinstead-3.2.1/Rules.make.macosx0000644000175000017500000000175213267071773015430 0ustar peterpeterVERSION := 3.2.1 DESTDIR= BIN= DATAPATH=__private__ STEADPATH=$(DATAPATH)/stead THEMESPATH=$(DATAPATH)/themes GAMESPATH=$(DATAPATH)/games ICONPATH=$(DATAPATH)/icon LANGPATH=$(DATAPATH)/lang DOCPATH= MANPATH= SYSTEMSETUP=no ZLIB_CFLAGS= ZLIB_LFLAGS=-lz LUA_CFLAGS=$(shell pkg-config --cflags lua5.1) LUA_LFLAGS=$(shell pkg-config --libs lua5.1) # for arch linux, fedora (may be others) use this # # LUA_CFLAGS=$(shell pkg-config --cflags lua) # LUA_LFLAGS=$(shell pkg-config --libs lua) # SDL_CFLAGS=$(shell sdl-config --cflags) SDL_LFLAGS=$(shell sdl-config --libs) -lSDL_ttf -lSDL_mixer -lSDL_image CFLAGS += -Wall -Dunix -D_USE_UNPACK -D_USE_BROWSE -D_SDL_MOD_BUG INSTALLD=echo "Do not install standalone version!" INSTALLB=echo "Do not install standalone version!" INSTALL=echo "Do not install standalone version!" LN=echo "Do not install standalone version!" EXE= PLATFORM=macosx.m ADDOBJ=macosx.o macosx.o : macosx.m $(CC) -c $(<) $(I) $(CFLAGS) RESOURCES= RM=rm AR=ar rc RANLIB=ranlib instead-3.2.1/Rules.make.mingw32ce0000644000175000017500000000163713267071773015736 0ustar peterpeterVERSION := 3.2.1 PREFIX= DESTDIR= BIN=$(PREFIX) STEADPATH=$(PREFIX)stead THEMESPATH=$(PREFIX)themes GAMESPATH=$(PREFIX)games ICONPATH=$(PREFIX)icon DOCPATH=$(PREFIX)doc LANGPATH=$(PREFIX)lang MANPATH=$(PREFIX)doc ZLIB_CFLAGS= ZLIB_LFLAGS=-lz LUA_CFLAGS=-I./mingw32ce/ LUA_LFLAGS=-llua -L./mingw32ce/ SDL_CFLAGS=-I./mingw32ce/SDL SDL_LFLAGS=-lmikmod -lpng -L./mingw32ce/SDL CFLAGS += -Wall -march=armv4t -Os -static \ -D_HAVE_ICONV -D_LOCAL_APPDATA -D_SDL_MOD_BUG LDFLAGS += -Wl,-Bstatic \ -lSDL_mixer -lSDL -lmad -lvorbisfile -lvorbis -logg \ -lSDL_ttf -liconv -lfreetype \ -lSDL_image -lz -ljpeg \ -lmmtimer -lwince CC=arm-mingw32ce-gcc AR=arm-mingw32ce-ar rc RANLIB=arm-mingw32ce-ranlib RM=rm EXE=.exe INSTALLD=install -d -m 0755 INSTALLB=install -m 0755 INSTALL=install -m 0644 PLATFORM=wince.c iowin32.c RESOURCES=resources.o resources.o: resources.rc arm-mingw32ce-windres -i resources.rc -o resources.o instead-3.2.1/Rules.make.standalone0000644000175000017500000000164713267071773016271 0ustar peterpeterVERSION := 3.2.1 DESTDIR= BIN= DATAPATH=. STEADPATH=$(DATAPATH)/stead THEMESPATH=$(DATAPATH)/themes GAMESPATH=$(DATAPATH)/games ICONPATH=$(DATAPATH)/icon LANGPATH=$(DATAPATH)/lang DOCPATH= MANPATH= SYSTEMSETUP=no ZLIB_CFLAGS= ZLIB_LFLAGS=-lz LUA_CFLAGS=$(shell pkg-config --cflags lua5.1) LUA_LFLAGS=$(shell pkg-config --libs lua5.1) # for arch linux, fedora (may be others) use this # # LUA_CFLAGS=$(shell pkg-config --cflags lua) # LUA_LFLAGS=$(shell pkg-config --libs lua) # SDL_CFLAGS=$(shell sdl-config --cflags) SDL_LFLAGS=$(shell sdl-config --libs) -lSDL_ttf -lSDL_mixer -lSDL_image -lm CFLAGS += -O2 -Wall -Dunix -D_USE_UNPACK -D_LOCAL_APPDATA # -D_SDL_MOD_BUG INSTALLD=echo "Do not install standalone version!" INSTALLB=echo "Do not install standalone version!" INSTALL=echo "Do not install standalone version!" LN=echo "Do not install standalone version!" EXE= PLATFORM=unix.c RESOURCES= RM=rm AR=ar rc RANLIB=ranlib instead-3.2.1/Rules.make.system0000644000175000017500000000161013267071773015453 0ustar peterpeterVERSION := 3.2.1 PREFIX=/usr/local DESTDIR= BIN=$(PREFIX)/bin/ DATAPATH=$(PREFIX)/share/instead STEADPATH=$(DATAPATH)/stead THEMESPATH=$(DATAPATH)/themes GAMESPATH=$(DATAPATH)/games ICONPATH=$(PREFIX)/share/pixmaps DOCPATH=$(PREFIX)/share/doc/instead LANGPATH=$(DATAPATH)/lang MANPATH=$(PREFIX)/share/man/man6 SYSTEMSETUP=yes ZLIB_CFLAGS= ZLIB_LFLAGS=-lz LUA_CFLAGS=$(shell pkg-config --cflags lua5.1) LUA_LFLAGS=$(shell pkg-config --libs lua5.1) # for arch and gentoo linux use this # # LUA_CFLAGS=$(shell pkg-config --cflags lua) # LUA_LFLAGS=$(shell pkg-config --libs lua) # SDL_CFLAGS=$(shell sdl-config --cflags) SDL_LFLAGS=$(shell sdl-config --libs) -lSDL_ttf -lSDL_mixer -lSDL_image -lm CFLAGS += -Wall -Dunix -D_USE_UNPACK # -D_SDL_MOD_BUG INSTALLD=install -d -m 0755 INSTALLB=install -m 0755 INSTALL=install -m 0644 LN=ln -sf EXE= PLATFORM=unix.c RESOURCES= RM=rm AR=ar rc RANLIB=ranlib instead-3.2.1/Rules.mingw0000644000175000017500000000154713267071773014345 0ustar peterpeterVERSION := 3.2.1 PREFIX=./ DESTDIR= BIN=$(PREFIX) STEADPATH=$(PREFIX)stead THEMESPATH=$(PREFIX)themes GAMESPATH=$(PREFIX)games ICONPATH=$(PREFIX)icon DOCPATH=$(PREFIX)doc LANGPATH=$(PREFIX)lang MANPATH=$(PREFIX)doc WINDOWS=yes ZLIB_CFLAGS=-I./zlib ZLIB_LFLAGS=./zlib/libz.a LUA_CFLAGS=-I./windows/ LUA_LFLAGS=-llua5.1 -L./windows/ SDL_CFLAGS=-I./windows/SDL SDL_LFLAGS=-lSDL2 -lSDL2main -lSDL2_ttf -lSDL2_mixer -lSDL2_image -L./windows/SDL CFLAGS += -Wall -mwindows -D_HAVE_ICONV -D_USE_UNPACK -D_USE_BROWSE -D_LOCAL_APPDATA # -D_SDL_MOD_BUG LDFLAGS += -liconv CC=i486-mingw32-gcc AR=i486-mingw32-ar rc RANLIB=i486-mingw32-ranlib RM=rm EXE=.exe INSTALLD=install -d -m 0755 INSTALLB=install -m 0755 INSTALL=install -m 0644 LN=echo PLATFORM=windows.c iowin32.c RESOURCES=resources.o resources.o: resources.rc i486-mingw32-windres -i resources.rc -o resources.o instead-3.2.1/bld.inf0000644000175000017500000000010413267071773013433 0ustar peterpeterPRJ_PLATFORMS DEFAULT PRJ_MMPFILES gnumakefile icons.mk instead.mmp instead-3.2.1/cmake/0000755000175000017500000000000013267071773013261 5ustar peterpeterinstead-3.2.1/cmake/FindSDL2_ttf.cmake0000644000175000017500000000132613267071773016447 0ustar peterpeter# - Try to locate SDL2_ttf # This module defines: # # SDL2TTF_INCLUDE_DIR # SDL2TTF_LIBRARY # SDL2TTF_FOUND # FIND_PATH(SDL2TTF_INCLUDE_DIR NAMES SDL_ttf.h PATH_SUFFIXES SDL2) FIND_LIBRARY(SDL2TTF_LIBRARY NAMES SDL2_ttf) IF(SDL2TTF_INCLUDE_DIR AND SDL2TTF_LIBRARY) SET(SDL2TTF_FOUND TRUE) ENDIF(SDL2TTF_INCLUDE_DIR AND SDL2TTF_LIBRARY) IF(SDL2TTF_FOUND) IF(NOT SDL2_ttf_FIND_QUIETLY) MESSAGE(STATUS "Found SDL2_ttf: -I${SDL2TTF_INCLUDE_DIR}, ${SDL2TTF_LIBRARY}") ENDIF(NOT SDL2_ttf_FIND_QUIETLY) ELSE(SDL2TTF_FOUND) IF(SDL2_ttf_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find SDL2_ttf") ENDIF(SDL2_ttf_FIND_REQUIRED) ENDIF(SDL2TTF_FOUND) MARK_AS_ADVANCED(SDL2TTF_INCLUDE_DIR SDL2TTF_LIBRARY SDL2TTF_FOUND) instead-3.2.1/cmake/FindSDL2_mixer.cmake0000644000175000017500000000141413267071773016774 0ustar peterpeter# - Try to locate SDL2_mixer # This module defines: # # SDL2MIXER_INCLUDE_DIR # SDL2MIXER_LIBRARY # SDL2MIXER_FOUND # FIND_PATH(SDL2MIXER_INCLUDE_DIR NAMES SDL_mixer.h PATH_SUFFIXES SDL2) FIND_LIBRARY(SDL2MIXER_LIBRARY NAMES SDL2_mixer) IF(SDL2MIXER_INCLUDE_DIR AND SDL2MIXER_LIBRARY) SET(SDL2MIXER_FOUND TRUE) ENDIF(SDL2MIXER_INCLUDE_DIR AND SDL2MIXER_LIBRARY) IF(SDL2MIXER_FOUND) IF(NOT SDL2_mixer_FIND_QUIETLY) MESSAGE(STATUS "Found SDL2_mixer: -I${SDL2MIXER_INCLUDE_DIR}, ${SDL2MIXER_LIBRARY}") ENDIF(NOT SDL2_mixer_FIND_QUIETLY) ELSE(SDL2MIXER_FOUND) IF(SDL2_mixer_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find SDL2_mixer") ENDIF(SDL2_mixer_FIND_REQUIRED) ENDIF(SDL2MIXER_FOUND) MARK_AS_ADVANCED(SDL2MIXER_INCLUDE_DIR SDL2MIXER_LIBRARY SDL2MIXER_FOUND) instead-3.2.1/cmake/InstallSymlink.cmake0000644000175000017500000000104113267071773017234 0ustar peterpeterMACRO(INSTALL_SYMLINK linktarget linkname destination) IF(UNIX) IF(IS_ABSOLUTE ${destination}) SET(FULL_DESTINATION "\$ENV{DESTDIR}${destination}/${linkname}") ELSE(IS_ABSOLUTE ${destination}) SET(FULL_DESTINATION "\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${destination}/${linkname}") ENDIF(IS_ABSOLUTE ${destination}) INSTALL(CODE "MESSAGE(STATUS \"Symlink: ${FULL_DESTINATION} -> ${linktarget}\") EXECUTE_PROCESS(COMMAND \${CMAKE_COMMAND} -E create_symlink ${linktarget} ${FULL_DESTINATION})") ENDIF() ENDMACRO() instead-3.2.1/cmake/FindSDL2_image.cmake0000644000175000017500000000141413267071773016732 0ustar peterpeter# - Try to locate SDL2_image # This module defines: # # SDL2IMAGE_INCLUDE_DIR # SDL2IMAGE_LIBRARY # SDL2IMAGE_FOUND # FIND_PATH(SDL2IMAGE_INCLUDE_DIR NAMES SDL_image.h PATH_SUFFIXES SDL2) FIND_LIBRARY(SDL2IMAGE_LIBRARY NAMES SDL2_image) IF(SDL2IMAGE_INCLUDE_DIR AND SDL2IMAGE_LIBRARY) SET(SDL2IMAGE_FOUND TRUE) ENDIF(SDL2IMAGE_INCLUDE_DIR AND SDL2IMAGE_LIBRARY) IF(SDL2IMAGE_FOUND) IF(NOT SDL2_image_FIND_QUIETLY) MESSAGE(STATUS "Found SDL2_image: -I${SDL2IMAGE_INCLUDE_DIR}, ${SDL2IMAGE_LIBRARY}") ENDIF(NOT SDL2_image_FIND_QUIETLY) ELSE(SDL2IMAGE_FOUND) IF(SDL2_image_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find SDL2_image") ENDIF(SDL2_image_FIND_REQUIRED) ENDIF(SDL2IMAGE_FOUND) MARK_AS_ADVANCED(SDL2IMAGE_INCLUDE_DIR SDL2IMAGE_LIBRARY SDL2IMAGE_FOUND) instead-3.2.1/cmake/FindSDL2.cmake0000644000175000017500000000117413267071773015573 0ustar peterpeter# - Try to locate SDL2 # This module defines: # # SDL2_INCLUDE_DIR # SDL2_LIBRARY # SDL2_FOUND # FIND_PATH(SDL2_INCLUDE_DIR NAMES SDL.h PATH_SUFFIXES SDL2) FIND_LIBRARY(SDL2_LIBRARY NAMES SDL2) IF(SDL2_INCLUDE_DIR AND SDL2_LIBRARY) SET(SDL2_FOUND TRUE) ENDIF(SDL2_INCLUDE_DIR AND SDL2_LIBRARY) IF(SDL2_FOUND) IF(NOT SDL2_FIND_QUIETLY) MESSAGE(STATUS "Found SDL2: -I${SDL2_INCLUDE_DIR}, ${SDL2_LIBRARY}") ENDIF(NOT SDL2_FIND_QUIETLY) ELSE(SDL2_FOUND) IF(SDL2_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find SDL2") ENDIF(SDL2_FIND_REQUIRED) ENDIF(SDL2_FOUND) MARK_AS_ADVANCED(SDL2_INCLUDE_DIR SDL2_LIBRARY SDL2_FOUND) instead-3.2.1/cmake/FindIconv.cmake0000644000175000017500000000260013267071773016140 0ustar peterpeter# - Locate Iconv # This module defines: # # ICONV_INCLUDE_DIR # ICONV_LIBRARY # ICONV_FOUND # # Look for header file FIND_PATH(ICONV_INCLUDE_DIR NAMES iconv.h) # Check if library is needed IF(ICONV_INCLUDE_DIR) SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) TRY_COMPILE(ICONV_LIBRARY_NOT_NEEDED ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH}/iconv_test.c CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${ICONV_INCLUDE_DIR}" ) IF(NOT ICONV_LIBRARY_NOT_NEEDED) # Locate library FIND_LIBRARY(ICONV_LIBRARY NAMES iconv libiconv) IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARY) SET(ICONV_FOUND TRUE) ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARY) ELSE(NOT ICONV_LIBRARY_NOT_NEEDED) # Library not needed SET(ICONV_LIBRARY) IF(ICONV_INCLUDE_DIR) SET(ICONV_FOUND TRUE) ENDIF(ICONV_INCLUDE_DIR) ENDIF(NOT ICONV_LIBRARY_NOT_NEEDED) ENDIF(ICONV_INCLUDE_DIR) # Show status IF(ICONV_FOUND) IF(NOT Iconv_FIND_QUIETLY) IF(ICONV_LIBRARY_NOT_NEEDED) MESSAGE(STATUS "Found Iconv: -I${ICONV_INCLUDE_DIR}, library not needed") ELSE(ICONV_LIBRARY_NOT_NEEDED) MESSAGE(STATUS "Found Iconv: -I${ICONV_INCLUDE_DIR}, ${ICONV_LIBRARY}") ENDIF(ICONV_LIBRARY_NOT_NEEDED) ENDIF(NOT Iconv_FIND_QUIETLY) ELSE(ICONV_FOUND) IF(Iconv_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find ICONV") ENDIF(Iconv_FIND_REQUIRED) ENDIF(ICONV_FOUND) MARK_AS_ADVANCED(ICONV_INCLUDE_DIR ICONV_LIBRARY ICONV_FOUND) instead-3.2.1/cmake/iconv_test.c0000644000175000017500000000010313267071773015574 0ustar peterpeter#include int main() { iconv_open("", ""); return 0; } instead-3.2.1/cmake/FindGTK3.cmake0000644000175000017500000000153013267071773015573 0ustar peterpeter# - Try to locate GTK3 # This module defines: # # GTK3_INCLUDE_DIRS # GTK3_LIBRARIES # GTK3_FOUND # GTK3_DEFINITIONS # FIND_PACKAGE(PkgConfig) PKG_CHECK_MODULES(PC_GTK3 REQUIRED gtk+-3.0) SET(GTK3_INCLUDE_DIRS ${PC_GTK3_INCLUDE_DIRS}) FOREACH(LIB ${PC_GTK3_LIBRARIES}) FIND_LIBRARY(FOUND${LIB} HINTS ${PC_GTK3_LIBRARY_DIRS} NAMES ${LIB}) LIST(APPEND GTK3_LIBRARIES ${FOUND${LIB}}) ENDFOREACH(LIB) IF(GTK3_INCLUDE_DIRS AND GTK3_LIBRARIES) SET(GTK3_FOUND TRUE) ENDIF(GTK3_INCLUDE_DIRS AND GTK3_LIBRARIES) IF(GTK3_FOUND) IF(NOT GTK3_FIND_QUIETLY) MESSAGE(STATUS "Found GTK3: -I${GTK3_INCLUDE_DIRS}, ${GTK3_LIBRARIES}") ENDIF(NOT GTK3_FIND_QUIETLY) ELSE(GTK3_FOUND) IF(GTK3_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find GTK3") ENDIF(GTK3_FIND_REQUIRED) ENDIF(GTK3_FOUND) MARK_AS_ADVANCED(GTK3_INCLUDE_DIRS GTK3_LIBRARIES GTK3_FOUND) instead-3.2.1/config.make0000644000175000017500000000004013267072003014262 0ustar peterpeter# you can define own flags here instead-3.2.1/configure-mingw32.sh0000755000175000017500000000033713267071773016010 0ustar peterpeter#!/bin/sh rm -f config.make rm -f Rules.make ln -sf Rules.mingw Rules.make rm -f sdl-instead ln -sf src/sdl-instead sdl-instead echo "Ok. We are ready to build. Use this command:" echo " \$ make -f Makefile.mingw setup" instead-3.2.1/configure.sh0000755000175000017500000001520513267071773014524 0ustar peterpeter#!/bin/sh echo -n "Checking pkg-config..." if ! pkg-config --version >/dev/null 2>&1; then echo "error: no pkg-config in \$PATH." exit 1 fi echo "ok" echo -n "Checking pkg-config --cflags zlib..." if ! pkg-config --cflags zlib >/dev/null 2>&1; then if [ -f /usr/include/zlib.h ]; then echo "not found, but /usr/include/zlib.h exists..." zlib_cflags="x" zlib_libs= else echo "internal" zlib_cflags= zlib_libs= fi else echo "system" zlib_cflags="pkg-config --cflags zlib" zlib_libs="pkg-config --libs zlib" fi echo -n "Checking pkg-config --cflags gtk+-2.0..." if ! pkg-config --cflags gtk+-2.0 >/dev/null 2>&1; then echo "no" echo -n "Checking pkg-config --cflags gtk+-3.0..." if ! pkg-config --cflags gtk+-3.0 >/dev/null 2>&1; then echo "no open file dialog" gtk_cflags= gtk_libs= else echo "yes" gtk_cflags="pkg-config --cflags gtk+-3.0" gtk_libs="pkg-config --libs gtk+-3.0" fi else echo "yes" gtk_cflags="pkg-config --cflags gtk+-2.0" gtk_libs="pkg-config --libs gtk+-2.0" fi echo -n "Checking pkg-config --cflags lua[5.1|5.2|51|52|jit]..." if [ "x$LUA" = "x" ]; then lua_ver="lua5.1 lua5.2 lua lua-5.1 lua-5.2 lua51 lua52 luajit" else lua_ver=$LUA fi for v in $lua_ver; do if pkg-config --cflags "$v" >/dev/null 2>&1; then echo "$v" lua_cflags="pkg-config --cflags $v" lua_libs="pkg-config --libs $v" break fi done if test "x$lua_libs" = "x"; then echo "failed: no package lua/lua5.1/lua5.2/lua-5.1/lua-5.2/lua51/lua52" echo "Please install lua development package." exit 1 fi echo -n "Checking sdl2-config..." if ! sdl2-config --version >/dev/null 2>&1; then if ! sdl-config --version >/dev/null 2>&1; then echo "error: no sdl-config/sdl2-config in \$PATH." echo "Please install sdl, sdl_ttf, sdl_mixer and sdl_image development packages." exit 1 fi echo "no, using SDL 1.xx" sdl_config="sdl-config" sdl_libs="-lSDL_ttf -lSDL_mixer -lSDL_image -lm" else echo "ok" sdl_config="sdl2-config" sdl_libs="-lSDL2_ttf -lSDL2_mixer -lSDL2_image -lm" fi echo -n "Checking sdl-config --cflags..." if ! $sdl_config --cflags >/dev/null 2>&1; then echo "failed." exit 1 fi echo "ok" ops="$CPPFLAGS $CFLAGS $LDFLAGS" ops=$ops" "`$lua_cflags` ops=$ops" "`$lua_libs` echo -n "Looking for compiler..." if ! $CC --version >/dev/null 2>&1; then if ! cc --version >/dev/null 2>&1; then if ! gcc --version >/dev/null 2>&1; then echo "cc, gcc, \$(CC) are not valid compilers... Please export CC for valid one..."; exit 1; else cc="gcc"; fi else cc="cc" fi else cc=$CC fi cat << EOF >/tmp/sdl-test.c #include #include #include #include #include int main(int argc, char **argv) { return 0; } EOF echo $cc echo -n "Checking test build...(" echo -n $cc /tmp/sdl-test.c $ops `$sdl_config --cflags` `$sdl_config --libs` $sdl_libs -o /tmp/sdl-test ")..." if ! $cc /tmp/sdl-test.c $ops `$sdl_config --cflags` `$sdl_config --libs` $sdl_libs -o /tmp/sdl-test; then echo "failed". echo "Please sure if these development packages are installed: sdl, sdl_ttf, sdl_mixer, sdl_image." rm -f /tmp/sdl-test.c /tmp/sdl-test exit 1 fi echo "ok" rm -f /tmp/sdl-test.c /tmp/sdl-test cat << EOF >/tmp/iconv-test.c #include int main(int argc, char **argv) { iconv_open("",""); } EOF echo $cc echo -n "Checking iconv...(" echo -n "$cc /tmp/iconv-test.c -o iconv-test)..." if $cc /tmp/iconv-test.c -o /tmp/iconv-test >/dev/null 2>&1; then CFLAGS="$CFLAGS -D_HAVE_ICONV -DLIBICONV_PLUG" # force FreeBSD to use iconv.h from base echo "ok" elif $cc /tmp/iconv-test.c -liconv -o /tmp/iconv-test >/dev/null 2>&1; then CFLAGS="$CFLAGS -D_HAVE_ICONV" LDFLAGS="$LDFLAGS -liconv" echo "ok, with -liconv" elif $cc /tmp/iconv-test.c -I/usr/local/include -L/usr/local/lib -liconv -o /tmp/iconv-test >/dev/null 2>&1; then CFLAGS="$CFLAGS -I/usr/local/include -D_HAVE_ICONV" LDFLAGS="$LDFLAGS -L/usr/local/lib -liconv" echo "ok, with -liconv and -L/usr/local/lib" else echo -n "failed. Build without iconv.". fi rm -f /tmp/iconv-test.c /tmp/iconv-test if ! make clean >/dev/null 2>&1; then echo " * Warning!!! Can not do make clean..." fi echo -n "Generating config.make..." echo "# autamatically generated by configure.sh" >config.make if [ ! -z "$CFLAGS" ]; then echo "EXTRA_CFLAGS+=$CFLAGS" >> config.make fi if [ ! -z "$LDFLAGS" ]; then echo "EXTRA_LDFLAGS+=$LDFLAGS" >> config.make fi if [ ! -z "$gtk_cflags" ]; then echo "EXTRA_CFLAGS+=-D_USE_GTK -D_USE_BROWSE" >> config.make echo "EXTRA_CFLAGS+=\$(shell $gtk_cflags)" >> config.make echo "EXTRA_LDFLAGS+=\$(shell $gtk_libs)" >> config.make fi if [ -z "$zlib_cflags" ]; then echo "SUBDIRS=src/zlib" >> config.make echo "ZLIB_CFLAGS=-I../zlib" >> config.make echo "ZLIB_LFLAGS=../zlib/libz.a" >> config.make elif [ "$zlib_cflags" = "x" ]; then echo "ZLIB_CFLAGS=" >> config.make echo "ZLIB_LFLAGS=-lz" >> config.make else echo "ZLIB_CFLAGS=\$(shell $zlib_cflags)" >> config.make echo "ZLIB_LFLAGS=\$(shell $zlib_libs)" >> config.make fi echo "LUA_CFLAGS=\$(shell $lua_cflags)" >> config.make echo "LUA_LFLAGS=\$(shell $lua_libs)" >> config.make echo "SDL_CFLAGS=\$(shell $sdl_config --cflags)" >> config.make echo "SDL_LFLAGS=\$(shell $sdl_config --libs) $sdl_libs" >> config.make echo "ok" if [ "x$PREFIX" = "x" ]; then echo -n "Choose installation mode. Standalone(1) or system(2) [1]: " read ans else ans="2" fi if [ "x$ans" = "x1" -o "x$ans" = "x" ]; then echo " * Standalone version" rm -f Rules.make ln -sf Rules.make.standalone Rules.make rm -f sdl-instead ln -sf src/sdl-instead sdl-instead echo "Ok. We are ready to build. Use these commands:" echo " \$ make" echo " \$ ./sdl-instead" elif [ "x$ans" = "x2" ]; then if [ "x$PREFIX" = "x" ]; then echo -n "Enter prefix path [/usr/local]: " read ans else ans="$PREFIX" fi if [ "x$ans" = "x" ]; then prefix="/usr/local" else prefix="$ans" fi rm -f Rules.make ln -s Rules.make.system Rules.make echo " * System version with prefix: $prefix" echo "PREFIX=$prefix" >> config.make echo "BIN=\$(PREFIX)/bin/" >> config.make echo "DATAPATH=\$(PREFIX)/share/instead" >> config.make echo "STEADPATH=\$(DATAPATH)/stead" >> config.make echo "THEMESPATH=\$(DATAPATH)/themes" >> config.make echo "GAMESPATH=\$(DATAPATH)/games" >> config.make echo "ICONPATH=\$(PREFIX)/share/pixmaps" >> config.make echo "DOCPATH=\$(PREFIX)/share/doc/instead" >> config.make echo "LANGPATH=\$(DATAPATH)/lang" >> config.make echo "MANPATH=\$(PREFIX)/share/man/man6" >> config.make echo "Ok. We are ready to build and install. Use these commands:" echo " \$ make" echo " \$ sudo make install" echo " \$ sdl-instead" else echo "Huh!!! Wrong answer." exit 1 fi echo " Enjoy..." instead-3.2.1/contrib/0000755000175000017500000000000013267071773013641 5ustar peterpeterinstead-3.2.1/contrib/instead-em-build.sh0000755000175000017500000002140013267071773017320 0ustar peterpeter#!/usr/bin/env bash # build INSTEAD with emscripten set -e export WORKSPACE="" #"/home/peter/Devel/emsdk-portable/env" if [ ! -f ./emsdk_env.sh ]; then echo "Run this script in emsdk directory" exit 1 fi if [ -z "$WORKSPACE" ]; then echo "Define WORKSPACE path in $0" exit 1 fi if [ ! -d "$WORKSPACE" ]; then echo "Please, create build directory $WORKSPACE" exit 1 fi . ./emsdk_env.sh # some general flags export PATH="$WORKSPACE/bin:$PATH" export CFLAGS="-g0 -O2" export CXXFLAGS="$CFLAGS" export EM_CFLAGS="-Wno-warn-absolute-paths" export EMMAKEN_CFLAGS="$EM_CFLAGS" export PKG_CONFIG_PATH="$WORKSPACE/lib/pkgconfig" export MAKEFLAGS="-j2" # flags to fake emconfigure and emmake export CC="emcc" export CXX="em++" export LD="$CC" export LDSHARED="$LD" export RANLIB="emranlib" export AR="emar" export CC_BUILD=cc # Lua cd $WORKSPACE rm -rf lua-5.1.5 [ -f lua-5.1.5.tar.gz ] || wget -nv 'https://www.lua.org/ftp/lua-5.1.5.tar.gz' tar xf lua-5.1.5.tar.gz cd lua-5.1.5 cat src/luaconf.h | sed -e 's/#define LUA_USE_POPEN//g' -e 's/#define LUA_USE_ULONGJMP//g'>src/luaconf.h.new mv src/luaconf.h.new src/luaconf.h emmake make posix CC=emcc emmake make install INSTALL_TOP=$WORKSPACE # libiconv cd $WORKSPACE rm -rf libiconv-1.15 [ -f libiconv-1.15.tar.gz ] || wget -nv 'https://ftp.gnu.org/gnu/libiconv/libiconv-1.15.tar.gz' tar xf libiconv-1.15.tar.gz cd libiconv-1.15 emconfigure ./configure --prefix=$WORKSPACE emmake make install # zlib cd $WORKSPACE rm -rf zlib-1.2.11/ [ -f zlib-1.2.11.tar.gz ] || wget -nv 'http://zlib.net/zlib-1.2.11.tar.gz' tar xf zlib-1.2.11.tar.gz cd zlib-1.2.11 emconfigure ./configure --prefix=$WORKSPACE emmake make install # libmikmod cd $WORKSPACE rm -rf libmikmod-3.1.12/ [ -f SDL2_mixer-2.0.1.tar.gz ] || wget -nv https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.1.tar.gz tar xf SDL2_mixer-2.0.1.tar.gz mv SDL2_mixer-2.0.1/external/libmikmod-3.1.12/ libmikmod-3.1.12/ cd libmikmod-3.1.12/ emconfigure ./configure --prefix=$WORKSPACE --disable-shared --enable-static emmake make install SHELL="${SHELL}" # SDL2 cd $WORKSPACE rm -rf SDL2 git clone https://github.com/emscripten-ports/SDL2.git cd SDL2 git checkout merge-2.0.7 git pull ./autogen.sh emconfigure ./configure --host=asmjs-unknown-emscripten --disable-assembly --disable-threads --disable-mmx --disable-sdltest --prefix=$WORKSPACE CPPFLAGS="-I$WORKSPACE/include" LDFLAGS="-L$WORKSPACE/lib" --disable-sdltest --disable-shared --disable-joystick --disable-pthreads cat <em.patch --- SDL_audio.c 2017-12-23 14:03:32.965522053 +0300 +++ SDL_audio.c.em 2017-12-23 14:18:03.274008570 +0300 @@ -1280,7 +1280,7 @@ /* if your target really doesn't need it, set it to 0x1 or something. */ /* otherwise, close_audio_device() won't call impl.CloseDevice(). */ - SDL_assert(device->hidden != NULL); +// SDL_assert(device->hidden != NULL); /* See if we need to do any conversion */ build_stream = SDL_FALSE; EOF patch -p1 src/audio/SDL_audio.c -i em.patch emmake make install cd $WORKSPACE rm -rf freetype-2.8 wget https://download.savannah.gnu.org/releases/freetype/freetype-2.8.tar.gz tar -xvf freetype-2.8.tar.gz cd freetype-2.8 ./autogen.sh emconfigure ./configure --build=amd64-unknown-linux --host=asmjs-unknown-linux --prefix=$WORKSPACE CPPFLAGS="-I$WORKSPACE/include" LDFLAGS="-L$WORKSPACE/lib" --disable-shared emmake make install # SDL2_ttf cd $WORKSPACE rm -rf SDL2_ttf git clone https://github.com/emscripten-ports/SDL2_ttf.git cd SDL2_ttf git checkout master git pull ./autogen.sh emconfigure ./configure --build=amd64-unknown-linux --host=asmjs-unknown-linux --prefix=$WORKSPACE CPPFLAGS="-I$WORKSPACE/include -I$WORKSPACE/include/SDL2 -I$WORKSPACE/include/freetype2" LDFLAGS="-L$WORKSPACE/lib" --disable-sdltest --disable-shared emmake make install # SDL2_mixer cd $WORKSPACE rm -rf SDL_mixer [ -d SDL_mixer/.hg ] || hg clone https://hg.libsdl.org/SDL_mixer cd SDL_mixer hg pull -u hg up -C hg --config "extensions.purge=" purge --all cat configure.in | sed -e 's/AC_CHECK_LIB(\[modplug\], /AC_CHECK_LIB(\[modplug\], \[ModPlug_Load\], /' -e 's/have_libmikmod=no/have_libmikmod=yes/g' > configure.in.new mv -f configure.in.new configure.in ./autogen.sh emconfigure ./configure --host=asmjs-unknown-emscripten --prefix=$WORKSPACE CPPFLAGS="-I$WORKSPACE/include -I$WORKSPACE/include/SDL2 -s USE_VORBIS=1 -s USE_OGG=1" LDFLAGS="-L$WORKSPACE/lib" --disable-sdltest --disable-shared \ --disable-music-mp3-mad-gpl --enable-music-ogg --disable-music-ogg-shared --enable-music-mod-mikmod --disable-music-mod-mikmod-shared \ --disable-music-midi-fluidsynth --disable-music-midi-fluidsynth-shared \ --disable-music-mp3-smpeg --disable-music-mp3-smpeg-shared cat Makefile | sed -e 's| \$(objects)/playwave\$(EXE) \$(objects)/playmus\$(EXE)||g' > Makefile.new mv -f Makefile.new Makefile emmake make install # jpeg lib cd $WORKSPACE rm -rf jpeg-9b [ -f jpegsrc.v9b.tar.gz ] || wget -nv 'http://www.ijg.org/files/jpegsrc.v9b.tar.gz' tar xf jpegsrc.v9b.tar.gz cd jpeg-9b emconfigure ./configure --prefix=$WORKSPACE emmake make install # SDL_image cd $WORKSPACE rm -rf SDL2_image [ -d SDL2_image/.git ] || git clone https://github.com/emscripten-ports/SDL2_image.git SDL2_image cd SDL2_image ./autogen.sh emconfigure ./configure --host=asmjs-unknown-linux --prefix=$WORKSPACE CPPFLAGS="-I$WORKSPACE/include -I$WORKSPACE/include/SDL2 -s USE_LIBPNG=1" LDFLAGS="-L$WORKSPACE/lib -lpng -ljpeg" --disable-sdltest --disable-shared --enable-static --enable-png --disable-png-shared --enable-jpg --disable-jpg-shared emmake make install # INSTEAD echo "INSTEAD" cd $WORKSPACE [ -d instead-em ] || git clone https://github.com/instead-hub/instead.git instead-em cd instead-em git pull [ -e Rules.make ] || ln -s Rules.standalone Rules.make cat < config.make EXTRA_CFLAGS+= -DNOMAIN -D_HAVE_ICONV -I../../include SDL_CFLAGS=-I../../include/SDL2 SDL_LFLAGS= LUA_CFLAGS= LUA_LFLAGS= ZLIB_LFLAGS= EOF emmake make clean emmake make cd $WORKSPACE [ -d instead-em-js ] || mkdir instead-em-js [ -d instead-em-js/fs ] || mkdir instead-em-js/fs cp -R instead-em/icon instead-em-js/fs/ cp -R instead-em/stead instead-em-js/fs/ cp -R instead-em/themes instead-em-js/fs/ cp -R instead-em/lang instead-em-js/fs/ cp -R instead-em/games instead-em-js/fs/ find instead-em-js/fs/ \( -name '*.svg' -o -name Makefile -o -name CMakeLists.txt \) -exec rm {} \; cd instead-em-js ln -f -s ../instead-em/src/sdl-instead sdl-instead.bc ln -f -s ../lib lib cat < post.js var Module; FS.mkdir('/appdata'); FS.mount(IDBFS,{},'/appdata'); Module['postRun'].push(function() { var argv = [] var req if (typeof window === "object") { argv = window.location.search.substr(1).trim().split('&'); if (!argv[0]) argv = []; } var url = argv[0]; if (!url) { FS.syncfs(true, function (error) { if (error) { console.log("Error while syncing: ", error); }; console.log("Running..."); Module.ccall('instead_main', 'number'); }); return; } req = new XMLHttpRequest(); req.open("GET", url, true); req.responseType = "arraybuffer"; console.log("Get: ", url); setTimeout(function() { var spinnerElement = document.getElementById('spinner'); spinnerElement.style.display = 'inline-block'; Module['setStatus']('Downloading data file...'); }, 3); req.onload = function() { var basename = function(path) { parts = path.split( '/' ); return parts[parts.length - 1]; } var data = req.response; console.log("Data loaded..."); FS.syncfs(true, function (error) { if (error) { console.log("Error while syncing: ", error); } url = basename(url); console.log("Writing: ", url); FS.writeFile(url, new Int8Array(data), { encoding: 'binary' }, "w"); console.log("Running..."); var args = []; [ "instead-em", url, "-standalone", "-window", "-resizable", "-mode" ].forEach(function(item) { args.push(allocate(intArrayFromString(item), 'i8', ALLOC_NORMAL)); args.push(0); args.push(0); args.push(0); }) args = allocate(args, 'i32', ALLOC_NORMAL); setTimeout(function() { Module.setStatus(''); document.getElementById('status').style.display = 'none'; }, 3); window.onclick = function(){ window.focus() }; Module.ccall('instead_main', 'number', ["number", "number"], [6, args ]); }); } req.send(null); }); EOF emcc -O2 sdl-instead.bc lib/libz.a lib/libiconv.so lib/liblua.a lib/libSDL2_ttf.a lib/libfreetype.a lib/libSDL2_mixer.a lib/libSDL2.a lib/libmikmod.a lib/libSDL2_image.a lib/libjpeg.a \ -s EXPORTED_FUNCTIONS="['_instead_main']" \ -s 'SDL2_IMAGE_FORMATS=["png","jpeg","gif"]' \ -s 'EXTRA_EXPORTED_RUNTIME_METHODS=["ccall", "Pointer_stringify"]' \ -s QUANTUM_SIZE=4 \ -s USE_OGG=1 -s USE_VORBIS=1 -s USE_LIBPNG=1 \ -o instead-em.html -s SAFE_HEAP=0 -s TOTAL_MEMORY=167772160 -s ALLOW_MEMORY_GROWTH=1 \ --post-js post.js \ --preload-file fs@/ echo "Happy hacking" python2.7 -m SimpleHTTPServer 8000 instead-3.2.1/contrib/instead-sailfish.spec0000644000175000017500000000264413267071773017752 0ustar peterpeterSummary: simple text adventures/visual novels engine and game Name: instead Version: 3.2.1 Release: 1%{?dist} License: MIT URL: http://instead.sourceforge.net Source0: %{name}_%{version}.tar.gz Group: Amusements/Games BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: SDL2-devel, SDL2_mixer-devel, SDL2_image-devel, SDL2_ttf-devel, lua-devel, libaudioresource-devel, glib2-devel %description Simple text adventures/visual novels engine and game Visual novell/text quest-like game in Russian with engine. %prep %setup -q echo -e "2\n\/usr" | ./configure.sh cat >>config.make </home/nemo/.instead/profile < -Build-Depends: debhelper (>= 7), pkg-config, liblua5.1-dev, libsdl2-dev, libsdl2-ttf-dev, libsdl2-image-dev, libsdl2-mixer-dev, zlib1g-dev +Build-Depends: debhelper (>= 5), pkg-config, liblua5.1-dev, libsdl1.2-dev, libsdl-ttf2.0-dev, libsdl-image1.2-dev, libsdl-mixer1.2-dev, zlib1g-dev Standards-Version: 3.8.3 Homepage: http://instead.sourceforge.net @@ -11,4 +11,3 @@ Depends: ${shlibs:Depends}, ${misc:Depends} Description: simple text adventures/visual novels engine Visual novell/text quest-like engine. - diff -Nur instead-3.2.0/debian/rules instead-3.2.0-maemo/debian/rules --- instead-3.2.0/debian/rules 2018-01-22 09:40:55.000000000 +0300 +++ instead-3.2.0-maemo/debian/rules 2018-01-22 09:51:26.888674608 +0300 @@ -61,7 +61,7 @@ install: build dh_testdir dh_testroot - dh_prep +# dh_prep dh_installdirs # Add here commands to install the package into debian/instead. diff -Nur instead-3.2.0/desktop/instead.desktop.in instead-3.2.0-maemo/desktop/instead.desktop.in --- instead-3.2.0/desktop/instead.desktop.in 2018-01-22 09:40:55.000000000 +0300 +++ instead-3.2.0-maemo/desktop/instead.desktop.in 2018-01-22 09:51:26.888674608 +0300 @@ -13,4 +13,8 @@ Exec=@BIN@/sdl-instead Icon=sdl_instead Terminal=false +X-Window-Icon=sdl_instead +X-Window-Icon-Dimmed=sdl_instead +X-HildonDesk-ShowInToolbar=true +StartupWMClass=instead Categories=Game;LogicGame; diff -Nur instead-3.2.0/desktop/Makefile instead-3.2.0-maemo/desktop/Makefile --- instead-3.2.0/desktop/Makefile 2018-01-22 09:40:55.000000000 +0300 +++ instead-3.2.0-maemo/desktop/Makefile 2018-01-22 09:51:26.888674608 +0300 @@ -10,9 +10,9 @@ cat instead.desktop.in | sed -e "s|@BIN@|$(BIN)|g" > instead.desktop install: - $(INSTALLD) $(DESTDIR)$(PREFIX)/share/applications - $(INSTALL) instead.desktop $(DESTDIR)$(PREFIX)/share/applications/instead.desktop + $(INSTALLD) $(DESTDIR)$(PREFIX)/share/applications/hildon + $(INSTALL) instead.desktop $(DESTDIR)$(PREFIX)/share/applications/hildon/instead.desktop uninstall: - $(RM) $(DESTDIR)$(PREFIX)/share/applications/instead.desktop + $(RM) $(DESTDIR)$(PREFIX)/share/applications/hildon/instead.desktop diff -Nur instead-3.2.0/Rules.make.system instead-3.2.0-maemo/Rules.make.system --- instead-3.2.0/Rules.make.system 2018-01-22 09:40:55.000000000 +0300 +++ instead-3.2.0-maemo/Rules.make.system 2018-01-22 09:51:26.888674608 +0300 @@ -28,7 +28,7 @@ SDL_CFLAGS=$(shell sdl-config --cflags) SDL_LFLAGS=$(shell sdl-config --libs) -lSDL_ttf -lSDL_mixer -lSDL_image -lm -CFLAGS += -Wall -Dunix -D_USE_UNPACK # -D_SDL_MOD_BUG +CFLAGS += -Wall -Dunix -D_USE_UNPACK -DMAEMO # -D_SDL_MOD_BUG INSTALLD=install -d -m 0755 INSTALLB=install -m 0755 diff -Nur instead-3.2.0/src/instead/util.h instead-3.2.0-maemo/src/instead/util.h --- instead-3.2.0/src/instead/util.h 2018-01-22 09:40:55.000000000 +0300 +++ instead-3.2.0-maemo/src/instead/util.h 2018-01-22 09:51:26.888674608 +0300 @@ -52,7 +52,7 @@ #define FREE(v) do { if ((v)) free((v)); v = NULL; } while(0) #ifdef _USE_SDL - #include +/* #include */ #include #ifdef _USE_SDL_ICONV #include diff -Nur instead-3.2.0/src/sound.c instead-3.2.0-maemo/src/sound.c --- instead-3.2.0/src/sound.c 2018-01-22 09:40:55.000000000 +0300 +++ instead-3.2.0-maemo/src/sound.c 2018-01-22 09:51:26.888674608 +0300 @@ -32,7 +32,9 @@ #include #include - +#define SDL_memcpy memcpy +#define SDL_calloc calloc +#define SDL_free free #ifdef S60 int audio_rate = 11025; #else diff -Nur instead-3.2.0/themes/default/theme.ini instead-3.2.0-maemo/themes/default/theme.ini --- instead-3.2.0/themes/default/theme.ini 2018-01-22 09:40:56.000000000 +0300 +++ instead-3.2.0-maemo/themes/default/theme.ini 2018-01-22 09:51:26.888674608 +0300 @@ -5,7 +5,7 @@ ; $Name(it): Predefinito$ scr.w = 800 -scr.h = 600 +scr.h = 480 scr.gfx.scalable = 1 scr.gfx.h = -1 @@ -23,7 +23,7 @@ win.x = 48 win.y = 8 win.w = 500 -win.h = 568 +win.h = 448 win.fnt.name = {sans,sans-b,sans-i,sans-bi}.ttf win.fnt.size = 16 @@ -43,7 +43,8 @@ inv.x = 620 inv.y = 8 inv.w = 144 -inv.h = 564 +inv.h = 448 + inv.fnt.name = {sans,sans-b,sans-i,sans-bi}.ttf inv.fnt.size = 16 @@ -71,8 +72,8 @@ menu.fnt.height = 1.0 menu.gfx.button = menu.png menu.button.x = 776 -menu.button.y = 576 +menu.button.y = 456 snd.click = click.wav ; click.ogg diff -Nur instead-3.2.0/themes/wide/theme.ini instead-3.2.0-maemo/themes/wide/theme.ini --- instead-3.2.0/themes/wide/theme.ini 2018-01-22 09:40:57.000000000 +0300 +++ instead-3.2.0-maemo/themes/wide/theme.ini 2018-01-22 09:51:26.888674608 +0300 @@ -3,10 +3,3 @@ ; $Name(uk):Широка$ ; $Name(es):Amplio$ ; $Name(it):Ampio$ - -scr.w = 800 -scr.h = 480 -win.h = 448 -inv.h = 448 - -menu.button.y = 456 instead-3.2.1/contrib/caanoo.patch0000644000175000017500000001201713267071773016123 0ustar peterpeterdiff -Nur instead-3.2.0/Rules.caanoo instead-3.2.0-caanoo/Rules.caanoo --- instead-3.2.0/Rules.caanoo 1970-01-01 03:00:00.000000000 +0300 +++ instead-3.2.0-caanoo/Rules.caanoo 2018-01-14 09:06:18.044628618 +0300 @@ -0,0 +1,45 @@ +VERSION := 3.2.1 + +PREFIX = /home/peter/Devel/GPH_SDK/tools/gcc-4.2.4-glibc-2.7-eabi +CC = $(PREFIX)/bin/arm-gph-linux-gnueabi-gcc +STRIP = $(PREFIX)/bin/arm-gph-linux-gnueabi-strip + +CFLAGS += -DARM_ARCH -DGP2X_BUILD +CFLAGS += -DWIZ_BUILD -DCAANOO +CFLAGS += -O3 -std=c99 -msoft-float -funsigned-char -fno-common -fno-builtin -Wl,--allow-multiple-definition +CFLAGS += -I../SDL-1.2.13/include `$(PREFIX)/arm-gph-linux-gnueabi/sys-root/usr/bin/sdl-config --cflags` -I$(PREFIX)/include + +DESTDIR= +BIN= +DATAPATH=. +STEADPATH=$(DATAPATH)/stead +THEMESPATH=$(DATAPATH)/themes +GAMESPATH=$(DATAPATH)/games +ICONPATH=$(DATAPATH)/icon +LANGPATH=$(DATAPATH)/lang +DOCPATH= +MANPATH= +SYSTEMSETUP=no + +ZLIB_CFLAGS= +ZLIB_LFLAGS=-lz + +LUA_CFLAGS=-I./caanoo/lua/ +LUA_LFLAGS=./caanoo/lua/liblua.a + +SDL_CFLAGS= +SDL_LFLAGS=-lSDL -lSDL_mixer -lSDL_image -lSDL_ttf -lm -ldl -lpthread -lz + +CFLAGS += -g -Wall -Dunix -D_USE_UNPACK -D_LOCAL_APPDATA -D_HAVE_ICONV -D_SDL_MOD_BUG + +INSTALLD=echo "Do not install standalone version!" +INSTALLB=echo "Do not install standalone version!" +INSTALL=echo "Do not install standalone version!" +LN=echo "Do not install standalone version!" + +EXE= +PLATFORM=unix.c +RESOURCES= +RM=rm +AR=ar rc +RANLIB=ranlib diff -Nur instead-3.2.0/src/game.c instead-3.2.0-caanoo/src/game.c --- instead-3.2.0/src/game.c 2018-01-14 09:04:22.000000000 +0300 +++ instead-3.2.0-caanoo/src/game.c 2018-01-14 09:06:18.044628618 +0300 @@ -3300,7 +3300,7 @@ #else game_menu(menu_askquit); #endif - } else if ((alt_pressed | control_pressed) && (!is_key(ev, "q") || !is_key(ev, "f4"))) { + } else if (!is_key(ev, "quit") || ((alt_pressed | control_pressed) && (!is_key(ev, "q") || !is_key(ev, "f4")))) { game_running = 0; return -1; } else if (alt_pressed && diff -Nur instead-3.2.0/src/graphics.c instead-3.2.0-caanoo/src/graphics.c --- instead-3.2.0/src/graphics.c 2018-01-14 09:04:22.000000000 +0300 +++ instead-3.2.0-caanoo/src/graphics.c 2018-01-14 09:07:34.697288401 +0300 @@ -2219,18 +2219,25 @@ #else int gfx_set_mode(int w, int h, int fs) { + int maxbpp = 32; int hw = (software_sw)?0:SDL_HWSURFACE; SDL_Surface *scr; game_reset_name(); if (gfx_width == w && gfx_height == h && gfx_fs == fs) { return 0; /* already done */ } +#ifdef CAANOO + maxbpp = 16; +#endif vid_modes = NULL; gfx_fs = fs; gfx_width = w; gfx_height = h; if (!nocursor_sw) SDL_ShowCursor(SDL_DISABLE); +#ifdef CAANOO + scr = SDL_SetVideoMode(gfx_width, gfx_height, maxbpp, ((gfx_fs)?SDL_HWSURFACE:0) | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); +#else #ifdef S60 scr = SDL_SetVideoMode(gfx_width, gfx_height, 0, SDL_ANYFORMAT | hw | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #else @@ -2258,6 +2265,7 @@ #endif #endif #endif +#endif screen = GFX_IMG_REL(scr); if (scr == NULL || screen == NULL) { fprintf(stderr, "Unable to set %dx%d video: %s\n", w, h, SDL_GetError()); @@ -5663,7 +5671,7 @@ SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); #endif #endif - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) { + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); return -1; } diff -Nur instead-3.2.0/src/input.c instead-3.2.0-caanoo/src/input.c --- instead-3.2.0/src/input.c 2018-01-14 09:04:22.000000000 +0300 +++ instead-3.2.0-caanoo/src/input.c 2018-01-14 09:06:18.044628618 +0300 @@ -30,6 +30,41 @@ static int m_focus = 1; static int m_minimized = 0; +#ifdef CAANOO +static const char *joy_map(int button) +{ + switch(button) { + case 2: + return "left"; + case 6: + return "right"; + case 0: + return "up"; + case 4: + return "down"; + case 15: + return "space"; //y + case 14: + return "tab"; //x + case 12: + return "escape"; // a + case 18: + case 13: + return "return"; // b + case 8: + return "quit"; + case 10: + return "page up"; + case 11: + return "page down"; + case 9: + case 20: + return "f1"; + } + return ""; +} +#endif + int minimized(void) { if (nopause_sw) @@ -182,6 +217,10 @@ #if defined(IOS) || defined(ANDROID) SDL_SetEventFilter(HandleAppEvents, NULL); #endif + if(SDL_NumJoysticks() > 0) { + SDL_JoystickOpen(0); + SDL_JoystickEventState(SDL_ENABLE); + } return 0; } @@ -414,6 +453,20 @@ case SDL_QUIT: game_running = 0; return -1; +#ifdef CAANOO + case SDL_JOYBUTTONDOWN: + inp->type = KEY_DOWN; + inp->code = event.jbutton.button; + strncpy(inp->sym, joy_map(event.jbutton.button), sizeof(inp->sym)); + inp->sym[sizeof(inp->sym) - 1] = 0; + break; + case SDL_JOYBUTTONUP: + inp->type = KEY_UP; + inp->code = event.jbutton.button; + strncpy(inp->sym, joy_map(event.jbutton.button), sizeof(inp->sym)); + inp->sym[sizeof(inp->sym) - 1] = 0; + break; +#endif case SDL_KEYDOWN: /* A key has been pressed */ #if SDL_VERSION_ATLEAST(2,0,0) if (event.key.repeat) { instead-3.2.1/contrib/winrt.patch0000644000175000017500000003140613267071773016031 0ustar peterpeterdiff --git a/src/iowin32.c b/src/iowin32.c index 13a7dd73..56afa364 100644 --- a/src/iowin32.c +++ b/src/iowin32.c @@ -94,8 +94,16 @@ voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + // CreateFile has to be replaced with CreateFile2 because CreateFile can actually do a number of potentially unsafe (read: malware) things + // see: https://social.msdn.microsoft.com/Forums/office/en-US/e44eaf00-5be2-4683-868f-aca54dd658e0/u81not-able-to-create-file-using-universal-app-?forum=wpdevelop if ((filename!=NULL) && (dwDesiredAccess != 0)) + { +#ifndef _WIN_EXT hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#else + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#endif + } return win32_build_iowin(hFile); } @@ -110,7 +118,13 @@ voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); if ((filename!=NULL) && (dwDesiredAccess != 0)) + { +#ifndef _WIN_EXT hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#else + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#endif + } return win32_build_iowin(hFile); } @@ -125,7 +139,13 @@ voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); if ((filename!=NULL) && (dwDesiredAccess != 0)) + { +#ifndef _WIN_EXT hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#else + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#endif + } return win32_build_iowin(hFile); } @@ -140,7 +160,13 @@ voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mo win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); if ((filename!=NULL) && (dwDesiredAccess != 0)) + { +#ifndef _WIN_EXT hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#else + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#endif + } return win32_build_iowin(hFile); } @@ -197,7 +223,15 @@ long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL) { - DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); + DWORD dwSet; +#ifndef _WIN_EXT + dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); +#else + LARGE_INTEGER outPointer; + LARGE_INTEGER zero; + zero.QuadPart = 0; + dwSet = SetFilePointerEx(hFile, zero, &outPointer, FILE_CURRENT) ? outPointer.u.LowPart : INVALID_SET_FILE_POINTER; +#endif if (dwSet == INVALID_SET_FILE_POINTER) { DWORD dwErr = GetLastError(); @@ -221,7 +255,14 @@ ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) { LARGE_INTEGER li; li.QuadPart = 0; +#ifndef _WIN_EXT li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT); +#else + LARGE_INTEGER zero; + LARGE_INTEGER outPointer; + zero.QuadPart = 0; + li.u.LowPart = SetFilePointerEx(hFile, zero, &outPointer, FILE_CURRENT) ? outPointer.u.LowPart : INVALID_SET_FILE_POINTER; +#endif if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR)) { DWORD dwErr = GetLastError(); @@ -259,7 +300,15 @@ long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,in if (hFile != NULL) { +#ifndef _WIN_EXT DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod); +#else + LARGE_INTEGER outPointer; + LARGE_INTEGER loffset; + loffset.QuadPart = 0; + loffset.u.LowPart = offset; + DWORD dwSet = SetFilePointerEx(hFile, loffset, &outPointer, dwMoveMethod) ? outPointer.u.LowPart : INVALID_SET_FILE_POINTER; +#endif if (dwSet == INVALID_SET_FILE_POINTER) { DWORD dwErr = GetLastError(); @@ -297,8 +346,14 @@ long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T off if (hFile) { +#ifndef _WIN_EXT LARGE_INTEGER* li = (LARGE_INTEGER*)&offset; DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod); +#else + LARGE_INTEGER outPointer; + LARGE_INTEGER* li = (LARGE_INTEGER*)&offset; + DWORD dwSet = SetFilePointerEx(hFile, *li, &outPointer, dwMoveMethod) ? outPointer.u.LowPart : INVALID_SET_FILE_POINTER; +#endif if (dwSet == INVALID_SET_FILE_POINTER) { DWORD dwErr = GetLastError(); diff --git a/src/unpack.c b/src/unpack.c index 560abc97..236994f2 100644 --- a/src/unpack.c +++ b/src/unpack.c @@ -67,11 +67,46 @@ tm_unz tmu_date; HANDLE hFile; FILETIME ftm, ftLocal, ftCreate, ftLastAcc, ftLastWrite; +#ifndef _WIN_EXT hFile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); +#else + hFile = CreateFile2((LPCTSTR)filename, GENERIC_READ | GENERIC_WRITE, 0, OPEN_EXISTING, NULL); +#endif GetFileTime(hFile, &ftCreate, &ftLastAcc, &ftLastWrite); +#ifndef _WIN_EXT DosDateTimeToFileTime((WORD) (dosdate >> 16), (WORD) dosdate, &ftLocal); LocalFileTimeToFileTime(&ftLocal, &ftm); +#else + SYSTEMTIME systime; + /* + OMG, it's so lowlevel, but I'll try :) + wFatDate[in] + The MS - DOS date.The date is a packed value with the following format. + Bits Description + 0 - 4 Day of the month(1-31) + 5 - 8 Month(1 = January, 2 = February, and so on) + 9 - 15 Year offset from 1980 (add 1980 to get actual year) + + wFatTime[in] + The MS - DOS time.The time is a packed value with the following format. + Bits Description + 0 - 4 Second divided by 2 + 5 - 10 Minute(0-59) + 11 - 15 Hour(0-23 on a 24 - hour clock) + */ + WORD wFatDate = (WORD)(dosdate >> 16); + WORD wFatTime = (WORD)dosdate; + systime.wYear = (WORD)((wFatDate >> 8) + 1980); + systime.wMonth = (WORD)(((BYTE)wFatDate) >> 4); + systime.wDayOfWeek = 0; // ignored + systime.wDay = (WORD)(0x000F & wFatDate); + systime.wHour = (WORD)(wFatTime >> 10); + systime.wMinute = (WORD)((wFatTime >> 4) & 0x003F); + systime.wSecond = (WORD)(wFatTime & 0x000F) * 2; + systime.wMilliseconds = 0; + SystemTimeToFileTime(&systime, &ftm); +#endif SetFileTime(hFile, &ftm, &ftLastAcc, &ftm); CloseHandle(hFile); #else @@ -160,10 +195,23 @@ const char *newdir; return 1; } -static int do_extract_currentfile(uf, password) +static __inline char *get_full_path(full_path_buffer, dirname, filename) +char *full_path_buffer; +const char *dirname; +const char *filename; +{ + strcpy(full_path_buffer, dirname); + strcat(full_path_buffer, "/"); + strcat(full_path_buffer, filename); + return full_path_buffer; +} + +static int do_extract_currentfile(uf, password, dirname) unzFile uf; const char *password; +const char *dirname; { + char full_path_buffer[MAX_PATH]; char filename_inzip[256]; char dir_inzip[256]; char *filename_withoutpath; @@ -209,7 +257,7 @@ const char *password; goto out; } fprintf(stderr, "creating directory: %s\n", filename_inzip); - mymkdir(filename_inzip); + mymkdir(get_full_path(full_path_buffer, dirname, filename_inzip)); if (!*zip_game_dirname) strcpy(zip_game_dirname, dir_inzip); } else { @@ -226,16 +274,16 @@ const char *password; } if (skip == 0) { - fout = fopen64(write_filename, "wb"); + fout = fopen64(get_full_path(full_path_buffer, dirname, write_filename), "wb"); /* some zipfile don't contain directory alone before file */ if ((fout == NULL) && (filename_withoutpath != (char *)filename_inzip)) { char c = *(filename_withoutpath - 1); *(filename_withoutpath - 1) = '\0'; - makedir(write_filename); + makedir(get_full_path(full_path_buffer, dirname, write_filename)); *(filename_withoutpath - 1) = c; - fout = fopen64(write_filename, "wb"); + fout = fopen64(get_full_path(full_path_buffer, dirname, write_filename), "wb"); } if (fout == NULL) { @@ -273,7 +321,7 @@ const char *password; fclose(fout); if (err == 0) - change_file_date(write_filename, + change_file_date(get_full_path(full_path_buffer, dirname, write_filename), file_info.dosDate, file_info.tmu_date); } @@ -313,9 +361,10 @@ out: return err; } -static int do_extract(uf, password) +static int do_extract(uf, password, dirname) unzFile uf; const char *password; +const char *dirname; { uLong i; unz_global_info64 gi; @@ -325,7 +374,7 @@ const char *password; fprintf(stderr, "error %d with zipfile in unzGetGlobalInfo \n", err); for (i = 0; i < gi.number_entry; i++) { - if (do_extract_currentfile(uf, password) != UNZ_OK) + if (do_extract_currentfile(uf, password, dirname) != UNZ_OK) return -1; if ((i + 1) < gi.number_entry) { @@ -395,7 +444,7 @@ int unpack(const char *zipfilename, const char *dirname) fprintf(stderr, "Error changing dir to %s, aborting\n", dirname); goto out; } - ret_value = do_extract(uf, NULL); + ret_value = do_extract(uf, NULL, dirname); out: unzClose(uf); #ifdef _WIN32 diff --git a/src/unzip.c b/src/unzip.c index 6116f3b9..411c600c 100644 --- a/src/unzip.c +++ b/src/unzip.c @@ -612,12 +612,18 @@ local unzFile unzOpenInternal (const void *path, us.z_filefunc = *pzlib_filefunc64_32_def; us.is64bitOpenFunction = is64bitOpenFunction; - + void *_path = path; +#ifdef _WIDE_CHARS + wchar_t wpath[_MAX_PATH]; + mbstowcs(wpath, path, _MAX_PATH); + _path = (void*)wpath; +#endif us.filestream = ZOPEN64(us.z_filefunc, - path, + _path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) return NULL; diff --git a/src/windows.c b/src/windows.c index c1469cb4..120ad047 100644 --- a/src/windows.c +++ b/src/windows.c @@ -154,22 +154,45 @@ char *sdl_path(char *p) char *appdir( void ); +#ifdef _UWP +char *game_tmp_path(void) +{ + static char lpTempPathBuffer[MAX_PATH]; + getAppTempDir(lpTempPathBuffer); + strcat((char*)lpTempPathBuffer, "/instead-games"); + if (mkdir((char*)lpTempPathBuffer) && access((char*)lpTempPathBuffer, W_OK)) + return NULL; + unix_path((char*)lpTempPathBuffer); + return (char*)lpTempPathBuffer; +} +#else char *game_tmp_path(void) { DWORD dwRetVal = 0; static TCHAR lpTempPathBuffer[MAX_PATH]; + static char res[MAX_PATH]; // Gets the temp path env string (no guarantee it's a valid path). dwRetVal = GetTempPath(MAX_PATH, // length of the buffer lpTempPathBuffer); // buffer for path if (dwRetVal > MAX_PATH || (dwRetVal == 0)) { return NULL; } +#ifdef _WIDE_CHARS + wcstombs(res, lpTempPathBuffer, sizeof(res)); + strcat(res, "/instead-games"); + if (mkdir(res) && errno != EEXIST) + return NULL; + unix_path(res); + return res; +#else strcat((char*)lpTempPathBuffer, "/instead-games"); if (mkdir((char*)lpTempPathBuffer) && errno != EEXIST) return NULL; unix_path((char*)lpTempPathBuffer); return (char*)lpTempPathBuffer; +#endif } +#endif char *game_local_games_path(int cr) { diff --git a/src/winrt.c b/src/winrt.c index 82c2d6d3..d75b1a4a 100644 --- a/src/winrt.c +++ b/src/winrt.c @@ -249,12 +249,56 @@ char *game_save_path( int cr, int nr ) int debug_init(void) { + // stub return 0; } void debug_done() { + // stub } + +BOOL GetFileTime( + HANDLE hFile, + LPFILETIME lpCreationTime, + LPFILETIME lpLastAccessTime, + LPFILETIME lpLastWriteTime +) +{ + // stub + return 1; +} + +BOOL SetFileTime( + HANDLE hFile, + const FILETIME *lpCreationTime, + const FILETIME *lpLastAccessTime, + const FILETIME *lpLastWriteTime +) +{ + // stub + return 1; +} + +// see https://docs.microsoft.com/en-us/cpp/cppcx/crt-functions-not-supported-in-universal-windows-platform-apps +// The concept of a working directory doesn't apply to Windows 8.x Store apps. Use full paths instead. +char *_getcwd( + char *buffer, + int maxlen +) +{ + // stub + return buffer; +} + +int _chdir( + const char *dirname +) +{ + // stub + return 0; +} + #ifdef _USE_BROWSE char *open_file_dialog(void) { instead-3.2.1/contrib/instead-sailfish-game.spec0000644000175000017500000000246713267071773020664 0ustar peterpeterSummary: Color Lines game Name: instead-ilines Version: 1.1 Release: 1%{?dist} License: GPL URL: http://instead-games.ru Source0: %{name}-%{version}.zip Group: Amusements/Games BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch: noarch Requires: instead %description Classic Color Lines game %prep cd %{_builddir} b=`echo %{name} | sed -e 's/instead-//g'` rm -rf %{name} unzip %{name}-%{version}.zip mv "$b" %{name} %setup %build %install rm -rf $RPM_BUILD_ROOT install -d -m 0755 $RPM_BUILD_ROOT/usr/share/instead/games/%{name} cd %{name} tar cf - . | (cd $RPM_BUILD_ROOT/usr/share/instead/games/%{name} && tar xBf -) cat >%{name}.desktop < instead.1 touch $@ clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp # Add here commands to clean up after the build process. rm -rf doc/sdl-instead.6 rm -rf doc/sdl-instead.txt rm -rf Rules.make ln -s Rules.make.system Rules.make $(MAKE) clean rm -rf Rules.make ln -s Rules.make.standalone Rules.make dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs # Add here commands to install the package into debian/instead. rm -rf Rules.make ln -s Rules.make.system Rules.make $(MAKE) install DESTDIR=$(CURDIR)/debian/instead PREFIX=/usr DATAPATH=/usr/share/games/instead BIN=/usr/games rm -rf Rules.make # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installchangelogs dh_installdocs dh_installexamples # dh_install # dh_installmenu # dh_installdebconf # dh_installlogrotate # dh_installemacsen # dh_installpam # dh_installmime # dh_python # dh_installinit # dh_installcron # dh_installinfo dh_installman dh_link dh_strip dh_compress dh_fixperms # dh_perl # dh_makeshlibs dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure instead-3.2.1/debian/copyright0000644000175000017500000000061313267071773015356 0ustar peterpeterThis package was debianized by Peter Kosyh p.kosyh@gmail.com on Thu, 21 May 2009 11:40:29 +0400. It was downloaded from http://instead.sourceforge.net Upstream Author: p.kosyh@gmail.com Copyright: Copyright (C) 2009 Peter Kosyh License: MIT The Debian packaging is (C) 2009, Peter Kosyh p.kosyh@gmail.com and is licensed under the MIT, see `/usr/share/common-licenses/MIT'. instead-3.2.1/debian/changelog0000644000175000017500000000660313267071773015302 0ustar peterpeterinstead (3.2.1) unstable; urgency=low * 3.2.1 release; -- Peter Kosyh Sun, 22 Apr 2018 13:34:00 +0300 instead (3.2.0) unstable; urgency=low * 3.2.0 release; -- Peter Kosyh Fri, 9 Feb 2018 21:07:00 +0300 instead (3.1.2) unstable; urgency=low * 3.1.2 release; -- Peter Kosyh Mon, 21 Aug 2017 16:45:00 +0300 instead (3.1.1) unstable; urgency=low * 3.1.1 release; -- Peter Kosyh Mon, 21 Aug 2017 08:50:00 +0300 instead (3.1.0) unstable; urgency=low * 3.1.0 release; -- Peter Kosyh Sun, 20 Aug 2017 10:16:00 +0300 instead (3.0.1) unstable; urgency=low * 3.0.1 release; -- Peter Kosyh Wed, 24 May 2017 21:03:00 +0300 instead (3.0.0) unstable; urgency=low * 3.0.0 release; -- Peter Kosyh Wed, 19 Apr 2017 17:45:00 +0300 instead (2.4.1) unstable; urgency=low * 2.4.1 release; -- Peter Kosyh Sat, 16 Apr 2016 13:50:00 +0300 instead (2.4.0) unstable; urgency=low * 2.4.0 release; -- Peter Kosyh Thu, 18 Feb 2016 15:09:00 +0300 instead (2.3.0) unstable; urgency=low * 2.3.0 release; -- Peter Kosyh Sun, 18 Oct 2015 13:15:00 +0300 instead (2.2.7) unstable; urgency=low * 2.2.7 release; -- Peter Kosyh Sun, 20 Sep 2015 13:49:00 +0300 instead (2.2.6) unstable; urgency=low * 2.2.6 release; -- Peter Kosyh Sun, 20 Sep 2015 13:22:00 +0300 instead (2.2.5) unstable; urgency=low * 2.2.5 release; -- Peter Kosyh Sun, 30 Aug 2015 16:15:00 +0300 instead (2.2.4) unstable; urgency=low * 2.2.4 release; -- Peter Kosyh Sun, 2 Aug 2015 11:22:00 +0300 instead (2.2.3) unstable; urgency=low * 2.2.3 release; -- Peter Kosyh Fri, 20 Mar 2015 18:56:00 +0300 instead (2.2.2) unstable; urgency=low * 2.2.2 release; -- Peter Kosyh Fri, 6 Feb 2015 19:17:00 +0300 instead (2.2.1) unstable; urgency=low * 2.2.1 release; -- Peter Kosyh Sat, 31 Jan 2015 16:27:00 +0300 instead (2.2.0) unstable; urgency=low * 2.2.0 release; -- Peter Kosyh Thu, 1 Jan 2015 10:52:00 +0300 instead (2.1.1) unstable; urgency=low * 2.1.1 release; -- Peter Kosyh Wed, 9 Jul 2014 13:30:00 +0400 instead (2.1.0) unstable; urgency=low * 2.1.0 release; -- Peter Kosyh Tue, 3 Jun 2014 17:28:00 +0400 instead (2.0.3) unstable; urgency=low * 2.0.3 release; -- Peter Kosyh Thu, 20 Feb 2014 17:20:00 +0400 instead (2.0.2) unstable; urgency=low * 2.0.2 release; -- Peter Kosyh Thu, 30 Jan 2014 08:30:00 +0400 instead (2.0.1) unstable; urgency=low * 2.0.1 release; -- Peter Kosyh Mon, 27 Jan 2014 19:40:00 +0400 instead (2.0.0) unstable; urgency=low * 2.0.0 release; -- Peter Kosyh Sun, 26 Jan 2014 13:12:00 +0400 instead (1.9.1) unstable; urgency=low * 1.9.1 release; -- Peter Kosyh Sat, 13 Jul 2013 14:30:00 +0400 instead (1.9.0) unstable; urgency=low * 1.9.0 release; -- Peter Kosyh Fri, 12 Apr 2013 08:00:00 +0400 instead (1.8.3) unstable; urgency=low * debian friendly release; -- Peter Kosyh Sat, 26 Jan 2013 14:52:00 +0400 instead-3.2.1/debian/compat0000644000175000017500000000000213267071773014621 0ustar peterpeter7 instead-3.2.1/debian/control0000644000175000017500000000073413267071773015032 0ustar peterpeterSource: instead Section: games Priority: optional Maintainer: Peter Kosyh Build-Depends: debhelper (>= 7), pkg-config, liblua5.1-dev, libsdl2-dev, libsdl2-ttf-dev, libsdl2-image-dev, libsdl2-mixer-dev, zlib1g-dev Standards-Version: 3.8.3 Homepage: http://instead.sourceforge.net Package: instead Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: simple text adventures/visual novels engine Visual novell/text quest-like engine. instead-3.2.1/desktop/0000755000175000017500000000000013267071773013652 5ustar peterpeterinstead-3.2.1/desktop/CMakeLists.txt0000644000175000017500000000036613267071773016417 0ustar peterpeterIF(SYSTEMWIDE) SET(BIN ${CMAKE_INSTALL_PREFIX}/${BINDIR}) # for following CONFIGURE_FILE CONFIGURE_FILE(instead.desktop.in instead.desktop) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/instead.desktop DESTINATION ${DESKTOPDIR}) ENDIF(SYSTEMWIDE) instead-3.2.1/desktop/instead.desktop.in0000644000175000017500000000075713267071773017312 0ustar peterpeter[Desktop Entry] Version=1.0 Type=Application Name=INSTEAD Name[ru]=INSTEAD Name[uk]=INSTEAD Comment=Simple Text Adventures Interpreter Comment[ru]=Интерпретатор простых приключений Comment[uk]=Iнтерпретатор простих пригод Keywords=game;adventure;quest; Keywords[ru]=игра;приключения;квест; Keywords[uk]=гра;пригоди;квест; Exec=@BIN@/sdl-instead Icon=sdl_instead Terminal=false Categories=Game;LogicGame; instead-3.2.1/desktop/Makefile0000644000175000017500000000065213267071773015315 0ustar peterpeterinclude ../Rules.make include ../config.make clean: rm -rf instead.desktop all: instead.desktop instead.desktop: instead.desktop.in cat instead.desktop.in | sed -e "s|@BIN@|$(BIN)|g" > instead.desktop install: $(INSTALLD) $(DESTDIR)$(PREFIX)/share/applications $(INSTALL) instead.desktop $(DESTDIR)$(PREFIX)/share/applications/instead.desktop uninstall: $(RM) $(DESTDIR)$(PREFIX)/share/applications/instead.desktop instead-3.2.1/doc/0000755000175000017500000000000013267072003012731 5ustar peterpeterinstead-3.2.1/doc/modules3.tex0000644000175000017500000000265713267071773015235 0ustar peterpeter\documentclass[12pt,]{book} \usepackage{cmap} \usepackage[T2A]{fontenc} \usepackage[english,russian]{babel} \usepackage{indentfirst} % \usepackage[russian]{datetime} \usepackage{upquote} \usepackage{ifxetex,ifluatex} \usepackage{fixltx2e} % provides \textsubscript \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex % \usepackage[utf8]{inputenc} \else % if luatex or xelatex \usepackage{fontspec} \ifxetex \usepackage{xltxtra,xunicode} \fi \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase} \newcommand{\euro}{€} \setmainfont{Verdana} \setsansfont{Verdana} \setmonofont{Liberation Mono} \fi \ifxetex \usepackage[setpagesize=false, % page size defined by xetex unicode=false, % unicode breaks when used with xetex xetex]{hyperref} \else \usepackage[unicode=true]{hyperref} \fi \hypersetup{breaklinks=true, bookmarks=true, pdfauthor={}, pdftitle={STEAD3}, colorlinks=true, urlcolor=blue, linkcolor=magenta, pdfborder={0 0 0}} \usepackage{tocstyle} \setcounter{tocdepth}{3} \setcounter{secnumdepth}{3} \title{STEAD3: Программирование модулей} \author{Петр Косых} \date{\today} \sloppy \begin{document} \maketitle { \hypersetup{linkcolor=black} \renewcommand{\contentsname}{Оглавление} \tableofcontents \clearpage } \input{modules3-manual.tex} \end{document} instead-3.2.1/doc/instead.60000644000175000017500000000740313267071773014470 0ustar peterpeter.TH INSTEAD 6 "Version 3.2.1" Instead GAMES .SH NAME INSTEAD - Simple Text Adventure Engine, The Interpreter .SH DESCRIPTION The interpreter of STEAD (Simple Text Adventures) allows one to play games that combine visual novels, text adventures and classic quests of 1990-s. The STEAD games features are: .TP * very simple source code of the stories. (based on LUA); .TP * graphical game interface; .TP * supports music and images; .TP * theme support \- a game may change the interface look; .TP * portability (originally written for Linux, depends on SDL and lua). .SH SYNOPSIS .B sdl-instead .I [options] [game.zip or game.idf or path to game] .SH OPTIONS .TP .B -debug Debug mode (for game developers). .TP .B -nosound Run the game without sound. .TP .B -vsync Vsync output. (SDL2 only) .TP .B -gamespath Add path with games. .TP .B -themespath Add path with themes. .TP .B -nostdgames Do not use default games. .TP .B -nostdthemes Do not use default themes. .TP .B -game Select game in gamespath. .TP .B -theme Select theme in themespath. .TP .B -owntheme Force game to use own theme. .TP .B -fullscreen Run the game in fullscreen mode. .TP .B -nocursor Do not use game mouse cursors (use system one) .TP .B -hires / -nohires Set/unset the high resolution when run in fullscreen mode. .TP .B -window Run the game in windowed mode. .TP .B -resizable Resizable window (SDL2 only) .TP .B -scale Scale window (SDL2 only) .TP .B -noautosave Disable autosave load. .TP .B -encode [encoded file] Encode lua file. Encoded file can be executed with doencfile("encoded file"). .TP .B -idf Build idf file [INSTEAD data file] from directory. .TP .B -mode [WxH] Use WxH resolution. .TP .B -modes [,[,]] ... Define available resolutions. .TP .B -software Force software rendering .TP .B -renderer Select default renderer (SDL2 only) .TP .B -fontscale Font scaling. .TP .B -nopause Do not pause the game on window minimize. .TP .B -hinting 0|1|2|3 Set the font hinting mode (helpful with infinality). .TP .B -install [game in zip] Install game from zip archive .TP .B -quit Quit :) .TP .B -appdata [fullpath] Store saves and settings in appdata path. Path must exist! .TP .B -chunksize [size in bytes] Size for audio buffer. Try this if sound lags. .TP .B -version Show version and exit. .TP .B -lua [arguments] Exec lua script (for game developers). .TP .B -luac Check lua script (for game developers). .TP .B -standalone Run game in standalone mode (no sandbox, no games selection ...). .TP .B -noconfig Do not load saved config (run with defaults). .TP .B -profile Using configuration profile. Profile file is the ini-styled file with parameter = value pairs. Where is parameters are arguments without -. .PP Configuration file name is 'insteadrc' and it's located in ~/.instead/. Games can be downloaded from http://instead-games.sf.net. Unzip them in ~/.instead/games. .SH CONTROLS Please, see tutorial. .SH LICENCE This software is covered by the terms of the MIT license. .SH WARRANTY None. .SH COPYRIGHT AND CREDITS .TP .B Peter Kosyh INSTEAD author. .TP .B Ilya Ryndin Initial port to Windows. .TP .B Mahno Aleksey, Anton Kolosov Port to Android. .TP .B .dm Port to Mac OS X. .TP .B Andrey Afletdinov Port to Windows CE. .TP .B Vadim Balashoff Advices. .TP .B Vladimir Zhirov Advices. .TP .B Alexander Yakovlev manual.tex support. .TP .B Serj Kalichev Advices and default theme correction. .TP .B Vladimir Podobaev, Oleg Gvozdev Testers. .TP .B Alexander Soborov Wiki support. .TP .B Andrew Lobanov Games repository, slackbuild. .TP Many others for comments, bug reports, games and ideas. .SH SEE ALSO .BR https://instead-hub.github.io instead-3.2.1/doc/stead3.md0000644000175000017500000100212713267071773014456 0ustar peterpeter## Общие сведения Код игр под INSTEAD пишется на языке Lua (5.1), поэтому, знание этого языка полезно, хотя и не необходимо. Ядро движка также написано на lua, поэтому знание Lua может быть полезным для углубленного понимания принципов его работы, конечно, при условии, если вам интересно этим заниматься. За время своего развития, INSTEAD получил множество новых функций. Теперь с его помощью можно делать игры разных жанров (от аркад, до игр с текстовым вводом). А также, в INSTEAD можно запускать игры, написанные на некоторых других движках, но основой INSTEAD остается первоначальное ядро, которое ориентировано на создание текстографических приключенческих игр. В данной документации описана именно эта базовая часть, изучение которой необходимо даже в том случае, если вы хотите написать что-то другое... Начните свое изучение INSTEAD с написания простой игры! В феврале 2017 года, после 8 лет разработки, INSTEAD (версия 3.0) вышел с поддержкой нового ядра STEAD3. Старое ядро получило название STEAD2. INSTEAD поддерживает работу игр написанных как на STEAD2, так и на STEAD3. Это руководство описывает STEAD3. Если у вас возникают вопросы, вы можете посетить сайт INSTEAD: https://instead-hub.github.io Или подключиться к чату на gitter: https://gitter.im/instead-hub/instead ### История создания Когда мы говорим "текстовое приключение" у большинства людей возникает один из двух привычных образов. Это либо текст с кнопками действий, например: Вы видите перед собой стол. На столе лежит яблоко. Что делать? 1) Взять яблоко 2) Отойти от стола Или, гораздо реже, это классические игры с текстовым вводом, где для управления игрой необходимо было вводить действия с клавиатуры. Вы на кухне. Тут есть стол. > осмотреть стол. На столе есть яблоко. У обоих подходов есть свои преимущества и недостатки. Если говорить про первый подход, то он близок к жанру книг-игр и удобен больше для литературных текстов, которые описывают _события_, происходящие с главным героем, и не очень удобен для создания классических квестов, где главный герой исследует _смоделированный_ в игре _мир_, свободно перемещаясь по нему и взаимодействуя с объектами этого мира. Второй подход моделирует мир, но требует значительных усилий от автора игры, и, что более важно, более подготовленного игрока. Особенно, когда мы имеем дело с русским языком. Проект INSTEAD был создан для написания другого типа игр, которые совмещают преимущества обоих подходов, одновременно пытаясь избежать их недостатков. Мир игры на INSTEAD моделируется как при втором подходе, то есть в игре есть места (сцены или комнаты) которые может посещать главный герой и объекты, с которыми он взаимодействует (включая живых персонажей). Игрок свободно изучает мир и манипулирует объектами. Причем, действия с объектами не прописаны в виде явных пунктов меню, а скорее напоминают классические графические квесты в стиле 90-х. На самом деле, в INSTEAD есть множество незаметных на первый взгляд вещей, которые направлены на развитие выбранного подхода, и который делает процесс игры максимально динамичным и непохожим на привычные "текстовые квесты". Это подтверждается в том числе и тем, что на движке было выпущено множество замечательных игр, интерес к которым проявляют не только любители текстовых игр как таковых, но и люди не знакомые с данным жанром. Перед изучением данного руководства, я рекомендую поиграть в классические игры INSTEAD, чтобы понять о чем идет речь. С другой стороны, раз вы здесь, то наверное вы уже сделали это. Правда, не стоит пока изучать код этих игр, так как старые игры очень часто написаны неоптимально, с использованием устаревших конструкций. Текущая версия INSTEAD позволяет реализовывать код лаконичнее, проще и понятнее. Об этом и рассказывается в данном документе. Если вас интересует история создания движка, то вы можете прочитать статью о том, как все начиналось: https://instead-hub.github.io/article/2010-05-09-history/ ### Как выглядит классическая INSTEAD игра Итак, как выглядит классическая INSTEAD игра? _Главное окно_ игры содержит описательную часть, информацию о статической и динамической части сцены, активные события и картинку сцены (в графическом интерпретаторе) с возможными переходами в другие сцены. _Описательная часть сцены_ отображается только один раз, при показе сцены, или при явном осмотре сцены (в графическом интерпретаторе -- _Статическая часть сцены_ содержит информацию о статических объектах сцены (обычно, это декорации) и отображается всегда. Эта часть написана автором игры. _Динамическая часть сцены_ составлена из описаний объектов сцены, которые присутствуют в данный момент на сцене. Эта часть генерируется автоматически и отображается всегда. Обычно, в ней представлены объекты, которые могут менять свое местоположение. Игроку доступны объекты, доступные на любой сцене -- _инвентарь_. Игрок может взаимодействовать с объектами инвентаря и действовать объектами инвентаря на другие объекты сцены или инвентаря. > Следует отметить, что понятие инвентаря является условным. Например, > в "инвентаре" могут находиться такие объекты как "открыть", > "осмотреть", "использовать" и т.д. _Действиями_ игрока могут быть: - осмотр сцены; - действие на объект сцены; - действие на объект инвентаря; - действие объектом инвентаря на объект инвентаря; - действие объектом инвентаря на объект сцены; - переход в другую сцену. ### Как создавать игру Игра представляет из себя каталог, в котором должен находиться скрипт (текстовый файл) main3.lua. (Обратите внимание, наличие файла main3.lua означает, что вы пишите игру на STEAD3!) Другие ресурсы игры (скрипты на lua, графика и музыка) должны находиться в рамках этого каталога. Все ссылки на ресурсы делаются относительно текущего каталога -- каталога игры. В начале файла main3.lua может быть определен заголовок, состоящий из тегов (строк специального вида). Теги должны начинаться с символов: два минуса. -- Два минуса это комментарий с точки зрения Lua. На данный момент существуют следующие теги. Тег $Name: содержит название игры в кодировке UTF-8. Пример использования тега: -- $Name: Самая интересная игра!$ Затем следует (желательно) задать версию игры: -- $Version: 0.5$ И указать авторство: -- $Author: Анонимный любитель текстовых приключений$ Дополнительную информацию об игре, можно задать тегом Info: -- $Info: Это ремейк старой игры\nС ZX specturm$ Обратите внимание на \n в Info, это станет переводом строки, когда вы выберете пункт "Информация" в INSTEAD. Если вы разрабатываете игру в Windows, то убедитесь, что ваш редактор поддерживает кодировку UTF-8 _без BOM_. Именно эту кодировку следует использовать при написании игры! Далее, обычно следует указать модули, которые требуются игре. О модулях будет рассказано отдельно. require "fmt" -- некоторые функции форматирования fmt.para = true -- включить режим параграфов (отступы) Кроме того, обычно стоит определить обработчики по-умолчанию: game.act, game.use, game.inv, о которых также будет рассказано ниже. game.act = 'Не работает.'; game.use = 'Это не поможет.'; game.inv = 'Зачем мне это?'; _Инициализацию_ игры следует описывать в функции init, которая вызывается движком в самом начале. В этой функции удобно инициализировать состояние игрока на начало игры, или какие-то другие действия, нужные для первоначальной настройки мира игры. Впрочем, функция ''init'' может быть и не нужна. function init() -- добавим в инвентарь нож и бумагу take 'нож' take 'бумага' end После того как игра проинициализирована, выполняется запуск игры. Вы можете определить функцию start(), которая запускается непосредственно перед запуском игры. Это значит, например, что в случае загрузки сохраненной игры, start() вызовется после того, как сохранение будет прочитано, function start(load) -- восстановить состояние? if load then dprint "Это загрузка состояния." else dprint "Это старт игры." end -- нам сейчас не нужно ничего делать end Графический интерпретатор ищет доступные игры в каталоге games. Unix-версия интерпретатора кроме этого каталога просматривает также игры в каталоге ~/.instead/games. Windows-версия: Documents and Settings/USER/Local Settings/Application Data/instead/games. В Windows- и standalone-Unix-версии игры ищутся в каталоге ./appdata/games, если он существует. В некоторых сборках INSTEAD (в Windows, в Linux если проект собран с gtk и др.) можно открывать игру по любому пути из меню "Выбор игры". Либо, нажать f4. Если в каталоге с играми присутствует только одна игра, INSTEAD запустит ее автоматически, это удобно, если вы хотите распространять свою игру вместе с движком. Таким образом, вы кладете игру в свой каталог и запускаете INSTEAD. __Важно!__ При написании игры, настоятельно рекомендуется использовать отступы для оформления кода игры, как это сделано в примере из данного руководства, этим самым вы сократите количество ошибок и сделаете свой код наглядней! Ниже приводится минимальный шаблон для вашей первой игры: ``` -- $Name: Моя первая игра$ -- $Version: 0.1$ -- $Author: Анонимный автор$ require "fmt" fmt.para = true game.act = 'Гм...'; game.use = 'Не сработает.'; game.inv = 'Зачем это мне?'; function init() -- инициализация, если она нужна end ``` ### Основы отладки Во время отладки (проверки работоспособности вашей игры) удобно, чтобы INSTEAD был запущен с параметром -debug, тогда в случае ошибок будет показана более подробная информация о проблеме в виде стека вызовов. Параметр -debug можно задать в ярлыке (если вы работаете в Windows), а для других систем, я думаю вы и так знаете как передавать параметры командной строки. Кроме того, в режиме -debug автоматически подключается отладчик. Вы можете активировать его с помощью клавиш ctrl-d или f7. Вы можете подключить отладчик и явно указав: require "dbg" В коде вашей игры. При отладке игры обычно нужно часто сохранять игру и загружать состояние игры. Вы можете использовать стандартный механизм сохранений через меню (или по клавишам f2/f3), или воспользоваться быстрым сохранением/загрузкой (клавиши f8/f9). В режиме '-debug' вы можете перезапускать игру клавишами 'alt-r'. В комбинации с f8/f9 это дает возможность быстро посмотреть изменения в игре после ее правки. > Внимание! Если вы просто перезапустите INSTEAD, то скорее всего > увидите старое состояние игры, так как по умолчанию работает режим > автозагрузки автосохранения! Либо отключите эту настройку в меню > (автосохранение), либо явно перезапускайте игру после правок. > Перезапуск возможен через меню (начать заново) или 'alt-r' в режиме > '-debug' как это описано выше. В режиме '-debug' Windows-версия INSTEAD создает консольное окно (в Unix версии, если вы запускаете INSTEAD из консоли, вывод будет направлен в нее) в которое будет осуществляться вывод ошибок. Кроме того, используя функцию 'print()' вы сможете порождать свои сообщения с отладочным выводом. Например: ``` act = function(s) print ("Act is here! "); ... end; ``` Не пугайтесь, когда вы прочитаете все руководство и начнете писать свою игру, вы, скорее всего, взглянете на этот пример с большим воодушевлением. Вы также можете использовать функцию dprint(), которая посылает вывод в окно отладчика, и вы сможете посмотреть его при входе в режим отладки. ``` act = function(s) dprint ("Act is here! "); ... end; ``` Во время отладки бывает удобно изучать файлы сохранений, которые содержат состояние переменных игры. Чтобы не искать каждый раз файлы сохранений, создайте каталог saves в директории с вашей игрой (в том каталоге, где содержится main3.lua) и игра будет сохраняться в saves. Этот механизм также будет удобен для переноса игры на другие компьютеры. Возможно (особенно, если вы пользуетесь Unix системами) вам понравится идея проверки синтаксиса ваших скриптов через запуск компилятора ''luac''. В Windows это тоже возможно, нужно только установить выполняемые файлы lua для Windows (http://luabinaries.sourceforge.net)/ и воспользоваться luac52.exe. Вы можете проверить синтаксис и с помощью INSTEAD, для этого воспользуйтесь параметром -luac: sdl-instead -debug -luac <пусть к скрипту.lua> ## Сцена _Сцена_ (или комната) -- это единица игры, в рамках которой игрок может изучать все объекты сцены и взаимодействовать с ними. Например, сценой может быть комната, в которой находится герой. Или участок леса, доступный для наблюдения. В любой игре должна быть сцена с именем ''main''. Именно с нее начнется и ваша игра! ``` room { nam = 'main'; disp = "Главная комната"; dsc = [[Вы в большой комнате.]]; } ``` Запись означает создание объекта (так как почти все сущности в INSTEAD это объекты) main типа room (комната). Атрибут объекта nam хранит имя комнаты 'main', по которому можно обращаться к комнате из кода. Каждый объект имеет свое уникальное имя. Если вы попробуете создать два объекта с одинаковыми именами, вы получите сообщение об ошибке. Для обращения к объекту по имени, вы можете использовать следующую запись: ``` dprint("Объект: ", _'main') ``` У каждого объекта игры есть _атрибуты_ и _обработчики событий_. В данном примере есть два атрибута: nam и dsc. Атрибуты разделяются разделителем (в данном примере -- символом точка с запятой ';'). Обычно, атрибуты могут быть текстовыми строками, функциями-обработчиками и булевыми значениями. Однако, атрибут nam всегда должен быть текстовой строкой, если он задан. На самом деле, вы можете не указывать имя при создании объекта: ``` room { disp = "Главная комната"; dsc = [[Вы в большой комнате.]]; } ``` В таком случае, движок сам даст имя объекту, и это имя будет неким числом. Так как вы не знаете это число, вы не можете обратиться к объекту явно. Иногда удобно создавать безымянные объекты, например, для декораций. При создании объекта, даже если он "безымянный", вы можете создать переменную - ссылку на объект, например: ``` myroom = room { disp = "Чулан"; dsc = [[Вы в чулане.]]; } ``` Переменная myroom в таком случае становится синонимом объекта (ссылкой на сам объект). ``` dprint("Объект: ", myroom) ``` Вы можете придерживаться какого-то одного способа, или применять оба. Например, вы можете задать и имя и переменную-ссылку: ``` main_room = room { nam = 'main'; disp = "Главная комната"; dsc = [[Вы в большой комнате.]]; } ``` Важно понять, что движок в любом случае работает с именами объектов, а переменные-ссылки -- это просто способ упростить доступ к часто используемым объектам. Поэтому, для нашей первой игры мы обязаны указать атрибут nam = 'main', чтобы создать комнату main с которой и начнется наше приключение! В нашем примере, при показе сцены, в качестве заголовка сцены будет использован атрибут 'disp'. На самом деле, если бы мы его не задали, то в заголовке мы бы увидели 'nam'. Но nam не всегда удобно делать заголовком сцены, особенно если это строка вроде 'main', или если это числовой идентификатор, который движок присвоил объекту автоматически. Есть еще более понятный атрибут 'title'. Если он задан, то при отображении комнаты в качестве заголовка будет указан именно он. title используется тогда, когда игрок находится _внутри_ комнаты. Во всех остальных случаях (при показе переходов в эту комнату) используется 'disp' или 'nam'. ``` mroom = room { nam = 'main'; title = 'Начало приключения'; disp = "Главная комната"; dsc = [[Вы в большой комнате.]]; } ``` Атрибут 'dsc' -- это описание сцены, которое выводится один раз при входе в сцену или при явном осмотре сцены. В нем нет описаний объектов, присутствующих в сцене. Вы можете использовать символ ',' вместо ';' для разделения атрибутов. Например: ``` room { nam = 'main', disp = 'Главная комната', dsc = 'Вы в большой комнате.', } ``` В данном примере все атрибуты -- строковые. Строка может быть записана в одинарных или двойных кавычках: ``` room { nam = 'main'; disp = 'Главная комната'; dsc = "Вы в большой комнате."; } ``` Для длинных описаний удобно использовать запись вида: ``` dsc = [[ Очень длинное описание... ]]; ``` При этом переводы строк игнорируются. Если вы хотите, чтобы в выводе описания сцены присутствовали абзацы -- используйте символ '^'. ``` dsc = [[ Первый абзац. ^^ Второй Абзац.^^ Третий абзац.^ На новой строке.]]; ``` Я рекомендую всегда использовать [[ и ]] для 'dsc'. Напомню еще раз, что имя 'nam' объекта и его отображение (в данном случае то, как сцена будет выглядеть для игрока в виде надписи сверху) можно (и, часто, нужно!) разделять. Для этого существуют атрибуты 'disp' и 'title'. 'title' бывает только у комнат и работает как описатель, когда игрок находится внутри данной комнаты. В остальных случаях используется 'disp' (если он есть). Если 'disp' и 'title' не заданы, то считается, что отображение равняется имени. 'disp' и 'title' могут принимать значение false, в таком случае, отображения не будет. ## Объекты _Объекты_ -- это единицы сцены, с которыми взаимодействует игрок. ``` obj { nam = 'стол'; dsc = 'В комнате стоит {стол}.'; act = 'Гм... Просто стол...'; }; ``` Имя объекта ''nam'' используется при попадании его в инвентарь. Хотя, в нашем случае, стол вряд ли туда попадет. Если у объекта определен 'disp', то при попадании в инвентарь для его отображения будет использоваться именно этот атрибут. Например: ``` obj { nam = 'стол'; disp = 'угол стола'; dsc = 'В комнате стоит {стол}.'; tak = 'Я взялся за угол стола'; inv = 'Я держусь за угол стола.'; }; ``` Все-таки стол попал к нам в инвентарь. Вы можете скрывать отображение предмета в инвентаре, если 'disp' атрибут будет равен 'false'. 'dsc' -- описание объекта. Оно будет выведено в динамической части сцены, при наличии объекта в сцене. Фигурными скобками отображается фрагмент текста, который будет являться ссылкой в окне INSTEAD. Если объектов в сцене много, то все описания выводятся одно за другим, через пробел, 'act' -- это обработчик события, который вызывается при действии пользователя (действие на объект сцены, обычно -- клик мышкой по ссылке). Его основная задача -- вывод (возвращение) строки текста, которая станет частью событий сцены, и изменение состояния игрового мира. ## Добавляем объекты в сцену Для того, чтобы поместить в сцену объекты, существует несколько путей. Во-первых, при создании комнаты можно определить список 'obj', состоящий из имен объектов: ``` obj { -- объект с именем, но без переменной nam = 'ящик'; dsc = [[На полу я вижу {ящик}.]]; act = [[Тяжелый!]]; } room { nam = 'main'; disp = 'Большая комната'; dsc = [[Вы в большой комнате.]]; obj = { 'ящик' }; }; ``` Теперь, при отображении сцены мы увидим объект "ящик" в динамической части. Вместо имени объекта, вы можете использовать переменную-ссылку, если только она была определена заранее: ``` apple = obj { -- объект с переменной, но без имени dsc = [[Тут есть {яблоко}.]]; act = [[Красное!!]]; } room { nam = 'main'; disp = 'Большая комната'; dsc = [[Вы в большой комнате.]]; obj = { apple }; }; ``` Альтернативной формой записи является конструкция with: ``` room { nam = 'main'; disp = 'Большая комната'; dsc = [[Вы в большой комнате.]]; }:with { 'ящик', } ``` Конструкция with позволяет избавиться от лишнего уровня вложенности в коде игры. Во-вторых, вы можете объявлять объекты прямо внутри obj или with, описывая их определение: ``` room { nam = 'main'; disp = 'Большая комната'; dsc = [[Вы в большой комнате.]]; }:with { obj { nam = 'ящик'; dsc = [[На полу я вижу {ящик}.]]; act = [[Тяжелый!]]; } }; ``` Это удобно делать для объектов - декораций. Но в таком случае, вы не сможете создавать объекты с переменной-ссылкой. К счастью, для декораций это и не нужно. Если в комнату помещаются несколько объектов, разделяйте их ссылки запятыми, например: obj = { 'ящик', apple }; Вы можете вставлять переводы строк для наглядности, когда объектов много, например, так: ``` obj = { 'tabl', 'apple', 'knife', }; ``` Еще один способ размещения предметов заключается в вызове функций, которые поместят объекты в требуемые комнаты. Он будет рассмотрен в дальнейшем. ## Декорации Объекты, которые могут быть перенесены из одной сцены в другую (или попадать в инвентарь), обычно имеют имя и/или переменную-ссылку. Так как таким образом вы всегда можете найти объект где угодно и работать с ним. Но немалую часть игрового мира составляют объекты, которые занимают конкретную локацию и служат в качестве декораций. Таких объектов может быть очень много, и более того, обычно это однотипные объекты вроде деревьев и тому подобных объектов. Для создания декораций можно использовать различные подходы. ### Один и тот же объект в нескольких комнатах Вы можете создать один объект, например, 'дерево' и помещать их в разные комнаты. ``` obj { nam = 'дерево'; dsc = [[Тут стоит {дерево}.]]; act = [[Все деревья выглядят похожими.]]; } room { nam = 'Лес'; obj = { 'дерево' }; } room { nam = 'Улица'; obj = { 'дерево' }; } ``` ### Использование тегов вместо имен Если вам не нравится придумывать уникальные имена для однотипных декоративных объектов, вы можете использовать для таких объектов теги. Теги задаются атрибутом tag и всегда начинаются с символа '#': ``` obj { tag = '#цветы'; dsc = [[Тут есть {цветы}.]] } ``` В данном примере, имя у объекта будет сформировано автоматически, но обращаться к объекту вы сможете по тегу. При этом объект будет искаться в текущей комнате. Например: ``` dprint(_'#цветы') -- ищем в текущей комнате первый объект с тегом '#цветы' ``` Теги, это в каком то смысле, синоним локальных имен, поэтому существует альтернативная запись создания предмета с тегом: ``` obj { nam = '#цветы'; dsc = [[Тут есть {цветы}.]] } ``` Если имя у объекта начинается с символа '#', то такой объект получает тег и автоматически сгенерированное числовое имя. ### Использование атрибута сцены decor Так как декорации не меняют свое место-положение, есть смысл сделать их частью описания сцены, а не динамической области. Это делается с помощью атрибута сцены 'decor'. decor показывается всегда и его основная функция -- описание декораций сцены. ``` room { nam = 'Дом'; dsc = [[Я у себя дома.]]; decor = [[Тут я вижу много интересных вещей. Например, на {#стена|стене} висит {#картина|картина}.]]; }: with { obj { nam = '#стена'; act = [[Стена как стена!]]; }; obj { nam = '#картина'; act = [[Ван-Гог?]]; } } ``` Здесь мы видим сразу несколько приемов: 1. В decor в виде связанного текста описаны декорации; 2. В качестве ссылок используются конструкции с явным заданием объектов, к которым они относятся {имя объекта|текст}; 3. В качестве имен объектов используются теги, чтобы не думать над их уникальностью; 4. У объектов-декораций в сцене отсутствуют атрибуты dsc, так как их роль играет decor. Конечно, вы можете комбинировать все описанные приемы между собой в любых пропорциях. ## Объекты, связанные с другими объектами Объекты тоже могут содержать в себе атрибут 'obj' (или конструкцию 'with'). При этом, при выводе объектов, INSTEAD будет разворачивать списки последовательно. Такая техника может использоваться для создания объектов-контейнеров или просто для связывания нескольких описаний вместе. Например, поместим на стол яблоко. ``` obj { nam = 'яблоко'; dsc = [[На столе лежит {яблоко}.]]; act = 'Взять что-ли?'; }; obj { nam = 'стол'; dsc = [[В комнате стоит {стол}.]]; act = 'Гм... Просто стол...'; obj = { 'яблоко' }; }; room { nam = 'Дом'; obj = { 'стол' }; } ``` При этом, в описании сцены мы увидим описание объектов 'стол' и 'яблоко', так как 'яблоко' -- связанный со столом объект и движок при выводе объекта 'стол' вслед за его 'dsc' выведет последовательно ''dsc'' всех вложенных в него объектов. Также, следует отметить, что оперируя объектом 'стол' (например, перемещая его из комнаты в комнату) мы автоматически будем перемещать и вложенный в него объект 'яблоко'. Конечно, данный пример мог бы быть написан и по другому, например, так: ``` room { nam = 'Дом'; }:with { obj { nam = 'стол'; dsc = [[В комнате стоит {стол}.]]; act = 'Гм... Просто стол...'; }: with { obj { nam = 'яблоко'; dsc = [[На столе лежит {яблоко}.]]; act = 'Взять что-ли?'; }; } } ``` Выбирайте тот способ, который для вас понятней. ## Атрибуты и обработчики как функции Большинство атрибутов и обработчиков могут быть _функциями_. Так, например: ``` disp = function() p 'яблоко'; end ``` Пример не очень удачен, так как проще было бы написать disp = 'яблоко', но показывает синтаксис записи функции. Основная задача такой функции -- это возврат строки или булевого значения. Сейчас мы рассматриваем возврат строки. Для возврата строки вы можете использовать явную запись в виде: ``` return "яблоко"; ``` При этом ход выполнения кода функции прекращается и она возвращает движку строку. В данном случае "яблоко". Более привычным способом вывода являются функции: - p ("текст") -- вывод текста и пробела; - pn ("текст") -- вывод текста с переводом строки; - pr ("текст") -- вывод текста "как есть". > Если ''p''/''pn''/''pr'' вызывается с одним текстовым параметром, то скобки можно опускать. pn "Нет скобкам!" Все эти функции дописывают текст в буфер и при возврате из функции возвращают его движку. Таким образом, вы можете постепенно формировать вывод за счет последовательного выполнения p/pn/pr. Имейте в виду, что автору крайне редко необходимо явно форматировать текст, особенно, если это описание объектов, движок сам расставляет необходимые переводы строк и пробелы для разделения информации разного рода и делает это унифицированным способом. Вы можете использовать '..' или ',' для склейки строк. Тогда '(' и ')' обязательны. Например: ``` pn ("Строка 1".." Строка 2"); pn ("Строка 1", "Строка 2"); ``` > Основное отличие атрибутов от обработчиков событий состоит в том, > что обработчики событий могут менять состояние игрового мира, а > атрибуты нет. Поэтому, если вы оформляете атрибут (например, 'dsc') > в виде функции, помните, что задача атрибута это возврат значения, а > не изменение состояния игры! Дело в том, что движок обращается к > атрибутам в те моменты времени, которые обычно четко не определены, > и не связаны явно с какими-то игровыми процессами! __Важно!__ > Еще одной особенностью обработчиков является тот факт, что вы не > должны ждать каких то событий внутри обработчика. То есть, не должно > быть каких-то циклов ожидания, или организации задержек (пауз). Дело > в том, что задача обработчика -- изменить игровое состояние и отдать > управление INSTEAD, который визуализирует эти изменения и снова > перейдет в ожидание действий пользователя. Если вам требуется > организовать задержки вывода, вам придется воспользоваться модулем > "timer". Функции практически всегда содержат условия и работу с переменными. Например: ``` obj { nam = 'яблоко'; seen = false; dsc = function(s) if not s.seen then p 'На столе {что-то} лежит.'; else p 'На столе лежит {яблоко}.'; end end; act = function(s) if s.seen then p 'Это яблоко!'; else s.seen = true; p 'Гм... Это же яблоко!'; end end; }; ``` Если атрибут или обработчик оформлен как функция, то всегда _первый аргумент_ функции (s) -- сам объект. То-есть, в данном примере, 's' это синоним _'яблоко'. Когда вы работаете с самим объектом в функции, удобнее использовать параметр, а не явное обращение к объекту по имени, так как при переименовании объекта вам не придется переписывать вашу игру. Да и запись будет короче. В данном примере при показе сцены в динамической части сцены будет выведен текст: 'На столе что-то лежит'. При взаимодействии с 'что-то', переменная 'seen' объекта 'яблоко' будет установлена в true -- истина, и мы увидим, что это было яблоко. Как видим, синтаксис оператора 'if' довольно очевиден. Для наглядности, несколько примеров. if <выражение> then <действия> end if have 'яблоко' then p 'У меня есть яблоко!' end if <выражение> then <действия> else <действия иначе> end if have 'яблоко' then p 'У меня есть яблоко!' else p 'У меня нет яблока!' end if <выражение> then <действия> elseif <выражение 2> then <действия 2> else <иначе> end -- и т.д. if have 'яблоко' then p 'У меня есть яблоко!' elseif have 'вилка' then p 'У меня нет яблока, но есть вилка!' else p 'У меня нет ни яблока, ни вилки!' end Выражение в операторе if может содержать логическое "и" (and), "или" (or), "отрицание" (not) и скобки ( ) для задания приоритетов. Запись вида if <переменная> then означает, что переменная не равна false. Равенство описывается как '==', неравенство '~='. ``` if not have 'яблоко' and not have 'вилка' then p 'У меня нет ни яблока, ни вилки!' end ... if w ~= apple then p 'Это не яблоко.'; end ... if time() == 10 then p '10 й ход настал!' end ``` __Важно!__ В ситуации когда переменная не была определена, но используется в условии, INSTEAD даст ошибку. Вам придется заранее определять переменные, которые вы используете. ### Переменные объекта Запись 's.seen' означает, что переменная 'seen' размещена в объекте 's' (то есть 'яблоко'). Помните, мы назвали первый параметр функции 's' (от self), а первый параметр -- это сам текущий объект. Переменные объекта должны быть определены заранее, если вы собираетесь их модифицировать. Примерно так, как мы поступили с seen. Но переменных может быть много. ``` obj { nam = 'яблоко'; seen = false; eaten = false; color = 'красный'; weight = 10; ... }; ``` Все переменные объекта, при их изменении, попадают в файл сохранения игры. Если вы не хотите, чтобы переменная попала в файл сохранения, вы можете объявить такие переменные в специальном блоке: ``` obj { nam = 'яблоко'; { t = 1; -- эта переменная не попадет в сохранения x = false; -- и эта тоже } }; ``` Обычно, вам не стоит так делать. Однако есть ситуация, при которой этот прием будет полезным. Дело в том, что массивы и таблицы объекта всегда сохраняются. Если вы используете массивы для хранения неизменяемых значений, вы можете написать так: ``` obj { nam = 'яблоко'; { text = { "раз", "два", "три" }; -- никогда не попадет в файл сохранения } ... }; ``` Вы можете обращаться к переменным объекта через s -- если это сам объект. или по переменной - ссылке, например: ``` apple = obj { color = 'красный'; } ... -- где-то в другом месте apple.color = 'зеленый' ``` Или по имени: ``` obj { nam = 'яблоко'; color = 'красный'; } ... -- где-то в другом месте _'яблоко'.color = 'зеленый' ``` На самом деле, вы можете создавать переменные-объекта на лету (без предварительного их определения), хотя обычно в этом нет смысла. Например: ``` apple 'xxx' (10) -- создали переменную xxx у объекта apple по ссылке (_'яблоко') 'xxx' (10) -- то же самое, но по имени объекта ``` ### Локальные переменные Кроме переменных объекта вы можете использовать локальные и глобальные переменные. Локальные переменные создаются с помощью служебного слова local: ``` act = function(s) local w = _'лампочка' w.light = true p [[Я нажал на кнопку и лампочка загорелась.]] end ``` В данном примере, переменная w существует только в теле функции-обработчика act. Мы создали временную ссылку-переменную w, которая ссылается на объект 'лампочка', чтобы изменить свойство-переменную light у этого объекта. Конечно, мы могли написать и: _'лампочка'.light = true Но представьте себе, если нам нужно произвести несколько действий с объектом, в таких случаях проще воспользоваться временной переменной. Локальные переменные никогда не попадают в файл-сохранение и играют роль временных вспомогательных переменных. Локальные переменные можно создавать и вне функций, тогда данная переменная видима только в пределах данного lua файла и не попадает в файл сохранения. Еще один пример использования локальных переменных: ``` obj { nam = 'котенок'; state = 1; act = function(s) s.state = s.state + 1 if s.state > 3 then s.state = 1 end p [[Муррр!]] end; dsc = function(s) local dsc = { "{Котенок} мурлычет.", "{Котенок} играет.", "{Котенок} облизывается.", }; p(dsc[s.state]) end; end ``` Как видим, в функции dsc мы определили массив dsc. 'local' указывает на то, что он действует в пределах функции dsc. Конечно, данный пример можно было написать и так: ``` dsc = function(s) if s.state == 1 then p "{Котенок} мурлычет." elseif s.state == 2 then p "{Котенок} играет." else p "{Котенок} облизывается.", end end ``` ### Глобальные переменные Вы также можете создать глобальную переменную: ``` global { -- определение глобальных переменных global_var = 1; -- число some_number = 1.2; -- число some_string = 'строка'; know_truth = false; -- булево значение array = {1, 2, 3, 4}; -- массив } ``` Еще одна форма записи, удобная для одиночных определений: ``` global 'global_var' (1) ``` Глобальные переменные всегда попадают в файл-сохранение. Кроме глобальных переменных вы можете задавать константы. Синтаксис аналогичен глобальным переменным: ``` const { A = 1; B = 2; } const 'Aflag' (false) ``` Движок будет контролировать неизменность констант. Константы не попадают в файл-сохранение. Иногда вам нужно работать с переменной, которая не определена как local (и видима во всех ваших lua файлах игры), но не должна попадать в файл сохранения. Для таких переменных вы можете использовать декларации: ``` declare { A = 1; B = 2; } declare 'Z' (false) ``` Декларации не попадают в файл сохранения. Одно из важных свойств деклараций состоит в том, что вы можете декларировать функции, например: ``` declare 'test' (function() p "Hello world!" end) global 'f' (test) ``` В таком случае, вы можете присваивать значение функции 'test' другим переменным и состояние этих переменных может быть сохранено в файле сохранения. То-есть, декларированную функцию можно использовать как значение переменной! Вы можете декларировать ранее определенные функции, например: ``` declare 'dprint' (dprint) ``` Тем самым делая такие недекларированные функции -- декларированными. Декларация функции, по сути, это присвоение функции имени, благодаря чему мы можем сохранить эту функцию как ссылку. ### Вспомогательные функции Вы можете писать свои вспомогательные функции и использовать их из своей игры, например: ``` function mprint(n, ...) local a = {...}; -- временный массив с аргументами к функции p(a[n]) -- выведем n-й элемент массива end ... dsc = function(s) mprint(s.state, { "{Котенок} мурлычет.", "{Котенок} играет.", "{Котенок} облизывается." }); end; ``` Пока не обращайте внимания на данный пример, если он кажется вам сложным. ### Возвращаемые значения обработчиков Если необходимо показать, что действие не выполнено (обработчик не сделал ничего полезного), возвращайте значение false. Например: ``` act = function(s) if broken_leg then return false end p [[Я ударил ногой по мячу.]] end ``` При этом будет отображено описание по умолчанию, заданное с помощью обработчика 'game.act'. Обычно описание по умолчанию содержит описание невыполнимых действий. Что-то вроде: game.act = 'Гм... Не получается...'; Итак, если вы не задали обработчик act или вернули из него false -- считается, что реакции нет и движок выполнит аналогичный обработчик у объекта 'game'. Обычно, нет никакого смысла возвращать false из act, но существуют другие обработчики, о которых будет рассказано дальше, для которых описанное поведение точно такое же. На самом деле, кроме 'game.act' и 'act' -- атрибута объекта существует обработчик 'onact' у объекта game, который может прервать выполнение обработчика 'act'. Перед тем как вызвать обработчик 'act' у объекта, вызывается onact у game. Если обработчик вернет false, выполнение 'act' обрывается. 'onact' удобно использовать, для контроля событий в комнате или игре, например: ``` -- вызываем onact комнат, если они есть -- для действий на любой объект game.onact = function(s, ...) local r, v = std.call(here(), 'onact', ...) if v == false then -- если false, обрубаем цепочку return r, v end return end room { nam = 'shop'; disp = 'Магазин'; onact = function(s, w) p [[В магазине нельзя воровать!]] p ([[Даже, если это всего-лишь ]], w, '.') return false end; obj = { 'мороженное', 'хлеб' }; } ``` В данном примере, при попытке "потрогать" любой предмет, будет выведено сообщение о запрете данного действия. Все, что описано выше на примере 'act' действует и для других обработчиков: tak, inv, use, а также при переходах, о чем будет рассказано далее. > Иногда возникает необходимость вызвать функцию - обработчик вручную. > Для этого используется синтаксис вызова метода > объекта. 'Объект:метод(параметры)'. Например: apple:act() -- вызовем обработчик 'act' у объекта 'apple' (если он определен как функция!). _'яблоко':act() -- то же самое, но по имени, а не по переменной-ссылке Такой метод работает только в том случае, если вызываемый метод оформлен как функция. Вы можете воспользоваться 'std.call()' для вызова обработчика тем способом, каким это делает сам INSTEAD. (Будет описано в дальнейшем). ## Инвентарь Простейший вариант сделать объект, который можно брать -- определить обработчик 'tak'. Например: ``` obj { nam = 'яблоко'; dsc = 'На столе лежит {яблоко}.'; inv = function(s) p 'Я съел яблоко.' remove(s); -- удалить яблоко из инвентаря end; tak = 'Вы взяли яблоко.'; }; ``` При этом, при действии игрока на объект "яблоко" (щелчок мыши на ссылку в сцене) -- яблоко будет убрано из сцены и добавлено в инвентарь. При действии игрока на инвентарь (двойной щелчок мыши на названии объекта) -- вызывается обработчик 'inv'. В нашем примере, при действии игроком на яблоко в инвентаре -- яблоко будет съедено. Конечно, мы могли бы реализовать код взятия объекта в ''act'', например, так: ``` obj { nam = 'яблоко'; dsc = 'На столе лежит {яблоко}.'; inv = function(s) p 'Я съел яблоко.' remove(s); -- удалить яблоко из инвентаря end; act = function(s) take(s) p 'Вы взяли яблоко.'; end }; ``` Если у объекта в инвентаре не объявлен обработчик 'inv', будет вызван 'game.inv'. Если обработчик 'tak' вернет false, то предмет не будет взят, например: ``` obj { nam = 'яблоко'; dsc = 'На столе лежит {яблоко}.'; tak = function(s) p "Оно же червивое!" return false end; }; ``` ## Переходы между сценами Традиционные переходы в INSTEAD выглядят как ссылки над описанием сцены. Для определения таких переходов между сценами используется атрибут сцены -- список 'way'. В списке определяются комнаты, в виде имен комнат или переменных-ссылок, аналогично списку 'obj'. Например: ``` room { nam = 'room2'; disp = 'Зал'; dsc = 'Вы в огромном зале.'; way = { 'main' }; }; room { nam = 'main'; disp = 'Главная комната'; dsc = 'Вы в большой комнате.'; way = { 'room2' }; }; ``` При этом, вы сможете переходить между сценами 'main' и 'room2'. Как вы помните, 'disp' может быть функцией, и вы можете генерировать имена переходов на лету. Или использовать title, для разделения имени сцены как заголовка и как имени перехода: ``` room { nam = 'room2'; disp = 'В зал'; title = 'В зале'; dsc = 'Вы в огромном зале.'; way = { 'main' }; }; room { nam = 'main'; title = 'В главной комнате'; disp = 'В главную комнату'; dsc = 'Вы в большой комнате.'; way = { 'room2' }; }; ``` При переходе между сценами движок вызывает обработчик 'onexit' из текущей сцены и 'onenter' в той сцене, куда идет игрок. Например: ``` room { onenter = 'Вы заходите в зал.'; nam = 'Зал'; dsc = 'Вы в огромном зале.'; way = { 'main' }; onexit = 'Вы выходите из зала.'; }; ``` Конечно, как и все обработчики, 'onexit' и 'onenter' могут быть функциями. Тогда первый параметр это (как всегда) сам объект - комната, а второй -- это комната куда игрок собирается идти (для 'onexit') или из которой собирается уйти (для 'onenter'). Например: ``` room { onenter = function(s, f) if f^'main' then p 'Вы идете из комнаты main.'; end end; nam = 'Зал'; dsc = 'Вы в огромном зале.'; way = { 'main' }; onexit = function(s, t) if t^'main' then p 'Я не хочу назад!' return false end end; }; ``` Запись вида: if f^'main' then Это сопоставление объекта с именем. Это альтернатива записям: if f == _'main' then Или: if f.nam == 'main' then Или: if std.nameof(f) == 'main' then Как видим на примере onexit, эти обработчики, кроме строки могут возвращать булевое значение статуса. Аналогично обработчику onact, мы может отменить переход, вернув false из onexit/onenter. Вы можете сделать возврат статуса и другим способом, если это кажется вам удобным: ``` return "Я не хочу назад", false ``` Если же вы используете функции 'p'/'pn'/'pr', то просто возвращайте статус операции с помощью завершающего 'return', как показано в примере выше. __Важно!__ > Следует отметить, что при вызове обработчика 'onenter' указатель на > текущую сцену (here()) **еще не изменен**!!! В INSTEAD есть > обработчики 'exit' (уход из комнаты) и 'enter' (заход в комнату), > которые вызываются уже _после_ того, как переход произошел. Эти > обработчики рекомендованы к использованию всегда, когда нет > необходимости запрещать переход. Иногда есть необходимость, чтобы название перехода отличалось от названия комнаты, в которую ведет этот переход. Существует несколько способов сделать это. Например, с помощью 'path'. ``` room { nam = 'room2'; title = 'Зал'; dsc = 'Вы в огромном зале.'; way = { path { 'В главную комнату', 'main'} }; }; room { nam = 'main'; title = 'Главная комната'; dsc = 'Вы в большой комнате.'; way = { path {'В зал', 'room2'} }; }; ``` На самом деле, 'path' создает комнату с атрибутом 'disp', который равен первому параметру, и специальной функцией 'onenter', которая перенаправляет игрока в комнату заданную вторым параметром 'path'. Если вы укажете три параметра: way = { path {'#взал', 'В зал', 'room2'} }; То первый параметр станет именем (или тегом, как в приведенном примере) такой комнаты. Альтернативная форма записи с явным заданием атрибута nam: way = { path { nam = '#взал', 'В зал', 'room2'} }; Вы можете менять название перехода, после того, как переход происходил хотя бы раз, и вы узнали, что же это за комната: way = { path {'#вдверь', 'В дверь', after = 'В гостиную', 'room2'} }; Все параметры, кроме имени перехода, могут быть функциями. Таким образом, 'path' позволяет именовать переходы удобным способом. Иногда вам может потребоваться включать и выключать переходы. На самом деле это требуется не часто. Идея переходов состоит в том, что переход виден даже тогда, когда он невозможен. Например, представим себе сцену перед домом у входной двери. Войти в дом нельзя, так как дверь закрыта. Нет особого смысла прятать переход "дверь". Просто в функции 'onenter' сцены внутри дома мы проверяем, а есть ли у героя ключ? И если ключа нет, говорим о том, что дверь закрыта и запрещаем переход. Это повышает интерактивность и упрощает код. Если же вы хотите сделать дверь объектом сцены, поместите ее в комнату, но в 'act' обработчике сделайте осмотр двери, или дайте возможность игроку открыть ее ключом (как это сделать - мы рассмотрим позже), но сам переход дайте сделать игроку привычным способом через строку переходов. Тем не менее, бывают ситуации, когда переход не очевиден и он появляется в результате каких-то событий. Например, мы осмотрели часы и увидели там секретный лаз. ``` obj { nam = 'часы'; dsc = [[Тут есть старинные {часы}.]]; act = function(s) enable '#часы' p [[Вы видите, что в часах есть потайной ход!]]; end; } room { nam = 'Зал'; dsc = 'Вы в огромном зале.'; obj = { 'часы' }; way = { path { '#часы', 'В часы', 'inclock' }:disable() }; }; ``` В данном примере, мы создали _отключенный_ переход, за счет вызова метода 'disable' у комнаты созданной с помощью 'path'. Метод 'disable' есть у всех объектов (не только комнат), он переводит объект в отключенное состояние, которое означает, что объект перестает быть доступным игроку. Замечательным свойством отключенного объекта является то, что его можно _включить_ с помощью 'enable()'; Далее, когда игрок нажимает на ссылку, описывающую часы, вызывается обработчик 'act', который с помощью функции 'enable()' делает переход видимым. Альтернативный вариант заключается не в выключении, а 'закрытии' объекта: ``` obj { nam = 'часы'; dsc = [[Тут есть старинные {часы}.]]; act = function(s) open '#часы' p [[Вы видите, что в часах есть потайной ход!]]; end; } room { nam = 'Зал'; dsc = 'Вы в огромном зале.'; obj = { 'часы' }; way = { path { '#часы', 'В часы', 'inclock' }:close() }; }; ``` В чем разница? Выключение объекта означает то, что объект перестает быть доступным для игрока. Если в объекте вложены другие объекты, то и эти объекты становятся недоступными. Закрытие объекта делает недоступным содержимое данного объекта, но не сам объект. Однако, в случае комнат, и закрытие комнаты и отключенные комнаты приводят к одному результату -- переход на них становится недоступным. Еще один вариант: ``` room { nam = 'inclock'; dsc = [[Я в часах.]]; }:close() obj { nam = 'часы'; dsc = [[Тут есть старинные {часы}.]]; act = function(s) open 'inclock' p [[Вы видите, что в часах есть потайной ход!]]; end; } room { nam = 'Зал'; dsc = 'Вы в огромном зале.'; obj = { 'часы' }; way = { path { 'В часы', 'inclock' } }; }; ``` Здесь мы закрываем и открываем не переход, а комнату, в которую ведет переход. path не показывает себя, если комната в которую он ведет отключена или закрыта. ## Действие объектов друг на друга Игрок может действовать объектом инвентаря на другие объекты. Для этого он щелкает мышью на предмет инвентаря, а затем, на предмет сцены. При этом вызывается обработчик 'used' у объекта, на который действуют, и обработчик 'use' объекта, которым действуют. Например: ``` obj { nam = 'нож'; dsc = 'На столе лежит {нож}'; inv = 'Острый!'; tak = 'Я взял нож!'; use = 'Вы пытаетесь использовать нож.'; }; obj { nam = 'стол'; dsc = 'В комнате стоит {стол}.'; act = 'Гм... Просто стол...'; obj = { 'нож' }; used = function(s) p 'Вы пытаетесь сделать что-то со столом...'; return false end; }; ``` В данном примере, обработчик used возвращает false. Зачем? Если вы помните, возврат false означает, что обработчик сообщает движку о том, что событие он не обработал. Если бы мы не вернули бы false, очередь до обработчика 'use' объекта 'нож' просто бы не дошла. На самом деле, в реальности обычно вы будете пользоваться или use или used, вряд ли имеет смысл выполнять оба обработчика во время действия предмета на предмет. Еще один пример, когда удобно вернуть false: ``` use = function(s, w) if w^'яблоко' then p [[Я почистил яблоко.]] w.cut = true return end return false; end ``` В данном случае use у яблока обрабатывает только одну ситуацию -- действие на яблоко. В остальных случаях, обработчик возвращает false и движок вызовет метод по-умолчанию: game.use. Но лучше, если вы пропишете действие по-умолчанию для ножа: ``` use = function(s, w) if w^'яблоко' then p [[Я почистил яблоко.]] w.cut = true return end p [[Не стоит размахивать ножом!]] end ``` Этот пример также демонстрирует тот факт, что вторым параметром у use является предмет на который мы действуем. У метода 'used', соответственно, второй параметр -- это объект, который действует на нас: ``` obj { nam = 'мусорка'; dsc = [[В углу стоит {мусорка}.]]; used = function(s, w) if w^'яблоко' then p [[Я выбросил яблоко в мусорку.]] remove(w) return end return false; end } ``` Как вы помните, перед вызовом use вызывается обработчик onuse у объекта game, потом у объекта 'игрок', а потом у текущей комнаты. Вы можете блокировать 'use', вернув из любого из перечисленных методов 'onuse' -- false. Использовать 'use' или 'used' (или оба) это вопрос личных предпочтений, однако, метод used вызывается раньше и, следовательно, имеет больший приоритет. ## Объект "Игрок" Игрок в мире INSTEAD представлен объектом типа 'player'. Вы можете создавать несколько игроков, но один игрок присутствует по-умолчанию. Имя этого объекта -- 'player'. Существует переменная-ссылка pl, которая указывает на этот объект. Обычно, вам не нужно работать с этим объектом напрямую. Но иногда это может быть необходимым. По умолчанию, атрибут 'obj' у игрока представляет собой инвентарь. Обычно, нет смысла переопределять объект типа player, однако, вы можете это сделать: ``` game.player = player { nam = "Василий"; room = 'кухня'; -- стартовая комната игрока power = 100; obj = { 'яблоко' }; -- заодно добавим яблоко в инвентарь }; ``` В INSTEAD есть возможность создавать нескольких игроков и переключаться между ними. Для этого служит функция 'change_pl()'. В качестве параметра передайте функции требуемый объект типа 'player' (или его имя). Функция переключит текущего игрока, и при необходимости, осуществит переход в комнату, где находится новый игрок. Функция 'me()' всегда возвращает текущего игрока. Следовательно, в большинстве игр me() == pl. ## Объект "Мир" Игровой мир представлен объектом типа world. Имя такого объекта 'game'. Существует ссылка-переменная, которая также называется game. Обычно вы не работаете с этим объектом напрямую, однако иногда вы можете вызывать его методы, или менять значения переменных этого объекта. Например, переменная game.codepage содержит кодировку исходного кода игры, и по-умолчанию равна "UTF-8". Я не рекомендую использовать другие кодировки, но иногда, выбор кодировки может стать необходимостью. Переменная game.player -- содержит текущего игрока. Кроме того, как вы уже знаете, объект 'game' может содержать обработчики по умолчанию: 'act', 'inv', 'use', 'tak', которые будут вызваны, если в результате действий пользователя не будут найдены никакие другие обработчики (или все они вернули false). Например, вы можете написать в начале игры: ``` game.act = 'Не получается.'; game.inv = 'Гм.. Странная штука..'; game.use = 'Не сработает...'; game.tak = 'Не нужно мне это...'; ``` Конечно, все они могут быть функциями. Также, объект game может содержать обработчики: onact, ontak, onuse, oninv, onwalk -- которые могут прерывать действия, в случае возврата false. Еще, у объекта game можно задать обработчики: afteract, afterinv, afteruse, afterwalk -- которые вызываются в случае успешного выполнения соответствующего действия. ## Атрибуты-списки Атрибуты-списки (такие как 'way' или 'obj') позволяют работать со своим содержимым с помощью набора методов. Атрибуты-списки призваны сохранять в себе списки объектов. На самом деле, вы можете создавать списки для собственных нужд, и размещать их в объектах, например: ``` room { nam = 'холодильник'; frost = std.list { 'мороженное' }; } ``` Хотя, обычно, это не требуется. Ниже перечислены методы объектов типа 'список'. Вы можете вызывать их для любых списков, хотя обычно это будут way и obj, например: ways():disable() -- отключить все переходы - disable() - отключает все объекты списка; - enable() - включает все объекты списка; - close() - закрыть все объекты списка; - open() - открыть все объекты списка; - add(объект|имя, [позиция]) - добавить объект; - for_each(функция, аргументы) - вызвать для каждого объекта функцию с аргументами; - lookup(имя/тег или объект) - поиск объекта в списке. Возвращает объект и индекс; - srch(имя/тег или объект) - поиск видимого объекта в списке; - empty() - вернет true, если список пуст; - zap() - очистить список; - replace(что, на что) - заменить объект в списке; - cat(список, [позиция]) - добавить содержимое списка в текущий список по позиции; - del(имя/объект) - удалить объект из списка. Существуют функции, возвращающие объекты-списки: - inv([игрок]) - вернуть инвентарь игрока; - objs([комната]) - вернуть объекты комнаты; - ways([комната]) - вернуть переходы комнаты. Конечно, вы можете обращаться к спискам и напрямую: ``` pl.obj:add 'нож' ``` Объекты в списках хранятся в том порядке, в котором вы их добавите. Однако, если у объекта присутствует числовой атрибут pri, то он играет роль _приоритета_ в списке. Если pri не задан, значением приоритета считается 0. Таким образом, если вы хотите, чтобы какой-то объект был первым в списке, давайте ему приоритет pri < 0. Если в конце списка -- > 0. ``` obj { pri = -100; nam = 'штука'; disp = 'Очень важный предмет инвентаря'; inv = [[Осторожней с этим предметом.]]; } ``` ## Функции, которые возвращают объекты В INSTEAD определены некоторые функции, которые возвращают различные объекты. При описании функции используются следующие соглашения о параметрах. - в символах [ ] описаны необязательные параметры; - 'что' или 'где' - означает объект (в том числе комнату), заданный тегом, именем или переменной-ссылкой; Итак, основные функции: - '_(что)' - получить объект; - 'me()' возвращает текущего объекта-игрока; - 'here()' возвращает текущую сцену; - 'where(что)' возвращает комнату или объект в котором находится заданный объект, если объект находится в нескольких местах, то можно передать второй параметр -- таблицу Lua, в которую будут добавлены эти объекты; - 'inroom(что)' аналогично where(), но вернет комнату, в которой расположен объект (это важно для объектов в объектах); - 'from([где])' возвращает прошлую комнату, из которой игрок перешел в заданную комнату. Необязательный параметр -- получить прошлую комнату не для текущей комнаты, а для заданной; - 'seen(что, [где])' возвращает объект или переход, если он присутствует и видим, есть второй необязательный параметр -- выбрать сцену или объект/список в котором искать; - 'lookup(что, [где])' возвращает объект или переход, если он существует в сцене или объекте/списке; - 'inspect(что)' возвращает объект, если он виден/доступен на сцене. Поиск производится по переходам и объектам, в том числе, в объектах игрока; - 'have(что)' возвращает объект, если он есть в инвентаре и не отключен; - 'live(что)' возвращает объект, если он присутствует среди живых объектов (описано далее); Эти функции в основном используются в условиях, либо для поиска объекта с последующей модификацией. Например, вы можете использовать 'seen' для написания условия: ``` onexit = function(s) if seen 'монстр' then -- если у функции 1 параметр, --- скобки писать не обязательно p 'Монстр загораживает проход!' return false end end ``` А также, для нахождения объекта в сцене: ``` use = function(s, w) if w^'окно' then local ww = lookup 'собака' if not ww then p [[А где моя собака?]] return end place(ww, 'улица') p 'Я разбил окно! Моя собака выпрыгнула на улицу.' return end return false end ``` Пример с функцией 'have': ``` ... act = function(s) if have 'нож' then p 'Но у меня же есть нож!'; return end take 'нож' end ... ``` > Может возникнуть вопрос, в чем разница между функциями lookup и _ ()? > Дело в том, что lookup() ищет объект, и в случае, если объект не найден > -- просто ничего не вернет. А запись _ () предполагает, что вы точно > знаете, что за предмет вы получаете. Другими словами, _ () это > безусловное получение объекта по имени. Эта функция в общем случае не > занимается _поиском_. Только если в качестве параметра задан тег, > будет осуществлен поиск среди доступных объектов. Если вы используете > _ () на несуществующий объект или недоступный тег -- вы получите ошибку! ## Другие функции стандартной библиотеки В INSTEAD в модуле stdlib, который всегда подключается автоматически, определены функции, которые предлагаются автору как основной рабочий инструмент по работе с миром игры. Рассмотрим их в этой главе. При описании функции в большинстве функций под параметром 'w' понимается объект или комната, заданная именем, тегом или по переменной-ссылке. [ wh ] - означает необязательный параметр. - include(файл) - включить файл в игру; include "lib" -- включит файл lib.lua из текущего каталога с игрой; - loadmod(модуль) - подключить модуль игры; loadmod "module" -- включит модуль module.lua из текущего каталога; - rnd(m) - случайное целочисленное значение от '1' до 'm'; - rnd(a, b) - случайное целочисленное значение от 'a' до 'b', где 'a' и 'b' целые >= 0; - rnd\_seed(что) - задать зерно генератора случайных чисел; - p(...) - вывод строки в буфер обработчика/атрибута (с пробелом в конце); - pr(...) - вывод строки в буфер обработчика/атрибута "как есть"; - pn(...) - вывод строки в буфер обработчика/атрибута (с переводом строки в конце); - pf(fmt, ...) - вывод форматной строки в буфер обработчика/атрибута; local text = 'hello'; pf("Строка: %q Число: %d\n", text, 10); - pfn(...)(...)... "строка" - формирование простого обработчика; Данная функция упрощает создание простых обработчиков: act = pfn(walk, 'ванная') "Я решил зайти в ванную."; act = pfn(enable, '#переход') "Я заметил отверстие в стене!"; - obj {} - создание объекта; - stat {} - создание статуса; - room {} - создание комнаты; - menu {} - создание меню; - dlg {} - создание диалога; - me() - возвращает текущего игрока; - here() - возвращает текущую сцену; - from([w]) - возвращает комнату из которой осуществлен переход в текущую сцену; - new(конструктор, аргументы) - создание нового _динамического_ объекта (будет описано далее); - delete(w) - удаление динамического объекта; - gamefile(файл, [сбросить состояние?]) - подгрузить динамически файл с игрой; gamefile("part2.lua", true) -- сбросить состояние игры (удалить объекты и переменные), подгрузить part2.lua и начать с main комнаты. - player {} - создать игрока; - dprint(...) - отладочный вывод; - visits([w]) - число визитов в данную комнату (или 0, если визитов не было); - visited([w]) - число визитов в комнату или false, если визитов не было; if not visited() then p [[Я тут первый раз.]] end - walk(w, [булевое exit], [булевое enter], [булевое менять from]) - переход в сцену; walk('конец', false, false) -- безусловный переход (игнорировать onexit/onenter/exit/enter); - walkin(w) - переход в под-сцену (без вызова exit/onexit текущей комнаты); - walkout([w], [dofrom]) - возврат из под-сцены (без вызова enter/onenter); - walkback([w]) - синоним walkout([w], false); - \_(w) - получение объекта; - for_all(fn, ....) - выполнить функцию для всех аргументов; for_all(enable, 'окно', 'дверь'); - seen(w, [где]) - поиск видимого объекта; - lookup(w, [где]) - поиск объекта; - ways([где]) - получить список переходов; - objs([где]) - получить список объектов; - search(w) - поиск доступного игроку объекта; - have(w) - поиск предмета в инвентаре; - inroom(w) - возврат комнаты/комнат, в которой находится объект; - where(w, [таблица]) - возврат объекта/объектов, в котором находится объект; local list = {} local w = where('яблоко', list) -- если яблоко находится в более, чем одном месте, то -- list будет содержать массив этих мест. -- Если вам достаточно одного местоположения, то: where 'яблоко' -- будет достаточно - closed(w) - true если объект закрыт; - disabled(w) - true если объект выключен; - enable(w) - включить объект; - disable(w) - выключить объект; - open(w) - открыть объект; - close(w) - закрыть объект; - actions(w, строка, [значение]) - возвращает (или устанавливает) число действий типа t для объекта w. if actions(w, 'tak') > 0 then -- предмет w был взят хотя бы 1 раз; if actions(w) == 1 then -- act у предмета w был вызван 1 раз; - pop(тег) - возврат в прошлую ветвь диалога; - push(тег) - переход в следующую ветвь диалога - empty([w]) - пуста ли ветвь диалога? (или объект) - lifeon(w) - добавить объект в список живых; - lifeoff(w) - убрать объект из списка живых; - live(w) - объект жив?; - change\_pl(w) - смена игрока; - player\_moved([pl]) - текущий игрок перемещался в этом такте?; - inv([pl]) - получить список-инвентарь; - remove(w, [wh]) - удалить объект из объекта или комнаты; Удаляет объект из списков obj и way (оставляя во всех остальных, например, game.lifes); - purge(w) - уничтожить объект (из всех списков); Удаляет объект из _всех_ списков, в которых он присутствует; - replace(w, ww, [wh]) - заменить один объект на другой; - place(w, [wh]) - поместить объект в объект/комнату (удалив его из старого объекта/комнаты); - put(w, [wh]) - поместить объект без удаления из старого местоположения; - take(w) - забрать объект; - drop(w, [wh]) - выбросить объект; - path {} - создать переход; - time() - число ходов от начала игры. __Важно!__ На самом деле, многие из этих функций также умеют работать не только с комнатами и объектами, но и со списками. То есть 'remove(apple, inv())' сработает также как и 'remove(apple, me())''; Впрочем, remove(apple) тоже сработает и удалит объект из тех мест, где он присутствует. Рассмотрим несколько примеров. ``` act = function() pn "Я иду в следующую комнату..." walk (nextroom); end obj { nam = 'моя машина'; dsc = 'Перед хижиной стоит мой старенький {пикап} Toyota.'; act = function(s) walk 'inmycar'; end }; ``` __Важно!__ > После вызова 'walk' выполнение обработчика продолжится до его > завершения. Поэтому обычно, после 'walk' всегда следует > 'return', если только это не последняя строка функции, хотя и в > этом случае безопасно поставить 'return'. ``` act = function() pn "Я иду в следующую комнату..." walk (nextroom); return end ``` Не забывайте также, что при вызове 'walk' вызовутся обработчики 'onexit/onenter/exit/enter'' и если они запрещают переход, то он не произойдет. ## Диалоги Диалоги -- это сцены специального типа 'dlg', содержащие объекты -- фразы. При входе в диалог игрок видит перечень фраз, которые может выбирать, получая какую-то реакцию игры. По умолчанию, уже выбранные фразы скрываются. При исчерпании всех вариантов, диалог завершается выходом в предыдущую комнату (конечно, если в диалоге нет постоянно видимых фраз, среди которых обычно встречается что-то типа 'Завершить разговор' или 'Спросить еще раз'). При повторном входе в диалог, все скрытые фразы снова становятся видимыми и диалог сбрасывается в начальное состояние (если, конечно, автор игры специально не прикладывал усилия по изменению вида диалога). Переход в диалог в игре осуществляется как переход на сцену: ``` obj { nam = 'повар'; dsc = 'Я вижу {повара}.'; act = function() walk 'povardlg' end, }; ``` Хотя я рекомендую использовать 'walkin', так как в случае 'walkin' не вызываются 'onexit/exit' текущей комнаты, а персонаж, с которым мы можем поговорить, обычно находиться в этой же комнате, где и главный герой. То есть: ``` obj { nam = 'повар'; dsc = 'Я вижу {повара}.'; act = function() walkin 'povardlg' end, }; ``` Если вам не нравится префикс у фраз в виде дефиса, вы можете определить строковую переменную: ``` std.phrase_prefix = '+'; ``` И получить префикс в виде '+' перед каждой фразой. Вы также можете сделать префикс функцией. На вход функции в таком случае будет поступать в виде параметра номер фразы. Задача функции -- вернуть строковый префикс. Обратите внимание, что 'std.phrase_prefix' не сохраняется, если вам нужно переопределять ее на лету, вам придется восстанавливать ее состояние в 'start()' функции вручную! __Важно!__ > Я рекомендую использовать модуль 'noinv' и задавать свойство 'noinv' > в диалогах. Диалоги будут выглядеть красивей и вы обезопасите свою > игру от ошибок и непредсказуемых реакций при использовании инвентаря > внутри диалога (так как обычно автор не подразумевает такие > вещи). Например: ``` require "noinv" ... dlg { nam = 'Охранник'; -- в диалогах обычно не нужен инвентарь noinv = true; ... } ``` ### Фразы Центральным понятием в диалогах является _фраза_. Фразы это не просто вопрос-ответ, как можно подумать. Фраза является деревом, и в этом смысле, весь диалог может быть реализован единственной фразой. Например: ``` dlg { nam = 'разговор'; title = [[Разговор с продавцом]]; enter = [[Я обратился к продавцу.]]; phr = { { 'У вас есть бобы?', '-- Нет.'}, { 'У вас есть шоколад?', '-- Нет.'}, { 'У вас есть квас?', '-- Да', { 'А сколько он стоит?', '-- 50 рублей.' }, { 'А он холодный?', '-- Холодильник сломался.', { 'Беру два!', 'Остался один.', { 'Дайте один!', function() p [[Ок!]]; take 'квас'; end }; } } } } } ``` Как видно из примера, фраза задается атрибутом phr и может содержать разветвленный диалог. Фраза содержит в себе выборы, каждый из которых тоже может содержать в себе выборы и так далее... Фраза имеет формат пары: описатель -- реакция. В простейшем случае, это строки. Но они могут быть и функциями. Обычно, функцией бывает реакция, которая может содержать код по изменению игрового мира. Пара может быть простой: {'Вопрос', 'Ответ } А может содержать в себе массив пар: {'Вопрос', 'Ответ', {'Под-вопрос1', 'Под-ответ1' }, {'Под-вопрос2', 'Под-ответ2' }, } На самом деле, если вы посмотрите внимательно на атрибут phr, то вы заметите, что массив выборов тоже является вложенным в главную фразу phr, но только первоначальная пара отсутствует: ``` dlg { nam = 'разговор'; title = [[Разговор с продавцом]]; enter = [[Я обратился к продавцу.]]; phr = { -- тут мог бы быть вопрос ответ 1-го уровня! -- 'Главный вопрос', 'Главный ответ', { 'У вас есть бобы?', '-- Нет.'}, { 'У вас есть шоколад?', '-- Нет.'}, { 'У вас есть квас?', '-- Да', { 'А сколько он стоит?', '-- 50 рублей.' }, { 'А он холодный?', '-- Холодильник сломался.', { 'Беру два!', 'Остался один.', { 'Дайте один!', function() p [[Ок!]]; take 'квас'; end }; } } } } } ``` На самом деле, так и есть. И вы можете добавить 'Главный вопрос' и 'Главный ответ', но только вы не увидите этот главный вопрос. Дело в том, что при входе в диалог фраза phr автоматически раскрывается, так как обычно нет никакого смысла в диалогах из одной единственной фразы. И гораздо проще понять диалог как набор выборов, чем как единственную древовидную фразу. Так что у phr никогда нет первоначальной пары вопрос-ответ, но мы сразу попадаем в массив вариантов, что более понятно. Когда мы говорим о том, что диалог на самом деле реализован одной фразой, мы не совсем правы. Дело в том, что мы имеем дело с фразой, внутри которой находятся другие фразы... Это напоминает нам ситуацию с объектами. Действительно, фразы -- это объекты! Которые могут находиться внутри друг-друга. Итак, взглянем на диалог свежим взглядом: ``` dlg { nam = 'разговор'; title = [[Разговор с продавцом]]; enter = [[Я обратился к продавцу.]]; phr = { -- это объект типа фраза, без dsc и act -- это 1-я фраза, внутри фразы с dsc и act { 'У вас есть бобы?', '-- Нет.'}, -- это 2-я фраза, внутри фразы с dsc и act { 'У вас есть шоколад?', '-- Нет.'}, -- это 3-я фраза, внутри фразы с dsc и act { 'У вас есть квас?', '-- Да', -- это 1-я фраза внутри 3й фразы с dsc и act { 'А сколько он стоит?', '-- 50 рублей.' }, { 'А он холодный?', '-- Холодильник сломался.', { 'Беру два!', 'Остался один.', -- здесь act в виде функции { 'Дайте один!', function() p [[Ок!]]; take 'квас'; end }; } } } } } ``` Как видим, диалог -- это комната, а фразы -- специальные объекты! Теперь вам станет понятным дальнейшее изложение. > Внимание! По умолчанию, когда игрок нажимает на один из вопросов в > списке, движок повторяет его в выводе и только потом выводит > ответ. Это сделано для того, чтобы диалог выглядел связанным. Если > вы хотите отключить такое поведение, используйте настройку > std.phrase_show: ``` std.phrase_show = false -- не выводить фразу-вопрос при выборе ``` Эта настройка действует на все диалоги, устанавливайте ее в init() или start() функции. ### Атрибуты фраз Рассмотрим вариант фразы: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', {'Красную', 'Держите!' }, {'Синюю', 'Вот!' }, } } ``` Если запустить этот диалог, то в после выбора, скажем, красной таблетки, у нас останется еще один выбор синей таблетки. Но наш замысел, явно не в этом! Существует несколько способов сделать диалог правильным. Во первых, вы можете воспользоваться pop() -- возвратом на предыдущий уровень диалога: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', {'Красную', function() p 'Держите!'; pop() end; }, {'Синюю', function() p 'Вот!'; pop() end; }, } } ``` Или, в другой записи: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', {'Красную', pfn(pop) 'Держите!' }, {'Синюю', pfn(pop) 'Вот!' }, } } ``` Но это не слишком удобно, кроме того, что если эти фразы содержат в себе новые фразы? В случаях, когда вариант предлагает выбор, и этот выбор должен быть единственным, вы можете задать у фразы атрибут only: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!' }, {'Синюю', 'Вот!' }, } } ``` В таком случае, после выбора фразы, все фразы текущего контекста будут закрыты. Еще одна частая ситуация, вы хотите, чтобы фраза не пряталась после ее активации. Это делается заданием флага true: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!' }, {'Синюю', 'Вот!' }, { true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза -- которая никогда не будет скрыта } } ``` Альтернативная запись, с явным заданием атрибута always: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!' }, {'Синюю', 'Вот!' }, { always = true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза -- которая никогда не будет скрыта } } ``` Еще один пример. Что-если мы хотим, чтобы фраза была показана(или спрятана) по какому-либо условию? Для этого есть функция-обработчик cond. ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!' }, {'Синюю', 'Вот!' }, { true, 'А какая лучше?', 'Тебе выбирать.' }, -- фраза -- которая никогда не будет скрыта }, { cond = function() return have 'яблоко' end, 'А хотите яблоко?', 'Спасибо, нет.' }; } ``` В данном примере, только при наличии у игрока яблока, покажется ветка диалога 'А хотите яблоко?'. Иногда бывает удобно выполнить действие в тот момент, когда варианты текущего уровня(контекста) диалога исчерпаны. Для этого служит функция-обработчик onempty. ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!' }, {'Синюю', 'Вот!' }, onempty = function() p [[Ты сделал свой выбор.]] pop() end; }, { cond = function() return have 'яблоко' end, 'А хотите яблоко?', 'Спасибо, нет.' }; } ``` Обратите внимание, что когда есть метод onempty, автоматический возврат в предыдущую ветку не производится, предполагается, что метод onempty сделает все, что нужно. Все описанные атрибуты могут быть установлены у любой фразы. В том числе и на 1-м уровне: ``` phr = { onempty = function() p [[Вот и поговорили.]] walkout() end; { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!' }, {'Синюю', 'Вот!' }, onempty = function() p [[Ты сделал свой выбор.]] pop() end; }, { cond = function() return have 'яблоко' end, 'А хотите яблоко?', 'Спасибо, нет.' }; } ``` ### Теги Только что мы рассмотрели механизмы диалогов, которые уже позволяют создавать довольно сложные диалоги. Однако, и этих средств может не хватить. Иногда нам нужно уметь обращаться к фразам из других мест диалога. Например, выборочно включать их, или анализировать их состояние. А также делать переходы из одних ветвей диалога в другие. Все это возможно для фраз, у которых есть тег. Создать фразу с тегом очень просто: ``` phr = { { '#что?', 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', {'#красная', 'Красную', 'Держите!' }, {'#синяя', 'Синюю', 'Вот!' }, }, } ``` Как видим, наличие в начале фразы строки, которая начинается на символ '#' - означает наличие тега. Для таких фраз работают стандартные методы, такие как seen или enable/disable. Например, мы могли бы обойтись без атрибута only следующим образом: ``` phr = { { '#что?', 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', {'#красная', 'Красную', 'Держите!' cond = function(s) return not closed('#синяя') end }, {'#синяя', 'Синюю', 'Вот!', cond = function(s) return not closed('#красная') end }, }, } ``` Теги, кроме того, что позволяют узнавать и менять состояние конкретных фраз, делают возможным переходы между фразами. Для этого используются функции push и pop. push(куда) -- делает переход на фразу с запоминанием позиции в стеке. pop([куда]) -- вызванная без параметра, поднимается на 1 позицию в стеке истории. Можно указать конкретный тег фразы, которая должна быть в истории, в таком случае возврат будет осуществлен на нее. Нужно отметить, что при переходе по push, мы переходим не на одну фразу, а на список фраз этой фразы. То-есть раскрываем ее, также как это сделано для главной фразы phr. Например: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!', next = '#отаблетке' }, { 'Синюю', 'Вот!', next = '#отаблетке' }, }, { false, '#отаблетке', {'Я сделал верный выбор?', 'Время покажет.'} }, } ``` Тут мы видим сразу несколько приемов: - атрибут next, вместо явного описания реакции в виде функции с push. next -- это простой способ записать push. - false в начале фразы, делает фразу выключенной. Она находится в состоянии выключена, пока не сделать явный enable. Однако внутрь фразы мы можем перейти, и показать содержимое выборов. Альтернативная запись возможна с использованием атрибута hidden: ``` { hidden = true, '#отаблетке', {'Я сделал верный выбор?', 'Время покажет.'} }, ``` Таким образом можно записывать диалоги не древовидно, а линейно. Еще одна особенность переходов состоит в том, что если у фразы не описана реакция, то при переходе будет вызван заголовок фразы: ``` phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!', next = '#отаблетке' }, { 'Синюю', 'Вот!', next = '#отаблетке' }, }, { false, '#отаблетке', [[Я взял таблетку и мастер хитро улыбнулся.]], {'Я сделал верный выбор?', 'Время покажет.'}, {'Что делать дальше?', 'Ты свободен.'}, }, } ``` При выборе таблетки, будет вызван заголовочный метод фразы '#отаблетке', а уже потом будет представлен выбор. Если вам нравится линейная запись, вы можете предпочесть следующий вариант: ``` dlg { nam = 'диалог'; phr = { { 'Что это у вас?', 'Таблетки. Красная и синяя. Вам какую?', only = true, {'Красную', 'Держите!', next = '#отаблетке' }, { 'Синюю', 'Вот!', next = '#отаблетке' }, } } }:with { { '#отаблетке', [[Я взял таблетку и мастер хитро улыбнулся.]], {'Я сделал верный выбор?', 'Время покажет.'}, {'Что делать дальше?', 'Ты свободен.'}, }, } ``` Дело в том, что атрибут phr диалога задает первый объект комнаты. Но вы можете заполнить объекты комнаты обычным образом: задав obj или with. Так как при входе в диалог раскрывается 1-я фраза, то остальные фразы вы не увидите (обратите внимания, у фразы '#отаблетке' не стоит false), но вы сможете делать переходы на эти фразы. ### Методы Как вы уже знаете, объекты в INSTEAD могут находиться в состоянии открыт/закрыт и выключен/включен. Как это соответствует фразам диалога? Для обычных фраз, после активации выбора фраза _закрывается_. При повторном входе в диалог все фразы _открываются_. Для фраз с always = true (или true в начале определения) -- такого закрытия не происходит. Для фраз с hidden = true (или false в начале определения) -- фраза будет создана как выключенная. Она не будет видима до тех пор, пока не будет явно включена. Для фраз с cond(), каждый раз при просмотре фраз вызывается этот метод, и в зависимости от возвращаемого значения (true/не true) фраза включается или выключается. Зная это поведение, вы можете прятать/показывать и анализировать фразы обычными функциями вида: disable / enable / empty / open / close / closed / disabled и так далее... Однако, делать вы это можете только в самом диалоге, так как все фразы идентифицируются по тегам. Если вы хотите модифицировать состояние/анализировать фразы из других комнат вы можете: - дать фразе имя { nam = 'имя' }... - искать фразу по тегу в другой комнате: local ph = lookup('#тег', 'диалог') и потом работать с ней; Что касается функций push/pop, то вы можете вызывать их явно как методы диалога, например: ``` _'диалог':push '#новая' ``` Но лучше это делать в самом диалоге, например, в enter. Кроме того есть метод :reset, который сбрасывает стек переходов и устанавливает стартовую фразу, например: ``` enter = function(s) s:reset '#начало' end ``` > Следует отметить, что когда вы делаете enable/disable/open/close > фразы, то вы выполняете действие именно над этой фразой, а не над > фразами включенными внутрь. Но так как при показе фраз движок > остановится на выключенном/закрытом объекте-фразе и не войдет > внутрь, этого достаточно. ## Специальные объекты В STEAD3 существуют специальные объекты, которые выполняют специфические функции. Все такие объекты можно разделить на два класса: 1. Системные объекты @; 2. Подстановки $. Системные объекты, это объекты, чье имя начинается с символа '@' или '$'. Такие объекты обычно создаются в _модулях_. Они не уничтожаются при смерти игрового мира (например, при подгрузке gamefile, при загрузке игры из сохранения, и так далее). Примеры объектов: @timer, @prefs, @snd. Такие объекты, кроме своих специальных функций, могут быть использованы по ссылке, без явного помещения объекта в сцену или инвентарь, но механизм действия таких объектов -- особенный. ### Объект '@' Обычно, вам не нужно работать с такими объектами, но в качестве примера рассмотрим реализацию 'ссылок'. Пусть мы хотим сделать ссылку, при нажатии на которую мы перейдем в другую комнату. Конечно, мы могли бы добавить объект в сцену, но стоит ли это делать в таком простом случае? Как нам может помочь системный объект? ``` obj { nam = '@walk'; act = function(s, w) walk(w, false, false) end; } room { nam = 'main'; title = 'Начало'; decor = [[Начать {@walk старт|приключение}]]; } ``` При нажатии на ссылку "приключение" будет вызван метод act объекта '@walk' с параметром "старт". На самом деле, в стандартной библиотеке stdlib уже есть объект, с именем '@', который позволяет делать свои обработчики ссылок следующим образом: ``` xact.walk = walk room { nam = 'main'; title = 'Начало'; decor = [[Начать {@ walk старт|приключение}]]; } ``` Обратите внимание, на пробел после @. Данная запись делает следующее: - берет объект '@' (такой объект создан библиотекой stdlib); - берет его act; - вызывает act с параметрами walk и старт; - act объекта '@' смотрит в массив xact; - walk определяет метод, который будет вызван из массива xact; - старт -- параметр этого метода. Другой пример: ``` xact.myprint = function(w) p (w) end room { nam = 'main'; title = 'Начало'; decor = [[Нажми {@ myprint "hello world"|на кнопку}]]; } ``` ### Подстановки Объекты, чье имя начинается на символ '$' тоже считаются системными объектами, но работают они по-другому. Если в выводе текста встречается "ссылка" вида: ``` {$my a b c|текст} ``` То происходит следующее: 1. Берется объект $my; 2. Берется act объекта $my; 3. Вызывается act: _'$my':(a, b, c, текст); 4. Возвращаемая строка заменяет собой всю конструкцию {...}. Таким образом, объекты играют роль подстановки. Зачем это нужно? Представьте себе, что вы разработали модуль, который превращает записи формул из текстового вида в графические. Вы пишете объект $math который в своем act методе превращает текст в графическое изображение (спрайт) и возвращает его в текстовый поток. Тогда пользоваться таким модулем крайне просто, например: ``` {$math|(2+3*x)/y^2} ``` ## Динамические события Вы можете определять обработчики, которые выполняются каждый раз, когда время игры увеличивается на 1. Обычно, это имеет смысл для живых персонажей, или каких-то фоновых процессов игры. Алгоритм шага игры выглядит примерно так: - Игрок нажимает на ссылку; - Реакция 'act', 'use'', 'inv', 'tak', осмотр сцены (клик по названию сцены) или переход в другую сцену; - Динамические события; - Вывод нового состояния сцены. Например, сделаем Барсика живым: ``` obj { nam = 'Барсик'; { -- не сохранять массив lf lf = { [1] = 'Барсик шевелится у меня за пазухой.', [2] = 'Барсик выглядывает из-за пазухи.', [3] = 'Барсик мурлычит у меня за пазухой.', [4] = 'Барсик дрожит у меня за пазухой.', [5] = 'Я чувствую тепло Барсика у себя за пазухой.', [6] = 'Барсик высовывает голову из-за пазухи и осматривает местность.', }; }; life = function(s) local r = rnd(5); if r > 2 then -- делать это не всегда return; end r = rnd(#s.lf); -- символ # -- число элементов в массиве p(s.lf[r]); -- выводим одно из 6 состояний Барсика end; .... ``` И вот момент в игре, когда Барсик попадает к нам за пазуху! ``` take 'Барсик' -- добавить в инвентарь lifeon 'Барсик' -- оживить Барсика! ``` Любой объект (в том числе и сцена) могут иметь свой обработчик 'life', который вызывается каждый такт игры, если объект был добавлен в список живых объектов с помощью 'lifeon'. Не забывайте удалять живые объекты из списка с помощью 'lifeoff', когда они больше не нужны. Это можно сделать, например, в обработчике 'exit', или любым другим способом. > Если в вашей игре много "живых" объектов, вы можете задавать им > явную позицию в списке, при добавлении. Для этого, воспользуйтесь > вторым числовым параметром (целое неотрицательное число) 'lifeon', > чем меньше число, тем выше приоритет. 1 -- самый высокий. Или вы > можете использовать атрибут pri у объекта. Правда, этот атрибут > будет влиять на приоритет объекта в любом списке. Если вам нужен фоновый процесс в какой-то комнате, запускайте его в 'enter' и удаляйте в 'exit', например: ``` room { nam = 'В подвале'; dsc = [[Тут темно!]]; enter = function(s) lifeon(s); end; exit = function(s) lifeoff(s); end; life = function(s) if rnd(10) > 8 then p [[Я слышу какие-то шорохи!]]; -- изредка пугать игрока шорохами end end; way = { 'Дом' }; } ``` Если вам нужно определить, был ли переход игрока из одной сцены в другую, воспользуйтесь 'player\_moved()'. ``` obj { nam = 'фонарик'; on = false; life = function(s) if player_moved() then -- гасить фонарик при переходах s.on = false p "Я выключил фонарик." return end; end; ... } ``` Для отслеживания протекающих во времени событий, используйте 'time()' или вспомогательную переменную-счетчик. Для определения местоположения игрока -- 'here()'. Для определения факта, что объект "живой" -- 'live()'. ``` obj { nam = 'динамит'; timer = 0; used = function(s, w) if w^'спичка' then -- спичка? if live(s) then return "Уже горит!" end p "Я поджег динамит." lifeon(s) return end return false -- если не спичка end; life = function(s) s.timer = s.timer + 1 if s.timer == 5 then lifeoff(s) if here() == where(s) then p [[Динамит взорвался рядом со мной!]] else p [[Я услышал, как взорвался динамит.]]; end end end; ... } ``` Если 'life' обработчик возвращает текст события, он печатается после описания сцены. Вы можете вернуть из обработчика 'life' второй код возврата, ('true' или 'false'). Если вы вернете true -- то это будет признаком важного события, которое выведется до описания объектов сцены, например: ``` p 'В комнату вошел охранник.' return true ``` Или: ``` return 'В комнату вошел охранник.', true ``` Если вы вернете false, то цепочка life методов прервется на вас. Это удобно делать при выполнении walk из метода life, например: ``` life = function() walk 'theend' return false -- это последний life end ``` Если вы хотите блокировать 'life' обработчики в какой-то из комнат, воспользуйтесь модулем 'nolife'. Например: ``` require "noinv" require "nolife" dlg { nam = 'Охранник'; noinv = true; nolife = true; ... } ``` Отдельно стоит рассмотреть вопрос перехода игрока из 'life' обработчика. Если вы собираетесь использовать функции 'walk' внутри 'life', то вам следует учитывать следующее поведение. Если 'life' переносит игрока в новую локацию, то обычно предполагается что вы: 1. Очищаете вывод реакций: game:reaction(false); 2. Очищаете вывод живых методов на данный момент: game:events(false, false) 3. Делаете walk. 4. Останавливаете цепочку life вызовов с помощью return false; Некоторые моменты требуют пояснений. game:reaction() -- позволяет взять/изменить вывод реакции пользователя, если задать его в false это означает сбросить реакцию. game:events() -- позволяет взять/изменить вывод life методов. В качестве параметров принимаются приоритетные и не приоритетные сообщения, задав false, false мы отменили весь вывод предыдущих life методов. В стандартной библиотеке уже есть функция life_walk(), которая делает описанные действия. Вам остается только вернуть false. ## Графика Графический интерпретатор INSTEAD анализирует атрибут сцены 'pic', и воспринимает его как путь к картинке, например: ``` room { pic = 'gfx/home.png'; nam = 'Дома'; dsc = 'Я у себя дома'; }; ``` __Важно!__ Используйте в путях только прямые '/'. Также, настоятельно рекомендуется использовать в именах каталогов и файлов только латинские строчные символы. Этим самым вы обезопасите свою игру от проблем с совместимостью и она будет работать на всех архитектурных платформах, куда портирован INSTEAD. Конечно, 'pic' может быть функцией, расширяя возможности разработчика. Если в текущей сцене не определен атрибут 'pic', то берется атрибут 'game.pic'. Если не определен и он, то картинка не отображается. Поддерживаются все наиболее распространенные форматы изображений, но я рекомендую вам использовать 'png' и (когда важен размер) 'jpg'. Вы можете использовать в качестве картинок анимированные gif файлы. Вы можете встраивать графические изображения прямо в текст, в том числе в инвентарь, переходы, заглавия комнат и 'dsc' с помощью функции 'fmt.img' (Для этого включите модуль fmt). Например: ``` require "fmt" obj { nam = 'яблоко' disp = 'Яблоко'..fmt.img('img/apple.png'); } ``` Тем-не менее, картинку сцены всегда следует оформлять в виде 'pic' атрибута, а не вставки 'fmt.img' в 'dsc' комнаты. Дело в том, что картинка сцены масштабируется по другому алгоритму. Картинки 'fmt.img' масштабируются в соответствии с настройками INSTEAD (масштаб темы), а 'pic' -- учитывает также размер картинки. Кроме того, картинки 'pic' обладают и другими свойствами, например, возможностью отслеживания координат кликов мышью. Если вы поместите 'fmt.img' внутрь { и }, то получите графическую ссылку. ``` obj { nam = 'яблоко'; disp = 'яблоко ' ..img('img/apple.png'); dsc = function(s) p ("На полу лежит {яблоко",fmt.img 'img/apple.png', "}"); -- другие варианты: -- return "На полу лежит {яблоко"..fmt.img('img/apple.png').."}"; -- p "На полу лежит {яблоко"..fmt.img('img/apple.png').."}"; -- или dsc = "На полу лежит {яблоко"..fmt.img('img/apple.png').."}"; end; } ``` INSTEAD поддерживает обтекание картинок текстом. Если картинка вставляется с помощью функции 'fmt.imgl'/'fmt.imgr', она будет расположена у левого/правого края. __Важно!__ > Картинки, вставленные в текст с помощью 'fmt.imgl/fmt.imgr' не могут быть > ссылками!!! Используйте их только в декоративных целях. Для задания отступов вокруг изображения используйте 'pad', например: ``` fmt.imgl 'pad:16,picture.png' -- отступы по 16 от каждого края fmt.imgl 'pad:0 16 16 4,picture.png' -- отступы: вверху 0, справа 16, внизу 16, слева 4 fmt.imgl 'pad:0 16,picture.png' -- отступы: вверху 0, справа 16, внизу 0, слева 16 ``` Вы можете использовать псевдо-файлы для изображений прямоугольников и пустых областей: ``` dsc = fmt.img 'blank:32x32'..[[Строка с пустым изображением.]]; dsc = fmt.img 'box:32x32,red,128'..[[Строка красным полупрозрачным квадратом.]]; ``` INSTEAD может обрабатывать составные картинки, например: ``` pic = 'gfx/mycat.png;gfx/milk.png@120,25;gfx/fish.png@32,32'; ``` Таким образом, составная картинка представляет собой набор путей к изображениям, разделенных символом ';'. Вторая и последующие компоненты могут содержать постфикс в виде @x\_координата,y\_координата%, где координате 0,0 соответствует левый верхний угол всего изображения. Общий размер картинки считается равным общему размеру первой компоненте составной картинки, то есть, первый компонент (в нашем примере -- gfx/mycat.png) играет роль холста, а последующие компоненты накладываются на этот холст. Наложение происходит для левого верхнего угла накладываемой картинки. Если вам нужно, чтобы наложение происходило относительно центра накладываемой картинки, используйте перед координатами префикс ''c'', например: ``` pic = 'gfx/galaxy.png;gfx/star.png@c128,132'; ``` Оформив в виде функции формирование пути составной картинки, вы можете генерировать изображение на основе игрового состояния. Если вы в своей игре привязываетесь к каким-то координатам изображений, или к их размерам, делайте это относительно оригинальных размеров изображений. При масштабировании темы под заданное игроком разрешение, INSTEAD сам будет осуществлять пересчёт координат (при этом координаты для игры выглядят так, как будто игра запущена без масштабирования). Однако, возможны небольшие погрешности вычислений. Если вам не хватает функций, описанных в этой главе, изучите модуль "sprite", который предоставляет более широкие возможности по графическому оформлению. Но я крайне не рекомендую делать это в своей первой игре. ## Музыка Для работы с музыкой и звуками вам понадобится модуль snd. ``` require "snd" ``` Интерпретатор проигрывает в цикле текущую музыку, которая задается с помощью функции: 'snd.music(путь к музыкальному файлу)'. __Важно!__ Используйте в путях только прямые '/'. Также, настоятельно рекомендуется использовать в именах каталогов и файлов только латинские строчные символы. Этим самым вы обезопасите свою игру от проблем с совместимостью и она будет работать на всех архитектурных платформах, куда портирован INSTEAD. Поддерживается большинство музыкальных форматов, но настоятельно рекомендуется использовать формат 'ogg', так как именно он поддерживается наилучшим образом во всех версиях INSTEAD (для различных платформ). __Важно!__ Следует проявлять осторожность при использовании трекерной музыки, так как в некоторых дистрибутивах Linux могут быть проблемы при проигрывании определенных файлов (ошибки в связке библиотек SDL_mixer и libmikmod). Также, если вы используете 'mid' файлы, будьте готовы к тому, что игрок услышит их только в Windows версии INSTEAD (так как в большинстве случаев, Unix версии SDL_mixer собраны без поддержки ''timidity''). В качестве частоты музыкальных файлов используйте частоты кратные 11025. ``` room { pic = 'gfx/street.png'; enter = function() snd.music 'mus/rain.ogg' end; nam = 'на улице'; dsc = 'На улице идет дождь.'; }; ``` 'snd.music()' без параметра возвращает текущее имя трека. В функцию 'snd.music()' можно передавать второй параметр -- количество проигрываний (циклов). Получить текущий счетчик можно с помощью 'snd.music()' без параметров -- второе возвращаемое значение. 0 -- означает вечный цикл. 1..n -- количество проигрываний. -1 -- проигрывание текущего трека закончено. Для того, чтобы отменить проигрывание музыки, вы можете использовать 'snd.stop\_music()' Для того, чтобы узнать, играет ли музыка: ``` snd.music_playing() ``` Вы можете задавать время нарастания и затухания музыки, с помощью вызова: ``` snd.music_fading(o, [i]) ``` Здесь o - время в мс. для затухания и i - время в мс. для нарастания музыки. Если задан только один параметр -- оба времени считаются одинаковыми. После вызова, установленные параметры будут влиять на проигрывание всех музыкальных файлов. Для проигрывания звуков используйте 'snd.play()'. Настоятельно рекомендуется использовать формат 'ogg', хотя большинство распространенных звуковых форматов также будет работать. Различие между музыкой и звуковым файлом заключается в том, что движок следит за процессом проигрывания музыки и сохраняет/восстанавливает текущий проигрываемый трек. Выйдя из игры и загрузив ее снова, игрок услышит то же музыкальное оформление, что слышал при выходе. Звуки обычно означают кратковременные эффекты, и движок не сохраняет и не восстанавливает звуковые события. Так, если игрок не успел дослушать звук выстрела и вышел из игры, после загрузки файла сохранения он не услышит звук (или его окончание) снова. Тем не менее, если учесть то, что 'snd.play()' позволяет запускать зацикленные звуки, то различие между музыкой и звуками становится уже не таким однозначным. Итак, определение функции: 'snd.play(файл, [канал], [цикл])', где: - файл -- путь и\или имя звукового файла; - канал -- номер канала [0..7]; Если не указан, то выберется первый свободный. - цикл -- количество проигрываний 1..n, 0 -- зацикливание. Для остановки проигрывания звука можно использовать 'snd.stop()'. Для остановки звука в определенном канале 'snd.stop(канал)'. __Важно!__ > Если вы используете зацикленные звуки, вам придется самим > восстанавливать их состояние (запускать снова с помощью > 'snd.sound()') в функции 'start()' Например: ``` global 'wind_blow' (false) ... function start() if wind_blow then snd.play('snd/wind.ogg', 0) end end ``` Если вам не достаточно описанных здесь функций по работе со звуком, используйте полное описание модуля "snd". ## Форматирование и оформление вывода Обычно INSTEAD сам занимается форматированием и оформлением вывода. Например, отделяет статическую сцену от динамической. Выделяет курсивом действия игрока. Переводит фокус на изменение в тексте и т.д. Модули вроде "fmt" улучшают качество вывода игры без дополнительных усилий со стороны автора. Например: ``` require 'fmt' fmt.para = true -- включить отступы параграфов ``` И ваша игра будет выглядеть гораздо лучше. Если вам нужна какая-то автоматическая обработка выводимого текста, вы можете включить модуль "fmt" и определить функцию 'fmt.filter'. Например: ``` require "fmt" fmt.filter = function(s, state) -- s -- вывод -- state -- true, если это такт игры (вывод сцены) if state then return 'Эта строка будет добавлена к началу вывода\n'..s; end return s end ``` Многие хорошие игры на INSTEAD никак не занимаются своим оформлением, кроме разбиения текста 'dsc' на параграфы с помощью символов '^^', поэтому подумайте, а так ли вам хочется заниматься оформлением своей игры вручную? Тем не менее, иногда это все-таки необходимо. > Внимание! По умолчанию, все конечные и начальные переводы строк, > пробелы и символы табуляции вырезаются из вывода обработчиков. Так > как обычно они не имеют смысла и даже вредны. В редких случаях, > автору может понадобиться более полный контроль над выводом, тогда он > может задать std.strip\_call как false в init() или start(), > например: ``` std.strip_call = false obj { dsc = [[Тут лежит {яблоко}.^^^^]] -- теперь переводы строк -- не будут вырезаны, хотя это странное желание } ``` > Но обычно такое ручное форматирование свидетельствует о плохом > стиле. Для оформления сцены лучше использовать decor и/или > подстановки $. ### Форматирование Вы можете делать простое форматирование текста с помощью функций: - fmt.c(строка) - разместить по центру; - fmt.r(строка) - разместить справа; - fmt.l(строка) - разместить слева; - fmt.top(строка) - сверху строки; - fmt.bottom(строка) - снизу строки; - fmt.middle(строка) - середина строки (по умолчанию). Например: ``` room { nam = 'main'; title = 'Добро пожаловать'; dsc = fmt.c 'Добро пожаловать!'; -- если у функции только 1 параметр, -- скобки можно опускать; } ``` Вышеописанные функции влияют не только на текст, но и на изображения, вставленные с помощью ''fmt.img()'. Следует отметить, что если вы используете несколько функций форматирования, то предполагается, что они относятся к разным строкам (параграфам). В противном случае, результат не определен. Разбивайте текст на абзацы символами '^' или 'pn()'. INSTEAD при выводе удаляет лишние пробелы. Это значит, что неважно сколько пробелов вы вставляете между словами, все равно при выводе они не будут учитываться для расчета расстояния между словами. Иногда это может стать проблемой. Вы можете создавать _неразрывные строки_ с помощью: fmt.nb(строка). Например, модуль "fmt" использует неразрывные строки для создания отступов в начале параграфов. Также, 'fmt.nb' может оказаться удобной для вывода служебных символов. Можно сказать, что вся строка-параметр 'fmt.nb' воспринимается движком как одно большое слово. Еще один пример. Если вы используете подчеркивание текста, то промежутки между словами не будут подчеркнуты. При использовании 'fmt.nb' промежутки также будут подчеркнуты. INSTEAD не поддерживает отображение таблиц, однако для вывода простых табличных данных можно воспользоваться 'fmt.tab()'. Эта функция используется для абсолютного позиционирования в строке (табулятор). fmt.tab(позиция, [центр]) _Позиция_, это текстовый или числовой параметр. Если задан числовой параметр, он воспринимается как позиция в пикселях. Если он задан в виде строкового параметра 'число%', то он воспринимается как позиция, выраженная в процентах от ширины окна вывода сцены. Необязательный строковой параметр _центр_ задает позицию в следующем за 'fmt.tab' слове, которая будет размещена по указанному смещению в строке. Позиции могут быть следующими: - left; - right; - center. По-умолчанию считается что задан параметр "left". Так, например: ``` room { nam = 'main'; disp = 'Начало'; -- размещение 'Начало!' по центру строки dsc = fmt.tab('50%', 'center')..'Начало!'; } ``` Конечно, не очень удачный пример, так как то же самое можно было сделать с помощью 'fmt.c()'. Более удачный пример. dsc = function(s) p(fmt.tab '0%') p "Слева"; p(fmt.tab '100%', 'right') p "Справа"; end На самом деле, единственная ситуация, когда применение 'fmt.tab()' оправдано -- это вывод табличных данных. Следует отметить, что в ситуации, когда мы пишем что-то вроде: ``` -- размещение 'Раз' по центру строки dsc = fmt.tab('50%', 'center')..'Раз два три!'; ``` Только слово 'Раз' будет помещено в центр строки, остальные слова будут дописаны справа от этого слова. Если вы хотите центрировать 'Раз два три!' как одно целое, воспользуйтесь 'fmt.nb()'. ``` -- размещение 'Раз два три!' по центру строки dsc = fmt.tab('50%', 'center')..fmt.nb ('Раз два три!'); ``` В INSTEAD также существует возможность выполнять простое вертикальное форматирование. Для этого используйте вертикальный табулятор: fmt.y(позиция, [центр]) Как и в случае с fmt.tab _позиция_, это текстовый или числовой параметр. Здесь он воспринимается как позиция строки, выраженная в пикселях или процентах от высоты области сцены. Например, 100% -- соответствует нижней границе области сцены. 200% -- соответствует нижней границе второй страницы вывода (две высоты области вывода сцены). Необязательный строковой параметр _центр_ задает позицию внутри строки, относительно которой выполняется позиционирование: - top (по верхнему краю); - middle (по центру); - bottom (по нижнему краю -- значение по умолчанию). Следует отметить, что 'fmt.y' работает целиком для строки. Если в строке встретится несколько fmt.y, действовать будет последний из табуляторов. ``` -- размещение 'ГЛАВА I' - в центре сцены dsc = fmt.y('100%').."ГЛАВА I"; ``` _Если позиция, указанная табулятором, уже занята другой строкой, табулятор игнорируется._ По умолчанию, статическая часть сцены отделяется от динамической двойным переводом строки. Если вам это не подходит, вы можете переопределить 'std.scene_delim', например: std.scene_delim = '^' -- одинарный перевод строки Вы не можете менять эту переменную в обработчиках, так как она не сохраняется, но вы можете задать ее для игры целиком, или восстанавливать ее вручную в функции 'start()'. Если вас категорически не устраивает то, как INSTEAD формирует вывод (последовательность абзацов текста), вы можете переопределить функцию 'game.display()', которая по умолчанию выглядит следующим образом: ``` game.display = function(s, state) local r, l, av, pv local reaction = s:reaction() or nil -- реакция r = std.here() if state then -- такт игры? reaction = iface:em(reaction) -- курсив av, pv = s:events() av = iface:em(av) -- вывод "важных" life pv = iface:em(pv) -- вывод фоновых life l = s.player:look() -- objects [and scene] -- объекты и сцена end l = std.par(std.scene_delim, reaction or false, av or false, l or false, pv or false) or '' return l end; ``` Тот факт, что я привел здесь этот код, не означает, что я рекомендую переопределять эту функцию. Напротив, я категорически против такой сильной привязки к форматированию текста. Тем не менее, иногда возникает ситуация, когда полный контроль за последовательностью вывода необходим. Если вы пишите свою первую игру, просто пропустите этот текст. ### Оформление Вы можете менять начертание текста с помощью комбинаций функций: - fmt.b(строка) - жирный текст; - fmt.em(строка) - курсив; - fmt.u(строка) - подчеркнутый текст; - fmt.st(строка) - перечеркнутый текст. Например: ``` room { nam = 'Intro'; title = false; dsc = function(s) p ('Вы находитесь в комнате: ') p (fmt.b(s)) end; } ``` > Используя функции 'fmt.u' и 'fmt.st' на строках, содержащих пробелы, > вы получите разрывы линий в этих местах. Что избежать этого, можно > превратить текст в _неразрывную строку_: fmt.u(fmt.nb "теперь текст без пропусков" ) Строго говоря, INSTEAD не поддерживает одновременный вывод разными шрифтами в окно сцены (если не считать разное начертание), поэтому если вам все-таки требуется более гибкий контроль вывода, вы можете сделать следующее: - Использовать графические вставки 'fmt.img()'; - Использовать модуль 'fonts', в котором реализована отрисовка разными шрифтами за счет модуля 'sprite'; - Использовать другой движок, так как скорее всего вы используете INSTEAD не по назначению. ## Конструкторы и наследование __Внимание!__ Если вы пишите свою первую игру, было бы лучше, если бы она была простая. Для простой игры информация из этой главы не понадобится. Более того, 90% игр на INSTEAD не использует вещей, описанных в этой главе! Если вы пишите игру, в которой много однотипных объектов, возможно, вам захочется упростить их создание. Это можно сделать одним из следующих способов: - Создать свой конструктор; - Создать новый класс объектов. ### Конструкторы Конструктор -- это функция, которая создает за вас объект и заполняет его атрибуты так, как вам это нужно. Рассмотрим пример. Допустим, в вашей игре будет много окон. Нужно создавать окна, любое окно можно разбить. Мы можем написать конструктор 'window'. ``` window = function(v) v.window = true v.broken = false if v.dsc == nil then v.dsc = 'Здесь есть {окно}.' end v.act = function(s) if s.broken then p [[Окно разбито.]] else p [[За окном темно.]] end end if v.used == nil then v.used = function(s, w) if w^'молоток' then if s.broken then p [[Окно уже разбито.]] else p [[Я разбил окно.]] s.broken = true; end return end return false end end return obj(v) end ``` Как видим, идея конструкторов проста. Вы просто создаете функцию, которая получает на вход таблицу с атрибутами {}, которую конструктор может дозаполнить нужными атрибутами. Затем эта таблица передается конструктору obj/room/dlg и возвращается полученный объект. Теперь, создавать окна стало легко: ``` window { dsc = [[Тут есть {окно}.]]; } ``` Или, так как окно это обычно статический объект, можно создавать его прямо в 'obj'. ``` obj = { window { dsc = 'В восточной стене есть {окно}.'; } }; ``` У нашего окна будет готовый used метод и act метод. Вы можете проверить тот факт, что объект окно -- просто проверив признак window: ``` use = function(s, w) if w.window then p [[Действие на окно.]] return end return false end ``` Состояние "разбитости" окна, это атрибут broken. Как реализовать наследование в конструкторах? На самом деле, в примере выше уже используется наследование. Действительно, ведь конструктор 'window'' вызывает другой конструктор 'obj', тем самым получая все свойства обычного объекта. Также, 'window' определяет переменную признак 'window', чтобы в игре мы могли понять, что мы имеем дело с окном. Например: Для иллюстрации механизма наследования создадим класс объектов 'treasure', те. сокровищ. ``` global { score = 0 } treasure = function() local v = {} v.disp = 'сокровище' v.treasure = true v.points = 100 v.dsc = function(s) p ('Здесь есть {', std.dispof(s), '}.') end; v.inv = function(s) p ('Это же ', std.dispof(s), '.'); end; v.tak = function(s) score = score + s.points; -- увеличим счет p [[Дрожащими руками я забрал сокровища.]]; end return obj(v) end ``` А теперь, на его основе создадим золото, алмаз и сундук. ``` gold = function(dsc) local v = treasure(); v.disp = 'золото'; v.gold = true; v.points = 50; v.dsc = dsc; return v end diamond = function(dsc) local v = treasure(); v.disp = 'алмаз'; v.diamond = true; v.points = 200; v.dsc = dsc; return v end chest = function(dsc) local v = treasure(); v.disp = 'сундук'; v.chest = true v.points = 1000; v.dsc = dsc; return v end ``` Теперь, в игре можно создавать сокровища через конструкторы: ``` diamond1 = diamond("В грязи я заметил {алмаз}.") diamond2 = diamond(); -- тут будет стандартное описание алмаза gold1 = gold("В углу я заметил блеск {золота}."); room { nam = 'пещера'; obj = { diamond1, gold1, chest("А еще я вижу {сундук}!") }; } ``` На самом деле, как именно писать функции-конструкторы и реализовывать принцип наследования, зависит только от вас. Выберете наиболее простой и понятный способ. При написании конструкторов иногда бывает полезным сделать вызов обработчика так, как это делает INSTEAD. Для этого используется 'std.call(объект, метод, параметры)', при этом эта функция вернет реакцию атрибута в виде строки. Например, рассмотрим модификацию 'window', которая заключается в том, что можно определять свою реакцию на осмотр окна, которая будет выполнена после стандартного сообщения о том, что это разбитое окно (если оно разбито). ``` window = function(nam, dsc, what) local v = {} -- создаем пустую таблицу -- заполняем ее v.window = true v.what = what v.broken = false if dsc == nil then v.dsc = 'Здесь есть {окно}' end v.act = function(s) if s.broken then p [[Окно разбито.]] end local r, v = stead.call(s, 'what') if v then -- обработчик выполнился? p(r) else p [[За окном темно.]] end end return obj(v) end ``` Таким образом, мы можем при создании окна задать третий параметр, в котором определить функцию или строку, которая будет реакцией во время осмотра окна. При этом сообщение о том, что окно разбито (если оно действительно разбито), будет выведено перед этой реакцией. ### Класс объектов Конструкторы объектов широко использовались в STEAD2. В STEAD3 obj/dlg/room реализованы как классы объектов. Класс объектов удобно создавать для тех случаев, когда поведение создаваемого объекта не укладывается в стандартные объекты obj/room/dlg и вы хотите поменять методы класса. Изменив метод класса, например, вы можете вообще изменить то, как выглядит предмет в сцене. В качестве примера, рассмотрим создание класса "контейнер". Контейнер может хранить в себе другие объекты, быть закрытым и открытым. ``` -- create own class container cont = std.class({ -- создаем класс cont __cont_type = true; -- для определения типа объекта display = function(s) -- переопределяем метод показа предмета local d = std.obj.display(s) if s:closed() or #s.obj == 0 then return d end local c = s.cont or 'Внутри: ' -- описатель содержимого local empty = true for i = 1, #s.obj do local o = s.obj[i] if o:visible() then empty = false if i > 1 then c = c .. ', ' end c = c..'{'..std.nameof(o)..'|'..std.dispof(o)..'}' end end if empty then return d end c = c .. '.' return std.par(std.space_delim, d, c) end; }, std.obj) -- мы наследуемся от стандартного объекта ``` После этого, вы можете создавать контейнеры так: ``` cont { nam = 'ящик'; dsc = [[Тут есть {ящик}.]]; cont = 'В ящике: '; }: with { 'яблоко', 'груша'; } ``` Когда контейнер будет открыт, вы увидите описание ящика, а также содержимое ящика в виде строки ссылок: В ящике: яблоко, груша. dsc объектов яблоко и груша будут тоже показаны, если они заданы. Если необходимо прятать dsc объектов при открытии контейнера, оставляя лишь имена объектов, то можно выполнить следующую модификацию: ``` -- заменим функцию показа любого объекта -- если объект внутри контейнера, не вызывать его dsc std.obj.display = function(self) local w = self:where() -- где объект? if not std.is_obj(w, 'cont') then -- если не в контейнере local d = std.call(self, 'dsc') return d end end ``` К сожалению, подробное описание классов выходит за рамки данного руководства, эти вещи будут описаны в другом руководстве для разработчиков модулей. А пока, для вашей первой игры, вам не стоит писать свои классы объектов. ## Полезные советы ### Разбиение на файлы Когда ваша игра становится большой, размещение ее кода целиком в 'main3.lua' -- плохая идея. Для разбиения текста игры на файлы вы можете использовать 'include'. Вы должны использовать 'include' в глобальном контексте таким образом, чтобы во время загрузки 'main3.lua' загрузились и все остальные фрагменты игры, например. ``` -- main3.lua include "episode1" -- .lua можно опускать include "npc" include "start" room { nam = 'main'; .... ``` Как именно разбивать исходный текст на файлы зависит только от вас. Я использую файлы в соответствии с эпизодами игры (которые обычно слабо связаны между собой), но можно создавать файлы, хранящие отдельно комнаты, объекты, диалоги и т.д. Это вопрос личного удобства. Также есть возможность динамически подгружать части игры (с возможностью доопределять объекты). Для этого вы можете воспользоваться функцией 'gamefile': ``` ... act = function() gamefile ("episode2") end -- .lua можно опускать ... ``` > Внимание! Если в вашей игре определена функция init(), то в > подгружаемых частях она также должна присутствовать! В противном > случае, после подгрузки файла, будет вызвана текущая функция init(), > что обычно не является желательным. 'gamefile()' также позволяет загрузить новый файл и забыть стек предыдущих загрузок, запустив этот новый файл как самостоятельную игру. Для этого, задайте второй параметр функции как 'true'. Имейте в виду, что существующие модули остаются и переживают операцию gamefile в обоих случаях. 'gamefile()' можно использовать только в обработчиках. ``` act = function() gamefile ("episode3.lua", true); end; ``` Во втором варианте 'gamefile()' можно использовать для оформления мультиязычных игр или игр-сборников, где фактически из оболочки выполняется запуск самостоятельной игры. ### Меню Стандартное поведение предмета инвентаря состоит в том, что игрок должен сделать два щелчка мышью. Это необходимо потому, что каждый предмет инвентаря может быть использован на другой предмет сцены или инвентаря. После второго щелчка происходит игровой такт игры. Иногда такое поведение может быть нежелательным. Возможно, вы захотите сделать игру в которой игровая механика отличается от классических INSTEAD игр. Тогда вам может понадобится меню. Меню -- это элемент инвентаря, который срабатывает на первый клик. При этом меню может сообщить движку, что действие не является игровым тактом. Таким образом, используя меню вы можете создать в зоне инвентаря управление игрой любой сложности. Например, существует модуль "proxymenu", который реализует управление игрой в стиле квестов на ZX-"Спектрум". В игре "Особняк" свое управление, которое вводит несколько модификаторов действий, и т.д. Итак, вы можете делать меню в области инвентаря, определяя объекты с типом 'menu'. При этом, обработчик меню ('act') будет вызван после одного клика мыши. Если обработчик возвращает false, то состояние игры не изменяется. Например, реализация кармана: ``` menu { state = false; nam = 'карман'; disp = function(s) if s.state then return fmt.u('карман'); -- подчеркиваем активный карман end return 'карман'; end; gen = function(s) if s.state then s:open(); -- показать все предметы в кармане else s:close(); -- спрятать все предметы в кармане end return s end; act = function(s) s.state = not s.state -- изменить состояние s:gen(); -- открыть или закрыть карман end; }: with { obj { nam = 'нож'; inv = 'Это нож'; }; } function init() take 'карман':gen() end ``` ### Статус игрока Иногда возникает желание выводит какой-нибудь статус. Например, количество игровых очков, состояние героя или, наконец, время суток. INSTEAD не предоставляет каких-то других областей вывода, кроме сцены и инвентаря, поэтому, самым простым способом вывода статуса является вывод его в зону инвентаря. Ниже представлена реализация статуса игрока в виде текста, который появляется в инвентаре, но не может быть выбран, то есть, выглядит просто как текст. ``` global { life = 10; power = 10; } stat { -- stat -- объект "статус" nam = 'статус'; disp = function(s) pn ('Жизнь: ', life) pn ('Сила: ', power) end }; function init() take 'статус' end ``` ### walk из обработчиков onexit и onenter Вы можете делать 'walk' из обработчиков 'onenter' и 'onexit'. Например, 'path' реализован как комната с обработчиком 'onenter', который переносит игрока в другую комнату. Рекомендуется возвращать из onexit/onenter false в случае, если вы делаете walk из этих обработчиков. ### Кодирование исходного кода игры Если вы не хотите показывать исходный код своих игр, вы можете закодировать исходный код с помощью параметра командной строки '-encode': sdl-instead -encode <путь к файлу> [выходной путь] И использовать закодированный файл с помощью обычных include/gamefile. Однако, для этого вы должны написать в начале main3.lua: ``` std.dofile = std.doencfile ``` При этом главный файл 'main3.lua' необходимо оставлять открытым. Таким образом, схема выглядит следующим образом ('game.lua' -- закодированный файл): ``` -- $Name: Моя закрытая игра!$ std.dofile = std.doencfile include "game"; -- никто не узнает, как ее пройти! ``` __Важно!__ > Не используйте компиляцию игр с помощью 'luac', так как 'luac' создает > платформозависимый код! Однако, компиляция игр может быть > использована для поиска ошибок в коде. ### Запаковка ресурсов Вы можете упаковать ресурсы игры (графику, музыку, темы) в файл ресурсов '.idf', для этого поместите все ресурсы в каталог 'data' и запустите INSTEAD: sdl-instead -idf <путь к data> При этом, в текущем каталоге должен будет создастся файл 'data.idf'. Поместите его в каталог с игрой. Теперь ресурсы игры в виде отдельных файлов можно удалить (конечно, оставив себе оригинальные файлы). Вы можете запаковать в формат '.idf' всю игру: sdl-instead -idf <путь к игре> Игры в формате 'idf' можно запускать как обычные игры 'instead' (как если бы это были каталоги) а также из командной строки: sdl-instead game.idf ### Переключение между игроками Вы можете создать игру с несколькими персонажами и время от времени переключаться между ними (см. 'change_pl()'). Но вы можете также использовать этот трюк для того, чтобы иметь возможность переключаться между разными типами инвентаря. ### Использование параметров обработчика Пример кода. ``` obj { nam = 'камень'; dsc = 'На краю лежит {камень}.'; act = function() remove 'камень'; p 'Я толкнул камень, он сорвался и улетел вниз...'; end ``` Обработчик act мог бы выглядеть проще: ``` act = function(s) remove(s); p 'Я толкнул камень, он сорвался и улетел вниз...'; end ``` ### Специальные статусы обработчиков Из обработчика обычно возвращается текст, в виде return "текст сообщения". Или с помощью функций p()/pr()/pn()/pf(). Кроме этого, есть специальные статусы, которые могут пригодиться при разработке игры. Возвращение статуса false: return false Такой статус означает что обработчик не выполнил свою функцию и должен быть проигнорирован. Обычно движок в таком случае вызовет обработчик по умолчанию. Вы можете также вернуть специальный статус: return true, false В этом режиме перерисуется только область инвентаря (но не сцена). Данный статус удобно использовать для реализации меню в области инвентаря. Существует еще один специальный статус: std.nop(). Он может быть использован просто как вызов функции в конце обработчика или совместно с return. return std.nop() -- ... или ... std.nop() -- далее конец функции или return В этом случае, содержимое сцены останется таким же, как и в прошлый такт игры (даже строка реакции останется старой). Данный статус удобно использовать совместно с модулем theme, когда нужно изменить оформление игры на лету и перерисовать кадр с учетом новых параметров темы. ### Таймер Для асинхронных событий, привязанных к реальному времени, в INSTEAD есть возможность использовать таймер. На самом деле, вам следует хорошо подумать, стоит ли в приключенческой игре использовать таймер. Обычно, игроком это воспринимается не слишком благосклонно. С другой стороны, таймер вполне можно использовать для управления музыкой или в оформительских целях. Для использования таймера, вам следует подключить модуль "timer". require "timer" Таймер программируется с помощью объекта 'timer'. - timer:set(мс) -- задать интервал таймера в миллисекундах; - timer:stop() -- остановить таймер. При срабатывании таймера, вызывается обработчик game.timer. Если game.timer возвращает false, сцена не перерисовывается. В противном случае, возвращаемое значение выводится как реакция. Вы можете делать локальные для комнаты обработчики 'timer'. Если в комнате объявлен обработчик 'timer', он вызывается вместо 'game.timer'. Если он возвращает false -- вызывается game.timer. Например: ``` game.timer = function(s) if time() > 10 then return false end snd.play 'gfx/beep.ogg'; p ("Timer:", time()) end function init() timer:set(1000) -- раз в секунду end ``` ``` room { enter = function(s) timer:set(1000); end; timer = function(s) timer:stop(); walk 'комната2'; end; nam = 'Проверка таймера'; dsc = [[Ждите.]]; } ``` Состояние таймера попадает в файл сохранения, таким образом, вам не нужно заботиться о его восстановлении. Вы можете вернуть из таймера специальный статус: return true, false В этом режиме перерисуется только область инвентаря. Это можно использовать для статусов вроде часов. Кроме того, в INSTEAD существует возможность отслеживать интервалы времени в миллисекундах. Для этого используйте функцию instead.ticks(). Функция возвращает число миллисекунд, прошедшее с момента старта игры. ### Музыкальный плеер Вы можете написать для игры свой проигрыватель музыки, создав его на основе живого объекта, например: ``` -- играет треки в случайном порядке require "snd" obj { { tracks = {"mus/astro2.mod", "mus/aws_chas.xm", "mus/dmageofd.xm", "mus/doomsday.s3m"}; }; nam = 'плеер'; life = function(s) if not snd.music_playing() then local n = s.tracks[rnd(#s.tracks)] snd.music(n, 1); end end; }:lifeon(); ``` Ниже приводится пример более сложного плеера. Меняем трек только если он закончился или прошло более 2 минут и игрок перешел из комнаты в комнату. В каждом треке можно указать число проигрываний (0 - зацикленный трек): ``` require "timer" global { track_time = 0 }; obj { nam = 'player'; pos = 0; { playlist = { '01 Frozen sun.ogg', 0, '02 Thinking.ogg', 0, '03 Melancholy.ogg', 0, '04 Everyday happiness.ogg', 0, '10 Good morning again.ogg', 1, '15 [Bonus track] The end (demo cover).ogg', 1 }; }; tick = function(s) if snd.music_playing() and ( track_time < 120 or not player_moved() ) then return end track_time = 0 if s.pos == 0 then s.pos = 1 else s.pos = s.pos + 2 end if s.pos > #s.playlist then s.pos = 1 end snd.music('mus/'..s.playlist[s.pos], s.playlist[s.pos + 1]); end; } game.timer = function(s) track_time = track_time + 1 music_player:tick(); end function init() timer:set(1000) end ``` ### Живые объекты Если вашему герою нужен друг, одним из способов может стать метод 'life' этого персонажа, который всегда переносит объект в локацию игрока: ``` obj { nam = 'лошадь'; dsc = 'Рядом со мной стоит {лошадь}.'; act = [[Моя лошадка.]]; life = function(s) if player_moved() then place(s); end end; } function init() lifeon 'лошадь'; -- сразу оживим лошадь end ``` ### Вызов меню Вы можете вызвать из игры меню INSTEAD с помощью функции 'istead.menu()'. Если в качестве параметра задать: 'save', 'load' или 'quit', то будет вызван соответствующий подраздел меню. ### Динамическое создание объектов Обычные объекты и комнаты нельзя создавать "на лету". Обычно вы создаете их в глобальном пространстве lua файла. Однако, существуют игры в которых количество объектов неизвестно заранее, или количество объектов велико и они добавляются по ходу игры. В INSTEAD существует способ создания любого объекта на лету. Для этого вам понадобится написать _конструктор_ вашего объекта и воспользоваться функцией 'new'. Конструктор должен быть декларирован. Итак, вы можете использовать функции 'new' и 'delete' для создания и удаления динамических объектов. Примеры: ``` declare 'box' (function() return obj { dsc = [[Тут лежит {коробка}.]]; tak = [[Я взял коробку.]]; } end) local o = new (box); take(o); ``` ``` declare 'box' (function(dsc) return obj { dsc = dsc; tak = [[Я взял коробку.]]; } end) take(new(box, 'В углу стоит {коробка}')) ``` 'new' воспринимает первый аргумент -- как задекларированную функцию-конструктор, а все остальные параметры -- как аргументы конструктору. Результатом выполнения конструктора должен быть объект. ``` function myconstructor() local v = {} v.disp = 'тестовый объект' v.act = 'Тестовая реакция' return obj(v) end ``` > Внимание! При создании объекта конструктор должен опираться только > на информацию, полученную из параметров! Дело в том, что создание > объекта при загрузке происходит в самом начале, когда окружение мира > еще не загружено полностью! В качестве параметров поддерживаются > простые типы: строки, таблицы, числа, булевые > значения. Недекларированные функции и списки не будут работать. Если вы хотите уничтожить объект по его имени или ссылке-переменной, воспользуйтесь: ``` purge(o) -- удалить из всех списков delete(o) -- освободить объект ``` При этом, delete это именно удаление объекта из INSTEAD, а не аналог remove() или purge(). Обычно, нет особого смысла делать delete. Только если предмет больше никогда не понадобится в игре, или вы собираетесь пересоздать объект с тем же именем, имеет смысл освободить его с помощью delete(). Более практически-полезный пример: ``` -- декларируем конструктор -- path declare 'make_path' (function(v) return path(v) end) -- динамический переход -- создали новый объект -- и положили его в ways() put( new (make_path, { 'переход', 'комната2'}, ways()) ``` ### Запрет на сохранение игры Иногда может понадобиться запретить игроку делать сохранения в игре. Например, если речь идет о сценах, где важный элемент составляет случай, или для коротких игр, в которых проигрыш должен быть фатальным и требовать перезапуска игры. Для управлением функции сохранения используется атрибут 'instead.nosave'. Например: instead.nosave = true -- запретить сохранения Если вы хотите запрещать сохранения не везде, а в некоторых сценах, оформите 'instead.nosave' в виде функции, или же меняйте состояние атрибута на лету -- он попадает в файл сохранений. ``` -- запретить -- сохранения в комнатах, которые содержат атрибут nosave. instead.nosave = function() return here().nosave end ``` Следует отметить, что запрет на сохранения не означает запрета на автосохранение. Для управления автосохранением воспользуйтесь аналогичным атрибутом 'instead.noautosave'. > Вы можете явно сохранять игру с помощью вызова: > 'instead.autosave([номер слота])'; Если номер слота не задан, то > игра будет сохранена под слотом 'автосохранение'. Имейте в виду, что > сохраняется состояние __после__ завершение текущего такта игры. ### Определение типа объекта В INSTEAD существует два способа определить тип объекта. Первый - с помощью функции std.is_obj(переменная, [тип]). Например: ``` a = room { nam = 'объект'; }; dprint(std.is_obj(a)) -- выведет true dprint(std.is_obj('объект')) -- выведет false dprint(std.is_obj(a, 'room')) -- выведет true dprint(std.is_obj(a.obj, 'list')) -- выведет true ``` std.is_obj() удобная для определения типа пременной или аргумента функции. Второй способ связан с использованием метода type: ``` a = room { nam = 'объект'; }; dprint(a:type 'room') -- выведет true ``` ## Темы для sdl-instead Графический интерпретатор поддерживает механизм тем. _Тема_ представляет из себя каталог, с файлом 'theme.ini' внутри. Тема, которая является минимально необходимой -- это тема 'default'. Эта тема всегда загружается первой. Все остальные темы наследуются от нее и могут частично или полностью заменять ее параметры. Выбор темы осуществляется пользователем через меню настроек, однако конкретная игра может содержать собственную тему и таким образом влиять на свой внешний вид. В этом случае в каталоге с игрой должен находиться свой файл 'theme.ini'. Тем не менее, пользователь свободен отключить данный механизм, при этом интерпретатор будет предупреждать о нарушении творческого замысла автора игры. Синтаксис 'theme.ini' очень прост. <параметр> = <значение> или ; комментарий Значения могут быть следующих типов: строка, цвет, число. Цвет задается в форме #rgb, где r g и b компоненты цвета в шестнадцатеричном виде. Кроме того некоторые основные цвета распознаются по своим именам. Например: yellowgreen, или violet. Параметры могут принимать значения: - scr.w = ширина игрового пространства в пикселях (число) - scr.h = высота игрового пространства в пикселях (число) - scr.col.bg = цвет фона - scr.gfx.scalable = [0|1|2] (0 - не масштабируемая тема, 1 - масштабируемая, 2 - масштабируемая без сглаживания), начиная с версии 2.2.0 доступны дополнительно [4|5|6]: 4 - полностью не масштабируемая (с не масштабируемыми шрифтами), 5 - масштабируемая, с не масштабируемыми шрифтами, 6 - масштабируемая без сглаживания, с не масштабируемыми шрифтами - scr.gfx.bg = путь к картинке фонового изображения (строка) - scr.gfx.cursor.x = x координата центра курсора (число) - scr.gfx.cursor.y = y координата центра курсора (число) - scr.gfx.cursor.normal = путь к картинке-курсору (строка) - scr.gfx.cursor.use = путь к картинке-курсору режима использования (строка) - scr.gfx.use = путь к картинке-индикатору режима использования (строка) - scr.gfx.pad = размер отступов к скролл-барам и краям меню (число) - scr.gfx.x, scr.gfx.y, scr.gfx.w, scr.gfx.h = координаты, ширина и высота окна изображений. Области в которой располагается картинка сцены. Интерпретация зависит от режима расположения (числа) - win.gfx.h - синоним scr.gfx.h (для совместимости) - scr.gfx.icon = пусть к файлу-иконке игры (ОС зависимая опция, может работать некорректно в некоторых случаях) - scr.gfx.mode = режим расположения (строка fixed, embedded или float). Задает режим изображения. embedded -- картинка является частью содержимого главного окна, параметры scr.gfx.x, scr.gfx.y, scr.gfx.w игнорируются. float -- картинка расположена по указанным координатам (scr.gfx.x, scr.gfx.y) и масштабируется к размеру scr.gfx.w x scr.gfx.h если превышает его. fixed -- картинка является частью сцены как в режиме embedded, но не скроллируется вместе с текстом а расположена непосредственно над ним. Доступны модификации режима float с модификаторами 'left/right/center/middle/bottom/top', указывающими как именно размещать картинку в области scr.gfx. Например: float-top-left; - win.scroll.mode = [0|1|2|3] режим прокрутки области сцены. 0 - нет автоматической прокрутки, 1 - прокрутка на изменение в тексте, 2 прокрутка на изменение, только если изменение не видно, 3 - всегда в конец; - win.x, win.y, win.w, win.h = координаты, ширина и высота главного окна. Области в которой располагается описание сцены (числа) - win.fnt.name = путь к файлу-шрифту (строка). Здесь и далее, шрифт может содержать описание всех начертаний, например: {sans,sans-b,sans-i,sans-bi}.ttf (заданы начертания для regular, bold, italic и bold-italic). Вы можете опускать какие-то начертания, и движок сам сгенерирует их на основе обычного начертания, например: {sans,,sans-i}.ttf (заданы только regular и italic); - win.align = center/left/right/justify (выравнивание текста в окне сцены); - win.fnt.size = размер шрифта главного окна (размер) - win.fnt.height = междустрочный интервал как число с плавающей запятой (1.0 по умолчанию) - win.gfx.up, win.gfx.down = пути к файлам-изображениям скорллеров вверх/вниз для главного окна (строка) - win.up.x, win.up.y, win.down.x, win.down.y = координаты скроллеров (координата или -1) - win.col.fg = цвет текста главного окна (цвет) - win.col.link = цвет ссылок главного окна (цвет) - win.col.alink = цвет активных ссылок главного окна (цвет) - win.ways.mode = top/bottom (задать расположение списка переходов, по умолчанию top -- сверху сцены) - inv.x, inv.y, inv.w, inv.h = координаты, высота и ширина области инвентаря. (числа) - inv.mode = строка режима инвентаря (horizontal или vertical). В горизонтальном режиме инвентаря в одной строке могут быть несколько предметов. В вертикальном режиме, в каждой строке инвентаря содержится только один предмет. Существуют модификации (-left/right/center). Вы можете задать режим disabled если в вашей игре не нужен инвентарь; - inv.col.fg = цвет текста инвентаря (цвет) - inv.col.link = цвет ссылок инвентаря (цвет) - inv.col.alink = цвет активных ссылок инвентаря (цвет) - inv.fnt.name = путь к файлу-шрифту инвентаря (строка) - inv.fnt.size = размер шрифта инвентаря (размер) - inv.fnt.height = междустрочный интервал как число с плавающей запятой (1.0 по умолчанию) - inv.gfx.up, inv.gfx.down = пути к файлам-изображениям скорллеров вверх/вниз для инвентаря (строка) - inv.up.x, inv.up.y, inv.down.x, inv.down.y = координаты скроллеров (координата или -1) - menu.col.bg = фон меню (цвет) - menu.col.fg = цвет текста меню (цвет) - menu.col.link = цвет ссылок меню (цвет) - menu.col.alink = цвет активных ссылок меню (цвет) - menu.col.alpha = прозрачность меню 0-255 (число) - menu.col.border = цвет бордюра меню (цвет) - menu.bw = толщина бордюра меню (число) - menu.fnt.name = путь к файлу-шрифту меню (строка) - menu.fnt.size = размер шрифта меню (размер) - menu.fnt.height = междустрочный интервал как число с плавающей запятой (1.0 по умолчанию) - menu.gfx.button = путь к файлу изображению значка меню (строка) - menu.button.x, menu.button.y = координаты кнопки меню (числа) - snd.click = путь к звуковому файлу щелчка (строка) - include = имя темы (последний компонент в пути каталога) (строка) Кроме того, заголовок темы может включать в себя комментарии с тегами. На данный момент существует только один тег: $Name:, содержащий UTF-8 строку с именем темы. Например: ``` ; $Name:Новая тема$ ; модификация темы book include = book -- использовать тему Книга scr.gfx.h = 500 -- заменить в ней один параметр ``` > Интерпретатор выполняет поиск тем в каталоге themes. Unix версия > кроме этого каталога, просматривает также каталог ~/.instead/themes/ > Windows версия -- Documents and Settings/USER/Local > Settings/Application Data/instead/themes Кроме этого, новые версии INSTEAD поддерживают механизм множественных тем в одной игре. Давая возможность игроку через стандартное меню INSTEAD выбрать подходящее оформление, из предусмотренных автором игры. Для этого, все темы должны располагаться в игре в подкаталоге themes. В свою очередь, каждая тема -- это подкаталог в каталоге themes. В каждом таком подкаталоге должен находится свой файл theme.ini и ресурсы темы (картинки, шрифты, звуки). При этом обязательно наличие темы-каталога themes/default - эта тема будет загружена по умолчанию. Формат файлов theme.ini мы только что рассмотрели. Однако, пути к файлам с ресурсами в theme.ini пишутся не относительно корневого каталога игры, а относительно текущего каталога темы. Это означает, что обычно они содержат только имя самого файла, без пути к каталогу. Например: ``` mygame/ themes/ default/ theme.ini bg.png widescreen/ theme.ini main3.lua ``` theme.ini ``` scr.gfx.bg = bg.png ; ... ``` При этом, все игровые темы наследуются от темы themes/default. Поддерживается механизм include. При этом, INSTEAD сначала пытается найти одноименную тему игры, и если такой темы не находится, будет загружена тема из стандартных тем INSTEAD (если она существует). Далее, в theme.ini можно изменять только те параметры, которые требуют изменения. ## Модули Дополнительная функциональность часто реализована в INSTEAD в виде модулей. Для использования модуля необходимо написать: ``` require "имя модуля" ``` Или: ``` loadmod "имя модуля" ``` Если модуль поставляется вместе с игрой. Часть модулей входит в поставку INSTEAD, но есть и такие, которые вы можете скачать отдельно и положить в каталог с игрой. Вы можете заменить любой стандартный модуль своим, если положите его в каталог с игрой под тем-же именем файла, что и стандартный. Модуль, это фактически 'lua' файл с именем: 'имя_модуля.lua'. Ниже перечислены основные стандартные модули, с указанием функциональности, которые они предоставляют. - 'dbg' — модуль отладки; - 'click' — модуль перехвата кликов мыши по картинке сцены; - 'prefs' — модуль настроек (хранилище данных настроек); - 'snapshots' — модуль поддержки снапшотов (для откатов игровых ситуаций); - 'fmt' — модуль оформления вывода; - 'theme' — управление темой на лету; - 'noinv' - модуль работы с инвентарем; - 'key'' - модуль обработки событий срабатывания клавиш; - 'timer' - таймер; - 'sprite' — модуль для работы со спрайтами; - 'snd' — модуль работы со звуком; - 'nolife' – модуль блокировки методов life; Пример загрузки модулей: ``` --$Name: Моя игра!$ require "fmt" require "click" ``` > Некоторые дополнительные модули, которые не входят в стандартную > поставку, вы можете скачать из [репозитория > модулей](https://github.com/instead-hub/stead3-modules). Просто > скачайте нужный вам модуль и положите его в каталог с > игрой. Включайте такой модуль с помощью loadmod(). ### Модуль keys Вы можете перехватывать события клавиатуры с помощью модуля "keys". Обычно, перехват клавиш имеет смысл использовать для организации текстового ввода. Для задания того, какие именно клавиши необходимо отслеживать, определите функцию keys:filter(press, key). Эта функция должна возвращать true в том случае, если вы хотите отследить данное событие. Например: ``` require "keys" function keys:filter(press, key) return press -- ловим нажатия любых клавиш end ``` В примере мы просто возвращаем параметр press, который равен true для события нажатия клавиши и false -- отжатия. В key передается символическое название клавиши (в виде строки). Обычно, нам нужно выбрать какие именно клавиши мы хотим перехватывать: ``` require "keys" function keys:filter(press, key) if key == '0' or key == '1' or key == 'z' then return press -- ловим нажатия клавиш z, 1 и 0 end end ``` Итак, keys:filter позволяет выбрать нужные события клавиатуры. А сами события приходят в игру в виде вызова обработчика 'onkey' для текущей комнаты или (если он не задан в комнате) для объекта 'game'. Обработчик onkey действует как обычный обработчик STEAD3. Он может вернуть false и тогда считается, что клавиша не была обработана игрой. Либо он может выполнить какое-нибудь действие. _Внимание:_ Если игра будет обрабатывать _все_ события клавиш, то даже те комбинации, которые используются самим INSTEAD будут обрабатываться игрой, а не интерпретатором. Например, если игра будет перехватывать клавишу "escape" (и не возвращать false из обработчика), то клавиша "escape" перестанет обрабатываться интерпретатором INSTEAD (escape -- вызов меню). Ниже приводится простой пример вывода на экран символических имен клавиш: ``` require "keys" function keys:filter(press, key) return press -- ловим все нажатия end game.onkey = function(s, press, key) dprint("pressed: ", key) p("Нажата: ", key) return false -- давать обрабатывать клавиши интерпретатору INSTEAD end ``` Этот пример можно использовать для того, чтобы выяснить символическое имя конкретной клавиши. При написании аркадных игр бывает полезным не получать событие от клавиатуры, а опрашивать ее (как правило, в таймере). Для этого вы можете использовать функцию keys:state(имя клавиши). Эта функция возвращает true для нажатой клавиши и false -- для отжатой, например: ``` require "timer" require "keys" game.timer = function(s) -- показываем состояние клавиши курсор вправо dprint("state of 'right' key: ", keys:state 'right') p("Состояние клавиши 'вправо':", keys:state 'right') end timer:set(30) ``` ### Модуль click Вы можете отслеживать в своей игре клики по картинке сцены, а также по фону. Для этого, воспользуйтесь модулем "click". Также, вы можете отслеживать состояние мыши с помощью функции: ``` instead.mouse_pos([x, y]) ``` Которая возвращает координаты курсора. Если задать параметры (x, y), то можно переместить курсор в указанную позицию (все координаты рассчитываются относительно левого верхнего угла окна INSTEAD). ``` require "click" function click:filter(press, btn, x, y, px, py) dprint(press, btn, x, y, px, py) return press and px -- ловим только нажатия на картинку end room { nam = 'main'; pic = "box:320x200,red"; onclick = function(s, press, btn, x, y, px, py) pn("Вы нажали на картинку: ", px, ", ", py) pn("Абсолютные координаты: ", x, ", ", y) p("Кнопка: ", btn) end; } ``` _Внимание!_ В INSTEAD по умолчанию включен фильтр кликов мыши, который гасит быстрые клики. Это сделано для исключения эффекта дребезга клавиш мыши. В некоторых случаях фильтр может оказаться нежелательным. В таком случае, используйте функцию instead.mouse\_filter(), которая может быть использована для определения текущего значения фильтра мыши и установки нового (в том числе - выключения), например: ``` function start() dprint("Mouse filter delay: ", instead.mouse_filter()) instead.mouse_filter(0) -- выключили фильтр end ``` Или так: ``` old_filter = instead.mouse_filter(0) -- выключили ... instead.mouse_filter(old_filter) -- восстановили ``` ### Модуль theme Модуль theme позволяет изменять параметры темы на лету. > Имейте в виду, что изменение параметров темы на лету для игр, > которые не содержат собственную тему -- источник потенциальных > проблем! Дело в том, что ваша игра в таком случае должна быть готова > работать с любыми разрешениями и параметрами тем, что крайне сложно > добиться. Поэтому, если вы собираетесь менять параметры темы из кода > -- создайте свою тему и включите ее в игру! При этом, сохранение изменений темы в файле сохранения не поддерживается. Автор игры должен сам восстановить параметры темы в функции start(), как это делается при работе с модулем спрайтов. Для изменения параметров действующей темы, используются следующие функции: ``` -- настройка окна вывода theme.win.geom(x, y, w, h) theme.win.color(fg, link, alink) theme.win.font(name, size, height) theme.win.gfx.up(pic, x, y) theme.win.gfx.down(pic, x, y) -- настройка инвентаря theme.inv.geom(x, y, w, h) theme.inv.color(fg, link, alink) theme.inv.font(name, size, height) theme.inv.gfx.up(pic, x, y) theme.inv.gfx.down(pic, x, y) theme.inv.mode(mode) -- настройка меню theme.menu.bw(w) theme.menu.color(fg, link, alink) theme.menu.font(name, size, height) theme.menu.gfx.button(pic, x, y) -- настройка графики theme.gfx.cursor(norm, use, x, y) theme.gfx.mode(mode) theme.gfx.pad(pad) theme.gfx.bg(bg) -- настройка звука theme.snd.click(name); ``` Существует возможность чтения текущих параметров тем: theme.get 'имя переменной темы'; Возвращаемое значение всегда в текстовой форме. theme.set ('имя переменной темы', значение); Вы можете сбросить значение параметра темы на то, которое было установлено во встроенной теме игры: ``` theme.reset 'имя переменной'; theme.win.reset(); ``` Существует функция, для того, чтобы узнать текущую выбранную тему. ``` theme.name() ``` Функция возвращает строку -- имя каталога темы. Если игра использует собственный файл 'theme.ini', функция вернет точку. Это удобно, для определения того, включен ли механизм собственных тем игр: ``` if theme.name() ~= '.' then error "Please, enable own theme mode in menu!" end ``` Если в игре используется механизм множественных тем, то имя темы начинается с точки, например: ``` if theme.name() == '.default' then -- наша встроенная тема default elseif theme.name() == 'default' then -- стандартная тема default в INSTEAD end ``` Пример использования: ``` theme.gfx.bg "dramatic_bg.png"; theme.win.geom (0,0, theme.get 'scr.w', theme.get 'scr.h'); theme.inv.mode 'disabled' ``` Получить размеры текущей темы: ``` theme.scr.w() -- ширина theme.scr.w() -- высота ``` ### Модуль sprite Модуль sprite позволяет работать с графическими изображениями. Для включения модуля напишите: require "sprite" Спрайты не могут попасть в файл сохранения, поэтому восстановление состояния спрайтов -- задача автора игры. Обычно, для этого используются функции init() и/или start(). start() вызывается после загрузки игры, поэтому в этой функции вы можете использовать переменные игры. На самом деле в модуле спрайт реализованы два модуля: спрайты и пиксели. Но так как они используются совместно, они размещены в одном модуле. Начнем со спрайтов: #### Спрайты Для создания спрайта используйте метод sprite.new, например: ``` declare 'my_spr' (sprite.new 'gfx/bird.png') local heart = sprite.new 'heart.png' local blank = sprite.new (320, 200) -- пустой спрайт 320x200 ``` У созданного спрайтового объекта существуют следующие методы: - :alpha(alpha) - создает новый спрайт с заданной прозрачностью alpha (255 - не прозрачно). Это очень медленная функция; - :dup() - создает копию спрайта; - :scale(xs, ys, [smooth]) -- масштабирует спрайт, для отражений используйте масштаб -1.0 (медленно! не для реального времени). Создает новый спрайт. - :rotate(angle, [smooth]) -- поворот спрайта на заданный угол в градусах (медленно! не для реального времени). Создает новый спрайт. - :size() -- Возвращает ширину и высоту спрайта в пикселях. - :draw(fx, fy, fw, fh, dst\_spr, x, y, [alpha]) -- Рисование области src спрайта в область dst спрайта (задание alpha сильно замедляет выполнение функции). - :draw(dst_spr, x, y, [alpha]) -- Рисование спрайта, укороченный вариант; (задание alpha замедляет выполнение функции). - :copy(fx, fy, fw, fh, dst\_spr, x, y) -- Копирование прямоугольника fw-на-fh из спрайта в спрайт dst\_spr по координатам [x,y] (рисование - замещение). Существует укороченный вариант (как :copy). - :compose(fx, fy, fw, fh, dst\_spr, x, y) -- Рисование - с учетом прозрачности обоих спрайтов). Существует укороченный вариант (как :compose). - :fill(x, y, w, h, [col]) -- Заполнение спрайта цветом. - :fill([col]) -- Заполнение спрайта цветом. - :pixel(x, y, col, [alpha]) -- Заполнение пикселя спрайта. - :pixel(x, y) -- Взятие пикселя спрайта (возвращает четыре компонента цвета). - :colorkey(color) -- Задает в спрайте цвет, который выступает в роли прозрачного фона. При этом, при последующем выполнении операции :copy, из рассматриваемого спрайта будут скопированы только те пиксели, цвет которых не совпадает с цветом прозрачного фона. В качестве "цвета" методы получают строки вида: 'green', 'red', 'yellow' или '#333333', '#2d80ff'... Пример: ``` local spr = sprite.new(320, 200) spr:fill 'blue' local spr2 = sprite.new 'fish.png' spr2:draw(spr, 0, 0) ``` Кроме того, существует возможность работы с шрифтами. Шрифт создается с помощью sprite.fnt(), например: local font = sprite.fnt('sans.ttf', 32) У созданного объекта определены следующие методы: - :height() -- высота шрифта в пикселях; - :text(text, col, [style]) -- создание спрайта из текста, col - здесь и далее - цвет в текстовом формате (в формате '#rrggbb' или 'текстовое название цвета'). - :size(text) -- вычисляет размер, который будет занимать текстовый спрайт, без создания спрайта. Вам также может пригодиться функция: sprite.font_scaled_size(size) Она возвращает размер шрифта с учетом масштабирование, которое выставил игрок в настройках INSTEAD. Если вы в своей игре хотите учитывать такую настройку, используйте эту функцию для определения размера шрифта. Пример: ``` local f = sprite.fnt('sans.ttf', 32) local spr = sprite.new('box:320x200,black') f:text("HELLO!", 'white'):draw(spr, 0, 0) ``` Теперь, рассмотрим варианты применения модуля sprite. #### Функция pic Функция pic может вернуть спрайт. Вы можете формировать каждый раз новый спрайт (что будет не очень эффективно), или можете возвращать заранее выделенный спрайт. Если в такой спрайт вносятся изменения, то эти изменения будут отражены в следующем кадре игры. Так, меняя спрайт по таймеру, можно делать анимацию: ``` require "sprite" require "timer" local spr = sprite.new(320, 200) function game:timer() local col = { 'red', 'green', 'blue'} col = col[rnd(3)] spr:fill(col) return false -- Важно! Так, сцена не будет изменена end game.pic = function() return spr end -- функция: так как -- спрайт это особый объект (не строка) function start() timer:set(30) end room { nam = 'main'; decor = [[ГИПНОЗ!]]; } ``` #### Отрисовка в фон Функция sprite.scr() возвращает спрайт - фон. Вы можете выполнять отрисовку в этот спрайт в любом обработчике, например, в таймере. Тем самым добиваясь изменения фона на лету, без применения модуля theme. Например: ``` --$Author: Andrew Lobanov require 'sprite' require 'theme' require 'timer' declare { x = 0, y = 0, dx = 10, dy = 10, } const { w = theme.scr.w(), h = theme.scr.h(), } instead.fading = false local bg, red, green function init() theme.set('scr.col.bg', '#000000') theme.set('win.col.fg', '#aaaaaa') theme.set('win.col.link', '#ffaa00') theme.set('win.col.alink', '#ffffff') bg = sprite.new(w, h) bg:fill('black') red = sprite.new(w, h) red:fill('#ff0000') red = red:alpha(128) green = sprite.new(w, h) green:fill('#00ff00') green = green:alpha(64) bg:copy(sprite.scr()) timer:set(25) end function game:timer() bg:copy(sprite.scr()) red:draw(sprite.scr(), x, 0, 128) green:draw(sprite.scr(), 0, y, 64) x = x + dx if x >= w or x == 0 then dx = -dx end y = y + dy if y >= h or y == 0 then dy = -dy end return false -- Важно! end room { nam = 'main', disp = 'Test. Test? Test!', decor = 'Lorem ipsum'; } ``` _Внимание!_ Интерпретатор INSTEAD в режиме использования предмета на предмет переводит себя в режим "паузы". Это значит, что в тот момент когда выбран предмет из инвентаря (курсор изменил вид на шестеренки) события таймера перестают обрабатываться до тех пор, пока игрок не применит предмет. Это сделано для того, чтобы не разрывать такт игры. Если для вашего творческого замысла такое поведение является помехой (например, вам не нравится тот факт, что анимация фона замирает), вы можете изменить его с помощью вызова: instead.wait_use(false) Как обычно, поместите вызов в init() или start() функцию. #### Подстановки Вы можете создать свой системный объект - подстановку, и формировать графику в выводе игры с помощью img, например: ``` require "sprite" require "timer" require "fmt" obj { nam = '$spr'; { ["квадрат"] = sprite.new 'box:32x32,red'; }; act = function(s, w) return fmt.img(s[w]) end } room { nam = 'main'; decor = [[Сейчас мы вставим спрайт: {$spr|квадрат}.]]; } ``` #### direct режим В INSTEAD существует режим прямого доступа к графике. В теме он задается с помощью параметра: scr.gfx.mode = direct Этот параметр можно заранее выставить в theme.ini, или воспользоваться модулем theme. Или (что лучше), специальной функцией: sprite.direct(true) Если режим удалось включить -- функция вернет true. sprite.direct() без параметра -- возвращает текущий режим (true -- если direct включен.) В этом режиме игра имеет прямой доступ ко всему окну и может выполнять отрисовку в процедуре таймера. Экран представлен специальным спрайтом: sprite.scr() Например: ``` require "sprite" require "timer" require "theme" sprite.direct(true) local stars = {} local w, h local colors = { "red", "green", "blue", "white", "yellow", "cyan", "gray", "#002233", } function game:timer() local scr = sprite.scr() scr:fill 'black' for i = 1, #stars do local s = stars[i] scr:pixel(s.x, s.y, colors[s.dy]) s.y = s.y + s.dy if s.y >= h then s.y = 0 s.x = rnd(w) - 1 s.dy = rnd(8) end end end function start() w, h = theme.scr.w(), theme.scr.h() w = std.tonum(w) h = std.tonum(h) for i = 1, 100 do table.insert(stars, { x = rnd(w) - 1, y = rnd(h) - 1, dy = rnd(8) }) end timer:set(30) end ``` Еще один пример: ``` require "timer" require "sprite" require "theme" local spr = sprite declare { fnt = false, ball = false, ballw = 0, ballh = 0, bg = false, line = false, G = false, by = false, bv = false, bx = false, t1 = false, } function init() fnt = spr.fnt(theme.get 'win.fnt.name', 32); ball = fnt:text("INSTEAD 3.0", 'white', 1); ballw, ballh = ball:size(); bg = spr.new 'box:640x480,black'; line = spr.new 'box:320x8,lightblue'; spr.direct(true) end function start() timer:set(20) G = 9.81 by = -ballh bv = 0 bx = 320 t1 = instead.ticks() end function phys() local t = timer:get() / 1000; bv = bv + G * t; by = by + bv * t; if by > 400 then bv = - bv end end function game:timer(s) local i for i = 1, 10 do phys() end if instead.ticks() - t1 >= 20 then bg:copy(spr.scr(), 0, 0); ball:draw(spr.scr(), (640 - ballw) / 2, by - ballh/2); line:draw(spr.scr(), 320/2, 400 + ballh / 2); t1 = instead.ticks() end end ``` _Внимание!_ direct режим может быть использован для создания простых аркадных игр. В некоторых случаях, вы можете захотеть убрать указатель мыши. Например, когда игра управляется только с клавиатуры. Для этого воспользуйтесь функцией instead.mouse\_show() ``` instead.mouse_show(false) ``` При этом в меню интерпретатора INSTEAD указатель мыши все еще будет виден. #### Использование sprite совместно с модулем theme В функции start и в обработчиках вы можете менять параметры темы, в том числе, используя в качестве графики спрайты, например: ``` require "sprite" require "theme" function start() -- заменим фон на спрайт local spr = sprite.new(800, 600) spr:fill 'blue' spr:fill (100, 100, 32, 60, 'red') theme.set('scr.gfx.bg', spr) end ``` Используя эту технику, вы можете наносить на фоновое изображение статусы, элементы управления или просто менять подложку. #### Пиксели Модуль спрайтов поддерживает также работу с пиксельной графикой. Вы можете создавать объекты -- наборы пикселей, модифицировать их и рисовать в спрайты. Создание пикселей осуществляется функцией pixels.new(). Примеры: local p1 = pixels.new(320, 200) -- создали пиксели 320x200 local p2 = pixels.new 'gfx/apple.png' -- создали пиксели из -- изображения local p3 = pixels.new(320, 200, 2) -- создали пиксели 320x200, -- которые при отрисовке их в спрайт -- будут смасштабированы до -- 640x400 Объект пиксели имеет следующие методы: > при описании использованы обозначения: r, g, b, a -- > компоненты пикселя: красный, зеленый, синий, и прозрачность. Все > значения от 0 до 255). x, y - координаты левого верхнего угла, w, h > -- ширина и высота области. - :size() -- вернуть размер и масштаб (как 3 значения); - :clear(r, g, b, [a]) -- быстрая очистка пикселей; - :fill(r, g, b, [a]) -- заливка (с учетом прозрачности); - :fill(x, y, w, h, r, g, b, [a]) -- заливка области (с учетом прозрачности); - :val(x, y, r, g, b, a) - задать значение пикселя - :val(x, y) -- получить компоненты r, g, b, a - :pixel(x, y, r, g, b, a) -- нарисовать пиксель (с учетом прозрачности существующего пикселя); - :line(x1, y1, x2, y2, r, g, b, a) -- линия; - :lineAA(x1, y1, x2, y2, r, g, b, a) -- линия с AA; - :circle(x, y, radius, r, g, b, a) -- окружность; - :circleAA(x, y, radius, r, g, b, a) -- окружность с AA; - :poly({x1, y1, x2, y2, ...}, r, g, b, a) -- полигон; - :polyAA({x1, y1, x2, y2, ...}, r, g, b, a) -- полигон с AA; - :blend(x1, y1, w1, h1, pixels2, x, y) -- рисовать область пикселей в другой объект пиксели, полная форма; - :blend(pixels2, x, y) -- короткая форма; - :fill\_circle(x, y, radius, r, g, b, a) -- залитый круг; - :fill\_triangle(x1, y1, x2, y2, x3, y3, r, g, b, a) -- залитый треугольник; - :fill\_poly({x1, y1, x2, y2, ...}, r, g, b, a) -- залитый полигон; - :copy(...) -- как blend, но не рисовать, а копировать (быстро); - :scale(xscale, yscale, [smooth]) -- масштабирование в новый объект pixels; - :rotate(angle, [smooth]) -- поворот в новый объект pixels; - :draw_spr(...) -- как draw, но в спрайт, а не пиксели; - :copy_spr(...) -- как copy, но в спрайт, а не пиксели; - :compose_spr(...) -- то же самое, но в режиме compose; - :dup() -- создать копию пикселей; - :sprite() -- создать спрайт из пикселей. Также, есть возможность работы со шрифтами: - pixels.fnt(fnt(шрифт.ttf, размер) -- создать шрифт; При этом, у созданного объекта "шрифт" существует метод text: - :text(текст, цвет(как в спрайтах), стиль) -- создать пиксели с текстом; Например: ``` local fnt = pixels.fnt("sans.ttf", 64) local t = fnt:text("HELLO, INSTEAD!", 'black') pxl:copy_spr(sprite.scr()) pxl2:draw_spr(sprite.scr(), 100, 200); t:draw_spr(sprite.scr(), 200, 400) ``` Еще один пример (автор примера, Андрей Лобанов): ``` require "sprite" require "timer" sprite.direct(true) declare 'pxl' (false) declare 't' (0) function game:timer() local x, y, i t = t + 1 for x = 0, 199 do for y = 0, 149 do i = (x * x + y * y + t) pxl:val(x, y, 0, i, i / 2) end end pxl:copy_spr(sprite.scr()) end function start(load) pxl = pixels.new(200, 150, 4) timer:set(20) end ``` При процедурной генерации с помощью pixels удобно использовать шумы Перлина. В INSTEAD существуют функции: - instead.noise1(x) - 1D шум Перлина; - instead.noise2(x, y) - 2D шум Перлина; - instead.noise3(x, y, z) - 3D шум Перлина; - instead.noise4(x, y, z, w) - 4D шум Перлина; Все эти функции возвращают значение в диапазоне [-1; 1] а на вход получают координаты с плавающей точкой. ### Модуль snd Мы уже рассматривали базовые возможности по работе со звуком. Модуль snd имеет еще некоторые функции по работе со звуком. Вы можете подгрузить звук и держать его в памяти до тех пор, пока он вам нужен. ``` require 'snd' local wav = snd.new 'bark.ogg' ``` Кроме подгрузки файлов, вы можете загрузить звук из массива lua: ``` local wav = {} for i = 1, 10000 do table.insert(wav, rnd() * 2 - 1) -- случайные значения от -1 до 1 end function start() local p = snd.new(22050, 1, wave) -- частота, число каналов и звук p:play() end ``` Звук задается в нормированном формате: [-1 .. 1] Звук можно проиграть методом :play([chan], [loop]), где chan -- канал (0 - 7), loop - циклы (0 - бесконечность). Остальные функции модуля: - snd.stop([channel]) – остановить проигрывание выбранного канала или всех каналов. Вторым параметром можно задавать время затухания звука в мс. при его приглушении; - snd.playing([channel]) – узнать проигрывается ли звук на любом канале или на выбранном канале; если выбран конкретный канал, функция вернет хандл проигрываемого в данный момент звука или nil. Внимание! Звук клика не учитывается и обычно занимает 0 канал; - snd.pan(chan, l, r) – задание паннинга. Канал, громкость левого[0-255], громкость правого[0-255] каналов. Необходимо вызывать перед проигрыванием звука, чтобы имело эффект; - snd.vol(vol) – задание громкости звука (и музыки и эффектов) от 0 до 127. Еще одна интересная возможность -- генерирование звука на лету (пока находится в экспериментальном статусе): ``` require "snd" function cb(hz, len, data) for i = 1, len do data[i] = rnd() * 2 - 1 end end function start() snd.music_callback(cb) end ``` ### Модуль prefs Этот модуль позволяет сохранять настройки игры. Другими словами, сохраненная информация не зависит от состояния игры. Такой механизм можно использовать, например, для реализации системы достижений или счетчика количества прохождений игры. По своей сути prefs это объект, все переменные которого будут сохранены. Cохранить настройки: ``` prefs:store() ``` Настройки сохраняются автоматически при сохранении игры, но вы можете контролировать этот процесс, вызывая prefs:store(). Уничтожить файл с настройками: ``` prefs:purge() ``` Загрузка настроек выполняется автоматически при запуске игры (перед вызовом функции start()), но вы можете инициировать загрузку и вручную: ``` prefs:load() ``` Пример использования: ``` -- $Name: Тест модуля prefs$ -- $Version: 0.1$ -- $Author: instead$ -- подключаем модуль click require "click" -- подключаем модуль prefs require "prefs" -- устанавливаем начальное значение счетчика prefs.counter = 0; -- определяем функцию отслеживания количества "кликов" game.onclick = function(s) -- увеличиваем счетчик prefs.counter = prefs.counter + 1; -- сохраняем счетчик prefs:store(); -- выводим сообщение p("На данный момент сделано ", prefs.counter ," кликов"); end; -- добавляем изображение, по которому можно производить клики game.pic = 'box:320x200,black'; room { nam = 'main', title = "Комната кликов", -- делаем фиксацию статичной части описания -- добавляем описание для сцены decor = [[ Этот тест был написан специально для проверки работы модуля <>. ]]; }; ``` Обратите внимание, что после запуска игры заново, число выполненных кликов не обнулится! ### Модуль snapshots Модуль snapshots предоставляет возможность восстанавливать предварительно сохраненные состояния игры. В качестве примера, можно привести ситуацию, когда игрок выполняет в игре действие, ведущее к проигрышу. Модуль позволяет автору игры написать код так, что игрок вернется к предварительно сохраненному состоянию игры. Для создания снапшота используйте функцию: snapshots:make(). В качестве параметра может быть задано имя слота. _Внимание!!!_ Снапшот будет создан после завершения текущего такта игры, так как только в этом случае гарантирована непротиворечивость сохраненного состояния игры. Загрузка снапшота осуществляется snapshots:restore(). В качестве параметра может быть задано имя слота. Удаление снапшота делается с помощью snapshots:remove(). Следует удалять ненужные снапшоты, так как они занимают лишнее место в файлах сохранения. Пример использования: ``` require "snapshots" room { nam = 'main'; title = 'Игра'; onenter = function() snapshots:make() -- создали точку восстановления end; decor = [[{#red|Красное} или {#black|черное}?]]; }: with { obj { nam = '#red'; act = function() p [[Вы выиграли!]] end; }; obj { nam = '#black'; act = function() walk 'end' end; } } room { nam = 'end'; title = 'Конец'; }: with { obj { dsc = [[{Переиграть?}]]; act = function() snapshots:restore() -- восстановились end; } } ``` ## Методы объектов У всех объектов STEAD3 существуют методы, которые используются при реализации стандартной библиотеке и, обычно, не используются автором игры напрямую. Однако, иногда полезно знать состав этих методов, хотя бы для того, чтобы не называть свои переменные и методы именами уже существующих методов. Ниже представлен список методов с кратким описанием. ### Объект (obj) - :with({...}) - задание списка obj; - :new(...) - конструктор; - :actions(тип, [значение]) - задать/прочитать число событий объекта заданного типа; - :inroom([{}]) - в какой комнате (комнатах) находится объект; - :where([{}]) - в каком объекте (объектах) находится объект; - :purge() - удалить объект из всех списков; - :remove() - удалить объект из всех объектов/комнат/инвентаря; - :close()/:open() - закрыть/открыть; - :disable()/:enable() - выключить/включить; - :closed() -- вернет true, если закрыт; - :disabled() -- вернет true, если выключен; - :empty() -- вернет true, если пуст; - :save(fp, n) -- функция сохранения; - :display() -- функция отображения в сцене; - :visible() -- вернет true если считается видимым; - :srch(w) -- поиск видимого объекта; - :lookup(w) -- поиск любого объекта; - :for_each(fn, ...) -- итератор по объектам; - :lifeon()/:lifeoff() -- добавить/удалить из списка живых; - :live() -- вернет true, если в списке живых. ### Комната (room) Кроме методов obj, добавлены следующие методы: - :from() -- откуда пришли в комнату; - :visited() -- была ли комната посещена ранее?; - :visits() -- число визитов (0 -- если не было); - :scene() -- отображение сцены (не объектов); - :display() -- отображение объектов сцены; ### Диалоги (dlg) Кроме методов room, добавлены следующие методы: - :push(фраза) - перейти к фразе с запоминанием ее в стеке; - :reset(фраза) -- то же самое, но со сбросом стека; - :pop([фраза]) -- возврат по стеку; - :select([фраза]) -- выбор текущей фразы; - :ph\_display() -- отображение выбранной фразы; ### Игровой мир (объект game) Кроме методов obj, добавлены следующие методы: - :time([v]) -- установить/взять число игровых тактов; - :lifeon([v])/:lifeoff([v]) -- добавить/удалить объект из списка живых, или включить/выключить живой список глобально (если не задан аргумент); - :live([v]) -- проверить активность живого объекта; - :set\_pl(pl) -- переключить игрока; - :life() -- итерация живых объектов; - :step() -- такт игры; - :lastdisp([v]) -- установить/взять последний вывод; - :display(state) -- отобразить вывод; - :lastreact([v]) -- установить/взять последнюю реакцию; - :reaction([v]) -- установить/взять текущую реакцию; - :events(pre, bg) -- установить/взять события живых объектов; - :cmd(cmd) -- выполнение команды INSTEAD; ### Игрок (player) Кроме методов obj, добавлены следующие методы: - :moved() -- игрок сделал перемещение в текущем такте игры; - :need_scene([v]) -- нужна отрисовка сцены в данном такте; - :inspect(w) -- найти объект (видимый) в текущей сцене или себе самом; - :have(w) -- поиск в инвентаре; - :useit(w) -- использовать предмет; - :useon(w, ww) -- использовать предмет на предмет; - :call(m, ...) -- вызов метода игрока; - :action(w) -- действие на предмет (act); - :inventory() -- вернуть инвентарь (список, по умолчанию это obj); - :take(w) -- взять объект; - :walk/walkin/walkout -- переходы; - :go(w) -- команда идти (проверяет доступность переходов); ## Послесловие Вот и все, здесь документация заканчивается. Но, возможно, начинается самое интересное -- ваша история! Я сделал первую версию INSTEAD в 2009 году. В тот момент я никогда бы не подумал, что моя игрушка (и движок) переживут столько изменений. Сейчас, когда я пишу это послесловие, на дворе 2017 год и текстовые приключения все еще существуют. Правда, их влияние на культуру по прежнему минимально. И хороших приключений -- по прежнему очень мало. На мой взгляд, у текстографических игр огромный потенциал. Они не такие интерактивные, они не отбирают вашу жизнь взамен на вечно неудовлетворенное желание, не вынуждают вас сутками просиживать за монитором в раздражении или нездоровой нервозности... Они могут взять лучшее из мира литературы и компьютерных игр. И то, что жанр по большей части некоммерческий -- даже плюс. История INSTEAD, на мой взгляд, хорошее тому подтверждение. Было выпущено множество игр, которые можно с уверенностью назвать отличными! Их авторы могут отойти от дел, но созданные ими произведения уже живут своей жизнью, отражаясь в сознании людей, которые в них играют или помнят. Пусть "тираж" этих игр не так велик, но то что я увидел, полностью "оправдало" все потраченные усилия на движок. Я знаю, что это время потрачено не зря. Так что я нашел в себе силы, и сделал движок еще лучше, выпустив STEAD3. Я надеюсь, он понравится и вам. Так что если вы дочитали до этого места, я могу только пожелать вам дописать вашу первую историю. Творчество -- это и есть свобода. :) Спасибо и удачи. Петр Косых, март 2017. instead-3.2.1/doc/stead3.pdf0000644000175000017500000115203713267072001014616 0ustar peterpeter%PDF-1.5 % 6 0 obj <> stream x=!{b_\a Yi 03,}H\o:6ڟ$Gb^$^A4kթͷeZ@%vY$*Rj*P`[EAeU9/AJP0i@fU.{ۂaW2=:Y85#P:a endstream endobj 10 0 obj <> stream xS(T0T0BCs# 2PHUp Qw3T3117QIS0337P56ԳPI1004 Rp Q( endstream endobj 42 0 obj <> stream x횹n$7s?EbX(0` Lf8ii $V1X5CXſOiڡNA @Jşs|O??OsrJe(RAJE~7ϭ`[D"*요Fa~S/m^hX9թTRHp< Bᅿ"̸dX Tk4wa؅DI$[H@8혠B7N˂Kɀ0Xme82XÝKLBl9x:>tc77ZJ}7UL.ͶX ҂ ®3^xy4jQBz߂ (P3IfK;mֱuqc/2:y|"El8u/8?ۧ0%bFHɲ:^>] pTY]ÆIbt+j,~s'›2 HhRP `gU2<[< TdoSGcBr A֔)Z)ՁTgu?KXJs=> 1joAZ-d[QPIfqq IiK*y&OLŷ>͑U;w+K0~ׂ1&-ޔ"/iAgiKXs4GɄl@"vhޅ-yYĜ? ')q-Pf,gNc EØ jכ{j֠ȋ); "弈%_"IL/BkD>O26($<( (lݴ$;2 Inw!+ٶSӕ/t2ԁV ST˱{ e9tv%ȃ/ٟO' T-%Y|ně.ElIvpB׽{(Jc3^(̢0^[&4ZAKA&EDCs1IȺLi/}ON8.'ƅciFAs_NHUIWJ6A^H> stream x훹6s?^`h0830@Rwg)%Q=-6HIױÿ0!?`AAZ1&?@(E(Dn[[ _`+y%C01yy S1 >'pBÒ=}Q+ihl>u%ÓkSa¾5^m䰯E9z~5JMU-n"rZv& l;`\%mZ!I9C[iJL,QLh29FXj57wQ8-~j~7s';/f>HKhYǨɱ'AShSY6y3U+M/_jW}zbh9қVOI0u?4/=cwҜwg h6QF¢fK0} 0)՘iQ|BA LʔG)X}ø>~ǐ^z O"<$o_7\L9Ҏ3Y\ȉjL%ZŖg-ҞoA d>_ڭ4s!U|:,Up[Hʌd.ڪT_yK|z0-}eӈ&.Qx~7[ܒ1 bYLɺa_q\/tJ1Snݎ&!5-W_lè*]B!Zb__ۚ"f kNa֗y{몠tai|9kҕU06'W.ə"1T c[ FҨ6>XGU@lMY;n+yq-y:)hr<8Ddhc;j;_ MoPfTVM!r Q&-.%x$!.qc.֡ë׎$aDU@9WousY^=O2tF>2" nTş/eInLh` 1ixu ްtrH-A]vVӔ`捄:k O\o-<%O_4y+ ץHbK<Hb|O= !mމxҗf=@/פȿ~;N endstream endobj 107 0 obj <> stream x홿n0>^CvV[AVCG%Ydib#9IݹpCkRiߥoKNEqNX~}!~qG12ha߇On&A++>~ѷC;[ʊ)4;'ʉ۴01McH#M#LHk߉d=9°1^tF+Sg2{˧]|ַ(1-16PBK },Ƌ5Bj ebL#yXK>܂ljl塱1!,{1#Aca0#?Meqe9|@۴4+áFˍ\VPRTıD6ӣP0.|Tѹgy=uۄĪL 3>9)4J g~FMS @$d)@"K`sgR:G V` R۔Q޺8hnEO9F]Qd؃NFJW{V~)ko"Đ":`Z'oAYbO{dUGԘf5'IelZAIt!eMMj (C*&[}Lx,tjE5|3G2cejЀԂIu3 S'^Zc>]1uY'+ع,ڢgZķm?wwE윻}y>5|O䴻OI##%^V0-;oAūMPjYCv+V(@R౯ &śiJwpkE.q|BSTIz> stream xM 1D{b~d A ;a;P,MAYoxlĐj11X&wt8qXĒsrv-f|"rI*!p^}ɗ! endstream endobj 113 0 obj <> stream xڝX6 ~dɒ#CCg+:Cě(NNs$I(nHp{kn>kti8sw#xi npE)ώ֩+P?E 8Γ| vʊshem}SBMy,ҠgvńxB ը*G;*D`+ÓvQ2FXVJUI3;dYHRȑ|7M8ڞ۬e(H:]( I$Y%-6*+l"od CC6T("EXy J*PWܢ&S4>Xo" ~*x)H+Rnϳ RW:Au46"LjSi%Y&PJL= fWQ)cCw,=r4H|9ū/tqVjN,XffAd~Wi 1連uiOfqfC{-pHs*Af:R+{g鱊nV yWy칚^@@bsϩFs Ҙm< o˿d*2:&Sa6rB 2xޥ4K qb#&#F'ljA0odSSSBqOQ< #89PT,-t67Hm2ʌ> stream xڝY6 q pS ]qw")^~(CN_g;n>!t{l?yۏcs7.~^z?c1vp\6t{8c[syd\kPEbYGo9>2q>V3\ . eF WBUe~򾻹"M쎸,-Ǒ O)⋴fkYf⑩a|w@;g,!^W-2`YnuQ7V Tgu#8'+!_&x^.s<|QDfP(͖Vz|}:.`'qDr޳y*U?"sGu"#1[O `CڏlYOIC+m.Cnyt[\+ݍ/o+ݷ،`JlB .4ֈ%>ʹxf;C5Qd Yi8h:"CxT' n|Kg[&ݤ'(FjN4'?¢oqtp*lm!W(+ $B=e3J2SA8 sAeщ/.xΐf3.\>CBD]ﳔVFS;쬫<&Ԗd~ײvxȀi1sz^q:7L,C<NPV[HQeUݲUJӠ: J4)c$t"uZ]y>2+ⱗyX=]kzXrk *"w }B9\pH(+C,ހN}V[r0 {Q{eAPX/O Dٶ<`7왩X8;]+M;֌{\Z5qR'YܒtEŜeПt wY|1##:pRPc8=F/5$U)ʿUD"TCuϰS펮kPz5Q*xp$uz$^lWАMMO~9F6ZQ|r,/έ X:$Ԑ챾>ɹ‰b> stream xڝZˎ6)j@Ev]]No*Qdsxd(Eo*ӷ?m{qxzvǧפ]( e#EeGm|}ITI{{;r@lJ(gr*\9[bk6)je߿A @o?Q(=+ s<҉"ʣV264Tg^ U !G*0fl+JP'|ZQ@;K/_8O͂~r$}ۗvQ#&&V;LTP P=t'*O:(>xY[`l$oa> ȎZ\@`p9GS{5n g ՌCzB&#iHJT7mTh'=5l<'8 R`(B1m.g&³3G IUzpD33=zM^S }/7)tS@ EhlO{6vBjE.GY+6$Z+ACB &|>QxGk:V?q3A@$%~ ;݅RKdi:jdIoaiN?o%ߧUxE[ԙx^;^eWf_; TB7t=֍6ac$^D2fdtA@YtsK7>7G` LJ@PEWy؈UGde"S1 _hl2ܦCSPp-S<,!Ge&yJt5 oL?Sp/NY RҶٳjfZj{ƙžq6Iy^8^4X+R^Nê@\Hΐsѵgo79BZ rah`X뗱 z& g“^8FΓM[4 !n!YVPl f =|皴|Z5.2bc)lyZJ琦Bi\9bВx(K?'gl=tO4niSuzE#'4a,AJh-v8R{^$!CӲyTsv1VUMY6KT*SDA'6ŝ90I$rucqf ٥;,ىJ̪tEt?y}_zܣl&zEԉBeh v2ԙ:\ ո9E!N1% څ2ʄ@NeP<5$Y VwE%&<]5.7,KTF.RZdUkE;g)>SuR|#nQ# B-N}E)q ủV !*#])TH ~&}Tj˪01hzRCah1c;iT`Kq^',zQMqh!tU])ҳRQy;\8Y.i'3MŤl*,Pt(s%'B pO~C=qt( z9\PF@֟iJX雀k~

Ci|sit]P;/8Iճ\S o1(Ӛ h207ZŽ7-Alv U+V4<O .eA6u U!><ŧǗqԠ7"~0ʱ3_l՗Năe }how2׶\-YYl=:qV0 y!ZlWsdGU~L^^W\1XW\ND}ڥpJ7BsY vWi4m=̻z5̓+? a:ļƛa^*(AIXwޯr2 G}\NB\s31e_qK;>ɪ곺zJow5~cgI[o=l=N\>!F9-/x.E6^kIhN y]=״]#1A7o0)dc;/oB$ ȿO2wNO/ cqRp~( endstream endobj 124 0 obj <> stream xX6 q%`qI.vA ?-M(>$ؙA H"g? _̐G'?|C4pqfLi~0(:a覄k.`vτc.o.a]&p(G`gnEΖ,{ ) AQ@\%l[(}#Q|H]E5{ CY^H'cD c<?SLplxOH_EOfyFkU6JXjZA\!YX5OR^tr5U̫BoLrCߩyl>cc> jxP䩿!29kㅄ;}w 䉮w dЦn5DT )ftvhIڡ67 \T|>Ҳh<4߮MEBl5Wij= FgCCCS\5yW) y!RB[Şjj2Vl%#EF oN]쨗RBS9%虧(qݵP=Kx5f]Euљ88 U^wM/ӏ"+9+^CKzUvn!ʞ/o+\}x7n֏-czWo}f] endstream endobj 127 0 obj <> stream xڥY6;\% 0\Htnڥ7ɲ}_wp8 埋8/}?wuxn)]|wbwF+yw'x<<Ż[p~-~\c82̳(T .!e@J`Nƙ 7bľR' sBwŬK>+ \\&iw'"T~82;S{᝕rl"T+<^KQʲo\2WJ2 _pPi2Dc5PzZ!Ղ2k* -2QF#|34u;{E*BuidOQv!"^1W;|{q&7QY;.5DUhc5 Ҋj`9Hu;EJ =(u!NsT:kLv.L Ӻ~j=04`3 w86IOmwqwP%!dnAQm2Me2vեQPO\]HN58wb|058m.M$H)bT V}NVʦM@h$9p]hu*$疪5\>VjIE0)ng0Ѯ=] JKpLy,foJHO(/ġIMѪ̾ P1i)<ä-20TqMT d+̣.P`IP˻*ָ1b Q1J j|Bh"UZY$/8G9xx{Nذ`S&+_iG!kXjns\9 n$9nBKA(~ XV ++·B&֣kpQ rAR0!qxȥBuip!S%֎'Aǀ6'GغWm;*`c_XC,hR_\4٢mZPʥ5\ƅSkD)dہoxA['R gWelٮY gͯ@<{Ǜ%LD4iWD\gE%[l;-kRkv!0zB{Š^p'KoEY(S7\FJAnY#K963=bqK MV36nX""2`Jd*" ڠ#{&h\a"s= 0y|5w|]rhk+E`i1v#=xKJ!j ,xmY}Ly$Z*Y ?!:ZDf6kb/lC\df.&g`oocP:A_1=s:6r|}B{z<:9M;)SˊXb═8xnmg勽t*f SJE\U$ӲÒh&'K%T'E>=E5ani#j[XSG9\=n{.BmZ_Y3r endstream endobj 131 0 obj <> stream xڥY=4 )ş=s3P1sPdMGoЧdw;@dmYd鑬??Lwo~4|l/X/ O;GCRĩO"[wg-f,mr 7LW 8Se -UpK@)G+/c"uxPesowSx±EW;x_ί |(&y;;L @{d\buBقn&1FY'{LŸ]e@KV/pcVxC cL]~exf•pYeۏ8+JE説 ?#Db[?wwdθ,^#pQ-yD&WZ U/w[d$QfBk$]d8Wr1ph+/s2=xdjC=;5 dgI΋tߙ$]7v/~IHۑa20?fXGQ&17" Qk/EAְYTjA?scL`mՀnf&}hHOhsfMj\$ Cn*@\ l 9ɻ/s͚p@P@~ʳfp(zv8qUl{6h޷Ӈ͸l!wrb7kqL57# 6}Q&-X|6F$i VTzUww;_[ KWMM!t]" XlQx1ifIwJ-Eg0%i𖗪jBIFPBc6Rx6ICg%>> 2kЬ&k$As@1.0m]r^r^)w2b-7ˣ3pYM8收X=fT4ǒU4J"QYElSP ՍnZ'iOZv)H#'`LSSvhi62"W{;W^j&N:4K'­;88|"ԭ3L$gl\Un2 s9$j\=RKz1Ȫqmz#o{›_LՐn4C: ");=M5q5 tozidt7SMP苘.tc77iC@ yJ=CQļf`@kv-Kt x?3CJعC঎fJ + wȝ] &01:i҉4|D;Եcc/mnYd2NÇ@Wvsc\LFMe oYffMkf{"T)ef.q>,=OY-/V[}chڱ]w:r)5 kme{҈LߕXKtSRMm2ciMa͛O,Q8X\-ri-nV/-׆a>qC{EϘᵿ(+]Ǐ endstream endobj 134 0 obj <> stream xڝ6WM \Ht dpH{ YI `} B6t|nqz=c\\[6~6vKpMpEz~?3q.+#\+<;?_QsGb%c+5k~{[mz t}$Z \pdKZ_;`}:j)Ɠ" <к+Zu|c2µ³BMHAo -x^p@)3%0f_ g<@rM șsb=5&aZ(oee!)ƌ2ycd1 ݰBX| rOYռ*DGe1VM|¥Y1zQId\zOȐ ~鸷+FַrӺN; o@dދ;&-9|Pv#G-p e[AVՅZ18Qgw$:bj@ě UI flT񠤰Jƅ;8dwJ{2I 7h(v4{,U$e. 3=FNRVû#ٽ :!ߩSg$دsSβ%s`oK|nE/r[6,Z֯ywtTR%sy:|)a8#_;᾽@tO@yoW>M剷sz"=.q;PLF퓩WWVGu1fG!3 {e}3vv$2Q8\tesՉ_' endstream endobj 137 0 obj <> stream x6W o 0\Ht RȒե7Ado4.As碇7xa{k77LK!kp : E\ ʈ< =඀kS~)oxW$+-V/:"%thQd/*'<q9}Y1ΚDhI,<DPݯ',ɇ =Qj'BV(l ȹR\ }$sn8z5Q]f${P\̃Ȋ){_$Qç2pr!S=Ot$yC%[ ՋNgb[ɜ|hEIMf$J}i:n {H2 pRI13bJRQNOglkcb\vނIh!j5pk5fi{h', -C:{N_}1AhazM+Ɂhoۡ 0b:a/gDIVȑFqRHC^>U%BjM]SkN㳚xQئnV;m2.i'z糎EHw *Δy@F#WR]Q2t*uY4'͙jՒOWB0Ԟ4mر$+DGܤF.Qt6 {;7V@yE!U)wtl\N+ K&bk[):0RadG@2ӌE\^dc-9vx={;x[tt=zW R/"0Fc& VV#ˤQ27F/.BJ;yhe㨽1Mjnqh2a'}#A;c eQC^H,/~0+ 40њ|5PxSԊ!SK6a5e6ky2f$!3HGW:N=cIaF:RsؽY+)}E,' ?; м5 !D!uZ%۰Ԃ/da5LmXZMR3C:S;Ii93fy/g3"s$ ߟ~|CUIHUŹt\Ο 'rV1h< "I?\рZ8[S?؎F=[ܭZS0rn>u ^W5O@I0⧏D}p*4$,$>;dCzukn*,ZpEys` endstream endobj 140 0 obj <> stream xڍX;6 +'Re-t Rc" EְOK:GKH{~~>8u{C?{@𽧏遼mqޡ<$~/ D ̐~ )D|)} Ӈ|q.犉>! Do68^ wBemp/录I6z뎛+(C׋GyÝʊSfىE  $nų0eQy%=E8 _)N2;u_"g2kaVE3\Y$ kE ž$oz ]\.DJY~|:*u!Do"mLL^$NV> *ч4 Rޱa".ćBXG!M4&e^Q|qṸH+>Ym5U[nDB4z^MKxײ5#Dl3XnԷa0x)MGtrxLYKmŇOnG:vDyH\^X >) SF:ki: IȈ;8wkrzѳTE`dʳ0\;3=[RE~ H;V.ՕG{B=ƫ C&n*ZC (9ǖMM?eށ/+IR}\pc">1Ym@*O{'G#އ\;U|]VvxY1B{ʷʐ eqEV'+ݷN*v,I犄>.wbcĻ<.Tl&7I=ZsFkTf@فADO 7y޳W*3$x$/ژO=vB5%K8T˱ㅺ:ZGCN: J_ sj~WuQtwa7Zsq`g|^J}29me')F;z,8NYEGPsLdQq*%y(a]Lh/ý\l`nkw5a)(~mO%Fo _JֻS[2PletXO2zТ?'= ZEߵ8\uUo+┛a7$zXh nL46簯٤)\> v.—br'XpL'/t"]jZ=PYy0U(BeH63; Dbj_2ܴWq6>׫Խ+S•n6EJZvͶ_6Ukׅ<+Ձ!bOzǀc``kT~g endstream endobj 143 0 obj <> stream xX6 ~Կ g(pЭيqloK)(NN9")|55 ? ?_>az \S3q>o>"v&ZIfl#{~~\\0Ea>. m|̿}>듦k3\FD:fpD>.ƌ(ˆ8:"H[+-eq( VOXiqL"$s y|RzD^FYyAM9gK]LNӣ"՘XVAQo̬íśm%TbtⴉAFVjm. c,ǝ-L,Ʋ+e/kђ ;MQ8o/)dďxMFRl⼇3'+-dˬܛ"-ձZ+I ѦdD1٠-ق[q$0gT\0y-TN% t8GRp֌W[@+%`<+q|@$ emoQn},2e'EY Jx`p+ sϰZZB9(w9O)K0Z:[^_gJ3KT0֒{z=gCG?|t::,P l y@%wu n5|iO_N/ s ;0 nD-Le(@d t b')E2xIǗcGPCm`w>bf+%] jJVIʺ}4&ëBͭZ[Wהy탋.Ä5WNIT^c(֓:cKǩ0g/i^j=5!zn@7Y ~|hqL s^.`EiA^UyO=];pSeSl*iodzT>6._y+=&kNQv]WW)j0d+Ӭ AWK0˭:{uv>Y ;6иmӍy q\V7% _}{ZJ' ]_ D3ڭgA*(%W>Q)v7r]`ϯYo)5 endstream endobj 146 0 obj <> stream xڽX6-hL`830@j3:936v+Fn7w{}_RݼC>0xƷ~{t>uG֘|Ѽݼ[)D;7k,38g'o6+P'<Q*uDНNb II`vFk*hx|ursҳl:=P$0Af:]Q$=2B? !_{%˗Ddt\鋓yVxM6̨cbC` NoQV&tvd82FV,~ D#vXzcS:PCGVȰ[@ !]VC7_1'WN"_l[#ٟn(YD*|,|ƒyP| :NJL-AleVFrK zEJxeO,Re.UI$|Jf T-B_]leiYEwjIS/.}ا(V!_Rɪm'Śt s^f"׼.@=γX›l4Ȩ1|zPMiuq{4T.qoKn!QWj,Q3ج 5b<æj!i/(AT*ɝ JmaYcj:eݓ9NdR[?IAdhuƹ1= ¼grE?X~rbbZxm붤 $ R&]J m@o߽zWFjl5tq5bͮ[1-uIEl[QJL[g J'@(pOo}Pĉbk(iWgw< }:Bg3) |9,R$'$`ET$]};^ jrpTv9f# gM+ov9J,>il R<=<#Sy| $ZhFf92E{ D/_@< V3KEqH{;³ԷU}%#PsTiapCR# ȥ;~t*%h˜RLӫafЧJu6ԳCw7TtPE^UWqy5y=`kXp"w1ieҟg".KŅIfIi nv8?j).ЉYl%jQ+dh&9gxL"IX4bnq0Z+d#!SM 6r@8};#jw9y7X8;Q7 bfS:as)]54R_S׌t˩VZUPٶ~UҚ\8qW^9&oc0wsُۯ4Ueނ_# endstream endobj 149 0 obj <> stream xڕW6 q~-[ ].E I왝ً]AC`?>ڡ!0|CcNey;2|ߍ ;aoh$h\`L8|"°l<+̑PG{r-1(,Yoˬ~c ؆+J8 Ff ; Ko+z̺@TH6yz'|;N܃oT2`qE,rkw원 f0;j'_vFsV 6紕OVhL(kf pڲT }Zr6 qNy7G_9 L`qAIPy0lXtҝ4Ft?B4kLKݔ۝h'kl[q+Ub?n!vl&i:w3-0n gjཌ#KhQ]aD8C^U4ҷNz?xԮʻa=4X켓$(]=3gDԅeaX}{),̜f'Pn` ϪvzЕT YVusE1%eډn A '̱lxNH]biJV&Y[]C޷[]O4L .P{D=v5oJ snPn7NOr?hɐu}׀GNd\pd4Z:SZqѯ&5P+?&;2 Tf䫿QN\ȑBVL=ZtExz8ȂSi:y:CUwsގ)D>f:j%U&,J`Wm]2RT>U>_trXZ>G2O4\9!/Cy|*wi Um[O-Zۚ\9*dSjo S xl51tXm7YUr.K.Ů)1+>rQ)Qԅ_|&6M-JUuioۖVܥq ()aZf \*KO/3e#WԫgHtU&/1k?wzByڻ?zGˏyS!u$80;*jݙ 'D.7U$IQ+?BE'P[6PU>I-rG=+co:>mϒ~M endstream endobj 152 0 obj <> stream xWn0 ~sH6`P߭C)E%)(w2"?W 6?4yz44.6}f t@zqG { G2?ɉӳkئئc"`c хٽn ^AyGvǡ%E'b/kϡ[>K')SZ0g|Cv(|zE\@4X^&Zͱ&'4٧im&^1EwPcjQ{^ನ,Y>yH=q.s>9vq'2W,j>uܹ_N8nUJQGGIݤ ]bӛN&\if/LeSnB1N[Ƣzӕjs}f] VTb>֚)=ף6n `l `XڀG-=iƣlslW'iSȚVҼ{r9HVA +8$,iEYUK/SgWhtؓ#bTȟަBY]٩(hUN8U5d1c)*_ڜ+LiGTھ^҈zLz64t1G e ]I~$24qqrpwe7=9nnv:sL/ MNmmz,ۇm[%uR6/GY=]lE/=wbr͍nJ z$7$'3aSzOKݻ12I}p4Ւy_I6KNvhݵ:O&%Ah9/%RϿ%1/of1 endstream endobj 155 0 obj <> stream xڅV0  ڡ[lE;:R$pꤸאm>usτN?LӗNyv.Ot84?twrIy(';[Z]kY뱤tȖ~<}')o_1p;뵱sSvG^Jł./`HUj&ZiBhwRnP9^ܼ4Ne͎ 4?w7CSP)D endstream endobj 158 0 obj <> stream xڭV0 eY@@Э@;[RdqrAC"_ 6?l?4ןKn  &4[}lߴHO-xq>Ŷmf2CτaekR=HaN7pQ:coذI,lmZG #YdrN"I<>"))̉s YFxtҽUvS.r}Y@Db'gAeg<' )e'XWʬ3*L*gQވNMpV<^Opx&lLfڜ%K rA*gQ2E7vLBQYvn9qg+FMH_8יyy)sYAiCrR1EBc;½J Nc;Bz'9cg*,^8Eo:G1'w.2pbH|ybS`A|-dKdp>RUB+iSbޡu$!USƋ Ry|"\tRv?>a턄k~;nk}U-p6 ./W;9KrB'%9Gpgo\rpvR7 endstream endobj 161 0 obj <> stream x96)t;|\%p )pL!r"o6.b&Do5;`C7m8q/@ur] i<&¶;|fz^O.HzJ܊pSE '  U9Y-Y(g@2rhZX }kwL,6)U&z/4*ՠr[nڂAf = mߥ L;Myļy_$ +i,_<KJD͝Yi2 f%AMeF38s6O7pJc4ӑ!Ic_TrQ+y˷J Q,` G3v)In8>kq1*a["qD:.Q0Tͭ0YT> stream xڕT=0 +ԧ CvV[!H"Q|ӣo.=^ܗ}nCCn8#t~w_Wi^|rSs vq~+=ņ^W8xXI=x7Q7 ׉BxI#ɵ=v{gݣ EdHxf$J"5iYa[.P EVP:Ce 1%IUөɈM*JZGAt&E唓)I&4Nظ76lFt ^縏!;skyӿ,'k[]0_NU=k`9_o#!OŽ,mJp %!jC` endstream endobj 167 0 obj <> stream xM0 w/`I lHC1 RQ;$!8LӋΙW B8k5*.%cY7%й,E FIk&p-clg|S}7ݚYe"4_d>+; endstream endobj 170 0 obj <> stream xڭW6 ~(Jd`"]tW7GJ$ ~Wg:?薟gvf\ĩ{Ɏ]o,=<`iͼ֙>"h2,Dil6Z+}a:K]݀SI;qH$; F\! O]5I|t+R]/eo*}ja=KI֘B7%0T{Tkq:Ho CkXJΒIy-qfe3?MBrrYx8/916], F`h@JauL5y qWcvf,o 5iWd.Nȁfzt(mAbc]^0p(|Q,P=Ub" z5պ:'OV7J,񏦦H ȰJ'SSē(M}W~'vmy^Mճobu,% P_|Shd9V(Bǖgij>sSY{m)pP4}seb[KۼHAN@KC*qH;iVD|[5"{m"h=Ev˯S̝Hb uvv1&dEs"KakY%6ɵV(/#-O0U.j_b%_Cfı$7: WN #IH9{ T§)fJJxF(CR̩ĝ2߷ ¥,:JMEv|-Gia#$1Wګkf=cR7FP0qB͡YO xf3԰U%)E).`&ɾ|Rf endstream endobj 173 0 obj <> stream xW6 ~n CvV [!KI;'Z‹>Q't-?_ϿA71o]~cw Џcw_: t;*O)OV` xq@DY-;ؼ9X!e>ݫ;8"~qG0c\\ Ns9Ğ>H6<~tu8 ^p ǀ#8ӈ +Bĝhq̪I-6}sV)y$d3~ =n4W  ՠf>YQ9AP TEhH=[6JxXhEEgAxs:Thl0@v5R/.W/n [8&P񡶜٩ 9^y6 C:CċڝGۊ^D=s&}}=e^%qBx}eB1e3#RW6.W`l/L=;S[2g61^[bq'.,4UdhmUK\NjLזB,($Yp;=(r]oM=QcԴ]KdAJmhohA_bV %7џ N4lyd2hnw+m;ׂy $#S<,g>VzHU l*9%u-P/ܢe͜jSWD_K=Tʅ4n61q(VUcnR0Y{]|__,G+?\>= 䑻dod\LFNKM0co`ŪDrrQ7 Lb֤]ȾJ,e.kѝ3ޣ-ۄ1{b3$ϢCu1P7Q?jro-S fz=ʽӣEG=bўw="!%WvuM+[By}!8ۗV֛jG?Jmmd͢i~a*Od endstream endobj 176 0 obj <> stream xڵX6 d( d+:رu/%EJQŽSIuu3`ǟO_\zݷ>]DZ/_̈]pW0Gn{px..|E6 mi e;@,,p+b!n}pdpLywvќ .DjIL/Ң,z0/w|3?6y-DH%G842䥊p ?_E6Fk+| /8 'Ǹ+o s=^lZue+:>_zCjn|O\ܸZtOv$+K-#v RcP}iuJ)J໋GӰ(EJ:zh(i jFThpx6MKw6O*&U0Yyc^#-vX|^Eۄm_nhĚk;5B}0ͥaP%VgUR}[R(o_SX83x ]cfg)t/9s/Uu{1cjN*b$Beja@ de\} Ɯ Uok>r*}ҋrp.kK*TWlJJ+J]p %wz.ܢV\ ʑ$tNaV1}t7t̍'|G>JۨW $'fak/O<Ł>p;w+H||0Kc!o"r$񝒻ļ^]:Twy T0.&;䏗#rHLxkwZYԅGam8(lyb:BFݎlw~oj endstream endobj 179 0 obj <> stream xM;1 D{N1H_ @)`?(di4(Ȏ+X87ɆZGRSjKA['dvdbd.6v,5uTd[JבDoDK*) endstream endobj 182 0 obj <> stream xڵV0 {)J -.Ha{.E )<IKh,x|hw:. C>_WL\]!Y!8]O`X@$:s0# F 6OJ +j-lb&wh݊{3AweM̚ zb= H c,@<Cf/#\p@$XJ ){Tr@]'smzdQlxv օPL C,GJ^O*6q`HYb>+ePVNp5:s` IƜ{  ;D_s$2dV'EzFFd)#K,aHB1HBj-TDێC&%->3A -6U[釥&UdI}=DǴ&'U@k;P!'$L-+sVwl{G6!>H!Y\өW܉x:^ ^"^OTDfiޤڊ$5h(xx>>i*#O;-UBr1_Q\}ƈ#~.#}Ķ7]R W&5ݪNI:<``R^vm~$y4Sf#M@]ToBz $kk}D)8&#yp%5]d\9*8'IkI=> stream xڵW6 %,`EHw.n1~u7KNyxHJa]r}܇Bwߺ4c?}  F8~ E p44<|DF46ZG.L'8ʂ Ѽ)e$i:Iu' Uڶ$chRJw{OsPW Le. ;JBUqĖfq8<[f+e._(>2YeO|8L`+k0.)a8ciDEB\Ζ˖6`ڭpHt[K 4nF/ّj}^G畒TEh=!} BY)JnA7hzZqzztUX zuÉY0x&}TR]LསݓK8ϻ@M Uu,tuLrLJ͸lq+%ƫ,p6 ;EشM}hU ֻk9lJ0ph^p tIѷ7>CsGg\8UPDB+/~B7jź]qZ"0LU>L/ t|c5@bF *enlJ@L΀g$vʘ}lBIt:] VdSrwS_ݧ0/↺J}$Oզ]h?!)y5 NiΫ 4/$schs2#MғO7RmhAm5ڦ1N;DA+] kB5r endstream endobj 188 0 obj <> stream xW8 )\.H1]"ei3٫İG")|~N8)Yc6}j'6O}h3}>LϽ.ooً&CVDR^uL;˖(2ث h<D!Fſ|ʼnsЉv%xrY]Bk%.>$h^$._ | SD{u bD$ǜ%,S()UxŹl"22Փt X['?Rp=Xc7>ѳHa^R n|Qy[(+i (W ai \%zD~=ڬf.(4A!&y+W?, CņUtHpD+ Cu'7jb/I4i8)$r!*Lg\{PhFG1ha3u/L@zVhȪLōU|^ib)(;y3^]ayΟ2,M8]e]go;:,*Zv2wڥ @e;f16KQVɻzKCA%Il&ʀJj-+˽g]:l2u~Rtqvr]⑈ÂRc7:Ѓ֋ Ȱ֤9m%:N)=' p<)Ӟ;N:u7Iת+"cb+nzaXkeEKV&>8Џ~gh-hPAg0^j02qohQ gI37хŽ4^&+/L_0t:* ?wWvHi T$ NJOFZ=]01r zϙSl?(紗qz/i[Z'}"iTj: `>x?2 {iۜMO)ۥ3y8O䩞_YyA gY MXfsXj/ a endstream endobj 191 0 obj <> stream xڥY6 *"@R p %Y]r6VґfY;ۙv+M7=!t_KЧ=ka/>{ElgL ŗk*W>o>*U~y_굼xr3G}Cv&@Ƃ2h'2&Z# l췯-n>gl.?_~e`o EkG{,>o6V@Δ",tHW{nQbgrU B"nG꾈VRe]Z7!Wyf",0n6h\R|~M*/\(b&P4DwODJVر\y.Es%s*Z yvgﻛ eY r\VtT#$.U2G 9]^"eZs"$3* ݧ !I]Bf;]p6Q3RЈPH9P P`AI+JkVt{1£—3$!+ t*ed@ڥ-L p3_S'NŁCQ.R6mp(+k%(iCW*[WAM? 7HbrW^%ca A`yw6)9Z,eYkr@[6H/œA:D2RnG&)b0 tNںwVVݕU6&ؔ76,8jhh$٬2P.).afj<DjCObK]桴*Z_(J:sTp^YK*P(3!7}MUQ.UGz]kKeX5-JzYΨ[Uh. P.B =Ov80Cw Jo G20bt}Y9F!^AceP' 0ȾBRN{$pRV,IEJ#w0e׷Fn*݀)-CaVUdi\*BpC[ =7(ҴA6mH'P(#*p/ ȅg-YoT&JCPఝ)d[sŀXݝ{kniH5Zs\1C~`4+5>]L0eҝMc=0JP5Lt@0 3Z.V_MbS@SF.ڨ>AysQ)<#1G 8ƮDKAD](UԦef USn/q6)<N=p8TS -Ĥ/C9uPqN:bֺ!eri#U06kT\_}KP|94CLOMĩx0GSNaߪlv0 t. B!ܬ j aF=VY{}ccsnE_i&Dh&Lc:>l9r:Cl eUov5+ 3.MCEӇb^90؇ z(T @&SnLiLD 7G'~J_⳴ڕZ }t AZxе)lvׅ-E@R#aF+]]vrzfa, D4!wtj*@j 8@q "x h Z\Jգkз<%:,9*(~'h7Y|on5 # ֓m5rjHQGr?Q endstream endobj 194 0 obj <> stream xڵX6u8|JqI.vA K[̓dɻnp`-533x0LK!Ls\qx}u2]?ys]t"He yxCR䝋 7Ԧh`x>IJFu&λ`{W_zٮۛD8ʕɬk=1c3i p)l\$Zs9{ÊTq.u\W1=.w:>B}0z]g<^%(>oAq:AXQ><׽|J詿jW>J`ПwvTTJ9t[1Qe=g _=}E`Pjqw&^1_H@+I̴ft"dEYUW}z/ybQ"QuicV \r[j:e3C$oojGKab\k<˩5F\뤋,[CN8m4f9 7yzNnzdb$hmt#lb2"ܐe կt.}U' u]MÚD~80(L`@ONOo{DD55QT,L[*'!v0P ); =hiT3-e;> h/sqKb@yCzmm^z*aJ-*T9ڝ:9$ya#w+Y#s4O@u3֧*w]5v4*ے$$x#hݸRz ͓$<(UW .Ӷ[Ŏ5p}_3D^/u.!l@ }D&O^;;DwM65{otj7N0DvF&|i+ \W%?&O3Xɿ~s endstream endobj 198 0 obj <> stream xW+7 Sn OD..pS .Iyu)MHHcwIka#<$%?Ɵ?/᧟aHm01vV nݣzbq9_yF ^w3+b]lN_>Et>r } 1vT!_Ɉ4Tp+3lk4'rاXd|S"gyOq} #k[1>ɸp$vlG\ v9PzFMwfnme+g k-hoe  (9P媮$15t/bj'dlR%) Љ cPoc!J]gzy]uT:o"i9| cP+#z~KeZօۛbRq.=m:O<#_DŽt<> 3x HW9̸U*! DeTeLW/4I>=J(Oj# endstream endobj 201 0 obj <> stream xX=6 +6p@;t+p[!CR_;Pdi ~p1| ?Ҙm:2\NUp~^F?F m6\lK̾I0X Ͽ~#1"c (_dN<]2%f%˂LЮ<ܤ4X'&qoR:^v6qi¨zHCѸXHh*KUf=ǻY ͪwXyXVu7а?BB@4 G8pw.Pq> &8\I0P[z҆ ΃yI4 T8ny f͍NfЇ~s"n$0B i2bpmqFF|lѓm8{9O oKQD,؜h QSNjEg\.ddkDORXzzЩ&ȻA6L($5.^k#@42toף^]uCP"1 {[-z,rIGbXߘ d}R;Wf N6A Qn cO~߳=dZlECnq?wc7 9cW^ydw=y:A3 OUt|͂쓢Lh;KUݜZx= $dj*9MU{k_ K ,h g<=vphڃ[K"ea@9Og,[w,xm^3· ~ds0sbt4h3b:3b0G+JK.!+~ e'A~58B\ȭ[d='@Sd,=QjuQWڜ7ᩭ?@~[ Yl1~|'5YJ/ṵDOJ%J/1])krQ:dc-,4/'mg")ƒ?rK޲J5}}ZYsD-sSHntwhVaz(MXb6yNUF} Fkw؉𛤴Ĥh|>1g':dDf3ӝ Od9VH;N C߰*V9> stream xWɎ6+-sr37Io>/ԋFĘP^k 0akm' y~í)`Li/Wc _o;uc,b:揋 @3L]ez߬qcP$1`T4Xת1VTvS=&\xܑr1>(l TxMPlmO!lŹL8p3%LkȸR>4&4p^$q48wci=X7x~/o6mV$Ϋ,Jɢ^Z%M~OQ@Tv"qYQԛma6/':YG  əc&X-q-DmHA+3 2%M\SDz]oR9Ȱފ*eՏԑuM*chx,I^Ӿ ;j<©x<\k8ѨU" A 4{xVT;vnetwk?<1\H _)ӟdO'U292Hl۱Tʄw޹xbQW̏eɪ:T@R_ME;<-MS[^pvʞԅKB=/^B*aYt_0 =QoO[o+ft{iwZ13ovޥ}EbI\h}aީ& PZzpU)x@GW_qjrULht-i7Iz3Kh :dkw'gy.qr4eYG oЦAWZ`rV+(e٪s:\?Tmu{klQT~}~*}hO Nп%TPm4;1I? p endstream endobj 207 0 obj <> stream xڵX6 ~ + ]b?y&Hɒdz!54)E~a]oGg7 Wz}.`Cwx.qKW1p4z<}\Gƨ7|~'0X}z˨H`0IOn:,k^O?.4@7ˠ!F7Fcx t=ut:F:vf *iJ&p0SRks9@ 2,:^b N"4:r ֕__HY3=%'_[AM ۚ 9m$魁Q5 dGW.}J]S*b\6u4ri>Eg3g]cZ\ߙ9Ub46(9= +^QPyq &FנY5l>"m'WΏvj=;.꺩%\-G߹uTeWm3E/d#|P"*KZ$嶘-_`- q`S 𞧓]bS[ T]uŦ_ ,hba jќߘ}^UdJnÞ nT{*ؘ5PrkԴsq e qUZ=Zݡ9b .YQ|% yLnt*TKTWwAg)(0W4LgX~ZH CSYMll~nfNrrRlz3 N|f-7 g%y:gs|UKhi6tlm XUM(gԀE]Ά,!+.FhnsWve'KsZMbvDY9E*z2'q!^ǺtlnM_IʢEGYP473p>;s[g8XuIq8`Q&L9~?/sWʋ~]+}NxB ~ endstream endobj 210 0 obj <> stream xڽW6 ~qHXlH` m]Rd{֞Yd"?q:wn蝋]>,)u??~dB\&Ҝh<߬G1[&+<2<=y(7AidXEj*G54J(Ǿ%܋޲wlX).hu:K4i&Z7ld&ᅹ9U9nҟh˥DtL˴Hco$L!)McQzPIUhDhJ*K<)<0͢IgɰuPpcqIe"uwRuׯ0K)ʶ X MnT.)>wK:*yUͯfw/Ak2<"'S'`Ok5| z$h囂f¿8)cnr2_A}}LTWar_æ}oTSk}*Oy^R) 9OߧO;0U~ƛt|֒ޢW3I"Gfe6EE-o)R yC`Ds"HsE~]UG}aR*PC+AzZ=]wx"x#c텏B(s:P[x7AZRXkCI S tQ%n :WHB]Qٸvr7k=H?774xs6'#NV˛jNz+:~0J/z3|g|vߺE=eUTu/f\y_mq--m'W{T<5ک%~>%W+_絓4k-YlǾ PݺtfmR+}./ N*Qa]&6Yl> stream xڵX6 ~gAЭ@[R"eٱ\k(('4416 i_nϿfO͍b:}s{y1ƎX|"6w1y7vvD=;c瞏kE9^ư; b!0bb_oG\ ?. K<1p xz邖G{{ YeaW3` Q ,_`>u/e24F:d Df".:{Em\ty3'gLiG>l~Ux%D-ghYpe+OY3pkrh-c!CJƅ t9DXLβ$J&j_j,uzfhz֧hDﶏOf}l4b N/ɚuN ћ/\3P]1`vf40H*&6)KRJ$tMJ,C% UcYNC_|8ְ5뷇ϚzUI1FRi λxa0go!iiMT{²w9^^WfQT2LP?,-E3bRѮ|P-DRAchr*> * &`Mat?j}<<4upi|  9]z2Fnqbӌ%.mA=Iث[%bߑfK 2̿A>:a,Q>Qm.݁ 븬i_*d`R}^LPNGd$FvC48EEhֲXR(:̢+T@`.8{0>i@R>bn}df.\F PS"2[PyuE>W6oۼaE-SvX۽a^~M U"?65dm/Gz{eY>Jб˚mSxM4[ d4-G&ΡOۨ -5 iźϻx䝽a ]2:w}sBp' endstream endobj 216 0 obj <> stream xڵX6+|S "])R[ֽ&{M΃3<9rW;nߍ}J5u{W|_ݢX;+W6Io{cG U^OXFx4\Dp{Al=n!%GpƅldPMg.CʸYtág9ywD>elD^[o3 0+7f)<^n&Uq;mY.d-'M j(U|A|(;N71Y<-G nLMQ&.&B D+~m-bJBRǛC1Ak3#BDP=t>9^u_}|պGE SUcUҰgt\!&}/}(}xħѿJd6j;DϺQ^U$OOĪ۟.<_ yC 1Pre־?i!~sP=S8}Z0gK2eHǀv?N] }PJ]-3rzO~B[]=A#3$.(HmY\M}ݟnst ~'EȾdjɱ8J`1( 4pK'&l)k}:18h~}zLvu ʷQAa% o-$ϡEvZ ׉Qaimz  ENxsfU`,mVBMJBx/|ӕhgZ!HV %}%X6a|i)77ea't(}v["DݽWt&wi'M: >X3c)O)OWbwf)}gVJ9MEǿo!U|3Evr7lBkoY:fκedN_$ְqV_7%O8Ѹ^(9Pފf봺핁j3$#j5KyBTS ぼ7/!E-wI{.h,fȶ=[Y.zn*-6\I"iufM;"eqԟJ?93mO\&]' endstream endobj 219 0 obj <> stream xڵX6;|S r.H!YRwyR,"%dRݿ .;7WW rΦSw;Bz|/hq.3x~Xz,"ɌR&zC:,OpVnѣBH/> %k5.;kЬf6BKЂ&x>(#&r$Xa[D:x5ׅpAf"!dyhovKƘX,dJE+Ρ3?AsRD/6h<<D4qXYPd/!ؤ)k!?Mw&>Kw؍Q%Ż>GTr3mD8V_vV?hЌX̑h"imfX1md $m9hekacRgo;7) r5oXgIw /p ;B~"Ҩ6OЀ x@ h 4еLa9 EI'NTN /vrlЃ׈9o{elrrE=4d2=_[kM^i 1d̡hzA ̑%z-}YqZt_ p*%%r]ңD(= `O]KoUE>},E>G7SLl"eS7]r㢋9xtSPAdѽЁT-z(R]RԞa9Í.`림.%X1i\}TZm&9n܋Gt*js.gpZ uWR^S^ՎQcIc=A.lHXх-ޑC#Li^Ӄj )2eŨXK\02}q=vi6<Zk]ke({k}qx*%YN,iclhUSF3=fBs 6tu H އrq2ז[,^[|R.Nz~ $盧AEˣyi6@#{γxUh˱mpZ^xj5q q'/9O0ALS[XeRqɷ%% endstream endobj 222 0 obj <> stream xڕW6+Hp`H]Bk"%H4Ȼ n aX~{~wCc<)X ;0VWQ&}w||fz?n!91 ]?{g;(;]e"^&cUIiwvSbѽ)Mu04Ąe<`Ү3-sD5 љi asEGV2hi! 4:Y-J*W| xDd&;:e̾Rdyo̭ S:Y7,jt-ቢ*3L?YG4KJ[cm7XIoIo>';K ;3J qC]wsO.9NYԆY ~#WyBM<"whBr;Dr΢Fa%RRzX0 =M:9|ru9󩊡ẙ^Nr-j֌*fY_T9 Lzk)WqJQ.;pJ͚݊]QiEH+!>|CʥTtEzMsЮZ,gXucNBG=+D(6upZ|s]،t߅ǪX268JV [@kofxh Ň28HpJY^x^ 7o t}f XxK8sX)9,-]J:mn; LڐJ[W^FH*gG+3@8psM%u A (D<䉇sxhA[VD?;A @M˺o,I\^ Yv\%YueW):> )ҷjQ$8N 5!Yma zq}F7 -Ig~˔ylsbپ6540yIEݟG'æӒ#w0KEmZ~Wz#E!/|?MT v ?vRF/tX ~6ivEͮi_-uį J0h\ηOkkҹV@Gפǝ+-&vHq7H7)j+#^|^,G.PP<wvd!XxM- 94(^)JOcx a<- -f Ul~tݕO ڣ?~IX endstream endobj 225 0 obj <> stream xV9F } ]@d-ZAg:3Hj)s'Zzƹ1Sz|\dO 6Chֿ_͏Kc`MoZLr-0B[~r;iFv`:M8+ I NCMS==P [ػfC1`5 31K& )W {g'[H$L;/za)V jb\<غ0-^W$Nx7@1% %Z}7 .3ga8V ϑ>owMDqrS,vC Hz!.!>kJ7Kc1Кi=}LL?\&\|0fˎ| K]NwW;O/!Mh~-zEOcmԦn5WOdWe`&>ȉfF($vZ0I ,85)O<\M43Ja{N.yJJmol]шtCUKZt_dKªJVT䥪Z槯*lP% xR+`U;w,ZVɤK*||+/ d;!G.#F/"wnT㝥r|j-t__q 쀟` .5'lRTCp'WfT|c=FkWJuz(_lj,|추9ؐ"Ζ"XҪp}CH%$7+|g ԅ8?_z ;rayY_F endstream endobj 228 0 obj <> stream xڵU0 6d( d+:ݡ'qroyx(R!c#Lo|AoC\Vͩ3e}2'N>¦(2ZZ=2xn|$61Bd롷bFՙ|ʹqRѳ.{$&8.dm$HnqB|؊Y]ٳo'q|LCA&Zs`QW4c$uIfށ 9Ɉx"@1HĨn V6I]Rh;fCѰbMOlKhy ,pn 5 >{my | oG %FVn˓r{S}e7[G=C@g#"q%w#4`ޱFM;.NnpՌu|\3bXttݩcs*U13H®Njc80U^]q-rAt46vd!)?LNo4-=]MD J3kR 놁}%uhB!5%ѭ_B5>$ʰEys{T$s5=jFzrޗ}'Ħc#iNp섶/Y۬>#݁Ƈ>O"8Kq}U>kՠ pv^?YAG)](w//Z endstream endobj 231 0 obj <> stream xW8 ~{IJe`1ERKqIQ\r8 yD?R V*kmӻѻ>@ d;N}فcEeaBvaI;8Nc!i5cWcvU|C} f=nHunV$nͷEwV@cwyt0 3m'=%v`ăL1ED.[)p u\ )^LO @NL= fSJ6H%5妃mأZH@o/R5ldwI6ۢI荕ӫim7'Dk2ʑcg?[(LMu[np !,yOs+Ƙ`&u0E\Ek<1e!U)My%(>idD! ϵs~ܩJֽT%j|{fXdg> stream xW0 ~~, 8d( d+:w_JRNkŝND}Hd@W5ӥZmsYZ߅d Lߔ#\!VEd99i>BqAلsFQie&)NO` c.#E1ϗdE"\ >6δqbE,sTj%+Lh؈4&' ˠ4/8;aĘ(x\U`01't cK{$bq7d+Zʩ$~a,3IJІ~uZF cj};<_fOb>(?] S. osDaѫׄ;o1t}~T5HƄ UF1)N՜N`(',wzHҫFi''tt҉68/2 EadM8$섉j. 89g' ]&RKKPS=?eG=d?a 6й$opCpeZ1 D/&Cٹu=2g[+ZqoA'uM9?c>~?Txpݫwt !."̙8R'Q0{sRsү K-uI᪵ՅbcP.WVذ:XfcFSSHZz8TNܑkm/KanT^ IfQNbrUz g%*;L%{eK, 4ت=/wܔ]o.w(lF* Yو"g?@p70wmki :k2-viO +M4;7[Rv/-} / endstream endobj 237 0 obj <> stream xW=6 +O4Cq:/!)JڹE"ȲI|H>b: ."5w};]\;;ޅ,)u寻17>>~fG:[Vq4Gcu~܂1My/}BdI73"Gxɱ#'C1"l\uR(7eTV z>gΑP$('ZiIk6<~Pv/HumeVawċDȋk lʚqI)9=lL`&D ^+E R"YG {ܬFqo,RU C \؇ >ʿ8 "Α@Ȃe1.,mT ,*˘͒@pޖqVT?^3E,SQO{޺l}}%>{n=U9ˊ`4p`< _x5Q0G\+t%JԪǍ;pB~"]s.jUGbwIwL)>Z4YțBӜ8ʿ|t!y`KYPE\H6Jcj\ ^ڐzB["4wBܠRj6+UE'ؒ궁PNNxiL٬W}h]d=-dFqvm7cb.^ZƻШ!ԌӢT^|creurqogJw Uȯ4|>ҡ U endstream endobj 240 0 obj <> stream xڵ6WmXL ).Hѥ7)ϑ](7)vnpgl7! ܺd!msa`ܮ}( ή7c7s1|h ^/ eƑ`=g]l%,BH*Pw,ݔ>ؗ1d_1F50BЀY%~ 7y;0=ءjt`J= ~7(t˨A]w}@ۋM5لD$2݌*^Fl],gE"嗓U(rG`x}1;z6k$XrFwOF:#wz dbhrs2гr?_L8r}s5%7gPRK(!WYW b\lnYoΗQeJA! qͩzG@pǂEZc X$y$F\ ĨV H5JSUTӉmgL ̪kU^cbZ[Hi[5k%,v#Uiǯ 8< P߉ұџf| y]sҜ mZo:nMR5cG%6Q&:V%DfQ&TCWיè60NUEH ,70=sf Ҿߵ5a#&mk죨cZiP~i"e5lؕZP)]Is .{DJN4:FTr:o!*F4n]> stream xڥ(6߯T5` nt0J7[mg6ppvU-a2ֿ~?~!>} cOc/?|#M038ǧY)k{zxҊQHtxSJDuWzSY3c|hHtCzN8#ӓVۦ''? gz =iS;\E>zJ O,jq|=Fx2,F%t FϸfFit&6=,xu3jjpXY;?3P8-W:爳0ʺѠ5<}zILf0+DEܪҚJ< V?"c"B6[VP WW+O+L ^F_L+i]r.3Њ q* 2c8:E!e%?üU.(qÑчͬ]RUWTʉӋ!SBѧUH)ϝTdIǘ/22F!) 4dޭ(H IzK]xcU)xCB~ǫF\dvٯiKܔ}KHCjܡ|>t0 SU \)s`I&K<:r ۺX+% &+ J%ΓYJPPkzcOT +WQB-6ܘEl:jzLW|ď%@(PĺJPO JִntDpT豆% Bf ,O75MʚwVy7tnyzr6jaerBzު^^OxznvMS J?&Qn!tUvW' Ѿ(*WհrEsEbH|i v= 6(}kUgO ,ԔIkĜyӉa`ꆐ(`J`J !+",4chH)OQ|N/*QJ$ضSh__/VT,WI*Fh4 R\|NU_q7({Fu\RFpwQ=Q]C31}r`(.3ޅ:;a2:e3yWYi[L#H?Bʿ &Wu<`X.<޵ʵeX`'Vlw— m\? #o<0q݀yrFy*^=̅QAsww6TW 3 ;㉖__{u!z9$5;裏U܍[RF=NAvݤHu9}ɕi-<ѽ4E/hYR?Gɝ ɛdc*\ÆH,ꤞZV\oyţ!A>Qsc)1vz\s&| 41p`ntX`v暇2ݷt&yRu+l?"f?f_/K] endstream endobj 246 0 obj <> stream xڥX6zuHQEH` uuo2'Eɒ]A25985 nf=! qIK}MtW %h Qu%-'ϕ%I4CLxd/[9bTZsg} @|67{Q)'Z|W|>)] %%`*8Dڨ$ds74plKd9-<fqC*9Q}8s>GݐPXX>(0>vXPw"VZ,Y] ud7=X+Y iZ㱌9U+Q{{";܌]ڈ=DEVvmb%ғ(3_nkZfiuUWX5]شM\hr{2|q1*=[1 GA7:@,f9D,+Td7FF>hfgE>3BAx_S&_h-NW@!Zu/S)M>r_>*⾎؏o`tܳ иh|ZrE|5J݅1k,.3yćB6^o5iC')PŭbwtP2m8}߲h,%>b|+vW;+X\Y?^헽bb -R&X` \)Fwk)`OW9twwe*yW$kK|ɛ v(toQxqFAe լkqO>t_0m׾kFw>3)|39/hB4/U7s endstream endobj 249 0 obj <> stream xڥV0 ;n"]wA ]Rsfv #HiWU~PM?k>GյUδlcT F2Pc)&8!xxz$&vp F)NKì# ٳ$&ZAKT}A#!-Pк4̀&|4)T _RYH6d9L+K^,YhPv ɬ Y\mG($ sR{mkrT͙X4_x3g->y"*K`-V)y-fVq79ϮFN>Wx TV5[ToE('}W8JsWՒVsV+HR"s}^7lz>73o?`yjj~T78̀dCQ5Ḭ͔h@khD-}dW{ȾAɆŸ|X ^psEL?, endstream endobj 252 0 obj <> stream xM C~ $Te*U GH~_V`^q8߉db CDhbD^^FU?Ca3Y#I+7eVUczYű ┫AE=4{+F=-eKX51]e-y%L8Y endstream endobj 255 0 obj <> stream xڕX8+,0L@g ,[6ONt$J:_|w}=~ ict\XOڗyrG9|͗!I|Dם'{EAF5,I(@ʁ.=8&}볺/֏_R(‹i xM.%82sw΂+ z'tcp(He=$ ^A~m;DX=/ipbB^E0r z1QG!,N h!Lp[CcCfi4ܢڛfy} <6|Tނ "H%( &qbtfAH.S@i);s @|էK4y"DiLH[n1 oëy'(Cecj c22Pҳ(IMOS\: AXÙxT%dTxQ޼\c[Lj£qTxOL`&}fe&z*Ͳl*K+(,_eBߡ?SW}xI{XSǣ-Ixo^zw茲+zd#)S-YD%f:0ڒP7~PGYpD(ȔÐQ$[/Сc̞yXRIT)>UFVʰFFfw|>DC5oT`% Yb%Zxc32J5]$gF  D2UKDYZ* 譮ӈ O +MH_Ov s73o4ɖ⇶<.lﰐ~KK6Kk,~rТ9y+]j jdP8ڜPhs B֔g8]Jiz6P endstream endobj 258 0 obj <> stream xX6 P0"@R ]q"߄H=$@`!#yk00?}?btw.s0 ܧi~ GWa=:Y<0 LϏ p8Fa$džG15;{ZgQj͒~kGB>Eg(?t`[aYŠck,e zZس$l$ .oL3'hwqbn z͵ k@ upUpQnӝ V5'=+ڑwM2,$=d5ekr]x[1V=/J.=(01zmqkvkFw۶IA>/!G+>m~K^K@'xwI.0X&W|n 7l['&d}ɉچuaEޘmڟHA;ԅ/\~J=հ-! n:j<1FQKsP5E\)p3`eilűZS4Yj}3HsbZފH6#q\KHSme0Wv.u}pYVʊNjF\IZ}c4 ~S_3$3߬Qr{q(rq>Ţx<em5_6˥$ZNs+023U,m1rQtmd k}MS}) xtJ,Vvs9fjmzĬkJr;/-p> stream xڍX6 ~#c[`"]ӥ7,{Ý`EQO$5v@n3tXni zvJLk> `#1$Fٓ`=R@O|# &؋{BDe,h+q%}!e;VajVcAAD8[<-Ҫ& YM6Ŝo0kxռ fMo2gVy ȳE67cJiuV3Ąɓ萷Ћս\MHAI1N 4R$!p H`!;*Rb=oUav6ŭؚnP0% (͜[+Gj {#sRIH""cQ %P6hLWl4n$ FGϽP}kB 7y5y@*fs C.H*}A lsPyj>1 =T="ZβgPX°afJ ĺJ)5JV0#ߗ6HSRo1ws)aJ*kNfSEQuglkptAWU jEH؞~[D/m@Cmc rHJ΁:Boբg+i7{/W1$D FCFE+1pZ|Yh$=Sײ"Z;\2NTizoǔLsT?O6oі6pߚBI};[VqO#`giQ{&\l8C&Q5KaNԄ))4)͓Ƙ1| ^YJ [Vp <DX J[6zJ{E*yQKmZz}9 )X qLz`T3&f^оiI5I:m`^C mF4:{zs> stream xM0 Dw~ N$P$ؐ!6p-tt2>PH#xq8^ !Ԏ6 :?N"<데]H6K힙ibkEح$d{}G2sgiƖ.{c$K/ endstream endobj 267 0 obj <> stream xڝX6!"@HvA ɲ&3 5( vAgt{i;7?}o 9|^ <ckF|f91 G_>Fp̴HW0 ψ$O?dָ̀+E$. }6~P ːH%P8ֳ&_f4pPlO0ƣ~ u~Z Yt]Β]BzPW)b gϑΖqV2#( D;U!RN̂[FTƦgxk 9KcSLNR+7˹L7@ M{,H6T#nO _7;|# E4p?CIeB@r쒒EV vG {, \3" jZTM#iV-p#lsh@ONh=VS57Ƙ:%S]apGog!8}g2&Ro,ugggã<Ϛr?[4$'mCfT2-?ؐz.BLE2r{M(^nc=!˘R=?2&r,ee/9b;~btMQ]4[T#R^_YйMNpy#LogU{F(SY96ܚG_4++е>ٽɱq>6mt&0WoǛȻFC=s˿̆L endstream endobj 270 0 obj <> stream xM;0D{N1ٵןH(tHEL.oB맑Y|"{gõ|W,jGRSԕ."ZHA9>Num=0 u0NC@'9.3~cK7/oz$- endstream endobj 273 0 obj <> stream xW9#7}j  tf8jb%c)#93濇_߇ou} 51'˟gyλ߅ƷSpv"~Q)ֱ@0&$$2U$<4gq߾Àv)]Sӏk8EhSjrLvptwMΥ[io4jVy%Ǹ-j,MKsi~iE_ʬ&_cϻvRɲȑ=Y0!b|5ʊ 3@%c`j 2QӋTFwxRXw;{:|hTfB m2"]l_Tʓ{ a9%kæIhZ:mڥrKX=ű\CHm V_T"\QvP`M={3ζWUxes*eAZXrЪW[p]7"M)p⪂K Gp,K6#+`4ߤ#7v,Ug)XU3:]Gډ* [55Hm ?y@i ɶ؊-i͇۴rOujIAK`>nfZ2,m]km;^ ڽt}lbĤC$HW!=ھ,rL6wQK1rThwkvP_,awpp/(2'ڸxerDP&&^cwwV!`Uat\#:̹! x,ّ!JW8Byၒo b|}CHv#cm)sO]Qpʾ _D endstream endobj 276 0 obj <> stream xڥX;6 +\0Ivh8il* [C}4fmn)жm6g&f#sE'ϺS #LC~0U660Os'~cS22GJi7~pc)awN %}U0KxtbI{x/3b?p#/X vv8JY8 ŋF eXŷQdqz;/FrU;*. B{Nlf+DSD d^hD}RHL\(eތ \r ` e&4[NIbͥٮ~,:e8۾ BB#Ebjd!JXnpz:iohiRQ@Q5rcBt3n͢!c?xArA*=dI !1(4(EC>TDHqpА3ZY پ=/J9h2YC?Ӗ \_WD r h&˙ֵy2@um_qU i*7o1S0UW^j{Շuwq@>8VPM r [hzE{+WUq{* 8l++ t~8  :pPמ-aZS Sztt YP1X|6Jݭ/? Z^\ۼ2{]~rs;Φ:Q-D_7b(SR4yIOϴtScGc>ɥ)QFɗqqRnfV}+VEzTrVWizg+rwΜ%Au@^W uwe\*/E'k_Ι_?3n8‰ujzeLF1hMiw馝$Dk*/olM endstream endobj 279 0 obj <> stream xڵWFѳOq. +u.M\Z"%B83gfÿae:\c y8Ɯp w<<3}~?.♾sMJx<7<I3'$Y䓵-_R jE<Tg39`o?܀)r08f2)+@C3JH^~&,ZLݗ@;vҼS  rxrX4HW641J( T=Q}%,X"åu-\WI,vUͱkkI[&MP1wQ tUr_ qҘkN!q0iW!_jrh, BR؜n*1Ŷq1)+l]CPJ@u{THm`Kn# clJ,D'~Mu&cS6̆v2?c5D 1f&>`:gx[\׮)FbOm!vSCWB#FlT\^s&Z5ХEN΍5%92@s($'UW==)]Bps|=G=-nxB:?Z 5}F?s^k|L~Q=:FQ>{R0(pm"6k\vz\ \iOyk w_k_v7PMo"vn`CyH#j nOp_< endstream endobj 282 0 obj <> stream xڭY6ySg&3udKM0v^?5?߾_<:} A1LÇ4 ߟJO Vv4oJ_k`EX#* =,kh)u 7"I6Lz~DOĝ! O  $~ȤFoL~cgWA=\^ޔ;Zam@Wxb C'XF^5Ę(ma|C R~ 1ڳ ǝ(x#$ ͊V17b+ZEmb CO1! HHE>RA\+ΙTB8Lt[CO6I)@Ho?N7nZts1O.QN&^^8%\䏳GhtֽFWT^,Vt*ٵwS_KRB{g~H[V>a/5?Y ᾊx'%[QBNH]yE's?C'R1:-(5eZ)^%aoH^zyp$ƿFW0.vpET>sOPEq=@PeUb UEJ~ͧ~٢)͖SuFݘδ0vȻrG^/Ja冊 K,N9`%/:yL%R %*Sdnʴhda]6exг찮*)U*jΤeG|.#m[Lb|҃2PA}FkNƍոijɓf\=ɳ=yw[srU5ٓ #|La oA }ڂ_ӳT3ԣT T'Y\:w/d%zR nā .GPԊiX C8{#P-OfTM/Q"Ц%ȅc"fSmr2&#>&0}Xxے#4Hȃ8㝭UVtsc^wP569iŧT.o7 N^&r$I*evtu9Jq](@^ݲmlrc0 JӲsoҺ@xNw}H\Jcњ|n%JZIb(yk5;#QW:Y7-Otcт_ UJJVul٥lUc57ȎMtRޢ: msl8ްsq[7Y_J4ά̱k#! IyRq1֡srң >/TuvO;(|Me5}j>k5r&E4z9oQ~\tSݖw/u5Q9SRGa|g:+,nsv}!0IhT=C endstream endobj 285 0 obj <> stream xڕVn0g(R$EH` JR )Y ͛C 8°^w}u<~e1z }vO:1LE8yҘqV~ LF˕ɇ:ȎB. ^Zؖ}D cSy/x$mCG` =38B $g~9.߸g2D`ψvcrb#DQč?Cܥ\er_$8I:C'V=UlMv/o(Uɘ\ *h!$8tJ*84/J퀊\eǪL%`@eF"v|Jf<|SL|PYX+QVmrh-bR%ًPxJA<*t\ Efz<2rF5T+mb2h;1.C=ULuD,4mzڈV1Cּͅ*sr`=2zD4{@doOZmt5&JAڧ<{d qa"s>^S[#tл> stream xM >Ž@읚2ڡ[tH2'R~!}Hfd:߄>xʕ&1a4811Rޟ3$W#ؠf5U2QTUd;d4? s>; Fnns~m>zm?&n:Ug50Ej endstream endobj 291 0 obj <> stream xڽX;6 + RtIdلjFלvN.frzq!y!GԸL(*fF1n'㥞(Ҧ{T07q߅1\0l_Fr9sζu/@OfY"D}M%n(>&ZlYxc+=#VԤ5*5Mj;#>\M}8VKVi}N£΋#>}!rv׬qLɽgU-dY=`Ie3cTI ) \1E׭Fson[=6=ʾk>l[ug?v;w1^[ wZ| `͈he{_'–V$Ub_3$`+V{ @<7 v]rЩ83,/TF/6C(w gy^3t,zhl8EG0Z6 ֏0x endstream endobj 294 0 obj <> stream xڵX6 PoXL ).HgE IQtc/n0")DS_oݯn :c0\|Ħ"|oFL fqxHqGC3"6 . k\洲9ǚ(6jpi/"y<=sz*\eHdy^,0?;77N4KA=;0‹hFڤ4iEi_p8_>Ӱ!I(s/R7*=<ҚH.|S,5"Xo~z֯jjk^7o+7뗥<[#]s!{/F{(ǬXy T%){Z2Iqr!KȨ!B*WwK .v4nQF1?i|zx[ҢEny~Aflc;%"";? j `^0/Q̬3͒#Hj XL;W1Uk;\wؖ!8|ld'#%qj\G`q:K q垫"}W:G:$:e9ZB1UM`K :M@-w/>Q.]rǛ?1'r_®G-C4IpLtfT$<\YqZ dV%ehlAX0wPX$T^@<)WRxmÐP5?}ISqZ u#÷ |G, YD*+yvy~OT(ہ~Oirߪ"򞒇!IESǪM˘ (mוT?o@w7e&&qs]Ou+jM}aQ3 e2s 0.qWWr{Py^96 *BuEyk*59ي|n/_0 <'oNv׿i8{?ܸP[:kR[A`zy~:)]47.J5JvZm%rH¬bQ(KlM&lVHaV)q7S??ʌ; endstream endobj 297 0 obj <> stream xڥX6+7 .$E RHmo2/J-_K3g3?%~t}ua{|\q8}cgxI}DGT8<@|fp<FS9 '}'yqDHt֕:Cb`& wc32;ygQiHTD;frtQ\[H*֭_L,2脍DkCuяS6aؗ&jN٬@&К },ixޘ[`NrX vq B}3^1 8&֫EY,dB>0N=aWF8O< dʋ=QoB67ZGWmAГ0+>p®F!hQI~]q Tk@9}> $KT]ElE:@|!>2[cŒ<'g|=SzNɻӎJc(lT#pԇN(- C;+Pt E<ݟ;~w&T0ycZ[z5ɩR[v3>)1maI3K{kCevbP{1lm>8s 5z<쁰w.HEt^V&Q$f7|]R3Q24JyC;6JXeIiڴX;kk枢tdv1 r*a24|MS%8م^|DYѴz+) zRO|`[3VwH63}/(Zަ|VyeMG?0gHΩ,|A֮ڌ'SewX~J5 XN`(eV6Wz7 Lwܝ[|?9.!eL󕯱>\W.IY'ѷaϥku YS<5f-uHnنHsVca뱼QISy&9Qoo.cZ;g+M{sӷ \DR}M>9f_z endstream endobj 300 0 obj <> stream xڽX6 u ,lѥ7!)J#xY=2IuNu ~~MuComyO5`M%:l5 ) .l^/>#O>HK }O8Qh I;~b'fTHP1w ,a#DC,8J"k{Sk\1EϳSx# 4 Jv 7_W*Qf=jAɊQA;w1Ƌ-#U";b> Ԭe6nXtLDn|Ŷ$[=KNKyE6ȘZ2F;Kf<[q3ہM\eh80դ 0 4Y Ǔ1! byMt3$}b;&XXf76]|xr\[vyom-Z ' '+m>cBG8,\O謒uuڜ>Ô.wF';u>1waZphxW ӌ7jg1b:S#sV|kxGvkxM~8onl37U*NK_ٳϪ&M]xZ_t0 {_%W[WCU<؞p}k{Z՞-,X$UJ`sO%jJMoNPCb> NޙPv(0$i-BBU!PPQM0LB.G g2qa&њ5)zi4kYG3y1eT"a{uR=N5Rz ӂ^D{LEzSe#LͅӯU!憐{6(> stream xڥX6 \L [ p mo"d#c2yH?=ESck]Oyv.9lgauS)u@!#9X:)ʻ0'wI)e/<}v^Q ̧2:Z\E`EÊ-WSvgr'rFrxX/+., ([n [ڟqZq,WeϔKf~tzւ1gűeF_}*K?EDk3t"z*x#>9p򹋊?0[}V^0PlԮw3>ٟ^r{w 6Ǿ r:%/#>%7'DdKp\W]l(Qأť^8K)DMу=*ABWR0ލ;ΚTv;=EogW'2a~曺T(t kgswRi/\,T\0aB< cޚhA]"UfMm\CRwYHf ,JzHr/*gl\cW~Qa *?{Qum(8dewPچ 5§}pL PTÝ %[![eփJ {*˜`^H!ePdՒ8:\KJ]=Z+Z;DP~e7u*J$.ɓ5EILТ!Ε]c+U"I&eCũʺym摌?`ָ9xY߱UV[S፸tttSz~ԭdXqI_u\?v!m*6z endstream endobj 306 0 obj <> stream xV8+-x ht`@gNXb 5zU,Auukw =ow`D _=d-ೢ|BQ* t[5*B-dDJ3SLVdʘԉ?qUҩbmr- G4҆&]ͪE;Uh٬sI}?<Dq{[3 > stream xX6 K=--lcܥ7!)RtaėC ?n=°=97c.ߧsw<|fzBt>Et/.(ӊLPe&A?~1On!%T8>L4݄96|J;<:|MW7WJ," G|v|f;8J⳪DU֨9j_U7LQn']DJ=$5J۬}}]FDwygL?Ȇ"D,6~P: ;Wv]zNlbډRy@gE'FpbJ3P9rF)1@N dUbCj]9*bOC\4 ,G9ZN啊ɠh>#vjLU/˩#;ċE uŚjK%` -hvWrԢ:IPxm{,ZZLڰ׍4M ou8ό)1*LR@H I+O=:w* L^ -'>+~MCJBŭg^7P9w>HQE= ׋iVfO3 R)8xhդkB>T=BҜzܤz1_>%ۻ^XiOC6F.h5a'Nw2Ć-vN9ŦY5}joUi2l:_OǙtA7Ѩ8̋ßװLɮ:c3S$' ^vd?w,<kRpB<5WjlQyW5O;]ui׌#u_xp>=O.ym&v>۳|]JBCO[N0< p_a endstream endobj 312 0 obj <> stream xڕX6 qD,-$E)&EJǞ1DQ$ER`0d ᷯ?`ȣCqix8S?ןHM~4Hm*!싁߄\~?.@ac2ЮHk*mYFUP2nsXQm_(0AH,3 4lcfg%֍;w^ J9s˕2jZ1dE4\`bb2ǯ}1;Y`ߌœA[XE#G|ɧ UBrY+';5+SB(*O5sͪ_{&84Mkx|"n>h27kh}5Sr ؂#mC<?D݅D>`PG q'r9y=4쎁3;r 5c!0<| ")mNMu,>%vJ{v7K 95Ome _j{BttFpH \[1j\;{~GlP.|ULlA,QducuV֥G nC3MmTC<nHt|꘬'3'/fa%WyƨDa 6K07c]luQ9!nza:ցg*r}]Ƭ=Ze㝼ݑulNw,^%Uy{BoårI(g1Ų{HY;ddq;31D,Te֠C[ž`(pⲂ)gHDNfAL r6"vQ˛9͖Y9(gp{rpэv'<ի%e锞*(k:| d"[gCsV3R<sUj'vdx*G]`!Ry4ueYaVv-R' #y*^RYN MVZJb6 B1 ꌂĠ8E{?,pb:*T)~%R[Zygs.x4b^n0Zh- p8U|K h4;$_o 4&*$Aa9L-[5Ahޒ Bd'uc)]h- 2?/[r/ӻ%VVnNɳ~Ш( #xӹ͖/8|=SmYS̞.mzݘ)z7 i=.O!{Tv7A{Uv *b/pmn"-0QjA׈z.qm*OU2ghIc҅ YYSe+`_\+ssm MmXKJC{&ձ`Mg]Ե?#_;%͡NH"dS.+m⯔Yn \4攛PmFI*x~uZkÞ\#^2uPPCMo(G!G endstream endobj 315 0 obj <> stream xX6 ~P l٥7!ERgY'#|>tu3]gg/'}n̽\F-{f\=Hӈt)ރE܈+fŸ?G\ {tAX|µ?n߄5 nqQ3R[Ykqx:u+ óh2˕/G[2c,KZ%ʻ^'|gxtS9v!W"xxVn+'`թt {֙Ӧ Z԰eCf2aGF&%\Yi/BQٛJ?a ;z>Ϧ qEʜÛc(=Yy.Qgv5U1ͰeᚏbHo5sܙ(b,5Fґ±~(%\@jb:lbg/hx$̥j=90̙mZc,s)f5pnTIOܿ4\DNQjQ$fo; Li6 7oF|F\vCn)ag \"/]u|%~:{Kr.tPzUQêAvFk=Y`XU&txY|Χ!9 >1^ y gG.`dL H >OB#c~֠CRƝ4k]7̉\׼$2`ӪGj(wc ᜫ@ 8e.if8G1fn7qWw#b,ݱ}2%L#\F](adb4A'z~)Pܔ[bLa»,(0@2)G5Fg_2LP8 "y-,@,#67-{ylgT0+{uHtNu垞BmYx8&tДHR <galXDt4y66C/I{muN'so9V͟u URY>b!MtzWYJ7`G'p^¿N H/ khsUY<#t:ʫuv޶iX8SOe:VCd|"}3?ds]x{4'q%.f8ƨo2SDDBxk!=M\f){O]8ֱ#tFS}GekE endstream endobj 318 0 obj <> stream xY6 ;6"@R ].EćD) 5(<8_7sgn-~w}h)7gp\0Sfa6]ST|2o \],lYG^ϟRpZtc)_Y>"@ *F&Kf(Dʓ̚A-Z3elIJ=ãd{4e۰Y44Z[7cC躀p oK *_["n.JP9pn)ڠbp|#[HkK'Z uTmZwthکSU^Kt9(Iz׷)A.cSQMS8{ h pU!8L gpV=!P)lc>.ڮ{zؖSuyI0\Р}QT@_`k̊IÕW=XmuyOZWKl_'_-{'~O+mw/b2U <`QES} UbyqUFJyy%퇿=@1 endstream endobj 321 0 obj <> stream x6W.$E:.Eɜikw4ep933<t !6]'q۟7cl10"K6flg8L0/挿_|eچ=J' g#!`;y Gbp/ɘ˱(Rq06O1BW܍TvX᣽%+d۔cD B\x&%pDXљإXn_,b+<9tGz-P+h9K{%$s}XO?6x)ߨ'oe=mzK5:"# CU+B*i2k]:=ٰSJfzF#4wأ5zYl6ٮ15 'e>KK5>aԚmX֤#.v)Dbq)#F#%_eFhUdFD f 6t"OÖVBW(ip44nSz-oqAhFЙg,oX=FEfJE!;cl-a 3-#.3$I意\d ΰT3aW筡="=68  6Qu7&L@J=h!:$jLӰ[`Gmtgh6uqrw 7;Tm 5lsp>54 ,y^3ָ2 ;WnGS+s>ZTijZ}ћbdXE(ǟy9`=>6cpWO$ Ku(ؗ0֩6cS$4M06nrt&DSV쒚߸tws 8U{KBgYEW:lj$Lk\Q6'gn.sXAhs4_J/] endstream endobj 324 0 obj <> stream xX6 ~q0"@R ]ǸJ>x=Ⱥׂ S"B73ł+ձ4l"+˚Ȣ:cVQ]hr+HĪ!2Hֱb46Ņm,g3Dl W/FJ=NRW%bų2BH{Ts ]m)pJ6ujDťuv?G-R~h{)|.v.%; m`ƶmP6 | iˎغ1}oI^KڭE\o`qxq|i(?Fe d+lᙋQ|a$^%)\$Hj֛ lJ%ݣ鬴on `p}ЛA~ )'=wt{Ew^AɝL|0de v[p[oT~]Vիaޫ [/L]ҩԟY_AfA6 q#b:>Iribw~ W endstream endobj 327 0 obj <> stream xW6nWAvg:32ub_a`1`#vX7__@pȎð9r~Bu0'87 4&H#r4K e"4rk_~+)N=[g g6b&&N>ږBx9%8XD80Trp+4fGm+m͉J-@hZ6yM:/KlSZ52ڄ:vo}Gr(q}1dC-O\4s,\"4< {:ޫ#6R9KE* Y8zkK_ga Haa_%5t.r?:e8MR_s=/ 3Ε%X|q8i@Z XA[iFsoQ 3ጧLiPNCOY@"L4YlH`7\,I{cJuH#SjҢ*֌JTգɂ|ϗI~^F.F⠿Ž9 OGQ:RP> ZW&Dt_⦠ol|$r&rL 8&'0V= (جdeUkwEk|Uz=,_mpQW,~Ut(2C8ZȧBQ _F'ef&- -!3Ԧg5]Ѭ+'uKna@Hg)wc@&s#GHdm#7z0ize=iz!$ZR6Yݢ&g!ܢե.R +]~qjϵ*@\lqZ6D=*.B:w#Az_m6L^o"9^ZᝌFSkƭKֱUUyvZ6R̋޻ʂ[Q-&ܰ>eND|Ymv;7P$']P/٭2 endstream endobj 330 0 obj <> stream xW6yS  Lf8()sO)nz 602jQ`_ oIcq \Wiov`U^ #楈e #*FZ{onj'F}2TFĥ[BIuJB7o%0O]+Ln^>'%&q6CA|kjn4(L?xҢfql%d\?26Cx _]̺|BT(xڑrr0}o]izӃȥ;m@Vk\'c^1(@(7@4Qr9|th۔V\wq#=,JLfNX]%૰cr5q d|sW.#s)at{JAdEÜIؕC3T]Ƥpp1U*¡XFݳ_ E"jE穅YIpR gGY5\xOfVD8SZ{hCƪ6Jca[N-x&> stream xXDy MvK C x|dBue= !{鮫vntt˯wݷ?.!;S{;LSa pe,\hlgGg8?!Ep-H'i@>F_|>!,q{ܢ :S8~4kaw"*䊅玹P3|Mx+6da]o&P,Ͳ w[wPNѣl|±}%y=+J5ت_P! sGӁCY_u Y\HG_AT,vg2Ȏ wK# C.Dg=8 ݕߏO<+;s ,m潕$=WWel2,)4;OQ`;lB<#KQZ;E1a8tTa^"M#}IN*;Q7ڕŭ3 5{bȔtk2";̔`,LTfىl;Q,.'O 9UmU.`74":&9uW$͵#_swrY@:+OK8Z, ӢmOk!ÛP##.YQ'.8sfV*xߛ`p0%؏MTt PWIҤBU\=Zz%6V\k Y)nS[5pF1WS~raϊNEyT9֣ [Fg+|E#!KeɉX#\mIVaI_֭IQ-5J|LȕXn]EJ  U_4wa$_&EKa^}HZS-O!5nlyN1<[T yePg*LLQAei d=ʢUY=EbT;&[.}A͚ {P; T2!$[l;<+TqV1ŦEkNw9JW2C(\,󐱻B7FwNnSV\t7nko<4A *{yFLLܣ NfWO\=[Yj \ag?:&iKG0ϰ]xh16U0v6*^HkbWzt!]}ŅTEz5t 邱(K[]U_0؄> Ux>HD*99*eR5dXS|+.UgZ.N{nz|=CC_)ߛҷ6J~z+RPڨ?aA9աF5XLA2G2_OOkp endstream endobj 336 0 obj <> stream xX6 q$`pI.~t)MD!c&MaDRC;g3|?f2&;)7oǜϻ1vJa4 },>}}hADO%vi9i \V& ɏdgc9?k U3 McrLcq3[},OTT03̌gM Lȧu$ s80:J Mg4&FUh8X))lZ+Vx_:xIP:fbAͨRnէeZ)T~-* 5;QJC 6q<hg 9YlUBP,𜙙<)ƏBw- 9%JX 9ZVqsW|4YvC*Xٮi>qd{Z1l.n]BkR},I}*VȺAh;y,ZZel](aBzk1i,ub8"s!цm ʕ= \ ԰R.b1_i,"Ֆ(_l᛭M]r X4ϑO1(nÚQHfnTlx9Fʢv;C~+~z8J dG*;N.?ɺsc|~z'ٌM-Lftbrd(vAeѠt,*/}a\^iNra* ݿamUnHaխJ޴DQdR;cs+&>ܼ^_PaeΛ_ D JSXR1&KwdVs,٫ \]3pumfntbڢ Zm}XW6F s4IDsV4  $ttKfhjC`㖣7z76rN:=݄G>k_W_ pJ9리~؁! $~?z6)> stream xX6n&4&0` tf8ЙmO\KTK5X fdիE5;]voK˳7rkgӽy{/{>ZBKeƮ m;t Ԉp$듭ý%O>qg4-||%[X¬<%H-د(KYPyL,E3^0GSKnfEīI~bYBѨxYҮzǴ;C͛Ͱp8ulV̡)FxN,Rl M%=1hd|DZgTc< {{ӾWY&fi1Z6/*\eYh>:IQ$RXG9qC6UUOꙪ25UZԳC y'}{ X(b:rP,ڋ a93s,Ƀ v_G&&1PfmF?ghVF=QͤM2x-c4T [:7UX;5c)e)d(HPI  v\X*KQ.0%xZ7c"UHâ!N$0.7yjv=5{9kſC]OvHil{646/Yl<םb#ojYg0"߳slgի.ΜFe9 2n=f"puHBgK;ˡ(\rI^n<ja\b+k/Rڋr"(Z0D>ͼ[xjYkWʼJE+!3FzW*{+EӇ%čdb22AH24:'-!;m |l+Fsfx`,f}^XsS(~V Z,U~&TJ86?8j%C2SF+Wne߬լ8iA]bO>7?4=t|LwlڐN ÿzohNoW>XvXѡ _O#o4U#SnӝrOXKƚ;ZiJF^r_wx٫ 7P/[vסXx'.Fu ߨʬ<0tƥDdž]=a!>ÁU&7ju_%*+i"[/^ Owq6,ECsyʘ?-kw endstream endobj 342 0 obj <> stream xڝYˎ6 )xCsYTjU]p.:?f8//tu3g>_ԇ0s4voq>_c?+b7)y,\\ϴ+КBl\%'im6ΌYkM#ߝ p7e_p%_z[ v#Le|ߛ}.nYEFqv̆l29$yJ\wFZuy}rx26n*D6Ec~ZHLF cʤ17( H#( .r8BYw0#8XSYzG,Fe4XgLRٮ:㢐usd{u yGٞŢFl9.d$HCeFfֻ~px0\`c%󺵂yOwz?*O &VaV7>&)!t(I&p5  d$n2B:aG$shionPaI` MLA;ØaS)& %y|3nN3L.vރ$Cx S4as(:-1qZTI/dXy'V@1X /vT_lxr4VT\Wir,ٌbDc,8;IeJ[s+~wC&]#`F+VC `P?!$ F!Rc[%b?m`ٕUeLcAJ^g]_t(Ў'w2뺅ޮ':nRK' Cȱ=b}0EƮ+ppoU|$ݛZ}M4]81N7zhC"u4({2}R,>;R/uMlP1pmmCi9U5[KIŇoͫe@(-O_|<|a?_]G%󷫏8_λ endstream endobj 345 0 obj <> stream x}T0 ;n)$E)fu"߄dyXy=Op_nc,=vy^BvSV~0,$HRO pOL?IkjCOjm}I5#x/ p.r$z "gݘ!5"^J+UT܍w#(ZyߺK2d~m^-%P0vDHc FH:xޥO(}0AFɷ,p1έG‰4n/k69]c's%qy! mtח?oO endstream endobj 348 0 obj <> stream xM10 EwN/`7&q% lH-dc 짿o0KXޘ 3c"E` cɊ8ž#NwA%۴[Tѳt~B .N[~N ң( endstream endobj 351 0 obj <> stream xڕX6 ~,+.HatWP)ўwG)H?Ga51&,sȮL \|.B>~mЃLZ =?їP0 1-D|=@HzUshE\ qT,OHӰt!Mta]/!dR'z!%$nd)$&S]W/Z"Z~kux4^-VXG@`]UH g3oNWQ&w|>+c7~÷v'/YyP}y`ShT2JLq݈ho+쏏6tlraˈ~NH'*KA[zJE{ pI"տT(cCoe\E2'm}g@jhB0y5e%~5aW}-JB-56^c$5A4 9RcG!ʻ9]Wrm5l+S)烌Ks=,>\6jCL+cE7E1~@)%:^IhQ$Kzh$n7ګ@fl:iʄoo[8va=jS8`K=hHlή1`m[\b4r^Ң,dorPdn;jB KVF6Hw==nE\]糳 GJC1UW]NIѵO=y`ݨ\லc`icg#؇j}8'M&g* NKHEitgCB:nd$E|RTs-)~Xh(%TʥZK O<@.ijY?a>L endstream endobj 354 0 obj <> stream xX6k9|0\Ht [lmo2P,کRy̋rw?Mݷ?Kv>>*#ty MC5I,cbdǀn . G@Upβ,Cgo W5s L^NcL/B.8>,-OZfpo(4R XD8"Cn)p=JyY5:\Wpdj"E`mgX0NȲmr*b~l Vq[_#LD{曊w`H1 2pP!泹ggQ.s'«܂*/&Sʡp$ރЇ~mE'c#`91q5DxVrzw)[*O5ƼRu.iB!yy/;i"We#S ug(RJWBgcv δњytщoM.vtz0 `^I`pXRͦ5ęc# کz*3 .ePy1q (VpT(%1GJWt= 8Ъ|dz}UNWjɽz=͑ ad)Qk8؜V/ T,,MV&M3h {29EQV).UˈNj̱ۤx6x]>&S}ԩ^@Wi(BB |v:[XkrRRJJ|T%r[1 *r9ja.7uM0F1R?>I%\z-Wg+@;:;+>}n-AX/xBN]n[?r'"4Awugk)k endstream endobj 357 0 obj <> stream xڕ6lW ڡ[8_J$:9)lI|G0d7<~ } y !k O8M9V풝:2LN=~CZן :V>1zI,̦%%?&%J B,.>hyZ v!0BgoaIFG9sD?QB?H&7j)x0v9i;*g|b]C= |OƲ\ ?jnR̪NԊUdptehhF}*$B/fa;BIt7I W赋Aů4nu@惛Qou>5x^ơiH;y'׾ƟY%Egohs<Ҧዥ8 C.1ÈdoT2GqRŢ!/ e endstream endobj 360 0 obj <> stream xM10{^ؑ $(!] ߰(P4 endstream endobj 363 0 obj <> stream xڽX6%)RF3tPuƻcx1CH"UEtwsu˷Wk|1u~~n>\p.7˜?;%wY,H${F9>`,%B&_ l= ;e|UWdV|1[DG,b+HzA0nŽ9ٮH ($\H5Dtg!4: Ae̴۪7 :5@R 4Pfa$8OMғYTdgjr:y[^r.ICNh+En;fꎝWMqr`Rf12np? 3ւ_n%RˮBS cMiEM&y!;:J{t:+8nދi@o)51$!%t#R727}Km{IJ of&sr.BGq GK# #w"qǻTNZ o E;d(e:8uZ#ۓ%x?YFAE7 vbmM MzRIYdȲXg}OLمrIVr)KjfרhL4'+h,t$3YE"u@hp2(Z-T\v*X{G:guuZCTm:C] $HV/Z3JH }ڿց/<]+^Ax.t儫塈6"٩NN$2kkrM`iFc/U3Eb5V^2Q.]Hdq0QW;\;Ԙ줻颻 endstream endobj 366 0 obj <> stream xڽX6  l=v"߄(c.=EQ!?ۏإԧv+pG 9?!cD-{g=f,<3<޻ ~K{Ox['Z }C:}ym|Q{8P55į4o* .rY$ǹ:ew'`|Ej]ANbN"Ckz33dOP~֚{I6 6%G䂘TjY"wG5K wͣe?ɍZ^DYb;O-SU֤NM6+@frP+C 9b+͡gjA-2x=`<ڷڤB3{ zjni XZ0l(O( bc9QDWF_^ DPVrZ/e*א vOWZ zyN]mj)tYBezL4Oo51W&!j*tHȌEUI~4 ioL6T8/%tvܢ)f8b'2kᔛ46hCՖ.dK_JnhcY圹̺7H.<a R_fuzѝfZX's&LRuZs|#hRP˙Z/pqw|c|=J%5B$ݘNtL\k&]diĖ"ZbR&ج:~JL_j4Ri)wݘnmqx_GjU^/@(i~v!}.;CQy7j5^|єH!uM,^Q*±湍Ԡ]K0~R c}t,Q{a@7[M琚oy_Ef-{R"KKS(TmW)m-sY흷zy#{mkͺ ޸M> stream xڵV0@D :E^Q Ǟ:]כPGMWtm>~f 3дo7hưׯ+Xg\ߴt8R InZ06A6-nIJs^)huiIWʤV Jy;~^c(t1M. wҺ(M|4=b$rfWyec"Oֈ]Ѫ[P):Dh)xG޿{Ae%ƽ }*m+6%.#Id2:H<ERBǤ;2Nx0-f2Z4e5>)&!e"1!Po=ǰ8QD& kF7igbzO\,"}]'S.~6͙&YIT[,Zb\*IPdq,>NeʳYnMG~O:5 ,6a- ;  ]A9GSt4PT0NTJɤYRSv3dyNc  %0oO'oxcmz?|zj]Ij|\.=rJF6JƗ9^I2Y2k?'Zg}!Eu?΋^N7,:2&hs.B> stream xڽXF ).$EZ&$Q;4r&741g4/l3t!<&.iy,ތ3x;{EleA&u2vpax>Z`M# B~y˕uA9ƻ v hFp&_Ţ s􈱏C&%٢-\3J'VӴ6eIH@lÀ6sCErQV̅>gf&wړ|o5 ->֬rgõIdV'$^|6/^'ZrEf`kzV p@$K};@l.sy& k,J|9wS_ "%t4 O P+TS*U.x̚M-|A?!J 5!b+2~rk=L]8 zX%sL %x=ֆr`96#sl|\@VXef5;@`رAҶWE˚f9HͤXzqv<(+dޕ$l`@soC&Ư;xcӮh BXI;x~Lj+vEH񘊔J'Ƃ[Q7a-|,|a]P V2x;\axv>8Ɋ,yrQ r L燑@Y;zFٗ@OZeKs(vwƨċ3*'ۋ|1*W㻬#ӊ qr*f.Wc]Slν %q4XiGm5XTw-]P. E##0mDbVspw]HQFw/k[6TOAU!/Ȯ+iۋ3?}+0_P$Jr{ZqeYQ髕hrTc:Hz=k{?ƹ\ 05^9+F4V(\/s$2_oƣ/jJNDz.32 SپvL\ 2ި_'W}<|U:QYMʨf9ܷ omui1Լe*hoҜUD08|Pkǜ(#gw(Y9??p+eO2~34 mڟ > stream xڝX6 qD=-`EH` g۟﷬cQ'8TcY.^)|㞴tgzv*ֲjSp_)}.Tqt.eY^=JyxM@qæUUXBQ( >SXt$ nPd&֌?O?/W^WaKMqz飇 T)[!sGy)4g#*ep #Wɗ5\ #z+estT@mJ63B p}HU{9CBxpłۥoC/EK9cFs7QX5gt`G :B+J֧5vo?rϒĆ 'k`[mxw VC㊦^zA"T[:T*xN3Ѯx5`o@m{֣kN`mS\Ky7ycCT KuY+Pc]gXQIkvi3\fMflڜ̔TYvKN]RIrK+6 '͞ VfC2Ȟ2ۇv?('lkO+_uQ&hЪbނ4j cYM=卿̧؋FDR{49P8 4·w ˏ i3.ǻP@cq]$ՖbK.vM endstream endobj 378 0 obj <> stream xM 0 >^d; !Cd(q8$!uXy[C(4PjLdؔ,YfHOyd*ub`|'"@$Q"pϐ;ui=?ӈ$cTǝp||^u6 endstream endobj 381 0 obj <> stream xڥXF {9OI"@H]Bn3Yv&W4{C7ac6|7\>!'9mqxZz;><`&fr+^'BPo#QoN)<~ gFkz|"Ts)OrYGd'9? % UGDZB=3U /‡}P{ vE鞯H\%aGh JwB2#Zq-^U!ְN+ j(*b~jmzw[^0`Ȧ9sl اs,I![=5~=)]gꛥF;IxbEKP9Q *=$s3T(D13FKӋɱlX2{,pME(廮.՝bcVԻUh'> o0Ȫb4f{ zȚA L{\.AJƐE$(i.sS ؕ(TZɚEڐNOc 5 jZ41S\$kMՂT[>am}ti]fuPs--})UD d"H1h0k {ZY*3urNKBiaӛo- vS8,MVxEGD$H-:O*h1(@X&,M`lL Aθ;kzLڭ4˃TSF"qR9jXZ @k2)(>i9xB~J)Fu q-e=~n%P2!~!PO9w|:uV%֕(Sl%RjBG0~o)*J`r_TnWYO8]d]G-)HmahIi| o&#_*CEN2 4Uu`߆m%-GS==jMky-<{p`{Wg%(<5X*zWyYϏޜq/wI@Tgws op$!)®p5L, jd|px!1_l=7:jӤm1{i9PBiR/m '˾1%)}Ґ<#mBUORcmUV_^}3 /d+O.>:X0}@xfR-_ ɘ3q8h1IhM?qP^S t7W|_I endstream endobj 384 0 obj <> stream xX6&\l.]b%&$]#ưy%Ù3pgva{sB6$;Tc)1v1ľ#v%DI:yx|O>Zd=J[v[`he p\-+EgL0)3WbN6I-P((7gVjak'Os.dU\D4x E¿LY'jx Ҝ%:gu$Ɉe{7y'7pdnґ1AO w`bO:|Uf Eh҇@|Ik^ + FBu21~pm^w˕oItsˬtVrQʊڡC`{!`&&ʷwF"|&QHeOvշсlg@<g鎲0!PYxےy0E9Wc> o[y⯦FR1$UVo],ps r3m"O|ޟıh𓝫R)x2 vRW\NuE_EV)GkIIl:#5A:RM%CE&J XLn{j.܌\z&)B_Aӧ˶&©s x[9y}Pg2l#o&YB@HCJ%f߭i|'I$^x]~RG;\ܔvԧlꏩMJk.If_+*ϑ@,k'hW8?@,2kY@X:vFe 0Ͳ-cy#A?*%b)QU5.,(zVW+#A':#L,=Oω6i;6hNk2kv:LeASa~Av}{[juWrwiŸWF\>m{*Uǧ'ZUQU;/N%\*v>Obn+|d Ȩu5YDBW+'?ZQ>^ZsIE5J]v/Вv@߼3(Y]%wn}W9 ˵A)M}ڼUծ#ici8E_FzF9~7v$It~'4O<('Jgoݠk֦è9(n0>x|狨5ݳ0cU9jJ}|)i.RՂu}r.8xs5wnL\o}'~|%vAa{aIM쥅L[e= %}8 *7Z)O!j_p endstream endobj 387 0 obj <> stream xYF i- L`p9'U,IݭY B Y,xLWg;ٮw?>x B7oo}c|M|B>eI9LV wT(BFY)W >E',R,,L6&-P ԆTKuQ^?bY3.NRdsp":{pMT?J\MT}q6VeUZ%I՛Uy-Ejf YI)lTt JʠP#pL%bi5<𗈘[4EcW*4}{z$Ԅy0@ .CC]06Er $R96^菉,kٲc(yV)c?I14HUQcJ_hC;ˏEKmhN^E';5gn^R-Z8S7/+l&59?hh |"(rmayV')W',q㹢*x]3 r9ӦRK;+wnehiQ+C;iu(ھ0ic]08u_Iր?RBqn o8 endstream endobj 390 0 obj <> stream xM1 Cw?В6H lHWv /0ȆQ--8('ΧT#/Y"{'fM?8H,e ?gt^]xDo WW(X3 ) endstream endobj 393 0 obj <> stream xڵXFiO7pf`2Á( ".`8iȄB"16oÀ:I:rs8bĀ+^&ƶ:݁^F Jhچ='Eto2tw ض0oBqmmoY@x!cѝ|'ƒ|p g(<=|omFC Q~c<8aX<$mhK(~oQ{ ({؊ًHjG_`565+dQS(˙ɋ'u\K/o7CcC "&P`,e|tނNEMEz0!bڼx;*0%9.J)"\g&thMZE1 gUvSQkҞrJc`l&\奸 :w!X1T(70^BDWJ_`7+y#'LUY[ERcF7&W\BRڜT!Y6Y(l1tX F :̝dEQR"t3u$uV{- w*g֚4n:ƝK2c+!{Z- $HþNwEs<}SXz&md#Gԁ.PCJ$! u 1{XnױS-oý/גuvuS)WtyÛ|)j"|]>Q?+yiᣯ/k04k0=ݿjOV+cL~ 'G)lxXuGS[]wqin:׹T*6y{@2bh?mή$֯[yeaaf+[^O%λߜD.M=sDnsӻgǕIkn ~G?P{B5ͻ/mpeW%[1mZG M m!: rr 2/fYveT/ag ٓ 'ǣ&~`mMR ד9p R ؔL`D8_CF7; O8Jx"(L5u:xm%t]rvJ7'4pYykt9%s4]6~EjHHeզ`f rԆM*ٺl[9qu܌ٝYF'JR>&KwVß56oj_ɯΉ S9~lW-\UXK/fӗ8軝[;cGNlurjbI?N \>LkDoE;~ȟ{@|dרz|t[IZ8UњPo)_16=lDW}ygT3jfrW~3 endstream endobj 396 0 obj <> stream xڵX6 MXllKoBAej]Ǯ`s~'MWE7}nSbu_Ji[ߟd+LRW=,sUzsR>ouI]vsMy6Eoh˪Ҵ`zgУnTY}cN]670G60Q'e5ZW>&7S~kըWTF6_TJs k*_l+/H^m oaes4j`9|T@uN׏N+''3CHGT'뛼Rdue%'=Ҡ0" \M%տC΃J`Q[Y1yEkΟ3}: U޲ /}'܅VL~Vz@vl4h3Q)p(].>tGe'6(~.hOD2|脅ܘ?+3W8SwCPwYHč2LaqH(& mòjP+I&.Tf0ƒt Rҵ#z@W48Er/V&\rLxF[2?̮Ԝo!7ʞRFYY:m"J\beX:  y0Pb /lR  2jK7]ڱ_nuWvX3ybjZ^zGA#\a\D(MMeM7&.sMwln*;1@!*hK50!MQzĖ:@F~Ś!!hNK`(0^g(0{nWWUi98֚5|W|"7YЦ稩0+&/R$+Jh %K W_sn${!%A6J{SaҘdR7Hmdkἰ0 86 .YFhQn՝BbKICOKBTj8@R K`r )i׶1VyR_hK^l4U:U2>:TMSj%R}Te& pIr!/H(pj`OPAPP6"Cih;r.\3P9m W̕*+ز t>'uQTETIGU-0%Ʉ,F%}ܖ1D+A۠ ܢ15FZ9{HJcWQa_QmKW_DkW7Ԯ#uCԜ%W1Z3#ғDyBtbaq;&oeit'`9 ,O``cz^9d:+' ,%9*Z-_ie>9MtQj:՚K"jf7s UK /GN&{aP8o U>փZUVԃŒ#*t%F &ڝFN*[[b o= kGKkgGk'\ _+t'1[*L$5q!zg=BƑnmUQ*o5% ?k endstream endobj 399 0 obj <> stream xڕX64&0lf3Á")g+DV|UN);oۿӟ/;9sKCyY16?˞Ϧ48dͬ9;cV~7N'S*w,^i:oDe-/SX*trY+eNM?rU(Pו)h\}l Į Y8QgSݒUj'FF BseS03Bsv`.5Hx֤hWԮRiiW5&!W $< H 2.]G):.n]< +僣蝎|iq"<&RER|n~/NSLs?%J12 $YuGʤjydV/49K>1J}"+kk(ɱ0bKbb, Z`Į G[evN#U""/b~#Ք3EC̮B$kBDҳQPqsoq=zT%Mb/BeޱM@: (^ TR;=2o8?_&emZ1rsOC xؖ6}l J)]ɛ^8cbK-]Vеsfu8W@? si/Gm`Aں^g֡3 8HVr d # H#7htШTXK`}Y>n9MeG-g0M'=T1Sz}.ӤWcdt7[|֨G쇀o1zQuc@o(Ő>Ewy{gY/EK*xQ8jvF $ o [3CU -(&կyqmhU/h8PUauT9NKhs> Hʻׯ_8>car|e7=[nmϵ6 ٻVrUZ]sZuvHJ4;-mƸT@mE䙰Y  xL 9E䐡aAWy]g {(I/.V|LǃPT[^ɦh_=Iӹ&8Nk36.fj~hG! )Z?Z γk+m( ig3xUV)pܑ^BEXOoz %֮ yIff1ЦƒI3 endstream endobj 402 0 obj <> stream xM;1 D{N1HdP $(! >n 0YQ ͛1>PGWZql؟1GI} /};h$FR x-So!q&j,FGB6<95\w_(# endstream endobj 405 0 obj <> stream xڭW6 Ro L [ 0]–.E IA+Ȗç fgd? Ldpp1ލѸy-` ys0u/FȢԉPkP׀EPa\|'{>64U޺®菟f}u¨ǐ44rE0VmphE\ '\W kp5-\5>$֧o%Qus(oM񘽨ĢAu)yAKbP]`,ku&M IIOIEY\إ66\:ݺGFvM=oI1n5񌳐[ 4JRSt)SKWrtrSK=`U v;/5A6J$س.@lfcBH9ux h)~vKm )HYiE2Qްbt5Nc Edw]zl>ēEn A FTxd&#'m+dH)~. F;Q/ }ѳ9]I7L/B 0'olT\fʆD\l=._VW䡷ߗ겝;b)5?e; EY@rFG9Ooy[s1C1ME n|x# Uڎ0cۜ^*g ~Y;s7҉"KNz!S) Ca1'x㖄'_'+/OcV#dtBsۄv·vnM){꠵͊RR"56ϕfKRp4%k"kYeFtFg*sj$K؝؞1'&};ULlN˦e?fz(FvM%im ?P_k endstream endobj 408 0 obj <> stream xڽ붶Wn" SHt RXե79+Iܙ{JwɝSNO~͝c4)tn*ypWz€L.evp/CrD&))vvq!gC l49J 8+ ~ zf[gOb\ 6œ%4.-G$T~˜Z+EŹh^",'yH2̽>_V{> stream xڭ뺵Wp W.tA ˶W<{+Xr/?B..xo)M^|ͱ\j|=Iy\p~}'9{{ם3m-ܨc&~Öte\Ki kOjcOv^ir *ܸ́y-K̔\7@i>=p-{mH_&G{>gsgh03P5[Zu%2AmpK`CIGWy{k{X7}1%R:}gV1VۈjCSP@JBA,ðb)kԜ5"e uy "G{ y.+Pr\i&4e5I ,:]}ZӝWf {1tbFƨAĄ1‹Q>X؅6|(-MK>`9{O Q:Nc%"2$YwMԯ6(]Gt Ge,'r81Zyf^{Va9pVq)}tqaMe_󼃷`=+3 G} gٜY (JYV!78Z;7bdli2Rf{0`e0xXdKD"+, AU*CtoƂ@Ѣ"qxc{ЎgZɂw:Tpdl Cpc亻59R Ņ.=P+\_*Ɉ $Tu#8`+$f1**+3DR$Ӑ*jat=0uGD]Dk|~eDو0pćSgf˚X l&$tZ~#i%(U~p/QA8sX{6U&-MZxR-Dك&a)+? TG 4thbѾ%4|*( [ȑâw^RڂfNk ]m}TqN0S&6;igO:~WqiуCl륟 :TZuAM$`JCRD#7N [ѼD{ڦo9N&҈IBIS>#wSOǦr;81o20>6良 qCdI"BO)NO1ZgmWauTv9o1_Â{R6mRmb靲HK̭\^&>\N#}Kr :̏/|!w PQ [HQN}O$l=5 6Aj}J{D# c`-8]Ru-n|KNhɒ CvQ⇅\(eS1s*F-;ANm?|GNŨE'0ͣ_n7Rj>`Ag!1RX=Rb( bXLn²}DG^IiԊא]=;Cx{:7A~ n!lH2WߙG]? E+E17ooVHT!G\l+K-'\agUȵIUJt^&Q?d?.RFyP@w%Y5E2mwo,o &Nu:ݐʭ6 [s;-[& endstream endobj 414 0 obj <> stream xX6 ~qHS.Ha[vwE޿ IfƳ;\w#ILMov߰н]~Hcw؏c~@Ә'( =F,¸-ϑ̟׋feOJ# =tvйd69-=ڠ;[C>#|,;%cFFK%>))ˇDcHcx A1vAK=|8$mRtс8 Hq8Uњknl)Va5UvЙQ?CcBc8 (@y:J١l,!ƴ曣tCm-SzE2Ng7|կA[J;{b/hUdeTT?5rMY+/r"LYbd<~~aK׫݅g[5U67xߧ9|R?P0N5O.Гָq8SɵXE|% 5*Iؒ=B8j u}ߒ=x%RPUK䔽FE^qI:l7M!eElfI6ҪEMb[&[Κ 彖$iEOr G닫J*cI]t/grS(=/\ehs(ƕ9ua|{^7[O]yAˊ+z^7 3N)0sF:,b狾/ F@ax#GROV+V7U-jK8w+N4HM󮛶CkŠV~qV rDw4op ұ/Mw d]||Z5zI `v׺Za~}ÞJY5WUHkqKO}pMurj9ߐ_]ON3-% n%YMϡK595 *<4?pkx{K+}E(/L׷]_V 얆f[i_ᙺ'[nז2ٌZt (DjXtlSK7p#gun>a5-"@, nv}c]M%]yۜʍ˥ o[n$t _V )wxohݕzS6"5ȋ%!񶳭*-EU-)%H{E7h9[$;{AT=·΋_!_?{o^fٍA-8'Ӟo\\z"O?  endstream endobj 417 0 obj <> stream xڝY6 ơ^~)$E)7!%|;Ů`_YHC߇{sx?}>~#<.!>>)q||n#px ;V=Gsm6 %P:ޒ 8"iEo} ;=)t%YLGOC7G~FqstS/v2o>fK_ûwb[,[gᝧl;v栙fR>>e6daS4WC134sU˼Rsي,ztLwPȇ!~a^qc0$ɐFLJaF(,IIg6tk@ΰc9I(q-<3ɿL}s ISn.IS@,pTtH.ԏ_V:9SE.DU)tj4H1 "]EF(jtEsUTp;>W>Mʫ׮Z@/y_ڸ@{Hpz8g8ľqVEn7'^,&7 ~zؿR/M@)Nq/fN| )bV(K\ <пP.[؂8队f4)q#6!VW~Uf>vH|]xh,Pp^f϶OsF);Ah| ]. w5f3&%:̤=nԠC+O_ZONӲr;;I6Wx1, *V:v\Yh^jo9F#=%(/'+ג88 7 ("ѥn"=윇KGUfhrJgҕ <]mC_z"A]aW_wޡ_53WE_)e2zZxP(oٛL~tѹkwnjП ONuq}ʹ˗[d,[=NPh6/~ 6,gsTd\i\\Ʊ,^V$te0lݍ&Ŧz=wJ^\_e endstream endobj 420 0 obj <> stream xڭ96)|q[SHt RyRMʴ=O0#O")"~y~wcҐ+J^kޗ?_ Fxw@ دs1G2YHEfnq6ٜߙvBihP .2e:a&.Q_Y# rTؽؗE#DI `a0@ 0R^iDX6 / 8{ ,Um$ )q\ ̞=d?tu^T˄` zk}e6bկe{nG~oan<@f nUoj~.䪳w1F}@/0&_JT4怫Hhqe0bM,Ͳ:^j<xp'jep3>4bȉp@+%b!T;ɲ D*+^GV !1T j"t>aF8b(<1 RLE')mw2SG'!.ɛP]dka&@bvHa)sYذ'cL%^e/7:ĉQL5 [mhzfݡoB682 y$Gp^c!C`'h,gF"p]k2DJ٢Þ#8'AIUڑ Mb<;Hb7UV7~$s}>Xz,~y Cukn1h6QXumkWzS*0.Sni~+B$h_s ߓs(`eb:" \~B2,` qw2u>NMTHcT+n5)OJ ءY#“\{-وk q_"A } 7$8 %&/Hobo{@xW%?TYsLZ-|/3!Pp66 ھ4Aͣz#捃iqS&lF^\t3;4hh0Y-Ct6< I j_T@{<[IVod 65 NCp:F7%H:1n]qAN)S9]R(>=uyFa%ez@z="98(:AU+_"غGsk'#FSɯCДNU[kOC'^np=OZ&f2}մ+)dL*8NjlRU%UΕBl'\Lq}@iW1Ma$[0]=^[.ܫ*JĖYOœZ.?p) 'ܖ26"O-;s!'I7)< [6HOv endstream endobj 423 0 obj <> stream xڕV;0 +RR2d( d+:v];BO_c 5?|?b0XfO픒nYr`wbYuM,Ńo" ߗ?ןa| r6",kQ~&aJ4U+"j[7yS+LiB΢ xy \΁BUN.WMܺxݷ{OyՇ xy5¨~yr?W6{oAڊYjs!|iK |${m&CJs ZaIzZEweDpjӑCGnlt`g_T>rZ{ck 0>y*C$wM=$y Ul^Y <!иQ}S50x2i*VUBy~ ),n6B+U".񳲎PǏ<ZuQIeX44Z(&}>a٪5DaF(:OjS!_F3/c4xJ9,JNwK @/Sy -ľj#oy84Pck1xn }':Q}aDo)8 sXwjsT>´k1! endstream endobj 426 0 obj <> stream xm 1{b^mBNH'zw,|͏ "ɰavFCkElMHuOĶK[:k@LѰ+jAEkTKq\0cxz*f2Y3zv.74urc˿GFe1y_E endstream endobj 429 0 obj <> stream xڕWͮ&)vHQ]tW)$w]7ѹG|xo2ПNܦɤW>$٠[І}z5,4:;4sgLKݒPi$$hd0+@k ? l>|dVB!1iq)-lqqqk3ޥ QbČ!w dj ^XbHy3A-a& K8-4*^-2YGs"NNdѧن;To q`Zaew5FDqcˊi6'ژgڳ)?W=Yig[KBZ<'¡,S3v4=[ْIjw<ѤJS ?:&Ғu$h#PGؕ҈MĮ.9J.ݫl)U!1^1wz%کa#GbV1a~a|KZ$Ȯ-;P,nm+A+ ̚Z,YQ,Y%ڙK/W;&X^j1/㡐.3]w9cq-XSlkr+rKK&fF-h[O?͕'~*)/TXCIDL~KH8.ŧ$Ə~uuOqY__Th_[ +X{PfĩF#5/0E9buJ(4f2('r*e"~ޝ:ڸo7_C$F#I]Ь8Wd vDɤUI 4*mF*ۉRB.RŅ e4suWeH)xن94Eem^5S֑W;՞wlxfjM`4V -Yz[;bS 6|Y(2fsVC;˸#FtndpL獛dgWmk3tq@q-u3Ո{]9!5oyWȅHL譧OC+LxxC&Dһ>aUє"gy> stream xW1 yyܑV[ AAd^$+oݯ:~v/Х`y胏@cw+N?_Q4BAQjpHq@jA]5GrH W[G9<* $Dc#;YlH˰mѭ,;1[ !8CDCH'1D*e1n{8p'<."AuUq}5e;yC6ĝbcMvAV*] d2crfL<)̘ iN"-!(lp;tĮ쾍ɩ:s)rhZOxI= #WK :Zd$]'V"%T RKF'HzᾋЉpK.ݺDkm0/2,wNmx',APjkz!;91Kx̀c}A-Ip8Ƒ 9Jsz$t`7k !!: W5T}a-*Ϻi km~$ѿ=ZcϜxp\"HFrJl(҉ckNr[TyLMcH)%JdMEN9lb9͚J!ۂ+V"Zj7ZVj/$l‚%VGfI1}֦ нAInRjM"W+ sXA"$%!^OmAeۻvqgRg_uv1CpB,!A.A6M*V)LZ](zf^l. ql !B<1y 2ȭE$K +%dl{Q;r0Mܑ}Ӕ #À)2ŰwJa ?/2t(FT}'cmt)`@*[vgF>{ endstream endobj 435 0 obj <> stream xڽXF ;\- p -& IdɹN`w >Cis/0Ca| ΣO㹔FYH+r?Vi ]开;Np.U*Jfa =s$OpgQBr8_YiUwڽsFrv\TcTɤ0jlVNΟp@($q C^剫S,C")fy7Kvh9hCt05*}z:OQx!BረD H, cGΞZUz MU+ ҅}ӭ735P+tbx㓇mjRZ&7pdp O2x:H>7k{x?@m$I? QQ,:]ۣԪ#;U vKSssŨX뭥gc+zKFVm~M+`(iUͰUŰ,PE3r)3Ԛ{Xо+-hf-@L)Ζ'$gm?՝J$ {CR\.u´5ۯ]Hʖ0_J2bnrYs}j,bywY٨ZcӆcW_NpJE|s.ܾ;z ߗ,2HWŠ'v'4sj]ñ^mSǰxm@b`q)̉z ~PXKfCj"(r* T}v7ifW;6ת)t! ?z `;-_"d`l$C!#NV *Q{7iWw<ʞMF'P4k3 % Q\ibܱ,]45kEFYKVtE~ma[>q0Pʼb\V 6ݴL<7LjTKNtv'#O sUdKvGtgK-SIMZBơbofQ4@E*jZ{oKȼ;<@#;Q:D;n~.q8puht-N[˻J2;5y|FH6ҹ8ձ^۔:`~^[!|u@y'gE{D:ceM;kL_{AoS/" m}8aڒՖTg븫sXO?e04 4%Cu9j bGwQ۫ZFZo?~ny endstream endobj 438 0 obj <> stream xWɎ1 .U! qƁ8eA hƸxݐ!~# !sXM.SZ7i@xecpCߑ_ d۷$MkהЅ;[H9)ge|] ǬJ endstream endobj 441 0 obj <> stream xڕX6 -L ]~v7ifw]#R`vͰ~B>t}nK>ֿB eZ&hcj9=VR[A??*9zm`# m`~d H9#oɛMamOYVu%eHeĐ#P Frq,f@-5dkXXά3ۍ1p_maǿ94mBvʞ6;j ah+ X8~ԋS :RñHZ.NNUJ$m)дѤeZ#@d ,l֗=5q/k[OH16 ;iu#V}&FLT'V²&?xFlB;)uxt]ax9*XÐG_Lx4PEynv9ގA:]U!z\Ȥ纁D5<:a8n\~: Om 9X|>9|p|0#` +COKAEZ0! z43MwƜWU=hD*ν՛&VlIiˑ{upJ׉],afV -tN`,(CHsG'٤C!,\ģn1rs[>Ӝt8RaNgiKVIBr ۱ݏ=<%Q_cKPgTB-\Ԛ/~:ط|M~mrSigEFSBLeS%9QaMZI.aF[t6/YFh>8QDKNVGCej~U1B>J=z> stream xڕX6 p"@R p Ko2ÙHY{  ̐,ag{w3w!{y9sy^0^$p >Cl33`Meq\#.oHͲ7~ XXHN%+iX+6{4!7vEw.OB{-G}ƅBx hB{efTyYYQ_GbWCo.:T L  5 8pe;5%X%*wou.T`*9( ,` pZWĝ;U5~u ת .1'; "Z*]!I^7q4UntZ׺BŸ(&], r*qdJ[%Q4'Z6)xn*w;s9'iϪ{ԈQ;3%ʎٚLb &4 j.Ni׼m*Z:DE:{(8[=ìoR?u1fiN0R:~v9]%Y-|Be*mz6;Vj|i<s 2rDi"JnǤ6ls9һ5iP$[P$dmS@MܠҀ * &Ádlڏ-6n;8x{V栕EEb1OĈV(foC!mګTGC꫎Y q2<7@a褽m k}gI$A@;qH_m$]Be FKڢSEjjL ;g q(cn=+__r@6#4u7VbSsְzLn겺{R!: N1AIT07BPbD:~R&t38lǾ*6ENAZkjIBZ ΍Ax8;8Q[ܕUEܮ*5I]\"܇x~H>Mم5'47saϐ? :xSsdLiTwaQ9j&mrL( uhp9Tذheڛl^hϼr\ac#8Lg1K|/b7p7q> ɔ !txQ@ϟJhU..k rHCܤutۅo]v6%Jd9w*3.I*xg_B,K(Fi0WW+ ta,*oL~/)=_*a龜>MQ~ yo!Z C+8?J'f zwcZksz%v]7oNgw{oBCu)`T&ɵkJ=$/} BjI: їrOMĥ?a9dboIHuӶz|R6ˆ.~ "H-0?qvXg endstream endobj 8 0 obj <> stream xnyY&fwU 00l/t  }3)-{a5eѦ!S]S~䣔QQG8eΣ&k9*KVV?*" vhQ:@36_Pр[?t;5Ml-"uy  8݀d܏ e$J(T!!4*laL&83G>2Quw.Owt.1Y2c DA: #hIGsdQX%ˡ)ف灂]gfE@EY| h9 5#96lHk@?3GOQXD"V Sl !:*!)k* C+ܯɷ񇂟\WC!%EKԪzҁ.Be(*MJOpR@>*V@e*+E21 64" Lnhz)B 'dˤ"\M̤IX'g> `G_^|k~zqӓ̚/y介W篟&)J[B5d` P VLbs>),k) e QDBlG߀+V)R<'CXjf 9hk܀Uo{QԄ\R;-HɛxvHi@ RIL@IAa95km(1LQe,8I.5qs7`=]3{oHg+`WU9V:wV)+H5J;UYL$.WeKh2W9ڦ X?.XFpr-US4*y떊JT?9<˚6̪0&Uf-ǾI)قE3ͅCj |US@tI t+uCh՞]Ζ`4:Sc9 3jrs@#) vdoZ>$WDD`\סnIO4hsUb%rM8xZMY' ܷTGG:p| d{F\ 9[qI`N )e[=ǧJ\Ä:{k/;\󂥉ELy3O춥c3C% +~]{a)͚w9}>>ff}Q?m> stream xڝn6WVM 0\Ht):WIRZIoIq.řlgvo_ݯnCȡ:ѧm? 16ʰ:>n7v`q|>|xhuIO| mgGA>ad0_,k=jcGA 3 "C;]9+t3@ʣ %:x HuáK⁸q$:e C{^{ Խ/~x* RNMnԕY]B`Aӎˋ(~!~k ,'DMYr,7q'_N81KUyF'v@0i8* WcIBLL.j4C(MǪJEႜqG&I)R +__e<1EDCIY _Q)EigÚ_kV/4sD|Jm߈+UH mPJ Ɖ%m7Pi"z4zuhAL$8&:Pn$;i7?*:r|OYq ,J"fQjv[ܦ5]8''ơ|MJ,(g.Il|ޥ3g%߸Nܗ^ A^Qơ> stream xڅT ]H+"%EHRšCEw+8/Æa-dΟn>~aW7{5Y) bQ?HpSoqVØm,4?Hj!2ZtDX"elyRJ q^[I=ǼFbiբJ PqCY : :*Ęt-k h9VLVs:BTIټ[oq;09nn]' ]$ݰL@ۭ4!1K*fbQ5n8r&F &o`>8s1}ZUJD?.ӭ|Ll; ;D]`-ݜ3K[In~,}7nqwj0m&5>6Q1O:h&pڨZm̾XԿo~k endstream endobj 454 0 obj <> stream xڥW6K$ xg&3he K=ޱ%Xǫ]B7!C~}}.>Θ c8qc  ̴vbDk|wb}ϐ1ѡQzNC*fKTa)Ч!$ # "Kՠhŷ@QaVI4AB=W5YmsĎW}AȚL@}̆ԁj!H܈EAw>}@|/8UιQ${A<! so1J==fJU`63n7*DBoT3imA#%`[Cybѓ-vvR:1eS‘pZXC{S鐟 Dv5q3h14,SQhY+s z[Q%0{XAGKK25o3bBYM%4K`ZO|WJ՚XmSI4c)zVjd02 ͪVCk-ªY=W=X*M a|Esfpmuá$b=mqLε2XTާ4>3؇i>eQy+ ^yE0+c%Ӡ9a y.8+| Lkry;J렵!l>(+Th@`FINC92m`b&'X|hO%J}߂wy00F77HaZk&Uz.Tt- ՇWwaYbZ3'Nsٗ[wGO[mX:L/zBKy"46T Ok13S'L frӜ_`Ͽ+r-$ٞnzQz5Ǐ?kɮ̹Y˛N3yNG@0^$ooVL2|<̭[apP5qr4Et 5ߠK1ćMu]3"x7Jd*k\v%mcǺx<} IU W v-9 E"=U@ V~y<LZzW;}*MO0Uc\ ~v.l;93NeY+T N|y-P|}o7[aG1x(7z)XOq)feĐ&?ߠIPrK-:dkQf'T endstream endobj 457 0 obj <> stream xY# ~;0N )8]b|/M(Dcݿ v#QH~sɟ%wqzIiITe)e]Oߏ_ O?aA4 B Eb9Gxlu_Ev_)LguQUBn@oo %^J"'t,/_gxHp+U_B;KZ1YR!~ޅf)~Ӣ[#>B&6F/F4RtiRVXILRi#H''«{9*ABV+9)F ew6Ġ}^iژe-o)GBHg29L&&1hN>^ryWJ{j׹eK'ugMBn\_ݦ;xe:lu7x1MEyL3)YmpOruH/W4VELǫi%wNPrA`;Qj#vPl;rk 4\n51lĢd&.0*dGP8t?NNUR; jq3Lߋ)*U_q8G-kfk7Ysek2g4mkv'zl]^"S)@r0ʯL$1J7 ZLgٵNR$ȼ CL1\+^΍gk3hYAcT1GTe4zЫ1W0V~ )U.@a(#YrUZf[5t.oDz ,>APmqUs.orph`bj5]ާٮzc8O5QLevӴӷAmb8*l[҉XGjU/V& nS>1s$u=J^&40e]-R{E .-qK/|}:IFG;R}g&uYݿitJkAW ʤblmZumW%>xPoʹU~rk@FCB<59oE,Sp$d4O`ߤi@^$ endstream endobj 460 0 obj <> stream xV0 d( d+:u/%)Jvr8@!["Çja 6/Is5ץ&Ŷ @=^NpqDpg#xPN!fnT\ۅԜmY=h5\NL;k,?!=!W tM3UQw")cŠ_7mSF@(YzM1;ecT¨kIC=E..acmޝؖ6^I9AV-n/8' 0%8qNC^k̮D&q#ܳY`y*_y̍< 'zOQ'Q4,E.l4"VT ›M9Ί%*EpSbyΫrdq]5WM1Ҥ5T(Z])Z yfoJ@΃ܳ^\W >:^礈ټS`!O*AZlqF+jO^]f˱]].{7y^H*Aj"h7ΰAuunYI_^.o Jゝ^>dHʠL؎[3J>>ys.aqi&S ϹpmM1wD>~ endstream endobj 463 0 obj <> stream xڕXF +.$E),KR9Y{$4ūLwhkIGuHWE_DQg2ˁ:x1\D6P;08%XnY0(J+ JPN%Vp8mjɗk(v I>Gci̳i qlh0`HǵD%45Cd#oN!O5ڡgK bZEIV5f5lɒu ZE/u5FuRT2Zp_4~S".J$Bj9Vj@fHURdm0KD.R\'VYW zbprQI "rjuNb2.jy&JB(U}Cݐ#ԭ1#~cKzim/\Q}T2|'NtkF-j5-f'F *Ւl{k;CrijnKA;XM,!}m^8;iŇϣN+U" 8c%ia08kE'"nq0 rhB b4Xs)}k;C?" (& ÖJod܌SfGg 7rkNON.~)&-jkfd {Z)ciPCA1Ox&}uzqG"^8V#@[s ׇzj5C*̩}UCZ7eC%"Ae[K3.ZP&'M5LC0v.ӦZnjѪUK= rN 3rI.lWES6eJmLCC vA}qj&GeU8=sVl0Xk3iK_.7u.Nk:hR c4gF?=p^}ԟcsL 'ɻ?'sOixhfARxwz0%RvtNz'GyѥHА+[bOό> stream x960+yg&3[RuRK5`cW,}r;g=u|v?҇0slO>sn$x,<';? K#<i}>n>;CxdpϹ=_q;``"I2>z[Re-R]X"Yq\-fdyM_ʫoAe\bf]Qg Qv4,n-:LiW.g֭f^aq׾:Wq6]qlܓ QC7Ʉ'7t7z{~т_M `Z9L |sSԱ7V]!NaMG]p0V-ks:zs^b%ܛ[DcpkYw;,{&f3qΜ8={Lg#J')p\( `;2T uZOUzCP2.MW(lna[sQiژz#"ȵ\2ݳ[W=.Jj#㮹Ư<,=I}6~x'`{[N7d+QeYMMiHEgUlnZkFe50{lo-];y>5uD K,B7z>檈j"zpxSN+& endstream endobj 469 0 obj <> stream xX6z+II.vA ɶy&sRcYHp曓5| ?iLcki)9`d! !|c? _NE]+"7+.8z}&"n@HA1G %%fաcXn.&# M~L(-[;vgx΀uIPhssϊbY4S~5Cbަsod1ɇ{p9ZBcLVHMɠnA\91֝RbPoDǃiJ`i\&d)3tʇ>[#oʼaH r}Υ `B428y s%> stream xڭY6 ~ ڡ[8ᅯH%9mq)ob;]voǏ|7!}-MSwkj0 #풍L>0|s;JϦ.$6:ׯMV&>HlXP#h ^m2,L # X2,@MzͰ..s]qW\4N0o`a<),\<|ƝMeUсpFM +7&6wRIa*T G)RM}4Xjbd PWZH"j%YތmbƼ߈ 5|'WE9$C`V9|VrӜzZٖ!r7. xB2l9B#Xfאv*"m^S9yM` I3yUB!3[o̞yGC!EHjL:cb-ZCҐ{|vC9Df`[9Jq7Yq|7BSЏ&}x| *)Q~TC;iu$Sn)Hx@ ֻI-MP!l;{\5+&Bʵζ0d̛Y4dhcJ%Ju*%* [ldPnoar5rEفY~-V.rwQU'X2F=) .VC MU'tʪ4ۄ].N̶{*%B 7q]?z5P")y\">h7>NZ6x3OTlp$ s'8Oj >D;yOmnp9޾k r;@5\,mSիc」yʂ9`擂4DH׏}+$P<%P=Oص<_H*]rI>U.A(toOۺSGz0_%JCXТjbx+:ȖZ&򠚱e*wpϟ^=ϑ&rvwpv+juZm^-ǽJ5ZRT,{%jnE~ endstream endobj 475 0 obj <> stream xڽX6+ç$EHvA Yny-HKPk gߝnGgo}]v\?E\ |GL=>i*"r+x'IXR3Q)~>{0L=.99$ y|@!xpMW;E r#Wx@'(O+H'&G9,Tn*T&4w}=}\\_s'(67SGD9 w)7xO`&zM~E[DuUeloI)rkIqjso  64VАqĪ,Nb^ьLh)7 !7vщQHiS Gٰ&]QG,!VBzUۑ@ڃ}Dΐ>op`a{|s0}LVܦU㺩fP7<NT2(՘_ re%h?^FV+,؞qn^OSH,1WI KϹ)pι[XmZ|Py6ílMjUMǙ)06{s2lBMfm"'Jl8:A7lZrG#_)zq=Cs> stream xڥW6 qH=,L ).H"߄/ɲǾw`WG)<6h/|3!<v]s}`@>n p 4^ <;z7E' -2X_߉VD|6H|D0"l]cMm%Ǎ^A;|=.:zIע3@&]YQD4|ss]S.#c=n8b8#?yկ`o@cߌ2L4; /f֣Hlo}2ٟ_<'ւ=Xtd,䎽uQLr0P>;Mt[$}tf d,^)+.彥=CweSuѡm.Wx:)s'i,euxw^=tOf73,P"H/;_6C;~CEH#PFg:8^#=C:r̆B\dm@<^Ay'6P¾3 xf~N@r rob.+Qg^Oy]Z>N:'av >:"}?J?ŸaW&cMpAg(}:_e'V@B'{(^FYPǍ$}5kp7g0 h-mBԌ˫,Dl DՀy4ٺR$sY9rP8ʲ?*a 22ACDvoVuʐp&F.묬* Qul>D~ hJn)TE_)ZnJPRڮ|[E lwSJWKK_mF;W݂onu_i87|UW,,%n<Ӛu 4]æ3\z-C 9V\ ^> stream xڭW0 ~, ڡ[lEۉ}$Er'^q'ؑ(G? 6@7_o skKClZ]  Oc:: ` aNg1Zo"Sۃ%٥TBcw73,5$)FR9yP-AC66.XPМџZ@hL'!34g)7MÑG@ ͍2,Y[_jP̭-ƤJ.z5ASn]}˽4 Xx_ )G^Y,ڄ;I"j)_;'vq/pC&7KԊnPrP|&唁Y?'BndӐ鯐M%o#*u4@&xLNZ~iӷx5b AgW^leU|ITY ǙZ3̻*aUwd<| IT1C2PN:xv`a1rd]4a/gydqYڟ/Cާ'1mR©y߳B0@.뽚Nۜ߻_դ>ΨV^&&/??Wmzuǻ`a2XGj֡:yUCi-w6m69߫Ӆ{+(3u)u5* endstream endobj 484 0 obj <> stream xڭX6+Iy.HaIVYIW]29吚a55B64N> oR16H0,׷K6jn%]|f pot'1]Lb(b|qF0y$?&eZ\Fs4xfwx£; Sf ԁUΠ1*TykW4xw$2q'J|5 !x ; dP6AE΁55830( X$Lgff_cVlhYt|!oj4yIu6ڟenS[A(߰Vw\']pH荶de:gXXBq}<}RPbCk.Xq%,*9s+1z{s9ŧS]pBr 7@$$@`sG$g3`+nlJ.S.>DRoMgMa |,mw7oyA=Ll`cyr7ի(- 6g3۰ƃXNߋbWs.Rr#1E~ \y+ 9]i0<16$T"E$E,}T=6-pH)ӭH|?  ca@La^|v|:og&)qE|$zQLuENaUfZVo-E⫭]Rps+Ep Ե,.Fxb;'ƂCTgT/I ;H!ƫ _cM6jqH b`DzB$JC_ŨpHŬ2s05{[YXYM =XdNaz:d!TډԪL"AyvE#u󥘝NqZޯ*z ji#˓yF2}P*h:t ie('r쩔I* 8V(Dh*%eJ> ah2LOёw׎d*|%ԣ/29.L]:woOFgY== 2H?mV(ǻ-XR0Q%= b;O(pJ.Ĭ@iG>o/=*^V] gv}Y]Ss!= lwRgK F4eyC.s7>3%뙪{9u1E<%VO'UD?dS廳o*y~Ӏ%_-2A6@+O1z5Wו]WɡRw#n.tdlcn4u}ush Qz3'WrZ>Pbm]݋]kaaneԑKҥXwY[Lrd{ZjG ^Z<K9mH endstream endobj 487 0 obj <> stream xڝX96} ]@2wRvd?q-$Q<-v}vaq!sr*]PJa p%?A7 λZvIn{kѢ(fƃJ"µs4;9Y>AgP8öԶ4 @$e~qM&N/)(!"R HCGfwM/ VG_@ "@"7{&:d i0VrےH'Ɲ@(\;oBQt9mB+b s.C re). )8mWw*!J()#]PrepoTwxoޛ6FW S(,4J7*db kKCg.G%F8aϺH\j,ηs0SXY0^cWGbԛ&@-Dd9ӥ@z+}.VF[^sSh6 x؟ԫH|^=gYxJ5kQgSmJtn\mQo0x>/ 3?RCM d:7j?Qӱnc%j+:Rk]j<ρfW d{:+O6uJ_קcZSjm5\&~ǜXJ= $ Zk#.ΕZyJ$pğN+7_=g]CrCCe?Zo5g'pAՐ] endstream endobj 490 0 obj <> stream xڥ7+7)3sT w.&s7~AcD>573l݇_H́D|0Ė"+_JZ .a$Qأer'fy᭚BŻsK:$xM$jKх,)h,^x84stfC8sfcўr>(Lq 3ËQvQ9jۍÊAaRkA`RK-=q4Ajh5FAj"531zכqm{Tgn:VTj!\S$ tSCYӫ&`Mi 8KŜFԶHg|T F~w͕pޘ'']+Mt)[}+N(Zeo^{59-?uoQ6ærxWH̖q7f}=dx<|:vÊk1𪒮RCK,jw9mhZ|a)/Pz?=feHCnhtфqǟV m 4:Qt9B|Zuy1J6]2SzO6MGc&7m$}biг(:Ĭ|ʄ'n\3gZէL_ɱϮk^rо*\OwCxotcȗ-wFZW[8CHnzn-r1fmv ڊTTm;FK7qnt36qiÇ~wB5vT&ڞT9} x멌jkh0M?O՟reԺ&||SylGXXFtRh}Ÿާ2o,گqۯ!R7&IStVKJ11`6~7`F> stream xڭX6 qD l=]"%ؽ]LR|37ddL>_'?}ܧsy:9s>ֿƀq?"3EL 5Zz9$&qH{OЯx5L|JbiHu_UтTf; ʰoukNg\^-:܉]F1c2$\ydQnOEZ6 ZtM;޵=zVX51=fN#Mþ=AsxX%񞃌񦄸UדQoz_癑3ɽVw> NZ+yp \%9$y6sp-UUVȁyfL@q 3.>ȥֽ+ =bB`>35^ \ 1DT\*w4s- {i(%N*EU'5T"6P:NTA,5XL|\Ϩq?`XrA]:ʐZ*E%yŔu-jiHXB )%RZ]eB [stcSSlMEW61cZ;$8n8Q˹2vnA-iݣyItV/W+=ٖpr b;<¡""МAdI)8/mi_&@/}i'єrJ!inx@2q0IM52HvWp [iVu*CX2RӦ$Ϊ6#$ΥÁ#SK|l.He}{mg^J[jw׳8n ސz\/];u]g6>sO2/2E񭮾TY7J@QK;8!ϩw&= A}RSvPzH~QH)%<_l|ǡ. hԦYޫ`ȿNڣ' 6+i'BCmtfyD9Qfpu7GKH~;v ٭n;4R~ȉx/ `С> stream xڝX$7 ]K% xg&39'x]BH#U?[sX/~.߾5_ZC^N.5?wp xCiܟR[_7ѧX3=:1F>0+[MDqkDA{^۞K[1߾nM߰R\}ݬuΒs8$dDŝoYO<8& \b>kk9ґY͢N \ڂ|7y Kzl\BIU|oV 3GNiK YM_~qԧC4q]k 4v± ̟aQ̄q[)T2{2=S8j޼|q qfIWQɞ9p؞n>l1b^g2nlzɾcu٘h (}0ÖV+iTw^Җk{Mǩ]|J<<[ߝO#K^XD;kn3k^&aj~J#wD} jA7TN7dv7|"[c& u7<̪g$gԓ7ю7cƀw5  $)ơٓ*L<* @OQAyIگaiy!]mĔiJ{ObN7Lz%&mO@0aV0Cv7ꨮ-0H׏ttĴ,NW.U=*_^~1Ohnk15׸R- lobQĀ[wP9a[!Uq0L6201ߵtMiud D\^)\[])sp?~5n endstream endobj 499 0 obj <> stream x;6lR@@;t+p[vCRd*ΐ-A  agcw=s %4q'V 9]I˜q^#$QY]pSFY3Ha& FŊiasfl s[O8WRo#KKY_vMxL_F1 F`Agx,NV&?sݥ*g16N`|b>11%TѮL4bp<3UۋlsnjB=%N *'mjOlC۱PLWLY&}F>oj&mrw$Ӗ!=ۛO`KGezgU`7}=at_ mNbʨIp('&1͚VOf%qG$^k]Z%6mvuh}b,q^lpLd0jAkaW1塆jԕD uPtB7rސeҝqd$nH81]5ťr:}:C9sGսo j/؝T;q\ >Tt]^cO9xsktm!kJ|JDv9GIkPኇZV0Qh|:PƋp$ڲ&Hلiue0M@ۯ# Zw1v,E;ws 1Lpg¿۴͋_ţrQxg9r򫫨o} b$ٝ>o,@ jLk'StxjmV䷚?hTQ endstream endobj 502 0 obj <> stream xY6zUx"@R ]B.E޿ 9YE+Xf753A?9xŰ==h7:G&4r ~~3n _NN[3A+ү{{޿7Mkģab~<xrCU}2>g b^8My|IהGH8x0ri^೸K<$K!owodҫXY⭱*#xǮB]Y20aZZ%k+e ,b;L }6`D/(1P2l] ) <3a5O&W43lv =|lѩ??yȴ]LLj=)1 vBdPV+^NL%].Įo)w /{ZWS?G6znn}R5bk_Ǡnir6!P@Dhl~IՀ5<݌` 1Ԧw@jD$nmnahB RV|BOfmRW}VI]mJ({sZפW0/XбCVܖ a˯kГ=< 3w!JyU=ǻN瑋9p#Asm_mgJWڲw\x%s]Z)\ @~t@dS< &OOh` q65}iڅߎrlgMbm`cnoXTm+v.d)F1ѦS kݵOm:4/(c=f$=oUjKk-jٕ%@/4!ŋͱm\3vi`-s@>Zڷ},(4Ǹ&S6J_0ublŠZ=eӎw]a/*wžZPN3vg+IflmB=/~)gD>x'l뾓q@W G-cx9 @0lcpG f @]4ǒ5qD>곁 $2a|xlF֝iYb9ah+̨C /u{`ԔǸC9h1zyDg7Ztgc?ϠG.4=I,4B]3c"?hI~>dNZx'>'?DsaUs*5o =8jbnxXVoE- Y`|)[? 8 endstream endobj 505 0 obj <> stream xڽY6 ~uD$`0E\q]wW%K{9$E~wwA?jx~C0&?ok+yN bЊC kX`1.Gߜ2DQieNk˜6ĩVtu.djz&3NƊa~>8Gz}-=p"5tZHـO@6wg=xZɓM$WaYimpK*h53e~ EV" q*`d$%$IxX->/#jx$0)ԅVnAi|˰,4Hj"N^ Hz+:*%wt}P΢,i!>`9vv T 4Pf=oeX)T j o4JYmPaT}b^;'s" 1w>#D~LcnohRB8KzLN_$oNԤ=ȊjXI)SoM.(a+\/ J=^b{Od) Mn)B*y๿n)ގp`h$ e߁}ΊqJ]E6;;&f˳ % Ma$buuJ:3a? O4TM#4+p  r a-q !k,Z R*iU3mmΕ} zCs>b Tqc:̊Z.e;uet2t=Ʀp8 K> stream xڥY96+:# ^`6[`]:Ze]dIyƌ 5YUb}ufo[vܶ~)ny ޼㟷?>|qJ%ޒ7!MGcL֫m¿3uaG|o> WizTAf*.4-]X?ưW$LQA,NqAe%G1N.o}b"=DNEosoJ>uN qu_u{b.qںf*y'Ҡ{Y+4H'z6h)z3i:ٙ | +C:tאF58[WT14[,#ٓoS`{ 1v*1V8~=z{(9q /rZ M?$/j2S5P؆4w&mr+fIc T?L{Dr@FTS@hIg A 06K7 xM:jV؝G!hBOv'ֹܹ˰=Htஐq1X5N0q̢ 5_䠊jrD7JO|[C1`v-U9^Gv[g$HvĢ_qϲT,Z0F/}3I̡81m!̊ƾ .gt`yѵ7T74P.vo Vveμ0^y[XaFFW]ۗΧ4(gwlS(H?޲Ol17e#gQH҃Qgkg*ldDALDtq1Z]u XԃKuNg&Y]w; 9y@ h_ +c2 ,C3аܷMrYqnoPtG+*DJR&m$)ɪQ( 4̰(N|0?iq m=Exvֈ KDヸY5%`AS`-IO[2z ^EY[M`7V p6>`;l\]#C<<AR#Dփg!Q*g8ߍ8^R[ _hϚ+Ш\4cOj\ġ]pߴ"q\=©ɓ ~.ӘRa=OiO*k/r7Kdѻ̪xr澨\)>@b@-S=8uh{`ѩMj9sf$+<$6|aj㍬4F7s~]g>*| _5l֒,mFLdD¿^D! 1ɺ&Ns~պp1SOS|-*oj$]RɅ :k崾A(>A O?EZ:筺1ۯtZ )1svgATVKEs+Yw:|)|q2ct%[ߧK#Y>Ϲgm!*t`o4Ytwɇ9D8TE?KiLbW9:/x&Q endstream endobj 511 0 obj <> stream xڭV0 6d( d+:qu/=)Yqs^My$qG.Sw}up7 Eݶ.qn ;H,`٘ f9zNn<$BGՑ!Lp łn4Є&q&'&u9m vk]ȇ<\솁Pl(s{1qQܤq&QC>K +e9/%%SotΦ8,yz{{'!1$)ƙlMJ 8%Sc"N}Y4J,CN_{Py:JG%cr&kZ=E2~iXZ/nFk-$TnuG_O"*}H3+hjbf eκ|0t׊!Ts"a?6X&4Tn0^0K!Sa}Bo5<x'|楉qc?~6i }yu͡jaln=1SoLF T}!% endstream endobj 514 0 obj <> stream xڵW8 +n 0:X`'lTld)\zŌ.ÿ!Yk<|nG?<18wc0i8`nWƁ ץ\?NΛ\?hcͣRDl@ OpO7}-6E; +=l8yf|"{ ƚIy&֫%f"N Ep; Cq%=҃lUm/eI25O1`TG@`g%a.<;L%MbnDv jKBGw י<)6&dGXE}bVk*zUp%9|xi1+:/Nӷ9@ z_M@,_}LV4WuB+Y݅XU"~5{HTwYr/B갥\Y(X'TZR20تr}AGSZNUu3fم"=ªRw}I}(mj-zWm̡FP^X95l\>R"3-gN-v ʳNE5{ rJ;FqBت[AU!~Q(ͽ}IjX+ZV.r4l6 :4Sď*0ATE4oO^ endstream endobj 520 0 obj <> stream xڥXKD +C 07ġәarcztgz@3Qom1?$ z|]~xY,Ey/ѨrrF弼l)cH˱#ocLAy-c.=[Bx#Oe%`QӏNt@F"7MS7o''Ń!侇,]LE8wљ,sh(> S۫籥]y+S٭H`jɶl*A:^a^ ^lmVy\p5Vhph#(U iKϘ (s9(+eC`CuL}@ r`quo¯>O;FNGEu:"7vFXl.UA-dXiP|`زhh(_Mמ_s-MԷvk7QWb AgKf_L@/"WTdKo,%(`n4&ӕFDG~fh/@ϰ{ qGNP@ow1186z" =ښ d'6^ im0)4mTqkcpm8'<0_FZkDaF׶Ou{)wiA %.` |0 * PY^;1FMR9hI%ed՝JI cu"V'lst JFF|\jh-`vf=1N2? 휊Y[ܻkTF{;7t>iOB5:Ù]qVld(tiϭ[K;IQI28Y >ZTO4;^)"]F,T?mrq ,uw0o+a ]o} 2xR2UA cv'Z9α6P3^ oQ\:eouSf6^զ m1ۢ\xOk{!lu kZ~_> *=, pciTN8EP#OW<889a??9V~0I>i89"`3,*!]#=5*ݿ4W endstream endobj 523 0 obj <> stream xY;6+-0pW ]².EyR#,RHpKȢfy~uusw}?=~y~zMOrtнOߜH|.ޜ_#%f|a|+,bw2$ DKh+Zb %X'{gzۥ8ws5OPׂs.a5TYHFν 8'œ)"\FxFf#iAjxMwZe^tVk ySc'8pڗ )S(;WS3ٌz-=9kJ81gcAnBzۛң+;Vi_"Q OO,U>q SAtQVHG}Hzn{q.{x Hl͋o7Ze;.1Ȳ,Pz\(gD(.Fߨ WBCTz9UGS1h@E%*[k$lHb8+{p_^ih ЬAA Y 3/Aۋ觡W Ɍ#L_P7[d6;:6U^򩕘B&@NA( e돵yl!MQ:_F$~Pn|SW%Y~ȟ ?ZeFǽU5|j\˱ܬ'uivpۣ;"H1ž Kz$X5nN8m2ЮnA9YE`"avBۘ$)l0UjY>: h%mVqw[%7`ur&n41z[htge T AsBt۸°M#\C,N%i II /mdDh#d#jҀPOSxmEnq&TrsIgpVՆ.7 ͉my)r(;Q 8Ζ[-D@+$-!AUb\,HAܠn4KBn{ADC 56g~fBJwh]sU;ogL;W qέ=S$]]ZUxwYwDZ;LaO;4KlTe{^\x._r&cVd3|SӯVGMƌjֳHoM B{BȸO\؜fu^zbsumR&BGgLM^^Z=iG,5>8K5*o' 5zaS"? Ñ,N)JAdG45*|JH,TZܧ X o]9T(47۷%V/!:;=L/rN׾⟽, 跟! endstream endobj 526 0 obj <> stream xڵXF} ,g&3mO\g(Ҍ.#v]]kvwswCw|t?滱OiHvZoO;0D@.ap^b(&S"Ю 43·:Rۖ@Ր5ľ,%=j_Ǡ7x|PMHsKqӿU4p4on޻U9r'邷3b.>/;I3Bݠ/Zoh#ʗU/XQYzf ^x2kQZ~802GO OA ﶛaEv~~]ȿ hr5\0 EYR]b2IؐŞGsf%[HDVYw7Ad8vF;DUXH:KP;(rm^r Y;lADn;3 _U;{ !ћ\Fɡ<~䐓6Ié"LnVEhβ!/.F s&3†/fD#M!FEZkP$J[oȏɗa5]%QĹ.fq]H-0߶yvd]b^<:+ ),VAf !ydبe[j}V.sTѐdX5c\+#(K_DO#HYYPP]/!KbGOJO$XņU^6h TV2diT 5 ʠLDOl~7:E]PPGO^ʶYKgM6m)ޏzm7G^|}侭>ʰJ [i h0 S5 tX '8̞E&C(; 2X 5D6,$`'6z>hX)2=1o>@û aImrҶ$ Q%x0>]=0Ox4sAC0!qNph# TPU\0cl[1!+ HFE9«66tT d;|2jVHc еN`Q   [Z̀}r'vЦH^@k2W*}|F`EHEǼJ G5d1wd%?tmTMAP 尅 I$P7K>LVWtmim<|~7FiKvchH{KĽNfz;ܵAVD endstream endobj 529 0 obj <> stream xXF Y4:0 63Й@g?1bjzk:Uduw:?-?ߞݯL7=N~4C\(׀q `v-x2>n)3@x!?z~GRDq2W EL3b!z{!Fz;%}{4h}gEݔET^1 rMZ#7ۅspL ,E[i¦i[^ %#? Ap24+ G+7&Pˆwu+[\!m:"f.|o^*Z`;;vQJj;dsHd렳0[Saq]ܤ?RKXqF"邽R;%)-zi2MGP.̣!{ޢ>2,+^"H]&0$f@1#ޘy3GǗY4ݟ=gЃC 6nɭ MTUPީW;sCF5UZixXnQ VsԊ̵ڏO|@8u^(W̒(H&q yUxBG0eHcSy `0GwGUjbhY EWFk8A8X Kz鋻GI[LHyqO:@4]+Aډ10!|ߓZşU\2XhD`'F8L9Kk:(.HV%Waيœh S;s9AoƦ o) l^i̅g" 3T\Xdʼnƭ*aW/- !h&+mFc839X 'Bh=n:؏c\u/2RQRd:{::Y+c)=nhofsBNUOs٢`>Sm G/fG )N%{yMˡ1-v+#$8Nӥ~_s=XC>> aNTjʫ.wnDznOS_Kl2T2lnFA>I?75HCu]cG8sQh AAu!Ċy|4H'M)ˏ m);\o[)q#wmb$ž:r:LJ+Bn~4U=6TUL~ng˖3۔4%y\"2d> stream xW6z;S"`l )p%Ko2͏.Asp曃tO:?~9w?ry;y;\x; #rtCDpKy1vɑc=]"<*޶91- 0p~;D'\rB„JA,r!M̴q5<\%Fs m+ f$W؎ Bf\D@911XD_E rꪎw\EףJ I%ޅktX5 ~uU '>y}Pzb$B>qFnмfQ3Ivm&AcLmt^;TE-&4l  \,f$vaLƈXC9IDbh +Wi+H6StE׳d FJtJфzivA$[DU-`)%~(tBt&OjJDhtl(00]+50rz}2(6}k˛3.wWʳm+(x}t%p4q㇖2K ܱpUPN:Yl@޹3-p.9t o؜Et?)wL\/lɲ%T˔Oď c锲g6JqɔӍwP}}\NjFF'U8 eI$JI@8@n}l2 ."!r^s//y۸qU-{3 oQjr:1難_v`qrGҴWz̀,EHbD,b9lY%uC;iYEqk`q3do),2a+*P37&kM"6 L'PI'YTIcji\WG&|M|q ego[/_jZqcEuߣvMfҞٝzwV|n=i&w!bo@ _[}JA7ѭS}2ӿ-7 endstream endobj 535 0 obj <> stream xڵX0 qSHt RRuqŮ DJxͯF5 ~6n/[kmnk|\jaS>bYxƝlQ~+BrM#A*S!3и^Yl_ 9S <5zeowaŢhF@J5Lkr|QWKA}Nrj R I j0E|-t7~W{L Y.Rd׌o(K^|mWySl<2Eǂ*aUd> stream xڭX6 q$`EH` R);Mp")"53??ݰ=>ژRIcX:\ko^ Fz6D!6/#·˜v# o"> hVʾ#!?VX.SEޣ\w0 E&6H5.zo7ݙi %GkTX'Ö Wa4[wƹ*33lI0,rinF>Q(Yt& ( BՕŹ%U 0䗿CppmίMB`@ݻH=~|s44*:NxyjOmLg=)]M4FK- ^µ %d3wٹZWBJWhO,^A'Tg݃ȰS綠 uz{k{v{ ?Wق>:5h}R̅vRUSvWӿIX endstream endobj 541 0 obj <> stream xڭY6 ~Ed(pЭي֡ᅯHYJGWHMRO`&f;5 qDp6х81ӚiYZS<&ޑV0v3-g%>h9Z$^O|IjSz1zl? CyzIa^A<)jδ.5 H+.fZWz-X5BÛΙH||D~ЧyrE6;9ӟ;s'Mt^@r-?!^H$.ۊ)V.MzV01[&+;VZua[Le+%۪v " ɦf8X$kl:vuR;  2@8}t:3u= JDzlC_E|S(Jyȁ9`w=_'Vq¯DhCe` (lK mgJF~V\P(|;b^P)6F5tVh %֯R@"MKiѷ &smaRrhrDf_ @@khA:&w,_dcytz&ƶ:]T 1}AN$  wӒUiG%||]NO,m[J3C+o̩k/x=F,X'mS!9]EfKy.J^~fJ$oM=DQ+c>X[fs#hdQkv\üSk73o5)[W< Y,hYv:W;,o*OܫغSHՁmR; j^r ?.bnbz` ygbx⿯7at~Rס<%ӳ\S"VӜ&J;n]vDkߐ-+KzKM߱ hxw2ПOD-#ز-*k= jw0=_N]w6 fOFצ8A_&89;Iɘ۲]\:9:ohDfUB8ΪVw,`S*Hc9e;^=m[i7Ȓ5G0W S5 F@u%O+][2iV#j4Ww z'KfJ^eya<~W!T-*G(eqVOYͩzsv\[HW>x$GYNIY*Ⴭ^B]4V}ix;Fpcy ekDrdWؿn_-s_A~E.o?Ԗx? $”͆cՈޟa>v=cQ?m:)9KP F-Q9ઝ?RqV%9MX/lLr9UM-xaLXnLt;ѹML=ju]#X'dG5[UM'5C endstream endobj 544 0 obj <> stream xX6+).$E RHե7,K'ȗ3 ggvov(c9 4\ie dx_߿mpS/b=3z"^@x-VCB~fѣ)6|jLtNz%+zx8;n-1f$uVo.6_ w`ZX\tD1d"Ѱv[QjF%QwE(Pϧ*nͩ=]T&1zcȀQFvu@svUo _ <,q3ڬF,~?Evdzħ~M3e}&b8bDD]o.'/6*⼺]B KD1"nŬDMp? }J6@z8(h=I4dWdC]{Y /:O嗚x"wdH Ҿ %O J^ߝaodXGpO7;@)et: sZpv ݭïĆ/G렕}=1%o6jlޭaY$1*z?$5`8hUBq)B Te>k;w2_+ש ktwEr7f^RiTWsPœ}0^4{>L5sVʛH*'5fQ)8̟/U-]<%U^M&GURyw$.Pޅ7Mn1߯|'wV$d_nBywS. Vyi<*x+wwoE GgW5^qozl}=c=jSYk6]5:[f .m/MF8/I3d)4݄kEpڳH;>}W$%TہQ <521Y A[p\|U8wMiM> 1piiFc}$645Q`W/g8I\hb3HߨXNG 2jc qoI mE:}tQRL=NL馋d$?p]|wM\dsWNj]*xOJAs-?5 @Q'W=MGvHRƔNc^^kc[d݋ÛNPZ^s<֏w6!-QۇXw믜'9ԸE{]'u"/2>Qá1 ˘;Eri5Fڮ0Z|[s5x{ 4}טƦƻӦG;6{g_4 4ӆT kzU > stream xڝW6z+`E)tKo gHQ^ڛͮ8jgd3O7L88\y3 @~I =< W kE߮Xk>~Rj1`*h?>N\kftctAx/0f,{b"e.23\ò=I1FK n]5k>NVR3/؋3Л*ݵfub$>f^g1J[l*nD9Ymw@%f;㓼Ww)įUP[*E*}9ȊA|_t`(#XDHa\2R7PZggz v)؄ }IxֵbXBVmds!^Tj6`IB;|{ ja|g1h|a)"s m5V5u'֝^ap64mU&bD6WYyfIݨ 4S dIhϒdՖBxAVngiG' H+ٷtPAbMίU:wi|*W{«ʶXXmJ?k9/ks29mЕ'4Q+ׅt0ԲDPU u=>{\T^P}kȮɆHJOY11y ?V$֬3Fk&΍@#UZN!'FoZu%9vjwm-SE;hҊ P+_?MBA+z~r ڪIeL/g B1B1[7>}>>1yVM7[r E endstream endobj 550 0 obj <> stream xڽW0 %J2Pd( d+:Ju/cIދDeS9G$WcQ< Vt{k*n<<0رGo08KZn=uлOɶ5!r2$}$3r0Ӳג6eh:u{什Y܁P1f]suhzns1d4pCndt EANMX--\1y Q(/޽s Cj1bjQѶB4/;$)o8x&˓_eF.ZD%hVl11S) B/tLF]3^wY7Gm[ .ȱJ uvS CT n@ ѪԴJL&l.15͜XХߘm;s:2%\¶׊خ}ey$3vC;|.It$g—=`s˪6fe)䦽gڜm]FeQ>X@W&=SU:j9jLu/.f.QyWkX~w n%)IY(WN˦:|*J endstream endobj 553 0 obj <> stream xڕ6WAI6"{E)lϸKoBRLy=+&5w8#@}|瘇[4 ߜ ׄ*ߊo+;.8bH3 ÆO ?PoEBB@W9IJL#i8昄 $P 7h %·sO}W,#q) #J0 Q&,/cJYraſu5S3oEuq{`LlQf\ f*}*L4#[a3Cf)&;$cnFCQp7!!8z!#% GdQdHOIRvBB@YqsO#Aigs ,k0^zB~%uU_lЛ6X['=HXbv,s4NEL![CUѳ;*q"\R([U]xYL{ H4k5XAl-Xov"V $;bΓa:\%gͪH^&$ ,'s@[`zgE (!}e7bNUWD!cG}{Gлf6;d:efjvPnTهWbnP^I.V 㤥;#jLT:鉼j,סSƯn9zל9K :5Hu<+ZZ`K ^n)|t iL[Bv-PRySh6WvR559w[\%:ᷚ6xY1/h/fZ3 RV3{g. /Ɍ> ՞d޵eйtUjvK{q[}d)L7SMotPaPg>#V7sZ#5].w_W=_V>5|Z_@VkdM(Y]83̿Đ*1K2;D8ntgt_& endstream endobj 556 0 obj <> stream xڭWF +n )p.E 9$gƶ ޛegHyg N_Ͽ!0S92<ΥLhZWK UWkuGd3Q)'kHf]:,ѳgtJ~N>*]ŝt@op;ؾi>:%p.%zZ:ltt>^T $MU-vȢ03 T(#HU"kBOc.[5[92[3st_T`㘃/cIqe.` yb IFZFАdpg2ZDf$k^|x^Zs`&ϻXOOőoy/φb2ܺ qv9sJ8H!1?-p^>P3qȥpgA{0ϋQ֠.ܐ Y왝͑GZ+8' _}}c2;Yv_DR+_M6yk:kAi6\]-ԗSj8.aoh[4L.d)a XIV-wM=TN%ֹd·0`($hCHXlL1+Iiն r,4c½UXNOF6N?J0q" eiQ).SE BT2VzѠ{g#KqEƕGRiIؔXkǰt0\,^ӎ95`+p]r ECCiĦ{*s,8P1MufEtξ/~[w F@;h^!:JW%i֒Vb e+6Or [5t;b٤Ep}E=͈6I>8e0BLKcpaKhH OqՎvaQrK&+n>F#-ERMz-{s09sbx7]'-DeuPŵ%7oa:-LJ~V*Z92 =A8Q>*{NR;Y' N;mTþr;UcA ;_x>aFEZ~29/WYCݎ10~X~h4?`vA?  endstream endobj 559 0 obj <> stream xڭV0 zDJpPVtdᅯ([e;+>J O+o]VZDrWڵ'TcuurcL>ƃ}}G&6:0Y0ƒf9,˛W5'ՅQ>hc(]d~I8E<$bCGl7z٣.ÐְO]:1՘NFYLE f>FE.xnb;V3 8G'̱-*6EL4Rŏx}DXa9b1aCQ݋XU1*9Ȯc;bjmHE*EZV6+Hzఞʢ q-8e/8zCz b!}Nr _*W ε[ߎ)1FFܑ!fo#n ;sBՙdxJa -){D*qF?1C.qĜip(`|?Md,5ώOuB&SŶS51}f endstream endobj 562 0 obj <> stream xڭV0 z~,(2hnl':eˎ|9;A$)_ j^ZouV 1؆__4 B@`Io<p64ϗ8d5N`littfYfF]6K3l)}δqy; 4rFn4wM0}SThZDՠ%O:Qhmo I:{{4KM4L4 ǫW= ozm4 :AIW₸. yȖZ`;OgdgJY('artD̷j[ǽfɡd`NF6ݣ`=o7?yMJX[N&M'G 15x(^NÜ%Xt ^^?5E{21vP>d k|[ʠœ B.l[tn Iׇ^[$Ba5 i;~BtՋK4043&o`,(\tsƞp$)> stream xڭW6 ~q$J$`E\q]ϸ"߄H=aWG??d'vf~L|LsS~'-916J,HK4Zor`-. vJ`6QEa!%G鲸yqA< j}ͽRuoZ3]G^@vIK*0J> oG鯸0hhp̅ϱ" AD 2gIJ&_ vB4I5` Xp8D ,)RxP,4;r;ڞVqA@YlB,mϘ@;6kiUPC&ulQ- -]^56э9Th_"4]#NW7]p|ad XS067jt'#3NL}17b,%I`>L ]7l7`ZSHUr6jdio">֐DK;Ȟau0c:ɄlFh" :q^XńЛ+CVy\ܴ$m/:\j( ;Qyg)t+%Dd\K8F`o,)[#( qBDfG1{+A$WWCF-Y.VM UMs)rEc+*մ@kM5:}Q!4 ؛ECYŠݛP^;DYPMҾ*gNn1!_Y:Vf"(+ 1.1| wpFbZeCx-4?#˧>1VP,P`xHdi[`P+ `v @&؉ ~AyyV(O(SS&Ze}V xu寋g(P76.e)ZhHa26w1l1e$lȤC=n|Xly':4y߆|VIꇊyVpG _;7Z.B(ʰb@bha3\_jU~,g/ =TD"O endstream endobj 568 0 obj <> stream xX6 q lE I25Y&7-NyeAv,d",צ%'ٶ0ahwgO}tT$uhfW0dVpbFhEbu‘3N}[K3Eh|n6I؋ZvvK3k fDjLݎw!̓izq14 Dvdé罩{Lc$aA93FP2q"&̙#c#n!ks?z݂h!2w|\\v F 2 ".BτcbQˑ_ H9_uBYlKsQ <[bLro ˲GcV`/8U lٲ:.i8(Bm8pȗ9U/89#c#3Z6ڮi,:s~fON*BaG}d(k؏}0KOO`ʀ]}h鐑MpuQt@^Z*OJC~p/&ok%p$ ά"jkUZq8;l^9k N=F{h?mmCⷝ_o9߰?~;) endstream endobj 571 0 obj <> stream xՙ6 >_u2[lEI}E٢c'vs:#F(ӝ?Սw_.۝}20;_TJ;,Tnxo#^/XeOi30u!:Q;p7nr 8~ dozoŰ)o}a)Jt -iJ âun<%oT~NE),VWc}Ҋ%AݱD,cA+/_eq,pAx.1 -.0Աox% r2Hh& o.J͵DV@(7 S3$#̅BM>MQR,T' f+q>ɻz\:==]pZT7k]\_K3NZ/MsR4O >RLQ>o8\܊Dvj2#.eنE2ېzFDݒNM挴ԐͲյz<_wSϘ 2kYVׅi1C fh2" 'Sa3:@T89fғ :zb 34=P$C)6$.~Y#RrXP S q?Na71\,&'btҤ8H_ IK2N@4ci]mQI?+(v/g endstream endobj 574 0 obj <> stream xڽW6 {E [ 0";R%K~̝,v{2)򐔦NtAꖿݗoЍv0c~S ,cL8@/ sV|F=q@8}PeWã̂O[8bjpw77Np)?^>rπODfK;MiqxՊc}RZ[MG@E_n itS4y s]à@ed%m[582 >r樋`iÑeJҒd5 !>Q4w J&)v9$G95ƻ:%>Q{ѷ WIB!M,="z>ѯ3Es}`hSrˁN\nNw*`ҪQN1$x&ēsn%sȜ{iؔr)G m9c=z\2u:14eGEN3̡8J1,V~qzk:hg[7pvMnIFi _bfO!A\E55 kH5(eDۚv;.!e4-S5$rѸ!K]-,'y<NٖH~`rFեn_ S(wn!jvi>5^4CMVD'TZ5VJWH>v$ك.*GgR& SNJB> stream xڵ6W .$E)lI7y'E3%75;oooï1Nqxp 02-&Wv{wr /d\?o"#ɍ'GD%>3o"[D)^\B|"Kir-JvLRgw@~=aӘRNQܬR8FջF?(W:/J7X2*<ٚAkM&()<]-O{vJ-͂GBD#Fc}r6v2I0P<E(W¦]w\J_}& Y$bUq ε+UҾay, gif$'Wz"u,IɄ>PR {S0*‘OJ=RƦ.]ӘkD]C+K1%dْϒr"R" X [v[|Pca_=—4Nw8ͦog??Aa\'!|I|""k',CEOXd{>G׶skJGlIq Bē#d\T\~־tԳ5uiֳ"5~K'R.hs޼*>MJVMEr!2R0?ҖBMBսn[׀'pw Ft88^NcdjTA;i>E|}FU9uU(;6WT]q30]WLAAcfަ?Ӕx琬{impule_ZolZ4.@o- 7 oqԱ_%̒>0SjYy8Y0{SntIFSaw}%¢|rù0ԅ`=hAeQIv0rI`|+\>~,׹첕 m$ʽ 靈(waˎ:].U"X.r[>*W$^W^&ҋE |wiz/e|I-[ UoT>t.ɜs+Vz[Y(XS?cXvASA28? p'ƌ|#>j8uЃhW{o20kcUΦ5 ׄ28g|N*>4 A ֠VzI%Eh*ЃA` )$gT`<ּD[⼷Qο慬K9g>W% E*hxGn.c9Qz endstream endobj 580 0 obj <> stream xڕX6yS pR2:ޝԒfի";Cv ˿?Pr>!1iy;N*p?W n*Eb]='~h߲@,pgՠGr-1(V8;X3'|T8+TۜMp-߉WH#tAdإDj4)1d>Ec!n6?jKj_fzu,jB,&QsU8`L` WgxG!5OV*HbQThғIimfm=ڵ=YxGՀϛ!mLK*!4- Ƿ0WbU%S! -gvri<,9d9Yk9$UVƴ*Ɍ%L)_2;x`&S!s*g|T_(>Bq+c_j/c%-_RRRqHzozcO˟̖Dx!$TT[qSX$#38`RP@g_X؁I q`ܳE(0 <\/ rVnG_< ;@hүTMp#2IVD!D."9iV_w\D'kmLi 78#K_oRGOU6I:'kROo~p2c_A]._ T"rĦۗӌ Yz$ ihjh}F2Zx:X|L)oޔFDF&'Y'O_os iUL.K@6}zSdc00oxj:3m#u'-fU"iAJ^iuT\TC$;CAv2Mm>wF=H~Oqn A3Tt_wCn% ΐ\u"4dU"6 (y u(㝺i UU X63*aoҏgbPFC)(q~]D%%vV-=YUѱG"on֎%F4ZA3E+.Lj-(m.[I }q|Z3ԄT-|HhOW}3M>>n[9 kvd)=&tϷ۹ &"Å{r(}wD61NE-TkxwahtSvnXP($x_0ꈑc-']۽AQ pЉ%?ZQ5ƽ/gW-3ZctG-Q,B-gSЬzm=5{ٞfU6R)P}`rāFn\. kJzw|+%>/5BŦ-O%`:c̣Έn=+T pn0uku%FTB7@p#6C#V rư;7ieOy o⛙BftV;|ު`Ãt:!궟zf3"STvC`ǃ0)6i %꬚jw5o@` endstream endobj 583 0 obj <> stream xڵX6y$0n@gTXE9ӳc/v :_*rwgЃ?za{1it.zccM)aEXV*-(`MJ ,rt wp6q3N {Pdz3= bo5Ê>R.Ȗ憿IPv9Է[<̶T8g{a:$^fIںSagQʔQ5ܴ,'Khl mAZo8HȞPD{EX$IxG4H@ʃu|sP4ϲumcضA ,6yG%JZZi3L)GA92RRe*_)Ii5'ԉ:1x6fL;Sb>2wC3fap=^F xJh(:FXr);S[T_mO r_)H_je`^U~>䰙<3gqf }}S\s{s;!# LL^A^_nNaX([H_ᇆʲEX3V^b7'DHKv+OT݄&309a?bS1&sfb`wJ+C?1`&Z s7OAsv2;?=ΝuXdQv3gfwsɎ%kcֺJڳ4IdښἮ}lz3| m$uj|BJ',5OA6MO2X\g8!Gm*bRClQy*X)_駏i'<G웱UTRcGG a\vM}jKFPDz~SDG3 $^'gS\G)~),QA^x%5Gl| jgnnwN;twWOXߺ]B[ KuW endstream endobj 586 0 obj <> stream xڕX6 X)REH` .E޿ɜIļodp`9P\Ĥqb1X+F66xS@Ks+$dIl"GvΒ>_`!+jY0hQfW$pkvE])E/TMF>+7v#vGSGNIIHkCosSefТT41Gܠ#İ(( Әwt)6s+TagKGz!~>h@ܥ0J̏,n [WmǦq^s#IzrGhQN9Uk*j9hAjtQ-Gk U&.眉3l\h3 4noJ"-)zY ݤeR슈φRZ T-T60P#7K ^NX| {f$WS.++yWҝ Qcs= RmYjV'a9tɮ?A [$}w)1&˴qXz(Tj]U]Zim?9ɍßu?턪Ǵ`Ksg{<.|lC͟4:;:ևSe)}. 95qCopkB٬`e[YõErW\rգ^Q[A=vTYtH{k!h|O/+m^޷mO_ccI234|ݥ䱓}?T| endstream endobj 589 0 obj <> stream xV0 DI6pPVtmeI %hz-BDROӐI_kgh>~fPGMs\?YK2@r*K?Y:3$Z3 ⭳|| c^n ?_ ØF(> fI }}PCjNt86@jKY}n]#g]%U+2캤 gK ."dp2 DZ>,b`[&6bÆ9OjdN-#Y_EQ-rjZKKE# r^wfݩ>Ѭt ޯ J"fyY$@l6#u[hNo+&64}XpK@lEjeZ#OMNoz.N.x\W5;W6Bz\o0UlɩĜ$f 2^ $?I8Pc8~}wwC?zD- .p[WiZG;/A^7]mS\3Bf":yxG?f>tO endstream endobj 592 0 obj <> stream xM0 w^ nĕP$ؐ!(d/\+d~Bx2cY1dGH^Hva w3)cҨkHh EHgr]Su(f endstream endobj 595 0 obj <> stream xW6 R`v Rx^]Rdx{ {l"Iig0П? ߯÷84ڈi4d4z3 L~9M֜+]$'V^H 'U7ޠJa#9g~Ѥr)d5yN!)e8v?vSk^~zI ى@"%2|HQvq:gMcSmەugt[żIG^!wJ*W[dv\}q7|7\?md 92ܽ|'oE]ݖmi5 0GFpGX&=p,/4V endstream endobj 598 0 obj <> stream xڽW6 ~ w+8vRRe)W|`&840~?!)kQAp~@K+qNrdilli|C&x90d;[z+͞'`^I'Zte9z#(pFy@ N`=iZ|iњVT7jiAc~\y:be'N4@5̴x'H'{|D79NBo(F{b@mDOE됹ҏ3bTS_HZ7y|tV 7 y %%嬄&&=rIN$F łqqX1Ysuh3Y,yMa9| i g*;СR7tYS[ Aiv慹|݅rX$VcZJaqXqq[qNRF]׻gY1-_ECZ Ӆ68E;@84Y{"-XP5Y?>cM68Ѕur].`lk 7)B\tD-3Rv>ӆ2g1m;W˨MvkYcL ]&jS1Z\Jj Qs/vPDW-XzNrbh j~2\CV_x"rb *C)Rk-7X4E*_klXFqd"Fl.= QM@:+u(UdeYk(S NiǞsu xjD`wZ828ެ2mi)a .7|*Rev&6xO4/~=q8YSt< 8Z9$Ϳ~U RQn*> cÿT:N[{I"~/ endstream endobj 601 0 obj <> stream xX6 Q$ ,Lgwdk`W!%)OOfgovʹk2Ae5*MkqdG|ھik…g|z5DHW|PQ69ɁW&RX`N :lq|骘t(Dr~UN|% S=A_"y?nP/@NT<`ǀ`Bvɐ7\P 1'q0k♐aHd6nA]9+VV,ָn͊W>ԁ cN*4=L=iU ' m\Q-@,C,DPfy\Gut< 6;d:M1:wiAwDӁ5Fsh]Z%SvԍNЭx9x ֔iHnTxPqHI^@)1@B.ssNcJ]:`V [ţj˙ ՚j5Gt&CzT+ʥV%~ iQ޹:2VH>oG&rL݌eƎz%ԹGm?"6!)jO[# 1bT@f ;`V̭dk0#`_6K]6Yd6'm"ë@`CqxM b\RMVu@uy7Lɉ!M5%I[B,;J +%9gp蕋]sz(e)Y{J#w}Y{Ce` }Gy:N=|ƒY@hӯe5Yh6b?}O?Ϭy ;Ց @_-LsGuO=yJ;J|Ŧ=}$_?f.FZR{]XL<y݀t+W;U`U6T^imq[9KrlaVSI؇K*# nj)v͖_CmR[. _V#h gi v0 h3Q8-Z/ARYw|ME9)c;00An`FZچ}`XP.j@d\Kт;}D^' endstream endobj 604 0 obj <> stream xڭW0 Q(40"@R 0]sKoBQ,y=6ؤxx3OuM6:^p2Z8\?5u~'8 YzMz64F4^N4IlF=${<˓Xac9F^qF9] +tіh7@t!nn)8`|w1H]hhyA ' lО-6S~ w'iEZ>hŹULL\ Hp"H> vXnFPpPgcxi?F^DKHx,ېOtŵufǘXLG/|yeԉ^K= fmPx,>=zXˬ>?fՒM<@kjaRش&icyX6D>bEE51dyQ%˪Z=|vQs%j3ǥJ[!qi焘ytR7w%hyKF~R 3JIs-kQ~uMCbyc$礽HFu#8w:>[,s=AXTUeSek(*F<HGk茢UPtzټ7,ُu]8ͨ uqvk8/ƞ:z|}u٢#H=k΃;YxVH䬐sGŴQl2ƨt]*@m%jES9Gϵ~7dQwX* '&q ˆ˽VwTξt9nWסgMu'] L[5!Ք:⇮pɹ @u8'9´( ofQ>Z`t c/ztNXyg߬םcݰpt*⁚;pLyIlD9g+yVAa]77Y@xy_^1("ǧo endstream endobj 607 0 obj <> stream xڍY6 ~ӟeX\ W ]y&<ŝcO<7~BÏ_a-a>Sc悏.X5c)9oBER̸u3T>6AHS\w٭z MɂJQo朎(rۡlyR OvSNfqcb+j R7OT :d76g>1Ч5$qGg9FKq\7>K8h] y-,;vzXa;ovv,ٕfW[~Ъ ˷}}鯌5l\~20ߜ_Pщs$ endstream endobj 449 0 obj <> stream xZێ}W{HV|#!D쬽khG9E9}[I^9VޮiUNl2F5lM7hqaݰ m:aSy~>6Dq>AB5qԍ6M7XPh_V9Nb=97FC, !BfBl~;؀&RqaxnEg`2H:.i d"lYAނ5ZS YeFX0Ch(FaaX{paD8B"DBP `PSiˆ 91,@M8nߎчYN܆B+sdn1wl xp L8Q1ԁ5gz@u`Z {0"m3#%(d8p{'NjVat.  <*A( &1jpaG_<|jہYow'qE\"$C<fZ ,3 p/p{IFAE{G -2I|B r'ZЀ|v^A "x> F0uJP< sPpk&3!HY$ȡ J`0"BHl+PԂBcD2Q~>10 8!5!c Cq^!ӈ@i#br88 $O'F)Jr aJAC̢"!HA;d/]Af J$-Q;-(QhA5 0=GHdn.ZR d*Њ* g2"*MJn^M-]c KVC h$Cs",0N3%>Ifb !yY8@FE21T&5rI H#֣@iN'/Y(,.!)HR5=TD҃eb#C5d)UH?== a~9 , ݳ~n?ǾJ'?iHV>[xI ~{tBڴ/v_O9 oP,SE5ĉFMPG-i rDۺڵrDJih\9,'qr/[9]N⡕#WѕҫVNӘc+GIn,[D. 8lly^rW|wNKnDfrЀNIb/(PzY)\|943trÂC{ANp lrl!zA%8Ni)!є)!Pb}O&90\% ֔0v_a.sHe ttt%J+ '$tD>^p3">#b3 :}cۂJ+4#b2"%!S $dJ^!7ρq% ć|Kc62 :CAg(Ag,Ag\𺽰5 ;f'o$Z3|L1ۇ 5WogE'~ʗCZ(osH"V*|ԕ|W;Z_ _^nRyLJס=9w?\o^|Ԯ:Ca)l^P3 vb3C;SCk^uzl wCTCcÝfAMq=Wv5y=;LCh:=LFIgȄ:Kxn<; vbM>ta4g9ܙoѺ)a?>9ǮC'V4G]t4g5v~ n3Z cΣB]J!+zF n0fmfFD08zE~gJqe b_{kҘL, ZnΖ3cg)lgGn{!a&~):ֳE+.M<Sa`ѸH4[ٸDÄcĝp]&lHs}n/Avh8:*eI9ťUfr_M2 n={}wGEJM+昘&hS1Lǂ`ɼgǒQ| a 1%!=[Qbr9eJ>y}~pvGhf,C3UY`ϼu5uÆbc_}9Vd轝 %ʬ~&ei@k @Bo[܇ulLS9e)0V,);s'S?9+⏉Ou Ck+CSU5:h撏W%ksNuBv2$*~$fGz41ZNJuߨr[zs b\s4hWEI%$Z%YÔ[ZNe]ub[~ ydSx`o&ZwKøaR+KǴ1;bz./)пKz`ַT `5{a{Nj_;˱ k/CU`܊ [଒>P}ؿˑՋ+\^oo*Ez)=F1-"̮En`83oD~Svݩͫũz+u/A3Ǝzk2u^7۰E9pY-r<(g%mzu⺂Y$NKz,Z~b3l9ً-2>a*9 ɬS<g[C)Ye!w̬Σ 2k6t4 endstream endobj 756 0 obj <> stream xڭZK$9+|j;Oi5 Z-{͡h%4g{"2.gFC)2xvfIyWRq:V+ٻT"5UOnjt=:.Vrr]f 5jn.4,;)DJA 5deBm8aDV7Zjpؠ n")D'E`kCw5TvqsRwFiIz. \hRbU#]\o.5} 6Brw9KK.'ҧR(rIjwr:2ՓtNٓa4Ot %ejOC4$Jjq+O9Ӳ弙ZA.V25`Fn{֞"AEAePY"/ps⓼@i<G^Yȿ rnNϤU_`+>ku*v=QRE-L3b:Vґ~B35#wy6d75N &K % f:/~EC7OQ@uOqJЏ"'-s8L\4U"M(|G f-ډ$J4,@yrSV@RJB!m錉#HQ$*1q#󝮥 oHcl/KkT1 8fIGYgLl# MAo\'bbfbY*L:+%rE.ZW+IZ%r9#'@41JqH'dO&$e"KR"=e$Θ!\*Ws2eڢ\[DR+2sbfoWΜ b^Bn#g6WiN5Xڧ@҇(%pnrH*Y&~rpDSJdܖU ,U2ZD$ww?ퟧO>G#zj>t|=}麿O_[H߶Nݏw?|=0n_vϷWӗ~3 2x"TX7A~'ӬDQ]n=X,L9jl5v.%]Z`bǣeO?}5]w Y{0G7)ouNPì f#[ރ:8l߫܇b4q`اW}I߆ vDq[A8{*QĉiC-S&F4:YDw=W44h#e4j49ra#q(C|K%C<>2pFДbe^{Ng'PhsY HFeZJ}OzQq>b`GCQTg=5%_7#2 [2*e1 I`{Aekn^_gV:5̛7O͵PA;zE6nG%ج=2Y'mjT͊$[j}rһB-xvqeKrqk,ǁPW+HqX6ٛ?RbaU #p%:ln. u3؉Ltv)R f)-m:)¥~|8)\aqPEPYBWVW1a }<E.Li ksљ#qOl>Uq8l™7[t$@:|VXZ Su@mFoͦ݋Mjh%ʶRWȚemOJ;'Cz*Ȕ'nGJDM+> IՒk)8kWGq|ޣ|МǺUC˗_>^\u" ~An|D~aϗt^O/7ft1lNwb Ue@Q%n(.[[܄/^J$Ȍ"3$2hDsy( .$30' M'OVPaCBQ9jDړռ`Ж "R/ DYHujQ`"_-:lx6j/aʹe\̌ (OŪv{z1evC,u ŨjU9.0'=Q-#bCuZ2 L󫇧7YUsOoBZFXrOЌ*ofT܎s <,"BZFX/]c]GC jzsG|w0&Yc@U\-Snh0u-8,`\Bwt[&0I.JB[FS'm*cIhp#D.#<]ok@`̥Nf7Rw!h.4ȃxh`p!$!ݧg (#gl:eU9X`#,V9$oFUn.pnjR̥rs5GX b tcf,\9\-PMr(FRK"Q UXՀ#\kqqƸ }Ju<0ʬWc7W5;S#V}NՌ7DqͨV>,"_ܩp>r6iPêf5@(D}1XUao *c^}-SW_=<]*q6|гC*.^!ެ4B]F0*.V tuhG3fY ʱ,#O&2B]4| Nˆyؖ F}2ٺ&0u߻ +wQ#1!-#,{j&;U 氊 qaq:" f`inƪ_Fh72 (gi > stream xcd`aa`dd v 44 l2 ?d1g!"Ћ?,OAD~j@1VyRqfnfNbs~AeQfzFFcnjQfrbobIFjnb ZRaQRR`_^^[_nPYZZTWr-(-I-ROI-:QH30129|e֩rm-]ڞ!>ۢE 17Ai}3]~T= bǞx;3y?.b>sWfܛg1"< endstream endobj 895 0 obj <> stream xcd`aa`ddsq v445gi2?d~1g{I "_ Hu PX9(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU]B9)槤d`t,<3##K|?{6?TΝ;{"Ǵ r]]6llnni$0c'vNgF 4WΛ3{Tu;{:9['h1wğ鿛ʛH6Oj.3s"_قSM^wTv9.> stream x]K0 /R)y$"$ Aʢ53H c{NB]l:'v/Dۙ4̶&q[g> stream x}O0| R)cFRf׊"-sȷ/Kmߋgh[/oNEO"qKkEVF[uDrRv$p]8*Moz7vUrui˟}QJ*552 }t=uGb FiWgh_]MX9MFY/dNiʊ\i/lg2b#Ts|ǥ*eڃAhäWLFg z d1ȲR0+Ȳ_i2@1> h-zww2WpW++4g[#Aq &"V9( 2$6U%Tӊ> stream x]RMo0 +rܤ1T!HuuJF@!lU=l?嶴gɓ<[9`866U3·iu%t ,ÇvםCCޛU\{__qחB,Y5| LθOu눱9H;;{tk~Ohzƣ,r0]C 8mu,[}_R֡6aBd\ ц -Ђ& HrRs+BP])xR}SK:# % ZPpE䬀zs bw3DJl;R.vy&i'9Vʹ ?1ϛcM3:,FsM>h,x) & X endstream endobj 901 0 obj <> stream x]n0y^d Đ(dnhKJמܦ F+ǒ7k8)Zh`{8( Zո ws()uR%8x-ĝn{jvz5p}pǟY j&/Y΃Fw-c/Wg6YfwA{-XlYPٍ}hxTh'ƴ0u3D lQOno~Rվk|;9HӔhF=D+9r!C>SȗS C9GQ($JJ K\2 "+ڒXR5XK3j.? etͣ%n|hFHnzۮXbPs3vX$ClW<ȷMD> stream xy|U?| vAIh l%ipDEDEq]P\su ㌐TwBt}sLwyl@X4Nu+r}P0L]jٗZNE{.7'niY۫J%{.snZAgn]1( g2l(=k<@*, zMx"%Wy|o9gfdO2(Z[j7qPE8vT\GkC^Rp# ^F8o|^ x Vp=9zxdypı{ Pp% TY`%l&:'cX39;CпYm zqr rt&Gɱyzp pD#x7UA5$gĂ #?% HA0E j:S݊,}vh \B j1tt Xօ0rKCbQOƒdD"ts FShКkqA-*&yW>i^) K;n~L:<;}EW͕^e{cCe˞e)w$Fbr:c;zδne"t:M Ǣlr.e}lR*);T«*gBL53a8Q TaZN6k1kR,PJ@A4w4k&hbx{rE\}.#}VRчÀYChF4k0Rub\bÍ/ @#M:ȖُG<>e'cQ)Ce*SL!E+{Ə:"6=;% DE؇MpaC:{+L;C?$mx0J2&$ήTEjf45IFXgAΐyCf+uPNcE(U,eVŌefpX\, z,kyvicN׬}P4R |lFs/X4ozz]862%#"uńES''nEo66X7$mpJbYB :ɬ2+xwrE6hs:8;7n۫*lP't:5I2+0t ƨNդB*D*OAY26S[W,~٢GX^LK Kc_̂!E.JWIŗ.Zʑ+m"̈́e \:rt=V. (X{k<8Vߧ kʭia:1OL v={KRDAU2v!5%5i+3fVr}.bZ%!OћE& tes%s"a. &tEA l$ ?*[3=c`f8Ğ%10**&:E->r n{gP =?MsDŽnʪNg7'Nxϕ dRV_Rq&i 2k2Jq^g߷ P/S+H-'x;?c,iviz.nW^舌f&xN)8.l㓔6[#Pf24u:1ܦ[5sI__SpF[ZⱋvdMjQ19 ֬E='Aj PķqDфfNM>a>/# ƫ뉧?Sсa5Ѓgm^0cƂv憑g~gșPx[}t))~{"'&V+R͍)i:=zR([H^u{$ Xy#^dW->MH=FyGdvA2j*'}͇Zoo}dt4){2/-VGsG-],dY!d*/ -Β?Ҽ_fm/"=OIXGb: ((ЮYlulv*e>F V4rv_2A*8d1>aW;W-7D+wO_<5e}tjӆkh  R76Y m`)f SX4Zq wց5Ĺ֘-FȨWh0aTn3_Pp%,.2C(Sz MSVYPtKHה5/ofm{^6p4NMdHr؇" YQ oS&:npӽOw/ ]4(SȘ ́~%ԡVЎIvb!DD dL("}1[׼`}MpAc@ :YH"w@\IہzQS1NUT6ȃ@EH~r[xK tLE XPa\/^PɢHZ--GϊEr+W }\@ƉEDRl!W WUjR/ o=Vts %-D0*^V/T]"bLO?@!|:goHK[ӼgoDHˤF|Z>}g'Mޞ:ydYơV9>$c'pkquȭ:ZA b^SaFlH-K1$|CX$ّ>&௷ZI% izyfw3XŐf(cjHJUnd45ڦ&WG(;Sh3tg;ɝ)7̵,sU>G_r+<>uNj0!n^sG.՝ztW!ݔJJG!J"@Ou5XXdJ<֫f;_Y;+s27.95{Ov<~U~_7\[i.Odf#$TlUrU\ 4jUU6ζZ=5U Piu)*+%|y< N (}bq3j|WDqGzwk4ˈQvXILNѠ7CG>#p!a{N2m~eCUk68I1yM nyjLnee쭪kwQF L*ېҼN۷0WWeoM7G@Y i5N8SzȲX1Q6)RsBxk}qn.h0AB4KcFqnd ?ŞHQx׸np+EY2W>^qw~*|ï))zjiJ6s.SI_NI4xRpg.ם=HБ$Ϲ Dc#!7 C\9q|˗bvzj f͸ owx==y`s&4 g6Mdmj4OZ0١džm$>LŠ[4VMIz X\>i=ZήO1Rt>/0 ]-ce;I%ѠXB+S (.Pq^Sz>Ym΀Ceei,~׊#cz+ZwNBh\ɘ%/> /-Sj9} r; f?%vYB*QhZGD!# $41rAT %Y =+M7_j}rf'm߀dѸQ,Pf(XmZYl̴w8;R;ӂӊڹƹ._WƔ3PU`pJhy L d{5nǫzʡS!XH$ 4t%,-1%x8"p6'S@:zI׮>K_s}.M˔ϛnYv\p/ 3/n|oYg7b|?jZҷvAlciYZ3R ٲC_=.5>k;gM3ai864"1owMQ:ڻbJM$ ߌO U_~ Jg|εynKN%DH뙨D=lC, Ǒh~"4DTyaDc|MbɝkLs.saaVfV1/)tr yCHL4$-X6:x$o"wތ vq4/bX  JW"$P-7M+W<@d%D6Zhqքp[mN-fml|/;eCĻ[]vs>r\g#/mjN3_#ӴȥLh1*V)d]D'ZIfNw9՜鎸ǥ\& 8i@$0VkKQlf{|b"VY78{3W*Yo5ga&MrZ|EPc UHA"[D%7o%BeJ¡|Ub0\O=SCWaV @ C +%gIl+;*n TH-'HD#%i SE"3Q{1h&۸Ft)aOE҉n~Gb9b 5gB`[,U L̬.<܋z&2$4 Frz?.B{.'_AvBq{]umwK۵tNw;umS5Z&<3hrLΙs:aу0{΂?/]?]QP;wp}Yb7.F45㤐_Vu[$pI2+2:le9O̘0#^d$#> ξ!m>~~݌e_˞wJcMasJjohNvyL a9q # C<+5: 3C(, s7 {rhwm]a+xT4jVT DzL6#9A Q<ӡ-u3W?$W*dZƈv)B^sWu(͘EBB},_1V(`^ zŞ|E4oa~s-g;i 6 <aNAfK9:^w̠XzO3Ռi_"NV+܊FѢXP" -\rK`{92ꀭO9&JT!db(rxRˣRʙD!vc`]q 1"s$!$riЎ̀Be];qp>f;B{<5HM[!I+}sf˓u-3>'/_͉Qsl?{җso>(RSbozr. L "&ש>'ovgY4wZ/ҏ5E9 |TnȬΙZּ%k׳*gUfObŤp^ozHfY :PW[Q/bԗFsT͢Nm8vA77Е0벃o̙׸oan|m|kݔ?T&֕sm+vyo:XIfYrJ^m s$`0Mr<'+p6>w3qybs6\ZlgD/'m~ W(0x e ZVnPNP7m9B\ !ek3S)i-GdQNAU$>&F#,h?bDvHk]e9_^*fasX"^h8@N%PpTΜ>h,_zKNC0ہ1SӾ `<p":'^ҿq\'_0z}[ΥԊ2D#/];\6 *D:܉a?&⫘@0J q{RTt z]3.Hxax6tȢÈuuI%^49¬%~Pd|vǴk[\rkRmP7lU">"@7%d[㕐ץC&r> Ñ0T]I$ 0 A^_8҉N7c Y|Jʳ֬)7}uo^NVoEso_OUͻ"C1}bOyy>EfKg?K ٹTJ!vlJ5gR{"|ADZXBa]%Sjt3ݸoHVk.iQC)U vIEZPoҀFt24(QWФO) LߎڇtnQozb^qÔW8*泉MMyc*%}}ⷵccҒ xoE t&Tm5V RkV&8[;l.JI7GԌ`A%9+S\DetHz0 WET`Wa?MR=3CO[&]gQN+ e[~YU 7rG~XOc|rg F mk<4&BB0tƅ̗ !GoCFLU'RSԜ['c]0a''6gSgХ?okeyb6';D1k2Mi4:4MWZzݺ R)":A;u^HF +S Dn1Zt RYm /N@/ aȹւodB?^rn+"6r.BGǛK̫b"VVyt*F_ʮ_XH#^c\ (#OtKq  IبtwgN62?-\q8/LHLᯏD+L9Bib0vX{RǺRYג%B%b͘q7 ,tF i0ZN[ab_LJT_QHNQ9ujݳHՄqg͹ht'u}})'{cxLv *vX۔?>:6@tb1[MB OtzeCzC5iBHz}s*Öja:6IL?I[2r' >GlS>|#n\]*M1ip'bD[yc ^U<ᆱgm/Igh,J"_1J6E#VYJ'*4MI0O ]ʤ^;t gh2 gF)Qȋ, 'Ⱥ+Ia>;/?OkcѧuH֋MzPO:6 B93+$+I5-.~%&7'oފ;3W/9mۜmHphcÕY~?g&~JWkW'Ftzbg:eSr'JQ9IR-ӆ!sQ[67Zy]D`,T®2;ctrW~YAtxQarOI|ݲa4FA:ˡ+>xwGfv~Q*ϺUmpJǖn hmٌ oJĂ7i:צ3fCE p92GC#1}&)"k.NPؽ񚌌YoPR:%oT+ޜp?gvR嵵p|T55OM 6m֬^ 7MjU@xU9-w'sլXWTjTJL"sSJ_ ҂kRxޡ4*=ăiꕂ4J"s1/.x~xY'5*ZД;8;$&$^JR&SsaX/pzf5%!ېCHHW1Rd2t^N !2.:ӄW)z|w$EMw|RjeR=|TP>-}(* p8.`8 0Rqd f"8!Ԅ\6Ȓɂk &115|f5eT 0%H"igl+oIU鰃QcDKw\.JW!C|v[QuT,B՝:_.z.I\]V;7qңZćc)Eoo+MiHA)x[0:6A{ZEX9#hx 0#[Ee"cxm A}ׁO> >VlݰvoغBZrM>Kwۊ}\]/EYr,u:0 Bp7Ʌ#؆ z1XLЄ2ĐFFjdS#M(=]p$Ce Q7@ HҺYVMdߗ+ e QMF`MPƹyzɜc 22*g0&۪ ݻ?h?]G=!Tz*.Y8FJ?@>@3JDἼ|뱷˧%P3?kD5FmT(d.LƧP]rB7?e>SBMz2_a< 0)d#A]LO@M=&2o`G|(B\rZO/9CLf/?@W+N@"?h`ŵ5if^xh!di+-b8g~:>祿l^"!ns5rkԊѶhAZۤɲ* )W&BA$/y3Moɼi7:[˜3=<ǜzdi#u Is{ JgZPy )xdi#lXDR;͊#gGr#wwZܽӎ;κHw\.}W^W46X_ys7+|kŴ{TI6yn-1 38>5x|`xcIBRA4-Ջ9al0`}H&ECVoR*ZZ Mrmd"zRI@(1 HXYdVPTJJZk}UzpOҞؾANZA̒ ,/c-SĴqi)VۖLSeäUkR1o˛AvbR ȜfdDĕNes2eW1 Qf0́R3k:8%bKK"%%}%<ѕnʹ=./Rm+';m=ꚑxnxRsf[hx>< ([Խ >#*}CV)!GP5}reHPVT$--u*J:ɂW/(PK?Q><7$7M _ ߚ9+o8۠BExe'_Qߝi%o<型Ck9.XPyuu듲Ɯe5M.}kl|)ѷߩzyN[+BaQDSK\EUO?)4 jTbWD 1>xj>r6-y)|%Iٓg37A0S =3  =k*Qjt O@ZN45t1* `f=a& XtfVHSI8jfzihPxdHH,&j>#4bl9~<ؑ5٥k=4f;şZҁ'chOjtNۻq{cFc;PxA!z1 *m1{04:Hwbc ?G{9L߰MEb/k;0Rȟ_m)Wk.]hҲ*a?h}_c?7ȚT 'ކ?vXO_NY0>aXtJ ),`:2p1)!Yp KnKH%2"Z@3dXn6x,`o53vF4mwi$@R {PY|$@팙 9&d3CW"# aqarƜ[(2:jj(4'/k^gKDi?fEΉsv!SCMLN||4sr3Ģ4[n% b>Ǖ^8Zt@Y%cĉ,+ّp"H? hylώ.{WÌ̸q zzK6o7tOMJ]8n|l{qUbk>o{qǔ_-={o[267@c#x=,*.~hNӥy'ie5b2X޺Tjxa%$4Hņ+ 4cǯgOX"'N[r};(†4RatseMAv 5fuc$EZ0Fr筭2o_qG"foŒO9d,z|XkdzD3!(q:FD4͚^M|Oce; ,5??BGl:]6kѻlWT&'wsk8&jIzc,!-ʊ`V܆#-ɌW!fli6ڭFj SiB=9¥8l7{Ȏ 0Y0GyZx{[q׫>'\tCTcsSG>]س(q76ыOCf+rx\ 9MP'2+$Ȕ8!$b10tvpX`: 0R꼢ˋeiD5? ^9@Kd];|r\z^~ɵϭn[Jλg Xq_qaV, 8ju:!:S-ӸgɥLPBf*KD1[,o\m\T`*z~l8)S l6u(sEPS4a囱F2jV7KoH8Y92ŧgFU'I~iIk7O h֢񗊛~~Lw!\ /o>#=]?zjܳ4HݠGSUTT_)zx*ߋEy;K2ijyj%fl1C&Oټ ouƟz). ]ăzN<2Wq%B⾱ .=9'sCmZFJYZEƌyw]nNi$'C AnT*xqZJoqBAg =Kx c=aXK9V.nCz~:+4lQ7UL.36xJ`J"=AzM# X"drJEmuɘ/<#o}VDmKڧ4U: u_#/!T3Dd;+$-ҼmC^3L,S{w8 {d^^ sA~)sȐ!ϘB *VWЧ-ೳaJ pe7`F&q,,# pG@/3H> ΆiᚍһP<,.|ׄ[ɓ$!zGלww_Ja))=}]Qf-}dV/.D}x*sF%?Hގp^^veQwF8!yY<&p/)6 ;$b|с_;;ӫ/z {2s rW߳<ҬPE~ZL߂4S뜼j f-\Kf_;Mqb*-#C~71TV* uqm3LQدJ,bzHCXX~ͱe;UnU aJ\ d..%4r̂ñg:CLt%\Fi{VENzsFsW+@{X3rn{=![C?4&߮ψɹhI͹.aه\qYKki$|sI#h(Q-QP S!ݓVUY'p)bd6.4xA1ʦ PӕKv'ǫkó`@_# YXkcI_]ujBlԞ^jpV$/サjM֩!$zA$15 L6PcFt>x=(2GqY8\pILeԉ98leS JޥJ%DVWNr\^5~ 0kESX(U1Jv؀6XC (8x4b2 BEIp.N"8ρ#Q_V@^Gѹ=ҷHÌ?rp;]'%u##XpU[/:pV7?v?$ d9<&$6)#E p,` nK@Gl7h:~y|?~vF.w#NאkO3Gkv;*Z]0Rk]vc+g'Ohѫ&evU0Ry_f k J|/gÐ!AHЂ]x?}| ^!: "Qw_ZOOYblI\#gkB+zQߖ Sӥ&f8QbS6&/J%iEc&eҜPt4ؤA:RI>4{S[姥tED7뒦)1>Oy7;rkj^ኦi/89RqߔylⅭ["H{bk2 -hM_54Lc  4~X?)?,=?1cIVo7~񳔸%jgĆz4Nqt@A+JAC:44D!Uݙ~ѿ5T) rJ撹\nA!BE`-bJ\G!;-x5rw;i5wGS^秧e8(eXz 1`v *` nbbE:gr&{<Н?Dg<"m@8j^߹w61F2/ڔYa gnI4~|GT?cZbeDj TT49t"jYª*c%v;V;p|n_xFDB#>+Yҽ ӏ;~U:ӗ\]SZ 'J Q[rEvayi#rD;DO߳&~Pz*:p6t:;ubzo:c'4mMq(D&D~x翡$Dx8!PdRg8.gh7dRtƀ} kRG_w#S_IK?UȌgnA)U ݣ@|Y+L&t&U;JN0'x'+0ELM&lJ6% Ar$I=%f~Y/F8Z," .xJS~ۏc3][`@7qgE՛>DĢRp+M.Y!ԙ#j8;<OăZn{iH$u8xӒ]_*`( r&KH?eY&}8Z 7"fb`1\=-PMY=8 >Q@Uq##{_3A%qrni|m& Ș'wԭDvnŏ G.142]65~y^^RLf+PRxx~~\SėR_|8ZA.l+;kr{v/ȕ`s/3OSƱnB!$??Oz?R2,r`Ħ (dS렊E s1F˄˘Y-dEin b^?Pc=[[ŨUO!f~]֖xoӥtn0&6n3f2n6~mM~40?i̒ofkMβ>$u%a ٮW8 zgs'3W$?HY>ew)߻pWq_qxVx{.lzxOx*y7}Zoڎ~wFiƊ3'fޝy&+'0kFVWѬfޕ}G9朝9zr7~'c# XBYXTXXIYT5WDqq͛taVE!AaaǬPgY.q]gVRM7 C51ښ4=xr;KWPV[C4=zS^=Q\]3;K$3 Dt,C1 س. /r)W6:DdEtRaCa[0$ @F%T)]s鲌NIy īSK \{_~w{}Qpx]*MxUh灋u^?\%xW݂넦]0+x[ 2ѳ|FJ9{WO#ؐ9cf2ʢfdYK0wVN eXgJ,3O%D#cvEcVLلi=ڙ{r빨{Zk&2i*:RB;4ƥ Ok>50[(*_E\[b@=s ڦ{~uz.bo}U$SLp (PTV=.SF`ϻ]c._<⬿&g4/vB r|B.aqO^-8IcxDik>9sI;Y疓s;O%癃$uVvIJ?G";|fr7LGI@I{':v(L:`0B?FIk"-+=6]Cֳ|^(՗Z^!.Vt"Vnon٦7jjյ*S&I2EIzedv"{'SS.*XWSF%~BzF `ݼeb=i$j4UQLԳNQM7=HjkwTAFZtSS*(**{ϠK(7(Y0> stream x8og endstream endobj 908 0 obj <> stream x xTE7^Uw}Kwv;k'tξI$@IH"kDŅE۠8LP883>:Ό;:*|JnS;aQ}gܺuV:unBZ4YSȞ1JH9+<]/z3?܃B ,]륧!*@eK;JFz[ 6Foʾ+_,Dh 96"cV_%L}y%yיK{W/bZS^0B &a éѪXcY"D >nw*-;wy+@8~v /=αϥ7(+$u߀܀x-^%܁zϔދ>n c/6c}q,笒6x/ɻJvSU:dl@O¶NԈqBcnWx?ѓ9pAfX:bKYco[_a&GW%^&ir/BRaA~^nN0;+30)#ݟ&xb|㈶۬QhJ9!aGYxD}L)-dc-Z o1v}„uv1$V,k|{20 +'+wz);*[O`:${F8W ! 8nzsv9cSS* BaS)@FzMtuwvzVtwZuR%k2.ΝފΩˆʛ"I pU7y̮k,;>InZJ(`Fu^Z@K ΎExSA->hI{"Cs -9k7Z|I?G32~63xv6JMeEOn/ *kd)L'C)FzpN脗&08,ir̠h{47+vNHA8%R* e;#C  *x0p>ʃ{w^TYǜ w􌀠:N}! fHlIW׫_UEYxSiޔJpjZAjƨ5]QĤM@[)֨+55jy&M?X Ȯ2X)G4:6eYɬf#2@FU#W M_\X!KtaǬL߂[ZT }Qc| O2'9ӣ67h3AK廸qzQ̥ ^ ZWU516&a(#tsb(;7[`G3kB72+G<*M=ne| ᥸ kfT^*VUU>$q'dSnuܼTQI^NIB8$wz}ykW-F?@@(+3Ic ;Y߷ `UL RL˸eb ڱ:ѼUA>څf.!<$FW?6n1@?3!~.]Ӧ4}rnnהgnz~)2taVV񉝡'OuMa^:>w9m'l8HDl>1 i.T408GIbSUu m"M|Mko-Am Dzب=:֝іћfd$AQQ'rQnMnk.)Ql: (hߏ~.Drs,yhwL@f4'.YӽG,LMwwrqeMIi;)]qq“ǰ{i 9*`ovLuӃŅ>HMuȇbM6;i9~ H5T5B+nzp{~  N{Z I"f%cf2#'OsJ+'\+wݸʓMW<=O>C)'#E[kڨ6ƴEY{I/k5Xv= NYrs099c0C'GCœ+KB#'I{7nȺM=8aݦq>E%HH"IE (CDKf@ !s {H<_w9LL bBm0r p5i @t<2CǠ?У'CS2?`]֊{p?0})} 4d;crw赬 R2THfa]張Re!sk._>Ʊ%@:a\׬8OTΔl6A9|F_jjyUէ<תʩW_||J~sb= ߱x򻧰o>D]S5dDc6gv21!rlLIl!Z0G̞\<.1j,S[] ;NJM1j9tuAR5\ݨO[Z2ޚp0yp N%JZsh5VH5JuAg=LQҽ Ү %4V./-ǿe}o 1ohrY4շi ?~=}f%Oy3D,:c / HmJQTj2 $ufJA!;8kgZ\Zov{n"crv]*Dux("@~h5ZLqO(ϰR @<ڋ࢕܌s^a;5 ښ7+伪nu:$wʅbbZoqNz[ JuL<_Q5z6= \ۻo=T^;YIލwq8YR&E# ̠j4"5'49S|?q/ MtPgRAGiǬܪi2:e56[M>[_̆lG 73]JOo]:?WMg(;&&njd1ƙo\)#&=ғSvL;E5VCG9YF* zh_ғVaWBt=%+);KֽΚYΫ7XV\8xrv_T6^1)EWt{KLJ=W^R|—ƚV%eS85.Ի}\TϏPLC0!/)?'Kk[-?{ΔgpK†]o^P*73-yGLNKdt1L򓗯[gp5;7_ 7wZ]N{NJg)T:]ZdD.ྀpOd$S|*;bO%yMFuv9k쳂P6|֪-=[ƪ=;!h 2 Ӑ6JqiXmP]Bl M *jn'=ɔu\Xi 8쳅 yb+,|nom̛ ;~8Ь]y7,?hh9Q7Wdžq|,uZz۲y99+?N6Rɹ5k;_QŘ_[iO?K۶\-꾽*ՁGkz4]֨ .|@˅|_,lW YhmXf_/X!Q3 AG?K)uD樮j ) xB v[FGFFj$ʠtzf7ʛI~8C~;}n%~RPdd\BWz޾WD5huEQZ?t%+:?nN ×>g|/j>xL^sY_M;J/&hti".[)D>V'6y`na4{JɖbUyu?~XGC[FlM ~ lh%ft#y;-E7_ywfهU;5D fNg%@Jl l"f+o )VΞe=UX%\h<>iZ rP Awq%30T 0^>K^&]@hG+!-&`()?0%>k&jjya$4Բju*V^%_?z|@D\چcr]ܧ(D c^6'ޓu8yYsKWF].K"s\o6_f^h91!kO8-d #}Lۿ9ּvP>B4E]8aD%ȣv;{!,$E`^K9)2mNֻڗ^X_xݩ{ZSlMO.h\wƯQ>3%/i,yYӣ^g[_B_Fb,M.Śݮ]jEK~nA?&U&W3aySePsr@\{{} ~j&꒦\zt5qM˸\W$NE=Y󓓽G&=SęDzؘ"a0pPl<6o*A 3\AV\KFN iQ"k|Ly;7'1{s~}rʆ7?\-*d{mS JǙ8q7UW􃽻\#I>C6UzXcKTFY7hl`@q t=8 n`v:fwWcr'mu>J lQb8y_i :/9JN9޸OVwn):fO7q<$6~eWf|ܝlv=_=m?){@GA[` AKy-VbؤWe2 =f92mbOF%kcfUYuVE֒bemV<"(jy}zW_ e4Y= D#foCm06u/qKX4I,Myob;cRسrʶ@+H)vd36ƆL q`of\b2 FA`D@?{9+A悬yro;]ͱfFJpjL4M3y^ѢkA+bQ. !l\nJ@۴;Oϓ10x;jĩJ)d kPd5Ah4$f("&TV֛6GilDփ\$ґ[X/ɞ,ʩ)-G\ŏE#>vs\G؞8')rssr$z<¬&i6'#o_ֱ-%5|҅S}8*wrOn$9)7uQKQU.uIgkVzԝ!p,4kqv]VxdY۶iq^Xw=,_] Y>](sckgV^0y] QstEd4jj + Qq*'# ";+aN놫2-N:FMlǽ]e[l>e%Sv1=׮w "rKn8A7ŦS nv3 Q G'eky'VPdfcA~?"] R |wa7ul9}JsJRvܲfNk_\>]^g~tg$hO`RjYm3ܿ7q)i6͔xc0Wr '5#FmhMzVct:Eq8қ563K@K,5 >^bՠC(y"\d,z/qsb4L/w-k棿#0$:+.nzSEd@:JMx6TdAM%ߝViBufdW5I/YZ"m:*V ,bs"n VǯUтP:FRbB1G3Pcl2 ]~p*AUJTtףl' W #OFղex6ǂZtF2[54XRuP{DJEi\l\Ɣ Mx.PTUWOJ *UCN$p-c7ǡ g,=h- M]8 hG##p hՈjD5ynvaN~܉g{>=oq:ؕ8i!de nCn$~aH7IΖl&G>H}pk>WrՙWiE {̙4ЯXc3D[D ;΀$JPa S,feأ'qJU}FȻϓdݗd1^]-tr8Ղ-UTdijl`u~S"TRrܥKJeR s\\].5`6Pj 2jMd !P Y_dXpd8X5aиCTܣi+VIYY$+ _*Gg~Ɔm6F\A}X D, J=7NFEY9@t9P[#eSQad);y΋kx0_[rPEz|\L(I2'LNi;t|!RV]XlI1?՘N Im3"6&Og^[[GG}W_Oآg/"3${%ӲMތެ5B:jr!^yi_P+R\/S6K"IÓ{s$1_1jZHW|Q,+zs3S4F 邖lV˙ 9lA't~;z[8d\ԸP~No}>ת\ML쩖?ê.1f LOɇq6޻5o]VO]`IhJn:5ۜb3nViьh kmxkt&>uhTgm)9mHLUyLjj.#L$R#ԑE-YSp ,b /KvHaуJ %N/~eJY8N9z@ދ !| s~檉~"zY3DW+/qV9{k-W:{tvFMuob5 򈅉u:EoID[qU${TXB +#EX)k)Z |u[qtiWQ~_SN}r)3ZH?AFdX~9UHɱ \ˬ? F-ϟ!MGӣwc޾FXCǾ9svH&86fpTT4mMmɏ /3&7q-teHP45]QK 8Y%.X9y@>ד03)ko]eF:XgYh=wվ@Y,e`/e_et=72ضZgfeJI=-^0+BK#_e0 GZa#ysLLzpNzyU` 1>ز?ԗ2v-%gI%#Pнoͩ5uD8Vf/*MJ^l>Whqgina\4N~>xOR31Lx8)Q}Gg<1qMp> Io4 Vt*5Adx_UgO2\{LSo^6@nWP\Z//ʚ9|^ՀlIMd;L~G ϞbyX+^`˖K-) lŕOvO\1)?G|; ʓ/P>2r?c?.A菒61:-`w$ Knj$&s$`s8II7|iin#*Vkshr뺂\MfA22p.$e5;ȅ,5b(82&^Pm R~[" @[#ɑN nH#b.`ou%8g/6פ.Wjʝ֌:dtw'5..t}.\Fw2Ֆ_Igֵ0 R.icsW|)ƍSe٭,,BU]Z%] rSO.%H,v{ן3s)H2 0ۋiƅ]['Y5 W1jIkWPH/)*<[\_+Ǘ7.lW<ӕ\L''5tgJ;7?_ ^p㼎AGϱPQcܨFYu06rMQ-u8Fa+5Z4FG`Jgj3c/Ƈ3A àVY:Ca-( im$B5m+khlsf6(}[2(QlF[aܗO1 T,%*u yMF:5zE^>|Ɇ8/tLk=3<#o0 R oU%6jb-e̲;t&Zo:i*5Mv􇉱\*WUkX\E5Q,+hF,5Zrj0@7) (?,Qu: `E0/U!|cy`NN9ӁJ|X17g$UQ8`ĜD0Kqbxv,{}V\ֺGx#h3S`N9GP~d ʯW?fkj<qRkR[S8 s$,py sNƒΨ8ax\;Y>,?P3=g)#1oB7˝BoE^ vzTEE&v؟_3^f!T%u+}3Y]#&aKٱupjkTy\uPf'r-Q}6 pw oAx<>ީǐdQb`nPBhV0nkztLG_/s0e}Slǹ̊sGlgG% QZ% #ܡT jp?E`LwG.n*^jGOnM-.jtuṬejn76@u2j)&( kjV-g6!sNգgP`bEy_ /œ|(c3/Q$GA(;hR5tnpvbp(ίBgO;ױ%|+]i e?ݙp^+I{c59> $pkxcH]|5ђ/}zy.[ eQnE#['~(υ\+r/_*MȬ,P|]gʓk_aVx[nMok&oJ %7- !n#h//ZWk3ON11:i:I'0zb 6u%j?#OC|d9`q8:6;*>}4h! ^$~~8Sؓ{Y96羏ڑ)wkvط V ŭE sᣟ}'6-t/2_BW;ī8o7n1=ݖ& Gq,,ibz1oHI5&%|1Ƌ+NzKUo4u:Ahu1,CL#HC(jP?b[CH끋R9UH%2* TꆩQS*T7V.h> stream x㐼CÙw 8c `  endstream endobj 912 0 obj <> stream xy@7~άlI Fܪ.^DJUjڽjk^-.mM=g7afΜg3amB4.j7 5a6oukxfX>_мpiˍ@;su vޡj@HUФE_ }.`TQEK[znBhmIӼ>]܃1֭mfGRE-ӑkY}B9&a& B,C8I^F߆Re4-@>\#OUUG5|3#54rpMGסsc^~i*m}žA i< R|nѓPGft ݋ ݌+0W!t̫pih)jAjt G4Cg ݆nBW $]n# PVOykО%9Ajp5݅RM7R]TFtEA~/7'ۛIOKMINJt'H.#>cZ&cA9) eUu8%IΌ qIA ڏ۟؅]eQ%ƇQ]ԅ]<&"7KbF%n;o)ʽkԣܣ33a(͇qR23.*,]Z(KNptўW?ޒ)\]ܨ.^yKB;\3NnͭhusuÈN*]TIXJE.nP*]&(]T kw \uzFUuH']FؖvEyFj\dwWmȺ ^J73#LS䙍u;+mZirj"蘺Kݥuỏ+ Q+TEN#rZ 3{Qa{jj#5PQ{EZ0nBp?m7DUb n.\f`M]K2bv2l{=]oo.VTUG{a*PM*KQսD K\ pUVI.`Ԫj;𩊔+A}a!})JGe4v6M \CHz?jɑG#z]^놧 >HM  (3Y(]-W#ɛ-4yFx+N!.ߑpl3s iil[8_ܨ8:..TҒeMT-qƀ;{=݆ϣ^oӡ򰭆:Æ=jzmr NHσ&G,x7rr<|;qR܅3hmU+W9U]3d{%z%iy&n2 :olXaťY:y}=~U|lf.Gyr.c4)Z{ e+Z~A-eB"Вd XzF&SZIwG kRQ7wd`TB'NH7 )L_7IY~͟R0e? 8rK{e_kr+FO-^۵+8⽷ y}Z+F(F@/^ S))=x(&܆9< ƶ ײ QE`zEB՜W?T^F!7 ȩOfX*zg9JEmhq-xcD_4SQw ᐙ cX.KY?gNk4zA`C mzkok>9SꊷV]fRBTϻzh !idr4T,JV f]iC\K^7ZSi`(fZ-ikhhMbRbȃz}A+:ruE~|Z"*栋n0{Ni}#u5,ЄΑ+UB]; RBFNy5׉D{`ʙ5 ղQ)!6 I6Z?s^6j ~OkHL߇,"!Ψ3E1oD}ޜlO @ttcA"bYXQr*"#"T\ÇsgLh4aii3ܽhcFNI:܂[nƆ ^1fG[CGsb5OZJ@d\<"%!LH4Uqkt g+@ydEcK@36Hhhϟ(?D/.CHA-wV"&]Xw F!T8KTX+>ˤ,(!t//B5_PTjh?Z>$uM(_NL1l0J mxYe`px1gy]-&N 3}s [F+}vFˬ~m\ĕN [ԕMϾq]ijV6IהSL yu& r#捼Q!+0h`K;G,F6{^֯XѺl*zՓ}Ci?~86^xzwAҎCP[pKޏ@j@ws :Kyo0SBhb'.ԵJP9t9#N6W(MWACB"/",%ZܕN5S9G pgP0}óșKV78v~+/o;?y[ t@[F׮VŬODX/bwXa.Ƹ!!%ٷ Ujᯗ=@ r|yҚŽU3|onxيg([r׺|0qwvMeP-ۮZЊ |B/s+-KfN1CIP31L5eXx i^WčlֲZU7qi1qE iZA65sp2' %'KI_^)MpneB ;nNJ /;.bXﳎ-gQ|0Ę.ޝK?[N-;U?Ϧ]nzk6έUJb>zjۣ텊}rvy&hJġln +^X*.-fUߜYcKK55arv8bo0 |A^sktXrS P)|B% }׭8"clO {hO@RF; GlߺO&z7[9Ӿq73՞7=IL2ay=аVξeЛSH F/}/dqH:e=gGjtF_w篏 Q~x"YJN^дV#:.tJ^ M,'`y&!s)"!|d6<<,ݴhd̾>378$| |' Kۃs98(=H2HņUuVjlVU 8!(}$sD?g878;@?aaMyFRKtoge;S#ZyJ[S&~ӬSj%>ΡqqX-ӽ=k i@O "k7Ef:/c4_O4FS0LU{O6ڰmՁҶJGl+, QZ6P8TEVԔ~u >WTV[ =T8 GܲT|I w_vG/B_9gHVn 7nl-"9-S-P)P1T21@X`jfff(\ !] 6TFXPOA,bst;N@M ]p˿g7C;(ypt3>3a &6D8/'3L3Y \^~^!s$ f\㼃%AҙY,7 =\#IՇ,k 6LK̄wRd ԝ1ykپmX\l`fڦŖ֦Й-8j='gO[R T=-mg81TcO<9cS[{>c`Aj]F56'iIԲ6kk> % (_`d]̝I~'2%&EZpS&LmEjK})~F\( ~P]98Y-+qퟯQg]s/yl$!'a~7 )ty$gIS -Ȋ"r=*ʈ6.3Ώk6hVc}9DjmUfWSvbG@Uet~5?thk'HD?ICk"( " xKo?W9Z;ɓ+7{߇.[3:=9ng_*o` m+{l9Hy]12(U3JI|btڀ8Y].SOWVjN[>vIZH`h5[C"܋Ž! fW\[--z3Y{t}Y_JMwOEN"rM hԃ֨jvy0PwhK6406aTGJp=p}M U>+ 7Lэ嵬&Z\ǍJqlqo+mGŽɜoOR 8i-<(5-)qJ.HirZme%zMblIIPD@bA3f`4_ ゞU8'i0\ (Wr2= Bn[׼WfB??SLO L*7V^u<{s{gl^:)l{ذ rQ i aNiVbv7Cd*S)BjL_petn5rD*#Zfy; p1"y<@Ѥ}dBp_0:/:?z? D6yT'l-lnaAngڟg4ӊ:nIV{y~0`/&59$#'xh55,<+QgC_?9{Oº>PuAiTJp Y~aР'. U4βB_4>(Mf_AZ' L-?/LGޠ~y<-:$_!Pf&2fqn&M#4%,Vah0 &Ƭ֩4uT+CkQn)#d+X3Xnu#:RBf bh^P̗ `DGX!ģc#)$N޹[O1D` ,=kPmj gpGE8+Gr,sY[\Wh3i'~,_7@ kd oWfkf8)h:La oB c~jJ(K-8 6G2$3'#y1ggSř4:]M U%QTeT&`oi2JfoNB._˕SdN >*Z9~>bkv~A?LhU;o;;W^}K^`s8'e,h<\9&jTkFk uI.N%ByuM砸Ix4gOn{_yC#=f[ KFQ_6>{:>_U=#;pEJLDK:M1gaaan6:ڠ; *Mvsl2N68g(.N6ͫͬo>rFˎ(3Mf>,0j C2-XCLKJ^Vq~[sw -WϮ:vj z?6i >QS^Yi-}y@̑nFWZ~t~bYtYb8%4/6}a{U^1/*veO`+Bv^a3vʔ3s @*4VLXC+uʹ͹ >!XWwAȰ>5lB" ’+1GB;zLqc[7ɤ#tA܀7ԏw'g\s]Y/df}[JgY}Ʒ}d#g߶>FRL8e< d9%mFZk˪~4F\MJPTB&ИQ]rMģ`)q ?æmzIhTe*ZF2AW٢3UUTj# 4\ dO3I84mCm> 4.S*hZ(W7t:#fL3+lhDa" K",2>;z,pxp%Σn}^Ǚ{} syT9- 7HLμ #<{# n5߄vOS^g̽˲g,'3)q  ? U{7ǻȗ7Լ'ߦ93y򸞞^>Ԯ$ m-v^R[fj5|wDQF4~Qtn'[ ,e֒N(I;ߴgknҪN%*C̊ "$ɴ Čws;݊W][T>l¹O/|Zd72L'OSr]qgG咜&8}mOO/H*X9nղ,DcLEebiG8QtXXwءAhN6,0t 9*W"\㘬b ,{cͬFaj3huz]G[XMfg9c> ]'[y--ncbLZh dQ*Yå6'6'QTMh#ʡJ?pFo%&ڼ[=2.OyڰL8l{.yg T=p"V˴v,ݶ-V~:1w|;ǿݽ1B3>:699Ro~R֐4߮Ɔ;nrN{:q`PNUO7 d,*H\(2yd`JDmT3DrK.5K$3Sfb2^ ڗB|ᧅc:"~3Bs򎾖.AǟNW]fPa jt9 NY1.X2GjlLE~L_؟~\#cŘxۍ ͔^e|⎃;טhcx+˜/cS5:.M7ikcЭڕ1jq!q > zK(d^ԅ-Cs͆4Xi.qHC-5>.&#@k3 f2Cw#7|!EUYZ[RUJe-R*PVXU~A~a(Jf- v0V|ɖg\ۢlLtTUhAeU\SV&;d\kT-0ʺoGn$;&Q&< ;$7OOy.e%v%~36wQVђKRR= H4&qȊbh^%$`H"cIRA^e3%ӯ$ E~""'386T/0"PC, nN_S?yVAJT!5Kk#m9Rч dBRKoWh%t|(c(tZ\iE쌂1bR̙dTFnƶqflMtE*aZvnPWz@BqfJGIIvFwzZi3I?*R `h0T5p #s ?#>)XcW}>q3-ZBN~˫DۿIݵxf;13_{o%nxKr-8ks{|9cJmϽs#ʸMz<<9'7 5Mj9& $-0,ui$*FQ@<L1>`,K{%'F]GS;EA7180۠&2+GP$ I{}j{Ajϯ¡еW^(o-SSP,Ԡ:Xx+BA)C\A5$J6NJbڰ`IʱRLJ8 2a2 ԇȉkDu$'?eF+=x./(Z8c+853m*,2i_*1| \ޘ_3~G{̮䤹|L59s hlL#/0w0V!_T06'~ac,-9ف~f6Sv1d'[LaGFf||f𔙤-berl "%Es =q U$CWlR}Y4A`Ưpp#v>]JOWb8a{0l28/^cyv%ywF$)?E3PW;Bc17|CY MݡYZ9OBqɏ8MR,'lY|Z]髷-N\u*.yOLPFlUGևX'l);]Ų Vabnca_ab ڨNPS79Aע[.^ۡ`Mހp偦 x#uV^:y_0t%uxk.^(67&ۡg:fZ(S*SSTaV~qҰb+Ub.e'c1u| eR9Y>xkRaG]fk)ccscH9f->6U@BOgDaC< mc<CY .]}܆mQ[.iDP[(_򊊊ʋ1O7]GEL2l=]7^([2Qϊꆟ[,oNg?s}ڈ鲤קƝ:zG`=Kq9cr3NeN4՟0@jn-(xŚ7w̒\|s6bЍFCl|\x&"6@6+‡Vmca<,`ZU>{VJU#H vџ¿TazcLͅW|Zh>'GGDTL>i ͨC5` ?iu\V>PhҪM@: ;%ϥ`} y>F\Ȝҙ{ifتGa2ӬO2k9(}rSD(&[/Sr& `,RH>U`!= "*fQw(Džq[O0F ]//faBq8et%q鮵.2JhTB* [tBFlK"2{E9e 䥣W#@}ğCs-IQ rTh/Z32Tj0ЕB+//w<>dԔQ)(C?=63Z|PznF4"MRjz "SaZLOMЋ"}Xn[d"[d>/ |Tg0ӱ2X6UMjDI&A| ]2D h 'NVlaL}v ~+.xtaSIh'?Vޅ?((AjHjMju4"aaݘ.PU)Eeϧ!Ed i8D@f"K'"'VϬ"He6?X<*Lǀ@/vxBQXVtKJ;c*z?(ʃi%Hb(1}}1qOOog F~Ky@WBWlY, OGCTP$C:`fئ_ɵ(OMHLgƇ~pDSrŽoC@;UJNVrf䆌lzIɚUiEZkmqxtVx qf&$͚TJFIG'ZSRZREsJ[O#C+0\ʐ}gVhad>Qb3UVrE}fև+G+zG4Ep|yp縅ζjJY||qYUѭNx{>xSۻ^\x@WܙU]93Ұ$w ݭ,Z܎wN܌͋xlӞz.S^Q6fU{IX"cŀºyػXFGx,LTm}7ɢ8{u&nt dKkS6w5*fڨj+vG/\v<z0 "@]3}qh3v2KցCrY)LӬ02E^},#A~/1A*y.5~+zbj?bOZ>l m'bЙhnsEh&}1䄄"v?vo)L`ў8lE7l~ 3GA{XŚp@oK/(B}Wχ)v7;&')VZcq,/;MhlO݋p ?y œ_J#tR UDQr\KTiJ$Q2Hyو IJ=JJIIt E0QIGޢ#/ 6H/7^y ցT8J cwʹ~SKJ=s׬ɗݲډnhXK *hxdqqg@9 N*Y44Y2|y!yGB^\4䷅!y䉤KĨ/B\%JEU "/{=dZHN,|1$䎙ЩSer׍OF3RUSlnUm59LRt8/#''ǗCK?~8PKA.Ϗ\҄&#MJM)X_߇JU9za^G)sNFQ5s]ƃ3#sG)t }GOW_<uK,d2me&,5ү{`/Ge^sѬF372.i4D݁3-Pν6 cn-cߟ  zˉ~O?)$>`!=߳C'?mė_mEPRj\3u5P"CUeP%.52 ?<3?&q7$D~0QN؏}!-#t?h!%Q%'T8ə#t"n&Vf"Q4yČȅ >OP zGGfY9ɜeβC휊Å|HU^WԷi,+4YtYRkc5v45֚\2Vuuuulc:c:c{?wYܹ9 qs/ޒ$w#w{OO$qII!%))SyH&-Qh$ u\ȏH%\oƅFe_7HFEиHFY"RfmYEWGyEw'15=d$2LZ8Rz,*e83RfP(e^):R[#eRR&6|WDp>i4*ZHE6H#eͦHO(e ԛ 2k Ñ2\JY*HA6/J=p&J)zoL+e3)-B%R&VPL(y?R&B),)l=|)PTGʤ~RNT)TʙDHY=)?RJٞH9cr>牔IZH-\<Aݼe:}@5aފM Z\V47kihZdkrE-+]篜biW-Ra^ejW쮄;r\} <,_~Hf弆:WˊKV,v5-t3A}Wh%j@Q^=ttu_܁GgoÃpCp|[rV=l-}%[ pyp&xR\ע5ʚ\e`\`ׅ&CBTÖj5p%s~Ÿޣ+#m -wK'W3.@&\_B+)(|KazԥpH^)iu s7W8>^'^Sыieߨ}uh%x6(HO6]L,3&wU 0o g 8Vχ-=u#}#=1Ͽuˋ֘/N׻Ts^^ylz򡗩:UΧItt@XuߛܷwzXvf:@u;˜No'չ,=g7un,?2|B>P9) xBk(0<壂=fx]{gn租;xg+6\緰~ {K?}Ay*i8 |&ƉIXj|y-Ν;;ޑܾc*Xvv޼5y,gt維+V8"o6`+\xfsNyȒMmViXlވ#G__]_[RDiNw䌱;ZrΌL1ݣOMSIb[DSobbuh2DCVkF*-ͰZ)A$R2dzM#9 1"DE \m)A*PS,T9ʉ>eWw0lw<㏪\.bfa.ʣUv1W`c5cfQCoU7M[w=]Tu5Ww®jD`lYr>Ňb]r믔"wջJXk\> stream x㐼w @5[* endstream endobj 915 0 obj <> stream xڬy@[ו?~/OHoz,a0e `ǀ vbKIn&N8q;ict4i2meƝdfںM{Lg~zzss}``׺q%J9*AeN#rXrmdzWc"3^@INr#l^_|szR)U7$dr+'{S0 ;(3\~ >v{«mzٓ4r @P弨n^,TMskAx5wkYf&=vՇkiH8z8cs@KV'KDs@wy\gάq98)bn"l^=7x]aBルgypq?Y9QuV5 8Y/! [8@E+yWuH5+<ߺL*pdG wtd_QT^ܱzh^`|5>w^'mVxdypKy}<1pɻzdGxn>Z,^pa}9 AO=XGXHvt[|ap{ P8yTݼ]lHomMTCDn^8 9Rh ;J{$ TTk+ &͘r*e8EkCRO]q&r9H>!D, H"Ef*nאǵ1Gi(y*'!<ɫn !pӋ ~ĝoFn9ݴx1'q5/y@E/XOdza5dD yӱ9Wkywp5 wXwgiA3l&ʬ vw/>PqwGKڞSnr^(E=5p,=3YF(מ@(,A Jqe12^(KD?2"CW5D"ż5T;/w-%E\L$aN9.ܜ#wPO6l'Ab{ @Kb&b)ϕ/aDv)LYZXdRASqjwÇ/^g>\ 28x b dׂP" .jyNipc΅z6|Tol/O9eeTXÞgGq;:nv#L.AٙT[~ž<o00pdhtYpXNd26O6#XvAdM\~NBc@l" pcc~R <#PըĤ®\ 0XL\RB<㮕rñG@ ZRS6E{"yˆkCg zYOĦkkr}^e/zx=Oh`!ˉB:oΤ`z.aAFSs+28-ؔD<2W1@<]J/ QTc9 X0 .BrI(pQShaY X@A\4SG|;^z=”b"|X\: )5hڰHbZ%gd:- )5ČȤ;gOL'̖a-؜'EQ3`dFz,cSQ(' 8Ae*NjR V lk~ޞ٭<<ĭ~%Rj֤2؄?6 ɟ}HhMr=Zz7?/CLt* S$N~2jǦ~QPܳn> GpMt7ªa jN2w@0*4 njCp4֬Yhkt4ӲYJ4h}Ύrr Qȭ[saGx <fN9>6Ř:"ɡ\^>;gd~ҽD; 99nȈxx)E͚I Pp ^U (Xs\1` a1Y(5tS#BGJJ/ 6 ~X@yK$WWQ.(I&7|\lQ!'DzI4sFa!Ij*|rOEUB:ŤwxW|m#`~[gA՟**RItd!䞹ӗILGKt#EFR4f ]T W/LtmL A!%+^?=uWO¯fjqJƫl2b$"hb /kRM2̟ `CԪ(ZDy#ܠ*֐T8/㧿rxe++Ge,tZ(tm[\;'r5{|`,ZQ˯(6W^BuyW|~@ty&oD4j"5K "ZITT]XS5Yݳo<Xlw_l.>_|G(yyn^.& {<!sCUM0!xs>_}Hg$,{hd3oĴyb1kˉ^8AIN<́r6}*i%)pY<䠉Utx@PR(IUoHٗI+/|7) M#mZHк4)9IÝt+nWsh O<O;H*z8-3 hkNHQ t~ = \GI@d ?uNRP(wBƘ(T ^@Hc/:X4e(~|8m%IhW)yG xAy(kB/L_O 9&fcp 8*miA4#p3.zGz.Nn%R2^ۋAӥA .%jQ9|E}dA_/+ lQ=z礍GD5fg̬,WʤZdS ёalbqN\LhĢz7Eߢ<0-N{潧GN]Z沉ҩ̬M[_ގƧc?UXLiWAF%K z2@#7$;j[a?<P CCh%R)V88I8E6NPHd"n} %n< Wߏ2 Gҫ: ./_haҮJ/8"'Be8ekE[--hm306%! ^L& 3nvD%ʪV4{%h"a~&Hoj(qF5& #vg~}+c 3R~ёo:O߿}K*WY*{*4KzV=qx̝ >yl&}k+Ck _-C .D asa_! Qx[ց,{=p*aNKf%hZ<+N@ BŖM!G9`A:k+ Egɪ22>}* '$8ebᲽ^ddya9Kr,SN`/J?Je$$2' ܌!W8S,("*E^W2`KS{NOK_tu5M}+{=1i[~Gnflte{t}ohJIOhtێ1Ul/tΦu]VM q!JE"[ R SD"bc I VŘQ(\$+}aPZcB'~f?W?P-r}n\0F$xDL9zM(ԡtO`vLj; 07|lC|%LF {&<9 339SDY.~R&s{#)Ä6đI8L3덝clS* E6eYZSd`>[#m_Pط\G4U[R=z+`tXvdZ\Td@p38!& b]ikz| ?qxg"/<*獭]떙Nl[#'Ɂ*_sGFۂͣ5"^w4N|)ȝOݝ}՛o8kD\S>гAT6*kKLU_.[tl:ڮ[F(ph 'n27 ##ֲWM!ts\dYY4;ˢIc!qX #J=ksr72Q[{c4my_Vh*e6X3Zzam(X>.ѸR'Zc6UU_8Q(eTEw /R0  W\O{8'7ܾFNOcvv7P1ėռ.%| %~ɜω:6^onےp~#&:)999ax#V.$6]]l8N̼1UtjdzLj3x##Q P5 !1`Ɨjmm{#l̇؆ҁG7ViP>jX.X;k1gx~;w;ZV,l\Q^7D0Ar!~"6CQVE4,HQP)V')bmnZʤ0(Od=yKZCB!#4`6f3,eGH5M__u| _@ cD`+ {*yN" (L 3a H$aH_!јhx!"j g* B39~0~ w_<]$F0yY܋*>O> ~ٝ NK12 7ns9GHk|#FLlf<)}>8KkÿG#D `BĢMVϰNVP7!FwH+E"),4%4#_cp#U&*/xm|S_0,X{H1yp""?,LSئ˱=&Lz,sصյ߅m6.P,~Ho]7"‹oŲzP<2E[*=Y-׏(xjW¡k+*ꗗ Н4oPUy4KwkQQ3%a )&\(]ro}-F]4k»CB(ēvA<;èCݣ%;JJHlV//EKvd~(ȔR,! *Y,|vQD59"]c?6Y;33ST솀ᤁ=&R4td`k+ƞi6Wj}-O׃w=iVܚh,UbA822Xlppҙg Y_[S;/<;?zפʝ+FV_A P+0$DP}o"#}/}Ae 8?]rO>X<_Ė'}4\7{p˓_8p~"5rWy>"tJd #W!v7{e{%Rbi?ƣ1)xGVLttaC6|4HV7._S녛;/?MOIoZj.ui桺YQg0Z,[SٜЪ쾲MKO "U:s#$jEh79}DߑDJCA[' ތB+ :;ywDeȯ[~: FŸ#7AU]-U„$ZW%c Rq㴴]zbJLPt 3E\}N(Ou A)TJJ9}y5_wnҏ[.R*rQWdgAٓP"ce"RHCXW!!1+red^e4_ !FH C-Ya[# "J cILD 4[Dɭ}A_yIr+ʯ.?aˇ?o#pBU-B{:4:%-wVG$pdeI$MHdpр^%,=zY3TaH3X&1SB~J 9߄E&f"HE :.,w|>X\#D|v~OQ N0C~9 rc-Ƙ$W? *11b4"0L,-yZJr9xmK!~G/)dr;_hwo~=)Ary,749/ FKX~Erw|i |` i< ,i!F$$hf''=Ȩ&"Gkj r bj˂4!̊K]D߃ױʿWz{cU1o@@5bbP? vM,<ÇpG\žbsL"2M#b6ǐh{q^UZ_JK uƌ3W Bj fv/ xyzfs QTdlBAiЉ@ғ)C2B-RTq1A7zib!´Tu`SR7/yxSt{Dߒ >| |G[%c==c H%mŅn]fLEݪr:.7,q*mz[>Hh2m-1($>o0UqϵYX Yž΀'t:"}q:4EEb( &0An/HƛZ!M/AsN0 ya IiV緼iѦ̦DֵRdHs1c+3ZL#_1ĺu߾xC^Jpiih ԬӠ-}$oRCV!1I+SU+B5CHG׸+g[g"+oִj:(k4",I\r\'qn#jNw2)NО{OydAyڵnoҹ>͛͏ΞVҞLQGm*MQw>$r0w3&ȁ>#}07l(pQd>1#c,fat >Z9,-DI2q-I%.:JuMBoWdb~MxSq 2q(" [@]xC !7GQqW#O]eD*R]PnǏync>* TDCn8aSVOHnr>ږz mWݭB;sJT: &:x5Ma, `@zYg±QfA\oKhG řawĒؒ?Wwյ?9p+qOPWFIaCR99}M}{G{J;ьdU:7'T.V2bb!ˊPZ&@☀Y=@iNSTAX54|j)X.)89gIx  ?rmEm5]+})C|X$a"W5KtL Aw +:C \W9!k3({ba31 VW!(j`i:*KFuay -Ȓ.۹`FC'B" AO Vq7fVA׍L##~I ewvmfbeY_ *o ^?i9`"*?rխBknoʔ]\Z>wLLiSƕGYĖ28K!>c\5BRRU2ɢ`!^]c0GY9 8Ot&3r$,Q:c3>/xYͫXג} `(7ȖB]We鼣m$x*ϧ4 _P@SUe@bCo&h&$NE W|[{}~p|[n'M63`d6 %6hÐfY[)jVsQ6(W^+I0EI_rqѮ5fce5tu$+>}7}bZzS M7II>{XU_SҽR $=n= 1L&e)W/18&?)?'@ʕb(|'"/Qj" ˠJ,`ƹBeeQ."/Ũj( Ձ b!I=@Oa ~aM|jtԘE"ܿypk<2х$?V3%Zr eླw㗥Տ2^@9(p5d'>L([݁C 8yT("B%%T+CJS%PY$gb;SL椹H̰iƏ&MmFQ% 2At ,W):FUU-蛭5`쮶'<1UTmKr< =LuxxL:bz!kvH]sMh97jŖgUU \L ]h06v fd1 Zؤ"xsH^ Q%gƛn ]qz_¾Mu^|۩;eԚh)栴~xO&U]OZ]ϬX,L- m&FV~/S($tti!.7j4*cwtCp R^Nm7 vՙX _L;I|6̤՛\buST?ةn(@r[řK*|R).7E;n(>q`վMO&:GaayN|csN_Ά\ߑ?Safdcchr@ &u()#D {I& D.䜱3͉;2gt]ʲs/X߿[ysT_&BqW?5-c5ek#YF~ڪ:I8#s55Mh\kt&&ʗd |Y[hmXST<[j8_mFo^vw؜)UED"J,1ZOB3\ZQQʚZqЅnT$.A0+ C"yp>\6V ?$쾅֥bq*tLg OL9a>{wtyЉdNe0E gq#7FAAu d /fi|E:CWKuhC |)jojD@&i3] lRUݧFR5ND؈Q&\Q"n|cܺZzGPL8- AjN}r) Mw%[$;dcS5Q}o}*$ZF$ t7CC6dD!}2>!}vJۛҺҐ;g^̑68$xFm+!x:ȉcpCԃؖZpYC*zOUrT:%([ H\m"Ec*fJV=՘Tԋ6m&&re5\b#V}S>e}bX HjqXvQ J s."{,a̺rs| ,"ʿqp.f,u&b*IReGK1,KH|="T.(xhvx<!|9Җj+􍮬ܴ/3xH>*pB IX" 2XVF! %dHH/R&5@J0 ^d%b 3BXbMaNƜ??wl{/> ߊףlgZbgIĿiO3!>-n0 @D$6aF93ͳDrRElH4ivNk2MXIe^hJREQ+N0#ø4HriPHq'DF^鄔U!xmL-Ote]`6;%rG aS]q5U0o3 ,첶TKUͭ6tg_ lB)%"Qw1l'pY$&8 I$ӥYhB2j()L)l+xBh{^Ga◄7-vz% 3{&zؐ*,?W+Zc |HqR oq*$B_2Ipa"38 LA h5kOrj|Y5ѾO+c?؂f4rǟ-[Ζ!YN}ϋy4LGT:Nb'NmY:Yyd}p-(7 ؎`k~e ?vІUS*}ЍS⽄#LBAJ͎^B@_$+h-.r娔JZb $$d#ɧF»3"E$RH*2 aA!& QXz-6(ɠ`/a9~FXtqjrqv'/C@2&R`0A7E AFݑ,,cn$xZI0xl쟙]X" GBҖT1[xFR 3m yhJ$buP J83Ӏd=1u^bԇs;srqnoʠkʵׅ\].r)n̆K;KJqi p!' +MpKD,5ly zPB4f8d8f8g ,z\Z~0#XtAE"KNd&p/n$A:/K.o؛NX4L3mɻV1MG[vt73"kNuN:>7v>i}nˊ`xy}ALkKɚlwݪ)eW^SjOKhX-+hXm7o)=(EKQ)ΒofFqX₂!`]ڧ x&l]%8O8N!9 |Nr\pSq&-Rir|h|7>"َ~Ac$/f+KvW;vjjNA{O #\k4zcM&Kq q>EDLLf4r} U0 I7j1}*gA'$%3i`Onj6V}֤ ,R{u3æMn B&t۔"t~JjBĒ~b"e@Tp12E\x;>s,w@7%z⍗P…1q2wyJxGX٩DL8%K 8vC:郼x52!@|Sء WZ1৐!7c`O.s 8lcゃq8,Lsv7PKHWtCz-``"ۈD5pKdǞ\T~βt᡹5>wѩ61CyPsWGVwNJNƯ>x<~fPS<,/f"Å~K GmR4%+A aS y*4ڭ:*M+ڣA͔kUx/"@ o76it;c2K0  tbތĮ-* l:R]PGÄd: =^oÛۡ9~)1T/]zo[Â޺LOp=x9sbJ=l-Jm.A°S($2l57`Ofj I8;OŖ85Ac eXԕϞڦzh|U (xU^M^xJOɜ+2".mIr՝pV-V b4z b8=[NH1|Mz!PRI̖uЅ\\:IGMLh׺:&9)Z"j"M,Hǥ.VҠN$'8P<,: c P'%P<,ӢA,`V=pJ]?}鈣(c~Ĝ(ry駍0zv[jxIrp `w%A/:o&WHQAlQc@QlG&>=ҩDM,]qOu]T_{Oő]Uw}FsHBBΑ,jF\15جcdo'1B8Y? ͷ1hW=KJWU^z7wsbzhIL)`V"kgQ~V% \oۇZ}`5-O .ٴs7ʛzg[{_9=А?$bP M-qխyy~Cwū,3s3gi[eF=v-LS֪}0J ~jW谎eبq8dΠ}};1u~ ({3\@HʥLfaǭ,b70,cAnHԽlb'zU:+( ^>Bv-bC2D}&-AP^3kb`b~= 蕑Tw49zV u D}GVl&1.Dx3P@VAkϐjYZ<6M eѢ򜣯~\ԉy+ZBa ؘמ(ǖ+KȋxDo1hb^ږZ({U#3D':bN1,chn9I>EY530N,0UE߮o88rMv6M-ZP77n:lofNs=0_Yirzm 1)nDSϤYi)-%I ь%$&LI`:cK+`DUu"LN+l]6֦5 xrFzA ezv`K89Z,VCB]E˞O}0?34|B0T*s][K*+&. LRUTdKLLւ >#.' xWKبq( SAwFι*nWigƗbґzB0vϟ324>-.k!':^KvydA.#D6~&g[2q:q2yWB%c%3s$dZtV"KS[ (+-Le4z5GJ8S g_X>1 rK] q{=[t>ysx/?vwYY`E;X+~°|?w]#'2vvaF:lv'=Wm d (I3L%KNYE8c@,![M䊫N"fjEcDּZ*ċtAR+c*F>OPZi$Nn.6bM<+z| 9AGNk\CZύ>]R莩d]΂%7e,Tf=]1㑽Я:'ߜGBwsIx 5Hɺ C}AKߣgh-N)'B# F [#."Ay[_*N^-m?W=a;⣷T VF=~+G4ƣ!J[ "U^빸d%4^΃;HNQAERԷ]2Mc %(b)vewu\_xyr sX; e"glҦhɉ!)`[y`0a~~'tV0|a|"p,R":J/)5s=k kg6ܜ&ӵg+fi|uP~~.G 0WR:$?r0as'i!"9a~~r~'l(7`b]e6'yKM7SkZX 洞W6JgsA$^y/[-B)61NN)'- CRd JODTƼ1~G(tNז| V My` \&y}26E-*wV:9wNEEFLXybjKTDEh7M\\%/n6~n1.ޘOtƖS5?i~ZE!&ws^hA?WݽIWͪkyFUIʴV[ݻ׾ֺ`-E%=е dC}RSS^Q4Ⅹ5LG>6Nų.f*kp`=HN;Ab c_YOv $tU!6WN@k}3S[l!tGK"|@>rg[U5pleSTgW{;l|oŲ^9lBԡ6i GS%m(qLTڪaF;XKЈNygV3_&KsEƸ?ȓEtLqi#O{{EeW|'丷4nhb?4r|u^sVh7ɷ戫CD!Yz=^E,MJB, P]  c+>J׃Rށ`&܇6>?OA?G' _`}8Yǿ??|zhl?< d)JTe3>K圵܋o<>6uo iԽЂ[rؑLNSk=w#WIIw$I.MHaRV`Դh>Ltm'{t??;c7`2Z2:Lr%YowԻ{۩ ϳZ:[Xs\9n=Q޺;#ܷwlAZAKBiXTT$KC>= :Y7HUD2W! UƈUd&ܤ,J9de*&֡l Q"6 +&4Ua3q4Ua+gbv3A 1J* +^,70aN k$&IuzSa L.㶪}ѩݥFBwZHd")"T&V jߏ!D@B RT) A7Ӹ$R5ƗJD2pE t# w ,懺nomYMbQaM`oM>qnGH`8ؽ9V[bnuEr=,6 bnGѢG;eۂݍP,  vBM̅6NZnH#V>7lvd?El  9 ꏴh vIi›|o >L~X*4JSд4 ИZ#4N9VB-4x&v~+)nSh=4c7ŠƋ-L(oB74a{X[`gDll"V7æ`w"m7uۛHnaߍhtnʡa~懺B jfZh4HpsP\$p}݅fC.@[A1hRQh#DmH삂-[U4 _Shc>p.J AJ˭VkMs#}_֑;p{k'-C!`%۰Jf&ԭBU_!L|7^ܰZZ]p)VZ)@Mďiq<@PaM&r9 ̱C 'A_*% DZlBݭ[7(w'CRQA#r#,9KZ%O_evaa0N^;aZcR~WO˄>M>XLcc%fH^zs_Xix<${8 ;$s[sBGek^k. 3:]G.YØA'ࡍ˄lQvA ]\X?: [Zm^ſ xXB Qz5I&E5k֮~ oݾ{7$Zru!%f$`K}Ʌ#> Qnn$>A5AP -'~Er7{n8L#bAtLsy_bDžD endstream endobj 916 0 obj <> stream xߟx@6^ endstream endobj 858 0 obj <> stream xڵZms_qbG&vt28vn$p-]dNRCm,#k w8`xvCt1r7}jx#J8 9F k/66ΠNJjxoh!τF+VKOhm:` v0:;+=nP㠯sE@ 2x"2MP7xcF:ZHtR20H`v(i tw8Y%EP>84f!9x0I ^9 @U-nZ@XW7`/ko*;롶^y@=AC(f+!Hc)i0nx@j,ưl`836{8+fnnt̔`8@ -Ȋ@`'ӆg$IX9>bD[D$ zGH, I! 2`W" păp6b$੡B +'a d y%`86pY|] 7jlV {q6@Jh$+ htPz0`@oas7a>*x(x1' KFR4*dg'pP- |B jDVVъ91|YZEH mk/ -~s^\uK8BytȟE7[X$/Nc aI@J q$j mj%hPȲCRh½@=8>j*LpR !TKwT[h] 7 UK Zy.\\ܖvF`4r[b9%b˝6=ru=6Z**IjYN[rW`92\[D P+=cR=\ xaj ǾZExٽo"s!y[+@G@9dzKw̮nn K ;Isd7wYyO˒JAG_J.xf}ơ@P~,BZ?,!Z Q!G,&b.;G2;#Sǂ[))Hj t-s2E}2a1N%Sk_ku<0"pRYNkOe9OrbEZ/< zYoYʞ윥f2}AŤe_tmrE}֕ZĬt[*&- |,&-{9>J_RYH^=Tb/b'6yف"'/r(vKބ y `r ZBeC*$/D%GTM%؂_-rǾ A%>OK_EW+b[+ 1Z8st*EP۽ T-EN7xSfZx`REFxMAJ2^-X|^T}Cq8|WK(UX'-)\<k{,=rB̊ZB8D̋k<씬Jl ?j !TK_Y/xW1/[g^Fh֊uw=.k>N^3gG.jxtnrOxt9]v..x~f-ןţ_;飞Fǽ|v6Yuj?Q;{܏=|/6M|~ݍ/Wfi]s jr;{4(Y?l7h+.>\Ƀч2>XN?Mq&/&.u\<9= YTu˫r7fU7j88I52z>*7Xu8 v;/ľ'_Nv6{9@ 5K,aas˛7"6#`6h<a: #JDOjfGq%7ѵ<:aV!Wh,uٚiaMjݘOr :!{9 unn>Ϸ. -Y#oMKaCI?Vd0)P@*r@@Ys)idmz .Q[9amj+2]H_ãl%dNs^S0If!ṵSK ҽ\@C#HJNeING &hF<{QU9!9@+٘&&I̒(J#șA)oj(-A{'dpY0V[GY^l^ݓ_d6*0_LŗGϯ.tv54]}yan?RyltчtAfrzpnCN|fb[\6ubIC*lq^WvcmUMfe hkG La.MX/dnGs!F.7VX{-<<QqBf+E. η^ RK9$˽u&a9_ 3E1][jEcْeA\VC[LU<g7nȱ4Ը&JQV0I@{#4*ɡ++iN1.WҳUJi'4Uoe2@44w69d[":|o^_j'/oGt, Fu=Ht c\(R(<@~k]{ɪP 6d^ [ˈ2WCĤDN_>4}2TSbE^t"clIW"Cۋ  <b#}GGWݯ61y:xo6i3Z}L+A=Ɣ˜f3:'6z׿}C)a@wOe2¸8-p(6]/Size 918/W[1 3 2]/Filter/FlateDecode/Length 2159>> stream x5wlUYaL{a0˘M H# aa&iQhըj5MDU*Is+sYss_28;5|\!璝tNӄ׉4Ҋ/•t&a>̏ Xb1,XKb),e,k`eeܟZYMY$d+k(9rme-eӯBY*A+(b7J9&Q~VJ*ke3eT8>PKٱA*mMRS6'VvPH)׭J&REVvQvHM^Kj1kRVPHm>W_^.u7(ԾVQޔW7)7FNrrH*g 4iC#ҌVޢն6嘔aqi+G('srJڐQii[vqYi|<rrQ:i=h8M,;+ҹVPJS/]*et#朧ܔnrrKn]JF+)w$]ܗ>j2u|By(}sUc/~VbmCs+S$_S"VnPWrOz-JA[ɥ/knSȗjJQJYVPW?w)UWYG)!_kRkJi&RFv+([ߵR^>uV^Q+&zEE$?OIJD"?6J|v\QOJ~J Ԕ_pJAJ-e[)D'f”[)Bi(%F;Y)Fi,VSk%LVJPZȟa$VJQZ_EiJk[VP?dJ;ӭtu9,??"(cV*Q:YJ wTtJJwRCVQz+ރ)}R().5)ܣv*{G3S.b'lݰǾCpNL8g(ZվLEF8WѦyn۞ 8OԼ]9P׉վR/ʼnk}=ysцR endstream endobj startxref 314071 %%EOF instead-3.2.1/doc/stead3.tex0000644000175000017500000000257413267071773014663 0ustar peterpeter\documentclass[12pt,]{book} \usepackage{cmap} \usepackage[T2A]{fontenc} \usepackage[english,russian]{babel} \usepackage{indentfirst} % \usepackage[russian]{datetime} \usepackage{upquote} \usepackage{ifxetex,ifluatex} \usepackage{fixltx2e} % provides \textsubscript \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex % \usepackage[utf8]{inputenc} \else % if luatex or xelatex \usepackage{fontspec} \ifxetex \usepackage{xltxtra,xunicode} \fi \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase} \newcommand{\euro}{€} \setmainfont{Verdana} \setsansfont{Verdana} \setmonofont{Liberation Mono} \fi \ifxetex \usepackage[setpagesize=false, % page size defined by xetex unicode=false, % unicode breaks when used with xetex xetex]{hyperref} \else \usepackage[unicode=true]{hyperref} \fi \hypersetup{breaklinks=true, bookmarks=true, pdfauthor={}, pdftitle={STEAD3}, colorlinks=true, urlcolor=blue, linkcolor=magenta, pdfborder={0 0 0}} \usepackage{tocstyle} \setcounter{tocdepth}{3} \setcounter{secnumdepth}{3} \title{STEAD3} \author{Петр Косых} \date{\today} \sloppy \begin{document} \maketitle { \hypersetup{linkcolor=black} \renewcommand{\contentsname}{Оглавление} \tableofcontents \clearpage } \input{stead3-manual.tex} \end{document} instead-3.2.1/doc/CMakeLists.txt0000644000175000017500000000167713267071773015521 0ustar peterpeterSET(DOC_FILES ) SET(GENERATED_DOC_FILES stead3.pdf modules3.pdf instead.txt ) FOREACH(FILE ${GENERATED_DOC_FILES}) IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}) SET(DOC_FILES ${DOC_FILES} ${FILE}) ELSE(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}) SET(MISSING_FILES ${MISSING_FILES} ${FILE}) ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}) ENDFOREACH(FILE ${GENERATED_DOC_FILES}) IF(NOT "${MISSING_FILES}" STREQUAL "") MESSAGE(WARNING "This distribution lacks some documentation files: ${MISSING_FILES}. These may be generated (network access and additional tools required, see doc/makepdfs), or you may use instead source tarball from sourceforge which has these files included") ENDIF(NOT "${MISSING_FILES}" STREQUAL "") IF(SYSTEMWIDE) INSTALL(FILES ${DOC_FILES} DESTINATION ${DOCDIR}) INSTALL(FILES instead.6 DESTINATION ${MANDIR}/man6) ELSEIF(STANDALONE) INSTALL(FILES ${DOC_FILES} DESTINATION ${STANDALONEDIR}/doc) ENDIF(SYSTEMWIDE) instead-3.2.1/doc/Makefile0000644000175000017500000000167513267071773014417 0ustar peterpeterinclude ../Rules.make include ../config.make all: clean: rm -f *.aux *.log *.out *.toc stead3-manual.tex modules3-manual.tex rm -f *.pdf instead.txt stead3-manual.tex: stead3.md multimarkdown stead3.md -t latex -o stead3-manual.tex stead3.pdf: stead3.tex stead3-manual.tex xelatex stead3.tex xelatex stead3.tex xelatex stead3.tex modules3-manual.tex: modules3.md multimarkdown modules3.md -t latex -o modules3-manual.tex modules3.pdf: modules3.tex modules3-manual.tex xelatex modules3.tex xelatex modules3.tex xelatex modules3.tex pdf: stead3.pdf modules3.pdf rm -f *.aux *.log *.out *.toc stead3-manual.tex modules3-manual.tex man: man ./instead.6 | col -b > instead.txt docs: man pdf install: $(INSTALLD) $(DESTDIR)$(DOCPATH) -$(INSTALL) instead.txt *.pdf $(DESTDIR)$(DOCPATH) $(INSTALLD) $(DESTDIR)$(MANPATH) $(INSTALL) *.6 $(DESTDIR)$(MANPATH) uninstall: $(RM) -rf $(DESTDIR)$(DOCPATH) $(RM) $(DESTDIR)$(MANPATH)/instead.* instead-3.2.1/doc/modules3.pdf0000644000175000017500000027012013267072003015161 0ustar peterpeter%PDF-1.5 % 6 0 obj <> stream xM=nC!b/Y'"]$(-w)|&Yy D9 8UnAj ,oHo!SE*)3O.$lGQCsc_rib۪7F9YCm’Y\JrlM > o q\ju1ۭ,Y( Wd>wzdP endstream endobj 10 0 obj <> stream xS(T0T0BCs# 2PHUp Qw3T3117QIS0337P56ԳPI1004 Rp Q( endstream endobj 24 0 obj <> stream x;0 $$pP7V[6PĂH&e}CCCWHpgs!X]0{0D?>e A*7Q$ T>~nԊNgJ¨0 @GQ&Nқ!$y!K+bJDƼm \Vxȁ&)\d Ǥb%HH =MARd?}HcNhäŶyɆJ޼8TEt3ylf_35|3j? endstream endobj 29 0 obj <> stream xM1@ {^b]FB)"AAQ!oX-F/SX ^8Z"f4M1ݎ"j=.F,9'W"DO<>=# ! endstream endobj 34 0 obj <> stream xڕX6!E ]B.E 3PLyyP aϏ/=0a`pShFgP2gIA5(;a2t`xE-~a|ȸLeF?~!jfmnG&Vf+(KO9~$Q"4 YteWMIB eRD]w=:Щ4J},MŅj2\n.у;-w$ttsR?\.Jh,ew52urT6Ґ ODAPеIr$ɒ~{bGB+$]H̹] '&C$FRUHSї;D.Ih>˙sRԓ4EجoؿpDArj \FޜIT~.+""X5֓H:)qُ5x&6}ү1FlfJ)"ר9O 4=R5BlzBk_[P9&Lwm)D?rތC(MR)|wAjfKѽ^wa*ZfJκI8/TX"Xkm0QW.)>ieKRou:;5[?UUTΜ(Ov}wzU1pߥ*"k<Tv}V =d^n6ױ`?cH(gFcfcpX|`#V( YKO3C6=b^nR!Zd[2PvNA?)s+SBCI4$zzKayT0=ʞq.C[gj;;*"+ִ20sms_r^RWof91h1G55|mtO`F\p츪ՃX>Q`!J0ٜ4ݩ5 aimJ6}V 4 =&*ꀺ o$-rhZkV-?(w lmҕW4Y~~FmazX?lOu#ܹ>xXV A 0-פG9+Ҏ*{?Ni endstream endobj 37 0 obj <> stream xM!D{b~e9Ca S+baؗ!7£ȁ#XVgc#ϩR^.O 9dI~vcYM:huY^$q0. t-, a/ip}+ endstream endobj 40 0 obj <> stream xڕY6 ~,`E7x؞ v$Iq;ɕf~~tc]Ncp<|?gqf.R_<j Qe* vBz 2iEHHE ?\b]NB < W4*KJTx7*>r'\_Od՚ڍ9a;a-;eDU(f T^i6?RYUMV1y:tEh QNX)tAS-Α a)W0&0VY𩯆aBNhݩT$;j 1KJй-, ִBfߍVqըxʘ5BZŹ7Cw%ݭ)yv0$|%ޙΓޏ%akNH-4rx\ c`CӢJOOJ]2?)ETpMW{>RD~o]%t=8yD!Yޚ m}C JLJ۶YeR5jAJ;SvC!!Jhd FYdmnnz?׃ H VxÑJ5Q|9DVVhJgۯ%e7p&)r$Q ZkzkI"!^U׫ Mq)I4/AA9'%:o%]:>5/DZR9HL˩ Ly|{Qx+ щ/5ʗ~A\ updl=ܟ{IĈK's~R>&~x<;T$՞N:?N Βp8$@dI2,tP@zCwD*p{#W lo\iޛAڙҗ=R&)ψB }SAt? ALn:e=%Y {@1݌[fwhsv0|8x>K]-$ <_yMM "])'Fo}w 7.*H_4]1-iԙׅ߶)$}98L җWtm8,GyiPgp'~.*EX2y46sY_[r endstream endobj 43 0 obj <> stream x}U0 .PVtpx_JRL$ <|?9t@?t}?S%2N%Ww 87$`0@T}"y pWZ -|As#=#bCU~2),:!F{v@FĆblY-JZrWdzoxZyjyXn6x|fq~aSM.I]0RU5XEy27 MN[(N4ɷ8YPBEY.Iu"vY.۴LԤpҹoGeKר&EHɁyRl^MC]j^O|Sڨz]{艹H3Qc_⎾gԩ5;wtVÎo}@zWJvzIsuԋ̃ x 4gCAq&J(3qmEMypc*F0Esz!=֦G$%7af<NwC'm,Z%|Ffm<;2t$eUxL鼧? endstream endobj 46 0 obj <> stream xڕW8 )Pe@07v ;\8vŽs$q25HǏs?%O[~u^/߹yu8az8@ 0s>2Gb ͤwVx=rN x7.IyR>k]_٩eJwv#::&S%:U%1=>{#ݼ5L҃a-gp·z{V}1.qx,DңJ5m4SL­̨d<{!QKdXNj>L΢G4A, ~Եт+YXkI49fYV*mٵNJ1̆q0T)aL ,>xuTM Nnɒ6V Wo6NVaH!r{5 cl/Y߷se*(L Oliw>B];Y(S%kޑgۇ1QؖJҥ?D nkMA\R|A.i;Л ź3tS= ~-= -딑X;s\xz@_kqR藕W}tWE7=&zrH[9?G}+s[WoCI-`}|r&ZMBwj7qy2`.`I8u+ #mE(2c6rcԞO|}34[gfXd*S(RRR &xMO.cFO6ѓ˓B$#y|SH3nJWDIʂ> Q:Ĥ}{֛Xƭ]rr8Y8 5kDv !0:i{GI4AˡSBNfRqv2x*43n"Us?0˦@J!JKt: 63 FCA޵ I,ѓUKU.+Y~|/˓I6J>ka(F؎|>ConfL9CC=Jcua\̽?-^_~e/z"nY<Į4A/ endstream endobj 49 0 obj <> stream xX7 ;&`"] bw 4]Hƽ4I~t` B7|~vb{s!u}Ju5+atVE;LSvb=@ ?.,͙hr#?# i֨a *_l<*:FQr-;r&zv<>X_=n:=HGgj(IOә\bX :B3v̪E{c\mImfQ T:@}.ӽIMQDYXdF,$;ĝw|1@KkC@,/ԧ\ծ]Hk$F܋0Pgd*H U(oJC'06sjMMT/٦A؁v̺:.,a"_L`J80-dhzv })bҧa-<}L$3.H3=Tӝ:싿]oeqa-v#,]r*z7x?ZLJ)*dW(z=Vg:B42pt2+EPXRdɫka;032!ت]Ʋ)H8IoVJԷ2-o /ux=hOwP\ g! EIU}XW^<9[t|1\VpT~[ZЎdKN\&TS>M-O|k@5UUx¸\G넀l[.߉ endstream endobj 52 0 obj <> stream xW6 iA=qb̸ˤeKo EJ7)RevH<C`?fHaX~ ~`&Lنa4N~_<Bgu\LqIfGd* Iѐ-~|H>0z7a4+ B_Nm/е,߳emfiw̫U$s%*`'ED6ۘ>M z4I< Bl(ѱhuk@b,^/5 Odrx~@&'@z֖W tTI\|Aӯ͵׭+OuJB< bԐ@M{t֯NUyɊ5fHmvľ2+G k6.z^Bv!^+V;7YK] Ub9 LR0IH*n`A"/v6_r2R:Ho{4wQ͞0d̋^c8tRt`TY/6+]J# ܴ1˻ΊR W-} V=Jx(31F"JW+?kA3L۸1OV[~܍ 9sWR7*}}2p4A;R}%78pDo;yI(!GcGv."z2x\v]y:G]#wj@tkD5#޲J0/VdyPD[-"xg7ǷLwZtxxcS57sYsTY4;m`QC'si:,wfwwJkCimU% ϒ%-c9rE8cd\vueFXӅíi;ZB xjw5pHk/pۧk[Lӧזω39&aU |3$Ȏez8(CO,~=Ϩ;fyU!4l^??'sN.h1P-d:)o \ endstream endobj 55 0 obj <> stream xڭX6+$Ň,po.vA Y&yClH+H&yrg?;$fX~~iѲʃ\lD.5_way%kB'ktrx%^p2-u X{$X llf6ʭbɗ\UpwʮCo+j2LJlPNd ר@~3`-PNÒ)3AWxBeC]$Lcr,u`QqŢ\ X`# :؄gQ+ +u$!Ǯi83KȾ8+V/SM]b0kO58aDLE *,t.Y؜ngmHYbޑl xKYGz/ˑVvc.Novt8uفI],Bm_  3;<+b=y6)."l@U<+yG2E}9oSr|1)(#1R-]yڻ%|/u-+0JVCTɈuxwXyi8#QJߚ8^P5C]?89+6EӉVSSg׆PDq0kʈ hbwVb5&yVvU?>Z)C 0x̉]LZ6Nn YTYMHYaFjធwk1I>(HHh'f .B3 cz3LnPy_EU|Y7 ,3ZƮ5 $2q [v 64eFMO蔧ѦN݂ /c$E+uid8&U&Juux@[M@-. a  pÖgr9+W}:W miZZt@G9| N<4]=rfC<-gGvR3DZq<7fOXlSy=N9ϫ~6+&|¯.#Qcg˵#>ALevYNK(I_A^PuAuq\ܵBau )wn\-'fEݎʌ ?iN/t, >P\F>м'ux,UQ,)L}/W\`:D}Xs:ϋE*FbI"X]־aW_L:c V 0N`HGEr$CS{\2>NaG;֮Q;̳(Ĺ,Ft ИX2A K ᩢ]w][eP}zm"?ѥRXؙ]J?Lu"m[3^sm܏*ePQbm /_#d endstream endobj 58 0 obj <> stream xXK6 @yHkЋEvzdfoB,Uu`Fp٢?⣨pS"'M>2}>&tBn}_A汖y<`O=aQm W%ĉ䫺/sHM*+Z;[䷂A+b?T G=<yxI:+JtaR=Y^Aox3?EZdzMzUduCpz)`G˽"=fR0i63}4ٯoey~BGӯ#f/gx+p|2C"(E>)k^K;RkNYT@v'KK֘ðA⩐ v{*kйxҪ_L jeXSJiGJXїfE8Wp}5ш$;))(Y>K{Yr@[;[*&mc 72پ\NfPY6lpiGpT!?NCW}?߫MEuW4 eg8t"^/`joUh\s蠝ױMV!4﵇FmGCiѶ&`u۳&h%ssCy*R?#H{0-}5ƁhmV_i;ʳ UMAOSe~sؼ)"&Rʙa;/CgtjbvdY MBvhG5% ʖE6v!+6KKxR> stream xX6 +HSHt Rزݥ7!E p^–DQ<$zjH އ_~C vcp1zuUJ[p*N#YQoһ2v1N E.Aۡ1 (>Y\&8ӻG J@ݡ kmw+cjn PW"5h%T=$^I240zhza/m%&G}78sbKB6/~{ѢjE!P(6`[[lbn) I^bԇNr^&}@P7$A BL,$Be:V[W\ _/gKBG1~ɪu1*yRSy+)I})UʼW:{Ii92I/jxoO^;ʥ_IMlp[u|O l#|!/r=5lm MZyf>ۖGBi_՝k]Z-Uux0Fc5HÃnP(zFQTX~h^'#V4Zx5Ֆ`Jk'\\9¼4fBϥ,1( nLUG!TKAs $A }d ] қ/v)eXʣtibv+HvF)V`7p5@.YLSR;Z||-:z"|\?ʍS-GH)rlA!0B%eJ\; pWuץ7P i<'YmɁ`ݴhj[@$k}7I3Oіᓹ'f>.kh'&Fw ft9ϹQUuYlK42=PH+Hz/v$+Yzp#W 6^6RCRثOZ969jw1w\$s[h݁,.j'RISݗ5xp|7;~$D^o^l"Em>:ޗg zk߃_$>ZccޕV?jNE endstream endobj 64 0 obj <> stream xڭW6 ~6@;t+p/֡ᅯ(KJQ#ĖxHtOv?t/Ͽa7E}omBna?h _}xDoAoq##6_@;&?X@kw *EA\.(:Y-"13OUQ/ 1f'HaGk#np@F08/-hA%7k,û^O*ށTC+kgPZֲ \rgOkʹ0b.l -Ɩ)y)F#* I7]K`ᬁ7bwșpoxOVnb2P–pS¾Uҳ:ҙ0F1ON߄!&1)ߺK1)pK}2hzpɒi!uڲr*I%`_T1sAXpL ^VE'њL;:g-Cqz9 %-^KY/D Zo񱖜k%gխ6 Lf*?Q^A3IKYrP&1!rЦW4atT fDl .yadS3`J=mn/za0?K I2~4(]ŻPB^axi|f$$Yc6qo}۟_. ж>Dk|ݖ\=)̥B51d]<;iO 6 ' l?|KUqLX cV y,R7@Ip e٘jaVpVSq܄aRS{6sV/lɘs1kbClt|Ա*Ӝ(i`X@ 4ۡG{֦Rv[ /x9+7s1D rGʎnL~H ۰X>)yT)܈I1UX}D,NND5Ix`xeF|лr7opxA9a8ZvAtE^T|Y?$P ֞~]2B<Dݡ}ShmW"ҟ&E5G^JB(0jBx uW:/VPXA{! O_ endstream endobj 67 0 obj <> stream xڝU91 s ]`&B-@"@R .H1~7!%R#6!YH=揱cMrg5e!sLsL9H)A#תh.`7Ok&Yx=M-$4%𤷹]o+U۹a &!E?G -@ @'t`Aot9!+V밉Z UAL ɪ/zl\*bۍ!p(#64\gLk$MsL.;م$&XJr5ӊK|"|W`.$Gq~}$͗ CN,:$2柏{ge z^gmƆ @v5V޵l~,'b,A uִ2`m L8Ӎ՗i% }3c(l'6j̉J4&uOS-heECA-#4Jߥ*Nf,RN&n?6=^9K& B}6Y=0$z> q=k&Um]MH֙7ugP[OJ߁ȼsYy&$j$GP>V>('wi=w7*E~ 5 endstream endobj 71 0 obj <> stream xX;F+Xƅ3o@Pa ..HAN&3 Jy~pC$e%}` 5)3-$~򾜬3_/ؓcU3?T00kwRQᨔP(/RMT}{#kY3Ov+k} EN=-j'ͧ:.߀n m'ď'6zY('v f9c#;Q)&GI;51Egv|Px:Ny,T`32T-LQu ϨpWʇ@Q5yM !m>k/ATfȼDQ9HTT97HJ8\*PᝲDSR]c'Ylh:alZ` 0"7؂,r`7 --Wy09mK b4ʚ1r(笠ޕP õ.ʽ}vjPNԵZZ[xx3qD5i6\zQ20EDh=w^KnYqa~Mn(kȪ!& &wvZ]DGLAe__>Nl|]KTD*k^ 䁦ܢJ/Α%(g0[0P1_rA1:L~; \~{ O ~ >)xp"vaXOÑY0/ n8Ӻ滭F d Z038xZNxj4 ${tכblIl(A| 񝃇CpgwO2`ur<:IEjU[|y kdpcٵV#ƛ],vw~Unknmx!fΚ v*ۆmKDw+WOm`2w|U(T$llzyHN ~[x =|m'Vxp `+2/tR endstream endobj 74 0 obj <> stream xڭX6;C$p`. e[]y%MR&<3C  C=t9!u+<;< $|럷H7 y2ax;S =-/|pbDO4f p$s])A/ZIBdۻMt tҟKM;rbaqy:U_RE t + )w.4|R {]ý_ P|y/8&e sҍQCÆI*(K̽! j$$DN4l^R1L|VIrޙKAQ썦KVTd1T&7aP$^PO$-!MJC5*٨r[qU3TF48ƦkVPPĢ5#'#Wyf>od9j4K(5 N&dljg"&C(Vܪɰs{%1}3E &weEZ6ٵP 8MoQ2)0Y̠ѳZz> stream xڍW6 %eIrt RxRP|H;wkxlyD@8́a;9,c\B>X<\0ND?>_78A?.S+|If/ Nͤ@tERxsTb;|B6g nӄR .Ba =Fcs-%#,O8G5|1pX ju7PZGO$E)N¢B\*׮1Mڬҁ4D/=F+Vl-@H8j|%tk55Nz+iZbbRLAMAVS+ﴩzZL= YmpSuV -fCv:v>Yʙӆ.q ߤ>uU6sgnq̇j}X~-K_σzvXRעj LeJz2N,qIGqpYU^`zJ, fgJ!y,W9!K&&*+v-t-!0[Y2O"1 j) ƍ~/PϊZ T]A1 \_ xcR"&PDljYDJ6׾"@lok hMe\ ZMVe|4' ijqs*␹ ?˩ }P *BUV1oARC .m D!Q=/"y_ ˚gC'L%N4'bNK %HhdmtOq ̧Zc7J[?|G)^f=2 f݈b<)A6otްeɷxṠv &E/τc8Pۘ[;8Sy\Q1_FݢRw4nww;DR^1[lbK1hq:=?uPJ:hl[<îoKJ6$B!^5 {4;,rUֵ}}#L:9>N7؈Pqw>q9ۈ7 dXj߫\?eX8c-pp3у7LBc&og$|8QZqkvY2#ptGwn> stream xn6WF-L [l]BgE;)J֌lB&ߍm ئskGG76.4klۥy}1y7FXw] 2z>n>Z0[g<,Yp 7Χk J,I @.Z1㖌8k KRh F ;Q'Zc9I@'&d&V =[ aٲ`5fwZd '㒐cͅkI۩ ADuW6okqR]IUDW;.i3%B$C9> stream x6W /I.$E,u7dya E\?tˏ{ݷu7p8"ͷ6v щӎ@#O$ba)WJ(.uswõI1z#K$FZEZ rmEf7(o7 7Mn.pn)a-2\Vt!#zH 0oQ/-zd t["|}Q@Ŧmp^] plbƓIh532PLRüo S(lAc$< zB0|*|$-/d ]1ȍO>)uG.iLʱ3chP+>AΡԇiGit!hш@#)Gc0IMIa]3/*;~OJI <贊DP.\J0v2J}eQD31SX[B3WUa ʊՉ [%S^/|_N4` c#!658\w)CFHY/{0 zX^kYr_X* [z 阩|ק3{V{PnŝDŽwQggvZvgS2eE I :sI8(r9PwH Ӥ|p}yaiWTbGIwR?<&B0zgfDE*ۤYlŒTAn+g3!\SJ6jӐ1iX`\K4xﱑ=+3mE'ZZ@ؔ0'}:+=-["mxQ) ft,ٚ ENFg2}aTsF/sD=ahe947AW]l܌km}XۊI+ 9mPYKip'eK.B i"*a2GoJ}ظ|,*=q'~|5 LM1*V\Tښ.aR?UP**7KlJy=+CXZEp>5 UP lZ g 푞FH틕?'+3Z'Ǧ_ZӨiqCG H%:-=}Hl)ОVFO̻TU'2MiYŦ15i2oüܙVyxUE+ݒzg2R@{'I}2phMݓ}89(EDh;X=J0˗I`30WӅU.v.Mi%T;Pl޷)*vuեJ4GDr%fRAӹZX3bo+*4p~Qnڜvf42޶ endstream endobj 86 0 obj <> stream xV0 qH L1RIx, K#x՟+?՗sW]\pyCVuV瑈=ەaJr|g+VV`=ŧC +rs%2lNnB(ό )^|='ǝ+lM-pաuczYؗsĴ {`lX@IV / AxRWFuo8d_uN8ԝ֡3J a;#)3$;4:YeoŮ< ˩Ҩ[k$̹ 2 3>HzmG߳E4̋_yId"ʨ.lmi|4a&3jaIU(мM+(1'Pmçh%gd߅œ:L˩.g)(&l֢I@JT*R>;̢X,%QC䡑]Dnɐpya =HS;nZڥ#N8V[>)h iu<@m!ͬ؝2q$xGedtvĒg,d=1y}jzTYGwSF ifKAf҈)[4hRzP%+AI 2(z -i͐NgO3*WoI7W.E,:i\uS`§'rӋ{789As^EPVU{lU|q˳qx #&;8=paIӫDۃ&!}D<)2~L>?޶#-堓+ԋ]Tv a rGveݽ4k1oI>~| c endstream endobj 92 0 obj <> stream xڥYI4+:wG `nCz{>:N:Ќ\*7xaKp nuxfG@xw82g)z4ӿ5P޷O %)="7jEǚØC9CPqWπWg5ȻP.L5;# EeLtmPY6fO:egCgLz4)Z)[-1oG'َz/AtAIހF5$$!IU2}7^umpQI*+ wքW 0\D/eDq,to\t3@ØJƈ,򔞙n@8G^wY,4-0{[3̒-Ln!BɳV)w$Xޔejwv;O,Fe/x=:ZXqi1BbsUd[/q ;R.KUyr%T]kzGF a#EFY{y?pdyı+zLk"32s͖UN:k[ar+aHñsҀ74-y4/g^uu':/ (:ų%gpj:R'FJڤe&U;s jWjSghB &9ݨ OŖ _vWcjPMK5+7!,w/[L^+nUO[xĮZV2TžGCN a5&\#>ja[ܲyqqQټ{Ba&]/??󨔫%Si8`I`N%_>t6gVazQx@zylBz {[n[blj$ 0hCVq#{?!0o;UShǷ͂SH֔t Nmi2{8|:FL8ͭU) 1EƯ"slۀ~[\dt]V5i3.p8aHɆ J--im_,|Ɇ^!78 E IߌMqk;nU{G-unZԪXEm(} }orlhMef~qVuU)Mh B]Ͷl;zXoimQx֤Ƨ*lp~i`^:׽W.v9|@4gr; }MBpp !-"4tsޤжm;mso1ðFIޣ ]epdh͒Y&)59ʧLw|8fg3xDГߗݭYM-T|816YؾuR"=Vyꈡna8w%wG+pN1歃C <:T}4J/zp(/j m?Uغu\~oUWT e{t; 5 oNQp }p}VX9]̓I`΅zCmܯ8O| yˇ1:I/>vGZ` 4m "Z.r.J^k1lsѭܻ:{ToWM _ ~Y^9:|]uʠMu)⫴?8i(c-~ Ģ.8, #g l[ijĠ' &Wo%/-Y.]ZY˻T-TE*'[t?(ߤK> stream xڝY6 XU"])$R̕ʒcWLù~s/K ]\~CJ%]2Nk4]ݜ@ qebt:ExO,n+[."}6{qG=>:ڌz]Jߣ `nsPCoJ"Ҡ[QK䙟Ӽr 7?"(alF9A{Xn}]Tȧ)7Pc Wcp+"&.TxS!e55utgi ]L[`n^<|{H|MN Pki%6-PKR(H;z%ʖ\O[b73@g 39њB'/VF-|tXzOϳԀu=6_DŽ Fq*lrV./9`w@+NFr##zm+: i#4ez(nb(S3MjDe:ݴٵyhW%rapOs&kRwJZ]Պ\5nknrM<8kfݤwZVUtN]8"-?Ds endstream endobj 98 0 obj <> stream xڽX6 qt[SHt Rxw)MC2=$v H=_Td?} ?b4:7kt 1U)=Kv*|_|*bY#5gEh+Ic폯_3M-h)ނ=L_d⓷Ҩ``=I)7uAyCΈy=u\y.X;:vِ<@ץ%C] 2<x|EI8dt!Qyr@!g39 S:ugόZŨފ4.ww\,s˞=譃r}t|*Ӗxl}dͬX[8ω_seKMxM){9ew¾6<v黢lOc6/3rW8X5qɜp/Zb?'+fc_qʞ*؞zʧGפ_K&@RF'eL9ٍvimԜG]r4/ (YrwT1?{FxLuiuX80b XMKt~ eMH8*0F7=_lJd}5\MۖGO+~j܊/3f$t|-F =`"=Vׯ,ޝ8҂3@H(QdT܅Nb#fbNWIP:#Iڢ(*V:4YI]E/o.E%b%tzN1| '~S?IquZ(V/K&N FZUR ~Hjnos 1*grQ2Qa U'6kzƇ's7JopnÀ=(!hm:8[<6s?j8ΩrFQU]{7:4=7\ӦIŽU%]Ó)6SH=W%hH[QkB3RpT!\AR&T:Nªe#ኂ OQ9PX­"Y2M%t=ġuw| e|go%san1X:ճɜpZ倫33_$;Ӱ+\ )A8c ۊB%r&(e_u sp#%z_%ېs@OK,>j$8KQNQ@Ґ*W3m[T]їbGDuM13z(c2 O2̃jRY}2 J؉idVKɖd:3^wGg9t1˿=>?G/#q˂_6%w9ְI2ޔ+>m7v q#SnixS endstream endobj 101 0 obj <> stream xڝW6+M$Eu)d^o2%%,9C f3Ck> y>㔆3cJ' Nغ80y=c.)3sDp(F(գܓ-"ovpeYQ!+ yD2qrA,B 8?|x* # >$Q$Ip6nVLqLe/u;9όxȮ$_u5Z P$/&9=FrⰑr2,u .IUÃAswY+s#i *语#u=v)H/Al=3 ]>@؇NOb3(8nVX*yRu~ZA|0NUlՆRWj,aLa_z(Ϙ@A(K/r]pwY*j2Ad5&@\*F\X.vngMvG#sOW}nf]"S־Q)JYL 篭B: 7$j P.'qGV'ܚ0U |GԵX#Ԁ(8a\ -}r.UbrsU*v67z5F"u;&HR7X:k4*l#|:!w>ž=NwfiGo5C*Li`7zk};7iZ)AP_kWzntxO%g >a?u~).d#MT6K.E5rKthGm>[|ݙ'`votA1ḻ$g7lUk ^͋3 ]OCI8p_V% n }J0;a»zIl)6|s5֔~<挕4 l #"}# _զ>~(Im3oؗ"dd_w WuD}o˩] )6=1%]&3]SeW ]#x57'Wr ktv-%~6i^ĶӦЪA3YK^2G xf#$ endstream endobj 147 0 obj <> stream xcd`aa`dd w pv445gi2?d~1g{I "_ Hu PX9(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU]B9)槤d`t,<3##K|?{6?TΝ;{"Ǵ r]]6llnni$0c'vNgF 4WΛ3{Tu;{:9['h1wğ鿛ʛH6Oj.3s"_قSM^wTv9.> stream x]ˮ0/6ΌFͥ"t_k5{5FoL֏w7 u k*[}* _KƴH<q\v=]ӟ͗5u"^[Nagz!,t }cơ۩m9}Om=z TƔ4(AhD)ڃE8/(g#&P#2EdODLzbR( B<a<mXEUw}KnD;B^WX @ɫ| !80BSi$#KpA1"ch+[?\:pidƴqzUh+x THZ" @ EGԁSRIØX|f!_tXW=%D$?c^oMK^y:k^C?̧&R endstream endobj 150 0 obj <> stream x]Ao0 |7i$*-Rmzvhb:#6ފ۱~m`ًw557z &B20~uWISXOC84¹BO܇qӷJ@CS3ﷇƱ*a,70f7kpmހoݼmh9}xR(' }jlUMO5WE=92THJ=)%)/9y.OKi\))9DʼnDhM6Dю聨"zDhGTD2%ũ$k|9XJr ,鎕Z>*e 4p\V\8e{(|8֭ endstream endobj 151 0 obj <> stream x]Mo0 [i)q>VRݭוcd!~L6JA 36$m=K^\oYO;n>M(%4x⦷~_{;Z[5O7?8[)֬4B&\CW٦g]X:[}ݟ1\k=?b8 t`=QEqgv]9_Y^|Pթ1 CٜC$ $ )- )]#R"\)tp%w$/J5QQ!M\})ʜo["qN iCTJQWImhʉD޽Z\4II'ږTuJA>S' f6frn)<8aZ 33C5 endstream endobj 152 0 obj <> stream x]ݎ0y _nRlǐDIHݶjvIan@|gcy4c/'Xۙ걟lY_:ɚv ѳUCihOeuƍvAmބ2]+͹+<|;5o>Ʌ>:};g]Xû;{ɚk?mmg.8iiҔpR5v_iMwm}|K$ T2I*AZrІhr%%R#KG"PR~"CA#u"h12r/,=O=ɕ O"_ ڀPڂJPڃJ 2Hd(PAjkk bZ/l}|r$+\ߒBpnjՓ$Ҁg31C?Qti endstream endobj 155 0 obj <> stream x xTE7\Uw龽t'wN YBY ! 6I a 6 .,2 ..3n#6(3FFH|U;==޺u:Uu9un5=˶s8wyc_1wr@O W{~//W,M5|/ JQjHwumth9 ]}EĈh;l_hmKy!̆ޥ:㘆p+`S>R  9KS M#\:.ZNw8k+R9|᫬50?05thzsa!4S( hd-vL<.QE  v;=q0GS`?8 ^y8!E ` v`l$Eda  t@)zLI8Zp!prW Aw }K*p< t” v\} 'r~~+6t5 %&e@7Ĺ9P/7S=|Ʃn)a|go!^$ g0G8kw'+=N6'7-]j9UQVPZC;ZաwI.|ET#ER)#PrV(J^YVD@!ޒaܶ.ܸ.LPPs:tUF?g>`~QI4YBQl"Z7dKZM&m~zf9҈>#r8H%:HlFxAb36D9.>)}ܜxoI8o6`l6_qі+ ch0_~ 0' w[0w.t:,Xjq@xIDx.Ѕwn?wI|E!$i`jj 2e0һ^DYyטOѹoJz7z7mU2Aդs~e0.QVė[ӽ-ENGg\wWfG~T,sc'dhb˭t]RP2vmL[.cXu91!a6CЦ[m,e2Ye)Ge{=AAz=7zyywVfPx0AQ$\+ZZVDŽm17ڠ&4ߜ^vuɖh[7ˮ_q \uv¬*V^Z[_BO{<-nigˬ+399j#s9Ia$Jfj`UHZaH $*VPj;Ѥ97X9 +i5\Q%,2t (W{U-SWg0*<2Z _]rM"tai|2a"O4CZVFW娗/7uV,P!M`[/P$.1}(I) c,(* RE[UY˫˜ɫT^6-02P@3J%JՈq ,!H9!dpХG̶`lh By'ʢ8t$5HԀ2Xh#^K;).gȳ!V+P#t @x {|u M ܾ(h p· T&H Gq uE$z5<$)% [lu|f̓V+奊j]Ԧ0VrYINpOqd%ܘ wAb.\1{ Fnk&x\- 6uڴ6꧉|M wf2*(Uj]dWCZrCRE/fPvt@?Vg~Qb A|sW[2Nyuf=ucmeތίCZek J*٫ e&Viot5j[g[1.1zQv23`Kj:]TjVWWAI&8u=i4NG\2N 8B&b'ǛMEN~N·f| |iwjE_Υ[n>@u??C-WT.|i8<׿"7zR䉞BߐT %q%F4<]y~B/4vtRe粐ZiW"R[\\[Iesi+HXs&9y>,`C| Q\=?>ᶹЪ⪒WWa̢洌tozڪwpYvH_?z1dR--EjiE:#KJTES*!̎iX#Q c Ni4{v=Gz28Г`14z>$uڱMTu|/-vEDws)MO\W^Q3ˑh7+S|OćarA_*Mʼo72aRVIn+lT:jeY* RGURjҒѹ@ǁyz݊>hxS(zՍ?~?i{rOoe-{_^\sXg>b.[8j W0E9wESb\#]c^^2QyLJG)taB۟1%a$n 뭽puZ]iH4r9 ',iN9OT<q؎2Q a4I7㌌G6e!خ7lfe WOt>çwOk2I/ z+0C 񾢡뾄wғ~uEݘlLP fJ:(B6^62R Hg10TA3XxCa0C ƒ"ka,l*ft[FW t3A/IbQʲF4 EbyD6{h+ $ M ۩r,A<39C4=w^,@tyAAX;Ϧ'G@ c^f!_NFkP UÔ`f 5~sBڋmb3t> lRng8_mdG>ް& %tB>"%Fא J OΛ~3;Wv0A6#,{5oΝyaVBSqIO5/48jLuj,RrFƩu@͛aV{!ΐd'&4:X=1q$O3/h1LRs\re3i^`~jkoR^Zhz7Zs 4=u4==N%-ʲe!56m.P ȡ\]C;±}kgC_WגЖ@G5WG^Y_ _̑՟7?mm}{|yQ=Nz ,[~Mo#66<\O l$1/\_ŖIɤhfxɨ ؔ40 ʗ)e2JX b #U+ U sF +q39TdV3C ٢D0[^4S=>H2ArRX9~k[hͶSk9xΜY> %73cvJ539,iI5K3+j7^dt(55L` S)OZ 'q Saؕ7Bi/:EP/0E\Q~9m B+ߦ^MK)/P2[-VuSY0A>/gWNj_Wϙ#JKUJRQ>t9j#跫;): EL4<❤ǵjٷy_6 l?Ztb[iA_* CYvR7dnX8?`5,bY%C) DS pX,. I}zglAa`=R Q9:dT6*ˤbP p6[Ѷ ev*H~hwBO"wq XEi@!YҞZ[wH WO#3?`%(&GփڨM6zW&oe-r꧖$Ch KtҴDQP"dr\XRZ%Hb3nEK bLH:Os B=CN-<Ehfܳi ]ⓔI$%r!bRv:+ ͢"$R,h) DVr^ ŀuPB%Aq$Fd&;T|z9*ӥv!0ü2u"6 =p!juʯZ5j1fV;NIiJ ѫє0l! !QtwH U!Q }d! * OWͺs{ϽoJw sڕυsbBo8Sc:c ;e)ds=ޓ'L9U2M^Tڄ Ey6jSџڟ^x&WJv@kIcY3'"R,Fg{וu)$ɦy$7:DQ!udP]e;Fשk>zϜG`lAж~#љ?ϞolbH}/L[E ]1dc>«xuXovs5fA=k(O}]os2xӉ,W+0Ќɮg)L3z&h(),>A( TQA 1?Yp% )7Nj5R&4Ã" N*uN%0s苷[-,b7J+cnHO;AۃɽEUeov.&=Mi]G>;m.~ri,?IJ8Odlba.cG7O C]~c]_]`t2uw HW(T5IK+ger b(TV΢$bJB HR?] ц6[kJ׺L18TWǮھʻ?RS!›™,Z:桅_S`&?Qq!7SЯ7͕FV1M47BةZTzPN%@qjp+ʭKb^׀0b_D9ُ|vhٙ=`rOJQ69=[NI:]Rޛo3=ZݸK"m_{ -15I1&v۫tiD ILk|-Vt3Xc,f2WnتK{]Y3M(gpM}PiSjF5q^y"t5x 'ne&],j[ԥlZ\eSB]SdrI@)IxI١Ud.d4'V#<3F 6r8ǷqY '~޲ dgVf欴דs00$[w(J}cm|ԐgX` F@*j/T@*@+55? +"ROi! saxţt;W.ӅC' t29H'wRB3]ׅQĕ"}qjvZ~f)W:):s 2-.t0msy-yJ1(Qu,5m@6r[pCλ1 5<"$h"x ^F m~^qjְs_~]%;]gC—QGu+K畖`(zzJyMRrȻ=.Cohr8h2.3RtVA1pnn3#ܢ5A _ ,h1j<&#:3GϮԡD]|O)gS%`=6F5)9e&FʧC{zf:^ޛ l$cbikxZ !x۪F\P廄5^©H $jHijɩ; ޤCAk*'jl!?ZS.&LTַ55|zr|L^fL1{cbLD!E\Db>@ jUPmm P2h{t 'Yu_Ϋ( A D-a5wh>w>GqXx-^Aot\ɲ:ܘ؝|y\z⍹7Sgq_W^'yVIMm㤸83gV%~e٪LOn딿fZeRe*VţC!`|0nk$JZ0E*pcTȤ3$cDJcvD{0(%KVi\J(*}CzalZaT{D=4ם`H_r&#Q.h* #h1ބRp"58EN/ B^zPS i,'T׾&z't}JwZj.s.t C籓JMacׂdDMT(UH1$6;88zq\*lD wc}ES׊l-.6S ^-7jeiVb%KTB%ЉL-V33a̔/Fsi![$_ BK~jOJnSI,,N!7)N"W2xX lViTUuJ 3aEEX]㧄υ<)|puڎ:PR{vR-|ɭ@$V.J|I "P KR-TsSe-ja$-\Q 6I7OR# Li W^2"\,4CCȥK 8 Yr]DD|$ W*iѐVA{qgk"1iاw+kxCP; `GB%|RQw>ۥ—p#?l˲%a(f2L␄#c)L Z(ZL\/DdMضNznk/Q9}4.}=CJ^3a <'FS't38 ͗TI]]\l~lU,ᦇgdPuPnPs\î†wz C1ẺK,pN@hT?Oo_qnرzRaC=z#6o?s=7^s"3xSGY:U V 5 (!@YfY8R5p$i"' 1E)/C&F^NAZ\,EanT4D ?ڱwm`S@Ҳnl~9e ~ˌmZOSU#N33L sF2KT)WIP 2cu?W#C2\q.db݂PZHYqAnq!"i';+O#Oڎ?)U43.5bD*,%SH _NF ozwBϸLbidtH^2#57 8K*$. ?nl"  Đ񗉑y?6E#ߢ ċo!9N&aaN%F|*誴'zF/ITŸ^/z3,$G!\m85@|6:eP3tˡ$<)T.qE{s˄=G$d]zә ^38ٛc3◙˓^ߢW)THcѿ-T8YBeJd /ICt?!IM.sjs{dmlZEI^? ^ (I* ˽GM^ 5o ޳$t^A D85bBX@>:ÿLq=1Xed*%JD䊿ČĠJgBgϠ}Buzaa6uږWܜ ypR-6AzU1z44S܄͌e5rכ 33S|>QQ>NVd+s՝oS(#7)+K|V ݑh1_} D6up)30kruRϒG|9Y^ͧ?'FzϔidvD)zi\[^Of KKsmTtmGVԛFAS~IJ20hUsȼj8䈖DK((K,Dgג%J ru.(Թ"R' pɬ*Aun-qW~0y/bN>uTrw,!S*!j#< ɴY[USjBHL~#%@ ]cF:21еngM fv6ku1<~ GL#F¥Y&pℷ%9yMҕzfz4{;ʷ=jfN:.:Z{XKSk2r?iwq,݉bY9N|+p.g> 49lc挜DISm ٝKMی ۨќ@K j4o ukqlDbƾ_ $_dFQE=6즗8qJݿn{kgo#{K_7_YvZ|צͦwL|s` >4y V{؏l>E\JB4B| %)p Jn"XĆ.?q}|!׹Tf|_[M  DPiPtYƭ[\.3ۉk>D P~r-]hyrjR8"̟2Ib}1o1N,?2]҉Dˈ;/::wrc)HQ(wqo7vRGh_M!6ŰOd,;OnZZiE[KuEyna6({6cOZĩ3kO}w{r|o cKb~lsI+ Xh4cVH>Mob( i(éѬѬ(= ZPctC2mU {ݰc/FDWKaÏR}?8x0Kk0q= ebLm-5X;lnFtISs?rc{:n;QB ]軼a6ɗER&H"5Y_ZcfկC[E1Y%_. Ë|e%?yl8x@쪹ׄԅS<>1 (i?LKsS=X:*oWkd(L-I[c>p0k`f^%Bmd28! QG*S:{p|LJ0/1SS[0?%:tr9F1`Dz ?8&K_>$=#\և Aأ\;]8 ?/@j'.27B(|f?|U~z*UQxDBH'NOD=}[a?@} 1QT0@}O$iSb`2glY]Y,iJ Bl-N'({9ao[ `f>aǬu¦ឬjjlt*s r4֫ 1Sӡ JK[{ä;DM K!櫣'EwbO=CW"0loBCx >Rb.X{bĠ6+5}W:RE;dWJpYs3br hLvkh-C1-qF%4-p/~c3KKv R#KTo"F\^DZ5CRySvwh4 ihh{t[t s1C EOLH;'7]}ѽpVSs @<n 8 jYl12stJa1MNɤ6٫h y?76M/M~._^FUѽ1pb5ZͬQT,xŐeĘ:W\"( G,z* 1X^!n8L,;ao7 fįcxd3 mAK"_Y0_YRve[8t`d.ۆBg$p# qQ'X'ՏOOTeCsm:boXzSSύݑc⻻FBb/>gBe t䲬67Yk[EZ0a C$:<&a[dY7pt.\ VO \27pQ͌~(zpn5_qcnUȿighyRmֆlBSnjZ^m@(orj ~.ح;·G>EL?E? ^d0_cl8&j̭X=%#c)9jU%uHp=nZ{.cZӞMC(qh#ezq!`c4vF6-k#V,&GӸԲ=4e'c> VlX">Q+N-,u|e-A TeWaٳÚ\\gzS7VipoԠ e)TS`PV\&0Z 煀G2Ŧ}iY;"_hvGd|1 *,ex2%X"dD3" VdVewy\T'k=1Cp/-qɏ V\ɩ:29% />{LTsL^k]Ǽ0u"v<[xqaʣFѦ(BJE0ZnS)eۖNLzh\S7jCۘZx +eX LQX5 z8Hc,"TS}"Ň\Lq[M?F8Fcz&D# 192טw䌸x+YUlAl!Fk\<"1}@_1I-wbxNE`2Tt?]`epJwDYxbאYOT_s߄7G x`Vm u?lϝFoѻpd^$& 0|^~L_ly+zy3ߒĺ|9>K# >Л 81zINC$twv_I%b|m/׳ IZ,.ODn}s6:|qqs^qѮ]G\ǷsB[MgvJs,"Yl)zot0(FJgmq 'J"iU4i6flY?fI;HI4ߣtw4+%%b?4UCm$ I#~(l? 3G,ύ%`6*2Bz@LIhVGĴJL*5\7$=&iGb:v⻗}hb`~/qc"t 2oJM>ubH_Xd#%OZ➽&g /{_׍˾^wv{V^|N,.>%\[ozΛ⾸R⷟|Z m_Jvfcv_ᄉvɎa">eαBu46{fQtt=HWUӓ+slo<0M–. ғDx loho7}~QGtBEyZxӜ:iK|8Ǐs*6H}ק nStɚSۣ9ԛ[[7۷x6]v㖛ۺaF5-Q//EN^ 'e8 x 9A|v Z:͐@ ytAO`a(OYhZ ih Z^ KrԪT;`jX]vSpg/K=j8>?{i?q呣/(= B@@́'{pȁ?= qB躛n^]46Thpszz$ OUܗYAlA *#'*rrĠծR74-4ԯ^7";reZB endstream endobj 156 0 obj <> stream xowqj````b8lA# endstream endobj 159 0 obj <> stream x{y|T9w5O&Idɾ'3B$`B$d!IP1QH*aiV_AEAAm]J٪k ys&ŶyOιٟ<˹BZ4h^SϜ3(9qqubw!liWu\ Db+n*~y_R#~%B) |1n(w|+9͹r 1unevjm]gyKz:{g  afu A6 0{ЯiV(Yj̯E|wPzj69pIͧ3^)3^I?a۰=^BoС{4Qt~qN,u?pTA~^nNvVfFFZ/%9)1!sBl刴۬hX0J!GY(tMiJ>|7~!%ur],;_BP | UB[LJ՞UVQ1O *Ǵ2OY&-hm{R,TeE1 i!/DW: FŚgvOBm!B<*l ]3#OъVѶ(8Ct|Ewcb %bE8!nSZ3ΐ!/4ZpIvddgaZ7IH*Vς8i5)h]M\FX-q- 7膍iWFF*:<m£ 5,i+oRP5M0brgxۧJZ( U0@HlCMIҙFeq7aU{W7zđQz>M)⍟#Vz*[GF*=bHHۉ9V]=[ 6BOr*w7ݸhO81t&Y,T*TF n tj$p7a$`|clFS)S@pA2ἈV8AAԜ-"5C5S[=0ca[H0g0-݅!l'՝vRMar"}'F`^񄌾xY$M {.i+F \{D9JP F<@ZDo,'n V_x~iOqWX3VNb?˃*l2Ž ?m{5huV3,mix=5k-cނ-"R8{8>۬XuIҨt@ƣx%%:?43kۜs3%NE:,ht|\,?eeSEE[9.e'obQ5ۉtbEj]U#C'0*4QM5&bz,=A cD1bZzZkZoY,i'rPNMZg˫"Ʋ-ryls^7+;䙁E^)2E`(Ξ՝mX8ll]rkQnP½EU5%wUU,hp&wW ŬhkqO6o;fbjVQOS1Tx f+2tmpQ*6ְ k\%gO y#>ݞ.aLlH$~8 `KX:Pb<3s,0~!rM-8Rzrs8y!$Jdl&7]Wu45@ ,N+;;pݣw4.fM!!g0Z{͇a\  ɧ_gd~o_`#rz/dQŚ2j>;_S1ϸm,r֨[F@ĀՊr颎HeTիU*VbFuv>Nc !D '"?tplg \s^/Mۭ(^[*u~TƮWH.,ob`]fۨ톭Ts+H>c9ltZzi\p)Ux<^Q\0ޝhSAFh<`FRkڷ'%ǹRo]tGr׍d:RdO'SrPg4tX6]ȻLF!v?g:z\S=; V@& 3Q"wR،Ìd _bݭ+?WHnZK}75s{s&KĆYuKG!Č:$pϊG*v.H7]4 ,ᓘ;(Bc9-ͳ>6^n@:1vУ6qnH(pXIQjFM!%pLksv"-;-gDdn vScƿ'mzDƛm_c| ?N;A:&w@/=x2?pSi8/;ed>b_ِ9q:.> D"Fhz\qg͕MHB,.3j8 md->"niM&>ޔ66-6 4J(OEfٱ] rĭՋz](U;(N\jlߒ7~ @+r$"I5=߳nںy׈m8{ i>H}7j6lH7[,fNd/nx'/V|jqFHQݢ7$NX:W+jޔG=۲񙁲B/="F.9`FcJf\.HؽƟ9#' `i'~~._ok.&~^շ{xNj K,stfjKAYeu2-*I8a|؂=2eA.Q3N/?/kq3[/EEej}(!`'pM.J%"yΜ9#3ɘvӀ\Ji =N~͞p RLi2/rvRQ}h&hzBP+БX&JubPP2E:[È|:,G$՘d^re5dg*FdLt{.it4vC8VO7᩺S 8~V%/ߚ<51ɖ<#LܹKaɘmz%g6PX6gpF峒Q3d 2jQT7| *VK~iHq̱5 8n o|cxC#Ԋz~C<5H$j'b>_ 1d:um DTtR|:T _G-yĄ4+SZE ڡ^FO"Z-2HyZdkk TP&|>Lt]^|/ 7Oc_EUp\.79l`8y8uxc5H)t:{Ӭ7 aUU*;>t<#7n11i, f?lGoyoINQ?GaP,Ч%RQ6{8GQGxk81ɣW>y/ON02i^m9fl9'܇m@ .e3sw7Po/*Z^2(5W?\UMf?ۀޔϴquU6r^P"iH(#|kcram,k<h2[AQ0}SXcSr3wMiM</}Ȗ@F,hG5?Bi4|İNɲ JY`3lC|LYm-YS?+lGlj陖y=R—҇8Zz2 ԺO^g~6 pV%A0'onUa >%xPXWKSR|9)K}rFofIu܂ /dP+:n ,Fۭ^?_iM1Y6jEЎꍺm$6w/uV\<*7qƷy6uq/޶suL'r355TviT785?1SGE{َa6kAcR:"yd6Xwe]\vQ8u<5XbfOoUM :HVJIEԒ)baf +&U5tIүYǼLC.oքEų^>-1R NnXNIeXvH?XxӍ*E bӀaK=="%f?q:oAN44 1 3'eQ74MIBl'bZX5y4 Y>3|tc}^~ xYZ5M %}d0t+j b4f`*0 U0hiiDlӣGG8Uc Df|kމLHm5AK㳁ԹwZޟ zUJjxf}zCf]XlC29* m m["w{e;%#dK`M=S~=ì{.e/ <>s2 z逺(*+yyyQjYX#(F$@l8O<@?mP`$r#݈:cُF5zE/E@rMd:z+T>BO ;%56.Av=rÇdڇP>PlIӊU˚?iCȗbݽ|7.۞dleUUϞ$lN<> ج6$?ЀÖ4 4f!৆YDixԪ 8>YԀ _M)2لt9Bo^譒m%RYIu?_L,S3\bΨa,1j 7Q 23a:cúaHgQ:]`QИq,8>8ȅx&LLdi[VTn(NhxG_>κu^ܑmIn찥D:ov޼u5IF?pX{]`ÿm;` Ãf?,` *VT,3,uFQThpn8~n,|]uQWpd/A%d=|>(0G A9=bqmu Ut:QbH){˂AHx0Op9vSxsM:WWg꿰ee%9s t3fI;=i'OUwQC0 b% G<gqq#0XQ?E_A+dV_{-ğ)MR}|"y*/$>[KɨO0o@xxQ=: WH3D@d,LGt =H$ 21γo*ADZf{'V VX#ٚ8dU$)bҍM)e^+}&óPUwRҁ-ۥMD֡-7%$O`GY?._.7xmWȺwBk0S˾nX?"VC("b&G|wJh1[ٛ lWr#6NB }C^Ҟ(0gdK_l {H`Lgada&2\1L.RаSl[!v U}==]bYO_oO_3ęk׊uVvu}uv,h[6gmTBP$$ 1iE 2gd(iJfU&utk[#t]=8`A:bxC/@j>Ś.鸢>\Z)3pERNJm.k@Q/wAM;EU;d,ɘBUrVA>ԃ!vAV) hDk!V(^$ ouWY,rWTxz'N+sEt1qGȄdڧ]8䵅С22$nx_=IɆ+_b<[-'+_@JN~_™=8-p]Wmsim-EPWk3==2EL3Af .q6 x/T^ujRe_J/FUZ]v6|-WW&Gd댹5 /C| _ B|W8 !Q8p(I8)}&w wţ)cooOس-Lt֘k8%Oatx282~)~ω(ڏ)Gj>_}z$GMP BG&x2cjpp+Ap3ozipO~bzPv #;,a*a۰I:\( 0=G9: bRqip)xˠCyp0`-k[{i-m)Ϲ(GnbNR )dCBb7݆X!;6{l FNЩ5Zǫt4tFÐ rChʀ "vkcz %@*gJ0@%|PCjT0+dUPP:mn`>Czʱu Sߴ6WLG:ۧTe endstream endobj 160 0 obj <> stream xc`@Xe endstream endobj 163 0 obj <> stream x|y|EUWsg&dt&$$dpɅ%I@W$b! &"2( 7suU\5d{3 IDW|즻_WU;0BH6!+/Nj!P3is/! مTsq-[+v!E(  ~!x`1R/>qu+V8xe-|c*;myVn"SФlh\Ѹ|; !qg&ċ0Ge?E8I^BnGߩY±waۥ9# Cϫ4Pp[Djx)<P# \`]A㗼 bF/:AB)S`t+?ehE'=.(A;-h7[3B#y5}?-Gm ]n@SvAczToftZZ2ѵhFѧ، {8&)enq<=9e$|'vABk אJ>MEB_A~77'ۓNOKMINJt%HNG|\=&fDEMF^ըEs,a0X[VR{(Zp%I nj$?2hdPQCS(2P*)/>9# 6_ ~i9]O@pWwҨK\% ԙZ(hzO bJ0LR= @JMPc>_sd5ë<6HC%A]gs@n CǷ_sĈ5M F!DWS9ѣa3˕Je]Te*.XbImt0,L.Nٚvngk%zA%͓),%74~-qn߱@5JeA1eMƦKrrA3kAtupa:)$i%cR{HC% ((tL4Mӂ1h1Hu:TK2Ȓp d7dar|{#湜FC[Wj#ʯ B=iEv)njIaiv@ orRFյ5rt5С+5$01بOI$j;h6M ;<HA `MtZifCFߨ*yh1-. `OT/%ԅ(N(vHNuo%tW{>i@wbZg!+9vj\=<уy`P\r˃k< =JM gp&8|wQyI9dKRD0nW*;oJD^G`D&,&^L\ҞӖ+feefv\$rIflt ZP\ }Zm\q2[5c yFC '3 8>Hf/tԯ[0讏z~;a|Z7.'KR"y!J,D-M[eu[۵s\lLƦ-M-9-[pߍn;eIMh)Pwu~@NL`y=qk1eN{G %WvՄAw1Hш,Rq\/Dd)gj5 -L'2:Y~8/~ Z?e{Ng/E bQ@0<"oNFXI=eeDl2SfHf>"x5t3ws0ON?\ mxs_BH*YWETJ#*s}lʴNmi' |dz ˛:БD7}ƯPy}Nv=du9QDW \`Kv%DEZeUso[=EZ=#םjK[@q㸧V,qyAq%$&0CN$;uEbyfqZ>ۻqֻWE/d~JI.8yR>\ʻ$ieELleuԱBMd3t>;jWYv3{:˹ɨ4]fo,{e+Z^Q-b&I2Dk jV,B4洘--/WD6 WJ F$8D ɆkOWG=sݺJMZnՄ =qOxUgčcF x<ցMP˩@3-Վ%&G5BGQ['ⷈ_3uf iers?8xNySӧ\f/^UWP nP rHhv6(_Ful3aZ 1k-1%?2tE^Cnӟ[PWTozz]-= G!ǡ}dDŲ,%Fdƌ%El 1l%W"Z+cV˸SRi댉k5`A,0pz/ڬT4ddCb Q]iX,(15ʭpJ}/(8kCΓAb s;}BZ:r{sԢf㼦o#P g|,&ќuclEқ&qamqsli WR(LN f_1[7zX>IKJ cOE&?@S+NROLn 1*pc#YdCg{M{ͮ?vW9[.>>xޥoۼVϹy[CrK '-|i6cHze=oP0ѥ,>ݑ<"Ftꩊ3^*3; KV#L H9!-Do` !n?'={nbL9`uw[u<@\g3ycHc 6ܟw@.:b3&Orٍ$i\jBF8'0hiEZ6ͪ#'$XhEw:_tt2O9JkVk~}CF0!(hx=?m%A"%k?7''227 )esҦ%>̓3ccm1Z{ y߭{3w˳'>@9M5f.nɌ ތIB{0݌[֘xo"I$rtH<8`BzӶ:P{(0}\ HPxTEU"沷y6\FQuKmmFšg3Nˮ.Z&.&n;xHc ~^Θ܂] f 7npo-j29-CnA ;Jɉ B <trOlSL|p-fL=eJE0c>x`KlI2~ul9o(n6)=Yvq5Yt2r0]!\fJA`49__f*QUH[N`'DqTK>8}\,-r@,gW1'~8|!9V6R~j<)f0xh2#r_\g`-'8z0v_ǸYhylFNoi4HC~dMfDFEj FȌP{Dkz L[L>-r'u?+8%3{ Y^߿_y00 ލ'{wyݛEo}A>"D9iYV`EYŰ\2m[`\܂;15FPfHzԣu!{X4L+@fXWDGN|*fpW^g9\L_W}/N})(\CO;znp;jP;uU[fecF'r!U9pxjf?tXQ6!?.A0lwhe0>7VVi>z};FJQD%Wο;yFgץfj-چC:ZhH.h3m *vq,v9 o碔6 r#d+j5I R!wXr2ZUXeT^ t4f z0&(Io,BP/Yn9kN\]iW@]q3ڝq]]ty+ѵ0c4v s_\$ZqWLNg"% %QDmT K54Wj:%V?9~]ȁoch )D0Ittj{TtxfhEcqX2-,k-|zdoCժEkBXG'X54/h4?BYPGxtY1o:M!`: ^h،cxb˯~Lnc3CHڂlٹI+]0%?{MAy&2|D4cƜMQ$XRERY. ' T// @VؿP]Rp}0Fsu6j>C^衲 I7" " b1-xě/d9o{rv"%qYME)E(~e}xPO'V\fQlWYp)7S“eVd;?WiYIƍFFj'>Jn5dR3+Kοѝۚ0AS37k4ִ>^Q⏃\%ɖ;L9/󭁳:4~d~~dPՉZjpʡwnp|>뢙Ǣh'TK #*i -tXϣ%FQ+**,[Ye5w'=2N2EFhBh" X0:tG7lO+qVÉ7M(HK.IZeL?fr܋r3N4ݗ7F[?57krtl켋)D,`Oh."I|$h[h"鐋c d_š tk[xg-l2ǖمl M<@#貆 d!<vCh,.fH ;Ss?f8$=֟{S@=HFy)ҎO8t:cə;/v89$ma%9d&fd@fuA|:P0*s(0Br$D}/8ϒ J#j!^mg\h%2ReAYv^ F;xp18h534k4X,~>OB^OܠO3ZI?edWyܽ!f o N/F-Lhͅڦ x8~ɣ(~+緅<4 |[,3,Ð^ @%wȍG~: `ó^2`3MXcpw5E/7;qrW5f}~}\&U^24u3^iT%:.HҼxS)ΈWUna RT&͐!dJf=t,IJN6&{loB(Xvv8Rwgp{p {yc\W]Χf`x:VVT[ćS;=v0e+ݻ}#;!H@XMxOv@~Qϰ6Yk[ ,x1q>Oo4:#y@\Q2gtׁLBi϶Pi$Ȃh8T$1i`i;j!רDhw䆣 g,i(scD.(#(j,ǂikv[ުZYf)*Cls 졿+'V`_:M@.E:ϩ4iiZ >&U+P9&miTF[ٗQ 4eFuհ!^$w̧YMp$QG63ǐ[Cp:$Π}/޸u(guuuuuuogzW?c"!n@ܙ]8\ˇb9Bso jJL])( CU{bs·(& gsʪn?zF>ʋP /Z4?o|hz0þH1#rx 35$V9О]yA/lSU]mQ7?ϪIA0ݵ&=<=ޤ'wa?j8j̀7"i44i>0EGMzRjD٫-[ քZ뵶dӡIEs"%MDcE ʹdf\d(DIf.e0"=9EׄiiyX9Y>Ph+=aʱAy(0͢XWhA)iyB0M˯Vh-a#=Оif3eae1 <4JHIez@y$YHSh-ɃaENB\E>,+4D=H,D6+0M+t$勝vBG)iھG-J0MCF+y;L|vڞ#as'LC{nB;0M+t0M߳S3iJ9s4mB+44Z=Ӵ\ѵV?_A 6_l\ljlktpKjYݲYҲeUc[sˊ,e˜Ӛ-n[휶`Uk4XqEe+ ;Cv5Lj6`,o~&sFi׼l[ش`y㪥Ζ& v Fh jD3kjQKQێ]: UDauv8v8As c|.5nջq#pa惏\?r:P_v_Cz˯UgWˇr_qC2o-9N㝣&܃FƂWpqsr4qc?u8v^Sعq͎T%9qU[[۶69ZuM͛*]y҂MXh݈K Қ6U45545FD;^rD,fS##Ӑ֧SI)z{lXu&s`juzhyA%,E ol"J$'w"(CU9 *hQS.1\/+xGThZ ]f:( 0W:^ud#8VoU/9M[wQuu@Seָ@.%CmWvvH4Ч,J}>s@lqƲŁR}ʏѦnslwVDh endstream endobj 164 0 obj <> stream xc`8,  endstream endobj 166 0 obj <> stream xy|Ǚ0\U=s4I#it4-ЌFHH! $$$1M60`gc~smn˛MMlb}gUz깫jF)bPa"_+ 8{Wlw.0/{!=8rw1vʵ[wR"Ԑj_Ehld(;bx&c?Bh)o@4)'[=2:0BP1;0ezAqD ˞D䴀nE"ۉW Y ]8AU\066gkXn>r`8*=E>D3н'O2!zKCkBBˀ: Ue桽vHm rO>t BPjI>K87_A/yg<ÌWlt Gt=_?!BF H5{~GrFEuNu.ji6-\0q^C>;VTϞUUYQ^VZT/z2.ըR!I%Bp3퍱^w$O}wSFo Y[Ĝb1%(9Bp$杳c= x_lb9j:n>뜕jr8/$/>h]A^Yjh=!w7i*p"зDŽ:H}1 )}0DCu=xRBCOŌsc_:ڲ34[nnӗϔ8mP ꨣs6lbB p}`(24[퍋܍͝I@/hu'jD5@r1Gl'6 C=g6\cR N.RR3َmh4q-rFfjGgnp%v&/dW$F̢RwUΘm}DXtMg(2caf돑Ͻny휔M @C M~p01pϓg*ʶIbi _mmQ#nll7Z~l]g &s{tɄw b.4>8dby -+f+c$f0Zq$<yl"OuwOg[ǪJ  &ULS &%4_ 8?o$rj;K??MR|FtY@ah6GJ%f4?s<.8*/ױ@ z l ȅ fi ăN|;Oȸr򈒑*7DjcbN32 r:$Dݓc29== ^ ^WTbbHuG]ewwQ!QCb )3ú@q 1H N|eU<x~bkn]۝;/G#@5hBWo[y+ y-hW,@t{ѩ+Se NrHa=$oJٓBJR> e[ d/qab5ivHIգz!%-wX +ԣem=ADaEAoÕ`wF&%(F ODzv0m;.Mu;/n/,{ǏgvcsZ2,`i?Io>n>',N_> 2;qp8̈өP*cЁӗ\Q(|@WWI0EM 2&b .N%T3NEW1 Bw) `_qM2uMb@E܌;H GCpUvKMUi- Za[/HyZ[7cGq0ba,s~, fgezgV#-'SҨ!TQURKTɬ((W|>*+Ő#R!@ Nqq1d\龕 (&wi*37 wWZ8/ 0Kg(ZtV0*^1zzĿ1Ye2)+aHa{WYYU+k3ŲCegUkƉJG)a3J*o lnfvd *]l|j^Kv ~qK\xkh8q̼sp,# '$t7ȍv]]iҽ>_ޥk!?}M~ÇmDۋB{2DOx)ol, jJh+AK/NO^Z=_'b VR |ҠӂKFBezF+a2*+uLXR,F֌" y5Q`2"iس爲jc %j<ʄg "XRC 99<@ynrI `BD}v}ioŧŧr3/J%G) x."')`~c\q?Swe T ߄ڎNzd>I !C%?`t{'SN|J'"<9JуX?Jb Q-ɇ>-0 AB$ƕxo pЊ&aO^0)PH5b,8Gҳ5r?sv6 te!X-eN-֑ |3\rpnNnQ#AFl4ۇlM=$;'ǝ2Ǹ 3_4~y>aKG2[οGkƦf@Xrw%YQh%7tq.?l*SlٛCzp~5nS-}2EOP\Z>q7 @l5jH5(볲UX$F,e,5zcyR~^>Q2J%n "ї0?oQ0PN RѢ.C_ZugHY5L`6ynJ7o]]Vn .^PFoc3ky-_hѮ{jkU,}K]gxJyGpÚɮ;W.|բݝ[Jk2K\>i@q(r2M3/2d]BMa +J%I U9"Gj`Ag`rHID,Nٓ,Dzǹd!.-6\|-ʮW㸝]|$1_(90{`OًД7GX\!^<(\&'|CEi/*Iwzp3i?r$mMSiNhl0Cv̳uڈcADwF_mGS4oWZ#ݛ{Lz7(u ʌjږ& 1a*U<5M-M,|d,.YnXz^5o{lduS^c~Z2g֬EskiQu[[]ؽ+o)7/I=6d\| #e\br}OSfѱ,oIQ\賗 å*UYx'ޑ4y2Mv}}m, LF#yCvxy`WNc#_Mgӻ ":òzZ Gk2iYg2AiGuJ6ќw|,)4E SvAf{^)|c_F뗽;79Uhn:nkY}%%[B뷄YR8JF1 cDKNQP4Z9z9."!a1U' nCOTOJcR"oh}#]@qŋDq OÅ"e,$wGzOV02;ɵB*'2(vSmQL[Ā*ӷjͷۖ4>Ly>;?BjILL]V3iAC}! L|B>\"`)fYfh vl1[kp: UӸ4O{J2>yܢT5*U~L`u^4YgBqe7,LqE1{pC6tJy-Z,}|7Gu:M=uiۡ?'b.t[8;$h60lffd>ICzvSOjƨLIN"|-~/_YY;ߋ6$8u.\Rsک/3͞)҈ 7v mZڽmx!L?Cʘ0C2pV]##σ{șe9)>4E0mr\'rDWT E(zk  @c74jFeq͛\B~ar?GG&i VH$fϒ6$MHE.8 2,f% "NJ8\(z$\@@z[,z=b@cQ |%ބ!$B&+Ɨ0_DB(@Nb} v'&aL LA߃K i roE A n ^R(h-%;@ĵw23n)E"9E^00OQ!4~!|"z~Ixt&ws f+| ] v*৽"R.v!*FI!8'dzKjSVZF N0$@P$]/3\):0lS5UT \o}@Shf-:=2^+z,f1Fx%Buo%u}Nt6p(&#OqYIIhyi,os&RZbh회@Cյ{d[+;OuViuFnQ+iA[{mڰ͖e7bzm# %FuE٬QYJ ddk'~ P῎3[l?eI3\|՗M7;Խ*}e'Jlt =b}uۖU.>l Ё.5?i,*^ST`Z)0'5I7JwKYne'YEQ=>?'z}WIIQDQ (M\47(CxW(xEHgfqf؆YVؖ^wmy` Se/ҫ{4xi;_ =g1$"+YWۡ)yՙ] }{;+Z}oŠ>oe;E2)ږ.]@ @Ц0 r$nA:#AtDtY*:i+ʼnh 2@gZLge1%ұD?ÒhIi,CԵVC]DÀWd,[֨8=ogl#*B!t\Z8YH8jS ƪ5UL st:’jjpqFTkNjFZ/ s/M8l)qcJR _EENIH$T&9 9Kj['bl8 ̓L9#1 Cb$+;VmXZU&YG/z_K ~e*s6 ].9Ѣx~#{~{ΞRjʳ Y^ow7<"/6_}hnBf̈́jz\Kz#0rL8á3YGHHL( $#@ 3}Թ/ a2$,5+Z8k傼syKLɋѕ/4Oݝ{o;-R)DzrJ1 *)4*2&1\<2RT2=`y%lҀv-?:o%L'jJEN yM=R_>.%gn1ix3 YnGӀ:Q2G:yAJ<$^7ЦfxtDR,rW65J++i Q KE̽{w;x60> <v8!U&}JutӨ_pr99P {{|r{^8O'tՑJpw~?'3M!?B?JQEOXɻՄWcu$8x֯D{ÆѤذaCb پ?䌨I.%c2IG **EBԙpA*"ӴԜ+Mkm;ee4-r9F87&Q,Ӕ1z ֪#u]].F(+EF 5QH$i\ Ą]}bډg18;mEKo3U2ސ! vaEn!Tgp ҟi+nvX=nw ?c|/'e;Q5r(4r=*۷aFםBoj7*k~Bu{[pJw?<+goryvh?/aQfZ<_Hf&/[³dX>0OQWgVVUpܺi $?{Z8jڿ@4l ׬?4%묾YeWװ|V ɸmƼp1qT;8&{ެ\9)Z2_?wj}K$#2Q3uEEELU.e0iܘ;U8S[NVpQ>l8 _ODSf-7!⋯`o:׵;;]?us/P`@[FjffZ3)EnF]|2bjU=-4`S7?,;0'Ve2M@|I6՘Jc kYVC1ء8`f%rj%x2oELt'}nIJ_YӺgi9|Y(V6R69*Sm<g*WX5sk^ʍ//fVv ktk-xu+-)"87*s$!+ EL&GAG.Npˏf8g .8bN4j++ν}o5f:4d5.e7Ѵ6sCˎ.ПP6.Z oޛMk4I |[v߆\:k[f|GymRS[X\k7kTzpEȘ_R+t|nxѫӟ0ZlV[Z'5[H$z}:'(U{"t TUb(Ct%c/iӠ_2 1)7%W Ѷ춦^2Xc`ƛK*n(!'DyV. y;2e]]DJu庘4 +Y82'2I&fIFcE73 Y/ 5-Ý;[تV cמV/ se/̣#œ,nthMۥ%r-0m 0fdU$⧍7OOG +4: DKPj *D=&O>ETURh귾oz dzN"1M2l|:*uA)8'h&߀>OOE$l_l'p+iD|9DψL/I'ts:Is‹ixMiӘ4Fo:qTiiuZ{ԥj`VL\F3PF)b ›FƨjԸ%͜6_6JՀtw|)6Jq0iE\䖚1w8OWu$h]ɩ?M}=>U 7w뙆tPg#AU ՋYo'yF\rxuuS^X2/*tВz7S6iVJj5]U%:q~ظ"@ҙF@('fػ}NR<(. ڵ }+ T9bks 9sfG_=%edI-_\{#MMOU. )"*C| ΏXeqEV! !lLP ra([,܀2R_~~=Ma{sC<l4\HK,)wW&1jLTyi#·KřAQљĐX$_~Wsvm/eN16XyƗX/yl^inH8~fqDz%u=١;#kuXGM S^mԒ:m_$z^&먃NxF(O!)Z^/*+ ۿXTX@WY)ƞ@0PnD4NY,jma WEMYWߊqm|E.4 o)ɱʧ\dTLHV[>ג=7̈"+1Q7Hf4Q|b}Y6Lb.*NݼX{:q<ϾƩVYn-yK/k=ѩp .?6cy⿣6>€:ys t@XſO:edH'!8oӓ*qHLg`%*,'Q/L[ULw`G 5 AiCےЎ?f‹^zfn>S]TV0ѬU漼C# s| go}]}Zm<3cӷyX'юcdGj3@Tg.aҔ:JҢӸ~q7Cך~JM(ٔ'( 1&0 +Wg"5`:+2^'jZfnfV㛖 i=W v%Թg7zBum13˖쯏rZ#J5 7.OZ1o8g߈_2dUZu rc*CyM f!ӔѤL%QYilJr*HMt:9V s| RRFw]Fi{#Fk֚RY77B/˭ 'IYԦj8>Vj5kMTiRcx%Aneĉ%;|۰K& ąb5\K`oZ |?~7^=9uftGԏnNu-Z+G?%?" EC{Bi$(!JFT:F 6WfFnb$r%h 2֤ߞ?Iqfn>Ƃ~͸fѨ]RF-ʂ! Ӳwe$2!37"s3%rI|ڤ͐%@b]L%֩Vt%7+`7 X6  ׁ̀pڌdpg?5_wnɼjWEqߖnHrvW6/)J;gva<"jt)M2).).+84ۭۨct@⚖IRv+$D(x-@OtzQ!^0 Saq\r eA<3purP9x%tFދN?"dبbW]{,owM_XZfA|d2 [OHϿsAj**@+8ns8ޖNyd]ʚՙ Xm)iݶEii!4ZGVƚIQޜ"\Qzga~=#r+^vpp'Y9 fgf4r^2ͳ蚋߹;<΋ۨ߬x A^REU4L2tQĬ kU=Ӫi RIx#M70f:&z[tY-M& U%ՖBCCݻ}rL:; *%>4N-ܾsűsyۚmS-Pf{|翅sinq!fS+BVi].vV^%v.#sY:hȊM7nl=̂y/Hr3$C"8S߾ *21ƭavȑm}SKH#©?ߙŚnGTp9ș|G_8 B EwnLwBwKcw\O)k&  u?v$ !@#?/W e""O's\2|X-xǏ}+vbZ-TC^<>4˨5p>?"$9:ì eurOqOIr+R=7=3$Ax?2UU5֮:n~~5.¸)bz̬2_&ke}$?R{x[wmsr)vR1/yMD3PGB Q'X*j^d#-L̈́W$ Jŏ&,i2! Q$H'RLːE2-G֘L+Q۝LPdZO5F}hrx$BBٱ;&H% *kiʼLsߏi J#)ɴif^L(s2DL[*ݚL9i2A$K@ !̉rʁ{1*R-h=Dz(UZM5Op&[Zr>|5K | &D }Pv(ZyàYhȖѡƝ+rŅΖ~go<ٰ~EvZX`9:060i9aNishX79HBGWbG|)ڱFοi-`ŲcKx90:FN &hhX˸XwXwX$_RKA+ĺ9Q0W%h5 AL(݄[946>0 Cm Ѿξ6 3W AU07=Z< <| ܠã# p`blbq_Olp.WGPd?,ѭH_ AIj||߼ysA_EuՎia@P6Abi[FƆV/X5nm͎%lMM?հxOCə3KvxPl'1Z#pbI@])"ewR7Gte2rkTc@}EZY׃p\(pRhFFW/]_ytKcLbE*4w$wP[gWvn4'1V=֛뇄@Ϙќ>1]||3>`X2qF?@1< —$|ezĖ6lLlCA c֞e endstream endobj 167 0 obj <> stream xcŶà{LRi d8 endstream endobj 8 0 obj <> stream xZnG}0]d)JlAVD?PdK""?V5).4esE@z{ka9ƙ*& 2aTxrLgZe`(&93)Iɼ͂ L{P?˙"v`< L@1dA"'d4/53cV $bC%' 9W04:y LZDKJz 2%f!pRK4Y P㓱┅O`(n,:\t9\G'rq`' < +i.ƍC yAKR Њ^H*x:8}C; !EWAC3hp ZV Bzv|'@! 03A]YNJI6 Cp#a, ! $$'*Abi-vy<B"c<4AP^u+ɍirP C34AB$9!` \ q9@(pypWM-g@Or$ȗ`)x7H Jx@hIE)<zEH4G4Oz f$^O'e_L'e/NN*?{ߖǩy۷_}~,xR+zz;LqO#|\MށrPUL63nP~=AKޖG\l{$% 2"8 2 NA "VdSHQzCFEd θ߇̆ 3` $&dV=h\g&aBJ\FC!4yXe@ߔ!C@M#F׵e`_$?UTцFm_巳/Z~+ kԟog鯨#fLG/:y~;!gU9wa2|/gy5-?>!d!1Q1bGc0AǼ%,D-xE ZR`j~Xff^5dX)}kIx!˷Q5aI?`O&WŠ;ݡnR& Jӡ=o;ɱuEס;"EiWG2xdb+dyמ_hM>Ü{t_sYvmlvvgcr~|; k٠gxU!ɨ/_ߔ77\תąY?Z]KιQ4皶.+mX_帊O; 9h5}%ѲnC ݆EiGE[+JQEIe |$t>O?O]jӳk~d%@ fIJ j skdMa,G.-1Pൿn"YZaZlUϵ龬S 6 4맗->}Xٔ}3Qa ?$3Q/áG2s)&:^ j.r^sP%fCa;t4UsalxeK@5g—%&.,g頜$.N.0.D(^S+ %,vd|үʃ%0Ʃ8,G&7tWE|2,g~4q'q~w™E?pVd 'vbވhX≋w)<ҽge$3!#Ǔr6xNcuj:>TnPʏf 6X  Ʒ%^q*~8oQy{ ⡤CS^oDoȥ4k]qn _y 1=Mx{t9:# 1gv8TWŜQd?h zDj9uSXI2 S~FuK0{:Dca2xDLg"WaFGU2ND#WJE+1Z2:) Rt pދc0J;}=dNeNHܻtDGH,t~gB9 :M .uښή /Bѧ.N;|3nnN7-px݆77y&߆7׾t~ 7G^XA ^=8r@=J:keХT+G:Z'Qz@$E6:VψQB}.lJC@j;Ux8j32i5ObS+^wEg.S8EP7PVi4R%9髷rd3Ff1pPEdt)2Y,Ϊ|`The|땣_՘m17ux0ܝ?^(fzjx%^ "60"m.OK,n .ܔ]/Size 169/W[1 3 2]/Filter/FlateDecode/Length 433>> stream x5Sa/!D9!P(CrPI_al,  ce"kc-g^=sKxTx6f-$fwYٸCIq N3ƙE؂8j7v:| g2[QRx*~eJFGQͪe*Q1z_%aF'ڱ(U&J)v―~}ʣY=B`GY]Vۇ(mu|Rq1.Vf^zT+/rGYkp-uk 7F\7j-؈[qa=n4܁f܏'0q<^~kIMkiMiG޲F_%C8h}J%}WxݜLsR%J endstream endobj startxref 93640 %%EOF instead-3.2.1/doc/modules3.md0000644000175000017500000010320413267071773015023 0ustar peterpeter## Модули STEAD3 Данное руководство описывает основы разработки модулей STEAD3. Поэтому в дальнейшем изложении слово "модуль" означает именно модуль написанный в рамках STEAD3. Что такое модуль? Часто ошибочно считают, что модуль -- это любой отдельный файл игры, содержащий служебные функции, структуры и объекты. На самом деле это не так. Если вам необходимо выделить служебный код в отдельные игровые файлы так, чтобы он выполнялся в момент старта игры -- вам достаточно включить такой файл инструкцией include: include "mylib" Модули stead3 пишутся следуя специальным соглашениям, при нарушении которых вы получите нерабочую игру. Данные соглашения и описываются в этом руководстве. Очень часто в оформлении своего кода в виде модуля просто нет никакой необходимости. Написание модуля целесообразно в тех случаях, когда требуемая функциональность может быть реализована за счет тесного взаимодействия с движком STEAD3 и представляет ценность не только в рамках вашей игры. Примерами модулей могут быть: - модуль форматирования вывода; - модуль нестандартного управления игрой; - модуль генерации изображений нотного стана... И так далее. ## Игровой мир Важным отличием модуля от просто библиотечного файла является время жизни модуля. Игровой мир (объект game, игрок, все объекты и переменные игры) создается в момент запуска игры. При подгрузке частей игры с помощью gamefile, а также при загрузке сохранений игры -- игровой мир уничтожается, чтобы затем снова создаться заново. В момент уничтожения мира, все созданные объекты и переменные перестают существовать. Когда вы включаете код с помощью include, весь этот код будет выполнятся в момент каждого создания мира. Обычно, это подразумевается автором как само собой разумеющееся поведение. Но в случае модуля, это не так! Модуль загружается один раз, во время создания игровой сессии и существует все то время, пока выполняется игровой код. То есть, после уничтожении игрового мира и при его новом создании, уже загруженные ранее модули не загружаются повторно. Это означает, например, что в модуле _нельзя_ определять глобальные переменные, объекты и комнаты так, как это делается в обычном коде игры. Например, модуль не может содержать строки вида: -- мой неправильный модуль global 'MYVAR' (10); room { nam = 'комната'; }; Дело в том, что и MYVAR и комната будут уничтожены при первой же загрузки игры из файла сохранения, так как игровой мир уничтожается целиком, а переменная MYVAR и комната -- часть этого игрового мира. Если подумать, это становится понятным с той точки зрения, что модуль не должен в общем случае создавать какие-то объекты и глобальные переменные в игровом мире игры. Ведь модуль может работать с любой игрой, и не должен учитывать особенности игрового мира конкретной игры. Создание глобальных функций тоже не является хорошим тоном при написании модулей. Если вам нужна служебная функция в рамках самого модуля, объявляйте ее с local (то же касается и переменных): ``` local A = 10 local function myfunc(a, b) return (a * b) / A end ``` Тогда такая функция будет доступна в рамках модуля. ## Системный объект как интерфейс После прочтения прошлой главы мог возникнуть резонный вопрос. Если все переменные и объекты модуля уничтожаются -- то как вообще взаимодействовать с модулем? Если модуль должен предоставлять какой либо интерфейс, а также сохранять свое состояние, то в модуле следует создать системный объект (чье имя начинается с символа '@'). Подробнее про системные объекты можно прочитать в документации STEAD3. Важно то, что такие объекты _не уничтожаются_ в процессе смерти мира, и таким образом играют роль интерфейса к модулю. Например: ``` -- модуль testmod.lua obj { nam = '@testmod'; hello = function(s) dprint("Hello world"); end; } ``` Такой модуль уже можно использовать: ``` loadmod 'testmod' _'@testmod'.hello() -- получили объект '@testmod' и вызвали метод hello() ``` Но это не слишком удобно. Следующий вариант модуля: ``` -- модуль mymodule.lua local mod = obj { -- локальная ссылка на объект nam = '@testmod'; } function mod.hello(a) -- вариант определения метода вне объекта dprint("Hello world") end testmod = mod -- глобальный объект testmod -- интерфейс к модулю ``` Использование модуля: ``` loadmod 'testmod' testmod.hello() ``` Сделаем вариант модуля с переменной, которая должна сохранятся: ``` -- модуль mymodule.lua local mod = obj { -- локальная ссылка на объект nam = '@testmod'; num = 0; -- переменная } function mod.hello(a) dprint("Hello world", mod.num) mod.num = mod.num + 1 end testmod = mod -- глобальный объект testmod -- интерфейс к модулю ``` Итак, подводя итоги: - интерфейсом к модулю служит системный объект, имя которого совпадает с именем модуля; - все переменные, которые нужно сохранять, должны быть переменными этого объекта; - вы можете вызывать методы через модуль.метод(). ## События Итак, модуль существует все время жизни игровой сессии, во время которой игровой мир может неоднократно уничтожаться и создаваться снова. Допустим, автору модуля необходимо выполнять какие то действия в момент создания игрового мира (например, помещать что то в инвентарь игрока). Как это сделать? Модуль может регистрировать специальные функции-обработчики некоторых событий. Например, для отслеживания события "создание игрового мира", мы регистрируем обработчик init: ``` stead.mod_init(function() declare { game = std.ref 'game', pl = std.ref 'player', } end) ``` stead -- это интерфейсный объект для доступа к низкоуровневым функциям INSTEAD. Часто, удобно сделать локальную ссылку std, и пользоваться ей, например: ``` local std = stead -- сделали ссылку на stead std.mod_init(function() declare { game = std.ref 'game', pl = std.ref 'player', } end) ``` В дальнейшем изложении всегда будет использоваться std вместо stead. Приведенный код -- инициализация стандартной библиотеки stdlib из STEAD3. Как видим, тут происходит объявление переменных-ссылок game и pl для удобства работы с этими объектами. Итак, регистрация обработчика выполняется с помощью вызова: ``` std.mod_тип_события(функция, [приоритет]) ``` Параметр [приоритет] (чем меньше -- тем приоритетней) является необязательным и определяет порядок вызова вашей функции относительно других функций для данного события, например: ``` local function init() dprint("Очень ранний init"); end std.mod_init(init, -10); ``` Перечислим все события, для которых можно зарегистрировать свой обработчик. - init - инициализация мира. Вызывается перед init() игры; - done - деинициализация мира; - start - запуск игры после инициализации мира (непосредственно перед вызовом start() игры). В обработчик придет параметр load (true -- если это загрузка из файла сохранения); - cmd - вызывается перед выполнением команды. Если вернет не nil -- воспринимается движком как реакция на команду. В качестве параметра - массив (команда, параметр1, параметр2, ...); - step - вызывается после выполнения команды. В качестве параметра -- true (команда выполнена), или false (ошибочная команда); Выполняется после game:step(); - save - вызывается после сохранения динамических объектов игры в файл сохранения. В качестве параметра -- указатель на файл сохранения (Lua). ## Классы Все объекты в INSTEAD, кроме переменных, атрибутов и обработчиков содержат методы (функции), которые вызываются при работе движка. Когда в коде вашей игры, вы пишете что то вроде: ``` obj { nam = 'стол'; dsc = "Тут стоит {стол}."; } ``` То вы создаете таблицу Lua, в которой кроме nam и dsc определены многие другие вещи. Например, метод disable(). Когда вы пишете: ``` obj { nam = 'стол'; dsc = "Тут стоит {стол}."; }:disable() ``` Вы у созданного только что объекта 'стол' вызываете метод disable(). (Вызывается функция disable объекта и в качестве 1-го параметра передается этот же объект). На самом деле, даже когда вы создаете объект с помощью obj, вы неявно вызываете метод (функцию) new у класса obj: obj.new { описатель объекта } Классы, удобный способ описать иерархию объектов INSTEAD, а так же реализовать свои типы объектов. Например, вот как определяется класс obj (с сокращениями): ``` std.obj = std.class { -- определяем класс __obj_type = true; -- тип объектов (функция is_obj) with = function(self, ...) -- ... реализация конструкции :with end; new = function(self, v) -- реализация конструктора obj { } end; -- другие методы -- ... display = function(self) -- отображение объекта local d = std.call(self, 'dsc') return d end; -- другие методы -- ... }; ``` Обратите внимание на метод display, этот метод служит для отображения объекта в сцене. Как видите, он просто вызывает 'dsc' у объекта, с помощью std.call (вызов функции или строки). Теперь представим себе, что вы хотите сделать класс объектов, у которых в темноте пропадает описатель. Признаком темноты является переменная darkroom в текущей комнате, тогда: ``` darkobj = std.class ({ -- определяем класс __darkobj_type = true; -- тип объектов (функция is_obj) display = function(self) -- отображение объекта if not here().darkroom then local d = std.call(self, 'dsc') return d end end; }, std.obj); darkobj { nam = 'кот'; dsc = '{Кот} виден при свете.' } ``` Обратите внимение на скобки () и std.obj в последней строке. Таким образом мы дали понять, что наследуемся от класса std.obj. Все методы объекта, созданного при помощи darkobj, будут такими же как и у obj, кроме метода display(). Если говорить об иерархии объектов STEAD3, то: - room пронаследован от obj; - dlg пронаследован от room; - std.phr (фразы) пронаследован от obj; std.dlg, std.room, std.phr и std.obj это внутренние имена классов. В стандартной библиотеке stdlib, которая включается в вашу игру, определены такие переменные; ``` local std = stead local type = std.type std.rawset(_G, 'std', stead) -- определим std для всех include = std.include loadmod = std.loadmod rnd = std.rnd rnd_seed = std.rnd_seed p = std.p pr = std.pr pn = std.pn pf = std.pf obj = std.obj stat = std.stat room = std.room menu = std.menu dlg = std.dlg me = std.me here = std.here from = std.from new = std.new delete = std.delete gamefile = std.gamefile player = std.player dprint = std.dprint ``` Это сделано для удобства автора (легче написать include, вместо std.include или stead.include). Если же вы разрабатываете свой _модуль_, то рекомендуется пользоваться внутренними именами с префиксом std. Причем std определять в начале модуля: ``` local std = stead ``` Это обезопасит ваш модуль от коллизий с игровыми глобальными переменными. ## Цикл обработки команд Жизненный цикл игры на INSTEAD это обработка команд. Примерно как сервер отвечает на запросы клиентов, INSTEAD получает команды и отвечает на них текстом. Команды формируются интерпретатором в зависимости от того, какие действия выполняет игрок. Команда -- это слово, за которым может быть список аргументов. Примеры команд STEAD3: - load <файл>; - загрузка - save <файл>; - выгрузка - use <объект>,<объект>; - использование объекта на объект - use <объект>; - использование объекта в инвентаре - act <объект>; - действие на объект - act <$объект>,аргументы...; - ссылка на системный объект - go <переход>; - переход - look; - осмотреться - inv; - получить инвентарь - way; - получить список переходов В качестве объектов используются идентификаторы в виде цифр, которые движок сам сопоставляет каждому видимому на сцене объекту. Каким образом STEAD3 обрабатывает команды? Интерпретатор работает с Lua частью через специальный системный объект iface (переменная ссылка на "@iface"). Этот объект создается внутри STEAD3, а для графической версии интерпретатора INSTEAD, пересоздается специальным модулем ext/gui.lua. Выполнение команды это вызов iface:cmd(команда).Обратите внимание на ':'. Такая запись это синоним: iface.cmd(iface, команда). Команда разбивается на части, и записывается в специальный массив std.cmd. Так, в случае команды load, в std.cmd[1] будет записано "load", а в std.cmd[2] -- путь к файлу. Затем происходит вызов game:cmd(std.cmd). Это и есть то место, где команда обрабатывается игрой. После чего вывод (возвращаемое значение) пропускается через iface:fmt(). Который в свою очередь вызывает std.fmt. В std.fmt ссылки в выводе игры {} превращаются в ссылки для интерпретатора. ## Примеры модулей ### Пишем компас В качестве примера разберем модуль, реализующий простой компас. Наш компас будет представлен ссылками С/Ю/В/З в инвентаре. При нажатии на одну из ссылок, будет осуществляться переход по атрибуту комнаты: to_n, to_s, to_e, to_w соответственно. Начнем с того, что создадим файл compass.lua, в котором создадим объект @compass: ``` local std = stead obj { nam = '@compass'; } ``` Наш компас -- это фактически набор ссылок: C, Ю, В, З. При нажатии на ссылку, мы должны выполнить walk. Как отобразить ссылки в инвентаре? Мы можем поступить двумя способами: 1. создать для каждого направления свой объект; 2. воспользоваться подстановками. Первый способ плох тем, что не позволяет нам произвольно форматировать вывод (а мы хотим, чтобы компас был похож на компас), поэтому подстановки, в данном случае, будут удобнее. ``` obj { nam = '@compass'; disp = false; -- не показывать объект @compass }:with { obj { nam = '$compass'; act = function(s, w) std.p(fmt.c ("{@compass n| С}\n{@compass w|З} {@compass e|В}\n{@compass s|Ю}")) end; } } ``` В объект @compass (который стал невидимым, см disp = false), мы вложили объект $compass. Как вы помните, это подстановки. Движок, встретив ссылки вида {$compass} (а именно такая ссылка будет в инвентаре, если мы поместим туда объект компас), вызовет act у объекта $compass и его результат отобразит в выводе. Мы и воспользовались этим! Функция act у $compass формирует строку ссылок: С, З, В, Ю. Причем в качестве объекта реакции выступает @compass. Это значит, что добавив обработчик inv в @compass мы получим вызов этого метода как реакцию на нажатие ссылки: ``` obj { nam = '@compass'; disp = false; inv = function(s) p [[Вы нажали на ссылку.]] end; }:with { ... ``` Но как определить, в какую сторону мы хотим идти? Ссылки нашего компаса имеют вид: ``` {@compass n|С} ``` Это значит, что движок, при нажатии на такую ссылку, сформирует команду: ``` use @compass,n ``` Которая и приведет к вызову метода inv у объекта @compass. Но как получить второй параметр, в данном случае n? К сожалению, у обработчика inv не предусмотрены дополнительные параметры, но если вы вспомните, что команда STEAD3 раскладывается на компоненты при ее обработке, то поймете следующий код: ``` obj { nam = '@compass'; disp = false; inv = function(s) local dir = std.cmd[3] p("Вы хотите идти по направлению: ", dir) end; }:with { ``` Теперь в переменной dir мы получим; n, s, w или e! Действительно, в std.cmd[1] будет записан 'use', в std.cmd[2] -- объект, а в std.cmd[3] -- параметр. Если бы мы вставляли подстановку в тело вывода сцены, команда была бы такой: ``` act @compass,n ``` И был бы вызван обработчик act. В обработчике act предусмотрены дополнительные аргументы, поэтому в таком случае мы могли бы просто взять параметр из списка параметров к обработчику act. Впрочем, способ с массивом std.cmd сработал бы тоже. Теперь нам осталось написать код, который делает переход по локации, заданной атрибутом to_направление: ``` obj { nam = '@compass'; disp = false; inv = function(s) local dir = std.cmd[3] local r = std.call(std.here(), 'to_'..dir) if not r then std.p ([[Нет прохода.]]) else std.walk(r) end end; }:with { ``` Теперь нам осталось только сделать так, чтобы компас попадал в инвентарь и предоставить объект compass для настроек (которые могут в нем появиться при дальнейшем развитии модуля): ``` local std = stead require "fmt" obj { nam = '@compass'; disp = false; inv = function(s) local dir = std.cmd[3] local r = std.call(std.here(), dir..'_to') if not r then std.p ([[Нет прохода]]) else std.walk(r) end end; }:with { obj { nam = '$compass'; act = function(s, w) std.p(fmt.c ("{@compass n| С}\n{@compass w|З} {@compass e|В}\n{@compass s|Ю}")) end; } } std.mod_start(function(load) take '@compass' end) compass = _'@compass' ``` Дальнейшие улучшения компаса могут включать в себя: - не показывать ссылками те направления, которые недоступны. Для этого надо изменить код $compass.act; - оформить вывод компаса в виде изображения. Для этого можно с помощью pixels сформировать изображение компаса, разрезать изображение на 9 квадратных изображений, преобразовать из в спрайты и выводить ссылки на них из act. Данные улучшения предлагается выполнить самостоятельно. ### Модуль клавиатурного ввода В качестве следующего примера рассмотрим код модуля keyboard. Этот модуль можно скачать с [репозитория модулей](https://github.com/instead-hub/stead3-modules/tree/master/keyboard). Модуль позволяет организовать ввод пользователя с клавиатуры. Идея модуля состоит в том, что клавиатурный ввод оформлен в виде специальной комнаты, в которой можно выполнить набор текста и вернуться к первоначальной комнате. Комната, содержащая в себе логику клавиатурного ввода, носит имя @keyboard. Это системный объект, который не уничтожается при рестарте мира. Для использования клавиатуры используется ссылка на системный объект (см. main3.lua): ``` p [[Как вас {@keyboard "Имя"|зовут}?]]; ``` Как видим, в качестве параметра передается информационная строка, которая будет отображена при вводе. Объект @keboard, соответственно, должен реализовать act обработчик, который перенесет игрока в комнату клавиатурного ввода: ``` act = function(s, w, ...) s.title = w or "?" s.args = { ... } walkin(s) end; ``` Кроме того, что здесь мы меняем название комнаты (title) и делаем переход (walkin), мы также запомнили все дополнительные аргументы, если они передавались в ссылке {@keyboard}. Зачем это нужно, будет ясно позднее. Итак, осталось реализовать клавиатурный ввод. Для этого мы воспользуемся ссылками кнопок (для того чтобы вводить текст можно было на устройствах без клавиатуры). И одновременно с этим, будем отслеживать нажатия на клавиши с помощью модуля keys (для удобства игроков на компьютерах с клавиатурой). Формирование ссылок-клавиш осуществляется в decor. При этом, ссылки формируются в виде: ``` row = row.."{@kbdinput "..vv.."|"..input_esc(a).."}"..fmt.nb " "; ``` input_esc() -- функция, реализованная в модуле, которая экранирует некоторые символы, типа { и }. Как видим, это снова ссылки на системный объект, но теперь это уже @kbdinput. Этот объект специально создан для обработки событий от клавиш. Прежде чем мы перейдем к нему, рассмотрим вопрос использования модуля keys. Для использования keys мы должны: - определить onkey в комнате @keyboard; - задать keys:filter() Мы могли бы просто определить в модуле: ``` function keys:filter() -- логика функции end ``` Но мы хотим, чтобы наш модуль мог работать совместно с каким то другим применением модуля keys, поэтому при старте игры мы перехватываем старый обработчик keys:filter, заменяя его на свой. А потом, при деинициализации мира возвращаем старый обработчик обратно (когда он уже не нужен). ``` local hooked local orig_filter std.mod_start(function(load) if not hooked then hooked = true orig_filter = std.rawget(keys, 'filter') std.rawset(keys, 'filter', std.hook(keys.filter, function(f, s, press, key) if std.here().keyboard_type then return hook_keys[key] end return f(s, press, key) end)) end end) std.mod_done(function(load) hooked = false std.rawset(keys, 'filter', orig_filter) end) ``` Здесь мы видим использование нескольких функций: - std.rawget(таблица, имя) - получить элемент таблицы без генерации сообщения о несуществующей переменой (работа с переменными на низком уровне); - std.rawset(таблица, имя, значение) - установить значение элемента таблицы без генерации сообщения о необъявленной переменной; - std.hook(старая функция, функция перехвата) - создать функцию перехвата. std.rawget/std.rawset -- это способ работы с переменными на самом низком уровне. Например, если бы в mod_start мы просто присвоили keys.filter = std.hook ..., то мы получили бы сообщение о том, что мы меняем объект, который не является переменной. Итак, если клавиши нажимаются в момент нахождения в комнате @keyboard, то мы используем наш фильтр клавиш, если нет -- используется перехваченный фильтр клавиш (keys:filter). Массив hook_keys содержит все те клавиши, которые мы перехватываем. Объект @kbdinput реализует act, который занимается обработкой вводимых символов. Когда текст набран и ввод подтвержден клавишой ввод или соответствующей ссылкой выполняется следующий код: ``` walkback(); return std.call(std.here(), 'onkbd', _'@keyboard'.text, std.unpack(_'@keyboard'.args)) ``` Как видим, происходит вызов обработчика onkbd в комнате из которой мы пришли. В качестве первого параметра передается введенный текст. Затем передаются все те параметры, которые пользователь задал в ссылке @keyboard. Эти параметры помогут идентифицировать поле ввода, если мы хотим использовать несколько полей ввода в одной комнате. Здесь используются следующие функции: - std.unpack(таблица) -- превратить таблицу в набор аргументов; - std.call(объект, метод, аргументы) -- вызвать обработчик объекта instead. Теперь вы можете самостоятельно разобраться в остальных деталях модуля @keyboard. instead-3.2.1/doc/instead.txt0000644000175000017500000001026013267071775015137 0ustar peterpeterINSTEAD(6) GAMES INSTEAD(6) NAME INSTEAD - Simple Text Adventure Engine, The Interpreter DESCRIPTION The interpreter of STEAD (Simple Text Adventures) allows one to play games that combine visual novels, text adventures and classic quests of 1990-s. The STEAD games features are: * very simple source code of the stories. (based on LUA); * graphical game interface; * supports music and images; * theme support - a game may change the interface look; * portability (originally written for Linux, depends on SDL and lua). SYNOPSIS sdl-instead [options] [game.zip or game.idf or path to game] OPTIONS -debug Debug mode (for game developers). -nosound Run the game without sound. -vsync Vsync output. (SDL2 only) -gamespath Add path with games. -themespath Add path with themes. -nostdgames Do not use default games. -nostdthemes Do not use default themes. -game Select game in gamespath. -theme Select theme in themespath. -owntheme Force game to use own theme. -fullscreen Run the game in fullscreen mode. -nocursor Do not use game mouse cursors (use system one) -hires / -nohires Set/unset the high resolution when run in fullscreen mode. -window Run the game in windowed mode. -resizable Resizable window (SDL2 only) -scale Scale window (SDL2 only) -noautosave Disable autosave load. -encode [encoded file] Encode lua file. Encoded file can be executed with doencfile("encoded file"). -idf Build idf file [INSTEAD data file] from directory. -mode [WxH] Use WxH resolution. -modes [,[,]] ... Define available resolutions. -software Force software rendering -renderer Select default renderer (SDL2 only) -fontscale Font scaling. -nopause Do not pause the game on window minimize. -hinting 0|1|2|3 Set the font hinting mode (helpful with infinality). -install [game in zip] Install game from zip archive -quit Quit :) -appdata [fullpath] Store saves and settings in appdata path. Path must exist! -chunksize [size in bytes] Size for audio buffer. Try this if sound lags. -version Show version and exit. -lua [arguments] Exec lua script (for game developers). -luac Check lua script (for game developers). -standalone Run game in standalone mode (no sandbox, no games selection ...). -noconfig Do not load saved config (run with defaults). -profile Using configuration profile. Profile file is the ini-styled file with parameter = value pairs. Where is parameters are arguments without -. Configuration file name is 'insteadrc' and it's located in ~/.instead/. Games can be downloaded from http://instead-games.sf.net. Unzip them in ~/.instead/games. CONTROLS Please, see tutorial. LICENCE This software is covered by the terms of the MIT license. WARRANTY None. COPYRIGHT AND CREDITS Peter Kosyh INSTEAD author. Ilya Ryndin Initial port to Windows. Mahno Aleksey, Anton Kolosov Port to Android. .dm Port to Mac OS X. Andrey Afletdinov Port to Windows CE. Vadim Balashoff Advices. Vladimir Zhirov Advices. Alexander Yakovlev manual.tex support. Serj Kalichev Advices and default theme correction. Vladimir Podobaev, Oleg Gvozdev Testers. Alexander Soborov Wiki support. Andrew Lobanov Games repository, slackbuild. Many others for comments, bug reports, games and ideas. SEE ALSO https://instead-hub.github.io Instead Version 3.2.1 INSTEAD(6) instead-3.2.1/doc/examples/0000755000175000017500000000000013267071773014564 5ustar peterpeterinstead-3.2.1/doc/examples/stead3/0000755000175000017500000000000013267071773015747 5ustar peterpeterinstead-3.2.1/doc/examples/stead3/dialog/0000755000175000017500000000000013267071773017206 5ustar peterpeterinstead-3.2.1/doc/examples/stead3/dialog/main3.lua0000644000175000017500000002602113267071773020721 0ustar peterpeter-- $Name: Диалог$ -- $API:stead3$ require "dlg" require "fmt" fmt.para = true fmt.dash = true dlg { nam = 'main'; disp = '...'; phr = { [[У тебя одна минута на то, чтобы объяснить мне, как добраться до хранилища.^ — Что?^ Бац! В глазах сверкнуло и боль такая сильная, что кажется, будто она — единственное, что я сейчас чувствую. Даже сильнее страха.^ — Одна минута, — говорит он и прижимает холодный кружок дула к моему лбу.]]; { '#что?', 'Что?', [[Бац! Оказывается, может быть ещё больнее, чем в первый раз.^ — Ещё раз скажешь "что", выстрелю.]] }, { '#что2', 'Что?', function(s) p [[Он стискивает зубы и стреля...]]; walk 'theend' end, cond = function(s) return closed '#что?' end, }, { 'Но я здесь не работаю...', [[ — Но я здесь не работаю, я вообще не знаю, где тут что!^ — Какого чёрта тогда ты делаешь в кабинке оператора? ]], next = '#кто ты?', }, { '#про подвал', 'Хранилище в подвале.', [[— Хранилище находится в подвале...^ — Уже лучше. А теперь, как туда добраться?]], next = '#хранилище'; } }; obj = { { '#кто ты?', { 'Я техник.', [[— Я просто техник, мне позвонили и попросили починить компьютер. Они иногда вызывают меня сюда, но я не знаю, где тут сейф, честное слово!^ — Занятно. Тогда почему на твоём бейдже написано "Старший кассир"?]], { 'Я его одолжил, чтобы через турникет пройти.', function() p [[— Я его одолжил, чтобы пройти через турникет, я часто так делаю, а то они никак мне собственный не сделают...^ — У кого одолжил?^ Пальцем в толстого очкарика на полу, тут же затрясшего головой.^ — Окей, спасибо, техник, — и спускает куро...]]; walk 'theend' end }, }, { 'Я от вас прячусь.', [[ — Я тут от вас прячусь...^ — А, ты один из посетителей?^ — Да.^ — Я вот не видел, как ты сюда пробегал, ты сюда зашёл ещё до того, как я вошёл в здание?^ — Да!^ — А как же ты через турникет прошёл?]], next = '#лжец' }, { 'Тоже решил денег взять.', [[— Да я вот решил тоже денег взять. Под шумок, так сказать. Хе-хе.^ — А, вон оно что. Но на тебе форма сотрудника банка. То есть, ты не только лжец, но ещё и вор? Двадцать секунд. Хе-хе.]], next = '#лжец' }, }, { '#лжец', { alias = '#что?' }, { alias = '#что2' }, { alias = '#про подвал' }, }; { '#хранилище', onempty = function() enable "#нет пути" end, { "По лестнице...", [[— Вон за той дверью в подвал ведёт лестница, по ней можно спуститься до главного коридора, из него в архив, а уже через архив к двери хранилища.^ — Ещё что-нибудь, о чём мне как грабителю полезно было бы узнать?]], next = '#лестница' }, { '#на лифте', "На лифте...", [[— В кабинете управляющего есть лифт, спускающийся прямо в хранилище. Только вряд ли вы до него доберётесь.^ — Почему это?]], next = '#лифт' }, { false, "#нет пути", "Нет", [[— К сожалению, больше путей нет.^ — Вот же задачка. Монетку бросить что ли... Это всё? Может ещё что-нибудь знаешь?]], next = "#про деньги", }, }, { '#лестница', onempty = function(s) p "— А другой путь есть?" pop(); end, { "О лестинце...", [[— На лестнице сторожит охранник с оружием.^ — Каким оружием?]], next = '#оружие', }, { "О коридоре...", [[— Поперёк коридора идут лазерные лучи.^ — Красные или зелёные?]], next = '#коридор' }, { "Об архиве...", function() p [[— В архиве люди пропадают...^ — Что?!^ — Люди, говорю, в архиве пропадают.^ — Да это я понял! Почему пропадают?^ — Не знаю, но, поговаривают, что нужно быть поосторожнее со шкафами F.^ — Почему?^ — Пропали сотрудники Фриманн, Фрекель, Фаркопс и Фонг. У вас какая фамилия?^ — Фицжеральд.^ — О...]]; if not empty '#лестница' then p '^— Дальше.' end end }, { "О двери в хранилищие...", function() p [[— Толщина двери в хранилище полтора метра.^ — Ого... — И замок «Sargent & Greenleaf».^ — Ой...^ — Пол внутри под напряжением десять тысяч вольт.^ — Ох...^ — А снаружи камеры.]]; if not empty '#лестница' then p '^— Понятно. Дальше.' end end } }, { '#коридор', { "Красные.", function() p [[— Красные, кажется. А что есть какая-то разница?]]; if not empty '#лестница' then p '^— Не твоего ума дело, дальше давай.'; end pop() end }, { "Зелёные.", function() p [[— Зелёные, кажется, а что?^ — Проклятье, у меня дейтеранопия.^ — Зелёный цвет не различаете?^ — Да.^ — Сочувствую.]]; if not empty '#лестница' then p '^— Спасибо. Дальше.'; end pop() end }, }, { '#оружие', { "Ружьё какое-то...", function() p [[— Не знаю, я не разбираюсь.]] if not empty '#лестница' then p '^— Дальше.'; end pop() end }, { "Benelli M4...", function() p [[— Benelli M4 Super 90, шестизарядный, с телескопическим прикладом, пистолетной рукояткой, планкой Пикатинни...]] if not empty '#лестница' then p '^— Всё, заткнись, давай дальше.'; end pop() end } }, { "#лифт", onempty = function() p "— А другой путь есть?" pop() end, { "Управляющий.", function() p [[— В кабинете скорее всего сидит сам управляющий.^ — И чего?^ — Он чемпион города по гарлемскому боксу.^ — Впервые слышу про такой бокс.^ — Основная особенность его в том, что во время боя разрешено использовать кастеты, биты и автоматическое оружие.]] if not empty '#лифт' then p "— Хмм, ну ладно, допустим, я с ним разберусь, что ещё?" end end }, { "Собаки.", function() p [[— Собаки.^ — Собаки?^ — Да.^ — Большие?^ — Очень.^ — Много?^ — Четыре.]] if not empty '#лифт' then p "— Ох... Ну допустим, с собаками я как-нибудь управлюсь. Что-то ещё?." end end }, { "Системы идентификации.", [[— В лифте стоят системы идентификации, которые пропускают только управляющего.^ — Какие системы?]], next = '#идентификация', }, }, { "#идентификация", onempty = function() enable "#по системам все"; end, { false, '#по системам все', [[- По системам идентификации всё.]]; function() if not empty '#лифт' then p "Ещё что-нибудь по лифту?" end pop() end }, { "Отпечатки.", [[— Сканер отпечатка правой ладони.^ — Это, теоретически, можно обойти. Дальше.]], }, { "Сетчатка глаза.", [[— Для этого у меня есть инструменты и необходимые навыки, — он зловеще ухмыляется. — Дальше.]], }, { "Вес.", [[— Датчик веса.^ — Хм. Сколько весит местный управляющий?^ — 124 килограмма. А вы сколько весите?^ — 61. Мда. Тут даже клонирующая машина бы не помогла. Ладно, дальше.]], }, }, { "#про деньги", { "Про деньги.", function(s) p [[— Знаю про деньги в хранилище.^ — Так, и что с ними?^ — Их там нет.^ — Как нет?!^ — Ну мы переезжаем в другой район города и все деньги и ценности уже перевезли сегодня ночью.^ — Так почему ты сразу не сказал?!^ — Ну про это вы как раз не спрашивали.^ — Проклятье!^^ И с этими словами он выбегает из отделения банка, где его ловит экипаж инкассаторской машины, приехавшей, чтобы как раз перевезти содержимое хранилища в другой район города. Хе-хе.]] walk 'theend' end }, } } } room { disp = 'Конец'; nam = 'theend'; } instead-3.2.1/doc/examples/webinst.lua0000644000175000017500000002662313267071773016753 0ustar peterpeter-- -- this is the network game installer -- Usage: instead -lua webinst.lua [] -- You must have installed luasocket module. -- local http = require("socket.http") local ltn12 = require("ltn12") INSTEAD = instead_exepath() --[[ Copyright (c) 2013 Gavin Kistner Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Status API Training Shop Blog About Pricing ]]-- local SLAXML = { VERSION = "0.7", _call = { pi = function(target,content) print(string.format("",target,content)) end, comment = function(content) print(string.format("",content)) end, startElement = function(name,nsURI,nsPrefix) io.write("<") if nsPrefix then io.write(nsPrefix,":") end io.write(name) if nsURI then io.write(" (ns='",nsURI,"')") end print(">") end, attribute = function(name,value,nsURI,nsPrefix) io.write(' ') if nsPrefix then io.write(nsPrefix,":") end io.write(name,'=',string.format('%q',value)) if nsURI then io.write(" (ns='",nsURI,"')") end io.write("\n") end, text = function(text) print(string.format(" text: %q",text)) end, closeElement = function(name,nsURI,nsPrefix) print(string.format("",name)) end, } } function SLAXML:parser(callbacks) return { _call=callbacks or self._call, parse=SLAXML.parse } end function SLAXML:parse(xml,options) if not options then options = { stripWhitespace=false } end -- Cache references for maximum speed local find, sub, gsub, char, push, pop, concat = string.find, string.sub, string.gsub, string.char, table.insert, table.remove, table.concat local first, last, match1, match2, match3, pos2, nsURI local unpack = unpack or table.unpack local pos = 1 local state = "text" local textStart = 1 local currentElement={} local currentAttributes={} local currentAttributeCt -- manually track length since the table is re-used local nsStack = {} local anyElement = false local utf8markers = { {0x7FF,192}, {0xFFFF,224}, {0x1FFFFF,240} } local function utf8(decimal) -- convert unicode code point to utf-8 encoded character string if decimal<128 then return char(decimal) end local charbytes = {} for bytes,vals in ipairs(utf8markers) do if decimal<=vals[1] then for b=bytes+1,2,-1 do local mod = decimal%64 decimal = (decimal-mod)/64 charbytes[b] = char(128+mod) end charbytes[1] = char(vals[2]+decimal) return concat(charbytes) end end end local entityMap = { ["lt"]="<", ["gt"]=">", ["amp"]="&", ["quot"]='"', ["apos"]="'" } local entitySwap = function(orig,n,s) return entityMap[s] or n=="#" and utf8(tonumber('0'..s)) or orig end local function unescape(str) return gsub( str, '(&(#?)([%d%a]+);)', entitySwap ) end local function finishText() if first>textStart and self._call.text then local text = sub(xml,textStart,first-1) if options.stripWhitespace then text = gsub(text,'^%s+','') text = gsub(text,'%s+$','') if #text==0 then text=nil end end if text then self._call.text(unescape(text)) end end end local function findPI() first, last, match1, match2 = find( xml, '^<%?([:%a_][:%w_.-]*) ?(.-)%?>', pos ) if first then finishText() if self._call.pi then self._call.pi(match1,match2) end pos = last+1 textStart = pos return true end end local function findComment() first, last, match1 = find( xml, '^', pos ) if first then finishText() if self._call.comment then self._call.comment(match1) end pos = last+1 textStart = pos return true end end local function nsForPrefix(prefix) if prefix=='xml' then return 'http://www.w3.org/XML/1998/namespace' end -- http://www.w3.org/TR/xml-names/#ns-decl for i=#nsStack,1,-1 do if nsStack[i][prefix] then return nsStack[i][prefix] end end error(("Cannot find namespace for prefix %s"):format(prefix)) end local function startElement() anyElement = true first, last, match1 = find( xml, '^<([%a_][%w_.-]*)', pos ) if first then currentElement[2] = nil -- reset the nsURI, since this table is re-used currentElement[3] = nil -- reset the nsPrefix, since this table is re-used finishText() pos = last+1 first,last,match2 = find(xml, '^:([%a_][%w_.-]*)', pos ) if first then currentElement[1] = match2 currentElement[3] = match1 -- Save the prefix for later resolution match1 = match2 pos = last+1 else currentElement[1] = match1 for i=#nsStack,1,-1 do if nsStack[i]['!'] then currentElement[2] = nsStack[i]['!']; break end end end currentAttributeCt = 0 push(nsStack,{}) return true end end local function findAttribute() first, last, match1 = find( xml, '^%s+([:%a_][:%w_.-]*)%s*=%s*', pos ) if first then pos2 = last+1 first, last, match2 = find( xml, '^"([^<"]*)"', pos2 ) -- FIXME: disallow non-entity ampersands if first then pos = last+1 match2 = unescape(match2) else first, last, match2 = find( xml, "^'([^<']*)'", pos2 ) -- FIXME: disallow non-entity ampersands if first then pos = last+1 match2 = unescape(match2) end end end if match1 and match2 then local currentAttribute = {match1,match2} local prefix,name = string.match(match1,'^([^:]+):([^:]+)$') if prefix then if prefix=='xmlns' then nsStack[#nsStack][name] = match2 else currentAttribute[1] = name currentAttribute[4] = prefix end else if match1=='xmlns' then nsStack[#nsStack]['!'] = match2 currentElement[2] = match2 end end currentAttributeCt = currentAttributeCt + 1 currentAttributes[currentAttributeCt] = currentAttribute return true end end local function findCDATA() first, last, match1 = find( xml, '^', pos ) if first then finishText() if self._call.text then self._call.text(match1) end pos = last+1 textStart = pos return true end end local function closeElement() first, last, match1 = find( xml, '^%s*(/?)>', pos ) if first then state = "text" pos = last+1 textStart = pos -- Resolve namespace prefixes AFTER all new/redefined prefixes have been parsed if currentElement[3] then currentElement[2] = nsForPrefix(currentElement[3]) end if self._call.startElement then self._call.startElement(unpack(currentElement)) end if self._call.attribute then for i=1,currentAttributeCt do if currentAttributes[i][4] then currentAttributes[i][3] = nsForPrefix(currentAttributes[i][4]) end self._call.attribute(unpack(currentAttributes[i])) end end if match1=="/" then pop(nsStack) if self._call.closeElement then self._call.closeElement(unpack(currentElement)) end end return true end end local function findElementClose() first, last, match1, match2 = find( xml, '^', pos ) if first then nsURI = nil for i=#nsStack,1,-1 do if nsStack[i]['!'] then nsURI = nsStack[i]['!']; break end end else first, last, match2, match1 = find( xml, '^', pos ) if first then nsURI = nsForPrefix(match2) end end if first then finishText() if self._call.closeElement then self._call.closeElement(match1,nsURI) end pos = last+1 textStart = pos pop(nsStack) return true end end while pos<#xml do if state=="text" then if not (findPI() or findComment() or findCDATA() or findElementClose()) then if startElement() then state = "attributes" else first, last = find( xml, '^[^<]+', pos ) pos = (first and last or pos) + 1 end end elseif state=="attributes" then if not findAttribute() then if not closeElement() then error("Was in an element and couldn't find attributes or the close.") end end end end if not anyElement then error("Parsing did not discover any elements") end if #nsStack > 0 then error("Parsing ended with unclosed elements") end end local games = {} function games_feed(url) local xml = '' http.request { url = url, sink = function(chunk, err) if not chunk then return 1 end xml = xml .. chunk return chunk:len() end } local game_name, game_title, game_size local tag local val = {} parser = SLAXML:parser { startElement = function(name, nsURI,nsPrefix) if name == 'game' then tag = false val = {} else tag = name end end, -- When "" or or "/>" is seen text = function(text) if tag and not val[tag] then val[tag] = text end end, -- text and CDATA nodes comment = function(content) end, -- comments pi = function(target,content) end, -- processing instructions e.g. "" } parser:parse(xml,{stripWhitespace = true}) end function game_lookup(name) local k, v for k,v in ipairs(games) do if v.name == name then return v end end end local function basename(str) local name = string.gsub(str, "(.*/)(.*)", "%2") return name end function game_download(name) local g = game_lookup(name) local url, size = g and g.url, g and g.size if not url then io.stderr:write("Game '"..name.."' not found.\n") return end local fname = instead_gamespath().."/"..basename(url) local fd = io.open(fname, "w") if not fd then return end io.stderr:write("Download: "..tostring(basename(url)).." [ ]") local sz = 0 http.request { url = url, sink = function(chunk, err) if not chunk then return 1 end sz = sz + chunk:len() local pcnt if size then pcnt = math.floor(sz * 100 / size) pcnt = string.format("%3d", pcnt); pcnt = pcnt .. '%' else pcnt = math.floor(sz / 1024 / 1024) pcnt = string.format("%4d", pcnt); end io.stderr:write("\b\b\b\b\b\b"..pcnt.." ]") return fd:write(chunk) end } io.stderr:write("]\n") fd:close() io.stderr:write("Written: "..fname.."\n") return fname end function games_list() local k, v for k, v in ipairs(games) do print(v.title..' ('..v.name..')') end end games_feed("http://instead-games.ru/xml.php") -- games_feed("http://instead-games.ru/xml2.php") local a = { ... } if #a == 0 then games_list() return end local f = game_download(a[1]) if f then os.execute(INSTEAD.." -install "..f.." -quit"); os.remove(f) end instead-3.2.1/doc/examples/stead2/0000755000175000017500000000000013267071773015746 5ustar peterpeterinstead-3.2.1/doc/examples/stead2/keyboard/0000755000175000017500000000000013267071773017546 5ustar peterpeterinstead-3.2.1/doc/examples/stead2/keyboard/main.lua0000644000175000017500000000051613267071773021177 0ustar peterpeterinstead_version "1.7.0" require "keyboard" require "xact" input.verbose = true main = room { nam = '?'; dsc = function(s) if read.text ~= '' then p "Привет, " p (read.text,"!") else p [[Как вас {xwalk(read)|зовут}?]]; end end } read = keyboard { nam = 'Имя:'; msg = "Поле ввода:"; } instead-3.2.1/doc/examples/stead2/keyboard/keyboard.lua0000644000175000017500000001441413267071773022055 0ustar peterpeterrequire "hideinv" require "kbd" local keyb = { { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", }, { "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", }, { "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", [[\]], }, { "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", }, } local kbden = { shifted = { ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = "$", ["5"] = "%", ["6"] = "^", ["7"] = "&", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", ["["] = "{", ["]"] = "}", ["\\"] = "|", [";"] = ":", ["'"] = "\"", [","] = "<", ["."] = ">", ["/"] = "?", } } local kbdru = { ["q"] = "й", ["w"] = "ц", ["e"] = "у", ["r"] = "к", ["t"] = "е", ["y"] = "н", ["u"] = "г", ["i"] = "ш", ["o"] = "щ", ["p"] = "з", ["["] = "х", ["]"] = "ъ", ["a"] = "ф", ["s"] = "ы", ["d"] = "в", ["f"] = "а", ["g"] = "п", ["h"] = "р", ["j"] = "о", ["k"] = "л", ["l"] = "д", [";"] = "ж", ["'"] = "э", ["z"] = "я", ["x"] = "ч", ["c"] = "с", ["v"] = "м", ["b"] = "и", ["n"] = "т", ["m"] = "ь", [","] = "б", ["."] = "ю", ["`"] = "ё", shifted = { ["q"] = "Й", ["w"] = "Ц", ["e"] = "У", ["r"] = "К", ["t"] = "Е", ["y"] = "Н", ["u"] = "Г", ["i"] = "Ш", ["o"] = "Щ", ["p"] = "З", ["["] = "Х", ["]"] = "Ъ", ["a"] = "Ф", ["s"] = "Ы", ["d"] = "В", ["f"] = "А", ["g"] = "П", ["h"] = "Р", ["j"] = "О", ["k"] = "Л", ["l"] = "Д", [";"] = "Ж", ["'"] = "Э", ["z"] = "Я", ["x"] = "Ч", ["c"] = "С", ["v"] = "М", ["b"] = "И", ["n"] = "Т", ["m"] = "Ь", [","] = "Б", ["."] = "Ю", ["`"] = "Ё", ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = ";", ["5"] = "%", ["6"] = ":", ["7"] = "?", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", } } local kbdlower = { ['А'] = 'а', ['Б'] = 'б', ['В'] = 'в', ['Г'] = 'г', ['Д'] = 'д', ['Е'] = 'е', ['Ё'] = 'ё', ['Ж'] = 'ж', ['З'] = 'з', ['И'] = 'и', ['Й'] = 'й', ['К'] = 'к', ['Л'] = 'л', ['М'] = 'м', ['Н'] = 'н', ['О'] = 'о', ['П'] = 'п', ['Р'] = 'р', ['С'] = 'с', ['Т'] = 'т', ['У'] = 'у', ['Ф'] = 'ф', ['Х'] = 'х', ['Ц'] = 'ц', ['Ч'] = 'ч', ['Ш'] = 'ш', ['Щ'] = 'щ', ['Ъ'] = 'ъ', ['Э'] = 'э', ['Ь'] = 'ь', ['Ы'] = 'ы', ['Ю'] = 'ю', ['Я'] = 'я', } local function tolow(s) if not s then return end s = s:lower(); local xlat = kbdlower if xlat then local k,v for k,v in pairs(xlat) do s = s:gsub(k,v); end end return s; end local function input_esc(s) local rep = function(s) return txtnb(s) end if not s then return end local r = s:gsub("[^ ]+", rep):gsub("[ \t]", rep):gsub("{","\\{"):gsub("}","\\}"); return r end local function kbdxlat(s, k) local kbd if k:len() > 1 then return end if s.alt_xlat and (game.codepage == 'UTF-8' or game.codepage == 'utf-8') then kbd = kbdru; else kbd = kbden end if kbd and s.shift then kbd = kbd.shifted; end if not kbd[k] then if s.shift then return k:upper(); end return k; end return kbd[k] end keyboard = function(v) stead.add_var(v, { text = '', alt = false, shift = false, alt_xlat = false}); v.hideinv = true if not v.cursor then v.cursor = '_' end if not v.msg then v.msg = 'Ввод: '; end v.ini = function(s, load) s.alt = false if load and here() == s then s._flt = stead.mouse_filter(0) end end; v.entered = function(s) s.text = ''; s.alt = false s.shift = false hook_keys('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); hook_keys('1', '2', '3', '4', '5', '6', '7', '8', '9', '0'); hook_keys("-", "=", "[", "]", "\\", ";", "'", ",", ".", "/"); hook_keys('space') hook_keys('backspace'); hook_keys('left alt', 'right alt', 'alt') hook_keys('left shift', 'right shift', 'shift') hook_keys('return'); s._flt = stead.mouse_filter(0) end v.left = function(s) unhook_keys('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); unhook_keys('1', '2', '3', '4', '5', '6', '7', '8', '9', '0'); unhook_keys("-", "=", "[", "]", "\\", ";", "'", ",", ".", "/"); unhook_keys('space') unhook_keys('backspace'); unhook_keys('left alt', 'right alt', 'alt') unhook_keys('left shift', 'right shift', 'shift') unhook_keys('return'); stead.mouse_filter(s._flt) end v.kbd = function(s, press, key) if key:find("alt") then s.alt = press if s.alt then s.alt_xlat = not s.alt_xlat end return true end if key:find("shift") then s.shift = press return true end if not press then return end if s.alt then return end local o = stead.here():srch('key'); return stead.call(o, 'act', key); end v.xdsc = function(s) p (s.msg) p (input_esc(s.text..s.cursor)) pn() local k,v for k, v in ipairs(keyb) do local kk, vv local row = '' for kk, vv in ipairs(v) do local a = kbdxlat(s, vv) if vv == ',' then vv = 'comma' end row = row.."{key("..vv..")|"..input_esc(a).."}"..txtnb " "; end pn(txtc(row)) end pn (txtc[[{key(alt)|«Alt»}    {key(shift)|«Shift»}    {key(cancel)|«Отмена»}    {key(backspace)|«Забой»}    {key(return)|«Ввод»}]]); end; v.obj = { obj { nam = 'key'; act = function(s, w) if w == 'comma' then w = ',' end if w:find("alt") then stead.here().alt_xlat = not stead.here().alt_xlat return true end if w:find("shift") then stead.here().shift = not stead.here().shift return true end if w == 'space' then w = ' ' end if w == 'backspace' then if not stead.here().text or stead.here().text == '' then return end if stead.here().text:byte(stead.here().text:len()) >= 128 then stead.here().text = stead.here().text:sub(1, stead.here().text:len() - 2); else stead.here().text = stead.here().text:sub(1, stead.here().text:len() - 1); end elseif w == 'cancel' then stead.here().text = ''; stead.back(); elseif w == 'return' then return stead.back(); else w = kbdxlat(stead.here(), w) stead.here().text = stead.here().text..w; end return true end } } return xroom(v) end instead-3.2.1/doc/examples/stead2/fonts.lua0000644000175000017500000000663613267071773017615 0ustar peterpeter-- example module require "sprites" require "theme" function font(name, size, scale) if scale == nil then scale = true end if not size then size = false end if not name then name = false end local v = obj { nam = 'styler'; fname = name; size = size; cache = { }; list = { }; scaled = scale; cache_get = function(s, w, color, t) local k = w..color..tostring(t) if s.cache[k].time ~= -1 then s.cache[k].time = stead.time() end return s.cache[k] end; cache_clear = function(self, age) local k, v local new_list = {} if not age then age = 0 end for k,v in ipairs(self.list) do local key = v.word..v.color..tostring(v.t) if v.time ~= -1 and stead.time() - v.time >= age then sprite.free(v.img); self.cache[key] = nil else stead.table.insert(new_list, v) if v.time ~= -1 then self:cache_add(v.word, v.color, v.t, v.img, nil) -- renew time else self:cache_add(v.word, v.color, v.t, v.img, -1) end end end self.list = new_list end; life = function(s) if player_moved() then s:cache_clear(2) end end; txt = function(st, txt, color, t) local s, e; local ss = 1 local res = '' if not color then color = theme.get 'win.col.fg' end if not t then t = 0 end while true do local start = ss while true do local s1, e1 = txt:find("\\", ss) s, e = txt:find("[ \t\n^]+", ss); if not s1 or not s then break end if s1 < s then s, e = s1, e1 ss = s + 2 else break end end ss = start local w if s then s = s - 1 end w = txt:sub(ss, s); local c if w then if s then c = txt:sub(s + 1, e) end w = w:gsub("\\(.)", "%1") w = w:gsub("[ \t\n]+$", ""); end if w and w ~= '' and w ~= '\n' then st:cache_add(w, color, t) res = res .. img(st:cache_get(w, color, t).img); end if not e then break end ss = e + 1 if not c then c = '' end res = res .. c; end return res; end; cache_add = function(s, w, color, t, key, time) local k = w..color..tostring(t) if not s.cache[k] then s.cache[k] = {} s.cache[k].img = sprite.text(s.font, w, color, t); if key and key ~= s.cache[k].img then stead.sprite_dup(s.cache[k].img, key); sprite.free(s.cache[k].img); s.cache[k].img = key end s.cache[k].word = w; s.cache[k].color = color; s.cache[k].t = t; s.cache[k].time = stead.time(); stead.table.insert(s.list, s.cache[k]); end if not stead.started and not time then time = -1 end if time then s.cache[k].time = time else s.cache[k].time = stead.time(); -- renew time end end; save = function(self, name, h, need) local n if self.fname then n = stead.string.format("%q", self.fname) else n = stead.tostr(self.fname) end h:write(stead.string.format("%s = font(%s, %s, %s);\n", name, n, tostring(self.size), stead.tostring(self.scaled))) local k, v for k,v in ipairs(self.list) do h:write(stead.string.format("%s:cache_add(%q, %q, %d, %q, %d);\n", name, v.word, v.color, v.t, v.img, v.time)) end end; } if not size then size = stead.tonum(theme.get 'win.fnt.size') end if v.scaled then size = sprite.font_scaled_size(size) end if not name then name = theme.get 'win.fnt.name' end v.font = sprite.font(name, size); lifeon(v); return v; end instead-3.2.1/doc/examples/stead2/trigger.lua0000644000175000017500000000124613267071773020117 0ustar peterpeter-- example module function trigger(act, cond) local v = {} v.nam = 'trigger'; if not act then error("Wrong parameter to trigger.", 2) end v.act = act; if not cond then cond = true elseif type(cond) == 'string' then cond = stead.eval('return '..cond); end v.cond = cond; v.life = function(s) if stead.call_bool(s, 'cond') then s:off() local r,v = stead.call(s, 'act') if r then return r, true end return r,v end end v.state = function(s) return s._state; end v.on = function(s, p) s._state = true stead.lifeon(s, p) return s end v.off = function(s) s._state = false stead.lifeoff(s) return s end return obj(v) end instead-3.2.1/doc/examples/stead2/cutscene.lua0000644000175000017500000000775713267071773020302 0ustar peterpeter-- example module require "timer" require "xact" stead.cut_text = '>>>' local function get_token(txt, pos) if not pos then pos = 1 end local s,e; e = pos while true do s, e = txt:find("[\\{]", e); if not s then break end if txt:sub(s, s) == '\\' then e = e + 2 else break end end local nest = 1 local ss, ee ee = e while s do ss, ee = txt:find("[\\{}]", ee + 1); if ss then if txt:sub(ss, ss) == '\\' then ee = ee + 1 elseif txt:sub(ss, ss) == '{' then nest = nest + 1 else nest = nest - 1 end if nest == 0 then return s, ee end else break end end return nil end local function parse_token(txt) local s, e, t t = txt:sub(2, -2) local c = t:gsub("^([a-zA-Z]+)[ \t]*.*$", "%1"); local a = t:gsub("^[^ \t]+[ \t]*(.*)$", "%1"); if a then a = a:gsub("[ \t]+$", "") end return c, a end cutscene = function(v) v.txt = v.dsc if v.left then error ("Do not use left in cutscene.", 2) end v.left = function(s) timer:set(s._timer); s:reset() end; if v.timer then error ("Do not use timer in cutscene.", 2) end v.timer = function(s) if not s._to then if game.timer then return game:timer() end return end s._fading = nil s._state = s._state + 1 timer:stop() s:step() return true end; v.forcedsc = true if not v.pic then v.pic = function(s) return s._pic end; end if not v.fading then v.fading = function(s) return s._fading end end v.reset = function(s) s._state = 1 s._code = 1 s._fading = nil s._txt = nil s._dsc = nil s._pic = nil s._to = nil s._timer_fn = nil end v:reset() if v.entered then error ("Do not use entered in cutscene.", 2) end v.entered = function(self) self:reset() self._timer = timer:get() self:step(); end; v.step = function(self) local s, e, c, a local n = v._state local txt = '' local code = 0 local out = '' if not self._txt then if type(self.txt) == 'table' then local k,v for k,v in ipairs(self.txt) do if type(v) == 'function' then v = v() end txt = txt .. tostring(v) end else txt = stead.call(self, 'txt') end self._txt = txt else txt = self._txt end while n > 0 and txt do if not e then e = 1 end local oe = e s, e = get_token(txt, e) if not s then c = nil out = out..txt:sub(oe) break end local strip = false local para = false c, a = parse_token(txt:sub(s, e)) if c == "pause" or c == "cut" or c == "fading" then n = n - 1 strip = true para = true elseif c == "pic" then if a == '' then a = nil end self._pic = a strip = true elseif c == "code" then code = code + 1 if code >= self._code then local f = stead.eval(a) if not f then error ("Wrong expression in cutscene: "..tostring(a)) end self._code = self._code + 1 f() end strip = true elseif c == "walk" then if a and a ~= "" then return stead.walk(a) end elseif c == "cls" then out = '' strip = true end if strip then out = out..txt:sub(oe, s - 1) elseif c then out = out..txt:sub(oe, e) else out = out..txt:sub(oe) end if para and n == 1 and stead.cut_delim then out = out .. stead.cut_delim end e = e + 1 end if stead.cut_scroll then out = out..iface.anchor() end v._dsc = out if c == 'pause' then if not a or a == "" then a = 1000 end self._to = tonumber(a) timer:set(self._to) elseif c == 'cut' then self._state = self._state + 1 if not a or a == "" then a = stead.cut_text end v._dsc = v._dsc .. "{cut|"..a.."}"; elseif c == "fading" then if not a or a == "" then a = game.gui.fading end self._fading = tonumber(a) self._to = 10 timer:set(self._to) end end v.dsc = function(s) if s._dsc then return s._dsc end end if not v.obj then v.obj = {} end stead.table.insert(v.obj, 1, xact('cut', function() here():step(); return true; end )) return room(v) end instead-3.2.1/doc/examples/stead2/menu-demo/0000755000175000017500000000000013267071773017634 5ustar peterpeterinstead-3.2.1/doc/examples/stead2/menu-demo/main.lua0000644000175000017500000000717113267071773021271 0ustar peterpeterinstead_version "1.6.3" require "proxymenu" require "hideinv" game.forcedsc = true minv = obj_menu('С СОБОЙ', 'exam', false, true); mlook = obj_menu('ОСМОТРЕТЬ', 'exam', true); mtake = obj_menu('ВЗЯТЬ', 'take', true); mdrop = obj_menu('БРОСИТЬ', 'drop', false, true); meat = obj_menu('ЕСТЬ', 'eat', true, true); mpush = obj_menu('ТОЛКАТЬ', 'push', true); muse = use_menu('ИСПОЛЬЗОВАТЬ', 'useon', 'used', 'useit', true, true); mgive = use_menu('ОТДАТЬ', 'give', 'accept', false, true, true, true); mwalk = obj_menu('ИДТИ', 'walk', false, false, true); game.useit = 'Не помогло.' game.use = 'Не сработает.' game.give = 'Отдать? Ни за что!' game.eat = 'Не буду это есть.' game.drop = 'Еще пригодится.' game.exam = 'Ничего необычного.' game.take = 'Стоит ли это брать?' game.push = 'Ничего не произошло.' game.after_take = function(s, w) take(w) end game.after_drop = function(s, w) drop(w) end put(minv, me()) put(mlook, me()) put(mtake, me()) put(mdrop, me()) put(meat, me()) put(mpush, me()) put(muse, me()) put(mgive, me()) -- put(mwalk, me()) status = stat { _Turns = 0, life = function(s) s._Turns = s._Turns + 1; end; nam = function(s) return 'Статус игрока: '..s._Turns..'^'; end }; lifeon 'status' put(status, me()); knife = obj { nam = 'ножик', dsc = 'На полу валяется ножик.', exam = 'Бесполезный перочинный ножик.', } main = room { nam = 'intro', hideinv = "true", dsc = 'Введение', exit = function(s) inv():add('knife'); end, obj = { vway('next','{Дальше}.', 'r1') } } cube = obj { nam = 'куб', dsc = 'В центре комнаты находится куб.', take = 'Вы взяли куб', exam = 'Мультифункциональный куб -- написано на кубе.', drop = 'Вы положили куб.', useit = 'Как можно использовать куб?', talk = 'Вы поговорили с кубом.', eat = function(s) return 'Вы не можете разгрызть куб.', false; end, open = 'Вы открыли куб.', close = 'Вы закрыли куб.', push = 'Вы толкаете куб.', give = function(s, w) return 'Вы пытаетесь отдать куб объекту: '..deref(w)..'.', false end, useon = function(s, w) return 'Вы пытаетесь юзать куб на объект: '..deref(w)..'. Получилось!' end, used = 'Куб поюзан.', }; sphere = obj { nam = 'сфера', dsc = 'В центре комнаты находится сфера.', take = 'Вы взяли сферу', exam = 'Мультифункциональная сфера -- написано на сфере.', drop = 'Вы положили сферу.', useit = 'Как можно использовать сферу?', talk = 'Вы поговорили с сферой.', eat = function(s) return 'Вы не можете разгрызть сферу.', false; end, open = 'Вы открыли сферу.', close = 'Вы закрыли сферу.', push = 'Вы толкаете сферу.', give = function(s, w) return 'Вы пытаетесь отдать сферу объекту: '..nameof(w)..'.', false end, useon = function(s, w) return 'Вы пытаетесь юзать сферу на объект: '..nameof(w)..'. Получилось!' end, used = 'Сфера поюзана.', }; r1 = room { nam = 'комната', dsc = 'Вы в комнате', obj = { cube, sphere }, } instead-3.2.1/doc/examples/stead2/dialog/0000755000175000017500000000000013267071773017205 5ustar peterpeterinstead-3.2.1/doc/examples/stead2/dialog/main.lua0000644000175000017500000002565713267071773020653 0ustar peterpeter-- $Name: Диалог$ instead_version "1.6.3" require "para" require "dash" require "quotes" require "hotkeys" main = dlg { nam = '...'; entered = function(s) p [[У тебя одна минута на то, чтобы объяснить мне, как добраться до хранилища.^ — Что?^ Бац! В глазах сверкнуло и боль такая сильная, что кажется, будто она — единственное, что я сейчас чувствую. Даже сильнее страха.^ — Одна минута, — говорит он и прижимает холодный кружок дула к моему лбу.]]; end; phr = { { 'Что?', [[Бац! Оказывается, может быть ещё больнее, чем в первый раз.^ — Ещё раз скажешь "что", выстрелю.]], [[ pon 'что?' ]] }; { false, tag = 'что?', 'Что?', [[Он стискивает зубы и стреля...]], [[ walk 'theend' ]] }; { 'Но я здесь не работаю...', [[ — Но я здесь не работаю, я вообще не знаю, где тут что!^ — Какого чёрта тогда ты делаешь в кабинке оператора? ]], [[ pjump 'кто ты?' ]] }; { tag = 'про подвал', 'Хранилище в подвале.', [[— Хранилище находится в подвале...^ — Уже лучше. А теперь, как туда добраться?]], [[ pjump 'хранилище' ]] }, { }, { tag = 'кто ты?', }, { 'Я техник.', [[— Я просто техник, мне позвонили и попросили починить компьютер. Они иногда вызывают меня сюда, но я не знаю, где тут сейф, честное слово!^ — Занятно. Тогда почему на твоём бейдже написано "Старший кассир"?]], [[ pjump 'бейдж' ]] }, { 'Я от вас прячусь.', [[ — Я тут от вас прячусь...^ — А, ты один из посетителей?^ — Да.^ — Я вот не видел, как ты сюда пробегал, ты сюда зашёл ещё до того, как я вошёл в здание?^ — Да!^ — А как же ты через турникет прошёл?]], [[ pon('что?'); pjump 'лжец' ]], }, { 'Тоже решил денег взять.', [[— Да я вот решил тоже денег взять. Под шумок, так сказать. Хе-хе.^ — А, вон оно что. Но на тебе форма сотрудника банка. То есть, ты не только лжец, но ещё и вор? Двадцать секунд. Хе-хе.]], [[ poff('что?'); pjump 'лжец' ]], }, { }, { tag = 'бейдж', 'Я его одолжил, чтобы через турникет пройти.', [[— Я его одолжил, чтобы пройти через турникет, я часто так делаю, а то они никак мне собственный не сделают...^ — У кого одолжил?^ Пальцем в толстого очкарика на полу, тут же затрясшего головой.^ — Окей, спасибо, техник, — и спускает куро...]], [[ walk 'theend' ]] }, { }, { tag = 'лжец' }, { alias = 'что?' }, { alias = 'про подвал' }, { }, { tag = 'хранилище', empty = function() pon "нет пути" end, }, { "По лестнице...", [[— Вон за той дверью в подвал ведёт лестница, по ней можно спуститься до главного коридора, из него в архив, а уже через архив к двери хранилища.^ — Ещё что-нибудь, о чём мне как грабителю полезно было бы узнать?]], [[ psub 'лестница' ]] }, { tag = 'на лифте', "На лифте...", [[— В кабинете управляющего есть лифт, спускающийся прямо в хранилище. Только вряд ли вы до него доберётесь.^ — Почему это?]], [[ psub 'лифт' ]] }, { false, tag = "нет пути", "Нет", [[— К сожалению, больше путей нет.^ — Вот же задачка. Монетку бросить что ли... Это всё? Может ещё что-нибудь знаешь?]], [[ pjump "про деньги" ]] }, { }, { tag = 'лестница', empty = function(s) p "^— А другой путь есть?" pret(); end, }, { "О лестинце...", [[— На лестнице сторожит охранник с оружием.^ — Каким оружием?]], [[ psub 'оружие' ]] }, { "О коридоре...", [[— Поперёк коридора идут лазерные лучи.^ — Красные или зелёные?]], [[ psub 'коридор' ]] }, { "Об архиве...", [[— В архиве люди пропадают...^ — Что?!^ — Люди, говорю, в архиве пропадают.^ — Да это я понял! Почему пропадают?^ — Не знаю, но, поговаривают, что нужно быть поосторожнее со шкафами F.^ — Почему?^ — Пропали сотрудники Фриманн, Фрекель, Фаркопс и Фонг. У вас какая фамилия?^ — Фицжеральд.^ — О... ]], [[ if not here():empty 'лестница' then p '^— Дальше.' end]] }, { "О двери в хранилищие...", [[— Толщина двери в хранилище полтора метра.^ — Ого... — И замок «Sargent & Greenleaf».^ — Ой...^ — Пол внутри под напряжением десять тысяч вольт.^ — Ох...^ — А снаружи камеры. ]], [[ if not here():empty 'лестница' then p '^— Понятно. Дальше.' end]] }, {}, { tag = 'коридор', "Красные.", [[— Красные, кажется. А что есть какая-то разница?]], [[ if not here():empty 'лестница' then p '^— Не твоего ума дело, дальше давай.'; pret() end]] }, { "Зелёные.", [[— Зелёные, кажется, а что?^ — Проклятье, у меня дейтеранопия.^ — Зелёный цвет не различаете?^ — Да.^ — Сочувствую.]], [[ if not here():empty 'лестница' then p '^— Спасибо. Дальше.'; pret() end]] }, {}, { tag = 'оружие', "Ружьё какое-то...", [[— Не знаю, я не разбираюсь.]], [[ if not here():empty 'лестница' then p '^— Дальше.'; end pret()]] }, { "Benelli M4...", [[— Benelli M4 Super 90, шестизарядный, с телескопическим прикладом, пистолетной рукояткой, планкой Пикатинни...]], [[ if not here():empty 'лестница' then p '^— Всё, заткнись, давай дальше.'; end pret()]] }, {}, { tag = "лифт", empty = function() p "— А другой путь есть?" pret() end}, { "Управляющий.", [[— В кабинете скорее всего сидит сам управляющий.^ — И чего?^ — Он чемпион города по гарлемскому боксу.^ — Впервые слышу про такой бокс.^ — Основная особенность его в том, что во время боя разрешено использовать кастеты, биты и автоматическое оружие.]], [[ if not here():empty() then p "— Хмм, ну ладно, допустим, я с ним разберусь, что ещё?" end ]], }, { "Собаки.", [[— Собаки.^ — Собаки?^ — Да.^ — Большие?^ — Очень.^ — Много?^ — Четыре.]], [[ if not here():empty() then p "— Ох... Ну допустим, с собаками я как-нибудь управлюсь. Что-то ещё?." end]], }, { "Системы идентификации.", [[— В лифте стоят системы идентификации, которые пропускают только управляющего.^ — Какие системы?]], [[ psub 'идентификация' ]], }, {}, { tag = "идентификация", empty = function() pon "по системам все"; end}, { false, tag = 'по системам все', [[По системам идентификации всё.]], code = [[ if not here():empty('лифт') then p "— Ещё что-нибудь по лифту?" end pret() ]] }, { "Отпечатки.", [[— Сканер отпечатка правой ладони.^ — Это, теоретически, можно обойти. Дальше.]], }, { "Сетчатка глаза.", [[— Для этого у меня есть инструменты и необходимые навыки, — он зловеще ухмыляется. — Дальше.]], }, { "Вес.", [[— Датчик веса.^ — Хм. Сколько весит местный управляющий?^ — 124 килограмма. А вы сколько весите?^ — 61. Мда. Тут даже клонирующая машина бы не помогла. Ладно, дальше.]], }, {}, { tag = "про деньги", "Про деньги.", [[— Знаю про деньги в хранилище.^ — Так, и что с ними?^ — Их там нет.^ — Как нет?!^ — Ну мы переезжаем в другой район города и все деньги и ценности уже перевезли сегодня ночью.^ — Так почему ты сразу не сказал?!^ — Ну про это вы как раз не спрашивали.^ — Проклятье!^^ И с этими словами он выбегает из отделения банка, где его ловит экипаж инкассаторской машины, приехавшей, чтобы как раз перевезти содержимое хранилища в другой район города. Хе-хе.]], [[ walk 'theend' ]], }, {} } } theend = room { nam = 'Конец'; }instead-3.2.1/games/0000755000175000017500000000000013267071774013276 5ustar peterpeterinstead-3.2.1/games/CMakeLists.txt0000644000175000017500000000050113267071774016032 0ustar peterpeterSET(GAMES tutorial3) IF(SYSTEMWIDE) FOREACH(GAME ${GAMES}) INSTALL(DIRECTORY ${GAME} DESTINATION ${GAMESDIR} PATTERN ".svn" EXCLUDE) ENDFOREACH(GAME) ELSEIF(STANDALONE) FOREACH(GAME ${GAMES}) INSTALL(DIRECTORY ${GAME} DESTINATION ${STANDALONEDIR}/games PATTERN ".svn" EXCLUDE) ENDFOREACH(GAME) ENDIF(SYSTEMWIDE) instead-3.2.1/games/Makefile0000644000175000017500000000054113267071774014736 0ustar peterpeterinclude ../Rules.make include ../config.make all: install: $(INSTALLD) $(DESTDIR)$(GAMESPATH) for f in *; do \ echo $$f;\ if [ ! -d $$f ]; then continue; fi;\ $(INSTALLD) $(DESTDIR)$(GAMESPATH)/$$f; \ tar --exclude=".svn" -cf - -C $$f . | tar -xpf - -C $(DESTDIR)$(GAMESPATH)/$$f;\ done uninstall: $(RM) -rf $(DESTDIR)$(GAMESPATH) clean: instead-3.2.1/games/tutorial3/0000755000175000017500000000000013267071774015224 5ustar peterpeterinstead-3.2.1/games/tutorial3/gb.png0000644000175000017500000000112713267071774016323 0ustar peterpeterPNG  IHDR ntEXtSoftwareAdobe ImageReadyqe<IDATxb4sC^a``ߊ+mS[_wo~Ȫr:]v'E>л?FUE!5Cn_?+ yF[L5]^gw^ +TWy'##Ż Ogwxci7;N07z*mn0|;?f`׊+7>ݷGĀ\{re7; 3%?qp׿߿Eeѐy lmY@?'`Jk<7BtΫ>0{+%_my3gCsv͋Llnqa3;/Y0ϟ@0o\d>S\3}l7s!30jJ3jJ#.氦9mY~;-m0m?2z!9[ A K~IENDB`instead-3.2.1/games/tutorial3/main-nl.lua0000644000175000017500000002223713267071774017270 0ustar peterpeter-- $Name:Nederlandstalige Snelstart Training$ instead_version "1.6.0" game.act = 'Dat kan niet.'; game.inv = "Hmm... Verkeerd..."; game.use = 'Dat werkt niet...'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Snelstart Training', act = function() walk('r1'); end, dsc = txtc("Welkom bij de INSTEAD snelstart training.")..[[^^ Het spel bestaat uit scènes. Elke scène heeft een beschrijving. Een beschrijving bestaat uit vaste en dynamische gedeeltes. Dynamische gedeeltes zijn bijvoorbeeld objecten of personages. Een speler kan de dynamische gedeeltes beïnvloeden door op de gemarkeerde te klikken.^^ De huidige scène heet "Snelstart Training" waarvan je op dit moment het statische gedeelte van de omschrijving aan het lezen ben. Het enige object in deze scène is het "Volgende" object. Die kun je onder deze tekst vinden. Om de rest van de training te lezen, moet je op "Volgende" klikken..]], obj = { vobj('continue', '{Volgende}'), }, }; paper = obj { nam = 'papier', dsc = 'Het eerste dat in deze ruimte opvalt, is een {blad papier}.', tak = 'Je pakt het blad papier.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Een blanco blad gelinieerd papier. Waarschijnlijk uit een notitieboekje gescheurd.'; end p 'Een blad gelinieerd papier waarop jouw naam geschreven staat.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Je schrijft je naam op het papier.'; end end, }; pencil = obj { nam = 'potlood', dsc = 'Er ligt een {potlood} op de grond.', tak = 'Je pakt het potlood op.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Een heel normaal houten potlood.'; end, }; r1 = room { nam = 'Les 1', enter = function() lifeon('r1'); end, life = function(s) if not have('paper') or not have('pencil') then return end put(vway('continue', [[Fantastisch!^Je hebt waarschijnlijk gemerkt dat het statische gedeelte van de scène beschrijving verdwenen is. Het werd vervangen met de omschrijving van de objecten die je gepakt hebt. Als je de volledige omschrijving nogmaals wilt lezen, klik je danwel op de naam van de scène bovenin (dus op "Les 1"), of je drukt op F5. Beide geeft hetzelfde resultaat.^^ {Volgende}]], 'r2')); lifeoff('r1'); end, dsc = [[Les 1. Werken met objecten^^ We gaan verder met de training. Je bent in een ruimte. Pak beide objecten die je ziet. Je kunt er simpelweg op klikken met de muis. Gebruik je liever het toetsenbord, gebruik dan de pijltjes toetsen om het object te selecteren, en druk op "Enter" om het op te pakken.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Les 2', enter = function() lifeon('r2'); end, life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Goed!^^{Volgende}", 'r3')); lifeoff('r2'); end, dsc = [[Les 2. Het gebruik van de inventaris — Deel I^^ Je hebt nu objecten die je kunt onderzoeken of gebruiken. Daarvoor is het inventarisscherm. Om een object te bekijken, klik je er twee keer op. Of je kan met de "Tab" toets naar het inventarisscherm schakelen en vervolgens het betreffende object kiezen met de pijltjestoetsen, en dan twee keer op "Enter" drukken. Om terug te gaan naar het gedeelte omschrijving kun je daarna weer op "Tab" drukken.^^ Dus, bekijk nu het papier, en bekijk daarna ook het potlood.]], }; apple = obj { nam = 'appel', dsc = 'Er ligt een {appel} op de tafel.', tak = 'Je pakt de appel van de tafel.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Je eet de appel op.'; end p 'Ziet er smakelijk uit.'; end, }; desk = obj { nam = 'bureau', dsc = 'In deze ruimte zie je een houten {bureau}.', var { seen = false, haswriting = false }, act = function(s) if s.haswriting then s.seen = true; return 'Een groot eiken bureau. Er is met potlood op geschreven: "Lorem Ipsum".'; end p 'Een groot eiken bureau.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; return 'Je schrijft enkele letters op het bureau.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Les 3', enter = function() lifeon('r3'); end, life = function(s) if not desk.seen or not have 'apple' then return end put(vway("continue", "^^{Volgende}", 'r4')); lifeoff('r3'); end, dsc = [[Les 3. Het gebruik van de inventaris — Deel II^^ Objecten in de inventaris kun je ook gebruiken in combinatie met andere objecten. Die andere objecten kunnen zich ook in de inventaris bevinden, maar kunnen ook objecten uit de scène beschrijving zijn. In de huidige ruimte bevind zich een bureau. Probeer het potlood daarop te gebruiken.^^ Om dat te doen, klik je eerst op het potlood, vervolgens op het bureau. Dat kan natuurlijk ook met het toetsenbord met behulp van de "Tab", "Enter" en pijltjestoetsen.^^ Kijk vervolgens naar de tafel. En pak tenslotte ook de appel op, die heb je nodig in de volgende les.]], obj = { 'desk' }, }; r4 = room { nam = 'Les 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continue", "Goed.^^{Volgende}", 'r5')); lifeoff('r4'); end, dsc = [[Les 4. Het gebruik van de inventaris — Deel III^^ We gaan nu verdere acties met objecten leren.^^ Om te beginnen schrijf je iets op het papier. Klik daarvoor op het potlood, daarna op het papier. Kijk vervolgens op het papier om het resultaat te bekijken.^^ Eet tenslotte de appel op die je meegenomen hebt uit de vorige ruimte. Klik hiervoor twee maal op de appel.^^ Natuurlijk kan bovenstaande ook weer met het toetsenbord gedaan worden.]], }; r5 = room { nam = 'Les 5', exit = function(s, t) if t ~= r6 then p 'Die les is al afgerond.^ Ga naar les 6, aub.' return false; end end, dsc = [[Les 5. Verplaatsen — Deel I^^ We bestuderen nu hoe je je verplaatst naar een andere ruimte. In deze ruimte zie je vijf links met naar verschillende lessen. Ga naar les 6.^^ Klik op de betreffende les met de muis, of gebruik het toetsenbord. (Gebruik de pijltjestoetsen om de juiste les te selecteren, en druk dan op "Enter".]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Les 6', exit = function(s, t) if t ~= theend then return 'Die les is al afgerond.^ Ga naar de laatste les aub.', false; end end, dsc = [[Les 6. Verplaatsen — Deel II^^ Verplaats jezelf nu naar de laatste les.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Laatste les', dsc = [[In het menu kun je onder andere een ander spel kiezen. Je kunt ook de huidige stand opslaan of weer laden. Om het menu te openen, toets "Esc" of klik met de muis op het hamburger icoon rechts onderin.^^ Je bent nu klaar om te spelen. Veel plezier!!!^^ Download spellen voor INSTEAD hier: ^]]..txtc(txtu("http://instead-games.sourceforge.net"))..[[^^ De achtergrondmuziek in deze training is van svenzzon en heet "Instead game-engine".]], obj = { vway('keys', 'Zie ook de {lijst met sneltoetsen}.', 'help')}, }; help = room { nam = 'Sneltoetsen', dsc = [[ Esc - Menu.^ Alt+Q - Afsluiten.^ Alt+Enter - Volledig scherm/venster.^ F5 - Ververs de scène.^ Spatie/Backspace - Scroll door de scène beschrijving.^ Tab/Shift+Tab - Schakel tussen de beschrijving en inventaris zone.^ PgUp/PgDn - Scroll de tekst van de actieve zone.^ Pijltjes rechts/links - Kies objecten in de actieve zone.^ F2 - Het spel opslaan.^ F3 - Een opgeslagen spel laden.^ F8 - Snel opslaan.^ F9 - Snel laden.^^ Sneltoetsen die afhankelijk zijn van de pijltjestoetsen mode (zie Menu -> Instellingen -> Overig -> Pijltjestoetsen):^^ Functie pijltje omhoog/omlaag:^  - in "Scroll" mode: scroll de tekst van de actieve zone.^  - in "Object" mode: kies objecten in het zichtbare gedeelte van de actieve zone.^  - in "Intelligente" mode: zowel scrollen als objecten kiezen in de actieve zone.^^ Functie pijltje omhoog/omlaag met Shift of Alt:^  - in "Scroll" mode: kies objecten in het zichtbare gedeelte van de actieve zone.^  - in "Object" mode: scroll de tekst van de actieve zone.^  - in "Intelligente" mode: scroll de tekst van de actieve zone. ]], obj = { vway('cmdline', 'Zie {commandoregel parameters}.', 'help2')}, }; help2 = room { nam = 'Commandoregel parameters', dsc = [[ -nosound - start zonder geluid;^ -debug - debug mode voor ontwikkelaars van spellen;^ -theme - kies een skin/thema;^ -game - kies een spel;^ -themespath - extra folder met skins/thema's;^ -gamespath - extra folder met spellen;^ -window - gebruik een venster;^ -fullscreen - gebruik het volledige scherm;^ -noautosave - schakel het automatisch opslaan en laden uit;^ -encode [encoded.lua] - encodeer lua source code (gebruik "doencfile" in lua om het te laden);^ -mode [WxH] - gebruik de schermresolutie WxH. ]], obj = { vway('keys', 'Zie ook de {lijst met sneltoetsen}.', 'help')}, }; -- vim: set fileencoding=utf-8 nobomb noet foldmethod=syntax nofoldenable foldnestmax=1: instead-3.2.1/games/tutorial3/nl.png0000644000175000017500000000070513267071774016345 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<WIDATxbπPX@`U 5/w9~LO)V*<'ρJ@~$(+  XD 3T j Ə??< AT40Ved@+o>Ƞ_^kן $߿ <{;g óOzH߯@u5@H?p20 _ uœ#@?`@hc`FDB2kgIENDB`instead-3.2.1/games/tutorial3/br.png0000644000175000017500000000112113267071774016330 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdHf@ `/03 @5F7g`￿6ZXl9 ϟ߿UOBY;K^?K_h@5T T5ToUդ $~涐eO; o bL_g~ UszhdČY/D:U6[R?f?OGsA_2ЖҶ0<t{W|x_D˒_.fg y)h)˖bU?}n[/I^r2|d   &go~Ko2,@ `H?$x$A^; 3˿kaܿ(@128"b9F1C/AnIENDB`instead-3.2.1/games/tutorial3/main-ru.lua0000644000175000017500000003213413267071774017302 0ustar peterpeter-- $Name:Обучение$ instead_version "1.6.0" require "dash" -- '--' replace :) require "para" -- be more "Russian" require "quotes" game.act = 'Не получается.'; game.inv = "Гм.. Не то.."; game.use = 'Не сработает...'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Обучение', act = function() -- only one vobj, no check, just goto walk('r1'); end, dsc = txtc("Добро пожаловать в режим обучения INSTEAD.")..[[^^ Игра состоит из сцен. Каждая сцена игры имеет описание, состоящее из статической и динамической части. Динамическая часть включает объекты, персонажей и т.д. С динамической частью игрок может взаимодействовать с помощью мыши, нажимая на подсвеченные ссылки.^^ Данная сцена называется "Обучение" и сейчас Вы читаете статическую часть её описания. Единственным объектом сцены является объект "Дальше", который Вы видите внизу текста. Итак, для продолжения обучения Вы можете нажать на "Дальше".]], obj = { vobj('continue', '{Дальше}'), }, }; paper = obj { nam = 'бумага', dsc = 'Первое, что Вы замечаете в комнате -- {листок бумаги}.', tak = 'Вы взяли бумагу.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Чистый лист клетчатой бумаги. Похоже, его вырвали из тетради.'; end p 'Лист клетчатой бумаги, на котором написано Ваше имя.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Вы пишете на листке своё имя.'; end end, }; pencil = obj { nam = 'карандаш', dsc = 'На полу лежит {карандаш}.', tak = 'Вы подобрали карандаш.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Обычный деревянный карандаш.'; end, }; r1 = room { nam = 'Урок 1', enter = code [[ lifeon('r1') ]], life = function(s) if not have 'paper' or not have 'pencil' then return end put(vway('continue', [[Отлично!^Вы скорее всего заметили, что статическая часть описания сцены исчезла, уступив место описанию предметов, которые Вы взяли. Чтобы снова посмотреть полное описание сцены, можно нажать на её название, отображаемое в верхней части окна -- "Урок 1". Кроме того, можно нажать клавишу F5 на клавиатуре, результат будет таким же.^^ {Дальше}]], 'r2')); lifeoff('r1'); end, dsc = [[Урок 1. Взаимодействие с объектами^^ Продолжим урок. Сейчас Вы находитесь в комнате. Возьмите оба предмета, которые Вы видите. Напомним, что для этого Вы можете просто использовать мышь. Если Вам удобнее пользоваться клавиатурой -- можно выбрать нужный предмет с помощью клавиш со стрелками и нажать "Ввод" для взаимодействия с ним.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Урок 2', enter = code [[ lifeon('r2') ]], life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Хорошо!^^{Дальше}", 'r3')); lifeoff('r2'); end, dsc = [[Урок 2. Использование инвентаря - Часть I^^ Теперь у Вас появились предметы, которые можно использовать или изучать. Для этого предназначен инвентарь. Вы можете посмотреть на любой предмет инвентаря дважды щелкнув мышью по этому предмету. То же самое можно сделать с помощью клавиатуры: нажмите "Tab", чтобы переключиться на панель инвентаря, выберите нужный предмет и дважды нажмите "Ввод". Чтобы вернуться назад к описанию сцены, нажмите "Tab" еще раз.^^ Итак, посмотрите на бумагу. Затем, повторите эту операцию с карандашом.]], }; apple = obj { nam = 'яблоко', dsc = 'На столе лежит {яблоко}.', tak = 'Вы взяли яблоко со стола.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Вы съедаете яблоко.'; end p 'Выглядит аппетитно.'; end, }; desk = obj { nam = 'стол', dsc = 'На этом уроке вы видите деревянный {письменный стол}.', var { haswriting = false, seen = false }, act = function(s) if s.haswriting then s.seen = true; return 'Большой дубовый письменный стол. На столешнице видна мелкая надпись карандашом: "Lorem Ipsum".'; end p 'Большой дубовый письменный стол.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; p 'Вы пишете на столешнице несколько букв.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Урок 3', enter = code [[ lifeon('r3') ]], life = function(s) if not desk.seen or not have('apple') then return end put(vway("continue", "^^{Дальше}", 'r4')); lifeoff('r3'); end, dsc = [[Урок 3. Использование инвентаря - Часть II^^ Вы можете действовать предметами инвентаря на другие предметы сцены или инвентаря. В этой комнате вы увидите стол. Попробуйте воздействовать карандашом на стол.^^ Для этого нажмите мышью на карандаш, а затем на стол. То же самое можно сделать с помощью клавиатуры: используя клавиши "Tab", "Ввод" и "стрелки".^^ Затем посмотрите на стол. И не забудьте взять яблоко, оно нам пригодится в следующем уроке.]], obj = { 'desk' }, }; r4 = room { nam = 'Урок 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continue", "Хорошо.^^{Дальше}", 'r5')); lifeoff('r4'); end, dsc = [[Урок 4. Использование инвентаря - Часть III^^ Хорошо, теперь изучим еще несколько действий с предметами.^^ Во-первых, напишите что-нибудь на бумаге. Для этого нажмите мышью на карандаш, а затем на бумагу. После этого вы можете посмотреть на бумагу, чтобы увидеть вашу запись.^^ Во-вторых, съешьте яблоко, которое Вы взяли со стола в предыдущей комнате. Для этого дважды щелкните по яблоку в инвентаре.^^ Все описанные действия можно выполнить с помощью клавиатуры так же, как показано в предыдущем уроке.]], }; r5 = room { nam = 'Урок 5', exit = function(s, t) if t ~= r6 then return 'Этот урок мы уже прошли.^ Пожалуйста, перейдите на урок 6.', false; end end, dsc = [[Урок 5. Перемещение - Часть I^^ Теперь изучим переходы между комнатами. В этой комнате Вы видите пять дополнительных ссылок с номерами уроков. Перейдите на урок 6. ^^ Для этого нажмите мышью на соответствующую ссылку. Вы также можете воспользоваться клавиатурой -- выберите нужную ссылку с помощью клавиш со стрелками и нажмите "Ввод" для перехода.]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Урок 6', exit = function(s, t) if t ~= theend then p 'Этот урок мы уже прошли.^ Пожалуйста, перейдите на последний урок.' return false; -- same as return "text", false end end, dsc = [[Урок 6. Перемещение - Часть II^^ Теперь перейдите на последний урок.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Последний урок', dsc = [[Вы можете выбирать игру, сохранять и загружать её состояние и выполнять другие действия с помощью меню. Для вызова меню нажмите клавишу "Esc" или нажмите мышью на символ меню (справа снизу).^^ Теперь Вы готовы к игре. Удачи!!!^^ Игры для INSTEAD можно скачать здесь: ]]..txtu("https://instead-hub.github.io")..[[^^ В обучении использован трек "Instead game-engine" от svenzzon.]], obj = { vway('keys', 'Посмотреть {список клавиш}.', 'help')}, }; help = room { nam = 'Список клавиш', dsc = [[ Esc - Вызов меню;^ Alt+Q - Выход;^ Alt+Enter - Полноэкранный/оконный режим;^ F5 - Обновление сцены;^ Пробел/Backspace - Прокрутка описания сцены;^ Tab/Shift+Tab - Переключение между активными зонами;^ PgUp/PgDn - Прокрутка активной зоны;^ Стрелки влево/вправо - Выбор ссылок в активной зоне;^ F2 - Сохранение игры;^ F3 - Загрузка игры;^ F8 - Быстрое сохранение игры;^ F9 - Быстрая загрузка игры.^^ Клавиши, поведение которых зависит от выбранного режима клавиатуры (см. Меню -> Настройки -> Режим клавиатуры):^^ Стрелки вверх/вниз:^  - В режиме "Прокрутка": прокрутка активной зоны;^  - В режиме "Ссылки": выбор ссылок в активной зоне;^  - В режиме "Умный": одновременно выбор ссылок и прокрутка активной зоны.^^ Стрелки вверх/вниз + Shift или Alt:^  - В режиме "Прокрутка": выбор ссылок в активной зоне;^  - В режиме "Ссылки": прокрутка активной зоны;^  - В режиме "Умный": прокрутка активной зоны. ]], obj = { vway('cmdline', 'Посмотреть {параметры командной строки}.', 'help2')}, }; help2 = room { nam = 'Параметры командной строки', dsc = [[ -nosound - запуск без звука;^ -debug - отладочный режим для разработчика игр;^ -theme <тема> - выбор темы;^ -game <игра> - выбор игры;^ -themespath <путь> - дополнительный путь к темам;^ -gamespath <путь> - дополнительный путь к играм;^ -windows - оконный режим;^ -fullscreen - полноэкранный режим;^ -noautosave - отключить автосохранение/автозагрузку;^ -encode [encoded.lua] - закодировать исходный текст lua (используйте doencfile для загрузки такого файла);^ -mode [ШИРИНАxВЫСОТА] - установить разрешение. ]], obj = { vway('keys', 'Посмотреть {список клавиш}.', 'help')}, }; instead-3.2.1/games/tutorial3/main-uk.lua0000644000175000017500000003177413267071774017304 0ustar peterpeter-- $Name:Навчання$ instead_version "1.6.0" require "dash" -- '--' replace :) require "para" -- be more "Russian" require "quotes" game.act = 'Не виходить.'; game.inv = "Гм.. Не те.."; game.use = 'Не спрацює...'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Навчання', act = function() -- only one vobj, no check, just goto walk('r1'); end, dsc = txtc("Вітаємо в режимі навчання INSTEAD.")..[[^^ Гра складається зі сцен. Кожна сцена гри має опис, що складається зі статичної та динамічної частини. Динамічна частина включає об'єкти, персонажі й т.і. З динамічною частиною гравець може взаємодіяти за допомогою миші, нажимаючи на підсвічені посилання.^^ Дана сцена має назву "Навчання" і зараз Ви читаєте статичну частину її опису. Єдиним об'єктом сцени є об'єкт "Далі", котрий Ви бачите внизу тексту. Отже, для продовження навчання Ви можете натиснути на "Далі".]], obj = { vobj('continue', '{Далі}'), }, }; paper = obj { nam = 'папір', dsc = 'Перше, що Ви помічаєте в кімнаті -- {аркуш паперу}.', tak = 'Ви взяли папір.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Чистий аркуш картатого паперу. Схоже, його вирвали з зошита.'; end p 'Аркуш картатого паперу, на якому написано Ваше ім`я.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Ви пишите на аркуші своє ім`я.'; end end, }; pencil = obj { nam = 'олівець', dsc = 'На підлозі лежить {олівець}.', tak = 'Ви підібрали олівець.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Звичайний дерев`яний олівець.'; end, }; r1 = room { nam = 'Урок 1', enter = code [[ lifeon('r1') ]], life = function(s) if not have 'paper' or not have 'pencil' then return end put(vway('continue', [[Відмінно!^Ви, швидше за все помітили, що статична частина опису сцени зникла, поступившись місцем опису предметів, котрі Ви взяли. Щоб знову подивитись повний опис сцени, можна нажати на її назву, відображену у верхній частині вікна -- "Урок 1". Окрім того, можна нажати клавішу F5 на клавіатурі, результат буде такий само.^^ {Далі}]], 'r2')); lifeoff('r1'); end, dsc = [[Урок 1. Взаємодія з об`єктами^^ Продовжимо урок. Зараз Ви знаходитесь в кімнаті. Візьміть обидва предмети, котрі Ви бачите. Нагадаємо, що для цього Ви можете просто використовувати мишу. Якщо Вам зручніше використовувати клавіатуру -- можна обрати потрібний предмет за допомогою клавіш зі стрілками и натиснути "Введення" для взаємодії з ними.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Урок 2', enter = code [[ lifeon('r2') ]], life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Гарно!^^{Далі}", 'r3')); lifeoff('r2'); end, dsc = [[Урок 2. Використання інвентарю - Частина I^^ Тепер у Вас з'явилися предмети, котрі можно використовувати чи вивчати. Для цього призначений інвентар. Ви можете подивитися на будь-який предмет інвентарю двічи клацнувши мишею по цьому предмету. Те ж саме можна зробити за допомогою клавіатури: нажміть "Tab", щоб перемкнутися на панель інвентарю, оберіть потрібний предмет і двічі нажміть "Введення". Щоб повернутися назад до опису сцени, нажмить "Tab" ще раз.^^ Отже, подивіться на папір. Потім, повторіть цю операцію з олівцем.]], }; apple = obj { nam = 'яблуко', dsc = 'На столі лежить {яблуко}.', tak = 'Ви взяли яблуко зі столу.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Вы з`їдаєте яблуко.'; end p 'Виглядає апетитно.'; end, }; desk = obj { nam = 'стіл', dsc = 'В цьому уроці ви бачите дерев`яний {письмовий стіл}.', var { haswriting = false, seen = false }, act = function(s) if s.haswriting then s.seen = true; return 'Великий дубовий письмовий стіл. На стільниці видно дрібний напис олівцем: "Любіть Україну".'; end p 'Великий дубовий письмовий стіл.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; p 'Ви пишете на столешні декілька літер.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Урок 3', enter = code [[ lifeon('r3') ]], life = function(s) if not desk.seen or not have('apple') then return end put(vway("continue", "^^{Далі}", 'r4')); lifeoff('r3'); end, dsc = [[Урок 3. Використання інвентаря - Частина II^^ Ви можете задіяти предмети інвентарю на інші предмети сцени чи інвентарю. В цій комнаті ви бачите стіл. Спробуйте задіяти олівець на стіл.^^ Для цього клацніть мишей на олівець, а потім на стіл. Те ж саме можна зробити за допомогою клавіатури: використовуючи клавіши "Tab", "Введення" й "стрілки".^^ Потім подивіться на стіл. І не забудьте взяти яблуко, воно нам знадобиться в наступному уроці.]], obj = { 'desk' }, }; r4 = room { nam = 'Урок 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continue", "Гаразд.^^{Далі}", 'r5')); lifeoff('r4'); end, dsc = [[Урок 4. Використання інвентарю - Частина III^^ Гаразд, тепер вивчимо ще декілька дій з предметами.^^ По-перше, напішить що-небудь на папері. Для цього нажміть мишею на олівець, а потім на папір. Після цього ви можете подивитись на папір, щоб побачити ваш запис.^^ По-друге, з'їште яблуко, котре Ви взяли зі столу в попередній кімнаті. Для цього двічи клацніть по яблуку в інвентарі.^^ Всі описані дії можна виконати за допомогою клавіатури так само, як показано в попередньому уроці.]], }; r5 = room { nam = 'Урок 5', exit = function(s, t) if t ~= r6 then return 'Цей урок ми вже пройшли.^ Будь ласка, перейдіть на урок 6.', false; end end, dsc = [[Урок 5. Переміщення - Частина I^^ Тепер вивчимо переходи між кімнатами. В цій кімнаті Ви бачите п'ять допоміжних посилань з номерами уроків. Перейдіть на урок 6. ^^ Для цього натисніть мишею на відповідне посилання. Ви також можете використати клавіатуру -- виберіть потрібне посилання за допомогою клавіш зі стрілками та нажміть "Введення" для переходу.]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Урок 6', exit = function(s, t) if t ~= theend then p 'Цей урок ми вже пройшли.^ Будь ласка, перейдіть на останній урок.' return false; -- same as return "text", false end end, dsc = [[Урок 6. Переміщення - Частина II^^ Тепер перейдіть на останній урок.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Останній урок', dsc = [[Ви можете вибирати гру, зберігати та завантажувати її стан і виконувати інші дії за допомогою меню. Для виклику меню натисніть клавішу "Esc" або натисніть мишею на символ меню (справа знизу).^^ Тепер Ви готові до гри. Хай щастить!!!^^ Ігри для INSTEAD можно завантажити тут: ]]..txtu("https://instead-hub.github.io")..[[^^ Для навчання використан трек "Instead game-engine" вiд svenzzon.]], obj = { vway('keys', 'Подивитись {список клавіш}.', 'help')}, }; help = room { nam = 'Список клавіш', dsc = [[ Esc - Виклик меню;^ Alt+Q - Вихід;^ Alt+Enter - Повноекранний/віконний режим;^ F5 - Оновлення сцени;^ Пробел/Backspace - Прокрутка опису сцени;^ Tab/Shift+Tab - Переключення між активними зонами;^ PgUp/PgDn - Прокрутка активної зони;^ Стрілки вліво/вправо - Вибір посиланнь в активній зоні;^ F2 - Збереження гри;^ F3 - Завантаження гри;^ F8 - Швидке збереження гри;^ F9 - Швидке завантаження гри.^^ Клавіши, поведінка яких залежить від обраного режиму клавіатури (див. Меню -> Налаштування -> Режим клавіатури):^^ Стрілки вгору/вниз:^  - В режимі "Прокрутка": прокрутка активної зони;^  - В режимі "Посилання": вибір посиланнь в активній зоні;^  - В режимі "Розумний": одночасний вибір посиланнь та прокрутка активної зони.^^ Стрілки вгору/вниз + Shift або Alt:^  - В режимі "Прокрутка": вибір посиланнь в активній зоні;^  - В режимі "Посилання": прокрутка активної зони;^  - В режимі "Розумний": прокрутка активної зони. ]], obj = { vway('cmdline', 'Подивитись {параметри командного рядка}.', 'help2')}, }; help2 = room { nam = 'Параметри командного рядка', dsc = [[ -nosound - запуск без звуку;^ -debug - режим налагоджування для розробників ігр;^ -theme <тема> - вибір теми;^ -game <гра> - вибір гри;^ -themespath <шлях> - додатковий шлях до тем;^ -gamespath <шлях> - додатковий шлях до ігр;^ -windows - віконний режим;^ -fullscreen - повноекранний режим;^ -noautosave - відключити автозбереження/автозагрузку;^ -encode [encoded.lua] - закодувати вихідний текст lua (використовуйте doencfile для загрузки такого файла);^ -mode [ШИРИНАxВИСОТА] - встановити роздільну здатність екрану. ]], obj = { vway('keys', 'Подивитись {список клавіш}.', 'help')}, }; instead-3.2.1/games/tutorial3/instead.png0000644000175000017500000002346213267071774017370 0ustar peterpeterPNG  IHDRCF>sBITUF pHYs >FtEXtSoftwarewww.inkscape.org<&IDATxwT?}„ ErFĬfEEQԋ _^1/PYDTPDA%HZ`aa̜T3,33ˢkgaf:߮NJ#ke1NPoO& \rY銣,le%g()>LscTB*,! yebeEdyNiqZ"H c />-]E~ӳ; t olԣ저{[ iKYBެT{)7I\<pp\<+CiJ@CGWOhE==sTMU60|)9Z*SR~n'W; |9-cȞK,V2tLte.Qj#ۼ"#U<~1>? _L^P|(:[#&",xr~xiUجϞ5#Xs/[ȋ+;V7[ø& %)ӽ=uKB\ÍoQ0XSQoټ !pI0ARJ)Kϖ3,} IL:,߉3O:.Ed'Ep69߫V5Y_7Y.饉3_h\Ti2}cs"KeSJ:e򛌕_*y\`cŮ',KY%hy@ͥ[HDj?=,9s!˖ɖZW뇝r ǔi3prЏʿA]rX㈔|[5^ky)I +͉ 2uoSSM-qPUm&{ȿ .şI ~~#t\4]tMSցW s c c)7{E)3Ը_Sٳr F~CܞX/'Ih@)u c8S8b<=*b36&ˇ$KT&ja"Z4hF^e,%6>:{xN =zgw@7)#}jHDd ԭeR'UUP=W2Wr?x/g"%$ꁹ=% Kk5!cϏ#Ucd-nq tY 0Q "d|V-T0` Vf`nw |Z_}g\+ޙ ',~Jji7#u LrW+!2)KH?g}֢7~=Ckyۢ3"ݺxߧ߯ΪM$4F곕X1J; ]G.:D> 캬wQ]'&v eN{rPG)=4.) s/U*'ˢ݊87L}:FK^Nz{^!YuakGkuyD2!wzⱈ>^|N|>U;P^-(.z ՗ cJe)1p?Y+SV5oT|[gngufDrW{eH=鷲ix%ǘ.B? *uϙ?.%a.V#UVI,V_f[㐤/eglJRBz-|9]&h>/6|¹&hjgM*g ÄS ҄t&6TM%[b=waWޘ{eKM$!;F}g]JNLt{yR{_TdS)-_)t,y=cgwu\ s6HfS⸆qҧB-4dVOkށt^}{ӌjC{89D)lT{C_.Mg|m:RZF9 ^kFcYՉ)k+6ֲXVW;T3kǤPŹonwg%ߘ̧Z4J' ނM V'rU-'u79'fĞ#{y+V$@$ҟ)'SjCW;3tv:B:Xgaiwu㲂 2^|J~ lޛfTIr٬B<}J\?/yKO_A \Foc6v҈2Tu7LvGCneNߌY1x$Sd>").0lS RMVߵ 9oLpO)SR\4_l<nY|C9JT&jě "%2GӧMJHL9'-;d ˂MNH*OF*O on /p/YB?Nݘ:Wˬ'SNpz뵫vtu.*  Qȼ.i7 ix fZʰW#vLEt{tFc4i%tWTqF!8k'z^QfҼU{(U>. <`!/V;g%AWoD/YGIcaMy(vN#zlt3QI:@6~ &֢ o/A͘eVd(jS:W,i-}$`>GM:Tu3oFf<kI0tk0L=:d|UoЗ7d?CDjⷋ݄M6`軡fekZ۷\>\% MtaH(G#.iPYV&ML֘rM^Ҭˮ{oP7Rm1 p[hZSno%:OWq\3v/)aՠf:!;#'|yK*bŚ)G}IWU~=S`XCO Bkڐ$p) ӬdKta?<{ UV3qqS{H(.TpP BjxFl'Ti}cJ*M0pi` .tJ$ki;D v`%zO}K^KܓiȗIyek=9C.kP^e;.giJ\ N>Iylpy ߙv MY3}Xm8wУ=y4?;;Ҕ>?J\#dpeP/t8V^-\Yu~N?04T75odBww>#LgC4ٱyqitS5]H+i5{1R4k\uO;]wqNܚTu:gތTSmyM)純GHiy=Yu7`ȔJC+jk_snc,v"fBɮA|i/ivc'$M??_Z̵>ʠ_$"[<=OCˈKԞ:OeSzW-g˰hTuD>hgҙe{Mix)|[Օ=KDs)4ɑ u$I.2Qq|~,egdPUciI*$"E0gJ*f؛MuF sޑI^&6P fm Wi9 &:t,gN ⨋} JU,t8|S! 0)::=v)W #V'vnh;5߂VCcfE=AkV\*Osp\剎!g|T(Gq<1S CTА<+ճnk7h!b2~j?ހ4;u+"˽A&{sE$̨I{ᓻֆOSo pzoU/u1&\GjxݢYAj@|up=jZj ? "˹13r'M1ufά*lɉr,mЅ*CZ:}踴GtT)K/sʉ,qDO=R)u2>Cp_&FSA\*Z` ӝl1$ngЁOqӑcn;g3A, 0\0f]VқF~& \F0^t'KYˮ<#t"+q5{ CѨf y+pW0K=vIH*;*(6Ϩ3ЖCzSُTXDOZmrYi2򾧚 _~N kG Ie@kф_)$6?>*[Y RzІh Jj*mbSYW)SǬObn Ue,`(uWf/;(wYRВ#ʋ 5flB`7Ty /s,$~Ȑ/ht,#&UO  JKڈ[lv/ ⑸)hdP:Y,꥽N5y/ʔ <)}nX=y}_l/=e)FuaWÞiK cEܒ24nD?n<'s}4z&<)2crJ*-n>FlX*)V]QoA<QbJ:K$ȭ7bQqnkv@ JTOUj΃|ϻ@s( hCNх$|Lܸ]xQN>i/ПLz\I>o2N=ly,,V+e,3|> A>' ya 3x^q4R0|.'JN8>c &q&yL"=wa>Vh9|ƛs:_^c4bx|fG%KXHn #wM8_DASQ&4J?ltS(50neP `IENDB`instead-3.2.1/games/tutorial3/it.png0000644000175000017500000000064413267071774016352 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxbd10ax*RU baPZ RIJJbb e&ba`?￿@Po QVh@ TFW @` 5 B1bbzh￿%(@ f F ߿T @Wa` @JCv > @c?ܒ o BFFF8PR)#(AlY8@ 8.VwQrIENDB`instead-3.2.1/games/tutorial3/main-de.lua0000644000175000017500000002214613267071774017246 0ustar peterpeter-- $Name:Deutsche Einführung$ instead_version "1.6.0" game.act = 'Das können Sie nicht.'; game.inv = "Hmm … Falsch …"; game.use = 'Das wird nicht funktionieren.'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Einführung', act = function() walk('r1'); end, dsc = txtc("Willkommen in der INSTEAD-Einführung.")..[[^^ Das Spiel besteht aus Szenen. Jede Spielszene hat eine Beschreibung, welche wiederum aus statischen und dynamischen Teilen besteht. Die dynamischen Teile beeinhalten Objekte, Figuren, usw. Ein Spieler kann mit dem dynamischen Teil interagieren, indem er mit der Maus auf die hervorgehobenen Links klickt.^^ Die aktuelle Szene wird »Einführung« genannt und Sie lesen den statischen Teil ihrer Beschreibung. Das einzige Objekt in dieser Szene ist das »Weiter«-Objekt, welches Sie unter dem Text sehen können. Um mit dem Lernen fortzufahren, können Sie auf »Weiter« klicken.]], obj = { vobj('continue', '{Weiter}'), }, }; paper = obj { nam = 'Papier', dsc = 'Das Erste, was Sie im Raum bemerken, ist ein {Blatt Papier}.', tak = 'Sie nehmen das Papier.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Ein leeres Blatt kariertes Papier. Vermutlich wurde aus einem Schreibblock ausgerissen.'; end p 'Ein Blatt kariertes Papier, auf dem Ihr Name geschrieben steht.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Sie schreiben Ihren Namen auf das Papier.'; end end, }; pencil = obj { nam = 'Stift', dsc = 'Dort liegt ein {Stift} auf dem Boden.'; tak = 'Sie nehmen den Stift.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Ein gewöhnlicher Stift.'; end, }; r1 = room { nam = '1. Lektion', enter = function() lifeon('r1'); end, life = function(s) if not have('paper') or not have('pencil') then return end put(vway('continue', [[Ausgezeichnet!^Sie haben vermutlich bemerkt, dass der statische Teil der Szenenbeschreibung verschwunden ist und durch die Beschreibungen der Objekte, die Sie genommen haben, ersetzt wurde. Um die vollständige Szenenbeschreibung wieder zu sehen, klicken Sie entweder auf den Szenennamen – »1. Lektion« – oben oder drücken Sie F5. Das Ergebnis wird identisch sein.^^ {Weiter}]], 'r2')); lifeoff('r1'); end, dsc = [[1. Lektion: Interaktion mit Objekten^^ Lassen Sie uns mit der Lektion fortfahren. Sie befinden sich in einem Raum. Nehmen Sie beide Objekte, die Sie sehen. Sie können sie einfach mit der Maus anklicken. Falls Sie die Tastatur bevorzugen, können Sie ein Objekt mit den Pfeiltasten auswählen und [Eingabe] drücken, um mit ihm zu interagieren.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = '2. Lektion', enter = function() lifeon('r2'); end, life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Gut!^^{Weiter}", 'r3')); lifeoff('r2'); end, dsc = [[2. Lektion: Benutzung des Inventars – 1. Teil^^ Nun haben Sie Objekte, die Sie untersuchen oder benutzen können. Dafür ist das Inventar da. Um ein beliebiges Objekt zu betrachten, doppelklicken Sie darauf. Alternativ können Sie zum Inventar mit [Tab] wechseln, und ein Objekt auswählen, indem Sie zwei mal die Eingabetaste drücken. Um den Zeiger zurück zur Szenenbeschreibung zu bewegen, drücken Sie erneut [Tab].^^ Sehen Sie sich das Papier an. Dann tun Sie dasselbe mit dem Stift.]], }; apple = obj { nam = 'Apfel', dsc = 'Auf dem Tisch liegt ein {Apfel}.', tak = 'Sie nehmen sich einen Apfel vom Tisch.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Sie essen den Apfel.'; end p 'Sieht appetitlich aus.'; end, }; desk = obj { nam = 'Schreibtisch', dsc = 'In dieser Lektion sehen Sie einen hölzernen {Schreibtisch}.', var { seen = false, haswriting = false }, act = function(s) if s.haswriting then s.seen = true; return 'Ein großer Schreibtisch aus Eichenholz. Auf seiner Oberfläche steht mit einem Bleistift geschrieben: »Lorem Ipsum«.'; end p 'Ein großer Schreibtisch aus Eichenholz.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; return 'Sie schreiben einige Buchstaben auf den Tisch.'; end end, obj = { 'apple' }, }; r3 = room { nam = '3. Lektion', enter = function() lifeon('r3'); end, life = function(s) if not desk.seen or not have 'apple' then return end put(vway("continue", "^^{Weiter}", 'r4')); lifeoff('r3'); end, dsc = [[3. Lektion: Benutzung des Inventars – 2. Teil^^ Sie können mit Inventar- oder anderen Objekten der Szene oder des Inventars interagieren. In diesem Raum sehen Sie einen Schreibtisch. Versuchen Sie, den Stift auf ihn anzuwenden.^^ Um das zu tun, klicken Sie mit der Maus auf den Stift, dann klicken Sie auf den Tisch. Alternativ können Sie dasselbe mit [Tab], [Eingabe] und den Pfeiltasten tun.^^ Dann sehen Sie sich den Tisch an. Und vergessen Sie nicht, den Apfel zu nehmen, Sie werden ihn in der nächsten Lektion benötigen.]], obj = { 'desk' }, }; r4 = room { nam = '4. Lektion', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continue", "Gut.^^{Weiter}", 'r5')); lifeoff('r4'); end, dsc = [[4. Lektion: Benutzung des Inventars – 3. Teil^^ Gut, nun lassen Sie uns einige weitere Aktionen mit Objekten lernen.^^ Erstens: Schreiben Sie etwas auf das Papier. Klicken Sie den Stift, dann das Papier an. Dann können Sie sich das Papier ansehen, um sich Ihr Schreiben anzusehen. Zweitens: Essen Sie den Apfel, den Sie vom vorherigen Raum genommen haben. Doppelklicken Sie ihn.^^ All diese Aktionen können mit der Tastatur durchgeführt werden, wie zuvor beschrieben.]], }; r5 = room { nam = '5. Lektion', exit = function(s, t) if t ~= r6 then p 'Wir haben diese Lektion bereits fertiggestellt.^ Bitte gehen Sie zur 6. Lektion.' return false; end end, dsc = [[5. Lektion: Fortbewegung – 1. Teil^^ Nun werden wir die Fortbewegung zwischen Räumen erlernen. In diesem Raum sehen Sie fünf Links mit Lektionsnummern. Gehen Sie in die 6. Lektion.^^ Klicken Sie auf den passenden Link oder benutzen Sie die Tastatur – wählen Sie den Link mit den Pfeiltasten aus und drücken Sie [Eingabe].]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = '6. Lektion', exit = function(s, t) if t ~= theend then return 'Wir haben diese Lektion bereits fertiggestellt.^ Bitte gehen Sie zur letzen Lektion.', false; end end, dsc = [[6. Lektion: Fortbewegung – 2. Teil^^ Nun gehen Sie zur letzten Lektion.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Letzte Lektion', dsc = [[Mithilfe des Menüs können Sie ein Spiel starten, den Spielstand speichern oder laden, oder andere Dinge tun. Um das Menü zu öffnen, drücken Sie [Esc] oder klicken sie das Menüsymbol unten rechts an.^^ Nun sind Sie bereit zum Spielen. Viel Glück!^^ Laden Sie sich Spiele für INSTEAD von dort herunter:^^]]..txtu("http://instead-games.sourceforge.net")..[[^^ Die Einführung benutzt die Musik »Instead game-engine« von svenzzon.]], obj = { vway('keys', 'Siehe {Liste der Tastenkürzel}.', 'help')}, }; help = room { nam = 'Tastenkürzel', dsc = [[ [Esc] – Menü.^ [Alt]+[Q] – Beenden.^ [Alt]+[Enter] – Vollbild/Fenster.^ [F5] – Szene neu laden.^ [Leertaste]/[Rücktaste] – Szenenbeschreibung scrollen.^ [Tab]/[Umschalt]+[Tab] – Zwischen aktiven Zonen wechseln.^ [Bild auf]/[Bild ab] – In der aktiven Zone scrollen.^ [Links]/[Rechts] – Links in der aktiven Zone auswählen.^ [F2] – Spiel speichern.^ [F3] – Spiel laden.^ [F8] – Schnellspeichern.^ [F9] – Schnellladen.^^ Tastenkürzel, die vom ausgewählten Tastaturmodus abhängen (siehe Menü -> Einstellungen -> Tastaturmodus):^^ [Hoch]/[Runter]:^  – Scrollmodus: In der aktiven Zone scrollen.^  – Linksmodus: Links in der aktiven Zone auswählen.^  – Intelligenter Modus: Sowohl Links auswählen als auch scrollen.^^ [Hoch]/[Runter] + [Umschalt] oder [Alt]:^  – Schrollmodus: Links in der aktiven Zone auswählen.^  – Linksmodus: In der aktiven Zone scrollen.^  – Intelligenter Modus: In der aktiven Zone scrollen. ]], obj = { vway('cmdline', 'Siehe {Kommandozeilenparameter}.', 'help2')}, }; help2 = room { nam = 'Kommandozeilenparameter', dsc = [[ -nosound – Ohne Ton starten;^ -debug – Debugmodus für Spielentwickler;^ -theme – Ein Thema auswählen;^ -game – Ein Spiel auswählen;^ -themespath – Zusätzlicher Pfad für Themen;^ -gamespath – zusätzlicher Pfad für Spiele;^ -window – Fenstermodus;^ -fullscreen – Vollbildmodus;^ -noautosave – Automatisches Speichern/Laden deaktivieren;^ -encode [kodiert.lua] – Lua-Quellcode kodieren (benutzen Sie doencfile aus Lua, um es zu laden);^ -mode [BxH] – Auflösung von B×H benutzen. ]], obj = { vway('keys', 'Siehe {Liste der Tastenkürzel}.', 'help')}, }; instead-3.2.1/games/tutorial3/ru.png0000644000175000017500000000064413267071774016364 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxb?BAX )̀l#/ dj?6 ==gd䌿 d@$$XX XoH7?_Iyy?|4D/ THRH\) @@,5|HӟD efE ?phU=L0HJ倢 `g1 H W*M  ?e8aIENDB`instead-3.2.1/games/tutorial3/instead.ogg0000644000175000017500000423716113267071774017367 0ustar peterpeterOggS﹦0&fvorbisDOggS﹦0z!Mvorbis+Xiph.Org libVorbis I 20120203 (Omnipresent)ENCODER=REAPERvorbis!BCVcT)FRJs1FbJBHsS9לk SP)RRic)RKI%t:'c[I֘kA RL)ĔRBS)ŔRJB%t:SJ(AsctJ$dLBH)JSNBH5R)sRRjA B АU@ P2((#9cI pIɱ$K,KDQU}6UUu]u]u 4d@H d Y F(BCVb(9&|sf9h*tp"In*s9's8srf1h&sf)h&sAks9qFsAj6s9j.s"Im.s9s9sspN8sZnBs>{sB8s9s9sАUA6q HEiȤݣ$h r GR TI) 4d!RH!RH!R!b) *2,2,2밳:0C KMXckZiJ)RJ) YdAF!R!r)BCV: d3 (  ?z=RN*!+ "8*QBׄ1fGI:uW*}fc0@mN |k,@Id V@ `,պ9B^;Ӟ1!#e-ЊV,  h]lV !QJHj$c9;`@ Tp xa\y5OϮMpk@n,,:h6p qB-{|,UQ=Ҕ`%,`U4 |ID@.Hֿ+p;! }yD'qpJ*(v R݉V\Ў g@ċ[,,"(9@? `OWmPWZBoRp *hUׅń|!:O,XgcM!l9$ AR4h^R._ .X*r@' _~eYDV Y|Q@" ! H~fx9R`,!uB誅TOQSD$"7G-hM@ifWM]Y#r & xՊ0,$ `]Ő MYsXҊ<Jz.8mQ=RJHA`ΪaI{rddXX6h_@D+I<&N"ĄXSJL I "+ Dӆ#S5c3O<ձzT!TӐʨZxy9)V'(! TӐ|\EŃK(ms+oV6XI ThÃih24V1=jxJ"DӠfUkJ[:ƢL t4Q4%k.t>f&HڱSElp=5vRc4u腌+nj\v{P`* oo=}MyH# mNKNzIIU0b̎\1F͖;1'~vt~!p y:zo }#K+M#DG=Ht&j"l=&D0z к!PC9L Z!GpMi  ~>Q3zB43 amy >F_ pO\@EeX̣T9kG2dD5bJ٘g8w#,(~Ld Zo!ȸLVN &6\Fpn CtD ȄӰ֮MڿlpONҖb\׾3—|*HߺՕ_J> ڷf!:o ].vn L!Vj,IG &*+*G> v1<))5y>&$!zC\E,²jg=<E(er5a`<Ѥb?=E-Kc'zqno&>rU82|=^kvxj\C{<$Sǀ_ңCjR:q0qA(р//vRo<d >,COE P./A8}"8N;4}k08HpErV Db_lbI⡕쉞21,zWTt@ܸf:\/]m_E:mK`5B9Dsj%bdN0 BRX A:a.T;~Kld0ZvbV =nX@)Qt5݆7; L=/& ?ހuCc$efy߉^XUn6B,q $~.1ba( c[.n P3,qJl>yEdX&GIhn}Dc@.CB8)t(*Lu@#AlY(4 Vg7=lD`o 9MTX>;n0r+X N˂kyw$xE̡$1 %< mk [^|+DC R9p+X,ر=[104 HXu1dMCbWO :2Bqq< 0u+b&ϩ«#/-xCLHTt(*=XOK@[ BzZmIVC䒸oOggS@﹦06&"#!""#)'$}~}wsyyGt3K^DkZ1Z~brqED?^Mt[auPv|;5e 2DL8]}\:,i"CA+ S'\YT^,DΤݗBCNd5LX*&D/F܃}:gp2s]]j=[#W/q(b"JrfI,SG 8亜)75U/` ~$"Jpk5O~>=b1A@m@]X{ F`?nt%* C\1ȯ8a`CDfa.US+/NFoP@`u3pk3yBL5A9>'~Tjj>Fm@@E>n͈3ŀӰj^T0xa/CiH YJDRxVogCB?e }zn!0Cv>no'n=u@&@Q"*Net*?(yi2< @߿?;XOp`Bܿ B( \GC}cqz|e!. jpVQT^Ŧ؈-'6G=84$#)OibhnOaSidwxeKHc~'r#H05`+ X Z XF#F5"Qe`:ҿȂs8^$&'7C41E*j*X"fSw[mf@`v"WApy4  )A;r>_k](Y 02#0 ,XPFaI ͒b ZK8<ݚV1*xj?K]D,>أVx6']BϞ )4w  >Ns|1xpUɣHliEVvT{nzrhYKD넸-wu="1*xRsRCL|c_ *Gnk Q_ 4{[wi*&#; }D7H, R $&TBd X@0nf؁9IAcKq-WNGJtxh4ag2:~騈O0أ3rX*@i:B^ *%xmc*<39:[d+ BAʭʠtrKc^HTFxwX\ġԫ'}̮FSrRΰ@& F]Py@&Ƣ y{P1I@ OJ53ޏ%fW(WT)TFw$0"BeW^Kle2a/Bo.w:Yj>Qwk:EO2 |{k ز{!g~@`Z U%sjX%{T1B{%!蹊b E ޱ.˻ca4,5^w47YJؚcUJ$=rbm6D}G_K#c ,ַrW0zz9~!iycZA0{BCAqF5"G@d XQQPa]1J^$&vbepC(0*E?*U 7Wz*c|ewjl15JDt&TJ0::wXwE1+r BFҊ$_H^#B}5B"FP!^lٔIrg۱z: kRXjq'E|Q.쨶ЁxiCkg9 UQ@Vxx$uH-f1y%T}nT WDBFd ص`Ą]4MEZq X7j]3{ JkdA_qG<)ǔ(iP?yB1e.pa:4 v+N$ްK닯U8ʗF@9 X"K(.(䤱j3Eɶg/b,A ׃Fh'>io|7ooV zȱ ց{6 @J.8EAi X" ,( 6pel fЛ0V$>N*:"%Dpm]he:07\aADY~;|& xVb4 a%Ze1 `5þ30K)zZbE;*c~~_J-()^QP avLZ`@gEuHE+^t`p;)]@t``%规1֞xk`rcßÅO7w+ w6ax H6ݝK2ܩ՜|n@~ tFB={Ņ/v?6w^>em6nbٚ p"OGYOꀃFQf$`~[+CtU&ڸe0G`0HJXTR X"r`PY|"ދ^dm2Ĭ=Bm6D#l cΛR@ζEBH^5~ cĺ}buL+_q}M+:)9j#x`@Rjg.* AjADa [.Ĕ&&N:lآ8GIDD @˶Es7Ls2~, _.pra#[!OGi\vu67FbdI8&EEE =>;Q>9V{ LT^#%"?Ӹd`r윫 +IۋD }Q@ !8 ^JJOO@rV?B@a1-TIHr^l-+Ԟ'C xKS]^G" $;F8jvgWF׏~n .fc[Zv|0!F8 Z,dP"JE(1`0 {nemHr5s{ EeKpr4p# ^Ie}>{㓘o])Q E7kP0ȁ숚@j\ˑźjR&ea?BFR DX 11a T>|8Jnt2&+BM0K=ҡ? &Vre3ߕv[6"?uE<]M4Єs/;@E5V,.J*g BK2Z P*7ncH.Y,v1]OggS@^﹦0]?!{{"&&%{NGÞ(5ӋB>eQhuGw;2{-37c _ iY06ds o>hP,$ &dD-2X?"QEYuչ>u2P-D M0>.EPTpRO0G3O!wq TN彝mAC*W|@VJJ(J] hPm="/_Q 4X!a]n\2OT!^;tr <1f FœϦ1²0lE'ct{vJgo tB0 !ezv`P^ pcX Ke+Q) Os] R'Zm[^X kɱ Ol*HZ}o OCg|(<<^ʼn1.H> 0Z(b{0  9w2FDDF2 ,e>KxebL='9}ArP z 17IO'$\7S=vi'O 8;,- :7%Q вpm r  cUKvbP0Ʌb 5~ު-05rd显IkaH[>WHӉs=|U8GK!>-uRNW9rUhF{.UkAqd-tDU#Y&!2*>ՠvy+Sq(i$‡+?[®`."H_ m'hP„W+{`M :ɠPwML+Y  @A Zqx $RuP- i*]nHH bIk 얏il@/MŢh} >VȥV["l } *Xv0nv#Y !'4@-u&3lF>barˣcd[ ?3FTJRveR0 SMҬ-xrz]G f@- &I2nPU##fkXTdP!0%aظe`L, ğCp!ޛcB`HoyKM&܀%Ks&inG_[iU>O)N*T͵ЗO띟dHW`H08 _PVDޕV\t$]mo|' }!N5RJ8*ɥ`QΑ~xI>uQON0l2y͌CN]їATAX0~erMxv"ckrmI\KYR V pcytPIowa`xMߴnX`z~`vh h '60Frx_~L>Oh_ǫJ7U@ ϫy_;eua+'DZU`rz1EP6su4΅N+d,$Zc{of3=!hC%H+Q)G} M/5&\wzx]CzVL)Q~.V7k<׮Gv$=DI \&@niZw;ucXQbjdFL3d%Zǚ*&4vX]CI:g[H5PF %&W i]7&$ z;z=Xu+,3a&w$S fyH28a//0^~b㹈0v98G}DڛɫeJtMZK'ZbM ""%"^z`{z$Zхex I`KHY?VsnMj)4Qd-i) K*ɥxQ| aGH|#kRb %@ ( pV"$BS54Eۍ]i=|0BsU՛R@3a,n2ۄ[0'mFkv@lI޸_XWf;'z!s2-zlvt ?50'wgë}ɫܮ=&sH0q3G"{ lơ^<eӦM$U6FXJX|DVc>E [ĥ3=\zO}V8o{}_?҈WoC e,[-t&ᜮEW-G]naJk3X!2~4C v3נޫōe(ٕh @3bE@ZN }`TYwy6~&1͓5a{ospݞkw-wE6WmO!MDDolcS}k!LJ踔s%:+lQNSڌLYJl̺w]x2T]Ty9֣Z\SK3h?6xMHzbBJHD$hM};AWC2߾s:=o؝$hQ!B IFuB"4ɳ OuHow׽-x zXR)n>CR&L @9]@t+kjW"z"'"v#`8؏A^KflMPpm-ر#N0aX&$B!c:%-Uj: J˅ >.wlO-?ω[7+; B ȡc/% n=AfOӁ@Z 3P8h b ԁW!$q|aŚ`=\圪tU|H~z@"~lFv K;IicG й?NPA:GhZsE0|"JvlᰁLpc0o ?BLǻbPy5NkFH"r'"JT|6;cv|{۷AY c(ӃU@[R8@/L. n7 $ ^؜ ()6]Poz+ lf͝%Sl HיހRKp(Cx}(8?Nʮ;iِۃia U\f) 8 8ܩ(#i*|<>+^Nb%- ij aZ˜jNtg`AK1i4!R @U'zE_oFm&P S`!2jyRPY-`ݛtR% OggS@﹦0Es1|#"%#"#()""%! )(&}%!#!""(%)~t?'sn;pMwGc=ݡ}<])NG&L֫cIwbY_=vy!PW` xBD%1Hv~vY_ lnqV^S&P>m&o`A2S$<%L.6j3`Xx׾p .r;ZY Fcܧzs4>6d0#oqB\J3 wE]K,[fEۜ IOa̫DH 볓E|wӞ!6Z^p 6 ë/d . Qt pB Kj3n˅ǯYHz k4ʪ>5Z$U #; "Sl]¡Dp>0WkM`#hIb[+DGC(*TJ\ KoOO(`_O3m5Y1U ~QMi蜇\!JQ bq>fDla,%+V4E:^ޞ80 姫ɈCn}?I^۲ߐ@8寉/PsV@B!FAIa\"qASSnrC%ok EF2 ;ŞIKKk+ :LS 4Xu'^ϑQ"8z#^`n w2[7: _JGjG![Ypt,4J6HM 1|*K*Mt_OzO`o'Ʊ^5(KKD`$Ms@M o4̪ B 3¼RkW# .vdue|p :++m +意cȌ_T?}hngP䓗Cx냡znEw@OF+@5rŨ'Pihƥx;GD2HL .M>b zxϢ9FR- Bb/A'HD'REC4 ҊɛgTϋ+Jˊ/ ZGJphCJE0@Eepy̰]p[(e,i"d J "cPr,h-чATL#&[NezV+7Qy>4"9ʹh˿ܜic6~ y\}5x=Nh%N*7|5"Cܨ Ll'~F˛#Fس5zQ4"h!yڡ}q@6pt|/ ! Lk{h89k<7cȬLß+b0"8AdY|SՒzmWfBL5(hh;k612nAno>dYh@Oq348{Ctb$͛7H*Z$[ttEeIo*!uPHGGzy\|e>Y0*84EDP8?>ʿtUy4R鶥B́*I/árGR5X _HwXoŊ8. 1*Gm.2bO !C#<"DF:}nܰl9H~?[]BW!dw"Ŝ URz \tF+ܰ yɡXY$*+?a ^zxp9er|9{_¢$CSS3\\i: ~x]lo6=h"UO% +W"my6@; NY4:\#KO psA#NB>K`3i2d,irb1SS;Y8 e)_2O#) "r`cn"C_tR@@/R׉7 %dtsTFL.P2I3^;t2ΌQ]Z_p*#DxQ{o{G?ːf*d'uZTzx#X,@u Uhfv F[X!OcDR up1VIk.n ~ C,s\'zs":,BB(~AyԻIm7Ϲ/(ltÀ6Q54U:N迺dmB:NQj E p Y{n^Bi&ל`ˬGR/s ջ`y2b `={m"P"p&V:@K*VfyZF0@@ondĂj ^KDKK042GVb[c➫{~cy"!S<$0d?9W.}] P ^y~@\X tB ɦN50X kIJMH ut,QQBEo/}*qb9/BQPҷ׌Jٌ~bV$ry^䆛Mmџ-z化9= M  L9h@s DnWk^ $eBLJ 6vm{v;ɘڬrTT iڰyb]Fw•xMW5)GDs6twR\Ua^UMԦ- ~Uj9igd]1*+^].E0%'OTR0\n)|&T:֍ cР~9'Ә Cm>9V_ ݶ'JWs.{qI?hN%Uv pPpUuq/0z׽~J`VD FN̊(@. Vq(9F< wqHRjihn0>0 OtR ^gpFhXA BHJ$,~ ĥXSuQB &AE) >J}=t&^ˎQ%ANz ˢ|(o]։FxoK뾼ʦ @RzӋL\gL!5VZX~`LGgqS2 !SBT, OggS@C﹦0Zp~z}%=F'*f͎X˦R pAY| '"G'cS@&6 d~3 *q_68'(``z ^a_`F' >rmA6/ɔhNrD PNo?<zE@@ >t@feN ȭW k^8-kuQ *:DqlZ& j`Q1LN|73;+1/~ublmvqk>t Jߐ0VĖ6InD2WndU%+zo[49 ~c-zɨHf)IJPRƇՏ]HJcw_(-׌xHŢOe*=*B']t5 )j8,8, F훁 ue.ԒEܞ=]¹ if)>6%lu®8 yjBd!ݍ f~NF 6h 0F Q0wPp z Y X9y ਫ਼I r=\>[6tMc u<=s*B<\z)* xbq|zYO8zb*z iC[vQZ;W(=P+Wz+*,%!x*bZ~ fm"hknIH\p(?{ֆ{N';~kz0BGB4u;DxKDO:&,3QT}`|lP+RIBZ Bť7nޏ%~tpcٖCSR#%M] 1$έ4O¿F\տ#N"X5Z"`  ->,_ |BD qtH#""{ K. ` .mnW*p\':YVfѢمd4;Q.԰A{2BCsJ@j!$&ڭjAz!q_t;j ڦJT*Ujt!0IJ K5d\ssNCG ^ u4Ng|BITb(oj}on`8H Gs$)* @*պ]܃TѮC-9k= L1!$eN;)J`r٪ [v`p"$h{nm&C`?7;]h8 ^ld[/ŪG7kaX9WQ X̬Gw#ɑ\ %+ç(r<Y,1!lQ F) \[SG*6U!%t̬5؀i8T^.':0m:GCo%u_2?G9-z_B'kWƈ(4p{KbX*Mጐsq,-hˎ%CC[ H=I{`W%J3b4xɖe gYCszZ p^ۣ*F X/[;_` n D*̈́5Yq2H>"Y|%ѣ)"da_p2!-e:_XkB/"%(qM VzhGFP+(pܬ #^{N`ۂdD0{ @S8R&~`7Ual3HCC@ \nq\$zq2H #Xn%!I7\nBVrĀ,Ș ^K.h >D$Kibf qL vU]!$|K:Oކ:G: 0#MO$Z@M| "Pw`.,4)r[D0-"*>pMLgM[\qSG ΃u*2*:]}/_ uDD\xn|d{2cZ$\iq[vhlaM@*{Qy=GDD0^:~"&+gnx녷$vobjDXNXs7Ӡu3 .\vD0տ LuLt 7@ >>p d .Dݝ:vv9կ!>1/S.Y椔0%X~/g$\mnC︅WRJ9>7R\,@VW@`4 `P2]].qPtAUQF2>^[ĚAt[ikl paxs\q"Jc-rc~aOcAlt#Zr׿}}j*v \]a G$gUIjb 6fZ`c cJ$+>b"Z$zp[lڂa `mECrhODD`-22q-h}'}oز(5V@^VEA(E(βRT"tPم1QLu)52 PF(5d^\V[A|V\> 8.T0'&%qub\=M쯇K7b{3nVQ{R6rHc ,B4.v p})cɊA@V X,)BW=k%Jk_ђoҮ$zh#H&b88TX))M(b9Ѹ{GOm~p=3?ɥc˷j%qņzS jb+D@0Av_@\!B]">k~-FZLpaĎCg(j)9/>;vB<nݱså\).Bҍ.qnQ5?zmP'eaMnABd/2eICC CZhhnP&,0= T}{D$t"4"\*On^jM#{bAZrsm/S+'V(;oϿCW޾}p0|`]XDfXg 1mD;0-E-]Gʅx!7p41atM$bnq,$Kp5A6-*䄧~i6xcB3AJ4p~#x{ęymNH6zݗ#8_Q}`ߵ`Unt n\ @BₛB$|OggS@﹦0WU&(&%v&##!"%,))J Ѷw794<~i_-wC[H,gK ޹vxޑ&AMeD aڝ~L*a Dbx?E=`z dP]n0YDQ-ȐznK=,nfODLpnL)>d4W?HǑ mδ@o,Gފ߻N#NB@ e B7MUdr+$N{aYnߪw:\JדN~RJ$2Zb};=0fZhc;~ XTvŗxDӡN?ݸ_}EooyJD(Xrwt'=pӴ@ fA,u%R&7Tqqp#1%h)BCp0+6۶VqA~upIdfɝa^&MmڮOw^M7]cin|[e~to%ҿ'e2Bu<]i9<[b0=aZkVZ7QQeE 7`d]Iܸ9L, <#{z2!~UKT<2;NCoZL: Z>MDDyaͼM{:Y9?cx栴%B"ZˆCml]L-棌WpqVe2!%n35QD6bTf%3"x ;qsAo؂-qr(?)f%=hai:vZHnyhˈJX<Ҥ'0r|ӓ$8=ޚuRi_rZG=/Uj?&HӑmBH%EV)ACB \n.1i< ő'{Y` ,~N7^rdEKH'n,5Q"h4Xn1޿a0+ٺ|F?ɪAʽ\J܀ B6!.(!!8N蜷X 75U`]]Ou%%FF6s25#IAy&7(q%ئy #`P=Uo]zו i ZxzSt>krcpvq"(~ˮRzW]zPyZ;J"Z>gԶ6jQ%QWBlm 2RPE~LciUQ쉪\*fxR=m/۞_ )ZTD1s .5e}C r>E2g r|]Q%(]#cV5&@T֏TR%#ic>Ô]ư?R9CQ }Vf}?lі5Dlԧݼb+fܺ% ,!ᔑZ-R>%cm}O&ųdڟjm6llM2懮xK),*FS;N5Lk#U/ 8QP3ĸ~DUЪ*3gschRh%f;mnoBDY#+>ᜂrrV I﶐ xjz:Tf#rsou,OXЯWwc}gvd-;FHT}Bzs2_bm {22j@Wta{#V7/v1q hzw(bRy I*~;N'iX,Uwׂ=)UbbpNwH0a^DcB"m¢ :`|Q6zBttz}'$\Z@ yFA-?H`dlFOG*҉"*~mR'BWIα*MFN 6m⼒&BP)o+^3K.\6#zt==⸰_Lq*] ܿb4ZkDdkQtBG-p YHr^GV [p>y(eQ6JB"DC#v#:)^?ڼpDZw Mi LPMX +nTD8F\eSXty~#[S1;9*doaCZt(|Bc I @\,Filu"eY"n>KdTKnշ)6ac-M֦r&7^]`Zn H) ne~'̿xM}21ˋ[Sszio@@@qPt<`f:_]YQD5HI I;NIVp/cYY N .+QP  "O%wÉ?g_^5B/4fq.w 1bW~,Y` k P ȇh H[+T]s"D" "Qܵ:z=Y ;N1)]vb$>ׁ_mu~LՎ4Sﯿr=eҨ:DwnhMT׆!q'h}bѸDT3Y~?=|3CYbJcӧ4QOSx? M_R6ZJ"DbhLmm;!r`Rϯ{$)5]lYyT:afL'sY7^L~YLQ&TYYrsgnZ ǬSꆬۍ:d |&J0vI)_pn+IB߃ ">?as? d*NSO9Ar/nI~_+m:8:>|M*M`J!@r%"f`^S ~J/ Xo+ OggS@﹦0"8?+#%#$#$(&$#&#"$#'%$^M(& k.X1k]9v(H6qJDDDtb O7tuv>e}yU 8@o*$XN/ {|y:Jnɬ6CP':&E6bS>LSrh..BS":pU7`0q;[ h8?x!V$jB^rd iNdc9OPy$XyW42me;?* wp8J*a~vlJ{i܊Qht `mRğRo _:Eo!:b|/4aL ) LOJ@h<nbPnF# %..Sr\bIwiذp)/;qf7Xk˔>axc;OIu߯F=;tl`ce7!>, N^dV2/Hx--wkB1IP)kfN%~hJbtbPJ>j&"cD|yVWU+jt nv76@ }p,#ՠ`2& ݸ >[6bl=.^-6՞Yb* 29$hoUָ<۝2w/GtQ'_W\\QQJ]D E @:ܬu:@,9 Q@crlHY^*Tj]Ao"%{1LjlWǠ㌼N Lz/Ql(Zng~ލmT@4q C@x$*T +P:{*H"ьTLSӶ?\ŕ/ HXGH(v䨇qeċL𚻨$>{`Rbo_^ PAz_ęJCWf2ٕr1u!<5ݷ {n?ۃE8 -n+;W؎+\Nj@ S":稜ŀ .SゑPIDEYڅVx(HVѲQ\b%SJWn'CDp*F|eI2%n;x2?{{7ޟNiO`&q-V&x6 }1p;G4v]xdGR%Op),>% y7C&eKA4$/Ι])8|\yay77eC·cYE4@2n]GK#I 8kNC{^C(,k# T> &H%.+?( Fd)RBǷwl{?: N @?w~I+Kv?(b x2+EI +!q~6f'bxXFKx_* Ҍ$kkuUW>z/%W>if2RcQ㳰XW]s`@\ \Av&.ʱjA(,&+L_KR`weW5H&d!jݺ{ݯΗnq8:\y<"; _?CqC0փ/n tQ Mu X+@pؒ[HVŬŶF %"NƘ&[|RY$""/|`ap_>dx!K5sa/? k=n ALP*HT]dXʃoLXł?UtҹBneL1y<|/B S"XoYW-Iۗ+wbZm9] -H ш$,*LB"(T'"Vmf@ 4ebRq ʢ&1,KQ5XK(~55t$Q oc1^\y¤U>p1,MK(< 4]w~|I;nP_DMg^]<ә\[z+ILڼ]$Ӭ}:\[kKYV$`[S1*0 ϰ4utt jI, "+@ȁW !7fF2܂.ɪB=>N$pt" B %)Q@H=>,;P:]uy7<_YiD"h3̊.c9`@72MU $wĊ~ M!1M VptG!%~CR!Wl\Ph)'\ps2"ӆ5r|O,R60 1A*< }Bҁb 07.| 42JGP sve!~-&fᛌ4fr 7r^w9 Do*5j;,e^<><7+P>pk i#A4Q;7 TB+r0E)`HP%.~+־CD l>LJOSPl{om4#"dDA2'4˧QUavq}\}u[|96iKKn&mij-܁t0T  `1@THf>.% cJMJ)>#o++r$dFLQVWj[hi'!d\u=I_+(K1-gd%싀Qp .Op+POggS@﹦0 J1}~25 t;ecKQBUsRU S=M/[~R>=L}Ja%oՓ߽8?gǺ2I)$Va) hdVH+ "  k*ު&'1>ec{2^N@D4=™֎x-7.Q|O/[V=PgS Xyâ $`hcAX V-,KN%`܁گ4sL+vt|EHith<۷=ˑ&[;/x,D&eBS@& S{N_@xtbp`m].tHX65D"Q-/ , fǜ@m)ϊJ+0AP!2BjD!> q1 XKH?(WOq oռf[^zb^+uƪB0jH7.?+ DB< !&!a0!"ZVr.Y݂b­f>wo@") 0K^^aż|يO@(qf/h_K @ qv*i*-V*2 _j)\.πpI! *#*T %~~9"0^n P<69QIn2MO9/!VG?rawC'|ځxlZ&pE5P܀#np)Tp3R f5Q XPK,z~lӚ:8%<@„ ~QJQhný`x|?K6ya!&ͻ-ޫH0n@@" PH  W=Bޛ}/7s"(x54ՠxVW9ꗉ#@|Onx6zau+=yq"23g_Lr~ٗ> PJ6c*b86po˅ AC` j 2 VvA *CP $܂1lQ{VKm9ECn-PyLODNHǑz/uO<.&>׻n0P(goAZ TSHQ <*}dGErQA|"vCkTݚd\܊DrYx|]2F[_y,V*)ko<tυd,SaX@[O΍Ҭ ?T/.VL("-FEm n kp8zsň$/=xw-@_4M "w]_S+}a9hț>Q|V$ӮundP P?ڀO7&d`DMwN! P]#o+vn΃ 䎫nAPN9/b <<Gڮcf;ұu|پg!^J(!>;)&FE@?13Q7EX9hAB~K6iN.(8nkf), ^D9=D {ZAm=F/ܻuKHN]wk`m1װ10"d!q@`Bq`=jD׌I^gDܴ~u:be/|sF ta$"ђxk\}Y[xqՂ! Q_~?bӆ*!ve_}[nJT] )@$G M@Vt+ qALf NwbUE">(=.h٤m<OKi4f]&63Eڣuv-1@PD"X+Be,r xUFEp0 h Wn-d쁗])]USjp/;ZX\f WfϺ$[گ?y3Ar h j@Kr``iA XA^  07`.X2Sм@@ ^ĚmK V >6Yqt.Bq]~t}پp?tSsw|w"/*!']+^ғgʳj6h@}p3AE['D^hI ^EbE=U9|=4[\ppWJ2xh/roM7Aq~p痏Kv$hEO RDUcַ\ZIi @djcI"*)h,ڥ~,.hu+XK6 b`WR *1 +ҟkق{wNg3y=˨XJL@6rwJX*AX'AhL**]U+⃺ӧX0-k6m//ذIS Fvdt*Ra|3ζ#c[n7fO^ÇNjL}&UN0\&)p,GJB7 Q7C֤$(ZC}H~Kvin#(\X^fKثRSrTb9i2w77^<N)H\HD*c[[4X ܀&xQh 0B+iE=`܊cͥ>`$r/EܑC+% Iƞ"*_x~Njy Ԏ~M㊭Q}Q7 r?"a`-5* 0b (Sl t.Q^;n5\ [E/C;0)2 D4c4''v=ϜofNGo2̒]F+-tcİ髯5@5/`L`$ R ,>~ɠ#Ulrx9xQO$ D"J =;oGGGvwݿZQ&mJ^kĝt/ ъ ) K0cL`0WKun 7T^0ǹC\0aS:{_%ª{쳷o|Ǔ]e߬>Ŧ z᠆sMv3ibئZcև%G ~k+iJ%1x J&R#Q7j{}Ψ)/+ɷ%KOߴ_o^y}Ο1l.G/g A 3aV̠FpJ ,ܒ^T: z D ^K6i 1'R1 c=9*x"HJD*mڇ̓&V*4itܽÝK|poht,ȝ06vZh0bS ^"|HmF^+v㜍x<=b6&o?spr74x?PU$B"'o潔׳-ѿ~8uώg/~{~ &,2:%425y JϱXSF`iA)'bD! OggS@﹦0 VxA&,'##"!&#%!('+ejFv침hs>,0]@D$̈"Hϫ7;ԁ9uigO^\ GƯ~y]VL#9:`oi&epVa !5 5q>l㙍Y$ު8rM@Q N8*WTdw'c_lhr9w.04^Zh7)% 0cL%]4tB+aYʋtW"YӸ" Ei_ߣ^^뙋,@hN\igcSxj#޻J^$5ʷ]H;a3kgQ̐!Sˆ=E H:阚L8hpZ`Vd,,Xp&A _Rч*rPYłb&{ӥ٦cc'Y,ly1\73E7WnϿ} NH:Zd2s ,}݉ngb >,t&8:)Nv)!r^ (j(kh"YģO^WODq;cc7q(|L|o75sjV*U 7qMM$@;BqKĴ9?QEe n@%>v =P.{u=/^}.?Onq}af5ֻ~uG1.n% ?N=t`Il4Ju`ɪq[ MTT: )5rÍa ~r/{_b>5.x)Mmc=ms ퟿;Z?/wg0sHa#a 4~8,Cxj0>ˠD+X:Yc:Ie$ª .b\ڮPV*챑;Fe׭0?ۧg_Ϗǧ⪞CqgwWGv˻;Z~xϘǿU]@mXZ5HpFX:.&0"Ai-VJnbPu 4مKGmN E]':C_Ͼ* .I(Wf,sϡ+%0J"E$L4?R:%ԝdT^kY|~ަӷ]S6-)KQtVTFw9t́F~:^{Zet"{u;.2eLNLbz*lɘуtP? G@8GU1$1!RP+2SB}sւ{&>zNLq@A^!pYZv/fkcg_yP\ |@"B^gEcEe%t^]p\<ɉFDK;/ٱ돿L?O)(VX?#iBmH#T4 X,2XSQ摕ׅNH<rq^ &&a:s^V\fn1,`79GE" D )Б<]AO{^秏78CU^a؀ADx4%@ r5WV\H! Vʍ$N뫼+S<~)E6>^EpTJAS-V0u2zKڻ! ;(+\~ *"_G \ FsM9@ ­($^-gI,|tn$?Ht8*R"KhGf [OފvDZ8y۔'F[&ns)<p%tvDb18]HbE8A7Ɉ$Fq(@@^MI7Hq߃h>z:.7^jܡYA$}]o~Z0Ib" @OY7 q&! l` a*Mp~ ,l.&M5Y~o/Ok͵HK~UAw>J (Q0@@&\Po'q,{Rw=Fn~<~{<AyR9`2r,p$¸ `YNȔu\(!$"az6'7v#|lni K۶ٜ,R/cW[ADC&29hkt_@R7x:D^ON "9SAP܀KT,Mڗ%q?+w(mT)!nZ# ,OGQVMC|TݳD:Sx\|߭%pR>%: $EG4,Kz \l9W, j"Ryv'@e5_M3N2G b#6O= )es5k0w(7<KsBeSW_J 9q\3q\WaZRujl 3 qKl(Koon{ZTT]E*t@LG4pbhf}~3&#qD>1):Ƹ, B9=bC)V,1?vYá9o@4Q""LSs~:3rOOY5d_WA1pW7IAgb]!U;@\@7x@\ @7A p 5[G$m[9aE$U$T%վ:J(L隡mǍ~pWv]s%BODtw2Rp}t_G`-@ I7`ѴWVh* NP|'2XvbH7.nBe*+,޺B&g_Wͥl!>Ng)HZ[,G-Ɖ(|LJ}'ؿ:XS]7s 钕F7:J`)EwZE41s `EKWyDqx(GY꥘+~;nFNR3?|T0 m-Ox+R`YNm7>. "Mc-b][b,3yDwR)Ƞ,YLqqzĽlNר,zfL1:]6BØ]ZBGCڧoDƓpNS h)!hWN{3/>v =|};BlF:HDT D~=8Rr}\ IL" f?gZWkm6 J\ }pH܈=$'@b sc C06C3GGcv22݊΢q6.c^_#wXPo>땲eVAhv3<'I'0@?~զ[ Bq5G'2JgGúUڭuڈ A-;*,-íyӝkSJ$@Y(7KC*uYD)є-U,\ { aWZsKbJ4td;ڜDW0 :<][+ vY1t MX,t1`6HF=xKM(G% DzV$7TX> 6gA0ftK <8.v5)  p\Լt*''-Co޽u/Qk1qS&΀n%B2v1CĄ 0:g dnŸbgHCɮ4 RJfDDSVp!u7[)+On0 gȑ<ZG˜,H61U M@*@? F`KyɁPl5x 52BJ,!k|)*J=MDIb=(YG0ړ OE.tzUWM]&I,(K#h>1Y˻6) i9q&sоiHBཁRHӅqir P (EJ4MY򛧌2Aln ]mXMSi  DGfԼ~}rF[纭?1,MK&Mo<7[jM|#,MY/cYO>_,}pެiI $bc7 UA44h\کz*B4O—fZA03'kgKu_ϴ +8)ثba|\D>u߇rxx BQLYJFWS*-11iYsf6wTLWJU X8[;a3gë'rsr5+J$3=(p~DE!/P5!Kb q4I# z{7tXΠTy$8NG͑5% `Um ,J%T~mec : `iz.*AK 1`%g(b0Kh묖R!VpdV$2GU S U0@4Wbn[N,/"~&ERuZ4a|qE!֓r; )-^U cݴx!'.\u*]8$J!G.NX$5Pw\C nE1,zk , O<0 D$ΆYe=-+*jˊ*!a7_ckGQ[$+ՙNpq(1 1IxVX[Ʌ~]q!r5uiJJ9JPH0KDV"랆Íސ͈ע*6^"]uv1mZazI"  8ع1-h=42"^evb BGhd'XD{LfZ&t07Svy{!rFtbrmqnԖ!^嚧!h:ih.`$H(QTUHZ|kZ%>~,U8`v6UZ$3=1OHνmm#)76h ~h TH@T"AWbTԅ(NғL&C1R^jpҋ!D4PctGN!6톍tݥa$[H@z*E8W "Piu &*uc XԂ(> vB.& K//FÇK]W>MT\°7Xjv^~,̂;1y+Etd OZWaA +GBVwNAh"]>X,^+6i.G>p&ܯ]aPe"AڸZ} qa2$B<2iӛ3obvǺ5O1h(*<NCW *yb3?Vq_I;6ux 7F+b< >Z?QBoilա=smdڳUٟp[0]${-tr~0=MbV `Dn QUbxIV@t !!dAh. 0"шnOggS﹦0 \0%!!%%#,(%}{#!#"%"''$%)$"$$)i@V8N1:^gQ~lKgp7}".[_5@Gq~X(8~+*{(H4ccK&'45sM[n+P;zJΥAN*H~ 6_fm=^ߜ%ɇSgݪjBBpF@g`-vCw.N' +=*gtq$Iz8@$ ꄅ;Xy({N~,ƶ15wٓI,c?-Z'>icg-k2ÃEꃯ?QhXxܘ}OptDP6_LD7 ^OX nV? Q`pnĮ~;eb^ʌz%E2= CToH4,vS AC[D]RoLז{|^clT7EL"ۂ,X DX &<(heC+oa7C9YK9Zh<+ʫDQ/q)K;_nKvu?<Ogѵ0(Gzg$|н{NU+ N|M ΆEA&@z_Pƨ1X, O] ־V{m+//l>Z[? E}5{4 `)J{0%'ho$ѱW&Sj#]hLJbA{{ؿ6:B(#uq@k-HsH7̥045|=ϸ@hԀ0j&Auk*(( g+mc5lϥ)r|_tzDdQ6"<~/wF*軜|S診VtKP v,\((jfa$Ql&d['^p .ef!k|,.t:3 $Wd$ ;\3_-$ p,ԯB>(3m$]qȎɫ{E]P>x%X5b;L DRB] DX  ʕ:eE*$I̫]/\.a];|%pu ئEu&8{58%Xk|Xwz*7p2XD+ 'ִwF@(k&3}psK.%KF+##@ͯ d 5fׇC<9y8V>s\| :J]|V9 X? C@Ŏa`RgM!rMz|܄Zϓo;@W*"B"Avrד5:Mj }M^1 >g_B23Y6iDPH ԘO&‾aŤo> "&+^RTltDWʮ8/F1 prEi&m~!5ZġO]M2) gr+VwE5`w2l" `| ´!D9\ e9/@Q]\2-.]'K+cPU4" JL%+_uw7>}>ljּ@/`W[1hsX+E4 0ZS͎0*n"x YELbTajBYoyNͰ[+|;2BGPB&i$}>5Ȇ*^+LB**[&D4Ou湵p@o|aNB!%d2D1ꄲ=˭ iҘ{8]4m5u= OuL4DU 3aϟs|=9:䨊ڸTD]$'kI-tVE㞊-ZM)pkh2E|(D>>>e6O[.Dw JyEคg4{J.cg`􍶇ȸw&zӳ@"' ,^Gun!;pT$>{ )ygn7+..CBknͳ_)S)7$XP*O#} aĦF8;;UDItHN  BhN($ AiY5QPQ! _%T b޾>+eWA4J+ɔQ&iL. EԠnf=F`@1ٓ|{ =U UT Y>t`*5 7AC 4mȀGZtm8CRj U^+־gpxZ벰0H73Aoh{[wFۇ?_Ur&C,G9q&uk Q!6RV NS*su<| :t`U~#bD(#[\ 9,{lsW >5W>(xR-aZ0G7ʄ~ 8\:m&sk˿* |UU ︬`|A8ǻ&U+¹$N P "Cgd#71b^|a䐾X`$[f;CWD}B - (՟(@oYdSh]}eƻܨ;2^v0H`B|u ޯނ2poHM"& #:iFp%^[6IW/[t-F\4*{ nyPDD@UfVpkJW-AxC;#n(з>,UGh[$P.I7\-lqE4@`MB[ed<WbH)QA).PDO4qnEj;n$ů,[|z}3ǨS>rͽ}S4+Ҿφ0cf!`SH}WZ.\6]SK`Ky=^f~] N#k!)KHYi<t1~X嶮~)֍%7OIņq?x<ߵ>{*'bîH$ϚLG!IF+q'yh{3yOggS@O﹦0 ",),!&&"&#($!"!$"&"*'\YSVw8 2h>~5w·Sq^LDUf<*uClRpk^= U/;L,z:|.j;\XphH)ʈryZ(#CuẃEHOHAq!ҩQ:ϧ_눰*uO9)d5{ҷa":-`KxS _XDrl:H\ *JGc-PRǧ4l@H DbU\ m$dI$ j 2>r;"A"m/kL v%)}+.=.b𼰰F{6i-Ne,H(yxaO0XKAcc2a g.@4pT0pJm7mwSԦ1cYi9eP߂@ě?|=OX'Vĵn6qEfBIqq6pԕS"67(}y"^Ŀ`Fh!)s_(~!aq1"e*"jKH aB6bJ| R.<#R*%vLבdy z0 V2GLM⧊Y' W\?%w4ʳ'{\{jXb%c.0ɽA0 D}l_oHq@L17Z qϹ +oUj5Ą``+v]+qIF+e"bjCܣ7HⰦ>NԿá݉+Va-tt}TX#ܷUN9H1x~j8A5~ߘj=DJ$fiF JdnJ^ne,("=q11jy<рVmHCTCZ,rZ÷z$Va@Ju+*w9֧g[@0䏉"= M@;(9:BۊYd :Mvw4#WfNc1c6+X:ƜKh 'Ps8ނ*S7:Rb++IѬ%a9:% 8$j DX@saq"ní#Q.C2˔F>K=Z;عvV|L;%ޒyfTe,=XJҋ?Q~ZF%¾\4$"c:6a@dޫmc7VgHDNENxQO s&>c|X>pX0H@ȻiXZDe  bE* Eh~{fג~ !c.9ZM0L3#?؈1eU":QP[o*Ԟ3mݲLklrU\x+ǦBK4%c,\51y!ODDLYF@+KGy$U ׂ+BnJIŞ'YP32Zyn׫1Ż#zd":&7N+ /==͏ӛʶvkwIRK-:RbT"|!'r[w7γ4ijzxޖ'G^JQpv0ErF=}0D4˳݀ik {id庻GC D4'"Vuegf'a}\/LSjM xl~6gTQMT؃~Û=_&;"_w|+e|rVKҒ\?z_#Nvt i͒vNJqU\%L+6c L\X>[ј"/bua,75# MJ#˨ b@|~@*`̠;+P tw{QU2W)/b{FЙ1a8>-2A?v9n P-Aj*:3Ěp0JǚvbN.r!VX|r 4^Kl)EtJed{ज़MU:}J ;Lݿ8}* ח̎I%z`ҍi?0a-c=K5TIxou$X “AHCt)^j%.">;&6p*BZpq`Wh"ҽ>G7w3[}2ve?6*TF_ue \ >Rqu(q/cjwEh.Y5 D vcBU PEfb@0z%?ͦ?a -px\}>wy8֨#=ƶ{YET L4\z&HG:/\9lI<UD_֘ n􈝻hR_pn-e`@.ȽϳZH[n-4}, ^WSO[ G)Z;jЅ&C/FFAHiQOggS@﹦0C\+&''%&&'(){#%$#"#)(%k6nxaH0gd N?/8t}$"~w$ Uj9iv{~)XvU+VdV~[4elR1A   c/nj UQGT ڼF,̻UUh3$?͇c@Sqۥ!vp~i4.vV̈khpBAAtLQ .YN詵isFcE&P &ǐ`@ETD06, m 6^ eY#s7 V[EDT<u[|kk:kOh\Zҥ'aBWǼ1h u9N>[~VxUA,DD49Mג&\\ÈW>S]4]!y0`ҭ ]rIAӞ`zv H09zq $`l~!@L{  @{tfH vDҲXcpUDS k v_7~ۑ7)iz;  ^ܨZ*D6X/NU vGQi#,"nmzH%d7[qGZStĖI|Dc^fFVM4t|?ׅ]~]il1Vu@ cu]e&mP#.J yGrDOJKQ+^ރIT ~[5P-p$2.aϹW^%~XzxYLݲ7ߋGT DG Xkc#Ʋ3p)E/Md|ܵ0cR0B d(ґ .RD*6!^+nǸlcCŶ.B=:݊m;G@w%?.-/F&#|ާ2@FmOGI>YhVHƠJv pK nǖ>U0rwP2f42ƨ"Е&Z~ f˸܃Z&%.3 )oܮwiU=DDW_?Vv9 sm7(>Gm|vf>g!Gdz!T}ᕙΡ}Krқs M9b*WW GwmdI6V~|mwt6Ν~wEϯ=rYzޙ;4^ z*ڂ bWP,@,?`"Bz V d 'H7ops򋂻u \s}Q8Tg5ɮ[^U+~Ulx7  ]O#EFڟ5M%wSx*T цG*I0.7FdP;L4k9C6_|SF ze5DGw5+a54Ie1Sf#D UT?~A`t7ӸhsZS>mN9,W]ٚ~:h=r~>JO<Eձ3oH\gO(حDA=4ςVT+g?r@dD;,ÍӞ=\a㐂%K?Z!~o6:MO bTWitUPl} {02%\%yq-):LxDS33y/I1OC(-ds9-Z*)r2zUƅ=J9 wq|uVFNŰ.U%BE&~R*˕bf^kHmz@]!WQ ,eX~LʛIa7>9=8|hi0y! A.iiWo}W%YP>_,nh5de^HHFY+ ,>Y'{qCZ{}| IxUS% GMG>t":.V5~=㮯3NJ E@ JJ_1G@bD)8;0딘p~[q p[fgGT@$녺鵋O_XeyWhADD qZ⚑7*LB7-]_,q|eG.׼il< Ӷ@PI##f܈ SLĢOI,"q~+zd+~M1-}߰W.H)%*@^5'*׻?_=;7%_P $;;6'EڛmRK- * r{x-po'55 ;r Z82>H# > FnI2W0.kV-ߪ/>SŭV"(р;G}ﬡ[tf P ||mp.Wi.W J@O1 dt`DʎgP>!Υfة neo.qZBJ0~Ei 7,68ݽ&R44;09m&Q!hzinpi &ے+) NkFdաX4 $eD uyjIoGxFQ3fUJ^k(]&ze<_.ի2һ?G0YOfVg'ZXcpy rFIoNwB$O嗫H1e1Qyh,&*X-ʫ Wދ {ι~Z| H58D =jLw4Vfm[2t8BK0-^,wF8-b,gSޥ0 ?N3cb"aq"RE.ދxeR8 7[Hk}txl}'%ptí)uguZq`8PYhC`-q+&6JvV^[.}sgs4>*,ܞ;A׌jDk%K6iJra*TTY,pS<al:UFJɀ-W SˆU HkCYD{[6ֱŁ.p!̝4FQ-*tXgGǰL$1% o `.OggS@,﹦01~>[n^Х>п)q"JDx14X6JW-O=ŋ7:f sqv?a"w=C,k]3%Ja9#[Ƭ0c M(`2zQ( *H,~M .7`r*1:GWH}pן%VP3A=st2.`}j,Ytlz"|qoDH@3IJ[b2zodc7g=l5'|Q7 %"P3SKihL񚨈U@!(t_3XMC~z,&DȽgSZy b|[!EMDqG>I%v9UNo%') Cw'1)m琱>w\jpz_qK7|>5JӈhN ^|d \L#r}\8V?=@:k9d=\=/?:.ruw(ˈ_}x?ֲN:7=y,v~<}t =r/RN>JIp! #@֥ 7;GƲ(CmYU.l6C~ %{*щ1h}OVv pEtZx0耈趗at燹ɦO6zexӶ|8'ɰTMq֦aX~[kFւ6| m\l0,Xj? *=@qojy<ʣ;Jj2bKi*0l`Y;mIM ZaО  =U [Hl8=f[]܂Ɋz_8XoO1p^`%Cw*|q b!U-C{@E+aWu" ;em ǩ>(u2ӡ<5oM=̒͝' y[K @Pݩ5$ĪuōRBJN].p6Q _b끣 ltc&jJa[~+fO ;$C]@pr^U}5=%{O/+)LotOW{,:m;7j}WFraߦ=o~5^ E|Uyg.Ok~TY7D+nfr e)}~+~YV,\?t)8`Wz'By"J:}˳Rt$whf{C  {0회eou|dņ)R(w&Ӓ;mċ\unV DDpmtR $+}sZY.DG8b'׫ߴ+#XO񞴣X,E7h[e%ї%˙QfIXR.pZhcK+#aUPۙ&ZTidYt2s T. X\kNHTMY 6L WٳIR]O﨏_Z/cV|z+(]ii'H "UsZu.Į}9H.P(pp8oJ5"NX\{.qG3$r4P/ 슫E'ox~w-"C0?=^ɻ'n>C 0t[w3+kTjɝ"kCYn>j+aȫH 55b覗\Z+ D9D>[fqkGazX=K]PJ?8;Iت0^87pVۯog)t 0vD{1!S6Ś%ri2fl9P>,#R\|1y;`\ T>63~ Xic=W7 /Vn.<߷SEvKՎ[)(|1׋$!AbHeÝ» jsd٢jEyY7.[*ŕ>;q I AKXОeYX.S X Dv|QEz}i>{ Eq˿Aw̬m&Q2;@'O F@mO:?:llipkLX- 0/;B_ {vnL飬kNe^H}co{ՉpVԩ&jܣUkӶ)6c9jRk׮uSq%c(q^|M)늲_O5{ld0BkR_Kvowկӷ)Z`$M>|vKC+f׎H. 2(X:gW|"p0m S =.cڻ>s8t .ȵ}yDkں$-:<kVfϗnjYNVA~z'/OY(P*P\k6GKVY52Ů҄D.Ni\ =g]ᨶj1%|[C8m<.tOD˴:\3ZBHEH!4'{$EQd[[&e uX'(0` .&9sV,|,%Vjla4#:iY@]9V Nn{"ϟ.uxE}Ȉ(THeءJ3NJw,TȬ[T`@ADުє DvʳlG_7ں߿z[,iwEF Lx*..b u۝2|b=zL(*f53gnz|pr w|DLii^TNX>H~+fZ.{ɑ6'"ٳVI$-.5nf^ߚڕSҰq<=/K_GTFx:JT1~)b=#'HڨzӿUw_D'Ubh|=+5J~)YL^]% WhOʗOo{~J܍abɅ3wQn[ڑX }NftJ 7#X)IV-۷ij?8Lǹ+";+q'H0%f9"YJwSBJ~ؼ?7pg# >nzb C 9tFȟp4+4Taһ'4Q*%zlXzVyrE8mhM]>+nX.p"mT?*OsSo(E?=_osol~E+{qi}Umh\ѼIb*YCP( ao_8Z4 Qil*e6E )ǥE2q~K6G.*H8}nbeQ^?UCΌ{^?]wy|enn^*@&uA& d0()ifxvWE"Va"a\[Ҟ|dX2<+Mkȋ[Df/V>r-ƈxbӑ@UYfJA?q{wc[,6~qo9*w},x"rr RH?f4<'\fG׵ d4;|6I)=ҁ[.DBf+4)l]G_|S~gy D6<2h֑mv5 8+?&ަQ3 s}`H|q}u:^AJ91^̳|j1Q۫-OggS﹦0%(#>c Y=R 7^z5q߂-0q=XEK5Ö[{SAOa+}G?,լPvWnwessS7K{ @ O~%O'F 7@%8$Ll̔p3`W\ 'bWye0m¾ݳВ2 ՚YaG!Ou 8.BAT4ߟqtk:5~-TA:P[a[QF;Uߍuc])m|R?pC~[v50<zApEL=@|s"yep" 5|Jڸ'\^{.:e$F;! EW XxeB)y:OC<7vXn|ϙaƱ(s5J5+,%Fc"b"~ XK/ `avEì-?pzyLh|PEv[v9.0+b1ᦺkpdzʻvı36`ƱSG՟K[\##ɷBmGJaVNtk <9`)쁏 <ǡ?M p'SyH$ggPZo~%cqg+uVwg:Y-qvFׇ H,ݰu^%F< ! ^ř< ǥZ1"!Yf-H@;Qbc%1n`%^ Eg~wg(+&Fh>taV/U/@"O,@m#hݾX9!J4p}aaPDR΅?! mb 6껢]i;jA^kL$<BTb}%JTǀzSONDK78%]KA,>L[uT@x*1;p՛ؒ 5,;{toT$F$ %v,ҹğí RyV"Rab  8q5E^01!,BTzbIEx"zs,1竧gI X [Oןwއטm<>wOvcI=QMfKf:T*@sRi5$t;5fZV#7vGdFi=nze㾚ƞjm}1Y80Ѻ"),)!.x9i{P[D RGZDv\˜P-:EGu OMc֪D,rH@7xN;Moh öam./O\ =xX$AG< ISnj.bKVE(ե4` =_Lqȅ۲`5(^KE^>+rDiSc.`L0v3?Q?<ՎA=[ =9ݺM1pTAk4E1Ւ]yR hY`!A7 7@.(FI#Fs]rX\4F7id.*FZ^g.y13s.NԂ3r>,.H/ ;ַ& @nݿ oKb<|A c@#cV4'NVxflzN(3"Tj&el$Sg^:\[I}V 㩉 6nu:n{'^Y߽uX[\uFF^P].[lS55X4ͲtRYUg[bRh/xJVY\!E~R'e©Y\5k^1Bx'شg鬦ɿtUYF'ʋqwc6ڭIFyUȝ\2PZwW xedSu 1'QjYUerm TpLɢɫqGaU˝wZx59Bn81l<^RQ qmv ~յ̦ 9t @N{. kPd$B 8A'&# e @ _Ql DF~Ĩq?QZ6kww~I(+^;D; :18v$m]O&6q^0H)"klp2I&@+ JV-:p+KD a;ozA+^%PƬ/1:Gս0)O^)NZxg(3s۰>2MF.EW%JLj4w$cFZ^xWo`?~66҄@n`vֆ0a(Pt3&G֪9qo}Vs4=]]Tbqa:x=] DK1MMj&VmUcbThWafAHSI,%ܱ9F rg WP(wDn⟏DGʮ";VF'63,(T栖Daj4Y m7Dӭڤ?:j[ч͢OQy;,M>^g8%>}}^cU;0dھ+u]5ڭ}Ikw8k pus}H+a^KE/8`kabɳo:*.Lk| h/C)DoW; PᬰDKXC%>mV毇X$vYjr+J)W>ݮ{uuTW«D ڜkq`Sߟ:MjZA\[%Ck~.a㻳udE+-# /<}@o&V.yRϪOa?1ƢkBtIѥs : rO+)|n_PeG>Nuaš0Vao K]&+V>+ix 1B(v ;NG$wɚ-6| ҶV^H w}X칏}4*@¯@`w}²cy5'у jssK0tF@g-aNwk"-8M~mvSW!D7w!%Q%HXp~;NLGXc{璵l1CjW.` Jq>zs4~\X0J} fLG#IA7ô I/SҎ׍{;sq/slنSQݐ+0tw EXM~+2%](kʍ3PlxhV˱pTZUӁ,0G`\zws-WuZٓ&]}nm=F=b_ օhB$-"CqֺEO<NI`3Խk}6κ>a#}iBxwgUq0R`H >f !S1E%vpZ!śN%G+CCHf:0i?n$u_qӳQ$ĖM+JkD~YrZaM!"FpBW;m,lbfg_`ʕm !?/̽ˇ;1zBZxXnDKd"QYH+&RJeֱ }HJb+^{#M|H}^8*{`:Hם1ƷUׇ!fOh4Q٠qc֬zz+*K^o{֪N6wiz#w^?7[u>wvpOߵ;! bep0>N+IjɎ#PFT6pV pU Pq2M{-}n4HkBnv7N|:C _;]sINK׹60F]n-6]|?x/bj"\X!}}?ar3&R  ȸA+N)(1P@J:DJNX*858yx{/>aI1P ?Zw{"}[Hn~Vk|o( y70c-Lٖ瑐f~0mU_rfb6?{)=7dߜg6Ϻӳn8È% ^¡گ$Ȃ(qn+3:&aeA?y<`9q\SI' Iu5ccƍW#q}' xtH5Gn֐'7>R0D ):Q\s& %/RG#UF > .D\!R[:cs:|> t'"R8;gS̼]%0QJw t-L"INgvQJ^v=G*?fHf5@hxg2E_Ӭ-UO-Gkx tb eJu+m +TDl 3YBBʪm Ta*D\P}/'ْo}>qgu|k7DsW(kb] b?A oa6d)zc~ߑ5Ͳ v%=C6x'`!uy|9b‹~ZV YkvnBR(Eߎ%-D]]'~TGp6G`LJd7Zй_:vtJPAN_6WmܟUu~mV otWVkFoYv&1q) %[^.q'ņVTjpa[N2 .*֒iIHF.\?.TҊ>{ :w\ŁՕFvl|Ǹ|>~2X׳|g Z1iH,1{,kIZ?so>aE k#ۤTum^j r|ˢZ6P"KN%"s9N{T8kYq1l[2VUNQۅ% #FB/ hut vh.@ɚ NY_]Npgro8ZQ?qn\5gZ;|j5QLQMԊ@0^N&6lU]z50BO7.Jq0Fȣ,F D8|w{ ?~ꪬ턐 VڛDf`4.'̿ 5aw[qtpnmY#I\fխ4B9GSM\ʩfEZ4o=bT \,;Nu\e۰5] nZ'.5ScӁr 0湏IMl~' Z\#V{nӉXbRw;$9K"L[#b`Sm sSj|C͑Śk-Z]6 "+ ,0ڥj!>VR9S_Ցp.OpvMnIV\7 mE[?7s"iZ.m@N}:̙]Kl}8 i-gםԃqUS̯l=D2}NG2q59PH/u)yzj+%OggS@N﹦0&¹ȃ_M2W랧wv{u8WiF?q$ss89x1cuRÍ#Q;??OUZȁ1dQv+tՎ~Y Cᤗ!z)~ӭ;H !V3[24R waLkt0,H)X~u͕af ק6g5pƎYNN/¡OVSoJ,޻0j}ԥj :-xF>?VGj vv#ndqRJ'@gH-Gk~E[rQE<a%CDgzp.Fp _$K#oyBO2jNf 5p*J?6zfZ3G$gk{s+H|各gu҃<G  8\kcuṫ~hy=ke^m½֍1[>ϧI=-FyNw4N}N u>ӓטI_wtr䁃,_vgOV un=Jڬ6)Enz;1|_ ~́.h{ý\(ae7aWjP3\{l|L[*5!6)"HwnmTZhԚoZWs>&5C0۩Yww6e;|;wvS/t j,ۢMlǍ組O#u/4eV‡rt ^,g?Jd2C'؁E)`f6/=$6Ü0vmߨ. ٽ 48vT= !0>ѕ;g}hwڽ ,q'!t/|yx {~t;2ĤE7NGV)],VHZ&UeO~atD~+N"7ݎ.ьhl=\C7XJ)x4I.'7, 42q\O7 4`ng4-zqm`Zӯ$Xi|>)8`}Ke~S=8/8R9]2ޜ0'O_JLאͧ8n˔i\1B+|0I:Zq1aZB80|H)O,Yw |3]a~b/_Z#mHzJefk(y[ʡF5ξup+%q%!WƹSP EAQ6(5>Q ^+ZKcՄ_,oCi্_rgT_ȍulN<'y4$! F R!iQVo6}N#N'$"ߥ~ rl6#mľxdjY>!犄J[GSܕ +́^B,N.WOYeQ0Y XZq,׵ާos/nc4d]V'GR7!21 p_|p<E\YVJ5um1n\K.Fi̒XЌdM 1ɽe N[nC߼K{XPC X$$vuw&GsU͍rYYhb4qk\ r@Wr !8236;mG~{_ETeOA_څ#Υm8߿߯{vjcn>5VA*mWMHƬuǨ<~(,n-.KN.Bztkކa2Uեt8.MYR"N4G?ήgÑqE Zc 5%]5?3+:&~8]s%ATs>N!4UܮvU;31RݍWil%W'Nic ZXEѾu:'K H$>+@㣭eUlU,3OQG=b1ܿ5]P@Q1usuyWҧz)_c&3/, sZ}ұzRގ}ɫ޵>${KN >HL%|"eD ڐ !ط{!!d{ݦWtéT kt -~yqSLQ]bYa1sیQ'x-.@^;NLPË3fx{ndZʡz/)pvLM_3SwE4$4=# I`->6_a4z\k4D6.@i_ؕX_.o@4g6T#r Z?8k(U@un{}]nbgiD K΃ֳDjڱ xȗx {$,6cʍ?iAjo0{][ZүHfAP"#}ܙrW>TW~TxʞN5&\}.9+!h䫽!/J&Ii=ra= 4uIyG?x7{h~@6&b #-Q`H}Uo$WVe>v@_,Mʝ)aM+AS!Z˗J?~8x>nl"]J#Zj% blk$ΔCkY>x[0UVNVӭ׆me(2j{EZnc@Τ '^iIC/He]#l Z  w v+v́鰣5cW?0d;pj #sl<=<++o=q둕$%7vt?u94!Z_g7e?Nٚrþt 1i}6yܔP" lov'7ԋy_kCĎKXI@dwyDcp w(@Q/!u~PB@遗xe der .P,5Uxq?NGQ= ٥*$#.qR޷/TӁ{:BMK!g]Vv٠ѸUA)!d~S6$knƀ 5Zr*d'IN6 ܤv.M |Rx~ާ h#B4& &% ٹݹRBe*ujx/}x]uP%OU"KQ,Ԟ 3Ba JXش UK)CyzfJpt>N%wn gbziY* nO б( D0-NQ^YP#tLw55{^cǾϻzq<9Nos=VF6.\HEET!Õ*HU]6 gOggS@﹦0k2! ԆU$kNnǝwL^G%4 ~m+7?b S^EL1?2nހ_^ǔiaRsqEnU6O6oۉ.6""Du]a1)Nd1uqvk5WMC%P$iDE! C{/ +cqq7c4p&SR(Yb)8H3~9D5)GOHT]9 `Hiܒ^@ q  #>ƛF3:]*4l?u$ p-@|M+ѸQ4pNY&@ @q㡽L5|2Wzm7%!M˓dMg:$_gp$zkIr*SL 8B8 yu~GLk0+QTt%*2.bwEJt+ʍ 0kC-Tڥ0;%<$;ݦR\=0|PCiYT>'e?]|{BzH o"0&AYutCh "Ac L,tg= $yy7Ś5{ msoJF"HKTð)wk cZtURFO~zu@UVR A0PS Ǜp݅zyo-$m?_&(;a #kYϏpsDvHuc\n!qPorJ;2<bM Ÿ9urT:o>Q3p5*~BɎ[m`Gg@9=l3 FL"\Vx&&u<|=K cjEpdtb@Zc:Xf^6[5odƳCQj/Xo[u(?#W+43u[6T@;φ&vK/h0."avL +{ogo\cM}@h1uW{ 떮v侑Fsdߟێu$oF7(qQS hJH}Kְ龍|Pq]I,b^KkP.Ŗ) v~ds6a\?iWSǛIwq](VR; ސѸhʆ\.j -H|d<#{4Z?yfo |L`!WD;!IÕ~KRDD^zTw&,,F?HJv{"#D9f?MOvR8&G6ΪJ^_)o*@ |~6;R@XҌo!? rZhc;|=$ S_/JXGq+ ce'^z)@;sPN82*`GSf6n_H3PEAZ N-6YJb =nv]Hbw#H# I=Y˥V>دs~ogU;(rE_- K gĜ^ePs2r_ H0|b ?@P R{./b?"Ft g*H25SSismKIxq~=e/9n3z)oMyNv39Kb_i5ܙtdbJ5,Ik~KPFBkAeB\抋O-;jR]OkhX̗ E?,ݽ!;s_kvv9TGVH$LI%86Rڿd jW!"(᪁!#K~W:v<ѹ# t,]r5 BkYy) *0/](S<Ь@6vH0ztH:%‥6 zT͆^Ks`lg9us!~3[sޚ\TmLӊV)T)HR+qzZ, \PIE^v@B^ra([tUG< @@)jDP9߬S<;,0}YUh* yiJ봅j7ا^́7HI6GrCӳ0j6jkL0udWHJޣp* >:}Ohm^ Gdd':'>8*UDHs;I!.?yk3{v8 =dۏJ!dx ^-vGy]zƺtN,l{lаLw0^|ƿ;lpW9ePAJb$^C6޻j<GV_}XLu.u#{`lEˤ:0 h"WAb:ot%Cސh )>+]vg; zq?[/&5>6 szVn}^:GIJJWf%JqV w"k'ȳ(ݭC/S*D=y5(<*,E[}߉Iۣ5-So l){2X|=Fat/E}1ph6RM )ŧt%*ŀl=ےAtlN-J)cY$NS8@o:JJ&'z_э~;)Hƾ1>*/v!zTO+_|1.:#s sv::n9\qdQdCDʋζgBw*'-=$ vh)X( h8M͕*qbTPfKMn] 4+D@9@^  -Y`5b:\Í76UD*?Ǯe(EiNU##~FZa|}O#JV.t,!uWHUB+K_)UX޹%!k9IEwDbwQ:\+ D9?m݅o_nhyB|< ֔Z |[p+m*'ɧ7  ̑{5W"t d \jH U( f$x۫8w=o'MEAsv8SqV&;OIH:Dʹ(a%-9RZ%un8۲FQl{C #i;z?w?G'9 לӬӱDF% ]M[,0H]DmQ!Zӄ~7!ZbqJ=SkqV.L9ከT_'  vZ UyFIɏl±[՞##Kpf PgJRq5#ߛpRaԛ/eܩ`!ϫ{Rҕ:| 3P LW)Eś(4pJ!ƀ+pAOggS@ ﹦0"#''!-*>D605O1eL 5, 3>ԟ^wBtv‚@O'X) o\OvK-qvxLٚZ$i,n%0(sGDyZUQ@,1>5 bEp ֪Dp@q;©4nSR76 .:WP 0d(raϬܿmSiⵁZta=aA866iZIwаg+hRyF떲V{|^4"QmXeL ,I2C҂sAya*WIéJX7AC)>oo]U}6цc^ ȷ,H+)nv:DJn1A}c{Aojq:g|7+InlLp9`/_9f7C*wV[}V$;a2\jW2V|6@QF %2";l$7ho\XXb)h &a0oi3~]}mĸw{¦l un 5 #YJq D^+֔vȈƒi>r7 U;aFV^YC腁o樠[" r*`t/>$"id8h1znC&VwǿsqM/sZ!q|-.xqr%By p eqfZ҈hXOSԯh\h#X4;OΞ[7BxӍiOt-+w^Cal42M9Aidۨ9qcĴMzޖUo7wC&Q*%EWp1nWZ=b$X Dx>h5RWɀѝ@)rظVJH|WݧlWO=^*Ba\F1ZӱsT@|I*WӕGV5k3n\K(ެ9hH?giJ?VC+1RjJokdEV 7`0 MVU\*KTE8V~Sx~ 71SX# Fk_,`RĐH ^8Dڮ"q cbURذYݴgrt=_(|S_H4Vr._55w; n&D¦75?uO8KGiOM xL6׸3۔aR% 2EåԲ Q]Rl"F(;D G mbw^"\USt4Ng?7 Kɲ-kZbX} >C:D BW `G/@t~<:)g,8~N0ɧ^ ٕ)v78{A3$Z`?9gu1i% ej?`|6"-S=?Aކ9w5+9#*+9?ʵHv;U}zwC&,&1pzevխQ~?N ~ceMwLliiN٠*- aQ }_gp"T[kMV  㻰#Us_}C ,Wj{P2 çlŕGWLW| 'uD +\J45xM"J4 LCLU:UFDHR|ýqQ]!y_aK::&H"z+upRɈdX \ifԭM|J[zQ}*]n '.w}4Մ4}/a蒒u-`n/ȼΧ/W5XfmB/eTksl/5*ˤ<|[ `J^;V\upAj)L|>B@r?= Z >|ASŢN_3x{Fo kiPcdt]wDq,_nh̅Y:Z7}2%f m\+Z~R霾n(˸Z, ;L&׎B7Ӫh=>?A˻IgV?zYpz/d#򦇷;sYߠݏ`]0A( #HA02ɨt]+(?n4(GU ?wvg"1^jr9Wk3KLG׊ < vY;@Itf>(pfo!-4cDŽRhv'@ ߻I \c1e#~sQ}**l4::tvG& XS(FD$yefGhvoC3%:W"{U͗Qf)eieIZTJ~KvdL[Y@0"KSH MXBڬS%p_;mt{}[%eo[[so8M J&;>qxl_E?3#wԟa Z?_+p(sAKѺw ŶS@jGɶ3N;vKrWڷAo#/N';&caHu0CiR^ւb`61 x(Y3<Ӧ,cx:aӛR?B+{ju88l!%>) XVQ @ҳ ͒Y3|>7?9NT#ɻo=75/xGq;(q]x^+\?!Qu!=φ̫Iz3kOM@7'^&~$4ėjUa>0R[<0Z~Ke & L^ȠZ >89+a |Բh-:m|/?|xBfHKnA i І VQ/p [FOr'} _4V?<{֭S @eZ:N/ۧB/%4^1 }ceiXOggS@m﹦0IUf%kHݨUc҂Eo>jsMVI^?uLt(mE >*)tr+1 +fw$T4u0"[FϷV-`  J%+ZW?Dc+Ém5Jlٗ.һ7 |&DCh[-F+_}ѪZvFTimW~epչї1>؈K+6~Uׂ+CRIL*&%u`90?LAu'R9{wrwl#: ,tsS4*X{&?=qu$GG">` *|ӧWSfDi]0IZ=ݘ??Nvx 6( k]~V q^Q)Fvl'KчA[eXX77Jϋks:mbRmc^Ow׮6|=tqJO,"}"ٗRĠ#$箴qn^RJ2֚nݚ! S=i{8n˗۸{~w7-fC^eݯ|Q< ֽH3KB{ gS!N \)a<{/K&Fڛb<ą~~D}{@@ݎPq'@t#yTȖ'ZYngg| )uW绥w.[[ iwgC4,eƃT G)<‹j6ꕔ|܁Y7Kv_/o.OGRdZ+X08wݻi-w/v/K*;7ui\;"p_X#L/{BcZCևTXx:WxljR6wf9}`UiRৃMf=Mg tkmπ^XNގfs -Q3U D{7(H#w?5|VGb J; g%JWMEE,Ldk 82؆.p\#r]{swDZ0~NוjF˲SQ4o5m2L۷O'؉"oO2*%ȾU^|(<,{,Z;t~ \>TRk[{mwfiuӰP׋Vã> y957@L|9&q/7yv86#\0@~@g0C`\Bt b9ۿ<?,+i%!7wObZ+Y-F^s-~ЊmJZ){wk̷fYg|^6kA&.]n:#z6@|mewaI05/ ,)}?stZBʚeij͎tNkeFU8hKՉC)"af rb5Z+s]\KNo8u#6:4~f&ϥL/+P?[SR2_xw_1ڢӵz˫U[۶ۻӫe|mdpl^nM-LY qDHp:lP $2w2E]ʻNu珆e&q<N|s c}Z8uW[Xn:.1zƢ*U ^f5&݅"7vN;e㍦B 2!.eBk(0N ț"E5fě]Q5[ʏqigȝ;|y\31:D]#Fvwݲ­(U^;6Aj/Ŗh`^h}\Rk?>}[UȄM_taX>Tׂ,:tғpWob=7ǻx?ѳvң@K:%W I&:nk(;)0rd?S ?Y_8mteOS7ob]Cp5P+s\{n.=[qRhE0DOggS@﹦0[nZN'VHz灴2Ů+)vl!WpY vGg:DZ팞<3"s5gN B߭"Ld#qh7@?ڒaaPv{J#kLה.wrXJwυ 0{^5=oT(7}LM_yMb1jlg5rK^xr|^@֤^an0~_- sbR3­V}ABMŬzU)Cp]@lXOpI硪W:58ĥYF*.BAhh2ɓQ֋Eq`rg==~=w8ޣ7]2%`qHAA'F8ߘ3 .5B <|b$mѼ I9 8q*"B?ǬBPd{ƶz{BiZ4uxM5Rwj62nsq𱓻󷻃{8lQ/oWrz\`@~f^ֽڒ,6%] xר+!CU~gʝUם.n4 y,o?7t%t4+gW_%` ^ՐA4hh}R) dx?9Bs(.tzw/N^fKwk߀^]pbmY[T[.H!S]׏xr+mۮ^q$r%ɧ? 5mw`M26 Rkyq?kgg]jѪm$K!^҃Htj( ~sLN?CP$J/oE^|c}w ]Kf|@L%I_$$[xlio ;vxc|w |F9#>K+襶zݷ~2 ѼVt(*k.h^ @Rcp*k?'Yb,߷쳞gAHC4(teHI% X7K&;.O0<|SSV3' 8RwZͲ<)7C-pb*ZRZܨkf1;>];S{pP<"њy{y;yAbk먿l3b3"v$"bo2t>#F>>nfgӷt_="[n^yښ5?G}֮R1 R^c_{JnWޔtj E}) fpW'RQI=^AeNt&0@yv5k=Pv鏜7(u;0|͕VE9sZH4gH&2CV8/VZKpˈN87Xj+97֍7=WT{_5pe~ CuV=WhC8xC_?;ݬ6fCƧ9e 8\eUbUE%1k "%wźt/5ˤR"b++ %蝷lzo]__:y'Fi~A /f1ZVNE _ U FxZ ts*G}{栱8bGC=\VQz#Wi",fOwoI 4me|&>ە10u_bdE}׹?>!/T}r9>x1\r>ZmYW鸰4\Lgt/9nΫ,v^.޻'N,@&)LWenkkPbGL~ Ivn^"Zԇ8h@EFŹ> _;dXʊN_v^q^~<3M^_m0 d!iyçՖnT_)H"{fEnQoڗe.za5 +N+RovӰrײR&x'#Il̹`Š㥖)`qJ:֜?Z+P@vҞ26,>UŒh 5چ|iK.0IdIZwF wGpo4v9n!f*駖r5>W^XWRq +b(X6[7*!뺼,)``p 9.Tq`tL xZ)htyw;{G7dh6bCqZj5Z( U rM%k?`B*-}mчlE{W'4voQJW|+V~nLsx&| |!萐1.3 Te6i7_u&(ܵy>sP|tV59 nZQ?p5ay͕jo2+pc ytpz;_u#˙2'v5w"E',˂Z\od$rǕ(SOOggS4 ﹦0!=."$!+& "# ! %$}!!""!"%%&vI%UN kzS~˦ps)ٹwNS2?{N/?mxA3y]w, f|Ʀۿ+sφ>ћp 0A '@%q/nL2*Fzs/݆:\˧<.bmJ<;(AF*/,Ĉ<<@کߵ(HGDߘ=<@5 Z,n$Z)Tr,~/=+޿ycѺˢD bS$Y9@hem[#Wlvl0$SL.9> cyMn~葏d-t*F({Դ[Iy&ga]ˇO[V}(^ʳ2%1?ׇ!1 8'.ww]$%z7(ĄS!B@`~. ]& ( gkڮ0g.BLƊE9o5ը-P@h{FR'#)j@BMyY"7t F5Tc-wp@yC@* ߋo18jŴ@Kh[ rNFk\8V8bR@_#"16a׊H?1 zζ#hVGi2n6E 5z>LBBN[Z7Z9Q1H$u`?fkPխ'B3+'^պu vK$n ~'`1:GD՛}!PS-}lTg ˶p_sN/Avb,Z|$ZV[XSÊ[{9J tH1|?q$ϩ5Q|(¸+.պP$#eIE*PY53"u#lA>0+JUq6ٖ;7<`$bs^h pxہ(2Da O؝7l#邇q 4S@O%Jh?ژxj EQ=HAV#YWňIX/]~bw?*< Ƞv8Ǽn( ޴16*KRjO"Ijy1&Sގ%)v\ ) Q+ ɷ ұ4 ;Z. LG2-7]Z^Cr{ߑfV,|q}nBg#C@+TW['SdI1?.U\%{:ucm_y[ {*~\cT+\Yk//y+d܆5Ihd  Sm'@P:+SǺWV^P\1r_뵜 Kfľ6'{}:f%ZHNOkɔIs$a':/r8q_Iʕ_,ݕPP\#F K5XFpފ%@nrXЖȇj +c`Ƿׇ9&CGҲ+N_8-ꂶ} oCpni[ƹl 4o118A#1 R2-R)@DLuo\K⠅^6D aܰ~#I#n'yb,Rܞ8@ 1S$ pZbER"Rއ(vZ#pm@Q~պhuҁB H‡|U~BL=ӑ7hC|,PbJ"^`tT|;kU]H1"+s&sbq~r25K^ l4uw\_FS[~H)z4FVLRG]KM`r3LQ S]HEM  eQU~RުCAf<{aw4@*DIMA]ϸو-#:m=Pb5֙%7fh)>`0 KVpJQ!FXS{AzE(nIHQ1gEcI R B)>%dCCA% cb26wp1[5=7lKzǃPXx4h` +$tYb wV#`PGvaNH IIW:,M.^k.H:, wF z AK$Q[^gK<>Nsd"ŷZ"tѡS BxP0PGY @ D!]f}Q)M".Բ 1T$r\h@UUb'@n"@fڙͫ M^$@CҠ,ԮQ2b4T%[lulIbZd2é rVyf&OH̿ A, tnG1X"!ȵ9|bzȒ[Em9gpEk\U ji!T_ B{K׳{:Pn L_KƠ f(l KG~~Gs2!R5TeI͘na{ZI\W+Gj@TcA/ \Œ-6Zn"g [T_M0 /_/./*!kׯ*04cŒ׆pW,ɨLa),5/ 9-ס*J4|qaV3?Tgӗۉ!$/6 C,2-C^ +Ͳi[=UeK2NQihc%ʰ6H +R2\   ILj@]nQ1wacEmv ˝91/Js!EUc.ݻ*#PkY' 1'h^+$[pԏ_7CY[XB!DK[:`ZCx%D`p%jn\r?ij~(Elj-AB]۟uCA"Rs4|FZA5F1k^rZ Pe*w{%Z1qϙ)<`DDy&n܅j] @Np"#Ip@RR48L] F<VJ#֧ʷ1!sÿ9(@`iÀ49rQn:IPؠ1 5!MtIK4BvЊ$HD^[CⰏٲr08:wZq`{cqTEp@F47jF~_8yv+&[f H@D_[~K<%FiZ\z;ރ [xaNT Qj0 bxdńQ¾'u3F IN;n  ~")}m]. ~n5ou[l |Kt}%%63b}X ᇫ`$@R`SEJRBJHeܙŠ) b}r6*xMω`o1xpN N1"*I<ѮpC,ՀVhN@*A-i'"urQkn0n ִ%C&V @EijvS'ďKN*7+%"aж.U@pi UF ءª =& 7փ6 ^@+4DϗmF, e+u @Lo(r˩L8"f8"_Qr#yv'3Fbu.Pyf)Hvu=)WMjr?4) Av4_4a0( El< ,Hd-m2B -1 90>5S:P|Ny/DFP<hýע'v#a^S c+:>m&t*0HbRc, 4P(ТZ]xMl( f AQ\jp /1n-kr'Co,c֏-EO@bh-E^@Kba-@ BG F,>{)fJw"_'n#NB/[A(+_^uC Bv:&D|C Xԋj/~QqvmQ#uo4DagQbE $#JvS^cu%j`1D .@ ,F{A GjFx)3`pϟ.xb+WO?zG-/Ʃn @?A bk!m='VwK+ZELUe$y]ĂtQ7-Ơ \H4h}W J)Hj: P2du}W9xZ#U8I:=2D4 ,)_%t*? P~`QJ`Y BB" R!1H;鰃8a٠qhGklJ_xg|W!mh0j󵄏>+Z%xMJPD#,WR(A ^"NpZ@6f^T`v,Wl3}Hs C#-R_ |5PGvT"GVIUJ@:r{޵05^."\L`}"\>5 {T#aZiW߿1c}vy?!n%m;fXToHr ʋzmPEkGg lyA)x&VSDqi^ѽ> .f3'`7}܃V]mH4/:u'oh̯SͼH2h=WZiot %C]t>1|qoX(x[}ܕM% hq}0ȫB"~t!Z; Í1B au)|-k"6mOF7X4K-Msh֛AjLw-f+I7*ڄL!\ Yɸ(E@ )Ғ_Tw$x,ث`kB1$~sF4иm A#H']Ht:kRb+THIթi5n>j o^ w(HBEAY,*\%3EBKq7>0 ?]qxAȤY"M`1۟~?e7\nОe tƫ&hP =V,[tn h0Iyu0GMW# /֝oVsY^nH2HX |>`\pM= <XZ:.6 "9u\ϫrٲ>x #,(%^Mh<rcVx F^!?J %,du[oT:lٗ~Пk{BaCjuy@/XH8@NQhPų◃nVUO="d.P2Mfm;ev |LN#$!DipJLn$!9*LII;tZrCo!WQ4c s@VJ(m8!Kj5jSE܈cH(0W~i;ܒqWKGpa4#R♷~IXGh}nhHMگ&5 (58²:m#;% 5&n , +X:Ÿlf Ρ5#V+VTPjY]IbZ.nZ M(qX.F~LrXoQxeɮ&AƬ~.; n(#1A\'`Ojg7kx?\&J6,wkIw~pպpis%o%S/*L8F@p !@@ nK,ʥ2<fIIW 3ҹ.lsAŸ݋Uz w홾#<BR%O@Xp\NqV_X Hlr+PhK4k~ f$ ۳X 9XӦ}O1IIulHحe+xD$ޫOl*Hgv&Qپci`s!ϲ; bJ )""dO^sfШH].!p4@EU+ ;f},n~LìԒxA|C) گwݍK݅>yς彚݊T@c,JDcrUZߝof[9]{m],PAO&>*L ܨ&JF钐[^\ cpuP FUDpRmkxrfF4V#&7H3g  ^ND▕),j^~ZjڏKU&upZIb[.՗x uuwuzW a=\N^ҊW ;¤hAc`넋XU\b \HJt ^r֞ ET% ڄ0f 8ľH)Az^qa0nvnm.2)o}4o<6ywdR2S= tdt e >y_\}:r\YgɵإV Œm12K q[)VdC.53.[ӡ@R#)L}V" ڻ'D&3B{Eb19(rr~-~=?W˭ځǽP0@oTJDlX. ,w{_ ] {}kӪBftD q N'm5a%;1*H,י R*E%T,.^L^ʚX;uKufovU}AOLqqdh,2|?ndeBY?ѼvU83>6(~W[k :Vm%ćqʄ(lnr9 ՓUi!Q`* [nn =a .n0p؂[0U 1#XDS[)Yf{>%’D9]fAВYqqL'N~Ftn"kIjg63,^j)2 BB@mpC .R[h``:1>@ 'lOl~3 ]gRTtxJhcL-;;]xzoc0 /?+clu+NrnR[1,e-ju)Fl4o!͵^"vY)plM,`غ}f8 S#Uq !sf7JoVuSr7NC\b%+ n!.E6~?,7:xHS1%Uf$ON,m쏴@/w-*fYm} )lgûXGEISkX$` h1ʘu %>=F""\]T ,K2T[|aeoQ$[n8yb~뻽 XL[ Ã+RtFڱ 7.ojTaȨ`FpAeQ61X-|f0A)ph HQ*3Yb<+&4Z mMu GEA r11֔TP|'X"QDyW匈{!,; #j *i?Ύ/lѵזZZ汒јe74X2M~mAfָ믤Bg%ku7P~WǸatkIwQ˞2ŢgVkpIY5jPcY^(=%l&a5g h]Q Vʋ%ttg%ú8m>> RZ$^3?ȒQŤ!6Qp@jAqLw2CV{VܧϺ#ZҾ*Pv.KZnD1wq޼^#E= = V7'QAZwAR\I?5RǨ.ӊf$=KǺ$}יb (V(} aW:Rg a%2t8|L>+NrN w wEcdUCŐj| %iB,^$? BN*tzrl]nJܔϫA‚0ִMPm#  V<`"<Sc~p2ZyC !wS\ux;~(2H'=dfVh~RRf1*KA\Na!!gxa(PJ#WUtS@cdZ'ֿ%u6m %H5Zw#Vigy&cx9J/ќ7lTW$_4qŒ*iɦEXcWeEIMBoI Ksɹzjq⃁636 )B u%2c+hڣg p7H$5@M3VƆp6Oa]*_2ԝo WmsivO-+XK?ZyoK}c #MsP>n+_4lрà^\i x:kы2Uq߆J$w5#;oL#ɪ$BÁ爒*Fzl*H'%%L_>S;bzϫqʎr)R#P>NkYCǘ+)Mk-)$n5v!;yRkYVÖ 2!ϛ8|qi:]DC> 0+8Y۽QRjL32'}kFR~brqW]N~4tt1ߴK6Yz,jTV|~lNv4[bw'vP n{Z}$%0iW;>G׿FZPBA: vi8R$VN~Vс% JIwgB4ߖͻ\n:|6x=,̗q0s.o2Kg>IhU,Q@^q  熱Wħ\Wr`&+GVgp҅"iRx p ҉ d@tR/GZ8HJ3%t7=?SKZoBy'X7J2J1_gqd隷ʴ[geBW-4_.8 F,@|\ynhV)+Rb*돌0E~iԩ= @/TppG9FJk>%`ۡWo B0Ջmٟ;bJMsiNIԝ=֝fG6 ): 5VyeAkNA%;& tt=W֏kph7Vy{ʀQPaRﶢఃAPaz;t*ڎa<$T< !h:u);dNWUq6Eu0/`AxR|{HҘܳU n5 .{Rx66,%-kV|\QVpGL?=jnl_tNvW)7/_E?ZS2"~;:h* KXC$ojJAu"Hqw/o`hz7~@ \k wC:#GĺY:1jt>pV=M0ηalu?6V6wNnB{v M+Fԛ|ϑ1TFg -|`AhJ>Sk&L؍K$ f qD h5v_nz0)hxs"c=סr.d39!bMs_|W7|=Q'<aϊ> GEUe P/@one sayp:3k|BC賳}km='􋼗=̳[{? G>Ć!<(`HBhNH<wvܘ`vkaܐͯjMaZ^6[%`bFA!>TYIYd_WX{R 0(=:FN leb 1ux./02;uuzlE &;>KS5nx(3O>LG$SkɋyFJRϳ[<._S;%9s̯Lês¶qR(#q{F2s7]D+Ffu MɁTQH5Mi+$$N]z޴9CNipl.zXNe47&՟_"F~9K=Sot՟l0nu._>z_ܹFuW6S[ﭱ>[Ƥ Ÿ9Qެ5!@Y,*Va9?RBY)s3 }y2,}^鴕yRW1r^*K5cHJ_.{PCrkWCFVaQKSL1Hi;>#=p(. OHE]*}%4K7οe9FR! cZ2Q ,uPc~0pjqV-4ü7;Sbfe&`]d P|MM1;{1(nwpyZO?^xߺ|/ǧlŪQJ 얡 & 4ϯn/ܗ:@l _S6~JV;o=OnktݪF&'N\L !۵LSR1A]1ez-b!9N6.BUǮv}5;ۙ];lbޯCthXz'ПgE0nvmh1!~$[m~I/]ceŧ`IsGB#A{"#JD-å`"[:  >j˩&]*G$t-0\?,ڗXsVdP)Տ>@ isaBzqN%I,Oj{ŒZ4R=,\<jnҢ ݧ MLr װ"e]]2< E.sn떁wv %q)(8MU ӵ:rvV^8*k,2W~4xA9 R3`71L|Dd<>_{_Qњz[)FI=Rtm[J;ګ{@E8LZ_v{ءtqb!y+;Pc5^=-¤Sy`9XzUahAY L"v CY jt<2$T[Μ`_^\8ꥳ>3qJ"d[Hj9yg*(\LS ו#|}Ѽm/jUA%.\W@30?g_fԂ RFPXU4DU6iT^,?o|ZRl}ڑL[bC7=z.Zޡd]|u:g~?g/a)ԎiòC|;[#d]AnF˩oNm;kЩ 7)lcCV93'-llѼo8D$Q!wԮW:6Ѷyr@(5/WC@D,$L_Q(E:z\DD˩7^5-'whVƃ]! jQu[|d\"'a݉IvW<_g6eaŻ+/y%VD44C K\. vfa 6R&}\W)*@I` %lRFr"DUz^椸Ay)=C-+:VnB4LWbk 5SgZ絽BBa{8hQl[ku2qzRt-Id{+d]l 3Y˥RSݬF{14i\[ o^E\Brz7_ߕ]Q(CZ?#dC,Ũ۹ZGEiEfqfe|e 8~v+>FJA^ .J<5V ;2B6!w-Kx-ɹRJOj-S qߝo O&B(±;Kz&Á*U8ȂpgQl,u7vVC{%VX&)Zҹ̧nA!0/k^DJ2g([BJv&Ұ'~0|ȥKŕ`[c]+˾Z1uŪa w&,x߶Kz7IR{DlMu!BP'[@r?] D$Ӹ;FTٜͩnOxLһ쓍31Ij&K #ջ)ŘsǶdwcnX$ZɭW<3TWd5YWm{0iWm˒NR_8\Uiыa qRϧsU['q\WluI=Ge==$$VϚ>rlY2,N*6WzSy+U>mkIjqDU(Soƒ%,vJX LUSib%ZGv4}{jb\Yk ]ގ`/ٮ8A\=yᔿӑ*daHr&A6IP*PۉzIf￱!T_E˞w+JL9V_Ht*W;Q3dƗ;0 TODՋCFLR"?h9t5W_W̛0N{/Ws{vU Usq=N}Zz?$MJY@Hɩ8}t ʷ\1a\)-~sH7o7\'p7'} | p~]~aE~܈Kx&Fs]5_ٶOPo]̈%޻<ˎX 8#L٠<@"&z }a eRR5f_qڶޕ7/r &w^eǸ`s0{},6TULWl^|'M6ϱ&s ɒ\'~ ocMOVI ˤk}&F|Bx;j%h r[br 6GnwkV|K['n_zǸnsñFFx4̍V+NV} >W&ʸҮkbtDLw,ɏ\^r w#4q6Nj]5]0)YwwS1ѾskJ*C Ԟx8?7mkyqλueC`{O}fzqKiJo,M-׈PTSTP8q)H7=!LUhX5%)S:~RfNi4%gEl[D8 _KGxi[ K Tck,!\p~|^Xز[cKtX V6\5W,(!7:_x5irߺPjL ;"3Lg< ؕ^Xn5)n5Lj9\VAX,jW|,[>\›-w:J` cʆu5/칢8ΝbTLUqane `5Js@IBݢx:g>4d)0vI[Ge#0($p{ДSN|aַL.{9Ƚ1'}XI7Wo/zKhwxـΔ8,44 D֥l7|U&|*?«*`WZcDU]F7 Y}vO/Si%rrY~QOtT@1װ BèӖڡ[C6w> 7wIq(rrc jً44Z2ً%!ٝY WF`U$w0̓Jș(?O.ڞxq>dB*d1 'UU.fN\O4O|ebH$K?*pX'-s1_Á@W}U[d55NzȽ,rOj:j,+R /§^ExY( Zd!,ddFLwT[|uț8.v' ܚ51IDWmei?[evzyO5gݶ%Uu-TW`vt52sp۩nI\n’E1DS) H< ܯS@#~x"LUSzxp݀ *[QYPB̭n*!F\YFGWvڏ( K5yc+%@4S"ӕ-9xJ Vj%Xh-=g&n(+l](Xdn;}O8NrS}3Few1h\g0XCϔvxZ[R~ۖ#dž d>?pQؽ\-Pef~|Zu`/'x\Q\Xܿ{yt0&JضϘr(a#ї=}+k}KߚlH2˕D1 [#i%o-79xɓO&OpџKkBdY9_X=wc [Fl]X̳;V]aJm@o![^e{5W7#zR ?r\c7~8hjJYZ^fR,:DUvը*;'N%|&}wSK|VTY6U/pԎ99E~&0U&Jad]Xb%N>֐`ۮ6;o+4y]O-zn~)r3ND4=N6:#BwI1=t!nPyPHeȐ}IْWxlf%]f'M6kp\tdZ9C#h#ejQs p|сVRb{ uZbds(>A,xCK^c_ s%dX#dT 謹rO㢩LnYAV?i/LL.6חy:>X]~"㮹rkz">7F !\-QwIі(.l1UQݤ/}[BȤR'`Znf#w6L[W,FpynlݙTfn)"TYα$ձ@}% .5aO8Z٨tܪ LU | [GhuW ǭ4W4)rďK,d4w')w?mD[LyTU^JɉS-{nMT_Oql1Co1әӦcX!ʟ0>'?Oc;虚ld΂X4=YIrSi!~ln|Z!jKӭ׼yiW<ڋXS.Q*e4> a_0=*j9 CA|YG@ub3y̎TәN %;$(#^c'C2}I V5Y!eM|H1,lgl8 ! i:behRʽϨ\48aBPz-l>=~, |1nnG#dmT"bљ2 |\{FEΏC=U oUk/i1N7u1cgư9n{$P[{% VZ / ֕'z|0=L6ޟ,dzHg ;l_{+MR"<n@*,%Eo#սY{tb&}k_;7CW_<]6ڠIIQ@JخcPXD\4n|5NM< "Z˪m^fW8>o|ϯcEE|!z|%* H$u.'3?/'okCn^4})_"4Ho0^/o1=oêdA@|N;^鏌$Q0gx[cqƤͤ.|3TMFq[%&اPpMP?k Uqhx鯯zmւ愓lXHG鲴޿ݜ,Ndenw Ft^O}5_[s%v~uYC1x8j}4yV:O{'΂ jr(6|mtM1q5ִoeGIu;f6jj_o+߂Iŕw|$Ķ" rGOggS@ ﹦0ld*$!!$"#!(&%tzt{ruv  !!$&~.@KW?|~FxRWCԣ7\_QxXI=YtR:! GF5C %v6_ӛqrkЀǰT_oo)~ 75D]/$ӹP(!P;ܱ@iQ(-W,* >Nрv\'%^=vSyܮKlӇY5zu֮4 ͱtƻxo)=i2xjNǕImsg?o!~z W&kgUN\MUrH0$U4}-`!Ba>|.NBVV\$%֋0ɮ(c P)[-y7z(:wN%ShXf"\s Ij{9Lwc0cf^HFB7.4n=zQəct] NIeBX#d^h FyC"zho%fˏ]^ϥ}A-QG&$>6xb5Y yz(G-e)B[2na1?i~kc<)  窅ɇPu]+P,>lnU;./x<29TUT?}lQL GWOG3yثSF!bHo:'_k,ᗿDMok1]Ĕ6@Axvhϖc:A*y 11JKnvtQ:l.ހЀ`aZ=)aj8ԅ |! ͪ65m#DDCvd?$u;U< ǗEzR [I[;LC+^jv4I!{)kFՠnbXwi01H>&rdM4Zۅ)ay$q<3gڡUB,0бpr-" H xJPy$<,V 0.$rAeE;ƁnVq tqH7H R\0˒LQa9_fXyoEˋu$ZWOD@}x}5QvH*%%H$0pE~. [dvl\0,D)U߭i2'2bÓl#d8kdz q&}xɢe5畁H$ʀZ*h`E&>1 ?~n*j`iid,#RȜr?Oi,?.Dv/5$U@`BMnex/* >!Ab!D>|Lo9]tɍ_sa p4 pMY NĂt>!@"@(U@P752?&E \( DmI+f)щBy/LYB,}!Q$rkra'gEdYHcD oF^.^v9HT[#rj@l @][.nF` * Ȉ`bP ,jEaT]lwl>>՞tfNuJ?g\ \!N, LW(d"7~pI^Y~{5ԺH׊TW,K\lq`{pMMFJSr<[ln~+?^1|RhF|uy"ALWtv9F{qZf}2hRP\]ᶅ08 >W<7JAu_ ,laWvrԾȀgkiR-rzCZ|0i; Y6&OSSX_v=;cK UUO-YJG,7+OwÛ˳h qک4e9xhxu=F\Þ+@Tq}=˜3lJdC4e7GH7NjMY+lz,.1%.p;KDum /:LH~6Rv UߺK7j., @+!Ù(YUD}BzAB+c 7`Ba@BDs:j9JY;1JN5drE1>*e>lzDlbcK>7$\j*84RqŒL#naLL/.O:Kœ΋lP ֡5 # yr AP[U[@`Ee><~ V tlꆀ p]'èy"&ADP³ ;Uyp ox\+ָ?:vǑ4@hOn0&ƈZ/[y0lzMkDe zڭd*@ F-Z Ho@S/(XTۄ'; VφYNDDu5H"^;v; Ő[n H)iݣ4cc_R ~ [ 1L1:u- R;L԰ʝ"cÍ\^jGnBvo*hSZ2S:U%HE.&TQ3 K;>ٌdw[ Bȗ:q:V)/M ]kxC"g+IC?Zn\h{xpERoWED 01*!n&rR $%"J"K`b~~j#ZxvOggS@ ﹦0V^'6$!$! #&%$ ! #!&*% # %"##! "'%d =pvb jD!w`p@Sm^j`EH^8xvNe_@FpYx[ QԷA7..h!@ L*}zc\No=biI s .p6*Ƹtx]+]TWg^/bG nMs3+ NpqkטU|I/y|^"-UMArmȱEw*"]2_ŌT!&l$T2oQ|ܽT\!tb >8+R#OEp!bG!607mE $;hs\!?>1GK-}+78SǢxy>u٣gDm܆6cPP x&3)' ⌚v uȀ+$)A$! ]+ER ""T\k;q Up])M#{Ch"2SK_` %gɸ ` n(@M]-jw.Ǒo;7sGYF'ێGxT R)@H ݍh5h ׬. E3~Lf;v_;î'MN-qm0qlǁNWz{Z'hlzrϏl4*/M`}] 㣊PO;D>ABº ^ 6U҉ x\$c6= dx>F*ǡ?)U3 7E&hADTx4]״[ANdPkZFgpUڰFߖ8^&>1˧vӿ88I̓5hz9 zݼX)XRU>BNUeEr4և,o: I)A.Օ#o]=۟$q>9@C*ӷ?y{3òT1ׯyXX>PPk!p6ªy(M] Fw*;&)Ս[ 3t'HO5:j*nugiv9o7&7}\Z'FLv>mbTS (MRvqo̩E^h윴WKILQN'!xk3Ȗ5#u=1QDMM+^>U5ͩՊ1lvv}vIcI>uGf{澽]w U-T]ۗc@o[ws%vs/mEZϔlcQd8w@Is=U @v4')CNAzf>1trٔ 0e"ל_Ύb,a9R*L~zQgrSK0Z4( Ԡ4BQIZFT*<`cBH2 ^WJ.mzaA->VP$9B׈.ޜq|I%fu=% nCƂ>LHWtڏtc~^ZhRQw0/Ѭ8bW/,+¬}(NEI%A h . X( ތ'WdVU8$]rJ.v1;%ieBs&?qgYUj}fhqJg_Dc#"8x` *4{`Dp.?"&.Q1 #Dh[6@25},LQQFm|>`X&BTrҔӛNϮsfVݍU tе: .D$d[HDeМ</[{1Y~]=a2WÜ T[(t_Uvzk0;1vD4O0o|1A&_6xe|gG"U:Thf)f^&/sr\ko2o^IFwb[ ]P @nGODЀ < .Y pTG@{UZ0DXp|!HnK\T qGP-Y O4},1vC I Ajʸa/d xJCb(Y>VkE2`KP<%$AMIMp$n𪅛%*>PDAۢK4vqLDj6;6-!ī%k)D](k?rMU/vw,2m~Y݊ CVM%e#*o[ҹA= fÈ`n,ȨMp̡D,ThD7H2EۂvD"޻n?P \U?>ۃI;$rjk*ncV\U3b^y Lw-rlQHVLUh~d}^Q2[e)d[on_|yoI6 ^RTOG؁@sȮy71;LU+nƒjlҠUvu% TYuԕ!ec]6o8͔ZZl_HD^4%ldޗoLSy!{%ROK\S,ya8TQ) OTO;;&j ^h/ \$<~ "ZBOggS@d ﹦0ޫj0$!! !%(( " "! &%%!!!" #%&.^a PNϭ0]_mYw`)$-,x~F'r\i5Ɩm@;Ȇ# # @sPP @PTƋ,ntIAri0P#~">l6:]_fզ@wj1<Ѧ>N4k[|6_i s K2ө&S^m=9[;Kv.ë?zH|(j$b`r3)(9Ņ>68"XyPh|()T[0X`!B>SꋃƓ|f#x}~M Da!dRN&}Mꠚ$QQ^!~s.پB0b @8) ڳB<A!p'-Dެn%F*b:ds S6ODd)?0:7^ekO-$= njC2Yk֔"WSM uR P`?>K50\v v[Et3P3:AD@.2 ^v4;zw0ra 0#;DG$Wl~$޴nӧfUl) I,@4Ɏeg d" ^A$B(pB_5X\7n%Ƈ,%e9rxe`b)) )D;{fQ7'jOYNb# 0F$q`CEBQogsα3 %CM O4`E[ƺB 3/xtׇ+A ĨDHaFzxot3mͪ#.S,c4a[HgCY`Tm[`(ꔛFpk@;GkNp#S%1H<@~b(&^ &p;']ڠ z^ĮD($O=8_рXgq֏j/5f/IqBͫ RV}*AaE.Ab Ia @dpDq`A``ƲPD j( 4x`z f_k1äVh 'W84w/M=vit+[E-1(#Ou֚UlL!CP;jŨEBn@H, TNQ8PY,u[ADW8* $^pŬ_C̈ѧ \WiJy[E`2_Z)dFU\WMШJ)qƒP_N ϥC2nDW)q P-RyXwU(p LW4_+Ir[DdWBWU"ڣH#rL:fvL[ӻI}Aո{{=Ź2cIY-*MP1: "7Bĥc8xXjU^< WҮ?&-"S6'fxR:(vU2L])j6؂elT6CJYZRn޻J4tܙ.)w0α:[aEPgF^)KE> vQFnE'\P:(9']of]kQ#d֥33|viq{FT2t B :f lG90JxL 1᷾z^w+s8KȞVpzo8bБ|W@N9 3>#MƱ7JTc~\X[x(iymK&'s3'? FӛC@A]I x6 c-"{٤ʅqo`*WpOggS@ ﹦0 (`&%&ntvqz|w #! (%}|~|6>i (~N 0׳'Jhm= 2rF e=Ʋz90n=F"+P#uY5%zlbPHԤ4d2Dn&)bㅵDA+>|./|d% & DъUֶ K!։('D"bDc?5[,_\d:eح7đgàHAJjcp^Ԁ2r\L80bQJsRunLunnJ3+W׏8"d V$0j88h*%{-iBRJ%u EnQ]T<`P1\R+X4Ћ46YOD`}U!98߬~0h1eеU**m[qp@3ao;%nB\P\J HnҀ:=b},뿜4ӵn]vn\g'G(Sƅ Nǐ !ݚF֭J R,uKBYRT)U"a~^@lLSU®Lx? GGoWvOש۝mvm}q?dv!QFhȈ5]D*8gᖕ :'"Y㘻?noQ=evȼvlv4:5U4 dZA2Wj~5ri8;*1 uB iG|+q(ig/Cs6,\e98ltx<l}!b-umvŪ?4T A(بDM92i n&2J8粵_6lb"G1(ħjҗj5*]A3Q\_䈫K R>mJSDrǹyv}N74\e٘R`'sVdeJg.sdn_]/:1 A`_qZB 0> “!̺#= INnz=Rs\qѤODFaqHysrؽ+P+@5y]H@ 1uma1Q#m o\d$Yɺê7^nI=Ƃ>M-BXSƢӱj1 ɀIE̴1aPi68.!nWcJ0 p U-׸@,<>hi3ak!K.5RkjD"V {UP$RHaۙqGx|}ze(!JT0+) c)@ˏ]n\H@DU( ?p", "&cfXͦp";T y)b"aۢJ0ץHب?8iBGT)H oLI<FB$ZqA^ p >ֱK__ ,h-Z1 #R@_R \Vbq L^A5NLkGl x)$SĄDY4Q_Bso t({ IiU@2@ )k]t-7+ K F@v;1҄> X>mX$DzF*z~Û3rxP`>hl\uۇaT 0rmc|XD0D0@I\mXԈwEȃUH`PT>r.E L[ JhBe,WVZdNG:v5k) <[Zg#<}~; RTH1LYMСJU͗WP=&d$LYOeq mYkǽN`Eo~|\hT]dB@U?o硫oxknkz&m`[f`7LCWDEX/179E"҃j^aN[A7\}}"2^m?.ϣf4u.ŐGvxz|9kCkBRsX\^ l1fHI_\LCJ_YuslG9\ t8">DKiBU5<"Q9ڦI]i?2KnmF#[ BeJ,Ue\$1b8|YūHJ'.52%YԡʨJE[]4lR)̗lnỿTkNp(e>1DkZ* L(N@8h@-cPg >T#M ˂ D71J+ \$>Mw81s禯 t `nț4MA`pb*lPl ABR^,LOggS= ﹦0!X2~!"!"%%&$#""!('%!$#)$#%$$m^!sjņFhf9ucֹArʌP#FDiv\sb)ϳ .:o!Ϯ&7pQ!i5o؀cg.$Pd"Fn iZM=R6a\ n@;!6ۚ%3|VK:]@G3H,Hc혇X^uTe#)ވ~-* 5p P`> J@Ba5\"X"> K_VrKel Ω3L4;W)ׁʪ1SS=Zp8@0Bc@$Po.wS pJؒ܊B "V U MQ[> @A~$aZXۿ|ᕩ /%~}vrm7u/S$\`;: _ #|vJOr<[`Qݍ\n/n(9"yFGePc\DW*+S/=cZj,uDSteʚ )8<^DUSծq +'_Fu7<"DO ϓ"B^|YOM%>sDQHtrij͔"kbYsDWJa~"5 (h[ܚd][+Ϸ#֯ ۑi.LLY r</8/!'MP {3z6E0,  \HqȟÜ>CSa1˜> xc*x󃌷>brbS*_HqC׹^n5;){*!떈>&RS̽H}=)vh;"U̒Mn0muݽ/aH zfqaXTn( w-6^b W#F/-'VcD%/('}f Tt[LODDG\VUX[aX\stٔt3i23h7 !ٺSƈ'a5KzdHbqVB@Q GdI͍W&̸V?@Q/ڐ|OE%y ]|Z7a#H2D{C!Ƀ/E%N.͑1K9*wS3 W,nh)j'0U0$Te~PF֓X{43qߧLS%jyXVTm54ҍf8.,Sh3Hs~ ZlR&.׿uQ LWfMQ(e@F%8"!&W)r!dcl+!kp;WܖO~g\}(Z\. YQP.ɚ86ASC9O]m56ULh"z웩փ0Ik!Uӿ!uJHO@}ǁȨz9jTM6 PUr`26"c "|>zBKjRNY}4# Q ՟dRu UHt"$ҠN>K,dŶ$GiX.<3w' FgDz@W ` H}ρ} p!J" l[d䝇m>cLHInvCVP%=ai5 L('ND'L^yώ2O -r <dPzDYہ/oZ :Fe;AD,VUu;n~DmTIrc(!ks Ek>UKePPD$|_a׍I;^Ԉ 7ZllSP>) L~MH#Q#;ߐCep#2$dP*:.${w .DY)08ĬK'-3F$(<ʤF,Qӕr}rikIO}R8~o~*cLS˨/[F+}Xݪ4.7&ۡ% TYY!9 xsث89?.>7 \\]R׼H:t^bL aa%m[;kB %CNlU6Gx%g&(bVX0Z3%e犪'v72;^XW{u N1vnrqޟ>ɓ~;ʅ'STMUszVhWǔ"KcJ7[^dtrO̡7q@X.?$@R C QPtӡgz-׶bAYK]TWJ<`JZE;s~Bմf!R|*ULʐMX"C=\ @vX1Sk:a"R!`bx+I@"@']{6RcD͔3b9=q8\5#i">X6bһ]~񇗿(zvÄѶ{Ham@w3`U@([H3ͥ#@a 9BRD|:ڝ=ڭT,!v \UK;6~=_:޷sᾧE%)Qje-=$~ڹEkpt9vz^=OK![eu2D4E(A @S Ӹ (@ )P!z~Q$iZk]7?,c}ea @[Y-s9]4MY˳Hnavsw<\b >R$Qڟ%t?Fe_w!Bv1[%OggS ﹦0"JZ;""*+(&#%$#("($!" !"),&%%#!%''% !"# !%&%"%#'-LY_l( uAoDJjn*Dێ֐ic81cK ,XJD^h*FxXǡqQ?|^ձ6<[a+6o8<ܞwʗ+zڎfr~2^IkY\[ WWs=:N7G.뒠?Xd_dZ`i0iKJObYޮGc6STz+fL(xb# 2|oNg@3$KHk8oEnM|PZX$.m3mpܬfu[ιÊ1ebU !uFn: ǙKǯ 78;i`P'c>,oEC pg5uFl~iExZd,#\imt)fVtkk S#LDWw/_;dLT!>q\2o2|}uל~ dف!5ەzٻt\XUa2:L+d07ۥm~L1^Ln,l/`_WȈ~"r+MK*DΓO6ZGͩǻJdV+)Dہ3Sm$nD<;P\I7Xqle2,,O2?lHKgsTאS7zÆC Z~hH[tߚ{ $OK4\W(N>)sZ*Y׼,1rZE_֕vLcA(^TJ4`6Q woYv%gãv{mLՠr0=h<4dۨ7) Kړ򦿮- &p+xZӭqSR,˘':*R&L׮?ۭx LW*|Zai.3b;UKY=7z3\Gz5SS^'Z_ba]\QKvo$^rU_>aFSħ G$ow3U*Ia=ͮ)[U>D5{ ^C;;Gxr,moo*PR*0Շ9w=:f,>zAmdd}jIeaWZsI[K)OU\ׅ?}4fˏ SoOoK&HJ&Gr@88 pDa$[ n7P1 mmL(KO?$QS QbL@gP ތ޸>& G&F4/}h9t %(Mct)Ucw^ ҉2 <&휪˳+ q :sd}LQUvvt`-|å+0p;`KmbU>95@J  b̵_XZr(3׹>SHgߺ$4cFCSCYO@^A; r(;)X6bĊ`NiBE$_T5,8g:.\y&]zڜWncz&"WA%p|jA`[>!9TNS `5\z_>:w 1dQ!_@]__wnb,aJKvxI}:x̜P2Ibq(0=U>/JoKKr+Ŕ4p_˨ 8>,6vAv?ʈ'˸jgv;1%l}CD4G"Esau$Oj}E4[2*g1R3`e["!Y zBQVDDj d4\~E])6k80\*PNűo]dP̓IrAu>G}ƨ8O0ЩSu73Ǭzv'vxY̿Ǿ<Ge:E6W%~=?B~sa958qz}r|B̻7~ K v) 9hŚ*h3&Ϧ!<zAKjdkLE+K7M81lG9MC#ѝ[q2d&$%2N8t]0pJX.*(S'+!R [Pa~v6"+,UK&/xmuA|13YJ2XDU*ng֏\ ./w}n5[RsLU'ae_ yMR$QdʶZ<gjV?15A${,O٠&uxJ5M=wj_X9Q4OaTN]ٻd%/Jr!Rc6.L׺Ʃwf}(x lW#,L]x̪K67cmJZ1,176]0 T_VaB>ض|wG@SbhřKϮ/+z= uHcʹOv\IbJg+:\ zNw ?+;f!l;::9)Øo] D_ N[SY׻"=kMI*T_Ȫ.JM8$Ty#U  <'R)ON=D4%b Z¼So&uw srr輶<6(wVJ4k\&pJ2?2ב>>$!dFZ'bX]dSD!-x&,.n>8&&(:<bi"0i_atBDHOf۶6cVKlMcߑjPCXA +$ZZFyl~<2+p0-j"adÄ~z 4b' hĸ /cEH,b7Ĕ9xybS5M .=#uxi1qw֫Rn2sY|3_՛,n FlW7 T`hg%1.ī^zUI¦G !!,tJD!@%iFX4J g΂rS;3j!EHjkF̷M8xR"PA1Χ74%SjrPGG,^_bPq3L""F`gT~qr[F[+,i^1ƅo9l 8|-ݿ<7瓦E/"9)@4t`s>2d3ڟ/&빨ˆ&뺉1"G?}TMvc -|4Wv Ӣ'D[ƽ^ޱ$nϘ |:w 7sjK7C YEfC PB@ AYY [VCjktOoars0/ɡ5?fnǓ~>8nsWJ7=M7ͧ-ŠQ2n&( J}je1@vz+Ih\QOOuLc :Kukm$7'-̗OvQ;vܨpp&RJ582J8fB3'XX `eTYPJ-Pm,~MWMCt = lj& nU:-UKm1!գ8p3|NtD)k,IJnKOy#^Ef*`ʔ"o`9Hb1 !yڒ0qRPoBgd:!0 Bѽ}:JD4&vd6̈^iL6(qq;aFXvjt.@pLhJs<|)o4('^35Eb"?f=n0U(e2$4CӤO?JʰN<0c')aAۜz2W*94/0bTꎻKB:G!ݰu܅ ȅN;6ULR ^^Ĩ7?(92譛P5Xx<θcreݩu4w[ q;f~c.2WvN﷠ys1D@=UPڶQWݝ|mkgBsjeu׹J\65f ^,.2I.j^@$vS/GJ(ԪI`\cXcԋHb6oc{GuVr$"TBtwI$qP07vN~B#a- @ҴC1Z-lхܟo4(+*j;q0TAvxndl 0JζzpPVrYUY[°DL4wC>crǡCer2ʤLώ4ԓ=ϵl:5zcX)7EZL +}%F#bMZ fkt( 1NIo^~3O3Kc|珺ivKdl|$WCUv2H\ rn\]MoE 5q@,@dָ̙APQ o`iWyMS0G=2mv &|[ڡ8q##̐ɭRι[?׈4DwoА~%:Q:mot8J{eho޽fkHwO!/{N#z)a.Ѹsm8/1*!޻uA{k|.=*ϲ&$,t9{q9І囆qV+R;q;P L%d}=>m}݈$ $+YY$ a}HE3<7& PY,`F f@" mp1ۥ N̺aXTB3jeHn(HSD3-ǥiyJqT'QۖCšxII 'SOTYѕVh)^R( "^ v)@ēBXw8/( ₑ☰/Id&[ÂNq1L#3`=,XaP0H x0JT@ X,D+!fAFP(@ˍpN- ƙVۥ X6%Pl8Q,`EM#e axqD"CXN=x6[q('8ݡ%0LG"w%Qt)\ ="Mľ/4a4* JЦpmTG`\V\f Q `Jq OggS@]﹦0$A1a`(|$""# (&(է$!$$"!&'#_C etmE:zNaJP )QD%K'SgkKf/ymns TCD0X)ȉu(%"(K$>\BJGJR i~ $|)њ\7YX2%^a#it79驧鈴;;@LP$hw,|`LAwȊ w-( БD E;Ɓ0eoBex 2q æv_|(hxOļ$za*/kx $" cII_=I2P ńNߩ#ꁟ{c ~S[o$֕2ܽ 7w0(Jks<~\6> 8,}$ٟpݞ ff,_Z6YlseFm^uOy-w.ܴ-n{trTrسQڳz:oNxr Fya/wք,w茚r1ud/ޝ6vuIOڌpR曟Pَ=ə[ @ OBtX4fG#${r($ kXFR5+(R w'7$TZ&XV]ܷl Z9Mwdqb[ A! $l ` K>4DohsAx-B_0RJU='je@)>}g88?uP"$ ठ w$QNmX;\YuCa7ɻLT H+>]dХbna-J2A""WHQ_Io$*\7^"0~ A G/VPDޅd C"7.x! pyM7AA`1p.5 &Dv 馡ZhKg{@|ƔRcH߲ƒmj@DYN?W0}VR 5\hVYУPRRP#PjR 8T@*\_"ka :0a7gCZVWF\'D[Z:}` 7r~n1kzZQk;-@Uo{UնK{. g柀86j t\\A`-Zq|ZlY,ru5J Y!& 4A!P#-LQp4;UvT@~)GO OJpDWAs^'wdS4u.TSQ qv=xP{fDiETDSсJ~|W𾮏+37~S[T]*f]:0&<֖ؔ򫗺mSצU$[BJE|2`ˏT/rjy]ϵz-7zutDQF{jޏϼ֒?{Cm;oESj m7h~vvg4FT1&"vϝb-i n L)|V>5?_ROw߶D'!mݜ{DҊVSͯ6M }F qrH+~1]闗\@dk&QhFVi椼' ;|37Xj~o\rTIYl>bG o=3NeBBhNK}c;}[u:=bc<*;{:ϧg%1{ClŶiƥF)KM6E nqfnaU棈~\U;&Qjs%:72w7Hcߋf_U>Ӹr xy}f[)zf8%i-?%Y ܍lȮ<k!qq%*6ǚK# 1Bsb %E ];5RI %)R7XjȶV\%*ɲs_e >^>HRCEuN,g = p|' OH,.Q_oc-?&yFňY A;1': 'p;nFy+U`T NղhX@fsPR }ڲ䇥=ϛ.w0lv.?vkoMatd 4̿s=`V.+vl[Y?B&}61491sב=U? K;ˆQlY[s}䶓12 Jcb!-7&;ԗp?B~ܙy`*UzUR_AѴzhݏGztî XTT\B*F18jCC!(AOsrv|MIP\S,SgcW5:jJ${a[V6CP@GH J 5 Vz}F8_/KÁK/%ʓыb|W /m>T`Dc Pm.J$h~Uju(t(•~bSrM;{%QJj0cjQ 1H$F-ꍱ,4ƭѯ2h͹~"m.3ct{}y 8%ޟ$͒* g'/J#4)yxxPWwmfncs5F%5 F D}Fdڸn > nan+Júh2n%jAzC(wFT] Wף"ϧ܄`oƓؐL[d/Bkpi;N%En'2yR 64ZbkDȜ]fJyU0aa+2%qzU rĢ󢘣?8s -NX6@Y(-,70@3˧nTe_ʄ]8 $"Ъ`QCE$MX\"V OggS@﹦0%P"zqnw}{uy}}{|{#)n%UN|:QNF33246yrB/;J5z(7  +YW,/zFů),\R Y$@a 7aj^c^T}㪌 }`K]aJ yaJ*%ecjTC@ ctkJ%qd `V(T@ F|P|XAͦ4C(\ D<*vYaJ}ln$ Y rn= <(ŋjB/ ;;AJ!T( "Hb>-yÍL?qg+Jt ؒ+.%.97D#Y\2@)nXQ \ k@4Pa>L.M@fwffR+M (~^*\~tn+(gM2/%b_$ң[@x4Mp vX-deeqah  V ӡUKMÊL_RLf}J^L6D$e/SxPO=9>"(0* }y#z|33DZGCD1Ȣ*T i2D#2XI)D7 s>UszZMGD\ Q$nQ[Nс=vTi8=`*a%f79(+]SΚz=#f}ÝHa^ P@Ċ(@JD@fHjYߑnAqRj!b^bP#T .ɀY?j"GSFܹ&u÷ Eh||gyBN8+Z8PO V%Eb Er+AR XB#` - vQ5n89;2 5ܱeLO㤿\ӣG/Q~ YnFp t}hu(`,X8M'MyXD>0(X -uƀ0 `cn B%ªGzrd^y|;ӎoX(;nse:߯_[@*'0:!DD*&@ڰAW}#$]p*^~#PEu5YCJ fހ`2mf2JK> "G Yӑe/FXU ]b܊/UA(䀡:@@ H1AJFr Y'YeFm- Ŏ5>fL<1z@hKQ질)MBe¾rXٻ**,(Z e\G nVXnHbN,^]( ElV/XO)+?y*6X4>Gcb} @I} D0`Jq0[-_ ` Ȓ(0Z #.E~F#e Xurq7ʐJ 5킀4S!aC%ijFQ2kl<-p(Ҳ`lCGI0Q@J61s!* G$< $m" @>c/CYF{+A$.()Q$|Q,D)?qb8[rlxp8t;*5< U.cJ]%lB +z5= .rěMf$HK  ; nh,g<Ӗ"X *6DJ8 |V\ȑɛ5s5wT+KD pCMtd ƪ dw0QtI µܘU"zP^"- /t+7@"PB"1P(,t"J̀eq*%t܆LerTu7Fv.2.3aT6K$@$6mV@EFKĜ6Q<01 ۘ'Ѧ0D^때A/n\(2>,BlE)SApAh۞t J L7PfҀkpQ0 @AS1{ clVfԺ(N%'HOR_zx7LgywO{ߟô5/ (bd) |$E| vP C.%sIG|$R$O NWѹz`n9t㛛T*ŗE2ȧю;H]| *Z\` qB1"DE ܸ,d np@dIâ="-$f)F8=\p#* ,TTeШ_n2Fcq fok4 Vb40ͬ4>hq#hT 28 `K yڈT\D"MM@Tm!(UٓPA1/B>&3nӻqeg`wv!\1sJrH 67 Goy c"|PoPXR‚@^LNَrC_y cՒ-;"d|vSz0f8Jك.~7b c@a $DP} BCQB]<m+vQ6{ E/ДXP>x>F^ڼ8>HX7X)b5'7.Jr[ӼcJlKB|UCf-UEȊvpI[@X.*rHE'ڤ,ۥL4 X~rǥ LӭDH.b`t ZًGEb<{SK͵&D\.6(~OF!%$4Q0@, "",v@c~fK<]/id˽'#ڊY'ɘ:=_D2>| 64ٕi%\hHV{dM$(%"NlXB;mK)Gd ",RFX!Оi i?}$SnԈg Ko?1 Gq6QQ8E\a\M Tq)C{yYq$Me!7=؎!amC!`K-"&~7+v1<.QaQiSUDӰQ2ү6ғMфlHUΧC]oednx3Y=O6(&r)!*uySU 5_IF C@H~v|MEǠt.3sޔyGi |6yb2aȧˮ@ K@Me,sM7}OP5RЭDF ?kvӊ\.Tǔ/ mZcɸw8"@8TO$Q&y>sdTsܲ]ETdZZw3k1Go˪R32ҌBSZ&v.< k@ m8*H\h8$5 Xܾ"m덖nӗn@ 05.HslMCƕB1Zz "-Klј>B3 LrRHh]`KsR*Txj:6q%;H7:Lpj;wD. TpIFJr. 62'mFȾ| %3v1Y˓5". Lb.jJA[VQd<>8xSS8?IUHU, ,#P&7("#"*JCu0%aSl1ܺv5 _ȻCUJW>neE 쨰F"YhcXD\9=%Fd_(VDvB%l,'אސdrRk7@haRkUjB[>uHvQD+Z>|΃ʏAn dH :7@d"[bGӒmJ]^Fv>ޖb_)6\~$ 2HnB$+@spo/d TT % ^LN>;%;sӢ bp^={H8%ɪ*Ni,&QӸd`!|>э)eOBASbJ$7Z R]Jq4 }",NBL7M^S]Bdαg?{ЎD$L 4YeQ}{XhR }C![ph8ˏbh`A%,NQ҇"\Xe X •+NR^RU7=^lX@F4w>($MV`Mv6#CÜʶFs 03vy( P6,@ $ONG1倝 ,@,* vS*n,`xdasJ$TTOݞ47uDxm ƸXsit%"Xh߲#]rԒ&d~l]t"Ԩ*bQ)( ^ͮ"B7.~@hISzDFvd͝jyF]:=O$Y2'j0}ـL7@`{J:+s#D2+h~9X .Iv$  Hr]u.Ng;-4!;_Ug 6) 4; z}~R+W%vb@""J؂"CdRbWeN r 9jV%?QEa)üڛǹP:lW)E - "BRA:Pj6JxO-Kab\ӕ4-A@BAABAAA5$!֑98^|ֵB[$`KXTZ0]~'MKQY.}4+qſl?]ۻ2.hwE%MZt2u&~/?^ mPT at8bKuoAYFDW 4ck0.nBQFDv5&NtȠꬥǀ/v NR5ґ†FE3WW{F_ [HeŘs3"dF27whLmޖ$lVc}yvx?Hcޭبy%mGk P h\,9 N p ,܈ # l^~5OMR  &IFFO82>y|'ƧC̣F #40(- #"(,<00%XXX>\@D+.2'=MeszT/@I&J'{wo=#qd_:cSFއ9jo"C@/*XXEnv#eh!b` U#+"" kfAnǂUz3NZ'9%o1}Fq/9~7_0eH*W$.u{%x AR׀j%Fwy |\dʻl>:7Gg-pDCd.- *I<& AjhtWklht;D/y< ^qFkqW-wPO<LOggS﹦0' N({'+'%&%"%"'&( &$ec/_I0TDh7^^>+4Y6s6ݶ>OUDW;}f|ƼC[?q4H͑ w18-[l5^rK2n%A H%IRB * Hi >*DhF>w";h$^9a+Or>2fr _l#*v4153;kz'B20]0@ )@%W\~2^5+]nhJNf~Mbx֢7oju3}ozzCs UP"\/RVS#{M UmeyAvw$7D;\À@)"R QE> $xaS!NW\O4%wS37_4{>/*7f~T9Bo#{M㮰1B @`%Vb:+Mk)>QFCA?#(> r [ X 91"-=)^M%ڂO&\Dx?>`zx8tz(* nPH@ V²<JT", EaAnDAD~5F*r1ܥq8O:xUPĂI~J9=Z{!M]%/bzs}GTn @:UH! _YD@߀| pUP ,pp"rh%pfYM*aû/V3׼hqJ"J)aJӗ|N 3a6=QrSV H5WL8z`Q"Y$VÐpĮ"k@@9TU&9HtW=L\\FaFݭnIѺJ|D-5;iꆫ3#4h&ZQWODDg7 Γ+j 1641G:Zc"PxԘCRh#qG%ceՐ }341IbYF b׍ҧ  6nlBRis݀[1~5D,d{zq{,3@vxIm"DXj- Wqf7yuMZma5t1{}"5S 4k}-Kb\4RRV:~)M;reA MYdT1=Q"" 5oUI?9 ?#btO[W)#@b*@3vT֢iaY|Pj=( Wlh}a[s%TSQ*$ъex5yoptn>7"D٩u U6><'$7{BݷJ\[ eK)7Wp˦4cS74[JlDįD)8@w2+$wZyGǖN4.uZHҝupQl(22%JW'|#o$5sv>FBI+o0 fa%VkV N V%ZVQR ܎0Mɴ$X X!;T7a'ao7.Qnu,{N%O!VY}vEz8p~+޿Y178׾n3eo])4ZAIJNP̨M1u:lq\61E*L*b%2"ތ @|g*qvDhBj}ĸل$3$IO]yhW頃5B[d EEwmzƁ'8{f_7Bxjk+5utk&I\0Jdn^q >]N)4cr7*D#Mb`X[߭GGG_]jzIGI#6ţ /A.(G}jXuz1 ˁ.PSfc_RMYlxV$=$VLj+, N.JJ .HA@k]PU)xі}7Nc&^su iª*O%xԀ5>lG!UDpuAD.9H7¤"pqzX ">\g`GYr ݬ]'"B;rY{4TC5`}x_;NsТ7)"XklG|p7&MS@HV:g.7XqB6p=])bP@?A^;־[g +L 'wP)%JfޠBj"3pEw;[n,_Xx_2A,1RBD *&|Ic&n~$!^hy'JEW<-X YPTMD(iw?/S2i0ͱpjI>ް{u[ p4;WTQG9+Qjfd}9r[YJpsVHOE\ap_"ErIfxEB͇}({QHƲ{RJlJf=pecf^} AGz]"J8Ձ9Xk\DA1DДC`J2,'~f݂Tg?拊 J "DMd6Ãoۉ>3u$%ʏQ.qD rMuWErp[N:R1_H}q,RdςBLҚYQv2]V(S OggS@-﹦0(dx`("")$&%}|~!!!#!"!&&η<~fwyѯ$&=:%cQ,*iiy~佞yfq2gAL4S6(W< KNз)~=5&TY?k+F0Ɔ\$?f};GgVLYdS@ەr#N}ʿ82?%TYR;E)!J%tRT9,L>N *WF珐O>?^иK}} Ӕӄ'W~T3Q?_n=d HMnY!Ӽ߇X(hU@K:poHjYY۩OaC - @1" 7!!K21Z冑 v^y9-8%h`OBLSE8m>t>qhhi0 /1p r)Zdpi *R > QqFA>JVB;ANL|NwSZ_ P G6=s[VnVoMn FNL@p ,@b,|N#a+7`(^ #& X*E >u71,y\kf1aӼTFY\uV֢i;nuӤgsb\ѡ @cЩ]B 8\Y>ъ1H( *z,707 r3H! >,ŁVhA+]VPr"[lB[IFًѼVbxviO"p!Ic6 _G<%@Hfp+ $RBABD L… ) = @թ.fnPFʃaLu͉!Ngn>'[ pR`wZ[Ut2AtÀEhW]ld_KAÊ\=A#gt 04iDԩ'/2e?VigXSqԫ4̫-H2Şh_/ JG׸R (u321ucBDT \r# ,ތ&A@|Go)Bva\~(҆6b0XykgrUE5i FҢ%*O2Az{kl2ֲ .RPP6 ō# ތ[!E^?m>g)I&gϕ86U*MSJqj#'gة#kÝJT*<9p} Tu`K .% &< *hbڡXEDNI Bo8%C}q1(:iҤy79?{wð)_6v{% wIZj$ɨ5 +a,QqL0+8p rXX6FF9?NYWS""t;fbѕ]e870nmW?³<;Zud]~q Ew Ҧ:ThZB8x8y؄w|/ BOqeC, #cHoNeA)ڻxN0병 BW, wd\EgÏ~6}}U$0EFSLH 24nPB-@12]K-*fBmP)4,؉.rW.]^(F 2֊t|5h@4"Mc||<ٲlHkVF_*"_ņPC2ޭƙY7Fݢ1j AĊx}b߂L*:Uʲ QhQ}X ;ml(2>^ /:ViT?4:=n1ni/7u'f.c798tҕ,hr]{+6+kL+PJŅU_ӜKG5btR"eB ~i+02 0Hfbr1)9U2Wua1 CUj` u'4G6 Y(geY.2J0,B!JeN|)a~.'}zct9v]V2sU(nrQ9|\|us̽ţQJ]Vq7F.Sz$8Vj@Y<]bSW+̅ش#jZ: $aM4SHGW>0Jn_ 1D!$H+"j9I{ە~V{B)J뎻|04G׆v'pӾ><Blłxc4Dg ~k;u*|DyJ5йG n2dayW ad§iϹLsRkM1' 1,% gORJs$nE Оn< iq[*h˾>^ IsvFmCnè믪>GT ?TYBWZx1JM~  #HM.EwzRtkXyid@z]{qz="mΣߒ\P*Xjx vZX,2jdp> 9CggNržN!U?n^ok~C+F&֡q3´ΕMѼXΗFjuF\5DzE\DFL驕A Xvy}DDLX*ٙ}pvch48qνWY|hh\aL;ϨڏPmπ2}0X`Xsku.]|e^9"~5A41OggS@﹦0)O8J;},` |6ڷL[e3WS"}V˧;7|ZRߗ}楬LQ{<*.9H+duV{7 gwHm !cY4G%9nL p%T`<8`%u?is s\fLB][zL JYdNt^${ԔYJfdW^ֆYn&6Q$UkCCYOEmmk*s7J9h,LS)HŦA" +4S5\[IEA.cqm;RO,BѩN:i&K/w;-Dt~"^=)7N#qV|b,m+=)=>"gWG7Kb3X4bC(9o\ xZ@q]ƀh˂:mʮ@#H?_{(k}ŭ]8Q*+w )DJEc2>6 omJ gfU>?R*b8`I1D#!z@#Ռ6C4=.ũMtw$US?e}̚Es.A|!Pf*A!_ DhІ^DIS|XRBf'Į9dG$Tu0;( Jt~|1y+Che.E7T$aP1`[!8@ސ&74nɧA-E_7'BKWΊX.hV"Qa.~|)E% A~hP!VJK,>9eA(CeR| 2"vOۈB7KPS8R•6A`-n2C6hOt?6j(z(DJ%hqIn@# @R#Ŏ <{>&~L`i|%%"^7'2?\%͈ꂡN4RA]p*sa5@b{.*i{[kݴ*:^}XQ*2Y4x, 1OT1 ΀U5{O?~Kht"kB,, |XUi$MWH /2T۹eO ;2+$^a`J&sE_{vmnv!fpS =&*@ Xk66raȳ+nkZi%Dj~~QaR4gec+q0㫖vo$IY6BkN5ZX`Y2'萈9 aS)}vvm~|\&JSFQJ>d$ T|[vEJfmeB"G"VͲN_W:-XiW9RrYU(@0@(m-CHѢnA5/uF#J-j$ȖRaBrA2.+F^G4L`Ƶ*ݵJn,tbTq鱼:aaw@:u$A5Dss3 A`ڃT%M92R]fo|J唠־g-8eio}{: "XP#,` 9|R⒊X ?qkZ` /"#rt1=},9lUb0ǛNmu9=_Ͷ5_!녢Ұ@ [.e@]= OY|1I Mh`Z"[}" ChtH]Т"7$>P'QݍfCv^EG<VWf,w[jmoh/ft<B]) n M$`DSJ8 . > p3@ |a!>tMo[XD.RisykU'qǷ_8>g³+/o;h"T_"Zm2WZ`?P$|X9 DL^SP®kD<"H~\c'( cs/.o/1: @e tk( b#@P "[!:A.QbH0P!\%*~C*j˾E+Pbiu5@5ܔ\YvZiBڙ(&?x5Q\=ڦ^V*|j%WQVndE E 0`SG9Pc{FO- @P@n`,`#rd^oi:1cxaf~wd~4Oy)R0ClȤe?GЪ+xq+nBYR haQ˄<5"`[&!FO=@aB cLw+ڝa,NBǺO_u4ͲeeUY&ήiJ]14n*$WrSpUu.>s\;q1!܎" l 7! l5 A(誰D!ˮIQIyҡJ)p[*>.&N?\;XJc37: 2)@ m@@Ym0:RVλI X"驱B""0Q2\UE^L.!?q~ɂXFK| d]&KaLI " d mˇ(O.S䌙7qB:!iA\ or.$~`CuE0sT`@\1'N}kFhgꏨ|`@G[OhmxN xa0y՘+{b̆˺D%GlqY ')q̊@ T c͘ly'x><"O[}KQRI`-=(ᩛ}O;nOt9-D Ynu쯐hD8jqnQoG|>z'C$eaQc*7м1Pq;$cL`v&""{ߍxpgY8?^ â6<O2jH1i i:UXi:`/ks$TA " 4/.?Kt"7" K 0kiL xcC[Ae8sϦ]`}޺bKvc%f63 <NWޏFhz &PZuKJ!ª,a"뼞#E2G¥5ڕNA*-xHn&m]b,vXUUj`̡|_س$  |Nj*q:o~Ccntu+!~f ?I,h:A5fRJ%W& pY "nɪ#Ibwc]'7#`oXј촑B>qYK5N"d1fJkIZ1#(M[Jytτ.F)D~a Q)H#:\dn?aQ~@S)f, ؑd7{ʆ1]5cy`fb)1:1P ÅAPF ~Kql@[tLhHc xè`Y^ \M43٠ƚym UPgnm7'dkoq3bB7 D$WL{w8MN=7G_U5FBL7%P:Dߤ҇><>w-b,F*U~A":ޠpۋwi&pGh`~??EDSɘI|t8̊*0PU (kpH*j߆G qs9PqhK$|gS+KMi_kg_R3ێ7#"yX ʴ!("^FXޜtHy 4ttNA">]+152O^=68!5{c? s^Xؐh[b5.}qB@ȏbjuoZ@4ǻp|˰y /~gSӇN8 pügj0Ɗ?C"[r ތn%/eH䳫)YG%iuJZ'|yxx*߸8?24s.~.ˋ%H_[e կR>ϲqFց(H! RfP:kʟ˟]J+b-)("c,-$@aD fC|c'Ȋ>JRWO޼(m^?Cl0o֊a{ pN?C8u0a&f\o=(#Z'G t"7GRbZ܈Z+a9Z87@E!R [ [6m4T?Ԑ~uxtaTJJHD@SBJo7Gmfu|z20̆WCu؟7__c%/Y JaVlA ryQ}ݤ[irjT7g1k.0nvr"Q`cW(eKl筛]6:L.l~_52")i25&\ݐmF8:yVלY1cJ>f2ll,Zc܏'s>>1Wv>B\jxNTDOXo8ML5zc]Xh/" բ(Ze,y]SRp 'MsMįo/]_=y7w7wy4YòVD_X_1p (X( &R%i6Wj~ɻABpK2.½Š DOggSW﹦0+.*$!#" '$##!!# ')&$ !| _oY j֋Tb V}g[0>e?Jo/,~Jal~hK*-!: xjai@|́qɑf z&wҡHvٲRRdWiͳ c:}5Deziu)XJxْ9Rc5+ xh` ƨG(OVW>v>`\<|Ac^d򲀟ʯZx >aH w\;”x+4:k Y 5ܭ1en>TTZuzRU,sXBk%/[fdg{BW P7`\kKLև;?ŏoe5HW:9YvFf2@&bJUiB6nwHZQ\w|jʝJ!jԨRw„ rAȕ93;_8qy^ޏ񻹵T$$*ULu Пn֝) +tь}L@FQsS{et1-oSޤh]1>y{"oH\@P>H+\k" V1JԜZ…꒱xO TR%"FI`-EDUMѫqdyQՊ,SK]̶tMGTYHtU4 %M^.[~%aω"%YCa n:3H\`Qjd`HA0IzV bh@{ِDGiJH+F#_ S_5 }-(MZ_fXES\h1>j/(a5&VHncޠ~ƃA{6&Iʢ_~sK*\S wVqXtbqi;\1Cu|hT0S׀ePRBI X{ѨheZd(yW5T + ! *6!&pg+Ҁ0+&zH,ơ2\&h@G-bvϷ{WM޼IQT1,o:!XJ;Q&6:q}>S_Y\,RJv&rR3)J/@ m%Y%UaU<3KvCED%GfC[U$N(ffR&$]znxhLc#8 NC # -`0vs=PS L7 "t_L,܀">l1B/ %LNA>WB](HSII0@ңԔ$IXzԮ2^XMesniz{\F6%p W+D k :[Y+X>nTcM8|9̹GؖoQzoYN'W6ܖ8XCgQ2΅ҵqQG$DoXme-Hg nʍLW(+)/I'$)/8P,7 +`T# ~ݞjU^>x^FFVO! ܯ̆̇I[X^9ݲu:WK-Y~U%eJC-nT$8jin$P{S þ̞s &qHOէ_^KX-mFdqRndGƔ: 7ެn5[.lͫ?Qzvi-],gɠ~sb8~yۛq{;- Wi콵=18S"FdYJ$sF6Hq.Oa!Ck9doç?V}Ȧءm3@.i`.#AqWR*.% $T>x6 j E=\Ԟ O`2`LXesO_妷xazHT~RC@ =M߀#b'r/Kpa/p#(! \_V:Qav:W$7%Е2I<[qkStK}u/*s\ e)R(TQЩ+׿2 1XeR\[jawm6Lfch!W"D[k UFߢea0Bc LW@96v_~ާG9PMBT]QP;G=&WFz)Lm)PT[d+`n^\U&LxCIکQs?#SDYz.̱C҃ה/?s) {fa:4j֕ΙZ樣Tt*|kdBGq9_vϪu:!e>lAݗHo Q:\g 1aE,j j.k슷NM P2 ѬCgKJYki 过X*Ƀ |m#xAĨ2ď˂2NK"%-l /Cn)1-#Qħhj|-@E 2:-\̿Q}n|ǂbᲈ h&^! G6N6(Zʕ[H[R$iTf^9ZֳEwÄL w\w~n͙ş}uS'#~2v =QE"d"XQj|HpSJ`:& Cؑth"ڝy:+oerC2RρaiƯP5ฟ&az&o:wIgʲx7;!ZYq.5i`GE[pT|HR/e5'2.(oSR,S'NSu1% .]RߧԉPO_`x̅M9@#?!V b `&c!\[˖4ׯ!Y^*/ jl TWbȨ caT {0ZP E 4S Eu,:T\j*2TOggS@﹦0,R1 "" '&x#!!"&'$~t~~ !!!(%wzz{ywTYj 1=)9J)TKF$Qz,N9փ0:UOPDSQuix ~i_ML+1+DSshޝ}?x0؉r5"ULY ϕRL5ϧ ε'?aM l]tUVP,. ǃm>Gq)Ml1ZLE {F z"}~p̌#p6@t:,s|[nz4~ùgSRa_9WA@mא, \ H4o,WLAP 7F`<d_S 6!܄E"1$.8)q ׬N^BA,"½DZ.c69y?3wi-Px =2E(Vp0cr-Y5Y9&gU%]wUF* dp~w;f!ѳ?~߁t{`T $53 XӮ4xv jf ch䆗z-ݖլ #fU1C0J~Pq=m_W` *ojq]ط Ԫ-?GơՀ@2ތ̀] J 6J;JODoYU0X'e+X|:*T>e6O=v q3ဴ ȴnZΫRd<~IF!:eEn4o%"upK5,,[-QOB~f]R!$bk#~dՊO&}IaHD 79ӯ5 eݯ1f>;⪯W? F@@{ m\D\nlT(XKDUӪ TLէ'}Nr4PbDOia|q>i^wy&Ǒ4!{3U$OL%'"N%0ڧNCR!uŠ\W +2 sj< s{LS<`*&$Ly47C^3@vC;7&R A$!JZ`dvw*m,,&rMSJ> :"/nTA@\ˈ~|@&vnz3&c-X q,+Q^,J a+a/~1Zc:^KJoZˈan B}Lq5ppI xFCKvd>rڔzΣ5"(eD`*խQeeKfpc)!(TMdޭG9SN/{:ô0Mg@D9.~$P3 i/D%.F706dPלPቋvs~Z4ch@60mWR`Z4Qo˶}$cL̿uv||:LC7q:A{R'Õ"K5~'Wk7b 2* L==1+9/O0G , in8RV t?2iϦ4R$Grv(²GmL7 ngc#hh Q jYF`cC9, }|( x.RXB7RXH^|Nƃ=0h^FpRwXw=0Br,#v!v203㴜7LE׮qruy"jl|w5h@Fd,H^c`0 6+RE ~+Xfw4.OKNB7{Q ?,װ 7X4 ӓ~-æQwFnc4n!ϊL@P@}*^].RX#`H(H`!Q$ W_ jڏ+M?GYd|V?`ԍrIp_c6l<\F>:=4VJ|4Wd[\쪋 lnX54l25~ýWQTdaujGUHhᯭ&2vkIXDT;te7g\|QLJZ7ZLblϳ{1QY 3NYkӕc8ut0F:_g~<% oZkyht/[y0wFr}X"l9@ob N6va v#+W(`9Lt #0~2ʗ.akx( ;=bJIKIصp1oY鼽C,[VZ@h;TG T 7;4D.=؀DDKK+"0A;~g 4}8<J71)R" c_iuD.[b,3MtK?_ _BIeő 7$ SQ$:pA{4aB?6q,d!<UU|@_%TPHTjt˱!6=l;%j?NC(=~ (Qdp d@@I L6CƚW,;h\ƃE)fe'0qMe T&/8])mNӥK'|NX|P$t0J V( 7.p].N(%y~4` J,MODDm;/f'LX1e1&j#1K#RU&$DJ R|1.Ĵ@ frqޜ "zyɧ`8YOJkA' M^U7~}}@@zQdi~$@N/@#_G%:o%]Dr6 R@G}*E*G5E$H^L.ژɱ4?4X^Ș׳Q%)&is^Ѯ? 1Ta9  !-#h\XNt[ey冺  < > *E ^5ԃA"o+/%!1:5¡kgO/o81;tey>h=߸ggw |\i@#~T @|u F=p޿@ ).& pW""K:470vQ]EZז%\雟 "Nw.g{ O5i=u?vnF#zIE-C/[x}])P @6?>]t WP8%RɂFLRJ @=4 WM ~{N8eT%հ$"8I$15% 0x1R4p2eÿQ(NQ~@&Re$(RЀ(3X(dB{@ E7JD9p%+) ]ɪX*f\K :fD,bh\8 MT[Ni"@zMvN3e/wmCk(~ŀqGD b62kY?.{uqF~iGCLU*4>%p@HUo^V?**Mz F?,T3k;*< JQ#\Uϧ*b޾Y<mܽ]R1eU4&D5Nj]j ]O3VJ薱'"[v/FU,V4#4]X]/.'Lc_/÷&cSW%w5 ΛJʶ/:$nPJDLם V,H֊\QCJ+PRpi ~J.W%WlW ^m 0AXluPâ~:wvgәXWtㄅc}No^d}tДUau8%R0Ln%B(,.>cQ-תңve.onBX${YKU#V~ ^қ/, o.{5ȳ;@ڟb&""$@=eĆuuZ-Wbٞ4IWFZⰋWQNW8OqF]q,H0p4Wp5ҀdR`np8JCuetZg-\OztQxK<}r屟x~Uhx_{ č'u6d9R1!>)j1RCU}j FU8mi%#*&%N5K)N)`d%ܷP87XTKA RFER  Nj8YUcqww sXjySyօO7D<>@vRK H^ @SScnJC͠WU)p; gQI6c H  D# Htwt{7D[eׇlP}T)a"H_K ݄l*Kw|گȹyH-RW +(*10d+8Z)g.Tܺv=z% V".qED=^˷gb˱שn ^Dϒ s֦km͓Sۺя^g_]#" h#An'Qʫ'opKn_6bGKbwt"a(*!g=\U㢫 RugV.xKZ^7?L$\@q /ގ qOOTUji_.[<&_WTg?d%dWT6H6wFW{72T{>jPD[$e?2۠l75El]XtUV~^zޝvL qvJ_elcmm,`a7XSb/aƉj;Oyyz{vSTߢ}!CQJŘ3HGzɊaB &(qP){/@V+1mhw(#AZq``?`%OggS﹦0.h:#"$"$'%$$""$$''"%(! (%$" "!!(()&&!# '%$ìޜqlHch]"ɜl>A]I.nHhM)B4bJϰH|QtAjg&XG+gUX*v[XH-XqaJPknW)EK}4BQ3_wQ,GRmL?̹ؑgA(cfib)e!!ZP.~o_R] ΊRwmAFO-e:!]bMӕn+f鏣,vf+%E \[gr{-DR{7:~JD MT]m(oޔ٧ƪ@͖) ehЍF4Q15e 0i~ZIij]LO@Ueϙ5|XiIrtahb TWM5L)9{q dz`-dۖ-h'g(RUr<+)7]<T[Nʼn(~pxt\dչE+O;iªwN<] U|_}wkRE=ߤsߵ>Zv 3ߏ>F9˫W&-vSߚ(8&xꆃmI2x,hO 1YCr!1[p MhH[)58zsE\XmEm% }Ǔk=`UX1JIT,I.Q6*A^udwZd^~* x<̲1P_18-ʪ6N ju,/V.~Rs­?!$ iJ8̣ABkP? bnI1MvzX7W:vzUjbTHkaR DSPHBLjlD%A\}HĐLU?M!9`KtlӅv>_~im8Tp@&ϻj qA O;IX6z0T%H|_w:eq2Jek.ndd$~vNy|y[}>PcD Ehz.'澚i/npv% }zURԩ4q& @ɽp9~N9r=nlb~z*Ku7qr#ߖ^yV %BǖB!ϊSXBɕ^H /CiՐ=x+g״[TGδ!)/G<}Mg5Ŷ}dr#R W,j$Z6:¬Y[˚C0G5϶]d:Uw]I2?$Jmܶ}(L1 67~uQGA*{V';ӎl@ `.9s}l%8btMr#o:_z|x6u%cFN*\ݖ.Ŝ\NJ}$t5kPDS,f\a~h~3w/GhZJw\|<uҭcR'ǴfS6d䠷r&imu{TՐkۦh05<!l w1'DWjW[$oe[[C2 L0U7|gC-6ɖg폜/*L5dP{1M啚Y5dw^u$ǯdWǭkԊx@KYIl(:mBIdgsH(a᱓."u# iqΓ D|Lͭ>! ة;nT[uwZĄlcz~҃FE7niڛL>3.V{!0YEG]9`5%P)x'Sc)2>ʝzr?a__|u X({7n_:"c瀈FT"* `%,֭dȢ&?7-F5"EX,U5) )c4ˌ}G9Nr||bjmRB9`-9]Wo}Xe l5hA,D,PެPF *gy$z2":>`Ũ8Wg?])MhCd;jTGǟ{t A;w>ev ݢ7wYہʹn;HBApE',;Ibd@BVI6{nl2ZJТy57Q  <><VcחX龧a%RvحJiM0q礥q{D@3?[ A"TX*@;XArT۠9-^˚mYrT< Ǎ k~NY aA.Sd6U5d[8^g#vݎ8})/lQU5N+^ Bq$k^)Yi~sξxUgN\_b6}y} 7YeJQ I8>A\]L$/&گ/A⃧e05=zƦbɊ. ~PkzL+èb?˼Nٗ#I2Gy2q0/Ҳ̺Ɣl쐲X&Jr>]*`'t5!S{y 9:+(+xr}=ܖ"H^?5SëP?Gq(BH';w1>:>|N˦DZWИAP+&ǔ&$zg4ޜu}t]&ḄOhW|=:9]C8|L{&VJ,M$IG1uF<yFϒK6:R^=+s,o}%J6v͆2lS-)s~Y>[`M?EA0w+pݛIx [KY|֋iah1э'r1[+jc} #κQ؁Mj'F PP%MX'Α3(UL*A,:Q6k}uHV-UwvT_B[<7aLYԢ:2{Z/9,IXhOggS@﹦0//"# #!$"&$$ ###%%&%$#!%&$|}LYh gnC u DWؓA=n˿؝0#S|sx8[W)l5|~;iS%44jؤiK-7W!ER ŹT>Vo,E\_¨ (K#2jtoFt_zzq<~ڹxXtHuV|g}>LB*f^WC\aI dcX7P|,D%c8 L>rValᙆn⡝<C =n-w lcN՞TLNÔ7d /FF\[X.* .Ɛͷ49ǷT:5_~T>ܾ> 5`RA r xtvGfa:k#ɊpŸ"igL>v=&POSt1]e{շEyc_ǙQ>a=nD+ĜO?iV}KޒJ2Ny s K#4 /vtkn;<(]GmV>Y4ZCJ9GDy 0j`Jv d߰|pD`߁'@3U["D-QRS L߁g͇wbڎWYvQҮƷ 1)<op8ț/]e9W('>Ʊ&DW4&+!|9jZ?+ތyݝ^L_ s.G`qFÛ|sVusf1\_ 0s_ 9!ejt-Ο=*U$\&V"0 iY\](E7C])2>9tEdw1?;[2Lf+ I6?qսq>?-H .Zg?.&/ /DX@` !*,UNKQkAaU> bv@fR6J^)h5;tP8(2ɑY*a-IAjXg#U&vn딩ws3nޚHrdLZٜ:yN yPK쎐L ĊՏJ(HT 1Ҁ^wźi<&gfI鼩MĨyn5'b]֒P:eI|Ԓ!vDcDzTwjQ\g $T4j * $/dW#Y77oNWbtfjݭ1Z` f8%rKG7݆F9[qT/}o/@{ 5SCǾq%ܕڤ^9iM5kAYTmk`q@$\Z.|lע|zo&\jX0+]"CۚwT+VeXP?Cu˱n٘]v ‹y, ~'ܸk;y8 &tQr -aNLGFt" /|>]*DkWu7T?FL$ؐb mU ɝJ}]%m n'_B=5&IJHUYXV*iشGis'Mr\Pcw(rZ$]h|C3@ tH| Pc$7aő%˳OA7s>EF" f̪g&\ 5fW+M6إS_r}IbۆXߺ,tShn+ {߷U;c4qPHlNUL=B|l^4yX2ӌllxΖ1~㺥$XIt?چH Yzn`rF@ࡩ^6,t;6*jݥ?< smQ2#~qL3ip)ǒ~%!SjȐ~Q(A>j?ND'ן/*5Ik7&ۯoβVRPish.J*>\5C/K"= Cٯv"B\B XVz>܍2wk6»>[RJd x)ae]Z?J* ]PJVK OAA dG&`@n|)1] EwřcMYԖ£b~&[NPN>/ɸ,)'u1ˇG'tii>CKkBIR7ޠh\t89![Nrq(a|~v*Qʆ(r#!I+S85'<~f0oܒCp,U:{$L>IA-7L8V%1sYڞ:HS?C2*tMoۇ( ~}E>m ,z$ҪDHTK^\.Mwܻ ^ŨzJᅵY7`>za0~zs]<؋") ( 5@u>6Qe~CwFvfbE$W0^RcCR`qCED6KA&`}60p3<Qpx5if&Z.^< V)M܏slBuhqleg7^f:\J6n5lJÙrkն;fsGYxj]j7XCBe)D .,0C7U 4`{QjtPT;Sw+2:ߖS׻|~"Μ%Ѥ۲mw2JYa?T(#ҖF b'jH^J+I@]ՑBZpD``{A,]\]DAU?Ƭ;Cm>l6e}i2nkwGIZ3j`n8ڹ]BB8Pk, DI  [Z"ܰ Ϲ uQ`x^#6q3HCHv4RBSz iE^jBY^7lAv;N^"A49 oz$X1,f 7i|DJPͰr+{ e m*ˬeFPMp>,IBI^Ո |^b{ #y=\y6N58Ong"oíةѐEwMSԾFw?cqU?Q5;{ng} 5]1z@aD,UW7'=>1!+ԿxǷ`~y|lls " mQ}{6]~qM)s%T9kKA!"?ɫ.FLjx-8 MOҲ%a1GOggS@P﹦00'Bi1!! ! "&(&vsx}xnr"")&#&$#"$(DY(:yoI /iL[fzc4\OJBE,G̴#RRpRR &UI_z֢\M+ dž$f5D5iPc=|rlF9 1=]jA=#67av@$bfahJ!)V|2(27c)8yR:YA'"F06ڌ{Fus˸M[-&(:Q!#V@Ppp,'ob7\\DP`!)`D.^lImwd:- IE"1O|E3/> `m4x[pWPXA#@PK|H nH\yP( }DUa1/%>|"hC asb&6s V!Mf&u2bW.C+˶t@1.Ȭ` %H~ ~" uȐH/HprA$+vX&n5؜x8ɣsj")uff⩙WY\INfm=dy u!AJ7&} p8REjtT Z d]H ~v&=l i炄1鑈M~DF 0w3N{M2H믨F5T1cdO;KdAP"4%HE/\L,"%ޜCaE31I~~> `+88/(")R(;(M%ôg?k0&]ܣP/DP C "1-Q@/YTpӍL""b!R.G O u55 bE]t]v8&jP}I <|i,6h@@$a6 bx2X\jt:o\9  A  {q ~Bğ?T孼2l޶/zb1!eZ| i4|7yw|27:bvWst9d_JY><蠁cym俞m$B kf |gi  e7Rv<9jw֬;ո[:{SOatpZlu%-1Դ? (9P Jju7z~&Mr˥d|F;o^OY7u|r$t[?_| s8"~Ni,~ Nie4i1V.OO^{OyÅU??ݤ*+Pǀ͒ mQ8N !QXf)6 "`^cm*g?nحBAUM*.֣@u ˺܀"^\nHZ!;.T5=Rz M e!OKnNm[QD bpx88u $Nlh l5>Ƅ*@G1 p Lw:"9g"yM5 >' v@X^<.i~B XQ#~`ϥݘKQ8Kf'kf뉛4o~"ZG 1i#0$(?FnZh/!UJ @Ge#Q3^.@)$&&TqPK -1 ?;#Hϟ{)çV|Vf +߻TRl=$l0s)$>4J@5`HGF[Ǯ"*p]n$P'$+0*S6o@1@{.@آ.P|m/CRŒ$t[n.fdz0փɗ( -c7tlO߂R@T7Tx&  h]p(X>KְI̋֜pB9H:t>Sj`Uֆ3D<$//@3s/&duݜq(`S,(@n :* @- %(ED(U Z"*G149ԇ7[x(P -|IpDYJ0c53| c?yR/PzCgkmٟԀD1λR(Hp!1 & -a>Apo F(%9#p(T q M@YkN߿~'M j{Pf>0َdwQߙpS ^ M4A@<@$J 04 .$3$kl<^?U4GH>D#HLU8RE ovB- fkO7#ʹT߆m{;At[K4iO+DW*5{vLM~:0$Om ۷+ΪҧI"bzJ\W7rÃm=2Iy7߷FuD]yi7D;NDIoksV?>#h88zvrnPuutl?yw p$(mf/l?ǚy-6 rpxyur6x?6:޹i7n@4,PvҳsF^z솛|' ! Y]ts}K7 >ŠwtV7@<&!Ϋ#J  $u){[T@ O/ fF4&Q u#"5lHťWviuQ4e V穿!%/huvKFXTXg} wbIb E\.;- ftY2 ct*rBDVnd*j:vtz>Zqh;_0u<M9{]ukyfZ1WZ/9эi(׺—[Sڕ'#zUszok[k?J8bݛ[Y,v[m#!+É+D-^h zMF'0^ԌްnvId'K.|ᓛ&N3:7mnvS 2`lz4FqN땺Uڶn4C=gU8KNO&㊎Ld+e 8A 8e*)):?>T9saG4z?K~ R|FulW1Gg;jX~ r▔6I%F8֋Ӈ|2)(j,o+*Vۡ_,6h0OggS﹦01f2##"'$%!(&'~~ ! !*'~"! % *' Kx }(JJ/~v뚷hKMUW|D{!c ])CQHSDŽ=zHR(7,n^DD5hnNodOGqq<7B[] e\;cln$dۣQ]d%>vp b[yKv "p(V_,߽Hzxi/Yl7{=&FBLͭBw'@v x|C@gUBi`A{ B L]Rz <߿at5f!sc6(S9Fb܃t>4Pŗ~n pŷH&2:|k<CSK-6dX7S뚫hitzr`\y/N) HkQ Σa8΂eqO|!)R`c KcZϢp;ptú9*$wN:mE*ԱKK/@m@u=a/gvvïWr*!*o Diuvrp NŹy(ha~+x|@ .JRoVV(ɢA B!PҘEV [İHLW)2?KƢN}GiPoDU=OTh^n΃ds)CҜT\S \}(Ͻ݃M~-7k(cqD,UT4yioxƳN<+bL4וL8L磯ܥq pSxXDU?nϗNq݊hU.Tg.qE T݆ӕc4r+mU|6V].*TߐcÃ\LiBXg ld]lKb{{mfjtkL";|eV9 8l:+oI7/gj=c.僢k] v-Cl&!~L F|Ӌb|Lad8щ:Ҡ\I.dN74>jaM5Ѐ%8 *((=yrM#7_T~a`2  bEibl`M >A9[VWWc^"Ӣ󅞈N2ʡvj>K}UH16eWXPjf*p.Y\W|RM_p 9vTHuD ~Nb2~PEcLƟNdt%(xb8@ 4 r2=FL/YK`r1?@Q)bE PP-a=DòDI,~PT A %"<:B2tŷ y^%S.jc?;#n$K v05Si邍5@ GYc~Ь(A@ * F+([e1vpaUq~a QA7<ށ w+ƅ'o{>Jrh6=ÿbۚ_닦ь,ߚVt ] O.` 7>2\^ lnB J@ǵT.ct$ A*4fP$2eD;ٷgw WӬ~r]+mRdlb(PtPh H0r~EBpo$%N_xuk^j:q@ 1 w ø^}΢&2 6 @!O ѧ ,QqDF ^4>/U:R13UR; RDTVHA R0(ZdWh`1+Q@4bWm@ZLgH`܋QABIL.U5.ًdDtJ|.<J`H鄬~@4,,crxΌ?Ṅ %T7  *`% @rOVT#[XQ27 |.4D >PT6 ?R@?+2?wB %*m[T=yìD9Nd}[qon mTϏO!z-~XU4Z*Nf4Pp `RDŠǾS 7ZVT GCD*8BBmLU) 0o.RxtU5$TU* jZ]#}dɖԪ^n6%LUAYH69)nN} Eo*cF\WW`VwxgpckeEDO\+SlξfI+AZV +dWpE4?< x3W-nKvÆ B#$\[tYv[?;N{MwL*WK&{2k 5D݄_ ?bًIyj$W#ƚif"$ ~;+M5;GkٺTl}m$ĻP8;LHV.?9ʃ{ `\V9q=N-1s8SvuZbdY3E]Pm!i VWV-(w&n@. >w~(n+Q*CI$HCb(T0Xł4!"ZX/].bEW0"-&fS#){4P'j|G+nyPt»Ze7⍱Y+daTἊtC2p/ȃV!%/ 77zZh;-JXRl)RD&.l0/c7~gT2vɯ[` A`Ѕfp*PUv F;,jH&fA$Q@_b\;",>,"V=~A3H'E "HDž}RR,$9)-+ ][yat"um7MWF2AZ!5 m@;ˆpw/U{NZ93@x~DTréC܄E#R$d4.YIu2y$F-";5!a@Ɗ-g@UDj/Oxtb org."(~A.6Dr:Rk! +!\Y+?Xolh{msrXJ QGbY"t]F.;uӳ{.M:e76n&*:st_7Pyܯ<^q6 lJjPDl]psEY]6|ΑH.ܚJt.K,T_Y T_ySm \W.q[<lY.cw< Xl_W@ٗN0mYeoR%)\]-~`OpNՔn'lne)Vl](EW9ϸFwH~rqjF@ZVM+ z?B^U&O-Whb?|'V\QJƝ4$={՜@;/$ad4EI*}f5Hݭ񙨜Gh' ^>Ծ?eg@mY2 Nc&/YMxi>$pa퓢2EC&f2!;͖ITZ hI daiBj&!I!GNV^" G1#+^p]U[hX6E ǒMhE`$ԑk޼f  ]TigI)̏hjxy5D(//gBKF酭5N"_p?b`CUt3N]@C'8>Ye=OمԖ(+Œn)R\ҕw~c7ȸ~\T]͞x| O]/>Lf<7W(sX _m&2es`i`&$$+9&JhY:/q;3im^+ [B+7{}xk.HVĮk_{6~2>$T5S=Sc|(xgoq=&e+ZB:R?E v^xF)]~JnRd RB, fVԹZ:IukD#ЮNR_+1~A[uQ)co%9T+ۡvY&Cz)PGH:58f_d_/4>&kMN&sE*$StWz=7ow87%j,tZTWmՕʟC1RZ]@TYtE~pdnP!bzI*t]#g$8[9迷&UWZkX*t,<Z;5ۄ88pR}:Al[Kr_'o'{F@ 꽵u5S\[{Rזpmz| ^pyIlMaJzZF/%J]%P!w%vRܺ+Kٿ?Y]yw##˼prɀD|":Fqp%ӄ؃:/fΪQk4tP ?^Hɠv](оL8 jz~ @,>9F*r!6q!+eKȃR`q[2BK@w7c#9B S@\ԙ</R ϹӦ ӌ ܰ]10EmjAds:bbF }LX>pū~+D^7W?DB s@H>tyAȹ&E)0Jl} >  T `@t 6)H򌠴zܪ?WDhYp#P„Ei.-MtV0_: ݃cl?z+oߺmGw4MOӲ^!k眺! c%{:f_WV/Phz205vU$P x7C 7(i#4yW" e-Q\Y-෬{g?oY'Pe(Hf7D[k+b_x{o픬tt!wnLUH){#䤷NژVl \WJU+k.?+UDLWUӼH`:u ^4+l[T1~6݃Jfuv+Y$Yp"4_{X?:an~̧|ajls>W1CP bR|n~ƔVXuL,v/S#i e'Dw|""':ʫO{WwNFRVwH?@NܿHo]ub9WpRqG,&*)y6 6K4Q]B:hޖK4Y,dfzZXwׁHQqE?҈hb&땿줓ľlw63Obo{_jtR>iA@|X}Cq c6wDRӭ M`Xq6QIUItlpWnMIx4R F2zHoܚ(Åf(~@ O-.&nSMV O>"` .k3Mpe, x6GwXlpGS<,("*Ѫ7X;O0[lM׀ U14P ȡF>afը1 6<>3D+$ktCHJVj^eAe-(2."j[sӑH&zSZƲ?A{lq c6`7egu vj V~t

lڲ`=k}pkmd] uD[VNS$.Rl+YAO,bniYZ@BJ$Tb9AE~~?sjL~D@b1aaSMOZicf٨?KŦ@V'\'vt oF$}3D|^z jFYF 6Am+&e|QՐ^if EH4;~x/z<>1?[{]cjVp33(d? شxu3"qD~J 75 ^KC?aU&u C^/6KZ+ N:!R$B x,9~tw  OO>~eR@} j@. jb flZ"*,۩B>DHU o\*R4J NU(r#*5yO=yx~owՠF&M5ͽhު|S|ݳM `{/85H\%@'T0@nxWP$,[Atll@"T>"&0cLUJ%Cys//I]4= TYVx h7ϻo14S*f^S\QxGIvPqT4StTU"`f̏/֟~ ;XV"dWJ^|8@~)t`yX5H7\WJjuykLZ0í3TY{_LE$t)]\edS12҈m Zi{<}z; WcZVDma:n_l6p)'2qC1=FdR9OG J&sRD"*븚[:V$7MlK4_FOFl +hћ"0Lm>Q@d+ mXtqA 5O*8|~\F9܃>:2u YF$&:/"%)ZЄ$!LYlq0}ѿ-+b& & J. Jb((Ya<2A5cjq߯#Xm8E.0$Aj$5:2-+є_˩OP8@KyhP{p :A.[ 5Iq,+X!;xnfW,HXK%\+؋)( $!bQ gOͳYrn5gñ/nكET ʇ@Ȧ/Z"G\ȃtc n`vZI Zn[ҼdB$)J̓[Ku'ױ;OoՏīዧn.J ɰ['NVU@Hn5 e2r է(~l>lC.@{X sAR5DB"LDV,MvlIN694Kc 2} Er{:%p2 ءJZT~oĈ!:3~`^ p|iF#nV=eQt; -0[cńY4(kS(7s?u X=dW*Vk@M@B@0X%(KI4A ĵ82s8|u i{u]V8`:0.L p&$ AyA;+9E-\v-`-]c  %XY4+@AT@&TP#+^LQħl/nޏ`0m4vn`$";dl\zzdv~,p}O(yY Q[1 *a34+zh@ ^|. [F_fs Ƣ1 c}, vpA$3.bfx TSDu~9shp @)$tI0Ա Ҹ,4F ²D$qdLM;&S? |0ְpS+r3.H)H."Uw!26n(< @R_RC`K祂8~,e?q):~(!i7X(0rk_UbdŔjQ>#E%-6}H޳ڴ!X?verOS=W a]mo?햼!KA (l9'@hPnVrE ݑB)AQawo5Wt'}3[HYk$zHnRq- *m7$|mf39MR"()j4;UtOt㿥6hsP_k\DO$'QFp;۱X\OT HH@BauBu,~L}!}bկ,L!»C7ĂHI/V˹蠑1pbqɏ# "ĕPe u!P4[L_,,ZT`1$WyNA! ف6> &L!psPNy}E!~d"L.'$'*וwcs>wǦ 5Q  KnW #xic Wz2]LxRU` &[t63zu1DX_8D֤,F~X'~yb'F5x2`p ~Onؤ<0@'cšШ7j,E6 HkWV K?\Wg$ = 7FD>æMb! j8u (#oiJN&-d|z xP ^LPr;ox%5,f4$՞AYG?G*> 1 K)V []@fc U XVgH2JH~ox>^zl: @/4fRRG+H4MR6dFC8Z@wAY'XV^v 3ˊ!wX~7'(ɄcAoơX0@9+_؋yqFΧx|=g#ux[xr+UD[PP ptB@gMJ Uu' ?zZN,=A OvY94SeEf>}@z'is|W%?p@`FW n0tv-¦cËsXBO)k) }.yYaOggS﹦04W2%"$!($*")$$!!%)&#&'%!&+',%%&$!*vCC[5/-RsOFLfV(X[,& MWp Et)nWڊx.wshu e] [R.O&sݮlƁDZMNu|ǻfe(+3Ҳkv6+T_ ZIY% M dbZOppلT_{C[ nJ-d-y>_ўoҸl됝n}{_7csR/t_~J~4萦WZ_vCn ,O >5 LsÌ",*}  ag}?ɷ΍|.ng jKCZb)5%[Xϲ=_;/kxm?5KYkP/UR) m7&u&eQ ^?C:QU7ʦy.5c(ap ܬ;>HNoFݧ AGe 9 +xp{5W}72XK"<  r((Q^+XVѼo4׿"h,Fŀ—x؍mY;{y۰Ϸ $O}'=ЦB TӉٖe;4? ?rpLkC:f@H970H 70PDS6fڃԀacvT;@-DSzY_%QVRR* DQ'jIyxy txc`"~4c}bj$P{NeeYtb|2lJD\D4\IF͹ uŌSS[ޑ2!(:,է!$lfN~N_$M =穠Uv9P:2XVGt ެfi~9Q 7h#Ts@9.Bɢt|0>).4[tfM0Hn@p>5-uS>+"A\ +F l(/* c ;uZ@ld)1B`,N?j./XwK.>\o׎Ss^!c:"ݸ\dyzҩfG9}Az24BtDE\"@Y(z;I@K?W$V\F\R5M(XOnajd]j۴>gY hĢ; V:h$GLU=UU`jQTv{繾`'D2d[hZؙq2^M*K5 3O\|B 1T[tk+b#x/Zke"a%CKCE*D(uGdܺzۤu|aX߭:'v44 3RY .( ]q(X3s5w!n0!֠#C~};55("S4iM#h{13;+QZ_PI`+B`dW;IԂ]jr~Ve9Lu9# *VV̪Qcz` A%`P|[j,:I,Wa|&3J[Q*$I%XF >;{q\6p3dՔ>gQ8CK6#V.[.݋W}8z4uCnVπU 􌜊|6nI(+"܈{ 0" n8j~_JȶmT*KziVEtr_=vyS?d<_SiӜ<EJ}wss\.Ad҅.^olK|{]oM(P?TC0@.L斎lr@/P3CGMAE?Wu*k*rX%3I,#  DQA*~67&i6KiAݒ7TDUU" |ͺ7ڥTDͩ*F{G~G@NuCپeq d O{x @` 0qѠw 9TSF_5:~m>51#DIU5G/EAԿ;0WZ"}x%f_ d]1˓2[A^kdi}-2o5PXTcbW4}Z$4GXRMvnӹ{IJ<_^aJ|0=A?ïÒ'k=߯YȄWvsY˵GXC^S $ĒVW3_ ʟqGu061nXeFMz'>49HM5e;{sp8f5,VgpWkp}r<ᘵ|3_:#EQO8-p~N@ ? Nks"<~[ ȕm%EDԎ= qm+ĩVb™  2ue+ʑhP Ycg_* aiX?ҽP4bi'OOj'l7g;|{4(+0v$]XBBn) [6}{`O/Qw1LhOd<Q9;y2v +Zs2~buOpZ?" ,9A Q3l?3m3pQ@DH0-9*bJ^r=fhocr8ṙcZ;i&E %h1BgV,7npb`E4t׶eyח$!]RopCZnL2Wo_7/W8Sܓ%[0;n&_Tb~Y_@ }6qZ/ TцtT=Ӯi9}@_p)cKT 1r|Æ-ךj1LSNQw/fkEZO,.l[|xVjϭH$ppIX[-ߢmCGܪvC e痫vhBQ>?2WZq42kƓSj𳘤t4^}Qw&eeMI,D/7kImcI14E$uZknw0fw:,Y /I v֣~EޤR!(sAZR)*f"D*~nͬA0\F1bu]0'b*J#BmGwgnBWי6$ cdoN+KhuQip֍=h h]*] x ȱ0~I$VH ~N~oK7RV83WIuݜ~ BHcl?UW]9-\?Œ{b?,ual-*rV7sN/ұX&7ָ5>nY iuR'H|D 'b- +\ѳtoRk~͹Uz.g#B9\/?ETơL#)U.1M%;ݟT/˿ba߯N'C^8[!ig_(R @{@G0@ ДkV* oߦKBQ/X7G w!Fӏ^[FVAllssMd /ek@h#DƄ\[Q%J bA`.\nВvQ5 LW$Jd>}ӿ~JRd@S? Xܮ r'Je`Wj\ցU\;{CXRHRLꞱy L_U೏cKQhhKYFKO~&Z2\_K]_q '^] )8n3i7LzƮ5sr(Ǹcm8M+~fo_V&OS.j6bIG!<*x 9$TK2U^>t(Ȉ &v\iw7wObG\=J (cI׾ ! f,h:IV8n;ܱ\zTUWMzkAKN#]z1S'>Kx/w㦡v`Mg3xs%,8x]|%e˯0v,酙o*qXo~gt7CH):O!kzLvbw`g%4˗`!7Ft>I& t~k9#yhTlsI{Lݳ^5N^<"1IC"Rٕ6*fw!9`Ffoz.6G7GJu͹w W]iy-ġRj,mq㧦:ǧ3f?pprSz,2opf .I㠃e_,a:o]^myu9) kOw I5X.TٺOUܼ ~D5g̵s gQ#϶4u4E80h#\a"m%z5So"skߊi3+<݆!5=OzqBq,D]/*LD&?<\> iLzN!mNDU)Hnn|;@.YKoh/)h~®n4QU6hVtޒ߾ %NBZL[Ֆwh~ԉ)8_C"\{шFlT3T[ C-.MB`l]Bʎgŗ-I~L[ :%<ă׺^wĨNmtlG<(OzH-stx`U?\v@,l_zsVgSQGySκ*ݍ.v)Ѹ SqCחOXurji^Xj\r1۞w5~?̒n jVpQcVpGg>afl F%)H ,Dz:FǓ=R;TA1 Y$+4ݞ~?Ro|`L)KoޗvK6*7UO<nEĢ2Յr#Y$% pBKvAU{yΘ7 y%)HEF.=ÉOƢٸng^q<{s?l~>,9EFL]_%TL(ju|XzإEXU㸪+lEMJP͍$`}BA$D|֣GL[Nǩ!L(r(DJXbh`z hɥ{l=bcΆOH:wL I9uq۶~D `F2{QII3&ObmC!FS7.Z렖[Q-plŀ2f4F@ sU̹)gH?_?m\/n8|1~qK25hC㯳y/ƒHD} ll1/鷳&]6îwo)<.λ;&˘ݗ'v}1 6xsnsօ݈mg"G"<~LM03``;VAOt#J *cӄPƊ?1.|^#a.  6e)"DiCGfl7dtaCF{4DZxfLkZ'1[ӝOb7 A /zC/?azAц{Cp H5$F8I`bޫX%.jv$o{?Vts>gO։iDcf,IbL!'%ޱEL;/!35cHE?[Uƍ& OATLBP-o]#m|MBBA8:@Ѐe"?%P8=Qم|wk~>>ez :KPQ 4yX꽀!qALQrtT#cG "I1GtnvWs>TQ@FgXǽR s:j숑,9)WK=R]T806}h6IyRq>`=R :tU5A U?ef*n *^).D7KpE(CPX+6L A)^BagS O d?ss̛1tݝx5 Q:aw&L#:^v3+@]{^}ykw%91![0+y|w\fUT|5.A_r g/`lej`Q3Yg>)]qZ%sv 00A)jqȒ=DτVo`VO1Ey62HӔOval JPA[NƐM5*A۲ѩ,(p\;\vSB켇h_YHv$ N8I@CZ o`f($2*QL š Ha]H˲k*sR)T |,@)v'ԑE '"]ȬV]0I@O k7w7;؀Ν; 5  B$MC,Ud5Ho7uh>,/nLץ jmg8 a_BbiY0x 0r ["K4I:&˚:B{j#6X6(+ lP"$I$A i#._>2Z%)c֎3"̠ I"0 r@b;bpoz Pt}$8v* X+vъM|^$/ϩM55`;Êi42H" P8-#)sM{9xqx{f|=UE0!mKdlnSP%$c 8F@.~2AL%OC A&F"!ASWCxRSB25Ziƶ:6"|'B SXY;D> 2h 47= ~D7^?ḫF2Q8N{ Ő t2kʟ(IvHEE*8Hfn.0uIQ1I@æ@aň8 d4A I յcrc p܎'^ً۬ODȟ] veʀAQ$B t:CBAF*!I"NQss59&h2y`]--0.b̩&7 h$^Ge@IXn\%!t~;~) T)#"F}|' (+P"$ED ADk?'{}ޤicY;e;Y^ѶUyu=4|X-e&pɁN\ ޫ.]K`YdY_̾zvVL:t)գOnԕLjdY}]Yvhw8kb8JPTYBQȶ/w@ ugH:KE\W$fWQG_ksՕgBJ>TWl 6M0]64j CDW.{(2Q;ͪdR 0ʬTY\mi&oܺ GzFWr)VqHJl]X%ȴ͠]&?mxyO+>E6PoeRZٕeZ">38b!OggS@ ﹦07+ty" " ! ('#ѫ#"!&!("&v|ywryiǤ !vz':Mh<ʕ((=MbfHsƒy㿏M:zw:zE^Hb!SPM|\ =*Y MLsޭndy1#N)XGDTl֮pXٛF$q'<ɄQHH~h1a?gAvr-^f` T!#f59 @=h >8ᆱ8_ *XRJ ^,NC[&8F3#̿{T`d 2Į"$QH#9pOԟm;i3y?|!p;# u/ b}@)5OA 1`LA4 A&x`E\>"L0'|.93I9·sC-BDS"Xo l>W!u;CE4T@`PqceܗP"Rw%ˆ{4 ! Xܢ`A@`4Y1#=Kɔȓɖ'"]1d_X ko VNHs@wHkG{ P%kK4he>e[\$e"Q2 ([paa^L;J ;۱=Fo‹W$08E"ҟ!h4LG ;̸5&FNaYMzsl=} (E lZDܑCi-@@]"6K #펣 &)؟W mP )bb3QgޚG็Ba= ZwAmt!"\ IP)׹$N P `jqAVUDYPQ/KMR60^{~a]׋/e æ$<F"y)IeMºW5Bյz`oB) x+@(axBQ -ύDOjh#~`DSAv%,EH.َ}d`]qT4SdI |O k8ҲƝU,M%*˵ee1Icꔩ)&tghV`␸'Bs_ݽlzvNsЅX;ma8G-"Xӟ&>1Ēs,_:m]oGwp.ͷO%fKYJ?r~2Ej͒{͍Qkԗut,B }.@_ I|NVR1 p,1&TYt|@B%SiOviԱ!+%2@nk F&$(L쩒3yݼZNlIF8GGߟ}Evi?a*QAnX-|v:AsLu1A>"iUQv$"2Koߎx-\z^k/&KC~g_#>*9fm`o@aD8"Yp'xqM>; 'c' ]*)ArKD%" D#"q\)HR~=?3IBTZTYWmf~?h=9fsWʙN{DUhQs]rdoOVqثUmLQ1'lv\+ ]S7fbY j:4M*.em|B] LWTUՖdxYݛd(q&&G*DYb69惇!!~}Q&tOFJ:'d[i.!8Z~>y{w),uz"DdeaTWH7K6j'5>l?WuG^8~ZWJDG}GvW#ѴXt>}R_7=zIr[n F5DL";$"]DAY\ PD/E_l9\<dDn  76`s~vAU͗.6@$UBCb?I LJi]?vJuP2Hl(0 ܀Q",`"ެn%QW XѿN:B?ȍXЊC(3)0ڹ,$qΧ/cc(YN t+kH(XP`6Ǎ.Yԋ |$~HnJ^qQW~.j8%biZvI m1&ݧy Y\_^P /0r0җ- D\Xb-7 F\>0p^ԟQ թqcMbNڹhrB`:.3nùGpӤa cH e`P#.( [@:dchfp;a D,&T܀ OggS@p﹦08/7 " "!&%"!$# %%&# !"&$&"! "#$$zJ/ oa !"d=^S{,oݚaBq D42u;hU{陼?ٖUnXLaБz h*V \.TB@ 9(T| FLU"הPח~qՅ1e EoTSS50?x N[bsdI!2bITSu4};y45ȝd%ZE TUH:7 ~Еqr'qvIDSkЫ. j RyfVx\WӤy6|$dKY #RDQ(>5/w!M!UۦN ѣb+T[ȩKv껇@T5v|m{k>[[3&sB`x`4}@@x~&>('T™4ٌ&V-@ >>Rӌz0Flє0J]nc'7"$44HַS,B@ Er%wQWO"Ƕ}`q"taը)hKPP.Pܤ&=k17SLKҙp4bPI)tFzA%&oqll120V캷AQt 2xv1 M@q7>0Lw9L}%غ'a\:\EQ u4Fܜ!5A'~Ngx* P HB RDr/ٹra @)baכivܕBN:a.pp 0&/.fw7@Gp+>,v=/;h֎ }ך a` JA$!usi0zUuzU=wmJ"oن$:U(0-7~sQ$MP\"^XW-b&ea.\]6ecYE@vW-Rlī+*,t]RkC3]ԋ !.t[RkD{X<9ΖȒ]-%y \YJg{ŚNcXY%c8} \YvaER"\=W1wRYUJddYܯiGiͱ^/k0ʐ.d[%F5gkE={TT"[Ͽ), |_b,+ ߩrXw-'z߾:. gRTcLaL:=/w](\hؓ?i厰gjZ@+湯2vJ&a柦D#G nF{I6[$l}-Li4:?_'T"QT"?b@Ө$uE#\K|2T$["Kn. 4? ,֑2<@2@  h=!USjp(AS$D{aSJ臨Z>|콧u܋AESLq@`VP -TJu匦*L;YI1X$ n$Q/+e-+I75ј -Jp!ĿKZƲ`mW'?WΎ=1By+X'+=d56N` B)-9%Mwj*'Pn~(T@ %y@t~.$ᦋA糉,>W^=Y gCe'$"˿M}?sg<}|>q4h4R=!rӪ?wܥ1V1FՃRT `Hh ;aX@%TW€\MBw?ɝ|$~--b).RkW8Bj\Y-Օ̲| VP|Sj% dWܮgJK{ nM/ߍwCCUl[F6WFЇ/ t\wwQu4Ɩ@K("Ex=C+N@"%G&͸}DzKwqb 0ٷ# j@gS* "@sP8AYk D% ^WU@GtW`%̾hZ&´^I3AͳaQ6 Xf4 AѪMP)&EK-Ut͔ҲV잰tUEa  fݹR`0P#E U~!+٤1O <=P# W(o? y8Q>T01r"DL<5C\}k,6.W,޿ejӠcYNSsSch@R"(ܲ>E,6e Zŧ\]^F_`` JRPnyJo{\WFZ\]99`m )HQDYB GYbߚLk>yZƝgOJ@)w~73WeZR KMi LQ6M>Dzi@tTa$LWM(k@}!gO' }_FX5>KO!T^I)ND(L.Xc:JװǤ]_-{vu81Z "g "|wqso_[ekĘmV-1J@Lb$ TKE*@:d`!^,FpPS@ N`2Mm)sð UBReƇ]nLA^4jXaDߕ͐ej&% ) Ʌ&%Z ~{EZ.`Y&pthi?tp>>$dssĨ  (5c3/wMVZ eZ ^I͖+%@ n)#?J6 FOggS@﹦09\j&{}"! %("xwxtww^{E ^ R +aif@b,UOTd<:~}Ф)OWQR )i*Q bޒǑh+q9­^Me^s/K[pr, ^,6ELV( J=K^'ʧΪ߂"{8nzb{}lтjחITd@_dIr 8`4`h$X>]b,ыz5S3nP,K+>)P \mM̮у, zg8 hfOc̗Buc}nr4&PD‘;4R+ #$k5|c$c9u醱ىḩvBLT\W4wJ8O|f5+?#. I#/(G  BP0WU:\NaǯfESB2C3sWP:5X`ްۿr89#O[!$nA!bjJy,Q00b {ƁqEp34sLvvؼ}f˓2$e&>n+rt- r@D{iov /dw_}&힐y2+l<9_W1 b[ѼsJ9)QW 'gZ" ~\MK.PgNC|}F@DD)Ŕ =7Pn*fWHާgtaDZ _-fI]-*J I;d%<߮,A ,b?4+0&t]ԓ/sIem[(]i=BÄرc@S($ 1G"|@J+>%$} eh A@( R)A u<$O$ EhhGe,DR?(iIboCPPz!xpojb)0*$aE9^+.ol-B KI@Ebi`r)Q԰qiI-Lq2lWt5ڛ4EN? @T@) X"QIjd2Fu+94B)Ѩ+26 HX^T0м[ ( L)MR@8mfǔ2vl(z٢ƼV6vOhڂyh2s8!ave4o8Gb$px! kP X$vjSK0tK SD eģYfYbxJa0nɪʽau}u ,%a 9*\7#Q2J(^c`4T-RDL`#riu҇GxoK/#MߺW]nN.Ma< &ιF8YcἪO{DH(OٴTm>`]a"~8ޝ-[GL`qDO2 B"i`u :L3 416`ՠoC%!q+ʋ+iہr.  HJ'[XjkA$A~͞P@>&57x'i @1%B@T 7=fhE6 ZGT 8#@K.(zFnXshV.%♹qC3ϩz";R2vP2HEsWӽ10S0/":oг׀y]1 `N8<Uy 7" Ɂ-.XneLH 4af<$q+$P@"E"@6"-g{k|θY\>QDH.XQ%PP ^I9I0ȅ[@+pd" 퍗 ʍKcb1 HP a * );CdA ? ,%&}qRJ*Bb!Dx$kHC22ƛ4=gy:^H2[6mm@=!hT%`0^lT D9PV \F_D""| N-A.ok@JaH΂4kly3c FSM 6zqcwⅈP%HK]0Dmh nPJt\*&9\$0@[`9Dlƃ7)(syJ&͍[jݟ ETBDDN&–NrvSWlf_>re@F(H]o9QVg E@u>,nRFCt=qfRu:D֘ RJ'$nyjUfm=`;;f'mXP0 L!JpB%XyfEJhO @V SHy>tVxBTZNl4DwOnWG$qHKͿwNTPmzH w6ݾ \%6Yb:o5֧*2SyU_[CDvuL8-MN~ riTZQԮ=Æ{ \f!`q~_'|| rR?`&p/F[z]?:WxC ZYmz _^\,<+ e"4{Nԗ;@|.è 짓5` q D~zfg^N42Pnr|尤 Ȣ R#>sҍB.v,q}eO_kkke&iQ-C+Q>UCp}%,,aOggS@J﹦0:)0#" # )$'!"!!!'&& !#&'$lRDaՎ@P|ZySlυ6V`.J"ij2 "@JN+8}EL٣1ޢ?nѬN/! )}K!G1*jlCh'cU\ת0Jp) t?OM^<cC Ai ΟMJ|q\ /H" 2Dt&cg[6h|Nۈ7F9`Prv]2RʂAp"ɚFY)9 ၮH2+>9^5&}oǎU F=*[ . *D13^)[.S+BZ'!y Nfc%m ,PI]! *epRmbeaYM t axƸ"D3kN0 ϒ5,hۉ6b#9@Si|Zb3w驖f*-[^/xQAa:0P4)U WCi B$7 PCqʅ!>ˇxB\ұ[^W-i~Qn D>Kv#mk:^+Y fa/%N 7D$y-Ok0]-p҇$ ('\YpC?Z V@\eUDNjޜ6(6T,O Nw*Bŏj=sVBqrb&B!!P&A xfl>튂Q?EAq$ȶMP$1LvbmW t pPh6GC"I2$QhJ+aR4Ÿl]yC+º/S *6)y)hv9.1qT(^>I6VD]Zu_K dKM-X#~gps Ȭ\I@9p"XDnU/uRr UUm4*= q4`ϗH-I~Ò/yFZDY<>uUTҠ`0E3cPDYLD! q}k+$WmZM2$-F(ID}f/r&:8p;M~'Yۜ4̇%\ǎfvdalxLԌ[laN` kP z$V`9Ym2y<:܉bd&"|NMC#`u@>?%ʄ<#˟~JNgO:L:u=lo~!*|gޟ5$7&?w5IA6OGU ~]B,xrE~2o@9{<.!XF?#NXv6-2(#l?;.{g^=ד$N>06,'8;/btNqW;4 /_=Ah˜2Vx#t+L205A~<]WQ) JeHHG\괮KBI;.b+F!@ iWHG'>~1ҝyxpޓ7FtHbV8sL6˥7r8iޔ^WCvvqCCsMV,oJ? Vq1e< .nk:|Ń(T^ f1A_;g5t\/ú'LSV)xQO67^D7N̏^wۇ `Wp2%ҹs0YLpUKuQi7nZ\X7!{4DT]1P+DJƧ2i5TM2(VePq節+GBңxOvg6@~e Oé2Bf5I)61DǷeP΄1(ƞ-Di59ȕPr=$"A'u H8Dvy#XʖKK*R(D69g3n cu>ʷg=AEO-ĘR}hՎ!hq!5K@ ՀGN))00, $,A `Q#R;*,DW!(ov0U6k%*j*Lzb3=x0_^%}wͅ kET]N(+t[bw ]&ҞY)ZW*<*o}4%ɹbJn,KYKsbE <H2;^,i~xinS筄4U+6V,OJբ0ڠunBN( 7{r=]¤F>{nǴ7o KբIJWOȑD-ʺ!gߕnцZ:bFLyIۍh J, HuPKa ތ^K~,كREd309j(|L\4Kv0ڶvo7 @K,9{!`\((oiDbg0~{0`gB-4J\˅l>F 2/oy[e6(AW7(QL ,D2v=B]M_!tuPHGPRjpVS xk6#Z9t H\\;ѭЌ$?#}qp0{qN::+$^[ B̓`DpJDw%u5_Yvs\UqwI*"`[VQ| OSu҄A| FpULW!`tĤߝ$;[5Zޘ5DLYn{xӠ1kZq~R*TYH~9LZcpw¥LYHi:5ɶvs"V LUWEUO j_cРgY':k)ŎDW='kq^s| i#4c7:}idY)Kv囧l`"ͤDrS\io=d](ZEW//=u0=;֪ܕJv%6cķB<}qr26<gϒ޾ oNY&PM5`Mힸh% ;r;N59pr);MvW1HJZw7Vyc$4Zr1\4Iz9"^S-DI<P9q(+3.H_Y Fٳ_;rCt2 J370@(U%#*8Bp| d*U1l^= EG_6xang-y9*fD*DZ^ɞ{QӾk!BRWqKo5m@'%G| T@< Z3{VN[KB"7b$֥o(ܰ,DQR`?Z<Nϟ[\R54')LՎO.nuL͂2 9@+J=a, w2=??M.EӃFXNY cƤM~p} :}dva\h/k[>s$ud]@Rrony")I"M $KhݲTzI>QJ|,(5 ,ѱgILʀ"Ɨ`nz)aZDf,׋áUacQ>F`fYŷs]~e*8`x~wXNH\JҫN HDS95w űQC\א"Q6ujn #G,M0\<7=Fx7>JBB MϱB:j녁]Dsn^gjo) mDrʵȪgrk6][$@΁H(ݤ \bR')J9Y e1 K|^d`|K1cvzFLPu4H%ټol챁cpx汩?@rr&uG²pG,rS!r B)rMJ\NFVx<>D!iE R#i"((3}bo|p/PLH5{,SdW-7oF `T<2BEF Ep/ְ lB W $ %aT/ fXVI.DW)+:on8cTF*59nLdyZV10T[+I7/AY?nA*͝] LDȪa=_XH1&-SMM6ί7^L׺S=e?_:= )Z-S q&I,S գyzv>@.sUME7y/:7\_\ mߵun.btY + L_LJ/6x@7|qf*UrJa)㮒JX˦/w|~nZ5J?f.i9G_ ,{&nhZ2z'X9Vdm_C%ʐ&I?#϶w}M_3KJdG_'kJk;ȹ#ö~eRC JuP}[sФ^ZRV߾zx ϣ(i>|m:.Rv&7(š]04802GXzpv32GSoę^Gj5%*vV5d{PuHĔ/J&CuYi&IEđ o9}̞p[Xcn*~%uj~5kռjׄhGXxOn`Ϊ,jzӹa'f>iDKkBXƲFkgza38a'q8rl6^F!M,GYrgRI2J)gșß unwYYkP:5-}QPJs9SJ)gx{2v~٥ @ Evj`ehhyt⊱D~?CpĿ)hi"ճz_j_뵏gD鎳83ۧYzZYr$t]gĞ Qᄗ E8-su Zq] [#9FQjtK+1 sbݲ+tbD$Ȩoj׳i 舗Y0OLW矪Hz^j>gJfv>5\P 0EEǠ@LxVX¸4x'?}u1j:NΔsn<[|S480=@Gq܄vS)mir Lݖl< ; {_esVNT6Ѷv;phyTD}Lߐ7ۅЊdVe>~"NK4$Db^A xNEdƴK,S$R /l0q{L2dZqdu)-u#L]tS.rn^3UgQӹLo2o?;ݐ*=Vo~\H&^$>}! ޳N>@];as-\/En΢YֻkقhhZH}İˎu3UȎIv 9yS=>19wnzs?u_L>IvtG|WCꧻCBQ/Ҝg*-),f 5b>} nШLvQU#ND8TcvMd]=%o30oP鰈|aݠyl~DT@.^>e4W>ѻ2Rn*ND`F֊`ųp-.#&Y)sչ*1IIvt/z6{GMl]S$Pu(# wvvl*i`q DRv3 :K cC@tYfK`Y,RJu[2y^= `93N8pjЖQO'o~l3/-G}FtADn#9ohP6lXǷc9r}58}p6ϲ;R6R*:}_=Mi2`hE^VVD`!^ {-MUBXmтjZZ׽wf >D""U^ `˜ lIe]}U(Mziܛ3 ~4ndldh̳_>yմm*M\kNQ2Xn0^^*  wL3 ̓߰SARPK_AH%rz$P1-"gq>#(}c>KO:koxz_{vC7W!svsӻ^T&uKIso]WcڟYnR ;dR>nx, )%R.˹@VCTS?&z+nGM/FPT!,>?v n>4i>C뿫SpJ5 Xar *hexu,6\Q$z B> 6}@-@ 8 j0uugpKAdˣ3ى8W@  5qk˽ 88)4m¦rVvck>BSJfs1qХZd,3>^WDI,#P-Ez@R{x#)M¥V0Ə]pTVe'/yh $iʘ Ng_IQ9A\;"k a)+*炭:ΰ~UҠ/[FC0nxY^b61L?6vwL=ɒYQgO}^Dr Fw׾Ԥ[;"utqÝǵ"$)'.a S$է,UD *ynsw.옊txS%cdLY ahu[bi_5(T4WIfO9E ` CK DX1xpVt)p1ܝU\T[Te;Ғ&5l]qD <[ 8jNء\B&{D[ihȦTp\]Ϻ~ߔ՗~߼#oa#D]-${$₃Ikk :f.2&0ZHF1D(css8p)yh$y|jtNTdE%5__H2@iGJF.-ME*5)^];Bn?dǿ9ޛGz`3l#ϊ!=\T~_iMh,hU$6Ƨ >rāz3&j3Զ6y v `K&p0h jV +7ȀN2xn"OggSl﹦0=fȋ+!" &$%"""""&&$-1:Kf [[ܮus: DBZM!(I"5ܤS!,uRLoҒ%S PDFpD]^t## `. 3 ? ƠTmpuLJzısM G #;c+-6D:p#4B(d RF4=1Me۝1ѭ!DhQDW^X d@zo~D>6]'E`u~ Ls ;7ѭ6<]PG @֬5X2$đHA$G0R{&5ݹziF (@o ` R0h_<~V J@r\7JcvS2@t# H2ljb|-6щe#/$Gpۇ]yhU4Bx=F`_`tNuAkEe@ >*(Vެn诠N_s#>PkuL&MHImLшE?^<#=Dt9M2;u8,E@ k,À U OFd@Ї{"J9&Jv9+~)YG2>bEȡƹ 2$A R$ڵ&P#;e2!vt.g&o?H Pry8㸚5@q DnF~_$ 9rt{Lv\gک-i|m_bߡ'#*rL?ʌR$V,֬@20 2 "ETߴo^[RՃ~l5asG;: @ zu`nbgV$9P{\DUQ@ez4纷$ZbM!$: TWh |@078HZMV D[- Xxe%TLmR*,OUY\  7^֘M-\[pjO"0 =ws޷$c]^.V Ta<ؾ_:MO;k$%'Z+[1(@ |cV" _EuѸKKF-/`J'iK:Yĥk{a6 8>m Q²mV3{` ͌5JpNe/GvAɺ^|;דn꫟Zk:8u= 6rֻ,+"";cNrrޜNm""߳:e#~e)"E? ,LwaQ.&o׶f_{5d<{5I´`0Ur2)А* @\O1,;͍v9Dn) TCŵlnlIcsJB|t\8 J&eĄXG31)Lu;31~B:.SHA@az|` $&ռJ7(*)Ѣ?@rč(~Ln₟V)1B[p!~7,0&€5 R$]aÙ<Ȗ>"Z hrB|kZMJ БRZG.nV?D Eɓa@qa~Kֺs0֚5t Fc9Sk@8HNK)T.ӛb-k\Q :UteLw`QTF*lzA 4.1z ƨ̀zaHkN#hcyLQIUԺ'`H_YWV4̕O8&>">4t~391Χw礥iA[ ].D d$bg 27Zp $JeTW bYv F>;vi7Tl͚=*86%)e;-`#0mCBФ^'Һ6pi1 (F`V@1"R@KS eFUPzEd''WfztH&(^]9A- *v%h\VDF&H/u@wV0XP/A2QD@n ?X8rYAoqOsyA-rM %uPjqX$=*uģ v^ !BD+(C΃bcR@@8t$p tdHf!/>[WZ뚿T22 2lySAѯ}sPڞ|&21W+_YH A_Vaꒀ1@X@lMA2 7%/ G5WTr/]Q+ѵ;S|TQ4j̧n #LS|i M1SבxkNrE)SJ[DQΨ ;U~1 ^|=8]?8LfOZ0`G? @W0K*D R ҟpe.EbNEviʄx| 󲙱dx6+zhy:.Epz2TI.~5=e\@!)՚D?ŕ]{~2 B FD"6S[~-.Q YFJ\]>%Bl.1h@lѸ)'<[m$ɬc WfQLs߷sSǹھK{,]O>ߟ&fJ%=^⸊9+p 5 @.@Gc&N*OPƏ;MjYbB-D,&8qtW0E}\&beqmԱ|;ʋGi= 5aePYr"QhXĖTsV"5 I@8>@!pA=RJHTsiL̹Y.<-0 Q:FI m`cfPL~XPBg5x _BO\HPt)E&&x A ޫW[Eu& n B/}I| Fn;oS)"D+̷5lwbB>% ?nmkN mEr,A3 ."*mQI&f,$khq|"> K_~'d|_%_vLftwTD(tz''Nja>{òk}upsq=|4눌?V*Gq.Ѥv-T68@:uK$>\ 7>aA -R;уT~eI5@mn1@EVPTdAijceYW ;Y[ɡˣۑ\U,ȧ. 4ҫ@ȸ)i~@=~VܺKaD @pQ%xy oVs~bVfQ!9ًZ˗Xp6U$ tn=tg[[xx  |y!@RNp%;_t?bC(H't A Ԉ qOggS@﹦0>RԠ2""!"" )%( !"!!(( !!$")&~~x|~DقO@`:8+HGƍʹBHy"Xc]T׉*4ji9_J# Kic4Tj+4oܜןw7+eJ1BL-⟻sI =5ۘ"\[3+ގLpt#?)'}ql \_f )Uz`M+oB&vP9es+IӓxUW6Y'yOdFg [`Jᨊ(O#ъ I/yg45[ U?FKs͛(:x:tJ @{7\.b_ňjD(:#U? {uN`|NŁ;^ go>{Qj|Ă.W`C-99߻X$gbs1Lxj&nà1^~Pq)hP7%‚qM-& X&X7D*!zbEhBP\.OХ <%t7@קHNw0.w\]5.U0_絝p>4_Y(;|S^剋V|fsBz&ikі`cmRY>?,'rfqD=JIMQhIE(}2%ǖ=7e)U% Qͮ3@u`$B(HG'&BTH\#dF`>lf)P7v,NӭJ#0E0FND7m4Ne'.hwgr GP_QRal" 5%@ɇ#5%_xU?sI5 …{ׂ 2QE]V,1KR UuN.h_ _/3dlt?5ن?8@ށ7 _ FXJI҂0=s (ue%_;KTG]<~rP}Q}9AK}'WK*f}J`6kE8Xeiz) ph=1 YWl'[,)bEd׼XsGfNpCFThDSc) 9wNef01XDYJ. E6$_y-ˇIބ7rf$TYd:WvX6~+vB4qT[d+Sԗq+tp\( ;P"4,Qj=L=q´{8*# #DDUtMѧw=fK{i*oH K4WtE]hzvFiwмi#]+k달LuUC^(k^2{`8-|Z͹ڪw m( Z]d޾EgȵYs|q.{kqܙt:L}~H @rAXnPp $`GghZ #^mG DAsou: DHDHı;9'v_7b߁l]O5X/E@`+0\tk KhII ЄѐEy?! (m>y bXPI$BDhȕS57@%@~&bŷ6p{ZF1R#ME>p 0M"EHMy~!S.`6; _}ptb A%BD7TB!v>DD}Gq\ 6ALB<~L8: .BBIiHǶ&i;1XrĶqha5:2.H&J"NqTjyB?fȂ YT,7 "i$2u{g뎧 hwA4'H)"T݅b7r&vOF֢hÏn/Ci0PpH@#L<@\n!Xuɑ $`Vl62haOSAoN1 i.(9e4ItѸ&3M#wY8O^5|I`5\@ #_,ė pH~Lfb-*<6S]agjssae$P0!RFaDۯӘarKVq72Z<^t <&%$If:tFZt@!f@A{MB(d'h޹_Έ6q+x:(E(H#MDinL?Mٝ'l܏ncn@҇#U0I;1b,\ҀͯX.NaU8UXA^Lf#6~S buG+s:T1g4DDo.tFM;1;kƀƅXyUaSÇB@&SK ^O1@##J#:4bdG;&YEX$aV m=jJP!MD!3Mo@c1Ê]4˵f$OoȮUi(@< X?:,EY74DT 屃2@k gqC'@4J8DX3Ap@e.Hd @EjJ+*J#BA@"Uhb4/Q?h`X\C&YA@hgx30eN\k}w VXW] qk~aTl@O!(S.0RE)|"8r"?~Z\ ~pԨ7*7TRRD1M)iY_=Hp>h q&^ZĶBjʰoT\BXE9 Z9$HXc# NژS%QkS r5%d"Iq2O "r7/6>cIü -ںԀ^vbGX%,e oӨ h) tiͮ)yĸpաp:.n!A )狛1۽|:qX/)4Re&% ]WB;6Quk+v‡x,DROggS@J﹦0?a$|$'" !$#&$ެNݡ~ msUC-.[*\@!kyR?=ωM'ӭ0cS|~V@A[dhU(N>B !@ NS?Z|[>/Q5SYX2!0QADL%򄇈eZcwcb|]yq sjQ$(8"%"BDFnl#?7Gyo&rY9=-u8˥v.`$j@ O6nhrkF Џʑ ~T]e\s`AFRi$n摤6D_ .14x@ $3a+6p'B۴:;楤~WQZ&@O&ɍ>[w#Et8$exH)!#=cJݶ>xҕFhA=C9d 4d@ *p=O8XDZ:$)ϜiD8a$,3yC r})~|6Q1^qE Iz- 'īzf'5xf,WL?;] g46NZTz 09tpkw Bp@ 8LY92ĸ \ԅ8 hB ր<&>%LdP^4цb'yO1#LHoc?/WCjΉoDf`Y 'r| Mvc֊ /W!6G$ڿU t ѩ)µq?oq}ף譞a/+ %  J$5]1Y*ûf`*ZNph < -@ִܪ l B&r.sp,%e}|DUzC*q@pjȳ;KuX bFP |-rTHTb9n(:AnY*ѣT{W(tN0,0KjAiVcwy>y36&]a_8sLiFh?N ߁Z  ((0.& `c &`@M5 r PPە^FF ̴Fs j$MKIb]IgΖ2ϖe`fl9=8e.noUHoXa@- IfL)*s EG(6\ijQo> Í+QqDw>>"@K \(XXNĪ?GZ*zҞlZ3IgߪH"T 8^lHR 7ȀNhJ4)@T2%n=a|wdV;nޘv{4n|G mí?w)N+.DC,k5@Kv\e4ke@m '\9@%(\I.!H/?Q.nlJ(0MDR f?UZ"t}If*}q2t阋^eMF ǥvfq\%W1V̅8@%~:U0L6 bu#Eba7EVf~ׂ]y<({+h/g==vzӱ?KT UU[x&rRj_RDȦܧC 7Yl,m 4W8S9G !}L8bbGQ!*2E;$ ,Y-L6ECpY}/G/as! !X)K$TCLz:_&0\}3/j;}k}%@H7Z^. 8z0YS~%PM D0Չ .'"pg~VG|*oK*rb[7J&L*HDIclJ˭da,عuG W9]( 8ghm VD%`(րIRSL~MC[mݧܔ >H87Nih LD$H$H-y1-$08a{N ow? X\,̖Rh-ElYuTLx _/FHRM )֞.u#VWc<nHnݚk   )贻NK[ }P@ #wgoNv<R5F(dȢ<`  NERG~S3$ݯԚKVR"IDD$nTiix\L")wh8~5]Xp*my$5@bU  ezi@2Ҿ0Z Yv=@^NN]u@$4*M2uРNh:|4ߋG} VukP 4e ILt7߮|*scXygnωOWm}WrUjfYHwÊiAF-4=('$J.Vڼ򦳙r/?F.6&7<,Hes# \}]PbY) " nj{XV 3tYe՟!wV!y]7?Z`V𜚜(SJJ%rCq370uތр`l|4%1<8"M36G h%v4~^vvdD$q0FxVgXMƱ?v6~kMǺMV8Ʋֲ}לxs ǵ=e$,vs#G,Υ"(/DY^ށ՛ށn/-K/x°ηk$7K8^Ow"x1(sKWWwu/PAg:V wP83cR?)nl}+8moT-ӏӮS/KzˤY"٣{dX(Bݕ t\i *OggS﹦0@մ+'$!"!!" &'%y!!!!"%% f^bҚNf03$)bٳ?.MivfL$ט7 [W 4׸Y~ A` j _7~ӳ{Qz/Ðakae[RVLh܄7\S 2E[LDK{ACvj J&L DPeZ|ɝTVt1Q"fٺ(zڢsW|QQELY K(OTa5'zM[iks2V%j o l|=/(w8s\e1 B2޼n,BM^uzu #$w@ U\ lG!1%܂Vw5iZ1UE1T 0([u.hIu!2\: |nA(e\"aH YN@ Jl@)BhEq$;Pg =@FcVKv5 |7+1.+fZ H(5i_<*vAa*yCDBjYj-N^=Z_qsçvcsoD.P?1Au <'P })PQ/e$I2X.]jG}7VtLYm>')݄uƛGM\^J#~Ө*=UG-g>79UBDmL!ks]ODwcI#!̖Яmܟ.{MF p&D r_ũcl`B谛_Lc7|:d$!} Bj0/ЬÕTa ^k 0 EH_l0u+}O>?ZFG}o W5oMoÔ/ŕoztgv@4m\ȶuJIĢ@L۵K`vAy!C\(HUcJUjASbt;>bvZ@ f1ġVv `N0W&7ɔGst4M8̺\C*:`<Zs)a\u=vy9siN8ˎn도[?!mz >7 5/ 5B B"E Bb0ƫ3"j4}Q5S?'9Oj4 &s>2e+O?FX!W@ĝ8 eO#:Tps09JI;r8$Q(a5p- (ň>l/ih{gnjM"\p S kxն5_a  T")Vp/#cCxǕ 0&˖r'xg>}hM+{X\=#$1Μ,ygWf~ZEwzY,K-GӆMM ;:.Ϯ:ֱ5nG(`0.#^ IP$mGAl-DO!bThx.[k>|}:$bTSan^+M5sY-C$W. | 7@<hciO 1%˓q^ܙ8|3ϟpm_d.?*IYjm#섢f(d}[ꝗ o /V?~:-SR6cE 4cUCk%)¤$>XQx| . HS[>_$& xf~I1ꮑ/Wnn'Q)\qgm!K%.g٠Hj n/ | Hj{ z0,[.ƁqÎ1:,kv<$u.OJ3,)[_ Sߛ iWasz IU.ĕM9S%Z:, #?+Wk-*TրyH=أ<@g7R^.;[ <V\tJD4u 5Cńܽgɴ4zʝ^QW$ZHeFoEt 8tŒRF3j +\JF*I6QB#IXgb(Y~~+vE5ƭb Ͷ#M?v &Sx[Z}h ('}U,:u7 4!1! #VѢ+H >*[;vztgt֬bMEN?[\)щ(}"S'vso6e詞+o;)@Vp< ;QJA\#Q nŷä*&]+7@c`F*DźL u'$-,s\qn*ܽ]#h֕/YXQJe"3h'd:oԺwsNFnwB:ҙgpwW1" /πel16L܄OpH+rQ-íӡ}M zDykW|~V; 91yXJ:}"|b_U0J.G#L(wGr@HuQǒ>7UI/iX\(XW)酭H},UppGpr vR. ]LjS=6U?%*:e4m=ǖ]C﯋Cw1Mlz_8T$S5j-.U)"d~*yɸᗦ]uh-?|HlNBN·. &]U'z$7GLwG =Uc_^;9sQ@K/ o8=XT ^o*Z8-6#':)LBWo?ćked^< # q9j<4(+ؕ#!FhVQUr q:JNDcfIÂmtx};5OJFYsCԅ i|*x$K  C QY^uUPTrR$O <>s]P'+\7rkCԿɮqʀ> wPB4__S`6nlvv|Jm7WܲP(ʀ2Q11) >+ E]>,6}{,2|PUP`7QeU:l86ёۖZI*?u\(^9:p˙mb_|= !rh7_t#n @aSz+aTXUgo@+N s$Mե Z \I`H kW,N-mnqx3M9m+O2M`{W7Oџ;q#BȄ{r()dGqF~ d%"\#,rg!j0zMZ0! (a 2"d^ V MΜ 򽂣xiM`=?yamU>MF uE%Di}. Ǖ*|ߛ;a ܰHH'7[@n6lia‹&A"g8ҽvw$U.C!B^TUT *7Z/Cu%V>DQ})GR?`]NmcG2EDWvYʘӟx $-WtAY#X2\LUt YHl,t]3jȇ$DDΧ:"iq>V5{.ܗ%+\>)!oy~XjS/< |~ÓȺTYNPhZZ+=x2w^ZHZ_lX~M;ՆLWBUi9\C~*y2:&O7>: fNsyh>ad$hW[3_C./ʪVx9&U9ϼ5'S=?.a*x[C ZӀz\E% AF(ݟ8L隥s{~nlvj˚:ZlۉΣRԘr~6^Ռ4f. ƀ煁]ljWͳaLa6wD 31_w;Qt/9JM^x*([<$pN6& trshO~:=tQ80T{NR 0 ھPҩNr4bLwOӝGI>Ա6tzuFC\'Re>O[neC)? >W%MT]a~Z .ҍ>f4]t M1 &6&Wc4Z3c?ucaFt'!CrhKrt T]eǣ keZJiؾ=r,5*{un*t~u= g%a<(7*\Z?}ل"=kL X`%7*l(yD0pefHcQ{o L"Hx=*2W DD}3X" z TTP1dBٛ<\cEDdSR T+!O;P5ϖ4gj Y{$&l oof{L m`* y uIڸI 4iN#Y*GcD|X֤4 opo p,PV ^S.m0LlRV9$k>19a%Xpbqi9h> 6 GЅۍͧ.,@0/ K2eG+ ,:baL2?qFθl|7`O/λGevQMD+ ])̉Q)$p50l*SkcPS՚nx+V#=u ;뺑+R` +Af~E'~Z5&F-o2IId7eKSGљ{tKf%q1:jfjJsc%EB!.n2X]F^54R29I:jPB )ńvu]QʓPEQ  "bt$$Pe5&Lq$מ%8'!nAF~8UG|WRYدC[$(PS?2ۅ) X Xq;E`9l`EGE5Jޤ^ 6 Cc[a (#eyYW]l V5,FMZOh8i^{__m/\& Zi;nT#Tw0Q+@?LCjau{ IJ4 "$ ,!U/c)HW/Rb(j-&87)CUkO65⋆9qlB6CRu*øXE,RW\/5K" 5 K +Ry2@z' ȓ+ $ ^3_ @2rEZ@Cda l1{t24*Lx0M[[Ġa]+$@ [Fb )\Q"kؒʊp@ D]Ba!BX)@ _{J+ 0/B r,.FK|r W9nbC:e5[,/>m**sg Y;CA(q E,bMYK"z- I\^4DV#[]z`/j)OggS@﹦0B~&#"#!"#&%%~x~(&|n`$pSZB+vu.B G$ <m ݦqKF'̒"@*.¹Q*I'5> B9HiB@F`+_5@܅o l!FXZ_ĚA5$HD|>j2kcфM~Vq$`.) rD:x\r*bdZ84/T D @XG6V ,: %\P P@sG~ {zHe5Mt]GP.7VOD^C{͠kèM CDyO<]QKSg˞\6MMcpkx~so?UF .R2H *-~V5h6-sT 2^ >__Yք R!T]Nm|Cq(ҸpdRrlll{\[pFYEt`W1ZLU*7M/q5L4uZhP TU¨ 80C[~v=ޓH5k#N.TDSf Ao~KN-R;f@&u(*[*T[6( v?XS/[')*Ť\TW6, ԕdL0ݮ}]}T9#d7Sr[wݺ9!:w^j=P# !9/Y,,XӸh  3:s\ѧ#!Q3uK/Wupʿ-ĵd9d3OZ7Ҧ߼ A.rT ?C@jրшb)X AגCEHXRC#^(8?G`SٌQ#v'O{,"c !pfcI?)c<ߜ8)=o}1i>:8{CTfFnqaԈV5X?AnpB}QފH*x9[Paۻ1dy*(v;6>mt_b9,4S_&BBs)T3- CZ?j|6XnGtw9)5:ܜ 2e]yB"HD[+ > 8 rO˱E02[1?J S"$w}()^ H(k1qHR#C*KfC+d.YR8(,JڨrFW0@glaB ti ~CU#=22=t"Ώ2:ٹd#Nl;{&s84ÅyDV)#a5Jvrgr0JTKZ(iWS [Cl޹9V= Q3=,A*Q-| t ^i]',naszɢ4gWiGt^ S~:3Y/O^vwO^oU'kb`PῘ5!@C4F=+l.E0I eX=>~Gev*eAe2/2̊ Ɔ]t.?莒;sOx2]ݺ7_~GesΧղykTS,ύbt0g') z55L`FynXuVU= J؋n ,N.StTNoT$[&\N2܅q~z&=3 FR}RŰMph[w;_nS֛XXl̈́LieӪkudQ1jkn;R9]vCPswkqG0:nNIJK@&߭5: .jzNΧ|ЛeziOѥٖP2'҄&nFܓ1x[N94P&ec V~_Ltß}pɀb –D^|5A"^#L`$wPM/?=M ec{#YI=t<]4]ԤqS)KPETV.KCJX$E\ZJ%H A P X\d^A߲`LvRCP/W,ń~H.RQ:2ueY "H RrQ U #hcɻ529'3Fi7cz G ^.*Q~!HA}a>0Y6萴ȶIk3:*q #JiR^pk*DI1БXQ*wo,%b^4`[]T iVD.$Waq~Y1 nm syN' vX0h9A:e.ϚzEF}ŸrF5Ppq!"&"~5A¥~Kd0?qIDSz}R@d4[yYڗ x!$/1e j)b Իr[cڣG WjWq8B1S&$-Q lY{)ip,je:nШ.v(E(r1Z.^822qz=Y{;/JO@px€ǴkQv\D,7 %QQYQ,v(,{Ն*@>/uO)5E,( ;׋bץ~$5gfp2ݗYM;MmIx*E*@8&_PV*?7>(RTvUѲDe*}ܨ1ီhX{}=$'i QR .$HDxw:x{'KBn\5vit"*.H V(ȵ1*ɹ:vjLሏ MK 4R !;)h؀/? {bpSn iLf&[ew:(iVE h`,`,5-%1{aK,$.H;` \FA>MܕX0(MP M@I ňH8` +DfXLd4|1GhV%`ʑ<SPa:B.@q@P!GOggS@﹦0C0.xuyy! !!!!&%#%"#)$&"! #!"$KBQJ(^REvWBNXP1"F3L`avqK)1d*hcaB::t.JF9A  0+BXD&~L.2RBl`ȩ=.' ǻW@YLb1nTc$,) }'}9.|S#X ^Zh[0,*%}Y D׽Š`1ȁ$~{1?h9ZqbxSηveb^K$̥9wk4:5o9UD1`1 ljj7چaWV( 1lnC?#J)~i=8sڙ 7"i ؾ]l u$QíQit֌a~BƀNkP7 H.wL!$pAB0ԕ `\>"J-U/k, 9N[ڠ N125fnTS<|$R;=.hAGW<  ( }(V)datPI" ]KNЬЉC@W (ݲ22v"֏Rh]5`Hhwi6֮TZ?|XsB ] LtBx 1\ t2X PHvLQꉋi'y߿b85iE LW$є96ypif-[ǘDQ\IژcriK|ڮOI22 DS3E4_><8gŵReWZi EI>K-#i?!ON" (6AB Υ3OaW3poÇX_lY̒SwE4r!ZO΋i9K@nC!'7j 8Hn~^B!{VWPB\,)sG_w~-F~eS]}\3[Z'Eb9V +'t޸b9Xl+cOMgla^7%,v%jVl̎guuU_嗟Fl?f^j(WJUibN;lDDcp+7!-c(>&iˌQLTP\*  p/HW(<){`*V݀Qۭ!`ͪdI]u,"bҧ=)\PD(0}P;ɧv WXBs@Jo 2X@ƨ7^nEl@!܃!BWWq >f "#GǂcvJbLص.XD'RJcIhH5v%t*HpPrx>%(!{9W5Lť, م)#7r7 TDW'+ ]Ђ)e1o)_^ʼ{NGKZm; 3n;Ix\D(#@ LS`G=#iSE=ؓ2\HbDSaS^.`xGFH;wKf *4MeDxڰl81{vI&!"LQ*|dBEh1LWg*5ZQ,dy9JXqSHjZmF:F N o6v"ߧoji}Fǡ "V͹ҿ9Xn̝?]z6589_hWFzȓ#l.h~ ]7sdmKhoŤ]٦5ˡsnԖFPl;[1vA7_?ζJK@7(eѦDi}E}Qp9-JqyW7O1ս1h-i`^JErH-9Y_m 6YbܶQGXgh&>ٗnR\%{{kIdS /̤(x;j|SSsoB!YhIg?qcg}eޑ[eb*yXqڿ/IXˠ,n% %gTF5k\HZ},p]N7cqs6ILwV[Ħ8k8‡!RI-aw7 zqTKC9Lz~,Qߦcy)n)nY%{ z 7'ѹT-ޙ%T1<՞h kq8ZK8zF=cU%|\j0֑}üd[BH^vdHbY/A,\3ZÞ%m/87L{+Ҝrde٘ZcM ޼To%<>ச%(՗^1FeMVc<;P]c=:p[B<޺ ^cDPHAP`4ϖc4aBmJ PlwVMY^5TuMdž* 01ePΙ vJ*$]PK,19C[6Q?Tba]leWB?@2}f ="?6\ظ؏Hz h 9?]l|i! ȑ Mxu^EYlV>::zqj2, ǪV@hEP o!>/9zg3.8\V"VRJ}VkH6=9 |-ZT"ȍ;s砼5xcA1(J!c7Қ_.>\wH`1=}PqWD;UZ<X*OggSZ﹦0D#N>G4" % "#(%'~zyz! %#(wvrv|~y $"!")$'!!V .]kH<Ɔ5l-Uf?~:h=c ;۩ѽJqY;8ZN{v{.4d 6ʡgFnDAIa$ݓҸS.1yLY%C]=gNALL*{xfN?-br+JXXm, mPAKbBS5m YT]Xw5z% ʔNR%yQ/3}]b3y'^l-"'jU & /**c%(P0@t#p͈H((#|!=,.   L!ԖYV]1 M&f Xh@ l( 3xbrY2HHȅ.nD$DVA |nAK" 紏Q؊?]7VP-t#wsz\Ft4l6lu'[*+\@SHMt;J``ob | ؂;EVdEDDD|fxHM#,I"M29h:D, 3,w&/G?ܟ,$Ϭ1JG~vBbIZ)`9| $h4Y$QZ1p3^LNQ  /AC4V!Dw:$70rY.S<:j_#t6v엋ÀH!?6& G"RLK=cˋFȡd JTVx` n1r (?b1@7L62@i;Xm""Yfl >Є7q֐3i*# AY̯P@D$JTeČݠgrD\\{#.arVC GUXT鿨8UV@eC">v%/z!s RJ\PTbX q;%c`|Z:n@= @ŀ`  (HX. $;D2'G)/R Z/K]Pߓ;1%VoAW sZ8Э Ct>e@s_@o "ZBQP+)RF?dtKZh(ZW &][Aт2MI bu>Km'Rb1Ϲ3\:^]%ood1: el | pQ O\|" 7p (HLYg o^=Z*1WSILYaA5Ss"ߥb' 3B, LU 6Oʽ,mb{y5bHRDQQT1P~r~⣤1U[dP"b\UUB*+$qdbH\YuZBaDxd-R`u `7@x6y ;N&^|%$   +"+f$2Schet䴈4zE ( PX 0V'B:$rn~lN%I)NQB6 [jPu4IB FD&ٸSlճ"/Ďۈ7$tz@U0x [)~L"x1bV d^lɁb= f4 +~N;, 2EĈHDFde_"v"%:k}XyFP}K}X `,%>R\҉1čVO)F `sL@*iDBiN޴FGJl9w=8Kemf|"MJ@s@B70`ZI $qqeEZ9fl/=fcpe?GTtJK ,c/X슚*=`jE2Z4+0%E@ۨp3п PzPXڔW2 "iH~H \!iEh81Fdq-*y,ԀI~y'Js b [)ӓ+`> YV{$%&;Z nIR~'Oڑ<J  #;[f-A_՜&%}8X?STbM7 '!*QB7B-H,`PтiP@ 4YӖN0ɇi/?G 7WWLK%w?*>X(Q]! ط%7n|~Nƀ;^ :'+JQ~Jw^a+M$A g 7lh}eh. ! *ψ( =! \,BjLˣ\X\n + DKNZ e$bόYLt@w"f9QAD2uv Ks]^Vvw CA#Z@9a0@KIY )I)Z޳c Od`%*E(_JvS L\ޮRYH,h=ܾxU88l&HDT5֒Ŭ9ķ|7YW0nr8[.u~u@r-<_B1YG >`EXOhEZTY+Lc}E ʕQ*qYTY+('/9Xx V'V4jOggS@﹦0E{7+!!'(%} !%%'|{%'}DWfYBYGW查︒(DY- oĻ/Y<سӬC*Ϋk L[8,-%>8j%Yԯ^@ލ?1Z b؏9u0"DJq0Iqob>nqÞ<hIu,P"YXi`oMi^F 2PɊ("Ё `H3\(|>p, y6LY ]E".+# [H$"@PX>f.̼tRF';΢mR+]Ureq,@W `Qj00>,@BK.R 5&mm9 IFx.dlQIv8(=n'" "M,S5~bw"""y[@"+. `< `6@KʑY]$KLWjáǭWrN/waLȯDVLShGD~yV~ռ(9 b -ILWbS?4r`?8F;=qHDTyTU!7WG wO}b ɚYs㣔pLS"ו fjmO EʉAO &mS%r kK 'mZoŦ?ܸ3r)ΔR Q_U9bej fFcNRHDHT4L|E c%ɟt>si&:[A$p5PS:ݐ4\@`:m44+,ynjqCjkB ǒjPc&rtn:2 -Ǣ0aNwLۘ7Uwxfɘۥ~Ej6u5҂tEc</}1hb46ϧ'  xwÒSws#w (iX'xF2XȸnQ뱺,mIJM@R,mCCMLPA}%Qs2n[㍲"p4K>lEBC40$P@PK2066~7/z-Gy#"ʾk6 g;].?i(@lbЈI2r:_szun|ًF MocNwVE%^)vh*jPZ >˥txTPBPJ-^fkS&-Ƥ`۞zH`zVXm'XRRiLSo Y;NOI$~S'u*uv%ņ7а:QC}-vW.2GTpC6 ^ ,9k$p%΅)% y_ ٹ#$ %U 5ˀTcC @j~Pd$<'V^JEbDn"QPE BQB>@Kq3+ $6PJ)##"!z6]KloLPn#`]EX1{{WeFEj1b,4s_L Fbb @eQ[A&wf'4! `2M2o>+G\'x*o>0$:@S$iJD D F v3u%KNQV"%c t҄CBlEE\\ Ƣ%G2Gm]001f$~5V6eHo6ͧ!BO$ M!(Mh>(?OD,$#8CWN@1MFГj' .6#LR h'd/i 0PAIp 7"B" n "fedZeB 4uA}.4YQ"|Wڑ\N#I-,=ef ?$Y.vwE)PGh 1 XL(f9PŚmE7"+2EJW%I+p.ƕ{eZS60"ID$&i7ÝMi\֔U aA^P[}Ҽ#`Hr&p pN:#lAC0 `"\[e!k=zi4+{tg,s)]mqdpYʛz`cl 3fӒ<>SZJνzl|_Z/âx%nhٍJh#Gt7^kcvJwTabG9ј14DSװpT|B6`AɶVEY-T* Š0!¼l6*y]}q ¡40!28R$Prw5'-ѻ70] `.4;PF*n G)b$E' PAudq-Š]])mV!/sk1 0"  @Ձ1:xp/ow.^p=7H-@% T~ p·e%`Z[>ғiS(.𿖁h1tJ_'׳2S! r!F"sҬŧ> ė"ivQ!0_YE-h_0K PH9XN͂Z` L] 8ekm~GqtK:|dYB%6`_" d{jIvs]=}ѨyқD3d]d2Wybč\P$ä}gȄɩ|.1a,g("2jj[x])đ׾1z`[w{٭nF_:h:|*:n\,DF z(nIUd?k pv{ApOqF̖7IwxV6ǧ&.nqsQ`Nm$)ӵvvs)+8rլiªBKq'm4D,-giq9ß/BNj揁-n [BxA|b#9RI0|8֦U\T)bnA#J PG¸l.OC c/h[} /cRd2xLaKQu\my\.3% *HPH;ȉs0WA a d*(_XEn˚W7fy%Y]d(P0T,(^0igL A;s,j^uѪ.C"^S3{QD_ʂ@i> Pk(Eab3rmoiYg-ѥ p fD D*|gFߥ&*JrJP0=I?gEܪտ@`oT+Fd*JP:0n"M",HD*hGBE n^\ɨ#8Mŭ?D4Ϭ߽X?\l 7>6!X*xd +4_L'o~ +FtGԧա+ZY^ IR٤l4u*,Ը x~d- # p7 LUajt7}At4[F:I4jvRTUQ`u4~ZkOO2i O F"DUU%=n~$wV:Y(d0 %J)16JЌ͜;Z h0Ef$O9By"I|IVwJHD1s{cMf S'5{'J `* U(!l$=Rq8B,/$x(j?- .R~ v`[ \Ñ4a[g5[I|݌(i4cNsN(X k>V%XVw.Qn%@ &A*TWT1`^M17]ZЊn0خuz)~/ˍ%$'M}|t|ijpt֤?;tw̻{1@v!8Xz롖k-z|S}:]qkf.ߓOPv_q0jQ}]DZUMPx}=S ˑ-{nS"pfTQ^:x/!te=C1q I\R~CbĻؔIwӍ7}Υ.'h>Z߅T?OIi$-$Y"-P҈^,!;mwK/3 K XR"b2y>%YŒ_>BtNJtP<^sKne@]Ÿ |U?ҚlL!ý˜lE,FE#T@E~-,^)PjK5>*xߤyzD4._5'{`<ʝ&-/8D9mRS?@$ @X& X$R cF_vB 9D&] 1܀:*OggS﹦0G>U@ ###"$%#"# " '$& # !!')$&#$$$)%&""!! !'%$$# #)'T[M=@{Y?-$Ao*TK\݆Uye4!dhJ5 RWLΐU59|m+:@\woD!$e4\*Hn<(#6f|*p,#Yd߁mpXT軕]^T׆;m_@o}ǚ=JkO+TTׁj?˃{&D97uml]ٖH{n- h=6r]ѕ&r laml`[wi\*+aKf%$EjcTr"ba)6#׃m7-uGvېk':́O^Ɲcg ^煅v⹠Vrhe:ӡ L;DDMoc%>_rJP@ Pp#QðTȥ.PfX3(B=eo )ꇆmFLkQJs^@C PFM[.z94 ̹3 dBk}h4]?o^CNݹ_k9{԰(^|Kܱ<&,nnr!b_T?Be?:@!>wÃw m~j:Fpvc go߄x2+e4W.,Ǖ"+BYIe,Wuz\О,bf?2K MRI1D@ -meX="5=4}MU\ېQ~7ht+o=Ď6dި\Y6||\>aAjZMf! bClڢ{9=~[ZzFYc\E㼣=p4qʼn \׸VɃSl i|NTݼ3w^|۝;q/;>&{LLu 4?{#m?ͥ'eT[L,)1q76?u(vcXgJHbTېkڸܜ;R;YM!(8~Rzxwu>{FJñ 7r~2>|^Th0 ;OCJ *+ʅ>9ELgU6]֕v!k(ocsYk[ VZ tEvvx*yDl6B \8=&X_uV|'>c&WV\C75b2 Kx"%9\k5OFV=船eR6Mck_ڮ?yԻbz/iccܚײ!l ( y6b(tB1W[#p_{WEw $x[]7oяbZpnqIk\n(<Ƹx ).16lU6֞/3gVT:u{M>;Bv$lYjOU7o{z$N58= d_)@')@i}{AHBITU|j^ҳA Yc}TUeT{p=x s7-1oS2dWrGGʶ925*5_º/ g܃/UKUN9TY - ӟ?,A8fY#k6r_Y6NOggS@﹦0Hq5%$"# !!#&$ (&('&!"! !!&#$%"$*%$&}l_ H`B a z64Lv^5^MH5mkbj-iWPHͽ о\]B]bn[5^e.,Pʛ~JVDuݽݢ [Q8R}p[oy:zQD(/[C#M*s~4;Ez Ak05kJ^}cv@yqOp:KW$-%;+S_}: =j?}BeJr 49ڥaqQ\V J1֝'usIl 30qw^70C#acUrǂK7NϱduX^KUJ]ic}bBдQ5f,ȋl5jtä>0 1xؘB.~k]Fu~J{ݗQGy]x: 7YaZvxBRPf)h@__ѭKk爋a,rZ7?.s}MVՏ#aZݫ|˜S$qmwn܃)]oQu=XCFʘzmqx|kjqb]^WNjGnl(~Fl5kjTF*Q\;<end %\Y1iȵO?]u}l&^CTHܺTWUן{^LWC'o\ C #ϩwA"T/\YPTt,y𠄯CM7gaxCMDcz{ ɻQPlU;:.TctjLڐ>LJNȺ@x:)uV?tcI7jR5bJ8/[\Α deUz`k>{$hrC5E_l]+,rYr1TrΩY0{-4XZd_rE՞K meJw_o~??{.l_Ռ"hOG+IR77L$AîѾ̾j|e_9fvAB2!ȽB.WlۏFL};pd,8!`; ϵGDNݖfvu\]@pe7Z;GF{rA;7e^:Y*T[`)*W/WipmzUpDLa6Hn%a*IePz$tcmo=>)Ph{++O(>Be\_+ltxt]Mި7hSq7rVZID]aZ,#VjWa].,\[@zH {QܝZz1Ox\D¬+ ~lg/·9F1eN{˺F% 0?ʌ˛8({-J_("Ը̍//z93ԝ,eEZDgo6$Id~6M nf'j]&pu:͑75L/ǘꂓ0nϷ#;wvkӼ᫠iܗ  0(+q>.*١yMOJf?!ڒy^.r0;Ysvwᆱ>NPY%H6֍4$$鶗j\ K=7 -݁e$@wJ+DEi:JH,z}\ܲU8lrRohD蕙5O~q>%T0k)ge@kƤf7Ie<4X;8a]&yc zc~cʍ̹֕LZăx' iCz5{@BL D@IT _o %BW<ےxy8dOPνMc5-ߝ7SLyx &wih=)dKtE5ވE!zr[T=\;]4&FЅSn(1~+NBZ%[;`w2 eE*@BWgYWisڹP5J"]JF賂qo.r ŒBRhHGMARR(")]`R p>T* * 9eK&y߯٦~Z6L<oGp;;psVwsfe4;ƹr^#ݘχ P|{L;ȼ;ޚPU!I&‚'|oSpyVjؽoz]Sޛz7>Gj˱b.+QжnHY K,~JU @m2Tr>FZJj^ft7N0}W{`~J40}jx:P) L,䦻YYX, je]XVtFRiK Xcz8>cP ke@8VY8'JNޟG\ ә}eF;qM흁{w%Pu !DSLV%6M/g=ʡkxgF}_ZFm<[l#>&@AtH (,bق |͡Z#0saHeՉ: $B|qQKsX-lo ;it9!8 @A2X N3E<*qrF/^l0Io=Z/²3U*U?AZ@KpcR|DG@/9][Dߋ#PT})L>9DzzKv|b 0Ѡ. $0Q;kgNq/iP*vWBF,yzZ%5[hUj  +DZ( *\Lیc>]O)E,?5 KA0 NUC& DeJOD5QAbq),lqV1Tc:_:;=V/y87~I\VR\l8)i>HtLPkj>ζ'9/"uws[!%]h`kZ. "*) ~R3  O ^ iD]3aͷtq)4bNJ[7O_2MKHVo{\0~**>>PIJJdE*H^n>Ł8HF B`Q)~"FATQ.:JFv0^zan'v  z|< /b-t!(et8vzUBD)ŠIa *OggSV﹦0Is+!""! ! ($%zx|zup#!%##&%ޫ^@v1 @|<<]`J8tBH1 8J/ԙI3©|0-k1@5AP_/1ܜ=7o'/5gnSUK2OB}Nqkڰ+( vFۅIAMAbX8,#OH 51;habݰTNzrs^-O\pH WX^ %[NIǬCxLT m,\.gc a0đ"!~̍t pl ,(P{Sn\ݙp15Ǧ7f?nܴAX@T)Ki]ȟz~dnbцA {G(*t_-LT5R7я7i^ugLtgvF*m l7D ~k]od^XZWSp#2EfxU9| )")YMvONGh(ðM4ި 8itg'H7s(DzBr8ސ 竾mɠ. _޼.&ig'Kb.6g"y8ơ-j%N&$ B`tsf\>7}lm'U?3SD -5@BN& "9"e@VGdK _  >4;ߨ.ܕ?ivt;"!( !DLhay\RL f!dl~,1@5+E@ R*T{ t|FYue9GZTBY I @8: Ȃ$u#kf:;ghvܘNJkfB!@S$Pq.*JǧE}jΏ%a'ow6L 0l3P@?5lXr``ܜ`rQfOm0}NGiG"-X-fR2‰/='.dSbHFdmi4vr8Qv`KT$[_hۈH*XVDܞ##g2=&<5,aHdĐGDAHiۑR<$*踪:/f;k!Gc70 ;fn@ 0@@uDn]${30O + P$! F)h@ !u!iF|QEJ2,|@t DO5 r,Ơ`Z>|.nͩ C6FfmfjLwB2`BA,tu)bw:Hwp }%EyPv*|  i25xž ʂ<@%xjF\7> ,56A5^5~7wE JeDHӏMU,*ץEW֯.s"a}X'IBM& 04kF]k6+:ʾF$tEd 6ͻBS7#ɘ 5,wԛBu\1(9kŒs*HGxdpNeZ6MEVG&&R+B2e3u+@y}wr;~--I%Tdt hC#G7+ٔ( +Y\hMeB@{ ?9O Y0s.qeBdDT__^O%)Kc?{ϰ„A6׫P 6' \C2SCp‚gD@It ~`bDD.^CsSiT\ BLߙT{9sGnҁ̸/kG\ { (g9(e <2"i@d=T @>Lwk5B-T[p ,+@>8A-|. ؠ6DDS$3 Kb%ҸQ@5Skg z ګRMx  n/h@ێf[t ttE,~PYQ{JD%ScnFfd5= /v /@ph]0_,"EnNcIx]wyð0vo( a K=' BIe &\/l?7GmSp,zb"IF.Load;;NԁwfNLpjx! cϯOe@=*o:B|T@!טͯVM(3`JW.xKzA_!XՃ;VX^\tF= mc*_S{;S(`%=qVֲڵV!!6^k FZ?R,vjFWwi{էLx0"yke\5Jf3>s30(AF.W 䅫2,&0,c Bv!gYQ , ,0H4xSVNw2=)mY01c;`fƢ8ʘx6=ˎZih'm.тcյf2{-s~ͼs~#bwV@X`o&{d|_VY~g{,]"@b u ]tzR ,"35f wgI˗1$z. iIFOƊ|ݼ^dnvf6M:K} on9MӹL6ޤ~)FDH1m-@|MQ9G 4f]hrϹ>z3U'?xvv+LcՏpaZyʨ ě=NC=`iK]YAb$N6xdK)%kt-Vs JgajPQJAK 0nL)WtG)c 0>6🭎_8vgh@҆WB:Yxoʫ-Ln{-݆R0ƈuDTc  ~e.!-Xs5s6_ʟO8]{3X\@l3W_|1n"M#t@w-U ҜyA׽CY W)cF5! ~S]Iͻ&U([>׻2 |1"U-`@geɧ㴣g/ @16(}VRpyB !4X9S*>jp}0" *-D(VtuTiBɪx""ܟ?I !Ok6d|Z!zLWݴNR} i`o| H%YIQ[nlJE+\"A\UNM'$u:Ici\΂YUT2yyJwRuy,MdɆ>{{F5k|/7ZLS1TT_j]}Ҿhpv(LOQUG"k~T?Dxꪣa=fkulvWtL[UV~H<܀i1tzkGh/#Tc嫱e8.?|?Kz9[zf#.NixkKB26 GYtq8:y!p+>xRwʒݕwӹw?"o 4;!jR-DU#LR=S߶N"[i Lϳƣ>/oaQ:7ȢlzEe]w*ˀ Nn\_N3Zk c.g9eۅWGx 1W2ќԬKBrL,dմiݣ" јDWz APpo? Xc)tsCDZX J@|vqtL;e7E.nՇ0G%( ɱF*O44ES7ϟ蠛=ք+@ ~}5;\(^/uկ++ ='0 V@jR⒅"KN5N1k@\H GLz%"'I֜7vJ<j)\#nC"tZes2P.f>87FIsHV봯Tp5r a|1Q9-ݮ5Yz=[.؍ӝl? 7='>޺b޹[^VE깖6h(I3;2v<Fo@$tj]xjX1|^O #gMO9vjjOjN6!-E5D;O/b۫_h-vӹp"T?kM'C =QԘPR"4X*,KOrY۽WVfͮ 8L #"=n>}ݡbƇO>! FPnnn-F@p :*7^M|:$[V; V,դiΈdAL&  B-CI)dUέ{uPʍYTFj6߼]i U/TUmg ~ok Z1ͧRiqƘ<)y_U=gG\8wJ*T[˨~-RgR'|7k_\_Յhןy6s\5ש=qk'C T]*R<}B|wBY[ܒ*/U@Ěw&ړreҭ$|z$)weO5ڳ>?Qnt[ 9iWICC2-{3aU~nz<Iα?jHL|a裮<kw+^>qrbrY'.݁C\lD7ìjJ*6J`3i|=.JK^2Ś/b$65n39J(q!M" >c^=q:KjKw{߰Lr#=x%ShzutZCj\7!2o_v>k@!p.UE\>3 OggS﹦0K%-!"##" '))+'*$&('!! "#%(((^,@|"7hjO}oa2ko}ChvVi9Lhz`jGHJI7hNy8#xe"021}8zNL:}n`j緯{21Jרf־4z_̽Z?ie Ɔ CnS V~bpZCfX-^ duLFE߱5v-$z; wn}0ftk$Fcivh|r6y՝<p w;o<}nm#:1ٴ>Qi-/YG1JzVѽҊ %Z!0,+Ca|&=BQMؕ?Fxf963:XpsYC('_&Is\߮+50*XǬ=ya>ܳe>OQ_ߖA!:V6uX_[Hpux 2ec&[DxP^\^LgV "^#|UċH!QEwi֚o,%*=\7٫ٜ.J^w&~8r @6 4N :i4i ID1#[;fp2=S+`7<%zBrP%d ɀ+W#yI]O[&EDN11)K>%{wvJ+=(2,X)Ϗe+J}<]} DWO`om60  h:@#,YݜUd D +HR-7I$qlJ$"%1fCgp+8HX:L}M+$1l`o>:"`O]z jӚ]UW.:ukTqݍ./"Dc %Mx `s鿛ƥZ82=__}*E# a5rBы MX޴g 7ϒuPD-p3G7K\1ZV,9#A EݤC<֣B$ŹR T.`[}X-Nwھr@W/[!"IU R3_jVfeGQoN4c _5F5Z/Jq_]yl Jۈ ܞ3i2xy? -M**Ir(f'ԌS_d6[^$2j@z5jW͟ee5t&Gj{ls4>iĦX2RO@a~ffM/JgEsFF8.plίʚQ]%lD.-L c㊺9'QW_^=u4j ȕ547:x`U6'j=Jfw],u\~rDQ! ~| rcf!ѫn*"vp&L0[h'*3ĉeNdvȋ#D_;{ }Qz*k;I6a h *]EޫY[1]\f(`TK^gvAEOuh(zյH|ۅ҃*a[M'bhgJlhU'QџE.=3Kk0}qpmi&i z /2J1.+ B 2m:.@,W(x|! N&{_^8MADSfI/WDy_㞮E*4D ~c_6"D(k(%$1ZVl:gRޢ!D׆k_{H@)S)tӾ9سr,68i2#7I GKKZS7r<KJȊZq ~ֆ\Yʞ+!8v+(H}%t~o7L]R'H}ڷ."48MN57Y&vCտw2 %`XBh{赫=/o']KƩ㣫.֬qntq#:=i.[ؒiIc&Tce1<^‹s`"c 㛯|qtr]dnuSCTmsrv`l:$~=MKp8^}P㫂 >T[8l&z! wNr6uvIlO"kf_1LW.$Ȭ]K ]j~gn}uX:F ǚYi/Io:4\ X遗.tghiӂUN O~ ΁Ṟ@ 9ԓM7<38#'ůޅ;<?m[+Ug_gs=xe}n8a9Ox9`e!A ZLWA;}\-_Yd HTN(S!.6K }yfN3[X9'N9\/< BS:ol@˭6=V}kxs}rGps+cį=rGe`tڝ1w3|w&y? w+ն'DWU.Lk_y0ɡ:A>w(% H#M dNUVu0kaoo132O9`D@sq~sMI<~pC 3cTbTYh 4W"VpH$I;fdIʑNNZju]cOggS\﹦0LBtK'$ !"#%$'%!""!$ $%&' !")'%! "!%"#'%(&'#%&(&)()%##&ler^O`b,Cq+^l>?Z\\ez]Y<<8H{5Ӑc]\da@`O ^j)GnRCS-\a-WW%<R MqnXR|*T_ qdN%b޲r:9l2Et_N\7W7_<8i bR;.ʒl__WRZv .XꞿuZ0<]h^?7^AF㳯}`Lhinp%D]kӅ𮣃)<^OyZuF:o<>-Lշ5XwdŪ5||ut_dA(@* >pZ9 rzjqe<_JLH]775kbmQMU(%8.K1\7v 𪦜:4kcJ leV#ic DcUr/.0 IDfmMa*kꐦ ^A7S$Oe x5;wf{E8}Ş dq\ђla9|.T>(կT_W!UcQsȯ8JD#HTsstX w-zk%FN LŚ^Khqc| R˧$MAjzb~>;~w^yo٭?b)LS*EXMO|{oBfѤUI&ot^(ݮrd]ז h_dDx9]٤nQ0+Ӯ^LWR+sc=ih*ʰt__Y8): VH 0~}?t_)U z0L뼤zݷR{͉sl_ ->>AvJA1ݑs? nM%Ʋ2?Э`=8RrO<Λ:즦k+o.0Իub|&?1Od](>I@wjG|w oX9la 4\bg tf¼g R[ aiD~(sϥf> 8)isg < '3"M>_w}SsC*JιDB{ 78~mmtӄ㤉kpo'~t0)E|tV|=\~%p{9F<['K <8BϠL(o T_c(Nԃ7D &4nwlȊI2ixĚk55/sbL "PjKfoh(`jvt#2_W݇45+A!8verS }l84ܻ>k(pW[TrzOҢcOe \_e 9-6#{KoWsOp'<_UD/̥Ѓo:gڷS^Y;%M8`Iv.Yy6y屾us<wyH~5C5I[Iiڴ/'}O7G 3Y{-A4@ݘ6N\l QK[zꌾIqai'czc Gh-+8Rl71D]6YTI@j|**̧Sӏ{~a?ߦ(E4[L-&n\j\XQ嫧{kڸ r F`1捂4nBo>^O8~Ral9;hهjܽu$9&cIwKHNՉ7@Sp8YQřCΊ_;,,i/9?d?py}Y]vp:_s'9|v9I7:X"epƷ0usTY=hk4x'O9yS~?d_2՗Rir5(yŎRHשk[Plc. q> b;4獽|wFZ[ĉ JMex7߮)#-G0?NR9D4]M~WM+\dI)`e2DEpScvƺ) Ν|s009*.4b.%mQ R +PB'Ɵkc,Zx~Gcv <)Qj ^Y%ٴ5IaBCRΉɶ DPa A!r0 rKeH?1.xb77nE^\ B,i%^H 2TYV2Ͼq)Fc)C{DU_Y-bΙX?@)T3ڰƺUtS{`*%țjofzTOggS﹦0M8~P*$"""$#&$(!#"$$$!&'s\Y5?+8i[zdy[z;FZawUD G&?Nim ^th1͙Cc8|qf<fS,;w(d礝7JZ1RIؤtvS,Ooψ/̶.>ȓ VDspR>u5X8&}xiY1#Ʀ0dmUIVٗ>ʹ\w "A̳<3{˘~hUw[0LgH +dѓ ^l / }]`Pp!>/W'õB*q:Ѡz, ԁA̝cn\%sIh琲W+DW5cק&oǓuϩ>7j?~ w(و!RKd}4}> := _&L*\2Z\7SHba?Miϐ s V?~a*-QM^ѡ>WFv@E,a`o}mOAGV@࢚{FgnC%J1 j40`HT X UU4ώx7߇\. 3$yۏvͲNF[B(qTж˵3XmjW[8e۱ILفjl<ɭ%%G^ 0{ L]{UׂϠ>S͋%vUT2D] be߼C6҈n:u. J%%%p~DkO/d%oV+&|?86NS ;i+v:!I]pmY]j (K;fI^ڼy꿦J3ϯ~%pݵHiKq&\/?"Q+H{"I SLI_懫Ӫc}U0!dw :#H]'4 }N$sG֭dϛ#i[J{gWh5.Ի4i?0ӃɰsL^K[_S^sݣb%mv]/ׯ\^XGcJU{w|ƣųK^F溊?U5kdlG֖t,8FFQpaZH>%&;L3VCeф:eEkU7>k 34\ix'I&J.]bM=BhegHj57=画n˚+{\0봫$ ȦSkI/C噲ԧ^ Ƙx aC!a :<* 7YdO@, {]&%H4$'y=ϸ%"Uc@HcJMh@pz p!~#7z֝5C>qHJۘ%)2@!PQ.;~tcd2u#d=j~GZ q|I&&Ijf (3rA<'kTc(#w \1VuQ0L{+`S",*^ 4+7 +9d#e20>XjwB":6ӊ^qlk~qְ M)QT/֋5:N7`G/Y8 M dYF L `^,QEEJJSX X7K)8rK%5Es(hQcCJPonhC?..3x*[Â;*`?Fa{|u6h!fUHڜ0b ]B@<` 05|wpzӌYιO08 ȦdqHE!8%ϊ*fAkɆ"pxļ?=1)c-IO-ǵl9]fmkoV)pK@ ih؀.*@AM!ŒBý6ې)C[Sѿ+ 5SSi?EI9ߵCn.rY0 LU!PI0 9*rR$UWi8 :!TLST4ߜA0iֻ+ѩIZ_ <Ղ-|z ړZДތXPnL:IT_Zh:D r<-k6)5CΖLQAb"/fkgw/UE$?S¤e,ӂє=>bᥖݱU[5vrMj4\~Ko?r'\*elTWe-\#/½5ޮ}- d[F/@{كW.ӓ$Z(y. !=7Zm@6=.@i󋐕5}1nںqjnuL7:o)LKf]/t0}s̪,#)k)Hzw(L5`Q%w[վk߬ #5U"KTTT{/cL2ӭ` i"R<*ig*WENr`9DB#r׹eYUUm` L5@iVs HtieJ2 #( tԴr|ͧ "&#q鿌N$ sZgu%&v<1,ƚ{t4*M"H9 h`c@k ~ֽj՝7jSY#.Eg@%}#n~lTOȄ4ZV@ 4aLh:C Ce [fkWP-0@82 +j^+D#٭ KL޽v!!P !O!hޫog;M(-;[ Z<<Żwa|S>*\pkᰀiIO.~<1Exf "C"$  L?V򓿡|Y)zMasr>.4ٰS 5p+hWLƱ#cekA+ui'-Ep,j8 bp `l*O1HELB8]mcm`|5W(B@U ` tArvXP/KťC&}E.e1rۖNE#&'h5pJTK:Q)rIfP WFqe3F.\t@E_r95;O@-F\gLiZեc@ba,nh7,KGaXP8F"hZR>>h97^ExJ 8W 9)UFFʂ$.]~+v5j{l3XU=` mu%OS";k]HΧd}E:)UA 8|*@j CEU@Mv1{oDVFP ~*yU1*"+ +˥FrP ~a@0bA#O)Q!EЌٻWfSչV{ @{M\P@ tX+\ ]U%ŸKu(R?~cT_+# $W AÕğApJQq/͕ևh_X|BQBd+P7 $_+s%,槵0 eZbN4IexaVOu{`|?F Nόټe0M/R+/v(A R!bwNV$NE2W pXz80}.1wà 8+sOzSUE+'>UX= Ts!}=@ATL0DқoʾF~X7 n-},os). 쓔곧Y׺ܞXVhwsw ,UL'؅kwi=[kXB,ULj&:A2"!_n%Zɛ"q,UЛy{[S6$o+ʈ,Ou5Ã?|^70ˆ+<ՂM<1.p(jOt%hzyKu̞<'x$j9|[y C*b:,Mʇeq۟|3-@5CWTB.,>5<4Qv {L l tK-c!nV DUu+$\w=xۼIlfX>')w.DQ *2E3SGӯ28CQ$_|@@VP{:EdG+E? 2Ldɮ%o7bTu=s^qk>-,Uͧӧ NH+InOV_Y_ϰB`p=75oimJm T_Ri&*#\ kXp?.D+~!X @&L `tzDtdR]N~yw9.` e + >VªN DuxYCXHPk7RT^ €ї*H L!3hZ7xK6^R'[M`g,(ݽgtRG!qDHМ %qi{P,2b],IzV)%&JYnD"eE;A2K >ۅҁ ` X~&߅q8Lf)3}QQ`bc\[˿LKidS;x е(Rb;jɅk$ȊFBr.IDKS-쥨B#kXqY; ~ :VZ炅G @!xX4+ӟHi)u_K%X![PZtG v`4${xKt(`@DnłRM˪ ME0ZGP]^+ڃԗ|HSA]OLϛEէ 38(R͓:"1 @j@1 DBm=paVJ9N3,VJQR`Īc mֲpK>'jXx03.Jv?>hofoؚm?>|FÝ/s Ti6;A .|G9YR]sqKQʵJ@[m8#x+fҀk F1Z9XWOSBHK3: cpqL G#ȨCAPg@*(3`ͨ_jmHHu>s-f!ry%F"IDj{^VTb6VDD/(LZ8&&Fhe;?% #A[<*ofj/z5mkR-Ԛ xW;O cz^f{-J[AN!:d;Mx¹Q 2Nq*1<pQKnV4,`7q\p]#0З)|>*jҬYMR4GI=<cO>_ G9_)5RDSrQT˱=x;ZŇC _l{}a?.,KO^_q_4|NFQPW)`Zؘ*X*e) u\W+ҁAnGu,\rB&JTx=Y3&ć\JfziQl0:&F4@3p$nM̕eZ5֌F{ߠZd8sRuWۑB JB ;&HL0D4{5c Vz5@lT)/w[% ]-n`gO " (0 0rPYEl(!oNJvq,LqʅXD\hz5xڱ/TEI 6~"*&u9\ ^9CBڤ/%-bҔ?i}M 6V=F`&Ni^tGqyz=pD!# r`&"l O2ZE?M--Em(Q"QGs~K1n [ P|%uͤӴ8\+Ѳ3k mEf}1틴%O*HDgX8\@ J50@@(2lS36K?IQ k )f(Dy #A1,j~;1.dBC6-͖EdY`g/kÂ5ua O)ɶZf9t?-ҲmN am3(ncp<hl@(A@pQ`d+KE-VNq!EpJiXJVA)|)ϠKoe sC> `%`4埮>łUGTDr.owDewX {K#GH_ 8 W7\[5 8r7k N׾(qԁh=W10gEE˥:n5 8 NOggS﹦0O*'^;& L?p0oV GY%42KP"nV;SIU \nu?e б[`|@p7ի MKS$ -]N0a|:pϰ#KuSt{S<XhU!֊bt9wźu̦7K;'h)zȊW{C.݃dԽ<.|C|(jU In)y%@*_! czlKەi΃n~@885sG^K~:t15:|U>7 ,).hnrN)Uj 7D0^a #Qx n+V>QG.S?eN8ƻl[|>F!CX(> P R@C]ן:}PoZٰލ_;\ռwNg>:! t_ JkqihE/Ixw.WyTJgvjF O>O=Ҙ    pG$?R 2t()*F5T|sIؠkCϨKH{§{P )jp[zRA!Hxu%q#D/6 `UJɮR`430TQ -v|B1Zr!\l^`t2at %n pxX"D=>we`-F6gٵC41轞m 0M5riB }lqR%qHZ 0`1֕Bc̩`?nɧmޖK"Vx]+@`{qu`c%4i0m^ICE%Jp ML};R(V?^Z}w> ކ(o^ʩlkyȦvz_yZqsh@ +TUT)Y; ěߥ1Xq n;&h\+@l/FbG/HΫ  (>"P 3L(C@W4tUP`Haq^;F9#d IJҭ"`>#(nc\NӉo,lcOOvumZ^4M RؒBA(L(P,"fv\gY,_<j{r *9ҖAu|- G~%\_ŊM@z;){I)\ڹ_aS2u8aM"5#l)AJM+ Yr{Ksݕ @jQMY︬ݦ2i'L15sVY+1JkTQY ^t5/-Uh(EG*> G HG6 1,}@kk䳒=EHĦ;JFy7˻R VfPj H 'x,$Eԕ519ݢvH]o*w4} .eCdv)DsDӓB~6i?>$r *Z`iȊhYY쩕+Kb~2w)$pn k `*0AųP@ ALzh^+ZF} qZiϚU`RJ5VD #jQXz^JNF1i+1 -F>0@ΥO)Ѣ2?,G;2F=ű ZG=" 4%,xNY!XuKn*5}]qCMB~4_J(D+ܰ^\Kc+5դY#KJ+DL bJGq25z7ӝ?҃Ua XA'%(IpP1 F}ziM(阦1dʶzYcx폐--b٣k(uӌ%~K.E:-#۱5/Z4N`J2a[|?t2Tf[*a}f)[FG QP5 2lLgT֝JPg$:g䶶F|+Ϝ/%T4cXdϼ1B4*L~ŘȮPflj~+&F(?+:J3VwKaODC"iIr!lm7~8-<$/;b<@w/D|H% k)fTV8t2>ks֊+Թl90΋.8 >1^leV^Fdf%Z/KX>׋-܉{.JB^sUbRuYH6c07/84* p'ڷ@Zm6@/T&Q#Nw{(^~;꺹=!홾Z^'](W+U`h84Wzә2KS M^1E@ Et/bI߾_pUxn7]X|?qo/pϞzu:sE~q|]u"4tD6Ⱥ#ppKr 7|9f}˃}9 c;(mאOPfŢ=4,Vg$M5QߡF/MkkZn9h8K)V?T6|*"Cyg'BHwܦq*8Oc6tsfK͒βYjc%V*DU:z6x$hQC2{U-O(Tq%Dk63B667Aڜl:bvӬوOHJ=KkGXI] ~|K>T" Ġ"Hvm_RH<֤h\o>߫ΌId5AH0%<h~Y&/%"֜g duDvCwxoS;L#ӞҖ-D.5(reu쮙Xqj߭3⍱nZhDUzsCy;h-1F!%t#o6,;vm+vw1qS@j(δPt8OK}A V 5_P+@ RI/(I18pY^j߹L,VMOו[^\( ozxa뱴 ;ňh]*x hVZ7)1j n6 iL8Ucޡ%1@n(!tqJlK(W?&'c[n^>fp5XqSsrVnjvl,WkbZ\SVJUHr`[1MU;42H |`NAɫTAiꪗ>uRfHzxV2~``>< <  +} @)Fc]2Axu:ѻB1 G?_Ǵ҄RٝBͪP2~%J79R |ΕK3CDŽ|hEN4T>|:$rM*fV@ 20FC;7l0;GE/hnͪvE&Xm3ĭgI܊GZ~'/tRn^L5ǚ('_0t.9d?!??)ß[Q-HE>|+!O4O&c?lsZ&,hK1V9C9PPVA SD*dWg7]wΎv)NʙL3g ceC3W(O9gtfo vf@Rn5i:r7#5dʐ^l|(0ɩX4B>!9W?[:֌F$z62GOaB( M R b `!Tٖu!5za2cn\.(tN6uP}L]g.g+*Ի*> fM2\nJiU%PF\{٠fWZ'skmtߘ:JDL֪>z0J5_ ]2@@f/?VH+@d*Cqhzm@|Xtػ i*Ӌ2 'S1 [_WѠZ,5}ػZJ4F%e2U!sB6A1WʦgtHOsoΒ)"0YT6UwZp pBmJp+ N$ k4Pfd7<;Y1eBx!/Xk(iLbJ&X5G]7y^mX T~C5A0Q7 f+kkwvS C3J%#c@GsUp]bV9dm2\AwwC@IԠLOּZgaw*i-k]1EWai h A=":ԛ7\XDw4^bp^ |#V {/b=ZWZW -~)sU w]w=INF.<}Afzpkdp%$ajC1e/EDDE@p"%bHrWucPv<8,p5GPq־NsݦPW,7!XkXFvP>:&U:Fc\9@k0O'OI 0#sz8\~{P-rL@:h#?;ICqrMy@ %C9*}vK"\G+3+DO&CCrxc`,^qQfdW*7Wk ds>JVE8+W*V@6O€~ Fidг.wT: Y [T-vCkH :Чn *ulKh6#WSR8({WkwKkez> ܧ7g,PeIԤ`(Sl~ aQR+qx,3Ui:ʂ1\PHZA肍PCi ~ xSNbܒx|Ŕr2WUͫr/}Ӷ_*3T}wUMi9 59Ve|aRuN<_*J~WAw4h])-wcg%`5>H*(UP:\O[5R 6Mha fu".vɭh~l=oA3SJQVTۥ=WA!~U$x_^IqKF #+a?6_Ԁb6?,(\yX r@ @,D  Pp;P~`qc%Vp7ŴdXCF)E-Ѯe< \)8.a @#i@ xPSdS+#><\~Hs UqImT@ ] v)L Z@ͱloؓ hj"DVHnNß MWBq|N} k O$.+]S: Dsd̪:ndh*QZSs[>d#|%ޒ}ze%802U[xTGzRc\'Fw+oGUEVp̏zGhs]C|n.Ua&dQd'4?,gD:$© 0 dڠt@3 (~nw\7Y-Ǡ@ @ư$Ya^Qװ<~PׇQ^xM҄ ;PACXn.H, 80%>4*.eM,dT`+0eL煕”V& 5~Kǖ/u2֒ S`!C֓l >r6LVM%D҉L?1zcogݴq Tl]a|z=voU%uBD~K,-v:Z0`>RI h]C7a6d#G]ȘϞMt>zu m-Z0 d/2:@F=GX[V BqoqE+(qEBXjy55ަo?HA($#[m՝4nx_b0~7Tz"_X\NFڂ"v@!͚Z~QHNPp72B-]⸰edWIU +c8,&5IxOLCE5+t TjOggS@\ ﹦0Qe +"+%%~ "$ !#(*&!! !%%#"~kP1V c\PG~$Abeh.dxERZ'’+* y *L- ׀`0y/b`] ՀT $*DuKmM9rjVP jY.ĭ^{f<{HKī(UExb1'ؒ2slԎbVo+Fh(@(d%E/RZA^5MD^“Pq-ذsD}E2H:#*~k4 Qd4[yc$Su@:F™4a?fdDGaOb4! ^VP-p)^U'a,bXxV/mJa]NCVN6ě+eӴPV_հ[\Y ;Nln2Җj~+r( CWb;Iاu*R7r"^ua hwgSn ӛXcN^)qm@g4@PX6h5G\aeQMJq]qYv3Y%JpS@K0ZbRê* "~ƺDdR0L.:7?хY$fnRSqǺ1F4 "fciȷw*#@P;TjSe؏||6 nr^SxFĸO3Jh$4/g/kݑ]q׼c іpaY&*2*hAb|pi7uU1rbp,r3rn.~E٨e㣀У>1 ;8N~ޘ&JݠQ(1P|u#uFjNYnT“*P֭ @+vɍL0C3" o N[*2v4X]P89߁xv@^h&0@OcHH & Ê:Q;Y9ʚ8Dmm@J7H->nVJ V.P@6Ka4֬Nq|91@eı,؏h:#oіu1JGK*JD!e= A (O{$6Z (q095br-nV@3Tj߯Vg? bЌ.@ 9K!z=,jgqHʤTY1S <[z:0QM|r4r} QD>5{>^Jj@b$@psƨQ:ֆd֏˱v.B;6B:!rGQ IY"$I-Uu5$Sp,|fzLZ?ax "jUu1*Qnj>;4F؋-,,|`-ȕ7+n;*Ȋyyè-} դD)z"U^h=rPEC.gA 4lj5_|ܠKci86ɦ|&EFzfcqje @ѧX 6(C)x~><ӘP eՄQx. HGgEfgldVhL/=|x@ž#eF QDZCeCbPeڽ 5j+ "Sx9 n$T\H"};ƦT=m/R L4âeN֍ jĘͫ Kj丂`ǰjV%\H.gEbs.?V+طGH^bD@jf"@sXĒfy<}""Nr/t6iBDv|QhsM4w#ҐFyw*pbY7|Q7S.Dnah+j&+73:kKlLk$ U>T1FAu(s6c,\_*m_mb%&+Q@/Ю:}CV!GQ+(Jni3+-Q_*fhD WBr ~+•4VDi DTi83YyeaQXx+L@\ ty=NڷНw3lRJ=͋ Ĕ'F~{9%IUDzSԒMe.VZ0?.cT<՞Dm`~'0&c蹢L:ON\s]U>vnɆj[ ,тhtdog!Ғiֆ/<1fIANj`B^8vf|gfvLWa>4sL&q&cZc I2uX.4M@Ĝ>h?M/-2ܘ5a׬t٭Om|xLWEUY ;'I6Gel6<TWzSUwkR)uiJC|[:~GpLcŏF`Dz_c"fEb0J6N mw7IhLbu9_s?y\:h鲄pmU!G sSme%ነ]pW}Bb:ILzPX ^#JOggS ﹦0Rh *}vw !"##)%˯"!!''%xx~y{+Ɛ!Hv \!:ƿ.E'"r4wCtQ<=[Nw?ؑ$@e-a$V(%܆פraJ8Ԑ'Y ¨T%DM6;ƄXS*s%aj Ic\\?D`\1TSz"-WZ"c)xl=at[DO8).!˻V)8ʫbU98r1O@CAq ˵]/ $DByG+aC_;ϗ%l2s&αP01%.YDD{rLhaaX>'{/qF{sTq"J\"yS dY]t"2u5YAֺr>H= IMZB`M>+@>۱@6)UOw|H?yvnaxaR٬5em 0>zĥlf40I(f̅V /"泅FFb KMVC V/m |bdR!0A~m~:)m) +VnݚVF' &*tcQ\dUj3i$(%e Ţf;&M׸?@Pe1*&Y5$0)c vXI[/X}XP'>Ix\ v|޳ĮGRQB~&@ pga IX(+2&00x~+&t-be wa \l uKi7yh$LbolG(|I~}ġ0A0Y DCGq9Y^%K_ddw| 4OzH=HVPk[ XJÀ*. ?_4JJόh^zԏXq4V6cJis8mWƸcTB6'_U2Iܦ X\n2Fm1zQ>W_ iWp]d;ew3UaB;C FT4G)b2h(7GݰGq*#=0w`=3udGW_NcFfU9|n 8$t5ۆ4rI8?njix <ML3NUcBc\덇Rnȥel%ep2ogƪLX*ShQFֿSq.XwGS פUz j> _j,ᾯ!zָs;K{_eҐĺ߭d/giY'lNyp޽XF mP:}pPz]X/"dVv*z]yxSi]M3'5h:Hnm&_KytB%SUB=:;@]iOw-"-vhM/I񯞇 'o߫F_;$d)5H#>ku4T?ZToi\W-iG=t.R*b=_Td2St`$"jF(MLA,T,xWMH:`,&El&0) ϋ85/XD9ßJ3>|Qo?t8 tT_Mw "RTXwDCtGO5b 'EH:&qVO:&K c0\V,OP_ N[ 1ξkRw@%7"%AGTL]"#`x $J&j~)Ԋ$*bALh $JA,ecdH]$6ypJUD4ڨ׺prf{6GfW̶ YI658el-3`6`:Jq eKYx`@iY6%Y bki -@Ofe-~bX74VE'43Mde^X;=pe 8az9:" +\| אt8WAdufIFr'+os~1jXlbOggS@2!﹦0Sܩ@2$ %#%(%'"wt|!!$"%"$%$#$!#"(&(~xr4QI3~s5SIZWǻWWXQ4Of->d9Oef3b</9|Q맛BnvzYb 7g {`,$GdoAdL|UE,4i,riUm/?z=bQoi i}6?}!-:F?=/vTάlD9xKcDFAn$%SL Sd@Ս47d ubIV~sZy Tɫ9XDbIYN~״2q/܃a9Pq:N/~J;-JC|{ok64e}=DkE?FJ +/֓O[^ZE=6420#oK:$$I JiKdU^E@]춑Ь¿kֻvϼ ! 1Wz.ՋnI)q |6$5/,k M@]S"43,]HiL>5)kPr1Y. pdf-l wg_XۑB;ZxiDYklc !D{6QA4Ӯ?b,5p`Mgf(ۼ~;-4eƍFQB:0"d׊9\>C]j$n3VBc.TV#GrU<6c\ 45Xia *.Zq|47sɈq,qp=;E!49 rAEfh dZ\\ф@~K.+h(Qw;ZUΙ=/0c"˲MD?̨s?S43/hY sRu@ɦ'(Po@-|gqr rp*^IBapZn>9%ea@^&Y=Rbq*AvIԺ9OƥÜ8ƏUTN)G6VdiG@pP(ʁS]B,MGo{x0_Rӓ o!V DQh << xRYh4u1eDѸ!Y4Kk7jS[2P"=}[KfX/A%?ڲfrC.Qsz"` ҔB8#h?0q-=iҊ{ qT ni@`@*  Y >༘nP(zp!pfX IQ-!^ -Q5q, sl21',%Ӗ؇QO$P 34 @ YR:=X@̳sX+ DSDAcDĘ?!WEb4 %>tv#UZVs)?Rš/s/2I\?}; t w ] Jj TTޓhj >z>BC'qDYu TͰ.-n/Ň02eg66Y @:enZ܏NY{brO"^V~ΟϽ~Ӽ/j#V37]WP`+8{`lX#Sx aUIaoyeuJ#3[B-E6tZl^ VP)YX^ǡelū?X[bU7M|߅#;t側ufzMWlD<27|琲a]q@)MC -iraù KTeyU9x t l5_TS(tŪL+Mvnީ=G{WONZa <Q6[7w}Bc莳Dq6Uo FǛTL];9X_UjLͼt%?vΧ* TlK)@Ӧ2|o Rg&oRc%*1٘j@4E*Y)Ry68FD?ƠP;.UMX%C~LDɸ"#MҤ]<cQXfB@=PJh';K>`A%@}A@$`E.--McXzƵ M8Ln[/0!G$JEc"L7*q?Qi2 Qp#C"gG(D#\Lb T.`pOggS@!﹦0T_,|zyz}~ ##$$!'%{~ #!!$"'#x~K&`6TW+&iB`)Ɵ~JqiF8z6Wu|g U2'f'@2ԬFO* @ _ /^' ;Lԋ*{#c }ͣ RD ΁R kv{U-<8q2z0}Zs #$ 1QDP㌌ v6s/wGԯ4MhW4W@X-`LhaɄ RDZ¼ H|> fDn1utGL󪤓D;0^#R%M#\@cpLq_'`z(>0[S>TêT#IM>8CELHH"PʻX%lȌNv{c[]gʒf$u<]dE";@>|0bHdJB|.TJDlz$NcxiD5ӱsl#" =3qddӰnd VNa>h b`uČ.n 1eJQF hǴoF(kbo@Q)5i \VA!n6ުQ!QӟNOd;n:{F G[(l41!%@.X "4 vɳEI]QKo~:{yv kP^Q#%#wARk)].s[[./lOєXDN/G&a 4,>FWDsP^;7VJvXZI Ƅ,.T? z'M u|fKF JM(1 дKlŁ,TB"u+Fm~ByQϸ>Z[ɦXd:'sӍc ^~,N \@.8lJ:NWy:tb01>berlĄ;^ orԈ <_ۦΠja/`HEnM.@|əԇ;A:*xBh(aոk'tˈ V_YECE(>fj)pNI54otz6 gQ"VOM /qe2Q@׫BȺZdE4p<$H}xk\t T!XOJGjtދrK'0Y:j$ҡNr5@⢁0ԅ" ¿+V C$@w/K/R"!1F7$oɀ3@;T h, A&N"L"^A ^ 'сZ+qĢUF 0 %T+(PFgЊX-VP@b !X8)a\uVNT!!l`S \(oYre,kVA + bªr88X D( 2qQ+~;&\i$-a^vDU:/H(VN;Ua@&ܚFhgOf[6gdc.Ђ>xH)@Kj9Ot#@!UH'ZK&|/:( SQPBS@G?DPхOfRc ^D:@Ҡ|HY,mB́qAjj[9~GOX2V`XWϹK~PpHz]Tnr)Q!@ceNP0cV:<-.+ۧ]$\b*EmڇrY[μ9Bx"d}ƸuZΫD4Bɒ?Jsyu^ycP;cp@W?8(UV(b1A2[9YwEƔX-ލ{fC!L+cq+'g$l*uE%2CBDUU$n6xPiha7x^Wd4~]~xyjzBFy d8R@0-!"f*_RV #< >@!'OggS"﹦0UtY +~}! $"&&"{zyx|"$"#"$*&;G&EKPM}H'7  4[Y95Ҍ2з$sk H,0@ DYŢD@A3r% r~;NmeI]#M @7Ow2] 2a``(GHB `TnzjKuT 2(΂)J$_H;T~pbKX%Hi4Zlʄ 2D1 "a_ŽӜd FmN\#ƒ.Q%GfB߀K >1{ET- KvXS󻆯!zK B 紛0J4KO4VĞ4op Cu*7X(o8QqP vYMW VİȒ5*0>,v¿ {d{GC^ra@b)1!t")B>/=}o;`)0=] J mf!wg1WZ Y:@%Y2Xts΢]Aˍ~K8@vnM! :,ήΌG M^?&JU ʟw h{{Vu'w+*nP ŏZ@:Iv: *=sDrsXF6,n5jlM թ$-hĜۭtaט,\]79H?Q"j%02(O< JǢN@ _XoR@?@+ɴ@ppA6S Z]hgn3D\Јc~պv|HpN>Fq=Gyc"4fyb8emWyHA$A Z01$ˢ95nzE{$˜W7h`TMX0a QCCdH Fm>E2%Z/5"RQQJaڈJU ;~;n[>Y~i  I }Ńt0lL^ǹ4:+wz}EobVrW2 o >+Gcb,c,^pSW` $wa=e'Ƴ7_֐v%JR?, ]uT?V5L,h庖WAZQ^@DU]C S";A +2HD{U`Lrbb":eΛ Pm;|ÝE1%C"$ :i}DAKS5{@(7 2%` j#ZF/7 iMs:EWh;!ct4e;zWA;7fjcKyuIx`Uz/d'+Fhn(kzC9ݜVC,FKC]:x]-nZ!ޜnT@kxVq/PWMDSO9{QܽEțBBLș6){kQ1H*y'mӱԨARx=V ,Vi7ʴ{R"&}IP@ތ.U* s{aIv锈b:cLyѭ 1Z//̣59RG iޣ&jf0hPe=J` .W/'&FS ˊQ@|\?>V[,,:A$@b 2/Q aUQ6eΟ><.idžc[?eeȵ9=||?txk̀ADA&'e~]?xP c80@Ĕ(pIzu5^xĀYT+BdDQrQկԾ#`/sM q(![~Tz6cox``i8 ~8** % \§?ǟ7wkЎvX˂Pd @(@]c@@dGABŅ^RoTΎ1hsPi))((#bD̘ת}y!u?tR@@I@cx@  ` Y$@E [Ԉ H~;56$!tcBBwċ;0lP~ĘDl7ESFơ2 DT@'L. @ QA6`%Y% 9d0 }TgQ + " $kfB[x@R]2u>c7*y 'lEDD:P-UKګg@%]?wľ;  >\}#,H 2ȅSSmhyj0>+N&B6I[]fV[<+%#Qu$gE<nGk4@ e ++KDlScQY>nF`ua.n}m<V.űnh3HEկI= O"l/_ɛI~zoiᕦ Iw5wW$p9{Gq\ @.N t:B  ޫ]WW~u A }UOW s\L[Eq l=TXf[ H]Q(I?tA<h΅p,x+7+yęΓ/GY+>??YƒӒn\WIc&IGfTDQ7<_y索l:Mr!Hm 4ӂOlW_,%*8,q(LΓ2okβzc·F \؃#?QA%)[$z^46ȟ T\_1*H9F@u~Fkۻb :i!ʀӴ2CTWF>cJK$p5nZqƷS42휱&:"-{}& ͫ =( 6{LWMZֳ o5BZZckZLRiV8Z OggSx"﹦0V""!(&""#)'|.Uam> 0u˚͗1a#rcwӓE.ZfQxTiow0M3`h(AmvVXWIoV ^Mḍno8qzk0n2l 8Ulk;.>\65^r*s ]/]Ȕ&aPvp!MΪz'?Z ƥ0(UX@`2|DcUq ^_7T :fFq+/d:g}b1%?D 5axղ ^,vvS(5ǮJ7dI pIQC]8D65`]9[l. 4:8%C[20 ,s-6/ R 2(ujcvZ AxZkD+Ƅ2(yb-(N)gd$qyc."Xjatv;\}5HyE Ww22.|Cm<Uq2q#+,7 哢nvH~e0]1@3 6RRM ce@XѱM `9N fɉv%iDtEJ JpK8ܬ=aA)!GBV=>ETVC뾙Xxͬ9IC݃f[C䕴1l7S~nތNcIVh5}oEVFÕR_s2bӌ)]3h~?#Ulъ[ _<@OLBqzLR2ՏQ|jY448E\SLhv5t1€wkWWrL.ޔR'P*rrlڦxijaBLs7DA멳h;>%_ JEf+`M @B(hl˥=\ )L|D *pMc)=^ܥ`kBݭH R,*40MSf0B  ,3uS(mU Ą SM rU5) n94dR!HЅD8@@]h 9B*;^VE| {ㄅ[L4'hv=r< 9goՎFcf{9> l _X^F> pUtxxȡo@A, =w8`U/+lRz# ͊ "' N+ZTd4A*4bY19 œ{UuЉ3(@0ZV~|K@9gtػ& 0VBQ_9RT{ YG{ D*uC"T TiЭyB9-O|>[b>9Ǻoa\2J#Q *S,_l95}n@r9dC@Hfŧ7o؜7G9Elڮc\NvCl8;FzycHjz.gEW.1bu\8⎵ V 2@I4`b!Ɗ/?SDiyセv]Ǫ`G_ 创^]taMSwSY=i-8Ufm LRϹj3ϢJ Xqo^lo[5XᇵqNi\+~鵕Tuh?6Ozesxm&q=i!鰣ci?ۖYړC5Ǟsn3:a73|vem?F`7zͭ5>|=k1]R].G1킀dU^8Y^ Z/h?ri +u4pq5;ϝ%L۶ M[ :g|sfoݯt>0:fw@nu3Uc ~17Y Ļc=]ax|PYi$K%w PWcPJ*`=FR[iKFd.ޅtz 4**Xc9!Oֆ4_I&h hbD*njxr;?FHyo]{˿aC\xS]d"[i⢆ARA\e8|7"8 ّd&Z!aq(rx)u?ԚНHcggs$/fVKXҢ8|S˓6۶Ih_UV҇cRxNÜs !J\!#΅?wVknxB<#Ő.yz(TTllPP#U ~&TK x)%0 PLZoAH p% J|* @ITWX mJA]&1_'R\W,)S0aǃ_̥ 8޵XH*6 +<! AdAXX{?}2,}Vp+-gߖ^+m:/ 7zjυa6:\mM%Hj:61oZ^1>JmF ٷt7`Mb[W8}m9d`;KB9~f?GX4ӂ' V_.Vonmpwb\_7dDŽF>\eU9҅k5bAFJjw'՟!I ,|!t>zR̄=$eA8?O6t2.fbM2YiVha~~S\@k\{ K*T i4~yL׎5iX}t{8g*`D8ro~f%-e+&DY=CQVpiڕGTlφ}na=b\_+Sm) 4!)&ҿ7m8en:cY#0FZ6⳽ˇvD$ s::]]z;Mkuؒtѭ Ň1 }Hm?B+~z1JKi7i| U +QyEݓͷhm#M8߈a %#r_exAu:m8k3XB^jn<4 ;$|]YtpGӷX \.-6;.B9s8|LOcY]F)m~G ]$NF7Rς6K}D;v0Iq.P:.=CWΊ'$ u,1R,kwqbb!T1PQ"(*HHѣ&-ӘexSMD@XUmp,hNBۏ||DG]dg{@]Z$F񕰶mklvR1Vm5BƁ;zq FϊNgaP3hFϧr\h/ez͔2nFa9! Ats>1oI͟lHhGԨq.I!ųDT&A$-ʘfLAZODc:xSK5PkԓbԸmx=Z&yή3{n( #ҁy*Ǫ2ɱ }ؾY=q,/T8(R* M( څp *7VG[{N^NͫӟT;_,-=w[ճ=Iіt #X2`2w˶F+Q둣 *a0MzcO{5}úY7& sK,\.spO~g|j/ɗ;ol%QG%Q{#sQw5LI5~qMaֲHC 5$m!}]iVЈ {$3c7 ԺBUM!`&(ֽ1q+X^+GBL-Ӑ 3֕ʹ:1 f-mf9[clq2d 72YTn{ jn$ @ %~YvbI7'&_5p[{ L5};mI?HL} \x.xeR 1ck ^"҉F#[05.ɑ u%2@ݔ*G$2ӌ0ޗdXCހ~wSӿ(E\[ӹݡJ5yaptxYj2u݆P즨 q{ mS>?`EXL۱^f•hoR eh] +S?0H֔iF"-o2p{VaUtJ 7DFw$z7S @!mѫn]FGRhv$UyJMkVw}Fih3G^ey(eɏɇtvYchܭR6nieb W7I#Xc:#Ն­(^\U'^ޜVэa?K5aAXFHBƑy498Ke'dGa댌DJA1e훻2WdF`Syz(@yj]Uӻ|:]v7 c!v$s,u;u 5U@uFvEڜNƄ(ꕃaZ:4G': (1fa^qqs1m5&V9lҍ<5ٹuvxՍD>2Wv80||eeпkS[5prprS8_ }Bw8rq`\K- s r-0M 1f3[:(_O˘|vzY&F2$ݿ<297Nn7y'v8edg_CtNnjoLrn.pӬ2nNJ˲ +X1)p;N,@%0̻c]!О e<kQU@$$I}KM*)Ҕ=t'k"~( ҔeG$2I2jkw`q_0ُnz̤\:ɬޣԸ>i|*v\3uKĂ`}M L+ ؗ8:ܸgDW9N&?iuɆJX-MDjn=]:jL<h܈ƚx4$LѺS46}] <8g ?LYeUD:&=~e_hy%;$bƭc;"D)8؆@Nдb]DSETq l:yknc*qe2!O3TWaU$*'sm:O4>_dFTUTETGh+PD0Ϳ7Omݦ̾%eQ?Hm #VrD2 )CX^nhفj&ciʌ/!ǘMo|e>FG}7>j老 PPI=я^RA r:@Vհ"딘6P(VRҋ["yoA53"cWmܱDT~+:%h[2e4)BCv*{lָ̹&i-͟9XG41~X.3@uF5$&P?3\L@3J m;pM^}Ic^:r8W(oƓ"h-w_>D+F4Ɖj|cF`M9Bsa "$}:E>d ɟd 㥯tcQǀ)61 N @= +52*V F_ ر".T^3 w6 ues)q/;'WcdSbQ X4>0ɓ#yJ ȣ49_P4`K@=4P0"@ȳEL'hnkja-vVj`E&eBB՜|aiHDm/.V:2c0اKMZ{vu*tܛqS Ny@ G-p# G“Y,H)QYǖk]Ȧ{}=G_cWsc#ufE!b5ZiFb*("M|^An$RABBi.kxΥrIM&E ߌ'-]T j _*@iX{jAUy0rƻa:8MCOv{Bul:lx}=VQD{np JJl7\X;U+>U[$^H FњA|Jcc|ځ#݋[MxhwGYpgES P86@)Zyz4 b_$Z&7C@Y(IK>Sm>F6Cj-kХ"zuf{M(K 1 WmkKۘ;Ѧv`VH5 Y24DKLxN ~Usĺl9zl0LuIƨlB+w72V"`KJ~5& &_5F.z7T|$M#f˾ƒhwxFn oH>tNYvyqa`mjkĂ* cX@s7Q;[:s_o1q8{V[qBL#S.mF`ح\ 0!"ZOu\jxtKѨ'D"/[)vS}?][*<=x]~Mwry] rx:GVjPeo7;<[n naH%SυNp*faWeu+`9s9-KHk\0TOggSB#﹦0Xb**! !#($&{zx|zz'!&" '##z}u|M&%Odf{p%'8!054Mȣ(ۺXqgmhUE],MUWQw]ypϏ.\һ6m%IDՄ/ĞVF`Δh ʭMY7TSUe_lY31Hw*EگELl<=8b:'Ssي6؎,Oe/ 'w6<_XGǩ{V/lsc\UQUU &$ӇwQgQKXŏH[ү\E@HLq '# DL 046LB\FF=K2ցo^rΡE%f E$ @?QjPs&nx *Ѐ K6BHYt>^rt'P-Av.!a F4Q$"YLZ:ȨDeK +z/^tO@[! Vg@MR ۠1 HaKx 8@6s>ԧ5*bv@j@VJD1%DŽwvVv8yb1G-պ%MX6 uUO0 PnY7h'O5QT7.1)`&NZks'XtV`DWch㏽~Bg[h i]+ pwN,.2|vpQ PY,,h A.uq,&-hܭ#2>@]`Ziʱrt-M9`<JہfpО.tAn p +duz)ˍ WR=)X71m;ˈ?9UC<*YƮaJXKq:6^ŸPz_ƀvqEhuO-%kz 1ߥK40%n1H HR# $RK'DD+ wѬѴ jDLȎɽ^M | &w =We:.fOxWq.~ >B\d{A8RM$ ˧d}s?_W^-[p/v8Q$ ֤Cm-:BlfJPqRgn1:N}l~2eW3dlݏ1Ls'܅Uஊ;Pم.&EakL-E$%LPj# maM :bDm+P_ՓA4Pͭ*@4Lb^7C>q3rX}Ff2g`8gŽ_osX1hv**՘BJ*Ʉ;~zlvHY@esL=L01;= ZɹF#pd7eh»a;RV <]ouC@g55Ƞbn2'H%Ch[1eNkKfa8m5~t+0G8 `y%U^<.TD*y..6Flk.K!^ ϳ3VE:;]2[6? !8Q΀ 40@ {Q D;P]`1 -9asR?[o{t$7s;r82*z%p!ECRU֧mx CyTYc9ajҦ-c?YY8E*0`EdmCq))PF>wjc?3 K d26. 7[h@ }LP2hX./qLtoQMkx_)=l/]]]fZ7R &e- sGvv<z0I".N/KMWrx*e; W 5F9$G5#)q,L %yJ r>x"""  7 ӘɣSow=ӝv4Aȍ\Ht$*k wÍaXALKފ,MWO %& !< ^<=iiȶ0\ U-d\[i]<%^& "qPC]TdDc:>ư|艅+L̮y^ѨvQ#4"Ýf"~0D@!@IU>FF_qHM4L=6ǰ('EX0+^٬]ME6~Q=wXvuR8~=%l1V 'b-N/l#XgG?h|ÏSOE+ UcU*Gۦ0l߭ aBn@ta0DZ GkD)Ӛ"uD ;L+m b8Bq,[)8 ^j;va2 #>TXځ}듽`ʒ]!wb G !^7 DՄ;Դ#=8K(u(LS]=\S=yu[s=\kDUQ-1͵ق$vm#/2Nzu\]QPӢk\f] 8S)'{7vDzi nڗ4 1L#S]r;"x$@k%ZTOcB Iy:SG曱փFaخ\iX&v.UYaWH PAp'!el~v>G2 `EJDWR[f+ϱ6LcYjQ&bbPw@}I~}^{pPS; *~e4V\äX$kh ǹ>[0kۈhɝ`, IͱȮpdqJ=ۗlL\U$`qjw[M7e:6pisU\P^2,. @L~\v_\6gnTB<$"fscS{YZ, h1( 0N@3 't (ʅ]@'1ؽV k~L#ÒdM MrqL.SYmgr-edߕpahQ-lOVV#$ɓ,wY橧סf-tn @* p+ P &@;`l&($ֺ܎j?*P(w~KYg5u"ZK6BD?DXhp¼xi~x'sS+hQdC|t9Nef;$^v;U^hive1j^#~.50Pz"JODKv"1@Ӎvv Xe z@xSL0%Jwe( vV<[&0 DH 2(B@HX1$Uju}eͣe^ַXlnUFq_KZ[XbI ѕM$>;26C tcU ]+3鷒i`\01AhC0An$e 03H[|l^* JȂ5&U:8R1Tx ZC@aA \:F4։Cp5߫^(śn؅Z?3$5,x xvKpO@Isd ސD&| Lܛ#)(Ҁ-shxZ{atkV$6cH}F.H7FBR>+PSGa(ɴN{?^L!>ܞXx_tΡ (^֪A&m$AE?h:N]2dh ,JV\lrRKV98zM(Z>.Vd߭B ֢vTKH D)yGqxeQEE&<\J*ak9M<YOϒ\ڽз۷gȗzڠ.) inE]D@ahCxmG y|Qb8=޿cswm[R3j[ENQr 0MDQ\ ?8NjrcV n"lJ64Uã*9^Izi!tB6zUEЦS.A ;z J.Cy_w~{hEa0>SZm WWZZ]5jUHmi ,@XY+UzJ\ {^[]&F̸-c$kv. @ RD~Nw Ԍ 4clcpS x < .U5 4pIxa:RTFK. Sj|d-ؽAHR%x[W8CA$ҥ@"S.NMNZv h@㸸 G ym,@ ؂(ͫ+ >n0>K@%1WBgudu_*7untS <$J="rb!s6)~@$ #d]AlǠI"|І{sr*iV `@>KFPhY(1jjˏ E)Ӟ p ġP"%$4u2Q1t0N9pR(Ud7 El@!%f @*dE(y7H aDHHK@vUȈ:hc ! dDKO(W*H ڀ3MTFvůǞb+vK( X= np'FJb>MPAi-^,/V=݂kxŇ 5sX[qR4H 0 F#"9Ղ&lnW|9oxD]d [U= UzhWdE֦H CC">!%D xvKc'?Xƴ›uO)"!aH(.;q4|7+sՅ=nKT$$VGS)T_@T7#kљܺB$JB440o KЖ;VQ?(BQXk>/o"+<}B"B D9sRln]Z>,=YKGbs]_,npپ@ߞ@zbaCgb%)gTL0"H!YBD \hs őeFWu+6|s&_3]/33v]AR' 9Ӫ\x8 RT徵W9ƞް`#WC>TU/D'ۑ{\}P|ނL`mմЋF "DxS799\JH`]V/2]^x^ ے?%DW Zkȑ?:޷'n{2WL]SWF+XH2]GjTԢ:fS'Qmp#e L~ Yyfm_Ko7VDt O͒ΕoѢQ6t˳vjvy4= @.I spG$Np_Ds7X5x~h3R|J@b`dX lSqC'#n]6z*'Xvg~$"#;?XS[:na8OZ/;9x`Hac @=jdPAT76XH\p 1BOggS($﹦0Z vq|{uywqzw}& ^]{ꄓ:5e1d۬9 G$JRH w`~zl+͡E@r<4 &@@(B 5227U."<C7[7TLꡩB `_FSLDi~lI,Mip=Ur/\3з>,;4(n<@B hZE-\W5^<,B蠩}%aYSKi ,>]<'JD$rS1fO E)_q ]` ++H@˃CSK?Rmkֈ*S"ZH]^ @E`DkwnGOk޲arw+^ߔDKğhLfbٰhWOi>|Cy@—He3 x "-p`i{*5\bb F@!2k.\-3!J=Z7>1 (Hb0md`NF_ ˳P| r GX`~W"-NE0 ˖ 8r ]Fpkmm O٫ ߖ)"J@54#OFXP̡DLDHDWADVG1ҹx (U ,^,U4q}(`b5x A>|B#]aKdYXߺD!QLfӠM22rم>?{8AdhA-AG?`5%`Ց 9/uQQw%#P^(MGJ(z2DTӨ( ͱen,/7M 4[#> 6`$=OBH [څȓ %xBl;PSڍZgStfѲ@$$NdsEbp( #9a0^ߋifA NQ> Dw,քYzTarD~\jB`Il-UH}HvHDD!d01UF'3hF,>Fu23 *H2%X7ҁ H VP4 "qq#\-@نLKlSӺQ #R",U٥iYehDn&HVŊHPN (`"f "is#ׁRK4BX(l D߰c&5gbQk%1H<"%gBSxL>oW@1p'P@T>QF"LJ6PFc0RLS&~qZ(9ݖR<"Q+@6FTx@*XTP'U#,*Jb@HVqE2.t+F4]Uq*ȁV].Ȋ eJ!om2 ~vT@j(`p(|* ̢U>Rd4xu +1>ť`^F"l\nۓA&!)A9+s>G"BfӊKO5!6~ [v <1%#@\ c'vȂ\UA>gF!VY+ҀVD^ǖDu"]+cX=dm6,n3a>~ωmĻ(b\!W;n0\] BxT:XDvՐ~KG _TŐP)W(G(qܘea (˕SD@ƩnF@ nT$NL1nyqZ>t9ణ{-= @/ w_2{ *I"0T߰dp^:"GcQ,.H!^ErD4 4an6AҒR^8.%0%i N+Y2F Σ| Nc%u2*0`WlrܑWf3KJx> 1~b5#gîZJD 2^EmR/ih^vU]Lvq[ӑe1.[$cɦ)TPX4I&*6KwVhv{+gRSm %8룡6Ts'gr齻7:Z[RBy u0BY 1 ^6X' $]:ԣFqG:ѹ>߄VVPB%:[j1U ` "@"RO۠W!xT`ԨN&~ Cyvגo冗ugjhoLwޮגjDrH֊eeܘ. 5Q DA~N)R BbShHoHHˀY 3d*M2bb tʪ8^P. t0?OܠDЗ/> c'~hޡ̆Ҷ˷=VzQY6c)w F4Һ ;2JX4O@=N?H䜓]k\`lq:`yD -4E\D'ƀXlOV1*GsQ9ה748KSʴcEQ [zcU;zB/hsXwT*ںppnd #Le-ҫYbapa9L,i dDx 'Oԅh+/tOP'ŝ~ 1)#|;am?=Ÿudc- 2TFn X^{\eJ:; /NqzOM]G!u_WVCs:CڞW\WV5{( ^+&]VPh p͕bO \@L67+'oNM L5IAURUAn P`J$l bcS;õr|qAxYf;dYqTuDW+ֽePDbK2]NcV1aX7*KSfeTܾ:Q׏Ar9@O $$ @Y=! NECO(AnӃu_Q籧O.ҾlPZQu8v_  ⭰>ۥC1z-mפ'H?p\.00TJqIHC9 H;Qq> '8 /Q%VS68+_; V`h!@hj!ch(4GhbC"VnuitKl3B${"KNo.UH9y_1y@w1 vM5 ;s'/SG6]<[S-WD ~.O cg) 0AET ]V@p iHI[ ANu݌T0Z;nn*7—+6BvE8*@M; ȀA5 9 g 3,؈= zd0aah-PK`<ۀ X%` Pmx&=S(.^;f̽4_+P!%pBtMiRWiΖdwD4y &7x:S]wDMȒh B4E,ЅF `w$ȣ ."Mc i BK@ 2S;b7"HNG"/@|(i{ \P`DVWvщv̯9%$_pxݠ>*r+q8<]J1ժ7eO~ەq2.vN+zzX}57q:MdI.Q3=2F=:$ޞ4@?E}/@ Q#*5)2\7CP/+jW*q?i_)TwUl!~DUiDFٯ}tSF[fA#ӢJ``@';G<- ߐ Vw#p%@rKɢ:B)E68UԆ؎JJ\Z0 X"^~ 'aQC_m!T"bJPSn4nWIS2SrODDky; m`0v7{TIN툆xF"cm=85nW>y1etR)8BH-ˍ@ /  ~+2P/6 i `D봋VO4&K#y(f1(}bvbYLUi2k.+J'qoZW{o+5@wt+Fh(=q{>OnXN{ CF>c.5V~cXB~^ j b( fnyěJ&`cx_:/&ˢ6ѯ̌zT,+SP9 qYm0eVr e xQDSv L-uRjbRd eO*L{-+nnsV_E^+BܫelG fzAVzDw QFF~ . #/)ƉF2X#6j5eFִ=4cYIC%EZG# z;; 4u >*P 0m^pj҄K =[YuVn70-qXu>I0XQN%NQJa QFla:3۩Q.}t;wUZ9eH% * &y*Ry=츱^XD"p iBʦމxVel@xsY iTU雦9g E{ Q|$+&aLb}>Vz cdP X4,4Ҭt'-e uq'fH&P-"S1<'TwSK ^PIp֣QZ z70+u[n4r' CMtej~lNބpޫv96,S()!!M)J\zݶGcy}4t{E0e)H)n@0(,0QS 0!`B>AB=VpTLWلg"dro2yϢ| ƣXĆ20RA C") t`Z{!T6 c/&=nAUyTl)l  7\D  }xR#"QĤ&+?n4ҖPJ氡iLSf?ټMV=dR:1coG2 26 97^43P0V@`!W@ /<)0vRobdADC.+ҭ__r(&垨Fzh5 z05k]FDĵafYW:pa24n~evmءks[Hq`w81ޯi'<Zx7ok6"^x27q[JfEwʟ31>H (h1Z~ZWnMop>B8f1"H/#v5GjNMvi3XΒ,씐,v"Pf~V[J?"M.7TZKS R'/egXUfvK 'R8YE'.@M $VnP?|np׋r7QbL$j $rPZԁ\B^ZbLōե 6sd 0>m=JV9ְXZgP`K2u:},.*@:gۤN^S0_!<(njX%bs%RzU8$5&{[:q;#p o3_W)!к aR?=tNs "sddH<Ɋ]B-8(> @5Hkh:,?7NGwm&A(f痩1;)?[t:\k`@9xIuxX<H g1(~ ƾtw\gWJM\On'GO>0_aK2r"Y/JN%TX@[ƥZŀN걆R,le<I$ʄPf=m>Yf-+-7qt1]a=wa (¹01Ȝ+Zu$ܯ%Y(Ls:]%c=H!g4tf bg 4d鴷^4;ݪ?[! xbv d+anrlVmי}psGݰ+++KL`WiSJ~wZzˍe9a0y-.\OQRP] F{^`awwcmYULgjхBzEÓ! 4Fʯ;iBt9^], ̾7cxrs?URWz,|+]ө&H* cm겟R:?e,vkX]l4Z?o"'8CYӿ<=>:=֚lvq} N),!Vz1X+2tP%ZD*@@@s FmnwĪFbS{C jy+Ɏ(8gUC)K"e`kF_OggS$﹦0\[(,&%& ! #!')&""##!$$#niqqLx*6MX+ww3n{_3Y\$+DJR[x²o7淙`Txj,q` @s_u12톄Li4Z}^ $=@. k٪]n,L⚌EF>PG0*OB]# ą2l 2M 6z^3248?4/!cK3ճ&u9t3 r/]FtFtBr5@\f7حQDƒ4X$j"AHZE5`clnї9P4(Ѥ1<7RdtQgW7F"Κ7;@@ )Rhh׈a] .⩝I`5ڥ 7ފ?8 HB̆f(\NA X>U2 CjdMO&䲲HR4l3槜a= EK sbzQm2ar8q8Jo糈'H?Vp܂ l;cFW {w긪D#V?JXs9IoJ=O{|+g{Hv;t/c##c W{'v<. ZJB3XcwE {s[U.5Wb E] 1F".$K*&Od*f]|v@0!j9m}PP,K5IrVx0Ξwm8(K$Kʓfr͛L݃]՚B(,ω#>Mòr8OɉnrW&ڇ+DfzsYw*\nhbjS*џ<ט'{6^ɍ6wK$bJfTrz=qv6S^MڷӔDUKJ]9v`p4~ۑ󎇶#7N `8PfjO/+ʈ֏Ȉ|YQ1B%EMy ENٛ7[p)ή fx]m[U-苮yfh/xH|bE)*Hk8]czCH]-^4c2|nD`0+˴ʰZg-~% -L @ˠԫ#}{cmnas۳~N06 ANO%U_}i:PF͎K7-f.M XBM L;j89c|t{\cHW3;SS) .^ PD; huiVeQa 蒛ihCTM x6(X``ApR @ /P 2H&l䏈Xjb^`CC? bkT5G\8^m&H F.( ~ |HI k/WE|61(.1jl]`%q6C)&w GH&kܸaD'EmY?H-ɢè`6;C#RRCi :GżҢ( |BԱ묨R?V 1eguqZcW^}=tݶVb2є)u>ZgC3-m<=IT9S넃rf)xܰ,)J BeaM_2MJ)~تH{AK ?t>D)SC@0cl7WSCwwDl^4U@.eBߛ Q+\; ǘ$)7vUCS<,s@;wqiy+NnԪ* O !ܰ sZ,>Ua0fv3V꧁  DkΕj\zםYi44em),ٺen]R{ɒkl7Wn.oYYn1-^(@2"Og0HƧɥ#[Q=c>7o2vZbRd_Y LX /cfVOcy=T gKG4ZkS |s&\R23=vo͛WpM"|6cs;(#A5%5|XYiBe T䰯X2n]BE .qLΔմ.;<Vi_ Iد8 @<8j[ l_Vx}cX&(f7TYYն뚧ʆ]!ڷe[L.d]@YW5 <[_WJ)iU#XZcٲpjbX#A+NaI +r ҧ(clF^|1y.EWXHj-hʂ p#a,mMPpnl`i-V!1?NH`%H*+~l)FVsY*A€i4u G"J)bl:4tpK#F_Mv) 2`P@3T6 p $*"P};^Ms=y䲖dBf{e-,BȏHiʄQI.r@s 6^+6)`K><I$j!B q  +zė,vC0Hvs R(-(t)Zc%ʧ_ShO9  D>,H@dkPJ,F Ssq$X^-UbPta6nR@W@ &Ba9,ĸn{}G"9 #t 6> q*7JEv“.w#J"2OggSg%﹦0]ϲ#~~$""#!$'(#%^LֵtYk%yBMY vrӟP 1!B=3q' $hDj& 9NLd?e@h78b0>b5<(K~ޔJX,cjU2z)Q"y!{MCw _qCz[SbD] 'PUDDIʽd| | B}*+7+Ů9aam2m[F&0oO;:+?h ]X}H J\i'7Ipmxy=~== *## N@@dD- $ id*Rt}G.ZĺE8B.,% %1TU(h%N5(9P7uzLQMd{xWP[<-UgZPf!/DQAМv3}VgJ8tpB+7}F4T,O?gjx[P$ܷ =$ ,q@㓹 hno$ H!r;"k~t:WZJjL@\R1j *%պ`Zk !S얗),=~fBhk@VкP?"Edp;E5I5KTjpN)L ܔ^fOqt߈Ė6|➵Cl2L1nh(ώ#U"A%7.$1+#~&I"R |rٟޑ]6_2qфGq=&[CT' T8C/z,aȢgip`+K\aws@j+cx5nKkɋE뜹FͳK60wXW(W.^&A/4es:DdeI}u>aX?i+%#@E㠤H̗ U@a2eV7T82TIIOP%tbIUeVqX*"\Dv>-A0pإc.08X& BJNr#3Kf8gAǹvmN 4@@n9%w@ƇB-\՛J+^e/7$Q_$VIMcE1DK?*ތNe4@3]Ҹ(4r#7e3i,/l#TԻmt8lEQ|1&%Qli? U8mW|ܣtBd+SC' I4>!M]ҪzyxxYѳ뼄Tøތc#e$ӾIa b^93PTL]25ltc{SyhHg'N4 VWa x.ܯ9DhJK aL}LOd,ܝlfc/|qO" n>pWӮv(\%vH \/W@|Np ?ѣ]4<-/:7BD[v pJk2!J %Y(q 7ufٲ"SjY܌;xjvQ{1t(T^L. 7\Z*Bl@0j% a3\ytj鞙%SuIz[ZGz @R3hP]&((`@rcBc r h ;.B@ Tn,N!B є*Ld<-sL((Z6XN`ק{{O9;/6 Wpz+^Doa#HE4﹁Vps(nE`U,x6_Hz%2Kf: g(R6u%δcr- 7(ECEd <HZvUXY9J`4̬{ɺZJ6J19'u+(ӻn!=%%+ƢT A#m.YX2c .MŹ+1XYjtlQ@W3/Nj* j)N KԂZYcZ>%6LH<Ze7j.($&Ze:w~CA); E-!;|3b 6YbUv(~]PzP4E8$U1Y+hoʝLcEI|hVK5;v)@ - pi %R٧E>cW9}⧐ṌXn& /wsx%(.>뱩s_G e~G UqӖ#Z`GJz2WlY@6vJ۪I>wڲ[LDIG-u%\c'!}c~qmpT0VfK8b#,A.0@x~K7 ,%Wk2BQ^`S""#qڟ'A}5u¼Зآ#g d HH*tύ:b-7Kz6#^閒"g`N >+ؗ"B@kǐ ?  SLMQ&I ,3fD/$1/L~}~ewiMgCs6~7'"%cvӇsjNǚLW+QUQƝފ{L^Kuq0<X !&з&m4ۄ :FĄ6:DSs%<RAE<-jm%wIOQJ- @\xm"k#p%O lnh"wFLJ XeK1>~C@ۮ  Պ eãlZ<&;Li3 ry 6OG[6+IFN 7Y503:P%C\+@ %O1py-5$jVF$%S\!H{խ;.M PqqsNf %vJGL$NƖ>]>ޛn=ܬIku;0@EC@(5h;(*Ie^K )XDZ,4V+<#˲PA˭iܑ 3r.U@Mȑ}OȦ逋Ca!lBDc L 88ptekcpök>Y'Uȉ0jBQr60w&! EF]7ҵ ^N~ ~cu{2ӡy'$ KeÀfy]ec2,ٴp&2o8$ctR!bU]a u$#[c-4sΑc7IYC% @o{N)%u`RpN1AP0J&DB D`6~1ir}ڙc $hy/̶(EzGĸm\pXɰ>d9aU N|h5eV+B +Kxm0=ᕼ_޴e[^ ; ΂E7}X8olJ|&Jsw]B <`0O=Eb l@` 7@f(6P*)!@$۳XMˆq ԧ3"F7-P *&t>YѫcW2iZ.R,?fdJE(L>y/N#I IsphržT.VEt0xEP"N8 Vźԑ$Pa=bS "~Do 89ՏmHp{tâh.(z,<#/T H'h\AI&V1z^C:Knvm_ :Q]X'!D<ӘQ\}ϖ}3Rk_Wu<tOvT:tBQIғ:2̹W4gϞcPo= DGԴ,͂_._ 1(A ÛDՎ9v+^پ | A6&DDهkUl3{NsZec̗7T^mo &TCڒ;aTdzʷ_|\]#]WwxG〨NvWgߛN2OggS@F&﹦0_ R@,$$s|||#$% " ($!!!"#$#(&|rwte]9Ykr( S;N,vA0^S1dpG""AŁU2~}9oSKyoeQ*@le!?Bw\!tmrڥvg*)|q؏5>&]fAi6P%_]*%O%;t>NΗ1$F|w   b gLtý@@ $LAJrQ9f\qmīpQDb@>;f43Bp oByu&)GW\i+8FiL peiJ2gFئy 4r>y;8r/Yg2\2f~U@$(! u^hǽ Jax2IR 2:-5|ht*jȝ!뮘 ~Lf1H:rt:!-2"=F|OE}{(@ 0Ce7M밋>#@E[¦R5ݰEPjj]=]iK`4 FKh|fk!Ch=4R2 lPJ]SO˯ö4I/5OX[rG+UG@~%QAe#bP+FZw`dbGɲPI<`D bk,Y Vb[y)*ż0-uoͳu.^p|SJD%vIbVE6*˵8Ex^$]RmD588\z@'w>bPWn!+HJqL~=/ \\e4 eH^),ղuz<<l FѠy??k=.jckB'ҡ5W\?ev,skDY}uu{Xjz7:Km46R  EIMx.f)zT,1W Ju}kSg{ 8RΏߌ~ v})G H Aŏ 5v1< U#d Htѹ@0%>}H&78uw#3N#1HૻhXK뫗BE"R:kQG" !)e]PI+j1%Lᶋ/++^.+=-^L^0l!V>m- SC) [Zx'X)fsv:G3MYBnRA@r$[b( >6Y~ ^h'U5xsJ;8 e@ݦD PS8 KMٔ=%§(wSaXC(p88lK=wV*>Ihj?^We @ ]U0k>Vb `dz rJジkUk@"fG*jK.İ8h1'uoD`sC 6ha.l2O_g7G,_\0-2i]'$9,lu$)Ǝ3(@^2 +cX7ηaK>XL,>5B;`Ԗ \F]CҼ+&I;&;":E.mF.d }@/֥۟)ķXmK<N2pZO8H$)d*@jA{ZI8"(sx1ngΰj0*w.~K,r3X7ESpHb0= (S*.1 ԗ=LD k-%V ޗVC3@yц51/f@kZ5ơ '` @@uJu, e,~.>Fڿ+>%BpIh x.(ּz#Yi-Q86^┏CO I@!tZؑЮ>2bXlSR:?FΟPN-[_}9\`QSȭ Ҳzٱqɕɤ^e$C`6LS A'a |ˮuU) nXCwCxAۨ?r =^^چe2̣ˡp!jܱ{r٭u*+:<=VXҕ XԻ*VLdž6 c)64@L8gа_hޏh#?4~a0= %2\k<*D`n Y uku?+n=|xp,]{Z (i Jᓧ;|/IvE"-s0Z8x,YG) @JnC|HUP2E*h-wD\gC+Q, OggS&﹦0` $~"""$" &';ڬUbmi?\ΝI~|>(s\ H)6 ^{KE}<@[_ew h9g' %$KC  P  V} F()p$Pu/ ;F.~oBwHmY֍-v-%I6NTD)o?9{_ONcrz4PMC یcf@9ݴ@cn&JA*>R,*YVJiw pjNʱ n+u_(5UrD6FZn Ǻ:}vݨc R2:%:V*?U֕q fcp؎/xM50@5+2 gPi \aB!$EU"dC{F#B7ʜ@퉪;Ʊ 7+&)C|^cܑ+ɟ~JbQwla M i/ b.J_A | MėuEi;xYDL3QIA|PF&>,N   > 9J+L%O{.;}0qߖab|"s_! !QBMhS!~Р hn NoSq}ӡh73s1(սB|'*yG:N鼠ǎ1=Fua9Ե>,ҳr0kjP4$^$Äcђbi!_5hwP!6;h$)(^h-t A!?DUSinϝ I >Jɍ YnR2&.4=W7pCf)h&CD@.͢5ǩlfu2{{'Lh"nODc]Ip!A@}zBIq&co X7@gs'1z/Jo^Ɓh)y aiEZFHG!,et.W:NDyz KpS K`V9^\vuO~9uI,gúqn4a x%e$i< 2,n\NS<aYya@ĝ`KHD8ʝI;fo$.csiX4b߅ bdjЀa!hL+p~+?|߽U};ne&u1[ DDg ̉2"tv[PE2# %J n$<6Fd$Y2Nm B[(f#ߥrS5~qfп 41.Mq@Jm5p5`3D@$zpX )Bܬ @ $/TRsTp7o]~+fL&P+hg>)JZuaB  B0@arQNgeyx9a#m! `3 4Hq |$\9D VR_jv.ZxDD +ҥJ8h_$p "  0C 7aPFnڃ7!T֨ρq\Kȫ : W`@P0܀,$DihI`*.!YR~;fRDO`8hO#tAK\*F6`CAq$(P0 /bї;;XWLgՂZ<H{~h0_\.t3Hk3*O U` nXhvlDX9 1TPY'HsØQNv! Rț|Tɗtݡ]4p\u=2qWt(Bw.?vJG#=3y!ABn@H:(q=8enX)sqs)j¯+'tIK_ $i8|V=~B^L. "޹]駁BP9#nhWɠǏfc/xz1#ҝ7rcV.vY<Pݿkm C"$u/D-U|bn;ʕ}r06vC;t1<73=$f)Nn Ku4~B eb\څawLIK6g:~ojxrO6ls^Ś85yʟ^7W;79?*=RFA.7m4&t qZd]gݻFoeXCsZ)͆}9Lkhlq@"IP+}Dibf .<,Jo<"i&28q DU$fPD|j* S)O ?{-u.<cYʜXiGb7z`J4z95IDYk)X h}9IŞxJ&by8:^D˄xUO l8Hɻ Km5 N"0W Zɱ/YPqT0TnچM¬%^Q]*wZWYZAfG Ț?#lȭu2 DZh +"KƣXZwV [iXLvO& gI(C†ϋM- Ih",'h~K=/O[~p ^n (.|DFH3 "C8JIQ繠 G#!I1Aa#VJ;oEbWLS&І V6pAa?p-y`lх*vg$f }CTM &HCK":R+ + |n %&"F ROggS''﹦0a˳[,{~{"""!%!%&%z||~& #&#)&&e0 ?ZpƂ5Ӯt"ƶ;8dfh?1^̝:Q5_2'jt1 `R}2!_Q)" 3z6y')'ΌjfqRj% O!*PJETu2,^f(O!KQZɀ+Aʁpùfݓ \C)R|}|؜6U Wg)y̨p: dĴ(ԼOA\ 4 .x ȃx W ;N'QG3#9Z2"Bօi|0_exwn?/ 2hxDhy $8+\2yTSDl?Hr#LM@c"&adĆ?XY/ 0`h#l^m&Ȅ-੷4a.ҽEwyH]V@n8&ɓZ*FX;6N#^Brm-@" KgG W#܄Ah)&~XGW{l4YvwѪ4/ @rA|9 "lOq(b]n iVB Op4$, .Kv" ?K.qp/& ɀ%c6GMZZ;|`?1W6U)(@>g.&Zvl@xUj"[]7?.hª> TǨ0Vda|^Pp?N*Ȭ^L#^xxmX+lF @^e0VAPWoĉV/orsZqUY˪'4ޒSUKDBJjҗ.^ F2`[Y/abd#e:E|? mSNLJ?gLhl?Nx- ,/FMHJ*@+M@Tp,jc?@e3+/Ђ.Iq$b@? Tض^:.qI3A%YJrHZ$D F!jgЁ}c}q#~}jޓ4@;O'Zt3bIL1cf2/Xw 2p 1dP(w@(`|xu|#n²xx #!$'qчP)`}GDԡv;vS`29,r]o~'D͝ `W"""jXX^F=_O}|\>C -K|j`wI \GqFܛQ㏃68[d>Tܲ[4z1rKb@\CVRXDdf)r>x^jyphaěMʔDў41crLZ _5H4D,Mef=<w:lպ;6[ BX,LӸfs!`tu"ý׽d4b~@o[G4m]:jDOp:رmCUo< 7H  #\%>2L4 nɄ(Pn#XpaTTYtsW8[@x (09@u$wXu@TPMX,i>E EVq݈"  (nWkE~+6E<@7uD00Zݖq=-y _BŐs(ڊA.xA$ !UWk O"1ⓓTʊ} hs4#O@MsY+%bz8-$PG?_"r?u퓇a߮do_yҼGTԫM2-~P>z+` \ "66)bn$O:/DD Y<iApH5}{ VQTZ3_:[bF{@7\ADu= nl|C`SEM4ӂ`_<х}J~ʀ+ r|ֱ`37bMWݢV?;a,ZfqJcK"ڌmMhv˅ >" )-A9 d@\^~Yeg816IlWnR}}N~CU " 1q*a:%QJ#J7K]JU|.f@x=lv¨tX`H!$l_p8[4厛ۻ]c""@rMʊ@P-E@0PbSA.c.qYQ^2|HBh@VӐOggS'﹦0bWZҳaW׫kY4>[NHkUh՘JhDR\^ *gtJi HMu .Ma)3Nk%LgUT,%KbMv)JTH "u3$(VP` @ 7U.nQqsr9>|NN dp w{XfX(8_f/1koDt7O Up2@@a @r{`Ip*,`>$jA `t0hɀh8~LNt"P%tݝd4sziŢL.%3$g:n71l ]g Ӌ`/xlk ~ rpP8Bw)A &3$a%k+^aQ 5|c&̆(zsIN+Ɛa$ K GXj;社D%IkR@Vc`pP` tAQ,7#cp] ""e >K&O։ BX3ĵ+$0s#pLxnn B+C05 $.Pj0}\/9hv857v .KQ9#pmdX:EVD_įp2$ jY  n-uv8Lxq5S=6$mЋՖƲSZ"rX @ӴϏ,Wt Cvr%>5nZ8R*oL+ٕFa딦ьj7VbILㇻDE!\*E, ?R-G:@1sƩr W9=F䇉,tX|*[mV9AZZҴa;Xk5ot#)nQ "]#m}DsEI_TF>7_'u<ht.v8qNs7cћZsPk,,2z9ۅ:BxZzşC| La9R4 =j:VnYݗF;VH2/ I ^] @:M ))a!xc~^GhooMe~Zkt~K2m| ׈E+\ %Y A%X2|^`QjU9j&r<<݌Xte>$ڃXk!JD)Rc Nnn_Nj%#l_T"gұđ5zN2Fx-_cRá8H>CCQy=$RZ-j%5LUR^ *4E, _#3Q?iS nhޜ??Fk"u }( B@F/ǡ ,#z$*f%ubSy{!C 9Ms6N/j<`b -c:Rk5 j^`~h<$DSr˜\nf8=~|Bv3ѐ ıǤ,p8dH7HΈq@}-#Ƨ( naŕ5?&JB.[?a+1Uv*EO$XF ..~%2vC/ |0xfe ?DەA0gʗeBgۍ@z({8"Tm19n;OSap:n #{1o?wEU6\V\zE+}o XuCƓފ:z1v+F$L>?H8,k埞ߞV˫1t?0}R::iIXY7x!>m\8 FVU .3SҊ:D,}UrKePWސ`PRZ^(TEVYj: iwܝ;[g\ᰋ+qyTq =O}uoz+z497YR_!qP@%Ё}.fU`Z.95Zʻ@rpKf^:q0gNZ$(:;%숆cDKdz>\u]Y ;]w  ݯ>@:iE]@,6pg ;VA9]jFR\b05=XßӯujlVBAlJ 5&|&;)6[T~']>륾 ﴨO,=[ͻDw82پ}e94`FAB`JcU. 3BR P2}HxDRʯwJTK:`HׁGR%&.-:ثky JFSJXqdF'|.䰸uMz%/tukn2W΂&m0u]SlWc>D!D(DrVAP#T}씁HEiZI8l3~eo^3bI6,bu8g݋שF·Ås]A()5nhU%r(oA[v CygF77bS뢁QHK;3%aOggS(﹦0c ,& ""!&!((|}~|'#DO3pN3{ꉨIˑ H5DD9$]6Q\+w[)FS<EsFu&vx0K?K͞IZzBu7+,2[2מ$|!),ӂf|_Ck_rbe{䮛BܭZ7,Z?r@NsHͻ7yo~LthG=X,ye5dٞ}/L[Q`p#uvIzJs~=}JjEђ.dX;|`#D$e&Ef_= -,S"*Ŀrz}ꪬ( G#y_j#GdBͮgTjڀr%OI6C{Z,oYo838i^ + e "niŇNz]YDyM/<-FӘ-?vz#֜ ̪qt u<51ŸRFcnoߴt=5t+&# w]5Wj N5A. ռ~ ƒSp$PDPWihiUF :f;b\~y.JX@.#P Ik%P+VYc|H^VI1b zŒB!E*`>E _.$,<Q J]8XϮa&QAT@ tЉq1 ƐoЍ9K!jˡ$qQdb$i- Y!z H;'WB@]=NS"""55wK"N;5KԖP}hTct`L#~Cf{4LO3O4Ýd[#v=vF+)p͡1?VfńR :b, j>0WC䦃 IPYaEA(~S :a2:꧔h3 "ChZ'C5Z<^dZ1}g)zvݾu!& pO$4`杙_Ǐh,1V, LpR(e7TچLUA"[)hK\z9 2cD)s,p*?)HaLi9kh(^F\Wغh|"zc:Cm0C K{E$`"]v2( U%L ȼBUV@!b^ve4&Tw+MCfu]]5Oh7?wBtųofEt.yWUjBh y*V|%EDKPӪ3E),F&KreA DntŊ"FMgfbGa$ȡ^ BmE@sTl%)%{h!s;<vܯ*)!u @] @2D N vw ILC *n$2Lkޡ: C /6e(d5{0׊O㝷[v<<'޸0U.݆9@ = I a Bܰ J9}xK=u0JbhPN% ' qZԸVtqHbt!)jP&AA$1/7XFM3Hֵd.|e2A?p}7&HFu38@@ (OXD7oBXBXa J *,1C &FD!_vҕ"]2|ab)!vNB:t]RF C +ʼPEPDOH}®:APd0# eJ6=tPȈ҃ܯ|*C RqÄ1w;a*>vя@Ș̆z|m@'>:a Ā| 3 _*p3(+pC~6A-*Q^Eԃh/!2/nBm4e:"Ά#ذwze=}d8صD!XחDDwAQ8rG#{dkW!H`~;$ufӀ+ї8ᒒ-cOi *dkc'|֘+sW#ҍd|{zz^<l(7^vRXHSDrP#ֈ %cUXR~ 1^|("f/<8OKz idKjU"2Ĥog_x觮o8r:s*-Pȍ5nuU"-xY+#z~$W]l_o)Kk|ꅢ7ح\d($`4Q'lK=LH ޾%k[L+~]: |] Īſe(訒U#'7ɒ)eDݪ{܅ar[*co L mcD$HPSH9Vd_ IIӭme1{1_JO0%)OJ4`6{nJ4nK|һzܽ+t*nAhTM+'BuG >H{8w.:2+ WD t&п?HuK̮dre.LSeUtdn*EK~1O{͞LWezUМ(6s{=Pڬ,#[ZfX<ֈE4X ikX\+Åz{8 ![gddHN8ydQⱈᛷ-Y_,y}&@EreaA:0.MC@E, /:wځ`~[جPavRgoUHDf&0 `@ rlK# # 'V:xtUDCiF @@X\Y,5 +SXD*%&BD΄ [fTo¨:2ZܽVKL&ɤ %+JJ.6 `d(-z(+0%~%n(FjyYtkNH X0uc .ln/aJHn8*%7턓^XW1ƢWbw!}h:}PُNY4b:mHp & GGR7+"z熥V|2PnXG!VDOggSf(﹦0dt6'$$"!$!%&("  ##y### &&# "("(&$a+t!(b~s>\뛅%c;^5_rrN`a'go`Ոjߵ - $9Lp)55L'x-egߨݎeu?' 횯Q 8kps"be\.Vb4Xa4ׂk?1@a* 2°T4Oegxk[>D$RF%9w 3Sߓ@Uv$KZ3f~?W9gS T$⪛="yTGD֒ըfTvQ ߵ IoL-.$eݓ[SJS4UK7ӑ:M ytE.moJdLW"Ԧ1w'Rz$ ۩* GХ/ $k?Ix*dUAU#T`GMKa9f_d;B?U:+ΟW;1Y3d RyX6F{>n0DD.awĦCK}h4^ugN4|wr+Y0מ Dpy  qєi@8¢I;cکQÍqA")pQR~;&ŪHݎ,z! WZO2>äZpSWvCfW0H|@P QmT~P,5? WA.^3Zy$5"`QD;!q;f>%91:p#cc9GKbq(?aJl͘Wnt+ `@A(:v5"C5 Eɑ1F%HX$P!"^LTیKK a;-Dӳ)3'D.3_Hї&L/%mزHx* )C& #^ 16?7I`QHQnsdɸNp뭊EN5^nVbE~N~ LXiന*ӟHtY]X:8|aU]rf'Oi{ueR=K;4!P]B'CXLB][kIyI*($45C: I ^|6>MPCLhgj`p-'pD3uf "@4d4hyN42*m:j6(A[8H"R].& H7՛Dz>K=e@WpFE(iN^|<;W#fmz4bONQ\'RS ';dI9}geg6~CQ nwGD5HX(_ )nA)j/#! 9vKAƽ08,b$^LD# C0˜KuU("M)44atmd/3]0C /{kD~ɢ@InuH/b0(+jkI+AR `&uR,KhVR0%E%M%aێ_{.V6"Hb"2_nL>r,}ۇoo>m]_&m>@nAD} WX?b&܎ B<"H"Db50 bE-eղQۇ@L@n|>%JhfMܲr^%gzpsfR==pg<x#X8-A-P%GHn*IPO^[RCJ#&-#¹1nL&ORf2?6L`fbLs .s}Jk 91eL'3"s~fN΢ePA4=7ԄT~W&F8Pj@*.`*+:fh ׻Uյu7D5 > &d,&2Ӿ 쓂TU.ʯDDD"h>F1(O''1Ojdډv!LXBcԚ|^j$<á[J {8`ּa]f,Nڱ<:;;}#iR hoA[ȍ( &%?7 ņIb" h]"쨸TD;&O2w]IK6,,ʝ\II1#dT `XXoLIPW(C !T\*X(~'a ރFBRC)QR‰crhhǎk-F;"@pfђ 0P1ܷӛc.G0tK&i1\+qn0')r_RԥPz{W2,$cgJKSJg | l*JDD͆ΛFA[)z},.uTi޽]N A2W'ޡQƬrCʆ,w,jsd٨|:CgYw9T%M+rwT[0hi)!0?UɻlgV 1\s>&z5 ߝOxⰚ?.bE"vL֐!"r +_AX׮ĒD?w>rW*Z\p " Q !B$E: Ȫ~"$RTFnİ!ԀTD{a( "4tew]ǛRjQT1Qv}86rh9J PM1< t@kX6On(n j^i<lsn9/{/w|Uap˕ F ,OYʣ$EX8Ki+[hZ~,\\a!f3ӎS߲t \iXΜvതFT4nVc ە00(F[ `d/ `zlBi$ߙ99E˔WL(C͐ >Ƭb[[ֱZ2lKE]f[_1W~7zzw0~bT9x_! MQ=v%>YHaXu uxLx63YtOL!eڵ.CòWR}gfԆŵVD {w|f)eu2n5T{_c&F[,Ѵ!PpQhOggS(﹦0el .#%##"#+&%×"## $"$"!)ތS,$*=2>, >QTRdafΦ.LIϊK:v X,Y@)2u r QMbx_aYnX]Z徊ۏm5Fi~<{nO(+DEmH54n β^LN=?zq9ք a-QtJ%*Ա(RFΦjN6O;n㙋]MKB5୼@4#|BX$RLX17DiȊ}7 Ո9&q:&UcԱޤނppe٢L3V\P^|.S&VrD{|.sX>_2-a;@QI`0Mm$ҟq>?~1(DahG`D4K$0 CpS?Mz4fqxq~qаk!_N[_$Z,,R^bk|" Bu!ZHFYq5?YJ.-s:E!Yq+a_Hđ`T8uJu/n?{DF]aeVk8x c/ N65ۺ4W )EM`1/7,ך~LcC@@ާ년Cq9˳(&!3̕XdpqOsᵋa!F"  H%]}__g5Я!?: & -;+f}f,ez}RYiqxom&uV;]- ^lֵF߱ZP \ vXj١4 ??GRAEd'G-l5mz4VHz=ܓ&$?CIs}'ɾv^1#vpiROֶz^'.&/P.=\Uq!{v;o8ߊuD?: -`>?EB9kW=ǼU<sγ'E%Nv^ õavxYҰPbvu"?Α<[O]a &0_ 2ڠw"9BG DUB|dJsί.993IL[ bֆxNw栖I>*BLѶ.NX2!^" !+e5ќ!&/ǧj*i?w/Vi1ɸ^)9x}N͜jgȬ?ʼn$̞t̶Gw:{Mn7R Mbgx`8֙^n*LҙϚ:KrpK74lZo]>Q ͣCAbIAY V3Md d8QQk!3Ņ-o#fF;NU&`@b `#[ .MPHhg@(G+iܴ";yЌ0;Iuǯ2FA~l5]nXk$E }IUi)I}.HM0 24c0e4/N;O0j9{(S@Y.(/ES4P @ bK $ `S`Tk[eJK]͐hksȻ%E4Vf.{x7M.rd- F& )>E\uIKZ߈gӣXȯfY\AhK/kJK @ @9!+#$>n VaLUY7%+y1U~r0_<\Y^Y vSRNv]0.\Jg-Q"LWUjcjݘ^%QDUĦ$+[9iXZEQLS2*J?~[2Pvb*LSIXե xӱhX݅|2dbdY!bUXl _k$epF5tӣ7JXdcd6(MBԊ0N%'JA(X J nPpd)+OA1}$?MpVUCb}pM[Y-Y (E)] Lw *(HXIPIB} k6P! @m`;yHjA&PpWqS$:)U(`O+3# 7 Fx*- HU@{}H9X XafPVբH͂(2.HD%^LNwUCy*XHz. MLLS"J\ŧYalqF:"|vx\!p L; <>TtTaċ/>qD+{+7!p6KNmXC =YT 2_!2sJy቙L<׊H#QڦiR4 % Sl,C+:IV H{Oaih!.1_opsk4ܕ ſ E"^ UXDYd'S<Kٰ]ϴ'wq֢A\DUT_A) ƒַ=IsY7XmcD۸<AppK|7I}ُ鏏|4[y$҉7a%ys74d8n&mrp0r;}x/2ujd8߈jqES͙edmBȨb5b^|v>]Aą0kwaۈZQ=ADbNM)›uE&:VzOl:6hݕZ'1^Zٍѹ6Y԰9M!],nF@3KDwIQ<~5 #nVa b"^v JSF躓[u"s|lj/;>":(MSCXP`Qp {;w<@1B;/&R;{^P |װeUBU.iAR{g~h[>RЎKXZ-9^GP Ll-g!` N鴨?!?'_PUSw:Lv bj (/ VX|IMT q<*mQı8jǂUHL"IQxOggS@()﹦0f/!%!#"%$!!!'#("! ! )'&~{eڀSEW"FX6[mw'u[5$q,H*$-6 o"Pj#_έ:Py? 2u C#T瘍0)(pǚn_vжb4<Ǭo-q:ߜE'Kpx/޸rf^+fBKD.b6K!RB +b40 NzPvzV Cn˰po~z i:wqT  Hn,+"Ʊ#1MCAˇp7Ub fZb(nHܺ!v КZ04`)ý*Pt @mFݯ*(9W zh@SBt}Ŋk2 ,5B N>-D "ܽF6=t=-F+%AmpGM>7_ǥMUkZwvp7ltv}:e _Bb0>!b  4" :B{ * V8l\I $y{dcl,jd)6U )%zU(&iLq6C/V],A,V ~i;1@ɑS'*X%֧t*YD^f4"2z@!񢌡yPiJ x;D=yQ` 9H+uAk^l>bЀ{l%E:躠h-*Ut`!25i\5gT'؞tz|8}'hqYbi?D+\10+QIQPXj[P~\DBXE\srQ#ߴIA-5?aB%BN%,9T4"ߴ] +0q$ &KI?~0 _teЗS-mE}Ułx!G3HVk6m%Tlkƻ-/p;~E@O/7xN&JDT0d*$o.s( TD猐Z@K64 Uxϐj\"qLnBW/]W!VTwcY#8HA")~aTW w?[se-gde٠,C'6e1ʛGwar}dgAޕ&yvbw]L6.mE]Url0Xu7\^ӝ;@b\HۆR)a.)(qQxYbz--e*BY>XXdcU 6z 50R \aPĔ 0*u\c~$ QwI10r#j Da`X |-^|clrX)nD ]ux4QQilDvͻͅsDd)ʄao %@ `8ɼ6ژb7W*YdwFm@7,5Tsuk=QKR|k8@|}\ <Ӻ)(ZrrF%3,jb:zP,~6}jJn?U` FT &(3$ě{ա&H4"UR6Ԋ & \."kv 1^9H%jp"YʧvDDD!hRr< ϿʻX@~cum^Cc҂nx_X*Ca1aTv1#B1r|R ˢ7 Ot4S".<#@s|R.]yl~fPԥD[MW  2r!cf)G_zCr Zid"$SQ㊾\ܮBK!D4}vPk1$L}%"-%SF\_Ojʾfq`ÝiEN⽓4TelO\!{iԼSs'JfiL9='}5_*Yl4u4  @:Ng\6>I`J/wA58J#SK**$ y\_ݓEEB `5bLSH6@?^j';e5}_(_R8ՓV7CyR5HkI}uPnYe!b],~NdR%.1.A#8i Wӏb0tڢ!甎f5=bs4&+cerW@rIQRWi0`B#w_5/*L*iA[IaQ{>w.QZ[m5HIXհTެnc!VY=KG 7hJ*;hGI{n43͓EKz.NcUD@~2/óAtWhEmT)×}2^/(SD%cmyB!Z,EA/QQB.5/ZK d!P–\U&xti4"ܮ F摆62R J6 }IƸW=j Yّk`sxwI{A)J2]UjEn%ÕpTw] -pI"~I!%.\+Ә\-wݲC:d,βa8jhmu\%אjokNb\jPDҥY} ,  W@BOggS)﹦0g6U7 !$z!!#!"&&$)|!!$#{#%%uXXEn.H(+ iyt3DIo">`mIR}ˆx@ "D( N]Z"?֫L=F롚k0E =\ƫƝZ1)u*ӄ@uoi8G~+wD [1dqN Am!~Oh0\YnNLV2c'!kp@`B0(N'(bcġG>BTJfޔ$: 阐jILiu%|:&>а6̌bi:>1$et8;5kd侌b>𹾿?bR"V'q"!jNE H~% FqOZ XX&Ng8HβΦ;E lA4ɮ>\`oiht8tgKGްY{"tm +ئ72i2X 79Eր5o4GJ,GI(}dûKi"7b~%\X CഫD#)Iv6[\l[oa!A~fZ58LAԈdؾDZKaRFZbSڣgfvةM)ɦ_2ޅyh \fH_ƈjPV,;z@ⵒ N ~QsM&!ő&̦]j$+Gƀw ~蜹VA:'@hh`q $(V ܃YLkZvUL.nJ F!Q<%*pep-ֲ>KWKr` m,P _C ƨuY0@21]c좈Σl ?"ɽH3>`<vPZV@grfASA'E@, \:Ƃ]K Bu, IU qn{nE1,64`( 2tA_PBkn&qyJ1=#~"&d[T$o U^` pJ. /~g XDTWUUUӖy- `k{<@rWZ\iE4UL?Uu ~IdgZ,*@eo"D]b( 2 c~8=yY`(AXQYZ*UG| tݞ6PUPC⪍F}UV2tA >BP07ğ.t4iEIt^,~ËS_2_19Qp/cPժ[])RE ;+$VSnIԂ8 J Oko'<Η{,ne%C9f&~;{hAta9M*K-9/s_.]4$CUS'A+$M5*}pUYlG&b]ؽXi[!x%HyWoq @ltGQшh"GE٥Tkm'5pgݵS,څD)^:&A</!qKRA+џUAPƓ~W] m.4O guƠ!C MHz@)b e`W makdY=hQK4aR*Cc0nCAf&Έ!vX$ )diɨJDtaNU,OG_?&.1*C== j_m1hvG_@aq,_PMNfD0Ǻ6%\ we?ƃ%!/@<ѳa'ĭHi&KWyWuٳϐt,.O&~tZ||;awPW@@`DPQ6kD|(F1U(+y+U= Y^H|Z!.EM ,i. C{@ }y.SHK:{l>uqINqϩn>T_ P2դ!N|:]7=7V77Rf@A~ADNٵ.2XE XUG>^nKLVu DуD|NZс&4/3i _$Nᒱ]IhPŹn0kk"gD%b`!]"í *v15~,m$|> @ cu2IAeA]]rދ+ tm#Ue>lMux>&j Uk d.FUȊBP%0QHN@>%-[OH#{3_A^F!6l6,1uV$ Qo?27%ޮ+l ״*Y"':i%/i0i욭mTeSyk ;# ?iVOLgYBY+3U!J]x1>ҡr"F[_(R,SQ\-R 9Q{UO=j=$$ond$uNF&?Jwm{nrhg7VGx*?9آ76=n5F WȮxiN+ֻ1?]];˸?Vtni ^Ys|.>-j`si 炄Zƪ)h -Xf2Faz<uK9 Zroth6%qAp7X:xW7v:]Sm +n[!d7Fy *DVXEl"#q/ٜ_\(ϳӉhQ fhDTd̗IaZZvlWj0p٥ qpFy\b 1^-L DK>d G*!sMzJl D|<{Ŕ aiUjGeWe H?U 5ppwH*2#`Ii~lNLz@j9u&=!4`W꟦iIt2A? EĢ&Ã\Áe(6dSfQ+ZJPXQZʵ cIDI0 E2\)QDC,>\"^qOZ+J_4nrR UŌN|{:3%"Bחc2cP(-nWO Gev,ZAR?n;?2R$ ʈ@Ĩ*`r-=,SCI,N*eFZ@\uWؕXO)!QWܱq[KUF ` y+ȜnЦ w$j\=~yoTW^,{{P $#"`K *H %c x_Hs*+KNAG=6Ȉ! 6-V< ~S޸~sd B3ykwOBFܼ,1J2¥QBǽOggS@c*﹦0iFv2zx !"&w! !!(%$ ""#%''%v~\52K.JH()]TbJiF2ƢfK* H% 1ȯ{G<6l뗎&c48;:Ʋ*.۟-O(;b ˮYʡ< ޼hM^Ri G"٩]R,8:7n^,G]3}Ysk 6G3kpO Ɗ˷Gu)O$ٖЯ +ƃЛ]1 {DQh=_ఞ|4Elq\Iro22CsrrV3uzVkpA^zߖͧ1P+XӘJd{{wxefGQ{ PE.>AubT00"+K+*~Ѭo,e)7l _8$cqW$VH ұM{^si7b$fS`z>81 4aaDVfIB@XxUm'H\qQG0T67PV(Uå1'ac H0 V:Th:YE;k4>6 ).Y@F¤ǐ`I^teK=rp&V@# >Rݚ_ AIcT`@XH厀A>ۼ @u uc^M]҂@q] (J"JԂY: -= BEyVep/z$2< u@t*ET"aE 2 dri1T } >X1/)Нs *%lmpR?%ȗiy5ٞjn?~4A`Fg> ]U@,6%XVKOc JXAIV0 @H@'pdXDSL r<5KGr+H6ƨˈá]?NiKBuSNsmtfGwp]X,:?%wJ qC]db:鮖iZu& TU]#<@TivݗQݓFzU{".UP !"TCa(EB]|-25kLK?QgCO\.[!ɝZQ,'((0jDɎ@@ Z QI )zƍh+H(J2k=MvͬeQӊ>1Ms_H,rYE,?KDȘ/*V,H\m 5OYDIp 9ъvXDCu>!A2\JeA WT!d]vPzxoqlgVFbL"\T;ω'n:ێf3{ \e=Y}V7~X,_gkj7=ȭdg=YϼBn5_}DoӫvI1݄"`^î::toѿ}0bo* I:j꜔}Kqt|ED-tfӡ3,g#PMkc6Fn}~OUw>=%xQb,~KwX)0I10J7KknNqNc kӡ~O mvc1_]ܶ]?8oF$(f52F'V#ߎћl{hK:;L'C\5<$V2#1 *T$ތXoNZ"0ODDH3 s)YO6lݍ.MeSF犥J$1>y79H;F$22!V@`Zs5P<"b7 aB\N! ? ٵ>PxNGDDIF&9jYDk]Xzezma&b/l yXu7htC}]ʘeԊǀnO1" ]Z)ڃ*U~FYAR<l.|1uH ԛ|6=?ɜ$e˨ M>좠ScI_)bڕ EJf HC=˜3MW)^9Ciq?n殴%(k~皨Kq{yeehFUHhQHoC#~^R\LS4H]|7I](L]EKjH\[1f+ÃL[%"egڕpa 2oDT7] 1>*=:۹#xT_;"ȷ/y°WB#P*S61up&,Y*7W%trPϛҭhQ]T_շrl^ZTpBQȦtigŭL] QWhz=on|<:GZR D[GՓsz|y8 1*\+[L\Q!@M7esFܗq^Y(c"\QI^9 `PMT  &3rbZ <#;. g`#V#Fv]RFo w,8 .XS+Nǂ y?L""mkZqުR33t(ڥݠV ͍J1$cVV/S\Xk~A>D H *VL~!E/]߆oc,K%A9v&-⒓4%"4+YuvqyMQ/;3 twz:E bIǿaSݺΩ٠5$jh`GAkrB̬ua]\TS gݟ>\:"t+pMn)!ATW TUIC ~68ojJAn/LQ*2ƒ>ѳY4S y<.x0~Gv8AW4$Uuέ}@:o',4djhI4SGSLՕ(9TP7AwS%TYQU\s-#fWI@mbǕ?} TcbO֬-;'qE3e$)|l/23)LZgJ, ͑*4AШF]eNH?l8NQ&]U ;n5&^ع̑`iTI6 itIHB,F@*EWo~CҤK/Gͧq:7hπqR;cd8cy*}0uSYHn' 78 _ŗ:c BZ v5^LC 4Щi_Ü+kB!А""ZwKM2>m#\ג4K)c 7b+|+MF 5DO6 x]̡$nʤ% ?)G5VUЪIv*:1LUDSUoA{#5֒ ݔs\UeTB}xhww}`ckHx\JDS T%܇3^ qE0DQ U>1^$Zy;KciTW@橻VOB}{l/7Y dY}{T$ɘyÃC͒roR\[SLۻ׺TZ8hZ0{vHTa/37jcKXLH`UYx \e!ZV yxݎh$m /Ɓ}/']Z9[<!'DGULׇ1Ƅ teuI,t:cfFXnniU불]OOqK#]_Mpng^}{'e,f#EAo!'ds*y8H5[~rP$SAyzu`]`h(֭)\eVm,\OaD=-uq"{seپCI&|OeIφ~okg"aMM`E, ]kw'Z\E2X8#V~5Xcy!`WDŽVS6]=er.n,|^IH4Zv6&p}hKPf2 {%5 ^Wk5]" e**V@Zq7I^1% X@br:I4*ut:g}z|EalL[~^mWM5R]i+$ "ͺjfN:۵B ARG'aXMҥ/&KzfB0 JL8:2nӾWl,jc~z8[O;!C i ,)92!x=\~3cGqud z%l< WPW,h5RiM.bAP vVF E w,[ %hpj~*M#NAR*uiҴfߚ9pdFG*jqHA(@]7PK_ '+QDSD/KS:w0M> X.3Gd XnW_P>˥:RQuxXr\v,.&Iͽ8C"DDDa k_gO~J;qaڰ75?T^N$!U:έԺCN`eJXb~H#1mdTE2Ei@ DQ(*H3<\_ݴ:g0> 4YK?Qy{Jc**!Ԁ_DDij~}\{! +4O/Ց9޽0_٢S0v˜e$MU'OGz8; {]#-VL( QDV,iS6Qm<A£]MxSd?BD]⫮=qܖ S7Sߛ)nD_LC79*NƥXʩ&Bf͒: ÑQGfT@`w#_Z\s9}a|8Ԗ9mKҋL.i'v֕Q&%ɊO9!\'F)i6o'ӧC;{ d݃WOzJ V$ Y$E*Ir,7^XtSOggS@)+﹦0k1$$$%"&&&'|z{z~$ $&)$z{  $!>D7>@χ&iK%?Lh/Rճ͎3 C1|t@m@Rt+pi[} @'d0ocIቾOUFV%Xiwc=ɍhՕJ."^1q0 iJR1;Iki4M)q]HclhSv9$7e俓ޚ:6ٰ%i{  PeeFDMB@ $(+EYҔ pe,`Ze%L_:*PUFP+VKT#lf&FD##BeJJYʌ.ԁ UCdC;܌jՈE$ k;[}hC(}EI7u}JS #WE>X YK(~L.>I_* xn]!P,F\W榩Ls)k1TXggbc3oC:%M!J :f5X_l"2cJT7, OvDJ9*(3 P #7&XՌ]C5!+7E0(e\Q䜫g/BrEшQ|>lx5/"h ua\J{*GmBH8;5YfX3yg}/n~m.s(OmFIE=cuI5"rq*jVS'޳rP>SH7;e*LF|1I 8Y$tJ J+~q1&!Zkw/X٫g}mk) !#*OT^!a $mO, 45L! |I-V=1sA .eKV"}pX2 'g# c,@:JK)uoK~մ}Ц.>`&{P 8 7@AØk@A>IT{ o NF2H݇#-ځ9c1vAmV鷐b ƾ2@@OU0`J!$P!ܓ˓s#.bTJ'ĨЧ/M{4$8o%dؾ IM `8NP@#N1` `j$9rʢ\ȱ^] H%~J  U/ j_xm^>uA%O}- Ұ>,Oh~\iUxk* ,4)Q5re̝9q@z DoϨywT,bji@H6y1ԺbnL*s} =+/#´ND UAQR ?7cC _hAO}RPF2  } r>{+5PLWZt݆\T]̭=  /U]Iz7uL5%TeUQ0'M+D'_A++ų0nۥI2`HQ+eETTs`]s-?b\ĵ]46o<33񁌙c*oDCQ5AvL_K"fI# b-N1_ xu:;Nb)E,tn BIJvn).k[D fi( CP28S$+M'vz4JΟjl.6QCҢa Ŀ_U3rќg%; CPcOCiaXedw3&( %"B|Ԉ iTوM9mq)BĉN9! ˞[ynuScۧ#10P@5D[`2勼8[QsDD$n6-fhL .$uQ@tvD4D N!1xzBaiLMPUegD"r"O&,n 2Sܭ"#;#4W~\13;B]LSHz1j]IiNO0`2|ОB%K34҄H-AtRb$qX 7#u FR\tWҧHRPRRdͩvnK6萚{tH[#?S1A[rE)T[h7wa:]6 [DܞQƂ~A9B$)+}@"F9@bRy >E-0U%&0ZMtP,u 7$ʒq^#LUjSՔ3oS{]u[JƮnr,SUO4H|aī݉j "DY=C6Ãgo}Lx4ܲD1QS;^*бr!^=Rݽ\gє P^c97gճl_h6M]QFz'|i~0Qu~U;%Z6'0z͢tgRIL~XŪ{ Y8 ϯ"X*q0ĂTo K*0bp4"q(U zWA^|G88|g]mnCysA9NXy բʁX#ǞA7 9(~(6hP,P7xG@_C T!5 ,>$HUZ*[--@6u[AC1%.`A.@$d@ 'ac6˛?I4"U L)B.JD#X@(c}M!@&B0s  V[F]hk2 %By t Yڅj/*yIȩ!?QBY)2I83İ)@SQHdkbB~ &Пkŋ:+,Jk!:a)"LYS)~i!PN(BhQۂLS)&`I7V;jsykKDSLu)6j峕AIc0)I+LU UFaƫ?pXQ}uO)VDSL՟3ꪧ?hǚܤ233QaTU҈)&xU,R)٬_ R,cĤl]"ʄ &Y"j?^6(k爫ͼ tgUwfOٚ"i0xTKm5 :<ɱb- ccS_FYF!2. e~J'|4[M^kRYEmcXlH' |UMLϵ2',du! $ ,'jq:H^|:6 J$k5 g,H`!%;єh `::!ǤK2䙔:5@^:A A>"[(@ bxMYJ OggS@+﹦0l26   )&vw "! ! !$#$!#! '(%! !)&'^Lv,REƗ$xw 8W"D^Ռܴh(qZ"{pg}@t@e :h ,=~aYGQJzxsŭW'd  *M k vnHP' PF<ߧëVZDDD0Nd^<[p8?0UeD^ƭt&J|ם,]00  }Xp~XH)h8]"$C0g1%DO9o)ݡbv3M]8DO}@O39+B ,: DS⣩ ?z= īYyC<т5hWxHu_Ka,OBDzD\N (:g$I崃Le %Qi/'r"z7_2?\2OڎA̻X,iP lkU%RW.:U(Қ0*U\YcPCQE,\0D,P{e^"3ҋ-l4&I ^@.yI" ~U%A$ .JsÉ7 ָjy԰6 x 6žBM`n4uBԗnl%hT^Aа I cλ"-rV^E"Bn:HvӦӧS̒ef=QM)`f [uuM9{xWB,6e"牁& ڵiDsc%uK,WdO(} eEIx RXȘwXvsa' --7dA) A44,>E²0|̰e?W@ #<^ tC OMWK&[1DI/cDA@LtwuCH%Ǘ^"M~(о/8(Ñ @~!݁pNSXcXwF4N`:: .h &4{Tn +AMOIiŪ@DO!Z!7-G×\p^ϋj{{[k~DT{f(7@J'(jN:4[ !FHmpl% BÍP(ǜ'gB9R! LWUY젃sۖUB|2yÅ -<<=}~vFKcI1V-`ӺE*0MIGxܡþ6[PtncdK+`*@[KbJik6ٮPB*%i=gݾpׯ3wy^B_B;e$㪬R>uvR]{.B l%r/2,\E_ n0򑷔_ɠVG u >.*Zl >hh@HZGQimluERzIYF]Fؘ|n)ʊ8;ƥAa^R{SI*k'󽞥ɭ o4#d᤹^)S_?"8غ _+ pi,NüǛؐ@r"+ %ar ptW0fԒ#Z25yކjb؊k)o,妀8kVJh,-Ū+\Sê@NTd`vSc8W}6G*VyOF^\" uF_ۺ1:p MwR:G1]ݣZ~ֽ6Hb-UY(CEsz@W?єpը]GڂlN>4Ç!)#Apd W@`(R ?F{ӝku놲l oŧ%}H [Յ4JBTb>\vxI%ol|k#J4RH? e=՟&#X;Qgfڼ c@m1>jYB &Pg"vɥE0 Ti0AKaDmdW s/ڥiCHFCL0RJ.V ȝ~ڋ~tNĢ=%ID{Q{4@!q#X}b|]ܘx7H]TTaEKbPؑ[ald}P)րDQ)fr<M 2Rz. TS9z̺=x }U!)hXDE@kbd !k$OU&O5o=;WyIK%ˉOmƷ/^5pYw$M{?cm TxN3!.t!e;?>\cOw]`'RX5=v%?Tg8X^֬T6N[@~ %c:Lfcd%v'\^z4,RB`C~T[ac8_wZo鴕?m%M<IAl.̗btj^$钴9Vե\LHgnАfݴxæg!{Lu0s*ǹhq/OoxyBf0:F0@eEx OggS@+﹦0m'0}!"!!"*&)Ʌ!" # $&#$"$*$$Ɵ>E,4׮$%tp}H ,Fe|P+}rFlljLvcfBҰ ]Xlͺ66q/PG0'&{ CyEtAQe@Jċ00 #i#|.@]kBK$m$)N,H u[ 9.K3_x5ծΉW%G>XF%PR[At!n4;S5V+.?R$":15K/&D4EL>HG79ʍmùfGsŠ   d* 4fHs!67Y>K  vM$uERDSj.<KXo^"wlSRi`Fc0c |k{^;v,7Naq.&Ժ 7a  S*TZ2=e6m&γa{Ie,G TNvAlA@ b9P$^ =i y@iD%pq ,>KNn@"ג5@- uf&pUE /AB@O訒,ֻ*KV@K0l0a,.TNFa5mm (- p0,:^ͲEW _ǂGJd#~-17ia7P0))ڈDuxeBZJZπma1[-I  L9bh ?n9P]]P@C*b|%= nLSUTN0V=8YuDUUUݗO}4(NQ-DUUE]'coD"#<E|!$>3߀Adr(+%E"=eC ~fGF! $B|s~ 5@*N~o.ù^u gJ)3;Ou %R~JRܑ-JJ{F`c:q_/ 0'(@-xgV+nttԈ[96ʜ7Ƥmժ+}2aoT!@@UGu[* a:SĨY{-zFǂ}TV5.^0 `$3yZ>PĘH]]W3p6f"q6vML PLpAȔQ6Ԣfpq Ҳ:CAՁn_b\=GN=§l6$E\I몙K+]41.^{eҁ4` EF4*"5eO(Xa^Jn6(In^uSa%8*:_?=QN{ƚMa͠!-:}iղxoN._B{<Mw+s;ڶ;)%J:OggSO,﹦0nuz7}#!!"*&%#!$ " "#" #!"*%&!$"#% '(‰{^E҃l\E"d5lNSzK:8~$3]?زeD3% 5o`Հ6a ptZQ2Kak喯eB]&x]\m ^%6˂P# Eb~Œ$!0%cP0sglQF`aQßX<8xg"VP @)bb"(&xsz++hU)IV36 abHtAB\ڃ RSFxa!}G)a۟2ˋr﵆>x FJM?MN IJH-\ SN8.4 $z9X:7N (=JbCD k7?Uے[l o}婠# U$ KZk(2*͕߫В#6+dPj8Kڧy5?þ7EH*fxlKFǔ R"Dddx4nv:Y(wne۱&twt wkj!\u{.QoB-l8[a0ykLGhh |r",L 7u Fcr{¤ɳ򟦆Ѕcю# yv  T݂iᎊ>hXjk {FlT&w!v M%joϽ A\d#p(i,YMɔ 8ʿ\>C>L%Њh Zӏ%t~n()T8 bK0/OT@T}0`%sX;E`CYl[b, cl-\^jkZULUWp`!ٲnX]W w:m\WcDQV%UkJi!fMLJ(Z,\Y-LЎcגaoDImfUTYGЫ͂Ncg "!:)X\WQU!e^+VÛzuL[cVJHk<ϬHE 2,ҍ%U\c}ī,fVY8TJRgͺgӦ2[5Kj`'*Mbq'깛ʂ%(t>Vתۿ跷shnQطrL.*DV w[XXb$EsSw_? A/~[&qJdE2KmS!JK +Dp^&'LѲ2@h8eD4ܪ֓[va:(дv* z* JXDp*Fp`>,Ҁb+ƦYBaF[15 < =(zE2FM14 a*~<%nDtCMy.qH> هlmO t`n >a eO1RUݲ0F-FbjApT;<xF_\DBsqMlUI-s@e47=VHD"zz Ib@`DNJE.L֋AIZ(C~BR#]\.L$RJʚ>^B VCvfKG45+mc\P"",wb}`$KfA/kmp7"IK y̧H⻄{b{s #[傔KÂ嬯_u,o sǸ'XBI!$M˱"^BSpM}-BvuvΑd_W]_H;^!eh3LQY Le2kҽA"*ZMAl/oj:\01YHe/{!׶ZpX1K{i4h^Ri0-Lf$^ݘ痌yt1Ụu'")Z~fׁm~jSM d9r?ۘwY8ӿOp12O.ȝ{E"4>.SM,|ZSPxN++c"a@)Irӗ?{ljfM6˚ 0A`sLNghIN1&c1Yvu>a94 8$cAZIdJ! ׀ޜ6KG xiW*J(֕ĈrIvz.ånEt^<m`j D:-v4@ nI[!VC(:BKêiMBQG<~\hM {dw\*f z,,TiZS-=MS9%xlO#TS,0=ʰD^a $PQ` fA$kSwXQ$&rxRQ^l1-N~LS} #we`QR!86m] ,i6)cy$L%:$ѓe7x\eKYYJV7G*{7\uOlƽE,T 6R\lkQfVVTӄ'Ń %)l..nt8֟7k_~2vnW@'\Wi20^O6 'Mrme.*.x9~1ОSj$ZRk>^|6F:dRU\SJSw{,&~Hî:$QJJ2R&Xbͳ>:ܔLH.1#]nl] RT'Fkg ƘdNy]$G: Yk%9S~l6n4lmh <ġ)=3COD2/#:95hRT-#OWMD;Tw:Vr.(鎗M #xb SdA"Lq*6`vcIͱ vƩ-{oY)(f"lKзd7&h ǧNOi^֔hƣB$#S4 XcD<npw?mۿ,DE5F 7#RT bTe^O. q0šclW@5%PɃs,WP\SfuLհBB\LU (A[yۇߧ4ɓdH( TU)h2}S]d뜩1 DSeOTQsY\vԟS5NT !EIPDOMёgSe|w]$QDYeQV+!{t*Q~4H\_A$7M+Ak'i':utrJ |gWw?3F˹ ]pR󗷫:,5 aNLS%~QZJ}a?r~L>s[Y|*(fpN"M-B$jlU|. ID0,򷾽~ 88)kz ֧=9]Vkc^(WŹBR5VEOg~qD"zdkE 'Ɪr֏0gRQ@SpQD P9 }ىti~IRx+x|${t1 Cf-vE qQJVe5ǪXaH (*^֮X-] Aš煀DcB9HY= gHikz+-9^0RٮQ:*Z:&t`vD2zS`M:H%\v`j#@roKiz$9I$4|tX$YԢ[C_0FVW؂VNM>شso~c#{]7b`e]^+dD*KE4@&R  4 N+D"7KMM\$3},L8_vd!}iZRB vn_ix ʨXӾ΅g>h{\739檵[1T{* 1=UDTދ.!&hd> `EOcL>v*MxF4z46nи M1ߎǐ ѐ A(Һm@΍%@A]Yw9"J3}NwK%VRÊW c1.EPLrG491ғEKll\磈֣f&ƩÉX۶1_>7jy623;Lq2ʗ8nsX*f~8 qj a T.ZADֈ%ѵ7 gPLM̀+'"e64&3=>\>\ ' 9w=8u,i zD*fN[`O]LS @!v|$]M);8,&[gf_6%zcQeѝ9  Sه 4~l e#: jJH>}'-hucwazWãYc :n"8A^S:Ƹ IŊZ'OP'4˸%mz/:UeGDW+!9\JY4MÇ׺w\cuH SHM-Fc :֭i80:5BvY/HYKEy?8RqUhGGgcnnU'u$:̮tfƫWPa~I:γ[f6;^q)fDF01(jk îFr"6Tꝁ1 BЬ`Rׁi F)~6)܉ ,-])p紬x.`8fAXu#l^f_[3+?J F %J,iXAp ,*WA^\;. 0Ҍ3C "ywQ˕.Ie=pcl~ ,T`+w{1%DV R$ [ q Hg + {Y)rفlySatiZf!paE:D΢xֱ)-  3?萶ۛoITo2m/p'(chJ rePjJؕ'TV"^wOggS-﹦0pM/ ! $##$!% )#'®""  %#LU*ԫ2Y-ԄxKocKR~j**DSL*&#=SM㾌}FRDQL* aAM;ZwPDSU)Uk7!#LyR:pM|͌ "- @2IսF^LS2)Võ+GA0)|YRQLSUU[)A*CڸFäz~u~\g⯳l1V$K" |{/ώsg)tgav t@.B"0oQTz|vɱD4"}bYZ&2ELZ,NvG7MH% դrXmULgOռ٬ Et4Mcv sʊH垣W*#z"A!lH9EU#A]X NÇE)C܅*~6+Is:?QB0O5t)vC Fj7"5 +HJ,:}鈠s8+%^1Ƽ8~V=%_ŽI %`5`6.-5|.U``c*LD.5+Wt*_O/e1.UyM}{פ6oWkc*А#(OKA~\.Weҩ6 &˨torxbzF x?1?6mA{.Y|6#;7 +=h>jh;'6`/}mA!؅a~/U'F?_=\ddh,V6mB~|% c$ d|/";(G9b%׿oU6+t|;Ow+fBP_;|҈$6ae0=C0̮س .TP&t x(煐IvQ$KFldeFӐH 9UF(h~Im fWzgBHeh{a{cy !bg,6޵%sضˍ,U5,/@ڗ`+/ݡ]pJns&B {)zO .9?a`iPi2dyj,FFT̾܎.3.]NK=4Tى!7ۚNvsG*4{zqeV):^eM}$xԿ2vi^b r-8 ^l6wA!bsL_"ӡJcq҈ }ӣx嵅n/,sX|lخ`߄EM\N76*`)ρQ."u]>ύ<8wl7?Y_̚{tV w|5Y3ϩL)ɻ 9+]d9!"S<<[KNw(=' ZDtI `dVEU~_% ^m}+6ʜ~xt_~KN|nqx(GPhƽc8|kH!;v[("r(3p0|,yiҗ~DFff^x1{ N 3DBn'(:w?r{#G1 P6PZ =-o^ ~Ck 1ߔhHU"*qdkD,5XB%+ჾ$vŮM8Dth~?=ɚ6 ߈髧W^u[Ζٯl:i'^ W *n=-BZhPSijfۼ^ciط1Zs`7~ 6٫Qn6zc wޖ>V Z y8QW*nOngVa}tYanH1k|fRdgDOggSn-﹦0qxp5%#%$&!,&%~ ! ")'%à! ##!#%#%""#!'*%:3zy\۳N ^Š,Hy9E~Yqq{Ń&@[涗%(d[RvΦRk-;M'[uP1 u~KK3 " = Gw ྈH#GjTzVu뾊ϵA2[bWIloqxf(DפXi'w_, ]]KihXK$Y+.*_ր> o%, R9W,Rsϊ{`1lV!.\*4YY_ruSnM:HJqH4ςCY ]E|ȡBE! 4MewRKB\%lCNfp,R͂xe`([+"-%[Ef Ssރ6N3uWRf_}"T]Kד *[`V'eܪ:o\eK⳱^'h,\UuX\kÕ˾6ےzQ TseEl _F^byQYmyXhvq1;SJX%>H}=R_YF*5˸ jߥ-JY5zMgǣ1~eY=Uz~[Έ=B*/ 5`\>e1V;.Ũ~2i+5ќYz;4?sjX!a=Q1-Szb ٰk0,ZS?w-JG7h, ŕ>mGʎ m88'<ʪAe^l'lb/Ƙ煀EBJP@X2HՒeOVYoƍ5s@.)WooQ=U Í4%7Irq駌"M_[ǒDQAV`UQřp~ir`Q߸^?ccca"cO}]Ѻ%U啽|Hy/ V3}3{qn(oPz0~F1R{ ;*UkG9zyCp1 u E  H՞UWKNiE]a$)g tQpr?$S.AgxJ@F)oOY\Ս(;" ?,JN4 oϟ+_Q6#bNra,w̤ߝc/T7v&- ,5n .1$`#}L86ȟ1='2e˅'\'Qcm9{D3tb(Asrԡvjb'bU,JCh,壋OxơRo(v4F<\P+9jԒmEjceeyM[Fk4@ H)˶&Ǖ=6Z+1 5#êe6U!zJ" !iXdy6;rg~ fwLeөx)=Q3:On_ٷ+\jH??)`!t9:tF/h 7S w]4e+XĞtkrDgPS?4+mÇe%ODEG7.nusuyH':i=vQwִ)jpy2 E $3p(h']<Ktm:ƠRd \LwA(gH} CW* wv:քܚJYz0%LX%#0pU L;0W E4!jM0E՜^1;vכЃy5Y<8RkoUVzJ'4*8YtfckVJho,. {PP 9g'nV{MOJև:yk@{|m+Q*!˟~ϧavIFs,ˋ^ؗ,7cbhTFEf4h ~&Y\@Z5zّ4ѼHP5]BH=⨻5Vc A}IU6Term( 1ƒ裗LYIUV֖ehZ+Z7FmZw%0T[q6c4}M\^iv#PUi(n\Yq+kSL])$l{8ŐbDWՕbXШyy"FP<)KrC)lV2phpOa\JnwHSbT6$BӊKݷ`BrI +[^8&5Fo7Leu]›}'""B֋\R3_1Jħt[(P0|)1fY{LZ`(a+.aޯZ4$grgOM6[c6%"<͂fη@P:드+~⯎k,spw\.m]cn&"4O /TC,ЃRG*qpe~{RǪ d]kp̪Uzxp?/c2eFSuhTb*=;ؖ@f(5HI(cS8+EӐ@Ǵ8:8F@>VorVaTBrTk-ќ)e55HxFn9nKgIHŢAg?Qq=F 8 "X5Q|dԻ)~)Wy-]=}Nq iڇ#È*KcTBY5}H1OggS-﹦0rIg/ # #"#,)$! !$$"#$"$##''ތX)%ߋZsal@ųfrtkvz0 CF[=LI>s1\@d" ^~۟,P:4p`kJz )vuGu| c׿c )(ŠPE7opy>$wH0$a E`!;b^3vbuHіtlJָ<4BjhXr@K-Hd@ȏ*Gt0B4} @X#tH~ZB.\1Q)&\T()+&>.kyATPkNVL!*(s՚-?13t;9)ESx_?x:_%mC7P E$0n ?9ƞ: @x0М:concdŲKz{ʔQָ՝AL d2\o#Xb@[a.d դQH|zA!V# ʖ$>]\<"76dv%j?*r BZ\u +x'7=auVz<ܣֲo/C1, u).iQD7p%kR"un!4iu G(xN3yYJ|his>KlXȈtT1(/54GcdD+& (jus|ÍF(\ ȎA{X{bvz"f掷^N2'(D%U>Cr)BDHnPo&A b=~\֩C/RB-??E^]f,Αwzb@T9L,S}cfzVJkM}N {'Q5CxȚ7m5m5)*Q8+ k0֋H[5hԡ^԰<,Ɗ~Lv=ձ!(wL6hwM|͌2we,>WlGɜP#dy PҚ`#ng;ȁOhz=[ctqk1؜n YO=&X!TbQjuHE9X]AVuXvK82KN| ߳Jd(2N#Vӄ|`Wb};O=({fv6:ۯrj_C9&'\ŏ@7ST^6˩c  E&WbF@^uެcl, v>XNsg6rIQ(T,LY1̹"]px5{K~bqԺ1 #ܸ~q)^UcفƪewڐvSlP*S qQ 6^]^gaN[sou,$aqB$+~L4Qa~k0~Lz6?eTOCAV_)6҃IkaIZoo)% r@t >,a~ =2x읠,IG$s6 # DLD`ߓZ[y&98lߌDj.8&dȒF@ZkbBد(jΈ`cZ)<ᕻ[T,MEG}"[FT/!d?>2r z$d!!QLmMh+?k廆d"NYa=T1QiSe M @wEP0ȃ׌W6G&0L[«*[%]MueRc%wQTW+ifz^SՀbȋ(a^%dY-V?AaȈG DS?Sjb-ےJ5h^cDS?Suܧu 8&t)8j,Su jPTVbn * p~4"!dY!bjeQ&%F?AFQS|h25leAVMud٠J@i؛{}LJ4:fѱTDpL%4Ts@?Q*EYhZY 3qC|mb" #m]7PRFL 0 jPa+˛N1 .H- q>Z)o!@TԦaaAV,pb@.@B̎XP0}>]\$Pk;]N=6Ep~.0Xt!DDHDIlzٯZ"sajXlY\2'rE'l р^岍2ܿD:Vx?{٦R^+ JzDk-3=o Uj).vygHҜS:ӴֳM./yy|FzOx4t}U EWBPoB&fƬ:>v NPFndH*Lz$2Ү'M- bã4nx[yRbm[%b̈GX a=I>QUDYQVphж3Yz"K3m )ȯ LٞQVޖO^ ?)#RU-74DLjD[Ֆ=r bgDŽ6 K*׸5LWJNk˯}mO n\V̖ȸxKfڱd%9IdnZSMYVk"Zv:gTw׬B 5XĹU$Ja,5n2Aq5 NB@5z1HE*MkD" =#Htj2'cz>lC@$3B!TJs,7bm߆OQ$#<@ KXxcO]E܁OggS@0.﹦0s Zԉ.  % "" !#"}!!!#!&$&{.pJj2F@Y!8xtȫ scۇ…հ-PVa] ۶Y gzY:l2C7C:mOhTeZoczׁ}m!2Z_ :]Ȋ!ҽoE35^{KLp?ݪφI">d]#*HlN!#cc[Oco%w4nxr0}QØn6+$r4FЖT*!`Ei@>{.3TKRMT%Ch;+Hs-n]h@$ 4"D`>枮2dIbEX@^6894PP=Q|"mmbi#jk/P_kf@|o=-R_a` קUEF,gC2Ql` j h`Hͼ4ad{Ƒ06svu2{wۭN|n `@  @$yh x1_# t!#ʖDWuUS2QgY Z--PRPTWG$KUƒk@[eHJ\Y *hcG %[%k25LWSGUS-J<޹/6-B%TYUAQS@#27 A2 4YuT>WUT] nతjJl[!TuU('߱%,D~me< lc6ݚZi&rN]#V3Z.r\D`\aU% _"KEcaϓIU+4rшdS8wDsX/.dUhP_@@@PQ$H pV@ ;_x}=`N,ɷ~ 3fP.VYao$xd-u~|fmٷDXkMNX6NX#&fOXAK "&Z@KbcjB@W F v(9e!ch-4q{&q)~F`7#V3k dVt~Ѝ=vw/deV@ w&"Npkݒ:-  uIth>le{'GuX;M.Wr)UO{uq_^՗jkЅ|&UҺ!En„mrYQ.Ѿ`ySR4⻪ƛm1F_)BXQb)6~}ns~P_v i])Ui"$d$MF;i|pqYL8tܡٳ ѐK 3Odp)*qv JH{,aX:08o xn($U|<,1$-|6mDFK|s9"# %oz' ̓Ն13Z/F] GPJ`F#0П'rD(G FSҀi T)"- kfk6#@(FePcC)şDDdV;SއüwD6P9tpQ[CuE2A*\( .=S:nR톫`%1{Y$C"+& ,Yţ ;+T5TW=Uhju$xU^VI 02٦ ηL:OwT6?le'#[4GݢN_,Mz iD[3_2 ŇDՂQTh?xqBi4$Meީp>9~K5z SkT_+rj}T2B&݆tDaG}L؃@;$׈]8B;fǼ SEA#`~E!9؝'ʲ(TS蕍GLJO߱w;ƂgǖQdo~ ,9څ݉ |$J{3vG_c6ؘjT:PF Wn_\ɚ'}K({XfPNGɜW/bl6'vތvc,^07]m@ awr4}54RMgNiqiVaYHkl H;Oƌ ~2 j*8@p^ 5%5MSƾ\Uxde9vZcQ~z~B.~6@.?nQ,@hLeVhwsO|0XHեֻ۰2cЁ3F:`_*7uh*ePgm5 )dsoJYۧ5Bdk):Ec#/ eQ\*Mat^1VǛk#O皷8-.A9-Y:Zoɵ.4 .(WT\SGf)Vo w:TU_$ۦ`\!dwz5MDz@"U^YD'a_]8&tĀXePWNkj|r>VGZ! ~Q2'#!da ۰,uOggS@.﹦0tU1!!"$!"!## "$ "(%%yvz $!yzvi\Azé4GzIU=# 2x[u7ڗJޔRjU52(T3u5!%I376ZJ >;*1׎KaH`.؍"4Y &ɸapZ=6FO^vjOpsAK!@FPuB7 @%Z+0P]<K'$Ԩ'*dTEI+Z`-Jf@Pa4JF <4f|."f4a400_)t+x< _ 'X/Ztjt rs 0@s`iVG. 49Q)l/  (Q$!g!{%%pXBB;|0Ho)c*(z߽ȹܢ daÒxi:F֏ɶEͭjqt_b$zg: 0YqJ4`)EE@B@P t?Ba QTSq*:@88~j* e̹GMB.>"4UL6S:iÃ1R(YKki\UĪ8UGxpq2c<}ךj%_oL"TS*:s9)0~7?ĺDUUd*:]iuioG7H(LSӪJ"rzgݍ7pJm(X"DSL<”Zz`#6h\W|6.q(SWchGT_dU"yp˽\o}Ql:5\>$ͬ Q!su02 -Һiib2~GrdJI>=jvbkquX? 2h:^0 =N`f@H()*5T `w8>%~dnUZn~*A/@>/,(1XSb\hkq}yhhIgGE[HNeޑhYDnC^Tqq#ec[!V$Ea1Ap%U8FZ s>1F)N'"g\&'NGnli$V,X!  QӮ*68F%y M  `.dө2xf<َ s25rH?Fg#MT 9c J9k,#\bi.JIH*!c1A-Og^u'x_Eۣ$JJ|D(es01]L!g랎ny>=ؾK  ~м!(GĘJM8L c3\?/jY]@Bh|X$VAAB*D]T:{tgC@C*y2:K.NJ`#dǜTQ~-C&7_ִ+@JƴLW-i>5BDn@fM  T|…M1<ǝ0~{Ux7jLUIT= +ԭ:;™:c$QLUGr`zh>IB,KDQLD):ɓ\׫]=s[6S{UTWbTqzOZ]/_H1aD[K֩Wi {)5:|SLa WEu~M溳=>!wX#wmQĝn8gXҳ#0Ρ&>־ԏo-S@H$""@v\2ܓ[,,ΉYLg ]whDfFWjȄ9!u]D?©k]CC:ﲎq:҈f-)t;\j!YdBl bދf,i{@`{DDh&9;ao4z>~[$m҅FDZc M 4ʋ w`d>:11p][ fLLU(PCEM.S`"v'H |fi  Yc'<|cH pT@st9Fla(B#nJ@ NWr#nͿ<4?>|ʯ`8y=fRdcO´9]"9lfiDHLpzx^xNDKS٘6h:ݲdnNß.0 Z  I>RUkUXeH"RPHirB4,"OggS.﹦0uU!F5!" ""'%%|## !!&#&~ $%!" #"!mKXw,!; \B!DDo9ȵB4F]V7?8""c?DZ-;J_{,}9wUvG:q1\oc8Tj=ipK7II4RQ 7hS#ξ>/|]OPR C6c~Jϲ%,dvaRrfyP5$K颲P>uoJY1(`g*FDZ saE}pª^Ů$)S0gTdNN $rOjCo:̪ӡʝ00͍WB/7l;hhrYP]"2vcXYB%YrVֻIqXJA?dP$H>jj!4v C vS3'E[XBH~] /!Efp7ӕU_opV4cVLIfɪwM("!]n `P_+rnO7`HtT"uL"W1D4FjQ,b,.Rc%$n[,4O—hjMG?=4&N;(kG/u=9I31nJp%t);_2*EkDi NNhjo)JL;f-Yrw0a[KlLL,wiwCl{z ,TqUk4mۿKkC/ক߷f2m~TeN +1Uqs6{ל^C">/,:>b9ZETrݧǥb&na'PT;@Y3|5ߐ%a5^s-M"x'έg%!l(dZk1 d2Wva?- B*Trg)a{#N}zSK$ Y>.me&oZJDžvcs:16S~D >f\36&k7.NEa `DtCg*;(/?c+{@jY9ףS/kJcH)GW Ihs!DVOL1m2 r1Dz2 PWӸو dh Ӽdžz¬Ì)]өc}V;@a+^ҲɧxHHR m酕~9u{n 9^ 6BЃ  B.#1 I c^LNv1pi y?%O Tq{ aaaL3[fiKt'ha҇;fO NZއt2a7\&ǪNEbد$۲_X]H5]E\[fe< HonY UYV"DtѨo-ո,g6 6^]q>/wEyIXzn+C'P@!ǔ 0R5Z#ˋ q\"4StOU eP=?IN0bx$Ue꟫L1@xV6}9NLYYU(xd4_rTZ'J]RU<<e@_ϩ}*GNW,Qeړh0&+{]^SvzJX)ei4OI^[R;W=l >qR8,,մ5]&T&Z!VN܌o߾XTc UXp,Y(%SY[QvkLg Uقf8X#Y#qL:Mj)Gw]mͳr0Oc8Z`g#wl>8UO)D<{GrԜgQi!IC?v9*w7[AMuX> !TeB1 B-s܄N\=~v`{@TKGtA \CiedE4(NrD wWOo|q}KywaHCXM@@'Qa'uEPx #uzR܌d o?K09^\2% }YNBƈhOOwJә9I^F$-p_oQ:~\C-x  & =X] U"۠UH̶Ipb!E[f 8nz@`ẍN2&>b/(\Hd}o͕۝?M(T#u) 4!q@)B2V1A7!հ y[Q|yFOZ X DM9odž0e)DW4dDO#*#H d[ז fn*sӲ|^w~\el6;a v"L*x"Y0^|w|1ź0:J)dIii̼RnGL~X^MyN-!*8Pc=$N=#1bn)/G9 {<<bmWGnI*b(sZ҂p/!~\6T -q9Ts`6v>DDd[iLD,x0Sb]0CӂibKT #xr 02aQ~W±uߥM$9Rbtũ@+SV⦒B;o8F@xcV-o ЀQ`\D$D^HDCQ5Vv _URS+}hRԮ9;v{o @1sʱp/ 8jފ+ e( ':J(2J R.nQt/,K '畷z[c;IԞM%4[Jٖ݅-cpzm=HhrLx0䓵'E֍21b/?DL؝;A lWKu4SZTtP~:X[qu`}H$MGMQ=@|/cII0Bǟu-OggS@_/﹦0v`1%*%! &$#)%!! !!&)#pqy  #$$yz4Ց5U~p1O1UrfNmu,4[uăV% j<L{^F%TN8ۜVHj i/翓^KD[ kU9RY%G`@ G5Q47#"ca̕V_gmwchf[K˗͍H$̪rqg$TQ6W"bpMpM=*1!5Y) !҉ o"ܱը-av푩59eurOgü =c+va||L^5iTOpGzbQk) .Au!% z^,N$X6#CaSd&fƞzq{a6c 4ѹʇnG۵̓XJwfYsn&gApm=dZ)w5ke q6T>+\zHDCn^m9F xҦ#n eVBN敱#17=ʖi{G5` IPoJT?:t6Ocj[g. -+ I\.W^!Š#>;&R Z1uu #4< 89bcCwE0 ~¬$h=8\~=F_ M6 Va_.r i刬HJvxA?Gm؈4T㲢.+ >^!nEܻ f _E1 kҊ*\OYd%@HVӐGwP4@ v:M5; dG K>QM_r~x%xL I~i .K+(nWč1f vi@8|ZD4pQF/hkamcO,揲yV~65!nFmE ? XsE+cpKCcRh#=2&X4޿ˑ3='f}{'HA Wؗv|1U/ FtMA0ZDWMU4X5]ߖ?:ɴI/3fϸAdeQU9RFSʀU(#2a֌s5:lNР@@xR A `<(EQ|zhdnM⩙4[7vZMhE0ݼ\L\ڵ@TO mHUԹ]3!"J爌Iw=JOqX0\᷀.` Yq|Jfޜ. ^s6dcw]EUo0 QnI]HEF:O̩G&@S.8!# CB]ф*T}5SVC\7}fuW1ϝuafChp^W2/t%hg*Qlu)jes*uFvY hsêZ ͮed{(̍$23"iD_øB& N:O[c#%Mac^;rK ]RR[.%$|bdKLEPHu4Bdk^PBxfZڅB(x9D-bQ8&sxu4wi'7Z}.jUOǠ>jzLpձ !B 2 }H7As겕j@I$UHk | ]}9"]YJ1"V~kĢ S^u=}OhߺDU jG>m]*m$94uzRiB(*2Rsy*":fGY|r;6}F{w%ls{74/7[QVBHtN5 +iWjSJSLl9gVl0IHK&&mchXZ ܜI3;`ah^~(5ZzbҶ*Y,#]]4Q4\V`h(,XC'5cH1@bAAH"2cpQEPAOggS/﹦0w6ty{!"" $ %%!! !&"w~  !%&%!!!!%#Ƥ>ڇR6ü4ӱ]WvQU"DS1B b)` S F@PBd\%@ XW;?W/'S,?(DU*BUIh%*.6U:D /`D:-0NJs  3Qcˣ1\_nrwE@CR% E6@ Cr*xh帱"^yĊQ$!,,[$MT p EU%D#QQ妗oH;'33l8-E 0a]j ws~Uj52Ǭkd-'P9Qd\_M1\v(DЀ7LvI |>`UO" @RfVP2ct=y>A `ȭ@4p)(pDaֿz,Oad!lV!$c(*VA_`bK־2xe6 Ȍ@,#B$F~5EJir!8]?ޒ旋t2E4~DVB5Dʊt!Ժ2%ccM7+n#)uRCq˸^TWt%ife <87L_3w6EWkHDل#Oi3GyqXt5 o VKڼ%!,;׵_F贊U `=M`7Q"&BԐu}^a]]'!BwwZbPPhw$h9*@vQ$`g _&LE R\WcCjɖЌb̌%QUTWU௫7Z{tAdC smJTW*ad+QiTk{ 5 f7_F'õۋطTzT2M$ QXq;y^~&/_nPũ@_ Q1my +^7 Vmpq`YZ`y&!tBu눻HLb \QTnz&+o\o-Q1򡤐2DWUe*uZ_DExLg}S=$;b)FQLWG՞Z.̥.L0b$zzԧ1Ȏ"ŸM8P1+]JwC޸Fl=c] OAvQ7& O`^}\j3@5fȦA_+膯o}z+ZFmAc%^3*iAa_JTcL "i13B5q-ɘo_(D[f!N;F%N!\ !2a@ ^Co2`&`.H0M k.(`.괢*q5/f#FSl:e!V2$SvX J*$ ÔkC>I%ЋΩճS&7¬\0n@V3}ʅ {YwH+-)ґm5@q)& Hh:_^ƅyH򏕟XL.@j`Ipqn$HJʏ?EGJ<̞뽎x;mhXXӏiIetU@08j?bHРu{%R(F{H@$8-kcSF^Ώğ?.@8;gP8[_yRtN״5z8F k$7NF4me5OIncdk/uJ_8+ۿMS@ܞOSqxSu:^+CGJVˮm[ta RS5Soҹ(g/*vM-RQ.kϘ5NP)+i /18EIrG|rK'L*qکm{=40cm{>V=H6A"Bήy04>녦VZ+t:Y-+sFUtRZv_NEXd.bX$ jJ~ dc3̭( = CiLt Hh #@~ p_tP3lhЯBð?X^dt %eLIt^sWDG}~UE,ϣ&4K?v^eJ_&ip^)z-LQMXLeKU|.Q+缎B4Qh1q7?~] va0γQ45eXYKUZQbYD߈-_K+ B(^V'iݛ(` 쓉HEu#(`Z 0bZ>q ީNc" i|Nw @Jǔ6Pw J#rIC"ۢ{&I8&)>`؄8Xogiy&ת% Դv{&u&2zAI5WmxKYJy%]/t"j+8{Xߧz/{0Z[ò/IC gI1aטx\,o/ur,(n  D[zeRۆ8;VHe\[֦ |?XY RԪU¹|$TYJUp$&J@_~C5/ՓؠL[{z, XsԮa/S\Q̄\لWVi땶@|k\Wq D(wvtţI,a Lۉlg)o?qϞlc1U$n\=x0%]Mc6Yv[J)v?\ah1 Yu<ݕ|{:;O::NIf"~L˹n Txk4wȃlCy>^TaGkDu-QmKCP˘"D`1ǐ5rձ-(e7 (\@A!p,6G1>;V])|c^ֆzqe? w j'rK/$ k? w y R  %(AIl';TjpgE*"Eу]U >K&Em$OJZ2)ƕPR]sJ}": :A>nx V@= 7@I@HF aQh"3rhEYw2|XJKE" &ܸƖ }Cd$@L]5,M 73 ꏒoE'BX~pHWCuf BrܐD؇( NQQ",JnE8Ju>6su$iOk.6RH8jЖre.I,͂6ꚹzv+xΓfl +2*@) K–elsK^fϥ4 ·]ʒ_)(MQjñ35u%1;g8;9N@@ېoDiswPSV9@Hq]G{Nt?aLoX6O+b8=f}]ǯB.;#ֺK7nWitCEje!jptޜp56XAN+$4|͟yӳN%ir 4V(Deviin0ަyj"MBȡLQ1jsbk&qV}:QKsy[5>5ɹkg1IX%ͳ^\40 E1A>/ +aK)EJ-磛ƆAhqNL\Ŷe']~ID,,57$Q\nup,@p]ru&6|. B[}IYy짎us0+6J0זP4yPN?F.@.ֽ]~\5(w\6 Y P9R1TiidF/r#"g}]>&(\ 򷸝HpDT"͙۾&m&TE@/P(4|R[ƥw@/w b^C|~Q̄2 JRO)^iXg a>XxJi-Qp,]TZN%YÈp qT#҈ "$>!."Z#XdWt9ocƋ6* >J^c&"DOZƔW/[ו>;B:\32,Oei + U'_B$!Fh4rO W`\kgl,rRs~gڊF7$'hNr$vL,Lӥn1~4Ii{PHgpoP9 Hk"Z(|4`+*{wP@4Bl>vod#hU%al95b}~p`b'J36rKh,J_ķ׈pD7*$F9D"΀e;1H` ["ROggS0﹦0y3!&$ "  &$~ %$$ KfF_*|oPEBL,f>`["9L$!3yhin6Z&Qayl2Zyߚ7Ò$|@sg@ f +JPMrf2AN{@L ˨E`v5"*SDUUAU1L4'mv$TK֠\S҈(Yb ^rZ7"-LSLUU=It0-}6aWXDLWUdSr҃kE&&D_g[ AJ N+wlYѬ`Œe^i"$ۙ ɸ+8er}},qE!B7]N8حgpD,Am6MS7Ċk7^1 u&|P9A`DK"` eBΡ$IviN\Yl~iF>_Ui]hD13`uؗ]/쥏IGP'of͆S e6`a(Z&L kh_"f)$=J,YưrQZRcCVLLb>sŢFx8`;?IDISN)"FKm7b1rD]ɇYS-4xfN=n~5q{4;>WaX7r}<4}p8 \pK|"b]#~6@?S'B9z0p4PF8g/#bl¬t@B **H B{ EUJnsg:{Jޡ,v*Q!\p~%AMarug le](fe:[QlJ+Y0{uiCd3d <2٢jHfsZE&l.5 NrsL䊅UX B$*%B~Gضh KJRh &RJ%G-Ƅqb8IyY֑ii#&ѵ:a`j1T h`m+Tp*'#X>G$ UmW<,E&!DB@/P*4ٴ L*0FJR0_IFaVvÌrhEK84@ B)BtguEGeGwunJ2 Ty"ƊP/R& 5 j^+VMz{;u|Ls2짔FԸ @WI^HS,oB ?ת`O>' <3Y qJ 2_<tw P  Q@@xrQQ^[D<?[d!WJ[e],'aH"ɚR S:WS )wxxR@|0Y$ h`Yƀ(v|#.,0JVX΂LZ-c-I,"u1aM@Zb[DBXȀԈ(!!k%c0' +f#UzpOAJS TJN vO#-huAǭQ?$n2.* r(x]DUGNUU*{ Z{n:T5" ΏZIR.vK} deUu`Lh^G84)š L2{547]a[+1G.΋H ÌaiVW'|s@,G17weEbVrV Ԇj46 ǔ Ʒ xgEBL̘ b&uQ7 |vt 6pѱ B<]+Y?M)!UhXIrBÓFhLFfh j)Yi tJPaaKNԊZB=AI>ܶX+.*(k|Rv,ڠE$~XR6s#9'}.#99i#5UN~4A+`5HeDh &&c`28UWCW0BY_WnHTFIRҷ,, vkɝTC/EnS] L@|ֹ;;@0HOx\E <`jPUXrY^- hF@ESLzAh<ۡBD+]U! Rb!b1=>G@ eA74dgQܻN68zU20J2ݞ|gNvETƽq?{_wY|3l6) w콧!:Pf \?E2Wl;q?#QbhYFxͨڰ\6^l2N3 Ռk+,#Y5Z$BPM7_N^'puzn|ux엳CE #"mQ!'0Я^CV:wXKkmlrM!.+ތNs6Ķ@ fok%iK&J$'7+m|u0oz61_fʝ}fuAq|WXYY?pxY mJ1_޽ʴh[pۅIUX{ 3GX9PE8m+@rc/@wZ+(e`ig9+'JHټADnV+:dyNzrYd :xTHd0Cსq4{۳Q]!Pb!'P bV8ʎm^/EA"|ҷk}d# sPf5v0_ #E qdpyٗ>gΉf&MG}17rUf+dbHFrQgWȎQYPuK|ԁђpۥ%ITֺn DSq'JC]F/Z +t4[ş, }~үUzT9;\%]_ѶOV.Y4zγe?p4y=v\GDRB TkZҽrcԨ=>oÁqޞ8"~sFBQ: E7\*!K+t.ob#{NG ߄tWvԨ1HH\uF3S5ǭu<ʉ2m/#(f7$j bHkv D0X-0@*"R5\p\b~<'l엘\*^tKwܗt.Hov#\0(t*$rP6ɗp4\mmjYhy0 $تXS;8.(HH BxA$ -ތ6>ѠqkFmVsh^\ ?0$ЌR$JQMj4[ 2 ҩFV$):'tؑTq}A@ (3 " g%E@K ? )¢ |.^^lÁk>;o)%# -F)(P0RHd0UA*fTI"IEqo{:'MU0H0 IEi+, '*%ޏ%+I+Y]G.:;|N(i$Be4 0=ۼqqjGZ@eнsvsz`%T,7YT҂6($*8e`Dj@~\R9 _n'e>`!EPΔSENF"z0݅cPcjs Т̀fX@)׸coXeAښZMI>lv(jh%o &>q?RT^o(,HG*o,$ fd۔_|jMk ΑuAM_+7EJrrXT4 &WJ ^5vڱy8*Daӣ/ZI wNb?piQQ]Eڡ~A@ A,Љ? "u @]cyL{,'i`}0Z ,;kU[2uAYf 5xS3[A9ᢦq13樄=c=V V cZY9\j ,m>[BoMd^J 5d@  22"k͑' wΥ:u7 /p{Xp(п@L]~D*h)F`g KFoUh.O6LEFX"Z/B .0  `$MfF"g|QF%=|ErN9@`PPP%<@Q@cEAKBxt;Ɣt F1{mb 솭Klknc7h F)PbMjv]G?߉\ 7p:緶o: Naq 8EPmIalKX 3\@?ADЕD_(*8.ALU )d^ ͧ%OU"PDUL92xajJպR#V #)lN]V\cKX+ZXZA]-Fef^ct-zRS;x%K,AF#VP2LddE1b݆;=4RyW w{xK> ӣ6*qFy˃N:;oۓ`:.tۨ!@n1P.L6)`VvW8á³)RẪ 64G!汭Eccӌ4dRtVc60eu) 8 K,[!]Vz㑨pj5 B};~. |i?h@JbP~rgv,0uh}= 3 # sP?y #<"B(L4*jT"P% nE*Q^E8`Bbz ]Wz0{aP! *!^&͍d;Kiݭצa@1#%6x5mRJ(Z]0 vBu iiU ۵yӧjw[G?p+y,~%LZ ̻[A%@}$ N 32Y46;Q5b%5ΫX&6!R';@|7^" Ƙ;9H_g'簺ՑJx%+ ,1DRX\ޛoׄNo昤ဧ=n٧ZslĎ~e?1mYBaj}7Yw+.A"P!6aN +R#,AR/`bXP> %RoPwE ͇Ü l t%cFwv`.i24q^8TnpgV s@q*S V^f I 6 1qOggS@`1﹦0{ +=p!#!!")%$œ$ $! &&${!""!"%$% " &#!! ('$1f R)QrȟD)4̺-};?>m >о˖RN Y$uPDytˆ>ŀnFD0bv%}/ 1ީ6F# "R'/rm4@s^GWӺwdI<{@]42Yf~B=tTnH;hҔ7wpܙ~}A[Gv5Dm_y감#Bj iDb m_ K+K,Yf b< 4XR1E ,RlzǛs ~ӓU˭ε*4b%irM^,Q /垥(24KC,՝a9trC9E$R<b^?B[ErU,MV~۾w"H6`x|:L[{)+lKNb&-567n>3E4_G=>La~A>W*CjiJjfAU!j) D-Ry\E-;kdHQkK!HHεnkd7K6mЍ][g}V㘒 FXPLNT `Aՠ2FX'~o>qj QFJԦLo+1[&QyABJ>Ʀ a NSψ|H^0c0qT0.^Q ΒV _;x". 4 @J05-n &֕sFXrB-OFxhH7xѐ$tiδX VIKwƢFL Zo8b)fSzN@)|)%;~Md plpil$?߈K?X>ixm!KDi$>:*P! i6&~l3)]XkTk3|yCb "U;VNZV8$[UWbK{>nӀ=ւϽ Rڿ"+a20ǭ DQl4rϹ'_ChSM, xT9$MD(B,$3%#$R-(XrĚ,d2 9}8 Il["W%T}e\ aȋLWWV|MONiRj_7_A\Uqhv̫J edSc-1lY"* sƒ P~C}Un*qa$PD[UQ>E;Nu["2´ HlWbQUUQڕ˖I{g1%T[V`T֗ڛe}\#2NG/ULcdS$l`0F.;M?I(1^-⺴%uk x#sҀAXO*Ohә5b X9DVeexs,:;yJt 6U|lM_靫:3c23?&~Ni8|}8:Ӻy.觱(ś>!!o# tA UDu %.TdphEXh<1݌NX7wRA _)@$Kڏd1=k2ji <ς2f]x tg˄F]&}{%Q{ KU'?%eM7k[{#2( ,%e)q{cxx-V_[b+mA I^4gL|b܃O fŞ]50$,͚Sf/]#*hG tr4G\__c՗DIbvgOr^X0PX7_2^ucąޜ62Ӿ!"hf:}Ԏ,D8~4XjD{|2֍WeVH*pi 84(vq^MIQ~ *N4j7ͭK;K 6G奖hbx I?PbYdœ.S"$^G@9F%J?&nt>MV̦{2np#.nhBڄ N`eO04QUA*)D""U `۠jcr7phFn"ZQ {K{S糽pǶ^֡HHD),KȖގ?]o/鍉GaKkuwSHg1m˄^e@zF Vn1_Jig(_d E9<#1D?H7i  L]U̝@i }OyBLWe omG-^X譮=i8KLUgJSr#* ɤq%]ݠ(T_}CYXcAHiNq BL[BVv]vCZ:1ET[}VΜ4ӞU E\a! $ݖeq$-?+kTX,[L8 F"1t{0%(QN\g+-C$Pk*5HV+-u%kѥ餫3C0Jm_w4D>@gA!hh5.h`yUܬ&Vl%B2U 9J G|=uۄ P@B_9*O"js:4$~SyDEm騯2:qea,7J jRhH p; A`$եT V P K&Rl %I`]2@UhnDWg̗9pcI Kg3kb/*]uQG f(0-XnhDT97JV^۵D%bAr! D$DSLVW #xuɃ= Qָ <[U^]k'֧5*<LYzؠ9U{Y{bwR4Q^UqPQ #اQhA"LQ OB!+&D31j) 4S OWôL/k u3~o674a{V_$+|f$鱽z{LeBUYG%?1 c7Y%JV`]/pNCEyHgQ+?B")ZIaitX5CM;HvCsD |d Y+=pG$鴊>J0:UML_Sm/^;19紟 OggS1﹦0|9OA*! &#%""$ # %'! !\$w xeYjMAv|O.ώ7yD1W۞{LC:t גLVM]P QQqM#$iAxrȐQ$DJj@C‡ A~lW3 l֥;ɞdq]/`4sOi$,|k 1 мF&-FF7L+:E@P0+zby&gzWr-Azh\;R\(Icz H\VK&z]  גRM& Y2Nx1c~! ;s5ysFxC(rlMH)ҹ {t4 *p,."a4EAP+B?h8BR0g\U$P9-bFєS^>>DF |6 صs`,M@. W#9mD񊭸+h_7݁kU8=T)uvǒ=J%g-#d ~V62J |^Z9B:u,2@-׵MWD1i7,8$;<Svx:6/#Hr3^%};xb1ğ m^ܼA֛)ΪċinJOy4[@+A\X7ԓ ^\㲙@&#^q9FC0 0sNS$3IӬ{Ne4u286ےq3IzWq6h0 HS@B,gƻi?1 "D薎-^kܛoeu)gYbvR-Ws5j 8ĉ+`Z5R NK'}P $ u&xPl$U8L͵srY Iİq6֟{@׏w))L0huXYn 2dgcM|}#{WvHw7-ڷSJ>VCFT(=RFa_1 qӐ%b%KɁ0VP ~D鐪FIFޤc!ch']%O1}[a]o~' [FloZzuB 4pey ߶_]R}? Vԑ&e*7\7޽6+D‚ ^<61f]51 -\ѡYs!6=44anƝ1*˂2J"'hHlӝHY01ATAC4̓|Yc:~٫sKQ>-zkH_g>{k¡5X-Fra&kHձdi煄E*O'l;pXBX5yޤ,]33i.. YBo;7a$Rq>vDSwQCH= ؜%=Ϧsry>P3C8&Υ05ud(e3kep W$> F2@3͂I 0mxS1,&W?\R5r~07\6X2lKj̾qڣv 2==vowfc|L9F2RƬ5Iw7i t~NCKkuzv@]zRړ, #p+$ְ DF%L vDm\LgXxY "P&i,i,Awj3ua *緻VrN<<[GjOCĵK| gw9ghr* JxQ9`$;il`碁T{)8@UjOXt(C\ΤTZ)W g+ݢ4͈%$wIƒ0J cwno+Z=B!CFPf7X) ql@m.@cK-kwAexsVL|;k%~mEhwyb0)`J0\un(ݔbZwe+[%tD`V Y('B5d7.G{t֕E"i*ɎņQ|^mI%KUJ4$_ҤS昦mNKGaWbSSVleE;̢}^C륮T$/iI$T9 YEߏo#ʼncsxr$K4"{A :ʖwR-`A'J1qb;*kzNY+o`$iY0J"뮀ش'$x \F`~?!v^.LU(x2%MJ|yt1lO 7آ CE1?DS4@su" J2@x9W4ȹeueaRpEPy#3%\ afŻn8H" nHe$QiA@Ɔ=R u{{IPj[$KeYF6WoGK;[=VjB4Qeʟ6<\=3T?ri!!0b`^,bC&1=rrier5lOlxjv?[Zxf-7o宦wPO?Ʉ KHJAb?:n>ZSXBul!#Č׼:n0%I\1>Ci@Ԙc] 3[rmY wq|!Pn@4q;=UR%TOȥ$6V!IBAgح[#7X Nx>Cg_uEXOni4IJFNB\CNx:$蜕-ƚSޫG|ǡ&4F9jOout'J 2Bmlݣ-{?+5vM'kPVZV`{E\A|%Uل:łiaWOO-ikIYe[_~{kB.reD M2dxߖggFKJ׼?l?F~z%;av ɋ‚@ .&z0Uvk?(En8  `OZsW+,FAahGTW"7]- @ICK=$lQG;OggS!2﹦0}=:'$%" !($(s"##"% '&! ! "!&"~! %"{\Srr=wK>n{\u] TS{6ZQ@גx$LUêQV¦ɴ\$::q 'Cw\cYY*i$D*wvz ueNoaVl6Ѐ;|6=Ѡ7ݘD<Ȱf㺸߭F1J)iFx,& u+v(Ͳ ;T27כk_VORkiQ1bPCHQ# bzku|N5=>3AӮhpO Gl;Jc8H q!1yᑢ*%ԡ6+z)l.1.dҒ(V~|uYK>:vو9Q&°Ҋv&{fl1din\iW;(AYBG|B0@Cz]zgqDZDWّrsT_X,X\ &vkurTzku= h_nF{ŋ3 #FH.o_wO_>#gI+ {9|-d8AH5,mTqfjnoۑQd*OCH5T2?_Lv%,V,= DXn+8XqST]˻N)6Iάj$CuEd_)υp%c&=]Tl)hJLۘh; j7$]R|4EO{gư챃P_z~ID7zR-W4ςf1;1ݽ +Pb%h!/\ep1Sa݋ \]ԨKBAŻ35ry&DeeSA惵k2?*,4IW .br ţ!] `/tk xwŬWaR.)&cSqN 9_5:eԙfsl]ESe6o]Q'7v|zXWzvh `C.58 JTWZ PjLTZ>NSvwK9UFi.,9F,'㯜G~ݦ#a#eb$uj\D4;oטH WoU{9{hy;&6VQ%>X!!EerNbsǥ{N?|BsZ-`%*q㣉ɼ /n]L 7-13vP$maT4Z ՕzIӡNFnIEcHWĜJD\ Lv'8ɮFċEt `" ~:Qn΋͉4i:av32b|ow4l؋">. (ɭijUv,ƒ>9Ɨ.$13Xr(U%(N!|8xhYƠFct,?D23h k4%DN'4Gfkrhph7K[-Rݜ`4 ˆX=Š7ncC?({N А:\I鈔N3 20c[$1 czmdW:ݲZc$C  T۫9Zr@0AG'\\}j<w/H*aHgnHUƀ3.l= `WlskB0tp)Q"2n<1zluZ6ώ/Ʃ߸ZA `%$۶@mQ,ϢMduj4+;(,l#E-lm,dCT ߲ 00 \_)TUK#Vw8ѱʹf;g+ně)s4b?ƕ)$ ^k爛~$?)~v1| tLӱuxl>7d} ]A`;~]UY&J!Kv@}mgM8x@+?6ŲD+^1G谯)J/8sݴ[C`}k 7wctGOHT1`V%B% 8u󹐛u.@ǸiL7QC^{ JylAcWJuHyKHr.B=kLW-XMVv{d]csƪor!]4OeMS-]=Gs4Wv5%Dۂ:->? _u1P`7{pgBd &/0Pq k$,Ѭƅ`1W)Q!q>mBD8$ЀA)a|q?鴝޻;,WѳWǎu~Żݜ*pBn``2H+'bKeH[TUS@ -ד%+c&^9۪TUxhJvGx0~4NK1LUGU¾=EDqY;< 5̕UKTWIhSUQՇ{@D݀40<LUUєf,Ne;ٳ4DWIU|x̖/2GeZS LYezՑY4"miy6d\c5+Vw2(`ӰcÍX:e j_>raVT-v@"=i,&HcDh<on 5J.궫U'-ٚ}U7l)PHH T2|,Q#p#>>*^nڝ VC#A;U{)F v+HӔ2*9V m,G5v͟mk Yhx(#R [d(R@><[1Oˉ էHKic3k-%S[PxUvAOI3_d2c\xx&9SJ&]wOZ{6( 񽔏_|-pNGΧ3& n .0a|'.GB PY@8]cqB2 !5RVOggS2﹦0~&u36#"$"""'")!# ")%$! #$"!$#%$)"$4KBIS!nݣʒDSu ~ };D˾5I-$KTtWLu!\`T )ӃIA'7iFGyI,51gX6yi7NbEzrlpn YLckc ȵqlG/+dBӬs8>#zSVd^l xe**V B Jijt-b'GKP(Bέ4qS+(H֩ !B)Fkg0EV_##nUQ L  EkV0 V/`7!?сE6-5Egu.ݿ#f0B٠j>hƜXZA!]^K% PAeKjIPe"B"6äccFL/֧ӿЪa:|tJe#1,R7+\a`㡍Mv^O$>徼n{<4H/u&B-i!ӊr;PxFAB)@"pMIZ~Ek}tc5#}r,]Ntq'A)p 4 k"Ҝ99E(rA4F(,VE=4GAkR_/pDdfYÚ.4>#Fɫ(D(( !6ץKݗSьEjS?*VEY~)\y?Rѷ 7  ^ zsc ѐ4YFf)tC)'/s/=FoovcfSdXuWx/"QRf_xs|)۶PVX iy~49"^""©j,bvH;0P: 00l(axŬ$Tơ. q{~Z0kӔef_ zT!_Be)@c^.%Saf xiJ <8imD${%tydeQVڤ$G;'\Zmxlfk) kLa0xxbk"4:˅Z%0\%- ؁PHe-:_a )ҢFU-l4>_JrKVhщt˶bo^%e{&G yqpy(4 l-w׊(j:jafk>}D%"h7˥&y F̠/ O.;;ODTB7.IOKFyoʏ_ m : z7+\8}CrF\Q"35i(Rab2Q$( ܴɵ%Y%YKXI#tԭDljx@]D1"͆PwjUc1@uAA8p2hߡ?ǗeMgd7څ+pu;=wה (ڟ# %~a,1ZqIU,HA  z,_V)5vGphVJ)~2Vm&(ZTKaFNp X <U‚Њ Ĉ,R6тr\xGtZZz4v#ȎRwzѲj? w9(}94=[S:@e5yޗv\avNL'UP\TeeYxpRzcwbMLWHڼ-0*\-R 6HE9WQff&#W\}{8@߬TMnVNogyddbTFaŒI;W&l +Xr\~H77Y_ *j]*8>ox|VoDwh&㣋\cs8~NKhm3sD*jG,>tOt7줣"$i8$K TqH"B?׉~Տֻ\.3թu~wJmաd^vJ1{HXKc%ܻijp%uiB0BpSK!i])ٙa(_L'Q1| SOʌH坨t(#V277 -.SPX8%|Qn]֧M+ żk :m1'OggS@2﹦0jť/}!!"#$#'($##|!"###)&!F guT| x.(Y*:OD@rizP]v2Of%UwFA7 `1SR1X P^2X?[P&^L.V A ^Pc #H)(DjB0D(,\KlA P[>"/ 8JaF)QN7ߏsc\T,S%@4*E t ,5CaMT*Zb]־F5>iOWCsȃdm=0^0AX1;I\CH951KTzIbIƉ^e,uiw`g#H9\wSٿbZzlu?ޠ"]H9k6PXt*¨(y~.A+鎸HB'sګR.ONDh,3Ҝ$ KY \Ę5!}a_&hvu #O6H<jcĿT;wm/TՀ<"@  Pv4$S -Pe)%AOyHFfnLLyѳعz,bV3e c"l Uu"AIhGO*PPG#)q;_Hy.E*u=lD$jf,TL"R eP*-Ʃ?єZ}w_s2P՜>@b-aǻTBP0ɷ 0(ܨDV$H97/LpTVM(I$H+~V2pl4`cqWo̊4U*U zk}}C6bCL]ԅ{PKf%]#ݠ VYT\TWy =QyFo%`v:rixq<׌OvbW}/R8ׂPTuO 4MZQ, ZGI$39wgGV 4=0J ݭT;.j"bܭv-<KsdM$QUp4AY Aq `clrbJɰRBbE&2ziP+_V7Š)D*q$/AQBˠ%[ @fߦH$`\Q2EIkEKv#4%B[L=Uz;_C-!̀vJ:>*}* ආHU?mBڡ)6n'bHB-5eK/7v4Ux4Piڟx&(#kA\TYqƣCK[ 5i%ƮTB*T+7ÃW0f;iKa#!] B2LU!:\\҃YeӪR)(4%,6ota֋f(,c5AxQ=h;׬`s{W6]zC-BG 1ZusH )S֭%m*C)j 9>}Ah>)ЀtGEӵP3Ÿ-0k:b9%y?֨۱$_nn5y-[pW6alΔZ˙mݫ;n+ɮ}M)Vͳ鳸GrFWX/[#zPPqZy&c.p,,e*aXe$eEP@$m:K@BXĞCK0rv}8RD90LOv+ds Kt4d7]{G*Ұ )7$X Y$&`qa;hMn渊d&"o3.TfX(Dhq}1{j+:Nvtx_ wxtTݶcjoUJWFpƧXrfD]zD3gKTҊn_.Y`I#= „>&MVZSQc_ʜ`nܕ*^qǿ<&P\eUYV:X9B$܄ljzc.U23}PI;}!Ϻ2NJed1"ÄdBdA\o|q8Pf0-aLj5*biD'-uDnҼNV ŕb`QVI~. Q X@ l]eLId+ :Չ1ߎ0178~2Ci)"Nt*-@lɦ4@W0՝^7|YsbRR">auFK~͞ڍ cv_zUU< `u#N( 05D&2up9Lz Au-4 DQ.%XWp޵?9!ZqQ+zA;e p,sZ 3*KE(-#/"dY(~撷S"CMD A45xZ~D:3O#/3a,Z dkw(  H3HWvͦATcB_R[G>Rq}xLabYXS>|()Ldcdm=8 xc Ҝx*cL_UYL@c^QT2av(yb)UL ch=Ĝ8v۸}*t UME4DzЁH>6*江n9;;.<\ZNE5V.GXᳬ* 5^|6%⥠ŌM/9ݑ`U i jRfИ?iEqlg΄}"")qYU >t!0 he7F9*DB}&O1Rp[Z>CM,8F\^L/1qŞ2ih^0aɹRF"ZXya|!H/4Y՛jفmY e{tnctԜ5ϧ:?UP堲b.zNs|TVx>}^g֌trC{ñrC RU p h3$3N =K`h>C3UivK6E$;|lG0D5; ȮV$pD ;PQV hy☚!paj-Bf@h!oAg |T85T(<O.gfө~ [_'ofL{IzH\VwP`>*pcmQXӨѸ9I޸f$$MҼXpv6K$]Hbޑ.ř e;;//g_} `5ֱl0@kևqytY\|:֛ZqRM4+Sb6(5 @)^[#5\ F.n)\{Y]R]P(1ҩI#"5a 8Y%1hnMQU@\ݩ#۔7?q/ "fҙ0"x%$Rh%fkr1jur.mB!uk} FNa&KÑB!Bv:O'h+F&=^!uMD”F#l$0.Nz!0/  B`("j aEQQM\A*+{Bfgj_Y ! 4Q]5SU$M J;΍Pim%zzMpay+DiD P{$P# .U," G]AeE J*.bATH$Ŏ߅LU èIJld=\3z .LQLQ+xI[DT/gb\QTUeTZxs2{H>_OZ DWLKUI`sX!tQDTSei<}{iBuR!uELSLģ*U]Yh}tpR/(T[>.F >Oy 1;=o;%deLڰ{cW4"*뛚ɱvcϷvS ϏLYQVi8lS7*yM7TLW$▂0c/7vdu,{nr "(jztɫ-ۗ7R6Xғ!D܍.!{;7v.|7Ǔ=ɬDU.(b_vc:\8v iDav@]^k֙C"hċ^ + )UөN7FQ#)]<\Iό.[ fG*` P|ieT`H~ʩn* 7;%g%Ͳ,6qנ"4XA[kUqsA W E|-2Eаx~F)uQ^$E1XpQ]FDY4o41 5w1jӘPUw@P@@P . u<_kǜ(gZ+V l[-" {),&e 4GJ3#B!˹iY9niL A&5K}~_Gu8:6jX -k ćj (Ff *`❔i\YU#,&5^vXp϶.eEBDNl'NxE6`Jŷ0eXA;<ӶȄրҿJ^D]cMDݎnwDG-]$Wvr6),Kq'pp6,B͗DA4KJO ]>|i-%͗ǚʭLxؾnr`h/$K`4W$s*f椐xV3_F?FkwLa >_'v`gag>~c z9!SecV˨duūӟA_6^/x\ ]A$CS;aL^#j+3f &;6׮VXQׇ`eit0Bte\ʂL8-.$^r^N ^%H}+Quҙupavʍyc1hhN y{*5+m*CIj/ۦSo M&5kFy!_:s&!<{`Ge'izj~FQ~f<=6cW@&-%L^lfB.& -6 g1|^Oi:F19W oӱd/'Kga.3Hjpxr͏.1,^S1tJ7ҴzHj $0K x%IȆ0E%b 8?/o:ˣwOqaӶ1~s>iKB MgÎNҼ 7) S_O`omsЀ@$ ݘFв@`s-H zMwd"RIЄZ@ ,vuzFڈDCZSX,#-IМ^XFG̰ﴛps(g{-Sc6w.tN &ϼҨtw` F!pD5ib`wiM(#`hQXua$;Bb1 Z|FvhKJjZC`aKpS\%+dzz` bђEbz0蹿-$p/h@ `lZX6k?ߏucD}"\I'P}645خ n!+tJNmM)Ze0qW'P"pIjn]>;FUB-WbJK />B0\Ay4]Q*-\QK;>v}^f6Fio@p4*Шc/l ld}idu;YBCȔ:K{Ml-3v-׸eP\V2Un\ZiFd{Ladl5ؐ$K%ӹEH1 &JiB*Sќ bKS8'nz_ ˝o{b&g\k_\'p/kNKW\^$BD+eL$k$K7\q@-l"9^M(iˠ|lK ƏF2QYD(PHh'+ѬouW^|=_i Z ZmUd77]*!@M HV2!^f)d+U9#Mi6YV^vIΏf G1+"0h @J0^i5#6S4,\ԓd5c5qٍL&|s#m j^bmV4(T[hP)lwT-!|N=@0`~>`T BN&:? wNϏwo]9XVUžvG2Ui>Ti3]hDS>|1㋤{%dIS+QZ),5. i+Bl D@c0cF8|qyG:Ifch'Klv^Y)eP61)WQ!F)u7شzrNX5÷ly껚X R)1ZjRiYjPV ӿ-3/qd~ Cp@R)b\P®\#-OiZV n FMd |4mTcNxLP8eHe`% HåNݘàF! v%䍼\N`UA,b礪E,y2)+o :Nn'DFH qI”@ŀŮX~."WXh(7ZV?Krzp!Snv?#Q~ROc)F|8MMԉUƺ2oJcf(A"Z+\*16`'d j% 5!DjLYXg&Ӭ/Bti .!$SLDS8s5,¶-pDYOVÃXat*>:'@PkD[dS=ÃG 9nxM(F$0\4QzC)2I+O<gy mw6[r%OsՍq"d;""MDAG ic$ebdaaٷX_#R觅WPt>ܨ(Q1E0SxE[O1xN;O?!I0c_%1xQv#Uvy7y.DEr B'C7@ ǨLw:ч)L*䁒Sp\6n0<.EHKF"1RJ".NwеOHjP 0kR b-Q$":e?L(70D/pR?,F+0b5W4"jH9 FZ#AtIgWWMu\N%/߲U"@蹠Hc"kc^vÕ p25##C,ҦS"&L!R U Et2*6CXŒ+ajgޏ c%F+5^o L5"UQkF^^AwBwZ ْ'/I2O`tp0{ɖI]mQt0_9 c"5O$v0P'A#QK93%VFMvlsZg'4+Eipя3[eH K-bYD5RzAn+N%ڢ`h7ck ,b`_H0Bi׈)91iƒ~4NF5T'&q5hwsV0d@m*h50অT (XVnT>E=EQrÂ%%"ެnI 1g2j] p8c;Q4tiNlfLȍI9㙸LJ}sEcdj@!X7 @ 45 zD,7ʲ˷c4Vj-5Eс#r]s@1JS ,V_cU=[IZ!*UTa=i<?X; s'Yٷ[vE1JmATX `BrVQWL!2J<4e" w`lDp5޾1i$Oӆ̓E|)8FMuIpRP,DщgAm]/ ^_Z* SP[0(ʢ, cS׼V_$U4%[f 5w~l&h|^>#oB D^oEȉ۷iSŠ"DlTC">吷Hm:0WlNQR̗6gЇ?!%::D4Qi;Rn)ٽIX\;. r.0h~|6&@xg2JsZSSDDƴ21,Qmv,UA&DЬPzP \Ct U-K$HI I{jiUpMHx]?W@Ŋ|y *T es 㹟FR@/DSa'15]5ӮXvl2u2S% I79 \Uqj.yu4VX]Q$LWz+a3|vx01)zLYUez<҃1 "ix \UjJҖOJ_gͤ,JӮLUtUPyHfXa͛B۾VM) +K%IRql- soS]HgRej1k8"3MQL@32oojUhu^K!V4߸sRn x쿮`;Wlσ;]=^|v& P+>{ $@9+]ğN)i> hF8)m;GQiS' I:h; A{hBvjZ7IB ϠT%EL A~\GHiT)^ @iSF*'K҈.=L]ͽ[ꁓFtX;fqi!`ЪDT7 pP/fy< /c>>“C qì bJ}0f.b@aD.V[foC@`xUj! "dD<;,QS;ఋ+5|Upm혍[MG"~["T]t@3g@cs5GFŠ%?IHDDڅ\\qaLWd@(p(nH▥U\_x sItfT_lpd񵿻*ӷI D,iD"nQ(U^^)i4т5g %OGOx>2 :ObLR Zxa~pwvR%%N-Wc>6j)-]baD oX^vFՠ9nh>~&0NwS ֆIGOO!gؐ1V퍒O."31(^iW*\C>󬎴6]OggS@s4﹦0c0"! "$&{  '%&}"%!$(%$^CNӭ;?$HhmP\ϙOL$128vZTt9.Cb;aY4.PVnjTm@*P~1#f.p+:z ߫sv"T1ƛ~һ.AJk6Y!T?d9hnɖQ 2&LX&f˨1  Mwқ] +^%WyuzChl!FjXT}Qf!wɵϲ+!2ø!Ys4jHckS[% sy#^r!j LvMn8E+K>":1w)q!'QL9vJ- 5WE ԨD%̾7fp8I$V ek=Y3z}: j]B wLadr %X G6ќ L]-LM 1 NVsK晝 qdY[4]Iq6D$uq !>(5 o48reC&~NɦqlIOʟz!ɟ nPX95RZC({P8/zGC4{&dd:sݹf>'#$a@G49q{dn%|hvphڸ:hZԮwnpO~lS&6 (*Y+kXnV;,9m  9B$DSUj$$S볭~{'ınt_]ATWt++r2_Ilݕ"2KI꾎DiG?m?Ew0j}Am~]XXob(?>! cD1.E$>^/B@"4o/Kz3H㺘1MNHJG -IsjF%]CVةþ;X7Xp37&X?:yelŠi-aNAH R'J^ݞzVA"v{DӮSJ,i4"([[hV0}P3P(Y ]$1إ`v2; `TxZR]`\u.IJ6=8M`-N<@%t"20,DŽ9 gYH6T[ ;O/c$gdL d_xC (tUhHjDG5$P\`v ML[)k ˜:˼ӟ|Dx$/Ĩ t_`o:=!xWҐ+eULٌ)ki̘< knKHxrDU hjƓbM{H5CHME,,M4& kQwsaY(5P$E_4MtZW)ѳVfnǃ{ލRGy*Tai5F"5i.F8ڞkCz4ڳ}& LcW$@ ,:FkQF1z&to^v8?6|Fd-'(i'|9Mk8,b+"NH*I*Pb?pEgw~6՘rN}b} y6t\{|=dmʧ&< ^6F2I-kLpv'i6%q)ĭeZ➞o{p; sN<v8L@B5p -}pi.+U=+4G$t JJ.Uɣ|t;sMm 2Z?QBBLJ0rxr6q6lc6aiPen8l>T+d\'[%sGnwwdc}l,s@,yf!k2̯deWz"r~q>\\tۣԃ:;&K@4~ӊUVP$70_/yWIѨϛ0WJѼ84GɯqU_Su?J9=R:|()0u:DMM.ڭ8X5^T>[nN-0̎5 ?*taPV)xsv|ʩ͔틻 ]l]%ݿH+bkDt=ۘن*`T PDMMk!_X#q?HHa2 *^6VJ_ڧq9-j6~JDdӘ^zXYOIfe$㎆nyat\v`Fi/>Wlؕ2%o)KW,WXI=&A YA /5Yd:AEW >.,[/Z:xNTiDH:dl&lf?˳l-J;Y\`c,-@dw*4(alrUO|:{3R?2/zHՍ?K챤nE:`SgAE7=SB؄E圫<0(02r32%zah:u\섓CR_L&4I1t;R&Rx[7hOzd\xL4*)W=$-a`Rɍ.#PXJ ] b4g9D)-tN d\vITn#)&vfSut/^^Pk75 \: c &-Ư3 t(+ *Xu\*+OggS4﹦0 0"$"!" &('  ##z!!!$"ˡ$ ܠL37l6ǔ'b=WPî*Rx24 h/YOƪBR/Σ{+쪂ZJ$, aI9=H ݍ  :R?=m7 윞&ptq-^|0GhXj A5= ~ X9%ȞEF%A?DFV IZR|v=ꊪX|L\+Fw6 '((V,(-T>i^)jE::.{@ =̢ @ Yjޠ8*pX5ȋpgGB i.Q#|,4 5(DUSJe xw8EZ'ѽJTaat9kn:=BzU9 ^uddFỲiԵʪ|$g!mU4S⣩Fws7֠+/Z5D*d_w):?shnn\_,i[ڗ9؛u^;ެwnUwDcL%1&E88)ѐs}3GV[ա[}?uZ[Vt{{Fm969?A麠9T!53x)!#Hg. :aH*P A "ǑU FQ;#.ֱ Ey(k6? *+cn= > ьXXOC<sa2(hLtQӈIK5qOeN>Y_GYzKmކHSF&W-4 we r(?-7`.Z5xNLխ]*h $1̾}0F^yH o) â,PO7 'h[YY9R*/ՑLUi?Y FK U&LKLp"Prj> W\!Qm/+>L)%רuqϑD\s.W6ݚ]홠Tco-'|֕M< %_/52Fm7fP)B%6@DYUVHuF+,7{hV\pLYS10sșj^T_)w4E#7KLWUaUAUNvQ$m)u&s@ ഫOODdtRbYL7'kfGX"Repmtc;m|<çO>ۥAb^RȸGAD1&%!1-IMkpӾdm/ =D)N2N3V n=]9hk:|bc}ޤ!ڙ@@!pIѧbp xMlCU>ۭ*rLQ=DLvkƓ*A(\3q (@(B5ePͶnk?^&JV'qT뼉#*~߿K w,)H4 nPH@ >r/Px t\JB !]0` !$!dY}m:iI_r+߱QV*dY}WV[{ˆ%)kzoLT klP!yMԬ|O #=[Rxk647<dadc0 ^d9x" 1v+^F= 0_F(ZVa&ps/YFM,kteA B|&UD,YA3+ pX?~\rK`{H_n}q老pl8AUFj\8)D8[lnM|-6xm<؏MavfԐv_MSBmS;mTo}]gZUbN"(\~kb C/ ZA@NNahUI_]}bt頎v'6#fZ \:2RXBh0jh(3v+ɿ+5wS6{2?e_ýR-a!UڌzQ@A dw;B{.lU@&0_Yd`v%SY*4iϿӉOX(ҏk1JZ}MS+[>m::L 3!UG84J-r9ӍINzڜ3rpn~np۟`5Zy=+`MHJ[kZXjRn=E{\'rs”/6ߔrd{0m0da|՗m8u\ If{T~G.6cXK84:g?iN+l<; nh_jujLshn]ec +6rS ޜˤ_9%Ksa?(,aGKMM7X44`KA댐$I 9F-\Br= t8u7KXЪisfٕ$FZ&F˲1’O0l !r# ~)BdN 9xpJȘs.[W?Xney5pe9TDE5R?kR_ ,t4=tI͹v4m=[Bû1}hSczmz_wLgĵkgaj%ؕ[rK(iERk>*K&R:TUD@&>?JgT_{nXܺ9+!LqqS?mf[y/'s~.{1&1'zRNC"}j@(QxҬ/gAB7Oߛd^{C%%X -ºuKILS҈+K?k⿼*꺒10HKOxfwɪG;WG$In*m٧)^b-Gjˢ\ȗ寇FuqKJq~0%Ǹ5 l<6 Ue1Ebm]eJcv2HDԉNOX,Ep=Wpµ0umwd@]P VT%Q,1a: #E&șICY`, Kn'[a~|6I@IHehxe"$=l&Ax^«H(A<K3"Ufg"2$r7'uzz+زFH6,U̫DJ`.TP j%ʌU"U*5Ơ7tKD%%{Ʒw8o;5eZhp6& 2`(Fe.1/gmW˜{; !ܴ!%B7^:?CV&QĢj"X͆}]rFXYUVݺm'_7A [/jlj*!ZMӟV.-tuаk,j09vܴw9>(R]rdZWLS0 <#ú \-6&O^I7U/(nMM50\O8EbyjڳQv B i^-)HeIt@a`ֺ;&,?"ʆ2HQ$b Qp uKB4S@̬~k<~v0j)DUsEfC<\S0IQ%TWÃЀPz )~՜a4SdI~>6`^LbJQD z*x#mlUyj*uwDnXݮ{,oчvq'ăgKrHaQɳdZ-p_+N5c1!#ST4J1ˌ8X H؏ A HՉ mv[S8!b"+ .#|jc)0Ún֠9*ӏ&I5i'fs`BǍ󿋡ځ"bV9/R)e7dUJlF)n!|FX5Wx8H4"zv 5wZ F3+l/lBPO0:Х$ l7m2NWZe{pJP% \Oǩ9n܈(:Xj5~t-[J%5BH|v)VF"^2ywELD /g.Sͧ{2ٝŷ6"r_~0+( xJ*>H@IARwUO~܀Q7^m>PQ!nSC?@ |C <0%L)ӑ/bn)wh&..5jbjX"z \'A@93D I S"v+ݞP*,1!{`U"5 BFdyaC$Ӯ?93e@I4(ȷ諌{uxqP'5(*B >d**AM7xnJ)Ք0VݵbeF1#%mքwnG ެ"p׼@00sy&ɓ5$woOhfw^1;8^Eil $4X(JOD Բr9UA @dWt1#Ěa,U! #UA1-uJFFBz`N⢕%)&eCñH7a>۷1Upt&* RCY 듻tVBTѧh@D@ 1P+GE96   Ӱ:iZe ,|}ڿAqf0&EOO0 +j(oo&w䋪V:!LjP>j K}i09JP$K(Y7]UkFj2 DrsT UAE);Dd#GO_VgFb:;{(jR,KU.<9.nGޜ?U7v%J,MGԎCͫ?vO~bn) 5PT8'Z@mja<{OW$HȖhTSuD)-KȝXgW <Ӊ㞢zO'[(WQ<߁?e4!LdS8<͊W۽I}7 Dgʧ,!s_.tSxVdg" b<(3)5Um=>ϖ(:,fgR p0,f=ˈ,G"c~$2ڂCUR P}}7͑=J\ZS2vcy7\#rܩ*άbfo;s0{|Crs۩o~j9& ;~{>08X:6DFCFy@<>ކz8]m Y?ش NTBL$:qvPu*^,gO?:jjbp<]EM2?Hs5QDY!U&HhM%!I'  T=⯝ۦ!%)p+ւ kH`4^lw AȂK4rRC\EL2Y|郖B]IF cg$gBq(e5 XRU @0@bU&D &0ֱ,hIgT,%D[џ^,I SV5SoNI"s}ּj3$XxD4Ƈg3:&'yzUpr)Σs0`Do#-@B?H\[FJ:)0b}Xf6ap.wMTW ӧJQz\?5) ]ǖ(LU تvCb^ |5ŌF-R|;%C~\gYp?I nI ɋB6ރNԪq: Ɠg&NB $- C )`ˈLQDY{UFZH@YQz8+AĞL=¯Y|zG!\e'ewX%m !fB2XP, vRGq L0hu%1@;xI>l>& "(7lf>7 F<&s'*g1<52&F\kN\5L 1BsJHsJ8*M_x>E-R?El'A, KF><6>@;ۣ3t W L%)}:peڶazѵNy§w}US>,Ji,d+*8_I|]IEZEXpHZEv{ֱm@X$~4Nom`Pt|n i4r*(lxݞv;I<ǏKH BTR_Uա3ʬ[t4ꠗ7GiW K)8}+" Ka (2D.n<ӂg꩓}]T\R:T2BXUDO䟧Lе@F7889͢HE0<͇2LW!Zt@x3ݻ51Ɨ}]7\4biU,sl,T%A(wEIYZײ&|Q.#%Ðj"=agwJj#l;<Heѫl m\y- )c"(86jغS"|,gS i`2o7EId[/˓lH2JWXan4#ppW|T}k#m_&IHggy@}H1sz>LVF/F BFt)1|vE6&|hS$/ F#Z2- y;xF.vXĸlBWn0m-B{1@BUdqN9p&+yι׼B17B$܍sܽۻ-7Wp0[3R+G6aq%Q =~fENx^A-%/OIrS bvi->{s}{f o-7L6`%ɗ3]jWwy6JlD/FuϏano8˖^:W%:SKJw#Vh l[Q ( Z3 pEeIK5caz1e+ȖNypn66ԓG`IR"K6x>k4(톦JV3Y5Hй^MDZacv؅H>nz ^\qd[:/>]馑K3w] `dh)Л#Gg&^@UV~EURPK7N>Lj4$snt\| Um!}+R|}͞<-5NfMF^Iv6u:c,9:qs5x%[bAC >K&h/S$Z1 Pӳ[DM=}q 䊪nx.NrLljC8HrVN?,v+MNu"t++Ox 2ЀjfR0ZnXg(B| Ni\.׳{z50zH,Vs`XQ4qEYkR_[ඒ,('|n {DEMB O'(ߩ$#|^uii UgUKtHPCKNBd:@i 7"yXvZP*#c ¢`J6kL'g0Œu*0}BȈjOξ8؁E]r š1̦G[rGqj4ƺ$dah0j}b}J,{^ (,В.AV %S#H^Xޏ ++(\]ؠZT%HR2 Hb LWL:#@&˖ĻۍTddUd vq sҞOAD~QDUS.+UYX">{?IUfdYauU(7p Ėu 5tgdv (u 1-/V3&^+ -1H SL |8l]+qЧQ[Eaɽtw櫂1bYh5uD(8*$s$24!8*BT;m ̷@\ezd#0F{}\+d<8N6On(H)E׈A6r+§ ;A3fXe/ h}1._مh=Ҥh^lNN;$76Pzi5?kK TDGEbeBC)) .T,bKj!P6[`@<ph cD=ҝw.w$rhvT#nDmو4@@^p "G]$EI +XO삮хؓىd+oݕ'"#;r»P bҧ]tvH϶R6NS%j!1^멯Tf_EE1F_X|)͉!DƤ \-S|#3P8ҥsNHVv P-'y.`?O' >ALz$MV,Ȣh#RRiӦqd9\PLS iL*ٓݱj5{א^TLUP]ʒTyF^LdVEJq)LT¹AK&.>X \v|L;S,T'SFFWBnDEw-ٽQ˾i]g\ (RF-Ea Y1TΖ>31R_7TEA=#f1Q͂OggS@5﹦0x7"" "*&'! #%!()%  $% %$# '($%~uZL3laM,P01eY52p\)$Ch$ /T0ҋf{{=HgF$$B`55I)2|,w Xc_Eb( B4MeӦz{~[XvGJo`a Ymi ,<۸#.e]8r6`lL>a0('$ĚK1nWJHzBE 3~˩`ibܘ-PSҰ J]T$1 XK*Jƽ;:T_ÐX8. ֹ (!{"#gXa7pyBZxR~U-, LO6O>+˹Ut(>*aU+ ~ _Q@lǁ"p]@ɡ.(Qă%R9AOɈaFEHEѥ7`ZwB咚137B@5dV@H|@po49`zi#X(dmJK ^nS+*^غ6AI.Wi"ʴ ErEy2Nf4[9,K1^gRu' c Y(V@T;bn 1RS:usbMQMu(>7dԞʶH.cD?聋X kR /Z7 bຠVrpOSYbU/0ʍIs3 GfSGW1WÈYa٨"9$HUsuq% od!. ߅T 8-0V}-Kr" 6Nk]KiBuZےjd3 ~R9_u&2y:DD4gnv4hn./6x/|Wi+HP, v BtE ڥ+"M$KT#taSQm++ߥ"Cq)u@B)4SJKU)0΃gہOlgK{"HIL^OS~֩Sn쵁QN%%K4KҸ&zHdi崫ǙWVULѸEc3kn }%(x -yiVLMwG2FϦ2lime-Uwa{1Ҩt킉 * !3d(=f^15 Ky|wUy6{'b(hFS5}'UnF8ԏr5Je9v8?'$cGNZt4ʕ_Qʷ VS kna,X1LpsaKP^$1ccQ;_.X0eR0Cت}Ma%1wߍ î9@ ЮCZd-$8/"a&~dAK0qUq#(TDSLvQU5Z~C"^}^<qL[?da,oQ惡) ިʌl/*zzLR:X".X`IyZ EeAXTEfbF5җO9qD'e3e1+!1OosRb1n ɳ 1e 2dѾsؔ%*YHrR>|qbެ f|VL6 %F/f.?‚݄)'XJL5!Ic6<,FјJ0``4!`X& p )TU<ѨFiSw$ v" ͊HAmfxQh-. 9d?I [~0bKԛPPDwOggS@`6﹦0V0}" !!&(|!"! '%%""!!#''~{&2! 4ZHF,Mgh20\رtq7vؠ(86ۦUgTPr4D @+'ƒ銭Zajx)XAt\[{Eq%Z LND||6Kzg씇B`ZbB绡:Z液_4ڱx7ݳ{1f~?m$ o{(^Iڴ1^T ud@3uCXʢ =8:@!dq۰ЈzS/7ŎkɎ[Ev్D,Y.|*laB5w*I}mmir?&Lv~)cnWƽ(LǝQ2%c)w-XZiy¥ zD!eX^\5&H~*4sZ_%N2:Zf-.:FKe![J"*ze.[9H:{?qJnyBjQ@SՒMߦmt_ZS9 eL $\7(w) V%h\NA @]P[vWQD VK(ف(f}>h4%\蒈Nm9( G Ofv3unjU I <*hH,R%EΡ,nX K24H_9vG~gi՟0GD[mo{sMVͭ2ҹzkXEu<vZ圷d; f۸ċITIDObvqN_r[ ^nhiY$YlNYUiG-!OG cXV$L[*KM2٘QJ,_l ]T6œ[fMiOʥSk>Q)<[>SL/I {5ޅɅ;.)1T,[U54Wt x@|d,sTl|L[Lі܅EXb˴LiA4D]2F8Ywm"+UpO*]>>]w#Dc8{QvӸ(M^wryo ںc%J`ukA="ZE.ŇH狞$IaHqJSz]{,fIJvΐʪV˪)^c*?G+,YDWvV"`0$)+L"Q\qrO+iZngàf\o8M} X(|bo/B m;lOTfvA`\P2ĜOv_ЉJb*,U.8NJ[n'zcd.E(" # DƍHU^|.nΪ`=NKS 2 v\JSJDE! pYf Z4Q2[houؗT[7! fy P"2h5HV2/H(9+ܡp݈ n,*l.3Sqwtc?M8X9QL?`kn0ʠX@-U,2$,ƃJ8Ŏyt{-hk Z( <Дè n2X7G?UJPK5GLLOf6ZFQ@N&f:4jnOAqZv7 , %@QL;àJJ&KnܒCC=UPs0Jbq^Fн })Q @ X 9KRE/?Q\BԷՅiqCc}.KT!mah0x"H@ UU;Hzlm*RGA*A}Ij[T[D!ߖ5ydDڝ,SХNGRRHSU!L,ϣațjr9ݼi̢3@uxKtrKYM fsZ9%i\P ^WEք{8(kEPIU>+SG^cW*/Ah<<+'"%q Y#_2>"Vb/fp4"f4"է)ݲ­n@* }h&)ZTK%oX6Ƣܻ|B0 !CxP;F=8 . %>?UzX-_ϮP?ԗ7{k_yls@5[৛wo^HMڌ>e1dS%ם\vD5Ґ?,T4Xߐ@?PSs1>@d/]Oj!,Ƌ}@&RKTgUY!D3W]fxprs[ k-ѐ,p٭{!Y`,V(#(Gf-Δ"EAn07ld/$.p4\*&W+PE1:V;:Ϛ;B MÊ79Rp6׃c 5^k/[c6QpS]+E(Rp5s^$/7"r9 ~6u2ܮaE \]MYeM׉5xV2Nz)"uA $S'SlLWϟ~wx%.Fo)Cn d_=Wג I]n[1lk1^!'8V1+dIJOPf";t-\kٺ']uhFbe&WQ$6z5?N1Z0"SYd)2'FUIqX m uTE)Ѥ\Tݘbw&O!'uJq=ȝ#_ *hͩ:8b.7P'ȰɠAQ9؎*wM`, po^NUXIVkWC)gM3lj#hnDjK4f1o?2aX,9#I\8'F @ 8RfXwHkJ U+ cN "KDޜֱ5D= tiVhU!gJ@I) (;Z1L]JQH^`OggS6﹦0pf4 $"$!! !#$"!!!%(%#$!#$!"!&%nQq-[k.)ثO~tXHiáH#XЭqZvig`.`S͒]g@"PVp/T0*Tԁ 1 (bTW҆)6-L3Ŭf_P#5MhˎhWO;-H#%U'm~|6.[ pϱ  ӢSLDQԌ9i'E;yf gLtk^ [W]Ҭ| K8wzq GHʄ2Ei;IܠF_nΫPBEyvd Tv{Ʈ. dB!hN @(~YFQQ쌣MZU?4@fg{|S-tAx \~hu, s"([Q~h5_qN˅o}J-KQ k܅9cTY˝qHC@LUeЪhN==E<[KWQ%DUeBSUNKQF&F!(DUeҧȡ9u<,y^IJb^5mz Qi**TUtUo`b9wuJQg#d]daQyx QT7u?䎥)lgavֻgj|$ă![r(3u%/lUZB@ PT(QJĐH^NNkFθap-sSUȉFd'Mȋrf."xx/h谩gnwr` 궙p A]sJBz1>l.>u\pA asIZIX!iT>rjk1u,6#sݜ:5qu`,!!ml|G0$HԄb%u iI\qA]l TvkmF/ӭYe3! Vʲx>?EdDZߘF'XH&,cfI- Z}m#QI #ڨ8ohLe2 |稵tWo[W7q4N#0ba95.ůoV+!o ڻ,5LwDo6 .m6s#> av 3Zaݚf_B*'y$a5:+V0+^'Ѹ|mnRn(#*#yb LMCN#xc\ l9jɛ3Ð7'w?`TҿF0ñ)sZP616IDDpPeGWkthf0frc$&@1>{gK}ƛ~8 lmLd_>Kw44\ dg| *ge>leNRh  [.XLਂPi.mh%c&;ۯVY 8JBmqqzK+iKUnJzePaH2@8-ii9(Y.II[oY]%]XhKӦlm))k^9d~NnzW8#P;j.t{Y68v~9ϮOI|:z7W(m+ez/\UZMEAaQJ^+Msv&3w+D9oӮ\zʜp*:8;{}76)߻y'vt\ -XIK5<3DIԴ0BRyuܩIdUi"E(aQ,[3OKRnYJOBray-ٚbu,KQ[tDhHVوxֱt֦ r-pWU]l?_턜$3 iMhr1_8HKXHˍBn]e4ݬ[!n2$2oCHu>ay1G/xI% Y+d XIbH JGE@({iJUEd3~2(cO$cuˈ.ڠrUbI|w]yo?v70wty=^sNfD(C~4ԾҩW9 "Btb6Ij+Ckc )B LSMԢǻ<\7۝~#FɨeO9V ӱ%OAtvC4MO<_9҃bì+1TDfA}ͫŭՃvuK?5h˽W2dD*k837-xPhVaؔLgBY#CZ `}8>Cw~}ԧɌD$QڀU;OQ]}&õVqԜ݆7]I)eCHbN3^KJ>j*UHg9q|3OggS7﹦0,1s3  ##$%"" $(&&}}$$ "!*'&$>ncZ4p0@Z,EOrAgISJS6͟on^[ZN5Hcjܟ*w͐4 =kX@![ՓvChx!!mZ:ZF,btyrXG" (>v'1FK* c!Z8zi[%":'R]:8;a9%6IKᣱCFxdqy?"hDvY܈:_12j׈6 u 4s%>BLtcyU 7҃LpMb+*p",66cڬ+cr'@&:a.1Bfi),]#HIŋH,[oTR})݃ca[LG"bSq)V "Md(!+jR5Rͤ1Ț):CVӤp)H!(n5 Vv"#c*TWe*ri+YƃRnhu*!Y TY *fdYV8Kb-TYt+kxE&xmk=ɕmRJZ\Ykhq퉃 霧>Ji^ڲ" zeW,k diy { 8X Y$tbl Eݍt˾6 bwZШɢ;1F`O)jeJÞ8_7CL EUIƣ3ѮIl\5o]ndfy^8E'^8'eI9փFoA-uFQbYukrc,TlLc ˖|@Fnpʦ^;~d]9/CmvNJP~J)as|7]l`\uV [ͽ&ػqbqA}(uPcuh0v6ja ]cAE4KgHpݛܑj #]t*Dr-WR1DW xpjsbHkӤgVMm$D'[@(7YYn򚱊 T$ML5WְM?.eRU!<фϳkrs.WU # DUQuf|QBLWl' Dt:"{kk&YW)hqmnܿ4Rde`yˌ v?Vs6\gbU k=ו 5Bm.X_d꾶Z= -0c4 0_(QFzvg"!8f2v/l~8Ri@51|bKH F}=ww-;Pݑ5THa'OvcE_Dg +$ҒHVYXhHb~.S64]Rs?=MFtҜN^|eDn"1>cGQ =4pJH1=焽TX~pv/;ۮ韷B>Km+#>XxLa4T ) (<ɺH']*޼vuJ@]^*M\D/Iq&e,2Ic8.~Ȯ{mDsg] p,XgV*cê[- [ w6X)H#RN(FX<6nöUV޼.$ xJ50. cϻNFP 4Vq0]4@Ks;#5Nojf 5*r2X$6+KEY^Vw&"FZc)N_x \2+9gfV1s,N[e?:JB00{Ɖ 0AR<~"|[BU{6ș}Ԭ@#!O~S unN``D'lN·ͳ68dld|ڔR<CGEAbI@$bJ- rVby?N1:OϹ cn] &L\3ҌI=tdq T,\.L Tu1]iYUҧlSgs&O n>:DL}2DǮfKIt+Ƃgpjgb%rO(LTɗHn „"SMD*5\9| -TXѠP9j0/#[hLSIADrQX^qpq+<tbi')uC˷d Dbva{@5ҰSIRS"LYirJż>2ZTo5UDd#O6yCaoeeR{wYՌA%FDirL[3?>CE8bJi(DWӤ ^@$Jt W}DG=OS Ta ਋A{m7iMňhkR'hVFHP[ш LcL%0 V\GQ*API:GֺkАS/ZJ >2;uݳ:5H& Ė$@6d8JBo!޾! @Q"Ԯ~ JJ֔~ʠSQq.q|i8يf9Whb 4a21+Ȑ8)ĜnH|ROyBR>dBw },s}c[)n {+]* d&P f#DX y"]\} +FWPTYeUVNGy듎aP4Ҵ*TDWLOUBby^I#N P 4Wu(-Uu㪓`h^ʫCDTWtUUxz*2vNCΒTTW骊>&%-OggS7﹦01%"%%#%$&'%$!!" %&y !""(DWd#0ec8*xV.KZD[eVyVQ :ؽhS c2Tlg!uVhn<ɇBr8-ɾ 6-ғA"%}5LF%D9iҲ0 jݕc>G-ŹHay9-anei'KTȶ0 da!+)id4Zpne}-#>]2SОN7oVP;]Z낄&nFH' ,siPαi6:qvcØ+{cHɨ`غ H$WejoF YOP![Qh"Xp|n&2MO'qA¨Rq* FDF)SyfN˦-uS CI&+^9KA_HH;| n1ϺԎlM$nt^8t֛mK$K_vXBƀo[};e.+UODƢIIB~V;yogN57%7^U^ p"}]A.T/ &lT5>Dn  %"-%R4ij. ;@<%ۺj$ [L5LՉx74=rm}IOL沉\}[uDH.ph !o{( )T:OvL _=tAVXV*DA@xVM~ZM ( wjy}8CJMu2W֦);ius`k˱WE_tk}͆u<c( wI@q 7R,~|E@ pՑ@Bt(#?tL333u:/o9[[WQ&&4A]V#,4oАht|(JU@BiW5I>IX-VIWz`GM9&MBN 8:dC\ML[e:t0"5iI50\\]ܪ[0j\vEr |v$2NE@ tODD57IBJSɤ)vuGNat}`8^j$IU oҔqWu^32@I, R8޸晈E(ruSv**+D|.V[|#,77 xN²R!m"V͋2@D|y&[/=3 M`ªD M(@&:NjbRD\r%H׵A5x!Qa0.5I 0t늦Ai?b^Il<%#c2KMD!.'9^nB&$ Z4`ŸBQߜ 'ܠdb.(4.QfS-܈rvy⥰fy-?^Q]ҽ53Z #BvY <^ \)QE攕+i&r''uN2EsH€næL '+n M6YiRa>PnmXss2Ju7"- IHdTjz * #.h\\94">& z:JDF*s63i,tzqa~/1- S+u ;8'z5N+u4' 87ñ{D] e?t9n~'wqOggS@7﹦0"}1&&&uz!!!#"(&%$#%|  !$"lc=1LW]q,3vas|f\eSYYHIY9y_}C|N2l나Za> `m ֲ8`n*z_zf0 Lc5K`8\}XkWHG*GI뢕TM-/\h-77"bQ \ův.85 ""t~!{:s/sFjtM}Ô=CpC?֍s5X}kp@PI9DX>N"fv) >aQOD K:XO4w,;@dH Mm[wiGe MZU851hb|N;/!mWߪq5 aFmFۍ,k>Vr$H`QH^t @x۠1HZs%ri`Y1=ڹe;tLm\6#pIP|qLC!PBU*cQMCܱDx !p'2XjdN7[QA6ӮxQ <0$ȌE;.M.h|tGD+ m@*%2 T* ~Ndٱ SKT&G$;JtyCC6Kn 3_2[h-T& IFuqt4h*2 0ʈȌyzJLtnT(z-(2Hʊ Zs0B$Dto!cV]"}kkA0~:WGĈlQ;$?Qc :6R>AP1,Gh(&˛KCǹd2i> tHB=JV֑IJ5 r>-.@ oz=8,"UD4QgMɉ& Zk; %7| @@th 'kꦡ.+fH .jͱ.V$] $u BWA!‹V>@k~'""1uI$͘0JLx\ɣaz=7Cvlb&B  C١Hlu1 d(Bv/jαh˱]}n8D`_p:}C@ϏRًWZ)mFaN?oW{t("bElf)$e1`ʂz`{Mٞ^nIՓװ-wָe"zi[T]3Va5L}SDT]mnR]zϙxS蕛憦DW%@;扑rΡMCtEDk. s[ωz+TnPfD~Bi<֎\KS6\Ƕ4/ D?I/IU:J LcbDm6iIHNSǶ`TeJ Au@!sOeFnI#5|3Vݩ Z 0'RQˬSUnڑH|)x8r׽f{%$g 4 :^9r8 70 =sVG_L]H3EO-ݕ :O[=9_jEI܁thq8&GAt~mL؞_9IEbt 2ʒ}κPNtrb=z GGuut'K uBE) dHT'i@!9p'6(g"L ?k@h0ʸ xe,j!ތnus'9;gtqqxHu 16I0? Ho5S1;r`!d5 ArU T@)L,"Z[#"EC(joBFT)T({f>k̼D&E}>v&$"Q0x+jAH*Rq)StVF8C$UZ%=,/MUu㦘uaJeyrL+"&ʛr`ǖL"J ʄLWQ}#j:,._6Q mFچ#TW + hOr'tuB֭,>ܐD\]ë+ndk^&*a0Jd5JbPLW WW L[|Ȍdj+pCJ4Q *&&?}ͯ]Aj;RHu%LSLQ*vwPj1gd]!b֕E$쏠("%Lcd2=zDiyKaMͬO: R"1a+ AJ{ J(V^2d4cHiqvQv,MAh1m31!-EDÇ*q瀥o.DYI|'ps I H*X%lDrS1*^B\f6ݲ 3G]$q5:m% ũxU̞s/ޓ;pqCЍ{_cw)+\Iq揿쩙04>We뜍+ QMY+ݴU^U< SF,_4b\ "mEFNÛۖ?cy'~(1[2Ƥ̥2iP>+vvߖüO=q˦-/!Od'@dFBӔt집mQ´ R1!__{ #J*>le@L1V4e5?>J #my|`ngM jqЀGnۖ+G]1a?zᏨ8~-SXc<篽I+ Et;[UU6xT}BXs4a!`6,OggSM8﹦06%""!!"!&&{  ! &""~ #"%%&z}y#!"! +^!` 0ރ&Nb\%K!L]æ 㸌IWa\d12ll>" KÍ]yZQYǷ䭊Asߵ% ]J߽^"&@2r$$KxvIW},+"Y_=w=/( +V hzoh}P4 %k 5PLUUpՕR[HQۚˮ#ҢyYR,0@bXS 4 `FaY"F,EPn=>7tU4~r#>vDq4^8DhHxa|ӉRvUbl$ :ㆋG*!Y_$@-`V4kVnj'l3"Z)" DV$!찊JXƀ'$ 63w-؈4`0lsGQ aSu0׏?_-llcӒz%rdȄP+@``?X ]cu &^gl ׊jk`BK.6cٳDx-{Y"vs=2#TU \)?N+ȍno$$>,mBǮą^xN& @M~@ 7PDvmԋtY`LJPD(Fu)X ALae*c%ZOXf5L(~j* DY*K°lx]5LYc\vҸl[q 72 GW5Y:]W DYu+V@'lܨ0*@LSYU$>̓]r.Wq՚7*ILW)k quӳŎ^DWeuUV|s("Nñu7%da}W7&"__n6.S#v'\gda6hu2K>j}\uY+3:PD1gìx@?,*,b*'֡1kQΣ堦I0Kdș͗dLi OeUԬ;VZzTR:emÁ,5p1O!)0 L Anj9NƃPgpnKs`SQMޝN$o^ćy0}"B"Rr2YH:v/fG1$[ M)02($j&2IݣY\ :O.S5T,zFΌ&BPD^)c!^WHUoFq‰"ГﴮJz""xQHL[N0♞W^%+ ?2jFFBz#00d!xw v%4;GJ Y #" [/-YO S*CX8HD9iZ)aowU8m7f&ޱiQbTT`' J\`UDXsѽ-ҜV(XoLaQ8H rlL;=8;p҆/N&z)sd[A, 4|OAoġr߳NA-yLnCMn`TyiKؑ}yG֊ƭqSz3?P\aklMdM9xt3ub n'\Z Da(~˜Nv,k{A5ٯnV^/\@ 3]x )*QVJzߎCk8SHQjK0ko0Z;\u6e%O4èkgIzy0RM4<'wm[nGw1;؜6].G،f׷kH6;Ml} ٗkh"Ym5FVAɫOG""+OrC ܜᨱ)%َFcqED1͸7n!nqضq%62]Okyr~,B؍6vRDX[u>T jXxT 瘞(MVKsc`2Ylf@3.*$Q C XJT)G&FM"˓%9*WPb8>D۵9R'$"reFNEc00f.{iKFJ5\m@.mʢ=*#|MiLW7{uSkwϹUJb3Q@q8,dN8P4 4uz^CSX:i,wt0'[nFhh |I\%I,ܬp5$T0͍en(.דYqS, %A)(.AXG;HZU6|"Du0tivN-T${h4OxakR $ԋQD) hQ,n|66͑*7H6)W KRXP[$ֵ3+S p]ճDDivdJ'62X<^irkcCw~D( @ T#ckZKdRrPo:9) z@>KO̠h; - va0Q%^Zc,Lwgw?qrzԽNWPA`C j8{Ӑ2׳Ga-Sb<I!%sma ^k&Dd 6EP/8@dPʲW>Mq+O?%.yrqk;h(~mCD'5(*| vbW/iQGTf ȧ31E M Q0VEE!$("!Q ) wLcj}f nQ$I/HVP#D o}AsC!Ԭʪ[i }kT[Ayx E9bT:/㮇< |E=P4 8b:ˣhVe"MtT pBzXk˹eWb={:( &Y"0Xs~lNvq)AO9I9O@'\ K WJ)Ph;ߕ 9c%6KĢG[VXD mqw.'oca)4`I\ ,+0. /0Pn\J%70AXK;fZ, e'q(zJ`}a-M)q]lye.)"ؑ=s*rVHF®KViZKnh8E *8mXt\"ʺ@.Q.V%;"V"Zv*FnR\OoiX.$ܥzϽd*`0H "RlŔKJQ5HEݹf[1y)"ʊ+ 7D.W@  )P0=0@Bv4Sl(GS' {=-ŵLSIUu2*F2xFFKͫiWRq#edYsĺv>͞|T0{UtpٳKiB|.*A5Ř4q+ 2%,'9֧[nwPfP;I|/Z@ÈPR@@NIR ~4B |@E_ 'D%J:JPnSYknգxh^H,2z=Цj4I ^ٔShL=X{S| ٥]VR| I@0{6ӾQ=M>*QhYa. .+ڲMS}_a' F=zz!Z_1_(ѭWt20 0ee9e"7 H^xw(JX3HR,BJTẰp,=;gdx? ~Y}ji6\YdWȖD[vlN@& 3& R xО\j6;TK>z=B[, kRtsu5VȕίCd[>=4uu=Z{N'ݚ=3Ǝ\[Ɲ%9AF$#L(ޛE(A`4FAi"lsʻ?X1Fluˆf}h||J7DͦWe U@9C}xȌsc|dizْyccdz78O6ţpztC;41^Hb xLn#~)j~/e:QS7](b?|"Lu@58+2^|fݣ)v&h6W#ѕ:}"4H2-ʈNX+_1soӫ]inKꢿÞlQ}'|k8׽'-/@Ď4ҖHWID*JZ/<6S|xfSxh]ǔi`yڗxlFɆ؟Mh01n"|VQF%=wT1-1'uI͢(6Z%CZ6Jz0itiy#p_JRh^v;u%9d!-!,.!MJ" :m& rn$Z7a: %a8 UI"2{7O|7BnFhFI.*2DR*TphqՒҀQIc+_ 4hn23:ĘQt3diNHinc*, (MBOnONwH39k.c3FȎNJmev*.5 t_SܭA[X-[Lj%lfҁHdϋKU)!LNDGIdvm^d-S'_yNь'ȶdF@{`LXtb*5=7sŠ]E] i܅ 7pE(|6N7v &~GQ9uҽ+pUafQnH9&iuꩶv_[wC@곮j#q>>ǐn #qKZ2BYbV,  \=yQB7ތo -[r8i1^>%,Ҽ|0 d:Uӫ "]EDu-I 4aqIt|͟K9Be%\EeZ0o"~,֓ek](v@[ b(V*#"!Qjt2ʻaQэC#چq$H:;}WJ7%.`-tl[@5Iv$CswL ? ƬvQ~92#TV@~uPdpʽ K[T.X.$]$NKfmmR4k $)!uKw~]čcSNRJӳe곻(B|1TB\=ePc1tn NOggS9﹦0'pE6! !"&'$%#! #$"! #"(%&}"#"! !$%!QI;_XWZ8]ʖTŐZYqS+?zuz,f%ґ ,0~ErtdU`|RsQ걛F>麞钗&kӎKxlv1ΆQ;9)Xr+R)0:ԯ0@g ׽'wE(B)EB~+B? m5 W~~nHU[8@~QeW-!Yt4Q/nr02"V:n;~N] lP|̣Q8wׯƦS?)C(kRDóþ:c]/Vx Q/1}Ԁj0h)~ݮјnq F lEDe"S;1ElVZ.7zxQ[HpWƀd,&?\m|Ia YQMP0EiFBDg%Ns@Bn~ `iϴ&:r?Q"VAabZMKxZ"kΗm.i8ymD(M9rFP7Wo՘PB;U"ݣ%O?VRJ+A*Xx [d_!h );j*laqK I|9Ѧl:y #\ST[ȩR3@J?@."LQB!y1ƒsY/+=\DUtѕ^P%KhyrE_c)T[UWY:x gs\^t dg,8֖l-LE[rȾnh<[6V NcaYMB5YS PFY#5FſL1VhU ?Yk4:&Ǻɤ&4pZr]:4i$pP$M/fpe=^j=x;oH&;^=&sQb'@XE9:# >ns8C 7S!Ϊ5Ӻ?S"l^ܦ㙎%v'0uu5fplkl @I g}n3m-0 ӵw6䫪8*E"J.3D$>nK/AtkkSiWRJD"T56_ ?:a˽~TNOSv/{PV!-ae^7 JPF3ʢWD䉱$>úTvKP1<E(ܓCqa?S"M1C\4:W2:\|l^bZ]Sp~b&d JM5^ ͲaaxPN:Br7F0! uP,5->ETxkƒG >E\WVLYQ3G![ZiJrmƵCp[LX ` Z}.xұCiQ<4{)x̰<V&E(<ٞ>A@ %e׺J4тJfnx=O *? D[jO7Ãy"=uȟ')\a5w,( ]ͫh{lTҦH JeTeF".0kv':|%h 0`1+Nuoݰ/4RHaj4)u4h;YZ*̎ Ŷ 6b,X y?.Ahfk bγxsosMwGY|?:ow>n<&:W,'st̶ӱyg:ǣ!}>+J1Q >.-^Ҫh ӨTD<Κ&514.cgee*m%RMtc hgq0Hwʯhe~M//g)MYgk_ .c!\ĥ ?n *T% (@>vFY!;Z{'= V}R$1Be^B8ϐAF Kp {&7 N WVL VNOO$rXxur#[#5+6, p+BfnY\g ق FӺiөZ~Qҡi@` , F؈iQpOwIHS݇]8"i%OG4^4mv]N5` E<I"j$˱Eozt'WDZs>n nu(+:na, ]Ghc L.^\N!|pͬ6јtt(<(_rt A\vz OաԢ :ĕA9мuJk+z;%PĔ@T!èkŘKf4 &ں-xNVi8qn\L=^(vba<}CG E}@vdT0U@R}Z3%8qK it/) l\h+rTCq l^$Gd+;v%rYPK^ZU2a{6]aO5(-kSDKY.W =eSS(|2mymM{ Z, ś?=O@wo55Ez[;nkov?7.,PNeņlh3fӛ|U>ujvIf|p8ݘcw3NȝFUi&m4M  ccʊbwx1{g~߇G:췕9=Fm%{ 5Rz}jU>ܤO7+]+ \͠6Ff24JL>e:4;,FRo?ڜŝum)KiI;H$R5)h51%⭚5Q*7$%.FvTu5>+&YdljŊin9qy 4bzĎ y# 0ܸY'nVf}ڶa& vm}ϧ8@(ߧxR(vyrej{+κ\XJsҼ9 ɇ޳yֱ; ^*jқ0P.i)B o3`cpGddKĻ IrFb(q/,QehbX?83z_4_P=0\).7"4if?c,9lpPX"TW 7EE<سf`j"$~ ڰTgquFzZn1b/% 1Q o-3^ 7&<ݘp0 Q))VXn$?>Wݨ_ߎYd1.PjGLAA\.$j9(׾k4a&?ՄB|P5?A>Fe^N(@n,!.08%e?JIJ -ʌ 9T$g0ҘO3w% LJ7 Go4%̠DTV =5faȌj]F (&Wh+}6Qpל;V )}ݶ @F*ӄ W@h+Ro['!T[q 8Y'/ER\]뫡Ã@[:h&~FMk^L]eS`EO x"++ ])LYWln.gФͪDtōTS˪<|8!o4MiEm=G$Zde , ?i@;v ^SkrTad- I$`wRbTn5ʞQ [ LedRU`JIW/S Z E<Iө(C"(B!Ch/5X/Bh9#ڬx\tP-oR,?!hmIU*hFz [ TXmJ,Kus ژGb~ ^,Qԥ HnyYޜvub\"U%BPvU*4Q$I(rb!D5f;XzvvlQ4h;hO\d ]VHkAc*E`oK7kE`6+2Ԉ I*% n~6)ZL:xf[MF, [O4E891>w Rc$ #HĄ_p$[W4D dXAe1N4 }v|Z|Z<{TGq@"Q.9 )%590ii^ݰ5wˆvއA ,35cqT,&\ 9,g**l D "dW-aUS5F`&ieQ-$d]QBGyYaZ;RPGRL[qV$PDKަ B&8\W*adE ~c$ՙk" TWej lhvyS'5c%"\YqV٫cL~S6Or1J\a+Ujl!u,on;=qﶄ_תTetWY> X7]myXy cj 0=(0k +~*!YMwUӴhIUUچM.ZHSEC q0)./5_7w+JB 1‡u̷QZp#afxﺟtqc?0K"W.chӱ&H]'RQ 04S⹘j\Ge0+(AD$q'"w;Y p*}b MFbۛ$5-@^H#h@Br ^޼. p.2uڵb=HetlfNl\&㓅u#s{= 2A P'k İBAE _5"X >Hw\>{ hqٽbpyŔN،%LmҜvvZ6 +pB2qf]l t~q ^q'MaHcFa[-hPW֜*&DzU K_ } EqOggS9﹦0+S. #"#'%% %&#$"nSB_ !?NHgBryR!llCH!Ez װ4M?|AbI3 ` SUEة$JxSd#8 IP -]~* aIn{Y#;c M`;Y|zBeiG1k1[/[2G$7Իj`7Uv𰐵NTD7Es s* `hX P.$Ԁ%C>.vAkNkE`@jD9[9mƸaEXf iExZMwWn{rW_h)?9wOT΄GJ;M_j-d*gUd#$ʆ[QfpE iT] {x0ogG˲35,#ݪ <ׂMՂkdj*Ƴ?=}w bKITݕI ٥ܻt!=Y4b"n! ^;c f#R;2\A4ׂO6Ã<.$M&rR TUj8@r=]Ў)F lRDB~(Uɗ= O)[V:sq T_2.& Ѷp=oP3טt귛)DcL 0:%I &/ʔTfaR[L [sw0CfB6)!, z18yً;[z_byqVGӱ)f1ޮdt*q `C4Q!bjٵ.b-4- GܡԢ0U!<^#F P\N`6,sT)%ڬ ݐ\>g(>j71k&ڣ E-:<,Q+>׳?iK{vϟ/@K W"dj:"X$^ˈ >QO(QiFElH۱Xuᐻ4$*Bb%g}!@ 㺶Qe|Rq,[综Vb7${]4U½@vH,KwYXhwEGnT8/ 7 4he`?O[k+ѫtJt*0{~N)klʵ9K.=HjOp y=EZ30.PPW)%08NGj!̚z;U$DT)(T"^gDSNU*4ӖOK|2:ú l(LUU@WVHH6z4-ҨJ TSUxrHsmuB(LQ WW33y fZm1*LSLifd+<4J LWtW V%A0oWͧ0v&5I"d]a%>׊ VFݖɿ1vlcm hjWB9G݃*;z؛)ns]N5Q/mZ"E?ivdeK9 t4.ius7Agi'9S$; ]M1c%i("?%}ՁEsȗPC7 iUL z5s/D& 0^ ;LV)U8yKVs"i' ~BMD,!^ .cY&fj k`9V\h4&h&IKtŹM/6kuBt.(i VUT0ÙPs#Aa:{aPH+^۪;z5 Zn- p_+?.=, # VDH+JQ%Ŗ#H|N=&9`u:ĢJ,Xzf$i1&K%3|ό\[YIϣjLd@3M & B@d0OFyxBFŘJB+ B\ߒ+es+$#OdF5gE+Zb~zwk)(Bɒe+$B_r֞8~?: x1"-w[ W lt@UA _Z9da2i ] zpȩL[ VP6yZhHۢ 1G\W*L\y)늩,E\U*r YC/̯hTUqjlHp1^$s'[2fh\WPLʶy0qDGi;j%Q%dYuk3e3KoH o91ܨT]K-sw!G(7/M}ü~l_$*YE#3FwėeF wfz%Z1LRF-eiP,W w8sZdž}L QRۚԢ.^KbC]{s ;D q&M=b]_~cnt~ڴҳݛlǺ)bCEq^cR5B,)fy~!EZ^\΁aRcvi׵R6jѲ,E:;0N^Xl4"ȌYJZ2d9>;V; Jv8̦T4A`'w΁F {kC1ܩ썥;h}j)u\{2up Z5MZjRFGBPv5k76!s.)ʔ'4=ε65Mv{oUJٖٶeg߅ދQ(f(pPZӡJ7I'NؒΧ((2Vuvz1fҰh +I@$b%yo!ot>Nja#S"ø%fs~4<% v[;Íi~ BP(ZFj]j XLleE8@zA5 > p_#_`Nĸ$my438'̩5=nqI5;4S5Ͻk^]s2PQj2fj6~:nœņ\4;pGpKCg0!ޘJ %Z H9܌c >WN=ӡ*ŕ逑cp, I4(b8qȺ+$[rJRf, uv_˺A'X*?=U1"F Kmˑ{Ӻo^Ӌ}Ii"2= 8cSp.5;7a%ҘRC0UA.#c|v݃ՃUA׋RkRٵrQc?XfcA"p9!݀&iZ#*1]b09L( H#dyA\21R7{Ua|&};UFFF̾L?[Wc~E1* #?7<-j畭rB̎ ~@\Ӣt";O쀳ѳ6rcRu~n휌JJ4ݟ2oWdqEܛ=;-e89oSzimMyDfLl"qn͗,!!MJ`Ex־PM*OggS@A:﹦0~2"" !$#~#""!")#$~{}}#"!#!!&$$~kvsr}A"`d1i&>A"`|~DgTX/>΍f:,'ܽY?ٖsm͗]MX|)빈]VM5]ZJi7IIr0.fiwgGJf[8TӹܨOXcZ͐ɾt)> wZU*ZKJ( M>YL_ ƒiU쥹BMq픫Fn׽km8Ԏ>f'-h^$.gSuv4ԁgdj؜gDue'Х^,LM4R_K5fu o mޕ3{clK*sb} q| ԑcoMO?{ʁ+WO>%ft ~X{@2ɬ|~D$A. )=I  le4NmL~fWո`4L޳(ZkU$APIUTFD- r "-N"TmkbqO` Fa봳h"؎ M7Lbp`wRN@:pZe2y8g>=#}dXdZ\r[{y0Q?U,V9X^^2 KA $]{6cF>5n0̙:b?DLcpfr?$M3'=}D "G]W: ife{JO-BYcQ7H?1C +@%RrH eO >5I %u: 4`MCҜAa{f`zA;!bv2rer@@F!1)uWvW?zJ~8z|@֛+q"V[U "⅊$fFPGn`.qS|b#2![„]ӟ(&&B\Q7Gqm kM^˹:S.vM`#By^Z!_eeD niزGqF͉wn:Ud%D><"^IjY$W~/aʬR?DDD e(cqȈϗjq_(.\+oSaU4 P!) B)^oϸ`m/-VZn&)y@_$0< NstP t;X=&z^F.FԄKv%ܛh"S;zݵbQK&C-i@[>})Zi r+u 5IpwD2><SUŒ*V+<<871I*D,Ot+ U옒zߞ.mZê7Zx =4['KCd7ȭPwPuGTO1]P;E͒zclSV66XYD9m/nBvjG E=> j 5{ո19<C*l*;}>-I ügtr@i(9kf.;cq4.hX,2shGz?3BJ*&TF@ \p ֋e%T;84 F!!P4NcJ1A u1 B/ mz\AsA^eI}mc4FSwgfS qdO;V #Wdr^K` E yCt@p F%F,ǥ~^zvOc%9 r7Ie3 fth$2y6.,h4( B>D"CP`(|T UP☦˫, :0Tj ԅXEy>-uץN_EqR"l椦MsISj}( scfanbIƴ-L 5(K\q;ʥv*q,GD|(A`Ǩp;|) > 'FZncf;^BF gi"ͱߦ [7: "lC.Kpk rs_1brW?Ƒ#,o2uW|nt/w^-3|s{{|s@"ʤBݖCH'$ 8;^zEld45/-v!%@ k8J}||pY0J)R_ήqu&3 >m-`Rz-L_+@^bnHzŹ L۸& +x~niS$j Ch/%Kp<_. ~ŗϐ8rB4YKk'损owcxITrfWB IU5br̸E}>zcM!{6<̈́KF;=^7 OXt"La<TfdAXvx6L/4d#TadjD?X07Xmю5iv,ܽ\c":X5?J.^ar@۩b Р4 p[ѡO%"Je_12#,*1aP7eMRnYO,W&=KIUS^fքbA)$8o9/1R7Y␔ۺ5R ЯVH;~\f.jlYI"N \A(Q,t s,dۉs [p_.[YZE{ rPFE4.  j`@kRWn/$uF&7(~l6WP *xfނܢDSเ.@$YĔZ;iGNqC6.>zQ;h??Qp >" atdR̕!2XAq)ul@U{.^Q}8^V,Q"7s*1w"d"Ա[ *0>%]NγT\䎗V^[Tv wfapDpȬxvJxdk>h%c TJ% > LPOggS@:﹦0h6! &#z #""$&$"! %% !!&&$DWL*uίV-'3eVm%XWuAa\YWVHW ~gfi(LUGWUEUA<դdb"/)23F^ DSԮg)bn"i@v{kĕLSSI)*, n`2+ayH²TLUIQUUAմJx$s1EFd[}@VU(`zօyڒi!{l lemV{Z-(74oVxTG1EuPFGۚ\/ Y(eFY1)@FJC1y6CVJK2TkD^7%;9.Uo;gVPWaLpl (t+Hn%;X!h%$nЙ_k-qE4Za! ˎ[s!m.`<fsn5GO$lfs$ODD$S0kIH v~v9%yyN}z@Tp68@ x21 [SpWr7q/ʠT\R%~l6)U n9fp]zF~!٠CfLi~_| t [? *SenBZV#Wgb,r_]"*^ ս, [-Ӷ\hb_YNeD1>TKd*H%VZc]~um4}]N9hvwC E5_(ΒsWUa-8' T{?"\(#iIHE\0U,Ot"`5%pɷRyLQi 6y2rOt/ aDTz.6vh桃3itW)|DSBO*<~i<ھ$=y/Fu'͡Y{9YR]=ZMմy:~@"ma*O"5@_Co:r2%i t8lfQ00LFJ:L~impn2ݴ]&݁?_ӿ1kt>ګ=N)s(j[]s'uЌK*^}.ECb2w.Ձa(sDy!3^4`Npv|ɢ խFN?edL'jID:/[~2r#54zz'(cUZeevWٷ9pi1!Ld)? 6E}V(ġx^H¨:ODrBj"mٖYSds0\ `W}E(￝0Ni4ç9vSl*gzŒ=u^eP"12bd.!I"2@ Лe^c2^`ۦBJ00H45$Iv5s${P/+IQћ8K&^AwYK,XI!ND)-B9f%huϝ;<[@EA:XR/ o|'Rru cT( Jpa[IVkF\F,%D!3MO\.Ŏ 15D ]_oo6ȜM?j_~%FB ,QDj"#RKQP (@8>_R3A{Ru0\*\Y+ kk}ɆĔ"K1FTW*̽=iO OXF8j+TW kJ|K@Z>g_>RUWLWIO)@C9w]`nAAQE DWU&Ҝ+`{r0w&ZL'%Efv{)1o#̀Nmjg M >Nϟ,ʚ""S&"d8C( (Ii Į&I%5]trFkfXeʱ@ԵD`ܘHRuS1>aTn i2r~) n~׃~ѵ.5(Wi@s J*]c5XSa>$~ݞj ,v3Hq]ҰhROH%Vzs dtGCs#gi#VEDf+E+I[Ei!"&:4 hQ=ҋ%ױ"im{ VAhq| @{H'WvjhoH-,$xqɭ`˅: #SD4PʭUV\ Qcx +tD]BSWxp Dl{]%l_}2̖la*=BM7C1#\T_k4_"kLYeOUUE3Y[/tިq&ܡDSzMa&k;R˃ZP SoPDTS0)=ucPG{W2DITW˚YVdg t%A1A9n)llcVfO&8lIRG]x%>d_\gUw@HJ=,SEN<|ޑ(ŕ67P߰6DRo/kۃXd^><[Z{L"ke! C; tĩ/eHa1>@̌MG̠ڻ1=yrGX[k`()bpE\OggS@;﹦0b| 6!!$#%)#&$~{}#%$$"*&'  %"$ #%#kcP@C޽k}&Ж9 Q,;0Jt""VCfI@ؖb(2 /"RH(ҚXJIb@lI =s75uHus1D+)tΠ-X^AZ& zPGu%*̖d/Jv. H< d('v X:F`Yd%3ag6-HVA Тhllp ؒJi,W 7 (( u*Z0k9zR6)Щ8Î^^GXP. %R'(%m2SȟhϘNzm~nW}Z<(<03 ,&Bm.)%dq3 K29"]X$PvŒPQƥA!YH#E)y\˗fL/,4i&2+NTPG>ͤOЮ)=I8 #j!`EҀ nv1ޘ \j~jZ$@g:px.H_Y QK @yj֑4cjMye|DdId2` ,eIV^XW4UBgu#\xHA ~rr<.b?QGP1 T۠9e~h+@*(H0@8f :FE0T 8BTAF mHIkW#1^ޓ[%zu-m5Vy.]@ԄQ>&b-ufbB$ !]R(|{ hRBr%:U2J /`~~)v?Q/cŕFWQQ\G^0-P%F4U7Li/5 :q1 ɛ|?R;JS][YTlnoutuas*Q!^@t)U뛄eֽ>sss<~U !+DR)]>:V9w>.8%+ k6iڅaM4 km L/p}ơ-kQJR-p)>YSt9-;~7S3GFl?1d{ۊ4 ^+;!yZ! U$j ޗSB^w$*rW:g8J#Q)8roK1qCL)܉ÃOH1P#UZk+\cxq]82+3JjqbRH%<"l 9G ?^xdGi2V3qcL$KGV=nu>)#2{NSkPL] D΄`;VUN\:{\BLctEQZ=|mƇi #q*Xd콚 .`& yim09 %URr< lZC)oJ V;5B.+A@5!7+CV2FƍoΥ+e,Ţ}wm@G%}X`Ny؅:5nc b(gcI@ ոahYLrHJxGp`d'3 L;^ XWR?wZ25{g6 Ajŵ&;NPqzKȀSDrCqBpƕ,XF*ENF`rq% 2:]׆S㱟e6Ͻ#N2Ὅ葐1 OggSk;﹦0L)|!$ # #$%|!! !(%'¡E0QHB)}5*妆誓5#n6m \B%)pbamFDOj1j ΡQ:\Q2 RBHUiIq~{% srD0F~$Jm&^.3}¸\l!F2/h8T"tL}W+ C`xH%E4ޑG좖8tE6&v(.!Qhދ%z p#фVfHpeus2cA } UKU-*$Du;u* `cjfSSi<L!\|5вRN\I'.~dF!t]s=vͣ>]+(~@%^]c1h YFu_uф ,_>6Y16KvưF3d9D漠S8xO,<DIPnⱄB>\q AiTTdbKdJb%X~lC%ԀsU'd(r,;ȒHyG}uuS[FVdLcu3Ǭ=?c轮v1oa;]QEJ}w3t18ǍRBDTP%)\v̀e2@~LnșEhܧ̶bӯz@nFwn~DÙQ$)xrry %ƒ'} FJfemk} JTH*Ĉ V;^S0M pZ52E-b~uB`7T.O&J/ U::o{cdVb!iF]!}C^ ib CJ2Y⡹BM;;d.7Yjecz=_xiHsRV FEL]**ڋ|pXj˙+5  D[LZw~vyNw6Y yhS 51haMA%U,^*FJdwZ5+2r#ht+_R˪|]Zk4z ?7~5emQLf5mc3 C&'9Be@úa)W1̀ )~Qb$Rit]%?,_cy[v|ۀYBr!i-@lbr1l>f΃ԇ IBN(lFYE ; AR.+XyT*M.Kd l=Rf޴,'m>Q>6+ɏ1%"˝OQˌac_n7# 6@@ȅX?8S'`@OK PUۀ#\H*aQPA F 5tWV1>Qڦ|g@ Մ`.jE Jg( J*ĻCb'KMXUq PLڗGPjAqF!s `.u@su BqI qB+PeZA !iV(\$F/V×1=8FD;@ h\-@ h %%p~,Q T-ړ{Yv 7ilm0(CP~p>P^;BIwaLDU, ~4|.%WR[EAO&:։131EgQ(g @c .<~ jG*vDSK"gnEAVo$Xs(9@Ta \ETCআ!g3ܺIs gMp0461v^z==[DxBnY{u7x35j~;yFIsJwӊȊ$ѥTi"%GOA#0X/,i5Rqx|X^*>,[(?}h1!Z]_mOzeiOrþc$RA&7\ IאbZ uy4Fz x˜UP&FֽhSgp<u[6:[Ba$I;vQ_`Y4YUjl'fe<DOΩDI%T[qh+@7ζ`pιۮqhН1 (.TaM7Ã~tK;є9BRͩE$S TAyگ _;ױhjT,QLTZ3뾽w_%\NK m\}&,4Q$CˈVqZۈ;EߞGMW\a!nzxpԉu}}QL {975lgV l[2RIc\ͩۗan<6ё c":HE٠8wBt⢳FnW˜4׆sMh$2cA~Kg'wQ2k|V,[ْ5'Xx=]{OrYUBb8r=?Oat:ßڹON1⦜~X*r1RЗ˺;f9`5 tG@Ӣ/|K޸)(illo t,$2^a_M`pmPbn>nle~/<~gڷ :w!}4 [ZzsF9nD}%I)d,]|V_(TI(̗Lt^}7. x.EqQZ60 K7iǑQvBMv\iDXĚ W;(\R͊Jw\ 5 b m>d问L=q6NOԳVvbpPp!q<nsÓ _9Ht(aU~9=!E&cӱp<]2S#s3~:φ%ikl XPs?ٱwD߯$I~٧G֑g`T'ۏ'vt޴@p)9CR2ȕAի6|vS#lO&=`>;[TUi3U+\~Ruo$F#UQ0TUeȬJ\UӉA^ӨDa:XfpR}}RD48C$M2o 1^0Fo~p(YJbz{M0fu¸1:D^銱e7;"A&"$eԯKD530%݆<3w6!Sl;Lws:3^Hqh@CD.*lj X<bΞ=G\\>Q pYBB5iE'hnY$Fnn<dzZMG8PmJ;]d91(HGA$N"4*ܘᶑXZu=E)RD>L6eA]k %+YTD{m&} 7o`r+FOs)|$;Hve(AKFZvj}6/{`9З}8 whG"Mb0YBI$ AhQ 6;e.agt\ND-_AFֽedLP~}S+"zdcURheFF_EWAcf+(l׎Yv0E@,a]͌[Ր'*LTJBٱPorӀR4 ctPYdYÃ- l6ꤰV8<>_%ZLX( ,WWQt f!&^L;&. 'mʫz ‘A-#:vS_JyΓ>BV?R {e^RVB[!R $Xp)cV8ᱦ|qqL)N,:ڌa_l#ִ>+J PoVy~7~E"c8R:\(M9rq 7@Xm3#c{ES76šEOaujW?&i )gy\3ub] Pvl5PwkOa,?paXeVڱw>&%7 \|:+ Wn,*)lA*L$5Ņ!4:82DYué 9ywa,"z[\7e #O)RǪԮQGCb?J;OoSHY\Ў)&I"<6 + F~|lc0b0Ia>P!QdQ=UkjIOkY?ٍa]X_Mӊ oJu VF{f@غA^:--jV8i(-#ۅB& xJ6LWYM6rx.AE\ƫRDUqMt9k k -*ьn!ޘ &M LQȧÃ!|E tRKP4bh.ʊ/߶^ޔ)LamTV*,QeœgA]xE3g{1_+QIG,eky.<88#oư6W?J/'LYUP镾+50ǿ ÿ޸leNhV&p" BhDHZ//b1Bl+.glk!` p/d|k)_|d6xszv1i pd+I0oڳ96bn8LpF5x0s>ٖFi]QNюVBbc|rbN$CzJ7u_i`4>M=Teh,Fywx$WlHM3^%2 E▻ĕMLBc;ff.ih$L5$1[qiL'SFmhbŲhh*S=3%?|x=a;,u톙vvʿo~|ܰ&惀2Bͳ\Pj0@OggS-<﹦0o5 ! #%"""$"$$&å$$"" %%&~ %$>ZʕpHh vfu\]~J"r%)N2t8εMҮ2CBG3T"PH*O$[͆i$% XpwgP%Fp]dX <6=T;=Y7 p}vD gS"Dh-)25&JN6Avͥxb|GX2Ҥcc\WRXN\^.o)VI6?S*DSJplioQC,IX )uҨu smW`0+7!BaY© %w|hS;Tq!/~#4>c{]>6].żO r]g>7H۵O+ei=" ,x0#j躨+h(X,'_ކ_L`^|v1exgjOLvuI-\46!UqC#Tn'f2rR &c HA@phucQyg!kYuQ( `]/Ądavr >l~ 4 c;sUKvsx"B%;Mzk#]@ƢHFyG;:zzJV!)C+RE C28]QA!Hw؈c`(! _Պ{D[ q-4( ejPLSj&RfVP8~/zĪ[q?%"mIcWi-5qdMԛ{ Kv(Xpz`V14#e-l[ݶ7ÃS> MѳY5D\Ӹ]D`? JfW\anx OjM&/W;55I <׉㞮 Ęg[ N$h8T۠,M{O61}8a`6xBgM7J!,KYjle ¦/f^nJS+\cX98 थ1CA?!sZ3\gYX pߛ EL9*?Zʻ~}KS6Oe&p~YDe3Ud]NBORaNO5>6=a0͒lj 4yOD1ZIJj=ti-E:_nc|Z y`4kşOHޅiAYǞw-拧ʹl8_||W* B 7}'s 2DrDD %lŔpoBrxClbuӗoK3?Ejp;R(!jH5*7証Kmgymb{CE[^>4f>͕* Á .mL:q4=v~x^!vT5lѪ1>&8:~p&w7CeHӵ5=N(SUN>Y8QkywJ a, V ޜV~ĥ`sZWRUGf0 m!^늍::!(4̩zŢ% ޜT yZ[5X!+a5񘚛 yƔ$6f 1 h1"8B2DM d$!]٘~NHԏsC=7wQ)O 4VtKTzY\,q"4u#^i2fmho]Y?<ת})登NZQbUzmp#H{}\1@`I gWE96B5&W>O `*)⨴9xtyQAx|΀mՆFZh %˅ ^+xp Ng9f7y|lN10<"KYuv $! K4\n lClSD[䟮 xjK F]gz6kM\]hԏx :@D#zJl|g鳠=h>;d$}'(gW4ilD2(=yNHpnΒ-w\Q8E,R.l ;9ݓ !I EC LMg4* [ !ؚDWYNf6Ӎ[DǾը۱z\[x'Aʹ`)mFBZh4q]Fx\cL֐ŶHR.څCh*} }FӏsjZ{VtFw% DğjJq D!ӯT/JNp9~J,*&Lo _Ȏ^`6|zvL9IpF/bF^5tkZkjp׫= _/}Y).rhm!"X>B;h$LG&1pa ]EdOtԜM}LOqYRmϊJn=@;p1AAd eP❄JQFXEш"1Fp'xY<7ћkj%;fBR9-N|S0,Yb()~^JdnjK#!YH]@K) GP/l2)O! aA@Q(, >*(ge:FLs[(BRb̪aL ~۽v|eY;b& )޾"kD^Iãs$Yvy]4mƝ MBIA2ElU["U)"(TU %\sS@R!XFLU2|%Q+R:Gϡ|XHԖ"T rƂW!H^s!(탬e+ߟFj, qp;4r;'W5NvS`OggS<﹦0+*$'%$%)*%!!"# &#%>^[!!%.SrU\6ed?b\T iAf?Ddq!lg8 **{ |$ @fS)PY_80ǀnLYU\TSP]T5 ⵨&8,^Z;߇HY4e;'K>]ųӡ%XN,;7c"N' NͲ_'cCĬ/> U@MB6jkijIZtHu~SR%v3DY2bpɈ+G!{e^ZAf  Y6.{RcNSs$룯ճ{ʓ^7EĵO i[^D@oDt-:B1;VH\SoXvѨ/e'ܛZYK+ \ҋ7bKeC<L$60cNz:b՜JhD`Oߎ\`k/5v;@KwSy[2Lٕ'ٳ<4QXi9-<͞f1ӟv+x7?MKqWBZ0F(($R%>8~xw/۳׸rGJ<ձ(Z, 6Aou ]uxNm$U/>WdM:V`~ek?C?-q~<] Fc*^jRip9n*oᓍc|Wj%=QF"M fVݵl0(œbNbΖ7+ll b__gK,hAo`H{.HGedLhPeipxSY5[)x*\{ 0X VqSuNm F:1ml.H^̈lDlOX&Q#[دΧ. #}Y# f _hb'ur2?׈ pI^OUD' p#&BtP >|8@pzHp%Ʈ?&Jz`W Qހ<_JF"ڞVqI54L,i)`ɬ֜nCnʛ{z;E 5C)̋gܶˑXB.DXYTUB [% E hp ,U)Rtz .f{02*t6fMe1\Ab ׸1}kl Űx%9O.MfUL`&&i(u6"t3"ق+:Dl@?T(e!*(ӨΫJ13NGdѳ:njvQ^^fIe{ryPL'7Un#븱}[T7|T)?q䓒2bkͰ-V6@4/H+pv)U(E9U"v00s)aR^QKU'{5!l\2.vj2 utѪh1x XV9ynN GLvPF_R?u(wMn%t6rbpX`*YdaB1YQ D^|5W: 'm40*^'"J˃"O" Х.27K:_P2(Vw*i„Aϛsy{XࣳSߎ|~H2:Z!]!oH#hk}q0ni%Yoм/u(D~eSqrp(H&+!h0`u/aWp!?FXVhI Yvh^wqkgf7'e|uxh9{,msGT!hT^Tb`0`Dw|lL., n|Ѱ b>Ę 84uODD z(]<5CcwkҜK?khxv9]s4xmj qM(X(@B~po0ĨI"hN`+SJDD:h-,7nTn('n.\ 鉟g yr}3ouvXcЧő6hmo43 <(R/jDb̐BETt:Fh|R3<}R"SzIcKnӧ;90ap6wSP+n0MA~k dc^l]+|J|x- ]#N2m.?HҼ82cgƏ마ź-,U1Bn бd@:4á X=( ònQs5|Ϡ\*+BQ V6sG 0cU (zۍa˩/b!y !S92*di߲Y>=sٴA=)L\ڈZK>cݢ. J+A$  5kkgPj~e];n:߻-)6x<0WgV\_rQd L@JTYcCVМ`* =GY %#LSe(i>w:ƶj(\ZTxհBw(*wŀ˙U~^j: վꅠQ/BIvҜcQf]G18>TaG32dľPlVN hj7j{WS5TӒ QCֶ߮wֺf9QAP$*D>^0޾ 0,,8Ft@ì^xW)ɳiDܘ0A,v,MݝkqwUB{vtx91#r_.cmWx{\tSچrsF+kR٫dg5u%AnAsÊa\kֵnkmZQ`/BCO\[g򧯁`{]97KʋK1ہO KigEfB%NJi*9^7.>ɱ`.i"f !Fy,]%fE.vvcē5vq>! &P(\TcW9 (o?dD2U|HDق8ͶVW۴9 NV+a8 4K Dz <9itK I4Q—( xˊmDk.mX+A,ՂC6!׹cc]Ad_5ԝJ\a* vr-Sډ6杨S\dc"٘iR)._`rKk>`Q5 0~lчua%¢g]0/J*dM+*ޝN8U6iaExeU¨Γsvq'&a+ 0m喇5N:!܂0^&۔{kZ8g:0J'Lp4^[@m>֊-\8t :";&K6/`6M]eF.UCZіF9ٜvrps㬃ط%#ZQ;u tE pKP+5 \9åHR@/J`'\$YF~" L`QA0 J4^l.RPʧH4P w|/bU $.8dh!$@7XC`Iys}oKq]ņNt/ uPmTʯGIpE"V[RJed$h^-ݲh&*kˆW1ƺm$25LAJ$[ +6 P89%xEXy]Srr]B\!4+8yJ݋ XS @>bp+kF{aPyb[c놊-n"LY*kOԅ2wߊ҈}{%U\Yc@UV9=_diP= Tc*\W~RX՞ WsXLULQUUUUJ><]aUt3BsLWi*v젃͹*xB>GN!)LWUDq{%HT[Pn(! i){1wɆn:KMdcH5xm@z I_OtoU-KS KubLX$ρq s5`G; qK u?8J9RF3#WUeaqcJ!*]Bk/vP @ Q dP0@O"1c `]دi{=|)^!>Y@*_kf[DR #E\[W+:6I~\*6M}(\B"F$GhcXXJF(V 0|\-1I_yyVG{\Mt""99Oy-s.fD0CN#lD[@j"&1Ǧt0RZLKC=~˭,pSΊ](K&+ª..BQk}sAի4.f]B'q"$,(׈3a4ڻ+lsƆ\w߯nՍ H@F @ FDWůZƭŠtX9 Fs |"[.k'5 DQeU#T+G wO2wZL߸kx xyn}hy_DiϬf.6RHD=p԰ՑUARu0=Rn;lotmmj؍qsZ6# řr/^nE怌/]89-t|$2ioH;2_iNk-"ٯ:x3ڔ])ͯ@AP3 Vr`._h4ސVH.mOLhw­`4-0WRJ@P1dIB)j+_AnFQU#O%MZT~eC; ĉd-%:(84+ #kz{|il=eǏԤib0%@bYIF*W;6.ȣ]!\[C󜻅AY"Ǜ y[ʼnp e:-Q 4WTU?Lav"̂A5Vh()DY/Uu 57D6ƒk\j$2KJTWhJ?*@S׏ "T[ʣRՙ~GZl {HíSnsٷWfleHU!f péŶ(G!yYJ]Ӗ3Ms{P[cvjŎE O'2e!h6 7r|h/yK-Is83\TJ#uZADk,?طKr!U@*p;j4;")CT01B P eV0/~nS`"!8A !Iv Z&\ .ml>iY Bcׂ*=L,+.!np*$]U G)XE"n6"D8@"R5C*^ͮnlifO_BRu:") TFbw܁KyDnkei0L : *L\p(44׈ qӺvE'F,+xA|uw!R)0ԝX 1p+KP ;XzB~eQ28i FFi茡&1k^.s۩<mۖyw1 |[ĥD`)!\s ]cVh8F!JA`YV*ZT]Qׁ~m2}K*";I1Y\]̪О@[~Uz{z6>U; \a+,b(#A:ZE!{7TTW:/>b)"LUUĞ)U̥mg&txHDQ Obv<ѧMu=n!h?Ƅ4S\U=Mmz<8ϡ`l*d_bKCŃ@*(X.푹Yilcn6Fxjh_ U3koVl {)=' zqaS=:~۞aVD't,DJ( - bsa1*h4Vȟ~'3l2Q]NTS(B7`qGa(T=iB$30bQqSApŵ.2u(RӒ:?Nx<.!a65%+Cm|ǥE38~D#Q6g:ү4fѴ;hDph'.q߯& @inp}RshAxxuH>Yt*B ^|ֱ3Mivƥǀ봋KDv"DDIQOڒ!R l>R4m: t]\Y j eg~#T<tsf ) D4S7qQ'm8F*ˊu T1.| r8a74ilN `GK\%1)q)̳,K,oV@hj Ȍ41#E,QKxQ~B>v+8so7 deOƚ2ۍ2,;#tR#3qy"CgVETU{u NE! Ae٥9m&[W0\&~Q[]m2MUjH+ ` .L#$s$\Cn2'FŊ6“sq)2'edEsӤ}2Ħ nY( @*)Yu4n!Om G0=Q dw]ϚΗZڥ]X jEԯkU^̅^|!T^{YF Jĭ~oX2^ b)R74)WPfXq9K2&iXr H؀<q^vxKNXCr걬sš;f˞i*DuȫxV/FW~4ٙ$uȺ">^zF:@-!4{ːxeD H2Ve?rZL+" Ѽ|1ɄuXpvm=ݤlܿ+>~Ф2PCYSKT˥i P8[Vm~>0/Qy6n]VQ0$5bZm`4\,gx??N;H4%b۫}ks<ƫ!ˍrAl7j"j7@pDtK]X `E:6H Dl]\A?4CqIb'nW~vu9 D,'QWg6/5H Oh'|cw`C!|?J q8[};˭xs)*C KBܴV HA%4YQjo.[$=: N%YרCqd_aPyx zF:Nm^$AYdc׹8@+FROFzy ho4ق(M>Nskf)y ,IU/4!c='%\5TF2b¨",Mꗧ,ɒլn[PnRֶ OggS=﹦0 Z)&&)$""#$#")'$4UK?SE~xd]Vonl8nL[t l`u=4 [ޔ7}ՑD_L 1:NfG9.e=N׻7:{&ub f͊L a'J-X&9СD!I}从cǺ6eDt})1bD[K= IOA\2JLn=uKh\7a9Q}^~8QQk3%lk;@<.GA`ł$.T/,f1VfD BP)F^.gK˲p-1gHcߎ&q )Y\odKٕ 4i#+Ī$w |qU,Lm uEP |({pi;杻@JQ$fǜ6qH4 Bkv6])qDGbAS+r^2;{ռYH{.FoaX]! @| q%J)4BÂM$-,\c\UJM~L[a}vUr!DWLԧ*UsOk22(HI*~ZneAT[Svq {Njp(L׸D?}dJ&TcU  `YSO_KQ2/ycxZ䶜5ЪhEԷ%mQV )!$*i~w5/pVY^Ąff6Zmš%Ӟv7xιv}mX+T5<$+B[2 &k+b2>6U(bwzZi$90=&kn"gGj-lIL\>HvljEh9``A@%_HK~.ErXXWhb(. AAp.^ƺ O&d-ғ4.A!EG,{ǵ&ҜP4(䠘.GSa+J'%nC/mtnGa[Ps+M 8C ]P XʇG .&Yew]rJ< C~-U$XADQ6ƅ0l; 5!MOTS@5ޒykLZb< jG4.Ff 2ZziޠnC$Ұ y~ Z'r ~|I@Ngxfdt& qqXI#rgjvONB;EM_ 6@9&Tc~'aj*Ƥ1rJ-7S[qOmnh_h0}N\g$G=K8Iɮ%cx}~%hYQU./HMlyݟGڥM)ώլXSkp u:eDٹ!^ Pߕ:- #w qybj~U﷓2Mkx~ǵc~yngb38n ݒ3 6Rl#~kEVI#tFnfhQ,7\~6t3 xޅݣ0 +s#||֖6i\|*QVϧtM)xءk!حػ<' XƣBCxeJG^G(c֖ЧXWUȝ/j]=e0-NơHID4:N&@ \C|1R\ܡ N/(̼ ;viz/EIbDdC]ݒnv4_xj/| )iɣ?sc 5]RRA]<Er86dx&c )wH+ )WK RKXir|p4Ec- H ?$W2'7UO$cicڝ\h ruN1sxKCg)P e%IUj2r#v'|bIޭqw_wo8:;):[IwJXCSMxUu]u,K 3 F)HlQ\ ^sE5X(@F<}N)P\#$/&v& c^EGøpj/ƾNW3Ow],n-c \) Ϳg z`BCwa˴486.[FDT )$u^I!T">lރ%j2V,Z `4Mބ쿪$ h2/6|t9++p2^n@Ov= HSxJD˭mH{-RA  R\nZTM\4 {"hc92JmkdhF2QHbOt/lV߀tkYRXs@]Y(A1*(LTAQ{SxU)֑̖yF!.UV4M(Gf;-JW-+*P˅R*{U4vt5\8 2. dU:ˑԲm:@at\,D+DE2UN7uL"dFyjW9IP<7ճ=5KS== bk'Z]iL,]bHckGm1 ߟJqxaRl6Cax=|N㕪$IbpnM1avntaH2,Z4Nyer tdHȬм|AZEmي37z@ri߉`xc%V̓uXc;l\i-)V@SVVG,B~vÖBD+ơ0 ~^jKA4P4|wRLϪz, 9Q@CKe5S k }>3+ t|t=Mrog2ڛw۽T5Vu}jP$TTšk$y!2|.|6sAd\ ȿ!MQj6&l﹦0Ӳ0$"""+$$ !## '%&!!$"|5F4`Wb;:ӡܡ}Ko7 ӧ#cf>>u6lcz|lB#p =$&p ?ɦ\;*I8Fq3S~/yOpRw~;4̝2RfLZ͉n1b%F!V$LpӠE♂U0sct%pA11NZZnj2Ӊ ݜ-2-#;坵!WT#1vV RoG dܷ{ d疭=5+byxМ-Gm~<&w@riyxJ^`B7Z"X0@;M^c}>CG%E&<[ %MȧAÌC2\EbF,b Fq! K2QJם\ѝ̏e]J~9lʼnⳡms=&?B)S/Y0uOon=cWR%: Q#>M'Y0!!>/CƗ'a/ݤdd5Z}L]Щ l"ڮغVNL=qJ&{ӧn?)CwSݥ_~(2zO`]nJtdRFb VCU bDK%cd ~Bߘs/.su_d?'9܂y^?=H*n%dV'7'OmKmvjwt=/Ĩ? Kq.w l:u"pgmϑZk*oc:Įo䘬;SZlsk>ſ:Șٰ1 :nJ 玑zi1!,U yzojyp'I YM4YLԋ)SLۃv!ki$U,Y4*?8|O@3qPWT DY `YܲSxkI"D]Ch~\Cb{.DWZL0)w&C1($ QL&Mt 8a:4Ns.(t)ȆP!Z?01b-1Ba+#@ {D$~zNd,2u2REbH3G"ͿE/K!CڈYU 2,T`IDP T P>ё1ׇ(: 2nH`@ "Dn|N8ć1K.!sv$S,j,mWF|8ӵH#J/*H`dt׿D3&%Dlhe_UoUEvDDV($[+%."M k`R (p]pT1""FJ5긢RɢHub4ØG#J=;.iig" n7W8.2K`󮭴8X%bQal"a-P >nc*s٭E1M낄}q" Ҧ<Vec2dG΢]yuP(_ۤ7͞Ų‡~]G P!Db8K{*Mq@  .: nUPrt?d#fL7q{Ru?n>,6R)c*):A6h`@nN}4!k 0\6"HIаp׺֛6KD-;ݴm @aXǧ@\i($ox&ҷsvjX]zQI#cMY: `tA/h]E!\aUXÃLij?\12WD(ֈ=9ϯIЂX/*4* `z/V)E~++I4т긜h{`W_Ng;:6qBS1IG\ATDc>DȟӢY; ]2o:θH͈.ѺKEwʰnoVR $`\~ d߄DwHj*.qّ“ -% ButnXJF*Hb"ZQ{$wU> >\6.vH{ .S(9j%g?pj:LǘqFQ'8ncܥ.|1"mA.j!8NacnInҘ:*w^nj=ԏ=rk]K4LO?%Y: [nJE ϲ҃mqˆbˊk(MPnX: kf5T 7+NvU|\08> .\+[,bqdy |vH;Ŋ#.Ax/a)Gzt'b%Pc qG\g[)<]u2Jm_cCXKUGm|c݅%-u&HTYeW.,`ryV(VZzDWL*UF}?; qӼg!CuTYcī29mQyH<!3dTY m .{GE,TA!˳ngH8TVXUI|)wנ8ٜtu|x~l?.|v&Q!%sI3<&"@Ϋ4ͧc!Zjbݠ .28iXl:1˚_Bb>nDk[GX{D*MAlI+cgݠDV>mk}hRe` !N{td̅qlTwn0ڎmEKm(ဂ!O+jg@<Bn=T##[?SݹGH"F*9(jboXsDUHŸ> G(uOggSt>﹦0O2" %!# %&$ #("!"""%$'#!!!$'v[%`)\D[asZ}Ҏ˻oGdKz@)Q%EIn36f5ֻ_q/%'RV3QuF< ` Z&,6|=`-YZWX:,楠6Dr,] &%TԭR&,SlNF; =h3T[T\_Ks &KKҗXT_=}9~Y&V3$^}|_WKDU}DѵhH+|d25YGIH,Meʛ Ú?y+.Hs7qK%=uNe4b2":x%5$4\.ET[ xKtuV?̓l)&um<oaT]bcK&M/sF|\?zvE2 b(f Yy5cD8zuT|Rm/[jsr-p823emˮA&CO+h^#%UR ~ݞk[q{[ESI(G6~ *φ[i)ALk{YSʕ1 몵+E`ҠHE~nCfx^ uAU=R$ҷ0NMdΓvj(Quf.Rǘ4& vAV:w$gW.LoSJ+I@<5$^1:q&shNYjs>mkqRn7)% 2׽vɁԝB^EC𼐰_9ÒZJI8y&onǦiD84r4uˣcL+٥!*qvC&A#q:TVov0fqfRVC)11K49գ=2z_ZҺ/B WD.L@q~E!|)$*_҉h; G&LMFq-5%8(%wO9OzWuK/mb,s֮jeʎ0aJ.} %^7_oH)zʈt=bzE+KSap,[ *M2Da%0lHc9瑝edIC랏64+&qՊIr3|nX4X9)o+%ɑ.js\q95j4t'Zk}@VtLK"';YT7)؈LnSl ++]yoFZ#N_wEQ{18FVIb j_b,bP(~<5}l@&$6xJ:)hA%8/$6{C MgC"žVo7 F,Y, (&Q` `BىõSf 5j=rJ4aAԷ obQ,vs0hhgǜW4ff.w/>9渹IJ.6x8Zdٿ\*UQJ83t|x]`؉خaP% I@ @9@ e%#$''%6VնH<I2.bAVD\YDUel=ؼ?}nK Ӥ5"TWU9=ȇ%.Q!q@\[++dhoK'JJiմR&c ADUU*UIWxгFͮX+ DSL(&hO/^>弤RRN0DDUGFSL=YF2J}=q^~JK1kH%6wZ|5z&wLQŌ:Kh"B= @tJ%,k${qCϵnfL^THF!}T,R-fa1&b]8x'w:^.}\!v& PD.ܢ A9Y+dNbQ<.vR\v3({@/ $Tc?FVv "P uJ):ُ|wO*l/`3~:sȢ|2juG~a8 Dž ^n}Iwuc' y;=(c.4NUjl#0eؖd,q_։K3a)iJͮA(MLDrM9zr8 $Qdi{_` j3zbQFCDv}78 BQ1mXfR#`ӣhT[qŊa!BxjFB(~!!G(\3V)))yExZt%4~"H궤a@cM`LB@&h<?a%o14J(DEgZP G]O.AU#l:]̭fF yBrJa('֯%dY@E!`̅(!pd:Y8(٬chӺɧ<4X[2)F\Jsm_Mz|k1 7,c$_h;0f␲ֱp&,mv -;5֢44~14z:4Q!j`˵HO7\1!E=-6Deg26g[ZNǶ;{1[Xf)B/y(nkDT\t7A&Jri1vKN*@vf'5IJxٌv镧4i'G1Zh$i:$5!QzR*S 5"r=">ig)+H  /1)udhY $(]pq7Ve_vVl곤~M,;$?Ms,3%Ӈ[C(wGL 2vO ɶeCW[I;};CvzS<ژjwϭDW-+3Qmr4O-$?+?ʊҾLn ] T﹦0S1#&z ! !# )'&"%% "%"dcloWkrM r/ZN;u1dgYP L1[8>pRMӟͧ¢i ;&' `NSaw[-0Sh"1F$Ƥr=].*j 6FֈHƟ؊· ="VьoP nn$߈iQS\|^C8=OОG#wj Ps ̘mjs@.l$E+ &bsUpD*. 4Os4L`j2]6F A? )n&">~U1b.݁ʁ^z]PM j!b\!A(dЀXeH]H]kFVOE;%wb6AkAQn9B[i޽ًKrNxpc܎.%BmUMD1d"0O3ӅnX$ {z]R .B&)$if.r:135-䏉=^Tى K0Liȱb>Y._@Jv#qJb5~k`dFL4F ADa6*˺%V֦*fM>ҍnhc-֓vN((S YGUcmȌڷ~KpTTln(buC`d=$#(azړoZ(i䋧\+Kcx;QHSB!Y#?<p*XXԋEސ ]p_C]R2jN V-"BUҡ9x}Џ"^e1ᘩ ಔq KYLOHIJf<;|/WmM\*{vI5OBCrv{,(nճƨKu' agx-Ft\5 htNHPa5Paw||t1!mӽ}BSFB´^&@|}Jd\)OSX8WtH5Y.,kZ_c4'+WXeRA^ FAJA~őFE3%N貴݋]/|1Cn=67U  LUT{BA%"~?Zzt&O%O}[7 {g{3{{NU_.W=O%I9F `Lc@*^[.CtwNʍ Qg"₸. \[ LWU+&!f ~+vE79\Uc:_N.F-h@5}cTY A:Lٳdl&cbJ*\Ut੪ Ьe0?&bR-ITS2ȡG%ѫyAT4SlhVUL]x+|sUv0nWXť\YjR_u?x2ߔeOBdrӱvW#|c@6F!cj"ANCj_>k$ֵl= */]n"y~dfFhsVُG<}b )9Is|>NM#;)U[X (Zm6V!PjpڕbEg#"]RWi#i~|1hQ{4OfVNgI)zp?5rksج~R`@-YOY1܀>UNw!$E."b@_܀p]6U[ eAm%j09!XM'tIN9҅ŝ}?N/5:=0;[en" @cd@ @YWd@as`&_"q`N4`嗎TJC{0trxrޮ6?wJRB122'^DFD* Mg)q#{^fD"зZ@DJ_`PYH*E(GUde!-EbA&2csY*1J`H\W8^ @Pnm0M'OE4\U*_a⸮8ٕbc.TWq,+DR>Ȧ'ɗk.H\[Uka 2|lɾ@\ac1s\_& adXFtd,[Fޠ0`nU/ԲV'9rL&ƚJ[/h%V'bz|~~2FlÈݼ74lJ)ʅr<2鎃՚k9D2ګ=Fe%8۷w'2vkʺ˪EկqMws£=,r~{ԻlL xd54:-Zqicڒ d OkC:@ViΘ:}L{_6*hC$@&$x4~lǕXC;;Zڕ֕ۦ) .y*,66Cpxu-AҾkftۛk:3( [_7( +x5H(T|HmR`;AjkeE +N@`7euV*(-WR,4q,&{_;q$$5oNhnSJp2ˮقIw'cgxVoht'ag埏lFʡ%C|:6?FOʊ뾾+2ݛ_n5N}'m'ܒ"WQ ܲz-2#"xs^\N)_7Bfp(9S`"e+sfOetln ڊ^[e˼ri<4i/p}kN+yZ$3LUj$u%ېKB)ې4j:6^&Ƴvkϭj;5.e]Ϊa] CnBL|ŃЛ~ \*4q>.`' ?Urc4Igϛ۷˛-l!?W:YLF:kMKp}?Fxɨ^U:/&{{fѽ w84MY[Jv;C(4 5X*^.Q2 ځNuu7$5+R|gHNOPu<v1&$ M0ʛgI|^$!)5`י]:nո S-_j|=E+m-1)2k@_' !Ь~2ăL65>nQѵbIV2FYKUHW;r?\4@ Xc]U>l6>"< MJ`9(3Rj_ Gf0o6۳cHH#CC(,1pu;P*r4aBS#0넫7{d.z=4= JhFҦƢEV5`R,~̭Er`pMW(=eeo:f`=_/-0L̡SRhd+Ord^Lp3.R+)a"7z[rڛ_E srz1R.CBf W*#**ϲpQTWCQ@E;$^ J.f&T1F`phGQ#H WB¤.o uDƢ}әFqI_czF }Ddzf)7;/csjm#Z<(m~["F:~TG n x/кRk1V[[i}nDƫX1)!M0` ALz"x^ ̳AB~K #&v)IZꭒBⲂ,oE jWju::B2svVL?r\EgI:MVߙ4b^d?qWtWg0;FQAʥpzG)`6M 7pvˁ"Koe'>Fm4mz|:=.7-#_bEJ[!#D[Ãzh!-SN]r-ML[6UL7'/ L$&+iS1VT\]ï*kGW_΃ߨ=U]F \_ikÃˀvJZӯ%I(+V CK%{~ʇ&DWiNۉpu~ w,05ᖤ:Ь5ܩ Ǭ7W4*@r/oȿdy#(\~ wA:Eֱ9@0! nFo]DZ" 9zYOu|؝޹EҜy?jeMGFj8AHSnSsFSWe2 ZmcȯV]bqY σGޝ^[/oqn0OH[r[E`zf'T3DRY!쮥4[f^&˪\. :kg➍hhy`6'I7!9yiXc^K ) #@Db}cr0j#^~k,5F_ӨfcV =DV\6fS4 iQ2@2/^GcG٤ {Μ%hf /R DWSvTejІ{p)#(LQlkf^B `$/Xbؘ+daQX6yx %wJ+|Esi~(]liU%9 f'wCSi tkCm֖Zkwrb0P^uo]Sv҈ ÷N=D,#eDnS 9/byD$cۦ ed;K'q7O ѨapHbIu5ɴYiZ-};us2M \"L\Dv6VU(+6Ay Jr*.>X t58c50s:&Ng2_dİX~/ ΚmޭNM"/vh5OR"_ !dta7\4-^ b6(I:; f""2 A:,^6+dpZ(*9-8_S"Zr':9̷NL:@~ (sP v5|6QCyDuDᗳ-#C.zh!U"ɊH "HNֽ aB`mL/ɘzlE?yM椫uLkĄY9a]]o|AWXtp~NA,rk x[H4VAA-A-,omC|s ԑ"+#OggS?﹦0`ó5#" #%&&% ! $&$#"#"%(# ""$"! &'lN?)\e"vL2rzݬ^Iɾ sIn`% Dݮ"mP!d"%iwƏ(R.َ҇a#A;u2[=7{^6n lUש z$Rg)afihiި ]Hqd%*;(-ivoY!5 `d "?<1XgJ x1/ra $X"|l!s*q"jGB{ v.fW:"IQ &JUP ~_,m0-:`jť XB] 9BLS!DUr/(ndR.k(-ߚ@,>쵏 %+›$3HiP6N&MDuo.7J|5J\Rb}2iP  ᳎yR& g%p3%a^ȧVDTP.cJ\]tYVPKf_:2_l[^yE&y|fiق"TUϔZBl<5\lՒ$adY̫ mr d7S3 ]Π 7[S)\Wx*uzΟxeS[w-]BA[_ \Wm+dk?q]PL%(uݚdabXzVF$( 'E}s鋕 q:\cYS'ר) eߍs4:{:SmK.nXVB,P|"bx"fBJ)Y> ו䞛'}W8,,A{˭ZLB$UHH MY^/XԶ(*p(b\t1E"x7\v&vYzvRf/7h[˒:(4h}G ^L~CbQk¬puj:Vj`ھL8<șmx͛b̥H'/R?Ao T7Yܺ)+R;da_,!U^[8RS8[6m)6PlaeFQ{}anR vRv?Y9|\v ?zR|L.5dvp'xa˧;B=< qyyJZ{,Nͻ1k 67NSK5\Y =XƽQCo]s1ӟTYtoͅ;&u{uO[|T)?x9i]Hb= HD[93J׈tLR%L I`@܀se5YEn-޻ DT ~=Q>/%2*mGT[ ͕߷ )n$DVrnطaodadUx3y~pmT1\n쮜-kګQ)pcB|վa:a:Zٝ~eYO6;Nn79?{6cҸd)M7ȚeU|Us6MaWow7ʮݾqn`mTsS='?8َu-{: lB2B(Zl܀m@B>mM"3Z[sAF]XڎVnՅD:ηLؽ'}Q6hJEbS|* s:6(ǵ\NUz}7˽| AZ"#JPoY" `Uƨ0VR5b0w - bXF{ms4hsZDKahf$>zXF 'E?`B5۬}S(Rm=tj69nAƍ0\, BS!wNݵ9vxr$ȺyF 6]H쪀LE0?W&Fʠv'nvlj3džY*tGIhwm܋1®qn@ T _n #T!g|.i D᳠T1^T>,IbPԪz%/]ߐ"HFf)D%hT/w(1hH4 =foC噙7^ʝrqqXWfylE>{=PI<q"J!C.XcHp/[!MLjׁffXʅht>IvOz0V{s2 yIFnn>p \bJ;D(VN_sIHV,'\;eZW7,FPQ^Ueh75 M|.+Q\/ڶ4ޞDv_ӣhoƂՋY:_ v>`i4r :"%@CV qE4 VMd3aDn2h+6K2f+X\;&GcF@*CЉ.$tu6kw항LxqU`7&3]:uZPP- PlF<j@6 |R=d1R2^7!5^EF bBb*w1`T,yG}?*} 'ELD K\^$p+)zYuEx^5\^ETA|ˇUI&" ,0F%)}rIH7LSUŲmBFفLL nv8 K TY k+r?fͯhzz ԠQ2lW++.SBA;@y4 1L_SV OHu̿arIz{)ALU*ͪrd](F wQ) .TSt[~l'x~"0d㖑\QAk# Q\ 8 d]!PB1`>x(Q tdv2|TleARw@|mh6h-NɻZ4F/=ccb0>?eq}Նc4-Jr%IMXVodk^A[m0k$eZ- 3%mcDĂ P!tEAB{ +mcGu5o;ysŧc:^?n[IHs|]@pX>MڰPdz>#bLbvZ̴;"tUk J"C{i؁a'E\%#!"A8H9"<)1+‚FOggS?﹦0\4 ! !!%($#!#&&&)!$!%")&)ϟ%! !##V6s]jh Ll=BXE9ִt{wAqa|i11/L6@ %f)#7c(2׺ zш=$^P~Y(d!&G"!OiTDagnp?^$5RhfLzæ"垎{Zj>ǽ'>:n:7~ļUӠ*s !bOsRcb:nIq#u=x=(yC@>ޜv? ~`@8 f:B_baǘɳ>j v6x&u(+ ^֍m\^l2P*aojJ*)P%a~T&JStCE a1c^}^Ʋ"% <F VG<=וSJTt{X)4,UlD^m*nAh省(M@%"Ҁ`tpY!& AJF`"UۚM)$B0@`C~YCF\~6p+UQ" s*GDvYהRZ[5\Јo [ԪB@WDu`Uk# UtEr_g rWE`Z\n2X7Rڷ\]a*Za,їXH'6]eTxgo|m2bC)I! dD?`{⏂0 APF$V)y DKujA sF|dsJzRVMQDUs  +N2^JC-e|eʹ7,, Oɉ=`ӗ4okJ~5ã7Fg'+9xܨ #l?y g0pzzb0$.yS1=Kѕ?k63g.戺'G E#Gq AΒ7'H@a+Bj!';~r?u.qVn4oG e ¨wík(-cVE".Vu%b⹀b%$+|>hHZt =[8"̒nHt|I\vjK B( %,\=;a/;y6'_hPff%#.2 R,X'>[dZ tz C p ˜Rg4$h-ڡǛIf袮$K(D8Ц/7L=+uC?GA),c)kC`놯 kM]G']I\V-È~^L{YێZs:,YuSS dfy[,ۼN TɽEFf-@xnK,zRXXkcW?N0ٓN Ho$/+&yE簖lK@^8UP1UXA2a ^^Rd0.yj"dnKVmi$K/4'rӷlD4Ǵܛx9=IU \+=gfR=M_KI,&eʘieRƜP[f筰^S nX5f⦏?pAV0ueaPlE]>R2,*.uZ=ZQE'pb;=njfijrn11ieI]pvQcc\?I2UT#(Pl@ r@qW @Hn:Ȭ*ޓ1ii4l{wNfY͏RZWKs- 6"AvSVvnK-l9.Zץ2d0)C5#'5oW0Xi^v͵yN5K|2{oVg'JiqJ J74ʆ YUic1)T÷͞OɔNՔZjtj%~S?(fp׊ֱV6 m(GDUǒ*C>;gkYjJY 4QEӒ:~s?dV x^9va 4KIu=<Z{,=%h.KTՎa/rQWwJ1TwS\l@p U,25RȽnR[D1Q58XL~+] Oޮdv\^+L%zawZ\~٘pnw;xyi}VuZvwU SƻF-D!83I@ 4?y^c۰="nZ[P﵎N޸хRo,F>N$dvB<. ;tMV-e|?xlztWQMe;p=;^iC^IDK &Q@ (H}+>Wdu ;o"I}I?" zz$ƪ1RpxM>w+$kNet!`s|o&k24`(#% J챜Y &Zœ6V}$!i ,'-KaZkF$V  ,/L,,GX16%FHHЮ=K$U8`6 HCbHwgHa~[>A$lVaӋz:DQQh8ڹ)#T ȶn+DP<.'i* ;B~EZKl[MW֞?lͯ!ychV^i:M\[j ƒ/k8TdX U~vQrd[*ajG~4Uq3\q "\[qU*[LhqP\ViWlYvu7fu m::ބrY &d\W@Vo>Z.s`P{'NUQL[ï- yWV- =R$}&}oDlceVKJQI^Zt:nHOggS@S@﹦0'}%"##%)'#!"!#""'$zvU3ы eulx~"K8!9L: (M7SdF-3rad8DSj jⰞ\FۯA_sz \5yH/"Y4>JTQ_8փC nąr^Z@}^#\$eI.PJi(<:?zܹļh^<^G4Rz)IEw|:^AlxucxEcXE 5Pb-Pލٖ0K81J8.HМ0+(kʥ(*үX>a ?^YHr4@= p:m ;UR% M`ջDwAæbB3\̐\gnK%k[ɫ )+o~.׋+>ud84)1lZnCd=^kCӝ]$i"p;ɀ*V @TB,ub1 q@B$0J\U?hZYm_h‘Rտsa]L8:q@[==x/{|"$MG?^H9ΨIV:i dWN`Z<Nj~/y7T絢9F Lݘi3?9A·ܮbOz,BTD6v~j>~]qa1R{b+sXG,WLYw?LOe;of6Tjt-Ta c02măW:gGμgo\^@W BY/kaJ8f^ɫ6/pvu~X%C^ƀyY:ưLA+-O"Z * ?yG?aY:YkoB?ukL~{j^_-SxkTuN4kqZU5&xlCLEcw봮?hh+&.\h bxJjRNЍ>8摐qiV[7FFoxҧڠY~;wE+.V[^;V&fx^fE/mthU#Tܘ6IOŭ;]j3Sj%B$5\ rrWK+OrPqģ1x߅nxdׇtTǛ>Ktw֤ˆA,g4' ஻2``w yauzhy~<.>z>wY-)L/4VVD]~8ĸWIɩy {Α H 鹩^4J I>jHl߈h^m6fKX1_}6XHtnQ9{ +ԑJC[j |eBL[Ed ][62x[ufyF]8:>ٻS!aVQWYvoGQU!'?) Q8׸s. mƲv8Oha|o#Z=ˊ),C4[R^ $ 5]@bu:N5;[|e:K._e6G%vvǟXȝql>1! ⦣H1SXp8-<\aa%߿_ךů nw?qzcéUt~j75hN)wC?nhPHE˼ m=|8DWK&B'.fo?%G3HcpFI B  ( [QCzf* 2?g]콿wqcX(g??rp믅GqgG8ðynD 0F?Y+4@u-=G! C)5ss)Ƕ/ۨtrޯ#;pnY{҅jXrT+T;;$7ւI d_+ƒ 8pjhL~qח\daQڼXqqG-y"T_›+UO}X`vX͹6\[@*fEAK_Kl.UT[ )%.%acœ0l#ּMO]8tEJsPU*U%t`CRz`9l[ZR6Chq5@ leYR0DűPr &2iWq(5L#r;|(1f4Fm4酫GA@h=ɭ jA|A]U .@0w&.Ḑ>HDܘ8L/<.O50rFL$|ŀ}Pw%%0:p\ӆG)3<=lH_?G:~Җկwwވ0KH{2+5Ap# jv SVC,5m: ".Eb5IML* -bė~U䌍uYv41=Z0j$3ͶosFmmBAY=1V#R]hbH#Jd ] me%A2y@$c(KKiz ^QTc5LZ  4Wˇ"֡pD6ތ7]28nTۮHBlXW(6{(4JX IpG} ">x+l[:?&>\&S^5i`2ХXY)w)bR?QJ= ZoRہ#yحP/|6DՎ@U")+QyQ TڮVĈ(B.>ڢ5(>Sw޽e4'b2|azc`^UDD-Cs i*1Wk \{4^ml^(]%^7]>S3{ݸL>>\o %=z&K9/Q+%@.UW5W;R  û%6vUB -u}xXpY= \#fDDHτw%{_ϚT>2zO|gO-zpݝ<홍Vy>oNd{ 8v/19;vnte6|>{Maf #60S|^% VHAW5#OggS@﹦0r) < # "$&)%ɕ"!##%('!!%(& ! $$!%" %(('&<[S혜c/)dvq')%*WL[˧j_cFmu1IjJ] ,DcQ BR)ʧqd1nn4HkHvO};k~럜.}[\Ӣ8 m.O9$f1Ͱ[8/*#UtBh`TbWڀg5b-a!;cSVڳX:8XSG5,2ncʏ6}Wn7e7ͩ_K/6677B@_; ūv8]X8SRT[ga~>PTocSLYs{x~~d2Tb 4QL.~a[W>h~wFSt-q&TamNԁxFDnOBw;;.}$\iak[;OW.PV!H"7SlkNya-',M}~n{a9\{Y+'2OvEk$p)/_r'}SBX%nlaF4}kok% dm "e@BsQqD 醫I,pKK%ٚI!<7!tdO'5Y5ʑR,a޼<9rF?,F3@EN w(uhb~A6;D KYCYqq}Y|X%"Ӊk3M!S?P /$*ۄi!]!!>$+6j% ݕlNQ@| /di"2\<Fˏ[Фwewgg/3܆=OR(l  pBXJP!q" *誈R56%m- {x^VY!wM,<,2F.юAZd 4|mcΐ#bL Cٮn'ZAgN+$Z[Ra#p#B"؉dUܬ*nf3ݿukSL*` LWU)&-Z>f*瘉'lWU\|S(cu)R{\Q"\U{򮩸y23&JʦcJ\Y{OWU;N=ħCͮ>\UZUi|Eӹn]N2)DgeL j>Q=);}ɬl`lgY"x)m̈OȞVF4ۍ7Y+:<)"Ri"oee! Rd"WyIK ½AeiBMҡc ů<\b}bwJLݰn,P+5:M[Ͳ g kG}vx3I;tf*//>va@ixXK'rA vcj ڡb'_lx-xX$3JtEk!9H\O\YWd~r=pvcsIcr鉈R" ' R]Jæz:] ^=':b-k8.n[e>XFJ= K*A)%Bq]B  #D3HU@@  B56|V&e@XLV!~JgFJOY866p{e1U/2 uhd{- B*3S7b/ofM9Z*4]ubiVUw7n]R YSqp$ `T ~,h2 4h`]\%:S&:e7Kndt1a\d34ɞn+E`ao׋Hlq$GzQ+W bs|]iKHpCƬO>8K);&L 6jÄ(`|1+N]4ΆG]zpn)~}/X(i@ SgWh`! r(Xu9ne}+JZ$> "ƸB\1m( P^,?B!OD<[Xא.2>?waxɝB†HG49y&dGՋۢ} ))q:{_uqBHB8WiXԈn%rH=/#ڄWOZԧ+.- /鋇(vU_'DQBJp?bt3ducw""{#F'W_>}%+Gly9сxiG4k:gqsҶ3ĕEE+łFgLS6un~rȰГU~>9OҸ\Uah޼}:B W|)Ob(d!U8~޳1:彽YoÝ|=AETU'ÃӦz4ҾL{ht$d^h\,q+A{zIn\ÛRCML^O<ͻSYaRHxk){;ߘsD[ʯ+Gr=@zڼZ}G+f&{k˾ 3deCu9 l[fz1D1ˈ8nwD7 Sc=T9 盍V׾0}1jvfHb)OI<{ãǽ"={-:vY Aʆb^뤡xt.XFkb<{QHHv pm"׃yKhDT /4r1# -.4W`Wԝb:vdiugikVO#kۇq1u=X8Tvm|f!߷nd0=54Fiib&]}FKLD,q0a%'­Z:u$~PN$,NRп 4jSZLQ֊5^ = Ѐ.֬DMlegENpʤs7'|>FXj6]߯|Ҥt&*;*%pK@;("@ PF7Op*]{ (0ݟ_;\K꺂)FS&%P L7L֊!G!D.V6c lV1+H(geD=s}Y bι)eg/:=x֞}\h/wb]]?X,L 'b_J FCj2gbCQԽЬvq߮Ȍ{"oxC Xdy]uq^$u] t[Al5V U!ʉ编nJ^+Lی,!]Bϋs5(#$cdY!hut~+A}jX#ij~R\Ytj ohߞ ƒKnsC#"LUGԢ,ieVYS.YOElYTh9R-ZŠl-+2ӟ` &XD'c~Ց|)g\ebYÃ#mUed(=41nTeJC32 D|ۭtNH<60;HɦG_Rqx(L*K!iJ~j|򸴧N_4ɢɒ-0X6V!V^e8n {V"cm#íGҫ\i>~I-) 1=Q npoh48jg_˶ʑut`&ۼ־w`buWD:XE'(l0"u9X,tXQG4 7j4ƊgzNe)YvhX %QF\7!J&B-)% z•|.2@ 峉MI!!` z|nJf̮uԎם5-}U:okhJ5 q;]Y2׹ZHA#nհcA;VzCr[>֕SY` ~\30C}iH o\4, JqFkb|Jj]ңfb;~6WP~^gv (Q  Rt3}sYx](5e #%W*尋2P,DQ!PTuxǗ5Zk! O\Uj;  $UKC/iiHOQThRsb#f1|˱T&L3Y7֖7LgQCEBLTQɨp`+}{YKipHe2ڛDLp؃17謊7jx-q(#{^#le=n&5MG No\撛t32v-\g,84ʷ ̳}7\A&ftg,mOHm-eQSYRI3250zf=`V}Ӵ:)2LsړRKĮc$v[5$M--ʹ^*nWfO)b(DTuMR]x1ͩ(8ѱ8"cTO{|O; Ϊ!iBX rP)7cEPO>nfR hH0էDDDS4&ţ,t{a<5 "x",Ȧ2R<XKOggSrA﹦01\W2# !"%&'* ! " &"$"$&&()%${ !" 6EH o9|^ڢ!@Q/D.aϤKNE MHKoMG؈hKaCwʳ*#"PR|y3W#z6yxsaoC ۀq0vꋺ! ~.SM 7h6!V7xtLTV4G2"c;NBOvȨDg!MVc^AaBLoЖkg32XkB9 5"8M W∋#hNVR2Zq@C\C,BiL$3s]'Ư9WwWDȮtb:/4j.Pz |'+_>\"ش`!=EEFY|ξ^EĴ(ZU}aayuZ]՗ )E%[ "UwH|PӊYBWN@ Jhp7Tߐ>)ݜXi<q^" Cڏn ৌZ,Jkwn~+eOHK4y*K.ww&Ze/> SѳMCYu[h,:@`#vUQ=@;>~ᆢXP5FebJEX4iuF к'׵{M{! 頰4Oe??+W9MAu(rnaUI\ێO-O=KhME&%6T:WaQ\@|VE\ӓ}ӝ׆lmIx+ lG Kb<\Dv;1+?AQi!8_*vL[o`d๪Iz^da$P3B ƘECNg0Y^lc6F1M&U V{>;p%4!@w @yeQOAzk/YF~c6{A"ҶF!i"eyZd}'6yrI*u#JܸPOwټכ јv/V{]ŝH]0!g^@NPe\y+N;7 tX"^n>Cڍ[6²9m֤Y\6C.54GHp.(Zi^k  5FNKf8]} Hj& )UX>\N[^1D DB F՟"&Jt|t6*M pRy;>R.m/lO`<8 q )bZ %«!<Š$3'ⱋ K AQcދE(\-B:4xDT }o%e1|,N2:wb[BUrtFx!lc*#ߎkv_?jOC`l(/O}']{>;}nmOH5Mc8/-5WR?2$f~,@-"OA$F쏭yvָ݉5Kdy< BIqTDN)~6}ڸ:wNm#]{ hf],p 7YGpbp ]P>\ ⎓ű*pZROHĎ:ߦ>[UO^U lԊ*HCshA[!c;yu~k{wcuE"Nj:UxЍQ\P %(y+%|Łތ5X!岋{Հ4یeOy7s"Nw]%٘nGu$`ZVĆ#zoJ᝗չ!6]DxRQ)!)R#jQn5U@ hsXEa0pǫo,L/ݳoסkdV#U3^W*^e-RR;br)]v\^aPMC5 [#$R.3\5R/.zŢ tpQdbb2+:M#.tyQ"T4t)D-Ňg:bjNPVψr$'`[Xe1Tk 3.q{vQT]}g]6Ys "Rhc!T[{RW,><<|yT Щj(l_ ÃWp*ӷMb,պ*1LWUPQ[zw9WI mk[D4LW"ٗ Yϱ"~K0ԴOggS@A﹦0|*# '&y!! ! (&%ô$"!%!!&'&D[tK"WYNcIO|9+TYk>.Sv@{|iĐ)J 1PDabM_#NR5e[}}ST_zϗZ~O:؃(CJVfB/RWl.AdH0*O!&.v>s٭Ӹ,r}'+H5T9 w1ʨ~e{s0g&=><3VdwL  I1M+X *qXJQƦ +Fc3F hG,.,cv7.LhHN BD3(¸b=v2Q0Tψ3uUT AR$6JĽpFH0*>|AÚ,]ĭ F>gREY4)aY%mc [F̪CAu6qʠ*AAšNt{^+dqB4|q] j-֘8Of5WϏ0{;w9'k֚ѿ7*Y}8rNjDف B&gǍyB`ތ-!LJ4ELHy^+:)!Rw;T k48%l@A9cj"R0jf6=w}n2Է++֭U]7]EX~n j,m""0&- AMBfz}?L6_:?y;F/l)or$edH63\,TakdDlCK=w(i>k>*VQtֱfc!r^0Etȁȸ>@isqb;PZNwD댽AQiCO $w,m8P!Fn 84':[Ki m|flgHuHyD) VeTqdu:^dgYAݓ7"42J]`I6 =A`|Vu71Ɗ[;sZ}^YrHXGcB9 ʙʪk*UAI 2mRg8?JKf? *#x*,շ\(3t!Z+g{AmiioHV&PRG. VaEêJ^>.Z?@_uZqHQs^ca:G7ۡ&a2\ta~xj0tv$i狩;ɫ?2a)yr)#؍e5{=A&Ÿi^p% U. XZ2q0ٌZ%-D`bX#, qu̎mAZiH'+~RF Byˬ5g!XGF&&^1 ycӒ8~:wȭzlsfOaD{KXK"׶ #DQE)U~hUxac`Br(^isiUCkp~KfSd,+YT\Ȫ1iFmUDbOmyX4I < &H;). AZӘ&wWh˯Ru⠗-zb8Vь7r1L",Ml)dxN^1`TwkÒ<٩G[בa⳺h>>$^aU!KH @K .!݊=p:)8%5 gͻ3e61µK!=tF1H?&Rp'ˏ3%wJ@$ĭVS&@!:la?T,L1öuƖw/f_c5,:Ek'IuB@rs"{V1sRpik?cSCOs1 |qn][bSgPJ6HRJd9pzA"#~dFT/W&_ga9S\}54븋*v4lakfƧ>VBpa @6tZvݢ}S$|4Vڬc><2{z=!~&3(By)v) Wv>Ҫ }%%=p(0\cQl0ƒGXfo-MX>PB\\[*wx%f[ђn_I` # ϸIKHf/l^<>UJUbUVgDQL)=UխiX6!.CPeHd]YEofI=,&&Ql'XGdcV!X =mPTU^,}[Q-la^i/cthؙ~LZ/3|<޾z{}Y&9Xtq-{%c1r HЩ'AS …+J&{U`Y/4qր *ljl>ͧ=lTZA%@wl*~ ~]iXhDJDGͻ(Уh.Yrfrkɫ[M׍=p=dе@(/5YL </ S4?e5",d/>]>=!VФٜ\D̤u1=QŠ͑1(z ;VbpFR\or "ɕyd >yjioT@6gfUJKv,v{&RjG.Ckލ5flggǢ);=HT۵Fe{=iY]gj78ѿa|QFH[Z.LFSlv:A&躪fe: hcN٥^VcC`+IW8՜arenKFiލ Qjwoǣrugo:K+#^ks蟽n i-Cޛ_Zv a]{no.ƲƝ `oěqQ|ՀEM3`b19-VuU_L]ԝsiE燱k_n 32$ڀ9|P@X%;4M߆RbܹnA7׸{|y4+B:_b-7e(][,V e<] wyDtNTHNQ$G=ի|ObqFwg.b;lcPHژ d53ݯq޽9 e{^59Nﲕ~Tx[U|LtT݃lŴFRcslN(  [ed|DjiԩE NeU4E^}g G,r`3)CJP'$w>Oo`Z/jQմIS>ٍ"4JxVqۘFD5cG #o&TQq ~5Q X=* xƬTl $׻wfI̦tp׼beWߦP&W@A5w)%!{ddr02Go8UP/ edlk lcXcehwvXy&QL``"T(ꃀp=_KS-J/-QmQ\HeOuDdiCFlg™hlAV`厝G: PʂP9Tںa,#!&wJ9WCTʸÞ:ܤ&M~l?؛ĿT~F :.H3'ٔ&X7ƣ)9*K2qݰ1z +QihJaSȵU8(Oc'ݜy E <2@ 4L1v@'`§c P`6u p}ʳhcH'D gy+kr]U8D H"BOW=Eϟ3{Vyl?jG֫)UD8n\ @ i(y76f[-k82=(dYR>StWo:[ZăsN9~uB&ciRLU*þ zrB3huu" \Y@EIM@ ;`( qDQ6OM^]9^=uY2IG@Ĩ(g[fĕ:xc>d1k`9M@KV>'O{[AoV Ad398/7\Vjhb˭qCq~ *ve&XV&da4 i{ߘl8\[,nIH+ʚ@ ll$~u`* @r%jŀȦ!I1 @.BVn$!l D(.>EB q:H.)Tk95AKev{LG#^IV1NMcCbPo2pcnpj`ʾx5 F}`Trh`V\Te} {ip,Lۑadx""xVjQĝe^uGGm fk"Ӹʽ4f~&h PG],$-@#őtI`"팀 j p!daHrIrV UtbWG C,WL?Yt:7RH ?W$XTD[֞k,oEAQQb|7nXE;I L]QP_ڪBQ" .ALY*&v_ɀY8yF.-gn-}"LY L>rdP?GV^]wu]4Yt-B@{~&.ҜνyǬإQ*dc YYr]}>Q e6i z4/me4͕؇"G @NPo\ _r޸DÑ9P%z/W`W+:TDk'&ʰ0blhY6H OggSB﹦0Tu F5"! ")#$|!!!!$)(&  !%$"$ %"#(ޜN ,|R*Xp(k%!ZSnޘ:ݚظFvrhh:8۳j vI%M9 Oa@X" KLUh9tDZALC6gR!{iHX7 bKZ *^|֩A?&~& v-LJ?ELc,G:vI]2_8:=cx\zA2ޢ#9#k P)A"HC è 0JpI4>./;@CA}W(Rŷ%Kkv/58.@(#YnxWi90*]qd(!RJYﳛ͕GC㨹"Y^^d8U &xodcei`]B.TUipVuN5B Q_zUA@ IOHQjujY=Z;nS®O|$$$BF$R=9qNgMehƆI,9eNR4,ϛentghRESV rJ ΩھdK`(ܜdY`X« m1]# |6qֺ 6/h%R]r,[*#/c_JqִhoU!ZW{?U0J"U Gs WJj+_dAaH*!p YtY=cD9D$r\ "7[-0{:;.(6:;$)KTdQj"IdD&T^4E5b%,nEp*`vUFf>U B5(R)n'@,;$T:v[9ThU?I+R?P/i$|XouBC@KpV!=K&Y7ec4 g/}h1@ <pUOHkT9pfZb @([@Ҽ1BUۋٴ3;֫ Q1=|@Ho 1B,+{ Y-9I1 oSD[ T&p]1Uş(Q揪Xfgބq49K"[hw2Ȩ&"I$ njxU&DWqie!x.a ABhZHB1XA1F~N˴hf] К炐sug.)i(29dJs$C+˅M-?ʨxȷ3 QT% 5*Bx|Zc@|DDR+kzHX>.\4Mk;`P+bD(b1 8O1LL&!bZW D9P`ka>m YI[n0xA!au-2@,|\CA^d~.<ssyi4{qrGS;FGD/wJNW>i).1\OTIh[ʐ^, iiY b-@ 咆k\8 MQr+cZRJTXi+39n[LaYY8 xp!OyȔ+[+bDYm"yWsz=1eT>սqEILS}UWrzwp H|&אe4OUOTxSbxLWv0XZ S:DBQVރxy$:u$_$#`ێ_s=_ T[ WT=wŴ΍R)],kFmy5Da(Ƙ zLѦZJ*:3L]͐2qT:{&DB{&` @`x~dfA1iOaOjtqq78 =JTSxmx7qV学IvC=<}8aʝ #qC!4P$.ea94@Pn ~l*~ڧD6E;&G(aV@+\=0O+=i k,K' y^jjShZs׫hrFӢ4$D)` O=w_('3|T0bp9i~ jBDӦo,"8~KfH{ġ,$̕ KzNct2˄8oy(Dг9p;J#Th9 Pp&y׊YennDZ >*qՙXQ9Ӈ")bDEB#YچR8.h4{IfIeDy.% KVj.a3bq$9{mqbZ>I>?`X7GKjS@Z\@-Խ)6}!Q,\/HԺTj)X9 fDA$cႇD14*YIM3٢=j'qt#a! 0' ~y!TolHʼ\Dwb*ǗAD<vCeXk,~VJ 4 G1 Wݲ"F{6e I],:(Oi*fky1x0YNmcb\v!-']bL^wVoeᖤ%I:W>$\- @s< hAbPYصc&+]] vU,>bſ~߱aqIOggSB﹦0NR7#$$ ""# %$$\eC0)M2a _$9dnop\e1Tl9VOh?)f:tz%5%\-$~(Oo;Gꮘy&71{~.8~@-S/_4FVQZrjhL‘ @ކ5ʧ*n! \#xY>LZ@a3 O^@C V0d*>&8gY{@ nA Q=O 2Cλcݒ_%,.m%V1ۖ[?+e̥c.7ɓqÿ)IxM>3okm8n^톆%[Sզ5A ~j*.3" {% (_+&\DQHr:3#WY \?-}i)>wi. |nCo/Kv~=wft0Ԛh3zPʳ DJJ'˜ x\5xv]idsc[bKWb}lOIcXsju5uuK?#Xd2'XV~8hcY 21  K,FtuSą?l2FR?֚}>nWwyS6{vz;|b_yJ5v !PT&@QyPe !f޵/eN–h1-ІkVa!`W@u"Wzkׯd7q\޹eL̆_*=F̍ʴZ br7B+ XPZ$K􄀧=YRnz:"68^cj>bDKY ˄Õej@4wE޻ERpEiJi2l:`F4fì?|=;ٝI׳8;vgݦ"Vb0H*@)?S1~`5/s$_֪~$k{ N"XI۾(J^ƁN@ "|>/pS\ :˯*#yfC39P |fݕԐ HoQ:Tezz׷qk]DYe_3y4,&#VPA$0D|);Ʊ܈gq GJD鎿5뱆}ӇEK.3j=M'cÑBiǸW4]<,zUιn˺|h^_5c`޶wKlO@ <,^q69mb%G;;^{om}Vry'|Q }C$Ibr;q'T÷J[w`ZFWk9 Pˉw7+Q#헬j,! \fE6 e #6K&_sBDMvEH.3H`ˁ!d[lĻ Q.`2 B:@)O/ҳ)dRWCU:=loRStlXqVUںYb) @C#owd o]UJO+I^^moʗȝ' 2=|zhsu|}h&.) G5^kVn4I0mt^fyXQi%2"G15]"u3nK8vn#T[רARprnoa*cHUD[*V#HA;0٭Ӎzm:QSTDYUԾy\\O6o:N/:濵Gtc=xXevmI?7Ο;i񻒉Tg{eExv>\ :m(Ikڜ-1 r,tX`0ȌzsYer1~+ঽC/s#</M>V ڙKŢe-,;1=?0=Wކn}bagkN]ʶ ?>U)9f(JO (hv-a.J ƭC.7>u@@xz@ E]x$ɫfvҹ})seۍh~YFDdCDE j!̱!oSZLzjv 3}&# FbfCn6~lgQsZqI w42szm%~6^2uF\/W&S M"6Sdzdݺp";dK5H2:?4ѣjzNR!jy=85Z˿zhvg=Nn(HVTrrG I״*iI `g2mvX0\gF |ļ$o$:|MttR4T xJJVL/23cx by͌)#mp2[#I>a:)=<}]G[D,Wn BF+.~6~e^5{.$E&NW#S\j7uڍpV*(89w×͝!\dzp^HDF==.s&6 |F߾py_'IT135 ᑉ$1/Q&mj( /c- !OggS@RC﹦0n.#!!!$!)&%"$"!%# %"'#~}~^6&<lPBJh|N0^)`gcALq>t_9){7OqEc/c&Zaz] .8_iq`xVt $im^WNkUr7#F#C U沬UK2׬+0*Э))^ZHai;%,3}F6O'%SLr[>/?p|鼣=ܕ4DNxon;Kx?v C=U?*4Hk-|8/ݒE~R-bDt*0u/;.qZbmvD@m ژ-L̈aw§r47ZNw8ii@,p[7@ؔ>%?4 5iƨ|֢%?ӹB`:Yi3~EgfOCopU͖juB8.wMs@Ŧ$d(HiRzwYbɕWЖw.q=Sb\"!QV농d8g}LYi+r3'ͬdTԲ L +,bsFSHw;?Myfj^J TWAt$ZTl zP<6JS LNӻ~VnfG.DׂxׇBA7;mQ\(/S\WaTg47p?tx($OFMj=t~]c6MɆgmPdK&j%R@O~ŕ;-gAT@k/ZW<׋W _'+K]v.=,-w5c;8(b=,ՎvpHK[GD4_X4PnqM/VFsX|Rȕ)p|D3r+V+PzY~N"ʈ3[Rkl6{xEtK0atr㹟ll5O3LjWzXW4lA|_vo\M$MazmgkRD%I$Ȩe+왤U#㮛G)J7Nrr![B<[_ Ijޙ\q#5f)wnez"[ ה5h,F1pb=BԚFLz&4jĺ~|vh;>{VV=H-|NǟG:\b c)~-[$ Q6Ty;iJ<]=zInIe*{Žg&BZ gY4KJA HA\ (^\vQ tyl *JQrE5 :\:X>?aiUWe7Zo% ..k4pQkCMNe; (#RJ¡`LY"Q&DONX,K֮= 0|dEAlsN7o^]{˯ryheHs)E9?Tέ<}}/:DwFg5 Ufg$&p 5^L7)A ATn"OGсRldrXfBBYTSv4Xk(Ϝ^Ynݡ\]+nxUKC TX?<pjj +ܰX<16rpH%M2GM6 %4b V]i`뼮xjC$DMST+s=Ds\NŤ)* DW5C؃6j*iIYnN5)yL] Jy<Nv zMcMLx'REyIUqc-$tOm_]z`㠄jH[?:8t{J6.(w7ix}.Μ'~7Z\9zfX'J> pM]^_U E; |e&  i"JDatq)_ wwp#WY81'cvt;LDD9d=JWUTo)ߧKթ u[(m~;E5t?m}! ޳Y&'\]~6~Gd3N x<7W-d WØi ;9$o RtUɝůdSn.+%dDx+VhĢ 2!V$!hӎF#d4yKR]d a(,Bb\r'ow|u3_Od >̩l.KA,|ʫ'sKς DRׯ]o`(b3 \BFā1<~8f~@0(J@pVxxB$OL@qok,u?FTC̯t>M/ϖ{<(V?f7'^R-Ym:-Ť:Ό8WB#v 1oMꫠI\[WkenV@E uA%AEXOggSC﹦0)7! !!!#"&&#!  &'$! %#$ ! "")'%<Ղk+g}y=0Qyme"dU,㗳 ӽd{80˜"\Uau[f?G~*3 ׏v/#GDWbU6vvT|v#Vμ4Fw' L1U5D|)6˒壈*DSYjMҊ֡k3u%sLUA4DaS2_㙢]\:"dUv]~òO@7u/h+ 3dg̱$íHn4S^Y<| 並ുXN:ʨFʣ}25pn~Nb@M^vEILEn2~K%ͥ:]6Yn\v>z G+S4E uhd)$ LY)Сewwr "ާ{nWzmL?TPP[j\K>ͮw:H٭\Tpp3,át8XNvBdo*Tsy|8pa,ڈM΄lϯfc\F{5/Ǝp} nIۃᖺ껺v+%zAQE!7[BeY~-.<^jBk"SDk ~МYOѲ,I!gh#wC K뤀S14J-H`UfY!* Xy Kx#Wz$GȖIީ)H#=nsx\WeŹ#%V%k)[ VNށ$ bu,n lkg磾Emr^ID4)7j|MsM<$gvo_O Ij^_C۔&-z0 (5o $_9~#hV԰\XW$T]WrmN_ƅ4CRϫV4uño.\WveǗ-xPHZc<ց\]"]-L{Yʿ*uH U%J\Ym3hEM|kZ\Y(t9@ysS0#++TWWV9uXtpV:IL[ۖSi>z_Ujk lc NK `N^urﱾD:64cncZͰr_ 4L@p?Z}jYNCye\|3:VIK'As[\_idiֱig0.[ d%xypAAe:Tŭzaz5>65/:rB'7 PTKxpG|3FR?v47\5~0xNGҼhf$Ʀ3!M?~|T_:ޥ`éoQh@ 0 \<D cI`kTDʈn\.U4fk() .M rѫxQtzQLGCzlyOp'bo CHཅi+Nd&ogyvHCe#"rN`E 4{f8Ez g>?E i6Xv3QD1&%Z]EGӣDw%ח#՗at $KJb.MPdx*D@67{p#*DS S> ,NG RYw"\[Y,+4͇njӃқn@M\[$k Ej~ zl0kf5#LUYܗEkOMK܎ŸVʛ ,SL{*j n,(*DTWY*HTZr1/U"zٽY:T_UP`׼ u0~atTaU1&8xڻ$Qou4옇Tf\Ƶv\cbB yVl, #EdӊLgy[c\Ԏ(8;w/|TEu`'ŒdH?tpS?b Fl]n%X;o;f 1 t!}0;r)$}l"ĝ nň1v_?zRDӡr4bDyENżl7ο}C4ȬQ,tl}4¦T`RmyZHxm1,hQk;ia ʤ^_1XhXbEUc0~6:F)H VP4*aO(CfefIDF/[㲧ډ+/|cH YF\ 8,$C!ԡk-#pK=+3bZaV(͑búyX& BU*1ց 8>> W͞(b<j4y'J!KB+, s2rr2;a;'D^oʡܙV^g%BhVqU%ՄUG(q$K9,?Uի,7MWX".cY*I /Z]W)uHO@l(:u1fp+ÇR+WĚQ}/I#;$$]PSWuKU3TIZ*!VHDhh( Qb#Dz ~O)V-6]o2k#aφT6F2tAuövΪnGڐlѶjPbYj8F=@c (+P6ዥ% P%E),=XX%{-XR~-@@챵  nDE7!&hpd 1XSOCRf-$TĠ p\LR|LI vnzP e-эoE8gw3sOh,kesiB7%wLcO:{ܹ~xPtseb~$xސ]KOHaOERbXk'/sۮYp?Secc '|.AkF*l_P2s^nLzzPJ"|OO1-A`T- \ߎ3[8V9/_%F}w_WVj0PT[ nn,CxhXT;T5L 5TSdտ=Bex_FCt8\[ңmyhfnGvLґ~q8 DaJ.5I R xCXCV̞>zkVtS$p\4%  ?B\8˕C)Gg3W,W8k_4z#b)~rUd䌨h0 \1櫢:,vS\.nix8n^^fѣ0$Lc!lsx)_kHe+ȝҎ]c=zx3ȹݮwC]2O\WlYgH\_sjal6'{bң<,xm)z䦢.D#%B5*F|(AU Yj?@F: hN>*?~~2:wXƎbk'juӷ?cdGN >::PPxfmE0aȌ`#e]jAGXOggSD﹦0% !!')!"!"'& F&R>b@xeĈw˃ύPDD){}y~vb$mp>%qB*}gUz*7u9BA Cd[|UAz)5BXMEkEnX"hT[QHs|y-1=ps _H }fmJM\J/%ԲwU2BԫX k(A7Q@ . è@co/hiNlxplkqv276J`dfOǼںm15J8nI܅W{1wok |fLR2BClIM_o)/Q.5_}E0g!{g%ڧҽIPXZc ځ C?[IMG%Oo'å34ͼ><||P %摸ɸk$$p}[g<1vP:,z_3vI%agSJXi9gh4~ mXKHA\LBO7WW:sdRL7>n-@x ӡ"b2qiBHƚOn<{ӷ畣Oqy4;5ݷ:kӼ.9nL+esV$ l3WϦkΟI>6|(:ttKN9n5QvWK+ٱfcpP,W ՐR |z|f yt%lGdXeG#QIbލr믿oJIz@ N"Pm4_I4{_Gѐ-ACCg-uMƈN-Me <`b3rK Y㉶pYU~|vWl&C!a`J'ێ'SG/gr3K#yu#t? 4n}*tS{bD۱r34Sݲ8M<Εd?f}ejyyۡJk[q&=Jb&ָ\ZuF޲^||e ӝʕRg>~v$1JdNKg =zӿ~c4$, {Ki` :iusS5FrTp@[>(>CMFoSLdrw47e<ƣCU4*e#n Ω7| )"FAnUMC@ (g9o콓h׹ !_e5KNwV]yS,fH g"ڶ^f&o$v%hgר榾c:t>ְ6Go;Jۨgf}tt[ A8Jb~EF9vK0 RpEapSVEK vGE%Muѱ̐مV l&I1[5W!!qJw{dޗrt_?5 1]zCWZ5Jzt$Q(*!FmOz0$kiɶ~v.A!xg  "| (UJH2q^c['!G)Km.>QӗB;x ak@NJGÚvz IIFH%m&r !Ivo0Ƙs Ҧkt24L;7;D$HQWmK^@?|h]F'|.pv)UB-5) c\S.F'GRNK=J~ aqqdqO1"PYyZTK;m~*3!r$ѕVdS.Sr%e fa@Jfz5T0G~6dPD|ii*N&;J)kEi\)aIhḫS!:S@ecR tFT*yZ< DR +k8v3P!BH>G)ՠ3/:ڦX㯔Wv:&҅"$J 5 >1!c5 tĮ ?H#/clQ4f#lGb]QHM R;>PѸaĸzޘ4Ě[lgt%S7$߈!⍥vȌ.\yW(Q^u%@0Jp +Y/]J0u&6';w=/o#fmY6#U|Lē- !* ;{,HKd7N"?Q:ו)o0 zjyP I7\TIDP!m^ OggS@uD﹦0:1""#$#" ,%%}z!!!#'%$~$""# #(#~kA"4-Si ;ɕ+RFOMx_f,޳ݫ ̌K5 ypUx__\(6 vܬ^u,Xk٧YI?VɇL;)dnF:l a6fԍ1jYƢP^"A0/͘!x.Pw TV?Uz!#Lv43BtKCWT;[>Qk@ƬalyfiLa{zπѐOmbOQݞQk] AeCa V2G^dP29˔!D<DIUu"k3 Ïuɦ$z!;:gww+lGwC Pi"6:AIɑͶf3*"+m*)}<'j\_ 1y.I_Gx\m] aB1"+]P,[xQ/Gu| L[A4ώ`Oýx"GRj5K,U Qy^9sV3ӿ-؛aEDSQV_u҆nQťP,Y#=dn0HC#kDzw"FHC(LY B\xEG`:; }@+CT,DWjSivh iuNH)EISG)s?_O:=UR( O9(y]ჽu7=:=Qzlc6K՚T؃տG_moqya TeY`'|KWqCNȯ)+׏&<5ґ 7b"-p+Ȉ!L&ę P$IMk0U,eNwCM>^mK::E}w'ErWG ـ4v%NnCvC`;P;v r爬2pj! VcG#Q;zO+nO1||;&kAr3u:T?8`Ҝ̏Zs:|nU!֢HAD:'Sp!X tƢCbKsתAzFIB$Zɓ0s?v51n̎*҈Lť+`q)"M4>`(l{ Q 'хtL39QsnU)goǔd$Z;dD%٨#Wr?"`J܅j䂌JIXsL@{jSptr^)S>ҌQ|p.0.nc.FbJCRgmP* i"`<5Q$([P],,bB}l6CAP\pUD4& e_9eN=.iZRˣ w>RHNJ"!*o2|EŮCbcYBCH . i,%(0 ^5IhPcQ;H:*.Fyɒ);˘'96w,bJ%G3̝%>qF# VJ![hXLM* %DhZrxIȄ)PJ$c@nhBt) ޭ.s)iҕFKtU >݈n]3i]&ds#;>6Ma:b9s( AK-E:1:vN/$Z>!`rf:CXѪX[V(ri ׅ+?(8P3֜7G6N\]n{{ n RH/gWbUA0p NZ|8F9>АHH(BP?؁>XZA[֩]!/t -AdDewA.zwpi'Qv{<~6Iire:nu{YR`"ޒ8`:ЏZ5V>ئs$ȨU\`Z;~-IAZ,S&D##( TWaSU!ÃنQtB0Odaa98fV,Ր9*#\W8iFܶ_ 7~\f=XMlf=x:iWlDD4/ۜ-chng5Hr': H @܂%ѰGĞ/Sm-+j{TY֜M(RL2v.]M[¥*><)vN Dhj'D @LD阆j%9M2lbܤ_--G fW>+ڪ `Dj Kr ^8GpMJJB֒{ّ |Ƶ,yCpzϞծ\sWg-l$"A"J$0g̮^q6Lu0-$[2y24  '@s%UI p!q!-b᳨ ! EEc.mL<1>'ϐ-VF"dA""1NC[ۄ$7ch8KlNӷz~u2S@Pi9pԘD& (K vQRhFAKh,e1: CKS );cMN<҅`+R&Ϥq*#8(@ `-Q<{4ʽ|v ".%WKԺ* $BH~žf $km]RV)=Qtbч@y,;9!23q6V.wm -QXy}8DzYo3BnjR5 HHY ~lmc!(K6;s*weS}Jѣha>>pa9C0]!'\xX @ WA"Bº:5 " Jf, -J/ZBmUh(vK&ʼEMc 7ȤE(3hjQI\x'"]$) Od o}/0 DV  [y]uՠYP"KT5U;FҐDWd Ն.c lɿ_9DZQ(DS+>3=n*,zbRV˸@T[=ïhssǪu@y?=GnH+n(Z4SGL|sXچoG@rC\H*,RJ6ՉO>`C6p8WdJeN2%%x]"qC;eYXD̮I&Mۡl>Qe2xuzu_8٦/ջZ+6:Ƴ/⧤_eZYٞ"y<@x,2 ]KOggS@D﹦0c4?.% &"!!"((!""!!#&!#!"!)&(^}A"xV<| :1}&PTJFFqyJ,b1,v M>%rH9%vRdŦV6 nL MQI3 iĕnqUGw1b֍gÔ/Ps6+¾NM5}Ԑ煄rBQh-l.wiy&:~cUa{%ʩnl:`!@1`dsb{m+H q~64u!DQ;y}|E ԝXg")|O>aM.vJ20.n^~;&ɎJhŴ?YNp/ກi$tf'vWtSo_yezJ[!R LCw۾UeVn"R???nw2ݺ>uY)SR""j}բl5`cɯu٪B[t.rz˖IH\@!I T˝ZED f1\KԘ'f%TJ0P!%TU*ģu xq4?oW8mb\WjWV!4 @iJu,l*9T[ii iK①RtJA U9A.cٸ 7y>% A~1dSVE'611^w&]h<+12ҊF@RKDYn=eQC![ XRPT cQm|o8[}D~>߄H?pwOMT4|NAVkahzl磫{A¼|g8:hN2â ܓDu~z(>qJ-E+ I ʂm(!-rxaVT2"XTaXA 8XZKATS(TYޜ{b<|'K'4I5j̍Lv d]ӭ 5֞m-luov}zARL[{.~`[:^Si gPLW*$*&9KBKJJ)֪RLU*WglIws8í#U˭L[YӖZ*R=65=fp#taH|F*ݤm 8`}{HeͯBqnK`~7B_Fhs-<'?z["B? J[ڵHAaSAWA{V[C~@!C:c{̮ϦiZnp(}#c#ӫԃ8zE3&ܪj[fo# YkrLDj/&wPqw sG -Z˧'% fÉ?1Hc;t?_f[JtsoINIZ`Gh@0hbv>x_m&KwRK&tZ#c;H K%"LB dX+dn(s  JNw>V DSUՒ@kImző~AMLWՆVwkyqǭ"CtDۉ3W1-*Lƒ?0 B4i4W)>|sْz^j»wS្ tcH~Pݍhb~ߌf1_le}WYvT;z}T|l~c+tp%˹o$`wBO%ESbT>M'H(iO*ϊ琳X,y\^yl#䪞/XT81@ {xGY KX)tBѡ鴍xCl\H} +ׁi4>n֭AV/XxZ| bN;)v!;`FNp,9lizxus[V»QbX Ԋ1ARԠ U@@xuK ^J=G"t*hN qM0,Zf󔫉}LC(S41F.a*NMHccӻǾ](@Y$XK$ABȱATRtE \vJiwpI&,*I>6%L݂TZUi)1Rtp`.H (N*lH2wi|n"ɉ xo_ֺ%(\ AW[ehXj, 9b^")" 8|6IfKEqq OggS2E﹦0.~!"!##!&(&# !!#&" #&#Si~&RauGM\jsڹ2`(Z|˜fE8{F.Բ;QgK_Hт0!kB _-(,aHIR/(ಀ*.=nu6s8)! p+Ic"H-(z4>N[ZƸF6g86Cx+Y&V˛%u9UK+|Ԏ/!f! P0Ӄ 0U g]"@#d-\`pR44Da*{4L99Cغ|,"x=ܢqV­_2ө.|6hsqt8Y>"5aM.$Hh^8ru;sec(:ݑW?{nrj<@rc0wyNt\/-?sȤt$׾iXrP9*akC+FVב8ZxEDZ{C8HI{_?QZz6? N #RCC;k7g]X9yÏ[0?m!m k -}i1{;Gbgѕ@}0ٌ U2eJPF;EaPq TW* jjG\  't fd@!x liO4CrRvOPl-lf:>@ه"s(T#+zuH(gMYB0+,ƽbm Fsq8CáV/(/#/}ZEz>pp~_xѸgN윶\1)]UvPe LIV%Y#QQ~QS\xc9>Dlu)@ ]v, +FHmy_+b Am7 Lx (>X&n"^cXح[iobt($j zsbnWZ3zLM]XnfK+7R5bPSE0O IpM*K;VJWŘS+lBhE iLT-?quBT`r^q(s뻜{4hWG/?λZ%zO瞳lQ4 D:J|kᮤ1 XWBm 6>7. ze)VS4WU^YjA֯1n%NMbvY\Ym2yb`)eںZ|kLWGN[`&w<&ɵOro,ADW +&ss҃=G|L%L\u"PDUL,rƒ/E|Ό!\UҸ+:u4|O~Ssv;Xq(LYS-2Q_uA 򵓾|V޸%\aö0 'ɊN}||-Tvo9 TzcnbEݘ #SunȲ,-23b=?=&BB9>М9iv:n+ ws{G?};sATs"}DT@'|V󙫃Z$#)2pLŦr_ܰr=&Pyz^.ތ4ap/;&5Bh FL. T̥f&r^\֧ z'PotӭITW + sVB>Wm7l$0DYtOIƇ&t{ZRzq_/Tat1bs秊ovC:U%+ApD(ZV*س9Nq?QΦ%3oYϗ6Hz\ݹ_?ͲøE_9}VԹfw- Эƌmf'~HV] Ǡ(8/jO\l禲-x9Ŝ]yY5/5g{owu}Β:R Je~,fQ@vX;xNw@+UU]MfQXZmDiх\ctޔǗتz_3S"vVtm7l"nzblA@jۥ*UʗF_(aOyzcuN&Kjuosڧ(E4֎X(˓xc~lI|f #d.PMlfm3̗̲rt4z+1ظ4rCz(kZrShun=zj:jŖg#bX'0<*S6&2G9[?!zn|dH{Ҍe~AAQ0.: N*Ԋ%~BDe6) ˯.vgx'ܶ|Ģ=$ܽ>bV+'`S<s;̌˘L%>:ij,2N!밭 65LÍ+V1]-O6W.QTzJBcrVk"{EA@n0!7a\y\\u[4_'f^4(!HݮQeeH+ s[A;n}Qטe5(q2]!Ȝm͍}fA Ѻ\~w^*V d8ĬlA.h13DaJ)~#K{‘̺ƸtX0WOg &7FcSw/ATZ|Φ~x6vj uD5ic>'}7B1RzWt>]Z)D\0ƀ@l(ړ-\'t!@C-<[4sz@qSr'4>HHfEIlH69ڛS~>WiJ RQ BlYhᤊkpl:Udg}iõqkO;}c嬬ʖՖ2+G*nr"sxGIOggS@E﹦0g2$ ! ! !%%"!  !&&&~ !! &&KS,_h\`~*2QR, dx)jMq5}鳹뙪.:%vu T.錀QG#рJXnwEa1BIbTCL8X`;^o^zv>M?6#]A:Cڋie8rRǵ9,c,[L_TO]ڐY>Ʈ6[#7k_ b - \[ -:i3(<9[Bw~ L]D.Mŧm$/ HyP*L[.:ekw0ϊ5~\I4[xT(qIS7z_H,CqD[L,JE{ߗWipZ]/PL_L ,#z1K>NZ8T]5WUA|_7a10|JОΥq~lK&UDӎ 7:o*)[E'%hʡ]+•*R{^f12Y! ;\?!Ft|mgSv6fnFptVzˑ4 Ѐt 0T\"^GUZ t JR*h(wT^ 7YtALLxg- wڹ>LҌ3Fc;|DL fFҒOh2De봣Q#%In͉cWڅeBc>}rÖtD!4ѥ6: A01LN~ڀ^uPF_O@\laB-0eZǀ!@ g$T@2V-,.n;rM2qSd8zx٥j%ARk@U' A'ph1+B+ .\trq,.(,i~ HP@7Wi ֛JU˘(5Ѱyrx0Wq%x2)7+ d] *ئ~@Z˾RLsn[?\iYs3`i`$B^dWX*r'z8XJ<Ƭᥙ Kؔ'RD5S>cC#;MۥQ;/;%&[O#I['ˉVC`,埧@U4Վ LV\놅e$ΛbA,6*/L)",R%\g]a60QO^c%rhdL|A 4Ӄ"P?#TVWIǍۖ,^*bˌmt>qK̜ƤU@%jxY j#8bB57\T3Fn7K&H-~Y0ФB(ս0Ʈvsc h‹^zސM$0 DD5BALSuڱ.>F1/ZG !ٿ%ĚL[Єx/:8$,RP8G'ʊ=0r=ɑPٴ' F,LO7rXc8@YƎ&p*)HE˦sJ;٥ ?9;4qP{"%`:XC;ЮW$np;/.5hMB(TWa%P\NSBlx6Tq%ӞgiL7'z!aO>sF;61k΃׷݉vpJ̍:S5}Rwe!-@v5xPʙ Of~Ga!RoT1ȅaE\ NHn{S)xNZ>&qcK2sljN2ph).?1YQO:C.ywG,eӿ*?a*)f.aX?= 7mlzS<Iq]*Ծ,XuĢ<7 Ǹ @Fjץ"g@J IKL)]ш~1.c!Nzϳ[c˦}ыOhRԴ#fH$ *mXA跴$ ð U@EE|ET ?Q~\# X9\rzL5'OE26}*C?5_=À  ‘]h0\Q?"QTX XnV%A,;E"P\&(k&H $n-;"R/,kʌǢ+`qiDFG"9H^]^s{o6L:q&D9\k}zf'>\fpp|~Nh:j޼DL^tӏY,i }8=dhw>q;FtEcbXK͉'U/+ed*@@BtHZhE=\)AFn /1 <`?AOjNrqؘ fl{GeObI"]ڌ2lG+k pSo{\UeT%^C"o`5nYU! fk@qkP oVDU'py'" ttMgRp|Q Qe+kx:dM\W)Ksin.^x iczL:VTe9,4$-4'1Em~>es_3o ,`F8G Pj*„r䏋ĵm~۱I~rNiN0^9EbfgG8ntNx52>+%&jpz;謆l1_C44@\Ko_p˾RZ FC^%a D;X0RKfxzX&ԳO4hqGXW7yE-{2X #+;VB\43F ZVkMYň"x<`.I\ҝ> K.b1 sE4nq]r#^LW,"tyHNwDD?ZF4o|!IyɽD\_DͲ W_tAan$$׶TgGin_dg݀> P-k]rEJDVK-z ^-  dd5|u=j=\؟fMtd:I5,Y+E* 0bsޟDh*MIH$Ŀ7rL_U^]0㈑Ã5j9_~g!ߋa=UJZ*`mQZ*IN.JWUkLJpOG B EfMDw({GlE!fh-N~},x%d,6炁S)cOm-uZf-=]! ղ#~#(EX+p{!jV*:Ԥpi #@t`߸;;*ϵX, ^ȼ1?NM:v滛ӌˮ0KqNAmiޔR&[%"cI0B(e #0A Q'W`QZTOHTW`]vI@# }g.x8SAБb|?I&;'K%e8qzInqW~^0*[A€:|- jRx Hmck` KL.kQZWpt4(߶EiI2Ok0qix v LT#@0m ?+L+𶻒6ZuŔ}b@BXII0V^ {^#@/8)633+d]zn^xq}qϚg-}|&Dg→AC^`RVx}VܼꪹQX(zz=%".M.uiD#%uBXl4ps+0KB:Hs0H:χY$3>Poú(&l+3"C<v =<;|أ " , 9J-)qmS.C ;2KG&o+M ӢmJl^M2L>5r7ۉ]Qd pj=#TjI(`j{Cs ׃fW9P;k.)}-"JnA"^pK&R8 +%E(W"BE:c͇oݱ)ؕb,!=W7}cn X{o,87>o&Ĩ >V {ߖT B Ta [.4ħ>4sn"R̥Ƌ0f P}RDWUl)=ǭ[6-VulETBGYo>zEI@p bTY㫭fEZEZo9,yx" kqmv0fUUu`SlW>nUSV#,WUDUc;<9g`*h,",ղ:4-޺v 2R?wvDYOMY^[#kZ#m/kWP%û W7 debYYp+8Wב~\ƨ뼌[0=Im\dZp`-UNGO|ίFzֵ2MnZ> ab'\LjH8), ֛do%%u[3Ia~m2郰ۖa2pDF u@$i#~6n>Gd|{Tdg L'.nWkԷNA*d]HkN {ݎ.:@ JW=MDULsNO?lk]Ѻ/IY bm#NC99ܝGPM̢[N/[EYB+t1Vrw9]#xII1F >әd}D +<8V)taȗZcEwzgU_G A ﻫ͹UT@4m)7Vm&tELyn;06x-PB t.nDXvpDY V`6NU_[J`ѲGP𹷓="sI"k8gϞ&D$a vyUuvjuMdHoԝoO4 +) 㐚W4Ѱ^dJk_-3;GbDM=Ux~"gPj\[F-.(.u+UTX#\arYP"'rm=8F/Sp^HKQTUtՕ<);)QF-CUp3ŪBپygi (4Wg._>Kǎpkׂ]뵎_E`MHL@iVRZVD]Z$y`~|),{E|g0APӊRg(dU c_]F|էl,]/{bh#ϯ#!!MF.ײuooܯKCf͚0=ݼmTJ}  DYee0!7G:=3 GLGIL[BvFHf>ճI.RtαͮyUi)٧ĂF^~ӝՍb$QUmVB=u[ e씤/LNNWM\af,bYWbzV^>L&\etWirtЂ9c+쌳XtԸ2n% `􂉤!3 cWz{juZ?G)ё\dGGơFDDr{)0P.@3[N*#ђf7p11ef#]hjFGªi-ϛFtzeAZAhո<YtvW^饬|&d)(f1݊R "C>3ր %1 I\K`(6bxl_Kh\ӨT~:e2''?2oЕUZ҂0VJbY) E iMCaö ׏ZNSG-z4BIuH1rH F6syC@~,=Sȸ <,?cD*/_{כq~$w4wz/2/VJҾ- Rb+IR,umj*T̔[ UUeXBdZu^1=Pc|1@p[*BsbO?s\1Emsf&-QT[0kM "{ԃNgF fVa)ώ. qyz1lK>Jq)?JBi*j`(~n)mRQ>abvZTїr:f8#Il]m&{%cs؝$׻1>Mqn XNg*ʾ'k=ؕǚjTXQ "eG*; ua3 n Z>L^NL ٩3:T:JSv:Mu,bdpE%ӻGykoyJ貲 @wV]UZ#@)T(+ }u⺡W! e\ q<)ުK:Eh91_V߾Ғ5sW6BTA?5,O#^w}5(ȧk}bN"F!ԡ߆EEJmMV=?84$"iUeA.D]UM]DI<4e;y5tpQ.TWSVYA='-I`tj`ϊw T_Y80x@lxe]nnW}$LWUԚӛjX`1dVh΢ b LSTRpNmܯ5'}:6G8,Uu-v22La/8=ؖRN7nujReGyC&-ajќ+8<na8EcA0߮)y/sTs+'Dj\%c棕и 'ֺEr-0X^z/FFɆ$W%O%'Bùv^jML*kJ9X^LSn$Om+8sIy:>mow]^F^|9<.{^saO|W.Zp'87#Xs 5 W+lqYJ'$`؈^xQFZxmpQzA>ªeQ[T2=N p }c$57@3T0"C~m""iãp6Vаh(VpIv\@@@VGMw:FF)1ؑX*+mzoGrCD\^C$pt-ub|_rAsw^IMƈߟ^<9)Dd ig(eno@v%Ƒi@>DHΛ [BFdWwCJG" O[BgMV;9k%1pIb5x56c BpXscv0X|&ӿQz;C"wC,bx)56AC5w_As\Ma<+X6k,ajg(56fpB!sj; f|K ĺO#8}>nߕ65QH5dDUpjT pn):kJXr~(<8;gu\<N4Wd15\zI^^k/v^Ϊ"<]]GN}NCśF :Us-0W1ZSJҫ}%X+=3J9Ǜ7S}Wھۺ}Ո>p)FAM{tu7@_:Orb30=O UwEZ)=khu:_Fݱ%&O+y4ޔ+XFA]"Ǣݘ^%ՇF4ҥI;}tmCun1_Azk\e#F;giܞozfzX-=311$Vu12vzn WAG\UTOggS@F﹦0̩Wµ'(([E h,H\NXR5"3Gz;.iR ۾­y5˫ce!Č0im66Աy2ebAcĸ> ƍSnױn8ݹvUL+_*WSjvIucvD+\Y (qFXK% ES\2 EǢ({v:xRV6MP K!֔YHCl2yѸc [֦/s5O8.ӽ:5rfuzRWG 8|MK 7Tτ\ fC[X!@7̢ IW_Q54y>?SuIdN%D$`#\gDTJ ak5dv=62}L_wj^Yf+@;X1h" /$W\0w!@kqQ/p7K<6"/퉯̪õ^& :prΕ'FPҔ5wjT]qv.eQ=|޶"@X |GTp:[erz`o@ [%2fIzγ;ב_=!NUnuN?iv Vi7y(ŚHy]| ~˅hP3o @H]@v 6} 8a?qYĻMn3Vh:Ќ腞ΐ*(0;]x$4SNǴl@31J Fó`J jɝDZwڦjn~҉qu:u=jt߱!oxS'+BB7R {KjGjו_4 F?eaE$G.AֳƱu/ f&TD&MJ{k4Zhxta?~7L5'c8x*NeL|SG1SS{'ֹbʍjNR|uÍ*e+JbI~ &`F+ƇoňIzX%T\a+Nθ^ GS(WT22 u<(oz?OA 5tyfg!`\T`%bnػfMTcQN}iJ~cI5{9O~r2=oF8Z$4sf,W RFS$yÿ V8 xb+Oฑ)(eL ֬IX5]h~BvjtuZI'aw)@yZ&>CϊHbgG6Cc`zV'Q|=~5Oy)qdשfNo |ꝵ>!r%.R@PD%c`#a9!qK*,*,I|f/]2oߌ3D:iY haHrKukxdu7;ŷ+b_;PSx16Rnf ^^/q9! iݮRsTDpKzcX ~RPޠVL*&4ÏJ|pBRͯ.[6fؑƽI~;^;|nc1TهtH^+%pǠ=l4i=1UC3ޛ8-n( [cM_>|t=JEQ0M8^ Si ۏ(EmqNI[fMӻwkW~umB5$z Uq( &t O"q7g6ڏtqg1PY|{(H(_4>3z?ͮ) @TK~L؁躓ip?D4OKl. wDS#vǾe_NJ[~cxɓETA o ؃STUR,].kt Vq3wPdzuCYV:vpp(+({67^9cSX8H9!o/; B:dq9Kע+2X| f$ A)Ӗ N^$sl\`s=S}QSg}JCX*/Yű7)JY\ʨnl1%I%wI5W7R?oL'٥n?ovJSiJ2\dג?tgy-,% B tc6~\C-G gՎ)ZQ=o,l`xB6ӶRH)RGIv+bc A€y"@&:Iyj\4~dn-~lOD?l߽ΧRPSwo/!alt{JUFht sL|Nb G 婻bkې.7nzCoBxet&^1I(T-qN{,huֲd)kx/|>[**Fh@??W/~_|Qy1wwE];KY*wjcO9 N4H&S-57)N% /ވeŴb0.XrcD\ʕ3T] @,b%So-YOggS@G﹦0W%!&#!!,'ns@i8J(p}*TBU+OiH0 Fl-J]:[/y$vIW-y(,XuDwz q~א/\f65*z9MjиkZu[:<:nw!qj{띍9}~k5fF.47w1~͞^H05}5+ ؕfD<6Dрڝ#<QueVMCB1?:1)ݕ r[=9?Wa1(jhoQJs#Pdx{^ >^P d7rjX!JvJO5XG^EV~}֓n[l!MLG6c*ˋt 5$Ҧ' `j8XåBX:R(yBh\#T_mv|=)m"p@34ۆX~ܯ#\0gĶ^PױR .J)ѩX?# ~Sܔs~Ę/Ѭb푻SC%I$-075\ zb`ٳE^($0!ݮz/ume4{Ӯ:?ljծ|6\q׳rvC,up_D%B5^ 6 ]}^9_cKZd1|Ϳ. 30VG ß'Go}ӈDs*7'6gwm 1kZxmm#pI'ލ<$o5YوJ6&g̶^A̅O #^^qy,LRťւP4:C3y 4,ki <O~uNz`뙡{uzv Lݮ\ʎ0JF]]y.%|*Oz/lt|w~ij.8ˤ>7O~sTm8+q;߮ !|!ފ_F;ʊsiqJk(H*sҜ'Fϰ{E_ZkLiz][o==x||Z;"c}ޮm΂CS2ӔtQWs^IܽNWJK7]n~ymؼósc7%ڱ>ec`Q˻[Ę=6罽 ܞױT׷LW7?Wwgu^_L?_7ţ [?}qP|̏lx^"m^g=i0-T h?Sjw%] 76FiM-Rop!Jx^Kn'yhvSR[ A,aO>/~͏;P9JO|{9TkHoT/hv'u7&Pco{vRc.ȃ֞~qtV?ɖٷhD@hCQU?1,pSӕgo+j*:4$~kw9kfd3#`DOU~7)<K1er=EUVJ7\`m xPlmfi=tS=L_[Ggx% :<_)GzNfwZ*T1UK[VֵI:ەKd[W@<_23rL:fj>b d]CXj!Hw")dkHRm)n1cZ-zܦ56;vhDո#](xq*VK7Vp\E^LKF:1M:OʰMW ES;4O'"dc;i?(ꘘq+HUiO,!CGr!H6*T(URdi-KX9g{GY ME!KDA[0TisKZ4up/Ae"޼_/w lz y^w?xIzmW]?޴)0@@k֑ٞ/)rb_RZZ:ܡĤ%P>bHVN9)\@7`)^C;q}dqwgZv|4^k>jwG篟m67A^qW"k#vQ*][[#E tHH#AC;pxi1kӳ[j. &u֠XND!+1yA dXU@5 0 h2i1Ou+ j5vB?Y2~ tB|;@##@@o9=JuڥbCowm )qeER5td 6--` ojS/ QN;djÐ#".i<6~ICNvHp1DN&%rt&pChf59< +]Gx 0ʺj`]iRBf2^Xf p\n%IY!t^'RRyvRv_96+g7:a>:c-Ih-6e,@B?EdQG2 5a]q E Ú(ۏbĕPH%NשIz@[7K*(OtZK о!wz>;qn۾Mr35>EU{lij)nDU`fOv`B@4EL(^iw9O"GmF^/ӇK_-_?q~zv_jN)E hJ &/ӆxi QIc:\q%{f1F Rs`TEtތޗ2/S BBМ?2?&<[]h5 QK iKݿtI2 qM|b/ &ռL[R:޸ "wP[lI(cњ'|^eGBf.AXuSJww dW?loݱy vݻj`.C #00XB,r!HE _|UP"VF]Y ċ ~<.8Lk\q84jpU~%KL`iSsڭ׉i 4厇S>x2eFho҂5MVanŝ~tW 3rj̑nG%$׭"?D0ʨFE>OggS@G﹦0zA5-UDMWץ~ xQQhvךک7n'}_Ny_-T=mE@۳ 3Y[X5V7a*nv oR s%{fUPD5L^XZif7.#oF!pW;|ttr5~vbxo^6NJ'+=TЖ;u3ʝtgi,j`:!0;r(I٢VRp3f 8촨矦Do4N:q)b(o黷[+etmq1 &v G?D ek`q20L]Aq gfˤcU{rB$e P^ƹ;<תYn.2=j'JHAZDbLp3?ns M/Ҙ늨\;N@ʄvj}glOw^Q*@#Au5V$xR>An)Cc&p2Ѡ` 4/Mbb@?3,sXa_-lvQ,ְA8B5O@JᢺppQqa}d(\>NV V$bH %Vn9Fcsc5)0Bɧ~_~.#q`~/P]c[kq`c#kg^22}Gwd+v8gINRlW3w~.t7)?yWFD+ t8D%ޫ;'~a{ȥt:WQ7 >anB)Dh\5@-qԡ^\Q!:Xf#_U?}|49CY{'>^A޶K6tђWnx]/rç}MFb} c I(@HzkƘ&nRQQipzɧmԺ/2R.urWCKuThBҸN<0_N?̝ɧoUo7v'L wc|66BrےpJ3#2DUjxYJƍf?"<.}]NP4.  gOuqgF~Ao8Inu7=FI{yGUpϒG d2M@ZסԳ20=3kfleF7e=ӁnMᲬI8%WpK,aOa^\nXd42 ౎!IrzX4?{ݷrdY]1/??yCY*I[@ w@Kp]Fjw|?MiCfI"s/:6dtA~\R8[vbb W5,^~.udR0]bb* ppiReH72뿋">6h4Q"`/Bڧ8^ Q:ZѦt y^3LW hohʨqPrw-e`EO44>lnmJYL𸕱v\$JO'^WgsOfǖױpY{ٞ;4>U).J;VtLZ"%vB.cMo?C<0|W.s8 d;7G"%>U͏B,)+TY҉Oԛ^s>\n/@Oa?« JkSXO;%H j}'f?x-Uvjf&H>2jpշ"@Z˒LdH |y_M嵪ėj;x9ǩ٭DKi!DX>Mb@W~jErq5$84R)QLr83h`{F(9۷=9wxB*1yʎR,#hLGo''3`vJD!j,R INn~]Fq؄;4zk~8Cg1bumɺ³ `&W3ͦ (njI33\"3SidODWae}+^n5tvNK@CK1 h\&%%y@#wM~/.ÑPXsdk(Z.V.ec]qgg^ni-Kh n^lj Ϗ3X8YXZ@g︵~`gޔY<.Ib:]~!:D|&YfZu w#u&oSC@~7BqA9qv"۱9Dž(ޓ!B vBD2DBn,Ќяp`*c)!k\ G؍j4lD'k(- H39.K=&o3`!CbnH!ğ]|fVrl̠M#ϥ(ש@ |E+v7*DCYsҾ i$,?*bW4}}5aH$4x2 Zd[yvUY~;}ν[m\OV\%LW" XÒHKMk4Kt|.iW{J &[:BM|6pZG? #[6_CV;bD,xڹ}PKS khVE.ц}- 0uR-`sa܍e(xќm"bp14CA3>a:D ҕ N OggS@G﹦02rڏ:Ԇ[ ;V'K鸮G\;LWGn<: FRE:+K"|ˁ(;#Fb@XfE'4>h7Pd}NRpϿ/9nz@}t庁GtB$WBj)`Z7!+iﺊFO*K"tAxbsshMς* ?~Qtˉ~kTXwynWKd8@ T8Nq:ti2abaXzOXiحNr+Pw6o(Sz!W2R()]kQ>fQ9)\O5v5F5i-8];O~Ccұ׵O:Zb/-{5-H@á^ѼN!5nk~{'+ܠxj{ z+WڊFH)U2kA@vڥ1w;nu 8>shVSJK~$;h_{u~{p_>³~9ֺgk\tcV}v92!h 8$'Y܏KHS@wPtk]e`7 [MMeƚ%+|7(+.5XY5~کk#q8b tUà h΅U˧Ө_0n|?h_,+LW<8&L%@q^Os|I|˽,ۥ{b㩏]aLm5Rc d\@t5w1p2ACxSsj)gweEoԴPh<]'YA>]A+e yZict4TQ>uO\ K?Åp:$rĐihp*VRttur^rҹ(wXl 4Z]S7u&CFT" Չ$ aYH*jp%&+w85+$0=FnўL_S4Yc[9?t^y\'I'4H$jxbSnVt9-۵-ZIu.Ca|YK߽O]5RL+siP~~սJ=.S᷼G <:7h0tx0hߟ^r :l^{+:lg4n% i!$)P5V*ML{S^ɡ7 Y0׮w7S'%3 v 4w#L:L)bc2k$keJc\N ,@?ْ9ӜvF#/w)Zu}wkW?-qs2v& !Xfs67gܨsx=kXG`uj*Qw8/5Ɗ6QX1䂵JL.Vmpy7Y;e =q3, Ysͫ)M\vpieun7xAYM-zQtwuK%I D:|F/{͝}- ܀M?wyjeŦ3Jmqxa/bWeRTFJ06\;)>n} &sZzyk#חg"ȫ`^?M%Tqs vZ %8mD6^4GF'+(SFě!sɣnP 1,zq zܷ9^}͆I@y:&Jy-xx-r/>U?w]>F->gkNf5q?ͤ[gF^ $ZcZs̠cŹ^I˫lGS\|_5FEWߩ 72Ա L7h( YGOGNQEߘ_WKAocЧujޚS1rWπenCp5b3(k{k5JrnLC5(^<^<<&;hCyKE'^du/3Wˇ~JƖ&s=pxz6ݽI:/jjܴw c[# }!n3m"ة4: I \iJcEfPoz(Gꪸ2Te4o+~l\I"/-q%~v*HF!pɱsChH28ķ ١G9K{+eOҬj{fs}6()|OjMf58c?=멨wz<Ż0[j$"aXսsLy/N$v<ʹ  DŽxNܯni"r5UTOc4 78|#i'r`&@epIJC}V:\)={X %v)WJ;4Ω74uݤ+Ӂ`_OggS@KH﹦0;-;ǹ `ԗPdөȡ+])ⰼR?pm v秲)Ǫ>C#L$䦝d ҭS!A!枆!IҐtPž3m(Е8^)qJl4u}heɟ'T-$#VMA!(HC.Xһ; -8ܫ2F 8-9׋ix}۩+<&k EڱNuwrE&E!d$v ǐgh:bK2vLwrxPwA(هXI';Fx0iAZ1d^xIL46w7sz>?~ܪHJ){g8UV@3+@n HvRY%+)7:Q᱑ʨ']{z ;|X1p vt.e1d@p-FR+߈d,KqfbW^vI>z(ôeD"|"Detk##`P%`z}1Bwo錃'jlʐ&1c]!SQv+H4Ղ:A,i%WR~+vf.@05Oha|vm.jm3_\lQW%}kUsNj{:MhLw$p0j| fCu:QQU}Jb~"21vlRS4]Sj`bRH8 ^Ra2@sO O)QvCMܖڹyc\%OtH{9(5, w> Uv"6 $BkBm -H#0*Z.F\Y$ .~\n5'9[S5VJqFT;4ۮYzyLygG囷Ԭ ꪪ}ه BDn`m8 pOt' %cѰY@9DE H$OxÚӓӁ1JM-d`j]dQɰ1iU>% F Os\txUkbof6;4Ɋz4pᤜ3.\~=x,4inP̧vMjZ^:UJ`sY)U^P?E)U_zàgPc-.}ZQ4xH{cCHH ܆`Y6Gp,׹N҇rԀgѻlΊН{ZDl3C$D9 ?@Nu"WMi z˭/ehBtNH_?M9Ԉkk  :S0i?H׭U2tl.0v9' [Izq\fl,.?qc-eq3DKB D{jo%Ԏ{_&[a ^-sX [j?̍%l%bGi#%i+mq;et?=]QvZFN .~5c^N ;}1A]+>F}C3RvH@Tn>lT39%$4Lp(g/9Jq/OO~6 0;:t9hOf`X&WRϋ:4r u*ҡ]=xnfݔm7f2|\6[,$*aPYt{:(TT~F$;8 Ɲ-7\\]cTZGKIૉuf|ɉ뉫wc?nrV;NSDUӓ&G\7P,[Z ^[Iq wR^ZJUėdTJiY~}go!ߓ0>xvc]Gs/9~rGI|sDo!VtHyۧ`Eq{[ҌqBѬ/Iʇ2:bӪ+ۆ} ; k~Ž`J<>[.n/E4cu趑]XkH\]W>-Z{{՛vFo|J_|"kIط.])C㛼~˸:N')[*$>X"4}5[`uhq7`W4OR!2gT)٥${1L,!*Uw?!\)Ln'dE ِ/UPZ+Qƍ.2Ѳb:˾vqx 12~өg|xv3@t0@&9" G( e,E_;rJn'ώNjk 'ҝCB47Sۊk"8_|nm-d6J1Al9=, |LOJt4.gk?UK/wIdm~~D@ @Lt~%x0t%BjEڐli}G-A I*j)=L %/EX#\6?0|]~Knn> ]r+KJx wT+8o~:M1{7LF!cf4w[V+%lՕy' `R&/w rwgt>Y>@0Ǭ4ǮB*QiQFlX/ıl]aZqe{%T>~2k}.]yF+OCO<<mq+tuCb7N)VZ`膇s5CJ!t4$/Q{uX( C)3h(#rߥq(0hb95](+RLx%i gn!%8,*AZ">\}i& v$b9 7bWT K/r5SO'/]G.:|v5} (@φV<ha !_ |_j˘鞗cdoVosԑGeދPxQniEknuiNC0^%m(kYg 6K/c(o&bC7<޷G#1a #6К:@hA{c$u P(.3 ͪ޾6N &^G+b5]*A'kIn H">s\^<^RK %)]Ly8HC2,:3+J3J:*Z@. @]GMBjԁ :] H j}V82cIBy&|0<THӋ+-e&^<>'0(^6kR?>r˴Pο2Z3qzݘ)nQ;؁h!7ѽ8V(sǠ>b(RKx] Jش~Bczwˊ![۹D!@"!,oge>;nbO$,2|8uqlhM*xt1̚.]6O |(*z8b(tI!NLd̩ NB6T_$Ufמ=w_ t+[j2 N*XW~+q)׶4§z(\iyGθe g~ 7,uUZ dX@thO5nf$(ǀ9TK9I@&# @u: 3n@ !u4K|Mke(OPXX \^\^Xe\C'k[Am:I IпM@^%OIFc{^;|NmP1s٤69,=v/.%4uM \>,񀐌 jc\{C𳈭y,Qk^)q&h/w%}S\iy[.bw8uub;wDm|<@ ċN7mFC||wIjOQVX;(t+ceQTj9K@Q Knq \r]S]%h v1שLJ&u^ l^ݷF:1}oBH]~=GiIșt5eky.f@І$ 2rbhu8K5b[ZۂVDp 1pa kݵ2Qx/9sr ZJ=2GVITK K͞n6ߕt~<7dV qxi\Ba 7]"<ԜNKCznS:ZBSƳ=g?JboGb94{WO4֍ռVwo. .fǑngwY=OP&~lGngc-.V- v% 98^\Չ *[-Q3VW\{nta[H}q9?-@Vf!E\\1 %eus"Jv/r;ח❘$v>"B^R*lCBaݳDf.v E}~\qEk7ePt(]+zUbN,ƋǗ*6 c7Q` ճa4+ۻV0 c[cS}S!{0r#jfv%_Oz%Z}}VfXiZ7(eUB,o x2{>%d`ܧZU)^w9WgTݎ3j S>qjc՗y]7n#IM7:> T0b=cRI> !!e^Rl,x_5JJ>Zh] aL@n G\E7qrzȥ=kVbX WR2/X͔Q)YtX6NYg_`U| 4InC t7~4rZBmYppmhxē5^u`˫uZ*F$ΣS= QhMT,1 h"*+SW z">=2ͺa,4䠂n1#pV$ 촶) $uVď/@wQT)ovlaWL[.5CȾ72L^{/rԊ[;C->ͩ;L`W=z5wرI뻇?]zcϿDKC%Qհ)me X%*6. :i2ͨD֝V[ _O5i8 sY>l^$ Nܚ'y&h *{3O O._8Ņ?yCcl}Dn%K\?s+Vwڦ5N^ko}?{]%sV<&lRoEPb! % KQ*lIFkIC ]+E7M4o?~gJVR׎+jf7Z!&ψp+恃Y; ?Pxsۤ4 d.n߭m~/P'߭{mQ*rZuŲªJnR Z@).sP|v_]tFNS|uL+:3/IHnp$6im]Aj0 Fwx ˠ DNЍ':C>i}Tލxű:z]Zk5(1kqY4H;P,ޣivF+֕nZ&6\ZNB>9&0Wpێ!vdKOw6eM Qz$#{@ܟ,By0"QH^LQ&W`wG2bjL")^zoq`̢͒z6Q텽V?&HIrO & ߚ^":= |,:BmrVZ0_^Nr= 7=KZ @8W;)'LF'ϑQfh^h3Ny6'$ pM=F',MEO@'Q#!5M0ֽL5x%)>vBcBB܂NHދr{i"XĢ;=- xc]5@vy~$6'q~b X-3] ~(hB9Aޗl\r# 8#Vv"X̙;]!dZ9ם" )P@V1!!L~m\4ȑ^^m%Nc.!M u.ė~Dٝ~i'[:}߿MNO* {ЂOX^ }bj;-&/e૵یw#"WZ{ Ln+!+ ?H^;wx7at2jfN®R,/ԙ{:۟ w:ez~iGw7>>:WYZPYķcRiH̭#ϑeύ9ޱ4__~kU_ݕ-R*1$*U{/Tw9 b֞LXcROggS@I﹦0l?k6՛;ctilҔ73/ +1JO{Ok .æJŽbmjVܒEbVR? qt(ZSf%$wKuW ´sBtk=8MFnLĂC >GEp͵^χU3x%) lF}Yխ%1/XHgm3Cq@ bҧ͆V Bp'L%iVyMֲ}jnNܻD <4:y}&U' >\~W;UC5O`C|l \sŕhF1ýUJj}z+v>턝WٍR#m4tz0. Rr:DRie.ʼn* Q#0DϤ*ŭ>\>KvU֐R;,|(8J-3ltmIVZ 䅚Σ]+v!i>Jٽ!-c e{M{w )ăii }9:c%̟ў\`4kI* "+Np RM@.t ojesk4QdOO7ۻJP\+u$ۢ$1j j%/S!_'0Fp-Zs ҿc&>3vYUԌcw `B$*u_Tʨ>+d_qw$ #pa5W b?} ::90s5OԔ!Bo We,/D*tR8H*˰:{ƼWv.r03+PViBPP.+FK+ ϯ;j] C1@WjR`!PVҨU=3jOeR#?aPno5kŒqӎF c~^@ȩ S'+[]*cy*yZ6굨K*!`T!q0==FkK>lq;vJ,܆GhO-SYvqι:W0|] d./Op/^ 0P%"H߸K}<%9 YcCHG>y:nIMyesgE|^ԑȕ9\I5 \aATNǠ^2".6g ʭn[E4@vWK~KkϦ|"آ[>z?%,JR%:FoBZ0)Dm@4# dFd:ҐB;r<1[I-mXw"*@a03>\c~h4%H^Q1jy?~].b8;xt=?>~yn#νZYDx"J"iľyDDdUJ S7nZnrb?%ŀ Ԇأm j `]iW #扅jו닂T8%LL ] ZI 4t%ůSqz'쯵"1n>խWڱ'{njAӀat"Z$ /^YsR_ұ 6"ﲅdEqU PGT G0~=R~AHJq1? qYl嘉85=GSC^]!9n!c}\ytIq`u+#73{n*xEGIˌX4׳*Raڬ5 ڴ0JDjdTb HCR4u/6_cmYG}Ǣg7j)Y)܋U'!,Jꈯ\^;N5Avs?E:.atq[EjYa~&ID/NW!gE:|lR[8 (q#? K=]}N@>aEmfYc_VaRB;+CC #+8;} [5ДqsI^ 谹/D>_PzEyl=Ư/b^o{hE~vC'i-a\ok=L5,Zpg^(ҕ$(7Fw5?THK>Qn]Bky'v&ۓ>Y9}aG..?;Jd`.v Э)<McfuZY`@xP.HI—J:GKpA}/g1V?]p1EDfs'L%4~[CoZU٧ۗ3eű7yye޾"6J4DLlbfsqt!''Z!v7 IkY(ij#D p ET>mq ~jd Og⯝u?fmE0~Y|ǩ]~ q(ݵcc|+3)?t~}("+M3~)R2)yӀYW4Rok!E, q!sۍqMM>~TE 'ǂ͂5uzܿQڪP`캏ZG/I݊(/'|m7K]IVg]gFYc!gRZ|ieNGVOEsPlJUSDYFVBBrMU\c43k5u@3¡񰸇kV,n̞>v'ߏ?=& uGW̯7li5pi5CIj"_R<,y%F־ߠlCW|~")↣0H3stB@*|>ƽ#V( EW:_Wϖᄟ2).mά߸R'ok?(W.>G'xD|K4Q:n|4ʱCy ˕B42\9]l=-`حRER"(~KYb!E{c2k!( dH"mrvO_޾[n\ʌч={zM(aR+m,`\ BibE&ZS,{@k+[+b E@26 n&Gx:i>\(Ͽ/hL!{,R<~<K踩rd]-,Iٰ`X$ jZV6C$Q)ǚu @Hb8'jgFRĠ3ik.|x>uQZ1e/|3Wb6ܑ6ZOggSI﹦0, -))&qt%#"%""#&%{##%#! ($%<>z.&ygL%dT?r곧F^u/Q{׿io[ }&XL_;ىj{v2|YH1wuywi<4L?ö[(۝m-ur 㺵jR<ډ`kl &</vUҲMm][|֖VTcH NPGI"j2ZHsv Q:tFd~/\V$}r }M,Rs H5(+"pź\^ك@:vl; _Ǻp+ڮ)NhӖ-S,F'&S e.6!3@әTUj<+p?Rd'= JYl6*=s3jls=( B$мroV*UXRU9Wq +g,KLJg<-BV>z{ɓu/>~:NkHbenR[zy8M0 ad.mB0ui`t:Xh.n8 bM0)RG\Ii,)Tw%SqSDLD <i7N6H>4w~Po%Q>1r x!8ֽU/رMs}-  ź%$-&IgOY!s؀Rp2#z%X7(QqQ(7 vR>:Ns=o]\6u\"]y{;$8 n"' Ԏ;f]8eF,)q؝3KR5E>&F%24\g#˜O"_w[m$ %Ek3ہJV&acM/&pݘ؃9x`e}*LT$1rDPBB̚#$20.<5D)3$!4*?Oն!@Gվ }@?ck.JPS.4rq(ZѪ(<&$b > vrilNjRK6xMljv6@q 4 t"KC*?ш?yvGVu NQ$=d"[P'y u(DU"$P1k%B^MrQc-X46M  QŠP\-&FmO3Q}mgy'F0,|/5|@kmP 6 \˪SrSeF[q̈ĸ( ⢮ZyKzucD/bZˋm8W*$zTPеҗp찃chOj(t%zP 8).EAKp}P" "~x({NfiYLw9M,|؄+y&LZ`\ieإBlx5XHHBQ  .dO0ԉPĢYY VBd H HV{5:-EЄs]ZZ_\p*iʮ_u%'Do_%S٢S%څ5oTnva}r\H_XiYTuE"QS $}T <8p@pˋe[+|z2q.@\ݖ)yћPMnP?dә\i`ڎj;FX 򹕍"\ߠOl{_._fxaF/ 4ɫL׆U5$>~Z nMߛk;WL@ _N]X0/ƝUەQV\h"̋z#i?!QkCCj\Y69\!gt0v7~ 'vlF\^n1˛z| j6o4;ap=ڊw XuA@/)!>s#H2)EJ&\?펉ާ..~t `$  $)7HJl}&Yk&_iNKaqXYvt2!wl!tS(~ktG* 1fx.zZ'!!vк~$xXyf/&$X*{? 잟m `ߠ( h{F`; sq _Zn.5!op uv.~p^Kx2! 39@j(aZWx%"k/Kߵ17(*@zim^iZ1 h6TX;BAp (j.^ 0hX^ rJ`Y_NZpS#r)=a} h,}?Ǥ8/`m߁~ź \ "B#bȵφ{l\/nSLY΢axӸEfJP!ty+aArOݯ~+Ý^/o^4&>6 y*9M<Eeq>L.zL/ɀV,єRe.֣JB!b/B'JDqT^ v4q@ay *32``uX'+^Ysѕ0.OggSI﹦0Oڝ+!" """*'%|zyv!"!#"$('kn)Oe`,@_|JR2>.X`HA H lc#H pOEΝ Aco D"D% PFkb>;v`*V4P[*ҁ =`וs2 gn.OO/ךİޭ DHd`hѝB0vu)x#e-'^nX (:6DK)c-G(`8=oTx K)D@^o׽GO @ ?@܊(Hp!֚uEXV'WcDB< Ҏ% >#3@7b0KNt&>AU÷o@j(QF_vyq w΂v?c DMFd`=F`-P*)~MRvfn@Q ֬]"N1IRp'ozG=^~Uk2Es1 ѧUږ 4%g;Wt@p40 [;).#/ԃI * 9]EPQѿFD!`L tkM[]vT0KL\٠םi0Dۃo"1k7J1T0յ3\mx{Z=x1*aeWkL׆^eh6թN[b>=Q TפJT<}?/="CAd3IDW׵Wy|G{my܏^8r&G$ DQ5qmp>ZRx]S;9pt*&t[Ρ*;}e RXϩp2:NS>Dl],+o$̒-dw46ZesۍH봦N q@SIe{V/Ŕ{αb*bLd俑7T/|(,Qw=٢_N@5 loXZoqG@}wDM\e^x *6̊<(j Fu|6lOxNzˡ,%؝3L1,J܀#$Jih.D!@)ZB DyΫyXkbX/_$չ, n p;P$$^n }E3(؋.xRj C|Hp5b)Qk F;a3m `!L4tB }'.nϨl@ԧT0 VDV;p H{.p{J Jٰ30.Ri UH1%J)tkp۽֖pA/@πq`p4 P]4һhg\t(W)t0$kvrGg-5[ 57<qQt$#vTR (  '5g^}޻}z M4%Jw! )@&+@mAk`6jDmG}7G G:0ĊQIGʰ>\)gV n-1/Η(ҟ"Qow\10<|e,BYHZ:@V5)F颚 a!î 0%"ƅrp{iF{#5GЂ`ǻr]Y/1Wn4%G@{|s~^(@4h3i=[ @4 ܀ꁳa+hx8aX.X?zkNrRe a=ʅs a-&:%&H h W FK9hY, pc|Z~&8#+.rZ¯llZ2?/ *^q(tDDcJG`y\߻?(E ,MHn&2@6.әkf-F)-wuKf%RӀh~+.x.:S@ ;'b$EO ROD7g3̎wz `E_k%i~hH^c 4-V ±B. QjCȽLU`(h0 G?fP0, aD>|a܊=Ӫ9 \Py\D>Q"lXwġ,?>:h7WyTUk_X/PGtIJȦbQ (jN0إxX~[!CR4m)`7HN+sJDi췁cwjf[v+SNπ8m]kYⒷ&CH@Ҏ1X:Kw\a^5kwn0^;N`4LXc BN//UOD6ڂ؛:egVFqjBjM"ha 6}pig|M.Ňc((BZ٥1,w*mB[~ vCg~][#f3> *MLucz~MEaFvT;h Nxn xh=biJi4c0o{f;Xt`sVƢ[R+ jG*X :H5xCӬ܎X"&8|lIb$JA:d `Sݰ%*z~NfeBHnHn0 oc6[g0~˪a YQIԷVOWt떆!hT5*MleV0X+d$^ \_O4M5Wvzh?1y'<4!-^SpRCڹ*+ Dxdt“axgRvKƄ#Wr#B16E^Qyw=5PLa ~tZΛ[@#W%^B{Ŷi 24'؎<67L`KgJ<w/p3ZMZ62*v6%H5x&a_"⟈"ŀ倍zʼ/@?;J Nk?aўȔ^d@  эFA!pA" vxy0LH^tJYд?pXEW!7[-~n7?|+g`fa/7i͏@;"Η$Ut뮗M>R"1G(|\J,Mc#) (֓GF$LSt 6wMcZUN[$TِSaC_Ã)%KmxPxTTLdÃ/=`X mo N5efI\ּ~0 le;QQCQ\i?A7KFB}&ui<^UhSŃKq+1Br5|].(Ti҈WN>ӛ67O]dפFq FS+-޽ۓeOt(OggS@cJ﹦0W+"z$$'"%%')($##'"*(l>m[q* ̒XTKwxSφ;eZ7`44w ɬISkH~3NNmijX+͐v%2}Ѣ >_zځ~["9X7UopD$>|fV-.n ɵhG.tU>S &(1$E}B"`O*!b@,/+}{-ܺ`U5kASm@9 2zD,Je ~ę;+NPQܔ2p;`Q>%:ALJa-mɿͿT[p}!"xQe ӱj&t'Qa@Mߢ%"ń! ud ^Kpǡ$Ϛ%r%m?p+6(ǂ(ZpУXQxKqiC  {`@-'6"HSB6ˮRTg]KnKInU>~;bѣ,KRzE̛2;a"R&FVrjsuWK~A0E|t@QU J^a3"FGug Ta: ATW(5c~;t ,O Ԏ^SQ.* Q2qiy8|_jZǯ"I%!?Zke3TeXtIG/0Ya"MnMKzdzMudVyC+kƶ(HNPWi Kܩis B(({b 6JUg-n_e@YI?iE*@A q^+qɦSkك&m.)-V"ԏO0R_a<1׷Ӷ{/6zEmG)PnܻȪ4DյqpxwꪤC( ױ}14s~5/=q/;qj>ޮvg,"U6 {B ^CZaY`7!|D fY+,O F竨|j$fO ˎy+yT 8Qk H99]@] 5šBqQ~|Àb%u;(LqB,ddERj͞XʣVM~CKPFR?%аtgV~t˔iqt%v"IR&]HƼb̳86}DkS*p5tEeebU^M,)+އZrA=GY6u$>^_Ըs%J0<ؼ t/K==wJ)Ė;p mJ*0o `= ɀ*߲7%]u8 ^M7<.'W#ʥgVPYriSP%\_\ ?n%(gRD#BM#iXy؞h~d;"h)F!g4*C+wA#+xFrK$D|sRADb s9z -@Σcm _w)~hYQ+tD$" FO` |=4יK3/YM(8QZH#%JL@*A;KcͭFٟ8So_L*_xM9x]J]g{%dXLՆi6柇۽k WHutU&MLDю{O i3_"F2UXb*MɧDmH@PWOtx_{級ڏ~ {ۿT i|@IӴ<)07?,d"u:\ނ<9H%eRݮtTX,yEѥ?XoU8~mky=ӚL%Yzkb\0 'fTLr=h:g:&^?DGXU 蜐$9i.R>!q}e|qUnQn)V~P@R9 NDu# (>kER} /snpnmR/zU{bJJ?6+#/s?QJ틳K`KX+4-;im>bL@@̬':Ye ʁ:N1owRGЙ " ~v4X5`N!.9O'BP'WƤOL@ _?V.u)gu*0e`HG9ty (.qo@Qy ^jhiJLim{riA0t;>4@WD)iGvLFFޏ)0<6{K+`(>*C.HŭDyJSe9"p͈F#(XC U&`QMH7/-qpU1QLb1]{6Ο)(ׇxY+L Ffn\nYqXQ]&zXsջA2 )W$7H#^ևT1 5>\Mb8dϽ &elѵq޷0v}W[,OX]쨃GB 0rDLKM9)b&{Y݀ABQ,UʸX}S\nebklNpknpNҒb;pA}Yካ蒈dGeף&o*DvWfCI;X"8/%汃D`$uџJeHºR邛B=3RpBQ9t9U#\OggSJ﹦0gcj2%!##$"((#~#!"#$!$'(#%!%"!(%%K mrz Moʩx~Wz|hLL@.-鬮 H*\߇n^b 'P*u}PI4VT*,I 8&#($">/V n}CczvGvDᏋn^/wͷ8`^hk9^T孓_K/EK jxƣGV'_߹R""Fӷ8ЎQD|BX$SIbz~SEQXߏuDxpQ6y_zҝfױ[9cCo:JTDI5 {യ^x7|ϱ֕|N>{ Rv,%7\05?-8_az%riƙ~.y6YLQYjdM?ZsK%ݴtIf/LWY*|땵kJ[ p8O=*Ƣd o)#}ËIeiH4Uo+"x^0"QBj4tӫM'F+KΉ4jGJ^r> 7jdy:"ZA$z@OeD%@0A{rI70¢1[:oF&+X\G>%GQov< ݭ^kl-rhSK#  PL`؍8Ϗ{]ih|'rqA.[vby;8Y*{84n yqQR +IrР Gtwx߯F#D1z "MdD8؂}{Ŷv#JT+fR?IHt D1w&0;$<փXR""JD[;[.CJ}c}*'g ,á.#vF Ge)!ZUS\*5Z~ԐoZG!|^XrN,Js%H){ `[ α0/yz^O'rۀ.Dupl @a5 fop ~nF۬ 3`@I ّIQy-%̡kPƎH"!VtN 'J˶"[96>Xr٪^uVQ?;MX:@qJmpcD91*[ttKQ,!bLz+(" 6̡Y 6tirJ]G[`'?gXwLc͉CQ"FI$Rk/Rl'ЁRDL n}PHg5b$TRh%` 0!^.r,tJ `-o3DM0V!RȕJ \ CP'"Z SM<vmQjtvWk0$07,hmo{EiN}ﯤµ2(>@6tR4$ JԢ鶛JSӅ82 3Tؽ̔`:h`@; lU(UH94B#J U.L@ru8S$ 2;JnOzڣYGTՠ4ݐ}b n;u%Т$TU,z_B_@>FA7YgլYcL8W?[ev{WJy\阺L>1~ݪNm8oSc \Sm{`-y-2\#t{}JI4lhWDVtoXFۑJ"dY_mЊ6 >rΤ uɋ13 {6v졃c'ڇtgfέrLDH5cЂ9 `?D|jrťtu18m"ӑRvDzyZR5YcGk_۟"4ΰ#O:@GfTqKb&g)SD >6ed_`YQkL;!":a?Pd.f zhT6c|Nɂ1W͵ AGX W ^0]"uj@_t$ЭHuozq8b둆 ?BV,1RΝj| Dw R{b4'ZQ`>'@ \)d&1]|ហTT @T~; qh*HE/Ѡt:k=@vD+Er~xv뻭Yߖbۜp4H/`=[]G !4 !ʭ8s+2j"EC'i-G.5"~6C nosC'2Up /6*lvEۏΒbW`@/b &+5 j=c>vP/a: AZXuB)V6p v5kfEe 5/:Ԣj`NOgdZSu}"FtvÚp* jN$wcRaRRӮW)lv&,ċ>F(P7ρjG.~Kf)UBRkȌ^eR|lѠ2`ic }ųKYw -NT% oVEnU6@F+_welVpchW!M6C(A$"m/O>;6rb"i0ڲGM[ P"JPl>ϒ 5Z^a3= [`(@o{Ѡ1 H9DrMA VQ#qe !UEba-t@% d_]xq>Z8LOdg֟xirT9!|!':A籘Půs  h;(`\1ucJkUMAQ}JG*nȉD5@(P DU5T^])42n޵azHڒuT6t?`mcu@J#W,17S;m'/W~7֐OjL ulG= y͞$+FלVT (ۋh}.[lF-X7~ێ#x< 5tT~%:4Êʫ)4~H 8T@:iz ӆa^cvF$ 6E7n.",VX\YZ=d4D+Qٌ pcP61aDODDZR?GN N­!FR MQ@Q_vyDpp;GZs"<KBw\ ,'"" I?f.ɓ8=M߭v* !PA @` ЈH z@a(t܂]B܀J,ۻvJ.$Q_Xڝu$@LcnU2t9 _V\$J4!No›>lmGU">:*o($YVGkh"b "Vc?qADK7pK{ i܈J17>\d +eYs"ǜ:KtǻX(&jDD(>O (izb"F t nRHM֚UhPyДX! |75А*lt@/Aڵ֚Yĸn^ ֤ ki@k)5=.)+JW@GN'c$AJACVdY_}_C8]%/?@?dn3 H9;n ЌRy`3"'~kx̬E3J6JG\4t9+xזΩ¦& k,dPzTgUs%8@Ұ9o.`5 n՘@XX\V? (B-+)u).56:6f Ұu5{qp_/?-c_qr|D""B s!..&+G艥G>{W QAowMaAVӿzx ``#n"Y2CH^ D%!<*wJO\IO(+vKoDOZzkaS 263M]T i6/ͱ@Z_4$WCjb DS?Ѵ#lM4㉚< pJ'4Qm 1+ɘ9OZqǷF%an*oOu L>+ۼ}  e~I-zeo&dLSǭY97o'l=5:dWa*H1`%%dũxqmک4v::ȖJ ntϘiO&gȣV>|++JqQ0F۰*2z84Õjj7)Nb]7;1;\'P}Iv ^9^}:UxJ!` A ^{ְNJ&9(أ·*C$㔦4?)S =1 i@U6?,hX>ɃL]V9׀Z[0="|f,\ "Ȃ+be.FZj6Ym5*q7+ 5!4*9fon~$6JO= O'~ۯ <a}&p  ` r kW7L!Cb<j_dyYEQ]~5,ژaoWv`˥uvIn8 h˘M{=6.Gx@.@#hGpٯ;aLtwfL;B+N^6zeFL/z-˓XxƇ8C>D .6S=aU5,:uM$@c`j"2`NpN \;u5rمroBwC LźyS\!2#)jx--jc"}JǾ}HB.j߼ҿ[VT}`4po_@* A8UGa"TtJ`|ޣUkiK0:I{bdd|L]]!}( /g t pOB b%q*m*&mS`E7(R&}Xe+.[^e룽Īܖ\"THԳ"9)XCM>ZYgB` {9ґ@mp@I[P 1bzmd@2.3T>T.~;vlC4*.d x!]y?R"""\X@6`.ykl_B!߿O P WJLPdBBx `@ UGa K.zM^ĉ8=C=6|kod#Q4Wڋv~d360YJw-0 ;Dڸ p/l ԁh?5kL< 1H@vTtI"q( -i< >>dˡ 8ަIC`AEѨ4O xY9᮹?9U~'qaoo?  t3(HS& 6s=Y}%A+QծƀcdHgQYnHԲ r3r2 NKM"~h/&]nv"`?$KoЛzE<K/P `\8kG\ǀCR.7 Gڪ8[n``Yr{NL%YRl|sc?Do+RHv0Wr:)n_+x%s:P{&VB"*.Z0r[#T|Z( ۽ܾ΄ E0rY5hɤa:ܚUhXU-1J>%\Ow2wژI~s=B+{p,&@_i:= nP@ !R0ވ:-SrxiUx5+Gv`:||K ^4 z#^|ixvP!0U-?5'.! nM=T#}k⺆!i\z_#+nQ z`hX `>L4#fM9pe; $,2F?Vƀ*#?EJawd|0wՍ` ǁ ?IdԐU[X=U˩RS@5闣@D&!]D$^zv֒nB :*L{qgL$g/d!")Y m6sPz7 *2 HID_I `\#ă䨁H`M% ! H |O rSs& AmCR0z:ysMӉifȇ/Nj?"fP4G€"cGTz4"CtW{hroM{t @GDUAF "k(!VGMDkZVjxo'S \֖C2WlHYGmn'x TsiG@3=vcdr|'Z2Md2;7,F:l 7Alsa|4/#w͇/>lfT "(%P[2\}2ij?s>~IFQT10\]Fr֡znPPX|n_, "<*T`d"yecOggS@K﹦06+~xs%%"%"$)+'|!$%#'%+)~w{bN휡ǒ[K(n>&{aEYPGHDA}UabXj` Nwnv-{ p? #.c>@p#x>)˰c:n)PY'\.>k` ~fi4?FsKJ:9M `vɞX2]B@$? M-#7m+^=_ d{<| ޽ rA-^K`WDM-~ 4<*H H#ł[{۩&Pz˅CW qPV.BrD(AWR%)mZdv7j: nBh@z AԃsQE(@\Qރӏ3X9,O! }e+}B^+Ҕ+d XN5L-|!9EH'uK `0,*ZOl6m_n} HPI0]=,$7jDOd>&[Y4RDDc*%qԖ}k0j7[€0@``5 hc 7ȁJ,Zflf>RRo!Zh%6"\=D:];{_o"M1#ڂ9Yw(;(v5A8XɷS0`صA@d Af﨟 Y/m.;TۆFۇ~^.V 0|7o9d(1us:PT׆tU5+/^ xJy}cqʫSFLQj"xg˷hϰ _>N^"l;\ζNWVp0?_Mg(|9*vw5eHr”[ff:{Lv@?"L΋+k2 E $"" Wv2]m;ϘX9wHd0?b!$H'JY/}LʥXHP6DYnr"[vtL nP{`Rtj1~03 '3B2'"" 0! JS:$#NYZyX)M . , cNw1|>h&d2ceA}bZfx>ild\PFz~Hٴu Xق\HS:wi+/Dw[ #`(ȷW `A̅ӾƬL%&do3P U4p ~.|FHZ@(K^Zk.~$tb xq' $^)(fQ^uop*Mq5R 3O_AMZʧ tmTM(\eO+n*tC˶c(5Su0Li@X9bH^9ky1*5Hkut!LjgSF{!i!ׁATNw )k{ "cqLu}A߮F>m5^ vlaCs'C9/pѠ&-34Z%tkߖW)FMT;ݺDa?@  4#vM,p,X :* Q彸x-aJ`g@p*CeC|m#A$1?gfN! MK_o~lwB^O$;x]Y!'q7-XQ%\ޥ +ƈ^q;:s>f\GAA":)Ǵ=iY͵Qz/Te?`kqIh@]1x@ dhqHTJ*iٲAS p 34ۈ$}BS_Z 6~/*֜U#iIu-;NJ@>X} Jh10`ܗlvQR ?@jWwps!aEPBEZ GDSqӵ?\zzmKI|WLLp69r6덉@ x޺{gLՠgWnMM{"&m8LLu\=i)ͿF"Nb Lن}m;\sU ^A蟰 BO 8?j}xtwAڽ[*Cu1:%曪iIAroA 5؍ )IfpM%f(6,i7>@“E?aM+n8: WHŀh3:&&]+kД0ά/DlwE<fBEƂ%)>MV#2䤽*x/JBO`G QJ)!ަ~a~z[NC20ZE/T+ *Nq`y :-'MjE~ DYYn^i2 V.c'C2y;*%锈1YGU'?XOzcusE 4br^h8u* ӑTHhSJQL;z =GL [}bHNj|~=5wZwy[.*M\ePѠ ȉxpPV)]m 7г*ӈZm10Wߐ)1S"^+ed?[}1zZ\ $lt*9!BD%z,_P-;jb]?!NW 7P <?X(vӜ",sc$ꄉ∀E!nbpoV^[N&rU8ž``տiPA"""AAIDD,cʄޭ~ŋ*@T(`RU^*ȅo7:s3($( Ǡ0 \)М_o) TD3UBO+2 IA) J":doL!'U@}gGqMw P> %6h ,RP YD@F#`@^OggSL﹦0|uP2#%$$!")*#""#$"$%*(# %"&*$%}jȶNY*rN8j4QġMCm"|jARDW'o=/\W⫫ Cσ78v!svHo:&XG!ó ssNZ c"T7fdVQbOa~O޻߇J|qtk7; KZH 7A>T,Hw kQ/b'!ܜ׃̀_@͜aL \~Kb̨Fpzgql16\&ʋ"VD#%J!VCoebԘ'.3ePW4탷O8[nK_<X{[H,VqB;B{>(^r.3y'I򃩉,}y6ZDsRpdRkwۻ1wr5iZNXVJDK2<Xjf%AA@E"Q T}",ޛ#9^:r0Lײ@kEɅhpj"(B?jvT`7V"ܟ@) 1xavp̶ſ5ps&R"aHh/#, n_4@(^EYܰ~o4.ayJ΢}v7REU ZԈ\ ]8"(hN/ tꮳ2yT[AQDYEcx%$U[.rMj |"A E<}z^kEO v4`~֢y6aZ w$J\8 vUn TOvE!F?AuwAVX_GO|@7ދr͠"IiM)4 .( F*KLbq;~  0H3pYlhL4 'qL9g.`p%AjDQ[le#)!`i4 F(ECpAv5U\7v6%vVk_Yǿ];qƾ m ] K\36G+)F;R+:$!PVXDr#"~9 JxZQ@b\"!-=4kd+ E߿z_k\N%N) &?՟~OaGcbMpDuD;HKD%=7 "ʲH!A T*8 + Dx૚<υH;([!uoD))lv6~/|]LDD*Z-$ ڋ~O:t_z$єkZS?b:&=$-gKL>63u OUѧvJ <Su5?\K=/=фw2e$vG,*Gx׵>#&bom<Cjѣ`=[ʾՒ_{DQ _Δ^u y|׫7ZFrЃ*$ZLRfڵaxtv?2ש/=9ۓъX\>^TJHH;,'\,_fBm lnOQJN-@9ZL@2\Fp:D>ᾩ^$TX˸4 H)+ra/r$Z8!vLIB`W"qJ Go˞SS)F[*B4MA0QtO =@*t,k#Vx=S#H_I]0:K6z@BX!HJx=)¡DD)ߵ+}ˋFk $Q" vPp %X B\oQK[QV7pJ eHY_)( A\ `TM&kI %, _ nvܿq~`=4NM|u@w1㒙XSXQ WLtq"^z?,=V Ua ޢoaEa̅Ylfj2lՠ]A~:mMJڕ[ckOJ'hV ; JsO]{9ƇYL8qE}9vG\iAzh\zF dj$2ZZ@ uFc2(<)31V~ UנSB*f`17`ؚ,.g-w4x~:QJ$^x9}>X҅i)yO(d}.@Z+F%xDl(^}/jt(U@ū6 l, pEt٨NȟW/< l9x}9S  KcKՏf-a(_$#,27 BV 9Ś$[=DH1R-E%*DIMtwFdvi0!}LD|S5F?0󻅆$Eq&HԺjr ~O.NB7߭\tA?%4|xAک4kbh ZO`R5r`@Q`m)ׄM keP]m4X [4nA3 &9Q9EŜZb!>!;ФnA8$ Q L>[)(?6p\-F_D ) %3a(xECE*ymc맮d_JAA_A)OggSL﹦0y,"!$" "(+%y"####$'(*NzGTt78/㲢9L"'"xq}Tn$<ϗ=z&__Gg z`DV> @!F9ʈX Ibj6 g11]f6d22AYc,D"Gm1œ A <̇#@9x?#_z:B@|De% ][%XC05rK\"1 &*W.~JJ#x5 !,R~!U*·,Uo?eGesJ'8KӴHݧmd(ǑkCcDUU5Pzg''Fq:ԔL ic-_90>]PtFʽxvl[LM3fRjzQTb>^~~̗w-NIHV$YL Iumn'FkpK[Y [B,ϱS5_|teDO6\-{+ Q9JlNwq>x%Vi}Qy{@ʕ7TU쪟^p>^}{sx63%FA!8]CV 3qX~9j:k\'s^`"eD`+ h7=Ћ;M?,3?vײ0$kmCxR/%@{QGB"yj5 |WPp[lJ'y2#;ѣ|0қEр E,W눶3{GϕV /iݞhf='MsG6usN3Oe~1 OpSKrϰU%'1E)p}eE?nJ9?住"zc3@T)ɫ/2yR,eX_D[SHH Jj!zX\1*;lʠ~gZǚӃ8^YQbQzPX$͑J0IS\9 -gn8X nd 4n#T7€'v(E$ lŤ. vಹ|f68p\߲+\ǒZpIBC'/ "0U>p;ph 8PD\G5H((P U5]!$5,Z]F+be2Y~ttb%cϺ͍;!)VOoӗC K `y ʾcw 5Mww?WD3 %2!BM|XL5$d hkУmd4W+Ņ7~%=M)dF}`@5;}r{G@bD^" !=j/(0̓ <Hb`HJ mcg Zg)Z"WqPSH4EDiy]8 33'1 uo;-`ʮBb@AECB e@./Ra= `ljR~ RBGP/,JCyDD=]Mz11EoV,Z% ΐ?H0]A6Ӵ`bP׈ HԂE(J#iU#V #H.AuD^;r u*;.zuf5'|cQO(xGѮ (z¼.߮BTW  {$7 7D.lJ(^"HKD5]+Fl艭0~04m;٘AS#î%&wg¸_q%礪N $8*z!6~I^J7rJ!$g$(:f|v?m$DnC(jmѢZJ>@+ɸPk/EJ:0%H~kae϶&8.b> ?!?5`=}6zy4w"}j"(Zt s츆9VC\ap2J8\[FJ1NLWc U9X  ^[.lOHD\M14]QR‚~ag?뙗w|TM i:H `0X >PxC.elɘD<ꠠeP xD TZaP> ^ld b`Z :4O) wC_E}R( BT}Kg/oAHK{rE֏.LIĚ^v 1(2Da-Tʍlp?e˸t'-K5$ on͜B5򮉲s"^ހmN hm5Dti(< Y JшຽW;PQsBG ˭ruct `{͜MɆTC!ή鰞8}Z~ۯk3}a`D];``@rBɂ рGZ?hyx0](`<EߊیF7  .x)aPLr{Z+Nޗ(d* RxϖtCT|V5' *qcDž~.?|u=j1nc\O4Czdyˆہ~㟵맿?|W}uXGBWH %Z| %-\"C 4[kVR2[j@}[4MiwsoVc*wz <@aav)FWs<̕ms]yYZ֥ӦdêߕYDЙ$5~3l|ܝqLאڋZq ljy7W0j~j*AD٭E\ɷ?{u܋b{sku(N?)U?_(aԬ`ʾT>'+v/3v rN6~VXoOpƃDwr`~+bMƛVόe/{-E"D;Awuu\K=hDE཈$UX W?.( *x0 䱝LC=un#H`TP#)@ &D*pOP6\>0?G+"DB"j)$ykt-ϥu87~znNS_! %@)@E`gTDCnY.}q".OggSL﹦0^F_,%"""#&*''!!#"!#,(~ "";TE 1 )WH4D :~;'_4ͱ_g;Qoo>HAXFsj;5 $ xOaj uI>6Iz<ܚWc,"+̣aQ"'JDDxÉFf<<2{ԟ@ҏN-|{ $VUj@P`DXSB=^_Cet b1O%YD3T6nrMԚ{V.zS $Z4Xն8_wpMJi6V6 L *g^~sMt}>-s-A9:[2qD,0ׅ\n-=HL%o$4XLd<C|8J$=[e{=5!a\#mDӆu5`u/U)B6>D+eKF '!gnŒQɽLG bPT*?M x_8/NNBvNM<Չ_?:-ul &%q?8-:ToFmJ *ڨ; /LaH,@wP`/>Dancm.30 at ]Nw>UWϻ "ڈ} _|@ c󓠿6UhGWUVJ{h2ݲKH3̤[UN;84E|""" ?9߉mW͍+;--At V(|~(Ec7etkN Tv{NvJioPpYTbF8U[k15.(]E E(<7b|H{KO]rț,tL-Xxhb o.@1s\{@C "}["Ԁ" gz˗gJ@@"@>K1,>5r>5RZɚzI4u mE? Đ t3=&*T4?`vxIN&7@.ڝfDt tta_±#GDtݑ3*LAHj,>\~NJsJfK;A{^b2¹0'"":tt現y=Q6," ܊ǀ1[):$F \jnƧ XF9a)G;vђYx~ڥtܦױF{N]\#Bɇ* (z6VD|LDDlPI ߐ~xwP?.#n3P IDu\ E#Ҥ1h+pC?e>;⡷ Χc[ػMǝ.8 \$HDX:gopXE2-ľg06 kA )vT7p vW*7CRR`%(" a;=VAxWǚ(MsV"CPAA H| d(㯾}H;t PI W enj 7 X8!SX]$\v ueԺNgӀg>>-ZzJn|}7t{o+ɹ!B =]T]F=g޶{vIUMڽĿ> U܂}$TuWpPn BeJDJEc`:Ӂh,Q1յ7.^9H`$ηL84674Oz#퍒~ITז5xe?rk,X_|[﷛jL@j{]7m<- >-_D7?O%4ĝ:A$8ؚ33_J.ZRL )<$%ILu͈;)[Dxfvg{l$Ilبؿ߿TX&Z6NI OTZ׎2ӭTSz*-!*l^۲CAOye[h(aSiGko6*azA!,Ǻua_$@!DA w<p tpOB6eYs< %ӗY {nx , h¡єeDħp ^q Ӓpto9+)lzhԔi]ә}+z"u!bnD }zkw0)lx$"^ɊD*?kP$n/`PkNbfl `ZpcLf i6R)=M#q\}Tg*5q[='pgQsBoS"ꯐZ U9\"Hj& qy+MHr kQ 6Dp*^+tN$e)v܈M-7b|L]h9Sc4g[1w /()Sֺ.JbMg89;J$5<  f,w>S6"_D+~b.iS\9CId`Vr,O%8giW翾μgz=Z=R @!4qI8@Ç]gD֊' Z)7$F_^GֈK x~kM{ ܚ;,b+-{Ҥf^f޽ k=e?>}&.T˒k*w .I q)뗑ÈRI`45R7QPԔF)iI/(7^̘,&`5ϢLA<gRqS >¹f$1 4B&h= I6/hI N@L '<hzeG?+ O7*kH2n0/е8nOq >_Ɖ@Nw}QSڶ@O__1uuCѦhL*jT"N1 F(y7lP J.VܡL*e" a:/|7| ++F6Mۃdy}Q8Q-w'3;wfXUonTW"zCgEI-y8UtdjdMX0$6XE>$Z(܄lR\T ڐVۿ>f~S$ L@4|x{,Uf}[%[Lՠj{Zg=01ITg]!>VZ<יUNxq B'DiȜE֯çZ[ ,Q{v@aWT}q7K{ؼ6d[,]k>*0+(Io;S7iZ;fm]$V{ְffk%I;$\PmEVrIGøܹH *a$#& ^C\$g8%$kz͝S+|cD-' )(-NS[%ݔ.D5ZӚD 7gAԠ& Xt^Kt˻ i95k:AĊ51$&XWr-@sWϾ5Ҏ^W=;@70(֟ RրLe$RÔ mc[KR!+H3mnZܜ%$w#.<79LEƠg\F~T_͎#vәB`@_ @@%hºc_͢ +#i1( 4 HebMFOp 밥1$ ジ,R7DD0QRғU WF]DY,+2}E"#"My`!vDUT kRyw~1$~prwq?G7{hfT տyyk2w4=d}g LF35N{t{My\o9Օs<-5X_yY<{)wKJDцӴ!o3}]=y-%eNqX]yL \חlzMc%b5_eԲc3,:1A?_'`ZGҠ~-zG_7C\@JF+uW:$mȤoTdڑ\T/k^0 2{{-ӻ ֬ET2;B2$rzB9n 5 ԍ ` W;łY:D >֛z`1Z-.~kl @/d hQ#1>n:^ 88I!>>݇mxe?Gؿ&kCaR0 P {@Gh cReT*hCp [Nf K1(FKTp OpבAG=^ ߢ.:Tc),x з]@ XqHGtFʊw5`2iwmաJP F]~[6H.&BK}FĈ"`Rz;`ydDD'(\r9ajW8UbRG0@7=r@F"#n.:Kux!.]IKCbW[L*E06V1pī?%dN@ kzs|4E fI s Q @?C3$BL`Pހdʆ\3~u nnOVGb lGv)2#DCe"Et{C:X=A1UWɑyMc{ʴ DDI40^ZTվ>]eðǔJD׾yS59?dxt6:*)RH4ͨ: W{7w`펃NTov7{+(TU UvB݊mRsLɹXAoV7}\YrY :.k..N;7"#[*:0nnp; P ڳ?_|>*m-0 꼙uIi2?i1U;jgJ@()' cM;A+Ա> K0Q #@ ܘ.@ֆ q\]uS? E[Rboo,,J/"@GӀsT[%`}1`yPXd Q7-.1 OnEd\e%hڇ9i ,<i arXJ1ϼA{}ظ'>/Yy;7C/(@`9t, V1 hH;$/ RAY|ܾVBƍ(~D")8MD)YcXMdv ʀ'J495b>4~|6傕;Q +\AE %`VzS,h ߃[1"T*)[]%@[DHA@`di,pIIY\" shm+~ )~ /I\ݾμTy_0 -`#r<"S:xhB."F=]Uz4J`æ!HL,-‡ҚܰsE~]WŲqDDȱSv8ڿ?3d-uN9>(*pV@—QLJFľ VPYn pAr. HF=OggSM﹦0,}!##"!$&))} !"#&#&''>;Gr(IPJ%{f!sA90jrTj:Bz^0k/qj%JWqW\W jF[%2!X)p%-4PvAD*v\lV.PdSqpDUEHDt`}NWz*K[$iT"a`l0 `bA%|AE)(  )\ݴ=bEK*F`IIuUA?'ݯrZd5?m\8P*bDD-5´f,3~ 'PG?܇6n? >hB@_q_p;X 4@TuXJOFpLBeA4؝h@6j{22mk TFib?^h=z@ݲl3T 皈\yWٲxdL6-)+e1Dq3E%(bȦވu*5.4OST< Lӫu<ާÍΥB,DӺ=Q5i> \}}KlCR )FdnCw …RbM$>B<,|:qJc` P~fLf'Xļ%1GLf#\p\](MQ:9X^MOz1iz~TzTZRQO^z_`M#nڧzKD qL./j%+%^$[tMAHn09n KX^HDD4p~+zDz/4LZ=jI}wӼWj D <^H 8`~"ގJ9I27o7dH-n0Iu\jNbLD#ZrdN)%G@/HLpFo(^-ԝ7eAoFW+7JkI I7_K|.nHdBMTa[BT@@bDl>K^ 0&ψx-p?%D?g-]'_>7 1'pHH/, 1 ()[A G4sgڄ|%JE>l>˒Ɇ;ӵ6 "|UD`ՓQlů.g V@e g12ъʚ60pg^aD4/k;g7++RTdCDlrL k8{ݑTiRF^ c/zKzkҊ-2V#_}"#@y1404Azy*R!(p 0X# ̚F5ROJsoB$[pYЂD b2`"jUl^9 p{nb VZS:\ ODD# oT| 6[7ǀ s`mPM&JkHK'p~6bXT@[d\"Ji $S0jl3A]>}eE2DDtNi4ڨ8#zT_Nk= 4@RaD07pXŊ$J>tQU #ALx*t~kֶFMZS^7JD Z1wpN /)-K֧,XO?S\ֺ']M}܏"D$ϳhvK u+{@2Ѿ(mDp50׆=a姈Nqa4=$NO̲yH5]3It\4I㙊״GSk`_Q e?*^TTQ4Mmm?f^[_Ӎ8n0yݖ\q<ѴXc'&,Xۙ 7mVRzfffZ .AZɚiE`4}C/ `1u(Yz ̎ddF n&KrHc۶9H@$-DT^N$!@]> /@r.d3-kn).JM`D [ 7Oش/SOŠM I{DDH ^U.~2p_ `} ({nG ֏? z VX<68Yd!f:R*vE-EԒ Qo"YQpڬ@\)Q8(m\cLI< 3XvSpC@AOggS:N﹦01&$!#"$+)'#$&"##.'}$#%!"$)'%^;n;ؒ#jM"vvaoYHL GZk&}B&KIc OO^OPTtf:)`![UtLRRfY|q)8TTɪ~|{@r5vk*,}'{<9a3"5UnNi4+e> 5 J݉5+D/HDi)3㡽op꿀ܳ*@ݿ!p@@*|+yEbHczPQcXIGLA %R {eixv0[Ę%|8zL"4,A?M4:_^i;dkpv9{q'OTG PX 6o~h8g ( ]mXbS>xTk È|![}ʐ{1ǖBl=\enb@Adz$J;MfĩS1hտ%`=+o-Х׾6,1AG01A銂eF+ 5xǬUV˂qćؿ ~+ js&{?x{փ%2VzV&@Akr HC| pBcXpx6 sa$B1ƌaHpq^Mr,_v2p12#s Xnɾ$Z.V8s28&LD/!Δwo+ 0?@(Lpj'聐@@FiXdxD{ϐ0!^ʕ$ӑMEՌlYxbKdNcE"葈h`Vx:?*GM'Mw2oф,@1A-U2uU.^VV`EڑE"MfG ~GQ9PViQ BXمSI$\PD Gt$a_~ޗqTtt>o?H]D.`ݩ @hr",@$F, P$b%[gix{ZK?9"uR Gĝ|^}=}|WH*k\LN"M>@U `0 xx!0QY=T#Ia1<ӎhk`qvJ_$<UVڻG6(uiW)X~yYBL ){O[ֶ,B&^9yϽ7<֏O>鹡hvq~FNK$et-1o|@Hnl3ӍY$\0.l~z&`㻞x;Q"=8*> "ODXܡ0 >Lcz~wMr]LJ^ u My\@kc΁  -HآяE40"Dqk6rK]1_!לؘea| o_fED(C/kH@[F\Z(;Z Q-~)[f! 8M}5'as/^A*T`:6cHh(0 ^k6b }2W {_/ })> NБ"Dt":ְN@R7ޓsSNy¼t>5-3_h9ԛQ4g^܃Hd)%-Hb9Ġz(5R|৐;l-z%C"Eez[R$w]x#T\v=ݼ\?q%xMy:,E&Y dTCO=vY9e8U%wJeZ[.nM_K%өr{{j^w7v&vDJJD`+?]d<C" {G@H=U@+5\1nNt@'RtaQҠMqh 0+%1V2t YG]"")(Yϊa _r^ǂDoغ>@Zy6, )h"F\Sb~ŠV;mgJlXP%W|lA`mA" QJ˳Mk෨ /yvzowYP(G҅t_RO-G# (Yxą8C鋟0)my<fY~X} -G[lـ$I""alFwcrsu>t˝ΌCeg?%ZE 6>z(?mT(+b G͉#=z(.&j|LՆӵQo }|-4G45h3cX{YKm1:L>d^FFL>i'wˋXKr21J7"4gq^9WыMs̥`DLנܨ[3;tuB2<pk],{.jɝކ %L^jN8p[g+8qshXT՘f:qh8yCf8xyWh?l TWS66S>X^m5%_wc{fE&OggSN﹦0+,z!%$&$"&'&}!!$$""(&({~Z+a4gG.2 ";FH"7|fY`45.1%Sj{̧/GEwvNw|ZٷUz{ hT4`Ν!4ېkG\%0qC!6r>EKHnl#ꅴ'侵k.0"8aN:@-X]+iM$?Q Χ}ON沍n$mwA@ @r` tPۂ/@qh%D !XoT:B K6nIF- Z\$] \ NS$DD>L;wԐ ^{(u@ Tۃ`t3>xQ>`E58E]$Jp #!:c"搆^KNrN$z-j{Ϭ$~6C.<7x8Edҟ&"zT_T]٥]_ܾY{|4@@w  \QPJq7 =\=L@6`%5"e *f5Pz¼ т|/Is`{.8 ELi" ̎fT{0B}n8Rp58?  *+ OV3k{H0ӛNR$P YŅX_r wƈ^|^@WvǑZ6 DEr@"ItJ4`{Spë8yT'.Տ(B%UZ=z@&W\~]E1b"׼^K.'qK7EC5 "50oӧ{ޭ\zp! U/Hǔ&7m jE$CPbVvZ _ _^ÿ%j;*dD _ ->SڃV.x7 T ya|e =%^g | XI/(P/F3p3|;tޔn'𞾦 @ z3Y 0psH "*B @V!5A*!jVZbF1-Z쌭% QO8LE!"-=:mČarVֵXpVUwf_m4TCSRt x+n`n;%$@ pX`U7Oi0tWmxM  TlΟ)W`V{T3[a5 LON:.?X=~rп44dTWFcGG;!4H62LنֽٞF6Ӿu!8ZI;D@MV 1_`]%~^ԎoLה?~H:N;I#M$tS5s_VBtpӆ!q\iD׵Fدу;|͙S{rS{hTLSZi*p>dY$j6q+1Ҧ\JFpӪS &Țd A}.+ŠHpe:%Z \gQOODt2nx4ThW~[|aw2xiR00H <ZA@N0fV! .ŊaZat[vp&Vaq h4nZ'{@P Hp`ܮu(x`eQ\@fA%,ڵ 2ǀdqDt]Y~ebynyrI1>9U0S_!c`"4NH-et}B;',ByHWnC"`=;nI+;ӈpaQDV*vt9P9`E6/R?3g.ٷe;?EwػaI'D*_\AvHps^h:<DD h;SV[ʓH Sk1 >}ApׄX-;n0Zj@baĈDcL@L󌛫<,-~/wrՐm՗4xO5q_Y[`U{3=_cFL ٧<`_Ϧ1Sc7+D|73?:_zKtlum&_XQmv*^M8EXa*=DIx(Xl\?@p%BMFӍ?iå\GAc63H.ў' $_dH˺}(@ M@lF Xn̲Eɖč웓z"2D-~+i4|d)M*msAQ~.l*O5V&睔lzd r hDk";"3GTD Thy^@Ȋ#dnӕSY1:|`s"L!aZ0pߖ<0JIe|w_kI(- =Ƿ"P@%w";{[Jj{~ʍ$xD}KŐly"k-Rl@)Y(S$A{ZA?++S"J@~:l=IK$+ր_K${ܗhW(ZSW@HP`"nԭmY Ɠ0܃)<X1ʀ_u ].j ~Kb)Qosĭ'S0Cͽcqbt|*eߜ\;^AoP:VTpHh`uN.^ T`o̔ulPay'foo>cI&% `-7 كɱtXᤸHYJ)hn ; zΣ`ƫVhon#]ɘfh@uWrʫQ& %n3=`+Bck^B/dϥx ;W&SQ #/jO}O_AXMG #9cXLŝS ,>9 %X,υ+G3㚶T2܄[^Di,0XHX{Qg1q e#ى0́:C] %W/w@p`&>CQP"F'ЦOQh U~1?cƁ}U*&6[).^;Ul@*95&.7ib|+F^) M pq_rޗ65бFjz@qAWdBƋ\( T\Jb?<в*1;*R׊DAprjfgܫ`z 2Ncp}a*ODDpL:_wbv%XO#h MPw) FlC %Ep7ݦ`!JM ]+7"UIuҽ1kud8ܚGWg-f9þYJ?Mz##b;Mg&8wvҮ p( @t8Y g%\_qrU(\C/6OugqG<5b] \H`*mH 趁@QBX=npIE1W a9hK8 䒛S^b+{6!`iaRlJK>I;$;F=z:ҳāhFhuth3-Hk ˺Lŷ PUfR^1]2;EC=:ţ =#r^T'oL?;[,:P]}='3[gL8*`|9xSʇP[֦ Ʋ&GidR0"jB1(X"*W1̼9EpSBJicYI'3TI;=o9tRFx> E"VnARx8`Qn1vs7z)#Etӑ'|Bap^[d`nV,:6\LfwPL/IW"%$ (ALe5bю&č🟎R*n/@,%]1 EpXT1$b,*A":q`Ś[l >9M8#cüFgq(c]ؠd 6Am"_o/AzϹ'p/p+\ii!¯Va0ox2 V L? XMhWTJ*pRu8bZvO骶[D(u㻑6D$[bW оn{KЏJ9r<"m ԀUyMS j5# w@@r/c)+n$m'dON1\f$G\H]ZҧDܰW_=Rp? =#0Ҧ3\Bl`uR"DT>]ZR#Uc ^DV6Nj~bkEitax%WĦYdZΕр7B.5鰑<)gm `MQI:`nD "T5Tj 7eCAn)Ee䑹CdH\\9E'#OggSO﹦01"#$%"#)&(}%"!$#&,'~#"#"#"('#kqHfbAzTdZL*Dc>l{ͺG?Ʊ]Fuv*3HTLkrMGp۱30<__\4Mt42ootUa}:g/q6y!I\λl`R;y_$)x'wQ^wOvFfB>OzNЌRb&#u ARKS N O>_/D;'XجOEʄDDD_ş9̾i_F8ekIV! ʶm! <Nn }[#U8Ћ$>!"rdR#]rc=C*ŏFJODhhldLO,G:Ő(@"W"!dJt/}$u}a8n (#_{ke@̌& } UF-Ị)`| ܔ dXx=`VUDq!|HFknbˠ؆ai/"v:Xptwae氪'"|ҟcҌid)t@ǦQAVa?4 {= X%KPxkjk<M37!KK~{`OEHV-{0͋Žb%?α /B1 7TPK!b€~@"~v  %0ݭ QFLVcDKYqh&`<d[X+ܟ`^Ðuf"XK ̹RƸ Q XUhdl] "l[Wwx[?݄x H\Z* Dj[AJhE0Ւ%J'(Wp{.z8dرok㶌l "htT8k6 [g˿k6xN3.UdEa.n5w16bK[V!.@@P"WeT@]ԝnC0Htru0B>cN>[9OggSO﹦0홷.|u!!$$!&$'|$###""(%'}#"#lvfY ^J_ {\,0WqA`1p?ƞ~v$tjczlu%b7$}Kb a K(ԴWFw|Rtz"":]Ό˺=82yeVN߷?QZUB*/~ 6Z}+_6)[1$p+ꄇ@t{K[7<,~nPy(.gnv@,D0P WJ$ WIswyPt4IO{rPkw61vil tMU]NGǃ*͙u{uufjd>i~|O[a4ӛ^1JfeL*!=~I& 󇾗gƋuvEo]O_{ww`1*’)!͖9)Mk \?+P09ghn;w~+ʳGpub0X#z_Z6 R'Q4ҬdG f]񁄌SظOr )=nO+06_>LWk8Ș4"rGrW<Ǯ[Xu z[ *J yae!퍰 h$g57WêGhD].n)N37]_fS ׉~Ş`R@.O{V5=4€5lBY-oa`G =Z$ "$dT.p2{D 1RqDhϵڟGMV$zķWsТqlH 7@O0A`@Ҕ@<B  =TcW.n= &'H`[` ~[.be4X#B=[]+OD!1ri}Ȼm(zkw p#*@߸v sIP9th<} 5{Ό2NwBP p{Jd`ayJΥ>;x LNǒce ˂AI+Ut@'p[g{ns} P/\!*e X9 L9ZÁXsvOT[cU!#$2npD0 p ,OơLsd;t˩tP`׊-vI~ 8n[![@롵bC)) P>;6ƑqVQXHʰ"(]#{J%Qͻ  4> 0mDrIn\"~ K߯/lN)%BM"Jm14c>^+DGGMK݅WQ/o@T_7` XQSBaYưHWˍ: QjeDFCA,3S5 EV_71QB>i:8$ICU ,p6?pt4}yܭ=5u.aDG"""B0keCIz,hKPV%#ȪA؟54<;p,u#"B;eH']wɎNjze%BzDD23K^bxH|@8Cu M| FT KMra+ ^kii`|Ņ鈚kn92ð[vtmF9(SFͯYB|_@U)D #,U9r?^ # ZАrwngwҰx"܀FkrY%+\MI?,:sED#0܇}Aٿ1nQ@cFOMA"B@I D@0[Դ(uňSˀ.{P݃TP^KpƲ;y;r,c*c9/%h nzۥMa@-c]a jAyЍ~ 9Ƃ_cQVv0`' .Q+b`ҚN~ nY0H% ~L5ӭ-=dC`~&'bD\g:.ͬ|: Y]oCzMBQY _QHѝ 6U;uĀ滑mcVeBXo+޺YhSJ0[E/B%taF"JFe/~U>:7KCtVhA$u#:+aPP %q#Erh;n X\\pWT  .hVVK-s{{&4!cXx1Y>%D@cF[lmI0]RJǎ5p$Qu )1. {t8"@ g@6H} \;3(V8tYK)8s u|sřsJ呈fac:hZꭵ\_]ݷdxujG@I`Ur@ZXBv\U @'ӗ{8 톅1X'G/mDh#pTՍg̗'oߵVZM(#jh#,M իkEOݭ?͹YQR ;ٔT _~s}}l&”ⷝ| OggSaP﹦0x@)""!'*(~~!#!%#$('&~<8U.~3⍜<[FO-4Mj,h߾8cn v7%D΀m[[m3 5>o*{YeWǔDQ[;<}3`iE+I?ǵW]LUYzOv<i> 4D{I/.#k|c2] DYKeYW HfrimF6q#qS\j\ :; D@ӘKlb &s+Z+speN?:.{|WA} <_5%JZ"Hm`T@:5S.mUN"B\H gƅŁyvxɔ͌ C 2 S0ȕ? Rr20L8sgoT~'tjrA1B@ )F  *`uѭIѧ0nsQV]  v% v+8wkfD47NH&s ^6HODH7hR)~??v a_;G X>5HZYO eθI۝,?ѱM$Hh,7 ]{%Y] [^b˘/3J=𲄴Tq.hv);n.wU(d n 7 Po;چu`lR)q|eDAm'A`kj)9& H$³>/;| LFkyS{ 'w.Xt< gί5} -xyK7ݸuq ,H10Z@dPr0e/atW}j3|D5`zFRe^n>,nq0dV:t(ł.pv +TӨz|O5wN5.x áz0Izn Rh"b:Tn֋3YΝ@J 0t@a,a>;f1jfhJši1Z>yuq 7dJ4槂̓rv$'轜OZ(+((ɰ"@K{Ս-#OG ~YX@%QTn"V2aJEL) 8|ha .p tR?$ V_[9O"::`cxfBFTr.n~"IFD\ pR21Tmh=!G*& qJ:k.774,hWJϝC8@w%Xp_0`X`-ǰE«2kK?:9Hʳ W >5dᑀX{i pˢ+qDDh_Zo[{+ˏk$ J`փVx98J*@` nqaBF@R $:Nx Z_ŞP: wFF cI'""J]I/ y3rj;O珯l=A"$`Y&7jnP.rhp{du*ÚB3FeR(ITɴ^`*6hMd&:}\7;>ҴAS[]I->?-[|ؔߋ[O;*t0gAAς = `ĺ~^nW]L~.'JX `.V4HG>hq]kG9-|,ߑ^jLgWϼvhO͌ '՞7.T) "SԻ+X0aCBƒFq-j9ު!gmqo1Hn ]cS˥+g bQ5`) +8~P񤌋 \O)хuuj =tn^&g*X_|VisNb2|`I@ S,$%Gj<0j:V"Ad\7wڸ %v*+^nfJÉhzڱb1Xn9rD".[ wa5:\HA?{b(=Ng|HcUF'bEe>5-[(AL,״)t|% MeIhF>\^YŤM 6G\,WyHqէ}[|RߝPUR2aFxa?RޑhˢFX ppIwѲ0nh *) JMG}~^6^ WMX8Dx >(V8x-z$ԱJ>:!T\(MF0#c> A@۠uZ$P? 1nD+ł*V:ܝ!"@+B^|ZQ&λIOXZ5GI*:| kɍsbHwJΝ1B^SMӹU$+hQQѲ` -(@%¨ p,]ZNnhTR(cpj6z `!`Mc</Bc"8:6{w;"R݉|+ cXL Q+In{,1&*@V(4ݏpW R=WDD"aELFh/qͤ3Y.n)>VRR\ِt%, D?(/=] !W/IuV)|yb-lFj<`iwMk3JjE$h!%'"^H C]́  ދvnJ.>G,A꘢) `$hD Z^/?4ڃ~|:o^Ŗݺ]vBs|y*5!z8\Vn!fu*D .pB pˀѩq@qҖ(~ (Kđ+F+XąEqNv2|( j-b1ɸ>~@ =Kc^ %TnPj)q 7!ɑjdY$$"[NnM{ah œ$t\G,J$SJ ~XGfĔW} p V@ 7|wUp\eid e]DVvC;H1RO!T;rO&.?M4ibdbvŅή9NO..SE&/F K B@@: HodNR7P2طC%) D2XP- [le9WKDMv04|, NdQS1>,+vRZtd)؇]rHB `V@!*t4\ut#Ap #n ' Jy!e %gyf4:nh4C5X¡9'#iI]3rxp% a: ^ 0IVz^*\uU;(%p2""8 *ŖOggSP﹦0Ĵ1"%"$&"*'&"""%",'}%####$%(% DKAx;bT`k8GJDK6,u)Iw'oI 1?B U#m_ם j'cF-n\EJ@$_@DDgB!h Tp TlI..lIa?k{ m/_5Bi+%JJb~~wY,""~yf@[)VPy! 2ʁ(<UN)e\_ /V%VRSHD$zU5׼yUh=֜~YTZW +z 44|oϾs>r_!^%,Lgyy]@LO{G=a L٠ޫښd򜟯Le$5+r$GKG˳3 'eu)G[w5ӌ~7r]_W*% (p>Vħcqt} [@V(hh*HQ(~ B+hۀLE.ca[NfMC#Yr!{zTEQ Y'll|%tt&& w`# 0 )V].rd?)8E~'g -Rh %`Z1]!Q-Z"(մhb $i- F$t7h"GI?c\|##=4".D;{I )@!f ?n<0w="O)B4?9"BꍰGXGE2J"ݸY~HʈHD4MƒwM!=O-s/W8D…T:b :a4+ڀt Hd&qƲc-b́j .^uDdU!=B(ʎkKF^4Mwqml(@$pAG^p^{%t%DЮKx{@DAl_@!N8BLpnDDb3)p fn+tڨƠS F {uFh1+#cO}W2FIFs¯Zk\\Dlu4z3 @ܴ6CPnP GLqY A.9OxH"" sT تԭTŋnr픙1T=ӎs>~><~VΡ,dML zGW/omx]*c_m.8%VՎ!waP TՐW689Zl#]4;o<t/08>@jc 7l?L4j,o~hiVP1=S{4d^+*2._Wm CkLO!"fLJlrϯ~#5 J)"X:/f;k|J6z}ueo!6nZRgP'0X\QPTOz8WlP'#0Viֺu+޻r%M_YڴK٫0]J!BQz2/ڣa(:%d+QoK{! r`pZi@ 4+k9[ pO0m`bed!]aW;rhϖX,@'o*|: yz:3Ȅ85kARu #JO7&@R}|5[4gI֤z k3wP"`Et)O1vu__-&%UkN3^ @UUD-rjز:@hqCo:N~"ZЅ6M@V^8 ra޾xF i71PpW,| U0@$*\*!*t f.j6GxvA(D4L~\^f~88;w,]~]8 "z7TI\lkJV@U&|$I\5]dzYT=_1[]I[0]kziK TSR""Npb;l켳-f|&sv¬]AC-H{ -w;U (u8KQBgTW*8<|k'C[66V}d+e_N/CG5@iADD$( p?' c㘳2O>|sj@n0Ї{*Q-1Av‚pC@"RF,(~KvnG$S_|)d'{|] [NP >~]ٕ"D Ihgn2GfE[(w"(+. t\tFi  9b ޠ_U>J eEGf6*b 3}P1e=K]0R+?&^FXI J"1 u^.q-R]f4.~aL} PU\\:3@DM$rn0> i*D IOMt۽ɕ "=}A<71DՎUFzE_z$g03?qC,Tk:ng[1F.}* sj^ TQ5^/Y P鰛&n7BMbBuz~LUY3HշcӴe^o# \Ya'joYKiK)Qu71Y&:FxJn.ɛ U,Kn.e5r92-?} o05q8%DcVYԖW`n+Ze,L."~ v|4ې0j̒w<"*(J> q ֬Fn n ,3GMƦNkVPzDD ^*:ˉ,拒#573èqt-obq e2{P'[;D $:d1 `֓O+v<r^5bI.r$z).XTpZ)W?MDjs_tdr8:,}-5x g_)1A%PL/# ih i֪1)Ay/&Wg]NS(Yy=i]׳=)ѭ{pge-M@!r.ʿW=YXH<p"$T)!H@NDӠu 1? I䑝v׹L+TՐ4ӓ_X=/Yᔯ74J$4׵ۭr0廰;zƲRYQ#Lk)g}-UL?~_q9BL Ȕ×kkm=Ht:?aL6<4c>uM{ӕtZ'kL* ( e') I%5Oc8}2l[>=Ld]r+rq έ_z* bH%5a07W&ccN[XJ<=!eG_.{ Z.tֶYw=7'vUҜ[Q3 1u?0*zFL ʚ"5hpH7[9Nv֫ 궋N)IXQ{rN Ȥ.=G qD Jx"<%:t_9 |=ƏfxעaKzXt7MR!0Y#H&zSw%o5pDDX9h+X\>+p(.-DlY#%/>YxhSwRO/.r%ϳ{b#BT@g*m` #ch׈;kPkvb Gbp`Vca3x+"S= }=[= $mPRcl}Rx+S8=OD-bͣp 53MVJ͒GRNPQ a^^+NrMb.#R( C}JN^K859@G'=9 `#r+P#:NiP7ȉ*@_]G!c)̧/0# ʅKNQ6YQskLr 4|_Zet"J467̞8&)wڣ7ﴞrl]#n }z 7@gT2R+!f6 Q eIӡsB (kf@QoY-*~kr@ҋl[WN2]T$,ƫ:%t3 HELK9> ۮğTY^bW U?1r;b"#w# 0DOxmT,Q:vtF!y-HfR1>% `)˔qwRk*Xl?=?S@)=\Y ^uP hx7|)Zw.7tuaIX\6*frCDB%ieAӫwqÞS*JS3J9_!p(@7zl im Wة%':ː2JI2RSTy0mˊLӾyL7/,1k+Dx~v~<"l㨦4Q&? WWctD>\yiN.̐fS?F͉]eٯ ~'AsІ4mDI=c:'aG+?-Ÿ\7 'yQLYKڣq4Fps)ƍh/gQ!:veSc\Y=YRj9CWNѱ.%Ʃމ%uiz:DI !.*TBVIS^LM4;+ HMEk~Z5 wʯcoz˦ã77Mo0e4T/R8Т{@p 5p`o\\LBQ6Ra!FktI\c%vh`YZu pq%R"JD[6~  0*څ"RSh_gw5h i5( P1촋~+ҷƔ~v5)e^ͪj"ӵq@iA?QTd?_VoR>_-nʅa7 @hdY=n W/6_fjb !F2腹XR^|z>@u,%K.ŽqԼ'JD}iuNB.@-/нw]: `~A@`+͈0>KaCqWrX'4+%8i!+h@t})+^&cB/w9eVDE-y:9rR كlj{BGAT?BA \Q$v@Q+8'I "ƫObMdi׈eVV"GFz/te2@c,UJRlBO\1DD4@,R װ*/?$@@$*_ FkyntO$C]Ԩ7Uȉ8&5kEetYݫeLLiQ:Ir{z,ih@wOFE :hf$\Q4\e{}Yv=MJ2~qŋIDDf7|?5p5fӁ:zxzS&%4QK^>LО<hGKFhqt4}UOggSQ﹦0`)%,%%xzy!!$! "'%'L@ڨּpW g:m),^ɫ94tqBvƍ_PJ?G=Ncfozr9 LWYlH짭Ett"0ϔTY#O~\ªWr󩯙)ߝȧ:*Pͅ!Zwq,EɈh"VzqAsrqx+R*1SvJXƌؿnLaxH9}T)@WIp=EmrJ$.8>L؍~U5$#l n [?0X1,$bHDP[αPOޛt )%&M h[oCǎ.,߀%zYO( FPюN`&vտ&tM(k+j-״nBBv%85e&.BW'$J P# h~_p߲ @* 1+ "=gzN`t)Y@2Ǐ܈U ĞJH]53ga>(+%+JR?`ߎeF=?({/Dԉggn4Rmc ;7)҅jE @[tO4Dm9c> P"B Dg*1ДtQ_>(sk `@gf`V1Hn Y >bV"e{IAL{Ds8Q ޕ"ca"B䴻p3ݛvՌ{gV/|? PǼx_sB(3,7Z?jeA&r@ kI #)O[#,^;NzX@ܞ @,YQ*ljhThrA{[ 0r5HwKS$nw% 2 Pp_6lEtO cD,3Z0`5>;b4LD)4_J]X*F %@u_ұ ŇI-.I:*dqW%]G]/wAEBI呅E@Y9и}( a/AUtx; $)eǏq7 !Cz U) "f nĮQ:vəU.B @g,Dxw0" >kEXk[@EQTLP*%+ZYJpMCC1ֲ)K8}ϟ$%5,l]cao>WP[m U:Y h[Ysɺ WvM\V< aP SW#@F ^-ܒ#k2^b-pC,`|~%"R&mSa}23aMnұڤXyX8 ]b׫-:D1Z<D:HL !x\qҘU( EMŘ!)V~knt,f'lh!R՟0 N?Y1KI>~Dy DF.`ZQ* 0`hiLCA]]]""dI BO!b[rYr%֔6߇`h ût\+O4% ^rFKx}fEgIVˆ]K0gLO'kcV.+Hы\LJgVDwTO B" 5N)%, pI&YRHi\vŏ?iKdOy6cnj }U%]>c?)c=Qj51D 1`ćba7JM7$َ!%cᾆE0~<V͡](`p1Yz(韈&[esXn٨wO~!%sIúmY(ݪ# 8ryV]Z 7{݇(LoT%\[Lqqg%f Ɠ V'Ą]k7jڷBàpx ƴ[pxe¤\!Nh<*q;,-־.j~ ]Ij>yQ>n.Vij* 72n22+@ӌ6ZAFh*0f (22MV[?LE돀^*hj -V@B;s2F*Hu 7XR`09 d5䵘KUla='pBU e3Y'lFι*cS<2@DF t5"{z a Y0d:Z`vq.\"ɁV)*#,!):JPPJV4VDD4](6fT /Z# {K:##92 C6.,=hW"谎Eps jyʬd3k,^RP'Uhc' >DOp" $5nEjtZdٜS?r?^,=uZkvX \Ր;\,/ENtB3pVmTӐh w͇sA}&J:#L ,(vɿ^\EGR+ueLנޠ9y̗udWj&콊~!وE;x&{4/.a&NDZƒֳ),?b/׫{qP - dk ;I$qoʊB*0w:6-#FI,3!س&(gp7prSCiM8=#""JUo:' *G@ً!, ʂ3 Atpe \7躋@်E$b,q(>*78"زKS7>ޜp=t/HD׺Rc2}1[}__ :PS7!p0iIFL@~ )"0" J7`wlQ(pf 9#W(mjd ˇ_~kbIɗ!LWv_M8߫RWgj\Q,ۙE8t,k?%SӯƕƔ z*ưteUC`XcTԠ[ 3@;1掩vr!DLQ~-I¾߸ɴfM*Rn[i@_7@S @잯' [>#b)[k Ԍֲ~[lԥGܖ=z* ^an` pW;A{k?Nq8X*~ <=m90n'@F`2lX;n`QG#dl!V):^+.rs8K䜐j !>&)A'$7S$DdQU\Ő{6/FN iB L"`)T#d9^$&|E;F%QQi@Q FDQfɅK 'zFC>9jnfs.~.G a n?ǴgedC*H؉2W" 5s$`=ڞ F)'UV{́rT0ì6pÀ&ܒ>1[~O|NDR<7=˻%/c!";@]:/2cXk(@$`@C301MUDt* W_]!@4.k Dƫ ;uOfP@LX%g]T͖t=^o U 1/Z-DoXxp{f9]h(DXe$ DHuh%H}TT,46DZ,n`aFUpGbŒ~KnBVVM2 [zb|Oα_E$HhBb/lw׭Ýȫ6 j`a4 ``|#kƉ*`5 Bp*DʑiMlʱyiA nj<] ࡁOU%N@ #V8@1($ 27jtMD(OPa6 Fj(ֈೋѿ!ᮟOs?A3w#?ܵNWq|RÇ9s4.H7ub;#e3P:H!`\ Xn"D::NYBz <qiKjmY|}}cǷǕفC)L$S5H.,xanJK852nm>XZq|"""ʧYUBE_$MqP^Iz*1-K,&t|[ֽF5x Tjzck7L}޻A CQY󺱈Rm:cLjFz)m>0l0B)9$!SY':mGm4bu;h>0v6"]ߩm[k@@p\hrA(IyS~tM7 b6E{ȶ^Qg *VGD)<,|j `'Yfƨ]ZDO{8‘j=vXj'A>1XD(*\O]þւpQ$+g|j|lNw|CzȬfR՘-DVVr? ~Tn@oySeStԓ 'VV#4ѹ#3hks1=zk5H^Dt9Vwq}ETB1C 0#}UA7J UHK;D+@v 5 1IхCIxnpJ2(S_t$Fe|>欔OD4wuNVrG&pb?Ϧ/GTG@D'.D7B VI VQܟUZ]7.ةSp}DVFF`Dˤ΁>; E9%/(EI魆.  -]]'B@LDhZ|^ :zb%?v5  m8V,ßG:)5^]I`+۠2< |ATc)\$baN_"5'd\v|D6THBLK=^W} 4IÃLv3K&4 TѾqynչuή}[SĨmPcJWn&SRw6\׶eG8 V?r_NċNVLQ=㛩$?R9s}_:NN?\dYRuo&u|e IS }ߔZF8f rњ8L⥒ p,ӀgsՉ"81=&m,]thb1S[/zX^@C@(MMOI{90'v&{ x@r> fbMk$agmp//ˁ̯,E#QJTUO_zo{[w!v @ `pq'(蟛RKޡHz V۱#GxD68D񯀌!f.ĸ4TV^z&"Z?O6Gǟ3n;8(muN@L"TPKP!݄Q]ҏA^h`ȸv, >F eq}</+C|J)K+gF|c~ ޻ΣM_4,{mPq3|ziL$r/@ROq)97[ TV X0{,"tɛƁH4Er*ŊBzzw;NVCzx߷7 &!mPwTR#'P'/W[-`cko" O7 D}jC|j J%OggSR﹦0P2{z""!$!"$)(#"#$&")$(y}####!&*(n6M35"IBPqBOݯ;lh5U3HaJjPO%ߩB,`c7!ɎQ6p4M(, ^i]zyL[s LqM&f# 1TH)W ZD[]Kl@,:{A6Z HN_@Z`]&|X="@, Êʁq9^l G8)hi6rE"ѣ b.GDH2%mx* =J o^(,`Q0@*p\HfKĜA{T~?uZb'` 0 Mċ>mdV:qEt zE6tz=T8HՋ%[vbè$.N̆)\ⰣPM.A5q=%:MXqBXz~6}/0a4Uw쪫%U=kL)iE.rO/1J'D7foY\{+~Kx b*Hkҁ7¥ta̫`h6W6o&n뉅;y ըUz*L>9R{XpT^XjE/j5HYDV5 ʀ 78!7>+ 5XWjPz'ӟйv Y-]w"xU>6 rxQђnAϲϲ RGK4*~_deoB:][f3/Z.9#QA>Si7F{?%"(z\Rz-P 5"U *wU"qpa8PCm(b(,((Xep^mhdRCpz{%e5Tta\Dtpz;;.5pO*JpJďH2n&0S v'U% WW0bA/{i zUј !p w4@YH5P U3Qź2A,VҞ6KZUC:P,P & cw&JʹJ ǠaXH.Z*j3.9xAP@i#eL#^[?5}2x8=Jvmk8tӓ;RO3 oWRY Z񌬀~Q$hWL%m)g!9eFY5>"Z.O>7,ME{YLMVx;q]o1ܛPID6ty/[<,dҪ%D\49V-^S~C(=b8Z͸ 4q䤚"c x׈xʨeC}T׍47b_{Ryd2S34O$y˃u#Buk3eGr6S,Qrp  -<6h LWbS֒zm7$v 5NbDT +8F1ڢÆu/#DI340,Õu(!k2tm~l4cDٓ\ps6+0 Vdmf([m r=ŵΑ7U,!`V~,řp\gcNbnI rP$Tۍ;6h} ]ǰ$4"1; `stgo Bk?I.sUPQFFfdI"i41\ҹZ -K!8 1EODpaِtxG v hC SՉPEv$_͊Ա _aY-ޤk,kbeb(0)~\ iƸxEm|<P$8+w8IoݛI8==Cxn^H*|^1 ~ n 2㺲-#U JGy6hc}hE-Z~ZAPGLwؠ.];үrkddS,}mg&us!藵>W;MN$, 4F ?ID7ĔTŇs0EQTKb Ld3qqkq.]f7+;o;}!2\٤hKۼzN@6$ctn%15Dx(ڙYN_y,1ٿcTאihqx{|ߨK?yQLِ+|14F2cTD@ptg>t@HK+$}jb(ԞN%dUίi8lr<~l)mhφwd[TA ;򺫖 e̋pS+c^z0%7LN!lCƌ[$ ^{Xjӷc۾{Ek!԰I0b"J Tgo~i{.զ鲌SlɩB!8T+}0[;,IR.g[; In7_ޛ*(zzd`>۩)ne׶nYqSeU  $ `|I`kOeڼ;1s Cit  IDH}f7 @$ 5@Fԩn {tA#UqshwZ@dFo+Bt]"j,""]  >5rbً8 Q?l>Js9}>?hV[Gfw= ח%$v-5LCen%DX=qVjO!!RȪR$SY$-[bMQOQ&*(Ӣ4'>DpF/Vpa}ohG0%rO!@ާw˟:@ pE>Zg5@jr9J =8%~[nVk2S[|<$8ʼnhPl ?3;Кnl6R`/0/k<|Jpu6FB rN9ocM֊eAOI”0P.kl;&g*c3.u2&1+ދmW"S4 lX":N] ^@IvO@ j8B/n@ib8- P~׎+*x"qR+ B?>HisNz ჱ~gkYA4zi{]v!G^ЧS[f1xˊ #Z0e /3tVN$P@gm0@4'7I0nBLDuUww+~P'<6,W5ru,TGPVYE\/u|6Z-{}>e*0n Tӵ~~jϟR^ADDib+ x{)\䊦xJ{t,3_Ho,dO6@hsK/e4=GiP4cwe9,6ҟN/( wmF'}~+gۆwu~oi;ģw-BJؽ5f\H]mqp<oQ A!` b+=uxع%߆**ՑDSL,3XrWY~`b $ =9NW0>&H8s.BqmX &A1KbwF)|V1jڝjmGjJ9ݥgl"56pY ^{ Xs{Z!+ >&cXyU0#m~N~_DU.X' i R bhyRmhm{@ ОSXZ)2^`GBOsWU5%AglkOHGOHe"*BQ&>lJg? gMKiJCF5?%훣/="Zu_9;C&HHDC/&o/k+iLN=YxdK"";SnwDTuEŢx> nk\' \",sUqg^ \I\߾H0ے;(%߹3Ү3Ve \{U= #^.tDvMqdQ JT`ݢ3V~D@CxA{{i֜Oی?\wT61]d_`z笐X;Z|^Bq@ DHL3$!)[ ށ` D.*L HRt7}9 7x`@1PWͬ( t{o>[p[(ٵǗiJ H@|(\D <+(_RBYeÀ n.IEzlRp6VXQcνܩVH7pu:F P"r2( IzZTk%i_ S~`dxՆ!ʹR9N[50:)rqb} VPp 2KAS_[ADFP}…:*D 1x3. 2 vIfI (EK}&MiD?:}h?MA ˴STxas4&s;j1iE yїH.t[q'I""hS `rEEٝ}]T샏8^H)0IK6Pw!bEXY@vJRZ\ِ50\o]]W &y_Ds`-;ZΜ)H!dzO]~qtV9 {+fQxHD0Ko?_Jot^Bcښ)#L m:|G_?ĬzmBpZi(Jf5 FD~[tI |tSHgp*‡ nhS(/ Oΰp`vTG |hZ0O>.xқpd{!#$tу$"hWM},V~kx3^ >R~8Z"QjDD)pw2i-t ȷu*gc4ނ ޿vj AIt A@}p_aE9($ NMQ@5A@ǐ:p14Xrk:ri-iM"cI TEmV dQKAID$Tf>;vh3iHKnlic&rHH&@b{?S&'AܟH*c @16-:OoaOVo=f Qc'E!F>+6HD3z Gk.zePqa/XQAbv4I Ǿ(Ks>JV>A`?M;MOr0@PNb5d"p8*D jʄeqYl$s9c̼dl37`hlֱG:}g+JC"(x͹wZ[Ӻ)x3r_ZS>O]>+}k* <"XkmN|jV-D. RhI$KOggS4S﹦0Y#!#%"+''%''&($% #!$%%%$! #!%%(($# !!#"(%$" "##!("$$ # "#*&"%'&!#% !$#)%#TۭɮCWCxkCm;%bé۸\L)?]mKF*6%\ӐQl_[0_?$ Ƙ?7e \i~׷6K:зL|]kJ TUhY50&Wd%d)+"(T`jp>wŧV֋qfSDttu?zgj鼾ohu"TYfJumja .c穔gC5֤V^d_YV^&؃4P>l<i7[0:qU0q:;eThCg (/n~em壻X̏/bo=t|<}EF,T]OdpvL1_"sDil#\Yi1įm#~('L]Y&29Y:JIj$'T_<[C0 Θ>dW$^Olaͣ 63gpnǼdz R T_Y5)t(eлEzOa/GL^[MZ_ٝ!Rգʾ?\u/:VK^=?(އVLW1nv%`{f/monzu;T[~E􍁥'͗,^c,eźmPU7d_aԕU҃Eltչa%kIP\$?U*?Ix0\/$Tdl͕M#w}r|ԣ J+fS5W翞X=H˭ffkշ_hGTW8V7h(_):t%Fd'a5LWDuh^ f򝈳ΒSMZ%Cda]Օ5=;e.jd[ )֯D."=؛ОQSVYMoQn&.d]59nűw ?l soys)DѠU m/2ڼ^~џDkiDW*FM:yN)$ˤpi\Wh5(?xL&!;+ uJ<]JVIa&Ѥupͣ}wYolkV=-T[d(D*W4 1I#d .D[U4P#|)e<5ĿaVBL\]=j/O[Cek7\]e ٕlo `v[R :XDD:tСPOi߹񲝖 w=L[YBQVA6yͼN]=UT]Shs3xnkhۍخl|8z&h/Eh?T$o%F$nyMUMy qzЯ2tEmV) ˍhL+nΗmPM-dôcfh9^`w{ e|fyM-w9>rD[ߎ\_EГE1X{s5˞٤9 e|͙FL]$Yq]@B#dwשLpRf .bLAqğټ|VC2UN?Fs3+Ғ.W^aUi K}шFWjsj=u4.0;}N#ץ)!k~;4q^Fyq:s2{d;&Vgy cgչo #_s>Ñpg'r|T]TpoS'I~'mi)5`8(Gb:H_gYtƇLYrQV&T-P ^\=~v2)O`\[i~ &]WjhS,o4FLIJDW2,:}{|>kMb+T2ĴDYtV }xvuim(#G {uS,"\](Ȕ/n\.P磖\8` T[Q*ċ%/_IŰ,TWiY~CzsarBFD%DBg <L0Oq^$")!#x{srRtʯUΏԍQT^gӕs;\*U\Bܪs[EŦo_@n߆RzсO+9-8A OggSS﹦0-'$'%(!(! !"$+&(${uy! %'DYi}[OGU3ɔFo-\\[犢Ɯ~}e=X ȍGxuyn/r,2"SO0|\M _d_waV*?Yq;oM=w[z2]>R]Ǖ͓YjELDȦ}ggtԶc!}5UI-LT**W  <.ơh1f{դW>IɟgP %$L*,pwOH P $;P,(FXWUhPDӄFe^u>rgiTek~0/8iAu덪\S^&Rg?5V1 aA87k\A+ ԏ0!f[݃YSL8ny䍈6UCfwc߾C5@Eum8L}oTeY H5Sg0 PX3iTi![fc݂% h\ t9ϥk⹠MWRGtŋr7Z[ _pv 7PXzݩя0=zu =+$>~y-D "^\6A/r@`]q.J4GVDk>t"woS!{ P dPLLal Zδ}Q…\n Ln!. 뫔d,,*YQ4~.G Crx`msa+xPFU2EJDGs]d6ab>?r_k_84<*hbDK]4u>1y!63;@ vB ZE;"2I5{vˉ  ץ԰4ғ;}\#/Ŋ0pбyPBDO7o Tb0aB+_J`Q5DꘇA7ԫ9QB듮յUC=CPg .~ID]./s JrU @$BxƒF_㧯_|G?k4 ^{ܧ~G;']^(~6҅RHw!/5=ӻ<#DFmjM7U;a*,ӟ6>j轎U$"Ud1pkI,e~Pa' az6iO:26JR@'yn٥}]^|Cyr^wN2R/wZ*BQM[v~@@ox@EUxË-R<۟ݬt0NzqGƧ=$VE;M<1*wӋ#@Ȯ=u=x:9~=W, R?%|bS(7\+rzt.& +C`x+$Z>yo!de_~DMɐ|TY*H4GO~`aOEx3J2JM"ATW31\[E{J{#ơR8KLSʑ4߼!n1* I~D07+)?p>G1I{ٳǑzgun}NF)S]_i̘<%˸l:l] \ +M١ޜXݘLLw~;{np8ϹzL$x1ȷNf 7=}wRgbalG qgYE\!UNaZUvyQ'pW_^1<5g"Q?f5t8raPGXlt#*%[kb*CxL d"^wϴ6#C0;x|9.%MvƑ]q󰅊vl.Pt !>(.-Wt[e!}Ly8ԅ=ZZ>ҧ>mi"kA;=ۚTntD[voe4'`:FfU,tJ 7YeLA/*\%f-k"jA>Tm5iF~. >(@rpΛJ]DXQs,J& =y1:n_5:Ct7Q| `FMPy0b H i]W > mM\޽?a4n%C$,%OggSS﹦0 #'#}^|nzr ^ R!fbfKگ3e S:n[2O|hbP7d)3"T34ԗzo>mosaEr㜯s.k )h.ArSV/JlcVTM6Ϻv Jف\n"FX9:l$9c[oQ` ,@& ڨryJM;U7`WRf7r,Ë= W-xdtCr>՗s 7IAȥňq4Jr%.+K^\cDA7LEbqp^ ?4O̸r7oky|t+NzbA?<ib 6wrM >ֶ)#K]&ɉE3c߉ OCܨtk CҮUZFqFMQ .4E!عcz]JZX%t7Bj8#o=\tӬ|XO>^> @ 6'Vc#|Ov.jݣml6텸j@W\5UylæM_#mv$X>~T~IO-;N_" _+{=m{c*CWեX 9DXph&I{{k*pCp}@2:X^ G\f.:6;y݅57Pk.Vkz8B*׺ )+O0dKX b%'QLD$zn[k81O^0&~N+,h pO ::-BR(.4@4B-G|Jf3 #h(FsHtSi2~XXSk"znZaoABv "<;ϻ(\{:l3486⋄/`z8tr9nRtl~l8r$<2yujJWY)TYuLµI乶n2.k<Әlx/7%7,L^\m>/wrط>h)udXEd[h+` |N S;-]&o~٭3d_ԬK5yo?{~]e.Q[  Xa ezLU*yhJK.&+v?m}ewH,gs:,h(+A5MDfƙCNOb4TZ'Sޞx≍kdu_*6 qEY !On¶M݄(N vP/1!2(QQ$: )SP@=SLfƣFT%F12,`TV>Lcu;"Kݒ=>8THJr&C@UWQQFZW%punU+6k'ktW)F1A팱M|(q\c@ ,=j#΅l%$FJҠ*O=v1BP? GuV2(PdEFFj'|nE!@esK+˩/{Q!a`v_BG$}"8f7xQ]_|ut}5 _%W{3j97O57k~Y(/tzuJ i}wVCx)6g<*l3ُcLN?8\CZ ~,L< -YwN51۽#ko[1gD1USyWƞqcǘ+y:keng _Ĕ :7{nd*oJ~kܦ~;MOߒ<ҊǞg9fgg',D5YjI5Ռ%aae(/UмϬA aNJdCw^&-pCB/bW 73&'9NJǸc-v6q0NG}o7 B>vj3@4*;b}1bk5኎R_64Oð/^pcȆ_l_׬%:f:w:[Ұ N A5*vRIL>+FѢbbh`󡦂)aL(B,WS9(4I3|abH$取1v1*S^fb H2kO⨾W tL l9?S텴?To\sw4< n)_^%z/v)@(QT|=)Ų8f0&|>//5Z," ֨ CWw#$$NlI 7 ,1i@v;jHth\x9PU֡᫘ 5ZY MYk8A!W WH[劾N4[m$7@>\˕oRZʨ`pa'~{cIA63>+֋RnK\ w~ю%:FM_lif~>///*M x5MF]*2}B71$? 2Ђ,QB&: :JR %`Qzŗ?ߡtO)ҙגKңm]MewTVLs"~ޥӖ|w5szy?gׄdr:ޅG*StDlu#vw$\>^L?Wrs"eQ7 O +B|d- Hh`kY?rjT;*t.Ewp|{h{.l$- v9\^6 R0yMO۠ v6]C dCu< uX2qϑT+r2ܫ(ʹ‘+hTDZU E"NI`HNaYj.u $Js4m)c/]2퐆\}jZHH:w8ƟF Qafʋ uyJ/6H%k8??6ěO?߭| $A8))i~/4jDbZ(idA'FKKi,gdoZA-oOژTJqwn )!ǡsP&uמ"YVe_y8ٱcŅa5-sIٱX+L,u%eX``'5& ٣pp-n]1Wtϓ|0=tU{v0ł\.GoA&9|p~u6UFP `KL_u7w_x9\ ٔm|qAW9 ƷR j bI!ZC>%f@crh]BOVGrٲTX*.LtΕכGMǣSYv@i]vS@G';ެl"0c)a:*3ZqC8T`o!Zs8~76tchqu4dRk7W_b OggS@[T﹦0E'&%&ҳN u$^d,y_f*ܶ^H7W:bKu![]G(d5Z_+a0Z5Ϳd7K?%(|e}W{Zdē:Chc+L_[;fFH%}1$G| =%Rw(Y ^]+ Bca|^#m+?8  o [;\v{3vFnSd!čY"Gj7[1uHidUfz:HLBͩա`鞵O{:cǥ1MrPT(F.iixģY^ͅYI7!M:sC+NR` c)trjd՟=~IƜ?WԋTGXO`oeF3nt5N__Nׯ }Y:Cz8նL`K/Mc65d9fGoH҇1#XR%ptK**><΁ћI>7\#UZqhmT/Ef@.||ŧǮ T/5TkJoT#g怕6!w[_4n#D$68]mUؗ~sn+A %.R5W%MANi\Æ{jP~vۢχtxONsTNGhZT$/<=_KVB@'Tݼne 2ЬRLČͽrzOׯ=:X\??kS&2!44;v᭎%3?A\p}H .T^qRn0߶ DOtAV@.hUj AMߛ^6E`:Ǐo޸Nuw~wnBgik߾j k=G*2`NYNuH@$ ȸi ,Дpz?En]M-vj]cE|9Ӫ@lۍ oqS/>AGV#ϑovr:Q_}ќRoxKl %;R4:#'M-r:" @8@دc|>%2?aSR[,}4 +JDAamp{ 38tsH:@Z׶^b_Fê@g䌆Xc;qp}7a/DH$(q@:| ^c]LׅCW'ES=*,tLGSz}'cÎY4b+XLi*yBhӵkvb'QOhn̋qt!Ɛj9F1cH&jR-wGSKNOŀ4%F?T-Xx?-e/dڶfgYt'U S:Ev55N5#+eu!"`:Uy]?;II1Y+\Y$$kUA%1H9r ~1FUnqz`2X|~iQv*eղ ƛ¢fvpYxm]tLG6+)w А=9<6*N?$ņvÒ|&\&Ԡ_2ȟΛ9uE!W#b( )~s]>|ށ7|] | 즮s!)A]H r]~FʔGQMit;p_au Ϛi 49O`O%`T_K}{9UeSV{7'C |wUH H_!DE.wF%}_9Mg/qجWk*8ҜC`YYޭYH9" ?Y.gַ_2R.b[᢫q_[wyN>Mzse?Vf'ȝ[Hrr dcޣsX!+veGhkY wNw!rY=bVvJ1>]NP_Vpcf?&: ֒R_r3uxż}=}+~k4!B|_=|z .XJ?3nŅO?3#:'k u2%v-9hGL8ıƋgc !x!M@];v wzStqUBh:f٣*#σc>iu=^!qm/vrG¨T$kbi ;oE5d>w4rpR"U(j$ ;RSYWp%o[r~'։mX͓ V= /9 Xd& ?^hm& [[J4 ¸FLm|:*WC Oue[ TK%Edąع ě 3jh!- .-Hǣ+8%݅8cS8=7܁8mWR4K*Kv ow׏Ud/#s,J) ?!el7n֛d~1bξ}!ˊjڞ0{}{ y&lBtlAkHR&9WkzJ^2:܋+zK'LOOO,8s_gC/AА =nQ A9`M_Ƽ׋nwg\ڐ8G_#z' q9:lW-Vp9)惨F1uL c)BϟuݑJ?e9Kt/%͹%v]P2(VhlN҄B!@`sIEȢt'&yuNu܊mr7lK.)&\F\I$؋ȯj5SdWCY~ީOk'Y: TVQ^w1LؓVH/=EndOggS@T﹦0]o"## #$!#&&' |dg"4Z!Z7DaE%W?4CBk['I2<{Eg̏-+f,>"0h4#gomla$>a x,ח[a4B/i!iiH㦆1B:ejP$ҀtR{T% !^\NƁ!hwŌ92gyɳVbwm \*fxLv2r>R`wҚqfӻl=ヲ~x1xmHKP ݺ\gD\_;=jke>1;IKѦ~b7Xkq~*es"^.ߚ/ "l/vVrBh`Is\p+S}ZPtN|9(Q8\49:/AK+ʥST.+q1I@ɯrkmO֪|w]{޽=j#1܏$"'A;rK6dqF*[Be` $ , PW 6ŝ^r͹-.'=w3l5lT"Nv!rNRۗnC(cUP2p΅lCxÆ+V+F2ZqUf)uKվ;QNGј.f"ru{ NCC׎% ( D]~f`6+# xKl8^ΣgۿԽ4jWPs\HoQbiG"0\o]k6J+xRo׻^QWnOxG18yd1Nn-ӓJ%aPf(܉K6@Iq[KAKĒsݿknIxO۹=KwH~Jd;0)+UU.aܹ!ZeW3Vq eQ>-KQ[8OhVT+]ٖT۩Y2Gkެٵ:HaFSG(CJxh6 Ԛ2~*w/VIsuC ]k1]w{!6r[e7:]kyȩcM; {~Zw,; ftYLkzmp\֘:PB5k]OnǬ4:D춫F`XR3 DJ9oۛ kz|1rm@"^1ZĂ0z+J|8¢2?&i$g_"h-R'3p;fXn-j)U$ 7d0KQ׺NS>A*\)EZgeGS+~vT9W0m Ù>NR|IU[jM5TKz”!-ӘR"q9v-?fI"]TT/DE_c!nZh )(1 (GPhCjpC(% G&& 2+܎!O2]+xB|> ʎXQ J6dc[u_&L@ުH$5=_.إgܧ,? }\  *,*+*T |b,V, j' mPP#G V ^1hRQt0yυi.EEM8C)TƏ:.O}vZ4L5ڮ -S"U7i@ @'|ag&.g*` D` <i 1 G D+lN&c_|."!AF烱$SN͜Ȓ8Z"ng pw9{J_D-Y9nT D 5*̀4Dpd.7" & (*\4xX\F HN>"~ :d )ARL^:5qE:Yo< ~Ӆ"`XV&T$`ܶE@^ґQx.RUE6C:%mCQpXQ#ᚏvΒmڣaeX@)`]*:x v30Q@VDDL ?pYT|U.+@[b\4E&U~H >O|(#301C"8szɈݮgI{Bg3e `P&':h/\}(PAaBe8#J*~+]<{!rǚ5|pPs+J3ӧ%OOs> ;pmw_坖e㋮u] {I&/ah5Axú&эBqYweL> .oB|RE$>uZBRZkEKP Z?>6^r@ӻ|f5mﰧ0ɨu86W8>(- w:^1Nkָ4۲ 㼾eĺZ\,_kd;֦*6*?jbqv (1e o9HB+T_?EOEyXdy=)r@iA|K!g+d;?SY^bB6aCýgL!VPsw bFgD1-n>|. b0%K:;s)=ifSȂMq9[@jrLTcOC^}6}Ȭ3bI nk9йNPA3XΎ3E HLhh1ѥ"A ^LNn8e0MC K T|, /exEdƇ+[#=Ib~E %yeʄ \pdI4\nύh7 [D#w'P,`EOggSU﹦0'>(&&%%"#%%)!#" $")&%(vf/Hy  Mq8f{CvŌ#:o::3]5Pn [eu'BjE]RYiMs7@Hq9-5(s ,%0mdy\*'W$S=ό ܲB @Zn^Szq܆u4UKK%GTGWN( iSօX>_p dFuGj48+gIdΠP!2W. LY1t=^3%"h"v_5Zd?g̰L6 'M19$t+zv^5nu1t|Ȉe9o[ 4VtSf'vئih'z~p@9G5;RUWCF?4KQ!qf^wsvsEpTĂ3kS<X`msΣT^~vZ'+k$2jur~4F!xe\++QRSN!D0[6;g_ iъI_.?ܚFҧ&rL/Sɼm?6(&!| H@6vK%wwjÏֆ Kn oT&fQw59[K$N+M -q ֆ!rWaeJ #5w!ɨD|nI=K8c%\0 O#yR`45jډx}7 tל#F"\5"]IЏld&9G߫XؖIQ/L{MfP+fkސyXs]ǣ[ROwTjݢ:/K .Ѡ:)~a`h$y'+N륻/\0}v2+vFhmA{3[#(k:J fU""Õ0 M81stx+x}mF|,lԥ-&VlxbA"~ۥZ^z jN!<%o*߰J fQ{]W}Nr<XʒUwR;CXk} 9 8Y\Ƣ˘6\~~x+z~voL}[7wܽP߆chh!޺ijsCޜpimUJUu 7,'ziA%@/s++hBYZgOe2سW_F݇/q:715 0:i;4r BxilԇݷjׇjmAqi}9j7C\C2k@"E˕ҵwKBo@]Xy%/@Vnd#^gwg/&/QFM67Q䚯*d"cyW*H& >q*G&+}Rv>w-u׷ObVF6Vji1n: CIHpC^ v+qq\HbI\ps[@~qu#c0C =9@ n~P 7itM]~n%zR&0Ѹ }ihR}׳5/a5)4iG(9nh s)8XԑJH\!5"+e_фZFkн-gX˵ER% Ep'Kjn$E9ޞkV<EMp]W٥vu_ͷH*ԄҴ7aVǏV5ф;@rX*5 ږk LD(*=YhZ-M^\p2v7Gz{.#鐙~q kvMqqPqz#Mljd(ۄ8ta?yV[ٝ''|ϙvtci skD8- h$lg4 E码=]뷜p3n VLƃ7#QU* !f1aWԷo:)׃)v ziT S~|r-`ck@.Sxzn5A}; .4Nc-7@m Z@!.G:3AOggS~U﹦0s=!"!)''&zx|y{vx!"!! !#%#! "!&$! "#%   ''%̞[`vEk#. \Rar!. _0H ' ng!k"Ց9|TY!Utq 2I$@'.]RT<4ѯFD{M$t]5p!qVG7Vɢ A^u,a]ETx0>֊"C ]K]/!Xjw sF~}LX8ݨ]Q@+`o t\ԈƸUErX.~B"CdY@\Qi*<>}d~09-2jLW"YV|.iƢI5ŘR4Q+}#$Qj(0\uTQmWm}*ۃ-e4T3gF] LU2Ǯ+Ns-H]^DXB59ڷv \]AfN^t ypzsXv󮜎D[% B[V$`& &euzoi!$\]zS**`>z܅=PkEcl^Wn(;3a+qWD![o IWzq&oxq} 9.v'/5Wx_c2ܓWjK $(@@<+`Ct!$"DI̮B$_2|>by$SHi9"e :i#$,6S)CCI1G2L5pʓ3GWl}E,rH 7X,.ެnb@{VVq$ NKd#M#5nZ~ޱj넫|bհn(;#C ]D!(\jtcpn5%P@Wb ,.E;6.J<"LHp%r@I2f(0+}${e:NzX)km}QЍf^e@IaͫS sQXǚRy,!<5>|v E+NGҋX,\ @K#Z?L$:ڔN)q_  Nd8Uao9yÝSz~|%L5i8t2b,CB= BX8+ֈF0BQ_dcny&oMmTQc2OSs`hb{9DpQEtal2>"PG]NL#_!*zT_Xx𺦁/ծT HTY`."@0a;E%V$I\R3'сE  ]TS̩J(`%ϖ>z27̕!gH\YBOUb&۵wKrn" ux!&7LU$JK>x5]Nƒ"BFumuϺ(]fH զ- AƬqoG5K*Sek_{0k*15WFVMۻ'55j-N8Wi-jUI h F%kڢHdV@n*ڮBgWovv=1R<[æVc8Ng|yc_ {UHuڻ f˿WO?gfyZvڤ]7Xi^PV|J${i''2 Y%$V7]~,vQ Ѹ`|.epG5Jo/ }VhvsԢ2~{^>;vϊ^r2u"j8&@r=y-TcH,S-_VlNT^2<֩QoG 2>q44j<*zrWxYm.j 3bt\_]>fvO-MIOl.{։%mGR>*:v|F"*OB3v:|>fa?r븍k4{xĈb;rosn،-\ n8Y4g BToʙ]+cQ^l6:+N']eogn#,rn=Ac4۴I{GMv>˨/ !L^Ȫ⯊9|}L{&w$~X‹e-(Q MQ:%#,~+e&rFj| td9GKt2:us{~T^%"EwJjKF#U)"e"4!hp>Ni5d#s ;C̿kAO a2vm*,OwD=ǾW$'<{c1_(nb@7 ulVq8=PlZ~wҊ*!К<wmfo0RC]W\{q^y>Dj'wBxٰӺԔP Ǘz!U_·7?.رmĹ^B(hv)ff4CG8Nj>qb FiA9#ã`8mp;ǘ><]jg=~\d׼'Idƣ!B*C:?YղBv/֕u /oz7lސKA zYJX<1ۋGڝҋ_sn>O>s6$my1iwXU ,c!5#6V_6@32ۻ^6KG%*_ye2iN܆×p\ԉץ$DRz7u`vRD$_P;rcLQ؞cc.ϋ )M2 :S3G&j[0_)5ҽI͎՟oq(*(ܘJ *ج`I0F ;:L_^*^+!u5P+ƴ @0V|TT8FLQb{0 V @LS4x6AX.^Jae%q!j>M. -T0Ø .Skv/2fIl2lR#Z#Z%q*PXYP6n}@R(TT(`"|P4iFGWi!n"Ӻgc3'<|J1~588Z-ON& |+ TzrLeP7ڴ(:TEG3.؂H BDʠdP`qY cэX&wD )f}[p'xKP#_, h#Mb8s"ɃMJ,7Gc@s0F.L0n$F9Vkj-{;|դiX.enjJ%D\TS[`% R*2=P`].LM(0u]ɑ(:(8c jBޜ?70- $M)fO) >ˢut^('jN:~l]o{r\xpba؎BefdUQ,@Tv `ؖu O1-+2Чz/O]~X#xK@GqQOggSKV﹦0B"(&(#"!!"&&|LMĿ|uB?nJ8IH)( s^Vlp6@ QBsZd] ?jp# U]AJa20P#77."D<&Aǎ6y<C ufvbnH8&o6r[$[s~Ϲ̷{EPfF3x3 @^La`0K G@P@P$ \*GBp#^ .4Y|`a4YshL\.ӨX7l) |`תsSeu/l E:|v 7s1ZI.|],BD#dY`vV8Jh/tD&F >m9x?˥\38/ү3l>޿V|:VfS[WP#mތnuD]J>&R.aQjO ݮ*Fy& NM?~ulD7 7GVMHRi2,Nyڧ{Ӈ~ZIJƓq+u`n<eZݶj,U|lN cV-RAdπ)mv+@#81(\~|t#A s !I"Ӣ4NԘ͸fz}sSXB\xqU27Ki ]Ԫ!kz]JuP۰S2 J!T Z@涗#e~aH)I vyrJP(vЦ.W >L~DXB|;ďU"s),ͥd#f6G!g8c}1,a*CHP@;0' 3#<%FSh0޸p@$ZA'6 GXq\+֢C:t36VqЃ7rT{JxPSUzO ARA0\Ӫn  a SQVY&<dil?CZjQo'%ӥ{9 DlJ*3c-P"1/2Xܦ~%J|2ɤ u'ZMRpO)"CtH"{q>=ұ 8? z<S^V"J%kDr꫟Wo@`Wr̷wR)+2#%`Ԛ_MK ($U@цŇ`^M2S #Y6\/ٖqͽi$^.w]ʰ;WWu?*R+?\hLN y|} SdMp,rg X)e7$MBټU8ud l1ڨt,緯)GV.PZqD>4A.wC!t}hdoZ=Hyu@x_0nhUs]jEIUq[ԏB$٨}hOBԐ>tznԯT븾Nl("CNzNF.gE6ǥdUK1uh# ւѝI @ls8mdҢ3ٺoov찊ōNv W6dڵ05R8c& |J]R24Y[i9eQ{nIy츾Ik##gXbtYtxx̅J 6!_lz\7xڂSsT/ JQ|l>_XOeJ%m }{SqtADp(!D:Zgk` @")PcԠkOU ᣬܙj0ʄPȮ63xQIf D%d[5HhN6wχ.xc^ԘaTY1˵ e957npvo DOM5fڌ?\^ҡX+5/F:*X LQQ47WHha jIQLSjʉn߮>,I#3 sa㗇m|9dwad` ϸ@HT4؞f(.p]@kPAeެ]Ik(τώZ";k|Q` t"B sSDvcz6kR[.MS+{J贀DvT!&)&-XNd Gݤz]I}0.r m;OggSV﹦06*&'#"# !()'&%$##(%)"!!"!&,)+!#%$(%(%ތ2p'i)(SZχG*:D]ҰiH~E:Ѭ)'1sY=}phKi|x}^@%Bq ~K`NKR8DS @n]zG D&PWbk# ^Lurh)hUQOR1i]8#RH."Rp?-\`cԌ{bݱ=o) n!(u~/=CP%p2X70ԭ]\Ci7va_]B6 6i ܴaкfj^AK905&?9:Aպ_\<P: ?D^w|/"IIw4<=Lya>QC>@ uRa @ړp5 'Ă %lr)x -|D`f]NpCp@Fϲ}I;o7ەLYzXycyѨ}c˩8Tݘ@|h=A{#iy6)9RG,YN{RsccSӍ jt_2{cRX[,5D8pBΡ ʟn?E8S~v2=ryV^5J8pO:dgE6eɎ~%~(X*󉣳zKΒ˧-:R7Ac" eJ NWHNTSW4قճ[/۱[D> $N[@,QCz E& $۝!)fO},kJ§ӌ }ϕ1|}x/esl)q\F5m't[Xsn[Q-߻iEٺ/$ !d( c #aAKpgv;N~$X =My4_/.z{ɟz9s$+J3<}z.m?dܴ_T%!V1oV!a$5` 0$J ƌ{WC k4~;*I ۱QalaT m߿.z|/su/{[sædL@,rڞbi\|wJbwsaL5(0D6ۣlȩNM27D٠Tm6e2~9Ohrz=?L tM>rurSV/ A&k>j,ոmEӎ1RjMn% rg?_ߝ\ЉetZ99}oMJ+jdYyΗw%Ήs0zNXXmν'{:m":D.C g8~7W̆9f?*yv:wyfMтieC"|'=~ lpԃw9r|_ 8\OWGދvr@7NnF0n/tFƃ 7?Ow!l?kB$eJIqrCJ34 ٪J\ZZ ^x[rMu)j;3ˑLRY!1$ڂĈߕCk8m p]slj'z_(]ßOu۱cE59$'8Z_NnuyMweEuN2i;fc)`wC!1{šo0DvW!`eTG}JB?\Saaz4dT4ؼr:B_X7Ѹ侎Dx[0W&X~O;qϺLck8 \rWu~srd+ik>% ߍ9\߁Wv؛`_ҷLj-ҾzwZLGC`1 YbB ӽdzENlvuVtl6;Nm,jOݜ #Fk/ձ;V/ K1WJ)!dB2r0!cL/kcNYp~u!=fIHא&`I Nf HjA8& t"5l$v XQD89k"v[r -Wwli|o}vTWJ>դxc>lWR{ЙIW/ 7Qǡ ">SP2e)(]VHB ~ T٩l KtS(nT|A&+Jn1]\pf^ކ S?Ց;ɍ3)];DdS7zp 0YsD4юxh}n>LXZҦT](-K8%4͆W5 V i,I4Na<ϸ:6a@p0v9ݞZ#Ƥۊ>DW)} jY,3_~W>yntGo CJ~ceTaLӗ  4 gٛ,<ָom\ct"l l?zS5ۚ~߼L_~2: 5&, `RȞSƗu>in94=\$%^tʉgFD!s (QZgaϙSG4"FSԛ沋B0h)N Y-RDtKQƬ"+H556L1ٗis9a:_?3_}$NgܹXUX xjZa;J4+`Um/C}O3wtX .^,K J/.m>P[GE(Ÿ3D7Mծ@:˥t7qX幠Ts($S/F}3$N;D7ǾÑmUI@{`ED)dQ4 WQ0%1vb{u~𝫛0%s]1&tggGqe8\_-]Uy6D$U$AC3qQgXcO~4:uR7cY+v>"5(E^i qOggS W﹦0~1. !""%(!##!" $($#$ '(%&y~DW)q}]<(%e!lcTֽDYѮ2rqA맜A~j߸JDDUf@L}J`rv PZOYwRNT_1ۗB?Ppdlϭ͢,"cjY0U %?5>wܞzHnZ/I-c"@:/"ѐtz)G&>hFwΝ3.f;qOjY9;rNjƩUc p9.ϗ:~,t:uTd]aq J82iy{' d[v%u}8eGPDm\]O5`q7?*tyH|gǻC,rn-mQG \߆[8Ԏ/"Bq1o?{$̪ Ư_cn:=! @\K[*0d_Ai'ye Ҽ}2n>TWs*}w*`3y,EvMb>4GߌkRۡwO]+!58h"\K^4uS|"su%kvǣdoO|V8Yix{=S \QE . D$i.F"x:aqȑj-VxR\yӌvf-^F^eҎ﷣TlD6?sLtttY:}+dK9H]|y]!g_<Ղ3ppV$ x:`s8KL ͨHxH@+Pc+QVjʥ(Dg0sun2;l[},{/2l0j/=3UƧ <To~vT݁nHf˟zsߔ7'n7ȇ4xk@RsvTŔVoġ2bj@ri%pAby8 cJNmu>u[5e-[E9n) #>GD0+һ-i`[%UEpw?N)5&+P<7#!L׳P=ц.*iwk}Y\ OGӽZp]^ K1`qw5RV9扴xP>Սp4_JJ7\ΒE2333Et6 Sqn28v3 hIc1t΁pa4ʪ^'=\s*kI}ѐ~OA|ݜ3jcsjohP_bc/#۩u*L$HʢIVZ.c!4^@Tt}QbPCu$0UGӌ[E \&  > FMĨ@jGiFEtvqT+D %^ X:Xӱ`C3"DwK|N< u?݋.63^u EԟMvV?)A@Z"@}~LNƁrӒvwThvA7,pD8`3ZO ¥6L<dCj-b)/bGPP S STwݶ>ҒWCn\G:cG(8Uo )&1j;a =5NY@/,TZ㶩9J;|gq#:1]gL'kiG~S 3֙B>.:mjy<`i-$fɅ( "ۭAbA\ǃM0 ;s, 7+6 X{ߎn:X/rNZ$7WcU=b"DŃ8 ;84-8$PEw50k% kFA fL4GHcayp>wO{1}G󆝥gJX睚Bbڲkl ֹˡ]9gƈ$$5ZXY  #$K3 .EHYv\ Q[{GȴWLbzL3Q1 q\Թ^J0GZ]#=$?RƓfޯ~'o\,^){DeČEZ܄J‚IJ~nLq|`Z,wA/<UܯXYU٧(j|vnJԾtze5JBx{`>C9ԹѳClv8}~=H|Dw= 2%ڵw)+2(ɬﳢ|0/P(|T2l.4 H V3sV.\( ajLk&t̀ !%=35>(^ARM0ot%m.֪ XCC޶ [ލݝǦZGbZ@+($U`C<ꦼ+=4cF쵏?/}t'SCmx6N 5^|RlEwLX8OggS@vW﹦0i=c*!  "($$w||ywxu#""!$!)$~|LU\ d 7WTJT*DSJ=#? }s7  [XT N1!EakuOH[M84laPDieSW -@(} >MΑ" QmP` :[\F@|/„}.ws R!)L>ı1ew tɸ{Mvrr/a =h@/P` <ADP" PU(\jp.L%RR< bcerrpxX\8,gi(~c^F?L9J\uI y$ l0pqYc$Dp($ T0`E\L.@<քp{Ln>]|lf >_{,W,- p<>/ő3ʈtFBWvW?'bY)O{}L&0,>-pfZ C!eX\X;2]mްp(hs:>K3)~K9'?1PhHmesP8pUᛋޜ8 K\j*2 X*Ųm92~5F D _azj] ;VAL 0!犞KNQzʌ >56,hb]Ŋ$4?+/\J{ W!UTEa=Elniq޲9ia \]+LDwA_h Dnz:r! Q"DH$R}0r6?bQA* eh=6؂0ֹ~HB3)r$7bhقeV V>Nؓ\ZWv D\?@D𹧏Vwk&NJOvپ0`T%}љD~~0֡3WO ۚ0„ 2l ڐUK:ae7@d_ '6(T= DUk?_u,4Sd .Hѽ+E]iC=>(TW#hEM $ӷV l[2ҳ:-d[Sf޵}hʝQK"k;@(xh$ GEiyWz^D&9E+>@oXH?cm)BCdƢ ]7TW@R  oKAx.z"+FM׃[C=84/e؋][#(*]8;r(ǐy};5>;e_Zg+tWƷvajNAz.鋮~frgSfꇑEBz6+aOggSW﹦055$ ! $('""&%"!%(%#"#!!)%)" !#&޻Sp(~5N >\*E$vS`zOMڳѤ'ߏ<;;8 4څ\Qw$VOhU{i3q*pc"ql+P2í%&<P};.쭘C.8ʴѐCnI\7ka/pSHt7~ĭ+gUQw:4o~"P5cLM SD]ZMcDY*ȹ A9uVZ( vnW;‹Is `K.h&kN?QLk'2[횼~F⧈%4=71^s &|Ϸ r*^b'L`ZP|%;=u k!ޤn,j<&DMX~1FKtzg??;}ߝ8rDYS>hp{ۼYNHc6NVJ[DUeKyePVD K?rհY:ehPFE  :)燉\K=3͹R1e&U78m9,|J~(Q9F 5IsWDg& 9/#OBr\:eϯ)JL.9V_S[ a!!RGkk,b= "<G+NPM-rM%7\@ͷ)XT~CHl~<4mg1p㾗SI;{}z[U#pr ځ9Nq.½]!>70}M`4ob( $͑fI_O)E XC"#C@`Ā WD$Eܬ#Z ^.x>R0#JG^E|%%Vi ?h0w8Wp&uz~  ( 8/' fXcYN9Cۣ݋W+?=Hc{imFgr% JrI#!Ze*K G fp'g' !i f/e V^cy @E\(Y#7+Jq<΀j!@[ruɴ\p7$6+߶{nOl8iPӛ4-TFY6y ME[Zw-sL$S?lsI YSsT u6GW(Zi|4D:Ɯ}s~I`^\_w:Q"١C"8;KЏuG].:Zq*+Y+rޜ_sB3 Ɔ LX(i؍F-N(dgfF< ߷j7]î_7bJ("4&@d GA7xIdi#2 .?e~lv=1) f em &+~77_4̏_4k -5>fE @ 8{P a+.l  V7< PT~,jt]>|G >`_6P3}ZJ1k`+e8QUNF]Y'%!v-,Uif{K~$lR+<%DؤwɑuP<:A ۶ O.L7ԥ@V@>Ym>Ֆ.;DkcU@R&_>/{|( |ժ],~.VLU(t grB~et( gp&DW˦Rvߌ">W9x+<]h `rU9~nQTkDI kن[ ˖.OA$q\6a*y+FQ.tȫoRO*- ;ϋ=۸as}~.Kn(gʆEٜh#~``$[KH5dQb9MKôeB~.\ŭJF=F#AM!k6h>NΌJta\LȎ'˪G˗uAĶ?8TD!X>pGh{A 8PWrx?I $oXfʐ(Ѹ#rPMU.;2&Pa%J*>_Ʊ\LVC5.89QUWi4-AW_U *4 <JzQ($ .;h/-2uY5%DQXe] xǂN_֙"BHc"TLWɟ-i柿š6M/9ֿ$ {?1cc\Yʈ/lw+pqĭN0#TQ"וAUUQūUm5,WVX9i"=cܮ=1U>l_(J8pskCnF^{izQ 01[H7hM(C~:_Y Qd#af?RJ#a۠=r$ʭȽ/F x(}bhS\XAQ,)E\5Q:ʒy1<ݍiAf庍pgeJrL 8HwP~Ŋ$n%@ȓB" w+0u1Q.T% jR̵ /FŹ _ikgM[<61wi2lbR CcA/KJn$U5(|"NH,YBB,T֛֩BFg$(񹌞CRpSΟG] 30}?0`8/  i4K1aN\/`YH?C p).* c 75n0FH,t ^,2$pJdW4S2d~YFEM+15D(5L[`UR}÷~m%fT/X\]*,vaQ:e#LY+#.k%1$rChP.')#PPv2/]av=j಻IaULRMƘbc^D}TjE)k)uo," F"N= ڏc*q0p)<~k@ ܂x Oqؕ.JHکed '6X\^KELb^ڱ0' U DxA*:qS ǸٗMGۨ)X"@5PUυ' q>.͡NIDwAX8<(*Ed.dg 3Sca0"A;ph:+L_*߱>sJ~ Ő/)7xJa^0 e#y5+K2N'I ๰tdԵ: )97+ fDŽIkl$Jt#2(toXph- e%ͬkmbQR<( VAsrPe&T* [+X |Qz@1H]_0ҝQOD,~Ln4c,,hj$SϮ1Rgo)2@V1g̜ge߽O I̽VCa١sU_m1*jb`ǴDDKj~\Ib ;.Pܔ Te`|pTP68"5rqcHzw.4Q B9P+c2;';X98J+~fR jI/#X]ەW?!`B/sRS8̢4A߬Ц/"TϤGJ4 H m6z_=[ii]}Tdy_㐖Q z~e*[4,:>AVt'J4Z@N0TuxjM9{PSkٙڋlㆾFQZl6_םGz¨ `,awM!\KbbuPk B%PZA%*{LOpg^Y:m).+Tz. #B=G=fN؋QhZĎG <ʭ=6ycnIB&Ժ{]UGpoH fLzx@ aјM1ax)s7[1vA{ŭxI̤b1R@Qa/) ʄT .<qi#0H4Vi8 QkC Wuu>LŃ՝Tvxdm"`v" vѰ#&Ósnf~*(>\R/0%ҷ˃X UGe1-YnD(Ȅ')y}3` L7[c(5}Ȝ\l4ޙ`RU/=mP)a0"b@EӭiMKBX=?&M;M+}vSn(ѝ_^vw-Ӄ91`C5ndU(`F]$4dynpK(/(d,. V4HE+Y4U3G={}=Mط'6 = TaJ.BNm˹q^]7?o5f3 v%QҐǟv)QWB#hY.82[[S"1ƗL!{X^| 7:1 co0dJ~ݔf86S` 8kDWr] @1h_*,\!,"5B.>d"!y$uTUQiJS@C6Ԉ$2'?7BvQ24بF}: L@&:8,= cXX ^T#Ѹ0)}@*'P]   ѻ xE1%(3^XXhGA\,ZAh_z`ME7Rÿl¨ wO5l#.J~fj0H*eMAސV~lxtV,P Am ,=AA@ABAE ?P#^/LBtѓD<ѪI`q6*  A1Fsw~\FӋSe;΃h (”0'C@ {!,b!p {N1]X` هEM T2=3XY_2AYĂSL*oEֺ["04v(t, ~= X-|7^QPTY+k9\|yb}>g;+! bjTUbjJ~z l0V_JQ#Cꅘ(LU(71߾&fg$g^FaČ(ALDU̫ O~mMCFOTW(|U![<4ӃЍ5* TY5 0| Br}jehJ %H #D[Ѩ ci?g-uy렺B1!&QI"DUB``cQ{OAd_in%4ǘ+#c:oJCzL1svcv zºVb([ne|vt~JrdwQKuH:J$ī:jZd|HSP1~~SD, qӃ,Y-eMO\C?,}xVAS P;=|fiBuQ^zVg{MPs<%rf8u=mF;=FAN-:(E{!*U jv`Ʌqr R.l.q9HI/Q}E=:8rLmѼݭ֒e;G0 dHD F[0n`JD@P$  AC eЁa4K"wJl\vD >Mڍ'KI@ug6l=)Fã qOi鈤J#8mbI", ∋0# " >e@ Щnا[{N$%F|N8*E&1a4] .cxVFcb Ua9^ Q`fJD:yTIt٢ ccU^XRPaADX d)H *ad'HtǞgO?xs^=!s|gEjL!_P>P*5!Tؑ "D@;"q>#Ct0(> NЃcX&gxnh)S[Ip}=` `2LSHj_#x*5["3 < Йl(*7y]\7qn7јn.AA>PM3];C@@v)CZRI Sx-]m'wf'QJ62F3xPs|ە8>Z$^QnXdIDO:̐jk4 h)hb$v  #"TOD5tb)M:~g[*%$MEO)rkqƃW2?k׈%*LM&JxwXǨqxNs?&LIf^۶4fLcudٸ؛OY}diq]_ PwJP Hx n6Z*ݽvTCZX#+XvL< @b)Bx0̫?:5IlCkK잸#KWwU:H9y{&ruT;uj5M=pÉ' iVcFDOFpdH ݻ+3 (Cx*+_$BTA;lBb1p,Fu],cWGJH4$?.vZʈy|:zs? ~rS9iѾ r1Ɲ7~5 v9o:PN2Q@ XREPJd%Fp98K6= e^D vRRfZA ׍Dixe)Q^c{fKdzm2vgJ!s4n~jI'?r}CϷݹo٩>!>ߌFC@usݡ Q|/kOH)\,j80ROggSY﹦0$0#! &#"#)$&$$! !&&###$$$*%'$u^^3h >7X?(b+)K0ysm=?Y<cr[`q.7U{lic} eAg|Xw/Ԯԑ:rSJJ0)D[>ݒh| ;sMNtL1]^e88133qK1~Y5ȴ!h @MMS$P&LG>-ӌ߄{`QW[2k$7‵& ,tԩc<AE.X\Dދ{Fϓe$I6EN+)>0p鳒 56׻U~Sǿۍ?^qVJVm~B| %3+B)Cׯch?eJ< p aEhB]3ǬF!4!VfP}:gH5:A@z *y-9A3splbY (%OJU$7q݈T^,'Tҝ7]Y%PWVDUA+ڏg ;gddMQUg1TDY7(%iIoO汕=W1!) 45F;{t˱\dJIqׁ=4h0F>|r>|4uq՘;4Tȥx2V0PcuC LKU]=/qƃ? 5\PAU&M`QGaM7(:R@T^̈SHI^>fl*\`N)+ȳɽefL.6? ܢϡ_j]I!v:C R`[A2{nz (ALkYjȿWtx} !f4n@d>Mpa.6 ɜ^i fPZtUO`6Фx4)MhaPP&bV;'g~Q* ?~.l/@Z$6 }mIPO#p=-@nI5oAWNإy7"|J )k^z[CDudWwađrV?9̓etw,s47Jc^~}ۛ^i*I{rGC}aU" $3@ɒzZUXٕ_ցp a4fV"~/}۹ZPl T[kZ~놥CZc'e([sn -DU}Ө1폇˾H!Sf=˕C4QӪvG@*-"dLWNS s,N=h:0,1TSg l*iP&d`NpI%^DU}Y#oC0CV1[c |ITWjԦh.H41ٵǩPk:qk)\Y\ Vn([ 6~G;O f;ʯT]t OMI8Z6eF]5L5fp7kڛrf+(N |g_ :[7y>Ubry>Xz` I{;u#4jC(VNOEDd6~vΘ]&g M[F$Jiz+]J0pvbg F6fa~;N2 YtX~#Du#@*_ 'DejgWz؝Ǜؚ_k[kMB_yEơ'nSj(d}%Q]Kt 8RAv; fe&#!"v/˶d-NbuTFں*(׊ qbѫ.XN6,xsug:Bb- @ڰr= Wd 7Ѐ18d1-p@cF(FG\ >9_:@WKMlc9aKs<'dMl?Lu4\bXҎ){Nc 5zQ?Dctq" A08=+-6H-k?p {jt@ R!TeX)]0͋T|kmS}.OCuơ+8{l. :Q<3"҃ Qx.<FYdKq \YQVk..Vat%2qgKC) >?Je]n~nӐ@TRII0M+Iw֘h鳣pEw(>,} M}J lh:Y2\]@  h.D DVdhZhTD!07*!OggS@sY﹦0.Pu- ## %'%" !!#(%! !"!&#&DY\銋i: {!, ($,#OՕfKnk1UJH4U).~4 "mRτavBTWJ||mMޚ_) P blD{D7*?R81@ n(9J]UD #p\+Rsx,$St W}\d>xk>.vU) ŨG8[GT9&vY?o丆 8g}=:oA.omp2 >>J몐(}U3"M b]1PEUՈ_ g$tB)+r|!:= / j!zs%dJ!kk 蕆 ];f8+E=J@*B$8=1:ca94YE >c RA,g^ZL v͵(e 'EEP9!%r!xq'DCR+"[$݃HF.@7@@]C(2"HR ߎ66`DEBS@] sN`r2 LEBkRBK[rHٟHYmc"'1ǻ[7q2kRK׼4͘ۑ9S}4ڡՄ_z)`ٽ5@2p  k-"0`9`]-4F <2YX94 ! dY^[x35}hWN)SoK՛bT?8z'KqCI$]LQ h Og^l3esUU[ALW) 67y4WJ3.ӓhD;mq]?фTYtC0t>dʴ4=pS]l.źDWCV[{*7^<ƗƩY~N9 wck g8qq~#ٮ9ŎJ?=TBXF r棫OcG#JdU]paFR =i_lm:*Ve.&+-)km-6ȏ@hգ|Mj*c⿰Fh h ~ C`fIAr,ĭVwʽMmv~%Ut0vsl-u[ECPhWR@@bIahg2$$?2D_s\+:0=cLR޵*(gO7}1xdRP|r~gC%^Ԑ&_-DbU:m6ޜcED_45C "ב㳕]f]C_T}t>ĸ{cT>^nm~DOhG"ĂۥkVhh[gŔgl\Cz|r} k}}3tЪͼ5=Ӧ xjK(Gqz&n$DR4k"/iѩ8 |.^iϱُX"v\Bde,gP3ݍgMPv3qd]V)LMf&pqU%䙫vu;}4:к̭!TdcJx#$ c$ٜ# ℛ,yɗVymf,2n(ΩJ.k$}pO^CUbꐔnk76C|=cbr hؾkɈώ>ĘF快t.0j$]-WP*ujG7J!J lދ &c1\$Ӿ4MܬILYNXttjWDכA{qv' iuv3ntSpV ~hדy֘qq'dƶ]&z68])R҈r˕ zQ7(~CbOGH@K]W;G/ks=x?D?iaz}e F-,a٥w$K~N {tdH&ZL(PQCPӳVf\xZ__oeVWHQqSN;Y/7Xl5k 8ҙ +6zx_!4@g.0/Vfo1k慺l{vL2RG\ j,K۩.?.J1P@] k m ;Է;؈XadmnFQ@Toޮ#H{N^ n~-aE!#%X 'r$mԡQ|eOݛx4{Jmox4dkQXA|]ǘZw/Cexs7szsm;lyYtog^K,R2D%2 Bӊqa5OggS@Y﹦0+#!! #+%&tz|$"$"$'$'{^n:̤CcFKԁ3iD91a>;OјA[x?_E IuHJ"-*sѶgِ0qQAp՜0f6L[f2э%;[(;+_LN1 MvÌ Ҋ+N*&LĤoɖ0b8Fġ->sNƐPH|p҄oSxԀj8МQ9v8HP4qC5ks -wѦHJĺ@BLuT)K&{ǎjP (bO 3K0Fwh$Pq @á_]֦i dJR~|*LAm(M߃FXa QqY\BLKwŋ2oVK.A&^va6w,)c|,5p¦r9Uw.XP[TǾQ8ZɭVE+Pg-C8aHMJ3+dRB={`R,G-8to7 .Uk3$5ε0%" |+ڗjJQ9. Kd> moJЩ|>p,,.^tr_5y /zL+u_ G,*U(ӹ=$6M-u{*IͅmGS\x"4-6ӳxzk(uR 1)Mf-f*vTϒ3t; _^xrqL o-cG; 3WWͮǺ|ꋕX'ֱ8C)CQks25W'vMDfVÐC9?cz!fV۩a8Xy$wPm]kU~( Mt}XI TYBWYlOch=\J{:K?LY(tDgnG'* W,\5 7Cz\[iK@+k2Gxp7woZ^5UdaY Oąԙy7el̦/Plei7{ѐI5GްҗUuڛAG`0 MX |XT]wF\3|ċHi12Ajz":Jiujen^O^_kp*g ;ڗJn܁ %#A JbG nX9.6Zp|c: GbHRnP~AAQP*>AP4Ft~<1 索+UĴ`Sv҉-S;ޔ5^L~+cm8g(R AѺd%c@G5 R'S*.DV@y^ދ2rU BsE *( &ZweӧHMW83DWP  @$dPQ 7r">L.USGɗMNd xŒidc>u=R/~v=S|f> ^ MHIB=@= ȪrȠ=DDDL&Q:Ǥ6FՃ4iZ0[O=Cǽ4܌q4:|a_C%#F#VAdmDYD @ VdaEd}pj,>,a՘&]7z֙JZMuU^D91  ԝ' 1NXdISMDe"ކ2yP @2UIjJ 7%tS(1˶R'U? l}S4O+n}Daȟ !)Dvzq`I-1uItar)C"Rv8Q^VZ:z4[UpP_#c!{9 ^1~dXɥ`(n A$.T~\]|J PpZ*SM$2rΎe$|TGц=[lO#kN#@fE_zY~kĨƠm F;RA t@&j p xMGiEԨיLFXY^/& AԇqLScUq n҆݊&qo>FI|ATO*t?6sofsIDդYG+t=T(^f';bT)<0 0F{K)t{(, \o?txk&S7Q=FD$)l?|M ؚ5hM(!lss~W2d]H~E ҦkG8F27lc"bQ EI.4c!q]ϞX[f>D ~89&@cqE!8K'8GBJ G#l۱\OJjvkY~0o &HjAcGL&\u8E-i|M{5v3au ld ެ.R^"J3w*:ϐDŽh7_NvԲwbmkӳ1u1(Ơ `R D @TLBKϠq"PaBq*!\xVm'+t.V,:1!r18oD:ݟM3.V բN0{\*_|J/h1!n,0A5 Y<&TlBh\+wO7sUsaRp8R-kgu m"ݘ%d/rbqC"8PU\xF;Xp!!T  ~#8[&tG-N=S(a]+acd@lxgKӟ{qq哝GoѰH*8"\1~\vw# AGK[Ǜ,FDr *evB@ ^Ter8vv 9ЦyDȫa.GcG ]i *"x;9 -6P7"8]]$  簯lІU\`X(v ,Ё]xd~_,`R W?U" `}ڇ5cXKy^@ƍ@*@(rJUB@$*d[hjVR߸,XAѥP] Ԁڗ2d_WX LF3yyX]I6#@vui>=~~:2S7W HwM0PˇD^aK@Vm$`'э*K%ZDy}WHÐZ`DWyGOaŝ{+ g{'Gupcvp߽QQ4 5c3+\{| %h ?(V67n.BtAD$PInOggS@=Z﹦0fo5"!! "$%#!$"# "*'| !!!!!&$%" !"!&%LS є6*1Iɮe?:Llk|ׇ+R"[|0g\ ɭJ#͚VQ)F~nC@Rֶf"qo8+ە»^دdtr%[oRy15PG)*4[ kH_RnQז.6UxK4 .VqI'z^L]M%˞c! TЌ^H` *}tkɆ@ G-XP]r]wQ$Rtm(1f3h#vI#m#9ǥop\_cT\P" ^P{Ò X  g$3iׅzse<^$&Hf[m*ݸ'BO-:3qqi\+EQ3iÇ"uǧ8֍YJߟiL6dU橱d\Lj0^p,aэn h)J֐uN۱ddsn[w)V>߬) X|}}S%!IձqXקȝ*Tqyf 3 u]%"KMp~ zɞV!t ŻMVV_u'/6 Gd?~~l&08c  x-ȸjVw<m~L@L=СmՇvB;|r=jZ6=I n1{,nп^`dtRE'h!c:gO/pJU'@-+OGOފ -跋O)\QRB@h׈!jIݠ }@:gy*@X:VP8-%tD4ƽii#`)}g4=H10#b]W"&W"{وU^^F˥{J~XN?_Hz[IW$w 0٠Zѯib4\i) AXo(zquN!g5hj6{E訂-4sz.,ttIaϥ;B3Jpd1kP0H)ԵP `p .7TK+!|i&}iM8VܭsxcaRӋ$SbY?qۋJ^>-NoV YTa( * V@qA$3.|.c# myfSpCGjTd\K6c1Fz>vם%slP3xHvѱp.`_hMx<1tS}+!$(3Huݓ%ed Xh\>  K! \aAXk0\?sp|[(-DW Bx4gȻ4̾륪$U*&*=<_ꋫ{a\Q"LUéhLʋӃMOvҠx_?uTC \WՕmnx[>q-W_L]}G~iOqk AĘ{N }N!7-b2 &'[>yN%L4]_O FD_=X!q` `(V .< k= 0"2'AB!U)g`E dE^bl )* v6-70\4UxJi^v9=ߨPqt %Y 8,A;b=9w'C R: }` pt !nV+Aʂ7\kZ0ȌeZzs%QK`rJ_vG`UO^!)LE XbH5N (  P{LD  E`Y`KEd_peZ'k_j/Ǜ# dYU6<>{x}?C!b8TWܠ se=,U 䎛*ð"DUëihY<_;^9?xC s \W܏+hnW\S%n^ 1d]jAh&?gxp{_ɝ뼈a1dkP\]aؕ ʏI@2{ToE*6!M Kn:Yl_ ëS1{l[TttN/]KsPtcknL$YJCg7{F&anoaOX& 9{;tʨR4:OSg}ϕWo=w)6, ƦVG)ucUe#|jҸbT 0a0!t\E*ESS}}:b%LY7 2B hauZTM_ .uFDG:soYZm<rԶ '{/p `@U!I FD1 \BX0DC,/$=H;>A bc$p"8 %NC ^7'JqlMk~FѝoFѻ2ftBBH^#J0 Fhc>(8Zp5 +ryԈ$h"%A O ϮJN!7J諷~|n%1QHpU7 \.xQ+¾)s!8C&Jԕ\5 *nt5O5݉bET) |"cAT[B-WL< fp5n2.X+J#&LW+irXqV}f(UWd[œ-_w Av}kR(qeDWUavN~w5o#N%)ɍBTY<Y*T];翚[xYT TU :] ~kO_f<=mj.Q\K\Y ~~c#g.k:Iq2la,o'h/G݌y{8Վ|e@UF);fn̎Y,LƔwZvPM Z?JYkGTFF"p*Yi9ibrk KYE,6e0- !uLyl<  AeE}HYq, ",,X҂DB-^*|@hPzI&'L hkǪc83±iס2Fc)!3VyA6D( 7 0m0pBi  kDW&@cS␨$P\UꊃwCe<BUYELU|D2@ QmmcmXiSBdCycI?v"k;v%͉Sm !"Qu #^ FVb-g(gia{;FWhma8پ |B "F,\Fz "U ܻ߻qݛ¾ǝ^W8t)a:PZnt7ց 3y IC T5$~DE|>$f< `|,*% Wb@vsMGM=n|%Áo..֛])谋JYjℌ03d\hr,_IêNsJjs|6b~ IFvt*p;Q{1O,QBe|[^;nFzu_<Z咀|LW!gbEQ`|1N 7꼦Rz'i4UƁMjIeN>S3ǨycCZqup8U՞=ZHYza'5k 嶻Ǐ[*gc:Oc5{K\/ƒt}Ax( +oBzvH֤9ttmj6͟ 47cǔWP!n(ՐWpݒR䮍k.dSOxwO?R$m?5#7g(j[(FAXQ3j=@3D#^ к3V.O-LoͼΌiŽcE|6֨|2@$YaˎcM< lq!2Lk|q}qځ:̬^{Yicf]~tm+JKjiVU7R46Ń՝Ad7J?P· -?fY*'efJhx7k ~d{?~fBM4$*? '#N#cqbxkk Jj7%5So4ӵג%P.nEOZ?OggS [﹦0h&'$&>LLF'!KXeL.\/S7uR񔫋Tfq,/|v R7~G,2'kmu~k>]ӽ,+"yyi̇ 1DtތyQH6x:_ܚAnz3c,L1\QXXQc2xRԴ@T;NDL_ ?Xelſ "zOug!dhR]R6*(YB Al0ºgӼH‘RHeKm^') 4ٶ ?gۛb3fV!^ACe~|tJ< EU|XPI^@n9G 3I‹yI_і4ss?9cKt~|s52OS)X| f#v,5mN'#Pc,~֘4K>Mo >NNjnK̯8b߈< *t L=zT%G`g Ft0Ny蹀GLm)]JE`uÞL fe3dy;_;:v*L0(P YM5B8X) cw^6* j zv0Bq?E/ ^[&J( }e xA0~eu+MikNFZ} E?*~v_V`cn ^ !l$0)_|X |֘5s}t&5qDt+_HLf7'_K-/\@bvL=qm@GF`Ј櫩پIH.Sֽr8~\UCWhڳͬ6@Q1F6&X;r1Vrgn/IvFi" R>>YB S@k U~;fBBr#@ҘC@G@G8ӧ0ب낥Td÷Tѹ#ߪ^ @Yn\t\5 X](G @bOr/|Gs L%;^?x@6RB.+6Tnvڧ8f ,xH#c 6GXIU>pC7t/lhd|֛ek2 -#`ROժ1U`N:xZ%ղRh[֝zTQh%JXV&0F;(e(@dR.Q-ycjx8zHWFR.Tc|J3S2OҼg #E35Y$1NjP°V 6$M؂qpxrnZ+iPȃN **,v|Cƣ|@/m'[]5J20+ʧ%='k+S+D, Ee4byV5 ? Y% z- tIA ;$|6lȾpCb A%q\ p#|ֲBIA{6,' TZSie BI()5d:}=`Ftc%fGvn鼧{|(P4Zx93B -z J pd6 _" V)$OX%Q pYT5r[6:A"LNWALNԣț4fZTxY 3Y)&{:6KH8) ˺}eԽTQ~~&P7XO)-"J t$QCeq#"~NA*q"~|N4,ޤ9&: M1;jaڄEцDh7],-& *@{qeHMeD\ 3S *Ԭ.!`ޜ^LӳK?7PwjhfX#R LGQtjt) NHE04^`{Lr; fK 3P55.XLDԀ!+>܉ʠE5\.BuMF|ț0hh %C"TLۜ?tYI3!b)#ۿ5QٜHi YQʓuTB.ҘJ,%E\Bp~%|HDIGX.B$>|N*l 7LeeO`"LCdX&}E|j0WO4bakĢ|3拧.fC̟^DĪh!Pɿ_(U3hm;rQmH ʒ-$3p8n T\\N}ĭE:=-KC#\?Q^wf9qHd<ˋ]]h d^(Q(ͤ8ʆGY(qCSt"9%a($ VVOggS@t[﹦0}0 !" &$!!$!!$)&# #!""&%$>msAbq3@>@υC2 yb6Nk$9ԗsNlyn4Q"VXI`LD 1*\-jagPȑB,,X"ebgt !,X|xԵH1Sq9RLDV!{像 =~ ʸ@ht* (mV,@jq TcH\V|w^ՊB F$.D0ֲm-T&+z:A cw.iJ :ŏ#7ql1"&ÌElL˦a;@*2Hw-@A&7sX "-^LU[jg5_PF{Vr G.h (@`S xt׶ A;P|`."vxTaը@77b@ˬ 2`߇'Mv*H ʅ?P55zOB {! $я9Uʜ'-+N+ +a`☽.D\)r+UAjx~e1}bEG$t64R)␬^r4ޘr:@܃\.\r·0%PPT2*++'/KπN3PY jnLWKջ;@v'1~+Ml Y.xT=9-(41hpߍjfr{,ٽ|4an#4QRdGP'rh5ZS5y~7؞&*sI˒ՒGoAwX︬ΓOxLq""Q,*hk)ؼljo' %O -L_qnu^_Y wʄ ,.i*^+\eX 6ҊR)ŵIa`-T g`%1hqc!;]^nd< `NvUHS;:6>xc9NJȬ eW " _zv.VVzۧ{ziɥ #D !a vW^}}T@ Cb/iNF"JNh7n~XOU[{=n;hG +c.fFa @os`a Y[{HlRu ~}V(FVe |+C8"uI(E/ՕОbM+k""Bmspj+ǧ< ĸiƛy*{-%@W "`- ZT@e ˥} u.!F"AԬTWt ς` dY=T^yϥXG %߉?Z-+ m]{"wQj DSWU"GWV-~^6W T ,QKbѴ3@sߏ=/Z6gȧxߩ]TDtm!9,I#r weK~B\ u δǓO~̯~Hnd5RWISLdW&*V{Ú]IR&ͩC'd]uko>]; YWET܄1b&L2QBMU_ihƴQf\qOGk8>T< ~”ts/WZuT&v 1ujD/Nz)v) Y)Y w __MφZ$pW Lޅr.5#m7 \.݉r)#:L1zd!d'"$bL gt^&?jAR!2L4H}ొX%4n9RaU1Cޜ.~)FzZ(#nz{}@:Hy&0"A RP&KI|(d%}Wi,hhZb݆,THΠ9b//(s#\[.!T]@.Ӹ8 ' w#(cqzݹjOp4IgN|`_'g4vQT/)+nG*6 _Tux/mg: / MhDDY)+Hs!`}\ wEqsd,+j ˫f;{X録G $Q㯬!_RnMvp$PV,O{U \}RN췫5F3ZQ TWa\u՜O8 O;t-S">p%DYAhkٽxP$r_+) I!D۝ռaXqh_`6*fYfB8!L[k О<_mw?Ļ/}\)8vr9o޸T_-:vKc;ϡq [{n+.ѨvzeaP!r ^íqu&('SͅVAYWHC| p  JB\;n&NKn"* *?Y$(~\ Sٿ}-t_O,bD .ԚJtkM29@U nBɶ!|ݗ> SSI2N 0pkr =]G@TnEfD(\$^-!l$8!:Zq5ZJ VE) ?QJ'`%6*p+y7=qWߐHp >۹`0d Ҳ+cMLW8bD>j>ȧo9**krh RVÑND#p*bjS/⋏]쬘FWrɦ?զ)VPpg8}U)ac(D*ޒg A:Fʹb@ ~6J>`Ёq7?p! ոH1 F"jY4z.c 1OggS[﹦0~{G"""!!)&&'"" #)&%&)!*&)%)&#!#'$)!!"!!!))w#"#$''$'"#"% &'%DDj~~}'SO?Jnj Tն?\s_k'D\Ƶjg9zd9!RT=:NOLՠcm^6@Mœ]5#51L>櫺qϼd{͜DvQHεթ Ӵ2rΒB^N:2S{SK>U\Y9j>'ƶN7-it1dMUd_KP=>W]:ܰ9d#?D_ C/m 9kOM}Tv}ۘx- 4eLFaL<wu{\5ˈ.{ITY,V(^פ hrbZ&DYtl(`0qR:m+}!d_Ry[,XWZ'"CIR*\]B_FTI[ TvGj|a[X 5߰wKHjDa܋{aOtc9ƋvpC Y\8 NvDSCYW JMEFHȱ_~~R|].  {utMkoogNy5Ldcɤ V$ذyKrT}hvoqJT_|ӹq4xRN}~1l[?@Eub\Ij$l{kLNd6r!Z /k:TОl>lLۖ].98b#4EK*dm <$ 'vO|演нOl.\s6=op=Z6ܳAks ͛Xlas9w9~^۹\YEUj}#x0jkIkڜwnD<6$|ҧT-zZd>qqk6LD6$AҼ$4rxC>~/:d6lHcZ_>%0@-keT>l/:@//S$7%D \{yxf"nb D$[k-xYc32Szug?fsYx[&ɕ#r_D065}gu{|uX?%WjLd? "S~>:G"D(uXasχ9pT}U>5*l=cwv(XiislW a!q͑4FmiekQS}/7+ȟX#ˑVS@Y$1"u0JK3XzcQR|$DП_O#e56[p,ŕ`(;wDdw֏ ݦ,7C_b mo ΐC k$ q{ݺ4#,(dY5T>d'|I8|$B"$"V%NW%\俟:yhzF0DR}Ysa۠eiJq Ӣ(f,0}rt ! d07䭙g6=:$+{KٷV?l~Ӧͪ E+D? ZǐX.>a-\b~#!!{F2 '>5Av+y*+|C]} <`y/j{JG p56vT8Gͩrt35ᘅ.ւ`c]i=j[n \!3 _ f,t'p7~I8+Qh ."clbZ[uz&0EXh4Z"J ۭPYox*/9a]Ϧӡ\5)PGua +p-t@fpt/ . q-cTW=T?Dd]`ͳʏT2zYTW}SU\~j}i/922pbXd[ 6G;W[|*Dx F2DUT?|i]$ypUdIJ_I1TWxyz#8w2!#\WXUm 9sDJ6d,\YH|tBhW{ sn֣~7]#vDa &AS];9pa<$Id/e{ fO޶~TD%2[Ene)~9ut-Mg7%詡3iH"1eL/7Zy6>g'/1vM%|@l/t/;^_oL|wNY~/o_cDav쓲H}Njl kr^S# TdzOIQ χlMU-OIn,V1|4 c16"aR,pRgJK`LԢ$K3fϾND)?ӐFl.O*n %y:z[e[zec%=LUIH( 0l^崌2w 2)޵)HSajB? r8aOE$t  ;Tj)Dpu4WQ!2LgpA9MNm2tz H'#@%VT$ݠ#cqkq+Cyui'`0LqEL>{/1OIv\w^?O#W-^%c3X'T2'%\m&SSӓ{s/w*^,WVRrswR[ÂwOzSoo+oÕdaE♷gW@~26:%׫)^?~䯎Edu?.-ʞO:]];סsXO:i~0 <*xϝWI6&_|)KR֠IiձbMMnGCOMnXEa T!YZ\ʪfArLZBZ><t@zRJp*JF/;NiLƒ v[zE6<\ s IH?n%~)(îvQ`h Vn* {_F셳hYo<n/.tcbO%{0U+Xp|Hӝ r3^(+UD^tZ "?tJPW!Kjpxkzq̰za:WgT͇\ "\),)Eɕ)?$#u})0Mf́`14g6OSSpg!V|֬>_o$ilX(owpltЏo: ޹FkYֻ8U#܅4z3;pk. \.}âu\ 4YZr+"##Farmw[Wr^Y(vMi1ˆ 7PbpA)ሽzS#o/lMW+NXV7~k[?=Ć!!L խw+ R-|NυiThR*D [ؑ.'d=݅~quw5VrƧɌC0k (|Ss̐$l;@o?G9jɴZ>|/4߅M4d;RX ½R>## ެ  >Kq(>"" G?Wiqa5POM7 ij gP1x 2Uo2ji$9cFetx3~++c?#=eHè)SC-s1H.n^~]Zi*CTE-`ͷ|QӬ<*ȟ [sae#UCѯ/`-$G/q)vao)Q F|_{9F2MSmݕxN/:e#QdJۆ![X6pMEX2o½E,}b@5 upiJ4) \^5[ǾL0\0I{䬰mň1DeWZ,WqHrzhH4]3^3 J`,R$5`ыd]Uj)_ޚ7°su<a?{?+RL}oRj i\A/̕WM8? NP*ܯ+4 *(nId{({ٗzo9E[u1E]/:Of^xbX1 zuxXre~<(_^689 I6_SF=vrE%׮_oI# X> e&YֆGvo8íNW75MVP-oW``aM:- n(QN c^va \1tfU408|D :ϰ ӽ\3*;UgݗLAv{Pc*6Nrʨ4i:pV::7oxfyw௱{-}߯lQ;֊aŬ4)b*4ދcr^ !Dx~!oAg?؅;OR7BȊ[C|Om$$ݞ}ϑֆbFojhHM9V(ݚFO>?fqwn5﯑͌1qTok=?q6-fZi= EGtL^;`dǗՒnEβR\ɟ>A-rꌁT[} scF{FA9D1]4adѝ9^fv)^AFfy AY`o`;[aͦni H*F=%VkQ@aviB(n?.XIOv1$"їN߫~ظ:IcV֡ը6w]Gnsй+nϻϾƛ^f&X"hNeq%}Sv̉8FѶ(7T \uK5eUw5w.W0pXB,XꣁN%Q1WP^o~?ܨ"H :"χ>g{T㋽BDY}&%qrXτ9Zgm+KjLk=&2(nZ)tY%ɪlg<ܱYd4>(PZtck糩5O&70dK 8811$q^oߔ&/o@Yo={9'_|c=^5UGkGHr{ uJd[[.&AGA;_[f!vʢ!4+sXV\iɛ=Yt'[YޖcV?+ :>*\/mGp4M:5]`'KydA9SD=Fk~n6| V*w156- LJ|Z A |@܁WW,hRzji ߬w+{0&h#y?7A8G}Dk v&548ƹ|ͧXCq-#2 do! bȰ#;.t ὂNtM=Pt}|hd2?iº/Z?z"9Ą4۪w2ή ﻫ6(ȇ='WiR'j@Ach.TV|}:uC EezeCENlYNl^OZ wTly ^@m4S×)TW~~ֱۙKw{O OplchVO͑R&k"M\"u=u|!v>(ql|$'2hXc*32LLO4QOiMv,|8]&Av\C'tNszKNL@!ܠ01~7NE7< P,w d nΑUlr֦/7h l봒!G,4R19׻݇R*5OnUaprP5k7@$R0hLh(#DXD>\,x(g*+tGa=X^,J6G)bӉ2CrTovȎΧ+8DzG~HP,* IB%PBOggS@\﹦0^"yw{t"!#! "#%&ã[0";oqa\hU႒?jv#XM\irq)%bhU zT)t[AcP9().J_-V\\@ʄʠrA1`!><^aS;wԚ>XS^89/("E@_HǏ32n0j{J7܌j6aZ|:DґyF-].?# $(P|b &~, s aA9-YAy۶ĕS|Te|fڒbUŎV4o'+Ll$D'?.,nS-@ǩ "X! 60H`@Ųc!bp̮B?CԼft5 -ؤ$*HXd@5oW)o\,C 6ʊc! PZ*aNX *;Fp)@F! $ I!@e@"\D~|Ƿ T֎1:QxsAQ\0+#x~rRIʎZqogOfxqQT*tɖr@vDt7 BAk^<b( Q|^ē.lga ܞ!t_M ֙H[VrPcTqLƸCZ1$2nX*}/0A4]}\u,uCF"Kbٽ 9~|q ּtK4Na+;r{psz8s>^w~(C5"`K 248C86 NdBod" Up#%H Ž>T(D^LnW+ e Prc5K`7JdہTxesQQ-'2d/.[EKE1DJ?HiW} &@ 40vԙ5zVt Qh {0XJ+^,A;Qa>öX,¾tU-mcoټՖ{.(DC= nIfRAH\ B8]~zS7pE7+7Ir SjDon{.ik˂6lmR4W1v>*=8.# @S5焒neKto߉p(+U ha@27 ;k qO;40_v$-砡6sT o: T+%pg fdHqt6HszN_+Y33hA|,P457< ^9>^5 5<%}WT =C͓x%_Tv.| UԆ0#ID0|a Kd%DAO!` < UU'5_wocj`HEDaҧ `4[ @9Շ~7Y"b::FTFeY3q~r?Jyֵ!eZDWajOr8_tW0i1]ӿ%4UO9мxx7zp^"LY| _~KNߍܼ2]gsLU8jU0_bA]KSz 9f*E$\WFd?B?juod`YH\YJIM#"ƒqS847}mبmx.\]:WH]$؃K/shFUDZ6Fk[ҩnF"`h%ݲ@xVG5{!ҩk'U{I$rf1W]WfvCm$a&>B)/@ԍISsOF?fMeXU:slK.Ìk'lhqn?l!(>n#c9W,|r8M^nE7`i~/aQ0<,"i\,cr10߆m msH+Rz7_Oe?3㮴v9Ɉg݆ߵ]]xVD򃰔=גչP&**u9R;5A&|fs:*.8zSwch?ULqjT uimΦĒ^̸_SG?<J7Bج+n=)ZWveƋfc1nnII1}u3aG4ƴ]4n\N#C (-gt@`IJ?N9ek»|5GBoIMn .GN3JIe8{1v'h6/ݔ#HX^wM?RYȖEnRtRRAVvvC)dZ~eN\ tJsȵkavL>â&;{xN6K*GjM  V) rέJ1bkeI1ߥzGl|͍ oڙ<-BHk޵[6CWKAMojġE=|z6HZE (ѳף#{Z䜆,2&%Eb jGQ>Tm8һ:x\{]z:Nim#o嵎.KY'_8C:UpCʑ V= 4պ .YӆI0k*Xq}<JՋz‚}ww=woiZ3DYc" \ԍ=E9 琑*rBb91$~g״=[F_PmE\)mr{LzIw0|DY<`ܵkGEsP?e> ^uB@7ZSVp=D\+ XR?{CzBsX3xz~3o>+p)±>ٰ`5QJ5d#^c!URӧՏY\>Q-ֽa'\("zF`p#zcDNo ҺDxXc2]\١#i,bJTeJ7_q߶~զ *ltH[)ra M-/g{Ax=lxrϚﶦmW1[ IOQICwj-co1+1t"Lm㰖L'n;z3dګc Rmv@9z8"{p2HgA .S,ƻIh Dp eЇ@9ؓ.A?wBu[P1z$*Feө, qCC€c,ڨ\u4! 84Ɔ?T#D (`A4鋁p5R* K}^$`PeYArAqAY%*}#sqlqh #]T PP<(טe e%]*D V\{>QQ&%H?B LgbM_Z++ N?%6M#˙˝zM~6H7 6b-`XEAܖ)E"`G%PbXy\Z,TU@+揭/rmڔo{ Z TWm 6guxspMOꈟZ믗@}\W@pϧlyXb ]gӆ5¼$pd'_Lb/EM2"4WVÃ8^BՎLl0jM\S\ʈ</ 3{>ÒEǰR5TWabu$T/B B*F35b8d[ 7wc `, rM&:gT[BSvvf\җݼ ?kt0ӽc=w+ Zg&P#G:_t`}µ)8ɕjˠ{4GR9']4>nnAt^ۇ&q}2M*0@ ;Uv~6d[zPLFq-qE8@ ^-B(E }\ ѾJpY(_-sqg0tDPrO!"ֳ,P4LEnx:8r~#eGHuhW~8# cR ;FB psɑ<7e8Lrr$T Z鑌_'e ɷ/BMP@qrX ((| w1BÊd@xADWu`EpAu.EicRPGn+̓ko?Ӎ&K sE4M1LUЩ HMաQ[N{oZ\ˍ%\UTh5}t48ǦaIY/)ä \_ חȘ6Ѳ c@7$SŦFkofeE1vD'"jZyq #5?{(EUʿbli}])41v=<76|xٺvMxi6s@ SsbB;1veߎ5Ws Vu|)8>r[PX70,X=7p^F.%I?F@"7SO8XXK.\CV+(KHM͡٧׊ &"/ 9S>LF.KF4`QB@#n~IU`'M4Ps2jID+D$ #(` >JGc(._'i%}-гDl *R!4SD/ٰysf&bA0R36Mm CHX8DDz2F%Pn@`*xIK>m',*D`Y\v1a>cs'ot 4͂YF.#rzm?_p{ny hL`h<4 -%@N^'hE7XdɑeC6 %`q9xn .!fbg"li570aCV i0:5e]գSDDk?B7coY&{44A@QMЅP5C9ŀCGq+l/ P"D`Ч2apTrp#~N5F?X }.( {Ce 4tǪQ2H|"lƽ١yKEGDk" %ɪqPm\@ h$za&hq@ Q肶V *\.%F}YB!XV/)u%9ZjBL?̤GS_$tћ^~|76 #A† NU:@ JT𔨸 4f`r5V\) "% $6% XB7~Pb&O ^U[EˤdR8$D(STbclqcBl;=m:hTI 7 I'@| ? vz$$Zhe0"[N&T fk}q$| G!7|y6KK(WLO1J1֣=}s wBN dA n. AJA5G&npI- O>ʥbEXyT] -N~:\M4ȁ޴Rl]F^ 8ú]{DJ̎R\MCT[6t#}E.bw,7YWdLUS3qfӵV({aF4\LY) nO-Pc$[{ \U'MY\ u:bݱU0D[=@VP˅[BrIԤUU.|_74y9僿PO&]:'\atCVGMi֮aD]7#/tk1o x~P^+&Ǐlsnád:=hy{~@KqNl6i/\*%PyYdSVnV%hTWIr3ёQ90=mőWV$`FJᆛ;3^L@0WKeK0h.¡Տ(GüF)jpl⭍͛K2ӑ-C/o4߯c*hUh%pаa7Y(Ss~󿡊FlR"VBeY\w#lۤc~ŰT^PHr륢@N{(x VuO?~ǵt>U{eGF cNGݲ<]Es<641d t" ] P( ˼W>XӢ9+ϫ@( +*k`pTbKT OggSK]﹦0+yn% " !! ($!#%!##+)UPQw+Ӌ`Xsɘ+V]âE(SwJu,a.m󵊈,V'`re")}"BL06`EI`qBEB$ mq`)JR\TYAT3E)`w uvXnBIT1Hn\[6PuЮ3n{ߥZ$$ZTYUTI6ߺbmy0,j$ҕKd[Uz0grDGn2+LY79:Y3 wSux8龮a)d]*nh>A0V zGWKT[ +ˆ4oXW8Z2qIJ7olybtc@6x8W&!X3IUtokofk!f.աC [T1 p|Dn%W?IH$'Ru\ Isű1kHb\'4ȬHV1ATnӇR0=:Ϸ/@}} ~:]`s}srߟڣW1ROZhD8 杽,KpLx?:84q2K7^c^ pχ1K(b%Fr:f7,}3HŋJHɷ 5CmJO}Mr7EqW#UYźQLq mf*` |>\D07A݌eZ›$\p(+ gH#eʶuYn\o6)tƃX(CiHّ4JǛɍ0A@ [Y%/ɼcԋD!*R寊%+y2׍[vq>ٕ=!mN{˵LtA'>Q'k2jnVlఊxOkv|9<]||mxʅ ]MPnZ<FK m( &@ԃ4% 4~*nd[[KrK{{/ih쓜w#E D[jQ_-ЋqmIj+a7ԺHdW/ܼ>|ZzIz:54oTY4+6/z?҃/"QD33N4W?X;^;{/u[ٹLYimܼ~e`:]خB!:բ6L[ک͕lu D}QWz){7ND_LFO[ ʊ!h9hG˺w{bI221n-_<{N-㓮YͻKu#LqU5:K=zUuLhX֮n,\)PSZ>kB}⒧̇v5yN8fDT({K)cQÝv$IDdžxN_sϛ~wה?"j4B|b[W!`vlxs^D|PN%)QZ hvN,:Ȣ9TB=}X?Uyq<69i ?i`"C{D;O=gbuVw$zkW^'fbcr^f90\n#C9w&UKΒY7>įk@p.JZRe'ͧlLȘ}m 9Ýci ]ݻfXr@/8UpRn'¾նnH) bP:2ݯ754J[ 7X^PٸT5]6XcY"Ec; kV7ACC ~BixG al]X0hRNXtb%!ټc 3X\b2Hilz.FAq٘>tr0~ѶA>?Oy}GGacWţلgKwF_je1!b)c&%:d̟/[)櫆*ڭO]%Rߥ󺑕Q/^o-3})> a}R jGPk =xYc,6^(^JܤNS\@:?GwLyikOv"Ŷ`όm6% 9h(h_7q}/Bgrubȝg{ӱsMwe4ǭ^U6IZ嘮ۍrU^P`)^~tw^ņ@Ze4P"?BWY #tu_G=b}|=Lk|#1&n2{sPJ!NԔ9nXSls:gw~ H/UҟDkzdl(x!y$iH%G՞@~ڍ ^&%\5|n3+G'nV{377u[y.'()ЙIցdZݹBϭc$.%G"Q9oov}OS Z(kV a6HRJ(\̵9Í[(!skΖBޚF3PPͿƤg#T h= iWy?(㯩25x\1-!j[[Cvm;:zJh_@Uڲ*JiUg@ o1*ɜiqҾ?'afG քN@흯FHO3kd1MKofǍ{6_I4Om{7bvlykۏQ_{^eMj5 By-V狋g(^  ]Nd^N19@ Cq8UpU%bQ=1 9] |Лt0^?qaB1~r[f9$e~jGͺ.4`HoIYD_-gNЊes᙭kShIÔ|\u1\A3#}a/Zֺ>Ŏ HʀN]@5vSWrp~TNp|6=fq%ί&^,5v#i<W㵛/6!ya:PV*njhR-WkPH:٧ٶm׿O78O̧Ԕֲ?+3Vm^N쉁cU6*O^ʬyi?Kn vbB­>T@&AYwڒ7QrR\܄k77BgS8htopn>'D ݮ\֘ζ1Lvp}VFJkvlɿa̜i_$UH53EHHac=,5^)PBc;uː!@5j(pWY[M'WoO^ηn|ry cd.@kbEz7V?b&_(am{y^?Rb6Uq(~i__ő?>]!M%63jghFgG6qV qpLPj )r! 8yrAy[ Nu l+޶mcLWTU\G c4Yc ]>$:>qv2_uo& \]˪Zw |;?vCO4k嚦~*:>ѐ/(E@h&F DCšMv"@L /ތ| 1;^437卻nsQ3ܲeRM"ҡMm"i/sr`@ F_WSal 6A9m҇錁TcaE\ "N&˗G (ȭ jRЄM2 Iia,t^7!향3n&iv{.CҗB(,J+iH2 bB$r 1i6clXl?^vf׭EZUTU2Mh > 2' t#7Bj)@ jɄ^_P`J!/9=Jؔ"֡u: gPf%D L)c<ӧh3+^(7KI i NTw!JVa zah Ђ7(@'Uk C0^Z)#:;N" c= _ 5(BPI)J)׼nay+m#.:[f\ Rmd4_l 2̖^.^s K\/X>(V`fL^fLq Q:xc ѓ:-r,>wl"2թ, D0($Icf/k_58Ii,(kZDs @x\ bM(Wu-@\tm$8>8Id[5N6k)o)#Ƌ[ %Tf.LU(d!5˥BzzuG)p!]d]*J9*CERϦyWTdW*0_n`67Q11wU\Y b|g)A.u&T ̫@\YeJ@(ӻw#5JX dWu)SK`<iE覾14,JCX@ V+5p DYa 4=_2C/ ¢ `<9FQD0m'@zA[@l V G@ T$/-0  Em jdE4AZ?wE)_6[J ps&S%F#O3 [B0i^fZ8IS܋H(tEA *~Hp\W߼g0 g]H+6CƤFM1!/x%Z8u4G"/Zte֮/ l]A'"o踆F`܋/qs`s,?60hi9˝ ]*(blmQ&wBش %*^D 8u#8/:١u)mvM5 Aq1@ּf2RI|g8˞[nخB%?胤 @l `]`)=&C^eǏ؍` (E? 3*#D?d.(L7elNJ,@;eR}ATY4&fC$YL wG>,KC{S@ޡ; QexT( O)(+M [!`H[é@R kε"%C.8ոJ0U(I(k[ {~_<`7E0)!(!@'y>6! f8;?lsv.^Hd?gwDPf@7Dv2,4H^S ʃ\cH=&MTWQnTy'gg}-qLkTI2CDQhB5+5gG@hEi._=b 6RUS)~~_|{}85[Q!lSLSaSzp0^W;=VӦeU(d4SO};{^YCz !/E4WӔM91@߼^mGܺ=$YTY!bER -?߮FAڷaT]*LY *~G%CT'L3Q¬Fzv7YB`~8yeI6o9'I4-mhZ2sWr_6SobPW瘦d@4^vKS.Tk2\#aVzlNw(Sf[7/ҋ*Dԭ)hG|V.(OggS^﹦0[p5~!!!#!!!(& """'#%$%$ #((#'"#&!)%+>}NUnQܤBx'A&if8&a\W⼇ȏӉLFTiXe6 =ke8!(P1yJeT)7(D<6!fW<Z#V5Tq]ՏwziYz}kx]"G5JܚGD$>ԟQPp4 QEȽ2'DG a)u`jA$Q\O~<6:A\.I.G +uBtawYϧLGF1РN(%[IX OlGƵ5>Uc{zӛ;>vۻ T>]y&P"D~v4!݈E\B;e(@m ,MA] -~)%A9y`z,,wwJ#Vml u]&m"eł {SC6}mV OPg'!6gnU f%h^ۥZW;v@B;q>vG~ ql UN:(P@J ~:#2Ωf[#Kf#+|o(S\Y]lGXk~]?ϹN?Phi" *+/qI*}Z BX7dԪTS n>|Zhyp)=_;HD~b{LUQj9o,/N/9c8+ԻnRqLœU rMm_IW.gj~"\US=\lhH衿y4˙)a) ,QBOT6̼ŕZ/?c dBG?^DSk9" z{Sk>;<)7lWN[-0`+~xSoz]fjt^&L]Y!:8)rm',LGį(T _svq}=mNOה2e^XL1qOM0Y,<9}Sؤ/OKM0B? [n =fsoYWC"́,,l.}F |NnM(5%L5&?B 2bmg{m[ܳ/[-DSpwolvzB' UJxB?_~".m:AA (%z7Vx.ͩ-NSL+ V6B\[έ370ٹ W]5hwdYӶ5Tlqv kֳGu\W3՞b=쬎UYFDS!dV-Goipv S'dE$fF4 97g'(Nu-"Tnuc_45zoƴbnK9'""sWvρt\/ $ 6 :ShT7iRС %,AQ$V=v6")gm0lcL<->Ϣ]c ^ >U}2tj'Q,f]i"J:{bHTjG/M@<oqOl{Qo` > |jrϔChQ?U@ ;YLAQw|1XD)P<)VX+#j@6+)p]!XȦ!0 ^x|bp[.dX{>_Mda;{po%|Z > ]δC!~ćV rޤN q@J8vɘL!ZH?,ŋ;.hNJ&Vzv۱yq_.C-A欶鿮3av!(ዳ-hAHnd/@/!>u:\ 6 +W11H!X>*M_fS,ZzDhuϳQ,L*k}!bjL;]uJ1R~z5`T OMn/ch5 lDUN4Ֆ]v3eKRVkMAL TU*r3j\a#of}̥JMdܖlvv?Ah0맲ssF->\[#hjm*; /voZ_fF|\[˫r(BCU/`*1) ӱԫk 0蘈 Er8zȰ\_.c\y.aZRimp426M}6*q1[9SP SЄKo# f[<|x4ʋI#|;XvQ!n7+:@[2 6Dzp:0?#}pfDwo" d**؁P/$Mӌ1~ Yu)CKw%qnmHx`c&?r|j;%/SZ 1}qll2ƥ2. >bYѠv[.f vќW0B``fgaj]ᄡg} ]9Y6J]/{M˛Χ.o/?S>f,45~܎R}\pf9qx9p!WzW?ۿ߂~:8*L>IHQV y|#z[WT% 9'c8YmD̑k܆Ix)#2Oe6Fd!0W6$ /]N$>Ӹ;*LmnasWmQEc1kmOJ+d{UXsϾ?97Supݰ jvOJddK =mF\=xNMs7_"d߶gpYŀ̧V9캛:}xDL"7QTiIfk|?8Yo}4}¾a<)4R4UR59Ǘ eN(OggSf^﹦03#"!""%&#"%$#%'&%!! !!!'$%$$$%($dU6>G@^>@)?n9nRd۰Qa:J`S?('-:]K{ZD$6<%=I;ƲvdL<5$|{ Z΅ s]n}$D仯kh{dsrzQ~-\ m xn n,!815DUElvjղH{'^fSF)9ONݷ_ l]Z;ng32x)DJM;J+ydni?` \$ͻ먧F@SS~hֲr(CGkJ¡^- `>#],y϶2=ԟOU0wR͈.S~1M52Lrn2?ņDcl#dH~zÀ]vEi PnqSnTBUC}vv"J>LXA)LaB&j&S^} aU^DQ9aTǽR.Q "wld6m!:w5b,@ (ώ_4|!gcH(,$T-c6$˦(~DT`e$޲1FCcЂ9>MEH!0AqHӂ"1R UuVzС[2에C_…˝&sfd|4l08DP p6p"\8l}FӌTpA$HM>|<}hk菐' 2yMvX~ yeB# N,u3rI9h\ #5BLtL_G"A)q&EII_ j ⳙ@| k4Xy%01$ TߖU8d*C/\/oN7e߮{?n,*\0Y8wi8{Yɗk7{Ne"T0M39XՌvPis$LM3rŃ,k:]r\kf'H\Ֆّ٬Kr?&u!|zjld2i<;bސvt>g u.S[.T[hf ğnZ݅X8nBOj؃@]χ R1Vf9 "nDu(#;?,E`E@ZǓ=ڥ r;;RIXۥ Q/,,)}= !m$5mgnooz_.IG҈BvJáy!&2g LOTUmq3T U~L׌0zⱮuԾ0ZCe$i L Kt)v E 6~I|%,J|>pӎ.>q 'ԺsV'祼QZށ 4B~h^J?* J^t}x6b խwi2|0vYYJ־E fT~LVe.z%1>o\oG ViH$DŽ֎nFߝu`21=f<U^W"ioBLO%(ھKM\6UH V9 uwӣ/ nYr`/R#iy\Uti~1?hg2_6:LinŹ`LY}Ֆ\{8~5st&3 FsTNU/֖/tIt JRudY?imΚ\2_Ui3(!UczdWΡ([۷m=g0DZՐ-E T]QѮ{E 8_M%Z5LWHu a<}Kkk|ywte.Kv`OOF4R$to7lmf: pn[| %pܭa\\ IHJW̙mz\RZ?8¾PuIL)y: 㡑[7ۧtZZN9GȈraF9'YkN፽8Ҳ\8~mkn[ae:^QX\:ܹO0$ޜklj(^Se| !2fh.,WvSHjDck8W5.h~t  Wq%eH*|>qs.O?R$@f9<+.B?8Slʦ ~_#y\ǮUQ'k }i%z@4,˓#a;Jd '?XH#[ m܀e_%B.1^>אIknq9e?!xkLv%{?Xn(E=Mr[#3WH3T2^INucϯF扨2^;Œ~NT V%M-ʀ +>‚rqCH*"+xBuF} 10a!dlk|Ʊag-@T?oOcvzdz thHok8_nyqfTאv`8>_~F ͤ%T_LLϴ>8zwcs$;tEM!l-_~$Dh`BD RvbT0nh?sW֜ntYc!T[ZӖPӴ}N)x%ɷ_fwo&\]7_:K؞~-\)=KZKFL0^9JY8?DVj?d]i,@謵d*@{mҥrץ /%h%_qP&݆@v:)o,#}g~^%sd?WrvxcKJYC~LE@mUKȗԑ"^ MY C=l}Zv՚b*YUFC$UvÁ1V4{+bINb:6XbY ,{ņ  $P\Eÿ·9r$oCdSei'FRRb`UI#z5a; {^e|ڮ_kZ6T9-o 5>wȈB;L]bj54Ra܍8,]5~+e@ p[7@=|b_= 4qq15#ң_ŭq~} cNwŘH3kmCل9,^p}M Gxm|ʶk^;ly1ssu6ί\k~zy$E=CRF"[YXA\Ir P 4VC1\FŨĢ]^[.&HrĤ ?n\N[[͝oJG*猐eG7Fws8:TWtw'F6?'ly=|Hns9dNYz>cnfT*]EK&OggS^﹦0V2"!!!# (''n?}8~ 5ꨏ,q8&D##:n:;oFZ/UbAT_uL  ^x VBzt]GMLysMgkhO?{_uin&RZB4-WHIQHsCZ}%:(%S48,J\hL5L+mZۥad,I$n{$϶)أ~MܘqZA$K&dCRAQME)k2:l}EW7Vg+ϩ2 nQZS*ެK D@Qc ~lkH(_&qXt$֜s0 $n$nQ:H8*,WZ %3qț4䈏L935F-ۛ931~bxNWnTXeò j`z+F7 C Zw5 $Pccݴ>;F>?ҵc퇴5[1Y 0ZԷjU~=1&:DrF5^w2<;dp'wBCh1'X!l`S*e_ )oPoҜVkccIf 7#*-wQ~06Hi 46͠87 LFCa-X@:JU0uny\enn؇=k)iXeGaڭ5-?{tHswkLq!)@KnEwi_Rvd1N{}SC̳1u8i En9,򅟻)*̅TB(B:쮔 +rE)[2,}x;&|.ũURebKds:8rAphO{D rHc= SJS^`S%HVߕy1PxCݞΧkm+.M!jx1j7vZ.ipUGQ uKoKn~ő\2[' \ДrjOi;",%]|A9s\G\bۇ&6sP|?58?`h}Ga]qU!JkW3: qF!'OC<~M!ŵ~e~MkUA՘5T랧%+t!]m.XK+ȕkנFE/1.hMSxQҟ=AC#{v(z9i4P=F7~M:nnu{6nu57Qilk|P 0F1UuUl l7  6PţXL1M#fO+W4dZü몒o^d/>x{.suu[lV!?_*HEG3n3XDyE$>tmH^6ht2=t ʔݻkö!PGh6=咦gE>,i.+I1(KaxnDW<yu}OV1ZT[p0kƃq"YS#>ATKT[ݕ5s{y K o*LwCR.D:W ix˼ۻ$DuVUpE d餯-;Wxm}e頔c$Dé$RTUS|"+~._ϒk.8?T X=8f֧_gKԿs(\*0>vB|ADd& qǪOTY嵕)"|s~ݸY?5Ndc$X>ضyM'rI 깨nOI)]Z|1;hCo-gboP\??!*Ĉ!JatRц{6%%겥hfm*g<.E)HZoa X-ID.#X1@2AADH JWI^XTڋx᤹SZ/п-<.i3``@@$ _\ v'0|p,2V,Ǟ1POIb26c8ԑu|XQЅd`B0" ", W{XeFMjl^^@k-b SK0)T2A]0IT *K ̡⹕!)ӟ C=F/&ͅe20$iHPYiX,uFtܔ,X?z>1$v eq \d0nY,L#Hv%uF ܛ)@]$ ?p4+~nc6t/nV d`IG$&n`o)F O}?9`Ōb-yޖut@%4 9X6ű^x˼BN-EE( ϓ` vف`I?ڱ@#9cAfGNV T$)z<:h,EL鳃yø(*7+qL!( Eip@|p 8JEUAIAq&@~nCe$cʡI n!k! iHH! 2YgA.'[]N#`lX-&J]pZܓc6D_ d_('bD|} &suTԱGG !(Ya0e 5 RލkM,nWn h(^@0^mL)H'l.I:QDMO XS"LC=&WKn w 7S )b$֊ҟC1jXXfa0:LI$i%v6|?+6 E -H$ R`"4Dܒ  nܬ ( 7/a]W5d\~<1{n &Cut.ɨ153cpdGc/"~w!baQVK^dH谱n65jwH7Hi+f;AX~&r)٣h=Py*\6qy?A=fʥM_&nP;{tu`EZ1[1OggS<_﹦0R],!!!"!"&#v "" #('zuy{xy>UN"t_sF^&e\.X)%g%X~s'Ɩ1ٸazl9}}]WE YȒtH@Tʁ&ʙ$ ,vv]ΌQMW+,2ᆺ_p8!NK8La= }Ab, x@`^|~G$ LHL8?CjF2"܅txm(z篟Yľyp  t ]@*XWTWOF-|<,7^Ls-Mp.L~V*i2 ( RDR'6n^Ga#n\~e,$bΧf"!"@ӗjHk`tX(AMladuA'~բm8c L-KjX"a$#@-{k{^XMnI:q,i˖F JvP B, gǢ2 ,ɂv`{.(Չ5kuJʭCG)aIJ .tj5~n*~\7d@ n8$q9@=)MS&s-(Ml \kv`Z5 9p{6$y]W;K68Bhm!{rզ<J<,)Mc;ȄhG*P!@oX/Rii ![]* T+j L+&D*W ~kn8ČR3t*~7vlp!H~x JCw9aEDD=wTXre!\^+hl Bw`"MH3@ h^1\lM{ Dkpvcˍ*`4 c0RoߎoVh }^>dr)!E@eKfxFdkm {uxV}2 ]-=4(.kF-pm`,*>>+ f4S$* rb:G~ekKÍJ\YeT|EW] GM}aXLS845I\g0ޞ tOaL*^DShT/nՆ@L; !PUdTY2IWWCxޡ7}שf{n^=/*P%4h{ukom5Hhf@׳ 5[ӈl4peT,.FƄ[;w:c',vT,4\,V&+QI7Y!&SµUxS3 |-   k J#,HWM:еD'dGф4GW@,N 4Iqa\Ɓڦ0uW˛YEWbF1CRWX*eKMT@%\^;!`v p) 1N^׷mP$jm_|c8f)3tgC"&A*Mpš*I5*wyIbYu)Hm^ƀDbzKslXaǓItO7};sƿpbO#s1 TՆũڑ|-?B(ݠi^{L$TQʱr 7z!SG] E\WUZYVM?( "4`]F'ЪI.Iid `7C7F0U zh@?H.l  P?}_`A$z | DjeBj߲4̤> D FĔ2lMtĸm0q*=J|[fNE@U <`#Y1D \KܒQ- M(5A"ue!F <~@[l6҃if2SBقsWnGw|plI}OKj Dl` <F¢r `(P&8XW8eߠ9Tc!r+( 7@ŝesuA"ߴ5I%~z ,aQx#ɄxZU:pxxRJ'Q1$"dDJpB1l) $,(NdQWK6.WRŒ]r 6G lmcO 8 9d<)a3m?! &yF*g-͠`ʵaBv7P>Q@. A{[ E2ҔDm4Pcڶ0?Q!ߏC==\woV)̐8&f6Rv4.AJmӶ@Y~)pPw pt PS9 ]bA߀*OggS@_﹦0`pu#8!#! "!!(%$!  %#$!! "$""p} ""!'$$TU%Bd"[yJJbiLQk[bj_~>ySm5z r߼!.TUeN?f_KzfR¢!k2LMRUJ<$ץR ZZTWrULdB CHODYP>kIvnT\_dU /55M>a;b3LKWQaNr"TX!?:.;'\D6SySFqaow3@WYsakXZ L(A AB$AsRR^笢IO_z3%kTV`^  G``@< X [ϖP@n+S{#Ay`' %9ʘ{.Xi2$$NLt*t9'zzuL[BQˢ6xfK'E}x QuTY\JL1|%p^b$\UiJZϧ4M7u+C\\W&6U֚R<ؗ՗{3i; \]dE>8,y-σߓi[XCG*d]\7';&5V;{$ǒo~d\et+`lʽPqC^s76Hǖz[]@Řނy D #QOLEnD9)A>4'|`JJv8c5Xw28$ j815RU3 ANX-sUI]*m*! 4UC%!b+X@;w 63zχE%((.R2;TGݓ*"?* (14z#cG#CeU}./6(h*~J qe.x ֆu||&[KӣU~(VtA4@@G0G]WXz*O@ hC*F`1\ &8Id=ݞ7 FH@;^}~H_ϗ4%DNb"B$y__mh b. !o$ aZ"NId؊7:B5\YAn.[DUF@b~š%qI\mITU"XՕ/U\wqLC?'89DUUL|,z>cagPJd[BFWFԷ]z|]-KrI\[BU8[fr$rq@L:DMװtLU0)=v;Z_)u]F27bAQD[JϕBL v}˧󿯓FĖ`O(d_. КfB8xpl5kٵ<|e(W&61M(|*:|)QVlN5 7m2b$GI9YX,&Yrl8ѩ&}5dK+aɭ607=t8Ѵ=*yP>奬 0p)r P@ B% ]H.0)\ ͲZ quDn48e]@@9.s1$A`t%~_nj!L]0K:3[bLc֕4*nJg  *P|A0,"^ߚ!$[N_$Ǥ%υ++ 1!Q˝ u(el;h6 «~hM pY`*p B&0v7;*K =Z#҅<'{FZ[{'{{w),@0)AHԕ `?{qvO>s$%~WW8zvv >%5@-[~T: u*\UյP4#d:RSH),\YB_n$r_ߺ\Pw[ض'ÐV\LU\ɩ}Ox,mp؛JV*!O-,){FX`ˑ&Ez_a9~>Oiiº%1aX2 k.,vBNC Xdbe!>ROi; tυmYzU(*DB )ROZL]vA~Okv*%zIUip*7)dP4ZO]8`\Gj^ȉK DpWOBoH@#OggS@`﹦0WS+{| !" !&&#!  (%>֑J'n1Lu@ .y1SqJI~ig^ hwϦb;9U.][P!10{] IK2iRWDb-b%%l|"By- I٢z@t1\ܠ nE?̈́L {þ#=:"2f̻6e>ɑ4}&IvQNϪl䬈by9ϯdc7DU_<:Hy'B$E5 h->z'A)~ltt@cԅ*3{B"!ꠉ .3-{67k̺tIv$ 4 0hq@#,{{57@NI3(Azz\iPb@(10z })%5ȝBu}f%$ΰJ 4^2^zY_'Kj|I`+ _8U?*RwwO#i`㷰pI( tqY!Id-FW^>vB!|gRj^f/O/3 v峉D1ګDz0CM Zb#av` P`G +97j `]V8Z&I Xn;R|^Lr*?"ˣ?FdeȈ}Ydc(+f$90`*!˘EKŇje `b}JeSxsVvCx${OD"hлZVeJȉ?p6yc}ac^".MF FY\ 0hGzw:d#L~X84'*Hz]7 >>5KO)N~,XJ2(e#w3:bڋ7-o~uʻ"tR*((hȨCrdL{g" ]JpK^O_.VG`(~LNހ%'iW+.\ S%.hDy{Bidɋ(EIYQK2 E2qMCu,ja~)er[?S,Q@ I3k'Rxk6ƁfAܱDE+wڛfD1KL\È2ro<e ѭb)16#73/gؤ+-@>h?nBU IҗPJ V;>(=^> Brh=H}KDAvId)zXj>O<0~I/Y}!:F֘*v.U( ܠ "8m ȧ)#Uˇl@W.@3J "aٟ_@0e şo @)SOR'йL:l*<^,3+چ6DY.Y-ܷvnj5=Fp&lg@=w,6@)%#}d!d+ct5QW驑`Z *WJ) Z1]zײZϓ]0]*d]lCgfA6kUZJB ^oK TW\JIpv39h$hvG*W$LUGP{]rZ&gΗŠ&DW9)M _r^JMnLW\JP]9y"!\~½!buTU\J Լm0}$k%źTYikiz\ęݸ=nkMFTaJ RS2_E?/}o`5Fm2TƩ#;M禀,% @s8`\4ZYfwv7&k}7R(7܅ 7#AFs25v=Ĕa'Zj UĊ2l`B0N)R}p4MWꝕPLlUƉYg}h|kTB2C E `p <` %zxެN%3xOmt!W:u՞5i@+qN5 $k& "$%̍KI&b7/_I؟?> :x(`)Η&rM-P1P\_@gk$Xxp>\v&BanmF:uI(K6$:\xnCHkPB0I$Bʐ_&6،~xOۋPtZ M@`7`8ĄsN K4 />F@5V28.t V ($$rՍQfCmXBLi֎6`=i_#$(2rœ~ uhѣ1/ 6 1HUe$c%}6}SՆT, _H5@`4``˲\҆5-ւD}#?\*-DެOK rzD,ءua7M '*)u0:fm0#',GCϸDQh2m1S\ǭ51ba<! < 4'%~l{3v;uD !@BuaRR83M( R"\TMd҉;3q.ϣN":a#qs& RR`epm_1'"{D@(IP R\x]Bb!j̽ Sȇ2ABMOFe&VwVJ ڠ%R$A22촗 pOϢS~% ȸN^U_H 9IY` : P1Xa@N'Px2 >jZˊ4QF#Ȳ O>2 &:P.!%,W YHr3,yʃvXC"#DU€eО/.vڽ*@˹*TYRu=~ԇP~ɋlMD)T,WF:t 7WW߆j p9`@`nwul|Bc>W$5xtV|ξjnmUOggS@x`﹦0f` 1{|y""" !#'#  %" *'"#! " &%#>u &vzipw:;k}6;O;KǾ͎&AhY&LF.iEXĕ@Lҋy| 8rQ@QEL1"'•"lSmba .)x 9pI"R$H}iÃ9-&tp<}vl^G[z@d@gJp ha0hC{!Bbt!@U# "^ J SVhwF`Yz-@r`j++N.U}jY!<:zUne%H u_iv._o t)b  ~@>rWP# 97xk+MOp;$9ڈ#wr^s 7m:߬R ;^FQ:0q 8,X?*r@bE؃M7"L^t8@CzW&` .„!E$9Y1nucjcYSF<R@-o@TTt ﰬo y@a>0C)&`BiEY\0?FJcA{_SqlՏ($!(!CKՕ]S)ûfTozAO[ (y.@b ޣ>X ~2AbAFpq+4SQ؅Eb!d/CbLIdBDSy5*T_䝅S NS5.*e4W)$C{3ø>=kudخ"Y#U4O`k*?߷Ez%tg RMrj(%4B^DYh@Ã1 ߹!Fw|p}a*T[*T[ \Ttjϔ"-qV7Lo3!RB,Ci( dݺ徟mws :ʬLO+2MTWԹm E!BF(ABѪ]edr;~?Xc۩ycA[k#*FF,]S %B$~XH\][=vxWekgBZ31F$lcJaYcyʔK8cTAqe`yi.w_TkNPÃnH>d62oDg`pX6 )QHdhL{{&"|g@W6 :8E卋cq=lxce\ Poz@~YfI.<,5֨a3OOEZ"Hޝ/:Z0jzcfs'8PӶ>RK1 1-  ,sQ`.0%oDUt^,^ F [0AX `<4?MOڞfoZribl^`:IG8"6b\ߧŅ*Y %ҥ6^bv(Aq!RFUULM$PzPӵTA4=K㸒OH)MhU#$EFÅE:SM۠yFvCBL^o9tV6}|\%LRj$4c^F_Ł1M],jP\Qu%3ot*:E\_>}<05Ԑ7'dÍc}äy޻UC: V?0ke s72_PHMTRkPs8HITn]"J{]X$ _ v]fXK&ѱ{͎ bm~7m3ρ,pgauuoބF/EgH_vDG+79`+Ë ~0ސ daez X`C?>uѪ~d[v lf({v߃Wo³gb"B:0z5PG0W{ܯO(v^86(VH #EI. ^_~1oiQ7tZ:RY=`äD&ڥc-ŷWw-@B[t)}RF.hyaf4b.6rcn8D!S15hByeb<[WP.ƂbIxى_fzu܇b,w.ȟ%BRq4}LU~} v[+ @Mr ؒ`V#n7I{V4]"٤ ar aA DYT}`UjN1qH.T׎uAj7VC/cPrZ.}eah5F\[m+ U޿I04İ;!y_bz]8ch.5Hu+{|sv/zBOXh]{ܺb^նe MGeHȡLz]̙& P.C [+b] .t4ʺ(Ot ާ.TpTP?^nuB= u0cj1j*7ՅSbEi$D]er}%e1^t74 ~Jپ:PPP@?,$rSIHH%r-$%nnM `y<ʑr3esM!Y]8%,RE1>)9wY1sy51PB a%TU@@k 1q^?v_ΐcxcȠb#\\ DFvu|52*SjL?Qd2㰮}G[VDO42w/*<44ϕ#\; v_'a7U#fAq6:9f4&jG+B_4S q@ `cqˬSuT[6j65Ml@j|J_N~ƢT[Ե4fύNgI^TLY}Ֆ \;y狾\!yRDSkv2gN(W BsLQXUӾVC945L׸=żE\Y@s}y@`̦\֛m}! \_ D} A/CQnޭ-VJ2B^ +r $y'dW >lOʵەku55O-%Wޙ]_WS"<U:^5ŧ(9b ȘU:q e;omA}4!:J|~u, /Z N[CAB ŧ_ψ tKq NmLc+.,!gU{(p(.s ¼,>cp|ݛg.z=y1IC&B1_BO>5o-) g&ɚc5m> n@!kt.rE`9$VOggS@`﹦0(0;!"!#')+%# %"*#)"#!"#,)(&##)'&(!## " %&#^=L$w=^̓u׫fA&,\1HlLHUr>!Y=qq<<WVS m B@@E{䁢&@@)jy$Wd%$PHh'ө UTt0z"VxZUZwj  LF2Ͼ[xk/Z-Ϻf"B||9}vMneg^q;6ZuGM%Xw+@(G5 Vq,yERĊ$踥/+oR{A=$b@L6]\AMYZUp/.J[ҘCQ-\ѾUĕ <;fՔLUM6?^{{/_d*HF^DD:P~R6nn6%bmIUhR)T ּ/?>J oM7vTۍ{e[6s0vxj[q*K˱z'{}ow"\=[prHA`XNGk-m@8ޏƽ#У@=TkQ4?FAO9&`P\:~(&V\'c7\o~9|2o7k:FA'{u>$/^p%*j4dֹ5|i[[GՙOޞGChdnHX2<6 h L@zh%Pj٧"CBȨ1z}n~SL>2\=[K-d6bdu*\wX8݅SLzRϩkS"~#da,H(*#RR%{Tvh$FUwMޔ.@gv=g34XNQBɓٶ8% $) :.ni@_WcHvJO.0V9ךô|šO"E}%ݘwVbZi9j4ɫoWMpE7IR[x5򽖔K_,RNfp7ؖL!Ih^G]*crex0ӕ6xX"p|$k41vTgRv! l#PݘhfZ^nӑN҄7͋8 8J#Th&0BUty9% *n@#D %72K%h.,# ~JbS0a@7"7MىtasC'i,=y DYT9 xB^M'Ƙ7ڭݜByM%1 57n>20Q~wyj#K(l\N#Iph:Y72]>]ڨR6yuRA} x5~%Qp4ًυ'VO_6.(NO+MO89KLobi"\dIXf]7k|mrladͳMz*7WXUb2> |X, Q~ fL6;$4^jbUsUjX sLi2֢'v7pl7k][oAZ !%h_A|6u!,:,Ǜy_cf(K*s\+9lbiɅU`&>TFB(eѨ]DKeX53@n'CKH*&He_~u\WFĺ\d_o7V\p˩e3cdS6ܘjϟaY-.L;PWXIP64`Zk /ܐKrFHhǼ T;"1Rn[V bLY37ۗWt%SaOT+DWSv;{wxde},EdUGW׺E3úB!$z|? pDY}4?)>e]ăT/2)5ƕX.Dd]LL7 kt=5lsg^So󐤱۰Tatl 6y"!†'R׹l ta(P7לO]QRR[7Y:_:JeN[GQ--Snrn{cMcmxl9z 6J9R+*eHwƸd(}fYa<>49{K40W vQZuqEBߌEӡrJg0[ M* yQD#APOjE_j5uCθ%c#׋xy2&Qٺ@R@ dQ̀!I/1t.&_ T/7= v&G Q&;\I| ~X8[~<.%Jvbv˳+4;"GaLJ;q{mi%-1'w<)slڷ~~p!جm4-=w#@@'YOtd%Nr&k4 -nYBc ldO5)B5B 9OggS=a﹦02&p*##!#'&&%|"!"" ! )%L:. t >Tf|S-\ۖ9x87ȔmZ8"Os \pS,xh~\Lyhh&ӒΫߺID䴣Aek VQyּv^?|pNiLWT%suIoIncD[ .(:~:v&㉛gǜL_ [P<8񦅥\G.:<67, (gG*^TlyH1ETJ<{|MU}xY/O&eAGF*mŰ4}א¶, QMUP0X.ֺo 0^<ֆS03A!h4iOULȩYDw?MnQ:ߥ2F\dt X" i m򶙟5dv:6CC?FNS&u(_Zւ(\0h~[CH!I`& _GPYǩg::gɥӬTwأ7\BD|. O:gOA2k.nm/NS2@ rLkѶjC65#;A,T F0"#>K%(Y+4pADDTAa<+"y{=/ n< M=Xh?] VNkxJ.%V͔.5#NʥpH7-KR`Vj(..8YF U6nU]+Lb~;WVۮeiKhHҘPKO\cdrJ:C>Sx5uf(1ӡݛwgF!qcPRz,ܡ^F^u nSF8&KR9?JRC`I2LxQ8oRݳCքuHgjB  k,iώ7~u8=&}۩)B5 ӱaՐi}zc]‚w>nseјķ|NɠBf낢9?HMO՛/6IOM%qYvYuᐲPdLt00a8b2|1L OͺSm>1UX)I.aq @#Zul${"iɼ@t$O\W|V)fZ4H⢉elo"C*oБn\A?^_dus|i _{>w|r'?ۯ6PЩ~SkU6/ߌNwW5#.j2!]C2'P[,aJۉD),Uh7=p#+GBhq1 ԋ7foNjGآݪWpTm7t)L?L HSy?Zi7iM[{ǑWׯp SJ"nJ[ WDͨX>-^QJh+ ijK'"2S7hamrr8a8mߌz)H'.h{mZzZRJ aK3؄1K`"-̖lb10m(j5B /m9PIaQXs] )q"eS ^rs-벣cݝ: RNm \ h%%Puܱ'95!qARKx]zmh/r{NR|T+6B`]XrJV ȊBR]Mk5i٤BЖ 2'^ѩP+b0>,r#\~T;u"ݞT+ ʰ4D D[NZ#^,A<HvgeQYn;ADFe{[_Moc5q UBnj? ?ʧkt6C S1+͑Exi,i \ A*n!`^l) RXu1M",^#*ª*HT+UX @IP h^/S:nTHd^2BN5pt,niUS_-qI!ԁp,n $vl<:̅ъ yDŽT,~BFlg?>H3pcb*|̡xxT0-Q6&#k \E*OZ!{WƖ_Z\eOZ :`ݛҨ]r(jA5sMno_v7NSw/pN+bE v wphުhAO^ ?)$>QF ؉OhכHiÜu;E)sZǖ>ԝ?Hժ9&tA/Qbɭ֣chh?Yj^Ŋ\UK&q@\wyW1l^ ]̡˺l3 B.DU助pÎ1؃k (=5R5DU(r6vo/bN( 4Qtj|V|iG,,U<OqAݓz}>~2|$TWе8Ԧ#>zk0ʞ &8 \4Nlᮚvѡ2z T>+,*J;Mn}4EL[QւLz3,jKw_WOî[[e/\[ .:A Hhz)ҵlJcdk̽: :SڤH 4\[,22 dߎag/"PS_s.dS~6,j1QRl8ݐֽI ~JSYY0'" nuwpbl:fYuo=JGFu4GS `eYj/I||xT6cw8~ڵcWKx#VA!i|o.0Rˠ2f@^\@> ^ \q0;e .=IZ@X2 #I٪L)uxD.=mQ?*xrp\ 7<d;a6ܐ* ( p"N)AFc6[D9.Lq1*KH!MG(vՠ^ P2f6sSC:Ti3F,I@~WBHw"07`(h@A0,Z (\ |@Ŷ2OggSa﹦0"*$ !!!!("$" !!*(wMd6Eݺ0 a` J @DL(d,bYmtK[ bOeGDNcWPj@D hW0JP~'hlA7e t(?}/-)%>dmVlc6LZ P\P:s* "$RIwlx4f6*Fm&"ܿE`30_6Xt 0 nY` vv.`N\,l%i='N5<ȇu q# gpeʀAQHAd5ƴ_A -²D)lIaxS2@tx0O~@@+uAf@?@KKZ~ 6Ad;0~e+ͦ֎NHfQJqrLS7GG{ Φ|a]$S_^]E~ѫR׉ٜFItR/ тf(4%r1LA@@j5Я.!::)]5?QFR-I9YNG*D/5Zw|.q1̕h$kY߸u0=鷼)_<چYWHVdn%P  o n@+Dȡ*K&؁'@LnV~8UiL|| ֥'RE"SR\ɧKpR#ox0ff~ *@/7$"I Zn$J F dRA2#2,^u2B4k ݤI/m &c)Hd$ƕ;ׇ~u=wy0ZRPD^Ih!G4 @0\JXr r /\Ve f*  ZA餒ﺂԼOYDp[S_ߗecdu-Ƕ Vg% f)lT  B@nC` 8nkbA6J'ASI0M,T0 ~u"*qh(D3@MJr|WMa%%\i#t ipMf4\jXXz!(zH@ dsnX#>0Ŋ@dA)\zW5uD1E;k@M{̂um3%R"Fr+И⏺|n?>< 8TV`tPehB` `(X+zD,0 VU.m!\;9RRUԂ‹ɤ ^0ZTcaV͗LJ_klKG`S2EDf 1t7u<ƍ# 0&;K"{pe+\@RiE=EH`~˅~%S`Ч]\WN`4%*oZ9;qR12%`{Jv DWH3>ck>[3uv*T.DQ"eDR;zOw0򲄨Hy.,SS8ܾDlO~K.U`BJJJLU|i 72/ެl<ڔAI|u*e(kv j{FEL|p}"|ˡOB"駑I{_+M}}z7}NgNꋷ)c~HdͿtR)Da 1*)y&.!^mn]܊X4$pOMyYS2c܉Co7(|~z5[7jO@Ӝ!m?f ;9Tbk _G(*Q.O* ,H<.CfA8dc\/ Ji+폛׮c.t(߿똝FQmm;kBT05V5oǔ0kx}>uW|5Z; {cN![rIg PTsX T.v^DJ rJD~nM5" sf4X ."\7x _lV2?~:L E{}|Z沰 Q?ݎALVH|:q_-@mH@ #'*,%+q v]B hE R|gSY-!tr ?ETWb J65)y^Ɗ a56p{G F4J9 ,RL|1tIbD7T F,*ĊTWS/<ߴw(BㄛlR TΈ6Ά% 4 f$\SPU3@>#;!c?%n P\ېëҨ]Ϻާz&)DOAd*\{w+vL6o5P,OOQD?+6%_BVJ31q'b`6 ㊧Z`lUk=UOL^|weE{2IYԆo)|>TYd =ї5,z[6k:j?{=r GJ!'5ѱĎ&z+a8!c]9#$#$Ip9<-ge/V:,HM0RDEev+x.XP^8@n˥$5 ]vEj1Ve9u ;IlfD~+њ @`tEm@aD+# j.C^ @,pwk 2> .MʦdnƉ초Y\#y-1jJ|d,a Fj"@X R%~<_\zҸ(qa *=Hcԃ6\ɃeGBT@>k =k9>|"RlJS\$D,m󙌘Iv:TB ګp?ˡ,P LÊUXQE\ ƀ +B~KЀ;p8t)9-JY<(];؈᥵DߞR6lZ.&@YXo P@0F ,A" 4* w bEH;f:TbPzT68Cw$DmVK2Ch~yv L/N DzuW FjC_X]{D ~"}KX( n 1p   tULS(ZZ;=h HȪ6:}ORC ӯ^,\S`Ub]L]}%7UiBcd[wuӹf/G]C4*W\YD)4×Ń; +v5PgRUd[u$KO;BP*\YgJa/׾ȧ.5a qDSJ P䷬Oة5eb+*ՊQDW* 1>]" ^oaM)ҶY'_^Խd_AEͽkuAiIYM-Bd_NX'[<ؗ0|vꕯu_k|.Usl{T @YV8pa8>cхPl'Hct\Y Go^5-e]S*}s|R(?_x׭o9?.{M0˂r+ ,w-3^7' |Ρ&qpLOIshS4\x,Mx".d@Mv)FBh:5[M(P4Uj~%L@r+RKxSځE,ђ8z]yц@? eAAP!DD"@jnclE ӆ_SռE7@Hn߁ii@ O D~L6&jCR`c xѣĸυi`)(!@$AH"X\6Nvtv>%`A4<P s : s \0I'|Tp}""^LNdvTwnܚv K(hBQ" ""zvYIS>礩'G>3nwyB݄3j7z `8a/ѭ Qʾ _$Š"\n&u+@ Jar.lG130(H%k=N͌WT]lmqd,i2K*TM`l*tN‚Dd@TTp".|SZ`O sAk&DH.elIчc,2fǤe]6ؒdi7A."hИ xЭP0/`0':q.(">`X9\n1Gl]%wHn]EE !E@’$NlLlbމ8qzA'@ -aq M@vn5t!AE ?P +ųDv0QzŦz;6~"í`>Ey2#,ʂ"($?vL=;kz_f4FճBAG@)83OkgUNPU(LWTE7US>qmѴ 6/7JͦD]Lu.B`>xmyXE2 %n򱬉]*]\_t* BXLy.b}Ł\Ie:Vrˤ8f'r糎b 2BY+Z,k 1wFNsmҾ}\mкb0c%PL TYЍveSlz`$-5Pb%ڃj@=|K0z Z8SB^)}>vaS&͞LECAcsmq(efh"A03҇S~X:֘`tY4Z!xC*( 8XC8w f?]+]N*B)4.xApyĊ4Ce "a:W\y/龤>GvJ\l~@xX ̊ACDItE\r\t/K?g"H m@g 9CW1GK8'b@'/X9 OggSb﹦06### )#TW\dJ%fLJE K݆%[,VdWh`_}n@$ 7QwlI\L_0.1 <8L|SZ T]B \[p8 nTD^ma;OJ\]BD]QrE#×[ΚG\WBTW@X? @] &ihJ$WSlc$b%r]m@r]^q T_ C/!?xk4 ñ&:5>׈:%4 t$^/sCR2F'dqqo9ɱ;Rfx:5Ojlg4Ғ?^ԕkdIDP3!w7R)5H$ WbT $StGBh^R-U^NDH*G e@ankH#'dDM܇Hx%'Û$j'Di7 D(.gJ+ϛ*Zi#,]nލg斂ѣ!!5W>P«# O`WaAeox8lo%h ,̫#tp(ѼVtg \TU[)'/ϿvWKˌI t7j*CjDw8hPwVYzU$SJ 7 {NHqp͘8n/}fw8n{T_.@|5sܘd@t W,{+¢ kD i9HZJ\7:~kB\2I c /@ [+-v Dtj:P,a\wƸ'9cmL{7\9OnIZ5FdMv̈zQ !ee@12y[9G(<";9g_734X0%8ޞbaNݠttyC; PT<`l̟R"rHG':rۦF_SeIxVLH݊G(9IĚY6]TF@A90 ` Fۂh":\b1hP?OD >Q|.EpJ$˥$t\Rd %K~*;OI2dnI<𔷌h!6^:(O)Y R&υ (EWш 1  l6Q"ѡ*kb4_^=;[T&ʄa%@%ee[YFu+1^I% Aɒ 䥶X} $g&血'Fx0K]Ũ[reuFjB@Y2@u 4CZ;~>"e G|cm*!HS\fځ2I=Ȧ~SeJ x>˒RrF֐@551vh'@l@֞),Y/@`>8[ ʠ[x)BnS" 5D06 .a(I?T]F$ 2) av̠Mu\0ҠD\dI%0xYF[^[zOH _V-a  zP5"AeBXc&Ia nD&B~.$Q'UCB$ەaJ!JΆ A'?:k@,BSS嗫`Ҳ!{֊K<ΫpYexA 5P6(P P^ՁۦgA#*ȥ`S@lqDa)hAqe>+ #,8!ħF$"'ĥ8@{aQ"S# uIGݴ2 lhG7F2bh4St 76Ԏj@u2ćk#,+_\2`XDpb`E"ۍFV=&a&bJ02ODDDi!{cô2'0){YyK^QCMN @Q7$Mbԥ9@ D% @ann."A$< AͲXQ Nxx!FYy_Hj`JȜQ:+la sO}~YGcѪdZ66R=-B.AP#B `n@-@ ӣGz`1yA@LBUT2 "%"Ӄ)uXԻmq+九EG Cz66 X- p tY"LErCe0;׫KdzxjV^==dw,")6$ @r! T(7P YI *e`^Dn%M*'CɐWۭ"L6S.f4M[S& }YgIBY'l?v+6wqa~{p'=b3PF7Yo@qK٬(| htBdPC7@$*$ d-L`Q̎5A7vI r^&i]TiSr S#vwmm;dⅴ]0 i‹uc*kM, AsmP<βwW:~%S2Nk^i|ZuɎ-e{ΫEi,Ltq~b[>jvlZ($B8A1NsD3|Lb%ʰ"SJ͢C\ᤩaXi0|mY͘]i-d<.J@V (gE*Rti*PhL L7Z.ܐX.d`>dO@x9H8n+&l<Ĉ&e,5cY55tT[Wf9@"3@P̠or.  <ƋPCl!E4#d0.&^ړ ""Y:=v ECiAKuO"6 `dKDӒ?];{v@1aSݟ82Z X͠@Ydqb.j@p#Go @&wn~|֑gm,~]ٍ< ,ޅ,Xc!CE03?ɤHh:fyݿ֣;Ƣ3J4j@0aNL!A$9S0nx+Fq(0RZqs!Z#`bkChefzTܢ;d ɒXHM8|3^I =U@\o (aYZu~ Ii#JqN G*Vl]\PpAURc!!^|!&,pM ?"f Q*GCZaB2_:'bs:v 1b".F P2@dq;ÒF*xPHA]Br*V\еPAeOggSb﹦0h3W+!)($%$$"'%!!#"'%&)í#!"޽Ot9~;M9- q4cct|;>fY8.`6t }JZ#>].7DRrޜnuH9]XW߱ q%kL[QWv`Ӷgo, E\[2)QZcx0$N۰{PTjJ#L[Ywiugn.jBW?H}]4rvD55~m\YwICN~2VSD )㾖:AU|PT"t)/{ou^l RjQ* ^ZAΰV .1FYzĤҠ% 1NRXmhbTflvXG|xcӧŻ1|'i_p;n #7p rlq?TgJdTEQ2J+/UV U1R?e`(Ș>땬vNPhZ w5\dTUahJt'h>"1@V}xivh=yx݁2hP¯kdu30,JV'g1<0A>@p, d >o5,>+43(? AOKM0n>%KhO=<{ʼ_v7(=_#h@k]A-n5b Vy@^7J-._ՃzmCAk@ \-?A2VЌ":X^?ͻiĘTَ'Wsc㰛 lCX!%=]mwS"c.Yzb&bj2B{`)$DyP6e1 2!4%;F(Cрb;Hпڰ lߺ+g#Ed&{-<lVnx\GzȘ᙮. ü+4YԸ8X 9=Uu0 ^wUwSxZ{.j|7r_9H 1^veٶתVތb 4,.lFJR<Mf&ǨLiȉeHc~\*rK(89v=U Blk0\ָqCq.r|g7F<zy<4˫vQ5o^ab4 cM5zo.׭^ v^rX Χg`Vҋۛ  ,2:tS/4fQ)0Nn‚ ҝSkwխc.&EMutXGN+;uS~s bcJ(B_1E~ŢQZeLGZ*S!>7VK~ucKxcy/5&klO^x~pLzJ$Jʆ_="<75>mq:mcO=ca͞ϥuL{-7c/&7zbxUnou,(,Tb~Qb\`Kp h.Hr ROC}ן&%۶L;Gc/qtQw҇ 1+QS~ ֛OY}."J6 L ~M[egKvտAnGDոn._R5X(+n@ ҵX5@I[\ְJa&F:Dj<oqyhlj:-aU*STL1IZUϘvf{f R=?@KO_S<}*; (@È#I o6'|)2}AEŸ%>m OnTTRPoʂ>Y5Tm\i*ey[Kތ ivspJLJRsfd2muH302ߔc ua ˾ T  F6" Oi(@݌^t)y.0Xת b:H9ȢK]Oϱq[)v+k Wz7%`,Z+Պ[99|@f6|t2~%"Y$r%$+Š\^uIYs|P M|^FmN$DdM3#;ScB#ڐ?v?9ٰ1kΔWPhK4[NqU5(VOdzVFB`\*;n0bij 8B|ڌ7pOďxTF8=#I$R6sRy}Q.aPXAļՖ j*TP7 nIjTC.t2IJHC[QFĥ(v8 L]w@!txSb>D3CdU)o@~mw?56U9LWa5L: N0Ux;*l=sXkIw,O*OU}+ #ۨݎ(׿ӃOT*= TYSV?vHeR]vNDs2O ~ll]í35)#ZBL;]Mz#da(P3͗-i$'.u:}:P/ @!p@}IGl~8|82}wsNŹ3Ly}벶|]? 6/9Ks5zc1߾vFh73@ɀI͗sgw[mHC^Vvb Be7]4o? {oxHw*r F A 3wYn"tmu֜_`zBDyϖ3| W *YtKn%eT6( (+EBR>o*'Z2ª[b~ T?I5=(e-恗@ЃF!V6hĥ[p?1`un[$cc8P>pR8|:$6;.-W36Ύ؉v1`ë+.<4g  |-c.¶pJ]N{sHXN~v+{Q"tv" QAnZ?1xl()H+lbH"K ȖyZmV"f:"uLuGFN[#H*Tݐ6xyAydY_ykܓ:lLONڨZ+giM~;8IeFL@(m~>/L$T٭SǧLS5|~|xɓXtQ˴c;\U>񨚴hΜ7|A-wkTˋF)5oLUhE旷: R8Ih߿kPVT] .0,J2I _(GBhL9#*=y>\]z%BaWKĿq8|e5.KАHp2::I@̑ 62љٵbqDiלi\Iqߴ{h,Pw'C,4皑`NS 2 +g ;pg'ݷC+J++ :\+rĵ# HT7#~)V|4Rc8ioRVj] vf2uGDB3,G*] Oniro69*wbSD| 倔o4(]9 \,n֠O$@c`T؊`c4HO`-+lФy8\\n0%ъ :kV`!b bgvDf̘fO@^,)'҂" dGt @"4za/@9~LѬ! z" %yIn(0F@5,!0bD$&9Tpl;Y·Ajl4@yt~S"X@{E(>,RPG|Z W$%ȉu\ؙ#"A F;lxe`*'1SeLOnjhxk7"U^[F=ZI?|-%0.Yb" KârQ\|]|-7F߳LE.#704Q" svl>L&D26l1:ifDieUbX+t=hXc#neJVk6:v-6hkQn%$Had3iݷ{$k1q'H`A#[I@+T@cIDR&\M >WK2 )+c(ⵔV9;n;V:a%tE0/R8|v2N#_ٱH`~q] ?}mϡ#1yw48&N#bNj6+IvZqwiM 3 P)p:h ?Ѣg)q\@" i=~ŬH8ݒ=Hry q c k5^h![wvf4" G?"f VC5OQ)P WQFQXhpWp@Q/D=wp@.hꀥpxSP6I(qfGȼ!7?af_Ɏဗf kl8X[ kv)Zu\Q߶MH# 2-k AcLyNO!t{I%,bU$z4F.?DV"[T[uۏrfXMLP?6UʺVuTOggSc﹦0h$ !!('$%$!" (&LY+˾2yY J!:8@N߂~I(Zǂrds$>bVf@E|.g/?]"m00*MM_2qS.ש2vm4:hqED+nTvt6MgA/1 -L,,Q@9h8K40/QL+J%? Duq|2 L^FT)MH9Na,)D0 6swD$~ ;/[o3-wZBmwРiUrJ1l)+#O[)rΰctuG$ `am8|:p;>ޓ F01C;k$IN~"sTwQ{DFg܁n Q23"AQ׿+Yv~h7l~>vuhd '=N;hWP[l>_ HT#ncR9Mpu @S +BB:6T[NxҼn ~;{p _;8%nDO3eS/_^i~`/"1p(nsr.P*M{Io/ByTݺ*kٳ~+PI/v+2-0J`$ 0#/wIX1Q"'$iܯ>j;K9;*w8go0.ۅ*bB$ fR!ZTl{ϕJ Am 1v,#ukan*{๊svLOW .+qE+²k~O*><6Z)x̌FX 4 mOSG/< 0HD&T2.(Bvѩr*"7{"|Ͷ-˂⁊n.5k[,>Ͱv53;yC368ƮȬ_0Ek0V6$/ 5g¸AX&[btqlkɈ#9ʔ%'B26b62<ʴ 9,(+Vzu)FnU ^+ SF),YDFbMERE$BQ涼T b')u9yZ&WBx*ؠ dln\Fn>!9qetl1.{:GUlv5ΦzηP]9i,ʘ:tϡ!P-j a1dVCr7F+QupEޜ.zMT<~\\Ң'?6Efp<:G"qQxN05uҥfj*8O,Sl4돧3foYS@4!vS8b=r_t#4[7c|O㔹9ctW>ͫDA%XJ"sM b dR*>cN}XuO63~NNR㺿Y{?2*s~B :NO7)@>?8\C^nC?T {YLIvմ!{]7LG[b7q'! Eׁ\ ^!&|^j$lnPʢ7eLq^O:'uwЅ<\aXeN/nG< bWG}aM#jgfX)ج;]]spbl!վWjqgktia?e7$zt% H 7#D*l1@) ssj;YmELXHw㪝N `v[tOmm~yM?Fw_88&)<>Γfor 5ͳǸʹq~5Ḽt\;J%aڮg$>P0R8 TH=[=[^m9۞}4o$v%t 2_!ljuI欔]Ë["Ќ!18xj fOf?ϛysL驷cRZ1rQn\چOYr]+w:qKvp\^nW'^(.l1bەp\ #JRGGpQxbüC |+F gn7HHI=Zׂ%2[N "ph41Ʉ RCXG=4IZBv,oC#7 J"7#^c|$'ݲfgv2$`Re)7Q9zMueINgp3DרHW\ HJ__arjحOaDGKę9G̙ˏ+.8E:ߥAWB*xn\JYC "kNRHsՃ%K AF紋B~o886M.-2[Km YZ7qhx{R(el$DI~'JO[A :ͣa' *a'' PTC3Ht1lPҮ$㇥(b*.+[HtmE;vBf7aiL0ut+H)Zt~t鋫B$IN_d5S6_/Ij  Tz*49DZ AI7nm_C)NunLtKBY%gJ\%)J4~ەL4BK):ME⺱TJ7Eȡ~S#؎3IhFN+ūӹS=`l I#ٜqTBMz)mq^Yc{ͦ/h!iVUnʙcj"Sr;>BPğ6T`<qXL6M7>;T?adקxu8~!:7nj؍+/AhPTvkZɺk*980(Hup5<0oϖl^Cz̻#;%v} R݅\ZGU%*eyH=QdqE=,I~ۍB@JAvPBXPx>85p6LI4,;cfJXї`o;f:ABM-mޜB_$ P 7 ca7s~@(:̽$Z&7HS] YR F1JOggS@d﹦0烱+'(% " #%&#z{}~{x!"""'$ª~;6!P\fL%#HsFKi'PtO3OO>)Lj"W <*؈NWX*@\N (B[qmuJSra^T%&tGGh¯RU^Y wA0]4:нaE3O$oLs_9,t^,]Y[,TD Dujn DafZ)3cw1ְSL4)uq#ލ`Eg+Z$W T @<L3׭ \By+_޽uե"eMacrũ=Jvw% &S\[^pDev1TK`a$AЏ殑o8;b$ñ軲hڱiFu AIYZň^Qk0 L_$h+kNԁj d8c(߂KD* $֒ n, rSNn(dc@#Z"*3lC Ǝ) i~(\3ɎND0k\t*Y^+/% Z?ėV/@j (4 2U`YpV+@t'֍a,^͞R] )I4›^/> F[#Hai0|A]YI $,X` ]!TTIZ0NUfGGGp#:88aF:͝߾sعm]V}XSKTq 8GGUՍJ vdP(OjbMn78p O&PL\+l[.<ɔLފfA\P~U8{#]|˜p}t2#sȣi!p;ր^Xd  Pf@Xƌxr/R+ )x!5 -ƨr X-;6 2/Jcňh ^ry*v@xyN#Nm&_M-a{~|OI! H LY-R m*n\Ħn^k9A 99IU}U"x)+^j\$n˷o5z%nOANHdՐʪʉnKZ^q oР"T4+v? "ͺ9˼ڄ % dۭLDJSmxPw6"=gRCyXY i 3\-׍(_./bo*֨A IL𓮮+B @#@b8P.ȑl:CIUUlcҴAE-+. ] 6n dT#"aNlG:bB^7>AE埰GډY+P>Rn&+BW/\P-X0JK h_~Lޜj)+I*O%кxj6n dH 1"ƜĮw֋YwJKAR!KK&CT&Vp##P/H> ֌Aw5 H >fT, S bcy~}ep5<88hlB~0/";e&SOӿ?Bk>Ih%'J`QM5 +B Y*L#^f:F7KƲΈJ2"wIW&6HMqDByeDI gcw,v_G1BN ]~t{Y8 C @9Їy.\7  VU^T7Vz lY,F?/l HI#"! w:;fJ,3(|!ɩ P. 3R$vT7@Udn i0ڕh_uǪyuN۲ .?.] 1 1"FDcjxNu ]LUri F ˌA  JbA0a%X: 5B8&_DQ3%adLâ%r| 'Kma4Ot*L`-5t]%T}%0 LQ(T%h>_ޕ#?x͉0ܓWSOPT#)4MF#@u#ml_ 1zOn7*~΃nL+UVH1q#0Tud W!LvU"N\vIhPi$s¶-7WbQ:]>awW~'Z}N簼zM 6 K;|( _lΤ̙~Y*^,?Qcoj!dվJ* 㙎#*w OggS@md﹦0+6;Q0#$!##" ''$$"  &(vw!  " &&Ln#2& K{(CdP/Tk&hoxg.#ca?ԴOPּiiҞo 7ـ&ۭYN8!سvY۷-[9XצVOnI,mv13\t3ևQ,+԰"F.TI$C6NdR|^/mҤԃ{&8).?%Ƞ+,eu^ }kk֜s9?Z)r|3P\?cz}9:M֍Fk`a/yYF&5vaaŸYe{êw8hPmʊt0jCJ4V~uNa<,ݥy,ߣZ,qy?ϙzL<=|+?_Dr&Xp~|̤AelSJᆹ\{6uG<&^gm|x8;'N(/vyйbs7%9% 릁<;hվҬ6rLTh3(h>/V*+.;aLVT?ʲVQo Q2 (&$!DJg " !<:4FzBٗdJitkG`OLGqd{io*\!+Fe;0(!8` ^8uPqrlj^hd)aq#+L2Rrrejz3[}q,k~ m3P1h#k@AkPہ+oHĬظ{:.Uq ?tҿ~ڷ˭11aYc\ CdXԩ,m@M0NJHHhlE>VycԦiA8p@Rj6y v&خh4w.C=(Awх)aEqH0ҥP&[ LU=)RCMZ6P*\[Nʾ`=`:}ZToC5]]\YE0db` fS~Ub\]7֗ȩ_X Yu;ƤT.TQ4H*VP.ᆕ\qRVkz$MJB*bRmy]8a9oJ(DUjʩ5O76 qSuݽ. \UadsU0Os} _'7VIU ;\_ RYXpV wՕ'0\[۰_|&vJjz^X2:Ew T#~"3Y\,bi`reJʒKNjic8SX0S{" ~$]5UL !"X'ۢW83x?<} :gXyI@$ hc`A|]Dd:$! ?ʈM_zt@2Ŀ %*`0&$tlHmfJ5͝p,{o,øK<+nc?T&Z@P >hvT7,!*v8,LGRdXy~neH\F%ύiP󣪅*i-LK)5gg9;<1}MT<,< rb$J2 D nnFH9P_Zxރ ^`M#t 7kNPa`s#Bg%BȌeu쩣^n[fl` ,xC\G컥nZzH>̩awh+uR5H'qJ6iEB~@B}TP,Zpȡ L]ë n}Nj}vOd7TIgjTS8q ɜ%qS.Pl3MF~8CU*@'F1ϥ\l4rcNCdOR P FM<(Z 4>ln^CJ zĸcՃs\ႢE(xO4 2xy=jK&M'Ά["c:*Xh`7 &b`=` ѝA $$+T]D5ѹ)H;o X0MOI=[`@q)[4f+̬)N'P G@'8<-.>X."p#_ &(( cbEnD@@D;6Dz5Nz)doJ.<U|jq:@J$HD^%o] kVw_'\\_6@2n ,P@AGinFKnBDX>VfCTY@te gǻO7-zA*,XEK = LW-W]ho>?\$6#{wSz bK,Ot6_i=K$ĠKLUb Qv}w}p! QtdY`Pˏ%}euvjq(4($eDS\( ciǿ<#\֦ǟAdDEd]fP?݂wJtĔ?-R/T[Ӗ0m};W(UOoM<&{f)%7k)-!A)|DDYuBL2e|{lQ5eضӳ^2qez|g fH/c.&U&B #jBcJ+k(/Š]Wvw+lR?QNl> ARvP..Ij0!tz*P@C.6|\æV8D$SW.=PRHB-.J"BdtD[OS=P2(KTD*-&Gp{Д"`ŋ Dhy|SI[)·SR)`raBP"$jmС!Ŵ$@hܪnE0Д [ΤlY ;o"K >o*ĝiID) ^|.1\BS))D{\Y@F t v]Dzp֠k Bd3!b4=?u^bIsN:i7Wvfy;u}ǰy$[ Ĥ[ ,!|\`gp0pJj|OGHpEL΁4Y԰$=!/$7)!ZÙp !JjVp?{[ ":M%Ä]*-) r#߈p#t@ j#4E|B!UZ"i%6iCDB1_4˿`(hita\=|$1&jJnظaoQ .eL@vXA(ȱS-C@G`q ڇ#;2VRo>^j+~fQm_zLJG`!fk:R闓"m:I:~[˽|voM]Bm$t[tnN]h0MB@3R"cq*  qa<n ô c^u VM [abB RV,&$&R( BEOO/MbӍ=kD# q( ȍcP Pd0m H8X#hw hS }DH.&On2VBOggSd﹦0-eK0$ %&$&|! ! &$#$ " #%{~|^6Lq p >O͍ D2.+n=,lԄ"F MWS,т:W .. 6Mm?C]'ǁ_@UPPZb[Pc7ay`:Շ} ?knla1jǵlKGcȍ_'Rݪ\S4% їW/KFpLWU 52_5Hy պ#VxԜXj8\8BV 5ZPERmTZTWOV8Ck)-5 sfe4"cIYrU){tUhem'NZߞoڽs:.-겫XSBgUP X|w97Y:QCȒ,nB0K60TA,s> PQi\]OD=^N|\,PBqq aA`).nLK@x>: , P* ZAuW-. UHI" v:pAx:݋~$9ÐI$!@"0-"X>в8hUp*@772Brő 5țUA ꁧI5; @,`m`pYNTW+ic{zhM}bHuV"X\Y<6_>my2xFJDQ†vU`*4^7'ڞ3(M *먆$L]"6}Omnƺj*DW8+RpE/U!w-W[2LY"  _H=؃1LŻ٢d½PJTWd*YN >KvgB77bDqI\_srX'b&5o;gޥAoX+ZKFR7cJ ax~NdNb\WZҏ8k])K)DƮfK$#i \k1^J2lo:~wq`(n>GuPltx) )hFu2"5Xbai~^"rBSX24c$9),݅XмBv _d?$UخA&("|eS6p@x4Tls&dsUm5lBǟV ,OuiasNMalٗQ%{`D%@^yP.(n74h31)B}k3N~+>vk#*%ƨo2ufY'ӵ>b+?|5SX,b$8 ?3 >{%1@@ cb*R򟦔ZL\ZՆۣ?w"ÐaՀCSx{~h>O50 H`D+$!EBr߮FU6IŵxB{^J ,YJfh,|9<ܛ%IrƸɻ>. $<_pj^\*A$kqn>Ύ6rO5=6/I*=yvo=8LM5;ܖ1ѺL=dnh~YjlӠ N 9FU;NGnDb؊S$\z\e8z0.`>h̜~DP[AP1RHأcq(Ӡ"q@"%ܨ\`-R`am d%TuϟQQT+4Ps Q0EF^\6t/hsYTqBu`0x\,gd,n/-'6K*sw=1uLKzIC3:^<XTcҐ6mc9k37^{ Y),_۞EZ"2["^\ i Rshph:ZЅ20QcK901`dmGm[J3e QQF DA$Bֈ 7$v>( KIv;uʗTg>V]% ddTZ LA2ȐYYJdyAbJK)'M*Mbx.ʵu>36;nt SiJ@pYX @xÊv4:}B@LIBn ($5H Ƙɽ,p@<NsaܠH4f1N 1#VŶq9yRrʺ1 /!"YQV(J{/τpsbH( D# I6NFdݎޔ 4"UV}!sJVBdp!6-n!Wx y1hBsU]R~j(S)u Qo7fUu+T4BD 6깂OggS@Ce﹦0P^%~|t&'$"% !!)#ۥZ:)$ _nNDHF-,<`6=Ylͣo}ލӳv b,fQw˵HD3 Y7TЛ!K&* [G[*# ܊@Xps> ޳_L% w+0e(a#,X9[|lu{?|1M+G!X,Kpm@J,*^ mP7fQ@A-b~ehg5+;zJQ(+YdRu5xH7K'nx;%dVEq%p )B!PWuP#cz?XqSto@^Afdj`J%F$"\vYZDt`a+ɲtd.vfݝ]1}3io2͓fcI6fPl"MYngQU@tMHVl&擽xu[q[(juq!*Ks>Ka-> -h@nn%#=< +5a2N)bJ#j¹LwB'k%.a_K殣hL)]]PWLfuExTVD\. ]~l6)4]cFDB7I-IB55liZ P$)#rR-MRugݺ{H"4*N<*͡kRS:sJ`X% f`SjXn~,VLӘ۵;'H#Dr43e`2 $Bas IƢdIfΤo?V *B`ṭ~. x<V& BXh@fD&9yЧKP 0~X&5"Dބi$7jSuƹS Aa$A451=\'~]ü&۪K NOL)GΛ0)V^9R7 ED\(qV!7G'R 7m9}p8TAHA^|kMhȹF%,/?IkYQ#]bZd`e$D D-Bx. ;,wt~k$eI$-("wr`A iDl4ayPpy|Α,n\.1fcPrIpq3=] ia֠HH$B #_~ot̐%ͷc_/y|) :Y`lJC` FN*25/~:D &D%;6gC:w: !_1*l皙G+s()0 R,=דCI{s}u̯KON 쏔}J!=H9 YR%ĤИ& N `A$$8wف_T[-Y<\y)6PJT[%J $e~hhlaՕ%@{|6`4جsx5֝E@m+f>2V OIVߞ?qg_ ɡRr(C}$Q,JZtX\=_,L͖veh٩c h ;$g/'DvG@#Dc3:?\|l1~7?ڨAg(G_t u6 C3V 9\ޜJE%?c]#D| @ ~Tp(X)GD6/գlTRjzv6&Ni>plFrtsizmI >K8 [?6;e*cV QJ9By䄺L M So7dwٲBE4X!@Òsj--ð ? '|jGs>o\K MΟK9^`rX*>LIgD/6Ē`@Lm,u{%QYP?B'@2dE`Q§G+6Pq@ L8vv\r~,K mF+2CzQT)UF !|0-lGx彯_=~y5jTeJ#? 8E@?$5 @T P/KCA37rD@ s'µ ~5BQk\װ!oflNJx 0EJ6 T!assLѼj>cX²@Cn䀫зԀ3Qe \zjm@ 4(݆DD9euQ$ }zKЛh:kj_WPqAUZ!t/^jP87C$S@Vr38-iL_M[+9L<] \YS5@|;)덤YjMTW8Ҥb?r-@[lws:HTѴ-tDU"طk\WqW|oM"j(\]=(Kcv^Sjx}}Nj2nlaN]=]*SKy(4V쎐vGG[6QFP!zTeNn5SsaZ=_mݮempdVz[6{|zQ4fGĂK._kȠ+KLo~ ߡkˣ*g&I*/UŁ{׍}wyr Y]]|0/8qʦ\}`ak9Ks͕P\M[J)OggSe﹦0!0""""#"!'&" !"!'(###!$(('%$"#~@ju+NA%(8tu`E~jMNtyݯJ4h,J[PR̐>gYwxR'1ZͻZ4m®47j RV=6]wՠ9u5j{k;rwyPϒƍ&2qukLbv,.  _U\~Tdn߰~ SO>>sxK}EyGě2˗Y^l9Mk>l]阺)sik |ݣZ>\rj%{Z]E!vk~IETI@:4!`qkKgSM9ȘŵX0U6sc̏=H_tX#/kC#ztWc+E7]׍/ RI *Ԇhc. s^~?mӗ_ggT)?ˑd]MUK?QVyRNA0H_֧ZÁJ\#[,)Ýb/x>NKPWcҁBbP~DjI %֎L09 G5^5Dz~FM#GGNV5=AXw:vǁШ~<9eRĤUO}# Cmi^~R[jv1n{C<~6g2Xo7_Ze|B9,g}]VeQPԄyYQq#6Q7 |diFCo"s/u8ZOGéH8IOU}D%hVab(z>%,v<+S3>orl/ sGo`V>)-Z15^-cS2l?V?kv~8T*K MC?E+vfQ?'sZ,k6HLrUJY{t3mq,}{?HIp &^^%>ߘbN?;(_n^j=>oNAP$ByA@~Vta6 fD߁54ߩXw~=`XG-sGt!EJZ+s^۬Mp/v<|W~D|Oz:3:lϑaWʑ:3[O?-% v⧜sai{P7Ps!Ƙג[T nh}xlhƪUM_DUYvUxM_`x'!#ӆR|*LD̩)~*/zo~ǰEhj \WMT&,_<_)*y/\DOÛϺch HzMBJ|jJޔX\STwغ\YY"*g@c@>^dA2v_)r(Y+jD=pl]SQkeB;6i0 ] (Mn9VuB\ĶE88mbH}⋰ycuT'N9AX}, ?>  |w7f`7b yBTqaGLYh{Hav8gL L^hdYN`Vh'WKH;1`wF7,+FDQ!nUՋ4ΩqK`j0p|Fof9 ,U#)?:ظVܞer9vLW=) 6bHPO_wc:0=ŭ+LW+|eoAhwey% ʯ׆T[k A2MXpp⺜Dꘅ۩+ Fl] `YnK/k45v:[׳ߏHwϤ{&Ҧa*l'bQ5[^p7/=ns:'C_v98,4-{e/ j*Iq#đjI;SrB4׾+'eWD- i_5X6 7k0D}vHG"oGC2H<T/ @'f"d$$H}S5_)?E$LPF7-UDAus 1ӣ-X_'Sy#LEs(3sTpfcBܳ]A!xHroF*4HMډ=;R`t+QeE#`!-x*oNyQlĐPUcrd R߭s%y`4>3O< @$moӧ')2@/!#QͺT[ne@'OBAcN(C"[f݈0%W6*`"/Ż.|~vʩ\(JsV0!vAszN;x<NP1b1j~*jD;0ʷeJ@A ,W|9nHus }]/8jI<5Gl21:S6f;1h[UʲaEBے{Y[N0[=ww$"Fb\sK{^gZ՘6KGp*%|Ik|ڝ1PŢ~ebII8ʂBVat´x\ېS86:|8TΧgotZt66|kWQԕ[mԯ)\0pU8dK h+Ԃe]2䭳}64OggSe﹦0_ 57"!)$'""!!"'&~#%# (%&)&! ! !%%Ù#%# !%$$Ty6V+{6sݮ=b&p+QL*madwY;݅26'T!p6_M_4"m痀GI"LDפGlh ^J8nc\U>jrHX*  %ݐdL٠+[{W.2=ޥ#Φ_ET,Y_.bMk[tn:uψ <ӎ{_ِep~L; ͝dT \!U6xyINsp])kWA \Wl2/[pcT׸g_fLWduhƵ\l\#:aZ/zF ڛnAYk^utc *s`\eT?9ߓlk畹Ѕ\?; v>}^wNkw^v,%2$id8Ƚ;C5IJ0n L <', !JG"*l;l V&_^=]ވ{ZD@ l`:~4qJ{AȐOSU#E"wNϾI e:‹EyZ틃ѠvډJLw䆩=f%;IpNtT%mseձbd:BuS tR9Q\\X?ֺ ެb1ՀϻXB(0y0j'@ZF"{$e{m&OGŒb5ةBzp'X Ф2 ݿ06^osA+GeENpjtpg";z9°k^ܴ#DG1<|Ip*+p$JDĨ$(Ꮓ_єs>:|t꼨֥=!}pb;D \;[q 6C*th$^l}ZA/keR@䲂,dlkx|N(Qt$0BEǃy/?[ci}!ĉv0/swBXѮDK#a:o9v3$WT19vxTшV1[I1V!41;QWל:ɸqr - >mJmm;#]TAJn8^60:1bb|.gRy4=.ϧ0x$:>G"@Sxkn- q, [Fޯi^(dC'_kDu~-p|q sέ'qr G# WСFԱDTɻ'u+dSܪ ^KAJ/ 5,eA»t(1WgoO]<%kߛWWN0^<# \ Ih?e M 69#l;/PnE?#qykgcfjk>ӝ'+FzcL!Q\V _3cILa^VVF""e~IV?. =~ iYq[^@ NK)Y f*LzoyW%{Kv$zTڏzDB$uy1eaFU|Pki9 p$#}'rZ%)^?Q*o2F:v5MGCY$IZ18nlŏ㹍-L5vSyO~8>.q_vR-$y]\˫|wd['*goiޟ@ä$te\Y3j_m]=xgqWmp\ \Y7qBjֻˢ] nN .LY?h"7σiWy}UV=A\W ھX { eJ(\Y*:vql=uooucZTcà H7W%ގvh5v m _,>Pv+aURD!Ĝ~!guEi_RqNhfnN<).4BНCo4&T yYbt b>fӝFۍҞ_XWgd9_ǢN=8yɬ7#Ǔɓd-%8'׷P'5x]'ORaK'R|LKVOf'`k8/$sv's$M1V.l15IYef.7A}Ġ G[д8T = )T%HqgFY]6TȒ @ %|ޚer0>ލ;;#gSY!?""yb܎FGM;W/c3Fv\Wyb֘ovMS" Im=&P$%T^mZ `4`I H`B5gO£9,VP@kYDktV b^: f:A?r>x2'֎bZ*M_<|${O*_w~\ܥP-qF]#|.P !I$=wdtf2@}!M;P2KfQ Q(+_ !l տڏïvx#˯pgm0]zRqN+ TߖS6 CV .B "O7*ruNecLLڼٹ0t˘R= N.oIcP!e ~JH&j!|HP\i F,Qaڥ&RrUQH$v Z%t}fo?8}׵&O1^e&Ɵ^q])m_up5K+h^j.>KMpesD(٦`]ɂ3\OggShf﹦0~ĦC,}.ISeX!>4*FU'"ri) 9qø={9CTAsi@ LãCJʾP]6]~ E2 +NPOwh{u%+P%m6"qX]X= i߮wE^oDd| |<_lz<Im޾sZ1@ b$U}1Ztj瞹:U>yX2Ċ A2pn%ctx.*߲?7gi~+f$;a^r"zzca܍(*_(*@@A4ܞukĶtN| 5vI<۾~A9i3λ>S~{cvs6KnnJ책ݬj)vl' 8U0LO 1G:>4-LNL>rf rUuXۥvO"l1y_xk}̷rE3CxzߦPN|.#[?.PpSu#,3#-!s1 bTl^SJ@v'ODD8jZfickI}~mr(2罆Ǩ_yt卲%ڇ~qzIQܢ77FZ{Y(_o '*C 0M %#>i?%k!4 癐}OUODP}g+ug^éudxi-Aŷ$Fd @ jk4%!k\*mjl5$ǖZ.I <Mp k@ev1X`DJrtsnu:ϯ'4Jlmk. tJs'.w(_)ͺ:ϟγ7/ڹs|m~oy=ӯV]ȹkWzijP[lEޛ-I@r հHDTTC?U%~}ge6:Ex "+iVzbݍ]aEJxYWхR"Z_ZydGDMn -"DhWwi>Q><S`@>J?4|zZB?_c +gHQa4;+j!`]$j;ml|A|l"2PzCmqV 8${ ksӔulhya D`GEFR%te,p1ȅJQ9:F#ZݖL\x8'|SP&>l}tdP[vBЇAl \5K%RM0Nwc#l?ou. *8zl~˩zF׹vhƛ]qڶ;7= ;Je]* u5<Q@DLE:V!ٰ,RTχѵ,sg9Í׻A`~W$`ӡiOJԨ|0U3d &_'fmﹾl`Σs]6n_+=F|r~*Ϡss'7?/iaBUTQ^C[% %yx&ip,>RA!5 3&,%k"XQT!N mIYt=5,v`:@mEԼp#qG_&8 a) ?+<+~|ֱ ϧqZӊϞEBd VP\"Uǩ@YCIC% eX:d&0qRl7fq]{HI燪 P:j d\>;L NlxwI ZH hu؂plN̠FĈn55u]. nMs [V lP diYRXQzY \ r{)MKRpV' 0  &|" -D*O \\K!K{c+V5^0BJqxQsLMbZ20,(aH)#B`{}{,r5%]ݦi n-ll `x'+ 3 y05_>X"+֞ c'5 e EI) i ۈGd4p-/'(O[=UX_4py,X9t*`X n]_ZGgt7& _ra0`P$2"aZN8 #Ȉbsܴm6~,3 P[Si9h ، D}`~`~B ƈN"!{ƺ0 c+6 "IDP(q9z34y.5ݥ¾lk:ʽq9ᖗsJ@cs'8K \l9M`ZyP=GQ~n.!R!>58݅?l;.le0A` H$4 ,jQea#,w=ދW0<4J~Ip(*$ *8((GP@:AȗvS5uܨGtr6M,@P& ! "I($Y)O5S>ə6y:{"Qp Z$Yw=k[lTlF3ۀ ;]x؂`YKځnM9Y5;Ї`9Ë% A BHIH S .`}#OKs IAKD E;qVh1(7@1ML<'@`"Kv,Q@\ݖ%(@A:RN J8MxB A(Ӈ$ɲuWmglv=InC/jR^ދ) J`wLE9XF6z4Sb%Ȉ,<;?(ދf+~i8dٲ ЗyZ)ɔd%u~C˱+?OM0@ZP4 WA`Ub72uCy )H?5@"^{iEAKqg{T$yjx)E2ED D$`!F=XWᶑaw&x(@_POH gal 0F*@Ўpjl@W #X",[6Ȭʠ_YALN=~ 8l0l@)&$Ew[ QjʂfpPc$ڄMZ0dZ)}@E,1 >>7OggSf﹦0J~;(&%}~!!##" *&{}~*f,A$pc *L8>]v]ЀP$ "7$x6=}^6v"`;9% AHj8T. i FΩ"̠D[ 0JpK`>;6?2 W?+6i2,f0~] 2L.OP:@ VWѯ@n -PM&L)C!F73H@:AV'P >~U[vl, E_j f}*-kJxԬH#RKbC-uCY׀~>؋NUx.6R *H J`Fi*de@ۗx8EF >;Xd6co4Ln~f/L2!]Eaaic Bho&㦭VdUjq/ļBROӗf'P 0H: &X#Dvx w[h0œp#*6FZȌڠ%\c~e.ws-B2I$B HCx eÁvqJc@Ɠ pN wn J7H0ȼ0%vvqc% 6f0gDM PfۥCJ`?6.ZV $&j{n4 Z_W }GY⷟n!l<g @,'u7 (pZBPa\ D;܌HX.LS8T/VY;髄B]E*DUiD6\ո_Y/S1Sm]5-DURvwW犝JQ9oYZLQK*X㴏FA`~8I٪$sRﯜ<'.(Q"4c\zp;*iVJn:$8bd4 Պ2@5;Tws@7qwipܓbXPF+ÀT"D^kjM}mXȿH?5"%Ui1ţnFҝiʽuUSc~Ȱ(\OP3T%Ft YO pET伞\$lX` " AzHM@Mui.HJ,gc\YK1OOkl|%1Zzف0&(zWyZRͷ F)_j%E\Ә03^uZɓqÔ 満8xARD/uŤEj %1Ogwvm ރdPcG7zw~미`eڋ*x 32X~6rGՐ*gdž*x_'\}HH)uiswj1Tp[n_),B`s@Ė]w9no +cE*Dە!h8-0s&d7x"<C"ǘHḇ!{P ]r)>UrܵHJ `h s/sx B + @$ZH(S6vMcV!ե~ݞs1A6%|-Ʋr(}ۿ"=a*3PB2ȉӖPPe@|_ˍIB - $"p ]dܥ*5!î/8\͸u=e :,*F`pLsֲZff^~L41h}=3C:[ | @+o8B$*&I]Lm@镤H%BX\8W}?!R}؈_^ͼŋUP$'(:kK<ٺOT_V0Ϳް=Y*LOͮk(޾>^\(B\QpTST i~ˡkJwk@uj[a TU(*n'@PR 9! DYڨh>Q>\IV[s֬%1*d@T(^jG``[ߧLJ݊ooJ\_1|#@o _'m~2ENTdPF_3(8NJ~i2QYdJ:b"JTHI:׺Tӟ d+ka#iIO;y-j:Gi҄ء[gGmܱ0RкPfs=1K$uFP jdA9s bnqO^ϻuZhE&!ToJZY^xSH "h)ѣ D`AKci˞i%`]őՖ(U1NRؑ&rۙZ>peܪ#'O0}٪iYw  DW8BĔ {637g "|soe *=9\' pZ1YcN'YdtqO.SnZ@ n|*@nGPс5.w%T#"ul]f')P`򄧡Y5 "$SDX;8\?ϊ{~(иC }4Be5~vTDYܡ T#ؗ ~Vx@B +pU4 Rm\p(EG$/Kl]- ~+ֻ`a( :u@.Z(b&ip䲲$MI݁W>jcJUE5ǫA 8\pZ ^5til3ݒ=zQ\PzƋCUH84 Mg4g@!^R-@1z|AչXm? {rR4IPӀ* -Ip^5x}rˑq?f$f8HC) <\2P܁{8=( *@sF2`aplr}6PS /<Pjۥк(ѬRY+`eD̖5u7e|F_>Dٗ^Kc;z Ūyu5<@_`~@AA8,f(O"` ŕ :3b bȍN ER>WT5lɼDy%'wɉE)c8iD<긯F5V./y(Q,FJ,n,Fe/o#bx! 7qjPH(DVЧN;lb\rSNKpCfd~I#6?;[^nVAJ2[_aé\ڹWVHYFuA^Uf%ۂ"H7y %pY?* ~k6Dh&!P"4)Q6~sj.ɓ7l_A[84R.X vtB.RbJ3_;#np8D9ЬZ.:舋e3 \WrIe0>6jR(?%"⻴jڣ! njh H3T6hPpی5_a >$E3#E{n!ƚQ-:"'iOggS^g﹦0 ~x}~x|ehÝݓ0*6`r*t"8CU"QgoFGo}w"l/{ ؒ6v?V7.V3Raw/+yfYwcZ"33*FEZ~b21 {uI1/'"D/|ݩ57}Sѷ1_3Xc_nE`d/H8pI'*n\.1 4_RCTޫIx-xX'm=`qV,s1Ę0HK #R7~>[:ˡqBJ@0iTԆ10,nb](2[<"6 @Lw(n鑿FZL@9J)`!5Kt=MR"Z~:a^O"广% @Ϭl]p6(3 ]Ah)>~r>K)1o!ImͩPp&;,a FgC+0 `Z~ۮS! Am}*j8HODX=_vN/l7xiZm! xv,?7Y?J+@%S`Zw$D?f b(%~^퓁9w<fl>O.̪juLEUbЋp 6M:ƘWlΉTtC8,2<@ &+&5G.&kT5*+*Gd~tõ`*_#Y;Ek2ITb8=92S Q^ӑOnL|uG:ߕBм! ػRCdE&TZFvJAkZ`ARA\4=kƥ B.>[bLGrs.hcéqլp"Q(Q`>_l ׆qӛh?+5 @YZ4` 5 O 7 G+X ъ `obfH:ܴ694 WdFxZl(YQHDDu{K$VUm rStB0~ H~ 50\P+R\yj1 "|˫q#[ᔽhIPGetSU5"b"""umwz̻#? VW_='*QNCcB 6*͡U!T=!.`%6Y7#+QM҄[Hޛ>b.b>x`%ψ(@®O++bc{WܮN s"ꊷ^?9 &su`,se%yBM*nފR@^H0t5jrcpkA4e*/?b""L|êQƒ9?_{Ҁ}m]1mCL'xYLjy1@ D */SjSqPJA2nLaJe^+NrkxDr ђSJqU%7}~`teC싷7D@Y*>oB (+zF@oDfXM+"u>($j>pdHGer 9XV7 ǻ*^E*Yr.BGDwA7i+3:k8iiakHQrrv  \yp=:?r`oъDdLlVvhAqI>ʕ^ IؼwTbŭJ>ޕG0q$ ߂q*}nBؾS lӚ 5^N)Teq1amdH%U=Bu*T9 km \@ {8$J'@~^l/N+[:V׻6n $mkԁG:KuzSX7A]Ԩf~ iEiMqu9@ P,إ{mͤ#nE.q_ p{8-r]Ym?3s߼ g? "%#0EL%Y>M߿nw#J{;\E!h.gD R-cQ[.21x:%37n]1CJD`nڻչ-`xұKSEE@_&PQ`C jZص,\#F"J?}`1&mA% # fi˄._M v>_yO {KF0xӻ[շU{ɡ[=mn 3 ]Zg+ .ȔƮKX- ˪ *Nt冁+]{R_| gBît8Mg{o%O7^C5I[zN+ Ѡ<KUJY\nU{A-ۊn 0kFJ89rJw6"Q?@dg,^eKo@*8)ZY G|B?T>(M};u%)5KT71Y)YA$;`lS,-⍑u.rTx%Qdqa7c9]NuI*` 6ŞZia ŜoXT'6ņ+ׇq o #4@Yʰ[~J DwqO5(S): a^{+p%_leҠas0Ϡnϵs>(gq>:Ki1kѿ|q=\h,H60cUX4AX~]|y;q EtuA~'e<%@-A0pa'A("#S_V,;[VTIc>+Nr(Ni-y-HgzbZq @afdܜŅo⼃{Z0i# \݀L=캯iP ,*Xj& kS Ucc5N?uuO7G)TRH1G[^K2PKn0/f@΅$ }رCgoIhugݽ׮)킱?QAꍮKAyFnvl{LXIR.Bimѭ^  ,f u/駉|6BZ?r=07Сšjz3X哯cڧ kj Soh>W$,agBFEIAQ@F>fۦ2 V ͧcO٠O d n#@^S)=\խu&_puwbR؁Bn=AJVKJA nvU}^W|KI@QDAyS@:. BAK1,ˁ[x,9'J4Ab߰>>P.fSP̎ ^R ,zȰ:v=BiHumѰ@+>3OV~k6^09l<_0n!E1U$(  .x%xp !C \BS2"zot~wn\M[?\JhZ۹7]1S5`I9: !87/7~;c3CJ/cQ=.ǭ5VSc7b r޿`K^6nǣD[)z9 jx-ͳ7~pp|hK;kEǧY!Uh@/`aT.-vכ ;]ȻzJ>8/%ꂅJl2`]t[bPl%zXUqJ|L^_4X̃ #\p{Z6lD ĝj <&k޺i%+>ϭm_ʈ뮽EDb+ZU"`<,R =|Ƒ >nLF/aI_"W ]Ze&Ղ3E{Fh 6CszSri[wK!(%>pfݪIAڿ!:cX0Xw\Mz kk35 Wɡxjbr8z1[?87q_44)6> +B; #]ChАϚ~ot\,zTHWb)+17Ӊ`ƥW6Y.Ha@un:=BKcY %z՝b"nC|k3oT'F"gmP`IxOgӮgDDϟ^-stUG N[-|8Skqظj'{L%ƘlȷwƛF`F]ޱ V>:?NٯH1RRP-eai MxN #xh"u"*OuO4ijpz qƄXmvu{;^V^YnŗJL ha@X<3Lt4-]J,k"+(.*ml }|4\?%J!>y"@dpQunfTI'9$'L'zP+`I*@ j/qĔouK^X#XDZ%(2 pIphjų9"c2H `L gO)~a)?N&fhޢЈ`)1n,vlALӃ9H0"AX^Gm()ֈ emkV #uG! 8EAPopՙJ~^̜&&mjKZ"/?'Fx#SgOq_Vq߫dޯ*Iș*ZTL&<ܮ/ܝX=cSlf ^n{yR1(|%zX TJkL sg9bh p1{ \z#in,p)̲7~V_Ja#"Y;F)@3F9<$e5b!Zm鑿XKQfyVCX,nSzn͵h!4{:bdP 38]o/4>'ǻ\$ b@u,K@nLG]_:Ŧ%u#$bHѕIԃվ5#[CRuF19xaJɊ ".J.l;'ڭ$ ?[8*IgDufԃm2FU $DDvVOֻ/e!Od Yn w_#e&GݮՉ:KR;& jD-z ` Ir `(&נ=I ,SƧ8+|h"">P4XI^=D}iD 6M@|Vڐ.n2r 115CSMN1҄ܐLb'h'7S5c"(W^=KQY/{DZ͜Oﺲ{_vR:_~W8>S*S 9~&㣽k|jB}3/RwgwhHBí5Qt@HQ= +_TM fP,&m|5.LO4`WW v9{Kz Rr׀WO|ׯz1^qVNK-K{\ݿw x5m0`j |mC?;)tX宜"Ebԋ9&c 4Y1L@' `kn^ )%J\cy ڎ>qI&7\>>Di JWfRJ xS"FlUR^){m5ӹKY+,A z˺ǧ+>ڑS>km03W>MR}Hv'Bwry_~>c#K'ƒc\d|^kIQk%Ee S#;[XS#jt5$=c˕0sl`P?MD^E잟LuWk31;&>5@SKf{]@t  pWMP҃&jCfPc-" h\ \7vh$?"ngˋ weW|锈3%VW}^e4Gyw~3"ⓛ)Ld^OX2:׶% "T\8F޵brdV͍1܄ hTR bÆΫݙqsE^Wtg=tϟ=x◳qGJppOٍg-"Wb\Dpa~ z@S5LggT)%""wp'q2p8=ۛ?87|hfpM_ȶcƪ~w)Uk.0( B5%֪i*D# kofڭH*$bbk=K[TCPQIS#FiJdGO]n6NrHx}XhW-vz!B^ɭ$^ n(7}}-j!VT jkQ F_7T*SˆVR*\qfb?t_y3òI>*{ +eV kf˶\nNfzshN1W~K,WtxA4| ઄Ҵ~E' ^ ⶤV\oç9EONx,UggMϯ[htio1G{`NZAX70({snoXEAydMHx.u%F*YPv+}//j8y쉤C><ov\O<=-K5zSok_[O(1sM{B>ydf~`(IuGIV NI})\ukAjF.Ǵ(j5\InO0t\9e\*ZHg?x?æ d(f5byrV :Zc<."ncKʬ;.܍ ![ׄ[k0sː-+RJ|䝅׼B ^`"OggSBh﹦0;a>=Ӗb63~` BO{r+~*ޢ 9}W/iBN54z0ա͒)Zinzk#Txu LPP+X">̲>ʭl 5 \OMi56ap: @k}}=wڶg||hzja]vݤns0zF g[/FlZ%[qڇ #@ !"z RCAwLhv^@ݚԖoGچ*?x{qnu6U=¨k7Ql3B c0c'#PZHdt_c48[b(5W -b:#!v %W:k.VU)6=ڋCs,"@ċ@՟~ӲjæCP?k6=ct ^UK7Xj|pZDkRD|{t(#5rUy? 08cBv [u.GJ744*hDLL}4R41RsE̍΍zy7UY%BXnPR H;@q^ʭrb{V[8'0ϿnVg"_~s,:-D+DĜCoViŔ1fެF% *`T3v,?Ik%{DSk(f\_`|LmHeth}i$>O @? x7]~˰~.A#svb}A 1xY|c" l+\eܺ)brC>u1TJ^PZ75(‵*c9? D˝%v--5^-h0i>j(P>(oja?-owbe.t.|[B5 5uӲol~*k}gk8|!SS5׺HXҍah.VA~BW~ 6'pʝh._=ۨ(:+^&л]7;ѶW{]pxx0b4ίhcOFX Ia_r3lౄ[k W` a1ˢc]#,+>IBEB#i" lΏn'.+7XWb4AJ!{Sf(Gy ~ʝ6d6Ĵr U\}H6^89U dNB`qg'ow}8+U?hhYHg@w vYB!'F*#:RF`-ajq 7|yutk4*!!l *,P+ mQKlO??cM?:ωRܛJ w:̧Kޝ&~Isp%Ӿq1Apk<^M-hW] pu[RzeҩL  G,`aU΂" q\^5`5 (|~_w(8`?{9TjsvxE:gx !JX5*yi+ T %t8ujWfB+v*SRF1YH k\TTTGEM%no*wP$F<`Jd][7Q׿4{}8Wo 1.K4z~j3^l-ӭb 0>bq3R|xg}j7b*o(ŧp!W#u`-"" -ӂ[5|^T}~O'"%{v?Fnrn>g?-XuZ&JEPJAF:Ih9̨J mp tx'c&@K0BP;ZDb D%ʝ=LprEV紨?%~-޾=O^}]ϟHtaI;DŽZo H-cWjs3Zvjrԍxdr7QE'0=\jDW`x$X.]-v&y(wVL@x Oî\'?|xuc4\w 9+5ִy_mZa9v{G=j|^G\;|zO,P*kD.>ʭ&*I^Ay>oFu kpQk7Im,g6ߜK).I @ dO]׸gjub;L)0!]vW'>6+țo>ReΧ:+lt?ue#_VnWv|IQ-*-H?C@CF Oz-[k؉3bulo!Bφ%gH VoIrVd}T1{H aFC-Ec8'VjY!Fӥ:;>r$2`Mf&kDK&^I2sOϽx|2v.~/3X֧c"(SN:h; jXQ; eeY&^"XWbB CAIdts+d/blO[: reشf+OggSh﹦0UWʝҥI-%pʝ=Tf#˻t;k|3Ie)NF_,F\{LFmSFJx`'r=5쿠 KJj5TVÚK1ޏTc AFMi7ed맄7-xZ(Qâ ɭɀ|^7.2xy7]))ҕ6q7/zw}F|YG8n( :@8 „8VLMbi,ӖO* kNq`e#rAt6^WZ qhWSwf9PlQT,h ɭz6"=oX4<.pybsyWV8zXV $9Rc w=#T{'Z0b-߆Z3SCN&ֽe\kbB" rM1 |&1LEtǨj>p[4qIQ1n9-^}=N/D/DZS+Dzy u s TQHI߈X$*p( ݊z%G]՘"A-5ZIh S(߉ >iWO>m]=oS/pwxV7:p&onv1 xV|3;uaM٩ulo_IɭSb|~`|?`/)׷{!OVBN}yO[܊%*6g+:{eњ]{zQ/FϬTοU+J Ζi,4=dLEԈk$ɭA|%B%7e>^>j:mv}S"Q-uyn$~훼pRCIՠӦvT-XZeH)>YNU q %ke5CH.1j5 R# S: ^2qICdW{ɇOA\a ЧRHH@~MŁ\#*7/*v&<O'uÏ{1kht ZBkG@6VWC4{hc!m"ftJ&ޮIYκYo6/z\Bx4ӬvhkSZie$-&9|Ycʙ0/ع?,=290 V4 `lsu:߰ &R'̤R{ng+SM7nS㏻r$%g;F,+b\mE*TA>(M_i#WWL6Ǎ0>5< 슫s75Y)֮_7]6*סֺ|D  X59h}v\R(6U@Tj;N}i359~afmpGo#g '/Ocg.?ւwؗO1u6dOI*?}_Jok&UԾ2JbrƹđH'd" R,)EYT D=[rܛU nQ.$ɭfC x>_4}D8}ܷ6T/%q>p5ΈG@"Ÿ9ku=AYYz.|J\j.ؾQseaz>UۛFܣB0~GۆS(m[ɤC0O?p4.WuzGYn*zv!)tpβC&aѨY:^'-3|lpCvn'&XFTxP ۺg#uZT$Dɝ5@$W4z>cbW9N$1j'.$t~p]D/c#R)闻/IOde ޺_8)5_F;]5UםG:xO2it BYsXB'CV .ɝ%@{ p/-\?hZl^xzh]!u;ϋZRp*rE~ֈb&dVFfd4KŒP;H͍Eޘy'J= -CwerxiIü@o7lD鍍EK422QVz3 EXvKc{Nw‹I-ur+7CJ%=]I]qV\,\DT]-YKU [L6nu ri}{{|ṫիypg3rZN=GLB0pnT\ԙ$NpBȸz hZo=)\0b#aR?7`:zҖQRUU$ɝ5Enωa|h\%%Ek#'2av[bvίyO `.liip이VJ(51/·6kmU]CH* rnˏA+x༫t[:J@OggS"i﹦0CMZ2:J-聋pv Q.?.^+ݘ#H'{:[ju: prŊ4J pQN{ԖJQAݎu"1f'z(W  M-g_${  ϫxe闳nz zzfXcʛ݆;r$VG_|T\<8O}snկ:G0ʊN)v~SP QCZ8HDɝ5%{ r Oǩ9 AH׬ߧKғc)sSYX:ꊎ0j|fIk[Z럥Fcwav7LJqb# >kJj#ϟ/6޼8o/'h])֧/4=UL]w n q4@Z[F떈U5p?uTEɾQK+;wgCoXw ȭd19>"`1\We 0?=s솗߱4=t~uhV?_0q'RR {VSވkjZb~׳ezʦӠ j^XY”Z:Eس]׭iv 0\$>M4ܹBaL*ً/o<0tNF 7 תsNۊk 3[#a}Zĉ/gDqfafzm[k 2UpP>Uyu 7}rl& B~-d.J" &1<(`O?u$hxx=xϢ|Z^\w8-WTzLy{#5RS8oa>S 1qR0vU"*BpM64 DrgzMk'ũB? w~_OX}ڽw1 s/"RSްڋ/v>= jnm_Wzt4ϱVJ \ 4LaY#Jt/^ a~Myމݸi? (-xxê?){54kyRzH*yCG#6i--5.L{C(ڱsѨPwg!2\bfVmWkWzƐdâ[P~ȍo'0ɝ#MtӍJOӻ_ι2۲^q]Tۘ)2BVI=nD$_m7i h=vcޯ vIxH JHqMBݦqMB >=A#wtr&ҧpsHin-K] a?ь7JA 8t&zS:~r!ƍkz<tCJo:6#RnLo]z<8uVJKɌv Wݡa[_Z^ɝ%7g+F3  #!hn*{G~&p0{U~&έM%sem M!;鳹Dk7/5-t,MjJĐUo:x~(7컮<>ɝ% #sHnѿ+*G"99sr;~г*kfՃO] 6V uq%ib\9E#~y*<7΃ة[JV`:1N r8:,{>@nBH@~r[ xLx ^4m|$EdO~[6=q轻hzunԊI*{c115G``O~詫L,>CQZѱrG}F=^ ~ȍHV#g >4NV(&.RP4N]dO. U ~=6 m{N0_>fKftXk(*m^ZN qF~ mcۮn]/t`O'̱Kr\.?ДJlWAִ;g VA<T #YfNno^R{tPByxm'6z] jP˨: ɽ3oGh~`mc*"gkteo{+DH}K:vBKeu?vzËys0Yn,#PSeM95OtK'VMˠ 0Y@;JS* V>| oi/L9䮕nZ=6DR!U%%p&.O9[EBȝ-O7,r{$sWO &ϜC5`/eY-Z xuuW5} xU#"@ZuN-?D0+=j`.bzC7e_M0DnP;X@c~6ZSZ?Ƕx-MGgӺڞl)GH﫚+KnvŘ)VAqKo0uϐDɝ-,An2fArJq ^5G"ht$3S֏]5N2AsG_4ucD ?\+.(/{_!,/w˴6ٵlq[T\D -tI̛܀<5 gl^ ۑaXx>Xϼ+UT=L:`뀗֬3eHO$_ǤL-n -Ծݵ^b\P^70==#|(3PRBeIe% MYWޜ^wh>&@6#W{#Uy5ŷ9ڏ#ɷқً(}b+nFRbbK-pA~5t%w[ /*/7Hڽs-_ڱs?7k\- ;-]!{';?-|3C\Ur,MPTGvHD3 1$ca'XT3; lrFW(žz"x_<y}1Σ^!.x~5qRp 3v W#*菐FOH]2Ff&)M]cZe镦D)ƭt](ȝ-tgU`G+tE T+>WMxK<ʏy8nR?~mAt3dpHKfB9tZKX蟀`넘#~Ry#X \Ǖun1ƨv1D(^]%d!h3XOGn0qv.ԤK;[؛fj}搷Z mMӫANJQ΄W70:oC&?ݍ1JfxErBD>ӌhH^'gf\1zy7pʩ/B4">ukXwVߴ$-ٽoivQݺ/kv_8FofʼnCn³6\#*ڤ~Og>W}wP:eD{{VuAA֚Ap0ʹGxUws?y ~v& BrCh'ʱI#{c:>O Be ,Ti`aȝ->FF(ߑLFـӮ0~~w6>0R&3[ݻOIZ!rPIő\w A;{kpjZkb_z5 HK,/AR$B~ȝ#t dk?⁼hf(ծk0`@ӯѫ{5#3I7x# o;H]|؞kvIgge7b.jyΫcB@(P "ȝ#72܉>M ʩ+("l9xá#[h^٤yp{ WOXٲ«J% ئ5Gy劏!;r/5jBL)\I7N`JDD*.^ȝ=ޔbE?к۽; ~+"ϵDc r[{$ } :un$,y@@VDo=q{O0",|Xrrk ",2FR\$~ms&4C^q]x>J7 m݌z1ݾš1jj X' KU|(5I 7c[xLh{3w)گD7l*nz`>dSFgچagca^tCOD%C*sX=-'Ǿ1XD4l Uǟ~%7`G^A(7w.8f_myRZ/Zd7TaW\ `?{/|'q>?pj̅ơ? t2*f\)L0wCv`< z;ku qdMƼ*-1`c.Z6Fc,#VЋ+ \qPCHzjN]*5H^+H63 aqaӉۇI2$5]j|*C%~@s!0#p_ j$pۛˣfQFB EdPKB]nK$ eSF ]y#`kßܙ4Eu ?&V'X{Va]I6}[6A{Ά~ǨQ6@y֨!$u亏20Q1"٪] ^oPk@]+څ[!؀K|P (88_Di}路i[JnDd|h9 uODOd},Us'qN65`+$o+:Wf2kX,[ bLUE$Pmcfc=ΠFR|*Cʉ;jV@XV7 Kh왲yEsɘHt du4n]hCrt#S)XDdm`6*# An5T =xgV)tom+_cXujG*7@NU"DDȝ;!CSmxU~!C܏ұxpXgBiD 6;\0eԶ]߅e(8"wī5ΧUKX@VD"LsA+(Q6Pm -D8S$‹4[O<_鄖׏6_C"`+Jsnڨ򔨃w`uӪ1֎aq= mXB6[C`X99`F=3+` WƊtD?4M\|[or,7JDh[w Ӆ%;BHO}F1HI_AjOK0(4|w-tbep A">=3m ʶ"wMh"t/YWNؖ>Ux.:}Up{ۿvA6].,2%Bt_}*B` %;>x)֒6$B! ^m66]3L6/jɨrU@}ex]" \P` cgJ_ ^eRfaցXV7$_c]a  ]; (a1ܥx<scLH|>{Fh[>o?ݯj.ñ7زEao?L>8c^C"й|[H<ϲMZ@dI?PpD0(ȝ#f2 63&ey #OCLP2@pvym#ґwrn5ަ{q+I鋌GFBMO-SnRY{kzQB"B%OggS"j﹦0 j"|}~xxwzy}kpzw|twtww{|wsqwzswn]H&2ȝ3i fܩkBZl1z\8+σu/aZ5 &(%F"e!y *D,>ȝݳ.iܣ<]8xN'B"i1&}OH,^/zEz{V{.f[ H\{V *J˰rI,)՘;t^C°P>3 7sn`WX ؀۝e>M\Ms+zsY=vҦߜ#Jdb j{?<$?B&" !6;Ǩ! dF "^]S0?nuVqƋ,9{b%+^?닟}ɇ {pPȭ]ݾ p3.!cE㦦kǪyIb (>ȝѩ #wo3-"1Iu/,W'B$v] vkT|P;huN_V I0hZ4HT<:7<:)a  H0@-i" w]Kus>NN@z::KIɴ1h@/ٷhoIFfBƛUmy©;riaY!a`<w ,$$(^ȝ3z+i<"a)'Nh?UU&.KFUF/zO%=vV2!+HQMUE!JFR-RDT` jE[vOހ?=%""$V*K/opDž?{zsGu *M&|zb|e_Ł?T2VYu+%E>]c6r Ar, <<""k|+m| T N ޒ%('sBj]0.*PbAmؙcECPf*=j`Ŷƞ>".7 vok[hE1G WAa=gxF[ 3M^\7c.b  * >]=b 6rgqv剽j 4K'$D"r8]{]{ԣ*eo5_CfHi@7 U{ CZmU 'npSt'[]ipPנ D$.>s&<9g&{d] 9\~{^#܈Oέƿ|cwϿ$7)-mdx۵b!ulbcX ! % PA]mD6eog$Le*՟??裠6Cz]Ew^Fr=;*5XBzqt"tVƨ+}M&#āD@ ǝͽ3Y22xW^V҈Hs_P_ |\.;#,~E}oSWPB5+omشkxA{+V8gRXP$ Ƚ[h qyva`ofϫ|$D$DAaI ~E7ٻaۓ٭/3*t]JQcA/ݯ ԕ?obi2^~/axsD *]4M{ܫD0;L!"kvyNDH{\GO`}M?O!&s)> ]8j"т2KzG֑tJ/iQ"a!~k&C & 78U"!!p7|S \p5*{%mma/ h5JϒOv>㮖aq !BA^]=Y mlv29}C󄄄L_dzK?:.t1jS׷į8.h0Iaw]uE[5{ǹE`ZFoJyVv{W217Տ,>W.>,k pJVe?_D@w8("WpE,*@ǽ38.l`;[Ttf vo==iB""`khxa0/Fȝ3 (׍]8xZfH+Rىo<ģ~7lKwsYZ"U-RȀ _Zo1:q kT TUPJ>=>0BYSiW|i(?&B" |%Jx s`9˶WUPOeԌ}e2fM&4/X뎷ݕpUQ5`XDDP $>]mṶ{]A?lk뱠>"HD8 i6&I֯:ƻwA:wNBH=*"m;GqZ* JI0^=j [{eb3諱f z9%$$:qx?S': '`06xguџ6]9akW4s~"-%]u3@/,&mxΠsx5!rW.>g}M:UB?HNpCHkM}xIW2mqFohbQյ2EuQ]54gl#IpV&D$"஽xLjUC[7cfZ#ʠVK.˄[b(twaZnGeJ$lp ]4hq)@`1BP=%+{o#6*^Wpr^?&B"BeO[ӏָ]_xX߭ H[ j+|!,Y IL ħ(BKLewlp-!!n g|W_zWKAIfpܖNVӅ@qP P aH OggSj﹦0 +[%zt|ynlusqvpyslujr|tolkx{mkrkjnnslrngjݖml {|7xm^b_!!!5:WOW_U YW7XpVv>Qg@-o^GSrMi,u)#P\, X ^]2u6=sώaCvMUN7\;YS/|_U^zFz 譕^vd0[^MQE $D ݶAVg.ilEɽX8'$"S،>o~bn=W?/uU{Mu~1{GH!?8Ɗ?@߹܏zu?7nA*%W;b B8P#.d1`^:aUrHHH]7+ kVyW*^:"?'# el.|[QET.0`*X D>=iKaE =^~ H6Cu>0*!{S+V%q){\bj+| ? 6B%=JHusX5UD䟚~J(B\H>$HX,TXD^Ƚ6!w Pp]%aG$$">p2k`ز:ߝ%"vVpC. dn[۱ l GX,"a )=efmAn_egv˩v5ꄄQrn?U7RMQ(!jrE% 62 3kTX?jK>=u$NV揻[/ fq]SRsuBB$"f]t -~>:TتfQn`˝ Ca4W,٤QT WUX YJXȽ.l#~,ٔA۸3\'iucDD$Fa}4߾uڋ۫֝&}y?}TiUJ\A 1nY.Qe = q/X'2G-9-Kwċ4)M]5ݿE;;=mTB⮇A &bn}XP"^0p `$ Ƚ. @ w06)- ٙTL`_Lv&ڙܛ]{aX1}ۀpDYFJTH* ~}.]mb[OCI- ׫"glnH ~4d>=0Fmpr ;lx*>{ Oq{<በ !"^Ƚs]4"wI~a/ p:>ÏD?mu9^S@7DevK4'ȓv-d~(KhiEaa`$` ,EWfSv^q]|5!"!vGi>Bh/zꌆ+0ҏqtmx)ɾ!23g@]M<ڡR0aHV=6~ |lA8FΕ ~3o{v"n1ZlTy]dfz~;rdztdBd]DPjU ] "=6`K=7%ۥFLΤ]/s'藝շ"i8=DKd A ==뿯PJ mncYraA `Kq@1^}4@K *0#o(jL@uEtp's}w3kGY@`HP0G%Ԉ r'h$LK80W)"1nܵv>7*ztfIS,dnj).QBb^}b 3㨆B؅ ȹ:!"~uzCܚ:*;ŭâk`jUPh8]c` ,wv㥵2!]  ,ȽcEV@}E~Nx{8sb$BBD\Nďo\{uIg}frmD6-2!`l[F&:՚^Éug]4@^}N&lܽ^69$۬"LTBR #!$1Jby>=֛!i ցᬾϟo z&-P ~H˧\$ZE%bH=3.[-q:' >wC8JDHD3M ϴZ}{D/.; Zv{.Kg0H!cflRcS1%C  ˂=m؅A>Q[ٶe/H >{8rbB"B|o}|qf߳$?~)4 D_T+|@ ^Ƚ{[~,q d^ "$@pqDGn>a5,hLЍ'gP_^MÜinȄÅҡȀ W@Ţ^ȽYcx<< ؀Uơx y?K#pճWEn!vI,:❵BQAM-i@@d!>Ƚa6,G>;DH g<ĥۭ?sٵ?fẄ́j>iQ>m=.k* .,}ydSr$lE5$~$D"X̷r ux 9 .<@w|S $xE(,$Ƚ/V2Ƚ'ɰUyW5W  p=@F3 G>`fE^005}ҨY_4lAt $ >ȽMã^U 8~,;B//_ؕHHX.N>]=^~|dwKkgoMhg`f1jPCk+ĤTP`$, J,`^X滼\mZ8Wy0rHHH޿t[5f3\/U{m:` ;5*$C1)ň+R`P}G+P}c3 b+>v59T]a"BBp=v;B&Lotn~.Dpj&KFl0fnK_D^ "0}i6bfJ'ڪxn[_!@gOfٽW^?D 0C}v5eBzK b+@P}e0`sݎNx^|D"$tD^sxNho}]3ڎA`^)r+B"Bo-7vK݈z8O4죄w{N^+ c]hE52 s.|@DB^Ƚp'͑ y#L.TTN E⧈Qx2\n=tzAHp-)B4*TTzBD$xb3ngl ?mU"n'BGdWnb(}H{"~lv8}u](a ƙ>s=" _l~QND>p{{0}:NȬH޹o ={xnOH *^O܂Er^Sݨjb9OO.'{l˓=ߟƪ(8@Iq %Ry:C̕# R*pED",~}M?a8 |(*/^e5H6j>>n^/./"yg>.q+3d.P,.~!YMҐJ@ hAAŸV slo0_V7n^v8:ϑ*ޚ&òʺV=4b Pi;V0M~}{aWv =WBq @ \HPN4]aݫvl<{ڽ螈qZ?k|xWِ肑 ~wBy8>0*>%UeH|=<M{k.h;D(D=VEQYb^ iBgr| #:!@{-ln+`V({w_x$RH.=i :t 'tI IX \T~(onQt܀@uUVղi: 耬instead-3.2.1/games/tutorial3/main-en.lua0000644000175000017500000001747513267071774017271 0ustar peterpeter-- $Name:English Tutorial$ instead_version "1.6.0" game.act = 'You can\'t.'; game.inv = "Hmm... Wrong..."; game.use = 'Won\'t work...'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Tutorial', act = function() walk('r1'); end, dsc = txtc("Welcome to INSTEAD tutorial mode.")..[[^^ The game consists of scenes. Each game scene has a description, consisting of static and dynamic parts. Dynamic part includes objects, characters, etc. A player can interact with the dynamic part by clicking mouse on the highlighted links.^^ The current scene is called "Tutorial" and you are reading the static part of its description. The only object in this scene is the "Next" object, which you can see below the text. Thus, to continue learning you can click "Next".]], obj = { vobj('continue', '{Next}'), }, }; paper = obj { nam = 'paper', dsc = 'The first thing you notice in the room is a {sheet of paper}.', tak = 'You take the paper.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'A blank sheet of squared paper. Probably torn out of the copy-book.'; end p 'A sheet of squared paper with your name on it.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'You write your name on the paper.'; end end, }; pencil = obj { nam = 'pencil', dsc = 'There is a {pencil} on the floor.', tak = 'You pick the pencil.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'An ordinary wooden pencil.'; end, }; r1 = room { nam = 'Lesson 1', enter = function() lifeon('r1'); end, life = function(s) if not have('paper') or not have('pencil') then return end put(vway('continue', [[Excellent!^You've probably noticed that the static part of the scene description disappeared, replaced by the descriptions of the objects you've taken. To see the full scene description again either click on the scene name at the top — "Lesson 1" or press F5. The result is the same.^^ {Next}]], 'r2')); lifeoff('r1'); end, dsc = [[Lesson 1. Interacting with objects^^ Let's continue the lesson. You are inside a room. Take both objects that you see. You can just click on them with mouse. If you prefer keyboard, you can pick an object with arrow keys and press "Enter" to interact with it.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Lesson 2', enter = function() lifeon('r2'); end, life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Good!^^{Next}", 'r3')); lifeoff('r2'); end, dsc = [[Lesson 2. Using the inventory — Part I^^ Now you've got objects that you can examine or use. That's what the inventory is for. To look at any object double click on it. Or you can switch the cursor to the inventory with "Tab", choose an object and press "enter" twice. To return the cursor to the scene description, press "Tab" again.^^ So, look at the paper. Then do the same with the pencil.]], }; apple = obj { nam = 'apple', dsc = 'There\'s an {apple} on the table.', tak = 'You take an apple from the table.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'You eat the apple.'; end p 'Looks appetizing.'; end, }; desk = obj { nam = 'desk', dsc = 'In this lesson you see a wooden {desk}.', var { seen = false, haswriting = false }, act = function(s) if s.haswriting then s.seen = true; return 'Large oaken desk. There\'s a pencil inscription on its top: "Lorem Ipsum".'; end p 'Large oaken desk.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; return 'You write several letters on the desk.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Lesson 3', enter = function() lifeon('r3'); end, life = function(s) if not desk.seen or not have 'apple' then return end put(vway("continue", "^^{Next}", 'r4')); lifeoff('r3'); end, dsc = [[Lesson 3. Using the inventory — Part II^^ You can act with inventory objects on other objects of the scene or inventory. In this room you'll see a desk. Try using pencil on it.^^ To do that click mouse on the pencil, then click on the desk. Or you can do the same with "Tab", "enter" and arrows.^^ Then look at the table. And don't forget to take the apple, you'll need it in the next lesson.]], obj = { 'desk' }, }; r4 = room { nam = 'Lesson 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continue", "Good.^^{Next}", 'r5')); lifeoff('r4'); end, dsc = [[Lesson 4. Using the inventory — Part III^^ Good, now let's learn several more actions with objects.^^ First, write something on the paper. Click pencil, then paper. Then you can look at the paper to see your writing.^^ Second, eat an apple, you've taken in the previous room. Double click on it.^^ All those actions can be done with keyboard as described previously.]], }; r5 = room { nam = 'Lesson 5', exit = function(s, t) if t ~= r6 then p 'We\'ve already finished this lesson.^ Go to lesson 6, please.' return false; end end, dsc = [[Lesson 5. Moving — Part I^^ Now we'll study the passages between rooms. In this room you see five links with lesson numbers. Go to lesson 6.^^ Click on the appropriate link or use keyboard — pick the link with arrows and press "Enter".]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Lesson 6', exit = function(s, t) if t ~= theend then return 'We\'ve already finished this lesson..^ Go to the last lesson, please.', false; end end, dsc = [[Lesson 6. Moving - Part II^^ Now go to the last lesson.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Last lesson', dsc = [[With the help of the menu you can choose a game, save or load the state, or do other things. To open the menu press "Esc" or click the menu icon at the bottom right.^^ Now you are ready to play. Good luck!!!^^ Download games for INSTEAD here: ]]..txtu("http://instead-games.sourceforge.net")..[[^^ The tutorial uses the track "Instead game-engine" from svenzzon.]], obj = { vway('keys', 'See {list of keyboard shortcuts}.', 'help')}, }; help = room { nam = 'Keyboard shortcuts', dsc = [[ Esc - Menu.^ Alt+Q - Exit.^ Alt+Enter - Full screen/window.^ F5 - Refresh the scene.^ Space/Backspace - Scroll the scene description.^ Tab/Shift+Tab - Switch between active zones.^ PgUp/PgDn - Scroll the active zone.^ Arrows left/right - Choose links in the active zone.^ F2 - Save game.^ F3 - Load game.^ F8 - Quick save.^ F9 - Quick load.^^ Shortcuts, that depend on the chosen keyboard mode (see Menu -> Settings -> Keyboard mode):^^ Arrows up/down:^  - "Scroll" mode: scroll active zone.^  - "Links" mode: choose links in the active zone.^  - "Smart" mode: both choose links and scroll active zone.^^ Arrows up/down + Shift or Alt:^  - "Scroll" mode: choose links in the active zone.^  - "Links" mode: scroll active zone.^  - "Smart" mode: scroll active zone. ]], obj = { vway('cmdline', 'See {command line parameters}.', 'help2')}, }; help2 = room { nam = 'Command line parameters', dsc = [[ -nosound - launch without sound;^ -debug - debug mode for game developers;^ -theme - pick a theme;^ -game - pick a game;^ -themespath - additional path to themes;^ -gamespath - additional path to games;^ -window - windowed mode;^ -fullscreen - fullscreen mode;^ -noautosave - disable autosave/autoload option;^ -encode [encoded.lua] - encode lua source code (use doencfile from lua to load it);^ -mode [WxH] - use WxH resolution. ]], obj = { vway('keys', 'See {list of keyboard shortcuts}.', 'help')}, }; instead-3.2.1/games/tutorial3/main.lua0000644000175000017500000000341513267071774016656 0ustar peterpeter-- $Name:Tutorial$ -- $Name(ru):Обучение$ -- $Name(uk):Навчання$ -- $Name(de):Einführung$ -- $Name(es):Tutorial$ -- $Name(fr):Tutoriel$ -- $Name(it):Tutorial$ -- $Name(pt):Tutorial$ -- $Name(nl):Snelstart Training$ instead_version "1.6.0" require "xact" tut_lang = { ru = 'Язык', en = 'Language', ua = 'Мова', it = 'Lingua', es = 'Idioma', pt = 'Linguagem', fr = 'Langue', de = 'Sprache', nl = 'Taal', } tut_title = { ru = 'Обучение', en = 'Tutorial', ua = 'Навчання', it = 'Tutorial', es = 'Tutorial', pt = 'Tutorial', fr = 'Tutoriel', de = 'Einführung', nl = 'Snelstart Training', } if not LANG or not tut_lang[LANG] then LANG = "en" end tut_lang = tut_lang[LANG] tut_title = tut_title[LANG] main = room { nam = tut_title; pic = 'instead.png'; forcedsc = true; dsc = txtc ( txtb(tut_lang)..'^^'.. img('gb.png')..' '..[[{en|English}^]].. img('ru.png')..' '..[[{ru|Русский}^]].. img('uk.png')..' '..[[{uk|Українська}^]].. img('es.png')..' '..[[{es|Español}^]].. img('br.png')..' '..[[{pt|Português}^]].. img('it.png')..' '..[[{it|Italiano}^]].. img('fr.png')..' '..[[{fr|Français}^]].. img('de.png')..' '..[[{de|Deutsch}^]].. img('nl.png')..' '..[[{nl|Nederlands}^]].. ''); obj = { xact("ru", code [[ gamefile('main-ru.lua', true) ]]); xact("en", code [[ gamefile('main-en.lua', true) ]]); xact("uk", code [[ gamefile('main-uk.lua', true) ]]); xact("es", code [[ gamefile('main-es.lua', true) ]]); xact("it", code [[ gamefile('main-it.lua', true) ]]); xact("pt", code [[ gamefile('main-pt.lua', true) ]]); xact("fr", code [[ gamefile('main-fr.lua', true) ]]); xact("de", code [[ gamefile('main-de.lua', true) ]]); xact("nl", code [[ gamefile('main-nl.lua', true) ]]); } } instead-3.2.1/games/tutorial3/de.png0000644000175000017500000000104113267071774016316 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbqf?f_ pb{qq9 / ~^n5@011U8y $?A~N@" ,X_@:~"?~@Ne@b@ь7h4LVg2-K , z#2ׯP `@;D?H%@1??ڀ T /@b`PPI@҄ab_A*$B$b`.a ?FL A@@@ X~e3o?6fA1?`@03b21@wt_XIENDB`instead-3.2.1/games/tutorial3/es.png0000644000175000017500000000072513267071774016345 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<gIDATxbπPX@_upɒ2ҒKF6hU wg@ տCH($ f@, 3}^_/03f`@1 T?'00t|}/jb@v_1bØUzW[Fz@L`EO?Zf]#l 7P@11Ęw/q?̆@7  200w,0Ɵ 2x XfARC!@T @_Q#OC@ ZGIENDB`instead-3.2.1/games/tutorial3/main-pt.lua0000644000175000017500000002037013267071774017276 0ustar peterpeter-- $Name:Tutorial Português$ instead_version "1.6.0" game.act = 'Isso não é permitido.'; game.inv = "Hmm... Não..."; game.use = 'Não funciona...'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Tutorial', act = function() walk('r1'); end, dsc = txtc("Bem-vindo ao tutorial do INSTEAD.")..[[^^ Cada jogo consiste de cenas. Cada cena do jogo tem uma descrição, com partes estáticas e dinâmicas. Partes dinâmicas incluem objetos, personagens, etc. Um jogador pode interagir com a parte dinâmica clicando com o mouse nos links realçados.^^ A cena corrente é chamada de "Tutorial" e você está lendo a parte estática da sua descrição. O único objeto nesta cena é o objeto "Próxima", que você pode ver abaixo do texto. Então, para continuar aprendendo você pode clicar "Próxima".]], obj = { vobj('continue', '{Próxima}'), }, }; paper = obj { nam = 'papel', dsc = 'A primeira coisa que você vê no local é uma {folha de papel}.', tak = 'Você pega o papel.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Uma folha branca e quadrada de papel. Provavelmente rasgada de um livro.'; end p 'Uma folha quadrada de papel com seu nome nela.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Você escreve o seu nome no papel.'; end end, }; pencil = obj { nam = 'lápis', dsc = 'Há um {lápis} no chão.', tak = 'Você pega o lápis.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Um simples lápis de madeira.'; end, }; r1 = room { nam = 'Lição 1', enter = function() lifeon('r1'); end, life = function(s) if not have('paper') or not have('pencil') then return end put(vway('continue', [[Excelente!^Você provavelmente notou que a parte estática da descrição da cena desapareceu, substituída pelas descrições dos objetos que você pegou. Para ver a descrição completa da cena novamente clique no seu nome no alto da da página — "Lição 1" ou tecle F5. O resultado é o mesmo.^^ {Próxima}]], 'r2')); lifeoff('r1'); end, dsc = [[Lição 1. Interagindo com objetos^^ Continuando com a lição. Você está num local. Pegue os objetos que você vê. Basta clicar neles com o mouse. Se preferir o teclado, você pode apontar para um objeto com as setas direcionais e pressionar "Enter" para interagir com ele.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Lição 2', enter = function() lifeon('r2'); end, life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Muito Bem!^^{Próxima}", 'r3')); lifeoff('r2'); end, dsc = [[Lição 2. Usando o inventário — Parte I^^ Agora você tem objetos para examinar ou usar. O inventário é para isso. Para examinar algum objeto dê duplo clique nele. Ou você pode mover o cursor para o inventário com a tecla "Tab", escolha um objeto e tecle "enter" duas vezes. Para levar o cursor de volta para a descrição da cena, tecle "Tab" novamente.^^ Então, examine o lápis. Faça o mesmo com o papel.]], }; apple = obj { nam = 'maçã', dsc = 'Há uma {maçã} na mesa.', tak = 'Você pega a maçã da mesa.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Você comeu a maçã.'; end p 'Hum, apetitosa.'; end, }; desk = obj { nam = 'escrivaninha', dsc = 'Você vê aqui uma {escrivaninha} de madeira.', var { seen = false, haswriting = false }, act = function(s) if s.haswriting then s.seen = true; return 'Uma grande escrivaninha de carvalho. Há uma inscrição a lápis no seu topo: "Lorem Ipsum".'; end p 'Uma grande escrivaninha de carvalho.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; return 'Você escreve várias letras na escrivaninha.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Lição 3', enter = function() lifeon('r3'); end, life = function(s) if not desk.seen or not have 'apple' then return end put(vway("continue", "^^{Próxima}", 'r4')); lifeoff('r3'); end, dsc = [[Lição 3. Usando o inventário — Parte II^^ Você pode usar objetos do inventário para afetar outros objetos da cena ou do inventário. Neste local você vê uma escrivaninha. Tente usar o lápis nela.^^ Para isso clique com o mouse no lápis, então clique na escrivaninha. Ou você pode fazer o mesmo com "Tab", "enter" e as setas do teclado.^^ Então examine a mesa. E não esqueça de pegar a maçã, você precisará dela na próxima lição.]], obj = { 'desk' }, }; r4 = room { nam = 'Lição 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continue", "Muito bem.^^{Próxima}", 'r5')); lifeoff('r4'); end, dsc = [[Lição 4. Usando o inventário — Parte III^^ Bom, agora vamos aprender diversas outras ações com objetos.^^ Primeiro, escreva algo no papel. Clique no lápis, depois no papel. Então você pode examinar o papel para ver os seus escritos.^^ Segundo, coma a maçã que você pegou no local anterior. Dê duplo clique nela.^^ Todas estas ações podem ser realizadas com o teclado, conforme descrito antes.]], }; r5 = room { nam = 'Lição 5', exit = function(s, t) if t ~= r6 then p 'Já terminamos esta lição.^ Favor seguir para a lição 6.' return false; end end, dsc = [[Lição 5. Movendo-se — Parte I^^ Agora vamos estudar as passagens entre os locais. Neste local você vê cinco links com números de lições. Vá para a lição 6.^^ Clique no link apropriado ou use o teclado — selecione o link com as setas e tecle "Enter".]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Lição 6', exit = function(s, t) if t ~= theend then return 'Já terminamos esta lição..^ Favor seguir para a última lição.', false; end end, dsc = [[Lição 6. Movendo-se - Parte II^^ Agora vá para a última lição.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Última lição', dsc = [[Com a ajuda do menu você pode escolher um jogo, salvar ou carregar o seu estado, ou fazer outras coisas. Para abrir o menu tecle "Esc" ou clique no ícone do menu à direita no fundo da página.^^ Agora você está pronto para jogar. Boa sorte!!!^^ Baixe jogos aqui: ]]..txtu("http://instead-games.sourceforge.net/")..[[^^ O tutorial usa o tema "Instead game-engine" de svenzzon.]], obj = { vway('keys', 'Ver {lista de atalhos de teclado}.', 'help')}, }; help = room { nam = 'Atalhos de teclado', dsc = [[ Esc - Menu.^ Alt+Q - Sair.^ Alt+Enter - Tela cheia/janela.^ F5 - Atualizar cena.^ Space/Backspace - Rolar descrição da cena.^ Tab/Shift+Tab - Alternar áreas ativas.^ PgUp/PgDn - Rolar área ativa.^ Arrows left/right - Selecionar links na área ativa.^ F2 - Salvar jogo.^ F3 - Carregar jogo.^ F8 - Salvar rápido.^ F9 - Carregar rápido.^^ Atalhos que dependem do modo de teclado escolhido (Ver Menu -> Opções -> Modo de teclado):^^ Setas acima/abaixo:^  - Modo "Scroll": rolar área ativa.^  - Modo "Links": selecionar links na área ativa.^  - Modo "Smart": selecionar links e rolar área ativa.^^ Setas acima/abaixo + Shift ou Alt:^  - Modo "Scroll": selecionar links na área ativa.^  - Modo "Links": rolar área ativa.^  - Modo "Smart": rolar área ativa. ]], obj = { vway('cmdline', 'Ver {parâmetros de linha de comando}.', 'help2')}, }; help2 = room { nam = 'parâmetros de linha de comando', dsc = [[ -nosound - executar sem som;^ -debug - modo de depuração para desenvolvedores de jogos;^ -theme - escolha um tema;^ -game - escolha um jogo;^ -themespath - endereço adicional para temas;^ -gamespath - endereço adicional para jogos;^ -window - modo de janela;^ -fullscreen - modo de tela cheia;^ -noautosave - desabilitar opções de salvar/carregar automaticamente;^ -encode [codificado.lua] - codificar código-fonte Lua (usar doencfile de Lua para carregá-lo);^ -mode [WxH] - usar resolução WxH. ]], obj = { vway('keys', 'Ver {lista de atalhos de teclado}.', 'help')}, }; instead-3.2.1/games/tutorial3/main-fr.lua0000644000175000017500000002253313267071774017265 0ustar peterpeter-- $Name:Tutoriel Français$ instead_version "1.6.0" game.act = 'Vous ne pouvez pas.'; game.inv = "Hmm… Mauvais…"; game.use = 'Ne fonctionne pas…'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Tutoriel', act = function() walk('r1'); end, dsc = txtc("Bienvenue dans le tutoriel de INSTEAD.")..[[^^ Le jeu se compose de scènes. Chaque scène de jeu a une description, constituée de parties statiques et dynamiques. La partie dynamique comprend des objets, des personnages, etc. Un joueur peut interagir avec la partie dynamique en cliquant avec la souris sur les liens en surbrillance.^^ La scène actuelle est appelée « Tutoriel » et vous êtes en train de lire la partie statique de sa description. Le seul objet dans cette scène est l'objet « Suivant », que vous pouvez voir ci-dessous. Ainsi, pour continuer à apprendre, cliquez sur « Suivant ».]], obj = { vobj('continue', '{Suivant}'), }, }; paper = obj { nam = 'papier', dsc = 'La première chose que vous remarquez dans la pièce est une {feuille de papier}.', tak = 'Vous prenez le papier.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Une feuille de papier quadrillé. Probablement arrachée d’un livre.'; end p 'Une feuille de papier quadrillé avec votre nom.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Vous écrivez votre nom sur le papier.'; end end, }; pencil = obj { nam = 'crayon', dsc = 'Il y a un {crayon} sur le sol.', tak = 'Vous prenez le crayon.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Un crayon ordinaire, en bois.'; end, }; r1 = room { nam = 'Leçon nº 1', enter = function() lifeon('r1'); end, life = function(s) if not have('paper') or not have('pencil') then return end put(vway('continue', [[Excellent !^Vous avez probablement remarqué que la partie statique de la description de la scène a disparu, remplacée par les descriptions des objets que vous avez pris. Pour voir à nouveau la description complète de la scène, cliquez sur le nom de la scène au sommet – « Leçon nº 1 » – ou appuyez sur F5. Le résultat est le même.^^ {Suivant}]], 'r2')); lifeoff('r1'); end, dsc = [[Leçon nº 1. Interagir avec les objets^^ Continuons la leçon. Vous êtes à l'intérieur d'une pièce. Prenez les deux objets que vous y voyez. Vous pouvez simplement cliquer dessus avec la souris, ou, si vous préférez le clavier, vous pouvez choisir un objet avec les touches fléchées et appuyer sur « Entrée » pour interagir avec lui.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Leçon nº 2', enter = function() lifeon('r2'); end, life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Bien !^^{Suivant}", 'r3')); lifeoff('r2'); end, dsc = [[Leçon nº 2. Utiliser l'inventaire — Partie I^^ Vous avez maintenant des objets que vous pouvez examiner ou utiliser. L'inventaire est fait pour cela. Pour regarder un objet, double-cliquez dessus. Ou alors, vous pouvez faire passer le curseur dans l'inventaire avec « Tab », y choisir un objet et appuyer sur « Entrée » deux fois. Pour ramener le curseur à la description de la scène, appuyez sur « Tab » à nouveau.^^ Regardez maintenant le papier. Faites ensuite la même chose avec le crayon.]], }; apple = obj { nam = 'pomme', dsc = 'Il y a une {pomme} sur le bureau.', tak = 'Vous prenez la pomme sur le bureau.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Vous mangez la pomme.'; end p 'Elle est appétissante.'; end, }; desk = obj { nam = 'bureau', dsc = 'Dans cette leçon, vous voyez un {bureau} en bois.', var { seen = false, haswriting = false }, act = function(s) if s.haswriting then s.seen = true; return 'Un grand bureau en chêne. Il y a dessus une inscription au crayon : « Lorem Ipsum ».'; end p 'Un grand bureau en chêne.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; return 'Vous griffonnez plusieurs lettres sur le bureau.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Leçon nº 3', enter = function() lifeon('r3'); end, life = function(s) if not desk.seen or not have 'apple' then return end put(vway("continue", "^^{Suivant}", 'r4')); lifeoff('r3'); end, dsc = [[Leçon nº 3. Utiliser l'inventaire — Partie II^^ Vous pouvez faire agir les objets de l'inventaire sur d'autres objets de la scène ou de l'inventaire. Dans cette salle, vous verrez un bureau. Essayez d'utiliser un crayon sur lui.^^ Pour ce faire, cliquez avec la souris sur le crayon, puis cliquez sur le bureau. Ou alors, vous pouvez faire la même chose au clavier avec « Tab », « Entrée » et les flèches.^^ Il suffit ensuite de regarder le bureau pour voir le résultat. Et n'oubliez pas de prendre la pomme, vous en aurez besoin dans la prochaine leçon.]], obj = { 'desk' }, }; r4 = room { nam = 'Leçon nº 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continue", "Bien.^^{Suivant}", 'r5')); lifeoff('r4'); end, dsc = [[Leçon nº 4. Utiliser l’inventaire — Partie III^^ Bon, maintenant, nous allons étudier plusieurs autres actions sur les objets.^^ Tout d’abord, écrivez quelque chose sur le papier. Cliquez sur le crayon, puis sur le papier. Vous pourrez ensuite regarder le document pour voir le résultat.^^ Deuxièmement, mangez la pomme que vous avez prise dans la salle précédente. Double-cliquez sur elle.^^ Toutes ces actions peuvent être faites avec le clavier comme décrit précédemment.]], }; r5 = room { nam = 'Leçon nº 5', exit = function(s, t) if t ~= r6 then p 'Nous avons déjà terminé cette leçon…^ En avant pour la leçon nº 6, s’il vous plaît.' return false; end end, dsc = [[Leçon nº 5. En mouvement — Partie I^^ Maintenant, nous allons étudier les déplacements entre les pièces. Dans cette salle, vous voyez cinq liens pointant vers les autres leçons. Allez à la leçon nº 6.^^ Cliquez sur le lien approprié ou utilisez le clavier — sélectionnez le lien a l’aide des flèches et appuyez ensuite sur « Entrée ».]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Leçon nº 6', exit = function(s, t) if t ~= theend then return 'Nous avons déjà terminé cette leçon…^ En avant pour la dernière leçon, s’il vous plaît.', false; end end, dsc = [[Leçon nº 6. En mouvement — Partie II^^ Rendez-vous à la dernière leçon.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Dernière leçon', dsc = [[À l’aide du menu, vous pouvez choisir un jeu, sauvegarder ou charger une partie, ou faire d'autres choses encore. Pour ouvrir le menu, appuyez sur « Esc » ou cliquez sur l'icône de menu en bas à droite (avec le thème par défaut).^^ Maintenant, vous êtes prêt à jouer. Bonne chance !!!^^ Téléchargez des jeux pour INSTEAD ici :^]] ..txtu("http://instead-games.sourceforge.net").. [[^^Le tutoriel utilise « INSTEAD game-engine » de svenzzon comme thème musical.]], obj = { vway('keys', 'Voir la {liste des raccourcis clavier}.', 'help')}, }; help = room { nam = 'Raccourcis clavier', dsc = [[ Esc – Menu^ Alt+Q – Quitter^ Alt+Entrée – Plein écran/Fenêtre^ F5 – Rafraîchir la scène^ Espace/Effacement arrière – Faire défiler la description de la scène^ Tab/Maj+Tab – Basculer entre les zones actives^ PgUp/PgDn – Faire défiler les zones actives^ Flèches gauche/droite – Sélection des liens dans la zone active^ F2 – Sauvegarder la partie^ F3 – Charger une partie^ F8 – Sauvegarde rapide^ F9 – Chargement rapide^^ Les raccourcis dépendent du mode de clavier choisi^ (cf. Menu → Réglages → [Autres] → Mode clavier) :^^ Flèches haut/bas :^ - mode « Scroll » : défilement zone active.^ - mode « Links » : sélection des liens dans la zone active.^ - mode « Smart » : à la fois sélection des liens et défilement dans la zone active.^^ Flèches haut/bas + Shift ou Alt :^ - mode « Scroll » : sélection des liens dans la zone active.^ - mode « Links » : défilement dans la zone active.^ - mode « Smart » : défilement dans la zone active. ]], obj = { vway('cmdline', 'Voir les {paramètres de la ligne de commande}.', 'help2')}, }; help2 = room { nam = 'Paramètres de la ligne de commande', dsc = [[ -nosound – lancement sans son^ -debug – mode debugage pour les développeurs^ -theme – choisir un thème^ -game – choisir un jeu^ -themespath – chemin supplémentaire pour les thèmes^ -gamespath – chemin supplémentaire pour les jeux^ -window – mode fenêtré^ -fullscreen – mode plein écran^ -noautosave – désactiver les options de sauvegarde auto./chargement auto.^ -encode [encoded.lua] – encoder code source lua (utilisation doencfile de lua pour charger)^ -mode [WxH] – utiliser la résolution WxH (LxH). ]], obj = { vway('keys', 'Voir la {liste des raccourcis clavier}.', 'help')}, }; instead-3.2.1/games/tutorial3/main-es.lua0000644000175000017500000002054013267071774017261 0ustar peterpeter-- $Name:Tutorial Español$ instead_version "1.6.0" game.act = 'No puedes hacer eso.'; game.inv = "Hmm... Nop..."; game.use = 'No pasa nada...'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Tutorial', act = function() walk('r1'); end, dsc = txtc("Bienvenido al tutorial de INSTEAD.")..[[^^ En INSTEAD un juego se divide en "escenas". Cada escena tiene una descripción, conformada por secciones estáticas y dinámicas. Las secciones estáticas pueden incluir objetos, personajes, etc. Como jugador puedes interactuar con las partes dinámicas al hacer click en los links resaltados.^^ La escena actual se llama "Tutorial" y tu estás leyendo la sección estática de su descripción. El único objeto en esta escena es el objeto "Siguiente", que puedes ver más abajo. Esto es: para seguir aprendiendo haz click en "Siguiente".]], obj = { vobj('continue', '{Siguiente}'), }, }; paper = obj { nam = 'papel', dsc = 'Lo primero que ves en la habitación es un {pedazo de papel}.', tak = 'Coges el papel.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Una hoja blanca y cuadrada. Probablemente arrancada de un libro.'; end p 'Una hoja cuadrada de papel con tu nombre escrito en ella.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Escribes tu nombre en el papel.'; end end, }; pencil = obj { nam = 'lápiz', dsc = 'Hay un {lápiz} en el piso.', tak = 'Coges el lápiz.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Un lápiz común de madera.'; end, }; r1 = room { nam = 'Lección 1', enter = function() lifeon('r1'); end, life = function(s) if not have('paper') or not have('pencil') then return end put(vway('continue', [[Genial!^Te abrás dado cuenta que la parte estática de la descripción ya no está; reemplazada por las descripciones de los objetos que cogiste. Para ver nuevamente la descricpión completa de esta escena puedes clickear en el nombre arriba (Lección 1) o pulsar F5. Es lo mismo.^^ {Siguiente}]], 'r2')); lifeoff('r1'); end, dsc = [[Lección 1. Interactuar con objetos^^ Continuemos con el tutorial. Estás en una habitación. Coge los dos objetos que ves aquí. Para ello, puedes clickear sobre ellos con el ratón o -si lo prefieres- usar las flechas de tu teclado para posicionarte y el "Enter" para interactuar.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Lección 2', enter = function() lifeon('r2'); end, life = function(s) if not paper.seen or not pencil.seen then return end put(vway("continue", "Bien!^^{Siguiente}", 'r3')); lifeoff('r2'); end, dsc = [[Lección 2. Usando el inventario — Parte I^^ Ahora tienes en tu poder objetos que puedes examinar o usar. Eso es tu inventario. Para examinar un objeto haz doble click en él. O puedes manejar el cursor con la tecla "Tab", elegir un objeto y presionar Enter dos veces. Para volver el cursor a la descripción de la escena, presiona nuevamente "Tab".^^ Ok, examina el papel. Y haz lo propio con el lápiz.]], }; apple = obj { nam = 'manzana', dsc = 'Hay una {manzana} sobre la mesa.', tak = 'Coges la manzana de la mesa.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Te comes la manzana.'; end p 'Luce apetecible.'; end, }; desk = obj { nam = 'escritorio', dsc = 'Aquí ves un {escritorio} de madera.', var { seen = false, haswriting = false }, act = function(s) if s.haswriting then s.seen = true; return 'Un gran escritorio de roble. Hay algo escrito en él: "Lorem Ipsum".'; end p 'Un gran escritorio de roble.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; p 'Garabateas unas palabras sobre el escritorio.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Lección 3', enter = function() lifeon('r3'); end, life = function(s) if not desk.seen or not have 'apple' then return end put(vway("continue", "^^{Siguiente}", 'r4')); lifeoff('r3'); end, dsc = [[Lección 3. Usando el inventario — Parte II^^ Puedes combinar una acción con un objeto de tu inventario y un objeto de la escena o del mismo inventario. En esta habitación verás un escritorio. Prueba usar el lápiz con él.^^ Para ello, haz click sobre el lápiz, y entonces click sobre el escritorio. O puedes conseguir lo mismo con "Tab", "Enter" y las flechas de tu teclado.^^ A continuación, examina el escritorio. Y no te olvides de coger la manzana. La necesitarás para la próxima lección.]], obj = { 'desk' }, }; r4 = room { nam = 'Lección 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have 'apple' then return end put(vway("continue", "Bien!^^{Siguiente}", 'r5')); lifeoff('r4'); end, dsc = [[Lección 4. Usando el inventario — Parte III^^ Bien, ahora veamos un par de acciones más sobre objetos.^^ Primero, escribir algo en el papel. Haz click en el lápiz y luego en el papel. Y entonces examina el papel para ver lo que haz escrito.^^ Segundo, cómete la manzana que cogiste en la escena anterior. Haz doble click en ella.^^ Todas estas acciones también pueden ejecutarse con tu teclado, como ya se ha descrito.]], }; r5 = room { nam = 'Lección 5', exit = function(s, t) if t ~= r6 then p 'Ya hemos terminado esta lección.^ Ve a la lección 6, por favor.' return false; end end, dsc = [[Lección 5. Moviéndose — Parte I^^ Ahora analizaremos el movimiento entre localidades. En esta habitación puedes ver 5 links con los nombres de las lecciones. Ve a la lección 6.^^ Haz click en el link correspondiente o usa el teclado (ubica el cursor con las flechas y presiona "Enter").]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Lección 6', exit = function(s, t) if t ~= theend then return 'Ya hemos terminado esta lección.^ Ve a la última lección, por favor.', false; end end, dsc = [[Lección 6. Moviéndose - Parte II^^ Ahora ve a la última lección.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Ultima lección', dsc = [[Mediante el menú flotante, puedes elegir un juego, salvar o cargar un juego, y un par de cosas más. Para abrirlo presiona "Esc" o haz click en el icono de menú abajo a la derecha.^^ Ahora ya estás listo para jugar. Buena suerte!!!^^ Descarga nuevos juegos para INSTEAD aquí: ]]..txtu("http://instead-games.sourceforge.net")..[[^^ Este tutorial usa el tema "Instead game-engine" de svenzzon.]], obj = { vway('keys', 'Ver {lista de atajos de teclado}.', 'help')}, }; help = room { nam = 'Atajos de Teclado', dsc = [[ Esc - Menú.^ Alt+Q - Salir.^ Alt+Enter - Pantalla Completa/Ventana.^ F5 - Actualizar escena.^ Espacio/Backspace - Desplazar la descripción de la escena.^ Tab/Shift+Tab - Cambiar entres zonas activas.^ PgUp/PgDn - Desplazar el contenido de la zona activa.^ Teclas izqu/derecha - Elegir links en la zona activa.^ F2 - Salvar juego.^ F3 - Cargar juego.^ F8 - Salvado Express.^ F9 - Carga Express.^^ Atajos que dependen del modo de teclado elegido (ver Menú->Opciones->Modo Teclado):^^ Flechas arriba/abajo:^  - Modo "Scroll": hace scroll de zona activa.^  - Modo "Links": elige los links en la zona activa.^  - Modo "Smart": combina las dos anteriores.^^ Flechas arriba/abajo + Shift o Alt:^  - Modo "Scroll": elige los links en la zona activa.^  - Modo "Links": hace scroll de zona activa.^  - Modo "Smart": hace scroll de zona activa. ]], obj = { vway('cmdline', 'Ver {parámetros línea de comandos}.', 'help2')}, }; help2 = room { nam = 'Parámetros línea de comandos', dsc = [[ -nosound - lanza sin sonido;^ -debug - modo debug para desarrolladores;^ -theme - elige un tema;^ -game - elige un juego;^ -themespath - ruta adicional para los temas;^ -gamespath - ruta adicional para los juegos;^ -window - modo ventana;^ -fullscreen - pantalla completa;^ -noautosave - deshabilita opción autosalvar/autocargar;^ -encode [encoded.lua] - encode del código fuente lua (usar doencfile desde lua para cargarlo);^ -mode [WxH] - usa resolusion WxH. ]], obj = { vway('keys', 'Ver {lista de atajos de teclado}.', 'help')}, }; instead-3.2.1/games/tutorial3/main-it.lua0000644000175000017500000002126513267071774017273 0ustar peterpeter-- $Name:Tutorial Italiano$ instead_version "1.6.0" game.act = 'Non puoi.'; game.inv = "Hmm... Sbagliato..."; game.use = 'Non funziona...'; game.pic = 'instead.png'; set_music('instead.ogg'); main = room { nam = 'Tutorial', act = function() walk('r1'); end, dsc = txtc("Benvenuto in questa guida introduttiva ad INSTEAD.")..[[^^ Il gioco consiste di scene. Ogni scena del gioco ha una descrizione, formata da parti statiche e dinamiche. Le parti dinamiche includono oggetti, personaggi, etc... Il giocatore può interagire con la parte dinamica cliccando con il mouse sui link evidenziati.^^ La scena corrente è chiamata "Tutorial" e state leggendo la parte statica della sua descrizione. L'unico oggetto di questa scena è l'oggetto "Avanti", che potete vedere sotto il testo. Così, per continuare questa guida basta fare click su "Avanti".]], obj = { vobj('continua', '{Avanti}'), }, }; paper = obj { nam = 'foglio', dsc = 'La prima cosa che potete notare nella stanza è un {foglio di carta}.', tak = 'Prendi il foglio.', var { seen = false, haswriting = false }, inv = function(s) if here() == r2 then s.seen = true; end if not s.haswriting then return 'Un foglio di carta bianca a quadretti. Probabilmente strappato da un quaderno.'; end p 'Un foglio a quadretti con il tuo nome scritto sopra.'; end, used = function(s, w) if w == pencil and here() == r4 then s.haswriting = true; p 'Scrivi il tuo nome sul foglio.'; end end, }; pencil = obj { nam = 'matita', dsc = 'C\'è anche una {matita} sul pavimento.', tak = 'Raccogli la matita.', var { seen = false }, inv = function(s) if here() == r2 then s.seen = true; end p 'Una normale matita di legno.'; end, }; r1 = room { nam = 'Lezione 1', enter = function() lifeon('r1'); end, life = function(s) if not have('paper') or not have('pencil') then return end put(vway('avanti', [[Eccellente!^Avrete probabilmente notato che la parte statica della descrizione della scena è scomparsa, rimpiazzata dalla descrizione degli oggetti che avete preso. Per vedere di nuovo la descrizione completa della scena potete fare click sul nome della scena in alto — "Lezione 1" o premere F5. Il risultato è lo stesso.^^ {Next}]], 'r2')); lifeoff('r1'); end, dsc = [[Lezione 1. Interagire con gli oggetti^^ Continuiamo la nostra guida. Siete dentro una stanza e potete vedere due oggetti presenti. Per prenderli fate semplicemente click su di essi con il mouse o, se preferite usare la tastiera, potete raccogliere un oggetto usando i tasti freccia e premendo quindi "Invio" per interagire con essi.]], obj = { 'paper', 'pencil'}, }; r2 = room { nam = 'Lezione 2', enter = function() lifeon('r2'); end, life = function(s) if not paper.seen or not pencil.seen then return end put(vway("avanti", "Bene!^^{Avanti}", 'r3')); lifeoff('r2'); end, dsc = [[Lezione 2. Usare l'inventario — Parte I^^ Ora avete nel vostro inventario due oggetti che potete esaminare od usare. Per esaminare un qualsiasi oggetto fate doppio click su di esso oppure potete posizionare il cursore nell'inventario con il tasto "Tab", scegliete l'oggetto e premete "invio" due volte. Per tornare con il cursore alla descrizione della scena premete di nuovo "Tab"^^ Ora, osservate il foglio, e quindi fate lo stesso con la matita.]], }; apple = obj { nam = 'mela', dsc = 'C\'è una {mela} sul tavolo.', tak = 'Prendi la mela dal tavolo.', var { knife = false }, inv = function(s) if here() == r4 then remove(s, me()); return 'Mangi la mela.'; end p 'Sembra appetitosa.'; end, }; desk = obj { nam = 'scrivania', dsc = 'Puoi vedere una {scrivania} di legno.', var { seen = false, haswriting = false }, act = function(s) if s.haswriting then s.seen = true; return 'Una larga scrivania di legno. C\'è un\'iscrizione sul piano: "Lorem Ipsum".'; end p 'Una larga scrivania in legno.'; end, used = function(s, w) if w == pencil and not s.haswriting then s.haswriting = true; return 'Scrivi alcune lettere sulla scrivania.'; end end, obj = { 'apple' }, }; r3 = room { nam = 'Lezione 3', enter = function() lifeon('r3'); end, life = function(s) if not desk.seen or not have 'apple' then return end put(vway("continua", "^^{Avanti}", 'r4')); lifeoff('r3'); end, dsc = [[Lezione 3. Usare l'inventario — Parte II^^ Potete agire con oggetti dell'inventario su altri oggeti della scena o dell'inventario stesso. In questa locazione potete vedere una scrivania. Provate ad usare la matita su di essa.^^ Per farlo fate click con il mouse sulla matita, e quindi sulla scrivania. Oppure usate la tastiera con i tasti "Tab", "invio" e le frecce.^^ Ora guardate il tavolo e non scordatevi di prendere la mela, ne avrete bisogno per la prossima dimostrazione.]], obj = { 'desk' }, }; r4 = room { nam = 'Lezione 4', enter = function() apple.knife = false; lifeon('r4'); end, life = function(s) if not paper.haswriting or have('apple') then return end put(vway("continua", "Bene.^^{Avanti}", 'r5')); lifeoff('r4'); end, dsc = [[Lezione 4. Usare l'inventario — Parte III^^ Bene, ora vediamo qualche altra azione con gli oggetti.^^ Come prima cosa, scrivete qualcosa sul foglio. Fate click sulla matita e quindi sul foglio. Ora potete osservare il foglio e controllare cosa avete scritto.^^ Come secondo passo, mangiate la mela, l'avete presa nella precedente locazione. Per farlo fate doppio click su di essa.^^ Tutte queste azioni possono essere eseguite anche con la tastiera come già descritto in precedenza.]], }; r5 = room { nam = 'Lezione 5', exit = function(s, t) if t ~= r6 then p 'Abbiamo già terminato questa parte della guida. Proseguiamo alla prossima, per favore.' return false; end end, dsc = [[Lezione 5. Movimenti — Parte I^^ Ora vedremo i passaggi tra una locazione e l'altra. In questa stanza potete vedere cinque link che portano verso le lezioni numerate. Andate alla 6.^^ Fate click sul giusto link o usate la tastera - selezionate il link con le frecce e premete "Invio".]], way = { 'r1', 'r2', 'r3', 'r4', 'r6'}, }; r6 = room { nam = 'Lezione 6', exit = function(s, t) if t ~= theend then return 'Abbiamo già terminato questa lezione.^ Proseguiamo verso la 6, per favore.', false; end end, dsc = [[Lezione 6. Movimenti - Parte II^^ Ora passiamo all'ultimo step di questa guida.]], way = { 'r1', 'r2', 'r3', 'r4', 'r5', 'theend'}, }; theend = room { nam = 'Gran Finale', dsc = [[Con l'aiuto del menu potete scegliere un gioco, salvare o caricare una partita, oltre a svariate altre cose. Per aprire il menu premete "Esc" o fate click sull'icona di menu in basso a destra.^^ Ora siete pronti a giocare. Buona Fortuna!!!^^ Scaricate i giochi per INSTEAD qui: ]]..txtu("http://instead-games.sourceforge.net")..[[^^ Il tutorial si avvale del brano musicale "Instead game-engine" di svenzzon.]], obj = { vway('keys', 'Vedi {lista delle scorciatoie da tastiera}.', 'help')}, }; help = room { nam = 'Scorciatoie da tastiera', dsc = [[ Esc - Menu.^ Alt+Q - Esci.^ Alt+Enter - Schermo intero/finestra.^ F5 - Ristampa la descrizione completa della scena.^ Space/Backspace - Scorri la descrizione della scena.^ Tab/Shift+Tab - Passa da una zona attiva all'altra.^ PgUp/PgDn - Scorri la zona attiva.^ Freccia sinistra/destra - Scegli i link nella zona attiva.^ F2 - Salva la partita.^ F3 - Carica la partita.^ F8 - Salvataggio veloce.^ F9 - Caricamento veloce.^^ Le scorciatoie sono attive se si sceglie la modalità tastiera nelle impostazioni (vedi Menu -> Impostazioni -> Keyboard mode):^^ Frecce su/giù:^  - "Scroll" mode: scorre la zona attiva.^  - "Links" mode: sceglie i link nella zona attiva.^  - "Smart" mode: sceglie i link e scorre la zona attiva.^^ Frecce su/giù + Shift o Alt:^  - "Scroll" mode: sceglie i link nella zona attiva.^  - "Links" mode: scorre la zona attiva.^  - "Smart" mode: scorre la zona attiva. ]], obj = { vway('cmdline', 'Vedi {parametri della linea di comando}.', 'help2')}, }; help2 = room { nam = 'Parametri della linea di comando', dsc = [[ -nosound - lancia il gioco senza suono;^ -debug - modalità di debug per sviluppatori di giochi;^ -theme - scegli un tema;^ -game - scegli un gioco;^ -themespath - percorsi addizionali per i temi;^ -gamespath - percorsi addizionali per i giochi;^ -window - modalità finestra;^ -fullscreen - modalità a tutto schermo;^ -noautosave - disabilita l'opzione di autosalvataggio/autocaricamento;^ -encode [encoded.lua] - comprime il codice sorgente di lua (usate doencfile da lua per caricarlo);^ -mode [WxH] - usa la risoluzione WxH. ]], obj = { vway('keys', 'Vedi {lista delle scorciatorie da tastiera}.', 'help')}, }; instead-3.2.1/games/tutorial3/uk.png0000644000175000017500000000067613267071774016362 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<PIDATxbdh1 ?(# rr1Pz(* jd!7nG3K,TCœ~KG00T??߿ !~!@lTd6H+ks X. l$P*  rJSߟ wHʖbc:@20?/WdbRz@C, HTE( @ P6  @uJDA:#B?bz@I8`@pAHnGIENDB`instead-3.2.1/games/tutorial3/fr.png0000644000175000017500000000104113267071774016335 0ustar peterpeterPNG  IHDR ngAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb,zߟ??022*'b ¦$A@? ~mE@40g߿ _~@6x=|Ϟ "@K890Kt&8@[zM"-b봗bP߿@*)qm@@/A00q;^ 7Lh3 |Tt@P?zD_6ˏ_@A]T aUV j=I,$߿@|z?.Nf &H@ %1d@|m?~}ˏ_Ҝ@ǏzA {f uDIENDB`instead-3.2.1/icon/0000755000175000017500000000000013267071774013132 5ustar peterpeterinstead-3.2.1/icon/instead-s60.svg0000644000175000017500000002064613267071774015720 0ustar peterpeter image/svg+xml instead-3.2.1/icon/sdl_instead.svg0000644000175000017500000007530413267071774016155 0ustar peterpeter image/svg+xml instead-3.2.1/icon/sdl_instead.ico0000644000175000017500000006372613267071774016135 0ustar peterpeter00f  h)00 %-  R hnc(0`͟~knlhyyyШfʷwsZuso͎{ʷy}ue߻sxjھ~h´ݸ׿ȼo{r Āզž߹׬У˨αӺŹurpl '+Ƥ}ò߽ٯҢʚŔÜƢʬϵԿƺ~ezws+1 bc~ymʿڳӦ̛ƕÝƧ̱һǶj}ܓș&+$+#'{{{rǸ֪ΜƕӠߩܦÖâɭϷw~tbwww;> 4:KQ39ZQH̭ϟǔõ١ۢۢڢڡןӼħ˱ѽоt|l chdibf$'cʖ֜לל֛֛֚՚ՙϕηȮθԺŸf|tgvw#(hl&*?PcɐӗӖӕӕҕєѓѓѓВБɍưĪ̵ѵŽwVqme<@ݚܚۂ uIcm͏АϐΏΏΎΎ΍͌̌̌̋̊ˊˉņx|~~ȰίuV~zsnoӴ⑔%*mY{ַˊˊˊʉʉʈʇɇɆȆȅȅDŽDŽǃƃƂƁ|uyyz}ĪȬnsk^>Aik&Ze~DžDŽƃłŁŁĀ~}}}|{{zzsp~suux¤sytB\g"1Ppr}}|{zwvvuttvvvwwv{ÀăĂÁ|wqޯjfvknor{ivu{wЫpxwtqpܯmӨhХfҧfХe̢cѥd٬hݮj߰jq‚˔ΚϛΚ͙̗ɔ⾋̫~رwԨhW~Xi{fijl]mkurmrpmڬhУb̠`Ɯ]WUUTQSW˜Zʥoۺǘ˛͜ΜΛ̙ɖӳ[PNDzf`SHxT`xbf]khdkkhܫdե`ȚZSQOKIH|FzEM^pxĪҵ۽Ƙ̜̜z z'#U[MIsS{Ms?{qOe}amjʺݩ`ktثjʞ^—YSMNMbXCiZ@VoMOWTs[lgku{ֹĘ>9 o/1k.1f#M DII>AjLMB|sd򴬠q—[ΫzìpZ_\l[xfmafb{hdYhRYYVXThkth\~"[9Wn(,J,-O?c~5Vq@("3UF2wX.whR~pD\sXavvdcXdgbT[ZVVQ{Tdkzcq[`UTr 46p.3Ne;Xo#';Y>bx5,%3CJ;bzfzrnekV8oyڑߌށzŅOWXg^PSly.B`pw~ n->a3;S/1HPzlemb@bu`NqiҘߌߋމs`#3[]_i@AdSypNtrtrpomfOY`Ͽumpz}]Q;tiUoxxgw݊ވr > E&4UACXII`26DWywvmfponcPV򘧮vxmprmwFbueYjr}Ɗއ]rl14@4:G$,=_{yU}qnpn[fw黾hzϻtY7b=@DC܊ވ};HU&.=v|~}rgmqarpWrꧧ物Ǣitzdijzߌߋށ!-C$.<:JTNbm~ndefytrbPywǒϪ藻Ή}ޢ勱fszz|asђߍߋށЃcjtyxɁ|dt|gvtX\q䄑Ԯ郕҆㒿ߕioߋmMam{ʅ܃܂w`~Vpfyxqz}߀Љo}ߎ_vCWb^ujv}t܂܀}|yvWz㞯ֲꁜㄛ扫ɝ㍹p̈́̐qk~Ђ؃܁zn~p܎ն늟滼ϩ璷ˆɓܝ䀢nzwЏpun|Ԕ帻쏡ް׫菪唹Υft禰ٛv𵺼얪˟ӭ鐰xz|ס凧n␿u~|ٸɇ싢q|耚mvzxmӇȘ⋷xq͟hii}qtуrү瘽got~u|lǤ}燩qstw}Ӡ䒼ӗۀk뢿rz،z덞ۙjopݵ゗syȖvkqtҬt۟sӔ߁|zpx|~wٛګڰ}Xvyꎢ\pz횾{~uz猟~ā犚ҫ̝ܲ( @䵲}{m}ⴲͼž}}韡ڨ¬?DWZϲӻ٭вԾѷQUdfجМħ̳й|۵Y] -1ǽРȕТȠ£ɱѿ©v HNHMljmƿȔŻ؟ٟ؟םҿɶѻȼ{>A:@uyux9B’іԗӗҖҕєʏƸDZůu~t~Þtw7L|zŊ΍̍̌̋̊ʉʉʈɇƅĮ~~îqehmpK`~ÄDžƄƃƂŁŁāĀ~}|y}vyoRnyײvzxv߳q޳pݱoݱnqrv~ņNJƉązݱpk~lnxm݄~رrqmըfϣc\ZXXɝ]ϥh⼇ɖ͛Λ˘῏vfn^cW^j|e`|z۾wljӤ`ƙYPNtG|JtHvOfqβė~*) h61KmZMlEzWpuhͼȡkЧnå{ltZj`pslmurouqyekg\mu`V'k+5]/8^+Ce?SE9h?跰x[qSyzytxoka{zp_ZY\ z).k>QmQ|EfQ;IPAdzyp~̏֒ߑߊۆqg?Z{d m5@pTyOrmnl`Uvħ܁|wlu`}wz̃?Z1EoPJh~yoxtniV𢲺ƛڡvvcI^ed~j4AP_lygipf~ﲺҙ͈y|ߌmB[pLamo{h~ss[j졯ө哤Ţ啼ҐƏņȒ߈wz_{|ȁullts{Ɨš֠ٻɛӠᘽљ֙Șw[wn}vĂـ~ywzΚ敱޶Ǡڒϔ֌~Šy~|uĨ깾靶Ѧ⌟۝wʈ̑ɛ̷͟뜷Û䖵{͓̑؆Ȑv‘rx{發πだ𤶾צ睽˲頺Ɵ˝şԦ剧~Ζṣ̌䈘⯹۩狭ڕȌ~ȍלsʻ畹͈˻ƌԙȎ̭Մn˜埼ʖsŕǺб( ڶڨιķ).̵­Ƿҳ"'_cv֛՚ÔŦszyʈɇȅDŽł˴}sݰnХf͢c٬jʑō}iskͺجlhYx\u_~f{30y*2]XHB{atq^jr w.=}Sz\LoՊtrCWrTqrÒlyԠϙ܋mfvszΠëϙǝАɸp|}φüѪֳʍքǎ؞ؓӣڒѹǝɡՙӒᆪӝǣɦ؋ПûAAAAAAAAAAAAAAAA(0`  2 ibS9 pR5 /0)k\ʷul]AmT=)  2A8(sʷtVK6{`K6$  ,+*)  D`T=pUK8~\F2! ]~IkB2 % FugM´ȼjD=/rXC0 T5&I/* fižŹh!jV@- 7aI89>9,xyòƺrW$ gR=* 42h^JC3ʿǶseLcN9& \6~l%fG$+ vh^GĽӠߩܦÖu`T=_J6$ 64:KQ39PG=񽷛õ١ۢۢڢڡןӼnWJ5y\G3" 1<chdibf$'c֜לל֛֛֚՚ՙϕη_F:(wZD/a#(hl&*?PcɐӗӖӕӕҕєѓѓѓВБɍưŽoL(!jS9!'/3 uIcm͏АϐΏΏΎΎ΍͌̌̌̋̊ˊˉņx|~~ydA(!V5  O%*mY{ַˊˊˊʉʉʈʇɇɆȆȅȅDŽDŽǃƃƂƁ|uyyz}mA6$D#  &-5>Aik&Ze~DžDŽƃłŁŁĀ~}}}|{{zzsp~suuxOWQL' `~}B\g"1Ppr}}|{zwvvuttvvvwwv{ÀăĂÁ|wqޯjfvknor{CTRO) Wtp{wЫpxwtqpܯmӨhХfҧfХe̢cѥd٬hݮj߰jq‚˔ΚϛΚ͙̗ɔ⾋̫~رwԨhW~Xi{fijl5IFM(OjfurmrpmڬhУb̠`Ɯ]WUUTQSW˜Zʥoۺǘ˛͜ΜΛ̙ɖӳ[PNDzf`SHxT`xbf1C@H$ gcLdkkhܫdե`ȚZSQOKIH|FzEM^pxĪҵ۽Ƙ̜̜z z'#U[MIsS{Ms?{qOe}1@<; p@{ݩ`ktثjʞ^—YSMNMbXCiZ@VoMOWTs[lgku{ֹĘ>9 o/1k.1f#M DII>AjLMBC7!)  P=!muA—[ΫzìpZ_\l[xfmafb{hdYhRYYVXThkth\~"[9Wn(,J,-O?c~5Vq@("3UF2wX.J5 @   BaH%e6\sXavvdcXdgbT[ZVVQ{Tdkzcq[`UTr 46p.3Ne;Xo#';Y>bx5,%3CJ;bzH'CTjuE?3X@oyzOWXg^PSly.B`pw~ n->a3;S/1HPzlemb@bu`=d}mK+ 0Tm{s`#3[]_i@AdSypNtrtrpomf$-vX7  7DELalĞ|TpANR]Q;tiUoxxgwr > E&4UACXII`26DWywvmfponXPV&q"  [r~Yq~|ufJ7$iwS"pI8O[~nbKGMutrbKu&MUVnzc>',x\{M!).=4BIxy dyѲNbmpR>0>FQjxdC$  $6oۨYkt}-8>lae՞q$/6: ).Bc_r|!$k\pzze{ب &05&+B(;D>[iD_lYwš:EKK/(oˬu?R[ % D`n!(*qV=+!"").U~`zF#/KX9oyq#,1l\ND?AK%-2~s?PX&?JW:^n+2R/DOwO`h2;@#& &*5?DUfoǀ-9?M!*/v&*0 Jr~quk3GtQ~GSvƐtTJ[cYnx' gw+0Wsўpuݵum~* Q9WfD^k1@Hh'+Xp#DQWi[lu ;Ua2Tw YnyRfpM |8??( @ %%%  `n`F?6' R0   [l̻¼b&"]9"UUUUUU 6_;(%D=/«k)%`9"UUUnO"2OF6ukV {P/ %%% ~BN YxbkdPS0  L?Ip  {rZкǼТȠySJ7iE' Zi HNHMgfhƿŻ؟ٟ؟םҿȼyJB2 nH(%%%%%%  :@uyux9B’іԗӗҖҕєʏƸ~pV0'V7  +Zpstw7L|zŊ΍̍̌̋̊ʉʉʈɇƅĮ~~wlR)#0UUU 8FJ~mpK`~ÄDžƄƃƂŁŁāĀ~}|y}vyhnc=UUU((6Wx|Rnyײvzxv߳q޳pݱoݱnqrv~ņNJƉązݱpk~lnxSonBUUU$#5j٢~رrqmըfϣc\ZXXɝ]ϥh⼇ɖ͛Λ˘῏vfn^cW^j|eDb`>'"0YljӤ`ƙYPNtG|JtHvOfqβė~*) h61KmZMlEzWNTE,hO,zUЧnå{ltZj`pslmurouqyekg\mu`V'k+5]/8^+Ce?SE9}]26( 1$c}jL~gHyzytxoka{zp_ZY\ z).k>QmQ|EfQ;IP=bwi3 ,o]km㉴qg?Z{d m5@pTyOrmnl`8[qi>%%%1>Ef'17wri3CJD=/whN}vz?Z1EoPJh~ynP|XndM|3@PdoTlzc M. fZB$oZ>^ed~j4AP_lyAat ZWap/J\`"  )16rBRZmܠ;LU!j [)5;qmB[p7M[b{2IWc[_sV4Re UUU QclOcmYz\xρrpJi{tj.DQFd+5;Xbx !#= À??(   TTT***'}t`i`N ]@V!VZZZ# _cu֛՚Ô/)3 35^szyʈɇȅDŽł˴jn`%TTT?VV}sݰnХf͢c٬jʑō}is]+SC)d֨fhYx\u_~f{30y*2]XHBaU9ZZZ -rrg샥q^jr w.=}Sz\Dg}Q L`k{!"_R>rrCWrTqh0K[i(@O"*.OWmxXqasRGBbKGD pHYs B(xtIME'tEXtCommentCreated with GIMPW IDATxw|ӶhUV˽ɽǝbcSC:@(C SI`L w6m5KJݙcfwG,{~4Y><<?GO`Plܶ$k l?C=yX℉pЖ(Iҁ|xP k>F[ Ur}_yphjh푳N$*ST}Y#9%` 0?Co#$?}SNthʧ(HsF$k(S'$ ?r^weI֘8v piVF* ot2^MU>YSr#*2s'fO_e")ҷOQ(vpXJN5_ȡ? A9NdE 53S%IR 0vDEL$YAU+Wx<5onʡ)lLM~& F) g]絗KϟU\7wO J+kl+Mš߾|KSqg>V@Vm3(K=M=MVL=ObS{o:nl;Xi,M@o(5`;:N0«obО/!"Ir Kޝk£Ͻ+71cڨ{[Z;ᗁ@ ։B!|iE_jNQ|zg>{>r,<|<10la~~;Kγ⃀AHK`m+_7VNLn0aw.|$cAv:2A=nrN CriQ·ǢƟ(0Ag 4)J$v b*wf;e%A6|d55G0-oJ/t:F L?NJnVj8 V`;vcS^Yg! ~J ~ O^@U/V+ڦ~yx ٗdVg8#Q]SlGAM0JTފ 1mOb&qg»۞1 q3_ed7jDl (lۻ=pĠB+S/sg.}ƦVXnF)s9*PNzcnj],aνs#DpƴQٷ^}}{0o)=Tu2fӈr zeܒ~9}鋑zé\D঻^`oi @1^^Tԓ3Oj;4E +q:5N4]lVbV.}QY>[f^5}feRɹcUhYjuZzɊ ˈ]Q?(*zzʚt` ډۢ6Qz$IwƎХXzۋVlQIV.$+J8 oЁ=ʞ×AnN&-x_3s0f)ښ&kk޶5]s鳎߇S1%!X{de-GKOSN8FMU7S/ ud-|\W53#;37N ?hX.!43yjdI:ߵ'w;c%+0*Mgkݵu{ToMZ Bj=dPi!/Fo}GEY', Ktbfe[7;?'pT d޲= }B !-%iCһG,!KPUSƭ.$N9>$ԧ_~z0zI:[QZ1ORAP7#)1Շn9G3ZJL+h0P9'9,;P'J㧌 TOQt:^]*>/5HHvޡ.~NR6??X` 2uیmعl/ϜکB0SEcb;a?zO^,+𛭭ъ-%;PFȲ >\괹M&1qnAvf*ޤՊ !Y&6Pyun3n';3hܫ Q R6!+Xkvϑ?t &E v8~A'?z%dgw;_jk) &mXqǝq/=qR&}+r.xs9v6A'fQtJ( >=tR]{5_][Gyeu=ޜIeqc _{ǃ/j:`Knx.,^>׻:ʇZ>$$N(qbl1@nGQbH*'c%ʝXc&2RG !!BLy󃯟?w>˧KRQU$)kFK!R Sv "૕WZuxHo(-tν/VȒ^`;cE>[;vA]J - q)-363gx,'{~p_(Q,hh'.xg$95o*N:sv/滝ecP g?4mm^{o5K@d[_E;)]źnQf~PQ+~Ab/8c*6o e'pbRBܵIs9:-łΈ iItD)C9oKoWeDkN?eAqp vUTI#{1id7}Ki &Xv20t}-Vዒ1c5PUHj.1UQxo,$0]eL }GeYbԑ u۾!@_?q㟺 e`.k#JپPFc66\@\z{-Dߗo)Iqfz9 _˩vv] ͭ^{} 8釽3ѭ[P~Vdz=097'=oDI?:SƄ_q;i(mi3thoiwFK@k[%7RQU'ŀ> Sx!xEKؼVGYc=P^aˎ:eJLz֔Cx/Y `xC?U[|ք.H"SeQ8*0>I/EI}F-QcзgAFRz;Gιn>zuײaG aėc<eƽ cK -]lQ5[Zr7JQɠxu瞃͇kĄJgN$DD|ᨡ}r˜ !cq b}3>~|֯gSj"Oְ~ W|{0Hз8sa"_SRv٘1KL֣ȫ_ٴp.,@,6zd!Db=n<\\U\?.3{`BػshtWBؔLQ^:͝)Ǎ.I=sy 9;xmt#k޾S=qkwC+;gBuDE jNU +@XJ`G ; 33$EU$\C{W, c:c:\MS8e3tZ "t<&x_r׵SUy #zgtBPq:p/ѷ. Pl..>cQ}젲K˦ī6O,=Rr#:IDs\tY@&w9qiSq;>vv%EysteSFˁ*X(|>lPcras.Eq~zLjIq~}wy^eMKT۲|vq y<7k>r+Vx܎.?aGʲBGmDJ+V=0}҈󟿋PΛ.ͺV>y쉓nDn3g-xw?zcxbpepSY59Fk+˿ɢT },km pxvGoln>\b^[%aB)#5ӌFSd*-;+4+1Uk쫚\F X\0bH{C8j7h;Xj1{p~E|ݸs`eq:5/OqF{khޏԤWʴ;Qv^!1>7-K7:w֨N\u?Xk EGȈs9J^{j3O9'M)atIzeЍܔ.ś" v2B@nWk@όn/f!Kۡ*M-," .\Mhu?q阋9SSoe薿s nCKͷґk/wً\#?c_>=$Fkjn_>VׄOsЦjmð; ħ7U9d >!a9ָ '>m`ʻ2sVm t/ 6EIs9't_{N9[w[EuhҲ̎@߃Ni,N2{o֩5p`SQY̜4"+-ӅLMm5bLfK%]&.ێ*HCZ+rDY*5%)ϼ>5ʭGꚸgEk1 }nXfZɲÝW4⑨ M6m++gYqA~J$'Hw߱aJ3$P8܊Umʄ-i)INfxr IDATƦʗZ<ݘK6XpڹŬ qB~Nw^Ԯnap@YVe+@ҙ S0 uI &/AdoJ~|oqՅH/w!+6ld!( zSǸ8O7ȣ-D2lw]Z֔]ZeG㕖{-VqΠo )[J{#Ͽò߭^B(-OҀLYs'O)8R"0`+k h1Py 8熹-=7!g}Izߏ$ZWJT:=g7 3 Uh 5pn֩B54Rj 8=FBR3^N[:n/=zS;-ݽ'^z^yyx\qB_[')F,⑘KLp*Cg2MS$So"fwظKt.?gubѥyu[sɓ(;\Miy9e2lH.17>}h1NbS,qC 3S% /a jQ-Pr vFw]-ڛ=Mа{¼뷟KwJY)Zr_ hJ0֡U&|I `0#EeD" Pv7/Cx9<3x8eZ U|1 Ëرo?{J0ڊhmq.lǾ5&w;c(Iq qmWV.9ϻxQ\ |d=5wP68͙H}*gyqj2C\u(?f,ISJ ?e/aSs }s1LޓT{?0f NP C!ش};S'拧p UJYMSHwr>y㎡3:r \EeY1{l& 1;mo%ɉ|CrJM6݇ͬ\6殮Տ+^#ђ2М.< F;dbfOQ}T9۹ט?8DH}?2YэAiev%?N&G˒wӿ(܌vb[xo[,ZKܻ1H-﷧[ыG}m" /- [}s[5<?;RVYKeu=ջik vvighX:ô4ȁdPQKlB  É4 !%PJǡ24텨A_nhs9UYC e ]ٺ +w?1hJEMBA $)*=zݢӿ燎}dG buQы!!͉8lkfo} 8k}l*ڱʫY~g?i $| ;ߚUni*' 73"`PkcvOuJ\Mxe^ˬ7[yVqlt!#!nrg z 鞛MLM6kG8窇SZjuۢ\g46ew/zMyϹw9ӕLыx ؾ=dJ`JX{U͚۸Y6=LFy;6o?w= !l8.lZcE:Eߞ'x+/˩Ϲs `0:*sYSe9aMc_^_HacPn^x-z#/ Wl1WԖD!udڭ*bV Qɦ|1}1G|VDVjd꽴yzfw .`Z Iw'Υ:,)1_vdLЪ0YA0d2rP4M}UM,;yTo7qy@]2 OR2s{}p/xv$rh)~Δ$\9:E:Hpi'|0c{0X7?WfKM#HklUhiwQ9ְX=sr>66, xj465fH9O"!'HEVƞ;ݏ_b %DT`!<|fҩF|3VmMf%7?vj-pAҳ @vaONF[ g ٚe"q*uׁ%o8Fv>@Ak uV6qr$SOBѲkrz?l o7qCÿw֗&Xu/z 1oc(lP,1I JdLFq<9S4Tvͤ$ki㾧гP*Jy;Ίow(2"9g1~xϰ\a'K6T0IG%8yZI\9)4Ւ[dH!hC&Lc㩯o]G@+ R{flGֈK|[777"@46R'to\w,߸ЂB[[Xl'Ǐ+f`-?+Io*CA3g^Ccs6[cp /l:m^XX Rt̻l_h7ļ>$#SHq[Ⴁc: u<4#5p!М.N0 +qpܬ}VmŸa=ÿԈOJ!5;L=!(-~TC70 6 oyy$7A0oq'+&IȖ+>'}v0_ onE  4gA񠑴ϕP &P\4Ϊlmjmy;/Z )_U±' u}ʈ 0T8A35R2ܮ%l.7/M^Y)AO.^w'b 0PN|6g'\cy}1A|b2OfMctF .|ūv0pTȲ(hFs\S.ohv!e8%3HvRȚ|:X^AT~k6odrp(2_lY@Ud>^6g$ zkiU523| GcgIJEANQ_Z j&z!٦5 E5_8ӅrpݤmkB~_zw/Mό BqNd&:I1 `´$!+4eEEV5́9PNT͉9ZW")n)NK.TMD,oFE (+DB )ͥP/+Ԧ'iTBrQpkTPBRY\,uJׂƊ}4WM',~l%tIF2,G~=0K0 MCkʙ_4 IIԴJx]2,bHji(쭬BX9NgjN7=GL/[-2$[!*L7(;v;N`@O#FZsq$O B⒒V1Pi0T|m.Ij'հC+@|VP<(NFXѱ@U ]F(20L% #,I,.CXnaCur tÖ *@ [%]E .B*HY_QUT4DU4KdsȪyLRB72-HZ$ )-'_HQ,Y8^Ke;Ob`-0&Bx/uy=Q{ "#3'ɺ>Rh H,j rս h 3#6ҡ׎?VǸ|_SRJ4;a2V,# Ca((̻~2B@Ba! dNH a !d޸Z_+('-_ozN'%"P<`M~.Y$YFFBH${ }P ߴ"pVYAPDb &dwf>uq#'9ղ:4 Cq`h  taI#+#x/(mX@q DQ];IObV,M)!,W c.HfMW Z Z^@2G xTM3]9P5fl,ɦٷ ,o[I=xj{盥y GUW[8A}Eh2yMT~N0hk.z&&3ȲHaU68f KYIJ[-mm$%7lqߺ0Lo _PUEDb1A ]P=$)+BfD$˄+HˠJ44d{;\a?2$f>Gn?uBd~ٟ")d H#K80p$,ǀ3L ewc#7.OA=' Ԫ8]8h9RIJpHu$'Qh3XѼ;MSQөѳ@%zk$?d@BFXq9 Iü8C1[ [do A3`4H#$I-b R@d+ݪ^ `$OYMD(e  K߄-d G:UCIM|c'?gVꧾzC55}àCd:"˲5L7d(B4XK(.P(W_f*,lHf/+հY0 3`TAahBBۊF)xk, 2P YPL.H@[Fd"B%%㼩2!pe34Եh1Tt́Sb\[A 1ыD2/aYv_RC' -[w{8<>NW~(9jB6]A8ѿ C Bݪ!*E2aX1 kʖWѻR+e wI6Auץ䒈SySRlUJ2-Ch ]$c(* &/ hfp*:@+#U4Vj`W)yY2IIްBAnH'C˟өX\.-ީm/62arrRp:*TI:[hi"G?܉)ߍi9L6V\`F8(XKaRE5g~V#AVoPfM­JT b QeB@G/K%mA !̘Bsk+߇V=$&&l =x$Yu ՜v kut !4a˖m橧>Vrmg3xp%.;ʿb $V.GfO(́RC>FLcȑ\_d)"|۰]&X9> 6U˼*V vV hp\c2嫫l/r; i^܇I2iEm$ HO<>'&i𙯅o~3@bWlS7>.)bF-G0@vΝhX)[Z؃6ok ZiQðVnj-˲@F!aV૯lFNzH?P')э, ~ɪahYPՐ8ea-CcO<=8Q3SP\nfVVi8P%,˸\Nzj$G(5Y<8oYkN밠B M;a+="Y D,TQ;k{; Zk+Gf9l8׃bJ%fx乹2hFT?nc-`1GVqGf23罁+%oבȟI߳ﭠ[n9 ˁde%Wώ)@j@xCœ!"z[Dn84|xGn1'PEgTi/ii|?dDrrSN4ͅᎱw.Pn泭|2k6XM#VQ e!NzHauכw0@2G"W/zmZϖt3$*$'HVVS py<8q`% +m ȶtHiozK}Q$Z9r`u6[AI.z9z=NsxYV4'j V\hG t 4jZX/& edﺥW'rޘcQxTm駓ԯ?"@}\fÇSz%d#٩Fݤ)&8p'$Ƙ\GG8\xDf|G!wTΔ&đC{ݳڕ >y* ʍy 9u8\6%pSMs#I~#!=uȎe`77 pLg4&<ZbRGl^4s.΅ϵ-q "}t|բtFDNloQ_u$80i\.Gw- a,G+Y8ӋOIgGyT ԣ*l?WRˈ1vF,g0bR s服7DIDAT= àmi&%g⽩WtFgQ˗EtPq^⛿(tu4;m xS)EynB:wװ\@RV>ۿ^ĒPz_v %\:9 ؞yf:*<>x퐿fvCH+HJN[am4TQsh/)+''Í㊝nCB5n#QȲF uo-H-t>{*|e41'+55d "j9vב-A.x N\7wC߲kGm di-+#0~tᅄ-u~'ģ*M$?}S_UN8uB 2m&,)BuaVmٙMZbj ٳ5Bznߺ_,,@]waYg ` @Q`Suf}\NzHöu67kojniuE)h8\A=(u?q|'10aC(3o7 aDAj0d_FE'/w*&@[?;$H5kE kBM,/#Vt"xŻJ/e#v2 nkkQ>v@ 7o/xC <תVpkd!)ā3Rz5đ't1rj ')+2{sb 4}H u襼lW.{^|T|7s{Ym@6)弐"/[<&rdQM2?Q-U~ϿMA ,Yedg;f¹Z 6'%)B_naѲq'&gf&':PO;f )/+ 'e,j[/sE`px-k.,ϱM) 6 m  2Y 0THC AFIb\|wn /wWB$#sTUNp ZOE服oJJj 0Fx , 5ɩ 1%>@?(q45C٢z}yN?W`l:Pfİ$+`so ˀ/rc" A46 8]?3O6lxQU9Ah&A"*k`"{F-gr,lƗ7Je9^u8Np#D1 U/-VU|h?/oc/H<1iLR S`|"dKxal=yX 0"v_[ 8΅u *A$kŰ'@qQ3܍۝gёcHtTC=(TRv=r/G>#%Yкvw覓z)tߊb]]"sQ>Qxb`k5?άlXU"qβ*Na|-4L|( ^w2bċ`%>QA$"virKQ^ɱ<*J3ɠA̛n6 #K& z#h^;\sߒ'f|B c`sAN݊5O4Rյ8Jt620j\DWhR^=#ΑXmʏҼ "I ':z9B,QQS ~ɮ& wꉜ W30iht>b?حWӰK U05}QTgor^qy2Ţ\rt'͡mܚwMlv:=Qt(ںs>ɃojJ}?>˯n} *.Z{qo?k;I0T'ct|KBCY_}3jG9(,7Hlбh(2ZDѥXUEzwq\}bӭױoכHx}=o?x:u&Erb0{@!C/z?A\S 1 7,?ʟ>*R4J_k#jBDQ $AƱb 0F{l ֬20<ޯN1ӺU8^t]ǦueRĘrH$kHfvi/BðCf휚8.6wv୪g'l\.1ıv n (1c\oe'=?iTwfm2 r BHík0qN8!G׋ܱ/KhT[ΫZS{smӳszzZ pzd$0|ĝ@p019ž~ W-btWvPUU=7c&˰VQf_W33fX;8 IZ>]7#~{6"69ʲ" H'a~Щ)˪)]XKtf7Y~_Oaw%9HEX?j "@֥ˎC yck.^m~ ΪR^\ : $=, շ#Ѩ̗M~UTE:N'[`frS_kXOWkۍf4AJg H;ndY{wR^wÎ2KgI5mtV YX >)`$99u↫Qۛ6т3M,[A8.ADQo=G:QVSOyi?rpF<{;l0,Hh8S"!γK_ n|)BCL4q7jX\apxq2䤬OY%A>%;tN|ߎPS8逷%q :6NU<^En~ Atzk (4 H,\Layva܆"lx3WS8j }3M3Btcx['DyrOuGqBdI?>Mdfh;W-2D S J? vt}ׯ'h}=[dplE3oHaSB4)cf@y)n&L3I3u-;7G2T 6@MNgR<6d-LJc f/kzcS-T/g=(ZA,V@DFGH[D6q><.Ohz@AWL҅R C7W-tn!H/uShϮ=~ǟ[$9N|>-MAY~Mqg/@ !X<IENDB`instead-3.2.1/icon/sdl_instead_1.png0000644000175000017500000004236713267071774016365 0ustar peterpeterPNG  IHDR>asRGBbKGD pHYs B(xtIME1iTXtCommentCreated with GIMPd.e IDATxwl{r~T]{X555ƒb,]cEAD#pzmcbk_3<<?-=]ӶG7r_rā&AN|\!IN,?&;t2驉xX]Q=ej!'} 's E HKJRT`1vBAng:>qk~h3& IRd̟$ `6瞼]~(ZjJ?`r3\!Lǜ}ǑP-Uctq~see/͊b1'|[AZm(af%>ցj3Ehv>aX$ty(V{ }W!AZR|y4rcK(jw_~y& jO?Zw&j)4">?NJ7PMfzrZy9{,\Ln!]΁ Yy}^_)C(*xX?0nW|)FyEJ7ߋ_}\!?9\TuUӸ#.6N͵c~#[EC }G}:dYS$NMsa3nY M&~AQT}}9N.dl^?{ !(K?E᾿/-{C xxzO[VS~ܥXm!t@:~x>l?ސF؍0i"' ߞ{y"= ` >Bn`gy5nLJ#.Avf*ٙ)f1}vKUm~{z8rj'`[q~AiZ[ݸU+guWKj= H^ױbfϚ)LvFr^k_$@\M~/HNm/-SL#WqG}hw+ )1mNרʹJ8̣9p>ϸa$̔yicx'.ɴ y~7NۭCEM+v {W>k\!OgLj/p"Hɋq#AӘ;6.=E9D7 f{5U'1YCQ#^ r!*媛egy^G|oׅ]| M0 |/ع'o]taV2 xbo,Ȗnb*fSo`[YBH_W|P ;x'>z댗>x]e(/zGWW/23spI{Sҝ{ץʇkF愉|iI"!%]ݽ\v?xTd8T&/03{jd _J/9͕ˎ?c_K%`F?l7bˏ Vp,2!.blRZB%pI:J8%.*zX6Y XoQ~ڍ3s"5hx|Mtu{ gGyDzf~q韨mNb6'+M絻IrwvusY7ug(͐|;1/r/@}v,Lw ^vzŏ11dƔCCN9BZ;bźou3mIrc7P2 .4sl?]4@~?d%3chc>翿o~RI ?˔ :’6?-CO͝o|UU(_͗ L:3s /.$@МYc {>,ۍ$'% 9@b@?YQg?+K>~Is(.bP]oPÌ |g7ӥċ? \=UON,YZ|%Y__GJFcAlP]^\ׁ3 p)7 0cbd^XSϿܯ^}M}.xퟫ&j Puwd\Ng?^JXtu8yx vȧ$)}7.aw_z2BsblV Y}Ofz/ϕk6COB>1s+yii1gf ͘)l⡧ͩHvR1+W[ewZ{6Pr$&HIvq`>dn_z|^πuJW+*5Xj=N;=>aQӿi].^1/{C.WM}oĤ#_u꧱M'jCLX[g@͊5Xn}͆ od9M)jNjJ$Y, eU5|74V_9Y)}@>WJ}|Mc~ғ #c#7,>?} 6o[#x~j V-9v>h|˸|>4UJG]׍*鯯txSHzz<86'gb~:g[LZr|O=j|Sj*1-k *aM˳4ӮYYF-aHP?B>q)IrWMgʬĨĊsϜKFQRJTE !tKUiQdk` .!OjπjٝMzJB 3=&)*pOI>~Z??mot̨\UnϰF[gr*l.cN:J MHL/>x1v+pjwM"IspI̝]ʸooU **+K Mͱr tT\x#9hH&^Y55[xv?4l賕l.-:,cgY5"cWkx_GS\}I2..&R/_}*ƌ𚤄k/>C8l{dLFUִy𥠪>eۮ1CsQYY4;8S7Gɷ:_yjQcLN6L+C|O7gp%+aM_ui.57cg\& lHX9=tʯ>ZYxz+1E}rR|Hv )5ln?[;9=UKz?YWZ# 0-JQTz}<9D+Ϛ3k鰻wϖo' HB} Vm(Ί00ڪjB|HvFѫi ;kڸO~ݱLIaŪMD:8|au( +7.t`}x60p|~N*o=~ 6-gͦOcK^{O^Wo~y> M3J/i5d:OxoW`q93s¯z(9I>q_.p>ZAI6)%n7_vT̵(HpDZ,% T7uPV>mVΘwn漓BG\4Fv7SΘ>NoY5h{Vx;~<#}F`~jr2pحX(*$\Koy?45z)o#-tnVn7 ̛3HZRܠ=x?ЃgMV}k9Ow|#2QF'Kgyi5c2\,hhcPj%E5wssFIq׹n͢ilZmJ_`k6+9؃wʘ⹪CN3TJr_#9)Cg)~)<.?>}v(7|,Nc߿*nxa4 = v| {L0X&i]RQ]/&,UMESUz4 t-_\4^4UjVz|.x )z{ǭ`~|kd[rr샊[=S¾%OCUhz J?^7,ne: ]^GKF@]7^ ;BZR(Gˇth=:2s_zɟJLtTen*纋S%;VGIƍ.-Eq58lbltt{zHrRJtkAKVeHGcnp鍏Q|Rr,'JavQ,?&+">`=z٤$,]qP3L𣅤A~i9  bdWuޯJO˹2Dd =?4J||qOMJkųp5).$ՠxV>u5 aU?iW< \<§6q1d9xYd2RW?m{hQ}p-.Ϸ'{cW>yU,^VOD^N7>eMU=)G; &(IWJ/-͍|`>keʯNrP:Wn7ȱHً2)Ac[>rc7EU$n'|r' Z창=*9`rPɗ/!,|&3S/PW7D@bTjp;;$iL˲R1|^+p|p$}??-+OCJ۴?5Ҳ]+, 3%Gwo/X&~d1o#O:p )D(En`^QV4ZM08@ۉG0ͭ~-x r cjWԷrCŪ?zT'Ҵ-ҽb9 q 1KK9idtx?peirH%srC7yVACF{%7>p k4򅷖#Wc?T[w^ARF. >yr.c 3s^Ʌ~d_ܶfd$kxrsfz^liB߇{dcē Z4HMN}.=&z{>\y7th)f%6@ ^#6-kV5'p s7>\ |K޹jY/:CJnb7d:>0rV,p黭ZQ$;>M/Zث.Vʫ=T-B"yu^YLPŢ~'}_Ԏ\}g3 OkcbA(*هXg"?i+9055 3!XWegg  0ˎu`r^ =L0{_Jwh?:Y5t=H="[/]Ͻ~Jl\-u̝={n83bd N7u~۩l$/#"xfata 5v5# IDATf"̼"NJ6~9\4+G*#Bv&ˆ:+%z ƎAǃCEvA:;9big%Rĕ">Ƃ%[/ň)sڼ %X*(Kfyp.&YqjlӻHIs꯮hdy+/뭨*u)̚ZVoeZ[3}{HI$[IE)¤aTO_ٰbo/aD[`8%toXՉV8h蠤8TWLw| =ɹytpVYȌ#ɈxW2URk|9~ !l a,Y܉`o|6fN) WB3np gpף`)$b,BA BHi($}Dg~{ٱB$V"y;bUT_tN m$®Ⱚ*BؒEixzݼŲ̀ɳ|+o,z3[lFRl[|Xd|JEFyV;׃EzIRɉMHi>_fJ\v3C*^!WێݕNJ `Ԥ|\yAzЬV 0 2r(24/}>N>0q!KX?4=}kvXBۢTK9!ǃm8lW!>[m).F:FZ1'Ջ* vҲfP8a:^] -w 'YUJ_Fj{fɨ&}~dɍl{=|^tn( {/9`7H+9h:H bt{dw1~,\i]PeMj cLJ0L`ڜ=ͤ19|z'GiPBj4jC:Hu%yj1w_duc 9"*_KLv.5|z/&5/EL$%_sbVO*#jcEs{ y8s(9pJ,1"m|zK2ro:2.>1GèJExȏEquqtx>O7 Yb{)EB3+çb._\|.,}-xsR2¿1-DI 4`Oz=:xBU(UEU54ݎnMO4!G6@n{/$cbX׍M2#A2di.:ؗKMd{jBW+%{.5b7FGO# cE#@^~L>*EC"$&Hx}:]n/={tzp=Б/aDF+_>rq3xOH~ EgC Ów\í*\w~uB) S PMCU͗P](~VV݁bY(*vPeLI[#aJcjk!%tyWZJFJ,5U& ځ98ǐ9GGK=n%/b'a'KpHi uTCa|>.Hχ{>?º2د]MgCxy08Ʀ4m_KIp%R=Xf U9"0/0@H,ˮ)" WEi4 bCXP5s[ELBAbEX%qm`N]% q S˷!@0 }>^n|n7@NKfjq +txł"%FKk'=-ێ /@Jnf&㛦fzI=!4V CaSv$0ĐCm4P$)ӄ*](t>]zg-~+;`O@ L+ B A$_|#eΡ ů|2b,6ٞ>XǐjjV,6;jݰmh`U< d'G\ MSzuTE$-5FJk$d* "L`D@Ec3t/Mn~{§.ɀY"L :/8 +T4BTua*?tWc5p '/0D^4K(ӬlGϤ"?6$4B#4Z64Mۛm#ŷSAUU1(!&!Q3W2jQhV{pDT׺@ z|CӂZ@o?*CPv~7 {l<>iy}^:{u=͎Ow;=-u$1%d;AxR|X,?#eY(Hh;H#!(H]`lC0̋3TCU2Г~7uoU@(Jp|=h FJ[$U5BQ$6\[BP?4g(ΈiEq8#FbǘU7 UJ<t6*2Ź̘0Uo^v2ׯUt1lY-rJJ k`C`H-`Ň1 K}Ұ  ?00Xem(U= M$5 fpX@xi!+B ĸ)3I3:bPӈ% Z^z bŦ0|^zښj%޳11deYIHp!ДRe/nL@P>!!Iv/ٸ $כҴ /Ð!RݟCQZ\PAp+E4?r](.jWeWq1 .hmK"h \P0TL|AǠ+j`Su|^[-޵rr2NWPċCHhlb/'>Z#++ < g׷RIj I!ݍ߇VwTX)+nA0$K߇WT"rT#Ep䠈Th 4Ek84]XU"!$R)0 t<<=^pR6*s!tw4ZSm c-;5HHH^3eVVc3Eؒ%xwzxe\Lddif1eI3sB(~=$?aA`EQ bcen`n]-ΣCEE#`gٰ -Tw^8Wa.R b?0 5@xX "Lkumd´\XTŨK*6ҵ KQb /LKe=7'2W'%SJ{;xTW7ߝnEU22i377Wf?xBiR̵{JEp"? &d-Yk!U"b`T;1OJk.<7QIbbÈ˗G?T0c j8=G P?o?|`[&5϶QmOݽKO"vG|7KH1 YUBw-aK'.)5~_+)~h 0r )߰~+u ej>b`%K s ϘI۪d j**pE|t+gl+mNzA1VY! -#M?C[} M;ob<;<>0> |>\ҝt2ISHs.^lvlXޟ((xlpS **ۓ\3& 6FXHVʻ9XWr?04t0A"G'{iobjd%f "yJ1.n`Wu oY\8wGfv݉%l5t# nb )7\}{usˆaQj:k iIv 4(.;|.e ]ƊȖR]Zp:c{Cj}D΂a>/mʛDrN!3|>?J3׳~G x3YBk(]^_(r3)CY*oiNFh,vHJ>|AP݆@Cd(ef\aZB^p>2/JORdF$$ٿc?{! y)\:^K 鈣]zo/+*Y“瞅6V /MI`1 LL|][*ZAq crxOX@0hnbm䥃WBDE7kHò- lnGAQ+{va@w LMp3/ϮX3ҭ500F1IX E HS"F(*Y)tsvk#cxR2~aF"w2 Igk ;FN~$&K FW%(tw{XYZLeE<~i7ð7̔pXn+:V}ﺵXpO֕d8 &`umgTvA_Ex0 _D&11e)Jog;Y#}ME|e&:[i(~;K(^sEGB(:kհڋ%)TnǎMetʓk ΀Wu0oL)) څ_%zK 4s:yOWcs0蓨ز֗3{Ӂ|M&<FHAP\B|m9[wQOJڍgZiE{vLN򐒒௪P~^2ҵz )]=Ȅl&T37.cv95hP) ހ.ne<DŽдζk9ƀZs~͙NmvK9hT |0]:Z>̢ dKՆh,f=%j B`>@ ]7)|GtFyy|s_~`7锴Ab+P|N) [ISǚ ][M.hm .'OG^m- &{IGljOVR4VWR_KG)9d; uP#mH{0-m,RGyE$g÷yoiXsB7|n oM\}3'*m]9cHICJ=B*"/ 0࡬ OYcjoEmBVL 9YfV h'ttvUi5[[5 He˪exغo,J! r|98p.IZhܹYg'#чѥ6'@ jjl#MVz<1QOT7CkA%*nVmdSABF>i9yԖ;g>,kGynXlfEE2ǍOfRe}L.FD|5EF4pR$#^ Xu=8RG[HW{/}30SAa HM.Wf"}U Mlz2Ffckla ¥B_+=偪Hj yP 6fuy+"W3~?8!ﶆ͈ qjbW *K7U0wJ.gRD_u x b"wTֲb{#z6IDATLE8Y#[wK?[j'Rc>pN >9đ9 W0?1>7 aTQ!#$IY]!uۡ &de'h.s= ~5B^dRy㻘3e$6vgv!}!hmoPI-"%3]gB!?d|/n/˽!#F^xL>d[7tq܌"H $>|!?tvutc4$e5^&-|YGKLБ5z4MU𛛨ߵOvN'̴D2TP͗ߔ\Rs0'x֏!lrҤ\xϳtҴsGMLe|a6BH? _}k=׫2hM4McMIAt?~Pk6/QQ]͙03zgrt>(ig>ڵ(r.Zڅت́(i)DdAEBآX.qRf)eLý-a6'sN<;ӘɎnFe9(oɝ;e-M,SR B$}~nqJf\+]@kdNfLj9vmAU=K]sk ض$;5h/B#݈/}nR(`~*_P\.v񠷋W 1_¯-NΣ 7b[}xz*7GQG]= ҫIqTZpGd!.wJ Gp]3jyIENDB`instead-3.2.1/icon/book16x16.ico0000644000175000017500000000217613267071774015274 0ustar peterpeter h(  % awh}+ËڌM,=F߃rBcx\XmxBIZcRgs:6GS .VvWMmE"3;U0?GV2KX iĵ&+.@f}1:4hܭ% A`pz^|m\nwo??instead-3.2.1/icons.mk0000644000175000017500000000067713267071774013660 0ustar peterpeterZDIR=$(EPOCROOT)epoc32\data\z TARGETDIR=$(ZDIR)\resource\apps ICONTARGETFILENAME=$(TARGETDIR)\instead.mif ICONDIR=.\icon do_nothing : @rem do_nothing MAKMAKE : do_nothing BLD : do_nothing CLEAN : do_nothing LIB : do_nothing CLEANLIB : do_nothing RESOURCE : mifconv $(ICONTARGETFILENAME) \ /c32 $(ICONDIR)\instead-s60.svg FREEZE : do_nothing SAVESPACE : do_nothing RELEASABLES : @echo $(ICONTARGETFILENAME) FINAL : do_nothing instead-3.2.1/instead.mmp0000644000175000017500000000276213267071774014353 0ustar peterpetertargettype exe target instead.exe MACRO S60 MACRO _USE_BROWSE MACRO _USE_UNPACK MACRO unix MACRO _HAVE_ICONV MACRO _LOCAL_APPDATA MACRO _SDL_MOD_BUG MACRO _USE_SDL SYSTEMINCLUDE /epoc32/include/libc /epoc32/include/esdl /epoc32/include/mmf/plugin /epoc32/include // /epoc32/include/stdapis sourcepath ./src SOURCE symbian.cpp SOURCE s60.c SOURCE graphics.c input.c game.c main.c instead_bits.c instead_paths.c instead_sound.c instead_sprites.c noise1234.c instead_timer.c sound.c SDL_rotozoom.c SDL_anigif.c SDL_gfxBlitFunc.c config.c themes.c menu.c unzip.c ioapi.c unpack.c utils.c SOURCE instead/instead.c instead/list.c instead/cache.c instead/idf.c instead/tinymt32.c instead/lfs.c instead/util.c USERINCLUDE ./src ./src/instead MACRO S60V3 staticlibrary lua.lib sdl_image.lib sdl_ttf.lib SDL_Mixer_ogg.lib libpng.lib libjpeg.lib esdl.lib libiconv.lib libtremor.lib LIBRARY cone.lib eikcore.lib LIBRARY euser.lib apparc.lib fbscli.lib LIBRARY estlib.lib apgrfx.lib bafl.lib LIBRARY gdi.lib hal.lib bitgdi.lib LIBRARY mediaclientaudiostream.lib efsrv.lib ws32.lib LIBRARY avkon.lib LIBRARY ezlib.lib //library libc.lib library commondialogs.lib //ALWAYS_BUILD_AS_ARM EPOCSTACKSIZE 81000 EPOCHEAPSIZE 7192000 32384000 UID 0x100039ce 0xA0020410 CAPABILITY none sourcepath . START RESOURCE instead.rss HEADER TARGETPATH /resource/apps LANG SC END sourcepath . START RESOURCE instead_reg.rss TARGETPATH /private/10003a3f/apps END //ALWAYS_BUILD_AS_ARM instead-3.2.1/instead.pkg0000644000175000017500000003307013267071774014337 0ustar peterpeter; This is an auto-generated PKG file by Carbide. ; This file uses variables specific to Carbide builds that will not work ; on command-line builds. If you want to use this generated PKG file from the ; command-line tools you will need to modify the variables with the appropriate ; values: , $(PLATFORM), $(TARGET) ; ;Language - standard language definitions &EN ; standard SIS file header #{"INSTEAD"},(0xA0020500),3,2,1 ;Localised Vendor name %{"Peter Kosyh"} ;Unique Vendor name :"Peter Kosyh" ;Supports Series 60 v 3.0 [0x101F7961], 0, 0, 0, {"Series60ProductID"} ; ; ;Files to install ;You should change the source paths to match that of your environment ; ""-"c:\data\instead\stdout.txt",FILENULL ""-"c:\data\instead\stderr.txt",FILENULL ""-"c:\data\instead\sdl.ini",FILENULL "\home\peter\Devel\gnupoc\symbian-sdks\s60_26\epoc32\release\gcce\urel\instead.exe" -"!:\sys\bin\instead.exe" "\home\peter\Devel\gnupoc\symbian-sdks\s60_26\epoc32\data\z\resource\apps\instead.rsc" -"!:\resource\apps\instead.rsc" "\home\peter\Devel\gnupoc\symbian-sdks\s60_26\epoc32\data\z\private\10003a3f\apps\instead_reg.rsc" -"!:\private\10003a3f\import\apps\instead_reg.rsc" "\home\peter\Devel\gnupoc\symbian-sdks\s60_26\epoc32\data\z\resource\apps\instead.mif" -"!:\resource\apps\instead.mif" ".\symbian_gamedata\appdata\games\tutorial3\main.lua" -"!:\data\instead\appdata\games\tutorial3\main.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-ru.lua" -"!:\data\instead\appdata\games\tutorial3\main-ru.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-uk.lua" -"!:\data\instead\appdata\games\tutorial3\main-uk.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-en.lua" -"!:\data\instead\appdata\games\tutorial3\main-en.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-it.lua" -"!:\data\instead\appdata\games\tutorial3\main-it.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-es.lua" -"!:\data\instead\appdata\games\tutorial3\main-es.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-pt.lua" -"!:\data\instead\appdata\games\tutorial3\main-pt.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-de.lua" -"!:\data\instead\appdata\games\tutorial3\main-de.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-fr.lua" -"!:\data\instead\appdata\games\tutorial3\main-fr.lua" ".\symbian_gamedata\appdata\games\tutorial3\main-nl.lua" -"!:\data\instead\appdata\games\tutorial3\main-nl.lua" ".\symbian_gamedata\appdata\games\tutorial3\ru.png" -"!:\data\instead\appdata\games\tutorial3\ru.png" ".\symbian_gamedata\appdata\games\tutorial3\uk.png" -"!:\data\instead\appdata\games\tutorial3\uk.png" ".\symbian_gamedata\appdata\games\tutorial3\gb.png" -"!:\data\instead\appdata\games\tutorial3\gb.png" ".\symbian_gamedata\appdata\games\tutorial3\it.png" -"!:\data\instead\appdata\games\tutorial3\it.png" ".\symbian_gamedata\appdata\games\tutorial3\es.png" -"!:\data\instead\appdata\games\tutorial3\es.png" ".\symbian_gamedata\appdata\games\tutorial3\br.png" -"!:\data\instead\appdata\games\tutorial3\br.png" ".\symbian_gamedata\appdata\games\tutorial3\de.png" -"!:\data\instead\appdata\games\tutorial3\de.png" ".\symbian_gamedata\appdata\games\tutorial3\fr.png" -"!:\data\instead\appdata\games\tutorial3\fr.png" ".\symbian_gamedata\appdata\games\tutorial3\nl.png" -"!:\data\instead\appdata\games\tutorial3\nl.png" ".\symbian_gamedata\appdata\games\tutorial3\instead.png" -"!:\data\instead\appdata\games\tutorial3\instead.png" ".\symbian_gamedata\appdata\games\tutorial3\instead.ogg" -"!:\data\instead\appdata\games\tutorial3\instead.ogg" ".\symbian_gamedata\stead\stead2\vars.lua" -"!:\data\instead\stead\stead2\vars.lua" ".\symbian_gamedata\stead\stead2\timer.lua" -"!:\data\instead\stead\stead2\timer.lua" ".\symbian_gamedata\stead\stead2\kbd.lua" -"!:\data\instead\stead\stead2\kbd.lua" ".\symbian_gamedata\stead\stead2\walk.lua" -"!:\data\instead\stead\stead2\walk.lua" ".\symbian_gamedata\stead\stead2\object.lua" -"!:\data\instead\stead\stead2\object.lua" ".\symbian_gamedata\stead\stead2\dash.lua" -"!:\data\instead\stead\stead2\dash.lua" ".\symbian_gamedata\stead\stead2\snapshots.lua" -"!:\data\instead\stead\stead2\snapshots.lua" ".\symbian_gamedata\stead\stead2\hideinv.lua" -"!:\data\instead\stead\stead2\hideinv.lua" ".\symbian_gamedata\stead\stead2\quotes.lua" -"!:\data\instead\stead\stead2\quotes.lua" ".\symbian_gamedata\stead\stead2\format.lua" -"!:\data\instead\stead\stead2\format.lua" ".\symbian_gamedata\stead\stead2\click.lua" -"!:\data\instead\stead\stead2\click.lua" ".\symbian_gamedata\stead\stead2\finger.lua" -"!:\data\instead\stead\stead2\finger.lua" ".\symbian_gamedata\stead\stead2\events.lua" -"!:\data\instead\stead\stead2\events.lua" ".\symbian_gamedata\stead\stead2\dbg.lua" -"!:\data\instead\stead\stead2\dbg.lua" ".\symbian_gamedata\stead\stead2\xact.lua" -"!:\data\instead\stead\stead2\xact.lua" ".\symbian_gamedata\stead\stead2\hotkeys.lua" -"!:\data\instead\stead\stead2\hotkeys.lua" ".\symbian_gamedata\stead\stead2\input.lua" -"!:\data\instead\stead\stead2\input.lua" ".\symbian_gamedata\stead\stead2\stead.lua" -"!:\data\instead\stead\stead2\stead.lua" ".\symbian_gamedata\stead\stead2\para.lua" -"!:\data\instead\stead\stead2\para.lua" ".\symbian_gamedata\stead\stead2\theme.lua" -"!:\data\instead\stead\stead2\theme.lua" ".\symbian_gamedata\stead\stead2\prefs.lua" -"!:\data\instead\stead\stead2\prefs.lua" ".\symbian_gamedata\stead\stead2\sprites.lua" -"!:\data\instead\stead\stead2\sprites.lua" ".\symbian_gamedata\stead\stead2\pixels.lua" -"!:\data\instead\stead\stead2\pixels.lua" ".\symbian_gamedata\stead\stead2\sound.lua" -"!:\data\instead\stead\stead2\sound.lua" ".\symbian_gamedata\stead\stead2\wroom.lua" -"!:\data\instead\stead\stead2\wroom.lua" ".\symbian_gamedata\stead\stead2\nouse.lua" -"!:\data\instead\stead\stead2\nouse.lua" ".\symbian_gamedata\stead\stead2\dlg.lua" -"!:\data\instead\stead\stead2\dlg.lua" ".\symbian_gamedata\stead\stead2\counters.lua" -"!:\data\instead\stead\stead2\counters.lua" ".\symbian_gamedata\stead\stead2\proxymenu.lua" -"!:\data\instead\stead\stead2\proxymenu.lua" ".\symbian_gamedata\stead\stead2\nolife.lua" -"!:\data\instead\stead\stead2\nolife.lua" ".\symbian_gamedata\stead\stead2\ext\sound.lua" -"!:\data\instead\stead\stead2\ext\sound.lua" ".\symbian_gamedata\stead\stead2\ext\sprites.lua" -"!:\data\instead\stead\stead2\ext\sprites.lua" ".\symbian_gamedata\stead\stead2\ext\timer.lua" -"!:\data\instead\stead\stead2\ext\timer.lua" ".\symbian_gamedata\stead\stead2\ext\gui.lua" -"!:\data\instead\stead\stead2\ext\gui.lua" ".\symbian_gamedata\stead\stead2\ext\paths.lua" -"!:\data\instead\stead\stead2\ext\paths.lua" ".\symbian_gamedata\stead\stead3\stdlib.lua" -"!:\data\instead\stead\stead3\stdlib.lua" ".\symbian_gamedata\stead\stead3\click.lua" -"!:\data\instead\stead\stead3\click.lua" ".\symbian_gamedata\stead\stead3\dbg.lua" -"!:\data\instead\stead\stead3\dbg.lua" ".\symbian_gamedata\stead\stead3\dbg-ru.lua" -"!:\data\instead\stead\stead3\dbg-ru.lua" ".\symbian_gamedata\stead\stead3\declare.lua" -"!:\data\instead\stead\stead3\declare.lua" ".\symbian_gamedata\stead\stead3\dlg.lua" -"!:\data\instead\stead\stead3\dlg.lua" ".\symbian_gamedata\stead\stead3\events.lua" -"!:\data\instead\stead\stead3\events.lua" ".\symbian_gamedata\stead\stead3\finger.lua" -"!:\data\instead\stead\stead3\finger.lua" ".\symbian_gamedata\stead\stead3\fmt.lua" -"!:\data\instead\stead\stead3\fmt.lua" ".\symbian_gamedata\stead\stead3\keys.lua" -"!:\data\instead\stead\stead3\keys.lua" ".\symbian_gamedata\stead\stead3\noinv.lua" -"!:\data\instead\stead\stead3\noinv.lua" ".\symbian_gamedata\stead\stead3\nolife.lua" -"!:\data\instead\stead\stead3\nolife.lua" ".\symbian_gamedata\stead\stead3\prefs.lua" -"!:\data\instead\stead\stead3\prefs.lua" ".\symbian_gamedata\stead\stead3\snapshots.lua" -"!:\data\instead\stead\stead3\snapshots.lua" ".\symbian_gamedata\stead\stead3\snd.lua" -"!:\data\instead\stead\stead3\snd.lua" ".\symbian_gamedata\stead\stead3\sprite.lua" -"!:\data\instead\stead\stead3\sprite.lua" ".\symbian_gamedata\stead\stead3\stead.lua" -"!:\data\instead\stead\stead3\stead.lua" ".\symbian_gamedata\stead\stead3\theme.lua" -"!:\data\instead\stead\stead3\theme.lua" ".\symbian_gamedata\stead\stead3\timer.lua" -"!:\data\instead\stead\stead3\timer.lua" ".\symbian_gamedata\stead\stead3\ext\gui.lua" -"!:\data\instead\stead\stead3\ext\gui.lua" ".\symbian_gamedata\stead\stead3\ext\paths.lua" -"!:\data\instead\stead\stead3\ext\paths.lua" ".\symbian_gamedata\stead\stead3\ext\sandbox.lua" -"!:\data\instead\stead\stead3\ext\sandbox.lua" ".\symbian_gamedata\stead\stead3\ext\sound.lua" -"!:\data\instead\stead\stead3\ext\sound.lua" ".\symbian_gamedata\stead\stead3\ext\sprites.lua" -"!:\data\instead\stead\stead3\ext\sprites.lua" ".\symbian_gamedata\stead\stead3\ext\timer.lua" -"!:\data\instead\stead\stead3\ext\timer.lua" ".\symbian_gamedata\lang\ru.ini" -"!:\data\instead\lang\ru.ini" ".\symbian_gamedata\lang\en.ini" -"!:\data\instead\lang\en.ini" ".\symbian_gamedata\lang\cs.ini" -"!:\data\instead\lang\cs.ini" ".\symbian_gamedata\lang\de.ini" -"!:\data\instead\lang\de.ini" ".\symbian_gamedata\lang\es.ini" -"!:\data\instead\lang\es.ini" ".\symbian_gamedata\lang\fr.ini" -"!:\data\instead\lang\fr.ini" ".\symbian_gamedata\lang\it.ini" -"!:\data\instead\lang\it.ini" ".\symbian_gamedata\lang\pt.ini" -"!:\data\instead\lang\pt.ini" ".\symbian_gamedata\lang\uk.ini" -"!:\data\instead\lang\uk.ini" ".\symbian_gamedata\themes\fantasy\down.png" -"!:\data\instead\themes\fantasy\down.png" ".\symbian_gamedata\themes\fantasy\up.png" -"!:\data\instead\themes\fantasy\up.png" ".\symbian_gamedata\themes\fantasy\menu.png" -"!:\data\instead\themes\fantasy\menu.png" ".\symbian_gamedata\themes\fantasy\bg.jpg" -"!:\data\instead\themes\fantasy\bg.jpg" ".\symbian_gamedata\themes\fantasy\theme.ini" -"!:\data\instead\themes\fantasy\theme.ini" ".\symbian_gamedata\themes\arctic\aup.png" -"!:\data\instead\themes\arctic\aup.png" ".\symbian_gamedata\themes\arctic\menu.png" -"!:\data\instead\themes\arctic\menu.png" ".\symbian_gamedata\themes\arctic\bg.jpg" -"!:\data\instead\themes\arctic\bg.jpg" ".\symbian_gamedata\themes\arctic\theme.ini" -"!:\data\instead\themes\arctic\theme.ini" ".\symbian_gamedata\themes\arctic\cursor.png" -"!:\data\instead\themes\arctic\cursor.png" ".\symbian_gamedata\themes\arctic\cursor-use.png" -"!:\data\instead\themes\arctic\cursor-use.png" ".\symbian_gamedata\themes\arctic\adown.png" -"!:\data\instead\themes\arctic\adown.png" ".\symbian_gamedata\themes\clearlooks\aup.png" -"!:\data\instead\themes\clearlooks\aup.png" ".\symbian_gamedata\themes\clearlooks\menu.png" -"!:\data\instead\themes\clearlooks\menu.png" ".\symbian_gamedata\themes\clearlooks\bg.jpg" -"!:\data\instead\themes\clearlooks\bg.jpg" ".\symbian_gamedata\themes\clearlooks\theme.ini" -"!:\data\instead\themes\clearlooks\theme.ini" ".\symbian_gamedata\themes\clearlooks\cursor.png" -"!:\data\instead\themes\clearlooks\cursor.png" ".\symbian_gamedata\themes\clearlooks\cursor-use.png" -"!:\data\instead\themes\clearlooks\cursor-use.png" ".\symbian_gamedata\themes\clearlooks\adown.png" -"!:\data\instead\themes\clearlooks\adown.png" ".\symbian_gamedata\themes\original\theme.ini" -"!:\data\instead\themes\original\theme.ini" ".\symbian_gamedata\themes\default\click.wav" -"!:\data\instead\themes\default\click.wav" ".\symbian_gamedata\themes\default\aup.png" -"!:\data\instead\themes\default\aup.png" ".\symbian_gamedata\themes\default\menu.png" -"!:\data\instead\themes\default\menu.png" ".\symbian_gamedata\themes\default\use.png" -"!:\data\instead\themes\default\use.png" ".\symbian_gamedata\themes\default\bg.jpg" -"!:\data\instead\themes\default\bg.jpg" ".\symbian_gamedata\themes\default\theme.ini" -"!:\data\instead\themes\default\theme.ini" ".\symbian_gamedata\themes\default\cursor.png" -"!:\data\instead\themes\default\cursor.png" ".\symbian_gamedata\themes\default\click.ogg" -"!:\data\instead\themes\default\click.ogg" ".\symbian_gamedata\themes\default\cursor-use.png" -"!:\data\instead\themes\default\cursor-use.png" ".\symbian_gamedata\themes\default\sans.ttf" -"!:\data\instead\themes\default\sans.ttf" ".\symbian_gamedata\themes\default\sans-b.ttf" -"!:\data\instead\themes\default\sans-b.ttf" ".\symbian_gamedata\themes\default\sans-i.ttf" -"!:\data\instead\themes\default\sans-i.ttf" ".\symbian_gamedata\themes\default\sans-bi.ttf" -"!:\data\instead\themes\default\sans-bi.ttf" ".\symbian_gamedata\themes\default\adown.png" -"!:\data\instead\themes\default\adown.png" ".\symbian_gamedata\themes\default\aup.png" -"!:\data\instead\themes\default\aup.png" ".\symbian_gamedata\themes\book\theme.ini" -"!:\data\instead\themes\book\theme.ini" ".\symbian_gamedata\themes\book\book.jpg" -"!:\data\instead\themes\book\book.jpg" ".\symbian_gamedata\themes\bluesteel\menu.png" -"!:\data\instead\themes\bluesteel\menu.png" ".\symbian_gamedata\themes\bluesteel\downarrow.png" -"!:\data\instead\themes\bluesteel\downarrow.png" ".\symbian_gamedata\themes\bluesteel\bg.jpg" -"!:\data\instead\themes\bluesteel\bg.jpg" ".\symbian_gamedata\themes\bluesteel\theme.ini" -"!:\data\instead\themes\bluesteel\theme.ini" ".\symbian_gamedata\themes\bluesteel\cursor.png" -"!:\data\instead\themes\bluesteel\cursor.png" ".\symbian_gamedata\themes\bluesteel\cursor-use.png" -"!:\data\instead\themes\bluesteel\cursor-use.png" ".\symbian_gamedata\themes\bluesteel\uparrow.png" -"!:\data\instead\themes\bluesteel\uparrow.png" ".\symbian_gamedata\themes\wide\theme.ini" -"!:\data\instead\themes\wide\theme.ini" ".\symbian_gamedata\icon\sdl_instead.png" -"!:\data\instead\icon\sdl_instead.png" ".\symbian_gamedata\icon\sdl_instead_1.png" -"!:\data\instead\icon\sdl_instead_1.png" instead-3.2.1/instead.rss0000644000175000017500000000213313267071774014361 0ustar peterpeterNAME INST #include #include #include #include #include // Enumerations #include // Resource structures RESOURCE RSS_SIGNATURE { } RESOURCE TBUF16 { buf=""; } RESOURCE EIK_APP_INFO { } // This file localise the applications icons and caption RESOURCE LOCALISABLE_APP_INFO r_appinfo { short_caption = "INSTEAD"; caption_and_icon = { CAPTION_AND_ICON_INFO { // The caption text is defined in the rls file caption = "INSTEAD"; // Icons are used to represent applications in the // application launcher and application title bar. // The number_of_icons value identifies how many icons // that exist in the icon_file. number_of_icons = 1; // Using the application icons. icon_file = "\\resource\\apps\\instead.mif"; } }; } RESOURCE FILESELECTIONDIALOG r_file_selection_dialog { title = "Select-a-file:"; root_path = "C:\\"; filters = { FILTER { filter_type = EFilenameFilter; filter_style = EInclusiveFilter; filter_data = { "*.lua", "*.zip", "*.idf" }; } }; } instead-3.2.1/instead.spec0000644000175000017500000000150613267071774014507 0ustar peterpeterSummary: simple text adventures/visual novels engine and game Name: instead Version: 3.2.1 Release: 1%{?dist} License: MIT URL: http://instead.sourceforge.net Source0: %{name}_%{version}.tar.gz Group: Amusements/Games BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: SDL2-devel, SDL2_mixer-devel, SDL2_image-devel, SDL2_ttf-devel, lua-devel %description Simple text adventures/visual novels engine and game Visual novell/text quest-like game in Russian with engine. %prep %setup -q echo -e "2\n\/usr" | ./configure.sh %build make %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) #%doc doc/* %{_bindir}/* %{_datadir}/%{name}/* %{_datadir}/applications/* %{_datadir}/pixmaps/* %{_datadir}/doc/* %{_mandir}/* instead-3.2.1/instead_reg.rss0000644000175000017500000000061613267071774015222 0ustar peterpeter#include #include UID2 KUidAppRegistrationResourceFile UID3 0xA0020410 // application UID RESOURCE APP_REGISTRATION_INFO { app_file = "instead"; // filename of application binary (minus extension) // Specify the location of the localisable icon/caption definition file localisable_resource_file = "\\resource\\apps\\instead"; localisable_resource_id = R_APPINFO; } instead-3.2.1/lang/0000755000175000017500000000000013267071774013123 5ustar peterpeterinstead-3.2.1/lang/it.ini0000644000175000017500000000663013267071774014245 0ustar peterpeter;$Name:Italiano$ UNKNOWN_ERROR = Errore sconosciuto. ERROR_MENU = Errore nel caricamento del gioco:\n\ '%s'\n\ \n\ Ok WARNING_MENU = Errore durante l'avvio del gioco:\n\ '%s'\n\ \n\ Ok SAVE_SLOT_EMPTY = vuoto SELECT_LOAD_MENU = Carica una partita\n\n AUTOSAVE_SLOT = Autosalvataggio BROKEN_SLOT = errore SELECT_SAVE_MENU = Salvare la partita\n\n MAIN_MENU = \ Torna al gioco\n\ Seleziona una partita\n\ Seleziona un tema\n\ Ricomincia\n\ Carica\n\ Salva\n\ Informazioni\n\ Impostazioni\n\ Esci ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Scritto da Peter Kosyh, 2009-2010\n\ \n\ Homepage:\n\ https://instead-hub.github.io\n\ \n\ Indietro BACK_MENU = Indietro ON = On OFF = Off SELECT_GAME_MENU = Scegli un gioco\n\n SELECT_THEME_MENU = Scegli un tema\n\n KBD_MODE_LINKS = Links KBD_MODE_SMART = Smart KBD_MODE_SCROLL = Scroll FROM_THEME = Tema SETTINGS_SND_MENU = \ [Grafica][Sound][Altri]\n\ \n\ Volume: <<< %d%% >>>\n\ \n\ Qualità: << %dHz >>\n\ \n\ Musica: %s\n\ \n\ Suono Click: %s\n\ \n\ Applica SETTINGS_GFX_MENU = \ [Grafica][Sound][Altri]\n\ \n\ Risoluzione: <<%s>>\n\ Schermo intero: %s / HQ: %s\n\ Dimensione dei Caratteri: <<%d%%>>\n\ Giustificare il testo: <<%s>>\n\ Evidenziazione dei Links: %s\n\ Effetto dissolvenza: %s\n\ Tema personalizzato del gioco: %s\n\ \n\ Applica SETTINGS_OTH_MENU = \ [Grafica][Sound][Altri]\n\ \n\ Modalità di Scorrimento: %s\n\ Filtro Mouse: %s\n\ Modalità Tastiera: %s\n\ \n\ Lingua: <<%s>>\n\ \n\ Аutosalvataggio: %s\n\ \n\ Applica OWN_THEME_MENU = \ Attenzione!!!\n\ \n\ Il gioco attuale ha un tema personalizzato.\n\ I Cambiamenti saranno ignorati.\n\ \n\ Puoi disabilitare i temi personalizzati\n\ nel menu delle impostazioni.\n\ \n\ Ok CUSTOM_THEME_MENU = \ Attenzione!!!\n\ \n\ Questo gioco ha un tema personalizzato, ma i temi personalizzati sono disabilitati. \ Il gioco può apparire differente dalle intenzioni dell'autore.\n\ \n\ Puoi abilitare il supporto dei temi personalizzati nel menu delle impostazioni.\n\ \n\ Ok QUIT_MENU = \ Vuoi davvero uscire?\n\ \n\ Si | No SAVED_MENU = \ La partita è stata salvata!\n\ \n\ Ok NOGAMES_MENU = \ Non è stata trovato alcun gioco. \n\ Per favore, inserisci un gioco nella cartella \n'%s' NOTHEMES_MENU = \ Non è stato trovato alcun tema.\n\ Per favore, inserite un tema nella cartella:\n'%s' CANCEL_MENU = Cancella DISABLED_SAVE_MENU = \ I salvataggi sono disabilitati dal gioco.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Rimuovere il gioco?\n\ %s\n\ \n\ Si | No WAIT_MENU = \ Attendere prego... instead-3.2.1/lang/fr.ini0000644000175000017500000000672513267071774014245 0ustar peterpeter;$Name:Français$ UNKNOWN_ERROR = Erreur inconnue. ERROR_MENU = Erreur lors du chargement du jeu :\n\ '%s'\n\ \n\ OK WARNING_MENU = Erreur lors du traitement du jeu:\n\ '%s'\n\ \n\ OK SAVE_SLOT_EMPTY = vide SELECT_LOAD_MENU = Chargement d’une partie\n\n AUTOSAVE_SLOT = Sauvegarde automatique BROKEN_SLOT = erreur SELECT_SAVE_MENU = Sauvegarde de la partie\n\n MAIN_MENU = \ Reprendre la partie\n\ Sélection d’un jeu\n\ Sélection d’un thème\n\ Redémarrer le jeu\n\ Charger une partie\n\ Sauvegarder la partie\n\ À propos\n\ Réglages\n\ Quitter ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Écrit par Peter Kosyh, 2009-2018\n\ \n\ Page web :\n\ https://instead-hub.github.io\n\ \n\ Retour BACK_MENU = Retour ON = Oui OFF = Non SELECT_GAME_MENU = Sélectionnez un jeu\n\n SELECT_THEME_MENU = Sélectionnez un thème\n\n KBD_MODE_LINKS = Links KBD_MODE_SMART = Smart KBD_MODE_SCROLL = Scroll FROM_THEME = Thème SETTINGS_SND_MENU = \ [Graphiques][Son][Autres]\n\ \n\ Volume : <<< %d%% >>>\n\ \n\ Qualité : << %dHz >>\n\ \n\ Musique : %s\n\ \n\ Déclics clavier : %s\n\ \n\ Appliquer SETTINGS_GFX_MENU = \ [Graphiques][Son][Autres]\n\ \n\ Résolution : <<%s>>\n\ Plein écran : %s / HQ: %s\n\ Mise à l’échelle de la police : <<%d%%>>\n\ Justification du texte : <<%s>>\n\ Liens soulignés : %s\n\ Effet de dégradés : %s\n\ Thème de jeu personnalisé : %s\n\ \n\ Appliquer SETTINGS_OTH_MENU = \ [Graphiques][Son][Autres]\n\ \n\ Mode de défilement : %s\n\ Filtre souris : %s\n\ Mode clavier : %s\n\ \n\ Langue : <<%s>>\n\ \n\ Sauvegarde automatique : %s\n\ \n\ Appliquer OWN_THEME_MENU = \ Attention !!!\n\ \n\ Le jeu actuel a un thème personnalisé.\n\ Les changements seront ignorés.\n\ \n\ Vous pouvez désactiver des thèmes personnalisés\n\ dans le menu de configuration.\n\ \n\ OK CUSTOM_THEME_MENU = \ Attention !!!\n\ \n\ Ce jeu a un thème personnalisé, mais il a été désactivé.\n\ Le jeu peut différer de celui prévu par l’auteur.\n\ \n\ Vous pouvez activer le support du thème personnalisé dans le menu de configuration.\n\ \n\ OK QUIT_MENU = \ Vraiment quitter?\n\ \n\ Oui | Non SAVED_MENU = \ Partie sauvegardée !\n\ \n\ OK NOGAMES_MENU = \ Jeu non trouvé.\n\ S’il vous plaît, mettez un jeu dans le répertoire.\n'%s' NOTHEMES_MENU = \ Thème non trouvé.\n\ S’il vous plaît, mettez un thème dans le répertoire.\n'%s' CANCEL_MENU = Annuler DISABLED_SAVE_MENU = \ Sauvegarde désactivée par le jeu.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Supprimer le jeu ?\n\ %s\n\ \n\ Oui | Non WAIT_MENU = \ Merci d'attendre… instead-3.2.1/lang/pt.ini0000644000175000017500000000622613267071774014255 0ustar peterpeter;$Name:Português$ UNKNOWN_ERROR = Erro desconhecido. ERROR_MENU = Erro ao carregar o jogo:\n\ '%s'\n\ \n\ Ok WARNING_MENU = Erro ao processar o jogo:\n\ '%s'\n\ \n\ Ok SAVE_SLOT_EMPTY = vazio SELECT_LOAD_MENU = Carregar jogo\n\n AUTOSAVE_SLOT = Auto-salvar BROKEN_SLOT = erro SELECT_SAVE_MENU = Salvar jogo\n\n MAIN_MENU = \ Continuar jogo\n\ Escolher jogo\n\ Escolher tema\n\ Reiniciar jogo\n\ Carregar jogo\n\ Salvar jogo\n\ Sobre\n\ Opções\n\ Sair ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Escrito por Peter Kosyh, 2009-2018\n\ \n\ Web:\n\ https://instead-hub.github.io\n\ \n\ Voltar BACK_MENU = Voltar ON = On OFF = Off SELECT_GAME_MENU = Escolher jogo\n\n SELECT_THEME_MENU = Escolher tema\n\n KBD_MODE_LINKS = Links KBD_MODE_SMART = Smart KBD_MODE_SCROLL = Scroll FROM_THEME = Theme SETTINGS_SND_MENU = \ [Gráficos][Som][Outros]\n\ \n\ Volume: <<< %d%% >>>\n\ \n\ Qualidade: << %dHz >>\n\ \n\ Música: %s\n\ \n\ Som de click: %s\n\ \n\ Aplicar SETTINGS_GFX_MENU = \ [Gráficos][Som][Outros]\n\ \n\ Resolução: <<%s>>\n\ Tela cheia: %s / HQ: %s\n\ Fonte: <<%d%%>>\n\ Justificar: <<%s>>\n\ Realçar links: %s\n\ Atenuação: %s\n\ Temas do jogo: %s\n\ \n\ Aplicar SETTINGS_OTH_MENU = \ [Gráficos][Som][Outros]\n\ \n\ Modo de rolagem: %s\n\ Filtro de Mouse: %s\n\ Modo de teclado: %s\n\ \n\ Língua: <<%s>>\n\ \n\ Аuto-salvar: %s\n\ \n\ Aplicar OWN_THEME_MENU = \ Atenção!!!\n\ \n\ O jogo atual tem um tema personalizado.\n\ Alterações serão ignoradas.\n\ \n\ Você pode desabilitar temas personalizados\n\ no menu de opções.\n\ \n\ Ok CUSTOM_THEME_MENU = \ Atenção!!!\n\ \n\ Há um tema para este jogo, mas temas personalizados estão desabilitados. \ O jogo pode parecer diferente do projeto do autor.\n\ \n\ Você pode habilitar suporte a temas personalizados no menu de opções.\n\ \n\ Ok QUIT_MENU = \ Sair mesmo?\n\ \n\ Sim | Não SAVED_MENU = \ Jogo salvo!\n\ \n\ Ok NOGAMES_MENU = \ Nenhum jogo encontrado. \n\ Favor colocar um jogo na pasta \n'%s' NOTHEMES_MENU = \ Nenhum tema encontrado.\n\ Favor colocar um tema na pasta:\n'%s' CANCEL_MENU = Cancelar DISABLED_SAVE_MENU = \ Salvar desabilitado.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Remover o jogo?\n\ %s\n\ \n\ Sim | Não WAIT_MENU = \ Favor aguardar... instead-3.2.1/lang/cs.ini0000644000175000017500000000617713267071774014244 0ustar peterpeter;$Name:Česky$ UNKNOWN_ERROR = Neznámá chyba. ERROR_MENU = Chyba při nahrávání hry:\n\ '%s'\n\ \n\ Ok WARNING_MENU = Chyba při nahrávání hry:\n\ '%s'\n\ \n\ Ok SAVE_SLOT_EMPTY = prázdný SELECT_LOAD_MENU = Nahraj hru\n\n AUTOSAVE_SLOT = Autosave BROKEN_SLOT = rozbitý SELECT_SAVE_MENU = Ulož hru\n\n MAIN_MENU = \ Pokračuj ve hře\n\ Vyber hru\n\ Vyber vzhled\n\ Restartuj hru\n\ Nahraj hru\n\ Ulož hru\n\ Autoři\n\ Nastavení\n\ Konec ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Naprogramoval Peter Kosyh, 2009-2018\n\ \n\ Web:\n\ https://instead-hub.github.io\n\ \n\ Zpět BACK_MENU = Zpět ON = On OFF = Off SELECT_GAME_MENU = Výběr hry\n\n SELECT_THEME_MENU = Výběr vzhledu\n\n KBD_MODE_LINKS = Links KBD_MODE_SMART = Smart KBD_MODE_SCROLL = Scroll FROM_THEME = Vzhled SETTINGS_SND_MENU = \ [Grafika][Zvuk][Ostatní]\n\ \n\ Hlasitost: <<< %d%% >>>\n\ \n\ Kvalita: << %dHz >>\n\ \n\ Hudba: %s\n\ \n\ Zvuk klikání: %s\n\ \n\ Použij SETTINGS_GFX_MENU = \ [Grafika][Zvuk][Ostatní]\n\ \n\ Rezlišení: <<%s>>\n\ Celá obrazovka: %s / HQ: %s\n\ Zvětšení písma: <<%d%%>>\n\ Zarovnání textu: <<%s>>\n\ Zvýraznění odkazů: %s\n\ Fading effect: %s\n\ Vzhledy dle hry: %s\n\ \n\ Použij SETTINGS_OTH_MENU = \ [Grafika][Zvuk][Ostatní]\n\ \n\ Scrolling mode: %s\n\ Mouse filter: %s\n\ Keyboard mode: %s\n\ \n\ Jazyk: <<%s>>\n\ \n\ Аutosave: %s\n\ \n\ Použij OWN_THEME_MENU = \ Warning!!!\n\ \n\ Current game has a custom theme.\n\ Changes will be ignored.\n\ \n\ You can disable custom themes\n\ in settings menu.\n\ \n\ Ok CUSTOM_THEME_MENU = \ Warning!!!\n\ \n\ This game has a custom theme, but custom themes are disabled. \ The game may look differently from the author's design.\n\ \n\ You can enable custom theme support in settings menu.\n\ \n\ Ok QUIT_MENU = \ Opravdu skončit?\n\ \n\ Ano | Ne SAVED_MENU = \ Hra uložena.\n\ \n\ Ok NOGAMES_MENU = \ Nenalezena žádná hra! \n\ Prosím, vložte hry do složky \n'%s' NOTHEMES_MENU = \ Nenalezen žádný vzhled!\n\ Prosím, vložte vzhled do složky:\n'%s' CANCEL_MENU = Storno DISABLED_SAVE_MENU = \ Hra zakázala ukládání.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Odstranit hru?\n\ %s\n\ \n\ Ano | Ne WAIT_MENU = \ Čekejte... instead-3.2.1/lang/en.ini0000644000175000017500000000611613267071774014232 0ustar peterpeter;$Name:English$ UNKNOWN_ERROR = Unknown error. ERROR_MENU = Error while loading game:\n\ '%s'\n\ \n\ Ok WARNING_MENU = Error while processing game:\n\ '%s'\n\ \n\ Ok SAVE_SLOT_EMPTY = empty SELECT_LOAD_MENU = Load game\n\n AUTOSAVE_SLOT = Autosave BROKEN_SLOT = error SELECT_SAVE_MENU = Save game\n\n MAIN_MENU = \ Resume game\n\ Select game\n\ Select theme\n\ Restart game\n\ Load game\n\ Save game\n\ About\n\ Settings\n\ Quit ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Written by Peter Kosyh, 2009-2018\n\ \n\ Homepage:\n\ https://instead-hub.github.io\n\ \n\ Back BACK_MENU = Back ON = On OFF = Off SELECT_GAME_MENU = Select game to play\n\n SELECT_THEME_MENU = Select theme\n\n KBD_MODE_LINKS = Links KBD_MODE_SMART = Smart KBD_MODE_SCROLL = Scroll FROM_THEME = Theme SETTINGS_SND_MENU = \ [Graphics][Sound][Other]\n\ \n\ Volume: <<< %d%% >>>\n\ \n\ Quality: << %dHz >>\n\ \n\ Music: %s\n\ \n\ Click sound: %s\n\ \n\ Apply SETTINGS_GFX_MENU = \ [Graphics][Sound][Other]\n\ \n\ Resolution: <<%s>>\n\ Full screen: %s / HQ: %s\n\ Font scaling: <<%d%%>>\n\ Justify text: <<%s>>\n\ Links highlighting: %s\n\ Fading effect: %s\n\ Custom game themes: %s\n\ \n\ Apply SETTINGS_OTH_MENU = \ [Graphics][Sound][Other]\n\ \n\ Scrolling mode: %s\n\ Mouse filter: %s\n\ Keyboard mode: %s\n\ \n\ Language: <<%s>>\n\ \n\ Аutosave: %s\n\ \n\ Apply OWN_THEME_MENU = \ Warning!!!\n\ \n\ Current game has a custom theme.\n\ Changes will be ignored.\n\ \n\ You can disable custom themes\n\ in settings menu.\n\ \n\ Ok CUSTOM_THEME_MENU = \ Warning!!!\n\ \n\ This game has a custom theme, but custom themes are disabled. \ The game may look differently from the author's design.\n\ \n\ You can enable custom theme support in settings menu.\n\ \n\ Ok QUIT_MENU = \ Really quit?\n\ \n\ Yes | No SAVED_MENU = \ Current Game saved!\n\ \n\ Ok NOGAMES_MENU = \ No games found. \n\ Please, put any game in the directory \n'%s' NOTHEMES_MENU = \ No themes found.\n\ Please, put any theme in the directory:\n'%s' CANCEL_MENU = Cancel DISABLED_SAVE_MENU = \ Saving is disabled by game.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Remove the game?\n\ %s\n\ \n\ Yes | No WAIT_MENU = \ Please wait... instead-3.2.1/lang/es.ini0000644000175000017500000000647313267071774014245 0ustar peterpeter;$Name:Español$ UNKNOWN_ERROR = Error desconocido. ERROR_MENU = Error al cargar el juego:\n\ '%s'\n\ \n\ Ok WARNING_MENU = Error al procesar el juego:\n\ '%s'\n\ \n\ Ok SAVE_SLOT_EMPTY = vacío SELECT_LOAD_MENU = Cargar juego\n\n AUTOSAVE_SLOT = Autoguardar BROKEN_SLOT = error SELECT_SAVE_MENU = Guardar juego\n\n MAIN_MENU = \ Continuar juego\n\ Elegir juego\n\ Elegir tema\n\ Reiniciar juego\n\ Cargar juego\n\ Guardar juego\n\ Acerca de\n\ Opciones\n\ Salir ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Escrito por Peter Kosyh, 2009-2018\n\ \n\ Web:\n\ https://instead-hub.github.io\n\ \n\ Atrás BACK_MENU = Atrás ON = On OFF = Off SELECT_GAME_MENU = Elegir juego\n\n SELECT_THEME_MENU = Elegir tema\n\n KBD_MODE_LINKS = Links KBD_MODE_SMART = Smart KBD_MODE_SCROLL = Scroll FROM_THEME = Tema SETTINGS_SND_MENU = \ [Gráficos][Sonido][Otros]\n\ \n\ Volumen: <<< %d%% >>>\n\ \n\ Calidad: << %dHz >>\n\ \n\ Música: %s\n\ \n\ Sonido Click: %s\n\ \n\ Aceptar SETTINGS_GFX_MENU = \ [Gráficos][Sonido][Otros]\n\ \n\ Resolución: <<%s>>\n\ Pantalla Completa: %s / HQ: %s\n\ Escala de Fuente: <<%d%%>>\n\ Justificar el texto: <<%s>>\n\ Resaltar Links: %s\n\ Efecto de atenuación: %s\n\ Temas específicos del juego: %s\n\ \n\ Aceptar SETTINGS_OTH_MENU = \ [Gráficos][Sonido][Otros]\n\ \n\ Modo Scrolling: %s\n\ Filtrar Mouse: %s\n\ Modo Teclado: %s\n\ \n\ Idioma: <<%s>>\n\ \n\ AutoGuardar: %s\n\ \n\ Aceptar OWN_THEME_MENU = \ Atención!!\n\ \n\ El juego actual tienen un tema específico.\n\ Los cambios se descartarán\n\ \n\ No puedes deshabilitar los temas específicos\n\ en el menú de opciones.\n\ \n\ Ok CUSTOM_THEME_MENU = \ Atención!!\n\ \n\ Este juego requiere un tema específico, pero los temas específicos están deshabilitados. \ Este juego puede no tener el aspecto original diseñado por su autor.\n\ \n\ Puedes habilitar el soporte de temas específicos desde el menú de opciones.\n\ \n\ Ok QUIT_MENU = \ ¿Realmente quieres salir?\n\ \n\ Sí | No SAVED_MENU = \ Juego guardado!\n\ \n\ Ok NOGAMES_MENU = \ No se encontraron juegos. \n\ Por favor, copia algún juego en la carpeta \n'%s' NOTHEMES_MENU = \ No existen temas.\n\ Por favor, copia algún tema en la carpeta :\n'%s' CANCEL_MENU = Cancelar DISABLED_SAVE_MENU = \ Guardar está deshabilitado desde el juego.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ ¿Quitar el juego?\n\ %s\n\ \n\ Yes | No WAIT_MENU = \ Espere por favor... instead-3.2.1/lang/de.ini0000644000175000017500000000663113267071774014222 0ustar peterpeter;$Name:Deutsch$ UNKNOWN_ERROR = Unbekannter Fehler. ERROR_MENU = Fehler beim Laden des folgenden Spiels:\n\ »%s«\n\ \n\ OK WARNING_MENU = Fehler beim Verarbeiten des folgenden Spiels:\n\ »%s«\n\ \n\ Ok SAVE_SLOT_EMPTY = leer SELECT_LOAD_MENU = Spiel laden\n\n AUTOSAVE_SLOT = automatischer Spielstand BROKEN_SLOT = Fehler SELECT_SAVE_MENU = Spiel speichern\n\n MAIN_MENU = \ Spiel fortsetzen\n\ Spiel auswählen\n\ Thema auswählen\n\ Spiel neustarten\n\ Spiel laden\n\ Spiel speichern\n\ Über\n\ Einstellungen\n\ Beenden ABOUT_MENU = \ INSTEAD – %s\n\ \n\ Programmiert von Peter Kosyh, 2009–2018.\n\ \n\ Homepage:\n\ https://instead-hub.github.io\n\ \n\ Zurück BACK_MENU = Zurück ON = Ein OFF = Aus SELECT_GAME_MENU = Spiel auswählen\n\n SELECT_THEME_MENU = Thema auswählen\n\n KBD_MODE_LINKS = Links KBD_MODE_SMART = Intelligent KBD_MODE_SCROLL = Scrollen FROM_THEME = Themenvorgabe SETTINGS_SND_MENU = \ [Grafik][Ton][Sonstiges]\n\ \n\ Lautstärke: <<< %d%% >>>\n\ \n\ Qualität: << %d Hz >>\n\ \n\ Musik: %s\n\ \n\ Klickgeräusch: %s\n\ \n\ Anwnden SETTINGS_GFX_MENU = \ [Grafik][Ton][Sonstiges]\n\ \n\ Bildschirmauflösung: <<%s>>\n\ Vollbild: %s / HQ: %s\n\ Schriftskalierung: <<%d%%>>\n\ Blocksatz: <<%s>>\n\ Links hervorheben: %s\n\ Verblassungseffekt: %s\n\ Spielthemen zulassen: %s\n\ \n\ Anwenden SETTINGS_OTH_MENU = \ [Grafik][Ton][Sonstiges]\n\ \n\ Scrollmodus: %s\n\ Mausfilter: %s\n\ Tastaturmodus: %s\n\ \n\ Sprache: <<%s>>\n\ \n\ Automatisch speichern: %s\n\ \n\ Anwenden OWN_THEME_MENU = \ Achtung!\n\ \n\ Das aktuelle Spiel hat eine eigene Thema.\n\ Die Änderungen werden ignoriert.\n\ \n\ Sie können benutzerdefinierte Themen\n\ im Einstellungsmenü deaktivieren.\n\ \n\ OK CUSTOM_THEME_MENU = \ Achtung!\n\ \n\ Dieses Spiel hat ein eigenes Thema, aber eigene Themen\ sind deaktiviert. Das Spiel könnte anders aussehen, als vom Autor \ vorgesehen\n\ \n\ Sie können die Unterstützung für eigene Themenim \ Einstellungsmenü aktivieren.\n\ \n\ OK QUIT_MENU = \ Wirklich beenden?\n\ \n\ Ja | Nein SAVED_MENU = \ Aktuellen Spielstand gespeichert!\n\ \n\ OK NOGAMES_MENU = \ Keine Spiele gefunden. \n\ Bitte legen Sie ein Spiel im Verzeichnis »%s« ab. NOTHEMES_MENU = \ Keine Themen gefunden.\n\ Bitte legen Sie ein Thema im Verzeichnis »%s« ab. CANCEL_MENU = Abbrechen DISABLED_SAVE_MENU = \ Das Speichern wird vom Spiel unterbunden.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Dieses Spiel entfernen?\n\ %s\n\ \n\ Ja | Nein WAIT_MENU = \ Bitte warten … instead-3.2.1/lang/CMakeLists.txt0000644000175000017500000000032313267071774015661 0ustar peterpeterIF(SYSTEMWIDE) FILE(GLOB FILES "*.ini") INSTALL(FILES ${FILES} DESTINATION ${LANGDIR}) ELSEIF(STANDALONE) FILE(GLOB FILES "*.ini") INSTALL(FILES ${FILES} DESTINATION ${STANDALONEDIR}/lang) ENDIF(SYSTEMWIDE) instead-3.2.1/lang/nl.ini0000644000175000017500000000645213267071774014244 0ustar peterpeter;$Name:Nederlands$ UNKNOWN_ERROR = Onbekende fout. ERROR_MENU = Fout tijdens het laden van het spel:\n\ '%s'\n\ \n\ Ok WARNING_MENU = Fout tijdens het uitvoeren van het spel:\n\ '%s'\n\ \n\ Ok SAVE_SLOT_EMPTY = leeg SELECT_LOAD_MENU = Spel laden\n\n AUTOSAVE_SLOT = Automatisch opgeslagen spel BROKEN_SLOT = fout SELECT_SAVE_MENU = Spel opslaan\n\n MAIN_MENU = \ Terug\n\ Selecteer spel\n\ Kies skin\n\ Herstart huidig spel\n\ Opgeslagen spel laden\n\ Spel opslaan\n\ Over\n\ Instellingen\n\ Afsluiten ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Geschreven door Peter Kosyh, 2009-2018\n\ \n\ Homepage:\n\ https://instead-hub.github.io\n\ \n\ Terug BACK_MENU = Terug ON = Aan OFF = Uit SELECT_GAME_MENU = Kies het spel\n\n SELECT_THEME_MENU = Kies een skin\n\n KBD_MODE_LINKS = Objecten KBD_MODE_SMART = Intelligent KBD_MODE_SCROLL = Scrollen FROM_THEME = Skin SETTINGS_SND_MENU = \ [Beeld][Geluid][Overig]\n\ \n\ Volume: <<< %d%% >>>\n\ \n\ Kwaliteit: << %dHz >>\n\ \n\ Muziek: %s\n\ \n\ Klik geluid: %s\n\ \n\ Toepassen SETTINGS_GFX_MENU = \ [Beeld][Geluid][Overig]\n\ \n\ Resolutie: <<%s>>\n\ Volledig scherm: %s / HQ: %s\n\ Tekst vergroten: <<%d%%>>\n\ Tekst uitlijnen: <<%s>>\n\ Links markeren: %s\n\ Vervagen: %s\n\ Geïntegreerde skins: %s\n\ \n\ Toepassen SETTINGS_OTH_MENU = \ [Beeld][Geluid][Overig]\n\ \n\ Scrollen: %s\n\ Muis filter: %s\n\ Pijltjestoetsen: %s\n\ \n\ Taal: <<%s>>\n\ \n\ Аutomatisch opslaan: %s\n\ \n\ Toepassen OWN_THEME_MENU = \ Waarschuwing!!!\n\ \n\ Het huidige spel heeft een geïntegreerde skin.\n\ Veranderingen worden genegeerd.\n\ \n\ U kunt geïntegreerde skins uitschakelen\n\ in de instellingen.\n\ \n\ Ok CUSTOM_THEME_MENU = \ Waarschuwing!!!\n\ \n\ Het huidige spel heeft een geïntegreerde skin, maar geïntegreerde skin's zijn uitgeschakeld. \ Dit spel kan anders lijken dan de auteur bedoeld had.\n\ \n\ U kunt geïntegreerde skin's inschakelen in de instellingen.\n\ \n\ Ok QUIT_MENU = \ Wilt u dit programma echt afsluiten?\n\ \n\ Ja | Nee SAVED_MENU = \ Huidig spel opgeslagen!\n\ \n\ Ok NOGAMES_MENU = \ Geen spellen gevonden. \n\ Plaats spellen in de folder:\n'%s' NOTHEMES_MENU = \ Geen skins gevonden.\n\ Plaats skins in de folder:\n'%s' CANCEL_MENU = Afbreken DISABLED_SAVE_MENU = \ Opslaan is uitgeschakeld in dit spel.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Verwijder het spel?\n\ %s\n\ \n\ Ja | Nee WAIT_MENU = \ Even geduld aub... instead-3.2.1/lang/Makefile0000644000175000017500000000033513267071774014564 0ustar peterpeterinclude ../Rules.make include ../config.make clean: all: install: $(INSTALLD) $(DESTDIR)$(LANGPATH) for f in *.ini; do \ $(INSTALL) $$f $(DESTDIR)$(LANGPATH)/$$f;\ done uninstall: $(RM) -rf $(DESTDIR)$(LANGPATH) instead-3.2.1/lang/uk.ini0000644000175000017500000001063313267071774014246 0ustar peterpeter;$Name:Українська$ UNKNOWN_ERROR = Невідома помилка. ERROR_MENU = Під час ініціалізації виникла невідома помилка:\n\ '%s'\n\ \n\ Так WARNING_MENU = Під час роботи гри виникла помилка:\n\ '%s'\n\ \n\ Так SAVE_SLOT_EMPTY = пусто SELECT_LOAD_MENU = Завантажте гру\n\n AUTOSAVE_SLOT = Автозбереження BROKEN_SLOT = помилка SELECT_SAVE_MENU = Збережіть гру\n\n MAIN_MENU = \ Продовжити гру\n\ Вибір гри\n\ Вибір теми\n\ Розпочати заново\n\ Завантажити гру\n\ Зберегти гру\n\ Інформація\n\ Налаштування\n\ Вихід ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Інтерпретатор простих\n\ текстових пригод:\n\ Косих П.О. 2009-2018\n\ \n\ Сайт проекта:\n\ https://instead-hub.github.io\n\ \n\ Назад BACK_MENU = Назад ON = Так OFF = Ні KBD_MODE_LINKS = Посилання KBD_MODE_SMART = Розумний KBD_MODE_SCROLL = Прокрутка FROM_THEME = Тема SETTINGS_SND_MENU = \ [Графіка][Звук][Інше]\n\ \n\ Гучність: <<< %d%% >>>\n\ \n\ Якість: << %dГц >>\n\ \n\ Музика: %s\n\ \n\ Звук клацання: %s\n\ \n\ Застосувати SETTINGS_GFX_MENU = \ [Графіка][Звук][Інше]\n\ \n\ Розмір вікна: <<%s>>\n\ Повний екран: %s / HQ: %s\n\ Масштаб шрифту: <<%d%%>>\n\ Текст по ширині: <<%s>>\n\ Підсвітка посиланнь: %s\n\ Ефект загасання: %s\n\ Власні теми ігор: %s\n\ \n\ Застосувати SETTINGS_OTH_MENU = \ [Графіка][Звук][Інше]\n\ \n\ Режим прокрутки: %s\n\ Фільтр миші: %s\n\ Режим клавіатури: %s\n\ \n\ Мова: <<%s>>\n\ \n\ Автозбереження: %s\n\ \n\ Застосувати CUSTOM_THEME_MENU = \ Увага!!!\n\ \n\ Гра містить власну тему, але підтримка власних тем відключена в налаштуваннях. \ Гра може виглядати не так, як задумував її автор.\n\ \n\ Ви можете дозволити можливість перевизначення тем в налаштуваннях.\n\ \n\ Так OWN_THEME_MENU = \ Увага!!!\n\ \n\ Вибрана гра перевизначає тему. Зміни не вступять до сили.\n\ \n\ Ви можете заборонити можливість перевизначення тем в налаштуваннях.\n\ \n\ Так QUIT_MENU = \ Насправді вийти?\n\ \n\ Так | Ні SELECT_GAME_MENU = Вибір гри\n\n SELECT_THEME_MENU = Вибір теми\n\n SAVED_MENU = \ Гра збережена!\n\ \n\ Так NOGAMES_MENU = \ Не знайдено жодної гри.\n\ Будь ласка, скопіруйте хоча б одну гру до каталогу:\n'%s' NOTHEMES_MENU = \ Не знайдено жодної теми.\n\ Будь ласка, скопіруйте хоча б одну тему до каталогу:\n'%s'\n CANCEL_MENU = Відміна DISABLED_SAVE_MENU = \ Збереження заборонено грою.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Видалити гру?\n\ %s\n\ \n\ Так | Ні WAIT_MENU = \ Будь ласка, почекайте... instead-3.2.1/lang/ru.ini0000644000175000017500000001067413267071774014262 0ustar peterpeter;$Name:Русский$ UNKNOWN_ERROR = Неизвестная ошибка. ERROR_MENU = Во время инициализации игры произошла ошибка:\n\ '%s'\n\ \n\ Да WARNING_MENU = Во время работы игры произошла ошибка:\n\ '%s'\n\ \n\ Да SAVE_SLOT_EMPTY = пусто SELECT_LOAD_MENU = Загрузите игру\n\n AUTOSAVE_SLOT = Автосохранение BROKEN_SLOT = ошибка SELECT_SAVE_MENU = Сохраните игру\n\n MAIN_MENU = \ Продолжить игру\n\ Выбор игры\n\ Выбор темы\n\ Начать заново\n\ Загрузить игру\n\ Сохранить игру\n\ Информация\n\ Настройки\n\ Выход ABOUT_MENU = \ INSTEAD - %s\n\ \n\ Интерпретатор простых\n\ текстовых приключений:\n\ Косых П.А. 2009-2018\n\ \n\ Сайт проекта:\n\ https://instead-hub.github.io\n\ \n\ Назад BACK_MENU = Назад ON = Да OFF = Нет KBD_MODE_LINKS = Ссылки KBD_MODE_SMART = Умный KBD_MODE_SCROLL = Прокрутка FROM_THEME = Тема SETTINGS_SND_MENU = \ [Графика][Звук][Другое]\n\ \n\ Громкость: <<< %d%% >>>\n\ \n\ Качество: << %dГц >>\n\ \n\ Музыка: %s\n\ \n\ Звук щелчка: %s\n\ \n\ Применить SETTINGS_GFX_MENU = \ [Графика][Звук][Другое]\n\ \n\ Размер окна: <<%s>>\n\ Полный экран: %s / HQ: %s\n\ Масштаб шрифта: <<%d%%>>\n\ Текст по ширине: <<%s>>\n\ Подсветка ссылок: %s\n\ Эффект перехода: %s\n\ Собственные темы игр: %s\n\ \n\ Применить SETTINGS_OTH_MENU = \ [Графика][Звук][Другое]\n\ \n\ Режим прокрутки: %s\n\ Фильтр мышки: %s\n\ Режим клавиатуры: %s\n\ \n\ Язык: <<%s>>\n\ \n\ Автосохранение: %s\n\ \n\ Применить CUSTOM_THEME_MENU = \ Внимание!!!\n\ \n\ Игра содержит собственную тему, но поддержка собственных тем отключена в настройках. \ Игра может выглядеть не так, как задумывал ее автор.\n\ \n\ Вы можете разрешить возможность переопределения тем в настройках.\n\ \n\ Да OWN_THEME_MENU = \ Внимание!!!\n\ \n\ Выбранная игра переопределяет тему. Изменения не вступят в силу.\n\ \n\ Вы можете запретить возможность переопределения тем в настройках.\n\ \n\ Да QUIT_MENU = \ На самом деле выйти?\n\ \n\ Да | Нет SELECT_GAME_MENU = Выбор игры\n\n SELECT_THEME_MENU = Выбор темы\n\n SAVED_MENU = \ Игра сохранена!\n\ \n\ Да NOGAMES_MENU = \ Не найдена ни одна игра.\n\ Пожалуйста, скопируйте хотя бы одну игру в каталог:\n'%s' NOTHEMES_MENU = \ Не найдена ни одна тема.\n\ Пожалуйста, скопируйте хотя бы одну тему в каталог:\n'%s'\n CANCEL_MENU = Отмена DISABLED_SAVE_MENU = \ Сохранение запрещено игрой.\n BROWSE_MENU = \ [...] REMOVE_MENU = \ Удалить игру?\n\ %s\n\ \n\ Да | Нет WAIT_MENU = \ Пожалуйста, подождите... instead-3.2.1/sdl-instead0000777000175000017500000000000013267071774017252 2src/sdl-insteadustar peterpeterinstead-3.2.1/setup-kit.iss0000644000175000017500000000457613267071774014663 0ustar peterpeter[Setup] AppName=INSTEAD-KIT AppVerName=INSTEAD 3.2.1 DefaultDirName={pf}\Games\INSTEAD DefaultGroupName=Games UninstallDisplayIcon={app}\sdl-instead.exe OutputDir=. OutputBaseFilename=instead-kit-3.2.1 AllowNoIcons=true [Languages] Name: en; MessagesFile: compiler:Default.isl Name: ru; MessagesFile: compiler:Languages\Russian.isl [Files] Source: sdl-instead.exe; DestDir: {app} Source: instead-launcher.exe; DestDir: {app} Source: qt_ru.qm; DestDir: {app} Source: appdata\*; DestDir: {app}\appdata Source: Microsoft.VC80.CRT\*; DestDir: {app}\Microsoft.VC80.CRT Source: games\tutorial3\*; DestDir: {app}\games\tutorial3 Source: icon\*; DestDir: {app}\icon Source: doc\*; DestDir: {app}\doc Source: stead\stead2\*; DestDir: {app}\stead\stead2 Source: stead\stead2\ext\*; DestDir: {app}\stead\stead2\ext Source: stead\stead3\*; DestDir: {app}\stead\stead3 Source: stead\stead3\ext\*; DestDir: {app}\stead\stead3\ext Source: lang\*; DestDir: {app}\lang Source: themes\default\*; DestDir: {app}\themes\default Source: themes\book\*; DestDir: {app}\themes\book Source: themes\original\*; DestDir: {app}\themes\original Source: themes\fantasy\*; DestDir: {app}\themes\fantasy Source: themes\arctic\*; DestDir: {app}\themes\arctic Source: themes\bluesteel\*; DestDir: {app}\themes\bluesteel Source: themes\wide\*; DestDir: {app}\themes\wide Source: *.dll; DestDir: {app} [CustomMessages] CreateDesktopIcon=Create a &desktop icons LaunchGame=Launch &game UninstallMsg=Uninstall INSTEAD-KIT ru.CreateDesktopIcon= & ru.LaunchGame= & ru.UninstallMsg= INSTEAD ru.RmSettingsMsg= ? [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon} [Run] Filename: {app}\instead-launcher.exe; Description: {cm:LaunchGame}; WorkingDir: {app}; Flags: postinstall [Icons] Name: {commondesktop}\INSTEAD; Filename: {app}\sdl-instead.exe; WorkingDir: {app}; Tasks: desktopicon Name: {commondesktop}\INSTEAD-Launcher; Filename: {app}\instead-launcher.exe; WorkingDir: {app}; Tasks: desktopicon Name: {group}\INSTEAD; Filename: {app}\sdl-instead.exe; WorkingDir: {app} Name: {group}\INSTEAD-Launcher; Filename: {app}\instead-launcher.exe; WorkingDir: {app} Name: {group}\{cm:UninstallMsg}; Filename: {uninstallexe} [UninstallDelete] Name: {app}; Type: dirifempty Name: {pf}\Games; Type: dirifempty instead-3.2.1/setup.iss0000644000175000017500000000612313267071774014064 0ustar peterpeter[Setup] AppName=INSTEAD AppVerName=INSTEAD 3.2.1 DefaultDirName={pf}\Games\INSTEAD DefaultGroupName=Games UninstallDisplayIcon={app}\sdl-instead.exe OutputDir=. OutputBaseFilename=instead-3.2.1 AllowNoIcons=true SetupIconFile=icon\sdl_instead.ico ChangesAssociations=yes [Languages] Name: en; MessagesFile: compiler:Default.isl Name: ru; MessagesFile: compiler:Languages\Russian.isl [Files] Source: sdl-instead.exe; DestDir: {app} Source: Microsoft.VC80.CRT\*; DestDir: {app}\Microsoft.VC80.CRT Source: games\tutorial3\*; DestDir: {app}\games\tutorial3 Source: icon\*; DestDir: {app}\icon Source: doc\*; DestDir: {app}\doc Source: stead\stead2\*; DestDir: {app}\stead\stead2 Source: stead\stead2\ext\*; DestDir: {app}\stead\stead2\ext Source: stead\stead3\*; DestDir: {app}\stead\stead3 Source: stead\stead3\ext\*; DestDir: {app}\stead\stead3\ext Source: lang\*; DestDir: {app}\lang Source: themes\default\*; DestDir: {app}\themes\default Source: themes\book\*; DestDir: {app}\themes\book Source: themes\original\*; DestDir: {app}\themes\original Source: themes\fantasy\*; DestDir: {app}\themes\fantasy Source: themes\arctic\*; DestDir: {app}\themes\arctic Source: themes\bluesteel\*; DestDir: {app}\themes\bluesteel Source: themes\clearlooks\*; DestDir: {app}\themes\clearlooks Source: *.dll; DestDir: {app} [CustomMessages] CreateDesktopIcon=Create a &desktop icon LaunchGame=Launch &game UninstallMsg=Uninstall INSTEAD RmSettingsMsg=Would you like to remove settings and saved games? ru.CreateDesktopIcon= & ru.LaunchGame= & ru.UninstallMsg= INSTEAD ru.RmSettingsMsg= ? [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon} [Run] Filename: {app}\sdl-instead.exe; Description: {cm:LaunchGame}; WorkingDir: {app}; Flags: postinstall [Icons] Name: {commondesktop}\INSTEAD; Filename: {app}\sdl-instead.exe; WorkingDir: {app}; Tasks: desktopicon Name: {group}\INSTEAD; Filename: {app}\sdl-instead.exe; WorkingDir: {app} Name: {group}\{cm:UninstallMsg}; Filename: {uninstallexe} [UninstallDelete] Name: {app}; Type: dirifempty Name: {pf}\Games; Type: dirifempty [Registry] Root: HKCR; Subkey: ".idf"; ValueType: string; ValueName: ""; ValueData: "INSTEAD"; Flags: uninsdeletevalue Root: HKCR; Subkey: "INSTEAD"; ValueType: string; ValueName: ""; ValueData: "INSTEAD data file"; Flags: uninsdeletekey Root: HKCR; Subkey: "INSTEAD\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\sdl-instead.exe,0" Root: HKCR; Subkey: "INSTEAD\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\sdl-instead.exe"" ""%1""" [Code] procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin case CurUninstallStep of usPostUninstall: begin if MsgBox(CustomMessage('RmSettingsMsg'), mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = idYes then begin // remove settings and saved games manually DelTree(ExpandConstant('{localappdata}\instead'), True, True, True); end; end; end; end; instead-3.2.1/src/0000755000175000017500000000000013267071774012771 5ustar peterpeterinstead-3.2.1/src/SDL_anigif.c0000644000175000017500000004234713267071774015106 0ustar peterpeter/* SDL_anigif: An example animated GIF image loading library for use with SDL SDL_image Copyright (C) 1997-2006 Sam Lantinga Animated GIF "derived work" Copyright (C) 2006 Doug McFadyen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include "SDL_anigif.h" #include "instead/instead.h" extern idf_t game_idf; /* Code from here to end of file has been adapted from XPaint: */ /* +-------------------------------------------------------------------+ */ /* | Copyright 1990, 1991, 1993 David Koblas. | */ /* | Copyright 1996 Torsten Martinsen. | */ /* | Permission to use, copy, modify, and distribute this software | */ /* | and its documentation for any purpose and without fee is hereby | */ /* | granted, provided that the above copyright notice appear in all | */ /* | copies and that both that copyright notice and this permission | */ /* | notice appear in supporting documentation. This software is | */ /* | provided "as is" without express or implied warranty. | */ /* +-------------------------------------------------------------------+ */ /* Adapted for use in SDL by Sam Lantinga -- 7/20/98 */ /* Animated GIF support by Doug McFadyen -- 10/19/06 */ #define MAXCOLORMAPSIZE 256 #define TRUE 1 #define FALSE 0 #define CM_RED 0 #define CM_GREEN 1 #define CM_BLUE 2 #define MAX_LWZ_BITS 12 #define INTERLACE 0x40 #define LOCALCOLORMAP 0x80 #define BitSet(byte,bit) (((byte) & (bit)) == (bit)) #define LM_to_uint(a,b) (((b)<<8)|(a)) #define SDL_SetError(t) ((void)0) /* We're not SDL so ignore error reporting */ typedef struct { unsigned int Width; unsigned int Height; unsigned char ColorMap[3][MAXCOLORMAPSIZE]; unsigned int BitPixel; unsigned int ColorResolution; unsigned int Background; unsigned int AspectRatio; } gifscreen; typedef struct { int transparent; int delayTime; int inputFlag; int disposal; } gif89; typedef struct { /* global data */ SDL_RWops* src; int loop; gifscreen gs; gif89 g89; int zerodatablock; /* AG_LoadGIF_RW data */ unsigned char localColorMap[3][MAXCOLORMAPSIZE]; /* GetCode data */ unsigned char buf[280]; int curbit, lastbit, done, lastbyte; /* LWZReadByte data */ int fresh, code, incode; int codesize, setcodesize; int maxcode, maxcodesize; int firstcode, oldcode; int clearcode, endcode; int table[2][(1 << MAX_LWZ_BITS)]; int stack[(1 << (MAX_LWZ_BITS))*2], *sp; } gifdata; static int ReadColorMap( gifdata* gd, int number, unsigned char buffer[3][MAXCOLORMAPSIZE] ); static int DoExtension( gifdata* gd, int label ); static int GetDataBlock( gifdata* gd, unsigned char* buf ); static int GetCode( gifdata* gd, int code_size, int flag ); static int LWZReadByte( gifdata* gd, int flag, int input_code_size ); static SDL_Surface* ReadImage( gifdata* gd, int len, int height, int, unsigned char cmap[3][MAXCOLORMAPSIZE], int interlace, int ignore ); int AG_isGIF( SDL_RWops* src ) { int isGIF = FALSE; if ( src ) { int start = SDL_RWtell( src ); char magic[6]; if ( SDL_RWread(src,magic,sizeof(magic),1) ) { if ( (strncmp(magic,"GIF",3) == 0) && ((memcmp(magic+3,"87a",3) == 0) || (memcmp(magic+3,"89a",3) == 0)) ) { isGIF = TRUE; } } SDL_RWseek( src, start, SEEK_SET ); } return isGIF; } int AG_LoadGIF( const char* file, AG_Frame* frames, int size, int *loop ) { int n = 0; SDL_RWops* src = RWFromIdf(instead_idf(), file); if ( src ) { n = AG_LoadGIF_RW( src, frames, size, loop ); SDL_RWclose( src ); } return n; } void AG_FreeSurfaces( AG_Frame* frames, int nFrames ) { int i; if ( frames ) { for ( i = 0; i < nFrames; i++ ) { if ( frames[i].surface ) { SDL_FreeSurface( frames[i].surface ); frames[i].surface = NULL; } } } } #if SDL_VERSION_ATLEAST(2,0,0) extern SDL_Surface *SDL_DisplayFormat(SDL_Surface * surface); extern SDL_Surface *SDL_DisplayFormatAlpha(SDL_Surface * surface); #endif int AG_ConvertSurfacesToDisplayFormat( AG_Frame* frames, int nFrames ) { int i; int n = 0; if ( frames ) { for ( i = 0; i < nFrames; i++ ) { if ( frames[i].surface ) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_Surface* surface; if (SDL_GetColorKey(frames[i].surface, NULL) == 0) surface = SDL_DisplayFormatAlpha(frames[i].surface); else surface = SDL_DisplayFormat(frames[i].surface); #else SDL_Surface* surface = (frames[i].surface->flags & SDL_SRCCOLORKEY) ? SDL_DisplayFormatAlpha(frames[i].surface) : SDL_DisplayFormat(frames[i].surface); #endif if ( surface ) { SDL_FreeSurface( frames[i].surface ); frames[i].surface = surface; n++; } } } } return n; } int AG_NormalizeSurfacesToDisplayFormat( AG_Frame* frames, int nFrames ) { int n = 0; if ( nFrames > 0 && frames && frames[0].surface ) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_Surface* mainSurface; int newDispose; if (SDL_GetColorKey(frames[0].surface, NULL) == 0) { mainSurface = SDL_DisplayFormatAlpha(frames[0].surface); newDispose = AG_DISPOSE_RESTORE_BACKGROUND; } else { mainSurface = SDL_DisplayFormat(frames[0].surface); newDispose = AG_DISPOSE_NONE; } #else SDL_Surface* mainSurface = (frames[0].surface->flags & SDL_SRCCOLORKEY) ? SDL_DisplayFormatAlpha(frames[0].surface) : SDL_DisplayFormat(frames[0].surface); const int newDispose = (frames[0].surface->flags & SDL_SRCCOLORKEY) ? AG_DISPOSE_RESTORE_BACKGROUND : AG_DISPOSE_NONE; #endif if ( mainSurface ) { int i; int lastDispose = AG_DISPOSE_NA; int iRestore = 0; const Uint8 alpha = (frames[0].disposal == AG_DISPOSE_NONE || frames[0].disposal == AG_DISPOSE_NA) ? SDL_ALPHA_OPAQUE : SDL_ALPHA_TRANSPARENT; SDL_FillRect( mainSurface, NULL, SDL_MapRGBA(mainSurface->format,0,0,0,alpha) ); for ( i = 0; i < nFrames; i++ ) { if ( frames[i].surface ) { SDL_Surface* surface = SDL_ConvertSurface( mainSurface, mainSurface->format, mainSurface->flags ); if ( surface ) { SDL_Rect r; if ( lastDispose == AG_DISPOSE_NONE ) SDL_BlitSurface( frames[i-1].surface, NULL, surface, NULL ); if ( lastDispose == AG_DISPOSE_RESTORE_PREVIOUS ) SDL_BlitSurface( frames[iRestore].surface, NULL, surface, NULL ); if ( frames[i].disposal != AG_DISPOSE_RESTORE_PREVIOUS ) iRestore = i; r.x = (Sint16)frames[i].x; r.y = (Sint16)frames[i].y; SDL_BlitSurface( frames[i].surface, NULL, surface, &r ); SDL_FreeSurface( frames[i].surface ); frames[i].surface = surface; frames[i].x = frames[i].y = 0; lastDispose = frames[i].disposal; frames[i].disposal = newDispose; n++; } } } SDL_FreeSurface( mainSurface ); } } return n; } int AG_LoadGIF_RW( SDL_RWops* src, AG_Frame* frames, int maxFrames, int *loop) { int start; unsigned char buf[16]; unsigned char c; int useGlobalColormap; int bitPixel; int iFrame = 0; char version[4]; SDL_Surface* image = NULL; gifdata* gd; if ( src == NULL ) return 0; gd = malloc( sizeof(*gd) ); memset( gd, 0, sizeof(*gd) ); gd->src = src; gd->loop = 1; start = SDL_RWtell( src ); if ( !SDL_RWread(src,buf,6,1) ) { SDL_SetError( "error reading magic number" ); goto done; } if ( strncmp((char*)buf,"GIF",3) != 0 ) { SDL_SetError( "not a GIF file" ); goto done; } strncpy( version, (char*)buf+3, 3 ); version[3] = '\0'; if ( (strcmp(version,"87a") != 0) && (strcmp(version,"89a") != 0) ) { SDL_SetError( "bad version number, not '87a' or '89a'" ); goto done; } gd->g89.transparent = -1; gd->g89.delayTime = -1; gd->g89.inputFlag = -1; gd->g89.disposal = AG_DISPOSE_NA; if ( !SDL_RWread(src,buf,7,1) ) { SDL_SetError( "failed to read screen descriptor" ); goto done; } gd->gs.Width = LM_to_uint(buf[0],buf[1]); gd->gs.Height = LM_to_uint(buf[2],buf[3]); gd->gs.BitPixel = 2 << (buf[4] & 0x07); gd->gs.ColorResolution = (((buf[4] & 0x70) >> 3) + 1); gd->gs.Background = buf[5]; gd->gs.AspectRatio = buf[6]; if ( BitSet(buf[4],LOCALCOLORMAP) ) /* Global Colormap */ { if ( ReadColorMap(gd,gd->gs.BitPixel,gd->gs.ColorMap) ) { SDL_SetError( "error reading global colormap" ); goto done; } } do { if ( !SDL_RWread(src,&c,1,1) ) { SDL_SetError( "EOF / read error on image data" ); goto done; } if ( c == ';' ) /* GIF terminator */ goto done; if ( c == '!' ) /* Extension */ { if ( !SDL_RWread(src,&c,1,1) ) { SDL_SetError( "EOF / read error on extention function code" ); goto done; } DoExtension( gd, c ); continue; } if ( c != ',' ) /* Not a valid start character */ continue; if ( !SDL_RWread(src,buf,9,1) ) { SDL_SetError( "couldn't read left/top/width/height" ); goto done; } useGlobalColormap = !BitSet(buf[8],LOCALCOLORMAP); bitPixel = 1 << ((buf[8] & 0x07) + 1); if ( !useGlobalColormap ) { if ( ReadColorMap(gd,bitPixel,gd->localColorMap) ) { SDL_SetError( "error reading local colormap" ); goto done; } image = ReadImage( gd, LM_to_uint(buf[4],buf[5]), LM_to_uint(buf[6],buf[7]), bitPixel, gd->localColorMap, BitSet(buf[8],INTERLACE), (frames==NULL) ); } else { image = ReadImage( gd, LM_to_uint(buf[4],buf[5]), LM_to_uint(buf[6],buf[7]), gd->gs.BitPixel, gd->gs.ColorMap, BitSet(buf[8],INTERLACE), (frames==NULL) ); } if ( frames ) { if ( image == NULL ) goto done; if ( gd->g89.transparent >= 0 ) #if SDL_VERSION_ATLEAST(2,0,0) SDL_SetColorKey( image, SDL_TRUE, gd->g89.transparent ); #else SDL_SetColorKey( image, SDL_SRCCOLORKEY, gd->g89.transparent ); #endif frames[iFrame].surface = image; frames[iFrame].x = LM_to_uint(buf[0], buf[1]); frames[iFrame].y = LM_to_uint(buf[2], buf[3]); frames[iFrame].disposal = gd->g89.disposal; frames[iFrame].delay = gd->g89.delayTime*10; /* gd->g89.transparent = -1; ** Hmmm, not sure if this should be reset for each frame? */ } iFrame++; } while ( iFrame < maxFrames || frames == NULL ); done: if ( image == NULL ) SDL_RWseek( src, start, SEEK_SET ); if (loop) *loop = gd->loop; free( gd ); return iFrame; } static int ReadColorMap( gifdata* gd, int number, unsigned char buffer[3][MAXCOLORMAPSIZE] ) { int i; unsigned char rgb[3]; int flag; flag = TRUE; for ( i = 0; i < number; ++i ) { if ( !SDL_RWread(gd->src,rgb,sizeof(rgb),1) ) { SDL_SetError( "bad colormap" ); return 1; } buffer[CM_RED][i] = rgb[0]; buffer[CM_GREEN][i] = rgb[1]; buffer[CM_BLUE][i] = rgb[2]; flag &= (rgb[0] == rgb[1] && rgb[1] == rgb[2]); } return FALSE; } static int DoExtension( gifdata* gd, int label ) { unsigned char buf[256]; switch ( label ) { case 0x01: /* Plain Text Extension */ break; case 0xff: /* Application Extension */ if (GetDataBlock( gd, buf ) != 11) break; if (strncmp((char*)buf, "NETSCAPE2.0", 11)) break; if (GetDataBlock( gd, buf ) != 3) break; if (buf[0] != 1) break; gd->loop = (unsigned int)buf[1] | (((unsigned int)buf[2]) << 8); break; case 0xfe: /* Comment Extension */ while ( GetDataBlock(gd,buf) != 0 ) ; return FALSE; case 0xf9: /* Graphic Control Extension */ if (GetDataBlock( gd, buf ) <= 0) return FALSE; gd->g89.disposal = (buf[0] >> 2) & 0x7; gd->g89.inputFlag = (buf[0] >> 1) & 0x1; gd->g89.delayTime = LM_to_uint(buf[1],buf[2]); if ( (buf[0] & 0x1) != 0 ) gd->g89.transparent = buf[3]; while ( GetDataBlock(gd,buf) != 0 ) ; return FALSE; } while ( GetDataBlock(gd,buf) != 0 ) ; return FALSE; } static int GetDataBlock( gifdata* gd, unsigned char* buf ) { unsigned char count; if ( !SDL_RWread(gd->src,&count,1,1) ) { /* pm_message("error in getting DataBlock size" ); */ return -1; } gd->zerodatablock = count == 0; if ( (count != 0) && !SDL_RWread(gd->src,buf,count,1) ) { /* pm_message("error in reading DataBlock" ); */ return -1; } return count; } static int GetCode( gifdata* gd, int code_size, int flag ) { int i, j, ret; int count; if ( flag ) { gd->curbit = 0; gd->lastbit = 0; gd->done = FALSE; return 0; } if ( (gd->curbit + code_size) >= gd->lastbit ) { if ( gd->done ) { if ( gd->curbit >= gd->lastbit ) SDL_SetError( "ran off the end of my bits" ); return -1; } gd->buf[0] = gd->buf[gd->lastbyte - 2]; gd->buf[1] = gd->buf[gd->lastbyte - 1]; if ( (count = GetDataBlock(gd, &gd->buf[2])) == 0 ) gd->done = TRUE; gd->lastbyte = 2 + count; gd->curbit = (gd->curbit - gd->lastbit) + 16; gd->lastbit = (2 + count)*8; } ret = 0; for ( i = gd->curbit, j = 0; j < code_size; ++i, ++j ) ret |= ((gd->buf[i / 8] & (1 << (i % 8))) != 0) << j; gd->curbit += code_size; return ret; } static int LWZReadByte( gifdata* gd, int flag, int input_code_size ) { int i, code, incode; if ( flag ) { gd->setcodesize = input_code_size; gd->codesize = gd->setcodesize + 1; gd->clearcode = 1 << gd->setcodesize; gd->endcode = gd->clearcode + 1; gd->maxcodesize = gd->clearcode*2; gd->maxcode = gd->clearcode + 2; GetCode( gd, 0, TRUE ); gd->fresh = TRUE; for ( i = 0; i < gd->clearcode; ++i ) { gd->table[0][i] = 0; gd->table[1][i] = i; } for ( ; i < (1 << MAX_LWZ_BITS); ++i ) gd->table[0][i] = gd->table[1][0] = 0; gd->sp = gd->stack; return 0; } else if ( gd->fresh ) { gd->fresh = FALSE; do { gd->firstcode = gd->oldcode = GetCode( gd, gd->codesize, FALSE ); } while ( gd->firstcode == gd->clearcode ); return gd->firstcode; } if ( gd->sp > gd->stack ) return *--gd->sp; while ( (code = GetCode(gd,gd->codesize,FALSE)) >= 0 ) { if ( code == gd->clearcode ) { for ( i = 0; i < gd->clearcode; ++i ) { gd->table[0][i] = 0; gd->table[1][i] = i; } for ( ; i < (1 << MAX_LWZ_BITS); ++i ) gd->table[0][i] = gd->table[1][i] = 0; gd->codesize = gd->setcodesize + 1; gd->maxcodesize = gd->clearcode*2; gd->maxcode = gd->clearcode + 2; gd->sp = gd->stack; gd->firstcode = gd->oldcode = GetCode( gd, gd->codesize, FALSE ); return gd->firstcode; } else if ( code == gd->endcode ) { int count; unsigned char buf[260]; if ( gd->zerodatablock ) return -2; while ( (count = GetDataBlock(gd,buf)) > 0 ) ; if ( count != 0 ) { /* pm_message("missing EOD in data stream (common occurence)"); */ } return -2; } incode = code; if ( code >= gd->maxcode ) { *gd->sp++ = gd->firstcode; code = gd->oldcode; } while ( code >= gd->clearcode ) { *gd->sp++ = gd->table[1][code]; if ( code == gd->table[0][code] ) SDL_SetError( "circular table entry BIG ERROR" ); code = gd->table[0][code]; } *gd->sp++ = gd->firstcode = gd->table[1][code]; if ( (code = gd->maxcode) < (1 << MAX_LWZ_BITS) ) { gd->table[0][code] = gd->oldcode; gd->table[1][code] = gd->firstcode; ++gd->maxcode; if ( (gd->maxcode >= gd->maxcodesize) && (gd->maxcodesize < (1 << MAX_LWZ_BITS)) ) { gd->maxcodesize *= 2; ++gd->codesize; } } gd->oldcode = incode; if ( gd->sp > gd->stack ) return *--gd->sp; } return code; } static SDL_Surface* ReadImage( gifdata* gd, int len, int height, int cmapSize, unsigned char cmap[3][MAXCOLORMAPSIZE], int interlace, int ignore ) { SDL_Surface* image; unsigned char c; int i, v; int xpos = 0, ypos = 0, pass = 0; /* Initialize the compression routines */ if ( !SDL_RWread(gd->src,&c,1,1) ) { SDL_SetError( "EOF / read error on image data" ); return NULL; } if ( LWZReadByte(gd,TRUE,c) < 0 ) { SDL_SetError( "error reading image" ); return NULL; } /* If this is an "uninteresting picture" ignore it. */ if ( ignore ) { while ( LWZReadByte(gd,FALSE,c) >= 0 ) ; return NULL; } image = SDL_CreateRGBSurface( SDL_SWSURFACE, len, height, 8, 0, 0, 0, 0 ); for ( i = 0; i < cmapSize; i++ ) { image->format->palette->colors[i].r = cmap[CM_RED][i]; image->format->palette->colors[i].g = cmap[CM_GREEN][i]; image->format->palette->colors[i].b = cmap[CM_BLUE][i]; } while ( (v = LWZReadByte(gd,FALSE,c)) >= 0 ) { ((Uint8*)image->pixels)[xpos + ypos*image->pitch] = (Uint8)v; ++xpos; if ( xpos == len ) { xpos = 0; if ( interlace ) { switch ( pass ) { case 0: case 1: ypos += 8; break; case 2: ypos += 4; break; case 3: ypos += 2; break; } if ( ypos >= height ) { ++pass; switch ( pass ) { case 1: ypos = 4; break; case 2: ypos = 2; break; case 3: ypos = 1; break; default: goto fini; } } } else { ++ypos; } } if ( ypos >= height ) break; } fini: return image; } instead-3.2.1/src/ioapi.c0000644000175000017500000001700213267071774014236 0ustar peterpeter#ifdef _USE_UNPACK /* ioapi.h -- IO base function header for compress/uncompress .zip part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) Modifications for Zip64 support Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) For more info read MiniZip_info.txt */ #if (defined(_WIN32)) #define _CRT_SECURE_NO_WARNINGS #endif #include "ioapi.h" voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) { if (pfilefunc->zfile_func64.zopen64_file != NULL) return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); else { return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); } } long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) { if (pfilefunc->zfile_func64.zseek64_file != NULL) return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); else { uLong offsetTruncated = (uLong)offset; if (offsetTruncated != offset) return -1; else return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); } } ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) { if (pfilefunc->zfile_func64.zseek64_file != NULL) return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); else { uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); if ((tell_uLong) == ((uLong)-1)) return (ZPOS64_T)-1; else return tell_uLong; } } void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) { p_filefunc64_32->zfile_func64.zopen64_file = NULL; p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; /* p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; */ p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; p_filefunc64_32->zfile_func64.ztell64_file = NULL; p_filefunc64_32->zfile_func64.zseek64_file = NULL; p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; } static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) mode_fopen = "r+b"; else if (mode & ZLIB_FILEFUNC_MODE_CREATE) mode_fopen = "wb"; if ((filename!=NULL) && (mode_fopen != NULL)) file = fopen(filename, mode_fopen); return file; } static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) mode_fopen = "r+b"; else if (mode & ZLIB_FILEFUNC_MODE_CREATE) mode_fopen = "wb"; if ((filename!=NULL) && (mode_fopen != NULL)) file = fopen64((const char*)filename, mode_fopen); return file; } static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) { uLong ret; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) { long ret; ret = ftell((FILE *)stream); return ret; } static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) { ZPOS64_T ret; ret = ftello64((FILE *)stream); return ret; } static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) { int fseek_origin=0; long ret; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : fseek_origin = SEEK_CUR; break; case ZLIB_FILEFUNC_SEEK_END : fseek_origin = SEEK_END; break; case ZLIB_FILEFUNC_SEEK_SET : fseek_origin = SEEK_SET; break; default: return -1; } ret = 0; if (fseek((FILE *)stream, offset, fseek_origin) != 0) ret = -1; return ret; } static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) { int fseek_origin=0; long ret; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : fseek_origin = SEEK_CUR; break; case ZLIB_FILEFUNC_SEEK_END : fseek_origin = SEEK_END; break; case ZLIB_FILEFUNC_SEEK_SET : fseek_origin = SEEK_SET; break; default: return -1; } ret = 0; if(fseeko64((FILE *)stream, offset, fseek_origin) != 0) ret = -1; return ret; } static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) { int ret; ret = fclose((FILE *)stream); return ret; } static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) { int ret; ret = ferror((FILE *)stream); return ret; } void fill_fopen_filefunc (pzlib_filefunc_def) zlib_filefunc_def* pzlib_filefunc_def; { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->ztell_file = ftell_file_func; pzlib_filefunc_def->zseek_file = fseek_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->opaque = NULL; } void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = fopen64_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->ztell64_file = ftell64_file_func; pzlib_filefunc_def->zseek64_file = fseek64_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->opaque = NULL; } #endif instead-3.2.1/src/instead_sound.c0000644000175000017500000004204713267071774016003 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" static int cur_vol = 0; int game_change_vol(int d, int val) { int v = snd_volume_mus(-1); int pc = snd_vol_to_pcn(v); int opc = pc; if (d) { pc += d; if (pc < 0) pc = 0; if (pc > 100) pc = 100; while (snd_vol_to_pcn(v) != pc) v += (d<0)?-1:1; } else { v = val; pc = snd_vol_to_pcn(v); } if (!pc) v = 0; snd_volume_mus(v); if (opc && !pc) { game_stop_mus(0); } if (!opc && pc) { game_music_player(); } cur_vol = snd_volume_mus(-1); if (!nosound_sw) opt_vol = cur_vol; return 0; } #define MAX_WAVS SND_CHANNELS * 2 static LIST_HEAD(sounds); static int sounds_nr = 0; typedef struct { struct list_node list; char *fname; wav_t wav; int loaded; int system; int fmt; short *buf; size_t len; } _snd_t; typedef struct { _snd_t *snd; int loop; int channel; } _snd_req_t; static _snd_t *channels[SND_CHANNELS]; static _snd_req_t sound_reqs[SND_CHANNELS]; static void sound_play(_snd_t *sn, int chan, int loop); void sound_play_click(void) { sound_play(game_theme.click, -1, 1); } static void sound_callback(void *aux) { _snd_req_t *r; int channel = *((int *)aux); int c = channel % SND_CHANNELS; free(aux); /* fprintf(stderr, "finished: %d\n", channel); */ channels[c] = NULL; r = &sound_reqs[c]; if (r->snd) { _snd_t *s = r->snd; r->snd = NULL; sound_play(s, channel, r->loop); } else { snd_halt_chan(channel, 0); /* to avoid races */ } } void game_channel_finished(int channel) /* SDL callback */ { int *i = malloc(sizeof(channel)); if (!i) { fprintf(stderr, "game_channel_finished: No memory\n"); return; } *i = channel; push_user_event(sound_callback, i); } static int sound_playing(_snd_t *snd) { int i; for (i = 0; i < SND_CHANNELS; i++) { if (channels[i] == snd) return i; if (sound_reqs[i].snd == snd) return i; } return -1; } static const char *sound_channel(int i) { _snd_t *sn; if (i >= SND_CHANNELS) i = i % SND_CHANNELS; if (i == -1) { for (i = 0; i < SND_CHANNELS; i++) { sn = channels[i]; if (sn && !sn->system) return sn->fname; } return NULL; } sn = channels[i]; if (!sn) return NULL; if (sn->system) return NULL; /* hidden system sound */ return sn->fname; } static void sound_free(_snd_t *sn) { if (!sn) return; list_del(&sn->list); sounds_nr --; free(sn->fname); snd_free_wav(sn->wav); if (sn->buf) free(sn->buf); free(sn); } static void sounds_shrink(void) { _snd_t *pos, *pos2; _snd_t *sn; pos = list_top(&sounds, _snd_t, list); /* fprintf(stderr,"shrink try\n"); */ while (pos && sounds_nr > MAX_WAVS) { sn = (_snd_t*)pos; if (sound_playing(sn) != -1 || sn->loaded) { pos = list_next(&sounds, pos, list); continue; } pos2 = list_next(&sounds, pos, list); sound_free(sn); pos = pos2; /* fprintf(stderr,"shrink by 1\n"); */ } } static void sounds_free(void) { int i = 0; _snd_t *pos, *pos2; _snd_t *sn; pos = list_top(&sounds, _snd_t, list); snd_halt_chan(-1, 0); /* halt sounds */ while (pos) { sn = (_snd_t*)pos; pos2 = list_next(&sounds, pos, list); if (sn->system) sn->loaded = 1; /* ref by system only */ else sound_free(sn); pos = pos2; } for (i = 0; i < SND_CHANNELS; i++) { channels[i] = NULL; sound_reqs[i].snd = NULL; } /* sounds_nr = 0; fprintf(stderr, "%d\n", sounds_nr); */ input_uevents(); /* all callbacks */ } static _snd_t *sound_find(const char *fname) { _snd_t *pos = NULL; _snd_t *sn; if (!fname) return NULL; list_for_each(&sounds, pos, list) { sn = (_snd_t*)pos; if (!strcmp(fname, sn->fname)) { list_del(&sn->list); list_add(&sounds, &sn->list); /* move it on head */ return sn; } } return NULL; } static int sound_find_channel(void) { int i; for (i = 0; i < SND_CHANNELS; i ++) { if (!channels[i] && !sound_reqs[i].snd) return i; } return -1; } static void sound_play(_snd_t *sn, int chan, int loop) { int c; if (!sn) return; if (chan == -1) { c = sound_find_channel(); if (c == -1) return; /* all channels are busy */ } else c = chan; if (channels[c]) { sound_reqs[c].snd = sn; sound_reqs[c].loop = loop; sound_reqs[c].channel = chan; snd_halt_chan(chan, 0); /* work in callback */ input_uevents(); /* all callbacks */ return; } c = snd_play(sn->wav, c, loop - 1); /* fprintf(stderr, "added: %d\n", c); */ if (c == -1) return; channels[c] = sn; } static _snd_t *sound_add(const char *fname, int fmt, short *buf, int len) { wav_t w; _snd_t *sn; if (!fname || !*fname) return NULL; sn = malloc(sizeof(_snd_t)); if (!sn) return NULL; memset(sn, 0, sizeof(*sn)); /* LIST_HEAD_INIT(&sn->list); */ sn->fname = strdup(fname); sn->loaded = 0; sn->system = 0; sn->buf = buf; sn->len = len; sn->fmt = fmt; if (!sn->fname) { free(sn); return NULL; } if (buf) w = snd_load_mem(fmt, buf, len); else w = snd_load_wav(fname); if (!w) { if (snd_enabled()) game_res_err_msg(fname, debug_sw); goto err; } sn->wav = w; sounds_shrink(); list_add(&sounds, &sn->list); sounds_nr ++; return sn; err: free(sn->fname); free(sn); return NULL; } static void sounds_reload(void) { _snd_t *pos = NULL; _snd_t *sn; int i; snd_halt_chan(-1, 0); /* stop all sound */ list_for_each(&sounds, pos, list) { sn = (_snd_t*)pos; snd_free_wav(sn->wav); if (sn->buf) sn->wav = snd_load_mem(sn->fmt, sn->buf, sn->len); else sn->wav = snd_load_wav(sn->fname); } for (i = 0; i < SND_CHANNELS; i++) { channels[i] = NULL; sound_reqs[i].snd = NULL; } input_uevents(); /* all callbacks */ } static void *_sound_get(const char *fname, int fmt, short *buff, size_t len) { _snd_t *sn = NULL; if (fname) { sn = sound_find(fname); if (sn) { sn->loaded ++; /* to pin */ return sn; } sn = sound_add(fname, fmt, buff, len); } else if (buff) { char *name = malloc(64); if (!name) return NULL; snprintf(name, 64, "snd:%p", buff); name[64 - 1] = 0; sn = sound_add(name, fmt, buff, len); if (!sn) free(name); else { snprintf(name, 64, "snd:%p", sn); name[64 - 1] = 0; free(sn->fname); sn->fname = name; } } if (!sn) return NULL; sn->loaded = 1; return sn; } static void _sound_put(void *s) { _snd_t *sn = (_snd_t *)s; if (!sn || !sn->loaded) return; if (!sn->system || sn->loaded > 1) sn->loaded --; if (!sn->loaded && sound_playing(sn) == -1) sound_free(sn); return; } void *sound_get(const char *fname) { _snd_t *sn = _sound_get(fname, 0, NULL, 0); if (!sn) return NULL; sn->system = 1; return sn; } void sound_put(void *s) { _snd_t *sn = (_snd_t *)s; if (!sn) return; sn->system = 0; _sound_put(sn); } static int sound_load(const char *fname) { _snd_t *sn = _sound_get(fname, 0, NULL, 0); if (!sn) return -1; return 0; } static char *sound_load_mem(int fmt, short *buff, size_t len) { _snd_t *sn = _sound_get(NULL, fmt, buff, len); if (!sn) return NULL; return sn->fname; } static void sound_unload(const char *fname) { _snd_t *sn; sn = sound_find(fname); _sound_put(sn); return; } static int _play_combined_snd(char *filename, int chan, int loop) { char *str; char *p, *ep; _snd_t *sn; p = str = strdup(filename); if (!str) return -1; p = strip(p); while (*p) { int c = chan, l = loop; int at = 0; ep = p + strcspn(p, ";@"); if (*ep == '@') { at = 1; *ep = 0; ep ++; if (sscanf(ep, "%d,%d", &c, &l) > 1) at ++; ep += strcspn(ep, ";"); if (*ep) ep ++; } else if (*ep == ';') { *ep = 0; ep ++; } else if (*ep) { goto err; } p = strip(p); sn = sound_find(p); if (!sn) sn = sound_add(p, 0, NULL, 0); if (sn) sound_play(sn, c, l); else if (at || c != -1) { /* if @ or specific channel */ snd_halt_chan(c, (at == 2)?l:500); } p = ep; } free(str); return 0; err: free(str); return -1; } static void game_sound_player(void) { char *snd; int chan = -1; int loop = 1; struct instead_args args[] = { { .val = "nil", .type = INSTEAD_NIL }, { .val = "-1", .type = INSTEAD_NUM }, { .val = NULL } }; if (!snd_volume_mus(-1)) return; instead_lock(); instead_function("instead.get_sound", NULL); loop = instead_iretval(2); chan = instead_iretval(1); snd = instead_retval(0); instead_clear(); if (!snd) { if (chan != -1) { /* halt channel */ snd_halt_chan(chan, 500); instead_function("instead.set_sound", args); instead_clear(); } instead_unlock(); return; } instead_function("instead.set_sound", args); instead_clear(); instead_unlock(); unix_path(snd); _play_combined_snd(snd, chan, loop); free(snd); } static char *last_music = NULL; static void free_last_music(void) { if (last_music) free(last_music); last_music = NULL; } int game_change_hz(int hz) { if (!hz) return -1; #ifndef __EMSCRIPTEN__ snd_close(); free_last_music(); snd_open(hz); snd_volume_mus(cur_vol); sounds_reload(); game_music_player(); #endif opt_hz = snd_hz(); return 0; } void game_stop_mus(int ms) { snd_stop_mus(ms); free_last_music(); } static void finish_music(void *data) { int rc; if (!curgame_dir) return; instead_lock(); instead_function("instead.finish_music", NULL); rc = instead_bretval(0); instead_clear(); instead_unlock(); if (rc) free_last_music(); snd_volume_mus(cur_vol); /* reset volume */ } void game_music_finished(void) /* SDL callback */ { push_user_event(&finish_music, NULL); } void game_music_player(void) { int loop; char *mus; int cf_out = 0; int cf_in = 0; if (!snd_volume_mus(-1)) return; if (!opt_music || !curgame_dir) return; instead_lock(); instead_function("instead.get_music", NULL); mus = instead_retval(0); loop = instead_iretval(1); unix_path(mus); instead_clear(); instead_function("instead.get_music_fading", NULL); cf_out = instead_iretval(0); cf_in = instead_iretval(1); instead_clear(); instead_unlock(); if (mus && loop == -1) { /* disabled, 0 - forever, 1-n - loops */ free(mus); mus = NULL; } if (loop == 0) loop = -1; if (cf_out == 0) cf_out = 500; else if (cf_out < 0) cf_out = 0; if (cf_in < 0) cf_in = 0; if (!mus) { if (last_music) { game_stop_mus(cf_out); } } else if (!last_music || strcmp(last_music, mus)) { game_stop_mus(cf_out); last_music = mus; if (snd_play_mus(mus, cf_in, loop) < 0) game_res_err_msg(mus, debug_sw); } else free(mus); } static int luaB_is_sound(lua_State *L) { const char *chan = luaL_optstring(L, 1, NULL); int c, r; if (!chan) c = -1; else c = atoi(chan); r = (sound_channel(c) != NULL); lua_pushboolean(L, r); /* else not a number */ return 1; } static int luaB_load_sound(lua_State *L) { int rc; const char *fname = luaL_optstring(L, 1, NULL); if (!fname) return 0; rc = sound_load(fname); if (rc) return 0; lua_pushstring(L, fname); return 1; } #define SND_F2S(v) ((short)((float)(v) * 16383.0) * 2) static int luaB_load_sound_mem(lua_State *L) { int hz = luaL_optinteger(L, 1, -1); int channels = luaL_optinteger(L, 2, -1); int len; int i; short *buf = NULL; const char *name; int fmt = 0; luaL_checktype(L, 3, LUA_TTABLE); if (hz < 0 || channels < 0) return 0; #if LUA_VERSION_NUM >= 502 len = lua_rawlen(L, 3); #else len = lua_objlen(L, 3); #endif if (len <= 0) return 0; buf = malloc(sizeof(short) * len); if (!buf) return 0; lua_pushvalue(L, 3); for (i = 0; i < len; i++) { float v; lua_pushinteger(L, i + 1); lua_gettable(L, -2); if (!lua_isnumber(L, -1)) { v = 0; } else { v = (float)lua_tonumber(L, -1); } buf[i] = SND_F2S(v); lua_pop(L, 1); } lua_pop(L, 1); /* here we got the sample */ if (channels == 2) fmt |= SND_FMT_STEREO; if (hz == 11025) fmt |= SND_FMT_11; else if (hz == 22050) fmt |= SND_FMT_22; else fmt |= SND_FMT_44; name = sound_load_mem(fmt, buf, len); /* free(buf); */ if (!name) return 0; lua_pushstring(L, name); return 1; } static int luaB_free_sound(lua_State *L) { const char *fname = luaL_optstring(L, 1, NULL); if (!fname) return 0; sound_unload(fname); return 0; } static int luaB_free_sounds(lua_State *L) { sounds_free(); return 0; } static int luaB_panning_sound(lua_State *L) { int chan = luaL_optinteger(L, 1, -1); int left = luaL_optnumber(L, 2, 255); int right = luaL_optnumber(L, 3, 255); snd_panning(chan, left, right); return 0; } static int luaB_volume_sound(lua_State *L) { int vol = luaL_optnumber(L, 1, -1); vol = snd_volume_mus(vol); lua_pushinteger(L, vol); return 1; } static int luaB_channel_sound(lua_State *L) { const char *s; int ch = luaL_optinteger(L, 1, 0); ch = ch % SND_CHANNELS; s = sound_channel(ch); if (s) { lua_pushstring(L, s); return 1; } return 0; } static int callback_ref = 0; static int sound_inited = 0; #define SOUND_MAGIC 0x2004 struct lua_sound { int type; short *buf; int len; }; static void mus_callback(void *udata, unsigned char *stream, int len) { lua_State *L = (lua_State *) udata; struct lua_sound *hdr; if (!callback_ref) return; instead_lock(); lua_rawgeti(L, LUA_REGISTRYINDEX, callback_ref); lua_pushinteger(L, snd_hz()); lua_pushinteger(L, len >> 1); hdr = lua_newuserdata(L, sizeof(*hdr)); if (!hdr) goto err; hdr->type = SOUND_MAGIC; hdr->len = len >> 1; /* 16bits */ hdr->buf = (short *)stream; luaL_getmetatable(L, "soundbuffer metatable"); lua_setmetatable(L, -2); if (instead_pcall(L, 3)) { /* on any error */ err: snd_mus_callback(NULL, NULL); luaL_unref(L, LUA_REGISTRYINDEX, callback_ref); callback_ref = 0; } instead_clear(); instead_unlock(); return; } static int luaB_music_callback(lua_State *L) { if (!sound_inited) return 0; snd_mus_callback(NULL, NULL); if (callback_ref) luaL_unref(L, LUA_REGISTRYINDEX, callback_ref); callback_ref = 0; if (lua_isfunction(L, 1)) { game_stop_mus(0); callback_ref = luaL_ref(L, LUA_REGISTRYINDEX); snd_mus_callback(mus_callback, L); } return 0; } static const luaL_Reg sound_funcs[] = { {"instead_sound", luaB_is_sound}, {"instead_sound_load", luaB_load_sound}, {"instead_sound_load_mem", luaB_load_sound_mem}, {"instead_sound_free", luaB_free_sound}, {"instead_sound_channel", luaB_channel_sound}, {"instead_sound_panning", luaB_panning_sound}, {"instead_sound_volume", luaB_volume_sound}, {"instead_sounds_free", luaB_free_sounds}, {"instead_music_callback", luaB_music_callback}, {NULL, NULL} }; static int sound_done(void) { if (!sound_inited) return 0; if (callback_ref) { snd_mus_callback(NULL, NULL); luaL_unref(instead_lua(), LUA_REGISTRYINDEX, callback_ref); callback_ref = 0; } game_stop_mus(0); sounds_free(); snd_close(); sound_inited = 0; return 0; } /* static int sound_size(lua_State *L) { struct lua_sound *hdr = (struct lua_sound*)lua_touserdata(L, 1); if (!hdr || hdr->type != SOUND_MAGIC) return 0; lua_pushnumber(L, hdr->len); return 1; } */ static int sound_value(lua_State *L) { struct lua_sound *hdr = (struct lua_sound*)lua_touserdata(L, 1); int pos = luaL_optinteger(L, 2, -1); float v = luaL_optnumber(L, 3, 0.0f); if (pos <= 0) return 0; if (pos > hdr->len) return 0; pos --; if (lua_isnoneornil(L, 3)) { lua_pushinteger(L, hdr->buf[pos]); return 1; } hdr->buf[pos] = SND_F2S(v); return 0; } /* ** Creates chunk metatable. */ static int chunk_create_meta (lua_State *L) { luaL_newmetatable (L, "soundbuffer metatable"); lua_pushstring (L, "__index"); lua_pushcfunction(L, sound_value); lua_settable(L, -3); lua_pushstring (L, "__newindex"); lua_pushcfunction(L, sound_value); lua_settable(L, -3); /* lua_pushstring (L, "size"); lua_pushcfunction (L, sound_size); lua_settable(L, -3); */ return 0; } static int sound_init(void) { int rc; char path[PATH_MAX]; instead_api_register(sound_funcs); chunk_create_meta(instead_lua()); snprintf(path, sizeof(path), "%s/%s", instead_stead_path(), "/ext/sound.lua"); rc = instead_loadfile(dirpath(path)); if (rc) return rc; snd_open(opt_hz); if (!nosound_sw) game_change_vol(0, opt_vol); sound_inited = 1; return 0; } static int sound_cmd(void) { game_music_player(); game_sound_player(); return 0; } static struct instead_ext ext = { .init = sound_init, .done = sound_done, .cmd = sound_cmd, }; int instead_sound_init(void) { return instead_extension(&ext); } instead-3.2.1/src/graphics.h0000644000175000017500000002241513267071774014746 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GRAPHICS_H__ #define __GRAPHICS_H__ #include /* #define GFX_CACHE_SIZE 64 #define GFX_MAX_CACHED_W 256 #define GFX_MAX_CACHED_H 256 #define WORD_CACHE_SIZE 1024 #define LINK_CACHE_SIZE 64 */ #if SDL_VERSION_ATLEAST(1,3,0) typedef int gtimer_t; #define NULL_TIMER 0 #else typedef void* gtimer_t; #define NULL_TIMER NULL #endif struct _img_t; typedef struct _img_t* img_t; typedef void* fnt_t; typedef void* layout_t; typedef void* textbox_t; typedef void* xref_t; typedef void* word_t; typedef struct { int r; int g; int b; int a; } color_t; #define ALIGN_LEFT 1 #define ALIGN_RIGHT 2 #define ALIGN_CENTER 4 #define ALIGN_JUSTIFY 8 #define ALIGN_TOP 16 #define ALIGN_BOTTOM 32 #define ALIGN_MIDDLE 64 #define STYLE_NORMAL 0x00 #define STYLE_BOLD 0x01 #define STYLE_ITALIC 0x02 #define STYLE_UNDERLINE 0x04 extern color_t gfx_col(int r, int g, int b); extern int gfx_init(void); extern void gfx_done(void); extern int gfx_parse_color (const char *spec, color_t *def); extern void gfx_flip(void); extern void gfx_commit(void); extern cache_t gfx_image_cache(void); extern img_t gfx_screen(img_t nscreen); extern void gfx_bg(color_t col); extern void gfx_noclip(void); extern void gfx_clip(int x, int y, int w, int h); extern void gfx_getclip(int *x, int *y, int *w, int *h); extern void gfx_img_clip(img_t img, int x, int y, int w, int h); extern void gfx_img_noclip(img_t img); extern int gfx_width; extern int gfx_height; extern int gfx_fs; extern int gfx_video_init(void); extern int gfx_set_mode(int w, int h, int fs); extern int gfx_get_mode(int n, int *w, int *h); extern int gfx_get_token(const char *ptr, char **eptr, char **val, int *sp); #define MODE_ANY 0 #define MODE_H 1 #define MODE_V 2 extern int gfx_get_max_mode(int *w, int *h, int o); extern int gfx_check_mode(int w, int h); extern int gfx_set_title(const char *title); extern int gfx_set_icon(img_t icon); extern int gfx_next_mode(int *w, int *h); extern int gfx_prev_mode(int *w, int *h); extern void gfx_update(int x, int y, int w, int h); extern void gfx_video_done(void); extern void gfx_clear(int x, int y, int w, int h); extern void gfx_resize(int w, int h); extern void gfx_copy_from(img_t p, int x, int y, int width, int height, img_t to, int xx, int yy); extern void gfx_draw(img_t p, int x, int y); extern void gfx_copy(img_t p, int x, int y); extern void gfx_draw_wh(img_t p, int x, int y, int w, int h); extern img_t gfx_grab_screen(int x, int y, int w, int h); extern img_t gfx_new(int w, int h); extern img_t gfx_new_rgba(int w, int h); extern img_t gfx_new_from(int w, int h, unsigned char *pixels); extern img_t gfx_dup(img_t src); extern img_t gfx_load_image(char *filename); extern void gfx_free_image(img_t pixmap); extern int gfx_img_w(img_t pixmap); extern int gfx_img_h(img_t pixmap); extern img_t gfx_combine(img_t src, img_t dst); extern void gfx_set_alpha(img_t src, int alpha); extern int gfx_unset_alpha(img_t src); extern void gfx_set_colorkey(img_t src, color_t col); extern void gfx_unset_colorkey(img_t src); extern img_t gfx_alpha_img(img_t src, int alpha); extern img_t gfx_display_alpha(img_t src); extern img_t gfx_scale(img_t src, float xscale, float yscale, int smooth); extern img_t gfx_rotate(img_t src, float angle, int smooth); extern void gfx_draw_bg(img_t p, int x, int y, int width, int height); extern void gfx_draw_from(img_t p, int x, int y, int width, int height, img_t to, int xx, int yy); extern void gfx_draw_from_alpha(img_t s, int x, int y, int w, int h, img_t d, int xx, int yy, int alpha); extern void gfx_compose_from(img_t p, int x, int y, int width, int height, img_t to, int xx, int yy); extern int gfx_cursor(int *xp, int *yp); extern void gfx_warp_cursor(int x, int y); extern void gfx_change_screen(img_t src, int steps, void (*callback)(void *), void *); extern void gfx_cancel_change_screen(void); extern int gfx_fading(void); extern void gfx_img_fill(img_t img, int x, int y, int w, int h, color_t col); extern void gfx_fill(int x, int y, int w, int h, color_t col); extern int gfx_get_pixel(img_t src, int x, int y, color_t *color); extern int gfx_set_pixel(img_t src, int x, int y, color_t color); extern void gfx_put_pixels(img_t src); extern unsigned char *gfx_get_pixels(img_t src); extern fnt_t fnt_load(const char *fname, int size); extern void fnt_free(fnt_t); extern int fnt_height(fnt_t fn); extern void fnt_style(fnt_t fn, int style); extern img_t fnt_render(fnt_t fn, const char *p, color_t col); extern void txt_draw(fnt_t fnt, const char *txt, int x, int y, color_t col); extern void txt_size(fnt_t fnt, const char *txt, int *w, int *h); /* extern int txt_width(fnt_t fnt, const char *txt); extern layout_t txt_layout(fnt_t fn, char *txt, int width, int height); */ extern layout_t txt_layout(fnt_t fn, int align, int width, int height); extern void txt_layout_add(layout_t lay, char *txt); extern void txt_layout_set(layout_t lay, char *txt); extern void txt_layout_draw(layout_t lay, int x, int y); extern void txt_layout_free(layout_t lay); extern void _txt_layout_free(layout_t lay); /* do not free lay obj */ extern xref_t txt_layout_xref(layout_t lay, int x, int y); extern void txt_layout_color(layout_t lay, color_t fg); extern fnt_t txt_layout_font(layout_t lay); extern void txt_layout_font_height(layout_t lay, float height); extern textbox_t txt_layout_box(layout_t lay); extern void txt_layout_link_color(layout_t lay, color_t link); extern void txt_layout_active_color(layout_t lay, color_t link); extern void txt_layout_link_style(layout_t lay, int style); extern int txt_layout_add_img(layout_t lay, const char *name, img_t img); extern img_t txt_layout_images(layout_t lay, void **v); /* enumerator */ extern word_t txt_layout_words(layout_t lay, word_t w); /* enumerator */ extern int word_geom(word_t v, int *x, int *y, int *w, int *h); extern img_t word_image(word_t v); extern void txt_layout_size(layout_t lay, int *w, int *h); extern textbox_t txt_box(int w, int h); extern layout_t txt_box_layout(textbox_t tbox); extern void txt_box_set(textbox_t tbox, layout_t lay); extern void txt_box_free(textbox_t tbox); extern void txt_box_draw(textbox_t tbox, int x, int y); extern void txt_box_next(textbox_t tbox); extern void txt_box_prev(textbox_t tbox); extern void txt_box_next_line(textbox_t tbox); extern void txt_box_prev_line(textbox_t tbox); extern void txt_box_scroll(textbox_t tbox, int disp); extern xref_t txt_box_xref(textbox_t tbox, int x, int y); extern xref_t txt_box_xrefs(textbox_t tbox); extern void txt_box_real_size(textbox_t box, int *pw, int *ph); extern int txt_box_off(textbox_t tbox); extern void txt_box_size(textbox_t tbox, int *w, int *h); extern void txt_box_resize(textbox_t tbox, int w, int h); typedef void (*clear_fn)(int x, int y, int w, int h); extern void txt_box_update_links(textbox_t tbox, int x, int y, clear_fn); extern void txt_layout_update_links(layout_t layout, int x, int y, clear_fn clear); extern void txt_layout_real_size(layout_t lay, int *w, int *h); extern void txt_layout_set_size(layout_t lay, int w, int h); /* without text only */ extern int txt_layout_pos2off(layout_t lay, int pos, int *hh); extern int txt_layout_anchor(layout_t lay, int *hh); extern img_t txt_box_render(textbox_t tbox); extern char *xref_get_text(xref_t x); extern void xref_set_active(xref_t x, int val); extern int xref_get_active(xref_t x); extern xref_t xref_next(xref_t x); extern xref_t xref_prev(xref_t x); extern int xref_position(xref_t x, int *xc, int *yc); extern int xref_valid(xref_t x); extern xref_t txt_layout_xrefs(layout_t lay); extern layout_t xref_layout(xref_t x); typedef void (*update_fn)(int x, int y, int w, int h); extern void xref_update(xref_t xref, int x, int y, clear_fn clear, update_fn update); extern void gfx_start_gif(img_t img); extern int gfx_is_drawn_gifs(void); extern void gfx_stop_gif(img_t img); extern int gfx_frame_gif(img_t img); extern void gfx_del_timer(gtimer_t han); extern gtimer_t gfx_add_timer(int delay, int (*fn)(int, void*), void *aux); extern void gfx_update_gif(img_t img, update_fn update); extern void gfx_dispose_gif(img_t p); extern unsigned long gfx_ticks(void); extern void gfx_set_cursor(img_t cur, int xc, int yc); extern int gfx_pending(void); #endif instead-3.2.1/src/utils.h0000644000175000017500000000526513267071774014312 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __UTIL_H_INCLUDED #define __UTIL_H_INCLUDED #include "instead/util.h" #include "instead/idf.h" #include "instead/cache.h" #include "instead/list.h" typedef int (*parser_fn)(const char *v, void *data); struct parser { const char *cmd; parser_fn fn; void *p; long aux; }; extern int parse_ini(const char *path, struct parser *cmd_parser); extern int parse_idff(idff_t idff, const char *path, struct parser *cmd_parser); extern char *lookup_tag(const char *fname, const char *tag, const char *comm); extern char *lookup_lang_tag(const char *fname, const char *tag, const char *comm, const char *lang); extern char *lookup_lang_tag_idf(idf_t idf, const char *fname, const char *tag, const char *comm, const char *lang); extern int parse_esc_string(const char *v, void *data); extern int parse_string(const char *v, void *data); extern int parse_int(const char *v, void *data); extern int parse_float(const char *v, void *data); extern int parse_full_path(const char *v, void *data); extern int parse_path(const char *v, void *data); extern int process_cmd(char *n, char *v, struct parser *cmd_parser); extern char *encode_esc_string(const char *v); extern char *find_in_esc(const char *l, const char *s); extern char *sdl_path(char *path); extern char *parse_tag(char *line, const char *tag, const char *comm, int *brk); extern int remove_dir(const char *path); extern void data2hex(const void *d, int len, void *o); extern int hex2data(const void *d, void *o, int len); extern void trunc_lines(char *pp, int max); extern void data_sync(void); /* rw data sync */ #endif instead-3.2.1/src/config.c0000644000175000017500000001127513267071774014410 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" #if defined(S60) || defined(_WIN32_WCE) || defined(MAEMO) int opt_fsize = 12; #elif defined(IOS) || defined(SAILFISHOS) || defined(ANDROID) || defined(WINRT) int opt_fsize = 5; #else int opt_fsize = 0; #endif #if defined(MAEMO) int opt_fs = 1; int opt_owntheme = 0; int opt_hl = 0; #elif defined(IOS) || defined(ANDROID) || defined(SAILFISHOS) int opt_fs = 1; int opt_owntheme = 1; int opt_hl = 0; #elif defined(_WIN32_WCE) || defined(WINRT) int opt_fs = 1; int opt_owntheme = 1; int opt_hl = 0; #else int opt_fs = 0; int opt_owntheme = 1; int opt_hl = 1; #endif int opt_fading = 1; #if defined(S60) || defined(MAEMO) || defined(_WIN32_WCE) int opt_hz = 22050; #else int opt_hz = 44100; #endif int opt_vol = 127; int opt_motion = 1; int opt_click = 1; int opt_music = 1; int opt_autosave = 1; int opt_filter = 1; int opt_kbd = KBD_SMART; int opt_justify = 0; int opt_vsync = -1; int opt_debug = -1; int opt_resizable = -1; int opt_hires = 1; char *opt_game = NULL; char *opt_theme = NULL; char *opt_lang = NULL; int opt_mode[2] = {-1, -1}; int parse_mode(const char *v, void *data) { int w, h; char *eptr; int *p = ((int *)data); w = strtol(v, &eptr, 10); if (!w || (eptr == v) || (*eptr != 'x')) return -1; eptr ++; h = strtol(eptr, &eptr, 10); if (!h || (*eptr)) return -1; p[0] = w; p[1] = h; return 0; } static struct parser cfg_parser[] = { { "hz", parse_int, &opt_hz, 0 }, { "fs", parse_int, &opt_fs, 0 }, { "vol", parse_int, &opt_vol, 0 }, { "hl", parse_int, &opt_hl, 0 }, { "game", parse_string, &opt_game, 0 }, { "theme", parse_string, &opt_theme, 0 }, { "autosave", parse_int, &opt_autosave, 0 }, { "motion", parse_int, &opt_motion, 0 }, { "click", parse_int, &opt_click, 0 }, { "music", parse_int, &opt_music, 0 }, { "fscale", parse_int, &opt_fsize, 0 }, { "filter", parse_int, &opt_filter, 0 }, { "owntheme", parse_int, &opt_owntheme, 0 }, { "lang", parse_string, &opt_lang, 0 }, { "kbd", parse_int, &opt_kbd, 0 }, { "mode", parse_mode, opt_mode, 0 }, { "justify", parse_int, &opt_justify, 0 }, { "fading", parse_int, &opt_fading, 0 }, { "vsync", parse_int, &opt_vsync, 0 }, { "debug", parse_int, &opt_debug, 0 }, { "resizable", parse_int, &opt_resizable, 0 }, { "hires", parse_int, &opt_hires, 0 }, { NULL, NULL, NULL, 0 }, }; void cfg_init(void) { #if defined(IOS) ios_cfg_init(); #endif } static int cfg_parse(const char *path) { return parse_ini(path, cfg_parser); } int cfg_load(void) { char *p = game_cfg_path(); if (!p) return -1; if (access(p, R_OK)) return 0; return cfg_parse(p); } int cfg_save(void) { int save_owntheme = (opt_owntheme == 2)?0:opt_owntheme; int save_autosave = (opt_autosave == 2)?1:opt_autosave; FILE *fp; char *p = game_cfg_path(); if (!p) return -1; fp = fopen(p, "w"); if (!fp) return -1; fprintf(fp, "fs = %d\nhl = %d\nhz = %d\nvol = %d\nautosave = %d\n\ game = %s\nfscale = %d\nmotion = %d\n\ click = %d\nmusic = %d\ntheme = %s\n\ filter = %d\nowntheme = %d\nlang = %s\nkbd = %d\nmode = %dx%d\njustify = %d\nfading = %d\nhires = %d\n", opt_fs, opt_hl, opt_hz, opt_vol, save_autosave, curgame_dir?curgame_dir:"", opt_fsize, opt_motion, opt_click, opt_music, curtheme_dir[THEME_GLOBAL]?curtheme_dir[THEME_GLOBAL]:DEFAULT_THEME, opt_filter, save_owntheme, opt_lang, opt_kbd, opt_mode[0], opt_mode[1], opt_justify, opt_fading, opt_hires); if (opt_vsync != -1) fprintf(fp, "vsync = %d\n", opt_vsync); if (opt_debug != -1) fprintf(fp, "debug = %d\n", opt_debug); if (opt_resizable != -1) fprintf(fp, "resizable = %d\n", opt_resizable); fclose(fp); data_sync(); return 0; } instead-3.2.1/src/noise1234.c0000644000175000017500000004631113267071774014571 0ustar peterpeter// noise1234 // // Author: Stefan Gustavson, 2003-2005 // Contact: stefan.gustavson@liu.se // // This code was GPL licensed until February 2011. // As the original author of this code, I hereby // release it into the public domain. // Please feel free to use it for whatever you want. // Credit is appreciated where appropriate, and I also // appreciate being told where this code finds any use, // but you may do as you like. /* * This implementation is "Improved Noise" as presented by * Ken Perlin at Siggraph 2002. The 3D function is a direct port * of his Java reference code which was once publicly available * on www.noisemachine.com (although I cleaned it up, made it * faster and made the code more readable), but the 1D, 2D and * 4D functions were implemented from scratch by me. * * This is a backport to C of my improved noise class in C++ * which was included in the Aqsis renderer project. * It is highly reusable without source code modifications. * */ #include "noise1234.h" // This is the new and improved, C(2) continuous interpolant #define FADE(t) ( t * t * t * ( t * ( t * 6 - 15 ) + 10 ) ) #define FASTFLOOR(x) ( ((int)(x)<(x)) ? ((int)x) : ((int)x-1 ) ) #define LERP(t, a, b) ((a) + (t)*((b)-(a))) //--------------------------------------------------------------------- // Static data /* * Permutation table. This is just a random jumble of all numbers 0-255, * repeated twice to avoid wrapping the index at 255 for each lookup. * This needs to be exactly the same for all instances on all platforms, * so it's easiest to just keep it as static explicit data. * This also removes the need for any initialisation of this class. * * Note that making this an int[] instead of a char[] might make the * code run faster on platforms with a high penalty for unaligned single * byte addressing. Intel x86 is generally single-byte-friendly, but * some other CPUs are faster with 4-aligned reads. * However, a char[] is smaller, which avoids cache trashing, and that * is probably the most important aspect on most architectures. * This array is accessed a *lot* by the noise functions. * A vector-valued noise over 3D accesses it 96 times, and a * float-valued 4D noise 64 times. We want this to fit in the cache! */ unsigned char perm[] = {151,160,137,91,90,15, 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180, 151,160,137,91,90,15, 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 }; //--------------------------------------------------------------------- /* * Helper functions to compute gradients-dot-residualvectors (1D to 4D) * Note that these generate gradients of more than unit length. To make * a close match with the value range of classic Perlin noise, the final * noise values need to be rescaled. To match the RenderMan noise in a * statistical sense, the approximate scaling values (empirically * determined from test renderings) are: * 1D noise needs rescaling with 0.188 * 2D noise needs rescaling with 0.507 * 3D noise needs rescaling with 0.936 * 4D noise needs rescaling with 0.87 * Note that these noise functions are the most practical and useful * signed version of Perlin noise. To return values according to the * RenderMan specification from the SL noise() and pnoise() functions, * the noise values need to be scaled and offset to [0,1], like this: * float SLnoise = (noise3(x,y,z) + 1.0) * 0.5; */ float grad1( int hash, float x ) { int h = hash & 15; float grad = 1.0 + (h & 7); // Gradient value 1.0, 2.0, ..., 8.0 if (h&8) grad = -grad; // and a random sign for the gradient return ( grad * x ); // Multiply the gradient with the distance } float grad2( int hash, float x, float y ) { int h = hash & 7; // Convert low 3 bits of hash code float u = h<4 ? x : y; // into 8 simple gradient directions, float v = h<4 ? y : x; // and compute the dot product with (x,y). return ((h&1)? -u : u) + ((h&2)? -2.0*v : 2.0*v); } float grad3( int hash, float x, float y , float z ) { int h = hash & 15; // Convert low 4 bits of hash code into 12 simple float u = h<8 ? x : y; // gradient directions, and compute dot product. float v = h<4 ? y : h==12||h==14 ? x : z; // Fix repeats at h = 12 to 15 return ((h&1)? -u : u) + ((h&2)? -v : v); } float grad4( int hash, float x, float y, float z, float t ) { int h = hash & 31; // Convert low 5 bits of hash code into 32 simple float u = h<24 ? x : y; // gradient directions, and compute dot product. float v = h<16 ? y : z; float w = h<8 ? z : t; return ((h&1)? -u : u) + ((h&2)? -v : v) + ((h&4)? -w : w); } //--------------------------------------------------------------------- /** 1D float Perlin noise, SL "noise()" */ float noise1( float x ) { int ix0, ix1; float fx0, fx1; float s, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x fx0 = x - ix0; // Fractional part of x fx1 = fx0 - 1.0f; ix1 = ( ix0+1 ) & 0xff; ix0 = ix0 & 0xff; // Wrap to 0..255 s = FADE( fx0 ); n0 = grad1( perm[ ix0 ], fx0 ); n1 = grad1( perm[ ix1 ], fx1 ); return 0.188f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- /** 1D float Perlin periodic noise, SL "pnoise()" */ float pnoise1( float x, int px ) { int ix0, ix1; float fx0, fx1; float s, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x fx0 = x - ix0; // Fractional part of x fx1 = fx0 - 1.0f; ix1 = (( ix0 + 1 ) % px) & 0xff; // Wrap to 0..px-1 *and* wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; // (because px might be greater than 256) s = FADE( fx0 ); n0 = grad1( perm[ ix0 ], fx0 ); n1 = grad1( perm[ ix1 ], fx1 ); return 0.188f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- /** 2D float Perlin noise. */ float noise2( float x, float y ) { int ix0, iy0, ix1, iy1; float fx0, fy0, fx1, fy1; float s, t, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; ix1 = (ix0 + 1) & 0xff; // Wrap to 0..255 iy1 = (iy0 + 1) & 0xff; ix0 = ix0 & 0xff; iy0 = iy0 & 0xff; t = FADE( fy0 ); s = FADE( fx0 ); nx0 = grad2(perm[ix0 + perm[iy0]], fx0, fy0); nx1 = grad2(perm[ix0 + perm[iy1]], fx0, fy1); n0 = LERP( t, nx0, nx1 ); nx0 = grad2(perm[ix1 + perm[iy0]], fx1, fy0); nx1 = grad2(perm[ix1 + perm[iy1]], fx1, fy1); n1 = LERP(t, nx0, nx1); return 0.507f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- /** 2D float Perlin periodic noise. */ float pnoise2( float x, float y, int px, int py ) { int ix0, iy0, ix1, iy1; float fx0, fy0, fx1, fy1; float s, t, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; ix1 = (( ix0 + 1 ) % px) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 iy1 = (( iy0 + 1 ) % py) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; t = FADE( fy0 ); s = FADE( fx0 ); nx0 = grad2(perm[ix0 + perm[iy0]], fx0, fy0); nx1 = grad2(perm[ix0 + perm[iy1]], fx0, fy1); n0 = LERP( t, nx0, nx1 ); nx0 = grad2(perm[ix1 + perm[iy0]], fx1, fy0); nx1 = grad2(perm[ix1 + perm[iy1]], fx1, fy1); n1 = LERP(t, nx0, nx1); return 0.507f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- /** 3D float Perlin noise. */ float noise3( float x, float y, float z ) { int ix0, iy0, ix1, iy1, iz0, iz1; float fx0, fy0, fz0, fx1, fy1, fz1; float s, t, r; float nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of z fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; ix1 = ( ix0 + 1 ) & 0xff; // Wrap to 0..255 iy1 = ( iy0 + 1 ) & 0xff; iz1 = ( iz0 + 1 ) & 0xff; ix0 = ix0 & 0xff; iy0 = iy0 & 0xff; iz0 = iz0 & 0xff; r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxy0 = grad3(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0); nxy1 = grad3(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad3(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0); nxy1 = grad3(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxy0 = grad3(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0); nxy1 = grad3(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad3(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0); nxy1 = grad3(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.936f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- /** 3D float Perlin periodic noise. */ float pnoise3( float x, float y, float z, int px, int py, int pz ) { int ix0, iy0, ix1, iy1, iz0, iz1; float fx0, fy0, fz0, fx1, fy1, fz1; float s, t, r; float nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of z fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; ix1 = (( ix0 + 1 ) % px ) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 iy1 = (( iy0 + 1 ) % py ) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 iz1 = (( iz0 + 1 ) % pz ) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; iz0 = ( iz0 % pz ) & 0xff; r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxy0 = grad3(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0); nxy1 = grad3(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad3(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0); nxy1 = grad3(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxy0 = grad3(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0); nxy1 = grad3(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad3(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0); nxy1 = grad3(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.936f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- /** 4D float Perlin noise. */ float noise4( float x, float y, float z, float w ) { int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1; float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1; float s, t, r, q; float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of y iw0 = FASTFLOOR( w ); // Integer part of w fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fw0 = w - iw0; // Fractional part of w fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; fw1 = fw0 - 1.0f; ix1 = ( ix0 + 1 ) & 0xff; // Wrap to 0..255 iy1 = ( iy0 + 1 ) & 0xff; iz1 = ( iz0 + 1 ) & 0xff; iw1 = ( iw0 + 1 ) & 0xff; ix0 = ix0 & 0xff; iy0 = iy0 & 0xff; iz0 = iz0 & 0xff; iw0 = iw0 & 0xff; q = FADE( fw0 ); r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0); nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0); nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0); nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0); nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0); nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0); nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0); nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0); nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.87f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- /** 4D float Perlin periodic noise. */ float pnoise4( float x, float y, float z, float w, int px, int py, int pz, int pw ) { int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1; float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1; float s, t, r, q; float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of y iw0 = FASTFLOOR( w ); // Integer part of w fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fw0 = w - iw0; // Fractional part of w fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; fw1 = fw0 - 1.0f; ix1 = (( ix0 + 1 ) % px ) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 iy1 = (( iy0 + 1 ) % py ) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 iz1 = (( iz0 + 1 ) % pz ) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255 iw1 = (( iw0 + 1 ) % pw ) & 0xff; // Wrap to 0..pw-1 and wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; iz0 = ( iz0 % pz ) & 0xff; iw0 = ( iw0 % pw ) & 0xff; q = FADE( fw0 ); r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0); nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0); nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0); nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0); nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0); nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0); nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0); nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0); nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.87f * ( LERP( s, n0, n1 ) ); } //--------------------------------------------------------------------- instead-3.2.1/src/utils.c0000644000175000017500000002412013267071774014274 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "utils.h" int process_cmd(char *n, char *v, struct parser *cmd_parser) { int i; n = strip(n); v = strip(v); for (i = 0; cmd_parser[i].cmd; i++) { if (!strcmp(cmd_parser[i].cmd, n)) { return cmd_parser[i].fn(v, cmd_parser[i].p); } } return -1; } static int fgetsesc(char *oline, size_t size, char *(*getl)(void *p, char *s, int size), void *fp) { int nr = 0; char line[4096]; size_t len; *oline = 0; *line = 0; while (getl(fp, line, sizeof(line))) { int i; nr ++; i = strcspn(line, "\n\r"); if (!i || !line[i]) break; line[i] = 0; if (line[i - 1] == '\\') { line[i - 1] = 0; strncat(oline, line, size - 1); len = strlen(line); if (len >= size) return nr; size -= len; line[0] = 0; } else { break; } } strncat(oline, line, size - 1); return nr; } char *find_in_esc(const char *l, const char *s) { int esc = 0; for (; *l; l++) { if (esc) { esc = 0; continue; } l += strcspn(l, s); if (*l == '\\') { esc = 1; continue; } if (!esc) return (char*)l; } return NULL; } static void comments_zap(char *p) { char *l = find_in_esc(p, "\\;\n"); if (l) *l = 0; } int parse_all(void *fp, char *(*getl)(void *p, char *s, int size), const char *path, struct parser *cmd_parser) { int nr; int rc = 0; int line_nr = 1; char line[4096]; if (!fp) return -1; while ((nr = fgetsesc(line, sizeof(line), getl, fp))) { char *p = line; char *val; int len; line_nr += nr; p += strspn(p, " \t"); if (*p == ';') continue; len = strcspn(p, "="); if (p[len] != '=') /* just ignore it */ continue; p[len] = 0; val = p + len + 1; len = strcspn(p, " \t"); p[len] = 0; /* printf("%s\n", p); */ val += strspn(val, " \t"); comments_zap(val); /* val[strcspn(val, ";\n")] = 0; */ if (process_cmd(p, val, cmd_parser)) { rc = -1; fprintf(stderr, "Can't process cmd '%s' on line %d in '%s': %s\n", p, line_nr - nr, path, strerror(errno)); } } return rc; } static char *file_gets(void *fd, char *s, int size) { return fgets(s, size, (FILE *)fd); } static char *idff_gets(void *fd, char *s, int size) { return idf_gets((idff_t)fd, s, size); } int parse_ini(const char *path, struct parser *cmd_parser) { int rc = 0; FILE *fp; fp = fopen(path, "rb"); if (!fp) return -1; rc = parse_all(fp, file_gets, path, cmd_parser); fclose(fp); return rc; } int parse_idff(idff_t idff, const char *path, struct parser *cmd_parser) { if (!idff) return -1; return parse_all(idff, idff_gets, path, cmd_parser); } int parse_string(const char *v, void *data) { char **p = ((char **)data); if (*p) free(*p); *p = strdup(v); if (!*p) return -1; return 0; } char *encode_esc_string(const char *v) { char *r, *p; if (!v) return NULL; p = r = malloc((strlen(v)*2) + 1); if (!r) return NULL; while (*v) { switch (*v) { case ' ': *p ++ = '\\'; *p ++ = ' '; break; case '"': *p ++ = '\\'; *p ++ = '"'; break; case '\'': *p ++ = '\\'; *p ++ = '\''; break; case '\\': *p ++ = '\\'; *p ++ = '\\'; break; case '\n': *p ++ ='\\'; *p ++ ='\n'; break; default: *p ++ = *v; } v ++; } *p ++ = 0; return r; } int parse_esc_string(const char *v, void *data) { int esc = 0; char *ptr; char **p = ((char **)data); if (*p) free(*p); *p = strdup(v); if (!*p) return -1; for (ptr = *p; *v; v ++) { if (esc) { switch (*v) { case 'n': *ptr = '\n'; break; case '$': *ptr = '$'; break; case '\\': *ptr = '\\'; break; case ';': *ptr = ';'; break; case 'r': *ptr = '\n'; break; default: *ptr = *v; break; } esc = 0; ptr ++; continue; } else if (*v != '\\') { *ptr = *v; ptr ++; continue; } else esc = 1; } *ptr = 0; return 0; } int parse_int(const char *v, void *data) { int *i = (int *)data; char *eptr = NULL; *i = strtol(v, &eptr, 0); if (!eptr || *eptr) return -1; return 0; } int parse_float(const char *v, void *data) { float *f = (float *)data; if (sscanf(v, "%f", f) != 1) return -1; return 0; } int parse_path(const char *v, void *data) { char **p = ((char **)data); if (*p) free(*p); if (!v[0]) { *p = strdup(""); return (*p)?0:-1; } *p = strdup(v); if (!*p) return -1; /* *p = sdl_path(*p); note: do not convert relative paths to avoid double encoding */ unix_path(*p); return 0; } #if defined(_WIN32) && !defined(_WIN32_WCE) #include #include static char *wchar2utf(const wchar_t *wc) { char *buf; int size = WideCharToMultiByte (CP_UTF8, 0, wc, -1, NULL, 0, NULL, NULL); if (!size) return NULL; buf = malloc(size); WideCharToMultiByte (CP_UTF8, 0, wc, -1, buf, size, NULL, NULL); return buf; } char *w32_getdir(char *path, size_t size) { wchar_t *wp; char *p = NULL; path[0] = 0; wp = _wgetcwd(NULL, 0); if (!wp) return path; p = wchar2utf(wp); free(wp); if (!p) return path; snprintf(path, size, "%s", p); free(p); return path; } #endif int parse_full_path(const char *v, void *data) { char cwd[PATH_MAX]; char **p = ((char **)data); if (*p) free(*p); if (!v[0]) { *p = strdup(""); return (*p)?0:-1; } #if defined(_WIN32) && !defined(_WIN32_WCE) w32_getdir(cwd, sizeof(cwd)); #else getdir(cwd, sizeof(cwd)); #endif *p = malloc(strlen(v) + strlen(cwd) + 2); if (!*p) return -1; strcpy(*p, cwd); strcat(*p,"/"); strcat(*p, v); *p = sdl_path(*p); return 0; } static char *lookup_tag_all(const char *tag, const char *comm, char *(*getl)(void *p, char *s, int size), void *fp) { int brk = 0; char *l; char line[1024]; while ((l = getl(fp, line, sizeof(line))) && !brk) { l = parse_tag(l, tag, comm, &brk); if (l) return l; } return NULL; } char *lookup_tag(const char *fname, const char *tag, const char *comm) { char *l; FILE *fd = fopen(fname, "rb"); if (!fd) return NULL; l = lookup_tag_all(tag, comm, file_gets, fd); fclose(fd); return l; } char *lookup_lang_tag(const char *fname, const char *tag, const char *comm, const char *opt_lang) { char lang_tag[1024]; char *l; snprintf(lang_tag, sizeof(lang_tag), "%s(%s)", tag, opt_lang); l = lookup_tag(fname, lang_tag, comm); if (!l) l = lookup_tag(fname, tag, comm); return l; } char *lookup_lang_tag_idf(idf_t idf, const char *fname, const char *tag, const char *comm, const char *opt_lang) { char lang_tag[1024]; char *l; idff_t idff; if (!idf) return NULL; idff = idf_open(idf, fname); if (!idff) return NULL; snprintf(lang_tag, sizeof(lang_tag), "%s(%s)", tag, opt_lang); l = lookup_tag_all(lang_tag, comm, idff_gets, idff); if (!l) { idf_seek(idff, 0, SEEK_SET); l = lookup_tag_all(tag, comm, idff_gets, idff); } idf_close(idff); return l; } char *parse_tag(char *line, const char *tag, const char *comm, int *brk) { char *l = line; char *ns = NULL; char ftag[1024]; snprintf(ftag, sizeof(ftag), "$%s:", tag); l += strspn(l, " \t"); if (strncmp(l, comm, strlen(comm))) { /* non coment block */ *brk = 1; return NULL; } l += strlen(comm); l += strspn(l, " \t"); if (strncmp(l, ftag, strlen(ftag))) return NULL; l += strlen(ftag); l += strspn(l, " \t"); ns = l; l = find_in_esc(l, "\\$"); if (l) *l = 0; l = ns; ns = NULL; if (parse_esc_string(l, &ns)) return NULL; l = ns + strlen(ns); while (l != ns) { l --; if (*l != '\r' && *l != '\n') break; *l = 0; } return ns; } int remove_dir(const char *path) { DIR *d; struct dirent *de; if (!path) return 0; d = opendir(path); if (!d) { if (!access(path, F_OK)) { unlink(path); } return -1; } while ((de = readdir(d))) { char *p; if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue; p = getfilepath(path, de->d_name); if (p) { remove_dir(p); free(p); } } closedir(d); rmdir(path); return 0; } void data2hex(const void *d, int len, void *o) { unsigned char *data = (unsigned char *)d; unsigned char *out = (unsigned char *)o; static char map[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; while (len --) { unsigned char a = *data ++; *out ++ = map[a & 0xf]; *out ++ = map[a >> 4]; } } int hex2data(const void *d, void *o, int len) { unsigned char *data = (unsigned char *)d; unsigned char *out = (unsigned char *)o; unsigned char b = 0; int rc = 0; len *= 2; while (len --) { unsigned char c = *data ++; if ((c < '0' || c > '9') && (c < 'a' || c > 'f')) break; if (c >= 'a') c -= ('a' - 10); else c -= '0'; if (len & 1) b = c; else *out ++ = b + (c << 4); rc ++; } return rc; } void trunc_lines(char *pp, int max) { int n = 0; if (!pp) return; if (max == 0) { pp[strcspn(pp, "\n\r")] = 0; return; } while (pp[strcspn(pp, "\n\r")]) { n ++; pp += strcspn(pp, "\n\r"); if (n >= max) { *pp = 0; break; } pp ++; } } #ifdef __EMSCRIPTEN__ void data_sync(void) { EM_ASM(FS.syncfs(function(error) { if (error) { console.log("Error while syncing:", error); } else { console.log("Config synced"); } });); } #else void data_sync(void) { } #endif instead-3.2.1/src/ios.h0000644000175000017500000000051613267071774013736 0ustar peterpeter#ifndef _IOS_H_INCLUDED #define _IOS_H_INCLUDED #define VERSION "3.2.1" #define STEAD_PATH "__private__/stead" #define THEMES_PATH "__private__/themes" #define GAMES_PATH "__private__/games" #define ICON_PATH "__private__/icon" #define LANG_PATH "__private__/lang" extern int setup_inbox(void); extern void ios_cfg_init(void); #endif instead-3.2.1/src/android.h0000644000175000017500000000116513267071774014565 0ustar peterpeter#include #ifndef SDL_JAVA_PACKAGE_PATH #error You have to define SDL_JAVA_PACKAGE_PATH to your package path with dots replaced with underscores, for example "com_example_SanAngeles" #endif #define JAVA_EXPORT_NAME2(name,package) Java_##package##_##name #define JAVA_EXPORT_NAME1(name,package) JAVA_EXPORT_NAME2(name,package) #define JAVA_EXPORT_NAME(name) JAVA_EXPORT_NAME1(name,SDL_JAVA_PACKAGE_PATH) extern void JNICALL JAVA_EXPORT_NAME(SDLActivity_nativeSave)(JNIEnv *env, jobject obj) { cfg_save(); } extern void JNICALL JAVA_EXPORT_NAME(SDLActivity_nativeStop)(JNIEnv *env, jobject obj) { game_done(0); exit(0); } instead-3.2.1/src/menu.h0000644000175000017500000000215213267071774014106 0ustar peterpeter#ifndef __MENU_H_INCLUDED #define __MENU_H_INCLUDED #if defined(ANDROID) || defined(S60) || defined(_WIN32_WCE) || defined(WINRT) #define MENU_GAMES_MAX 5 #define MENU_THEMES_MAX 5 #define MENU_PER_PAGER 5 #else #define MENU_GAMES_MAX 8 #define MENU_THEMES_MAX 8 #define MENU_PER_PAGER 7 #endif #define FONT_MIN_SZ -5 #define FONT_MAX_SZ 30 #define MAX_SAVE_SLOTS 6 #define LANG_DEF "en" #define MAX_MENU_LINES 16 extern int cur_menu; extern int top_menu; extern char *game_menu_gen(void); extern int game_menu_act(const char *a); extern void custom_theme_warn(void); extern int menu_langs_lookup(const char *path); extern int menu_lang_select(const char *name); extern int games_menu_maxw(void); extern int themes_menu_maxw(void); struct lang { char *path; char *name; char *file; }; extern struct lang *langs; extern int langs_nr; enum { menu_main = 1, menu_about, menu_about_instead, menu_settings, menu_quit, menu_askquit, menu_saved, menu_games, menu_themes, menu_own_theme, menu_custom_theme, menu_load, menu_save, menu_error, menu_warning, menu_remove, menu_wait, menu_max, }; #endif instead-3.2.1/src/menu.c0000644000175000017500000006635113267071774014114 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" static int restart_needed = 0; static int games_menu_from = 0; static int themes_menu_page = 0; static int cur_lang = 0; int cur_menu = menu_main; int top_menu = menu_main; char *UNKNOWN_ERROR = NULL; char *ERROR_MENU = NULL; char *WARNING_MENU = NULL; char *SAVE_SLOT_EMPTY = NULL; char *SELECT_LOAD_MENU = NULL; char *AUTOSAVE_SLOT = NULL; char *BROKEN_SLOT = NULL; char *SELECT_SAVE_MENU = NULL; char *MAIN_MENU = NULL; char *ABOUT_MENU = NULL; char *BACK_MENU = NULL; char *SETTINGS_SND_MENU = NULL; char *SETTINGS_GFX_MENU = NULL; char *SETTINGS_OTH_MENU = NULL; char *CUSTOM_THEME_MENU = NULL; char *OWN_THEME_MENU = NULL; char *WAIT_MENU = NULL; char *SELECT_GAME_MENU = NULL; char *SELECT_THEME_MENU = NULL; char *SAVED_MENU = NULL; char *NOGAMES_MENU = NULL; char *NOTHEMES_MENU = NULL; char *BROWSE_MENU = NULL; char *QUIT_MENU = NULL; char *REMOVE_MENU = NULL; char *ON = NULL; char *OFF = NULL; char *KBD_MODE_LINKS = NULL; char *KBD_MODE_SMART = NULL; char *KBD_MODE_SCROLL = NULL; char *CANCEL_MENU = NULL; char *FROM_THEME = NULL; char *DISABLED_SAVE_MENU = NULL; static char menu_buff[8192]; static char *slot_name(const char *path) { struct stat st; char *l; if (stat(path, &st)) return NULL; l = lookup_tag(path, "Name", "--"); if (l) { trunc_lines(l, 0); if (!is_empty(l) && game_tag_valid(l)) { int y; char *m; static char *months[] = {/* to work on every locale ;)*/ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; struct tm *tm; time_t t; char *s = instead_fromgame(l); free(l); if (!s) return s; time(&t); tm = localtime(&t); y = tm->tm_year; tm = localtime(&st.st_mtime); l = malloc(strlen(s) + 64); if (!l) return s; if (tm->tm_mon >=0 && tm->tm_mon < 12) m = months[tm->tm_mon]; else m = "?"; if (tm->tm_year == y) snprintf(l, 64, "%02d %s %02d:%02d - ", tm->tm_mday, m, tm->tm_hour, tm->tm_min); else { if (tm->tm_year < 1900) tm->tm_year += 1900; snprintf(l, 64, "%02d %s %02d:%02d %04d - ", tm->tm_mday, m, tm->tm_hour, tm->tm_min, tm->tm_year); } strcat(l, s); free(s); return l; } free(l); } l = ctime(&st.st_mtime); if (!l) return NULL; l[strcspn(l,"\n")] = 0; return strdup(l); } static void load_menu(void) { int i; *menu_buff = 0; /* if (!game_saves_enabled()) { strcat(menu_buff, DISABLED_SAVE_MENU); strcat(menu_buff, CANCEL_MENU); return; } */ strcpy(menu_buff, SELECT_LOAD_MENU); for (i = 0; i < MAX_SAVE_SLOTS; i ++) { char tmp[PATH_MAX]; char *s = game_save_path(0, i); if (!s || access(s, R_OK)) { if (!i) continue; snprintf(tmp, sizeof(tmp), "%d - %s\n", i, SAVE_SLOT_EMPTY); } else { char *name; if (!i) name = strdup(AUTOSAVE_SLOT); else name = slot_name(s); if (!name) snprintf(tmp, sizeof(tmp), "%d - %s\n", i, BROKEN_SLOT); else { snprintf(tmp, sizeof(tmp), "%d - %s\n", i, i, name); free(name); } } strcat(menu_buff, tmp); } strcat(menu_buff,"\n"); strcat(menu_buff, CANCEL_MENU); } static void save_menu(void) { int i; *menu_buff = 0; if (!game_saves_enabled()) { strcat(menu_buff, DISABLED_SAVE_MENU); strcat(menu_buff, CANCEL_MENU); return; } strcpy(menu_buff, SELECT_SAVE_MENU); for (i = 1; i < MAX_SAVE_SLOTS; i ++) { char tmp[PATH_MAX]; char *s = game_save_path(0, i); if (!s || access(s, R_OK)) snprintf(tmp, sizeof(tmp), "%d - %s\n", i, i, SAVE_SLOT_EMPTY); else { char *name; if (!i) name = strdup(AUTOSAVE_SLOT); else name = slot_name(s); if (!name) snprintf(tmp, sizeof(tmp), "%d - %s\n", i, i, BROKEN_SLOT); else { snprintf(tmp, sizeof(tmp), "%d - %s\n", i, i, name); free(name); } } strcat(menu_buff, tmp); } strcat(menu_buff,"\n"); strcat(menu_buff, CANCEL_MENU); } static int pages_menu(char *res, int nr, int max, const char *menu, const char *append) { static char buff[256]; int k = MENU_PER_PAGER; int i = nr - MENU_PER_PAGER / 2; if (i < 0) i = 0; else if (max - i < MENU_PER_PAGER) i = max - MENU_PER_PAGER; if (i < 0) i = 0; if (nr) sprintf(buff, "<< ", menu); else sprintf(buff, "<< "); strcat(res, buff); for (; i < max && k-- ; i ++) { if (i != nr) sprintf(buff, "[%d] ", menu, i, i + 1); else sprintf(buff, "[%d] ", i + 1); strcat(res, buff); } if ((nr + 1) != max) sprintf(buff, ">>", menu); else sprintf(buff, ">>"); strcat(res, buff); strcat(res, append); return 0; } static void games_menu(void) { int i, n; #ifdef _USE_BROWSE int append_browse = 0; #endif char tmp[PATH_MAX]; #ifdef _USE_BROWSE snprintf(tmp, sizeof(tmp), " %s\n", BROWSE_MENU); #else snprintf(tmp, sizeof(tmp), "\n"); #endif strcpy(menu_buff, SELECT_GAME_MENU); if ((games_nr - 1) / MENU_GAMES_MAX) pages_menu(menu_buff, games_menu_from / MENU_GAMES_MAX, (games_nr - 1) / MENU_GAMES_MAX + 1, "games", tmp); #ifdef _USE_BROWSE else append_browse = 1; #endif for (i = games_menu_from, n = 0; i < games_nr && n < MENU_GAMES_MAX; i ++) { if (!games[i].name[0]) /* empty */ continue; if (curgame_dir && !strcmp(games[i].dir, curgame_dir)) snprintf(tmp, sizeof(tmp), "%s", games[i].name); else snprintf(tmp, sizeof(tmp), "%s", games[i].dir, games[i].name); if (!strncmp(game_local_games_path(0), games[i].path, strlen(game_local_games_path(0))) && !access(games[i].path, W_OK)) { snprintf(tmp + strlen(tmp), sizeof(tmp), " [X]\n", i); } else strcat(tmp, "\n"); strcat(menu_buff, tmp); n ++; } for(;n < MENU_GAMES_MAX && games_nr > MENU_GAMES_MAX; n++) /* align h */ strcat(menu_buff, "\n"); #ifdef _USE_BROWSE if (append_browse) { snprintf(tmp, sizeof(tmp), "%s\n", BROWSE_MENU); strcat(menu_buff, tmp); } #endif if (!games_nr) { sprintf(menu_buff, NOGAMES_MENU, GAMES_PATH); #ifdef _USE_BROWSE strcat(menu_buff,"\n"); snprintf(tmp, sizeof(tmp), "%s\n", BROWSE_MENU); strcat(menu_buff, tmp); #endif } strcat(menu_buff,"\n"); strcat(menu_buff, BACK_MENU); } int games_menu_maxw(void) { int i = 0; int oldm = games_menu_from; int maxw = 0; for (i = 0; i < games_nr; i += MENU_GAMES_MAX) { int w; games_menu_from = i; games_menu(); game_menu_box_wh(menu_buff, &w, NULL); if (w > maxw) maxw = w; } games_menu_from = oldm; return maxw; } static void themes_menu(void) { int i, n, m; int type; int count = themes_max(&type); int pages = 0; if (count > 0) pages = (count - 1) / MENU_THEMES_MAX + 1; if (themes_menu_page >= pages) themes_menu_page = 0; strcpy(menu_buff, SELECT_THEME_MENU); if (pages > 1) pages_menu(menu_buff, themes_menu_page, pages, "themes", "\n"); for (i = 0, n = 0, m = 0; i < themes_nr && n < MENU_THEMES_MAX; i ++) { char tmp[PATH_MAX]; if (!themes[i].name[0]) /* empty */ continue; if (themes[i].type != type) continue; m ++; if ((m - 1) / MENU_THEMES_MAX < themes_menu_page) continue; if (curtheme_dir[type] && !strcmp(themes[i].dir, curtheme_dir[type])) snprintf(tmp, sizeof(tmp), "%s\n", themes[i].name); else snprintf(tmp, sizeof(tmp), "%s\n", themes[i].dir, themes[i].name); strcat(menu_buff, tmp); n ++; } for(;n < MENU_THEMES_MAX && count > MENU_THEMES_MAX; n++) /* align h */ strcat(menu_buff, "\n"); if (!count) sprintf(menu_buff, NOTHEMES_MENU, THEMES_PATH); strcat(menu_buff, "\n"); strcat(menu_buff, BACK_MENU); } int themes_menu_maxw(void) { int i = 0; int oldm = themes_menu_page; int maxw = 0; int pages = 0; int count = themes_max(NULL); if (count > 0) pages = (count - 1) / MENU_THEMES_MAX + 1; else pages = 1; for (i = 0; i < pages; i ++) { int w; themes_menu_page = i; themes_menu(); game_menu_box_wh(menu_buff, &w, NULL); if (w > maxw) maxw = w; } themes_menu_page = oldm; return maxw; } static char *opt_get_mode(void) { static char buff[128]; if (opt_mode[0] == -1 || opt_mode[1] == -1) { snprintf(buff, sizeof(buff), "%s", FROM_THEME); return buff; } snprintf(buff, sizeof(buff), "%dx%d", opt_mode[0], opt_mode[1]); return buff; } static int gtr = 0; static int menu_settings_num = 0; static void menu_strip_tag(const char *a, const char *b) { char *p, *ep; size_t len; p = strstr(menu_buff, a); if (!p) return; ep = strstr(p, b); if (!ep) return; /* ep += strcspn(ep, "\n\r"); ep += strspn(ep, "\n\r"); */ ep += strlen(b); len = strlen(ep); memmove(p, ep, len); p[len] = 0; } static void menu_remove_tag(const char *a, const char *b) { char *p, *ep; size_t len; p = strstr(menu_buff, a); if (!p) return; ep = p + strlen(a); len = strlen(ep); memmove(p, ep, len); p[len] = 0; ep = strstr(p, b); if (!ep) return; p = ep; ep += strlen(b); len = strlen(ep); memmove(p, ep, len); p[len] = 0; } char *game_menu_gen(void) { if (cur_menu == menu_main) { strcpy(menu_buff, MAIN_MENU); if (standalone_sw) { int count = 0, n; menu_strip_tag("", ""); count = themes_count(THEME_GLOBAL); if (curgame_dir && opt_owntheme) { if ((n = themes_count(THEME_GAME)) > 0) count = n; else if (game_own_theme) count = 1; } if (count <= 1) menu_strip_tag("", ""); else menu_remove_tag("", ""); } else { menu_remove_tag("", ""); menu_remove_tag("", ""); } } else if (cur_menu == menu_about || cur_menu == menu_about_instead) { struct game *g; if (cur_menu == menu_about && curgame_dir && (g = game_lookup(curgame_dir))) { char version[32]; char author[64]; char info[192]; char instead[64]; if (g->version) snprintf(version, sizeof(version), "%s", g->version); else strcpy(version, "1.0"); if (g->author) snprintf(author, sizeof(author), "\n%s", g->author); else strcpy(author, ""); if (g->info) snprintf(info, sizeof(info), "\n\n%s", g->info); else strcpy(info, ""); if (!standalone_sw) snprintf(instead, sizeof(instead), "INSTEAD | "); else strcpy(instead, ""); author[sizeof(author) - 1] = 0; version[sizeof(version) - 1] = 0; info[sizeof(info) - 1] = 0; snprintf(menu_buff, sizeof(menu_buff), "%s - %s%s%s\n\n%s%s", g->name, version, author, info, instead, BACK_MENU); } else { snprintf(menu_buff, sizeof(menu_buff), ABOUT_MENU, VERSION); } } else if (cur_menu == menu_settings) { char *just[JUST_MAX] = { FROM_THEME, OFF, ON }; char *kbd [KBD_MAX] = { KBD_MODE_SMART, KBD_MODE_LINKS, KBD_MODE_SCROLL }; int fsize = 100 + (10 * opt_fsize); opt_kbd = (unsigned int)opt_kbd % KBD_MAX; opt_justify = (unsigned int)opt_justify % JUST_MAX; switch (menu_settings_num) { case 0: snprintf(menu_buff, sizeof(menu_buff), SETTINGS_GFX_MENU, opt_get_mode(), opt_fs?ON:OFF, opt_hires?ON:OFF, fsize, just[opt_justify], opt_hl?ON:OFF, opt_fading?ON:OFF, opt_owntheme?ON:OFF); if (standalone_sw) menu_strip_tag("", ""); else menu_remove_tag("", ""); break; case 1: snprintf(menu_buff, sizeof(menu_buff), SETTINGS_SND_MENU, snd_vol_to_pcn(snd_volume_mus(-1)), snd_hz(), opt_music?ON:OFF, opt_click?ON:OFF); break; case 2: snprintf(menu_buff, sizeof(menu_buff), SETTINGS_OTH_MENU, opt_motion?ON:OFF, opt_filter?ON:OFF, kbd[opt_kbd], langs[cur_lang].name, (opt_autosave & 1)?ON:OFF); break; } } else if (cur_menu == menu_askquit) { strcpy(menu_buff, QUIT_MENU); } else if (cur_menu == menu_saved) { strcpy(menu_buff, SAVED_MENU); } else if (cur_menu == menu_games) { games_menu(); } else if (cur_menu == menu_themes) { themes_menu(); } else if (cur_menu == menu_own_theme) { strcpy(menu_buff, OWN_THEME_MENU); } else if (cur_menu == menu_wait) { strcpy(menu_buff, WAIT_MENU); } else if (cur_menu == menu_custom_theme) { strcpy(menu_buff, CUSTOM_THEME_MENU); } else if (cur_menu == menu_load) { load_menu(); } else if (cur_menu == menu_save) { save_menu(); } else if (cur_menu == menu_error) { snprintf(menu_buff, sizeof(menu_buff), ERROR_MENU, instead_err()?instead_err():UNKNOWN_ERROR); instead_err_msg(NULL); } else if (cur_menu == menu_warning) { snprintf(menu_buff, sizeof(menu_buff), WARNING_MENU, instead_err()?instead_err():UNKNOWN_ERROR); instead_err_msg(NULL); } else if (cur_menu == menu_remove) { const char *sname = games[gtr].path; if (strlen(games[gtr].path) >= 48) { sname = games[gtr].name; } snprintf(menu_buff, sizeof(menu_buff), REMOVE_MENU, sname); } return menu_buff; } int game_menu_act(const char *a) { static int old_vol = 0; if (!strcmp(a, "/autosave")) { opt_autosave = !(opt_autosave & 1); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/kbd")) { opt_kbd += 1; if (opt_kbd == KBD_MAX) opt_kbd = 0; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/owntheme")) { opt_owntheme = !opt_owntheme; if (game_own_theme) restart_needed = 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/motion")) { opt_motion ^= 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/filter")) { opt_filter ^= 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/click")) { opt_click ^= 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/mode++")) { if (gfx_next_mode(&opt_mode[0], &opt_mode[1])) opt_mode[0] = opt_mode[1] = -1; restart_needed = 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/mode--")) { if (gfx_prev_mode(&opt_mode[0], &opt_mode[1])) opt_mode[0] = opt_mode[1] = -1; restart_needed = 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/just++")) { restart_needed = 1; opt_justify ++; if (opt_justify >= JUST_MAX) opt_justify = 0; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/just--")) { restart_needed = 1; opt_justify --; if (opt_justify < 0) opt_justify = JUST_MAX - 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/fs--")) { opt_fsize --; if (opt_fsize >= FONT_MIN_SZ) { restart_needed = 1; } else opt_fsize ++; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/fs++")) { opt_fsize ++; if (opt_fsize <= FONT_MAX_SZ) { restart_needed = 1; } else opt_fsize --; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/hl")) { opt_hl ^= 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/fading")) { opt_fading ^= 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/fs")) { #if !defined(ANDROID) && !defined(IOS) restart_needed = 1; opt_fs ^= 1; game_menu_box(1, game_menu_gen()); #endif } else if (!strcmp(a, "/hires")) { opt_hires ^= 1; if (opt_fs) restart_needed = 1; game_menu_box(1, game_menu_gen()); } else if (!strncmp(a, "/games ", 7)) { if (!strcmp(a + 7, "prev")) { games_menu_from -= MENU_GAMES_MAX; if (games_menu_from < 0) games_menu_from = 0; } else if (!strcmp(a + 7, "next")) { if (games_menu_from + MENU_GAMES_MAX < games_nr) games_menu_from += MENU_GAMES_MAX; } else { int nr = atoi(a + 7); games_menu_from = nr * MENU_GAMES_MAX; } game_menu_box(1, game_menu_gen()); } else if (!strncmp(a, "/themes ", 8)) { if (!strcmp(a + 8, "prev")) { themes_menu_page --; if (themes_menu_page < 0) themes_menu_page = 0; } else if (!strcmp(a + 8, "next")) { int count = themes_max(NULL); int pages = 0; if (count > 0) pages = (count - 1) / MENU_THEMES_MAX + 1; if (themes_menu_page + 1 < pages) themes_menu_page ++; } else { int nr = atoi(a + 8); themes_menu_page = nr; } game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/select")) { game_menu(menu_games); } else if (!strcmp(a, "/remove")) { fprintf(stderr,"Removing '%s'\n", games[gtr].path); if (curgame_dir && !strcmp(curgame_dir, games[gtr].dir)) { game_done(0); if (game_init(NULL)) { game_error(); return 0; } } games_remove(gtr); if (games_menu_from >= games_nr) games_menu_from -= MENU_GAMES_MAX; if (games_menu_from < 0) games_menu_from = 0; game_menu(menu_games); } else if (!strcmp(a, "/themes")) { game_menu(menu_themes); } else if (!strcmp(a, "/save_menu")) { if (curgame_dir) game_menu(menu_save); } else if (!strncmp(a, "/save", 5)) { if (!game_save(atoi(a + 5))) { game_menu(menu_saved); } } else if (!strcmp(a, "/load_menu")) { if (curgame_dir) game_menu(menu_load); } else if (!strncmp(a, "/load", 5)) { int nr = atoi(a + 5); if (!curgame_dir) return 0; game_menu_box(0, NULL); if (!game_reset()) { game_load(nr); cur_menu = menu_main; } /* game_menu_box(0, NULL); */ } else if (!strcmp(a, "/new")) { char *s; if (!curgame_dir) return 0; /* remove autlosave */ s = game_save_path(0, 0); if (s && !access(s, R_OK) && (opt_autosave & 1)) unlink (s); game_menu_box(0, NULL); if (!game_reset()) { game_cmd("look", 0); custom_theme_warn(); } } else if (!strcmp(a,"/main")) { if (top_menu != menu_main) { cur_menu = menu_main; game_menu_box(0, NULL); } else game_menu(menu_main); if (restart_needed) { game_restart(); restart_needed = 0; } } else if (!strcmp(a,"/ask_quit")) { game_menu(menu_askquit); } else if (!strncmp(a, "/remove_", 8)) { gtr = atoi(a + 8); game_menu(menu_remove); } else if (!strcmp(a,"/about")) { game_menu(menu_about); } else if (!strcmp(a,"/about-instead")) { game_menu(menu_about_instead); } else if (!strcmp(a,"/mtoggle")) { if (!old_vol) { old_vol = snd_volume_mus(-1); game_change_vol(0, 0); } else { game_change_vol(0, old_vol); old_vol = 0; } game_menu_box(1, game_menu_gen()); } else if (!strcmp(a,"/music")) { opt_music ^= 1; if (!opt_music) { game_stop_mus(0); } else game_music_player(); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a,"/resume")) { cur_menu = menu_main; game_menu_box(0, NULL); } else if (!strcmp(a, "/settings")) { game_menu(menu_settings); } else if (!strcmp(a, "/settings-gfx")) { menu_settings_num = 0; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/settings-snd")) { menu_settings_num = 1; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/settings-oth")) { menu_settings_num = 2; game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/vol--")) { game_change_vol(-10, 0); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/vol++")) { game_change_vol(+10, 0); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/vol-")) { game_change_vol(-1, 0); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/vol+")) { game_change_vol(+1, 0); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/hz-")) { int hz = snd_hz(); if (hz == 44100) hz = 22050; else if (hz == 22050) hz = 11025; else if (hz == 11025) hz = 0; else hz = 22050; game_change_hz(hz); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/hz+")) { int hz = snd_hz(); if (hz == 11025) hz = 22050; else if (hz == 22050) hz = 44100; else if (hz == 44100) hz = 0; else hz = 22050; game_change_hz(hz); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/lang++")) { do { cur_lang ++; if (cur_lang >= langs_nr) cur_lang = 0; } while (menu_lang_select(langs[cur_lang].file)); if (curgame_dir) instead_set_lang(opt_lang); themes_rename(); games_rename(); game_reset_name(); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a, "/lang--")) { do { cur_lang --; if (cur_lang < 0) cur_lang = langs_nr - 1; } while (menu_lang_select(langs[cur_lang].file)); if (curgame_dir) instead_set_lang(opt_lang); themes_rename(); games_rename(); game_reset_name(); game_menu_box(1, game_menu_gen()); } else if (!strcmp(a,"/quit")) { return -1; #ifdef _USE_BROWSE } else if (!strcmp(a,"/browse")) { game_from_disk(); return 0; #endif } else if (cur_menu == menu_games) { char *p; p = strdup(a); if (p) { game_done(0); if (game_init(p)) { game_error(); } free(p); } } else if (cur_menu == menu_themes) { char *p; p = strdup(a); if (p) { if (game_theme_select(p)) fprintf(stderr, "Can't select theme:%s:%s\n", p, strerror(errno)); char *og = curgame_dir; game_save(-1); game_done(0); if (game_init(og)) { game_error(); } else if (curgame_dir && game_own_theme && opt_owntheme && !curtheme_dir[THEME_GAME]) { game_menu(menu_own_theme); } free(p); } } return 0; } void custom_theme_warn(void) { if (game_own_theme && !opt_owntheme && cur_menu != menu_warning) { game_menu(menu_custom_theme); } } struct lang *langs = NULL; int langs_nr = 0; static void lang_free(void) { FREE(UNKNOWN_ERROR); FREE(ERROR_MENU); FREE(WARNING_MENU); FREE(SAVE_SLOT_EMPTY); FREE(SELECT_LOAD_MENU); FREE(AUTOSAVE_SLOT); FREE(BROKEN_SLOT); FREE(SELECT_SAVE_MENU); FREE(MAIN_MENU); FREE(ABOUT_MENU); FREE(BACK_MENU); FREE(SETTINGS_SND_MENU); FREE(SETTINGS_GFX_MENU); FREE(SETTINGS_OTH_MENU); FREE(CUSTOM_THEME_MENU); FREE(OWN_THEME_MENU); FREE(WAIT_MENU); FREE(SELECT_GAME_MENU); FREE(SELECT_THEME_MENU); FREE(SAVED_MENU); FREE(NOGAMES_MENU); FREE(NOTHEMES_MENU); FREE(QUIT_MENU); FREE(REMOVE_MENU); FREE(ON); FREE(OFF); FREE(KBD_MODE_LINKS); FREE(KBD_MODE_SMART); FREE(KBD_MODE_SCROLL); FREE(CANCEL_MENU); FREE(FROM_THEME); FREE(DISABLED_SAVE_MENU); FREE(BROWSE_MENU); } static int lang_ok(void) { if (UNKNOWN_ERROR && ERROR_MENU && WARNING_MENU && SAVE_SLOT_EMPTY && SELECT_LOAD_MENU && AUTOSAVE_SLOT && BROKEN_SLOT && SELECT_SAVE_MENU && MAIN_MENU && ABOUT_MENU && BACK_MENU && SETTINGS_SND_MENU && SETTINGS_GFX_MENU && SETTINGS_OTH_MENU && CUSTOM_THEME_MENU && OWN_THEME_MENU && SELECT_GAME_MENU && SELECT_THEME_MENU && WAIT_MENU && SAVED_MENU && NOGAMES_MENU && NOTHEMES_MENU && QUIT_MENU && REMOVE_MENU && ON && OFF && KBD_MODE_LINKS && KBD_MODE_SMART && KBD_MODE_SCROLL && CANCEL_MENU && FROM_THEME && DISABLED_SAVE_MENU && BROWSE_MENU) return 0; return -1; } struct parser lang_parser[] = { { "UNKNOWN_ERROR", parse_esc_string, &UNKNOWN_ERROR, 0 }, { "ERROR_MENU", parse_esc_string, &ERROR_MENU, 0 }, { "WARNING_MENU", parse_esc_string, &WARNING_MENU, 0 }, { "SAVE_SLOT_EMPTY", parse_esc_string, &SAVE_SLOT_EMPTY, 0 }, { "SELECT_LOAD_MENU", parse_esc_string, &SELECT_LOAD_MENU, 0 }, { "AUTOSAVE_SLOT", parse_esc_string, &AUTOSAVE_SLOT, 0 }, { "BROKEN_SLOT", parse_esc_string, &BROKEN_SLOT, 0 }, { "SELECT_SAVE_MENU", parse_esc_string, &SELECT_SAVE_MENU, 0 }, { "MAIN_MENU", parse_esc_string, &MAIN_MENU, 0 }, { "ABOUT_MENU", parse_esc_string, &ABOUT_MENU, 0 }, { "BACK_MENU", parse_esc_string, &BACK_MENU, 0 }, { "SETTINGS_GFX_MENU", parse_esc_string, &SETTINGS_GFX_MENU, 0 }, { "SETTINGS_SND_MENU", parse_esc_string, &SETTINGS_SND_MENU, 0 }, { "SETTINGS_OTH_MENU", parse_esc_string, &SETTINGS_OTH_MENU, 0 }, { "CUSTOM_THEME_MENU", parse_esc_string, &CUSTOM_THEME_MENU, 0 }, { "OWN_THEME_MENU", parse_esc_string, &OWN_THEME_MENU, 0 }, { "WAIT_MENU", parse_esc_string, &WAIT_MENU, 0 }, { "SELECT_GAME_MENU", parse_esc_string, &SELECT_GAME_MENU, 0 }, { "SELECT_THEME_MENU", parse_esc_string, &SELECT_THEME_MENU, 0 }, { "SAVED_MENU", parse_esc_string, &SAVED_MENU, 0 }, { "NOGAMES_MENU", parse_esc_string, &NOGAMES_MENU, 0 }, { "NOTHEMES_MENU", parse_esc_string, &NOTHEMES_MENU, 0 }, { "QUIT_MENU", parse_esc_string, &QUIT_MENU, 0 }, { "REMOVE_MENU", parse_esc_string, &REMOVE_MENU, 0 }, { "ON", parse_esc_string, &ON, 0 }, { "OFF", parse_esc_string, &OFF, 0 }, { "KBD_MODE_LINKS", parse_esc_string, &KBD_MODE_LINKS, 0 }, { "KBD_MODE_SMART", parse_esc_string, &KBD_MODE_SMART, 0 }, { "KBD_MODE_SCROLL", parse_esc_string, &KBD_MODE_SCROLL, 0 }, { "CANCEL_MENU", parse_esc_string, &CANCEL_MENU, 0 }, { "FROM_THEME", parse_esc_string, &FROM_THEME, 0 }, { "DISABLED_SAVE_MENU", parse_esc_string, &DISABLED_SAVE_MENU, 0 }, { "BROWSE_MENU", parse_esc_string, &BROWSE_MENU, 0 }, { NULL, NULL, NULL, 0 }, }; static int lang_parse(const char *path) { return parse_ini(path, lang_parser); } static int is_lang(const char *path, const char *n) { char *p = getfilepath(path, n); if (!p) return 0; if (access(p, F_OK)) return 0; free(p); if (!(p = strstr(n, ".ini")) && !(p = strstr(n, ".INI"))) return 0; return 1; } static char *lang_code(const char *str) { char *p = strdup(str); if (!p) return NULL; p[strcspn(p, ".")] = 0; tolow(p); return p; } static char *lang_name(const char *path, const char *file) { char *l; l = lookup_tag(path, "Name", ";"); if (l) return l; return lang_code(file); } static int cmp_lang(const void *p1, const void *p2) { const struct lang *l1 = (const struct lang*)p1; const struct lang *l2 = (const struct lang*)p2; return strcmp(l1->name, l2->name); } static void langs_sort() { qsort(langs, langs_nr, sizeof(struct lang), cmp_lang); } int menu_langs_lookup(const char *path) { char *p; int n = 0, i = 0; DIR *d; struct dirent *de; struct lang *new_langs; if (!path) return 0; d = opendir(path); if (!d) return -1; while ((de = readdir(d))) { if (!is_lang(path, de->d_name)) continue; n ++; } if (!n) goto out; closedir(d); d = opendir(path); if (!d) return -1; new_langs = realloc(langs, sizeof(struct lang) * (n + langs_nr)); if (!new_langs) { closedir(d); return -1; } langs = new_langs; while ((de = readdir(d)) && i < n) { if (!is_lang(path, de->d_name)) continue; p = getfilepath(path, de->d_name); langs[langs_nr].path = p; langs[langs_nr].file = lang_code(de->d_name); langs[langs_nr].name = lang_name(p, de->d_name); langs_nr ++; i ++; } out: langs_sort(); closedir(d); return 0; } int menu_lang_select(const char *name) { int i; char cwd[PATH_MAX]; if (!name) return -1; getdir(cwd, sizeof(cwd)); setdir(game_cwd); for (i = 0; i * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" #ifdef SAILFISHOS #include #include #endif #include #include #ifdef S60 int audio_rate = 11025; #else int audio_rate = 22050; #endif Uint16 audio_format = MIX_DEFAULT_FORMAT; int audio_channels = 2; int audio_buffers = 8192; static mus_t mus; static char *next_mus = NULL; static int next_fadein = 0; static int next_loop = -1; static SDL_TimerID timer_id = NULL_TIMER; static int sound_on = 0; struct _mus_t { Mix_Music *mus; SDL_RWops *rw; }; int snd_enabled(void) { return sound_on; } static void mus_callback(void *aux) { if (!timer_id) return; if (snd_playing_mus()) return; if (mus) snd_free_mus(mus); mus = NULL; if (next_mus) { if (snd_play_mus(next_mus, next_fadein, next_loop) < 0) game_res_err_msg(next_mus, debug_sw); free(next_mus); next_mus = NULL; } SDL_RemoveTimer(timer_id); timer_id = NULL_TIMER; } static Uint32 callback(Uint32 interval, void *aux) { push_user_event(mus_callback, aux); #ifdef __EMSCRIPTEN__ if (timer_id) { SDL_RemoveTimer(timer_id); timer_id = SDL_AddTimer(interval, callback, NULL); } #endif return interval; } int snd_hz(void) { int freq = 0; if (sound_on) Mix_QuerySpec(&freq, NULL, NULL); return freq; } int nosound_sw = 0; void snd_pause(int on) { if (!sound_on) return; if (on) { Mix_Pause(-1); Mix_PauseMusic(); } else { Mix_Resume(-1); Mix_ResumeMusic(); } return; } static int _snd_open(int hz) { int chunk; if (!hz) hz = audio_rate; else audio_rate = hz; chunk = (chunksize_sw>0)?chunksize_sw:DEFAULT_CHUNKSIZE; audio_buffers = (audio_rate / 11025) * chunk; if (audio_buffers <= 0) /* wrong parameter? */ audio_buffers = DEFAULT_CHUNKSIZE; #ifdef __EMSCRIPTEN__ if (Mix_OpenAudioDevice(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 4096, NULL, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE)) { #else if (Mix_OpenAudio(hz, audio_format, audio_channels, audio_buffers)) { #endif fprintf(stderr, "Unable to open audio!\n"); return -1; } sound_on = 1; Mix_ChannelFinished(game_channel_finished); return 0; } #ifdef SAILFISHOS static audioresource_t *audio_resource = NULL; static void on_audio_resource_acquired(audioresource_t *ar, bool acquired, void *phz) { if (acquired && !sound_on) _snd_open(*(int *)phz); } int snd_open(int hz) { if (nosound_sw) return -1; if (sound_on) snd_close(); /* reopen */ if (!audio_resource) { audio_resource = audioresource_init(AUDIO_RESOURCE_GAME, on_audio_resource_acquired, &hz); if (!audio_resource) return -1; audioresource_acquire(audio_resource); } while (!sound_on) { fprintf(stderr, "Waiting for audio resource to be acquired...\n"); g_main_context_iteration(NULL, true); } return 0; } #else int snd_open(int hz) { if (nosound_sw) return -1; if (sound_on) snd_close(); /* reopen */ return _snd_open(hz); } #endif int snd_init(int hz) { if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { fprintf(stderr, "Unable to init audio!\n"); return -1; } return snd_open(hz); } int snd_volume_mus(int vol) { if (!sound_on) return 0; Mix_Volume(-1, vol); return Mix_VolumeMusic(vol); } #if SDL_BYTEORDER == SDL_LIL_ENDIAN #define SND_DEFAULT_FORMAT AUDIO_S16LSB #else #define SND_DEFAULT_FORMAT AUDIO_S16MSB #endif #define MIXER_VERSION_ATLEAST(a,b,c) (SDL_VERSIONNUM(SDL_MIXER_MAJOR_VERSION, SDL_MIXER_MINOR_VERSION,SDL_MIXER_PATCHLEVEL) >= SDL_VERSIONNUM(a, b, c)) wav_t snd_load_mem(int fmt, const short *data, size_t len) { int freq = 22050, ffreq; SDL_AudioCVT wavecvt; Mix_Chunk *chunk; size_t size = len * sizeof(short); freq = snd_hz(); if (fmt & SND_FMT_11) ffreq = 11025; else if (fmt & SND_FMT_22) ffreq = 22050; else ffreq = 44100; if (audio_format != SND_DEFAULT_FORMAT || audio_channels != ((fmt & SND_FMT_STEREO) ? 2:1) || ffreq != freq) { if (SDL_BuildAudioCVT(&wavecvt, SND_DEFAULT_FORMAT, (fmt & SND_FMT_STEREO) ? 2:1, ffreq, audio_format, audio_channels, freq) < 0) return NULL; wavecvt.len = size; wavecvt.buf = (Uint8 *)SDL_calloc(1, wavecvt.len * wavecvt.len_mult); if (!wavecvt.buf) return NULL; SDL_memcpy(wavecvt.buf, data, size); if (SDL_ConvertAudio(&wavecvt) < 0) { SDL_free(wavecvt.buf); return NULL; } chunk = Mix_QuickLoad_RAW(wavecvt.buf, wavecvt.len_cvt); } else { Uint8 *b = (Uint8 *)SDL_calloc(1, size); if (!b) return NULL; SDL_memcpy(b, data, size); chunk = Mix_QuickLoad_RAW(b, size); } if (!chunk) return NULL; chunk->allocated = 1; return (wav_t)chunk; } wav_t snd_load_wav(const char *fname) { SDL_RWops *rw; wav_t r; if (!sound_on) return NULL; if (!fname || !*fname) return NULL; rw = RWFromIdf(instead_idf(), fname); if (!rw || !(r = (wav_t)Mix_LoadWAV_RW(rw, 1))) { return NULL; } return r; } void snd_free_wav(wav_t w) { if (!w) return; /* Mix_HaltChannel(-1); */ Mix_FreeChunk((Mix_Chunk*)w); } static int mix_fn = 0; void snd_halt_chan(int han, int ms) { if (han >= MIX_CHANNELS) han %= MIX_CHANNELS; if (han == -1 && mix_fn) /* forever wait */ return; if (ms) Mix_FadeOutChannel(han, ms); else { Mix_HaltChannel(han); } } mus_t snd_load_mus(const char *fname) { mus_t mus = NULL; if (!sound_on) return NULL; mus = malloc(sizeof(struct _mus_t)); if (!mus) return NULL; mus->rw = RWFromIdf(instead_idf(), fname); if (!mus->rw) goto err; #if MIXER_VERSION_ATLEAST(2,0,0) mus->mus = Mix_LoadMUS_RW(mus->rw, SDL_FALSE); #else mus->mus = Mix_LoadMUS_RW(mus->rw); #endif if (!mus->mus) goto err1; return mus; err1: SDL_RWclose(mus->rw); err: free(mus); return NULL; } extern void game_music_finished(void); int snd_play_mus(char *fname, int ms, int loop) { if (!sound_on) return 0; if (snd_playing_mus()) { if (next_mus) { free(next_mus); } next_mus = strdup(fname); next_fadein = ms; next_loop = loop; if (!timer_id) timer_id = SDL_AddTimer(200, callback, NULL); return 1; } if (mus) snd_free_mus(mus); mus = snd_load_mus(fname); if (!mus) return -1; if (loop >= 0) Mix_HookMusicFinished(game_music_finished); else Mix_HookMusicFinished(NULL); if (ms) Mix_FadeInMusic(mus->mus, loop, ms); else Mix_PlayMusic(mus->mus, loop); snd_volume_mus(snd_volume_mus(-1)); /* SDL hack? */ return 0; } void snd_stop_mus(int ms) { if (!sound_on) return; if (mix_fn) return; Mix_HookMusicFinished(NULL); if (ms) Mix_FadeOutMusic(ms); else Mix_HaltMusic(); } int snd_playing_mus(void) { if (!sound_on) return 0; if (Mix_PlayingMusic() | Mix_FadingMusic()) return 1; return 0; } int snd_playing(int channel) { if (!sound_on) return 0; if (channel >= MIX_CHANNELS) channel %= MIX_CHANNELS; if (channel < 0) channel = -1; return Mix_Playing(channel); } int snd_panning(int channel, int left, int right) { if (channel >= MIX_CHANNELS) channel %= MIX_CHANNELS; if (channel < 0) channel = -1; return Mix_SetPanning(channel, left, right); } void snd_free_mus(mus_t mus) { int to_close = 0; if (!sound_on) return; if (!mus) return; Mix_HaltMusic(); if (mus->mus) { #ifdef _SDL_MOD_BUG if ((Mix_GetMusicType(mus->mus) == MUS_MOD) && !MIXER_VERSION_ATLEAST(1, 2, 12)) SDL_RWclose(mus->rw); #endif if (MIXER_VERSION_ATLEAST(1, 2, 12) && Mix_GetMusicType(mus->mus) != MUS_MP3) { to_close = 1; } Mix_FreeMusic((Mix_Music*) mus->mus); if (to_close) SDL_RWclose(mus->rw); } free(mus); } int snd_play(void *chunk, int channel, int loop) { if (!sound_on) return -1; if (!chunk) return -1; if (channel >= MIX_CHANNELS) channel %= MIX_CHANNELS; if (channel < 0) channel = -1; if (channel != -1) snd_halt_chan(channel, 0); snd_volume_mus(snd_volume_mus(-1)); /* SDL hack? */ return Mix_PlayChannel(channel, (Mix_Chunk*)chunk, loop); } void snd_mus_callback(void (*fn)(void *udata, unsigned char *stream, int len), void *arg) { mix_fn = !!fn; Mix_HookMusic(fn, arg); } void snd_close(void) { if (!sound_on) return; Mix_HookMusic(NULL, NULL); Mix_ChannelFinished(NULL); if (timer_id) { SDL_RemoveTimer(timer_id); timer_id = NULL_TIMER; } Mix_HaltChannel(-1); Mix_HookMusicFinished(NULL); Mix_HaltMusic(); if (mus) snd_free_mus(mus); mus = NULL; if (next_mus) free(next_mus); next_mus = NULL; #ifndef __EMSCRIPTEN__ Mix_CloseAudio(); #endif sound_on = 0; #ifdef SAILFISHOS audioresource_release(audio_resource); audioresource_free(audio_resource); audio_resource = NULL; #endif } void snd_done(void) { if (sound_on) snd_close(); SDL_QuitSubSystem(SDL_INIT_AUDIO); } int snd_vol_from_pcn(int v) { return (v * 127) / 100; } int snd_vol_to_pcn(int v) { return (v * 100) / 127; } instead-3.2.1/src/macosx.m0000644000175000017500000001102113267071774014434 0ustar peterpeter#include #include #include #include #include #include #include #include #include #include #include #include #include "externals.h" #include "internals.h" static char save_path[PATH_MAX]; static char cfg_path[PATH_MAX]; static char local_games_path[PATH_MAX]; static char local_themes_path[PATH_MAX]; static char local_stead_path[PATH_MAX]; char *game_locale(void) { char *p; char *s; p = getenv("LANG"); if (!p || !(s = strdup(p))) return NULL; if ((p = strchr(s, '_'))) *p = 0; return s; } char *game_tmp_path(void) { static time_t t = 0; static char tmp[PATH_MAX]="/tmp/instead-games"; if (!t) { t = time(NULL); sprintf(tmp, "/tmp/instead-games-%ld", (unsigned long)t); } if (mkdir(tmp, S_IRWXU) && errno != EEXIST) return NULL; return tmp; } char *appdir(void) { static char dir[PATH_MAX]; struct passwd *pw; #ifdef _LOCAL_APPDATA strcpy(dir, game_cwd); strcat(dir, "/appdata"); if (!access(dir, W_OK)) return dir; #endif pw = getpwuid(getuid()); if (!pw) return NULL; snprintf(dir, sizeof(dir) - 1 , "%s/.instead", pw->pw_dir); return dir; } char *game_local_games_path(int cr) { char *app = appdir(); if (!app) return NULL; strcpy(local_games_path, app); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } strcat(local_games_path,"/games"); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } return local_games_path; } char *game_local_themes_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_themes_path, sizeof(local_themes_path) - 1 , "%s/themes", app); return local_themes_path; } char *game_local_stead_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_stead_path, sizeof(local_stead_path) - 1 , "%s/stead", app); return local_stead_path; } char *game_cfg_path(void) { char *app = appdir(); struct passwd *pw; pw = getpwuid(getuid()); if (!pw) return NULL; snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/.insteadrc", pw->pw_dir); /* at home */ if (!access(cfg_path, R_OK)) return cfg_path; /* no at home? Try in dir */ if (app) snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/", app); if (!app || (mkdir(cfg_path, S_IRWXU) && errno != EEXIST)) snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/.insteadrc", pw->pw_dir); /* fallback to home */ else snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/insteadrc", app); return cfg_path; } char *game_save_path(int cr, int nr) { char *app = appdir(); if (!curgame_dir) return NULL; if (!access("saves", R_OK)) { if (nr) snprintf(save_path, sizeof(save_path) - 1, "saves/save%d", nr); else snprintf(save_path, sizeof(save_path) - 1, "saves/autosave"); return save_path; } if (!app) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/saves", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/", app, curgame_dir); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; if (nr) snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/save%d", app, curgame_dir, nr); else snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/autosave", app, curgame_dir); return save_path; } int debug_init(void) { return 0; } void debug_done() { } char *sdl_path(char *p) { unix_path(p); return p; } char *open_file_dialog(void) { const char *filename; static char *file_name[PATH_MAX]; NSArray* fileTypes = [NSArray arrayWithObjects: @"zip", @"lua", @"idf", nil]; NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setAllowsMultipleSelection:NO]; if ([panel runModalForTypes:fileTypes] == NSOKButton) { #ifdef __POWERPC__ filename = [[panel filename] cString]; #else filename = [[panel filename] cStringUsingEncoding:NSUTF8StringEncoding]; #endif strcpy(file_name, filename); return file_name; } return NULL; } #if 0 int setdir(const char *path) { return chdir(path); } char *getdir(char *path, size_t size) { return getcwd(path, size); } char *dirpath(const char *path) { return (char*)path; } int is_absolute_path(const char *path) { if (!path || !*path) return 0; return (*path == '/'); } #endif instead-3.2.1/src/game.h0000644000175000017500000001153113267071774014054 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __GAME_H__ #define __GAME_H__ #include #include "utils.h" #define SND_CHANNELS MIX_CHANNELS #ifndef GAMES_PATH #define GAMES_PATH "./games" #endif #define HZ 100 extern int game_grab_events; extern int game_wait_use; extern int game_running; extern int game_theme_changed; extern int nosound_sw; extern int debug_sw; extern int fullscreen_sw; extern int hires_sw; extern int window_sw; extern int nopause_sw; extern int nocursor_sw; extern int game_own_theme; /* current game has own theme */ extern char *games_sw; extern char game_cwd[PATH_MAX]; /* current game cwd */ extern char *curgame_dir; extern int vsync_sw; extern int resizable_sw; extern int scale_sw; extern int standalone_sw; extern char *render_sw; extern char *appdir(void); extern void game_clear(int x, int y, int w, int h); extern void game_clear_all(void); extern void game_redraw_all(void); extern char *game_local_games_path(int cr); extern char *game_local_themes_path(void); extern char *game_tmp_path(void); extern int game_theme_select(const char *name); extern int game_init(const char *game); extern void game_flip(void); extern int game_loop(void); extern void game_done(int err); extern char *game_reset_name(void); extern int game_load_theme(const char *path); extern int game_apply_theme(void); extern int game_use_theme(void); extern void game_release_theme(int force); extern int game_reset(void); extern int game_cfg_save(void); extern void game_music_player(void); extern void game_stop_mus(int ms); extern int game_change_vol(int d, int val); extern int game_change_hz(int hz); extern int games_lookup(const char *path); extern struct game *game_lookup(const char *name); extern int is_game(const char *games, const char *name); extern int games_remove(int nr); extern int games_replace(const char *path, const char *dir); extern int games_rename(void); extern void game_res_err_msg(const char *s, int alert); extern int game_error(void); extern int game_restart(void); extern int game_select(const char *name); extern void game_gfx_clip(void); extern void game_gfx_noclip(void); #define GAME_CMD_CLICK 1 #define GAME_CMD_FILE 2 #define GAME_CMD_NOHL 4 extern int game_cmd(char *cmd, int flags); extern void game_menu(int nr); /* select and show menu */ extern int game_menu_box(int show, const char *txt); /* show menu */ extern int game_menu_box_wh(const char *txt, int *w, int *h); extern int game_menu_box_width(int show, const char *txt, int width); extern void mouse_reset(int hl); extern int mouse_restore(void); extern int game_load(int nr); extern int game_save(int nr); extern int game_saves_enabled(void); extern char *game_cfg_path(void); extern char *game_save_path(int rc, int nr); extern char *game_locale(void); extern int game_freezed(void); extern int game_paused(void); extern char *open_file_dialog(void); extern int game_from_disk(void); extern int game_pict_modify(img_t p); extern int game_bg_modify(img_t p); extern int game_pict_coord(int *x, int *y, int *w, int *h); extern void menu_toggle(int menu); extern int menu_visible(void); extern void game_channel_finished(int channel); extern void sound_play_click(void); extern void *sound_get(const char *fname); extern void sound_put(void *sn); extern int game_tag_valid(const char *p); void game_gfx_commit(int sync); #define CURSOR_CLEAR -1 #define CURSOR_OFF 0 #define CURSOR_ON 1 #define CURSOR_DRAW 2 extern void game_cursor(int on); /* must be called with -1 before gfx change and 1 after, 2 - not update */ extern int game_cursor_show; struct game { char *path; char *name; char *author; char *version; char *info; char *dir; /* char *api; */ int idf; }; extern struct game *games; extern int games_nr; extern unsigned long timer_counter; #endif instead-3.2.1/src/unpack.c0000644000175000017500000002164313267071774014424 0ustar peterpeter#ifdef _USE_UNPACK /* miniunz.c Version 1.1, February 14h, 2010 sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) Modifications of Unzip for Zip64 Copyright (C) 2007-2008 Even Rouault Modifications for Zip64 support on both zip and unzip Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) */ #ifndef _WIN32 #ifndef __USE_FILE_OFFSET64 #define __USE_FILE_OFFSET64 #endif #ifndef __USE_LARGEFILE64 #define __USE_LARGEFILE64 #endif #ifndef _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE #endif #ifndef _FILE_OFFSET_BIT #define _FILE_OFFSET_BIT 64 #endif #endif #include "externals.h" #ifdef unix # include #ifndef S60 # include #endif #else # include # include #endif #include "unzip.h" #include "utils.h" #define CASESENSITIVITY (0) #define WRITEBUFFERSIZE (8192) #define MAXFILENAME (256) #ifdef _WIN32 #define USEWIN32IOAPI #include "iowin32.h" #endif char zip_game_dirname[PATH_MAX]; /* change_file_date : change the date/time of a file filename : the filename of the file where date/time must be modified dosdate : the new date at the MSDos format (4 bytes) tmu_date : the SAME new date at the tm_unz format */ static void change_file_date(filename, dosdate, tmu_date) const char *filename; uLong dosdate; tm_unz tmu_date; { #ifdef _WIN32 HANDLE hFile; FILETIME ftm, ftLocal, ftCreate, ftLastAcc, ftLastWrite; hFile = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); GetFileTime(hFile, &ftCreate, &ftLastAcc, &ftLastWrite); DosDateTimeToFileTime((WORD) (dosdate >> 16), (WORD) dosdate, &ftLocal); LocalFileTimeToFileTime(&ftLocal, &ftm); SetFileTime(hFile, &ftm, &ftLastAcc, &ftm); CloseHandle(hFile); #else #ifdef unix #ifndef S60 struct utimbuf ut; struct tm newdate; newdate.tm_sec = tmu_date.tm_sec; newdate.tm_min = tmu_date.tm_min; newdate.tm_hour = tmu_date.tm_hour; newdate.tm_mday = tmu_date.tm_mday; newdate.tm_mon = tmu_date.tm_mon; if (tmu_date.tm_year > 1900) newdate.tm_year = tmu_date.tm_year - 1900; else newdate.tm_year = tmu_date.tm_year; newdate.tm_isdst = -1; ut.actime = ut.modtime = mktime(&newdate); utime(filename, &ut); #endif #endif #endif } /* mymkdir and change_file_date are not 100 % portable As I don't know well Unix, I wait feedback for the unix portion */ static int mymkdir(dirname) const char *dirname; { int ret = 0; #ifdef _WIN32 ret = _mkdir(dirname); #else #ifdef unix ret = mkdir(dirname, 0775); #endif #endif return ret; } static int makedir(newdir) const char *newdir; { char *buffer; char *p; int len = (int)strlen(newdir); if (len <= 0) return 0; buffer = (char *)malloc(len + 1); if (buffer == NULL) { fprintf(stderr, "Error allocating memory\n"); return UNZ_INTERNALERROR; } strcpy(buffer, newdir); if (buffer[len - 1] == '/') { buffer[len - 1] = '\0'; } if (mymkdir(buffer) == 0) { free(buffer); return 1; } p = buffer + 1; while (1) { char hold; while (*p && *p != '\\' && *p != '/') p++; hold = *p; *p = 0; if ((mymkdir(buffer) == -1) && (errno == ENOENT)) { fprintf(stderr, "couldn't create directory %s\n", buffer); free(buffer); return 0; } if (hold == 0) break; *p++ = hold; } free(buffer); return 1; } static int do_extract_currentfile(uf, password) unzFile uf; const char *password; { char filename_inzip[256]; char dir_inzip[256]; char *filename_withoutpath; char *p; int err = UNZ_OK; FILE *fout = NULL; void *buf; uInt size_buf; unz_file_info64 file_info; err = unzGetCurrentFileInfo64(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0); if (err != UNZ_OK) { fprintf(stderr, "error %d with zipfile in unzGetCurrentFileInfo\n", err); return err; } size_buf = WRITEBUFFERSIZE; buf = (void *)malloc(size_buf); if (buf == NULL) { fprintf(stderr, "Error allocating memory\n"); return UNZ_INTERNALERROR; } p = filename_withoutpath = filename_inzip; strcpy(dir_inzip, filename_inzip); while ((*p) != '\0') { if (((*p) == '/') || ((*p) == '\\')) filename_withoutpath = p + 1; p++; } p = dir_inzip + strcspn(dir_inzip, "/\\"); *p = 0; if ((*filename_withoutpath) == '\0') { if (zip_game_dirname[0] && strncmp(zip_game_dirname, filename_inzip, strlen(zip_game_dirname))) { err = -1; fprintf(stderr, "Too many dirs in zip...\n"); goto out; } fprintf(stderr, "creating directory: %s\n", filename_inzip); mymkdir(filename_inzip); if (!*zip_game_dirname) strcpy(zip_game_dirname, dir_inzip); } else { const char *write_filename; int skip = 0; write_filename = filename_inzip; err = unzOpenCurrentFilePassword(uf, password); if (err != UNZ_OK) { fprintf (stderr, "error %d with zipfile in unzOpenCurrentFilePassword\n", err); goto out; } if (skip == 0) { fout = fopen64(write_filename, "wb"); /* some zipfile don't contain directory alone before file */ if ((fout == NULL) && (filename_withoutpath != (char *)filename_inzip)) { char c = *(filename_withoutpath - 1); *(filename_withoutpath - 1) = '\0'; makedir(write_filename); *(filename_withoutpath - 1) = c; fout = fopen64(write_filename, "wb"); } if (fout == NULL) { fprintf(stderr, "error opening %s\n", write_filename); } } if ((filename_withoutpath != (char *)filename_inzip) && !*zip_game_dirname) { strcpy(zip_game_dirname, dir_inzip); } if (fout != NULL) { fprintf(stderr, " extracting: %s\n", write_filename); do { err = unzReadCurrentFile(uf, buf, size_buf); if (err < 0) { fprintf (stderr, "error %d with zipfile in unzReadCurrentFile\n", err); break; } if (err > 0) if (fwrite(buf, err, 1, fout) != 1) { fprintf (stderr, "error in writing extracted file\n"); err = UNZ_ERRNO; break; } } while (err > 0); if (fout) fclose(fout); if (err == 0) change_file_date(write_filename, file_info.dosDate, file_info.tmu_date); } if (err == UNZ_OK) { err = unzCloseCurrentFile(uf); if (err != UNZ_OK) { fprintf (stderr, "error %d with zipfile in unzCloseCurrentFile\n", err); } } else unzCloseCurrentFile(uf); /* don't lose the error */ if (!*zip_game_dirname) { err = -1; fprintf(stderr, "No dir in zip...\n"); if (idf_magic(write_filename)) { fprintf(stderr, "Idf unpacked: %s\n", write_filename); strcpy(zip_game_dirname, write_filename); err = 0; } else unlink(write_filename); goto out; } } if (*zip_game_dirname) { size_t s = strlen(zip_game_dirname); unix_path(zip_game_dirname); if (s && (zip_game_dirname[s - 1] == '/')) s --; zip_game_dirname[s] = 0; } out: free(buf); return err; } static int do_extract(uf, password) unzFile uf; const char *password; { uLong i; unz_global_info64 gi; int err; err = unzGetGlobalInfo64(uf, &gi); if (err != UNZ_OK) fprintf(stderr, "error %d with zipfile in unzGetGlobalInfo \n", err); for (i = 0; i < gi.number_entry; i++) { if (do_extract_currentfile(uf, password) != UNZ_OK) return -1; if ((i + 1) < gi.number_entry) { err = unzGoToNextFile(uf); if (err != UNZ_OK) { fprintf (stderr, "error %d with zipfile in unzGoToNextFile\n", err); return -1; } } } return 0; } int unpack(const char *zipfilename, const char *dirname) { char game_cwd[PATH_MAX]; char filename_try[MAXFILENAME + 16] = ""; int ret_value = 0; if (dirname && !getcwd(game_cwd, sizeof(game_cwd))) { fprintf(stderr, "Error: can not get current dir.\n"); return -1; } unzFile uf = NULL; zip_game_dirname[0] = 0; # ifdef USEWIN32IOAPI zlib_filefunc64_def ffunc; # endif strncpy(filename_try, zipfilename, MAXFILENAME - 1); /* strncpy doesnt append the trailing NULL, of the string is too long. */ filename_try[MAXFILENAME] = '\0'; # ifdef USEWIN32IOAPI fill_win32_filefunc64A(&ffunc); uf = unzOpen2_64(zipfilename, &ffunc); # else uf = unzOpen64(zipfilename); # endif if (uf == NULL) { strcat(filename_try, ".zip"); # ifdef USEWIN32IOAPI uf = unzOpen2_64(filename_try, &ffunc); # else uf = unzOpen64(filename_try); # endif } if (uf == NULL) { fprintf(stderr, "Cannot open %s or %s.zip\n", zipfilename, zipfilename); return -1; } fprintf(stderr, "%s opened\n", filename_try); #ifdef _WIN32 if (dirname && _chdir(dirname)) #else if (dirname && chdir(dirname)) #endif { ret_value = -1; fprintf(stderr, "Error changing dir to %s, aborting\n", dirname); goto out; } ret_value = do_extract(uf, NULL); out: unzClose(uf); #ifdef _WIN32 if (dirname) _chdir(game_cwd); #else if (dirname) { if (chdir(game_cwd)) fprintf(stderr, "Warning: can not chdir.\n"); } #endif return ret_value; } #endif instead-3.2.1/src/unzip.c0000644000175000017500000021300613267071774014304 0ustar peterpeter#ifdef _USE_UNPACK /* unzip.c -- IO for uncompress .zip files using zlib Version 1.1, February 14h, 2010 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) Modifications of Unzip for Zip64 Copyright (C) 2007-2008 Even Rouault Modifications for Zip64 support on both zip and unzip Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) For more info read MiniZip_info.txt ------------------------------------------------------------------------------------ Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of compatibility with older software. The following is from the original crypt.c. Code woven in by Terry Thorsen 1/2003. Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). ------------------------------------------------------------------------------------ Changes in unzip.c 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* 2007-2008 - Even Rouault - Remove old C style function prototypes 2007-2008 - Even Rouault - Add unzip support for ZIP64 Copyright (C) 2007-2008 Even Rouault Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G should only read the compressed/uncompressed size from the Zip64 format if the size from normal header was 0xFFFFFFFF Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) Patch created by Daniel Borca Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson */ #include #include #include #ifndef NOUNCRYPT #define NOUNCRYPT #endif #include "zlib.h" #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef CASESENSITIVITYDEFAULT_NO # if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) # define CASESENSITIVITYDEFAULT_NO # endif #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info64_internal_s { ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ } unz_file_info64_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ #ifdef HAVE_BZIP2 bz_stream bstream; /* bzLib stream structure for bziped */ #endif ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ ZPOS64_T total_out_64; uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ zlib_filefunc64_32_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ int raw; } file_in_zip64_read_info_s; /* unz64_s contain internal information about the zipfile */ typedef struct { zlib_filefunc64_32_def z_filefunc; int is64bitOpenFunction; voidpf filestream; /* io structore of the zipfile */ unz_global_info64 gi; /* public global information */ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ ZPOS64_T num_file; /* number of the current file in the zipfile*/ ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ ZPOS64_T central_pos; /* position of the beginning of the central dir*/ ZPOS64_T size_central_dir; /* size of the central directory */ ZPOS64_T offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info64 cur_file_info; /* public info about the current file in zip*/ unz_file_info64_internal cur_file_info_internal; /* private info about it*/ file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ int encrypted; int isZip64; # ifndef NOUNCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const unsigned long* pcrc_32_tab; # endif } unz64_s; #ifndef NOUNCRYPT #include "crypt.h" #endif /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int unz64local_getByte OF(( const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) { unsigned char c; int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ZERROR64(*pzlib_filefunc_def,filestream)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unz64local_getShort OF(( const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i = 0; int err; err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unz64local_getLong OF(( const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i = 0; int err; err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((uLong)i)<<8; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((uLong)i)<<16; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unz64local_getLong64 OF(( const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) { ZPOS64_T x ; int i = 0; int err; err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x = (ZPOS64_T)i; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((ZPOS64_T)i)<<8; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((ZPOS64_T)i)<<16; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((ZPOS64_T)i)<<24; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((ZPOS64_T)i)<<32; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((ZPOS64_T)i)<<40; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((ZPOS64_T)i)<<48; if (err==UNZ_OK) err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); x |= ((ZPOS64_T)i)<<56; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, const char* fileName2, int iCaseSensitivity) { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #ifndef BUFREADCOMMENT #define BUFREADCOMMENT (0x400) #endif /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ ZPOS64_T uPosFound=0; if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */ local ZPOS64_T unz64local_SearchCentralDir64 OF(( const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ ZPOS64_T uPosFound=0; uLong uL; ZPOS64_T relativeOffset; if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); if (uPosFound == 0) return 0; /* Zip64 end of central directory locator */ if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) return 0; /* the signature, already checked */ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; /* number of the disk with the start of the zip64 end of central directory */ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; if (uL != 0) return 0; /* relative offset of the zip64 end of central directory record */ if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) return 0; /* total number of disks */ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; if (uL != 1) return 0; /* Goto end of central directory record */ if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) return 0; /* the signature */ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; if (uL != 0x06064b50) return 0; return relativeOffset; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer "zlib/zlib114.zip". If the zipfile cannot be opened (file doesn't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ local unzFile unzOpenInternal (const void *path, zlib_filefunc64_32_def* pzlib_filefunc64_32_def, int is64bitOpenFunction) { unz64_s us; unz64_s *s; ZPOS64_T central_pos; uLong uL; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ ZPOS64_T number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; us.z_filefunc.zseek32_file = NULL; us.z_filefunc.ztell32_file = NULL; if (pzlib_filefunc64_32_def==NULL) fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); else us.z_filefunc = *pzlib_filefunc64_32_def; us.is64bitOpenFunction = is64bitOpenFunction; us.filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); if (us.filestream==NULL) return NULL; central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); if (central_pos) { uLong uS; ZPOS64_T uL64; us.isZip64 = 1; if (ZSEEK64(us.z_filefunc, us.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* size of zip64 end of central directory record */ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) err=UNZ_ERRNO; /* version made by */ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) err=UNZ_ERRNO; /* version needed to extract */ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central directory on this disk */ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central directory */ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; us.gi.size_comment = 0; } else { central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); if (central_pos==0) err=UNZ_ERRNO; us.isZip64 = 0; if (ZSEEK64(us.z_filefunc, us.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; us.gi.number_entry = uL; /* total number of entries in the central dir */ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; number_entry_CD = uL; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; us.size_central_dir = uL; /* offset of start of central directory with respect to the starting disk number */ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; us.offset_central_dir = uL; /* zipfile comment length */ if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; } if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); ZCLOSE64(s->z_filefunc, s->filestream); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) { unz64_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; *pglobal_info=s->gi; return UNZ_OK; } extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) { unz64_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; /* to do : check if number_entry is not truncated */ pglobal_info32->number_entry = (uLong)s->gi.number_entry; pglobal_info32->size_comment = s->gi.size_comment; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) { ZPOS64_T uDate; uDate = (ZPOS64_T)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info64 *pfile_info, unz_file_info64_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unz64local_GetCurrentFileInfoInternal (unzFile file, unz_file_info64 *pfile_info, unz_file_info64_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize) { unz64_s* s; unz_file_info64 file_info; unz_file_info64_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; uLong uL; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; if (ZSEEK64(s->z_filefunc, s->filestream, s->pos_in_central_dir+s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) { if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; } if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) err=UNZ_ERRNO; file_info.compressed_size = uL; if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) err=UNZ_ERRNO; file_info.uncompressed_size = uL; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; /* relative offset of local header */ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) err=UNZ_ERRNO; file_info_internal.offset_curfile = uL; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek -= uSizeRead; } /* Read extrafield */ if ((err==UNZ_OK) && (extraField!=NULL)) { ZPOS64_T uSizeRead ; if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - (uLong)uSizeRead; } else lSeek += file_info.size_file_extra; if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) { uLong acc = 0; /* since lSeek now points to after the extra field we need to move back */ lSeek -= file_info.size_file_extra; if (lSeek!=0) { if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } while(acc < file_info.size_file_extra) { uLong headerId; uLong dataSize; if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) err=UNZ_ERRNO; /* ZIP64 extra fields */ if (headerId == 0x0001) { uLong uL; if(file_info.uncompressed_size == (ZPOS64_T)(unsigned long)-1) { if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; } if(file_info.compressed_size == (ZPOS64_T)(unsigned long)-1) { if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; } if(file_info_internal.offset_curfile == (ZPOS64_T)(unsigned long)-1) { /* Relative Header offset */ if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; } if(file_info.disk_num_start == (unsigned long)-1) { /* Disk Start Number */ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) err=UNZ_ERRNO; } } else { if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) err=UNZ_ERRNO; } acc += 2 + 2 + dataSize; } } if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; } if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, unz_file_info64 * pfile_info, char * szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char* szComment, uLong commentBufferSize) { return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, unz_file_info * pfile_info, char * szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char* szComment, uLong commentBufferSize) { int err; unz_file_info64 file_info64; err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); if (err==UNZ_OK) { pfile_info->version = file_info64.version; pfile_info->version_needed = file_info64.version_needed; pfile_info->flag = file_info64.flag; pfile_info->compression_method = file_info64.compression_method; pfile_info->dosDate = file_info64.dosDate; pfile_info->crc = file_info64.crc; pfile_info->size_filename = file_info64.size_filename; pfile_info->size_file_extra = file_info64.size_file_extra; pfile_info->size_file_comment = file_info64.size_file_comment; pfile_info->disk_num_start = file_info64.disk_num_start; pfile_info->internal_fa = file_info64.internal_fa; pfile_info->external_fa = file_info64.external_fa; pfile_info->tmu_date = file_info64.tmu_date, pfile_info->compressed_size = (uLong)file_info64.compressed_size; pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; } return err; } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (unzFile file) { int err=UNZ_OK; unz64_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (unzFile file) { unz64_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) { unz64_s* s; int err; /* We remember the 'current' position in the file so that we can jump * back there if we fail. */ unz_file_info64 cur_file_infoSaved; unz_file_info64_internal cur_file_info_internalSaved; ZPOS64_T num_fileSaved; ZPOS64_T pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz64_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; /* Save the current state */ num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; cur_file_infoSaved = s->cur_file_info; cur_file_info_internalSaved = s->cur_file_info_internal; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; err = unzGetCurrentFileInfo64(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (err == UNZ_OK) { if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } } /* We failed, so restore the state of the 'current file' to where we * were. */ s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; s->cur_file_info = cur_file_infoSaved; s->cur_file_info_internal = cur_file_info_internalSaved; return err; } /* /////////////////////////////////////////// // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) // I need random access // // Further optimization could be realized by adding an ability // to cache the directory in memory. The goal being a single // comprehensive file read to put the file I need in a memory. */ /* typedef struct unz_file_pos_s { ZPOS64_T pos_in_zip_directory; // offset in file ZPOS64_T num_of_file; // # of file } unz_file_pos; */ extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) { unz64_s* s; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; file_pos->pos_in_zip_directory = s->pos_in_central_dir; file_pos->num_of_file = s->num_file; return UNZ_OK; } extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos) { unz64_file_pos file_pos64; int err = unzGetFilePos64(file,&file_pos64); if (err==UNZ_OK) { file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; file_pos->num_of_file = (uLong)file_pos64.num_of_file; } return err; } extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) { unz64_s* s; int err; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; /* jump to the right spot */ s->pos_in_central_dir = file_pos->pos_in_zip_directory; s->num_file = file_pos->num_of_file; /* set the current file */ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); /* return results */ s->current_file_ok = (err == UNZ_OK); return err; } extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos) { unz64_file_pos file_pos64; if (file_pos == NULL) return UNZ_PARAMERROR; file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; file_pos64.num_of_file = file_pos->num_of_file; return unzGoToFilePos64(file,&file_pos64); } /* // Unzip Helper Functions - should be here? /////////////////////////////////////////// */ /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, ZPOS64_T * poffset_local_extrafield, uInt * psize_local_extrafield) { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) { if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; } if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && /* #ifdef HAVE_BZIP2 */ (s->cur_file_info.compression_method!=Z_BZIP2ED) && /* #endif */ (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, int* level, int raw, const char* password) { int err=UNZ_OK; uInt iSizeVar; unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ # ifndef NOUNCRYPT char source[12]; # else if (password != NULL) return UNZ_PARAMERROR; # endif if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; pfile_in_zip_read_info->raw=raw; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if (method!=NULL) *method = (int)s->cur_file_info.compression_method; if (level!=NULL) { *level = 6; switch (s->cur_file_info.flag & 0x06) { case 6 : *level = 1; break; case 4 : *level = 2; break; case 2 : *level = 9; break; } } if ((s->cur_file_info.compression_method!=0) && /* #ifdef HAVE_BZIP2 */ (s->cur_file_info.compression_method!=Z_BZIP2ED) && /* #endif */ (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->total_out_64=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->filestream=s->filestream; pfile_in_zip_read_info->z_filefunc=s->z_filefunc; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) { #ifdef HAVE_BZIP2 pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; pfile_in_zip_read_info->bstream.bzfree = (free_func)0; pfile_in_zip_read_info->bstream.opaque = (voidpf)0; pfile_in_zip_read_info->bstream.state = (voidpf)0; pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; pfile_in_zip_read_info->stream.next_in = (voidpf)0; pfile_in_zip_read_info->stream.avail_in = 0; err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; else { TRYFREE(pfile_in_zip_read_info); return err; } #else pfile_in_zip_read_info->raw=1; #endif } else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; pfile_in_zip_read_info->stream.next_in = 0; pfile_in_zip_read_info->stream.avail_in = 0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; else { TRYFREE(pfile_in_zip_read_info); return err; } /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; s->encrypted = 0; # ifndef NOUNCRYPT if (password != NULL) { int i; s->pcrc_32_tab = get_crc_table(); init_keys(password,s->keys,s->pcrc_32_tab); if (ZSEEK64(s->z_filefunc, s->filestream, s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, SEEK_SET)!=0) return UNZ_INTERNALERROR; if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) return UNZ_INTERNALERROR; for (i = 0; i<12; i++) zdecode(s->keys,s->pcrc_32_tab,source[i]); s->pfile_in_zip_read->pos_in_zipfile+=12; s->encrypted=1; } # endif return UNZ_OK; } extern int ZEXPORT unzOpenCurrentFile (unzFile file) { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) { return unzOpenCurrentFile3(file, method, level, raw, NULL); } /** Addition for GDAL : START */ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; s=(unz64_s*)file; if (file==NULL) return 0; /* UNZ_PARAMERROR; */ pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return 0; /* UNZ_PARAMERROR; */ return pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile; } /** Addition for GDAL : END */ /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) { int err=UNZ_OK; uInt iRead = 0; unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->read_buffer == NULL) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && (!(pfile_in_zip_read_info->raw))) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; if ((len>pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in) && (pfile_in_zip_read_info->raw)) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis)!=uReadThis) return UNZ_ERRNO; # ifndef NOUNCRYPT if(s->encrypted) { uInt i; for(i=0;iread_buffer[i] = zdecode(s->keys,s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]); } # endif pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) { uInt uDoCopy,i ; if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0)) return (iRead==0) ? UNZ_EOF : iRead; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) { #ifdef HAVE_BZIP2 uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; pfile_in_zip_read_info->bstream.total_in_hi32 = 0; pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; pfile_in_zip_read_info->bstream.total_out_hi32 = 0; uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; if (err==BZ_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=BZ_OK) break; #endif } /* end Z_BZIP2ED */ else { ZPOS64_T uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; ZPOS64_T uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) err = Z_DATA_ERROR; uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } extern ZPOS64_T ZEXPORT unztell64 (unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) return (ZPOS64_T)-1; s=(unz64_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return (ZPOS64_T)-1; return pfile_in_zip_read_info->total_out_64; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; uInt read_now; ZPOS64_T size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf,read_now)!=read_now) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (unzFile file) { int err=UNZ_OK; unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw)) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) inflateEnd(&pfile_in_zip_read_info->stream); #ifdef HAVE_BZIP2 else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); #endif pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) { unz64_s* s; uLong uReadThis ; if (file==NULL) return (int)UNZ_PARAMERROR; s=(unz64_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } /* Additions by RX '2004 */ extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) { unz64_s* s; if (file==NULL) return 0; /* UNZ_PARAMERROR; */ s=(unz64_s*)file; if (!s->current_file_ok) return 0; if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) if (s->num_file==s->gi.number_entry) return 0; return s->pos_in_central_dir; } extern uLong ZEXPORT unzGetOffset (unzFile file) { ZPOS64_T offset64; if (file==NULL) return 0; /* UNZ_PARAMERROR; */ offset64 = unzGetOffset64(file); return (uLong)offset64; } extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) { unz64_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz64_s*)file; s->pos_in_central_dir = pos; s->num_file = s->gi.number_entry; /* hack */ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) { return unzSetOffset64(file,pos); } #endif instead-3.2.1/src/main.c0000644000175000017500000004575413267071774014100 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #if defined(__APPLE__) || defined(S60) || defined(ANDROID) || defined(WINRT) #include #endif #include "externals.h" #include "internals.h" #ifdef _USE_GTK #include #endif #ifdef ANDROID #include "android.h" #endif #ifdef _WIN32_WCE extern void libwince_init(const char* prog, int debug); #endif extern int debug_init(void); extern void debug_done(void); extern luaL_Reg paths_funcs[]; extern luaL_Reg bits_funcs[]; int debug_sw = 0; int noauto_sw = 0; int nostdgames_sw = 0; int nostdthemes_sw = 0; int version_sw = 0; int owntheme_sw = 0; int nopause_sw = 0; int chunksize_sw = 0; int software_sw = 0; int hinting_sw = 1; int vsync_sw = 0; int resizable_sw = 0; int scale_sw = 1; int standalone_sw = 0; int nocursor_sw = 0; static int opt_index = 1; static int nohires_sw = 0; static char *fsize_sw = NULL; char *game_sw = NULL; char *games_sw = NULL; char *theme_sw = NULL; char *themes_sw = NULL; char *encode_sw = NULL; char *encode_output = NULL; char *mode_sw = NULL; char *modes_sw = NULL; char *appdata_sw = NULL; char *idf_sw = NULL; char *start_idf_sw = NULL; char *lua_sw = NULL; char *render_sw = NULL; static int lua_exec = 1; static int nocfg_sw = 0; char *instead_exec = NULL; #ifdef _USE_UNPACK extern int unpack(const char *zipfilename, const char *where); extern char zip_game_dirname[]; int setup_zip(const char *file, char *p) { if (!p) return -1; fprintf(stderr,"Trying to install: %s\n", file); if (unpack(file, p)) { if (zip_game_dirname[0]) { p = getpath(p, zip_game_dirname); fprintf(stderr, "Cleaning: '%s'...\n", p); remove_dir(p); free(p); } return -1; } p = strdup(p); FREE(game_sw); FREE(games_sw); game_sw = strdup(zip_game_dirname); games_sw = p; return 0; } #endif static int start_idf(char *file) { if (!file) return -1; if (!idf_magic(file)) return -1; FREE(start_idf_sw); start_idf_sw = strdup(file); return 0; } #ifdef __APPLE__ #include void macosx_init(void) { char resourcePath[PATH_MAX]; CFBundleRef mainBundle; CFURLRef resourcesDirectoryURL; mainBundle = CFBundleGetMainBundle(); if (!mainBundle) return; resourcesDirectoryURL = CFBundleCopyResourcesDirectoryURL(mainBundle); if (!resourcesDirectoryURL) return; CFURLGetFileSystemRepresentation(resourcesDirectoryURL, true, (UInt8 *) resourcePath, PATH_MAX); CFRelease(resourcesDirectoryURL); chdir(resourcePath); #ifdef IOS setup_inbox(); #endif return; } #endif #ifdef _WIN32_WCE char *getcurdir(char *path) { char *p; if (path == NULL || *path == '\0') return "."; p = path + strlen(path) - 1; while (*p == '/') { if (p == path) return path; *p-- = '\0'; } while (p >= path && *p != '/') p--; return p < path ? "." : p == path ? "/" : (*p = '\0', path); } void wince_init(char *path) { unix_path(path); strcpy(game_cwd, getcurdir(path)); } #endif static int run_game(const char *path) { char *p, *ep, *d; static char gp[PATH_MAX + 1]; static char *cd = "./"; if (!path) return -1; if (!path[0]) return -1; if (strlen(path) >= PATH_MAX) return -1; strcpy(gp, path); p = gp; unix_path(p); ep = p + strlen(p) - 1; while (*ep == '/' && ep != p) *ep-- = 0; if (!p[0]) return -1; ep = p + strlen(p) - 1; while (ep != p) { if (*ep == '/') { *ep ++ = 0; break; } ep --; } if (ep == p) d = cd; else d = p; if (!is_game(d, ep)) { fprintf(stderr, "%s/%s is not a game path.\n", d, ep); return -1; } FREE(game_sw); FREE(games_sw); game_sw = strdup(ep); games_sw = strdup(d); return 0; } static void usage(void) { fprintf(stderr, "INSTEAD "VERSION" - Simple Text Adventure Engine, The Interpreter\n" "Usage:\n" " sdl-instead [options] [game.zip or game.idf or path to game]\n" "Some options:\n" " -debug Debug mode\n (for game developers).\n" " -nosound\n Run the game without sound.\n" " -gamespath\n Add path with games.\n" " -game \n Select game in gamespath.\n" " -owntheme\n Force game to use own theme.\n" " -fullscreen\n Run the game in fullscreen mode.\n" " -hires\n Set the high resolution if run in fullscreen mode.\n" " -window\n Run the game in windowed mode.\n" " -noautosave\n Disable autosave load.\n" " -mode [WxH]\n Use WxH resolution.\n" " -software\n Force software rendering.\n" " -nopause\n Do not pause the game on window minimize.\n" " -hinting 0|1|2|3\n Set the font hinting mode (helpful with infinality)\n" " -install [game in zip]\n Install game from zip archive\n" " -appdata [fullpath]\n Store saves and settings in appdata path. Path must exist!\n" " -chunksize [size in bytes]\n Size for audio buffer. Try this if sound lags.\n" " -vsync\n Enable vsync display output (SDL2 only)\n"); } static int profile_load(const char *path); extern int game_instead_extensions(void); static int luaB_clipboard(lua_State *L) { char *buf = NULL; const char *text = luaL_optstring(L, 1, NULL); if (!text) { /* get */ if (system_clipboard(NULL, &buf) == 0) { lua_pushstring(L, buf); free(buf); } else lua_pushboolean(L, 0); return 1; } lua_pushboolean(L, system_clipboard(text, NULL) == 0); return 1; } static int luaB_wait_use(lua_State *L) { int v = -1; int old = game_wait_use; if (lua_isboolean(L, 1)) v = lua_toboolean(L, 1); if (v == -1) { lua_pushboolean(L, old); return 1; } if (!opt_owntheme) { lua_pushboolean(L, 0); return 1; } game_wait_use = v; lua_pushboolean(L, old); return 1; } static int luaB_grab_events(lua_State *L) { int grab = lua_toboolean(L, 1); int ov = game_grab_events; if (lua_isboolean(L, 1)) game_grab_events = grab; lua_pushboolean(L, ov); return 1; } static const luaL_Reg sdl_funcs[] = { { "instead_clipboard", luaB_clipboard }, { "instead_wait_use", luaB_wait_use }, {"instead_grab_events", luaB_grab_events}, {NULL, NULL} }; static int sdl_ext_init(void) { char path[PATH_MAX]; instead_api_register(sdl_funcs); game_wait_use = 1; game_grab_events = 0; snprintf(path, sizeof(path), "%s/%s", instead_stead_path(), "/ext/gui.lua"); return instead_loadfile(dirpath(path)); } static struct instead_ext sdl_ext = { .init = sdl_ext_init, }; static int sdl_extensions(void) { if (game_instead_extensions()) return -1; return instead_extension(&sdl_ext); } int instead_main(int argc, char *argv[]) { #ifdef _USE_UNPACK int clean_tmp = 0; #endif int err = 0; int i; #ifdef __APPLE__ macosx_init(); #endif #ifndef S60 putenv("SDL_MOUSE_RELATIVE=0"); /* test this! */ #endif #ifdef _WIN32_WCE libwince_init(argv[0], 1); wince_init(argv[0]); #elif defined(WINRT) unix_path(argv[0]); strcpy(game_cwd, argv[0]); #elif defined(S60) extern char s60_data[]; strcpy(game_cwd, s60_data); #elif defined(_WIN32) strcpy(game_cwd, dirname(argv[0])); #else if (!getcwd(game_cwd, sizeof(game_cwd))) fprintf(stderr,"Warning: can not get current dir\n."); #endif if (sdl_extensions() < 0) { fprintf(stderr, "Fatal: can not init SDL extensions\n"); return 1; } if (argc > 0) instead_exec = strdup(argv[0]); unix_path(game_cwd); setdir(game_cwd); profile_load(NULL); for (i = 1; i < argc; i++) { if (lua_sw) /* during load profile */ break; if (!strcmp(argv[i], "-vsync")) vsync_sw = 1; else if (!strcmp(argv[i], "-nosound")) nosound_sw = 1; else if (!strcmp(argv[i], "-fullscreen")) fullscreen_sw = 1; else if (!strcmp(argv[i], "-hires")) hires_sw = 1; else if (!strcmp(argv[i], "-nohires")) nohires_sw = 1; else if (!strcmp(argv[i], "-mode")) { FREE(mode_sw); if ((i + 1) < argc) mode_sw = strdup(argv[++i]); else mode_sw = strdup("-1x-1"); } else if (!strcmp(argv[i], "-modes")) { FREE(modes_sw); if ((i + 1) < argc) modes_sw = strdup(argv[++i]); } else if (!strcmp(argv[i], "-fontscale")) { FREE(fsize_sw); if (i + 1 < argc) fsize_sw = strdup(argv[++i]); else fsize_sw = NULL; } else if (!strcmp(argv[i], "-window")) window_sw = 1; else if (!strcmp(argv[i], "-debug")) { if (!debug_sw) debug_init(); debug_sw = 1; } else if (!strcmp(argv[i], "-owntheme")) owntheme_sw = 1; else if (!strcmp(argv[i], "-noautosave")) noauto_sw = 1; else if (!strcmp(argv[i], "-game")) { FREE(game_sw); if ((i + 1) < argc) game_sw = strdup(argv[++i]); else game_sw = strdup(""); } else if (!strcmp(argv[i], "-theme")) { FREE(theme_sw); if ((i + 1) < argc) theme_sw = strdup(argv[++i]); else theme_sw = strdup(""); } else if (!strcmp(argv[i], "-nostdgames")) { nostdgames_sw = 1; #ifdef _LOCAL_APPDATA } else if (!strcmp(argv[i], "-appdata")) { FREE(appdata_sw); if ((i + 1) < argc) appdata_sw = strdup(argv[++i]); else appdata_sw = strdup(""); #endif } else if (!strcmp(argv[i], "-chunksize")) { if ((i + 1) < argc) chunksize_sw = atoi(argv[++i]); else chunksize_sw = DEFAULT_CHUNKSIZE; } else if (!strcmp(argv[i], "-gamespath")) { FREE(games_sw); if ((i + 1) < argc) games_sw = strdup(argv[++i]); else games_sw = strdup(""); } else if (!strcmp(argv[i], "-themespath")) { FREE(themes_sw); if ((i + 1) < argc) themes_sw = strdup(argv[++i]); else themes_sw = strdup(""); } else if (!strcmp(argv[i], "-idf")) { FREE(idf_sw); if ((i + 1) < argc) idf_sw = strdup(argv[++i]); else { fprintf(stderr,"No data directory specified.\n"); err = 1; goto out; } } else if (!strcmp(argv[i], "-encode")) { FREE(encode_sw); if ((i + 1) < argc) encode_sw = strdup(argv[++i]); else { fprintf(stderr,"No lua file specified.\n"); err = 1; goto out; } FREE(encode_output); if ((i + 1) < argc) encode_output = strdup(argv[++i]); else encode_output = strdup("lua.enc"); } else if (!strcmp(argv[i], "-version")) { version_sw = 1; } else if (!strcmp(argv[i], "-nopause")) { nopause_sw = 1; } else if (!strcmp(argv[i], "-nocursor")) { nocursor_sw = 1; } else if (!strcmp(argv[i], "-software")) { software_sw = 1; } else if (!strcmp(argv[i], "-resizable")) { resizable_sw = 1; } else if (!strcmp(argv[i], "-scale")) { if ((i + 1) < argc) scale_sw = atoi(argv[++i]); else scale_sw = 2; } else if (!strcmp(argv[i], "-standalone")) { standalone_sw = 1; owntheme_sw = 1; } else if (!strcmp(argv[i], "-noconfig")) { nocfg_sw = 1; } else if (!strcmp(argv[i], "-profile")) { if ((i + 1) < argc) { profile_load(argv[++i]); i ++; } #ifdef _USE_UNPACK } else if (!strcmp(argv[i], "-install")) { if ((i + 1) < argc) { char *file = argv[++i]; char *p; if (games_sw) p = games_sw; else p = game_local_games_path(1); if (setup_zip(file, p)) { err = 1; goto out; } } #endif } else if (!strcmp(argv[i], "-quit")) { exit(0); } else if (!strcmp(argv[i], "-hinting")) { if ((i + 1) < argc) hinting_sw = atoi(argv[++i]); else hinting_sw = 1; } else if (!strcmp(argv[i], "-lua") || !strcmp(argv[i], "-luac")) { if ((i + 1) < argc) { lua_exec = !strcmp(argv[i], "-lua"); FREE(lua_sw); lua_sw = strdup(argv[++ i]); opt_index = i + 1; break; } else { fprintf(stderr, "No lua script.\n"); err = 1; goto out; } } else if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { usage(); goto out; } else if (!strcmp(argv[i], "-renderer")) { FREE(render_sw); if ((i + 1) < argc) render_sw = strdup(argv[++i]); else { fprintf(stderr, "Parameter required: %s\n", argv[i]); fprintf(stderr, "opengl, opengles2, opengles, software, direct3d\n"); err = 1; goto out; } } else if (argv[i][0] == '-') { fprintf(stderr,"Unknown option: %s\n", argv[i]); usage(); err = 1; goto out; } else if (!start_idf(argv[i])) { fprintf(stderr, "Adding idf: %s\n", argv[i]); } else if (!run_game(argv[i])) { fprintf(stderr, "Opening game: %s\n", argv[i]); } #ifdef _USE_UNPACK else { char *p; if (games_sw) p = games_sw; else p = game_tmp_path(); if (setup_zip(argv[i], p)) { err = 1; goto out; } clean_tmp = 1; } #endif opt_index = i; } if (scale_sw <= 0) scale_sw = 1; else if (scale_sw > 8) scale_sw = 8; if (nocfg_sw || cfg_load()) { /* no config */ cfg_init(); } if (fsize_sw) { int i = atoi(fsize_sw); if (i > 0) opt_fsize = (i - 100) / 10; } if (opt_fsize < FONT_MIN_SZ) opt_fsize = FONT_MIN_SZ; else if (opt_fsize > FONT_MAX_SZ) opt_fsize = FONT_MAX_SZ; if (opt_debug == 1 && debug_sw == 0) { debug_sw = 1; debug_init(); } if (opt_vsync == 1 && vsync_sw == 0) vsync_sw = 1; if (opt_resizable == 1 && resizable_sw == 0) resizable_sw = 1; if (version_sw) { fprintf(stdout, VERSION"\n"); goto out; } if (lua_sw) { instead_set_standalone(1); instead_set_debug(debug_sw); err = instead_init_lua(dirname(lua_sw), 0); if (err) goto out; instead_api_register(paths_funcs); instead_api_register(bits_funcs); if (!err) err = instead_loadscript(lua_sw, argc - opt_index, argv + opt_index, lua_exec); instead_done(); goto out; } if (encode_sw) { err = instead_encode(encode_sw, encode_output); goto out; } if (idf_sw) { char *p = malloc(strlen(idf_sw) + 5); if (p) { char *b; strcpy(p, idf_sw); b = basename(p); strcat(b, ".idf"); idf_create(b, idf_sw); free(p); } else idf_create("data.idf", idf_sw); goto out; } menu_langs_lookup(dirpath(LANG_PATH)); if (!langs_nr) { fprintf(stderr, "No languages found in: %s.\n", dirpath(LANG_PATH)); err = 1; goto out; } if (!opt_lang || !opt_lang[0]) opt_lang = game_locale(); if (menu_lang_select(opt_lang) && menu_lang_select(LANG_DEF)) { fprintf(stderr, "Can not load default language.\n"); err = 1; goto out; } if (games_sw) games_lookup(games_sw); if (!nostdgames_sw && games_lookup(dirpath(GAMES_PATH))) fprintf(stderr, "No games found in: %s.\n", GAMES_PATH); if (themes_sw) themes_lookup(themes_sw, THEME_GLOBAL); if (!nostdthemes_sw) { themes_lookup(dirpath(THEMES_PATH), THEME_GLOBAL); themes_lookup(game_local_themes_path(), THEME_GLOBAL); } if (!nostdgames_sw) games_lookup(game_local_games_path(0)); if (start_idf_sw) { char *d, *b; char *dd, *bb; static char idf_game[255]; d = strdup(start_idf_sw); b = strdup(start_idf_sw); if (d && b) { dd = dirname(d); bb = basename(b); if (!games_replace(dirpath(dd), bb)) { strncpy(idf_game, bb, sizeof(idf_game) - 1); idf_game[sizeof(idf_game) - 1] = 0; FREE(game_sw); game_sw = strdup(idf_game); } } if (d) free(d); if (b) free(b); } /* too dangerous to be in release if (games_nr == 1) { if (strncmp(GAMES_PATH, games[0].path, strlen(GAMES_PATH))) { standalone_sw = 1; } } */ if (standalone_sw) { fprintf(stderr, "Standalone mode...\n"); owntheme_sw = 1; } if (owntheme_sw && !opt_owntheme) { opt_owntheme = 2; } if (noauto_sw && opt_autosave) opt_autosave = 2; if (window_sw) opt_fs = 0; if (fullscreen_sw) opt_fs = 1; if (nohires_sw) opt_hires = 0; if (hires_sw != -1) opt_hires = hires_sw; if (mode_sw) parse_mode(mode_sw, opt_mode); if (game_sw) { FREE(opt_game); opt_game = game_sw; } if (theme_sw) { FREE(opt_theme); opt_theme = theme_sw; } if (opt_theme) game_theme_select(opt_theme); if (!curtheme_dir[THEME_GLOBAL]) game_theme_select(DEFAULT_THEME); /* Initialize SDL */ if (gfx_init() < 0) return -1; /* Initialize Sound */ snd_init(opt_hz); snd_volume_mus(opt_vol); #ifdef _USE_GTK gtk_init(&argc, &argv); /* must be called AFTER SDL_Init when using SDL2 */ #endif if (gfx_video_init() || input_init()) return -1; if (game_init(opt_game?opt_game:"")) { game_error(); } game_loop(); #ifdef __EMSCRIPTEN__ return 0; #endif cfg_save(); game_done(0); snd_done(); gfx_video_done(); #ifndef ANDROID gfx_done(); #endif out: if (debug_sw) debug_done(); #ifdef _USE_GTK /* gtk_main_quit (); */ #endif #ifdef _USE_UNPACK if (clean_tmp) remove_dir(game_tmp_path()); #endif return err; } static struct parser profile_parser[] = { { "standalone", parse_int, &standalone_sw, 0 }, { "vsync", parse_int, &vsync_sw, 0 }, { "debug", parse_int, &debug_sw, 0 }, { "lua", parse_string, &lua_sw, 0 }, { "nopause", parse_int, &nopause_sw, 0 }, { "noconfig", parse_int, &nocfg_sw, 0 }, { "noautosave", parse_int, &noauto_sw, 0 }, { "nostdgames", parse_int, &nostdgames_sw, 0 }, { "nostdthemes", parse_int, &nostdthemes_sw, 0 }, { "chunksize", parse_int, &chunksize_sw, 0 }, { "software", parse_int, &software_sw, 0 }, { "hinting", parse_int, &hinting_sw, 0 }, { "resizable", parse_int, &resizable_sw, 0 }, { "scale", parse_int, &scale_sw, 0 }, { "gamespath", parse_string, &games_sw, 0 }, { "themespath", parse_string, &themes_sw, 0 }, { "game", parse_string, &game_sw, 0 }, { "owntheme", parse_int, &owntheme_sw, 0 }, { "appdata", parse_string, &appdata_sw, 0 }, { "fullscreen", parse_int, &fullscreen_sw, 0 }, { "hires", parse_int, &hires_sw, 0 }, { "nohires", parse_int, &nohires_sw, 0 }, { "window", parse_int, &window_sw, 0 }, { "mode", parse_string, &mode_sw, 0 }, { "modes", parse_string, &modes_sw, 0 }, { "fontscale", parse_string, &fsize_sw, 0 }, { "renderer", parse_string, &render_sw, 0 }, { "nocursor", parse_int, &nocursor_sw, 0 }, { NULL, NULL, NULL, 0 }, }; static int profile_parse(const char *path) { return parse_ini(path, profile_parser); } static int profile_load(const char *prof) { char path[PATH_MAX]; const char *p = (prof)?prof:appdir(); if (!p) return -1; if (!prof) snprintf(path, sizeof(path), "%s/profile", p); else snprintf(path, sizeof(path), "%s", p); if (access(path, R_OK)) return 0; if (prof) fprintf(stderr, "Using profile...'%s'\n", path); return profile_parse(path); } #ifndef NOMAIN int main(int argc, char *argv[]) { int err; err = instead_main(argc, argv); #if defined(ANDROID) || defined(IOS) exit(err); #endif return err; } #endif instead-3.2.1/src/themes.h0000644000175000017500000001204113267071774014425 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __THEMES_INCLUDED_H #define __THEMES_INCLUDED_H #include "graphics.h" #include "sound.h" #define DEFAULT_THEME "default" #ifndef THEMES_PATH #define THEMES_PATH "./themes" #endif #define THEME_FILE "theme.ini" #define THEME_GLOBAL 0 #define THEME_GAME 1 struct game_theme { float scale; int w; int h; int gfx_scalable; color_t bgcol; char *bg_name; img_t bg; char *use_name; char *cursor_name; int cur_x; int cur_y; img_t use; img_t cursor; int pad; int win_align; int win_x; int win_y; int win_w; int win_h; int win_scroll_mode; char *font_name; int font_size; float font_height; fnt_t font; int gfx_x; int gfx_y; int max_scene_w; int max_scene_h; char *a_up_name; char *a_down_name; img_t a_up; img_t a_down; int a_up_x; int a_up_y; int a_down_x; int a_down_y; color_t fgcol; color_t lcol; color_t acol; int inv_x; int inv_y; int inv_w; int inv_h; color_t icol; color_t ilcol; color_t iacol; char *inv_font_name; int inv_font_size; float inv_font_height; fnt_t inv_font; char *inv_a_up_name; char *inv_a_down_name; img_t inv_a_up; img_t inv_a_down; int inv_a_up_x; int inv_a_up_y; int inv_a_down_x; int inv_a_down_y; /* int lstyle; int ilstyle; */ color_t menu_bg; color_t menu_fg; color_t border_col; color_t menu_link; color_t menu_alink; int menu_alpha; int border_w; char *menu_font_name; int menu_font_size; float menu_font_height; fnt_t menu_font; char *menu_button_name; img_t menu_button; int menu_button_x; int menu_button_y; int gfx_mode; int inv_mode; int ways_mode; char *click_name; void *click; char *icon_name; img_t icon; int xoff; int yoff; int changed; }; #define CHANGED_FONT 1 #define CHANGED_IFONT 2 #define CHANGED_MFONT 4 #define CHANGED_BG 8 #define CHANGED_WIN 0x10 #define CHANGED_INV 0x20 #define CHANGED_CLICK 0x40 #define CHANGED_CURSOR 0x80 #define CHANGED_USE 0x100 #define CHANGED_UP 0x200 #define CHANGED_DOWN 0x400 #define CHANGED_IUP 0x800 #define CHANGED_IDOWN 0x1000 #define CHANGED_BUTTON 0x2000 #define CHANGED_ICON 0x4000 #define CHANGED_ALL 0xffff struct theme { char *path; char *name; char *dir; int type; int idf; }; extern struct theme *themes; extern int themes_nr; extern char *curtheme_dir[]; extern char *curgametheme_dir; extern struct game_theme game_theme; extern struct game_theme game_theme_unscaled; extern int game_default_theme(void); extern int game_theme_select(const char *name); extern int themes_lookup(const char *path, int type); extern int themes_lookup_idf(idf_t idf, const char *path, int type); extern struct theme *theme_lookup(const char *name, int type); extern int themes_rename(void); extern int themes_count(int type); extern int themes_max(int *type); extern void themes_drop(int type); extern int game_theme_load(const char *name, int type); extern int game_theme_init(void); extern int game_theme_free(void); extern int game_theme_optimize(void); extern int game_theme_update(void); extern int theme_load(const char *name); extern int theme_load_idf(idf_t idf, const char *name); extern int theme_img_scale(img_t *p); extern int theme_scalable_mode(int w, int h); extern int theme_relative; #define GFX_MODE_FLOAT 1 #define GFX_MODE_FIXED 2 #define GFX_MODE_EMBEDDED 4 #define GFX_MODE_DIRECT 0x100 #define GFX_MODE(v) ((v) & 0x1ff) #define GFX_DIRECT(v) (!!((v) & 0x100)) #define GFX_DIRECT_SET(v) ((v)|0x100) #define GFX_DIRECT_CLR(v) ((v)&(~0x100)) #define GFX_ALIGN(v) ((v)>>16) #define GFX_ALIGN_SET(v) ((v)<<16) #define INV_MODE_DISABLED -1 #define INV_MODE_VERT 0 #define INV_MODE_HORIZ 1 #define INV_MODE(v) ((v)&0xff) #define INV_ALIGN(v) ((v)>>8) #define INV_ALIGN_SET(v) ((v)<<8) #define WAYS_BOTTOM (game_theme.ways_mode == ALIGN_BOTTOM) #define DIRECT_MODE (GFX_DIRECT(game_theme.gfx_mode)) #define SCALABLE_FONT (!(game_theme.gfx_scalable & 4)) #define SCALABLE_THEME (game_theme.gfx_scalable & 3) #define SCALABLE_THEME_SMOOTH (game_theme.gfx_scalable & 1) #endif instead-3.2.1/src/instead_sprites.c0000644000175000017500000015446413267071774016353 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" #include "noise1234.h" static LIST_HEAD(sprites); static LIST_HEAD(fonts); #define FN_SCALED 1 typedef struct { struct list_node list; char *name; int flags; fnt_t fnt; } _fnt_t; typedef struct { struct list_node list; char *name; img_t img; } _spr_t; struct lua_pixels; static img_t pixels_img(struct lua_pixels *hdr); static void sprites_free(void) { /* fprintf(stderr, "sprites free \n"); */ while (!list_empty(&sprites)) { _spr_t *sp = list_top(&sprites, _spr_t, list); free(sp->name); cache_forget(gfx_image_cache(), sp->img); list_del(&sp->list); free(sp); } while (!list_empty(&fonts)) { _fnt_t *fn = list_top(&fonts, _fnt_t, list); fnt_free(fn->fnt); free(fn->name); list_del(&fn->list); free(fn); } game_pict_modify(NULL); cache_shrink(gfx_image_cache()); } static _spr_t *sprite_lookup(const char *name) { _spr_t *pos = NULL; _spr_t *sp; list_for_each(&sprites, pos, list) { sp = (_spr_t*)pos; if (!strcmp(name, sp->name)) { list_del(&sp->list); list_add(&sprites, &sp->list); /* move it on head */ return sp; } } return NULL; } static _fnt_t *font_lookup(const char *name) { _fnt_t *pos = NULL; _fnt_t *fn; list_for_each(&fonts, pos, list) { fn = (_fnt_t*)pos; if (!strcmp(name, fn->name)) { list_del(&fn->list); list_add(&fonts, &fn->list); /* move it on head */ return fn; } } return NULL; } static _spr_t *sprite_new(const char *name, img_t img) { _spr_t *sp; sp = malloc(sizeof(_spr_t)); if (!sp) return NULL; /* INIT_LIST_HEAD(&sp->list); */ sp->name = strdup(name); if (!sp->name) { free(sp); return NULL; } sp->img = img; if (cache_add(gfx_image_cache(), name, img)) { free(sp->name); free(sp); return NULL; } /* fprintf(stderr, "added: %s\n", name); */ list_add(&sprites, &sp->list); return sp; } static _fnt_t *font_new(const char *name, fnt_t fnt) { _fnt_t *fn; fn = malloc(sizeof(_fnt_t)); if (!fn) return NULL; /* INIT_LIST_HEAD(&fn->list); */ fn->name = strdup(name); if (!fn->name) { free(fn); return NULL; } fn->fnt = fnt; fn->flags = 0; list_add(&fonts, &fn->list); return fn; } static void sprite_name(const char *name, char *sname, int size) { unsigned long h = 0; if (!sname || !size) return; h = hash_string(name); do { /* new uniq name */ snprintf(sname, size, "spr:%lx", h); h ++; } while (sprite_lookup(sname) || cache_lookup(gfx_image_cache(), sname)); sname[size - 1] = 0; } static void font_name(const char *name, char *sname, int size) { unsigned long h = 0; if (!sname || !size) return; h = hash_string(name); do { /* new uniq name */ snprintf(sname, size, "fnt:%lx", h); h ++; } while (font_lookup(sname)); sname[size - 1] = 0; } static int _free_sprite(const char *key); static int luaB_free_sprites(lua_State *L) { sprites_free(); return 0; } static int luaB_load_sprite(lua_State *L) { img_t img = NULL; _spr_t *sp; const char *key; char sname[sizeof(unsigned long) * 2 + 16]; struct lua_pixels *pixels = lua_touserdata(L, 1); const char *desc = luaL_optstring(L, 2, NULL); const char *fname = NULL; char pixels_name[32]; if (!pixels) fname = luaL_optstring(L, 1, NULL); else { snprintf(pixels_name, sizeof(pixels_name), "pxl:%p", pixels); pixels_name[sizeof(pixels_name) - 1] = 0; fname = pixels_name; } if (!fname) return 0; if (pixels) { img = pixels_img(pixels); if (img) img = gfx_dup(img); } else { img = gfx_load_image((char*)fname); if (img) theme_img_scale(&img); } if (img) img = gfx_display_alpha(img); /*speed up */ if (!img) goto err; if (!desc || sprite_lookup(desc)) { key = sname; sprite_name(fname, sname, sizeof(sname)); } else key = desc; sp = sprite_new(key, img); if (!sp) goto err; lua_pushstring(L, key); return 1; err: game_res_err_msg(fname, debug_sw); gfx_free_image(img); return 0; } static int luaB_load_font(lua_State *L) { int scaled = 0; fnt_t fnt = NULL; _fnt_t *fn; const char *key; char sname[sizeof(unsigned long) * 2 + 16]; struct game_theme *t = &game_theme; const char *fname = luaL_optstring(L, 1, NULL); int sz = luaL_optnumber(L, 2, t->font_size); const char *desc = luaL_optstring(L, 3, NULL); if (!fname || sz == 0) return 0; if (sz > 0) { sz *= game_theme.scale; scaled = 1; } else sz = - sz; /* sz < 0 is unscalable */ fnt = fnt_load((char*)fname, sz); if (!fnt) return 0; if (!desc || font_lookup(desc)) { key = sname; font_name(fname, sname, sizeof(sname)); } else key = desc; fn = font_new(key, fnt); if (!fn) goto err; if (scaled) fn->flags |= FN_SCALED; lua_pushstring(L, key); return 1; err: fnt_free(fnt); return 0; } static int luaB_text_size(lua_State *L) { _fnt_t *fn; int w = 0, h = 0; const char *font = luaL_optstring(L, 1, NULL); const char *text = luaL_optstring(L, 2, NULL); int style = luaL_optnumber(L, 3, 0); if (!font) return 0; fn = font_lookup(font); if (!fn) return 0; if (!text) { w = 0; if (fn->flags & FN_SCALED) h = ceil((float)fnt_height(fn->fnt) / game_theme.scale); else h = fnt_height(fn->fnt); } else { fnt_style(fn->fnt, style); txt_size(fn->fnt, text, &w, &h); if (fn->flags & FN_SCALED) { w = ceil((float)w / game_theme.scale); h = ceil((float)h / game_theme.scale); } } lua_pushinteger(L, w); lua_pushinteger(L, h); return 2; } static int luaB_font_size_scaled(lua_State *L) { int sz = luaL_optnumber(L, 1, game_theme.font_size); lua_pushinteger(L, FONT_SZ(sz)); return 1; } static int luaB_text_sprite(lua_State *L) { img_t img = NULL; _spr_t *sp; _fnt_t *fn; const char *key; char sname[sizeof(unsigned long) * 2 + 16]; const char *font = luaL_optstring(L, 1, NULL); const char *text = luaL_optstring(L, 2, NULL); char txtkey[32]; const char *color = luaL_optstring(L, 3, NULL); int style = luaL_optnumber(L, 4, 0); const char *desc = luaL_optstring(L, 5, NULL); color_t col = { .r = game_theme.fgcol.r, .g = game_theme.fgcol.g, .b = game_theme.fgcol.b }; if (!font) return 0; if (color) gfx_parse_color (color, &col); if (!text) text = ""; fn = font_lookup(font); if (!fn) return 0; fnt_style(fn->fnt, style); img = fnt_render(fn->fnt, text, col); if (img) img = gfx_display_alpha(img); /*speed up */ if (!img) return 0; if (!desc || sprite_lookup(desc)) { key = sname; strncpy(txtkey, text, sizeof(txtkey)); txtkey[sizeof(txtkey) - 1] = 0; sprite_name(txtkey, sname, sizeof(sname)); } else key = desc; sp = sprite_new(key, img); if (!sp) goto err; lua_pushstring(L, key); return 1; err: gfx_free_image(img); return 0; } static int in_callback = 0; static img_t grab_sprite(const char *dst, int *xoff, int *yoff) { img_t oldscreen; img_t d; if (!dst) return NULL; if ((DIRECT_MODE || in_callback) && !strcmp(dst, "screen")) { d = gfx_screen(NULL); *xoff = game_theme.xoff; *yoff = game_theme.yoff; } else if (opt_owntheme && !strcmp(dst, "screen")) { if (!game_theme.bg) { /* create on the fly */ game_theme.bg = gfx_new(game_theme.w, game_theme.h); oldscreen = gfx_screen(game_theme.bg); gfx_clear(0, 0, game_theme.w, game_theme.h); gfx_screen(oldscreen); } d = game_theme.bg; *xoff = game_theme.xoff; *yoff = game_theme.yoff; } else { *xoff = 0; *yoff = 0; d = cache_lookup(gfx_image_cache(), dst); } return d; } static int luaB_sprite_size(lua_State *L) { img_t s = NULL; float v; int w, h; int xoff, yoff; const char *src = luaL_optstring(L, 1, NULL); if (!src) return 0; s = grab_sprite(src, &xoff, &yoff); if (!s) return 0; v = game_theme.scale; w = ceil ((float)(gfx_img_w(s) - xoff * 2) / v); h = ceil ((float)(gfx_img_h(s) - yoff * 2) / v); lua_pushinteger(L, w); lua_pushinteger(L, h); return 2; } #define BLIT_COPY 0 #define BLIT_DRAW 1 #define BLIT_COMPOSE 2 static int luaB_blit_sprite(lua_State *L, int mode) { img_t s = NULL, d = NULL; float v; struct lua_pixels *pixels = lua_touserdata(L, 1); const char *src = NULL; int x = luaL_optnumber(L, 2, 0); int y = luaL_optnumber(L, 3, 0); int w = luaL_optnumber(L, 4, -1); int h = luaL_optnumber(L, 5, -1); const char *dst = luaL_optstring(L, 6, NULL); int xx = luaL_optnumber(L, 7, 0); int yy = luaL_optnumber(L, 8, 0); int alpha = luaL_optnumber(L, 9, 255); int xoff = 0, yoff = 0; int xoff0 = 0, yoff0 = 0; if (!pixels) src = luaL_optstring(L, 1, NULL); if ((!src && !pixels) || !dst) return 0; if (pixels) s = pixels_img(pixels); if (!s) s = grab_sprite(src, &xoff0, &yoff0); d = grab_sprite(dst, &xoff, &yoff); if (!s || !d) return 0; v = game_theme.scale; if (v != 1.0f) { x *= v; y *= v; if (w != -1) w = ceil(w * v); if (h != -1) h = ceil(h * v); xx *= v; yy *= v; } if (w == -1) w = gfx_img_w(s) - 2 * xoff0; if (h == -1) h = gfx_img_h(s) - 2 * yoff0; game_pict_modify(d); game_gfx_clip(); switch (mode) { case BLIT_DRAW: if (alpha != 255) gfx_draw_from_alpha(s, x + xoff0, y + yoff0, w, h, d, xx + xoff, yy + yoff, alpha); else gfx_draw_from(s, x + xoff0, y + yoff0, w, h, d, xx + xoff, yy + yoff); break; case BLIT_COPY: gfx_copy_from(s, x + xoff0, y + yoff0, w, h, d, xx + xoff, yy + yoff); break; case BLIT_COMPOSE: gfx_compose_from(s, x + xoff0, y + yoff0, w, h, d, xx + xoff, yy + yoff); break; default: break; } game_gfx_noclip(); lua_pushboolean(L, 1); return 1; } static int luaB_draw_sprite(lua_State *L) { return luaB_blit_sprite(L, BLIT_DRAW); } static int luaB_copy_sprite(lua_State *L) { return luaB_blit_sprite(L, BLIT_COPY); } static int luaB_compose_sprite(lua_State *L) { return luaB_blit_sprite(L, BLIT_COMPOSE); } static int luaB_alpha_sprite(lua_State *L) { _spr_t *sp; img_t s; img_t img2 = NULL; const char *key; char sname[sizeof(unsigned long) * 2 + 16]; const char *src = luaL_optstring(L, 1, NULL); int alpha = luaL_optnumber(L, 2, 255); const char *desc = luaL_optstring(L, 3, NULL); if (!src) return 0; s = cache_lookup(gfx_image_cache(), src); if (!s) return 0; img2 = gfx_alpha_img(s, alpha); if (!img2) return 0; if (!desc || sprite_lookup(desc)) { key = sname; sprite_name(src, sname, sizeof(sname)); } else key = desc; sp = sprite_new(key, img2); if (!sp) goto err; lua_pushstring(L, sname); return 1; err: gfx_free_image(img2); return 0; } static int luaB_colorkey_sprite(lua_State *L) { img_t s; color_t col; const char *src = luaL_optstring(L, 1, NULL); const char *color = luaL_optstring(L, 2, NULL); if (color) gfx_parse_color(color, &col); if (!src) return 0; s = cache_lookup(gfx_image_cache(), src); if (!s) return 0; if (color) gfx_set_colorkey(s, col); else gfx_unset_colorkey(s); return 0; } static int luaB_dup_sprite(lua_State *L) { _spr_t *sp; img_t s; img_t img2 = NULL; const char *key; char sname[sizeof(unsigned long) * 2 + 16]; const char *src = luaL_optstring(L, 1, NULL); const char *desc = luaL_optstring(L, 2, NULL); if (!src) return 0; s = cache_lookup(gfx_image_cache(), src); if (!s) return 0; img2 = gfx_dup(s); if (!img2) return 0; if (!desc || sprite_lookup(desc)) { key = sname; sprite_name(src, sname, sizeof(sname)); } else key = desc; sp = sprite_new(key, img2); if (!sp) goto err; lua_pushstring(L, sname); return 1; err: gfx_free_image(img2); return 0; } static int luaB_scale_sprite(lua_State *L) { _spr_t *sp; img_t s; img_t img2 = NULL; const char *key; char sname[sizeof(unsigned long) * 2 + 16]; const char *src = luaL_optstring(L, 1, NULL); float xs = luaL_optnumber(L, 2, 0); float ys = luaL_optnumber(L, 3, 0); int smooth = lua_toboolean(L, 4); const char *desc = luaL_optstring(L, 5, NULL); if (!src) return 0; s = cache_lookup(gfx_image_cache(), src); if (!s) return 0; if (xs == 0) xs = 1.0f; if (ys == 0) ys = xs; img2 = gfx_scale(s, xs, ys, smooth); if (!img2) return 0; if (!desc || sprite_lookup(desc)) { key = sname; sprite_name(src, sname, sizeof(sname)); } else key = desc; sp = sprite_new(key, img2); if (!sp) goto err; lua_pushstring(L, sname); return 1; err: gfx_free_image(img2); return 0; } static int luaB_rotate_sprite(lua_State *L) { _spr_t *sp; img_t s; img_t img2 = NULL; const char *key; char sname[sizeof(unsigned long) * 2 + 16]; const char *src = luaL_optstring(L, 1, NULL); float angle = luaL_optnumber(L, 2, 1.0f); int smooth = lua_toboolean(L, 3); const char *desc = luaL_optstring(L, 4, NULL); if (!src) return 0; s = cache_lookup(gfx_image_cache(), src); if (!s) return 0; img2 = gfx_rotate(s, angle, smooth); if (!img2) return 0; if (!desc || sprite_lookup(desc)) { key = sname; sprite_name(src, sname, sizeof(sname)); } else key = desc; sp = sprite_new(key, img2); if (!sp) goto err; lua_pushstring(L, sname); return 1; err: gfx_free_image(img2); return 0; } static int luaB_fill_sprite(lua_State *L) { img_t d; float v; const char *dst = luaL_optstring(L, 1, NULL); int x = luaL_optnumber(L, 2, 0); int y = luaL_optnumber(L, 3, 0); int w = luaL_optnumber(L, 4, -1); int h = luaL_optnumber(L, 5, -1); const char *color = luaL_optstring(L, 6, NULL); int xoff = 0, yoff = 0; color_t col = { .r = game_theme.bgcol.r, .g = game_theme.bgcol.g, .b = game_theme.bgcol.b }; if (!dst) return 0; d = grab_sprite(dst, &xoff, &yoff); if (color) gfx_parse_color(color, &col); if (!d) return 0; v = game_theme.scale; if (v != 1.0f) { x *= v; y *= v; if (w != -1) w = ceil(w * v); if (h != -1) h = ceil(h * v); } if (w == -1) w = gfx_img_w(d) - 2 * xoff; if (h == -1) h = gfx_img_h(d) - 2 * yoff; game_pict_modify(d); game_gfx_clip(); gfx_img_fill(d, x + xoff, y + yoff, w, h, col); game_gfx_noclip(); lua_pushboolean(L, 1); return 1; } static int luaB_pixel_sprite(lua_State *L) { img_t d; float v; int rc, w, h; color_t col = { .r = game_theme.bgcol.r, .g = game_theme.bgcol.g, .b = game_theme.bgcol.b, .a = 255 }; const char *dst = luaL_optstring(L, 1, NULL); int x = luaL_optnumber(L, 2, 0); int y = luaL_optnumber(L, 3, 0); const char *color = luaL_optstring(L, 4, NULL); int alpha = luaL_optnumber(L, 5, 255); int xoff = 0, yoff = 0; if (!dst) return 0; d = grab_sprite(dst, &xoff, &yoff); if (color) gfx_parse_color(color, &col); if (!d) return 0; w = gfx_img_w(d) - 2 * xoff; h = gfx_img_h(d) - 2 * yoff; v = game_theme.scale; if (v != 1.0f) { x *= v; y *= v; } if (color) { if (x < 0 || y < 0 || x >= w || y >= h) return 0; game_pict_modify(d); col.a = alpha; rc = gfx_set_pixel(d, x + xoff, y + yoff, col); } else { rc = gfx_get_pixel(d, x + xoff, y + yoff, &col); } if (rc) return 0; lua_pushinteger(L, col.r); lua_pushinteger(L, col.g); lua_pushinteger(L, col.b); lua_pushinteger(L, col.a); return 4; } static int _free_sprite(const char *key) { _spr_t *sp; if (!key) return -1; sp = sprite_lookup(key); if (!sp) return -1; cache_forget(gfx_image_cache(), sp->img); cache_shrink(gfx_image_cache()); list_del(&sp->list); free(sp->name); free(sp); return 0; } static int luaB_free_sprite(lua_State *L) { const char *key = luaL_optstring(L, 1, NULL); if (_free_sprite(key)) return 0; lua_pushboolean(L, 1); return 1; } static int luaB_free_font(lua_State *L) { const char *key = luaL_optstring(L, 1, NULL); _fnt_t *fn; if (!key) return 0; fn = font_lookup(key); if (!fn) return 0; list_del(&fn->list); fnt_free(fn->fnt); free(fn->name); free(fn); lua_pushboolean(L, 1); return 1; } extern int theme_setvar(char *name, char *val); extern char *theme_getvar(const char *name); static int luaB_theme_var(lua_State *L) { const char *var = luaL_optstring(L, 1, NULL); const char *val = luaL_optstring(L, 2, NULL); if (var && !val) { /* get */ char *p = theme_getvar(var); if (p) { lua_pushstring(L, p); free(p); return 1; } return 0; } if (!val || !var) return 0; /* if (!game_own_theme) return 0; */ if (!opt_owntheme) return 0; if (!strcmp(var, "scr.w") || !strcmp(var, "scr.h")) /* filter resolution */ return 0; if (!theme_setvar((char*)var, (char*)val)) { if (strcmp(var, "win.scroll.mode")) /* let change scroll mode w/o theme reload */ game_theme_changed = 1; } return 0; } static int luaB_theme_name(lua_State *L) { char *name; if (game_own_theme && opt_owntheme) { if (game_own_theme == 2) { name = malloc(strlen(curtheme_dir[THEME_GAME]) + 2); if (!name) return 0; sprintf(name, ".%s", curtheme_dir[THEME_GAME]); lua_pushstring(L, name); free(name); } else { lua_pushstring(L, "."); } } else lua_pushstring(L, curtheme_dir[THEME_GLOBAL]); return 1; } static int luaB_instead_direct(lua_State *L) { int direct = -1; int old = DIRECT_MODE; if (lua_isboolean(L, 1)) direct = lua_toboolean(L, 1); if (direct == -1) { lua_pushboolean(L, old); return 1; } if (!opt_owntheme) { lua_pushboolean(L, 0); return 1; } if (direct) game_theme.gfx_mode = GFX_DIRECT_SET(game_theme.gfx_mode); else { if (game_theme.gfx_mode != GFX_MODE_DIRECT) { game_theme.gfx_mode = GFX_DIRECT_CLR(game_theme.gfx_mode); } } lua_pushboolean(L, 1); return 1; } static unsigned long busy_time = 0; void instead_ready(void) { if (menu_visible() == menu_wait) { menu_toggle(-1); } busy_time = 0; } static int luaB_stead_busy(lua_State *L) { int busy = lua_toboolean(L, 1); if (busy) { struct inp_event ev; int dirty = 0; memset(&ev, 0, sizeof(ev)); if (!game_freezed()) { if (game_bg_modify(NULL)) game_redraw_all(); game_flip(); } while (input(&ev, 0) == AGAIN); if (ev.type == MOUSE_MOTION) { game_cursor(CURSOR_ON); /* to make all happy */ dirty = 1; } if (!busy_time) busy_time = gfx_ticks(); if (gfx_ticks() - busy_time >= 750 && menu_visible() != menu_wait) { game_menu(menu_wait); dirty = 1; } if (dirty) game_gfx_commit(0); return 0; } instead_ready(); return 0; } static int luaB_mouse_pos(lua_State *L) { int x = luaL_optnumber(L, 1, -1); int y = luaL_optnumber(L, 2, -1); int m; float v = game_theme.scale; if (x != -1 && y != -1) { x *= v; y *= v; gfx_warp_cursor(x + game_theme.xoff, y + game_theme.yoff); x = -1; y = -1; } m = gfx_cursor(&x, &y); x = (x - game_theme.xoff) / v; y = (y - game_theme.yoff) / v; lua_pushinteger(L, x); lua_pushinteger(L, y); lua_pushinteger(L, m); return 3; } static int luaB_finger_pos(lua_State *L) { int x, y; float pressure; float v = game_theme.scale; const char *finger = luaL_optstring(L, 1, NULL); if (!finger) return 0; if (finger_pos(finger, &x, &y, &pressure)) /* no finger */ return 0; x = (x - game_theme.xoff) / v; y = (y - game_theme.yoff) / v; lua_pushinteger(L, x); lua_pushinteger(L, y); lua_pushnumber(L, pressure); return 3; } extern int mouse_filter_delay; static int luaB_mouse_filter(lua_State *L) { int d = luaL_optnumber(L, 1, -1); int ov = mouse_filter_delay; if (d != -1) mouse_filter_delay = d; lua_pushinteger(L, ov); return 1; } static int luaB_mouse_show(lua_State *L) { int show = lua_toboolean(L, 1); int ov = game_cursor_show; if (lua_isboolean(L, 1)) game_cursor_show = show; lua_pushboolean(L, ov); return 1; } static int luaB_get_ticks(lua_State *L) { lua_pushinteger(L, gfx_ticks()); return 1; } static int luaB_get_themespath(lua_State *L) { char themes_path[PATH_MAX]; if (THEMES_PATH[0] != '/') { strcpy(themes_path, instead_cwd()); strcat(themes_path, "/"); } else themes_path[0] = 0; strcat(themes_path, THEMES_PATH); unix_path(themes_path); lua_pushstring(L, themes_path); return 1; } #define PIXELS_MAGIC 0x1980 struct lua_pixels { int type; int w; int h; float scale; size_t size; img_t img; int dirty; int direct; }; static int pixels_size(lua_State *L) { struct lua_pixels *hdr = (struct lua_pixels*)lua_touserdata(L, 1); if (!hdr || hdr->type != PIXELS_MAGIC) return 0; lua_pushinteger(L, hdr->w); lua_pushinteger(L, hdr->h); lua_pushnumber(L, hdr->scale); return 3; } #define PXL_BLEND_COPY 1 #define PXL_BLEND_BLEND 2 static __inline void blend(unsigned char *s, unsigned char *d) { unsigned int r, g, b, a; unsigned int sa = s[3]; unsigned int da = d[3]; a = sa + (da * (255 - sa) >> 8); r = ((unsigned int)s[0] * sa >> 8) + ((unsigned int)d[0] * da * (255 - sa) >> 16); g = ((unsigned int)s[1] * sa >> 8) + ((unsigned int)d[1] * da * (255 - sa) >> 16); b = ((unsigned int)s[2] * sa >> 8) + ((unsigned int)d[2] * da * (255 - sa) >> 16); d[0] = r; d[1] = g; d[2] = b; d[3] = a; } static __inline void draw(unsigned char *s, unsigned char *d) { unsigned int r, g, b, a; unsigned int sa = s[3]; a = 255; r = ((unsigned int)s[0] * sa >> 8) + ((unsigned int)d[0] * (255 - sa) >> 8); g = ((unsigned int)s[1] * sa >> 8) + ((unsigned int)d[1] * (255 - sa) >> 8); b = ((unsigned int)s[2] * sa >> 8) + ((unsigned int)d[2] * (255 - sa) >> 8); d[0] = r; d[1] = g; d[2] = b; d[3] = a; } static __inline void pixel(unsigned char *s, unsigned char *d) { unsigned char a_src = s[3]; unsigned char a_dst = d[3]; if (a_src == 255 || a_dst == 0) { memcpy(d, s, 4); } else if (a_dst == 255) { draw(s, d); } else if (a_src == 0) { /* nothing to do */ } else { blend(s, d); } } static __inline void line0(struct lua_pixels *hdr, int x1, int y1, int dx, int dy, int xd, unsigned char *col) { int dy2 = dy * 2; int dyx2 = dy2 - dx * 2; int err = dy2 - dx; unsigned char *ptr = NULL; int w = hdr->w; int h = hdr->h; int ly = w * 4; int lx = xd * 4; while ((x1 < 0 || y1 < 0 || x1 >= w) && dx --) { if (err >= 0) { y1 ++; err += dyx2; } else { err += dy2; } x1 += xd; } if (dx < 0) return; ptr = (unsigned char*)(hdr + 1); ptr += (y1 * w + x1) << 2; pixel(col, ptr); while (dx --) { if (err >= 0) { y1 ++; if (y1 >= h) break; ptr += ly; err += dyx2; } else { err += dy2; } x1 += xd; if (x1 >= w || x1 < 0) break; ptr += lx; pixel(col, ptr); } return; } static __inline void line1(struct lua_pixels *hdr, int x1, int y1, int dx, int dy, int xd, unsigned char *col) { int dx2 = dx * 2; int dxy2 = dx2 - dy * 2; int err = dx2 - dy; int w = hdr->w; int h = hdr->h; unsigned char *ptr = NULL; int ly = w * 4; int lx = xd * 4; while ((x1 < 0 || y1 < 0 || x1 >= w) && dy --) { if (err >= 0) { x1 += xd; err += dxy2; } else { err += dx2; } y1 ++; } if (dy < 0) return; ptr = (unsigned char*)(hdr + 1); ptr += (y1 * w + x1) << 2; pixel(col, ptr); while (dy --) { if (err >= 0) { x1 += xd; if (x1 < 0 || x1 >= w) break; ptr += lx; err += dxy2; } else { err += dx2; } y1 ++; if (y1 >= h) break; ptr += ly; pixel(col, ptr); } return; } static void lineAA(struct lua_pixels *src, int x0, int y0, int x1, int y1, int r, int g, int b, int a) { int dx, dy, err, e2, sx; int w, h; int syp, sxp, ed; unsigned char *ptr; unsigned char col[4]; col[0] = r; col[1] = g; col[2] = b; col[3] = a; if (y0 > y1) { int tmp; tmp = x0; x0 = x1; x1 = tmp; tmp = y0; y0 = y1; y1 = tmp; } w = src->w; h = src->h; if (y1 < 0 || y0 >= h) return; if (x0 < x1) { sx = 1; if (x0 >= w || x1 < 0) return; } else { sx = -1; if (x1 >= w || x0 < 0) return; } sxp = sx * 4; syp = w * 4; dx = abs(x1 - x0); dy = y1 - y0; err = dx - dy; ed = dx + dy == 0 ? 1: sqrt((float)dx * dx + (float)dy * dy); while (y0 < 0 || x0 < 0 || x0 >= w) { e2 = err; if (2 * e2 >= -dx) { if (x0 == x1) break; err -= dy; x0 += sx; } if (2 * e2 <= dy) { if (y0 == y1) break; err += dx; y0 ++; } } if (y0 < 0 || x0 < 0 || x0 >= w) return; ptr = (unsigned char*)(src + 1); ptr += (y0 * w + x0) << 2; while (1) { unsigned char *optr = ptr; col[3] = a - a * abs(err - dx + dy) / ed; pixel(col, ptr); e2 = err; if (2 * e2 >= -dx) { if (x0 == x1) break; if (e2 + dy < ed) { col[3] = a - a * (e2 + dy) / ed; pixel(col, ptr + syp); } err -= dy; x0 += sx; if (x0 < 0 || x0 >= w) break; ptr += sxp; } if (2 * e2 <= dy) { if (y0 == y1) break; if (dx - e2 < ed) { col[3] = a - a * (dx - e2) / ed; pixel(col, optr + sxp); } err += dx; y0 ++; if (y0 >= h) break; ptr += syp; } } src->dirty = 1; } static void line(struct lua_pixels *src, int x1, int y1, int x2, int y2, int r, int g, int b, int a) { int dx, dy, tmp; unsigned char col[4]; if (y1 > y2) { tmp = y1; y1 = y2; y2 = tmp; tmp = x1; x1 = x2; x2 = tmp; } col[0] = r; col[1] = g; col[2] = b; col[3] = a; if (y1 >= src->h) return; if (y2 < 0) return; if (x1 < x2) { if (x2 < 0) return; if (x1 >= src->w) return; } else { if (x1 < 0) return; if (x2 >= src->w) return; } dx = x2 - x1; dy = y2 - y1; if (dx > 0) { if (dx > dy) { line0(src, x1, y1, dx, dy, 1, col); } else { line1(src, x1, y1, dx, dy, 1, col); } } else { dx = -dx; if (dx > dy) { line0(src, x1, y1, dx, dy, -1, col); } else { line1(src, x1, y1, dx, dy, -1, col); } } src->dirty = 1; } static int _pixels_blend(struct lua_pixels *src, int x, int y, int w, int h, struct lua_pixels *dst, int xx, int yy, int mode) { unsigned char *ptr1, *ptr2; int cy, cx, srcw, dstw; if (!w) w = src->w; if (!h) h = src->h; if (x < 0 || x + w > src->w) return 0; if (y < 0 || y + h > src->h) return 0; if (w <= 0 || h <= 0) return 0; if (xx < 0) { w += xx; x -= xx; xx = 0; } if (yy < 0) { h += yy; y -= yy; yy = 0; } if (w <= 0 || h <= 0) return 0; if (xx >= dst->w || yy >= dst->h) return 0; if (xx + w > dst->w) w = dst->w - xx; if (yy + h > dst->h) h = dst->h - yy; ptr1 = (unsigned char *)(src + 1); ptr2 = (unsigned char *)(dst + 1); ptr1 += (y * src->w + x) << 2; ptr2 += (yy * dst->w + xx) << 2; srcw = src->w * 4; dstw = dst->w * 4; dst->dirty = 1; for (cy = 0; cy < h; cy ++) { if (mode == PXL_BLEND_COPY) memcpy(ptr2, ptr1, w << 2); else { unsigned char *p2 = ptr2; unsigned char *p1 = ptr1; for (cx = 0; cx < w; cx ++) { pixel(p1, p2); p1 += 4; p2 += 4; } } ptr2 += dstw; ptr1 += srcw; } return 0; } static int pixels_copy(lua_State *L) { int x = 0, y = 0, w = 0, h = 0, xx = 0, yy = 0; struct lua_pixels *src, *dst; src = (struct lua_pixels*)lua_touserdata(L, 1); dst = (struct lua_pixels*)lua_touserdata(L, 2); if (!dst) { x = luaL_optnumber(L, 2, 0); y = luaL_optnumber(L, 3, 0); w = luaL_optnumber(L, 4, 0); h = luaL_optnumber(L, 5, 0); dst = (struct lua_pixels*)lua_touserdata(L, 6); xx = luaL_optnumber(L, 7, 0); yy = luaL_optnumber(L, 8, 0); } else { xx = luaL_optnumber(L, 3, 0); yy = luaL_optnumber(L, 4, 0); } if (!src || src->type != PIXELS_MAGIC) return 0; if (!dst || dst->type != PIXELS_MAGIC) return 0; return _pixels_blend(src, x, y, w, h, dst, xx, yy, PXL_BLEND_COPY); } static int pixels_blend(lua_State *L) { int x = 0, y = 0, w = 0, h = 0, xx = 0, yy = 0; struct lua_pixels *src, *dst; src = (struct lua_pixels*)lua_touserdata(L, 1); dst = (struct lua_pixels*)lua_touserdata(L, 2); if (!dst) { x = luaL_optnumber(L, 2, 0); y = luaL_optnumber(L, 3, 0); w = luaL_optnumber(L, 4, 0); h = luaL_optnumber(L, 5, 0); dst = (struct lua_pixels*)lua_touserdata(L, 6); xx = luaL_optnumber(L, 7, 0); yy = luaL_optnumber(L, 8, 0); } else { xx = luaL_optnumber(L, 3, 0); yy = luaL_optnumber(L, 4, 0); } if (!src || src->type != PIXELS_MAGIC) return 0; if (!dst || dst->type != PIXELS_MAGIC) return 0; return _pixels_blend(src, x, y, w, h, dst, xx, yy, PXL_BLEND_BLEND); } static void _fill(struct lua_pixels *src, int x, int y, int w, int h, int r, int g, int b, int a, int mode) { unsigned char col[4]; unsigned char *ptr1; int cy, cx; if (!src || src->type != PIXELS_MAGIC) return; col[0] = r; col[1] = g; col[2] = b; col[3] = a; if (!w) w = src->w; if (!h) h = src->h; if (x < 0) { w += x; x = 0; } if (y < 0) { h += y; y = 0; } if (w <= 0 || h <= 0 || x >= src->w || y >= src->h) return; if (x + w > src->w) w = src->w - x; if (y + h > src->h) h = src->h - y; ptr1 = (unsigned char *)(src + 1); ptr1 += (y * src->w + x) << 2; src->dirty = 1; for (cy = 0; cy < h; cy ++) { unsigned char *p1 = ptr1; for (cx = 0; cx < w; cx ++) { if (mode == PXL_BLEND_COPY) memcpy(p1, col, 4); else pixel(col, p1); p1 += 4; } ptr1 += (src->w * 4); } return; } static __inline int orient2d(int ax, int ay, int bx, int by, int cx, int cy) { return (bx - ax) * (cy - ay) - (by - ay) * (cx - ax); } static __inline int min3(int a, int b, int c) { if (a < b) { if (a < c) return a; return c; } else { if (b < c) return b; return c; } } static __inline int max3(int a, int b, int c) { if (a > b) { if (a > c) return a; return c; } else { if (b > c) return b; return c; } } static void triangle(struct lua_pixels *src, int x0, int y0, int x1, int y1, int x2, int y2, int r, int g, int b, int a) { int A01 = y0 - y1, B01 = x1 - x0; int A12 = y1 - y2, B12 = x2 - x1; int A20 = y2 - y0, B20 = x0 - x2; int minx = min3(x0, x1, x2); int miny = min3(y0, y1, y2); int maxx = max3(x0, x1, x2); int maxy = max3(y0, y1, y2); int w0_row = orient2d(x1, y1, x2, y2, minx, miny); int w1_row = orient2d(x2, y2, x0, y0, minx, miny); int w2_row = orient2d(x0, y0, x1, y1, minx, miny); int y, x, w, h; int yd; unsigned char col[4]; unsigned char *ptr; w = src->w; h = src->h; yd = 4 * w; col[0] = r; col[1] = b; col[2] = g; col[3] = a; if (minx >= w || miny >= h) return; if (minx < 0) minx = 0; if (miny < 0) miny = 0; if (maxy >= h) maxy = h - 1; if (maxx >= w) maxx = w - 1; ptr = (unsigned char *)(src + 1) + miny * yd + 4 * minx; src->dirty = 1; for (y = miny; y <= maxy; y ++) { int w0 = w0_row; int w1 = w1_row; int w2 = w2_row; unsigned char *p = ptr; for (x = minx; x <= maxx; x++) { if ((w0 | w1 | w2) >= 0) pixel(col, p); p += 4; w0 += A12; w1 += A20; w2 += A01; } w0_row += B12; w1_row += B20; w2_row += B01; ptr += yd; } } static void fill_circle(struct lua_pixels *src, int xc, int yc, int radius, int r, int g, int b, int a) { int r2 = radius * radius; int x, y, x1, x2, y1, y2; unsigned char col[4] = { r, g, b, a }; int w = src->w, h = src->h; unsigned char *ptr; if (xc + radius < 0 || yc + radius < 0) return; if (xc - radius >= w || yc - radius >= h) return; if (radius <= 0) return; ptr = (unsigned char *)(src + 1); src->dirty = 1; ptr += (w * yc + xc) << 2; if (radius == 1) { pixel(col, ptr); return; } y1 = -radius; y2 = radius; x1 = -radius; x2 = radius; if (yc - radius < 0) y1 = -yc; if (xc - radius < 0) x1 = -xc; if (xc + radius >= w) x2 = w - xc - 1; if (yc + radius >= h) y2 = h - yc - 1; for (y = y1; y <= y2; y ++) { unsigned char *ptrl = ptr + ((y * w + x1) << 2); for (x = x1; x <= x2; x++) { if (x*x + y*y < r2 - 1) pixel(col, ptrl); ptrl += 4; } } } static void circle(struct lua_pixels *src, int xc, int yc, int rr, int r, int g, int b, int a) { int x = -rr, y = 0, err = 2 - 2 * rr; unsigned char *ptr = (unsigned char *)(src + 1); unsigned char col[4] = { r, g, b, a }; int w = src->w, h = src->h; if (rr <= 0) return; if (xc + rr < 0 || yc + rr < 0) return; if (xc - rr >= w || yc - rr >= h) return; src->dirty = 1; ptr += (w * yc + xc) * 4; if (xc - rr >= 0 && xc + rr < w && yc - rr >=0 && yc + rr < h) { do { int xmy = (x - y * w) * 4; int yax = (y + x * w) * 4; pixel(col, ptr - xmy); pixel(col, ptr - yax); pixel(col, ptr + xmy); pixel(col, ptr + yax); rr = err; if (rr <= y) err += ++y * 2 + 1; if (rr > x || err > y) err += ++x * 2 + 1; } while (x < 0); return; } /* slow */ do { int xmy = (x - y * w) * 4; int yax = (y + x * w) * 4; if (((xc - x) | (w - xc + x - 1) | (yc + y) | (h - yc - y - 1)) >= 0) pixel(col, ptr - xmy); if (((xc - y) | (w - xc + y - 1) | (yc - x) | (h - yc + x - 1)) >= 0) pixel(col, ptr - yax); if (((xc + x) | (w - xc - x - 1) | (yc - y) | (h - yc + y - 1)) >= 0) pixel(col, ptr + xmy); if (((xc + y) | (w - xc - y - 1) | (yc + x) | (h - yc - x - 1)) >= 0) pixel(col, ptr + yax); rr = err; if (rr <= y) err += ++y * 2 + 1; if (rr > x || err > y) err += ++x * 2 + 1; } while (x < 0); } static void circleAA(struct lua_pixels *src, int xc, int yc, int rr, int r, int g, int b, int a) { int p1, p2, p3, p4; int x = -rr, y = 0, x2, e2, err = 2 - 2 * rr; unsigned char *ptr = (unsigned char *)(src + 1); unsigned char col[4] = { r, g, b, a }; int w = src->w, h = src->h; if (rr <= 0) return; if (xc + rr < 0 || yc + rr < 0) return; if (xc - rr >= w || yc - rr >= h) return; src->dirty = 1; rr = 1 - err; ptr += (w * yc + xc) * 4; do { int i = 255 * abs(err - 2 *(x + y)-2) / rr; int xmy = (x - y * w) * 4; int yax = (y + x * w) * 4; col[3] = ((255 - i) * a) >> 8; p1 = 0; p2 = 0; p3 = 0; p4 = 0; if (((xc - x) | (w - xc + x - 1) | (yc + y) | (h - yc - y - 1)) >= 0) { pixel(col, ptr - xmy); p1 = 1; } if (((xc - y) | (w - xc + y - 1) | (yc - x) | (h - yc + x - 1)) >= 0) { pixel(col, ptr - yax); p2 = 1; } if (((xc + x) | (w - xc - x - 1) | (yc - y) | (h - yc + y - 1)) >= 0) { pixel(col, ptr + xmy); p3 = 1; } if (((xc + y) | (w - xc - y - 1) | (yc + x) | (h - yc - x - 1)) >= 0) { pixel(col, ptr + yax); p4 = 1; } e2 = err; x2 = x; if (err + y > 0) { i = 255 * (err - 2 * x - 1) / rr; if (i < 256) { col[3] = ((255 - i) * a) >> 8; if (p1 && yc + y + 1 < h) pixel(col, ptr - xmy + w * 4); if (p2 && xc - y - 1 >= 0) pixel(col, ptr - yax - 4); if (p3 && yc - y - 1 >= 0) pixel(col, ptr + xmy - w * 4); if (p4 && xc + y < w) pixel(col, ptr + yax + 4); } err += ++x * 2 + 1; } if (e2 + x <= 0) { i = 255 * (2 * y + 3 - e2) / rr; if (i < 256) { col[3] = ((255 - i) * a) >> 8; if (p1 && xc - x2 - 1 >= 0) pixel(col, ptr - xmy - 4); if (p2 && yc - x2 - 1 >= 0) pixel(col, ptr - yax - w * 4); if (p3 && xc + x2 + 1 < w) pixel(col, ptr + xmy + 4); if (p4 && yc + x2 + 1 < h) pixel(col, ptr + yax + w * 4); } err += ++y * 2 + 1; } } while (x < 0); } static int pixels_fill(lua_State *L) { int x = 0, y = 0, w = 0, h = 0, r = 0, g = 0, b = 0, a = 255; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; b = luaL_optnumber(L, 8, -1); if (b < 0) { r = luaL_optnumber(L, 2, 0); g = luaL_optnumber(L, 3, 0); b = luaL_optnumber(L, 4, 0); a = luaL_optnumber(L, 5, 255); } else { x = luaL_optnumber(L, 2, 0); y = luaL_optnumber(L, 3, 0); w = luaL_optnumber(L, 4, 0); h = luaL_optnumber(L, 5, 0); r = luaL_optnumber(L, 6, 0); g = luaL_optnumber(L, 7, 0); b = luaL_optnumber(L, 8, 0); a = luaL_optnumber(L, 9, 255); } _fill(src, x, y, w, h, r, g, b, a, PXL_BLEND_BLEND); return 0; } static int pixels_clear(lua_State *L) { int x = 0, y = 0, w = 0, h = 0, r = 0, g = 0, b = 0, a = 0; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; b = luaL_optnumber(L, 8, -1); if (b < 0) { r = luaL_optnumber(L, 2, 0); g = luaL_optnumber(L, 3, 0); b = luaL_optnumber(L, 4, 0); a = luaL_optnumber(L, 5, 0); } else { x = luaL_optnumber(L, 2, 0); y = luaL_optnumber(L, 3, 0); w = luaL_optnumber(L, 4, 0); h = luaL_optnumber(L, 5, 0); r = luaL_optnumber(L, 6, 0); g = luaL_optnumber(L, 7, 0); b = luaL_optnumber(L, 8, 0); a = luaL_optnumber(L, 9, 0); } _fill(src, x, y, w, h, r, g, b, a, PXL_BLEND_COPY); return 0; } static int pixels_triangle(lua_State *L) { int x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0, r = 0, g = 0, b = 0, a = 0; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; x0 = luaL_optnumber(L, 2, 0); y0 = luaL_optnumber(L, 3, 0); x1 = luaL_optnumber(L, 4, 0); y1 = luaL_optnumber(L, 5, 0); x2 = luaL_optnumber(L, 6, 0); y2 = luaL_optnumber(L, 7, 0); r = luaL_optnumber(L, 8, 0); g = luaL_optnumber(L, 9, 0); b = luaL_optnumber(L, 10, 0); a = luaL_optnumber(L, 11, 255); triangle(src, x0, y0, x1, y1, x2, y2, r, g, b, a); return 0; } static int pixels_line(lua_State *L) { int x1 = 0, y1 = 0, x2 = 0, y2 = 0, r = 0, g = 0, b = 0, a = 255; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; x1 = luaL_optnumber(L, 2, 0); y1 = luaL_optnumber(L, 3, 0); x2 = luaL_optnumber(L, 4, 0); y2 = luaL_optnumber(L, 5, 0); r = luaL_optnumber(L, 6, 0); g = luaL_optnumber(L, 7, 0); b = luaL_optnumber(L, 8, 0); a = luaL_optnumber(L, 9, 255); line(src, x1, y1, x2, y2, r, g, b, a); return 0; } static int pixels_lineAA(lua_State *L) { int x1 = 0, y1 = 0, x2 = 0, y2 = 0, r = 0, g = 0, b = 0, a = 255; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; x1 = luaL_optnumber(L, 2, 0); y1 = luaL_optnumber(L, 3, 0); x2 = luaL_optnumber(L, 4, 0); y2 = luaL_optnumber(L, 5, 0); r = luaL_optnumber(L, 6, 0); g = luaL_optnumber(L, 7, 0); b = luaL_optnumber(L, 8, 0); a = luaL_optnumber(L, 9, 255); lineAA(src, x1, y1, x2, y2, r, g, b, a); return 0; } static int pixels_circle(lua_State *L) { int xc = 0, yc = 0, rr = 0, r = 0, g = 0, b = 0, a = 255; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; xc = luaL_optnumber(L, 2, 0); yc = luaL_optnumber(L, 3, 0); rr = luaL_optnumber(L, 4, 0); r = luaL_optnumber(L, 5, 0); g = luaL_optnumber(L, 6, 0); b = luaL_optnumber(L, 7, 0); a = luaL_optnumber(L, 8, 255); circle(src, xc, yc, rr, r, g, b, a); return 0; } static int pixels_circleAA(lua_State *L) { int xc = 0, yc = 0, rr = 0, r = 0, g = 0, b = 0, a = 255; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; xc = luaL_optnumber(L, 2, 0); yc = luaL_optnumber(L, 3, 0); rr = luaL_optnumber(L, 4, 0); r = luaL_optnumber(L, 5, 0); g = luaL_optnumber(L, 6, 0); b = luaL_optnumber(L, 7, 0); a = luaL_optnumber(L, 8, 255); circleAA(src, xc, yc, rr, r, g, b, a); return 0; } static int pixels_fill_circle(lua_State *L) { int xc = 0, yc = 0, rr = 0, r = 0, g = 0, b = 0, a = 255; struct lua_pixels *src; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; xc = luaL_optnumber(L, 2, 0); yc = luaL_optnumber(L, 3, 0); rr = luaL_optnumber(L, 4, 0); r = luaL_optnumber(L, 5, 0); g = luaL_optnumber(L, 6, 0); b = luaL_optnumber(L, 7, 0); a = luaL_optnumber(L, 8, 255); fill_circle(src, xc, yc, rr, r, g, b, a); return 0; } struct lua_point { int x; int y; int nodex; }; /* http://alienryderflex.com/polygon_fill/ public-domain code by Darel Rex Finley, 2007 */ static void fill_poly(struct lua_pixels *src, struct lua_point *v, int nr, unsigned char *col) { unsigned char *ptr = (unsigned char *)(src + 1), *ptr1; int y, x, xmin, xmax, ymin, ymax, swap, w; int nodes = 0, j, i; xmin = v[0].x; xmax = v[0].x; ymin = v[0].y; ymax = v[0].y; for (i = 0; i < nr; i++) { if (v[i].x < xmin) xmin = v[i].x; if (v[i].x > xmax) xmax = v[i].x; if (v[i].y < ymin) ymin = v[i].y; if (v[i].y > ymax) ymax = v[i].y; } if (ymin < 0) ymin = 0; if (xmin < 0) xmin = 0; if (xmax >= src->w) xmax = src->w; if (ymax >= src->h) ymax = src->h; ptr += (ymin * src->w) << 2; for (y = ymin; y < ymax; y ++) { nodes = 0; j = nr - 1; for (i = 0; i < nr; i++) { if ((v[i].y < y && v[j].y >= y) || (v[j].y < y && v[i].y >= y)) { v[nodes ++].nodex = v[i].x + ((y - v[i].y) * (v[j].x - v[i].x)) / (v[j].y - v[i].y); } j = i; } if (nodes < 2) goto skip; i = 0; while (i < nodes - 1) { /* sort */ if (v[i].nodex > v[i + 1].nodex) { swap = v[i].nodex; v[i].nodex = v[i + 1].nodex; v[i + 1].nodex = swap; if (i) i --; } else { i ++; } } for (i = 0; i < nodes; i += 2) { if (v[i].nodex >= xmax) break; if (v[i + 1].nodex > xmin) { if (v[i].nodex < xmin) v[i].nodex = xmin; if (v[i + 1].nodex > xmax) v[i + 1].nodex = xmax; // hline src->dirty = 1; w = (v[i + 1].nodex - v[i].nodex); ptr1 = ptr + v[i].nodex * 4; for (x = 0; x < w; x ++) { pixel(col, ptr1); ptr1 += 4; } } } skip: ptr += src->w * 4; } } static int pixels_fill_poly(lua_State *L) { int nr, i; struct lua_pixels *src; struct lua_point *v; unsigned char col[4]; src = (struct lua_pixels*)lua_touserdata(L, 1); if (!src || src->type != PIXELS_MAGIC) return 0; luaL_checktype(L, 2, LUA_TTABLE); #if LUA_VERSION_NUM >= 502 nr = lua_rawlen(L, 2); #else nr = lua_objlen(L, 2); #endif if (nr < 6) return 0; col[0] = luaL_optnumber(L, 3, 0); col[1] = luaL_optnumber(L, 4, 0); col[2] = luaL_optnumber(L, 5, 0); col[3] = luaL_optnumber(L, 6, 255); nr /= 2; v = malloc(sizeof(*v) * nr); if (!v) return 0; lua_pushvalue(L, 2); for (i = 0; i < nr; i++) { lua_pushinteger(L, (i * 2) + 1); lua_gettable(L, -2); v[i].x = lua_tonumber(L, -1); lua_pop(L, 1); lua_pushinteger(L, (i * 2) + 2); lua_gettable(L, -2); v[i].y = lua_tonumber(L, -1); lua_pop(L, 1); } lua_pop(L, 1); fill_poly(src, v, nr, col); free(v); return 0; } static int pixels_value(lua_State *L) { struct lua_pixels *hdr = (struct lua_pixels*)lua_touserdata(L, 1); int x = luaL_optnumber(L, 2, -1); int y = luaL_optnumber(L, 3, -1); int r = luaL_optnumber(L, 4, -1); int g = 0, b = 0, a = 0; unsigned char *ptr; if (r != -1) { g = luaL_optnumber(L, 5, 0); b = luaL_optnumber(L, 6, 0); a = luaL_optnumber(L, 7, 255); } if (x < 0 || y < 0) return 0; if (!hdr || hdr->type != PIXELS_MAGIC) return 0; if (x >= hdr->w || y >= hdr->h) return 0; ptr = (unsigned char*)(hdr + 1); ptr += ((y * hdr->w + x) << 2); if (r == -1) { lua_pushinteger(L, *(ptr ++)); lua_pushinteger(L, *(ptr ++)); lua_pushinteger(L, *(ptr ++)); lua_pushinteger(L, *ptr); return 4; } hdr->dirty = 1; *(ptr ++) = r; *(ptr ++) = g; *(ptr ++) = b; *(ptr) = a; return 0; } static int pixels_pixel(lua_State *L) { struct lua_pixels *hdr = (struct lua_pixels*)lua_touserdata(L, 1); int x = luaL_optnumber(L, 2, -1); int y = luaL_optnumber(L, 3, -1); int r = luaL_optnumber(L, 4, -1); int g, b, a; unsigned char col[4]; unsigned char *ptr; if (r == -1) return 0; g = luaL_optnumber(L, 5, 0); b = luaL_optnumber(L, 6, 0); a = luaL_optnumber(L, 7, 255); if (x < 0 || y < 0) return 0; if (!hdr || hdr->type != PIXELS_MAGIC) return 0; if (x >= hdr->w || y >= hdr->h) return 0; hdr->dirty = 1; ptr = (unsigned char*)(hdr + 1); ptr += ((y * hdr->w + x) << 2); col[0] = r; col[1] = g; col[2] = b; col[3] = a; pixel(col, ptr); return 0; } static img_t pixels_img(struct lua_pixels *hdr) { int w, h, ww, hh, xx, yy, dx, dy; unsigned char *ptr, *optr = NULL; unsigned char *p; img_t img; if (!hdr) return NULL; if (hdr->type != PIXELS_MAGIC) return NULL; img = hdr->img; if (!img) return NULL; if (hdr->direct || !hdr->dirty) return img; hdr->dirty = 0; ptr = (unsigned char*)(hdr + 1); ww = gfx_img_w(img); hh = gfx_img_h(img); w = hdr->w; h = hdr->h; p = gfx_get_pixels(img); if (!p) return NULL; dy = 0; for (yy = 0; yy < hh; yy++) { unsigned char *ptrl = ptr; dx = 0; if (optr) { memcpy(p, optr, ww * 4); p += ww * 4; } else { optr = p; for (xx = 0; xx < ww; xx++) { memcpy(p, ptrl, 4); p += 4; dx += w; while (dx >= ww) { dx -= ww; ptrl += 4; } } } dy += h; while (dy >= hh) { dy -= hh; ptr += (w << 2); optr = NULL; } } gfx_put_pixels(img); return img; } static int pixels_destroy(lua_State *L) { struct lua_pixels *hdr = (struct lua_pixels*)lua_touserdata(L, 1); if (!hdr || hdr->type != PIXELS_MAGIC) return 0; if (hdr->img) gfx_free_image(hdr->img); return 0; } static int pixels_new(lua_State *L, int w, int h, float scale, img_t src) { int ww, hh, direct = 0; img_t img2 = NULL, img; size_t size; float v = game_theme.scale; struct lua_pixels *hdr; if (src) { w = gfx_img_w(src); h = gfx_img_h(src); img2 = gfx_new_rgba(w, h); if (!img2) return 0; gfx_copy_from(src, 0, 0, w, h, img2, 0, 0); } if (w <=0 || h <= 0) return 0; ww = w; hh = h; if (v != 1.0f) { ww = ceil((float)w * v); hh = ceil((float)h * v); } ww = ceil((float)ww * scale); hh = ceil((float)hh * scale); size = w * h * 4; hdr = lua_newuserdata(L, sizeof(*hdr) + size); if (!hdr) { if (img2) gfx_free_image(img2); return 0; } hdr->type = PIXELS_MAGIC; hdr->img = NULL; hdr->w = w; hdr->h = h; hdr->scale = scale; hdr->size = size; hdr->dirty = 0; if (ww == w && hh == h) { /* direct map */ direct = 1; img = gfx_new_from(ww, hh, (unsigned char*)(hdr + 1)); } else { img = gfx_new_rgba(ww, hh); } hdr->direct = direct; if (!img) { fprintf(stderr, "Error: no free memory\n"); memset(hdr, 0, sizeof(*hdr) + size); if (img2) gfx_free_image(img2); return 1; } hdr->img = img; if (img2) { unsigned char *ptr = gfx_get_pixels(img2); if (ptr) { memcpy(hdr + 1, ptr, size); gfx_put_pixels(img2); } gfx_free_image(img2); } else { memset(hdr + 1, 0, size); } hdr->dirty = 1; luaL_getmetatable(L, "pixels metatable"); lua_setmetatable(L, -2); return 1; } static int luaB_pixels_sprite(lua_State *L) { const char *fname; int w, h, rc; float scale; img_t img = NULL; if (!lua_isnumber(L, 1)) { fname = luaL_optstring(L, 1, NULL); if (!fname) return 0; img = gfx_load_image((char*)fname); if (!img) return 0; // if (!cache_have(gfx_image_cache(), img)) // v = 1.0f; /* do not scale sprites! */ w = 0; h = 0; scale = luaL_optnumber(L, 2, 1.0f); } else { w = luaL_optnumber(L, 1, -1); h = luaL_optnumber(L, 2, -1); scale = luaL_optnumber(L, 3, 1.0f); } rc = pixels_new(L, w, h, scale, img); if (img) gfx_free_image(img); return rc; } static int pixels_scale(lua_State *L) { img_t img, img2; int rc; struct lua_pixels *src = (struct lua_pixels*)lua_touserdata(L, 1);; float xs = luaL_optnumber(L, 2, 0); float ys = luaL_optnumber(L, 3, 0); int smooth = lua_toboolean(L, 4); if (!src || src->type != PIXELS_MAGIC) return 0; if (ys == 0) ys = xs; img = gfx_new_from(src->w, src->h, (unsigned char*)(src + 1)); if (!img) return 0; img2 = gfx_scale(img, xs, ys, smooth); gfx_free_image(img); rc = pixels_new(L, 0, 0, src->scale, img2); gfx_free_image(img2); return rc; } static int pixels_rotate(lua_State *L) { img_t img, img2; int rc; struct lua_pixels *src = (struct lua_pixels*)lua_touserdata(L, 1);; float angle = luaL_optnumber(L, 2, 0); int smooth = lua_toboolean(L, 3); if (!src || src->type != PIXELS_MAGIC) return 0; img = gfx_new_from(src->w, src->h, (unsigned char*)(src + 1)); if (!img) return 0; img2 = gfx_rotate(img, angle, smooth); gfx_free_image(img); rc = pixels_new(L, 0, 0, src->scale, img2); gfx_free_image(img2); return rc; } /* ** Creates pixels metatable. */ static int pixels_create_meta (lua_State *L) { luaL_newmetatable (L, "pixels metatable"); lua_pushstring (L, "__index"); lua_newtable(L); lua_pushstring (L, "val"); lua_pushcfunction (L, pixels_value); lua_settable(L, -3); lua_pushstring (L, "pixel"); lua_pushcfunction (L, pixels_pixel); lua_settable(L, -3); lua_pushstring (L, "size"); lua_pushcfunction (L, pixels_size); lua_settable(L, -3); lua_pushstring(L, "copy"); lua_pushcfunction (L, pixels_copy); lua_settable(L, -3); lua_pushstring(L, "blend"); lua_pushcfunction (L, pixels_blend); lua_settable(L, -3); lua_pushstring(L, "clear"); lua_pushcfunction (L, pixels_clear); lua_settable(L, -3); lua_pushstring(L, "fill"); lua_pushcfunction (L, pixels_fill); lua_settable(L, -3); lua_pushstring(L, "line"); lua_pushcfunction (L, pixels_line); lua_settable(L, -3); lua_pushstring(L, "lineAA"); lua_pushcfunction (L, pixels_lineAA); lua_settable(L, -3); lua_pushstring(L, "circle"); lua_pushcfunction (L, pixels_circle); lua_settable(L, -3); lua_pushstring(L, "circleAA"); lua_pushcfunction (L, pixels_circleAA); lua_settable(L, -3); lua_pushstring(L, "fill_circle"); lua_pushcfunction (L, pixels_fill_circle); lua_settable(L, -3); lua_pushstring(L, "fill_triangle"); lua_pushcfunction (L, pixels_triangle); lua_settable(L, -3); lua_pushstring(L, "fill_poly"); lua_pushcfunction (L, pixels_fill_poly); lua_settable(L, -3); lua_pushstring(L, "new_scaled"); lua_pushcfunction (L, pixels_scale); lua_settable(L, -3); lua_pushstring(L, "new_rotated"); lua_pushcfunction (L, pixels_rotate); lua_settable(L, -3); lua_settable(L, -3); lua_pushstring (L, "__gc"); lua_pushcfunction (L, pixels_destroy); lua_settable (L, -3); return 0; } static int luaB_noise1(lua_State *L) { float r; int px; float x = luaL_optnumber(L, 1, 0); px = luaL_optnumber(L, 2, 0); if (px > 0) { r = pnoise1(x, px); } else { r = noise1(x); } lua_pushnumber(L, r); return 1; } static int luaB_noise2(lua_State *L) { float r; int px; int py; float x = luaL_optnumber(L, 1, 0); float y = luaL_optnumber(L, 2, 0); px = luaL_optnumber(L, 3, 0); py = luaL_optnumber(L, 4, 0); if (px > 0 && py > 0) { r = pnoise2(x, y, px, py); } else { r = noise2(x, y); } lua_pushnumber(L, r); return 1; } static int luaB_noise3(lua_State *L) { float r; int px; int py; int pz; float x = luaL_optnumber(L, 1, 0); float y = luaL_optnumber(L, 2, 0); float z = luaL_optnumber(L, 3, 0); px = luaL_optnumber(L, 4, 0); py = luaL_optnumber(L, 5, 0); pz = luaL_optnumber(L, 6, 0); if (px > 0 && py > 0 && pz > 0) { r = pnoise3(x, y, z, px, py, pz); } else { r = noise3(x, y, z); } lua_pushnumber(L, r); return 1; } static int luaB_noise4(lua_State *L) { float r; int px; int py; int pz; int pw; float x = luaL_optnumber(L, 1, 0); float y = luaL_optnumber(L, 2, 0); float z = luaL_optnumber(L, 3, 0); float w = luaL_optnumber(L, 4, 0); px = luaL_optnumber(L, 5, 0); py = luaL_optnumber(L, 6, 0); pz = luaL_optnumber(L, 7, 0); pw = luaL_optnumber(L, 8, 0); if (px > 0 && py > 0 && pz > 0 && pw > 0) { r = pnoise4(x, y, z, w, px, py, pz, pw); } else { r = noise4(x, y, z, w); } lua_pushnumber(L, r); return 1; } static int callback_ref = 0; static int render_callback_dirty = 0; int instead_render_callback_dirty(int fl) { int rc = render_callback_dirty; if (!callback_ref || game_freezed()) return 0; if (fl != -1) render_callback_dirty = fl; return rc; } void instead_render_callback(void) { if (!callback_ref || game_freezed() || render_callback_dirty == -1) return; game_cursor(CURSOR_CLEAR); instead_lock(); lua_rawgeti(instead_lua(), LUA_REGISTRYINDEX, callback_ref); in_callback ++; if (instead_pcall(instead_lua(), 0)) { /* on any error */ luaL_unref(instead_lua(), LUA_REGISTRYINDEX, callback_ref); callback_ref = 0; } in_callback --; instead_clear(); instead_unlock(); if (game_pict_modify(NULL)) render_callback_dirty = -1; game_cursor(CURSOR_DRAW); return; } static int luaB_after_callback(lua_State *L) { if (!opt_owntheme) { lua_pushboolean(L, 0); return 1; } if (callback_ref) luaL_unref(L, LUA_REGISTRYINDEX, callback_ref); callback_ref = 0; if (lua_isfunction(L, 1)) callback_ref = luaL_ref(L, LUA_REGISTRYINDEX); lua_pushboolean(L, 0); return 1; } static const luaL_Reg sprites_funcs[] = { {"instead_font_load", luaB_load_font}, {"instead_font_free", luaB_free_font}, {"instead_font_scaled_size", luaB_font_size_scaled}, {"instead_sprite_load", luaB_load_sprite}, {"instead_sprite_text", luaB_text_sprite}, {"instead_sprite_free", luaB_free_sprite}, {"instead_sprites_free", luaB_free_sprites}, {"instead_sprite_draw", luaB_draw_sprite}, {"instead_sprite_copy", luaB_copy_sprite}, {"instead_sprite_compose", luaB_compose_sprite}, {"instead_sprite_fill", luaB_fill_sprite}, {"instead_sprite_dup", luaB_dup_sprite}, {"instead_sprite_alpha", luaB_alpha_sprite}, {"instead_sprite_colorkey", luaB_colorkey_sprite}, {"instead_sprite_size", luaB_sprite_size}, {"instead_sprite_scale", luaB_scale_sprite}, {"instead_sprite_rotate", luaB_rotate_sprite}, {"instead_sprite_text_size", luaB_text_size}, {"instead_sprite_pixel", luaB_pixel_sprite}, {"instead_sprite_pixels", luaB_pixels_sprite}, {"instead_theme_var", luaB_theme_var}, {"instead_theme_name", luaB_theme_name}, {"instead_ticks", luaB_get_ticks}, {"instead_busy", luaB_stead_busy}, {"instead_direct", luaB_instead_direct}, {"instead_mouse_pos", luaB_mouse_pos}, {"instead_mouse_filter", luaB_mouse_filter}, {"instead_mouse_show", luaB_mouse_show}, {"instead_finger_pos", luaB_finger_pos}, {"instead_themespath", luaB_get_themespath}, {"instead_noise1", luaB_noise1}, {"instead_noise2", luaB_noise2}, {"instead_noise3", luaB_noise3}, {"instead_noise4", luaB_noise4}, {"instead_render_callback", luaB_after_callback}, {NULL, NULL} }; static int sprites_done(void) { if (callback_ref) { luaL_unref(instead_lua(), LUA_REGISTRYINDEX, callback_ref); callback_ref = 0; render_callback_dirty = 0; } sprites_free(); return 0; } static int sprites_init(void) { char path[PATH_MAX]; if (pixels_create_meta(instead_lua())) return -1; instead_api_register(sprites_funcs); snprintf(path, sizeof(path), "%s/%s", instead_stead_path(), "/ext/sprites.lua"); return instead_loadfile(dirpath(path)); } static int sprites_err(void) { if (callback_ref) { luaL_unref(instead_lua(), LUA_REGISTRYINDEX, callback_ref); callback_ref = 0; } return 0; } static struct instead_ext ext = { .init = sprites_init, .done = sprites_done, .err = sprites_err, }; int instead_sprites_init(void) { return instead_extension(&ext); } instead-3.2.1/src/graphics.c0000644000175000017500000034370113267071774014745 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" #include #include #include #include #if SDL_VERSION_ATLEAST(2,0,0) #include "SDL2_rotozoom.h" #define SDL_SRCALPHA 0 #else #include "SDL_rotozoom.h" #endif #include "SDL_gfxBlitFunc.h" #include "SDL_anigif.h" #define IMG_ANIGIF 1 struct _img_t { SDL_Surface *s; /* SDL_Texture *t; */ int flags; void *aux; }; #define Surf(p) (((p)?(((img_t)(p))->s):NULL)) #ifndef SDL_malloc #define SDL_malloc malloc #endif #ifndef SDL_free #define SDL_free free #endif static img_t screen = NULL; static cache_t images = NULL; static struct { const char *name; unsigned long val; } cnames[] = { {"aliceblue", 0xf0f8ff}, {"antiquewhite", 0xfaebd7}, {"aqua", 0x00ffff}, {"aquamarine", 0x7fffd4}, {"azure", 0xf0ffff}, {"beige", 0xf5f5dc}, {"bisque", 0xffe4c4}, {"black", 0x000000}, {"blanchedalmond", 0xffebcd}, {"blue", 0x0000ff}, {"blueviolet", 0x8a2be2}, {"brown", 0xa52a2a}, {"burlywood", 0xdeb887}, {"cadetblue", 0x5f9ea0}, {"chartreuse", 0x7fff00}, {"chocolate", 0xd2691e}, {"coral", 0xff7f50}, {"cornflowerblue", 0x6495ed}, {"cornsilk", 0xfff8dc}, {"crimson", 0xdc143c}, {"cyan", 0x00ffff}, {"darkblue", 0x00008b}, {"darkcyan", 0x008b8b}, {"darkgoldenrod", 0xb8860b}, {"darkgray", 0xa9a9a9}, {"darkgrey", 0xa9a9a9}, {"darkgreen", 0x006400}, {"darkkhaki", 0xbdb76b}, {"darkmagenta", 0x8b008b}, {"darkolivegreen", 0x556b2f}, {"darkorange", 0xff8c00}, {"darkorchid", 0x9932cc}, {"darkred", 0x8b0000}, {"darksalmon", 0xe9967a}, {"darkseagreen", 0x8fbc8f}, {"darkslateblue", 0x483d8b}, {"darkslategray", 0x2f4f4f}, {"darkslategrey", 0x2f4f4f}, {"darkturquoise", 0x00ced1}, {"darkviolet", 0x9400d3}, {"deeppink", 0xff1493}, {"deepskyblue", 0x00bfff}, {"dimgray", 0x696969}, {"dimgrey", 0x696969}, {"dodgerblue", 0x1e90ff}, {"feldspar", 0xd19275}, {"firebrick", 0xb22222}, {"floralwhite", 0xfffaf0}, {"forestgreen", 0x228b22}, {"fuchsia", 0xff00ff}, {"gainsboro", 0xdcdcdc}, {"ghostwhite", 0xf8f8ff}, {"gold", 0xffd700}, {"goldenrod", 0xdaa520}, {"gray", 0x808080}, {"grey", 0x808080}, {"green", 0x008000}, {"greenyellow", 0xadff2f}, {"honeydew", 0xf0fff0}, {"hotpink", 0xff69b4}, {"indianred", 0xcd5c5c}, {"indigo", 0x4b0082}, {"ivory", 0xfffff0}, {"khaki", 0xf0e68c}, {"lavender", 0xe6e6fa}, {"lavenderblush", 0xfff0f5}, {"lawngreen", 0x7cfc00}, {"lemonchiffon", 0xfffacd}, {"lightblue", 0xadd8e6}, {"lightcoral", 0xf08080}, {"lightcyan", 0xe0ffff}, {"lightgoldenrodyellow", 0xfafad2}, {"lightgray", 0xd3d3d3}, {"lightgrey", 0xd3d3d3}, {"lightgreen", 0x90ee90}, {"lightpink", 0xffb6c1}, {"lightsalmon", 0xffa07a}, {"lightseagreen", 0x20b2aa}, {"lightskyblue", 0x87cefa}, {"lightslateblue", 0x8470ff}, {"lightslategray", 0x778899}, {"lightslategrey", 0x778899}, {"lightsteelblue", 0xb0c4de}, {"lightyellow", 0xffffe0}, {"lime", 0x00ff00}, {"limegreen", 0x32cd32}, {"linen", 0xfaf0e6}, {"magenta", 0xff00ff}, {"maroon", 0x800000}, {"mediumaquamarine", 0x66cdaa}, {"mediumblue", 0x0000cd}, {"mediumorchid", 0xba55d3}, {"mediumpurple", 0x9370d8}, {"mediumseagreen", 0x3cb371}, {"mediumslateblue", 0x7b68ee}, {"mediumspringgreen", 0x00fa9a}, {"mediumturquoise", 0x48d1cc}, {"mediumvioletred", 0xc71585}, {"midnightblue", 0x191970}, {"mintcream", 0xf5fffa}, {"mistyrose", 0xffe4e1}, {"moccasin", 0xffe4b5}, {"navajowhite", 0xffdead}, {"navy", 0x000080}, {"oldlace", 0xfdf5e6}, {"olive", 0x808000}, {"olivedrab", 0x6b8e23}, {"orange", 0xffa500}, {"orangered", 0xff4500}, {"orchid", 0xda70d6}, {"palegoldenrod", 0xeee8aa}, {"palegreen", 0x98fb98}, {"paleturquoise", 0xafeeee}, {"palevioletred", 0xd87093}, {"papayawhip", 0xffefd5}, {"peachpuff", 0xffdab9}, {"peru", 0xcd853f}, {"pink", 0xffc0cb}, {"plum", 0xdda0dd}, {"powderblue", 0xb0e0e6}, {"purple", 0x800080}, {"red", 0xff0000}, {"rosybrown", 0xbc8f8f}, {"royalblue", 0x4169e1}, {"saddlebrown", 0x8b4513}, {"salmon", 0xfa8072}, {"sandybrown", 0xf4a460}, {"seagreen", 0x2e8b57}, {"seashell", 0xfff5ee}, {"sienna", 0xa0522d}, {"silver", 0xc0c0c0}, {"skyblue", 0x87ceeb}, {"slateblue", 0x6a5acd}, {"slategray", 0x708090}, {"slategrey", 0x708090}, {"snow", 0xfffafa}, {"springgreen", 0x00ff7f}, {"steelblue", 0x4682b4}, {"tan", 0xd2b48c}, {"teal", 0x008080}, {"thistle", 0xd8bfd8}, {"tomato", 0xff6347}, {"turquoise", 0x40e0d0}, {"violet", 0xee82ee}, {"violetred", 0xd02090}, {"wheat", 0xf5deb3}, {"white", 0xffffff}, {"whitesmoke", 0xf5f5f5}, {"yellow", 0xffff00}, {"yellowgreen", 0x9acd32}, {NULL, 0x0}, }; color_t gfx_col(int r, int g, int b) { color_t col; col.r = r; col.g = g; col.b = b; col.a = 0; return col; } int gfx_parse_color ( const char *spec, color_t *def) { int n, i; int r, g, b; char c; if (!spec) return -1; spec += strspn(spec, " \t"); n = strlen (spec); if (*spec == '#') { /* * RGB */ spec++; n--; if (n != 3 && n != 6 && n != 9 && n != 12) return -1; n /= 3; g = b = 0; do { r = g; g = b; b = 0; for (i = n; --i >= 0; ) { c = *spec++; b <<= 4; if (c >= '0' && c <= '9') b |= c - '0'; else if (c >= 'A' && c <= 'F') b |= c - ('A' - 10); else if (c >= 'a' && c <= 'f') b |= c - ('a' - 10); else return (0); } } while (*spec != '\0'); if (def) { def->r = r; def->g = g; def->b = b; } return 0; } for (i=0; cnames[i].name; i++) { if (!strcmp(cnames[i].name, spec)) { if (def) { def->r = (cnames[i].val & 0xff0000) >> 16; def->g = (cnames[i].val & 0x00ff00) >> 8; def->b = (cnames[i].val & 0x0000ff); } return 0; } } return -1; } struct _anigif_t; struct agspawn { SDL_Rect clip; img_t bg; int x; int y; }; #define AGSPAWN_BLOCK 8 struct _anigif_t { struct _anigif_t *next; struct _anigif_t *prev; int cur_frame; int nr_frames; int loop; int drawn; int active; int delay; int spawn_nr; struct agspawn *spawn; AG_Frame frames[1]; }; #define anigif_size(nr) (sizeof(struct _anigif_t) + (nr) * sizeof(AG_Frame) - sizeof(AG_Frame)) typedef struct _anigif_t *anigif_t; static int anigif_spawn(anigif_t ag, int x, int y, int w, int h) { int nr; SDL_Rect clip; SDL_GetClipRect(Surf(screen), &clip); /* gfx_free_image(ag->bg); */ if (!ag->spawn && !(ag->spawn = malloc(AGSPAWN_BLOCK * sizeof(struct agspawn)))) return -1; nr = ag->spawn_nr + 1; if (!(nr % AGSPAWN_BLOCK)) { /* grow */ void *p = realloc(ag->spawn, AGSPAWN_BLOCK * sizeof(struct agspawn) * ((nr / AGSPAWN_BLOCK) + 1)); if (!p) return -1; ag->spawn = p; } ag->spawn[ag->spawn_nr].x = x; ag->spawn[ag->spawn_nr].y = y; ag->spawn[ag->spawn_nr].clip = clip; ag->spawn[ag->spawn_nr].bg = gfx_grab_screen(x, y, w, h); ag->spawn_nr = nr; return 0; } static anigif_t anim_gifs = NULL; static int anigif_drawn_nr = 0; static anigif_t anigif_find(anigif_t g) { anigif_t p; for (p = anim_gifs; p; p = p->next) { if (p == g) return p; } return NULL; } static void anigif_disposal(anigif_t g) { SDL_Rect dest; SDL_Rect clip; int i = 0; SDL_Surface *img = NULL; AG_Frame *frame; frame = &g->frames[g->cur_frame]; SDL_GetClipRect(Surf(screen), &clip); dest.x = 0; /* g->x; */ dest.y = 0; /* g->y; */ dest.w = dest.h = 0; /* to make happy compiler */ switch (frame->disposal) { case AG_DISPOSE_NA: case AG_DISPOSE_NONE: /* just show next frame */ break; case AG_DISPOSE_RESTORE_BACKGROUND: /* img = g->bg; dest.w = Surf(img)->w; dest.h = Surf(img)->h;*/ break; case AG_DISPOSE_RESTORE_PREVIOUS: if (g->cur_frame) { img = (g->frames[g->cur_frame - 1].surface); dest.w = g->frames[g->cur_frame - 1].surface->w; dest.h = g->frames[g->cur_frame - 1].surface->h; dest.x += g->frames[g->cur_frame - 1].x; dest.y += g->frames[g->cur_frame - 1].y; } break; } for (i = 0; i < g->spawn_nr; i++) { SDL_Rect dst; SDL_SetClipRect(Surf(screen), &g->spawn[i].clip); dst = dest; dst.x += g->spawn[i].x; dst.y += g->spawn[i].y; if (frame->disposal == AG_DISPOSE_RESTORE_BACKGROUND) { img = Surf(g->spawn[i].bg); if (img) { dst.w = img->w; dst.h = img->h; } } if (img) { /* draw bg */ SDL_BlitSurface(img, NULL, Surf(screen), &dst); } } SDL_SetClipRect(Surf(screen), &clip); } static void anigif_frame(anigif_t g) { int i; SDL_Rect dest; SDL_Rect clip; AG_Frame *frame; frame = &g->frames[g->cur_frame]; SDL_GetClipRect(Surf(screen), &clip); dest.w = frame->surface->w; dest.h = frame->surface->h; for (i = 0; i < g->spawn_nr; i++) { dest.x = g->spawn[i].x + frame->x; dest.y = g->spawn[i].y + frame->y; SDL_SetClipRect(Surf(screen), &g->spawn[i].clip); SDL_BlitSurface(frame->surface, NULL, Surf(screen), &dest); } g->delay = timer_counter; SDL_SetClipRect(Surf(screen), &clip); } static anigif_t is_anigif(img_t img) { if (img && (img->flags & IMG_ANIGIF)) return (anigif_t)(img->aux); return NULL; } static anigif_t anigif_add(anigif_t g) { anigif_t p; p = anigif_find(g); if (p) { return p; } if (!anim_gifs) { anim_gifs = g; g->next = NULL; g->prev = NULL; return g; } for (p = anim_gifs; p && p->next; p = p->next); p->next = g; g->next = NULL; g->prev = p; return g; } static anigif_t anigif_del(anigif_t g) { if (g->prev == NULL) anim_gifs = g->next; else g->prev->next = g->next; if (g->next) g->next->prev = g->prev; return g; } static void anigif_free_spawn(anigif_t g) { int i; for (i = 0; i < g->spawn_nr; i++) gfx_free_image(g->spawn[i].bg); if (g->spawn) { free(g->spawn); g->spawn = NULL; g->spawn_nr = 0; } } static void anigif_free(anigif_t g) { AG_FreeSurfaces(g->frames, g->nr_frames); anigif_free_spawn(g); free(g); } static void gfx_free_img(img_t p) { if (!p) return; SDL_FreeSurface(Surf(p)); /* todo texture */ SDL_free(p); } void gfx_free_image(img_t p) { anigif_t ag; if (!p) return; if (!cache_forget(images, p)) return; /* cached sprite */ if ((ag = is_anigif(p))) { if (ag->drawn) anigif_drawn_nr --; anigif_del(ag); anigif_free(ag); return; } gfx_free_img(p); } void gfx_cache_free_image(void *p) { gfx_free_image((img_t)p); } int gfx_img_w(img_t pixmap) { if (!pixmap) return 0; return Surf(pixmap)->w; } int gfx_img_h(img_t pixmap) { if (!pixmap) return 0; return Surf(pixmap)->h; } void gfx_getclip(int *x, int *y, int *w, int *h) { SDL_Rect clip; if (!screen) return; SDL_GetClipRect(Surf(screen), &clip); if (x) *x = clip.x; if (y) *y = clip.y; if (w) *w = clip.w; if (h) *h = clip.h; } void gfx_img_noclip(img_t img) { SDL_SetClipRect(Surf(img), NULL); } void gfx_noclip(void) { gfx_img_noclip(screen); } void gfx_img_clip(img_t img, int x, int y, int w, int h) { SDL_Rect src; src.x = x; src.y = y; src.w = w; src.h = h; SDL_SetClipRect(Surf(img), &src); } void gfx_clip(int x, int y, int w, int h) { gfx_img_clip(screen, x, y, w, h); } #define GFX_IMG(v) gfx_new_img(v, 0, NULL, 0) #define GFX_IMG_REL(v) gfx_new_img(v, 0, NULL, 1) static img_t gfx_new_img(SDL_Surface *s, int fl, void *data, int release) { img_t i; if (!s) return NULL; i = SDL_malloc(sizeof(struct _img_t)); if (i) { i->s = s; /* i->t = NULL; */ i->flags = fl; i->aux = data; } else if (release && s) { SDL_FreeSurface(s); } return i; } img_t gfx_new_rgba(int w, int h) { SDL_Surface *dst; Uint32 rmask, gmask, bmask, amask; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; #else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; #endif dst = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, w, h, 32, rmask, gmask, bmask, amask); #if SDL_VERSION_ATLEAST(2,0,0) if (dst) SDL_SetSurfaceBlendMode(dst, SDL_BLENDMODE_BLEND); #endif if (dst) return GFX_IMG_REL(dst); return NULL; } img_t gfx_dup(img_t src) { SDL_Surface *dst; if (!src) return NULL; dst = SDL_ConvertSurface(Surf(src), Surf(src)->format, Surf(src)->flags); if (!dst) return NULL; return GFX_IMG_REL(dst); } img_t gfx_new_from(int w, int h, unsigned char *pixels) { SDL_Surface *dst; Uint32 rmask, gmask, bmask, amask; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; #else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; #endif dst = SDL_CreateRGBSurfaceFrom(pixels, w, h, 32, w * 4, rmask, gmask, bmask, amask); #if SDL_VERSION_ATLEAST(2,0,0) if (dst) SDL_SetSurfaceBlendMode(dst, SDL_BLENDMODE_BLEND); #endif if (dst) return GFX_IMG_REL(dst); return NULL; } img_t gfx_new(int w, int h) { SDL_Surface *dst; if (!screen) { return gfx_new_rgba(w, h); } else { dst = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, w, h, Surf(screen)->format->BitsPerPixel, Surf(screen)->format->Rmask, Surf(screen)->format->Gmask, Surf(screen)->format->Bmask, Surf(screen)->format->Amask); } #if SDL_VERSION_ATLEAST(2,0,0) if (dst) SDL_SetSurfaceBlendMode(dst, SDL_BLENDMODE_NONE); #endif if (dst) return GFX_IMG_REL(dst); return NULL; } void gfx_img_fill(img_t img, int x, int y, int w, int h, color_t col) { SDL_Rect dest; if (!img) return; dest.x = x; dest.y = y; dest.w = w; dest.h = h; SDL_FillRect(Surf(img), &dest, SDL_MapRGB((Surf(img))->format, col.r, col.g, col.b)); } void gfx_fill(int x, int y, int w, int h, color_t col) { gfx_img_fill(screen, x, y, w, h, col); } img_t gfx_screen(img_t nscreen) { img_t img; if (nscreen) { img = screen; screen = nscreen; return img; } return screen; } img_t gfx_grab_screen(int x, int y, int w, int h) { SDL_Rect dst, src; SDL_Surface *s; int a; img_t img; if (!screen) return NULL; s = SDL_CreateRGBSurface(Surf(screen)->flags, w, h, Surf(screen)->format->BitsPerPixel, Surf(screen)->format->Rmask, Surf(screen)->format->Gmask, Surf(screen)->format->Bmask, Surf(screen)->format->Amask); if (!s) return NULL; src.x = x; src.y = y; src.w = w; src.h = h; dst.x = 0; dst.y = 0; dst.w = w; dst.h = h; /* SDL_SetSurfaceBlendMode(screen, SDL_BLENDMODE_NONE); SDL_SetSurfaceBlendMode(img, SDL_BLENDMODE_NONE); */ a = gfx_unset_alpha(screen); SDL_BlitSurface(Surf(screen), &src, s, &dst); gfx_set_alpha(screen, a); img = GFX_IMG_REL(s); if (!img) return NULL; gfx_unset_alpha(img); return img; } #if SDL_VERSION_ATLEAST(2,0,0) static SDL_RendererInfo SDL_VideoRendererInfo; SDL_Surface *SDL_DisplayFormat(SDL_Surface * surface) { SDL_PixelFormat *format; SDL_Surface *converted; if (!screen) { fprintf(stderr, "No video mode has been set.\n"); return NULL; } format = Surf(screen)->format; converted = SDL_ConvertSurface(surface, format, 0); return converted; } SDL_Surface *SDL_DisplayFormatAlpha(SDL_Surface * surface) { SDL_Surface *converted; converted = SDL_DisplayFormat(surface); if (converted) SDL_SetSurfaceBlendMode(converted, SDL_BLENDMODE_BLEND); return converted; } #endif img_t gfx_display_alpha(img_t src) { SDL_Surface* res; if (!src) return NULL; if (!screen) return src; if (is_anigif(src)) /* already optimized */ return src; #if SDL_VERSION_ATLEAST(2,0,0) if (Surf(screen)->format == Surf(src)->format) { /* fast path! */ SDL_SetSurfaceBlendMode(Surf(src), SDL_BLENDMODE_BLEND); return src; } #endif res = SDL_DisplayFormatAlpha(Surf(src)); if (!res) return src; gfx_free_image(src); return GFX_IMG_REL(res); } int gfx_get_pixel(img_t src, int x, int y, color_t *color) { Uint8 r, g, b, a; Uint32 col = 0; Uint8 *ptr; int bpp; SDL_Surface *img = Surf(src); if (!img) return -1; if (x >= img->w || y >= img->h || x < 0 || y < 0) return -1; if (SDL_LockSurface(img)) return -1; if (img->format) bpp = img->format->BytesPerPixel; else bpp = 1; /* hack? */ ptr = (Uint8*)img->pixels; ptr += img->pitch * y; ptr += x * bpp; memcpy(&col, ptr, bpp); SDL_UnlockSurface(img); if (color) SDL_GetRGBA(col, img->format, &r, &g, &b, &a); if (color) { color->r = r; color->g = g; color->b = b; color->a = a; } return 0; } int gfx_set_pixel(img_t src, int x, int y, color_t color) { int bpp; Uint32 col; Uint8 *ptr; SDL_Surface *img = Surf(src); if (!img) return -1; if (x >= img->w || y >= img->h || x < 0 || y < 0) return -1; if (SDL_LockSurface(img)) return -1; if (img->format) bpp = img->format->BytesPerPixel; else bpp = 1; /* hack? */ ptr = (Uint8*)img->pixels; ptr += img->pitch * y; ptr += x * bpp; col = SDL_MapRGBA(img->format, color.r, color.g, color.b, color.a); memcpy(ptr, &col, bpp); SDL_UnlockSurface(img); return 0; } void gfx_put_pixels(img_t src) { SDL_Surface *img = Surf(src); SDL_UnlockSurface(img); return; } unsigned char *gfx_get_pixels(img_t src) { Uint8 *ptr; SDL_Surface *img = Surf(src); if (!img) return NULL; if (SDL_LockSurface(img)) return NULL; ptr = (unsigned char*)img->pixels; return ptr; } img_t gfx_alpha_img(img_t src, int alpha) { Uint8 *ptr; Uint32 col; int size; int bpp; img_t img = NULL; if (!src) return NULL; if (screen) { SDL_Surface *s = SDL_DisplayFormatAlpha(Surf(src)); if (s) img = GFX_IMG_REL(s); } else img = gfx_new(Surf(src)->w, Surf(src)->h); if (!img) return NULL; if (Surf(img)->format) bpp = Surf(img)->format->BytesPerPixel; else bpp = 1; gfx_set_alpha(img, SDL_ALPHA_OPAQUE); if (SDL_LockSurface(Surf(img)) == 0) { int w = Surf(img)->w; ptr = (Uint8*)(Surf(img)->pixels); size = Surf(img)->w * Surf(img)->h; while (size --) { Uint8 r, g, b, a; memcpy(&col, ptr, bpp); SDL_GetRGBA(col, Surf(img)->format, &r, &g, &b, &a); col = SDL_MapRGBA(Surf(img)->format, r, g, b, a * alpha / SDL_ALPHA_OPAQUE); memcpy(ptr, &col, bpp); ptr += bpp; w --; if (!w) { w = Surf(img)->w; ptr += Surf(img)->pitch; ptr -= w * bpp; } } SDL_UnlockSurface(Surf(img)); } return img; } void gfx_set_colorkey(img_t src, color_t col) { Uint32 c; SDL_Surface *s = Surf(src); if (!s) return; c = SDL_MapRGB(s->format, col.r, col.g, col.b); #if SDL_VERSION_ATLEAST(2,0,0) SDL_SetColorKey(s, SDL_TRUE, c); #else SDL_SetColorKey(s, SDL_SRCCOLORKEY, c); #endif /* gfx_unset_alpha(src); */ } void gfx_unset_colorkey(img_t src) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_SetColorKey(Surf(src), SDL_FALSE, 0); #else SDL_SetColorKey(Surf(src), 0, 0); #endif /* gfx_set_alpha(src, SDL_ALPHA_OPAQUE); */ } void gfx_set_alpha(img_t src, int alpha) { if (alpha < 0) return; #if SDL_VERSION_ATLEAST(1,3,0) /* if (Surf(src)->format->Amask) alpha = SDL_ALPHA_OPAQUE; */ SDL_SetSurfaceAlphaMod(Surf(src), alpha); /* SDL_SetSurfaceBlendMode((SDL_Surface *)src, SDL_BLENDMODE_NONE); else */ SDL_SetSurfaceBlendMode(Surf(src), SDL_BLENDMODE_BLEND); #else SDL_SetAlpha(Surf(src), SDL_SRCALPHA, alpha); #endif } int gfx_unset_alpha(img_t src) { int alpha = -1; #if SDL_VERSION_ATLEAST(1,3,0) SDL_BlendMode blendMode; Uint8 sdl_alpha = SDL_ALPHA_OPAQUE; alpha = SDL_GetSurfaceBlendMode(Surf(src), &blendMode); if (blendMode == SDL_BLENDMODE_BLEND) { SDL_GetSurfaceAlphaMod(Surf(src), &sdl_alpha); alpha = sdl_alpha; } SDL_SetSurfaceAlphaMod(Surf(src), SDL_ALPHA_OPAQUE); SDL_SetSurfaceBlendMode(Surf(src), SDL_BLENDMODE_NONE); #else if ((Surf(src)->flags) & SDL_SRCALPHA) alpha = Surf(src)->format->alpha; SDL_SetAlpha(Surf(src), 0, SDL_ALPHA_OPAQUE); #endif return alpha; } img_t gfx_combine(img_t src, img_t dst) { img_t new; SDL_Surface *s; s = SDL_DisplayFormatAlpha(Surf(dst)); if (!s) return NULL; new = GFX_IMG_REL(s); if (new) SDL_BlitSurface(Surf(src), NULL, Surf(new), NULL); return new; } static img_t img_pad(char *fname) { int l,r,t,b, rc; img_t img, img2; SDL_Rect to; char *p = fname; p += strcspn(p, ","); if (*p != ',') return NULL; p ++; rc = sscanf(fname, "%d %d %d %d,", &t, &r, &b, &l); if (rc == 1) { r = b = l = t; } else if (rc == 2) { b = t; l = r; } else if (rc == 3) { l = r; } else if (rc == 4) { ; } else return NULL; img = gfx_load_image(p); if (!img) return NULL; img2 = gfx_new(gfx_img_w(img) + l + r, gfx_img_h(img) + t + b); if (!img2) { gfx_free_image(img); return NULL; } else { img_t img = gfx_alpha_img(img2, 0); if (img) { gfx_free_image(img2); img2 = img; } } to.x = l; to.y = t; SDL_gfxBlitRGBA(Surf(img), NULL, Surf(img2), &to); gfx_free_image(img); return img2; } static img_t _gfx_load_combined_image(char *filename); /* blank:WxH */ static img_t _gfx_load_special_image(char *f, int combined) { int alpha = 0; int blank = 0; char *filename; img_t img, img2; char *pc = NULL, *pt = NULL; int wh[2] = { 0, 0 }; if (!f) return NULL; if (!(f = filename = strdup(f))) return NULL; if (!strncmp(filename, "blank:", 6)) { filename += 6; blank = 1; } else if (!strncmp(filename, "spr:", 4) && !combined) { /* filename += 4; */ img2 = cache_get(images, filename); /* fprintf(stderr, "get:%s %p\n", filename, img2); */ goto out; } else if (!strncmp(filename, "box:", 4)) { filename += 4; alpha = SDL_ALPHA_OPAQUE; } else if (!strncmp(filename, "pad:", 4)) { filename += 4; img2 = img_pad(filename); goto out; } else if (!strncmp(filename, "comb:", 5)) { filename += 5; img2 = _gfx_load_combined_image(filename); goto out; } else goto err; if (strchr(filename, ';')) goto err; /* combined */ if (blank) goto skip; pc = filename + strcspn(filename, ","); if (*pc == ',') { *pc = 0; pc ++; pt = pc + strcspn(pc, ","); if (*pt == ',') { *pt = 0; pt ++; } else pt = NULL; } else pc = NULL; skip: if (parse_mode(filename, wh)) goto err; if (wh[0] <= 0 || wh[1] <= 0) goto err; img = gfx_new(wh[0], wh[1]); if (!img) goto err; if (pc) { color_t col = { .r = 255, .g = 255, .b = 255 }; gfx_parse_color(pc, &col); gfx_img_fill(img, 0, 0, wh[0], wh[1], col); } if (pt) alpha = atoi(pt); img2 = gfx_alpha_img(img, alpha); gfx_free_image(img); out: free(f); return img2; err: free(f); return NULL; } cache_t gfx_image_cache(void) { return images; } static anigif_t ag_new(int nr) { anigif_t agif = malloc(anigif_size(nr)); if (!agif) return NULL; memset(agif, 0, anigif_size(nr)); agif->nr_frames = nr; return agif; } static anigif_t ag_dup(anigif_t ag) { anigif_t agif = malloc(anigif_size(ag->nr_frames)); if (!agif) return NULL; memcpy(agif, ag, anigif_size(ag->nr_frames)); agif->cur_frame = 0; agif->drawn = 0; agif->active = 0; agif->delay = 0; agif->spawn_nr = 0; agif->spawn = NULL; return agif; } static img_t _gfx_load_image(char *filename, int combined) { SDL_RWops *rw; img_t img; int nr = 0; filename = strip(filename); img = _gfx_load_special_image(filename, combined); if (img) return img; if (strstr(filename,".gif") || strstr(filename,".GIF")) nr = AG_LoadGIF(filename, NULL, 0, NULL); if (nr > 1) { /* anigif logic */ int loop = 0; anigif_t agif = ag_new(nr); if (!agif) return NULL; AG_LoadGIF(filename, agif->frames, nr, &loop); AG_NormalizeSurfacesToDisplayFormat( agif->frames, nr); agif->loop = loop; anigif_add(agif); /* fprintf(stderr, "anigif: %s %p\n", filename, agif->frames[0].surface); */ img = gfx_new_img(agif->frames[0].surface, IMG_ANIGIF, agif, 0); if (!img) { anigif_del(agif); anigif_free(agif); } return img; } rw = RWFromIdf(instead_idf(), filename); if (!rw || !(img = GFX_IMG_REL(IMG_Load_RW(rw, 1)))) return NULL; if (Surf(img)->format->BitsPerPixel == 32) { /* hack for 32 bit BMP :( */ SDL_RWops *rwop; rwop = RWFromIdf(instead_idf(), filename); if (rwop) { if (IMG_isBMP(rwop)) /* SDL_SetAlpha(img, 0, SDL_ALPHA_OPAQUE); */ gfx_unset_alpha(img); SDL_RWclose(rwop); } } img = gfx_display_alpha(img); return img; } /* x.png;a.png@1,2;b.png@3,4 */ static img_t _gfx_load_combined_image(char *filename) { char *str; char *p, *ep; img_t base = NULL, img = NULL; p = str = strdup(filename); if (!str) return NULL; ep = p + strcspn(p, ";"); if (*ep != ';') goto err; /* first image is a base image */ *ep = 0; base = _gfx_load_image(strip(p), 1); if (!base) goto err; p = ep + 1; while (*p) { int x = 0, y = 0, c = 0; SDL_Rect to; ep = p + strcspn(p, ";@"); if (*ep == '@') { *ep = 0; ep ++; if (*ep == 'c') { c = 1; ep ++; } sscanf(ep, "%d,%d", &x, &y); ep += strcspn(ep, ";"); if (*ep) ep ++; } else if (*ep == ';') { *ep = 0; ep ++; } else if (*ep) { goto err; } img = _gfx_load_image(strip(p), 1); if (!img) goto err; to.x = x; to.y = y; if (c) { to.x -= gfx_img_w(img) / 2; to.y -= gfx_img_h(img) / 2; } to.w = to.h = 0; SDL_gfxBlitRGBA(Surf(img), NULL, Surf(base), &to); gfx_free_image(img); p = ep; } free(str); return base; err: gfx_free_image(base); free(str); return NULL; } img_t gfx_load_image(char *filename) { img_t img = NULL; if (!filename) return NULL; /* if (!access(filename, R_OK)) */ img = _gfx_load_image(filename, 0); if (!img) img = _gfx_load_combined_image(filename); return img; } void gfx_draw_bg(img_t p, int x, int y, int width, int height) { int a; SDL_Surface *pixbuf = Surf(p); SDL_Rect dest, src; if (!p) return; src.x = x; src.y = y; src.w = width; src.h = height; dest.x = x; dest.y = y; dest.w = width; dest.h = height; a = gfx_unset_alpha(p); SDL_BlitSurface(pixbuf, &src, Surf(screen), &dest); gfx_set_alpha(p, a); } void gfx_draw_from_alpha(img_t s, int x, int y, int w, int h, img_t d, int xx, int yy, int alpha) { #if SDL_VERSION_ATLEAST(1,3,0) SDL_BlendMode blendMode; Uint8 sdl_alpha = SDL_ALPHA_OPAQUE; SDL_GetSurfaceBlendMode(Surf(s), &blendMode); SDL_GetSurfaceAlphaMod(Surf(s), &sdl_alpha); SDL_SetSurfaceAlphaMod(Surf(s), alpha); SDL_SetSurfaceBlendMode(Surf(s), SDL_BLENDMODE_BLEND); gfx_draw_from(s, x, y, w, h, d, xx, yy); SDL_SetSurfaceBlendMode(Surf(s), blendMode); SDL_SetSurfaceAlphaMod(Surf(s), sdl_alpha); #else img_t img; img = gfx_alpha_img(s, alpha); gfx_draw_from((img)?img:s, x, y, w, h, d, xx, yy); gfx_free_image(img); #endif } void gfx_draw_from(img_t p, int x, int y, int width, int height, img_t to, int xx, int yy) { SDL_Surface *pixbuf = Surf(p); SDL_Surface *scr = Surf(to); SDL_Rect dest, src; if (!p) return; if (!scr) scr = Surf(screen); src.x = x; src.y = y; src.w = width; src.h = height; dest.x = xx; dest.y = yy; dest.w = width; dest.h = height; SDL_BlitSurface(pixbuf, &src, scr, &dest); } void gfx_compose_from(img_t p, int x, int y, int width, int height, img_t to, int xx, int yy) { SDL_Surface *pixbuf = Surf(p); SDL_Surface *scr = Surf(to); SDL_Rect dest, src; if (!scr) scr = Surf(screen); src.x = x; src.y = y; src.w = width; src.h = height; dest.x = xx; dest.y = yy; dest.w = width; dest.h = height; SDL_gfxBlitRGBA(pixbuf, &src, scr, &dest); } void gfx_copy(img_t p, int x, int y) { int a; SDL_Surface *pixbuf = Surf(p); SDL_Rect dest; if (!p) return; dest.x = x; dest.y = y; dest.w = pixbuf->w; dest.h = pixbuf->h; a = gfx_unset_alpha(p); SDL_BlitSurface(pixbuf, NULL, Surf(screen), &dest); gfx_set_alpha(p, a); } void gfx_copy_from(img_t p, int x, int y, int width, int height, img_t to, int xx, int yy) { int a; SDL_Surface *pixbuf = Surf(p); SDL_Surface *scr = Surf(to); SDL_Rect dest, src; if (!p) return; if (!scr) scr = Surf(screen); src.x = x; src.y = y; src.w = width; src.h = height; dest.x = xx; dest.y = yy; dest.w = width; dest.h = height; a = gfx_unset_alpha(p); SDL_BlitSurface(pixbuf, &src, scr, &dest); gfx_set_alpha(p, a); } void gfx_draw(img_t p, int x, int y) { anigif_t ag; SDL_Surface *pixbuf = Surf(p); SDL_Rect dest; if (!p) return; dest.x = x; dest.y = y; dest.w = pixbuf->w; dest.h = pixbuf->h; if (!DIRECT_MODE) /* no gifs in direct mode */ ag = is_anigif(p); else ag = NULL; if (ag) { anigif_spawn(ag, x, y, dest.w, dest.h); if (!ag->drawn) anigif_drawn_nr ++; ag->drawn = 1; ag->active = 1; anigif_frame(ag); return; } SDL_BlitSurface(pixbuf, NULL, Surf(screen), &dest); } void gfx_stop_gif(img_t p) { anigif_t ag; ag = is_anigif(p); if (ag) ag->active = 0; } void gfx_dispose_gif(img_t p) { anigif_t ag; ag = is_anigif(p); if (ag) { if (ag->drawn) anigif_drawn_nr --; ag->drawn = 0; anigif_free_spawn(ag); } } void gfx_start_gif(img_t p) { anigif_t ag; ag = is_anigif(p); if (ag) ag->active = 1; } int gfx_frame_gif(img_t img) { anigif_t ag; ag = is_anigif(img); if (!ag) return 0; if (!ag->drawn || !ag->active) return 0; if (ag->loop == -1) return 0; if ((timer_counter - ag->delay) < (ag->frames[ag->cur_frame].delay / HZ)) return 0; if (ag->cur_frame != ag->nr_frames - 1 || ag->loop > 1 || !ag->loop) anigif_disposal(ag); ag->cur_frame ++; if (ag->cur_frame >= ag->nr_frames) { if (!ag->loop || ag->loop > 1) ag->cur_frame = 0; else ag->cur_frame --; /* last one */ if (ag->loop) { ag->loop --; if (!ag->loop) ag->loop = -1; /* disabled */ } } if (ag->loop != -1) anigif_frame(ag); return 1; } int gfx_is_drawn_gifs(void) { return anigif_drawn_nr; } void gfx_update_gif(img_t img, update_fn update) { int i = 0; anigif_t ag; ag = is_anigif(img); if (!ag) return; if (!ag->drawn || !ag->active) return; for (i = 0; i < ag->spawn_nr; i++) { update(ag->spawn[i].x, ag->spawn[i].y, gfx_img_w(img), gfx_img_h(img)); } } void gfx_draw_wh(img_t p, int x, int y, int w, int h) { SDL_Surface *pixbuf = Surf(p); SDL_Rect dest, src; src.x = 0; src.y = 0; src.w = w; src.h = h; dest.x = x; dest.y = y; dest.w = w; dest.h = h; SDL_BlitSurface(pixbuf, &src, Surf(screen), &dest); } static SDL_Color bgcol = { .r = 0, .g = 0, .b = 0 }; void gfx_bg(color_t col) { bgcol.r = col.r; bgcol.g = col.g; bgcol.b = col.b; } void gfx_clear(int x, int y, int w, int h) { SDL_Rect dest; SDL_Surface *s = Surf(screen); if (!s) return; dest.x = x; dest.y = y; dest.w = w; dest.h = h; SDL_FillRect(s, &dest, SDL_MapRGB(s->format, bgcol.r, bgcol.g, bgcol.b)); } int gfx_width = -1; int gfx_height = -1; int gfx_fs = -1; static SDL_Rect** vid_modes = NULL; static SDL_Rect m640x480 = { .w = 640, .h = 480 }; static SDL_Rect m800x480 = { .w = 800, .h = 480 }; static SDL_Rect m800x600 = { .w = 800, .h = 600 }; static SDL_Rect m1024x768 = { .w = 1024, .h = 768 }; static SDL_Rect m1280x800 = { .w = 1280, .h = 800 }; static SDL_Rect* std_modes[] = { &m640x480, &m800x480, &m800x600, &m1024x768, &m1280x800, NULL }; #if SDL_VERSION_ATLEAST(2,0,0) static int SDL_CurrentDisplay = 0; static void SelectVideoDisplay() { const char *variable = SDL_getenv("SDL_VIDEO_FULLSCREEN_DISPLAY"); if ( !variable ) { variable = SDL_getenv("SDL_VIDEO_FULLSCREEN_HEAD"); } if ( variable ) { SDL_CurrentDisplay = SDL_atoi(variable); } } static SDL_Rect **SDL_ListModes(const SDL_PixelFormat * format, Uint32 flags) { SDL_DisplayMode disp_mode; int i, nmodes; SDL_Rect **modes; SDL_Rect **new_modes; Uint32 Rmask, Gmask, Bmask, Amask; int bpp; SelectVideoDisplay(); SDL_GetDesktopDisplayMode(SDL_CurrentDisplay, &disp_mode); SDL_PixelFormatEnumToMasks(disp_mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); if (format) bpp = format->BitsPerPixel; nmodes = 0; modes = NULL; for (i = 0; i < SDL_GetNumDisplayModes(SDL_CurrentDisplay); ++i) { SDL_DisplayMode mode; if (SDL_GetDisplayMode(SDL_CurrentDisplay, i, &mode) < 0) continue; if (!mode.w || !mode.h) { continue; } /* fprintf(stderr, "Mode: %d %d %d %d\n", bpp, SDL_BITSPERPIXEL(mode.format), mode.w, mode.h); */ if ((unsigned int)bpp < SDL_BITSPERPIXEL(mode.format)) { continue; } if (mode.w > disp_mode.w || mode.h > disp_mode.h) { /* skip large modes */ if (mode.w > disp_mode.h || mode.h > disp_mode.w) /* landscape ? */ continue; } if (nmodes > 0 && modes[nmodes - 1]->w == mode.w && modes[nmodes - 1]->h == mode.h) { continue; } new_modes = SDL_realloc(modes, (nmodes + 2) * sizeof(*modes)); if (!new_modes) goto out; modes = new_modes; modes[nmodes] = (SDL_Rect *) SDL_malloc(sizeof(SDL_Rect)); if (!modes[nmodes]) goto out; modes[nmodes]->x = 0; modes[nmodes]->y = 0; modes[nmodes]->w = mode.w; modes[nmodes]->h = mode.h; ++nmodes; } if (!modes) /* no modes found */ return (SDL_Rect **) (-1); if (modes) { modes[nmodes] = NULL; } return modes; out: for (i = 0; i < nmodes; i++) SDL_free(modes[i]); SDL_free(modes); return NULL; } #endif extern char *modes_sw; static int gfx_parse_modes(void) { const char *p = modes_sw; int nr = 0; int mode[2]; int i = 0; if (!modes_sw) return 0; while (*p) { p += strcspn(p, ","); if (*p) p ++; nr ++; } if (!nr) return 0; vid_modes = SDL_malloc(sizeof(SDL_Rect *) * (nr + 1)); /* array of pointers */ if (!vid_modes) return 0; p = modes_sw; nr = 0; while (*p) { char m[64]; SDL_Rect *r; size_t s; s = strcspn(p, ","); memset(m, 0, sizeof(m)); memcpy(m, p, (s > sizeof(m))? sizeof(m): s); m[sizeof(m) - 1] = 0; if (parse_mode(m, &mode)) break; r = SDL_malloc(sizeof(SDL_Rect)); if (!r) goto err; vid_modes[nr ++] = r; r->w = mode[0]; r->h = mode[1]; fprintf(stderr, "Available mode: %dx%d\n", r->w, r->h); p += strcspn(p, ","); if (*p) p ++; } vid_modes[nr] = NULL; return nr; err: for (i = 0; i < nr; i++) { SDL_free(vid_modes[i]); } SDL_free(vid_modes); vid_modes = NULL; return 0; } int gfx_modes(void) { int i = 0; SDL_Rect** modes; if ((i = gfx_parse_modes())) return i; #if SDL_VERSION_ATLEAST(2,0,0) modes = SDL_ListModes(NULL, 0); #else #ifdef __APPLE__ modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_SWSURFACE | SDL_ANYFORMAT); #else modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT); #endif #endif if (modes == (SDL_Rect**)0)/* no modes */ return 0; if (modes == (SDL_Rect**)-1) { vid_modes = std_modes; return 5; } for (i = 0; modes[i]; ++i); vid_modes = modes; return i; } int gfx_get_mode(int n, int *w, int *h) { if (!vid_modes) gfx_modes(); if (!vid_modes || !vid_modes[n]) return -1; if (w) *w = vid_modes[n]->w; if (h) *h = vid_modes[n]->h; return 0; } int gfx_prev_mode(int *w, int *h) { int ww, hh, i = 0; if (!w || !h) return -1; while ((*w != -1 && *h != -1) && !gfx_get_mode(i, &ww, &hh)) { if (ww == *w && hh == *h) break; i ++; } if (*w == -1 || *h == -1) i = gfx_modes(); if (!i) return -1; i --; if (gfx_get_mode(i, &ww, &hh)) return -1; *w = ww; *h = hh; return 0; } int gfx_next_mode(int *w, int *h) { int ww, hh, i = 0; if (!w || !h) return -1; while ((*w != -1 && *h != -1) && !gfx_get_mode(i, &ww, &hh)) { i ++; if (ww == *w && hh == *h) break; } if (gfx_get_mode(i, &ww, &hh)) return -1; *w = ww; *h = hh; return 0; } #if SDL_VERSION_ATLEAST(2,0,0) #if defined(ANDROID) || defined(IOS) static int current_gfx_w = - 1; static int current_gfx_h = - 1; #endif #endif int gfx_get_max_mode(int *w, int *h, int o) { int ww = 0, hh = 0; int i = 0; #ifdef MAEMO *w = 800; *h = 480; #else *w = 0; *h = 0; #if SDL_VERSION_ATLEAST(2,0,0) SDL_DisplayMode desktop_mode; #if defined(ANDROID) || defined(IOS) if (o == MODE_ANY && current_gfx_w != -1) { *w = current_gfx_w; *h = current_gfx_h; return 0; } #endif #ifdef _USE_SWROTATE if (!SDL_GetDesktopDisplayMode(SDL_CurrentDisplay, &desktop_mode)) { if ((o == MODE_H && desktop_mode.w < desktop_mode.h) || (o == MODE_V && desktop_mode.w > desktop_mode.h)) { *w = desktop_mode.h; *h = desktop_mode.w; } else { *w = desktop_mode.w; *h = desktop_mode.h; } return 0; } #endif if (o == MODE_ANY && !SDL_GetDesktopDisplayMode(SDL_CurrentDisplay, &desktop_mode)) { *w = desktop_mode.w; *h = desktop_mode.h; return 0; } #endif if (!vid_modes) gfx_modes(); if (!vid_modes) return -1; while (!gfx_get_mode(i, &ww, &hh)) { if ((ww * hh >= (*w) * (*h))) { if (o == MODE_ANY || (o == MODE_H && ww >= hh) || (o == MODE_V && hh > ww)) { *w = ww; *h = hh; } } i ++; } #endif return 0; } int gfx_check_mode(int w, int h) { #if defined(IOS) || defined(ANDROID) return 0; #else int ww = 0, hh = 0; int i = 0; if (!vid_modes) gfx_modes(); if (!vid_modes) return -1; while (!gfx_get_mode(i, &ww, &hh)) { if (ww == w && hh == h) return 0; i ++; } return -1; #endif } static SDL_Surface *icon = NULL; extern int software_sw; #if SDL_VERSION_ATLEAST(2,0,0) #ifdef _USE_SWROTATE static int gfx_flip_rotate = 0; #endif SDL_Window *SDL_VideoWindow = NULL; static SDL_Texture *SDL_VideoTexture = NULL; static SDL_Surface *SDL_VideoSurface = NULL; static SDL_Renderer *Renderer = NULL; static void GetEnvironmentWindowPosition(int w, int h, int *x, int *y) { const char *window = SDL_getenv("SDL_VIDEO_WINDOW_POS"); const char *center = SDL_getenv("SDL_VIDEO_CENTERED"); if (window) { if (SDL_sscanf(window, "%d,%d", x, y) == 2) { return; } if (SDL_strcmp(window, "center") == 0) { center = window; } } if (center) { SDL_DisplayMode mode; SDL_GetDesktopDisplayMode(SDL_CurrentDisplay, &mode); *x = (mode.w - w) / 2; *y = (mode.h - h) / 2; } } static SDL_Surface *CreateVideoSurface(SDL_Texture * texture) { SDL_Surface *surface; Uint32 format; int w, h; int bpp; Uint32 Rmask, Gmask, Bmask, Amask; /* void *pixels; int pitch; */ if (SDL_QueryTexture(texture, &format, NULL, &w, &h) < 0) { return NULL; } if (!SDL_PixelFormatEnumToMasks(format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { fprintf(stderr, "Unknown texture format.\n"); return NULL; } surface = SDL_CreateRGBSurface(0, w, h, bpp, Rmask, Gmask, Bmask, Amask); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); return surface; } static int mouse_x = -1; static int mouse_y = -1; static int mouse_watcher(void *userdata, SDL_Event *event) { #ifdef _USE_SWROTATE if (gfx_flip_rotate) { switch (event->type) { case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: mouse_y = gfx_height - event->button.x; mouse_x = event->button.y; event->button.x = mouse_x; event->button.y = mouse_y; break; case SDL_MOUSEMOTION: mouse_y = gfx_height - event->motion.x; mouse_x = event->motion.y; event->motion.x = mouse_x; event->motion.y = mouse_y; break; case SDL_FINGERMOTION: case SDL_FINGERUP: case SDL_FINGERDOWN: #ifdef SAILFISHOS /* sailfish has broken touch events */ mouse_x = event->tfinger.y; mouse_y = gfx_height - event->tfinger.x; #endif break; default: break; } return 0; } #endif switch (event->type) { case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONDOWN: mouse_x = event->button.x; mouse_y = event->button.y; break; case SDL_MOUSEMOTION: mouse_x = event->motion.x; mouse_y = event->motion.y; break; default: break; } return 0; } void gfx_finger_pos_scale(float x, float y, int *ox, int *oy, int norm) { int xx = 0, yy = 0; #ifndef SAILFISHOS int w, h; float sx, sy; SDL_Rect rect; if (!norm) { /* do not normalize? */ w = gfx_width; h = gfx_height; sx = 1.0f; sy = 1.0f; rect.x = 0; rect.y = 0; } else { SDL_GetWindowSize(SDL_VideoWindow, &w, &h); SDL_RenderGetViewport(Renderer, &rect); SDL_RenderGetScale(Renderer, &sx, &sy); } if (sx != 0) { x = x * w; xx = x / sx - rect.x; } if (sy != 0) { y = y * h; yy = y / sy - rect.y; } #else xx = (int)x; /* broken touch in SFOS */ yy = (int)y; #endif #ifdef _USE_SWROTATE if (gfx_flip_rotate) { if (ox) *ox = yy; if (oy) *oy = gfx_height - xx; } else { #endif if (ox) *ox = xx; if (oy) *oy = yy; #ifdef _USE_SWROTATE } #endif } #ifdef _USE_SWROTATE void rotate_landscape(void) { SDL_DisplayMode desktop_mode; SDL_GetDesktopDisplayMode(SDL_CurrentDisplay, &desktop_mode); gfx_flip_rotate = (desktop_mode.w < desktop_mode.h); #ifdef SAILFISHOS SDL_SetHint(SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION, "landscape"); #endif } void rotate_portrait(void) { SDL_DisplayMode desktop_mode; SDL_GetDesktopDisplayMode(SDL_CurrentDisplay, &desktop_mode); gfx_flip_rotate = (desktop_mode.w > desktop_mode.h); #ifdef SAILFISHOS SDL_SetHint(SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION, "portrait"); #endif } void unlock_rotation(void) { gfx_flip_rotate = 0; #ifdef SAILFISHOS SDL_SetHint(SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION, "primary"); #endif } #endif int gfx_set_mode(int w, int h, int fs) { int i; int vsync = SDL_RENDERER_PRESENTVSYNC; int window_x = SDL_WINDOWPOS_UNDEFINED; int window_y = SDL_WINDOWPOS_UNDEFINED; int win_w; int win_h; int sw_fallback = 0; int max_mode_w = 0; int max_mode_h = 0; SDL_DisplayMode desktop_mode; char title[4096]; char *t; strcpy(title, "INSTEAD - " ); strcat(title, VERSION ); win_w = w * scale_sw; win_h = h * scale_sw; gfx_get_max_mode(&max_mode_w, &max_mode_h, MODE_ANY); /* get current window size */ #if defined(IOS) || defined(ANDROID) || defined(MAEMO) || defined(_WIN32_WCE) || defined(S60) || defined(WINRT) || defined(SAILFISHOS) fs = 1; /* always fs for mobiles */ #endif if (fs && !software_sw) { win_w = max_mode_w; win_h = max_mode_h; } if (gfx_width == w && gfx_height == h && gfx_fs == fs) { game_reset_name(); #if defined(ANDROID) if (SDL_VideoWindow) /* see gfx_set_mode call from input.c */ #else if (SDL_VideoWindow && !fs) #endif SDL_SetWindowSize(SDL_VideoWindow, win_w, win_h); goto done; /* already done */ } SelectVideoDisplay(); SDL_GetDesktopDisplayMode(SDL_CurrentDisplay, &desktop_mode); if (vid_modes && vid_modes != std_modes) { for (i = 0; vid_modes[i]; i++) SDL_free(vid_modes[i]); SDL_free(vid_modes); } vid_modes = NULL; if (screen) gfx_free_image(screen); /* if (SDL_VideoTexture) SDL_DestroyTexture(SDL_VideoTexture); */ if (Renderer) SDL_DestroyRenderer(Renderer); screen = NULL; Renderer = NULL; SDL_VideoTexture = NULL; if (SDL_VideoWindow) { SDL_GetWindowPosition(SDL_VideoWindow, &window_x, &window_y); SDL_DestroyWindow(SDL_VideoWindow); SDL_VideoWindow = NULL; if ((gfx_fs == 1 && !fs) || (window_x == 0 || window_y == 0)) { /* return from fullscreen */ window_x = SDL_WINDOWPOS_CENTERED; window_y = SDL_WINDOWPOS_CENTERED; } } else GetEnvironmentWindowPosition(win_w, win_h, &window_x, &window_y); if (desktop_mode.w <= win_w || fs) window_x = 0; if (desktop_mode.h <= win_h || fs) window_y = 0; t = game_reset_name(); if (!t) t = title; #if defined(ANDROID) /* fix for hackish samsung devices */ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); #endif #if defined(IOS) || defined(ANDROID) || defined(WINRT) || defined(SAILFISHOS) SDL_VideoWindow = SDL_CreateWindow(t, window_x, window_y, win_w, win_h, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE); if (!SDL_VideoWindow) { fprintf(stderr, "Fallback to software window.\n"); SDL_VideoWindow = SDL_CreateWindow(t, window_x, window_y, win_w, win_h, SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE); } #else if (!software_sw) /* try to using scale */ SDL_VideoWindow = SDL_CreateWindow(t, window_x, window_y, win_w, win_h, SDL_WINDOW_SHOWN | ((fs)?SDL_WINDOW_FULLSCREEN:(resizable_sw?SDL_WINDOW_RESIZABLE:0)) | SDL_WINDOW_OPENGL); if (!SDL_VideoWindow) { /* try simple window */ fprintf(stderr, "Fallback to software window.\n"); win_w = w; win_h = h; SDL_VideoWindow = SDL_CreateWindow(t, window_x, window_y, win_w, win_h, SDL_WINDOW_SHOWN | ((fs)?SDL_WINDOW_FULLSCREEN:0)); } #endif if (SDL_VideoWindow == NULL) { fprintf(stderr, "Unable to create %dx%d window: %s\n", win_w, win_h, SDL_GetError()); return -1; } if (icon) SDL_SetWindowIcon(SDL_VideoWindow, icon); if (SDL_SetWindowDisplayMode(SDL_VideoWindow, (fs)?NULL:&desktop_mode) < 0) { fprintf(stderr, "Unable to set display mode: %s\n", SDL_GetError()); /* return -1; */ } if (!vsync_sw) vsync = 0; retry: if (software_sw || (!(Renderer = SDL_CreateRenderer(SDL_VideoWindow, -1, SDL_RENDERER_ACCELERATED | vsync | SDL_RENDERER_TARGETTEXTURE)) && !(Renderer = SDL_CreateRenderer(SDL_VideoWindow, -1, SDL_RENDERER_ACCELERATED)))) { fprintf(stderr, "Fallback to software renderer.\n"); sw_fallback = 1; if (!(Renderer = SDL_CreateRenderer(SDL_VideoWindow, -1, SDL_RENDERER_SOFTWARE))) { fprintf(stderr, "Unable to create renderer: %s\n", SDL_GetError()); return -1; } } SDL_GetRendererInfo(Renderer, &SDL_VideoRendererInfo); SDL_VideoTexture = SDL_CreateTexture(Renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h); if (!SDL_VideoTexture) { fprintf(stderr, "Unable to create texture: %s\n", SDL_GetError()); if (!sw_fallback) { /* one more chance */ SDL_DestroyRenderer(Renderer); software_sw = 1; goto retry; } return -1; } SDL_VideoSurface = CreateVideoSurface(SDL_VideoTexture); if (!SDL_VideoSurface) { fprintf(stderr, "Unable to create screen surface: %s\n", SDL_GetError()); return -1; } /* Set a default screen palette */ #if 0 if (SDL_VideoSurface->format->palette) { /* SDL_VideoSurface->flags |= SDL_HWPALETTE; SDL_DitherColors(SDL_VideoSurface->format->palette->colors, SDL_VideoSurface->format->BitsPerPixel); SDL_AddPaletteWatch(SDL_VideoSurface->format->palette, SDL_VideoPaletteChanged, SDL_VideoSurface); */ SDL_SetPaletteColors(SDL_VideoSurface->format->palette, SDL_VideoSurface->format->palette->colors, 0, SDL_VideoSurface->format->palette->ncolors); } #endif if (!nocursor_sw) SDL_ShowCursor(SDL_DISABLE); gfx_fs = fs; gfx_width = w; gfx_height = h; screen = GFX_IMG_REL(SDL_VideoSurface); if (!screen) { fprintf(stderr, "Can't alloc screen!\n"); return -1; } #ifdef _USE_SWROTATE if (gfx_flip_rotate) SDL_RenderSetLogicalSize(Renderer, h, w); else #endif SDL_RenderSetLogicalSize(Renderer, w, h); #if SDL_VERSION_ATLEAST(2,0,0) SDL_DelEventWatch(mouse_watcher, NULL); SDL_AddEventWatch(mouse_watcher, NULL); #endif fprintf(stderr, "Video mode: %dx%d@%dbpp (%s)\n", Surf(screen)->w, Surf(screen)->h, Surf(screen)->format->BitsPerPixel, SDL_VideoRendererInfo.name); done: SDL_SetRenderDrawBlendMode(Renderer, SDL_BLENDMODE_NONE); SDL_SetRenderDrawColor(Renderer, 0, 0, 0, 255); SDL_RenderClear(Renderer); SDL_RenderPresent(Renderer); SDL_FillRect(SDL_VideoSurface, NULL, SDL_MapRGB(SDL_VideoSurface->format, 0, 0, 0)); return 0; } #else int gfx_set_mode(int w, int h, int fs) { int hw = (software_sw)?0:SDL_HWSURFACE; SDL_Surface *scr; game_reset_name(); if (gfx_width == w && gfx_height == h && gfx_fs == fs) { return 0; /* already done */ } vid_modes = NULL; gfx_fs = fs; gfx_width = w; gfx_height = h; if (!nocursor_sw) SDL_ShowCursor(SDL_DISABLE); #ifdef S60 scr = SDL_SetVideoMode(gfx_width, gfx_height, 0, SDL_ANYFORMAT | hw | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #else #ifdef ANDROID scr = SDL_SetVideoMode(gfx_width, gfx_height, 0, hw | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #else #ifdef MAEMO scr = SDL_SetVideoMode(gfx_width, gfx_height, 16, SDL_DOUBLEBUF | hw | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #else #ifdef __APPLE__ scr = SDL_SetVideoMode(gfx_width, gfx_height, (fs)?32:0, SDL_SWSURFACE | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); if (scr == NULL) /* ok, fallback to anyformat */ scr = SDL_SetVideoMode(gfx_width, gfx_height, 0, SDL_ANYFORMAT | SDL_SWSURFACE | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #else #if !defined(_WIN32_WCE) && !defined(WINRT) #if SDL_VERSION_ATLEAST(1,3,0) scr = SDL_SetVideoMode(gfx_width, gfx_height, 32, SDL_DOUBLEBUF | hw | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #else scr = SDL_SetVideoMode(gfx_width, gfx_height, (fs)?32:0, SDL_DOUBLEBUF | hw | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #endif if (scr == NULL) /* ok, fallback to anyformat */ #endif scr = SDL_SetVideoMode(gfx_width, gfx_height, 0, SDL_ANYFORMAT | hw | ( ( fs ) ? SDL_FULLSCREEN : 0 ) ); #endif #endif #endif #endif screen = GFX_IMG_REL(scr); if (scr == NULL || screen == NULL) { fprintf(stderr, "Unable to set %dx%d video: %s\n", w, h, SDL_GetError()); return -1; } fprintf(stderr,"Video mode: %dx%d@%dbpp\n", scr->w, scr->h, scr->format->BitsPerPixel); gfx_clear(0, 0, gfx_width, gfx_height); return 0; } #endif int gfx_video_init(void) { #if !SDL_VERSION_ATLEAST(2,0,0) char title[4096]; strcpy( title, "INSTEAD - " ); strcat( title, VERSION ); #endif if (TTF_Init()) { fprintf(stderr, "Can't init TTF subsystem.\n"); return -1; } #if !SDL_VERSION_ATLEAST(2,0,0) SDL_WM_SetCaption( title, title ); #endif #ifndef ICON_PATH #define ICON_PATH "./icon" #endif icon = IMG_Load( ICON_PATH"/sdl_instead_1.png" ); #if !SDL_VERSION_ATLEAST(2,0,0) if ( icon ) { SDL_WM_SetIcon( icon, NULL ); } #endif return 0; } #if SDL_VERSION_ATLEAST(2,0,0) static int queue_x1 = -1; static int queue_y1 = -1; static int queue_x2 = -1; static int queue_y2 = -1; static int queue_dirty = 0; static SDL_Texture *cursor = NULL; static int cursor_xc = 0; static int cursor_yc = 0; static int cursor_w; static int cursor_h; static int cursor_on = 1; void gfx_set_cursor(img_t cur, int xc, int yc) { if (cursor) SDL_DestroyTexture(cursor); if (!cur) { cursor = NULL; cursor_w = 0; cursor_h = 0; return; } cursor = SDL_CreateTextureFromSurface(Renderer, Surf(cur)); if (!cursor) return; cursor_w = gfx_img_w(cur); cursor_h = gfx_img_h(cur); cursor_xc = xc; cursor_yc = yc; SDL_SetTextureBlendMode(cursor, SDL_BLENDMODE_BLEND); } void gfx_show_cursor(int on) { cursor_on = on; } static void gfx_render_copy(SDL_Texture *texture, SDL_Rect *dst, int clear) { #ifdef _USE_SWROTATE SDL_Rect r2; SDL_Point r; int w, h; if (gfx_flip_rotate) { if (clear) SDL_RenderClear(Renderer); SDL_QueryTexture(texture, NULL, NULL, &w, &h); r2.x = 0; r2.y = -h; r2.w = w; r2.h = h; r.x = 0; r.y = h; SDL_RenderCopyEx(Renderer, texture, NULL, &r2, 90, &r, 0); return; } #endif if (SDL_VideoRendererInfo.flags & SDL_RENDERER_ACCELERATED) { if (clear) SDL_RenderClear(Renderer); SDL_RenderCopy(Renderer, texture, NULL, NULL); } else SDL_RenderCopy(Renderer, texture, dst, dst); } static void gfx_render_cursor(void) { int cursor_x = 0; int cursor_y = 0; SDL_Rect rect; #ifdef _USE_SWROTATE SDL_Point r; #endif if (!cursor_on || !mouse_focus() || nocursor_sw) return; gfx_cursor(&cursor_x, &cursor_y); #ifdef _USE_SWROTATE if (gfx_flip_rotate) { int tmp = cursor_x; cursor_x = gfx_height - cursor_y; cursor_y = tmp; r.x = cursor_xc; r.y = cursor_yc; } #endif cursor_x -= cursor_xc; cursor_y -= cursor_yc; rect.x = cursor_x; rect.y = cursor_y; rect.w = cursor_w; /* - 1; */ /* SDL 2.0 hack? */ rect.h = cursor_h; /* - 1; */ #ifdef _USE_SWROTATE if (gfx_flip_rotate) SDL_RenderCopyEx(Renderer, cursor, NULL, &rect, 90, &r, 0); else #endif SDL_RenderCopy(Renderer, cursor, NULL, &rect); } static void SDL_UpdateRect(SDL_Surface * screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h); int SDL_Flip(SDL_Surface * screen) { SDL_Rect rect; int pitch, psize; unsigned char *pixels; if (!screen) return 0; pitch = screen->pitch; psize = screen->format->BytesPerPixel; pixels = screen->pixels; if (queue_dirty) { rect.x = queue_x1; rect.y = queue_y1; rect.w = queue_x2 - queue_x1; rect.h = queue_y2 - queue_y1; pixels += pitch * queue_y1 + queue_x1 * psize; SDL_UpdateTexture(SDL_VideoTexture, &rect, pixels, pitch); gfx_render_copy(SDL_VideoTexture, &rect, 1); SDL_RenderPresent(Renderer); } queue_x1 = queue_y1 = queue_x2 = queue_y2 = -1; queue_dirty = 0; return 0; } static void SDL_UpdateRect(SDL_Surface * screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h) { if (queue_x1 < 0 || x < queue_x1) queue_x1 = x; if (queue_y1 < 0 || y < queue_y1) queue_y1 = y; if ((Sint32)(x + w) > queue_x2) queue_x2 = (Sint32)(x + w); if ((Sint32)(y + h) > queue_y2) queue_y2 = (Sint32)(y + h); queue_dirty = 1; } #else void gfx_set_cursor(img_t cur, int xc, int yc) { return; } #endif void gfx_flip(void) { #if SDL_VERSION_ATLEAST(2,0,0) queue_x1 = queue_y1 = 0; queue_x2 = gfx_width; queue_y2 = gfx_height; queue_dirty = 1; #else SDL_Flip(Surf(screen)); #endif } void gfx_resize(int w, int h) { #if SDL_VERSION_ATLEAST(2,0,0) #if defined(ANDROID) || defined(IOS) current_gfx_w = w; current_gfx_h = h; #endif #endif } void gfx_commit(void) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_Flip(Surf(screen)); #endif } void gfx_update(int x, int y, int w, int h) { if (x < 0) { w += x; x = 0; } if (y < 0) { h += y; y = 0; } if (w < 0 || h < 0) return; if (x >= gfx_width || y >= gfx_height) return; if (x + w > gfx_width) { w = gfx_width - x; } if (y + h > gfx_height) { h = gfx_height - y; } SDL_UpdateRect(Surf(screen), x, y, w, h); } void gfx_video_done(void) { if (icon) SDL_FreeSurface(icon); screen = NULL; TTF_Quit(); } img_t gfx_scale(img_t src, float xscale, float yscale, int smooth) { anigif_t ag; if ((ag = is_anigif(src))) { int i; int err = 0; img_t img = NULL; anigif_t ag2; ag2 = ag_dup(ag); if (!ag2) return NULL; for (i = 0; i < ag->nr_frames; i ++) { SDL_Surface *s; s = (err) ? NULL : zoomSurface(ag->frames[i].surface, xscale, yscale, 1); if (!s) { err ++; ag2->frames[i].surface = NULL; continue; } ag2->frames[i].surface = s; ag2->frames[i].x = (float)(ag2->frames[i].x) * xscale; ag2->frames[i].y = (float)(ag2->frames[i].y) * yscale; } if (err) { anigif_free(ag2); return NULL; } anigif_add(ag2); /* scaled anigif added */ img = gfx_new_img(ag2->frames[0].surface, IMG_ANIGIF, ag2, 0); if (!img) { anigif_del(ag2); anigif_free(ag2); } return img; } return GFX_IMG_REL(zoomSurface(Surf(src), xscale, yscale, smooth)); } img_t gfx_rotate(img_t src, float angle, int smooth) { anigif_t ag; float rangle = (angle) * (M_PI / 180.0); if ((ag = is_anigif(src))) { int i; int w,h; int err = 0; img_t img = NULL; anigif_t ag2; float x, y; ag2 = ag_dup(ag); if (!ag2) return NULL; w = gfx_img_w(src); h = gfx_img_h(src); for (i = 0; i < ag->nr_frames; i ++) { float x1, y1, x2, y2, x3, y3, x4, y4; int w2, h2; float rsin, rcos; SDL_Surface *s; s = (err) ? NULL : rotozoomSurface(ag->frames[i].surface, angle, 1.0f, smooth); if (!s) { err ++; ag2->frames[i].surface = NULL; continue; } rsin = sin(rangle); rcos = cos(rangle); x = (float)(ag->frames[i].x) - (float)w / 2; y = (float)(ag->frames[i].y) - (float)h / 2; w2 = ag->frames[i].surface->w; h2 = ag->frames[i].surface->h; ag2->frames[i].surface = s; x1 = x * rcos - y * rsin; y1 = y * rcos + x * rsin; x2 = (x + (float)w2) * rcos - y * rsin; y2 = y * rcos + (x + (float)w2) * rsin; x3 = x * rcos - (y + (float)h2) * rsin; y3 = (y + (float)h2) * rcos + x * rsin; x4 = (x + (float)w2) * rcos - (y + (float)h2) * rsin; y4 = (y + (float)h2) * rcos + (x + (float)w) * rsin; if (x1 > x2) x1 = x2; if (x1 > x3) x1 = x3; if (x1 > x4) x1 = x4; if (y1 > y2) y1 = y2; if (y1 > y3) y1 = y3; if (y1 > y4) y1 = y4; w2 = s->w; h2 = s->h; ag2->frames[i].x = x1 + (float)w2 / 2; ag2->frames[i].y = y1 + (float)h2 / 2; } if (err) { anigif_free(ag2); return NULL; } anigif_add(ag2); /* rotated anigif added */ img = gfx_new_img(ag2->frames[0].surface, IMG_ANIGIF, ag2, 0); if (!img) { anigif_del(ag2); anigif_free(ag2); } return img; } return GFX_IMG_REL(rotozoomSurface(Surf(src), angle, 1.0f, smooth)); } #define FN_REG 0 #define FN_BOLD 1 #define FN_ITALIC 2 #define FN_ITALICBOLD 3 #define FN_MAX 4 struct fnt { TTF_Font *fn; TTF_Font *fonts[FN_MAX]; int style; }; /* prefix{regular,italic, bold, bolditalic}.ttf */ static int parse_fn(const char *f, char *files[]) { int e; int nr = 0; int elen; const char *ep = f; const char *s = f; int pref = strcspn(f, "{"); if (!f[pref]) goto no; f += pref + 1; ep = f; ep += strcspn(f, "}"); if (!*ep) goto no; ep ++; elen = strlen(ep); while (1) { f += strspn(f, " \t"); e = strcspn(f, ",}"); if (!e) { /* empty subst */ files[nr] = NULL; goto skip; } files[nr] = malloc(e + pref + elen + 1); if (!files[nr]) break; if (pref) memcpy(files[nr], s, pref); if (e) memcpy(files[nr] + pref, f, e); if (elen) memcpy(files[nr] + pref + e, ep, elen); *(files[nr] + pref + e + elen) = 0; skip: nr ++; if (!f[e] || f[e] == '}') break; f += e + 1; if (nr >=4) break; } return nr; no: files[0] = strdup(s); return (files[0])?1:0; } extern int hinting_sw; fnt_t fnt_load(const char *fname, int size) { TTF_Font *fn; struct fnt *h; int i, n = 0; char *files[4] = { NULL, NULL, NULL, NULL }; h = malloc(sizeof(struct fnt)); if (!h) return NULL; h->fonts[0] = h->fonts[1] = h->fonts[2] = h->fonts[3] = NULL; n = parse_fn(fname, files); if (!n) goto err; for (i = 0; i < n; i++) { fn = NULL; if (!is_empty(files[i])) { SDL_RWops *rw = RWFromIdf(instead_idf(), files[i]); if (!rw || !(fn = TTF_OpenFontRW(rw, 1, size))) { fprintf(stderr, "Can not load font: '%s'\n", files[i]); } } if (!fn && i == 0) /* no regular */ goto err; #ifdef TTF_HINTING_LIGHT if (fn) { switch (hinting_sw) { case 0: TTF_SetFontHinting(fn, TTF_HINTING_NORMAL); break; case 1: TTF_SetFontHinting(fn, TTF_HINTING_LIGHT); break; case 2: TTF_SetFontHinting(fn, TTF_HINTING_MONO); break; case 3: TTF_SetFontHinting(fn, TTF_HINTING_NONE); break; default: break; } } #endif h->fonts[i] = fn; } h->fn = h->fonts[FN_REG]; for (i = 0; i < n; i++) free(files[i]); return (fnt_t) h; err: for (i = 0; i < n; i++) free(files[i]); fnt_free(h); return NULL; } void fnt_style(fnt_t fn, int style) { struct fnt *h = (struct fnt*)fn; if (!h) return; h->style = style; if ((style & TTF_STYLE_BOLD) && (style & TTF_STYLE_ITALIC)) { if (h->fonts[FN_ITALICBOLD]) { h->fn = h->fonts[FN_ITALICBOLD]; style &= ~TTF_STYLE_BOLD; style &= ~TTF_STYLE_ITALIC; } else h->fn = h->fonts[FN_REG]; } else if ((style & TTF_STYLE_BOLD)) { if (h->fonts[FN_BOLD]) { h->fn = h->fonts[FN_BOLD]; style &= ~TTF_STYLE_BOLD; } else h->fn = h->fonts[FN_REG]; } else if ((style & TTF_STYLE_ITALIC)) { if (h->fonts[FN_ITALIC]) { h->fn = h->fonts[FN_ITALIC]; style &= ~TTF_STYLE_ITALIC; } else h->fn = h->fonts[FN_REG]; } else { h->fn = h->fonts[FN_REG]; } TTF_SetFontStyle((TTF_Font *)h->fn, style); } img_t fnt_render(fnt_t fn, const char *p, color_t col) { SDL_Color scol = { .r = col.r, .g = col.g, .b = col.b }; struct fnt *h = (struct fnt*)fn; if (!h) return NULL; return GFX_IMG_REL(TTF_RenderUTF8_Blended((TTF_Font *)h->fn, p, scol)); } int fnt_height(fnt_t fn) { struct fnt *h = (struct fnt*)fn; if (!fn) return 0; return TTF_FontHeight((TTF_Font *)(h->fonts[FN_REG])); } void fnt_free(fnt_t fnt) { int i; struct fnt *h = (struct fnt*)fnt; if (!fnt) return; for (i = 0; i < FN_MAX; i++) { if (h->fonts[i]) TTF_CloseFont((TTF_Font *)h->fonts[i]); } free(h); } void txt_draw(fnt_t fnt, const char *txt, int x, int y, color_t col) { img_t s = fnt_render(fnt, txt, col); if (!s) return; gfx_draw(s, x, y); } #if 0 int txt_width(fnt_t fnt, const char *txt) { const char *p = txt; int c = 0; int w = 0; Uint16 u = 0; struct fnt *f = (struct fnt*)fnt; if (!f) return 0; while (*p) { if (!c) { if (! (*p & 0x80)) { /* ascii */ c = 1; u = *p & 0x7f; } else { if ((*p & 0xe0) == 0xc0) { c = 2; u = *p & 0x1f; } else if ((*p & 0xf0) == 0xe0) { c = 3; u = *p & 0xf; } else if ((*p & 0xf8) == 0xf0) { c = 4; u = *p & 0x3; } else { c = 1; u = *p & 0x7f; /* fallback */ } } } else { if ((*p & 0xc0) != 0x80) { c = 1; u = *p & 0x7f; /* fallback */ } else { u <<= 6; u |= *p & 0x3f; } } c --; if (!c) { int adv = 0; TTF_GlyphMetrics(f->fn, u, NULL, NULL, NULL, NULL, &adv); w += adv; } p ++; } return w; } #endif void txt_size(fnt_t fnt, const char *txt, int *w, int *h) { int ww, hh; struct fnt *f = (struct fnt*)fnt; TTF_SizeUTF8((TTF_Font *)f->fn, txt, &ww, &hh); if (w) *w = ww; if (h) *h = hh; } struct word; struct line; struct xref; struct word { int style; int x; int w; int unbrake; int valign; int img_align; char *word; img_t img; struct word *next; /* in line */ struct word *prev; /* in line */ struct line *line; struct xref *xref; img_t prerend; img_t hlprerend; }; img_t word_image(word_t v) { struct word *w = (struct word*)v; if (!w) return NULL; return w->img; } struct word *word_new(const char *str) { struct word *w; w = malloc(sizeof(struct word)); if (!w) return NULL; w->word = strdup(str); w->next = NULL; w->x = 0; w->w = 0; w->valign = 0; w->line = NULL; w->xref = NULL; w->style = 0; w->img = NULL; w->img_align = 0; w->unbrake = 0; w->prerend = NULL; w->hlprerend = NULL; return w; } struct line { int x; int y; int h; int w; int num; int align; int pos; int tabx; int al_tabx; int taby; int al_taby; struct word *words; struct line *next; struct line *prev; struct layout *layout; }; static int vertical_align(struct word *w, int *hh); int word_geom(word_t v, int *x, int *y, int *w, int *h) { int xx, yy, ww, hh; struct line *line; struct word *word = (struct word*)v; if (!word || !word->line) return -1; line = word->line; xx = word->x + line->x; ww = word->w; yy = line->y; yy += vertical_align(v, &hh); if (x) *x = xx; if (y) *y = yy; if (w) *w = ww; if (h) *h = hh; return 0; } struct line *line_new(void) { struct line *l; l = malloc(sizeof(struct line)); if (!l) return NULL; l->words = NULL; l->next = NULL; l->prev = NULL; l->x = 0; l->w = 0; l->y = 0; l->h = 0; l->num = 0; l->tabx = -1; l->al_tabx = ALIGN_LEFT; l->taby = -1; l->al_taby = ALIGN_BOTTOM; l->layout = NULL; l->align = 0; l->pos = 0; return l; } int line_empty(struct line *line) { struct word *w; w = line->words; while (w) { if (w->img_align) { w = w->next; continue; } return 0; } return 1; } static int line_margin(struct line *line) { struct word *w; w = line->words; while (w) { if (w->img_align) return 1; w = w->next; } return 0; } static struct word *next_word(struct word *w) { while (w->next && w->next->img_align) /* skip margins */ w = w->next; return w->next; } void line_justify(struct line *line, int width) { int x = 0; int last_margin = 0; int last_unbrake = 0; struct word *w; int sp, spm, lw = 0; int lnum = 0; if (!line || line->num <= 1 /*|| width <= line->w*/) return; w = line->words; while (w) { lw += w->w; if (last_margin && w->unbrake) w->unbrake = last_unbrake; if (!w->unbrake && !w->img_align) lnum ++; if (!last_margin && w->img_align) last_unbrake = w->unbrake; last_margin = w->img_align; w = w->next; } if (lnum <=1 ) return; w = line->words; sp = (width - lw) / (lnum - 1); spm = (width - lw) % (lnum - 1); while (w) { if (!w->img_align) { w->x = x; if (next_word(w) && next_word(w)->unbrake) x += w->w; else { x += w->w + sp + ((spm)?1:0); if (spm) spm --; } } w = w->next; } } void line_right(struct line *line, int width) { struct word *w; int sp; if (!line || line->num == 0) return; sp = width - line->w; w = line->words; while (w) { if (!w->img_align) { w->x += sp; } w = w->next; } } void line_center(struct line *line, int width) { struct word *w; int sp; if (!line || line->num == 0) return; sp = (width - line->w)/2; w = line->words; while (w) { if (!w->img_align) { w->x += sp; } w = w->next; } } void line_align(struct line *line, int width, int style, int nl) { if (style == ALIGN_JUSTIFY) { if (nl) return; line_justify(line, width); return; } if (style == ALIGN_CENTER) { line_center(line, width); return; } if (style == ALIGN_LEFT) return; if (style == ALIGN_RIGHT) { line_right(line, width); return; } } void word_free(struct word *word); void line_free(struct line *line) { struct word *w; if (!line) return; w = line->words; while (w) { struct word *ow = w; w = w->next; word_free(ow); } free(line); } void line_add_word(struct line *l, struct word *word) { struct word *w = l->words; l->num ++; word->line = l; if (!l->words) { l->words = word; word->prev = word; return; } w = w->prev; w->next = word; word->prev = w; l->words->prev = word; return; } struct image; struct image { struct image *next; char *name; img_t image; int free_it; }; struct image *image_new(const char *name, img_t img) { struct image *g = malloc(sizeof(struct image)); if (!g) return NULL; g->image = img; g->name = strdup(name); g->next = NULL; g->free_it = 0; return g; } void image_free(struct image *image) { if (!image) return; if (image->name) free(image->name); if (image->free_it) gfx_free_image(image->image); free(image); } struct textbox; #define ALIGN_NEST 16 struct margin; struct margin { struct margin *next; int w; int h; int y; int align; struct word *word; }; struct margin *margin_new(void) { struct margin *m = malloc(sizeof(struct margin)); if (!m) return NULL; m->w = m->h = m->align = 0; m->next = NULL; return m; } void margin_free(struct margin *m) { if (m) free(m); } struct layout { fnt_t fn; float fn_height; color_t col; color_t lcol; color_t acol; struct image *images; struct xref *xrefs; struct line *lines; struct line *anchor; struct textbox *box; struct margin *margin; int w; int h; int align; int valign; int saved_align[ALIGN_NEST]; int saved_valign[ALIGN_NEST]; int acnt; int vcnt; int style; int scnt[4]; int lstyle; cache_t img_cache; cache_t prerend_cache; cache_t hlprerend_cache; }; struct xref { struct xref *next; struct xref *prev; struct word **words; struct layout *layout; char *link; int num; int active; }; struct textbox { struct layout *lay; struct line *line; int off; int w; int h; }; void word_free(struct word *word) { if (!word) return; /* if (word->img) gfx_free_image(word->img); */ if (word->word) free(word->word); if (word->prerend) { cache_forget(word->line->layout->prerend_cache, word->prerend); /* SDL_FreeSurface(word->prerend); */ } if (word->hlprerend) { cache_forget(word->line->layout->hlprerend_cache, word->hlprerend); /* SDL_FreeSurface(word->hlprerend); */ } word->hlprerend = word->prerend = NULL; free(word); } struct xref *xref_new(char *link) { struct xref *p; p = malloc(sizeof(struct xref)); if (!p) return NULL; if (link) p->link = strdup(link); else p->link = NULL; p->num = 0; p->layout = NULL; p->next = NULL; p->prev = NULL; p->active = 0; p->words = NULL; return p; } int xref_add_word(struct xref *xref, struct word *word) { struct word **new_words; new_words = realloc(xref->words, (xref->num + 1) * sizeof(struct word*)); if (!new_words) return -1; xref->words = new_words; xref->words[xref->num ++] = word; word->xref = xref; return 0; } void xref_free(struct xref *xref) { if (xref->link) free(xref->link); if (xref->words) free(xref->words); free(xref); } void layout_add_line(struct layout *layout, struct line *line) { struct line *l = layout->lines; line->layout = layout; if (!l) { layout->lines = line; line->prev = line; return; } l = l->prev; l->next = line; line->prev = l; layout->lines->prev = line; return; } void layout_add_margin(struct layout *layout, struct margin *margin) { struct margin *m = layout->margin; if (!m) { layout->margin = margin; return; } while (m->next) m = m->next; m->next = margin; return; } #if 1 static int layout_skip_margin(struct layout *layout, int y) { struct margin *m = layout->margin; int my = y; if (!m) return y; while (m) { if (m->y + m->h > my) my = m->y + m->h; m = m->next; } if (y < my) y = my; return y; } #endif static void margin_rebase(struct layout *layout) { struct margin *m = layout->margin; if (!m) return; while (m) { m->y = m->word->line->y; m = m->next; } } static int layout_find_margin(struct layout *layout, int y, int *w) { struct margin *m = layout->margin; int xpos = 0; int rpos = layout->w; if (!m) { if (w) *w = layout->w; return 0; } while (m) { if (y >= m->y && y < m->y + m->h) { if (m->align == ALIGN_LEFT) xpos = (xpos < m->w)?m->w:xpos; else rpos = (rpos > layout->w - m->w)?layout->w - m->w:rpos; } m = m->next; } if (w) *w = rpos - xpos; return xpos; } struct image *_layout_lookup_image(struct layout *layout, const char *name) { struct image *g; for (g = layout->images; g; g = g->next) { if (!strcmp(g->name, name)) return g; } return NULL; } img_t txt_layout_images(layout_t lay, void **v) { struct image **g = (struct image **)v; struct layout *layout = (struct layout *)lay; if (!layout) return NULL; if (!*v) *v = layout->images; else *v = (*g)->next; if (!*v) return NULL; return (*g)->image; } textbox_t txt_layout_box(layout_t lay) { struct layout *layout = (struct layout *)lay; return layout->box; } void layout_add_image(struct layout *layout, struct image *image) { struct image *g = layout->images; if (!g) { layout->images = image; return; } while (g->next) g = g->next; g->next = image; return; } img_t layout_lookup_image(struct layout *layout, char *name) { struct image *g = _layout_lookup_image(layout, name); return (g)?g->image: NULL; } void layout_add_xref(struct layout *layout, struct xref *xref) { struct xref *x = layout->xrefs; xref->layout = layout; if (!x) { layout->xrefs = xref; xref->prev = xref; return; } x = x->prev; x->next = xref; xref->prev = x; layout->xrefs->prev = xref; return; } static void sdl_surface_free(void *p) { gfx_free_img((img_t)p); } struct layout *layout_new(fnt_t fn, int w, int h) { struct layout *l; l = malloc(sizeof(struct layout)); if (!l) return NULL; l->lines = NULL; l->anchor = NULL; l->images = NULL; l->w = w; l->h = h; l->fn = fn; l->fn_height = 1.0f; l->align = ALIGN_JUSTIFY; l->valign = 0; l->style = 0; l->lstyle = 0; l->xrefs = NULL; l->margin = NULL; l->col = gfx_col(0, 0, 0); l->lcol = gfx_col(0, 0, 255); l->acol = gfx_col(255, 0, 0); l->box = NULL; l->img_cache = cache_init(0, gfx_cache_free_image); l->prerend_cache = cache_init(0, sdl_surface_free); l->hlprerend_cache = cache_init(0, sdl_surface_free); memset(l->scnt, 0, sizeof(l->scnt)); memset(l->saved_align, 0, sizeof(l->saved_align)); memset(l->saved_valign, 0, sizeof(l->saved_valign)); l->acnt = 0; l->vcnt = 0; return l; } void txt_layout_size(layout_t lay, int *w, int *h) { struct layout *layout = (struct layout *)lay; if (!lay) return; if (w) *w = layout->w; if (h) *h = layout->h; } void txt_layout_set_size(layout_t lay, int w, int h) { struct layout *layout = (struct layout *)lay; if (!lay) return; layout->w = w; layout->h = h; } int txt_layout_add_img(layout_t lay, const char *name, img_t img) { struct layout *layout = (struct layout *)lay; struct image *image; image = _layout_lookup_image(layout, name); if (image) { /* overwrite */ image->image = img; return 0; } image = image_new(name, img); if (!image) return -1; layout_add_image(layout, image); return 0; } void _txt_layout_free(layout_t lay) { struct layout *layout = (struct layout *)lay; struct line *l; struct image *g; struct xref *x; struct margin *m; if (!layout) return; l = layout->lines; while (l) { struct line *ol = l; l = l->next; line_free(ol); } x = layout->xrefs; while (x) { struct xref *ox = x; x = x->next; xref_free(ox); } m = layout->margin; while (m) { struct margin *om = m; m = m->next; margin_free(om); } g = layout->images; while (g) { struct image *og = g; g = g->next; if (!cache_have(layout->img_cache, og->image)) og->free_it = 0; /* do not free from cache */ cache_forget(layout->img_cache, og->image); image_free(og); } layout->images = NULL; layout->xrefs = NULL; layout->lines = NULL; layout->anchor = NULL; layout->margin = NULL; memset(layout->scnt, 0, sizeof(layout->scnt)); memset(layout->saved_align, 0, sizeof(layout->saved_align)); memset(layout->saved_valign, 0, sizeof(layout->saved_valign)); layout->acnt = 0; layout->vcnt = 0; } word_t txt_layout_words_ex(layout_t lay, struct line *line, word_t v, int off, int height) { struct layout *layout = (struct layout*)lay; struct word *w = (struct word*)v; if (!lay) return NULL; if (!w) { if (!line) line = layout->lines; if (!line) return NULL; w = line->words; } else { line = w->line; w = w->next; } for (; (!w || (line->y + line->h) < off) && line->next; line = line->next, w = line->words); if ((line->y + line->h) < off) w = NULL; else if (height >= 0 && line->y - off > height) w = NULL; return w; } word_t txt_layout_words(layout_t lay, word_t v) { return txt_layout_words_ex(lay, NULL, v, 0, -1); } void txt_layout_free(layout_t lay) { struct layout *layout = (struct layout *)lay; _txt_layout_free(lay); if (lay) { cache_free(layout->img_cache); cache_free(layout->prerend_cache); cache_free(layout->hlprerend_cache); layout->img_cache = NULL; layout->prerend_cache = NULL; layout->hlprerend_cache = NULL; free(lay); } } #define TOKEN_NONE 0x000 #define TOKEN_A 0x001 #define TOKEN_B 0x002 #define TOKEN_I 0x004 #define TOKEN_U 0x008 #define TOKEN_S 0x010 #define TOKEN_C 0x020 #define TOKEN_R 0x040 #define TOKEN_J 0x080 #define TOKEN_L 0x100 #define TOKEN_T 0x200 #define TOKEN_D 0x400 #define TOKEN_M 0x800 #define TOKEN_X 0x1000 #define TOKEN_Y 0x2000 #define TOKEN_CLOSE 0x4000 #define TOKEN(x) (x & 0x3fff) int gfx_get_token(const char *ptr, char **eptr, char **val, int *sp) { int y_token = 0; char *ep, *p; int closing = 0; if (eptr) *eptr = NULL; p = (char*)ptr; ptr += strspn(ptr, " \t"); if (sp) { *sp = 0; if (p != ptr) *sp = 1; } if (val) *val = NULL; if (!*ptr) return 0; if (*ptr != '<') return 0; ptr ++; if (*ptr == '/') { closing = 1; if (!ptr[1] || ptr[2] != '>') return 0; ptr ++; } switch (*ptr) { case 'y': y_token = 1; /* Fall through */ case 'x': if (ptr[1] != ':') return 0; ptr += 2; ep = find_in_esc(ptr, "\\>"); if (*ep != '>') return 0; if (val) { p = malloc(ep - ptr + 1); if (!p) return 0; memcpy(p, ptr, ep - ptr); p[ep - ptr] = 0; *val = p; } if (eptr) *eptr = ep + 1; return (y_token)?TOKEN_Y:TOKEN_X; case 'a': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_A | TOKEN_CLOSE; } if (ptr[1] != ':') { return 0; } ptr += 2; /* ep = (char*)ptr + strcspn(ptr, ">"); */ ep = find_in_esc(ptr, "\\>"); if (!ep || *ep != '>') { return 0; } if (val) { p = malloc(ep - ptr + 1); if (!p) return 0; memcpy(p, ptr, ep - ptr); p[ep - ptr] = 0; parse_esc_string(p, val); if (*val) free(p); else *val = p; } if (eptr) *eptr = ep + 1; return TOKEN_A; case 'b': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_B | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_B; } break; case 'i': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_I | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_I; } break; case 's': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_S | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_S; } break; case 't': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_T | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_T; } break; case 'd': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_D | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_D; } break; case 'm': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_M | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_M; } break; case 'u': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_U | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_U; } break; case 'c': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_C | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_C; } break; case 'r': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_R | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_R; } break; case 'j': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_J | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_J; } break; case 'l': if (closing) { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_L | TOKEN_CLOSE; } if (ptr[1] == '>') { if (eptr) *eptr = (char*)ptr + 2; return TOKEN_L; } break; } return 0; } static int is_delim(int c) { switch(c) { case '.': case ',': case ':': case '!': case '+': case '-': case '?': case '/': return 1; } return 0; } static int process_word_token(const char *p, char **eptr, char ch) { char *ep; if (eptr) *eptr = (char*)p; if (!p) return 0; if (p[0] != '<' || p[1] != ch || p[2] != ':') return 0; p += 3; ep = find_in_esc(p, "\\>"); if (*ep != '>') return 0; if (eptr) *eptr = ep + 1; return (ep - p + 1); } static int word_img(const char *p, char **eptr) { return process_word_token(p, eptr, 'g'); } static int word_token(const char *p, char **eptr) { return process_word_token(p, eptr, 'w'); } static int lookup_cjk(const char *ptr, int limit) { unsigned long sym; int off = 0, rc; while ((rc = get_utf8(ptr, &sym))) { if (is_cjk(sym)) return off; off += rc; ptr += rc; if (off >= limit) break; } return off; } static int cjk_here(const char *ptr) { unsigned long sym; int rc; rc = get_utf8(ptr, &sym); if (is_cjk(sym)) return rc; return 0; } static const char *lookup_token_or_sp(const char *ptr) { char *eptr; const char *p = ptr; while (*p) { int cjk, rc; rc = strcspn(p, " .,:!+-?/<\t\n"); cjk = lookup_cjk(p, rc); if (p[cjk] && cjk < rc) { /* cjk symbol found! */ rc = cjk; if (!rc) rc += get_utf8(p, NULL); } p += rc; if (*p != '<' ) { while (is_delim(*p)) p ++; /* if (is_delim(*p)) p ++; */ return p; } if (!gfx_get_token(p, &eptr, NULL, NULL)) { if (word_img(p, &eptr)) { if (p == ptr) /* first one */ p = eptr; return p; } else if (word_token(p, &eptr)) { if (p == ptr) /* first one */ p = eptr; return p; } p ++; continue; } return p; } return ptr; } #define BREAK_NONE 0 #define BREAK_SPACE 1 static char *get_word(const char *ptr, char **eptr, int *sp) { const char *ep; char *o; size_t sz; *eptr = NULL; o = (char*)ptr; ptr += strspn(ptr, " \t"); if (sp) { *sp = BREAK_NONE; if (o != ptr) *sp = BREAK_SPACE; } if (!*ptr) return NULL; ep = lookup_token_or_sp(ptr); /* ep += strcspn(ep, " \t\n"); */ sz = ep - ptr; o = malloc(sz + 1); memcpy(o, ptr, sz); o[sz] = 0; sz = word_img(ptr, eptr); if (sz) return o; sz = word_token(ptr, eptr); if (sz) return o; *eptr = (char*)ep; return o; } void layout_debug(struct layout *layout) { struct line *line; struct word *word; line = layout->lines; while (line) { printf("%d of %d)", line->y, line->num); word = line->words; while (word) { printf("%d)%s ", word->x, word->word); word = word->next; } printf("\n"); line = line->next; } } void txt_layout_color(layout_t lay, color_t fg) { struct layout *layout = (struct layout*)lay; if (!lay) return; layout->col = fg; } void txt_layout_font_height(layout_t lay, float height) { struct layout *layout = (struct layout*)lay; if (!lay) return; layout->fn_height = height; } void txt_layout_link_color(layout_t lay, color_t link) { struct layout *layout = (struct layout*)lay; if (!lay) return; layout->lcol = link; } void txt_layout_active_color(layout_t lay, color_t link) { struct layout *layout = (struct layout*)lay; if (!lay) return; layout->acol = link; } void txt_layout_link_style(layout_t lay, int style) { struct layout *layout = (struct layout*)lay; if (!lay) return; layout->lstyle = style; } static char *word_cache_string(struct word *w, Uint32 style) { char *p; int len = 0; len = (w->word)?strlen(w->word):0; len += 16; p = malloc(len); if (!p) return NULL; snprintf(p, len, "%s-%08x", (w->word)?w->word:"", style); return p; } static void word_render(struct layout *layout, struct word *word, int x, int y) { char *wc = NULL; img_t s; img_t prerend = NULL; img_t hlprerend = NULL; color_t fgcol = { .r = layout->col.r, .g = layout->col.g, .b = layout->col.b }; color_t lcol = { .r = layout->lcol.r, .g = layout->lcol.g, .b = layout->lcol.b }; color_t acol = { .r = layout->acol.r, .g = layout->acol.g, .b = layout->acol.b }; Uint32 style; if (!word->xref) { style = (fgcol.r << 24) + (fgcol.g << 16) + (fgcol.b << 8); } else if (word->xref->active) { style = (acol.r << 24) + (acol.g << 16) + (acol.b << 8); } else { style = (lcol.r << 24) + (lcol.g << 16) + (lcol.b << 8); } if (word->xref && !word->style) { fnt_style(layout->fn, layout->lstyle); wc = word_cache_string(word, layout->lstyle | style); } else { fnt_style(layout->fn, word->style); wc = word_cache_string(word, word->style | style); } if (!wc) return; if (!word->xref) { if (!word->prerend) { prerend = cache_get(layout->prerend_cache, wc); if (!prerend) { word->prerend = fnt_render(layout->fn, word->word, fgcol); word->prerend = gfx_display_alpha(word->prerend); cache_add(layout->prerend_cache, wc, word->prerend); } else { word->prerend = prerend; } } s = word->prerend; } else if (word->xref->active) { if (!word->hlprerend) { hlprerend = cache_get(layout->hlprerend_cache, wc); if (!hlprerend) { word->hlprerend = fnt_render(layout->fn, word->word, acol); word->hlprerend = gfx_display_alpha(word->hlprerend); cache_add(layout->hlprerend_cache, wc, word->hlprerend); } else { word->hlprerend = hlprerend; } } s = word->hlprerend; } else { if (!word->prerend) { prerend = cache_get(layout->prerend_cache, wc); if (!prerend) { word->prerend = fnt_render(layout->fn, word->word, lcol); word->prerend = gfx_display_alpha(word->prerend); cache_add(layout->prerend_cache, wc, word->prerend); } else { word->prerend = prerend; } } s = word->prerend; } free(wc); if (!s) return; gfx_draw(s, x, y); } fnt_t txt_layout_font(layout_t lay) { struct layout *layout = lay; if (!lay) return NULL; return layout->fn; } static int vertical_align(struct word *w, int *hh) { int h; struct line *line = w->line; struct layout *layout = line->layout; if (w->img) h = gfx_img_h(w->img); else h = fnt_height(layout->fn); if (hh) *hh = h; if (w->img && w->img_align) return 0; if (w->valign == ALIGN_TOP) return 0; else if (w->valign == ALIGN_BOTTOM) return line->h - h; return (line->h - h) / 2; } static void word_image_render(struct word *word, int x, int y, clear_fn clear, update_fn update) { struct line *line = word->line; struct layout *layout = line->layout; int yy; if (clear && !word->xref) return; yy = vertical_align(word, NULL); if (clear) { if (word->img) { if (word->img_align) clear(x + word->x, y + line->y + yy, gfx_img_w(word->img), gfx_img_h(word->img)); else clear(x + line->x + word->x, y + line->y + yy, gfx_img_w(word->img), gfx_img_h(word->img)); } else clear(x + line->x + word->x, y + line->y/* + yy*/, word->w, line->h); } if (word->img) { if (word->img_align) gfx_draw(word->img, x + word->x, y + line->y + yy); else gfx_draw(word->img, x + line->x + word->x, y + line->y + yy); if (update) update(x + word->x, y + line->y + yy, gfx_img_w(word->img), gfx_img_h(word->img)); } else { word_render(layout, word, x + line->x + word->x, y + yy + line->y); if (update) update(x + line->x + word->x, y + line->y + yy, word->w, line->h); } } void xref_update(xref_t pxref, int x, int y, clear_fn clear, update_fn update) { int i; struct xref *xref = (struct xref*)pxref; struct layout *layout; struct word *word; if (!xref) return; layout = xref->layout; if (layout->box) { gfx_clip(x, y, layout->box->w, layout->box->h); y -= (layout->box)->off; } for (i = 0; i < xref->num; i ++) { word = xref->words[i]; if (!word->img_align) word_image_render(word, x, y, clear, update); } gfx_noclip(); } void txt_layout_draw_ex(layout_t lay, struct line *line, int x, int y, int off, int height, clear_fn clear) { void *v; img_t img; struct layout *layout = (struct layout*)lay; struct margin *margin; struct word *word; /* line = layout->lines; gfx_clip(x, y, layout->w, layout->h); */ if (!lay) return; for (v = NULL; (img = txt_layout_images(lay, &v)); ) gfx_dispose_gif(img); for (margin = layout->margin; margin; margin = margin->next) { if (margin->y + margin->h < off) continue; if (margin->y - off > height) continue; word_image_render(margin->word, x, y, clear, NULL); } if (!line) line = layout->lines; for (; line; line= line->next) { if ((line->y + line->h) < off) continue; if (line->y - off > height) break; for (word = line->words; word; word = word->next ) { if (!word->img_align) word_image_render(word, x, y, clear, NULL); } } cache_shrink(layout->prerend_cache); cache_shrink(layout->hlprerend_cache); cache_shrink(layout->img_cache); /* gfx_noclip(); */ } void txt_layout_draw(layout_t lay, int x, int y) { struct layout *layout = (struct layout*)lay; txt_layout_draw_ex(lay, NULL, x, y, 0, layout->h, 0); } textbox_t txt_box(int w, int h) { struct textbox *box; box = malloc(sizeof(struct textbox)); if (!box) return NULL; box->lay = NULL; /* (struct layout*)lay; */ box->w = w; box->h = h; box->off = 0; box->line = NULL; /* (box->lay)->lines; */ return box; } void txt_box_norm(textbox_t tbox) { struct textbox *box = (struct textbox *)tbox; struct line *line; int off; if (!tbox || !box->lay) return; off = box->off; box->line = box->lay->lines; for (line = box->line; line; line = line->next) { if (off < line->h) break; off -= line->h; box->line = line; } } layout_t txt_box_layout(textbox_t tbox) { struct textbox *box = (struct textbox *)tbox; if (!box) return NULL; return box->lay; } void txt_box_set(textbox_t tbox, layout_t lay) { struct textbox *box = (struct textbox *)tbox; if (!box) return; box->lay = (struct layout*)lay; box->off = 0; if (lay) box->lay->box = box; txt_box_norm(tbox); } void txt_box_resize(textbox_t tbox, int w, int h) { struct textbox *box = (struct textbox *)tbox; if (!tbox) return; if (w < 0) w = 0; if (h < 0) h = 0; box->w = w; box->h = h; txt_box_norm(tbox); } void txt_box_size(textbox_t tbox, int *w, int *h) { struct textbox *box = (struct textbox *)tbox; if (!tbox) return; if (w) *w = box->w; if (h) *h = box->h; } void txt_box_scroll_next(textbox_t tbox, int disp) { int off, h; struct textbox *box = (struct textbox *)tbox; struct line *line; if (!tbox) return; line = box->line; if (!line) return; txt_box_real_size(box, NULL, &h); if (h - box->off < box->h) return; off = h - box->off - box->h; if (disp > off) disp = off; off = box->off - line->y; /* offset from cur line */ off += disp; /* needed offset */ while (line->next && off >= line->next->y - line->y) { off -= (line->next->y - line->y); line = line->next; } box->line = line; box->off = line->y + off; } void txt_box_scroll_prev(textbox_t tbox, int disp) { int off; struct textbox *box = (struct textbox *)tbox; struct line *line; struct layout *l; if (!tbox) return; l = box->lay; line = box->line; if (!line) return; off = box->off - line->y; /* offset from cur line */ off -= disp; /* offset from current line */ while (line != l->lines && off < 0) { line = line->prev; off += (line->next->y - line->y); } box->line = line; box->off = line->y + off; if (box->off <0) box->off = 0; } void txt_box_scroll(textbox_t tbox, int disp) { if (!tbox) return; if (disp >0) { txt_box_scroll_next(tbox, disp); return; } else if (disp <0) { txt_box_scroll_prev(tbox, -disp); return; } } void txt_box_next_line(textbox_t tbox) { struct textbox *box = (struct textbox *)tbox; struct line *line; if (!box || !box->lay) return; line = box->line; if (!line) return; /* txt_box_norm(tbox); */ if (box->lay->h - box->off < box->h) return; line = line->next; if (line) { box->off = line->y; box->line = line; } } void txt_box_prev_line(textbox_t tbox) { struct textbox *box = (struct textbox *)tbox; struct line *line; struct layout *l; if (!box || !box->lay) return; l = box->lay; line = box->line; if (!line) return; if (line != l->lines) { line = line->prev; box->line = line; box->off = line->y; } else box->off = 0; } int txt_box_off(textbox_t tbox) { struct textbox *box = (struct textbox *)tbox; if (!box) return -1; return box->off; } void txt_box_next(textbox_t tbox) { struct textbox *box = (struct textbox *)tbox; struct line *line; if (!tbox) return; line = box->line; if (!line) return; for (; line; line = line->next) { if ((line->y + line->h - box->off) >= box->h) break; } if (line) { box->off += (line->y - box->off); box->line = line; } } void txt_box_prev(textbox_t tbox) { struct textbox *box = (struct textbox *)tbox; struct layout *lay; struct line *line; if (!tbox) return; lay = box->lay; if (!lay) return; line = box->line; if (!line) return; for (; line != lay->lines; line = line->prev) { if ((box->off - line->y) >= box->h) break; } if (line == lay->lines) { box->off = 0; box->line = lay->lines; return; } box->off = line->y; box->line = line; } xref_t txt_box_xrefs(textbox_t tbox) { struct textbox *box = (struct textbox*)tbox; struct xref *xref = NULL; struct word *word = NULL; struct line *line; if (!tbox) return NULL; for (line = box->line; line; line = line->next) { if (line->y < box->off) continue; /* too high */ if (line->y + line->h > box->h + box->off) break; /* bottom */ for (word = line->words; word; word = word->next) { xref = word->xref; if (!xref || word->img_align) continue; return xref; } } return xref; } xref_t txt_box_xref(textbox_t tbox, int x, int y) { struct textbox *box = (struct textbox*)tbox; struct xref *xref = NULL; struct word *word = NULL; struct line *line; if (!tbox) return NULL; y += box->off; if (x < 0) return NULL; if (y < 0) return NULL; if (x >= box->w) return NULL; for (line = box->line; line; line = line->next) { int hh, yy; if (y < line->y) break; if (y > line->y + line->h) continue; for (word = line->words; word; word = word->next) { yy = vertical_align(word, &hh); if (y < line->y + yy || y > line->y + yy + hh) continue; if (x < line->x + word->x) continue; xref = word->xref; if (!xref) continue; if (x < line->x + word->x + word->w) break; if (word->next && word->next->xref == xref && x < line->x + word->next->x + word->next->w) { yy = vertical_align(word->next, &hh); if (y < line->y + yy || y > line->y + yy + hh) continue; break; } } } if (word && xref) { return xref; } return NULL; } void txt_box_free(textbox_t tbox) { if (!tbox) return; free(tbox); } img_t txt_box_render(textbox_t tbox) { img_t old_screen; img_t dst; struct textbox *box = (struct textbox *)tbox; if (!tbox) return NULL; dst = gfx_new(box->w, box->h); if (!dst) return NULL; old_screen = screen; screen = dst; gfx_clear(0, 0, box->w, box->h); /* gfx_clip(0, 0, box->w, box->h); printf("line: %d\n", box->line->y); */ txt_layout_draw_ex(box->lay, box->line, 0, - box->off, box->off, box->h, NULL); /* gfx_noclip(); */ screen = old_screen; return dst; } void txt_box_draw(textbox_t tbox, int x, int y) { struct textbox *box = (struct textbox *)tbox; if (!tbox) return; gfx_clip(x, y, box->w, box->h); /* printf("line: %d\n", box->line->y); */ txt_layout_draw_ex(box->lay, box->line, x, y - box->off, box->off, box->h, NULL); gfx_noclip(); } void txt_box_update_links(textbox_t tbox, int x, int y, clear_fn clear) { struct textbox *box = (struct textbox *)tbox; if (!tbox) return; gfx_clip(x, y, box->w, box->h); /* printf("line: %d\n", box->line->y); */ txt_layout_draw_ex(box->lay, box->line, x, y - box->off, box->off, box->h, clear); gfx_noclip(); } void txt_layout_update_links(layout_t layout, int x, int y, clear_fn clear) { struct layout *lay = (struct layout *)layout; /* gfx_clip(x, y, box->w, box->h); printf("line: %d\n", box->line->y); */ txt_layout_draw_ex(lay, lay->lines, x, y, 0, lay->h, clear); /* gfx_noclip(); */ } img_t get_img(struct layout *layout, char *p, int *al) { int len; int align; img_t img; struct image *image; int escaped = 0; *al = 0; len = word_img(p, NULL); if (!len) return NULL; p += 3; p[len - 1] = 0; align = strcspn(p, "|"); if (!p[align]) align = 0; else { if (!strcmp(p + align + 1, "left")) *al = ALIGN_LEFT; else if (!strcmp(p + align + 1, "right")) *al = ALIGN_RIGHT; if (*al) { p[align] = 0; if (align && p[align - 1] == '\\') { p[align - 1] = 0; escaped = 1; } } } img = layout_lookup_image(layout, p); if (img) goto out; img = cache_get(layout->img_cache, p); if (!img) { unix_path(p); if (!(img = gfx_load_image(p))) { game_res_err_msg(p, debug_sw); goto out; } theme_img_scale(&img); /* bad style, no gfx layer :( */ } image = image_new(p, img); if (!image) { gfx_free_image(img); img = NULL; } else { layout_add_image(layout, image); image->free_it = 1; /* free on layout destroy */ /* if (gfx_img_w(img) <= GFX_MAX_CACHED_W && gfx_img_h(img) <= GFX_MAX_CACHED_H) */ cache_add(layout->img_cache, p, img); } out: if (align) { p[align] = '|'; if (escaped) p[align - 1] = '\\'; } p[len - 1] = '>'; if (!img) *al = 0; return img; } static char *get_word_token(char *p, int *token) { int len; char *r; char *val = NULL; len = word_token(p, NULL); if (token) *token = 0; if (!len) return p; if (token) *token = 1; p[len - 1 + 3] = 0; r = strdup((p + 3)); parse_esc_string(r, &val); free(p); if (val) { free(r); r = val; } return r; } char *process_token(char *ptr, struct layout *layout, struct line *line, struct xref **xref, int *sp) { int token; char *val = NULL; int bit = 0; int al = 0; int *cnt = NULL; char *eptr; token = gfx_get_token(ptr, &eptr, &val, sp); if (!token) return NULL; if (TOKEN(token) == TOKEN_B) { cnt = &layout->scnt[0]; bit = TTF_STYLE_BOLD; } else if (TOKEN(token) == TOKEN_I) { cnt = &layout->scnt[1]; bit = TTF_STYLE_ITALIC; } else if (TOKEN(token) == TOKEN_U) { cnt = &layout->scnt[2]; bit = TTF_STYLE_UNDERLINE; } else if (TOKEN(token) == TOKEN_S) { cnt = &layout->scnt[3]; #ifdef TTF_STYLE_STRIKETHROUGH bit = TTF_STYLE_STRIKETHROUGH; #else bit = TTF_STYLE_ITALIC; #endif } if (bit) { if (token & TOKEN_CLOSE) { -- (*cnt); if (*cnt < 0) /* fuzzy */ *cnt = 0; if (!*cnt) layout->style &= ~bit; } else { ++ (*cnt); layout->style |= bit; } goto out; } if (TOKEN(token) == TOKEN_L) al = ALIGN_LEFT; else if (TOKEN(token) == TOKEN_R) al = ALIGN_RIGHT; else if (TOKEN(token) == TOKEN_C) al = ALIGN_CENTER; else if (TOKEN(token) == TOKEN_J) al = ALIGN_JUSTIFY; if (al) { if (token & TOKEN_CLOSE) { layout->acnt --; if (layout->acnt <0) layout->acnt = 0; layout->align = layout->saved_align[layout->acnt]; } else { layout->saved_align[layout->acnt] = layout->align; layout->acnt ++; if (layout->acnt >= ALIGN_NEST) layout->acnt = ALIGN_NEST - 1; layout->align = al; line->align = al; } goto out; } al = 0; if (TOKEN(token) == TOKEN_T) al = ALIGN_TOP; else if (TOKEN(token) == TOKEN_D) al = ALIGN_BOTTOM; else if (TOKEN(token) == TOKEN_M) al = ALIGN_MIDDLE; if (al) { if (token & TOKEN_CLOSE) { layout->vcnt --; if (layout->vcnt <0) layout->vcnt = 0; layout->valign = layout->saved_valign[layout->vcnt]; } else { layout->saved_valign[layout->vcnt] = layout->valign; layout->vcnt ++; if (layout->vcnt >= ALIGN_NEST) layout->vcnt = ALIGN_NEST - 1; layout->valign = al; } goto out; } if (TOKEN(token) == TOKEN_X || TOKEN(token) == TOKEN_Y) { int pos; pos = atoi(val) * game_theme.scale; if (strchr(val, '%') && sscanf(val, "%d%%", &pos) == 1) { if (TOKEN(token) == TOKEN_Y) { if (layout->box) pos = layout->box->h * pos / 100; } else pos = layout->w * pos / 100; } if (TOKEN(token) == TOKEN_X) { line->tabx = pos; line->al_tabx = ALIGN_LEFT; if (strstr(val, "right")) line->al_tabx = ALIGN_RIGHT; else if (strstr(val, "center")) line->al_tabx = ALIGN_CENTER; } else { line->taby = pos; line->al_taby = ALIGN_BOTTOM; if (strstr(val, "top")) line->al_taby = ALIGN_TOP; else if (strstr(val, "middle")) line->al_taby = ALIGN_MIDDLE; } goto out; } if (TOKEN(token) == TOKEN_A) { if (token & TOKEN_CLOSE) { if (*xref) layout_add_xref(layout, *xref); *xref = NULL; } else { if (*xref) { eptr = NULL; goto out; } if (!strcmp(val, "#")) { /* jump anchor */ layout->anchor = line; } else { *xref = xref_new(val); } } } out: if (val) free(val); return eptr; } int get_unbreakable_len(struct layout *layout, const char *ptr) { int w = 0; int ww = 0; char *p, *eptr; while (ptr && *ptr) { int sp; while (gfx_get_token(ptr, &eptr, NULL, &sp)) { if (sp) return w; ptr = eptr; } p = get_word(ptr, &eptr, &sp); if (!p) return w; if (sp || !*p || cjk_here(p) || word_img(p, NULL) || (word_token(p, NULL) > 1)) { free(p); return w; } txt_size(layout->fn, p, &ww, NULL); ptr = eptr; w += ww; if (!*p) ptr ++; else if (is_delim(*(ptr - 1))) { free(p); break; } free(p); } return w; } int txt_layout_pos2off(layout_t lay, int pos, int *hh) { int off = 0; struct line *line; struct layout *layout = (struct layout*)lay; if (!layout) return 0; for (line = layout->lines; line && (line->pos <= pos); line = line->next) { off = line->y; /* + line->h; */ if (hh) *hh = line->h; } return off; } int txt_layout_anchor(layout_t lay, int *hh) { int off; struct line *line; struct layout *layout = (struct layout*)lay; if (!layout) return -1; line = layout->anchor; if (!line) return -1; off = line->y; /* + line->h; */ if (hh) *hh = line->h; return off; } static void line_y(layout_t lay, struct line *line) { int y = line->taby; if (line->taby < 0) return; if (line->al_taby == ALIGN_BOTTOM) { y -= line->h; } else if (line->al_taby == ALIGN_MIDDLE) y -= line->h/2; line->taby = -1; if (y > line->y) line->y = y; margin_rebase(lay); } static void word_x(struct line *line, struct word *word, int width) { if (line->tabx < 0) return; word->x = line->tabx - line->x; if (line->al_tabx == ALIGN_RIGHT) word->x -= word->w; else if (line->al_tabx == ALIGN_CENTER) word->x -= word->w/2; if (word->x + word->w > width) word->x = width - word->w; if (word->x < line->w) word->x = line->w; else line->w = word->x; line->tabx = -1; line->align = ALIGN_LEFT; } void _txt_layout_add(layout_t lay, char *txt) { int sp = 0; int saved_style; int width; int img_align; struct margin *m; struct line *line, *lastline = NULL; struct layout *layout = (struct layout*)lay; char *p, *eptr; char *ptr = txt; struct xref *xref = NULL; int w, h = 0, nl = 0; int spw; img_t img = NULL; if (!layout || !layout->fn) return; saved_style = layout->style; fnt_style(layout->fn, 0); txt_size(layout->fn, " ", &spw, NULL); if (layout->lines) { lastline = layout->lines->prev; lastline->pos = 0; } if (!lastline) { line = line_new(); if (!line) goto err; line->h = h; line->align = layout->align; } else { line = lastline; } line->x = layout_find_margin(layout, line->y, &width); while (ptr && *ptr) { struct word *word; int sp2, addlen = 0; int wtok; eptr = process_token(ptr, layout, line, &xref, &sp2); if (eptr) { ptr = eptr; if (xref && layout->style == saved_style) fnt_style(layout->fn, layout->lstyle); /* & ~TTF_STYLE_ITALIC); */ else fnt_style(layout->fn, layout->style);/* & ~TTF_STYLE_ITALIC); */ if (!ptr || !*ptr) break; if (sp2) sp = -1; continue; } if (sp == -1) { p = get_word(ptr, &eptr, NULL); sp = 1; } else p = get_word(ptr, &eptr, &sp); if (!p) break; img = get_img(layout, p, &img_align); if (!img_align) /* margins reset */ addlen = get_unbreakable_len(layout, eptr); wtok = 0; if (img) { w = gfx_img_w(img); h = gfx_img_h(img); if (img_align) { if (!line_margin(line)) { line->y = layout_skip_margin(layout, line->y); width = layout->w; line->x = 0; } if (width - w <= 0) img_align = 0; } } else { p = get_word_token(p, &wtok); if (wtok && *p == 0) sp = 1; txt_size(layout->fn, p, &w, &h); h *= layout->fn_height; } nl = (wtok)?0:!*p; if (!line->h && !img_align && line_empty(line)) /* first word ? */ line->h = h; if (img_align && !line->w) line->h = 0; #if 0 if (!nl) { int ww = width - (line->w + ((sp && line->w)?spw:0) + addlen); p = word_hyphen(layout, p, ww, &eptr, &w); } #endif if ((line->num && (line->w + ((sp && line->w)?spw:0) + w + addlen) > width) || nl) { struct line *ol = line; h = 0; /* reset h for new line */ if ((layout->h) && (line->y + line->h) >= layout->h) break; if (line != lastline) { layout_add_line(layout, line); } line_y(layout, line); line_align(line, width, line->align, nl); line = line_new(); if (!line) { free(p); goto err; } line->align = layout->align; line->h = 0;/* h; */ line->y = ol->y + ol->h; /* line->x = 0; */ line->x = layout_find_margin(layout, line->y, &width); /* fprintf(stderr,"%d %d\n", line->x, width); */ if (nl) { ptr = eptr + 1; } free(p); /* ptr = eptr; */ line->pos = (int)(ptr - txt); continue; } if (h > line->h && !img_align) line->h = h; word = word_new(p); if (!word) { line_free(line); free(p); goto err; } word->valign = layout->valign; if (!sp && !line_empty(line)) word->unbrake = 1; word->style = layout->style; if (line->w && !word->unbrake) line->w += spw; word->w = w; word->x = line->w; word_x(line, word, width); word->img = img; word->img_align = img_align; if (img_align && (m = margin_new())) { int x2, w2; x2 = layout_find_margin(layout, line->y, &w2); if (img_align == ALIGN_LEFT) { line->x += w; m->w = x2 + w; } else m->w = layout->w - x2 - w2 + w; /* fprintf(stderr,"w: %d %d %d\n", width, w, width - w); */ width -= w; m->h = h; m->y = line->y; m->align = img_align; m->word = word; word->w = 0; if (img_align == ALIGN_LEFT) word->x = x2; else word->x = x2 + w2 - w; h = 0; w = 0; layout_add_margin(layout, m); } /* if (line->w) w += spw; */ line_add_word(line, word); if (xref) xref_add_word(xref, word); line->w += w; if (nl) eptr ++; ptr = eptr; free(p); } if (layout->h == 0) layout->h = line->y + line->h; /* if (line->num) { */ if (line != lastline) { layout_add_line(layout, line); } line_y(layout, line); line_align(line, width, line->align, nl); /* } else line_free(line); */ if (xref) layout_add_xref(layout, xref); layout->style = saved_style; return; err: txt_layout_free(layout); return; } void txt_layout_add(layout_t lay, char *txt) { struct layout *layout = (struct layout*)lay; if (layout) layout->h = 0; _txt_layout_add(lay, txt); } xref_t xref_next(xref_t x) { if (!x) return NULL; return ((struct xref*)x)->next; } xref_t xref_prev(xref_t x) { struct layout *l; if (!x) return NULL; l = ((struct xref*)x)->layout; if (x == l->xrefs) /* last one */ return NULL; x = ((struct xref*)x)->prev; return x; } xref_t txt_layout_xrefs(layout_t lay) { struct layout *layout = (struct layout*)lay; if (!layout) return NULL; return layout->xrefs; } int xref_valid(xref_t x) { struct xref *xref = (struct xref*)x; if (!xref) return -1; if (!xref->num) return -1; return 0; } int xref_position(xref_t x, int *xc, int *yc) { int i; int w = 0; struct line *line = NULL; struct word *word = NULL; struct xref *xref = (struct xref*)x; if (xref_valid(x)) return -1; for (i = 0; i < xref->num; i ++) { word = xref->words[i]; if (!word->img_align) w += word->w; } w = w/2; for (i = 0; i < xref->num; i ++) { word = xref->words[i]; if (word->img_align) continue; line = word->line; w -= word->w; if (w < 0) break; } if (!line || !word) return -1; if (xc) *xc = line->x + word->x + (word->w + w); if (yc) *yc = line->y + line->h / 2; return 0; } xref_t txt_layout_xref(layout_t lay, int x, int y) { struct layout *layout = (struct layout*)lay; struct xref *xref; struct word *word; struct line *line; int i; if (!lay || x < 0 || y < 0) return NULL; for (xref = layout->xrefs; xref; xref = xref->next) { for (i = 0; i < xref->num; i ++) { int hh,yy; word = xref->words[i]; line = word->line; if (word->img_align) continue; if (y < line->y || y > line->y + line->h) continue; yy = vertical_align(word, &hh); if (y < line->y + yy || y > line->y + yy + hh) continue; if (x < line->x + word->x) continue; if (x <= line->x + word->x + word->w) return xref; if (word->next && word->next->xref == xref && x < line->x + word->next->x + word->next->w) { yy = vertical_align(word->next, &hh); if (y < line->y + yy || y > line->y + yy + hh) continue; return xref; } } } return NULL; } layout_t xref_layout(xref_t x) { struct xref *xref = (struct xref*)x; if (!xref) return NULL; return xref->layout; } char *xref_get_text(xref_t x) { struct xref *xref = (struct xref*)x; if (!xref) return NULL; return xref->link; } void xref_set_active(xref_t x, int val) { struct xref *xref = (struct xref*)x; if (!xref) return; xref->active = val; } int xref_get_active(xref_t x) { struct xref *xref = (struct xref*)x; if (!xref) return 0; return xref->active; } layout_t txt_layout(fnt_t fn, int align, int width, int height) { struct layout *layout; layout = layout_new(fn, width, height); if (!layout) return NULL; layout->align = align; /* _txt_layout_add(layout, txt); */ return layout; } void txt_layout_set(layout_t lay, char *txt) { struct layout *layout = (struct layout*)lay; if (!layout) return; layout->h = 0; _txt_layout_free(lay); _txt_layout_add(lay, txt); } void _txt_layout_real_size(layout_t lay, struct line *line, int *pw, int *ph) { int w = 0; int h = 0; struct margin *margin; struct layout *layout = (struct layout*)lay; if (!layout) return; if (!line) line = layout->lines; for ( ; line; line = line->next) { while (!line->num && line->next) line = line->next; if (line->w > w) w = line->w; if (line->num && line->y + line->h > h) h = line->y + line->h; } for (margin = layout->margin; margin; margin = margin->next) { if (margin->y + margin->h > h) h = margin->y + margin->h; } if (pw) *pw = w; if (ph) *ph = h; } void txt_layout_real_size(layout_t lay, int *pw, int *ph) { _txt_layout_real_size(lay, NULL, pw, ph); } void txt_box_real_size(textbox_t box, int *pw, int *ph) { if (!box) return; if (pw) _txt_layout_real_size(txt_box_layout(box), NULL, pw, ph); else {/* faster path */ struct line *line = ((struct layout*)txt_box_layout(box))->lines; struct line *lines = line; if (lines) line = lines->prev; for (; line != lines && !line->num; line = line->prev); _txt_layout_real_size(txt_box_layout(box), line, NULL, ph); } } int gfx_cursor(int *xp, int *yp) { int x, y; #if SDL_VERSION_ATLEAST(2,0,0) x = mouse_x; y = mouse_y; #else SDL_GetMouseState(&x, &y); #endif if (xp) *xp = x; if (yp) *yp = y; return SDL_GetMouseState(NULL, NULL); } void gfx_warp_cursor(int x, int y) { #if SDL_VERSION_ATLEAST(2,0,0) float sx, sy; SDL_Rect rect; #ifdef _USE_SWROTATE if (gfx_flip_rotate) { /* TODO? */ int tmp; tmp = y; y = x; x = gfx_height - tmp; } #endif SDL_RenderGetViewport(Renderer, &rect); SDL_RenderGetScale(Renderer, &sx, &sy); x = (x + rect.x) * sx; y = (y + rect.y) * sy; SDL_WarpMouseInWindow(SDL_VideoWindow, x, y); #else SDL_WarpMouse(x, y); #endif } static int ALPHA_STEPS = 4; static volatile int fade_step_nr = -1; int gfx_fading(void) { return (fade_step_nr != -1); } static img_t fade_bg = NULL; static img_t fade_fg = NULL; static void *fade_aux = NULL; static void (*fade_cb)(void *) = NULL; static SDL_TimerID fade_timer; static long gfx_change_nr = 0; #if SDL_VERSION_ATLEAST(2,0,0) static SDL_Texture *fade_bg_texture = NULL; static SDL_Texture *fade_fg_texture = NULL; #endif static void update_gfx(void) { img_t img = fade_fg; if (fade_step_nr == -1 || !img || !fade_bg || !fade_fg) return; #if !SDL_VERSION_ATLEAST(2,0,0) game_cursor(CURSOR_CLEAR); gfx_set_alpha(img, (SDL_ALPHA_OPAQUE * (fade_step_nr + 1)) / ALPHA_STEPS); gfx_draw(fade_bg, 0, 0); gfx_draw(img, 0, 0); game_cursor(CURSOR_DRAW); gfx_flip(); #else gfx_render_copy(fade_bg_texture, NULL, 1); SDL_SetTextureAlphaMod(fade_fg_texture, (SDL_ALPHA_OPAQUE * (fade_step_nr + 1)) / ALPHA_STEPS); gfx_render_copy(fade_fg_texture, NULL, 0); if (game_cursor_show) gfx_render_cursor(); SDL_RenderPresent(Renderer); #endif fade_step_nr ++; if (fade_step_nr == ALPHA_STEPS) fade_step_nr = -1; } static void gfx_change_screen_step(void *aux) { gfx_change_nr --; if (gfx_fading()) { update_gfx(); #if !SDL_VERSION_ATLEAST(2,0,0) game_cursor(CURSOR_ON); gfx_commit(); #endif } if (gfx_fading()) return; gfx_cancel_change_screen(); return; } static Uint32 update(Uint32 interval, void *aux) { if (!gfx_fading()) return 0; #ifdef __EMSCRIPTEN__ SDL_RemoveTimer(fade_timer); fade_timer = SDL_AddTimer(60, update, NULL); #endif if (gfx_change_nr > 0) return interval; gfx_change_nr ++; push_user_event(gfx_change_screen_step, NULL); return interval; } void gfx_cancel_change_screen(void) { if (!fade_bg) return; fade_step_nr = -1; SDL_RemoveTimer(fade_timer); #if SDL_VERSION_ATLEAST(2,0,0) SDL_DestroyTexture(fade_fg_texture); SDL_DestroyTexture(fade_bg_texture); #endif game_cursor(CURSOR_CLEAR); gfx_copy(fade_fg, 0, 0); game_cursor(CURSOR_ON); gfx_flip(); gfx_commit(); gfx_free_image(fade_bg); fade_bg = NULL; if (fade_cb) fade_cb(fade_aux); } void gfx_change_screen(img_t src, int steps, void (*callback)(void *), void *aux) { struct inp_event ev; if (steps <= 1 || !opt_fading) { gfx_copy(src, 0, 0); game_cursor(CURSOR_ON); gfx_flip(); if (callback) callback(aux); return; } gfx_change_nr = 0; fade_fg = NULL; fade_aux = aux; fade_cb = callback; fade_bg = gfx_grab_screen(0, 0, gfx_width, gfx_height); if (!fade_bg) /* ok, i like kernel logic. No memory, but we must work! */ return; fade_fg = src; #if SDL_VERSION_ATLEAST(2,0,0) fade_bg_texture = SDL_CreateTextureFromSurface(Renderer, Surf(fade_bg)); if (!fade_bg_texture) goto err; SDL_SetTextureAlphaMod(fade_bg_texture, SDL_ALPHA_OPAQUE); SDL_SetTextureBlendMode(fade_bg_texture, SDL_BLENDMODE_NONE); fade_fg_texture = SDL_CreateTextureFromSurface(Renderer, Surf(src)); if (!fade_fg_texture) goto err2; SDL_SetTextureBlendMode(fade_fg_texture, SDL_BLENDMODE_BLEND); #endif memset(&ev, 0, sizeof(ev)); ALPHA_STEPS = steps; fade_step_nr = 0; fade_timer = SDL_AddTimer(60, update, NULL); return; #if SDL_VERSION_ATLEAST(2,0,0) err2: SDL_DestroyTexture(fade_bg_texture); err: gfx_free_image(fade_bg); fade_bg = NULL; return; #endif } int gfx_init(void) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); if (render_sw) SDL_SetHint(SDL_HINT_RENDER_DRIVER, render_sw); #if defined(_WIN32) /* do not use buggy D3D by default: fullscreen problem with NVidia */ else SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); #endif #endif if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); return -1; } if (!(images = cache_init(-1, gfx_cache_free_image))) { fprintf(stderr, "Can't init cache subsystem.\n"); gfx_done(); return -1; } /* SDL_DisableScreenSaver(); */ return 0; } void gfx_done(void) { #if SDL_VERSION_ATLEAST(2,0,0) if (screen) gfx_free_image(screen); /* if (SDL_VideoTexture) SDL_DestroyTexture(SDL_VideoTexture); */ if (Renderer) SDL_DestroyRenderer(Renderer); if (SDL_VideoWindow) SDL_DestroyWindow(SDL_VideoWindow); #endif cache_free(images); images = NULL; SDL_Quit(); } gtimer_t gfx_add_timer(int delay, int (*fn)(int, void*), void *aux) { #if SDL_VERSION_ATLEAST(1,3,0) return (gtimer_t)SDL_AddTimer(delay, (SDL_TimerCallback)fn, aux); #else return (gtimer_t)SDL_AddTimer(delay, (SDL_NewTimerCallback)fn, aux); #endif } void gfx_del_timer(gtimer_t han) { if (han) SDL_RemoveTimer((SDL_TimerID)han); } unsigned long gfx_ticks(void) { return SDL_GetTicks(); } int gfx_pending(void) { #if SDL_VERSION_ATLEAST(2,0,0) return queue_dirty; #else return 0; #endif } int gfx_set_title(const char *title) { char stitle[4096]; #if !defined(S60) if (!title) { #endif strcpy( stitle, "INSTEAD - " ); strcat( stitle, VERSION ); title = stitle; #if !defined(S60) } #endif #if !SDL_VERSION_ATLEAST(2,0,0) if (screen) SDL_WM_SetCaption(title, title); #else if (SDL_VideoWindow) SDL_SetWindowTitle(SDL_VideoWindow, title); #endif return 0; } int gfx_set_icon(img_t ic) { #if SDL_VERSION_ATLEAST(2,0,0) if (SDL_VideoWindow) { if (ic) SDL_SetWindowIcon(SDL_VideoWindow, Surf(ic)); else if (icon) SDL_SetWindowIcon(SDL_VideoWindow, icon); } #else /* not works for SDL < 2 */ #endif return 0; } instead-3.2.1/src/iowin32.h0000644000175000017500000000152313267071774014435 0ustar peterpeter/* iowin32.h -- IO base function header for compress/uncompress .zip Version 1.1, February 14h, 2010 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) Modifications for Zip64 support Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) For more info read MiniZip_info.txt */ #include #ifdef __cplusplus extern "C" { #endif void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); #ifdef __cplusplus } #endif instead-3.2.1/src/instead_bits.c0000644000175000017500000001101513267071774015603 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "instead/instead.h" static int luaB_bit_and(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a & b; lua_pushinteger(L, r); return 1; } static int luaB_bit_or(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a | b; lua_pushinteger(L, r); return 1; } static int luaB_bit_xor(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a ^ b; lua_pushinteger(L, r); return 1; } static int luaB_bit_shl(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a << b; lua_pushinteger(L, r); return 1; } static int luaB_bit_shr(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a >> b; lua_pushinteger(L, r); return 1; } static int luaB_bit_not(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int r = ~a; lua_pushinteger(L, r); return 1; } static int luaB_bit_div(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 1); unsigned int r; if (b) { r = a / b; lua_pushinteger(L, r); return 1; } return 0; } static int luaB_bit_idiv(lua_State *L) { int a = luaL_optinteger(L, 1, 0); int b = luaL_optinteger(L, 2, 1); int r; if (b) { r = a / b; lua_pushinteger(L, r); return 1; } return 0; } static int luaB_bit_mod(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 1); unsigned int r; if (b) { r = a % b; lua_pushinteger(L, r); return 1; } return 0; } static int luaB_bit_mul(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a * b; lua_pushinteger(L, r); return 1; } static int luaB_bit_imul(lua_State *L) { int a = luaL_optinteger(L, 1, 0); int b = luaL_optinteger(L, 2, 0); int r = a * b; lua_pushinteger(L, r); return 1; } static int luaB_bit_sub(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a - b; lua_pushinteger(L, r); return 1; } static int luaB_bit_add(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); unsigned int b = luaL_optinteger(L, 2, 0); unsigned int r = a + b; lua_pushinteger(L, r); return 1; } static int luaB_bit_unsigned(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); lua_pushinteger(L, a); return 1; } static int luaB_bit_signed(lua_State *L) { unsigned int a = luaL_optinteger(L, 1, 0); lua_pushinteger(L, (int)a); return 1; } const luaL_Reg bits_funcs[] = { {"bit_or", luaB_bit_or}, {"bit_and", luaB_bit_and}, {"bit_xor", luaB_bit_xor}, {"bit_shl", luaB_bit_shl}, {"bit_shr", luaB_bit_shr}, {"bit_not", luaB_bit_not}, {"bit_div", luaB_bit_div}, {"bit_idiv", luaB_bit_idiv}, {"bit_mod", luaB_bit_mod}, {"bit_mul", luaB_bit_mul}, {"bit_imul", luaB_bit_imul}, {"bit_sub", luaB_bit_sub}, {"bit_add", luaB_bit_add}, {"bit_signed", luaB_bit_signed}, {"bit_unsigned", luaB_bit_unsigned}, {NULL, NULL} }; static int bits_init(void) { return instead_api_register(bits_funcs); } static struct instead_ext ext = { .init = bits_init, }; int instead_bits_init(void) { return instead_extension(&ext); } instead-3.2.1/src/externals.h0000644000175000017500000000012113267071774015141 0ustar peterpeter#include "instead/system.h" #ifdef __EMSCRIPTEN__ #include "emscripten.h" #endif instead-3.2.1/src/windows.c0000644000175000017500000002073613267071774014637 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh , 2009 Ilya Ryndin * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include #ifndef _MSC_VER #include #endif #include #include #include #include "externals.h" #include "internals.h" #if !defined(_UWP) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0A00 #define _UWP #endif extern char *curgame_dir; static char local_games_path[PATH_MAX]; static char local_themes_path[PATH_MAX]; static char local_stead_path[PATH_MAX]; static char save_path[PATH_MAX]; static char cfg_path[PATH_MAX]; #ifdef _UWP char *game_locale(void) { char buff[64]; char res[64]; buff[0] = 0; /* Antokolos: Note LOCALE_NAME_USER_DEFAULT instead of LOCALE_USER_DEFAULT */ if (!GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SISO639LANGNAME, buff, sizeof(buff) - 1)) return NULL; wcstombs(res, buff, sizeof(res)); return strdup(res); } #else char *game_locale(void) { char buff[64]; buff[0] = 0; if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, buff,sizeof(buff) - 1)) return NULL; return strdup(buff); } #endif static char *game_codepage = NULL; #ifdef _HAVE_ICONV #ifdef _UWP static char *game_cp(void) { char cpbuff[64]; char buff[64]; char res[64]; buff[0] = 0; /* Antokolos: Note LOCALE_NAME_USER_DEFAULT instead of LOCALE_USER_DEFAULT */ if (!GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SISO639LANGNAME, buff, sizeof(buff) - 1)) return NULL; wcstombs(res, buff, sizeof(res)); snprintf(cpbuff, sizeof(cpbuff), "WINDOWS-%s", res); return strdup(cpbuff); } #else static char *game_cp(void) { char cpbuff[64]; char buff[64]; buff[0] = 0; if (!GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, buff,sizeof(buff) - 1)) return NULL; snprintf(cpbuff, sizeof(cpbuff), "WINDOWS-%s", buff); return strdup(cpbuff); } #endif char *mbs2utf8(const char *s) { iconv_t han; char *str; if (!game_codepage) game_codepage = game_cp(); if (!s) return NULL; if (!game_codepage) goto out0; han = iconv_open("UTF-8", game_codepage); if (han == (iconv_t)-1) goto out0; if (!(str = decode(han, s))) goto out1; iconv_close(han); return str; out1: iconv_close(han); out0: return strdup(s); } #else char *mbs2utf8(const char *s) { return strdup(s); } #endif extern void unix_path(char *); char *sdl_path(char *p) { #if 0 char *r = mbs2utf8(p); if (p) free(p); unix_path(r); return r; #else unix_path(p); return p; #endif } char *appdir( void ); char *game_tmp_path(void) { DWORD dwRetVal = 0; static TCHAR lpTempPathBuffer[MAX_PATH]; // Gets the temp path env string (no guarantee it's a valid path). dwRetVal = GetTempPath(MAX_PATH, // length of the buffer lpTempPathBuffer); // buffer for path if (dwRetVal > MAX_PATH || (dwRetVal == 0)) { return NULL; } strcat((char*)lpTempPathBuffer, "/instead-games"); if (mkdir((char*)lpTempPathBuffer) && errno != EEXIST) return NULL; unix_path((char*)lpTempPathBuffer); return (char*)lpTempPathBuffer; } char *game_local_games_path(int cr) { char *app = appdir(); if (!app) return NULL; snprintf(local_games_path, sizeof(local_games_path) - 1 , "%s/", app); if (cr) { if (mkdir(local_games_path) && errno != EEXIST) return NULL; } strcat(local_games_path,"/games"); if (cr) { if (mkdir(local_games_path) && errno != EEXIST) return NULL; } return local_games_path; } char *game_local_themes_path(void) { snprintf(local_themes_path, sizeof(local_themes_path) - 1 , "%s/themes", appdir()); return local_themes_path; } char *instead_local_stead_path(void) { snprintf(local_stead_path, sizeof(local_stead_path) - 1 , "%s/stead", appdir()); return local_stead_path; } #if 0 char *home_dir( void ) { static char homedir[PATH_MAX]=""; SHGetFolderPath( NULL, CSIDL_FLAG_CREATE | CSIDL_PROFILE, NULL, 0, (LPTSTR)homedir ); unix_path(homedir); return homedir; } #endif char *appdir( void ) { static char dir[PATH_MAX]=""; #ifdef _LOCAL_APPDATA if (appdata_sw) strcpy(dir, appdata_sw); else { strcpy(dir, game_cwd); strcat(dir, "/appdata"); } if (!access(dir, W_OK)) return dir; #endif #ifdef _UWP /* TODO: always define _LOCAL_APPDATA on UWP??? */ return NULL; #else SHGetFolderPath( NULL, CSIDL_FLAG_CREATE | CSIDL_LOCAL_APPDATA, NULL, 0, (LPTSTR)dir ); unix_path(dir); strcat(dir, "/instead"); return dir; #endif } char *game_cfg_path( void ) { char *p = appdir(); if (!p) return NULL; snprintf(cfg_path, sizeof(cfg_path) - 1 , "%src", p); /* appdir/insteadrc ;) */ if (!access(cfg_path, R_OK)) return cfg_path; /* no at home? Try in dir */ snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s", p); if (mkdir(cfg_path) && errno != EEXIST) { snprintf(cfg_path, sizeof(cfg_path) - 1 , "%src", p); /* appdir/insteadrc ;) */ return cfg_path; } snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/insteadrc", p); return cfg_path; } char *game_save_path( int cr, int nr ) { char dir[PATH_MAX]; char *p = appdir(); if (!curgame_dir) return NULL; if (!access("saves", R_OK)) { if (nr) snprintf(save_path, sizeof(save_path) - 1, "saves/save%d", nr); else snprintf(save_path, sizeof(save_path) - 1, "saves/autosave"); return save_path; } if (!p) return NULL; strcpy(dir,p); if (cr && mkdir(dir) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/saves", dir); if (cr && mkdir(save_path) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s", dir, curgame_dir); if (cr && mkdir(save_path) && errno != EEXIST) return NULL; if (nr) snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/save%d", dir, curgame_dir, nr); else snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/autosave", dir, curgame_dir); return save_path; } int debug_init(void) { // No debugging for UWP for now #ifndef _UWP if (!AllocConsole()) return -1; SetConsoleTitle("Debug"); freopen("CON", "w", stdout); //Map stdout freopen("CON", "w", stderr); //Map stderr freopen("CON", "r", stdin); //Map stdin #endif return 0; } void debug_done() { #ifndef _UWP if (game_running) { fprintf(stderr, "Press enter to close the console.\n"); fgetc(stdin); } FreeConsole(); #endif } #ifdef _USE_BROWSE char *open_file_dialog(void) { OPENFILENAME ofn; static char szFile[MAX_PATH]; static char szOldDir[MAX_PATH]; static int old_dir_set = 0; ZeroMemory( &ofn , sizeof( ofn)); ofn.lStructSize = sizeof ( ofn ); ofn.hwndOwner = NULL ; ofn.lpstrFile = szFile ; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof( szFile ); ofn.lpstrFilter = "*.*\0*.*\0main?.lua;*.zip;*.idf\0main.lua;main3.lua;*.zip;*.idf\0\0"; ofn.nFilterIndex = 2; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; if (!old_dir_set) ofn.lpstrInitialDir = NULL; else ofn.lpstrInitialDir = szOldDir; ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_READONLY; if (!GetOpenFileName(&ofn)) return NULL; old_dir_set = 1; strcpy(szOldDir, ofn.lpstrFile); dirname(szOldDir); unix_path(ofn.lpstrFile); return ofn.lpstrFile; } #endif #if 0 int setdir(const char *path) { return chdir(path); } char *getdir(char *path, size_t size) { return getcwd(path, size); } char *dirpath(const char *path) { return (char*)path; } int is_absolute_path(const char *path) { if (!path || !path[0]) return 0; if (path[0] == '/' || path[0] == '\\') return 1; if (!path[1]) return 0; return (path[1] == ':'); } #endif instead-3.2.1/src/iowin32.c0000644000175000017500000002723113267071774014434 0ustar peterpeter#ifdef _USE_UNPACK /* iowin32.c -- IO base function header for compress/uncompress .zip Version 1.1, February 14h, 2010 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) Modifications for Zip64 support Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) For more info read MiniZip_info.txt */ #include #include "zlib.h" #include "ioapi.h" #include "iowin32.h" #ifndef INVALID_HANDLE_VALUE #define INVALID_HANDLE_VALUE (0xFFFFFFFF) #endif #ifndef INVALID_SET_FILE_POINTER #define INVALID_SET_FILE_POINTER ((DWORD)-1) #endif voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); typedef struct { HANDLE hf; int error; } WIN32FILE_IOWIN; static void win32_translate_open_mode(int mode, DWORD* lpdwDesiredAccess, DWORD* lpdwCreationDisposition, DWORD* lpdwShareMode, DWORD* lpdwFlagsAndAttributes) { *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) { *lpdwDesiredAccess = GENERIC_READ; *lpdwCreationDisposition = OPEN_EXISTING; *lpdwShareMode = FILE_SHARE_READ; } else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) { *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; *lpdwCreationDisposition = OPEN_EXISTING; } else if (mode & ZLIB_FILEFUNC_MODE_CREATE) { *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; *lpdwCreationDisposition = CREATE_ALWAYS; } } static voidpf win32_build_iowin(HANDLE hFile) { voidpf ret=NULL; if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) { WIN32FILE_IOWIN w32fiow; w32fiow.hf = hFile; w32fiow.error = 0; ret = malloc(sizeof(WIN32FILE_IOWIN)); if (ret==NULL) CloseHandle(hFile); else *((WIN32FILE_IOWIN*)ret) = w32fiow; } return ret; } voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); if ((filename!=NULL) && (dwDesiredAccess != 0)) hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); return win32_build_iowin(hFile); } voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); if ((filename!=NULL) && (dwDesiredAccess != 0)) hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); return win32_build_iowin(hFile); } voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); if ((filename!=NULL) && (dwDesiredAccess != 0)) hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); return win32_build_iowin(hFile); } voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); if ((filename!=NULL) && (dwDesiredAccess != 0)) hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); return win32_build_iowin(hFile); } uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) { uLong ret=0; HANDLE hFile = NULL; if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL) { if (!ReadFile(hFile, buf, size, &ret, NULL)) { DWORD dwErr = GetLastError(); if (dwErr == ERROR_HANDLE_EOF) dwErr = 0; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; } } return ret; } uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) { uLong ret=0; HANDLE hFile = NULL; if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL) { if (!WriteFile(hFile, buf, size, &ret, NULL)) { DWORD dwErr = GetLastError(); if (dwErr == ERROR_HANDLE_EOF) dwErr = 0; ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; } } return ret; } long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) { long ret=-1; HANDLE hFile = NULL; if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL) { DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); if (dwSet == INVALID_SET_FILE_POINTER) { DWORD dwErr = GetLastError(); ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ret = -1; } else ret=(long)dwSet; } return ret; } ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) { ZPOS64_T ret= (ZPOS64_T)-1; HANDLE hFile = NULL; if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream)->hf; if (hFile) { LARGE_INTEGER li; li.QuadPart = 0; li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT); if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR)) { DWORD dwErr = GetLastError(); ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ret = (ZPOS64_T)-1; } else ret=li.QuadPart; } return ret; } long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) { DWORD dwMoveMethod=0xFFFFFFFF; HANDLE hFile = NULL; long ret=-1; if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream) -> hf; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : dwMoveMethod = FILE_CURRENT; break; case ZLIB_FILEFUNC_SEEK_END : dwMoveMethod = FILE_END; break; case ZLIB_FILEFUNC_SEEK_SET : dwMoveMethod = FILE_BEGIN; break; default: return -1; } if (hFile != NULL) { DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod); if (dwSet == INVALID_SET_FILE_POINTER) { DWORD dwErr = GetLastError(); ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ret = -1; } else ret=0; } return ret; } long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) { DWORD dwMoveMethod=0xFFFFFFFF; HANDLE hFile = NULL; long ret=-1; if (stream!=NULL) hFile = ((WIN32FILE_IOWIN*)stream)->hf; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : dwMoveMethod = FILE_CURRENT; break; case ZLIB_FILEFUNC_SEEK_END : dwMoveMethod = FILE_END; break; case ZLIB_FILEFUNC_SEEK_SET : dwMoveMethod = FILE_BEGIN; break; default: return -1; } if (hFile) { LARGE_INTEGER* li = (LARGE_INTEGER*)&offset; DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod); if (dwSet == INVALID_SET_FILE_POINTER) { DWORD dwErr = GetLastError(); ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; ret = -1; } else ret=0; } return ret; } int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) { int ret=-1; if (stream!=NULL) { HANDLE hFile; hFile = ((WIN32FILE_IOWIN*)stream) -> hf; if (hFile != NULL) { CloseHandle(hFile); ret=0; } free(stream); } return ret; } int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) { int ret=-1; if (stream!=NULL) { ret = ((WIN32FILE_IOWIN*)stream) -> error; } return ret; } void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = win32_open_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; pzlib_filefunc_def->ztell_file = win32_tell_file_func; pzlib_filefunc_def->zseek_file = win32_seek_file_func; pzlib_filefunc_def->zclose_file = win32_close_file_func; pzlib_filefunc_def->zerror_file = win32_error_file_func; pzlib_filefunc_def->opaque = NULL; } void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; pzlib_filefunc_def->zclose_file = win32_close_file_func; pzlib_filefunc_def->zerror_file = win32_error_file_func; pzlib_filefunc_def->opaque = NULL; } void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; pzlib_filefunc_def->zclose_file = win32_close_file_func; pzlib_filefunc_def->zerror_file = win32_error_file_func; pzlib_filefunc_def->opaque = NULL; } void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; pzlib_filefunc_def->zclose_file = win32_close_file_func; pzlib_filefunc_def->zerror_file = win32_error_file_func; pzlib_filefunc_def->opaque = NULL; } #endif instead-3.2.1/src/unix.c0000644000175000017500000002015013267071774014116 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include #include #include #include #include #include #include #include "externals.h" #include "internals.h" #ifdef _USE_GTK #include "input.h" #include #endif static char save_path[PATH_MAX]; static char cfg_path[PATH_MAX]; static char local_games_path[PATH_MAX]; static char local_themes_path[PATH_MAX]; static char local_stead_path[PATH_MAX]; char *game_locale(void) { char *p; char *s; p = getenv("LANG"); if (!p || !(s = strdup(p))) return NULL; if ((p = strchr(s, '_'))) *p = 0; return s; } char *game_tmp_path(void) { static time_t t = 0; static char tmp[PATH_MAX]="/tmp/instead-games"; if (!t) { t = time(NULL); sprintf(tmp, "/tmp/instead-games-%lu", (unsigned long)t); } if (mkdir(tmp, S_IRWXU) && errno != EEXIST) return NULL; return tmp; } #ifdef _USE_GTK static volatile int gtk_response = -1; static void run_response_handler (GtkDialog *dialog, gint response_id, gpointer data) { gtk_response = response_id; } GdkPixbuf *create_pixbuf(const gchar * filename) { gchar path[PATH_MAX]; GdkPixbuf *pixbuf; GError *error = NULL; path[0] = 0; if (filename[0] != '/') { strcpy(path, game_cwd); strcat(path, "/"); } strcat(path, filename); pixbuf = gdk_pixbuf_new_from_file(path, &error); if(!pixbuf) { fprintf(stderr, "%s\n", error->message); g_error_free(error); } return pixbuf; } #endif extern char *BROWSE_MENU; char *open_file_dialog(void) { #ifndef _USE_GTK /* unix people don't need win solutions */ return NULL; #else gulong response_handler; char *filename = NULL; static int old_dir_set = 0; static char file[PATH_MAX]; static char old_dir[PATH_MAX]; GtkWidget *file_dialog; GtkFileFilter *file_filter_all; GtkFileFilter *file_filter_zip; /* GtkFileFilter *file_filter_lua; */ file_filter_all = gtk_file_filter_new(); gtk_file_filter_add_pattern(file_filter_all, "*"); gtk_file_filter_set_name(file_filter_all, "*"); file_filter_zip = gtk_file_filter_new(); gtk_file_filter_add_pattern(file_filter_zip, "*.zip"); gtk_file_filter_add_pattern(file_filter_zip, "main.lua"); gtk_file_filter_add_pattern(file_filter_zip, "main3.lua"); gtk_file_filter_add_pattern(file_filter_zip, "*.idf"); gtk_file_filter_set_name(file_filter_zip, "main?.lua; *.zip; *.idf"); /* file_filter_lua = gtk_file_filter_new(); gtk_file_filter_add_pattern(file_filter_lua, "main.lua"); gtk_file_filter_set_name(file_filter_lua, "main.lua"); */ file[0] = 0; file_dialog = gtk_file_chooser_dialog_new (BROWSE_MENU, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (old_dir_set) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_dialog), old_dir); gtk_window_set_icon(GTK_WINDOW(file_dialog), create_pixbuf(ICON_PATH"/sdl_instead.png")); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_dialog), file_filter_all); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_dialog), file_filter_zip); /* gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_dialog), file_filter_lua);*/ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(file_dialog), file_filter_zip); response_handler = g_signal_connect (file_dialog, "response", G_CALLBACK (run_response_handler), NULL); gtk_window_set_modal (GTK_WINDOW (file_dialog), TRUE); gtk_widget_show(file_dialog); gtk_response = -1; /* dirty, but we need both SDL and gtk */ while (gtk_response == -1) { struct inp_event ev; memset(&ev, 0, sizeof(struct inp_event)); while (gtk_events_pending()) { gtk_main_iteration(); while ((input(&ev, 0)) == AGAIN); } while ((input(&ev, 0)) == AGAIN); usleep(HZ*100); } if (gtk_response == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog)); if (filename) { strcpy(file, filename); g_free (filename); } filename = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(file_dialog)); if (filename) { strcpy(old_dir, filename); g_free (filename); old_dir_set = 1; } } if (gtk_response != GTK_RESPONSE_DELETE_EVENT) { g_signal_handler_disconnect (GTK_WIDGET(file_dialog), response_handler); gtk_widget_destroy(GTK_WIDGET(file_dialog)); } while(gtk_events_pending()) gtk_main_iteration(); return (file[0])?file:NULL; #endif } char *appdir(void) { static char dir[PATH_MAX]; struct passwd *pw; #ifdef _LOCAL_APPDATA if (appdata_sw) strcpy(dir, appdata_sw); else { strcpy(dir, game_cwd); strcat(dir, "/appdata"); } if (!access(dir, W_OK)) return dir; #endif pw = getpwuid(getuid()); if (!pw) return NULL; snprintf(dir, sizeof(dir) - 1 , "%s/.instead", pw->pw_dir); return dir; } char *game_local_games_path(int cr) { char *app = appdir(); if (!app) return NULL; strcpy(local_games_path, app); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } strcat(local_games_path,"/games"); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } return local_games_path; } char *game_local_themes_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_themes_path, sizeof(local_themes_path) - 1 , "%s/themes", app); return local_themes_path; } char *instead_local_stead_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_stead_path, sizeof(local_stead_path) - 1 , "%s/stead", app); return local_stead_path; } char *game_cfg_path(void) { char *app = appdir(); struct passwd *pw; if (app) { snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/", app); if (mkdir(cfg_path, S_IRWXU) == 0 || errno == EEXIST) { snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/insteadrc", app); return cfg_path; } } pw = getpwuid(getuid()); if (!pw) return NULL; snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/.insteadrc", pw->pw_dir); /* at home */ return cfg_path; } char *game_save_path(int cr, int nr) { char *app = appdir(); if (!curgame_dir) return NULL; if (!access("saves", R_OK)) { if (nr) snprintf(save_path, sizeof(save_path) - 1, "saves/save%d", nr); else snprintf(save_path, sizeof(save_path) - 1, "saves/autosave"); return save_path; } if (!app) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/saves", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/", app, curgame_dir); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; if (nr) snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/save%d", app, curgame_dir, nr); else snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/autosave", app, curgame_dir); return save_path; } int debug_init(void) { return 0; } void debug_done() { } char *sdl_path(char *p) { unix_path(p); return p; } instead-3.2.1/src/CMakeLists.txt0000644000175000017500000001033313267071774015531 0ustar peterpeter# sources SET(INSTEAD_SRCS SDL_anigif.c SDL_gfxBlitFunc.c SDL_rotozoom.c config.c game.c graphics.c input.c noise1234.c ioapi.c main.c menu.c sound.c themes.c unpack.c unzip.c utils.c instead_bits.c instead_sprites.c instead_timer.c instead_sound.c instead_paths.c instead/instead.c instead/util.c instead/list.c instead/cache.c instead/idf.c instead/tinymt32.c instead/lfs.c ) # platform-specific sources IF(APPLE) SET(INSTEAD_SRCS ${INSTEAD_SRCS} macosx.m) ADD_DEFINITIONS(-Dunix) ELSEIF(WIN32 AND WINCE) SET(INSTEAD_SRCS ${INSTEAD_SRCS} wince.c iowin32.c) ELSEIF(WIN32 AND NOT WINCE) SET(INSTEAD_SRCS ${INSTEAD_SRCS} windows.c iowin32.c) ELSEIF(UNIX) SET(INSTEAD_SRCS ${INSTEAD_SRCS} unix.c) ADD_DEFINITIONS(-Dunix) ELSE(APPLE) MESSAGE(FATAL_ERROR "Your platform is not supported yet, sorry") ENDIF(APPLE) # flags ADD_DEFINITIONS( -DVERSION=\"${INSTEAD_VERSION}\" -D_USE_UNPACK -Wall -D_USE_SDL ) INCLUDE(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG(-Wextra WEXTRA_FLAG_SUPPORTED) CHECK_CXX_COMPILER_FLAG(-Wno-unused-parameter WNO_UNUSED_PARAMETER_FLAG_SUPPORTED) IF(WEXTRA_FLAG_SUPPORTED) ADD_DEFINITIONS(-Wextra) ENDIF(WEXTRA_FLAG_SUPPORTED) IF(WNO_UNUSED_PARAMETER_FLAG_SUPPORTED) ADD_DEFINITIONS(-Wno-unused-parameter) ENDIF(WNO_UNUSED_PARAMETER_FLAG_SUPPORTED) IF(SYSTEMWIDE) # Systemwide installation, global data paths ADD_DEFINITIONS( -DLANG_PATH=\"${CMAKE_INSTALL_PREFIX}/${LANGDIR}/\" -DSTEAD_PATH=\"${CMAKE_INSTALL_PREFIX}/${STEADDIR}/\" -DGAMES_PATH=\"${CMAKE_INSTALL_PREFIX}/${GAMESDIR}/\" -DTHEMES_PATH=\"${CMAKE_INSTALL_PREFIX}/${THEMESDIR}/\" -DICON_PATH=\"${CMAKE_INSTALL_PREFIX}/${ICONDIR}/\" ) ELSEIF(STANDALONE) # Standalone installation, local data paths ADD_DEFINITIONS( -DLANG_PATH=\"lang/\" -DSTEAD_PATH=\"stead/\" -DGAMES_PATH=\"games/\" -DTHEMES_PATH=\"themes/\" -DICON_PATH=\"icon/\" -D_LOCAL_APPDATA ) ELSE(SYSTEMWIDE) # Neither, data paths point to source tree ADD_DEFINITIONS( -DLANG_PATH=\"${CMAKE_SOURCE_DIR}/lang/\" -DSTEAD_PATH=\"${CMAKE_SOURCE_DIR}/stead/\" -DGAMES_PATH=\"${CMAKE_SOURCE_DIR}/games/\" -DTHEMES_PATH=\"${CMAKE_SOURCE_DIR}/themes/\" -DICON_PATH=\"${CMAKE_SOURCE_DIR}/icon/\" ) ENDIF(SYSTEMWIDE) # depends FIND_PACKAGE(Lua51 REQUIRED) FIND_PACKAGE(ZLIB REQUIRED) FIND_LIBRARY(MATH_LIBRARY m) INCLUDE_DIRECTORIES( ${ZLIB_INCLUDE_DIRS} ${LUA_INCLUDE_DIR} ) SET(INSTEAD_LIBS ${ZLIB_LIBRARIES} ${LUA_LIBRARIES} ${MATH_LIBRARY} ) IF(WITH_SDL2) FIND_PACKAGE(SDL2 REQUIRED) FIND_PACKAGE(SDL2_mixer REQUIRED) FIND_PACKAGE(SDL2_image REQUIRED) FIND_PACKAGE(SDL2_ttf REQUIRED) INCLUDE_DIRECTORIES( ${SDL2_INCLUDE_DIR} ${SDL2MIXER_INCLUDE_DIR} ${SDL2IMAGE_INCLUDE_DIR} ${SDL2TTF_INCLUDE_DIR} ) LIST(APPEND INSTEAD_LIBS ${SDL2_LIBRARY} ${SDL2MIXER_LIBRARY} ${SDL2IMAGE_LIBRARY} ${SDL2TTF_LIBRARY} ) ELSE(WITH_SDL2) FIND_PACKAGE(SDL REQUIRED) FIND_PACKAGE(SDL_mixer REQUIRED) FIND_PACKAGE(SDL_image REQUIRED) FIND_PACKAGE(SDL_ttf REQUIRED) INCLUDE_DIRECTORIES( ${SDL_INCLUDE_DIR} ${SDLMIXER_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR} ) LIST(APPEND INSTEAD_LIBS ${SDL_LIBRARY} ${SDLMIXER_LIBRARY} ${SDLIMAGE_LIBRARY} ${SDLTTF_LIBRARY} ) ENDIF(WITH_SDL2) IF(WITH_ICONV) FIND_PACKAGE(Iconv REQUIRED) ADD_DEFINITIONS(-D_HAVE_ICONV) INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR}) SET(INSTEAD_LIBS ${INSTEAD_LIBS} ${ICONV_LIBRARY}) ENDIF(WITH_ICONV) IF(WITH_GTK2) FIND_PACKAGE(GTK2 REQUIRED) ADD_DEFINITIONS(-D_USE_GTK -D_USE_BROWSE ${GTK2_DEFINITIONS}) INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS}) SET(INSTEAD_LIBS ${INSTEAD_LIBS} ${GTK2_LIBRARIES}) ELSEIF(WITH_GTK3) FIND_PACKAGE(GTK3 REQUIRED) ADD_DEFINITIONS(-D_USE_GTK -D_USE_BROWSE) INCLUDE_DIRECTORIES(${GTK3_INCLUDE_DIRS}) SET(INSTEAD_LIBS ${INSTEAD_LIBS} ${GTK3_LIBRARIES}) ENDIF(WITH_GTK2) # targets ADD_EXECUTABLE(sdl-instead ${INSTEAD_SRCS}) TARGET_LINK_LIBRARIES(sdl-instead ${INSTEAD_LIBS}) # install INCLUDE(InstallSymlink) IF(SYSTEMWIDE) INSTALL(TARGETS sdl-instead DESTINATION ${BINDIR}) INSTALL_SYMLINK(sdl-instead instead${CMAKE_EXECUTABLE_SUFFIX} ${BINDIR}) ELSEIF(STANDALONE) INSTALL(TARGETS sdl-instead DESTINATION ${STANDALONEDIR}) INSTALL_SYMLINK(sdl-instead instead${CMAKE_EXECUTABLE_SUFFIX} ${STANDALONEDIR}) ENDIF(SYSTEMWIDE) instead-3.2.1/src/wince.c0000644000175000017500000001526013267071774014246 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include #include #include #include #include "externals.h" #include "internals.h" extern char *curgame; extern char *curgame_dir; static char local_games_path[PATH_MAX]; static char local_themes_path[PATH_MAX]; static char local_stead_path[PATH_MAX]; static char save_path[PATH_MAX]; static char cfg_path[PATH_MAX]; char *game_locale(void) { char buff[64]; buff[0] = 0; if (!GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, buff,sizeof(buff) - 1)) return NULL; return strdup(buff); } #if 0 static char *game_codepage = NULL; #ifdef _HAVE_ICONV static char *game_cp(void) { char cpbuff[64]; char buff[64]; buff[0] = 0; if (!GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, buff,sizeof(buff) - 1)) return NULL; snprintf(cpbuff, sizeof(cpbuff), "WINDOWS-%s", buff); return strdup(cpbuff); } char *mbs2utf8(const char *s) { iconv_t han; char *str; if (!game_codepage) game_codepage = game_cp(); if (!s) return NULL; if (!game_codepage) goto out0; han = iconv_open("UTF-8", game_codepage); if (han == (iconv_t)-1) goto out0; if (!(str = decode(han, s))) goto out1; iconv_close(han); return str; out1: iconv_close(han); out0: return strdup(s); } #else char *mbs2utf8(const char *s) { return strdup(s); } #endif #endif extern void unix_path(char *); char *sdl_path(char *p) { #if 0 char *r = mbs2utf8(p); if (p) free(p); unix_path(r); return r; #else unix_path(p); return p; #endif } char *appdir( void ); char *game_tmp_path(void) { DWORD dwRetVal = 0; static TCHAR lpTempPathBuffer[MAX_PATH]; // Gets the temp path env string (no guarantee it's a valid path). dwRetVal = GetTempPath(MAX_PATH, // length of the buffer lpTempPathBuffer); // buffer for path if (dwRetVal > MAX_PATH || (dwRetVal == 0)) { return NULL; } strcat((char*)lpTempPathBuffer, "/instead-games"); if (mkdir((char*)lpTempPathBuffer) && access((char*)lpTempPathBuffer, W_OK)) return NULL; unix_path((char*)lpTempPathBuffer); return (char*)lpTempPathBuffer; } char *game_local_games_path(int cr) { char *app = appdir(); if (!app) return NULL; snprintf(local_games_path, sizeof(local_games_path) - 1 , "%s/", app); if (cr) { if (mkdir(local_games_path) && access(local_games_path, W_OK)) return NULL; } strcat(local_games_path,"/games"); if (cr) { if (mkdir(local_games_path) && access(local_games_path, W_OK)) return NULL; } return local_games_path; } char *game_local_themes_path(void) { snprintf(local_themes_path, sizeof(local_themes_path) - 1 , "%s/themes", appdir()); return local_themes_path; } char *instead_local_stead_path(void) { snprintf(local_stead_path, sizeof(local_stead_path) - 1 , "%s/stead", appdir()); return local_stead_path; } #if 0 char *home_dir( void ) { static char homedir[PATH_MAX]=""; SHGetFolderPath( NULL, CSIDL_FLAG_CREATE | CSIDL_PROFILE, NULL, 0, (LPTSTR)homedir ); unix_path(homedir); return homedir; } #endif char *appdir( void ) { static char dir[PATH_MAX]=""; if (appdata_sw) strcpy(dir, appdata_sw); else { strcpy(dir, game_cwd); strcat(dir, "/appdata"); } if (!access(dir, W_OK)) return dir; return NULL; } char *game_cfg_path( void ) { char *p = appdir(); if (!p) return NULL; snprintf(cfg_path, sizeof(cfg_path) - 1 , "%src", p); /* appdir/insteadrc ;) */ if (!access(cfg_path, R_OK)) return cfg_path; /* no at home? Try in dir */ snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s", p); if (mkdir(cfg_path) && access(cfg_path, W_OK)) { snprintf(cfg_path, sizeof(cfg_path) - 1 , "%src", p); /* appdir/insteadrc ;) */ return cfg_path; } snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/insteadrc", p); return cfg_path; } char *game_save_path( int cr, int nr ) { char dir[PATH_MAX]; char *p = appdir(); if (!curgame_dir) return NULL; if (!access("saves", R_OK)) { if (nr) snprintf(save_path, sizeof(save_path) - 1, "saves/save%d", nr); else snprintf(save_path, sizeof(save_path) - 1, "saves/autosave"); return save_path; } if (!p) return NULL; strcpy(dir, p); if (cr && mkdir(dir) && access(dir, W_OK)) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/saves", dir); if (cr && mkdir(save_path) && access(save_path, W_OK)) return NULL; snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s", dir, curgame_dir); if (cr && mkdir(save_path) && access(save_path, W_OK)) return NULL; if (nr) snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/save%d", dir, curgame_dir, nr); else snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/autosave", dir, curgame_dir); return save_path; } int debug_init(void) { return 0; } void debug_done() { } #ifdef _USE_BROWSE char *open_file_dialog(void) { OPENFILENAME ofn; static char szFile[MAX_PATH]; static char szOldDir[MAX_PATH]; static int old_dir_set = 0; ZeroMemory( &ofn , sizeof( ofn)); ofn.lStructSize = sizeof ( ofn ); ofn.hwndOwner = NULL ; ofn.lpstrFile = szFile ; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof( szFile ); ofn.lpstrFilter = "*.*\0*.*\0main?.lua;*.zip;*.idf\0main.lua;main3.lua;*.zip;*.idf\0\0"; ofn.nFilterIndex = 2; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; if (!old_dir_set) ofn.lpstrInitialDir = NULL; else ofn.lpstrInitialDir = szOldDir; ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_READONLY; if (!GetOpenFileName(&ofn)) return NULL; old_dir_set = 1; strcpy(szOldDir, ofn.lpstrFile); dirname(szOldDir); unix_path(ofn.lpstrFile); return ofn.lpstrFile; } #endif instead-3.2.1/src/tiny/0000755000175000017500000000000013267071774013754 5ustar peterpeterinstead-3.2.1/src/tiny/main.c0000644000175000017500000000367213267071774015054 0ustar peterpeter#include #include #include "string.h" #include "instead/instead.h" static int log_opt = 0; static int tiny_init(void) { int rc; rc = instead_loadfile("tiny.lua"); if (rc) return rc; return 0; } static struct instead_ext ext = { .init = tiny_init, }; static void footer(void) { char *p; p = instead_cmd("way", NULL); if (p && *p) printf(">> %s", instead_cmd("way", NULL)); p = instead_cmd("inv", NULL); if (p && *p) printf("** %s", instead_cmd("inv", NULL)); } int main(int argc, const char **argv) { int rc; char *str; const char *game = NULL; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } game = argv[1]; if (instead_extension(&ext)) { fprintf(stderr, "Can't register tiny extension\n"); exit(1); } instead_set_debug(1); if (instead_init(game)) { fprintf(stderr, "Can not init game: %s\n", game); exit(1); } if (instead_load(&str)) { fprintf(stderr, "Can not load game: %s\n", instead_err()); exit(1); } printf("%s\n", str); #if 0 /* no autoload */ str = instead_cmd("load autosave", &rc); #else str = instead_cmd("look", &rc); #endif if (!rc) { printf("%s", str); footer(); } free(str); while (1) { char input[128], *p, cmd[64]; p = fgets(input, sizeof(input), stdin); if (!p) break; printf(" * * *\n"); p[strcspn(p, "\n\r")] = 0; if (!strcmp(p, "quit")) break; if (!strcmp(p, "log")) { log_opt = 1; continue; } snprintf(cmd, sizeof(cmd), "use %s", p); str = instead_cmd(cmd, &rc); if (rc) { /* try go */ free(str); snprintf(cmd, sizeof(cmd), "go %s", p); str = instead_cmd(cmd, &rc); } if (rc) { /* try act */ free(str); snprintf(cmd, sizeof(cmd), "%s", p); str = instead_cmd(cmd, &rc); } if (str) printf("%s", str); free(str); if (rc) printf("error!\n"); else { footer(); if (log_opt) fprintf(stderr, "%s\n", p); } } instead_cmd("save autosave", NULL); instead_done(); exit(0); } instead-3.2.1/src/tiny/tiny2.lua0000644000175000017500000000615113267071774015527 0ustar peterpeter-- some stubs for tiny-instead -- fake game.gui -- stat, menu -- fake audio -- fake input -- show hints (numbers) game.hinting = true -- fake gui game.gui = { fading = 4; ways_delim = ' | '; inv_delim = ' | '; hinv_delim = ' | '; hideways = false; hideinv = false; hidetitle = false; } -- menu and stat stat = function(v) v.status_type = true v.id = false return obj(v) end function isStatus(v) if stead.type(v) ~= 'table' then return false end if v.status_type then return true end return false end function isMenu(v) if stead.type(v) ~= 'table' then return false end if v.menu_type then return true end return false end stead.menu_save = function(self, name, h, need) local dsc; if need then print ("Warning: menu "..name.." can not be saved!"); return end stead.savemembers(h, self, name, need); end function menu(v) v.menu_type = true if v.inv == nil then v.inv = function(s) local r,v r, v = stead.call(s, 'menu'); if v == nil then v = true end if r == nil then stead.obj_tag(stead.me(), MENU_TAG_ID); -- retag menu field end return r, v end end if v.act == nil then v.act = function(s) local r,v r,v = stead.call(s, 'menu'); if v == nil then v = true end if r == nil then stead.obj_tag(stead.me(), MENU_TAG_ID); -- retag menu field end return r, v end end if v.save == nil then v.save = stead.menu_save; end return obj(v); end -- fake audio and timer stead.get_music = function() return '', 0 end stead.get_music_loop = function() return 0 end stead.save_music = function(s) end stead.restore_music = function(s) end stead.set_music = function(s, count) end stead.set_music_fading = function(o, i) end stead.get_music_fading = function() end stead.stop_music = function() end stead.is_music = function() return false end function instead_sound() return false end stead.is_sound = instead_sound stead.get_sound = function() return end stead.get_sound_chan = function() return 0 end stead.get_sound_loop = function() return 0 end stead.stop_sound = function(chan, fo) end stead.add_sound = function(s, chan, loop) end stead.set_sound = function(s, chan, loop) end -- those are sill in global space add_sound = stead.add_sound set_sound = stead.set_sound stop_sound = stead.stop_sound get_sound = stead.get_sound get_sound_loop = stead.get_sound_loop get_sound_chan = stead.get_sound_chan get_music = stead.get_music get_music_fading = stead.get_music_fading get_music_loop = stead.get_music_loop set_music = stead.set_music set_music_fading = stead.set_music_fading stop_music = stead.stop_music save_music = stead.save_music restore_music = stead.restore_music is_music = stead.is_music stead.set_timer = function() end stead.timer = function() return end instead_theme_name = function() return 'default' end stead.module_init(function(s) timer = obj { nam = 'timer', get = function(s) return 0 end, stop = function(s) end, del = function(s) end, set = function(s, v) return true end, }; end) stead.objects.input = function() return obj { -- input object system_type = true, nam = 'input', }; end; instead-3.2.1/src/tiny/Makefile0000644000175000017500000000122013267071774015407 0ustar peterpeterinclude ../../Rules.make.standalone include ../../config.make CFLAGS += $(LUA_CFLAGS) $(EXTRA_CFLAGS) -DSTEAD_PATH=\"${STEADPATH}/\" -DVERSION=\"$(VERSION)\" LDFLAGS += $(LUA_LFLAGS) $(EXTRA_LDFLAGS) INSTEAD_SRC := instead.c util.c list.c cache.c idf.c tinymt32.c lfs.c SRC := $(INSTEAD_SRC) OBJ := $(patsubst %.c, %.o, $(SRC)) all: instead stead tiny-instead$(EXE) $(OBJ): %.o : instead/%.c $(CC) -c $(<) $(I) $(CFLAGS) $(CPPFLAGS) -o $(@) tiny-instead$(EXE): main.c $(OBJ) $(CC) $(CFLAGS) $(^) $(LDFLAGS) -o $(@) instead: ln -s ../instead instead stead: ln -s ../../stead stead clean: $(RM) -f *.o instead stead tiny-instead$(EXE) instead-3.2.1/src/tiny/tiny.lua0000644000175000017500000000024713267071774015445 0ustar peterpeter-- some stubs for tiny-instead -- fake game.gui -- stat, menu -- fake audio -- fake input if API == 'stead3' then dofile 'tiny3.lua' return end dofile 'tiny2.lua' instead-3.2.1/src/tiny/tiny3.lua0000644000175000017500000001172213267071774015530 0ustar peterpeterlocal std = stead local instead = std.obj { nam = '@instead' } instead.nosave = false instead.noautosave = false function instead.render_callback() return false end function instead.wait_use() return true end local iface = std '@iface' local type = std.type local dict = {} local function get_bool(o, nam) if type(o[nam]) == 'boolean' then return o[nam] end if type(o[nam]) == 'function' then return o:nam() end return nil end instead.inv_delim = '\n' instead.hinv_delim = ' | ' instead.ways_delim = ' | ' instead.notitle = false instead.noways = false instead.noinv = false instead.nopic = false instead.fading_value = 0 function instead.fading() end function instead.need_fading() end function instead.autosave(slot) end function instead.menu(n) end function instead.restart(v) end function instead.atleast(...) return true end function instead.version(...) end function iface:title(str) -- hide title return str end std.stat = std.class({ __stat_type = true; }, std.obj); std.menu = std.class({ __menu_type = true; new = function(self, v) if type(v) ~= 'table' then std.err ("Wrong argument to std.menu:"..std.tostr(v), 2) end v = std.obj(v) std.setmt(v, self) return v end; inv = function(s, ...) local r, v if s.menu ~= nil then r, v = std.call(s, 'menu', ...) -- special method while in inv else r, v = std.call(s, 'act', ...) -- fallback to act end return true, false -- menu mode end; }, std.obj); std.setmt(std.phr, std.menu) -- make phrases menus std.setmt(std.ref '@', std.menu) -- make xact menu function iface:xref(str, o, ...) if type(str) ~= 'string' then std.err ("Wrong parameter to iface:xref: "..std.tostr(str), 2) end if not std.is_obj(o) or std.is_obj(o, 'stat') then return str end local a = { ... } local args = '' for i = 1, #a do if type(a[i]) ~= 'string' and type(a[i]) ~= 'number' then std.err ("Wrong argument to iface:xref: "..std.tostr(a[i]), 2) end args = args .. ' '..std.dump(a[i]) end local xref = std.string.format("%s%s", std.deref_str(o), args) -- std.string.format("%s%s", iface:esc(std.deref_str(o)), iface:esc(args)) if not dict[xref] then table.insert(dict, xref) dict[xref] = #dict end xref = std.tostr(dict[xref]) return str..std.string.format("(%s)", xref) end local iface_cmd = iface.cmd -- save old function iface:cmd(inp) local a = std.split(inp) if std.tonum(a[1]) then std.table.insert(a, 1, 'act') end if a[1] == 'act' or a[1] == 'use' or a[1] == 'go' then if a[1] == 'use' then local use = std.split(a[2], ',') for i = 1, 2 do local u = std.tonum(use[i]) if u then use[i] = dict[u] end end a[2] = std.join(use, ',') elseif std.tonum(a[2]) then a[2] = dict[std.tonum(a[2])] end inp = std.join(a) end return iface_cmd(self, inp) end std.obj { -- input object nam = '@input'; }; -- some aliases menu = std.menu stat = std.stat -- fake sound local sound = std.obj { nam = '@snd'; } sound.set = function() end sound.play = function() end sound.stop = function() end sound.music = function() end sound.stop_music = function() end sound.music_fading = function() end sound.new = function() return sound end -- fake timer std.obj { nam = '@timer'; get = function(s) return s.__timer or 0; end; stop = function(s) return s:set(0) end; set = function(s, v) s.__timer = v return true end; } -- fake sprite std.obj { nam = '@sprite'; new = function() end; fnt = function() end; scr = function() end; direct = function() return false end; render_callback = instead.render_callback; } -- fake pixels std.obj { nam = '@pixels'; fnt = function() end; new = function() end; } -- fake themes local theme = std.obj { nam = '@theme'; { win = { gfx = {}}; inv = { gfx = {}}; menu = { gfx = {}}; gfx = {}; snd = {}; }; } function theme.restore() end function theme.set() end function theme.reset() end function theme.name() end function theme.get() end function theme.win.reset() end function theme.win.geom() end function theme.win.color() end function theme.win.font() end function theme.win.gfx.reset() end function theme.win.gfx.up() end function theme.win.gfx.down() end function theme.inv.reset() end function theme.inv.geom() end function theme.inv.color(f) end function theme.inv.font() end function theme.inv.mode() end function theme.inv.gfx.reset() end function theme.inv.gfx.up() end function theme.inv.gfx.down() end function theme.menu.reset() end function theme.menu.bw(w) end function theme.menu.color() end function theme.menu.font() end function theme.menu.gfx.reset() end function theme.menu.gfx.button() end; function theme.gfx.reset() end function theme.gfx.cursor() end function theme.gfx.mode() end function theme.gfx.pad() end function theme.gfx.bg() end function theme.snd.reset() end function theme.snd.click() end std.mod_init(function() std.rawset(_G, 'instead', instead) end) std.mod_start(function() dict = {} end) std.mod_step(function(state) if state then dict = {} end end) instead-3.2.1/src/winrt.c0000644000175000017500000001536213267071774014307 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh , Anton Kolosov * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include #include #include #include "externals.h" #include "internals.h" #include #include "dirent.h" extern char *curgame; extern char *curgame_dir; static char local_games_path[PATH_MAX]; static char local_themes_path[PATH_MAX]; static char local_stead_path[PATH_MAX]; static char save_path[PATH_MAX]; static char cfg_path[PATH_MAX]; char *game_locale(void) { char buff[64]; char res[64]; buff[0] = 0; /* Antokolos: Note LOCALE_NAME_USER_DEFAULT instead of LOCALE_USER_DEFAULT */ if (!GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SISO639LANGNAME, buff, sizeof(buff) - 1)) return NULL; wcstombs(res, buff, sizeof(res)); return strdup(res); } #if 0 static char *game_codepage = NULL; #ifdef _HAVE_ICONV static char *game_cp(void) { char cpbuff[64]; char buff[64]; buff[0] = 0; if (!GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, buff,sizeof(buff) - 1)) return NULL; snprintf(cpbuff, sizeof(cpbuff), "WINDOWS-%s", buff); return strdup(cpbuff); } char *mbs2utf8(const char *s) { iconv_t han; char *str; if (!game_codepage) game_codepage = game_cp(); if (!s) return NULL; if (!game_codepage) goto out0; han = iconv_open("UTF-8", game_codepage); if (han == (iconv_t)-1) goto out0; if (!(str = decode(han, s))) goto out1; iconv_close(han); return str; out1: iconv_close(han); out0: return strdup(s); } #else char *mbs2utf8(const char *s) { return strdup(s); } #endif #endif extern void unix_path(char *); char *sdl_path(char *p) { #if 0 char *r = mbs2utf8(p); if (p) free(p); unix_path(r); return r; #else unix_path(p); return p; #endif } char *appdir( void ); /* must be implemented as extern "C" in winrt cpp code */ extern void getAppTempDir(char *lpPathBuffer); char *game_tmp_path(void) { static char lpTempPathBuffer[MAX_PATH]; getAppTempDir(lpTempPathBuffer); strcat((char*)lpTempPathBuffer, "/instead-games"); if (mkdir((char*)lpTempPathBuffer) && access((char*)lpTempPathBuffer, W_OK)) return NULL; unix_path((char*)lpTempPathBuffer); return (char*)lpTempPathBuffer; } char *game_local_games_path(int cr) { char *app = appdir(); if (!app) return NULL; snprintf(local_games_path, sizeof(local_games_path) - 1 , "%s/", app); if (cr) { if (mkdir(local_games_path) && access(local_games_path, W_OK)) return NULL; } strcat(local_games_path,"/games"); if (cr) { if (mkdir(local_games_path) && access(local_games_path, W_OK)) return NULL; } return local_games_path; } char *game_local_themes_path(void) { snprintf(local_themes_path, sizeof(local_themes_path) - 1 , "%s/themes", appdir()); return local_themes_path; } char *instead_local_stead_path(void) { snprintf(local_stead_path, sizeof(local_stead_path) - 1 , "%s/stead", appdir()); return local_stead_path; } #if 0 char *home_dir( void ) { static char homedir[PATH_MAX]=""; SHGetFolderPath( NULL, CSIDL_FLAG_CREATE | CSIDL_PROFILE, NULL, 0, (LPTSTR)homedir ); unix_path(homedir); return homedir; } #endif char *appdir( void ) { static char dir[PATH_MAX]=""; if (appdata_sw) strcpy(dir, appdata_sw); else { strcpy(dir, game_cwd); strcat(dir, "/appdata"); } if (!access(dir, W_OK)) return dir; return NULL; } char *game_cfg_path( void ) { char *p = appdir(); if (!p) return NULL; snprintf(cfg_path, sizeof(cfg_path) - 1 , "%src", p); /* appdir/insteadrc ;) */ if (!access(cfg_path, R_OK)) return cfg_path; /* no at home? Try in dir */ snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s", p); if (mkdir(cfg_path) && access(cfg_path, W_OK)) { snprintf(cfg_path, sizeof(cfg_path) - 1 , "%src", p); /* appdir/insteadrc ;) */ return cfg_path; } snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/insteadrc", p); return cfg_path; } char *game_save_path( int cr, int nr ) { char dir[PATH_MAX]; char *p = appdir(); if (!curgame_dir) return NULL; if (!access("saves", R_OK)) { if (nr) snprintf(save_path, sizeof(save_path) - 1, "saves/save%d", nr); else snprintf(save_path, sizeof(save_path) - 1, "saves/autosave"); return save_path; } if (!p) return NULL; strcpy(dir, p); if (cr && mkdir(dir) && access(dir, W_OK)) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/saves", dir); if (cr && mkdir(save_path) && access(save_path, W_OK)) return NULL; snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s", dir, curgame_dir); if (cr && mkdir(save_path) && access(save_path, W_OK)) return NULL; if (nr) snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/save%d", dir, curgame_dir, nr); else snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/autosave", dir, curgame_dir); return save_path; } int debug_init(void) { return 0; } void debug_done() { } #ifdef _USE_BROWSE char *open_file_dialog(void) { OPENFILENAME ofn; static char szFile[MAX_PATH]; static char szOldDir[MAX_PATH]; static int old_dir_set = 0; ZeroMemory( &ofn , sizeof( ofn)); ofn.lStructSize = sizeof ( ofn ); ofn.hwndOwner = NULL ; ofn.lpstrFile = szFile ; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof( szFile ); ofn.lpstrFilter = "*.*\0*.*\0main?.lua;*.zip;*.idf\0main.lua;main3.lua;*.zip;*.idf\0\0"; ofn.nFilterIndex = 2; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; if (!old_dir_set) ofn.lpstrInitialDir = NULL; else ofn.lpstrInitialDir = szOldDir; ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_READONLY; if (!GetOpenFileName(&ofn)) return NULL; old_dir_set = 1; strcpy(szOldDir, ofn.lpstrFile); dirname(szOldDir); unix_path(ofn.lpstrFile); return ofn.lpstrFile; } #endif instead-3.2.1/src/unzip.h0000644000175000017500000003774613267071774014330 0ustar peterpeter/* unzip.h -- IO for uncompress .zip files using zlib Version 1.1, February 14h, 2010 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) Modifications of Unzip for Zip64 Copyright (C) 2007-2008 Even Rouault Modifications for Zip64 support on both zip and unzip Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) For more info read MiniZip_info.txt --------------------------------------------------------------------------------- Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. --------------------------------------------------------------------------------- Changes See header of unzip64.c */ #ifndef _unz64_H #define _unz64_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #ifndef _ZLIBIOAPI_H #include "ioapi.h" #endif #ifdef HAVE_BZIP2 #include "bzlib.h" #endif #define Z_BZIP2ED 12 #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info64_s { ZPOS64_T number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info64; typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info64_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ ZPOS64_T compressed_size; /* compressed size 8 bytes */ ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info64; typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const char *path)); extern unzFile ZEXPORT unzOpen64 OF((const void *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. the "64" function take a const void* pointer, because the path is just the value passed to the open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* does not describe the reality */ extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def)); /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def)); /* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ /* ****************************************** */ /* Ryan supplied functions */ /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_pos_s { uLong pos_in_zip_directory; /* offset in zip file directory */ uLong num_of_file; /* # of file */ } unz_file_pos; extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos); extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos); typedef struct unz64_file_pos_s { ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ ZPOS64_T num_of_file; /* # of file */ } unz64_file_pos; extern int ZEXPORT unzGetFilePos64( unzFile file, unz64_file_pos* file_pos); extern int ZEXPORT unzGoToFilePos64( unzFile file, const unz64_file_pos* file_pos); /* ****************************************** */ extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /** Addition for GDAL : START */ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); /** Addition for GDAL : END */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password)); /* Open for reading data the current file in the zipfile. password is a crypting password If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ /***************************************************************************/ /* Get the current file offset */ extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); extern uLong ZEXPORT unzGetOffset (unzFile file); /* Set the current file offset */ extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); #ifdef __cplusplus } #endif #endif /* _unz64_H */ instead-3.2.1/src/Makefile0000644000175000017500000000314213267071774014431 0ustar peterpeterinclude ../Rules.make include ../config.make CFLAGS += $(SDL_CFLAGS) $(LUA_CFLAGS) $(ZLIB_CFLAGS) $(EXTRA_CFLAGS) -D_USE_SDL -DLANG_PATH=\"${LANGPATH}/\" -DSTEAD_PATH=\"${STEADPATH}/\" -DGAMES_PATH=\"${GAMESPATH}/\" -DTHEMES_PATH=\"${THEMESPATH}/\" -DVERSION=\"$(VERSION)\" -DICON_PATH=\"${ICONPATH}/\" LDFLAGS += $(SDL_LFLAGS) $(LUA_LFLAGS) $(ZLIB_LFLAGS) $(EXTRA_LDFLAGS) INSTEAD_SRC := instead/instead.c instead/util.c instead/list.c instead/cache.c instead/idf.c instead/tinymt32.c instead/lfs.c INSTEAD_H := instead/cache.h instead/system.h instead/instead.h instead/list.h instead/util.h instead/tinymt32.h instead/idf.h SRC := graphics.c input.c game.c main.c \ instead_bits.c instead_sprites.c instead_timer.c instead_sound.c instead_paths.c noise1234.c \ sound.c SDL_rotozoom.c SDL_anigif.c SDL_gfxBlitFunc.c config.c themes.c menu.c \ utils.c unzip.c ioapi.c unpack.c $(PLATFORM) $(INSTEAD_SRC) H := config.h externals.h game.h graphics.h input.h internals.h ioapi.h iowin32.h \ menu.h SDL_rotozoom.h SDL_anigif.h SDL_gfxBlitFunc.h sound.h themes.h unzip.h $(INSTEAD_H) OBJ := $(patsubst %.c, %.o, $(SRC)) $(ADDOBJ) all: sdl-instead$(EXE) $(OBJ): %.o : %.c $(H) $(CC) -c $(<) $(I) $(CFLAGS) $(CPPFLAGS) -o $(@) sdl-instead$(EXE): $(OBJ) $(RESOURCES) $(CC) $(CFLAGS) $(^) $(LDFLAGS) -o $(@) install: $(INSTALLD) $(DESTDIR)$(BIN) $(INSTALLB) sdl-instead$(EXE) $(DESTDIR)$(BIN)/sdl-instead$(EXE) $(LN) sdl-instead$(EXE) $(DESTDIR)$(BIN)/instead$(EXE) uninstall: $(RM) $(DESTDIR)$(BIN)/sdl-instead$(EXE) $(RM) $(DESTDIR)$(BIN)/instead$(EXE) clean: $(RM) -f *.o instead/*.o sdl-instead$(EXE) instead-3.2.1/src/SDL2_rotozoom.c0000644000175000017500000011674713267071774015631 0ustar peterpeter/* SDL2_rotozoom.c: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces Copyright (C) 2012 Andreas Schiffler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Andreas Schiffler -- aschiffler at ferzkopp dot net */ #ifdef WIN32 #include #endif #include #include #include "SDL2_rotozoom.h" /* ---- Internally used structures */ /*! \brief A 32 bit RGBA pixel. */ typedef struct tColorRGBA { Uint8 r; Uint8 g; Uint8 b; Uint8 a; } tColorRGBA; /*! \brief A 8bit Y/palette pixel. */ typedef struct tColorY { Uint8 y; } tColorY; /*! \brief Returns maximum of two numbers a and b. */ #define MAX(a,b) (((a) > (b)) ? (a) : (b)) /*! \brief Number of guard rows added to destination surfaces. This is a simple but effective workaround for observed issues. These rows allocate extra memory and are then hidden from the surface. Rows are added to the end of destination surfaces when they are allocated. This catches any potential overflows which seem to happen with just the right src image dimensions and scale/rotation and can lead to a situation where the program can segfault. */ #define GUARD_ROWS (2) /*! \brief Lower limit of absolute zoom factor or rotation degrees. */ #define VALUE_LIMIT 0.001 /*! \brief Returns colorkey info for a surface */ Uint32 _colorkey(SDL_Surface *src) { Uint32 key = 0; SDL_GetColorKey(src, &key); return key; } /*! \brief Internal 32 bit integer-factor averaging Shrinker. Shrinks 32 bit RGBA/ABGR 'src' surface to 'dst' surface. Averages color and alpha values values of src pixels to calculate dst pixels. Assumes src and dst surfaces are of 32 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to shrink (input). \param dst The shrunken surface (output). \param factorx The horizontal shrinking ratio. \param factory The vertical shrinking ratio. \return 0 for success or -1 for error. */ int _shrinkSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int factorx, int factory) { int x, y, dx, dy, dgap, ra, ga, ba, aa; int n_average; tColorRGBA *sp, *osp, *oosp; tColorRGBA *dp; /* * Averaging integer shrink */ /* Precalculate division factor */ n_average = factorx*factory; /* * Scan destination */ sp = (tColorRGBA *) src->pixels; dp = (tColorRGBA *) dst->pixels; dgap = dst->pitch - dst->w * 4; for (y = 0; y < dst->h; y++) { osp=sp; for (x = 0; x < dst->w; x++) { /* Trace out source box and accumulate */ oosp=sp; ra=ga=ba=aa=0; for (dy=0; dy < factory; dy++) { for (dx=0; dx < factorx; dx++) { ra += sp->r; ga += sp->g; ba += sp->b; aa += sp->a; sp++; } /* src dx loop */ sp = (tColorRGBA *)((Uint8*)sp + (src->pitch - 4*factorx)); /* next y */ } /* src dy loop */ /* next box-x */ sp = (tColorRGBA *)((Uint8*)oosp + 4*factorx); /* Store result in destination */ dp->r = ra/n_average; dp->g = ga/n_average; dp->b = ba/n_average; dp->a = aa/n_average; /* * Advance destination pointer */ dp++; } /* dst x loop */ /* next box-y */ sp = (tColorRGBA *)((Uint8*)osp + src->pitch*factory); /* * Advance destination pointers */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } /* dst y loop */ return (0); } /*! \brief Internal 8 bit integer-factor averaging shrinker. Shrinks 8bit Y 'src' surface to 'dst' surface. Averages color (brightness) values values of src pixels to calculate dst pixels. Assumes src and dst surfaces are of 8 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to shrink (input). \param dst The shrunken surface (output). \param factorx The horizontal shrinking ratio. \param factory The vertical shrinking ratio. \return 0 for success or -1 for error. */ int _shrinkSurfaceY(SDL_Surface * src, SDL_Surface * dst, int factorx, int factory) { int x, y, dx, dy, dgap, a; int n_average; Uint8 *sp, *osp, *oosp; Uint8 *dp; /* * Averaging integer shrink */ /* Precalculate division factor */ n_average = factorx*factory; /* * Scan destination */ sp = (Uint8 *) src->pixels; dp = (Uint8 *) dst->pixels; dgap = dst->pitch - dst->w; for (y = 0; y < dst->h; y++) { osp=sp; for (x = 0; x < dst->w; x++) { /* Trace out source box and accumulate */ oosp=sp; a=0; for (dy=0; dy < factory; dy++) { for (dx=0; dx < factorx; dx++) { a += (*sp); /* next x */ sp++; } /* end src dx loop */ /* next y */ sp = (Uint8 *)((Uint8*)sp + (src->pitch - factorx)); } /* end src dy loop */ /* next box-x */ sp = (Uint8 *)((Uint8*)oosp + factorx); /* Store result in destination */ *dp = a/n_average; /* * Advance destination pointer */ dp++; } /* end dst x loop */ /* next box-y */ sp = (Uint8 *)((Uint8*)osp + src->pitch*factory); /* * Advance destination pointers */ dp = (Uint8 *)((Uint8 *)dp + dgap); } /* end dst y loop */ return (0); } /*! \brief Internal 32 bit Zoomer with optional anti-aliasing by bilinear interpolation. Zooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface. Assumes src and dst surfaces are of 32 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to zoom (input). \param dst The zoomed surface (output). \param flipx Flag indicating if the image should be horizontally flipped. \param flipy Flag indicating if the image should be vertically flipped. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return 0 for success or -1 for error. */ int _zoomSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int flipx, int flipy, int smooth) { int x, y, sx, sy, ssx, ssy, *sax, *say, *csax, *csay, *salast, csx, csy, ex, ey, cx, cy, sstep, sstepx, sstepy; tColorRGBA *c00, *c01, *c10, *c11; tColorRGBA *sp, *csp, *dp; int spixelgap, spixelw, spixelh, dgap, t1, t2; /* * Allocate memory for row/column increments */ if ((sax = (int *) malloc((dst->w + 1) * sizeof(int))) == NULL) { return (-1); } if ((say = (int *) malloc((dst->h + 1) * sizeof(int))) == NULL) { free(sax); return (-1); } /* * Precalculate row increments */ spixelw = (src->w - 1); spixelh = (src->h - 1); if (smooth) { sx = (int) (65536.0 * (float) spixelw / (float) (dst->w - 1)); sy = (int) (65536.0 * (float) spixelh / (float) (dst->h - 1)); } else { sx = (int) (65536.0 * (float) (src->w) / (float) (dst->w)); sy = (int) (65536.0 * (float) (src->h) / (float) (dst->h)); } /* Maximum scaled source size */ ssx = (src->w << 16) - 1; ssy = (src->h << 16) - 1; /* Precalculate horizontal row increments */ csx = 0; csax = sax; for (x = 0; x <= dst->w; x++) { *csax = csx; csax++; csx += sx; /* Guard from overflows */ if (csx > ssx) { csx = ssx; } } /* Precalculate vertical row increments */ csy = 0; csay = say; for (y = 0; y <= dst->h; y++) { *csay = csy; csay++; csy += sy; /* Guard from overflows */ if (csy > ssy) { csy = ssy; } } sp = (tColorRGBA *) src->pixels; dp = (tColorRGBA *) dst->pixels; dgap = dst->pitch - dst->w * 4; spixelgap = src->pitch/4; if (flipx) sp += spixelw; if (flipy) sp += (spixelgap * spixelh); /* * Switch between interpolating and non-interpolating code */ if (smooth) { /* * Interpolating Zoom */ csay = say; for (y = 0; y < dst->h; y++) { csp = sp; csax = sax; for (x = 0; x < dst->w; x++) { /* * Setup color source pointers */ ex = (*csax & 0xffff); ey = (*csay & 0xffff); cx = (*csax >> 16); cy = (*csay >> 16); sstepx = cx < spixelw; sstepy = cy < spixelh; c00 = sp; c01 = sp; c10 = sp; if (sstepy) { if (flipy) { c10 -= spixelgap; } else { c10 += spixelgap; } } c11 = c10; if (sstepx) { if (flipx) { c01--; c11--; } else { c01++; c11++; } } /* * Draw and interpolate colors */ t1 = ((((c01->r - c00->r) * ex) >> 16) + c00->r) & 0xff; t2 = ((((c11->r - c10->r) * ex) >> 16) + c10->r) & 0xff; dp->r = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->g - c00->g) * ex) >> 16) + c00->g) & 0xff; t2 = ((((c11->g - c10->g) * ex) >> 16) + c10->g) & 0xff; dp->g = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->b - c00->b) * ex) >> 16) + c00->b) & 0xff; t2 = ((((c11->b - c10->b) * ex) >> 16) + c10->b) & 0xff; dp->b = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->a - c00->a) * ex) >> 16) + c00->a) & 0xff; t2 = ((((c11->a - c10->a) * ex) >> 16) + c10->a) & 0xff; dp->a = (((t2 - t1) * ey) >> 16) + t1; /* * Advance source pointer x */ salast = csax; csax++; sstep = (*csax >> 16) - (*salast >> 16); if (flipx) { sp -= sstep; } else { sp += sstep; } /* * Advance destination pointer x */ dp++; } /* * Advance source pointer y */ salast = csay; csay++; sstep = (*csay >> 16) - (*salast >> 16); sstep *= spixelgap; if (flipy) { sp = csp - sstep; } else { sp = csp + sstep; } /* * Advance destination pointer y */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } } else { /* * Non-Interpolating Zoom */ csay = say; for (y = 0; y < dst->h; y++) { csp = sp; csax = sax; for (x = 0; x < dst->w; x++) { /* * Draw */ *dp = *sp; /* * Advance source pointer x */ salast = csax; csax++; sstep = (*csax >> 16) - (*salast >> 16); if (flipx) sstep = -sstep; sp += sstep; /* * Advance destination pointer x */ dp++; } /* * Advance source pointer y */ salast = csay; csay++; sstep = (*csay >> 16) - (*salast >> 16); sstep *= spixelgap; if (flipy) sstep = -sstep; sp = csp + sstep; /* * Advance destination pointer y */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } } /* * Remove temp arrays */ free(sax); free(say); return (0); } /*! \brief Internal 8 bit Zoomer without smoothing. Zooms 8bit palette/Y 'src' surface to 'dst' surface. Assumes src and dst surfaces are of 8 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to zoom (input). \param dst The zoomed surface (output). \param flipx Flag indicating if the image should be horizontally flipped. \param flipy Flag indicating if the image should be vertically flipped. \return 0 for success or -1 for error. */ int _zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst, int flipx, int flipy) { int x, y; Uint32 *sax, *say, *csax, *csay; int csx, csy; Uint8 *sp, *dp, *csp; int dgap; /* * Allocate memory for row increments */ if ((sax = (Uint32 *) malloc((dst->w + 1) * sizeof(Uint32))) == NULL) { return (-1); } if ((say = (Uint32 *) malloc((dst->h + 1) * sizeof(Uint32))) == NULL) { free(sax); return (-1); } /* * Pointer setup */ sp = csp = (Uint8 *) src->pixels; dp = (Uint8 *) dst->pixels; dgap = dst->pitch - dst->w; if (flipx) csp += (src->w-1); if (flipy) csp = ( (Uint8*)csp + src->pitch*(src->h-1) ); /* * Precalculate row increments */ csx = 0; csax = sax; for (x = 0; x < dst->w; x++) { csx += src->w; *csax = 0; while (csx >= dst->w) { csx -= dst->w; (*csax)++; } (*csax) = (*csax) * (flipx ? -1 : 1); csax++; } csy = 0; csay = say; for (y = 0; y < dst->h; y++) { csy += src->h; *csay = 0; while (csy >= dst->h) { csy -= dst->h; (*csay)++; } (*csay) = (*csay) * (flipy ? -1 : 1); csay++; } /* * Draw */ csay = say; for (y = 0; y < dst->h; y++) { csax = sax; sp = csp; for (x = 0; x < dst->w; x++) { /* * Draw */ *dp = *sp; /* * Advance source pointers */ sp += (*csax); csax++; /* * Advance destination pointer */ dp++; } /* * Advance source pointer (for row) */ csp += ((*csay) * src->pitch); csay++; /* * Advance destination pointers */ dp += dgap; } /* * Remove temp arrays */ free(sax); free(say); return (0); } /*! \brief Internal 32 bit rotozoomer with optional anti-aliasing. Rotates and zooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control parameters by scanning the destination surface and applying optionally anti-aliasing by bilinear interpolation. Assumes src and dst surfaces are of 32 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src Source surface. \param dst Destination surface. \param cx Horizontal center coordinate. \param cy Vertical center coordinate. \param isin Integer version of sine of angle. \param icos Integer version of cosine of angle. \param flipx Flag indicating horizontal mirroring should be applied. \param flipy Flag indicating vertical mirroring should be applied. \param smooth Flag indicating anti-aliasing should be used. */ void _transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy, int smooth) { int x, y, t1, t2, dx, dy, xd, yd, sdx, sdy, ax, ay, ex, ey, sw, sh; tColorRGBA c00, c01, c10, c11, cswap; tColorRGBA *pc, *sp; int gap; /* * Variable setup */ xd = ((src->w - dst->w) << 15); yd = ((src->h - dst->h) << 15); ax = (cx << 16) - (icos * cx); ay = (cy << 16) - (isin * cx); sw = src->w - 1; sh = src->h - 1; pc = (tColorRGBA*) dst->pixels; gap = dst->pitch - dst->w * 4; /* * Switch between interpolating and non-interpolating code */ if (smooth) { for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (sdx >> 16); dy = (sdy >> 16); if (flipx) dx = sw - dx; if (flipy) dy = sh - dy; if ((dx > -1) && (dy > -1) && (dx < (src->w-1)) && (dy < (src->h-1))) { sp = (tColorRGBA *)src->pixels;; sp += ((src->pitch/4) * dy); sp += dx; c00 = *sp; sp += 1; c01 = *sp; sp += (src->pitch/4); c11 = *sp; sp -= 1; c10 = *sp; if (flipx) { cswap = c00; c00=c01; c01=cswap; cswap = c10; c10=c11; c11=cswap; } if (flipy) { cswap = c00; c00=c10; c10=cswap; cswap = c01; c01=c11; c11=cswap; } /* * Interpolate colors */ ex = (sdx & 0xffff); ey = (sdy & 0xffff); t1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff; t2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff; pc->r = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff; t2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff; pc->g = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff; t2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff; pc->b = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff; t2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff; pc->a = (((t2 - t1) * ey) >> 16) + t1; } sdx += icos; sdy += isin; pc++; } pc = (tColorRGBA *) ((Uint8 *) pc + gap); } } else { for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (short) (sdx >> 16); dy = (short) (sdy >> 16); if (flipx) dx = (src->w-1)-dx; if (flipy) dy = (src->h-1)-dy; if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); sp += dx; *pc = *sp; } sdx += icos; sdy += isin; pc++; } pc = (tColorRGBA *) ((Uint8 *) pc + gap); } } } /*! \brief Rotates and zooms 8 bit palette/Y 'src' surface to 'dst' surface without smoothing. Rotates and zooms 8 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control parameters by scanning the destination surface. Assumes src and dst surfaces are of 8 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src Source surface. \param dst Destination surface. \param cx Horizontal center coordinate. \param cy Vertical center coordinate. \param isin Integer version of sine of angle. \param icos Integer version of cosine of angle. \param flipx Flag indicating horizontal mirroring should be applied. \param flipy Flag indicating vertical mirroring should be applied. */ void transformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy) { int x, y, dx, dy, xd, yd, sdx, sdy, ax, ay; tColorY *pc, *sp; int gap; /* * Variable setup */ xd = ((src->w - dst->w) << 15); yd = ((src->h - dst->h) << 15); ax = (cx << 16) - (icos * cx); ay = (cy << 16) - (isin * cx); pc = (tColorY*) dst->pixels; gap = dst->pitch - dst->w; /* * Clear surface to colorkey */ memset(pc, (int)(_colorkey(src) & 0xff), dst->pitch * dst->h); /* * Iterate through destination surface */ for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (short) (sdx >> 16); dy = (short) (sdy >> 16); if (flipx) dx = (src->w-1)-dx; if (flipy) dy = (src->h-1)-dy; if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) { sp = (tColorY *) (src->pixels); sp += (src->pitch * dy + dx); *pc = *sp; } sdx += icos; sdy += isin; pc++; } pc += gap; } } /*! \brief Rotates a 8/16/24/32 bit surface in increments of 90 degrees. Specialized 90 degree rotator which rotates a 'src' surface in 90 degree increments clockwise returning a new surface. Faster than rotozoomer since no scanning or interpolation takes place. Input surface must be 8/16/24/32 bit. (code contributed by J. Schiller, improved by C. Allport and A. Schiffler) \param src Source surface to rotate. \param numClockwiseTurns Number of clockwise 90 degree turns to apply to the source. \returns The new, rotated surface; or NULL for surfaces with incorrect input format. */ SDL_Surface* rotateSurface90Degrees(SDL_Surface* src, int numClockwiseTurns) { int row, col, newWidth, newHeight; int bpp; SDL_Surface* dst; Uint8* srcBuf; Uint8* dstBuf; /* Has to be a valid surface pointer and be a 8/16/24/32-bit surface */ if (!src || !src->format || !(src->format->BitsPerPixel == 8) || (src->format->BitsPerPixel == 16) || (src->format->BitsPerPixel == 24) || (src->format->BitsPerPixel == 32)) { return NULL; } /* normalize numClockwiseTurns */ while(numClockwiseTurns < 0) { numClockwiseTurns += 4; } numClockwiseTurns = (numClockwiseTurns % 4); /* if it's even, our new width will be the same as the source surface */ newWidth = (numClockwiseTurns % 2) ? (src->h) : (src->w); newHeight = (numClockwiseTurns % 2) ? (src->w) : (src->h); dst = SDL_CreateRGBSurface( src->flags, newWidth, newHeight, src->format->BitsPerPixel, src->format->Rmask, src->format->Gmask, src->format->Bmask, src->format->Amask); if(!dst) { return NULL; } if (SDL_MUSTLOCK(src)) { SDL_LockSurface(src); } if (SDL_MUSTLOCK(dst)) { SDL_LockSurface(dst); } /* Calculate byte-per-pixel */ bpp = src->format->BitsPerPixel / 8; switch(numClockwiseTurns) { case 0: /* Make a copy of the surface */ { /* Unfortunately SDL_BlitSurface cannot be used to make a copy of the surface since it does not preserve alpha. */ if (src->pitch == dst->pitch) { /* If the pitch is the same for both surfaces, the memory can be copied all at once. */ memcpy(dst->pixels, src->pixels, (src->h * src->pitch)); } else { /* If the pitch differs, copy each row separately */ srcBuf = (Uint8*)(src->pixels); dstBuf = (Uint8*)(dst->pixels); for (row = 0; row < src->h; row++) { memcpy(dstBuf, srcBuf, dst->w * bpp); srcBuf += src->pitch; dstBuf += dst->pitch; } /* end for(col) */ } /* end for(row) */ } break; /* rotate clockwise */ case 1: /* rotated 90 degrees clockwise */ { for (row = 0; row < src->h; ++row) { srcBuf = (Uint8*)(src->pixels) + (row * src->pitch); dstBuf = (Uint8*)(dst->pixels) + (dst->w - row - 1) * bpp; for (col = 0; col < src->w; ++col) { memcpy (dstBuf, srcBuf, bpp); srcBuf += bpp; dstBuf += dst->pitch; } } } break; case 2: /* rotated 180 degrees clockwise */ { for (row = 0; row < src->h; ++row) { srcBuf = (Uint8*)(src->pixels) + (row * src->pitch); dstBuf = (Uint8*)(dst->pixels) + ((dst->h - row - 1) * dst->pitch) + (dst->w - 1) * bpp; for (col = 0; col < src->w; ++col) { memcpy (dstBuf, srcBuf, bpp); srcBuf += bpp; dstBuf -= bpp; } } } break; case 3: /* rotated 270 degrees clockwise */ { for (row = 0; row < src->h; ++row) { srcBuf = (Uint8*)(src->pixels) + (row * src->pitch); dstBuf = (Uint8*)(dst->pixels) + row + ((dst->h - 1) * dst->pitch); for (col = 0; col < src->w; ++col) { *dstBuf = *srcBuf; srcBuf += bpp; dstBuf -= dst->pitch; } } } break; } /* end switch */ if (SDL_MUSTLOCK(src)) { SDL_UnlockSurface(src); } if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return dst; } /*! \brief Internal target surface sizing function for rotozooms with trig result return. \param width The source surface width. \param height The source surface height. \param angle The angle to rotate in degrees. \param zoomx The horizontal scaling factor. \param zoomy The vertical scaling factor. \param dstwidth The calculated width of the destination surface. \param dstheight The calculated height of the destination surface. \param canglezoom The sine of the angle adjusted by the zoom factor. \param sanglezoom The cosine of the angle adjusted by the zoom factor. */ void _rotozoomSurfaceSizeTrig(int width, int height, double angle, double zoomx, double zoomy, int *dstwidth, int *dstheight, double *canglezoom, double *sanglezoom) { double x, y, cx, cy, sx, sy; double radangle; int dstwidthhalf, dstheighthalf; /* * Determine destination width and height by rotating a centered source box */ radangle = angle * (M_PI / 180.0); *sanglezoom = sin(radangle); *canglezoom = cos(radangle); *sanglezoom *= zoomx; *canglezoom *= zoomx; x = (double)(width / 2); y = (double)(height / 2); cx = *canglezoom * x; cy = *canglezoom * y; sx = *sanglezoom * x; sy = *sanglezoom * y; dstwidthhalf = MAX((int) ceil(MAX(MAX(MAX(fabs(cx + sy), fabs(cx - sy)), fabs(-cx + sy)), fabs(-cx - sy))), 1); dstheighthalf = MAX((int) ceil(MAX(MAX(MAX(fabs(sx + cy), fabs(sx - cy)), fabs(-sx + cy)), fabs(-sx - cy))), 1); *dstwidth = 2 * dstwidthhalf; *dstheight = 2 * dstheighthalf; } /*! \brief Returns the size of the resulting target surface for a rotozoomSurfaceXY() call. \param width The source surface width. \param height The source surface height. \param angle The angle to rotate in degrees. \param zoomx The horizontal scaling factor. \param zoomy The vertical scaling factor. \param dstwidth The calculated width of the rotozoomed destination surface. \param dstheight The calculated height of the rotozoomed destination surface. */ void rotozoomSurfaceSizeXY(int width, int height, double angle, double zoomx, double zoomy, int *dstwidth, int *dstheight) { double dummy_sanglezoom, dummy_canglezoom; _rotozoomSurfaceSizeTrig(width, height, angle, zoomx, zoomy, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom); } /*! \brief Returns the size of the resulting target surface for a rotozoomSurface() call. \param width The source surface width. \param height The source surface height. \param angle The angle to rotate in degrees. \param zoom The scaling factor. \param dstwidth The calculated width of the rotozoomed destination surface. \param dstheight The calculated height of the rotozoomed destination surface. */ void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight) { double dummy_sanglezoom, dummy_canglezoom; _rotozoomSurfaceSizeTrig(width, height, angle, zoom, zoom, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom); } /*! \brief Rotates and zooms a surface and optional anti-aliasing. Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'angle' is the rotation in degrees and 'zoom' a scaling factor. If 'smooth' is set then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. \param src The surface to rotozoom. \param angle The angle to rotate in degrees. \param zoom The scaling factor. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return The new rotozoomed surface. */ SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth) { return rotozoomSurfaceXY(src, angle, zoom, zoom, smooth); } /*! \brief Rotates and zooms a surface with different horizontal and vertival scaling factors and optional anti-aliasing. Rotates and zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'angle' is the rotation in degrees, 'zoomx and 'zoomy' scaling factors. If 'smooth' is set then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. \param src The surface to rotozoom. \param angle The angle to rotate in degrees. \param zoomx The horizontal scaling factor. \param zoomy The vertical scaling factor. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return The new rotozoomed surface. */ SDL_Surface *rotozoomSurfaceXY(SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth) { SDL_Surface *rz_src; SDL_Surface *rz_dst; double zoominv; double sanglezoom, canglezoom, sanglezoominv, canglezoominv; int dstwidthhalf, dstwidth, dstheighthalf, dstheight; int is32bit; int i, src_converted; int flipx,flipy; /* * Sanity check */ if (src == NULL) { return (NULL); } /* * Determine if source surface is 32bit or 8bit */ is32bit = (src->format->BitsPerPixel == 32); if ((is32bit) || (src->format->BitsPerPixel == 8)) { /* * Use source surface 'as is' */ rz_src = src; src_converted = 0; } else { /* * New source surface is 32bit with a defined RGBA ordering */ rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 #else 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff #endif ); SDL_BlitSurface(src, NULL, rz_src, NULL); src_converted = 1; is32bit = 1; } /* * Sanity check zoom factor */ flipx = (zoomx<0.0); if (flipx) zoomx=-zoomx; flipy = (zoomy<0.0); if (flipy) zoomy=-zoomy; if (zoomx < VALUE_LIMIT) zoomx = VALUE_LIMIT; if (zoomy < VALUE_LIMIT) zoomy = VALUE_LIMIT; zoominv = 65536.0 / (zoomx * zoomx); /* * Check if we have a rotozoom or just a zoom */ if (fabs(angle) > VALUE_LIMIT) { /* * Angle!=0: full rotozoom */ /* * ----------------------- */ /* Determine target size */ _rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, zoomx, zoomy, &dstwidth, &dstheight, &canglezoom, &sanglezoom); /* * Calculate target factors from sin/cos and zoom */ sanglezoominv = sanglezoom; canglezoominv = canglezoom; sanglezoominv *= zoominv; canglezoominv *= zoominv; /* Calculate half size */ dstwidthhalf = dstwidth / 2; dstheighthalf = dstheight / 2; /* * Alloc space to completely contain the rotated surface */ rz_dst = NULL; if (is32bit) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) return NULL; /* Adjust for guard rows */ rz_dst->h = dstheight; /* * Lock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_LockSurface(rz_src); } /* * Check which kind of surface we have */ if (is32bit) { /* * Call the 32bit transformation routine to do the rotation (using alpha) */ _transformSurfaceRGBA(rz_src, rz_dst, dstwidthhalf, dstheighthalf, (int) (sanglezoominv), (int) (canglezoominv), flipx, flipy, smooth); } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the rotation */ transformSurfaceY(rz_src, rz_dst, dstwidthhalf, dstheighthalf, (int) (sanglezoominv), (int) (canglezoominv), flipx, flipy); } /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } } else { /* * Angle=0: Just a zoom */ /* * -------------------- */ /* * Calculate target size */ zoomSurfaceSize(rz_src->w, rz_src->h, zoomx, zoomy, &dstwidth, &dstheight); /* * Alloc space to completely contain the zoomed surface */ rz_dst = NULL; if (is32bit) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) return NULL; /* Adjust for guard rows */ rz_dst->h = dstheight; /* * Lock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_LockSurface(rz_src); } /* * Check which kind of surface we have */ if (is32bit) { /* * Call the 32bit transformation routine to do the zooming (using alpha) */ _zoomSurfaceRGBA(rz_src, rz_dst, flipx, flipy, smooth); } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the zooming */ _zoomSurfaceY(rz_src, rz_dst, flipx, flipy); } /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } } /* * Cleanup temp surface */ if (src_converted) { SDL_FreeSurface(rz_src); } /* * Return destination surface */ return (rz_dst); } /*! \brief Calculates the size of the target surface for a zoomSurface() call. The minimum size of the target surface is 1. The input factors can be positive or negative. \param width The width of the source surface to zoom. \param height The height of the source surface to zoom. \param zoomx The horizontal zoom factor. \param zoomy The vertical zoom factor. \param dstwidth Pointer to an integer to store the calculated width of the zoomed target surface. \param dstheight Pointer to an integer to store the calculated height of the zoomed target surface. */ void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight) { /* * Make zoom factors positive */ int flipx, flipy; flipx = (zoomx<0.0); if (flipx) zoomx = -zoomx; flipy = (zoomy<0.0); if (flipy) zoomy = -zoomy; /* * Sanity check zoom factors */ if (zoomx < VALUE_LIMIT) { zoomx = VALUE_LIMIT; } if (zoomy < VALUE_LIMIT) { zoomy = VALUE_LIMIT; } /* * Calculate target size */ *dstwidth = (int) floor(((double) width * zoomx) + 0.5); *dstheight = (int) floor(((double) height * zoomy) + 0.5); if (*dstwidth < 1) { *dstwidth = 1; } if (*dstheight < 1) { *dstheight = 1; } } /*! \brief Zoom a surface by independent horizontal and vertical factors with optional smoothing. Zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is on then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. If zoom factors are negative, the image is flipped on the axes. \param src The surface to zoom. \param zoomx The horizontal zoom factor. \param zoomy The vertical zoom factor. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return The new, zoomed surface. */ SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth) { SDL_Surface *rz_src; SDL_Surface *rz_dst; int dstwidth, dstheight; int is32bit; int i, src_converted; int flipx, flipy; /* * Sanity check */ if (src == NULL) return (NULL); /* * Determine if source surface is 32bit or 8bit */ is32bit = (src->format->BitsPerPixel == 32); if ((is32bit) || (src->format->BitsPerPixel == 8)) { /* * Use source surface 'as is' */ rz_src = src; src_converted = 0; } else { /* * New source surface is 32bit with a defined RGBA ordering */ rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 #else 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff #endif ); if (rz_src == NULL) { return NULL; } SDL_BlitSurface(src, NULL, rz_src, NULL); src_converted = 1; is32bit = 1; } flipx = (zoomx<0.0); if (flipx) zoomx = -zoomx; flipy = (zoomy<0.0); if (flipy) zoomy = -zoomy; /* Get size if target */ zoomSurfaceSize(rz_src->w, rz_src->h, zoomx, zoomy, &dstwidth, &dstheight); /* * Alloc space to completely contain the zoomed surface */ rz_dst = NULL; if (is32bit) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) { /* * Cleanup temp surface */ if (src_converted) { SDL_FreeSurface(rz_src); } return NULL; } /* Adjust for guard rows */ rz_dst->h = dstheight; /* * Lock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_LockSurface(rz_src); } /* * Check which kind of surface we have */ if (is32bit) { /* * Call the 32bit transformation routine to do the zooming (using alpha) */ _zoomSurfaceRGBA(rz_src, rz_dst, flipx, flipy, smooth); } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the zooming */ _zoomSurfaceY(rz_src, rz_dst, flipx, flipy); } /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } /* * Cleanup temp surface */ if (src_converted) { SDL_FreeSurface(rz_src); } /* * Return destination surface */ return (rz_dst); } /*! \brief Shrink a surface by an integer ratio using averaging. Shrinks a 32bit or 8bit 'src' surface to a newly created 'dst' surface. 'factorx' and 'factory' are the shrinking ratios (i.e. 2=1/2 the size, 3=1/3 the size, etc.) The destination surface is antialiased by averaging the source box RGBA or Y information. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. The input surface is not modified. The output surface is newly allocated. \param src The surface to shrink. \param factorx The horizontal shrinking ratio. \param factory The vertical shrinking ratio. \return The new, shrunken surface. */ /*@null@*/ SDL_Surface *shrinkSurface(SDL_Surface *src, int factorx, int factory) { int result; SDL_Surface *rz_src; SDL_Surface *rz_dst = NULL; int dstwidth, dstheight; int is32bit; int i, src_converted = 0; int haveError = 0; /* * Sanity check */ if (src == NULL) { return (NULL); } /* * Determine if source surface is 32bit or 8bit */ is32bit = (src->format->BitsPerPixel == 32); if ((is32bit) || (src->format->BitsPerPixel == 8)) { /* * Use source surface 'as is' */ rz_src = src; src_converted = 0; } else { /* * New source surface is 32bit with a defined RGBA ordering */ rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 #else 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff #endif ); if (rz_src==NULL) { haveError = 1; goto exitShrinkSurface; } SDL_BlitSurface(src, NULL, rz_src, NULL); src_converted = 1; is32bit = 1; } /* * Lock the surface */ if (SDL_MUSTLOCK(rz_src)) { if (SDL_LockSurface(rz_src) < 0) { haveError = 1; goto exitShrinkSurface; } } /* Get size for target */ dstwidth=rz_src->w/factorx; while (dstwidth*factorx>rz_src->w) { dstwidth--; } dstheight=rz_src->h/factory; while (dstheight*factory>rz_src->h) { dstheight--; } /* * Alloc space to completely contain the shrunken surface * (with added guard rows) */ if (is32bit==1) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) { haveError = 1; goto exitShrinkSurface; } /* Adjust for guard rows */ rz_dst->h = dstheight; /* * Check which kind of surface we have */ if (is32bit==1) { /* * Call the 32bit transformation routine to do the shrinking (using alpha) */ result = _shrinkSurfaceRGBA(rz_src, rz_dst, factorx, factory); if ((result!=0) || (rz_dst==NULL)) { haveError = 1; goto exitShrinkSurface; } } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the shrinking */ result = _shrinkSurfaceY(rz_src, rz_dst, factorx, factory); if (result!=0) { haveError = 1; goto exitShrinkSurface; } } exitShrinkSurface: if (rz_src!=NULL) { /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } /* * Cleanup temp surface */ if (src_converted==1) { SDL_FreeSurface(rz_src); } } /* Check error state; maybe need to cleanup destination */ if (haveError==1) { if (rz_dst!=NULL) { SDL_FreeSurface(rz_dst); } rz_dst=NULL; } /* * Return destination surface */ return (rz_dst); } instead-3.2.1/src/input.c0000644000175000017500000003436513267071774014307 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" #include static int m_focus = 1; static int m_minimized = 0; int minimized(void) { if (nopause_sw) return 0; return m_minimized; } int mouse_focus(void) { return m_focus; } int mouse_cursor(int on) { if (nocursor_sw) return 0; if (on) SDL_ShowCursor(SDL_ENABLE); else SDL_ShowCursor(SDL_DISABLE); return 0; } void push_user_event(void (*p) (void*), void *data) { SDL_Event event; SDL_UserEvent uevent; memset(&event, 0, sizeof(event)); memset(&uevent, 0, sizeof(uevent)); uevent.type = SDL_USEREVENT; uevent.code = 0; event.type = SDL_USEREVENT; uevent.data1 = (void*) p; uevent.data2 = data; event.user = uevent; SDL_PushEvent(&event); } int system_clipboard(const char *text, char **buf) { #if SDL_VERSION_ATLEAST(2,0,0) if (buf) { if (!SDL_HasClipboardText()) return -1; *buf = SDL_GetClipboardText(); if (*buf == NULL) return -1; return 0; } if (!text) return -1; return SDL_SetClipboardText(text); #else return -1; #endif } #ifdef SAILFISHOS static SDL_FingerID finger_mouse = 0; static void push_mouse_event(SDL_Event *sevent) { SDL_Event event; memset(&event, 0, sizeof(event)); if (sevent->type == SDL_FINGERDOWN) { finger_mouse = sevent->tfinger.fingerId; event.type = SDL_MOUSEBUTTONDOWN; } else if (sevent->type == SDL_FINGERUP) { finger_mouse = 0; event.type = SDL_MOUSEBUTTONUP; } else if (sevent->type == SDL_FINGERMOTION) { if (sevent->tfinger.fingerId != finger_mouse) return; event.type = SDL_MOUSEMOTION; } event.button.x = sevent->tfinger.x; event.button.y = sevent->tfinger.y; event.button.clicks = 1; event.button.button = 1; SDL_PushEvent(&event); } #endif #if SDL_VERSION_ATLEAST(2,0,0) static unsigned long last_press_ms = 0; static unsigned long last_repeat_ms = 0; extern void gfx_finger_pos_scale(float x, float y, int *ox, int *oy, int norm); #endif #define INPUT_REP_DELAY_MS 500 #define INPUT_REP_INTERVAL_MS 30 #if defined(IOS) || defined(ANDROID) int HandleAppEvents(void *userdata, SDL_Event *event) { switch (event->type) { case SDL_APP_LOWMEMORY: return 0; case SDL_APP_WILLENTERBACKGROUND: /* Prepare your app to go into the background. Stop loops, etc. This gets called when the user hits the home button, or gets a call. */ return 0; case SDL_APP_DIDENTERBACKGROUND: /* This will get called if the user accepted whatever sent your app to the background. If the user got a phone call and canceled it, you'll instead get an SDL_APP_DIDENTERFOREGROUND event and restart your loops. When you get this, you have 5 seconds to save all your state or the app will be terminated. Your app is NOT active at this point. */ /* snd_pause(1); */ m_minimized = 1; if (opt_autosave && curgame_dir) /* autosave the game */ game_save(0); cfg_save(); return 0; case SDL_APP_WILLENTERFOREGROUND: /* This call happens when your app is coming back to the foreground. Restore all your state here. */ return 0; case SDL_APP_DIDENTERFOREGROUND: /* Restart your loops here. Your app is interactive and getting CPU again. */ /* snd_pause(0); */ m_minimized = 0; return 0; case SDL_APP_TERMINATING: cfg_save(); game_done(0); snd_done(); gfx_video_done(); gfx_done(); return 0; default: /* No special processing, add it to the event queue */ return 1; } } #endif int input_init(void) { #if SDL_VERSION_ATLEAST(2,0,0) /* SDL_EnableKeyRepeat(500, 30); */ /* TODO ? */ last_press_ms = 0; last_repeat_ms = 0; #else SDL_EnableKeyRepeat(INPUT_REP_DELAY_MS, INPUT_REP_INTERVAL_MS); #endif #if defined(IOS) || defined(ANDROID) SDL_SetEventFilter(HandleAppEvents, NULL); #endif return 0; } void input_clear(void) { SDL_Event event; while (SDL_PollEvent(&event)); return; } void input_uevents(void) { char *g = curgame_dir; SDL_Event peek; curgame_dir = NULL; #if SDL_VERSION_ATLEAST(1,3,0) while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_USEREVENT, SDL_USEREVENT) > 0) { #else while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_USEREVENT)) > 0) { #endif void (*p) (void*) = (void (*)(void*)) peek.user.data1; if (p) p(peek.user.data2); } curgame_dir = g; } #if SDL_VERSION_ATLEAST(1,3,0) static void key_compat(struct inp_event *inp) { int len = strlen(inp->sym); if (!strcmp(inp->sym, "pageup")) strcpy(inp->sym, "page up"); else if (!strcmp(inp->sym, "pagedown")) strcpy(inp->sym, "page down"); else if (!strcmp(inp->sym, "numlock")) strcpy(inp->sym, "num lock"); else if (!strcmp(inp->sym, "scrolllock")) strcpy(inp->sym, "scroll lock"); else if (!strcmp(inp->sym, "capslock")) strcpy(inp->sym, "caps lock"); else if (len >= 8 && !strncmp(inp->sym, "keypad ", 7)) { inp->sym[0] = '['; strcpy(inp->sym + 1, inp->sym + 7); strcpy(inp->sym + 1 + len - 7, "]"); } } #endif #if defined(IOS) || defined(SAILFISHOS) static unsigned long touch_stamp = 0; static int touch_num = 0; #endif int finger_pos(const char *finger, int *x, int *y, float *pressure) { #if SDL_VERSION_ATLEAST(2,0,0) SDL_TouchID tid; SDL_FingerID fid; SDL_Finger *f; int i, n; i = hex2data(finger, &fid, sizeof(fid)); if (i != sizeof(fid) * 2 || finger[i] != ':') return -1; if (hex2data(finger + i + 1, &tid, sizeof(tid)) != sizeof(tid) * 2) return -1; n = SDL_GetNumTouchFingers(tid); if (n <= 0) return -1; for (i = 0; i < n; i++) { f = SDL_GetTouchFinger(tid, i); if (f->id == fid) { if (pressure) *pressure = f->pressure; gfx_finger_pos_scale(f->x, f->y, x, y, 1); return 0; } } return -1; #else return -1; #endif } int input(struct inp_event *inp, int wait) { int rc; SDL_Event event; SDL_Event peek; memset(&event, 0, sizeof(event)); memset(&peek, 0, sizeof(peek)); #if !defined(__EMSCRIPTEN__) if (wait) { rc = SDL_WaitEvent(&event); } else #endif rc = SDL_PollEvent(&event); if (!rc) return 0; inp->sym[0] = 0; inp->type = 0; inp->count = 1; switch(event.type){ #if SDL_VERSION_ATLEAST(2,0,0) case SDL_MULTIGESTURE: case SDL_FINGERMOTION: if (DIRECT_MODE && !game_paused()) return AGAIN; if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, event.type, event.type) > 0) return AGAIN; /* to avoid flickering */ #if defined(SAILFISHOS) push_mouse_event(&event); #endif break; case SDL_FINGERUP: #ifdef IOS touch_num = 0; #endif case SDL_FINGERDOWN: #if defined(SAILFISHOS) push_mouse_event(&event); #endif #if defined(IOS) || defined(SAILFISHOS) if (event.type == SDL_FINGERDOWN) { if (gfx_ticks() - touch_stamp > 100) { touch_num = 0; touch_stamp = gfx_ticks(); } touch_num ++; if (touch_num >= 3) { inp->type = KEY_DOWN; inp->code = 0; strncpy(inp->sym, "escape", sizeof(inp->sym)); break; } } #endif #if SDL_VERSION_ATLEAST(2,0,7) /* broken. normalized by event watcher */ gfx_finger_pos_scale(event.tfinger.x, event.tfinger.y, &inp->x, &inp->y, 0); #else gfx_finger_pos_scale(event.tfinger.x, event.tfinger.y, &inp->x, &inp->y, 1); #endif inp->type = (event.type == SDL_FINGERDOWN) ? FINGER_DOWN : FINGER_UP; data2hex(&event.tfinger.fingerId, sizeof(event.tfinger.fingerId), inp->sym); inp->sym[sizeof(event.tfinger.fingerId) * 2] = ':'; data2hex(&event.tfinger.touchId, sizeof(event.tfinger.touchId), inp->sym + sizeof(event.tfinger.fingerId) * 2 + 1); inp->sym[sizeof(event.tfinger.fingerId) * 2 + 1 + sizeof(event.tfinger.touchId) * 2] = 0; break; case SDL_WINDOWEVENT: switch (event.window.event) { /* case SDL_WINDOWEVENT_SHOWN: */ /* case SDL_WINDOWEVENT_RESIZED: */ case SDL_WINDOWEVENT_SIZE_CHANGED: gfx_resize(event.window.data1, event.window.data2); /* Fall through */ case SDL_WINDOWEVENT_EXPOSED: game_flip(); gfx_commit(); break; case SDL_WINDOWEVENT_MINIMIZED: case SDL_WINDOWEVENT_RESTORED: m_minimized = (event.window.event == SDL_WINDOWEVENT_MINIMIZED && !opt_fs); snd_pause(!nopause_sw && m_minimized); break; #if defined(SAILFISHOS) case SDL_WINDOWEVENT_FOCUS_LOST: snd_pause(!nopause_sw); while (1) { /* pause */ SDL_WaitEvent(&event); if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) { snd_pause(0); break; } if (event.type == SDL_QUIT) { game_running = 0; return -1; } } break; #endif case SDL_WINDOWEVENT_ENTER: case SDL_WINDOWEVENT_FOCUS_GAINED: m_focus = 1; if (opt_fs) mouse_cursor(0); break; case SDL_WINDOWEVENT_LEAVE: m_focus = 0; if (opt_fs) mouse_cursor(1); /* is it hack?*/ break; default: break; } if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_WINDOWEVENT, SDL_WINDOWEVENT) > 0) return AGAIN; /* to avoid flickering */ return 0; #else case SDL_ACTIVEEVENT: if (event.active.state & SDL_APPACTIVE) { m_minimized = !event.active.gain; snd_pause(!nopause_sw && m_minimized); } if (event.active.state & (SDL_APPMOUSEFOCUS | SDL_APPINPUTFOCUS)) { if (event.active.gain) { m_focus = 1; if (opt_fs) mouse_cursor(0); } else if (event.active.state & SDL_APPMOUSEFOCUS) { m_focus = 0; if (opt_fs) mouse_cursor(1); /* is it hack?*/ } } #if SDL_VERSION_ATLEAST(1,3,0) if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_ACTIVEEVENT, SDL_ACTIVEEVENT) > 0) #else if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_EVENTMASK(SDL_ACTIVEEVENT)) > 0) #endif return AGAIN; /* to avoid flickering */ return 0; #endif case SDL_USEREVENT: { void (*p) (void*) = (void (*)(void*))event.user.data1; if (!p) /* idle cycles */ return 0; p(event.user.data2); return AGAIN; } case SDL_QUIT: game_running = 0; return -1; case SDL_KEYDOWN: /* A key has been pressed */ #if SDL_VERSION_ATLEAST(2,0,0) if (event.key.repeat) { if (DIRECT_MODE && !game_paused()) /* do not send key repeats */ return AGAIN; if (gfx_ticks() - last_press_ms < INPUT_REP_DELAY_MS) return AGAIN; if ((gfx_ticks() - last_repeat_ms) < INPUT_REP_INTERVAL_MS) return AGAIN; last_repeat_ms = gfx_ticks(); } else { last_press_ms = gfx_ticks(); last_repeat_ms = gfx_ticks(); } #endif inp->type = KEY_DOWN; inp->code = event.key.keysym.scancode; #if SDL_VERSION_ATLEAST(1,3,0) strncpy(inp->sym, SDL_GetScancodeName(inp->code), sizeof(inp->sym)); #else strncpy(inp->sym, SDL_GetKeyName(event.key.keysym.sym), sizeof(inp->sym)); #endif inp->sym[sizeof(inp->sym) - 1] = 0; tolow(inp->sym); #if SDL_VERSION_ATLEAST(1,3,0) key_compat(inp); #endif #if SDL_VERSION_ATLEAST(1,3,0) /* strange bug in some SDL2 env, with up/down events storm */ if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_KEYDOWN, SDL_KEYUP) > 0) { if (peek.key.keysym.scancode == event.key.keysym.scancode && peek.key.repeat == 0) return AGAIN; } #endif break; case SDL_KEYUP: inp->type = KEY_UP; inp->code = event.key.keysym.scancode; #if SDL_VERSION_ATLEAST(1,3,0) strncpy(inp->sym, SDL_GetScancodeName(inp->code), sizeof(inp->sym)); #else strncpy(inp->sym, SDL_GetKeyName(event.key.keysym.sym), sizeof(inp->sym)); #endif inp->sym[sizeof(inp->sym) - 1] = 0; tolow(inp->sym); #if SDL_VERSION_ATLEAST(1,3,0) key_compat(inp); #endif #if SDL_VERSION_ATLEAST(1,3,0) /* strange bug in some SDL2 env, with up/down events storm */ if (SDL_PeepEvents(&peek, 1, SDL_PEEKEVENT, SDL_KEYDOWN, SDL_KEYUP) > 0) { if (event.key.keysym.scancode == peek.key.keysym.scancode && peek.key.repeat == 0) return AGAIN; } #endif break; case SDL_MOUSEMOTION: m_focus = 1; /* ahhh */ if (DIRECT_MODE && !game_paused()) return AGAIN; inp->type = MOUSE_MOTION; inp->x = event.button.x; inp->y = event.button.y; #if SDL_VERSION_ATLEAST(1,3,0) while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION) > 0) { #else while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEMOTION)) > 0) { #endif inp->x = peek.button.x; inp->y = peek.button.y; } break; case SDL_MOUSEBUTTONUP: inp->type = MOUSE_UP; inp->x = event.button.x; inp->y = event.button.y; inp->code = event.button.button; if (event.button.button == 4) inp->type = 0; else if (event.button.button == 5) inp->type = 0; break; #if SDL_VERSION_ATLEAST(2,0,0) case SDL_MOUSEWHEEL: if (DIRECT_MODE && !game_paused()) return AGAIN; inp->type = (event.wheel.y > 0) ? MOUSE_WHEEL_UP : MOUSE_WHEEL_DOWN; while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEWHEEL, SDL_MOUSEWHEEL) > 0) { if (!((event.wheel.y > 0 && inp->type == MOUSE_WHEEL_UP) || (event.wheel.y < 0 && inp->type == MOUSE_WHEEL_DOWN))) break; inp->count ++; } break; #endif case SDL_MOUSEBUTTONDOWN: m_focus = 1; /* ahhh */ inp->type = MOUSE_DOWN; inp->x = event.button.x; inp->y = event.button.y; inp->code = event.button.button; if (event.button.button == 4) inp->type = MOUSE_WHEEL_UP; else if (event.button.button == 5) inp->type = MOUSE_WHEEL_DOWN; #if SDL_VERSION_ATLEAST(1,3,0) while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN) > 0) { #else while (SDL_PeepEvents(&peek, 1, SDL_GETEVENT, SDL_EVENTMASK (SDL_MOUSEBUTTONDOWN)) > 0) { #endif if (!((event.button.button == 4 && inp->type == MOUSE_WHEEL_UP) || (event.button.button == 5 && inp->type == MOUSE_WHEEL_DOWN))) break; inp->count ++; } break; default: break; } return 1; } instead-3.2.1/src/zlib/0000755000175000017500000000000013267071774013731 5ustar peterpeterinstead-3.2.1/src/zlib/inffast.c0000644000175000017500000003112613267071774015532 0ustar peterpeter/* inffast.c -- fast decoding * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifndef ASMINF /* Allow machine dependent optimization for post-increment or pre-increment. Based on testing to date, Pre-increment preferred for: - PowerPC G3 (Adler) - MIPS R5000 (Randers-Pehrson) Post-increment preferred for: - none No measurable difference: - Pentium III (Anderson) - M68060 (Nikl) */ #ifdef POSTINC # define OFF 0 # define PUP(a) *(a)++ #else # define OFF 1 # define PUP(a) *++(a) #endif /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; unsigned char FAR *in; /* local strm->next_in */ unsigned char FAR *last; /* while in < last, enough input available */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ #ifdef INFLATE_STRICT unsigned dmax; /* maximum distance from zlib header */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code this; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in - OFF; last = in + (strm->avail_in - 5); out = strm->next_out - OFF; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT dmax = state->dmax; #endif wsize = state->wsize; whave = state->whave; write = state->write; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = lcode[hold & lmask]; dolen: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op == 0) { /* literal */ Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); PUP(out) = (unsigned char)(this.val); } else if (op & 16) { /* length base */ len = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = dcode[hold & dmask]; dodist: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op & 16) { /* distance base */ dist = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); #ifdef INFLATE_STRICT if (dist > dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } from = window - OFF; if (write == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } else if (write < op) { /* wrap around window */ from += wsize + write - op; op -= write; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; if (write < len) { /* some from start of window */ op = write; len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += write - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } while (len > 2); if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } } else if ((op & 64) == 0) { /* 2nd level distance code */ this = dcode[this.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ this = lcode[this.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in + OFF; strm->next_out = out + OFF; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and write == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ instead-3.2.1/src/zlib/trees.c0000644000175000017500000013027613267071774015230 0ustar peterpeter/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2005 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $Id$ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ #define Buf_size (8 * 2*sizeof(char)) /* Number of bits used within bi_buf. (bi_buf might be implemented on * more than 16 bits on some systems.) */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); local void set_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (value << s->bi_valid); put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (val << s->bi_valid);\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void _tr_stored_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. * The current inflate code requires 9 bits of lookahead. If the * last two codes for the previous block (real code plus EOB) were coded * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode * the last real code. In this case we send two empty static blocks instead * of one. (There are no problems if the previous block is stored or fixed.) * To simplify the code, we assume the worst case of last real code encoded * on one bit only. */ void _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); /* Of the 10 bits for the empty block, we have already sent * (10 - bi_valid) bits. The lookahead for the last real code (before * the EOB of the previous block) was thus at least one plus the length * of the EOB plus what we have just sent of the empty static block. */ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; #endif bi_flush(s); } s->last_eob_len = 7; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void _tr_flush_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is binary or text */ if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) set_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, eof); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+eof, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+eof, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (eof) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*eof)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; ct_data *ltree; /* literal tree */ ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== * Set the data type to BINARY or TEXT, using a crude approximation: * set it to Z_TEXT if all symbols are either printable characters (33 to 255) * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. * IN assertion: the fields Freq of dyn_ltree are set. */ local void set_data_type(s) deflate_state *s; { int n; for (n = 0; n < 9; n++) if (s->dyn_ltree[n].Freq != 0) break; if (n == 9) for (n = 14; n < 32; n++) if (s->dyn_ltree[n].Freq != 0) break; s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block(s, buf, len, header) deflate_state *s; charf *buf; /* the input data */ unsigned len; /* its length */ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } instead-3.2.1/src/zlib/inffast.h0000644000175000017500000000064213267071774015536 0ustar peterpeter/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ void inflate_fast OF((z_streamp strm, unsigned start)); instead-3.2.1/src/zlib/trees.h0000644000175000017500000002057413267071774015234 0ustar peterpeter/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; instead-3.2.1/src/zlib/deflate.h0000644000175000017500000003023513267071774015511 0ustar peterpeter/* deflate.h -- internal compression state * Copyright (C) 1995-2004 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define INIT_STATE 42 #define EXTRA_STATE 69 #define NAME_STATE 73 #define COMMENT_STATE 91 #define HCRC_STATE 103 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ uInt pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ uInt gzindex; /* where in extra, name, or comment */ Byte method; /* STORED (for zip only) or DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to supress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ int last_eob_len; /* bit length of EOB code for last block */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ /* in trees.c */ void _tr_init OF((deflate_state *s)); int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); void _tr_align OF((deflate_state *s)); void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch _length_code[]; extern uch _dist_code[]; #else extern const uch _length_code[]; extern const uch _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ instead-3.2.1/src/zlib/deflate.c0000644000175000017500000020055313267071774015506 0ustar peterpeter/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://www.ietf.org/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id$ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #endif local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->gzhead = Z_NULL; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->wrap == 2 || (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) return Z_STREAM_ERROR; s = strm->state; if (s->wrap) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > MAX_DIST(s)) { length = MAX_DIST(s); dictionary += dictLength - length; /* use the tail of the dictionary */ } zmemcpy(s->window, dictionary, length); s->strstart = length; s->block_start = (long)length; /* Insert all strings in the hash table (except for the last two bytes). * s->lookahead stays null, so s->ins_h will be recomputed at the next * call of fill_window. */ s->ins_h = s->window[0]; UPDATE_HASH(s, s->ins_h, s->window[1]); for (n = 0; n <= length - MIN_MATCH; n++) { INSERT_STRING(s, n, hash_head); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; if (strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; strm->state->bi_valid = bits; strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if (func != configuration_table[level].func && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_PARTIAL_FLUSH); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= */ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) z_streamp strm; int good_length; int max_lazy; int nice_length; int max_chain; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; s->good_match = good_length; s->max_lazy_match = max_lazy; s->nice_match = nice_length; s->max_chain_length = max_chain; return Z_OK; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds * for every combination of windowBits and memLevel, as well as wrap. * But even the conservative upper bound of about 14% expansion does not * seem onerous for output buffer allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; uLong destLen; /* conservative upper bound */ destLen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; /* if can't get parameters, return conservative bound */ if (strm == Z_NULL || strm->state == Z_NULL) return destLen; /* if not default parameters, return conservative bound */ s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) return destLen; /* default settings: return tight bound for that case */ return compressBound(sourceLen); } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->pending_out += len; strm->total_out += len; strm->avail_out -= len; strm->state->pending -= len; if (strm->state->pending == 0) { strm->state->pending_out = strm->state->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_FINISH || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { strm->adler = crc32(0L, Z_NULL, 0); put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); if (s->gzhead == NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, OS_CODE); s->status = BUSY_STATE; } else { put_byte(s, (s->gzhead->text ? 1 : 0) + (s->gzhead->hcrc ? 2 : 0) + (s->gzhead->extra == Z_NULL ? 0 : 4) + (s->gzhead->name == Z_NULL ? 0 : 8) + (s->gzhead->comment == Z_NULL ? 0 : 16) ); put_byte(s, (Byte)(s->gzhead->time & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); if (s->gzhead->extra != NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } if (s->gzhead->hcrc) strm->adler = crc32(strm->adler, s->pending_buf, s->pending); s->gzindex = 0; s->status = EXTRA_STATE; } } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } #ifdef GZIP if (s->status == EXTRA_STATE) { if (s->gzhead->extra != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) break; } put_byte(s, s->gzhead->extra[s->gzindex]); s->gzindex++; } if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (s->gzindex == s->gzhead->extra_len) { s->gzindex = 0; s->status = NAME_STATE; } } else s->status = NAME_STATE; } if (s->status == NAME_STATE) { if (s->gzhead->name != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->name[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) { s->gzindex = 0; s->status = COMMENT_STATE; } } else s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { if (s->gzhead->comment != NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; do { if (s->pending == s->pending_buf_size) { if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); flush_pending(strm); beg = s->pending; if (s->pending == s->pending_buf_size) { val = 1; break; } } val = s->gzhead->comment[s->gzindex++]; put_byte(s, val); } while (val != 0); if (s->gzhead->hcrc && s->pending > beg) strm->adler = crc32(strm->adler, s->pending_buf + beg, s->pending - beg); if (val == 0) s->status = HCRC_STATE; } else s->status = HCRC_STATE; } if (s->status == HCRC_STATE) { if (s->gzhead->hcrc) { if (s->pending + 2 > s->pending_buf_size) flush_pending(strm); if (s->pending + 2 <= s->pending_buf_size) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); strm->adler = crc32(0L, Z_NULL, 0); s->status = BUSY_STATE; } } else s->status = BUSY_STATE; } #endif /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && flush <= old_flush && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != EXTRA_STATE && status != NAME_STATE && status != COMMENT_STATE && status != HCRC_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; zmemcpy(dest, source, sizeof(z_stream)); ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; zmemcpy(ds, ss, sizeof(deflate_state)); ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, strm->next_in, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, strm->next_in, len); } #endif zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifndef FASTEST #ifdef ASMV match_init(); /* initialize the asm code */ #endif #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2. Note that the checks below * for insufficient lookahead only occur occasionally for performance * reasons. Therefore uninitialized memory will be accessed, and * conditional jumps will be made that depend on those values. * However the length of the match is limited to the lookahead, so * the output of deflate is not affected by the uninitialized values. */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #endif /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for level == 1 or strategy == Z_RLE only */ local uInt longest_match_fast(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ /* %%% avoid this when Z_RLE */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead >= MIN_MATCH) { s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, eof) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (eof)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, eof) { \ FLUSH_BLOCK_ONLY(s, eof); \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ #ifdef FASTEST if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { s->match_length = longest_match_fast (s, hash_head); } #else if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } #endif /* longest_match() or longest_match_fast() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } /* longest_match() or longest_match_fast() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif /* FASTEST */ #if 0 /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { int bflush; /* set if current block must be flushed */ uInt run; /* length of run */ uInt max; /* maximum length of run */ uInt prev; /* byte at distance one to match */ Bytef *scan; /* scan for end of run */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the longest encodable run. */ if (s->lookahead < MAX_MATCH) { fill_window(s); if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* See how many times the previous byte repeats */ run = 0; if (s->strstart > 0) { /* if there is a previous byte, that is */ max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; scan = s->window + s->strstart - 1; prev = *scan++; do { if (*scan++ != prev) break; } while (++run < max); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ if (run >= MIN_MATCH) { check_match(s, s->strstart, s->strstart - 1, run); _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); s->lookahead -= run; s->strstart += run; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif instead-3.2.1/src/zlib/example.c0000644000175000017500000004110313267071774015527 0ustar peterpeter/* example.c -- usage example of the zlib compression library * Copyright (C) 1995-2004 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include #include "zlib.h" #ifdef STDC # include # include #endif #if defined(VMS) || defined(RISCOS) # define TESTFILE "foo-gz" #else # define TESTFILE "foo.gz" #endif #define CHECK_ERR(err, msg) { \ if (err != Z_OK) { \ fprintf(stderr, "%s error: %d\n", msg, err); \ exit(1); \ } \ } const char hello[] = "hello, hello!"; /* "hello world" would be more standard, but the repeated "hello" * stresses the compression code better, sorry... */ const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ void test_compress OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_gzio OF((const char *fname, Byte *uncompr, uLong uncomprLen)); void test_deflate OF((Byte *compr, uLong comprLen)); void test_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_large_deflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_large_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_flush OF((Byte *compr, uLong *comprLen)); void test_sync OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_dict_deflate OF((Byte *compr, uLong comprLen)); void test_dict_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); int main OF((int argc, char *argv[])); /* =========================================================================== * Test compress() and uncompress() */ void test_compress(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; uLong len = (uLong)strlen(hello)+1; err = compress(compr, &comprLen, (const Bytef*)hello, len); CHECK_ERR(err, "compress"); strcpy((char*)uncompr, "garbage"); err = uncompress(uncompr, &uncomprLen, compr, comprLen); CHECK_ERR(err, "uncompress"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad uncompress\n"); exit(1); } else { printf("uncompress(): %s\n", (char *)uncompr); } } /* =========================================================================== * Test read/write of .gz files */ void test_gzio(fname, uncompr, uncomprLen) const char *fname; /* compressed file name */ Byte *uncompr; uLong uncomprLen; { #ifdef NO_GZCOMPRESS fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); #else int err; int len = (int)strlen(hello)+1; gzFile file; z_off_t pos; file = gzopen(fname, "wb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } gzputc(file, 'h'); if (gzputs(file, "ello") != 4) { fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); exit(1); } if (gzprintf(file, ", %s!", "hello") != 8) { fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); exit(1); } gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ gzclose(file); file = gzopen(fname, "rb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } strcpy((char*)uncompr, "garbage"); if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); exit(1); } if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); exit(1); } else { printf("gzread(): %s\n", (char*)uncompr); } pos = gzseek(file, -8L, SEEK_CUR); if (pos != 6 || gztell(file) != pos) { fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", (long)pos, (long)gztell(file)); exit(1); } if (gzgetc(file) != ' ') { fprintf(stderr, "gzgetc error\n"); exit(1); } if (gzungetc(' ', file) != ' ') { fprintf(stderr, "gzungetc error\n"); exit(1); } gzgets(file, (char*)uncompr, (int)uncomprLen); if (strlen((char*)uncompr) != 7) { /* " hello!" */ fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); exit(1); } if (strcmp((char*)uncompr, hello + 6)) { fprintf(stderr, "bad gzgets after gzseek\n"); exit(1); } else { printf("gzgets() after gzseek: %s\n", (char*)uncompr); } gzclose(file); #endif } /* =========================================================================== * Test deflate() with small buffers */ void test_deflate(compr, comprLen) Byte *compr; uLong comprLen; { z_stream c_stream; /* compression stream */ int err; uLong len = (uLong)strlen(hello)+1; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); c_stream.next_in = (Bytef*)hello; c_stream.next_out = compr; while (c_stream.total_in != len && c_stream.total_out < comprLen) { c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); } /* Finish the stream, still forcing small buffers: */ for (;;) { c_stream.avail_out = 1; err = deflate(&c_stream, Z_FINISH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "deflate"); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with small buffers */ void test_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = 0; d_stream.next_out = uncompr; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "inflate"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad inflate\n"); exit(1); } else { printf("inflate(): %s\n", (char *)uncompr); } } /* =========================================================================== * Test deflate() with large buffers and dynamic change of compression level */ void test_large_deflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { z_stream c_stream; /* compression stream */ int err; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_SPEED); CHECK_ERR(err, "deflateInit"); c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; /* At this point, uncompr is still mostly zeroes, so it should compress * very well: */ c_stream.next_in = uncompr; c_stream.avail_in = (uInt)uncomprLen; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); if (c_stream.avail_in != 0) { fprintf(stderr, "deflate not greedy\n"); exit(1); } /* Feed in already compressed data and switch to no compression: */ deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); c_stream.next_in = compr; c_stream.avail_in = (uInt)comprLen/2; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); /* Switch back to compressing mode: */ deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); c_stream.next_in = uncompr; c_stream.avail_in = (uInt)uncomprLen; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { fprintf(stderr, "deflate should report Z_STREAM_END\n"); exit(1); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with large buffers */ void test_large_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = (uInt)comprLen; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); for (;;) { d_stream.next_out = uncompr; /* discard the output */ d_stream.avail_out = (uInt)uncomprLen; err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "large inflate"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (d_stream.total_out != 2*uncomprLen + comprLen/2) { fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); exit(1); } else { printf("large_inflate(): OK\n"); } } /* =========================================================================== * Test deflate() with full flush */ void test_flush(compr, comprLen) Byte *compr; uLong *comprLen; { z_stream c_stream; /* compression stream */ int err; uInt len = (uInt)strlen(hello)+1; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); c_stream.next_in = (Bytef*)hello; c_stream.next_out = compr; c_stream.avail_in = 3; c_stream.avail_out = (uInt)*comprLen; err = deflate(&c_stream, Z_FULL_FLUSH); CHECK_ERR(err, "deflate"); compr[3]++; /* force an error in first compressed block */ c_stream.avail_in = len - 3; err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { CHECK_ERR(err, "deflate"); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); *comprLen = c_stream.total_out; } /* =========================================================================== * Test inflateSync() */ void test_sync(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = 2; /* just read the zlib header */ err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); d_stream.next_out = uncompr; d_stream.avail_out = (uInt)uncomprLen; inflate(&d_stream, Z_NO_FLUSH); CHECK_ERR(err, "inflate"); d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ err = inflateSync(&d_stream); /* but skip the damaged part */ CHECK_ERR(err, "inflateSync"); err = inflate(&d_stream, Z_FINISH); if (err != Z_DATA_ERROR) { fprintf(stderr, "inflate should report DATA_ERROR\n"); /* Because of incorrect adler32 */ exit(1); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); printf("after inflateSync(): hel%s\n", (char *)uncompr); } /* =========================================================================== * Test deflate() with preset dictionary */ void test_dict_deflate(compr, comprLen) Byte *compr; uLong comprLen; { z_stream c_stream; /* compression stream */ int err; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_COMPRESSION); CHECK_ERR(err, "deflateInit"); err = deflateSetDictionary(&c_stream, (const Bytef*)dictionary, sizeof(dictionary)); CHECK_ERR(err, "deflateSetDictionary"); dictId = c_stream.adler; c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; c_stream.next_in = (Bytef*)hello; c_stream.avail_in = (uInt)strlen(hello)+1; err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { fprintf(stderr, "deflate should report Z_STREAM_END\n"); exit(1); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with a preset dictionary */ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = (uInt)comprLen; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); d_stream.next_out = uncompr; d_stream.avail_out = (uInt)uncomprLen; for (;;) { err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; if (err == Z_NEED_DICT) { if (d_stream.adler != dictId) { fprintf(stderr, "unexpected dictionary"); exit(1); } err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, sizeof(dictionary)); } CHECK_ERR(err, "inflate with dict"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad inflate with dict\n"); exit(1); } else { printf("inflate with dictionary: %s\n", (char *)uncompr); } } /* =========================================================================== * Usage: example [output.gz [input.gz]] */ int main(argc, argv) int argc; char *argv[]; { Byte *compr, *uncompr; uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ uLong uncomprLen = comprLen; static const char* myVersion = ZLIB_VERSION; if (zlibVersion()[0] != myVersion[0]) { fprintf(stderr, "incompatible zlib version\n"); exit(1); } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { fprintf(stderr, "warning: different zlib version\n"); } printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); compr = (Byte*)calloc((uInt)comprLen, 1); uncompr = (Byte*)calloc((uInt)uncomprLen, 1); /* compr and uncompr are cleared to avoid reading uninitialized * data and to ensure that uncompr compresses well. */ if (compr == Z_NULL || uncompr == Z_NULL) { printf("out of memory\n"); exit(1); } test_compress(compr, comprLen, uncompr, uncomprLen); test_gzio((argc > 1 ? argv[1] : TESTFILE), uncompr, uncomprLen); test_deflate(compr, comprLen); test_inflate(compr, comprLen, uncompr, uncomprLen); test_large_deflate(compr, comprLen, uncompr, uncomprLen); test_large_inflate(compr, comprLen, uncompr, uncomprLen); test_flush(compr, &comprLen); test_sync(compr, comprLen, uncompr, uncomprLen); comprLen = uncomprLen; test_dict_deflate(compr, comprLen); test_dict_inflate(compr, comprLen, uncompr, uncomprLen); free(compr); free(uncompr); return 0; } instead-3.2.1/src/zlib/inftrees.h0000644000175000017500000000457413267071774015733 0ustar peterpeter/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of dynamic tree. The maximum found in a long but non- exhaustive search was 1444 code structures (852 for length/literals and 592 for distances, the latter actually the result of an exhaustive search). The true maximum is not known, but the value below is more than safe. */ #define ENOUGH 2048 #define MAXD 592 /* Type of code to build for inftable() */ typedef enum { CODES, LENS, DISTS } codetype; extern int inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); instead-3.2.1/src/zlib/compress.c0000644000175000017500000000501013267071774015724 0ustar peterpeter/* compress.c -- compress a memory buffer * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; } instead-3.2.1/src/zlib/crc32.h0000644000175000017500000007444113267071774015030 0ustar peterpeter/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const unsigned long FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; instead-3.2.1/src/zlib/inflate.c0000644000175000017500000014225113267071774015524 0ustar peterpeter/* inflate.c -- zlib decompression * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common write == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, unsigned out)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); int ZEXPORT inflateReset(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; strm->adler = 1; /* to support ill-conceived Java test suite */ state->mode = HEAD; state->last = 0; state->havedict = 0; state->dmax = 32768U; state->head = Z_NULL; state->wsize = 0; state->whave = 0; state->write = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflatePrime(strm, bits, value) z_streamp strm; int bits; int value; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; state->hold += value << state->bits; state->bits += bits; return Z_OK; } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) z_streamp strm; int windowBits; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; if (windowBits < 0) { state->wrap = 0; windowBits = -windowBits; } else { state->wrap = (windowBits >> 4) + 1; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } if (windowBits < 8 || windowBits > 15) { ZFREE(strm, state); strm->state = Z_NULL; return Z_STREAM_ERROR; } state->wbits = (unsigned)windowBits; state->window = Z_NULL; return inflateReset(strm); } int ZEXPORT inflateInit_(strm, version, stream_size) z_streamp strm; const char *version; int stream_size; { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(strm, out) z_streamp strm; unsigned out; { struct inflate_state FAR *state; unsigned copy, dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->write = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); state->write = 0; state->whave = state->wsize; } else { dist = state->wsize - state->write; if (dist > copy) dist = copy; zmemcpy(state->window + state->write, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); state->write = copy; state->whave = state->wsize; } else { state->write += dist; if (state->write == state->wsize) state->write = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Reverse the bytes in a 32-bit value */ #define REVERSE(q) \ ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(strm, flush) z_streamp strm; int flush; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); len = BITS(4) + 8; if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } state->dmax = 1U << len; Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; if (state->flags & 0x0200) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->head != Z_NULL) { state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && state->head->extra != Z_NULL) { len = state->head->extra_len - state->length; zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->length = 0; state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) state->head->name[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) state->head->comment[state->length++] = len; } while (len && copy < have); if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if (hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } if (state->head != Z_NULL) { state->head->hcrc = (int)((state->flags >> 9) & 1); state->head->done = 1; } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = REVERSE(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.val < 16) { NEEDBITS(this.bits); DROPBITS(this.bits); state->lens[state->have++] = this.val; } else { if (this.val == 16) { NEEDBITS(this.bits + 2); DROPBITS(this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (this.val == 17) { NEEDBITS(this.bits + 3); DROPBITS(this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(this.bits + 7); DROPBITS(this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); break; } for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.op && (this.op & 0xf0) == 0) { last = this; for (;;) { this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); state->length = (unsigned)this.val; if ((int)(this.op) == 0) { Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); state->mode = LIT; break; } if (this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } if (this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(this.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); state->mode = DIST; case DIST: for (;;) { this = state->distcode[BITS(state->distbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if ((this.op & 0xf0) == 0) { last = this; for (;;) { this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); if (this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)this.val; state->extra = (unsigned)(this.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } #endif if (state->offset > state->whave + out - left) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->write) { copy -= state->write; from = state->window + (state->wsize - copy); } else from = state->window + (state->write - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if (out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if (( #ifdef GUNZIP state->flags ? hold : #endif REVERSE(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if (state->wrap && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; unsigned long id; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary id */ if (state->mode == DICT) { id = adler32(0L, Z_NULL, 0); id = adler32(id, dictionary, dictLength); if (id != state->check) return Z_DATA_ERROR; } /* copy dictionary to window */ if (updatewindow(strm, strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } if (dictLength > state->wsize) { zmemcpy(state->window, dictionary + dictLength - state->wsize, state->wsize); state->whave = state->wsize; } else { zmemcpy(state->window + state->wsize - dictLength, dictionary, dictLength); state->whave = dictLength; } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; } int ZEXPORT inflateGetHeader(strm, head) z_streamp strm; gz_headerp head; { struct inflate_state FAR *state; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; /* save header structure */ state->head = head; head->done = 0; return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; unsigned char FAR *buf; unsigned len; { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(dest, source) z_streamp dest; z_streamp source; { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; unsigned wsize; /* check input */ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ zmemcpy(dest, source, sizeof(z_stream)); zmemcpy(copy, state, sizeof(struct inflate_state)); if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); } copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) { wsize = 1U << state->wbits; zmemcpy(window, state->window, wsize); } copy->window = window; dest->state = (struct internal_state FAR *)copy; return Z_OK; } instead-3.2.1/src/zlib/uncompr.c0000644000175000017500000000414413267071774015563 0ustar peterpeter/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted. */ int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit(&stream); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } instead-3.2.1/src/zlib/inffixed.h0000644000175000017500000001444513267071774015706 0ustar peterpeter /* inffixed.h -- table for decoding fixed codes * Generated automatically by makefixed(). */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; instead-3.2.1/src/zlib/zlib.h0000644000175000017500000020373113267071774015050 0ustar peterpeter/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.3, July 18th, 2005 Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.3" #define ZLIB_VERNUM 0x1230 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. This library can optionally read and write gzip streams in memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; typedef gz_header FAR *gz_headerp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_FIXED 4 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumualte before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it gets to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early because Z_BLOCK is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() will decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically. Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler decoder for special applications. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. In addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain)); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for searching for the best matching string, and even then only by the most fanatic optimizer trying to squeeze out the last compressed bit for their specific input data. Read the deflate.c source code for the meaning of the max_lazy, good_length, nice_length, and max_chain parameters. deflateTune() can be called after deflateInit() or deflateInit2(), and returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(). This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information in the provided gz_header structure are written to the gzip header (xflag is ignored -- the extra flags are set according to the compression level). The caller must assure that, if not Z_NULL, name and comment are terminated with a zero byte, and that if extra is not Z_NULL, that extra_len bytes are available there. If hcrc is true, a gzip header crc is included. Note that the current versions of the command-line version of gzip (up through version 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called immediately after inflateInit2() or inflateReset() and before any call of inflate() to set the dictionary. The application must insure that the dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int bits, int value)); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the middle of a byte. The provided bits will be used before any bytes are used from next_in. This function should only be used with raw inflate, and should be used before the first inflate() call after inflateInit2() or inflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the input. inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be no gzip header information forthcoming. Note that Z_BLOCK can be used to force inflate() to return immediately after header processing is complete and before any actual data is decompressed. The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, terminated with a zero unless the length is greater than comm_max. When any of extra, name, or comment are not Z_NULL and the respective field is not present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the paramaters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). The number of uncompressed bytes written is limited to 4095. The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read again later. Only one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if a character has been pushed but not read yet, or if c is -1. The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* Returns 1 if file is being read directly without decompression, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); /* Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is NULL, this function returns the required initial value for the for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and len2. */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ instead-3.2.1/src/zlib/zconf.h0000644000175000017500000002322413267071774015224 0ustar peterpeter/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define deflatePrime z_deflatePrime # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define zError z_zError # define alloc_func z_alloc_func # define free_func z_free_func # define in_func z_in_func # define out_func z_out_func # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ instead-3.2.1/src/zlib/zutil.c0000644000175000017500000001643613267071774015256 0ustar peterpeter/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch (sizeof(uInt)) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch (sizeof(uLong)) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch (sizeof(voidpf)) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch (sizeof(z_off_t)) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1L << 16; #endif #ifdef NO_GZIP flags += 1L << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1L << 20; #endif #ifdef FASTEST flags += 1L << 21; #endif #ifdef STDC # ifdef NO_vsnprintf flags += 1L << 25; # ifdef HAS_vsprintf_void flags += 1L << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1L << 26; # endif # endif #else flags += 1L << 24; # ifdef NO_snprintf flags += 1L << 25; # ifdef HAS_sprintf_void flags += 1L << 26; # endif # else # ifdef HAS_snprintf_void flags += 1L << 26; # endif # endif #endif return flags; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int z_verbose = verbose; void z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ int errno = 0; #endif #ifndef HAVE_MEMCPY void zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { if (opaque) items += size - size; /* make compiler happy */ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ instead-3.2.1/src/zlib/Makefile0000644000175000017500000000050313267071774015367 0ustar peterpeterinclude ../../Rules.make include ../../config.make OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ zutil.o inflate.o infback.o inftrees.o inffast.o all: libz.a libz.a: $(OBJS) $(OBJA) $(AR) $@ $(OBJS) $(OBJA) -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 clean: rm -f *.o *.a install: instead-3.2.1/src/zlib/zconf.in.h0000644000175000017500000002322413267071774015631 0ustar peterpeter/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define deflatePrime z_deflatePrime # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define zError z_zError # define alloc_func z_alloc_func # define free_func z_free_func # define in_func z_in_func # define out_func z_out_func # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ instead-3.2.1/src/zlib/infback.c0000644000175000017500000005440313267071774015500 0ustar peterpeter/* infback.c -- inflate using a call-back interface * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* This code is largely copied from inflate.c. Normally either infback.o or inflate.o would be linked into an application--not both. The interface with inffast.c is retained so that optimized assembler-coded versions of inflate_fast() can be used with either inflate.c or infback.c. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) z_streamp strm; int windowBits; unsigned char FAR *window; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL || window == Z_NULL || windowBits < 8 || windowBits > 15) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->dmax = 32768U; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; state->write = 0; state->whave = 0; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } /* Macros for inflateBack(): */ /* Load returned state from inflate_fast() */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Set state from registers for inflate_fast() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Assure that some input is available. If input is requested, but denied, then return a Z_BUF_ERROR from inflateBack(). */ #define PULL() \ do { \ if (have == 0) { \ have = in(in_desc, &next); \ if (have == 0) { \ next = Z_NULL; \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflateBack() with an error if there is no input available. */ #define PULLBYTE() \ do { \ PULL(); \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflateBack() with an error. */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Assure that some output space is available, by writing out the window if it's full. If the write fails, return from inflateBack() with a Z_BUF_ERROR. */ #define ROOM() \ do { \ if (left == 0) { \ put = state->window; \ left = state->wsize; \ state->whave = left; \ if (out(out_desc, put, left)) { \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* strm provides the memory allocation functions and window buffer on input, and provides information on the unused input on return. For Z_DATA_ERROR returns, strm will also provide an error message. in() and out() are the call-back input and output functions. When inflateBack() needs more input, it calls in(). When inflateBack() has filled the window with output, or when it completes with data in the window, it calls out() to write out the data. The application must not change the provided input until in() is called again or inflateBack() returns. The application must not change the window/output buffer until inflateBack() returns. in() and out() are called with a descriptor parameter provided in the inflateBack() call. This parameter can be a structure that provides the information required to do the read or write, as well as accumulated information on the input and output such as totals and check values. in() should return zero on failure. out() should return non-zero on failure. If either in() or out() fails, than inflateBack() returns a Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it was in() or out() that caused in the error. Otherwise, inflateBack() returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format error, or Z_MEM_ERROR if it could not allocate memory for the state. inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) z_streamp strm; in_func in; void FAR *in_desc; out_func out; void FAR *out_desc; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Check that the strm exists and that the state was initialized */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* Reset the state */ strm->msg = Z_NULL; state->mode = TYPE; state->last = 0; state->whave = 0; next = strm->next_in; have = next != Z_NULL ? strm->avail_in : 0; hold = 0; bits = 0; put = state->window; left = state->wsize; /* Inflate until end of block marked as last */ for (;;) switch (state->mode) { case TYPE: /* determine and dispatch block type */ if (state->last) { BYTEBITS(); state->mode = DONE; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: /* get and verify stored block length */ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); /* copy stored block from input to output */ while (state->length != 0) { copy = state->length; PULL(); ROOM(); if (copy > have) copy = have; if (copy > left) copy = left; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: /* get dynamic table entries descriptor */ NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); /* get code length code lengths (not a typo) */ state->have = 0; while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); /* get length and distance code code lengths */ state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.val < 16) { NEEDBITS(this.bits); DROPBITS(this.bits); state->lens[state->have++] = this.val; } else { if (this.val == 16) { NEEDBITS(this.bits + 2); DROPBITS(this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = (unsigned)(state->lens[state->have - 1]); copy = 3 + BITS(2); DROPBITS(2); } else if (this.val == 17) { NEEDBITS(this.bits + 3); DROPBITS(this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(this.bits + 7); DROPBITS(this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* handle error breaks in while */ if (state->mode == BAD) break; /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: /* use inflate_fast() if we have enough input and output */ if (have >= 6 && left >= 258) { RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; inflate_fast(strm, state->wsize); LOAD(); break; } /* get a literal, length, or end-of-block code */ for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.op && (this.op & 0xf0) == 0) { last = this; for (;;) { this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); state->length = (unsigned)this.val; /* process literal */ if (this.op == 0) { Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; } /* process end of block */ if (this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ if (this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ state->extra = (unsigned)(this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); /* get distance code */ for (;;) { this = state->distcode[BITS(state->distbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if ((this.op & 0xf0) == 0) { last = this; for (;;) { this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); if (this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)this.val; /* get distance extra bits, if any */ state->extra = (unsigned)(this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); /* copy match from window to output */ do { ROOM(); copy = state->wsize - state->offset; if (copy < left) { from = put + copy; copy = left - copy; } else { from = put - state->offset; copy = left; } if (copy > state->length) copy = state->length; state->length -= copy; left -= copy; do { *put++ = *from++; } while (--copy); } while (state->length != 0); break; case DONE: /* inflate stream terminated properly -- write leftover output */ ret = Z_STREAM_END; if (left < state->wsize) { if (out(out_desc, state->window, state->wsize - left)) ret = Z_BUF_ERROR; } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; default: /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } /* Return unused input */ inf_leave: strm->next_in = next; strm->avail_in = have; return ret; } int ZEXPORT inflateBackEnd(strm) z_streamp strm; { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } instead-3.2.1/src/zlib/minigzip.c0000644000175000017500000002022413267071774015723 0ustar peterpeter/* minigzip.c -- simulate gzip using the zlib compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * minigzip is a minimal implementation of the gzip utility. This is * only an example of using zlib and isn't meant to replace the * full-featured gzip. No attempt is made to deal with file systems * limiting names to 14 or 8+3 characters, etc... Error checking is * very limited. So use minigzip only for testing; use gzip for the * real thing. On MSDOS, use only on file names without extension * or in pipe mode. */ /* @(#) $Id$ */ #include #include "zlib.h" #ifdef STDC # include # include #endif #ifdef USE_MMAP # include # include # include #endif #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) # include # include # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) #else # define SET_BINARY_MODE(file) #endif #ifdef VMS # define unlink delete # define GZ_SUFFIX "-gz" #endif #ifdef RISCOS # define unlink remove # define GZ_SUFFIX "-gz" # define fileno(file) file->__file #endif #if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fileno */ #endif #ifndef WIN32 /* unlink already in stdio.h for WIN32 */ extern int unlink OF((const char *)); #endif #ifndef GZ_SUFFIX # define GZ_SUFFIX ".gz" #endif #define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) #define BUFLEN 16384 #define MAX_NAME_LEN 1024 #ifdef MAXSEG_64K # define local static /* Needed for systems with limitation on stack size. */ #else # define local #endif char *prog; void error OF((const char *msg)); void gz_compress OF((FILE *in, gzFile out)); #ifdef USE_MMAP int gz_compress_mmap OF((FILE *in, gzFile out)); #endif void gz_uncompress OF((gzFile in, FILE *out)); void file_compress OF((char *file, char *mode)); void file_uncompress OF((char *file)); int main OF((int argc, char *argv[])); /* =========================================================================== * Display error message and exit */ void error(msg) const char *msg; { fprintf(stderr, "%s: %s\n", prog, msg); exit(1); } /* =========================================================================== * Compress input to output then close both files. */ void gz_compress(in, out) FILE *in; gzFile out; { local char buf[BUFLEN]; int len; int err; #ifdef USE_MMAP /* Try first compressing with mmap. If mmap fails (minigzip used in a * pipe), use the normal fread loop. */ if (gz_compress_mmap(in, out) == Z_OK) return; #endif for (;;) { len = (int)fread(buf, 1, sizeof(buf), in); if (ferror(in)) { perror("fread"); exit(1); } if (len == 0) break; if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); } fclose(in); if (gzclose(out) != Z_OK) error("failed gzclose"); } #ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ /* Try compressing the input file at once using mmap. Return Z_OK if * if success, Z_ERRNO otherwise. */ int gz_compress_mmap(in, out) FILE *in; gzFile out; { int len; int err; int ifd = fileno(in); caddr_t buf; /* mmap'ed buffer for the entire input file */ off_t buf_len; /* length of the input file */ struct stat sb; /* Determine the size of the file, needed for mmap: */ if (fstat(ifd, &sb) < 0) return Z_ERRNO; buf_len = sb.st_size; if (buf_len <= 0) return Z_ERRNO; /* Now do the actual mmap: */ buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); if (buf == (caddr_t)(-1)) return Z_ERRNO; /* Compress the whole file at once: */ len = gzwrite(out, (char *)buf, (unsigned)buf_len); if (len != (int)buf_len) error(gzerror(out, &err)); munmap(buf, buf_len); fclose(in); if (gzclose(out) != Z_OK) error("failed gzclose"); return Z_OK; } #endif /* USE_MMAP */ /* =========================================================================== * Uncompress input to output then close both files. */ void gz_uncompress(in, out) gzFile in; FILE *out; { local char buf[BUFLEN]; int len; int err; for (;;) { len = gzread(in, buf, sizeof(buf)); if (len < 0) error (gzerror(in, &err)); if (len == 0) break; if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { error("failed fwrite"); } } if (fclose(out)) error("failed fclose"); if (gzclose(in) != Z_OK) error("failed gzclose"); } /* =========================================================================== * Compress the given file: create a corresponding .gz file and remove the * original. */ void file_compress(file, mode) char *file; char *mode; { local char outfile[MAX_NAME_LEN]; FILE *in; gzFile out; strcpy(outfile, file); strcat(outfile, GZ_SUFFIX); in = fopen(file, "rb"); if (in == NULL) { perror(file); exit(1); } out = gzopen(outfile, mode); if (out == NULL) { fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); exit(1); } gz_compress(in, out); unlink(file); } /* =========================================================================== * Uncompress the given file and remove the original. */ void file_uncompress(file) char *file; { local char buf[MAX_NAME_LEN]; char *infile, *outfile; FILE *out; gzFile in; uInt len = (uInt)strlen(file); strcpy(buf, file); if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { infile = file; outfile = buf; outfile[len-3] = '\0'; } else { outfile = file; infile = buf; strcat(infile, GZ_SUFFIX); } in = gzopen(infile, "rb"); if (in == NULL) { fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); exit(1); } out = fopen(outfile, "wb"); if (out == NULL) { perror(file); exit(1); } gz_uncompress(in, out); unlink(infile); } /* =========================================================================== * Usage: minigzip [-d] [-f] [-h] [-r] [-1 to -9] [files...] * -d : decompress * -f : compress with Z_FILTERED * -h : compress with Z_HUFFMAN_ONLY * -r : compress with Z_RLE * -1 to -9 : compression level */ int main(argc, argv) int argc; char *argv[]; { int uncompr = 0; gzFile file; char outmode[20]; strcpy(outmode, "wb6 "); prog = argv[0]; argc--, argv++; while (argc > 0) { if (strcmp(*argv, "-d") == 0) uncompr = 1; else if (strcmp(*argv, "-f") == 0) outmode[3] = 'f'; else if (strcmp(*argv, "-h") == 0) outmode[3] = 'h'; else if (strcmp(*argv, "-r") == 0) outmode[3] = 'R'; else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && (*argv)[2] == 0) outmode[2] = (*argv)[1]; else break; argc--, argv++; } if (outmode[3] == ' ') outmode[3] = 0; if (argc == 0) { SET_BINARY_MODE(stdin); SET_BINARY_MODE(stdout); if (uncompr) { file = gzdopen(fileno(stdin), "rb"); if (file == NULL) error("can't gzdopen stdin"); gz_uncompress(file, stdout); } else { file = gzdopen(fileno(stdout), outmode); if (file == NULL) error("can't gzdopen stdout"); gz_compress(stdin, file); } } else { do { if (uncompr) { file_uncompress(*argv); } else { file_compress(*argv, outmode); } } while (argv++, --argc); } return 0; } instead-3.2.1/src/zlib/adler32.c0000644000175000017500000001114413267071774015332 0ustar peterpeter/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" #define BASE 65521UL /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); /* use NO_DIVIDE if your processor does not do division in hardware */ #ifdef NO_DIVIDE # define MOD(a) \ do { \ if (a >= (BASE << 16)) a -= (BASE << 16); \ if (a >= (BASE << 15)) a -= (BASE << 15); \ if (a >= (BASE << 14)) a -= (BASE << 14); \ if (a >= (BASE << 13)) a -= (BASE << 13); \ if (a >= (BASE << 12)) a -= (BASE << 12); \ if (a >= (BASE << 11)) a -= (BASE << 11); \ if (a >= (BASE << 10)) a -= (BASE << 10); \ if (a >= (BASE << 9)) a -= (BASE << 9); \ if (a >= (BASE << 8)) a -= (BASE << 8); \ if (a >= (BASE << 7)) a -= (BASE << 7); \ if (a >= (BASE << 6)) a -= (BASE << 6); \ if (a >= (BASE << 5)) a -= (BASE << 5); \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) # define MOD4(a) \ do { \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE # define MOD4(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { unsigned long sum2; unsigned n; /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; /* in case user likes doing a byte at a time, keep it fast */ if (len == 1) { adler += buf[0]; if (adler >= BASE) adler -= BASE; sum2 += adler; if (sum2 >= BASE) sum2 -= BASE; return adler | (sum2 << 16); } /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { while (len--) { adler += *buf++; sum2 += adler; } if (adler >= BASE) adler -= BASE; MOD4(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } /* do length NMAX blocks -- requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; n = NMAX / 16; /* NMAX is divisible by 16 */ do { DO16(buf); /* 16 sums unrolled */ buf += 16; } while (--n); MOD(adler); MOD(sum2); } /* do remaining bytes (less than NMAX, still just one modulo) */ if (len) { /* avoid modulos if none remaining */ while (len >= 16) { len -= 16; DO16(buf); buf += 16; } while (len--) { adler += *buf++; sum2 += adler; } MOD(adler); MOD(sum2); } /* return recombined sums */ return adler | (sum2 << 16); } /* ========================================================================= */ uLong ZEXPORT adler32_combine(adler1, adler2, len2) uLong adler1; uLong adler2; z_off_t len2; { unsigned long sum1; unsigned long sum2; unsigned rem; /* the derivation of this formula is left as an exercise for the reader */ rem = (unsigned)(len2 % BASE); sum1 = adler1 & 0xffff; sum2 = rem * sum1; MOD(sum2); sum1 += (adler2 & 0xffff) + BASE - 1; sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 > BASE) sum1 -= BASE; if (sum1 > BASE) sum1 -= BASE; if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); if (sum2 > BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } instead-3.2.1/src/zlib/readme0000644000175000017500000001327513267071774015121 0ustar peterpeterZLIB DATA COMPRESSION LIBRARY zlib 1.2.3 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). These documents are also available in other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib@gzip.org). A usage example of the library is given in the file example.c which also tests that the library is working correctly. Another example is given in the file minigzip.c. The compression library itself is composed of all source files except example.c and minigzip.c. To compile all files and run the test program, follow the instructions given at the top of Makefile. In short "make test; make install" should work for most machines. For Unix: "./configure; make test; make install". For MSDOS, use one of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. Questions about zlib should be sent to , or to Gilles Vollant for the Windows DLL version. The zlib home page is http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking for help. Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available in http://dogma.net/markn/articles/zlibtool/zlibtool.htm The changes made in version 1.2.3 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory "contrib". A Java implementation of zlib is available in the Java Development Kit http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html See the zlib home page http://www.zlib.org for details. A Perl interface to zlib written by Paul Marquess is in the CPAN (Comprehensive Perl Archive Network) sites http://www.cpan.org/modules/by-module/Compress/ A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see http://www.python.org/doc/lib/module-zlib.html A zlib binding for TCL written by Andreas Kupries is availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html An experimental package to read and write files in .zip format, written on top of zlib by Gilles Vollant , is available in the contrib/minizip directory of zlib. Notes for some targets: - For Windows DLL versions, please see win32/DLL_FAQ.txt - For 64-bit Irix, deflate.c must be compiled without any optimization. With -O, one libpng test fails. The test works in 32 bit mode (with the -n32 compiler flag). The compiler bug has been reported to SGI. - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works when compiled with cc. - On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is necessary to get gzprintf working correctly. This is done by configure. - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with other compilers. Use "make test" to check your compiler. - gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. - For PalmOs, see http://palmzlib.sourceforge.net/ - When building a shared, i.e. dynamic library on Mac OS X, the library must be installed before testing (do "make install" before "make test"), since the library location is specified in the library. Acknowledgments: The deflate format used by zlib was defined by Phil Katz. The deflate and zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in zlib; they are too numerous to cite here. Copyright notice: (C) 1995-2004 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read the FAQ for more information on the distribution of modified source versions. instead-3.2.1/src/zlib/zutil.h0000644000175000017500000001573013267071774015257 0ustar peterpeter/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id$ */ #ifndef ZUTIL_H #define ZUTIL_H #define ZLIB_INTERNAL #include "zlib.h" #ifdef STDC # ifndef _WIN32_WCE # include # endif # include # include #endif #ifdef NO_ERRNO_H # ifdef _WIN32_WCE /* The Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. We rename it to * avoid conflict with other libraries that use the same workaround. */ # define errno z_errno # endif extern int errno; #else # ifndef _WIN32_WCE # include # endif #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = (char*)ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # if defined(__TURBOC__) || defined(__BORLANDC__) # if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); # else # include # endif # else /* MSC or DJGPP */ # include # endif #endif #ifdef AMIGA # define OS_CODE 0x01 #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 0x02 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 0x05 #endif #ifdef OS2 # define OS_CODE 0x06 # ifdef M_I86 #include # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else # ifndef fdopen # define fdopen(fd,mode) NULL /* No fdopen() */ # endif # endif #endif #ifdef TOPS20 # define OS_CODE 0x0a #endif #ifdef WIN32 # ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ # define OS_CODE 0x0b # endif #endif #ifdef __50SERIES /* Prime/PRIMOS */ # define OS_CODE 0x0f #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED typedef int ptrdiff_t; # define _PTRDIFF_T_DEFINED # endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif #endif /* common defaults */ #ifndef OS_CODE # define OS_CODE 0x03 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ #if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(__CYGWIN__) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #ifndef HAVE_VSNPRINTF # ifdef MSDOS /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), but for now we just assume it doesn't. */ # define NO_vsnprintf # endif # ifdef __TURBOC__ # define NO_vsnprintf # endif # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) # define vsnprintf _vsnprintf # endif # endif # ifdef __SASC # define NO_vsnprintf # endif #endif #ifdef VMS # define NO_vsnprintf #endif #if defined(pyr) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); extern void zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include extern int z_verbose; extern void z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} #endif /* ZUTIL_H */ instead-3.2.1/src/zlib/gzio.c0000644000175000017500000007660113267071774015057 0ustar peterpeter/* gzio.c -- IO on .gz files * Copyright (C) 1995-2005 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. */ /* @(#) $Id$ */ #include #include "zutil.h" #ifdef NO_DEFLATE /* for compatibility with old definition */ # define NO_GZCOMPRESS #endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif #ifndef Z_BUFSIZE # ifdef MAXSEG_64K # define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ # else # define Z_BUFSIZE 16384 # endif #endif #ifndef Z_PRINTF_BUFSIZE # define Z_PRINTF_BUFSIZE 4096 #endif #ifdef __MVS__ # pragma map (fdopen , "\174\174FDOPEN") FILE *fdopen(int, const char *); #endif #ifndef STDC extern voidp malloc OF((uInt size)); extern void free OF((voidpf ptr)); #endif #define ALLOC(size) malloc(size) #define TRYFREE(p) {if (p) free(p);} static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ /* gzip flag byte */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ #define COMMENT 0x10 /* bit 4 set: file comment present */ #define RESERVED 0xE0 /* bits 5..7: reserved */ typedef struct gz_stream { z_stream stream; int z_err; /* error code for last stream operation */ int z_eof; /* set if end of input file */ FILE *file; /* .gz file */ Byte *inbuf; /* input buffer */ Byte *outbuf; /* output buffer */ uLong crc; /* crc32 of uncompressed data */ char *msg; /* error message */ char *path; /* path name for debugging only */ int transparent; /* 1 if input file is not a .gz file */ char mode; /* 'w' or 'r' */ z_off_t start; /* start of compressed data in file (header skipped) */ z_off_t in; /* bytes into deflate or inflate */ z_off_t out; /* bytes out of deflate or inflate */ int back; /* one character push-back */ int last; /* true if push-back is last character */ } gz_stream; local gzFile gz_open OF((const char *path, const char *mode, int fd)); local int do_flush OF((gzFile file, int flush)); local int get_byte OF((gz_stream *s)); local void check_header OF((gz_stream *s)); local int destroy OF((gz_stream *s)); local void putLong OF((FILE *file, uLong x)); local uLong getLong OF((gz_stream *s)); /* =========================================================================== Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb"). The file is given either by file descriptor or path name (if fd == -1). gz_open returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ local gzFile gz_open (path, mode, fd) const char *path; const char *mode; int fd; { int err; int level = Z_DEFAULT_COMPRESSION; /* compression level */ int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ char *p = (char*)mode; gz_stream *s; char fmode[80]; /* copy of mode, without the compression level */ char *m = fmode; if (!path || !mode) return Z_NULL; s = (gz_stream *)ALLOC(sizeof(gz_stream)); if (!s) return Z_NULL; s->stream.zalloc = (alloc_func)0; s->stream.zfree = (free_func)0; s->stream.opaque = (voidpf)0; s->stream.next_in = s->inbuf = Z_NULL; s->stream.next_out = s->outbuf = Z_NULL; s->stream.avail_in = s->stream.avail_out = 0; s->file = NULL; s->z_err = Z_OK; s->z_eof = 0; s->in = 0; s->out = 0; s->back = EOF; s->crc = crc32(0L, Z_NULL, 0); s->msg = NULL; s->transparent = 0; s->path = (char*)ALLOC(strlen(path)+1); if (s->path == NULL) { return destroy(s), (gzFile)Z_NULL; } strcpy(s->path, path); /* do this early for debugging */ s->mode = '\0'; do { if (*p == 'r') s->mode = 'r'; if (*p == 'w' || *p == 'a') s->mode = 'w'; if (*p >= '0' && *p <= '9') { level = *p - '0'; } else if (*p == 'f') { strategy = Z_FILTERED; } else if (*p == 'h') { strategy = Z_HUFFMAN_ONLY; } else if (*p == 'R') { strategy = Z_RLE; } else { *m++ = *p; /* copy the mode */ } } while (*p++ && m != fmode + sizeof(fmode)); if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateInit2(&(s->stream), level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); /* windowBits is passed < 0 to suppress zlib header */ s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); #endif if (err != Z_OK || s->outbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } else { s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); err = inflateInit2(&(s->stream), -MAX_WBITS); /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are * present after the compressed stream. */ if (err != Z_OK || s->inbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } s->stream.avail_out = Z_BUFSIZE; errno = 0; s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); if (s->file == NULL) { return destroy(s), (gzFile)Z_NULL; } if (s->mode == 'w') { /* Write a very simple .gz header: */ fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); s->start = 10L; /* We use 10L instead of ftell(s->file) to because ftell causes an * fflush on some systems. This version of the library doesn't use * start anyway in write mode, so this initialization is not * necessary. */ } else { check_header(s); /* skip the .gz header */ s->start = ftell(s->file) - s->stream.avail_in; } return (gzFile)s; } /* =========================================================================== Opens a gzip (.gz) file for reading or writing. */ gzFile ZEXPORT gzopen (path, mode) const char *path; const char *mode; { return gz_open (path, mode, -1); } /* =========================================================================== Associate a gzFile with the file descriptor fd. fd is not dup'ed here to mimic the behavio(u)r of fdopen. */ gzFile ZEXPORT gzdopen (fd, mode) int fd; const char *mode; { char name[46]; /* allow for up to 128-bit integers */ if (fd < 0) return (gzFile)Z_NULL; sprintf(name, "", fd); /* for debugging */ return gz_open (name, mode, fd); } /* =========================================================================== * Update the compression level and strategy */ int ZEXPORT gzsetparams (file, level, strategy) gzFile file; int level; int strategy; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; /* Make room to allow flushing */ if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; } s->stream.avail_out = Z_BUFSIZE; } return deflateParams (&(s->stream), level, strategy); } /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int get_byte(s) gz_stream *s; { if (s->z_eof) return EOF; if (s->stream.avail_in == 0) { errno = 0; s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) s->z_err = Z_ERRNO; return EOF; } s->stream.next_in = s->inbuf; } s->stream.avail_in--; return *(s->stream.next_in)++; } /* =========================================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present; set s->err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s->stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files. */ local void check_header(s) gz_stream *s; { int method; /* method byte */ int flags; /* flags byte */ uInt len; int c; /* Assure two bytes in the buffer so we can peek ahead -- handle case where first byte of header is at the end of the buffer after the last gzip segment */ len = s->stream.avail_in; if (len < 2) { if (len) s->inbuf[0] = s->stream.next_in[0]; errno = 0; len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; s->stream.avail_in += len; s->stream.next_in = s->inbuf; if (s->stream.avail_in < 2) { s->transparent = s->stream.avail_in; return; } } /* Peek ahead to check the gzip magic header */ if (s->stream.next_in[0] != gz_magic[0] || s->stream.next_in[1] != gz_magic[1]) { s->transparent = 1; return; } s->stream.avail_in -= 2; s->stream.next_in += 2; /* Check the rest of the gzip header */ method = get_byte(s); flags = get_byte(s); if (method != Z_DEFLATED || (flags & RESERVED) != 0) { s->z_err = Z_DATA_ERROR; return; } /* Discard time, xflags and OS code: */ for (len = 0; len < 6; len++) (void)get_byte(s); if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ len = (uInt)get_byte(s); len += ((uInt)get_byte(s))<<8; /* len is garbage if EOF but the loop below will quit anyway */ while (len-- != 0 && get_byte(s) != EOF) ; } if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ for (len = 0; len < 2; len++) (void)get_byte(s); } s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; } /* =========================================================================== * Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. */ local int destroy (s) gz_stream *s; { int err = Z_OK; if (!s) return Z_STREAM_ERROR; TRYFREE(s->msg); if (s->stream.state != NULL) { if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateEnd(&(s->stream)); #endif } else if (s->mode == 'r') { err = inflateEnd(&(s->stream)); } } if (s->file != NULL && fclose(s->file)) { #ifdef ESPIPE if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ #endif err = Z_ERRNO; } if (s->z_err < 0) err = s->z_err; TRYFREE(s->inbuf); TRYFREE(s->outbuf); TRYFREE(s->path); TRYFREE(s); return err; } /* =========================================================================== Reads the given number of uncompressed bytes from the compressed file. gzread returns the number of bytes actually read (0 for end of file). */ int ZEXPORT gzread (file, buf, len) gzFile file; voidp buf; unsigned len; { gz_stream *s = (gz_stream*)file; Bytef *start = (Bytef*)buf; /* starting point for crc computation */ Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; if (s->z_err == Z_STREAM_END) return 0; /* EOF */ next_out = (Byte*)buf; s->stream.next_out = (Bytef*)buf; s->stream.avail_out = len; if (s->stream.avail_out && s->back != EOF) { *next_out++ = s->back; s->stream.next_out++; s->stream.avail_out--; s->back = EOF; s->out++; start++; if (s->last) { s->z_err = Z_STREAM_END; return 1; } } while (s->stream.avail_out != 0) { if (s->transparent) { /* Copy first the lookahead bytes: */ uInt n = s->stream.avail_in; if (n > s->stream.avail_out) n = s->stream.avail_out; if (n > 0) { zmemcpy(s->stream.next_out, s->stream.next_in, n); next_out += n; s->stream.next_out = next_out; s->stream.next_in += n; s->stream.avail_out -= n; s->stream.avail_in -= n; } if (s->stream.avail_out > 0) { s->stream.avail_out -= (uInt)fread(next_out, 1, s->stream.avail_out, s->file); } len -= s->stream.avail_out; s->in += len; s->out += len; if (len == 0) s->z_eof = 1; return (int)len; } if (s->stream.avail_in == 0 && !s->z_eof) { errno = 0; s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) { s->z_err = Z_ERRNO; break; } } s->stream.next_in = s->inbuf; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = inflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err == Z_STREAM_END) { /* Check CRC and original size */ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); start = s->stream.next_out; if (getLong(s) != s->crc) { s->z_err = Z_DATA_ERROR; } else { (void)getLong(s); /* The uncompressed length returned by above getlong() may be * different from s->out in case of concatenated .gz files. * Check for such files: */ check_header(s); if (s->z_err == Z_OK) { inflateReset(&(s->stream)); s->crc = crc32(0L, Z_NULL, 0); } } } if (s->z_err != Z_OK || s->z_eof) break; } s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); if (len == s->stream.avail_out && (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) return -1; return (int)(len - s->stream.avail_out); } /* =========================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ int ZEXPORT gzgetc(file) gzFile file; { unsigned char c; return gzread(file, &c, 1) == 1 ? c : -1; } /* =========================================================================== Push one byte back onto the stream. */ int ZEXPORT gzungetc(c, file) int c; gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; s->back = c; s->out--; s->last = (s->z_err == Z_STREAM_END); if (s->last) s->z_err = Z_OK; s->z_eof = 0; return c; } /* =========================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. The current implementation is not optimized at all. */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { char *b = buf; if (buf == Z_NULL || len <= 0) return Z_NULL; while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; *buf = '\0'; return b == buf && len > 0 ? Z_NULL : b; } #ifndef NO_GZCOMPRESS /* =========================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of bytes actually written (0 in case of error). */ int ZEXPORT gzwrite (file, buf, len) gzFile file; voidpc buf; unsigned len; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.next_in = (Bytef*)buf; s->stream.avail_in = len; while (s->stream.avail_in != 0) { if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; break; } s->stream.avail_out = Z_BUFSIZE; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err != Z_OK) break; } s->crc = crc32(s->crc, (const Bytef *)buf, len); return (int)(len - s->stream.avail_in); } /* =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). */ #ifdef STDC #include int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) { char buf[Z_PRINTF_BUFSIZE]; va_list va; int len; buf[sizeof(buf) - 1] = 0; va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf(buf, format, va); va_end(va); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = vsprintf(buf, format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf(buf, sizeof(buf), format, va); va_end(va); len = strlen(buf); # else len = vsnprintf(buf, sizeof(buf), format, va); va_end(va); # endif #endif if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, (unsigned)len); } #else /* not ANSI C */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { char buf[Z_PRINTF_BUFSIZE]; int len; buf[sizeof(buf) - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen(buf); # else len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, len); } #endif /* =========================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned char cc = (unsigned char) c; /* required for big endian systems */ return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; } /* =========================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ int ZEXPORT gzputs(file, s) gzFile file; const char *s; { return gzwrite(file, (char*)s, (unsigned)strlen(s)); } /* =========================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. */ local int do_flush (file, flush) gzFile file; int flush; { uInt len; int done = 0; gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.avail_in = 0; /* should be zero already anyway */ for (;;) { len = Z_BUFSIZE - s->stream.avail_out; if (len != 0) { if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { s->z_err = Z_ERRNO; return Z_ERRNO; } s->stream.next_out = s->outbuf; s->stream.avail_out = Z_BUFSIZE; } if (done) break; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), flush); s->out -= s->stream.avail_out; /* Ignore the second of two consecutive flushes: */ if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; /* deflate has finished flushing only when it hasn't used up * all the available space in the output buffer: */ done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; } return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } int ZEXPORT gzflush (file, flush) gzFile file; int flush; { gz_stream *s = (gz_stream*)file; int err = do_flush (file, flush); if (err) return err; fflush(s->file); return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } #endif /* NO_GZCOMPRESS */ /* =========================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. */ z_off_t ZEXPORT gzseek (file, offset, whence) gzFile file; z_off_t offset; int whence; { gz_stream *s = (gz_stream*)file; if (s == NULL || whence == SEEK_END || s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { return -1L; } if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return -1L; #else if (whence == SEEK_SET) { offset -= s->in; } if (offset < 0) return -1L; /* At this point, offset is the number of zero bytes to write. */ if (s->inbuf == Z_NULL) { s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ if (s->inbuf == Z_NULL) return -1L; zmemzero(s->inbuf, Z_BUFSIZE); } while (offset > 0) { uInt size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (uInt)offset; size = gzwrite(file, s->inbuf, size); if (size == 0) return -1L; offset -= size; } return s->in; #endif } /* Rest of function is for reading only */ /* compute absolute position */ if (whence == SEEK_CUR) { offset += s->out; } if (offset < 0) return -1L; if (s->transparent) { /* map to fseek */ s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; s->in = s->out = offset; return offset; } /* For a negative seek, rewind and use positive seek */ if (offset >= s->out) { offset -= s->out; } else if (gzrewind(file) < 0) { return -1L; } /* offset is now the number of bytes to skip. */ if (offset != 0 && s->outbuf == Z_NULL) { s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); if (s->outbuf == Z_NULL) return -1L; } if (offset && s->back != EOF) { s->back = EOF; s->out++; offset--; if (s->last) s->z_err = Z_STREAM_END; } while (offset > 0) { int size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (int)offset; size = gzread(file, s->outbuf, (uInt)size); if (size <= 0) return -1L; offset -= size; } return s->out; } /* =========================================================================== Rewinds input file. */ int ZEXPORT gzrewind (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return -1; s->z_err = Z_OK; s->z_eof = 0; s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; s->crc = crc32(0L, Z_NULL, 0); if (!s->transparent) (void)inflateReset(&s->stream); s->in = 0; s->out = 0; return fseek(s->file, s->start, SEEK_SET); } /* =========================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. */ z_off_t ZEXPORT gztell (file) gzFile file; { return gzseek(file, 0L, SEEK_CUR); } /* =========================================================================== Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ int ZEXPORT gzeof (file) gzFile file; { gz_stream *s = (gz_stream*)file; /* With concatenated compressed files that can have embedded * crc trailers, z_eof is no longer the only/best indicator of EOF * on a gz_stream. Handle end-of-stream error explicitly here. */ if (s == NULL || s->mode != 'r') return 0; if (s->z_eof) return 1; return s->z_err == Z_STREAM_END; } /* =========================================================================== Returns 1 if reading and doing so transparently, otherwise zero. */ int ZEXPORT gzdirect (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return 0; return s->transparent; } /* =========================================================================== Outputs a long in LSB order to the given file */ local void putLong (file, x) FILE *file; uLong x; { int n; for (n = 0; n < 4; n++) { fputc((int)(x & 0xff), file); x >>= 8; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets z_err in case of error. */ local uLong getLong (s) gz_stream *s; { uLong x = (uLong)get_byte(s); int c; x += ((uLong)get_byte(s))<<8; x += ((uLong)get_byte(s))<<16; c = get_byte(s); if (c == EOF) s->z_err = Z_DATA_ERROR; x += ((uLong)c)<<24; return x; } /* =========================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. */ int ZEXPORT gzclose (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL) return Z_STREAM_ERROR; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return Z_STREAM_ERROR; #else if (do_flush (file, Z_FINISH) != Z_OK) return destroy((gz_stream*)file); putLong (s->file, s->crc); putLong (s->file, (uLong)(s->in & 0xffffffff)); #endif } return destroy((gz_stream*)file); } #ifdef STDC # define zstrerror(errnum) strerror(errnum) #else # define zstrerror(errnum) "" #endif /* =========================================================================== Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ const char * ZEXPORT gzerror (file, errnum) gzFile file; int *errnum; { char *m; gz_stream *s = (gz_stream*)file; if (s == NULL) { *errnum = Z_STREAM_ERROR; return (const char*)ERR_MSG(Z_STREAM_ERROR); } *errnum = s->z_err; if (*errnum == Z_OK) return (const char*)""; m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); TRYFREE(s->msg); s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); strcpy(s->msg, s->path); strcat(s->msg, ": "); strcat(s->msg, m); return (const char*)s->msg; } /* =========================================================================== Clear the error and end-of-file flags, and do the same for the real file. */ void ZEXPORT gzclearerr (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL) return; if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; s->z_eof = 0; clearerr(s->file); } instead-3.2.1/src/zlib/inftrees.c0000644000175000017500000003340513267071774015721 0ustar peterpeter/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; code FAR * FAR *table; unsigned FAR *bits; unsigned short FAR *work; { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code this; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ int end; /* use base and extra for symbol > end */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ this.op = (unsigned char)64; /* invalid code marker */ this.bits = (unsigned char)1; this.val = (unsigned short)0; *(*table)++ = this; /* make a table to force an error */ *(*table)++ = this; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } for (min = 1; min <= MAXBITS; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || max != 1)) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked when a LENS table is being made against the space in *table, ENOUGH, minus the maximum space needed by the worst case distance code, MAXD. This should never happen, but the sufficiency of ENOUGH has not been proven exhaustively, hence the check. This assumes that when type == LENS, bits == 9. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ end = 19; break; case LENS: base = lbase; base -= 257; extra = lext; extra -= 257; end = 256; break; default: /* DISTS */ base = dbase; extra = dext; end = -1; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if (type == LENS && used >= ENOUGH - MAXD) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ this.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { this.op = (unsigned char)0; this.val = work[sym]; } else if ((int)(work[sym]) > end) { this.op = (unsigned char)(extra[work[sym]]); this.val = base[work[sym]]; } else { this.op = (unsigned char)(32 + 64); /* end of block */ this.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; min = fill; /* save offset to next table */ do { fill -= incr; next[(huff >> drop) + fill] = this; } while (fill != 0); /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += min; /* here min is 1 << curr */ /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if (type == LENS && used >= ENOUGH - MAXD) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* Fill in rest of table for incomplete codes. This loop is similar to the loop above in incrementing huff for table indices. It is assumed that len is equal to curr + drop, so there is no loop needed to increment through high index bits. When the current sub-table is filled, the loop drops back to the root table to fill in any remaining entries there. */ this.op = (unsigned char)64; /* invalid code marker */ this.bits = (unsigned char)(len - drop); this.val = (unsigned short)0; while (huff != 0) { /* when done with sub-table, drop back to root table */ if (drop != 0 && (huff & mask) != low) { drop = 0; len = root; next = *table; this.bits = (unsigned char)len; } /* put invalid code marker in table */ next[huff >> drop] = this; /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; } /* set return parameters */ *table += used; *bits = root; return 0; } instead-3.2.1/src/zlib/crc32.c0000644000175000017500000003246013267071774015016 0ustar peterpeter/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2005 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results in about a * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $Id$ */ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ #define local static /* Find a four-byte integer type for crc32_little() and crc32_big(). */ #ifndef NOBYFOUR # ifdef STDC /* need ANSI C limits.h to determine sizes */ # include # define BYFOUR # if (UINT_MAX == 0xffffffffUL) typedef unsigned int u4; # else # if (ULONG_MAX == 0xffffffffUL) typedef unsigned long u4; # else # if (USHRT_MAX == 0xffffffffUL) typedef unsigned short u4; # else # undef BYFOUR /* can't find a four-byte integer type! */ # endif # endif # endif # endif /* STDC */ #endif /* !NOBYFOUR */ /* Definitions for doing the crc four data bytes at a time. */ #ifdef BYFOUR # define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, unsigned)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ /* Local functions for crc concatenation */ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; local unsigned long FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const unsigned long FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { unsigned long c; int n, k; unsigned long poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* See if another task is already doing this (not thread-safe, but better than nothing -- significantly reduces duration of vulnerability in case the advice about DYNAMIC_CRC_TABLE is ignored) */ if (first) { first = 0; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0UL; for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) poly |= 1UL << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (unsigned long)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; crc_table[4][n] = REV(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; crc_table[k + 4][n] = REV(c); } } #endif /* BYFOUR */ crc_table_empty = 0; } else { /* not first */ /* wait for the other guy to finish (not efficient, but rare) */ while (crc_table_empty) ; } #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); fprintf(out, "local const unsigned long FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const unsigned long FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const unsigned long FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ return (const unsigned long FAR *)crc_table; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { u4 endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } #ifdef BYFOUR /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = (u4)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } buf4 = (const u4 FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *++buf4; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = REV((u4)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } buf4 = (const u4 FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(REV(c)); } #endif /* BYFOUR */ #define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ /* ========================================================================= */ local unsigned long gf2_matrix_times(mat, vec) unsigned long *mat; unsigned long vec; { unsigned long sum; sum = 0; while (vec) { if (vec & 1) sum ^= *mat; vec >>= 1; mat++; } return sum; } /* ========================================================================= */ local void gf2_matrix_square(square, mat) unsigned long *square; unsigned long *mat; { int n; for (n = 0; n < GF2_DIM; n++) square[n] = gf2_matrix_times(mat, mat[n]); } /* ========================================================================= */ uLong ZEXPORT crc32_combine(crc1, crc2, len2) uLong crc1; uLong crc2; z_off_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ /* degenerate case */ if (len2 == 0) return crc1; /* put operator for one zero bit in odd */ odd[0] = 0xedb88320L; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; row <<= 1; } /* put operator for two zero bits in even */ gf2_matrix_square(even, odd); /* put operator for four zero bits in odd */ gf2_matrix_square(odd, even); /* apply len2 zeros to crc1 (first square will put the operator for one zero byte, eight zero bits, in even) */ do { /* apply zeros operator for this bit of len2 */ gf2_matrix_square(even, odd); if (len2 & 1) crc1 = gf2_matrix_times(even, crc1); len2 >>= 1; /* if no more bits set, then done */ if (len2 == 0) break; /* another iteration of the loop with odd and even swapped */ gf2_matrix_square(odd, even); if (len2 & 1) crc1 = gf2_matrix_times(odd, crc1); len2 >>= 1; /* if no more bits set, then done */ } while (len2 != 0); /* return combined crc */ crc1 ^= crc2; return crc1; } instead-3.2.1/src/zlib/inflate.h0000644000175000017500000001361713267071774015534 0ustar peterpeter/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2004 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN, /* i: waiting for length/lit code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ LENGTH, /* i: waiting for 32-bit length (gzip) */ DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to the BAD or MEM mode -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE Read deflate blocks: TYPE -> STORED or TABLE or LEN or CHECK STORED -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN Read deflate codes: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* state maintained between inflate() calls. Approximately 7K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ gz_headerp head; /* where to save gzip header information */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ }; instead-3.2.1/src/input.h0000644000175000017500000000365013267071774014305 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __INPUT_H__ #define __INPUT_H__ #define KEY_DOWN 1 #define KEY_UP 2 #define MOUSE_DOWN 3 #define MOUSE_UP 4 #define MOUSE_WHEEL_UP 5 #define MOUSE_WHEEL_DOWN 6 #define MOUSE_MOTION 7 #define USER_EVENT 8 #define FINGER_UP 9 #define FINGER_DOWN 10 #define EV_CODE_KBD -1 #define EV_CODE_FINGER -2 #define AGAIN 2 struct inp_event { int type; int code; char sym[64]; int x; int y; int count; }; int input(struct inp_event *ev, int wait); int input_init(void); void input_clear(void); void input_uevents(void); void push_user_event(void (*p) (void*), void *data); int mouse_focus(void); extern int minimized(void); extern int mouse_cursor(int on); extern int finger_pos(const char *finger, int *x, int *y, float *pressure); extern int system_clipboard(const char *text, char **buf); #endif instead-3.2.1/src/themes.c0000644000175000017500000010510113267071774014420 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" int theme_relative = 0; char *curtheme_dir[2] = { NULL, NULL }; struct theme *curtheme_loading = NULL; static int parse_win_align(const char *v, void *data) { int *i = (int *)data; if (!strcmp(v, "left")) *i = ALIGN_LEFT; else if (!strcmp(v, "justify")) *i = ALIGN_JUSTIFY; else if (!strcmp(v, "center")) *i = ALIGN_CENTER; else if (!strcmp(v, "right")) *i = ALIGN_RIGHT; else return -1; return 0; } static int parse_gfx_mode(const char *v, void *data) { int *i = (int *)data; if (!strcmp(v, "fixed")) *i = GFX_MODE_FIXED; else if (!strcmp(v, "embedded")) *i = GFX_MODE_EMBEDDED; else if (!strncmp(v, "float", 5)) { *i = GFX_MODE_FLOAT; v += 5; if (!*v) /* compat */ *i |= GFX_ALIGN_SET(ALIGN_TOP); while (*v) { if (*v != '-') return -1; v ++; if (!strncmp(v, "top", 3)) { *i |= GFX_ALIGN_SET(ALIGN_TOP); v += 3; } else if (!strncmp(v, "middle", 6)) { *i |= GFX_ALIGN_SET(ALIGN_MIDDLE); v += 6; } else if (!strncmp(v, "bottom", 6)) { *i |= GFX_ALIGN_SET(ALIGN_BOTTOM); v += 6; } else if (!strncmp(v, "left", 4)) { *i |= GFX_ALIGN_SET(ALIGN_LEFT); v += 4; } else if (!strncmp(v, "right", 5)) { *i |= GFX_ALIGN_SET(ALIGN_RIGHT); v += 5; } else if (!strncmp(v, "center", 6)) { *i |= GFX_ALIGN_SET(ALIGN_CENTER); v += 6; } else return -1; } } else if (!strcmp(v, "direct")) *i = GFX_MODE_DIRECT; else return -1; return 0; } static int out_gfx_mode(const void *v, char **out) { char *o; char buff[256]; int m = *((int*)v); switch (GFX_MODE(m)) { case GFX_MODE_FIXED: o = strdup("fixed"); break; case GFX_MODE_EMBEDDED: o = strdup("embedded"); break; case GFX_MODE_FLOAT: strcpy(buff, "float"); if (GFX_ALIGN(m) != ALIGN_TOP) { /* compat */ if (GFX_ALIGN(m) & ALIGN_TOP) strcat(buff,"-top"); else if (GFX_ALIGN(m) & ALIGN_BOTTOM) strcat(buff,"-bottom"); if (GFX_ALIGN(m) & ALIGN_LEFT) strcat(buff,"-left"); else if (GFX_ALIGN(m) & ALIGN_RIGHT) strcat(buff,"-right"); } o = strdup(buff); break; case GFX_MODE_DIRECT: o = strdup("direct"); break; default: o = strdup(""); break; } if (!o) return -1; *out = o; return 0; } static int parse_inv_mode(const char *v, void *data) { int *i = (int *)data; if (!strcmp(v, "vertical") || !strcmp(v, "0") || !strcmp(v, "vertical-left")) *i = INV_MODE_VERT | INV_ALIGN_SET(ALIGN_LEFT); else if (!strcmp(v, "horizontal") || !strcmp(v, "1") || !strcmp(v, "horizontal-center")) *i = INV_MODE_HORIZ | INV_ALIGN_SET(ALIGN_CENTER); else if (!strcmp(v, "horizontal-left") || !strcmp(v, "1")) *i = INV_MODE_HORIZ | INV_ALIGN_SET(ALIGN_LEFT); else if (!strcmp(v, "horizontal-right") || !strcmp(v, "1")) *i = INV_MODE_HORIZ | INV_ALIGN_SET(ALIGN_RIGHT); else if (!strcmp(v, "disabled") || !strcmp(v, "-1")) *i = INV_MODE_DISABLED; else if (!strcmp(v, "vertical-right")) *i = INV_MODE_VERT | INV_ALIGN_SET(ALIGN_RIGHT); else if (!strcmp(v, "vertical-center")) *i = INV_MODE_VERT | INV_ALIGN_SET(ALIGN_CENTER); else return -1; return 0; } static int parse_ways_mode(const char *v, void *data) { int *i = (int *)data; if (!strcmp(v, "top")) *i = ALIGN_TOP; else if (!strcmp(v, "bottom")) *i = ALIGN_BOTTOM; else return -1; return 0; } static int out_ways_mode(const void *v, char **out) { char *o; int m = *((int*)v); o = malloc(64); if (!o) return -1; if (m == ALIGN_BOTTOM) sprintf(o, "bottom"); else sprintf(o, "top"); *out = o; return 0; } static int out_inv_mode(const void *v, char **out) { char *o; int m = *((int*)v); o = malloc(64); if (!o) return -1; if (m == INV_MODE_DISABLED) { sprintf(o, "disabled"); *out = o; return 0; } if ((INV_MODE(m) == INV_MODE_HORIZ)) sprintf(o, "horizontal"); else sprintf(o, "vertical"); if ((m & INV_ALIGN_SET(ALIGN_CENTER)) == INV_ALIGN_SET(ALIGN_CENTER)) { strcat(o, "-center"); } else if ((m & INV_ALIGN_SET(ALIGN_LEFT)) == INV_ALIGN_SET(ALIGN_LEFT)) { strcat(o, "-left"); } else if ((m & INV_ALIGN_SET(ALIGN_RIGHT)) == INV_ALIGN_SET(ALIGN_RIGHT)) { strcat(o, "-right"); } *out = o; return 0; } static int parse_color(const char *v, void *data) { color_t *c = (color_t *)data; return gfx_parse_color(v, c); } static int out_color(const void *v, char **out) { char *o; color_t *c = (color_t *)v; o = malloc(16); if (!o) return -1; sprintf(o, "#%02x%02x%02x", c->r, c->g, c->b); *out = o; return 0; } static int parse_include(const char *v, void *data) { int rc; char cwd[PATH_MAX]; if (!strlowcmp(v, DEFAULT_THEME)) return 0; if (curtheme_loading && curtheme_loading->type == THEME_GAME && strlowcmp(v, curtheme_loading->dir) && theme_lookup(v, THEME_GAME)) { /* internal theme? */ return game_theme_load(v, THEME_GAME); } getdir(cwd, sizeof(cwd)); setdir(game_cwd); rc = game_theme_load(v, THEME_GLOBAL); /* if (!rc) game_theme_select(v); */ setdir(cwd); return rc; } static int theme_parse_full_path(const char *v, void *data) { int rc; char **p = (char **)data; char *np; if (theme_relative) { if (!strncmp(v, "blank:", 6) || !strncmp(v, "box:", 4) || !strncmp(v, "spr:", 4)) /* hack for special files*/ return parse_path(v, data); rc = parse_path(v, data); if (rc || !*p || !*p[0]) return rc; if (curtheme_loading && curtheme_loading->type == THEME_GAME) { np = getfilepath(curtheme_loading->path, *p); if (!*np) return -1; free(*p); *p = np; } return 0; } return parse_full_path(v, data); } struct parser cmd_parser[] = { { "scr.w", parse_int, &game_theme.w, 0 }, { "scr.h", parse_int, &game_theme.h, 0 }, { "scr.gfx.scalable", parse_int, &game_theme.gfx_scalable, CHANGED_WIN | CHANGED_INV | CHANGED_FONT | CHANGED_IFONT | CHANGED_MFONT }, { "scr.col.bg", parse_color, &game_theme.bgcol, 0 }, { "scr.gfx.icon", theme_parse_full_path, &game_theme.icon_name, CHANGED_ICON }, { "scr.gfx.bg", theme_parse_full_path, &game_theme.bg_name, CHANGED_BG }, { "scr.gfx.cursor.normal", theme_parse_full_path, &game_theme.cursor_name, CHANGED_CURSOR }, { "scr.gfx.cursor.x", parse_int, &game_theme.cur_x, 0 }, { "scr.gfx.cursor.y", parse_int, &game_theme.cur_y, 0 }, { "scr.gfx.use", theme_parse_full_path, &game_theme.use_name, CHANGED_USE }, /* compat */ { "scr.gfx.cursor.use", theme_parse_full_path, &game_theme.use_name, CHANGED_USE }, { "scr.gfx.pad", parse_int, &game_theme.pad, CHANGED_WIN | CHANGED_INV }, { "scr.gfx.x", parse_int, &game_theme.gfx_x, 0 }, { "scr.gfx.y", parse_int, &game_theme.gfx_y, 0 }, { "scr.gfx.w", parse_int, &game_theme.max_scene_w, 0 }, { "scr.gfx.h", parse_int, &game_theme.max_scene_h, 0 }, { "scr.gfx.mode", parse_gfx_mode, &game_theme.gfx_mode, CHANGED_WIN }, { "win.align", parse_win_align, &game_theme.win_align, CHANGED_WIN }, { "win.x", parse_int, &game_theme.win_x, CHANGED_WIN }, { "win.y", parse_int, &game_theme.win_y, CHANGED_WIN }, { "win.w", parse_int, &game_theme.win_w, CHANGED_WIN }, { "win.h", parse_int, &game_theme.win_h, CHANGED_WIN }, { "win.ways.mode", parse_ways_mode, &game_theme.ways_mode, CHANGED_WIN }, { "win.scroll.mode", parse_int, &game_theme.win_scroll_mode, CHANGED_WIN }, { "win.fnt.name", theme_parse_full_path, &game_theme.font_name, CHANGED_FONT | CHANGED_WIN }, { "win.fnt.size", parse_int, &game_theme.font_size, CHANGED_FONT | CHANGED_WIN }, { "win.fnt.height", parse_float, &game_theme.font_height, CHANGED_WIN }, /* compat mode directive */ { "win.gfx.h", parse_int, &game_theme.max_scene_h, CHANGED_WIN }, /* here it was */ { "win.gfx.up", theme_parse_full_path, &game_theme.a_up_name, CHANGED_UP | CHANGED_WIN}, { "win.gfx.down", theme_parse_full_path, &game_theme.a_down_name, CHANGED_DOWN | CHANGED_WIN}, { "win.up.x", parse_int, &game_theme.a_up_x, CHANGED_WIN }, { "win.up.y", parse_int, &game_theme.a_up_y, CHANGED_WIN }, { "win.down.x", parse_int, &game_theme.a_down_x, CHANGED_WIN }, { "win.down.y", parse_int, &game_theme.a_down_y, CHANGED_WIN }, { "win.col.fg", parse_color, &game_theme.fgcol, CHANGED_WIN }, { "win.col.link", parse_color, &game_theme.lcol, CHANGED_WIN }, { "win.col.alink", parse_color, &game_theme.acol, CHANGED_WIN }, { "inv.x", parse_int, &game_theme.inv_x, CHANGED_INV }, { "inv.y", parse_int, &game_theme.inv_y, CHANGED_INV }, { "inv.w", parse_int, &game_theme.inv_w, CHANGED_INV }, { "inv.h", parse_int, &game_theme.inv_h, CHANGED_INV }, { "inv.mode", parse_inv_mode, &game_theme.inv_mode, CHANGED_INV }, { "inv.horiz", parse_inv_mode, &game_theme.inv_mode, CHANGED_INV }, { "inv.col.fg", parse_color, &game_theme.icol, CHANGED_INV }, { "inv.col.link", parse_color, &game_theme.ilcol, CHANGED_INV }, { "inv.col.alink", parse_color, &game_theme.iacol, CHANGED_INV }, { "inv.fnt.name", theme_parse_full_path, &game_theme.inv_font_name, CHANGED_IFONT | CHANGED_INV }, { "inv.fnt.size", parse_int, &game_theme.inv_font_size, CHANGED_IFONT | CHANGED_INV }, { "inv.fnt.height", parse_float, &game_theme.inv_font_height, CHANGED_INV }, { "inv.gfx.up", theme_parse_full_path, &game_theme.inv_a_up_name, CHANGED_IUP | CHANGED_INV }, { "inv.gfx.down", theme_parse_full_path, &game_theme.inv_a_down_name, CHANGED_IDOWN | CHANGED_INV}, { "inv.up.x", parse_int, &game_theme.inv_a_up_x, CHANGED_INV }, { "inv.up.y", parse_int, &game_theme.inv_a_up_y, CHANGED_INV }, { "inv.down.x", parse_int, &game_theme.inv_a_down_x, CHANGED_INV }, { "inv.down.y", parse_int, &game_theme.inv_a_down_y, CHANGED_INV }, { "menu.col.bg", parse_color, &game_theme.menu_bg, 0 }, { "menu.col.fg", parse_color, &game_theme.menu_fg, 0 }, { "menu.col.link", parse_color, &game_theme.menu_link, 0 }, { "menu.col.alink", parse_color, &game_theme.menu_alink, 0 }, { "menu.col.alpha", parse_int, &game_theme.menu_alpha, 0 }, { "menu.col.border", parse_color, &game_theme.border_col, 0 }, { "menu.bw", parse_int, &game_theme.border_w, 0 }, { "menu.fnt.name", theme_parse_full_path, &game_theme.menu_font_name, CHANGED_MFONT }, { "menu.fnt.size", parse_int, &game_theme.menu_font_size, CHANGED_MFONT }, { "menu.fnt.height", parse_float, &game_theme.menu_font_height, 0 }, { "menu.gfx.button", theme_parse_full_path, &game_theme.menu_button_name, CHANGED_BUTTON }, { "menu.button.x", parse_int, &game_theme.menu_button_x, 0 }, { "menu.button.y", parse_int, &game_theme.menu_button_y, 0 }, /* compat */ { "menu.buttonx", parse_int, &game_theme.menu_button_x, 0 }, { "menu.buttony", parse_int, &game_theme.menu_button_y, 0 }, { "snd.click", theme_parse_full_path, &game_theme.click_name, CHANGED_CLICK }, { "include", parse_include, NULL, 0 }, { NULL, NULL, NULL, 0 }, }; #define TF_POSX 1 #define TF_POSY 2 #define TF_NEG 4 typedef struct { const char *name; int *val; int flags; } theme_scalable_t; static theme_scalable_t theme_scalables[] = { { "scr.w", &game_theme.w, 0 }, { "scr.h", &game_theme.h, 0 }, { "scr.gfx.cursor.x", &game_theme.cur_x, 0 }, { "scr.gfx.cursor.y", &game_theme.cur_y, 0 }, { "scr.gfx.pad", &game_theme.pad, 0 }, { "scr.gfx.x", &game_theme.gfx_x, TF_POSX }, { "scr.gfx.y", &game_theme.gfx_y, TF_POSY }, { "scr.gfx.w", &game_theme.max_scene_w, TF_NEG }, { "scr.gfx.h", &game_theme.max_scene_h, TF_NEG }, { "win.x", &game_theme.win_x, TF_POSX }, { "win.y", &game_theme.win_y, TF_POSY }, { "win.w", &game_theme.win_w, 0 }, { "win.h", &game_theme.win_h, 0 }, { "win.fnt.size", &game_theme.font_size, 0 }, { "inv.x", &game_theme.inv_x, TF_POSX }, { "inv.y", &game_theme.inv_y, TF_POSY }, { "inv.w", &game_theme.inv_w, 0 }, { "inv.h", &game_theme.inv_h, 0 }, { "inv.fnt.size", &game_theme.inv_font_size, 0 }, { "menu.fnt.size", &game_theme.menu_font_size, 0 }, { "menu.button.x", &game_theme.menu_button_x, TF_POSX }, { "menu.button.y", &game_theme.menu_button_y, TF_POSY }, { "win.up.x", &game_theme.a_up_x, TF_POSX | TF_NEG }, { "win.up.y", &game_theme.a_up_y, TF_POSY | TF_NEG }, { "win.down.x", &game_theme.a_down_x, TF_POSX | TF_NEG }, { "win.down.y", &game_theme.a_down_y, TF_POSY | TF_NEG }, { "inv.up.x", &game_theme.inv_a_up_x, TF_POSX | TF_NEG }, { "inv.up.y", &game_theme.inv_a_up_y, TF_POSY | TF_NEG }, { "inv.down.x", &game_theme.inv_a_down_x, TF_POSX | TF_NEG }, { "inv.down.y", &game_theme.inv_a_down_y, TF_POSY | TF_NEG }, { NULL, NULL, 0 }, }; static int theme_scalables_unscaled[sizeof(theme_scalables)/sizeof(theme_scalable_t)]; struct game_theme game_theme = { .scale = 1.0f, .w = 800, .h = 480, .gfx_scalable = 1, .bg_name = NULL, .bg = NULL, .use_name = NULL, .cursor_name = NULL, .icon = NULL, .icon_name = NULL, .use = NULL, .cursor = NULL, .cur_x = 0, .cur_y = 0, .font_name = NULL, .font_height = 1.0f, .font = NULL, .a_up_name = NULL, .a_down_name = NULL, .a_up = NULL, .a_down = NULL, .a_up_x = -1, .a_up_y = -1, .a_down_x = -1, .a_down_y = -1, .inv_font_name = NULL, .inv_font = NULL, .inv_font_height = 1.0f, .inv_a_up_name = NULL, .inv_a_down_name = NULL, .inv_a_up_x = -1, .inv_a_up_y = -1, .inv_a_down_x = -1, .inv_a_down_y = -1, .inv_a_up = NULL, .inv_a_down = NULL, .menu_font_name = NULL, .menu_font_height = 1.0f, .menu_font = NULL, .menu_button_name = NULL, .menu_button = NULL, .win_align = ALIGN_JUSTIFY, .win_scroll_mode = 2, .gfx_mode = GFX_MODE_EMBEDDED, .inv_mode = INV_MODE_VERT | INV_ALIGN_SET(ALIGN_LEFT), .ways_mode = ALIGN_TOP, .click_name = NULL, .click = NULL, .xoff = 0, .yoff = 0, .changed = 0, }; struct game_theme game_theme; static void free_theme_strings(void) { struct game_theme *t = &game_theme; FREE(t->use_name); FREE(t->icon_name); FREE(t->cursor_name); FREE(t->bg_name); FREE(t->inv_a_up_name); FREE(t->inv_a_down_name); FREE(t->a_down_name); FREE(t->a_up_name); FREE(t->font_name); FREE(t->inv_font_name); FREE(t->menu_font_name); FREE(t->menu_button_name); FREE(t->click_name); } int game_theme_free(void) { free_theme_strings(); if (game_theme.font) fnt_free(game_theme.font); if (game_theme.inv_font) fnt_free(game_theme.inv_font); if (game_theme.menu_font) fnt_free(game_theme.menu_font); if (game_theme.a_up) gfx_free_image(game_theme.a_up); if (game_theme.a_down) gfx_free_image(game_theme.a_down); if (game_theme.inv_a_up) gfx_free_image(game_theme.inv_a_up); if (game_theme.inv_a_down) gfx_free_image(game_theme.inv_a_down); if (game_theme.use) gfx_free_image(game_theme.use); if (game_theme.cursor) { gfx_free_image(game_theme.cursor); gfx_set_cursor(NULL, 0, 0); } if (game_theme.bg) gfx_free_image(game_theme.bg); if (game_theme.menu_button) gfx_free_image(game_theme.menu_button); if (game_theme.click) { sound_put(game_theme.click); } if (game_theme.icon) { gfx_set_icon(NULL); gfx_free_image(game_theme.icon); } game_theme.font = game_theme.inv_font = game_theme.menu_font = NULL; game_theme.a_up = game_theme.a_down = game_theme.use = NULL; game_theme.inv_a_up = game_theme.inv_a_down = NULL; game_theme.menu_button = NULL; game_theme.bg = NULL; game_theme.click = NULL; game_theme.cur_x = game_theme.cur_y = 0; game_theme.cursor = game_theme.use = NULL; game_theme.icon = NULL; return 0; } int theme_img_scale(img_t *p) { img_t pic; float v = game_theme.scale; if (!p || !*p || v == 1.0f) return 0; if (!cache_have(gfx_image_cache(), *p)) return 0; /* do not scale sprites! */ pic = gfx_scale(*p, v, v, SCALABLE_THEME_SMOOTH); if (!pic) return -1; gfx_free_image(*p); *p = pic; return 0; } static int game_theme_scale(int w, int h) { int i; float xs, ys, v; int xoff, yoff; struct game_theme *t = &game_theme; if (w < 0 || h < 0 || (w == t->w && h == t->h)) { t->scale = 1.0f; t->xoff = 0; t->yoff = 0; w = t->w; h = t->h; goto out; } xs = (float)w / (float)t->w; ys = (float)h / (float)t->h; v = (xs < ys)?xs:ys; if (!SCALABLE_THEME) { if (v > 1.0f) { int ff = 1; while (ff && ff <= v && ff < 0x1000) ff <<= 1; ff >>= 1; v = ff; } else { float f = ceil(1.0f / v); int ff = 1; while (ff && ff < f && ff < 0x1000) ff <<= 1; v = 1.0f / (float)ff; } } xoff = (w - t->w*v)/2; yoff = (h - t->h*v)/2; if (xoff < 0) xoff = 0; if (yoff < 0) yoff = 0; t->scale = v; t->xoff = xoff; t->yoff = yoff; out: for (i = 0; theme_scalables[i].name; i++) { int val = *(theme_scalables[i].val); theme_scalables_unscaled[i] = val; if (val == -1 && (theme_scalables[i].flags & TF_NEG)) continue; val *= t->scale; if (theme_scalables[i].flags & TF_POSX) val += t->xoff; if (theme_scalables[i].flags & TF_POSY) val += t->yoff; *(theme_scalables[i].val) = val; } t->w = w; t->h = h; return 0; } extern int parse_relative_path; char *theme_getvar(char *name) { int i; for (i = 0; theme_scalables[i].name; i ++) { int val; char buf[64]; if (strcmp(theme_scalables[i].name, name)) continue; val = theme_scalables_unscaled[i]; sprintf(buf, "%d", val); return strdup(buf); } /* so, it is a string or like this */ for (i = 0; cmd_parser[i].cmd; i++) { int *num; char *s; float *f; char buf[64]; if (strcmp(cmd_parser[i].cmd, name)) continue; if (cmd_parser[i].fn == parse_int) { num = (int *)cmd_parser[i].p; sprintf(buf, "%d", *num); return strdup(buf); } else if (cmd_parser[i].fn == theme_parse_full_path) { s = *((char **)cmd_parser[i].p); if (!s) return NULL; return strdup(s); } else if (cmd_parser[i].fn == parse_inv_mode) { if (out_inv_mode(cmd_parser[i].p, &s)) return NULL; return s; } else if (cmd_parser[i].fn == parse_ways_mode) { if (out_ways_mode(cmd_parser[i].p, &s)) return NULL; return s; } else if (cmd_parser[i].fn == parse_gfx_mode) { if (out_gfx_mode(cmd_parser[i].p, &s)) return NULL; return s; } else if (cmd_parser[i].fn == parse_float) { f = (float*)cmd_parser[i].p; sprintf(buf, "%f", *f); return strdup(buf); } else if (cmd_parser[i].fn == parse_color) { if (out_color(cmd_parser[i].p, &s)) return NULL; return s; } else return NULL; break; } return NULL; } static int theme_process_cmd(char *n, char *v, struct parser *cmd_parser) { int i; n = strip(n); v = strip(v); if (process_cmd(n, v, cmd_parser)) return -1; for (i = 0; cmd_parser[i].cmd; i++) { if (!strcmp(cmd_parser[i].cmd, n)) { game_theme.changed |= cmd_parser[i].aux; return 0; } } return -1; } int theme_setvar(char *name, char *val) { int rc = -1; struct game_theme *t = &game_theme; theme_relative = 1; if (!theme_process_cmd(name, val, cmd_parser)) { int i; for (i = 0; theme_scalables[i].name; i++) { int val; if (strcmp(theme_scalables[i].name, name)) continue; val = *(theme_scalables[i].val); theme_scalables_unscaled[i] = val; if (val == -1 && (theme_scalables[i].flags & TF_NEG)) continue; val *= t->scale; if (theme_scalables[i].flags & TF_POSX) val += t->xoff; if (theme_scalables[i].flags & TF_POSY) val += t->yoff; *(theme_scalables[i].val) = val; break; } rc = 0; } theme_relative = 0; return rc; } static int theme_bg_scale(void) { struct game_theme *t = &game_theme; if (t->bg) { img_t screen, pic; int xoff = (t->w - gfx_img_w(t->bg))/2; int yoff = (t->h - gfx_img_h(t->bg))/2; if (xoff < 0) xoff = 0; if (yoff < 0) yoff = 0; if (gfx_img_w(t->bg) < t->w || gfx_img_h(t->bg) < t->h) { pic = gfx_new(t->w, t->h); if (!pic) return -1; screen = gfx_screen(pic); gfx_img_fill(pic, 0, 0, t->w, t->h, gfx_col(0,0,0)); gfx_copy(t->bg, xoff, yoff); gfx_screen(screen); gfx_free_image(t->bg); t->bg = pic; } } return 0; } int game_theme_optimize(void) { /* todo: check errors */ struct game_theme *t = &game_theme; if (t->bg && cache_have(gfx_image_cache(), t->bg)) { t->bg = gfx_display_alpha(t->bg); gfx_unset_alpha(t->bg); } if (t->a_up && cache_have(gfx_image_cache(), t->a_up)) t->a_up = gfx_display_alpha(t->a_up); if (t->a_down && cache_have(gfx_image_cache(), t->a_down)) t->a_down = gfx_display_alpha(t->a_down); if (t->inv_a_up && cache_have(gfx_image_cache(), t->inv_a_up)) t->inv_a_up = gfx_display_alpha(t->inv_a_up); if (t->inv_a_down && cache_have(gfx_image_cache(), t->inv_a_down)) t->inv_a_down = gfx_display_alpha(t->inv_a_down); if (t->use && cache_have(gfx_image_cache(), t->use)) t->use = gfx_display_alpha(t->use); if (t->cursor && cache_have(gfx_image_cache(), t->cursor)) { t->cursor = gfx_display_alpha(t->cursor); gfx_set_cursor(t->cursor, t->cur_x, t->cur_y); } if (t->menu_button && cache_have(gfx_image_cache(), t->menu_button)) t->menu_button = gfx_display_alpha(t->menu_button); return 0; } static int game_theme_update_data(void) { struct game_theme *t = &game_theme; const char *res = NULL; int idf = idf_only(instead_idf(), 0); if (t->font_name && (t->changed & CHANGED_FONT)) { fnt_free(t->font); if (!(t->font = fnt_load(t->font_name, FONT_SZ(t->font_size)))) { res = t->font_name; goto err; } } if (t->inv_font_name && (t->changed & CHANGED_IFONT)) { fnt_free(t->inv_font); if (!(t->inv_font = fnt_load(t->inv_font_name, FONT_SZ(t->inv_font_size)))) { res = t->inv_font_name; goto err; } } if (t->menu_font_name && (t->changed & CHANGED_MFONT)) { int m = FONT_SZ(t->inv_font_size); if (MAX_MENU_LINES * m * game_theme.menu_font_height > game_theme.h) m = game_theme.h / MAX_MENU_LINES / game_theme.menu_font_height; else if (m < t->menu_font_size) m = t->menu_font_size; /* fprintf(stderr, "%d %d > %d? %d", (int)FONT_SZ(t->inv_font_size), (int)FONT_SZ(t->inv_font_size) * MAX_MENU_LINES, game_theme.h, m); */ fnt_free(t->menu_font); if (!(t->menu_font = fnt_load(t->menu_font_name, m))) { /* do not scale menu!!! */ res = t->menu_font_name; goto err; } } if (t->a_up_name && (t->changed & CHANGED_UP)) { gfx_free_image(t->a_up); if (!(t->a_up = gfx_load_image(t->a_up_name))) { res = t->a_up_name; goto err; } if (theme_img_scale(&t->a_up)) goto err; } if (t->a_down_name && (t->changed & CHANGED_DOWN)) { gfx_free_image(t->a_down); if (!(t->a_down = gfx_load_image(t->a_down_name))) { res = t->a_down_name; goto err; } if (theme_img_scale(&t->a_down)) goto err; } if (t->inv_a_up_name && (t->changed & CHANGED_IUP)) { gfx_free_image(t->inv_a_up); if (!(t->inv_a_up = gfx_load_image(t->inv_a_up_name))) { res = t->inv_a_up_name; goto err; } if (theme_img_scale(&t->inv_a_up)) goto err; } if (t->inv_a_down_name && (t->changed & CHANGED_IDOWN)) { gfx_free_image(t->inv_a_down); if (!(t->inv_a_down = gfx_load_image(t->inv_a_down_name))) { res = t->inv_a_down_name; goto err; } if (theme_img_scale(&t->inv_a_down)) goto err; } if (t->bg_name && (t->changed & CHANGED_BG)) { gfx_free_image(t->bg); t->bg = NULL; if (t->bg_name[0] && !(t->bg = gfx_load_image(t->bg_name))) { res = t->bg_name; goto skip; /* not fatal */ } if (theme_img_scale(&t->bg)) goto err; if (theme_bg_scale()) goto err; } skip: if (t->icon_name && (t->changed & CHANGED_ICON)) { if (t->icon) gfx_free_image(t->icon); t->icon = gfx_load_image(t->icon_name); } if (t->use_name && (t->changed & CHANGED_USE)) { gfx_free_image(t->use); if (!(t->use = gfx_load_image(t->use_name))) { res = t->use_name; goto err; } if (theme_img_scale(&t->use)) goto err; } if (t->cursor_name && (t->changed & CHANGED_CURSOR)) { gfx_free_image(t->cursor); if (!(t->cursor = gfx_load_image(t->cursor_name))) { res = t->cursor_name; goto err; } if (theme_img_scale(&t->cursor)) goto err; gfx_set_cursor(t->cursor, t->cur_x, t->cur_y); } if (t->menu_button_name && (t->changed & CHANGED_BUTTON)) { gfx_free_image(t->menu_button); if (!(t->menu_button = gfx_load_image(t->menu_button_name))) { res = t->menu_button_name; goto err; } if (theme_img_scale(&t->menu_button)) goto err; } if (t->click_name && (t->changed & CHANGED_CLICK)) { sound_put(t->click); t->click = sound_get(t->click_name); } /* free_theme_strings(); */ /* todo, font */ t->changed = 0; if (!t->cursor || !t->use || !t->inv_a_up || !t->inv_a_down || !t->a_down || !t->a_up || !t->font || !t->inv_font || !t->menu_font || !t->menu_button) { fprintf(stderr,"Can't init theme. Not all required elements are defined.\n"); goto err; } idf_only(instead_idf(), idf); return 0; err: idf_only(instead_idf(), idf); t->changed = 0; game_res_err_msg(res, 1); return -1; } int game_theme_update(void) { game_theme_changed = 0; game_release_theme(0); if (game_theme_update_data()) { fprintf(stderr, "Can not update theme!\n"); game_release_theme(1); game_error(); return -1; } if (game_apply_theme()) { fprintf(stderr, "Can not apply theme!\n"); game_error(); return -1; } return 0; } #if defined(ANDROID) || defined(IOS) || defined(WINRT) || defined(_USE_SWROTATE) extern void rotate_landscape(void); extern void rotate_portrait(void); extern void unlock_rotation(void); #endif int game_theme_init(void) { int w = opt_mode[0]; int h = opt_mode[1]; game_cursor_show = 1; if (opt_fs && opt_hires && !gfx_get_max_mode(&w, &h, MODE_ANY)) { #if defined(IOS) || defined(ANDROID) || defined(WINRT) || defined(_USE_SWROTATE) if ((game_theme.w > game_theme.h && w < h) || (game_theme.w < game_theme.h && w > h)) { /* rotated */ if (gfx_get_max_mode(&w, &h, (game_theme.w > game_theme.h)?MODE_H:MODE_V)) { gfx_get_max_mode(&w, &h, MODE_ANY); /* fallback to any mode */ } } if (game_theme.w > game_theme.h) rotate_landscape(); else if (game_theme.w < game_theme.h) rotate_portrait(); else unlock_rotation(); #endif } #if defined(ANDROID) || defined(IOS) || defined(WINRT) || defined(_USE_SWROTATE) else { unlock_rotation(); } #endif if (w == -1) { /* as theme */ #if !defined(IOS) && !defined(SAILFISHOS) /* always hardware accelerated */ if (gfx_get_max_mode(&w, &h, MODE_ANY) || (game_theme.w <= w && game_theme.h <= h)) { w = opt_mode[0]; h = opt_mode[1]; } #endif } game_theme_scale(w, h); if (gfx_set_mode(game_theme.w, game_theme.h, opt_fs)) { opt_mode[0] = opt_mode[1] = -1; opt_fs = 0; /* safe options */ return -1; } if (game_theme_update_data()) { fprintf(stderr, "Can not init theme!\n"); game_theme_free(); game_theme_select(DEFAULT_THEME); return -1; } gfx_bg(game_theme.bgcol); if (!DIRECT_MODE) game_clear_all(); gfx_flip(); gfx_commit(); return 0; } static int theme_parse_idf(idf_t idf, const char *path) { idff_t idff = NULL; if (idf) idff = idf_open(idf, path); if (idff) { int rc = parse_idff(idff, path, cmd_parser); idf_close(idff); if (rc) fprintf(stderr, "Theme parsed with errors!\n"); return rc; } if (parse_ini(dirpath(path), cmd_parser)) { fprintf(stderr, "Theme parsed with errors!\n"); /* game_theme_free(); */ return -1; } return 0; } int theme_load(const char *name) { idf_t idf = NULL; if (theme_relative) idf = instead_idf(); if (theme_parse_idf(idf, name)) return 0; /* no theme loaded if error in parsing */ return 0; } int theme_load_idf(idf_t idf, const char *name) { if (theme_parse_idf(idf, name)) return 0; /* no theme loaded if error in parsing */ return 0; } struct theme *themes = NULL; int themes_nr = 0; static int is_theme_idf(idf_t idf, const char *path, const char *n) { int rc = 0; char *p = getpath(path, n); char *pp; if (!p) return 0; pp = malloc(strlen(p) + strlen(THEME_FILE) + 1); if (pp) { strcpy(pp, p); strcat(pp, THEME_FILE); if (idf) rc = !idf_access(idf, pp); else rc = !access(pp, R_OK); free(pp); } free(p); return rc; } static int is_theme(const char *path, const char *n) { if (!n) return 0; if (!strcmp("..", n) || !strcmp(".", n)) return 0; return is_theme_idf(NULL, path, n); } static char *theme_name(const char *path, const char *d_name) { char *l; char *p = getfilepath(path, THEME_FILE); if (!p) goto err; l = lookup_lang_tag(p, "Name", ";", opt_lang); free(p); if (l) return l; err: return strdup(d_name); } static char *theme_name_idf(idf_t idf, const char *path, const char *d_name) { char *l; char *p = getfilepath(path, THEME_FILE); if (!p) goto err; l = lookup_lang_tag_idf(idf, p, "Name", ";", opt_lang); free(p); if (l) return l; err: return strdup(d_name); } static int cmp_theme(const void *p1, const void *p2) { const struct theme *t1 = (const struct theme*)p1; const struct theme *t2 = (const struct theme*)p2; if (t1->type != t2->type) return t1->type - t2->type; return strcmp(t1->name, t2->name); } static void themes_sort() { qsort(themes, themes_nr, sizeof(struct theme), cmp_theme); } struct theme *theme_lookup(const char *name, int type); int themes_count(int type) { int rc = 0; int i; for (i = 0; i < themes_nr; i++) rc = rc + (themes[i].type == type); return rc; } int themes_max(int *type) { int n; int count = themes_count(THEME_GLOBAL); if (type) *type = THEME_GLOBAL; if ((n = themes_count(THEME_GAME)) > 0 && opt_owntheme) { count = n; if (type) *type = THEME_GAME; } return count; } void themes_drop(int type) { int new_size; struct theme *new_themes = NULL; int rc, i, k = 0; rc = themes_count(type); if (!rc) return; new_size = (themes_nr - rc) * sizeof(struct theme); if (new_size) new_themes = malloc(new_size); if (!new_themes) { fprintf(stderr, "Fatal: can't alloc memory.\n"); return; } for (i = 0; i < themes_nr; i ++) { if (themes[i].type == type) { free(themes[i].path); free(themes[i].dir); free(themes[i].name); } else { char *p = curtheme_dir[themes[i].type]; new_themes[k++] = themes[i]; if (p && !strlowcmp(p, themes[i].dir)) curtheme_dir[themes[i].type] = p; } } themes_nr = k; curtheme_dir[type] = NULL; free(themes); themes = new_themes; } int themes_lookup_idf(idf_t idf, const char *path, int type) { char *p; idff_t idf_dir; int n = 0, i = 0; struct theme *new_themes; char *idf_de; if (!idf) return -1; idf_dir = idf_opendir(idf, path); if (!idf_dir) return -1; while ((idf_de = idf_readdir(idf_dir))) { if (theme_lookup(idf_de, type)) continue; if (!is_theme_idf(idf, path, idf_de)) continue; n ++; } if (!n) goto out; idf_closedir(idf_dir); idf_dir = idf_opendir(idf, path); if (!idf_dir) return -1; new_themes = realloc(themes, sizeof(struct theme) * (n + themes_nr)); if (!new_themes) { idf_closedir(idf_dir); return -1; } themes = new_themes; while ((idf_de = idf_readdir(idf_dir)) && i < n) { if (theme_lookup(idf_de, type)) continue; if (!is_theme_idf(idf, path, idf_de)) continue; p = getpath(path, idf_de); themes[themes_nr].path = p; themes[themes_nr].dir = strdup(idf_de); themes[themes_nr].name = theme_name_idf(idf, p, idf_de); themes[themes_nr].type = type; themes[themes_nr].idf = 1; themes_nr ++; i ++; } out: idf_closedir(idf_dir); themes_sort(); return 0; } int themes_lookup(const char *path, int type) { char *p; int n = 0, i = 0; DIR *d; struct dirent *de; struct theme *new_themes; if (!path) return 0; d = opendir(path); if (!d) return -1; while ((de = readdir(d))) { if (theme_lookup(de->d_name, type)) continue; if (!is_theme(path, de->d_name)) continue; n ++; } if (!n) goto out; closedir(d); d = opendir(path); if (!d) return -1; new_themes = realloc(themes, sizeof(struct theme) * (n + themes_nr)); if (!new_themes) { closedir(d); return -1; } themes = new_themes; while ((de = readdir(d)) && i < n) { /*if (de->d_type != DT_DIR) continue;*/ if (theme_lookup(de->d_name, type)) continue; if (!is_theme(path, de->d_name)) continue; p = getpath(path, de->d_name); themes[themes_nr].path = p; themes[themes_nr].dir = strdup(de->d_name); themes[themes_nr].name = theme_name(p, de->d_name); themes[themes_nr].type = type; themes[themes_nr].idf = 0; themes_nr ++; i ++; } out: closedir(d); themes_sort(); return 0; } int themes_rename(void) { int i; char cwd[PATH_MAX]; getdir(cwd, sizeof(cwd)); setdir(game_cwd); for (i = 0; i < themes_nr; i++) { FREE(themes[i].name); themes[i].name = theme_name(dirpath(themes[i].path), themes[i].dir); } setdir(cwd); return 0; } struct theme *theme_lookup(const char *name, int type) { int i; if (!name || !*name) { if (themes_nr == 1 && themes[0].type == type) return &themes[0]; return NULL; } for (i = 0; iidf) setdir(game->path); theme_relative = 1; } theme = theme_lookup(name, type); if (!theme) goto err; if (theme->idf) /* cwd is always game_cwd */ strcpy(cwd, idf_getdir(instead_idf())); curtheme_loading = theme; if (theme->idf) { if (idf_setdir(instead_idf(), theme->path)) goto err; if (theme_load_idf(instead_idf(), THEME_FILE)) goto err; } else { if (setdir(theme->path)) goto err; if (theme_load(THEME_FILE)) goto err; } rc = 0; err: curtheme_loading = otheme; if (theme && theme->idf) idf_setdir(instead_idf(), cwd); else setdir(cwd); theme_relative = rel; return rc; } int game_theme_select(const char *name) { struct theme *theme; theme = theme_lookup(name, THEME_GAME); if (theme) { curtheme_dir[THEME_GAME] = theme->dir; game_cfg_save(); return 0; } theme = theme_lookup(name, THEME_GLOBAL); if (!theme) return -1; curtheme_dir[THEME_GLOBAL] = theme->dir; return 0; } int game_default_theme(void) { int rc; rc = game_theme_load(DEFAULT_THEME, THEME_GLOBAL); if (rc) return rc; if (opt_owntheme && themes_count(THEME_GAME) > 0) rc = game_theme_load(DEFAULT_THEME, THEME_GAME); return rc; } instead-3.2.1/src/resources.rc0000644000175000017500000000006513267071774015332 0ustar peterpeterMAINICON ICON DISCARDABLE "../icon/sdl_instead.ico" instead-3.2.1/src/SDL_gfxBlitFunc.h0000644000175000017500000001071613267071774016064 0ustar peterpeter/* SDL_gfxBlitFunc.h: custom blitters Copyright (C) 2001-2012 Andreas Schiffler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Andreas Schiffler -- aschiffler at ferzkopp dot net */ #ifndef _SDL_gfxBlitFunc_h #define _SDL_gfxBlitFunc_h /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus extern "C" { #endif #include #include #include #include extern const unsigned int GFX_ALPHA_ADJUST_ARRAY[256]; /* ---- Function Prototypes */ #ifdef _MSC_VER # if defined(DLL_EXPORT) && !defined(LIBSDL_GFX_DLL_IMPORT) # define SDL_GFXBLITFUNC_SCOPE __declspec(dllexport) # else # ifdef LIBSDL_GFX_DLL_IMPORT # define SDL_GFXBLITFUNC_SCOPE __declspec(dllimport) # endif # endif #endif #ifndef SDL_GFXBLITFUNC_SCOPE # define SDL_GFXBLITFUNC_SCOPE extern #endif SDL_GFXBLITFUNC_SCOPE int SDL_gfxBlitRGBA(SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect); SDL_GFXBLITFUNC_SCOPE int SDL_gfxSetAlpha(SDL_Surface * src, Uint8 a); SDL_GFXBLITFUNC_SCOPE int SDL_gfxMultiplyAlpha(SDL_Surface * src, Uint8 a); /* -------- Macros */ /* Define SDL macros locally as a substitute for an #include "SDL_blit.h", */ /* which doesn't work since the include file doesn't get installed. */ /*! \brief The structure passed to the low level blit functions. */ typedef struct { Uint8 *s_pixels; int s_width; int s_height; int s_skip; Uint8 *d_pixels; int d_width; int d_height; int d_skip; void *aux_data; SDL_PixelFormat *src; Uint8 *table; SDL_PixelFormat *dst; } SDL_gfxBlitInfo; /*! \brief Unwrap RGBA values from a pixel using mask, shift and loss for surface. */ #define GFX_RGBA_FROM_PIXEL(pixel, fmt, r, g, b, a) \ { \ r = ((pixel&fmt->Rmask)>>fmt->Rshift)<Rloss; \ g = ((pixel&fmt->Gmask)>>fmt->Gshift)<Gloss; \ b = ((pixel&fmt->Bmask)>>fmt->Bshift)<Bloss; \ a = ((pixel&fmt->Amask)>>fmt->Ashift)<Aloss; \ } /*! \brief Disassemble buffer pointer into a pixel and separate RGBA values. */ #define GFX_DISASSEMBLE_RGBA(buf, bpp, fmt, pixel, r, g, b, a) \ do { \ pixel = *((Uint32 *)(buf)); \ GFX_RGBA_FROM_PIXEL(pixel, fmt, r, g, b, a); \ pixel &= ~fmt->Amask; \ } while(0) /*! \brief Wrap a pixel from RGBA values using mask, shift and loss for surface. */ #define GFX_PIXEL_FROM_RGBA(pixel, fmt, r, g, b, a) \ { \ pixel = ((r>>fmt->Rloss)<Rshift)| \ ((g>>fmt->Gloss)<Gshift)| \ ((b>>fmt->Bloss)<Bshift)| \ ((a<Aloss)<Ashift); \ } /*! \brief Assemble pixel into buffer pointer from separate RGBA values. */ #define GFX_ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \ { \ Uint32 pixel; \ \ GFX_PIXEL_FROM_RGBA(pixel, fmt, r, g, b, a); \ *((Uint32 *)(buf)) = pixel; \ } /*! \brief Blend the RGB values of two pixels based on a source alpha value. */ #define GFX_ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB) \ do { \ dR = (((sR-dR)*(A))/255)+dR; \ dG = (((sG-dG)*(A))/255)+dG; \ dB = (((sB-dB)*(A))/255)+dB; \ } while(0) /*! \brief 4-times unrolled DUFFs loop. This is a very useful loop for optimizing blitters. */ #define GFX_DUFFS_LOOP4(pixel_copy_increment, width) \ { int n = (width+3)/4; \ switch (width & 3) { \ case 0: do { pixel_copy_increment; /* fall through */ \ case 3: pixel_copy_increment; /* fall through */ \ case 2: pixel_copy_increment; /* fall through */ \ case 1: pixel_copy_increment; \ } while ( --n > 0 ); \ } \ } /* Ends C function definitions when using C++ */ #ifdef __cplusplus } #endif #endif /* _SDL_gfxBlitFunc_h */ instead-3.2.1/src/internals.h0000644000175000017500000000041113267071774015135 0ustar peterpeter#ifdef S60 #include "s60.h" #endif #ifdef __IPHONEOS__ #include "ios.h" #endif #include "utils.h" #include "graphics.h" #include "sound.h" #include "game.h" #include "themes.h" #include "menu.h" #include "config.h" #include "input.h" #include "instead/instead.h" instead-3.2.1/src/SDL_rotozoom.c0000644000175000017500000012231713267071774015535 0ustar peterpeter#include #if SDL_VERSION_ATLEAST(2,0,0) #include "SDL2_rotozoom.c" #else /* SDL_rotozoom.c: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces Copyright (C) 2001-2012 Andreas Schiffler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Andreas Schiffler -- aschiffler at ferzkopp dot net */ #ifdef WIN32 #include #endif #include #include #include "SDL_rotozoom.h" /* ---- Internally used structures */ /*! \brief A 32 bit RGBA pixel. */ typedef struct tColorRGBA { Uint8 r; Uint8 g; Uint8 b; Uint8 a; } tColorRGBA; /*! \brief A 8bit Y/palette pixel. */ typedef struct tColorY { Uint8 y; } tColorY; /*! \brief Returns maximum of two numbers a and b. */ #define MAX(a,b) (((a) > (b)) ? (a) : (b)) /*! \brief Number of guard rows added to destination surfaces. This is a simple but effective workaround for observed issues. These rows allocate extra memory and are then hidden from the surface. Rows are added to the end of destination surfaces when they are allocated. This catches any potential overflows which seem to happen with just the right src image dimensions and scale/rotation and can lead to a situation where the program can segfault. */ #define GUARD_ROWS (2) /*! \brief Lower limit of absolute zoom factor or rotation degrees. */ #define VALUE_LIMIT 0.001 /*! \brief Returns colorkey info for a surface */ Uint32 _colorkey(SDL_Surface *src) { Uint32 key = 0; #if (SDL_MINOR_VERSION == 3) SDL_GetColorKey(src, &key); #else if (src) { key = src->format->colorkey; } #endif return key; } /*! \brief Internal 32 bit integer-factor averaging Shrinker. Shrinks 32 bit RGBA/ABGR 'src' surface to 'dst' surface. Averages color and alpha values values of src pixels to calculate dst pixels. Assumes src and dst surfaces are of 32 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to shrink (input). \param dst The shrunken surface (output). \param factorx The horizontal shrinking ratio. \param factory The vertical shrinking ratio. \return 0 for success or -1 for error. */ int _shrinkSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int factorx, int factory) { int x, y, dx, dy, dgap, ra, ga, ba, aa; int n_average; tColorRGBA *sp, *osp, *oosp; tColorRGBA *dp; /* * Averaging integer shrink */ /* Precalculate division factor */ n_average = factorx*factory; /* * Scan destination */ sp = (tColorRGBA *) src->pixels; /* sgap = src->pitch - src->w * 4; */ dp = (tColorRGBA *) dst->pixels; dgap = dst->pitch - dst->w * 4; for (y = 0; y < dst->h; y++) { osp=sp; for (x = 0; x < dst->w; x++) { /* Trace out source box and accumulate */ oosp=sp; ra=ga=ba=aa=0; for (dy=0; dy < factory; dy++) { for (dx=0; dx < factorx; dx++) { ra += sp->r; ga += sp->g; ba += sp->b; aa += sp->a; sp++; } /* src dx loop */ sp = (tColorRGBA *)((Uint8*)sp + (src->pitch - 4*factorx)); /* next y */ } /* src dy loop */ /* next box-x */ sp = (tColorRGBA *)((Uint8*)oosp + 4*factorx); /* Store result in destination */ dp->r = ra/n_average; dp->g = ga/n_average; dp->b = ba/n_average; dp->a = aa/n_average; /* * Advance destination pointer */ dp++; } /* dst x loop */ /* next box-y */ sp = (tColorRGBA *)((Uint8*)osp + src->pitch*factory); /* * Advance destination pointers */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } /* dst y loop */ return (0); } /*! \brief Internal 8 bit integer-factor averaging shrinker. Shrinks 8bit Y 'src' surface to 'dst' surface. Averages color (brightness) values values of src pixels to calculate dst pixels. Assumes src and dst surfaces are of 8 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to shrink (input). \param dst The shrunken surface (output). \param factorx The horizontal shrinking ratio. \param factory The vertical shrinking ratio. \return 0 for success or -1 for error. */ int _shrinkSurfaceY(SDL_Surface * src, SDL_Surface * dst, int factorx, int factory) { int x, y, dx, dy, dgap, a; int n_average; Uint8 *sp, *osp, *oosp; Uint8 *dp; /* * Averaging integer shrink */ /* Precalculate division factor */ n_average = factorx*factory; /* * Scan destination */ sp = (Uint8 *) src->pixels; /* sgap = src->pitch - src->w; */ dp = (Uint8 *) dst->pixels; dgap = dst->pitch - dst->w; for (y = 0; y < dst->h; y++) { osp=sp; for (x = 0; x < dst->w; x++) { /* Trace out source box and accumulate */ oosp=sp; a=0; for (dy=0; dy < factory; dy++) { for (dx=0; dx < factorx; dx++) { a += (*sp); /* next x */ sp++; } /* end src dx loop */ /* next y */ sp = (Uint8 *)((Uint8*)sp + (src->pitch - factorx)); } /* end src dy loop */ /* next box-x */ sp = (Uint8 *)((Uint8*)oosp + factorx); /* Store result in destination */ *dp = a/n_average; /* * Advance destination pointer */ dp++; } /* end dst x loop */ /* next box-y */ sp = (Uint8 *)((Uint8*)osp + src->pitch*factory); /* * Advance destination pointers */ dp = (Uint8 *)((Uint8 *)dp + dgap); } /* end dst y loop */ return (0); } /*! \brief Internal 32 bit Zoomer with optional anti-aliasing by bilinear interpolation. Zooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface. Assumes src and dst surfaces are of 32 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to zoom (input). \param dst The zoomed surface (output). \param flipx Flag indicating if the image should be horizontally flipped. \param flipy Flag indicating if the image should be vertically flipped. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return 0 for success or -1 for error. */ int _zoomSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int flipx, int flipy, int smooth) { int x, y, sx, sy, ssx, ssy, *sax, *say, *csax, *csay, *salast, csx, csy, ex, ey, cx, cy, sstep, sstepx, sstepy; tColorRGBA *c00, *c01, *c10, *c11; tColorRGBA *sp, *csp, *dp; int spixelgap, spixelw, spixelh, dgap, t1, t2; /* * Allocate memory for row/column increments */ if ((sax = (Sint32 *) malloc((dst->w + 1) * sizeof(Sint32))) == NULL) { return (-1); } if ((say = (Sint32 *) malloc((dst->h + 1) * sizeof(Sint32))) == NULL) { free(sax); return (-1); } /* * Precalculate row increments */ spixelw = (src->w - 1); spixelh = (src->h - 1); if (smooth) { sx = (int) (65536.0 * (float) spixelw / (float) (dst->w - 1)); sy = (int) (65536.0 * (float) spixelh / (float) (dst->h - 1)); } else { sx = (int) (65536.0 * (float) (src->w) / (float) (dst->w)); sy = (int) (65536.0 * (float) (src->h) / (float) (dst->h)); } /* Maximum scaled source size */ ssx = (src->w << 16) - 1; ssy = (src->h << 16) - 1; /* Precalculate horizontal row increments */ csx = 0; csax = sax; for (x = 0; x <= dst->w; x++) { *csax = csx; csax++; csx += sx; /* Guard from overflows */ if (csx > ssx) { csx = ssx; } } /* Precalculate vertical row increments */ csy = 0; csay = say; for (y = 0; y <= dst->h; y++) { *csay = csy; csay++; csy += sy; /* Guard from overflows */ if (csy > ssy) { csy = ssy; } } sp = (tColorRGBA *) src->pixels; dp = (tColorRGBA *) dst->pixels; dgap = dst->pitch - dst->w * 4; spixelgap = src->pitch/4; if (flipx) sp += spixelw; if (flipy) sp += (spixelgap * spixelh); /* * Switch between interpolating and non-interpolating code */ if (smooth) { /* * Interpolating Zoom */ csay = say; for (y = 0; y < dst->h; y++) { csp = sp; csax = sax; for (x = 0; x < dst->w; x++) { /* * Setup color source pointers */ ex = (*csax & 0xffff); ey = (*csay & 0xffff); cx = (*csax >> 16); cy = (*csay >> 16); sstepx = cx < spixelw; sstepy = cy < spixelh; c00 = sp; c01 = sp; c10 = sp; if (sstepy) { if (flipy) { c10 -= spixelgap; } else { c10 += spixelgap; } } c11 = c10; if (sstepx) { if (flipx) { c01--; c11--; } else { c01++; c11++; } } /* * Draw and interpolate colors */ t1 = ((((c01->r - c00->r) * ex) >> 16) + c00->r) & 0xff; t2 = ((((c11->r - c10->r) * ex) >> 16) + c10->r) & 0xff; dp->r = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->g - c00->g) * ex) >> 16) + c00->g) & 0xff; t2 = ((((c11->g - c10->g) * ex) >> 16) + c10->g) & 0xff; dp->g = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->b - c00->b) * ex) >> 16) + c00->b) & 0xff; t2 = ((((c11->b - c10->b) * ex) >> 16) + c10->b) & 0xff; dp->b = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01->a - c00->a) * ex) >> 16) + c00->a) & 0xff; t2 = ((((c11->a - c10->a) * ex) >> 16) + c10->a) & 0xff; dp->a = (((t2 - t1) * ey) >> 16) + t1; /* * Advance source pointer x */ salast = csax; csax++; sstep = (*csax >> 16) - (*salast >> 16); if (flipx) { sp -= sstep; } else { sp += sstep; } /* * Advance destination pointer x */ dp++; } /* * Advance source pointer y */ salast = csay; csay++; sstep = (*csay >> 16) - (*salast >> 16); sstep *= spixelgap; if (flipy) { sp = csp - sstep; } else { sp = csp + sstep; } /* * Advance destination pointer y */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } } else { /* * Non-Interpolating Zoom */ csay = say; for (y = 0; y < dst->h; y++) { csp = sp; csax = sax; for (x = 0; x < dst->w; x++) { /* * Draw */ *dp = *sp; /* * Advance source pointer x */ salast = csax; csax++; sstep = (*csax >> 16) - (*salast >> 16); if (flipx) sstep = -sstep; sp += sstep; /* * Advance destination pointer x */ dp++; } /* * Advance source pointer y */ salast = csay; csay++; sstep = (*csay >> 16) - (*salast >> 16); sstep *= spixelgap; if (flipy) sstep = -sstep; sp = csp + sstep; /* * Advance destination pointer y */ dp = (tColorRGBA *) ((Uint8 *) dp + dgap); } } /* * Remove temp arrays */ free(sax); free(say); return (0); } /*! \brief Internal 8 bit Zoomer without smoothing. Zooms 8bit palette/Y 'src' surface to 'dst' surface. Assumes src and dst surfaces are of 8 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src The surface to zoom (input). \param dst The zoomed surface (output). \param flipx Flag indicating if the image should be horizontally flipped. \param flipy Flag indicating if the image should be vertically flipped. \return 0 for success or -1 for error. */ int _zoomSurfaceY(SDL_Surface * src, SDL_Surface * dst, int flipx, int flipy) { int x, y; Uint32 *sax, *say, *csax, *csay; int csx, csy; Uint8 *sp, *dp, *csp; int dgap; /* * Allocate memory for row increments */ if ((sax = (Uint32 *) malloc((dst->w + 1) * sizeof(Uint32))) == NULL) { return (-1); } if ((say = (Uint32 *) malloc((dst->h + 1) * sizeof(Uint32))) == NULL) { free(sax); return (-1); } /* * Pointer setup */ csp = (Uint8 *) src->pixels; dp = (Uint8 *) dst->pixels; dgap = dst->pitch - dst->w; if (flipx) csp += (src->w-1); if (flipy) csp = ( (Uint8*)csp + src->pitch*(src->h-1) ); /* * Precalculate row increments */ csx = 0; csax = sax; for (x = 0; x < dst->w; x++) { csx += src->w; *csax = 0; while (csx >= dst->w) { csx -= dst->w; (*csax)++; } (*csax) = (*csax) * (flipx ? -1 : 1); csax++; } csy = 0; csay = say; for (y = 0; y < dst->h; y++) { csy += src->h; *csay = 0; while (csy >= dst->h) { csy -= dst->h; (*csay)++; } (*csay) = (*csay) * (flipy ? -1 : 1); csay++; } /* * Draw */ csay = say; for (y = 0; y < dst->h; y++) { csax = sax; sp = csp; for (x = 0; x < dst->w; x++) { /* * Draw */ *dp = *sp; /* * Advance source pointers */ sp += (*csax); csax++; /* * Advance destination pointer */ dp++; } /* * Advance source pointer (for row) */ csp += ((*csay) * src->pitch); csay++; /* * Advance destination pointers */ dp += dgap; } /* * Remove temp arrays */ free(sax); free(say); return (0); } /*! \brief Internal 32 bit rotozoomer with optional anti-aliasing. Rotates and zooms 32 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control parameters by scanning the destination surface and applying optionally anti-aliasing by bilinear interpolation. Assumes src and dst surfaces are of 32 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src Source surface. \param dst Destination surface. \param cx Horizontal center coordinate. \param cy Vertical center coordinate. \param isin Integer version of sine of angle. \param icos Integer version of cosine of angle. \param flipx Flag indicating horizontal mirroring should be applied. \param flipy Flag indicating vertical mirroring should be applied. \param smooth Flag indicating anti-aliasing should be used. */ void _transformSurfaceRGBA(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy, int smooth) { int x, y, t1, t2, dx, dy, xd, yd, sdx, sdy, ax, ay, ex, ey, sw, sh; tColorRGBA c00, c01, c10, c11, cswap; tColorRGBA *pc, *sp; int gap; /* * Variable setup */ xd = ((src->w - dst->w) << 15); yd = ((src->h - dst->h) << 15); ax = (cx << 16) - (icos * cx); ay = (cy << 16) - (isin * cx); sw = src->w - 1; sh = src->h - 1; pc = (tColorRGBA*) dst->pixels; gap = dst->pitch - dst->w * 4; /* * Switch between interpolating and non-interpolating code */ if (smooth) { for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (sdx >> 16); dy = (sdy >> 16); if (flipx) dx = sw - dx; if (flipy) dy = sh - dy; if ((dx > -1) && (dy > -1) && (dx < (src->w-1)) && (dy < (src->h-1))) { sp = (tColorRGBA *)src->pixels;; sp += ((src->pitch/4) * dy); sp += dx; c00 = *sp; sp += 1; c01 = *sp; sp += (src->pitch/4); c11 = *sp; sp -= 1; c10 = *sp; if (flipx) { cswap = c00; c00=c01; c01=cswap; cswap = c10; c10=c11; c11=cswap; } if (flipy) { cswap = c00; c00=c10; c10=cswap; cswap = c01; c01=c11; c11=cswap; } /* * Interpolate colors */ ex = (sdx & 0xffff); ey = (sdy & 0xffff); t1 = ((((c01.r - c00.r) * ex) >> 16) + c00.r) & 0xff; t2 = ((((c11.r - c10.r) * ex) >> 16) + c10.r) & 0xff; pc->r = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.g - c00.g) * ex) >> 16) + c00.g) & 0xff; t2 = ((((c11.g - c10.g) * ex) >> 16) + c10.g) & 0xff; pc->g = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.b - c00.b) * ex) >> 16) + c00.b) & 0xff; t2 = ((((c11.b - c10.b) * ex) >> 16) + c10.b) & 0xff; pc->b = (((t2 - t1) * ey) >> 16) + t1; t1 = ((((c01.a - c00.a) * ex) >> 16) + c00.a) & 0xff; t2 = ((((c11.a - c10.a) * ex) >> 16) + c10.a) & 0xff; pc->a = (((t2 - t1) * ey) >> 16) + t1; } sdx += icos; sdy += isin; pc++; } pc = (tColorRGBA *) ((Uint8 *) pc + gap); } } else { for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (short) (sdx >> 16); dy = (short) (sdy >> 16); if (flipx) dx = (src->w-1)-dx; if (flipy) dy = (src->h-1)-dy; if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) { sp = (tColorRGBA *) ((Uint8 *) src->pixels + src->pitch * dy); sp += dx; *pc = *sp; } sdx += icos; sdy += isin; pc++; } pc = (tColorRGBA *) ((Uint8 *) pc + gap); } } } /*! \brief Rotates and zooms 8 bit palette/Y 'src' surface to 'dst' surface without smoothing. Rotates and zooms 8 bit RGBA/ABGR 'src' surface to 'dst' surface based on the control parameters by scanning the destination surface. Assumes src and dst surfaces are of 8 bit depth. Assumes dst surface was allocated with the correct dimensions. \param src Source surface. \param dst Destination surface. \param cx Horizontal center coordinate. \param cy Vertical center coordinate. \param isin Integer version of sine of angle. \param icos Integer version of cosine of angle. \param flipx Flag indicating horizontal mirroring should be applied. \param flipy Flag indicating vertical mirroring should be applied. */ void transformSurfaceY(SDL_Surface * src, SDL_Surface * dst, int cx, int cy, int isin, int icos, int flipx, int flipy) { int x, y, dx, dy, xd, yd, sdx, sdy, ax, ay; tColorY *pc, *sp; int gap; /* * Variable setup */ xd = ((src->w - dst->w) << 15); yd = ((src->h - dst->h) << 15); ax = (cx << 16) - (icos * cx); ay = (cy << 16) - (isin * cx); /* sw = src->w - 1; sh = src->h - 1; */ pc = (tColorY*) dst->pixels; gap = dst->pitch - dst->w; /* * Clear surface to colorkey */ memset(pc, (int)(_colorkey(src) & 0xff), dst->pitch * dst->h); /* * Iterate through destination surface */ for (y = 0; y < dst->h; y++) { dy = cy - y; sdx = (ax + (isin * dy)) + xd; sdy = (ay - (icos * dy)) + yd; for (x = 0; x < dst->w; x++) { dx = (short) (sdx >> 16); dy = (short) (sdy >> 16); if (flipx) dx = (src->w-1)-dx; if (flipy) dy = (src->h-1)-dy; if ((dx >= 0) && (dy >= 0) && (dx < src->w) && (dy < src->h)) { sp = (tColorY *) (src->pixels); sp += (src->pitch * dy + dx); *pc = *sp; } sdx += icos; sdy += isin; pc++; } pc += gap; } } /*! \brief Rotates a 32 bit surface in increments of 90 degrees. Specialized 90 degree rotator which rotates a 'src' surface in 90 degree increments clockwise returning a new surface. Faster than rotozoomer since not scanning or interpolation takes place. Input surface must be 32 bit. (code contributed by J. Schiller, improved by C. Allport and A. Schiffler) \param src Source surface to rotate. \param numClockwiseTurns Number of clockwise 90 degree turns to apply to the source. \returns The new, rotated surface; or NULL for surfaces with incorrect input format. */ SDL_Surface* rotateSurface90Degrees(SDL_Surface* src, int numClockwiseTurns) { int row, col, newWidth, newHeight; int bpp, src_ipr, dst_ipr; SDL_Surface* dst; Uint32* srcBuf; Uint32* dstBuf; /* Has to be a valid surface pointer and only 32-bit surfaces (for now) */ if (!src || src->format->BitsPerPixel != 32) { return NULL; } /* normalize numClockwiseTurns */ while(numClockwiseTurns < 0) { numClockwiseTurns += 4; } numClockwiseTurns = (numClockwiseTurns % 4); /* if it's even, our new width will be the same as the source surface */ newWidth = (numClockwiseTurns % 2) ? (src->h) : (src->w); newHeight = (numClockwiseTurns % 2) ? (src->w) : (src->h); dst = SDL_CreateRGBSurface( src->flags, newWidth, newHeight, src->format->BitsPerPixel, src->format->Rmask, src->format->Gmask, src->format->Bmask, src->format->Amask); if(!dst) { return NULL; } if (SDL_MUSTLOCK(dst)) { SDL_LockSurface(dst); } if (SDL_MUSTLOCK(dst)) { SDL_LockSurface(dst); } /* Calculate int-per-row */ bpp = src->format->BitsPerPixel / 8; src_ipr = src->pitch / bpp; dst_ipr = dst->pitch / bpp; switch(numClockwiseTurns) { case 0: /* Make a copy of the surface */ { /* Unfortunately SDL_BlitSurface cannot be used to make a copy of the surface since it does not preserve alpha. */ if (src->pitch == dst->pitch) { /* If the pitch is the same for both surfaces, the memory can be copied all at once. */ memcpy(dst->pixels, src->pixels, (src->h * src->pitch)); } else { /* If the pitch differs, copy each row separately */ srcBuf = (Uint32*)(src->pixels); dstBuf = (Uint32*)(dst->pixels); for (row = 0; row < src->h; row++) { memcpy(dstBuf, srcBuf, dst->w * bpp); srcBuf += src_ipr; dstBuf += dst_ipr; } /* end for(col) */ } /* end for(row) */ } break; /* rotate clockwise */ case 1: /* rotated 90 degrees clockwise */ { for (row = 0; row < src->h; ++row) { srcBuf = (Uint32*)(src->pixels) + (row * src_ipr); dstBuf = (Uint32*)(dst->pixels) + (dst->w - row - 1); for (col = 0; col < src->w; ++col) { *dstBuf = *srcBuf; ++srcBuf; dstBuf += dst_ipr; } /* end for(col) */ } /* end for(row) */ } break; case 2: /* rotated 180 degrees clockwise */ { for (row = 0; row < src->h; ++row) { srcBuf = (Uint32*)(src->pixels) + (row * src_ipr); dstBuf = (Uint32*)(dst->pixels) + ((dst->h - row - 1) * dst_ipr) + (dst->w - 1); for (col = 0; col < src->w; ++col) { *dstBuf = *srcBuf; ++srcBuf; --dstBuf; } } } break; case 3: { for (row = 0; row < src->h; ++row) { srcBuf = (Uint32*)(src->pixels) + (row * src_ipr); dstBuf = (Uint32*)(dst->pixels) + row + ((dst->h - 1) * dst_ipr); for (col = 0; col < src->w; ++col) { *dstBuf = *srcBuf; ++srcBuf; dstBuf -= dst_ipr; } } } break; } /* end switch */ if (SDL_MUSTLOCK(src)) { SDL_UnlockSurface(src); } if (SDL_MUSTLOCK(dst)) { SDL_UnlockSurface(dst); } return dst; } /*! \brief Internal target surface sizing function for rotozooms with trig result return. \param width The source surface width. \param height The source surface height. \param angle The angle to rotate in degrees. \param zoomx The horizontal scaling factor. \param zoomy The vertical scaling factor. \param dstwidth The calculated width of the destination surface. \param dstheight The calculated height of the destination surface. \param canglezoom The sine of the angle adjusted by the zoom factor. \param sanglezoom The cosine of the angle adjusted by the zoom factor. */ void _rotozoomSurfaceSizeTrig(int width, int height, double angle, double zoomx, double zoomy, int *dstwidth, int *dstheight, double *canglezoom, double *sanglezoom) { double x, y, cx, cy, sx, sy; double radangle; int dstwidthhalf, dstheighthalf; /* * Determine destination width and height by rotating a centered source box */ radangle = angle * (M_PI / 180.0); *sanglezoom = sin(radangle); *canglezoom = cos(radangle); *sanglezoom *= zoomx; *canglezoom *= zoomx; x = (double)(width / 2); y = (double)(height / 2); cx = *canglezoom * x; cy = *canglezoom * y; sx = *sanglezoom * x; sy = *sanglezoom * y; dstwidthhalf = MAX((int) ceil(MAX(MAX(MAX(fabs(cx + sy), fabs(cx - sy)), fabs(-cx + sy)), fabs(-cx - sy))), 1); dstheighthalf = MAX((int) ceil(MAX(MAX(MAX(fabs(sx + cy), fabs(sx - cy)), fabs(-sx + cy)), fabs(-sx - cy))), 1); *dstwidth = 2 * dstwidthhalf; *dstheight = 2 * dstheighthalf; } /*! \brief Returns the size of the resulting target surface for a rotozoomSurfaceXY() call. \param width The source surface width. \param height The source surface height. \param angle The angle to rotate in degrees. \param zoomx The horizontal scaling factor. \param zoomy The vertical scaling factor. \param dstwidth The calculated width of the rotozoomed destination surface. \param dstheight The calculated height of the rotozoomed destination surface. */ void rotozoomSurfaceSizeXY(int width, int height, double angle, double zoomx, double zoomy, int *dstwidth, int *dstheight) { double dummy_sanglezoom, dummy_canglezoom; _rotozoomSurfaceSizeTrig(width, height, angle, zoomx, zoomy, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom); } /*! \brief Returns the size of the resulting target surface for a rotozoomSurface() call. \param width The source surface width. \param height The source surface height. \param angle The angle to rotate in degrees. \param zoom The scaling factor. \param dstwidth The calculated width of the rotozoomed destination surface. \param dstheight The calculated height of the rotozoomed destination surface. */ void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight) { double dummy_sanglezoom, dummy_canglezoom; _rotozoomSurfaceSizeTrig(width, height, angle, zoom, zoom, dstwidth, dstheight, &dummy_sanglezoom, &dummy_canglezoom); } /*! \brief Rotates and zooms a surface and optional anti-aliasing. Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'angle' is the rotation in degrees and 'zoom' a scaling factor. If 'smooth' is set then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. \param src The surface to rotozoom. \param angle The angle to rotate in degrees. \param zoom The scaling factor. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return The new rotozoomed surface. */ SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth) { return rotozoomSurfaceXY(src, angle, zoom, zoom, smooth); } /*! \brief Rotates and zooms a surface with different horizontal and vertival scaling factors and optional anti-aliasing. Rotates and zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'angle' is the rotation in degrees, 'zoomx and 'zoomy' scaling factors. If 'smooth' is set then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. \param src The surface to rotozoom. \param angle The angle to rotate in degrees. \param zoomx The horizontal scaling factor. \param zoomy The vertical scaling factor. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return The new rotozoomed surface. */ SDL_Surface *rotozoomSurfaceXY(SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth) { SDL_Surface *rz_src; SDL_Surface *rz_dst; double zoominv; double sanglezoom, canglezoom, sanglezoominv, canglezoominv; int dstwidthhalf, dstwidth, dstheighthalf, dstheight; int is32bit; int i, src_converted; int flipx,flipy; Uint8 r,g,b; Uint32 colorkey = 0; int colorKeyAvailable = 0; /* * Sanity check */ if (src == NULL) return (NULL); if (src->flags & SDL_SRCCOLORKEY) { colorkey = _colorkey(src); SDL_GetRGB(colorkey, src->format, &r, &g, &b); colorKeyAvailable = 1; } /* * Determine if source surface is 32bit or 8bit */ is32bit = (src->format->BitsPerPixel == 32); if ((is32bit) || (src->format->BitsPerPixel == 8)) { /* * Use source surface 'as is' */ rz_src = src; src_converted = 0; } else { /* * New source surface is 32bit with a defined RGBA ordering */ rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 #else 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff #endif ); if(colorKeyAvailable) SDL_SetColorKey(src, 0, 0); SDL_BlitSurface(src, NULL, rz_src, NULL); if(colorKeyAvailable) SDL_SetColorKey(src, SDL_SRCCOLORKEY, colorkey); src_converted = 1; is32bit = 1; } /* * Sanity check zoom factor */ flipx = (zoomx<0.0); if (flipx) zoomx=-zoomx; flipy = (zoomy<0.0); if (flipy) zoomy=-zoomy; if (zoomx < VALUE_LIMIT) zoomx = VALUE_LIMIT; if (zoomy < VALUE_LIMIT) zoomy = VALUE_LIMIT; zoominv = 65536.0 / (zoomx * zoomx); /* * Check if we have a rotozoom or just a zoom */ if (fabs(angle) > VALUE_LIMIT) { /* * Angle!=0: full rotozoom */ /* * ----------------------- */ /* Determine target size */ _rotozoomSurfaceSizeTrig(rz_src->w, rz_src->h, angle, zoomx, zoomy, &dstwidth, &dstheight, &canglezoom, &sanglezoom); /* * Calculate target factors from sin/cos and zoom */ sanglezoominv = sanglezoom; canglezoominv = canglezoom; sanglezoominv *= zoominv; canglezoominv *= zoominv; /* Calculate half size */ dstwidthhalf = dstwidth / 2; dstheighthalf = dstheight / 2; /* * Alloc space to completely contain the rotated surface */ rz_dst = NULL; if (is32bit) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) return NULL; /* Adjust for guard rows */ rz_dst->h = dstheight; if (colorKeyAvailable == 1){ colorkey = SDL_MapRGB(rz_dst->format, r, g, b); SDL_FillRect(rz_dst, NULL, colorkey ); } /* * Lock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_LockSurface(rz_src); } /* * Check which kind of surface we have */ if (is32bit) { /* * Call the 32bit transformation routine to do the rotation (using alpha) */ _transformSurfaceRGBA(rz_src, rz_dst, dstwidthhalf, dstheighthalf, (int) (sanglezoominv), (int) (canglezoominv), flipx, flipy, smooth); /* * Turn on source-alpha support */ SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, _colorkey(rz_src)); } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the rotation */ transformSurfaceY(rz_src, rz_dst, dstwidthhalf, dstheighthalf, (int) (sanglezoominv), (int) (canglezoominv), flipx, flipy); SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, _colorkey(rz_src)); } /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } } else { /* * Angle=0: Just a zoom */ /* * -------------------- */ /* * Calculate target size */ zoomSurfaceSize(rz_src->w, rz_src->h, zoomx, zoomy, &dstwidth, &dstheight); /* * Alloc space to completely contain the zoomed surface */ rz_dst = NULL; if (is32bit) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) return NULL; /* Adjust for guard rows */ rz_dst->h = dstheight; if (colorKeyAvailable == 1){ colorkey = SDL_MapRGB(rz_dst->format, r, g, b); SDL_FillRect(rz_dst, NULL, colorkey ); } /* * Lock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_LockSurface(rz_src); } /* * Check which kind of surface we have */ if (is32bit) { /* * Call the 32bit transformation routine to do the zooming (using alpha) */ _zoomSurfaceRGBA(rz_src, rz_dst, flipx, flipy, smooth); /* * Turn on source-alpha support */ SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, _colorkey(rz_src)); } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the zooming */ _zoomSurfaceY(rz_src, rz_dst, flipx, flipy); SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, _colorkey(rz_src)); } /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } } /* * Cleanup temp surface */ if (src_converted) { SDL_FreeSurface(rz_src); } /* * Return destination surface */ return (rz_dst); } /*! \brief Calculates the size of the target surface for a zoomSurface() call. The minimum size of the target surface is 1. The input factors can be positive or negative. \param width The width of the source surface to zoom. \param height The height of the source surface to zoom. \param zoomx The horizontal zoom factor. \param zoomy The vertical zoom factor. \param dstwidth Pointer to an integer to store the calculated width of the zoomed target surface. \param dstheight Pointer to an integer to store the calculated height of the zoomed target surface. */ void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight) { /* * Make zoom factors positive */ int flipx, flipy; flipx = (zoomx<0.0); if (flipx) zoomx = -zoomx; flipy = (zoomy<0.0); if (flipy) zoomy = -zoomy; /* * Sanity check zoom factors */ if (zoomx < VALUE_LIMIT) { zoomx = VALUE_LIMIT; } if (zoomy < VALUE_LIMIT) { zoomy = VALUE_LIMIT; } /* * Calculate target size */ *dstwidth = (int) floor(((double) width * zoomx) + 0.5); *dstheight = (int) floor(((double) height * zoomy) + 0.5); if (*dstwidth < 1) { *dstwidth = 1; } if (*dstheight < 1) { *dstheight = 1; } } /*! \brief Zoom a surface by independent horizontal and vertical factors with optional smoothing. Zooms a 32bit or 8bit 'src' surface to newly created 'dst' surface. 'zoomx' and 'zoomy' are scaling factors for width and height. If 'smooth' is on then the destination 32bit surface is anti-aliased. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. If zoom factors are negative, the image is flipped on the axes. \param src The surface to zoom. \param zoomx The horizontal zoom factor. \param zoomy The vertical zoom factor. \param smooth Antialiasing flag; set to SMOOTHING_ON to enable. \return The new, zoomed surface. */ SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth) { SDL_Surface *rz_src; SDL_Surface *rz_dst; int dstwidth, dstheight; int is32bit; int i, src_converted; int flipx, flipy; /* * Sanity check */ if (src == NULL) return (NULL); /* * Determine if source surface is 32bit or 8bit */ is32bit = (src->format->BitsPerPixel == 32); if ((is32bit) || (src->format->BitsPerPixel == 8)) { /* * Use source surface 'as is' */ rz_src = src; src_converted = 0; } else { /* * New source surface is 32bit with a defined RGBA ordering */ rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 #else 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff #endif ); if (rz_src == NULL) { return NULL; } SDL_BlitSurface(src, NULL, rz_src, NULL); src_converted = 1; is32bit = 1; } flipx = (zoomx<0.0); if (flipx) zoomx = -zoomx; flipy = (zoomy<0.0); if (flipy) zoomy = -zoomy; /* Get size if target */ zoomSurfaceSize(rz_src->w, rz_src->h, zoomx, zoomy, &dstwidth, &dstheight); /* * Alloc space to completely contain the zoomed surface */ rz_dst = NULL; if (is32bit) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) { /* * Cleanup temp surface */ if (src_converted) { SDL_FreeSurface(rz_src); } return NULL; } /* Adjust for guard rows */ rz_dst->h = dstheight; /* * Lock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_LockSurface(rz_src); } /* * Check which kind of surface we have */ if (is32bit) { /* * Call the 32bit transformation routine to do the zooming (using alpha) */ _zoomSurfaceRGBA(rz_src, rz_dst, flipx, flipy, smooth); /* * Turn on source-alpha support */ SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the zooming */ _zoomSurfaceY(rz_src, rz_dst, flipx, flipy); SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, _colorkey(rz_src)); } /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } /* * Cleanup temp surface */ if (src_converted) { SDL_FreeSurface(rz_src); } /* * Return destination surface */ return (rz_dst); } /*! \brief Shrink a surface by an integer ratio using averaging. Shrinks a 32bit or 8bit 'src' surface to a newly created 'dst' surface. 'factorx' and 'factory' are the shrinking ratios (i.e. 2=1/2 the size, 3=1/3 the size, etc.) The destination surface is antialiased by averaging the source box RGBA or Y information. If the surface is not 8bit or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly. The input surface is not modified. The output surface is newly allocated. \param src The surface to shrink. \param factorx The horizontal shrinking ratio. \param factory The vertical shrinking ratio. \return The new, shrunken surface. */ /*@null@*/ SDL_Surface *shrinkSurface(SDL_Surface *src, int factorx, int factory) { int result; SDL_Surface *rz_src; SDL_Surface *rz_dst = NULL; int dstwidth, dstheight; int is32bit; int i, src_converted; int haveError = 0; /* * Sanity check */ if (src == NULL) { return (NULL); } /* * Determine if source surface is 32bit or 8bit */ is32bit = (src->format->BitsPerPixel == 32); if ((is32bit) || (src->format->BitsPerPixel == 8)) { /* * Use source surface 'as is' */ rz_src = src; src_converted = 0; } else { /* * New source surface is 32bit with a defined RGBA ordering */ rz_src = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 32, #if SDL_BYTEORDER == SDL_LIL_ENDIAN 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 #else 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff #endif ); if (rz_src==NULL) { haveError = 1; goto exitShrinkSurface; } SDL_BlitSurface(src, NULL, rz_src, NULL); src_converted = 1; is32bit = 1; } /* * Lock the surface */ if (SDL_MUSTLOCK(rz_src)) { if (SDL_LockSurface(rz_src) < 0) { haveError = 1; goto exitShrinkSurface; } } /* Get size for target */ dstwidth=rz_src->w/factorx; while (dstwidth*factorx>rz_src->w) { dstwidth--; } dstheight=rz_src->h/factory; while (dstheight*factory>rz_src->h) { dstheight--; } /* * Alloc space to completely contain the shrunken surface * (with added guard rows) */ if (is32bit==1) { /* * Target surface is 32bit with source RGBA/ABGR ordering */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 32, rz_src->format->Rmask, rz_src->format->Gmask, rz_src->format->Bmask, rz_src->format->Amask); } else { /* * Target surface is 8bit */ rz_dst = SDL_CreateRGBSurface(SDL_SWSURFACE, dstwidth, dstheight + GUARD_ROWS, 8, 0, 0, 0, 0); } /* Check target */ if (rz_dst == NULL) { haveError = 1; goto exitShrinkSurface; } /* Adjust for guard rows */ rz_dst->h = dstheight; /* * Check which kind of surface we have */ if (is32bit==1) { /* * Call the 32bit transformation routine to do the shrinking (using alpha) */ result = _shrinkSurfaceRGBA(rz_src, rz_dst, factorx, factory); if ((result!=0) || (rz_dst==NULL)) { haveError = 1; goto exitShrinkSurface; } /* * Turn on source-alpha support */ result = SDL_SetAlpha(rz_dst, SDL_SRCALPHA, 255); if (result!=0) { haveError = 1; goto exitShrinkSurface; } } else { /* * Copy palette and colorkey info */ for (i = 0; i < rz_src->format->palette->ncolors; i++) { rz_dst->format->palette->colors[i] = rz_src->format->palette->colors[i]; } rz_dst->format->palette->ncolors = rz_src->format->palette->ncolors; /* * Call the 8bit transformation routine to do the shrinking */ result = _shrinkSurfaceY(rz_src, rz_dst, factorx, factory); if (result!=0) { haveError = 1; goto exitShrinkSurface; } /* * Set colorkey on target */ result = SDL_SetColorKey(rz_dst, SDL_SRCCOLORKEY | SDL_RLEACCEL, _colorkey(rz_src)); if (result!=0) { haveError = 1; goto exitShrinkSurface; } } exitShrinkSurface: if (rz_src!=NULL) { /* * Unlock source surface */ if (SDL_MUSTLOCK(rz_src)) { SDL_UnlockSurface(rz_src); } /* * Cleanup temp surface */ if (src_converted==1) { SDL_FreeSurface(rz_src); } } /* Check error state; maybe need to cleanup destination */ if (haveError==1) { if (rz_dst!=NULL) { SDL_FreeSurface(rz_dst); } rz_dst=NULL; } /* * Return destination surface */ return (rz_dst); } #endif instead-3.2.1/src/SDL2_rotozoom.h0000644000175000017500000000567013267071774015626 0ustar peterpeter/* SDL2_rotozoom.c: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces Copyright (C) 2001-2012 Andreas Schiffler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Andreas Schiffler -- aschiffler at ferzkopp dot net */ #ifndef _SDL2_rotozoom_h #define _SDL2_rotozoom_h #include /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus extern "C" { #endif #ifndef M_PI #define M_PI 3.1415926535897932384626433832795 #endif #include "SDL.h" /* ---- Defines */ /*! \brief Disable anti-aliasing (no smoothing). */ #define SMOOTHING_OFF 0 /*! \brief Enable anti-aliasing (smoothing). */ #define SMOOTHING_ON 1 /* ---- Function Prototypes */ #ifdef _MSC_VER # if defined(DLL_EXPORT) && !defined(LIBSDL2_GFX_DLL_IMPORT) # define SDL2_ROTOZOOM_SCOPE __declspec(dllexport) # else # ifdef LIBSDL2_GFX_DLL_IMPORT # define SDL2_ROTOZOOM_SCOPE __declspec(dllimport) # endif # endif #endif #ifndef SDL2_ROTOZOOM_SCOPE # define SDL2_ROTOZOOM_SCOPE extern #endif /* Rotozoom functions */ SDL2_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth); SDL2_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurfaceXY (SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth); SDL2_ROTOZOOM_SCOPE void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight); SDL2_ROTOZOOM_SCOPE void rotozoomSurfaceSizeXY (int width, int height, double angle, double zoomx, double zoomy, int *dstwidth, int *dstheight); /* Zooming functions */ SDL2_ROTOZOOM_SCOPE SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth); SDL2_ROTOZOOM_SCOPE void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight); /* Shrinking functions */ SDL2_ROTOZOOM_SCOPE SDL_Surface *shrinkSurface(SDL_Surface * src, int factorx, int factory); /* Specialized rotation functions */ SDL2_ROTOZOOM_SCOPE SDL_Surface* rotateSurface90Degrees(SDL_Surface* src, int numClockwiseTurns); /* Ends C function definitions when using C++ */ #ifdef __cplusplus } #endif #endif /* _SDL2_rotozoom_h */ instead-3.2.1/src/ios.m0000644000175000017500000001320713267071774013744 0ustar peterpeter#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "externals.h" #include "internals.h" static char save_path[PATH_MAX]; static char cfg_path[PATH_MAX]; static char local_games_path[PATH_MAX]; static char local_themes_path[PATH_MAX]; static char local_stead_path[PATH_MAX]; extern int setup_zip(const char *file, char *p); char *game_locale(void) { NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; return strdup([language UTF8String]); } char *game_tmp_path(void) { static char tmp[PATH_MAX]; NSString * tmpdir = NSTemporaryDirectory(); snprintf(tmp, sizeof(tmp), "%s/instead-games", [tmpdir UTF8String]); tmp[sizeof(tmp) - 1] = 0; if (mkdir(tmp, S_IRWXU) && errno != EEXIST) return NULL; return tmp; } static char *inbox(void) { static char dir[PATH_MAX]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; snprintf(dir, sizeof(dir) - 1 , "%s/Inbox", [basePath UTF8String]); return dir; } int setup_inbox(void) { char path[PATH_MAX]; DIR *d; struct dirent *de; char *p; if (!path) return 0; d = opendir(inbox()); if (!d) return -1; while ((de = readdir(d))) { if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue; snprintf(path, sizeof(path), "%s/%s", inbox(), de->d_name); path[sizeof(path) - 1] = 0; p = game_local_games_path(1); fprintf(stderr, "Install zip: %s\n", path); setup_zip(path, game_local_games_path(1)); unlink(path); } closedir(d); return 0; } char *appdir(void) { static char dir[PATH_MAX]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; snprintf(dir, sizeof(dir) - 1 , "%s/.instead", [basePath UTF8String]); return dir; } char *game_local_games_path(int cr) { char *app = appdir(); if (!app) return NULL; strcpy(local_games_path, app); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } strcat(local_games_path,"/games"); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } return local_games_path; } char *game_local_themes_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_themes_path, sizeof(local_themes_path) - 1 , "%s/themes", app); return local_themes_path; } char *game_local_stead_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_stead_path, sizeof(local_stead_path) - 1 , "%s/stead", app); return local_stead_path; } char *game_cfg_path(void) { char *app = appdir(); snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/", app); mkdir(cfg_path, S_IRWXU); snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/insteadrc", app); return cfg_path; } char *game_save_path(int cr, int nr) { char *app = appdir(); if (!curgame_dir) return NULL; if (!access("saves", R_OK)) { if (nr) snprintf(save_path, sizeof(save_path) - 1, "saves/save%d", nr); else snprintf(save_path, sizeof(save_path) - 1, "saves/autosave"); return save_path; } if (!app) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/saves", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/", app, curgame_dir); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; if (nr) snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/save%d", app, curgame_dir, nr); else snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/autosave", app, curgame_dir); return save_path; } int debug_init(void) { return 0; } void debug_done() { } char *sdl_path(char *p) { unix_path(p); return p; } char *open_file_dialog(void) { #if 0 const char *filename; static char *file_name[PATH_MAX]; NSArray* fileTypes = [NSArray arrayWithObjects: @"zip", @"lua", @"idf", nil]; NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setCanChooseDirectories:NO]; [panel setCanChooseFiles:YES]; [panel setAllowsMultipleSelection:NO]; if ([panel runModalForTypes:fileTypes] == NSOKButton) { #ifdef __POWERPC__ filename = [[panel filename] cString]; #else filename = [[panel filename] cStringUsingEncoding:NSUTF8StringEncoding]; #endif strcpy(file_name, filename); return file_name; } #endif return NULL; } void rotate_landscape(void) { SDL_SetHint(SDL_HINT_ORIENTATIONS, "LandscapeLeft LandscapeRight"); if (UIDeviceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) { [[UIDevice currentDevice] setValue:@(UIDeviceOrientationLandscapeRight) forKey:@"orientation"]; } } void rotate_portrait(void) { SDL_SetHint(SDL_HINT_ORIENTATIONS, "Portrait PortraitUpsideDown"); if (UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { [[UIDevice currentDevice] setValue:@(UIDeviceOrientationPortrait) forKey:@"orientation"]; } } void unlock_rotation(void) { SDL_SetHint(SDL_HINT_ORIENTATIONS, "Portrait PortraitUpsideDown LandscapeLeft LandscapeRight"); } void ios_cfg_init(void) { BOOL is_iPhone = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone; opt_fsize = (is_iPhone) ? 5 : 0; } instead-3.2.1/src/SDL_anigif.h0000644000175000017500000000415013267071774015101 0ustar peterpeter/* SDL_anigif: An example animated GIF image loading library for use with SDL SDL_image Copyright (C) 1997-2006 Sam Lantinga Animated GIF "derived work" Copyright (C) 2006 Doug McFadyen This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _SDL_ANIGIF_H #define _SDL_ANIGIF_H #include #ifdef __cplusplus extern "C" { #endif typedef struct { SDL_Surface* surface; /* SDL surface for this frame */ int x, y; /* Frame offset position */ int disposal; /* Disposal code */ unsigned int delay; /* Frame delay in ms */ int user; /* User data (not used by aniGIF) */ } AG_Frame; #define AG_DISPOSE_NA 0 /* No disposal specified */ #define AG_DISPOSE_NONE 1 /* Do not dispose */ #define AG_DISPOSE_RESTORE_BACKGROUND 2 /* Restore to background */ #define AG_DISPOSE_RESTORE_PREVIOUS 3 /* Restore to previous */ extern DECLSPEC int AG_isGIF( SDL_RWops* src ); extern DECLSPEC int AG_LoadGIF( const char* file, AG_Frame* frames, int maxFrames, int *loop ); extern DECLSPEC void AG_FreeSurfaces( AG_Frame* frames, int nFrames ); extern DECLSPEC int AG_ConvertSurfacesToDisplayFormat( AG_Frame* frames, int nFrames ); extern DECLSPEC int AG_NormalizeSurfacesToDisplayFormat( AG_Frame* frames, int nFrames ); extern DECLSPEC int AG_LoadGIF_RW( SDL_RWops* src, AG_Frame* frames, int size, int *loop ); #ifdef __cplusplus } #endif #include "close_code.h" #endif /* _SDL_ANIGIF_H */ instead-3.2.1/src/noise1234.h0000644000175000017500000000303113267071774014566 0ustar peterpeter// noise1234 // // Author: Stefan Gustavson, 2003-2005 // Contact: stefan.gustavson@liu.se // // This code was GPL licensed until February 2011. // As the original author of this code, I hereby // release it into the public domain. // Please feel free to use it for whatever you want. // Credit is appreciated where appropriate, and I also // appreciate being told where this code finds any use, // but you may do as you like. /* * This implementation is "Improved Noise" as presented by * Ken Perlin at Siggraph 2002. The 3D function is a direct port * of his Java reference code which was once publicly available * on www.noisemachine.com (although I cleaned it up, made it * faster and made the code more readable), but the 1D, 2D and * 4D functions were implemented from scratch by me. * * This is a backport to C of my improved noise class in C++ * which was included in the Aqsis renderer project. * It is highly reusable without source code modifications. * */ /** 1D, 2D, 3D and 4D float Perlin noise */ extern float noise1( float x ); extern float noise2( float x, float y ); extern float noise3( float x, float y, float z ); extern float noise4( float x, float y, float z, float w ); /** 1D, 2D, 3D and 4D float Perlin periodic noise */ extern float pnoise1( float x, int px ); extern float pnoise2( float x, float y, int px, int py ); extern float pnoise3( float x, float y, float z, int px, int py, int pz ); extern float pnoise4( float x, float y, float z, float w, int px, int py, int pz, int pw ); instead-3.2.1/src/s60.h0000644000175000017500000000040513267071774013551 0ustar peterpeter#ifndef S60_H #define S60_H #define VERSION "3.2.1" #define DATAPATH "./" #define STEAD_PATH DATAPATH"stead/" #define THEMES_PATH DATAPATH"themes/" #define GAMES_PATH DATAPATH"games/" #define ICON_PATH DATAPATH"icon/" #define LANG_PATH DATAPATH"lang/" #endif instead-3.2.1/src/SDL_gfxBlitFunc.c0000644000175000017500000003155213267071774016060 0ustar peterpeter/* SDL_gfxBlitFunc.c: custom blitters Copyright (C) 2001-2012 Andreas Schiffler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Andreas Schiffler -- aschiffler at ferzkopp dot net */ #include "SDL_gfxBlitFunc.h" /*! \brief Alpha adjustment table for custom blitter. The table provides values for a modified, non-linear transfer function which maintain brightness. */ const unsigned int GFX_ALPHA_ADJUST_ARRAY[256] = { 0, /* 0 */ 15, /* 1 */ 22, /* 2 */ 27, /* 3 */ 31, /* 4 */ 35, /* 5 */ 39, /* 6 */ 42, /* 7 */ 45, /* 8 */ 47, /* 9 */ 50, /* 10 */ 52, /* 11 */ 55, /* 12 */ 57, /* 13 */ 59, /* 14 */ 61, /* 15 */ 63, /* 16 */ 65, /* 17 */ 67, /* 18 */ 69, /* 19 */ 71, /* 20 */ 73, /* 21 */ 74, /* 22 */ 76, /* 23 */ 78, /* 24 */ 79, /* 25 */ 81, /* 26 */ 82, /* 27 */ 84, /* 28 */ 85, /* 29 */ 87, /* 30 */ 88, /* 31 */ 90, /* 32 */ 91, /* 33 */ 93, /* 34 */ 94, /* 35 */ 95, /* 36 */ 97, /* 37 */ 98, /* 38 */ 99, /* 39 */ 100, /* 40 */ 102, /* 41 */ 103, /* 42 */ 104, /* 43 */ 105, /* 44 */ 107, /* 45 */ 108, /* 46 */ 109, /* 47 */ 110, /* 48 */ 111, /* 49 */ 112, /* 50 */ 114, /* 51 */ 115, /* 52 */ 116, /* 53 */ 117, /* 54 */ 118, /* 55 */ 119, /* 56 */ 120, /* 57 */ 121, /* 58 */ 122, /* 59 */ 123, /* 60 */ 124, /* 61 */ 125, /* 62 */ 126, /* 63 */ 127, /* 64 */ 128, /* 65 */ 129, /* 66 */ 130, /* 67 */ 131, /* 68 */ 132, /* 69 */ 133, /* 70 */ 134, /* 71 */ 135, /* 72 */ 136, /* 73 */ 137, /* 74 */ 138, /* 75 */ 139, /* 76 */ 140, /* 77 */ 141, /* 78 */ 141, /* 79 */ 142, /* 80 */ 143, /* 81 */ 144, /* 82 */ 145, /* 83 */ 146, /* 84 */ 147, /* 85 */ 148, /* 86 */ 148, /* 87 */ 149, /* 88 */ 150, /* 89 */ 151, /* 90 */ 152, /* 91 */ 153, /* 92 */ 153, /* 93 */ 154, /* 94 */ 155, /* 95 */ 156, /* 96 */ 157, /* 97 */ 158, /* 98 */ 158, /* 99 */ 159, /* 100 */ 160, /* 101 */ 161, /* 102 */ 162, /* 103 */ 162, /* 104 */ 163, /* 105 */ 164, /* 106 */ 165, /* 107 */ 165, /* 108 */ 166, /* 109 */ 167, /* 110 */ 168, /* 111 */ 168, /* 112 */ 169, /* 113 */ 170, /* 114 */ 171, /* 115 */ 171, /* 116 */ 172, /* 117 */ 173, /* 118 */ 174, /* 119 */ 174, /* 120 */ 175, /* 121 */ 176, /* 122 */ 177, /* 123 */ 177, /* 124 */ 178, /* 125 */ 179, /* 126 */ 179, /* 127 */ 180, /* 128 */ 181, /* 129 */ 182, /* 130 */ 182, /* 131 */ 183, /* 132 */ 184, /* 133 */ 184, /* 134 */ 185, /* 135 */ 186, /* 136 */ 186, /* 137 */ 187, /* 138 */ 188, /* 139 */ 188, /* 140 */ 189, /* 141 */ 190, /* 142 */ 190, /* 143 */ 191, /* 144 */ 192, /* 145 */ 192, /* 146 */ 193, /* 147 */ 194, /* 148 */ 194, /* 149 */ 195, /* 150 */ 196, /* 151 */ 196, /* 152 */ 197, /* 153 */ 198, /* 154 */ 198, /* 155 */ 199, /* 156 */ 200, /* 157 */ 200, /* 158 */ 201, /* 159 */ 201, /* 160 */ 202, /* 161 */ 203, /* 162 */ 203, /* 163 */ 204, /* 164 */ 205, /* 165 */ 205, /* 166 */ 206, /* 167 */ 206, /* 168 */ 207, /* 169 */ 208, /* 170 */ 208, /* 171 */ 209, /* 172 */ 210, /* 173 */ 210, /* 174 */ 211, /* 175 */ 211, /* 176 */ 212, /* 177 */ 213, /* 178 */ 213, /* 179 */ 214, /* 180 */ 214, /* 181 */ 215, /* 182 */ 216, /* 183 */ 216, /* 184 */ 217, /* 185 */ 217, /* 186 */ 218, /* 187 */ 218, /* 188 */ 219, /* 189 */ 220, /* 190 */ 220, /* 191 */ 221, /* 192 */ 221, /* 193 */ 222, /* 194 */ 222, /* 195 */ 223, /* 196 */ 224, /* 197 */ 224, /* 198 */ 225, /* 199 */ 225, /* 200 */ 226, /* 201 */ 226, /* 202 */ 227, /* 203 */ 228, /* 204 */ 228, /* 205 */ 229, /* 206 */ 229, /* 207 */ 230, /* 208 */ 230, /* 209 */ 231, /* 210 */ 231, /* 211 */ 232, /* 212 */ 233, /* 213 */ 233, /* 214 */ 234, /* 215 */ 234, /* 216 */ 235, /* 217 */ 235, /* 218 */ 236, /* 219 */ 236, /* 220 */ 237, /* 221 */ 237, /* 222 */ 238, /* 223 */ 238, /* 224 */ 239, /* 225 */ 240, /* 226 */ 240, /* 227 */ 241, /* 228 */ 241, /* 229 */ 242, /* 230 */ 242, /* 231 */ 243, /* 232 */ 243, /* 233 */ 244, /* 234 */ 244, /* 235 */ 245, /* 236 */ 245, /* 237 */ 246, /* 238 */ 246, /* 239 */ 247, /* 240 */ 247, /* 241 */ 248, /* 242 */ 248, /* 243 */ 249, /* 244 */ 249, /* 245 */ 250, /* 246 */ 250, /* 247 */ 251, /* 248 */ 251, /* 249 */ 252, /* 250 */ 252, /* 251 */ 253, /* 252 */ 253, /* 253 */ 254, /* 254 */ 255 /* 255 */ }; /*! \brief Internal blitter using adjusted destination alpha during RGBA->RGBA blits. Performs the blit based on the 'info' structure and applies the transfer function to the destination 'a' values. \param info The blit info to use. */ void _SDL_gfxBlitBlitterRGBA(SDL_gfxBlitInfo * info) { int width = info->d_width; int height = info->d_height; Uint8 *src = info->s_pixels; int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; Uint8 srcbpp = srcfmt->BytesPerPixel; Uint8 dstbpp = dstfmt->BytesPerPixel; while (height--) { GFX_DUFFS_LOOP4( { Uint32 pixel; unsigned sR; unsigned sG; unsigned sB; unsigned sA; unsigned dR; unsigned dG; unsigned dB; unsigned dA; unsigned sAA; GFX_DISASSEMBLE_RGBA(src, srcbpp, srcfmt, pixel, sR, sG, sB, sA); GFX_DISASSEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA); sAA=GFX_ALPHA_ADJUST_ARRAY[sA & 255]; GFX_ALPHA_BLEND(sR, sG, sB, sAA, dR, dG, dB); dA |= sAA; GFX_ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA); src += srcbpp; dst += dstbpp; }, width); src += srcskip; dst += dstskip; } } /*! \brief Internal blitter setup wrapper for RGBA->RGBA blits. Sets up the blitter info based on the 'src' and 'dst' surfaces and rectangles. \param src The source surface. \param srcrect The source rectangle. \param dst The destination surface. \param dstrect The destination rectangle. \returns Returns 1 if blit was performed, 0 otherwise. */ int _SDL_gfxBlitRGBACall(SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect) { /* * Set up source and destination buffer pointers, then blit */ if (srcrect->w && srcrect->h) { SDL_gfxBlitInfo info; /* * Set up the blit information */ #if SDL_VERSION_ATLEAST(1,3,0) info.s_pixels = (Uint8 *) src->pixels + (Uint16) srcrect->y * src->pitch + (Uint16) srcrect->x * src->format->BytesPerPixel; #else info.s_pixels = (Uint8 *) src->pixels + src->offset + (Uint16) srcrect->y * src->pitch + (Uint16) srcrect->x * src->format->BytesPerPixel; #endif info.s_width = srcrect->w; info.s_height = srcrect->h; info.s_skip = (int)(src->pitch - info.s_width * src->format->BytesPerPixel); #if SDL_VERSION_ATLEAST(1,3,0) info.d_pixels = (Uint8 *) dst->pixels + (Uint16) dstrect->y * dst->pitch + (Uint16) dstrect->x * dst->format->BytesPerPixel; #else info.d_pixels = (Uint8 *) dst->pixels + dst->offset + (Uint16) dstrect->y * dst->pitch + (Uint16) dstrect->x * dst->format->BytesPerPixel; #endif info.d_width = dstrect->w; info.d_height = dstrect->h; info.d_skip = (int)(dst->pitch - info.d_width * dst->format->BytesPerPixel); info.aux_data = NULL; info.src = src->format; info.table = NULL; info.dst = dst->format; /* * Run the actual software blitter */ _SDL_gfxBlitBlitterRGBA(&info); return 1; } return (0); } /*! \brief Blitter for RGBA->RGBA blits with alpha adjustment. Verifies the input 'src' and 'dst' surfaces and rectangles and performs blit. The destination clip rectangle is honored. \param src The source surface. \param srcrect The source rectangle. \param dst The destination surface. \param dstrect The destination rectangle. \returns Returns 1 if blit was performed, 0 otherwise, or -1 if an error occured. */ int SDL_gfxBlitRGBA(SDL_Surface * src, SDL_Rect * srcrect, SDL_Surface * dst, SDL_Rect * dstrect) { SDL_Rect sr, dr; int srcx, srcy, w, h; /* * Make sure the surfaces aren't locked */ if (!src || !dst) { SDL_SetError("SDL_UpperBlit: passed a NULL surface"); return (-1); } if ((src->locked) || (dst->locked)) { SDL_SetError("Surfaces must not be locked during blit"); return (-1); } /* * If the destination rectangle is NULL, use the entire dest surface */ if (dstrect == NULL) { dr.x = dr.y = 0; dr.w = dst->w; dr.h = dst->h; } else { dr = *dstrect; } /* * Clip the source rectangle to the source surface */ if (srcrect) { int maxw, maxh; srcx = srcrect->x; w = srcrect->w; if (srcx < 0) { w += srcx; dr.x -= srcx; srcx = 0; } maxw = src->w - srcx; if (maxw < w) w = maxw; srcy = srcrect->y; h = srcrect->h; if (srcy < 0) { h += srcy; dr.y -= srcy; srcy = 0; } maxh = src->h - srcy; if (maxh < h) h = maxh; } else { srcx = srcy = 0; w = src->w; h = src->h; } /* * Clip the destination rectangle against the clip rectangle */ { SDL_Rect *clip = &dst->clip_rect; int dx, dy; dx = clip->x - dr.x; if (dx > 0) { w -= dx; dr.x += dx; srcx += dx; } dx = dr.x + w - clip->x - clip->w; if (dx > 0) w -= dx; dy = clip->y - dr.y; if (dy > 0) { h -= dy; dr.y += dy; srcy += dy; } dy = dr.y + h - clip->y - clip->h; if (dy > 0) h -= dy; } if (w > 0 && h > 0) { sr.x = srcx; sr.y = srcy; sr.w = dr.w = w; sr.h = dr.h = h; return (_SDL_gfxBlitRGBACall(src, &sr, dst, &dr)); } return 0; } /*! \brief Sets the alpha channel in a 32 bit surface. Helper function that sets the alpha channel in a 32 bit surface to a constant value. Only 32 bit surfaces can be used with this function. \param src Pointer to the target surface to change. \param a The alpha value to set. \return Returns 1 if alpha was changed, -1 otherwise. */ int SDL_gfxSetAlpha(SDL_Surface *src, Uint8 a) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN const int alpha_offset = 0; #else const int alpha_offset = 3; #endif int i, j, row_skip; Uint8 *pixels; /* Check if we have a 32bit surface */ if ( (src==NULL) || (src->format==NULL) || (src->format->BytesPerPixel!=4) ) { SDL_SetError("SDL_gfxSetAlpha: Invalid input surface."); return -1; } /* * Lock the surface */ if (SDL_MUSTLOCK(src)) { if (SDL_LockSurface(src) < 0) { return (-1); } } /* Process */ pixels = (Uint8 *)src->pixels; row_skip = (src->pitch - (4*src->w)); pixels += alpha_offset; for ( i=0; ih; i++ ) { for ( j=0; jw; j++ ) { *pixels = a; pixels += 4; } pixels += row_skip; } /* * Unlock surface */ if (SDL_MUSTLOCK(src)) { SDL_UnlockSurface(src); } return 1; } /*! \brief Multiply the alpha channel in a 32bit surface. Helper function that multiplies the alpha channel in a 32 bit surface with a constant value. The final alpha is always scaled to the range 0-255 (i.e. the factor is a/256). Only 32 bit surfaces can be used with this function. \param src Pointer to the target surface to change. \param a The alpha value to multiply with. When a is 255, this function is a NoOp. \return Returns 1 if alpha was changed, 0 otherwise. Returns -1 if input surface is invalid. */ int SDL_gfxMultiplyAlpha(SDL_Surface *src, Uint8 a) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN const int alpha_offset = 0; #else const int alpha_offset = 3; #endif int i, j, row_skip; Uint8 *pixels; /* Check if we have a 32bit surface */ if ( (src==NULL) || (src->format==NULL) || (src->format->BytesPerPixel!=4) ) { SDL_SetError("SDL_gfxMultiplyAlpha: Invalid input surface."); return -1; } /* Check if multiplication is needed */ if (a==255) { return 0; } /* * Lock the surface */ if (SDL_MUSTLOCK(src)) { if (SDL_LockSurface(src) < 0) { return (-1); } } /* Process */ pixels = (Uint8 *)src->pixels; row_skip = (src->pitch - (4*src->w)); pixels += alpha_offset; for ( i=0; ih; i++ ) { for ( j=0; jw; j++ ) { *pixels = (Uint8)(((int)(*pixels)*a)>>8); pixels += 4; } pixels += row_skip; } /* * Unlock surface */ if (SDL_MUSTLOCK(src)) { SDL_UnlockSurface(src); } return 1; } instead-3.2.1/src/SDL_rotozoom.h0000644000175000017500000000575013267071774015543 0ustar peterpeter#include #if SDL_VERSION_ATLEAST(2,0,0) #include "SDL2_rotozoom.h" #else /* SDL_rotozoom.c: rotozoomer, zoomer and shrinker for 32bit or 8bit surfaces Copyright (C) 2001-2012 Andreas Schiffler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Andreas Schiffler -- aschiffler at ferzkopp dot net */ #ifndef _SDL_rotozoom_h #define _SDL_rotozoom_h #include /* Set up for C function definitions, even when using C++ */ #ifdef __cplusplus extern "C" { #endif #ifndef M_PI #define M_PI 3.141592654 #endif #include "SDL.h" /* ---- Defines */ /*! \brief Disable anti-aliasing (no smoothing). */ #define SMOOTHING_OFF 0 /*! \brief Enable anti-aliasing (smoothing). */ #define SMOOTHING_ON 1 /* ---- Function Prototypes */ #ifdef _MSC_VER # if defined(DLL_EXPORT) && !defined(LIBSDL_GFX_DLL_IMPORT) # define SDL_ROTOZOOM_SCOPE __declspec(dllexport) # else # ifdef LIBSDL_GFX_DLL_IMPORT # define SDL_ROTOZOOM_SCOPE __declspec(dllimport) # endif # endif #endif #ifndef SDL_ROTOZOOM_SCOPE # define SDL_ROTOZOOM_SCOPE extern #endif /* Rotozoom functions */ SDL_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth); SDL_ROTOZOOM_SCOPE SDL_Surface *rotozoomSurfaceXY (SDL_Surface * src, double angle, double zoomx, double zoomy, int smooth); SDL_ROTOZOOM_SCOPE void rotozoomSurfaceSize(int width, int height, double angle, double zoom, int *dstwidth, int *dstheight); SDL_ROTOZOOM_SCOPE void rotozoomSurfaceSizeXY (int width, int height, double angle, double zoomx, double zoomy, int *dstwidth, int *dstheight); /* Zooming functions */ SDL_ROTOZOOM_SCOPE SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth); SDL_ROTOZOOM_SCOPE void zoomSurfaceSize(int width, int height, double zoomx, double zoomy, int *dstwidth, int *dstheight); /* Shrinking functions */ SDL_ROTOZOOM_SCOPE SDL_Surface *shrinkSurface(SDL_Surface * src, int factorx, int factory); /* Specialized rotation functions */ SDL_ROTOZOOM_SCOPE SDL_Surface* rotateSurface90Degrees(SDL_Surface* src, int numClockwiseTurns); /* Ends C function definitions when using C++ */ #ifdef __cplusplus } #endif #endif /* _SDL_rotozoom_h */ #endif instead-3.2.1/src/instead/0000755000175000017500000000000013267071774014420 5ustar peterpeterinstead-3.2.1/src/instead/cache.h0000644000175000017500000000340513267071774015636 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __CACHE_H #define __CACHE_H typedef void * cache_t; typedef void (*cache_free_fn)(void *p); extern cache_t cache_init(int size, cache_free_fn); extern void cache_free(cache_t cache); extern int cache_forget(cache_t cache, void *p); extern void cache_zap(cache_t cache); extern void cache_shrink(cache_t cache); extern void *cache_get(cache_t cache, const char *name); extern void *cache_lookup(cache_t cache, const char *name); extern int cache_add(cache_t cache, const char *name, void *p); extern int cache_have(cache_t cache, void *p); extern unsigned long hash_addr(void *p); extern unsigned long hash_string(const char *str); #endif instead-3.2.1/src/instead/tinymt32.c0000644000175000017500000000761013267071774016261 0ustar peterpeter/** * @file tinymt32.c * * @brief Tiny Mersenne Twister only 127 bit internal state * * @author Mutsuo Saito (Hiroshima University) * @author Makoto Matsumoto (The University of Tokyo) * * Copyright (C) 2011 Mutsuo Saito, Makoto Matsumoto, * Hiroshima University and The University of Tokyo. * All rights reserved. * * The 3-clause BSD License is applied to this software, see * http://www.math.sci.hiroshima-u.ac.jp/~%20m-mat/MT/TINYMT/LICENSE.txt * * Changes: * a) some code removed * b) SDL_types.h Uint32 instead of uint32_t * c) url to LICENSE */ #include "tinymt32.h" #define MIN_LOOP 8 #define PRE_LOOP 8 /** * This function represents a function used in the initialization * by init_by_array * @param x 32-bit integer * @return 32-bit integer */ static Uint32 ini_func1(Uint32 x) { return (x ^ (x >> 27)) * UINT32_C(1664525); } /** * This function represents a function used in the initialization * by init_by_array * @param x 32-bit integer * @return 32-bit integer */ static Uint32 ini_func2(Uint32 x) { return (x ^ (x >> 27)) * UINT32_C(1566083941); } /** * This function certificate the period of 2^127-1. * @param random tinymt state vector. */ static void period_certification(tinymt32_t * random) { if ((random->status[0] & TINYMT32_MASK) == 0 && random->status[1] == 0 && random->status[2] == 0 && random->status[3] == 0) { random->status[0] = 'T'; random->status[1] = 'I'; random->status[2] = 'N'; random->status[3] = 'Y'; } } /** * This function initializes the internal state array with a 32-bit * unsigned integer seed. * @param random tinymt state vector. * @param seed a 32-bit unsigned integer used as a seed. */ void tinymt32_init(tinymt32_t * random, Uint32 seed) { int i; random->status[0] = seed; random->status[1] = random->mat1; random->status[2] = random->mat2; random->status[3] = random->tmat; for (i = 1; i < MIN_LOOP; i++) { random->status[i & 3] ^= i + UINT32_C(1812433253) * (random->status[(i - 1) & 3] ^ (random->status[(i - 1) & 3] >> 30)); } period_certification(random); for (i = 0; i < PRE_LOOP; i++) { tinymt32_next_state(random); } } /** * This function initializes the internal state array, * with an array of 32-bit unsigned integers used as seeds * @param random tinymt state vector. * @param init_key the array of 32-bit integers, used as a seed. * @param key_length the length of init_key. */ void tinymt32_init_by_array(tinymt32_t * random, Uint32 init_key[], int key_length) { const int lag = 1; const int mid = 1; const int size = 4; int i, j; int count; Uint32 r; Uint32 * st = &random->status[0]; st[0] = 0; st[1] = random->mat1; st[2] = random->mat2; st[3] = random->tmat; if (key_length + 1 > MIN_LOOP) { count = key_length + 1; } else { count = MIN_LOOP; } r = ini_func1(st[0] ^ st[mid % size] ^ st[(size - 1) % size]); st[mid % size] += r; r += key_length; st[(mid + lag) % size] += r; st[0] = r; count--; for (i = 1, j = 0; (j < count) && (j < key_length); j++) { r = ini_func1(st[i % size] ^ st[(i + mid) % size] ^ st[(i + size - 1) % size]); st[(i + mid) % size] += r; r += init_key[j] + i; st[(i + mid + lag) % size] += r; st[i % size] = r; i = (i + 1) % size; } for (; j < count; j++) { r = ini_func1(st[i % size] ^ st[(i + mid) % size] ^ st[(i + size - 1) % size]); st[(i + mid) % size] += r; r += i; st[(i + mid + lag) % size] += r; st[i % size] = r; i = (i + 1) % size; } for (j = 0; j < size; j++) { r = ini_func2(st[i % size] + st[(i + mid) % size] + st[(i + size - 1) % size]); st[(i + mid) % size] ^= r; r -= i; st[(i + mid + lag) % size] ^= r; st[i % size] = r; i = (i + 1) % size; } period_certification(random); for (i = 0; i < PRE_LOOP; i++) { tinymt32_next_state(random); } } instead-3.2.1/src/instead/list.h0000644000175000017500000005177513267071774015563 0ustar peterpeter/* Licensed under BSD-MIT - see LICENSE file for details */ #ifndef CCAN_LIST_H #define CCAN_LIST_H #include #include /** * BUILD_ASSERT - assert a build-time dependency. * @cond: the compile-time condition which must be true. * * Your compile will fail if the condition isn't true, or can't be evaluated * by the compiler. This can only be used within a function. * * Example: * #include * ... * static char *foo_to_char(struct foo *foo) * { * // This code needs string to be at start of foo. * BUILD_ASSERT(offsetof(struct foo, string) == 0); * return (char *)foo; * } */ #define BUILD_ASSERT(cond) \ do { (void) sizeof(char [1 - 2*!(cond)]); } while(0) /** * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression. * @cond: the compile-time condition which must be true. * * Your compile will fail if the condition isn't true, or can't be evaluated * by the compiler. This can be used in an expression: its value is "0". * * Example: * #define foo_to_char(foo) \ * ((char *)(foo) \ * + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0)) */ #define BUILD_ASSERT_OR_ZERO(cond) \ (sizeof(char [1 - 2*!(cond)]) - 1) /** * check_type - issue a warning or build failure if type is not correct. * @expr: the expression whose type we should check (not evaluated). * @type: the exact type we expect the expression to be. * * This macro is usually used within other macros to try to ensure that a macro * argument is of the expected type. No type promotion of the expression is * done: an unsigned int is not the same as an int! * * check_type() always evaluates to 0. * * If your compiler does not support typeof, then the best we can do is fail * to compile if the sizes of the types are unequal (a less complete check). * * Example: * // They should always pass a 64-bit value to _set_some_value! * #define set_some_value(expr) \ * _set_some_value((check_type((expr), uint64_t), (expr))) */ /** * check_types_match - issue a warning or build failure if types are not same. * @expr1: the first expression (not evaluated). * @expr2: the second expression (not evaluated). * * This macro is usually used within other macros to try to ensure that * arguments are of identical types. No type promotion of the expressions is * done: an unsigned int is not the same as an int! * * check_types_match() always evaluates to 0. * * If your compiler does not support typeof, then the best we can do is fail * to compile if the sizes of the types are unequal (a less complete check). * * Example: * // Do subtraction to get to enclosing type, but make sure that * // pointer is of correct type for that member. * #define container_of(mbr_ptr, encl_type, mbr) \ * (check_types_match((mbr_ptr), &((encl_type *)0)->mbr), \ * ((encl_type *) \ * ((char *)(mbr_ptr) - offsetof(enclosing_type, mbr)))) */ #if HAVE_TYPEOF #define check_type(expr, type) \ ((typeof(expr) *)0 != (type *)0) #define check_types_match(expr1, expr2) \ ((typeof(expr1) *)0 != (typeof(expr2) *)0) #else /* Without typeof, we can only test the sizes. */ #define check_type(expr, type) \ BUILD_ASSERT_OR_ZERO(sizeof(expr) == sizeof(type)) #define check_types_match(expr1, expr2) \ BUILD_ASSERT_OR_ZERO(sizeof(expr1) == sizeof(expr2)) #endif /* HAVE_TYPEOF */ /** * container_of - get pointer to enclosing structure * @member_ptr: pointer to the structure member * @containing_type: the type this member is within * @member: the name of this member within the structure. * * Given a pointer to a member of a structure, this macro does pointer * subtraction to return the pointer to the enclosing type. * * Example: * struct foo { * int fielda, fieldb; * // ... * }; * struct info { * int some_other_field; * struct foo my_foo; * }; * * static struct info *foo_to_info(struct foo *foo) * { * return container_of(foo, struct info, my_foo); * } */ #define container_of(member_ptr, containing_type, member) \ ((containing_type *) \ ((char *)(member_ptr) \ - container_off(containing_type, member)) \ + check_types_match(*(member_ptr), ((containing_type *)0)->member)) /** * container_off - get offset to enclosing structure * @containing_type: the type this member is within * @member: the name of this member within the structure. * * Given a pointer to a member of a structure, this macro does * typechecking and figures out the offset to the enclosing type. * * Example: * struct foo { * int fielda, fieldb; * // ... * }; * struct info { * int some_other_field; * struct foo my_foo; * }; * * static struct info *foo_to_info(struct foo *foo) * { * size_t off = container_off(struct info, my_foo); * return (void *)((char *)foo - off); * } */ #define container_off(containing_type, member) \ offsetof(containing_type, member) /** * container_of_var - get pointer to enclosing structure using a variable * @member_ptr: pointer to the structure member * @container_var: a pointer of same type as this member's container * @member: the name of this member within the structure. * * Given a pointer to a member of a structure, this macro does pointer * subtraction to return the pointer to the enclosing type. * * Example: * static struct info *foo_to_i(struct foo *foo) * { * struct info *i = container_of_var(foo, i, my_foo); * return i; * } */ #if HAVE_TYPEOF #define container_of_var(member_ptr, container_var, member) \ container_of(member_ptr, typeof(*container_var), member) #else #define container_of_var(member_ptr, container_var, member) \ ((void *)((char *)(member_ptr) - \ container_off_var(container_var, member))) #endif /** * container_off_var - get offset of a field in enclosing structure * @container_var: a pointer to a container structure * @member: the name of a member within the structure. * * Given (any) pointer to a structure and a its member name, this * macro does pointer subtraction to return offset of member in a * structure memory layout. * */ #if HAVE_TYPEOF #define container_off_var(var, member) \ container_off(typeof(*var), member) #else #define container_off_var(var, member) \ ((char *)&(var)->member - (char *)(var)) #endif /** * struct list_node - an entry in a doubly-linked list * @next: next entry (self if empty) * @prev: previous entry (self if empty) * * This is used as an entry in a linked list. * Example: * struct child { * const char *name; * // Linked list of all us children. * struct list_node list; * }; */ struct list_node { struct list_node *next, *prev; }; /** * struct list_head - the head of a doubly-linked list * @h: the list_head (containing next and prev pointers) * * This is used as the head of a linked list. * Example: * struct parent { * const char *name; * struct list_head children; * unsigned int num_children; * }; */ struct list_head { struct list_node n; }; /** * list_check - check head of a list for consistency * @h: the list_head * @abortstr: the location to print on aborting, or NULL. * * Because list_nodes have redundant information, consistency checking between * the back and forward links can be done. This is useful as a debugging check. * If @abortstr is non-NULL, that will be printed in a diagnostic if the list * is inconsistent, and the function will abort. * * Returns the list head if the list is consistent, NULL if not (it * can never return NULL if @abortstr is set). * * See also: list_check_node() * * Example: * static void dump_parent(struct parent *p) * { * struct child *c; * * printf("%s (%u children):\n", p->name, p->num_children); * list_check(&p->children, "bad child list"); * list_for_each(&p->children, c, list) * printf(" -> %s\n", c->name); * } */ struct list_head *list_check(const struct list_head *h, const char *abortstr); /** * list_check_node - check node of a list for consistency * @n: the list_node * @abortstr: the location to print on aborting, or NULL. * * Check consistency of the list node is in (it must be in one). * * See also: list_check() * * Example: * static void dump_child(const struct child *c) * { * list_check_node(&c->list, "bad child list"); * printf("%s\n", c->name); * } */ struct list_node *list_check_node(const struct list_node *n, const char *abortstr); #ifdef CCAN_LIST_DEBUG #define list_debug(h) list_check((h), __func__) #define list_debug_node(n) list_check_node((n), __func__) #else #define list_debug(h) (h) #define list_debug_node(n) (n) #endif /** * LIST_HEAD_INIT - initializer for an empty list_head * @name: the name of the list. * * Explicit initializer for an empty list. * * See also: * LIST_HEAD, list_head_init() * * Example: * static struct list_head my_list = LIST_HEAD_INIT(my_list); */ #define LIST_HEAD_INIT(name) { { &name.n, &name.n } } /** * LIST_HEAD - define and initialize an empty list_head * @name: the name of the list. * * The LIST_HEAD macro defines a list_head and initializes it to an empty * list. It can be prepended by "static" to define a static list_head. * * See also: * LIST_HEAD_INIT, list_head_init() * * Example: * static LIST_HEAD(my_global_list); */ #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) /** * list_head_init - initialize a list_head * @h: the list_head to set to the empty list * * Example: * ... * struct parent *parent = malloc(sizeof(*parent)); * * list_head_init(&parent->children); * parent->num_children = 0; */ void list_head_init(struct list_head *h); /** * list_add - add an entry at the start of a linked list. * @h: the list_head to add the node to * @n: the list_node to add to the list. * * The list_node does not need to be initialized; it will be overwritten. * Example: * struct child *child = malloc(sizeof(*child)); * * child->name = "marvin"; * list_add(&parent->children, &child->list); * parent->num_children++; */ void list_add(struct list_head *h, struct list_node *n); /** * list_add_tail - add an entry at the end of a linked list. * @h: the list_head to add the node to * @n: the list_node to add to the list. * * The list_node does not need to be initialized; it will be overwritten. * Example: * list_add_tail(&parent->children, &child->list); * parent->num_children++; */ void list_add_tail(struct list_head *h, struct list_node *n); /** * list_empty - is a list empty? * @h: the list_head * * If the list is empty, returns true. * * Example: * assert(list_empty(&parent->children) == (parent->num_children == 0)); */ int list_empty(const struct list_head *h); /** * list_del - delete an entry from an (unknown) linked list. * @n: the list_node to delete from the list. * * Note that this leaves @n in an undefined state; it can be added to * another list, but not deleted again. * * See also: * list_del_from() * * Example: * list_del(&child->list); * parent->num_children--; */ void list_del(struct list_node *n); /** * list_del_from - delete an entry from a known linked list. * @h: the list_head the node is in. * @n: the list_node to delete from the list. * * This explicitly indicates which list a node is expected to be in, * which is better documentation and can catch more bugs. * * See also: list_del() * * Example: * list_del_from(&parent->children, &child->list); * parent->num_children--; */ void list_del_from(struct list_head *h, struct list_node *n); /** * list_entry - convert a list_node back into the structure containing it. * @n: the list_node * @type: the type of the entry * @member: the list_node member of the type * * Example: * // First list entry is children.next; convert back to child. * child = list_entry(parent->children.n.next, struct child, list); * * See Also: * list_top(), list_for_each() */ #define list_entry(n, type, member) container_of(n, type, member) /** * list_top - get the first entry in a list * @h: the list_head * @type: the type of the entry * @member: the list_node member of the type * * If the list is empty, returns NULL. * * Example: * struct child *first; * first = list_top(&parent->children, struct child, list); * if (!first) * printf("Empty list!\n"); */ #define list_top(h, type, member) \ ((type *)list_top_((h), list_off_(type, member))) const void *list_top_(const struct list_head *h, size_t off); /** * list_pop - remove the first entry in a list * @h: the list_head * @type: the type of the entry * @member: the list_node member of the type * * If the list is empty, returns NULL. * * Example: * struct child *one; * one = list_pop(&parent->children, struct child, list); * if (!one) * printf("Empty list!\n"); */ #define list_pop(h, type, member) \ ((type *)list_pop_((h), list_off_(type, member))) const void *list_pop_(const struct list_head *h, size_t off); /** * list_tail - get the last entry in a list * @h: the list_head * @type: the type of the entry * @member: the list_node member of the type * * If the list is empty, returns NULL. * * Example: * struct child *last; * last = list_tail(&parent->children, struct child, list); * if (!last) * printf("Empty list!\n"); */ #define list_tail(h, type, member) \ ((type *)list_tail_((h), list_off_(type, member))) const void *list_tail_(const struct list_head *h, size_t off); /** * list_for_each - iterate through a list. * @h: the list_head (warning: evaluated multiple times!) * @i: the structure containing the list_node * @member: the list_node member of the structure * * This is a convenient wrapper to iterate @i over the entire list. It's * a for loop, so you can break and continue as normal. * * Example: * list_for_each(&parent->children, child, list) * printf("Name: %s\n", child->name); */ #define list_for_each(h, i, member) \ list_for_each_off(h, i, list_off_var_(i, member)) /** * list_for_each_rev - iterate through a list backwards. * @h: the list_head * @i: the structure containing the list_node * @member: the list_node member of the structure * * This is a convenient wrapper to iterate @i over the entire list. It's * a for loop, so you can break and continue as normal. * * Example: * list_for_each_rev(&parent->children, child, list) * printf("Name: %s\n", child->name); */ #define list_for_each_rev(h, i, member) \ for (i = container_of_var(list_debug(h)->n.prev, i, member); \ &i->member != &(h)->n; \ i = container_of_var(i->member.prev, i, member)) /** * list_for_each_safe - iterate through a list, maybe during deletion * @h: the list_head * @i: the structure containing the list_node * @nxt: the structure containing the list_node * @member: the list_node member of the structure * * This is a convenient wrapper to iterate @i over the entire list. It's * a for loop, so you can break and continue as normal. The extra variable * @nxt is used to hold the next element, so you can delete @i from the list. * * Example: * struct child *next; * list_for_each_safe(&parent->children, child, next, list) { * list_del(&child->list); * parent->num_children--; * } */ #define list_for_each_safe(h, i, nxt, member) \ list_for_each_safe_off(h, i, nxt, list_off_var_(i, member)) /** * list_next - get the next entry in a list * @h: the list_head * @i: a pointer to an entry in the list. * @member: the list_node member of the structure * * If @i was the last entry in the list, returns NULL. * * Example: * struct child *second; * second = list_next(&parent->children, first, list); * if (!second) * printf("No second child!\n"); */ #define list_next(h, i, member) \ ((list_typeof(i))list_entry_or_null(list_debug(h), \ (i)->member.next, \ list_off_var_((i), member))) /** * list_prev - get the previous entry in a list * @h: the list_head * @i: a pointer to an entry in the list. * @member: the list_node member of the structure * * If @i was the first entry in the list, returns NULL. * * Example: * first = list_prev(&parent->children, second, list); * if (!first) * printf("Can't go back to first child?!\n"); */ #define list_prev(h, i, member) \ ((list_typeof(i))list_entry_or_null(list_debug(h), \ (i)->member.prev, \ list_off_var_((i), member))) /** * list_append_list - empty one list onto the end of another. * @to: the list to append into * @from: the list to empty. * * This takes the entire contents of @from and moves it to the end of * @to. After this @from will be empty. * * Example: * struct list_head adopter; * * list_append_list(&adopter, &parent->children); * assert(list_empty(&parent->children)); * parent->num_children = 0; */ void list_append_list(struct list_head *to, struct list_head *from); /** * list_prepend_list - empty one list into the start of another. * @to: the list to prepend into * @from: the list to empty. * * This takes the entire contents of @from and moves it to the start * of @to. After this @from will be empty. * * Example: * list_prepend_list(&adopter, &parent->children); * assert(list_empty(&parent->children)); * parent->num_children = 0; */ void list_prepend_list(struct list_head *to, struct list_head *from); /** * list_for_each_off - iterate through a list of memory regions. * @h: the list_head * @i: the pointer to a memory region wich contains list node data. * @off: offset(relative to @i) at which list node data resides. * * This is a low-level wrapper to iterate @i over the entire list, used to * implement all oher, more high-level, for-each constructs. It's a for loop, * so you can break and continue as normal. * * WARNING! Being the low-level macro that it is, this wrapper doesn't know * nor care about the type of @i. The only assumtion made is that @i points * to a chunk of memory that at some @offset, relative to @i, contains a * properly filled `struct node_list' which in turn contains pointers to * memory chunks and it's turtles all the way down. Whith all that in mind * remember that given the wrong pointer/offset couple this macro will * happilly churn all you memory untill SEGFAULT stops it, in other words * caveat emptor. * * It is worth mentioning that one of legitimate use-cases for that wrapper * is operation on opaque types with known offset for `struct list_node' * member(preferably 0), because it allows you not to disclose the type of * @i. * * Example: * list_for_each_off(&parent->children, child, * offsetof(struct child, list)) * printf("Name: %s\n", child->name); */ #define list_for_each_off(h, i, off) \ for (i = list_node_to_off_(list_debug(h)->n.next, (off)); \ list_node_from_off_((void *)i, (off)) != &(h)->n; \ i = list_node_to_off_(list_node_from_off_((void *)i, (off))->next, \ (off))) /** * list_for_each_safe_off - iterate through a list of memory regions, maybe * during deletion * @h: the list_head * @i: the pointer to a memory region wich contains list node data. * @nxt: the structure containing the list_node * @off: offset(relative to @i) at which list node data resides. * * For details see `list_for_each_off' and `list_for_each_safe' * descriptions. * * Example: * list_for_each_safe_off(&parent->children, child, * next, offsetof(struct child, list)) * printf("Name: %s\n", child->name); */ #define list_for_each_safe_off(h, i, nxt, off) \ for (i = list_node_to_off_(list_debug(h)->n.next, (off)), \ nxt = list_node_to_off_(list_node_from_off_(i, (off))->next, \ (off)); \ list_node_from_off_(i, (off)) != &(h)->n; \ i = nxt, \ nxt = list_node_to_off_(list_node_from_off_(i, (off))->next, \ (off))) /* Other -off variants. */ #define list_entry_off(n, type, off) \ ((type *)list_node_from_off_((n), (off))) #define list_head_off(h, type, off) \ ((type *)list_head_off((h), (off))) #define list_tail_off(h, type, off) \ ((type *)list_tail_((h), (off))) #define list_add_off(h, n, off) \ list_add((h), list_node_from_off_((n), (off))) #define list_del_off(n, off) \ list_del(list_node_from_off_((n), (off))) #define list_del_from_off(h, n, off) \ list_del_from(h, list_node_from_off_((n), (off))) /* Offset helper functions so we only single-evaluate. */ void *list_node_to_off_(struct list_node *node, size_t off); struct list_node *list_node_from_off_(void *ptr, size_t off); /* Get the offset of the member, but make sure it's a list_node. */ #define list_off_(type, member) \ (container_off(type, member) + \ check_type(((type *)0)->member, struct list_node)) #define list_off_var_(var, member) \ (container_off_var(var, member) + \ check_type(var->member, struct list_node)) #if HAVE_TYPEOF #define list_typeof(var) typeof(var) #else #define list_typeof(var) void * #endif /* Returns member, or NULL if at end of list. */ void *list_entry_or_null(const struct list_head *h, const struct list_node *n, size_t off); #endif /* CCAN_LIST_H */ instead-3.2.1/src/instead/snprintf.h0000644000175000017500000000072113267071774016434 0ustar peterpeter#ifndef _PORTABLE_SNPRINTF_H_ #define _PORTABLE_SNPRINTF_H_ #define PORTABLE_SNPRINTF_VERSION_MAJOR 1 #define PORTABLE_SNPRINTF_VERSION_MINOR 3 #ifdef HAVE_SNPRINTF #include #else extern int snprintf(char *, size_t, const char *, /*args*/ ...); #endif #if defined(HAVE_SNPRINTF) && defined(PREFER_PORTABLE_SNPRINTF) extern int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...); #define snprintf portable_snprintf #endif #endif instead-3.2.1/src/instead/util.h0000644000175000017500000000510513267071774015547 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __INSTEAD_UTIL_H_INCLUDED #define __INSTEAD_UTIL_H_INCLUDED extern char *strip(char *s); extern int is_cjk(unsigned long sym); extern int get_utf8(const char *p, unsigned long *sym_out); extern int is_space(int c); extern int is_empty(const char *str); extern char *getfilepath(const char *d, const char *n); extern int strlowcmp(const char *s, const char *d); extern void unix_path(char *path); extern int setdir(const char *path); extern char *getpath(const char *d, const char *n); extern char *getdir(char *path, size_t size); extern char *dirpath(const char *path); extern void tolow(char *p); extern int is_absolute_path(const char *p); extern void mt_random_init(void); extern void mt_random_seed(unsigned long seed); extern unsigned long mt_random(void); extern double mt_random_double(void); #define FREE(v) do { if ((v)) free((v)); v = NULL; } while(0) #ifdef _USE_SDL #include #include #ifdef _USE_SDL_ICONV #include #define iconv SDL_iconv #define iconv_t SDL_iconv_t #define iconv_open SDL_iconv_open #define iconv_close SDL_iconv_close #else #ifdef _HAVE_ICONV #include #endif #endif #else #ifdef _HAVE_ICONV #include #endif #endif #ifdef _HAVE_ICONV extern char *decode(iconv_t hiconv, const char *s); #endif #ifdef S60 extern char *dirname(char *); extern char *basename(char *); #endif extern char *getrealpath(const char *path, char *resolved); #endif instead-3.2.1/src/instead/instead.c0000644000175000017500000006046113267071774016222 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "system.h" #include "instead.h" #include "util.h" #include "list.h" #define DATA_IDF INSTEAD_IDF #ifdef _USE_SDL #ifndef __EMSCRIPTEN__ static SDL_mutex *sem; #endif void instead_lock(void) { #ifndef __EMSCRIPTEN__ SDL_LockMutex(sem); #endif } void instead_unlock(void) { #ifndef __EMSCRIPTEN__ SDL_UnlockMutex(sem); #endif } #else void instead_lock(void) { } void instead_unlock(void) { } #endif static char instead_cwd_path[PATH_MAX]; static char instead_game_path[PATH_MAX]; static int debug_sw = 0; static int standalone_sw = 0; static int busy = 0; static idf_t data_idf = NULL; /* the Lua interpreter */ char *instead_fromgame(const char *s); char *togame(const char *s); lua_State *L = NULL; static char *err_msg = NULL; static char instead_api_path[PATH_MAX]; static char *API = NULL; static char *MAIN = NULL; #define STEAD_API_PATH instead_api_path #define ERR_MSG_MAX 512 static struct list_head extensions = LIST_HEAD_INIT(extensions); #define for_each_extension(ext) list_for_each(&extensions, ext, list) enum instead_hook { init, done, cmd, err, }; #define HOOK_INIT 1 #define HOOK_DONE 2 #define HOOK_CMD 3 #define HOOK_ERR 4 static int extensions_hook(enum instead_hook nr) { int rc = 0; struct instead_ext *ext = NULL; for_each_extension(ext) { switch (nr) { case init: if (ext->init) rc = ext->init(); break; case done: if (ext->done) rc = ext->done(); break; case cmd: if (ext->cmd) rc = ext->cmd(); break; case err: if (ext->err) rc = ext->err(); break; default: return -1; } if (rc) break; } return rc; } int instead_extension(struct instead_ext *ext) { list_add(&extensions, &ext->list); return 0; } int instead_busy(void) { return busy; } void instead_err_msg(const char *s) { if (err_msg) free(err_msg); if (s) { err_msg = strdup(s); if (err_msg && strlen(err_msg) > ERR_MSG_MAX) { err_msg[ERR_MSG_MAX - 4] = 0; strcat(err_msg, "..."); } } else err_msg = NULL; } const char *instead_err(void) { return err_msg; } static int report (lua_State *L, int status) { if (status && !lua_isnil(L, -1)) { char *p; const char *msg = lua_tostring(L, -1); if (msg == NULL) msg = "(error object is not a string)"; fprintf(stderr,"Error: %s\n", msg); p = instead_fromgame(msg); instead_err_msg(p?p:msg); if (p) free(p); lua_pop(L, 1); status = -1; extensions_hook(err); } return status; } #if LUA_VERSION_NUM >= 502 static int traceback (lua_State *L) { const char *msg = lua_tostring(L, 1); if (msg) luaL_traceback(L, L, msg, 1); else if (!lua_isnoneornil(L, 1)) { /* is there an error object? */ if (!luaL_callmeta(L, 1, "__tostring")) /* try its 'tostring' metamethod */ lua_pushliteral(L, "(no error message)"); } return 1; } #else static int traceback (lua_State *L) { lua_getfield(L, LUA_GLOBALSINDEX, "debug"); if (!lua_istable(L, -1)) { lua_pop(L, 1); return 1; } lua_getfield(L, -1, "traceback"); if (!lua_isfunction(L, -1)) { lua_pop(L, 2); return 1; } lua_pushvalue(L, 1); /* pass error message */ lua_pushinteger(L, 2); /* skip this function and traceback */ lua_call(L, 2, 1); /* call debug.traceback */ return 1; } #endif static int docall (lua_State *L, int narg) { int status; int base = 0; if (debug_sw) { base = lua_gettop(L) - narg; /* function index */ lua_pushcfunction(L, traceback); /* push traceback function */ lua_insert(L, base); /* put it under chunk and args */ } busy ++; status = lua_pcall(L, narg, LUA_MULTRET, base); busy --; if (debug_sw) lua_remove(L, base); /* remove traceback function */ /* force a complete garbage collection in case of errors */ if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0); return status; } int instead_pcall(lua_State *L, int nargs) { int status; status = docall(L, nargs); status = report(L, status); return status; } static int dofile (lua_State *L, const char *name) { int status = luaL_loadfile(L, name) || docall(L, 0); return report(L, status); } static const char *idf_reader(lua_State *L, void *data, size_t *size) { static char buff[4096]; int rc; rc = idf_read((idff_t)data, buff, 1, sizeof(buff)); *size = rc; if (!rc) return NULL; return buff; } static int dofile_idf (lua_State *L, idff_t idf, const char *name) { #if LUA_VERSION_NUM >= 502 int status = lua_load(L, idf_reader, idf, name, "bt") || docall(L, 0); #else int status = lua_load(L, idf_reader, idf, name) || docall(L, 0); #endif return report(L, status); } static int dostring (lua_State *L, const char *s) { int status = luaL_loadstring(L, s) || docall(L, 0); return report(L, status); } char *getstring(char *cmd) { char *s; int N; if (!L) return NULL; if (dostring(L, cmd)) return NULL; N = lua_gettop(L); /* number of arguments */ if (-N >=0) return NULL; s = (char*)lua_tostring(L, -N); if (s) s = instead_fromgame(s); return s; } int instead_eval(char *s) { if (!L) return -1; if (dostring(L, s)) return -1; return 0; } int instead_clear(void) { int N; if (!L) return -1; N = lua_gettop(L); /* number of arguments */ lua_pop(L, N); return 0; } char *instead_retval(int n) { char *s; int N; if (!L) return NULL; N = lua_gettop(L); /* number of arguments */ /* fprintf(stderr,"%d\n", N); */ if (n - N >= 0) return NULL; s = (char*)lua_tostring(L, n - N); if (s) s = instead_fromgame(s); return s; } int instead_bretval(int n) { int N; if (!L) return 0; N = lua_gettop(L); /* number of arguments */ if (n - N >= 0) return 1; return lua_toboolean(L, n - N); } int instead_iretval(int n) { int N; if (!L) return 0; N = lua_gettop(L); /* number of arguments */ if (n - N >= 0) return 0; return lua_tonumber(L, n - N); } char *instead_file_cmd(char *s, int *rc) { struct instead_args args[] = { { .val = NULL, .type = INSTEAD_STR }, { .val = NULL, }, }; if (!s) return NULL; args[0].val = s; instead_function("iface:cmd", args); s = instead_retval(0); if (rc) *rc = !instead_bretval(1); instead_clear(); extensions_hook(cmd); return s; } char *instead_cmd(char *s, int *rc) { struct instead_args args[] = { { .val = NULL, .type = INSTEAD_STR }, { .val = NULL, }, }; if (!s) return NULL; s = togame(s); if (!s) return NULL; args[0].val = s; instead_function("iface:cmd", args); free(s); s = instead_retval(0); if (rc) *rc = !instead_bretval(1); instead_clear(); extensions_hook(cmd); return s; } int instead_function(char *s, struct instead_args *args) { int base = 0; int status = 0; int n = 0; char *p; char f[64]; int method = 0; if (!L) return -1; strcpy(f, s); p = strchr(f, '.'); if (!p) p = strchr(f, ':'); if (p) { if (*p == ':') method = 1; *p = 0; p ++; lua_getglobal(L, f); lua_getfield(L, -1, p); lua_remove(L, -2); if (method) lua_getglobal(L, f); } else lua_getglobal(L, s); if (args) { while (args->val) { switch(args->type) { case INSTEAD_NIL: lua_pushnil(L); break; case INSTEAD_NUM: lua_pushnumber(L, atoi(args->val)); break; case INSTEAD_BOOL: if (!strcmp(args->val, "true")) lua_pushboolean(L, 1); else lua_pushboolean(L, 0); break; default: case INSTEAD_STR: lua_pushstring(L, args->val); } args ++; n ++; } } if (debug_sw) { base = lua_gettop(L) - (method + n); /* function index */ lua_pushcfunction(L, traceback); /* push traceback function */ lua_insert(L, base); /* put it under chunk and args */ } busy ++; status = lua_pcall(L, method + n, LUA_MULTRET, base); busy --; if (debug_sw) lua_remove(L, base); /* remove traceback function */ if (status) { fprintf(stderr, "Error calling:%s\n", s); lua_gc(L, LUA_GCCOLLECT, 0); } return report(L, status); } #ifdef _HAVE_ICONV static char *curcp = "UTF-8"; static char *fromcp = NULL; #endif #ifdef _HAVE_ICONV char *instead_fromgame(const char *s) { iconv_t han; char *str; if (!s) return NULL; if (!fromcp) goto out0; han = iconv_open(curcp, fromcp); if (han == (iconv_t)-1) goto out0; if (!(str = decode(han, s))) goto out1; iconv_close(han); return str; out1: iconv_close(han); out0: return strdup(s); } char *togame(const char *s) { iconv_t han; char *str; if (!s) return NULL; if (!fromcp) goto out0; han = iconv_open(fromcp, curcp); if (han == (iconv_t)-1) goto out0; if (!(str = decode(han, s))) goto out1; iconv_close(han); return str; out1: iconv_close(han); out0: return strdup(s); } #else char *instead_fromgame(const char *s) { if (!s) return NULL; return strdup(s); } char *togame(const char *s) { if (!s) return NULL; return strdup(s); } #endif static int instead_getargs (char **argv, int n) { int i; for (i = 0; i < n; i++) { lua_pushstring(L, argv[i]); } lua_createtable(L, n, 0); for (i = 0; i < n; i++) { lua_pushstring(L, argv[i]); lua_rawseti(L, -2, i + 1); } lua_setglobal(L, "arg"); return 0; } int instead_load(char **info) { int rc; idff_t idf; rc = instead_function("stead:init", NULL); instead_clear(); if (rc) goto err; idf = idf_open(data_idf, MAIN); if (idf) { int rc = dofile_idf(L, idf, MAIN); idf_close(idf); if (rc) goto err; } else if (dofile(L, dirpath(MAIN))) { goto err; } instead_clear(); #ifdef _HAVE_ICONV if (fromcp) free(fromcp); fromcp = getstring("return game.codepage;"); instead_clear(); #endif rc = instead_function("game:ini", NULL); if (rc) goto err2; if (info) { *info = instead_retval(0); *info = instead_fromgame(*info); } instead_clear(); return rc; err2: instead_clear(); err: return -1; } int instead_loadfile(char *name) { return instead_loadscript(name, -1, NULL, 1); } int instead_loadscript(char *name, int argc, char **argv, int exec) { int status; if (exec && argc >= 0) instead_getargs(argv, argc); status = luaL_loadfile(L, name); if (!status) { if (exec) { if (argc >= 0) lua_insert(L, -(argc + 1)); else argc = 0; status |= docall(L, argc); } } status = report(L, status); instead_clear(); return status; } typedef struct LoadF { int extraline; unsigned char byte; FILE *f; idff_t idff; int enc; unsigned char buff[4096]; } LoadF; static const char *getF (lua_State *L, void *ud, size_t *size) { unsigned int i = 0; LoadF *lf = (LoadF *)ud; (void)L; if (lf->extraline) { lf->extraline = 0; *size = 1; return "\n"; } if (lf->f && feof(lf->f)) return NULL; if (lf->idff && idf_eof(lf->idff)) return NULL; if (lf->idff) *size = idf_read(lf->idff, lf->buff, 1, sizeof(lf->buff)); else *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); if (lf->enc) { for (i = 0; i < *size; i ++) { unsigned char b = lf->buff[i]; lf->buff[i] ^= lf->byte; lf->buff[i] = (lf->buff[i] >> 3) | (lf->buff[i] << 5); lf->byte = b; } } return (*size > 0) ? (char*)lf->buff : NULL; } static int errfile (lua_State *L, const char *what, int fnameindex) { const char *serr = strerror(errno); const char *filename = lua_tostring(L, fnameindex) + 1; lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); lua_remove(L, fnameindex); return LUA_ERRFILE; } static int loadfile (lua_State *L, const char *filename, int enc) { LoadF lf; int status, readstatus; int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ lf.extraline = 0; lua_pushfstring(L, "@%s", filename); lf.idff = idf_open(data_idf, filename); if (!lf.idff) lf.f = fopen(dirpath(filename), "rb"); else lf.f = NULL; lf.byte = 0xcc; lf.enc = enc; if (lf.f == NULL && lf.idff == NULL) return errfile(L, "open", fnameindex); #if LUA_VERSION_NUM >= 502 status = lua_load(L, getF, &lf, lua_tostring(L, -1), "bt"); #else status = lua_load(L, getF, &lf, lua_tostring(L, -1)); #endif if (lf.f) readstatus = ferror(lf.f); else readstatus = idf_error(lf.idff); if (lf.f) fclose(lf.f); /* close file (even in case of errors) */ else idf_close(lf.idff); if (readstatus) { lua_settop(L, fnameindex); /* ignore results from `lua_load' */ return errfile(L, "read", fnameindex); } lua_remove(L, fnameindex); return status; } static int luaB_doencfile (lua_State *L) { const char *fname = luaL_optstring(L, 1, NULL); int n = lua_gettop(L); if (loadfile(L, fname, 1) != 0) lua_error(L); lua_call(L, 0, LUA_MULTRET); return lua_gettop(L) - n; } static int luaB_dofile (lua_State *L) { const char *fname = luaL_optstring(L, 1, NULL); int n = lua_gettop(L); if (loadfile(L, fname, 0) != 0) lua_error(L); lua_call(L, 0, LUA_MULTRET); return lua_gettop(L) - n; } static int luaB_print (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ int i; lua_getglobal(L, "tostring"); for (i=1; i<=n; i++) { const char *s; lua_pushvalue(L, -1); /* function to be called */ lua_pushvalue(L, i); /* value to print */ lua_call(L, 1, 1); s = lua_tostring(L, -1); /* get result */ if (s == NULL) return luaL_error(L, LUA_QL("tostring") " must return a string to "LUA_QL("print")); if (i>1) fputs("\t", stdout); fputs(s, stdout); lua_pop(L, 1); /* pop result */ } fputs("\n", stdout); return 0; } static int luaB_maxn (lua_State *L) { lua_Integer max = 0; luaL_checktype(L, 1, LUA_TTABLE); lua_pushnil(L); /* first key */ while (lua_next(L, 1)) { lua_pop(L, 1); /* remove value */ if (lua_type(L, -1) == LUA_TNUMBER) { lua_Number v = lua_tonumber(L, -1); if (v > max) max = v; } } lua_pushinteger(L, max); return 1; } static int luaB_srandom(lua_State *L) { mt_random_seed(luaL_optnumber(L, 1, time(NULL))); return 0; } static int luaB_random(lua_State *L) { lua_Number rt; unsigned long r = 0; long a = luaL_optnumber(L, 1, -1); long b = luaL_optnumber(L, 2, -1); r = mt_random(); if (a >=0 && b > a) { r = a + (r % (b - a + 1)); lua_pushinteger(L, r); } else if (a > 0 && b == -1) { r = (r % a) + 1; lua_pushinteger(L, r); } else { rt = mt_random_double(); lua_pushnumber(L, rt); } return 1; } static int luaB_get_realpath(lua_State *L) { char realpath[PATH_MAX]; char outpath[PATH_MAX]; const char *path = luaL_optstring(L, 1, NULL); if (!path) return 0; strncpy(realpath, path, sizeof(realpath)); realpath[sizeof(realpath) - 1] = 0; unix_path(realpath); path = getrealpath(realpath, outpath); if (!path) return 0; lua_pushstring(L, outpath); return 1; } static int luaB_get_gamepath(lua_State *L) { char path[PATH_MAX * 2]; char *p = getdir(path, sizeof(path)); if (!p) return 0; unix_path(p); if (idf_only(instead_idf(), -1) == 1) { /* no gamepath */ strcpy(path, instead_game_path); } lua_pushstring(L, p); return 1; } static int luaB_get_steadpath(lua_State *L) { char stead_path[PATH_MAX]; if (STEAD_API_PATH[0] != '/') { strcpy(stead_path, instead_cwd()); strcat(stead_path, "/"); } else stead_path[0] = 0; strcat(stead_path, STEAD_API_PATH); unix_path(stead_path); lua_pushstring(L, stead_path); return 1; } extern int dir_iter_factory (lua_State *L); extern int luaopen_lfs (lua_State *L); static const luaL_Reg base_funcs[] = { {"print", luaB_print}, /* for some mystic, it is needed in win version (with -debug) */ {"doencfile", luaB_doencfile}, {"dofile", luaB_dofile}, {"table_get_maxn", luaB_maxn}, {"instead_random", luaB_random}, {"instead_srandom", luaB_srandom}, {"instead_realpath", luaB_get_realpath}, {"instead_gamepath", luaB_get_gamepath}, {"instead_steadpath", luaB_get_steadpath}, {"instead_readdir", dir_iter_factory}, { NULL, NULL } }; static int instead_platform(void) { char plat[64]; if (!L) return 0; #if defined(IOS) snprintf(plat, sizeof(plat) - 1, "PLATFORM='IOS'"); #elif defined(__APPLE__) snprintf(plat, sizeof(plat) - 1, "PLATFORM='MACOSX'"); #elif defined(_WIN32_WCE) snprintf(plat, sizeof(plat) - 1, "PLATFORM='WINCE'"); #elif defined(WINRT) snprintf(plat, sizeof(plat) - 1, "PLATFORM='WINRT'"); #elif defined(S60) snprintf(plat, sizeof(plat) - 1, "PLATFORM='S60'"); #elif defined(ANDROID) snprintf(plat, sizeof(plat) - 1, "PLATFORM='ANDROID'"); #elif defined(_WIN32) snprintf(plat, sizeof(plat) - 1, "PLATFORM='WIN32'"); #elif defined(MAEMO) snprintf(plat, sizeof(plat) - 1, "PLATFORM='MAEMO'"); #elif defined(SAILFISHOS) snprintf(plat, sizeof(plat) - 1, "PLATFORM='SFOS'"); #else snprintf(plat, sizeof(plat) - 1, "PLATFORM='UNIX'"); #endif plat[sizeof(plat) - 1] = 0; instead_eval(plat); instead_clear(); return 0; } static int instead_package(const char *path) { char *stead_path; stead_path = malloc(PATH_MAX * 5); /* instead_cwd + STEAD_API_PATH and so on... */ if (!stead_path) return -1; strcpy(stead_path, "package.path=\""); #if defined(_WIN32_WCE) || defined(WINRT) if (path) { strcat(stead_path, path); /* wince have not cwd :) */ strcat(stead_path, "/?.lua;"); } #else if (path) strcat(stead_path, "./?.lua;"); #endif #ifdef INSTEAD_LEGACY p = instead_local_stead_path(wd); if (p) { strcat(stead_path, p); strcat(stead_path, "/?.lua;"); } #endif if (!is_absolute_path(STEAD_API_PATH)) { strcat(stead_path, instead_cwd()); strcat(stead_path, "/"); strcat(stead_path, STEAD_API_PATH); } else { strcat(stead_path, STEAD_API_PATH); } strcat(stead_path, "/?.lua"); strcat(stead_path, "\""); if (standalone_sw) { strcat(stead_path, "..';'..(package.path or '')"); } instead_eval(stead_path); instead_clear(); free(stead_path); /* putenv(stead_path); */ return 0; } const char *instead_get_api(void) { return API; } static int instead_set_api(const char *api) { int i, c = 0; ssize_t s; char *oa; if (!api || !*api) { FREE(API); snprintf(instead_api_path, sizeof(instead_api_path), "%s", STEAD_PATH); } else { s = strlen(api); for (i = 0; i < s; i ++) { if (api[i] == '.') { if (c > 0) { instead_err_msg("Wrong API."); fprintf(stderr, "Wrong API.\n"); return -1; } c ++; } else c = 0; } oa = API; API = strdup(api); FREE(oa); snprintf(instead_api_path, sizeof(instead_api_path), "%s/%s", STEAD_PATH, API); } return 0; } static int instead_detect_api(const char *path) { int api = 0; char *p; if (data_idf && idf_only(data_idf, -1) == 1) { if (!idf_access(data_idf, INSTEAD_MAIN3)) api = 3; else if (!idf_access(data_idf, INSTEAD_MAIN)) api = 2; } else { p = getfilepath(path, INSTEAD_MAIN3); if (!p) return -1; if (!access(dirpath(p), R_OK)) api = 3; free(p); if (api) goto out; p = getfilepath(path, INSTEAD_MAIN); if (!access(dirpath(p), R_OK)) api = 2; free(p); } out: switch (api){ case 2: if (instead_set_api("stead2") < 0) return -1; MAIN = INSTEAD_MAIN; break; case 3: if (instead_set_api("stead3") < 0) return -1; MAIN = INSTEAD_MAIN3; break; default: return -1; } return api; } int instead_init_lua(const char *path, int detect) { int api = 0; busy = 0; setlocale(LC_ALL, ""); setlocale(LC_NUMERIC, "C"); /* to avoid . -> , in numbers */ setlocale(LC_CTYPE, "C"); /* to avoid lower/upper problems */ #ifdef LC_MESSAGES setlocale(LC_MESSAGES, "C"); #endif #ifdef LC_COLLATE setlocale(LC_COLLATE, "C"); #endif /* strcpy(curcp, "UTF-8"); */ getdir(instead_cwd_path, sizeof(instead_cwd_path)); unix_path(instead_cwd_path); instead_cwd_path[sizeof(instead_cwd_path) - 1] = 0; strncpy(instead_game_path, path, sizeof(instead_game_path)); instead_cwd_path[sizeof(instead_game_path) - 1] = 0; if (detect && (api = instead_detect_api(path)) < 0) { fprintf(stderr, "Can not detect game format: %s\n", path); instead_err_msg("Can not detect game format."); return -1; } /* initialize Lua */ #if LUA_VERSION_NUM >= 502 L = luaL_newstate(); #else L = lua_open(); #endif if (!L) return -1; luaL_openlibs(L); #if LUA_VERSION_NUM >= 502 lua_pushglobaltable(L); lua_pushglobaltable(L); lua_setfield(L, -2, "_G"); /* open lib into global table */ luaL_setfuncs(L, base_funcs, 0); #else luaL_register(L, "_G", base_funcs); #endif instead_package(path); instead_platform(); /* instead_set_lang(opt_lang); */ if (api == 3) instead_eval("API='stead3'"); else if (api == 2) instead_eval("API='stead2'"); if (debug_sw) instead_eval("DEBUG=true"); else instead_eval("DEBUG=false"); instead_clear(); if (standalone_sw) instead_eval("STANDALONE=true"); else instead_eval("STANDALONE=false"); instead_clear(); srand(time(NULL)); mt_random_init(); luaopen_lfs(L); return 0; } int instead_init(const char *path) { char stead_path[PATH_MAX]; int idf = 0; if (data_idf) idf_done(data_idf); data_idf = idf_init(path); if (data_idf) { idf_only(data_idf, 1); idf = 1; } if (instead_init_lua(path, 1)) goto err; snprintf(stead_path, sizeof(stead_path), "%s/stead.lua", STEAD_API_PATH); if (dofile(L, dirpath(stead_path))) goto err; if (extensions_hook(init) < 0) { fprintf(stderr, "Can't init instead engine.\n"); goto err; } #ifdef _USE_SDL #ifndef __EMSCRIPTEN__ sem = SDL_CreateMutex(); if (!sem) goto err; #endif #endif if ((!idf && setdir(path))) { instead_clear(); goto err; } if (!idf) data_idf = idf_init(DATA_IDF); /* cleanup Lua */ instead_clear(); instead_err_msg(NULL); return 0; err: if (data_idf) { idf_done(data_idf); data_idf = NULL; } if (L) lua_close(L); L = NULL; return -1; } int instead_api_register(const luaL_Reg *api) { if (!L) return -1; #if LUA_VERSION_NUM >= 502 lua_pushglobaltable(L); luaL_setfuncs(L, api, 0); #else lua_getfield(L, LUA_GLOBALSINDEX, "_G"); luaL_register(L, NULL, api); #endif lua_pop(L, 1); return 0; } void instead_done(void) { int wasL = !!L; if (wasL) extensions_hook(done); #ifdef _USE_SDL #ifndef __EMSCRIPTEN__ if (sem) SDL_DestroyMutex(sem); sem = NULL; #endif #endif #ifdef _HAVE_ICONV FREE(fromcp); #endif if (L) lua_close(L); L = NULL; if (data_idf) idf_done(data_idf); data_idf = NULL; if (wasL) setdir(instead_cwd_path); FREE(API); } int instead_encode(const char *s, const char *d) { FILE *src; FILE *dst; size_t size; unsigned int i = 0; unsigned char byte = 0xcc; unsigned char buff[4096]; src = fopen(s, "rb"); if (!src) { fprintf(stderr,"Can't open on read: '%s'.\n", s); return -1; } dst = fopen(d, "wb"); if (!dst) { fprintf(stderr,"Can't open on write: '%s'.\n", s); fclose(src); return -1; } while ((size = fread(buff, 1, sizeof(buff), src))) { for (i = 0; i < size; i++) { buff[i] = (buff[i] << 3) | (buff[i] >> 5); buff[i] ^= byte; byte = buff[i]; } if (fwrite(buff, 1, size, dst) != size) { fprintf(stderr, "Error while writing file: '%s'.\n", d); fclose(src); fclose(dst); return -1; } } fclose(src); fclose(dst); return 0; } idf_t instead_idf(void) { return data_idf; } char *instead_stead_path(void) { return instead_api_path; } char *instead_path(void) { return instead_game_path; } char *instead_cwd(void) { return instead_cwd_path; } int instead_set_debug(int sw) { int ov = debug_sw; debug_sw = sw; if (L) { if (sw) instead_eval("DEBUG=true"); else instead_eval("DEBUG=false"); instead_clear(); } return ov; } int instead_set_standalone(int sw) { int ov = standalone_sw; standalone_sw = sw; if (L) { if (sw) instead_eval("STANDALONE=true"); else instead_eval("STANDALONE=false"); instead_clear(); } return ov; } int instead_set_lang(const char *opt_lang) { char lang[64]; if (!L) return 0; if (opt_lang && *opt_lang) snprintf(lang, sizeof(lang) - 1, "LANG='%s'", opt_lang); else snprintf(lang, sizeof(lang) - 1, "LANG='en'"); instead_eval(lang); instead_clear(); return 0; } lua_State *instead_lua(void) { return L; } instead-3.2.1/src/instead/idf.c0000644000175000017500000003334613267071774015337 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "system.h" #include "idf.h" #include "util.h" #include "cache.h" #include "list.h" typedef struct _idfd_t { struct list_head list; unsigned long offset; unsigned long size; idf_t idf; } idfd_t; struct _idff_t { struct list_node list; idfd_t *dir; unsigned long pos; FILE *fd; }; struct _idf_t { unsigned long size; FILE *fd; char *path; char cwd[PATH_MAX]; cache_t dir; int idfonly; }; static void free_idfd(void *p) { idfd_t *dir = (idfd_t*)p; if (!p) return; while (!list_empty(&dir->list)) { idff_t idff; idff = list_top(&dir->list, struct _idff_t, list); idf_close(idff); } free(p); } void idf_done(idf_t idf) { if (!idf) return; if (idf->path) free(idf->path); if (idf->dir) cache_free(idf->dir); if (idf->fd) fclose(idf->fd); free(idf); } void idf_shrink(idf_t idf) { if (!idf) return; if (idf->dir) cache_shrink(idf->dir); } static int read_word(FILE *fd, unsigned long *w) { unsigned char word[4]; if (fread(word, 1, 4, fd) != 4) return -1; *w = (unsigned long)word[0] | ((unsigned long)word[1] << 8) | ((unsigned long)word[2] << 16) | ((unsigned long)word[3] << 24); return 0; } static int write_word(FILE *fd, unsigned long w) { char word[4]; word[0] = w & 0xff; word[1] = (w & 0xff00) >> 8; word[2] = (w & 0xff0000) >> 16; word[3] = (w & 0xff000000) >> 24; if (fwrite(word, 1, 4, fd) != 4) return -1; return 0; } int idf_magic(const char *fname) { char sign[4]; FILE *fd = fopen(dirpath(fname), "rb"); if (!fd) return 0; if (fread(sign, 1, 4, fd) != 4) { fclose(fd); return 0; } fclose(fd); if (!memcmp(sign, "IDF1", 4)) return 1; return 0; } int idf_setdir(idf_t idf, const char *path) { if (idf && path) strcpy(idf->cwd, path); return 0; } char *idf_getdir(idf_t idf) { if (!idf) return NULL; return idf->cwd; } idf_t idf_init(const char *fname) { char sign[4]; unsigned long dir_size; char *fp = dirpath(fname); idf_t idf = malloc(sizeof(struct _idf_t)); if (!idf) return NULL; memset(idf, 0, sizeof(struct _idf_t)); idf->path = strdup(fname); if (!idf->path) goto err; idf->idfonly = 0; idf->fd = fopen(fp, "rb"); idf->dir = cache_init(-1, free_idfd); idf->cwd[0] = 0; if (!idf->fd || !idf->dir) goto err; if (fseek(idf->fd, 0, SEEK_END)) goto err; idf->size = ftell(idf->fd); if ((int)idf->size < 0) goto err; if (fseek(idf->fd, 0, SEEK_SET)) goto err; if (fread(sign, 1, 4, idf->fd) != 4) goto err; if (memcmp(sign, "IDF1", 4)) goto err; if (read_word(idf->fd, &dir_size)) goto err; if (dir_size > idf->size) goto err; while (dir_size > 0) { unsigned long off; unsigned long size; unsigned char sz; char name[256]; idfd_t *e; if (fread(&sz, 1, 1, idf->fd) != 1) goto err; if (fread(name, 1, sz, idf->fd) != sz) goto err; name[sz] = 0; if (read_word(idf->fd, &off)) goto err; if (read_word(idf->fd, &size)) goto err; e = malloc(sizeof(idfd_t)); if (!e) goto err; e->offset = off; e->size = size; e->idf = idf; list_head_init(&e->list); if (cache_add(idf->dir, name, e)) { free(e); goto err; } cache_forget(idf->dir, e); /* use like hash */ /* fprintf(stderr,"Parsed: '%s' @ %ld, %ld\n", name, off, size); */ dir_size -= (1 + sz + 4 + 4); } return idf; err: idf_done(idf); return NULL; } typedef struct { struct list_node list; char *path; long size; struct list_head dir; } idf_item_t; typedef struct { struct list_node list; char *dname; } idf_dir_item_t; static int fcopy(FILE *to, const char *fname) { int rc = -1; char buff[4096]; FILE *fd; fd = fopen(fname, "rb"); if (!fd) return -1; while (!feof(fd)) { int s = fread(buff, 1, sizeof(buff), fd); if (!s) { if (feof(fd)) break; goto err; } if (fwrite(buff, 1, s, to) != (size_t)s) goto err; } rc = 0; err: fclose(fd); return rc; } static int idf_tree(const char *path, struct list_head *list, const char *fname) { idf_item_t *dir; DIR *d; struct dirent *de; if (!path) return 0; d = opendir(dirpath(path)); if (!d) { if (!access(dirpath(path), R_OK) && fname) { FILE *fd; idf_item_t *i; fd = fopen(dirpath(path), "rb"); if (!fd) { fprintf(stderr, "Can not open file: '%s'\n", path); return -1; } i = malloc(sizeof(idf_item_t)); if (!i) { fclose(fd); return -1; } /* list_head_init(&i->list); */ if (!(i->path = strdup(fname))) goto err; if (fseek(fd, 0, SEEK_END) < 0) goto err; if ((i->size = ftell(fd)) < 0) goto err; list_head_init(&i->dir); fclose(fd); fprintf(stderr, "Added file: '%s' size: %ld\n", path, i->size); list_add(list, &i->list); return 0; err: if (i->path) free(i->path); free(i); return -1; } return 0; } dir = malloc(sizeof(idf_item_t)); if (!dir) goto err1; if (fname) { char *d = malloc(strlen(fname) + 2); if (!d) goto err2; strcpy(d, fname); strcat(d, "/"); dir->path = d; } else { dir->path = strdup("/"); } dir->size = 0; list_head_init(&dir->dir); while ((de = readdir(d))) { char *p; idf_dir_item_t *di; if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue; di = malloc(sizeof(idf_dir_item_t)); if (di) { di->dname = strdup(de->d_name); list_add(&dir->dir, &di->list); dir->size += strlen(de->d_name) + 1; } p = getfilepath(path, de->d_name); if (p) { char *pp = getfilepath(fname, de->d_name); if (pp) { idf_tree(p, list, pp); free(pp); } free(p); } } list_add(list, &dir->list); fprintf(stderr, "Added dir: '%s' size: %ld\n", dir->path, dir->size); closedir(d); return 0; err2: free(dir); err1: closedir(d); return -1; } int idf_create(const char *file, const char *path) { int rc = -1, i; FILE *fd; char *p; unsigned long off = 0; long dict_size = 0; idf_item_t *pos = NULL; LIST_HEAD(items); p = strdup(path); if (!p) return -1; unix_path(p); i = strlen(p) - 1; while (i >= 0 && p[i] == '/') { p[i --] = 0; } idf_tree(p, &items, NULL); free(p); list_for_each(&items, pos, list) { idf_item_t *it = pos; dict_size += (1 + strlen(it->path) + 4 + 4); } fd = fopen(dirpath(file), "wb"); if (!fd) goto err; if (fwrite("IDF1", 1, 4, fd) != 4) goto err; if (write_word(fd, dict_size) < 0) goto err; off = 4 + 4 + dict_size; list_for_each(&items, pos, list) { unsigned char s; idf_item_t *it = pos; s = strlen(it->path); if (fwrite(&s, 1, 1, fd) != 1) goto err; p = strdup(it->path); if (!p) goto err; tolow(p); /* in idf always lowcase */ if (fwrite(p, 1, s, fd) != s) { free(p); goto err; } free(p); if (write_word(fd, off) < 0) goto err; if (write_word(fd, it->size) < 0) goto err; off += it->size; } list_for_each(&items, pos, list) { idf_item_t *it = pos; char *p; if (!list_empty(&it->dir)) { /* directory-file */ idf_dir_item_t *d = NULL; list_for_each(&it->dir, d, list) { fprintf(fd, "%s\n", d->dname); } continue; } p = getfilepath(path, it->path); if (p) { int rc = fcopy(fd, p); free(p); if (rc) { fprintf(stderr, "Error while copy file '%s'...\n", it->path); goto err; } } } rc = 0; err: if (rc) fprintf(stderr, "Error creating idf file...\n"); while (!list_empty(&items)) { idf_item_t *it = list_top(&items, idf_item_t, list); while (!list_empty(&it->dir)) { idf_dir_item_t *di = list_top(&it->dir, idf_dir_item_t, list); free(di->dname); list_del(&di->list); free(di); } free(it->path); list_del(&it->list); free(it); } if (fd) fclose(fd); return rc; } int idf_seek(idff_t fil, int offset, int whence) { idfd_t *dir = fil->dir; switch (whence) { case SEEK_SET: if (offset < 0 || (unsigned int)offset > dir->size) { return -1; } fil->pos = offset; break; case SEEK_END: if (dir->size + offset > dir->size || (int)(dir->size + offset) < 0) { return -1; } fil->pos = dir->size + offset; break; case SEEK_CUR: if (fil->pos + offset > dir->size || (int)(fil->pos + offset) < 0) { return -1; } fil->pos += offset; break; } if (!fseek(fil->fd, fil->pos + dir->offset, SEEK_SET)) return fil->pos; return -1; } int idf_close(idff_t fil) { if (fil) { fclose(fil->fd); list_del(&fil->list); free(fil); } return 0; /* nothing todo */ } #if 0 int idf_extract(idf_t idf, const char *fname) { FILE *out; int size; idfd_t *dir = NULL; char buff[4096]; if (idf) dir = cache_lookup(idf->dir, fname); if (!dir) return -1; fseek(idf->fd, dir->offset, SEEK_SET); out = fopen("out.bin", "wb"); size = dir->size; while (size>0) { int s ; if (size < sizeof(buff)) s = fread(buff, 1, size, idf->fd); else s = fread(buff, 1, sizeof(buff), idf->fd); fwrite(buff, 1, s, out); size -= s; fprintf(stderr, "size = %d\n", size); } fclose(out); return 0; } #endif int idf_eof(idff_t idf) { if (!idf) return 1; if (idf->pos >= idf->dir->size) return 1; return 0; } int idf_error(idff_t idf) { if (!idf || !idf->fd) return -1; return ferror(idf->fd); } int idf_only(idf_t idf, int fl) { int i; if (!idf) return -1; if (fl == -1) return idf->idfonly; i = idf->idfonly; idf->idfonly = fl; return i; } idff_t idf_open(idf_t idf, const char *fname) { char *rp; idfd_t *dir = NULL; idff_t fil = NULL; char *p; if (!idf || !fname) return NULL; p = strdup(fname); if (!p) return NULL; tolow(p); rp = getfilepath(idf->cwd, p); if (rp) { dir = cache_lookup(idf->dir, rp); free(rp); } free(p); if (!dir) return NULL; fil = malloc(sizeof(struct _idff_t)); if (!fil) return NULL; /* list_head_init(&fil->list); */ fil->dir = dir; fil->pos = 0; fil->fd = fopen(dirpath(idf->path), "rb"); if (!fil->fd) goto err; list_add(&dir->list, &fil->list); return fil; err: free(fil); return NULL; } int idf_access(idf_t idf, const char *fname) { char *rp; idfd_t *dir = NULL; if (idf) { rp = getfilepath(idf->cwd, fname); if (rp) { dir = cache_lookup(idf->dir, rp); free(rp); } } if (!dir) return -1; return 0; } idff_t idf_opendir(idf_t idf, const char *dname) { return idf_open(idf, dname); } int idf_closedir(idff_t d) { return idf_close(d); } char *idf_readdir(idff_t d) { char buff[256]; char *p = idf_gets(d, buff, sizeof(buff) - 1); if (!p) return p; return strdup(p); } char *idf_gets(idff_t idf, char *b, int size) { int rc, rc2; if (!idf) return NULL; if (!size) return NULL; rc = idf_read(idf, b, 1, size); if (rc < 0) return NULL; if (!rc && idf_eof(idf)) return NULL; if (!idf_eof(idf)) b[rc - 1] = 0; else { if (rc < size) b[rc] = 0; else b[size - 1] = 0; } rc2 = strcspn(b, "\n"); b[rc2] = 0; idf_seek(idf, - (rc - rc2 - 1), SEEK_CUR); return b; } int idf_read(idff_t fil, void *ptr, int size, int maxnum) { int rc = 0; long pos; idfd_t *dir = fil->dir; if (fseek(fil->fd, dir->offset + fil->pos, SEEK_SET) < 0) { return 0; } #if 1 while (maxnum) { pos = ftell(fil->fd); fil->pos = pos - dir->offset; if (fil->pos + size > dir->size) { break; } if (fread(ptr, size, 1, fil->fd) != 1) break; /* fil->pos += size; */ ptr = (char *)ptr + size; maxnum --; rc ++; } #else rc = fread(ptr, size, maxnum, fil->fd); #endif pos = ftell(fil->fd); fil->pos = pos - dir->offset; return rc; } #ifdef _USE_SDL #include #if SDL_VERSION_ATLEAST(2,0,0) static Sint64 idfrw_seek(struct SDL_RWops *context, Sint64 offset, int whence) #else static int idfrw_seek(struct SDL_RWops *context, int offset, int whence) #endif { idff_t fil = (idff_t)context->hidden.unknown.data1; return idf_seek(fil, offset, whence); } #if SDL_VERSION_ATLEAST(2,0,0) static size_t idfrw_read(struct SDL_RWops *context, void *ptr, size_t size, size_t maxnum) #else static int idfrw_read(struct SDL_RWops *context, void *ptr, int size, int maxnum) #endif { idff_t fil = (idff_t)context->hidden.unknown.data1; return idf_read(fil, ptr, size, maxnum); } static int idfrw_close(struct SDL_RWops *context) { if (context) { idff_t fil = (idff_t)context->hidden.unknown.data1; idf_close(fil); SDL_FreeRW(context); } return 0; } #if SDL_VERSION_ATLEAST(2,0,0) static Sint64 idfrw_size(struct SDL_RWops *context) { idff_t fil = (idff_t)context->hidden.unknown.data1; if (!fil || !fil->dir) return -1; return fil->dir->size; } #endif SDL_RWops *RWFromIdf(idf_t idf, const char *fname) { idff_t fil = NULL; SDL_RWops *n; fil = idf_open(idf, fname); if (!fil) { if (!idf || !idf->idfonly) return SDL_RWFromFile(dirpath(fname), "rb"); return NULL; } n = SDL_AllocRW(); if (!n) goto err; #if SDL_VERSION_ATLEAST(2,0,0) n->size = idfrw_size; #endif n->seek = idfrw_seek; n->read = idfrw_read; n->close = idfrw_close; n->hidden.unknown.data1 = fil; return n; err: if (n) SDL_FreeRW(n); free(fil); return NULL; } #endif instead-3.2.1/src/instead/instead.h0000644000175000017500000000625313267071774016226 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __INSTEAD_H__ #define __INSTEAD_H__ #include #include #include "idf.h" #include "list.h" #define INSTEAD_NIL 0 #define INSTEAD_NUM 1 #define INSTEAD_STR 2 #define INSTEAD_BOOL 3 #define INSTEAD_MAIN "main.lua" #define INSTEAD_MAIN3 "main3.lua" #define INSTEAD_IDF "data.idf" #ifndef STEAD_PATH #define STEAD_PATH "./stead" #endif struct instead_args { int type; const char *val; }; struct instead_ext { struct list_node list; int (*init)(void); int (*done)(void); int (*err)(void); int (*cmd)(void); }; extern int instead_init(const char *path); extern int instead_load(char **info); extern void instead_done(void); extern void instead_lock(void); extern void instead_unlock(void); extern char *instead_cmd(char *s, int *rc); extern char *instead_file_cmd(char *s, int *rc); extern int instead_function(char *s, struct instead_args *args); extern int instead_eval(char *s); extern int instead_pcall(lua_State *L, int nargs); extern int instead_clear(void); extern char *instead_retval(int n); extern int instead_bretval(int n); extern int instead_iretval(int n); extern char *instead_fromgame(const char *s); extern int instead_encode(const char *s, const char *d); extern int instead_busy(void); /* internal use */ extern int instead_init_lua(const char *path, int detect); extern int instead_loadscript(char *name, int argc, char **argv, int exec); extern int instead_loadfile(char *name); extern void instead_err_msg(const char *s); extern const char *instead_err(void); extern int instead_extension(struct instead_ext *ext); extern int instead_api_register(const luaL_Reg *api); extern idf_t instead_idf(void); extern int instead_set_lang(const char *lang); extern int instead_set_debug(int); extern int instead_set_standalone(int); /* extern int instead_set_api(const char *api); */ extern const char *instead_get_api(void); extern lua_State *instead_lua(void); extern char *instead_local_stead_path(void); extern char *instead_path(void); extern char *instead_stead_path(void); extern char *instead_cwd(void); #endif instead-3.2.1/src/instead/snprintf.c0000644000175000017500000014721113267071774016435 0ustar peterpeter/* $Id: snprintf.c,v 1.9 2008/01/20 14:02:00 holger Exp $ */ /* * Copyright (c) 1995 Patrick Powell. * * This code is based on code written by Patrick Powell . * It may be used for any purpose as long as this notice remains intact on all * source code distributions. */ /* * Copyright (c) 2008 Holger Weiss. * * This version of the code is maintained by Holger Weiss . * My changes to the code may freely be used, modified and/or redistributed for * any purpose. It would be nice if additions and fixes to this file (including * trivial code cleanups) would be sent back in order to let me include them in * the version available at . * However, this is not a requirement for using or redistributing (possibly * modified) versions of this file, nor is leaving this notice intact mandatory. */ /* * History * * 2008-01-20 Holger Weiss for C99-snprintf 1.1: * * Fixed the detection of infinite floating point values on IRIX (and * possibly other systems) and applied another few minor cleanups. * * 2008-01-06 Holger Weiss for C99-snprintf 1.0: * * Added a lot of new features, fixed many bugs, and incorporated various * improvements done by Andrew Tridgell , Russ Allbery * , Hrvoje Niksic , Damien Miller * , and others for the Samba, INN, Wget, and OpenSSH * projects. The additions include: support the "e", "E", "g", "G", and * "F" conversion specifiers (and use conversion style "f" or "F" for the * still unsupported "a" and "A" specifiers); support the "hh", "ll", "j", * "t", and "z" length modifiers; support the "#" flag and the (non-C99) * "'" flag; use localeconv(3) (if available) to get both the current * locale's decimal point character and the separator between groups of * digits; fix the handling of various corner cases of field width and * precision specifications; fix various floating point conversion bugs; * handle infinite and NaN floating point values; don't attempt to write to * the output buffer (which may be NULL) if a size of zero was specified; * check for integer overflow of the field width, precision, and return * values and during the floating point conversion; use the OUTCHAR() macro * instead of a function for better performance; provide asprintf(3) and * vasprintf(3) functions; add new test cases. The replacement functions * have been renamed to use an "rpl_" prefix, the function calls in the * main project (and in this file) must be redefined accordingly for each * replacement function which is needed (by using Autoconf or other means). * Various other minor improvements have been applied and the coding style * was cleaned up for consistency. * * 2007-07-23 Holger Weiss for Mutt 1.5.13: * * C99 compliant snprintf(3) and vsnprintf(3) functions return the number * of characters that would have been written to a sufficiently sized * buffer (excluding the '\0'). The original code simply returned the * length of the resulting output string, so that's been fixed. * * 1998-03-05 Michael Elkins for Mutt 0.90.8: * * The original code assumed that both snprintf(3) and vsnprintf(3) were * missing. Some systems only have snprintf(3) but not vsnprintf(3), so * the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF. * * 1998-01-27 Thomas Roessler for Mutt 0.89i: * * The PGP code was using unsigned hexadecimal formats. Unfortunately, * unsigned formats simply didn't work. * * 1997-10-22 Brandon Long for Mutt 0.87.1: * * Ok, added some minimal floating point support, which means this probably * requires libm on most operating systems. Don't yet support the exponent * (e,E) and sigfig (g,G). Also, fmtint() was pretty badly broken, it just * wasn't being exercised in ways which showed it, so that's been fixed. * Also, formatted the code to Mutt conventions, and removed dead code left * over from the original. Also, there is now a builtin-test, run with: * gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm && ./snprintf * * 2996-09-15 Brandon Long for Mutt 0.43: * * This was ugly. It is still ugly. I opted out of floating point * numbers, but the formatter understands just about everything from the * normal C string format, at least as far as I can tell from the Solaris * 2.5 printf(3S) man page. */ /* * ToDo * * - Add wide character support. * - Add support for "%a" and "%A" conversions. * - Create test routines which predefine the expected results. Our test cases * usually expose bugs in system implementations rather than in ours :-) */ /* * Usage * * 1) The following preprocessor macros should be defined to 1 if the feature or * file in question is available on the target system (by using Autoconf or * other means), though basic functionality should be available as long as * HAVE_STDARG_H and HAVE_STDLIB_H are defined correctly: * * HAVE_VSNPRINTF * HAVE_SNPRINTF * HAVE_VASPRINTF * HAVE_ASPRINTF * HAVE_STDARG_H * HAVE_STDDEF_H * HAVE_STDINT_H * HAVE_STDLIB_H * HAVE_INTTYPES_H * HAVE_LOCALE_H * HAVE_LOCALECONV * HAVE_LCONV_DECIMAL_POINT * HAVE_LCONV_THOUSANDS_SEP * HAVE_LONG_DOUBLE * HAVE_LONG_LONG_INT * HAVE_UNSIGNED_LONG_LONG_INT * HAVE_INTMAX_T * HAVE_UINTMAX_T * HAVE_UINTPTR_T * HAVE_PTRDIFF_T * HAVE_VA_COPY * HAVE___VA_COPY * * 2) The calls to the functions which should be replaced must be redefined * throughout the project files (by using Autoconf or other means): * * #define vsnprintf rpl_vsnprintf * #define snprintf rpl_snprintf * #define vasprintf rpl_vasprintf * #define asprintf rpl_asprintf * * 3) The required replacement functions should be declared in some header file * included throughout the project files: * * #if HAVE_CONFIG_H * #include * #endif * #if HAVE_STDARG_H * #include * #if !HAVE_VSNPRINTF * int rpl_vsnprintf(char *, size_t, const char *, va_list); * #endif * #if !HAVE_SNPRINTF * int rpl_snprintf(char *, size_t, const char *, ...); * #endif * #if !HAVE_VASPRINTF * int rpl_vasprintf(char **, const char *, va_list); * #endif * #if !HAVE_ASPRINTF * int rpl_asprintf(char **, const char *, ...); * #endif * #endif * * Autoconf macros for handling step 1 and step 2 are available at * . */ #define HAVE_STDARG_H 1 #define HAVE_STDLIB_H 1 #if HAVE_CONFIG_H #include #endif /* HAVE_CONFIG_H */ #if TEST_SNPRINTF #include /* For pow(3), NAN, and INFINITY. */ #include /* For strcmp(3). */ #if defined(__NetBSD__) || \ defined(__FreeBSD__) || \ defined(__OpenBSD__) || \ defined(__NeXT__) || \ defined(__bsd__) #define OS_BSD 1 #elif defined(sgi) || defined(__sgi) #ifndef __c99 #define __c99 /* Force C99 mode to get included on IRIX 6.5.30. */ #endif /* !defined(__c99) */ #define OS_IRIX 1 #define OS_SYSV 1 #elif defined(__svr4__) #define OS_SYSV 1 #elif defined(__linux__) #define OS_LINUX 1 #endif /* defined(__NetBSD__) || defined(__FreeBSD__) || [...] */ #if HAVE_CONFIG_H /* Undefine definitions possibly done in config.h. */ #ifdef HAVE_SNPRINTF #undef HAVE_SNPRINTF #endif /* defined(HAVE_SNPRINTF) */ #ifdef HAVE_VSNPRINTF #undef HAVE_VSNPRINTF #endif /* defined(HAVE_VSNPRINTF) */ #ifdef HAVE_ASPRINTF #undef HAVE_ASPRINTF #endif /* defined(HAVE_ASPRINTF) */ #ifdef HAVE_VASPRINTF #undef HAVE_VASPRINTF #endif /* defined(HAVE_VASPRINTF) */ #ifdef snprintf #undef snprintf #endif /* defined(snprintf) */ #ifdef vsnprintf #undef vsnprintf #endif /* defined(vsnprintf) */ #ifdef asprintf #undef asprintf #endif /* defined(asprintf) */ #ifdef vasprintf #undef vasprintf #endif /* defined(vasprintf) */ #else /* By default, we assume a modern system for testing. */ #ifndef HAVE_STDARG_H #define HAVE_STDARG_H 1 #endif /* HAVE_STDARG_H */ #ifndef HAVE_STDDEF_H #define HAVE_STDDEF_H 1 #endif /* HAVE_STDDEF_H */ #ifndef HAVE_STDINT_H #define HAVE_STDINT_H 1 #endif /* HAVE_STDINT_H */ #ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 #endif /* HAVE_STDLIB_H */ #ifndef HAVE_INTTYPES_H #define HAVE_INTTYPES_H 1 #endif /* HAVE_INTTYPES_H */ #ifndef HAVE_LOCALE_H #define HAVE_LOCALE_H 1 #endif /* HAVE_LOCALE_H */ #ifndef HAVE_LOCALECONV #define HAVE_LOCALECONV 1 #endif /* !defined(HAVE_LOCALECONV) */ #ifndef HAVE_LCONV_DECIMAL_POINT #define HAVE_LCONV_DECIMAL_POINT 1 #endif /* HAVE_LCONV_DECIMAL_POINT */ #ifndef HAVE_LCONV_THOUSANDS_SEP #define HAVE_LCONV_THOUSANDS_SEP 1 #endif /* HAVE_LCONV_THOUSANDS_SEP */ #ifndef HAVE_LONG_DOUBLE #define HAVE_LONG_DOUBLE 1 #endif /* !defined(HAVE_LONG_DOUBLE) */ #ifndef HAVE_LONG_LONG_INT #define HAVE_LONG_LONG_INT 1 #endif /* !defined(HAVE_LONG_LONG_INT) */ #ifndef HAVE_UNSIGNED_LONG_LONG_INT #define HAVE_UNSIGNED_LONG_LONG_INT 1 #endif /* !defined(HAVE_UNSIGNED_LONG_LONG_INT) */ #ifndef HAVE_INTMAX_T #define HAVE_INTMAX_T 1 #endif /* !defined(HAVE_INTMAX_T) */ #ifndef HAVE_UINTMAX_T #define HAVE_UINTMAX_T 1 #endif /* !defined(HAVE_UINTMAX_T) */ #ifndef HAVE_UINTPTR_T #define HAVE_UINTPTR_T 1 #endif /* !defined(HAVE_UINTPTR_T) */ #ifndef HAVE_PTRDIFF_T #define HAVE_PTRDIFF_T 1 #endif /* !defined(HAVE_PTRDIFF_T) */ #ifndef HAVE_VA_COPY #define HAVE_VA_COPY 1 #endif /* !defined(HAVE_VA_COPY) */ #ifndef HAVE___VA_COPY #define HAVE___VA_COPY 1 #endif /* !defined(HAVE___VA_COPY) */ #endif /* HAVE_CONFIG_H */ #define snprintf rpl_snprintf #define vsnprintf rpl_vsnprintf #define asprintf rpl_asprintf #define vasprintf rpl_vasprintf #endif /* TEST_SNPRINTF */ #if !HAVE_SNPRINTF || !HAVE_VSNPRINTF || !HAVE_ASPRINTF || !HAVE_VASPRINTF #include /* For NULL, size_t, vsnprintf(3), and vasprintf(3). */ #ifdef VA_START #undef VA_START #endif /* defined(VA_START) */ #ifdef VA_SHIFT #undef VA_SHIFT #endif /* defined(VA_SHIFT) */ #if HAVE_STDARG_H #include #define VA_START(ap, last) va_start(ap, last) #define VA_SHIFT(ap, value, type) /* No-op for ANSI C. */ #else /* Assume is available. */ #include #define VA_START(ap, last) va_start(ap) /* "last" is ignored. */ #define VA_SHIFT(ap, value, type) value = va_arg(ap, type) #endif /* HAVE_STDARG_H */ #if !HAVE_VASPRINTF #if HAVE_STDLIB_H #include /* For malloc(3). */ #endif /* HAVE_STDLIB_H */ #ifdef VA_COPY #undef VA_COPY #endif /* defined(VA_COPY) */ #ifdef VA_END_COPY #undef VA_END_COPY #endif /* defined(VA_END_COPY) */ #if HAVE_VA_COPY #define VA_COPY(dest, src) va_copy(dest, src) #define VA_END_COPY(ap) va_end(ap) #elif HAVE___VA_COPY #define VA_COPY(dest, src) __va_copy(dest, src) #define VA_END_COPY(ap) va_end(ap) #else #define VA_COPY(dest, src) (void)mymemcpy(&dest, &src, sizeof(va_list)) #define VA_END_COPY(ap) /* No-op. */ #define NEED_MYMEMCPY 1 static void *mymemcpy(void *, void *, size_t); #endif /* HAVE_VA_COPY */ #endif /* !HAVE_VASPRINTF */ #if !HAVE_VSNPRINTF #include /* For ERANGE and errno. */ #include /* For *_MAX. */ #if HAVE_INTTYPES_H #include /* For intmax_t (if not defined in ). */ #endif /* HAVE_INTTYPES_H */ #if HAVE_LOCALE_H #include /* For localeconv(3). */ #endif /* HAVE_LOCALE_H */ #if HAVE_STDDEF_H #include /* For ptrdiff_t. */ #endif /* HAVE_STDDEF_H */ #if HAVE_STDINT_H #include /* For intmax_t. */ #endif /* HAVE_STDINT_H */ /* Support for unsigned long long int. We may also need ULLONG_MAX. */ #ifndef ULONG_MAX /* We may need ULONG_MAX as a fallback. */ #ifdef UINT_MAX #define ULONG_MAX UINT_MAX #else #define ULONG_MAX INT_MAX #endif /* defined(UINT_MAX) */ #endif /* !defined(ULONG_MAX) */ #ifdef ULLONG #undef ULLONG #endif /* defined(ULLONG) */ #if HAVE_UNSIGNED_LONG_LONG_INT #define ULLONG unsigned long long int #ifndef ULLONG_MAX #define ULLONG_MAX ULONG_MAX #endif /* !defined(ULLONG_MAX) */ #else #define ULLONG unsigned long int #ifdef ULLONG_MAX #undef ULLONG_MAX #endif /* defined(ULLONG_MAX) */ #define ULLONG_MAX ULONG_MAX #endif /* HAVE_LONG_LONG_INT */ /* Support for uintmax_t. We also need UINTMAX_MAX. */ #ifdef UINTMAX_T #undef UINTMAX_T #endif /* defined(UINTMAX_T) */ #if HAVE_UINTMAX_T || defined(uintmax_t) #define UINTMAX_T uintmax_t #ifndef UINTMAX_MAX #define UINTMAX_MAX ULLONG_MAX #endif /* !defined(UINTMAX_MAX) */ #else #define UINTMAX_T ULLONG #ifdef UINTMAX_MAX #undef UINTMAX_MAX #endif /* defined(UINTMAX_MAX) */ #define UINTMAX_MAX ULLONG_MAX #endif /* HAVE_UINTMAX_T || defined(uintmax_t) */ /* Support for long double. */ #ifndef LDOUBLE #if HAVE_LONG_DOUBLE #define LDOUBLE long double #else #define LDOUBLE double #endif /* HAVE_LONG_DOUBLE */ #endif /* !defined(LDOUBLE) */ /* Support for long long int. */ #ifndef LLONG #if HAVE_LONG_LONG_INT #define LLONG long long int #else #define LLONG long int #endif /* HAVE_LONG_LONG_INT */ #endif /* !defined(LLONG) */ /* Support for intmax_t. */ #ifndef INTMAX_T #if HAVE_INTMAX_T || defined(intmax_t) #define INTMAX_T intmax_t #else #define INTMAX_T LLONG #endif /* HAVE_INTMAX_T || defined(intmax_t) */ #endif /* !defined(INTMAX_T) */ /* Support for uintptr_t. */ #ifndef UINTPTR_T #if HAVE_UINTPTR_T || defined(uintptr_t) #define UINTPTR_T uintptr_t #else #define UINTPTR_T unsigned long int #endif /* HAVE_UINTPTR_T || defined(uintptr_t) */ #endif /* !defined(UINTPTR_T) */ /* Support for ptrdiff_t. */ #ifndef PTRDIFF_T #if HAVE_PTRDIFF_T || defined(ptrdiff_t) #define PTRDIFF_T ptrdiff_t #else #define PTRDIFF_T long int #endif /* HAVE_PTRDIFF_T || defined(ptrdiff_t) */ #endif /* !defined(PTRDIFF_T) */ /* * We need an unsigned integer type corresponding to ptrdiff_t (cf. C99: * 7.19.6.1, 7). However, we'll simply use PTRDIFF_T and convert it to an * unsigned type if necessary. This should work just fine in practice. */ #ifndef UPTRDIFF_T #define UPTRDIFF_T PTRDIFF_T #endif /* !defined(UPTRDIFF_T) */ /* * We need a signed integer type corresponding to size_t (cf. C99: 7.19.6.1, 7). * However, we'll simply use size_t and convert it to a signed type if * necessary. This should work just fine in practice. */ #ifndef SSIZE_T #define SSIZE_T size_t #endif /* !defined(SSIZE_T) */ /* Either ERANGE or E2BIG should be available everywhere. */ #ifndef ERANGE #define ERANGE E2BIG #endif /* !defined(ERANGE) */ #ifndef EOVERFLOW #define EOVERFLOW ERANGE #endif /* !defined(EOVERFLOW) */ /* * Buffer size to hold the octal string representation of UINT128_MAX without * nul-termination ("3777777777777777777777777777777777777777777"). */ #ifdef MAX_CONVERT_LENGTH #undef MAX_CONVERT_LENGTH #endif /* defined(MAX_CONVERT_LENGTH) */ #define MAX_CONVERT_LENGTH 43 /* Format read states. */ #define PRINT_S_DEFAULT 0 #define PRINT_S_FLAGS 1 #define PRINT_S_WIDTH 2 #define PRINT_S_DOT 3 #define PRINT_S_PRECISION 4 #define PRINT_S_MOD 5 #define PRINT_S_CONV 6 /* Format flags. */ #define PRINT_F_MINUS (1 << 0) #define PRINT_F_PLUS (1 << 1) #define PRINT_F_SPACE (1 << 2) #define PRINT_F_NUM (1 << 3) #define PRINT_F_ZERO (1 << 4) #define PRINT_F_QUOTE (1 << 5) #define PRINT_F_UP (1 << 6) #define PRINT_F_UNSIGNED (1 << 7) #define PRINT_F_TYPE_G (1 << 8) #define PRINT_F_TYPE_E (1 << 9) /* Conversion flags. */ #define PRINT_C_CHAR 1 #define PRINT_C_SHORT 2 #define PRINT_C_LONG 3 #define PRINT_C_LLONG 4 #define PRINT_C_LDOUBLE 5 #define PRINT_C_SIZE 6 #define PRINT_C_PTRDIFF 7 #define PRINT_C_INTMAX 8 #ifndef MAX #define MAX(x, y) ((x >= y) ? x : y) #endif /* !defined(MAX) */ #ifndef CHARTOINT #define CHARTOINT(ch) (ch - '0') #endif /* !defined(CHARTOINT) */ #ifndef ISDIGIT #define ISDIGIT(ch) ('0' <= (unsigned char)ch && (unsigned char)ch <= '9') #endif /* !defined(ISDIGIT) */ #ifndef ISNAN #define ISNAN(x) (x != x) #endif /* !defined(ISNAN) */ #ifndef ISINF #define ISINF(x) (x != 0.0 && x + x == x) #endif /* !defined(ISINF) */ #ifdef OUTCHAR #undef OUTCHAR #endif /* defined(OUTCHAR) */ #define OUTCHAR(str, len, size, ch) \ do { \ if (len + 1 < size) \ str[len] = ch; \ (len)++; \ } while (/* CONSTCOND */ 0) #define rpl_vsnprintf vsnprintf #define rpl_snprintf snprintf #define rpl_vasprintf vasprintf #define rpl_asprintf asprintf static void fmtstr(char *, size_t *, size_t, const char *, int, int, int); static void fmtint(char *, size_t *, size_t, INTMAX_T, int, int, int, int); static void fmtflt(char *, size_t *, size_t, LDOUBLE, int, int, int, int *); static void printsep(char *, size_t *, size_t); static int getnumsep(int); static int getexponent(LDOUBLE); static int convert(UINTMAX_T, char *, size_t, int, int); static UINTMAX_T cast(LDOUBLE); static UINTMAX_T myround(LDOUBLE); static LDOUBLE mypow10(int); #ifndef errno extern int errno; #endif int rpl_vsnprintf(char *str, size_t size, const char *format, va_list args) { LDOUBLE fvalue; INTMAX_T value; unsigned char cvalue; const char *strvalue; INTMAX_T *intmaxptr; PTRDIFF_T *ptrdiffptr; SSIZE_T *sizeptr; LLONG *llongptr; long int *longptr; int *intptr; short int *shortptr; signed char *charptr; size_t len = 0; int overflow = 0; int base = 0; int cflags = 0; int flags = 0; int width = 0; int precision = -1; int state = PRINT_S_DEFAULT; char ch = *format++; /* * C99 says: "If `n' is zero, nothing is written, and `s' may be a null * pointer." (7.19.6.5, 2) We're forgiving and allow a NULL pointer * even if a size larger than zero was specified. At least NetBSD's * snprintf(3) does the same, as well as other versions of this file. * (Though some of these versions will write to a non-NULL buffer even * if a size of zero was specified, which violates the standard.) */ if (str == NULL && size != 0) size = 0; while (ch != '\0') switch (state) { case PRINT_S_DEFAULT: if (ch == '%') state = PRINT_S_FLAGS; else OUTCHAR(str, len, size, ch); ch = *format++; break; case PRINT_S_FLAGS: switch (ch) { case '-': flags |= PRINT_F_MINUS; ch = *format++; break; case '+': flags |= PRINT_F_PLUS; ch = *format++; break; case ' ': flags |= PRINT_F_SPACE; ch = *format++; break; case '#': flags |= PRINT_F_NUM; ch = *format++; break; case '0': flags |= PRINT_F_ZERO; ch = *format++; break; case '\'': /* SUSv2 flag (not in C99). */ flags |= PRINT_F_QUOTE; ch = *format++; break; default: state = PRINT_S_WIDTH; break; } break; case PRINT_S_WIDTH: if (ISDIGIT(ch)) { ch = CHARTOINT(ch); if (width > (INT_MAX - ch) / 10) { overflow = 1; goto out; } width = 10 * width + ch; ch = *format++; } else if (ch == '*') { /* * C99 says: "A negative field width argument is * taken as a `-' flag followed by a positive * field width." (7.19.6.1, 5) */ if ((width = va_arg(args, int)) < 0) { flags |= PRINT_F_MINUS; width = -width; } ch = *format++; state = PRINT_S_DOT; } else state = PRINT_S_DOT; break; case PRINT_S_DOT: if (ch == '.') { state = PRINT_S_PRECISION; ch = *format++; } else state = PRINT_S_MOD; break; case PRINT_S_PRECISION: if (precision == -1) precision = 0; if (ISDIGIT(ch)) { ch = CHARTOINT(ch); if (precision > (INT_MAX - ch) / 10) { overflow = 1; goto out; } precision = 10 * precision + ch; ch = *format++; } else if (ch == '*') { /* * C99 says: "A negative precision argument is * taken as if the precision were omitted." * (7.19.6.1, 5) */ if ((precision = va_arg(args, int)) < 0) precision = -1; ch = *format++; state = PRINT_S_MOD; } else state = PRINT_S_MOD; break; case PRINT_S_MOD: switch (ch) { case 'h': ch = *format++; if (ch == 'h') { /* It's a char. */ ch = *format++; cflags = PRINT_C_CHAR; } else cflags = PRINT_C_SHORT; break; case 'l': ch = *format++; if (ch == 'l') { /* It's a long long. */ ch = *format++; cflags = PRINT_C_LLONG; } else cflags = PRINT_C_LONG; break; case 'L': cflags = PRINT_C_LDOUBLE; ch = *format++; break; case 'j': cflags = PRINT_C_INTMAX; ch = *format++; break; case 't': cflags = PRINT_C_PTRDIFF; ch = *format++; break; case 'z': cflags = PRINT_C_SIZE; ch = *format++; break; } state = PRINT_S_CONV; break; case PRINT_S_CONV: switch (ch) { case 'd': /* FALLTHROUGH */ case 'i': switch (cflags) { case PRINT_C_CHAR: value = (signed char)va_arg(args, int); break; case PRINT_C_SHORT: value = (short int)va_arg(args, int); break; case PRINT_C_LONG: value = va_arg(args, long int); break; case PRINT_C_LLONG: value = va_arg(args, LLONG); break; case PRINT_C_SIZE: value = va_arg(args, SSIZE_T); break; case PRINT_C_INTMAX: value = va_arg(args, INTMAX_T); break; case PRINT_C_PTRDIFF: value = va_arg(args, PTRDIFF_T); break; default: value = va_arg(args, int); break; } fmtint(str, &len, size, value, 10, width, precision, flags); break; case 'X': flags |= PRINT_F_UP; /* FALLTHROUGH */ case 'x': base = 16; /* FALLTHROUGH */ case 'o': if (base == 0) base = 8; /* FALLTHROUGH */ case 'u': if (base == 0) base = 10; flags |= PRINT_F_UNSIGNED; switch (cflags) { case PRINT_C_CHAR: value = (unsigned char)va_arg(args, unsigned int); break; case PRINT_C_SHORT: value = (unsigned short int)va_arg(args, unsigned int); break; case PRINT_C_LONG: value = va_arg(args, unsigned long int); break; case PRINT_C_LLONG: value = va_arg(args, ULLONG); break; case PRINT_C_SIZE: value = va_arg(args, size_t); break; case PRINT_C_INTMAX: value = va_arg(args, UINTMAX_T); break; case PRINT_C_PTRDIFF: value = va_arg(args, UPTRDIFF_T); break; default: value = va_arg(args, unsigned int); break; } fmtint(str, &len, size, value, base, width, precision, flags); break; case 'A': /* Not yet supported, we'll use "%F". */ /* FALLTHROUGH */ case 'F': flags |= PRINT_F_UP; case 'a': /* Not yet supported, we'll use "%f". */ /* FALLTHROUGH */ case 'f': if (cflags == PRINT_C_LDOUBLE) fvalue = va_arg(args, LDOUBLE); else fvalue = va_arg(args, double); fmtflt(str, &len, size, fvalue, width, precision, flags, &overflow); if (overflow) goto out; break; case 'E': flags |= PRINT_F_UP; /* FALLTHROUGH */ case 'e': flags |= PRINT_F_TYPE_E; if (cflags == PRINT_C_LDOUBLE) fvalue = va_arg(args, LDOUBLE); else fvalue = va_arg(args, double); fmtflt(str, &len, size, fvalue, width, precision, flags, &overflow); if (overflow) goto out; break; case 'G': flags |= PRINT_F_UP; /* FALLTHROUGH */ case 'g': flags |= PRINT_F_TYPE_G; if (cflags == PRINT_C_LDOUBLE) fvalue = va_arg(args, LDOUBLE); else fvalue = va_arg(args, double); /* * If the precision is zero, it is treated as * one (cf. C99: 7.19.6.1, 8). */ if (precision == 0) precision = 1; fmtflt(str, &len, size, fvalue, width, precision, flags, &overflow); if (overflow) goto out; break; case 'c': cvalue = va_arg(args, int); OUTCHAR(str, len, size, cvalue); break; case 's': strvalue = va_arg(args, char *); fmtstr(str, &len, size, strvalue, width, precision, flags); break; case 'p': /* * C99 says: "The value of the pointer is * converted to a sequence of printing * characters, in an implementation-defined * manner." (C99: 7.19.6.1, 8) */ if ((strvalue = va_arg(args, void *)) == NULL) /* * We use the glibc format. BSD prints * "0x0", SysV "0". */ fmtstr(str, &len, size, "(nil)", width, -1, flags); else { /* * We use the BSD/glibc format. SysV * omits the "0x" prefix (which we emit * using the PRINT_F_NUM flag). */ flags |= PRINT_F_NUM; flags |= PRINT_F_UNSIGNED; fmtint(str, &len, size, (UINTPTR_T)strvalue, 16, width, precision, flags); } break; case 'n': switch (cflags) { case PRINT_C_CHAR: charptr = va_arg(args, signed char *); *charptr = len; break; case PRINT_C_SHORT: shortptr = va_arg(args, short int *); *shortptr = len; break; case PRINT_C_LONG: longptr = va_arg(args, long int *); *longptr = len; break; case PRINT_C_LLONG: llongptr = va_arg(args, LLONG *); *llongptr = len; break; case PRINT_C_SIZE: /* * C99 says that with the "z" length * modifier, "a following `n' conversion * specifier applies to a pointer to a * signed integer type corresponding to * size_t argument." (7.19.6.1, 7) */ sizeptr = va_arg(args, SSIZE_T *); *sizeptr = len; break; case PRINT_C_INTMAX: intmaxptr = va_arg(args, INTMAX_T *); *intmaxptr = len; break; case PRINT_C_PTRDIFF: ptrdiffptr = va_arg(args, PTRDIFF_T *); *ptrdiffptr = len; break; default: intptr = va_arg(args, int *); *intptr = len; break; } break; case '%': /* Print a "%" character verbatim. */ OUTCHAR(str, len, size, ch); break; default: /* Skip other characters. */ break; } ch = *format++; state = PRINT_S_DEFAULT; base = cflags = flags = width = 0; precision = -1; break; } out: if (len < size) str[len] = '\0'; else if (size > 0) str[size - 1] = '\0'; if (overflow || len >= INT_MAX) { errno = overflow ? EOVERFLOW : ERANGE; return -1; } return (int)len; } static void fmtstr(char *str, size_t *len, size_t size, const char *value, int width, int precision, int flags) { int padlen, strln; /* Amount to pad. */ int noprecision = (precision == -1); if (value == NULL) /* We're forgiving. */ value = "(null)"; /* If a precision was specified, don't read the string past it. */ for (strln = 0; value[strln] != '\0' && (noprecision || strln < precision); strln++) continue; if ((padlen = width - strln) < 0) padlen = 0; if (flags & PRINT_F_MINUS) /* Left justify. */ padlen = -padlen; while (padlen > 0) { /* Leading spaces. */ OUTCHAR(str, *len, size, ' '); padlen--; } while (*value != '\0' && (noprecision || precision-- > 0)) { OUTCHAR(str, *len, size, *value); value++; } while (padlen < 0) { /* Trailing spaces. */ OUTCHAR(str, *len, size, ' '); padlen++; } } static void fmtint(char *str, size_t *len, size_t size, INTMAX_T value, int base, int width, int precision, int flags) { UINTMAX_T uvalue; char iconvert[MAX_CONVERT_LENGTH]; char sign = 0; char hexprefix = 0; int spadlen = 0; /* Amount to space pad. */ int zpadlen = 0; /* Amount to zero pad. */ int pos; int separators = (flags & PRINT_F_QUOTE); int noprecision = (precision == -1); if (flags & PRINT_F_UNSIGNED) uvalue = value; else { uvalue = (value >= 0) ? value : -value; if (value < 0) sign = '-'; else if (flags & PRINT_F_PLUS) /* Do a sign. */ sign = '+'; else if (flags & PRINT_F_SPACE) sign = ' '; } pos = convert(uvalue, iconvert, sizeof(iconvert), base, flags & PRINT_F_UP); if (flags & PRINT_F_NUM && uvalue != 0) { /* * C99 says: "The result is converted to an `alternative form'. * For `o' conversion, it increases the precision, if and only * if necessary, to force the first digit of the result to be a * zero (if the value and precision are both 0, a single 0 is * printed). For `x' (or `X') conversion, a nonzero result has * `0x' (or `0X') prefixed to it." (7.19.6.1, 6) */ switch (base) { case 8: if (precision <= pos) precision = pos + 1; break; case 16: hexprefix = (flags & PRINT_F_UP) ? 'X' : 'x'; break; } } if (separators) /* Get the number of group separators we'll print. */ separators = getnumsep(pos); zpadlen = precision - pos - separators; spadlen = width /* Minimum field width. */ - separators /* Number of separators. */ - MAX(precision, pos) /* Number of integer digits. */ - ((sign != 0) ? 1 : 0) /* Will we print a sign? */ - ((hexprefix != 0) ? 2 : 0); /* Will we print a prefix? */ if (zpadlen < 0) zpadlen = 0; if (spadlen < 0) spadlen = 0; /* * C99 says: "If the `0' and `-' flags both appear, the `0' flag is * ignored. For `d', `i', `o', `u', `x', and `X' conversions, if a * precision is specified, the `0' flag is ignored." (7.19.6.1, 6) */ if (flags & PRINT_F_MINUS) /* Left justify. */ spadlen = -spadlen; else if (flags & PRINT_F_ZERO && noprecision) { zpadlen += spadlen; spadlen = 0; } while (spadlen > 0) { /* Leading spaces. */ OUTCHAR(str, *len, size, ' '); spadlen--; } if (sign != 0) /* Sign. */ OUTCHAR(str, *len, size, sign); if (hexprefix != 0) { /* A "0x" or "0X" prefix. */ OUTCHAR(str, *len, size, '0'); OUTCHAR(str, *len, size, hexprefix); } while (zpadlen > 0) { /* Leading zeros. */ OUTCHAR(str, *len, size, '0'); zpadlen--; } while (pos > 0) { /* The actual digits. */ pos--; OUTCHAR(str, *len, size, iconvert[pos]); if (separators > 0 && pos > 0 && pos % 3 == 0) printsep(str, len, size); } while (spadlen < 0) { /* Trailing spaces. */ OUTCHAR(str, *len, size, ' '); spadlen++; } } static void fmtflt(char *str, size_t *len, size_t size, LDOUBLE fvalue, int width, int precision, int flags, int *overflow) { LDOUBLE ufvalue; UINTMAX_T intpart; UINTMAX_T fracpart; UINTMAX_T mask; const char *infnan = NULL; char iconvert[MAX_CONVERT_LENGTH]; char fconvert[MAX_CONVERT_LENGTH]; char econvert[4]; /* "e-12" (without nul-termination). */ char esign = 0; char sign = 0; int leadfraczeros = 0; int exponent = 0; int emitpoint = 0; int omitzeros = 0; int omitcount = 0; int padlen = 0; int epos = 0; int fpos = 0; int ipos = 0; int separators = (flags & PRINT_F_QUOTE); int estyle = (flags & PRINT_F_TYPE_E); #if HAVE_LOCALECONV && HAVE_LCONV_DECIMAL_POINT struct lconv *lc = localeconv(); #endif /* HAVE_LOCALECONV && HAVE_LCONV_DECIMAL_POINT */ /* * AIX' man page says the default is 0, but C99 and at least Solaris' * and NetBSD's man pages say the default is 6, and sprintf(3) on AIX * defaults to 6. */ if (precision == -1) precision = 6; if (fvalue < 0.0) sign = '-'; else if (flags & PRINT_F_PLUS) /* Do a sign. */ sign = '+'; else if (flags & PRINT_F_SPACE) sign = ' '; if (ISNAN(fvalue)) infnan = (flags & PRINT_F_UP) ? "NAN" : "nan"; else if (ISINF(fvalue)) infnan = (flags & PRINT_F_UP) ? "INF" : "inf"; if (infnan != NULL) { if (sign != 0) iconvert[ipos++] = sign; while (*infnan != '\0') iconvert[ipos++] = *infnan++; fmtstr(str, len, size, iconvert, width, ipos, flags); return; } /* "%e" (or "%E") or "%g" (or "%G") conversion. */ if (flags & PRINT_F_TYPE_E || flags & PRINT_F_TYPE_G) { if (flags & PRINT_F_TYPE_G) { /* * For "%g" (and "%G") conversions, the precision * specifies the number of significant digits, which * includes the digits in the integer part. The * conversion will or will not be using "e-style" (like * "%e" or "%E" conversions) depending on the precision * and on the exponent. However, the exponent can be * affected by rounding the converted value, so we'll * leave this decision for later. Until then, we'll * assume that we're going to do an "e-style" conversion * (in order to get the exponent calculated). For * "e-style", the precision must be decremented by one. */ precision--; /* * For "%g" (and "%G") conversions, trailing zeros are * removed from the fractional portion of the result * unless the "#" flag was specified. */ if (!(flags & PRINT_F_NUM)) omitzeros = 1; } exponent = getexponent(fvalue); estyle = 1; } again: /* * Sorry, we only support 9, 19, or 38 digits (that is, the number of * digits of the 32-bit, the 64-bit, or the 128-bit UINTMAX_MAX value * minus one) past the decimal point due to our conversion method. */ switch (sizeof(UINTMAX_T)) { case 16: if (precision > 38) precision = 38; break; case 8: if (precision > 19) precision = 19; break; default: if (precision > 9) precision = 9; break; } ufvalue = (fvalue >= 0.0) ? fvalue : -fvalue; if (estyle) /* We want exactly one integer digit. */ ufvalue /= mypow10(exponent); if ((intpart = cast(ufvalue)) == UINTMAX_MAX) { *overflow = 1; return; } /* * Factor of ten with the number of digits needed for the fractional * part. For example, if the precision is 3, the mask will be 1000. */ mask = mypow10(precision); /* * We "cheat" by converting the fractional part to integer by * multiplying by a factor of ten. */ if ((fracpart = myround(mask * (ufvalue - intpart))) >= mask) { /* * For example, ufvalue = 2.99962, intpart = 2, and mask = 1000 * (because precision = 3). Now, myround(1000 * 0.99962) will * return 1000. So, the integer part must be incremented by one * and the fractional part must be set to zero. */ intpart++; fracpart = 0; if (estyle && intpart == 10) { /* * The value was rounded up to ten, but we only want one * integer digit if using "e-style". So, the integer * part must be set to one and the exponent must be * incremented by one. */ intpart = 1; exponent++; } } /* * Now that we know the real exponent, we can check whether or not to * use "e-style" for "%g" (and "%G") conversions. If we don't need * "e-style", the precision must be adjusted and the integer and * fractional parts must be recalculated from the original value. * * C99 says: "Let P equal the precision if nonzero, 6 if the precision * is omitted, or 1 if the precision is zero. Then, if a conversion * with style `E' would have an exponent of X: * * - if P > X >= -4, the conversion is with style `f' (or `F') and * precision P - (X + 1). * * - otherwise, the conversion is with style `e' (or `E') and precision * P - 1." (7.19.6.1, 8) * * Note that we had decremented the precision by one. */ if (flags & PRINT_F_TYPE_G && estyle && precision + 1 > exponent && exponent >= -4) { precision -= exponent; estyle = 0; goto again; } if (estyle) { if (exponent < 0) { exponent = -exponent; esign = '-'; } else esign = '+'; /* * Convert the exponent. The sizeof(econvert) is 4. So, the * econvert buffer can hold e.g. "e+99" and "e-99". We don't * support an exponent which contains more than two digits. * Therefore, the following stores are safe. */ epos = convert(exponent, econvert, 2, 10, 0); /* * C99 says: "The exponent always contains at least two digits, * and only as many more digits as necessary to represent the * exponent." (7.19.6.1, 8) */ if (epos == 1) econvert[epos++] = '0'; econvert[epos++] = esign; econvert[epos++] = (flags & PRINT_F_UP) ? 'E' : 'e'; } /* Convert the integer part and the fractional part. */ ipos = convert(intpart, iconvert, sizeof(iconvert), 10, 0); if (fracpart != 0) /* convert() would return 1 if fracpart == 0. */ fpos = convert(fracpart, fconvert, sizeof(fconvert), 10, 0); leadfraczeros = precision - fpos; if (omitzeros) { if (fpos > 0) /* Omit trailing fractional part zeros. */ while (omitcount < fpos && fconvert[omitcount] == '0') omitcount++; else { /* The fractional part is zero, omit it completely. */ omitcount = precision; leadfraczeros = 0; } precision -= omitcount; } /* * Print a decimal point if either the fractional part is non-zero * and/or the "#" flag was specified. */ if (precision > 0 || flags & PRINT_F_NUM) emitpoint = 1; if (separators) /* Get the number of group separators we'll print. */ separators = getnumsep(ipos); padlen = width /* Minimum field width. */ - ipos /* Number of integer digits. */ - epos /* Number of exponent characters. */ - precision /* Number of fractional digits. */ - separators /* Number of group separators. */ - (emitpoint ? 1 : 0) /* Will we print a decimal point? */ - ((sign != 0) ? 1 : 0); /* Will we print a sign character? */ if (padlen < 0) padlen = 0; /* * C99 says: "If the `0' and `-' flags both appear, the `0' flag is * ignored." (7.19.6.1, 6) */ if (flags & PRINT_F_MINUS) /* Left justifty. */ padlen = -padlen; else if (flags & PRINT_F_ZERO && padlen > 0) { if (sign != 0) { /* Sign. */ OUTCHAR(str, *len, size, sign); sign = 0; } while (padlen > 0) { /* Leading zeros. */ OUTCHAR(str, *len, size, '0'); padlen--; } } while (padlen > 0) { /* Leading spaces. */ OUTCHAR(str, *len, size, ' '); padlen--; } if (sign != 0) /* Sign. */ OUTCHAR(str, *len, size, sign); while (ipos > 0) { /* Integer part. */ ipos--; OUTCHAR(str, *len, size, iconvert[ipos]); if (separators > 0 && ipos > 0 && ipos % 3 == 0) printsep(str, len, size); } if (emitpoint) { /* Decimal point. */ #if HAVE_LOCALECONV && HAVE_LCONV_DECIMAL_POINT if (lc->decimal_point != NULL && *lc->decimal_point != '\0') OUTCHAR(str, *len, size, *lc->decimal_point); else /* We'll always print some decimal point character. */ #endif /* HAVE_LOCALECONV && HAVE_LCONV_DECIMAL_POINT */ OUTCHAR(str, *len, size, '.'); } while (leadfraczeros > 0) { /* Leading fractional part zeros. */ OUTCHAR(str, *len, size, '0'); leadfraczeros--; } while (fpos > omitcount) { /* The remaining fractional part. */ fpos--; OUTCHAR(str, *len, size, fconvert[fpos]); } while (epos > 0) { /* Exponent. */ epos--; OUTCHAR(str, *len, size, econvert[epos]); } while (padlen < 0) { /* Trailing spaces. */ OUTCHAR(str, *len, size, ' '); padlen++; } } static void printsep(char *str, size_t *len, size_t size) { #if HAVE_LOCALECONV && HAVE_LCONV_THOUSANDS_SEP struct lconv *lc = localeconv(); int i; if (lc->thousands_sep != NULL) for (i = 0; lc->thousands_sep[i] != '\0'; i++) OUTCHAR(str, *len, size, lc->thousands_sep[i]); else #endif /* HAVE_LOCALECONV && HAVE_LCONV_THOUSANDS_SEP */ OUTCHAR(str, *len, size, ','); } static int getnumsep(int digits) { int separators = (digits - ((digits % 3 == 0) ? 1 : 0)) / 3; #if HAVE_LOCALECONV && HAVE_LCONV_THOUSANDS_SEP int strln; struct lconv *lc = localeconv(); /* We support an arbitrary separator length (including zero). */ if (lc->thousands_sep != NULL) { for (strln = 0; lc->thousands_sep[strln] != '\0'; strln++) continue; separators *= strln; } #endif /* HAVE_LOCALECONV && HAVE_LCONV_THOUSANDS_SEP */ return separators; } static int getexponent(LDOUBLE value) { LDOUBLE tmp = (value >= 0.0) ? value : -value; int exponent = 0; /* * We check for 99 > exponent > -99 in order to work around possible * endless loops which could happen (at least) in the second loop (at * least) if we're called with an infinite value. However, we checked * for infinity before calling this function using our ISINF() macro, so * this might be somewhat paranoid. */ while (tmp < 1.0 && tmp > 0.0 && --exponent > -99) tmp *= 10; while (tmp >= 10.0 && ++exponent < 99) tmp /= 10; return exponent; } static int convert(UINTMAX_T value, char *buf, size_t size, int base, int caps) { const char *digits = caps ? "0123456789ABCDEF" : "0123456789abcdef"; size_t pos = 0; /* We return an unterminated buffer with the digits in reverse order. */ do { buf[pos++] = digits[value % base]; value /= base; } while (value != 0 && pos < size); return (int)pos; } static UINTMAX_T cast(LDOUBLE value) { UINTMAX_T result; /* * We check for ">=" and not for ">" because if UINTMAX_MAX cannot be * represented exactly as an LDOUBLE value (but is less than LDBL_MAX), * it may be increased to the nearest higher representable value for the * comparison (cf. C99: 6.3.1.4, 2). It might then equal the LDOUBLE * value although converting the latter to UINTMAX_T would overflow. */ if (value >= UINTMAX_MAX) return UINTMAX_MAX; result = value; /* * At least on NetBSD/sparc64 3.0.2 and 4.99.30, casting long double to * an integer type converts e.g. 1.9 to 2 instead of 1 (which violates * the standard). Sigh. */ return (result <= value) ? result : result - 1; } static UINTMAX_T myround(LDOUBLE value) { UINTMAX_T intpart = cast(value); return ((value -= intpart) < 0.5) ? intpart : intpart + 1; } static LDOUBLE mypow10(int exponent) { LDOUBLE result = 1; while (exponent > 0) { result *= 10; exponent--; } while (exponent < 0) { result /= 10; exponent++; } return result; } #endif /* !HAVE_VSNPRINTF */ #if !HAVE_VASPRINTF #if NEED_MYMEMCPY void * mymemcpy(void *dst, void *src, size_t len) { const char *from = src; char *to = dst; /* No need for optimization, we use this only to replace va_copy(3). */ while (len-- > 0) *to++ = *from++; return dst; } #endif /* NEED_MYMEMCPY */ int rpl_vasprintf(char **ret, const char *format, va_list ap) { size_t size; int len; va_list aq; VA_COPY(aq, ap); len = vsnprintf(NULL, 0, format, aq); VA_END_COPY(aq); if (len < 0 || (*ret = malloc(size = len + 1)) == NULL) return -1; return vsnprintf(*ret, size, format, ap); } #endif /* !HAVE_VASPRINTF */ #if !HAVE_SNPRINTF #if HAVE_STDARG_H int rpl_snprintf(char *str, size_t size, const char *format, ...) #else int rpl_snprintf(va_alist) va_dcl #endif /* HAVE_STDARG_H */ { #if !HAVE_STDARG_H char *str; size_t size; char *format; #endif /* HAVE_STDARG_H */ va_list ap; int len; VA_START(ap, format); VA_SHIFT(ap, str, char *); VA_SHIFT(ap, size, size_t); VA_SHIFT(ap, format, const char *); len = vsnprintf(str, size, format, ap); va_end(ap); return len; } #endif /* !HAVE_SNPRINTF */ #if !HAVE_ASPRINTF #if HAVE_STDARG_H int rpl_asprintf(char **ret, const char *format, ...) #else int rpl_asprintf(va_alist) va_dcl #endif /* HAVE_STDARG_H */ { #if !HAVE_STDARG_H char **ret; char *format; #endif /* HAVE_STDARG_H */ va_list ap; int len; VA_START(ap, format); VA_SHIFT(ap, ret, char **); VA_SHIFT(ap, format, const char *); len = vasprintf(ret, format, ap); va_end(ap); return len; } #endif /* !HAVE_ASPRINTF */ #else /* Dummy declaration to avoid empty translation unit warnings. */ int main(void); #endif /* !HAVE_SNPRINTF || !HAVE_VSNPRINTF || !HAVE_ASPRINTF || [...] */ #if TEST_SNPRINTF int main(void) { const char *float_fmt[] = { /* "%E" and "%e" formats. */ #if HAVE_LONG_LONG_INT && !OS_BSD && !OS_IRIX "%.16e", "%22.16e", "%022.16e", "%-22.16e", "%#+'022.16e", #endif /* HAVE_LONG_LONG_INT && !OS_BSD && !OS_IRIX */ "foo|%#+0123.9E|bar", "%-123.9e", "%123.9e", "%+23.9e", "%+05.8e", "%-05.8e", "%05.8e", "%+5.8e", "%-5.8e", "% 5.8e", "%5.8e", "%+4.9e", #if !OS_LINUX /* glibc sometimes gets these wrong. */ "%+#010.0e", "%#10.1e", "%10.5e", "% 10.5e", "%5.0e", "%5.e", "%#5.0e", "%#5.e", "%3.2e", "%3.1e", "%-1.5e", "%1.5e", "%01.3e", "%1.e", "%.1e", "%#.0e", "%+.0e", "% .0e", "%.0e", "%#.e", "%+.e", "% .e", "%.e", "%4e", "%e", "%E", #endif /* !OS_LINUX */ /* "%F" and "%f" formats. */ #if !OS_BSD && !OS_IRIX "% '022f", "%+'022f", "%-'22f", "%'22f", #if HAVE_LONG_LONG_INT "%.16f", "%22.16f", "%022.16f", "%-22.16f", "%#+'022.16f", #endif /* HAVE_LONG_LONG_INT */ #endif /* !OS_BSD && !OS_IRIX */ "foo|%#+0123.9F|bar", "%-123.9f", "%123.9f", "%+23.9f", "%+#010.0f", "%#10.1f", "%10.5f", "% 10.5f", "%+05.8f", "%-05.8f", "%05.8f", "%+5.8f", "%-5.8f", "% 5.8f", "%5.8f", "%5.0f", "%5.f", "%#5.0f", "%#5.f", "%+4.9f", "%3.2f", "%3.1f", "%-1.5f", "%1.5f", "%01.3f", "%1.f", "%.1f", "%#.0f", "%+.0f", "% .0f", "%.0f", "%#.f", "%+.f", "% .f", "%.f", "%4f", "%f", "%F", /* "%G" and "%g" formats. */ #if !OS_BSD && !OS_IRIX && !OS_LINUX "% '022g", "%+'022g", "%-'22g", "%'22g", #if HAVE_LONG_LONG_INT "%.16g", "%22.16g", "%022.16g", "%-22.16g", "%#+'022.16g", #endif /* HAVE_LONG_LONG_INT */ #endif /* !OS_BSD && !OS_IRIX && !OS_LINUX */ "foo|%#+0123.9G|bar", "%-123.9g", "%123.9g", "%+23.9g", "%+05.8g", "%-05.8g", "%05.8g", "%+5.8g", "%-5.8g", "% 5.8g", "%5.8g", "%+4.9g", #if !OS_LINUX /* glibc sometimes gets these wrong. */ "%+#010.0g", "%#10.1g", "%10.5g", "% 10.5g", "%5.0g", "%5.g", "%#5.0g", "%#5.g", "%3.2g", "%3.1g", "%-1.5g", "%1.5g", "%01.3g", "%1.g", "%.1g", "%#.0g", "%+.0g", "% .0g", "%.0g", "%#.g", "%+.g", "% .g", "%.g", "%4g", "%g", "%G", #endif /* !OS_LINUX */ NULL }; double float_val[] = { -4.136, -134.52, -5.04030201, -3410.01234, -999999.999999, -913450.29876, -913450.2, -91345.2, -9134.2, -913.2, -91.2, -9.2, -9.9, 4.136, 134.52, 5.04030201, 3410.01234, 999999.999999, 913450.29876, 913450.2, 91345.2, 9134.2, 913.2, 91.2, 9.2, 9.9, 9.96, 9.996, 9.9996, 9.99996, 9.999996, 9.9999996, 9.99999996, 0.99999996, 0.99999999, 0.09999999, 0.00999999, 0.00099999, 0.00009999, 0.00000999, 0.00000099, 0.00000009, 0.00000001, 0.0000001, 0.000001, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1.0, 1.5, -1.5, -1.0, -0.1, #if !OS_BSD /* BSD sometimes gets these wrong. */ #ifdef INFINITY INFINITY, -INFINITY, #endif /* defined(INFINITY) */ #ifdef NAN NAN, #endif /* defined(NAN) */ #endif /* !OS_BSD */ 0 }; const char *long_fmt[] = { "foo|%0123ld|bar", #if !OS_IRIX "% '0123ld", "%+'0123ld", "%-'123ld", "%'123ld", #endif /* !OS_IRiX */ "%123.9ld", "% 123.9ld", "%+123.9ld", "%-123.9ld", "%0123ld", "% 0123ld", "%+0123ld", "%-0123ld", "%10.5ld", "% 10.5ld", "%+10.5ld", "%-10.5ld", "%010ld", "% 010ld", "%+010ld", "%-010ld", "%4.2ld", "% 4.2ld", "%+4.2ld", "%-4.2ld", "%04ld", "% 04ld", "%+04ld", "%-04ld", "%5.5ld", "%+22.33ld", "%01.3ld", "%1.5ld", "%-1.5ld", "%44ld", "%4ld", "%4.0ld", "%4.ld", "%.44ld", "%.4ld", "%.0ld", "%.ld", "%ld", NULL }; long int long_val[] = { #ifdef LONG_MAX LONG_MAX, #endif /* LONG_MAX */ #ifdef LONG_MIN LONG_MIN, #endif /* LONG_MIN */ -91340, 91340, 341, 134, 0203, -1, 1, 0 }; const char *ulong_fmt[] = { /* "%u" formats. */ "foo|%0123lu|bar", #if !OS_IRIX "% '0123lu", "%+'0123lu", "%-'123lu", "%'123lu", #endif /* !OS_IRiX */ "%123.9lu", "% 123.9lu", "%+123.9lu", "%-123.9lu", "%0123lu", "% 0123lu", "%+0123lu", "%-0123lu", "%5.5lu", "%+22.33lu", "%01.3lu", "%1.5lu", "%-1.5lu", "%44lu", "%lu", /* "%o" formats. */ "foo|%#0123lo|bar", "%#123.9lo", "%# 123.9lo", "%#+123.9lo", "%#-123.9lo", "%#0123lo", "%# 0123lo", "%#+0123lo", "%#-0123lo", "%#5.5lo", "%#+22.33lo", "%#01.3lo", "%#1.5lo", "%#-1.5lo", "%#44lo", "%#lo", "%123.9lo", "% 123.9lo", "%+123.9lo", "%-123.9lo", "%0123lo", "% 0123lo", "%+0123lo", "%-0123lo", "%5.5lo", "%+22.33lo", "%01.3lo", "%1.5lo", "%-1.5lo", "%44lo", "%lo", /* "%X" and "%x" formats. */ "foo|%#0123lX|bar", "%#123.9lx", "%# 123.9lx", "%#+123.9lx", "%#-123.9lx", "%#0123lx", "%# 0123lx", "%#+0123lx", "%#-0123lx", "%#5.5lx", "%#+22.33lx", "%#01.3lx", "%#1.5lx", "%#-1.5lx", "%#44lx", "%#lx", "%#lX", "%123.9lx", "% 123.9lx", "%+123.9lx", "%-123.9lx", "%0123lx", "% 0123lx", "%+0123lx", "%-0123lx", "%5.5lx", "%+22.33lx", "%01.3lx", "%1.5lx", "%-1.5lx", "%44lx", "%lx", "%lX", NULL }; unsigned long int ulong_val[] = { #ifdef ULONG_MAX ULONG_MAX, #endif /* ULONG_MAX */ 91340, 341, 134, 0203, 1, 0 }; const char *llong_fmt[] = { "foo|%0123lld|bar", "%123.9lld", "% 123.9lld", "%+123.9lld", "%-123.9lld", "%0123lld", "% 0123lld", "%+0123lld", "%-0123lld", "%5.5lld", "%+22.33lld", "%01.3lld", "%1.5lld", "%-1.5lld", "%44lld", "%lld", NULL }; LLONG llong_val[] = { #ifdef LLONG_MAX LLONG_MAX, #endif /* LLONG_MAX */ #ifdef LLONG_MIN LLONG_MIN, #endif /* LLONG_MIN */ -91340, 91340, 341, 134, 0203, -1, 1, 0 }; const char *string_fmt[] = { "foo|%10.10s|bar", "%-10.10s", "%10.10s", "%10.5s", "%5.10s", "%10.1s", "%1.10s", "%10.0s", "%0.10s", "%-42.5s", "%2.s", "%.10s", "%.1s", "%.0s", "%.s", "%4s", "%s", NULL }; const char *string_val[] = { "Hello", "Hello, world!", "Sound check: One, two, three.", "This string is a little longer than the other strings.", "1", "", NULL }; #if !OS_SYSV /* SysV uses a different format than we do. */ const char *pointer_fmt[] = { "foo|%p|bar", "%42p", "%p", NULL }; const char *pointer_val[] = { *pointer_fmt, *string_fmt, *string_val, NULL }; #endif /* !OS_SYSV */ char buf1[1024], buf2[1024]; double value, digits = 9.123456789012345678901234567890123456789; int i, j, r1, r2, failed = 0, num = 0; /* * Use -DTEST_NILS in order to also test the conversion of nil values. Might * segfault on systems which don't support converting a NULL pointer with "%s" * and lets some test cases fail against BSD and glibc due to bugs in their * implementations. */ #ifndef TEST_NILS #define TEST_NILS 0 #elif TEST_NILS #undef TEST_NILS #define TEST_NILS 1 #endif /* !defined(TEST_NILS) */ #ifdef TEST #undef TEST #endif /* defined(TEST) */ #define TEST(fmt, val) \ do { \ for (i = 0; fmt[i] != NULL; i++) \ for (j = 0; j == 0 || val[j - TEST_NILS] != 0; j++) { \ r1 = sprintf(buf1, fmt[i], val[j]); \ r2 = snprintf(buf2, sizeof(buf2), fmt[i], val[j]); \ if (strcmp(buf1, buf2) != 0 || r1 != r2) { \ (void)printf("Results don't match, " \ "format string: %s\n" \ "\t sprintf(3): [%s] (%d)\n" \ "\tsnprintf(3): [%s] (%d)\n", \ fmt[i], buf1, r1, buf2, r2); \ failed++; \ } \ num++; \ } \ } while (/* CONSTCOND */ 0) #if HAVE_LOCALE_H (void)setlocale(LC_ALL, ""); #endif /* HAVE_LOCALE_H */ (void)puts("Testing our snprintf(3) against your system's sprintf(3)."); TEST(float_fmt, float_val); TEST(long_fmt, long_val); TEST(ulong_fmt, ulong_val); TEST(llong_fmt, llong_val); TEST(string_fmt, string_val); #if !OS_SYSV /* SysV uses a different format than we do. */ TEST(pointer_fmt, pointer_val); #endif /* !OS_SYSV */ (void)printf("Result: %d out of %d tests failed.\n", failed, num); (void)fputs("Checking how many digits we support: ", stdout); for (i = 0; i < 100; i++) { value = pow(10, i) * digits; (void)sprintf(buf1, "%.1f", value); (void)snprintf(buf2, sizeof(buf2), "%.1f", value); if (strcmp(buf1, buf2) != 0) { (void)printf("apparently %d.\n", i); break; } } return (failed == 0) ? 0 : 1; } #endif /* TEST_SNPRINTF */ /* vim: set joinspaces textwidth=80: */ instead-3.2.1/src/instead/tinymt32.h0000644000175000017500000000734213267071774016270 0ustar peterpeter#ifndef TINYMT32_H #define TINYMT32_H #ifdef _USE_SDL #include #else #include typedef uint32_t Uint32; #endif /** * @file tinymt32.h * * @brief Tiny Mersenne Twister only 127 bit internal state * * @author Mutsuo Saito (Hiroshima University) * @author Makoto Matsumoto (University of Tokyo) * * Copyright (C) 2011 Mutsuo Saito, Makoto Matsumoto, * Hiroshima University and The University of Tokyo. * All rights reserved. * * The 3-clause BSD License is applied to this software, see * http://www.math.sci.hiroshima-u.ac.jp/~%20m-mat/MT/TINYMT/LICENSE.txt * * Changes: * a) some code removed * b) SDL_types.h Uint32 instead of uint32_t * c) url to LICENSE */ #ifdef S60 #define UINT32_C(c) (c ## U) #else #include #include #endif #define TINYMT32_MEXP 127 #define TINYMT32_SH0 1 #define TINYMT32_SH1 10 #define TINYMT32_SH8 8 #define TINYMT32_MASK UINT32_C(0x7fffffff) #define TINYMT32_MUL (1.0f / 4294967296.0f) /** * tinymt32 internal state vector and parameters */ struct TINYMT32_T { Uint32 status[4]; Uint32 mat1; Uint32 mat2; Uint32 tmat; }; typedef struct TINYMT32_T tinymt32_t; void tinymt32_init(tinymt32_t * random, Uint32 seed); void tinymt32_init_by_array(tinymt32_t * random, Uint32 init_key[], int key_length); /** * This function changes internal state of tinymt32. * Users should not call this function directly. * @param random tinymt internal status */ __inline static void tinymt32_next_state(tinymt32_t * random) { Uint32 x; Uint32 y; y = random->status[3]; x = (random->status[0] & TINYMT32_MASK) ^ random->status[1] ^ random->status[2]; x ^= (x << TINYMT32_SH0); y ^= (y >> TINYMT32_SH0) ^ x; random->status[0] = random->status[1]; random->status[1] = random->status[2]; random->status[2] = x ^ (y << TINYMT32_SH1); random->status[3] = y; random->status[1] ^= -((int32_t)(y & 1)) & random->mat1; random->status[2] ^= -((int32_t)(y & 1)) & random->mat2; } /** * This function outputs 32-bit unsigned integer from internal state. * Users should not call this function directly. * @param random tinymt internal status * @return 32-bit unsigned pseudorandom number */ __inline static Uint32 tinymt32_temper(tinymt32_t * random) { Uint32 t0, t1; t0 = random->status[3]; t1 = random->status[0] + (random->status[2] >> TINYMT32_SH8); t0 ^= t1; t0 ^= -((int32_t)(t1 & 1)) & random->tmat; return t0; } /** * This function outputs 32-bit unsigned integer from internal state. * @param random tinymt internal status * @return 32-bit unsigned integer r (0 <= r < 2^32) */ __inline static Uint32 tinymt32_generate_uint32(tinymt32_t * random) { tinymt32_next_state(random); return tinymt32_temper(random); } /** * This function outputs floating point number from internal state. * This function is implemented using multiplying by 1 / 2^32. * floating point multiplication is faster than using union trick in * my Intel CPU. * @param random tinymt internal status * @return floating point number r (0.0 <= r < 1.0) */ __inline static float tinymt32_generate_float(tinymt32_t * random) { tinymt32_next_state(random); return tinymt32_temper(random) * TINYMT32_MUL; } /** * This function outputs double precision floating point number from * internal state. The returned value has 32-bit precision. * In other words, this function makes one double precision floating point * number from one 32-bit unsigned integer. * @param random tinymt internal status * @return floating point number r (0.0 < r <= 1.0) */ __inline static double tinymt32_generate_32double(tinymt32_t * random) { tinymt32_next_state(random); return tinymt32_temper(random) * (1.0 / 4294967296.0); } #endif instead-3.2.1/src/instead/util.c0000644000175000017500000003373513267071774015554 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "system.h" #include "util.h" #include "tinymt32.h" int get_utf8(const char *sp, unsigned long *sym_out) { int i = 0, l = 0; unsigned long sym = 0; const unsigned char *p = (const unsigned char*)sp; if (sym_out) *sym_out = *p; if (!*p) return 0; if (!(*p & 0xc0)) return 1; if ((*p & 0xe0) == 0xc0) { l = 1; sym = (*p & 0x1f); } else if ((*p & 0xf0) == 0xe0) { l = 2; sym = (*p & 0xf); } else if ((*p & 0xf8) == 0xf0) { l = 3; sym = (*p & 7); } else if ((*p & 0xfc) == 0xf8) { l = 4; sym = (*p & 3); } else if ((*p & 0xfe) == 0xfc) { l = 5; sym = (*p & 1); } else { return 1; } p ++; for (i = 0; i < l; i ++) { sym <<= 6; if ((*p & 0xc0) != 0x80) { return 1; } sym |= (*p++ & 0x3f); } if (sym_out) *sym_out = sym; return l + 1; } int is_cjk(unsigned long sym) { if (sym >=0x2E80 && sym <= 0x2EFF) return 1; if (sym >=0x2F00 && sym <= 0x2FDF) return 1; if (sym >= 0x2FF0 && sym <= 0x2FFF) return 1; if (sym >= 0x3000 && sym <= 0x303F) return 1; if (sym >= 0x3040 && sym <= 0x309F) return 1; if (sym >= 0x30A0 && sym <=0x30FF) return 1; if (sym >= 0x3100 && sym <=0x312F) return 1; if (sym >= 0x3130 && sym <= 0x318F) return 1; if (sym >= 0x3190 && sym <= 0x319F) return 1; if (sym >= 0x31A0 && sym <= 0x31BF) return 1; if (sym >= 0x31F0 && sym <= 0x31FF) return 1; if (sym >= 0x3200 && sym <= 0x32FF) return 1; if (sym >= 0x3300 && sym <= 0x33FF) return 1; if (sym >= 0x3400 && sym <= 0x4DBF) return 1; if (sym >= 0x4DC0 && sym <= 0x4DFF) return 1; if (sym >= 0x4E00 && sym <= 0x9FFF) return 1; if (sym >= 0xA000 && sym <= 0xA48F) return 1; if (sym >= 0xA490 && sym <= 0xA4CF) return 1; if (sym >= 0xAC00 && sym <= 0xD7AF) return 1; if (sym >= 0xF900 && sym <= 0xFAFF) return 1; if (sym >= 0xFE30 && sym <= 0xFE4F) return 1; if (sym >= 0x1D300 && sym <= 0x1D35F) return 1; if (sym >= 0x20000 && sym <= 0x2A6DF) return 1; if (sym >= 0x2F800 && sym <= 0x2FA1F) return 1; return 0; } int is_space(int c) { return (c == ' ' || c == '\t'); } int is_empty(const char *str) { if (!str || !*str) return 1; while (*str && !is_space(*str++)) return 0; return 1; } char *strip(char *s) { char *e; while (is_space(*s)) s ++; if (!*s) return s; e = s + strlen(s) - 1; while (e != s && is_space(*e)) { *e = 0; e --; } return s; } int strlowcmp(const char *s, const char *d) { int rc; char *ss = NULL; char *dd = NULL; ss = strdup(s); dd = strdup(d); if (!ss || !dd) { rc = strcmp(s, d); goto err; } tolow(ss); tolow(dd); rc = strcmp(ss, dd); err: if (ss) free(ss); if (dd) free(dd); return rc; } char *getpath(const char *d, const char *n) { char *p = getfilepath(d, n); strcat(p, "/"); return p; } void tolow(char *p) { while (*p) { if (*p >= 'A' && *p <= 'Z') *p |= 0x20; p ++; } } char *getfilepath(const char *d, const char *n) { int i = ((d)?strlen(d):0) + ((n)?strlen(n):0) + 3; char *p = malloc(i); if (p) { p[0] = 0; if (d && d[0]) { /* non empty string */ strcpy(p, d); if (p[strlen(d) - 1] != '/') strcat(p, "/"); } if (n) strcat(p, n); unix_path(p); } return p; } void unix_path(char *path) { char *p = path; if (!path) return; while (*p) { /* bad bad Windows!!! */ if (*p == '\\') *p = '/'; p ++; } return; } #ifdef _HAVE_ICONV #define CHAR_MAX_LEN 4 char *decode(iconv_t hiconv, const char *s) { size_t s_size, chs_size, outsz, insz; char *inbuf, *outbuf, *chs_buf; if (!s || hiconv == (iconv_t)(-1)) return NULL; s_size = strlen(s) + 1; chs_size = s_size * CHAR_MAX_LEN; if ((chs_buf = malloc(chs_size + CHAR_MAX_LEN))==NULL) goto exitf; outsz = chs_size; outbuf = chs_buf; insz = s_size; inbuf = (char*)s; while (insz) { if (iconv(hiconv, &inbuf, &insz, &outbuf, &outsz) == (size_t)(-1)) goto exitf; } *outbuf++ = 0; return chs_buf; exitf: if(chs_buf) free(chs_buf); return NULL; } #endif static tinymt32_t trandom; void mt_random_init(void) { tinymt32_init(&trandom, time(NULL)); } void mt_random_seed(unsigned long seed) { tinymt32_init(&trandom, seed); } unsigned long mt_random(void) { return tinymt32_generate_uint32(&trandom); } double mt_random_double(void) { return tinymt32_generate_32double(&trandom); } #if defined(S60) #include "system.h" #include #include #include #include #include #include #include #include #include #include #include #include "snprintf.c" int setdir(const char *path) { return chdir(path); } char *getdir(char *path, size_t size) { return getcwd(path, size); } char *dirpath(const char *path) { return (char*)path; } int is_absolute_path(const char *path) { if (!path || !path[0]) return 0; if (path[0] == '/' || path[0] == '\\') return 1; if (!path[1]) return 0; return (path[1] == ':'); } char *dirname(char *path) { char *p; if (path == NULL || *path == '\0') return "."; p = path + strlen(path) - 1; while (*p == '/') { if (p == path) return path; *p-- = '\0'; } while (p >= path && *p != '/') p--; return p < path ? "." : p == path ? "/" : (*p = '\0', path); } char* basename (char* path) { char *ptr = path; int l = 0; while (ptr[(l = strcspn (ptr, "\\//"))]) ptr += l + 1; return ptr; } #elif defined(_WIN32_WCE) #include "system.h" #include #include #include #include #include #include #include #include static char curdir[PATH_MAX]; int setdir(const char *path) { strncpy(curdir, path, sizeof(curdir) - 1); return 0; } char *getdir(char *path, size_t size) { strncpy(path, curdir, size - 1); return path; } char *dirpath(const char *path) { static char fp[PATH_MAX * 4]; if (path[0] == '/') return (char*)path; snprintf(fp, sizeof(fp), "%s/%s", curdir, path); fp[sizeof(fp) - 1] = 0; unix_path(fp); return fp; } int is_absolute_path(const char *path) { if (!path || !*path) return 0; return (*path == '/' || *path == '\\'); } #elif defined(WINRT) #include "system.h" #include #include #include #include #include #include static char curdir[PATH_MAX]; int setdir(const char *path) { strncpy(curdir, path, sizeof(curdir) - 1); return 0; } char *getdir(char *path, size_t size) { strncpy(path, curdir, size - 1); return path; } char *dirpath(const char *path) { static char fp[PATH_MAX * 4]; if (path[0] == '/' || path[1] == ':') return (char*)path; snprintf(fp, sizeof(fp), "%s/%s", curdir, path); fp[sizeof(fp) - 1] = 0; unix_path(fp); return fp; } int is_absolute_path(const char *path) { if (!path || !*path) return 0; return (*path == '/' || *path == '\\' || path[1] == ':'); } // dirname & basename functions were copied from S60 above char *dirname(char *path) { char *p; if (path == NULL || *path == '\0') return "."; p = path + strlen(path) - 1; while (*p == '/') { if (p == path) return path; *p-- = '\0'; } while (p >= path && *p != '/') p--; return p < path ? "." : p == path ? "/" : (*p = '\0', path); } char* basename(char* path) { char *ptr = path; int l = 0; while (ptr[(l = strcspn(ptr, "\\//"))]) ptr += l + 1; return ptr; } #elif defined(_WIN32) #include #include #include #include #include #ifndef _MSC_VER #include #endif #include #include #include int setdir(const char *path) { return chdir(path); } char *getdir(char *path, size_t size) { return getcwd(path, size); } char *dirpath(const char *path) { return (char*)path; } int is_absolute_path(const char *path) { if (!path || !path[0]) return 0; if (path[0] == '/' || path[0] == '\\') return 1; if (!path[1]) return 0; return (path[1] == ':'); } #ifdef _MSC_VER // dirname & basename functions were copied from S60 above char *dirname(char *path) { char *p; if (path == NULL || *path == '\0') return "."; p = path + strlen(path) - 1; while (*p == '/') { if (p == path) return path; *p-- = '\0'; } while (p >= path && *p != '/') p--; return p < path ? "." : p == path ? "/" : (*p = '\0', path); } char* basename(char* path) { char *ptr = path; int l = 0; while (ptr[(l = strcspn(ptr, "\\//"))]) ptr += l + 1; return ptr; } #endif #elif defined(__APPLE__) #include #include #include #include #include #include #include #include #include #include #include "system.h" int setdir(const char *path) { return chdir(path); } char *getdir(char *path, size_t size) { return getcwd(path, size); } char *dirpath(const char *path) { return (char*)path; } int is_absolute_path(const char *path) { if (!path || !*path) return 0; return (*path == '/'); } #else #include #include #include #include #include #include #include #include #include #include #include #ifndef ANDROID int setdir(const char *path) { return chdir(path); } char *getdir(char *path, size_t size) { return getcwd(path, size); } char *dirpath(const char *path) { return (char*)path; } #else static char curdir[PATH_MAX]; int setdir(const char *path) { strncpy(curdir, path, sizeof(curdir) - 1); return chdir(path); } char *getdir(char *path, size_t size) { strncpy(path, curdir, size - 1); return path; } char *dirpath(const char *path) { static char fp[PATH_MAX * 4]; if (path[0] == '/') return (char*)path; snprintf(fp, sizeof(fp), "%s/%s", curdir, path); fp[sizeof(fp) - 1] = 0; unix_path(fp); return fp; } #endif int is_absolute_path(const char *path) { if (!path || !*path) return 0; return (*path == '/'); } #endif /* * * This code is derived from software contributed to Berkeley by * Jan-Simon Pendry. * */ /* * char *realpath(const char *path, char *resolved); * * Find the real name of path, by removing all ".", ".." and symlink * components. Returns (resolved) on success, or (NULL) on failure, * in which case the path which caused trouble is left in (resolved). */ char *getrealpath(const char *path, char *resolved) { const char *q; char *p, *fres; size_t len; #if defined(unix) && !defined(S60) struct stat sb; ssize_t n; int idx = 0, nlnk = 0; char wbuf[2][PATH_MAX]; #endif /* POSIX sez we must test for this */ if (path == NULL) { return NULL; } if (resolved == NULL) { fres = resolved = malloc(PATH_MAX); if (resolved == NULL) return NULL; } else fres = NULL; /* * Build real path one by one with paying an attention to ., * .. and symbolic link. */ /* * `p' is where we'll put a new component with prepending * a delimiter. */ p = resolved; if (*path == '\0') { *p = '\0'; goto out; } /* If relative path, start from current working directory. */ if (!is_absolute_path(path)) { /* check for resolved pointer to appease coverity */ if (getdir(resolved, PATH_MAX) == NULL) { p[0] = '.'; p[1] = '\0'; goto out; } unix_path(resolved); len = strlen(resolved); if (len > 1) p += len; } loop: /* Skip any slash. */ while (*path == '/') path++; if (*path == '\0') { if (p == resolved) *p++ = '/'; *p = '\0'; return resolved; } /* Find the end of this component. */ q = path; do q++; while (*q != '/' && *q != '\0'); /* Test . or .. */ if (path[0] == '.') { if (q - path == 1) { path = q; goto loop; } if (path[1] == '.' && q - path == 2) { /* Trim the last component. */ if (p != resolved) while (*--p != '/' && p != resolved) continue; path = q; goto loop; } } /* Append this component. */ if (p - resolved + 1 + q - path + 1 > PATH_MAX) { if (p == resolved) *p++ = '/'; *p = '\0'; goto out; } if (p == resolved && is_absolute_path(path) && path[0] != '/') { /* win? */ memcpy(&p[0], path, q - path); p[q - path] = '\0'; p += q - path; path = q; goto loop; } else { p[0] = '/'; memcpy(&p[1], path, /* LINTED We know q > path. */ q - path); p[1 + q - path] = '\0'; } #if defined(unix) && !defined(S60) /* * If this component is a symlink, toss it and prepend link * target to unresolved path. */ if (lstat(resolved, &sb) != -1 && S_ISLNK(sb.st_mode)) { if (nlnk++ >= 16) { goto out; } n = readlink(resolved, wbuf[idx], sizeof(wbuf[0]) - 1); if (n < 0) goto out; if (n == 0) { goto out; } /* Append unresolved path to link target and switch to it. */ if (n + (len = strlen(q)) + 1 > sizeof(wbuf[0])) { goto out; } memcpy(&wbuf[idx][n], q, len + 1); path = wbuf[idx]; idx ^= 1; /* If absolute symlink, start from root. */ if (*path == '/') p = resolved; goto loop; } #endif /* Advance both resolved and unresolved path. */ p += 1 + q - path; path = q; goto loop; out: free(fres); return NULL; } instead-3.2.1/src/instead/list.c0000644000175000017500000000722413267071774015544 0ustar peterpeter/* Licensed under BSD-MIT - see LICENSE file for details */ #include #include #include "list.h" void list_head_init(struct list_head *h) { h->n.next = h->n.prev = &h->n; } void list_add(struct list_head *h, struct list_node *n) { n->next = h->n.next; n->prev = &h->n; h->n.next->prev = n; h->n.next = n; (void)list_debug(h); } void list_add_tail(struct list_head *h, struct list_node *n) { n->next = &h->n; n->prev = h->n.prev; h->n.prev->next = n; h->n.prev = n; (void)list_debug(h); } int list_empty(const struct list_head *h) { (void)list_debug(h); return h->n.next == &h->n; } void list_del(struct list_node *n) { (void)list_debug_node(n); n->next->prev = n->prev; n->prev->next = n->next; #ifdef CCAN_LIST_DEBUG /* Catch use-after-del. */ n->next = n->prev = NULL; #endif } void list_del_from(struct list_head *h, struct list_node *n) { #ifdef CCAN_LIST_DEBUG { /* Thorough check: make sure it was in list! */ struct list_node *i; for (i = h->n.next; i != n; i = i->next) assert(i != &h->n); } #endif /* CCAN_LIST_DEBUG */ /* Quick test that catches a surprising number of bugs. */ assert(!list_empty(h)); list_del(n); } const void *list_top_(const struct list_head *h, size_t off) { if (list_empty(h)) return NULL; return (const char *)h->n.next - off; } const void *list_pop_(const struct list_head *h, size_t off) { struct list_node *n; if (list_empty(h)) return NULL; n = h->n.next; list_del(n); return (const char *)n - off; } const void *list_tail_(const struct list_head *h, size_t off) { if (list_empty(h)) return NULL; return (const char *)h->n.prev - off; } void list_append_list(struct list_head *to, struct list_head *from) { struct list_node *from_tail = list_debug(from)->n.prev; struct list_node *to_tail = list_debug(to)->n.prev; /* Sew in head and entire list. */ to->n.prev = from_tail; from_tail->next = &to->n; to_tail->next = &from->n; from->n.prev = to_tail; /* Now remove head. */ list_del(&from->n); list_head_init(from); } void list_prepend_list(struct list_head *to, struct list_head *from) { struct list_node *from_tail = list_debug(from)->n.prev; struct list_node *to_head = list_debug(to)->n.next; /* Sew in head and entire list. */ to->n.next = &from->n; from->n.prev = &to->n; to_head->prev = from_tail; from_tail->next = to_head; /* Now remove head. */ list_del(&from->n); list_head_init(from); } void *list_node_to_off_(struct list_node *node, size_t off) { return (void *)((char *)node - off); } struct list_node *list_node_from_off_(void *ptr, size_t off) { return (struct list_node *)((char *)ptr + off); } void *list_entry_or_null(const struct list_head *h, const struct list_node *n, size_t off) { if (n == &h->n) return NULL; return (char *)n - off; } static void *corrupt(const char *abortstr, const struct list_node *head, const struct list_node *node, unsigned int count) { if (abortstr) { fprintf(stderr, "%s: prev corrupt in node %p (%u) of %p\n", abortstr, node, count, head); abort(); } return NULL; } struct list_node *list_check_node(const struct list_node *node, const char *abortstr) { const struct list_node *p, *n; int count = 0; for (p = node, n = node->next; n != node; p = n, n = n->next) { count++; if (n->prev != p) return corrupt(abortstr, node, n, count); } /* Check prev on head node. */ if (node->prev != p) return corrupt(abortstr, node, node, 0); return (struct list_node *)node; } struct list_head *list_check(const struct list_head *h, const char *abortstr) { if (!list_check_node(&h->n, abortstr)) return NULL; return (struct list_head *)h; } instead-3.2.1/src/instead/system.h0000644000175000017500000000132113267071774016112 0ustar peterpeter#ifndef __INSTEAD_EXTERNAL_H_ #define __INSTEAD_EXTERNAL_H_ #if defined (_WIN32_WCE) || defined(WINRT) #define errno 0 #define putenv(a) ; #ifndef WINRT #define strerror(a) "" #define setlocale(a, b) ; #endif #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef S60 #include #endif #ifdef S60 #include "snprintf.h" typedef long ssize_t; #endif #include #ifndef PATH_MAX #define PATH_MAX 4096 #endif #endif instead-3.2.1/src/instead/cache.c0000644000175000017500000001611713267071774015635 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include "list.h" #include "cache.h" extern unsigned long hash_string(const char *str); #define HASH_SIZE 511 typedef struct { struct list_head list; struct list_head unused; int auto_grow; int size; int max_size; int used; cache_free_fn free_fn; struct list_head hash[HASH_SIZE]; struct list_head vhash[HASH_SIZE]; } _cache_t; typedef struct { struct list_node list; struct list_node *hash; struct list_node *vhash; char *name; void *data; int used; } _cache_e_t; typedef struct { struct list_node list; _cache_e_t *data; } _hash_item_t; /* #define GOLDEN_RATIO_PRIME_32 0x9e370001UL */ #include static unsigned long hash_long32(unsigned long a) { a = (a+0x7ed55d16) + (a<<12); a = (a^0xc761c23c) ^ (a>>19); a = (a+0x165667b1) + (a<<5); a = (a+0xd3a2646c) ^ (a<<9); a = (a+0xfd7046c5) + (a<<3); a = (a^0xb55a4f09) ^ (a>>16); return a; } static unsigned long hash_long64(unsigned long key) { key = (~key) + (key << 21); /* key = (key << 21) - key - 1; */ key = key ^ (key >> 24); key = (key + (key << 3)) + (key << 8); /* key * 265 */ key = key ^ (key >> 14); key = (key + (key << 2)) + (key << 4); /* key * 21 */ key = key ^ (key >> 28); key = key + (key << 31); return key; } unsigned long hash_addr(void *p) { if (sizeof(long) == 8) return hash_long64((unsigned long)p); return hash_long32((unsigned long)p); } unsigned long hash_string(const char *str) { unsigned long hash = 0; int c; while ((c = *str++)) hash = c + (hash << 6) + (hash << 16) - hash; return hash; } cache_t cache_init(int size, cache_free_fn free_fn) { int i = 0; _cache_t *c = malloc(sizeof(_cache_t)); if (!c) return NULL; list_head_init(&c->list); list_head_init(&c->unused); c->auto_grow = 0; c->size = 0; c->used = 0; if (!size) c->auto_grow = 1; c->max_size = size; c->free_fn = free_fn; for (i = 0; i < HASH_SIZE; i++) { list_head_init(&c->hash[i]); list_head_init(&c->vhash[i]); } return (cache_t)c; } static void cache_e_free(cache_t cache, _cache_e_t *cc) { _cache_t *c = cache; if (!c) return; list_del(cc->hash); list_del(cc->vhash); list_del(&cc->list); if (c->free_fn && !cc->used) { c->free_fn(cc->data); } free(cc->name); free(cc->hash); free(cc->vhash); free(cc); } void cache_zap(cache_t cache) { _cache_t *c = cache; if (!c) return; while (!list_empty(&c->list)) cache_e_free(cache, list_top(&c->list, _cache_e_t, list)); while (!list_empty(&c->unused)) cache_e_free(cache, list_top(&c->unused, _cache_e_t, list)); c->size = 0; c->used = 0; } void cache_free(cache_t cache) { if (!cache) return; cache_zap(cache); free(cache); } static _cache_e_t *_cache_lookup(cache_t cache, const char *name) { _hash_item_t *pos = NULL; struct list_head *list; _cache_t *c = cache; _cache_e_t *cc; if (!c || !name) return NULL; list = &c->hash[hash_string(name) % HASH_SIZE]; list_for_each(list, pos, list) { cc = pos->data; if (!strcmp(cc->name, name)) return cc; } return NULL; } static _cache_e_t *cache_data(cache_t cache, void *p) { _hash_item_t *pos = NULL; struct list_head *list; _cache_t *c = cache; _cache_e_t *cc; if (!c || !p) return NULL; list = &c->vhash[hash_addr(p) % HASH_SIZE]; list_for_each(list, pos, list) { cc = pos->data; if (p == cc->data) return cc; } return NULL; } int cache_forget(cache_t cache, void *p) { _cache_t *c = cache; _cache_e_t *cc = cache_data(cache, p); /* if (cc) fprintf(stderr, "Forget %p at %d\n", p, cc->used); */ if (cc && cc->used) { cc->used --; if (!cc->used) { ((_cache_t*)cache)->used --; list_del(&cc->list); list_add_tail(&c->unused, &cc->list); } return 0; } return -1; } void *cache_get(cache_t cache, const char *name) { _cache_e_t *cc; _cache_t *c = cache; if (!c || !name) return NULL; cc = _cache_lookup(cache, name); if (!cc) return NULL; cc->used ++; /* need again! */ if (cc->used == 1) ((_cache_t*)cache)->used ++; list_del(&cc->list); list_add(&c->list, &cc->list); /* first place */ /* printf("cache_get %s:%p %d\n", name, cc->data, cc->used); */ return cc->data; } void *cache_lookup(cache_t cache, const char *name) { _cache_e_t *cc; _cache_t *c = cache; if (!c || !name) return NULL; cc = _cache_lookup(cache, name); if (!cc) return NULL; return cc->data; } int cache_have(cache_t cache, void *p) { _cache_e_t *cc; _cache_t *c = cache; if (!c || !p) return -1; cc = cache_data(cache, p); if (!cc) return -1; return 0; } static void __cache_shrink(_cache_t *c) { while (c->size && c->size > c->max_size && !list_empty(&c->unused)) { _cache_e_t *cc = list_top(&c->unused, _cache_e_t, list); c->size --; cache_e_free(c, cc); } /* fprintf(stderr,"%d/%d\n", c->size, c->used); */ } int cache_add(cache_t cache, const char *name, void *p) { _cache_e_t *cc; _hash_item_t *hh; _hash_item_t *vh; _cache_t *c = cache; struct list_head *list; if (!c || !name) return -1; cc = _cache_lookup(cache, name); if (cc) return 0; cc = malloc(sizeof(_cache_e_t)); if (!cc) return -1; hh = malloc(sizeof(_hash_item_t)); if (!hh) { free(cc); return -1; } vh = malloc(sizeof(_hash_item_t)); if (!vh) { free(hh); free(cc); return -1; } cc->name = strdup(name); if (!cc->name) { free(vh); free(hh); free(cc); return -1; } cc->data = p; cc->used = 1; cc->hash = &hh->list; cc->vhash = &vh->list; list_add(&c->list, &cc->list); list = &c->hash[hash_string(name) % HASH_SIZE]; hh->data = cc; list_add(list, &hh->list); list = &c->vhash[hash_addr(p) % HASH_SIZE]; vh->data = cc; list_add(list, &vh->list); c->size ++; c->used ++; if (c->auto_grow && c->used > c->max_size) c->max_size = c->used; /* printf("cache_add %s:%p %d\n", name, cc->data, cc->used); __cache_shrink(c); */ return 0; } void cache_shrink(cache_t cache) { _cache_t *c = cache; if (!c) return; if (c->auto_grow && c->max_size > 2*c->used) c->max_size = c->used + c->used / 2; __cache_shrink(c); /* printf("size: %d:%d:%d\n", c->used, c->size, c->max_size); */ } instead-3.2.1/src/instead/idf.h0000644000175000017500000000432413267071774015336 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __IDF_H_INCLUDED #define __IDF_H_INCLUDED struct _idf_t; struct _idff_t; typedef struct _idf_t *idf_t; typedef struct _idff_t *idff_t; extern idf_t idf_init(const char *path); extern void idf_shrink(idf_t idf); extern void idf_done(idf_t idf); extern int idf_create(const char *file, const char *path); extern idff_t idf_open(idf_t idf, const char *fname); extern int idf_setdir(idf_t idf, const char *path); extern char *idf_getdir(idf_t idf); extern int idf_seek(idff_t fil, int offset, int whence); extern int idf_read(idff_t fil, void *ptr, int size, int maxnum); extern int idf_close(idff_t fil); extern int idf_eof(idff_t idf); extern int idf_error(idff_t idf); extern int idf_access(idf_t idf, const char *fname); extern idff_t idf_opendir(idf_t idf, const char *dname); extern int idf_closedir(idff_t d); extern char *idf_readdir(idff_t d); extern char *idf_gets(idff_t idf, char *b, int size); extern int idf_magic(const char *fname); extern int idf_only(idf_t idf, int fl); #ifdef _USE_SDL #include extern SDL_RWops *RWFromIdf(idf_t idf, const char *fname); #endif #endif instead-3.2.1/src/instead/lfs.c0000644000175000017500000000562013267071774015353 0ustar peterpeter/* From: ** LuaFileSystem ** Copyright Kepler Project 2003 (http://www.keplerproject.org/luafilesystem) ** $Id: lfs.c,v 1.61 2009/07/04 02:10:16 mascarenhas Exp $ */ #include "system.h" #include "util.h" #define DIR_METATABLE "directory metatable" typedef struct dir_data { int closed; #ifdef _WIN32 intptr_t hFile; char pattern[PATH_MAX + 1]; #else DIR *dir; #endif } dir_data; /* ** Directory iterator */ static int dir_iter (lua_State *L) { #ifdef _WIN32 struct _finddata_t c_file; #else struct dirent *entry; #endif dir_data *d = (dir_data *)luaL_checkudata (L, 1, DIR_METATABLE); luaL_argcheck (L, d->closed == 0, 1, "closed directory"); #ifdef _WIN32 if (d->hFile == 0L) { /* first entry */ if ((d->hFile = _findfirst (d->pattern, &c_file)) == -1L) { lua_pushnil (L); lua_pushstring (L, "Error while iterating dir."); d->closed = 1; return 2; } else { lua_pushstring (L, c_file.name); return 1; } } else { /* next entry */ if (_findnext (d->hFile, &c_file) == -1L) { /* no more entries => close directory */ _findclose (d->hFile); d->closed = 1; return 0; } else { lua_pushstring (L, c_file.name); return 1; } } #else if (!d->dir) return 0; /* no directory opened */ if ((entry = readdir (d->dir)) != NULL) { lua_pushstring (L, entry->d_name); return 1; } else { /* no more entries => close directory */ closedir (d->dir); d->closed = 1; return 0; } #endif } /* ** Closes directory iterators */ static int dir_close (lua_State *L) { dir_data *d = (dir_data *)lua_touserdata (L, 1); #ifdef _WIN32 if (!d->closed && d->hFile) { _findclose (d->hFile); } #else if (!d->closed && d->dir) { closedir (d->dir); } #endif d->closed = 1; return 0; } /* ** Factory of directory iterators */ int dir_iter_factory (lua_State *L) { const char *path = luaL_checkstring (L, 1); dir_data *d; lua_pushcfunction (L, dir_iter); d = (dir_data *) lua_newuserdata (L, sizeof(dir_data)); d->closed = 0; #ifdef _WIN32 d->hFile = 0L; luaL_getmetatable (L, DIR_METATABLE); lua_setmetatable (L, -2); if (strlen(path) > PATH_MAX - 2) luaL_error (L, "path too long: %s", path); else sprintf (d->pattern, "%s/*", path); #else luaL_getmetatable (L, DIR_METATABLE); lua_setmetatable (L, -2); d->dir = opendir (dirpath(path)); if (d->dir == NULL) luaL_error (L, "cannot open %s.", path); #endif return 2; } /* ** Creates directory metatable. */ static int dir_create_meta (lua_State *L) { luaL_newmetatable (L, DIR_METATABLE); /* set its __gc field */ lua_pushstring (L, "__index"); lua_newtable(L); lua_pushstring (L, "next"); lua_pushcfunction (L, dir_iter); lua_settable(L, -3); lua_pushstring (L, "close"); lua_pushcfunction (L, dir_close); lua_settable(L, -3); lua_settable (L, -3); lua_pushstring (L, "__gc"); lua_pushcfunction (L, dir_close); lua_settable (L, -3); return 1; } int luaopen_lfs (lua_State *L) { dir_create_meta (L); return 1; } instead-3.2.1/src/game.c0000644000175000017500000022654213267071774014061 0ustar peterpeter/* * Copyright 2009-2018 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" #define MOTION_TIME (timer_counter - click_time >= 200 / HZ) int game_running = 1; char game_cwd[PATH_MAX]; char *curgame_dir = NULL; int game_grab_events = 0; int game_wait_use = 1; int game_own_theme = 0; int game_theme_changed = 0; unsigned int mouse_filter_delay = 400; static int need_restart = 0; static int game_pic_w = 0; static int game_pic_h = 0; static char *last_pict = NULL; static char *last_title = NULL; static char *last_cmd = NULL; void game_cursor(int on); extern void instead_render_callback(void); extern int instead_render_callback_dirty(int reset); void game_flip(void) { instead_render_callback(); gfx_flip(); } static void _game_update(int x, int y, int w, int h) { if (instead_render_callback_dirty(-1) == 1) return; gfx_update(x, y, w, h); } static void game_update(int x, int y, int w, int h) { if (instead_render_callback_dirty(-1) == 1) return; game_cursor(CURSOR_DRAW); gfx_update(x, y, w, h); } void game_res_err_msg(const char *filename, int alert) { static const char preambule[] = "Can't load: "; char *msg; unsigned int s; if (!filename || (!*filename && !alert)) return; if (alert && curgame_dir) { s = sizeof(preambule) + strlen(filename) + 2; msg = malloc(s); if (msg) { snprintf(msg, s, "%s\"%s\"", preambule, filename); instead_err_msg(msg); free(msg); } } fprintf(stderr, "%s%s\n", preambule, filename); } int is_game(const char *path, const char *n) { int rc = 0; char *p; char *pp; if (!n) return 0; if (!strcmp("..", n) || !strcmp(".", n)) return 0; p = getfilepath(path, n); if (!p) return 0; if (idf_magic(p)) { free(p); return 1; } /* new api? */ pp = getfilepath(p, INSTEAD_MAIN3); if (!pp) goto out; if (!access(pp, R_OK)) rc = 3; free(pp); if (rc) /* got one! */ goto out; /* classic one? */ pp = getfilepath(p, INSTEAD_MAIN); if (!pp) goto out; if (!access(pp, R_OK)) rc = 2; free(pp); if (rc) goto out; out: free(p); return rc; } struct game *games = NULL; int games_nr = 0; static void game_release(void); struct game *game_lookup(const char *name) { int i; if (!name || !*name) { if (games_nr == 1 && name) return &games[0]; return NULL; } for (i = 0; iname); return g->name; } else { gfx_set_title(NULL); return NULL; } } static int game_cfg_load(void); int game_select(const char *name) { int rc = -1; struct game *g; // FREE(last_cmd); // game_stop_mus(500); g = game_lookup(name); if ((!name || !*name) && !g) { game_use_theme(); return game_theme_init(); } if (g) { char *oldgame = curgame_dir; curgame_dir = g->dir; instead_done(); instead_set_debug(debug_sw); instead_set_standalone(standalone_sw); if (instead_init(g->path)) { curgame_dir = oldgame; goto err; } themes_lookup_idf(instead_idf(), "themes/", THEME_GAME); if (idf_only(instead_idf(), -1) != 1) themes_lookup(dirpath("themes"), THEME_GAME); game_cfg_load(); game_use_theme(); if (game_theme_init()) { curgame_dir = oldgame; goto err; } instead_set_lang(opt_lang); if ((rc = instead_load(NULL))) { curgame_dir = oldgame; goto err; } } else { game_use_theme(); game_theme_init(); rc = 0; } err: game_reset_name(); return rc; } int game_tag_valid(const char *p) { while (p && *p) { p += strcspn(p, "<"); if (gfx_get_token(p, NULL, NULL, NULL)) return 0; if (*p == '<') p ++; } return 1; } static char *game_tag(const char *path, const char *d_name, const char *tag) { char *l = NULL; char *p; if (idf_magic(path)) { idf_t idf = idf_init(path); if (idf) { l = lookup_lang_tag_idf(idf, INSTEAD_MAIN3, tag, "--", opt_lang); if (!l) l = lookup_lang_tag_idf(idf, INSTEAD_MAIN, tag, "--", opt_lang); idf_done(idf); } if (l) goto ok; goto err; } /* stead3 */ p = getfilepath(path, INSTEAD_MAIN3); if (!p) goto err; l = lookup_lang_tag(p, tag, "--", opt_lang); free(p); if (l) goto ok; /* stead2 */ p = getfilepath(path, INSTEAD_MAIN); if (!p) goto err; l = lookup_lang_tag(p, tag, "--", opt_lang); free(p); if (!l) goto err; ok: if (!game_tag_valid(l)) { /* avoid dangerous tags */ free(l); return NULL; } return l; err: return NULL; } static char *game_name(const char *path, const char *d_name) { char *p = game_tag(path, d_name, "Name"); if (!p) return strdup(d_name); trunc_lines(p, 0); return p; } static char *game_info(const char *path, const char *d_name) { char *p = game_tag(path, d_name, "Info"); if (!p) return p; trunc_lines(p, 4); return p; } static char *game_author(const char *path, const char *d_name) { char *p = game_tag(path, d_name, "Author"); trunc_lines(p, 0); return p; } static char *game_version(const char *path, const char *d_name) { char *p = game_tag(path, d_name, "Version"); trunc_lines(p, 0); return p; } #if 0 static char *game_api(const char *path, const char *d_name) { char *p = game_tag(path, d_name, "API"); trunc_lines(p, 0); if (!p) return strdup("stead2"); return p; } #endif static void game_info_free(struct game *g) { FREE(g->name); FREE(g->info); FREE(g->author); FREE(g->version); /* FREE(g->api); */ } static void game_free(struct game *g) { FREE(g->path); FREE(g->dir); game_info_free(g); } static void game_info_fill(struct game *g) { g->name = game_name(dirpath(g->path), g->dir); g->info = game_info(dirpath(g->path), g->dir); g->author = game_author(dirpath(g->path), g->dir); g->version = game_version(dirpath(g->path), g->dir); /* g->api = game_api(dirpath(g->path), g->dir); */ } static void game_fill(struct game *g, const char *p, const char *dir) { g->path = strdup(p); g->dir = strdup(dir); game_info_fill(g); } int games_rename(void) { int i; char cwd[PATH_MAX]; getdir(cwd, sizeof(cwd)); setdir(game_cwd); for (i = 0; i < games_nr; i++) { game_info_free(&games[i]); game_info_fill(&games[i]); } setdir(cwd); return 0; } static int cmp_game(const void *p1, const void *p2) { const struct game *g1 = (const struct game*)p1; const struct game *g2 = (const struct game*)p2; int g1_s = !!strncmp(g1->path, GAMES_PATH, strlen(GAMES_PATH)); int g2_s = !!strncmp(g2->path, GAMES_PATH, strlen(GAMES_PATH)); if (g1_s != g2_s) return g1_s - g2_s; return strcmp(g1->name, g2->name); } static void games_sort() { qsort(games, games_nr, sizeof(struct game), cmp_game); } static int games_add(const char *path, const char *dir) { char *p; if (!is_game(path, dir)) return -1; p = getfilepath(path, dir); if (!p) return -1; if (!idf_magic(p)) { strcat(p, "/"); games[games_nr].idf = 0; } else games[games_nr].idf = 1; game_fill(&games[games_nr], p, dir); free(p); games_nr ++; return 0; } int games_replace(const char *path, const char *dir) { int rc; char *p; struct game *g; struct game *new_games; if (!is_game(path, dir)) return -1; g = game_lookup(dir); if (g) { if (g->idf) p = getfilepath(path, dir); else p = getpath(path, dir); if (!p) return -1; game_free(g); game_fill(g, p, dir); free(p); games_sort(); return 0; } new_games = realloc(games, sizeof(struct game) * (1 + games_nr)); if (!new_games) return -1; games = new_games; rc = games_add(path, dir); if (!rc) games_sort(); return rc; } int games_lookup(const char *path) { int n = 0, i = 0; DIR *d; struct dirent *de; struct game *new_games; if (!path) return 0; d = opendir(path); if (!d) return -1; while ((de = readdir(d))) { /*if (de->d_type != DT_DIR) continue;*/ if (game_lookup(de->d_name)) continue; if (!is_game(path, de->d_name)) continue; n ++; } if (!n) goto out; closedir(d); d = opendir(path); if (!d) return -1; new_games = realloc(games, sizeof(struct game) * (n + games_nr)); if (!new_games) { closedir(d); return -1; } games = new_games; while ((de = readdir(d)) && i < n) { /*if (de->d_type != DT_DIR) continue;*/ if (game_lookup(de->d_name)) continue; if (games_add(path, de->d_name)) continue; i ++; } out: closedir(d); games_sort(); return 0; } int games_remove(int gtr) { int rc; struct game *new_games; rc = remove_dir(games[gtr].path); free(games[gtr].name); free(games[gtr].dir); free(games[gtr].path); games_nr --; memmove(&games[gtr], &games[gtr + 1], (games_nr - gtr) * sizeof(struct game)); new_games = realloc(games, games_nr * sizeof(struct game)); if (new_games) /* failure to shrink otherwise, and it's non-fatal */ games = new_games; return rc; } static int motion_mode = 0; static int motion_id = 0; static int motion_y = 0; static int mx, my; static img_t menubg = NULL; static img_t menu = NULL; static int menu_shown = 0; static int browse_dialog = 0; int game_cmd(char *cmd, int click); void game_clear(int x, int y, int w, int h) { game_cursor(CURSOR_CLEAR); if (game_theme.bg) gfx_draw_bg(game_theme.bg, x, y, w, h); else gfx_clear(x, y, w, h); if (menu_shown) { int xx = x - mx; int yy = y - my; gfx_copy_from(menubg, xx, yy, w, h, NULL, x, y); gfx_draw_from(menu, xx, yy, w, h, NULL, x, y); } } void game_clear_all(void) { game_clear(0, 0, game_theme.w, game_theme.h); } void game_clear(int x, int y, int w, int h); struct el { int id; int x; int y; int mx; int my; /* coordinates */ int type; int drawn; /* int clone; */ union { layout_t lay; textbox_t box; img_t img; void *p; } p; }; enum { elt_box, elt_layout, elt_image, }; enum { el_menu = 1, el_title, el_ways, el_inv, el_scene, el_sup, el_sdown, /* el_sslide, */ el_iup, el_idown, /* el_islide, */ el_spic, el_menu_button, el_max, }; static struct el objs[el_max]; static void el_set(int i, int t, int x, int y, void *p) { objs[i].id = i; objs[i].x = x; objs[i].y = y; objs[i].p.p = p; objs[i].type = t; objs[i].drawn = 0; /* objs[i].clone = 0; */ } static void el_zero(int num) { memset(&objs[num], 0, sizeof(struct el)); } static struct el *el(int num) { return &objs[num]; } static textbox_t el_box(int num) { return objs[num].p.box; } static layout_t el_layout(int num) { return objs[num].p.lay; } static img_t el_img(int num) { return objs[num].p.img; } char *game_menu_gen(void); void game_menu(int nr) { mouse_reset(1); cur_menu = nr; game_menu_box(1, game_menu_gen()); } int game_error(void) { game_done(1); if (game_init(NULL)) { fprintf(stderr,"Fatal error! Can't init anything!!!\n"); exit(1); } game_menu(menu_error); return 0; } static void el_draw(int n); int window_sw = 0; int fullscreen_sw = 0; int hires_sw = -1; int game_load(int nr) { char *s; s = game_save_path(0, nr); if (s && !access(s, R_OK)) { char cmd[PATH_MAX]; char sav[PATH_MAX]; strcpy(sav, s); snprintf(cmd, sizeof(cmd) - 1, "load %s", s); game_cmd(cmd, GAME_CMD_FILE); if (nr == -1) unlink(sav); return 0; } return -1; } int game_saves_enabled(void) { int rc; instead_lock(); instead_function("instead.isEnableSave", NULL); rc = instead_bretval(0); instead_clear(); instead_unlock(); return rc; } int game_autosave_enabled(void) { int rc; instead_lock(); instead_function("instead.isEnableAutosave", NULL); rc = instead_bretval(0); instead_clear(); instead_unlock(); return rc; } int game_save(int nr) { char *s = game_save_path(1, nr); char cmd[PATH_MAX]; char *p; int rc; if (!s) return -1; if (nr == -1 || nr == 0) { struct instead_args args_1[] = { { .val = "-1", .type = INSTEAD_NUM }, { .val = NULL, } }; struct instead_args args_0[] = { { .val = "0", .type = INSTEAD_NUM }, { .val = NULL, } }; if (nr == -1) { instead_lock(); instead_function("instead.autosave", args_1); /* enable saving for -1 */ } else if (!game_autosave_enabled()) return 0; /* nothing todo */ else { instead_lock(); instead_function("instead.autosave", args_0); /* enable saving for 0 */ } instead_clear(); instead_unlock(); } snprintf(cmd, sizeof(cmd) - 1, "save %s", s); instead_lock(); p = instead_file_cmd(cmd, &rc); instead_unlock(); if (p) free(p); if (rc || (!p && instead_err())) { game_menu(menu_warning); return -1; } data_sync(); return 0; } static int inv_enabled(void) { return (game_theme.inv_mode != INV_MODE_DISABLED); } int game_apply_theme(void) { int align = game_theme.win_align; layout_t lay = NULL; textbox_t box = NULL; gfx_bg(game_theme.bgcol); if (!DIRECT_MODE) game_clear_all(); gfx_flip(); if (opt_justify == JUST_NO && align == ALIGN_JUSTIFY) align = ALIGN_LEFT; else if (opt_justify == JUST_YES && align == ALIGN_LEFT) align = ALIGN_JUSTIFY; if (!el_box(el_scene)) { lay = txt_layout(game_theme.font, align, game_theme.win_w, game_theme.win_h); if (!lay) return -1; box = txt_box(game_theme.win_w, game_theme.win_h); if (!box) return -1; txt_layout_color(lay, game_theme.fgcol); txt_layout_link_color(lay, game_theme.lcol); /* txt_layout_link_style(lay, 4); */ txt_layout_active_color(lay, game_theme.acol); txt_layout_font_height(lay, game_theme.font_height); txt_box_set(box, lay); el_set(el_scene, elt_box, game_theme.win_x, 0, box); } if (inv_enabled()) { if (!el_box(el_inv)) { lay = txt_layout(game_theme.inv_font, INV_ALIGN(game_theme.inv_mode), game_theme.inv_w, game_theme.inv_h); if (!lay) return -1; txt_layout_color(lay, game_theme.icol); txt_layout_link_color(lay, game_theme.ilcol); txt_layout_active_color(lay, game_theme.iacol); txt_layout_font_height(lay, game_theme.inv_font_height); box = txt_box(game_theme.inv_w, game_theme.inv_h); if (!box) return -1; txt_box_set(box, lay); el_set(el_inv, elt_box, game_theme.inv_x, game_theme.inv_y, box); } } else el_set(el_inv, elt_box, game_theme.inv_x, game_theme.inv_y, NULL); if (!el_layout(el_title)) { lay = txt_layout(game_theme.font, ALIGN_CENTER, game_theme.win_w, 0); if (!lay) return -1; txt_layout_color(lay, game_theme.fgcol); txt_layout_link_color(lay, game_theme.lcol); txt_layout_active_color(lay, game_theme.acol); txt_layout_font_height(lay, game_theme.font_height); el_set(el_title, elt_layout, game_theme.win_x, game_theme.win_y, lay); } if (!el_layout(el_ways)) { lay = txt_layout(game_theme.font, ALIGN_CENTER, game_theme.win_w, 0); if (!lay) return -1; txt_layout_color(lay, game_theme.fgcol); txt_layout_link_color(lay, game_theme.lcol); txt_layout_active_color(lay, game_theme.acol); txt_layout_font_height(lay, game_theme.font_height); el_set(el_ways, elt_layout, game_theme.win_x, 0, lay); } el_set(el_sdown, elt_image, 0, 0, game_theme.a_down); el_set(el_sup, elt_image, 0, 0, game_theme.a_up); el_set(el_idown, elt_image, 0, 0, game_theme.inv_a_down); el_set(el_iup, elt_image, 0, 0, game_theme.inv_a_up); el_set(el_spic, elt_image, game_theme.win_x, game_theme.win_y, NULL); el_set(el_menu, elt_layout, 0, 0, NULL); el_set(el_menu_button, elt_image, game_theme.menu_button_x, game_theme.menu_button_y, game_theme.menu_button); gfx_set_icon(game_theme.icon); if (!DIRECT_MODE) { el_draw(el_menu_button); } return 0; } int game_restart(void) { char *og = curgame_dir; game_save(-1); game_done(0); if (game_init(og)) { game_error(); return 0; } return 0; } unsigned long timer_counter = 0; gtimer_t timer_han = NULL_TIMER; static int gfx_commit_event = 0; static void _game_gfx_commit(void *data) { gfx_commit_event = 0; gfx_commit(); } void game_gfx_commit(int sync) { if (gfx_fading()) /* to avoid flickering */ return; if (gfx_pending()) { if (sync) { _game_gfx_commit(NULL); } else { if (!gfx_commit_event) { gfx_commit_event ++; push_user_event(_game_gfx_commit, NULL); } } } } static int game_render_callback_redraw(void); static void anigif_do(void *data) { void *v; img_t img; if (browse_dialog || menu_shown || gfx_fading() || minimized()) return; game_cursor(CURSOR_CLEAR); if (gfx_frame_gif(el_img(el_spic))) { /* scene */ game_render_callback_redraw(); gfx_update_gif(el_img(el_spic), game_update); } game_cursor(CURSOR_CLEAR); for (v = NULL; (img = txt_layout_images(txt_box_layout(el_box(el_scene)), &v)); ) { /* scene */ game_cursor(CURSOR_CLEAR); if ((img != el_img(el_spic)) && gfx_frame_gif(img)) { game_render_callback_redraw(); gfx_update_gif(img, game_update); } } game_cursor(CURSOR_CLEAR); for (v = NULL; (img = txt_layout_images(txt_box_layout(el_box(el_inv)), &v)); ) { /* inv */ game_cursor(CURSOR_CLEAR); if (gfx_frame_gif(img)) { game_render_callback_redraw(); gfx_update_gif(img, game_update); } } game_cursor(CURSOR_CLEAR); for (v = NULL; (img = txt_layout_images(el_layout(el_title), &v)); ) { /* title */ game_cursor(CURSOR_CLEAR); if (gfx_frame_gif(img)) { game_render_callback_redraw(); gfx_update_gif(img, game_update); } } game_cursor(CURSOR_CLEAR); for (v = NULL; (img = txt_layout_images(el_layout(el_ways), &v)); ) { /* ways */ game_cursor(CURSOR_CLEAR); if (gfx_frame_gif(img)) { game_render_callback_redraw(); gfx_update_gif(img, game_update); } } game_cursor(CURSOR_ON); game_flip(); game_gfx_commit(0); } int counter_fn(int interval, void *p) { timer_counter ++; #ifdef SAILFISHOS /* idle response sometimes */ if ((timer_counter % 25) == 0) { push_user_event(NULL, NULL); } #endif if (gfx_is_drawn_gifs() && !DIRECT_MODE) push_user_event(anigif_do, NULL); #ifdef __EMSCRIPTEN__ if (timer_han) { /* emscripten SDL bug? */ gfx_del_timer(timer_han); timer_han = gfx_add_timer(HZ, counter_fn, NULL); } #endif return interval; } static int parse_curtheme(const char *v, void *data) { char **p = ((char **)data); struct theme *theme; theme = theme_lookup(v, THEME_GAME); if (theme) *p = theme->dir; else *p = NULL; return 0; } static struct parser cmd_game_parser[] = { { "theme", parse_curtheme, &curtheme_dir[THEME_GAME], 0 }, }; static int game_cfg_load(void) { char *p = getfilepath(dirname(game_save_path(1, 0)), "config.ini"); curtheme_dir[THEME_GAME] = NULL; if (!p) return -1; parse_ini(p, cmd_game_parser); free(p); return 0; } int game_cfg_save(void) { FILE *fp; char *p; if (!curgame_dir) return 0; if (!curtheme_dir[THEME_GAME]) /* nothing todo */ return 0; p = getfilepath(dirname(game_save_path(1, 0)), "config.ini"); if (!p) return -1; fp = fopen(p, "wb"); if (fp) { if (curtheme_dir[THEME_GAME]) { fprintf(fp, "theme = %s\n", curtheme_dir[THEME_GAME]); } fclose(fp); } free(p); return 0; } int game_use_theme(void) { int rc = 0; game_theme_changed = 0; game_own_theme = 0; game_theme.changed = CHANGED_ALL; memset(objs, 0, sizeof(struct el) * el_max); if (game_default_theme()) { fprintf(stderr, "Can't load default theme.\n"); return -1; } if (themes_count(THEME_GAME) > 0) { /* new scheme with own themes? */ game_own_theme = 2; if (opt_owntheme) { fprintf(stderr, "Using own themes directory...\n"); if (curtheme_dir[THEME_GAME] && strlowcmp(DEFAULT_THEME, curtheme_dir[THEME_GAME])) { rc = game_theme_load(curtheme_dir[THEME_GAME], THEME_GAME); } else curtheme_dir[THEME_GAME] = DEFAULT_THEME; return rc; } } else if (curgame_dir && (!idf_access(instead_idf(), THEME_FILE) || !access(dirpath(THEME_FILE), R_OK))) { game_own_theme = 1; if (opt_owntheme) { fprintf(stderr, "Using own theme file...\n"); theme_relative = 1; rc = theme_load(THEME_FILE); theme_relative = 0; return rc; } } if (curtheme_dir[THEME_GLOBAL] && strlowcmp(DEFAULT_THEME, curtheme_dir[THEME_GLOBAL])) { rc = game_theme_load(curtheme_dir[THEME_GLOBAL], THEME_GLOBAL); } return rc; } int game_init(const char *name) { getdir(game_cwd, sizeof(game_cwd)); unix_path(game_cwd); if (game_select(name)) return -1; if (game_theme_optimize()) return -1; if (game_apply_theme()) { game_theme_select(DEFAULT_THEME); return -1; } timer_han = gfx_add_timer(HZ, counter_fn, NULL); if (!curgame_dir) { game_menu(menu_games); } else { if (!game_load(-1)) /* tmp save */ goto out; if ((opt_autosave & 1) && !game_load(0)) /* autosave */ goto out; game_cmd("look", 0); custom_theme_warn(); if (opt_autosave) game_save(0); } out: return 0; } static void game_release(void) { input_uevents(); /* all callbacks */ if (last_pict) free(last_pict); if (last_title) free(last_title); if (last_cmd) free(last_cmd); last_pict = last_title = last_cmd = NULL; // game_stop_mus(500); // sounds_free(); } void game_release_theme(int force) { int i; mouse_reset(1); game_cursor(CURSOR_OFF); if (el_img(el_spic)) { gfx_free_image(el_img(el_spic)); el_zero(el_spic); } for (i = 0; i < el_max; i++) { struct el *o; if (!force) { switch (i) { case el_title: case el_ways: case el_scene: if (!(game_theme.changed & CHANGED_WIN)) continue; break; case el_inv: if (!(game_theme.changed & CHANGED_INV)) continue; break; default: break; } } o = el(i); if (o->type == elt_layout && o->p.p) { txt_layout_free(o->p.lay); } else if (o->type == elt_box && o->p.p) { txt_layout_free(txt_box_layout(o->p.box)); txt_box_free(o->p.box); } el_zero(i); } if (menu) gfx_free_image(menu); if (menubg) gfx_free_image(menubg); menu = menubg = NULL; _game_update(0, 0, game_theme.w, game_theme.h); } static int game_event(const char *ev); void game_done(int err) { game_event("quit"); if (curgame_dir && !err) { if (opt_autosave) game_save(0); game_cfg_save(); } gfx_del_timer(timer_han); timer_han = NULL_TIMER; if (menu_shown) menu_toggle(-1); game_release(); /* here all lost user callback are */ game_release_theme(1); game_theme_free(); themes_drop(THEME_GAME); input_clear(); instead_done(); curgame_dir = NULL; /* #ifndef ANDROID gfx_video_done(); #endif */ game_own_theme = 0; need_restart = 0; /* SDL_Quit(); */ } static void el_size(int i, int *w, int *h) { int type; type = el(i)->type; if (type == elt_layout) txt_layout_size(el_layout(i), w, h); else if (type == elt_box) txt_box_size(el_box(i), w, h); else if (type == elt_image) { if (w) *w = gfx_img_w(el_img(i)); if (h) *h = gfx_img_h(el_img(i)); } else { /* impossible type */ if (w) *w = 0; if (h) *h = 0; } } #define el_clear(n) _el_clear(n, game_clear) #define el_clear_nobg(n) _el_clear(n, NULL) static int _el_clear(int n, clear_fn clear) { void *v; img_t img; int x, y, w, h; struct el *o; o = el(n); if (!o || !o->drawn) return 0; x = o->x; y = o->y; el_size(n, &w, &h); o->drawn = 0; if (clear) clear(x, y, w, h); if (o->type == elt_box) { for (v = NULL; (img = txt_layout_images(txt_box_layout(el_box(n)), &v)); ) gfx_dispose_gif(img); } else if (o->type == elt_layout) { for (v = NULL; (img = txt_layout_images(el_layout(n), &v)); ) gfx_dispose_gif(img); } else if (o->type == elt_image) gfx_dispose_gif(el_img(n)); return 1; } static void el_update(int n) { int x, y, w, h; struct el *o; o = el(n); /* if (!o->drawn) return; */ x = o->x; y = o->y; el_size(n, &w, &h); game_update(x, y, w, h); return; } static void el_clip(int n) { int x, y, w, h; struct el *o; o = el(n); x = o->x; y = o->y; el_size(n, &w, &h); gfx_clip(x, y, w, h); return; } int box_isscroll_up(int n) { if (el(n)->type != elt_box) return -1; if (txt_box_off(el_box(n))) return 0; return -1; } int box_isscroll_down(int n) { int off; int h, hh; if (el(n)->type != elt_box) return -1; el_size(n, NULL, &h); txt_box_real_size(el_box(n), NULL, &hh); off = txt_box_off(el_box(n)); if (hh - off > h) return 0; return -1; } void box_update_scrollbar(int n) { struct el *elup = NULL; struct el *eldown = NULL; /* struct el *elslide; */ int x1, y1; int x2, y2; int off; int w, h, hh; if (n == el_scene) { elup = el(el_sup); eldown = el(el_sdown); x1 = game_theme.a_up_x; y1 = game_theme.a_up_y; x2 = game_theme.a_down_x; y2 = game_theme.a_down_y; /* elslide = el(el_sslide); */ } else if (n == el_inv) { elup = el(el_iup); eldown = el(el_idown); x1 = game_theme.inv_a_up_x; y1 = game_theme.inv_a_up_y; x2 = game_theme.inv_a_down_x; y2 = game_theme.inv_a_down_y; /* elslide = el(el_islide); */ } else /* impossible case */ return; if (!elup || !eldown) return; /* if (x1 == -1 || y1 == -1 || x2 == -1 || y2 == -1) */ el_size(n, &w, &h); if (x1 == -1) x1 = el(n)->x + w + game_theme.pad; if (y1 == -1) y1 = el(n)->y; if (x2 == -1) x2 = x1; if (y2 == -1) y2 = y1 + h - gfx_img_h(game_theme.a_down); txt_box_real_size(el_box(n), NULL, &hh); off = txt_box_off(el_box(n)); if (el_clear(elup->id)) { if (elup->x != x1 || elup->y != y1) el_update(elup->id); } if (el_clear(eldown->id)) { if (eldown->x != x2 || eldown->y != y2) el_update(eldown->id); } elup->x = x1; elup->y = y1; eldown->x = x2; eldown->y = y2; el_clear(elup->id); el_clear(eldown->id); if (hh - off > h) el_draw(eldown->id); if (off) el_draw(elup->id); el_update(elup->id); el_update(eldown->id); } void el_draw(int n) { int x, y; struct el *o; o = el(n); x = o->x; y = o->y; if (!o->p.p) return; game_gfx_clip(); game_cursor(CURSOR_CLEAR); if (o->type == elt_image) gfx_draw(o->p.img, x, y); else if (o->type == elt_layout) txt_layout_draw(o->p.lay, x, y); else if (o->type == elt_box) { txt_box_draw(o->p.box, x, y); box_update_scrollbar(o->id); } o->drawn = 1; game_gfx_noclip(); return; } img_t game_pict_scale(img_t img, int ww, int hh) { img_t img2 = img; int w, h, www, hhh; float scale1, scale2, scale = 1.0f; game_pic_w = gfx_img_w(img); game_pic_h = gfx_img_h(img); if (!cache_have(gfx_image_cache(), img)) { game_pic_w = (int)((float)game_pic_w / (float)game_theme.scale); game_pic_h = (int)((float)game_pic_h / (float)game_theme.scale); return img; /* do not scale sprites! */ } if (game_theme.scale > 1.0f) theme_img_scale(&img); w = gfx_img_w(img); h = gfx_img_h(img); if (ww == -1) ww = w; if (hh == -1) hh = h; if (w <= ww && h <= hh) return img; www = ww; hhh = hh; while (scale * (float)w > ww || scale * (float)h > hh) { scale1 = (float)(www - 2) / (float)(w); scale2 = (float)(hhh - 2) / (float)(h); scale = (scale1drawn = 0; if (el_layout(el_menu)) { _txt_layout_free(el_layout(el_menu)); lay = el_layout(el_menu); } if (menubg) { game_cursor(CURSOR_CLEAR); gfx_copy(menubg, mx, my); gfx_free_image(menubg); menubg = NULL; } if (menu) { gfx_free_image(menu); menu = NULL; } if (!DIRECT_MODE) { el_clear(el_menu_button); if (!show) el_draw(el_menu_button); } if (!show) { menu_shown = 0; game_cursor(CURSOR_DRAW); gfx_flip(); return 0; } instead_render_callback(); menu_shown = 1; if (!lay) { lay = txt_layout(game_theme.menu_font, ALIGN_CENTER, game_theme.w - 2 * (b + pad), 0); txt_layout_color(lay, game_theme.menu_fg); txt_layout_link_color(lay, game_theme.menu_link); txt_layout_active_color(lay, game_theme.menu_alink); txt_layout_font_height(lay, game_theme.menu_font_height); } else txt_layout_set_size(lay, game_theme.w - 2 * (b + pad), 0); txt_layout_set(lay, (char*)txt); txt_layout_real_size(lay, &w, &h); if (width) w = width; txt_layout_set_size(lay, w, h); txt_layout_set(lay, (char*)txt); menu = gfx_new(w + (b + pad)*2, h + (b + pad)*2); gfx_img_fill(menu, 0, 0, w + (b + pad)*2, h + (b + pad)*2, game_theme.border_col); gfx_img_fill(menu, b, b, w + pad*2, h + pad*2, game_theme.menu_bg); gfx_set_alpha(menu, game_theme.menu_alpha); x = (game_theme.w - w)/2; y = (game_theme.h - h)/2; mx = x - b - pad; my = y - b - pad; mw = w + (b + pad) * 2; mh = h + (b + pad) * 2; game_cursor(CURSOR_CLEAR); menubg = gfx_grab_screen(mx, my, mw, mh); gfx_draw(menu, mx, my); el_set(el_menu, elt_layout, /*game_theme.win_x*/ x, y, lay); el_draw(el_menu); game_cursor(CURSOR_DRAW); gfx_flip(); return 0; } int game_menu_box(int show, const char *txt) { int w = 0, rc; if (show && cur_menu != menu_wait) gfx_cancel_change_screen(); if (show) game_event("pause"); if (cur_menu == menu_games) { /* hack a bit :( */ w = games_menu_maxw(); game_menu_gen(); } else if (cur_menu == menu_themes) { w = themes_menu_maxw(); game_menu_gen(); } rc = game_menu_box_width(show, txt, w); if (!show) { game_event("resume"); } #ifdef __EMSCRIPTEN__ if (!show) cfg_save(); #endif return rc; } int check_new_place(char *title) { int rc = 0; if (!title && !last_title) return 0; if (!title && last_title) { rc = 1; } else if (!last_title || strcmp(title, last_title)) { rc = 1; } if (last_title) { free(last_title); } last_title = title; return rc; } int check_new_pict(char *pict) { int rc = 0; if (!pict && !last_pict) return 0; if (!pict && last_pict) { rc = 1; } else if (!last_pict || strcmp(pict, last_pict)) { rc = 1; } if (last_pict) { free(last_pict); } last_pict = pict; return rc; } static int check_fading(int *new_scene) { int rc; int st; instead_lock(); instead_function("instead.get_fading", NULL); rc = instead_bretval(0); st = instead_iretval(1); if (st < 0) st = 0; else if (st > 255) st = 255; instead_clear(); instead_unlock(); if (new_scene) *new_scene = rc; return st; } static void game_autosave(void) { int b,r; if (!curgame_dir) return; instead_lock(); instead_function("instead.get_autosave", NULL); b = instead_bretval(0); r = instead_iretval(1); instead_clear(); instead_unlock(); if (b) { r = r % MAX_SAVE_SLOTS; game_save(r); /* instead_eval("game.autosave = false;"); instead_clear();*/ } } static void game_instead_restart(void) { int b; if (!curgame_dir) return; instead_lock(); instead_function("instead.get_restart", NULL); b = instead_bretval(0); instead_clear(); instead_unlock(); need_restart = b; } static void game_instead_menu(void) { char *menu; if (!curgame_dir) return; instead_lock(); instead_function("instead.get_menu", NULL); menu = instead_retval(0); instead_clear(); instead_unlock(); if (!menu) return; if (!strcmp(menu, "save")) menu_toggle(menu_save); else if (!strcmp(menu, "load")) menu_toggle(menu_load); else if (!strcmp(menu, "quit") || !strcmp(menu, "exit")) menu_toggle(menu_askquit); else if (!strcmp(menu, "themes")) menu_toggle(menu_themes); else if (!strcmp(menu, "settings")) menu_toggle(menu_settings); else if (!strcmp(menu, "main")) menu_toggle(menu_main); else menu_toggle(-1); free(menu); } static char *get_inv(void) { char *ni; struct instead_args args[] = { { .val = NULL, .type = INSTEAD_BOOL }, { .val = NULL, }, }; args[0].val = (INV_MODE(game_theme.inv_mode) == INV_MODE_HORIZ)?"true":"false"; instead_lock(); instead_function("instead.get_inv", args); ni = instead_retval(0); instead_clear(); instead_unlock(); return ni; } static int find_diff_pos(const char *p1, const char *p2) { int pos = 0; if (!p1 || !p2) return -1; while ((*p1 == *p2) && *p1) { p1 ++; p2 ++; pos ++; } if (!*p1) return -1; return pos; } static void scroll_to_diff(const char *cmdstr, int cur_off, int new_scene) { int off = 0; int pos = 0; int h = 0; int hh = 0; off = txt_layout_anchor(txt_box_layout(el_box(el_scene)), &hh); /* tag? */ if (off == -1) { if (new_scene) return; /* nothing to do */ pos = find_diff_pos(cmdstr, last_cmd); if (pos != -1) off = txt_layout_pos2off(txt_box_layout(el_box(el_scene)), pos, &hh); if (off == -1) off = cur_off; } el_size(el_scene, NULL, &h); if (game_theme.win_scroll_mode == 2 && (cur_off <= off && cur_off + h >= off + hh)) { /* do not scroll */ off = cur_off; } txt_box_scroll(el_box(el_scene), off); } static void scroll_to_last(void) { int w, h; txt_layout_size(txt_box_layout(el_box(el_scene)), &w, &h); txt_box_scroll(el_box(el_scene), h); } int game_highlight(int x, int y, int on); int game_pict_modify(img_t p) { static int modify = 0; int last = modify; game_bg_modify(p); if (p && ((el_img(el_spic) == p) || p == gfx_screen(NULL))) modify = 1; else if (!p) /* use NULL to reset modify flag */ modify = 0; return last; } int game_bg_modify(img_t p) { static int modify = 0; int last = modify; if (p && p == game_theme.bg) modify = 1; else if (!p) /* use NULL to reset modify flag */ modify = 0; return last; } static void game_pict_clip(void) { int x, y, w, h; if (GFX_MODE(game_theme.gfx_mode) == GFX_MODE_EMBEDDED) { el_clip(el_scene); return; } if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_FLOAT) { x = game_theme.win_x; y = game_theme.win_y; w = game_theme.win_w; h = game_theme.win_h; } else { x = game_theme.gfx_x; y = game_theme.gfx_y; w = game_theme.max_scene_w; h = game_theme.max_scene_h; } gfx_clip(x, y, w, h); } void game_gfx_clip(void) { if (game_theme.bg) { gfx_img_clip(game_theme.bg, game_theme.xoff, game_theme.yoff, game_theme.w - 2 * game_theme.xoff, game_theme.h - 2 * game_theme.yoff); } gfx_clip(game_theme.xoff, game_theme.yoff, game_theme.w - 2 * game_theme.xoff, game_theme.h - 2 * game_theme.yoff); } void game_gfx_noclip(void) { if (game_theme.bg) { gfx_img_noclip(game_theme.bg); } gfx_noclip(); } static void game_redraw_pic(void) { int x, y, ox, oy; if (game_pict_coord(&x, &y, NULL, NULL)) return; game_pict_clip(); ox = el(el_spic)->x; oy = el(el_spic)->y; el(el_spic)->x = x; el(el_spic)->y = y; el_clear(el_spic); el_draw(el_spic); gfx_noclip(); el_update(el_spic); el(el_spic)->x = ox; el(el_spic)->y = oy; } static xref_t hl_xref = NULL; static struct el *hl_el = NULL; static struct { img_t offscreen; int flags; int m_restore; } fade_ctx; static void after_click(int flags, int m_restore) { if (DIRECT_MODE) return; #if 1 { int x, y; if (!(flags & GAME_CMD_NOHL) && (!m_restore || mouse_restore())) { gfx_cursor(&x, &y); game_highlight(x, y, 1); /* highlight new scene, to avoid flickering */ } } #endif } extern void instead_ready(void); static void after_cmd(void) { game_autosave(); game_instead_restart(); game_instead_menu(); } static void after_fading(void *aux) { gfx_start_gif(el_img(el_spic)); gfx_free_image(fade_ctx.offscreen); game_render_callback_redraw(); after_click(fade_ctx.flags, fade_ctx.m_restore); after_cmd(); game_cursor(CURSOR_DRAW); game_flip(); } void game_redraw_all(void) { if (menu_shown || DIRECT_MODE) return; game_clear_all(); el_draw(el_title); el_draw(el_ways); if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_EMBEDDED) el_draw(el_spic); el_draw(el_scene); if (inv_enabled()) el_draw(el_inv); el_draw(el_menu_button); game_update(0, 0, game_theme.w, game_theme.h); } static int game_render_callback_redraw(void) { if (instead_render_callback_dirty(0) == -1) { instead_render_callback_dirty(1); /* disable updates */ game_redraw_all(); return 1; } return 0; } int game_cmd(char *cmd, int flags) { int old_off; int fading = 0; int new_pict = 0; int new_place = 0; int redraw_pict = 0; int title_h = 0, ways_h = 0, pict_h = 0; char buf[1024]; char *cmdstr = NULL; char *invstr = NULL; char *waystr = NULL; char *title = NULL; char *pict = NULL; img_t oldscreen = NULL; int dd = (DIRECT_MODE); int rc = 0; int new_scene = 0; int m_restore = 0; int win_spacing; if (menu_shown) return -1; /* if (dd) */ game_cursor(CURSOR_CLEAR); instead_lock(); if (flags & GAME_CMD_FILE) /* file command */ cmdstr = instead_file_cmd(cmd, &rc); else cmdstr = instead_cmd(cmd, &rc); instead_unlock(); instead_ready(); if (opt_click && (flags & GAME_CMD_CLICK) && !rc) sound_play_click(); if (DIRECT_MODE) { if (cmdstr) free(cmdstr); if (game_theme_changed) { /* cursor change only? */ img_t offscreen = gfx_new(game_theme.w, game_theme.h); if (!offscreen) goto fatal; oldscreen = gfx_screen(offscreen); gfx_copy(oldscreen, 0, 0); if ((rc = game_theme_update())) goto out; offscreen = gfx_screen(oldscreen); gfx_change_screen(offscreen, 1, NULL, NULL); gfx_free_image(offscreen); } if (game_pict_modify(NULL)) goto out; return rc; } else if (dd) { /* disable direct mode on the fly */ game_theme_changed = 1; /* force redraw */ game_cursor(CURSOR_DRAW); } if (!cmdstr) { game_render_callback_redraw(); if (game_bg_modify(NULL)) { game_redraw_all(); } else if (game_pict_modify(NULL)) /* redraw pic only */ game_redraw_pic(); if (!rc) { if (hl_el == el(el_inv)) { m_restore = !(flags & GAME_CMD_CLICK); mouse_reset(0); } goto inv; /* hackish? ok, yes it is... */ } if (instead_render_callback_dirty(-1) == 1) { game_cursor(CURSOR_DRAW); game_flip(); } goto err; /* really nothing to do */ } if (game_bg_modify(NULL)) game_theme_changed = 1; /* force redraw */ m_restore = !(flags & GAME_CMD_CLICK); mouse_reset(0); /* redraw all, so, reset mouse */ fading = check_fading(&new_scene); instead_lock(); instead_function("instead.get_title", NULL); title = instead_retval(0); instead_clear(); instead_unlock(); new_place = check_new_place(title); instead_lock(); instead_function("instead.get_picture", NULL); pict = instead_retval(0); instead_clear(); instead_unlock(); unix_path(pict); new_pict = check_new_pict(pict); if (game_theme_changed && !fading) fading = 1; /* one frame at least */ if (fading) { /* take old screen */ game_cursor(CURSOR_CLEAR); img_t offscreen = gfx_new(game_theme.w, game_theme.h); if (!offscreen) goto fatal; oldscreen = gfx_screen(offscreen); gfx_copy(oldscreen, 0, 0); } game_render_callback_redraw(); if (game_theme_changed) { if ((rc = game_theme_update())) goto out; new_place = 1; if (pict) new_pict = 1; } if (new_place) el_clear(el_title); win_spacing = game_theme.font_size * game_theme.font_height / 2; if (title && *title) { snprintf(buf, sizeof(buf), "%s", title); txt_layout_set(el_layout(el_title), buf); txt_layout_size(el_layout(el_title), NULL, &title_h); title_h += win_spacing; } else txt_layout_set(el_layout(el_title), NULL); if (new_pict || fading || game_pict_modify(NULL) || (new_place && (GFX_MODE(game_theme.gfx_mode) == GFX_MODE_FIXED))) { redraw_pict = 1; } game_pict_clip(); if (redraw_pict) { if (el_img(el_spic)) { if (GFX_MODE(game_theme.gfx_mode) == GFX_MODE_EMBEDDED) el_clear_nobg(el_spic); else el_clear(el_spic); if (new_pict) { gfx_free_image(el_img(el_spic)); el(el_spic)->p.p = NULL; if (GFX_MODE(game_theme.gfx_mode) == GFX_MODE_EMBEDDED && !el(el_spic)->p.p) /* clear embedded gfx */ txt_layout_add_img(txt_box_layout(el_box(el_scene)), "scene", NULL); } } } if (pict) { int w, h, x; img_t img; if (new_pict) { img = gfx_load_image(pict); if (!img) game_res_err_msg(pict, debug_sw); if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_FLOAT) img = game_pict_scale(img, game_theme.win_w, game_theme.max_scene_h); else img = game_pict_scale(img, game_theme.max_scene_w, game_theme.max_scene_h); } else img = el_img(el_spic); if (img) { w = gfx_img_w(img); h = gfx_img_h(img); if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_FLOAT) { x = (game_theme.win_w - w)/2 + game_theme.win_x; if (redraw_pict) el_set(el_spic, elt_image, x, game_theme.win_y + title_h, img); } else { int xx, yy; if (GFX_ALIGN(game_theme.gfx_mode) & ALIGN_TOP) yy = 0; else if (GFX_ALIGN(game_theme.gfx_mode) & ALIGN_BOTTOM) yy = game_theme.max_scene_h - h; else yy = (game_theme.max_scene_h - h)/2; if (GFX_ALIGN(game_theme.gfx_mode) & ALIGN_LEFT) xx = 0; else if (GFX_ALIGN(game_theme.gfx_mode) & ALIGN_RIGHT) xx = game_theme.max_scene_w - w; else xx = (game_theme.max_scene_w - w)/2; x = xx + game_theme.gfx_x; if (redraw_pict) el_set(el_spic, elt_image, x, game_theme.gfx_y + yy, img); } pict_h = h; } } gfx_noclip(); /* clear area */ el_clear(el_ways); el_clear(el_scene); instead_lock(); instead_function("instead.get_ways", NULL); waystr = instead_retval(0); instead_clear(); instead_unlock(); if (waystr) { int l = strlen(waystr); if (l && waystr[l - 1] == '\n') waystr[l - 1] = 0; } if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_EMBEDDED) { txt_layout_set(el_layout(el_ways), waystr); txt_layout_size(el_layout(el_ways), NULL, &ways_h); if ((ways_h == 0 || WAYS_BOTTOM) && pict_h != 0) pict_h += win_spacing; } old_off = txt_box_off(el_box(el_scene)); if (GFX_MODE(game_theme.gfx_mode) == GFX_MODE_EMBEDDED) { char *p; pict_h = 0; /* to fake code bellow */ txt_box_resize(el_box(el_scene), game_theme.win_w, game_theme.win_h - title_h - ways_h - pict_h); txt_layout_set(txt_box_layout(el_box(el_scene)), ""); /* hack, to null layout, but not images */ if (el_img(el_spic)) { txt_layout_add_img(txt_box_layout(el_box(el_scene)),"scene", el_img(el_spic)); txt_layout_add(txt_box_layout(el_box(el_scene)), "\n"); } p = malloc(strlen(cmdstr) + ((waystr)?strlen(waystr):0) + 16); if (p) { *p = 0; if (!WAYS_BOTTOM && waystr && *waystr) { strcpy(p, waystr); strcat(p, "\n"); } else if (el_img(el_spic)) strcat(p, "\n"); strcat(p, cmdstr); if (WAYS_BOTTOM && waystr) { strcat(p, "\n"); strcat(p, waystr); } free(cmdstr); cmdstr = p; } else { /* paranoia? Yes... */ txt_layout_add(txt_box_layout(el_box(el_scene)), waystr); txt_layout_add(txt_box_layout(el_box(el_scene)), "\n"); /* small hack */ } txt_layout_add(txt_box_layout(el_box(el_scene)), cmdstr); txt_box_set(el_box(el_scene), txt_box_layout(el_box(el_scene))); } else { if (GFX_MODE(game_theme.gfx_mode) == GFX_MODE_FLOAT) pict_h = 0; txt_box_resize(el_box(el_scene), game_theme.win_w, game_theme.win_h - title_h - ways_h - pict_h); txt_layout_set(txt_box_layout(el_box(el_scene)), cmdstr); txt_box_set(el_box(el_scene), txt_box_layout(el_box(el_scene))); } if (WAYS_BOTTOM) el(el_ways)->y = game_theme.win_h - ways_h + game_theme.win_y; else el(el_ways)->y = el(el_title)->y + title_h + pict_h; if (waystr) free(waystr); if (WAYS_BOTTOM) el(el_scene)->y = el(el_title)->y + title_h + pict_h; else el(el_scene)->y = el(el_ways)->y + ways_h; /* game_clear(game_theme.win_x, game_theme.win_y + pict_h + title_h, game_theme.win_w, game_theme.win_h - pict_h - title_h); */ /* draw title and ways */ if (new_place) el_draw(el_title); if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_EMBEDDED) { el_draw(el_ways); if (redraw_pict) { game_pict_clip(); el_draw(el_spic); gfx_noclip(); } } if (game_theme.win_scroll_mode == 1 || game_theme.win_scroll_mode == 2) { scroll_to_diff(cmdstr, old_off, new_scene); } else if (game_theme.win_scroll_mode == 3) { scroll_to_last(); } FREE(last_cmd); last_cmd = cmdstr; el_draw(el_scene); inv: if (inv_enabled()) { int off; invstr = get_inv(); off = txt_box_off(el_box(el_inv)); txt_layout_set(txt_box_layout(el_box(el_inv)), invstr); txt_box_set(el_box(el_inv), txt_box_layout(el_box(el_inv))); txt_box_scroll(el_box(el_inv), off); if (invstr) free(invstr); el_clear(el_inv); el_draw(el_inv); } if (fading) { img_t offscreen; game_cursor(CURSOR_OFF); gfx_stop_gif(el_img(el_spic)); instead_render_callback(); offscreen = gfx_screen(oldscreen); fade_ctx.offscreen = offscreen; fade_ctx.flags = flags; fade_ctx.m_restore = m_restore; gfx_change_screen(offscreen, fading, after_fading, offscreen); return 0; } after_click(flags, m_restore); out: game_cursor(CURSOR_DRAW); game_flip(); /* input_clear(); */ err: after_cmd(); return rc; fatal: fprintf(stderr, "Fatal error! (can't alloc offscreen)\n"); exit(1); } /* void game_update(int x, int y, int w, int h) { game_cursor(CURSOR_DRAW); gfx_update(x, y, w, h); }*/ void game_xref_update(xref_t xref, int x, int y) { if (instead_render_callback_dirty(-1) == -1) return; game_cursor(CURSOR_CLEAR); xref_update(xref, x, y, game_clear, game_update); } xref_t use_xref = NULL; int disable_use(void) { if (use_xref) { xref_set_active(use_xref, 0); if (xref_layout(use_xref) == txt_box_layout(el_box(el_inv))) game_xref_update(use_xref, el(el_inv)->x, el(el_inv)->y); else game_xref_update(use_xref, el(el_scene)->x, el(el_scene)->y); use_xref = NULL; return 1; } return 0; } void enable_use(xref_t xref) { use_xref = xref; xref_set_active(xref, 1); if (xref_layout(use_xref) == txt_box_layout(el_box(el_inv))) game_xref_update(use_xref, el(el_inv)->x, el(el_inv)->y); else game_xref_update(use_xref, el(el_scene)->x, el(el_scene)->y); } struct el *look_obj(int x, int y) { int i; for (i = 0; i < el_max; i++) { int w, h; if (el(i)->drawn && el(i)->id == el_menu) { return el(i); } if (x < el(i)->x || y < el(i)->y || !el(i)->drawn) continue; el_size(i, &w, &h); if (x >= el(i)->x && y >= el(i)->y && x < el(i)->x + w && y < el(i)->y + h) return el(i); } return NULL; } static xref_t get_nearest_xref(int i, int mx, int my); xref_t look_xref(int x, int y, struct el **elem) { struct el *o; int type; xref_t xref = NULL; o = look_obj(x, y); if (elem) *elem = o; if (!o) return NULL; type = o->type; if (type == elt_layout) xref = txt_layout_xref(o->p.lay, x - o->x, y - o->y); else if (type == elt_box) xref = txt_box_xref(o->p.box, x - o->x, y - o->y); #if defined(ANDROID) || defined(IOS) || defined(SAILFISHOS) || defined(WINRT) if (!xref) { int xc, yc, r; xref = get_nearest_xref(o->id, x, y); if (!xref) return NULL; r = fnt_height(txt_layout_font(xref_layout(xref))) * 2; /* radius is here */ if (!xref_position(xref, &xc, &yc)) { if (o->type == elt_box && yc) yc -= txt_box_off(el_box(o->id)); xc += o->x; yc += o->y; if (((x - xc)*(x - xc) + (y - yc)*(y - yc)) < (r * r)) return xref; } return NULL; } #endif return xref; } static char click_xref[1024]; static struct el *click_el = NULL; static unsigned long click_time = 0; static int click_x = -1; static int click_y = -1; int menu_visible(void) { if (menu_shown) return cur_menu; return 0; } int game_freezed(void) { return browse_dialog || menu_shown || gfx_fading() || minimized(); } int game_paused(void) { return game_freezed() || (use_xref && game_wait_use) || instead_busy(); } void menu_update(struct el *elem) { gfx_copy(menubg, mx, my); gfx_draw(menu, mx, my); txt_layout_draw(elem->p.lay, elem->x, elem->y); gfx_update(mx, my, gfx_img_w(menu), gfx_img_h(menu)); /* gfx_fill(x, y, w, h, game_theme.menu_bg); */ } int game_highlight(int x, int y, int on) { struct el *elem = NULL; xref_t xref = NULL; if (on == 1) { xref = look_xref(x, y, &elem); if (xref && opt_hl && !xref_get_active(xref)) { xref_set_active(xref, 1); game_xref_update(xref, elem->x, elem->y); } } if (hl_xref != xref && hl_el) { if (hl_xref != use_xref && xref_get_active(hl_xref)) { xref_set_active(hl_xref, 0); game_xref_update(hl_xref, hl_el->x, hl_el->y); } } hl_xref = xref; hl_el = elem; return 0; } void mouse_reset(int hl) { if (hl && (menu_shown || !DIRECT_MODE)) { game_highlight(-1, -1, 0); } else hl_xref = hl_el = NULL; disable_use(); motion_mode = 0; click_el = NULL; click_xref[0] = 0; } void menu_toggle(int menu) { int on = menu_shown; mouse_reset(1); on ^= 1; if (!on) cur_menu = menu_main; else if (menu != -1) cur_menu = menu; top_menu = cur_menu; game_menu_box(on, game_menu_gen()); menu_shown = on; } static int scroll_pup(int id) { int hh; if (box_isscroll_up(id)) return -1; el_size(el_scene, NULL, &hh); txt_box_scroll(el_box(id), -hh); el_clear(id); el_draw(id); el_update(id); return 0; } static int scroll_pdown(int id) { int hh; if (box_isscroll_down(id)) return -1; el_size(el_scene, NULL, &hh); txt_box_scroll(el_box(id), hh); el_clear(id); el_draw(id); el_update(id); return 0; } int mouse_filter(int filter) { static unsigned long old_counter = 0; if (!opt_filter || !mouse_filter_delay) return 0; if (filter && (old_counter - timer_counter <= (mouse_filter_delay / HZ))) /* 400 ms */ return -1; old_counter = timer_counter; return 0; } /* action: 0 - first click,1 - second, -1 - restore */ int game_click(int x, int y, int action, int filter) { int menu_mode = 0; int use_mode = 0; int go_mode = 0; struct el *elem = NULL; char buf[1024]; xref_t xref = NULL; char *xref_txt = NULL; xref_t new_xref = NULL; struct el *new_elem = NULL; int was_motion = (motion_mode == 2); if (!action) { click_x = x; click_y = y; motion_y = y; click_time = timer_counter; } else if (action == 1) { click_x = -1; click_y = -1; } if (action) motion_mode = 0; if (action == 1) { char *link; new_xref = look_xref(x, y, &new_elem); link = (new_xref)?xref_get_text(new_xref):""; if (new_elem != click_el || strcmp(link, click_xref)) { click_el = NULL; new_xref = NULL; new_elem = NULL; if (click_xref[0]) { click_xref[0] = 0; return 0; /* just filtered */ } } } if (action == 1) { xref = new_xref; elem = new_elem; click_xref[0] = 0; click_el = NULL; } else { /* just press */ xref = look_xref(x, y, &elem); click_xref[0] = 0; if (xref) { xref_set_active(xref, 1); game_xref_update(xref, elem->x, elem->y); } else if (elem && elem->type == elt_box && opt_motion && (!box_isscroll_up(elem->id) || !box_isscroll_down(elem->id))) { motion_mode = 1; motion_id = elem->id; return 0; } if (xref) { snprintf(click_xref, sizeof(click_xref), "%s", xref_get_text(xref)); click_xref[sizeof(click_xref) - 1] = 0; } click_el = elem; return 0; } /* now look only second press */ if (!xref) { if (elem) { if (elem->id == el_menu_button) { menu_toggle(-1); } else if (elem->id == el_sdown) { scroll_pdown(el_scene); } else if (elem->id == el_sup) { scroll_pup(el_scene); } else if (elem->id == el_idown) { scroll_pdown(el_inv); } else if (elem->id == el_iup) { scroll_pup(el_inv); } else disable_use(); /* el_update(el_inv); */ motion_mode = 0; } else if (!(was_motion && MOTION_TIME)) { disable_use(); /* el_update(el_inv); gfx_flip(); */ } return 0; } /* second xref */ if (elem->id == el_menu) { /* xref_set_active(xref, 0); txt_layout_update_links(elem->p.lay, elem->x, elem->y, game_clear); */ if (game_menu_act(xref_get_text(xref))) { return -1; } /* game_menu_box(menu_shown, game_menu_gen()); gfx_flip(); */ return 1; } xref_txt = xref_get_text(xref); if (!strncmp("act ", xref_get_text(xref), 4)) { menu_mode = 1; xref_txt += 4; } else if (!strncmp("use ", xref_get_text(xref), 4)) { use_mode = 1; xref_txt += 4; } else if (!strncmp("go ", xref_get_text(xref), 3)) { go_mode = 1; /* xref_txt += 3; */ } else if (!strncmp("obj/act ", xref_get_text(xref), 8)) { if (!use_xref) xref_txt += 4; /* act */ else xref_txt += 8; /* obj */ } else if (elem->id == el_inv) { use_mode = 1; } if (!use_xref) { if (use_mode) { enable_use(xref); /* el_update(el_inv); */ return 0; } if (menu_mode) { if (elem->id == el_inv) snprintf(buf, sizeof(buf), "use %s", xref_txt); else snprintf(buf, sizeof(buf), "act %s", xref_txt); } else snprintf(buf, sizeof(buf), "%s", xref_txt); if (mouse_filter(filter)) return 0; buf[sizeof(buf) - 1] = 0; game_cmd(buf, GAME_CMD_CLICK); return 1; } if (menu_mode || go_mode || elem->id == el_title) return 0; if (use_xref == xref) snprintf(buf,sizeof(buf), "use %s", xref_txt); else { if (!strncmp("use ", xref_get_text(use_xref), 4)) /* already use */ snprintf(buf,sizeof(buf), "%s,%s", xref_get_text(use_xref), xref_txt); else snprintf(buf,sizeof(buf), "use %s,%s", xref_get_text(use_xref), xref_txt); } if (mouse_filter(filter)) return 0; disable_use(); buf[sizeof(buf) - 1] = 0; game_cmd(buf, GAME_CMD_CLICK); return 1; } int mouse_restore(void) { if (click_x == -1 || click_y == -1) return -1; game_click(click_x, click_y, -1, 0); return 0; } int game_cursor_show = 1; void game_cursor(int on) { static img_t grab = NULL; static img_t cur = NULL; static int xc = 0, yc = 0, w = 0, h = 0; /*, w, h; */ int xx, yy, ww, hh; gfx_getclip(&xx, &yy, &ww, &hh); gfx_noclip(); if (on == CURSOR_OFF) cur = NULL; if (grab) { gfx_copy(grab, xc, yc); gfx_free_image(grab); grab = NULL; } if (on == CURSOR_OFF) { _game_update(xc, yc, w, h); goto out; } if (on == CURSOR_CLEAR) goto out; if (on != CURSOR_DRAW) cur = (use_xref) ? game_theme.use:game_theme.cursor; if (!cur) goto out; do { int ox = xc; int oy = yc; int ow = w; int oh = h; if (on != CURSOR_DRAW) { gfx_cursor(&xc, &yc); xc -= game_theme.cur_x; yc -= game_theme.cur_y; } w = gfx_img_w(cur); h = gfx_img_h(cur); grab = gfx_grab_screen(xc, yc, w, h); if (!nocursor_sw && mouse_focus() && (game_cursor_show || menu_shown)) gfx_draw(cur, xc, yc); if (on != CURSOR_DRAW) { _game_update(xc, yc, w, h); _game_update(ox, oy, ow, oh); } } while (0); out: gfx_clip(xx, yy, ww, hh); return; } static void scroll_up(int id, int count) { /* int i; */ if (box_isscroll_up(id)) return; txt_box_scroll(el_box(id), -(FONT_SZ(game_theme.font_size)) * count); el_clear(id); el_draw(id); el_update(id); } static void scroll_down(int id, int count) { /* int i; */ if (box_isscroll_down(id)) return; txt_box_scroll(el_box(id), (FONT_SZ(game_theme.font_size)) * count); el_clear(id); el_draw(id); el_update(id); } static int scroll_possible(int id, int off) { if (!off || (off > 0 && box_isscroll_down(id)) || (off < 0 && box_isscroll_up(id))) return -1; return 0; } static void scroll_motion(int id, int off) { if (scroll_possible(id, off)) return; game_highlight(-1, -1, 0); txt_box_scroll(el_box(id), off); el_clear(id); el_draw(id); el_update(id); } static int sel_el = 0; static void frame_next(void) { if (sel_el == el_scene && !inv_enabled()) sel_el = el_inv; switch(sel_el) { default: case 0: sel_el = el_scene; break; case el_ways: sel_el = el_scene; break; case el_scene: sel_el = el_inv; break; case el_inv: if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_EMBEDDED && txt_layout_xrefs(el_layout(el_ways))) sel_el = el_ways; else sel_el = el_scene; break; } } static void frame_prev(void) { switch(sel_el) { default: case 0: sel_el = el_inv; break; case el_title: sel_el = el_inv; break; case el_ways: sel_el = el_inv; break; case el_scene: if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_EMBEDDED && txt_layout_xrefs(el_layout(el_ways))) sel_el = el_ways; else sel_el = el_inv; break; case el_inv: sel_el = el_scene; break; } if (sel_el == el_inv && !inv_enabled()) sel_el = el_scene; } static int select_ref(int prev, int last); static xref_t get_xref(int i, int last); static void xref_jump(xref_t xref, struct el* elem); static void select_frame(int prev) { struct el *elem = NULL; int x, y, w, h; gfx_cursor(&x, &y); elem = look_obj(x, y); if (elem) sel_el = elem->id; el(sel_el)->mx = x; el(sel_el)->my = y; if (menu_shown) { sel_el = el_menu; } else { /* int old_sel; if (!sel_el) frame_next(); old_sel = sel_el; do { */ if (prev) { frame_prev(); } else { frame_next(); } /* } while (!get_xref(sel_el, 0) && sel_el != old_sel); */ } el_size(sel_el, &w, &h); x = el(sel_el)->mx; y = el(sel_el)->my; if (x < el(sel_el)->x || y < el(sel_el)->y || x > el(sel_el)->x + w || y > el(sel_el)->y + h) { x = el(sel_el)->x + w / 2; y = el(sel_el)->y + h / 2; } gfx_warp_cursor(x, y); if (!look_xref(x, y, &elem) && elem) { xref_t xref = get_nearest_xref(elem->id, x, y); xref_jump(xref, elem); } } static int xref_rel_position(xref_t xref, struct el *elem, int *x, int *y) { int rc = xref_position(xref, x, y); if (!rc && elem->type == elt_box && y) { *y -= txt_box_off(el_box(elem->id)); } return rc; } static int xref_visible(xref_t xref, struct el *elem) { int x, y, w, h; if (!elem || !xref) return -1; if (xref_rel_position(xref, elem, &x, &y)) return -1; el_size(elem->id, &w, &h); if (y < 0 || y >= h) return -1; return 0; } static xref_t get_nearest_xref(int i, int mx, int my) { xref_t xref = NULL; xref_t min_xref = NULL; int min_disp = game_theme.h * game_theme.h + game_theme.w * game_theme.w; if (!i) return NULL; for (xref = get_xref(i, 0); !xref_visible(xref, el(i)); xref = xref_next(xref)) { int x, y, disp; if (xref_rel_position(xref, el(i), &x, &y)) continue; disp = (x + el(i)->x - mx) * (x + el(i)->x - mx) + (y + el(i)->y - my) * (y + el(i)->y - my); if (disp < min_disp) { min_disp = disp; min_xref = xref; } } return min_xref; } static xref_t get_xref(int i, int last) { xref_t xref = NULL; int type; type = el(i)->type; if (type == elt_layout) { xref = txt_layout_xrefs(el_layout(i)); while (last && xref && xref_next(xref)) xref = xref_next(xref); } else if (type == elt_box) { xref = txt_box_xrefs(el_box(i)); while (!last && xref && !xref_visible(xref_prev(xref), el(i))) /* try find visible one */ xref = xref_prev(xref); while (last && xref && !xref_visible(xref_next(xref), el(i))) xref = xref_next(xref); } return xref; } static void xref_jump(xref_t xref, struct el* elem) { int x, y; if (!elem || !xref || xref_visible(xref, elem) || xref_rel_position(xref, elem, &x, &y)) return; gfx_warp_cursor(elem->x + x, elem->y + y); } static int select_ref(int prev, int last) { int x, y; struct el *elem = NULL; xref_t xref = NULL; gfx_cursor(&x, &y); xref = look_xref(x, y, &elem); if (!elem) { if (!sel_el) select_frame(0); elem = el(sel_el); } if (last) { if (!(xref = get_xref(elem->id, !prev))) return -1; } else if (xref) { if (prev) { do { xref = xref_prev(xref); } while (xref && xref_valid(xref)); if (!xref || xref_visible(xref, elem)) { if (!box_isscroll_up(elem->id) || !box_isscroll_down(elem->id)) return -1; else xref = get_xref(elem->id, 1); } } else { do { xref = xref_next(xref); } while (xref && xref_valid(xref)); if (!xref || xref_visible(xref, elem)) { if (!box_isscroll_down(elem->id) || !box_isscroll_up(elem->id)) return -1; else xref = get_xref(elem->id, 0); } } } if (!xref) xref = get_nearest_xref(elem->id, x, y); if (!xref) return -1; xref_jump(xref, elem); return 0; } static void game_scroll_up(int count) { int xm, ym; struct el *o; gfx_cursor(&xm, &ym); o = look_obj(xm, ym); if (o && (o->id == el_scene || o->id == el_inv)) { scroll_up(o->id, count); } } static void game_scroll_down(int count) { int xm, ym; struct el *o; gfx_cursor(&xm, &ym); o = look_obj(xm, ym); if (o && (o->id == el_scene || o->id == el_inv)) { scroll_down(o->id, count); } } static int game_scroll_pup(void) { int xm, ym; struct el *o; gfx_cursor(&xm, &ym); o = look_obj(xm, ym); if (o && (o->id == el_scene || o->id == el_inv)) { return scroll_pup(o->id); } return -1; } static int game_scroll_pdown(void) { int xm, ym; struct el *o; gfx_cursor(&xm, &ym); o = look_obj(xm, ym); if (o && (o->id == el_scene || o->id == el_inv)) { return scroll_pdown(o->id); } return -1; } static int is_key(struct inp_event *ev, const char *name) { return strcmp(ev->sym, name); } int game_pict_coord(int *x, int *y, int *w, int *h) { img_t img; int ww, hh; int xx, yy; word_t word; img = el_img(el_spic); if (!img) return -1; if (GFX_MODE(game_theme.gfx_mode) != GFX_MODE_EMBEDDED) { xx = el(el_spic)->x; yy = el(el_spic)->y; ww = gfx_img_w(img); hh = gfx_img_h(img); goto out; } el_size(el_scene, &ww, &hh); for (word = NULL; (word = txt_layout_words(txt_box_layout(el_box(el_scene)), word)); ) { /* scene */ if (word_image(word) != img) { word = NULL; /* first word is always pic */ break; /* continue; */ } word_geom(word, &xx, &yy, &ww, &hh); yy -= txt_box_off(el_box(el_scene)); xx += el(el_scene)->x; yy += el(el_scene)->y; break; } if (!word) return -1; out: if (x) *x = xx; if (y) *y = yy; if (w) *w = ww; if (h) *h = hh; return 0; } static int game_pic_click(int x, int y, int *ox, int *oy) { int xx, yy, ww, hh; if (game_pict_coord(&xx, &yy, &ww, &hh)) return -1; if (x >= xx && y >= yy && x < (xx + ww) && y < (yy + hh)) { *ox = x - xx; *oy = y - yy; if (ww) *ox = (int)((float)(*ox) * (float)game_pic_w / (float)ww); else *ox = 0; if (hh) *oy = (int)((float)(*oy) * (float)game_pic_h / (float)hh); else *oy = 0; return 0; } return -1; } static int game_bg_click(int mb, int x, int y, int *ox, int *oy) { struct el *o = NULL; struct game_theme *t = &game_theme; int bg = 1; if (x < t->xoff || y < t->yoff || x >= (t->w - t->xoff) || y >= (t->h - t->yoff)) bg = 0; else o = look_obj(x, y); *ox = (int)((float)(x - t->xoff) / (float)t->scale); *oy = (int)((float)(y - t->yoff) / (float)t->scale); if (!game_grab_events && ((o && (o->id == el_sup || o->id == el_sdown || o->id == el_iup || o->id == el_idown || o->id == el_menu_button)) || look_xref(x, y, NULL))) return -1; /* ask Odyssey for that ;) */ if (bg || mb == EV_CODE_FINGER) /* fingers area may be larger */ return 0; return -1; } static int game_event(const char *ev) { char *p; int rc; struct instead_args args[8]; if (!curgame_dir) return -1; if (game_paused()) return -1; args[0].val = "event"; args[0].type = INSTEAD_STR; args[1].val = ev; args[1].type = INSTEAD_STR; args[2].val = NULL; instead_lock(); if (instead_function("iface:input", args)) { instead_clear(); instead_unlock(); return -1; } p = instead_retval(0); instead_clear(); instead_unlock(); if (!p) return -1; rc = game_cmd(p, GAME_CMD_NOHL); free(p); return (rc)?-1:0; } static int game_input(int down, const char *key, int x, int y, int mb) { char *p; struct instead_args args[8]; int rc = 0; char tx[16]; char ty[16]; char tpx[16]; char tpy[16]; char tmb[16]; if (game_paused()) return -1; if (mb == EV_CODE_KBD) { const char *k; args[0].val = "kbd"; args[0].type = INSTEAD_STR; args[1].val = (down)?"true":"false"; args[1].type = INSTEAD_BOOL; k = (key)?key:"unknown"; args[2].val = (char*)k; args[2].type = INSTEAD_STR; args[3].val = NULL; } else { const char *k; int px = -1; int py = -1; game_pic_click(x, y, &px, &py); /* got picture coord */ if (game_bg_click(mb, x, y, &x, &y)) { /* no click on bg */ return -1; } snprintf(tx, sizeof(tx), "%d", x); snprintf(ty, sizeof(ty), "%d", y); snprintf(tmb, sizeof(tmb), "%d", mb); if (mb == EV_CODE_FINGER) { args[0].val = "finger"; args[0].type = INSTEAD_STR; } else { args[0].val = "mouse"; args[0].type = INSTEAD_STR; } args[1].val = (down)?"true":"false"; args[1].type = INSTEAD_BOOL; if (mb == EV_CODE_FINGER) { k = (key)?key:"unknown"; args[2].val = k; args[2].type = INSTEAD_STR; } else { args[2].val = tmb; args[2].type = INSTEAD_NUM; } args[3].val = tx; args[3].type = INSTEAD_NUM; args[4].val = ty; args[4].type = INSTEAD_NUM; args[5].val = NULL; if (px != -1) { snprintf(tpx, sizeof(tpx), "%d", px); snprintf(tpy, sizeof(tpy), "%d", py); args[5].val = tpx; args[5].type = INSTEAD_NUM; args[6].val = tpy; args[6].type = INSTEAD_NUM; args[7].val = NULL; } } instead_lock(); if (instead_function("iface:input", args)) { instead_clear(); instead_unlock(); return -1; } p = instead_retval(0); instead_clear(); instead_unlock(); if (!p) { return -1; } rc = game_cmd(p, (mb != -1)?GAME_CMD_CLICK:0); free(p); return (rc)?-1:0; } extern char zip_game_dirname[]; extern int unpack(const char *zipfilename, const char *dirname); #ifdef _USE_BROWSE int game_from_disk(void) { int i = 0; char *g, *p, *b, *d; char dir[PATH_MAX]; char base[PATH_MAX]; #ifndef MAEMO #ifndef S60 if (opt_fs) { int old_menu = (menu_shown) ? cur_menu: -1; opt_fs ^= 1; game_restart(); if (old_menu != -1) game_menu(old_menu); } #endif #endif mouse_cursor(1); game_cursor(CURSOR_OFF); browse_dialog = 1; getdir(dir, sizeof(dir)); #ifdef LC_MESSAGES setlocale(LC_MESSAGES, ""); #endif g = p = open_file_dialog(); #ifdef LC_MESSAGES setlocale(LC_MESSAGES, "C"); #endif setdir(dir); /* dir can be changed */ browse_dialog = 0; game_cursor(CURSOR_ON); mouse_cursor(0); gfx_flip(); if (!p) return -1; game_done(0); strcpy(dir, p); strcpy(base, p); d = dir; b = base; i = strlen(d); if (i && d[i - 1] != '/') { /* file */ if (!idf_magic(d)) { d = dirname(d); strcpy(b, d); } } d = dirname(d); b = basename(b); #ifdef _USE_UNPACK p = games_sw ? games_sw:game_local_games_path(1); fprintf(stderr,"Trying to install: %s\n", g); if (!unpack(g, p)) { if (!zip_game_dirname[0]) goto err; if (games_replace(p, zip_game_dirname)) goto clean; p = zip_game_dirname; } else if (zip_game_dirname[0]) { /* error, needs to clean */ goto clean; #else if (0) { #endif } else if (games_replace(d, b)) { goto err; } else p = b; if (game_init(p)) { game_error(); } return 0; #ifdef _USE_UNPACK clean: p = getpath(p, zip_game_dirname); fprintf(stderr, "Cleaning: '%s'...\n", p); remove_dir(p); free(p); err: game_error(); return -1; #endif } #endif static int game_input_events(struct inp_event *ev) { if (!curgame_dir) return 0; if (ev->type == KEY_DOWN || ev->type == KEY_UP) { if (!game_input((ev->type == KEY_DOWN), ev->sym, -1, -1, EV_CODE_KBD)) return 1; } if (ev->type == FINGER_DOWN || ev->type == FINGER_UP) { if (!game_input((ev->type == FINGER_DOWN), ev->sym, ev->x, ev->y, EV_CODE_FINGER)) return 1; } if (ev->type == MOUSE_DOWN || ev->type == MOUSE_UP) { if (!game_input((ev->type == MOUSE_DOWN), "mouse", ev->x, ev->y, ev->code)) return 1; } return 0; } static int alt_pressed = 0; static int shift_pressed = 0; static int control_pressed = 0; static int kbd_modifiers(struct inp_event *ev) { if (ev->type != KEY_DOWN && ev->type != KEY_UP) return 0; if (!is_key(ev, "left alt") || !is_key(ev, "right alt")) { alt_pressed = (ev->type == KEY_DOWN); return 1; } else if (!is_key(ev, "left shift") || !is_key(ev, "right shift")) { shift_pressed = (ev->type == KEY_DOWN); return 1; } else if (!is_key(ev, "left ctrl") || !is_key(ev, "right ctrl")) { control_pressed = (ev->type == KEY_DOWN); return 1; } return 0; } static int is_key_back(struct inp_event *ev) { if (!is_key(ev, "escape") #if defined(S60) || defined(_WIN32_WCE) || defined(WINRT) || !is_key(ev, "space") #endif #if defined(_WIN32_WCE) || defined(WINRT) || (ev->code >= 0xc0 && ev->code <= 0xcf) || !is_key(ev, "f1") || !is_key(ev, "f2") || !is_key(ev, "f3") || !is_key(ev, "f4") || !is_key(ev, "f5") #endif #ifdef ANDROID || ev->code == 118 #endif ) return 0; return -1; } static int kbd_instead(struct inp_event *ev, int *x, int *y) { if (ev->type != KEY_DOWN) return 0; if (!is_key_back(ev)) { if (use_xref) disable_use(); else menu_toggle(-1); } else if (!is_key(ev, "f1")) { if (!menu_shown) menu_toggle(-1); } else if (!is_key(ev, "f2") && curgame_dir) { game_menu(menu_save); } else if (!is_key(ev, "f3") && curgame_dir) { game_menu(menu_load); } else if (!is_key(ev, "f8") && curgame_dir && !menu_shown) { if (game_saves_enabled()) game_save(9); } else if (!is_key(ev, "f9") && curgame_dir && !menu_shown) { if (game_saves_enabled()) { if (!access(game_save_path(0, 9), R_OK)) { if (!game_reset()) game_load(9); } } } else if (!is_key(ev, "f5") && curgame_dir && !menu_shown) { mouse_reset(1); game_cmd("look", 0); } else if ((alt_pressed || control_pressed) && !is_key(ev, "r") && curgame_dir && !menu_shown && debug_sw) { mouse_reset(1); game_menu_act("/new"); shift_pressed = alt_pressed = control_pressed = 0; } else if (!is_key(ev, "f10") #ifdef ANDROID || ev->code == 270 #endif ) { #ifdef ANDROID return -1; #else game_menu(menu_askquit); #endif } else if ((alt_pressed | control_pressed) && (!is_key(ev, "q") || !is_key(ev, "f4"))) { game_running = 0; return -1; } else if (alt_pressed && (!is_key(ev, "enter") || !is_key(ev, "return"))) { int old_menu = (menu_shown) ? cur_menu: -1; shift_pressed = alt_pressed = control_pressed = 0; opt_fs ^= 1; game_restart(); if (old_menu != -1) game_menu(old_menu); } else if (!is_key(ev, "f4") && !alt_pressed && !standalone_sw) { #ifdef _USE_UNPACK #ifdef _USE_BROWSE mouse_reset(1); if (!game_from_disk()) { shift_pressed = alt_pressed = control_pressed = 0; } #endif #endif } else if (DIRECT_MODE && !menu_shown) { ; /* nothing todo */ } else if (!alt_pressed && (!is_key(ev, "return") || !is_key(ev, "enter") #ifdef S60 || !is_key(ev, ".") #endif )) { gfx_cursor(x, y); game_highlight(-1, -1, 0); /* reset */ game_click(*x, *y, 0, 0); game_highlight(*x, *y, 1); /* hl on/off */ game_highlight(*x, *y, 0); if (game_click(*x, *y, 1, 0) == -1) { game_running = 0; return -1; } } else if (!is_key(ev, "tab")) { select_frame(shift_pressed); } else if (!is_key(ev, "up") || !is_key(ev, "down") || !is_key(ev, "[8]") || !is_key(ev, "[2]")) { int lm; int prev = !is_key(ev, "up") || !is_key(ev, "[8]"); if (opt_kbd == KBD_INVERSE) lm = (alt_pressed || shift_pressed); else lm = (!alt_pressed && !shift_pressed); if (menu_shown || lm) { if (select_ref(prev, 0)) { if (opt_kbd == KBD_SMART) { (prev)?game_scroll_up(1):game_scroll_down(1); select_ref(prev, 1); } else select_ref(prev, 1); } } else (prev)?game_scroll_up(1):game_scroll_down(1); } else if (!is_key(ev, "page up") || !is_key(ev, "[9]") || !is_key(ev, "page down") || !is_key(ev, "[3]")) { int lm; int prev = !is_key(ev, "page up") || !is_key(ev, "[9]"); if (opt_kbd == KBD_INVERSE) lm = (alt_pressed || shift_pressed); else lm = (!alt_pressed && !shift_pressed); if (menu_shown || lm) { if (select_ref(prev, 0) || select_ref(prev, 1)) { if (opt_kbd == KBD_SMART) { int s = (prev)?game_scroll_pup():game_scroll_pdown(); if (!s) select_ref(!prev, 1); } else select_ref(prev, 0); } } else { if (prev) game_scroll_pup(); else game_scroll_pdown(); } #if !defined(S60) && !defined(_WIN32_WCE) && !defined(WINRT) } else if (!is_key(ev, "left") || !is_key(ev, "[4]")) { select_ref(1, 0); } else if (!is_key(ev, "right") || !is_key(ev, "[6]")) { select_ref(0, 0); } else if (!is_key(ev, "backspace") && !menu_shown) { scroll_pup(el_scene); } else if (!is_key(ev, "space") && !menu_shown) { scroll_pdown(el_scene); #else } else if (!is_key(ev, "left") || !is_key(ev, "[4]")) { if (menu_shown) select_ref(1, 0); else select_frame(1); } else if (!is_key(ev, "right") || !is_key(ev, "[6]")) { if (menu_shown) select_ref(0, 0); else select_frame(0); #endif } else return 0; return 1; } static int mouse_instead(struct inp_event *ev, int *x, int *y) { if (ev->type == MOUSE_DOWN) { if (ev->code != 1) disable_use(); else { game_highlight(-1, -1, 0); game_click(ev->x, ev->y, 0, 1); *x = ev->x; *y = ev->y; } } else if (ev->type == MOUSE_UP && ev->code == 1) { game_highlight(-1, -1, 0); if (game_click(ev->x, ev->y, 1, 1) == -1) return -1; } else if (ev->type == MOUSE_WHEEL_UP && !menu_shown) { game_scroll_up(ev->count); } else if (ev->type == MOUSE_WHEEL_DOWN && !menu_shown) { game_scroll_down(ev->count); } else if (ev->type == MOUSE_MOTION) { if (opt_motion && !motion_mode && click_el && MOTION_TIME && !scroll_possible(click_el->id, click_y - ev->y)) { motion_id = click_el->id; motion_y = click_y; motion_mode = 1; click_el = NULL; click_xref[0] = 0; } if (motion_mode) { motion_mode = 2; scroll_motion(motion_id, motion_y - ev->y); motion_y = ev->y; } /* game_highlight(ev.x, ev.y, 1); */ } return 0; } static __inline int game_cycle(void) { static int x = 0, y = 0, rc; struct inp_event ev; ev.x = -1; /* game_cursor(CURSOR_CLEAR); */ /* release bg */ if (((rc = input(&ev, 1)) == AGAIN) && !need_restart) { game_gfx_commit(1); return rc; } if (!rc || gfx_fading()) /* just skip */ return 0; if (rc == -1) {/* close */ goto out; } else if (game_input_events(&ev)) { /* kbd, mouse and touch -> pass in game */ ; /* all is done in game_input */ } else if (kbd_modifiers(&ev)) { /* ctrl, alt, shift */ ; /* got modifiers */ } else if ((rc = kbd_instead(&ev, &x, &y))) { /* ui keys */ if (rc < 0) goto out; } else if (DIRECT_MODE && !menu_shown) { ; /* nothing todo */ } else if ((rc = mouse_instead(&ev, &x, &y)) < 0) { /* ui mouse */ goto out; } if (gfx_fading()) /* just fading */ return 0; game_render_callback_redraw(); if (need_restart) { need_restart = 0; game_menu_act("/new"); } if ((!DIRECT_MODE || menu_shown)) { if (click_xref[0]) { game_highlight(x, y, 1); } else if (!motion_mode) { int x, y; gfx_cursor(&x, &y); game_highlight(x, y, 1); } } game_cursor(CURSOR_ON); if (instead_err()) { game_menu(menu_warning); } rc = 0; out: game_flip(); game_gfx_commit(rc < 0); if (rc < 0) game_render_callback_redraw(); return rc; } #ifdef __EMSCRIPTEN__ static void game_void_cycle(void) { int rc; while ((rc = game_cycle()) == AGAIN); if (rc < 0) { cfg_save(); if (curgame_dir) game_done(0); gfx_clear(0, 0, game_theme.w, game_theme.h); gfx_flip(); gfx_commit(); emscripten_cancel_main_loop(); emscripten_force_exit(1); } } #endif int game_loop(void) { #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(game_void_cycle, 0, 0); return -1; #else while (game_running) { if (game_cycle() < 0) { break; } } #endif return 0; } extern int instead_bits_init(void); extern int instead_timer_init(void); extern int instead_sprites_init(void); extern int instead_sound_init(void); extern int instead_paths_init(void); int game_instead_extensions(void) { instead_bits_init(); instead_timer_init(); instead_sprites_init(); instead_sound_init(); instead_paths_init(); return 0; } instead-3.2.1/src/sound.h0000644000175000017500000000225213267071774014273 0ustar peterpeter#ifndef __SOUND_H__ #define __SOUND_H__ typedef void* wav_t; typedef struct _mus_t *mus_t; #define DEFAULT_CHUNKSIZE 1024 /* extern mus_t snd_load_mus(const char *path); */ extern void snd_free_mus(mus_t mus); extern int snd_open(int hz); extern int snd_init(int hz); extern int snd_hz(void); extern int snd_play(wav_t chunk, int channel, int loop); extern void snd_halt_chan(int han, int ms); extern void snd_free_wav(wav_t chunk); extern wav_t snd_load_wav(const char *fname); #define SND_FMT_STEREO 1 #define SND_FMT_44 2 #define SND_FMT_22 4 #define SND_FMT_11 8 extern wav_t snd_load_mem(int fmt, const short *buf, size_t len); extern int snd_play_mus(char *music, int ms, int loop); extern void snd_mus_callback(void (*fn)(void *udata, unsigned char *stream, int len), void *arg); extern int snd_playing_mus(); extern void snd_stop_mus(int ms); extern int snd_volume_mus(int vol); extern void snd_done(void); extern void snd_close(void); extern int snd_vol_from_pcn(int v); extern int snd_vol_to_pcn(int v); extern int snd_playing(int channel); extern void snd_pause(int on); extern int snd_panning(int channel, int left, int right); extern int snd_enabled(void); #endif instead-3.2.1/src/ioapi.h0000644000175000017500000001555713267071774014260 0ustar peterpeter/* ioapi.h -- IO base function header for compress/uncompress .zip part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) Modifications for Zip64 support Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) For more info read MiniZip_info.txt Changes Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. More if/def section may be needed to support other platforms Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. (but you should use iowin32.c for windows instead) */ #ifndef _ZLIBIOAPI64_H #define _ZLIBIOAPI64_H /* we need no > 2Gb games */ #define USE_FILE32API #if (!defined(_WIN32)) && (!defined(WIN32)) /* Linux needs this to support file operation on files larger then 4+GB But might need better if/def to select just the platforms that needs them. */ #ifndef __USE_FILE_OFFSET64 #define __USE_FILE_OFFSET64 #endif #ifndef __USE_LARGEFILE64 #define __USE_LARGEFILE64 #endif #ifndef _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE #endif #ifndef _FILE_OFFSET_BIT #define _FILE_OFFSET_BIT 64 #endif #endif #include #include #include "zlib.h" #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif #if defined(USE_FILE32API) #define fopen64 fopen #define ftello64 ftell #define fseeko64 fseek #else #ifdef _MSC_VER #define fopen64 fopen #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) #define ftello64 _ftelli64 #define fseeko64 _fseeki64 #else // old MSC #define ftello64 ftell #define fseeko64 fseek #endif #endif #endif /* #ifndef ZPOS64_T #ifdef _WIN32 #define ZPOS64_T fpos_t #else #include #define ZPOS64_T uint64_t #endif #endif */ #ifdef HAVE_MINIZIP64_CONF_H #include "mz64conf.h" #endif /* a type choosen by DEFINE */ #ifdef HAVE_64BIT_INT_CUSTOM typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; #else #ifdef HAS_STDINT_H #include "stdint.h" typedef uint64_t ZPOS64_T; #else #if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 ZPOS64_T; #else typedef unsigned long long int ZPOS64_T; #endif #endif #endif #ifdef __cplusplus extern "C" { #endif #define ZLIB_FILEFUNC_SEEK_CUR (1) #define ZLIB_FILEFUNC_SEEK_END (2) #define ZLIB_FILEFUNC_SEEK_SET (0) #define ZLIB_FILEFUNC_MODE_READ (1) #define ZLIB_FILEFUNC_MODE_WRITE (2) #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) #define ZLIB_FILEFUNC_MODE_EXISTING (4) #define ZLIB_FILEFUNC_MODE_CREATE (8) #ifndef ZCALLBACK #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #define ZCALLBACK CALLBACK #else #define ZCALLBACK #endif #endif typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); /* here is the "old" 32 bits structure structure */ typedef struct zlib_filefunc_def_s { open_file_func zopen_file; read_file_func zread_file; write_file_func zwrite_file; tell_file_func ztell_file; seek_file_func zseek_file; close_file_func zclose_file; testerror_file_func zerror_file; voidpf opaque; } zlib_filefunc_def; typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); typedef struct zlib_filefunc64_def_s { open64_file_func zopen64_file; read_file_func zread_file; write_file_func zwrite_file; tell64_file_func ztell64_file; seek64_file_func zseek64_file; close_file_func zclose_file; testerror_file_func zerror_file; voidpf opaque; } zlib_filefunc64_def; void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); /* now internal definition, only for zip.c and unzip.h */ typedef struct zlib_filefunc64_32_def_s { zlib_filefunc64_def zfile_func64; open_file_func zopen32_file; tell_file_func ztell32_file; seek_file_func zseek32_file; } zlib_filefunc64_32_def; #define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) #define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) /* #define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) #define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) */ #define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) #define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); #define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) #define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) #define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) #ifdef __cplusplus } #endif #endif instead-3.2.1/src/instead_timer.c0000644000175000017500000000575213267071774015775 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" /* the Lua interpreter */ static gtimer_t instead_timer = NULL_TIMER; static int volatile instead_timer_nr = 0; static int instead_fn(int interval, void *p); static void instead_timer_do(void *data) { char *p; instead_timer_nr = 0; instead_lock(); if (game_paused() || !curgame_dir) { instead_unlock(); return; } if (instead_function("stead.timer", NULL)) { instead_clear(); instead_unlock(); return; } p = instead_retval(0); instead_clear(); instead_unlock(); if (!p) return; game_cmd(p, 0); free(p); game_cursor(CURSOR_ON); } static int instead_fn(int interval, void *p) { #ifdef __EMSCRIPTEN__ /* bug in emscripten SDL timer? */ if (instead_timer) { gfx_del_timer(instead_timer); instead_timer = gfx_add_timer(interval, instead_fn, NULL); } #endif if (instead_timer_nr > 0) { return interval; /* framedrop */ } instead_timer_nr ++; push_user_event(instead_timer_do, NULL); return interval; } static int luaB_set_timer(lua_State *L) { const char *delay = luaL_optstring(L, 1, NULL); int d; gfx_del_timer(instead_timer); instead_timer = NULL_TIMER; if (!delay) d = 0; else d = atoi(delay); if (!d) return 0; instead_timer_nr = 0; instead_timer = gfx_add_timer(d, instead_fn, NULL); return 0; } static const luaL_Reg timer_funcs[] = { {"instead_timer", luaB_set_timer}, {NULL, NULL} }; static int timer_done(void) { gfx_del_timer(instead_timer); instead_timer = NULL_TIMER; return 0; } static int timer_init(void) { char path[PATH_MAX]; snprintf(path, sizeof(path), "%s/%s", instead_stead_path(), "/ext/timer.lua"); instead_api_register(timer_funcs); return instead_loadfile(dirpath(path)); } static struct instead_ext ext = { .err = timer_done, .done = timer_done, /* to avoid loop errors */ .init = timer_init, }; int instead_timer_init(void) { return instead_extension(&ext); } instead-3.2.1/src/instead_paths.c0000644000175000017500000000452713267071774015773 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "externals.h" #include "internals.h" #include "utils.h" static int luaB_get_savepath(lua_State *L) { lua_pushstring(L, dirname(game_save_path(1, 0))); return 1; } extern char *instead_exec; static int luaB_get_exepath(lua_State *L) { char instead_path[PATH_MAX]; if (instead_exec) { strcpy(instead_path, instead_exec); unix_path(instead_path); lua_pushstring(L, instead_exec); return 1; } return 0; } static int luaB_get_gamespath(lua_State *L) { char games_path[PATH_MAX]; if (GAMES_PATH[0] != '/') { strcpy(games_path, instead_cwd()); strcat(games_path, "/"); } else games_path[0] = 0; strcat(games_path, GAMES_PATH); unix_path(games_path); lua_pushstring(L, games_path); return 1; } const luaL_Reg paths_funcs[] = { {"instead_savepath", luaB_get_savepath}, {"instead_exepath", luaB_get_exepath}, {"instead_gamespath", luaB_get_gamespath}, { NULL, NULL } }; static int paths_init(void) { char path[PATH_MAX]; snprintf(path, sizeof(path), "%s/%s", instead_stead_path(), "/ext/paths.lua"); instead_api_register(paths_funcs); return instead_loadfile(dirpath(path)); } static struct instead_ext ext = { .init = paths_init, }; int instead_paths_init(void) { return instead_extension(&ext); } instead-3.2.1/src/s60.c0000644000175000017500000001064013267071774013546 0ustar peterpeter/* * Copyright 2009-2017 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include #include #include #include #include #include #include #include #include #include #include #include "externals.h" #include "internals.h" static char save_path[PATH_MAX]; static char cfg_path[PATH_MAX]; static char local_games_path[PATH_MAX]; static char local_themes_path[PATH_MAX]; static char local_stead_path[PATH_MAX]; extern void s60delay(int u); char *game_locale(void) { char *p; char *s; p = getenv("LANG"); if (!p || !(s = strdup(p))) return NULL; if ((p = strchr(s, '_'))) *p = 0; return s; } char *game_tmp_path(void) { static time_t t = 0; static char tmp[PATH_MAX]="/tmp/instead-games"; if (!t) { t = time(NULL); sprintf(tmp, "/tmp/instead-games-%lu", (unsigned long)t); } if (mkdir(tmp, S_IRWXU) && errno != EEXIST) return NULL; return tmp; } extern char *BROWSE_MENU; extern char *get_file_name(void); char *open_file_dialog(void) { #ifdef _USE_BROWSE char *p; unix_path((p = get_file_name())); fprintf(stderr,"Selected file: %s\n", p); return p; #else return NULL; #endif } char *appdir(void) { static char dir[PATH_MAX]; if (appdata_sw) strcpy(dir, appdata_sw); else { strcpy(dir, game_cwd); strcat(dir, "/appdata"); } return dir; } char *game_local_games_path(int cr) { char *app = appdir(); if (!app) return NULL; strcpy(local_games_path, app); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } strcat(local_games_path,"/games"); if (cr) { if (mkdir(local_games_path, S_IRWXU) && errno != EEXIST) return NULL; } return local_games_path; } char *game_local_themes_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_themes_path, sizeof(local_themes_path) - 1 , "%s/themes", app); return local_themes_path; } char *instead_local_stead_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(local_stead_path, sizeof(local_stead_path) - 1 , "%s/stead/", app); return local_stead_path; } char *game_cfg_path(void) { char *app = appdir(); if (!app) return NULL; snprintf(cfg_path, sizeof(cfg_path) - 1 , "%s/insteadrc", app); return cfg_path; } char *game_save_path(int cr, int nr) { char *app = appdir(); if (!curgame_dir) return NULL; if (!access("saves", R_OK)) { if (nr) snprintf(save_path, sizeof(save_path) - 1, "saves/save%d", nr); else snprintf(save_path, sizeof(save_path) - 1, "saves/autosave"); return save_path; } if (!app) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1 , "%s/saves", app); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/", app, curgame_dir); if (cr && mkdir(save_path, S_IRWXU) && errno != EEXIST) return NULL; if (nr) snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/save%d", app, curgame_dir, nr); else snprintf(save_path, sizeof(save_path) - 1, "%s/saves/%s/autosave", app, curgame_dir); return save_path; } int debug_init(void) { return 0; } void debug_done() { } char *sdl_path(char *p) { unix_path(p); return p; } instead-3.2.1/src/config.h0000644000175000017500000000412313267071774014407 0ustar peterpeter/* * Copyright 2009-2016 Peter Kosyh * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __CONFIG_H_INCLUDED #define __CONFIG_H_INCLUDED #define FONT_SZ(v) (SCALABLE_FONT?((v) * (1.0f + ((0.1f * opt_fsize)))):(v)) #define KBD_SMART 0 #define KBD_NORMAL 1 #define KBD_INVERSE 2 #define KBD_MAX 3 #define JUST_THEME 0 #define JUST_NO 1 #define JUST_YES 2 #define JUST_MAX 3 extern char *appdata_sw; extern int chunksize_sw; extern int opt_fading; extern int opt_fsize; extern int opt_fs; extern int opt_owntheme; extern int opt_hl; extern int opt_hz; extern int opt_vol; extern int opt_motion; extern int opt_click; extern int opt_music; extern int opt_autosave; extern int opt_filter; extern int opt_kbd; extern int opt_justify; extern int opt_vsync; extern int opt_debug; extern int opt_resizable; extern int opt_hires; extern int opt_mode[2]; extern char *opt_game; extern char *opt_theme; extern char *opt_lang; extern void cfg_init(void); extern int cfg_load(void); extern int cfg_save(void); extern int parse_mode(const char *v, void *data); #endif instead-3.2.1/src/symbian.cpp0000644000175000017500000000461513267071774015145 0ustar peterpeter#include // For single function calls #include #include #include #include #include #include #include #include #include #include #include FILE* mystdout = NULL; FILE* mystderr = NULL; char* desc2str(const TDesC& aDescriptor) { static char fname[256]; TInt length = aDescriptor.Length(); HBufC8* buffer = HBufC8::NewLC(length); buffer->Des().Copy(aDescriptor); char* str = fname; Mem::Copy(str, buffer->Ptr(), length); str[length] = '\0'; CleanupStack::PopAndDestroy(buffer); return str; } extern "C" { void s60delay(int u) { if (u > 0) { User::AfterHighRes(u); } } char s60_data[] = "E:\\data\\instead"; #ifdef _USE_BROWSE char *get_file_name(void) { TFileName FileName; if (!AknCommonDialogs::RunSelectDlgLD(FileName, 0)) return NULL; return desc2str(FileName); } #endif } class CSymbianApp : public CSDLApp { public: CSymbianApp(); ~CSymbianApp(); void PreInitializeAppL() { mystdout = fopen("c:\\data\\instead\\stdout.txt","w"); mystderr = fopen("c:\\data\\instead\\stderr.txt","w"); *stdout = *mystdout; *stderr = *mystderr; s60_data[0] = BitmapStoreName()[0]; fprintf(stderr,"Using data from: %s\n", s60_data); } TUid AppDllUid() const; }; #ifdef EPOC_AS_APP // this function is called automatically by the SymbianOS to deliver the new CApaApplication object #if !defined (UIQ3) && !defined (S60V3) EXPORT_C #endif CApaApplication* NewApplication() { return new CSymbianApp; } #if defined (UIQ3) || defined (S60V3) #include // E32Main() contains the program's start up code, the entry point for an EXE. GLDEF_C TInt E32Main() { return EikStart::RunApplication(NewApplication); } #endif #endif // EPOC_AS_APP #if !defined (UIQ3) && !defined (S60V3) GLDEF_C TInt E32Dll(TDllReason) { return KErrNone; } #endif CSymbianApp::CSymbianApp() { } CSymbianApp::~CSymbianApp() { } #if defined (UIQ3) #include /** * Returns the resource id to be used to declare the views supported by this UIQ3 app * @return TInt, resource id */ TInt CSymbianApp::ViewResourceId() { return R_SDL_VIEW_UI_CONFIGURATIONS; } #endif /** * Responsible for returning the unique UID of this application * @return unique UID for this application in a TUid **/ TUid CSymbianApp::AppDllUid() const { return TUid::Uid(0xA0020410); } instead-3.2.1/stead/0000755000175000017500000000000013267071774013302 5ustar peterpeterinstead-3.2.1/stead/stead3/0000755000175000017500000000000013267071774014465 5ustar peterpeterinstead-3.2.1/stead/stead3/stdlib.lua0000644000175000017500000002474513267071774016465 0ustar peterpeter-- luacheck: read globals declare local std = stead local type = std.type -- luacheck: read globals game std.rawset(_G, 'std', stead) -- luacheck: globals include include = std.include -- luacheck: globals loadmod loadmod = std.loadmod -- luacheck: globals rnd rnd = std.rnd -- luacheck: globals rnd_seed rnd_seed = std.rnd_seed -- luacheck: globals p p = std.p -- luacheck: globals pr pr = std.pr -- luacheck: globals pn pn = std.pn -- luacheck: globals pf pf = std.pf -- luacheck: globals obj obj = std.obj -- luacheck: globals stat stat = std.stat -- luacheck: globals room room = std.room -- luacheck: globals menu menu = std.menu -- luacheck: globals dlg dlg = std.dlg -- luacheck: globals me me = std.me -- luacheck: globals here here = std.here -- luacheck: globals from from = std.from -- luacheck: globals new new = std.new -- luacheck: globals delete delete = std.delete -- nameof = std.nameof -- dispof = std.dispof -- titleof = std.titleof -- luacheck: globals gamefile gamefile = std.gamefile -- luacheck: globals player player = std.player -- luacheck: globals dprint dprint = std.dprint local function _pfn(f1, f2, ...) local a = {...} if type(f2) == 'string' then return function() f1() std.p(f2, std.unpack(a)) end end if type(f2) ~= 'function' then return f1() end return function(f3, ...) return _pfn(function() f1() f2(std.unpack(a)) end, f3, ...) end end -- luacheck: globals pfn function pfn(f, ...) local a = {...} if type(f) == 'function' then return _pfn(function() end, f, ...) end return function() std.p(f, std.unpack(a)) end end -- luacheck: globals from function from(ww) local wh ww = ww or std.here() wh = std.ref(ww) if not std.is_obj(wh, 'room') then std.err("Wrong argument to from(): "..std.tostr(wh), 2) end return wh:from() end; local function walkroom(w) if std.is_tag(w) then local ww = std.here().way:lookup(w) if not ww then std.err("Can not found tag: "..std.tostr(w), 3) end return ww end return w end -- luacheck: globals visits function visits(w) if not w then return std.here():visits() end return std.object(walkroom(w)):visits() end -- luacheck: globals visited function visited(w) if not w then return std.here():visited() end return std.object(walkroom(w)):visited() end -- luacheck: globals walk function walk(w, ...) local r, v = std.me():walk(walkroom(w), ...) if std.cctx() and type(r) == 'string' then std.p(r) end return r, v end -- luacheck: globals life_walk function life_walk(w, ...) game:reaction(false) game:events(false, false) return walk(w, ...) end -- luacheck: globals walkin function walkin(w, ...) local r, v = std.me():walkin(walkroom(w), ...) if std.cctx() and type(r) == 'string' then std.p(r) end return r, v end -- luacheck: globals walkout function walkout(w, ...) local r, v = std.me():walkout(walkroom(w), ...) if std.cctx() and type(r) == 'string' then std.p(r) end return r, v end -- luacheck: globals walkback function walkback(w, ...) return walkout(w, false, ...) end std.walkout = walkout std.walkin = walkin std.walk = walk local function object(w) local o if std.is_tag(w) then o = std.here():lookup(w) if not o then o = std.me():lookup(w) end if not o then std.err("Wrong tag: "..w, 3) end return o end o = std.ref(w) if not o then std.err("Wrong object: "..std.tostr(w), 3) end return o end std.object = object -- luacheck: globals _ _ = std.object -- luacheck: globals for_all for_all = std.for_all -- luacheck: globals seen function seen(w, ww) local wh ww = ww or std.here() if not std.is_obj(ww, 'list') then wh = std.ref(ww) else return ww:srch(w) end if not std.is_obj(wh) then std.err("Wrong 2-nd argument to seen(): "..std.tostr(ww), 2) end return wh:srch(w) end -- luacheck: globals lookup function lookup(w, ww) local wh ww = ww or std.here() if not std.is_obj(ww, 'list') then wh = std.ref(ww) else return ww:lookup(w) end if not std.is_obj(wh) and not std.is_obj(wh, 'list') then std.err("Wrong 2-nd argument to lookup(): "..std.tostr(ww), 2) end return wh:lookup(w) end -- luacheck: globals ways function ways(ww) local wh ww = ww or std.here() wh = std.ref(ww) if not std.is_obj(wh, 'room') then std.err("Wrong 2-nd argument to ways(): "..std.tostr(ww), 2) end return wh.way end std.ways = ways -- luacheck: globals objs function objs(ww) local wh ww = ww or std.here() wh = std.ref(ww) if not std.is_obj(wh) then std.err("Wrong 2-nd argument to objs(): "..std.tostr(ww), 2) end return wh.obj end -- luacheck: globals inspect function inspect(w, ...) return std.me():inspect(std.object(w), ...) end -- luacheck: globals have function have(w, ...) return std.me():have(std.object(w), ...) end -- luacheck: globals inroom function inroom(w, ...) return std.object(w):inroom(...) end -- luacheck: globals where function where(w, ...) return std.object(w):where(...) end -- luacheck: globals closed function closed(w) return std.object(w):closed() end -- luacheck: globals disabled function disabled(w) return std.object(w):disabled() end -- luacheck: globals enable function enable(w) return std.object(w):enable() end -- luacheck: globals disable function disable(w) return std.object(w):disable() end -- luacheck: globals open function open(w) return std.object(w):open() end -- luacheck: globals close function close(w) return std.object(w):close() end -- luacheck: globals actions function actions(w, t, v) return std.object(w):actions(t, v) end -- luacheck: globals pop function pop(w, ww) local wh = ww or std.here() if not std.is_obj(wh, 'dlg') then std.err("Call pop() in non-dialog object: "..std.tostr(wh), 2) end local r, v = wh:pop(w) if std.cctx() and type(r) == 'string' then std.p(r) end return r, v end -- luacheck: globals push function push(w, ww) local wh = ww or std.here() if not std.is_obj(wh, 'dlg') then std.err("Call push() in non-dialog object: "..std.tostr(wh), 2) end local r, v = wh:push(w) if std.cctx() and type(r) == 'string' then std.p(r) end return r, v end -- luacheck: globals empty function empty(w, ...) if not w then return std.here():empty() end return std.object(w):empty(...) end -- luacheck: globals lifeon function lifeon(w, ...) return std 'game':lifeon(w and std.object(w), ...) end -- luacheck: globals lifeoff function lifeoff(w, ...) return std 'game':lifeoff(w and std.object(w), ...) end -- luacheck: globals live function live(...) return std 'game':live(...) end -- luacheck: globals change_pl function change_pl(w, ...) return std 'game':set_pl(w and std.object(w), ...) end -- luacheck: globals player_moved function player_moved(pl) pl = pl or std.me() pl = std.ref(pl) if not std.is_obj(pl, 'player') then std.err("Wrong argument to player_moved(): "..std.tostr(pl)) end return std.me():moved() end -- luacheck: globals inv function inv(pl) pl = pl or std.me() pl = std.ref(pl) if not std.is_obj(pl, 'player') then std.err("Wrong argument to inv(): "..std.tostr(pl)) end return pl:inventory() end -- luacheck: globals remove function remove(w, wh) local o = std.object(w) if not w then std.err("Wrong argument to remove(): "..std.tostr(w), 2) end wh = wh and std.object(wh) return o:remove(wh) end -- luacheck: globals purge function purge(w) local o = std.object(w) if not w then std.err("Wrong argument to purge(): "..std.tostr(w), 2) end return o:purge() end local function __place(w, wh, remove) local o = std.object(w) if not o then std.err("Wrong argument to place(): "..std.tostr(w), 3) end if remove then o:remove() -- remove object from everywhere end wh = wh or std.here() if type(wh) ~= 'table' then wh = std.object(wh) end if o:type 'player' then if not std.is_obj(wh) then std.err("Wrong 2-nd argument to place(): "..std.tostr(wh), 3) end o:walk(wh, false, false) return o end if std.is_obj(wh) then wh.obj:add(o) elseif std.is_obj(wh, 'list') then wh:add(o) else std.err("Wrong 2-nd argument to place(): "..std.tostr(wh), 3) end return o end -- luacheck: globals replace function replace(w, ww, wh) local o = std.object(w) if not o then std.err("Wrong argument to replace(): "..std.tostr(w), 2) end local oo = std.object(ww) if not oo then std.err("Wrong argument to replace(): "..std.tostr(ww), 2) end if not wh then -- replace all local l = {} o:where(l) for _, v in std.ipairs(l) do v.obj:replace(o, oo) if std.is_obj(v, 'room') then v.way:replace(o, oo) end end return oo end if type(wh) ~= 'table' then wh = std.object(wh) end if std.is_obj(wh) then local _, l = wh:lookup(o) if l then l:replace(o, oo) return oo end elseif std.is_obj(wh, 'list') then wh:replace(o, oo) return oo else std.err("Wrong 3-rd argument to replace(): "..std.tostr(wh), 3) end end -- luacheck: globals place function place(w, wh) return __place(w, wh, true) end -- luacheck: globals put function put(w, wh) return __place(w, wh, false) end -- luacheck: globals take function take(w) local o = std.object(w) if o then o:actions('take', 1 + o:actions 'take') end return place(w, std.me():inventory()) end -- luacheck: globals drop function drop(w, wh) local o = std.object(w) if o then o:actions('drop', 1 + o:actions 'drop') end return place(w, wh) end -- luacheck: globals path path = std.class({ __path_type = true; new = function(_, t) if type(t) ~= 'table' then std.err("Wrong path argument. Use {} as path argument.", 2) end local n, s, w = t[1], t[2], t[3] if not w then s, w = n, s n = nil end local new = { before = s; walk = w; } for k, v in std.pairs(t) do if type(k) == 'string' then new[k] = v end end new.nam = n or new.nam return std.room(new) end; disp = function(s) local w = s.walk if type(w) == 'function' then w = w() end if disabled(w) or closed(w) then return false end if s.after ~= nil and visited(w) then return std.call(s, 'after') end return std.call(s, 'before') end; onwalk = function(s, _) local w = s.walk if type(w) == 'function' then w = w() end if not disabled(w) and not closed(w) then walk(w) end return false end; }, std.room) -- luacheck: globals time function time(...) return std.ref 'game':time(...) end local xact = std.obj { nam = '@'; { methods = {} }; act = function(s, w, ...) if type(s.methods[w]) ~= 'function' then std.err ("Wrong method to xact", 2) end return s.methods[w](...) end } std.rawset(_G, 'xact', xact.methods) std.mod_init(function() declare { game = std.ref 'game', pl = std.ref 'player', } end) instead-3.2.1/stead/stead3/events.lua0000644000175000017500000000075113267071774016477 0ustar peterpeterlocal std = stead local input = std.ref '@input' local instead = std.ref '@instead' -- luacheck: no self function input:event(...) -- luacheck: self local a for _, v in std.ipairs {...} do a = (a and (a..', ') or ' ') .. std.dump(v) end return '@user_event'.. a or '' end std.mod_cmd(function(cmd) if cmd[1] ~= '@user_event' then return end local r, v = std.call(instead, 'onevent', cmd[2]) if not r and not v then -- nothing todo return nil, false end return r, v end) instead-3.2.1/stead/stead3/declare.lua0000644000175000017500000001160013267071774016565 0ustar peterpeter-- luacheck: globals const global declare local declarations = {} local variables = {} local std = stead local type = std.type local rawget = std.rawget local rawset = std.rawset local pairs = std.pairs local table = std.table local next = std.next local function __declare_one(k, v, t) local link if type(k) ~= 'string' then -- k:find("^[a-zA-Z_][a-zA-Z0-9_]*$") then std.err ("Wrong declaration name: "..k, 3) end if declarations[k] then std.err ("Duplicate declaration: "..k, 3) end link = rawget(_G, k) declarations[k] = { value = v, type = t, link = link } if link and v ~= link then std.err("Overwite global declaration: "..std.tostr(k), 3) end if t == 'global' then if type(v) == 'function' and not std.functions[v] then std.err("Use declare to declare function: "..k, 3) end rawset(_G, k, v) variables[k] = true end if type(v) == 'function' and not std.functions[v] then std.functions[v] = k end if std.__in_init and std.is_obj(v, 'list') then table.insert(v.__in_init, v) end end local function __declare(n, t) if stead.game then std.err ("Use "..t.." only in global context", 2) end if type(n) == 'string' then return function(v) if v == nil then v = false -- std.err("Wrong declaration: "..std.tostr(t), 2) end __declare_one(n, v, t) end end if type(n) ~= 'table' then std.err ("Wrong parameter to "..n, 2) end for k, v in std.pairs(n) do __declare_one(k, v, t) end return n end function std.const(n) return __declare(n, 'const') end function std.global(n) return __declare(n, 'global') end function std.declare(n) return __declare(n, 'declare') end local function do_depends(t, tables, deps) if type(t) ~= 'table' then return end if tables[t] then deps[t] = tables[t] end for _, v in pairs(t) do if type(v) == 'table' and not std.getmt(v) then do_depends(v, tables, deps) end end end local function makedeps(nam, depends, deps) local ndeps = {} local rc = false local t = rawget(_G, nam) if type(t) ~= 'table' then return end if type(depends[nam]) ~= 'table' then return end local d = depends[nam] for k, v in pairs(d) do local dd = depends[v] if dd and k ~= t then ndeps[k] = v rc = rc or makedeps(v, depends, deps) end end if not next(ndeps) then depends[nam] = nil table.insert(deps, t) rc = true else depends[nam] = ndeps end return rc end local function mod_save(fp) -- save global variables std.tables = {} local tables = {} local deps = {} for k, v in pairs(declarations) do -- name all table variables local o = rawget(_G, k) or v.value if type(o) == 'table' then if not tables[o] then tables[o] = k end end end for k, _ in pairs(variables) do local d = {} local o = rawget(_G, k) do_depends(o, tables, d) if k == tables[o] then -- self depend d[o] = nil end if next(d) then deps[k] = d end end std.tables = tables -- save all depends for k, _ in pairs(variables) do -- write w/o deps local o = rawget(_G, k) if not deps[k] then std.save_var(o, fp, k) end end for k, _ in pairs(variables) do local d = {} while makedeps(k, deps, d) do for i=1, #d do std.save_var(d[i], fp, k) end d = {} end end end local function mod_init() std.setmt(_G, { __index = function(_, n) local d = declarations[n] if d then -- if std.game and (d.type ~= 'const') then rawset(_, n, d.value) end return d.value end local f = std.getinfo(2, "S").source std.err ("Uninitialized global variable: "..n.." in "..f, 2) end; __newindex = function(t, k, v) if not std.game and std.is_obj(v) then -- autodeclare objects __declare_one(k, v, 'declare') end local d = declarations[k] if d then if v == d.value then return --nothing todo end if not std.game then d.value = v return end if d.type == 'const' then std.err ("Modify read-only constant: "..k, 2) else d.value = v rawset(t, k, v) end return end if std.game or type(v) ~= 'function' then local f = std.getinfo(2, "S").source if f ~= '=[C]' then std.err ("Set uninitialized variable: "..k.." in "..f, 2) end end rawset(t, k, v) end }) end std.obj { nam = '@declare'; ini = function(_, ...) -- init all list objs for _, v in pairs(declarations) do if std.is_obj(v.value, 'list') then v.value:__ini(...) end end end; declarations = function() return declarations; end; variables = function() return variables end; } local function mod_done() std.setmt(_G, {}) local decl = {} for k, v in pairs(declarations) do local o = std.rawget(_G, k) or v.value if std.is_system(o) then -- save system declarations decl[k] = v elseif not v.link then rawset(_G, k, nil) end end std.tables = {} std.functions = {} declarations = decl variables = {} end std.mod_init(mod_init) std.mod_done(mod_done) std.mod_save(mod_save) const = std.const global = std.global declare = std.declare instead-3.2.1/stead/stead3/finger.lua0000644000175000017500000000400013267071774016434 0ustar peterpeter-- luacheck: globals finger local std = stead local input = std.ref '@input' local table = table local instead = std.ref '@instead' finger = std.obj { nam = '@finger'; { fingers_list = { }; }; -- luacheck: no unused args filter = function(s, press, fid, x, y, px, py) -- by default, all finger events -- luacheck: unused args return true end } function finger:event(press, fid, x, y, px, py) local s = self if press then local v = s:lookup(fid) if v then v.x, v.y, v.px, v.py = x, y, px, py else table.insert(s.fingers_list, { id = fid, x = x, y = y, px = px, py = py }) end return end local _, k = s:lookup(fid) if k then table.remove(s.fingers_list, k) end end function finger:list() local s = self local new = {} for _, v in std.ipairs(s.fingers_list) do local x, y, pressure = instead.finger_pos(v.id) if x then v.x, v.y, v.pressure = x, y, pressure table.insert(new, v) end end s.fingers_list = new return new end function finger:get(fid) local s = self local _, k local x, y, pressure = instead.finger_pos(fid) if not x then _, k = s:lookup(fid) if k then table.remove(s.fingers_list, k) end return end return x, y, pressure end function finger:lookup(fid) local s = self for k, v in std.ipairs(s.fingers_list) do if v.id == fid then return v, k end end end function input:finger(press, fid, x, y, px, py, ...) local a finger:event(press, fid, x, y, px, py, ...) if not finger:filter(press, fid, x, y, px, py, ...) then return end for _, v in std.ipairs {press, fid, x, y, px, py, ...} do a = (a and (a..', ') or ' ') .. std.dump(v) end return '@finger'.. (a or '') end std.mod_cmd(function(cmd) if cmd[1] ~= '@finger' then return end local r, v r, v = std.call(std.here(), 'onfinger', cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) if not r and not v then r, v = std.call(std.game, 'onfinger', cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) end if not r and not v then -- nothing todo return nil, false end return r, v end) instead-3.2.1/stead/stead3/snd.lua0000644000175000017500000000005713267071774015756 0ustar peterpeter-- luacheck: globals snd snd = stead.ref '@snd'instead-3.2.1/stead/stead3/noinv.lua0000644000175000017500000000065713267071774016331 0ustar peterpeterlocal std = stead std.mod_step(function(state) if not state then return end if std.here().noinv and not std.me().__inv_disabled then std.me():close() std.me().__inv_disabled = true elseif std.me().__inv_disabled and not std.here().noinv then std.me():open() std.me().__inv_disabled = nil end end) std.mod_done(function() if std.me().__inv_disabled then std.me():open() std.me().__inv_disabled = nil end end) instead-3.2.1/stead/stead3/theme.lua0000644000175000017500000000006613267071774016274 0ustar peterpeter-- luacheck: globals theme theme = stead.ref '@theme' instead-3.2.1/stead/stead3/nolife.lua0000644000175000017500000000050213267071774016441 0ustar peterpeterlocal std = stead std.mod_step(function(state) if not state then return end if std.here().nolife and std.game:live() then std.game:lifeoff() elseif not std.game:live() and not std.here().nolife then std.game:lifeon() end end) std.mod_done(function() if not std.game:live() then std.game:lifeon() end end) instead-3.2.1/stead/stead3/timer.lua0000644000175000017500000000006613267071774016312 0ustar peterpeter-- luacheck: globals timer timer = stead.ref '@timer' instead-3.2.1/stead/stead3/.luacheckrc0000644000175000017500000000004113267071774016565 0ustar peterpeterglobals = { 'stead', 'LANG', } instead-3.2.1/stead/stead3/dbg.lua0000644000175000017500000004464113267071774015735 0ustar peterpeter-- luacheck: globals dprint -- luacheck: read globals walk disable enable drop take remove local std = stead local type = std.type local table = std.table local input = std.ref '@input' local string = std.string local pairs = std.pairs local ipairs = std.ipairs local okey local txt = std.ref '@iface' local instead = std.ref '@instead' local iface = txt local kbden = { shifted = { ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = "$", ["5"] = "%", ["6"] = "^", ["7"] = "&", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", ["["] = "{", ["]"] = "}", ["\\"] = "|", [";"] = ":", ["'"] = "\"", [","] = "<", ["."] = ">", ["/"] = "?", } } local kbdalt = false local function txt_esc(s) local rep = function(self) return txt:nb(self) end if not s then return end local r = s:gsub("[<>]+", rep):gsub("[ \t]", rep); return r end local function dispof(v) local d = std.titleof(v) or std.dispof(v) if not d then d = v.tag or 'n/a' else d = d..((v.tag and '/'..v.tag) or '') end return d end local function show_obj(s, o, pfx, verbose) local wh = o:where() if wh then wh = '@'..std.tostr(std.nameof(wh))..'['..(dispof(wh))..']' else wh = '' end s:printf("%s%s%snam: %s%s | disp:%s\n", pfx or '', o:disabled() and '%' or '', o:closed() and '-' or '', std.tostr(std.nameof(o)), wh, dispof(o)) if verbose then for k, v in pairs(o) do s:printf("*[%s] = %s\n", std.tostr(k), std.dump(v) or 'n/a') end return end for _, v in ipairs(o.obj) do pfx = (pfx or '' .. ' ') show_obj(s, v, pfx) end end local function show_room(s, o) s:printf("nam: %s | title: %s | disp: %s\n", std.tostr(std.nameof(o)), std.titleof(o) or 'n/a', dispof(o)) s:printf(" way: ") for k, v in ipairs(o.way) do if k ~= 1 then s:printf(" | ") end s:printf("%s[%s]", std.tostr(std.nameof(v)), dispof(v)) end s:printf("\n") end local take = take local function show_decl(s, t) local d = std.ref '@declare':declarations() for k, v in pairs(d) do if not t or v["type"] == t then local dump = std.dump(_G[k]) if dump == '' then dump = std.tostr(_G[k]) end s:printf("%s %s = %s\n", v["type"], k, dump) end end end local commands = { { nam = 'quit', act = function(s) s.on = false s:disable(); return std.nop() end; }; { nam = 'find', { nam = 'obj', act = function(s, par) if not par then return end std.for_each_obj(function(v) if v == s then return end local disp = dispof(v) local nam = std.tostr(std.nameof(v)) if disp:find(par, 1, true) or nam:find(par, 1, true) then s:printf("nam: %s disp: %s\n", nam, disp) end end) end }; { nam = 'dsc', act = function(s, par) if not par then return end std.for_each_obj(function(v) if v == s then return end local dsc = std.par(' ', std.call(v, 'dsc'), std.call(v, 'decor')) or '' local st, e = dsc:find(par, 1, true) if st then local nam = std.tostr(std.nameof(v)) local disp = dispof(v) st = st - 32 if st < 0 then st = 1 end s:printf("nam: %s disp: %s dsc: %s\n", nam, disp, dsc:sub(st, e + 32)) end end) end }; }; { nam = 'show', { nam = 'obj', act = function(s, par) if par == '*' then local objs = {} std.for_each_obj(function(v) if not v:type 'room' then table.insert(objs, v) end end) table.sort(objs, function(a, b) return std.tostr(std.nameof(a)) < std.tostr(std.nameof(b)) end) for i = 1, #objs do show_obj(s, objs[i]) end return end if not par then for i = 1, #std.here().obj do show_obj(s, std.here().obj[i]) end return end s:printf("[object]\n") local st, r = std.pcall(function() show_obj(s, std.object(std.tonum(par) or par), ' ', true) end) if not st then s:printf("%s\n", r) return end return end; }, { nam = 'inv', act = function(s) s:printf("[inventory]\n") for _, v in ipairs(std.me():inventory()) do show_obj(s, v, ' ') end end; }; { nam = 'room', act = function(s, par) if par == '*' then local rooms = {} std.for_each_obj(function(v) if v:type 'room' then table.insert(rooms, v) end end) table.sort(rooms, function(a, b) return std.tostr(std.nameof(a)) < std.tostr(std.nameof(b)) end) for i = 1, #rooms do show_room(s, rooms[i]) end return end local r, v = std.pcall(function() return par and std.object(par) or std.here() end) if not r then s:printf("%s\n", v) return end if not std.is_obj(v, 'room') then s:printf("It is not the room.\n") return end s:printf("[room]\n ") show_room(s, v) s:printf("[objects]\n") for _, o in ipairs(std.here().obj) do show_obj(s, o, ' ') end end; }; { nam = 'declare', act = function(s, par) if par == '*' then show_decl(s) else show_decl(s, 'declare') end end }, { nam = 'global', act = function(s, _) show_decl(s, 'global') end }, { nam = 'const', act = function(s, _) show_decl(s, 'const') end } }; { nam = 'take', act = function(s, par) if not par then return end local st, r, v = s:eval(take, std.tonum(par) or par) if not st then s:printf("%s\n", r) return end return r, v end; }, { nam = 'drop', act = function(s, par) if not par then return end local st, r, v = s:eval(drop, std.tonum(par) or par) if not st then s:printf("%s\n", r) return end return r, v end; }, { nam = 'remove', act = function(s, par) if not par then return end local st, r, v = s:eval(remove, std.tonum(par) or par) if not st then s:printf("%s\n", r) return end return r, v end; }, { nam = 'enable', act = function(s, par) if not par then return end local st, r, v = s:eval(enable, std.tonum(par) or par) if not st then s:printf("%s\n", r) return end return r, v end; }, { nam = 'disable', act = function(s, par) if not par then return end local st, r, v = s:eval(disable, std.tonum(par) or par) if not st then s:printf("%s\n", r) return end return r, v end; }, { nam = 'dump', act = function(s, par) if not par then return end local f, err = std.eval('return ('..par..')') if not f then s:printf("%s\n", err) return end err, f = std.pcall(f) if not err then s:printf("%s\n", f) return end if std.is_obj(f) then show_obj(s, f, '', true) else s:printf("%s\n", std.dump(f)) end end }; { nam = 'eval', act = function(s, par) if not par then return end local f, err = std.eval(par) if not f then s:printf("%s\n", err) return end f, err = std.pcall(f) if not f then s:printf("%s\n", err) return end end }; { nam = 'walk', act = function(s, par) if not par then return end local st, r, v = s:eval(walk, par, false) if not st then s:printf("%s\n", r) return end return r, v end; }; { nam = 'clear', act = function(s) s:cls() end; }; { nam = 'help', act = function(s) s:printf([[Use key to complete words. Use / for history. Use ctrl-l to clear screen. Use ctrl-d or f6 to enter/exit debugger. Some useful commands: show obj * - show all objects show room * - show all rooms find obj - search obj find dsc - search obj (in dsc and decor) show obj - show object (in verbose mode) show room - show room show room - show here walk - walk anywhere ]]); end; }; lookup = function(s, inp) local cmd = std.split(inp) local cur = s local found local last_found for k, v in ipairs(cmd) do found = nil for _, c in ipairs(cur) do if v == c.nam then cur = c found = k last_found = k break end end if not found then break end end local par if last_found then for i = last_found + 1, #cmd do par = (par and (par .. ' ') or '').. cmd[i] end else par = inp end return cur, par end; completion = function(s, inp) local cmd, par = s:lookup(inp) if not cmd then return end if #cmd == 0 then if par then local vars = {} std.for_each_obj(function(v, var) if std.tostr(v.nam):find(par, 1, true) == 1 and std.tostr(v.nam) ~= par then table.insert(var, std.tostr(v.nam)) end end, vars) return vars end return end local var = {} for i = 1, #cmd do if cmd[i].nam:find(par or '', 1, true) == 1 then table.insert(var, cmd[i].nam) end end return var end; save = function() end; }; local embed = { on = false; key_shift = false; cursor = 1; input = ''; output = [[INSTEAD dbg 0.1 Written by Peter Kosyh in 2017 Type "help" to see help ]]; hint = ''; history = {}; history_pos = 1; key_alt = false; key_ctrl = false; kbd_alt_xlat = false; __last_disp = false; __nostrict = false; last_timer = false; }; local theme = {} local function theme_var(a, b) local ov = instead.theme_var(a) if b then theme[a] = ov return instead.theme_var(a, b) end return ov end local function theme_reset() for k, v in pairs(theme) do instead.theme_var(k, v) end theme = {} end local funcs = {} local function instead_func(a) local ov = instead[a] funcs[a] = ov std.rawset(instead, a, function() end) end local function instead_reset() for k, v in pairs(funcs) do std.rawset(instead, k, v) end funcs = {} end local std_dbg = {} local function std_debug(a) if not a then for k, v in pairs(std_dbg) do std['debug_'..k] = v end return end std_dbg[a] = std['debug_'..a] std['debug_'..a] = false end local render_callback = false local dbg = std.obj { pri = 16384; nam = '@dbg'; embed; { commands = commands }, enable = function(s) instead_func('get_picture') instead_func('get_fading') instead_func('get_title') instead_func('get_ways') render_callback = (std.ref '@sprite').render_callback(false) local timer = stead.ref '@timer' s.last_timer = timer:get() timer:stop() std_debug('input') std_debug('output') std_debug('xref') s.__last_disp = std.game:lastdisp() s.__nostrict = std.nostrict or false local w, h = std.tonum(theme_var 'scr.w'), std.tonum(theme_var 'scr.h') theme_var('scr.gfx.mode', 'embedded') theme_var('scr.gfx.bg', '') theme_var('scr.col.bg', 'white') theme_var('win.col.fg', 'black') theme_var('inv.mode', 'disabled') local padw = w > 320 and 16 or 0 local padh = h > 320 and 16 or 0 theme_var('win.x', padw) theme_var('win.y', padh) theme_var('win.w', w - padw) theme_var('win.h', h - padh) theme_var('menu.button.x', w) theme_var('menu.button.y', h) theme_var('win.fnt.size', 16) theme_var('win.scroll.mode', 3) std.nostrict = true iface:raw_mode(true) end; disable = function(s) theme_reset() std_debug() std.nostrict = s.__nostrict instead_reset() std.ref('@sprite').render_callback(render_callback) iface:raw_mode(false) local timer = stead.ref '@timer' timer:set(s.last_timer) std.game:lastdisp(s.__last_disp) end; inp_split = function(s) local pre = s.input:sub(1, s.cursor - 1); local post = s.input:sub(s.cursor); return pre, post end; eval = function(s, fn, ...) local st, r, _ = std.pcall(fn, ...) if not st then -- s:printf("%s\n", r) return false, r else s.on = false s:disable() if std.me():moved() then return true, nil, true else return true, std.nop() end end end; cls = function(s) s.output = ''; s.hint = ''; end; completion = function(s, edit) local hint = s.commands:completion(s.input) if not hint or #hint == 0 then s.hint = '' return end if #hint == 1 and edit ~= false then local _, par = s.commands:lookup(s.input) if par then local len = par:len() s.input = s.input:sub(1, s.input:len() - len) end s.input = s.input .. hint[1]..' ' s.cursor = #s.input + 1 s:completion(edit) return end s.hint = '' for _, v in ipairs(hint) do s.hint = s.hint .. v .. ' ' end end; printf = function(s, fmt, ...) s.output = s.output .. std.string.format(fmt, ...) end; exec = function(s) local c, par = s.commands:lookup(s.input) if not c or not c.act then return s:completion() end if #s.history == 0 or s.history[#s.history] ~= s.input then table.insert(s.history, s.input) end s.history_pos = 0 s:printf('$ '..s.input..'\n') s.input = '' s.hint = '' s.cursor = 1 return c.act(s, par) end; dsc = function(s) -- display debugger std.pr (txt_esc(s.output)) if s.kbd_alt_xlat then std.pr (txt:bold '&') else std.pr (txt:bold ' ') end local pre, post = s:inp_split() std.pr (txt:bold '$ '.. txt:bold(txt_esc(pre))..txt:bold '|'..txt:bold(txt_esc(post)) ..'\n') if s.hint == '' then s.hint = '?' end std.pr (s.hint ..'\n') std.pr (txt:anchor()) end; key = function(s, press, key) if key:find 'shift' then s.key_shift = press return elseif key:find 'ctrl' then s.key_ctrl = press return elseif key:find 'alt' then s.key_alt = press if s.on then if not press and kbdalt then s.kbd_alt_xlat = not s.kbd_alt_xlat end return 'look' end return end if not press then return end if s.key_ctrl or s.key_alt then if s.on and key == 'q' then return '@dbg toggle' end if key == 'q' or key == 'r' then return end end if s.key_shift then if key == 'up' or key == 'down' then return end end if (key == 'f7'and not s.key_ctrl and not s.key_alt) or (s.key_ctrl and key == 'd') then return '@dbg toggle' end if s.on then return '@dbg key '..string.format("%q", key) end end; } local function utf_bb(b, pos) if type(b) ~= 'string' or b:len() == 0 then return 0 end local utf8 = (std.game.codepage == 'UTF-8' or std.game.codepage == 'utf-8') if not utf8 then return 1 end local i = pos or b:len() local l = 0 while b:byte(i) >= 0x80 and b:byte(i) <= 0xbf do i = i - 1 l = l + 1 if i <= 1 then break end end return l + 1 end local function utf_ff(b, pos) if type(b) ~= 'string' or b:len() == 0 then return 0 end local utf8 = (std.game.codepage == 'UTF-8' or std.game.codepage == 'utf-8') if not utf8 then return 1 end local i = pos or 1 local l = 0 if b:byte(i) < 0x80 then return 1 end i = i + 1 l = l + 1 while b:byte(i) >= 0x80 and b:byte(i) <= 0xbf do i = i + 1 l = l + 1 if i > b:len() then break end end return l end local function key_xlat(s) local kbd if s == 'return' then return '\n' end if s == 'space' then return ' ' end if s:len() > 1 then return end if dbg.kbd_alt_xlat and (std.game.codepage == 'UTF-8' or std.game.codepage == 'utf-8') and kbdalt then kbd = kbdalt else kbd = kbden end if kbd and dbg.key_shift then kbd = kbd.shifted; end if not kbd[s] then if dbg.key_shift then return s:upper(); end return s; end return kbd[s] end std.mod_cmd(function(cmd) if cmd[1] ~= '@dbg' then if dbg.on then if cmd[1] == 'look' then std.abort() return std.call(dbg, 'dsc') end return nil, false end return end if cmd[2] == 'toggle' then dbg.on = not dbg.on if dbg.on then dbg:enable() std.abort() return std.call(dbg, 'dsc') else dbg:disable() return std.nop() end elseif cmd[2] == 'key' then local key = cmd[3] if key:find 'return' and not dbg.key_ctrl and not dbg.key_alt then local r, v = dbg:exec() if r ~= nil or v ~= nil then return r, v end elseif key:find '^backspace' then if dbg.input == '' then std.abort() return std.call(dbg, 'dsc'), true end local pre, post = dbg:inp_split() if not pre or pre == '' then std.abort() return std.call(dbg, 'dsc'), true end local i = utf_bb(pre) dbg.input = dbg.input:sub(1, pre:len() - i) .. post dbg.cursor = dbg.cursor - i elseif key:find '^tab' then dbg:completion() elseif key:find 'home' or (key == 'a' and dbg.key_ctrl) then dbg.cursor = 1 elseif key:find 'end' or (key == 'e' and dbg.key_ctrl) then dbg.cursor = #dbg.input + 1 elseif (key == 'k' and dbg.key_ctrl) then dbg.cursor = 1 dbg.input = '' elseif (key == 'l' and dbg.key_ctrl) then dbg:cls() elseif key:find '^right' then if dbg.cursor <= dbg.input:len() then local i = utf_ff(dbg.input, dbg.cursor) dbg.cursor = dbg.cursor + i end if dbg.cursor > dbg.input:len() then dbg.cursor = dbg.input:len() + 1 end elseif key:find '^left' then if dbg.cursor > 1 then local i = utf_bb(dbg.input, dbg.cursor - 1) dbg.cursor = dbg.cursor - i end if dbg.cursor < 1 then dbg.cursor = 1 end elseif key:find '^up' then local s = dbg if #s.history == 0 then return end if s.history_pos == 0 then s.history_pos = #s.history + 1 end s.history_pos = s.history_pos - 1 if s.history_pos == 0 then s.history_pos = 1 end s.input = s.history[s.history_pos] s.cursor = #s.input + 1 elseif key:find '^down' then local s = dbg if #s.history == 0 or s.history_pos == #s.history then return end s.history_pos = s.history_pos + 1 if s.history_pos > #s.history then s.history_pos = #s.history end s.input = s.history[s.history_pos] s.cursor = #s.input + 1 elseif key_xlat(key) then local k = key_xlat(key) local pre, post = dbg:inp_split() dbg.cursor = dbg.cursor + k:len() dbg.input = pre .. k .. post else return nil, false end dbg:completion(false) std.abort() return std.call(dbg, 'dsc'), true end end, -100) function std.dprint(...) local a = { ... } dbg:printf("dbg> "); for i = 1, #a do if i ~= 1 then dbg:printf("%s", ' ') std.io.stderr:write(' ') end dbg:printf("%s", std.tostr(a[i])) std.io.stderr:write(std.tostr(a[i])) end dbg:printf("\n") std.io.stderr:write('\n') std.io.stderr:flush() end dprint = std.dprint local oldlang local hooked = false std.mod_start(function(_) local st, r if oldlang ~= LANG then st, r = std.pcall(function() return require ('dbg-'..LANG) end) if st and r then std.dprint("dbg: Using '"..LANG.."' keyboard layout.") kbden, kbdalt = r.main, r.alt end end oldlang = LANG iface:raw_mode(false) if not hooked then okey = input.key; hooked = true end std.rawset(input, 'key', function(_, ...) return dbg:key(...) or (okey and okey(input, ...)) end) end, -100) std.mod_done(function() hooked = false iface:raw_mode(false) std.rawset(input, 'key', okey) end, -100) -- std.rawset(_G, 'dbg', std.ref '@dbg') instead-3.2.1/stead/stead3/ext/0000755000175000017500000000000013267071774015265 5ustar peterpeterinstead-3.2.1/stead/stead3/ext/sandbox.lua0000644000175000017500000000677413267071774017444 0ustar peterpeter-- luacheck: globals STANDALONE -- luacheck: read globals instead -- luacheck: globals io os debug -- luacheck: read globals instead_realpath local function sandbox() if STANDALONE or not instead.gamepath then -- not standalone or not sdl-instead return end -- luacheck: no unused args local check_path = function(realpath, type, find, gsub, savepath, gamepath, path) -- luacheck: unused args if not path then return false end path = realpath(path) if not path then return false end local spath = realpath(savepath) if not spath then return false end local s = find(path, spath..'/', 1, true) if s ~= 1 then spath = realpath(gamepath); if spath then s = find(path, spath..'/', 1, true) end end if s ~= 1 then return false end return true end local build_sandbox_open = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(io.open, function(f, path, acc, ...) if type(acc) ~= 'string' or not find(acc, "[aw+]") then -- only write access return f(path, acc, ...) end -- luacheck: no unused args if not check_path(realpath, type, find, gsub, savepath, gamepath, path) then -- luacheck: unused args error ("Access denied (write): ".. path, 3); return false end return f(path, acc, ...) end) end local build_sandbox_remove = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(os.remove, function(f, path, ...) if type(path) ~= 'string' then return f(path, ...) end if not check_path(realpath, type, find, gsub, savepath, gamepath, path) then error ("Access denied (remove): ".. path, 3); return false end return f(path, ...) end) end local build_sandbox_rename = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(os.rename, function(f, oldname, newname, ...) if not check_path(realpath, type, find, gsub, savepath, gamepath, oldname) or not check_path(realpath, type, find, gsub, savepath, gamepath, newname) then error ("Access denied (rename): ".. oldname .. ', '.. newname, 3); return false end return f(oldname, newname, ...) end) end local build_sandbox_output = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(io.output, function(f, path, ...) if type(path) == 'string' and not check_path(realpath, type, find, gsub, savepath, gamepath, path) then error ("Access denied (output): ".. path, 3); return false end return f(path, ...) end) end io.open = build_sandbox_open(instead_realpath, error, type, string.find, string.gsub, instead.savepath(), instead.gamepath()); os.remove = build_sandbox_remove(instead_realpath, error, type, string.find, string.gsub, instead.savepath(), instead.gamepath()); os.rename = build_sandbox_rename(instead_realpath, error, type, string.find, string.gsub, instead.savepath(), instead.gamepath()); io.output = build_sandbox_output(instead_realpath, error, type, string.find, string.gsub, instead.savepath(), instead.gamepath()); os.execute = function(s) print ("Warning: trying to do os.execute: "..s); end io.popen = function(s) print ("Warning: trying to do io.popen: "..s); end os.tmpname = function(_) print ("Warning: trying to do os.tmpname"); end if not stead.rawget(_G, 'DEBUG') then debug = nil end package.cpath = "" package.preload = {} package = nil end sandbox() instead-3.2.1/stead/stead3/ext/timer.lua0000644000175000017500000000205213267071774017107 0ustar peterpeter-- raw iface to timer -- luacheck: read globals instead_timer local std = stead local type = std.type local instead = std.ref '@instead' instead.timer = instead_timer local timer = std.obj { nam = '@timer'; ini = function(s) if s.__timer then s:set(s.__timer) end end; get = function(s) return s.__timer or 0; end; stop = function(s) return s:set(0) end; set = function(s, v) if type(v) ~= 'number' then std.err("Wrong argument to timer:set(): "..std.tostr(v), 2) end s.__timer = v instead.timer(s.__timer) return true end; callback = function(_) return '@timer' end } std.timer = function() -- sdl part call this one if std.type(timer.callback) == 'function' then return timer:callback(); end return end std.mod_done(function(_) timer:stop() end) std.mod_cmd(function(cmd) if cmd[1] ~= '@timer' then return end local r, v = std.call(stead.here(), 'timer'); if not r and not v then r, v = stead.call(std.game, 'timer'); end if not r and not v then -- nothing todo return nil, false end return r, v end) instead-3.2.1/stead/stead3/ext/sprites.lua0000644000175000017500000003457113267071774017473 0ustar peterpeterlocal std = stead local type = std.type local instead = std.ref '@instead' -- luacheck: read globals instead_theme_var -- luacheck: read globals instead_theme_name -- luacheck: read globals instead_ticks -- luacheck: read globals instead_font_load -- luacheck: read globals instead_font_free -- luacheck: read globals instead_font_scaled_size -- luacheck: read globals instead_sprite_alpha -- luacheck: read globals instead_sprite_dup -- luacheck: read globals instead_sprite_scale -- luacheck: read globals instead_sprite_rotate -- luacheck: read globals instead_sprite_text -- luacheck: read globals instead_sprite_text_size -- luacheck: read globals instead_sprite_draw -- luacheck: read globals instead_sprite_copy -- luacheck: read globals instead_sprite_compose -- luacheck: read globals instead_sprite_fill -- luacheck: read globals instead_sprite_pixel -- luacheck: read globals instead_sprite_load -- luacheck: read globals instead_sprite_free -- luacheck: read globals instead_sprite_size -- luacheck: read globals instead_sprites_free -- luacheck: read globals instead_sprite_colorkey -- luacheck: read globals instead_sprite_pixels -- luacheck: read globals instead_mouse_pos -- luacheck: read globals instead_mouse_show -- luacheck: read globals instead_mouse_filter -- luacheck: read globals instead_finger_pos -- luacheck: read globals instead_noise1 -- luacheck: read globals instead_noise2 -- luacheck: read globals instead_noise3 -- luacheck: read globals instead_noise4 -- luacheck: read globals instead_render_callback -- luacheck: read globals instead_direct -- luacheck: read globals instead_busy -- luacheck: read globals instead_sprite_pixels -- theme instead.theme_var = instead_theme_var instead.theme_name = instead_theme_name local theme = std.obj { nam = '@theme'; vars = {}; reset_vars = {}; { win = { gfx = {}}; inv = { gfx = {}}; menu = { gfx = {}}; gfx = {}; snd = {}; scr = {}; }; } function theme.restore(name) if type(name) ~= 'string' then std.err("Wrong parameter to theme.restore", 2) end local v = theme.vars[name] if not v then return end instead.theme_var(name, v); end function theme.set(name, val) if type(name) ~= 'string' or val == nil then std.err("Wrong parameter to theme.set", 2) end if not theme.reset_vars[name] then theme.reset_vars[name] = instead.theme_var(name) end instead.theme_var(name, std.tostr(val)); theme.vars[name] = std.tostr(val); end function theme.reset(name) if type(name) ~= 'string' then std.err("Wrong parameter to theme.reset", 2) end local v = theme.reset_vars[name] if not v then return end instead.theme_var(name, v); theme.vars[name] = nil theme.reset_vars[name] = nil end function theme.name(...) return instead.theme_name(...); end function theme.get(...) return instead.theme_var(...); end function theme.scr.w() return tonumber(theme.get 'scr.w') end function theme.scr.h() return tonumber(theme.get 'scr.h') end function theme.win.reset() std.for_all(theme.reset, "win.x", "win.y", "win.w", "win.h", "win.col.fg", "win.col.link", "win.col.alink", "win.fnt.name", "win.fnt.size", "win.fnt.height"); end function theme.win.geom(x, y, w, h) theme.set("win.x", x); theme.set("win.y", y); theme.set("win.w", w); theme.set("win.h", h); end function theme.win.color(fg, link, alink) theme.set("win.col.fg", fg); theme.set("win.col.link", link); theme.set("win.col.alink", alink); end function theme.win.font(name, size, height) theme.set("win.fnt.name", name); theme.set("win.fnt.size", size); theme.set("win.fnt.height", height); end function theme.win.gfx.reset() std.for_all(theme.reset, "win.gfx.up", "win.up.x", "win.up.y"); std.for_all(theme.reset, "win.gfx.down", "win.down.x", "win.down.y"); end function theme.win.gfx.up(pic, x, y) theme.set("win.gfx.up", pic); theme.set("win.up.x", x); theme.set("win.up.y", y); end function theme.win.gfx.down(pic, x, y) theme.set("win.gfx.down", pic); theme.set("win.down.x", x); theme.set("win.down.y", y); end function theme.inv.reset() std.for_all(theme.reset, "inv.x", "inv.y", "inv.w", "inv.h", "inv.col.fg", "inv.col.link", "inv.col.alink", "inv.fnt.name", "inv.fnt.size", "inv.fnt.height", "inv.mode"); end function theme.inv.geom(x, y, w, h) theme.set("inv.x", x); theme.set("inv.y", y); theme.set("inv.w", w); theme.set("inv.h", h); end function theme.inv.color(fg, link, alink) theme.set("inv.col.fg", fg); theme.set("inv.col.link", link); theme.set("inv.col.alink", alink); end function theme.inv.font(name, size, height) theme.set("inv.fnt.name", name); theme.set("inv.fnt.size", size); theme.set("inv.fnt.height", height); end function theme.inv.mode(mode) theme.set("inv.mode", mode); end function theme.inv.gfx.reset() std.for_all(theme.reset, "inv.gfx.up", "inv.up.x", "inv.up.y"); std.for_all(theme.reset, "inv.gfx.down", "inv.down.x", "inv.down.y"); end function theme.inv.gfx.up(pic, x, y) theme.set("inv.gfx.up", pic); theme.set("inv.up.x", x); theme.set("inv.up.y", y); end function theme.inv.gfx.down(pic, x, y) theme.set("inv.gfx.down", pic); theme.set("inv.down.x", x); theme.set("inv.down.y", y); end function theme.menu.reset() std.for_all(theme.reset, "menu.bw", "menu.col.fg", "menu.col.bg", "menu.col.alpha", "menu.col.link", "menu.col.alink", "menu.fnt.name", "menu.fnt.size", "menu.fnt.height"); end function theme.menu.bw(w) theme.set("menu.bw", w) end function theme.menu.color(fg, bg, alpha, link, alink) theme.set("menu.col.fg", fg); theme.set("menu.col.bg", bg); theme.set("menu.col.alpha", alpha); theme.set("menu.col.link", link); theme.set("menu.col.alink", alink); end function theme.menu.font(name, size, height) theme.set("menu.fnt.name", name); theme.set("menu.fnt.size", size); theme.set("menu.fnt.height", height); end function theme.menu.gfx.reset() std.for_all(theme.reset, "menu.gfx.button", "menu.button.x", "menu.button.y"); end function theme.menu.gfx.button(b, x, y) theme.set("menu.gfx.button", b); theme.set("menu.button.x", x); theme.set("menu.button.y", y); end; function theme.gfx.reset() std.for_all(theme.reset, "scr.gfx.cursor.normal", "scr.gfx.cursor.use", "scr.gfx.cursor.x", "scr.gfx.cursor.y", "scr.gfx.mode", "scr.gfx.pad", "scr.gfx.bg"); end function theme.gfx.cursor(norm, use, x, y) theme.set("scr.gfx.cursor.normal", norm); theme.set("scr.gfx.cursor.use", use); theme.set("scr.gfx.cursor.x", x); theme.set("scr.gfx.cursor.y", y); end function theme.gfx.mode(mode) theme.set("scr.gfx.mode", mode); end function theme.gfx.pad(pad) theme.set("scr.gfx.pad", pad); end function theme.gfx.bg(bg) theme.set("scr.gfx.bg", bg); end function theme.snd.reset() theme.reset("snd.click"); end function theme.snd.click(w) theme.set("snd.click", w); end -- sprites instead.ticks = instead_ticks instead.font_load = instead_font_load instead.font_free = instead_font_free instead.font_scaled_size = instead_font_scaled_size instead.sprite_alpha = instead_sprite_alpha instead.sprite_dup = instead_sprite_dup instead.sprite_scale = instead_sprite_scale instead.sprite_rotate = instead_sprite_rotate instead.sprite_text = instead_sprite_text instead.sprite_text_size = instead_sprite_text_size instead.sprite_draw = instead_sprite_draw instead.sprite_copy = instead_sprite_copy instead.sprite_compose = instead_sprite_compose instead.sprite_fill = instead_sprite_fill instead.sprite_pixel = instead_sprite_pixel instead.sprite_load = instead_sprite_load instead.sprite_free = instead_sprite_free instead.sprite_size = instead_sprite_size instead.sprites_free = instead_sprites_free instead.sprite_colorkey = instead_sprite_colorkey instead.sprite_pixels = instead_sprite_pixels instead.mouse_pos = instead_mouse_pos instead.mouse_show = instead_mouse_show instead.mouse_filter = instead_mouse_filter instead.finger_pos = instead_finger_pos instead.noise1 = instead_noise1 instead.noise2 = instead_noise2 instead.noise3 = instead_noise3 instead.noise4 = instead_noise4 instead.render_callback = instead_render_callback instead.direct = instead_direct std.busy = instead_busy local spr = { __gc = function(s) instead.sprite_free(s.spr) end; __tostring = function(s) return s.spr end; } spr.__index = spr local fnt = { __gc = function(s) instead.font_free(s.fnt) end; __tostring = function(s) return s.fnt end; } fnt.__index = fnt local spr_get = function(s) if type(s) == 'string' then return s end return std.tostr(s) end function fnt:new(nam) if type(nam) ~= 'string' then std.err("Wrong argument to fnt:new(): "..std.tostr(nam), 2) end local o = { fnt = nam; __save = function() end; } std.setmt(o, self) return std.proxy(o) end function fnt:text(text, col, style, ...) return spr:new(instead.sprite_text(self.fnt, text, col, style, ...)) end function fnt:size(...) return instead.sprite_text_size(self.fnt, ...); end function fnt:height(...) local _, h = self:size(...) return h end function spr:new(nam) if type(nam) ~= 'string' then std.err("Wrong argument to spr:new(): "..std.tostr(nam), 2) end local o = { spr = nam; __save = function() end; } std.setmt(o, self) return std.proxy(o) end; function spr:alpha(alpha, ...) return spr:new(instead.sprite_alpha(self.spr, alpha, ...)); end function spr:colorkey(color, ...) instead.sprite_colorkey(self.spr, color, ...); return self end function spr:dup(...) return spr:new(instead.sprite_dup(self.spr, ...)); end function spr:scale(xs, ys, smooth, ...) if smooth == nil then smooth = true -- default is on end return spr:new(instead.sprite_scale(self.spr, xs, ys, smooth,...)); end function spr:rotate(angle, smooth, ...) if smooth == nil then smooth = true -- default is on end return spr:new(instead.sprite_rotate(self.spr, angle, smooth, ...)); end function spr:size() return instead.sprite_size(self.spr); end function spr:draw(fx, fy, fw, fh, d, x, y, alpha) if d == nil and x == nil and y == nil then d, x, y, alpha = fx, fy, fw, fh fx, fy, fw, fh = 0, 0, -1, -1 end instead.sprite_draw(self.spr, fx, fy, fw, fh, spr_get(d), x, y, alpha); return d end function spr:copy(fx, fy, fw, fh, d, x, y) if d == nil and x == nil and y == nil then d, x, y = fx, fy, fw fx, fy, fw, fh = 0, 0, -1, -1 end instead.sprite_copy(self.spr, fx, fy, fw, fh, spr_get(d), x, y); return d end function spr:compose(fx, fy, fw, fh, d, x, y) if d == nil and x == nil and y == nil then d, x, y = fx, fy, fw fx, fy, fw, fh = 0, 0, -1, -1 end instead.sprite_compose(self.spr, fx, fy, fw, fh, spr_get(d), x, y); return d end function spr:fill(x, y, w, h, col) if h == nil and col == nil then instead.sprite_fill(self.spr, 0, 0, -1, -1, x); return self end instead.sprite_fill(self.spr, x, y, w, h, col); return self end function spr:pixel(x, y, col, alpha) if not col then return instead.sprite_pixel(self.spr, x, y, col, alpha) end instead.sprite_pixel(self.spr, x, y, col, alpha) return self end local screen = spr:new 'screen' local sprite = { nam = '@sprite'; } function sprite.new(w, h, ...) if std.tonum(w) and std.tonum(h) then local t = 'blank:'..std.tostr(std.math.floor(w))..'x'..std.tostr(std.math.floor(h)) return spr:new(instead.sprite_load(t)) end local sp = instead.sprite_load(w, h, ...) if not sp then std.err("Can not load sprite: "..std.tostr(w), 2); end return spr:new(sp) end function sprite.fnt(name, sz, ...) if not std.tonum(sz) then std.err("No font size specified in sprite:fnt().", 2) end local fn = instead.font_load(name, sz, ...) if not fn then std.err("Can not load font: "..std.tostr(name), 2); end return fnt:new(fn) end function sprite.scr() return screen end function sprite.direct(v) return instead.direct(v) end function sprite.font_scaled_size(size) return instead.font_scaled_size(size); end local render_cb = nil function sprite.render_callback(fn) local old = render_cb render_cb = fn instead.render_callback(render_cb) return old end std.obj(sprite) instead.sprite_pixels = instead_sprite_pixels local pfnt = { } pfnt.__index = pfnt std.setmt(pfnt, fnt) local pxl = { } pxl.__index = pxl function pxl:dup() local w, h, s = self:size() local p = instead.sprite_pixels(w, h, s) if p then self:copy(p) end return self:new(p) end function pxl:sprite() return sprite.new(self) end function pxl:draw_spr(fx, fy, fw, fh, d, x, y, alpha) if d == nil and x == nil and y == nil then instead.sprite_draw(self, 0, 0, -1, -1, spr_get(fx), fy, fw, fh); return fx end instead.sprite_draw(self, fx, fy, fw, fh, spr_get(d), x, y, alpha); return d end function pxl:copy_spr(fx, fy, fw, fh, d, x, y, alpha) if d == nil and x == nil and y == nil then instead.sprite_copy(self, 0, 0, -1, -1, spr_get(fx), fy, fw, fh); return fx end instead.sprite_copy(self, fx, fy, fw, fh, spr_get(d), x, y, alpha); return d end function pxl:compose_spr(fx, fy, fw, fh, d, x, y, alpha) if d == nil and x == nil and y == nil then instead.sprite_compose(self, 0, 0, -1, -1, spr_get(fx), fy, fw, fh); return fx end instead.sprite_compose(self, fx, fy, fw, fh, spr_get(d), x, y, alpha); return d end function pxl:scale(...) return pxl:new(self:new_scaled(...)) end function pxl:rotate(...) return pxl:new(self:new_rotated(...)) end local function poly(self, fn, t, ...) if type(t) ~= 'table' then std.err("Wrong argument to :poly()", 3) end if #t < 4 then return end local n = #t for i = 1, n, 2 do if i == n - 1 then fn(self, t[i], t[i+1], t[1], t[2], ...); else fn(self, t[i], t[i+1], t[i+2], t[i+3], ...); end end end function pxl:poly(t, ...) poly(self, self.line, t, ...) end function pxl:polyAA(t, ...) poly(self, self.lineAA, t, ...) end function pxl:new(p) if type(p) ~= 'userdata' then return end local t = getmetatable(p).__index setmetatable(t, self) return p end function pfnt:new(nam) return fnt.new(self, nam) end function pfnt:text(text, col, style, ...) local s = self return pxl:new(instead.sprite_pixels(instead.sprite_text(s.fnt, text, col, style, ...))) end local pixels = { nam = '@pixels'; } function pixels.fnt(name, sz, ...) if not std.tonum(sz) then std.err("No font size specified.", 2) end return pfnt:new(instead.font_load(name, -sz, ...)) end function pixels.new(...) return pxl:new(instead.sprite_pixels(...)) end std.obj (pixels) local rnd_seed = 1980 + 1978 stead.mod_init(function() rnd_seed = (std.os.time(stead.os.date("*t")) + rnd_seed + instead.ticks()) std.rnd_seed(rnd_seed) end) stead.mod_done(function() sprite.render_callback() -- stop render -- instead.sprites_free(); end) instead-3.2.1/stead/stead3/ext/sound.lua0000644000175000017500000001063413267071774017124 0ustar peterpeter-- raw interface to sound local std = stead local instead = std.ref '@instead' -- luacheck: globals instead_sound_load -- luacheck: globals instead_sound_free -- luacheck: globals instead_sounds_free -- luacheck: globals instead_sound_channel -- luacheck: globals instead_sound_volume -- luacheck: globals instead_sound_panning -- luacheck: globals instead_sound_load_mem -- luacheck: globals instead_music_callback -- luacheck: globals instead_sound instead.sound_load = instead_sound_load instead.sound_free = instead_sound_free instead.sounds_free = instead_sounds_free instead.sound_channel = instead_sound_channel instead.sound_volume = instead_sound_volume instead.sound_panning = instead_sound_panning instead.sound_load_mem = instead_sound_load_mem instead.music_callback = instead_music_callback instead.is_sound = instead_sound function instead.get_music() return instead.__music, instead.__music_loop end function instead.set_music(mus, loop) instead.__music = mus or nil instead.__music_loop = loop or 0 end function instead.get_music_fading() return instead.__music_fadeout, instead.__music_fadein end function instead.set_music_fading(o, i) if not i then i = o end if o == 0 or not o then o = -1 end if i == 0 or not i then i = -1 end instead.__music_fadeout = o instead.__music_fadein = i end function instead.finish_music() if (instead.__music_loop or 0) == 0 then return false end instead.__music_loop = -1 return true end function instead.get_sound() return instead.__sound, instead.__sound_channel, instead.__sound_loop end function instead.add_sound(s, chan, loop) if type(s) ~= 'string' then std.err("Wrong parameter to instead.add_sound()", 2) end if type(instead.__sound) ~= 'string' then return instead.set_sound(s, chan, loop) end if std.tonum(chan) then s = s..'@'..std.tostr(chan); end if std.tonum(loop) then s = s..','..std.tostr(loop) end instead.set_sound(instead.__sound..';'..s, instead.__sound_channel, instead.__sound_loop); end function instead.set_sound(sound, chan, loop) instead.__sound = sound instead.__sound_loop = loop or 1 instead.__sound_channel = chan or -1 end function instead.stop_sound(chan, fo) local str = '@-1' if (chan and type(chan) ~= 'number') or (fo and type(fo) ~= 'number') then std.err("Wrong parameter to instead.stop_sound", 2) end if chan then str = '@'..std.tostr(chan) end if fo then str = str .. ',' .. std.tostr(fo) end return instead.add_sound(str); end function instead.stop_music() instead.set_music(nil, -1); end std.mod_done(function(_) instead.music_callback() -- halt music mixer instead.stop_music() instead.stop_sound() -- halt all -- instead.sounds_free(); end) local sounds = {} std.mod_cmd(function(_) if std 'game':time() > 0 then sounds = {} instead.set_sound(); -- empty sound end end) -- aliases local snd = { __gc = function(s) instead.sound_free(s.snd) end; __tostring = function(s) return s.snd end } snd.__index = snd; function snd:play(...) if self.snd then instead.add_sound(self.snd, ...) end end function snd:new(a, b, t) local o = { __save = function() end; } if type(a) == 'string' then o.snd = instead.sound_load(a); elseif type(t) == 'table' then o.snd = instead.sound_load_mem(a, b, t) -- hz, channel, t end -- if not o.snd then -- return -- end std.setmt(o, self) return std.proxy(o) end local sound = std.obj { nam = '@snd'; } sound.set = instead.set_sound sound.play = instead.add_sound sound.stop = instead.stop_sound sound.music = function(mus, loop) if mus == nil and loop == nil then return instead.get_music() end return instead.set_music(mus, loop) end sound.stop_music = instead.stop_music sound.music_fading = function(o, i) if o == nil and i == nil then return instead.get_music_fading() end return instead.set_music_fading(o, i) end function sound.new(...) local s = snd:new(...) std.table.insert(sounds, s) -- avoid __gc in this step return s end function sound.music_callback(...) return instead.music_callback(...) end function sound.free(key) return instead.sound_free(key); end function sound.music_playing() return instead.__music ~= nil and instead.__music_loop ~= -1 end function sound.playing(s,...) if type(s) ~= 'number' then return instead.is_sound() end return instead.sound_channel(s,...) end function sound.pan(c, l, r, ...) return instead.sound_panning(c, l, r, ...) end function sound.vol(v, ...) return instead.sound_volume(v, ...) end instead-3.2.1/stead/stead3/ext/gui.lua0000644000175000017500000002413513267071774016561 0ustar peterpeter-- sdl-instead specific methods local std = stead local instead = std.obj { nam = '@instead'; version_table = {3, 2, 0}; ini = function(s) -- after reset always do fade s.need_fading(true) end; } -- luacheck: read globals instead_clipboard -- luacheck: read globals instead_wait_use -- luacheck: read globals instead_grab_events -- luacheck: no self instead.clipboard = instead_clipboard instead.wait_use = instead_wait_use instead.grab_events = instead_grab_events function instead.atleast(...) for k, v in std.ipairs {...} do if std.type(v) ~= 'number' then return false end if v > (instead.version_table[k] or 0) then return false end if v < (instead.version_table[k] or 0) then return true end end return true end function instead.version(...) if #{...} == 0 then return instead.version_table end if not instead.atleast(...) then local v = false for _, n in std.ipairs({...}) do if std.type(n) ~= 'number' then std.err([[Wrong instead.version argument: ]]..std.tostr(n), 2) end v = (v and (v .. '.') or '').. std.tostr(n) end std.err ([[The game requires instead engine of version ]] ..(v or '???').. [[ or higher. https://instead-hub.github.io]], 2) end end function instead.need_fading(v) local ov = instead.__need_fading if v ~= nil then instead.__need_fading = v end return ov end local iface = std '@iface' local type = std.type local dict = {} instead.inv_delim = '\n' instead.hinv_delim = ' | ' instead.ways_delim = ' | ' local function get_bool(o, nam) if type(o[nam]) == 'boolean' then return o[nam] end if type(o[nam]) == 'function' then return o:nam() end return nil end instead.notitle = false instead.get_title = std.cacheable('title', function() if get_bool(instead, 'notitle') then return end return iface:fmt(iface:bold(std.titleof(stead.here())), false) end) instead.noways = false instead.get_ways = std.cacheable('ways', function() if get_bool(instead, 'noways') then return end local str = iface:cmd("way"); if str then str = std.string.gsub(str, '\n$',''); str = std.string.gsub(str, '\\?['..std.delim ..']', { [std.delim] = instead.ways_delim, [ '\\'..std.delim ] = std.delim }); return iface:center(str); end return str end) instead.noinv = false instead.get_inv = std.cacheable('inv', function(horiz) if get_bool(instead, 'noinv') then return end local str = iface:cmd("inv"); if str then str = std.string.gsub(str, '\n$',''); if not horiz then str = std.string.gsub(str, '\\?['.. std.delim ..']', { [std.delim] = instead.inv_delim, ['\\'..std.delim] = std.delim }); else str = std.string.gsub(str, '\\?['.. std.delim ..']', { [std.delim] = instead.hinv_delim, ['\\'..std.delim] = std.delim }); end end return str end) instead.nopic = false -- luacheck: push ignore savedpicture local savedpicture -- luacheck: pop instead.get_picture = std.cacheable('pic', function() if get_bool(instead, 'nopic') then return end local s = stead.call(std.here(), 'pic') if not s then s = stead.call(std.ref 'game', 'pic') end savedpicture = s -- to save picture sprite from unload return s and std.tostr(s) end) local last_picture instead.fading_value = 4 -- default fading function instead.get_fading() if not instead.fading then return false end if type(instead.fading) == 'function' and not instead.fading() then return false end return true, instead.fading_value end function instead.fading() local pic = instead.get_picture() if type(pic) == 'string' and pic:find('spr:', 1, true) == 1 then pic = 'spr:' end if std.me():need_scene() or instead.need_fading() or pic ~= last_picture then last_picture = pic return true end end function instead.get_restart() local restart = instead.__restart or false instead.__restart = nil return restart end function instead.get_menu() local menu = instead.__menu instead.__menu = nil return menu end instead.nosave = false instead.noautosave = false function instead.isEnableSave() local s = get_bool(instead, 'nosave') return not s end function instead.isEnableAutosave() if instead.get_autosave() then return true end return not get_bool(instead, 'noautosave') end function instead.autosave(slot) instead.__autosave = true instead.__autosave_slot = slot end function instead.get_autosave() return instead.__autosave or false, instead.__autosave_slot end function instead.menu(n) if n == nil then n = 'main' elseif type(n) ~= 'string' and n ~= false then n = 'toggle' end instead.__menu = n end function instead.restart(v) if v == false then v = false else v = true end instead.__restart = v end function iface:title() -- hide title return end -- luacheck: globals stat std.stat = std.class({ __stat_type = true; }, std.obj); -- luacheck: globals menu std.menu = std.class({ __menu_type = true; new = function(_, v) if type(v) ~= 'table' then std.err ("Wrong argument to std.menu:"..std.tostr(v), 2) end v = std.obj(v) -- std.setmt(v, self) return v end; inv = function(s, ...) local r, v if s.menu ~= nil then r, v = std.call(s, 'menu', ...) -- special method while in inv else r, v = std.call(s, 'act', ...) -- fallback to act end if not r and not v then return true, false -- menu mode end return r, v end; }, std.obj); std.setmt(std.phr, std.menu) -- make phrases menus std.setmt(std.ref '@', std.menu) -- make xact menu function iface:esc(str) str = str:gsub("\\?[\\<>]", { ['\\\\'] = '\\\\\\\\\\', ['>'] = iface:nb('>'), ['<'] = iface:nb('<') }) return str end function iface:xref(str, o, ...) if type(str) ~= 'string' then std.err ("Wrong parameter to iface:xref: "..std.tostr(str), 2) end if not std.is_obj(o) or std.is_obj(o, 'stat') or o:disabled() then return str end local a = { ... } local args = '' for i = 1, #a do if type(a[i]) ~= 'string' and type(a[i]) ~= 'number' and type(a[i]) ~= 'boolean' then std.err ("Wrong argument to iface:xref: "..std.tostr(a[i]), 2) end args = args .. ' '..std.dump(a[i]) end local xref = std.string.format("%s%s", std.deref_str(o), args) -- std.string.format("%s%s", iface:esc(std.deref_str(o)), iface:esc(args)) if not dict[xref] then table.insert(dict, xref) dict[xref] = #dict end xref = std.tostr(dict[xref]) if std.cmd[1] == 'way' then return std.string.format("", xref)..str.."" elseif std.is_obj(o, 'menu') or std.is_system(o) then return std.string.format("", xref)..str.."" elseif std.cmd[1] == 'inv' then return std.string.format("", xref)..str.."" end return std.string.format("", xref)..str.."" end function iface:em(str) if type(str) == 'string' then return ''..str..'' end end function iface:center(str) if type(str) == 'string' then return ''..str..'' end end function iface:just(str) if type(str) == 'string' then return ''..str..'' end end function iface:left(str) if type(str) == 'string' then return ''..str..'' end end function iface:right(str) if type(str) == 'string' then return ''..str..'' end end function iface:bold(str) if type(str) == 'string' then return ''..str..'' end end function iface:top(str) if type(str) == 'string' then return ''..str..'' end end function iface:bottom(str) if type(str) == 'string' then return ''..str..'' end end function iface:middle(str) if type(str) == 'string' then return ''..str..'' end end function iface:nb(str) if type(str) == 'string' then return "","\\>"):gsub("%^","\\^")..">"; end end function iface:anchor() return '' end function iface:img(str) if str then return "" end end; function iface:imgl(str) if str then return "" end end; function iface:imgr(str) if str then return "" end end function iface:under(str) if type(str) == 'string' then return ""..str.."" end end; function iface:st(str) if type(str) == 'string' then return ""..str.."" end end function iface:tab(str, al) if type(str) == 'number' then str = std.tostr(str) end if type(str) ~= 'string' then return end if al == 'right' then str = str .. ",right" elseif al == 'center' then str = str .. ",center" end return '' end function iface:y(str, al) if stead.tonum(str) then str = stead.tostr(str) end if stead.type(str) ~= 'string' then return nil; end if al == 'middle' then str = str .. ",middle" elseif al == 'top' then str = str .. ",top" end return '' end; function iface:input(event, ...) local input = std.ref '@input' if type(input) ~= 'table' then return end if event == 'kbd' then if type(input.key) == 'function' then return input:key(...); -- pressed, event end elseif event == 'mouse' then if type(input.click) == 'function' then return input:click(...); -- pressed, x, y, mb end elseif event == 'finger' then if type(input.finger) == 'function' then return input:finger(...); -- pressed, x, y, finger end elseif event == 'event' then if type(input.event) == 'function' then return input:event(...); end end return end local iface_cmd = iface.cmd -- save old function iface:cmd(inp) local a = std.split(inp) if a[1] == 'act' or a[1] == 'use' or a[1] == 'go' then if a[1] == 'use' then local use = std.split(a[2], ',') for i = 1, 2 do local u = std.tonum(use[i]) if u then use[i] = dict[u] end end a[2] = std.join(use, ',') elseif std.tonum(a[2]) then a[2] = dict[std.tonum(a[2])] end inp = std.join(a) end return iface_cmd(self, inp) end std.obj { -- input object nam = '@input'; }; -- some aliases menu = std.menu stat = std.stat std.mod_init(function() std.rawset(_G, 'instead', instead) require "ext/sandbox" end) std.mod_cmd(function() instead.need_fading(false) end) std.mod_step(function(state) if state then dict = {} end end) std.mod_start(function() dict = {} end) std.mod_done(function() last_picture = nil end) std.mod_save(function() instead.__autosave = nil instead.__autosave_slot = nil end) if std.rawget(_G, 'DEBUG') then require 'dbg' end instead-3.2.1/stead/stead3/ext/paths.lua0000644000175000017500000000113513267071774017107 0ustar peterpeterlocal std = stead local instead = std.ref '@instead' -- luacheck: read globals instead_savepath -- luacheck: read globals instead_gamepath -- luacheck: read globals instead_exepath -- luacheck: globals io instead.savepath = instead_savepath std.savepath = instead_savepath instead.gamepath = instead_gamepath instead.exepath = instead_exepath io.open = stead.hook(io.open, function(f, path, acc, ...) if std.type(path) == 'string' and path:sub(1, 1) ~= '/' and not (path:sub(2, 2) == ':' and path:find("^[A-Z]", 1) == 1) then path = instead.gamepath()..'/'..path end return f(path, acc, ...) end) instead-3.2.1/stead/stead3/fmt.lua0000644000175000017500000000432313267071774015760 0ustar peterpeterlocal std = stead local type = std.type local iface = std.ref '@iface' -- luacheck: globals fmt fmt = std.obj { nam = '@format'; para = false; nopara = '_'; para_space = ' '; quotes = true; dash = true; filter = nil; } std.obj { nam = '$fmt'; act = function(s, w, ...) if type(w) ~= 'string' or not fmt[w] then return w end return fmt[w](...) end } std.format = function(r, state) local utf8 = (std.ref 'game'.codepage == 'UTF-8' or std.ref 'game'.codepage == 'utf-8') if type(r) ~= 'string' then return r end if type(fmt.filter) == 'function' then r = fmt.filter(r, state) end if utf8 then if fmt.dash then r = r:gsub("%-%-%-*", { ['--'] = '—' }) r = r:gsub("[ \t]+—", iface:nb('').."—"); -- do not break dash r = r:gsub("^([^ \t]*)—[ \t]+", "%1— "); r = r:gsub("(\n[^ \t]*)—[ \t]+", "%1— "); end if fmt.quotes then r = r:gsub('_"','«'):gsub('"_',"»"); r = r:gsub('"([^"]*)"','«%1»'); r = r:gsub(',,','„'):gsub("''",'”'); end end if not state then return r end if fmt.para then r = r:gsub('\n([^\n])', '\001%1'):gsub('\001[ \t]*'..fmt.nopara,'\n'):gsub('\001[ \t]*', '\n'..iface:nb(fmt.para_space)); r = r:gsub('^[ \t]*', '\001'):gsub('\001[ \t]*'..fmt.nopara,''):gsub('\001[ \t]*', iface:nb(fmt.para_space)); end return r end function fmt.em(str) return iface:em(str) end function fmt.c(str) return iface:center(str) end function fmt.j(str) return iface:just(str) end function fmt.l(str) return iface:left(str) end function fmt.r(str) return iface:right(str) end function fmt.b(str) return iface:bold(str) end function fmt.top(str) return iface:top(str) end function fmt.bottom(str) return iface:bottom(str) end function fmt.middle(str) return iface:middle(str) end function fmt.nb(str) return iface:nb(str) end function fmt.anchor(str) return iface:anchor(str) end function fmt.img(str) return iface:img(str) end function fmt.imgl(str) return iface:imgl(str) end function fmt.imgr(str) return iface:imgr(str) end function fmt.u(str) return iface:under(str) end function fmt.st(str) return iface:st(str) end function fmt.tab(str, al) return iface:tab(str, al) end function fmt.y(str, al) return iface:y(str, al) end instead-3.2.1/stead/stead3/CMakeLists.txt0000644000175000017500000000063113267071774017225 0ustar peterpeterFILE(GLOB STEAD_FILES "*.lua") FILE(GLOB STEAD_EXT_FILES "ext/*.lua") IF(SYSTEMWIDE) INSTALL(FILES ${STEAD_FILES} DESTINATION ${STEADDIR}/stead3) INSTALL(FILES ${STEAD_EXT_FILES} DESTINATION ${STEADDIR}/stead3/ext) ELSEIF(STANDALONE) INSTALL(FILES ${STEAD_FILES} DESTINATION ${STANDALONEDIR}/stead/stead3) INSTALL(FILES ${STEAD_EXT_FILES} DESTINATION ${STANDALONEDIR}/stead/stead3/ext) ENDIF(SYSTEMWIDE) instead-3.2.1/stead/stead3/dbg-ru.lua0000644000175000017500000000301313267071774016345 0ustar peterpeterlocal kbden = { shifted = { ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = "$", ["5"] = "%", ["6"] = "^", ["7"] = "&", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", ["["] = "{", ["]"] = "}", ["\\"] = "|", [";"] = ":", ["'"] = "\"", [","] = "<", ["."] = ">", ["/"] = "?", } } local kbdru = { ["q"] = "й", ["w"] = "ц", ["e"] = "у", ["r"] = "к", ["t"] = "е", ["y"] = "н", ["u"] = "г", ["i"] = "ш", ["o"] = "щ", ["p"] = "з", ["["] = "х", ["]"] = "ъ", ["a"] = "ф", ["s"] = "ы", ["d"] = "в", ["f"] = "а", ["g"] = "п", ["h"] = "р", ["j"] = "о", ["k"] = "л", ["l"] = "д", [";"] = "ж", ["'"] = "э", ["z"] = "я", ["x"] = "ч", ["c"] = "с", ["v"] = "м", ["b"] = "и", ["n"] = "т", ["m"] = "ь", [","] = "б", ["."] = "ю", ["`"] = "ё", shifted = { ["q"] = "Й", ["w"] = "Ц", ["e"] = "У", ["r"] = "К", ["t"] = "Е", ["y"] = "Н", ["u"] = "Г", ["i"] = "Ш", ["o"] = "Щ", ["p"] = "З", ["["] = "Х", ["]"] = "Ъ", ["a"] = "Ф", ["s"] = "Ы", ["d"] = "В", ["f"] = "А", ["g"] = "П", ["h"] = "Р", ["j"] = "О", ["k"] = "Л", ["l"] = "Д", [";"] = "Ж", ["'"] = "Э", ["z"] = "Я", ["x"] = "Ч", ["c"] = "С", ["v"] = "М", ["b"] = "И", ["n"] = "Т", ["m"] = "Ь", [","] = "Б", ["."] = "Ю", ["`"] = "Ё", ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = ";", ["5"] = "%", ["6"] = ":", ["7"] = "?", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", } } return { main = kbden, alt = kbdru } instead-3.2.1/stead/stead3/snapshots.lua0000644000175000017500000000227113267071774017214 0ustar peterpeter-- luacheck: globals snapshots local std = stead local SNAPSHOT = false local INWRITE = false local snap = std.obj { nam = '@snapshots'; data = {}; save = function(s, ...) if INWRITE then return end return std.obj.save(s, ...) end; write = function(s, name) name = name or 'default' local fp = { -- fake file object data = ''; write = function(self, str) self.data = self.data .. str end; } INWRITE = true std:save(fp) INWRITE = false s.data[name] = fp.data end; make = function(_, name) SNAPSHOT = name or 'default' end; exists = function(s, name) name = name or 'default' return s.data[name] end; remove = function(s, name) name = name or 'default' s.data[name] = nil end; restore = function(s, name) -- like std:load() name = name or 'default' if not s:exists(name) then return false end std:reset() std.ref 'game':__ini() local f, err = std.eval(s.data[name]) if not f then std.err(err, 2) end f(); std.ref 'game':__ini() std.ref 'game':__start(true) return std.nop() end; } snapshots = snap std.mod_cmd(function() if SNAPSHOT then snap:write(SNAPSHOT) SNAPSHOT = nil end end) -- std.mod_done(function() -- end) instead-3.2.1/stead/stead3/dlg.lua0000644000175000017500000001632113267071774015741 0ustar peterpeter-- luacheck: read globals iface local std = stead local type = std.type local table = std.table std.phrase_prefix = '-- ' std.phrase_show = true local function phr_prefix(d, nr) if type(std.phrase_prefix) == 'string' then d = std.phrase_prefix .. d elseif type(std.phrase_prefix) == 'function' then d = std.phrase_prefix(nr) .. d end return d end std.dlg = std.class({ __dlg_type = true; new = function(s, v) if v.current == nil then v.current = false end v.dlg_enter = v.enter v.enter = nil v.__stack = {} if type(v.phr) == 'table' then if not v.obj then v.obj = {} end if type(v.obj) == 'table' then table.insert(v.obj, 1, v.phr) end end v = std.room(v) std.setmt(v, s) v:__recreate() return v end; __recreate = function(s) for i = 1, #s.obj do if not std.is_obj(s.obj[i]) then s.obj[i] = std.phr(s.obj[i]) end end end; with = function(self, ...) std.room.with(self, ...) self:__recreate() return self end; scene = function(s) local title, dsc, lact title = iface:title(std.titleof(s)) dsc = std.call(s, 'dsc') if not std.me():moved() then s.__lact = std.game:lastreact() or s.__lact lact = iface:em(s.__lact) end return std.par(std.scene_delim, title or false, lact or false, dsc) end; ph_onact = function(_, w) -- show dsc by default if not std.phrase_show then return end local r, v = std.call(w, 'dsc') if type(r) == 'string' then return phr_prefix(r) end return r, v end; empty = function(s, w) if not w then if not s.current then return true end return s.current:empty() end w = s:lookup(w) if not w then return true end return w:empty() end; enter = function(s, ...) s.__llact = false s.__stack = {} s.current = nil s:for_each(function(self) self:open() end) -- open all phrases local r, v = std.call(s, 'dlg_enter', ...) if std.here() ~= s or #s.__stack > 0 then return r, v end local rr, vv = s:push(s.current) if not vv then std.err("Wrong dialog: "..std.tostr(s), 2) end return std.par(std.scene_delim, r or false, rr or false), v end; push = function(s, p) local c = s.current local r = s:select(p) local t if r ~= false then if c then table.insert(s.__stack, c) end if r.dsc ~= nil and r.ph_act == nil and r.next == nil then -- no rection t = std.call(r, 'dsc') end if s.current ~= r or std.me():moved() then return t end if r:empty() then local tt, vv = s:pop() t = std.par(std.scene_delim, t or false, tt or false) if not vv then tt = std.walkout(s:from()) t = std.par(std.scene_delim, t or false, tt or false) end end end return t, r ~= false end; reset = function(s, phr) s.__stack = {} return s:push(phr) end; pop = function(s, phr) if #s.__stack == 0 then return false end if phr then local l = {} for i = 1, #s.__stack do table.insert(l, s.__stack[i]) if s.stack[i] == phr then break end end s.__stack = l end local p while #s.__stack > 0 do p = table.remove(s.__stack, #s.__stack) -- remove top p = s:select(p) if not p then return false end if p:empty() then local r, v = std.call(p, 'onempty') if v then return r, p end else return false, p end end return false end; select = function(s, p) if #s.obj == 0 then return false end if not p then -- get first one p = s.obj[1] end local c = s:lookup(p) if not c then std.err("Wrong dlg:select argumant: "..std.tostr(p), 2) end c:select() -- if c:disabled() then -- select always enables phrase -- c:enable() -- end s.current = c return c end; srch = function(s, w) local oo = s.current -- lookup in current if not oo then return end local r, l, i = s:lookup(w) if not r then return end if not std.is_obj(r, 'phr') then -- simple object return std.room.srch(s, w) end w = oo.obj:for_each(function(v) -- aliases v = v:__alias() if not v:visible() then return end if v == r then return v end end) if not w then return end return r, l, i end; display = function(s) local deco = std.call(s, 'decor'); -- static decorations return std.par(std.scene_delim, deco or false, s:ph_display()) end; ph_display = function(s) local r, nr nr = 1 local oo = s.current if not oo then -- nothing to show return end oo:select() -- to recheck all for i = 1, #oo.obj do local o = oo.obj[i] o = o:__alias() if o:visible() then if r then r = r .. '^' end local d = std.call(o, 'dsc') if type(d) == 'string' then d = phr_prefix(d, nr) d = o:__xref(d, true) r = (r or '').. d nr = nr + 1 end end end return r end; }, std.room) std.phr = std.class({ __phr_type = true; new = function(s, t) local disabled local a = t local o = { obj = {} } for i = 1, #a do local v = a[i] if i == 1 and type(v) == 'boolean' then if not v then disabled = true else o.always = true end elseif type(v) == 'table' then if not std.is_obj(v, 'phr') then v = s:new(v) end table.insert(o.obj, v) elseif o.tag == nil and v ~= nil and std.is_tag(v) then o.tag = v elseif o.dsc == nil and v ~= nil then o.dsc = v elseif o.act == nil and v ~= nil then o.act = v end end for k, v in std.pairs(a) do if type(k) == 'string' then o[k] = v end end -- if o.act == nil then -- std.err("Wrong phrase (no act)", 2) -- end o.ph_act = o.act o.act = nil disabled = disabled or (o.hidden == true) o = std.obj(o) std.setmt(o, s) if disabled then o = o:disable() end return o end, __alias = function(s) if s.alias ~= nil then local ss = std.here():lookup(s.alias) if not std.is_obj(ss) then std.err("Wrong alias: "..std.tostr(s.alias), 3) end s = ss end return s end; check = function(s) -- s = s:__alias() if type(s.cond) == 'function' then if s:cond() then s:enable() else s:disable() end end end; empty = function(s) for i = 1, #s.obj do local o = s.obj[i] if not o:disabled() and not o:closed() then return false end end return true end; visible = function(s) return not s:disabled() and not s:closed() end; act = function(s, ...) local r, _ local n = s -- s = s:__alias() local onact, v = std.call(std.here(), 'ph_onact', s) if not v then return onact end local w = s:where() if w and w.only then -- only one choice for i = 1, #w.obj do local o = w.obj[i] if not o.always then o:close() end end elseif not s.always then s:close() end local cur = std.here().current r, _ = std.call(s, 'ph_act', ...) r = std.par(std.scene_delim, onact or false, r or false) if std.me():moved() or cur ~= std.here().current then return r, v end if std.is_tag(s.next) then n = s.next end cur:select() -- conditions local t local rr, vv = std.here():push(n) if not vv then t = std.walkout(std.here():from()) end return std.par(std.scene_delim, r or false, rr or false, t or false), v end, select = function(s) if not s.always then s:close() end for i = 1, #s.obj do local o = s.obj[i] o = o:__alias() o:check() end end; }, std.obj) instead-3.2.1/stead/stead3/sprite.lua0000644000175000017500000000013513267071774016475 0ustar peterpeter-- luacheck: globals sprite pixels sprite = stead.ref '@sprite' pixels = stead.ref '@pixels' instead-3.2.1/stead/stead3/keys.lua0000644000175000017500000000212213267071774016140 0ustar peterpeterlocal std = stead local input = std.ref '@input' -- luacheck: globals keys keys = std.obj { nam = '@keys'; { __alt = false; __ctrl = false; __shift = false; __state = {}; }; state = function(s, key) return s.__state[key] or false end; event = function(s, press, key) if key:find 'alt' then key = 'alt' elseif key:find 'ctrl' then key = 'ctrl' elseif key:find 'shift' then key = 'shift' end s.__state[key] = press end; -- luacheck: no unused args filter = function(s, press, key) -- luacheck: unused args return false end } function input:key(press, key) local a keys:event(press, key) if not keys:filter(press, key) then return end for _, v in std.ipairs {press, key} do a = (a and (a..', ') or ' ') .. std.dump(v) end return '@key'.. (a or '') end std.mod_cmd(function(cmd) if cmd[1] ~= '@key' then return end local r, v r, v = std.call(std.here(), 'onkey', cmd[2], cmd[3]) if not r and not v then r, v = std.call(std.game, 'onkey', cmd[2], cmd[3]) end if not r and not v then -- nothing todo return nil, false end return r, v end) instead-3.2.1/stead/stead3/click.lua0000644000175000017500000000155213267071774016260 0ustar peterpeterlocal std = stead local input = std.ref '@input' -- luacheck: globals click click = std.obj { nam = '@click'; -- luacheck: no unused args filter = function(s, press, btn, x, y, px, py) -- luacheck: unused args return press and px end } function input:click(press, btn, x, y, px, py) local a if not click:filter(press, btn, x, y, px, py) then return end for _, v in std.ipairs {press, btn, x, y, px, py} do a = (a and (a..', ') or ' ') .. std.dump(v) end return '@click'.. (a or '') end std.mod_cmd(function(cmd) if cmd[1] ~= '@click' then return end local r, v r, v = std.call(std.here(), 'onclick', cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) if not r and not v then r, v = std.call(std.game, 'onclick', cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) end if not r and not v then -- nothing todo return nil, false end return r, v end) instead-3.2.1/stead/stead3/prefs.lua0000644000175000017500000000175013267071774016312 0ustar peterpeter-- luacheck: globals prefs local std = stead local preferences = std.obj { nam = '@prefs', load = function(_) local name = std.savepath() .. '/prefs'; local f, err = std.loadfile(name); if not f then return false, err end local strict = std.nostrict; std.nostrict = true f(); std.nostrict = strict return true end, store = function(s) return s:save() end, save = function(s) -- save prefs on every save local name = std.savepath() .. '/prefs'; local name_tmp = name..'.tmp' local fp, _ = std.io.open(name_tmp, "wb"); if not fp then return false end std.obj.save(s, fp, 'std "@prefs"') fp:flush(); fp:close(); std.os.remove(name) return std.os.rename(name_tmp, name); end, purge = function(_) local name = std.savepath() .. '/prefs'; return std.os.remove(name); end }; local loaded std.mod_start(function() loaded = prefs:load() end) std.mod_done(function() if loaded then prefs:store() loaded = false end end) prefs = preferences instead-3.2.1/stead/stead3/stead.lua0000644000175000017500000016564613267071774016312 0ustar peterpeter-- STEAD3 API -- luacheck: globals iface init start stead -- luacheck: read globals DEBUG doencfile instead_readdir instead_random table_get_maxn instead_srandom stead = { space_delim = ' ', scene_delim = '^^', delim = '|', call_top = 0, call_ctx = { txt = nil, self = nil }, objects = {}; tags = {}; next_dynamic = -1; max_dynamic = 32767; tables = {}; functions = {}; modules = {}; includes = {}; tostr = tostring; tonum = tonumber; type = type; setmt = setmetatable; getmt = getmetatable; table = table; math = math; newproxy = newproxy; pairs = pairs; ipairs = ipairs; rawset = rawset; rawget = rawget; rawequal = rawequal; pcall = pcall; io = io; os = os; readdir = instead_readdir, string = string; next = next; loadfile = loadfile; dofile = dofile; doencfile = doencfile; getinfo = debug.getinfo; __mod_hooks = {}; files = {}; busy = function() end; debug_xref = true; debug_save = false; random = instead_random; randomseed = instead_srandom; } local std = stead std.strip_call = true local error = error function std.err(msg, lev) if std.noerror then std.dprint(msg) else error(msg, lev) end end function std.dprint(...) local a = { ... } for i = 1, #a do if i ~= 1 then std.io.stderr:write(' ') end std.io.stderr:write(std.tostr(a[i])) end std.io.stderr:write('\n') std.io.stderr:flush() end std.rnd = function(...) if std.random then return std.random(...) end return std.math.random(...); end std.rnd_seed = function(...) std.math.randomseed(...) if std.randomseed then return std.randomseed(...) end end function stead:abort() self.abort_cmd = true end function stead.savepath() return "./" end local table = std.table local pairs = std.pairs local ipairs = std.ipairs local string = std.string local rawset = std.rawset local rawget = std.rawget local type = std.type local io = std.io; if _VERSION == "Lua 5.1" then std.eval = loadstring std.unpack = unpack std.proxy = function(o) local oo = std.newproxy(true) local t = std.getmt(oo) t.__index = o t.__newindex = o t.__gc = function(_) o:__gc() end t.__tostring = function(_) return o:__tostring() end o.__proxy_type = true return oo end else std.proxy = function(o) o.__proxy_type = true return o end std.eval = load std.unpack = table.unpack table.maxn = table_get_maxn string.gfind = string.gmatch -- luacheck: push ignore math math.mod = math.fmod math.log10 = function(a) return std.math.log(a, 10) end end math.round = function(num, n) local m = 10 ^ (n or 0) return std.math.floor(num * m + 0.5) / m end -- luacheck: pop local function __mod_callback_reg(f, hook, prio) if type(f) ~= 'function' then std.err ("Wrong parameter to mod_"..hook..".", 3); end if prio and type(prio) ~= 'number' then std.err ("Wrong prio parameter to mod_"..hook..".", 3); end if not std.__mod_hooks[hook] then std.__mod_hooks[hook] = {} end local i = { fn = f, prio = prio, unload = std.__in_include } table.insert(std.__mod_hooks[hook], i); std.sort(std.__mod_hooks[hook], function (a, b) a = a.prio or 0 b = b.prio or 0 if a == b then return nil end return a < b end) -- f(); end function std.mod_unload() local new = {} for k, v in pairs(std.__mod_hooks) do local list = {} for _, vv in ipairs(v) do if not vv.unload then table.insert(list, vv) end end new[k] = list end std.__mod_hooks = new end function std.mod_call(hook, ...) if not std.__mod_hooks[hook] then return end for _, v in ipairs(std.__mod_hooks[hook]) do local a, b = v.fn(...) if a ~= nil or b ~= nil then return a, b end end end function std.mod_call_rev(hook, ...) if not std.__mod_hooks[hook] then return end for i = #std.__mod_hooks[hook], 1, -1 do local v = std.__mod_hooks[hook][i] local a, b = v.fn(...) if a ~= nil or b ~= nil then return a, b end end end function std.mod_init(f, ...) __mod_callback_reg(f, 'init', ...) if std.initialized then -- require from game f(...) end end function std.mod_done(f, ...) __mod_callback_reg(f, 'done', ...) end function std.mod_start(f, ...) __mod_callback_reg(f, 'start', ...) end function std.mod_cmd(f, ...) __mod_callback_reg(f, 'cmd', ...) end function std.mod_step(f, ...) __mod_callback_reg(f, 'step', ...) end function std.mod_save(f, ...) __mod_callback_reg(f, 'save', ...) end function std.hook(o, f) local ff if type(o) ~= 'function' then ff = function() return o end else ff = o end return function(...) return f(ff, ...) end end local substs local function xref_prep(str) local oo, self local a = {} local s = str local i = s:find('\001', 1, true) if not i then return str end oo = std.strip(s:sub(1, i - 1)) s = s:sub(i + 1) if oo:find('@', 1, true) == 1 or oo:find('$', 1, true) then -- call '@' obj (aka xact) or '$' aka subst local o = std.split(oo)[1] local ii = oo:find("[ \t]") if ii then a = std.strip(oo:sub(ii)) a = std.cmd_parse(a) end self = std.ref(o) else if oo:find("^# [0-9-]+") then self = std.ref(std.tonum(oo:sub(3))) elseif std.is_tag(oo) then -- #tag? self = std.here():lookup(oo) else self = std.ref(oo) end end if not std.is_obj(self) then if std.debug_xref then std.err("Wrong object in xref: "..std.tostr(oo), 2) else std.dprint("Wrong xref: "..std.tostr(oo)) return s end end if type(self.nam) == 'string' and self.nam:find('$', 1, true) == 1 then -- subst table.insert(a, s) substs = true local r, v = std.method(self, 'act', std.unpack(a)) if not v then return s end return std.tostr(r) end return iface:xref(s, self, std.unpack(a)); end local fmt_refs local function fmt_prep(str) local s = str:gsub("^{", ""):gsub("}$", "") s = s:gsub('\\?['..std.delim..']', { [std.delim] = '\001' }); local l = s:find('\001', 1, true) if l == 1 then return str end if not l then s = s .. '\001' end l = s:find('\001', 1, true) table.insert(fmt_refs, s:sub(1, l - 1)) local n = string.format("%d%s", #fmt_refs, std.delim) return "{"..n..s:sub(l + 1).."}" end local function fmt_post(str) local s = str:gsub("^{", ""):gsub("}$", ""):gsub('\\?['..std.delim..']', { [std.delim] = '\001' } ); local l = s:find('\001') if not l or l == 1 then return str end local n = std.tonum(s:sub(1, l - 1)) or 0 if not fmt_refs[n] then return str end s = fmt_refs[n]..s:sub(l) return xref_prep(std.unesc(s)) end function std.for_each_xref_outer(s, fn) local orig = s s = string.gsub(s, '\\?[\\{}]', { ['{'] = '\001', ['}'] = '\002', [ '\\{' ] = '\\{', [ '\\}' ] = '\\}' }); local start while true do start = s:find('\001') if not start then break end local idx = 1 local n = start while idx > 0 do n = s:find('[\001\002]', n + 1) if not n then break end if s:sub(n, n) == '\001' then idx = idx + 1 else idx = idx - 1 end end if idx == 0 then local new = fn(s:sub(start, n):gsub('[\001\002]', {['\001'] = '{', ['\002'] = '}'})) if start == 1 then s = new..s:sub(n + 1) else s = s:sub(1, start - 1)..new..s:sub(n + 1) end else std.err("Unpaired '{' in:"..std.tostr(orig), 2) break end end s = s:gsub('[\001\002]', { ['\001'] = '{', ['\002'] = '}' }); return s end function std.for_each_xref(s, fn) s = string.gsub(s, '\\?[\\{}]', { ['{'] = '\001', ['}'] = '\002', [ '\\{' ] = '\\{', [ '\\}' ] = '\\}' }); local function prep(str) str = str:gsub("[\001\002]", "") str = fn('{'..str..'}') return str end s = string.gsub(s, '(\001[^\001\002]+\002)', prep) s = s:gsub('[\001\002]', { ['\001'] = '{', ['\002'] = '}' }); return s end std.fmt = function(str, fmt, state) if type(str) ~= 'string' then return end local s = str s = string.gsub(s, '[\t \n]+', std.space_delim); s = string.gsub(s, '\\?[\\^]', { ['^'] = '\n', ['\\^'] = '^'} ):gsub("\n[ \t]+", "\n") while true do fmt_refs = {} substs = false s = std.for_each_xref(s, fmt_prep) -- rename all {} if type(fmt) == 'function' then s = fmt(s, state) end s = std.for_each_xref(s, fmt_post) -- rename and xref if not substs then break end end s = s:gsub('\\?'..'[{}]', { ['\\{'] = '{', ['\\}'] = '}' }) if state then s = s:gsub('\\?'..std.delim, { ['\\'..std.delim] = std.delim }) end return s end local lua_keywords = { ["and"] = true, ["break"] = true, ["do"] = true, ["else"] = true, ["elseif"] = true, ["end"] = true, ["false"] = true, ["for"] = true, ["function"] = true, ["goto"] = true, ["if"] = true, ["in"] = true, ["local"] = true, ["nil"] = true, ["not"] = true, ["or"] = true, ["repeat"] = true, ["return"] = true, ["then"] = true, ["true"] = true, ["until"] = true, ["while"] = true, } std.setmt(stead, { __call = function(_, k) return std.ref(k) end; }) function std.is_system(v) if not std.is_obj(v) then return false end local n = v.nam if type(n) == 'string' then if n:byte(1) == 0x40 or n:byte(1) == 0x24 then return true end end return false end function std.is_obj(v, t) if type(v) ~= 'table' then return false end return v['__'..(t or 'obj')..'_type'] end function std.class(self, inh) -- self.__parent = function(s) -- return inh -- end; self.nam = '*class*'; self.__call = function(v, n, ...) if std.is_obj(v) and type(n) == 'string' then -- variable access return function(val) if std.game then rawset(v.__var, n, true) rawset(v.__ro, n, nil) return rawset(v, n, val or false) end return rawset(v.__ro, n, val or false) end end n = v:new(n, ...) std.setmt(n, v) return n end; self.__tostring = function(s) if not std.is_obj(s) then local os = self.__tostring self.__tostring = nil local t = std.tostr(s) self.__tostring = os return t end return std.dispof(s) end; self.__pow = function(s, b) if type(b) == 'string' or type(b) == 'number' then if std.is_tag(b) then return std.rawequal(s.tag, b) else return std.rawequal(s.nam, b) end end return std.rawequal(s, b) end; self.__dirty = function(s, v) local o = rawget(s, '__dirty_flag') if v ~= nil then if std.game then rawset(s, '__dirty_flag', v) end return s end return o end; self.__index = function(t, k) local ro = type(rawget(t, '__ro')) == 'table' and t.__ro local v if ro then v = rawget(ro, k) end if v == nil then return self[k] end if ro and std.game and type(v) == 'table' then -- make rw if simple table if type(v.__dirty) ~= 'function' then t.__var[k] = true rawset(t, k, v) ro[k] = nil end end return v end; self.__newindex = function(t, k, v) local ro = std.is_obj(t) and t.__ro if ro and not std.game then rawset(ro, k, v) return end t:__dirty(true) if ro then if (type(v) == 'function' and not std.functions[v]) then std.err("Wrong variable operation: "..std.tostr(k).. " at "..std.tostr(t), 2) end if std.nostrict or (type(k) == 'string' and k:find('^__')) or t.__var[k] or ro[k] ~= nil then t.__var[k] = true else std.err("Set unitialized variable: "..std.tostr(k).." at "..std.tostr(t), 2) end ro[k] = nil end if std.is_obj(v, 'list') and std.is_obj(t) then v:attach(t) end rawset(t, k, v) end std.setmt(self, inh or { __call = self.__call }) return self end function std.is_tag(n) return type(n) == 'string' and n:byte(1) == 0x23 end function std.sort(t, fn) local prio = {} local v for i = 1, #t do v = t[i] prio[i] = { v = v, i = i } end table.sort(prio, function(a, b) local r = fn(a.v, b.v) if type(r) == 'boolean' then return r end return a.i < b.i end) for i = 1, #prio do t[i] = prio[i].v end end std.list = std.class { __list_type = true; new = function(_, v) if type(v) ~= 'table' then std.err ("Wrong argument to std.list:"..std.tostr(v), 2) end if std.is_obj(v, 'list') then -- already list return v end v.__list = {} -- where is attached -- std.setmt(v, s) return v end; __ini = function(s, o) for i = 1, #s do local k = s[i] s[i] = std.ref(k) if not std.is_obj(s[i]) then if not o then std.err("Wrong item in list: "..std.tostr(k), 2) else std.err("Wrong item in list: "..std.tostr(k).." in "..std.dispof(o), 2) end end s:__attach(s[i]) end if o then s:attach(o) end s:sort() end; sort = function(s) std.sort(s, function(a, b) local p1 = std.tonum(a.pri) or 0 local p2 = std.tonum(b.pri) or 0 if p1 == p2 then return nil end return p1 < p2 end) end; display = function(s) local r for i = 1, #s do if r then r = r .. std.space_delim end local o = s[i] if o:visible() then local disp = o:display() local d = o:__xref(disp) if type(d) == 'string' then r = (r or '').. d end if not o:closed() then d = o.obj:display() if type(d) == 'string' then r = (r and (r .. std.space_delim) or '') .. d end end end end return r end; disable = function(s) for i = 1, #s do s[i]:disable() end end; enable = function(s) for i = 1, #s do s[i]:enable() end end; close = function(s) for i = 1, #s do s[i]:close() end end; open = function(s) for i = 1, #s do s[i]:open() end end; attach = function(s, o) -- attach to object s:detach(o) table.insert(s.__list, o) end; detach = function(s, o) -- detach from object for i = 1, #s.__list do if s.__list[i] == o then table.remove(s.__list, i) break end end end; __attach = function(s, o) -- attach object to list s:__detach(o) table.insert(o.__list, s) end; __detach = function(s, o) -- detach object from list for i = 1, #o.__list do if o.__list[i] == s then table.remove(o.__list, i) break end end end; add = function(s, n, pos) local o = s:lookup(n) if o then return o -- already here end if not pos then o = std.ref(n) if not o then std.err("Wrong argument to list:add(): "..std.tostr(n), 2) end s:__dirty(true) s:__attach(o) table.insert(s, o) s:sort() return o end if type(pos) ~= 'number' then std.err("Wrong parameter to list.add:"..std.tostr(pos), 2) end if pos > #s then pos = #s elseif pos < 0 then pos = #s + pos + 1 end if pos <= 0 then pos = 1 end o = std.ref(n) s:__dirty(true) s:__attach(o) if pos then table.insert(s, pos, o) else table.insert(s, o) end s:sort() return o end; for_each = function(s, fn, ...) if type(fn) ~= 'function' then std.err("Wrong parameter to list:for_each: "..std.tostr(fn), 2) end for i = 1, #s do local r, v = fn(s[i], ...) if r ~= nil or v ~= nil then return r, v end end end; lookup = function(s, n) local o, tag if std.is_tag(n) then tag = n else o = std.ref(n) end for i = 1, #s do if s[i] == o or (tag and s[i].tag == tag) then return s[i], i end end end; srch = function(s, n) local o, i = s:lookup(n) if not o or not o:visible() then return end return o, i end; empty = function(s) return (#s == 0) end; cat = function(s, from, pos) if not std.is_obj(from, 'list') then std.err("Wrong argument to list:cat(): "..std.tostr(from), 2) end if not pos then pos = #s + 1 end for _, v in ipairs(from) do s:add(v, pos) pos = pos + 1 end return s end; zap = function(s) -- delete all objects local l = {} for i = 1, #s do table.insert(l, s[i]) end for i = 1, #l do s:del(l[i]) end return s end; del = function(s, n) local o, i = s:lookup(n) if i then s:__dirty(true) s:__detach(o) table.remove(s, i) s:sort() return o, i end end; replace = function(s, n, w) local o, i = s:del(n) if o then return s:add(w, i) end end; __dump = function(s, recurse) local rc for i = 1, #s do local v = s[i] if std.is_obj(v) and v:visible() then local vv, n if type(v.nam) == 'number' then n = '# '..std.tostr(v.nam) else n = v.nam end local disp = std.dispof(v) if disp then if rc then rc = rc .. std.delim else rc = '' end vv = '{'..std.esc(n)..std.delim..std.esc(disp)..'}' rc = rc .. vv end if recurse and not v:closed() then vv = v:__dump(recurse) if vv then if rc then rc = rc .. std.delim else rc = '' end rc = rc .. vv end end end end return rc end; __save = function(s, fp, n) if not s:__dirty() then return end fp:write(string.format("%s = std.list { ", n)) for i = 1, #s do local vv = std.deref(s[i]) if not vv then std.err ("Can not do deref on: "..std.tostr(s[i]), 2) end if i ~= 1 then fp:write(string.format(", ")) end if type(vv) == 'number' then fp:write(string.format("%d", vv)) else fp:write(string.format("%q", vv)) end end fp:write(" }:__dirty(true)\n") end; } std.save_var = function(vv, fp, n) if type(vv) == 'boolean' or type(vv) == 'number' then fp:write(string.format("%s = ", n)) fp:write(std.tostr(vv)..'\n') elseif type(vv) == 'string' then fp:write(string.format("%s = ", n)) fp:write(string.format("%q\n", vv)) elseif type(vv) == 'function' then if std.functions[vv] and std.functions[vv] ~= n then local k = std.functions[vv] fp:write(string.format("%s = %s\n", n, k)) else std.err("Can not save variable (function): "..n, 2) end elseif type(vv) == 'table' then if std.tables[vv] and std.tables[vv] ~= n then local k = std.tables[vv] fp:write(string.format("%s = %s\n", n, k)) elseif std.is_obj(vv) then local d = std.deref(vv) if not d then std.err("Can not deref object:"..std.tostr(vv), 2) end fp:write(string.format("%s = ", n)) if type(d) == 'string' then fp:write(string.format("std %q\n", d)) else fp:write(string.format("std(%d)\n", d)) end elseif type(vv.__save) == 'function' then vv:__save(fp, n) else fp:write(string.format("%s = %s\n", n, std.dump(vv, true))) -- std.save_table(vv, fp, n) end elseif vv == nil then fp:write(string.format("%s = nil\n", n)) elseif type(vv) == 'userdata' and type(vv.__save) == 'function' then vv:__save(fp, n) else std.err("Can not save var: "..n, 2) end end std.save_members = function(vv, fp, n) local l for k, v in pairs(vv) do if type(k) == 'number' then l = string.format("%s%s", n, std.varname(k)) std.save_var(v, fp, l) elseif type(k) == 'string' then l = string.format("%s%s", n, std.varname(k)) std.save_var(v, fp, l) end end end std.save_table = function(vv, fp, n) fp:write(string.format("%s = {}\n", n)) std.save_members(vv, fp, n) end function std:reset(fn) -- reset state local reset if std.ref 'game'.__started or fn then self:done() self:init() reset = true end if fn ~= 'main3.lua' then std.startfile = fn -- another start file end if reset then std.dofile(fn or 'main3.lua') end end function std:load(fname) -- load save self:reset() std.ref 'game':__ini() local f, err = std.loadfile(fname) -- load all diffs if not f then std.err(err, 2) end local strict = std.nostrict; std.nostrict = true; if DEBUG then std.noerror = true local st, r = std.pcall(f) if not st then std.dprint(r) end std.noerror = false else f(); end std.nostrict = strict std.ref 'game':__ini() std.ref 'game':__start(true) return self.game:lastdisp() end local function in_section(name, fn) name = "__in_"..name local old = std[name] std[name] = true local r, v = fn() std[name] = old or false return r, v end function std.gamefile(fn, reset) -- load game file if type(fn) ~= 'string' then std.err("Wrong paramter to stead:file: "..std.tostr(fn), 2) end if not fn:find("%.lua$") then fn = fn .. '.lua' end if reset then std:reset(fn) std.ref 'game':__ini() local r, v = std.ref 'game':__start() if type(r) == 'string' and std.cctx() then std.pr(r) end return r, v end std.game = nil in_section ('gamefile', function() std.dofile(fn) end) std.ref 'game':__ini() table.insert(std.files, fn) -- remember it end -- luacheck: no self function std:save(fp) local close if type(fp) == 'string' then fp = io.open(fp, "wb"); if not fp then return nil, false -- can create file end close = true end local n if std.type(std.savename) == 'function' then n = std.savename() end if std.type(n) == 'string' then fp:write("-- $Name: "..n:gsub("\n","\\n").."$\n"); end fp:write("local std = stead\n"); -- reset if std.startfile then fp:write(string.format("std:reset(%q)\n", std.startfile)) fp:write(string.format("std 'game':ini()\n")) end -- files for i = 1, #std.files do fp:write(string.format("std.gamefile(%q)\n", std.files[i])) end std.busy(true) std.for_each_obj(function(v) if v.__dynamic then std.busy(true) v:save(fp, string.format("std(%s)", std.deref_str(v))) end end) std.mod_call('save', fp) std.for_each_obj(function(v) if not v.__dynamic then std.busy(true) v:save(fp, string.format("std(%s)", std.deref_str(v))) end end) if close then fp:flush(); fp:close(); end std.busy(false) return std.game:lastdisp() -- same scene end local rnd_seed = 1980 + 1978 function std:init() std.rawset(_G, 'iface', std.ref '@iface') -- force iface override std.world { nam = 'game', player = 'player', codepage = 'UTF-8', dsc = [[STEAD3, 2018 by Peter Kosyh^https://instead-hub.github.io^^]] }; std.room { nam = 'main' } std.player { nam = 'player', room = 'main' } rnd_seed = (std.os.time(stead.os.date("*t")) + rnd_seed) std.rnd_seed(rnd_seed) std.mod_call('init') -- init modules std.initialized = true end function std:done() std.mod_call_rev('done') std.mod_unload() -- unload hooks from includes local objects = {} std.for_each_obj(function(v) local k = std.deref(v) if std.is_system(v) then objects[k] = v -- else -- print("Deleting "..k) end end) std.objects = objects std.tags = {} std.next_dynamic = -1 std.files = {} std.startfile = false -- std.modules = {} std.includes = {} std.initialized = false std.game = nil std.rawset(_G, 'init', nil) std.rawset(_G, 'start', nil) end -- luacheck: self function std.for_all(fn, ...) if type(fn) ~= 'function' then std.err("Wrong 1-st argument to for_all(): "..std.tostr(fn), 2) end local a = {...} for i = 1, #a do fn(a[i]) end end function std.for_each_obj(fn, ...) local oo = std.objects for _, v in pairs(oo) do if std.is_obj(v) then local a, b = fn(v, ...) if a ~= nil and b ~= nil then return a, b end end end end function std.dirty(o) if type(o) ~= 'table' or type(o.__dirty) ~= 'function' then return false end return o:__dirty() end function std.deref_str(o) local k = std.deref(o) if type(k) == 'number' then return std.tostr(k) elseif type(k) == 'string' then return std.string.format("%q", k) end return end function std.varname(k) if type(k) == 'number' then return string.format("[%d]", k) elseif type(k) == 'string' then if not lua_keywords[k] then return string.format(".%s", k) else return string.format("[%q]", k) end end end local function next_dynamic(n) if n then std.next_dynamic = n end std.next_dynamic = std.next_dynamic - 1 if std.next_dynamic < -std.max_dynamic then std.next_dynamic = - 1 end return std.next_dynamic end local function dyn_name() local oo = std.objects if not oo[std.next_dynamic] then local n = std.next_dynamic next_dynamic() return n end local on = std.next_dynamic local n = next_dynamic() while oo[n] and n ~= on do n = n - 1 if n < -std.max_dynamic then n = -1 end end if oo[n] then std.err("No free ids for dynamic objects", 2) end next_dynamic(n) return n end local function tag_name(t) local oo = std.objects local tt = std.tags[t] or {} local n = t:sub(2) .. '#'..std.tonum(#tt) if oo[n] then return #oo + 1 end -- collision table.insert(tt, n) std.tags[t] = tt return n end std.obj = std.class { __obj_type = true; type = function(self, t) return std.is_obj(self, t) end; with = function(self, ...) local a = {...} for i = 1, #a do if type(a[i]) == 'table' then for k = 1, #a[i] do table.insert(self.obj, a[i][k]) end else table.insert(self.obj, a[i]) end end return self end; new = function(self, v) if std.game and not std.__in_new and not std.__in_gamefile then std.err ("Use std.new() to create dynamic objects:"..std.tostr(v), 2) end local oo = std.objects if type(v) ~= 'table' then std.err ("Wrong argument to std.obj:"..std.tostr(v), 2) end if std.is_tag(v.nam) then rawset(v, 'tag', v.nam) rawset(v, 'nam', nil) end if v.nam == nil then if std.__in_new then rawset(v, 'nam', dyn_name()) elseif std.is_tag(v.tag) then rawset(v, 'nam', tag_name(v.tag)) else rawset(v, 'nam', #oo + 1) end rawset(v, '__autoname', true) elseif type(v.nam) ~= 'string' and type(v.nam) ~= 'number' then std.err ("Wrong .nam in object.", 2) -- elseif type(v.nam) == 'string' and v.nam:find('#[0-9]+$') then -- std.err ("You can not use # in object name: "..v.nam, 2) end if oo[v.nam] and not std.is_system(oo[v.nam]) then if v.nam ~= 'main' and v.nam ~= 'player' and v.nam ~= 'game' then std.err ("Duplicated object: "..v.nam, 2) end end local ro = {} local vars = {} local raw = {} for i = 1, #v do if type(v[i]) ~= 'table' then std.err("Wrong declaration: "..std.tostr(v[i]), 2) end local var = (v[i].__var_type == true) -- raw or var mode for key, val in pairs(v[i]) do if type(key) ~= 'string' then std.err("Wrong var name: "..std.tostr(key), 2) end raw[key] = not var rawset(v, key, val) end end for _ = 1, #v do table.remove(v, 1) end if not v.obj then rawset(v, 'obj', {}) end if type(v.obj) ~= 'table' then std.err ("Wrong .obj attr in object:" .. v.nam, 2) end v.obj = std.list(v.obj) -- v.obj:attach(v) for key, val in pairs(v) do if type(self[key]) == 'function' and type(val) ~= 'function' then std.err("Overwrited object method: '"..std.tostr(key).. "' in: "..std.tostr(v.nam), 2) end if not raw[key] then ro[key] = val rawset(v, key, nil) end end rawset(v, '__ro', ro) rawset(v, '__var', vars) rawset(v, '__list', {}) -- in what list(s) oo[ro.nam] = v -- std.setmt(v, self) if std.__in_init then table.insert(std.__in_init, v) end return v end; actions = function(s, t, v) t = t or 'act' if type(t) ~= 'string' then std.err("Wrong argument to obj:actions(): "..std.tostr(t), 2) end local ov = s['__nr_'..t] or 0 if type(v) == 'number' or v == false then s['__nr_'..t] = v or nil end return ov end; __renam = function(s, new) local oo = std.objects if new == s.nam then return end if oo[new] then std.err ("Duplicated obj name: "..std.tostr(new), 2) end oo[s.nam] = nil oo[new] = s rawset(s, 'nam', new) return s end; __ini = function(s, ...) for _, v in pairs(s) do if std.is_obj(v, 'list') then v:__ini(s) end end for _, v in pairs(s.__ro) do if std.is_obj(v, 'list') then v:__ini(s) end end return std.call(s, 'ini', ...) end; inroom = function(s, r) local rooms = r or {} local ww = {} local o if type(rooms) ~= 'table' then std.err("Wrong argument to room: "..std.tostr(r), 2) end s:where(ww) while #ww > 0 do local nww = {} for _, v in ipairs(ww) do if std.is_obj(v, 'room') then if not o then o = v end table.insert(rooms, v) else v:where(nww) end end ww = nww end return o end; __where = function(s) -- lists local list = s.__list local r = { } for i = 1, #list do table.insert(r, list[i]) end return r end; where = function(s, w) local list = s.__list local r = w or { } local o if type(r) ~= 'table' then std.err("Wrong argument to obj:where: "..std.tostr(w), 2) end for i = 1, #list do local l = list[i] local ll = l.__list for k = 1, #ll do local oo = ll[k] if std.is_obj(oo) and oo:lookup(s) then o = o or oo if o and not w then break end table.insert(r, oo) end end end return o end; purge = function(s) local list = s:__where() for i = 1, #list do list[i]:del(s) end return s end; remove = function(s, w) if w then w = std.ref(w) if not w then std.err ("Wrong where in obj:remove()", 2) end local o, l = w:lookup(s) if not o then return o end l:del(o) return o, { w } end local where = {} s:where(where) for i = 1, #where do local o = where[i] local _, l = o:lookup(s) if l then l:del(s) end end return s, where end; close = function(s) s.__closed = true return s end; open = function(s) s.__closed = nil return s end; closed = function(s) return s.__closed or false end; disable = function(s) s.__disabled = true return s end; enable = function(s) s.__disabled = nil return s end; disabled = function(s) return s.__disabled or false end; empty = function(s) for i = 1, #s.obj do local o = s.obj[i] if not o:disabled() then return false end end return true end; save = function(s, fp, n) if std.debug_save then std.dprint("Saving: "..std.nameof(s)) end if s.__dynamic then -- create local nn = std.functions[s.__dynamic.fn] if not nn then std.err("Error while saving dynamic object: "..std.tostr(s), 2) end local arg = s.__dynamic.arg local l = '' for i = 1, #arg do if arg[i] == s then std.err("Error while saving dynamic object: "..std.tostr(s).." Argument is self-obj.", 2) end l = l .. ', '..std.dump(arg[i], true, true) -- strict, nested end if type(s.nam) == 'number' then l = string.format("std.new(%s%s):__renam(%d)\n", nn, l, s.nam) else l = string.format("std.new(%s%s)\n", nn, l, s.nam) end fp:write(l) end for k, _ in pairs(s.__ro) do local o = s.__ro[k] if std.dirty(o) then local l = string.format("%s%s", n, std.varname(k)) std.save_var(s[k], fp, l) end end for k, _ in pairs(s.__var) do local l = string.format("%s%s", n, std.varname(k)) std.save_var(s[k], fp, l) end end; display = function(self) local d = std.call(self, 'dsc') return d end; __xref = function(self, text, force) if type(text) ~= 'string' then return end local nam = self.nam if type(nam) == 'number' then nam = '# '..std.tostr(nam) end local rep = false local s = std.for_each_xref_outer(text, function(str) rep = true local s = str:gsub("^{", ""):gsub("}$", "") local test = string.gsub(s, '\\?[\\{}'..std.delim..']', { ['{'] = '\001', ['}'] = '\003', [std.delim] = '\002' }); while true do local sub = test:gsub("\001[^\001\003]+\003", "") if sub == test then break end test = sub end local a = test:find('\002', 1, true) if not a or test:byte(a) == 1 then -- need to be | return '{'..(std.esc(nam)..std.delim..s)..'}' end return str end) if not rep and force then -- nothing todo? return '{'..(std.esc(nam)..std.delim..s)..'}' end return s; end; visible = function(s) return not s:disabled() end; srch = function(s, w) local o, l, idx if not s:visible() or s:closed() then return end l = s.obj o, idx = l:srch(w) if o then return o, l, idx end for i = 1, #s.obj do local v = s.obj[i] o, l, i = v:srch(w) if o then return o, l, i end end end; lookup = function(s, w) local l = s.obj local o, idx = l:lookup(w) if o then return o, l, idx end for i = 1, #s.obj do local v = s.obj[i] o, l, i = v:lookup(w) if o then return o, l, i end end end; for_each = function(s, fn, ...) local r, v for i = 1, #s.obj do r, v = fn(s.obj[i], ...) if r ~= nil then return r, v end if v ~= false then -- recurse r, v = s.obj[i]:for_each(fn, ...) end if r ~= nil then return r, v end end end; __dump = function(s) if not s:visible() or s:closed() then return end return s.obj:__dump(true) end; lifeon = function(s) local game = std.ref 'game' game:lifeon(s) return s end; lifeoff = function(s) local game = std.ref 'game' game:lifeoff(s) return s end; live = function(s) local game = std.ref 'game' return game:live(s) end; }; function std.var(v) if type(v) ~= 'table' then std.err("Wrong std.var() argument", 2) end v.__var_type = true return v end std.room = std.class({ __room_type = true; from = function(s) return s.__from or s end; new = function(_, v) if type(v) ~= 'table' then std.err ("Wrong argument to std.room:"..std.tostr(v), 2) end if not v.way then rawset(v, 'way', {}) end if type(v.way) ~= 'table' then std.err ("Wrong .way attr in object:" .. v.nam, 2) end v.way = std.list(v.way) -- v.way:attach(v) v = std.obj(v) -- std.setmt(v, self) return v end; visited = function(s) return s.__visits end; visits = function(s) return s.__visits or 0 end; srch = function(self, w) local r, v, i = std.obj.srch(self, w) if std.is_obj(r) then return r, v, i end r, v = self.way:lookup(w) if not std.is_obj(r) or r:disabled() or r:closed() then return end return r, self.way, v end; lookup = function(self, w) local r, v, i = std.obj.lookup(self, w) if std.is_obj(r) then return r, v, i end r, v = self.way:lookup(w) if std.is_obj(r) then return r, self.way, v end return end; scene = function(s) local title, dsc title = iface:title(std.titleof(s)) dsc = std.call(s, 'dsc') return std.par(std.scene_delim, title or false, dsc) end; display = function(s) local deco = std.call(s, 'decor'); -- static decorations return std.par(std.scene_delim, deco or false, s.obj:display()) end; visible = function(s) return not s:disabled() and not s:closed() end; __dump = function(s) return s.way:__dump() end; }, std.obj); std.world = std.class({ __game_type = true; new = function(_, v) if type(v) ~= 'table' then std.err ("Wrong argument to std.pl:"..std.tostr(v), 2) end if not v.player then v.player = 'player' end if v.lifes == nil then rawset(v, 'lifes', {}) end v.lifes = std.list(v.lifes) v = std.obj(v) -- std.setmt(v, self) return v end; time = function(s, t) local ov = s.__time or 0 if t ~= nil then if type(t) ~= 'number' then std.err ("Wrong parameter to game:time: "..stead.tostr(t), 2) end s.__time = t end return ov end; __ini = function(s, load) return s:ini(load) end; __start = function(s, load) std.mod_call('start', load) if type(std.rawget(_G, 'start')) == 'function' then start(load) -- start after load end s.__started = true if load ~= true then if std.game.player.room.__from then -- already entered return nil, true end local r, v = std.game.player:walk(std.game.player.room, false) return r, v end end; ini = function(s, load) if s.__in_ini then return -- break recursion end s.__in_ini = true std.obj.__ini(s, load) s.__in_ini = false s.player = std.ref(s.player) -- init game if not s.player then std.err ("Wrong player", 2) end std.for_each_obj(function(v) rawset(v, '__list', {}) -- reset all links end) std.for_each_obj(function(v) -- call ini of all objects if v ~= s then v:__ini(load) end end) if not std.game then if type(std.rawget(_G, 'init')) == 'function' then std.__in_init = {} init() for _, v in ipairs(std.__in_init) do v:__ini(load) end std.__in_init = false end std.game = s end local d = std.method(s, 'dsc') return std.fmt(d) end; lifeon = function(s, w, ...) if not w then s.__lifeoff = nil return end return s.lifes:add(w, ...) end; lifeoff = function(s, w) if not w then s.__lifeoff = true return end return s.lifes:del(w) end; live = function(s, w) if not w then return not s.__lifeoff end return s.lifes:lookup(w) end; set_pl = function(s, w) if not std.is_obj(w, 'player') then std.err("Wrong parameter to game:set_pl(): "..std.tostr(w), 2) end s.player = w w:need_scene(true) end; life = function(s) local av, vv s:events(false, false) if s.__lifeoff then return end local ll = {} for i = 1, #s.lifes do table.insert(ll, s.lifes[i]) end for i = 1, #ll do local v, pre, st local o = ll[i] if not o:disabled() then v, st, pre = std.call(o, 'life'); av, vv = s:events() if pre then -- hi-pri msg av = std.par(std.space_delim, av or false, v) else vv = std.par(std.space_delim, vv or false, v) end s:events(av or false, vv or false) if st == false then -- break cycle break end end end end; step = function(s) s:life() s.__time = s:time() + 1 end; lastdisp = function(s, str) local ov = s.__lastdisp if str ~= nil then s.__lastdisp = str end return ov end; display = function(s, state) local l, av, pv local reaction = s:reaction() or nil if state then reaction = iface:em(reaction) av, pv = s:events() av = iface:em(av) pv = iface:em(pv) l = s.player:look() -- objects [and scene] end l = std.par(std.scene_delim, reaction or false, av or false, l or false, pv or false) or '' return l end; lastreact = function(s, t) local o = s.__lreaction if t == nil then return o end s.__lreaction = t or nil return o end; reaction = function(s, t) local o = s.__reaction if t == nil then return o end s.__reaction = t or nil return o end; events = function(s, av, pv) local oa = s.__aevents local op = s.__pevents if av ~= nil then s.__aevents = av or nil end if pv ~= nil then s.__pevents = pv or nil end return oa, op end; cmd = function(s, cmd) local r, v if not std.is_obj(s.player) then std.err("Wrong player object.", 2) end s.player:moved(false) s.player:need_scene(false) std.abort_cmd = false r, v = std.mod_call('cmd', cmd) -- luacheck: push ignore if r ~= nil or v ~= nil then -- luacheck: pop elseif cmd[1] == nil or cmd[1] == 'look' then if not s.__started then r, v = s:__start() else s.player:need_scene(true) v = true end -- r, v = s.player:look() elseif cmd[1] == 'act' then if #cmd < 2 then return nil, false end local o = std.ref(cmd[2]) -- on what? if std.is_system(o) then local a = {} for i = 3, #cmd do table.insert(a, cmd[i]) end r, v = std.call(o, 'act', std.unpack(a)) else o = s.player:inspect(o) if not o then return nil, false -- wrong input end r, v = s.player:take(o) if not r and not v then r, v = s.player:action(o) end end -- if s.player:search(o) elseif cmd[1] == 'use' then if #cmd < 2 then return nil, false end local o1 = std.ref(cmd[2]) local o2 = std.ref(cmd[3]) o1 = s.player:srch(o1) if not o1 then return nil, false -- wrong input end if o1 == o2 or not o2 then -- inv? if not o1 then return nil, false -- wrong input end r, v = s.player:useit(o1) else r, v = s.player:useon(o1, o2) end elseif cmd[1] == 'go' then if #cmd < 2 then return nil, false end local o = std.ref(cmd[2]) if not o then return nil, false -- wrong input end r, v = s.player:go(o) elseif cmd[1] == 'inv' then -- show inv r = s.player:__dump() -- just info v = nil elseif cmd[1] == 'way' then -- show ways r = s.player:where():__dump() v = nil elseif cmd[1] == 'save' then -- todo if #cmd < 2 then return nil, false end r = std:save(cmd[2]) v = true std.abort() elseif cmd[1] == 'load' then -- todo if #cmd < 2 then return nil, false end r = std:load(cmd[2]) v = true std.abort() end if r == nil and v == nil then v = false -- no reaction end if v == false or std.abort_cmd then if cmd[1] == 'save' then std.mod_call('step', nil) else std.mod_call('step', v) end return r, v end -- v is true or nil s = std.game -- after reset game is recreated s:reaction(r or false) if v then s:step() end std.mod_call('step', v) r = s:display(v) if v then s:lastreact(s:reaction() or false) s:lastdisp(r) end return r, v end; aftertak = function(s, w) -- standard take action w = std.ref(w) local o = w:remove() s.player:inventory():add(o) end; }, std.obj); std.player = std.class ({ __player_type = true; new = function(_, v) if type(v) ~= 'table' then std.err ("Wrong argument to std.pl:"..std.tostr(v), 2) end if not v.room then v.room = 'main' end v = std.obj(v) -- std.setmt(v, self) return v end; __ini = function(s, ...) s.room = std.ref(s.room) if not s.room then std.err ("Wrong player location: "..std.tostr(s), 2) end std.obj.__ini(s, ...) end; moved = function(s, v) local ov = s.__moved or false if v == nil then return ov end if type(v) ~= 'boolean' then std.err("Wrong parameter to player:moved: "..std.tostr(v), 2) end if v == false then v = nil end s.__moved = v return ov end; need_scene = function(s, v) local ov = s.__need_scene or false if v == nil then return ov end if type(v) ~= 'boolean' then std.err("Wrong parameter to player:need_scene: "..std.tostr(v), 2) end if v == false then v = nil end s.__need_scene = v return ov end; look = function(s) local scene local r = s:where() if s:need_scene() then scene = r:scene() end return std.par(std.scene_delim, scene or false, r:display()) end; inspect = function(s, w) local r, v, i r, v, i = s:where():srch(w) if r ~= nil then return r, v, i end r, v, i = s:srch(w) if r ~= nil then return r, v, i end return end; lookup = function(self, w) local r, v, i = std.obj.lookup(self, w) if std.is_obj(r) then return r, v, i end r, v = self:inventory():lookup(w) if std.is_obj(r) then return r, self:inventory(), v end return end; have = function(s, w) local o, i = s:inventory():lookup(w) if not o then return o, i end if o:disabled() then return end return o, i end; useit = function(s, w, ...) return s:call('inv', w, ...) end; useon = function(s, w1, w2) w1 = std.ref(w1) w2 = std.ref(w2) if w2 and w1 ~= w2 then return s:call('use', w1, w2) end -- inv mode? return s:call('inv', w1, w2) end; call = function(_, m, w1, w2, ...) local w if type(m) ~= 'string' then std.err ("Wrong method in player.call: "..std.tostr(m), 2) end w = std.ref(w1) if not std.is_obj(w) then std.err ("Wrong parameter to player.call: "..std.tostr(w1), 2) end local r, v, t, _ r, v = std.call(std.ref 'game', 'on'..m, w, w2, ...) t = std.par(std.scene_delim, false, r) if v == false then return t or r, true, false end if m == 'use' and w2 then r, v = std.call(w2, 'used', w, ...) t = std.par(std.scene_delim, t or false, r) if v == true then -- false from used --> pass to use w2['__nr_used'] = (w2['__nr_used'] or 0) + 1 r, _ = std.call(std.ref 'game', 'afteruse', w, w2, ...) t = std.par(std.scene_delim, t or false, r) return t or r, true -- stop chain end end r, v = std.call(w, m, w2, ...) t = std.par(std.scene_delim, t or false, r) if v == true then w['__nr_'..m] = (w['__nr_'..m] or 0) + 1 r, _ = std.call(std.ref 'game', 'after'..m, w, w2, ...) t = std.par(std.scene_delim, t or false, r) return t or r, true end if r == true and v == false then return r, v -- menu hack end if not v and not r then -- no reaction r, v = std.call(std.ref 'game', m, w, w2, ...) t = std.par(std.scene_delim, t or false, r) if not v then return end end return t or r, true end; action = function(s, w, ...) return s:call('act', w, ...) end; inventory = function(s) return s.obj end; take = function(s, w, ...) return s:call('tak', w, ...) end; walkin = function(s, w, ...) return s:walk(w, false, true, ...) end; walkout = function(s, w, ...) if w == nil then w = s:where():from() end return s:walk(w, true, false, ...) end; walk = function(s, w, doexit, doenter, dofrom) local noexit = (doexit == false) local noenter = (doenter == false) local nofrom = (dofrom == false) local moved = s:moved() if moved then s:moved(false) end local ww = w w = std.ref(w) if not w then std.err("Wrong parameter to walk: "..std.tostr(ww)) end -- if w == std.here() then -- nothing todo -- return -- end local inwalk = w local r, v, t, _ local f = s:where() r, v = std.call(std.ref 'game', 'onwalk', f, inwalk) t = std.par(std.scene_delim, false, r) if v == false or s:moved() then -- stop walk if not s:moved() then s:moved(moved) end return t, true end r, v = std.call(inwalk, 'onwalk', f) t = std.par(std.scene_delim, t or false, r) if v == false or s:moved() then -- stop walk if not s:moved() then s:moved(moved) end return t, true end if not noexit and not s.__in_onexit then s.__in_onexit = true r, v = std.call(s:where(), 'onexit', inwalk) s.__in_onexit = false t = std.par(std.scene_delim, t or false, r) if v == false or s:moved() then if not s:moved() then s:moved(moved) end return t, true end end if not noenter then r, v = std.call(inwalk, 'onenter', s:where()) t = std.par(std.scene_delim, t or false, r) if v == false or s:moved() then if not s:moved() then s:moved(moved) end return t, true end end if not noexit and not s.__in_exit then s.__in_exit = true r, _ = std.call(s:where(), 'exit', inwalk) s.__in_exit = false t = std.par(std.scene_delim, t or false, r) if s:moved() then return t, true end end -- enter is done s.room = inwalk if not nofrom and (f ~= inwalk or not s.room.__from) then -- brake self-recursion s.room.__from = f end if not noenter then r, _ = std.call(inwalk, 'enter', f) t = std.par(std.scene_delim, t or false, r) if s:moved() then return t, true end end s:where().__visits = (s:where().__visits or 0) + 1 s:need_scene(true) s:moved(true) if not s.__in_afterwalk then s.__in_afterwalk = true r, _ = std.call(std.ref 'game', 'afterwalk', f, inwalk) s.__in_afterwalk = false t = std.par(std.scene_delim, t or false, r) end return t, true end; go = function(s, w) local r r = s:where():srch(w) if not std.is_obj(r, 'room') then return nil, false end return s:walk(w) end; where = function(s, where) if type(where) == 'table' then table.insert(where, std.ref(s.room)) end return std.ref(s.room) end; }, std.obj); -- merge strings with "space" as separator std.par = function(space, ...) local res local a = { ... }; for i = 1, #a do if type(a[i]) == 'string' then if res == nil then res = "" else res = res .. space; end res = res .. a[i]; end end return res; end -- add to not nill string any string std.cat = function(v,...) if not v then return nil end if type(v) ~= 'string' then std.err("Wrong parameter to std.cat: "..std.tostr(v), 2); end local a = { ... } for i = 1, #a do if type(a[i]) == 'string' then v = v .. a[i]; end end return v; end std.cctx = function() return std.call_ctx[std.call_top]; end std.callpush = function(v) std.call_top = std.call_top + 1; std.call_ctx[std.call_top] = { txt = nil, self = v }; end std.callpop = function() std.call_ctx[std.call_top] = nil; std.call_top = std.call_top - 1; if std.call_top < 0 then std.err ("callpush/callpop mismatch") end end std.pclr = function() std.cctx().txt = nil end std.pget = function() return std.cctx().txt; end std.pr = function(...) local a = {...} if std.cctx() == nil then error ("Call from global context.", 2); end for i = 1, #a do std.cctx().txt = std.par('', std.cctx().txt or false, std.tostr(a[i])); end -- std.cctx().txt = std.cat(std.cctx().txt, std.space_delim); end std.p = function(...) std.pr(...) std.cctx().txt = std.cat(std.cctx().txt, std.space_delim); end std.pn = function(...) std.pr(...) std.cctx().txt = std.cat(std.cctx().txt, '^'); end std.pf = function(fmt, ...) if type(fmt) ~= 'string' then std.err("Wrong argument to std.pf: "..std.tostr(fmt)) end std.pr(string.format(fmt, ...)) end function std.strip(s) if type(s) ~= 'string' and type(s) ~= 'number' then return end s = tostring(s) s = s:gsub("^[ \t]*", ""):gsub("[ \t]*$", "") return s end function std.join(a, sep) sep = sep or ' ' local rc for i = 1, #a do if type(a[1]) == 'string' then rc = (rc and rc .. sep or '') .. a[i] end end return rc end function std.split(s, separator) local sep, fields = separator or " ", {} local pattern = string.format("([^%s]+)", sep) if type(s) ~= 'string' and type(s) ~= 'number' then return fields end s = tostring(s) s:gsub(pattern, function(c) fields[#fields+1] = std.strip(c) end) return fields end function std.esc(s, sym) sym = sym or std.delim if type(s) ~= 'string' then return s end s = s:gsub("\\?["..sym.."]", { [sym] = '\\'..sym, ['\\'..sym] = '\\\\'..sym}) return s end function std.unesc(s, sym) sym = sym or std.delim s = s:gsub("\\?[\\"..sym.."]", { ['\\'..sym] = sym, ['\\\\'] = '\\' }) return s end function std.is_proxy(t) return (type(t) == 'userdata') or (type(t) == 'table' and t.__proxy_type) end local function __dump(t, strict, nested) local rc = ''; if type(t) == 'string' then rc = string.format("%q", t):gsub("\\\n", "\\n") elseif type(t) == 'number' then rc = std.tostr(t) elseif type(t) == 'boolean' then rc = std.tostr(t) elseif type(t) == 'function' then if std.functions[t] then local k = std.functions[t] return string.format("%s", k) elseif strict then std.err("Can not save undeclared function", 2) end elseif type(t) == 'table' and not t.__visited then if std.tables[t] and nested then local k = std.tables[t] return string.format("%s", k) elseif std.is_obj(t) then local d = std.deref(t) if type(d) == 'number' then rc = string.format("std(%d)", d) elseif type(d) == 'string' then rc = string.format("std %q", d) end return rc end if strict and std.getmt(t) then std.err("Can not save classes", 2) end t.__visited = true local nkeys = {} local keys = {} for k, v in pairs(t) do if strict and type(k) ~= 'number' and type(k) ~= 'string' then std.err("Wrong key type in table: "..type(k), 2) end if type(k) ~= 'string' or k:find("__", 1, true) ~= 1 then if (type(v) ~= 'function' or std.functions[v]) and not std.is_proxy(v) then if type(k) == 'number' then table.insert(nkeys, { key = k, val = v }) elseif type(k) == 'string' then table.insert(keys, { key = k, val = v }) end elseif strict then std.err("Can not save table item ("..std.tostr(k)..") with type: "..type(v), 2) end end end table.sort(nkeys, function(a, b) return a.key < b.key end) rc = "{ " local n, v for k = 1, #nkeys do v = nkeys[k] if v.key == k then rc = rc .. __dump(v.val, strict, true)..", " else n = k break end end if n then for k = n, #nkeys do v = nkeys[k] rc = rc .. "["..std.tostr(v.key).."] = "..__dump(v.val, strict, true)..", " end end for k = 1, #keys do v = keys[k] if type(v.key) == 'string' then if v.key:find("^[a-zA-Z_]+[a-zA-Z0-9_]*$") and not lua_keywords[v.key] then rc = rc .. v.key .. " = "..__dump(v.val, strict, true)..", " else rc = rc .. "[" .. string.format("%q", v.key) .. "] = "..__dump(v.val, strict, true)..", " end else rc = rc .. std.tostr(v.key) .. " = "..__dump(v.val, strict, true)..", " end end rc = rc:gsub(",[ \t]*$", "") .. " }" elseif type(t) == 'table' then -- visited! std.err("Can not save table with cross-references.", 2) end return rc end local function cleardump(t) if type(t) ~= 'table' or not t.__visited then return end t.__visited = nil for _, v in pairs(t) do cleardump(v) end end function std.dump(t, strict, nested) local rc = __dump(t, strict, nested) cleardump(t) return rc end local function clone(src) if type(src) ~= 'table' then return src end if std.is_obj(src) then return src end if src.__visited then std.err("Recursive tables not supported by std.clone") end src.__visited = true local dst = {} for k, _ in pairs(src) do if k ~= '__visited' then dst[std.clone(k)] = clone(src[k]) end end return dst end function std.clone(src) cleardump(src) local t = clone(src) cleardump(src) return t end function std.new(fn, ...) if not std.game then std.err ("You can not use new() from global context.", 2) end if type(fn) ~= 'function' then std.err ("Wrong parameter to std.new", 2) end if not std.functions[fn] then std.err ("Function is not declared in 1-st argument of std.new", 2) end local arg = std.clone({...}) local o = in_section ('new', function() return fn(std.unpack(arg)) end) if type(o) ~= 'table' then std.err ("Constructor did not return object:"..std.functions[fn], 2) end rawset(o, '__dynamic', { fn = fn, arg = {...} }) if std.game then o:__ini() -- do initialization end return o end function std.delete(s) s = std.ref(s) if std.is_obj(s) then if type(s.nam) == 'number' and not s.__dynamic then -- static objects std.objects[s.nam] = false else std.objects[s.nam] = nil end else std.err("Delete non object table", 2) end end function std.nameof(o) o = std.ref(o) if not std.is_obj(o) then std.err("Wrong parameter to std.nameof: "..std.tostr(o), 2) return end return o.nam end function std.dispof(o) o = std.ref(o) if not std.is_obj(o) then std.err("Wrong parameter to std.dispof", 2) return end if o.disp ~= nil then local d = std.call(o, 'disp') return d end if o.__autoname then if std.is_tag(o.tag) then o = o.tag:sub(2) return o end if type(o.nam) == 'number' then return std.tostr(o.nam) end std.err("No nam nor disp are specified for obj: "..std.tostr(o.nam), 2) end return o.nam end function std.titleof(o) o = std.ref(o) if not std.is_obj(o) then std.err("Wrong parameter to std.titleof", 2) return end if o.title ~= nil then return std.call(o, 'title') end return std.dispof(o) end function std.ref(o) if type(o) == 'table' then if not std.is_obj(o) then std.err("Reference to wrong object: "..std.tostr(o), 2) end return o end local oo = std.objects if oo[o] then return oo[o] end if std.noerror then std.dprint("Reference to non-existing object: ", std.tostr(o)) return {} -- give fake object end end function std.deref(o) if std.is_obj(o) then return o.nam elseif std.ref(o) then return o end end std.method = function(v, n, ...) if type(v) ~= 'table' then std.err ("Call on non table object:"..std.tostr(n), 2); end if v[n] == nil then return end if type(v[n]) == 'string' then return v[n], true; end if type(v[n]) == 'function' then std.callpush(v, ...) local c local a, b = v[n](v, ...); c = b if b == nil and (type(a) == 'boolean' or a == nil) then a, b = std.pget(), a c = b end if b == nil then b = true -- the fact of call end std.callpop() return a, b, c end if type(v[n]) == 'boolean' or type(v[n]) == 'table' then return v[n], true end std.err ("Method not string nor function:"..std.tostr(n), 2); end std.call = function(o, n, ...) if type(o) ~= 'table' then std.err("Call on non table object: "..std.tostr(n), 2) end local r, v, c = std.method(o, n, ...) if std.strip_call and type(r) == 'string' then r = r:gsub("^[%^\n\r\t ]+", "") -- extra heading ^ and spaces r = r:gsub("[%^\n\r\t ]+$", "") -- extra trailing ^ and spaces return r, v, c end return r or nil, v, c end local function get_token(inp) local q, k local rc = '' k = 1 if inp:sub(1, 1) == '"' then q = true k = k + 1 end while true do local c = inp:sub(k, k) if c == '' then if q then return nil -- error end break -- return rc, k end if c == '"' and q then k = k + 1 break end if not q and (c == ' ' or c == ',' or c == '\t') then break end if q and c == '\\' then k = k + 1 c = inp:sub(k, k) rc = rc .. c else rc = rc .. c end k = k + 1 end if not q then if std.tonum(rc) then rc = std.tonum(rc) elseif rc == 'true' then rc = true elseif rc == 'false' then rc = false end end return rc, k end local function cmd_parse(inp) local cmd = {} if type(inp) ~= 'string' then return false end if inp:find("^save[ \t]+") then cmd[1] = 'save' cmd[2] = inp:gsub("^save[ \t]+", "") return cmd elseif inp:find("^load[ \t]+") then cmd[1] = 'load' cmd[2] = inp:gsub("^load[ \t]+", "") return cmd end inp = inp:gsub("[ \t]*$", "") while true do inp = inp:gsub("^[ ,\t]*","") local v, i = get_token(inp) if v == nil or v == '' then break end inp = inp:sub(i) table.insert(cmd, v) end return cmd end std.cmd_parse = cmd_parse function std.me() return std.ref(std.ref 'game'.player) end function std.here() return std.ref(std.me().room) end function std.cacheable(n, f) return function(...) local s = std.cache[n] if s ~= nil then if s == -1 then s = nil end return s end std.cache[n] = -1 s = f(...) if s ~= nil then std.cache[n] = s end return s end end local iface = std.obj { nam = '@iface'; cmd = function(_, inp) local cmd = std.cmd_parse(inp) if std.debug_input then std.dprint("* input: ", inp) end if not cmd then return "Error in cmd arguments", false end std.cmd = cmd std.cache = {} local r, v = std.ref 'game':cmd(cmd) if r == true and v == false then return nil, true -- hack for menu mode end r = iface:fmt(r, v) -- to force fmt if std.debug_output then std.dprint("* output: ", r, v) end return r, v end; xref = function(_, str, obj) obj = std.ref(obj) if not obj then return str; end return std.cat(str, "("..std.deref(obj)..")"); end; title = function(_, str) return "[ "..std.tostr(str).." ]" end; raw_mode = function(s, v) local ov = s.__raw if v ~= nil then s.__raw = v or nil end return ov end; fmt = function(self, str, state) if self:raw_mode() or type(str) ~= 'string' then return str end str = std.fmt(str, std.format, state) return std.cat(str, '\n') end; em = function(_, str) return str end; }; local function fmt_stub(_, str) return str end iface.em = fmt_stub iface.center = fmt_stub iface.just = fmt_stub iface.left = fmt_stub iface.right = fmt_stub iface.bold = fmt_stub iface.top = fmt_stub iface.bottom = fmt_stub iface.middle = fmt_stub iface.nb = fmt_stub iface.anchor = fmt_stub iface.img = fmt_stub iface.imgl = fmt_stub iface.imgr = fmt_stub iface.under = fmt_stub iface.st = fmt_stub iface.tab = fmt_stub iface.y = fmt_stub function std.loadmod(f) if std.game and not std.__in_gamefile then std.err("Use loadmod() only in global context", 2) end if type(f) ~= 'string' then std.err("Wrong argument to loadmod(): "..std.tostr(f), 2) end if not f:find("%.lua$") then f = f .. '.lua' end if not std.modules[f] then std.modules[f] = true std.dofile(f) end end function std.include(f) if std.game and not std.__in_gamefile then std.err("Use include() only in global context", 2) end if type(f) ~= 'string' then std.err("Wrong argument to include(): "..std.tostr(f), 2) end if not f:find("%.lua$") then f = f .. '.lua' end if not std.includes[f] then std.includes[f] = true in_section('include', function() std.dofile(f) end) end end function std.abort() std.abort_cmd = true end function std.nop() std.abort() if std.cctx() then std.pr(std.game:lastdisp()) end return std.game:lastdisp(), true end -- require "ext/gui" require "declare" require "dlg" require "stdlib" instead-3.2.1/stead/CMakeLists.txt0000644000175000017500000000006213267071774016040 0ustar peterpeterADD_SUBDIRECTORY(stead2) ADD_SUBDIRECTORY(stead3) instead-3.2.1/stead/Makefile0000644000175000017500000000074313267071774014746 0ustar peterpeterinclude ../Rules.make include ../config.make clean: all: stead2/stead.lua stead3/stead.lua install: $(INSTALLD) $(DESTDIR)$(STEADPATH) for api in stead2 stead3; do \ $(INSTALLD) $(DESTDIR)$(STEADPATH)/$$api; \ $(INSTALLD) $(DESTDIR)$(STEADPATH)/$$api/ext; \ for f in $$api/*.lua; do \ $(INSTALL) $$f $(DESTDIR)$(STEADPATH)/$$f || exit 1; \ done; \ for f in $$api/ext/*.lua; do \ $(INSTALL) $$f $(DESTDIR)$(STEADPATH)/$$f || exit 1; \ done; \ done uninstall: instead-3.2.1/stead/stead2/0000755000175000017500000000000013267071774014464 5ustar peterpeterinstead-3.2.1/stead/stead2/events.lua0000644000175000017500000000064513267071774016500 0ustar peterpetergame.action = stead.hook(game.action, function(f, s, cmd, ...) if cmd == 'user_event' then local r,v; r, v = stead.call(stead, 'event', ... ); return r,v end return f(s, cmd, ...); end) stead.module_init(function() input.event = stead.hook(input.event, function(f, s, ev, ...) if type(stead.event) == 'function' then return 'user_event,'..tostring(ev) end return f(s, ev, ...) end) end) -- vim:ts=4 instead-3.2.1/stead/stead2/finger.lua0000644000175000017500000000405013267071774016440 0ustar peterpeterrequire "theme" finger = { nam = 'finger'; object_type = true; system_type = true; fingers_list = { }; add = function(s, press, fid, x, y, px, py) if press then local v = s:lookup(fid) if v then v.x, v.y, v.px, v.py = x, y, px, py else stead.table.insert(s.fingers_list, { id = fid, x = x, y = y, px = px, py = py }) end return end local v, k v, k = s:lookup(fid) if k then stead.table.remove(s.fingers_list, k) return end end; list = function(s) local new = {} for k, v in stead.ipairs(s.fingers_list) do local x, y, pressure x, y, pressure = stead.finger_pos(v.id) if x then v.x, v.y, v.pressure = x, y, pressure stead.table.insert(new, v) end end s.fingers_list = new return new end; get = function(s, fid) local v,k local x, y, pressure x, y, pressure = stead.finger_pos(fid) if not x then v, k = s:lookup(fid) if k then stead.table.remove(s.fingers_list, k) end return end return x, y, pressure end; lookup = function(s, fid) for k, v in stead.ipairs(s.fingers_list) do if v.id == fid then return v, k end end end; } stead.module_init(function() input.finger = function(s, press, fid, x, y, px, py, ...) finger:add(press, fid, x, y, px, py, ...) local cmd = 'finger ' cmd = cmd..stead.tostr(press)..','..stead.tostr(fid)..',' .. x .. ','.. y; if px then cmd = cmd .. ',' .. px .. ',' .. py end return cmd end end) game.action = stead.hook(game.action, function(f, s, cmd, press, fid, x, y, px, py, ...) if cmd == 'finger' then local r,v local x2 = px local y2 = py if stead.here().finger then s = stead.here() end if not s.finger then return end if stead.tonum(px) then x2 = stead.tonum(px) end if stead.tonum(py) then y2 = stead.tonum(py) end if press == 'true' then press = true else press = false end r,v = stead.call(s, 'finger', press, fid, stead.tonum(x), stead.tonum(y), x2, y2, ...); return r,v end return f(s, cmd, press, fid, x, y, px, py, ...) end) -- vim:ts=4 instead-3.2.1/stead/stead2/walk.lua0000644000175000017500000001405713267071774016134 0ustar peterpeterlocal function onevent(ev, ...) local vv, r if stead.api_atleast(1, 6, 3) then vv, r = stead.call(game, ev, ...); if r == false then return vv, false end if vv == false then return nil, false end return vv end end local go = function (self, where, back, noenter, noexit, nodsc) local was = self.where; local need_scene = false; local ret if not stead.in_walk_call then ret = function(rc) stead.in_walk_call = false return nil end else ret = function(rc) return rc end end stead.in_walk_call = true if where == nil then return nil, ret(false) end if not isRoom(stead.ref(where)) then error ("Trying to go nowhere: "..where); end if not isRoom(stead.ref(self.where)) then error ("Trying to go from nowhere: "..self.where); end if stead.in_entered_call or stead.in_onexit_call then error ("Do not use walk from left/entered action! Use exit/enter action instead:" .. self.where); end local v, r, jump; if not isVroom(stead.ref(where)) and not stead.in_exit_call and not noexit then stead.in_exit_call = true -- to break recurse v,r = stead.call(stead.ref(self.where), 'exit', stead.ref(where)); stead.in_exit_call = nil if r == false or (stead.api_atleast(1, 3, 0) and v == false and r == nil) then return v, ret(r) end if stead.api_atleast(2, 4, 0) then jump = stead.rawget(_G, 'PLAYER_MOVED') else jump = (self.where ~= was) end if jump then where = stead.deref(self.where) -- jump end end local res = v; v = nil; if not isVroom(stead.ref(where)) then self.where = stead.deref(where); end if not jump and not noenter then v, r = stead.call(stead.ref(where), 'enter', stead.ref(was)); if r == false or (stead.api_atleast(1, 3, 0) and v == false and r == nil) then self.where = was; return stead.par(stead.scene_delim, res, v), ret(r) end end if stead.api_atleast(2, 4, 0) then need_scene = not stead.rawget(_G, 'PLAYER_MOVED'); else need_scene = not (stead.ref(where) ~= stead.ref(self.where)) end res = stead.par(stead.scene_delim, res, v); if not back then stead.ref(where).__from__ = stead.deref(was); end ret() stead.rawset(_G, 'PLAYER_MOVED', true) if need_scene and not nodsc then stead.need_scene() end if not stead.in_walk_call then local to = self.where if not noexit then self.where = was stead.in_onexit_call = true v = stead.call(stead.ref(was), 'left', stead.ref(to)); stead.in_onexit_call = false res = stead.par(stead.scene_delim, res, v); end self.where = stead.deref(to) if not noenter then stead.in_entered_call = true v = stead.call(stead.ref(to), 'entered', stead.ref(was)); stead.in_entered_call = false res = stead.par(stead.scene_delim, res, v); end if stead.tonum(stead.ref(to).__visited) then stead.ref(to).__visited = stead.ref(to).__visited + 1; elseif stead.here().__visited == nil then stead.ref(to).__visited = 1 end if not stead.api_atleast(1, 6, 3) and isDialog(stead.ref(to)) then stead.dialog_rescan(stead.ref(to)) end end return res; end stead.player_go = function(self, where) -- cmd iface local w = stead.ref(self.where).way:srch(where); if not w then return nil,false end return self:walk(w); end stead.player_walk = function(self, where, ...) -- real work local v, r, vv; vv, r = onevent('onwalk', stead.ref(where), ...); if vv == false then return end if r == false then return vv end v, r = stead.go(self, where, ...); if stead.type(vv) == 'string' then v = stead.par(stead.space_delim, vv, v); end return v, r; end stead.player_back = function(self) -- deprecated error ("Do not use stead.me():back(). It's deprecated.", 2) end stead.back = function(w) if isDialog(stead.here()) and not isDialog(stead.from()) then return stead.walkout(w); end return stead.walkback(w); end back = stead.back stead.walkback = function(w) if isRoom(stead.ref(w)) then return stead.me():walk(w, true); end return stead.me():walk(stead.from(), true); end walkback = stead.walkback stead.walk = function(what, back, noenter, noexit, nodsc, ...) return stead.me():walk(what, back, noenter, noexit, nodsc, ...); end walk = stead.walk stead.walkin = function(what) return stead.me():walk(what, false, false, true); end walkin = stead.walkin stead.walkout = function(what) if isRoom(stead.ref(what)) then return stead.me():walk(what, true, true, false, true); end return stead.me():walk(stead.from(), true, true, false, true); end walkout = stead.walkout function visited(w) if not w then w = stead.here() end w = stead.ref(w) if w == nil then return nil; end if not isRoom(w) then error ("Wrong parameter to visited.", 2); end return w.__visited end stead.visited = visited function visits(w) local n = stead.visited(w) if not n then n = 0 end return n end stead.visits = visits iface.fmt = function(self, cmd, st, moved, r, av, objs, pv) -- st -- changed state (main win), move -- loc changed local l, vv if st then av = txtem(av); pv = txtem(pv); -- if not PLAYER_MOVED then r = txtem(r) -- end if isForcedsc(stead.here()) or stead.rawget(_G, 'NEED_SCENE') then l = stead.here():scene(); end end if moved then vv = stead.fmt(stead.cat(stead.par(stead.scene_delim, r, l, av, objs, pv), '^')); else vv = stead.fmt(stead.cat(stead.par(stead.scene_delim, l, r, av, objs, pv), '^')); end return vv end stead.go = function(...) local r,v = go(...) if stead.type(r) == 'string' and stead.cctx() then stead.pr (r) end -- if stead.in_life_call then -- ACTION_TEXT = nil -- end if r == nil and v == nil then if stead.cctx() then stead.cctx().action = true else r = true end end return r,v end iface.cmd = stead.hook(iface.cmd, function(f, ...) stead.rawset(_G, 'NEED_SCENE', nil) return f(...) end) player = stead.inherit(player, function(v) v.look = function(s) if not stead.started then game:start() end if game._time == 0 then return stead.walk(stead.here(), false, false, true); end stead.need_scene() if stead.api_atleast(1, 3, 5) then return true -- force action end end return v end) pl = player(pl) -- reinit -- vim:ts=4 instead-3.2.1/stead/stead2/pixels.lua0000644000175000017500000000236013267071774016474 0ustar peterpeterrequire "sprites" local pixels_mt = { } local font_mt = { __gc = function(s) stead.font_free(s.fnt) end; __tostring = function(s) return s.fnt end; } local pnew = function(p) if stead.type(p) ~= 'userdata' then return end local t = getmetatable(p).__index setmetatable(t, pixels_mt) return p end local fnew = function(f) if stead.type(f) ~= 'string' then return end local fn = { fnt = f; save = function() end; } setmetatable(fn, font_mt) return fn end local font_m = { text = function(s, text, col, style, ...) return pnew(stead.sprite_pixels(stead.sprite_text(s.fnt, text, col, style, ...))) end; size = function(s, ...) return stead.sprite_text_size(s.fnt, ...); end; } local pixels_m = { save = function() end; dup = function(self) local w, h, s = self:size() local p = stead.sprite_pixels(w, h, s) if p then self:copy(p) end return pnew(p) end; } font_mt.__index = font_m pixels_mt.__index = pixels_m pixels = { nam = 'pixels'; object_type = true; system_type = true; fnt = function(name, sz, ...) if not stead.tonum(sz) then error("No font size specified.", 2) end return fnew(stead.font_load(name, -sz, ...)) end; new = function(...) return pnew(stead.sprite_pixels(...)) end; } instead-3.2.1/stead/stead2/hideinv.lua0000644000175000017500000000101213267071774016607 0ustar peterpeterlocal attr = "hideinv" if stead.api_atleast(1, 6, 3) then game.gui.hideinv = function(s) if stead.call_bool(stead.here(), 'hideinv') then return true end end attr = "noinv" end room = stead.inherit(room, function(v) v.entered = stead.hook(v.entered, function(f, s, ...) if stead.call_bool(s, attr) then me():disable_all(); end return f(s, ...) end) v.left = stead.hook(v.left, function(f, s, ...) if stead.call_bool(s, attr) then me():enable_all(); end return f(s, ...) end) return v end) instead-3.2.1/stead/stead2/input.lua0000644000175000017500000001370513267071774016334 0ustar peterpeterlocal kbden = { shifted = { ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = "$", ["5"] = "%", ["6"] = "^", ["7"] = "&", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", ["["] = "{", ["]"] = "}", ["\\"] = "|", [";"] = ":", ["'"] = "\"", [","] = "<", ["."] = ">", ["/"] = "?", } } local kbdru = { ["q"] = "й", ["w"] = "ц", ["e"] = "у", ["r"] = "к", ["t"] = "е", ["y"] = "н", ["u"] = "г", ["i"] = "ш", ["o"] = "щ", ["p"] = "з", ["["] = "х", ["]"] = "ъ", ["a"] = "ф", ["s"] = "ы", ["d"] = "в", ["f"] = "а", ["g"] = "п", ["h"] = "р", ["j"] = "о", ["k"] = "л", ["l"] = "д", [";"] = "ж", ["'"] = "э", ["z"] = "я", ["x"] = "ч", ["c"] = "с", ["v"] = "м", ["b"] = "и", ["n"] = "т", ["m"] = "ь", [","] = "б", ["."] = "ю", ["`"] = "ё", shifted = { ["q"] = "Й", ["w"] = "Ц", ["e"] = "У", ["r"] = "К", ["t"] = "Е", ["y"] = "Н", ["u"] = "Г", ["i"] = "Ш", ["o"] = "Щ", ["p"] = "З", ["["] = "Х", ["]"] = "Ъ", ["a"] = "Ф", ["s"] = "Ы", ["d"] = "В", ["f"] = "А", ["g"] = "П", ["h"] = "Р", ["j"] = "О", ["k"] = "Л", ["l"] = "Д", [";"] = "Ж", ["'"] = "Э", ["z"] = "Я", ["x"] = "Ч", ["c"] = "С", ["v"] = "М", ["b"] = "И", ["n"] = "Т", ["m"] = "Ь", [","] = "Б", ["."] = "Ю", ["`"] = "Ё", ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = ";", ["5"] = "%", ["6"] = ":", ["7"] = "?", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", } } local kbdlower = { ['А'] = 'а', ['Б'] = 'б', ['В'] = 'в', ['Г'] = 'г', ['Д'] = 'д', ['Е'] = 'е', ['Ё'] = 'ё', ['Ж'] = 'ж', ['З'] = 'з', ['И'] = 'и', ['Й'] = 'й', ['К'] = 'к', ['Л'] = 'л', ['М'] = 'м', ['Н'] = 'н', ['О'] = 'о', ['П'] = 'п', ['Р'] = 'р', ['С'] = 'с', ['Т'] = 'т', ['У'] = 'у', ['Ф'] = 'ф', ['Х'] = 'х', ['Ц'] = 'ц', ['Ч'] = 'ч', ['Ш'] = 'ш', ['Щ'] = 'щ', ['Ъ'] = 'ъ', ['Э'] = 'э', ['Ь'] = 'ь', ['Ю'] = 'ю', ['Я'] = 'я', } local function tolow(s) if not s then return end s = s:lower(); local xlat = kbdlower if xlat then for k, v in stead.pairs(xlat) do s = s:gsub(k,v); end end return s; end local function kbdxlat(s) local kbd if s == 'space' then return ' ' end if s == 'return' then return '\n' end if s:len() > 1 then return end if input.kbd_alt_xlat and (game.codepage == 'UTF-8' or game.codepage == 'utf-8') then kbd = kbdru; else kbd = kbden end if kbd and input.kbd_shift then kbd = kbd.shifted; end if not kbd[s] then if input.kbd_shift then return s:upper(); end return s; end return kbd[s] end game.action = stead.hook(game.action, function (f, s, cmd, ...) if cmd == 'kbd_enter' then local r,v if stead.here().inp_enter then r,v = stead.call(stead.here(), 'inp_enter'); elseif s.inp_enter then r,v = stead.call(s, 'inp_enter'); end return r,v -- nothing todo end return f(s, cmd, ...) end) local lookup_inp = function() for i, o in stead.opairs(objs()) do o = stead.ref(o) if o._edit then return o end end end local input_kbd = function(s, down, key) if not input._txt then return end if key:find("shift") then input.kbd_shift = down elseif key:find("alt") then if down and input.inp_xlat then input.kbd_alt_xlat = not input.kbd_alt_xlat; end input.kbd_alt = down elseif down then local o = lookup_inp(); if not o then return end if input.kbd_alt then return end if key == "return" then if o then o._edit = false o._txt = input._txt input._txt = false return "kbd_enter" end return end if key == "backspace" then if input._txt == '' then return end if input._txt:byte(input._txt:len()) >= 128 then input._txt = input._txt:sub(1, input._txt:len() - 2); else input._txt = input._txt:sub(1, input._txt:len() - 1); end return "wait" end local c = kbdxlat(key); if not c then return end if o and stead.type(o.filter) == 'function' then c = o:filter(c); if not c then return end end input._txt = input._txt..c; return "wait" end end stead.module_init(function() input.cursor = '_' input.inp_xlat = true input.key = stead.hook(input.key, function(f, ...) local r = input_kbd(...) if r then return r end return f(...) end) end) local function input_esc(s) local rep = function(s) return txtnb(s) end if not s then return end -- return s:gsub("\\","\\\\\\\\"):gsub(">","\\\\>"):gsub("%^","\\%^"): local r = s:gsub("[^ ]+", rep):gsub("[ \t]", rep):gsub("{","\\{"):gsub("}","\\}"); return r end function inp(n, info, txt) if stead.type(n) ~= 'string' or stead.type(info) ~= 'string' then error ("Wrong parameter to inp.", 2); end local v = { nam = n, _txt = '', info = info } if txt then v._txt = txt end v.dsc = function(s) if s._edit then return s.info..input_esc(input._txt)..input.cursor end return s.info..input_esc(s._txt) end v.text = function(s, text) local t if s._edit then t = input._txt else t = s._txt end if text then if s._edit then input._txt = text else s._txt = text end return end return t end v.match = function(s, str) local aa = tolow(tostring(str)):gsub("[*]",".*"):gsub("[?]",".?"); local bb = tolow(tostring(s:text())); if bb:find("^"..aa.."$") then return true end end v.state = function(s, t) local os = s._edit if t == nil then return os end s._edit = t if os and t or (not os and not t) then return os end if s._edit then input._txt = s._txt; else s._txt = input._txt input._txt = false end return os end; v.act = function(s) if input._txt and not s._edit then return true end -- somewhere else s:state(not s._edit) return true end v.save = function(self, name, h, need) if need then h:write(stead.string.format("%s = inp (%q, %q, %q);\n", name, self.nam, self.info, self._txt)) end stead.savemembers(h, self, name, false); end return obj(v) end -- vim:ts=4 instead-3.2.1/stead/stead2/format.lua0000644000175000017500000000264113267071774016462 0ustar peterpeterformat = { nam = 'format'; object_type = true; system_type = true; para = false; para_space = ' '; quotes = false; dash = false; filter = nil; nopara = '_'; save = function(self, name, h, need) for k, v in stead.pairs(self) do if k == 'para' or k == 'para_space' or k == 'quotes' or k == 'dash' or k == 'nopara' then local s = stead.tostring(v) h:write(stead.string.format("format[%q] = %s;\n", k, s)) end end end; } stead.fmt = stead.hook(stead.fmt, function(f, ...) local utf8 local r = f(...) if game.codepage == 'UTF-8' or game.codepage == 'utf-8' then utf8 = true end if stead.type(r) == 'string' and stead.state then if stead.type(format.filter) == 'function' and stead.state then r = format.filter(r); end if stead.call_bool(format, 'dash') and utf8 then r = r:gsub('([^-])%-%-([^-])', '%1—%2'); r = r:gsub('^%-%-([^-])', '—%1'); end if stead.call_bool(format, 'quotes') and utf8 then r = r:gsub('_"','«'):gsub('"_',"»"); r = r:gsub('"([^"]*)"','«%1»'); r = r:gsub(',,','„'):gsub("''",'”'); end if stead.call_bool(format, 'para') then r = r:gsub('\n([^\n])', '<¶>%1'):gsub('<¶>[ \t]*'..format.nopara,'\n'):gsub('<¶>[ \t]*', '\n'..txtnb(format.para_space)); r = r:gsub('^[ \t]*', '<¶>'):gsub('<¶>[ \t]*'..format.nopara,''):gsub('<¶>[ \t]*', txtnb(format.para_space)); end end return r; end) -- vim:ts=4 instead-3.2.1/stead/stead2/theme.lua0000644000175000017500000001135113267071774016272 0ustar peterpetertheme = { nam = 'theme'; object_type = true; system_type = true; save = function(self, name, h, need) if self.name() ~= '.' then return end for k, v in stead.pairs(self.vars) do h:write(stead.string.format("theme.set(%q, %q);\n", k, v)) end end; reset = function(...) local a = {...}; for i = 1, stead.table.maxn(a) do local name = a[i] local v if name then v = theme.reset_vars[name] if v then instead_theme_var(name, v); theme.vars[name] = nil theme.reset_vars[name] = nil end end end end; set = function(name, val) if val and name then if not theme.reset_vars[name] then theme.reset_vars[name] = instead_theme_var(name) end instead_theme_var(name, stead.tostr(val)); theme.vars[name] = stead.tostr(val); end end; name = function(...) return instead_theme_name(...); end; get = function(...) return instead_theme_var(...); end; win = { reset = function() theme.reset("win.x", "win.y", "win.w", "win.h", "win.col.fg", "win.col.link", "win.col.alink", "win.fnt.name", "win.fnt.size", "win.fnt.height"); end; geom = function(x, y, w, h) theme.set("win.x", x); theme.set("win.y", y); theme.set("win.w", w); theme.set("win.h", h); end; color = function(fg, link, alink) theme.set("win.col.fg", fg); theme.set("win.col.link", link); theme.set("win.col.alink", alink); end; font = function(name, size, height) theme.set("win.fnt.name", name); theme.set("win.fnt.size", size); theme.set("win.fnt.height", height); end; gfx = { reset = function() theme.reset("win.gfx.up", "win.up.x", "win.up.y"); theme.reset("win.gfx.down", "win.down.x", "win.down.y"); end; up = function(pic, x, y) theme.set("win.gfx.up", pic); theme.set("win.up.x", x); theme.set("win.up.y", y); end; down = function(pic, x, y) theme.set("win.gfx.down", pic); theme.set("win.down.x", x); theme.set("win.down.y", y); end; }; }; inv = { reset = function() theme.reset("inv.x", "inv.y", "inv.w", "inv.h", "inv.col.fg", "inv.col.link", "inv.col.alink", "inv.fnt.name", "inv.fnt.size", "inv.fnt.height", "inv.mode"); end; geom = function(x, y, w, h) theme.set("inv.x", x); theme.set("inv.y", y); theme.set("inv.w", w); theme.set("inv.h", h); end; color = function(fg, link, alink) theme.set("inv.col.fg", fg); theme.set("inv.col.link", link); theme.set("inv.col.alink", alink); end; font = function(name, size, height) theme.set("inv.fnt.name", name); theme.set("inv.fnt.size", size); theme.set("inv.fnt.height", height); end; mode = function(mode) theme.set("inv.mode", mode); end; gfx = { reset = function() theme.reset("inv.gfx.up", "inv.up.x", "inv.up.y"); theme.reset("inv.gfx.down", "inv.down.x", "inv.down.y"); end; up = function(pic, x, y) theme.set("inv.gfx.up", pic); theme.set("inv.up.x", x); theme.set("inv.up.y", y); end; down = function(pic, x, y) theme.set("inv.gfx.down", pic); theme.set("inv.down.x", x); theme.set("inv.down.y", y); end; }; }; menu = { reset = function() theme.reset("menu.bw", "menu.col.fg", "menu.col.bg", "menu.col.alpha", "menu.col.link", "menu.col.alink", "menu.fnt.name", "menu.fnt.size", "menu.fnt.height"); end; bw = function(w) theme.set("menu.bw", w); end; color = function(fg, bg, alpha, link, alink) theme.set("menu.col.fg", fg); theme.set("menu.col.bg", bg); theme.set("menu.col.alpha", alpha); theme.set("menu.col.link", link); theme.set("menu.col.alink", alink); end; font = function(name, size, height) theme.set("menu.fnt.name", name); theme.set("menu.fnt.size", size); theme.set("menu.fnt.height", height); end; gfx = { reset = function() theme.reset("menu.gfx.button", "menu.button.x", "menu.button.y"); end; button = function(b, x, y) theme.set("menu.gfx.button", b); theme.set("menu.button.x", x); theme.set("menu.button.y", y); end; }; }; gfx = { reset = function() theme.reset("scr.gfx.cursor.normal", "scr.gfx.cursor.use", "scr.gfx.cursor.x", "scr.gfx.cursor.y", "scr.gfx.mode", "scr.gfx.pad", "scr.gfx.bg"); end; cursor = function(norm, use, x, y) theme.set("scr.gfx.cursor.normal", norm); theme.set("scr.gfx.cursor.use", use); theme.set("scr.gfx.cursor.x", x); theme.set("scr.gfx.cursor.y", y); end; mode = function(mode) theme.set("scr.gfx.mode", mode); end; pad = function(pad) theme.set("scr.gfx.pad", pad); end; bg = function(bg) theme.set("scr.gfx.bg", bg); end; }; snd = { reset = function() theme.reset("snd.click"); end; click = function(w) theme.set("snd.click", w); end } } theme.vars = {} theme.reset_vars = {} instead-3.2.1/stead/stead2/para.lua0000644000175000017500000000004413267071774016110 0ustar peterpeterrequire "format" format.para = true instead-3.2.1/stead/stead2/nolife.lua0000644000175000017500000000020613267071774016441 0ustar peterpetergame.life = stead.hook(game.life, function(f, ...) if stead.call_bool(stead.here(), 'nolife') then return end return f(...) end) instead-3.2.1/stead/stead2/timer.lua0000644000175000017500000000074313267071774016313 0ustar peterpetergame.action = stead.hook(game.action, function(f, s, cmd, ...) if cmd == 'user_timer' then local r,v if stead.here().timer then r,v = stead.call(stead.here(), 'timer'); elseif s.timer then r,v = stead.call(s, 'timer'); end if r == nil and v == nil and not stead.api_atleast(1, 3, 5) then return nil, true end return r,v end return f(s, cmd, ...); end) stead.module_init(function() timer.callback = function(s) return 'user_timer' end end) -- vim:ts=4 instead-3.2.1/stead/stead2/quotes.lua0000644000175000017500000000004613267071774016507 0ustar peterpeterrequire "format" format.quotes = true instead-3.2.1/stead/stead2/dbg.lua0000644000175000017500000002270013267071774015724 0ustar peterpeter-- add this: reuire "dbg" -- in your project -- for debug tools require "input" local function _xref_escape(n) local delim = ':' if stead.api_atleast(1, 2, 2) then delim = stead.delim; end if xact then n = n:gsub("\\?[\\"..delim.."]", { [delim] = "\\"..delim } ) end return n end local function ordered_n(t) local ordered = {}; local max = 0 for i, v in stead.pairs(t) do local o = { k = i; v = v }; stead.table.insert(ordered, o); max = max + 1; end stead.table.sort(ordered, function(a, b) if isObject(a.v) and not isObject(b.v) then return true end if not isObject(a.v) and isObject(b.v) then return false end if isObject(a.v) and isObject(b.v) then local n = stead.call(a.v, 'nam'); local m = stead.call(b.v, 'nam'); if stead.type(n) ~= 'string' and stead.type(m) ~= 'string' then return false end if stead.type(n) ~= 'string' then return true end if stead.type(m) ~= 'string' then return false end if n == m then local o1, o2 o1 = stead.deref(a.v) o2 = stead.deref(b.v) if stead.type(o1) == 'string' and stead.type(o2) == 'string' then return o1 < o2 end end return n < m; end return false end) ordered.i = 1; ordered.max = max; return ordered; end local function snext(t, k) local v if not k then k = ordered_n(t); end if k.i > k.max then return nil end v = k[k.i] k.i = k.i + 1 return k, v.v, v.k; end local function spairs(s, var) return snext, s, nil; end function dbg_disp_obj() local v = obj { nam = 'disp', act = true, dsc = function(s) local r = s._txt s._txt = nil; return r end; save = function(self, name, h, need) if need then h:write(stead.string.format("%s = dbg_disp_obj();\n", name)); end stead.savemembers(h, self, name, false); end } return v; end dbg_dump_obj = function(w) w = stead.ref(w) if stead.type(w) ~= 'table' then seen('disp')._txt = '^^No such object.'; return true end local n local rc = '' for i, o in stead.pairs(w) do local t = stead.tostring(o); if t == i then t = stead.tostr(o); end if t then if rc ~='' then rc = rc..'^' end local n = ''; if isObject(o) then n = stead.call(o, 'nam'); if stead.type(n) ~= 'string' then n = '' else n = ' : '..n; end end rc = stead.cat(rc, stead.par(' ', stead.tostr(i)..' : '..t..n)); end end seen('disp')._txt = stead.cat('^^', rc) return true; end dbg_dump_globals = function() local rc='' if stead.type(variables) ~= 'table' then return end for i, o in stead.ipairs(variables) do local v = stead.rawget(_G, o); local t = stead.tostring(v); if t then if rc ~='' then rc = rc..'^' end rc = stead.cat(rc, stead.par(' ', stead.tostr(o)..' : '..t)); end end seen('disp')._txt = stead.cat('^^', rc) return true; end dbg_here = function() return debug_tool._here end dbg_list_objects = function() local dis = function(o) if isDisabled(o) then return ", disabled" end return '' end local rc = stead.par(' ', 'Room:'..stead.tostr(stead.deref(dbg_here())), 'Nam:'..stead.tostr(stead.call(dbg_here(),'nam'))); for i, o in stead.opairs(objs(dbg_here())) do rc = rc..'^'; o = stead.ref(o) rc = stead.cat(rc, stead.par(' ', 'Id: '..stead.tostr(o.id)..', '.. stead.tostr(stead.deref(o))..': '..stead.tostr(stead.call(o, 'nam'))..dis(o))); end -- seen('disp')._txt = rc return rc end dbg_list_inv = function() local rc = '' local dis = function(o) if isDisabled(o) then return ", disabled" end return '' end local tak = function(o) if taken(o) then return ", taken" end return '' end for i, o in stead.opairs(inv()) do if rc ~='' then rc = rc..'^' end o = stead.ref(o) rc = stead.cat(rc, stead.par(' ', 'Id: '..stead.tostr(o.id)..', '.. stead.tostr(stead.deref(o))..': '..stead.tostr(stead.call(o, 'nam'))..dis(o)..tak(o))); end if rc == '' then return end -- seen('disp')._txt = rc return rc end dbg_execute_cmd = room { nam = "Execute Lua code", debug = true, pic = true, system_type = true, forcedsc = true, dsc = "Enter Lua code here to exec.", inp_enter = function(s) if stead.type(s.obj[1]._txt) == 'string' then local f = stead.eval(s.obj[1]._txt); if f then seen('disp')._txt = stead.cat('^^', f()); return true end seen('disp')._txt = "^^Error in exec."; return true end return stead.back(); end, obj = { inp('inp', '{Enter cmd}: ', 'return "Hello World!"'), obj { nam = 'Back', dsc = '^{Back}', act = code [[ stead.back() ]] }, dbg_disp_obj(), }, exit = function(s) s.obj[1]:state(false) end; } dbg_dump_object = room { nam = "Dump object", debug = true, pic = true, system_type = true, forcedsc = true, dsc = "Enter object name here to dump.", inp_enter = function(s) local w = s.obj[1]._txt if stead.type(w) == 'string' then if not stead.ref(w) then w = objs(dbg_here()):srch(w); end return dbg_dump_obj(w); end return stead.back(); end, obj = { inp('inp', '{Enter object}: ', 'main'), obj{nam = 'Here', dsc = '^{Dump here}', act = code[[ return dbg_dump_obj(dbg_here())]]}, obj{nam = 'Player',dsc = '^{Dump player}', act = code[[ return dbg_dump_obj(stead.me())]]}, obj{nam = 'Lifes', dsc = '^{Dump lifes}', act = code[[ return dbg_dump_obj(debug_tool.lifes)]]}, obj{nam = 'Ways', dsc = '^{Dump ways}', act = code[[ return dbg_dump_obj(ways(dbg_here()))]]}, obj{nam = 'Globals', dsc = '^{Dump globals}', act = code [[return dbg_dump_globals()]] }, obj{nam = 'Back', dsc = '^{Back}', act = code [[ return stead.back() ]] }, dbg_disp_obj() }, exit = function(s) s.obj[1]:state(false) end; } dbg_choose_location = dlg { debug = true, pic = true, system_type = true, forcedsc = true, nam = 'Go to', dsc = 'Select location.', gen = function(s) objs(s):zap(); for k, v, kk in spairs(_G) do if isRoom(v) and not v.debug then local n = stead.tostr(stead.call(v, 'nam')); local o = kk; if stead.type(o) == 'string' then n = n..' : '..o; n = _xref_escape(n); put(phr(n, true, [[timer:set(debug_tool._timer); game.lifes:cat(debug_tool.lifes); return stead.walk(]]..o..[[)]]), s); end end end put (phr('Back',true, 'return stead.back()'), s) end } dbg_choose_object = dlg { debug = true, pic = true, system_type = true, forcedsc = true, nam = 'Get object', dsc = 'Select object to get.', gen = function(s) objs(s):zap(); for k, v, kk in spairs(_G) do if isObject(v) and not isPhrase(v) and not isRoom(v) and not isPlayer(v) and not v.debug and not have(v) and not isStatus(v) then local n = stead.tostr(stead.call(v, 'nam')); local o = kk; if stead.type(o) == 'string' then n = n..' : '..o; n = _xref_escape(n); put(phr(n, true, o..':enable(); return take('..o..')'), s); end end end put (phr('Back',true, 'return stead.back()'), s) end } dbg_drop_object = dlg { debug = true, pic = true, forcedsc = true, system_type = true, nam = 'Drop object', dsc = 'Select object to drop.', gen = function(s) objs(s):zap(); for k, v in stead.ipairs(inv()) do v = stead.ref(v); if not v.debug then local n = stead.tostr(stead.call(v, 'nam')); local o = stead.deref(v); if stead.type(o) == 'string' then n = n..' : '..o; n = _xref_escape(n); put (phr(n, true, o..':enable(); drop('..o..','..stead.deref(dbg_here())..')'), s) end end end put (phr('Back', true, 'return stead.back()'), s) end } function dbg_exit() local r if not stead.api_atleast(1, 2, 0) then r = stead.call(dbg_here(), 'dsc'); end game.lifes:cat(debug_tool.lifes); timer:set(debug_tool._timer); return stead.par ('^^', stead.back(), r); end debug_dlg = dlg { debug = true, pic = true, system_type = true, forcedsc = true, nam = 'Debug Tool', dsc = 'Select tool.', obj = { phr('Go to location...', true, [[pon(); dbg_choose_location:gen(); return stead.walk('dbg_choose_location')]]), phr('Get object...', true, [[pon(); dbg_choose_object:gen(); return stead.walk('dbg_choose_object')]]), phr('Put object...', true, [[pon(); dbg_drop_object:gen(); return stead.walk('dbg_drop_object')]]), phr('Current scene...', true, [[pon(); return dbg_list_objects();]]), phr('Inventory...', true, [[pon(); return dbg_list_inv();]]), phr('Dump object...', true, [[pon(); return stead.walk(dbg_dump_object);]]), phr('Exec Lua string...', true, [[pon(); return stead.walk('dbg_execute_cmd')]]), phr('Exit',true , [[pon(); return dbg_exit()]]), }, }; debug_tool = menu { debug = true, system_type = true, forcedsc = true, nam = txtb('debug'), lifes = list {}, inv = function(s) if stead.here().debug then return nil, true --nothing todo end debug_dlg.__from__ = stead.here(); s._timer = timer:get(); timer:stop(); s.lifes:zap(); s.lifes:cat(game.lifes); game.lifes:zap(); s._here = stead.here(); stead.me().where = 'debug_dlg'; -- force to go return stead.walk(self.where); end, }; game.action = stead.hook(game.action, function (f, s, cmd, ...) if cmd == 'use_debug' then return debug_tool:inv() elseif cmd == 'exit_debug' then stead.me().where = 'debug_dlg'; dbg_execute_cmd.obj[1]:state(false) dbg_dump_object.obj[1]:state(false) return dbg_exit() end return f(s, cmd, ...) end) stead.module_init(function() input.key = stead.hook(input.key, function(f, s, down, key, ...) if down and key == 'f7' then if stead.here().debug then return 'exit_debug' else return 'use_debug' end end return f(s, down, key, ...) end) putf('debug_tool', stead.me()); end) -- vim:ts=4 instead-3.2.1/stead/stead2/ext/0000755000175000017500000000000013267071774015264 5ustar peterpeterinstead-3.2.1/stead/stead2/ext/timer.lua0000644000175000017500000000217313267071774017112 0ustar peterpeterstead.set_timer = instead_timer stead.timer = function() if stead.type(timer) == 'table' and stead.type(timer.callback) == 'function' then return timer:callback(); end return end stead.module_done(function(s) timer:stop() end) local function compat_api() if not stead.api_atleast(1, 7, 1) then set_timer = instead_timer end end stead.module_start(function(load) if compat_api and not load then compat_api() compat_api = nil end end) stead.module_init(function(s) timer = obj { -- timer calls stead.timer callback nam = 'timer', ini = function(s) if stead.tonum(s._timer) ~= nil and stead.type(stead.set_timer) == 'function' then stead.set_timer(s._timer); end end, get = function(s) if stead.tonum(s._timer) == nil then return 0 end return stead.tonum(s._timer); end, stop = function(s) return s:set(0); end, del = function(s) return s:set(0); end, set = function(s, v) s._timer = stead.tonum(v); if stead.type(stead.set_timer) ~= 'function' then return false end stead.set_timer(v) return true end, --[[ callback = function(s) end, ]] }; end) instead-3.2.1/stead/stead2/ext/sprites.lua0000644000175000017500000000115213267071774017457 0ustar peterpeterstead.ticks = instead_ticks stead.mouse_pos = instead_mouse_pos stead.mouse_show = instead_mouse_show stead.finger_pos = instead_finger_pos stead.mouse_filter = instead_mouse_filter stead.busy = instead_busy mouse_pos = stead.mouse_pos mouse_filter = stead.mouse_filter get_ticks = stead.ticks local function compat_api() if not stead.api_atleast(1, 7, 1) then stead_busy = instead_busy theme_var = instead_theme_var theme_name = instead_theme_name get_themespath = instead_themespath end end stead.module_start(function(load) if compat_api and not load then compat_api() compat_api = nil end end) instead-3.2.1/stead/stead2/ext/sound.lua0000644000175000017500000000674513267071774017133 0ustar peterpeterstead.get_music = function() return game._music, game._music_loop; end stead.get_music_loop = function() return game._music_loop; end stead.save_music = function(s) if s == nil then s = self end s.__old_music__ = stead.get_music(); s.__old_loop__ = stead.get_music_loop(); end stead.restore_music = function(s) if s == nil then s = self end stead.set_music(s.__old_music__, s.__old_loop__); end stead.set_music = function(s, count) game._music = s; if not stead.tonum(count) then game._music_loop = 0; else game._music_loop = stead.tonum(count); end end stead.set_music_fading = function(o, i) if o and o == 0 then o = -1 end if i and i == 0 then i = -1 end game._music_fadeout = o if not i then game._music_fadein = o else game._music_fadein = i end end stead.get_music_fading = function() return game._music_fadeout, game._music_fadein end stead.stop_music = function() stead.set_music(nil, -1); end stead.is_music = function() return game._music ~= nil and game._music_loop ~= -1 end if instead_sound == nil then function instead_sound() return false -- sdl-instead export own function end end stead.is_sound = instead_sound stead.get_sound = function() return game._sound, game._sound_channel, game._sound_loop; end stead.get_sound_chan = function() return game._sound_channel end stead.get_sound_loop = function() return game._sound_loop end stead.stop_sound = function(chan, fo) if not stead.tonum(chan) then if stead.tonum(fo) then stead.set_sound('@-1,'..stead.tostr(fo)); else stead.set_sound('@-1'); end return end if stead.tonum(fo) then stead.add_sound('@'..stead.tostr(chan)..','..stead.tostr(fo)); else stead.add_sound('@'..stead.tostr(chan)); end end stead.add_sound = function(s, chan, loop) if stead.type(s) ~= 'string' then return end if stead.type(game._sound) == 'string' then if stead.tonum(chan) then s = s..'@'..stead.tostr(chan); end if stead.tonum(loop) then s = s..','..stead.tostr(loop) end stead.set_sound(game._sound..';'..s, stead.get_sound_chan(), stead.get_sound_loop()); else stead.set_sound(s, chan, loop); end end stead.set_sound = function(s, chan, loop) game._sound = s; if not stead.tonum(loop) then game._sound_loop = 1; else game._sound_loop = stead.tonum(loop); end if not stead.tonum(chan) then game._sound_channel = -1; else game._sound_channel = stead.tonum(chan); end end stead.module_done(function(s) stead.stop_music(); stead.stop_sound(); end) stead.module_cmd(function(s) stead.set_sound(); -- empty sound end) -- those are sill in global space add_sound = stead.add_sound set_sound = stead.set_sound stop_sound = stead.stop_sound get_sound = stead.get_sound get_sound_loop = stead.get_sound_loop get_sound_chan = stead.get_sound_chan get_music = stead.get_music get_music_fading = stead.get_music_fading get_music_loop = stead.get_music_loop set_music = stead.set_music set_music_fading = stead.set_music_fading stop_music = stead.stop_music save_music = stead.save_music restore_music = stead.restore_music is_music = stead.is_music local function compat_api() if not stead.api_atleast(1, 7, 1) then is_sound = instead_sound sound_load = instead_sound_load sound_free = instead_sound_free sounds_free = instead_sounds_free sound_channel = instead_sound_channel sound_volume = instead_sound_volume sound_panning = instead_sound_panning end end stead.module_start(function(load) if compat_api and not load then compat_api() compat_api = nil end end) instead-3.2.1/stead/stead2/ext/gui.lua0000644000175000017500000002032113267071774016551 0ustar peterpetergame.hinting = true; game.showlast = true; game.gui = { fading = 4; ways_delim = ' | '; inv_delim = '\n'; hinv_delim = ' | '; hideways = false; hideinv = false; hidetitle = false; } iface.input = function(self, event, ...) if stead.type(input) ~= 'table' then return end if event == 'kbd' then if stead.type(input.key) == 'function' then return input:key(...); -- pressed, event end elseif event == 'mouse' then if stead.type(input.click) == 'function' then return input:click(...); -- pressed, x, y, mb end elseif event == 'finger' then if stead.type(input.finger) == 'function' then return input:finger(...); -- pressed, x, y, finger end elseif event == 'event' then if stead.type(input.event) == 'function' then return input:event(...); end end return end stead.objects.input = function() return obj { -- input object system_type = true, nam = 'input', }; end; iface.xref = function(self, str, obj, ...) local o = stead.ref(obj); local cmd='' if not isObject(o) or isStatus(o) or (not o.id and not isXaction(o)) then return str; end if stead.ref(ways():srch(obj)) then cmd = 'go '; elseif isMenu(o) then cmd = 'act '; elseif isSceneUse(o) then cmd = 'use '; elseif isXaction(o) and not o.id then cmd = 'act '; end local a = '' local varg = {...} for i = 1, stead.table.maxn(varg) do a = a..','..varg[i] end if isXaction(o) and not o.id then return stead.cat('',str,''); end return stead.cat('',str,''); end; iface.anchor = function(self) return '' end iface.enum = function(self, n, str) if str == nil or n == nil then return nil; end; return n..self:nb(' - ')..str; end iface.title = function(self, str) return nil end; iface.img = function(self, str) if str == nil then return nil; end; return ""; end; iface.imgl = function(self, str) if str == nil then return nil; end; return ""; end; iface.imgr = function(self, str) if str == nil then return nil; end; return ""; end; iface.nb = function(self, str) if stead.type(str) ~= 'string' then return nil end return "","\\>"):gsub("%^","\\^")..">"; end; iface.under = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.em = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.st = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.right = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.left = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.center = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.just = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.tab = function(self, str, al) if stead.tonum(str) then str = stead.tostr(str) end if stead.type(str) ~= 'string' then return nil; end if al == 'right' then str = str .. ",right" elseif al == 'center' then str = str .. ",center" end return '' end; iface.y = function(self, str, al) if stead.tonum(str) then str = stead.tostr(str) end if stead.type(str) ~= 'string' then return nil; end if al == 'middle' then str = str .. ",middle" elseif al == 'top' then str = str .. ",top" end return '' end; iface.bold = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.top = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.bottom = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.middle = function(self, str) if str == nil then return nil; end; return stead.cat('',str,''); end; iface.inv = function(self, str) return str end; iface.ways = function(self, str) return str end; instead.get_inv = stead.cacheable('inv', function(horiz) local r = stead.call_value(game.gui, 'hideinv'); if r then return end local str = iface:cmd("inv"); if str then str = stead.string.gsub(str, '\n$',''); if not horiz then str = stead.string.gsub(str, '\\?['.. stead.delim ..']', { [stead.delim] = game.gui.inv_delim, ['\\'..stead.delim] = stead.delim }); else str = stead.string.gsub(str, '\\?['.. stead.delim ..']', { [stead.delim] = game.gui.hinv_delim, ['\\'..stead.delim] = stead.delim }); end end return str end) instead.get_ways = stead.cacheable('ways', function() local r = stead.call_value(game.gui, 'hideways'); if r then return end local str = iface:cmd("way"); if str and str ~= '' then str = stead.string.gsub(str, '\n$',''); str = stead.string.gsub(str, '\\?['..stead.delim ..']', { [stead.delim] = game.gui.ways_delim, [ '\\'..stead.delim ] = stead.delim }); return iface:center(str); end return str end) instead.get_title = stead.cacheable('title', function() local r = stead.call_value(game.gui, 'hidetitle'); if r then return end local s if stead.api_atleast(1, 2, 0) then s = stead.dispof(stead.here()); else s = stead.call(stead.here(), 'nam'); end if stead.type(s) == 'string' and s ~= '' then stead.state = false s = ""..stead.fmt(s)..""; s = stead.string.gsub(s, '\\'..stead.delim, stead.delim); end return s end) instead.finish_music = function() if instead.get_music_loop() == 0 then return false end local n = stead.get_music() stead.set_music(n, -1); return true end instead.isEnableSave = isEnableSave; instead.isEnableAutosave = isEnableAutosave; -- here is gui staff only function stat(v) v.status_type = true return obj(v); end function isStatus(v) if stead.type(v) ~= 'table' then return false end if v.status_type then return true end return false end stead.menu_save = function(self, name, h, need) local dsc; if need then print ("Warning: menu "..name.." can not be saved!"); return end stead.savemembers(h, self, name, need); end MENU_TAG_ID = 1000000 function menu(v) v.menu_type = true if v.inv == nil then v.inv = function(s) local r,v r,v = stead.call(s, 'menu'); if v == nil then v = true end if r == nil then stead.obj_tag(stead.me(), MENU_TAG_ID); -- retag menu field end return r, v end end if v.act == nil then v.act = function(s) local r,v r,v = stead.call(s, 'menu'); if v == nil then v = true end if r == nil then stead.obj_tag(stead.me(), MENU_TAG_ID); -- retag menu field end return r, v end end if v.save == nil then v.save = stead.menu_save; end return obj(v); end function isMenu(v) if stead.type(v) ~= 'table' then return false end if v.menu_type then return true end return false end stead.fmt = function(...) local res local a = {...} for i = 1, stead.table.maxn(a) do if stead.type(a[i]) == 'string' then local s = stead.string.gsub(a[i],'\t', stead.space_delim):gsub('[\n]+', stead.space_delim); s = stead.string.gsub(s, '\\?[\\^]', { ['^'] = '\n', ['\\^'] = '^', ['\\\\'] = '\\' }); res = stead.par('', res, s); end end return res end game.fading = function(s) local rc = false local p = instead.get_picture(); if stead.cmd == 'load' then game.lastpic = p; return true end if not stead.state then --only for states!!! return false end if game._time == 1 then -- first cmd game.lastpic = p; return true end if stead.player_moved() or game.lastpic ~= p then rc = true end game.lastpic = p return rc end game.gui.is_fading = function() --to check fading from sdl gui local r,g,v local h = stead.here() if not isRoom(h) then return false end r,v = stead.call_value(h, 'fading'); if r then if stead.tonum(r) and v == nil then return true, stead.tonum(r) end return r, v end g,v = stead.call_value(game, 'fading'); if stead.tonum(g) and v == nil then return true, stead.tonum(g) end return g, v end instead.get_fading = function() local r, v r, v = stead.call_value(game.gui, 'is_fading') if v == nil and r then v = game.gui.fading end return r,v end -- vim:ts=4 instead-3.2.1/stead/stead2/ext/paths.lua0000644000175000017500000000051613267071774017110 0ustar peterpeter-- nothing todo in stead2 ;) local instead_gamepath = instead_gamepath io.open = stead.hook(io.open, function(f, path, acc, ...) if stead.type(path) == 'string' and path:sub(1, 1) ~= '/' and not (path:sub(2, 2) == ':' and path:find("^[A-Z]", 1) == 1) then path = instead_gamepath()..'/'..path end return f(path, acc, ...) end) instead-3.2.1/stead/stead2/proxymenu.lua0000644000175000017500000001402613267071774017240 0ustar peterpeterstead.menu_prefix = '   ' local mpar = function(v, vv, rc) if stead.type(v) == 'string' or stead.type(vv) == 'string' then return stead.par(stead.space_delim, v, vv); elseif v == true or vv == true then return true end return rc end local call = function(o, m, ...) local rc = nil local v, r = stead.call(o, m, ...); if r == false or v == false then rc = false elseif r or v then rc = true end return v, r, rc end stead.obj_proxy = function(o, act, use_mode, used_act, useit_act) local v = {}; v.proxy_type = true; local d = stead.dispof(o); if stead.type(d) == 'string' then v.nam = stead.menu_prefix..d; end if inv():srch(o) then v.nam = txtem(v.nam); end if not v.nam then v.nam = true end v.pobj = o; v.pact = act; v.use_mode = use_mode; v.used_act = used_act; v.useit_act = useit_act; v.save = function(self, name, h, need) if need then h:write(stead.string.format(name.." = stead.obj_proxy(%s, %s, %s, %s, %s);\n", stead.tostring(self.pobj), stead.tostring(self.pact), stead.tostring(self.use_mode), stead.tostring(self.used_act), stead.tostring(self.useit_act))); end stead.savemembers(h, self, name, false); end if use_mode then v.use = function(s, w) if w.proxy_type then local v, r, vv, rr, rc, ri rc = false local act = s.pact v, r, ri = call(game, 'before_'..act, s.pobj, w.pobj); rc = ri or rc if ri == false then return v, false end vv, r, ri = call(s.pobj, act, w.pobj); rc = ri or rc v = mpar(v, vv, rc); if ri == false then return v, false end if stead.type(s.used_act) == 'string' and ri == nil then -- used only if use did nothing vv, r, ri = call(w.pobj, s.used_act, s.pobj); rc = ri or rc v = mpar(v, vv, rc); if ri == false then return v, false end end if ri then vv, rr, ri = call(game, 'after_'..act, s.pobj, w.pobj); rc = rc or ri v = mpar(v, vv, rc); if ri == false then return v, false end end if v == nil then v = stead.call(game, act, s.pobj, w.pobj); end return v, false; end end end v.inv = function(s) local v, r, vv, rr, rc, ri rc = false local act = s.pact if s.use_mode then act = s.useit_act if stead.type(act) ~= 'string' then return nil end end v, r, ri = call(game, 'before_'..act, s.pobj); rc = rc or ri if ri == false then return v end vv, r, ri = call(s.pobj, act); rc = rc or ri v = mpar(v, vv, rc) if ri == false then return v end if ri then vv, rr, ri = call(game, 'after_'..act, s.pobj); rc = rc or ri v = mpar(v, vv, rc); end if v == nil then v = stead.call(game, act, s.pobj); end return v, rc; end if use_mode then return obj(v) end return menu(v) end stead.proxy_fill_objs = function(s, w, act, use_mode, used_act, useit_act) local rc = false for i, o, ii in stead.opairs(w) do o = stead.ref(o); if isObject(o) and not isDisabled(o) and o ~= s and not isPhrase(o) and not o.proxy_type and not isStatus(o) then s.obj:add(stead.obj_proxy(o, act, use_mode, used_act, useit_act)); if not isRoom(o) then stead.proxy_fill_objs(s, o.obj, act, use_mode, used_act, useit_act); end rc = true end end return rc end local select_only = function(s) for k, o in stead.opairs(stead.me().obj) do o = stead.ref(o) if o.action_type and o._state and o ~= s then o:inv(); end end stead.obj_tag(stead.me(), MENU_TAG_ID); end local proxy_menu = function(nam, act, _scene, _inv, _way, use_mode, used_act, useit_act, _ifhave) local v = { }; if stead.type(act) ~= 'string' then error("Wrong parameter to proxy_menu.", 3) end if null[act] then error(stead.tostring(act).."is a reserved handler. Do not use it.", 3) end if used_act and null[used_act] then error(stead.tostring(used_act).."is a reserved handler. Do not use it.", 3) end if useit_act and null[useit_act] then error(stead.tostring(useit_act).."is a reserved handler. Do not use it.", 3) end v.action_type = true; v._state = false; v.nam = nam; v.disp = function(s) local n = stead.call(s, 'nam') if s._state then return txtu(txtnb(n)); end return txtnb(n); end v.fill_scene = _scene; v.fill_inv = _inv; v.fill_ifhave = _ifhave; v.fill_way = _way; v.gen = function(s) local k,o,i local rc = false s.obj:zap(); if s.fill_inv then rc = stead.proxy_fill_objs(s, inv(), act, use_mode, used_act, useit_act); end if not s.fill_ifhave or rc then if s.fill_scene then stead.proxy_fill_objs(s, stead.here().obj, act, use_mode, used_act, useit_act); end end if s.fill_way then stead.proxy_fill_objs(s, stead.here().way, act, use_mode, used_act, useit_act); end select_only(s); end v.inv = function(s) local i,o local k,v s._state = not s._state if s._state then s:gen(); else s.obj:zap(); end return nil, true -- to say instead, do not redraw scene, only inv ;) end return menu(v); end local function gen_actions(s) for k, o in stead.opairs(stead.me().obj) do o = stead.ref(o) if o.action_type and o._state then o:gen(); end end end act_menu = function(nam, act) local v = { }; v.action_type = true; v.nam = nam; v.gen = function(s) end v.inv = function(s) local v, r v, r = stead.call(game, act); return v, r end return menu(v); end obj_menu = function(nam, act, _scene, _inv, _way) return proxy_menu(nam, act, _scene, _inv, _way) end use_menu = function(nam, act, used_act, useit_act, _scene, _inv, _ifhave) return proxy_menu(nam, act, _scene, _inv, false, true, used_act, useit_act, _ifhave) end inv = function(s) return stead.me().inventory; end game.onuse = function(s, v, w) -- do not let use on non proxy obj if not v.proxy_type and not w.proxy_type then return end if not v.proxy_type or not w.proxy_type then return false end end player = stead.inherit(player, function(v) v.inv = function(s) gen_actions(s); return stead.player_inv(s); end v.inventory = list {} return v end) pl = player(pl) -- reinit -- vim:ts=4 instead-3.2.1/stead/stead2/CMakeLists.txt0000644000175000017500000000063113267071774017224 0ustar peterpeterFILE(GLOB STEAD_FILES "*.lua") FILE(GLOB STEAD_EXT_FILES "ext/*.lua") IF(SYSTEMWIDE) INSTALL(FILES ${STEAD_FILES} DESTINATION ${STEADDIR}/stead2) INSTALL(FILES ${STEAD_EXT_FILES} DESTINATION ${STEADDIR}/stead2/ext) ELSEIF(STANDALONE) INSTALL(FILES ${STEAD_FILES} DESTINATION ${STANDALONEDIR}/stead/stead2) INSTALL(FILES ${STEAD_EXT_FILES} DESTINATION ${STANDALONEDIR}/stead/stead2/ext) ENDIF(SYSTEMWIDE) instead-3.2.1/stead/stead2/nouse.lua0000644000175000017500000000034413267071774016321 0ustar peterpetergame.use = function(s, w, o) local r, v r, v = stead.call(w, 'nouse', o); if not r and not v then r, v = stead.call(o, 'noused', w); end if not r and not v then r, v = stead.call(s, 'nouse', w, o) end return r, v end instead-3.2.1/stead/stead2/kbd.lua0000644000175000017500000000207113267071774015727 0ustar peterpetergame.action = stead.hook(game.action, function(f, s, cmd, ...) if cmd == 'user_kbd' then local r,v; if stead.here().kbd then r,v = stead.call(stead.here(), 'kbd', input.key_event.down, input.key_event.key); elseif s.kbd then r,v = stead.call(s, 'kbd', input.key_event.down, input.key_event.key); end if r == nil and v == nil and not stead.api_atleast(1, 3, 5) then return nil, true end return r,v end return f(s, cmd, ...); end) stead.module_init(function() input.key = stead.hook(input.key, function(f, s, down, key, ...) if input._key_hooks[key] then input.key_event = { key = key, down = down }; return 'user_kbd' end return f(s, down, key, ...) end) input._key_hooks = {} end) stead.hook_keys = function(...) local a = {...}; for i = 1, stead.table.maxn(a) do input._key_hooks[tostring(a[i])] = true; end end stead.unhook_keys = function(...) local a = {...}; for i = 1, stead.table.maxn(a) do input._key_hooks[tostring(a[i])] = nil; end end hook_keys = stead.hook_keys unhook_keys = stead.unhook_keys -- vim:ts=4 instead-3.2.1/stead/stead2/vars.lua0000644000175000017500000000645413267071774016153 0ustar peterpeterlocal G = { } local function variables(g) if g == _G then return G.variables end if type(g) == 'table' then return g.variables end end local function variables_save(g) if g == _G then return G.variables_save end if type(g) == 'table' then return g.variables_save end end function isForSave(k, v, s) -- k - key, v - value, s -- parent table local i,o if stead.type(variables_save(s)) == 'table' and variables_save(s)[k] then return true end if stead.type(k) == 'function' then return false end if stead.type(v) == 'function' or stead.type(v) == 'userdata' then return false end if stead.type(k) ~= 'string' then return false end return stead.string.find(k, '_') == 1 end local function __vars_add(s, v, set) if not variables(s) then s.variables = {} end for k, o in stead.pairs(v) do if stead.tonum(k) then stead.table.insert(variables(s), o); elseif variables(s)[k] then error ("Variable overwrites variables object: "..stead.tostr(k)) elseif k ~= 'variable_type' then if set and not isObject(o) then if stead.rawget(s, k) then if s == _G then print ("Global variable '"..stead.tostr(k).."' conflicts with "..stead.type(stead.rawget(s, k))); else error ("Variable conflict: "..stead.tostr(k)); end end stead.table.insert(variables(s), k); stead.rawset(s, k, o) else variables(s)[k] = o end end end end local function __vars_fill(v) if stead.type(v) ~= 'table' then return end for k, o in stead.ipairs(v) do if stead.type(o) == 'table' and o.variable_type then __vars_add(v, o); stead.rawset(v, k, false) end end if stead.type(variables(v)) == 'table' then local vars = {} if v == _G then G.variables_save = {} else v.variables_save = {} end for k, o in stead.pairs(variables(v)) do if stead.tonum(k) and stead.type(o) == 'string' then stead.table.insert(vars, o) else if stead.rawget(v, k) then error ("Variable overwrites object property: "..stead.tostr(k)); end stead.rawset(v, k, o) stead.table.insert(vars, k); end end for k, o in stead.ipairs(vars) do variables_save(v)[o] = true end if v == _G then G.variables = vars; else v.variables = vars; end end end vars_object = obj { nam = 'vars', system_type = true, ini = function(s) __vars_fill(_G) __vars_fill(pl) __vars_fill(game) end } obj = stead.hook(obj, function(f, v, ...) __vars_fill(v) return f(v, ...) end) stead.add_var = function(s, v) if not v then v = s s = _G end if stead.type(v) ~= 'table' then error("Wrong parameter to stead.add_var."); end if not v.variable_type then v = var(v) end __vars_add(s, v, true) __vars_fill(s) end local function mod_init() if stead.type(variables(_G)) == 'table' then for k, v in stead.ipairs(variables(_G)) do stead.rawset(_G, v, nil) end end G.variables = {} G.variables_save = {} if not stead.api_atleast(2, 5, 0) then -- fake data stead.rawset(_G, 'variables_save', {}) -- to save broken saves stead.rawset(_G, 'variables', {}) end end stead.module_init(mod_init) stead.module_done(mod_init) function var(v) v.variable_type = true return v end function global(v) if stead.type(v) ~= 'table' then error("Wrong parameter to global.", 2); end __vars_add(_G, v, true); end -- require 'strict' -- vim:ts=4 instead-3.2.1/stead/stead2/xact.lua0000644000175000017500000000621713267071774016134 0ustar peterpeterxact = function(n, f) -- just simple action! local v = {}; if f == nil and stead.type(n) == 'table' then f = n[2]; n = n[1]; end if stead.type(n) ~= 'string' then error ("Wrong parameter to xact.", 2) end v.xaction_type = true v.nam = n if stead.api_atleast(1, 6, 3) then v.disp = false end v.act = f; v = obj(v); v.save = function(self, name, h, need) if need then local f = self.act; f = stead.tostring(f); if f == nil then error("Can not save xact: "..name); end h:write(stead.string.format("%s = xact(%q, %s);\n", name, self.nam, f)) end stead.savemembers(h, self, name, false); end return v end local __do_xact = function(str, self) local aarg = {} local function parg(v) stead.table.insert(aarg, v); return '' end local xrefrep = function(str) local s = stead.string.gsub(str,'[\001\002]',''); local o,d,a, oo; local delim = ':' if stead.api_atleast(1, 2, 2) then delim = stead.delim; end s = s:gsub('\\?[\\'..delim..']', { [ delim ] = '\001', [ '\\'..delim ] = delim }); local i = s:find('\001', 1, true); aarg = {} if i then o = s:sub(1, i - 1); d = s:sub(i + 1); i = o:find("(", 1, true); if i then a = o:sub(i); o = o:sub(1, i - 1); a:gsub('[^,()]+', parg); end if o == '' then if isObject(self) then oo = self else error("Empty link: "..s, 3); end else if stead.api_atleast(1, 6, 3) then oo = stead.here():srch(o) else oo = objs():srch(o) end if not oo then oo = stead.ref(o, true) end end elseif isObject(self) then oo = self d = s; else error("Wrong link: "..s, 3); end d = d:gsub("\001", delim); return stead.xref(d, stead.ref(oo, true), stead.unpack(aarg)); end if stead.type(str) ~= 'string' then return end local s = stead.string.gsub(str, '\\?[\\{}]', { ['{'] = '\001', ['}'] = '\002' }):gsub('\001([^\002]+)\002', xrefrep):gsub('[\001\002]', { ['\001'] = '{', ['\002'] = '}' }); return s; end stead.fmt = stead.hook(stead.fmt, function(f, ...) local res, s local a = {...} for i = 1, stead.table.maxn(a) do if stead.type(a[i]) == 'string' then s = __do_xact(a[i]); res = stead.par('', res, s):gsub('\\?[\\{}]', { [ '\\{' ] = '{', [ '\\}' ] = '}' }); end end return f(res); end) obj = stead.inherit(obj, function(v) v.xref = function(s, str) return __do_xact(str, s); end return v end) function xdsc(n) local v = {} v.nam = true if n == nil then v.disp = 'xdsc' elseif stead.type(n) == 'string' then v.disp = n; else error("Wrong parameter to xdsc.", 2); end v.dsc = function(s) return stead.call(stead.here(), s.disp); end v.save = function(self, name, h, need) if need then h:write(stead.string.format("%s = xdsc(%q);\n", name, self.disp)) end stead.savemembers(h, self, name, false); end return obj(v) end xroom = stead.inherit(room, function(v) v.look = stead.hook(v.look, function(f, s,...) local xdsc = stead.call(s, 'xdsc'); return stead.par(stead.space_delim, xdsc, f(s, ...)); end) return v end) if stead.api_atleast(1, 6, 3) then xwalk = xact('xwalk', code [[ stead.walk(arg1) ]]); xwalk.system_type = true end -- vim:ts=4 instead-3.2.1/stead/stead2/sprites.lua0000644000175000017500000001173213267071774016664 0ustar peterpeterrequire "theme" local type = stead.type stead.font_load = instead_font_load stead.font_free = instead_font_free stead.font_scaled_size = instead_font_scaled_size stead.sprite_alpha = instead_sprite_alpha stead.sprite_dup = instead_sprite_dup stead.sprite_scale = instead_sprite_scale stead.sprite_rotate = instead_sprite_rotate stead.sprite_text = instead_sprite_text stead.sprite_text_size = instead_sprite_text_size stead.sprite_draw = instead_sprite_draw stead.sprite_copy = instead_sprite_copy stead.sprite_compose = instead_sprite_compose stead.sprite_fill = instead_sprite_fill stead.sprite_pixel = instead_sprite_pixel stead.sprite_load = instead_sprite_load stead.sprite_free = instead_sprite_free stead.sprite_size = instead_sprite_size stead.sprites_free = instead_sprites_free stead.sprite_colorkey = instead_sprite_colorkey stead.sprite_pixels = instead_sprite_pixels sprite = { nam = 'sprites'; object_type = true; system_type = true; screen = function(s) if theme.get 'scr.gfx.mode' ~= 'direct' then return end return 'screen' end; font_scaled_size = function(size) return stead.font_scaled_size(size); end; font = function(font, size, ...) return stead.font_load(font, size, ...); end; free_font = function(font) return stead.font_free(font); end; font_height = function(font) local w,h = stead.sprite_text_size(font) return h end; alpha = function(name, alpha, ...) return stead.sprite_alpha(name, alpha, ...); end; colorkey = function(name, color, ...) return stead.sprite_colorkey(name, color, ...); end; dup = function(name, ...) return stead.sprite_dup(name, ...); end; scale = function(name, xs, ys, smooth, ...) if smooth == nil then smooth = true -- default is on end return stead.sprite_scale(name, xs, ys, smooth,...); end; rotate = function(name, angle, smooth, ...) if smooth == nil then smooth = true -- default is on end return stead.sprite_rotate(name, angle, smooth, ...); end; text = function(font, text, col, style, ...) return stead.sprite_text(font, text, col, style, ...); end; size = function(spr) return stead.sprite_size(spr); end; text_size = function(fnt, ...) return stead.sprite_text_size(fnt, ...); end; draw = function(s, fx, fy, fw, fh, d, x, y, alpha) if d == nil and x == nil and y == nil then d, x, y, alpha = fx, fy, fw, fh fx, fy, fw, fh = 0, 0, -1, -1 end return stead.sprite_draw(s, fx, fy, fw, fh, d, x, y, alpha); end; copy = function(s, fx, fy, fw, fh, d, x, y, alpha) if d == nil and x == nil and y == nil then d, x, y, alpha = fx, fy, fw, fh fx, fy, fw, fh = 0, 0, -1, -1 end if alpha then local ss = stead.sprite_alpha(s, alpha) local r = stead.sprite_copy(ss, fx, fy, fw, fh, d, x, y, alpha); stead.sprite_free(ss) return r end return stead.sprite_copy(s, fx, fy, fw, fh, d, x, y, alpha); end; compose = function(s, fx, fy, fw, fh, d, x, y, alpha) if d == nil and x == nil and y == nil then d, x, y, alpha = fx, fy, fw, fh fx, fy, fw, fh = 0, 0, -1, -1 end if alpha then local ss = stead.sprite_alpha(s, alpha) local r = stead.sprite_compose(ss, fx, fy, fw, fh, d, x, y, alpha); stead.sprite_free(ss) return r end return stead.sprite_compose(s, fx, fy, fw, fh, d, x, y, alpha); end; fill = function(d, x, y, w, h, col) if h == nil and col == nil then return stead.sprite_fill(d, 0, 0, -1, -1, x); end return stead.sprite_fill(d, x, y, w, h, col); end; pixel = function(d, x, y, col, alpha) return stead.sprite_pixel(d, x, y, col, alpha) end; load = function(fname, ...) return stead.sprite_load(fname, ...); end; blank = function(w, h, ...) local t = 'blank:'..stead.tostr(stead.math.floor(w))..'x'..stead.tostr(stead.math.floor(h)) return stead.sprite_load(t, ...) end; box = function(w, h, col, alpha, ...) local t = 'box:'..stead.tostr(stead.math.floor(w))..'x'..stead.tostr(stead.math.floor(h)) if col then t = t..','..stead.tostr(col) end if alpha then t = t..','..stead.tostr(alpha) end return stead.sprite_load(t, ...) end; free = function(key) return stead.sprite_free(key); end; } stead.module_done(function() stead.sprites_free(); end) local function compat_api() if not stead.api_atleast(1, 7, 1) then font_load = instead_font_load font_free = instead_font_free font_scaled_size = instead_font_scaled_size sprite_alpha = instead_sprite_alpha sprite_dup = instead_sprite_dup sprite_scale = instead_sprite_scale sprite_rotate = instead_sprite_rotate sprite_text = instead_sprite_text sprite_text_size = instead_sprite_text_size sprite_draw = instead_sprite_draw sprite_copy = instead_sprite_copy sprite_compose = instead_sprite_compose sprite_fill = instead_sprite_fill sprite_pixel = instead_sprite_pixel sprite_load = instead_sprite_load sprite_free = instead_sprite_free sprite_size = instead_sprite_size sprites_free = instead_sprites_free end end stead.module_start(function(load) if compat_api and not load then compat_api() compat_api = nil end end) instead-3.2.1/stead/stead2/snapshots.lua0000644000175000017500000000353713267071774017221 0ustar peterpeterlocal MAKE_SNAPSHOT game._snapshots = {} stead.make_snapshot = function(nr) if not stead.tonum(nr) then nr = 0 end local h = { }; h.txt = '' h.write = function(s, ...) local a = {...}; for i = 1, stead.table.maxn(a) do s.txt = s.txt .. stead.tostr(a[i]); end end local old = game._snapshots; game._snapshots = nil stead.do_savegame(game, h); game._snapshots = old game._snapshots[nr] = h.txt; end function isSnapshot(nr) if not stead.tonum(nr) then nr = 0 end return (game._snapshots[nr] ~= nil) end stead.restore_snapshot = function (nr) if not stead.tonum(nr) then nr = 0 end local ss = game._snapshots if not ss[nr] then return nil, true end -- nothing todo local i,v if stead.api_atleast(1, 7, 1) then stead.gamereset("main.lua", true); else stead.gamefile("main.lua", true); end local f, err = stead.eval(ss[nr]..' '); if not f then return end local i,r = f(); game._snapshots = ss if r then return nil, false end i = stead.do_ini(game, true); if stead.api_atleast(1, 7, 1) then game:start() stead.rawset(_G, 'PLAYER_MOVED', true) -- force fading else -- legacy if not game.showlast then stead.last_disp(false) end i = stead.cat('', stead.last_disp()) end stead.rawset(_G, 'RAW_TEXT', true) -- delete_snapshot(nr); if stead.cctx() then stead.pr(i) end return i; end stead.delete_snapshot = function(nr) if not stead.tonum(nr) then nr = 0 end game._snapshots[nr] = nil end function make_snapshot(nr) if stead.type(nr) ~= 'number' then nr = 0 end MAKE_SNAPSHOT = nr end function restore_snapshot(nr) return stead.restore_snapshot(nr) end function delete_snapshot(nr) return stead.delete_snapshot(nr); end iface.cmd = stead.hook(iface.cmd, function(f, ...) local r,v = f(...); if MAKE_SNAPSHOT ~= nil then stead.make_snapshot(MAKE_SNAPSHOT); MAKE_SNAPSHOT = nil end return r,v end) -- vim:ts=4 instead-3.2.1/stead/stead2/wroom.lua0000644000175000017500000000214013267071774016327 0ustar peterpeterstead.wroom_enter = function(self, ...) local w = self.where if stead.type(w) ~= 'table' then w = stead.call(self, 'where') end local r, v = stead.walk(w); if v ~= false then self._toggle = true end return r, v end stead.wroom_save = function(self, name, h, need) if need then local a = stead.tostring(self.oldname); local b = stead.tostring(self.newname); local c = stead.tostring(self.where); if a == nil or b == nil or c == nil then error ("Can not save wroom "..name.."\nFunctions can not be saved, use code [[ ]]"); end local t = stead.string.format("%s = wroom(%s, %s, %s);\n", name, a, b, c); h:write(t); end stead.savemembers(h, self, name, false); end function wroom(a, b, c) local v = room { vroom_type = true, nam = a, where = c, enter = stead.wroom_enter, save = stead.wroom_save }; v.newname = b; v.oldname = a; v._toggle = false if c == nil then -- only two parameters v.newname = nil v.where = b end v.nam = function(s) if s._toggle and s.newname then return stead.call(s, 'newname') else return stead.call(s, 'oldname'); end end return v end instead-3.2.1/stead/stead2/sound.lua0000644000175000017500000000225013267071774016316 0ustar peterpeterstead.sound_load = instead_sound_load stead.sound_free = instead_sound_free stead.sounds_free = instead_sounds_free stead.sound_channel = instead_sound_channel stead.sound_volume = instead_sound_volume stead.sound_panning = instead_sound_panning stead.sound_load_mem = instead_sound_load_mem stead.music_callback = instead_music_callback sound = { nam = 'sound'; object_type = true; system_type = true; load = function(a, b, t) if type(a) == 'string' then return stead.sound_load(a); elseif type(t) == 'table' then return stead.sound_load_mem(a, b, t) -- hz, channel, t end end; music_callback = function(...) return stead.music_callback(...) end; free = function(key) return stead.sound_free(key); end; play = function(key, ...) return stead.add_sound(key, ...) end; stop = function(...) stead.stop_sound(...); end; playing = function(s,...) if stead.type(s) ~= 'number' then return stead.is_sound() end return stead.sound_channel(s,...) end; pan = function(c, l, r, ...) return stead.sound_panning(c, l, r, ...) end; vol = function(v, ...) return stead.sound_volume(v, ...) end } stead.module_init(function() stead.sounds_free(); end) instead-3.2.1/stead/stead2/counters.lua0000644000175000017500000000321313267071774017030 0ustar peterpeterif not stead.api_atleast(1, 6, 3) then error ("Counters module can not run with api version < 1.6.3", 3) end local function inc_nr(v, n) local name = '__'..n..'_nr' if not v[name] then v[name] = 0 end v[name] = v[name] + 1 end local function read_nr(v, n, set) local name = '__'..n..'_nr' v = stead.ref(v) if stead.type(v) ~= 'table' then return v end if not v[name] then if stead.type(set) == 'number' then v[name] = set end return 0 end n = v[name] if stead.type(set) == 'number' then v[name] = set end return n end game.onact = stead.hook(game.onact, function(f, v, w, ...) inc_nr(v, 'act'); inc_nr(w, 'act'); return f(v, w, ...) end) game.onuse = stead.hook(game.onuse, function(f, v, w, ...) inc_nr(v, 'use'); inc_nr(w, 'use'); return f(v, w, ...) end) game.oninv = stead.hook(game.oninv, function(f, v, w, ...) inc_nr(v, 'inv'); inc_nr(w, 'inv'); return f(v, w, ...) end) game.onwalk = stead.hook(game.onwalk, function(f, v, w, ...) inc_nr(v, 'walk'); inc_nr(w, 'walk'); return f(v, w, ...) end) function act_count(s, v) if not s and not v then s = game v = nil elseif stead.tonum(s) then v = s s = game end return read_nr(s, 'act', v) end function inv_count(s, v) if not s and not v then s = game v = nil elseif stead.tonum(s) then v = s s = game end return read_nr(s, 'inv', v) end function use_count(s, v) if not s and not v then s = game v = nil elseif stead.tonum(s) then v = s s = game end return read_nr(s, 'use', v) end function walk_count(s, v) if not s and not v then s = game v = nil elseif stead.tonum(s) then v = s s = game end return read_nr(s, 'walk', v) end instead-3.2.1/stead/stead2/dlg.lua0000644000175000017500000002601213267071774015736 0ustar peterpeter-- stead.phrase_prefix = '--' local function isValid(p) return isPhrase(p) and p.dsc and (p.ans or p.code) end local function isDelimiter(p) return isPhrase(p) and not isDisabled(p) and (p.dsc == nil and p.ans == nil and p.code == nil) end local tagpnext = function(a, k) if not k then if isPhrase(a.tag) then return 1, a.tag end if stead.type(a.tag) == 'number' then local r = a.s:phrase(a.tag) if r then return 1, r end return end k = {} for r, v in stead.opairs(a.s.obj) do v = stead.ref(v) if isPhrase(v) and v.tag == a.tag then stead.table.insert(k, v) end end k.i = 0 k.n = stead.table.maxn(k) end if k == 1 or k.i >= k.n then return nil end k.i = k.i + 1 return k, k[k.i] end local function phrases(s, tag) local a = { s = s, tag = tag } return tagpnext, a, nil; end stead.phrase_seen = function(s, enb, ...) local ph, k local a = {...} if stead.table.maxn(a) == 0 then stead.table.insert(a, stead.cctx().self); end for i = 1,stead.table.maxn(a) do local r for k, ph in phrases(s, a[i]) do r = isPhrase(ph) and not isRemoved(ph) and not ph:disabled(); if r then break end end if enb then r = not r end if r then return false end end return true end local function ponoff(s, on, ...) local ph, k local a = {...} if stead.table.maxn(a) == 0 then stead.table.insert(a, stead.cctx().self) end for i = 1,stead.table.maxn(a) do for k, ph in phrases(s, a[i]) do if isPhrase(ph) and not isRemoved(ph) then if on then ph:enable(); else ph:disable(); end end end end end stead.dialog_prem = function(s, ...) local a = {...} if stead.table.maxn(a) == 0 then stead.table.insert(a, stead.cctx().self); end for i = 1, stead.table.maxn(a) do for k, ph in phrases(s, a[i]) do if isPhrase(ph) then ph:remove(); end end end end stead.dialog_pon = function(self,...) return ponoff(self, true, ...); end stead.dialog_poff = function(self,...) return ponoff(self, false, ...); end local function phr_get(self) local n = #self.__phr_stack; if n == 0 then return 1 end return self.__phr_stack[n]; end local function phr_pop(self) local n = #self.__phr_stack; if n <= 1 then return false end stead.table.remove(stead.here().__phr_stack, n) return true end local function call_empty(self) local ph = self:phrase(phr_get(self)) local r if not isPhrase(ph) or isDisabled(ph) or not ph.empty then self:pret() return end r = stead.call(ph, "empty") if stead.type(r) == 'string' then stead.p(r) end return r end local function call_enter(ph) local r, n if not isPhrase(ph) or isDisabled(ph) then return end if isValid(ph) then return end r = stead.call(ph, 'dsc') if stead.type(r) == 'string' then stead.p(r) end end local function dialog_reset(self) for i, ph in stead.pairs(self.obj) do if isPhrase(ph) then ph.nam = '' end end end stead.dialog_look = function(self) local n, v n = 1 local start = phr_get(self) dialog_reset(self) for i, ph, ii in stead.opairs(self.obj) do if ii >= start then if ii ~= start and isDelimiter(ph) then break end if isPhrase(ph) and not isDisabled(ph) and isValid(ph) then ph.nam = stead.tostr(n) if stead.type(stead.phrase_prefix) == 'string' then v = stead.par('^', v, stead.cat(stead.phrase_prefix, ph:look())); else v = stead.par('^', v, txtnm(n, ph:look())) end n = n + 1 end end end return v; end stead.dialog_rescan = function(self, naming, from) local k, start k = 0 if stead.type(from) == 'number' then start = from elseif stead.type(from) == 'string' then ph, start = self:phrase(from) else start = phr_get(self) end for i, ph, ii in stead.opairs(self.obj) do if ii >= start then if ii ~= start and isDelimiter(ph) then break end if isPhrase(ph) and not isDisabled(ph) and isValid(ph) then k = k + 1; if naming then ph.nam = stead.tostr(k) end end end end if k == 0 then return false end return k end stead.dialog_enter = function(self) if self:empty(self) then return nil, false end return nil, true end stead.dialog_current = function(self, w, ...) local r = phr_get(self) if w then local ph, i = self:phrase(w) if ph then self.__phr_stack = { i } end end return r end stead.dialog_curtag = function(self, w, ...) local p = self:phrase(phr_get(self)) if w then self:current(w) end if not isPhrase(p) then return end return p.tag end stead.dialog_empty = function(self, from) return (stead.dialog_rescan(self, false, from) == false) end stead.dialog_visible = function(self, from) local r = stead.dialog_rescan(self, false, from); if not r then r = 0 end return r end stead.dialog_pjump = function(self, w) local ph, i = self:phrase(w) if not ph then return end local n = #self.__phr_stack; if n == 0 then stead.table.insert(self.__phr_stack, i); else self.__phr_stack[n] = i end call_enter(ph) stead.cctx().action = true return end function pjump(w) if not isDialog(stead.here()) then return false end return stead.here():pjump(w) end stead.dialog_pstart = function(self, w) if not w then w = 1 end local ph, i = self:phrase(w) if not ph then return end self.__phr_stack = { i } call_enter(ph) stead.cctx().action = true return end function pstart(w) if not isDialog(stead.here()) then return end stead.here():pstart(w) end stead.dialog_psub = function(self, w) local ph, i = self:phrase(w) if not ph then return end stead.table.insert(self.__phr_stack, i); call_enter(ph) stead.cctx().action = true return end function psub(w) if not isDialog(stead.here()) then return false end return stead.here():psub(w) end stead.dialog_pret = function(self) if not phr_pop(self) then return end stead.cctx().action = true if not self:empty() then return end call_empty(self) return end function pret() if not isDialog(stead.here()) then return end return stead.here():pret() end function phr(ask, answ, act) local i = 1 local dis = false if stead.type(ask) ~= 'table' then -- old style local p = phrase ( { dsc = ask, ans = answ, code = act }); return p end local v = ask if stead.type(v[1]) == 'number' then -- just skip number i = i + 1 end if stead.type(v[i]) == 'boolean' then dis = not v[i] i = i + 1 end if v.dsc == nil then v.dsc = v[i]; i = i + 1 end if v.ans == nil then v.ans = v[i]; i = i + 1 end if v.code == nil and (stead.type(v[i]) == 'function' or stead.type(v[i]) == 'string') then v.code = v[i]; end v = phrase(v) if dis then v = v:disable() end return v; end function _phr(ask, answ, act) -- compat only? local p = phr(ask, answ, act); p:disable() return p end stead.phr = phr stead.phrase_save = function(self, name, h, need) if need then local m = " = phrase {" local post = '}\n' if isDisabled(self) then post = "}:disable()\n" end m = stead.string.format("%s%s", name, m); if self.dsc then m = m..stead.string.format("dsc = %s, ", stead.tostring(self.dsc)); end if self.ans then m = m..stead.string.format("ans = %s, ", stead.tostring(self.ans)); end if self.code then m = m..stead.string.format("code = %s, ", stead.tostring(self.code)); end if self.tag then m = m..stead.string.format("tag = %s, ", stead.tostring(self.tag)); end if self.always then m = m..stead.string.format("always = %s, ", stead.tostring(self.always)); end if self.empty then m = m..stead.string.format("empty = %s, ", stead.tostring(self.empty)); end h:write(m..post); end stead.savemembers(h, self, name, false); end local function dialog_phr2obj(self) local n = 0 local aliases = {} if stead.type(self.phr) ~= 'table' then return end for k, v in ipairs(self.phr) do if stead.type(v) == 'table' then if stead.type(v[1]) == 'number' then n = v[1] else n = n + 1 end local p = stead.phr(v) if self.obj[n] then error ("Error in phr structure (numbering).", 4); end if v.alias then p.alias = v.alias stead.table.insert(aliases, n); end self.obj[n] = p else error ("Error in phr structure (wrong item).", 4); end end for k, v in ipairs(aliases) do local ph = self:phrase(self.obj[v].alias) if not ph then error ("Wrong alias in dlg.", 3); end self.obj[v] = ph end end stead.dialog_phrase = function(self, num) if not num then return end if isPhrase(num) then return num end if stead.type(num) ~= 'number' then for k, v, i in stead.opairs(self.obj) do v = stead.ref(v) if isPhrase(v) and v.tag == num then return v, i end end return nil end return stead.ref(self.obj[num]), num; end stead.phrase_action = function(self) local ph = self; local r, ret; local empty if isDisabled(ph) then return nil, false end -- here it is if not ph.always then ph:disable(); -- /* disable it!!! */ end local last = stead.call(ph, 'ans'); if stead.type(ph.code) == 'string' then local f = stead.eval(ph.code); if f ~= nil then ret = f(); else error ("Error while eval phrase action:"..ph.code); end elseif stead.type(ph.code) == 'function' then ret = ph.code(self); end if ret == nil then ret = stead.pget(); end if last == true or ret == true then r = true; end if isDialog(stead.here()) and stead.here():empty() then empty = call_empty(stead.here()); end local wh = stead.here(); while isDialog(wh) and wh:empty() and stead.from(wh) ~= wh do wh = stead.from(wh) end if wh ~= stead.here() then ret = stead.par(stead.scene_delim, ret, stead.back(wh)); end ret = stead.par(stead.space_delim, last, empty, ret); if ret == nil then return r -- hack? end return ret end function dlg(v) --constructor v.dialog_type = true; if v.ini == nil then v.ini = function(s) stead.dialog_rescan(s, true); end end if v.enter == nil then v.enter = stead.dialog_enter; end if v.look == nil then v.look = stead.dialog_look; end if v.scene == nil then v.scene = stead.dialog_scene; end if v.pon == nil then v.pon = stead.dialog_pon; end if v.poff == nil then v.poff = stead.dialog_poff; end if v.prem == nil then v.prem = stead.dialog_prem; end if v.pseen == nil then v.pseen = stead.dialog_pseen; end if v.punseen == nil then v.punseen = stead.dialog_punseen; end if v.empty == nil then v.empty = stead.dialog_empty; end if v.visible == nil then v.visible = stead.dialog_visible; end if v.current == nil then v.current = stead.dialog_current end if v.curtag == nil then v.curtag = stead.dialog_curtag end if v.pstart == nil then v.pstart = stead.dialog_pstart end if v.pjump == nil then v.pjump = stead.dialog_pjump end if v.pret == nil then v.pret = stead.dialog_pret end if v.psub == nil then v.psub = stead.dialog_psub end if v.phrase == nil then v.phrase = stead.dialog_phrase end if v.dsc == nil then v.dsc = function(s) if stead.player_moved() then stead.last_act(false) elseif stead.type(stead.act_text()) ~= 'string' and stead.last_act() then stead.p(stead.last_act()) end end end v = room(v); v.__phr_stack = { 1 } dialog_phr2obj(v); return v; end instead-3.2.1/stead/stead2/dash.lua0000644000175000017500000000004413267071774016104 0ustar peterpeterrequire "format" format.dash = true instead-3.2.1/stead/stead2/hotkeys.lua0000644000175000017500000000072113267071774016655 0ustar peterpeterrequire 'kbd' stead.module_init(function() hook_keys('1','2','3','4','5','6','7','8','9','0'); end) game.kbd = stead.hook(game.kbd, function(f, s, down, key, ...) if down and key >= '0' and key <= '9' then if isDialog(stead.here()) then if key == '0' then key = '10' end local p = stead.here():srch(key); if p and stead.nameof(p) == key then return stead.call(p, 'act'); end end return end return f(s, down, key, ...); end) -- vim:ts=4 instead-3.2.1/stead/stead2/click.lua0000644000175000017500000000417313267071774016261 0ustar peterpeterrequire "theme" click = { nam = 'click'; object_type = true; system_type = true; bg = false; press = false; button = false; save = function(self, name, h, need) local s = stead.tostring(self.bg) h:write(stead.string.format("click[%q] = %s;\n", 'bg', s)) s = stead.tostring(self.press) h:write(stead.string.format("click[%q] = %s;\n", 'press', s)) s = stead.tostring(self.button) h:write(stead.string.format("click[%q] = %s;\n", 'button', s)) end; } stead.module_init(function() input.click = stead.hook(input.click, function(f, s, press, mb, x, y, px, py, ...) local cmd = 'click ' local act = false if ( press or click.press ) and ( mb == 1 or click.button ) then cmd = cmd..stead.tostr(press)..','..stead.tostr(mb); if click.bg or theme.get 'scr.gfx.mode' == 'direct' then act = true cmd = cmd .. ',' .. x .. ','.. y end if px then act = true cmd = cmd .. ',' .. px .. ',' .. py end if act then return cmd end end return f(s, press, mb, x, y, px, py, ...) end) end) game.action = stead.hook(game.action, function(f, s, cmd, press, mb, x, y, px, py, ...) if cmd == 'click' then local r,v local x2 = px local y2 = py if stead.tonum(mb) then mb = stead.tonum(mb) end if stead.tonum(px) then x2 = stead.tonum(px) end if stead.tonum(py) then y2 = stead.tonum(py) end if stead.here().click then s = stead.here() end if press == 'true' then press = true else press = false end if s.click then if click.press then if click.button then r,v = stead.call(s, 'click', press, mb, stead.tonum(x), stead.tonum(y), x2, y2, ...); else r,v = stead.call(s, 'click', press, stead.tonum(x), stead.tonum(y), x2, y2, ...); end else if click.button then r,v = stead.call(s, 'click', mb, stead.tonum(x), stead.tonum(y), x2, y2, ...); else r,v = stead.call(s, 'click', stead.tonum(x), stead.tonum(y), x2, y2, ...); end end end if r == nil and v == nil and not stead.api_atleast(1, 3, 5) then return nil, true end return r,v end return f(s, cmd, press, mb, x, y, px, py, ...) end) -- vim:ts=4 instead-3.2.1/stead/stead2/object.lua0000644000175000017500000001603313267071774016440 0ustar peterpeterlocal function onevent(ev, ...) local vv, r if stead.api_atleast(1, 6, 3) then vv, r = stead.call(game, ev, ...); if r == false then return vv, false end if vv == false then return nil, false end return vv end end stead.player_action = function(self, what, ...) local v,r,obj,vv if isXaction(what) then -- already xact obj = what else obj = stead.rawget(_G, what); end if not isXaction(obj) then obj = stead.ref(self.where):srch(what); end if not obj then return stead.call(game, 'action', what, ...); --player_do(self, what, ...); end vv, r = onevent('onact', obj, ...); if vv == false then return end if r == false then return vv end v, r = stead.player_take(self, what, ...); if not v and not r then v, r = stead.call(obj, 'act', ...); if stead.type(vv) == 'string' then v = stead.par(stead.space_delim, vv, v); end if not v and not r then v, r = stead.call(game, 'act', obj, ...); end elseif stead.type(vv) == 'string' then v = stead.par(stead.space_delim, vv, v); end return v, r; end stead.player_use = function(self, what, onwhat, ...) local obj, obj2, v, vv, r; local scene_use_mode = false obj = stead.rawget(_G, what); if isXaction(obj) then -- use xact is act return self:action(obj, onwhat, ...) end obj = self:srch(what); -- in inv? if not obj then -- no obj = stead.ref(self.where):srch(what); -- in scene? if not obj then -- no! return game.err, false; end scene_use_mode = true -- scene_use_mode! end obj = stead.ref(obj); if onwhat == nil then -- only one? if scene_use_mode then return self:action(what, ...); -- call act end vv, r = onevent('oninv', obj, ...); if vv == false then return end if r == false then return vv end v, r = stead.call(obj, 'inv', ...); -- call inv if stead.type(vv) == 'string' then v = stead.par(stead.space_delim, vv, v); end if not v and not r then v, r = stead.call(game, 'inv', obj, ...); end return v, r; end obj2 = stead.ref(self.where):srch(onwhat); -- in scene? if not obj2 then obj2 = self:srch(onwhat); -- in inv? end if not obj2 then return game.err, false; end obj2 = stead.ref(obj2) if not scene_use_mode or isSceneUse(obj) then vv, r = onevent('onuse', obj, obj2, ...); if vv == false then return end if r == false then return vv end v, r = stead.call(obj, 'use', obj2, ...); if stead.type(vv) == 'string' then v = stead.par(stead.space_delim, vv, v); end if r ~= false then vv = stead.call(obj2, 'used', obj, ...); if stead.type(vv) == 'string' then v = stead.par(stead.space_delim, v, vv); end end end if v == nil and vv == true and stead.api_atleast(1, 7, 1) then v = true end if not v then v, r = stead.call(game, 'use', obj, obj2, ...); end -- if v == nil and stead.api_version >= "1.3.5" then -- return true -- end return v end stead.vobj_save = function(self, name, h, need) local w = stead.deref(self.where) local dsc = self.dsc if need then h:write(stead.string.format("%s = vobj(%s,%s,%s);\n", name, stead.tostring(self.nam), stead.tostring(dsc), stead.tostring(w))); end stead.savemembers(h, self, name, false); end stead.vobj_act = function(self, ...) local o, r = stead.here():srch(self); -- self.nam if stead.ref(o) and stead.ref(o).where then return stead.walk(stead.ref(o).where); end return stead.call(stead.ref(r),'act', self.nam, ...); end stead.vobj_used = function(self, ...) local o, r = stead.here():srch(self.nam); return stead.call(stead.ref(r),'used', self.nam, ...); end stead.vobj_use = function(self, ...) local o, r = stead.here():srch(self.nam); return stead.call(stead.ref(r),'use', self.nam, ...); end function vobj(name, dsc, w) return obj{ nam = stead.tostr(name), vobject_type = true, dsc = dsc, where = stead.deref(w), act = stead.vobj_act, used = stead.vobj_used, use = stead.vobj_use, save = stead.vobj_save }; end function vway(name, dsc, w) -- o.object_type = true; return obj{ nam = stead.tostr(name), vobject_type = true, dsc = dsc, act = stead.vobj_act, where = stead.deref(w), used = stead.vobj_used, use = stead.vobj_use, save = stead.vobj_save }; end function isVobject(v) return (stead.type(v) == 'table') and (v.vobject_type) end stead.list_check = function(self, name) -- force using of objects, instead refs for i, v, ii in stead.opairs(self) do local o = stead.ref(v); if not isObject(o) then error (stead.string.format("Wrong object: %q (%s) at %s", stead.tostr(v), stead.tostr(stead.type(v)), name .."["..stead.tostr(ii).."]")); return false end if (v.auto_allocated and not stead.ref(v.key_name)) -- renew or (isObject(stead.deref(v)) and not v._dynamic_type) then -- no named object! local n = stead.string.format("%s[%d]", name, ii); v = allocator:new(n, n); self[ii] = v; v.auto_allocated = true; for_each(v, n, stead.check_list, isList, stead.deref(v)); else self[ii] = o; end end return true; end stead.list_add = function(self, name, pos) local nam = name if stead.initialized then nam = stead.ref(name); end if not nam then error ("Add wrong object to list: "..stead.tostr(name), 2); end if self:look(nam) then return nil end self.__modified__ = true; if isObject(stead.deref(nam)) then nam._dynamic_type = true end if stead.tonum(pos) then pos = stead.tonum(pos) if pos <= #self then stead.table.insert(self, pos, nam); else self[pos] = nam; -- for spare lists end else stead.table.insert(self, nam); end return true end stead.list_set = function(self, name, pos) local nam = name local i = stead.tonum(pos); if not i then return nil end if stead.initialized then nam = stead.ref(name); end if not nam then error ("Set wrong object in list: "..stead.tostr(name), 2); end if isObject(stead.deref(nam)) then nam._dynamic_type = true end self.__modified__ = true; self[i] = nam; -- for spare lists return true end stead.list_concat = function(self, other, pos) for n, o, ii in stead.opairs(other) do o = stead.ref(o); if pos == nil then self:add(o); else self:add(o, pos); pos = pos + 1; end end end stead.delim = '|' stead.list_str = function(self) local v, vv for i, o in stead.opairs(self) do o = stead.ref(o); if isObject(o) and not isDisabled(o) then vv = stead.dispof(o) vv = stead.xref(vv, o); v = stead.par(stead.delim, v, vv); end end return v; end stead.obj_str = function(self) local v, vv; if not isObject(self) then return end if isDisabled(self) then return end for i, o in stead.opairs(self.obj) do o = stead.ref(o); if isObject(o) and not isDisabled(o) then vv = stead.dispof(o) vv = stead.xref(vv, o); v = stead.par(stead.delim, v, vv, stead.obj_str(o)); end end return v; end function path(w, wh) -- search in way, disabled too if not wh then wh = stead.here(); else wh = stead.ref(wh); end local o = ways(wh):srch(w, true); o = stead.ref(o); if isRoom(o) then return o end return nil end game.lifes = list(game.lifes) stead:init(); -- reinit ob -- vim:ts=4 instead-3.2.1/stead/stead2/prefs.lua0000644000175000017500000000160213267071774016305 0ustar peterpeterprefs = obj { nam = 'preferences', system_type = true, load = function(s) local name = instead_savepath() .. '/prefs'; local f, err = loadfile(name); if not f then return nil end f(); end, ini = function(s) return s:load() end, store = function(s) s:save() stead.clearvar(s); end, save = function(s) -- save prefs on every save local name = instead_savepath() .. '/prefs'; local name_tmp = name..'.tmp' local h = stead.io.open(name_tmp, "wb"); if not h then return false end stead.savemembers(h, s, 'prefs', true); h:flush(); h:close(); stead.os.remove(name); stead.os.rename(name_tmp, name); end, purge = function(s) local name = instead_savepath() .. '/prefs'; for k, v in stead.pairs(s) do if stead.type(v) ~= 'function' and k ~= 'nam' and k ~= 'system_type' then s[k] = nil end end return stead.os.remove(name); end }; -- vim:ts=4 instead-3.2.1/stead/stead2/stead.lua0000644000175000017500000020722613267071774016300 0ustar peterpeterstead = { version = "3.2.1", api_version = "1.1.6", -- last version before 1.2.0 table = table, delim = ',', scene_delim = "^^", space_delim = ' ', string = string, tostr = tostring, tonum = tonumber, collectgarbage = collectgarbage, type = type, ipairs = ipairs, pairs = pairs, getinfo = debug.getinfo; rawget = rawget; rawset = rawset; math = math, random = instead_random, randomseed = instead_srandom, next = next, math = math, io = io, os = os, readdir = instead_readdir, cache = {}, call_top = 0, call_ctx = { txt = nil, self = nil }, -- functions = {}, -- code blocks modules_ini = {}, modules_done = {}, modules_start = {}, modules_cmd = {}, busy = function() end; module_init = function(f, ...) if stead.type(f) ~= 'function' then error ("Wrong parameter to module_init.", 2); end stead.table.insert(stead.modules_ini, f); f(); end; module_done = function(f, ...) if stead.type(f) ~= 'function' then error ("Wrong parameter to module_done.", 2); end stead.table.insert(stead.modules_done, f); end; module_start = function(f, ...) if stead.type(f) ~= 'function' then error ("Wrong parameter to module_start.", 2); end stead.table.insert(stead.modules_start, f); end; module_cmd = function(f, ...) if stead.type(f) ~= 'function' then error ("Wrong parameter to module_cmd.", 2); end stead.table.insert(stead.modules_cmd, f); end; } function instead_menu_toggle(n) if n == nil then n = 'main' elseif type(n) ~= 'string' then n = 'toggle' end stead.need_menu = n end stead.menu_toggle = instead_menu_toggle stead.api_atleast = function(...) for k, v in stead.ipairs {...} do if stead.type(v) ~= 'number' then return false end if v > (stead.api_version_table[k] or 0) then return false end if v < (stead.api_version_table[k] or 0) then return true end end return true end; stead.atleast = function(...) for k, v in stead.ipairs {...} do if stead.type(k) ~= 'number' then return false end if v > (stead.version_table[k] or 0) then return false end if v < (stead.version_table[k] or 0) then return true end end return true end; stead.last_act = function(s) local r = game.__last_act if s ~= nil and s ~= true then game.__last_act = s end return r end stead.last_disp = function(s) local r = game._lastdisp if s == nil then return r end if not s then s = nil end game._lastdisp = s return r end stead.act_text = function(s) local o = stead.rawget(_G, 'ACTION_TEXT') if s == nil then return o end if not s then s = nil end stead.rawset(_G, 'ACTION_TEXT', s) return o end stead.nop = function(s) -- to refresh entry scene w/o time tick stead.act_text(true) return stead.last_disp() or '' end stead.need_scene = function(s) if s == nil then stead.rawset(_G, 'NEED_SCENE', true) else stead.rawset(_G, 'NEED_SCENE', s) end end if _VERSION == "Lua 5.1" then stead.eval = loadstring stead.unpack = unpack else stead.eval = load stead.unpack = table.unpack unpack = table.unpack -- buggy games stead.table.maxn = table_get_maxn string.gfind = string.gmatch math.mod = math.fmod math.log10 = function(a) return stead.math.log(a, 10) end end instead = stead; function stead.getcmd(str) local a = {} local n = 1 local cmd; local i,k = stead.string.find(str, '[a-zA-Z0-9_]+'); if not i or not k then cmd = str; else cmd = stead.string.sub(str, i, k); end stead.cmd = cmd if cmd == 'load' or cmd == 'save' then a[1] = stead.strip(stead.string.sub(str, k + 1)); stead.args = a; return cmd, a end while i do k = k + 1; i,k = stead.string.find(str,'[^,]+', k); if not i then break end a[n] = stead.strip(stead.string.sub(str, i, k)); n = n + 1; end stead.args = a; return cmd, a end stead.tostring = function(v) if isCode(v) then v = stead.string.format("code %q", stead.functions[v].code); elseif stead.type(v) == 'string' then v = stead.string.format("%q", v); elseif v == nil or stead.type(v) == 'boolean' or stead.type(v) == 'number' then v = stead.tostr(v); elseif stead.type(v) == 'table' and stead.type(stead.deref(v)) == 'string' then v = stead.deref(v); else v = nil end return v end stead.cctx = function() return stead.call_ctx[stead.call_top]; end stead.callpush = function(v, ...) stead.call_top = stead.call_top + 1; stead.call_ctx[stead.call_top] = { txt = nil, self = v, action = false }; stead.rawset(_G, 'args', {...}); stead.rawset(_G, 'arg1', args[1]) stead.rawset(_G, 'arg2', args[2]) stead.rawset(_G, 'arg3', args[3]) stead.rawset(_G, 'arg4', args[4]) stead.rawset(_G, 'arg5', args[5]) stead.rawset(_G, 'arg6', args[6]) stead.rawset(_G, 'arg7', args[7]) stead.rawset(_G, 'arg8', args[8]) stead.rawset(_G, 'arg9', args[9]) -- dirty but clean and fast :) stead.rawset(_G, 'self', v) end stead.clearargs = function() stead.rawset(_G, 'arg1', nil) stead.rawset(_G, 'arg2', nil) stead.rawset(_G, 'arg3', nil) stead.rawset(_G, 'arg4', nil) stead.rawset(_G, 'arg5', nil) stead.rawset(_G, 'arg6', nil) stead.rawset(_G, 'arg7', nil) stead.rawset(_G, 'arg8', nil) stead.rawset(_G, 'arg9', nil) stead.rawset(_G, 'self', nil) end stead.callpop = function() stead.call_ctx[stead.call_top] = nil; stead.call_top = stead.call_top - 1; if stead.call_top < 0 then error ("callpush/callpop mismatch") end stead.clearargs() end stead.pclr = function() stead.cctx().txt = nil end stead.pget = function() return stead.cctx().txt; end stead.p = function(...) local a = {...} if stead.cctx() == nil then error ("Call from global context.", 2); end for i = 1, stead.table.maxn(a) do stead.cctx().txt = stead.par('', stead.cctx().txt, stead.tostr(a[i])); end stead.cctx().txt = stead.cat(stead.cctx().txt, stead.space_delim); end stead.pr = function(...) local a = {...} if stead.cctx() == nil then error ("Call from global context.", 2); end for i = 1, stead.table.maxn(a) do stead.cctx().txt = stead.par('', stead.cctx().txt, stead.tostr(a[i])); end end stead.pn = function(...) if stead.cctx() == nil then error ("Call from global context.", 2); end p(...); stead.cctx().txt = stead.par('', stead.cctx().txt,'^'); end -- merge strings with "space" as separator stead.par = function(space,...) local res local a = {...}; for i = 1, stead.table.maxn(a) do if stead.type(a[i]) == 'string' then if res == nil then res = "" else res = res..space; end res = res..a[i]; end end return res; end -- add to not nill string any string stead.cat = function(v,...) local res if not v then return nil end res = v; local a = {...} for i = 1, stead.table.maxn(a) do if stead.type(a[i]) == 'string' then res = res..a[i]; end end return res; end function txtnb(v) if stead.type(v) ~= 'string' then return nil; end return iface:nb(v); end function img(v) if stead.type(v) ~= 'string' then return nil; end; return iface:img(v); end function imgl(v) if stead.type(v) ~= 'string' then return nil; end; return iface:imgl(v); end function imgr(v) if stead.type(v) ~= 'string' then return nil; end; return iface:imgr(v); end function txtem(v) if stead.type(v) ~= 'string' then return nil; end; return iface:em(v) end function txtst(v) if stead.type(v) ~= 'string' then return nil; end; return iface:st(v) end function txtr(v) if stead.type(v) ~= 'string' then return nil; end; return iface:right(v) end function txtl(v) if stead.type(v) ~= 'string' then return nil; end; return iface:left(v) end function txtc(v) if stead.type(v) ~= 'string' then return nil; end; return iface:center(v) end function txttab(v,a) return iface:tab(v, a) end function txty(v, a) return iface:y(v, a) end function txtj(v) if stead.type(v) ~= 'string' then return nil; end; return iface:just(v) end function txtb(v) if stead.type(v) ~= 'string' then return nil; end; return iface:bold(v) end function txtu(v) if stead.type(v) ~= 'string' then return nil; end; return iface:under(v) end function txtnm(n, v) if stead.type(v) ~= 'string' or not stead.tonum(n) then return nil; end return iface:enum(n, v); end function txttop(v) if stead.type(v) ~= 'string' then return nil; end; return iface:top(v) end function txtbottom(v) if stead.type(v) ~= 'string' then return nil; end; return iface:bottom(v) end function txtmiddle(v) if stead.type(v) ~= 'string' then return nil; end; return iface:middle(v) end stead.fmt = function(...) local res local a = {...}; for i = 1, stead.table.maxn(a) do if stead.type(a[i]) == 'string' then local s = stead.string.gsub(a[i],'[\t ]+', stead.space_delim); s = stead.string.gsub(s, '[\n]+', stead.space_delim); s = stead.string.gsub(s, '\\?[\\^]', { ['^'] = '\n', ['\\^'] = '^', ['\\\\'] = '\\'} ); res = stead.par('', res, s); end end return res end -- integer lists local inext = function(t, k) local v k, v = stead.next(t, k); while k and not stead.tonum(k) do k, v = stead.next(t, k); end if not stead.tonum(k) then return nil end return k, v end local ilist = function(s, var) return inext, s, nil; end local ordered_i = function(t) local ordered = {}; local max = 0 for i, v in ilist(t) do stead.table.insert(ordered, i); max = max + 1; end stead.table.sort(ordered); ordered.i = 1; ordered.max = max; return ordered; end local onext = function(t, k) local v if not k then k = ordered_i(t); end if k.i > k.max then return nil end v = k[k.i] k.i = k.i + 1 return k, t[v], v; end function opairs(s) return onext, s, nil; end stead.opairs = opairs function isPlayer(v) return (stead.type(v) == 'table') and (v.player_type) end function isRoom(v) return (stead.type(v) == 'table') and (v.location_type) end function isPhrase(v) return (stead.type(v) == 'table') and (v.phrase_type) end function isDialog(v) return (stead.type(v) == 'table') and (v.dialog_type) end function isDisabled(v) return (stead.type(v) == 'table') and (v._disabled) end function isRemoved(v) return (stead.type(v) == 'table') and (v._disabled == -1) end function isObject(v) return (stead.type(v) == 'table') and (v.object_type) end function isXaction(v) return (stead.type(v) == 'table') and (v.xaction_type) end stead.obj_xref = function(self,str) function xrefrep(str) local s = stead.string.gsub(str,'[\001\002]',''); return stead.xref(s, self); end if not str then return end if not isObject(self) then return str; end local s = stead.string.gsub(str, '\\?[\\{}]', { ['{'] = '\001', ['}'] = '\002', [ '\\{' ] = '{', [ '\\}' ] = '}' }):gsub('\001([^\002]+)\002', xrefrep):gsub('[\001\002]', { ['\001'] = '{', ['\002'] = '}' }); return s; end stead.obj_look = function(self) local vv if isDisabled(self) then return end local v = stead.call(self,'dsc'); if game.hinting then v = self:xref(v); elseif v then v = stead.string.gsub(v, '[{}]',''); end for i, o in stead.opairs(self.obj) do o = stead.ref(o); if isObject(o) then vv = stead.obj_look(o); v = stead.par(stead.space_delim, v, vv); end end return v; end stead.obj_remove = function(self) self._disabled = -1; return self end stead.obj_disable = function(self) self._disabled = true; return self end stead.obj_enable = function(self) self._disabled = false; return self end stead.obj_disabled = function(self) return (self._disabled == true); end stead.obj_enable_all = function(s) if not isObject(s) then return end objs(s):enable_all(); end stead.obj_disable_all = function(s) if not isObject(s) then return end objs(s):disable_all(); end stead.obj_save = function(self, name, h, need) local dsc; if need then print ("Warning: object "..name.." can not be saved!"); return end stead.savemembers(h, self, name, need); end stead.obj_str = function(self) local v, vv; if not isObject(self) then return end if isDisabled(self) then return end for i, o in stead.opairs(self.obj) do o = stead.ref(o); if o~= nil and not isDisabled(o) then -- isObject is better, but compat layer must be ok vv = stead.call(o, 'nam'); vv = stead.xref(vv, o); v = stead.par(',', v, vv, stead.obj_str(o)); end end return v; end function obj(v) if v.nam == nil then if isRoom(v) then if isDialog(v) then error ("No dialog name in constructor.", 3); end error ("No room name in constructor.", 3); end error ("No object name in constructor.", 2); end v.object_type = true; if v.xref == nil then v.xref = stead.obj_xref; end if v.look == nil then v.look = stead.obj_look; end if v.enable == nil then v.enable = stead.obj_enable; end if v.disable == nil then v.disable = stead.obj_disable; end if v.disabled == nil then v.disabled = stead.obj_disabled; end if v.enable_all == nil then v.enable_all = stead.obj_enable_all; end if v.disable_all == nil then v.disable_all = stead.obj_disable_all; end if v.remove == nil then v.remove = stead.obj_remove; end if v.obj == nil then v.obj = {}; end if v.srch == nil then v.srch = stead.obj_search; end if v.str == nil then v.str = stead.obj_str; end v.obj = list(v.obj); if v.save == nil then v.save = stead.obj_save; end return v end function stead.ref(n, nofunc) -- ref object by name if stead.type(n) == 'string' then if n:find("^[_a-zA-Z][_a-zA-Z0-9]*$") then -- fastest path return stead.rawget(_G, n); end local f = stead.eval('return '..n); if f then return stead.ref(f(), nofunc); end return nil; end if stead.type(n) == 'table' then return n; end if stead.type(n) == 'function' and not nofunc then local r,v = pcall(n); if not r then return nil end return stead.ref(v); end return nil end function stead.deref(n) if stead.type(n) == 'string' then return n end if stead.type(n) == 'table' and stead.type(n.key_name) == 'string' then return n.key_name end return n end stead.list_check = function(self, name) for i, v, ii in stead.opairs(self) do local o = stead.ref(v); if not o then -- isObject(o) then -- compat error ("No object: "..name.."["..stead.tostr(ii).."]".." ("..stead.tostr(stead.type(v))..")") return false end if stead.deref(v) then self[ii] = stead.deref(v); end end return true; end stead.list_str = function(self) local v, vv; for i, o in stead.opairs(self) do o = stead.ref(o); if o~= nil and not isDisabled(o) then vv = stead.call(o, 'nam'); vv = stead.xref(vv, o); v = stead.par(',', v, vv); end end return v; end stead.list_add = function(self, name, pos) local nam nam = stead.deref(name); if self:look(nam) then return nil end self.__modified__ = true; if stead.tonum(pos) then pos = stead.tonum(pos) if pos <= #self then stead.table.insert(self, pos, nam); else self[pos] = nam; -- for spare lists end else stead.table.insert(self, nam); end return true end stead.list_set = function(self, name, pos) local nam local i = stead.tonum(pos); if not i then return nil end nam = stead.deref(name); self.__modified__ = true; self[i] = nam; -- for spare lists return true end stead.list_find = function(self, name) local o = stead.ref(name, true) for n,v,ii in stead.opairs(self) do if stead.ref(v) == o then -- do not call func while search return ii; end end return nil end stead.list_disable_all = function(s) for k, v in stead.opairs(s) do local o = stead.ref(v); if isObject(o) then o:disable() end end end stead.list_enable_all = function(s) for k, v in stead.opairs(s) do local o = stead.ref(v); if isObject(o) then o:enable() end end end stead.list_enable = function(s, w) local o, i = stead.list_search(s, w, true); o = stead.ref(o); if isObject(o) then o:enable() return o end end stead.list_disable = function(s, w) local o, i = stead.list_search(s, w, true); o = stead.ref(o); if isObject(o) then o:disable() return o end end stead.list_save = function(self, name, h, need) if self.__modifyed__ or self.__modified__ then -- compat h:write(name.." = list({});\n"); need = true; end stead.savemembers(h, self, name, need); end stead.list_name = function(self, name, dis) for n, o, ii in stead.opairs(self) do o = stead.ref(o); if isObject(o) then local nam = stead.call(o,'nam') ; if ( not isDisabled(o) or dis ) and name == stead.tostr(nam) then return ii; end end end return nil end stead.list_id = function(self, id, dis) for n, o, ii in stead.opairs(self) do o = stead.ref(o); if dis or not isDisabled(o) then if isObject(o) and id == o.id then return ii; end end end end stead.list_search = function(self, n, dis) local i; i = self:look(n); if not i then i = self:name(n, dis); end if not i and stead.tonum(n) then i = self:byid(stead.tonum(n), dis); if not i then return nil end end if not dis and isDisabled(stead.ref(self[i])) then return nil; end return self[i], i; end stead.list_zap = function(self) for n, o, ii in stead.opairs(self) do self[ii] = nil; end self.__modified__ = true return self end stead.list_concat = function(self, other, pos) for n, o, ii in stead.opairs(other) do o = stead.ref(o); if pos == nil then self:add(stead.deref(o)); else self:add(stead.deref(o), pos); pos = pos + 1; end end end stead.list_del = function(self, name) local v,n v, n = self:srch(name); if n == nil then return nil; end self.__modified__ = true if n <= #self then v = stead.table.remove(self, n); else v = self[n]; self[n] = nil -- for spare lists end return v end stead.list_purge = function(self, name) local v,n v, n = self:srch(name, true); if n == nil then return nil; end self.__modified__ = true v = stead.table.remove(self, n); if not v then v = self[n]; self[n] = nil -- for spare lists end return v end stead.list_replace = function(self, name, name2) local o, ii o, ii = self:srch(name); if ii then self:set(name2, ii); else self:add(name2); end return ii; end function list(v) v.list_type = true; v.add = stead.list_add; v.set = stead.list_set; v.cat = stead.list_concat; v.zap = stead.list_zap; v.del = stead.list_del; v.purge = stead.list_purge; v.replace = stead.list_replace; v.look = stead.list_find; v.name = stead.list_name; v.byid = stead.list_id; v.srch = stead.list_search; v.str = stead.list_str; v.check = stead.list_check; v.save = stead.list_save; v.enable = stead.list_enable; v.disable = stead.list_disable; v.enable_all = stead.list_enable_all; v.disable_all = stead.list_disable_all; return v; end function isList(v) return (stead.type(v) == 'table') and (v.list_type == true) end stead.call = function(v, n, ...) if stead.type(v) ~= 'table' then error ("Call on non table object:"..stead.tostr(n), 2); end if v[n] == nil then return nil,nil; end if stead.type(v[n]) == 'string' then return v[n]; end if stead.type(v[n]) == 'function' then stead.callpush(v, ...) local a,b = v[n](v, ...); -- boolean, nil if stead.type(a) == 'boolean' and b == nil then b, a = a, stead.pget() if a == nil then if stead.cctx().action then a = true else a = b b = nil end end elseif a == nil and b == nil then a = stead.pget() b = nil end if a == nil and b == nil and stead.cctx().action then a = true end stead.callpop() return a,b end if stead.type(v[n]) == 'boolean' then return v[n] end error ("Method not string nor function:"..stead.tostr(n), 2); end stead.call_bool = function(v, n, ...) if stead.type(v) ~= 'table' then error ("Call bool on non table object:"..n, 2); end if v[n] == nil then return nil end if v[n] == false then return false; end if stead.type(v[n]) == 'function' then stead.callpush(v, ...) local r,v = v[n](v, ...); stead.callpop(); return r,v; end return true; -- not nil end stead.call_value = function(v, n, ...) if stead.type(v) ~= 'table' then error ("Call value on non table object:"..n, 2); end if v[n] == nil then return nil end if stead.type(v[n]) ~= 'function' then return v[n]; end stead.callpush(v, ...) local r,v = v[n](v, ...); stead.callpop(); return r,v; end stead.room_scene = function(self) local v; v = iface:title(stead.call(self,'nam')); v = stead.par(stead.scene_delim, v, stead.call(self,'dsc')); --obj_look(self)); return stead.cat(v, stead.space_delim); end stead.room_look = function(self) local vv; for i, o in stead.opairs(self.obj) do o = stead.ref(o); if isObject(o) then vv = stead.par(stead.space_delim, vv, o:look()); end end return stead.cat(vv, stead.space_delim); end stead.obj_search = function(v, n, dis) local i; local o; if not dis and isDisabled(v) then return end o = v.obj:srch(n, dis); if o then return o, v; end for i, o in stead.opairs(v.obj) do o = stead.ref(o); if isObject(o) then local r,rr = stead.obj_search(o, n, dis); if r then return r, rr; end end end return; end stead.room_save = function(self, name, h, need) local dsc; if need then print ("Warning: room "..name.." can not be saved!"); return end stead.savemembers(h, self, name, need); end function room(v) --constructor -- if v.nam == nil then -- error ("No room name in constructor.", 2); -- end if v.scene == nil then v.scene = stead.room_scene; end if v.look == nil then v.look = stead.room_look; end if v.save == nil then v.save = stead.room_save; end v.location_type = true; if v.way == nil then v.way = { }; end v.way = list(v.way); v = obj(v); return v; end stead.dialog_enter = function(self) if not stead.dialog_rescan(self) then return nil, false end return nil, true end stead.dialog_scene = function(self) local v v = iface:title(stead.call(self,'nam')); v = stead.par(stead.scene_delim, v, stead.call(self, 'dsc')); --obj_look(self)); return v; end stead.dialog_look = function(self) local n, v n = 1 for i, ph in stead.opairs(self.obj) do ph = stead.ref(ph); if isPhrase(ph) and not isDisabled(ph) then v = stead.par('^', v, txtnm(n, ph:look())); n = n + 1 end end return v; end stead.dialog_rescan = function(self) local k k = 1 for i, ph in stead.opairs(self.obj) do ph = stead.ref(ph); if isPhrase(ph) and not isDisabled(ph) then ph.nam = stead.tostr(k); k = k + 1; end end if k == 1 then return false end return true end stead.dialog_empty = function(self) return not stead.dialog_rescan(self); end stead.dialog_phrase = function(self, num) if not stead.tonum(num) then if isPhrase(stead.ref(num)) then return stead.ref(num); end return nil end return stead.ref(self.obj[stead.tonum(num)]); end stead.phrase_seen = function(s, enb, ...) local ph local a = {...} if stead.table.maxn(a) == 0 then stead.table.insert(a, stead.cctx().self); end for i = 1,stead.table.maxn(a) do ph = stead.dialog_phrase(s, a[i]); local r = not isPhrase(ph) or isRemoved(ph) or ph:disabled(); if not enb then r = not r end if r then return false end end return true end stead.dialog_pseen = function(s, ...) return stead.phrase_seen(s, true, ...); end stead.dialog_punseen = function(s, ...) return stead.phrase_seen(s, false, ...); end local function ponoff(s, on, ...) local ph local a = {...} if stead.table.maxn(a) == 0 then stead.table.insert(a, stead.cctx().self) end for i = 1,stead.table.maxn(a) do ph = stead.dialog_phrase(s, a[i]); if isPhrase(ph) and not isRemoved(ph) then if on then ph:enable(); else ph:disable(); end end end end stead.dialog_prem = function(s, ...) local ph local a = {...} if stead.table.maxn(a) == 0 then stead.table.insert(a, stead.cctx().self); end for i = 1,stead.table.maxn(a) do ph = stead.dialog_phrase(s, a[i]); if isPhrase(ph) then ph:remove(); end end end stead.dialog_pon = function(self,...) return ponoff(self, true, ...); end stead.dialog_poff = function(self,...) return ponoff(self, false, ...); end function dlg(v) --constructor v.dialog_type = true; if v.ini == nil then v.ini = stead.dialog_enter; end if v.enter == nil then v.enter = stead.dialog_enter; end if v.look == nil then v.look = stead.dialog_look; end if v.scene == nil then v.scene = stead.dialog_scene; end if v.pon == nil then v.pon = stead.dialog_pon; end if v.poff == nil then v.poff = stead.dialog_poff; end if v.prem == nil then v.prem = stead.dialog_prem; end if v.pseen == nil then v.pseen = stead.dialog_pseen; end if v.punseen == nil then v.punseen = stead.dialog_punseen; end if v.empty == nil then v.empty = stead.dialog_empty; end v = room(v); return v; end stead.phrase_action = function(self) local ph = self; local r, ret; if isDisabled(ph) then return nil, false end -- here it is ph:disable(); -- /* disable it!!! */ local last = stead.call(ph, 'ans'); if stead.type(ph.do_act) == 'string' then local f = stead.eval(ph.do_act); if f ~= nil then ret = f(); else error ("Error while eval phrase action."); end elseif stead.type(ph.do_act) == 'function' then ret = ph.do_act(self); end if ret == nil then ret = stead.pget(); end if last == true or ret == true then r = true; end local wh = stead.here(); while isDialog(wh) and not stead.dialog_rescan(wh) and stead.from(wh) ~= wh do wh = stead.from(wh) end if wh ~= stead.here() then ret = stead.par(stead.space_delim, ret, stead.back(wh)); end ret = stead.par(stead.scene_delim, last, ret); if ret == nil then return r -- hack? end return ret end stead.phrase_save = function(self, name, h, need) if need then local m = " = phr(" if isDisabled(self) then m = " = _phr(" end h:write(stead.string.format("%s%s%s,%s,%s);\n", name, m, stead.tostring(self.dsc), stead.tostring(self.ans), stead.tostring(self.do_act))); end stead.savemembers(h, self, name, false); end stead.phrase_look = function(self, n) if isDisabled(self) then return end local v = stead.call(self, 'dsc'); if stead.type(v) ~= 'string' then return; end if game.hinting then return self:xref('{'..v..'}'); end return v; end function phrase(o) --constructor local ret = o; ret.look = stead.phrase_look; ret.nam = ''; -- for start ret.phrase_type = true; ret.act = stead.phrase_action; ret.save = stead.phrase_save; ret = obj(ret); return ret; end function _phr(ask, answ, act) local p = phrase ({ dsc = ask, ans = answ, do_act = act }); p:disable(); return p; end function phr(ask, answ, act) local p = phrase ({ dsc = ask, ans = answ, do_act = act }); -- p:enable(); return p; end stead.player_inv = function(self) return iface:inv(stead.cat(self:str())); end stead.player_ways = function(self) return iface:ways(stead.cat(stead.ref(self.where).way:str())); end stead.player_objs = function(self) return iface:objs(stead.cat(stead.ref(self.where):str())); end stead.player_look = function(self) return stead.ref(self.where):scene(); end stead.obj_tag = function(self, id) if isDisabled(self) then return id end for k, v in stead.opairs(self.obj) do v = stead.ref(v); if isObject(v) and not isDisabled(v) and v.id ~= false then id = id + 1; v.id = id; id = stead.obj_tag(v, id); end end return id; end stead.player_tagall = function(self) local id = 0; id = stead.obj_tag(stead.here(), id); for k, v in stead.opairs(ways()) do v = stead.ref(v); if isRoom(v) and not isDisabled(v) then id = id + 1; v.id = id; end end stead.rawset(_G, 'MENU_TAG_ID', id) id = stead.obj_tag(stead.me(), id); end stead.player_action = function(self, what, ...) local v,r,obj obj = stead.ref(self.where):srch(what); if not obj then return stead.call(stead.ref(game), 'action', what, ...); --player_do(self, what, ...); end v, r = stead.player_take(self, what, ...); if not v then v, r = stead.call(stead.ref(obj), 'act', ...); if not v and r ~= true then v, r = stead.call(stead.ref(game), 'act', obj, ...); end end return v, r; end stead.player_take = function(self, what, ...) local v,r,obj,w obj,w = stead.ref(self.where):srch(what); if not obj then return nil, false; end v,r = stead.call(stead.ref(obj), 'tak', ...); if v and r ~= false then take(obj, w); end return v; end stead.player_use = function(self, what, onwhat, ...) local obj, obj2, v, vv, r; local scene_use_mode = false obj = self:srch(what); -- in inv? if not obj then -- no obj = stead.ref(self.where):srch(what); -- in scene? if not obj then -- no! return game.err, false; end scene_use_mode = true -- scene_use_mode! end if onwhat == nil then -- only one? if scene_use_mode then return self:action(what, ...); -- call act else v, r = stead.call(stead.ref(obj),'inv', ...); -- call inv end if not v and r ~= true then v, r = stead.call(game, 'inv', obj, ...); end return v, r; end obj2 = stead.ref(self.where):srch(onwhat); -- in scene? if not obj2 then obj2 = self:srch(onwhat); -- in inv? end if not obj2 or obj2 == obj then return game.err, false; end if not scene_use_mode or isSceneUse(stead.ref(obj)) then v, r = stead.call(stead.ref(obj), 'use', obj2, ...); if r ~= false then vv = stead.call(stead.ref(obj2), 'used', obj, ...); end end if not v and not vv then v, r = stead.call(game, 'use', obj, obj2, ...); end return stead.par(stead.space_delim, v, vv); end stead.player_back = function(self) local where = stead.ref(self.where); if where == nil then return nil,false end return stead.go(self, where.__from__, true); end stead.go = function(self, where, back) local was = self.where; local need_scene = false; local ret if not stead.in_walk_call then ret = function(rc) stead.in_walk_call = false return nil end else ret = function(rc) return rc end end stead.in_walk_call = true if where == nil then return nil,ret(false) end if not isRoom(stead.ref(where)) then error ("Trying to go nowhere: "..where, 2); end if not isRoom(stead.ref(self.where)) then error ("Trying to go from nowhere: "..self.where, 2); end if stead.in_entered_call or stead.in_onexit_call then error ("Do not use walk from onexit/entered action! Use exit/enter action instead:" .. self.where, 2); end local v, r; if not isVroom(stead.ref(where)) and not stead.in_exit_call then stead.in_exit_call = true -- to break recurse v,r = stead.call(stead.ref(self.where), 'exit', where); stead.in_exit_call = nil if r == false then return v, ret(r) end end local res = v; v = nil; if not back or not isDialog(stead.ref(self.where)) or isDialog(stead.ref(where)) then v, r = stead.call(stead.ref(where), 'enter', self.where); if r == false then return v, ret(r) end need_scene = true; if stead.ref(was) ~= stead.ref(self.where) then -- jump !!! where = stead.deref(self.where); need_scene = false; end end res = stead.par(stead.scene_delim, res, v); if not back then stead.ref(where).__from__ = stead.deref(self.where); end self.where = stead.deref(where); ret(); stead.rawset(_G, 'PLAYER_MOVED', true) if need_scene then -- or isForcedsc(stead.ref(where)) then -- i'am not sure... return stead.par(stead.scene_delim, res, stead.ref(where):scene()); end return res; end stead.player_walk = function(self, where, ...) local v, r = stead.go(self, where, ...); return v, r; end stead.player_go = function(self, where) local w = stead.ref(self.where).way:srch(where); if not w then return nil,false end local v, r = stead.go(self, w, false); return v, r; end stead.player_save = function(self, name, h) h:write(stead.string.format('%s.where = %q;\n', stead.tostr(name), stead.deref(self.where))); stead.savemembers(h, self, name, false); end function player(v) if v.nam == nil then error ("No player name in constructor.", 2); end if v.where == nil then v.where = 'main'; end if v.tag == nil then v.tag = stead.player_tagall; end if v.walk == nil then v.walk = stead.player_walk; end if v.go == nil then v.go = stead.player_go; end if v.ways == nil then v.ways = stead.player_ways; end if v.back == nil then v.back = stead.player_back; end if v.look == nil then v.look = stead.player_look; end if v.inv == nil then v.inv = stead.player_inv; end if v.use == nil then v.use = stead.player_use; end if v.action == nil then v.action = stead.player_action; end if v.save == nil then v.save = stead.player_save; end if v.objs == nil then v.objs = stead.player_objs; end v.player_type = true; return obj(v); end stead.game_life = function(self) local av, v stead.in_life_call = true; stead.in_life_move = false stead.lifes_op = {}; -- lifes to on/off stead.PLAYER_MOVED = stead.rawget(_G, 'PLAYER_MOVED') for i, o in stead.opairs(self.lifes) do local vv local pre o = stead.ref(o); if not isDisabled(o) then stead.rawset(_G, 'PLAYER_MOVED', false) vv,pre = stead.call(o, 'life'); if stead.rawget(_G, 'PLAYER_MOVED') then -- clear life output, but not current av = nil v = nil stead.in_life_move = true stead.rawset(_G, 'ACTION_TEXT', vv); elseif pre then av = stead.par(stead.space_delim, av, vv); else v = stead.par(stead.space_delim, v, vv); end end end stead.rawset(_G, 'PLAYER_MOVED', stead.in_life_move) if not stead.rawget(_G, 'PLAYER_MOVED') then stead.rawset(_G, 'PLAYER_MOVED', stead.PLAYER_MOVED) end stead.PLAYER_MOVED = nil stead.in_life_call = false; for i,o in stead.ipairs(stead.lifes_op) do if o[1] then stead.lifeon(o[2], o[3]); else stead.lifeoff(o[2]); end end stead.lifes_op = nil; return v, av; end stead.player_moved = function() return stead.rawget(_G, 'PLAYER_MOVED') or stead.PLAYER_MOVED end stead.life_moved = function() return stead.in_life_move end stead.check_list = function(k, v, p) if v.check == nil or not v:check(stead.string.format("%s[%q]", p, k)) then error ("error in list: "..stead.object..'.'..k); end end stead.check_room = function(k, v) if v.obj == nil then error("no obj in room:"..k); end if v.way == nil then error("no way in room:"..k); end end stead.check_player = function(k, v) v.where = stead.deref(v.where); end stead.check_object = function(k, v) if not v.nam then error ("No name in "..k); end if isRoom(v) then stead.check_room(k, v); end if isPlayer(v) then stead.check_player(k, v); end for_each(v, k, stead.check_list, isList, stead.deref(v)) end function for_everything(f, ...) local is_ok = function(s) return true end for_each(_G, '_G', f, is_ok, ...) end local compat_api = function() if stead.compat_api then return end if not stead.api_atleast(1, 6, 0) then if not stead.rawget(_G, 'go') then go = stead.go end if not stead.rawget(_G, 'goin') then goin = walkin end if not stead.rawget(_G, 'goout') then goout = walkout end if not stead.rawget(_G, 'goback') then goback = walkback end if not stead.rawget(_G, "goto") then if _VERSION == "Lua 5.1" then -- 5.1 lua stead.rawset(_G, "goto", walk) end end end if not stead.api_atleast(1, 7, 1) then if not stead.rawget(_G, 'goin') then goin = function() error ("Please use 'walkin' instead 'goin'.", 2) end end if not stead.rawget(_G, 'goout') then goout = function() error ("Please use 'walkout' instead 'goout'.", 2) end end if not stead.rawget(_G, 'goback') then goback = function() error ("Please use 'walkback' instead 'goback'.", 2) end end if not stead.rawget(_G, "goto") then if _VERSION == "Lua 5.1" then -- 5.1 lua stead.rawset(_G, "goto", function() error ("Please use 'walk' instead 'goto'.", 2) end) end end get_savepath = instead_savepath get_gamepath = instead_gamepath get_steadpath = instead_steadpath get_gamespath = instead_gamespath menu_toggle = instead_menu_toggle readdir = instead_readdir call = stead.call call_bool = stead.call_bool call_value = stead.call_value get_title = stead.get_title get_picture = stead.get_picture get_inv = stead.get_inv get_ways = stead.get_ways get_autosave = stead.get_autosave fmt = stead.fmt obj_tag = stead.obj_tag module_init = stead.module_init player_inv = stead.player_inv dialog_enter = stead.dialog_enter end if not stead.api_atleast(1, 4, 5) then stead.xref = function(...) return xref(...); end -- internals of call cctx = stead.cctx callpush = stead.callpush callpop = stead.callpop clearargs = stead.clearargs -- saving savemembers = stead.savemembers; savevar = stead.savevar clearvar = stead.clearvar end stead.compat_api = true end stead.do_ini = function(self, load) local v = '' local vv local function call_key(k, o) o.key_name = k; end local function call_codekey(k, o) stead.functions[o].key_name = k; end local function call_ini(k, o, ...) v = stead.par('', v, stead.call(o, 'ini', ...)); end stead.math.randomseed(stead.os.time(stead.os.date("*t"))) stead.rnd(1); stead.rnd(2); stead.rnd(3); -- Lua bug? if stead.type(game) ~= 'table' then error ("No valid 'game' object."); end if not isPlayer(stead.me()) then error ("No valid player."); end if not isRoom(stead.here()) then error ("No valid room."); end game.pl = stead.deref(game.pl); stead.me().where = stead.deref(stead.me().where); -- game.where = stead.deref(game.where); for i, f in ipairs(stead.modules_start) do f(load) end if not load then compat_api() for_everything(function(k, s) if isObject(s) then call_key(k, s) elseif isCode(s) then call_codekey(k, s) end end) for_each_object(stead.check_object); call_key("game", game); for_each(game, "game", stead.check_list, isList, stead.deref(game)) end for_each_object(call_ini, load); stead.me():tag(); stead.initialized = true return v end stead.game_ini = function(self) local v,vv v = stead.do_ini(self); vv = iface:title(stead.call(self,'nam')); vv = stead.par(stead.scene_delim, vv, stead.call(self,'dsc')); if stead.type(stead.rawget(_G, 'init')) == 'function' then init(); end return stead:fmt(stead.par(stead.scene_delim, vv, v)); end stead.game_start = function(s) if stead.type(stead.rawget(_G, 'start')) == 'function' then start() -- start function end stead.started = true if not s.showlast then stead.last_disp(false) end return stead.cat('', stead.last_disp()) end function game(v) if v.nam == nil then error ("No game name in constructor.", 2); end if v.pl == nil then v.pl = 'player'; end if v.ini == nil then v.ini = stead.game_ini; end if v.start == nil then v.start = stead.game_start end if v.save == nil then v.save = stead.game_save; end if v.load == nil then v.load = stead.game_load; end if v.life == nil then v.life = stead.game_life; end if v.step == nil then v.step = stead.game_step; end if v.lifes == nil then v.lifes = {}; end v.lifes = list(v.lifes); v._time = 0; v._running = true; v.game_type = true; return v; end function live(v) return stead.ref(game.lifes:srch(v)); end function isEnableSave() if game.enable_save == nil or stead.get_autosave() then return true end return stead.call_bool(game, 'enable_save'); end function isEnableAutosave() if game.enable_autosave == nil then return true end return stead.call_bool(game, 'enable_autosave'); end function for_each(o, n, f, fv, ...) local call_list = {} if stead.type(o) ~= 'table' then return end stead.object = n; for k, v in stead.pairs(o) do if v ~= _G and fv(v) then stead.table.insert(call_list, { k = k, v = v }); end end for k, v in stead.ipairs(call_list) do f(v.k, v.v, ...); end end function isCode(s) return stead.type(s) == 'function' and stead.type(stead.functions[s]) == 'table' end function for_each_codeblock(f,...) for_each(_G, '_G', f, isCode, ...) end function for_each_object(f,...) for_each(_G, '_G', f, isObject, ...) end function for_each_player(f,...) for_each(_G, '_G', f, isPlayer, ...) end function for_each_room(f,...) for_each(_G, '_G', f, isRoom, ...) end function for_each_list(f,...) for_each(_G, '_G', f, isList, ...) end stead.clearvar = function(v) for k, o in stead.pairs(v) do if stead.type(o) == 'table' and o ~= _G and o.__visited__ ~= nil then o.__visited__ = nil o.auto_saved = nil stead.clearvar(o) end end end stead.savemembers = function(h, self, name, need) for k, v in stead.pairs(self) do local need2 if k ~= "__visited__" then need2 = false if isForSave(k, v, self) then need2 = true; end if stead.type(k) == 'string' then stead.savevar(h, v, name..'['..stead.string.format("%q",k)..']', need or need2); elseif stead.type(k) == 'number' then stead.savevar(h, v, name.."["..k.."]", need or need2) elseif stead.type(k) == 'table' and stead.type(k.key_name) == 'string' then stead.savevar(h, v, name.."["..k.key_name.."]", need or need2) end end end end -- savemembers = stead.savemembers; stead.savevar = function(h, v, n, need) local r,f if v == nil or stead.type(v) == "userdata" or stead.type(v) == "function" then if isCode(v) and need then if stead.type(stead.functions[v].key_name) == 'string' and stead.functions[v].key_name ~= n then h:write(stead.string.format("%s=%s\n", n, stead.functions[v].key_name)) else h:write(stead.string.format("%s=code %q\n", n, stead.functions[v].code)) end end -- if need then -- error ("Variable "..n.." can not be saved!"); -- end return end -- if stead.string.find(n, '_') == 1 or stead.string.match(n,'^%u') then -- need = true; -- end if stead.type(v) == "string" then if not need then return end h:write(stead.string.format("%s=%q\n",n,v)) return; end if stead.type(v) == "table" then if v == _G then return end if stead.type(v.key_name) == 'string' and v.key_name ~= n then -- just xref if v.auto_allocated and not v.auto_saved then v:save(v.key_name, h, false, true); -- here todo end if need then if stead.ref(v.key_name) == nil then v.key_name = 'null' end h:write(stead.string.format("%s = %s\n", n, v.key_name)); end return end if v.__visited__ ~= nil then return end v.__visited__ = n; if stead.type(v.save) == 'function' then v:save(n, h, need); return; end if need then h:write(n.." = {};\n"); end stead.savemembers(h, v, n, need); return; end if not need then return end h:write(n, " = ",tostring(v)) h:write("\n") end -- savevar = stead.savevar stead.gamereset = function(file, forget) stead.clearargs() if stead.api_atleast(2, 2, 0) then init = function() -- init called only once end end if forget then stead:done(); stead.rawset(_G, 'init', function() -- null init function end) stead.rawset(_G, 'start', function() -- null start function end) for_each_object(function(k, o) -- destroy all objects if o.system_type then return end stead.rawset(_G, k, nil) end); game._scripts = { } game.lifes:zap() game.scriptsforget = true stead.collectgarbage() -- anything else? stead:init(); end dofile(file); game:ini(); if #game._scripts == 0 or file ~= game._scripts[#game._scripts] then if #game._scripts ~= 0 or file ~= 'main.lua' then stead.table.insert(game._scripts, file); end end end stead.gamefile = function(file, forget) stead.gamereset(file, forget) if forget then game:start() return stead.walk(stead.here(), false, false, true); end end stead.do_savegame = function(s, h) stead.busy(true) local function save_object(key, value, h) stead.busy(true) stead.savevar(h, value, key, false); end local function save_var(key, value, h) stead.busy(true) stead.savevar(h, value, key, isForSave(key, value, _G)) end local forget = game.scriptsforget for i, v in stead.ipairs(s._scripts) do h:write(stead.string.format("stead.gamereset(%q,%s)\n", v, stead.tostr(forget))) forget = nil end save_object('allocator', allocator, h); -- always first! for_each_object(save_object, h); save_object('game', s, h); for_everything(save_var, h); -- save_object('_G', _G, h); stead.clearvar(_G); stead.busy(false) end stead.savename = function() return stead.call(stead.here(), 'nam'); end stead.game_save = function(self, name, file) local h; if file ~= nil then file:write(stead.string.format("%s.pl = %q\n", name, stead.deref(self.pl))); stead.savemembers(file, self, name, false); return nil, true end if not isEnableSave() then return nil, false end if name == nil then return nil, false end h = stead.io.open(name,"wb"); if not h then return nil, false end local n if stead.type(stead.savename) == 'function' then n = stead.savename() end if stead.type(n) == 'string' and n ~= "" then h:write("-- $Name: "..n:gsub("\n","\\n").."$\n"); end stead.do_savegame(self, h); h:flush(); h:close(); game.autosave = false; -- we have only one try for autosave stead.restart_game = false return nil; end stead.game_load = function(self, name) if name == nil then return nil, false end if stead.started then stead.gamereset('main.lua', true) end local f, err = loadfile(name); if f then local i,r = f(); if r then return nil, false end i, r = stead.do_ini(self, true); if not stead.started then i, r = game:start() end return i, r end return nil, false end stead.game_step = function(self) self._time = self._time + 1; return self:life(self); end game = game { codepage = "UTF-8"; nam = [[INSTEAD -- Simple Text Adventure interpreter v]]..stead.version..[[ '2009-2016 by Peter Kosyh]]; dsc = [[ Commands:^ look(or just enter), act (or just what), use [on what], go ,^ back, inv, way, obj, quit, save , load .]]; pl ='pl'; showlast = true; _scripts = {}; }; stead.strip = function(s) local s = stead.tostr(s); s = stead.string.gsub(s, '^[ \t]*', ''); s = stead.string.gsub(s, '[ \t]*$', ''); return s; end function isForcedsc(v) local r,g r = stead.call_bool(v, 'forcedsc'); if r then return true end g = stead.call_bool(game, 'forcedsc', v); return g and r ~= false end function isSceneUse(v) local o,g o = stead.call_bool(v, 'scene_use'); if o then return true end g = stead.call_bool(game, 'scene_use', v); return g and o ~= false end iface = { anchor = function(self) return ''; end; img = function(self, str) return ''; end, nb = function(self, str) return str; end, em = function(self, str) return str; end, right = function(self, str) return str; end, left = function(self, str) return str; end, center = function(self, str) return str; end, just = function(self, str) return str; end, top = function(self, str) return str; end, bottom = function(self, str) return str; end, middle = function(self, str) return str; end, tab = function(self, str, al) return ''; end; bold = function(self, str) return str; end, under = function(self, str) return str; end, st = function(self, str) return str; end, enum = function(self, n, str) return n..' - '..str; end, xref = function(self, str, obj) local o = stead.ref(stead.here():srch(obj)); if not o then o = stead.ref(ways():srch(obj)); end if not o then o = stead.ref(stead.me():srch(obj)); end if not o or not o.id then return str; end local n = stead.tonum(stead.nameof(o)) return stead.cat(str, "("..stead.tostr(n or o.id)..")"); end, title = function(self, str) return "["..str.."]"; end, objs = function(self, str) return str; end, ways = function(self, str) return str; end, inv = function(self, str) return str; end, text = function(self, str) if str then print(str); end end, fmt = function(self, cmd, st, moved, r, av, objs, pv) -- st -- changed state (main win), move -- loc changed local l, vv if st and not moved then if cmd ~= 'look' then av = txtem(av); pv = txtem(pv); r = txtem(r); if isForcedsc(stead.here()) then l = stead.me():look(); end end end vv = stead.fmt(stead.cat(stead.par(stead.scene_delim, l, r, av, objs, pv), '^')); return vv end, cmd = function(self, inp) local r, v; v = false stead.state = false; -- changed state (main screen) local a = { }; local cmd; stead.rawset(_G, 'RAW_TEXT', nil) stead.rawset(_G, 'PLAYER_MOVED', nil) stead.cache = {} cmd, a = stead.getcmd(inp); for i, f in ipairs(stead.modules_cmd) do local r, v = f(cmd, stead.unpack(a)) if r ~= nil or v ~= nil then return r, v end end if cmd == '' then cmd = 'look' end -- stead.me():tag(); local oldloc = stead.here(); if cmd == 'look' then stead.state = true r, v = stead.me():look(); elseif cmd == 'obj' then r, v = stead.me():objs(); elseif cmd == 'inv' then r, v = stead.me():inv(); elseif cmd == 'way' then r, v = stead.me():ways(); elseif cmd == 'ls' then r = stead.par(stead.scene_delim, stead.me():objs(), stead.me():inv(), stead.me():ways()); v = nil; elseif cmd == 'go' then stead.state = true r, v = stead.me():go(stead.unpack(a)); elseif cmd == 'back' then stead.state = true r, v = stead.me():go(stead.from()); elseif cmd == 'act' then stead.state = true r, v = stead.me():action(stead.unpack(a)); elseif cmd == 'use' then stead.state = true r, v = stead.me():use(stead.unpack(a)); elseif cmd == 'save' then r, v = game:save(stead.unpack(a)); elseif cmd == 'load' then r, v = game:load(stead.unpack(a)); if v ~= false and game.showlast then return r; end elseif cmd == 'wait' then -- nothing todo in game, skip tick v = nil; r = true; stead.state = true elseif cmd == 'nop' then -- inv only v = true; r = nil; stead.state = true else stead.state = true r, v = stead.me():action(cmd, stead.unpack(a)); end -- here r is action result, v - ret code value -- state -- game state changed if stead.state and r == nil and v == true then -- we do nothing return nil, true; -- menu end if stead.state and r == nil and v == nil and stead.api_atleast(1, 3, 5) then -- new goto return nil, false -- really nothing end if stead.rawget(_G, 'RAW_TEXT') and v ~= false then return stead.cat(r, '\n'), true; end if v == false then return stead.cat(r, '\n'), false; end stead.rawset(_G, 'ACTION_TEXT', r); -- here, life methods can redefine this local av, pv -- av -- active lifes, pv -- background local vv if stead.state then pv,av = game:step(); stead.me():tag(); vv = stead.here():look(); end vv = self:fmt(cmd, stead.state, (oldloc ~= stead.here()) or stead.player_moved(), stead.act_text(), av, vv, pv); if stead.state then stead.last_disp(vv or false) stead.last_act(stead.act_text()) end if vv == nil then -- nil is error vv = '' end return vv, true; -- action is here end, shell = function(self) local inp, i, k, cmd, a, n; stead.me():tag(); while game._running do inp = stead.io.read("*l"); if inp == 'quit' then break; end self:text(self:cmd(inp)); end end }; function me() return stead.ref(game.pl); end stead.me = me function where(s) if not isObject(stead.ref(s)) then error("Wrong parameter to where.", 2); end if isPlayer(stead.ref(s)) then return stead.ref(stead.ref(s).where); end return stead.ref(stead.ref(s).__where__); end function here() return stead.ref(stead.me().where); end stead.here = here function from(w) if w == nil then w = stead.here(); else w = stead.ref(w); end return stead.ref(w.__from__); end stead.from = from stead.time = function(s) local n = game._time; if stead.type(s) == 'number' then game._time = s end return n end function inv() return stead.me().obj; end function objs(w) if not w then return stead.here().obj; else return stead.ref(w).obj; end end function ways(w) if not w then return stead.here().way; else return stead.ref(w).way; end end stead.xref = function(str, obj, ...) if stead.type(str) ~= 'string' then return nil; end; return iface:xref(str, obj, ...); end xref = stead.xref function pseen(...) if not isDialog(stead.here()) then return end return stead.here():pseen(...); end function punseen(...) if not isDialog(stead.here()) then return end return stead.here():punseen(...); end function pon(...) if not isDialog(stead.here()) then return end stead.here():pon(...); end function poff(...) if not isDialog(stead.here()) then return end stead.here():poff(...); end function prem(...) if not isDialog(stead.here()) then return end stead.here():prem(...); end function lifeon(what, nr) if stead.in_life_call then stead.table.insert(stead.lifes_op, { true, what, nr }); return end game.lifes:add(what, nr); end stead.lifeon = lifeon function lifeoff(what) if stead.in_life_call then stead.table.insert(stead.lifes_op, { false, what }); return end game.lifes:del(what); end stead.lifeoff = lifeoff stead.allocator_save = function(s, name, h, need, auto) if s.auto_allocated and not auto then return end if need then if s.auto_allocated then -- in current realization always false local m = stead.string.format("allocator:new(%s, %s)\n", stead.tostring(s.constructor), stead.tostring(s.constructor)); h:write(m); else local m = stead.string.format(" = allocator:get(%s, %s)\n", stead.tostring(name), stead.tostring(s.constructor)); h:write(name..m); if stead.api_atleast(1, 3, 0) then m = stead.string.format("stead.check_object(%s, %s)\n", stead.tostring(name), name); h:write(m); end end end stead.savemembers(h, s, name, false); if s.auto_allocated then s.auto_saved = true end end function new(str) if stead.type(str) ~= 'string' then error("Non string constructor in new.", 2); end return allocator:new(str); end function delete(v) allocator:delete(v); end stead.vobj_save = function(self, name, h, need) local dsc = self.dsc; local w = stead.deref(self.where); if need then h:write(stead.string.format("%s = vobj(%s, %s, %s, %s);\n", name, stead.tostring(self.key), stead.tostring(self.nam), stead.tostring(dsc), stead.tostring(w))); end stead.savemembers(h, self, name,false); end stead.vobj_act = function(self, ...) local o, r = stead.here():srch(self); -- self.nam if stead.ref(o) and stead.ref(o).where then return stead.walk(stead.ref(o).where); end return stead.call(stead.ref(r),'act', self.key, ...); end stead.vobj_used = function(self, ...) local o, r = stead.here():srch(self.nam); return stead.call(stead.ref(r),'used', self.key, ...); end function vobj(key, name, dsc, w) if not stead.tonum(key) then error ("vobj key must be number!", 2); end return obj{ key = key, nam = name, dsc = dsc, where = stead.deref(w), act = stead.vobj_act, used = stead.vobj_used, save = stead.vobj_save, obj = list({}) }; end function vway(name, dsc, w) return obj{ key = -1, nam = name, dsc = dsc, act = stead.vobj_act, where = stead.deref(w), used = stead.vobj_used, save = stead.vobj_save, obj = list({}), }; end stead.vroom_save = function(self, name, h, need) if need then local t = stead.string.format("%s = vroom(%s, %q);\n", name, stead.tostring(self.nam), stead.deref(self.where)) h:write(t); end stead.savemembers(h, self, name,false); end stead.vroom_enter = function(self, ...) return stead.walk(self.where); end function isVroom(v) return (stead.type(v) == 'table') and (v.vroom_type) end function vroom(name, w) if w == nil then error("Wrong parameter to vroom.", 2); end return room { vroom_type = true, nam = name, where = stead.deref(w), enter = stead.vroom_enter, save = stead.vroom_save, }; end function walk(what) local v,r=stead.me():walk(what); stead.me():tag(); return v,r; end stead.walk = walk; function back() return stead.me():back(); end stead.back = back; stead.rnd = function(...) if stead.random then return stead.random(...) end return stead.math.random(...); end stead.rndseed = function(...) if stead.randomseed then return stead.randomseed(...) end stead.math.randomseed(...) end function taken(obj) if isObject(stead.ref(obj)) and stead.ref(obj)._taken then return true end return false; end function remove(obj, from) local o,w from = stead.ref(from) if from then if isList(from) then return from:del(obj) end o,w = from:srch(obj); else o,w = stead.here():srch(obj); end if w then stead.ref(w).obj:del(obj); end o = stead.ref(o); if not isObject(o) then o = stead.ref(obj); end if isObject(o) then o.__where__ = nil; end return o end stead.remove = remove function purge(obj, from) local o,w from = stead.ref(from) if from then if isList(from) then return from:purge(obj) end o,w = from:srch(obj, true); else o,w = stead.here():srch(obj, true); end if w then stead.ref(w).obj:purge(obj); end o = stead.ref(o); if not isObject(o) then o = stead.ref(obj); end if isObject(o) then o.__where__ = nil; end return o end stead.purge = purge function taketo(obj, wh, pos) local o = remove(obj, wh); if not isObject(o) then error ("Trying to take wrong object.", 2); end inv():add(obj, pos); o._taken = true wh = stead.deref(stead.me()) if stead.type(wh) == 'string' then o.__where__ = wh; end return o end function take(obj, wh) return taketo(obj, wh); end function takef(obj, wh) return taketo(obj, wh, 1); end function putto(obj, w, pos) local wh local o = stead.ref(obj); if not isObject(o) then error ("Trying to put wrong object.", 2); end if not w then wh = stead.deref(stead.here()); w = stead.here(); else wh = stead.deref(w); w = stead.ref(w); end if isList(w) then w:add(obj, pos); else w.obj:add(obj, pos); end if stead.type(wh) == 'string' then o.__where__ = wh; end return o; end function put(obj, w) return stead.placeto(obj, w); end function putf(obj, w) return stead.placeto(obj, w, 1); end place = put placef = putf placeto = putto stead.placeto = placeto function replace(obj, obj2, from) local o,w,i if not isObject(stead.ref(obj2)) then error ("Wrong parameter to replace.", 2); end from = stead.ref(from) if from then if isList(from) then from:replace(obj, obj2); return stead.ref(obj) end o,w = from:srch(obj); else o,w = stead.here():srch(obj); end if w then stead.ref(w).obj:replace(o, obj2); stead.ref(obj2).__where__ = stead.deref(w); else stead.placeto(obj2, from); end o = stead.ref(o); if not isObject(o) then o = stead.ref(obj); end if isObject(o) then o.__where__ = nil; end return o; end function drop(obj, w) local o = put(obj, w); if not isObject(o) then error ("Trying to drop wrong object.", 2); end inv():del(obj); o._taken = false return o; end function dropf(obj, w) local o = putf(obj, w); if not isObject(o) then error ("Trying to dropf wrong object.", 2); end inv():del(obj); o._taken = false return o; end function dropto(obj, w, pos) local o = putto(obj, w, pos); if not isObject(o) then error ("Trying to dropto wrong object.", 2); end inv():del(obj); o._taken = false return o; end function seen(obj, wh) if not wh then wh = stead.here(); else wh = stead.ref(wh); end local o,w = wh:srch(obj); o = stead.ref(o); if isObject(o) then return o,w end return nil end function exist(obj, wh) if not wh then wh = stead.here(); else wh = stead.ref(wh); end local o,w = wh:srch(obj, true); o = stead.ref(o); if isObject(o) then return o,w end return nil end function have(obj) local o = inv():srch(obj); o = stead.ref(o); if isObject(o) then return o end return nil end function moveto(obj, there, from, pos) stead.remove(obj, from); stead.placeto(obj, there, pos); return stead.ref(obj); end stead.moveto = moveto function move(obj, there, from) return stead.moveto(obj, there, from); end function movef(obj, there, from) return stead.moveto(obj, there, from, 1); end stead.cacheable = function(n, f) return function(...) local s = stead.cache[n] if s ~= nil then if s == -1 then s = nil end return s end stead.cache[n] = -1 s = f(...) if s ~= nil then stead.cache[n] = s end return s end end stead.get_picture = stead.cacheable('pic', function() local s = stead.call(stead.here(), 'pic'); if not s then s = stead.call(game, 'pic'); end return s; end) stead.get_title = stead.cacheable('title', function() local s = stead.call(stead.here(), 'nam'); return s; end) if instead_savepath == nil then function instead_savepath() return "./" end end function autosave(slot) game.autosave = true; game.autosave_slot = slot; end stead.autosave = autosave; stead.get_restart = function() return stead.restart_game end stead.get_menu = function() local n = stead.need_menu stead.need_menu = nil return n end stead.restart = function() stead.restart_game = true end stead.get_autosave = function() return game.autosave, game.autosave_slot end function change_pl(p) local o = stead.ref(p); if stead.type(stead.deref(p)) ~= 'string' or not o then error ("Wrong player name in change_pl...", 2); end game.pl = stead.deref(p); return stead.walk(o.where, false, true, true); -- no call enter/exit end function disabled(o) return isDisabled(stead.ref(o)) end function disable(o) o = stead.ref(o) if isObject(o) then o:disable() end return o end function enable(o) o = stead.ref(o) if isObject(o) then o:enable() end return o end function disable_all(o) o = stead.ref(o) if isObject(o) or isList(o) then o:disable_all() end return o end function enable_all(o) o = stead.ref(o) if isObject(o) or isList(o) then o:enable_all() end return o end function isForSave(k, v, s) -- k - key, v - value, s -- parent table if stead.type(k) == 'function' then return false end if stead.type(v) == 'function' or stead.type(v) == 'userdata' then return false end return stead.string.find(k, '_') == 1 or stead.string.match(k,'^%u') end stead.inherit = function(o, f) return function(...) return f(o(...)) end end inherit = stead.inherit stead.hook = function(o, f) return function(...) local ff if stead.type(o) ~= 'function' then ff = function(s) return o; end else ff = o end return f(ff, ...) end end hook = stead.hook function nameof(v) if isObject(v) then local r = stead.call(v, 'nam'); return r end end stead.nameof = nameof stead.dispof = function(v) if isObject(v) then local r if game.gui then r = stead.call(v, 'disp') end if r == nil then r = stead.call(v, 'nam'); end return r end end function stead_version(v) if not stead.tostr(v) then return end stead.version_table = {} stead.api_version_table = {} for n in stead.string.gmatch(stead.version, "[0-9]+") do stead.table.insert(stead.version_table, stead.tonum(n)) end for n in stead.string.gmatch(v, "[0-9]+") do stead.table.insert(stead.api_version_table, stead.tonum(n)) end if not stead.atleast(stead.unpack(stead.api_version_table)) then error ([[The game requires instead engine of version ]] ..v.. [[ or higher. https://instead-hub.github.io]], 2) end stead.api_version = v if stead.api_atleast(1, 2, 0) then require ("walk") require ("vars") require ("object") end if stead.api_atleast(1, 6, 3) then require ("dlg") end end instead_version = stead_version function code(v) local f = stead.eval(v) if not f then error ("Wrong script: "..stead.tostr(v), 2); end stead.functions[f] = { f = f, code = v }; return f; end stead.code = code --- here the game begins stead.objects = { null = obj { nam = 'null'; }; allocator = function() return obj { nam = 'allocator', get = function(s, n, c) if isObject(stead.ref(n)) and stead.api_atleast(1, 3, 0) then -- static? return stead.ref(n); end local v = stead.ref(c); if not v then error ("Null object in allocator: "..stead.tostr(c)); end v.key_name = n; v.save = stead.allocator_save; v.constructor = c; return v end, delete = function(s, w) w = stead.ref(w); if stead.type(w.key_name) ~= 'string' then return end local f = stead.eval(w.key_name..'= nil;'); if f then f(); end end, new = function(s, n, key) local v = stead.ref(n); if stead.type(v) ~= 'table' or stead.type(n) ~= 'string' then error ("Error in new.", 2); end v.save = stead.allocator_save; v.constructor = n; if key then s.objects[key] = v v.key_name = stead.string.format('allocator["objects"][%s]', stead.tostring(key)); else local nm = #s.objects + 1 -- here is new index stead.table.insert(s.objects, v); v.key_name = 'allocator["objects"]['..stead.tostr(nm)..']'; end if stead.api_atleast(1, 3, 0) then stead.check_object(v.key_name, v) end return v end, objects = { save = function(self, name, h, need) stead.savemembers(h, self, name, true); end, }, }; end; pl = function() return player { nam = "Incognito", where = 'main', obj = { } }; end; main = function() return room { nam = 'main', dsc = 'No main room defined.', }; end; } stead.sandbox = function() if STANDALONE then return end -- sandbox -- local check_path = function(realpath, type, find, gsub, savepath, gamepath, path) if not path then return false end path = realpath(path) if not path then return false end local spath = realpath(savepath) if not spath then return false end local s = find(path, spath..'/', 1, true) if s ~= 1 then spath = realpath(gamepath); if spath then s = find(path, spath..'/', 1, true) end end if s ~= 1 then return false end return true end local build_sandbox_open = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(io.open, function(f, path, acc, ...) if type(acc) ~= 'string' or not find(acc, "[aw+]") then -- only write access return f(path, acc, ...) end if not check_path(realpath, type, find, gsub, savepath, gamepath, path) then error ("Access denied (write): ".. path, 3); return false end return f(path, acc, ...) end) end local build_sandbox_remove = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(os.remove, function(f, path, ...) if type(path) ~= 'string' then return f(path, ...) end if not check_path(realpath, type, find, gsub, savepath, gamepath, path) then error ("Access denied (remove): ".. path, 3); return false end return f(path, ...) end) end local build_sandbox_rename = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(os.rename, function(f, oldname, newname, ...) if not check_path(realpath, type, find, gsub, savepath, gamepath, oldname) or not check_path(realpath, type, find, gsub, savepath, gamepath, newname) then error ("Access denied (rename): ".. oldname .. ', '.. newname, 3); return false end return f(oldname, newname, ...) end) end local build_sandbox_output = function(realpath, error, type, find, gsub, savepath, gamepath) return stead.hook(io.output, function(f, path, ...) if type(path) == 'string' and not check_path(realpath, type, find, gsub, savepath, gamepath, path) then error ("Access denied (output): ".. path, 3); return false end return f(path, ...) end) end io.open = build_sandbox_open(instead_realpath, error, type, string.find, string.gsub, instead_savepath(), instead_gamepath()); os.remove = build_sandbox_remove(instead_realpath, error, type, string.find, string.gsub, instead_savepath(), instead_gamepath()); os.rename = build_sandbox_rename(instead_realpath, error, type, string.find, string.gsub, instead_savepath(), instead_gamepath()); io.output = build_sandbox_output(instead_realpath, error, type, string.find, string.gsub, instead_savepath(), instead_gamepath()); os.execute = function(s) print ("Warning: trying to do os.execute: "..s); end io.popen = function(s) print ("Warning: trying to do io.popen: "..s); end os.tmpname = function(s) print ("Warning: trying to do os.tmpname"); end if not DEBUG then debug = nil end package.cpath = "" package.preload = {} package = nil end -- end of sandbox -- stead.init = function(s) stead.initialized = false stead.started = false for k, v in pairs(stead.objects) do if type(v) == 'function' then stead.rawset(_G, k, v()) else stead.rawset(_G, k, v) end end s.functions = {} -- code blocks for k,v in stead.ipairs(s.modules_ini) do v(); end if stead.type(stead.sandbox) == 'function' then stead.sandbox() stead.sandbox = nil end end stead.done = function(s) for k, v in stead.ipairs(s.modules_done) do v(); end end ref = stead.ref deref = stead.deref pclr = stead.pclr pget = stead.pget p = stead.p pr = stead.pr pn = stead.pn par = stead.par cat = stead.cat player_moved = stead.player_moved rnd = stead.rnd; gamefile = stead.gamefile time = stead.time instead_version(stead.api_version) -- vim:ts=4 instead-3.2.1/themes/0000755000175000017500000000000013267071775013470 5ustar peterpeterinstead-3.2.1/themes/bluesteel/0000755000175000017500000000000013267071774015453 5ustar peterpeterinstead-3.2.1/themes/bluesteel/theme.ini0000644000175000017500000000172213267071774017260 0ustar peterpeter; $Name: Blue Steel$ ; $Name(ru): Голубая cталь$ ; $Name(uk): Блакитна сталь$ ; $Name(es): Acero azul$ ; $Name(it): Acciaio Blu$ scr.w = 800 scr.h = 600 scr.gfx.bg = bg.png scr.col.bg = white scr.gfx.cursor.x = 1 scr.gfx.cursor.y = 1 scr.gfx.cursor.normal = cursor.png scr.gfx.cursor.use = cursor-use.png scr.gfx.pad = 7 scr.gfx.mode = embedded win.gfx.h = -1 ;unlim win.x = 34 win.y = 54 win.w = 480 win.h = 500 win.gfx.up = uparrow.png win.gfx.down = downarrow.png win.col.fg = #cfcfdf win.col.link = #ffffff win.col.alink = gold inv.x = 576 inv.y = 54 inv.w = 170 inv.h = 500 inv.gfx.up = uparrow.png inv.gfx.down = downarrow.png inv.col.fg = #cfcfdf inv.col.link = #ffffff inv.col.alink = gold inv.mode = vertical menu.col.bg = #29282e menu.col.fg = #bdbdbf menu.col.link = #ffffff; #dcdbe0 menu.col.alink = #00ff00 menu.col.alpha = 245 menu.col.border = #bdbdbf menu.bw = 2 menu.gfx.button = menu.png menu.button.x = 742 menu.button.y = 581 instead-3.2.1/themes/bluesteel/cursor.png0000644000175000017500000000155613267071774017505 0ustar peterpeterPNG  IHDRͭ'sRGBbKGD pHYs B(xtIME atEXtCommentCreated with GIMPWIDAT8ˍOUyϹ~zk\^s#JoľLiQmrLZcTBmQmFB #%]H4cYj!3)43͟>}<I<_trgN-"F+8S|q78YCT-ҍ;%Fߎ13=523=3'ĹǷon6-^v Q1o8)`@eIr˵պ5ڶήm4w}{e3=Ek \UǾ<?=Y\۷ ,_d oD"7$WV{PɑoI%ХBX 4/@GCIENDB`instead-3.2.1/themes/bluesteel/uparrow.png0000644000175000017500000000033213267071774017656 0ustar peterpeterPNG  IHDR 2ϽsRGBbKGD pHYs  ~tIME ( '>ZIDATc`9\󟁁?8"M] # tŌXps'v0$Flě3)s'v@5 N /iIENDB`instead-3.2.1/themes/bluesteel/menu.png0000644000175000017500000000237113267071774017130 0ustar peterpeterPNG  IHDR:sRGB pHYs  tIME'$tLtEXtCommentCreated with GIMPWPLTE))0     !!""#$#$$% % &!!&##)$$+&&,**2+*2++3-2?..500700821:66?99B=}Uo9Uv~'>`vqN8 "aӝ"iFMtPSԒb򠄔_M~IENDB`instead-3.2.1/themes/bluesteel/cursor-use.png0000644000175000017500000000555213267071774020277 0ustar peterpeterPNG  IHDR&, sRGB pHYs B(xtIME ,FtEXtCommentCreated with GIMPWbKGD IDATX͘PgǕ""g(ԀQb(ذbAMl렧Ɔr8Ω bAP9eAzYRwXT?f\fDͼS`=ƖaA`~?\E 6nx@Ze2YSQQ R*--^wtt|^$=\Pi ^Ts}0d;>=@3[jVV]UVm<~xyAf /uuuTJ͜9 ! q#ymB̦<|pRrun÷we545Ç'w,>٪U{ \J*6 AACFv1Z۷ҥK ?zYVVBٳgSHEj@֯_|AB Q W<<<(((H%%%xeXXXa~~3Qp N+=P\Llٲsjܴi Ç#G66wޔq㥶Pت۷oB[nILAPl=?׷zo ,zkcdhǏ]pANl=zOus_}b"J+Q+Zٳ/nbγӈ'O^֠.j(Ԫ:@Ԯ]6܉'RPSRR*g脭[FbϞ=ix=XXЌxAq[( cRCBBmBWM~Zzu N&9s&mL)GYI8pAoJܷoU/`;;c fYXXC!'Ot=lْ%K"`Yw^h_=7666ѡVpg[tt2/""BaddI2K^"+C)G H% 7>P.NFEEɠD:|U ¡ +gJ̃+NK&OAċIwE-#BS>xo &(29 k2J!Ɏ=*sҚofF({ک0-]P@ܹ#P*OQ0qDAF'(4 7 3y^z/][;.6jʋ/Q)RB'$h?H4L/:`0w\A|0FOcPxõܼyIB {I 2Ν;sƍһw KPbtΜ9q =z p-P8T{<44[nӡP0BjYŧO$ ZhO%(/SNc`PcPnhrCh3449y5Q b@daWLJLL,ČW!^ƻp7CMyF6C`ľ> 0iddt[hEߌ^\uonQM8(Fs2qZ<k׮PQ{a6`V˅1]궁$%uuu7o0J+ ?gQc @ {|"~'?Ԅ$@~f5"fS℄1MM>JG8:1^{Aw|&ٳgmױ܉}>>i ~_hnpty1&9"`y6lRŕgm `i"+c|ʢY{ζ̡LIuO'e Z˔kڡu/DDIENDB`instead-3.2.1/themes/bluesteel/downarrow.png0000644000175000017500000000035513267071774020206 0ustar peterpeterPNG  IHDR 2ϽsRGBbKGD pHYs  ~tIME &HmIDATc\xS{kS! 02000Twk 0~@$`1ME6hQ@uK=od񟍍?AQ3k~lIENDB`instead-3.2.1/themes/bluesteel/bg.png0000644000175000017500000072623613267071774016571 0ustar peterpeterPNG  IHDR X'sRGB pHYs  ~tIME *X1HbKGDIDATx콇]u/z\1s}#h!$↍{wכ78ɻ\k\k w7u^m=o1uYu-JYg5/nNO5vmzxq =3Y:hZ h=YnޫڠJKVmШgg5fs`5cWJ.mVQ0o#EXk?ۣV;n'5ܷ[7G䚣f!oF[ lԍI.žpt;"zk|#mΙLشuHKL]&=߷v:hoӝ-? pw̷+cw9S|khvSї~%o:?̾!b>@,Nk~d9P~QG 6zcM{B҅'$ 쎼tBҒ@i/%O.{ӫuvx݀GG1(tǞNFD1ܶ>6(Ż;ogOUvf;q!nڌ{-Y'}F5!z1+E?oOz7̿1vb1p6ԗl&=_#y:ID2O-^-XrJl%M9Nazݧ_)>둮d%_ah J,JH 1D&M,`?&l bA4?bRw?ktRпZw@0V1FoVmN U#c f5F4ݶGN_FV#vOKH1X) 2} =Ӏ8C\ 5a<^>`W:90V) DȣS@K vb[]{罗f4?fO [5`?CjYd=έNJ~4:!6Oiy'+v}:[Zp,*#AbnOͰT-C'^օKe&W)㤫C' ٝf >6;R1H9*ƌE&J!?N'eJ<T hO r5Lp,:)J$@!#n@^XަtL@1=!|纩|TdcC jF} qӫjO rZJb,K5K9@ TSd`+Z-)f08ZBXuٍЕ_to6uhmj#48&;*dڂAōԾh|+D(8Asר't4\˭ ͹+nIӽA=|ďEWP_5o P_W;g-Vk :묤)涺tSO~3Cr(eih}hE>F= Nhͱ;Z2ɖP8a0mD#ڊU H@FȹQg+]!tYn'<`LQCϻx9Ƅ B2B)LoӔ-|W1ʡ"}<Ủ' ?ɖ9H&G91+FYz3/tU؅EEa `VDWa&J[]#)ypeˎd(+3`JxL6xWǎ4xdٛn6xE,.S c7'5Fb"Tluk0paXff '-b!0ln!!2Oב 36$W;&VƒeSs$ա4hu6Ic)FH)EOќg!%u$Ȕ`HG^@rͦ՚jwvJLFɝ GFK7d*3sҙJYtl9<)KM 5k/(̽a<$# +-nz\#-b:3&beP t%X{+{ xKȐ8+$Jh߂w DUD(הt%S1ΖYlڿfwuSf_vWoA DuEh3GiS W奖Gf!]xK?Du4,**>;E[;hg+9geVƊ^ǃ p!Bjq~`<zJP{rdIv[aJVX}>l%A*UW!Ab#]wG5U9gƒ#r,x VF͘ekG *mjd䅜X/<`Q+D[?Ҕx_3z3RopE%4)z63L0do0j6'ri<XщŽ_y&y|UlLRev&_ C:bS8"!Bߓ}pٌPZ ` xa4AmAPҟ^EzTs`b,雔9f0.|RSLnu=6-b"r&w+>K1 H+1Z۠Yh3ubxGBk[ p*UeU0|EWwXX4ߴϖz:wfVDO*ʆVaj+r7e>hɋ+޽O丙&iM21 S7$@.SdL`#Q {ZY)s#@ѨSX}Ib/<%eN 2B&ʇyѨe$|IQoS ob?)lkG,.2e/-:HjXwD\e $9ԢwN OS3͛"4 CF 3R/h^"ICx4/u!u t -^TXOkԹByXM[ ]ٟ -0aSCKYt?44IP)Pto*&!kLXTiLږ1Z!,"`O_yRM*Af鶩RYTѝUܳ3ƸVblR16}gXfG(R.=+Hò"*Pɯق1Ǖ..ը ,c)?z5s IH6ZCAÊ#*3!ʬ el`D@-Ӥ~s~m_ȇvHy$^;yfڊφR vWOA( ^=1Fë\ܰG n8sV$R *VYV݅&JԛMv+imUy8TxXvtY a^tbJpU 'r?%}HziVe@·9'fV- }Q.C&جcz*, b #RXˆr+ ` Xl #q߄yM'̵̂S+ G> u DOB.ԪE ^/O+񦈷+h~kc 5\6u.ɐ5ߵTaY#-ejU`i\E$fE fEe 3!j@_La>2=M?`B-Flu] HJe5[8*&rzt%OU|ۚBP3#= Y3mO &^j|W.K=ؖX!ϭX ӸĬXٻ!SVb޻ 0<1 M%r L4n]#RY'32͖v4 6F1P1ҌoBks0֑r3&122TOFEmR"P)J+ +x! |`_ˬV:BVf$1?hp!ӠD]@Txz|°N*$)ac2ojn7ɈjW͡fca~5%JՀS%4T#2l5¬&R4 <=m?SꈪHs{uUHnCԌ0Six3~pf3fժQP),O`5bJ9:bZBD9 |aXQnc\8 ҄vL1!3q%d]Q+}6CU+;Vi#e]abr 2^p5pZHi*yTv [%0ķR9}^7,^ ]29 Zu5:V%"ڇ4aV{T'Z9c%i:'id?Ji6l*Yrͮb e*ElJ'ٵ",@{ `t  `¡7 -ef_;V`Ϭ(7KsnWMQ'5G2,]ֆP ak(&}kDu^0W ) N0g|KJ{`Td)BXo'絴yyXVJiӱZQD0=wP &*"ݵ;_8p):Z~@5NġEi7iFRVMSvy*X2"6DJzċIW e[0+͒44iJy}fq,J⢣eC1B{Q!Ztɐ*.b@!=^:XJrM.:qgyc`.m\=;egf}.uBk6z Eq ci V:˃4VX7=X6u9r 3l$HEl:å1lN3㈳Jl`zVCfPdžR*GT K$ŪӑabqКlc s)k'9S;ѥL{Dʨ YhI,O)9$F4-lŘ%r&΋ڦڨ]T'fӝr_ =ø* [тRa,r?LH~Y<ݵHВ-,=6N;aWmҒ1T$\3Zk:FVIK&objI.\YvD5u+{f ;yc\+a$beOy:.b;:A"~!`,_ڬo&vtEag-DE<3 T68*f{ g&/M(UeIFJ"5^Jc ޮ0zȽP!Ў9)0CDž锆EڱUt.>Ei-T6KcjJsH8ni-`H%hvejh*dٹi,Pu7q 9[a yZ?l!=*jtG #8mY뀧ܠ&7Xf{UX liYvhwU?(|hiZپ:b, 7È[=V;)Q^^O+W\W]qZ,Q,Ս(U^e#SE8j1Qu톦LBZW (ýHۓ=\%X8y(18>D9+!u۫K/]f K&0^,GA"RM87ָ*аȀ ڻ)gIHeSa[A3sPE?2¬(tajEITf,-KZ L-b,\*[|,VyЖcwN:ZDʃ}k,0_eJ BW5Tʽ{d8~Q y8yeݽ o]ϹJP7 :V>JՕfTQ;TV'L .U[7Pȉ ޑoGUa$7 \"լѫ}r3|EXtz)-B?j:-#/a? ^u@,pA0&(Vm4}De^fq"la4eш *GO &7K`%kNr͜@(5$V ^pLk⺫c, lSnXkƉ<".c=X{/"uarbC1G zB{gķtIf mW}nENG:CњV6= sEfݨŞKt'(0Tt-j"=P[TZic늘"Hɼgc,B ?<01/vKFJk"D+QyfCԉ"B1ZQMݐ}2*e5ɞBL>mĨ)^9FB+ԃtun`lP4^4h Ͼc,M+|WD˜1)B0Zde*U ˻FWn)p%)gUR?M6M!, p66(&LqQq9Vvzg](]){cD]) S4}wYNG 9VFCd*fIacIŐjFEVlF|7LU3dǗ%T-+VLa&kF4v,tr.#5#}}s/OQoHV(daQKjZH꣣v͠vH~,QȅikBuh 0 guAO˳e8jUr㆝)2ޞtC/{%m[>Yg'`pn{әߺ[|̵-h>f>9&MxB۸˵bdQ"`hλB2e jKkdfꁨBz^a5:XIUOhi@OTD~eJX\ Gj$ŪlHVҕ["YBҷSւ҅HՆF}V^#M7D:!GWN,n4Uc5Iڍ1MLgHr j /rD1&aiTKrI|cEƕB *V)r7J -n$-3rt ]k6~8U`&9e1u%XWܰ@\0Xtk ۙ*XWc\<@:e}IO5@W`e*a{ZO뀠hI)t1ρ͖*ldg Sc-a!&Xj o2VBҪB|i>!Z`u*sNQRSc$, NI b/+F\ ,+ߦ*MCMYŧ2mMqD>cR 'ծ&;,tra, P ]-]@W)[(*VuPVt@*HS/TJ=TNkrxDՍV*YF XdXT3:I%Y4]F\^=,*X]W7`=]W+rRt A| U.zu/XWqX >tXX:ʉ9U\xZRCibp#\eɥV҄vs(3cwADIȃUi)c@~Dw0J$֦14 +6 EXfQ<Ȩ<*}WCRJHcB2V ^CIi#8=k5*,aaZ$ڂ F%aAYZ@ KjGWX ip0k$J4]'Rt"ĉժ["Dl 0E©(X UىXA/`:=^,TQZ^50"еc,ttdUCҢցXr~˵]}ʽ¡,mD|0ˈ2osmt_4>8)JW:7Ko^_`gt_Av '<mgb̅V:裏}[=wxxw<Xħas/zpϓ>/=WmxbWܺDwl[G>>?/O~xϿ/UY\ /O|e=xq;>q\]pF 7ZkF8S v`w"NǑR_r mx}B+,[x]쎇?u}>{7x?`^;G>> f'}hhx ߭/?p⦅z/=;ם~G[Gu σS~tTv? uOtg>u/};_7w^z8>? \[wq=Y\|DXn2Y9rJ4IZ19+XfܲUU'`[y߼q Xp_XN?W+s_-?C9N\nϼG?鮇^HXy|k{phgϾ_?ow}~w3_kfgkv˟o_W_~_o??~?bo~o8h~a; Wװo)hx]pF 7ZkFNqW\5XD`qt"]Ɨ}]a[?O̴^vsޗ| xT<64<<tǶ6sőcܟ|xc~\{6cq}?ηw_ʷo|O#?ao_W=>.EaU6 ePP T]R X7nG0 Ï<Ʒ_uێ8)'ǚ5;W5|C|?ϰ&x]5ϧDΠ@WSSSg Ճm7y1N87#8;n޺kV"ϑ'|^r&<<X/+6߶rW܂(px-É+Wnіݲv hfp0l^XlݝwmėsN+WlĶkWeahqE6. ۮݶr;X6nسq[c;ٴiںuUvmݲO#Dm>O~c/_W}ߣ?` I#S| 8&kk ,8ȩ=V__  W8mGs%օ9۝_z;{laٲuw߽,<ơo}[dŭ7߳~[߸?֭7 ] (W tV{=Y$v5&n?5c0OY8޹ w_Ws0Hn7znp&n^j{{k.5x?2R)$# w =N>ю?N:3f``wg)AjI %DNeN#X!gy#`],iKF2պR_ i]{3CWwSN=ko|2AW:nqW_uv8k3i5\ZX1zeO %1:8Yh>fg7,5p}4=ey.7;CyF 7Z9պ@T$yPoxT7=}qV$+jhjD qǝǟy \z[:mGqQ؃mؐ8O;ۉyvb?SE;8qw t< =3p$N~̚ rS\hcq}lx . xHp}-rđ8+őcvY8}"^O#@m+ĜH"{]GǟprV Q#ޛcʀKaGkbr8crf>7'_b~hY.&enp7J .W[6KqnDU֯ߍ_G94T+STֻ-X): p]P3قI$ S}h dJw̋=^PHYUu EcM]EF:ZW_Zs{JwiYabbв@`W^qKq &ʞt(%Qo_D{@GZ(UjIw BBvT{2ѕ`;'%`8XU:ց xynI X8k~BP#\OoE"A &O?37lݵb. \?/:ѥpLӮ9g)N7cun`x`m{ĽPґRnp7ak>XrLkڝ^0]à  `"*0UepX`7GELܠRns X \cXU90ҺRB7IRTȳ =VkUHuQ*+y&~P)U~`٪~D$AU^|b4}9pPy V*;bhʲT^QsE]8,XA)(h8 bLv=n >f aJbb]n"`@I+a_m뎻\׭꫖c 0Y,v8\Q4АipY]Kw݇[`np7Zp@-okEaCCvrEx*Dhf@#)o37#U@#*9251V~E,۞ k6+pLwǟ M&,^\V}5tUU ?MUj9zH4aK6 Z` ґV ` WV!*ʛz̉eQe|ς\/m.!u7<#sȃ'm* TrN"TSixssV0HWy`V\e X,>Cy+TCߵ噸XȕݵO~嫮 O89ˑni;эЁ0uBk;sļdnbu:ZĺeC; Ub.d#R}Mٸ]nQb}m̘iHeoA!~ړ^وlj_^^%!Xo¾g~GM/nO+Xū2p@hvPiW`ec,Y9FlVeD HgØ*VpeYDbљ c0 b'աYdK;*\(N<iQăXwVXvBW:`s@Yq8K^}_bF X8@$Χ>gӂcļ;qEɼ}`M o#+9n (Ȃ#y[I<ygC-!iM݊ 'mX#p-5q#堘CBL)8},\iX؞/}ʶ C}s#y,`ٸʷ06l5]X|4PF `(Uv_%9E 'X-s&+`/ 7o}eR}Ѩ:uĊE1{:a={ɥA8rB< U&"Xm0,+(JvANu:56~kMrw&١#y졇-)W@Je-6:tFϯE.z8%:lP3$-ވD!4?om=1P1PT|WlNe)Ow\Lڙ^+s~װ]޺ BZ%30\{.hF 7zMiV )mn{t@G t#XGX ,,XURQBq[$XV]K):*b#A)5Xu:mV`ɀE*)cK YNێm?.E8FU4]wk0 Ijo~[?3ϜAͳ͢-D؏3Θ"kg>=aɻɉic %>tgMW&;=9Hw;Yd&o _tlE tui8}Ω,J.rbӤ'}Mw A2w7O]=CgFK^g \wץ>ᝂJCkG&y"w-?$CO:4p nA6ۂ61&IUo[ܝr9Gk.fj'doي;Ba璈æN:ec#N5S=RpL.p-5u#v=u=03e ܷ; LU'd5eoPt;S85bٮペ۞yq%vGslrق6;&cU[-ѠV.&HDZ` 3,PaHAu\[&P~Vqb鐟WXRzHGԹv?(B`93R=9x*j\F \ ,NA-<7R@sl{6 ~H\߽ |Sq<:u@8۸t`'0v\l$;;'vMqv?eë#v cI]0!'39rԟ$2-.0dmQǠw;K=ϖ>v+{Z{sjH6Ԋ09o u{s/D;dj!MdE]z؟>F[`D'y^Dv%q"{y;]{ &v:T׉xBwE.qPdžMq"gAmF 7ZkFNcicLAuw0,`W}".EW <4'rhe k?=`Yq[6Hx4[;qWhې/=X(7zJ躎\i} )}kb>Hu˄VG ^!VuC$ Z c#US=Z-:أ:oE(T:8:Vw)ҋW7AD"ǜplz ő81= 8^qp1':y_'&W;DcY'WweAؐ+v-q }qq#!8+9N,-ũTBNr>ɅpkqMGb{őNq'c㬳;wt{p6x {~.Ɖ&)N ^ q's넀_6'wq 7Z^C7B[>.ĉ'x:ʕ$5WlB|Zq7~+m1/nE V.05G^"K*%(*dhjU-D* 8t(!fV}ׄ=M7q0 a0|6vL%kA]k{)-_lhuQٟng+a";6:\Z\HIzA:ʭL!~f7Lލe$aߺZժ5 sPP+PCw-kßS7ܷStu`*z"VE"12=*rVL-K+wMYlO9*/oK\V`"R/Iԛe0i#,,$bÊd2 n]|E3MA/<bŸz'KXw%F'tW7 t0˧:cf;!kTV9ܑ~ˆ_T(J2+7z͙p09RoTcuچAx  H -XӴXV%3ש+dWK:*!Aa.@ث) ̦'84kgLB移=9f}7+ob̅8$KRoX]2MC<χ‰ZAˍ+  sy랁ϲ HՊQ֥i?pm0?}k]AG:`pjN,hȻg_yTbXEi]iOªɍn_jc&YB$a,$,㎃|/Z.s!B'qK/}-*b%RWNj$|xj^Jp |9.Q=C] cX+W` fj70"JfiM) oᆱ> ɔ'M6"Sur -K}k;;&ځb[sӏ{~SKPEjX9)3t\YfN>°v- Ĩ7Moe(Ce%Ŭi7"e81W|pNb)ojʍIC<kU[oW-d|k]vE}.''r&VhaP6imp!cIr\iYc!XӴ,&c6R2+!6']Xd/J6La-@Z녃bXNN  zKud,'dG fxbZM V[TNri;`=s8B[ڤoAn*U>> .զ"5\3}Hٺ)R$e y1̖‚wwGS8^!l?Q1e SΈp:J}N5 dDa,RHwu<5+.C*ɛ~ 1X0B;6Ex%9cb8iWfΑݷCW;T 7&Nc5Th;+Q` 㭞zxgof mtXo(,ty~>^7x]w ݗ_-+Z3N0뾇? f}hC90(N+H0HRf2B|V\,Pve =VL\ _ 5GT~1xDˆF{?_US o(-jS =X "L$ CC҆6mޕZ]`A /&+t3|ӛ .#Ff^ixoXXiONҁBxP/0++dJ0VkO QJV̷U$zD^W\Rjk?wZFH_\<]4tYi6ƫ*{9Xdg}L|a 2U^NyB&N.H #/ﴕV(VcH6&Ck΢ml ćBH<ܲe/w?o9Z>PEXIaS5#̨= K0ʷ󤧌2WȜ$_2PEb"u+S0eH'mB颡1).JVq-i2AQU;zwxbQK@2*q/YXFb_)"3O7S'R+k"ER jaxIJʽU]?r`UH(|[#8B[vz>& #[[?g>  zVcz?zm[Q aR*MBCKWl7VP{1 )Z.epX+C~b;֢pgLVc1L(~T= w.BPq.$v|Us:pSկ~9X\TArĂS4V$X)zP1jfyۯ@ x")3U$8ߕߣvb9P1XR:֫ Y Āш7D!`qT$s IR@,9w@DkL/^!hnD_7mM{~_A7^eXÏfͷ޺qn|iP!Mm6hRVe1 l!ܨ#^%Do60jZ0 ţ5X *3Zz/>!Yx[TD@v](WrvH n^|Y^!c7"ie&B5v; XbV0KGp<+Rb2bPG  wkU3BzFdBM;Rj+HL9Xeʤ)Xxxq ߠ"vD P13kByb+]YjLؾ14H Kpb j9Y>tbZNUWjD U*TS7)l2`{QD}R`-ȱjӔZaQЛ҆X,YTpkMͽ2m!t1HN-D dBWRkV"(*τz[GO}+1 [3/r ɩg~o|O>L Ug/ET7#6&a dfS:W"qD`; u+-x*[1*5PT\й 6e8+S *(^>/\=Qw%Rԝ,Fj{&ArPƘK8vb@Yz$*MLe(5.F鼡b 2Q%ҋNy5~'喫fIYE? /?0 ed* T uy|Ua6_bop>ڕd=X<#<(Ғ3-sbUeǘfTPGږfpDqbJ%n%+_d'#舻SjG Mg2!TX/(5 -'QD$XkFE6}DAuD%qz s7$OJِ!X6͜jInw%05#q9 ukrU([zԫT.&hT7Y(Ql,UqL^ J"4`H )'G~ &%J٩*o% Deo RJBڂû?Ye5Px-|(:I4xSWXB.H0a)h1%9 f$4tu"=?? GN3chWN|*%*\/&腤+̩K^+*|JblaA,΁2zp0W(6* *PJ>/Mt+B"SZٱ5eEۨԙq#&*>o\sU>:2jXaݑBQWbΛ#3Z`g׿tH7iHL@%J 4;#<!nr'}ο}n?#4b;"fUs6hL&3%,1[m$s:L"cwc,A+KPVz*pŅ+/(2MkQXr N {\pЩ6'Ha*rW.ޢ*Jhs{s#a9@NY/h,C**?ē?R됯La8"'ռX$LvP8r+?=;Dz#qeaRwL+0ά ư212C+@TNF[Y.;T f)鎍vv< Q43#Tw]I(\!P{kHЪ($l6mf&qkM*s;$EM8> 5ګ[JC/~; 6zOY1oJ TPf'qmjQD6ƖO8OX"3w@PxQ]GK)2SS(5 0& 0,ϠjkB^Qڱ8# `լs]}ji&V:LXwvEWrj|So}Lv/0#RMke W]$-XQt5T,T "x&c)BYD]UpY|,(OTYAzBCB> r{O )ZfˍA937=l==|YbB<8<e8mYɼG@2C6+"1`ꎚZ\鴵 tqjİ2Sڇ!E3t5VD_wUoիE{~ 8E5&H!n]d s_ީM-OCԾyl +ɾvh`s{ ՝{Ye^&,Wp_!@FIHy;o7ں/v88CBZ<]f~!"le%]TJdc0ZphkTX;Вs%rѸaI(f1Cq٥7xr +-"tn 9`Svb 6ӹ暛ֹٙ^c %T@@-FFU``_ErPGHfڶN5 $d ʳXdΊ!/2iՑC-]:U`ܨ %-ZJѲ3*]kFO39eG,Q8(4M|Z8"׶*9Ґ+|Vv_.]vЮNP9&NHXNr,`+\鹤zbAL#\ĺ'F yX`Jf'<`%`͍ϽK 1z+!yq #k@E xIefe8$LʠUP>4e" !e8u1;\(Qzlr 9P?cRVOv9Iס^(q\X!M'JL|;}fpQE% Ja'VKFRc%4ux`(h|A.c+b.y6!^jl):f{:pa^ªhbcQTdL^_!O/\] 8u0j@B&E4^`uDr:,JiID]x.[e%*F #BUՍ*18wƗ2,(+G"_@A,RyJӪ~4pk_wm+WlW2Xo1m!147W=%=fffЃT0U+ZSOCM "FB$=Q#Z R50HyR`[;ZX ,"tßW/|3]QuԫZytxq֬9`}_~qO?s K;BR!C+k#`qqjԡB@!(FoV m>Gcol)Ci^܉#?ؓD*cSe] "{0UҞ"[zS$HmB#pY\_ʒ^4ZQN(GȨ}ՊtPu%FDt.\( - hAI,a~I.u3^ [!8XAeWh8:dkb;DK‰5F&S|+PjQ:e '  u e,[1^&I&譻,B,&iLFvD~"V""mpYx{P]OP AWV I Z_U2:sEv>zW3̥$L`̉UD$q ([kW+) T;VG**V V(3 d|B`cAbA ax /׿m *| !b:34=KL T,?ZUX.DBOsAr@ WCH*X,bX*C‚UŌhjgB1 я|F ׋% Xw9-v5oy,Uo qJU=ЊRui@\*ǼΛm0ut_%eb/9B;2wK) U^aʆ "= 0㳧;]o`?Y UAso =z0SΧ>bcj4zG:BRQuNj y%L1nu}MqXx,E-?늼\BCt@UR?*F+.¿efϪDN:mcXY&wCGB# w+ɧmBhh?VG tA=sU&G.JFĔG2rtq"0TWY@ S+ AJoBX?? 4tܱ'WnX`5aBUN}vJ 7Dϥ( 6XwfW/"e!]h>N Bg Eǫ!= ESxx^s~9>7{ξk|?ǒciT?X$vn@ե4v\Kŀx9+l*wsP'zP##PAxuxky57{m qMJC`XHT@U+bC~'X7n|ϟ-mgDxga&9j͸viyaZcIbƅNLXO2ytk=oJe<.^UT T|pOrW*7R( 2(WWH+p]j+Zo"q3hJvk4X%Dy0Uep͍ǩX6*vSrvMDTEm|20ù`kaUW9X`(ZGXy7têR扺 &d}e.Co&ΐ*Ul*yE`&ͻU3XϹFNv='`Q~L \E2LjkkBQ'Ѻ_]Bϻ1?6t˳NPK ~>ZeQ)K}p镾yj/JVǁNO ,{Ad6Xf6Q>.Ax4ڒʖܻǹ#S { `CLrMEtEt'N'zF5Hwu. VHr<'*݋l-H60y&$v+$^XڒF9OY97CmC'eleRlFYV#") U(0Z`<+ti؋|u~5J o“0_ E 6Nv 'SiX ry;X,h+EyKhyy5Smx5yGɰM*03Bǒ@20꘲>L%ypUx>+c;TArAW6ŕYVDVeZ;<[,fͭǿ8ۇwE+'efW5C2:\hͣ;i6=3"Vbhje>? +$X+POf wCHW "UϦHab%zy* 'KY[,uf ږq. ?x_AM&|_rLQ*8HW @W`‡tt=Uv|_92B x`\nSЋ%&]WUzJb/n(\)Z;)Jk[El^H)&`wZ` Pjl֛H*y}Bc~+Sw5#4cQb5.ŢWL0K7MݕTL b ^FqÌJOAukSݕ>ŘG9ܟDT_Ms$'C#9A`e#y+iy~ aB`!)fuBf`uBb ̥РE :<Dz/r̓H\\na JjBMu.;+\ *~[h1:X`X^1%L7AuuE +  iEԊ턄PL v eX.Luŗ7˟ ~zLpHk.LNVuoTQdD̑@ٯccatTÞCWY)LXˋ(9/% oc:zȬwSzvT5)/fhƋ޶{%W,Ҽ?$V v߲7BXU"J*g`V|fڻh$&Œ=K C)^HrGэkE.Ր#T["b}XZrӉU8 cYteX` ZN׎I7w<>Ma\  }SDkGHcl蜋-9|'$`]`]sB(>`x#NRYL,JU9jDVl?~胿= +.ԌqS6kaj5eE\A c/צ[ [ :ILDP7>8ޤBă{yW)OM hT5TT&uW, vuͭȞHl ,>w-R2+zϜ:HШBfS!x&.J6^<sx4X?J<0+1hp2϶4htjl2Y"v扁"S{m(B9WɟOsȀ-kvO~ #r `"ܓZoZsw]7”0Lpb5X1XzW1KsQny cOS_~_;qSaլ<=5Dx^L V3B0~e)$e$cu\U@Jx v s@oLAVpR6^#9S8<6%/F-P^`aJFFZ랬aڪًщ1~bd#55Fh3|<5Wt3X5{G %ҕpE'$YZ[Ӣ%SG>굯y{#d+@.|tDLCddաfMNx9Yg#O7pYil`G@:(ò)ϾrIOc"k- J'<Gc5Q`bw5휎Jʪ;3 @ MFTjlDЊ%F6%ogD_"KoBv䭛>=kJ.t;.Xf]wl ӽgԩpH*尧D &fb>',#] ˯ G`mhؒVfX1 k^O ?.]73X$[8G@$bFj%qwdc2ab%`AqwXWވw$4Xz2y2ܻl^~9QI1 aև>/M׿{.8u1ه f0YQ`>'`i*rTks,k^'a, o'-5󃯦*wlIRhEv*˞VWIoMF4Sh YmYVEͲ9[zJnkj6;ҠdﰎuMR-nESNu X3>fjJbr7zGa%@2a=g`H bBIto |[EuB*Zeкu4$Y~9Th #nܙԶcKY}?%D4 ~63tεF"c֙PZL+0.ć@W!]XS*kqsiX$ul}ۭ> Yp?HrYژ.CVeB5^ܝg=Πu;jQJVd B䠪(ӀdX5A[˴&/ij{pePDo4!br($͌*M5p ~#K -5SXʡ.&JQy.T&S5Š=c.ʭM`1֩e+X9J-fGkA#R`֋_ mj%+`U9<Ɠ#usOֺX} cbpfflfI3PDK޸5q;dfw4]Ļj*ZC>[[0Ux 5! +6"}EURQ ܄8B?߇ @<} ֍7/uNDE_UTQXvy髚`gʖ7xXbQnU_2k1jZ9`RCL/q{[߳)Ŋ__ɾ%knX2M_)N֨"k g撬๻:BG}Dp/zD K[9>  *nv|vvKGо`Aݵw[F=H] t `wtD'1! EQCT3Ї<戡aG,XTSeRKxIvzN B:SHwjx]ހoCʈ d!{.j<>{ yA;duF=ZLzi8]7jVH/No^`gmN91:Cফy3Һ?)UNE 2+9g`qئTfrfKoߵ % %B,L_7%pRn~>:l}CEQzceb{xkMWYq4h#ܵVTxF`}CҢ+kJ.htW/|("u{ g50Vjι>WfUZ[QȎ0g,賸W3jK%]͎W: ۊ@vt], b,-D-[f_+$WKll*Nì#Ǡ@5fIpJ#S}h1/ʲY#Q4ݩ⯼2}gUC·2XpuB{ [tngEWzI)Sy/?*,y5/Z_+LMkV+ѿ$P:WaX?J,2#:B,{`UN/]/"F0#,9325%oYp>mE-c_:.̨M`cA9N[k)rƆ7/'cZ(` 4X!!"kމB-bXDWTwIU<$cw>[n>k`*f ؎4Z#bƑMQGb%W!d,Gu3&Vvn\&0EUc6=HS=s d`YBYX,)BmƊ"]`GAYAX ;!K$ua64Qf77ovIVFlYj g8|Y0֥L"rvD[n0QܵzkJ` "/*|mEN85p.ZvE M[zAf$ia,TthLd"!plC۬+`u[U1 {U6g=+fP~J+>:N: &hXi_;,hV.[){W_}sZ$J(m e5Q9!3ˢخJD/)/9]n<+#j osH}H2Uū}7 k4?bD8  ! *ChZ.؍sG͐V^*6r&"m$.u1(>2Ct8p`K@"n;XFkd)9eat Ɗ fAHZ;/%leU)_ 2D]/r"B^6 -=Vk9Vv6[lMG==WLh%c+{hE& 1( Lw߃`eׁ #6{a}S q1xTz%Bݣ Hϝ@R :#τĺpri| ׽O}o@%NT^>4e)E/GhU/[oS2]&n-&8Qe[`QֺcJITY4J%1zL:v@\eCMU,³]QR\k"J|&}Q \@4?󮢣t~#1q 9oٷ-u$1dZ I]E 0l;%33,E1G! A,\1p]HU3J3E+u εOxiMKY@.j"֊2d|xNb{0WF97b2p]j X!z5sYh]=Xw5zB ,2yamTԉ>fe[FJ:撟0p B7嗿>9=?Z.ts,8Pntass ZˇC@,%#U<*Muő8檜J8S\I@p$+6a%QS]b#8 R cP>U4,*Nu<_ {d]MN rC@vz yCᆎD81pG=K=R0AhҘYmNs(W4-K!:&5᝘Њܸ)yâG. ǟNk'E\jc)`3cЕV̔ -`r HϘsG`L_Ic+<Oz< Nʭ)urp&'*,kᮄܙ|k #y{PAK>n`mӂ7 Ǘ<:&"<K?*A3rAzY .䮔zePbfLf,Kk:ҩ'#0d~صdʍ&Xg~IJE t.,gٹ&ܮ3Rg;1A:[k|{_9g o0gfѕ\wr(l+JZBʇV#w Fh33‰xMpl.x,xN9!1~O]b\հJL,Lp"oѫ*1WAmYgF=eҰnҋ]NMY"#@? ;Th |UxKrY261=$ӀONl>,&p |ӭй#Rb`mȑb'[dc瀺ֳj-F$L^5N=uƂ,=t6jIDCm ;D 1!N&ww#*Uȃ )#yl}teY?-GMͶ~\–}re=0Bpj6U÷^"w+XYQxogk iՇF7=)tEj:u)Fd+8t4";vjߍD+Xx&$cGtO'Bϟ#Srlb] @WW]&h%dcSJa0Ei0i^s5(ޛZ'D:*L\).#&7TlgsDsNu ˀ(^mMn;!B]$}ZmAM&2=q\ڟ, h0#:.*;OdHbFC eQY*&* p÷ыUjXzC?a)eTLfcD3%Y2XR"sCa|A$@+pTx@boE;*D%Uld[NzfC<0 ϡW=4lD=Q!j62+rmqT֢Qa˸CJNXQ`u8,`P7_ǤE D½M VؖpWZ6 рX,ti61O%դN4YZ&dyLG \9֚3(&ffӲgcg^9.gqrrJ7^UPe\۶0c$Nm\I[U ;;*wWs\##w;Mv[g/ pjީշU#(UN>Dk3 :'R]A 1%skҖsK2.˭Bg[U yED9_, 5+h_ ]+Vf_yWl#g%[q:MPHFMV^\3R)j-c265%ꜩE]~8VyڑQkXhLطnoSirl:F& L2Ukl#5?ٽx5EWZBiʭO7 "x @\Bo 'CYp_¯\:rs~I+<)ToM9 *yKS:e{^i|q#B%cW,uН̇X-03+ݖf ;r5"4:}w#쾓<ݒ> 6"@{'kMr^r =f ܷqx[c- t.0nF!hw1np܃g9W/z!! P B Up0%:SZ4ߜqṆ`P=u9`~?AuucRgۏ۵1x"Fv5m/mh\әB}`Z#ܐ!&D_5|O_P8v_O07W kRjBk O G*~":|bvſ{oVacZ * 얅%:ePbQ+&W#uQe! Xw*d;CU!׽uEE)8jjuचڭbfGo2:C<:/"&tYGl Њ;[$E'Y55zL1 +Az8V X  IаpNv+AGfk h)R`c]>.G dԝgJDva[xok~)(ӥ YUxt˯XjOOf8֔iDcĂ0?H+$rk7!B\<{RGz}߱\%g6M45+RD%7#谯c#\~\ǎ4Ik32SΚ?z0`,\ݺyݒ`ܓ@`WV12^0KS_z3Zih he(j;%j9{r_uel G㔉u<쓃X#{jvr zuaVd+ "NyO@Z4X1Pxn#5$;js6ֿ΄Т$޻) =@ ɹhc՝tT۷`we37GWǖ%A.`Lf8?WGtc8<{]4!;y2yׅti׌s#B[1璯erX?/f ^l6JqVW RJ^>Dч,(`m`VhHDU;A& 06 e[ƇOs8gwIUF;"Ѩ-W}/ }7ncG{Ir$Jbհ Xf/o_w;&g նG[Fh& WC/Xvo$yKE9A[糚Qk.ٻx˕fYh谝~PRC}2YQ~QpUJ#ŷ`:Sɭ'tSb,uKHb5$ \c5;sȓ_,gtp_A:0DX׀BIUR&j-M;Uix4zgjibaۑХ(#7kE-8dSH3vc۞>a Oxf` *4=65FMNtOm`] 'Ob=eJ7F;jLe];f B4SG) XJ5;STWjR _.&_oT`ۀؘł%2g4|UI,^秉oZn-X}M U D9W݇֘mlO $jŒA3fh#_[Hz J#NcHt⌍ $d(t =l5?q"fQvM 6߲b,Zs 9ݔ Ē1{266<ݠ;HrP.U)8 pW\WUW߄'1.B2PE\E;K5aV]{?o{ Èmo>ԧ{:j-c'DZ)fb+N)w&g6bK3觾Ͻ$g:b')cej29zƳı*zG&L"Kil49N*,v^6.a9gmZ'USiW3թOFBksz5tY{9Ol5LٯUqr0NMяQeM1)i*A;FvsnVl>H7=:)3ٙSOLQa S(lؽCZ@b벲99;فTreSK(%NòKa.EK$e3VS AbGsG!-u}dd(.8 n ƺrdSr1pt= {\*zmo4"Do|-ox-0^ 爎5:BYCvѡ4U>h~- Ͷ2# [I՝(/6נL1)a?z%hRyj$Vbe*#ɘ9hx@5ԕu@r }L]eJm Z4TheY V3X ׼ (F]2F3:b#k>}y>r1»z6+SέQ:h)ͯqlb%Vyw=gkTi :9l_s*Nj&./9cnXv0pCrD]>N~ K<$"pѢy; iXw~'^{h1Ϫ֜V6E M1޷DzNjQsu[ yom%g^,(5+s@Sm4p0sysAh bqkJHUVxͩmshf[fu~XEQ/~$JjmF)t)M]9B릒ǖE4=zPky׿=k^ F30sOm͈8<˃ER}2O-o&WWp¢6C\rV<׶ #zk[Ƿ%eřrux?UX@T{ !*,z;?@+ G:9T1!Z:N(qȀ 7=- bwG9E~6Z_msdSmZPƥPlZRʋ|P=,c,U$\ B{s!+%=KejjW\*GO>N%Tlk>V,]~VJ.;AqG U67ȩF.Cc>Gx :꯹/# [ s*.ޑN !++mݣR79i`yP*# UbQV~]/(bSg*)15MC;>a #81 c `VPu!*.BȪTyZ w|\_CD(rp|lE xm5K\w̸M[r9uf Eʪ{j'Q\1ގ6*Lu`[~uKqNsV{Cܣt3^(ʕ< dRiL]Zg C2skgjL3\Y>/2[)KմeOk۹hFɓVêO9Xs!%Y(fAFwfiݼíz ½;2y\M/?},JI' &zo2%?S>W>/ÆE&|iY_+T<9W`i[DzG gőz9ƢwW㡎ba"I?5Yl}q#f徫@;\S0wԨ;hp>شc zoK(0"3p`Ϡdg.=]+*2qn(rm?͝;ޣkf`ylYuSsgR3;JWPӞi; kp:w.YӍL)w"uizfGWc˧+Z8U injh,ޫӱ? yjh/_h?V"%Vq+sP-2@J+[ ʏlt(;-s&!({~s^`١rT[,h>??+ug)Z,<&Nܵhh &oly͹i4Xڪ+=h[c5ͪlHn  USVQd3PF_]Xb󢻊X b)Cxם?@;FOyoV'ZZ"NkdoGMv Mv~kCDGb,tס{_>җZb8y*8|J!㷾`=yW>}NW57C4 &۪郪67d_3/Ӭ~[,1ͶOޖQSיy*2u^YBϭt y0m`=kJdS՟ q ӄyW AWKvAn"8q%@v350fC OKjM6.嚹|h4ּ}R>In1s슌X,T㢉b(&#?֐Up z90*$I5˼Zk+!|3a+vB,8;b{/RhUN2Q 7ڣl1:OsFi=OSH=e驺Iz+-^ē+$͒ZX?h`k/v 2r);LUǂ1 (m1X&M_5fdmW5yG1QKaf,荒Ia,]];GT#`_c|u++I,婜T۝Ε-aFS\, 23i5OKO㵪z$ `{lX{Uɟux hW?//'>9bk~0$wlx??(OeΪ<͒ŪNP.B)lhJ@(-XIPbJa*fwɦ\:9Zi׽.B@VAv` ,+֡fP_Xlx靧G0XXi#‡=2~ǧ=U.urS |8]~&,M5}e+ %u{rpmR ]423UdȾ \\!/H+F&AX AHS(6BQ@7%qLMb0ը"ޥN]XWH@b`{ؑ(}()\B̾[1jl%ȣBu`oٓX>caWH4X1)&@o})|GQ,QkS{\tg*$sX걿T,0Y5}c[m6/> C]:ȵ k5V_PK$ˣw|xUݬ6.`|c^6y()G+4+zp?PVMQ=B#HzAXn Y!`9~2@Rb&qi㶝.S$AL3H+ڙaZd+/H/ 2Uj2z]0.”e$Y)q/GG,q',xKe7}Qk$A2sQ!ֈպI0 +/ &a)B6FR^[ 0+d,Ex uⱬˌ`,_ʷ0DL@Қ\\c3LN}mUBh_#O-;)snpqq}U !dt/n߉'ƳTz~f5b:wlGBcJC V8c,I$pl|R+j8$Q=Mgwg2(/wMr *tI11$a{4|, 4=]VdR@׊S}7`}?؜z+XE¤ǟij+cǡԳ;[/QseLWs;B Ϫv" _0+F1dwޟד2-9B}Dԣ~)'UxX!r%SMeh`]i.,? ^+l0O:.kYvGEQ[_>8ءu=S9nW=ш@)MnlEWA}UP * %96qɭ}e!xe6Ʀq' N T!ؖV#1keh&?5Z-oQFcY^:g[޺sCL%ķEkebl~g#VO[wAEHWO>}QjB]Nx-0Xn=!3p`Wt'fj]9˭VB&+ü]N{<49*aro9Joד Gl  aEt|gp06|kwjGJR='K,։.P!ȳ~ſ^ #B83tM-O7{9u",0k".FVz%:%RI2OO ,5 n8[^V$fЕ Fe&N`>IVJ-<뱣7N$Ij,ȥaw1Q3K|U*T|Bn _ɴ7NuAz-l,qJ9k_}(.%VU֧Z23fz#Xjf̍p=Hzիn|_3~j'Y7ɾB i|4XKp2ňNJM/#p.I(I-;EAGbh.[gȲ+Jg^n v4пc< |o+&cPh #b넌z\x} _ՈEoxt,m.*ܖ="'OҨ#atEENRNߧ>.m 13=J)5lE١-cd_E^nD\\&f4m,n*" UBՊI[4!?w")(uܨw %,)@y@+H݃ #0 f F 4p(+"ZY [iJ*^rD )X!`B) Ǻj3IKT@ni 5l "=q6H#ҚewZG%|Q  8] uNXhJaN"Gp2o-x' Z6@H[6CE}BS+6fXaOnͲN`- +o0&f/-̅`WM#>B>f+zc)3de _i8!bB5hy~媫v? UXe:! cxu,v 5K]F8 פvV){KHoژ&U Er˽(tD .of?"tK4T 8 r;/kB,p<'`-pJX+=ĸ§"a-@ZyBq&QT)YG eE`Sh#8rU\]/dB]x=L4!GU5^؝;\(4WidTSq.R֘F!Kydo/^2@m2 u(%qƘrtHQ6TǶ1T=0FD4eLN!HXJ0XvlD]i%|4IrğE(Z6(:U9K4m/]OԶg 3 +Xԃ^]Z P"KWSA|-=P?5wIˑ(g><9 רXULxT,А6_9XBv,V!AGVgGY_>,mee|wr<5eDñ[cMHUMQ jET'PDuѝ6ӱߪ#"ˤk /U잢sq֊-6);:MRwsAٰܵʼ˰wZStŜe![DܟҨ-zTYGrQXhdK4FT|*R*Τ*EnKn'\720g ;rC 8+_q=:qW AJaxthg36JJh(mX"Uv΅ݼJ^`AM$p`DlԶΈb37toxHoq"r$Qcuy# 䨩XQ\wjߍDH,<B!VぬHQւέT3WmFZ!]i`Q8䆬?+iY.k}1>T$|bD-V{.MVPӫ) ]I窗eQYn" ^'ws!%*%,p`L[` .A\!Xr+e8>4Uc9 E >movfGE%z5&Њ%ݡ.9Q.6V ^e~ X\T-uui˘^WꛠzD;3j:XI?n<'˥Q$6.79fLF;b"!Y۝?m6qDP%Qg >"Ya|YC K~agM V7g0Zm`xʓ+1 |U@W ,~DxJU\.3HSPF}^0dbt* #B8yP[╲>èB $rb%AF{J+8_ĔmY.O*>ٽ2*ZU-wr˖1,pK\P&jqIw˗19ׇ:a#ʹy >0HH F'|Trؤ|L g2,y{̙qkfxmF%K٫`h ၠQp_x93l{=l.`†n,0XIl|y&(I;tHHtdLr[l.exZkw맭Ek~L:(ؘ:- "ܡ*t9 *WyQ)[*+2X =01;!7V2$'=I;M~cN`ۅ[^}4q ,ufpp^։҂Aɡ'ʠ,ʂ'7׉$݄~7wRo51sg9|mtSڶ\SYeS1m!Dp'=T-Wď&r}GI $dLp,Occ/JvK?&6:)5ćPsL*iiTѐktRF.ÊvA&D+0"Wsm@(}Mz~ֳ|Ϳ~![1U\½rrjd{4nDmcM}S.GKWoDÞc*"|jZëAPlI,*9gu`o/.K`BFabWGn,uR(vncX^Ԁ19E1_.`W*A۳td?f{QXNӮ몳LI^ڂA>.&!BZazB-1eB4f[T>-귒=J.;6^auyӉX!VL2r4:YqZ o<l3lP(^mLp*[y[l;-(a!x&lWبH,4[M"#a{{s_62k{Y5JWCfVgFpOy[}WAa B=Yhf6N>"9Az&\zZb2NE惡2pZ;륯 k9NVtw9Fo{`HhJmc76aY"ֆdR&3>;pGZr n -B ~YL J-Э/Fj& ObEedlNau֘<ƢXcIG!1R"$'z,vf`ZR[/*˞ 劌/䔊z*|<5M=Vu6$`,ȝ Z]V`ٟ v;`8Ew)ҹ׊([~ؔN=V\_HgtVdP+> j5F{T۠ x̽;~5nD Lm.<C^F0XQn0x+6((qUz4EXtϻK+X*cxRFF:O=k$rN|u]9:7c{2]S&9w_NE=Z$:`륨./FRuϗBli+\m5gVm/w,] ^8;ު`ϱZeui^<[^ŮbDR̅Ϙ2ssn%/ MдU Z5%!)=S.ds0XO~ҿ LS`C}(6<|IJ32F/bs4g6G]xG+`1k-mvODc]Hc]ێՋ B>?N XJY)'X2߇0w2EU6c+զEWm#R0*)td֙)c/%̃Ohb$ SԉKVk-KIg/V`lmV`&C*ez&{,R(e3QsUJj%y+dž<ʊeI?eT]WzkEY:k,ĠeR_ɂ1 aCٛ6 H_~Mq>JM7ޘ33q+[@t<ɧ.J%h]``|H`0h!FW1ЕG,~vIbePWT\&4"Uxf;ֈcw-Qw=${V6;<$6\Tk1]M} ^mCliE OXvÄ.$(\X BRg߭1)"a& Və(<1MMlCf.C&"ʔRXiA  W:}ݵ0+VU6 #o><Ǽ!sϏl0йH5XxڣYH89ɣ&q'\HJD&r_f[*L'~fo/C4j,bSrL <#CL^t8W-h#bf!j&"BO Ekt+oDpbiiO &:#[SX+=q>"&DkUx%br*]+:j-E ]k'kZ'fO_PHb#QF1tgwHhJNT֫C} `UOq+F /-除LT2^?mHZ,SB%R>tfXC(j8rzWQghv}'dP{Dt"=\wk-YZ ;`wv!mI~\p*H0%\w:<ɲuZdIz1zX=_u cXWQS"a=!/F : ή}Wͷ[q4Xf"cAd&3 LdZncXYX>yO\U=gc0NЀ0k keIWmtorFy49RMltѥA+ݷ;{QTFoO|ƙ!^ݚfn͜-Hfq]*@b d/%<$.o_΢+^ N!C0腿 `݈6mJpaG0j nyILub¨c*y'#HډQLl)eUuzvs6'l }rr7 jx8!Q33.ٕ<ȂaE󮼓Fj̃WHqpKXWB;a:DT]8G%ƒ:=jEp~(cRI\_7[`3?njѐ"E{̗)Yy7h9ʍNr>y⋨+ʹ̔BV>y2̳ѱZu9P?AWFMǥXQp` bsq ī$} ><Î[z|~4ljs PDtW?b}~Rv$iq(/z/JsH3pQKRp%!FQ%IA;RL$($3F%ΔF۹!Vfg4Ԥ0lT-K>¶4F I= 1 +84Z&yǏXW8eQ  8d[&zeւKoKT)jT̫ ̳+"93 IS8 ̇?|`]{ǀw0YAԅ"rN;=1s@McC0XP,KG٦Y#ua Nv,ĥ(iX^مpolb,<KE^<"SzyC$S@`5[+0L1 \wf:J -`(+ӛ-0ʻ VC3!z||2g%A]Z>(-@Dh{=1,vk{nkc5YIC g% %**, `$f%35U'jeo`ETso_;o5XQA fᠱ#uw lr\M Dh.Ɠ9Mh4ܱP P5v5o Apu}pm+}QDhuJĀ/nUrnxE> O0dOs,RB"^6X3"H򌮮L'ՙDF5˧=}EetUykSx(OE"TURiFla,L"[ir %N{3ԎrlaTnN_ހ,%L{3K~2EK[9f^frbMS|JH}S;P5>[FU١yU |ZRkYɆ wowc .B,l ̣ &;li`Q@3ߍJ̝RwŸjdaϭHkaqޠ_h2XSq9 BJB#.d?N z= `Q-< 1~/IOyo ĭ5,M|g6dv^h1vRIyy!6HxI{"2?>7EyM }Bx,-n\i[ WGp,rѨ&w_œ3Ȇ: 5Of![1j/d[ݚ6Mun$kvlvIwxk?ÞQ4],quܮVSjn¬k955%?LZlRVA%O;ghpyEnxY؎׼“{y)(C3|lHf  %m1O W)=c`r8[32ї\vjzVw'ZdS ,A%+c_  ZEm{Μ}Qo2WD{$}n&+3awkW:UUZ>CpKWY y;UFJuFQcA[+r}=d|%24x˯:=Ɇ$*eI"vL|B̤ݎ6 j\㠼1mYQ>_@3 fcED fD+ՐAM>kM 59m!2:Qehפ] 3)vn;&̗=8 ԩ[0"җltbBF,{ۭw8goxozfaW_'%D=jf"{kqc&yhcW4@Y UVfH%XQW;Xr]KEL,xK_ 63+*= m~ L.ԬLSf=;ي:~ Ui7*P8ׅgzrM)·n^$sTVzr+|=%m\4o C~+R05(7^M KfS+VTw5:0XxtaIڅp^l QQcvU誑p_JQ= Glݿ=u'L#es=0XZ %`GBtwtl _Sbu-ҏ"ۥޛ8S*dz̦w%a" 6LK z])*7yFFp0DItw2+_!CLRv׾#(]>֕7< ֭ޑ_,KFvTEu>/|C۟Bh+)IUPI-; Oi,-]H֓iKS>*j,yݩj[‚JZ'-IVh*v-HL[Z'lQJ#kf?6RSbA͆ F*uҰ4BoZ}lBDzx4Nӊxq1kr:ƨc gzl@599_r?$,X`$Or/X@+4:r̵@gygHդ+1puH&;[A^2?< :>Mf`{ h0 * !UsG!Vy1V&k>1XĿQ9Vz}s/79VAD`OoXIiۆ/ 9u zZTL:ڃ¬b# {t# -zI_ udhT11DOԨ^i+oc8 ]V$(nDkVW$TSYp1HkX7(r*UZm ɪc,aV=PߑlqmO6Nne8 ;Q0V"TdCSZcq쥰߈hDOsGW^9qnPݲ5Y-c<3+ige8ՠ_'e4I: u)_gq8 rMfQ#F! on@!koC(Zq7I`y rO>75 XIi2TAw4kҊUxDf3e4n-4=t ySUhZ]iaVJlpM/k#m|X?(봽4Řg` ɾJj3FUW}oX.YXlI "Xi,|T /)`&1[ḻuaLd=~j}K*vTc)khcd@ E*P#B$" K3<#nM:A sU7!;BYL ={X${5635Ly~6Ǜwh0 +X痽G;ޒgJߞ!=\q8,js9?~۷~|ǭpbDx\1s.sm8z] ESwM&B4Y;o_kƎ}g j4iR'\aTbrvXū涴v?'HwvoF>ɆA(Dxi p]D 쁎-RLH-Z c/~=ԓ#72+@w\^ $JY)Q%.\ \"p0'.;>pn%qU $ZLffJ HdI*(;U-G9PO>>Yaf;O+ \wr|^tHK1}6]ӽiz &O4VW i Rλ <:|i0J]^%p,nлN}p7Bglu*/P O|xpHZ& Z\u cən.$9 $;`n~1zlItdcWho3D( Yjo[TI-H*u^9=odnw m[ţ^Bj;|Uu:XfTMټ/Ktqn/]p:rNI[wHZDTE:1K{<-pwy=T#`\s{@(A0`戍p?R"|nGom$#*(QU8b{>zY79:YpB#{&c2ӀnmkEt|Wp06|+\hZe7@_baPڲPɟzoHr{| b@7Ùcشj%*宪 S.?AM2ܨ)<3=s˹mA&a-欬m<]TS:=.P}`$=׳Z"IQ+߮č \-*ޒ~1Gs5 .%HX=hmny=D*a<]Z@([1weEԮHz(Q7B7j^$1P ɜ>|xW-E -MN3WB]t% zJbbasx/7v8ySe~Y>8r+m`̓bxy%BgVn;0*q$)GNKv4п@ňnֽiCmѼd]5>;sg5Bnn(< k+߇~O}H JwAu71~wg'?D[.D9_=״[Kp/WVS69mZJٕ._ezfB !CՍpek&} Ϳ[6_7QQL3} TP +-TOr(n&hG+ Ԝ%3I5b @H,t⏍ )4}, 'GE+V*f[M άz X[0(7[]Z?3C!t hfVH;'p_% LU%pGd`C=?pb JcK|2bK?w~[ys #qcC:Odm.]-j Crw%-I.a#нSR>1⽑dِŅ̫`-1dQ1{'3q_CfifX<255怠SfmW+ c9ĕ ҡzX:n$r; W.ϡ#o0Ţ#.qA]jm{0:wGyww`1@b+J'3 &fU?OP$>_ "Q,bLeD0.6T*zo^VPV+;Hٮt̏!;@_ ĜqXƫֵZ#qh~G5_ KdnT?2(2 HeExatؽ2? ϝv`@B=EEve_G |nԐ6ࣀYC֒Q.Ik{LW{ۭw5)+~s4-axE:"MWyįOzzڂ GeKšXMUEt*uXjk7~BF `w'I&V 1H޹gŤ_#j""hđ`kM>r,/6[ts7 5~]o*qVVr>>[!U QmE0[K/}Jk\dqIձ1nXR=ſ,S(eB' }䐡± 5\Eq\(E =s(MzQ\Eh%,{`жG5͙iuZT2~lTBAvXpm%~+!*Yf 4ڌU Vfg*t6EzfYT(D1wŪTkh+n1ϓ&WHCk8^Y`BX,#F ``ʞ ש,yW]tGbfɃ9`VܺFI$uy9$t|n(͙!Çk,axwow; S^ɨqJ@EV3.@\-X{b.H}P+.,|9ek _oJYpTu;<84k1}T>+)O'^%q,60Vw圶Z/aAM8g3xדlpeMOoNXأ(ϘREQ1RYC AW*g hrGa xqVY;7PS_Av9< l8 /S\@*`(hꫩ}e͆3,r\\Ά Dw{jO=%⪭X@9:4}>;Lt[T?FnL򸅸v[D56zhK 2ANJo;;bl_ڛvK`Bn41|'i%e5duhx7"j0x,`=c`k4{%jX(גٳm VDeb,eUch13hP8/;g :+ӱLԡ1+/=*Q%gcxu 2S\ sâ_ƨ wYdwoo8`>ms(/6/۬PRG>r#07 Nb4x>+4 !X`0kׄa"BRzVZV?&3k5XY0{>UtkE c[>BqNy&BCv)dHh a1%ydN |sb)\@Wi>\v kVESɁpz':O_13qtĒf ϗeN[m2|6*Յmis䧥s㊨-U2'M,24j[i 1AgS ;G>ir&S17pé_?bԟJlVdU+g”X\40'&#),Fx"Ab,3Af* Yj#['kbÓyjvBRt  d亪[}K B!Q;&X J ]?*(z5E`#~hq{*3K8[",/Vݒhٍ7)}͍i*a,\xWY'nFIl2m]7;,8&W$^\z{-f"b8)d)n GY~E]:=Ga*K4-y] ƬRH' Rwlwx74{O|cbcpUp3{K¢~5kˣ9$U:&i {x ph0R3~Kh"jbE&vd!Z₅^W¯ЏM`٧&%ࠂ%XHr$YOcv7#Kd7Mw@DbJUz>g|SկCwD8mB7s gspt 1 f%ӟKnK QgZ`”@+k&a <1RMI Cvx-`ac.%Zg|;m[Cn􆻰?:s./xӧgq'е{;P5"ǚV~5L ~H7 7F3kMQ4_$Z fu^7Dg2 tVQ,rC{>m756~DSɘQR3WJw9%qGW"|+ބ U)h2O@(ox?^T%N׭~%J, Nm.Ƣ逤qBlhqL8^ć0"V͜,唬 yt}`[z iA>bXKD\Ԕu^tU*#Qs:̭ BnI%-iȣGJ[*5< m)Mļ-CFN |OA 1Z-`1Z`ĀQ+)S 2@jnT6DS#,G=;xԸ8["5 aTجnw{N f_N*p3a.V)ZAsA=ܫVLh6ZyS,QGq nJ>ZnbuҔRMa&V?~1 ::]-'R&ļ\Rxv+EA*S։%C޺gdIpRk3TNJ(eK+ttsAg `BE'g4+N]Ȩm*5%i|fÉ{GbƏΖ"7j'2yVφ(!HXTxDFlHn:!*D~ & Ҡm៤/( 춠,`nsxm!Cmaξ!LxnVP--,@Q>"\)aJI(玃|hg=P\S$_d9x+n?|D?=+9/LءE׿/Yva oKb ,tn?BH٘n~{`~E\K? 0Qӏ7:qj WJ @W`!4xNG*˰䝻 5?8?]q@Lí|}>$ʲ*8A]+%JeNDH_rr:CF,7gCM.y?jEEcAK8Y&E ?Ȟ0+?WIn5%xϮRO `|*NbD>? Yۀ_|+@G0n+7k4DyS#tR+Fz۩bw[ d]=ssAō`ztb#H$<ʘHbi=~ [SUXx y>Y Z+}#d ֈP˜vW#u^aԇ巚yi2 (V9lK$XUwVl1\AsYn%_5wݹz}Wv?s_qm#6n|"KEIHhHYݰ0<@8uZ*m1`omAk8C]->?6Ug1!QhDX`4&b irʼnxF1pyϾ ``k?pid~ |QpX>5XeOV*%(ۍ+rsG" fT Vb +c]ylDP(onD3!qM؜]iXVPu@ՂT`ǀw0OApȁ1M7O/.So!.BNL j"Vqqd{h'(s0Kn;U*5KFQI唹y P0'[DG󕖜%d3Qlp;ƌF^@sA_!`9_ 4}ZzE 9ǭ9IvT)$b}<`35vҮ ջ3 z׃Yt;`)]~aKYoB8@.wQq㱒 3p᪓>]O]IY뒊#Z38s1"z׻>|GoD D,*LR|ef.m$6!à PDdxNtPG(lcByJc?-ǟ#c$MEfOE ]-<7☞s&R53n%ӿXB֪NGh79޺Pn(Ss7.T&+y>GTh9m1bFU8/yQ:BNNA~&Đ[o~Ze2O~?1 XUz|+Swn +=?h*3JWc2^,ih`:<< }+UMYaZԳQpʗU-2(BH@#Bxnm,h)aTy_Cթ6Q  hYIf?\{C~ PPƉҥ. CICeI_NF˦uq*ǔRfAή8؝0mGl,gRK E!Gq:a2q&XK;9T!f,c;dJjpsL C-P}i5oά}㜴 FRgr.o?.PKE$К<^V{l{,4HX$qaZ@f l"[ , =c'[C]$gEIO ͥWmlAc9N/2sd{D{xъ/ c\1L57̎pA5]S h${O9J 5XLWzD8=3$b0|vYp8d"nL-SΌ6ZHYSk@NOFrX*I`G+\x1 S…`j\.)yI }课X`UG|65֍_<.4"UPg]Xq5sخd/'&t+VoWg"HI-x@ U[T}oyI:QyIqGM<~ X ")XXû78giŎԍZss0wlV (P\+ө:Jhe+A9$`,y&t<,C?.hRu.N_70L$kgc7珦rhbl.걗DUD)XlDi^Pb@T%JB:,G1kXR USLT(WXyumx/OYjAK,K34f$ h.S`AsrίSU%fuZ} kkG_-C| 0;UKTDQo<)g2gՐX{؎ lgw+eSA٭j5 tf,T\_ ,lI&Fګ$UБoc[@YYCԜȇXɪre +W$$bNMT,yNdš:b0p #2"Y9'/G.PQKrۻ4t8%WpZph̪wຨ:DAvlSy/ $iv!pϱITgsvpyJB*~&('&KXaE%*!(`qW|Pw%ԠIi@=M5n8dH`Cs$6 -g%ҳ8w][k@4?|EbI#aLӅnq',9B*ז`\ȏTJljDŽl-S}8YZ4 +uo]JaYzR) *!FY!Vysuibmj2I(ħ]/6O;UvP(䠐;pzjZŲBI?F6Ea @'AX9<8I"aW]|XlzgX=a%1WTwRVsY;H݈zh!Jݞ3 }dDX id%L3tPʜ nP(~ Jax^5²m f:WyhSNqaUKo$+}~PW4o.;8`U_Ќl0!4l36t >Fӆ,I-%[a3ˆ+_f#K Z}e^X\T}U ES=G_S0sA:b|h+urPo 'E@fĨ%6I}kW~ּm.{gRёmic-! _PetZ7݈YSq4"MNtn*0k}zA*h5*NDɛD693#8O-||.tG14 v=FW7JJ$qvRwnj1]kiiFFwuB%[d5v>/w1gW|,YJtPviK "u-$x)Iܴ@W!]W'UK)#=M72E#&"]Dbgqe;oFߋŔ^m={P[BcG ],e6e91[=sOy?A4.UR Bt;BE\`W;\7b},jJ1&o"#}OּUWf zf8S'VtEmJcŒzdRC>.{\1X&we^v]ФW,P|d01ik6H;ܯN$JllH8Y/""8[j{ p[r  aSKs {e@I?/G /Jpo@gP$-W)b:TV/E oߕR{ q`AH)U+X¦X}e1 9h3D,BGze6H)R5X uR!bY-C-f&U0w/xѸXIJ.B\]|IDvkuLBt_=x +%鐿21!~ydD)6^:lRܚYK^hK"<+勌ݵng)lPFA32%,1T ϼN7gnRYgNY:+!o 灕tOA@D ÊHg[}#kt դ/5"prM`n?Fn"s: 58*!+NsSrag?j eebY fxVj B8.dx^7s;\v 1 HrGU\WܠՄSÙ+QX\[֢Wn]nC$(dƬ,o5rJh0 ]7!2u@VVRVT ^GҘmQ}񜴱}o̘&mJ8"TB(fS&5`JhҢ jnR*G]~ݺ2`AYR4,h$#¶1FrV>"9hV^8TbFr;cti |?`[5׸N&ua T!(Z~eJ9XtxA:㐃%2_.G FHk)G#ƒ1QFu\BÉ`JbdwƎ5kg^`~4#NtE8unOU+,[c"Ls@ΐJԆ|TuVtsK6>da{~"gџS ( * s>|FNKzCP5 0>sK1ao|fP C:XDҬ*zmynn#{jfEjM X,Ī2 YK_')kHCYvc@neBWsΘ>V-:kjʇe}Sİ4sUCssì^:GUF`=oƇ?Mgm+~{П,Ȱ#BeYb(c2>6lE#5ۦnG=FTU=4}]g)qM2@+(g fpkDŕbDCr!chx'iޡGdFh&.O/CKѺjLYpi?볞9 N,XR8cM|Y, Ū[tܒXII4^Hw@y+k;$yMţSyqJGaqk+*p`鄞-wrXFҒ,L _.\y^p-p!æo'N}O {;!.^;WcwGODo.lU'4f#pE`X?D&h 7&[>\'=ٟ5S4_oG2qw:z>!WA/UBQwUE(ZeAcR'h1mԫ2]=pdI%Z&'e),YgWXf.<č7[><~bJ岜.Tf2lCR܊s_-H=TX_xV` GU h-rmFtԗ+q}57\oSOUo>/mL,T5(XcƝER VĔ|PbK]֭;W~&+HOyecAYYk mvNZ_9G܂M!?OzxB^"hPf-\怃8M tYf3 lFofo2JmtY"ɪ:<އpGDx:•sR<|+x˴f,s|W:RF # Ȍ y߾i|6VJ vm:xzF}bp=z^s tF7Ux6fcL.[D\3 G(:]4{HN\ޢL&'G(2YԪ@膨m⠥= `mibZ{"PḈ aE2Xxµ$5VṷqâʞR{J/Vm.b̺ .g;!F~hj]l7jEm[~%.j[qu괵rWeU֠eX jUdm&{ p*5$*%9(`Vkz]r[&y4`݃> bf(a/TRfa(]0:! q&A1h{OSֹu: `yww/QzPX3+NNQϘ-#Wb,rk3LՍ` "}Ҽz,hDjxyK_~PuqBJZcH9N?a*V撬MtbѣZޘSlwWM*ecd SxD`. 0ӱQBUdIzbK ryb8@T`WR2VA&F8 LŒ.Bs,d;/`8#BoRwPN40N͹-^xƉiXGxGZ`~b2l+8em0`VzhtMҶl5aBX"f !;듸8sw/eM-X{іCI6+t +O\y$ iVʕO1xZ}eve RHc)2N𧦝mOZ5ؿo}K_'_>[15XT)¸ @5BF{dhcUhǶyVo['0 dQM-]՝ObV [ )_Vlhܱ &*+X[YW~DHGAuVqfB7tꢰrUcwHǍivܕXa=WYpg4S1_՗`L0&{8=<-O$//5/ENG\ oNG)4: >9-G0]᤹X z7ͳk%*DF7BY\|f72S&6,vc2Cc9XG̭UJm1ؽjx@x[Sq /&:Xu›Cζ _^Em=|OF,f&!D +y$W&㌵9c& `kiudc㏘ z~\4r FQ>6`H@EWnW.qEGg;\_?K o?/{,Y羈](ہ  UW=}DWU8%\TD*Z0RX0H\hƯ!?@]>7Rٍ HEN~^,vI&,q+wNF59޴cX 0"LÇ~b;2$:"zK~tw1,`8)X1mh~2cm<(G)dM H!V$xWhI}_$,UK!؁@r!gF95:!Ҵe84s!0pYfpsά<+\rU&vtXpL!L*04R/_Nӿ}A.klO:ڱBL >W_+$bVӈ$UU\1D -kԗR0),cH$S*TZ0oyrZpCgPh\8<9/tXEj`aѪo |Zt ۥ]BP}iz?ʹ }0d5X >Y1K)>s3&Q@|v-u޷R^4)[5+jvb]pu 5 Jqq`<эʉk*;W'H!ؽїJ/R:Sվ E\U򗨼US,; ǂa0:63XtzV&~1ASvFͷ`}?g?c,`=7`ca#܏uL <}ck+?OV,,u #~dKO3RNj4raE]C}Yc_`eUX > ߥH,"Z睹`z'oXFdX*56ZBZteF^0OaӶ}iFK# ͼ3A![iHeжl0S;?25"xԴh%We(M{#Yz@{)!{S|"ptt :?}!q,F_eM~uZ@":Mm!y @0,b X3\KگnUS(^(ͧF9,šT nmTn!XvI Z5ޞ1r>2]YY*s%XjKق!/ۑaGiT5XUEImM~Pjy P  ,#fA/G`sޟFk_lSװ.S [^QٚB (BDuJ*x3LSoDxM'^Ӟ zrRn;bA">apT<9%g:4"D[V"!4جuZLV X5]D4 V)ausFl(e|PmW*'pyfx';VN|DZ&cQɋBlBy+t:Nb!'F搐^h:ŐrbXf*>8He@W RuĿ}T53A&i_VEu{mmi|":1he,sPG77 Q>h4ZX SƿppA73Fbl@P[k<S;K8gsT|=gV󩜉vpH5, B}o$> ׿=4*р ^KvHgb)HrH+x-øХ.ylЁ6̪X|p^#MVq)cQ_*Ux.!ea Y`y?*j܁at|; w܅ne  =PݾUԱA"烁0_I֮%2]@֒vMij{KҾ1: 5SRtꏈq vb;1UnfeWG3b7g6B"XnO}3HoGܨr2-˳kB6R!Vx37Y[ٕ>G3R7R4D|n\ࡧ`Mlp5׈;+-IՎPAY% _w^;4T = +StqׅrTX$TqE5?>4f4zPd"\55ӫ]k̿U_x+6'lHHAe@Z;?* KT7D\51͆C;ZqX7MbQ1Z*MocV|eIo<ƼشS s |p#G7քp`0ֵw̦wj}vb")'YxrwdꙮBFpB5` 6(K̊")(R#ږd YQOm]5}%:2{[礊Y:T3ќ)GS++(LS*bdbQjLg0&-bk(tr'd,I"wJa#TGh5_V*}ƴZycIPgj"kV1)wy>Weru3F[_>sgB~޸;5|v^f|}"wDX#wX .BKpn"*eqUɶ5#X41IPncZ(-@ d\4*ߒiJ(%aV*:Z˫Q(***O !c .xc ۰4nJuRU65<[cDuUz9PwƩH- >#B$Lg0dR=]3t#eT9lVI*Pouf ߌ?mjnC%h $~(ڔ>85IYXŔF56fdz/x2M|#BlWhvTUYjN a>YB/DKcG;VuvnܚԎ0;U1K5sKgwEzx麵hOBGqa»唧XUc5F)H': GᗀJ j5e_%g=oW7QOjXzvb1kEй.*3Xf"hY(yE8J^[>plt ĂW.sChVL TwZџ&qn;*6xE1L%#R1}:O#r`FJFH''#UuNl$3KM[ToEEt+;WbN6E\k%0s3mazY:P[/YI'20X|wYr  W:l0N5. Z+nuli)ѓ%GInR+%ĎqB@FA[+2(3XcIZٝ;@{nrBpMX^i`|]c;JAp7'q_LILf],\G!_vFWPB^a5hKĿq_oX;$:&5!ݽSBji(USzM`rl6J5.,- ?H6)C^з^nu':[}T[ >oGo]H9*,fY^^)i\ME-(H>3VNz+eQjȼvA'X\`^Jsc&&UB4~qpXٲ$Z}UWA xCX/B>ERfZ_̩sM([z/MρBwh sV` IXU`])h`xog5K]ߗ;JNYw;"w`!՟nOmdJ6N)}ṴfsKlUrV+1ctikUNfC2~au9*NCևt+В!j*K_aR BuqҪfX.!i8kD$ 9t2T|iLh5pK+U8 ,zzM0x#BqM­ h)aT#k\c3$~񳞞x.|oA'=E?MHSJ"!PWI[IFZ8>Y=B](Z`e>?tmX×պ`Et³-F)Cސ46OA ۴-H혷:0\\* zK{9CqVy[ZmZiUJwnH#a|GӀ!r`0WEsB8S7_} e$8"Tr~UMCNv\ˡ>%i9:AX@ 16*I=WcnHht}24WNZem{H堨uuKǀj\`Yq=lk5( w+`4d6m2ZZG' )Bt2* cZg-w.e*Y}:ĝ>qh ~= EjK;~*mV)7^0I;+aIKf nhy%0t@mɡn=Nӎleȵ$ rDV;+#%xUصfoP"uTCw/~wQ- Uzǁsۡ&@,kHjkF2Թk:AF^ ]#FJVYY&y70-5(+K.Cي8Cv5h$>c\$rGm0V\Ņ0eΓy` Z Ēr#?,\E'R5-`1-P0ӹkI!T돍[VT!K;f=& >dײ_R8iQMu-/Oo¯b)NںtI2[ [{>(Dtyz^k(x,y UΦuvk2.).Xn.kU B`$NJf^*W 6$=ńC|BLH,d!rO9:? yhO9'v[AWp̥BNK\圎j]+7:rNع1j{Nw'V~c]{80A;R<:1&'S cr t%#:B$u8, ԴBn65}HGsSqa,:L::rek%5Ucd⬐`|,)١fj`/*cLy*t`#ᴴ wN+ŮCF|>)-9NCWpSr\1+1:Ȧ:noTVɰכG_Ӱ' !_ ;#Z7Đ$T:*|CJQ;`[!`R:JgN_^3q#n7F:,KpЈ֜s(̇$R5^@du7fHuHݪM9f[Si sV?j%Ilbz U*̩4J3Xz72>?QՖf8h&nmHI컗$ Nji=2#CE3aYIK~aZ5kKCv˶j?;W]Z!nz~|Z=6e&UJ #odv.=k9@  }3amVHQYP'Ю1Ukm|\5D`gXP&B㎟lNt|?!}NݜqDH/@v< Lj4JwGv:졫vdh!y W]G}~Oϡ-aXLsFXЙ*8Dt{,rUF'i:|qJ8M;P^5^#p}L,h0$r6+FB4c}kױWCnS@F5# yhxpkA0a;Dq{TU%$!@[H3K~ 5qئVQy(D,YnaGqG7<#cAn7L1vx1&7E.¶.1cMV;8mQ+'s;,PprkB`6xq?"TuyN eHWِ)}4e,+h9X4q4KDd vvg>'_CwwW}/m-|V'j-!+!*q0fmSࣃ~X G!j;ߍTwC>"HZĕֲort[BɥR`Bn1ߠmJZ-Ͳ5&?gcxF:I3,/60VL+0aЭg'R8/C{;=hpדUYYi)]9zm>vw b;k>.v%ƪN\Y'oWՕ+BTϧVS:fCpE #,h7k,=$wdn$ i7T Gdp̭׸@P%ń_v|,ZL$,U: "]ՕPzA2T `Et|Wp06|+`y)iwHl%njK_OEFɩ5ǔ\!td r֜7Q)aS{gTNW Qm=k0ic44dB.(θm+ y=~VodjO5˧I!ZBR U%mޛAc$d3d,f{lBľI׎644c}Wڰi X~%F*`<詬ty"rԵ(buź44ni㻴 N hP-,*mGb !,-l|vjz(TX#1:0;g~Ppd+q%{G+u?)<;7/,X`5^W0XX_}Iq w~? CWfISH%*ۃQ12a;˺q9<7VN+j 8$b`8}1_cL <^BԹp਒s=.*\<'`ҫAnՈJjEpy]4{>>w\.mp j?y'tbX-ban6Os@]KoEm r'v҉Iŗom)V̡yPS:'P*KzRj y,W6Vggߝ% حMשf`*geL(1IxBڅb679rF"[3&}%/k qؗm0ǚ^iZLM-)l>}\X0㑻 7?OҸj5٬TJ3XSn4e n\h&(? te[d[:5Ws kA(RCN\f,j * w+gS%C4C.\wq}U9`yJ v cYF~$RCmA-m(,9%OZlsDA۠U˪rw(j/J9`qx`]SpuFgg5BnnPBAόC%L%l!rXC8wI\ܬ'Du*3r)>/T{\R ?;04RBh%Z!H÷ŐUI_#PAiCc5x- )7d v( pPYQ%xhztX>1<1Xx|fbM ,fF jXS"' .U -5?֯Z &N.*R;!rhyuiZ, laD~f,A]{z$ޙ8L4,Yyn>a0XL2l?14YzEhd+l=4n=kWyq+J0ʬ4Xm~.dDhs^{ =  Ab%۰ЋwW:,*rv+xCk(PMFc5~^ 2;URLQ@I݃~hz˯;X ʠd7%9XtIo"gnA;lV|ú0dיAQ KoCtlz 9bP.Ź$g4jܬ2$8.tnE3wN,_E mX~H"eKٹ"޽+[Ϝ6 gw95)޼2 z$Vi/1+ ^ZQD\_Fca+ߒ\:hœ݇`'`dޟyW k$&<5dXNk&,k"*wU -,jl&wml[R`D&~f mЕ7%<!KӞ zrRn;*">*vy'.v}*vK`0"FLl>Ҵ{ [N 5Ȃj$ " jyO(PGuƯ-Y`:s@ ɯN-˩-b+)|ʾԇ5 Q#qusS;NUee]S2XuX̮h^eiMܒt*JXӏ W, .Az g4V(0 p^ I_`!DCzݝ:/C#am[~~neRY IΩT}T ((E} $ 2 "n~]K! Vu{SZgպus3?3?aTcV ^F]:56$%Ē? ܖdנ{S#NB0Vгo Bɯ `rQnB홪DY<W7A3}5X3ӻF9{H1x"&2I2k~9ՄxFdM=9+"q cԮ3GIc5붮08Ri&n3PRgtҲPмˉ(ǭQ^f\,M+<;eF-KrѕBZ:Q'=J`yR~(\b+ @vU0i͔Ў>.Kv,K`|~O[ܹ%û_Upo09QPqeX`~l9'i(7XkcU"70vuP=ٝYaO_] OyjY#BPVބǷ#8=Pf*U;VnΡ#B{ RɠjJ晱1;iEMB{42"blō~c؟;ɷSiNbVb=(w]M_M*6#3 ȒSs-٬BوԬ@s {JHUϭ9eM1, T*|w2q:)AĈ=<XxRP -Ť9V6Rk!rW_ U9P&ӦY䎏W{ ^cmVvuy\cƘ.k<&CUT:#,;ZG6+|!)ɳA=i#w hB]N^`p>UItRhշ.GuQ/w~ YpO}Յ-g".xsWqR﷜vLRw|j9N)\jn(-,ǚ%tJv=37%`; "S/ȬLi5qrj6., gCksFQa4d CWy"XE[)jQPCS[47%olپvJ7Ne2`|씐 Cku:2J9rjw?]6lgO*9cQĶN d(25B{\ȼKрEU52H,!=3#O|sƷ0""#lH Y íÞ@\(߇*WǔVCMKL#+,8;Zf=5@Zg: \t! ھk%`,X;u.9;>!6 $w`X!_Ԕ,(k~;4XdD(V"LREZ.XmS]ûbh")q*g 2龔(|МvX+zU`k!7Fu 30@pYٙC۲K.QJ^.TX|p$(r(slz؉ܿo_ "Ɍu5"ƕg.TĎΤo3 /R%UrމT ؒEaa̩hpUhg +"R`w"1 #h;ȝt\v٤IS{, ZG@b}[ KɝU` "w,2R "-#Lz=+R-wO `M̭Ѻ+!Q*mWGM<[ϛiX8o8#lҧ NU1 c `VPup %iXT侓XњgQ^hf+]`|>I9\)#}`S*C9XLm0%%"qg*d'._Bh{X=N| VX4K<ciq8r!#ƢVJ`c3)D;%WW(ʒ['g\7w>Y_?I8BZ$_oѺ[C.}%9qbqAWXfTVeمʔ8@OҪ^oŽΧ={{o RA-a]Y)K+ O!iN@u,X+=JHg8]벿zo3XBlY|጗yCmiYjHVT4wQXA5dH(^Ҡp3̓Ry { `, C8cMӍľtn,BFB3%440U JEQ|:q;Ptx4ShZZP٧Bկ:tS^z=r RX6%1"\J Xֿ5"p}eQi#9*Ic/i&5rLXzXPHi`:)9ުZwy]xBVcFfg*eʇ{"|Օ"_wbj=MbI*,`js7bKf'¢]K>΁hNkSfPH6^o}$)<Q^'w*)ʾ; ˆ77\z;+`)@+L Èτg窪| YUK%fOBZ DU_ZX$ ɌWFXC`uՅ5eC*Oi_+nl3m'kŠ4n vtsZˬlPԝO p+ɽ<ґVT|ݠW w52aY,-Qt]5 UzB]rZIU[H;|!zft؇ƃM'S\eSg vXE!{}rx*}X\IɆ|PMER՟X܈JQ:ׂX_x^wf)8=7%Dxzrb"oP){^Idh {99xRG3Djq ,A@BF띟~?bnتݨ0LKi[5+Lѡن Ջ5SnlRq&I)םԄ܊`]IR-s 誢K[.x MNL,O07JWQ)72B5˨l>!kޢ=ؽf͊0ƻsVI+" |!%,}!ʙ}%SycQ^7gX\KqTKK^ L}OLqo (aLGm'UGT#D6EӔ .6b 4XY_ sP6OBmmN׺SyAw8!7¸tkV5"o1!G|diJK!kH9wsV$zYj!Q;֛WXyu; #oOE9L])&/~};6,q2F=`[[#-!jԤR_R?5CtPOdj{rERoRY͌mo븂tX95GNs ^rȹdɰgξѨҨr,X*p)Rp )YDN Ykb3,R;!RܪZ1.TuюgxR `tƅx*ôo_؛o*V fU6`ʻBobtZ8e&2XSFu rJc60kF6|9°u2A,Vn}BsdAg rϔ26ɰ{ j'18E-"Lяd4t$w#@kUmjV⯎ Vn.=;. AY2,q3ÄA/Ь`׽XK}EtM'RO`B64^.[KS2;>1&*44  d>Hw$K"%ouYʴPEr8I>XLSazgl#*P`c# \2a"$-|ivG_|A/D{rUTōb!rr m4 =&)k *ЊhsU'2 ЍEo涪 `PHLCƋ☛Ɉao Vs1ID2tMJG3[wo$YŚX:e7[16Gd ċc|JfWAE|SK*uIvB|nkQ WN7m Uz)E(҂V^Z&si %#16Vf^11w_Be`eIiLq%f괔 H Ygkx]U7yc({ň|77]ϩhC&//_Q#,b*I],Ɲqe=AuWʤٚ 1VkBkG% d>-4gvg]:r @W [ A 5_ZBGg"m%;+7`Qy{{tz% Ύ7s)gW8am=Ou`X9t3nZqtS *I,s"sQe!ₒ^uOΤ>.?(Z r_xT! g1{ F9gQߊkkN,xMl,ת/ 357 QJ(V^P#,& Z~Tv\CqB#H0@WK x Anx` ,|,a[`D6|݁,PWab1MrJϡ2wXI3c#VvQGRjK<Ğ kh$鮤Ic^IJ콎dzSggx OĆ@Q%tkLYE7S ߳%Ys單?YJ:5D^d=uԈp@Ve񳩵 .O01L`!_`-ՔP鸸/ V ,s+gJ[CV"} _k4X*0urGlvWK7sMJ!nUp:":J6_vuyV`׿ `IJ3sVFK/ ՄK_e>_]X}m3ΌN":f.ۅ^`t|I:F@b͘2' ooXC>躲pUTt1Ydr"#F~T9.̶BjCT\Tum,"lBKPAV{aZ{zk*.ICc{ qirVxtPzu*+;WC`C} z /Ͼ t͒|ՠ?*,XQţKb:HJL\vO1v<|2U.A=q2܇4xma/XPx.gn:C WS4%3(0zvByǻX86(86ՐX,#~|W0XPq&1cQ;Ȼ[#*Bjis[%mD`I^+W$7ak:ZCVq : k0XI9/;"ӱ'_HqZ̀FD v2MB&]3q:vEzϽQCOsvz:H5s@p`ˢp28lz kHB| +XJhBRDXC.+S }O?OVkC` cIx)G3T]'7bc{xLrX/b5+S?к!X]b%s^|`+iˆp~feWVpTQ1`Vs$24*Y4Xt,.FQ~x/r^nYh#++-TW\Ne8M^8Mmھ0Ȇ 1NH^n9\$TuTeie5XKQJؠ8SI % sQ\ tM8;4 < gx'im&5I&jExZϮ7ٝ(|.bqt6+ƲJAe.D_5rG}" zÿiUi®{E( $E TZ#˾DLgcdZؐDdnygHi6(>Oy54*<ƒ|0`MeՙNtgE)k >ԈpVCEf>o|V|ҵnN$YT{scwےa;_ YSY#Ct8+P&߈BW+OT"ۖ@(FVRvȫ4v`6l, [1Y%TM?ٞ Ʉ@a7,C Bw[v!F;x&BRycUU5pyڸ,$! P-C,3+aMJBn,2PWe*(")s&27z Qq` τdП C?"̴zs]6AQt:Xu珄ah7Q6cC߲MVq%T <Ƌ(1aXζXt.%ɘit2̐+(! "a ?FTEKk$eeKЊSur_#y;ᓊۤv)kDw3 Vpn`:VxMtE!z*Gc4ɍ&3xq #\$Ctmy`,sX}X]%E8{C P;\&2S© Z5 ⭍%ָ3[5^U5y"cp\%U+Pbyhτp+pTx |U@W #)?3υyXMxTSˆXd##_˝~VJJmTk|Fnxs"݇BfT;,Q#-*UTg]t%M1m 9w0+Ɏ0VJ񞔑Z5 ˚y=c0RsްEs.j)0)Jr3VS*fʛQֶ]qiΏ#L'^t_;.8 ۑrO~p_ugåWQ7*7{cA'Fݥf@X ZA90VL3.ވp2ڜݖ)8)!8Qp;[>P x`,eJbf"rG]zdJrxq4J#,,4>Χ?m$S;x*ߟîJ*Mʱ`TSQ/͋&IPYq1ьoL>SR'êTJx;}r3Y?2[ |44$8BwD7 ?uE7i 9[WhԼ=zS*c!cOUyD5K+#< '?bZXRYP [`!q!yxNKmɖVFӹ鉦s=KQEV鱳l#SW:Z(eyǙ7uIr[>o I{jvK`BFabxӬ\aBh8z8%GWAx} v{|C!9Ue6x:-жw&;׶৩$ )y)Jz{uf;z{x9pO} M$XQ"<f˛u۝xF`l`qB啗\+ġh]6`X3{2Qq < nG,6vDW` N.j2r63Z)22D*Ah pU+(XS]\ϷqtH;/`စd?"}Ԋ?6NǓsHZHi/Dbm6r0S/Ъl?d3x doggjBGQeq`ӟcC_W~TɁ*x֙+ab*J/x"tA8`aJɡ!pX\25Ӭ(aAfFָP>KR SU$6;~",nɗ7og9 ODW]>t4r\ML =ۃ,y}\$QG]EmgwRxm㺢61qJ:C9 L2=5d۰pw#^w590XW_}^uo~Çd'1`.n; 6^J !&z@ݦ>n0@22l*wԫUdpN^:椝 Ts7һ"j{& {Ǧ'@W`/K&~ΈR-穚ilՔ͹cwuw~lJ@D/Z%hlwyqlh 1 v}?"pp;o| 0% #B<*xK4Xf<7^sfFգ. }EBS1\I2`TK 3{юǥ~[v7m%"n#_@Y XIn<9rqr3Nj"cqg(Y̖)KU=/xda) K.Mj^&CEWZiF~$E, kV,nOo+өUgRr"lZ:/x׾knQr(]ax,lW5+j3iOkZء `1rD$SFgdj1uuS[EC>^i4ppֿd>2+>0 USVQd3LL ZC4X!K8#`KDa|7aؾҹ Ryg1DbVE}e3;@"w:N2Z\tLsWǺTc^A3@W:7@НQC~t }(+T$\V1 Hկ~v^"t <,.xĀ+Z[X[ƣ?O˚\\8N3R@jP;BUm=]%qp LѣӀ(ѝ +ǺxOBuwUs`]:q^e!Ԛрs ˡsGJ̘*i&N$r$SLs.*TR>Arnmd37Ms1#$|X^(#B߼ ^YR!5T7',5k: ݈VދtCH+?au&1M0nlN*51Ͱ#d|\ bH{kHIg]O'x;/jg܁8VCR}Ӭ`m½z }]UlBeeW!+wЦLHpoPY`=nacJ/k QQ~2Яuxnf&jҝQuϦ cO>7WH\q EM1'<2˰"{QXf6*蓼 oTa>FC*[6qfWQXIuۭw@kF a(֊R2M{ӊB`1:cMjt֎_u3V^6.³Y;~ũ΢bDqcyB {8VCbEWdi& Zz̐S-gE*.̢8EH6 &e:tXrz ׮)c/-rY޻NqBط;Ǝ#cc;m AZ_Kf7`߂ncq-y!ˬx1.M|QH]ݙgH :fg/<'  <֮vԼ1=kyCzRia,4Y٬Óu_}yno"}ꗶ#lyaۉ>?Yfe~uȈvãf6xQ>@.buU;1(uNoJ Yϳa!}ڶ6dL$ͺ.3Jl$<գEeZ=t Cʁ ]#)3%,Ѽ%2nN]4 )#?VSuAJKaK] .]/K+^:oB=Rg~800XX{竨)>hY-˥7=:l` ז yF ۊDqZbN:s+H %ͬ< Z ކd]@WK x PlAbL,IN;p.7ص}mʗ|u{븺Ub*r[H /Ҡ,'=#WpfGS4nfUZ/EV3Ոڑ), chaRtL%QJ>d[E421j⨆a̷%Â"k P\oc)F]KiI͙`k9B~ +1f`y\ԀakG8]u#lXlqfۀ 3ԧ^.v.B613Ce3 J6vlϧHգkWLN{Ayb^b2RV[5'J:My#nͳ+4\8}t:~1*Ki02{@\=Xf\nK׶USEaq!iĕdG>fzQoacsR"f"rG'FھO\e,* 3'H /^5-G%?k`trF1LJu0R=LH&c;aqfs:4u]CCeb v,<(beב; 0p!, ,Sڵ`c7`ADM"b7}:ۣlL$?Rڍ١|pZ*h8kHu{EpڱGSBwӕݻ&wy<|4TqQ4x}Y3-̕8 fYULG}=x>Q%x1N&֪95&;uM Om֧Rja1 =eX,x'NUЊ۩taukT]EroI)ۊk>f$L~s5pBڟX=}jt+Vbbv)en͢ $=5"N"nZLؠ(A$Z3COed.LKw4,:F @_!g,JQZ;,.x"xˡ(MM7 EÓIMY%N@Y) I.mT$AlDeVǬd:]|CbdNWh9U'p~feWVo}@TAFCVbf}屦)TfP?{`p> Q%DwCYR+E=œV,"4U4(֔VZ`-EnfMҖo~fIqf7WWҾ$@~was"h C|rÂVi铸VV{k1Uu|"|])[l6$6$,{ug:4e;SByFM2Wy=1\ \ F*Y0 Z`.) R#9U![UƼ|誶eg?ĕB{AwUՐ 2| B܃O0 X!Bv]}!5h<|=:T!?pł{߹.B$UXT54ဨj+ r,^;l7L0Ϲ(P\MiPh_ _=)֒vV߭:5Sɳ>@<@4I,61 ud7 k7ObIwasHGa^s\xd A[/Kotla "GpGԫL㙎2N*Qx~X*("20*hT?a/²Bc2#@Q!!_0 _X~.1X$4F'ͻewX?so@>1&4ceH1G|e&Z)4VA&{jtйB/'1Z`jN<[I":MtRyg]JSȀ1?H=C! y"AI" cvOVm<GBW `™,%S gtW n?\sT-r+*ffx*]Wi[j7r3T_M `tdRO{oEhn v4п܃7Xa]%MeH6It#'EKN[:m_Z"% $ü#t<; 3>A A.};)VŢjVR5`5s+ k~pD8X% >}4va7v5+>#dE23*E gO)n^l|!.)MX},, ^sk.g( U9pPA|VZqy΂WI`[qԴl_8*CtJ2`UҬr [ݵ9]{5ml.&Og"pW U =|\#,Rn>0XڮeX$O>z'oc?ޢsqVA?z hەAPU3 y>Zyk9_opSfy+5j_1) nrtF00Ky rIyoTzХ+x+;狛ə1xh`('2XXpք0o-A"0m6P.,dNUs*ay2,0`2nW0p y_؛;G+sc N]È+X8BCNc,Gi#4vLze//+_ycxF4_VbXkpv;cڛMw3N}vbF^ 3Ƒ OjVԕ0PޔtXjg$IVT$_tTgMz+I`E `mvШ:L'a}CQ3 %ҫ0#oϣ+aוIG,~e тzC~ Uz30=?iߑ-7 ߎԱj}>y*M39Zc-v2rN?(<;שPcҸ<lCN jcKCTn *0X3!+Fc#/+e7#cA.0K&/Kw|?vۇ/PA { wDduvMt,i) NpЈlPq RRY*seo%KX ]E ߝDBC/DWt>g\x#7Uzv2"ߝk2uc*uxu DZMs{c5/Xt9RۻLEZbvHC.hXTXT$VX`QtwfJHb9%{lܧY3Gk+^;8aCñ B7,iS56Sq0+ ~6gtWpoE{h&J*RՓ3 D+jøCˡdU}л *GQ:D(SYJw+U C>:nΣkJ[zlT iy▚ZOW*Ehq#I[0hHB%H@{+ ]1Wƻnɠ+.S[|EPt] fFXiԈG\ gN+"n0;ei^W 0kwc|;+,QXR= Cw aqa! V7|6 Ao`IП`N;U72=vk70d4&O.wzY6!| p'8{Վz[qU9)ݐMy:Մqwa4k4#~w&ρ} +ygb,5"q:SV3QVss,9,BG }Em@X8ͳʜߧtYS0ICe$9edgꯡ="ŌwQ`'}ݭnPL'247#b[Ϥ<8PXNK?Jֱgh-7۪bS~\X7f@>,Bb)^jwb<,.(m[[:V46BBMxtEsg+ a%*H.U:hj ~Uy(  `?T51O>1wi|bؒ4\wCʁj, U{O-H^_L,U>A[GY|uꖤħiӒ8*7əܭ`3fIWroʝʵ! )}o<守+UVwU>ӊunT7QD4GфUϕX%#ψ 4wZt+<-΅$ڝu, ab:Aej[ u:[yOD#iJbA7c)J`ʰSdcL&fq. \ Oyej\B&-u]aJ7`J^ds  ݔw.wC='pȒt#4gaLrlw:)j7$ / lfHX*Lh` :}25Q[q a]Y1! =o4. `M*!WhH[qc*it=FfPn@@W :CVT.?!D gʲNCza)u<"!?(Id&(#E<,oXP\~W J=YODfƜD4ӎ|xOF>]s8Wv:`L X].RГr oI|k?"\-6uSSAvO ?ӿ_}Ϳ$wqtMd!gRKjהU:1NXˋ}%R.qkf\KZͯ@\^XrPX#I"9&'$UDaJpp"x=qv@jNSqWr 5/vɭ )U7\8\(+A+)RQ"+L Wd({F|',e$>X.~_'a]i:W<5bbpngJhLj`g&xD' XZΧoSg=B0Vгo Bx `A2Ѩ,і3A/!0p`&Za e."ڕIU/Kb( \9ғi/_N9WY*cU&D 5*BV6CUfp4 2;NKIhf\"-bcyGfv˭V:œʏ>u3?eȭF}!aU3\~Z[K?ħ |i*] U9x]jvML_x:e+;gx ;q*u&;QWB~M~Weڬ Ib'\۠jG(Fu o}7\+rp6FH;St!]e;>۟Ghn|`,n yH6O`j%D}93)}Z7=9!d_-槐4f0;u^qk)55<~!˦b߫kwE+{9*>T8.VhpEJ?%iTwU1gm]P}ВDu2+Iӹ?i#݂ 4U@Wy̮?'/0XpfxR{AF礋0 ?}=??kG^휃Vn%AU#)ky{^7tJN:jw@.h1YQjui֣[ TY&L$lQΰ"]ɈFxdHd!Hc2$VGYy:&qzD8<³o [6h b'jˡC7s=Zq M-̩ʌ+KXBgC(|H,}_%$,4X}K~˚ܯlFlIDqRX|SM:()u8pٵ0mZ1V.iHYWy |r*]z( VSnT[— ri؋~M]7Vmx{R *SK ZS;ĚW[%5ml\%gN7Fݱ4r15*!+PQH5ၩvô\J#b+v϶L X#A  `#lCXVGR gu*2x>-Y^Jg3 )g2+eSS@CQ[ՖXGIw<ԣ#鑝902~"$ӨNGӚ eɑZ>@?R0'rgjvR`kH2&EȷҼs&Q<MIʧkz^'!!X!K9]5sV,iо`1"$7C$htgc{0s\ a׽H3ċC46|qg&ǽj9\gcm^! ^ɾXs?,g=hKW"NZ]2*Kqd:h+ѱ<ԄܯQ'eie&3AgYzX,0Dc ApBTqvfSBajЕ`&w~ !(O}p0Ԛ.:1gMtd A2egpOLѭ]kئᩋKNMCQ`;:nGWm&,w'cztTKϦi,!ɊjXnۜ}dtWx5”ذ9c2,xU+7wUpI2Yft!cTx 0lqJ9o)3tV1rq^F9+ pvHI J2XT>Oۄ0+ '݋G| r5k.`oFz7)RTrGx&$f"g7} ׿;}֎ ,,('FV"b0$o f[ۗZ)Fb8=.?Wv^'J1=_$IOv\[;X">GŁ:\d:h31,S-,+~l-4Njiul5$V˳92ٶzsqRj]$z0XPܫ\p]eAM㟻B4X[ u<HF=4,T:Ĺxb2.:5mڨTI2XxƱaRC妲zYXйX7Ig!TehwA\KZ4 #B<rxwv|>aJ%3+e,\E]]squ`}UgP7rIa{%uIŢ\?*Fd 'c:_YR]fYg,'sG [u͔ O$BRs#.k & 5w(;*;ΜP.W+@b`qᚊu*&P|[+!n dgΜiNOs$*Z)!ye"˙intom _nlB8?X0F}O*)@mЙo/=;^kإz諄f1"迠zo#A\$a;_D;Hz?zj&ʞy7NV7«`}2,+E%Ԗ&oݘbtz#;/ d4Rmfq}[u´!ź?XRN'9Bk`N}#wF)[DtE-pіBkSc(bW;%LfCYK* }(֚j&de4Rlpzǧ\^Hrg`A˅EkF9X\2%И ց:&3GᠾΨ]A [V% 㶘囯QݖG +W(Eh WxS7pӇQ<(>v$?wV)b}S̠p$+ `aDFbX <`LZ6 .Sr1pQ3x>3CҠ}n\)UrFDٚJtTz5t`!LԨ}p,Ɖ&3ȅBT;yeGW'[a'1.9 s"kh\Kz-{7,s!&'/ɮ: P *`殇-)1Yfcޯ,dh;㬰XZ5ueeZIo)*f2/4=qs[ UD&HBA\U8#b6LtU'(+{mj'z)aSIh UYY8+4\8}S 5-`3Xj~80py)ĎKF,i)T8eW(o3ջ>ex~-{L=9n\N+?0v 9$  *UuN-`opP̦g9 ey$&w-11DWn|54SĎ$n |'x1v([ٖ.yK.f4@/|ꏠT=eq;P6n7kO zU7 ; 7Ι0"#he9 ~ KݫLǐyZ" ]/hl:ǪbЖ9^.mEbǾ]7k:"]ȮG>`F(0݃0+h.`-do0NE:/,uhd "wdv`5gѯ:Y _P=v 7-yxW/7e17jv$Ͼ[I6KR*|5+!EݎNmqE^EX,Tw Oi_O۵;qDӪb .Xl ? 4+ w&`lsr!@))ulx+39)I$H%I6sk{M@Z[;`q6TbTj2t#T_9*鵏is6&uӇ(ĈBPS Eu #!!^Z-Q1`V 9X$t"QsD~8cEIւb, &+9 \'j9X*+mq3snK=Ф+kb\t|0tURtu:[Pf=2JfwZ\]ƕ5LTe5e8OvZ'+Z8E'#Txx~QX_Nk3  ]m[sO5/P%,mպ=j2S"6k.W]y-"7( 4XpP`1wc9!K]_&0*+-Fɇ8MG-YU?=gs엥q39MMpCYś>;aK|a8\( y ]=,<0Wd;a{BpXw[?ȍ@_ e/ecRvܨy[_,2|B֘ΫiGT$&[eU3+_q@WǷU%MT&AeNn9+̔?l1g',7aSY-x g g V]Y&ifҶKV,)&`ec7(- 2xm֔N$+İ\a+%͈H_5;4Yko`+l ٳ1:T;ͭH2ƺ8t]pP׆w()saM[)r׋Pbps@LԆ}~,V#6.J3\Wј)EH]Ln]`G23ǖ ۋTaL3IKx{z7FXDOI.J%Wc a,/=Oÿ%I1 uTߟT!E=sQ8k,*Yaלg(ޅ?%)a'\_T5dF*4ʒl S|P8^+HPyo d9tǐ]`aA:]MNX?qomU^KԇsJW䞽B߃ - DЅ$(҉ؠzUOQJ}{Ͻsε18sZk :g$SV]^[y:}cv94S4+8# 3 n"my7tuX犠h$x%hޡx#~v {IH2fk}*bQuTϾgNo-# 1 X7\+ O=Axpq/30VEB-ɡ .Xvu% !+ϵX0} 5:8iUP fProx_VI# c%,.g3N I$4T;&Q scU$V+YM}7%˴5JrB?:~3(IiQheG%Wt¶ ` .~ f ^#10d?[,2ZÅ{-Ht ӸI (+2v\W+z"2SLdٽX.:#%i:_`aD*@+H݃ CP|=Cnnt<^ޅS']I oԯ\CT6XUCH\Ѩ7+)'25Rk2g~zpYOP&AroRyJjjDNnPClՋLLsѝiKG=,vF6id\nm]%͊u*ƓyeU+w&Qf0eS(Eh,Cg P]3cAH噢R츈 \  V^_5e"\>%Wi#! IJŵ`ƤږSirxlU/ !18ڴci^H'9f o eGDxo2TW9!+~)&ʊutR5?M^p܎kW#qվ`JJF+]gvͬuDW)(69UW:>y!I:}U'+I,AR~+"0{Jg;#-f? E= 54*%9x/`V Y*pT}(cإ(i7jt0QTڊܹS>ڪUqi5*PRF3n1پkhZy)]L+>I$ѝH+^ﵜ>[9K wBh%Vo3cϚODNDj5$6@npb1;emT"aдQ5SrkqNc> 讐T+g4n B./T4lW "5Snje`_.GfH=:0t!#¥(b7T8oa,b#״ƅ bL%[n7 sws~# oծ ǃpB[B2VA\Hθkem34ST]SE5E$ - AT  KsɐXfKl :A>?"#B=::~j[΋l"_0 QJO-|UBW㓺M}-R*{HmgZN/} c<8]̈́QAoU@QU| {f.2Oѷ&z>X_Ȍmuښ$wa>w,T!ۏqGw~3QvBu^W0XGI ,@4hŵ3p2Y2&;)'FB~NI dagmLֿZtw PlM30 %ujы<)qv!:TXjiZ,laD&O%|\f*<\,CeQ~>VHr6H> 47ɟY}efAX/;׺U\Aܹ|{)V,~8X+~)o}i0,$*/uM62/8rUBɆb#Ԙۉn*i̓" lglE_EZA7T uR~iQƓie<ȾH̎69&,oܯ\WHj0 !x2 "wXԃD"!R*uwӊcy(PS9IEx럠70ּbo1?RNvNY`╕q[)I,$t"8<8 k,Ֆz5aB3kWbNZ0oroU×f5KڥHl[i|=F C*gqsj#Q2RwU#u aG+wn0VnֺO$jK%d8bOwtln6ך+ï끗(xVX՜ʰak׽crw.ql(2'׬U[8u2QzٱN!X9cne.yb0='6WsnfXs%R͢zG*`c_8BNjc+ :0XQn0.WY!v #x"XjOƛ?_gW˰&iׅ-)͡ {+_v;nP謩!ePDMI΀p!)/Nl*qّCDaBu, `!z" ;#0g*ػ SiT69rU\u^ X ){ʨWāiN侠'%zq  M6 GS-'۞;%ikJffsyV X i \* xnDhNF[y SB訯M"wV3?yxgc~W}1?Y TVU#9jtYnl^tU3 rk2g A !Ƌ(>ɉAx0KzHk_L*MSwG,{%꜅<û5U:=n+Xh,==T s ԍ N- <0ӗBNy hY݆!f-rKkRow`A1C]\:2Abqu ;p.i>膩:YS19F [(&;3[>u4wܶ[c=Hxu"풷].hT6L/+x;6%e;+b`$Ĉ;w0,閣Jڭ񖝀%t9u- L'DUoN}{NFJ-V&,E<ɒUKEWfY6(` 쑟ΎX[1Tg2S^*H2Io ζ!5 N~8hv KN“=.%JbQ5^Բ~xp͗aت>.rU6D!-8Ă[3YD]ʓ@baSn^i>tU{/ҝRWmٜR9 ƫթRY(34g?WLiAkS[U_Ѩl3CɃ  ./W]y F"MDJVnAdXN2.n!{wݵtae2wW4&![PM LE傞Q!1愊D".ZGP+E"2||X5lI{:ŋ>4R1dD'FhZp"AcGgܐ*Q0O!hcjw}0V̱`֢Z,SeZtH<J )@*pٚB54Nzm;8THvdm^>5 cv+K/w܂7b\tE`kU> G[4I1o|ۘ" G 5eOHIfP54}"bTܹΙ:_m1Y=I˘Xh 8VNhȷBf32hTtz<"*2FȕK=" L0? [|[ XFa\(Jy 5-5}-Hrʓ t Ҷ9~d?qy+`=ꑏ̫p[¬<@f!5z̝h!;`<@B{_`ӒW<7٘3+:CG^\YjCwe7 k.c0Uite.`Ѣbg>G_… #”2ʟ/b*h5rpPCWIG+M)LB05D]]>$sbrVfS4;j4U CRӔ*0 i*P>-bbhXY<o-п8i.iMup:@ }y'T9%V|8.ګk/ d?{'r T\XPwcAPwYBzg\Q+m:':J!EpH- x2.%g=>SI妑^H8P`ѩH\M O=-Kx[ P!`Eqk{Ln _s̭@lK5z'G6ƚ, VHmu95?mU?Os58T2t8-{#SC^(QԊKb,8DQb{lU]>: ҋn]v)3:rp*ʄ,&QBsw: Bu,=DkU9:芿7-8!')qru^8lltS_} 93.?7KyŠin W`%O1k :> jdA.,#e Ǘ,=GkYpܲK֙;Ie4MtAfI;2 썽0!CW_p@}x Y8L="VHe~^:愤W*̄d#Ё<\wupLVQ+5sZ[˚=|`l#\KtrIs,i˯ c͠E}\?H( :h6fF׼_u{Ƚ `tx <4 gl\ bɟ6?(Jhʄ"}oDKEAa)gd"1p>8/5&@Xܵ4!_A p0+(܁%^!#Ho92m%%tqȂC(t3weK3˪d$AEH?=c,;pgYNͲL<'7 kUgF^L~rfd+ei]8T_c^n LrA &yKyjCs6+Qq~5<[WxXp O þ:.uU2#_1T de NErUcG_ rJpt;0P 䰹 ɝڳ $ECZ{#' >Ph;PDQ2LZs 25_G[wg<~*Sw~l$`pG̮4ra9[sGz%C)IkHOuR!Y{)}x9 Jv(9IK? +]ةL;*^/k(:=TvɦaRGD_` @}ʞ1R<2F$Rv:9߾"h"?w@ (OPœ8Ra,CH&Q7l7h@aF5y[]gxU< ZM%ڣ}mMki+ C̘!~+}AqXތWFC}%A}8Srlt2HBRC3Qd&EVNE"R⸨]7x]vRQڦU qƻyuq[5 uÐU|A9m:2桒}BUHS>Gk"&۫[Eh&Wr2 e5`Neso`Js$8>q2κUpj"|r$!]oyի.O},tw "Umbo3EUHSY|/Ha&U@W!:=#+ ֔(U{u*/Q+X7a> ǎ~Fez`ɀX#ooe:vwS#OsvI$U%;bbHz_uBi@zR8Tq_{뭏&ɶP\gs[ 3`}SA"\"d|!12cnU"chga@(o|'SŬVa,5LAkTNGAq16ZA&|t2 S)?PtKZdO{A=EoS4[it8(Nw\bJL'P;_%*P`5F8ΐ3hLJjt_g _`"$>~babt;[Vie%mؙ3=aknMc/Dfgbo<,Y2| xB{c/oz%]{]Nݩ?Jw6Oۆ4VSlPkk?^oPgw=:]͍'&ՍGE{2OS2a v‚*Uu' bkBJX9w!O)lν2ALX\&خ_zӛ~[וwZ0| h& ]F\&g?5nw1Q "7np=аc,ʇvi6:cP֒Qқ5)ڙ4lhB!UR!t x ;Yx/BD\NHHRr+jL׹[t :3L~߸ lێ]cѱ2)~jE.A$FeOTd.^Z!:jOþy?Ns!?Quv'{E >Bz^ozE„}oŦVLNWfЋaU5 tB7 ǬYd+#}篁wFWS\L|B 1S6r W`oK_;d+XԱρWxa󮺫[ y5f^E*1E28"A$uѲ("H:xc0`4nsn>>0FV`וWB\)퉪V Nj)+}a'|~,Q{蘑Gˣq)ș:[錥Nr#h+Y'D }㬼6˸h_8(w}`Ӵ4~v+ZxVsבB]+h0|RĻx..M9=&J7NGxuz^cHqoKY&ѹ/1"D;q֗_Ifax??`BwmdO9#Ped o' Dj,v]phY9h>fֲT23;=GAYA`!.+@+Zw{nLUNQt=:\f@,";[+ B5$wl*;+)fUƨiuՔ8,:Ib=w!WTRPHJZnjaI͹\3fsG II2 HږbiuO1.DY&2_4T|:*41Vq'2zc:QK!)F <돾\9DŽ.`G#t-J}yS>8Z2w]䶉݊` \h?i J~JI+^6Jᱢ:|jR@TAFCQ䍜xX&0|w`D,ه'DE ]dBkܠ5GԙIɜն`)vp:?u4I`kӓg`B=]U3="5sM kj i'D\{L /P ^}:Mn&ݹcYY8OF?R{ZŒԼ0pw|| oOŅ- CL6#:ee ?Y>))Zo-2 Vq ^&KUݓH?<4}V'UxX!`9N'#>KVX{B\ᕈ X\0Xq=MǼgX+2Mż+si [[hag/ANL*`Fd$٭΁BL^9fNq5)eʊMT{*|]BWk *5# °D'szZO pVNb,NX/g%*+27&n8A/W]MZw}conַay^  P Ra4f90"L<{@)ÙuЦ]LROI`SWT6}b@NKB%C0W_&8Wk,3+% Cj7yV0XD%B-ku-ƽz'>DߧqW ԶS Ңvn<݉msP%qIM-bNRr eEL-6RF֜kgxzmu@5̞y׵ &bAZ[;L5-V}D]zKcָw ^y|1fޙj`HdPhi)Yy ޼IȶzlN?we[?o[k"e%." Ѫ-.ܖAëi Ȑ5wNmneJ}JĐX&*#ڃ- v]!n3yʚtQM.1|5v, i+A;"0"ĨzdyK_zߤb$V|׿ꯅ,m +~~.Iǜw&A"QNE"Ju -1:V~,ƵP.#BF`gTy r$+^#8N$nL|fk #lH8)ՒˊFV:Fg3ý yZ#x)4*s=:ԯ.yX_!}PVJvG%B3umȵ>yE  >TqպJ9d3[Tjᅞr_dǫ;W.byT: 0(<c̃e68fci7N"C:YL[G-`Лt套 *Å]+QT^su~y9` YB2Kec&ljJkzΚe:GzXם۹CmUcۜ\y{FjqDcW{GY2]l&2 ;Q;^E%.*\<'`Ոb";"Xp|IOJ"-_~> ?+ [JJeH,ͤ1%|z1k}[[fǹEbYyn5y 6dGE4LsBqӿwiz>1 |kZ c5|wy7&jGq&<ɎyʛPgBYܡ ْU"lGz/;nA52%HR"-6;?V?Y]5R:wX4!di݂Vɱ!owf%Ԑj⣠L#g jd8(W~ziP˻q:QMn"fmW,@ Th |UxKr^eۙ*vSw`销SAJh3?p4-t&sz|`<1˽Ah~ `ngC( 5nM/"[ż o,nM!5 LyԼӍ$D5'#%T2iC5ETn *0X[B2V:܎c"4_F1ֈΜ:i;!!~xӍC!,$z.eFI^a6EU$ 5F²HdO5Wn$wX"؂u.neʀjRjpz[c&~:ŬT9ф!FR\>Z9D'ӠfBLGl7sn)Էp#Ϯ! xӲ1Q:rj0haD] vJ+PR۸` <ƶ"^ؔk 4>3`9WS;7EHJ^")W xǨzd6r |#>냡+pTx@boE;dDx,@N(k``-;kO\+1"zށ$wÛj`?ez﹕e4Bٷ jh9Iҏw&;[dT k;Ǡh9BPIb}@qevB4+`VMЊPQQ.S^fVfOhxnT IlDW"Yĸ`Y"ƻ\[#f>h?1p7^=)lH|;00j`JG>mh:Xx+MC)=cI>fE&esnԏ`5|,Jig1&Fqݑ]$dT MjvÓEV3TKc=\RhrF縞y`mCƯ}Ց*ǵX׸HKwEuBGڔ%'k.M|%`(Ak0anq`!-k r8XL+U /ɝ?cb>'5klU,(]c0\.jZ7RVz~yՇ W_bSqFJkQ8eNK,Ԕhm  G:١Mrkm&yٜ{03Jj ,ƲH)^*ғ3>>75h֜f+_`Ecλ9 X''c*PYxoĻBpnDW k T^uN#!v_w'߹O}wEFftӰj-6S3D㫥#E!Q="/^o /pD2h,Eӹ:nlL>A3FRqHaka+ tpx+a)<,!5 >SQ7"Uh|ʅ 4+ƂR"9 ;ABod5@u*IN!&X;DFlΪ5vsRq5wU{`#ڨ !XXAϾ3^f8*\B*[h\{|(n.B~|cJ\Q=t~}7?OrxSj%>']ci' ʔ,EhK3 řiPq}jUSU5llU v3_~u@MBhTlte~XGPk,hL\tjtѹUUcgç3}e3`p6 #g OҪ'wˆX3f 3wJ+@PSxfO˩b4e5yb^˖Hc]={ؗ "{ ;Y`Cq1;wXdԴID"N*iEpo? 4U;@)ڍ Ν$\Gv ׽ $.٪, 0,r^VXTIXfU`Vfg(m&]{?bC/|VA”jp3y%O=ocH2~<nXW p EO_i]f!B͐"FB}A$"X]6Gw;pzG}GP&-!|gROH >QiV:  ׋,`ƮR ~D,St 8Dؾ,TBUi$e:LᥜdsfnGN,8([}r= FTՁ0 „zZciUcH÷lS+o:_]W5c$7Fڈ5IO2XZ]gT!Y׷UVwYrbLm6JڍlKNv}LH E¨A,@7 a*=M1ֶ2P8$-U}m7PˇUcaDdfȠi'/enc,ԥWVDU+q` `+0XUoܥ"%9ƵN Sǯ!7xݿFSa^ Z*ČeNFLpݙ";Wec|DLf,<4ug%FA<>RfI aN'=".˳ni*զ"ҰCT(2%[Ë6ak# 8R/*+g0=bjȑ6fX?K9T r揩ο5//`Q~D8 5N~߅+0X#RO{"mfn=K1 zu.\g: QT3~0 IYK1L4 -<66#0x]7|+Q#ͲG3bW`Q4X7,6U:xe 1BOpxϭw|Ћ6Z5 QjSUvv Aay];y&.\*=+e9 V]>JTܻ+z6Y ,hZl{7Ch;ɍakO& $!&=5.XUZNRUJPn\ӂD,t!`?I/1vΊx /\ь虅fǀ.BPy+D8gD} o![橬izqpi? 33#5]+"SٺՕ6؍RzD[iN'u}l $wGIm`X? H Tw?۝y ڛ8,[5bbr84E=YtE5A2Ec)iy#H,0X:=‹DU9a1y#wDRPbgm b6D^"s b^vľq< 8e, X~pXß  t oDL`un81 ޻F__B#/lk3H: $r7KZ)u5#vW4 +J| 4^1 #pE߾) Kl{(4|7jrq$hF+'dյ$l,q !|;Ң%a~ѻr,*sٟ,tEEu&!Uy{"ZfG:紕:>,U&+ζGn \3 E萅ވ-4X,$c`/ՓW_K33录*&Xٴ*LP^VծNwENJF=:eH&H=aGӀ(ѭV~c]z3^k1aAi2\PU[,,2`$Qs{%+)եZbjL(L; {cpwwrlivגȝW,+BSBtGO_ ;?߭֙Rx_S}oO$_%/D(m%|+d#,ߑùPfږytԥcB>w[J]AD]ABz+Ab!јͩO^ÞȂXȰpzLjP6Ћʕ>gRB\ױ %:PtB&.|N,Fk[}g++c0 * OF&#.{g":Z}w[}'>"icǙD'J(+UR&Վ4hԗLהgٔȠrg{n $O"Vhg5Mb):dDž Q+Scu2!;mB;V~PAD9c[V&VMIyV"+Y݆qN3:kFBtw|u# NuHH2r`'Ԥq Й@żU.4`5&/U1;U9X`pz1 Dduʌ!)Vٷ:@#*m# )edfN>]D-޿KC»3Z( [l7kmF,BI4լ@\9JQTVn:}WXE^bJ2R̮St11"C؅Q"܂!fɃ* 'Rz[“zrv5.-* 6< 4,nY|7zv&>'m:W 1to'9Ƃ96fh:f]ҵ-ݒ6.B@VAv߮+އb=GK<0,G~Ld0,S" ֻyӟ'W)Сj-tp;TŐF Y/iʠOwb^Vx-XΧX2`G^g/,Ӑ.,Rauw]O~Xc~̚1FJqӦ~mQ*J,9tV)V#t%I{`5kQM4j.tA>!X!2m9,1/=;:{UJf"-xݲjjV)a-w%"<^M63B֝%\k.}Yg*XEqK`?+hB@CYE+IWɆT|X,^{ɸ+hv ɪm)֮C?6l; ڭj!21c5E6g8^:om RDy<BϔCr듧 *k:嘒)|Xe(OVu^aIpbe ;2FXqگcAJ;x=!m+)6,% -ǯJ5WЬdv7ix { wȰ0"LI36swjdgLc[!Ŏܵ23'<ס};K7%zCՇGAYA`-Eb舫t@Ӽb+,g3ZBF|O<*Y[&s$N_Je&][zՍSU:V#6t6.jk+DkVIҔ @B+ ) ppn32}8@J6ipլ{" jiGɢuJ X]ހ1ښ:ĸpWV |q>=aBf^&zD=mLtt ܡ U9ۑJcoCb對B(,(" (4ğM R)@W+4*-sP(w1TM m6jPc CjH94^Baګrcv Uh=O YbC{m0gfč+țƶ د{;\ٝeVWžNKQ8Wv/mҦ#dːkV&y+["ZJ3J9*2G+ 'GtF:H| d|פFb5X?H  htV%EmL`9)!cDkV9{ `?WE;)"spcYS8m=r6{=Ga-J3X#[_fm۠ s@0 }`EvyW_,TRw r=vi}M@n$N02Ȥs]$eZTSEnR/)XSBSP[$u!&WUq9W `e+vZ6uJ|̬6W*6z1IHse8\Ә2a77v9#0xƗ59Q$VX<y'>/ NPP2 ?ԧ>?&G:OWtU"{k]FIֻ;a:/N=G !]1(wx-g&'V` -b++dՆ;ct;U㕠y ~;XT}Αw2*-~ǚPpKAm3@T %l%2.Gy Þ>AAM%*D44)" V[3k`3rRm1ĉa XMJ$)q"tLR'vӜ JNVeRY2[N>lKg_M$U7Uf2i`a8R Uk-ϪZ*ccrVBv\ ]Y` 7r`,T@=wԻ7 ]{!f+*QIK TXe~L0:}֖Y)?UNgw_v ZCwIK "UfdaXS` u,*{D~,p^O%Oqn^ĂחP~!S1 7g?{douHCYO,t5JٔVz} @K UKU|C96#y0REC-{]9`$ŲQA|軪ۥyΩ@l+:Q1܂n H `%eƄ.DCd¡m:uF6r BW|,[{RE<`$b{ >OAuw.<#]4 )6OSk4R.bnh$cR!!NȂ-),e9 / &uir^ W1pn'πLCk~?#Foy Ua>+\[Ʒ.ѹGl8XN﮸H~I "wD+}S61T)id UkE'!nf:,qKe@#BuδY<|L6rD&y@#xg/V)"bf'(jynt(5GD\Φ$)24QңSZ*K9BiTR2ŭfўN총q'1LDN~8AJkvLJaXw~ m7#I>O`mG;cNA+{\q5Kx'׺= ?YZٽ;YFYL,JkG;̻uؑt =\n(z#[v++2pQL Ƌ/~Gnx5ן>ZR<b2>n`qȀjd mӶug_.kW),l/+.qft {eXu3p|V;'BU2P7*Xq6Ju]jqW B1"dQ]ˌh<}KG]|$ tE{Pj^Ts+bc,洈kfq =FX 9RTĐ d K)l>g+&M* .`]Kve]z%;Oaj{gy˨tv iwfs2AGkYkA cƂ^Cb n#aL)TB{&XBR/v\kPKpoɋ_sf/ <glE;t#? kh_XC!})wMcy;79B7*VI V.K(:PQd$k:*.B#5qinH& Os|z'ڷ,`_׿_E/zk^`EEVX?>xS!"| փې3 җ/["!N55.bN9^)IG} [[Nf) o_'F.R/:*lE N^QFǩʳ'r$vIW2B=n8g"cR\.kBV;Iwj+7ƐʡU ~N=_G<x(YHӎv0{K/0Xrz#ur-d4`c;RM5e^oY }i~)TzgIrjI@F@*117[@C k ْ[,!{ԷZ^W_~^  \ky<_ra>7t;`##]ל2X͌ѠHJ4`p6z!a9AE(6Ag#ڱuDN6m@5^1EV7`Kw\TUH=븱i!`jx2!̘u@Ǚx>V#-]o%*:.*L( )"S^y=7'˾ )JL3ӁY9~sV[Yvrv*dV/A̖yQ |F1֌ $ *}ٟ}U9X"x斑^]ѽ{E.ެۼح[\XptrW'UỹPNיZzUՕY5o%>WA\d~_Ӱ^7K.xW\_򾋮d?NoLPԱy" w`h%ɋtR' -#{nO+zħMS>X +XAJ 7Xv5[]9~),,LP`8'eg#[cĊ؃^ g\︷V]B+C:`q{GM9sf65|-BCfuIk<&S18,Մu=W| ڋ#JJ2e%j>̼ה'WCd2Oak4En3^ՐI]ik0 hvrJ(F6Bmn99X`FwS7_EuweoVJ Q-X鿟z H`"=gl+`*qoUXiY6V `Xosi !F/:NEDn?imÐM{J޹jd&,u\W|BJ<ϊic ?anjjִRmv< I^HjM޸NU>b|XK<EP["Vh&z8g ?*="]jFqymli! _?;Zb%7*X`)gPhw}A =σ -3oV$Z|uLPvBܸY MWB !PYpeh^}°GuɻbM ` _7vJZp`ֻ{/;Sd)ZBJfGZkz;Բ%ꝞH w\b,0E3|,!pQs3V Ƙ)fof:rg(]sIgV1U6'G[9f(=^NphJFh*ʾЊ`{;at " v<;LWn 9[UUB=b>:c!=.o 6=:J>[~0uTRcѱy\O-dhN&uᢽە.X.R*^7nՎ2nxSE+2GW`[XsJw jӰϧEʜ2XKӨ1>9/b`ӵA( `1n Qdo 蕭2Hf?=I)5!:t3I_Y Vc0[5Ʉ`XnA.c_:C -K2Fu< W8whh,X ~Dy=m6<űBA2=); <ԕδsĈ+bM#Z*{;̍|dUvCVt%Zv^Bj4',o= l?)*xޕ`76U)C5K| i@w@*Q@>5!|D)1jfxgUt:4#ЫΏA]uڙ <;vn]W9Vy *T>_q:z]}zͫ/}O?!#Zn#=WBt2n`eb#t޻_WCHCe4VƚG`e1 0CxC#':F Y̢:hobzڸr_XK SPD U`"cXZ{ :=$Cv nCBpcVeJxEXCNj١5Xy^ڽcHP+eϤ\|={gKoz˶:H._uы^ts2$s؏"V>v.򬱋3)c>0&zFqJȐFA.ZKqs`z[T-ٳ.ojUrQӪ9#Ĭ-@T"(lv z2 Fˊb8iD?ں Tv !oS3Sfd'X$LTs#X\RB7IZ& ]yW[}8*=% v5÷8T22Q[]* y@E{_v@)@~~t|ʑG>Xin /LXJkyOwQҨ<[CGSVu@B3Iy'go3)mn1`z˛Qy+^fȟ@;WzQ7\,OraF3kj1"ܕ=FP}׸g5YZɛxP9qW.("oM7sMϭa$ KKųsuP~(9+~XN*9ߒe91bDFMo5,T;*ڜ%sNp:8Ҿ,R4ǣih:$,oVa BLwmnY7>i]FfRtH1y<Y7um ]&jv8_Yuk9]$]#ꍇ _˝7ݒLuk~yȾf,}u*[(n AS^ʷ՗pH4ZC?R`> O)G%puMV%JnlNL,U_H@X+⍑|'׽5X;R3=5UZ+.I‘? #~xſqU?#?U9}xjUzzU $8%dAXUs1АXi#?ܪT!mn l֒)LD&8@bz `D)_VoW Z%!EJ7t4Wz#*o;5(r]2r+uƭ@cUdf%&8/8Z?0A'Acu"ېfh3(4 k kcVG&n248t_rlٮ[`(@dBR6Yaq睟C$2w!a !P(^zDϔVMzNBJZвy(AdJ:pE6zvPզQIctÈ9y'~ >J3OYsܽ1_Iy} ҃uJwܫݩ욧 8#[)Y3E?rKR(q2ņE_-zRCy$𰦶 y ־V!v>'w$M7J~0k,!Dh3` 0A-:i /x_ߠ? ]m3;#U)%f`j~0+kwuHZ*T ae2`d}E! ,3y$|7䦘=#qUk\%^y7 X5cIn3pVFͰJm۴la%'u">j+Z{JZDuC諾(s*ʰod\hlюՂfo CsKr>}ae'ܾ A>UB~"{Ȋ ԍCzpsHe"=ZRDEZT.TQZ-QZ9GOdQi8%+DxW4 !0X-*]ja(׿}N/]VecCIA?=AZ3j/GIp4&6ol뢢i1UN42LuaaHt>~ =YYdUU\>Uky;<N$\B)ڃ6D<[Ai_ԕRLѱД= 46G1#nrf{ ^ 0pbGCuM"vMz#ѳ"6W\ԫ 5O3R3SNٽg1j~,wIȩƌ)aң!<"?b >' ݽn7Pxb)-t9+h3Y@+0X0];t :,9(=ቓUjC#!V/4Z2y\#45lltf#1%Q1h=#(:r{ Z`!\`|Z`ȞEXUf=S&xm]v,T;SXitG9$a'w "9$3ݗcua8]s?^hۏU|-RY e!ʢʹVvR ԏ{wLΫۺ?ke`s Ê( 1X2Zy'k'b(7eoұEy<f F_j뭉d"w@6 ݰ]n׷eFΩ5 +7JmvUz{rW5!Lt2A*N[Qa 0XrYg6U]yכrg;cO{Z &9rJAaƈ.aSúm`ՆM 5Ek= ƞ> C"0Dq"fjeP/CFN۰ͤ Ħ }:z?s!]H__T+Sw.h ,.eRY~vU+*+Z",. w1?QVh7G6f^u?K/} ˮ~%oKcw o~]akMbP`U+@l`=O a%fdcW;%:㸚WNJb@z-̷j⣅Fb訢eO[3n#sA1]!6;򫮺裏Spn kgkQ mrp `=e8閪K3QSja-F)5EK mN  5&LRJʉZ&_6{Kw eD)CPPP7n| Uo7&6s.9#gU ƚ!ta i1b1M%p;DÞ7rpf#JBUd}Sr*^a4f߰ "ts UzA/#?P`Ux["#3O" AYIc8jv'Ɖhr 5m;cmYb` fcHXF(}D&Zf%vh@P M;s+߂m#41]žS|fېfT^s`,H9D=DlfCYU3ښ#IS:/2pfLhllAZhp27C  4Aw [nxeYlH|𡛨5bs}&d%r"vBpCvm NXS{ xX~mݩLL|8Xdcܗ $K-¥,+ `%<Ɩ pgԔ%U!i&lJWuy-$V9KȠcK{廼TTVGǫU|JcI_YtTmDF `|-H@E  2X1㌽K?H}c,3ΫLOlH5R^ž9MiP9dLa4 7磌 B^u~68zN8.<{S'?T.NME~'><~[@WZ+xy$%'gږax|drH}2ncE5ne1VdzVRxp-\ZtGJL07+mT4#e@:.왝#2#ڿSԶ!-(bc~aInCPXO64 yZ1s%r7F@^jhD2FDsp4Ks:ə4SI05ݛЙ=* _ ̥aELhoy1J-nc,l; O|8sW)*OB"?c9$)nC:ënx[!H`vc-i#20frgmU_ը:b.!J< $[ufd%" `?4;D@ ꑒ^ Νj!(a,OdAHeK,($(ࢧ a^&iahѱK2=EUykZǞ82Za,8yEU*Vk/S ЕD*ƇS`A\F++:FƎ8*mlp1{93oF sIMGWȨa'rkWX\@j{krv %u赎)KuE+R~? &(VqyGقzG}؁*WUݺX*(+$Z)`7fD {/uK)8첰1)bRC-RĞiB*-x[mb$urrHii2)T^ry.4T r*}W +oW\!65İ gxu:p^eQ,[5%ǦȻ<†g`ppF?['w_`8<Z`T+38.'5`] Aᱬ@: " JaŒ#zLThb<΂h =$h&AU\g]t; b tjJҫ ԉvP}{NWOk˼T-JUzդvhMNV ynP(9֟ G }5BBQ2?F$$t+I# 1Ns31-?PF! !} -?'?ޏ-:&ݯiQ63ǏuzU`AKo)!FcFׄQ/& 1wɸ`V uryqjrw_2Bc|2jX|"uJ8 `qlP^r2^/C2E薋r. 蘭'fEU|FȐ2xrΦ% j괳.+,,:rz@w:wH3@"r -# ^:*i Esiw%:TQUWR%KNen:UMI4\k\`!çn0 L?Fluj* }C:^,,iB-@Ua[0?D{BXDkRw9E,-H9߫39Z=|hz(AS|k]_?] 0X !+E2RFrع&Ԥ,[/ME5? xh7&|_X񤖔4G>p .>찣mȸ<'zyW[}T<탫S2 z :wh; Ub2. ;6FCgs&m$ocRŒ^X4e-Bve ט}ֲ nvZ>{>[yI(Iժb*aI< ֺ>zʊ$VW6Ol1VӧK(g\I"~SdO2o*- y~'n7Kh h/xݕ.[`F!ۑG+LKaGM_"Dא'93o, h XK<!Y~ޞ ;y ,-**po\ vyCj9D{$ I+*c͑4-um` iZF~륚%Q tI<N'ĬLru1/A#>g̲AgooP15TW8UN]W v`>CE 'ElQ w*թřS&"Nk뮖̹ddt͹!8jF*L-W8,в^px=K |o:ݹe0AqKY֋^($t]i] y!{7ʫeFAZ\2R:qTza:9ØAM-UkSUGz3f`#5_/")8%~g_ҟEsum~F1%Zѓ%2>챑Wc@2µdPkb̩eggn<%oVlFeC CTiB" T{x /dx&WMZ- Z5 z~S+ҞnE@g1m#Rzʵ{D썈DQ4",꾱?/:QQn;f^kAfTԶ#f=S;ھ TJ-W:9/4SC[˙IXR})k+k"8ߵW"]S_a=iky,.YXS(|^{E ƷfJVOI 0_jA7˃VLf~m"LgtrQإe0z5iQ\Kl`EJ LꇩxnנVqLnFjCԷpܱUy;~]{|근W_wG kC,;n|HŤ)UѻzT8j,OFLRЉCV(4#0+ڸTjptcuz!eXcq(p9pXV+mkFFL5?ڳȌH_T"|#c(="=93%WPu/m{74sf0" 0XPU3?*t )DŽ`r-W7`g.Ԩe!6-# **iԞ54 ΠzչW?ygz-ԧ>̱C=q4Yy.]zݻ>I X-wi R,DwCi`~`KWg ff< :fEŭ-ݓc㞅1R;99I=c*eR0a ;}=%LǷcnC4fP| ̲6S retHzxmnļGRWx0w^*su)r沟|+ݒܛOUT=C9!We``bD@r]N;Dϟw0 X\,[ xR5chdv6,)>gҧo%z_7EH'K9x6O#4:W1Gݐk|ztf3%ye5O8h[ 55A .ujY5n]-UocY6i%0Y ~XXnT|DugXDm_Lc̳\z-DPnu׮֯ btp8S~>`50d z]X85L9O˰(JؽH-K弸s8;>CU 3Fhg:W%6FOzx`P׆AuDž&@mGqLQx~zXߩU'H&]@>쒖 hc|͑bN-ZuZ7 d+Y__,fyEth/ 7QaX@\^ g+?N4Mg.T| xy6v|k&Nb Uj%T8N- zf&mCzxNC!,h+oʦA7İ|A8TmkP,j_^Fpn(t];k1BShzbX޳ Tq.Ih 3),UEX*Y tTˮV,Zpڨ>@N*NTtG$WBbgq%$Vxp135y`,ݹS#0BI,R^4*9enIy|}?Wf8!%kF:YrnEYIjGSGSOYR߶Hk:R-d"I](XI,CHtbX34K^H2jsMV~ k _Ʒ_sm!?q(b cɫ?! {` 8EL3TտEX-QE25#] S N +SSZPV59[:A1Gxx^a]Xd Y\{AB;/~O_A*'_|xJ! }~}1͒(2OTұ? ~?Jޓa4!L +7o:dYgl@h04 3sȰ誰zU*6+-P Yթ_߶+/IЅ`>.Ci:dM Jl׫"w,`P#BAw?h`.7\op5  *w3pa*!&XxO_2Lt5["˂VUI%j/~ ql3$6=VftOh P4X&AU\| 8MO^Ωa#C?euVG̴uŌ LI{:$ފ]FHP;/@77G tQcm3܁!Y=e-q<eCIX5bJtyf (!ujͪeN3 ](̕6 X0G",:r&٬NlX5HсM7b9&&5i[`i9 5TLhn_K My~V?;&d3=l1h˒ lCyyB}Ӟ _qǝ -B 7ܰXZM=:& Fgb.Li{w~t"C@:4ZT[Nv|{ 8 cw+K̠dX= cfH*x_wq}i_)yL^}&dw0 b=--rcJ%ϚocT`yZ[#TTJR#ƚZ-j}fHvKvóյeXA^so?g>U'd^-B.gTê?`GJ">ۈqFuAҴ(NU$f,m- RUV0c1DW%S"hk$6=zC\gk:hŤqp`@mѴ}Wsm&=1*g\-,%꼩Ld8wөh&HYi_d:-*a.Y29[F\V2`κ$MTj& :/لiu3H=ھX4oy~*kzj=8G^+L),[!.jFlnwCoUؖLA2}/h4م_}X5e{l:*tT860ߩ!h3x[u#)o'iR@'HW Y+x!x,\kQ9* xP?ه vƭѨEVP8lH "}P60Ex]{!*fm¸BPp(*{{W/G١cI+9 <5ypIJc.Tŵܽp@C'LeMVz%J=8,K :B[3oe= } *5ν[VW#Ji~WK3]jCR-i˶nO+Զ:E;ɀpZ~Lg{e_+"F5c' _o3x59 -HRf5),6QG[\ʲѕָ _ 6|i'X'0ڏF7r?lw1`SExO*y[/ncS 6k_?qߗ`uF; +-z1 *$WeE-T,@㉅AL7K2;Ld$HXIR C9Z:a.K\'IkMF̓]@ ߸#́Y8hUQ( ^]5rd٣kJ2ONNfjnfzҴ 7c?~VjI8;O?+X`>Cz(P52rmRG>|;_r\|:5>8ͫLE#ϐbg'#w OpDFe~ +Yڌ:6g>g/*]3U>5W=g4zS'=yN7kFOhEuΚO=o@? ,Zfsx}8F g뷿`osǧgk( Խ䕣I~HfN"sJ bɕ Z@Wgp5I3S 縸!2{)Q E*K6oTj^ иkr8?VStBCWe$aR28u[D5S%NqݲMEwykYg ~ x?찣<)O;=ޡǟFJ4;a(¼Atcxt !'luvPHr,wqk_2M酁f*D׀k[T5yvc5#иV}tEhKe*#Юk`IhcOzOU>:en;&Qu{@@) <"o_k'wbB29G} |5rlj$Vr2}Wkd"כW[1EP35C,Q\b~4x˓uSwmY)Pe\gSfy1gUq(R[jeQ]R$bVU%.h+;7E~peAċivNch|R.߈K?v`WeFf)!QJ&`,g(\:ϱk͓CBƭpo&Ÿ*,Gbo,:fi?-xA N}Ȟb6 2!F=cw99&!tkMa{I%GA3S@)v>/;mp^n4,T[v5Vİ&*t :هMw '=)|TכEYu"\[. /ƖO|]`E 7=ٛ(f; 1mrvB'e,rFR6!Y "ZWǁ!L/l_+N |?ǥtdt V .նNt Kuƒw'rxUlMzcg헼6~;!WWn-%"9*u!pQ`>S >} xA"y,Rt;`AEɏ | {^bo &6u",%m+ @YFYT+> A;', Ɛ9KRvc @T*BOpNIU"lFX6t ?iK%֏$)=cJ E32>SU%7xjY[}"g*N0Ί(WJ>@ x w/.Kb8XnNE)B,L'%חJ۲'mX1@,4ydM"7 X`Aq%đDwo7\Bu^8.ϦP1:t@2 0"ug(d00M0 w[.O}Ӟ)EEzKi_Wet egyOƑ"vbX]ųd t& & U UV`*zD9cpc ;|mTEVU?5RE?QYcG#? p&NOy\ ' *hFUW47y U 6 x;ZyxԠ"1aR!QhkyQQ`!.6Z)֪ɘWIE;Vǫ ’O~XRQ:L;<MS]<6kZK6pb\):n |`)ӊ{6XP%pXu+c d?Kuۯz,.`3PXb,X* o +IgAٯM:{z6O;O=߉*b/a5F kt`'A$Ym$(Vq6mbMеt^b,:04goC]ѕI-kn+b:$yiφ 9U #;`Gn4Cj1^N ւZw ?-0VsevLYi ۏUtKfW*dx"Q _OzVFmHOu#̈!\ aBKuءGA 47~vj[@~”b/bg5le3pi09Hcg("d8WT&S)Ht ʆP&YxsgYIPծz `#f.*E-1f7vGg?5`Z i87ףa>?i^K[V2־6⟑IcEhUl5YW-t7{]` XbQ/GrWphUd7jB<4[ ݱemKy$N$əABϱ, 3k&C{tHIhʹ%gyQSȉv©6Eku1cD9+$|;w̩[g =П*!v,˷ZY^?9a%C7GVm/qcg6iH47#t)OM o:使2,K%,J76>IFvI.Y#y⑻;9Am6y^DI WpS*Jn]XzB`ik\f*ɁU?YaAbq l="%!+ԶABL-PJP9=Ý(DZ"Pbk1rHI3G+<XU R4b8h=7&qZ@t%oF_16K7R,eHǎÐz'1]GrFv#gzѨ53'ltLXg_0^  gH m?Ľ:-:IXaS9Ka(^  {`V2>v< \gj!#X r(T`85aV&ƪdGeͥD?G愦M.U$Lr Y23E^ O{3ɪz`w2wEAap礓Na Ccl/,`0Q DQ38mdxMZ2Qbo,paPR1DAU'v yf=" $CWÎKbف a=7޹ vh96ìpKb@͑X:w[˘&z)~X*i@X-,S+;巾0V`J3c%˄$%S<.ud; f h!1yWf` z|ˆp`G;6:"HVp$vaH+1G0#w4F۳◈?:A~Jsw MBan661!VlEIP^XYaa;G ָn|U nS_/C\Xũ[, jZ?³qF08/R]HI"!)Vs<ѕaU2іÎ0C]%m<{Ah *W_UL5q,kj=Dt߫+rOlc.\Enh7G K3X+7 Є5Lv0Og> ڞ&!*?"Þ<|Hoa؏.ZJ>8[7P;jhUV;X@RkcZp _詟CQMa Z:k'}\ /Z+in`pXonwgjlU/~k"Wh~iCؐXVba9"l,gxrS*!V颩y͗â3m:%8e]n5 cb}'MSg z,9N;t=~ ,sZU+U0!?A,%RɞcUTCsex6iq&G1󐶦>U#-SSVȅG=؉`G} ZhA;YO&>Tn/xX"ua)k!,VRH8(H-Ϫ0i\ޚA,ZŎnʓ*$!AMCQGfd- ;nv0 8kkj[Z>4__gKVbf^2Pʯ|R!꾟ێƩX jNQM{ȰAPhMVU׫>]#B>SxáĘȣc"0uf}UY)XO1CdpR5mvagui57X15cuu ]J,hyq߇M5b>aMJ b^ڽ݄{v1Y*0k0 d]zC;E6%ùöJ' V ,uTΤ7w9&&b&4)4 z*YaQQ(UT9DV`LV*sS)ʶ} VTu^ od=L}Cp?ןH20X}'_s`PxW2)d?p".V=`eF?51@R\Wv 'ҙ\ҟmt=HJ,\.IY*e} b:U5[ won\u\DFRY&*a&PYU?!0$!<jsI/z+\HdCAPDvw$\.0e^xzۇo+6Q[6{6+͕r6?1S)BQrUo)|Z-jy,v͠ZTRpɴiwFԯ*\BMwe4oN0dQ|cMh`c; Y<X>LS wdhgPt [].fw4azd{^#蚦 =h+m)ʲ96pnH»p.0D倂))I_`DhE+B)tҷQKu ٜAs~`q-^H&2MnM7Z8]RWmڤX4v(so3F(fmr$x# ;VQwP,M6W٬|Da){,e{c/ S8EcB X8ʌ5A=\ʎ:ؠ.(qLtc^WM&6ŏ+TՊx`}· ~UHݸig@W`M ] E]BǬh¬uѹXqZWqD{w"?8 ;P v` | ⅀lP+nPMO9ijY"kM;[Rv ?Ͽf _M/"U5R(Xp!>RLCqve=Z P_>.0<.Kmȱ,uB̢C[ku{wZ^ %^y($_5m:\a{qV~Cdw~(l8S6- Z'`n옹gut6 uMnsPPR4>a >qw)3j=.`r9 V.at:d\ GhZp4 ?ӦWSAȔ6x{ bq^t%zח>q?b }k\s]wvzxp[0g2X`MĆ䏦KX74B$J<5-," |0;v?2E}t lIbv=+qN;*s n!*&ط4MY9FX֐a+l آ ʏt:+a&X\| ,{+$'Ϳj^lmӑ$Oe$0?Y@;cY6ZjWivIJJ8>8Ls2! vtNUT-_pNUxQEw ,&C`4 Q9n{ip0/)rfg ):s +$ANZ xQņl55@5G y)CrZXF{e.<_A2'iS͒}LOCq6n=m~U IIAP(ACSHe5 5%.Ry[tDkhj  }:AFFP+xQ2}אa}Z u;#~ke7PRwڻ hXѨX<Ӥ,fcauN+&;ĠV V"S97 tVY)mMzMO2@4[Μ"\Q p0ZjwI˛YMTSlK~ :>MbQ0={%IQv d~ JNXNjsX!4B䚹SUdLN!AoyXW믻 :z`AO!Q B@Wzg1:L[LHXNsp >Fd:i I5cH':Z&y ִ2d"ĵӘ7jFڽ`?UݺvWu]~ח'h6hb \`Oٯ#!Im=1H ÉT 607WS+2t]-/GY+tR2A|l.+AU93 [*uM5,b{U3|J3Mc,ý ˂% JPYq;f>y"j|l4yIiKDW==:mm.**P]u՛o?5Gt1~Dkp.c?%a4dJ,r髬.!)7՜JDqi,cq&պ" ?bMŦYÚpӠx398$ZW{_fֺ7X%%` ̜?MOwh2g4Z,?Yu&Dk[(1<oNJ/|[Ƕc܃5"ѝT9x1:G'$!mMCF+dQ~nN`__ǬT=n e(XeS؊F|Ɔ҄Y6#;5MW͑"T2j_q7)^v̵S@l{?jѡu+ou-#{jarGg4d1X=/%4mJTi)`+nt 3XIMp 50Jڕ')XSc3X#`kw+Uu}j'^ cI,B`apy)=|m ur% Kpfbi.>H@I"OgYIiY"9j+hQaң"ЪWFfNAY}\T@20}U蚡"*MJURa D߂a1s!u. d (Q#mvy]$BWLy"렣;`ys!{B@  0XzܵU?˰)тkJ)x&j}FmR|1Geg0.< &O53a6>~au9fUxKO8,7 "7N&baC|z{?W^qTyNE{RC^YQЕ0e{;)wbKV3W:U]wC9e1$*X!u롞Un`_Fzkr.҅ϥRblLclib{OxR /gDXM  9l om@+3Xyk&[}mܓg!8*-x):]`zP-B] MG_kJ%Vv " Ǒ>XpS9OŽ<@aTZX7r~WYQ'w| \􉐇vp;Q>]¼ 15%rmEO o-j$TyLu_q`,wcxTfշ|n''"=:{Qlʐª_74ۑv//\L*kCEk V-7?E{x"\i 4n;:>grӭ9ӞҴ,Ȉ'z-2T݌WTVA>Aj: -uOV4XS.EuH /_&'h+-C=j`1ez+_Z`I{ݞ_}pω'V]ZN įC^z>0a,UT\){l/Nsn9L00oAal;FEJ͵vI wC ]1`%lg2ƲScQ HX|ETH1B13p.<ǁ91YBte Z+?ܺ b-%Zשg>P|`s,`!6тtу"®Ejw) JA\H'9Q¥(JsV3-ؤFXp)fxU&؂YF|&_[&AUYw'io$#E,b%,``M BOڰgVק7?h!pw Y!Ef:brOJ; iDl\zX%ސEȠA~x갯adfV1t4lD 'tFOnr:E]*H(c M,⸜8}7$g{A݅z}9R2,O1S3 q*![nVlB,V @u6 p)D|X! VX=ZVJAhaV &ղA_񝵩_U{nUPM,Fa\VrWg!GJ]+TG WI*Kf`?ٻw{E@ulGg@W &/6HCStdKuq4sF&[\<*h:1Xʲ#m,T_&RIzDRM^(B?"qǯA6 # cE q DS)?&4f 7,v4\jDvI3#`fj]6ޔ"AX a_<L,]ŞP6B|j5XXO:^s 6XfA4K 5Ga}xg [.JCP r5;=J+rgf+T9$LBOK3al95Js.*e ֹ{\C8?/e)=:AWnMhP5{wnV8$3N]rSm𙣨V"تEm 'd# V^!fp\;'!ѢF6H"ENCN2IJ0Q*l Pca!S.\ OmҞUj9K(Ռ[ܦDbвTQ ëk-kEOkҦ a,}^y-†DPZ٦ =>e,6wص ksD^pՏ~sh'td ~|@-H9H >5"mz`|-5ޖS$ʘD&4I6́i^e?EQ_Y k2ٷX)P ֮52# nrV, T*Aih )4A~W,wd4ݧM(C+FIEl8 dCj_\ \*uhiqFWEhX{sE1`S̈́iS!;Ǭh4r@6_ Ϣr ;Kan TأXF*mw񺁮EĚY1&И[uQ=jS95ㄦzȘ%2xKv wzQk4 -BX`UwHUXmTW@7|CK=Q_V?[Vpj\wl}!P<*˘ne"ndsK_FcGq\!Xg)vؖV]Zmt oC6ú脹ar.Й;D3/iZ-'wstfֽ"'5֨n,b1Νɧ_.t+OXRw VN;}$"x>^{E] 8RXch`&0|;kgpfZ80ΕmhBLy22D-KȊgUIy|[ٱyFF2GrZv0󝬝Y+c:{ Q9FIP^7KXNǞ JZַ[?z>Z0rL(N@lvsP+L=H8^ 34y7(9ц녅jRYѠa/[234($mSD-Q2E6!`&Ffh"29L!0cyչ?8Q i)"A:7~s9ޙFeI[FY1(2d1-/"1\wKUb js/5L7FJ*s]:O3')5ԛV@O1.}N r7VšB  uO744vʀ,8O2Eji `y"X0Dj髍T/G=%5D ː̜uHZ$zZ7hi+@+z䑟} ,TrB2769Rwz1OQH\ 2.ܡKDtʒeI%ƚ>Z-6E5W8~馢BsLEaXsK<)qM*m%tB Mqʪ{KV}] `^< `Mzcܟ.4Ƃ^$Z@ 4X`V]VUE)JvtP%xR/eJ^7,_ ;Hr"3'BVe59}3 'Uuu{sW]{:զ?@ * |~QXpb.PnP㭙nǟc]eFݖ[CmLN`KIjZED,XAWJT×igYܲȚU PLhxF!S_ -vHaNP>yXΩ) a;Lz/7'$?춑<8 󍽾ld8-\׿("JOXÑ%cu1VA-L5f -h6 0H `MeL6Do6XpPiXy 9^JmX:c:U-e|Kf:VZP0T 'q1"$M*)[hJ^DzfPA82 :wp[=ӑjBQgIFJ1l7ApWnsFȲi):HT+zY3`úpɜf+Ѝ'w-.I$+߯3StY^qK;vhO~P%Tfp-YY걃ZZNyBk V[, 7m5f:0eXiV_[8Ft #< qq3w!*m7suw~kQ4"Y8BJ481%˛L]BtoP14f0 Y]*|U$T-4cQ9+ X*eKajo?~0zvos m Zz"A27@STypUmA/'F{UV0'~){GpOa%U+DQz#PNPH*~Lh` dkw`񢠷H6 h[PT.Hw6y*R >Ѝ BX$sA牅MWRG{e-K7'?`%Hf0MO~K\oډV#a[JEEN{";5-BBdvHhՕik~]y9QTh抯Vg|JK]² nϵM Pu1YF$(FVwD!~jucw:<9s|px9%Eye>y%s)m}#ж'$Tn] {XͻK%np0⿀rEmb-J5j<#ȒXsW7a{tu"2epd:`[_Mj T;YJ&/*-W-tkAvQ[AI">_ԛSC'I7,gԹƃC"7GkTqhVīXx# ݚ5s|% mo )*ow)Er γ}_|,`^alѦ2  h -Cr8UXC$!Zz|/Ŵz $ٲi6 :s!C\5>4"|Sxvgs5MͺdnZpc6NTuFX 9(8$-XDVjzs nT88T ye5O& 12ڈVlDAڸk&5QT^jy2Xd)? eA =1QM\&bsfMYU-ʹ6C+G"Wjt+r/.VZIMDY;c+<)L@_(TݺhNh=Pv_PnTbu]өt*!qKM#֞)l7A*dg)5quD$ ũyX)Pխ[`ݲX%:[J}o @fc#-ވM"ToY$;A=ɍW#A<c,)j=}bbukDG[*ԢrP.ʝi1 J+5sRƩۙ8f Ң("aN+Z -‰{RвUT4v RȞqkD")X`dTu]Z[t NZ>ظÚMOY`MR3›u6ˑ3RUpx=sEh(窭rp(NH)vvH`۱ 9tfT5X v(kzzϡXO NxFE`X6',ᳪ7\<)5 C[m䕽맵?]62b9ڋcйeΡ,@Ha>ݦ{BOJA.ž7Ky;'6kM_/=.y)iQ"q\,UK'ΗK2@9KRj/кcs= ,]eYCK8AD5 PU "h u 'Y VsoA=KQS@\Jј+($`,-CQ l#3M F^XMNXa?H8ed$VMUO{3a˝xVTvV&̊cb0k4EXhA XmT[%z#8`aK8_ȴ-ar1 1v3HbEoUA;m0yDFѨ " *(8EјL&t$t b8d쯯Vծ={s빪N:Uug}^KEd#aNJ,x]R+]͉`Wۻ DOkzVۙ\09(j-2O(iӭm;ik%b2;o15 "7.&I X: : *'B àd@WRq1Vwώa+Ydb<,aiQA"h!uջnB}@'.ދFwoD]D2LŌE*֋B7vjvs;1,Vܨ ’CU 'EAl`D4=B2UÏcx:FREfdO0Evi ?mxLxЪ좣JYTԫ r` t_;ϴڮX=j%F.&T'evd7JdH*A`i£Le): E`!eC"rn0R5KC=׭ LjQXyC-g*-Z.6-qZF<$![m 0JAi9Qձ{TZ_8X=싐N_8g 2R@Wc8#g{+9$2Vg*XSctpz:Bg_ Q{4mbfln# )^Յ8қ*$"A8eQ^B=d`e񃲗c=fS–ݾ}Z0XFfДIN{%3V餶~j .s. V 0FLta/DIHIfIbzJ F}ξҋ@B526Ӿ2EA#쮃XM%l*>{"T&-ִIFP%[XRIN&}7ڗ"&w_ MBh0nѐf8I|mQ*^F᫅W-Ѳ E[Kɑ kxi2pUe<0") NERA+՝ʴqbB"%uhdY,VѬ]YW;UV&?Ī oka7z i&jc͹Pܶo]?U,aMy2)R˹S$cB`VZlj;jtֈRrY'XݎRlW ҁ:bkxBEUp$*` Z_t \ʺBxxs(nӲP_а+.- Y᧎`֫GWTc&2T\ɱAGFB + $ ̉u)Z1-%%j8wW4,zdbO`E'əNsptpjX& )B}/qk&:$#Rh@aݶKU9N(3VE(͈&iFRS[r7 ;(f&&Ն2صq)a Wq{Kk;ujUoBxb7r:G5Nؤ sP"ۯe nHḩ5WeE,*+%Բ־4+-[T)|-4:2Z!. o_ ⳱[ VVpADFݐsn]qKtއ#FJ%#XIH*KXZ">V;7hKj))=ôB{E eof?i5Ѱxi:} ,}?QoM`_/$7LvgG"Xhu0o:6 ф'(Lt z ݻ up`Btb<ߩֆo`yEIgg܂hǷu,-[vXr(Uy˟,Iu3 tAr I c7sSUcDGx/Ķ&t'1C/ dc 'g\0gPbPnk=@bhV&5m4i֕CͦtefÂls:㝀n3/5(Xs؎c D!M*qݙ(r.IIc\J8 yr<#Zpm38X]M FTIAC9"9u0{Z{F+ Z+'ߖUB70!3p *eF2)"d0w1)JJnoJtt~"jPY |' zYO* KUkTʈ5hΣLlL`vB*٠Ti_Jb?[eU+ȸV"X ԱX)RpT>pMTɻu8U$Jr222'N$kLn&KȋYF7syOi M*i9uw%`r9XBkc]ȪD{EQ֯%}+:M0eyF[X,aFTK"lOܵEQ;][kBEJW=ljH:W UU%E$.k"XV\8@{5G>tа|(S=)[`\{T*s!]S0Mi%[5bF PzA,FzHE#(x5Cƪg~1[tu 2rԙLRRг(WkS%BƠ*Oji4'{R/>>/b ڄ|<*\/2T[5s#XM_\WfYV l5 W=egubq]w}33dgoӟ-O^Js^EIx98֚.:Ŵ,ΛYj&>O `9la:v;4wfcf_s`͞7Bjv9oi Ib>I#XIky&1cO\ݽhk:%W2.<>z* .ĜtXj=5eJ=UFy^ 4knciK=TTe"ָ {+bdIv˖uxgYޛ]2yDi OHtR.N  FvXTkQ tEz `uO"QXVjb f/N^9Dwiw\&b#<)Nz+N'ZLр5LTtZ+oFCl#5hcVe T1`FVԅ րSGfy Њ'qQ!աjFc61Bl{r謽LE鸜(\AOHFP%u$k4/sK5 hY)O&"X`OyPHR*Ea `QwFu:ZVP/FGtqI(4y:[0kls&M<*pէ+\B.Ci VPQ`U~lEbCN hzU~ ĽZyZxJ^%r GfLyiLd3+Z`9X%!%u%,ZQ@yv Хq5ܶQBzWuέןXtu_MT _q8/wbXXb81MGx uK=U ]ecmU8֬uY~~ݠhuF"`4FTTUf>QH޷e w4%jVZCtӍUcyhs{rՕYd$zBe!M o8J nD`4:Xw/Jx rh$L鍏DeC(KG\uƍ4dh,Kd+{BZV 8+,dH`M, ZZIklԊeՆu3.b95r?8*8O-r zmq?]t ~ "XvpV$5uG![L;vX,k% :ykK8eIW}6R1l=!wETõAwPlQ'[ ,gV:v9*%hɫINω&uk!EJ~>Jana+*EvLgWO\tǖt\jP! X2+f`dE섀;10r#K=IThk}9`8XNLVސZD%N{]~WC f zu;dMX  ({ԅ6?VvUcƤ\=$wfR݉s9Y@Kg&iVG<5*IM% iѫ '@_ ;Ǝ|3_z ;Xj]A`Vc97b <g>CD̍Q#⪮0lhR hTW҃FfzBZ,,W)? w-|VJ=b5D>+!*T$=WY$Pq_5j$R%kH%Nk!)dII}}KNk>\⹻]vgl$˲`Z9̓X*$ qN( xb 6#BxA*VMۦT;6C)|E#>R>y %Y4d2p1CR5HkLBm<7pvo-̚)J{0m" >Jal Jj.YvJrb6Wa&+Ӏx*'~:È]jIJkX*0`j`ނ3F8%;0iXwB"1VVP'j`e$w TIXUïɳCpdt>.10t0$jD鶟uCܖFAyvuj^ѩT?K+M`}_ăя>מBjX ] N(/VP E%H lQFPN؄VÛ?jͅaDQcU i"l3̍C(T"bmW!1T3PjbPE0[Lú0*lz >9(j&-I<[KF/AF Bޭ%Zi.<2Hȗ ?U y&VU~H䁀"O/bL[3 w"Ù Ƥ9%1J-.;\2&chuKj J v33Hee9 j'Mw<5S>+yn9XEPui5*36UG Ғ`~go /C 4XpWɈ(+~bib6bTQ\XY"` (t.~$`2eOZ(Pۚm B4,ƫڷH^+")yHt3=,?XXXz-bE*q'rV/jX=*Doe0OC#ZB\ʣɉoeCZ0ALfϰ#D`MRth7&B`^g5rݥ*& V rqKEڧ EYBuoo,$>9ں2l&+qEǰǁ LmUvij]`6lًXҮS;_g?wm7 YMXVXqd.(bR=,u8S5Z$] }*fn%`V&%c`2#YCr aNlɑ KS(HPj&3>ZE,5 Z*E$*N&VԀ-Q߿v,Ae*M(ΖѼкTOZYfS&A T-* QWۚ`7"ib~LLǮJJ&0AksyF\;sΤ)SM:X(!ts,ZmiB0d;ېeZ B1VwmL vuiQNP2UBPƇ `5*v}"2QgqU5}{?*MPN6jߘ8VM}!v@7m-WʑdwŃ-j2h;Rq,k>XJ;[[z՚ V9y@x6H6t@A#i)"Mp8pd2xϐh;8fHWl՟UG nT>]h696_$[b3T(u+4upDZ )Bai~*^UIl1Gz [:;=,>vU~!Fo|__+VF: 7]r`g@^QˊT=$oe/>K3%_Rͥ6rT1]#XޕeS)eT:ӕzY鹿)E@mT_W <,]-c~{>W ,J:YZD 9v7ikVU$+J 6'lR*pl@WVa!CTU<TѲeR_1_#Qת(V*2,U?- :ÜqnL[/d5R݇L5;21!)+t8ڟY3Y;+:"+(j'S=&E51AȇMUW_O̍ys1m4yDl9MqDK * CtMo9X?n= A *1Ae%FNN0FC,S;n]Dpq:=z ;rDHߨX{_ $<⒇5DuǜLߥmB5" ebB +ıM~ c<̐NxR6 =j:99)7 v`lX.#>*iŐAl]a3o?p'DP9pmt~(˨&I#X|©(ˍpUѪV[ ѪJ m::X9SI,HfiA6UZ7"@EHjb,uD-# YdoZ{**gy"`]zɵiWH B, `Өg>Q(h'`yaDb~h_-8dhӯ9w" >vӓp?+^ % ?8+`YA`=O=UH6-*~ewntvTwU{!+: կSصLl]uɲ!Tu'gkj+mX`MTvCYþjTMZbx˧?vMx=PrUl)Ex]t6JȩW|znʒWceY6=iXΰ& ֢r`oXHXS 8㨴$kNr 5m2ZA`sνA2BA[ә|ϵqfi횥ZDv 9B3Vh]XF#-k xqǝpox[wW ~~ ?xC(50 Hq,=@n;l^ c&+% DQ[]6|;*m7hVKUy`ͨ^Pr)@ 5uY:݆z@:z;jU3n25mKNbPRk#5`W?+`r`! _J%Vod]I]H957vCf 20o-ksZ U2L5Üe8OKFg? Ě4-)׌Fc:[% Qe\g zȈ bp,}6Ec5 Ԓ q(QXP߫n)y)ʙ%y#[\q˲ͳ]*LRtRsx/j+o  vj#_zct*GZx+.[ k6t'$"@ {^̺YHrc26f/xcEU0w\)VTMV$ P2ICį}??~7qmRQjDi.EeB2 e#=W]%4 [Av̪>T87˲A//ݒw}ǂaWڻʰi&rf~5 4-6>5#N:ʅkjDPm8qhQ+˽d K6ֶiX 7߰ `(UU\r(KXuPӚdJfm۔I|*ƾRz*%z4wfYJۏpES.2 0rʙ{[><h&3 z6>or_|1;i,Kحyń p䚮Z-rv( 9$(^J?Ye&,JEqNv(=B,x?鍠j.G`E ETڧD,kHW5:c=q݇>v ` ^MJ1v++je"fg[Ao;iȼ+1]Kr!.]]i+.gGpʆ$O8y66¼i41ί<ıBGP6ρ8܈j43ąs VVZ,^X:|]w{YɽCBe)GTZ ctr6t@n.ۦXƥP$ZWeVtES %k mJFXz?Mh ujZ?(8/>V#D8a$ldiO;5V]+XԟAUΰ1rmCw7(Z/ ¹pYPEDmŃ dˇhTz=QDҰ,9 <6724taCB9Q艀J] 3XeBǸh UFT2K u?sX>vjnKIyYs0WY]eyzA䝤7zȑKQ; 0͞)hTG?yt `3蝿ʝQg\rn$ s-jkY؟V3X;o#.Q,uSpǽE;Rh>8XP¡}꓿o]K8XEs3IvaN`{Ҝmt.KuK)LBf+T;. ڴ~6^06)Hլ;mBW\%-OC㷗IK:/HbTJjXGTũVdm'T˚AF{])%?"dC-8XpRǤr~f)-hvN+~ cWU~j^pO{+^?J>'ԛt}խfp=x͵هL&˼kS$+J>XDJ:.9pV Re``ms4f, 4 n;D!mRroU]Q?{n҅P7+6-ƛr?z_ D"LBNjBPƔeN^Ki&r|,1hpUR\fAs벁9ev4^>( 'T(6&X*tU g]{U] jOz1TPyȔ+ڮbC+2z4)"mnڕ.Vu5ųQzVjrs\`(Ym iv˲5H^xфqr'r7p:c~g]׿#-/ 2 aּ]t%*'Z5p|TFm1oC /b=H /pjUZ>|Қl$j1]a@VUKRe|}p TvwXn\[,QKkZ"?o7\{ҁW\zP["n̵fҊXq#c6S[/s!t5R*(϶pD ](Krpդ4wmAU6!VM9x"qwN3-ܦ X=ТO&v5rOpg>uRRRp~]n>{YNs; kzٳlIMџ5္w:rZ|ߥVH[# naqIܫflPiDwQt-љdUUhv.P'$d?+!T},,Dq%VP&ix~ւkb* eo^X]/V24z%s4U \ gPBL6BZp5Zk#dRiЗ8 ̣LhV!ܸ0f1h5- , CLԐhN[zP/dV \qʴO ~P,bXZnVyB|5~$Ge),O&F`)9Rk%չXASX6pXHw";; XSVe\;#oM/ŮB"G)Hڨ5ZetI]ڣ*C.Qet|ojU}X `ePef㨤Yw_ϭ| HG(&,l%Uo. M}- G'!r ˭'e.qǽxVn:[nk2)L6O|`GxCS')׍TƼ4ݲ걣&ET""=U2Tu~x?ŹK81{rVQPDH1ώ>PrOUhJc7~),W7N׉xljEXj3tHiAr7NW Q`PbjvS{hZO[: HWt"~lK4DZf&fqnUEat U,R7P6)i; yh[]1EJ\UDvZ۠Bȝ&92"jL[WtʐDU}US.^L!<2ܑ^$:[okFbPLh-ˇ"H,=oVɮY]BK(dCYj(SbcM,ƊD~`Ѳf^|`(<#{# ®F/)e d_. d(. zշvz ۣ`uڦ-ՊLސXቅ[ǐ&v8+kc .;Ch$H W"B!I N ۋ\QmBviJ1\;1Jg;Kh\E)܍[c Y"I:Z.4 PKVQXˠX]7 e3 #m&t*) ^4Z;>|5-;sү="v=+v}7:& ,9{`!3%,'kBAhts/k9k TZ'aKP__)=/\{<tC+}b`AXTm(nU/6Xp?B+q^ҳCbFF~.s*սZk4z?*D" ,_~gjjMuK)J*Zx|buY95.>Lu\!HkڃhϕX*0RFFJ  +C5B67\_\X\#Wa Vغ mG/PWD{="+ek ܄Ik^𤽳aS2ȮXtv=ޛ]%W߷X)*e :XrUXx j<>z EEs%5I+H5E`,O_(` m1vFO7\fsm ]qw!~ 't`S'߮Z*nuS(PZ;ZWvz4׿W_*<3 1Na/HX!a324wḳjR&p*I, i +.2߈&|p1p*eL7śܫkHKr-"ScN;9r. .oVH-1d@ O"t0;xqCE'X6|w=plȪ*oeng`Eq8Sر0[}Ai$=-neu1SXgHjM+!'ī{i>o;*u[[p̉ZG1>tifȘX"¾\S`%F%`/. .h!#/$6 όDhXg dVZԊg; kՒ΋K/F25*8u0HTfij,{6Z%],R|/XqTb +oV`9eJk i򱄢im)§NiFq^Z(S D-Cqkw-Z/BkBڑq$xZge3&8|.-v$SKip?CS|G>cGA|y%/e%j"L^Xc~y^ߕ~Z'UW [^wNLWv7:]i%O= ӱZl,^F..ޕ`?8ri^8x/ u':x:m9 z$q />CD+t']tt)Jo\ÏNwt[{4ݻN7trތ4Lp4s"r$n!|C}1CYW؂8T>9O&"D,p-ezr۷oQILK s2-,<=3!B3qX a<yN}ނ#8&NNOӞx/?ގC>sp(C۾ބ*vF-83`O|gN#Z:db鼥_ᔦ 44%쉷Ӟ >[R_Z._7>յZOuK8͑IsKO9s:=i]>~,z B&؎CvF'h~-|@rTՙJ[nM7>? Ԫ_ᇤs߈S3󏍸z᪥n:^┾,=]M>83ޒz~:.\8雤ޘgiH:?^MC>4`Oo;F6,?Mz{6ǥaIC) S7[Aiყiئz`/WӐS 0j=T3) 3R?! {O='B~=i-/EO^Sz-@Eg@9}Y) S N8w1yHj]{"XkO%1mvPeY/|~F-D0 @CDl][;`E+.]WތIA.=x[ ο/ν[K7‘wp;>8v%׾mGlǫxvnAlA;+r7d'_sWA )O>50ǹ}暏 y !V؂%A\{0\}{z;b;=#` 㦃k>7ni7;#`ci1ؿKfah@h-q8%lƫus%sH=K?p l1]ϻMo$Tzk=յ ] _[p|p9W?Wu=񠨿ԳK?J]Z(0H@1q'GK'^~l !ܿi@rRp3* 1`_<It }SA&|p [JpqoĕuIW?]  Cz/ވ%;[8`8N2^]xb)</?$8+wu;/8xOOY!Wq!^u%/,-F]$qP>vk?_/ ,5p2-i Nމ·+KyfEB[Z[)P#Vwe}Z_'ut Þhݤx 7«7o8ԍ7܏(~'CxzFv7\-w}q>iRG4m^]O~8&IO󔆳ou{qp49fy7 49OI-6_ ӄn1yesWJW m%uKvCI-uӞZOuVc:uoAA׽ .q89o~I' nڀ)^x5>Yz6(Uab?Ot$1W۷O+8QVn!&#H`҅(Zħs+>鲦 r+>pRhW= -.7ZVZ1^M]7ArO&Ƅo`IX &̔L:ltii,Vbxæn!bc:Ud雴blWnA鰸//L[ݛnk {;^: /ݟ?mWwv~D_u~;_ʳ8(@Rw/=" ӞNڦcOO/eX{A;UX, łaTXI Xd`H{X =nwG}_Ϗxw i'11^cpp {؂P؎;1 vHGƃoU U$L-hW0}ILGÃ{o_/7owO+^qW/\so`Sg{Oy+=>gן͇>ҷw^򦋮77l]'X8G01(V@WonŠ9l=YH✠"I4v\4tMuyīxM1_|3>?-5M'#:}7$7&,|t逩OKGq9': ;b짛@>mX{w'o?O^KGNo]>cUť^>E_+}7؞N^WzwW'R<~};豃7\n.knW} \ D+`uq}1vK?^ƒt|O wPx5 ۱|_qs#-x ԰g?;Gxh1}mw_rɻGu,V/}]aҺL_VDWkOu'ȯ{'WW;Mg7ut3Cа?E:Q錥 uz@3zNc:Nx_5<.{ wŴ1SJH_(=Nnёޛ~]zo<0*F4zty-ї^'} QhxnwvҫQ{};leW_o~ҫ2z{ /<I09VV$7%WCjr:\jfjVV]HJ kt2b1Fkܲ 4RmK-iRk8_u(Q釥.ꯂ|BLjc_gmxuЛ%[_Yz#*)jI!fѤ>Xo׳P{"ֳlHM8bZSK.h\n8vG'8i3T뿩ۮs=+ɸ;ATa1X] Bz."%1U0}b-V.V{6#ʚOum3KkxUq sWPuvi"E"ifr WaBY-\zn*b]NtxXpr𴝖誛rit ϭD*GW_r뵷 j0aBbnZ )R,4gZsl/k9.X|ȫCϝ<ײJB pY8ll{ -Z7 wKc pRBTTmRoڥgПmZ綯QI|1cM ңn"2 Pu->(揄T4$85"1̈fc~,=>J<<]=ԴU`m;@\Lԍ Sp2; βsG&dyεZy#VkbҦʈt2{ `m- o9U:uMkoۨW#b;730v\E_6N$MH% Z?,7\>5 [C &saа.ȥ~ oJ]+ eRڙ {xO07m#{Pئ I pvV\^/P(MbsV[J^q#nߘHcu&1@jUO9H' tZ3іۀ_hWC\mfnU ښ$5q(g 9R) ?{4Y]ySBԡXsc=T8)35Ѫ)Q";Zx>E+e_IZLuzĢ,&Cnlm2v2VuTq=&UdpL.z AjV#>vYg[66:2$!6ë@WI[,lc=hpӽp_Cxona5x]A]DTv_f*֤ 팷"h̛,V܍BeiR*g#'j#UTi%Ɩ$V=fXۆW.ޑzڦ虨ش?5 ]]>3rzV-Qd(TD}0ytYݪ[ Դ3(tL,}0|-EWj!ˆU'XŮwI1 덫5.ӰVwX_6ꑓJ9=0H!1щʣ7gG 4L[F,Cͻh-گ"UcgmCn^$̮7wyKUN ,L2/ӯ%r${G,a7m%$,2   Q c nd"c@LVlMTLkӅꐲH3MS|y@hX6맼؄%>:.Sh`^;Y4t91dwjBΎ.|EVQӰ&.K_SaT>k*^Vcv:bt7k5O16it%EfYsh<$!m;I|f0Vna)#Ozn]a]h5"^Dbf}ګٝ34(+%UҚ3 Ri#% ĘJ?&< ǝl|>idg_Dh;z[P5Thv]UQj^Ʊ\dV(ͅQ-V* hQ V2/&KU[LAW6L#QVOGzIPw9IK;cePѕtSNl5DrXnF'0XiHŸT3J𨮟wEPVx0 i2ՊW`9^!K]{dI._C83q`Vב y +UHfTjCyqѶ`~ssBWxFqTCc$*Cka+Fok%XvA"^ֽatS̶T(i FdYC%C6CQ>Ȍ.%2WsZ&2j~f;`P#f@.1-[JubٮQLlYu4%Xt'z1m2 3fzq58OQZ![,H̛teɈ< U]UGj(kqi]R^@*<5a1c EJԕ%fBHY Z ݒC\:q\#y@'؇`):GEQP*^gYo^r4b,X4׏aDQ"etu*~K.Uz(Pp/2Px1YJjJTGf &בDvyvmF6ˌI."f{Ѣu.()tbҸ$8hu`MYMqƧ0@=+ v]P[87Cj!dP$N aaV)|'ɤ `T|ȫ: #^OcQ5$*URuM0'T5D؀ʫk"߳_k-Խ|bt؈p̒ZFm3Pq+b ȩ'޺׷ױZupk4,4սJqI6Zt%W궖ƍ[mo D1X5﬽\Үߔq&ǀ"d2ảKyh5aIC,6˼PH $^xBQ.v%V\ ΢XPO͌#MД*S?R,^سjRpT;cxƇ6\Bڱ!]o*ә6JЫgtER+1BWUC+):EV*sQFhIVKMPXC36'ތ{2N΀u3t&0Zˣ͞g]S~61? Cfc@|iVbsѦIA=' S'dj4P`/Rq38kK&ƌ+*舱ѪTQ #1WWz,9h ע+ ljƽfnѬiaܴn9_ T Xo7*)p`ZdϗoPƽ̴" źӒa}hOn1 _xJ#IwV,&q "0Gg-rt@`e2ʲi| *U3 ~*y,K]c5}弼pPUpJLoDDEHǪ`M*k9Wђ< K*67:CX&Ur&^Fe!dP撰Uw1RQepۄiF0b >o-M j+o,Q!ܠ W-ҁ"Rqe9x Ja*X]=%C|6(0F]$"jdN#"L2`r%}MOV7L'W FB:,,{@ sLSÁtsTѩJ)Gtu`LGQ()5 #WYo(H$ dDY$Kϝ Jk :@; =zbf$ޤˠ0hj4sNƀj**ʌuVq|m]HT`Ֆ<4 74q]-DPh&l(TJsRjx2ZO(&gL6eV*kyMn7M.ju<-ãfͶ6Q"XDF:^Q^1V0kx-!Q։2y |lڸ$9$iMyK {Que<=ZETieЊ[T6^Wwv&c; M} a@t^`e%ς>hfZǨQH}aLf"Wp)rحUgf%4aS0P":兇+sjr2j4ZIKLr(}r|[8I ,9;6,z6]IS-bwYr\U2A*׊c]b_M~62f%L(p 𵨭koGB )X5#*DѿYwwLA kEߑе$K&Ѳ!.?w5>[E󜶌#-9"_*_S$Ue)Sy}fy۞3.;ۨqsZ9\2.:,(t$Q nS!]Q0R832|UnP !ih5aЊEՂ>eUe6ޖ.֬,&}P5dvR0"Un2[Xh۾`ʁt2^yUüV@jW$$XVq3m,ʲB}JtS5a,>!V!p52W8J<0T P!(%NgDJ]X;p44x Y d֨da =e:B7K)F ဨ̭3)j.sV$dQĂ-Zhh]`2 M+ *&'+4DHK(zZºBb԰fznJ.1R)HgA>c`CĊtկ IܜD"[f`)zHlvZVtlKTႽc:Q||^̣g+v@y@K'ړo1l)>ĸFh nR}KI]Vym,`M+~c]mڋyCnIqj4;RtH Z`Ud{T)E[8j(pT:S@A > "چQVCHiWiѤeN0 96lQJ'gWqլ2cu@515&.RG4JY$Y=[\ֵY1j{9WDuBW* e8*8Jr.k.fwfJ: Di55V<$O2GL$&-d9HuI}7`VXUƣKtC2AY}%tGQзHŽ}lK?EQFIQUEW8e]wm V%c v"^1݈FtEoJ"`/I#Wj̢BItM2ZJ2 ֬#~l1*.kG msViqi+ϥ1[l$n"U&`EfqpH"vĮ_>G>XQ6peqA˥I6_ 3כSjиT9* c#jtK1J vIIWvTKԎRA1+IRrd^`ѳj{ I4̡ةtUha#ݰ>&E8K*r\t!).k2zۓspIrrd3MA%0^rHیK Uϣ͕u\]UP1hs]{2C-yJcㄠ@u]0+Y'䭗&ꕎ 0r,QU920ϒZ> *p+P=hNI=D YrŌ 6J]4ߎ-R0FD}\GCqQ??IJb>3))>ڞs=BÖ.Q b-[*ax.oDc* ֙%RroG[GvW*#Yԍu[p+զɨUKeXtȍ>ED5pi-T)`YNC`(E`)WBx?.W:J5fIؒzY2J-ڪV9rBO+rbscgϼ4@@JYC8vf/Pc2V2Ͳ)^e㩽|^mz#72`ʏQDrMXi`j/RXCMRۢZVvY8'KOHuf\94=]5{&5vh52UM^PTqҞ*Z6,ᮧaU,%јel.CȚ)qa)VH{ilEG7Ss=jϕFĀbrPmhkOMMJ DsȒI2Z`X5+а|z*7l jyZ`tٔt)A׷I1aBЋ NX3* ]PY#73jk}Lf95Kఅep_ZzZ9ڈw9ܬkfL>kvYJ(ϙm Xr ɒXCtB9g$.ܧ:˷ kZTE6D } RLHGV6ߤXAVWyLU&_II7(v(](ƶjM a/C2E[OǑp)EH4X+r&ENvpK*G@g UJD5à_K ,J|S{";mHh% '7 %?e H4]JH$5JhjZJ+,lD=tyd{{tйElmH8bH8"f//]O 5MMR'Ƥve\ZO,U.߆a2XDAnцW!Ae VC^yeNDZ()Ov ;lxJ SkХӆDJߒ`虗U&#`Qz,' 2>8E^TqoJS$+Ҫ܄ȖҐծVJCKH+q3>3Ƽu}CDQ9e<4Ap9N9B8̘pTMJW|@D8 2-rP3t*"V_ՎEzlώu&)7*QjJK FL@^>PCڜkRYþhr+c˸BΡUJ6Մ`B!EXF)ZɒABtټ VX|=߉5ȟނtsˀ,00el8hVj'pUj6n%2 &R%trѓ_`9[vy%Є)[aNa|}OsϞ؈ Ʃm{jfT}=DnccB> BvM9 d:!:D4,wηk| }^ Ez /q4cCOD$_}it8@Bۧ>3do`\ 5ܜc]uݡoQ6ѣ|چ]rUDOfIKFco5P>q7TGB4l.nS^'~LPq&MAS,zXRYG1w䀼v#v]i1xmٗ ^Obkt03@IENDB`instead-3.2.1/themes/clearlooks/cursor.png0000644000175000017500000000125413267071774017652 0ustar peterpeterPNG  IHDR}7 sRGBbKGD̿ pHYs  tIME  ܶtEXtCommentCreated with GIMPW IDAT(ϕOHa;*D,IARB%ҠKu O u !$/!Zٙwv޷úe~ymmôYR}s:V jzn<*X4Lt}=ZO2x0z.l,:X[\ĸ3>(o"$b"1i?4;n%66(b 7pED(fSwplfQ%!e>A2u}׎7gbbb~PqxG: 珹)HD udD( ҜVO'*$n}'<W>aKl$2>Yg[~CzzK$IFbJ8D Kh %VP2!ADPvIENDB`instead-3.2.1/themes/clearlooks/menu.png0000644000175000017500000000054313267071774017301 0ustar peterpeterPNG  IHDRשsBITO pHYs B(xtEXtSoftwarewww.inkscape.org<KPLTE˴::: !!!&&&((()))---999===IIIOutRNSx)VwIDAT(ϝK EKiPtw<1V`CO 1NʸR 8H˷Wȭ$mglϭHG :~]ĦIENDB`instead-3.2.1/themes/clearlooks/cursor-use.png0000644000175000017500000000405613267071774020447 0ustar peterpeterPNG  IHDR+)@sRGBbKGD̿ pHYs  tIME EvtEXtCommentCreated with GIMPWIDATHǭkTƟ.WJB#MTQMITc4=hb)MQ@ڔ" (r[`Y~Eszao pstx|vn웑 글!񡞅+jf%|cꡃYV>I?l@W՘P<'wASڽya|=*V 5{(!u  2dȸ ӺS AX VF3l.׷[|D# `}u&sS(0{_fFw|-K1(@ @R0tqG@F7zWDO'͵-*[^{2P@ z ٟH'^jAC>/p+@Cq_1/^u(?&_dߋ Տ}MlXne+K%i*d }_ز\o& ?ײAAlZ8Ue5Ldg12 *)uz?@ p<`"(Nၒ}m\׈,wl$_ڙ^#5Ŧ ̓o[wcæD_'yp՚q/d/3U>~8K"J/΢BKׇyS"&*T00Okv4Zrr.'n+]=d+[?d8BCn|ћ9)v`~,D`At!b/-3+K OO(!𭉳Ƭ/3I#GE.7u_@`@AWl ]+ިnSq ^~wjb4sTKDD@hy]Dwj 6 cm[;:Q:t=^ ַןZ>ݣ>i5q LnCH0uvD2H7?et~ \-|mUMvVsIݮ; <|G CB'_b dmwc^2w7lXmtÅ8 E/6_\rZ'W YӦ4J%0ڑf͍6%ф>aS-׎],u=ubPsQQsm_Ob Ù>A}WY)6(P to,xfo ё əfո ;3wזhW]-B$1ۛo6=Ȥ -Q2{Gk/ Ʃe}8)9`Q999ӻ{䗎Y&)i 5k~gRhG' qg=2q iON,k:d'Zw@-eg̿x%o|Τ3) &@D޽ Sx 7A`P>uFm[M{}EMeͿ I?T7kbŻ,P 0Pk<6c|Nh]Hmcѣu*HA2

]'iVxG ;n]vgkjr^a@k?eR;GO9ٯ`WʺvTHlWI[E(-t# xXǕQD` k;o_[@kGkR0ziv"(AiVW? O`A_eRiOILD3M!<#_?ϩdڽ1N~r~'|(< G.v¿W Y$ݥ~ 6gnpdA?eRviE|Ց֘ښ;;Sm_?fS=_ғ;Dz\4{^%_=o{3^ F]YW<dQ\ڟ"A1ߵ|+J ݑӝ ]I!JwM~+A~׸r??Q ZrG ˆa7m>+3Uڤ$ @տ_u%NH}J-Qp&yR9dW,L\`Q7Ջ~k|OG~O>![CP u{krB_tMڬ'{W@(NfjWM{0#vj !}}E;i ?|o瘑_s?#TP ?bo·IWr[ Tvj<~:hT8 J-Οq#;KψQ?dP#ic  4܄v#ֶpL34oO~todN@c#ӈWa sX Lz|C=Co7BGopL%1s)ޟ~^,"F|5;{碑_M|tʧ=SЊl?8^\TkH@m=O  Ͽ*M1 9 l?8;_ ~^@"ybG*m&hI,nbo)ޟdPA TB+Vb{qoO~sd/PK[P")>K;Lu$JO(:SoO~uo'0{k)P7ڥz+c:EtyZ)ޟ~^G1Њշn) }M!z2{c$Vd/PNl_OdV PcPl?8 5TEo-lvn>my&z|C"znȬdOPk E~@'TcΨ&TO~po/c?^޷ Emڽ`KNZ>y$|C-ڣB#Sa_7Yqw֦jqMu#zdlvp>Ⱦ0>MN@ƢtuɆ}i.R~ei#xQڽr){g>r+Wv u7O~v/jcj=C=sX-+ ѩIHMCI g1dP/=;SOH&j.nN*m|WsH$D}C&?{E~$`dtS $)R|W+,p5Q{v/P@" 0$]tn?|Wog8;[IH{G2z^kokD:T~Ԗck5{cP{|=&gY =~[2qc+Gn’ˊ#9ˡۭG,m2(ڃ<4k04Am$4]h$N&?: ! BhqV򪇋`&6Q-怱`d* Q'҆́TŁ)'Je!DzGjDG=L@P| I,\gǩE&czFH`VhNL' ""D(MIWԣ$=>UYc2j ?Bdj:l9f A;0D9TT$X4NS)8:j\0FղNh1;!81K& yQ=n4 l:ұ&&J36MHzNwA#^}L(z$2ę^IGUTdܳLPYrjy(tԈYMd>DE.-E",jLQ#փ$~_JdفCMJ\OJh%xqU$DΉBu 9M,PR7,'#4m7jL$D? (ΠcAQ.-hfm:jF⫦,D'5TMyES:ݨ [CŦ}fSrP _$@Q&}P9b†4T+eP7Tͫ<*>"zyH`C>>֊(,Mq6yU*.HV9Z 2îՠ qBE> (i-ͽp HGZB8 <Ԗ[of^PVd˜&UVK&nx$ >tA$EsB^Xճ(QARUvpì lA@,2I"1*vGf[g1T#qѨj2^zaEI6$5Xt8M<]1+ ?ͩ[CDg2~FŘni#{d] FbE$H<ɬM0 ϙ X|r%ظPUW-$9j ;F+c4坰̈Ñ]zEh @ǜ75"?mI=&".ȩKyXM/b<ݷQA* Q;Ṵ&Q. dMkH4^n!(bd@Qk O: $2֜->gW%ĕ15*\&1ӭ(L.Hu2 Ĭ#U̓jbIϕTVd$BqNb<˛fd'J(R2(1DzG$OUA3#ߤ ~*}U]CsFsW =FP;Ձ AR65lP Qk#EfTE;*ȚBaG2k+'Bci`( اn 1sޓ ˩E9iRn+&1󦀠3Y;` dr@4<bE"pn&Fr*вHF)4Ι5Z j dQKUX Z h0w`b}җ8OJ`H3@qh*|Ǖû` ^1@.]6=KyY;5f@(5lM3[)&d2,BRtŚr PQ` 8o֘3AƠ^U³XUE$^74,H) zR]9'S3\VԌ;(6{xb$x@hЊv,<4"Rb37QTNZ]t)@2VLQZ6*zj6."h݋]UGJߥ 5ڭ<fbZhc{0mECA v~QAcSIjxb}jɣ*|Q!Z@RNFh| X̡0UC1,9- iW/ g5fK-AC AC:UD=).楨{`+ J Uoy ~z7cv~amf?RUU t~TmY^@,P BXfV8Pzf1 ioP+410X*aAMO4[llPSe:Ӂ&χ43? C{D 7)A@҈, =ٝ LXC-J<ڃX'cF`lM/Ap!bPXM'*(LC6̌Tʭ/;WP1@[OQ聵- S>T%A"g"XdM!0#5!C0lSZ|=]gwR6=1a۰#Ȉ^MXXVDP~+TuPķK vSs1YQ3NJMFԕӐO3A74 QyDA,;S94i0B&i׈e*wJT3@'xQn6ta@_h0F#@VP0LΞҨKBU]@("wTt`tA y]EV"N֊'~t ,D(3$\ Dy.@irnl0Q|TKAFFbZzjT1er9 `Tʠ @&Q 5P.z&hDϞk8} z>ZJ[unzeb-Ԓu>,U5;ѯz78Vb'&IVn!XJ4\:&Ƥ:RQq#,Wp,P6tͼť@u*;hU# |!J O\( KUT"[Űt-9tX`{pJ)A4@E6 Mi₁n_/#ӏbS$z@at#L4ޚM2W 'F;J4ᎣVAXםTGISVZutF IFYH| HP2!ʘR2+p9 '3H Y8ciVʑwNTho>B^P`!LP>8zS.UKLB7zu`zn*+Z$ZXMǕT}+I0OJ(I-|3i, M7.DP?jIG4fRChH"*yMc Ӹ5Lrp*ĨJ@C ,oUu:7 61MMM]57(e* ͍oC:͢Vkf;u!@GkzTٗvd`w!b|Md*ww2K 0mE IR;;ہh)3ň=uPUYW6Bւx >TH݆ lb)O:e!X`+gpkb czd&t֟*%ZTaJX*v4;D^L’<!Xun@!d)GO(ň^m@( 6EMyP>+/Y](!Kʾv]n¨k:3]Tn,Ml( C XwջRLdҴѴ( , "Nw2h_NJ ohngSpT Eq@Ua:i|k"7[FkG*@J,Eʘ^B@ŵN/@zLq%tme *Xݏʁ8'$dZIFX"]@!@'u>32zfycJ#Lc&fz2cb!ljjցlF7[NkwJ@B@0#p n hv)"#ފ*AB[rF['Nӽtp '0P$`- mDAA2Z yVR xzX-AѱLB6 6q ,@dh YNΤUCaOӊ[Qs3D]&AOIt !ׇ:jlÝQwCCA iᬊȠu@ bs,2ڒ,҃3NCAhFǝĈu vkxrO)+ K)?*'T4ph$;tƪFQ[*dz:ɭ_V;@UQrQsf6Gy2zP4' dbjC^5XH5~zP9m6`y\ii[Q±-V\g$h $ɦ'9IE'X]SۈmRBw3ұpUYQ$"üւh!8mnq"`ޏzKq5

|iFjװO'|{5,I<$ǝs^M ?A] E[ukÐ+$d荆:ErxߘVUbA uiR 2v zI!s3"gL@8ޘ;㙥bDJ&7Y$ "2ꕟH$%C&cRnNdV8HR. dw31 qMeV2&@ړVMEӜDM@Eb @0ۋY@6TwL((Ȧ rhHX`F@F0"qf?RV1@Ox P%iCCS%jzuu*h2*3UM]L;S y~Gս6I5}ީ3oW%TLO>0N_:$^8f3hSYTYMzCÄ9s*E7pj)>,ǎqKDyՊ7,꺀/ ",?3SIm0ͦXi1v7DL Uiaŵ$Z-Fb9!Ty8.|"IwTeqUO2sJͨ=|Sw9sSE[Eu#;4Av7Si bnȓ',}ցؕg-"ۏM%91X֕@4Zp@RP&M@ ?It!򪏰Rso$[|RFJ4H&T 萗AH<-@5op$Ƒ`Bn<[; ]:jʁvTi9P'mEh^~vДޙIUv ם o+.:`Mni4 d7 1ޔ &{SxAέޖq Ӓ}f5 ueGV,uw+\?H($;&EEX܁% sZE8R!L. 2zTY)uo_>ΒY <'&#mh ҳ ֞vwS4d7*9UGq} 1d9WB70&^t|+qgKjJpӅRĐ;*[X N(#⬄rmrdd16(piArĴE@ӰF$.sKZРgUF3"9#x3Bwo/F"` g:hGJ[QC)Yzo[I-Sav(*r>u1WF[MB'mXJ#wo4:|Ĉ&0qUn(x i9 YΚy1Vc.ґ UNM JVAM1P5M+wOr6+D.f4v i!rhI`8R}2xSfE~FFq̖Z%ӵQԾM"\OCXZ]YlQGb y.MX;Q҄ހ:-+qZJް:s u3DžGn&@>k u5{)?m*3wP-U S 8Hδ75Y&H"6-ǖiXP bk3#CI@2zU2̜r"`X5 y0#~t[pG/9ib\[GP䭡cr}uHʃ#XH"d`T{}9B; ""v~TB3oY#QWymjX 2)i !M5{P -Nk~,;Pc%"}[nc NyS nf1m11B 6j ߼MA܁h*H@)Yܠr-2q9dK/] 3BCm+% \[z%*T}}@U\Ν8K\ئ~Qob⊠I6иHum=M8vqH yV9s<@@AwRi'@  mt@Jf*A#4u@ G8* xE3P`Dco:e8i@XsA2Α5CMΙdxҺ4 i OԴASiMQHI:U@ y9uYtzց8$V]:mD\ , *H&"0Ahs4@nj<*vu:LZP'T<ա1VU tI /vm4ʬ|1baB`Q#Dз>k\ NgPΫ;ɩJٳ-6i}`LXsHrܷQTeP89ړ93  oA">Ya+ OyE#AEBk)F67@j;+pvڛɬP-kHu.&ђ r^FhV* ڃ}2¢ϕcވPTޯZD"a֤A=PDqu(9XŻD)Pw aEaMs:b|ڌEt:i^֩GO45 q4Q[e}fԩ nCz .GJ.i>#Q `|*m1K+m .Y&#j2CqkD)(ʹbdX+4S:I7᩠L3AWkw_ X#o]sjv@s@)K{-armUOﲘͻrNk% m1W/젃װXX[̌kRE؁*$u9X&8s:ʎ#>!MF7W0hΤ7mP{ 72 SPGUVsU9jlMǤG_N+s:ւI$ c#aO 3h`G:F q+]h޲Fn1@$AxNE#0`-X=M[;48p476Vf(>WP0qb.2b].b 4RL.#j?jUAYW$h7`P "kH2n LI)H9iۮh  mIܑ#:p`;ҀL@H}l$v d^ת@DB@ڼ?[d@j}Qu_FIAQ-RL<(MA0Чӫ!r9*\)dL'Μ&/ h"c@ -k%B9֒s2.tXOn @w! XHdlQ{N;j "8S.pEfRsQa]@*z: > yҨ xWʃ ݶiF7<.XvL!2Qd^EqM l?J5UpT] b`X:3@YZ@5 U<: Rֲ.@R˖XQY Ee *4-bH&nڀR噔Cnk& q* _n/҆k0ӵZXS%juV Ek ˝9r[E"Ʈ#xnZ9o<}#EM ;q'.FL ڌwzΚN9f(} >tz LL,G]%2oT2* Dӝ/w n-AE%5.捣ts%D4YJ#P[Yp!.${ZvCOK$4NZ]@f]pMfTbuxېi6M O}4oPۉ]xc¨ r!1Z,ӵ-mLdfq֠ѿrBV 29$lcac=(33@fS*pк{2(29h\(2 וA2FhkҖLt֭4HwWd+[1n'7n#jr PTSH ƨ7E[77`* ]"L puU O*ViaZ5^<)y@fkq9lOh2y@!TnQ&I cEm <̟ҒY ?tR ޳H_K餷m2+!,-#4@0'ݥ(a΁Pa$vJv@AH=(d^tցA@AQ1H*ǖ $_::S=Tt!`*`P!X4Qh*'I)̊Eu-QXbe*: t񺚨`P=2$\:T:{#5& `d4:PVK mkGh0vo@%fZ䞀UJ^ҹUH^Cz). JjPlPv5Ġ/NtL f-DQTϕWcsBQY"o`%֬::|@8\#Hi'=(a5HtNH#LgoҲ@sq[RXtېެ oAY2$nFpxgj ,#pM1*P!q@kwehhW0 0j 5@Q@$xt-f ˭fPNk0x tFIS [Ʌy rV~,j"M(U7,Z0BP.-XVdT21udf`$AtdʒFǧ΀IVoX1E3ù C G:eu .u^~S70v |gFѷtZcn](Œf7Έi'*J 0}4 ?3aޔÏ2U YruT?Pa∕^ZaʤArR^`Ys`9!E=sֳ? q|(ZNߊAUhˀ&@4xma$cҴq!(eVΧ3Lf  Rmk;)h :sT[iU Rȣ0Zs…Cs4ᕛ?*L1EDP0HX%- yT؝EK2XJ1̚ I!d.KF$2ލ[!|b j+"peP[n`i8:d;PKCu5tɺ֬-L6 4Ptu-Kuͨ!TW BGݞ膑1/ DADGj(vEe#E$k`rK+.\nU{[SO߁TxSa%z@5mKh]4c@֔2.ti33Iʝ^ToGTf2JE10aRs.0:Eg*J7 xbx&J$ރT$O֖QR0A@N o*ŊROd @~%KO I>7ނ'eCzgʖ|$wʀWFvTyKu ubf |X HS vn!YX}NkiP|[p܀LDfM7I$ uXW$B#f. 1$%`Hj}\0i!wɬ@9&kr23Xr$Ccs\A:*&c;#Cap!S*A+'#=jRh`yIȬ9[;ާ\N>E2F? -DoG2hcoT #~ʤgxA)*B J]e#sS+УLT̈15-0XHx޸= 3*S1ldb\W=#>l?z@T9vI:MOIE :ξ\sg (E0wx!4 Q ªX-SYfy68@W[yP5DŽXO:^;iT*ZH htB743n H_+p]̚ 3L 5 ԑt}a(Qm+FbhzʹUO{6>]R }k d諘 :uB!WʬNΦeN<iFf*&qҨ8icHY`G(l0önLjѸ#5C¶TX7j@ f3LE $o*(LB_: hmMn|y-&6LI0 c48cDȘ(!ME}\+@#JʚI T!&wK+3z  AQF,m4E $Z`do5@dDN[yQ!1i`IQEa&O΁q4$ER'L 9dJ['L_./EA dx,.#Ej8nYP.i2*hԸ tlIdʝUuJQt" "i'hС]Bm?:ʼn_PJK o-3@*e URAQPiWɦRJ.cdaVB2Rds+5tU\i8U@xI;oʐ,^嚧u` $؜)),W5LjixHgw:Kij6v~c4mNδj(kwZm*tTVZRHv7.?Jڷ&5-E`G5l7uZfT ?Y@n5O"qKs:*ի8R{dždo,[Y`Ҏ5I |6IB3D`vLPT&t^34 :POA WbVtGU⵴U?e$=ظx1le Nw'M@AP˹a%4Ia`Ҿ8*H)-MQSu`[ΓI, ˂ǠނN5C~ЯOF+e[LnўfWnA=*k'X`(1@T*ǭknQaM(vCրIԒy ,adj=Z4 ZG0ZnP'5fwn"j:ĹdZlDdHVTfZC$-@`7<5pAza 5[' #AÙe1LBtURD2)-5)ʛP2}i_":S2{֑Jb~\Vb|f&OF|@( +(⦼FROA+j>3$uV2qX˭"TQ"`fRAR'p@A- S":mԺ(0".uȡ+`B<8 K X-hPqFhh J`X *ЀIu a8nf1H ̍NT d(5"E?}3PeB7<8$[pAְ`kQ7/^ϪފYfGY&r㝺Շv&q?ҁ*|*uD"idYRlZ&:k3BBwŞBXc,W աg$urξ:lQsP|Z WrnP xsX@K6u7++]Ů?҈}Uf0i4Zjk gL,;s"`!ݗ+9 W]CH9_TK ݡiNҍ.)Ĝ>u ޕ%b # ̅J(5L@t't XΕ+YEd]RME+huKI DO)de'E4%o9t # Y4MZEJj7Ѣ\xwLg7>)h!RZw4{Lqt♁ X{f?JQT 7P'6Q&pL1ҧezCx袲3։`P,{˘87?Kg@L=[T"iI#Q3ŧf(-iU5mKx]ʙ;^8xLsi443OH O(gs)ISQP5˪'DKT Jk[mchF4)QqT+G|Y,佳.&Wm9'θm÷BkԞ<d>"s˵tN9W1쬟ϰe$dv*[X1mL ӕ.L;2wkmUⅪ 'SHSe*_,P˟*0?R7{U:tܰk9`R|hcMJ<ᩛ~᩿{734躬2ޠ/Ψr_)a}@ѱU@0JĦOQx.-pK5MhkcsTMo [Rh$'~yEXhzMY? K=&).aM;V.,V̇EB[H<ޜii&abu!]m#{F=CH:_u)n5&q3X0>YCCxP:B]nL,m[tZo@.yu\ֳJ얏:UEDxΞm[b֩ Z n' !X(Rlmqzf-67}9!m6Aa qTdFƙclBy3AVb/Nt>W(ƟCX.:ܠf]@xY?sM8H۹4 ⴌTOiE嬅ݝQcŴm,SPy߼lKa ~ FFn VeZz*jPL|YƉüfPoEenWfU]@UW AMm)Uf*e.bBh< ._J> 毯='G4ɩ.Vy5+E* Tj-}A+u1RnP\r$dPI:ɒ6YZf@T<`Tʨ[N!*7t:P9QmFs~u=M5exzҘU+&A+JM/>++1ʄФ9<t L Q'ӑJUD F:PmU8؍!USa4@ɺD*̪5-50bP W\sN`=i 4nR#@+1hU 6.dhH;yhu&)a@IqmɩkH|J_?JP:V0Cf:t}?:Q6({Aw9d^Q^gW!VD5zުiz:dڵbz4['OO tj/UVUdqsQAb.ޔJ"G+ƧݶŊMfgLn?Z  GŊloV]0Unո:U[CRPy)]Z<-*[ͦ`u"rWUh_+w<%qjhAcOF!YVT<0cꥭ;Rp-b*Z`YpX&z]R #ޠEu1jb4 Lwbi(+n=٠|T ŷʫl,. *ljʓwv_6Ԫ3X־Ŭ4Cjpf*[{oErjW*YP vppJԸ| %M3 xՅe BTȩn\]UX%RyLU<~|TX'(f k<4"F7\6+ԝ3ơy ۪>* 2//g`;V?yb]5M憟vZSJ?(>Yfj_'IxUN幙V&E(B-P^oS[tҙ{b\E>2ژZ|0mEo<7/wՍ1l6L\!o>!5XT[Xi}缰o+GJoo,ZQiuLu:vpmaZ޴.OҠ[ \B? ,߆''ݬ̖Z{Fn=%"5^a҃ CEfbOS]$pJk5 YEӁ^f\/ /xp1"-hmd>L-Jrqli\3h TVX΂ڣO:V.Oe;օ%Uk$s˄.k"vv]AV־:usXNx#@+jj.Ṹ eA64ګ";^@Vi<ڙ@xRLkG fh.5Vvw&xn=)oeW)u_)VSQxc{u'{8f@E9iܘwRӰdd"|I k6ܷAVV&)T@V3׭50f V܁0(50k09Ai47)?m5'351 @K9< LG2QPԐ*0rFdy6'mA&+Nu 9ʟPA,0 7dzԙjp`;ѤNzEH#<9rYQ9 .Db%wNՠp H &#:>KuvP zŢG o U_ַpjĪRU洣} ~^.tu}3K? xTOonjwi@;j'8[[,|"lʥFc~k}"K|BiMdžR p9ӫ+{OnbZ$㧕3ʀ ̈,ɓXʖ~!ցb 3KAXg5Hw75E}(LU-;&ϕ 1܎T\(p(EL fKl`Q*&(LGMҷyTe?Q AMϨh!LYtLtůFEfbN6`@>TC`Wh]wC30?Z n`2*%,{̎F2cNI1KE-TYb3hH63&yV,CHau$HAڙ1u]?*8`s;P$ iA܌V 1D) 21` ri ` <(%+,_vj|KjYk\ۍ_27wD*=97HhY7V5-E{ME, wn4}m7U),׻eHo E--T ګjMޫ´U8~iyV{5ӻ@dGnTX L)AƫsZP(f_U^2K/m=RҔR3[Lڸ Jb~B[.dj[sh)+uMf?()UMطPz*gy497xS5UV:Zj98QJ|4L[J8O4|"ZK_z%hFT>u{) xy*^}Suh*M+|7 ^kUpimHc&=A4kUbW 2-ξ~K@װ1׊2Ge?uԷ] o8KY[-[zPV1,e`*[n'6Fo+Teo*ܨ ƅwYx ` yږB[M5{˘os2UU j"pҾᣛq/*f`)SLn-RʁmQ:+mQ:Gbo@^ tT'_wpY{:MMl"mIZAm%feBh(5Hjq 7SU։A-wvWP5mPYk[-5MjRx=ER+9_Hٯa57 }Rn8BeY"LαBq*aM;ȟHb+N[$ 1H$]Y!L(pp9suGm)Ԃ$bڦCH@0GÎPIV D3P2toD\zd~T !+p%(FDEpLA;ӷ DJ#gL{qH+ 7;'azi\xvzxa|>V 4 f@K_ kG Y::J$cEٷ[䎔d0lȍm$_*kx3@AbANǕ'nU`Q#i?[(~F`Py>=_Go%[Oֶ g{ި#"s5u"ęF)ŷMA0 MEL&UyE L~,SZ4 @TڍQn=+ZD =aFVr\P#]6 Sk;h$T3jiͳ@mV) 4 0ϕ%w7;P=-^Z X}C7f]>+7!OYG]}630u^sXmKڀia-&i-ӡ59zk!ґNx$[SF]`b[QLCQ:iʀʜI";dy(,: +NvR~FXW@|f?H=B#5OTj@Qex-Uf)Z n{V2ÊU Ś ek} 6Qk)[ʘepP 5n-y+!]}ځ0cqo5kq%PCiAt\$@ὐiDw2 rQM m qC+,|6|yR1'ݦ{'.9oӕ-^BiΜaLo"QJӏmeYׄ41645q[T/=ڞdslPL+|sjOt{͘.Uчri5[!Dᳫ<ӫN:!XrVF)Ysj LZ:%w (E)#MAS @\{G!T.7Nhxm]U:yԺ> 5|&ly`u ҁm!1Raa5@JZP3lm<7: A|5YMnMhVl0^7ezV0QJv:8ib9RZLpϜ m܊Ql,kwj:3[.u7 ]p,OJ'I!q|Jx 5T|i]+txNJimUH0zց U-H6*pN/ځhfzVx [hw`c5 u{:$wpKe ģ9X$շaAޜna 4=Bi ݱ<*(BȨw.рnuGV3 TUT$Z`k64B<)2pp?QYXUMax+|" #Q6C v #QS@ȽRiJ0kDrݐ<tݼ^Vj+.yPu5Wu,2cT#XD0P`:l-r[=a d~5ֲ5kW.nclՎ{(װ&?rN3޹dg@?ֺqinR"p,pLΙG s0I)u 0VXsO2qJP-'ފ)YD-4ͫ|DUQ.(ĕ]M _+R%%ȣt›ުX+J͏D|H7iۤ~f:d~[U`AɞC(`d|\:qvC/7ok$+ëcVD%᩶)vUKPņRh2j'>oib!bT!23) m*- s+H4Y)AIZ'`m9]ZYJhpHK\G .Yx0]2W1> KJ A<ҕDu3i-kp  'i4`[($U]c8?Ql: T M@mm6nyn{DsClGJmm:-8^OJ@YAO*sJT u%ŒuFʁ+#^ Y40mΑ% U~QR:5ۼp]N Zzи!~=ꭲ<'y:t'vi0NJ1i -CUE&umfW/5!aDc0W7&(ηP2:GRM7U`,oFX ;V7mx.uBpPcw*54AA+-W!Xqm޻2ӹa\c%`~t9d=vA?k`bcz潓 kXUuQk6q""إlĊQAmH.|+9<%M#ҘjF&A9`i IYd|逦HAf:.<)L\3E-* LyhԘʶA]`A;e g8jX!҂$>7󨦸 9Q*Lʒ+iIT"Nzr!JNi=iNuEnhVIY1P@ڜn2rlp@mq)Zqv@LҕO@ i8$ُ! K9چ15 Al."zU'?"L;O$鈳jkOL|Uz=L#-58źÄ\lh AqR':(ꃡTOaP,YFHi_< FliAF eC2OVV֒>r @8_ DGbIrddjJ`m_\P|WiA! !y`#q<=K5 ~^TtUI;P2A"y&S$HXBAb)cmFJఀ4'5Z kV> AP 6y{Z ӕa/II; @8Nr ԸQbF*8+8A2bEMؘ$:Q.YB#sP '?ҰS96F1;q⁀hO$8g0AjL0:$ֶA961,d¬ "h)3,;yUedHC<fiΖT&AA.H\դNQ!=E:1P!06D|ZNj|5&)E"$O&8jw ((UQHJ PҘj05T):! hʌ,t .(:Enʰ'" R|մsymOA]Fn]:bt^{٠ֻj=67GHbtFJ]FJ95Y@Xn4J'Q~u;*-S$Wۭ>H 2&H8Hff3SF[3c-H*РBMU*"9Ѕđ,&YK ک@، @1Ҝ$JvWˁښ*R$GC]in,ή^ӣ6L< lyֻKM`EX4oJVնa#h ?֐&JiPu?kDB[>UK0iG %e`DXu0,!"ǭqٍ=c~ t\gDe ǡbus^A?UDn\߲ٯ`QӅɃTfj֠ǰ1WPZPz' LW l٭]L qSr9W̧EUu 7* t+6/5.>l҉R -`gm&O%Uiܻ[wF.C&9Pw;& tJZ?:8 i+} ]KDl-[u5eeضՖi̬A1Q欤`i.WtQYXC+"l P<4muTl7NXuK=qZLܤ~,VexoyL[SIDAXSαY*ʶ~uI /vy{HJ<54iiۑL.U#?$:֟R`;|pkC]7IV+@ d50 fd:1&WNX7J) z&*JЅ{bMb*ֱx.hJ,09S+ X\Xo* `빦uQ~QRC|?R$\[&N<&M*uK;QژD7aQuTBg:):F(Cxxʤ[SWSC; g.(6H=/ EB-Ht7%zixbv-R6 ׋*[G`݅SQu4KW=u=MGY[Qd]QRh3A2b0+f7ZmX XfwV h^;N& aQ8E܊ݴ,li_#QXAQʒ];r]R1,nڂP( \\RA-V vdYYX߆me.9-u G\w`Dy&u&?OBӰ[V|*p̻ǢNAY}Y[xފH @R8gh"cQ0Ab'a@=hF<!ؓI >; *Hbސiǝ7ݐFǯΦT3q.Ҩ]P` .Y/ "B7,K;Q OtV&N>TMxH@-h"WVk1'UOh&-)OQM5%4樨 `z@$@@:PգP/tKT]|F*zLjbC:0C)4^;⭨T]Eˊvn=Vf@M/oG&gSAP+}$ʠP)NzUW:MK?|JFaPfU9Rm.li  iQWPg* _ә0(:sKt@'SP tOI;fcWKiE:ss f uyo 8߄TMY@5KtKu8_TZ@:nYUNxS.zjW2]:oҀR  8t5rTt˩; K{=#6NxZ˛A\wXcvCL(7RDzX= 8ITg٧aJϢ.+*$3 kTX4 p*2R]f~W0 'ʙXJk؍ԇh+MKq&8F%QzDNHi1avXr)nR ,Mlm\YXwOHg&g]+!2@]dr#OqSŚ Vb&' 7LP8ĕAڢ;I'銴KI␻ & jݭz`Pʲuwia5+Vb6^qk,j=S }.p{ٯ֦Qz@Y-{&љ#5b֎.'*:d.eB:%|A"X= \(7X`rxL,?| @ګivS Ic'}3sM^#e}w̳ :P-QOSNPxQSN@(SM-6# 9RlMҴ )J`A$æqj b rBϕ8at"e!Z0BuQ06 pQXXn92'Y(iCt0H CM~xg8W(JѱnbnM"\UPzrWQZ bHQ2j佰Ok`*-apثp zFMY*1U >ub2:r9*nbI&,EV$ IQlȑLW1VS $ Ҹ fGVUX 0f&h4.Y`twix<%ZhccLp~ >5xT@rߔӕKT6۷ SpI恁ak 5CӨ ҈lCtW.q[P0¯4UXʀ}.-)*.2 tK#:ibAT"E.[pD d]%7ž1J2:QV  Te_iu@m!v"= qYXSul U/xCAʅ j@Y@Qp+y#ɳ@;Z8r7 8S\BX-f`ih|S,]T&hmQivS"l=z8I8 6cikzXChVIPoB`~Ȥ,ll{)װ Ϣ.+*n'l+6ܷ^"7#'e fCYSl{Vé#ny0iS d8G:c"nx|`'qp3T\z\O!XbMs1U #dgʕ]G GjܐɋLLht&K2P- < 2T^6m߹"*"m$]ϥH"IAI&1.I3@Ne8\ V́S[3w`WϨUađ2:rq҃ ) Uelb9V $uؒyTL# R2 ?Ԛn#OpӍx^4&!^IwOoάquԭI.`mMI,zmCI>D慚T&(,N8I#sQ~=c{Vc$R[0`3A`5SIH\Ti-$ aq@`AT|4F'"Pރ0 nsϧd excY@(JHm*U"74i#΁`w4~:c҃ MTZȮ{ևc~8ݒܖip7V iqj[U\s0Y-#uՔ;niuʕ`wP#&1݀iIFxvLP)yuIH1@)q4琣z?=)eַPPBh")!թ@* ijai;WO}3K\z9ԻPxt4'U=D_&L*0}OX(V.ְMFB:o@&675oPbɐmA4NFF540F+G⪹\ʷZXSe P?v &;ņ|\$-bk(h#\nAi ]IkP(Z) AF+" 9 TB#>liFqoBuV]/R<[f4iDTӀT8#PxadUKG m3l#z[: J5qrkhH`SX0 dq$t 7`@eSS\OMp6NЕ@џ1@YF")[P4/wY}t AHvUdDn#Fi~p֊ +yA|jYm2ʉ``E @.PA(0nf!6!;~F$6ɨ9 '#VfJ.B q!7 q%^g~VML-'DBC:N'$0oEE\EX(j]|kr3ʤu4IeqS[GB( 8rƆ\2(wX]zɚҸ1HX.A3rMͤteS!.u.z@chTZi~ V[v3`{@_k'#<fHEWJOxeC`\ײ{~ӕ`1m82Gh.Dm"@jeT`8'bn'L젔^j-n;"TN:ޒ\!m:7dǕ> ("Uczy N1ʔĬ@U@'zR Z@ Z18m#9 +hi9\V3@T6H*dNh4iك@dQ; 0IUTI\@aHbdbUmE&坾`LP.ܤm5%a xy氰GI ":9Q YM";FjzI+3t*Tox|@T0M՞pviV/ADA("I9"<i=B*nT %[Sq+O΂9Q u@`5zLlӅELT$@@3@јq+!Q4 ң2G*mFPOΥh'>\T\@3PU/SNir'ʱe C%M2IOBMQ#E@6hԒڍhuU)#)!\ۉeӐCdPP0%Γ!ޖI(*.Nr7T:Qp^IS{:aՠCL Qy&OT p%J:VodR1E;.Vs8EP7">: 5<|?.T@U'PP X]Su5$06RfekFɤWM rI_i"yf5G!FK&j~,.D-*V)%ҊF8*GBh3*ib|nr㆚ZQ, 2z=.=igɔiJcF0OJO >T@%1 :6@R+pRƱo#ZՒۍϦ` [OM"Ii B4㉎ni444_[UeS`Dםڣ_Rdzz~'PdzRh$KOSUnE57*#bQȮMSڢނ_V*rGv c2mB:h5{Q@2X0J\YWXjk1?[m5gHNFXn@Kt9Dd'SթWM |tŅd0^F-u&aj0(:eVFO_D,P[x#D.7D#@diX "["~|#Ú-%庢 xyXH#Χ(7xY6eF&ؑj5=F$UÍS*ns  {0#@5Us d#XDmUa'DfVgʺ"Tg<f@V'tx[p LLʹ $<17KFՋʰF65'})-fPdo c XU`pe)OB aʤ bsQU\狕+(P0sAX2Y?PG"k<I5*nUݘ" FMYݕ`P /Ef l iR$)Sg |F -o5i!S}7 - gyiC)2њ.u&Rd|Y*N!05!8Blkx8ATFgz֣D>t"=hXV[Y3HdmӤ .75B$ށ́LSk!50T[@*<0/ͧLIYݶ~*ڵӀ #pRf6qg3;00GL&6Q\br~ٗL{0qsz#yZuZ㽳c6Vx=4{5)q]0Ĝ9}۰t0 jX0$O1Y̑ ImR^:O>y+*6LMi)b%r:`$rh*($/01#u Lڞ惈uTDsޝ"|Ikn!P@CJHplu{*\A^{St^)R%Idi 8L#Yla%YAt%S)R8Ṭ )h 9A5b$T0Yڝ,.ާt,N" j4nϭ92 g 'ΰ0KI'c@5HjB&y0P$j$ PBq/G 7&GWQ+s$.MU!4EsZ3=u ΁9^& 򬉯x61 v!50TPp2,@CX,ӝD}@{hڂ6u ;#OM;:KsFUK%B9ʶ_*6\XlhȖf"ѰIA&XrPy.":2[DiiMըGPE]WQWם*M(\#1Ѵ83k&[T]֙B{j`!e-xEBOΫdJ`yck;{.[(%p֖ *yEVAu4H@܌`v 1e0Z*a8E?h<E Ҍ) Ce.PV1D(;c5%z*AG tN@oZ ř 1IT)QwjRCl!*5 aŞ{Lr^]OީXD*6e,j1nB R߻aG :(ĀgRNJSC]N\%XIPw`M1jVb`t53 S[UiPaUP:m%vI,ZcΦ55`@a UeJd,6cij*`H(-q)R9Pf,n)`U>2SFﵛP>v ]Cj*J#Q`|4UdH  Q!@{I ֌ @W MP혬. ,\1iҾ:$(lC)h$A1 :jaA=+j"q KDm4b,3;1Ym864.󎕮ʀ1ډ!$tJAY@Pe6(rV։en_΄30*-V` MC-wAty_:S A(ĦHjax/ʂk/㍮L@2wl- L 'z 7}+ʪ˻}},Nu{e!Ak'/9?٧a@U\H{)o5AǢG:udonx[6= [OH&7 f75a[eEL4N.\bg{H&XAʨ w . $2ޘ@@51p|@m1&Q,(:b` &E & thLv0 &J,Lfo( 9(uPfh\:wJ Fv)ްʐ1D:PjlV A$(IPؑ`TY@'X -Qro5:fI#^jutÒWtkPgU9WjH@7dm.BJ3=teEILoQA84@2 u_{%:6G@VA<+݊kJ^-E)]-@@1@F"304$R3"\un]@ìJAR*j=$<4dRـ.%jX7Bj΄hJEKmcGwk5|C(K >T%@&[j̥ETСpwT>ZyW^~Tci+Og򪂌#y/hT;0;L*ȠMW<3f[xyM+P[Lkʀ, w=)@"iKA;F=h*p5Aݙ}3$n@SG`WKn1'zր A/ru4m)(ân 0q:V ׏t[´[LH/v5=VO;2[Q3(EJh*m6%еt$a8鬵URZ  ,WU0 z֓?J:=$0@M,םYnDl*NtS670IA aMr1ީhVb~F.f_SF.da)#iU68RnDP+u$r&N`ԍP5 a^dϋU ʾ=M=;9GB(QP"n g\tL&vaH@7y{H4ɹ@B폔 1#PmVYacnq@ @TETrO  <m:di*|&@-fNXN*6LJJͽf8 K4A$ӐHEfq D]E"$h6U[N2Im鏾PP#9UցC6#;yY: V -oO*Hc|vV%a Q`(d'z ƿJ;Jtl΃2 =[ ~]x"lWٗ%{/ݍfvOhvWicڏԐdGiڵjO˄~[R6ҏRzҏZ(mG?/q=?+Vl--!ڛԫ1CjթI+{L}/IAjCm(]+ c{JVM6/9Tv?j?RsjhQ+';!SE c+?ER]SVM]ԩ{KKVґEjD`j_RevdRz7eZ(mڛԑtELJ xFkVl#G@;#(/dOi~Bj硶>ԞUvE(=EjCu7}}JDG=3^e=CM!{#ȏVWM q%{$m+V$Pڗͣ"}C+R?VM>o ?Rޣ?=ۄթ ڏM\vEjCdq7>CKZLE5SE a&wdE]@jhD}}DS=s'ڇ VM6IPOdv]zaZ4Q>GnڥP.B?jթܱ]zh;TVOרktvOjo+Vr-?s?]zxݝ#nZ4P?kQ-a<SE:=BQ;Xc;= jh'.E{bJ~؂SEnSn"jh&^v_}=mUCDB?7jO[E=>@ թܗq=wXG2ݑڣ(Zh}#{T7}e<Z4~/kb}@N+V܊@{THO?}+Vr }koD}}B_bv թܱ^>o jy@Z(};E0^oQZ4P&GN(~ܝ<+VrAj^UAEa]{VQjCDCS:}ڇRGf$vGi jh$-EHfSXz[ST-VM]}Bb7j60(Ǩ;PKEjCdo.Qׄf\_ݩi"jh[ڞbJkQ&Gd+V$k(Eoԁ#Wj0? թ7k$G(w?ڃ^+'Ǥ^F(թYinstead-3.2.1/themes/arctic/0000755000175000017500000000000013267071774014734 5ustar peterpeterinstead-3.2.1/themes/arctic/theme.ini0000644000175000017500000000165413267071774016545 0ustar peterpeter; $Name: Arctic$ ; $Name(ru): Арктика$ ; $Name(uk): Арктика$ ; $Name(es): Artico$ ; $Name(it): Artico$ scr.w = 800 scr.h = 600 scr.gfx.bg = bg.png scr.col.bg = white scr.gfx.cursor.x = 1 scr.gfx.cursor.y = 1 scr.gfx.cursor.normal = cursor.png scr.gfx.cursor.use = cursor-use.png scr.gfx.pad = 16 scr.gfx.mode = embedded win.gfx.h = -1 ;unlim win.x = 30 win.y = 16 win.w = 526 win.h = 562 win.gfx.up = aup.png win.gfx.down = adown.png win.col.fg = #000000 win.col.link = #41516a win.col.alink = #1f2837 inv.x = 620 inv.y = 16 inv.w = 140 inv.h = 548 inv.gfx.up = aup.png inv.gfx.down = adown.png inv.col.fg = #1f2837 inv.col.link = #000000 inv.col.alink = #41516a inv.mode = vertical menu.col.bg = white; #b7bdc9 menu.col.fg = black menu.col.link = blue; #1f2837 menu.col.alink = red; #41516a menu.col.alpha = 210 menu.col.border = #45536d menu.bw = 1 menu.gfx.button = menu.png menu.button.x = 768 menu.button.y = 568 instead-3.2.1/themes/arctic/aup.png0000644000175000017500000000050413267071774016226 0ustar peterpeterPNG  IHDRkIsRGBbKGD pHYs Є tIME -/7iTXtCommentCreated with GIMPd.eIDAT8c` \sRHNf$l.e!>|CkL 8g9#!A @ "aH b$do5s. X|1d,Ov  :` dbID78IENDB`instead-3.2.1/themes/arctic/adown.png0000644000175000017500000000053113267071774016551 0ustar peterpeterPNG  IHDRkIsRGBbKGD pHYs Є tIME #ȯ0iTXtCommentCreated with GIMPd.eIDAT8б Gzap>&V-M,e ;~!iX:SqӰLLaS.U#8Ia}agiPHTB`:FݟnqIENDB`instead-3.2.1/themes/arctic/cursor.png0000644000175000017500000000155613267071774016766 0ustar peterpeterPNG  IHDRͭ'sRGBbKGD pHYs B(xtIME atEXtCommentCreated with GIMPWIDAT8ˍOUyϹ~zk\^s#JoľLiQmrLZcTBmQmFB #%]H4cYj!3)43͟>}<I<_trgN-"F+8S|q78YCT-ҍ;%Fߎ13=523=3'ĹǷon6-^v Q1o8)`@eIr˵պ5ڶήm4w}{e3=Ek \UǾ<?=Y\۷ ,_d oD"7$WV{PɑoI%ХBX 4/@GCIENDB`instead-3.2.1/themes/arctic/menu.png0000644000175000017500000000344013267071774016407 0ustar peterpeterPNG  IHDR szzsRGB pHYs.#.#x?vtIME  ٯtEXtCommentCreated with GIMPWbKGD8DY 6t{IDATXõilTUgެo3NK7JRZA-Ⱦ#PE6#D`00f}ZZ{s=^gH ehF(da$蔅>zLa+-+S3"Ax( Y(\[UC(AҝHm=^l$msݟ\8rOIOC!so9ސn[c<݊)(9T<YI6 Յ- [PF=D9nWʌ(>'fYJ zw]OrZDj'V1CuՄ =ȁvPSfz[/8!$ywf,8.:"nBgY]=Խ`ɃlߑCPz}qlvI YL̍LɋLWrtdz~׿?lĂ^B 0Q󲙢) go[ɽ^ǻK3ZnEu: 0Hk0IF t?q׮;yz*N|}%+~5b̅/N^ݸ&-:B&%[iEþ29:0^y~[ً6N}kC̉.GO]%ިYxu<f s]lQ!y}%Ox`;zE+.A8#whY|VGMs,1 19- ZJkU%E_naBŷ`"`@^v~p~$*FhEaZCJĤPN YMިM4(is\P[˿B8&BY1kE3Җ~m`E^-9!W Ѹ $A`q [lJȩL!mxm;{`@iwfMr`7 K}kY'lMVz)&*N-hvl_mrǩ5{֩*ZZьps9l(3ޠ}C H`9vw0%g Ͷ#m'>ׁ:0S$=!Ν0xba Ex,B.<#e +:w3Jҳh:%@u@ b;fZ}q9D¯%ـ1 <`xJƅ<:*>UD崵cW&_FRqjFZ#E 6nx@Ze2YSQQ R*--^wtt|^$=\Pi ^Ts}0d;>=@3[jVV]UVm<~xyAf /uuuTJ͜9 ! q#ymB̦<|pRrun÷we545Ç'w,>٪U{ \J*6 AACFv1Z۷ҥK ?zYVVBٳgSHEj@֯_|AB Q W<<<(((H%%%xeXXXa~~3Qp N+=P\Llٲsjܴi Ç#G66wޔq㥶Pت۷oB[nILAPl=?׷zo ,zkcdhǏ]pANl=zOus_}b"J+Q+Zٳ/nbγӈ'O^֠.j(Ԫ:@Ԯ]6܉'RPSRR*g脭[FbϞ=ix=XXЌxAq[( cRCBBmBWM~Zzu N&9s&mL)GYI8pAoJܷoU/`;;c fYXXC!'Ot=lْ%K"`Yw^h_=7666ѡVpg[tt2/""BaddI2K^"+C)G H% 7>P.NFEEɠD:|U ¡ +gJ̃+NK&OAċIwE-#BS>xo &(29 k2J!Ɏ=*sҚofF({ک0-]P@ܹ#P*OQ0qDAF'(4 7 3y^z/][;.6jʋ/Q)RB'$h?H4L/:`0w\A|0FOcPxõܼyIB {I 2Ν;sƍһw KPbtΜ9q =z p-P8T{<44[nӡP0BjYŧO$ ZhO%(/SNc`PcPnhrCh3449y5Q b@daWLJLL,ČW!^ƻp7CMyF6C`ľ> 0iddt[hEߌ^\uonQM8(Fs2qZ<k׮PQ{a6`V˅1]궁$%uuu7o0J+ ?gQc @ {|"~'?Ԅ$@~f5"fS℄1MM>JG8:1^{Aw|&ٳgmױ܉}>>i ~_hnpty1&9"`y6lRŕgm `i"+c|ʢY{ζ̡LIuO'e Z˔kڡu/DDIENDB`instead-3.2.1/themes/arctic/bg.png0000644000175000017500000054776413267071774016061 0ustar peterpeterPNG  IHDR X'sRGB pHYs Є tIME$bKGDtIDATx˫,˶#"j' e @= P_ SmY-6 5caF sk92c 7"5kܳY_Oqxn  Gۿ__ ޝ?_?#wlO?wo?XV-XWW/sſ?ꏿ:?رౄ/?8?[So[7wou < 9gm~+GG𽒷9 ? |ET;|ǰX@` @` @`  , X, X, X,@` X,@` X@` @` @`  , X, X, X,@` X@` X@` @` @`  , X, X, X,@` X@` X@` @`   , X, X, X,@` X@` X@` @`   , X, X, X,@` X@` X , X, X, X,@` X@` @` @`  , , X, X,@` X,@` X@` @` @`  , , X, X,@` X,@` X@` @` @`  , , X, X,@` X,@` X@` @` @`  , X, X, X,@` X,@` X@` `cpޝs"sc/>m |6oŌ=kzG$'^+9 :G߾t|0O_C5` =[Y#WW`Q/zcD "zƾ a{q&"uu 0x ?[ʛ[YHM]>WzϡnG#PW76;u8ɶ&vO)uw7TW95֗R\_ߤjg2 ;+ԕsο֑G26coP]-W)>GʁۯD~d7f*zne^Q(ee[ R`Lwە!u2 )0ZRߡ:Vv{[Hi6כ) %'`X>rS|i;܃oԆߴz1PPWG5SĐ|fFOir[7w]q#'rA޲w8HkeKLnyھ/pu5[NaCDdv4<倸NmJZw$`Fzy˱ 7Es/ӎhC%G۱k-R8BGcMdnz6z|q Uoh|'ѺH8Sbbuw+pC\]u>ؾfC'2 Uciu +gZ\ɧWWնXzPW G!v.Cn{QԻW\wsw PykVSP``tDߜz˩cw}RhYfIW5ϠAJ<:(o )[_LZ9QZ Fho@H}Yb~D]i^qM)ݸfO<;V8\얣Mk}N:4|v_ʏUߊy~o\a"o=S#ѯ$ b|ǽ}UEu @W}I6ZH,{;^_aVoJWuCVU~A{7{+X,(0j#+;",U߮t[5iozew_T:0o?y'&ʭjKmf?7n ^j~#IYbuʷx#lg} ϥnGJ[7kJbr@{햂/.y%_Fkš M;"ܱh%NYJ=en{˄=b6bm__#;=l%w,nf㖩۽BKFo+.MvDXkE~|PtdXH_MUxD5y [ܖrj,I|1'w c/X}7lvWqvטXg ?-t{=\֮heQrHcݗqYlVkGR)|bĚy,")[G':XF;yL?Uw7+ߢ)R*<2?P٣.VO} k [cdOcMsO5X6ޞ#&8'e.z)iv"|V|ſw[VZ2WbŊeJ:=/ AioE^qi5l%_pJwHCx[$ّw⛱|c&/dk0Sv!lMQ:[ue4YM/Pc9q21 @zpv4wxe.~>z7?77N4pM]56e,~;AS.SiFˤ9ievt23v7+17XP,i,?Z`g*<ed% wO0,پE}fFd~_0~ۈ%=( n5ԖsGar ݢ/99}3[ʊge[ռ '&,𤋮Jn֟tX&iB^5M!en7-n5gߚ)sh/[ȪrIyTMOdQh|7#xooZ_|Q]e{6u0,F]Qi+{ZH ٸ)#zMGRx9du8\F;nmdϽ~k|r_{٢f:z{ie[C{֞|P"̤vL$m%b>(s}Ux`qdS[g_lsowWğifx|-U=q|8;Y{beRl~`mI,m[$Rz葀raWLski[V/l-#nXDe.UZ|esh6@k`ۦxdBlgVs:[oz'=dVNձ^=AV/7g+xFl.onm{%Cv9úOS[iqߖf+խH'+GrlO?KpVrO;/ATYi̗ţU1RWn3C3`\53YaqVLKȡ_<(Y`&E\W.CW=ʶqǁkDvܲb29o 6Mcc˱ܣvfǛ _\5 φTk̊V3*Zk]z7.zMN6];&5L;lI6 _፤k-쿹f{`R5U{ʯ!}u#9xϒ6.]l~I*6HqlK[h/sN}1dIaԸSl{<;51#ctJ-7sC;n] v`X -܏'7+[/٫GC79m;kDVxaם-qrG?l2Z]fشxnkg6 `ltbл [2rа[kg[Yܫj]%5C2e Sl<@bm-{hri-`2QT[0YIWͪJ7=:jB8#;Zzq63ׅM{NC )K1׆\tc-QGab:dv:"X'bM6e!ʬ7s<0Tj0ъqR;VSēv}޻qcwd<{VOkY8]Nj}wyCuA9/nS-WәX'.>O-KC2O֔l*h-vVJ[qv{E&ZykUݛ`^{:W9*@°z@OW&L+?qQVxD9]Ɣ% >wV1qOUw1N 8[yV^\c.nnf87CJ] uy;ۭȜ#v6w14[{|G [X2]F֊ܐ۫NSE罷}$u7V!oScj3 Ije|+Aͭٶ't٨ۦ]%^ّ6MEYY2 bϯ B$/cgZ>IY ?ȯg:^5YF 77>ڻv}y)=헽Yf2][ ;>eaY}_1bs2UlNķw~CFtULP]k/vlP=Bg6˱G m6bG@6nPF!C 2ϹQj*Y1:7 +3Pz6;*LfAxUZiXCɇ)h[iZͰu[l}9^U9~\fs*琩=PxeZ{nwoq7WΠ] _6nvR{XN)mxp2\S-ie;ԤPs.͏c۷,fcE53bTD7vy>TVV/ k֬d+-GFZ`TjTj\M sI:Z?SJaqsQI\?H)s3H ֭i3l~jaGֶ׭#Ҹ,duBqHeZdLJ9p ݽz:3Ŭ [+v!ePk[!6@Ϙj4"DdT.pXuGqa*6E-Q$3GY Wm?&ʶ6W6ߖl',NNGo+m(=f;U5L d܊i[Q$if!:lbl/,DW-Z+ i]֔YjY& bLT`-,7Q,}Hs6еƑ1pcHXM9vWaa/ldP=gqGV[˟>#v)I˛z=Zf`Kmg|cOteGvI/έ[ ~/P6/@ȇh,1zC29P+OzK(KžRVH nj wn beqz$m/@gd)oi;.eiN.]a-Np迥1Q&;n | 3@,Óxf6>5lX Wh M8ӝrdhX7U=(~'aBɼaLB6b+YqI,2<; w_lX/歵—BQX66+ gגF,KǼo|vutyVnضc~;!br"zxQ͍~U%¶_O~%jOiYi"-ꌸMT 6ZYP?-J&VJ?--Lnƻ8*~AvWg J؊QoOwٺaBĻm9+]ܡ[IYAkNTHaa鑌pAeOjn%}$]֘/d"ΙH!j䜄X;P&&AquuZ6m[hf> f@t/66Q'- E29h/gb#)ebevq-MwKMKÆlj:}KNU=6ҳ) 0Yl`[$ %ܡEnCkon;:a28GlgX2^{)<.-.\\ (k.clh] kSX +ұ)髼Tf'ar25?7sx2}em-~?TUfm/κI{TD4e$GXۭf7:eX:KHXW~]\1Z32Sֲ&F1k^d:ZJ -7&fc%Dd-\iϝ*n*Uʺ!%](S ;o~tLg K =ؖxĭ9ѭ+/CF#DLYQҌdMme1^m뚎[Lņf8EMdYyQb$Jh7QBYT=zWCǔ~kB:˟>xTѩY))%feb~<_Y\ Ιs*L55kfBPmD|>% tҥE :vrñs@?J2`M+vk\Njpѕ/ؘebMlq1s5LwEm-`+^=Wᦻ^oպ¥0^;"myGф4h;uk>h3W&{˭h^[E1>}L1Ѭ|ϵj>vp (9n4s&fK[w`{f-䈷kYaJ&W:(p""7EbmӚ,Ɏ?aY.45~q:DZL(9vWyQ=Czg9 VĝQoՋȵ}wIE<8_?^./ڇ~W d>ݜbڹEV+D5H--~|?tNI?}O1YS}e5us _.M)VtdJdӧ΋Ǚ&Oø[ެ$l2 TJ -g]3)-d+E,-AdnJrC#ܦmm)c\",GփɹB=Yw\XE`wSL wfR-#&JFEu"g"FGټ.h~Y;D=UZpeICr8zRԻVv۬9:#['Skz_Q6*=cioDeMQ.m5Hࡡ:d!krNw֭議V!7ݗI3'|j-6uɪ.)4;2D},lqiSM//?~p}ԵT_d~C{O9?xMnI^<;ud# 7C=sO]/޿L׏//U /ϟbM]ꧏ5=={^.O?3GΑÓW>}ŀT۽>D'9[Ԭ;qiyuLߖ&vmgYBq)䐓hŖ J)[mOntb[́m.f2WgAf+޾w}F ڸ -f4<ԉ(ӟk6-jU5(W2ߎ궋:\e:߬d[;lXI,礸6;mK+[wOGk.{U-vz-b2y"ckgǻUL v a2Bt h3ƷbOOE6յH3/.iJNkǿõnd|7Mx\޿{Cܒ9[dd]XDv[cc hoSxQçOMMOUU LLry<}ӵ*$sw^.uXWv|QgNԲxqsI5Ƙ{->U%=%IurW+-ϭ"O}wߋ^ڻ^s{窪D\j|%%GBDEUr󧣎E^FIm"fQG{n=즩uEXndsYeG ƕwFWNfEcoX?7f.6<坯ivpfHgk88XfqbJ}J-]5&qLzm|dr{u lv?Iu0Z%Ȟa H$euf?Y`\Ҏs။ۺv=5xS2sOϼ%SRpڸfǎkv`6nD"Y4jvl4E1H]Mj?OιO8үM2NZ&%5&Iio~R_޽; 47>KMRJry\bUɐNr?e}}||VMܘ\MZ;J{E%r^_")󻧧?&%_NgԤT%Xyxc[3V6wfN49'{&}5k !2q-L@>-%/utmY*:6Ěi {>p:$2s4ǿS_PEl#Q5y҅V[NJ*QJjcXbԭ ֻ='!u}Ȋ_U`w:e.|kk\Y;TFuIg-ӡZפks,cô(Mㆭh00U+T eqcm'ry.p FZ-̬^|c2k^a.ee뾻=^g4Y .{Jk*'ލkձ[e]q_"M{T#h|JFCQU{,8[D^9WrIbcY4wNrT~~I?1߫CzmԼ\]_&*VCTua43'vDKI5kўA[t^jVH////K6BwWzmV6ѹcLW/ދs;[kgn[^TK0vub7ąI7"dIfj;!mqYŒclt!]f55y}Ɂ6"m`Xh_ ^ ;qcⱪڬF!f}l}nZ)Y B`{\N+gmّ+8IF<˝_[Y٬qgۖ `)f].o,y9/V^phּlm| yKUUk]MRk%CR3aUݻw>~jZ i|Z^[ :Ň5'&[%,=}p"M{ū3&\J)HjQ1V9s1V"bbr {4iRUSh%\vK!x;WwfI51si_FY*5:i!GHNyt:?G&?^뺾^ߝ~|~^k>8]幊UrOf|ZT/W_Km9q"Uu:nqk]bOw1ƺ,"MjRJfcTպorC]םCY5Mc߿^sm2kl)"ޛݺAX5nu\"}PSM*I[vؚU;z}oԜs~Ty .yDž̄k. ZE4ٛxdV`w˶ [l;i̺i ^s>d nꦮkCśxd!h%x߯MdOi_9!cwu]n#H瓈f\debNo\HiF5֢E|Xڐ4MB~>D55#4k(//4 4B1. I4]Iצi:u/~"OIO1^u5MΉ?lN-3*^LStir0EXJZu!4I&sAͼ|'usKv ^֎4IMEC7'".kT&qmm6}k}Nk!$߽ח~C18ca^x !x3CC1བྷ*Rp>?#ѩ\+û$l=QĔ|$ЊۥJ_k.Gv%V.r#hfvU'^F ·*W 2y sVeblͿ$ gQM(j8NwX_D ,4v4;'&p5+%\Ճ1+DiϮ\Ьp>{nm.JSu6#e)[ kq4*-(J e%*"e͆82L-}clTuysRP-4w=QSM1wOO׺Ç&%|U9BWkLMęx'K68|y15iދO'sNЗi?>GG]D\d9cvҰ鵩MUǰulcv/QՔn&CفFN|Φ6kk@6YXoɩf#ދfZCUg*OMPv c7iQ5$#K[<\-!vL\ҵ&wL Ec|M:S4~w⃙Sur:YJRI43 WULxJesRҤMɳ{oI&b&Uن`>ڻ'oNRJ=5>O풖ҷbMBDtr"!}mQqm g^24\\J/NE޽ӏ?.ky{/1?4Y۴`R"W:[yw;hv riMd悉wAxmV.M.Wy:鵾>ٓ549~Lsm5hJ>iԢ6N:j.'TUއzhR[^kqa&UT'Ni|2Ԍ>ZGc8U'SU1Oz61Et:;rԜ5·].$[㼵L5`gFvc͚x-u{té9*1cb=oD^ D*v*Q -cs N˦6i+ i}fdj3iSrZ3*"9ZM|>_*cӨA&}ɼ[vtɱ"f7sjU4Ku.w<:jX,,O[mĭ d8qw 0Im|br "BVDž/܈%,lW6VّoZB.L\7LrA?M葔{8MI՜3B[gԒ`ELMUIMQA!XϥI)c9N15((9 !G+xřhT-x\!DQM7Ӕ3Dp/&|!cV/SevA^{י4)edfixjzx.ӤWq\^/އ6AHȋ%5ND]{/*,Ԥs(9 ]@é>D_Ai2M:-U5"F"p&X_SJ"zi>}s%S鬚56~751:IJRjߎmQi s \&_F3w:U)ܸۙo&B;Ln_5^.ԤɆeˋ&(L^W[t'윺^s^$mngQy5Kʤzփ^'aӒfb8OY,RJ׺Χus^,BtN̢LSmXW+493O?6Mz5CQ&&NRk}:kLSh>mTrnm@m4_./u-8V'\~1$M;_]'gM*&qߺ{Su;9'ˆ<<f&YU1+r]U{@&9Ք>6HU'm!,ivXLQ|TژY]M>/ADMTUN\UUZާB86IMSTEċ ݊oƑ ݅YiѢ*nT5=ɦr*k༰RѐǗ3j 2Zcͭ;͢"92]c/S@g^jVQT7<w 5s]hChR&t>*[1w&jKzoc눩@FMrkzaZ4_WʡeWd%!úFq2cΎp`;XL$EBK>\oCD\޴3m"R0X[rn֧h{sfYf%6{ d")= ˛zNڷZéX|E"fKT]Ns.kDE7yTє4*]{5kRrfMӄxp&_.[R7R{.ܹƀ9KI i$h^i몪٧*ZXKS z}/J\I.od|x\)Vqy]ujbK&Q}; J4jW“>G͋%Bt6ruMtBM]T%5S "Ps<>a\Da\E%>]nrZЀr>rC|>> 9 ܖ'ߚ$Fī$)ΙY3N>k+:w|.CKuxLIrɂQuA߹GeN A{/3 E fmhֹ :O}'RJsN|AmLE/^D'ln~1o]}ks},_93kR{NDSK[BLbU{&9ku1`RH4Дcʽ|iݲ~oj+۳ߨՃM~QB{Z&|d ePu95m&ēbޛj#yjJM|4ޟ%Eh6pلǧBU^ci9Y3Ns Y.؛dz<;')iq:,Zsjv׺~yyZǁH]ן>=_.t>?SNi~t5?!m*Ú>r;eA'6 Re˨`JinKבMzKF̵aDS}TiX!Y!3w\µ\$Y1+:4\ۄF}|O>9ćQe׍nA:Idkι51o!~PݩV /wnS[,Ys|[~x9.TD.|m>DYz6M2U6.ҝ&͙^^^L#RLSSn#ՑgJ?V%h6IzSqõmDx^s5N1ƪ:]79/}1YDNgFrI9IZr>џOOOӹ]sT'uzy8vþ3K83/EUlhޭ ^ު-5,m|\"mβA݉SV]TiSlmL614L)癢vWtnJ}h;QĘfR)W(‡YUrZSw<]4?)^ZZV?ٖ6{L5%zQBNdUMM(ާFsrɥkc#|CL#ХtC$hBΔI)Yc*Us4"뺮rsS\:'vweuZ+`m}nx˾|_|ҺGBUYnɊ6ۄՃ׸o:RVXiø8NEvv ~!G M)7 n3ٽ$\*=QVc;n/%YCQU/߫Xuv1^y9"kۥhUMX)=v!s#5 ud=!9ZoLXܚ? .Kmsd""o_s]?>?>;ofZ]~ve߾8 Sqh:ƜxJ:bRNv̹<<< L@5I~fC8..Xv.2BލaS4x>5C-lJ@c2U/AW1q9/t֔p9| ٖ >>uy[ɢ]H}DTg" B˫cqs'"ǿDT_0`58t+5[rr ff5,_*"318w,r,À)eభL}C^r ǺIb$VgJ~* "08Α#= `H 4d{ cZ2ǝɖ6t(\cAL` f0Sa @1,J0kT.6bP3}:":7:k dIiN3 ouh*ĩ]1s2LWʘ)H? 9)4ҩ&k X=$ rѥaƌ`XͯpYK`D6\9DΔpZ~^թFwa -ڏp,{0+vAhؑ~)`Avqzʬky>ĻqBďvq . NyNDL8*󑹱Py0"D i(;f~=y C4l3$kdy7Tɼ]4yAÚEH5iu;+"sy+ƘDŽDtG,h` ;jĚ*9暚ymoQILkLJ5P^IԀREbLmYI]Pr=0Ě+xil2^ h8-Դb0`hy1oVYGu[ :,o52_"STK1g0jWkrHfUSʖ`8*4R %Ms\[o,"ï9<'$c{:ST Q)S9|V,6&lz+u=y{3mAl1ڈqwre7ҽQnYo>6PDP+0 S ʒ{t)n0m%"@JXep|Ks!VuwkUjc&hϹ.]) ~`:N""DL޾}{{@rD^Тj4.0XqI:тAn5 (nmGz&-Sy3;3۱^/UI^pE={J4{JLJ0S ZS i3kʒ1qVatpD4 Tc "ߋgs(&uv9ׯ_' u=jT/_6 }j<4x@vU82K-a"1ʁs=Wq=Oi7˴wu.fq<|l~o"4$YI 3YHg҆F8OhՑ2?t#+|P?We"5ok1붔3jL <p矼{.n1벦s]Q},Ý#hpy&0HXqC\*B̪Yב @u{lDe3~jk@gebrpJRRdԌ<53諭GkwWs/]i"{#?aDp`K{.7>h8O FL8+EZ5;!3R!32gg6hdny[+ ĺXо8.x6b>s-QF/хN23:E͌5bbqЈuleE-umթtHlkMg3z'1?[cAl6*>fVy=qoPK[mC֝Ee.4ˆ]ο{=tc 0ߴ +`|GWDPa7&!@ be~ЕrI؊ x^!r{|.{̫BR~ TzL-dz]X§ɘk)V:Lxo2ftp+4 q/~W<|IxL 1j/R,wR1O \7k5 W}Ni!h5W% Ts6px;R+Jk1|$~"ŵ *bw .SL@QQ[kkZxRRO僀@2v$s&IшQeޅLi%qu"i)4szyqaG %~|c"*ߙci olIP A#+415Lqmt S4W#q>1n_q>z^ȃ[ BN H+"̀OYb+aH$"MdzdMÏVEۣW4խ!&TI\7)ղ37Hd8-[ ȶD11,\b %LBݮFr?] >KO=Z]!31< ^(DL,otyf{7|dc:$&+l|t྿eߋF _\nx b|  h`b@BFm|y3ގ. `ܲ_`q VuݯL[V-6ʞŕch(]6¹j 2&_l0h*(F#t%{(#4!c`cy A4%P|rhH@HhkR;CkDvHbƵGMy!U!8nܢlevhYKG"10h_]k.$j:q%D +  Xb%31:Fv/}ZJ%k^RZS d嶫Yi(UOyh`sH$䐗xayy wNgD&Y1h)UUnǡH&FDoqyaxDn >Q %Dl>趖 V' ַoߢ͠_mk 'J僯u6^&A{"\ 8Fs AP>giQ6מ1vZ‚-bF}-[}wUEM-sj`p{oU*l#|J-;"aDJ.;Y~*0Ǿs_2t#ȖA_{E4 H%M#+VgY)u{fqӄoGrxm~~/!~@p]"EU~Mu!Lo7W5E7(3s9F$?\Ui S "5h*@9F Sˢ' m{~+.NhV|;j237!> O8U9v%4%iJ N8Mq5m,5"Nl&6S\ķ M,13#8s.ke ϡ(paL.\0(קF ٛͽKna?Qԓ=әK{a;24sjMtw9^TD}kTqbPZaRZ*ޜR?>,Ц3wrϖłMH.*89"7>pX\)64$+b䎀15[zYk߾8`-ۨZ&wM|C-dPЀ&@IXZ";K/w`%Q6MP=k.&_E.$(/`؛(uC0UTm|)ehRG_֣y݉dH­4kؿF=f^on˕2ϭɽ5Гdu0f$;G_ Rg#])|5ZЯ~[/a/Rc& jo>mނ9}@T7PuMH};JFaחPSGsXdX[a\kc{d{b. g|O)`l}v-vsе4ଟч7}Qdl7%~VfuZr+S2sTE(L'BXTLemMM^sڋ ԍx/sP}FT4`zˆGS[kA+658PZ/-623 ht.%8m-/ЅT[7kr= _QTq%iI@qЏ݁lz)% `OKnKs}l[=AUW=fnBJ^YHf't\{q[g # `*6#5-+b>ѕ[ e pvi чⲟ88q@-OQ2TnP[w1b8!J h, !&k([4M=NL7("k%X9G[W ۩^Tm^J(30m"rxS:Uz!ܕ:Y Rl${_rß?Bkܳha8=c7Iǹ`<[ uN2Rrh`^fe2l{:{l#6[&3O=8C|~KYD}NA ޭAk=Ϲ,|S5$<}m/s@#^S[3lAv=|+Gt 9Yݧ\x0fI pL1st6FQ'ur-";H!h+z ]"Kgy+` n8 C=DQ-JPnfxYhL`e})  qٷQ>3 񼛂#gCfhIY~ ,UO TO^6x~]' ^.*U+55its I`. k|>ᓆr6@_Cƛ>[nrUbEs-ޭG91pLmyc} X,ZeN+2%<&hW{y5hm`9ImaDŁHf񫠢OT̍a-?{+%,g'6EMɹG:p[i6TUhj[NRqՎT Y{7KB  *s/Yԩaiԭ2v3ps(  eS oEe7ZOuA )%sb,6# /?t414pS%{x8x1/v݄غ%?LakU>A_zJECifdc%2b7mݷfa1uG66F{t #s UНd mp#l-4>>"_Ef!1ns.5lyI'".\UpqHӧ>6+&|:;aj"ۢYh5{*޽Wtݦ[lTӢ5rztٷ:Hv/}&(E97lUȆŴ|)0QGkBuZ^z~V?L|ocsz.(>H@.F%AD=7.M*C$"\֔%y%kx °H[6u>q<Bd5 ݠ 9"?6GXmJ(a8<:{<8.+#Vqq7XYR\*>49גuw`e Ø}XzF _Epz5{f&ED#)-\j!Fn=f凴<wP'3sLNMd@$Q#dXS\?h5U!d%$B,T_nu]0U$r`G Y;J3՗@Fb`1)z\hB_(LY 7o_cȚPǔ7wL0`}{ <̇dqǁ6T=U&dSNH34jwYDkxFx$~>ވ{t}WL~/ {Sױa^% ,/uԙxZ#7yfFBƗf ‹Ivה:TrEOkO^hUؾT!aP1axhKQ _ZZL䚵591[VnuIG"0|^\K<CT98 4aJTGf æNDVa8 NeQY"(&)mLTdO;SPX'yJp [0f]s { |9jqU?mz&bHں ;5ߕh.:pk-.0 h扪*bZ 3gU@8#:tv5L)*wsJHSN/Ԯ2&ҩųQ5E@03 ȢVv L~|c.BѦiMP~c L  bVrc7oHʨ:xݹ$2 q-25z洫dD![ 3ff`/k ĥ&%$%\1v)Y+ģP~ ˏ""f45`oFxTk:wa%  QAc;! R̸vTf0_ ]@DHK+6/=||_ װٮ6 i]fneɯ}~-&bmca[VȀ"|k@tA3To剔YL>5޳, /YDDZAYZkl끈p=04HI-Jl BLTjzȇ?KTms`T)d{bU`HH01x FoB5-۞Tqj?A6gU}EߝY|e۹|6;fAûVj/vW]I= cph4gy%y}"d%*xc4i97-  M1'ITJjQ\5ĪB&r9)?o^Ϗ?%<"^OnFbк=qD]cpVnvv!ٱs5~FYԒwzK{bݪ*W"#l;h|EoR0泱>S _qjALtKVmZTϏ??%~}T'IA*݃` C$!QuZF׶%T"8EAJN^9I)_anvئԅ-zD4ڼ6tZq|IF6oT"  iN;'jk'Ս x"z>dsԃi$iC%yC V{he$G΁ Af[ |cgmFObGo;r*WG%H*1D03v뚗®LIJP( dooDX%c # q'S(fKrM+7@_ӠCg*©IJ`ǘD8,PKJ!G` 66'vCnv=v(7 a=ۿÚT-ဪ}vo@j8ʥ_\$] )ٟ LN=+733B زؿƛ3YۈwL~r=5܈}'Q]Pc@9Qyш-??1x U=Ƿo/Oq` 3jrf:Et#5|' 47z#.QXr|*l`JA1rЁH<ϜLt5yMCpsrF=lM9O _G8dЌ%DIڵR41#DpRuM$ ȄwXX'Y{TnUE#.D+ `~8_WMj&H$t:}}QZpQz̳fb `Y3,oDqEKاrG49#v+16Xާi/Wdzksbk'Cd"D҇}s BM8CBΓg; QP%41*f?zY%=3:h-DŌxSKSj K"\q:Nނ,=O,?Maċ=,exD2n]yi> CamC:JDJI ^!0AHj2ic?%DۮO_WӐ"g(V9qGL"|[j)k"]eѹ9(K{8F$-͹s >1f>K*8|Le㼲B|}H׽W;>,y]{ְйX(qVؘ Ro+LeL `DpL]QԠ[%qp[St) ֣dMՊ?Waܓe9㺞cYKZ̢ ,uTѵo-4c3EncB"ZsΥ*<^ %^^ q Q]"fι,Aw}>CkAgP+WDdWw2'.5 MY3F.}1f\&>Ǯbm0*Z4:D2CEJ'o ]9 wNjDoON;!?aceZ*%=[.f@ P+YGWonC̐)ĶSxc5r浖q}0[gԥ Q\KCNgΫ-&馛p15q=&I_iB>DD L w~XtUu^Z+~a+8U0é TLqN䮢ٻ/P9_MeW_(U0 Bk_[tj"Ň3m| o_8)M )VD*YX6D՘HU2>˜`.D+o$3B%+-L-$UW|"⋆m?=ɼr*~W}=XLCk] ^5}b} `\j-Ŀ0Qi/Pc^öw2S3U7!BNȍ#9 Dntzlsm O\`6djni.{bgj 'Uj"- _*MjP =ވSGo_Eu^_7S\d- VFϧ}|T!AFûBw1*Qe/agYEnkSö/,+2{7fi4莰m›)CvETh.ޯ`F'Ub+2u(h^ki.қ/M(pn_`DK*cj; Lw?'AykV,@39,fvEX^wKv}Dt`+3OgALɮG9KpvvvS 2\Z ؍od xgݶ^ȌwV2 50`՘.Ȩ߭4GcmQV#9EG, "y^ru%PP0ս4fC:4˦mh{7IwӯG}m~iOnkj 1'Z 8̼]ݶwj`7f<,adG|G?. @&qbKĿ##,3%s.r1s]QD-r6M4@]:>ۆdO 04LfMỦ>E]QZe_t '&Nf`y4>$' "cc ڄf{ql5nP8amˌhk8<1m5!w;Ƭ3'A Ld:υ&὘2L΃|$`dPmmWǠh yoF Q^2Ll]"d#Cl-g:ƵҎ]*_XiU\4: B',%hHU1_c &V5X>fO2ߝ"y;!LO!Z+t z `"4O( *AWY&ZYg*a=K~Se봑lfp>e_!Z#n=6"$KȾI[D{4 !)^18Ϗ\xc00SS!pK&Qw9jTVRiLOUW8}P41%k%{$\;l-ጳsl1r-9 8z}Im {ׯyq K}=3AeQ!5c<q]\To^"čZplf8Uu-93vpQZ/WĎf&aƯk\Wet@f%o`|‚&"RUEC\8<=Hl!??U e,O֟`L_9'ڍU+k{ݜ;fkkퟙ eApDd9RԖG'1Y#"̤FBo2V@x IWiuNb `Nx{KPKLobHnz[[9NBgJNDʬ,ɏ5n]c $DH(|$#Wt;BB1M|ZDH~p7`,r 9\_F~:Fc9yĜ D`b_\ %r `0tIpѓQpӚ^l`)ah8m.kKhyK ob}hUq4 !ؾCp>O=h>M lU6#|Bg")BR{סݢ,amMKo[FnYxΑ c4Rxf6DkBdlؑZ Mݦz|X zOXbD D|-q\x;T̔PⱧ ayyHv4DGFD7 89@cq Bqɖ^K]H$;gEtcNxa:9jATe-b=8DK1LT}X81o߾}||X;pD?߿<tiH׺Y"}gs>Uz"K՝HPg $XB?"9Fen7&c1=]"*le|0Y'j2q9(&?qu!21ʢs ~4vYG鋀`Ӣ_jcڗK}5.Z^,,ZEf2qa\0zfsh[d*ѺOGcm ilƍNu쉵% NI{H?7T # Dx<Cn &>r1r+[ `%"P=Zh[EOX׌ pׅUgCD[ 5nIx{%ĤɍtNFٿ\G Ҥwۃ@4-23=wZLlfM۟2ӉJDM)\veO;a9Kq+}gㅲm{`/Z 5amj2GCd]Fԛ\^DZ;I>N N"J/ ~SG)$R|DZDK0j??>|MU3iIy;`e2wl)5֚,(UUQKP5#R˽̀>4r>'sf`)ۍ|u$` @u1uZQ8\7 ~9/1U8OD?Ō;*M"ro̵ЀQTUtpfD4L"ym= `Qs]s)`n7%ޣ5ELME8bn %z>=]5GVE3YZSs(X|ZA-~^:ѥEY&*&97 dߏ4&)]-u1r"=Z@rٯ90tb9'JE>J-vAԪN_-Zc|U7%?m\D_B~:( ֜y^,`8UfaQg9W麂zy᫵i u*_b,VĭPv\|%jo."R-c33Wmn%<4+:mh)}=(=sZ)ag{YQ7m (;dK6Cߢ}aAcqc5׊9'y2 r\҆r$ C%; Geͥjxpz5sVEm,[HӆZz0&1qAcjfMV]GDfVqX[ôX%ɪ̌p2{[2J$+prwh()Pn0F )Q9󝈌oK=W`}xg\w)ܤjĦwű3S@3qmy)1ut|1F8E a<*c-sf5n~Z v/V[SURr.KJC#1FM/ Hk'0R w{x辐"  V,[1 rv3+sq>ng]6Q"9E 6Qp}Ġ93gͩIg"i?&B8%Gx*TʒS ㈩Ѳ,K+߾Ԛ ,&")u)%¾|@q T3sm@ P6%f57I)quDZ=7ђR?~~vZSrmUXGLS- 7'wy+YS)Z-!3Phw ;~0Lǒ{SJe)f́w xlLqCeM#j^@s.3t?@Ϲrss3c4s3Z ڴP!n3; OIgAı g{ehwp~uQwK1?GZgj̹Ď3ŝ9xF4<2bϚq!4ff{US#೾袞19^>k!!\VM֍3.jr^{:(b SZ.b8P9[_I coM,4$p"6w9'\RH Eb)e]^*˺Lmy}m~@RVGOi,C#`,L:}8=m]/_W&j~ID4P2'̙6G$.2 -M 3Q N99Ґ w6EjNC1VUr"~Ty&uQ&DC̤kRLV9[0{g#.uc`d1Gom:O04GC'oE!1GqU9BLaOPY`?]z@w{μyV=]D̜šKI9$g?!SbµF՚ƋGFJL)߾3pv#BJLSew<=}gJeFxQe gXLA]O#tv]MSs v.Q1_׫Gpts3irS_E cu]X13 Q)!9/"f8諱 `s?ӈB|~CD!bfB!mht^C8(πXEC^iݹ;‘Jm2Ʈ})qwLH׎w"D҃m4^x^3}bv N^8{Tjj"zQRʹm{Dݶ @[⤭%v&#Xv4[ぱ;(8Y8lJ~`Đ ̉L2qeH#O~8n2"&b N:G!.CaB3S Yy:1C" rĽCOu9'DZw' %RpU9]Wf~?m0*}߉mmu[Jr4Qw0u9G4q)WL_Z-_~-9rlꔘ4SŜ9q/2{*?9XaCYhF#隆V DE~^K ?Wq0Vn?]_^_vY^oۻ){jgV8UcGq&UkCK4 vY 4qDoؾ @HpVOTL`8N:#mb9=, 1fSJ]518TE2Ty_6!t ϩ*""&."&DjyFK@cqJfM!24iu!`4]m1sx从YxD&sgA^}vFRSOfZ@QT~hE3aT1|xOGC)E҄j Bm{ḾoPkڐHDB*9MZ }bkFop UyIƉsDwup%?-FYE05Q}{{ˊHn81y"L)%`tS}㌶apzB >wS-%`@ѠfJosS&f. 'rBG NN 3z} Հ2CJqYKNPrs$YfSB 3{yPHsR˭[GffĢ?9Vi2s`a˵}Y۷8_ܜa`~OSe9MktԽWIn1?s|u(,DDS dqdƂ@vR.*E /hHd8 Q-.pV\4Hs KR2&!ax?}:1;k:Wǁ{-OfDy?TMTkɇ;L+/$Ћ0!b: >Z'DfPRvsL^Rkcdyjc ){NHg}, A0h})Z_E"\ vk$ R惹;5u*z LmZN{<ӒG8>L@fhD7PLhy&bcaSQY1QW𩀛0 R1x,饃{\N2c@M8=,Mc s̜Z{KΈx\}|f,"Zҹ9vM#xF?4n"Jaf%։QjuvPk, R9eCvJs35[kѽD5{GbfQ{l[5t,T닋Sh}9,@\N߾ %9~r.@vJk[m>ԓ4FD>>>Je,K\UƠ!a( GDY|3}X]S$tg Gy\G8sw"vڋ umQ>DAķ0}fk-  00}y}ߐ0gHסr)95XT$̸)Xb"4&X|ViMuH+HUnSNGn7K#@%䛞Yց]20ok A# s.x])948S;|}FNgILind8ĿG#w]> c"JD)gO~`\SJZ#=d.'4 #Rsﯛjk)rǰ\b Mp4zN0'i5%ӑͨ~a1*kɷ[O23?Is5(='${sXι6r;-!BT,:s^g 7PJigF0(X]X8?.v:̼,KIDm䦒H  8up@~#oWxVCGD#QDs9Op` S )9d@2g]6["]ކ1r 1SO(DyJos)ӉpV{\_^ⴌDhJSn{k}~H|X&jIkMy7S!䔑0HܰIx%:(Af+3= ᣷__[}dJbۺ|y{cvSHTcu ɥ' hj9pYJf/7y40 .AhRӔ81Y4ָ.%.ݛaJp<>Zʾ;p&:}7E_Nat߶֚A< 4haŃ}YB kcyfsZ|z][mʉ/}`e] L9@knIbrp&8L( ;Vvuޤ=z" .S 4RzYv\/3\y̬j۾4Gsf̗3A5nC^?8$zEC}QoMgܤx1'bѡsO5~l镨ӭylrۥ)# DhVwGK 6@8y-ys#=BQF{a 7Q29hԣK5?e7NeM)}0-~RQSʹVE5MR 8p˾, x5G w`\>h<=!Zg}"`!dœJVjJRNf> *;]DL%*h|NM;ۼ(.g ]{!aAg3*A\hmUD[~.9mkiu x<<É=s݂S]q L"bf#53?sFv4"_r$#_B0hi}Afbbduʌ;Y }8<~iO@3oZחC媌$zYZzAĽ<zWֵYpbϦզ=pέst}{<*ӗ/e~{xlH@HDDĜRy"eݷǗ6X98Rbf1w87Oh}BOp(7B1O"D("Z3ďe\VoDPJ C; T@@Jymz_Z)jqH@9R}L۹JYgۖFgf.~Ey-EU41ij} v>=bpLȌ&?^?gM钳;3_.m;̰ۗj* U0xTl`914׏޺G1A4~%ED$#n(nz=ʹp>mQ\Ѐžx@r'0K^3d/GAǸ7Iۜ ^#"1@~tQG&bgTX`b'[>Ƹ t`J23ic)IŹx実!H(")q4 1ۭ֦nms9nŚcFE6N^x-jHꊓéS7e$D'!D0YP۷<:ydJK vHTJqCxbjj./JU Of3"r%.ɀ'S0Iw pνsSB 8'$ ^3Lr(<ȡ?-]2GI;~X ̤*/_m<ޖ=<%?ֺsO#%MR 3kmjk'`rJٹ)BDH jr[/۟߾T0;1;rJ%i~3yD-NP;AxN/ACw98YK)#&R5 8tU1@9%9i?}yUy#mqF88"nmOp^˲}?6=|нLWlnn_%"MU_akɅnTk}*Ę'!˲ČDڲ,9%c%)}_^Am[oMʺ/qvo9i'bB,=,OQA@N(ybզ1PbagUM)%PqPeaTG"&8v禌 qRƼ=>7f N#.,shv;Ikr9&v!?$F/bf:t1ֆ2}#|m_8:ՉśM8TDi4Lݛ ?zG%01 oB6j-?PL)0ӹ<1nNܸS6? 0!pZܡ6q\pNMsSWUdvWPE)Eٗ>|:ZНFc@o0"1VwdDtRN3>PbS5G"# Mے}j"̭#l))3!J!۶qb|̉r.pϜK3nDs9p[k" ""i3c1F?NԧeJm=&M@̪LtB{vmEJ4i#Gφ}ਫ਼ey(yoo/l!"6it5\2'JHRR}Vkm,K.?~9)2rC}z7U?whZ㱙s[`(&EUIHHjPT89}<,"벖 q)x[3\!#K'BfYJ;@։1蛰?a"9񩏙Ǣjj!Jy1Z+$m[\A_M:(~dEƶ34>@M!37vLgOdml|i9s2}J ~d `J4 ]'56ZDX ZG|9g 񋍪tm6z<~ΟxI#YRGF@BX|ֹ=kf8q,cxƳ<9"B0ȡaKc8&FOIC"6'ffU5&mM#SJ@Đܴ{]0vㅩ/. Z!3CUB%#f>e9Y>OM8ǂMh>bM~;f3UK9?ރ;TrTB39'Go}rRָ xJe[):hOCZĜvֻ0A ߹1Ӳd$HLQEzYu6z߫˶~{}eJ,1Nx R3crҾȁq~y}mu>Ԛl@;>Uڠ+ܵD$1MsnnD䦏~DUj/D#ŻwiA'v9C"Z e &1&>hyaJ=e3SZIdB^~H8G<>n)SgHY[N,tDAˈ`DA~qZhh M޾_V3$M¨  U$OaŽ\.{? gq"I O xVL/_YyAIվ}VRJGBԺF(.B sήb߿+c^C1>L ֏/ގ+aDBP3EfD٘.ח\ɥ[K^v+_^=MsJ"҄mv]8@.fiYUz#!!'6c#R"B@ÕqPgUuHHrf\/ON!AFiG5GB"&yKM+A%Dlꎎ6-}).J6QUq[kcs 9ޚ/k}l=QssmU6%sw:~ Xp<&8"`\o\E4 xS"BSwD)SMMB\8HPRN@+*֋a&!!'28(ASL`Z40}y}'!)lEu@8SB@yhQ9<c?L2]sou%t2(TfA A׀E^2ۉ3|v} ary u{8=;AO!* YJ@RJEPr!x.Wa#;[ <s ;oRyG^fF&#팏d#RiF`9cɝž5?-1SBUI 9 Zk$*96l$vNS7p5OD9%@Ԝv]L5LLyF=̔T־d!fIk1%ִ6=pϥ ",KkuYHpg$azP4e)}~EGHfNTm(-H(=Û"S=S@V/oo*Zk "@Tce]B=|s+cߧwIU "gM9?~̉AСZ=12[#۷h*aD&^JkO8=5O ֈy]0dF$UB8e)%}_=ni-VkΌYB%wrI*oOD Kͥ`k\~¶"eϸTR ;Jv}})3Jɟn2qIa"h|č>2a ׁƏuRDu4EBP}f8IDkbfH'ٮ,%'Z]}ٲ./[\lnC (D&5׷q)˲4 S*Dفj7p xp̭ϸuQ!`vk n-}b=[m)q;Z[kbqpb:21ʔ+1kAu!w;> ps'6ذp'0! _sߪo[4aҫW :XJ3h BQݛ*wx:eYft$9s3Ee GGN)L3σ@8-ϭ0Sfib!瞹a)AupE8<;ǟpV؎u/Z)qG-B•3+A;Y 5m_e֖}kv Zm-1\5̵dY;`ݷ֛sd0b[9=#"c5Z?N/9ޮ";/"=0u1Qf3! SptJ)gUsl1muh?2nER*L߿?J)s |c1 ژs*jnO:Z&j9^4rU;q|6N! Ӑ^__n_쏻?pR^߾1#1"ׯxA\rF47ߥEz[񈊪$$"̈)r?'5CnGJA$ژrkmmo1S`NnK׳fO0? b#8HMCZՈ, n(݈{)DLBIJM(09-˒RىR#"l\U{)EU DLQbk0|n^??w_DD%ZkTRkK(B)&\nKTN) x!^RefDM$<͞>wgPJLK Lܫ#=Sl۽)PwzVjMͣ Y4. )ueN{qRĬOOzbg:a3N,Œ8R+OfjfCkӐ=%漤ZA:)yY/k&|]?nx25jHjˉ%3j:*k )RL\/;R/b \ ]md$ƭ,K Dgf30v35U`yԅ*9&bDpJLz\˺eSߗe^//,!de]o//)j9KU)dfCT-TnG\eK*ްU&N4`\.ҶͬԺQ0j* " aS]KkUTcQk_# -x_^CELrNjF8P[2jRޯ,!{Hu!RN])>@̩"ݦ5wDr 3͇E7A&_3>^7NcARS>1Su"\wwa$HC?+>t0斶i9&TJ _1;$8O@PH;qOn{53%) ^%k}`]]֥;'{4L{><]or-0"FOg(:| LfrW3Ǽ!.t{t Q\ÊK.9mjz߷mlDX74UN)Xdz9udu'XxA{FŚȻ?EZ R 3G,T 5sDe1!RJQS*9b;zR+6"Dr6h!sx_RJ^rF4RK8Κh 虐)ryeHMV f7;sm{KN,#[GMsN뵵RjF@D˺(LRUNy`# bnmh]@LbT Z:8D$}߷} "bNャ)9ЪZ?тqf5ڠQagp8>OxJÉ~26 ̡#PC3qbjGL}v0&Z}Ժ}}}{{{  >NEU܃A8*=(W-6*Ji攖e&߾=Ƕё<A)Yb_*0PxrU4>K.%KJnoobf Px_(\=.6C ݗ%_UZONp+J?}nSڞ2#0,|*S朤VI]-K>Z^.?ykk*Fb9E~2ZTT9'M"'^͜R@wyL 춑{S:4@۫쭭˪jM*Io쩉RZvb9F+^嗟n)%i-DHt3eUU5#ZA0(ZR3suL`c\bzP]mE@B8ʥ^wy#ێ蜕7c|w]G6 $f;"+j'̊yC+6oc#_k[UM1t3 ` tX!1/VsRAp,R`SGtAw8A _zz1m z\Ё#@:`)p2qRb SthN|-Ne/B1}qR]x?T:O y5۾ 7ilGRONr<dz姷KI^}[m D25N_$̪r͘&3r":9`p*16q5䔑`F8;^j[ ]AUXJ!Dփ8{E %jbeٷʲʾuJJA`N˲%@,HTrjM5v\tu) +Dl=p3+0qsǶ1mz}}y)TB{m̙<|wnm#fSWwmHv]&|Ik~{ED@HIV )*~3uinGZ'37>mC_=LiOTmNaz>& jĔR)L!a9"Hm|w8C (OB)mGfoo(*pe))s53wN̤"Zݷ#T[ {2c ɩTrW)%H˲H̵=frJ(Do/Kq7vYr{1rdi9/|\,mWO֛.Ɏ[>$#2wMڎ} $tI&+ɪJ$Z?:|"ye0`T- 5o .lۺnmޏ#C8@\f,+J㈻RK4 E|e G[$AS49<23҇yf7y1/)AE<0i?jK̩/ޞYlzoGS3BqZKW[]0ba94@ mnm<3 3ZjĀ77|ZKRZ?`]+vP#fѮVeY]o& Y*~Z>>H,lvZLjooo"j^M;BC;vֺ,mL;cu)[_,nH \Zof>afT8!ßߵ[nI%ek' 0P`p Xj巿}xb>ȷoߎ>??8Qpmkv(3Dw{QmcY7UAnn潫GS6 `1J @dDF` H"3"Z;|I;3+[d6I;<9vͥ ĄLgk {CLw].]f67[ D| y K !wfF@`┼ se=![a萫cDd}~_`jœoi^slýHљn^|[8 `PQ#\{?}c ,q vsA-XJ‡MXj31jWU:ǶmVs_[78FIbDԈ__W/*<\;ITZa! H39׶/1mjlZF8Gc > - m<b̤/%h. Gu]ǑB80o~oblSCۃ;CytRt ЄPL̾|0 c'k;vb6$)I|#4jD3faa=vcDI۲toZ(5C1q)U0b]K5Po۶Վ-M 8`ן 32b~{ODfևj-"9Ors2SWzG;_uY~Wzw'B0W)7b&O޶BtjO4bY9z2MB"Z~# DM+` WxnPSt D,Bs"81v̼r]?p}]*R?™IUk)~@IJ5bߟU$z?>,\P}qvgi'j}: ݓ'jֵm7siōׄ$Ad pLņ|(zoh@s~1:sG/Б H:cLZe1+_˩9jN WdVԧ\,.`fC y0g*bVeE5F?]J@) 7Gd.R .֙M8D䶭s>>P(L5~o4Si-e%"7LS✉u*XdY-cXt003RO':0`" P?ۛBͣ;moX؛sh3s"m%U{Fjd9=vA 6Eù.֥_~wel3ͻ4 J@M+̽E XEMZtUp-}Eu9SsG7[TO㭈u' SxY-{o8Hf∐'u3IDsmÄ= o4Qحge f-P5"eI*ل,Mm\ͼT{c>geD\JQ0eXqLHdn@,u8̔OϏ.|2*"ǾA;&0 鑣`y13B/y1S_/2b:noH`=;RU ra~߿7fI69CSˌg2% RZ"tŨ%w8Q9_?j-.@huMN`S)B| l/,,uɒ%|.c䑳2駟폰N7Z R(}oe[CUJ00@n'ė)' .EYMPR\k<tyȏ[8tS.ZRܘ~QXZT`7#E\;#o~6S,+h0DJnH sR羏D:.ڳaF ?d@8]!FsH/Smfj'-<)nP'Faj6DSK[N"U,)hG 4iPjfq)$bqԱDL µn[ב>Ӏc/:~ۄyNXDr="#S0}+(UB*ۺ`mk Nt2ۯ"Ŵa6u>P.L:H#0AwswfZDE QFC%nHxNM|"1!.B;<ګK|:̹1zDqyʜmoᱬkG>Q˲d˚$td(\ͽ6PpI! 0"`|>>j(qf&񓼿;"ۆ@PUiQD@-Pv燹%=(w{kZF9CZHRZZdIip.>>@˦:nyd5+"D W7k8ö}$ Ț5{sxړӯYn,<%.'ò!ܗM ,Q r;f@w޻-k#u@#Fa9h}ۧπMMÆz/>$DԻ2Lke'CL<#!$z<*"斓tɽ81ǟ@L4,"rKbpc l$ m9xRٹ3s匘qXL¨sxN;TD#DWVgΧ-+GfjGk+3&R:Q5,,"<{ァ.ohZ

??< ?'5D}=ܘnj8CcaE_mkoG1Kap6$nR3?CA]3i}#1FS#.S<=oUuyi)7vYœb"1Ju]o *r&|[[d8XLBBkRKaǾ D8p8ٙmu yxBD,nbnS ȧ(r4/l7桐0s5 lB!Dqp8(D3EJ-E) w |&ʠe}zyo)Y Yu;$>x(O9d\A=t5h67}^EJs,sMcyI$L|FIK,< 7 ngORR#مZg GT IZ {)RJ)ǡffZZ:c1 *)f}œ1}^,ޥ | ضmnL1KXѝD p>e/I^b ~YV1˿>"k-m?C2lmoZXD| e&u@O \9hY7"zG0o=afԧ=Tc۶Vx #HfoZKo~XJ $`,*f)'>hǘAdᓾ,q.˺G~GHAR\o༥TMUG>Q2т  0|B9"א,f@D_Ϭ D$Q(usZyTxvM wO?Z?d&7mχmۺ.uwT5wUkU G #sƌDF@B^soMX4яiQWf$6R]{ Ncap͍=2>=..]A{{o?޳fy$!nnLL"5$Zj50L^)ĥj8Hxֈp˶˲e a160mMU?>S?jz)nlgGE*`NM! n2W({xKiU@jzNyN I@%\ ę4'M Q} yqo:xbYZ!0[[ YT30 "P7^~y{7Z8H5gUMm88kL-HyXlvwȰባ|Z SEo{[ eޯLm,{fp_J1 LY.џ~9Ժ]{N@-Q" NK bAb^bY9'L___9d.@fV9]}p7c_'A&h-s>(~݃ k-??ѹnkTYG24}<Ǿ &0HC D< 4&q ?~ikGe]%%M ܻ$Uj]Ẑ˺E~:x~]=#j .K@n{d:ar8}=#J𯙵*T1y}uMح<x5iTtx^  ttRsĺnfL|n I8#Ҁ(M*-zax)wSۺ"Q] NtKz| I 'ʖ>Fāffnz0=)r|&:vm]Ѥ~?ߎJHɂsFBy `mc.Ą=?\)֏H_t^̥k8Y -Hu[-0:mW] Zk/"QD<} k-]F,t9Ow8" T't<$3'mcw>GLT_+DTHDP!Q Hhf3!W,95=8鬚O+u97Pf:@]H,rBi)i|Z2>Z)"dq,oh8@9Fr\c\sggpe*gAD̐A UMXn4끈j^KBfܵ"yb4* arqm&#>L3ui I"h?ӷl+ Zk 8C3JGk Hw7jY| 0REibHYݏyM!Ĕ@x|z3ӘL#n}|33"~헷1A)#i<{q:lhsC_!Q)jϽ! *9vv4h`Jq:%NE|f0j'S ǹ'bgh;X& 3H{E!y>~aD$R H\!MpY;e+4r1uha2/T,#׷ObJ]rn 3s6A%9k ]m]y'l:R,?vAD"74C,9sHv0ѮoT+&/"8( )Eƛ3OQjL3i4yH^I\'i\LtüFhօ0ޛ xAE N}?zS8%LfѺHDf^d?˲oֺ;`eb`P^̺%<YOxMvN#r/K}!@Mws@t 0|nx>os%UNgIdOf{ϕkR b^pw'L+T F6jkCsOs ?o0!<5y4"B(jDCSɞ'D:Ĕ8ۆ8 [;sھUσDH cMA/g<:-IcHije#%.s.0[2zY,Kn m~߷u wq7JҲIZju*K8ތ/LhEsy`j@ZpZ%0kM[ϽuUB! [moB]Nj2tA|#&챇‰(J)ܛZJ4_x2 !2Z44f.;9Z4 ȋnDcQhb)%ɻ{OJvab&S`1 V56bI<D'6TAxD gf-G։X!,YmۤԏϑvPm0^]m6׋7^Ԩͥ K*GThL3@=m:FTE2DP)ULJYI8g!K˒+N F3#ļ,kK^$ bh".Ee])ERĭg{63 f/!s[눰\k#ύnLH"˲ZW)ʺKſ,Lzo7"5SE +#nD\jnpz=ю@Rҁ;p2_wkfM KaYkyVa݆g(a"Kj սֺ[W1ܼ!w83qx$GV Bf q<,9%)V05U;; {uPQț,mO!O4 Yܬ~۶@4i2UEse]~]1!^Ca/6YN,}xo7)Rmoꀈ34d9W3fRϦ7qLSSrag˞ڈ # tws圣>&aH6a>ȉ\n*|~~7;qU-`~!sD s4s00FLhE;!)"3kǁAr?<ʲd9`e]mJEx"`\̝ϡz)nykNBJOn u6B+z1<~4*, R}bNDYÅ՗>HR93=/9gت#bdC.)fcc) *" b즥H̲7?CUK=Q!"۶#A̡f5۶n[+BiYsϟ7 ۶Ex1FRDM-zWcI{zK]Zmɤ2d\鬒'=~x<#=?_}iCtd-"zQfAM{k#Z&2Aޏ־>>J®>C}R^x`@D71b1C~0wH>rx m@w"sk?ѺKNySm|⼐s1'{xLs%I,f?|n~ M_Xl˲މ|ea\\o{f^8CIAFI9nĈ x<6)C@,$Oa8ԥD&-s!"H@ڼ nq7q@.q|+x i8@8bpp"׿+/^ELi1@0aR,)رyK#݆59f&?8iى Uȅ@2"}^(f}Kpj.)$ vK1?TL,d<w~ [J#˕ x.éJMt)F2=)?K~Q3s2^yֵ9?-jRk`$u7G'`05Rg` #/uJC,)ThDfB7W,vi|>Lo݌{΢D41M{b̼Z=ʸ|SwbfJؙ)U;D# 1 zz@DFH)YLgBy[DԌhn?>Ȁ)AL0[~"A+A',=@Z|Zgn|뺖R2G;=fmkM4& h- ).9d[s8 %B0jQ U$o7ӌ * ?~\̚uBoUx<5NĀi?c>﷍d{>!;rwp+rFu630Xͤ\$dÒt¾{'p?89+/f{gkZp;Dc2I"l?kuF߿(f3WFO;݉d^8?Ys,|!t23i?#yM<5'b1!Q /3 /fF;w;=?1y$"5y1/U ,FO}3f&ctz]x`jǙ><0gR.œJa/xb~VرʛކݴG.bfg= BZH˜Z  7t]JS9LIQ sY1E8I_BHN>es7 R 15ib&"on~stH`ZdH13?{F哱pC^(#8q\,LÉ%Tz9cWr Fz?#"/S˪"e½YgJnf9@"+di,ځtox>Dm7L,?#= zL-" UP!Ɔ4ba/sDbp sz(i~auDm6iRnr2k"/yƌEͤqSD(qO: wnƒuđѴ|HRk0ljVpOcX K^@;f_ 2Z*S4zZѩn7܁8h:Zþn.B#hFh [i3E'f%l%m-EхōtugȨu ^&D/Qr+_@%io139Gx*}fk |xRRj/^\ z -(#gk:"lde]`t9+: XN*[LPQҳd|%Fv f&ZΔLnkr$Gv#2t#Q?}3@UfAxnʌpZ ZN3g 1ħe #G.XOqXm1OOU?wszX^)|f\B$C2q;w\L"  e-?`ZMZ½^J;|"zgG""ӏwfHOX|U[~ m}b.u1WUe|u!ֺGLYdϙn2D~Y/ESAhk)<ûGCh=nnTk1Od ϞރQ'9q̡+!Q\ S-eG5o9;D*Ke!̴2S/YA]#.\f>:gJBLegN$w{D^k1F:mjunU'' .W4ZgXgs`I{dIҘoM59iy BfH_# d'!BG|t, {T|y{[z}S5#c77b>>|0h)Zc3ERXz{d$XqRഌ}\R裏A\ef^kkk}ϟRJF^2g\D|ul}(KQwFJp1/bI|pkySeXo)3mKN(){$@1ѝOF0K')S޺5*BLh˺rvom/Urceޯ8+aDcYrهNlacf[8ϔ&[XX(\.8!Ii1~|"0!ӢZ Zk{_//ȼUwx<ҫRфg"$X=5"ј68Sa*c&ffFY{{} 1Mu99D.$j:D8Ej$-s/=!ݞ,e]r?@RO:΁=!gCKPDr}2rrws"aN2eٰM{_k!۷o!'iFĪŋLKaqԜ}{w&Z;R?3xC/ohMOvv9hI1T5 ̧Scdf:WUR^j I8|'Rr-K]Ⱦf*"Eͬ֒[պX`:+ǮsT?g xbK?NLIv*Gݴƴ\%"$4{RJ#,ezuxWXj^"x< )2K GDo= #ϹZLgY5;2:UdiP*rQ6YGyE0fӖ!@2\!,~ ˲d,CS2n4*SJOc4v,ӣ8k:DdwK`BI~Uj<Ǿf86<#qȽI),>9b~'fb)%"+fjIȩ~CcNxKUi<e#?i=Wrbŝ7YrБ8:df59⚫"1>ݜ!g{ tBTY!s,OT?aȗee]ü䨵>X˗/Cmk=FQYAED@Ǐ?ߗu^˹МPdOx\T?83ҏ=SSġD9qٌ,r1>cށGvYe]ׅ/޺eݎ|C) z?FbE-,1 ge}lѴS?X"4‹Vx Rׯ_[1?I,us# 9ܧ\H)zF3PU!0J˒_h#Qڶ̌7nmK)Va1pC{bXeoOwlc LԂLI=E K]s2m̔n5BM@*'SDjUM{ڑЌ0:\" rN/Ȳ\ư}opY%rfsyvtS֧w,G;r3iʌm3o5L3ka04ֺoj8}-ZKQS0UUhgfZRTR.y42g0")8XQ ZRf}]יj,?k6-`q𴳑)>T(dČIhVdaySK%>$6)J)>FRB#RY&W=__jڥ}[L+1q ҭ&x325%SK-4W8FoY 24mF1eRȇth=1FB!D0WPe6QsJe#:nfT֥Hm}N9#8k>H:{)\G"LZT@du]}FLDXHu?~o_EGU`C譍12v0$<ԗ׷4.K}]֫}#Sc1?g% ~ގ(?=A"Z058OtZELi1-ֵ:Zx1]/;BҶ"EuYB̪TrK/o/BZ#RMz{͋Hu]3/eA 7n{cNVbKQSU 3[rI?CSzyT{0ӶfwsrmrI5%_6TK,5M9T4)o"E a#qh}{mvqSa\HYVо7˺zɶǶ-=MC|c_LLF Rv3}0) {VHު8Ψt0u: ̑1Fs+w8sv|F9jnay4OqS"̷އZm?OIA7`Pk)|o@,̹ >rF@˺f15@+&=NP2T'f$D$F2"!Hi9E na>QK%Ditp/H 9A@*"f۷u5c߷p7Pְ1TC-AaGH3  L}D8!"~]p߷m ef Jl ̀/P2j)T: 11~&d/-ϩ++I{(yBy==%U X70>t^ğN#/&)lL:BԤf!R~?4ԉu]Z ,x#uYlw怰a,9"GZKa29&^6̥tY̐#Lkoo/xla*8X 6aHq{dw&,I7c.()SƵ8D,uzS @8p(M5 sImwcFkk,1.k57u::#ex=XKaơvw74ަ!\QZ'?WiWCZJ}NbDz$m^J͋nnLCu]vhYK]=3NdFz-j}oޛ[](C|h>(EpND۶O!"H:ef`C^GdZ:τl}.k]j)Rr\\].k҄i-KEo#2ԡ) bR@ƃIK$]-B݇^j^*0o{7U2FoK]X{R8هF@G#"DRݽ3>< nn ?O]knD K۶z?O42]<~{~|:ApNiܧQ'=%I'af,˥ֺ۾EJe9A2gpSfEiFMs cH,U"sn@3spC(3/K]q>Ӟwx) adl,@"S$[H~7/{r2ǡO8qw {juݮDs9)<]̙h13 PEP0`b C7a`Nefhf0}oC;Pg9e*T ,K^~}E}#uCz5ǎ3ZUUGDSVc<y "Hg=ĔZ%pYJ)>j/e)RF}47""[)&!*c RZo=' ?v3K)Hn{wC 1=Rg,|h r\3P"^#<Қ"R!߈E n:F3utv~<"ܢ}kȌ9B,"o NV&k %q|}{q0}de@Ro۶6(D3uT-DD$.Jg`\W&\-G91 UB::nc(L\R2wO[DLJA3Tdsb{Z r}lZS ڰ@әn(eס# 12s Ex\Dxo{x4~ Dn˾77{}}=_uxxb<̓Hشiĕs{Fgb]LMeYXdc"LE( 'pEsL-I*eY/g$fβTe,ZSnfXm* /"3Ve F'#W>B{?u:Ifl{.˄x|A̚?"pK*3^w$N3wj>u{#fb1"tfj3x,|<۶ZYL-$|H-un, 3^EJ/2u?*<R$ 2b~\PiO<_g|<ݩRj6uwcu?=3W >(>7̪Z,|0:*nw W&"Z*n7"{F 3SnAL˂Euom6?FiCGA)X j])eDS3t&"5E ,`-"0{Or'DJir .[29IeL !2RJLnZkUo$ăL6Ǚ csRHcY!f{%&*C5%Eʲ&B6ғ(D"%?ź$t͙b@d|n)nFbK˺Qd2T ,OX6LbQ4) 1":u6(p1 xp2iG'"mƝ5{JjZ?Yٳ xo^JRQUTǤn)%keM5HH|PYj:~#+SRH$0:D ca W'0<ǰa\w7ĉ#<-y64Xcw),K涵BE?~zdNXĮ' 3$D8ذD ҡn~̤G")%!&hNHMGڄM}en0qҦ6'Ýk#&O30)2S>E䈇E+'aޟfcwlVWDM aaIL&.ubaB.Hu]2Cz0k۷/omxx9ʷ+挖V"DG`j?xS(Rم7GH{ku%ЌpEfADf?dGxL"HR@ Zf(BDs$F ^.TJb:75'3ggQ2,rn9b&Rjضu]mEnMNDM3{;W6]ɵ.N3g8˺+1 lYRf˲ؔE_Gw`Z*>n{X /LLT7 m*Q׷/r4겤)0.UPS=YhD'? z ʦ){8ԇqw.ض0)̒I_.N}.!"J<@pB30ˬdCA9yͿJ O#6B.hE, 1T#kq@!f}T].23 JFiH(,8 i#Ltn6R.Y5Ǿ c|z^s{(v#t5"2S[?_?"'Q, q&/葾ܓ. h-̲T]!i4ųgnG6￯%]).V33o}ah[~j"a2- |x yd'wiec'p2dK`8L# N$,R6 L0lYYuP6a"7BpfmlJte ik:""E j]fbM "lnn,on33'HA3#8DQOL.G6Ƹn뺨`e]Wmgr P538snƄH>Ƙ2c=&H4>f 4ܴ0ǣ@vYmGwDDϨii>w RszY/G"U(LMa{]()벚/BJ[5Q&3f BYZR(T ay빜f^_E "2r 5c(%"r3D3υzغ9NҼl8 $* ܈ʧ`~nCۇTaĮ QETMm^nBOf,KX$JD[eMͲRR'ihr},DJmQoՍUc{$NV3K-fni\؇DDk-˲`noZJylKhm;`1콵>(!>:Z R&EHW}!Ŀ|}>fIeZ+8 x$K(iݦh)6;ƫ%Zc8gFY#x75BBvD"Pst7?(lh]}f@ ֟+#%~2hÌ w 3A<4 HI|Tb]iP=Kp{ۜC2F`m #vUZ4d1,9erv 3G@PT,dRVgǬ%(;mf(K2kq[4qnnj!,BHK.uVvr꺖ZA H5f .Um<w=Z36D8,iysC+d a#f۾B۾.ٜ`a:Zj)G^dO<"b4ΑSX>c&T4"*.r,+H9oMVji?8P@a x۶ML)*:2#!,뢪˲[R29.Kۛԟ3 Rm sjwG8BwD?K)Ej)% {LK<@rCbbD ! ȄdB1/jf{OzPje1FI}^+i!0c-GP_ $-21,s1ȹ#l$HTdSաɪ]f-ߎ,+Ǟo' }aؒ3Ԣ:ܼTe!u1YOڱDD[ԳϬw d:z"[m_岮?o{RWsl{Jru6TPW)2K`ibz  iR>e1z}Dd>Ro[]SG gQ)LDTE:䴊 5μmLsE >=#4k;kn>"o_R6Nf鶝#ƍe@s m?_.'ח.l}oNbG'.岆[zԺ >0>fZy:N@k˲쭵}@;i^7CD0^n׺{̞G n.p0>\ 0Ȗi94R11;xz$Km%>,.tkԪC 㘄§^~nqL s$ :%5y0>TٛWPf}(9Q= }B2M(U ٔЎaòpscE6sp s'U]֦"PMU3dC[$õ7 T aDP@{z&IcKO73X2P(>Q1d5<HWWeErwHa#_J,{۳dޘL>Pzx<0DN܎6xΈ(ߊ4F$BJ! ;RDD2>B]zO94y͏^HV_ =/@G_nZ-K4ڟU9yUGNA@ΐRJP,:-g~3΄2ׂq93p!:}*?~NM#pnS Y <^#~ < 4CfbQE\К]9|L:ϡHzՇ%t 82xa2Ŝ L2nDV"FDRr~B?6~Zkǘ#c:4 {j>Ln$r0iPKBL.Mu$2>'3> 8oLΝӲ3y@ud:oLv{V Risbt9((8p t8(Ҙꁌ#ov@'1dߛ2jN\8Sƀ,5,۶!@sF8C-'Ignu~'`H0V(=>75( zhgqWx |JdLJ)bϴY M)jd|UE k-lFRRʿ>p7T!l5Xkキ~-Sdu_nraqMaܜYy2H=_ a|_׵>}4B?~1~|ON 6s69O:;%% ČyOy[{($'$^H s^Jg^="ë3s+\R,"c5!b<>Vl5%r\{aw37yh;32s1,Z32 !ғ,+"P5`#`'^.3ӈP$Bc\/e"L/ Dx{Sw"Ɋ=Pg6~ z}n0너BH齩vׁ*x|<*=N펗  L^{M{ pӖ"O:JdCșD-/v$^϶HK߿\Fo۶>aA`"LEl)͝HL[~_/GchL/a\5@uRM;7:8'-\;SކS2`Cچt3H?5&QeX0+Zr3Fg fγ"u0Cnۤ4ץz,K ܹnATәGZIF̷K5U$H1{S-v3DYZ[sL<_5F6gt"}y½3qEb<3aJ0^}~{[S 8,wg~_צXf\`͹ψGq3s\9L eqJB)0 ѐWä`tlr'y{$D4 w9rR$E0s#Xe]A/_r؈'8oA."B\.0O8Zp!Hr*,ӓS"3w+fǭEq^NZy^ݞKe]Ǻ,˺4]/")RkYmXP^q~stHqP@r׷퍙ltpM{*g;-B%j@ZGD@2|܏M:F "цWљ{*Aē$Wv0cf0S|AZ+R1UJX/ ]94?L@y9Dz#Z'Zܷ!11׸D*Y8ZGBWG~rtBSh*"k8+|89gzi?V)sb$-m,X8 U~2|fq+Y.۶E 䤘4d]E Rkk( 79(Ȁ\HsvE홡=ͺD@DgĄqdBK4CcYʹEZz۶i(G޷L)aG4+%dH 1_&"*0za HYKkM*gg''̄wsW)*: Y'G$j@t}>[4܃HKps͵&@`K-L߿}~}f_Px.ǠϹ}q9!LWޮhݘEDhbV.i۾"3f~s@5 x_8]%}@KD_d|$R.s$(̓= U4s+W{?[o: 輳} <3"vպ<SC[hSU%'5RNrP1,"cKfe7<nA%hag)IʁVld~[k=RV~+F:GuY2 '`yCYֈ0G)Qf7$Hw#3 .C%_,Kc`JTa]EB0%48/#B}>3q&z S'?C&=8pxg~륏&/3CtufCm_ndb]1O "u<.k- S&whzacD\"!!!!=b"$`Ȁ''JBJ_L{D9 @0.Elf{xz]!xs~Fi 1LYf<S]j)ϖWrM/Dx~˩;~z1W-ɧ(:vPfQ Cw~^U!!(S8ç_h-c[pn`@$8q६wU/Y'd·1p{-f6z˚,$&0Uya(1z,,LH ť\{=GH;l[ɾ] nk{c.5w"T{t͸js#–eL;DRZfN\ZDpN4^(_Q3%& 2e]zk\ &,RFkC%dY eYJe3۞+t8lЎ|>V+ǰZ3L&f<Ul0OqNei˰L/߿}׿Oc u|RmPI9dZkfYN6҄f֚QfHLMNFMFd ² mNpPyٵiIѤ!2n 3eT'mKaw뒥@-Wc?Z.sSean$1ԓvb1̽ZTnzkacxwMm$ @0(Β )wiEQmX8 ̀#EA- uuHDH4E#^EFo:z,iB aF`HQp䎳4NH3xq25K㐟̨9= 3 rTYzcyq=58Lrc|?oeew04A sGt9G s|%Y :L"U1$-an%̆*O;TBI"G10y G Ue4u1\JFtG.pMXD HykV.umK-c ˉT"*zvj-3Kzaǃ ˺ޑ<2!*#8)&sH,5q锥ik[- BRk\XeѺ"qj2% kcV)A8qԧ871; @3&1, T}]kF@"f{}aj߾,ECRT"I+ ߞ' UEZKkp xakǷl9L-1>2GSz\Q7~p+}EUo>F_/;}+LM0[dz]eYZ~S'Z_%Qɗ:9\j=3i\!v1~1zS-bYZ1U;P6SӓːM> #3#5) FD* X2'%LlfJ߄Z83l~ >eYJ)~= ~;":~^Dv'| L,oOBlcp. JY͖}:ê]fxNq:S͍i |S8 jHne?1ޯzLm߇6wK]X$oۭ"Ƕ53AXmVk vD@V&?~L.M}ǺKREfy:/6ȌsCĵsf{yWj-˺RZkSWAHI~Zoa=y1ܙz=O(Bz8IEJ-L]"[Kh=oo-Q3͈ H ݥrWt  ޠ.ࡵ,) f"꽥yp.彰_Pk5OZ)ZcD8'~l;*#oLhD3XJ1C7L@x&125 n&q؛*aA 4Ox{:LhCjUBkI9哹2[3eYH&(vFx Ω $&R>ZCDv"N/׊Xj^/zS\ĝ=`Q. ho[RRο#KAUx@[M)A"dZXv5< EJ&]KZ+gobS̆{ٔ"’<0ӈp$daW=`G44-BMmR=9GPJCJED C>s'"#%)5Gړ#k!LXDZRkZUMGY+}X&Fou}{{/en利֥{%y 3:/%{T7#H-K\֏~~YEǸo37_lf5U[c4u.̐XJm] ^L@럿HH%Ⅵx>&Bއ:Tq..[zYꍙ1\Kmn,KY[k˺\KkKwSe.1}B%L$|=8x>W) IލX:X1jDs|HU/dؗ]={ff8ԟb,=ȜAoT0UTͰ[J|p&J3@"#!1#o֞G $=nv+Em?L~NŁqTLu#)\e&ՙLO 3%qvY6]# uK=")UP(RH+3,2XRY8R\$G:;y?ۖP"g)v#Y2Cvjαj]|JᾷN)""A:YiGCov1ϡ%cJ&53]*R*&}{>s-,K.os- e]. Bl-.녎\aǣ s3a*L t/˪m[/œvKxd7Uc${:ґ벬Ke0昐Hwa}rf`띠dDC5ŠpμhUx)tpBP s@M -Fw01(5p)AfU#2T߮D[r1OcZHrdrʑQ[O8Ks.Qd zceu [ K)2z)y޺9ݮWfʶIncu]W@Gȱ~)e! B#!}ZS,ue{tc?ySOhqRHt42rDJAܽMS{&7HbFMM)B}p|ֲ R4`]eѻ2m{pLhl'd*|FD,f&\"k XzYmge]pY>d"p Rm{>IeZBco}dƸ֞F˗wBrwչ(?FZ2$HjxCPףԚua|"*GAP}eY)߿8lnTӬa7~DA- Z/QZÅDf(J v+R/֡%%4{7h9D~J4aU͟ -Ty$^! !P2:,̃3,]Z!^S1 v^.kk[ocaiAWe}{G%1ռ{HvU J-Wtme]ٷrMSsfÿzjj a]u$*5e~}vwgG""PK5s{,"RH%'AD '822d brٷA @D r35o߿7""!@HR^2ӅaYE,afg0ңjzoer>LζXj]EThh?D~pKRe+K]G@zƶCj̱ d ˲ow F+Ŝo&,Z ffC[ zB*K^|[.Z@5T0#n:al RJ=8Fnԩ0^?{xꦭ zOґ]Iԡ)#$<ͭÉj=,M䎾Z1#R,׾s1 cH0m#|)e]jz8b@ &!+"_/k"4Zpj1r7ԛÊ1zr~|譖ncC0 ;H|¿YցY5E Oi!ʕT-u۳&ĽG/ThM'B* f EXk2 @m̏9  $" QELz%sSMV1cf_/D,Kavوy^5+.$4)٘&EHҷYz)x#Zk恄aOw}X段& S,63wc9 &f~lp~eKd9J{ZK@Sú~vQ7N:3#Щ;x m߯<@;)  &IRʲEBf9"R},'Luj)vf4ZwXj[Os5ǑPG4MSZ7XtkٜġLYnĄ".u]k~p?~1)EI0ZD`fɠn92 D,VU'3;{z(i>;{CێFpYbv/G{・DJ&K RmYP !Zm&(h[yUm8;1 3hۍ T;@8VpB@Q5y ֵT 1\lR.5 D)z\9?`^HlafB$$d踟o0aqjcfaKJ)"$\N<1'T3#o.R>φ|:<5'h1 n#"K-v&D&tr^{oRt>2'Te11Fꝳ|n{W6g:{Rڿ~Cu 9@xRʟ@ qDZ1 "f^Gh-ߛYop/^/"c<ga֡^kZe q]۷oR >$FHeC$|k.,\e lۖ̚\/n !;{)RD S"m{{<"Rʲ,f !Q^$轧I$%'G{^DʇQy`*Lqf^ke]΄mށsȑ]p䑇;].*\Y05s!ohE) 5d03qRg-䀤eoc,OCk:_1.u.NDuYm@4&zd`KB %uk??>vs3D4UMLׯ||0Q-{/U#My* @BWȥTk3R={ke]zT-*fLB"r>>m?j˲J8Yބu075j3}y3wÈJL9 Ǔx"@Ldg I5)Jy#">P5]&3  󾎜Q]j͒LMGuYQ OR㌜Ce|&-CB?=!SL`Bg؏)sv]ǏA@f)]q.! #: ^f%xb<#bhvdZW)ny(ZJ4yCHvY:G\. 1>r=:Uf}0Ǿ嚿?"Z=Nرjc (ǰ>r],?[]p aRXGR "sN-ϭ1t!"чRJ)"eP,u Ri]Rh^Zeutq]Z ZסL">9xG8ra&D$tux=n."tRwӥ"#1B$ Y9A@neY>@T6TpAGI<)=?:G߮KHQ\.KknoX"awLơb_o?g+L!"D"&\)D6pxZԚeO9syir,LBD0"ŒüQRtψ#0w @0Y'yu,R !.3uRʾmp3{>~T/!,,ntޱL"#`Y۾ !fOH'?O1'V{Z"C13KJ_Cg5cjYJؑR: eLŲ,)idabBBv̇Z˦e1l]&\"$J-0Z:RjϳG2?,CrsFZFRsK%]1]&|{sAs`3Ī[Oó7JDc]V3}\1zvaA0R$:4}ww`R_LBUx]/p0, Zhz, 1 Dp>|LsƒrBB,"r1}>RS>=Sh۶euE`9Qk@Ի |Ͻ@o_zJ;wSgpE2UQֺ.뺺zYm}IYӑ3Fg?۲eYt; = JYKgJh䰝YUudDf]/ܶYL}hLcpB#: ̩c@)eoLTx|B @fӑ9+*[3ֈID2c1Fr5HH9yxT@\"e߷Res>v)R.kUއ)pqH4Ev}{m:{OлMgIZkˆ >%2"<GPJ Bm\W"7c$ ƜOY̩s!LfH{ "m)Ku,S0&4Os˽6!17[Gnm@oUY$΅ʯ" f{g`^ Iey.c9o&$Bxyyn݆8#{IǾ-k=okJoO"ls#aP#2D%chZJjG;8 ]urdž3#)tՖjN}>tt|>OM~SC;dZ?vm̥ݷsNL?~׿9(j&DR}E3~GֺֺGceY!Lc\RV)EhIɩ֥"ڐq3!D4Gӵd9aA2-s_V/~nq4d#kʥoto#j):->S&JuC:4 1)|{2A R&GÙbD۶[t)$$dNIEPffV23$®~&Bvk;#.ZQz눮2^^%g@ >_ș0g$NfJH9DT*1'bTS:D2됈7D[,kL8}͏]Dssh)1OgtygN%e}&%tӸF$Zbb$ x o+ZkTj!>)\zϫ='Vr>~:  @)RZ# 2<}hƧ༸[˲HEME"Č(6ٓha As\sܡ#|s̿{PI_^8}>[kH!Te~$ }Rs]9'"1 ̄GknVkeD$뺎>ZfRn`"= L4$(1J0As <R8xV5!lV;\"0Ӵ2L"qQ祺yK-%xyy|>s1*nDHnLe1 !)P&| 3KL`Hl3$kS-KPX>zJ|汐#C2"':ڑ>i ܂Hf殽m OLME3R[3~_׵~>qLQ%˜̐(L <ֽ^Kxo{Nlch12L* 63]e̬2p&#"G W02/2L9@Ĭj|eGǜ0@) 2WtfQ5lCp`/; i/0M'׏`!D'tU<wAhœ9yDER r HsᔢOz֚4}F>ӛ#!$ gNZwpZ1$'2q4)Uq]WS)52.TJ`f u%2IÎ~_l1Z+9 !B*3ge˫i?ޛ˲"蝉)e:x\P%7U>Gl'!ΰ a"DBq3sY.RO՗Oόw5+)qJ")R59y3<2o%&l wJ).@n5gr+LMZB5=?!$54"de1`.ю㳖Lzo ]Edc<۱m뷠F_N$OE [#1z0i I?m?mY֟c0pωSJ6z> Lz̴oϠokq:{`0#I7yH2ǚ8sk=:Zhphoa3{>Hl 2;?g ms*Z1zyUT 0%WќxkHB[KrO?@+]Ft| ΅#*`&`iܴ Q3D9Xk0#-z>wd3mG*-y? u]9HԜ1t#fF8Ȼ~t82;uRjl1{H|+6g{Ju5UB&&b#x)V1DLљ3u 57CBL.Ɯ-RcRr4&NCThԐC,FU::!8.IRvnDLz?r`3Bl?J'D=8q :7VTDJzm]ܶ:\dL4"Pq^yc1)(򄚄3GF0CD!9wv(&F!cL)Bsi2V5)T%:%hfS3R> AtķCT lx^S}q'qۏ?>zo`FʅPv]JIAjt1s[Q&1rJF\Ch' BE,.uiPON<;.VR&ž8z6;O~w7ZGJ֗mo?^ۡ+p2 ;@([`dw|۱mh!S6u,Hj!_^DgD,Q#_x>g:3RluX%*"{q U4Sv SY]H2OL8YU(A 'DJDddKٺ>N̲d DTܷK)ϰHLG =pH6%>z$mYe0Z&rIڑX3} PMʁBH.cqd>c&NlneY"dQkyy_d,{KLdZkmۺ<:8%1)Xe'=qHS)* i&K"#AX5s~""s,:ocs/RhcGXj]g46!^HH8m6Ue"D/%;q sל(Pfx'pDC$nooT%\R"ʉD33ey{{5hO>Ld&^K~q}?UiSp&R#G1wG8$V"Yl"s-+cӠxepdNn\}]^_~ƚ9SCs5ޥZGb/ c8 I8͙433UZ7)gCb0\rt2E}vfʝEu qXP8c3hIl.{ ^L(s!θ3,HLv;/cBTHQ¨a_FꓕzauҘE8sf CEt 0L[ USDMǠS*9@Qr.7;Z?tЯho`»7#crOY LO 1ۦ T_dzZk-9}ۂ6M3S{tUŇRN)R\ѝ;jlͰHP%@ѡ"x{][2(1a7As>KcȫbUw' NׄA6vt_KĔM_w"jN!Gev{~ރl2ђ&?xסn) $SʳF ZHfgPlҘA58WVk=6]O 4s=03*Tin9>ܭ61]V~nwW{!>!IFt3͉sXY_+DȖZ2keY5\)HM:%ҜǑRum$s1Hr " $֎//ַȥj]8"FšxYKpsGCSJLlnqpG08HTG;vߎYry}gœ51G?S]TRN=Ѿc׍?R5$p[3RcL E3!?^R^?}}1j~/RJُԗf 6L!3XB͓sD] XzTu]{8KηR %&@ QٲH"*EEMs8rNLDmoA8}'|NlG (jƦ?>?JsH0뽗&F=mjGk9$CY~M)zω2m\nRPm@pĴGZ6C<8-G;Sa1D s^ LS"j&ap)˲2Ʀ\ @,ψ`,J_/CuvLf8W;fjuehƦ{"`Sfb._`nD!Q:;dW:l\DXHQ`dNk轙" |6kk &!$9--4qel.ڍZd{R2')~عfN Du]oC>beLuYFOXt}]5d@6$H8חO7j(YDՌ\r]˲%ȨCh)eDL"V3ٌL ynooOaȬ(4.'!.~=У29QZb-\6ڐe- !")%WQI$*VZ9,۱@א[XR4v[ېgm8Cҥ\q<^j)}v1m} Lm73Q%"]T hoC yȺ.gx"!Krp [o= I"31H{"#ltdQ;1Tf6DnD,%3gέHeaB`ʱ#ض\Re)}eَTT'T!.rJ86iYy,p\Amh QrRޙ9%e6ǍJ2ks0T**5 }gBH)se-P\9D0}88\xf˒;S=j# BLb A+x?`vD3gH&Y" U bUz<(yѮd dHVlB[TFĐS؏3Ϯy92 q-""۶qRRk]|u]FオR1A-\rV՜q8c-xyM#\! pp /)3LDsxtF9$Bf \{Rƾos@m{{-9a$)RF2'3(EhfKZW'w|&[]D@DrO۶sșZ뮖rٷCr'em |ƌ_oNhqwri~ttwH .-N|K6-saf MDZof8#D\D;əBu&l !8sgG >t '݃tn?8q`n``~ t15&!˲l*"XJA1:N+C,nV'i8PK0%"w$s&Q 3M_8KG N@{.yj4vk_M2٬\A_A39'*`mœ _qk}^u0Q˙|Ok)IϚ0{穻2&){G8plk9EyVs"RJqiJH$$!Z{WY@ `/K;A>wu]omOAg5\0_A 'dfųO@PBpT.H@Z3Wpmdi&!\rK%_ۙ+&0D/֔.6pRZ =T nKYo~CsNaz`fئEmI/3Gg.9G "jbQ.i")1KQgk5%t۶VS܍^wDK-|߷ Y|A~jRu}>YVHGW>b;\r'xk-(v[1"\߉)~G3Ra:i'0h;Zkͬwtfr5z9ox$zġVaG07ID3!' AZ #wc6RNOOeLC. lm%/uy2^lF3Ĵ,K\DL1r2u]4\5gbY ET_'UCB '@1DL9m.skI4#mM}>*→s{3k9}o9~XhKɑ "vvQOia#!*̔Cf6g?ɜJ<-:G#}Ǵ8u:QI ,ySM;=#C"q3e-w7gy@}xZs&f3xF/79V$ m#2ېDAGtG@ ;šE蜲 ĉsffZ@ԔAWPл(D n"?iXWW6U~V3bhn.F] !_WY!1HT13kءʜ| Gie&fWubP2uęTG3@ۿHJx4^ub兀2#诉S3&Dᘆ]6yK3N__OP_t0S@&~ۤRAwB=(dD0ʬLZnEFx. (it bdNV8QM<LG- cxkhCň|vc콁[)3o뺮p?F>k)&NpǺ,???Ye.( FλE8fG& ZDj QsN9XVa,6)3/8"h*9?Zm1Du5́_#BG ~=wo H~}o)@J,ȥ2'SuLDj`?"!u9 .>WfO>4zGRڷJ)2 *R [o[B: N-qBa:"8=C6Dk- NLĜsHJj k)0_~sڶbv[ZKwu]???9%ZSQnj17Q*{+LKȷ6*!!]]_$U}PєHD ZAǝH9=^^1:>95v F-Bbq )ڔUƈ D=1"ct#V:=$cC,Dʈ'CtnlfșKNC$0st%۾X~aFwL~3Ȑ&BTJ67R"|ͪ@\%2֥ F)b%;5!hLDj937 Ds+u팥bD3J ]p")'seM}Emåt+^}.6-sJ`Itnȉ*HT OtA`|yr!&-%'%1ec#3rbBctc}Fo ~`_W8m _ʳ!^`͓431rWcP5Nn">mR/O/prdIc8Ч<(FTgi (A%"P,s $00VI@Wlkم>_*eFhb-KgqrѲVf~c0b?W 2BjK^ENmV)(Su*0*R#G[̡~]2HT Nu[\k#4)%w"48y)+Ay91W)R ZN̕ѻsZjI!~")9fs",ǧP騛C܌8 3kexBDcD֓_R_[D_^_])&jDS`<0rB~ ̍RP~(/5$Di 6Lz^`Ĕ\"DQ1FkfOixs.)bLvJEctӔ2%VS9B@lRB(9Ȭc]޺ȘD LSqu).QqUL\J[e!>z"wa&ӈ*2AĒn2nGJL/E}9%۞rNc1zs.R6kɌ\|jO)8琣~ϙ;j^u|~~$B@v(tYDaen2hf)ZorM$FD 2}+'8!\)$3km8Q6\&xg: όTȰ5i'ʿjZ::1?l^dc%w 3NZxyѻ#'쩵!0tp%61T8z`ɐ̜Z̔K (;K[T5vȜKTz3ך! 5nixEďmzR@Sʐ|H=ԠqBsdYEiamhvǐ82r?ό*uu{?gb1 a=g4,x,(B~nn.DbwP80)wW_ w+% (EՕwt 1~Mȝs"m11fHHnnz[{oǎVQ?{)UcN)U3 :,Qm)9󏷷۳ww}j1zBo2K}_ooo47rNc#5RV>8ؾpF-9G73urι~8紀C$Ŷ8eĴ,KNLj.19cDw#>ZJ),qy}?eZjZl] QE">ൖe)u[{{}?jQKٞnh6uNO 9C^HbafoooD$jL)!y}X*1b;D, OC̙0u29;*A$)yS{!TZZK?PE}0p7L5as)5dGNS/.ꓙ]r"x)9%@>FΩ"2!9@1}V5&.~z}?SdMnkkG ĠN3ZN@QGsUq3UeRl0v PQ.E;u*fJt/`DD(RTM/}S=i6Lp>_e+~W}%I3  P:w(>Ud$u-_U=+\;~UG5kxvm8%fw%g~9`6 ~QG!XL?ߏ}~uCb1w\WR(a$j 3#= P#I"z=|gn|xma pw,2뫩}J~~ l-v3LX>L@B3 0Wsŷ"0q_rʵ4%2(Bf2Iݦ,HՎEЦ`f sZ%u]| %@㘙6HwDD)s,*m,>f鼐D܇~-q=d}X4#&C%5ư!y/1r O9, "[kjk\jkm#@F$H)}|GO+v1"o˲188' sWRmO1O)qح&!Lq)+n6!{s8~a>S)\Vh%DmY" #B,˥B *ǿ9)ٙ2[vj( Stq1zjYBغ"q#@D"4蠃r.H4QЧ7SMɁ} wE@p_lAsd@q`J-.ƜL'!:.eG20z"( "sjz&.<_|+5q4k͙_VpS7i*uYJ)L^ھͨhd#3OTCM.5o2 1|!fS pmqloR8LjHj"uY=E%p,q$FjW~~"+ dgGf%|M Nï[mvwӯ~2Rޝ%~q004#6r R/%|ZeEMN̦RoKeZ ]|!dNGO11wdPۏ0@3oG '6s -- '$dzAv6&)sBZk]ulAf:ODa |ko74W 5p"c.2ª7ُRLhau@/%ǔ(^U{DAB=`f$a4|U0 s@|:ZGawUKk"fvrO׈l PURVEMԘ$r>"2!2R\ R ĵ#s2ay8!D׏eJo)( -D)Sw1$0-ox}AޚC<Ϝ,%`&SR3NP=B|Yj9rۍ#ϟXJ9Zcbϐr)Cn1Gvf.:Rvn[DtSFwӞ%z&R+ pG稵=Ҡߟ ?O5SR$s@! m ŖL(j1"к%O\RDo3q@ACj˩H J߲B,3-Ċ* m}7)#H$}@JN`^MFq:͒H)Bu _Ό:Fq_f7:΂UE3}Nτ/]݇X!n`59ܗZsZR!L2JND BuKpb3.ǝzCT_Kg*͑1<@^!SՈh_ <_ )# YJ-uYTkڦ_)2hN2— ~uI8!%zC$L˺=~'Qkp__78x| ~iSyU&^+)>?ߺVx1_D $p@ 9D&=[KL`:gD$j*j\' s@ʹ[J̼ ^L807pEO3JVDgĄ1U Zvh-"KI} d9x;[ə5r3 q{{}Z mrFtdti#x ~)ֻ5I$ٙz3̪!)ݣzjɊpt\313ֈzz;J˵zE3u!<|Y@G֮VkefKh3Hea8f%[&ooۺ-xK&=}PLy!!"\ajfR$\D(sAXͬzDqÝE+GkI1Б<sfYyx~yyٶ?C1DjnH%gxnuKTECGu݊ L ֎~J)RD$W-֎L.ZkÉ=S^C8 #"2lxl}YW:T{ԥ4o/fiC khf~^}}~u-j\u>ߘCvaS@$=qL6;DSȅ, "%!l[Il}PIcxX 﨑˶#ݧ|Yd G>r"j __i6~DA{w&>E>(1[ɖea:Hf ;D ɀv2 MmKa@HpUw5d@o1@o~r {gȟZ\/&ٻd8Zuh)%\:#rPU{oKa怤fa@ @\8[ 2N0Eqt,7˵k@nmR#eb,͜:wc\fo{mJ0r&+ ֢TGܣcHx^Ńg4yrOB7rNΞ8Č{dP:~d Es3}FK0i;p%0Q@Yxa 8轗"`S1µ+D -C̑]M}Ox2KZ͋rܐ/M6R}n gRCNv3 !>HBb&;"f9V?7ߺ?~ F C xlt&_z i[*#EP6|u~#,,yt[q Y@/,Z7.R=m}Ě$*Y#:41Ӏ9S9Q4gBqz 0W63\1wwLgIS5mńZ%"{GZ03fyB+cd\m?V# ʣ&^"㏟?>?~熉UՎ˿[3#'F"8Fr"\FF} 7[ׅ)9חDZQ s&$2ZSpq<,EM a[W _i^.\@Pu!rdRKLT{bzoe-BB3/k]ԔP j]u16R2W̳|K9 pXJ^/"Ǒ8-2쥙 ',z r0,z; (Es @ݿn_myS9|||>4-L$Bs3kLg<="vW3u_jy} Ѻ<j@3Z&|HYC?ߨS@ D.j S$BumO0cD\~BUpя÷hR3>F~}yٶTcWaL3Yez;j-fnK)F9rCD`Qig}p/8I< k|fh%g(nC'=vDz.~TW~=UIw δWvsG FGӓp|'wz7.B)H8ֺ:zfs A0i^L0z߾q쩫Dl[ĂDyki߿?4EHyۻ{Q)u!ԥN\[LGtBf\F`bI㈻evpbZ譵0cAwI| PJ)ﻙ%g60~_GA`"!HE-l]@{&dR)٬hh}dN[a"1! ʺ HS^uF'vZ3s1,ۆ䟳?zg˲Y#Qj\jh8ZgH>wL2TJq\uPSD0${ݶ1&,׈DHDze{_u]}?ֺKkm(SFxFZDJgN3tKU)_}ePZ#9@@BUK6)eِh咦@*. "-jc^./MUojC}]/n_zyysaÐ}¥bDb9c,ff."լ1bvW]r}9d@Bdp[$ # ӥR$9v|އasDm%?G4}s Li p.ACwbzpeY Aog޾0=K;GGN4Y@%COsUz;۷ >}uSf|y"cZ-<6yR%Z33:4gxrY8f P[Vq@o`e~EJj-rR 3#gK$% .eϋZj}ٶZ蝉e᡺#XD`DRE{ީ0a 7RKS>I'gD|4oSuJxwEgR3] Lƌۋ>aHCƘSy<6g%n1xwɷ,çpW<qwm|`t``DD?3[P3qՎ,Ws ֶZ;fKx"쪋p*-PDt4\ 1qIK[R"XU{|2N=Yz L?:3!LG6L&bqGasth,uh1C9UɩG@˒pA jL½u7pD,љ qiAJ7.1t]/ԏ[& b:jgD'1./:G??Zˢcf?Qw<>2C$X3.FxXXslY#-mwfA"Nzb: @ @b:A}*X>uHSMl6LP}rn"A&(~K%L㷻RLe~MBFЄD/{-%lpZJgJlfT~WGDnZWf5>?^^]Uwfog8~LE-f:ļoaI`Rs'&}ߏc_ H˺2~8Yјŭղ˖Xs`a$c^bȊR\7ubbW%u]tDLI7d`p&z<S>M? avς;`C^e2v;"\H =4"g1 >Obdfa"9 OJ9> f, BP"zl!L#BEU}h)1|z.23Ȟ;18A1!f5pXBUz誩7D$B_ѲfU5w8!ag4qǹ¤4 Kd}c,oz43X!—m;XgS ;3(>&\}䋘8eVNLy=_r#t{<}z3czAܙy bic/¿q';0(\`Sg HjGliBu]uy\ֳ*%ʖތ, 2 v@Ҿ+=<+s}}!xW۾`)82Rdj1=}$N5fqrC9 0 tpfG0uִĿ?<@(uE߿4Tge<1UqU8wFۺRpeYaB؇* Ee̼. B9>~||[ EdI92aD99tp$19;"|cߏ!3>YwQ^0TO])RKAܞL{{@b;H+XH^/c{[:%YS[2@3/&hVm[ͽmCV7{tXxݴf-mR?Tk]n3/ ¶岮'Lf n/C8X ҵ5VrFoVK!.c(Z]n@w ZWsuqۉh]Wd d{c"7Df J6}Dx>ڈ8ZchBqHnr3Gf-y)Rh}2pB%=L)n[MnB#hS`=RFf'ۤV殔\6Z33"bOajSΛ;Tw0Z#AKBfsbSnv !B}ARJٿ~Z"ZN1LZPArp:M.<"O>we7&R2Q+_tjNX`9>>ut7ߝʼn'ZrRjV3Ù]lYTc*'1|id;M+-a8)FD g t}DGSr ~b^e fX-Ez}UշmfG,,F{̲=kZbfR5о8Z찱|WC/U': O9Κ#=1?̈xP.OZL-Ev̲%F{pus'$azvW΍ՍqF[uY5G?`zg=+@摵KfF R,[~1Ah[8ga|'rh OAC-DWSMJZS ̔/T!cڟm6siYNM*92쒉#,mk][;t(mr^h.EULJbZ]ߑ)/5@y -Be]18m+#R;e@͕RV^JDy1t{ Dq;6kzKBy,u =@T `W5!ip5[ Ǒg[a,Pf,1K 5/Qfo|rіrBW˞yN2s2 0=Hg-l(Lf'G I-Ksa? '6={Iu3> B!Z.>d9C[CM1λ,Q<(W^ֻi-ւf>z2“d!#SEL}sA< 39|#bf2\ K:"@\̐GS,kEd!ILzfU*_cXVHT B@ĴeLHhn/˺.RKa}`FGb&+c ̜BBB&oHYneoZ)u) 9Қ)n8Y[$S3("0sf΄OIC*,k=a';O?GMoMN{ AxևĶARk>P)bfzy}ߖZHw~y?jf.4%=n&hf,"jyf:TMSi8 'a!" DA=WJ!rt3Hp7fp݌13+s[']$KjD_QE "M#,1K4Vf}_̑PJB5@<< C 6Py$%dY6lyPbfm]Wc4)L8RScH(\uReEU#9[Y(*KqHar)"Ho "|~}AB{~̉2v=1vop[~̜v 0"1sS#)]]5XHaZWstf&2N۳21.h/k v@DH˲8U3\017S&LLLuZDthk] -5wWi<,r<;?!"JW>5gzm[ aCvtu,;˾p,3pf LYY>񷴺} 2znHG-#%Ǖ0 ǜ#oo)wiZEDkJ̥0A2)@p#„!ǡ:PJcM@#ju9}#"O4D*XCg͡"j ~cfbk).%'-6¢001L S'fݾ>?j)Fw1l!kAs:)˜0Ļ?g{RF2=ӯp>#ũq,LvA".eY_^6Fn@$~^hG[ja}R rv1r)=.;ڱ,бk"jr;{ s5h2#m#3=ZϢ|΀O+"K"WD,~Ram[o__~3@lMJ] _[kmۖ;*e!>X},B}xyy)¿~׌eQqh#q(К~", 1!(ƄL2;=;B[4i8fwV/"NphYxN0 1#ZÌ GySc17,r dn"q5fܩ:{©-XLM R{H\ ]uIkg3 bGb>Gr0ח3+R\5_{;6H)"_vFDRLdJz@Pm؈t~.֎\mY>CM۶kB(5%WJir4EJh}ʣ:0 {ubU 6'FzWs{'MzlMUgE8`'Q-iK-YLC 0^z#\z)꧙1C?n.@cjb-" % `}O;0].ҽ0Ʀ3N0[wBj!@,ZqeB~ϑ@D5xrI'?+tu~bb1yV B`TQr#ԝjg $L|Voq:nfK~ yvBG %hgT=,)\n!@LyN~F<\sjN}]D޶wPֲղҺ///3!ʌƒS1"K?ZڑBS}DZkݟm 䯙8a=" xz&"m=zVΜ鯯,˒XeGceQER#?Rea/,e.c )5TD}دߥFK!$/SȀ~B$ޟyV! aDTp-Er,k,lFa2ysZsYoRYOr-L?c,zg(e6}\=Z7Dz(!0)Hs.RX‰=ͅ[ Q]$3HJPAZ0SSIЇa%k5?51Mw?[xgi 2g4̳J4RF͌ό()@zLK-RD M㶭g«1auYPܒ-rYuw_"N7!$;Q'9BMsd!7uՌԮR$Si s 簚I10|0q-PL%Gg dZG|L)Y9}<8hK7]sD$-w3`{][w)c"Z$+"}":lR{6KY1߂b .T"4w&2S%0O;\*t֚_Ef,KU,ML$Kf}1&q2.}x Q:_sw#2 xaxJB<# F˄7["2Dn߅#_~A2설fG0KT-1SX&irvۉ9\5o ~H@ ˶D^2r9qg@'cY~tD岽]њBxsa6vVJle[/܈9AoK vۮzv47+EJ&ڶJY5}v>M]5ZJ1ƹt @YcFq/" \"XD:qDd<Ԙ0V~}yc>rӇBRI{ffc,Ku} @ow)@'UKn!F"qrϟ9en123W#լZObOh۾TNK=_X"]CÁ,u}Иiqޙm &wHQ.]_qψǫqOZ'MydIs3IJsWԃNR0S5ˌ$c<B CUGk1zes.;?m+3Gj0[ZLPc:LCL50.81fri SH\/xC4zJa*<'As(i $2@S{1#aVLZ0pdq.-/x_yңҕYm(tx"5IB hH'(ߠj( ,oPchS/ϧNCz"bOtmSY8#̜%=/Re1TeI+]>ci#m e@@.LI#Ax 3&s _|`W#}cZA!;wKS,]njT3b1->i]e7+Lvٶrb&&1RLOoKhf̷m!-Cs/"m^7H"_<ڮc1|?0~]j(`#Z8 ~c@@Bfՙ3A+QXirLn0FDaA'7S]3nf>x'x )?'#\g"D BT"Q*\Gom?Cu !e[?>~r#x#ח8v;[ϑ ra2nֺ\fYd&a)Ĥc Q>^F"v $[fDu]~8z{}%ϯCsda?^ew-T=͉@=.{F0R1Jغ'Mˊóp"hN]A$9MRJA@vm* ɟ#¥f:DJhގcY怄0먥b?n۶ޓERJ:l;'lGH K&d Cǭy|}~.[G-2D>S0ݯ/"\Rkm1t283  RU#ǻV PFGa W^1J!TI2#CU2[=r7B'Q>\gDAtcXjt5|ÈeGkH{fz!n\j-RSm' @އ;Z1X1oh!"BD n'P* sW;՜fK-B;aǻiFOVY$y{:K5<1X37st8S`kٟdx!HA֎ CUR*r +oZJ)Blu{ ȺTDTG=%%θ^wT5d2Kغ<-@jəM-i =d1Dlsnw88M<̳ ?pZG0`|V!X3,tޡWwۣO ~dij_Ryph>U3)⋸O|KeTq`N#4."?mЖ<<π3rI@qD3uhgt'ƩPUӖg kx>5߄z p^V7Ùo 7J)aKZh.q1 sZU"]јy*Rj]dmT~ {SbX nl0DI[pq"_ef\J-hx |[ {plξ{c]WPUd80Z!D*NaRJQ ~E<S~f= fS F|ZS i_HQ)$u3 pVi]tai)D8?~=Lũ!b*K^ DT>4nHZOUNjQ"EDhiWOU+uaC=y[zqHzT"bzUR9Y.L`:f&16QHH)O8zDijnp/3TD98!c=S)A@6eʉݼY/E"D<þ] m?>>3/\]c>er^[;k6SBL'ԒG( ݶ#G.M; YUVOZ^ӿL2pw;̅9(I7JFvmZ,VFTK)te^;ERxC_n7&L1sGv>v ?nu(04%*lG ;Q$̱hn~6yȸ*3?>>n.ϣ-ۖ ifj<.uJt( !R]9xv@81yFD?>~mZsz@RDĐ@ !Dov3mM&Zюpp"a`y #5ΓjS_>@/ n晟졔% ZK)ycHhGkt3ZT=P\ yu!rg7YqvdKIΙDU85OQHc("j:Z"xb\BĄ׳0޾n0 S bO[vy{\95ŵ?fCzi)Ze2'nk&s ևp$f"cZΥ['_4v|~9:MU~.5/;Uo̦/i>Wϼr:5^nv!&hn5&瓈khfOf6UXZk%!Mf:E=tz]16GFj{} 3ihb+1*;숏}oMu|k-","˺跷C ?Zܽphe"H/OR<@k=uL[C&g@UfBw&nz ,Yrp$7 tݴ&1I|<+!_V׵:zpgR{l:1FHq׼R!̈́Y"rq<8Ur1zϚ![Z:,O;NP0ᴯ" 1\I}WYi,n˝s y>:4hgT̻1!NsCgoZFM> /R½Fs{T- TlD~zcabGQ{cR$N͌ޏcg$b";@fAB@WwWF3CBC{*gH,X\d1tߏ0I64עE2nǾ3Rkbf)sQes9s}QZȈʂDOQ\90"x;5j*!T]🨅"f O44a((Y^I5gT2mLM$*ALR QQ@t}LR궭o338 ),Hp=elu[]k܍N~b,@=b@€ Mm6fR{ # bYn2F'PϏ.GB"?~vw55Dg̤9H5kD ~=ֳYD&e~ n9iL1S5I fۋS 8IcW0N\"}1tu3/KD䡥,RcݐdO88Ρ/ \^7;_cԕHg-?.Rvu 2R{z{;8쓚ZR3kb,r#fn,8TR[ Lu)gm,Q߈TY辭ZnHҎb"3j"[Kyn-V7!q2s|J2E* {H1,SN-?1uYAvjz$` 3 {Zwo=Fw3< ƿጝE4"=ֺ`EU47UUT3Z0,S:պ!gƥ=mXH|3dAXr}3E$J3l֒]sMt LPE*ϸ`⹐C'F41T5:QYoES }nP(S5ՙ02F&nח M5`?#"s`5}c<@:qY0S]Ja:"#4pΝ"v~ܼ[0NbKǶ@4tLG+F-%QB۶j)1zٶ>̂ 5LF ,Dj۶w9maRJ); "VM}.Rey>J*ER>*I(戼ϻ$Q:t/.oOK#QR f1 ]TϝtRe~* d}qmOh(|~~R+s}P >8ϯNw`̆"ߑKrmgIÌ.\RJqvH6,Ĥj\@N#eYM,Kq7p~ïF2zry=ExVhe2.脰ݷ۶m||!x\R\3R 5,__D$E91ِ翉e!"ֵ"R] }2 3IpLH%"4rP܀KzįߟLȜSDs!`rL6B:9l̜_c| ͸on['œjo޶81p܈Uu˘&s+"Pgbs) t"9^˯f&&5~:v|E5.1Q0XL9_sPhZJIq4!HJ'1.L5z#%= VHݙQ ٫ϔxtպK):!ReFjI"m Gn&cBl=q"<ϣ~j|dOt”*ԑ$x\̩iX9,N>~vɣNK )Gkw zYY/6!3x e]E"8mCBo*vwztg-B]U=Kx]8oi}Gsf!ķۍubDJ #/{|D?a4ȅ2 b^D2=m۞ϯ?>pSs`G,bjGkU 3$}"AcS4#8H0f촚[;mKy`s(UJ1޽}E8t" */&JΫg}lK1c?̔d/q 5۶wJz} ߩ3,;UܦgMIH풉 {I -̈́CY#%9RDf'M !R"`7s bsRN@8GeR&G'=]c]M{m]vW.vVۺsccy;J\5"=ADH`X9 6G*Lhzd$~$u1fv|ٺDdh6c BncxUK)Ex]w1'to?~||}!YolMD&nNr0u ym몦j= {pf@lۺx疳8ceXPu6*Ǐv׿mĶ9!"yDGM-t)c}bku Z"`h6)sa 'B_sn_H_Hp&wym̋+3\:rp.,fnf7-"ocY#vGyD؏#˪lhF<<߿~9gP!'wZ+jVJ]VB"UCv-TZ f@yT2vOeuus@ 40w&\E{oByUj>\pyc`@W }_t@3 RdoL܇0 Yeby 1kh!%5nb&!LJ{J6Y8t4c$%U5w+ѸĤleD2?Sqqvm]'8Y[:l:BZ3$@m%zWpO|Hs,p2 MT_M0ywle ܶەxqR@O-e- 1p+msI6Z3MY3<&# HUsce*5г:hrO:5z 0Kv9C]j3 >T1ejD)<"I,"D_lg,&RMU[ׂRHe]uY{c߿cw|-J,X>>ޑXGZtSx^jN"~4нL0ZZgBED"O[k~cN4SMPo- u5z@69}=gRގ}߅)UVKi1 ^K]oQ%DD$"i7~֣ФSL͆I;Ut>DD`lm 6oqyxEW-,u~"U~7PS_d37{<.Lhyg R gąKD DA2S+y sOׇ&Դc02I6Zc]?Wv+gٔ;jE2Wc 5@?~|}~B4ǩY& AEX@05,˺j,HUG1 /RXemq6E9/@D02|EyV2^҇#"s%Jb~EN^$֚Gbr&bb)"2.󤍘#eKݖ nN8LiI$}ܷ~7Ua64D\1c1= j~>E:zb i]vw53'$so[xQ e>GZ_vuٻ?˲d& 1Lխ緬CuLҐ gfi9G bGxSԝ=l88]=SE(k,u[uYh0@ M.Yg#Zw H SnUBc{s">45}&|=e1jm0c[)B˲nk;g)Z ,*R"v6u%&w7][g{뙶VWُ Aqvs1Bdzb^te!9Q7YKw:we3"-.L%Xo|i|UiZs 9~tPebmT LB۶c?=!޺0H1sazrRmmNNZk5Rw/"ٶh} p0]!9Rn:("f>lGf>OP5=)lhȎ.e ϾD$̹wAjjN<BP&LLD,y!q6sN=:TaWev!q3 !f8G8{B@(1ZÎFv!9g) U"V{^$)Yh6&B9]CDWKѤ5oP8V9֙XfA> ` G|mhUvf-KHy@\T {ddco*sݞLr%pC77Q1oVC'Bb "@)eLwo]SyP. "S6cEwFq"MMsW:xFܶ[L}*8-+1G1@$ȭ,cb Yd^DL#ֵJ)&F,/)b:L[-5JrL^wLDf|>݃3omA*!S}x81CZ~9, @ts1MUf EbRm]e"l `@`SE6 \cEi+Biv.u1lGźZ瞫I?EqS7ݥ׼d  g"O2N.D2s#ly ˜qPrC \4Jn5OY1>9?c[vʹY̔0OAL||A784;EӜYo9=>UjO^iZ<MZ+Hlv㹏v(!3,zOwfGj}&e,H@Iߝ3 /µ.v\P N|Ec8C~W=JL>F0fIƈ)*B<ÁJ-%'y#VIUS$ 1ά~g~Kvr:eQb "flsj~s{$<_ N6 7 <WFH/K-":!R!+-P#5YN8$6x; w܏f)MKBf,KEZu" RJ IK!d6xm]W&h֖eaf1W8Rs˙5ДKNr"?fĒ0[:a8z1'HR'F_IpŎ\v8sP'e2Nk<^gR&q'qR&mCBwcu]H)c5OBD][~izI}YnV{=暖 {d7 NEF![~ʺx<\[D<ᐁ'LK8R>z4Pd"n<6⮚| БugKe"8s`F[5[krqC];Yj!}QЪ|-"=O%s.r ydklmrÛo"!9R-c5GTTӷ[ip˺mJ'mtERq4 8vG dxڠ3"BReUU4Uxh3˜?ؖL_-  @G|Lu0CI)30ŬGZ1Y3hϿޫ#pw Ј}yOf"H 5 C#rs`:?gN?e)em[azn90q&%IxMh&Ʀ9DSC%5DnB!e 8yYPSKgpyR%q~iCU"U2#.j6L I|xd^#C&v0 e)EN*z1rJ"}PպuD8G0ǞCG|}k_hGrk2Sf#tHO*rͳ .ɗX>^/ 5[^~- .\16WQ-N*qsmRlq&(fGF%MojDM7{>E 3!QYܔ”݁i)|&cuJw¤ 0K"{߶mt #VY[J)LuY{)enN]j)Bǃ MYX& B:ZFTa<49"PUb~#b4 " @6J.E$Bx$"0W5˔?_>kZR1`:R)L_?Rp`Z <_?m~ .q,LΒ |m#ϮU| J.W.ՕPMoWj!1ax&wWNةFP>;HT9_jscᒭDC \O.3 Trx0T)Ie_\L0,q=+(tևGveY|Լb h$~=D($XCSjn5S i`R5 3nǑǗ1gpR`(P tB /?BLP c1=~?TݎFĵR\ _ҔܓN Lw0qRnR-O @(ȥ,_"a| Ev4)rFbX80X*ސQr /%oHv*TRWk-ca1rQZ71Q2P.~~Z`qLɲx0aomhnRf8}[glڢp>!EH~QdIH!Ν,цQ {a% C>XKK^uϿtŭ\AѦS=0ϨĽD[ qY*\ZD |w"Z;,E'Us0~*Bustxm)R`Pa!.(eΔüƒ;O扞KzthJs>H?x 0"WzfŽmm;3|T%"mm8Oaf1F#+{)UGOcJ"CvW]?1IDǏHZ1TṔsV000DʞS3mZ\~eWe~O\V >!g\P\rf*8=|$X(I'Cgh.B=2S*ow)%R$Dd9\HI=03#p*6Z٣cHNǂq7CL2 @ĔanZF Qg|Ǿ9{Fv|$EBqQ\pBpQs_^ ks̴>nȥ=:%B}8Ơ~O#?wA{u ޞza-fSq"Hfa+4"]Mo~/oJh=3_nٺK)fG sC 8<{nfJGlPY-Z*{ me).i)0Vw>>8o~{sʘg"lg-%ùonT3O /ߴ/fly az{l´PL,{_ҴAD{ǡJ6W VnʌuYjm6w{>""\o뚽61q0fR/"ֈ5r;D˲o fQaR͖٨x#nXPWu&bvLt-k@xiYW7"֮GZݐDx߭mQKm}r[ouYe<9?yl881gnn;1U8=-51 ȇ3d8Sb\P3w[,j Y<~y%9S?8ewDRd}eY.s۶S*10 Yߒ2&TΙ 5SZϾ/o'B{hذS 4IKpB=K[+Dk:v0L /BU1 nH_|}Sx$ULdi]!4+TqyDXO#Bz*2cÃ吇{5JZuvsB҂0'V#@)EdB \'m8g9sWx﷕8D8MS,9$N#iW30K#V~\]'zZJoǀ Yp8T . 9r(ƚHܶ}ߞOoeKO֚fuejI9O^|K3 #V25 ̡ '%j)1n$9Zꛪ#QE oY |ώz3_13-x4"J_~YJv=֖a)N.." X̞}77">ӋFHy_ߑ !ug47ר./_~||ힲv[µ("<{#=ϝvkx}[:D"AaϏ}3.0?i$K:?z&g>Ҳrlmo}@p3T}},Aݻ2bA汌Iہ &"NDm}x6n+1?۶|)MO 6^M \ nQEAX,.o9C(򘩈Hx7})K`tB?~ uϋXD7X Ow(vgFCi|1r%#^cgl _#& ?L:Gf!|~Od tvjTq pGm]o*0m]k-Rjb3jw~::Oc׀BHu 3e \H ?d |[R63t)=Ϫe@EVpq uHD\[ga"f]s@qZ]Rk`nEVNs#a>:Qgf]Cduwu]rikmۓC plbL? 8Btw|&)Isc4C1`(hzUJ9f5f8q5az߅H$`@h&B E`$!?xqN٧ш'}31JAИy0 vi.h䡟 "GመDD sVKDd%M3FDokkL[!& n4\bT6E6"ֱYsbpg=LOiMelqb lo+tt[OUsÙW LL R)RDύ ˒ mH1ޗu,_T3xdDBӟszLhDNO/ {6w?cO(RKS""Xmdzַ}{{Ku snp,̵B!ho> JoݘHM)y61Y̗ʏKaKww ܊ay2gT$ϏT98V2m6HP {xƥ)sR³}b"7U:7F߾}}2x.uU3L[$ DjtTLHXHj9wt gF -G'a8uJNh\g\lIyJV"='ŧ)mZ5<ۋ* 9ST0 Z'7UD0:M_}]j=f0{Z纻0EL֙9q:.$ #Dx5ݔL!/oowUK\u-Tu GM+;D$J'1QfG5.7 BX +ӈ`Zqo ]wKow7z..qT"D"PS6lc"m}E`$=Ϧ"L3/R1`bʯ|0BI3" O>6$.%wM'֏=Q9>;yZ|hQx/?OB)^djsy'A=1g*y)3fmĂh|~zSÑ8$/>K/mY=W#)rTk8U-tf`٬7na Je!R)x-Hfsk ץR"⽵gAm[g%#=wGD?RmR]x)}']D|yopuCUܘ)=Ϯa ~<H,yOGAh{  /bfyz̼$dWkM6DD)̥Co[wmND3;ƅT۷w5s >s0h3c7Kp n$7&Z#z}OP9egj7YsL|n>>k4uSO>.Yqj!¹)[&Cm|9`|+,ʧ%ʹ稞j-E4(dHK)R?YV̒:S6  ]'.̼,"mCIsj4),U/r qt?om 1PeQU{)*e[i].m]"{cR]3'4-LRhn<wD7e)۾G?ܜ!bZ8Qk˯n 2cBL!0%]=epe֚կ?-D}Ka1bۮZjR)=0Cp,`Gz"ù /qY$BH"Y"Fwέ؋.B~ԉ5ϒ8&^x?e^1{wfp#"Ɲ,&\O_:5P8\Oy2^[&\qyD @4Y"Ի"q0͌ *,m<>J]e@Bc_ym}%/&>Y'@N{n[jwUuY$] @DOAmZJdY`cswmڻ0C@oܖZkۍ0pbRk< n,s3 ]hgo">>[ٴ H:-ʰ,dמ!aH m{&>LJ' o:G0#˺sC`./ow3{xɗzu[Ʈ˾o`ooo+FzRHxogvLP01nԵєJ}ogo-jPB0uЁ.B&KyΗQCPL;sk%>1K\m8^.ŹO'ftAL #;\k/_~n܃MzLĩR'iXgT8D/uYzcIJY+8eY|TT ġ p;0=qD9NuJa @Z.a6]j̭3 b^)9K$a>tL< Zk?`)v B71k 6+N@` HŵPݙ Wc8 3IawaTdlJ!@ ⋷*La 5Q"hj˲ZWTYMg"zr JY8ӌFHNLƙ{ǝAkZ{fOĕp*{2b}yM *>P xRNG* \]½EsX)]aaVUa^z nKF)]r ѹL=Gvg?᪝}⫢<5gf1 LJU'{l,*mܠ' D' :ZXZdm϶oR3xpA|}A(]:ΕRw{ zho. 嶷?VYцOGD<1Fs:uO'Zb1 zvX̜EnH,3@hjs8gU{)ۛn6e%aZQdI2 07,BB7 R^{'<~OǭusA]`Y׌h+BtwuR9@0 DO^AđD>oY~sSo== w /Xd'C3p%g kv4\j"N(> sWpCZo_ץ2jo[vwcB nVx33T7Ș8k&#PX׃eqsQ6~gVQS-RXJ7Yؓ { ~O)~cc=['DJ0!S JI[VD @8)HW R+Ki%l|'#}j=A)\3&xn=K-j 9z84J. q@dwR,UyPB`̧IA5Vʣ¤T~J6yh]uu o6 ϢcrOn%0KJuEi$E)Q'XXƱ`5/$kp )|@™ !D/Ε5ZcT~DH>"<yCx߈P2OTb{>L|]͑. 1wCfu$Dlb"@:ހӨ8= _44qIuM}U[km]dkn 3R["K;"otXcB8T7kj?~(|Z+˂v_͌}[3Z+[œeړDVJ}].nw GevM̿ /Kkt}k]ޅ #Pm{\O{kG˲"m"EX˗/?~|W7am{6웏0VZ }o 3 7cM,{/uJ-%nΈ7$Z|ws}uk^'"KV&.5f|E G1ugJVbax1IZ\M@X䑞Ng}]jq0uma)1 Ӻud'\jH)݃SҺ%P!_}o^13J ~;&غi~݆4W\ 酪WK9Cbқ5uDDRz),©BZWԇ}P{:l[n0s~LaVRM-I=غ4;TL :|R ɺv-$D6 ):7WٖQ4xQfR2]G#*!R+3j;Ӑ?"Fbミ;>i=*C '2iF\>΄(QL/N" EĵjϻIiSWz^6d&`8ҿG*'"]NMO"$Ƙ8.Aة8K@a͠UU!Ab[HuwFadI/om[Aj2PAGUj+9vƄ/4rBݺoj]V uYDχQry9Sօcl\Gx-0}]m3yHֲ#=2\$[(ft|2'wbFetɬ>s~Q E${W*-]!ҨAL24&n4"Rp]DpU5LjLJ;~m[[oHtDaL/ #O55܄y)R S:dHnΠOd~<.CA?a 2jb؛zR[ܙH1|*>5/kh˸2|uG'˕4G.n.K{G}]ofE瓈RJ~+"a%_.3ĥK Sh_E<\ix0'$3lwǔl܋Hz, [u:@[oh;K1'N"~:7kTu~nt߃>8;( 32ReY+LSw$"?-9Da4.K vn2ə¼ʹPA!wD@?"_ {d".h+E!`_)-xnϬQWrޟ +Y{(< EUR_v# 7FiA."??R|RM‘PU\ws\U + 8!|"A甀 ~9`[Wt|Yp5MQ鰅LhEq :gJM֢ E80q"@A"5g #>'鹷}[W)5gEuq[:QAdnE$h(܎jm^O=?݁qh u8d-|<axYn `{)(%^jg#=uhJϟ?~ݶ}cF|) v[{oDpDaj]G a<7߳B0{̃2SPǦ/GgmJ9L3^>G@DfSØ\=>}R*IxB LvPcd:Ę/G@0 DXr=zө,"uY%CuazW$jTjc΄H,Fֵ,gK ´ tS"' uLH<-_S3lx>qϗjXF ?~H'X希˯#B@7껚a#ͧf۶TϮM3%)0;Y{kJi"Hr\Z ρ\ `_fxp錊-]ocLys˚p̐wq,<܂Emk"ysyGvbWgܜ#ظx~iARD½5K@ 3""\j}>;31 24+!N䕻j)mۅ4܋۶%s1!pK;d ʥO]VD!l)f>r.:&/rR L sU - gf#w˴Ԉ9)12-mDL~=Nrw7$='E7>m0,*k? c7Y26F\ j) ""f)_31@tMfI-R}d=3eYTW砞S?S"q_ <?G,K^XZ$Lq&&i+`r vtq%"&.ގ)(WD@|rY0n_s瞧(,EPgKPb6] aG,pH)_qb_F1|GBZr.)t<`KSjR*s8 3[‘y wwf@ B"ePrz&1vMhZ5v˗/)ݶm5TQX(ռpZWgƊҙz `7C@b1:giXx1@2D4C0krWOX+u?c>`J)^DOfD]woL}0!\nøͽ홪'y3s RKx;'g$h_f83%~je1K2KaDrENdN!zBE|PTy9P>N~@;ds_sL\OC4S/C%*`$3Ӆ"E{s3AfXo;01"QC(E_,{kv%@z0 G{+qb3+·vPf 3(B rj=yxHĜ{tp/ |g1`xW_"U5,*@/S#Z Mz̫ P6HdiNͺi^??i7=X]Dmv~9l:,k֝Ԍ܌!ݜ{WW}UAsߤi!ɜglal@t786yQr a|5!0C Ss Rk.Ӫ.LYwd[yYQXokO68uF;1heY}O9,_"SKQa)(!4i.Rv#9@j5HW\\ݷ8fͯv׮E_GOSC?N~h1n^տ~Z%ɭ5SU3R!Xx.A+13K[ºrVW{ V%"Y_0Y> t}u9{.TG#gxh{eWŨ貇`<*ʃ颓C1D "avr7CB&64'$fh xfJ@b^M >z %2Vl?ݽ’ OK\Rz^/|#J)ܗypT&;prO~_/5"I %7aN2geɿqh"":D\ɏD Ip&E3v9̀K0EZuJ4`2iz]ǃ`D*̵.Sq)\h 4㫵]@ȄO]S{8n$ʠeeG/Ej)UZT\eYʾ7fzˢ]d9";D=c&44~m߷ 輛m$bf ϳ%X2$ d XxvUD- sʲޒO3>gQ{GWĜ"'4s@* eiM[˜;xjt?^9ojLk3Eu=3(L(uOs3r>L~ ,{kLf@`Ăjp;"e<+J2"h  aXI&p ]g 0󳱹 L{F&CM e\E2"&GfJ_pSLkنq2 o?/rK09Qk w/^꒍J&QvL.s BEK%nͦrdlxt{x݊}-0*۬,Rk}6I\jM1B۴JdȒ6B9ӥCJ|4hhdn) /ӡ~#M\ й0:$$3(榚DSbyGM b2Co{yK)~˘Eb,,KK] P(Bz>RgLufA nsC!Lu3d&ĩM!Q)M-pfDN9WZ6t匑ajN,0a|8tHq>3' 9ܵ7A Z3 qxkM0H6X!m3S-n6L-{Gb"r2CC/OA~Ú6 i}MNӨRj1/<̈\ս7m}]]U+/37EF ԇ #N#3;.EUi|Tj.hn 2Fܲ,J)em \r\.ۣv<磾˟)v$%&h݉AO8O*I߫O!8l=~t:|f"ݩa /7cY3 3Sl&X:S%ܵFڄxH3'4pHN:dFg&wYA -%̙P43IL%S 94iidtKmsc7~|1S1Fn Zd,R{r||:eºܙ,=jbr|-kmL{6q]ΈDQӨ!7T@f"W>zY4Ik벬Dt^xZ;̜S2uTrb"M4MS.h, ku]奔RkkR>rgǧ @]+"2: "@7q#.h' Qd?X> n9{K,0cu)S8182qULJQ2`jjuwNLjG}s<@%FXǠ0Z\A诿n֔XFw$`o94i*o%_~u5tf"uYܬ)H=b)Dɸ4=; Ĵ/9_/'i)ٹ"t>j)sjIׇ1n%iZ34i 9 =Zel{\+eϖ?Wͦ ?7[ ƃڠ:|Rv83$ZW4 ݑl}_ue 8Dnk#$Ц!y 9\x@ ~hbQ "OphS wlܧ⇺C<"LGtXqͩ+u+CCMCDB`#PG?56UR fadJw !2B؍ar)yZ5{Jn`f  Ky܄!q=ʜC-7'JDc]0X(E"0{͔A-:`$@hdo:8!~h2'[N{8X@1e,͌p+[i;Yցi{)}ъr$\یHG!oVXbd9A`ntV@@ (ݜ@yUEmmK\ ,3Sb}<ԵR za!;(1bx," 9g>tJHĿͫ_/*2iJvOSNZcD h̋/4뺘i^+nWgĔ*RJM$toc%"1DШCeyP|cL'=8Au[N?$6uS9PW}<Zk9#n  `>糪u%D)%F9OzQ?ϑSUAq smicYnL18sN)f?\׵ϯ 9\3D[HGhxb9:g{r3)̔R931A9RATsʹ{]ɥLT{κU~E_?Lf ǭyA *֚\Z]a>͵8!4w%JVNjg֢~9,4!Yc^B)c]ktki0ޥ6=}؇F~X:lc"nPp|WN>ͩ:s~R{#ñR)גY0A4 4zanWb #EDn8P03 ɺӘEvxo$h^7|88֏= lh7G7% yOcta$lѶ:;Nݱp4X*8P}#H@HI$}2;86Sr"B&TeiMfDH#@m;byd-ʌ#)),- "T"ș %jюU * 1s1 m~|9"5D9qSzo1oZj"z, 4MH$"pSqJn,@%[s%(![mlJrʹ֊rN%u]TZN \wU'b$$R*SY6h ܎#z<41ӷ3\. J^|Rշo)Dz`đfNqWU`NUTje"WL|>&.m; )NMYTLmfwHz8o!x ;+"?P OS};r?S>`o#` 1'L!rf@@qXebX)…TjoDPkDSj"8_yYώE+8QחyԌ\rNDi*+A~9?w9;M˔sum =%$<|&"VE)%t%)!iN "jfiȢfbD7.~ll"˯\׺.ZJQiڤ57riM41@UML"ploF2eNS>4]dӔ*UJaT K%tDyGRO~L3w ݶ6`?O9` 3E!Q xRFh8|FSMD.ZZ8>fPJ)%y}\Ig1BrcC訖HA  Z{܇prqFǴ{sed„ ƠbkcDy]40NH2A<x=a)K OsN<}LBC ?},KkEDjt='Z+AipYڔR1s7L.:\ I5R 3Hkfʜ5Tr v_9:029P=, F]}A,B=@eY-bҀTU6|lTeYLD 5Q@O9 U=e&cQ5N)qZ3'0%` 4s蜥5SqSUH+%G937(7f}oD1#m.hGN{n$. dQd(PC\Fí,M(O]JE9"U2uИНz >3r>B%( "Ήy>UR#:?Rh[ˬ6)ǚ$&HL =jVކnR$f3 >J 7hfi.bm 7Asw0BBv Dj xs|q؄w[&ZF3b䜘Dǀ[m"NSjuy,j*D(p+)c%e`\rЍѨt^wBbfCwUě aނ"A(Qђ+:U|~.4emrbw<`ź]koC$Nt #a- SRJ9<8T%hRjjĉj-K].PXc6DAu׾7OӈVy*!9].W7+ex=D%m kvhCk`X*!zNO'FD14鏪FY{UGV 4[&M{p]8r's!mbT嵡=sO{(Yj @D'9g<3Td'l: ~:!Rͬl9%׺Zj&"^Ο5y{{Ҽ2chȪMUIy]k]i sfiDzەF'0\xYrI>#Yn헟]$7) &^/!<=Lԝ 1qkX[GoG|8?>=d{ isHB@ttӦVrJ8J>\%c/I[mAݳ"'B4Bt0rYr&3W&fJkq7$ڣÍ{"m`=K`2@8Dd b LliSc^塉o5˚R֊5fž|KRA%Sɉ=D-"1{k-&D)Y#ݣK3ÌimIzKa3Yfh].Z).m] k]WDLjnG``GC.?(bϯnͫȽ=xvPq6wsre湊!v #NeZeȟS▷āƯIL9s)6whrJ8qzjmfrVa3ֈ8\kOaFէ!5y%%8 ,pJ9|mm]+snz!@2UQ{р0<׵.{)˃ XJ$N)Dw=Ig-xg9 (! v^'-:3Ts^Yߌ%޵L`i vH ]/S.]Vѽ*z8ƙC5~*93ںF!ZrqZe) z(ZbbcОK1-[kuSBȜ˺Op4ө2ԺJ%BsGCAn}.`-⪗t4`6$q"BƜAN׵. DuQs$rjk%s65fDi5 y. Ց q*SY͙Ɂ4frlֺj}#d|>laHE~~Cvy) sNibĭں.XJBLn9gT1 NJdniD741FyrV׵Q A^[K)Zj-)V;[5JBXfV׺.+!^_^n{b +"#;ptrG V>#7po>;wCFjLȘ); s O ۗ#G;Gw[,DzF:M c@@uHLqa( gv"t&!/T&L }Hht6hm=tfD޽C7}y1 1N"̦Rz-qB@+0WS vѺ!LG |ɹ{t$$,ejk5䀌pHdI@raRrJfWˉT]d"e=|7q/1j{68l=ýpĜ`B4AĽ}qiwRɛ"0P9穔uGĂ'vW}𩝭(Һ@G+>GQq# ζ?D/mU{_g;k.B r =w_LG2D{%s61CvM,LX`!DRT#ZS/(]ֲaMfaFD?x2 <K"U< 3M{,;qJzS6VFE q|9[k@Bt75-%M9Z  1124(FsnjfZSJIJ}o@ADr.0vJ%{MQA@SU3BL%%t̉ȡ5ѵPmIfh0Q56m/Fl2\NȄx,MZӧ?p!z}{{pSJ >-!H@yZ4}J)벨*3?KM>V]O`zWA]u"+Q?;3ԎPػ0X껣!|8M|B\ToV0U3fnF]߷'F)!Kk@)#."%(/Z5#"38hi:.nnjT7y~bpsbDuщU#}?4NV9|e*kUTADyYwiYW3|e3#sk|9)/ ]ݽigSo 8ztRWBr("O>&eYn{LiǮg>h M ?cXg}%"ٛ#{ 8[&N9%u &-M% #>3UTJ)qZYelЇ8<QGNj=asC,ͷQ[2)v%)oItj T l/R1jȑ3G4 nrPjAc0{sPÚrЛ `&%RΉ!VU,|RFH%;vm҂y2s2Me1kz=DE$LDdw-9po<3쒸{\qg>LI"Vi"ݬSIYZR԰Ӝ?'˗MS0ZRUu{: qQgN+!t_jq/-B;8$BهSÈ 3C )Q&`n%4nRɳ/̜T ffLh]k9N$"JhTMlV5ЁYW|*twN`^El1J@Kxcq$T?yq߃D.+??vEE4ə9m4QS&dBG9'5޽9Uf y n po)gucu4嵝MN1=<|ofB7v~L1:PE{mZD'tS]@tMџ6NPK}2lf?o5D|bK׃S"bfVU |>*Z3Tk*1\nn98iVGҐE6c>{#}%uYEDJh`7vHeÌ`>8A6w$MӄH(*"MDT2eFĝ>3NS.FkNي4\EY)1].x¤~j]ssJ)'DV(%޾{ؓG";֨GF:^=W[Gó=9] pzD 4صχ~{$0c_  vdP7hf"qf^Bo\S]lfn41! w@q9iBo`)wtX>"o(b?S<$)3a2m]b*ZJIiS]bQDno7Uu2s:~ F%=RRPb8:XvޭI:O[pƀ=è?|'!#*b2`ffnT>LSG(-=EZɹյ.e;:kmKӞ䮦΄t9M膮-%Jk"mBhQ nD"EG4?Di+2+ )qJ9lLHCfbB3@fwl-I[Wp8al3?8n337DA H؎}ߩ'(=[B]ʄPw!N4-_a4ɐUAVWj&}=<=|# sɉ1wE5 QB]H]wCѰ3M&$Gh%QeE"ҿ/KOe[_'! 9`F9zK)%}P7i暘t=Ot4O2g-4tȃ~} 1Ym-37=c/_irwiLģ%@L@܉nszwl[Qv,-9s$JEGbwF\2Iׄޘ8 SGΩ$J&Bi-VOww ΐPtie?|>?ڞSw(iI(]L0Nv  asff|:Ħ..!SOJR\rJĒ؂ϫZk ˨u)Hkwf%O2s.wfDe^Υ^<0oZkPo3KT)r?҆2;i=aCIZ{*&o 1~uz5tV_װiR&m룝Ef@_y8cws%ty'\!b9HME4R%01ސsF~?Υ֚}YuaT (QLu㦄9ߎS!)3zq0 G3$/Fj҂EDŋIXĮ Z="|l[8{;1 bեLcnjH뛺-Ϻ8c;5po,wzi;lc`R''Ҏ DBN<‰2SS5{GvQaU@:XcwmgCN|k6M%T)8ۺSA<$x[bŎp#!Q\Ƴgj"{_ Ryw"!>D FA;$5 =IQ&@&/>j*$푀ɁİUѵڤ7ibN"T5bzDBb0 _k?B_ݿ1q]2[G R9s/_GÌt o"*ND!;%3"\[v[n;Uyn*-2M۝{d1~ZL?u:My23`󌀏ںSN7 EqwK DfWi+yjm"ʜ5&BuU+%ǧgp5r֚Dm8P`A~T%[u9;a=G`r|[ه'"w3 eaNn7c:=ўe 2rLLzyQDzRJJ9Hjr:E5 |Uťj;޷5DOI MsƋwB>H*Jў3s_ˎ1׸vī\BDH}yށCv" E"1v/wLRbt xaXl3u9Œ77sBsİuIN"B2?3Rc].M:k۹ ('.*Ĝdp[4ؗR7i>0x_fPs4k>:w4pwLh̥տ /As }R-"!s$Ҷ{v Kηuu'D&ֻ}U̓fi^]4U^'DYO8AnXTg1sCOe'. YIۭ8JΏ67*_q;QCfVݧmnJ;%̢~J&GQt;q/L .O{;EB<|+_3$(^j3Vh-ŕ֣+>f9sQ"c\47yc2^<{hC>z3?p QUAT 9u  U#Ŝq jUL.j2imHD|KkBĵ8p(RZ8T("*K9'QnJ#bA7>pot֓1{u7 sbtD^sɅP6sf-n̔(4n&L0.^a& Lt Z<@|q˲.%\csI~CJ'IH4y߿%KBaǗsbU2ӥ,ؓzϯ i z SE) m)ۭGdjZ Oh]U:U]Z͉kNˆץX~BDǩAg6:T{V69xcw99Ƀzّ7ωsJG2#"lo!XUS;jFqu-ҚJkk_K@twb1 _|O$J9"GIDrh(sJ!VES òHC4iq$jgEkd|8 ڵ],9Ri0 ^~O5 c )efQ31n4Vi;xSw@JiYVbޏCTGqD"Ɉrǡ "Tqd!9C=὾p !M>PL *2&' J3u0O9G7:vZS6f@DNF>D3nHÝBm1suQcnIDDE4/t{!3QF?(pZM."ݍ"u'fwXWN)a&jNf o[8jJzܫI#fDSGQCDN٫H}]U|:5 UEOiɺ-2P6N{ `0ӣxqX2RE8dC5+شx[]eQ5D*F̾=pAOT9yZAm mj"Tt;|~}FYyMfu>NANaEuszDxS;KkmۇĀJ.Rlt}ݖ3wYW0'uw18K6d^W-Dӷ{Nuc(e#cNl1`զ*;i?Z]mnqOf쐀~fd*ͺ/ڜAU5~wC=JO0V0f Qt93Qm$WޅHUR$N˺w3h ݩ E*{ F%խC5C'b,=_"]S6  63^ó=sE}CcH9%%3ECQ7&}cq1U\3|k%!Nt>yY7։~iug KZ%VjgKqc{q֟yth?!o.w93{NP1+HLld*0df;RL2m] (1{d˚ywcZajp=MXgf ቦrEx?6)!s[sapƗ%DC [m01zu1:k^ZW$5a_s霗 q|Ӵ'ꉖ\n?;^P;qc/;ә>>]<ʼnwDn "0Ab\ MΈZn J!qV,-6<&h*7N_>>x ڙDbR."&\tFlm~sZM+@H1]Q`mH4!.7"LL-ƒ<"owBw&${SD?$;~R0| yB5D F8f1i89(K5Ĉkzo=qe`hM1c6GsGB5&KYLQITJ0,BNΜYĘ8"pi KN)8t)eYn9̪k*юzJL9{ vg4>VU 1r:)>> Rl0c,$b{p%Kw;-N! .|RԽZCʡ8GeCJ)A$Xs_Mg tX~gl[(͕bϟj߶}'꼉9Uќ_MIy=zfVZJ9A9/YU:zm2O, +n"_ו}O\T!Z)Dd۶[Q\2,RJ8z)Qkm}E`f0AJ)9eYgsTe)q* `4"x)nf817t0>sW5攸 m7NM4xQ(}?"XjtANڟ_=~%I?>F6IAs@bpSuQG>r.qP1ˆr֤"t+RjT;p]< !.!=d(&H})eYJ)M4N4I9>j%!˲qF3 PfʉA{,l̄ ]rb4`s$]3  dVSd*/cď u=GcaO>l毱K}E5V4}#qxdhkJ)~IK>:|-|1qG1n"c@milPfR" -,NJ2I !{vf*nOض~3vCBUͥ*-uY۾mK)}~N۷9G RS@ĔR"Zx|}~A0HeF$ŻK!45Q8C3DMLǷ@-4iu]yk;*SM-L\Qs.T kk؃ۙs&$Dm{lL__jFUԁ:VXmE]9>Gs{Da0*]hs\Jbc{wkR"Y>rr.chL[@dp|0jK%Яz{܎oap22nrpz/M}qž}}ΌjVkS_qdHޙdvbo"y>ŸK^-g]πߏm괫amzk;64HvjχDz1{)O©dffAi8&Ѥmp! z N&e>3 ,XBrC@^jx5]|~tZq};r5Bgre7P'RI,LTyX|(f*As@vk!"@Gct\ zF 8FoNzY9B #x"ynaT[[֭$z&˄;hj|{A+HX b~#6e!^q{bY؇gOX_~||L R__x8߶-֔ PU۴Tc d),Xȝ^jkLڰ/FL4uݷB׿|Vk{<*bҞ߹>DJ.D=FE8Dj [qԣ49ᬝt|6Y2t.M`Ą,VPES;v:sيcHK*BT*?o?ĭ`jkG=v[߉ZՇ5m=q"ĄFVE$޽dB@WҖTqPppb\L^$W)"mmKRv-qmo?>EKy{۰og)yKYV5Q}?D5S޶[JmVs甛 P6 PQiȾܘmk o3EU\@N\JwfZv3ĉ9ZHL)gUO‹y /nsF!?t _lOO5\re| .]s^7a\&M?Z%eFȜ`[:W`8N14XYFL^aeKz{=Q RyKu4Vf"@`eY,4TT8^ 1Eۮ 춿>nSc!*~HIENDB`instead-3.2.1/themes/fantasy/bg.png0000644000175000017500000137737313267071775016260 0ustar peterpeterPNG  IHDR X'sRGB pHYs  tIME )66: IDATxڄYeq}sǚ =wch4h@pIbr0$R YrXO_d@Za~pH%&E&H 4]sխtZ{8VBGU3V/27WQIB 5Z4#@Q @E$GEԂFbP @23@  h0 BHF -F@@0If$༘Y A`F3%_t` $оS ~=iӏ ^ AʫYH|mBMH!T`'X4fH(6U@@^H@( 6( ^ 18 @xiBTOfJi- @REEpi 3xAPQ8|J޲l(FjzvcAkj@̰Ea; J`h D4OXӚ/_k%hNw2lڛR0D%bA N\;mH̊E5V8:΢M q\j)QFD#Q /TҘ6 PӹCgiӆgN A!I016f#'6fP fГgDy;sBb!.)($Om`>Os#\'p•RB0 X j^X Km4 3}Ǥ;+ I̅!hx {瘎'Cc7pfxٜQm\2EE0 f%!%Q8PGS j`AUS@Ԑ֟s`hfDl,trh n3:78: *FU*+icD:,B ժH4եb$P!&Н\ y>ًSӧ%-!D`IԥZ{Ҧ[#tNbg5D3U 4 A !d m MjVMͿʹ?ݝhe )׌G Z$ZTK&k3Sv;eű3n|:r5!w{KQ?-m('1yvz74l^Ҟ6͐! 2B#=HqdSmlNгQ -3C"bz{%D-I@-Ҿ % 6mpnD!dhv&c|)6{ GUkз@ Hxj); t1mDCPSs Z1S_7:<))[VP Q21h)Dt:ƈNbBj0YNof tn26 1]1fЌQ1/I5(Ln)V R]vQԮGWK_tCҹNRz;KT@&d삯b v) p) ц=ς$7.G-r0%?-Β!ΓH']dfF$Z .b0Csjp'*(RKzf!śaڶ-3^ՙ/O5|RVyhі܍̽,vLx2EHD am6K7F46Vkf ;LGU WKyYm:,IǂeO%p@0xAY$zChhC(GX k`"@GB8.($-/i) q GeQpYTxݧdh";#m{SrL(׽ML#ςm^D?g 龷c[ǂi\k]bE"dl.GGH A2` Rm $(a7\I޵${ rN͑< R~tpyoWhJ%?(:2uri(D& `]I~r.2fYxKW:2yquq¸Xs_\3P5@x0ӳ+x$ ;s-s/{2Mka1IǶ#?>;~'T pfl-ݩ<Ȗ|eіR֝! vGW $s@5V[dUa@̂Hϔp*p0/#,W@^5"+XN۪g{sX%L[38L $@ӲB R- BK}  bDC`!=b$Yaw dv46ۼZ焅01iф!a@,*G'?M50x_ 4Z\;:יPL4c\c((B|LB@b,AB|ˬty|blp48둸R Qs @F-̄΂FêDЖ `dB&E ?:`k@`<Хh^!Ƅf! 1Sh$[lK }i{aP:*^(P9ulvu(W[[ C%5b['Ub-+C)b=y^:4*mBNhõΎiYR4rT:ƅֹ*B5"OvkfjFA-AXCБh1hah4{HV2twXFW joI"^iL&9S @bwK}dS핹\ gxsP|'t`BS([QBiUy-YQ!|SGqȒ_ Kr9KǙ^k6^6ٕіV jfp!JGZ{i;n=HZxk>fx[uIB26sŽglfBOK> ;̿,mYz7'1FjpY S3@1GgԠPg Td)jm$b 4IjU]jT",RH jtۤ m-<>kg)Zgn3abF?Zæ,x.f&*Sa1FA$F 3`bȋͥ,?_ CF#!V KBK@IP C4O7VkJrdT` mUTb֨I* k3*ZЬ9B:"`j_s -m`7(g=tgN zWe= ,@1Z F՘a% A։cB=Q`jWvR۔(ż`icht:)N^ɍS-coBɱHpN aP 9{s=,uvxjiVs.$!,%L'/eؒ40˪zw=̌h%G^i!!B~;im3GڙIc.su> $p`b!hm"!;]Rb!sN I>ԓԉ[!EJ8 ZJIKLsO6$Ɩ$y6ȷѨEZ|Ȱt5,FMuiI#;1 ,ҵxwk9CAadm|΅ݏE&pOjZQrH@ I6s Z˒ڄx UmhQ4,\{gǒV.8cR&1@5ƟҳTj:5,Y^qv?ω"*ĥ#.g3T'X RzVNHetZh[l. `Z63ȡuULBޥZsպE*BfOsz%Sǫw/Z;cHebItJaG5'5wmIJ,LJGi%#@5ϖ*2p Ǒ'@XvGV"^I'L"S7*AE us(f(D*Fs$ɛc8*d\P WW< c!&K_hRgڗQ56D<W_゗FyIge%| $t  e W<TJ8vтb1; JRID8z`VNR)0si#6K.TwjxEG"4i-YoÎ\n~DjiK*yvVV:L!~/BV ) G'0g:2XI0x'Ja8r$1LM$Ėd&N<+F*7)i)$Rޡt鷠rL@jHxLґ4!y(41'Zs8t 'iTD,y'"Eň&;)NѱdE i#FWsc/r; Q{KpKof3(6`ГT3)g?ڐdsV3S:J*X,#2m8sӮSﮕK\u f >?HohngwNc?LP@i.)|g<^,:K tBimlv[rT':ӈ' @bu x%]ۅ3ö,ÀKG˕yp"e[C*{8*}-o2`uV! aN](%yL_W '/2ϛmOGXq1 \O,ZVzI^+NRHȪ,\ Y|cu/@ 6 8Px[rC9q\ fฐiP^4VU+DiK+BKWkFXs @Ӡ`ns wB cyjGälaܢH*f,ERŧVJBLJ`xj8ӐЗnSsm`'jhV4,QR Feq Rመ dI)y6WA Qu ũڋw, vC/"Y!mnTHJvKҷZ (=QihI& "~X @"^9ϰX~rr v[KCR-QY5lY[2ے͖_K3 i{>G)e$zQU--1o4Qr^C19ihA5fsHN怬@ʸ}vuoUӰ-6iyȖnv?:E2!f9c5'ti1QA{׋^qUvo@R 2g'Sm LΓuS!<4]bI4T-{<)󵥯:,&T%eb/ah]!fGTua3RlY܍O)*1{PL fI(iHkm?hܵDMTd2P.[,%QD\(uVu,>"Bm}z(ф<7TAHgN% $HG=C{f;.v8km9vV3ǾI)ٳjgo2M*ɞQN̺BL<65[i.3{3WihKLɻfI葴,niSRGc~HhASѳvvhg4M-q74"&R$TI:R")Kᴛ܏!iKs7bM-C q56Bk=4J0OaJ/lF]i=3Rx?7=1DxsJaQj#/Hq ̢U 4yԄ$-r_E.o7mW[>E4hky\Io}a08ij=ŋD'P' A#ՆuTYjI]u()"e~؞Tm_"Mx D#%cΜFε:kDhuT1B6^AM:)ט[0oE+ԑbի<6ҙ6ĵb&QQ/GUxEӤYƛD)b h$\UY (\f|GZF8 +U)Egkft1yMx| c(L$ZLEXp*&A8e)m49謤? 5R)MFd.A_{G I1)8Epqj]`t:.hFsA*JCz_bd\pZ4fjLuvZB.k׮V m#y^.uF.h$āyE'PDx'3QgyЩ!O*'MVIh[P(l4^],R1fROU"l6H kB\ jUn\+iMДR.lAyjb:i)q6+.+OO>uu ~gq\g!-۳r4 :㢩\DۡPDdϠ1&PH:zFGTQ4,h @83,̹G_{HW,TS{I!D3s0J:Oa.X Ph4ib*F!+uIsjMV'0EZ [@5MU=uY~Zz}Ou n*oeѯ p*Ɛ7DE&fjPS .6V.~|񅵧.f4@ &8٠[+A|@31^#@ Z<)rDX<̄RVR Šb4FU)i15{׿x :37k(.cTdɑb0)˂ W)} '%cbQQ5"Z¤Ө*VDҥoɃfu*/J:O}$9)In(ՠƁ8pþκAbD[).!FVp`--2?ROC3HېKH6mvl1hĬR-mq<2VnR[;$GW>JILjKy _&5J@-ՅC,"hT]vƗD.{sE4䓼cJFa&h1+` z6>JBm43'j 'tڍҨidy*hB9m{H/+kKk+%U(b#!.sC&vE'.7uUKu3*EB!Ԋ,E{+Wpe5kϠTFj& x(3`buЪMԂ`(.;vI<7Ab(:-Ji+@l"ImiNk;~ -\>DUMsh*٤P M h*E4½i"§bh\Y(3~Jבɞ iT<>w:y'\?_Y cY_P'ިzcTm_Υ!97<4P`*lbQt~I W)\v`78~5#V_-RÐ`tQ),)lj{%{&Męf}SǪ*I딫i0 "!P441jYq؟vyv'lc확OmzqAȨ*BMD3@/lT&FE   E*ר3٤tǿ?6 Ft&Ȼ􌣨0 yUBi@Vyz-=J8!suz-1Z}]%)G! 5p 秵"i"qУ A9%Ŷey^q?>h"~P$?['ݩb}T,v*Vd]oа\(t⢵!yҴ,KeO \ԋKw~4U4aj5M-A0S5B̒ @E.cZj֥%M?{饫dz7Z_dREEE, p((FQYX'2FЂѢBRC) A-Dӊ\jAԱbi o _]}tq<{oWVUj H/0CI,b,d#i隣"jpB"ɨ7n=Fih(( w_v"_'87UTXQ}Kk[vT noj֞uo;DM4V"AQiLIhD0x;>ޟ?[5FIZM #¬plhCPq-?[,rDG";FOӬ 駚SU0 B `:k/gjT]k/[wn/}>o'z`."qz  ĈéHjTb \ByUIPU:);Aqan! jEH8E$ c0K\gvDWl^ii4IQ$pɟ:| !9"c #ӄEyzсgA.1FNцZ9.+EZH^>|R=X 0Afھˑ>q:SL _~G|ٍObĹ^gwn2)V/|o[6/b_^9r^߽߸Z^g2)K!(%gy k~מ-]2 k=mOo>}:ޔ0XGa$c5պgW7Oy'{ 3R|gɪIߑ͋u/=]NkG%Ŀ6ܞOѼY- )R8;o\+ُNFٴFO'p< נ&&>&N#w_y.{quhIYc8<?l|WesaJoe۸umBQԅ8m^+2{mݧnkoOOViFVj1\YYo5//gGyͽ}'Mu׍.:b:?j_ZVO=_oM?~5f1_Y+¼zQHW-gOK~ ⹏=-'jN|a5ܞ񢼸Y- )yK/|k}6ht8>o`zը?eES^bm"+׫ُ(>-:%_RUCH~}gqK7.zs[_wrxŵGɞ:77׋wkN8}\|TOE#5G~㭽7OoXr{X &eǥ{lϏfN/ =wfwv|o߼^\ 磧x(/1>>r^*'_x~矻6zx֧_I\̎ת/ὦ|}eO>?~Pr%<:,CmR535FQ78еW7V^^=/郃peSx?w~Y͟sj؍T'X+4`ZϟG5kW[՗m~S,ƫ1/^;eu8ݏn7_8}s;s|',&O]ݹ{8_LNIKXT(f##)=fZ<1 +4u!3l0<5|$`=?&et`d)j)M)\}PYK.S?BEOL̔gܩ gJi+dn^d&ŵm g wN5UJ[nELSV%OJnґ-M'W7bdserڇ߿39o~qyg7]?{?a}Ԫo>8 Žw/ڰᝇg5vltt~h|Nw?|x޻8nz?W_[p˯^8E~Ggw[ǡy{$n߁>GGȽz:>];l=ywk-sT{`Q>xY||w;o7noۇ Aexwgo:Ż?9^' |woƧ^uOo:?nu7W/ͺ qӇG<9hPfak{o{1>z|rHޟc㽷oN&4x~0[X+N+'^Ѽᨐ?|۷ou+_X?[z5[/7VWݪmo]8=~mux{?Rֳ&4kG[aqzPNv*lUQ~_϶&ipGRȁs|Ist0?>;.\ؿyg{7+/b7^]{;? _zvN޹7[8{d۹{p<`98~wrk߿G޺z{͍|x3:\ާNQV%.P 8JZ/7 @¥fn۸Mh$S~O?FZgfC◧eYfM.HhTBU y$!0AE领|'!98K}8Dٙ^_[hu!( }mIe j{&~>U?ڼztb%*l"&AxzhL)NS]XX$8& 9 |pÇCPPQ7]P[cp$TҋӰC$㚜:YX䥬*J}jpQvkRagڀ5{u @ݱe@t%M*sEG=C-+7_ _fwlK{@ʺʃ(߷i ,SqYeǀ祭XD!"i,eUNɱ M1xZ#fQȰkXy{;G %JdQ`eJi&}"4c\/EX44& c kHBq)W:{j4)<ڥWl ̢4FI4segL;vⲢHٗ4:| oj?xӢѩ`Ehwv Iy"d0PZZ7UawXG,n,8;ej*?,3KuW/.vuOHPh;k=/!z"-+p&XnOAPCEfqn,]{<ֈHEFE\cNhp/âC1XĭcQjr,VP}P\WV.X$.2PH,.Lc>>dz}9`Ď)}UQޓ}5^ViY8rOSw-t;eN\"#WB`. Cp@XRiêxH P"kSF|RY#(y'UE߻s}yqH_D >:Y2TTw=Nj,%Uv*H1}ykMiMCa~ę- މ\zK)FPlCqDA|50!^]QW-/Ò0P8XhWHV,3ntYuQ!)ĉ~_FbٙS_ݯtqFk݂̏t*dHr8]6`cDu|{ʗ!((tȎ}m:Md[ `qM,F%cc-#n*òTBZdMs4(dH֬PQ=! 3>>bBȀ9?s؅ސN&f{D7+&.?/bD{ZOdXtJ_eue#Č="dϯ[0j+l ^wx֌|$ZSMj XB[*tQ=",ZQ29Ew{Q2ۜg2RW Hk6j)?,`: JUw?8YXs}{Wo&yNAMЀL @R5dX OGI\#6;D6S:,+$ dGOk` oQ2@"Za` (J b1`tD 6LXWGk2{< h>mTJDea-,(: aإEԁ skRͲqgF1/[W"wiKTYTtFuh?qUz,BfOYA_ȑ)2L]YƝ7j0>]v<fMJ ΩL15{J[ Y^xx$62WfiA'ONC-n?2ͳ`4DHSu_ N9Խ./29]\{xL93x3f '0R2מ K-+ϯFBׯv*R_&8&Ʋ‹6d]|⡡RmT>>Ƽ$? YVrψlNwuSugZܒrkzʊ<V6gZ Di &HuSC.rɨo-}7mZ}'woCÃe +GPcs SQiTdBTYe4%ҽG-{K \;wF~[Nd7kZ!{XpX;6ЕUuP s]T1q/\y% CIJ4.{cO:9518$SIAdYID ŵHXxӣlU*Ug'Jc|[ԕގ;xxVkMWjL"!ʹŅ}@@NĚձhgׯãe ]#Ӿζs:'Ƨ%LSD;509]VWkWk<6{ά kYO<,8mNz%=cBýq0I4(%"wL?vndaIk Ϝ@}oLr m?WVa#X(eUV.HD&EA'<>ӮfgOEAknKl{߼ir[ŕEeY1oX#':GWfL.N#=ywxͪ<.- Gp!/wX\xzF -S *rLk(i?;9HVyjCɯ^rpŗ]rK{@x*;qK22RG%}ohs @HթM"\X!qM ʹqg{|-)ߵ}<, @I5cQ@ c4BH)8D.D:)%(&LaPPIӄ^"ArT4Jbߍog2懒s4QwG$0ҎP4RFzӤ<0I./& yo;݂`38250bdz4\d'F2*c3'4roC3_F+{ȝ̻q55\Y`-;>!itAѹoţ{vw;1 ښ_ܰ>|ﺢT]tdQvđ*aDUǽхY}m-5{uT_{Iȏ~x)2Bf7f<hѸ{o`mM#oڿ} W/|^qVHTSsGF\^6<|银>DspߒXֵKLJ=_Q5uEw|E[Զ#`cJ3[1 EIIB{I!S:7:|{1jjI˯oz/7/~e(\xP8F^yفȪ!oxE)GO[:}.ÕV].띯ش~'2Rdxr\a8 &PANX'!.0:PSE# BYV,Ӓi7qU%'O FlOwTf>ջ>ػUώ[S v-]o&MN"؄-:\޻W`KZ{OP5%#[Y84_X|cǮc~ŐcE*Ѱ Q08Md cjѮ65,oJ}oz/W-;A4PhS9',2|:-݇r\oڴ*ۇy?;rbt맭qսq-PB\zmZW/.sy=IWV?qɅx3핪3YeM:8;.{Nu, H13N}Ť>8N^?⦷W?ǗS_xP4ޡQoxzgz6^-隅6VnݺMO\wTI:vmƃ-G['YbJ06s(݌ 0a|+N3cBy49 fJSɎm_7 v2g7ٽwUQ{h^wձ@ŋvӪ&}U zR5QP]˻[ jGђ!odيEԣg:DFyR2%vC}7cӆO\t'1}hw>q6ň"$a2&02A(UDve`s>xd{%Ƚʖ=vcsOpn{5K_ȰXQ6ZX?4D}4ޱ|Au>_Wn=KQFj9=tgaI'.`AN 9` IYgz} RsPDL^CT&E 4y.`阎8`x0m Øg 5!D21\v, 2XՍ4!I`d0ΝuL00L H Ci0;oc4knCIu<׌ȌY437ڞY4˜ x&K$8@Y)pu (d c@uBǮ1c,-=c܄R' 鼎wO.w|y Zw޴=rxӲƒyԒ*3բSIeՙ,h =άbe?1 =;YzzV6lT͹htzUf5|k[CoZv-ti٢{7T:-q".XXsLk^coHG~j3~= ؘ%h$7sPBI&}Җj7*yxQK)?t1=[ўe|8Sn~vMCo~VX8v|*H 9d5EB)t GB6,F*,iS1(E#FRR%_V{W޲lhKF5ƆjK{yy=%"SemuSs[~ml`D̼z1))ց@ 99+if 8k8EVщ/N":M1U`搮 PD, Peb0Ӫ49zpvm=OHY&UJ)Ygt"#/NNKaXY`YFuDŽK(Et+ehf9DLbhDV-+^v֛״ܶ-rIJʲZZLI*TQUu=e9@_fn-t-qpt0ZM[&l~¢]t  ٙI 2<4zΧ @Zd0ovOC =_ee_qcUb4Gn)C,mȿrŪxϨĖt^,Cޜf.ӡ 0HdQL1ga`0$jb (\+C(ҒT6͌N*EpYY+Tb{ZtR[s285מ6}ҎMKå|TCәbQ\[g6=).{zclwpZ!4Nd 35Χ=@`?0| CHKH 볙):~[ZՉ/S,.oj:\rfLuY?3p5]ݗ?|bϪ" DD N ƉBAA֩Fq,`] Le S. b*ɄE"uXw^y{盦F=ּb Sss<ẺSongt/[R^i}ӕO}}_z6^PuT!rLD'@US óq::XL)Ȫ23AYwN=!gt塋V5#]jm=G)%8t1ydf10T* ,":h Bc*UE4H`:Uըsp 2YX,kT#D)(Ą"##Ui@L8/^vlXyS=-;;ڟ}dx;w}rßz/ݦ5e/r6/3 xk "A,FCEV?0aͤ!u( %,< (:3 9畇<)xi}XN/_yMΣܻWN޹_|咆[[_9)3;ٌoa(P I8tY 8~T H.F0ޣS3gnj)=2̄#a<ڦm{UDh@e]Z0fa0.y=řnG"cK.ix?qrզ/}O/dg?&b׈J1^X. b:%niґL]L()ekO7gFXX IcGk׮8+3/q X$0(Մ3dP>1I`Lje Մc$P SM( rL )T`QƲ,2N. ibY#*5DF 8oTyh22GÀ(YEe=!rN)̫)9>1sjtքtF7iAb.aO%)DiN͍L-IE!:@ѨߺX1 F:%F8& s4h% F0WF{FȌPhuo+e{qf#y_eWko&ikI߽vNw=WzIb2mݷ~xjm^]V6w.?SνRI"QLOa$g`iWo*9Be%nWSqѳ7/~󳓧ᬐt[ΝVE|-k~C>93-TK:Tp|:3N t$Y!l̴)KZ!PC* _oQR #1xo!o.8ӑvɥp&#C EƔB1l[wa s UU%NH JmyE܎ޥ[?;t_uEӢwv!u+}^)'+y.RA Ê?D1N\gr-VGXx'2oUz4<61|~;,0%W]U7g^??w8:2 L;6ﲥ[Fyյ0 $|Q=ɰ *ʹY?8%S8lt1|K~1RL\wnYm:,Ω~_Ꝉ_ZmymMo5)H? }Bɿohϴ U*;h:Z-o|xpp8?6_}kDѢj)q?uisg$BiηW&yCdGl:vTa|vFz~-eyn#\ [Szyώ)5 |:2dzNاU2KvKmŃό4MˀeNB))aPD)"ҁj%& 9i5j"YdeaP t0YT@BT5oJUN1F xl f 5"Jk::M࢓^@(Q!s?%ttCӆ(bѬ1tؗ^hAy8͖$Zd'(Ii-0 dk@’B3q<${zY(ҹskNX%H@ X$f/|~o򴡴5b&GJaNƷMYi H$~,ȭ~/!”/*nXEVvjXMo]5<YVi7/5R~+P:OgSޗo>}\kvd_׆ _vP&΂+F6&þޑMx!=4UvCY@:<[M dHZ$ 1P2> =%eE{(ܝ Cyٕ/EA\j,ZT>wG#cY3:*-t5 _SWfm{M$it5j۶#3{?8\pdžU7 oۘ*_YPwF&FQ.Bٿp9.7T"'eb㞞!y;漪q< FH0hu8<Đ\柟bق}|IqcyV@,{E^8iū,zzAt>=>7Q26ޞ*%BNϝ0$NMqoVf%4`L ?3QB *0J0HBH˜ ГpMTXƹ /2N&~_zNiDP 7HH:d4}<'S3f0E'*MxD]U^pܛq|wo_=p{G:rЧgW:"yϺVg? oy֝v qnylT,.G"i2 D@@(0RtjTQL"`M5N-Be:g֣,)7|+oo)U* 4|vx}m* ]& qǀ 5Xi:0ᠪBu H W[BkmZ,j.\w Zz Y%e-W]\=Pk"M T@[Ǯ[W-R\SQzFN!U*`PMQ8bxDr6oj<4vkyvmuOnڵHWot<ԟ|h_>Igd囚NOc,{gƒu#oy9'3?:8r+ E$E]AfK:(JblƠh`(FۖoZWy۽kB=~W7/zJ / E|Nwu#D"[ygآb~>1-6O(|{R bMϥXN8 !!&F6RJCUTʱ T&hAHd$BwccIUkk>uva]O^܋{;B f,qld'dI0DDM0q6T 1"* E1e@Ak߿uM=o3H+yH_;~S4|7 q EjzFd&/mY|5cjMܻ*{P:WmU铽CyY+No {ѣ}3򼚐|{<dq&W$RTjq@{&݅f)8S,%KrgF? ImJrkW~Y[G82QO&{CO^gm(8W6ȣ9vq r,CtJ f"Jc,rfWwnBuB:!*Ld$~Rj@F i4#q,(X*DTR`Z@Y9EH#,$Ό" Y& MDWja4c1r`F<IqR#vqvT_k]Ug>=!I'ݙGBBH!"Wg(^•WETD/ B22=Cz>SUt@{o~T^{?g#n1@i0jOMaէ DR] xy{T? ε׃|C5Y٧\,@AF0"ԾR#"ASSnyX^7 "D<P{3oO_9{ќ(FU7oh~AiXʚ<מ;f`a\mK83j ?{K,[)}`w@xCç[Lw^VU%;χM-|3y/4Lgr/Q]Z̾඘& C rg !#D`4 &m Lћ !._=Ͻsiۑ-5=tߍom}v .EӪ|5ƌo޹%K+K"Y˪$o;l (]"W1ꌤɆ2[I{tIۋ@pDe wA׉.^cɬ;]i_kCݵ3(8>+}}"c]I%ja\=6whzEDQZTbw,({ZCFPQ eXViGs(xU唣aYϱ5mMӬwtܭo׮lxA;Z8ԛ KY}PjXZG󫣣Y8l,^1o[6fi.2Ӳ{B[62ԟr\EB7CC."<ݫm=3+b/t C+~S3}oٔZ\^QUR4+.+qq`9_w_}vs^U^Q[^o[{<;_ Y[|ȉ] Bi96AY)KC\ѷD[SF ^;!oq-lzYWn=;^vosϟk,??{p[{;pٲr֜F%܉dg{ w4V?jkӼ}ˡփ9fW=ӯ]ӓ~&|`e?~k$lKFk.:rdE?&{y{Asp.yk G_?0RPa$; }woо= ާ3} ?r7>|knMͩ+yA!][?~hTIτ =Wc"O\r ֨RvU3̘u {j9=+5eN,RN):s)vҋ%cYXMLg@Vj B`ĨBH)}3oh|0NqP`(LȤGE 5.!zɨ5qD/SU!+|!)H bшܯROaH#&m .Ov8S]%MKB6(Oj1kР`MZl SIru>Հ4r揖<9wdˋ2>ɵ;PZ1G֔~4^;N*R ӮJ:'?RY+^zPdg?>lAuHbԌxٱye?8|B*DK B hugK+MHF" Pp%ٮvO(2D ) 'l=񬞴!1@0'ɑjx kV̮yqۑtI鎎O}bCڥh Zlqt4o} !KѲH< B%',-jiݑDd[i2@H*j)mk[J@G"ӷG0 4r\35o DXC}iѕ%P<(&#z{^`(#+PYQPB<ځ5Bq)Z;((S`A0'i8mEHI @/ D?ڍ"iYWVW>{~YRCmi$+Ln_;u3_Zr+',bkhY1cNUI]Eٳ׊\+_F#2[҈sHI:/*)l*4ؚsd֊uo:9}~]b"}Wj#3R};9opҎO+ @Ȅn\ϩF/_RlvmdK~egΨ(6qfԔF.ygO gL@Ӭ% }3vTd+ϭ3a3hNy'J{~L>;B'{9HVΟ"!&R wn;'#+NS/~ݭgַͪz'7<,8'+!2G1j!dpnfJbaVYc\SxkDY*EVU!#BC dYAE Vb9'cDҦd&2~h bdwY|!(MJÄh 4O0rJ"LpǙsЫx> _s` J h MΔ&Ɓs@;` QYp.zʋ<s&8B2S|,""rθPujd'!M}o玾UǜKgpJ'l512e0/8xsyZT\U+0]Mew¹chPOB²pfb`hvY;O{iʦy&gA[:&l,3lv!b֝draNѤC.?-tD|C49+e0.AҥnO=)DFr*#O;C-yhAmr- -VvbXH8QQIiӃjϽyu]\d+" 2@O$0a%2&j}xL:9.3D*2ܾ 3?>]YPҙ4C.k涜BӚj ]Qm4'uD & -i*aX֟q˱NO:jGkS!$}p?OEQZ@Ĥ{rBXs} ߸-}1V:6Q]SEE%fe]^s+ϝvޜU\VPY]1.i~2{=9)qHB߅Ur)0_~,N]J(]Rcv"l>Y[jY%w^k,pqQ$Z<7L-[[~-8?lӖ= 5Ϯ ꬨ "}yJb9˚V.h,(+ @EUU{yQJc}[GFe?BQZ1y,@ꇷ8>77oi!on(P,5Q2 ;٨MmqN]Զo;b<9E鑱BC~'w jgУRs YQ8ьvi&r޵ Ba4׀P\%`I$0{ΤN^`^1<"bAP,nY<6RVSH_]ԾdFVXU.m~6a“'zi潰kp] +ʖe!3yFK.QA IG)2QXZ,D^h9:=g.8 q+Шc,]R;kJ}O}x8(jܧ_><:IZ~ 3ݯ6 2v*3[d4*WQiXH 9b֥hR[Bb89ՓplE"ߞ,)h'oX:q:]3UTmNǥPZ}#i٣̫ %sM &cUH= 3?}''&e LWG,2@AvIJrC)-'ho}vїV=s(,5i6Cok Dz;}t hn?Rm{E%$i[8Z1#PFS!O<%U1]&C[k;ZX?勿q_ 森W=134ѢH$xm{o^)u1S<Ŵ_Ce\?xQJ?#dbaՇ9pt$K si]+Ԁޞ;7o(򢥷^{tDI;Kg5=uUڒ@wm!/|䢞!gy v(=gFS CS et_xAڕK>U?Ö28<э9.?v$KwUӝjC 8z7 VpMQV٣#U{MRQd]6yF;>P0 G\R."a zF%p*)Wێ.dMؐQ `ID 늍x<ʭ[XF9y^k*yCh 9N@qP)MQ r@)i@ɥԉR`#cE;׫O8H1Ĭy 5!c2赓8 Pr\ !CQ0ȴO\6i>&5G`(bތ+C]e(+aւ(XFC͒߾cgͳz]Yss5Gr@yΓ"(#_s"]<ݙvgyɜ97\0;M;>qU-qϴDT̤㩸eO-_t "jq5CY xVe%Y="ȺJTr\QJЂS6u%qZ]8zΞiܙ]g\Cq]mu]?r /-djݚӦ_>}kpJә1;W*B `,\]ETrYUȹZuV˰=v@0e]ڒ(^9+V Z:Z-B\CkDzٗwu/?1ܺuGOv7kk޾:1[.Z4qGg ZiP Y ՠ4y$h0qҦ3c;NΜ5?|x] n_Og3LeAWMR-]PbVDoDKIyLw ovyg#Bj!L30>4|w•("ڒr C,`P'smKYua^D@@~e<"BPD,p$ (r8A\͑92RkEPp&I;~J$,'<_Rk"I^λ̡2|={$&y@72 9LJM2@My)9^zwZ`>|/'<Xc L&JIҤ])g;X,,H|bͬʈ836z_1<⒢SCdp$>DL,A2<=K$laK{/G-h#F2mxzKDgS U[.9qCE0XPѳ`GIJI 40Mdװ~*0lՏS㗯7iJOj,6**pDHZ-j-])scUYB!c(%uNFxf4ao9pv,oܶNC69;~G_:qTg7lpT#dž2lO[7=n}5~d`xg03Y}!0p(Mݳ!@IRD, 8r#@VrFg^? z@+. inU,fpVjӛ6 hn5xdu3W7,0{N m}lA] MMdR{!F MApLdar@ԚɮC~/wǑ nȁv^nH*7p鼦Ou-gNJ;uǏv>Mz/U&G@ 7B`k(aYm謚}݌AduEE #UUAjpBk%T@([ɌK,* diHi!htUFy$VXBWʀJLC`*)8CSV;o9TY1otH \P^v&"h ,^ w9xAHjɯMvڛ!z; iT֠Wpݐ)C`+z\L+ 9F~ ƀ4hȟG HG!MZk {uX+CH.ycH@+^wƌ!s33J*+h^RX̪`.g {Kys3/)-n=ʂ@siHJy7)>C#ϏIJ tLΟS\TOّ0K'fWBu'_ڷ.>gq5UE9u  8uB`XCW!X@GR<8i@@s1b2<5xvv̡SMNGʧ-#s(#Cv8bX|Pʪk|yšEd@$5L:ږT2jWRdKJ9h0L(ID@W^r G@04Ĵy_778yt}EUʽr`pżprGCVDWAaKtͨ ^5﫹'oe]4B2nmݛtSʸCh▘tKPCxV&v)䓶Fp$WMږ#J JSb&gYW+ԌzC匡hkgjncaHYJ8ҞGU,7<3|PvBl7QI:qlxv:*9纉%o0 aptKipIi : EIM#.ݱah6s3ՕkǓ;LۉO9nU eന9* Qh0jJRPY`fdVDFN:1d<#b"=AP020dG ^CC^/AM̈Y"娠`HFr.ygRD)&gy&B$O1(R<' O:d!rzm,M9DR2 Y[F X(9GQ j<`HĽ&'޶I#7N0RHSNFSypz"_t>3|O<9y3+J$x(\kA+d`qԀwϝuDIiqWۉ G4W 2'U*wݴ䒕[t5+K#M3+ Fz{p=9Vk?gGsϣXzX@OHANd~U~6GuuKgkͫV-3pl%l6]93vU׭82߰3 BAR)0dA$P)PD[nqf2ISB $Ld|>KGLmzՎ^hDž C-T.S)^4xGڿaIG{<袠(GXV&*Hk mEAE,. "WQ". `ɑ32(ϴ&oVq`{f]$>tEj_-+4Gǧ7VVƇzp~yzܙnظA+ƅOvd^Ajp49yY)Wk \Xn})9I<$8)<"r.DЛa9Zco'W@0eW\ԙ\tW=s媆MG._+gH,-)UCS9%q{$KA q &29+ XN{X"\XJ%,`ô+'ov]{e8_ 8}~xKJ"֡oSk/H[6H^qم}X3\._^{ՅsS:dr)pϔes=|ȓOCC/ݶk,R-//Gl '5k^}(S\:~_cemm'7,&gԂS䄾Q`i * fجwF4oIpnfz*;$ 8 [OJ!(5r*Ak ̀Y 8R94ɉ8T㹜FQL(M9h8g^ěsȹڳF!HIh %.i"BƑ  7!:@iwD<2j:mp_^Yy>a s q {G&<Tf^F#Gʫ)(G楐zH #b &Dsҋ{E6%W3-d|3cmgF۰tٌ k.ϺT8A0^ TʻR{Y} yn|/IL/cy{˕W,yV.n[xrd<8<GtD߀R'^(GK@bEALg]p|?ӫcu˼闏q*UQc:}oM]P[S_pQe?ᄝBId BH#H Hjp$LL$0fRdX)$G I^4 37]x֯e _}T8?xˊ;~į9 ԟY'HĐ3xVDZ] p2؊&0t Y2J *oE[V #w:n;xvzm3w,yeu3?y®>+G^;Ѩ|/.W/3jӷϥ݈㎞J E .v<0d B񯞟 ` it8a F8rM޿a-_zmH de]va?S6雾$C@!id>YF 4P|'aD= }Qcojm/W=ӗK͂~y`!thS_e*7~D_kBXSA_O?|üuKYs[GK˙m֡LȵIWn\_,CzO8M73&Wj*5X!bF3JtI(MjHcUpniZMqb– ZT`Z 8:!C  Lɜ-fK\*pH\YG C)(*JB&2%e\0zл+tFű (Lm0dA0w:YB1D3d(KD!aH(.fcʡnKCwrWv{#Bj=q6)1YL @00(?S~fێґ'SVO =藚M3K;rzچϗv51^=n0'22B@vTX5*c|2KYE~qD4@i!f G=Ιo|jٮG̨Ifҍ;O>y:w$Gwx"aͣ-os7\*JB$$@L6);qtlۉW;N'Nb'^niOq@BH*I%Tws[0n;MjjsEQf wB.WGN2&(#I#DSHE@ a) #A$LçN^ѯ?7{Upt1Kji[!B%*9j3j\05 w[s_p$8ĦYGAg֗6~z>#7hXw/cops{ſ_?;Q%٬F%eaP+`yK+4N)$V!IoZ}r~;{~\v|TU!  CU٣㰖 WGzK9|Ƚë~m'ί n˿ѯ?~mcWͯ}6&Az\&*(8 "v3FKzp4C DϘ4%^LFU|c/\٧~zwǏhO?ymw/?kRd(;D|T0gJ-O;< :q#62*Lr!5X`3L06?F}S7?/-. w٭70(LJ?r#'x?ٟZ}[n[5d%v#ɃO?sGc7;^_ۯxc/?xx<^{_S_W?]vEr8IHĴxOx"8V=Ҁ"B!c(ɧy~?׏=s3}7,{wu?3C_3ctDq*3h^}SLs-YC+K+7)>QW[^>oyzJ Pr.#׆@IpȠ+xyVL =!FW 6+!X0®Rxb"h !q;kU7wLJ LUR% 4$EILJ6DASI"!2#4RMb*iljlxyƈb*I&MBSC|hZŦ@S\oFlk} *[s6oWQQ'ScGrѷz۪ g3#\{?q}ᇿvfBt2***Zp*$j>'DW;ʛwx单7/ ]w/_~؎E`6@$&'l ꤈6MbCo+vζ\0iX-+`|mrU -qamy3˯y^wӯ,^?ΰL\Öp$6Ne> TZ-48(!l(谖25&z2#Hj/6VQpTF I ]wn ~C=/kgvL*J7]kUbl. W+K[12k)w\?pRfBF-Op+-sE(uRwaU7/Ko}K~>2l'`9 kSU"E m ke39rhcUPج#L0%K'c;9k8_k^u.+W_@'2°OKs6hc݌ %ݖͰ^ 8( ZM2' rbh&LmuIM\A?x݇;͕^}{?rxu2~ ߌP+5j AH[x:D,{Zmٳ 0ۇO>¥ϝ7T#"A+Nn`ox0'U=Y`v܉(d L`xo<3skǗo7'w-GPdr7kk}pmIEFU2(X@T-|5s{?޻sW?/=#tu7ō4Ry!d{~T8-mqBk 3RYoVMPCQBT(>Wv TXKqoo{lӠ^ ** !Z ADicUL3hCaU&w5YC46:@\XQS^B0Z :Bƙh ;gfUII'`SR_7dtEB6*h)hטEͳf5)x wqW/)ݝqBg0қ/VҸ-;HL@uR&1Y3A2 ͅuV=d7#?xa[b6&m鑼4U婛&QßR>DV4aZ2$M4~C0ZEd&іg&}啱فYtc=s+F%Q\W&hifTeU(@Bh FvK+c Ĭ㓬 Z4&KMC\͗ܲOFF\>lȣ'=S;#B{ĵNP'@fQ˛ajHZUs#* +_KTI@%IBA@5 ̶\xZVO'uS _U @HAR=kT,rlydYQl{qWG(bR( !)籕z&ύ±B9U(sA班GZ2mO{;LD( k-U*Ͱ<`YK BԲ2Sȶ/GHqPAiVrf׸~2fbͬ-={nN~FHd}Ҧ  "dSg#&㰖MXnZmzLX$T*#V땜?v?iY1>se26IoI4r\*e60U2$HT4eMӔiG},iuLt;\Ί(h]8!ԚPVbV#ukS:NJM0d q(PԂIL`&⦽[ 5 W>ma֛VVK(27vUB\E&x2&Q(D%K7?_جيC(|sO"xnTE 3NU,D&=C%sT*J+W1{-W?U$Q(#0C$-1D UTKܙż_Б(1!lFqZo_mB$':SVJ-eaϱSoM#=5rn//޵6q7/dO/Ea+c HN &kz)`P:I4]B?ɅŴ0c3dP&1JKqSHZ/e*QAT6izG Pw339~Σ$+`Y Ѕ*mmɀ}?DDTT7K?q[\6Z׎W򓧞;LVN/Zbd"00Ɩa$3WJez&{q٥Oo?s;^ *Pa\F i3FPnA4:5cL"HA=^aJIQ%LhZYiHJ<:à3BW1k+;zJ1$aIL mGP2`a) 28B& BRa(*50;$I)&11mJʈTxTq%lVeP1EmDj n @B@DNAMM#1( `J  ќr @L(" I1Y$N55A >YE3=vo{/W(%Ux YE-F@Še(iPuoVm*"Q@9~p8R'qԠlSB?on |žf &FIxT5EzK n(i A *b1ـm]yz (ű}UTlJ!UQ!-(h)ZF #%e7,$Uj{=Fii6fVWnGU J'䦪/j"h9؄ϜnuۛQQZW>uʢh`f ʄsmwr9-76y~fٖI\7̸ 6j-bI𬚁WDY1k/ ${ty)"}/{]o&#;3$Q BPd84rwkOϴ9[1L TCR&U AQHP0Ĵ<Ŏ{KfZVx3n1={vڈ*ܹGI"Օ1=oe&:b7{!j5 u*IvP5PG\G(Ig&BO>ze{7=NIw‡z!e[YVfRU9v$$IaT'G]AQUjEl Ke۶mMT}DgK!q>s3(0Bg\0j̈bibwv\?g&ZhŖS2jгY;388-8D Tζᧈ ZLx*!ї'ךyY7KI~#-@XDjBfCqRF%ϺKkޣ?F[z]_3ic35O63 sYjRC7ާ߷= }Xm]?09FA6RyZ~Aeg(n&!O_eܬmV%*6vepy@08RVL45)(\ k;vrH ti3S'NF0}:C;g:UPD;>1c8FAίW#'0`=Ac| ^T2V hyάM ")*uJbT&mb%`63G12%&JDRWń )jHIC39r)"";nn"%SkY)bƞe}={>x/tjTj1KbS(`iCUu|_t۶Wږka:Ӥ))IChHv\Dc   Nڽo_FHggXlN\8"2 "lT)(hˑ !Lw{L_߰Ƨn>ڹ`V|][.. sEE8zu^2R#X}3LkLs]Vq.~ZF֢hT՘GDs8 :ҸQ95 (8aᨗb?IC4SR&v* w$-b3IsTxjej 7SQ9*C3bOU@mF@4kl&DC =$Q_bT&ӷ$IOh`AnZ M2XĔ1VSɖỊ̮G>>m?yegn޽S~kG.&'րEsI0wj1nTb*:$UJ#&KdV P 0BᰖR@2GmUI6*i9z ܮ_skO.mDE) b$;{&QXGX'٬KFʠZo?}~PdTBI:iZ9϶8֡zp9oz=vng'N +XFֲ: pϞ;R 4:n#j7DsFUhgT%(y}'b$eHdZ9:j=!>sbi7Eoz_xs+D5Iz CRl1Pxbq\T;߽bZQCf\ƍRgN];#&ɼPFU==VQ}3~ߌGBOJDpeaxoc׾O_^F%"ꈒ8m:|=0MS]5(aMv4!\^:Ťm &S0i?!$pYwwU{>u#6Gϝ(",QiHN"l9SB2A#!j0S`Hq#2#7&i(Ï5[Wo߳ *VF0ʴ^8T2Wu^,GWGA6jELAA瘪^gle9J&t538OkGNYo󕯹{g9^Z$ ^7QK-EjlQIYs;}ow 7|K}&|u $2҄1w5mDSLj8P{Q2 :ocȋ+{j,C,3aa2a-uRGu :R&w{K}}\a ]?г#_8~`Ջ?ymw;}un\r$/NA%GRZRR'p/ٹ[(/~UQ Oz}R##"apX 4a 3-r3LhYhv29 ߗ.D- @vf ]xyl)ZVo?-&`/';P1WZsqH$Bi$IQBUu )HTX,|%<_(2{QŦ6@EbfN`ZF1#"H̹s">M^uL躚_K/_;_^{ח]={g±r\1HR*6u>[ثuRsW&;.' g]J :$-Dv1izqQ}iffAsS$c2]'gãKEaf-eTOQcEu: ,hwPGH2b bǍX$#f$HA?qJԦitS:%]JXn015B1ɫJ E Lܶ(_2Dab\cƚ*ʷXeZ44!L'l=V1M 泔7z}"OὶK؋)e_<" J\ۥo=WK1<3a;#UƤ[&2$s8!b;?/s˭ON] ~wQ7ɑgO)+x= Kog9 KCZ?|n.ܺ#;٫5^HQ£'Z+ ZR"xMeL ϮTZf%K8Ӣ=s\9,ZynǕdWFa$C,F=Ri<椞 dRՈp\᪌u*IA{mD(cOd'S7Vn">sh&>'D,D*QԎ,@g$u 7 Q E@1#(DR᜙uM(½`vf3/xך|q({7{ѣW,=xw.Kкe%t›_~}<6PA SHZETՍaM mfGh٤r('lَ~F{~{{n*i4b464pX6e>RT$ezdܩQc Z%+e(&AhLgA4&G@2+ƩQAJAuuTQ|hsW;sx|a?! j 0AB* ZKorg62AL[%:+PFlmTqX *Y'P㠹ٖ9Suzn'yHD"c;d0ׂ) 76 LiT  ^l;(Dq3UA(Z'$7*:LX㐈IQ=Q6*Q㋶b۵=rFQ=.(HHY8[E[Z6ViX(A6dM3ǫ8 RQkFFt)Z"@BH6&4*ѭA V EH 1<]Z=sN[ea-uT&(\ ej#!QU3f G3u[J:(S-!41W5ҋf}uujP(&4i!x:VQzFFQs&A-yҴDh;㵱BL3#RbqҠٟ [慭[H.пT7MWFtAZ@S%S02N6S#-At ;+>v^R𦷽m#G.t_T~ExJ1tfδSWZr0%$iSY(neqȔjce“$Ęy=JZǹcJBvF ݞnA)reV 9!&hy`=V!jJҤ/hz 31#LT""RC9"Oqv"o΅n&!ψ c%, &"2\TE1%%mֺrCQCJLHcژYwIs&B`!=l h~fWO.?~-7Ǟ?;>񬂾?}oxB䇿Jh< ?w}c[MFv$))ZEv %$9B&Ic3ټoQ7=u<k8kA%5]#&>0vɯ&Å5@lR8Rڞr8ۢN*٬$$0ݺ*d2&#) )XQK UR;{۶剕Z0a0c'bc5OAjH;(\قH"S(AWqy|"@'op(&QG$6eIBՕʸ bpZĤ騹`jVg<:B;%刉jQT$ƲV (Q+tA1DDqaPB)@30Av͸4K-ZfVFɘKaN<Ut ݭl_sk!&ߞȌc' @Y(*LJKdȟZp@f4[޾W@DoɞyԘ (Eu?)Q9I[{.r4B6g)!fcm2/-wV6v֫4e,BmSa4*Z,8tL"j?F$)̵wvfQd"v%g㹟;pDDąhqdBus7ƒ1&:5=O``%A[<-BI\ŖOM4[!~ W8g &ŒksB Sބ3L2-ك*/yJY[1-ށńjJěpW`&`{Q6zgԧ:B+Bug[øNUl:IYK|ǑG/E-DU&<=1>DUDl [[*SJ"HHLlBz i v"JH̄IiO+n߳Jޮ>cxϡO֙-3[=/ Y}߾qșBVeD+-4/̞&h^{U0BܗZb01bl0^9uD/g&sc(-$w&ѫszB-3膀andza%5n>}&DƆi6g٪f5IOL#fŗŨpD$EVꢠS z-[q6Ds"TNb5l1cWۮ9^ke fmFZL/Eu)(tk*Ej.!?~5{ )60H55-bƉȪJC|d( L.Ov6C}~Hcuu]iŪˑi\F"lfE?q_^1>e drs`{6g5-Wwڇ~=}eߺsǟ}GfZ%S u4;3.'/reϵ},Nj"H$Wd{7akJ1ТgVg"3: Xvj M#` 7jUeP5Gb MB 7|?w#UUy}.km4zo,u{lv^1TQQSPD:` 3f!۟  X 4CTT!lu4^p0Y&A0jjDHU 9 ȁV7qFt ߿Li}GeVw)lF x ̵+>A4RqB*GjuS!UBʦP1`>kV;dm.yB+B_L7U;[S>lWI r-*3m6ai!r9.KbVCHnw? 1ɗGЋG! @֊%9p{Df YEıj0+S!2Tv31-iݥ<]kۛI}6f"hkKSuUJ:5ϦT~ ]$~A٬QzP\ J<Ą6KE[уVYmj֫;ub]Vj^nռϬ@>i0,NjE4^}^FM`DJH^Wc3Ӏ)$}@'Vf9M*:51b "8OK'ZGZEjU-Ih!\`fpd xY/f~k{ulՇ ´6Xj8 vrS ("ֱYW볺 jFuya/U)1SRprH83yv.e_xcVn:)ұcOD=0X)/D< ƱG6KYדనjcR1mĈ\A臧V@5tkʥB*<)#V ?ZH]2G :EA+ڲD{XL*֙xav"Yfܬ\pV7k )E\;=㓰HTMes͑Z&d>񺧉T1vϾR2@%1SYKEWVM\ԊsxXh"MF Î8l0 ̄ YF  LAa DTzū>ȳ EԣI$"#hRn$*cbl|RGܨ\_=bG|2zN\Ty/><ެc w ?sm׾ka_\?ǖ᳋pb,oˋ`o?@j>m1dBj& Qh Ƿҕˬ ~+mFW3CyhlDj>7OdYMMMn*Z&& q٤!B\4&w6(j6A͸5 'a }uYvY}n lGSf4ouga:0t gCdEWWZqv%`YʃoaBfYT GAV@:H (0D04Ct2R/@ɍ%:GZD׆!qF@`1׋@2Jue+.f zKn⼙=Nox'ueӷCf#K|kaW8Cv&%F*DXpzX:喥P3vIRv BZ- ܣcF"4|#A`,>y3XJ]^LjV~Hb}{E*RQz5uTc,UY_2Hu@/R3~Rd** BؙΏ24"I}R1 5^[Svh`<7C ./rV3eÒfpms![-FCH'7톟=$jxd4I\'kEC,€ԢX@2!7Z$ fI\]a1bc q3iʁb~H>RXdٝ0@VͪAzzk?[7]66X5ŁB|m 8.* ,2)I^ 'EHRZu1kbop30 dYE.?[h*X+]60wVH=FS貉a{a  S<MdGbf`ۢKK{ZHJt,<CI qBClA t5d{PR8PG\6C!Ō 3X{]먚cP:8/AWqpQfwẅpu TkI\Y`=o `A6UVj+A/eY-gs(D$|B543ߡB '֌^}a]֬o??K=tf~{;kw3x߇ws[^]_| g*`55W1v(e E%ѓ! -0f<@1v2p$$%r,Wr-^-f&ge$HԒoZ 44jR& BP1Gb@m@Зj ,M#,zseX@bh@ٹDdJX ! V," TJ845a!$4Y Bs.(iWB PŘZH&@\9`gxʇciDoqO|}H~?/3{/%?c>O?_?{𦷿;N5>/O @"bP!o cdܮ8&my_H26iGU :ͣѡ%}m?KE)8ذN \!A/Y%iK9Sހ;UTX1wHz)3_E>Cʶ"YdkKe&ĬƄ3 LM>,>FLnס]a&H;ЋghA Hy^5VLA%_B95A|kp$b$@ex׉Ze=:![=wEڵ03tT].VÀ@Tf.5\%x rEqn4Њz +@M̒ "^j;.2&3ǹxdXꉁG-M#FFZt!T)= k1:q봢i` ꊊvxƥS$&dc|rV%+ R$2sن:` ԂB@#@XMt aV]M:w&LSu7@Z:5,5H$k!ǫAiG֋B1H4rd!k< x͗860Ç룖n=` 8 Ȏa5"sy4' enYKHnA0Iŧ6jl0KK~ Noß{O>{oG_|[^ko{+݋^vw/szB؉^>̬5K_k]&&qAaygFC#.-4M# Y@8mڒ+ @bH(`Xd;aҤvr&LHVE /ک*΢{Y5(iz41A$ MW2:3:[rdl.thqEkĜ9<1hӤIfܞ^X6Gچ'u$jY}6$<{±IPe@;YnD.y $R4"13h~7h6kq4 LY1402PuEBhe %oL"&3k (`E3$%u}&@/&60"4BeQJ/o'QG蓳b#/0`xq'9 N<[ M80aUA_eˆU *0~ `IlDJr $%޵!~k$3Q`{`2f+k$ZC:bt o'' _G cwT !2LϓD;Γ: Nn6 uS$&`'2y83$Ⱨ|Xurd:Y:ʧ_O>ϱFS :'sުX|3`EHPW` yFX(.ô6lI2,".Q=\X- צ^O+0 /h 5\rM :0n$s(#c#g(1*u~; fGb m*Z59FUX$OoDd[z@AL$"e&fWDtqI,P'FX,{f"M;7) )2.z3C/,:>ce3 bYS|k( Z ",td } G}>\O9TH.`U\Gi5LZL9].cX8Qj>cbTs3:û0<.Q$DO#ū֙#5d82Z%5y~[kBo}m׿=o8U[ѯ\ f)|<}'~q 4{K6︵9iog> {KaYEd8z|g:|m.3;YfU]rU~wdƛ~ǯqn Txɦ Iˆ@Щe6R;/2nb&-pp"Rs-U{'#M+J S,{lJ+fh ܬ4 ;^s牓v;xک)M7/³WO8ۣ|K]g<12T"ܮAgfcեv3O%qK&kՒY''RŊ٘8ۀn0ҥKDղ@Sd O} b0wf^,2vYOM#dIi< dI,i;a"g > LxFZmɲ׽eSJkfC/\S_q)œz_3f4ЎC䓕!u|n馭2A PPwD 1ACP1"/!P:4I12$sl1| .er?d3UrQ @[&%Ċ1%ySմU"z0T1BA&5u\b*3d[elFbfM%K}4 DJ E@*⬢lY6lћi N}4a <0&2B4N8 br>XYq?Ԋbe#qK|$n,Cɽ=P 4O)ü>.=Z!;C{QUqəDEy_b 쓳.{kR G(U8q}|Tk|x]֦Ds;=ԁ\0 Y͢vImy52_t&+^拥#RdXy"&D 6{U@c.H%@݁AYj?+^un ӟg_|"Ln{NqF ~g-RS7׽lAmow<v}hΩˁ^OHW]M PpG^v.,0B^L @DRՋR3 z޴7*^&'C˶wXJ6‘1y+.Qb`?M l}7*Vt+RUǰ|k޻LB 3Ȣb2THDa%t~kp? bbbrM#Mb`^ZA/@ @ Nޠ% 0iN)TETECDfF$"ɰ!4 ,)_Z潥.US.Kҙ^A["q{9:zEW6"SX$:q@\+r)YuzrL U@3|4Kg17M+~f0D*իѫRϴ!Š(2`BO2N,t\%HcF9tV#^<s`[e3ZyV%CHe0׊u3'D/Z3yVFgKb J jF@s >1ɰ.Z/vZ 5 gqֆp,3 -Ķ@St-uPGR.9?pqTa 9̐ѽ~y]Lgp<= !eIqѕBWY7E=kV)eegIYlѣ*c-qA"wmT:eo!Gs V>`5 dfZ뿷x#F .zgӏP65jw8OAC8ڴf0`kF;DD$ ɊN_VTO.%97bBCa_]|βp1~ le{IHH'6Q'p$@`”"mVЛe8dO*DP jfrz+;=J1@@* AF`v8׊`6e4T͘'/^;.d1&#cBb$~"tq7W6QѤ9g!B(@yEAd"&@O$3369r @MQH | [?AbI7HM-gXHԵ<8LK"lb}ڻOw ܕws?cݽ2}vM}xw?GW篚$ڤ:٢$#]}hd3?R,Dbfq[iByɕV..R@̊b8x!2A2pfYsF3!$"B@)`UՀEqBU^ &B/ډeeRfMUt4 }{taw }0Мu,,밻&O7L[áA\ Y vB@Xw:ofCoEǨqC^H'c1Spu@0UZ)V:ܺUyI7NȝjR$Xykid#slGD-n ZEE{q[^),bNP#ăֲ芃uyLEshf+nNb!ҧYDeMT45`0:1(VeƄI~[=)DFqlB0%ul78d4D0cAV@D \-[/_NΌ\/~m{x[H[_}ۛA^qZtZC DV.02aY'1(c9B@Cvbweަ؄lIyoX{8jF"u6[@6&HVR"XlY]VDDM"'P"ZDy\g}Ǣj4ĈE"7ԑ`0FAHR˶ \J"DǼK(=#"D+ ҬEa8U-]ZqD~Uwl ߸5EdF˃W6*޳W>O~ß:>GTxbDgo^qv=MrݹSއC9YSP5| 㴢INb<:~Na@p.[ӋDWDW!(Lm0 Q貹eJV @.jBu0y&6I`ы\2m0r8Lz|&ͳ!4L@N/^kH`YM4ϫ@ǚLХ'7b@Aeefpu$N+Ok1Œ~'HxF`dr\j$+u|i %k&D-BF`qz/ @XW"%vO#NkhBWn/P*B%mYt>!r׌E>H0= Uf.? 'M*R\nE}*92b+0.RʓHˤ}C8YU+i5Ah`W߉ϊ@!$(AU6Q*0SBđ%Ttl~ /GP}>:EB\ DgeX$ PCVjB  !en7^u?OClnNf l`/T ˶qeN#́EYEgXv6HӊTBh3AD/s]hGtGQPfiÏ0̮[}2$=b$FC\#^Lb:k `V\vwk^x}wtW|z];{|o}K ;_}fG/? s݅gyn5gىn7̈m74mQڶͤ@0DYtz$:9Ȼ{5485=6["Yͥ߷n٬$|Q$NB꺎5ȖmulPȝ4$i,A$p#_TY BHzqD8"Ձ*.wq!&H>h:U)QN8t<^:"*X@MH]$#k`=ђvUsRv_xu4X۷j>Kyx/;si9?},x;O箩O}Rg;s,~^zn{?~s7c-zU&bP&д"?k"5nkz) L5F"\P4ӾI[1yo`rjay _*2d^>%ఄ4aGs2!V73 >;ԭy3pI ,0Pie$,Ra3kZ(]/ !5gE[QCמ#@ D:iE^z((t]lRcĬD'RӰ8_9x]#QōNkڞp,Y )@DA95ʆR<OLC ߺ]EN4nOBq&jf& FZ  hšHeEҔ- XN!`*Vg m쵂'bM;Kt)XDB^ eBϙ(c!fw!`{o  ptlWlH< ͠ȨPdu@7aWOWۤ]&4W/'wӢ}G<_~?GNGWOr{W?GN4_~VsNBݘ`|x $fV[ #lז?WWN#UZ+"vbtՃ<:lLafV5g916LHӈåLF5S6a ~:Gz`0!2+A.2TP= 5jX#8 ~~kԈ00HdR g1UU ٽ?jvR ӘNxLw^Cn߾Lo{Oz|???'UH{o~ՃV_=]b7,{t]6nEJI L!kUނ ꀦܗc02lմ_&:O\8b[6f|{bk~-yޱǷ rdH8`"Y\(4bX= !(@ʅoaGnLj'1Bd[Q:1Q@5oWB&>ӳV79M_+$]1adU[ђDe=Jl7Vꭑ#WUEw]5b̹'ɭ5ht:@;}&6k˼u ]'{»^w7#ovיxb;pք>/пۿ5w4rwŮ-ľm%T7Ui]mD=l^l QWHfh3l5).&yk`ף WJ礢 dr-UQڸQf}+y_P`, 'Xi'_2b@4\Y mkVre5Bd&F\<\C/O{9"YX 2T\_f&XgWW88h۷o9]'Ý~}}۶O|Yo|޳sG_y/}WN{{?s~?_rL ْ8%zQoK(JtٛH+`-+ La^\i Ө5FM(ػۖ]}sεg~ !D H- E`Hą?UIUH\Iv*;E?lW1P A!ZR{5#9Z{s[jN{^{s}e-R6pD4ecZ6X̔ Xni30mF96\$P-D1lƤD4d.Ƚ;a8^ڢgSpSږuDLY;/j:ImiV)ڄ ;kjVi)-{bА2q㏽Ww+瞹?9?{Ͼ~]ħ>>׷4|^sNzK+#5)9t|:^?MjiV.,һ1{1urt^8Qzv2ɂQ;gr#@$Mỡr=WWN88LXocAK:Ytd  oW#^8QMR #X"kRB)CJ2MY FwPdUC-u @ɲ[$f)0/ ܂.%.[逭03#\Z?rk e:8sO}ϟw߼B>0|K~KOyy5y>lr'uulߐOO^מ\,/4D.]1#YsZ^?옆Lǜ d4&cHH!WNuRA %.R]ZpLDd4G[o"kq-)@R%I:ls3'ke%UekRY m%I4+ Jf.u"]-]:ǝwv6381RR;bgjZCL֩j[6k5%e2JboP/wo'/ϼS/ҿ]Lg5swjRc4oL3b*E` SФU PtBy̚L4}uќ-@ %!uTUQ&;a8,/oֿHZ>֙PCkgHϤi6mQԁ..ݫmT%&,Q6@VsʻuSr vs_RP"g_k`VBuV˃ 8ږ|rW9@}wЦ8qL \^h{vڥ&QQ5˾jZxv]ܐ\ h~KvVPx~vIU%[Yd7cQV|vaSdMie-= Xl.gќ}uV1,7 1 >q|I:vU騎++XgbEz'wDJQL,vs4O6,fTG #tF8'Z8ZgM Y 9.c[8FŐ!{tDE -)%5M^*w@5e)ՉlKHRA])zSp=zab%(i p/֙{ =L|oxk{ybZ]>^~ c~_|p;x[޿ßo}&I;~9;4+*-<_;%Cp44W*-c{ֽZ3&̭&3@+ܢKJh}j3$^ґA`1B+#0i UyB2XlgcLS'>ڶ@2 ~x <j/KPT'=[ փep׹rwlQ?Y0ffLi21k%N!a-α#DL<$z Zdi.O3,-頂m4y&vC:t1uH8ƐQ"g"=x3fv J Ņ3=~Ĥ1 e"k_Szn):putF'.=x -C0JɯWZqb{wv-jƈ頲4!%Y#;B~_UDc֬Z[3M~G1QESi T ;lzUMӹShYZ%eV.NjQa k{MSv[l$MK|&E7J@bd)aUx~F' ;x>YKMbfmQU}UE<{2Т3P{c0%8.G؈*fٌNi<54 fLlʥ;-ֹ iԘP !5RF5N'2-ՙ(PWrwQg~ծXUK")`CÁLe냍+Yy!;".^~*1D>tknT}+'O{/_xCW64l}^|/­&[)%0f#Eg>CR?njY[IzlFhueÅyԦ{kI+e6Iх\f";c;ne?d4O9!Dj*=SӜt@#'o)ml*E*GEHS :)8 f%C;sE;8ޘLv )m])Fz(tJlk'2E>pV1Rk["Awj޻9ย:? B"Uo`I+Hvgv;vQ`Ϊ 1i=[i.mvW`S~Ŏ£BZ0eU:vϢ5qOvYagti'XG,f2aAb>Ƀds\vZT 䃮$RK]X Ei7eN-ˠh^.\HȪdd{t27|`j ?̱]ފ~FT:a"j%G//,Q4fO?,5Ǟ}'_}{?3O=wx_|qxww9=b\1eu_0wDnbAQGŐ]x$0v\:&:Î9t3]^uW=.tׁRʸ@Cu!st("`F"b1srG! J4$\G|6PQ f`0|OGA@ 惎Ȫ̼d򌡞@*@HZK,:f1 - f8L0% Gޑ2t\YDdN> 7l LرwhetǟK.~ӷ<ħ%s7N?O58S\ NP4E-df|{E!tЛc Kem޷i_:-!bri@Tr| 2=؍"41JW!o0bmri>怊EuH6QU_bwz+6pQ'ӎ4MTKKg=K_5-.3/y5si$I6H1Q` c`ٞmԈR`bE#h j>bZ9 GXvLYԺ;>E+gh7!W+LX"..gnvL}(j9ca1ihMkq mcVZz*98W5cZ7KgM/ 50jKVCPOdve3{Vzd㼆ּ$j8J)ش%nZ/,8i;*QQI^FnlUzO1# 2x%J5疦Lg"ԧ1E ,gŒS 'l$"rL&p$i\У ep奿FHŔScgtAw#<Hϗi&rL񬡿\dM*.8P]xbDXI6>]1Ǥlʯ?» /?s K~|_?V<|5o:z3=}ǔN#Rͤ"G_ƌ9&"ǣ>twc|;(/Qp/ǣ҅ Z)UO9g vV_9ICEWC4j`RTQh,,Y-Sy( /+jR61xL){љ-;0V;OIJ oe7})?qĖCU6j(yEljf,y2F)KN I&DwZDDTO!zD\"Yf+<ٿ-??ew['z1|O-TT̤p!啍 SQC?%#fe>OJ[1WWs*UC⵴ŽKhyÚcfU$2/0iA7 eq;l>|j0W,C"Ld)E> j"wƬ 5\^~1}#Id(O)m&5%Ά IbQƬjt tmOSTixβaCTxUC"1.蒁u6-[Ȟp2HEcҁ0ɔ=@#Ѷ S$P٨`!ԝMX0DIe[|MT,I g5[D \v,ۀGlj:U$jT=:e6O/6$!oUOLr 580dɺ3l<1e50Z4TqKt[@!=Z9f'OX^'MCnlm1K4);ܵrItuDBEӐI&fƺdͱZAX=zO?~7o?7ziHDGQ[,W{63m΁ޱ#z;f9?VM9D;\˅f`ӅjdE Bd$pEl`6T{ ۛ,U[DVORĴuJxN6봴5@R'R)ӄ3dzWmfGƶn8KuX;pSބޘ;.*.GV$(IjJ0&݌s-:Dw&m34AMbs%eGCQG8EǬ=js>v䈍UTS9ˀ#ȶ:m3D mN: Lg{02o48;u>s,`MQQP Q5\r> KVVrRخ QTLY~b?N' w'-GM," r +ճlGfe(&:֚ihfJJL v-1@Y<Ѳmm?Ch e?API֊͉|'m*#8#2A޿=RK]\Xd Y δ));xW*]zq?ԛk$}ou;{[~uzݑ>:x $# mV"~OJnlrkUS?IcTXz^8fǃ,<t|kOdJ ݆A4ғ8f1.n5gB(QS.IOY\=s#DO" p1EL TVl3g/6l̺S9zf(]JA&\iJoY/N Vd0McǛokWHp~'|{=Տ)=_ Gm$m;JǶqQs񗞈qcrv;+;b&l,\.w~'3trNK/\:zrCggOTQDnYE6ʳeq߅cn兣&{/,kp_Wͨ-]X*{ 0?vR>ڞ΂;do/;3"UB #cyOw[<@紉-_3­N&0S? \zWW%Ra!\b\$kRsoo+3ud㶄BʺcF0AO9y[5ܺhP`ZN|k#CTf \"MLl;.f幯p q+ըi[cM1kRIdK]  5mq/3+OXkڡ[LL4Dq:&ª1a`ɘa?x^}}~woeOw}.9Q=()_^Y%fc'[K„{\>#^S%_9C(iS(8Q]p_rLFM#;F*iFD]W.3^Yg5v rF4}Aed4ru݌RSomz&)+Q-K'OƢW6aL%ATJh1W*و/`g B`ADuRI1Jaԡ$@;C} UV\t?ɍO黾MG_?{Xa#?}o~>ޠ\OJHTWR6եsAQ{tm%Luo;"[M|OךUJ@s2vc)y͵p548~݋Qd%ĚLM xv5B [yݨU]INȠ[ۤ!R~1-ػLc{tV.7e> Z8&MƩl)g$*ۓ0FUVJ%tmKKNR>}ڟDd-X+v{V%DmT)>cv̦A@I!ٙU5)\Q: ($ N|Wܵ@CaB5p(h=zݹت`p/2ٿ]Rs J&'UO%BGK*pzW_s䙝Z'cCp:l%!2nM ^WeQplzvȢ"0JnI; V.]O69:uSL&,;ù,΋Nq]}6om*x{+TuU]u+_Z %&0t.BR.W%DdhL37} wo~~o| xt/AN^#_ۊwuO;O=z_%2±EAbm[qD').X%ဨȢWnhXGeÞ./cx_>Ɇv@8*(wXz;Fps]Sۧ ۤ{sM1aepi[a{.Þף D\iɭYDmFUa:f-E*#~V`)Y$ezK@d*6jI gt+YP :Hچ.PjDpeʫ;xbgi|K{3'/_=~#zo~W'QrwWOUQmvHM,`J1[;^Y[gnujg妵/eSyEզcy5Ѷ%-t gLrN":f;-Ѹ񞇯n6î{#H";,rVE_\9;(zf EvV"[ZY„Λ5LN6b|] =1p޵r!oCʆ9.!%٭E_:Ij"[G| ㌰؜Ilԍ D&-;5VK +׺Z gd*u[ +Koc8ם|(nzK@ δY`3I&? Jl6,/qFZw p4n4:mpe2s08cE=}2t~u4}Å{S[On|{+cԮ y,LX--/{͓<^XT9iT\9եK">]_?YUD@ xGB0՘ጮ I7=X'Yʌ1DOjuppл:AX8x ) z:NPTcr(HQ\"IیeEi&t8 `@X8&m,[.m ѹ L\pHb6Ŭ9|[ J$\8 nud!dQm'$ǯ?kNwMJI3&hak-ǥqO82QDּixZ))WΎIN888_i|&$5O;(.1/I`z1&&6RD'duջnow&{ډin+ri笁vϿmIs|C=cHy=p8F`b1 +#>pDB̢)kZBTitIl6_Vs@t:nuZҺ M6~SƟM?v0E#‚gKUZI=@qacͨɒt;k)ǩ|sxg3DY)0s`us,/e\6ڮcVf@qkPeOW;zv=Ҋ[QT햝k=Z;w!(J ! 9 (}&`d!8,9Qdy3t "eHeyQ!3̤#S2 s8rgkT|W)U;rј I9.M$=ӜVgh2o8pKs*W3@SJŠ ͢'Wp:jPSZ^3ò1XMHfОm{@VFSqwRՋs]cYaw~:uaEij!̯;'qpiQak (Na*J#Ki6{aO 9GD._<[aDx(&)W zOޓ*IM☌~Q) vN8ASR͘sY8f+sPYQi%nN9k ˲KS-jKg#DT2VIzQ{Mݿzбyc rDY۔=KKApm܎٥,~}=w8DcN)ocAꁃ8J1 ؞ Fy,!Pr!iːqW(-5\HtAD%bl[OHtTl5p'̟s'8:mv;`Y|*TEH]ߘ-(V1',G( l;f㔳A2UZkӹݦW.XdVg꫼K7/hXɊ0U|>\,1˔w )>M^lp]p$g0ŬA̳AwnV;fXtLf_7 qpBJ4 jʭ^b [mYrR J Bttjlzkg,xF߀rPRHWoe?3{i+GA,O!ha#% Acuf0јY@\veq%22|m6s$=ٜoWwzrD!I,'QT 8؎V&YMhw4DyWœ7L O!KMJG/[rj)dhg:K* sA -qYlE敍:ŤIISFJeUUw̬*fK&\SkW*lo΍@?qVTB$ʝBs#@5|w^p>qUT\f;H9C-,a<><{ͷm[1Uu\%JRVM2 r X%jcAe"`cAW@z!.Q뮒5 !֍#u#K;\[($Ch1yD)Y jsYnP[Z{NB̎:-v{"Y;JOli-cmQDY8Hak]4f$GL@I.wcdj/W` WbYU}V29Ƭܟ.BudSE%kfMyDK)[Dw}|WO3Ք !iʀ{GiHd9Eyc(C.1P[g{"Fp% 3}TzHiyD;j ;@ʸam@y}pP'Skv bƳZVhNn{5MML]9i %sflO?)( nhʒg\X~#_EN㈜z:*u MuZ%R0гEJ/[B}僶ykB%i̲E[C0ʡIUSƋQUgՂ&W9!Q:_Y5IgD_Y@,:D"]n{w*YF>Up2ֲ m_MrB +<ל83vj8SkUc>͕IbBjYFw*<JsW)Ͼ\ 2Tiy)FoLY _э[3U|ԔRSǤPͧh'Gt0uh{UD5_L,3Pg2lBwqz4J1i;GI9ҬquHlI@ " 0cbbhsdaMO1:.jUGc"ڦ|,;Ir.eٙ7Ƙs9ވLel2€Be$DO@&Ǐh YTJ*8+]Ng:̈sk9Ơ1\k9F*<ُ7ǐFTX'%wodF'2gav16t4͒㲲hsPLǂd-̅P1)κJ" =T7d2M$Kð֤_7~[7N\Zփb1bHl,7ڐQA7A9: N@ZƧDb]&,\9T̍@eaR+,}$ȂqߞS+c8'"t*HDw Cw"LAX-㵾nqY;2#dIx䴘K;p>ߤM09l}~|3-7~߽3QN=nzyA6Lս(΁UO8u`z,Odԛ~Go۫w—(SXy4lo2'F]ŵ,\t,p,-EO)D7c\lv0%j sN.MZX*Ot5aΏ39D wќhIlCQ7samxȜJ 7sä6|nuDIwB(1G_ίmv] YHܴ;AaZ։9nIOСb_5?W>p 8fbGjJBQny`g@[rmQjv,4=,N0E1QᎫÈ6 HD@=(rΉ8e`85JCwU] GmLd ^e! [ܚy_{ և;q~puCR+zeFvie] `fdo7'?li[m@>_'Jf&W!6Xm?y愗hFmr 3DPu(5Dh'ڍ?7$(i%[Q/^ dT>RBbսrS7:'A;2x5uo'm?_?a5 $P rZk}TK-ec-W~6")[-k-cMpnLJ|^VRYհM95j-Lۄ%Ne@LCb:4&C{L& (a,QmׇODސq_pq !X7:?E#yrhiW `lrb$>AxSACE`FeDGT! B1"0=lo~O,3L/o4 鱒5ҭCAL+dQu]~=ឳȥ37ۨ9CDCnffѽ3 =RCmB,Qwo5BHsk&x{&!I;}8 gZ]/o5XŁ m0o?#1kg CKRbpmcci7Wnx? 5s4o<]| \ ̔*/|s-R*@ytg`]-R WkV%-ԇ)תRq,rrbjAWӹǘ/@!+`9 gK5w.kw ZhM4 Dz}n9UI!P!PuKD[/""uVT݅1U3` XoRWǴ1R:~ ! OyXVEv(>-ڒѓJVI$үyY35B*PvkτK z[jkbE.̳>rz' 78 hC] ʚ 764U8C} Q Z]QO~? _1qJZ%;H̍r/S)@N~$$5eAITTmD}zDdDch5Ixhw6xզjM|]Q]0>| -Ѫ o6TRMǂ0hWwtTi s{m"T}!)kguzK[3 E)zH 8\=0ydӣu4EQ:M\TcL )$C7[;Au7IIY"ݤvbNbm,lԨc'ML8T<&L/WCVPϳJΗ+V x'JީO? (2I8$hMf5k``R/!_F[xTOM6LŦbuB5hkp-*3{N<mS:A뇺ژa)zU4f\zB:5[\hH2vZ;Բ/=Ht^fSO Bw3_ ƈAw'v;i"FӴI /Dʀ=3`'P&s/&r}dL{LŒ.h045K?Ⱦ|bEOVPva-yJjIH( wM&EijE@I ChRhX sC?m)OCp ‹b9KVV+K% LK}|.lsg+3uW'O3Gu0Q*j``b<*>pɏGO%/Afx8ZʭcxMd,].Sjq^nd*ZjGc!d|Im0'$ (͖?ŊքMN5%֓%y0GTV0#&džs6LE["f\lLHP/.Ȇ{F 4sT 6 `6BTvC"CyL8$.{Zʑ/.%Fu| 6|~z>K/wr>-pOD6&5s< Jq i;XqmС@/7Mt? h /b^^/=:\.ɞmĔh/}X5!q[zU&ޗ5b#ڬ.$\z0iblmI{/}tlꞙ^m*Z?Hb֕Ky3 X%ҬL\L&=E+;ﲐu/7=XO8޻y'fzx|΂ s3w3rQj}Eq ht"+StuEi/?q |F~9Xa^P]Hsa01lWBOQYyd kؔRcjtys?_2rn2oK$aԉØrufbQ460%lJp "vRiB L]숩BR+)p_0p7}8./>0.GowClǞF8=z LAf RqP KgâG˹ -h)4aQ`e!{fY@Y!fCTIbώ]9bx sLJaީuS&924PiݠIXjvκgtMq=Rw/_;ϴS #\40VéR,_mUR]Tՙ\cou⬷Ԫǧbx0{n]qe(ޥW}WΠL&g5=e$3-+v˱K[߽Ո%eM=>gjb! U] j-%1 BIQDOgbĞ=>>$Vo Q$C8Z,}'&Q-'Ϲϟ2~x/܅:3|^Yևv( 5$a?~shvy!AqV"OJS\Œq᲍囿x}Ar!^^2TfjB7Eh?UZJQșr\LUMp(~^| s0K45 JR#^j\-HwƅC YP U[DXC۸%#3)AVgJšX]~pR`iG{br`H }tNڤ+JP󋤋Kdn JIҫ8GcY?#'g:i#'3 t(0ڤ"3ЁnQf}><θ/\rWIsLBV5OD7}v"0@xXM=U~T^vl-ϦYXתQDI*y<@< 8$ԕm`Pj-nv^/̟pnj#_7kYzy}^ս=3Ǯ] -Ofk)^oCDpC'r =dvu%#7pFMĶҤq0xĕU3ѕ-PB GSɊ9L *,wfU݉ۨDx?=pMI=$Ih#Kc$ohGdc*`i!9(h_W2xUI`GmC>9* "I7v`$):B& 1*"3$!ER윩MeX̓cw0O:Jm?lgK?짖f s#;i{@u h~7!á{sאeCR'f1É8 㳃=Nv*-Z+|p`en6iJLSzrVJ{3 Bsj_q!7FmWQ YW_9/ ;7l. I*we%g.Z,3KV͆%j VP2?ivWNs0`$\i@v+< Fuw%ʉJ4wW[7GwشػLzSUDhq|.0W28Źl_DyhOk(UX-*M$!p٧SP|Ѩi#ݖnA|O3mt!UL[oO'ۥQs"˅o PcA4XN\DKL#T]iqSnhK.UCU?mk|ǩc,-cV i$'fEFP3B D6yqJg/~bފ~s盳$^]sO(=dĞ<0TژsnB8 ~ ch $mUV3i3bi㦍 ݖBT[t6/^vm+zꙍ{3~"gubhdͧo¹'Kfr'5[G\>QA' ]v*QjPچIp76.# yٛ{ |?Ͼ/; MdIӐ$m0j& JT ^fԝn)ZהSs + [n,H!&HA٬O[ A1L';{FćfK"*BPZpԜk*6 &HǼݐ*">wpZTu "jm0RoIw; 4^/_,A g bpTd|s69Uy#,v囷C5q:L^ɝ>LV)}ro]դg4W^cxλ} ]uLlXgl4n?@v9giVi|hb' n(U/ĞV@0OM z9{Wʙ=pL5d>k O'„mj.|>E԰Mb=38ԋ(uim zϿX{]WmXc^<ӕX,\IRּq'}Ik*VyZ"V]o q:joez^wԭ\P6qh0#o ĊV9'D6l"1N0c%Z93X[[PgScϛQgDjDwxQ pHsi=aLgb=pyxshT!lFu-db9sࠧ .9Pէafb.QQUw /23mo ί}W߿ d '?O 93)H$HNFIUj7WV*bi[ɔ0v~! zKmOFŖhoF䄛cnR pn7:|IJp`ʌME}rfSb CBkc>oU;9Zp|?8Av\Aـþ+VA ‹X,F(Z<,iIlA9(&Keˌ*_'_͛"ĥoGj+ތ4sLj!L]@A׺u?@0! :hlEmWJxD4R}qcZ4}T$LՐBBmөljFx3qfۙ,1gZ)'va+NCz3LZ3(lؕv6f{I7èڍ. 6j Vw55rtuդsPaFϝ]y. l=UpX&t~~+yJY]8$8.. yWʨpᵿo4N'}`NX+L56ݗq]#3zua]Xv-EW=釘!d@p@W3^r@7Utw6UTuR`?h#g_( A Dv/8\2.T\khrt8gNk;V[]+B)2Еl,y  'p(HDq0+)PinK?b/6n||x3鋁oưjrbRW&~|twͿ?W_Ob,p?ysDZiaPȐNSv85aNEBHj-q\C"7/E$$VE$98Q]ܳ#jR$cb蘺bD%|M^ܺ1%$M&@w;֔EA8oC¨-N"v[! vX5׈2$3t 4F7@!‚XMm#l Ԉ;O`"rXᓍNN^+|_lv{Z ?`'X]\› C: .8F 0ٓeޗ4߇yO(K_\av ΒX&djq=sXm̓Xnzz%^nsO& u6en@o=^jhzc$`>~% nY,ܬ !|^=9SRWk0WXsծ#97?uq hΧ\3iZ'N~6%% QY~2zj[r8 [A$O?9JT Kq,Df zqPN}`f^ljec4=o/ڦUGxQMmH<ˣFD,n8vUD.i+0_[ zTx>ci-ZsK֭I Dྕ!BQ{ e&֎X@1rZY$Og`=^ŋ|HG90ub΅4p1T?86(b1=jQ xWO0OXaEbji&vk\x2[̸'pwr$NO>5nMNJA8$i<#M3lX~ts$"%@GM LfuEhVe=3%4y`&j莛]*zphrʏroF&ʺ.k zKqz?Ǟ-aVfx&]guȮuLZ4'G _D %=׫5wZDϵ4^g֗:3ysfڳW!3m2o3ds6-Z9 h= o{ϓZ iG_u:O@.2h9m4v4Z\XٸD/_'w\ci3oA mN\կjLծ]CL*d(Wߙw.d3fY둀³Z1t={ 9r@Oo^z8f \_~|QnSSѧgj|J2SU!ͥ=Rq>]96&[]h;t;7ڭuyrWh?=ר'R"9bGtonEC ~DP9.-g6haf335:ʏx ˪k.+'և-ogEM(~^̬4GN\Gn̫u3T\ ~pOFh1Ng = A^ “&\IZEY?5rDz'<6f`%vR06ѐ0/'{7?Xܥlwa,3?nGj)I-zV)4̓0kQ3kČ-sTML*1Ԑ2%3;%Zp(r&V%-!gv; $-+].U?;cm!2>ʨւ6"?Ivrv,Ni,D֫$Y0Dظ,KVev aMsT FB`(ٝH`G1?q9MqfHs?I{8IX5|v7믬~{ߟr-_>62VOD}+3b0@}⮕ %~_\(;ՙ,.D*:G9XvI[CjyߑUH CXfA>Y-[;9;v&#+3է)2ZUw[=Dji%B*+(|%gWC水U3>y1S3s$HOI9v|: +'sƳԯnw2=Qwspaڀ?8y7;,9g`2[+/8%Zw-QrvYE_rpșKaҨuu ra. j+jNZzљ2&ܧ .XN˄Ac-ns@XmZеt;>'L3)jg;fI(j B7Ynf~#Bq~xjzAAc,%%_}(ڝ1b(p];% ;f'"af!aY ]F)j]// Z9< dF*$çqdmơ"#G+CiS;?Q 2fbbD(~4"b Ifg8,9`&I8#Gc-GEu ̨h!.dz(v]%"M"m2rb7!9Hq 3܆*LPR\c_G?'Z69I?@C /Xh3pQpL̴M%&u';dL;t_9/GOM mik)U3|  ԢW51j:X*땤Z \8)JvkI.#e*:3u5o+kl/͂-BkpX~uY˟U} OZC򫉋aO#L) /5CK ې>q" U?vkNT>olb9qD`JZ14}%f4obm s E g@Y\X[\Bh-`b<@Z wH7C'v 8nJգDaK%OáqCR&Hj no@;k7>ljۻ0In6jo?|1 ,fU-nSRB T5e@xc8`:z,ūŝ$9 "$kfHRּ5!6fRׂ#30dB&L`*(^`9n"~~_Tqv4C{&GU8q%Շڙa! &#ŋcԔ's0zdNH!l*'t0@)սg}9I6_`UR^W,NEegWC\{C+xBIŸdgxQBKb`u^-QO|BU3@C=ƶ'gdps)\)w~ϯ4̺]~6<{M_Z(zsFvm: ~[h^N M5&j/\ԂCu9{sP&昳SX` ?55_T:''LP>Nj ҮWTì6ι6^SoMj\ϝ,~(ƻL߳[suEF 9bam"fFv`M,v~fon v$hH_~׾d+>Ϳg?Ư~w}ĜH@DiIr-e:8Md4U$e3Vá侒efjjM9QK5&W;yb.U'ީ"̑00jC2"Vp,pCēKzTwP"c`  Xg *fI"^$jL459 nß?ώ>wo/#[,|ED`ܺ4MŇ,T3A&zWo-$,Nc_bu  3U@UuQӏ_!3M}j~~>,Յ?SG3]kk䊅Rh@kۣ.@t,&ACn ;v. Wv Hmrl֗T=gwIWw5)\W׉Ӏ湽E GuSkgU@sf{~kVȜԚ/+DgOH]H[4VD0^EtzTs\Q- 9v6۽iݩm"Pz5s٧2B`bAN4/c(\;,=`` r'!}~,ۖ# IMD~}=~^g?};ܡb0Z])$, s$NJHj V!R'u $ U@fY,) ~D3,eIM=Lj 2 e~cNPHv6 C?jDpW/IqBDE/ո< ^(=Uui=n(j!ȓ lAݵ(% W@Fu /_A~uV DRjNtLݫ?or* q:N\]wvRu+@d TQ[*FZfZr8$?W7Aς4@dӊ:u"ú%!3LK*3Fv*-znsswU?fS3mi}[]} lOU˖ ,>8\&Ku Uj;E~nKėy:v2Ǽ뜯☫,`Zϳ/N0<6;g5ߟĸ u=ԗ/֞DX7fshHQ`}PoQɫÝ|2@0z-2&R?_$w~²pⱚ= DwըO?+U,:[JIHDD8Vد K"lVۇ@JLj;00t;<gWMޫc[_ݥDoUo<}×_o7_>Gc=|W?*`KBCX(N&C2}y1MZM]+HE R}`L7C&u8ڱe-Z,}L嘘nWmTB0N*~r!g!ljڨӣSd*,Ȅ&g%y{zrFL$$1J(Ҳ“,A&-~,[E-KSD=J"Eb"@ <{sUuTݺgF^znPT}!/D<":]`azhwEuH 5 pD9Rm`! &Ld. B+5.ʆ|Ш*)#]M3*wP  p+/޶#--ӻyIZ<8;I6=R'KZ/zʫw<=֟/[ʭ\(*UȒ Q___U]N^9cڲCI5Ȟ>㖨;ćL)tV`T2^LcQ.!n(VjKt+Cu dpUZUm{c&UM-)D_YάeLa9]j˜HXx罐B/vJ\*RD䵧+ėY0 X &Fq!=D:aJl1Zc(2c[t>bi+BNӯ˵-I*D5xU Aj)xDW0VAjɘo|@5QH9S0•!D^P'm۴7nuB7 Orԟ~ꉥNW|'N8|ž BCF딞+FcsF&E o4Tu5WI g)]zYfb 0[@ QLu%e k]_ӄ U&Fecx7pЈh=Tq1!R&H`]*\Z*qߨWtU*edG>KdZu`O([Ba N06UrtOQUk^i^^ 6zpq!y͝fNJ (e2'p3b@E!:s+,tJ s+*طp2)VseѣPOۺm˅_p؁,\=lm|ߧ|aqo{ZhtOtu`V AEUrQ+RKܶu+9sPa\N)\(+kh$0w52^ ^>!y"[Pu"B&-F&y 4 rYW=vO%:/np[WSePR'=T{`}EsnZ? EC#%k =z5 >\=3VF5߼jT=wNk'_t= 0s"~8އѓQT o;10 >t5ȫg^,xK,ؠaZN~y7aE}Z[E:pT#̊7T)x(DRiS.1F :Ƴ~GOSR/RO5HDTE=hmxM{8DSp9Jt"+ԥXL]Bym%$ѯ+fuaCbWubJ- ɔcfvtl;Ic3/yk[׿Kq\k'60Yp! 64H32,C/BbBX%hix2-m:4I9-i(!M!@ETy myTi:[׉P( rr `!a)B!n!^u/ iӼ뭯Ƚ[zϾ冷_'c@W}#5$kNgM,:+!!ĐeDa:D U<^R1GMR_ #ufuh}aq;%>6`zҨQ_'SnD9Oc\:ϭEjpxC߼Bj(a/`&~*Jk1"Tl%nV WSēRZqYV<R٤ kڽ\aJmR[:*V;"c%Xp N _`&)MD2ZXB”ΜnJږ1w* )]^zS'n.j+Vîv_r'>sBgn}GڔB0 ҩ)r )TA͆5NBbn){1LZ1)dn"?b(ihob!ӖlZ2d]p(rM*,SbHA^5%P,A!aX@<p)?G4bWQL&I[~0|'}oIRndHN!]M-M5LeRRB&z^X*aI B%PĿKֹƾ=- ,NuԾ98?oBjyChvt7_Xé_1TYY.p5$Q/5lj[Ӱ,Ik:N"'׏!8&eFѾ48 3%K(4N#Uυ-1BխsCX6n(5^gOF jNlag.VxF)\H ~;_7xb!]پGH(5&K%\zu3*G~ ȝxy-EoRk<:'^;=KoB DP0%+?nC0l ok'L7ސf ['S6L&65ؘ>r+U/Wnָz;3-S] _~8votnh&!L7 %%e)+p1+Y1l y8"XCK ]Hrn&6½ +j*% "TBQ'в<"U$JW2Bƾpqe̋1lXN5L,fD C2_`BhE Uԋ0e`KY‹Ջ1˵ȤpTޣp=īCEi%4:tC0 s󎂧px/1w;_xԡN??/6Kk=%WMwquyo#;^+4jfupwi7L5uG|o*=ʸC#ARUu]vCP/Յ8^UYְAZu +Qo#-Sh#jsEYmϳ%ZC9#tg,υ+344,0*g@%*u UAM0;KM_kGy깚so\cRz%4LYhYhZFA=%TfTnZk)h!b. t ~㟜Du*N\:;n)ewt!􆙃8էxM&WN.=Y[>CX>8}u^\8ꏝ>u4X3GfVr TC{%/G'w [AH==m&A3$Nt5wyV2 J H̰L04$W RF+EQQ-@ E@ z_9!tJ(1h'pJ,^fe>8 .EK$%LX0gh|M2ol5;uth'LP!ky"VQZbW` 43MXURར ,c>ooSv>c7\s;4=wҝ[?t!e滟X?{>D7*e^tE.I z#! 5^(}A`@*-` 0M^Y^9Aʥa T;z7t_{FC>0Kkz* Pت1h+/36FrfE5N5ȏ)Ȯ˝a-xv!}h: ߆p$a'uZ0][3nXuAQAx5gMHױżV5OX+B,`(ZOju 2GLzc{XDURNMevNtBsPlN_{9ptj曮lǟ~wN?}=k8z|ɧ|ٕݕ.xeIqh|{me\ eNL(͆1d]U)$LP&J T*5&&*r򅄦\<c*%KNdE M('Øn'Z̴+5 rAׁb*bBBxCT'jM4{"İCxHL S7\{CQp1PaHقmEsE4@Zz-ܲF36N d5… RMm <Ưt:Q70ULQUk\kb϶DvL3Y{w׼G?xΗ_+'VGN?^z9,_/rsF.4N+>t$_| v?%]]X֛/ܴ{Gəbƭ-[q NaRDuUa9߬f@P* ˎz,hZp%6p͎Į}Uab/*/+סXz5yc>i0acSֵ#2: )ƚg>f_o[D B"K{H5zfsaDR+ǵ />YdI--K*]0S&jZb(>=^8lhriM NΑgҒV88qUR Sb2M7mӲa TgsnmP앚!BnT`&/ȝZ7 4Vʷxի/kG?vW?1ꈹ-5=3oyyj˟BqZg篹z1*J6-'V8L΋W!"5%eNMrWrI-mjYꤤĆU{ h4L596"+ &0EuFhNxtk W%L%\D CdNFw]rxűr4ӄi@Y<{diq8f2QQSdȋ0QRR;A @Ll5аD^Cjđ"y(Edjѝx #MC+<BNw-i.i7~=mJ:z?ujK}%42gs_?og7ϊ(1h]\ߘ0Qm[QjcS&]E/{\0P0a*u %Bb|D&8XyQ;L34lT\+`}W]^p#Hv~𣞣:8] '~G?kqK Mײ-Em3mVzQ)aV@ Y J`ҿ #`yAh-ѫzgaYn_ ׾`Z|Y9 @&D@MK)!+64x5\ံAR hb.@˧/w;zN~+SVOc)M7{6-o/7+Ntg;>prRH* (TW]0&Z'fOȎInlO-M&QlL)T]"* ɔ҆F}.._d>Rp-0J&'hX4 ,+{LD%,;:Zb6XU* T5>b2z WE90F_W _#Qq C{#ISckHUU^5vC 3BF1^r'ʀ51Ft4-Cp-jͪjĞ orOuNMlʷz{WKws%?2^g͝גW{=p^"/]5mվa6kqIDpE߽DӦP%a ]FT_G($dO ~O&Ll8y\ uA7F#)9? XDʾ4KW.ǁqGtx(_E0|9Btt$h}o w J =׍\VWe]gDqZFH/:uF B/A0VI$c Ga+=q G@1}^D$p6ES p[L5,mJV3 #h,ΘHݯ{<'.;<yL+=~owto֟럿/x/⹹# wX6ʢB6U$'SNi"1]БU+ H-v.su+ܩ1{b#,庐:`ŪӀOB_jH_ !1pUqUC@DC}q V}](`ŖvEjNR T(аvTt gD]eo,,5*{&EfŎU0aæD BbX*J S3aRkQtap安;w>~ٽeצG4W86Moo˷\8tDnKk7_wxus|ޱccK"gC'|W4;̠2\ᡆe!sS'jt Ԩu>fdS[v9E- xgSA'j9T"bDO‘-ֺ B]nQ;8VvEIBCz_;U3b-!*D4FڙI:q5/.6NM⦴1+/.zݠ ը>>DDI%)m2K32ްhXJ%5/mkfU^o{Wy=_~Bȉ\_z_|w>uWpxNoe?vNrx677_8 2BPw5[t.RBC Q"^ ԲDC tB@ #1-4#4 ° !ʹ &)rA)D,ڃi#av Azx^2P 98a#FA5I  mYHX@e^e:cu{WѬЕ'ZJa8ePev2 &r^ƈWTz*D2kejF,LWػ}Woqߦ8qxþox|e'6mHP̿u/=ye:b륗H@7kQDi%F9&ZClxuH ׽2{0@ʷ~Dx P 7CO \o^:]ņDjHH$RkFjۉ} lpkz〴9l]Ћ#ҒV>YhV C٪6!6/ƭ%%X>n3霎' ?p)xSuRȔQAk{ A* A0'_ȑm{/0b_rnc_ٹmg[:)Sc˫j;9oDbvoz[g6NǏwO/ub5 )r9дD]ͽ22QRlLH! (DPb9xz:РS^H I0BO,tΊ=}NDs,sKCc]B! X'@( ! }<0&`/\@LG)IYX K\~E ]΋2S<Ġia +2Mih|~(\+Vw>$fc^ 5C?\㈮9A ~hWklغ|b߱ќ>xjEW_Ot/t׫oy?y]8L6ؾa?rcO.oǖ7mxm~⸙ ;rZhk YbƖ"RݞJ\f'=G ʟ)4X*S˦*K5lN1S0H'~1{;$nqL˔Zj$qFj)wIϞ*)+uLc|Ί_ԡi}=fL3ٙMT_}"sr׵k$A^r0Qb!1|XFل?),= E0f\A?g?C|_.FsgZ:!+5`Lwo$u6Yg5T>Ik7=ՕƁR<@zNkW+B*XQKyR?cgMA+cS.3z '>ҝ9Y4L_ڟ}V0K=O?]:񜤇Ktֶ6]0gٯ=x /K}l|xQ1 뼪jÐ1h @P&%0$J^&l9E@lHD;i#儣^*R/36XGV@̢?,GF/ꅔby1MuF 6 c"\+6(q$BNmdcS`-7("21l+ FB6M@Kۣ&G7Wzj2:slG[ Ra14@'UR9o[[iro)hVuu jZQ*>hَGyQ2їWaIɄqݑ@UZ _oj++С?6JA-S=߰DlPx,F+|{-D)#(U*],F #ɴֱTOUt0)l˿\TսQ'is?fk E%5֎Yi(7ʘ Q(l- !Ȫ޾M#w Ϩh,((ʵPu!LCRCN`2:EC֒Йl!Ȃ\'PkXmG*5Bǧ4,D[yy4,5,H#.}SX-%xf[fȤ %ī\ % Kra(2'h% T-PrT% X.l75Zp2(ArRv 4,(5Wc(%dh\cɡ # cV>=IEa в^`sU`"@E+wM\y]$]nsirٕݏw /;6'?O͹7껴m|={?}ltO?$F a\7}b%傾v˞ERY0L&oyс1(S#mue(}4szݰ9Q =tAp!N(;S@5Y깁KٸS`U!rGW-UmTa=G{,TC5,]\oCPΜE4*m\0 kR\s"l2%LyJ2:vll =yګ.xɅ;n:z[o쁯|| >{A3wgoMnio޸}[V*:lk>YX'Eaf5֐1b+BsajYt=&䕔a%$Zx-հd D}pSXFdGKeZ[%+lc*ڄ2V xA;BN&3-yե<*ֵg Aba(q6*Q .`:!-]ms/ &UMP a 'h#%&Ld^@!Z|6IԋwE@,Gժ D, X5lWܻ3F/~v Wo߾ukkǎ`uo?| ~廿!Evl?k6=z͛mNR<0"hM-5LzquK $яFZ `7UѾ7ʿ*탻GRV$i< H+-w]LB_ݼsYLѓx>1bPEcb~Cù&WvSS]y5|ˀ aʁ%pѩ5R-lhBEDW3SHXϮ‡ 1wXJD))J'ed]__e;7.G_~xm}#xɵyMXJ =ۛ7}ˮ/xZsK)~䑙_ISY/ g+JOps9atcO-JƖ!)\^=<ѩL:X.%\ӆ;X ! ]jPtI-K2jAʪBKt BKQh!`ʖK13lHTEH50&)(edWQJM WQĠvk+s)2A`B1`Z< fR,b Wس~K_|z荗mʣs_}K?/uG>De9+.1qx"vŗ< /[ Fs\3!(hYO+/Nu;q(i*5>-|udjA G $&2D(yuY'vO<}O?wmI!%n_Sl޶}~_u>_˧:l^sa"xjurzUl‹X)De+jq[S6̱XC#+t%i}pz}/("1h&.x+,*`4.j(#?qgN&s_7_/\/=ѹ>v_;ZS߷gn阁?r<;=;Z6ι\&m5rBb%b^(hZ$H4e(QeciX"0LXp.X,DnI0N%B CNy5L"T:HK1Dwä,D@™h 1y) - sT}j8AN5)D (F+2VD+JXB`GM>ȯ` (xy!F&(DUBӨcc\8)<ӍN??:ahvy#{75BUmpW6ؿ;;_ ݏ Hdojm0?T憏a6U_ Fajhctxs3teoJ~%TXD u;(Ro$kZׅobqN_dߑ#Y`@_,W5r xs8B L3Xwe:R?^z("S`d 5dc N Nr.G;0J9LFx֟gb e2 _9B c=4x"zjկ"Wr =x{65~W‡̞^<ӧ]捷_{|>vu7]xg:Nn)5+4+6MkY!&/D1H,N5hXY0Fb`L RTm-QNLAɗ9BHSC92aDOͥQ״h'h%hZ80Tz~Qph{ ! RkDXD ZsBA-0B!/V(<׾v?ҊZŐ#!Aޞ0pWfy{[`4k EW K_aJ 8:iD5 J]uqBy$d<%I-{ 5C%2jT]QlGe]QL03mS*ei"VBSܶ-#zOS׿E6mĩտ{{nْ>~Ą^ibuo ݥ[X<$8v4{\bizI+s BDWK `Bf Huv-岒xm$Ĵ\rN##-Q!) %d.X-Ě]0#0B| 2@ ch)2Ql#-V!OѰIJ1eCbx"%KLbgޞ2NEɉ^<`voܑ:DNUI1kdAuqT5U*!aBL8M%\{rV[M#w~#?7x|b!O [vM=GVm6םsw1t}fTegF‚s9<&Q#TUUuFH+g 4ŲE 8Fy_~{5x=։C׺- z" DQ AwU6*RTj*W囍zS_í1@@J"Te– cK20dUxцMr;R_{j} ϻb[¹?xׇzW_ /񼯜ܱv/c_9//!MWN rID+ i W8dt DJ!- P -(BE2bp$$3 \`z2,T, 6 \(d:N}"@ZQ_ "h0pUA@ ^2Z6AEUnXjŇ^mMVVzbdu1"`HUHh5% _gg+Wlڸ'<9 wy/fsMC':{Mme;Xjw]VVT #qӺPz&~{Pƀ9uҪob8LxFg=_BDkE㘰Xj?+*,OsXHD ;]kߵ4<X׀ X"DE@\Cj]1QA_ڠ\ڿib J?eHL^ZJ mmW&RDCY+itH r-k&2C÷r?y/vƇ?y_ݷ!ݹsCd]tqcĉҪzrW>wjLii (r_>ym$lEF̄) I дh.uʰYܫ5dq^+;a"Fs|(e8<(b. Ej!F9- 4-40_0U._Đr!$/U3Lqޛڒak}{Wsf7,Iˊ8-V @F@'  Τ ,D$a(Ȓ(Q)3fw{Ω{W:wxSn-<ﻧN{eU 0 Zq3vablB8^쥳_fO_N ?Ø~[wug?paj|DANE+yס'}y/=׹7hئÈ)5 ]5`/E,9a06zx:qWטh\^폸;?Iq]` "qlU|06>ha-mͅZgc$O:O@ֽV1n& v_z{cn?kg7_~O&{Y?w>n틯;=, Rڦ&]K{~Ewm{px:*xawPxAHe 08 X-Í=[,=7(`pa?Kr.e^EF.a W}ߓA>4 ph;1RūrT2t i $k2Op?O ?bNUW?5nboٸ<1eQj>O% Y%phVJpgcV|:jf+v >軌jVSk4sV{*9+]Yh݅CpoSO[g/{ՓDu;|6@"jxsim6rՀDt͍3w~7n߼?"³˟~⇟}7V Mg `46P 2-6I!!08:PgqAbp{mLV489C P&ڈmƦY_oz.m26BM֦VP3*2G#4x BSk"迗Zc.Uݻғޕ\F3`Ps/vJz(aDj]s+1^pc:mW7&mr8mw֥.iǾ_Hwݟ/p{e?SG}{^|qwՓSYuĹqFہ\WBssyiUx< \AqWt՜,ͶzGǦi}2~~aʈN] ~_nG1x)zoB]:nԫdnN )} vOS'g% VcV%Wۇ}yYeQee4dznI#;) {[3WO&IRvZk#oQ͞ec]o\^;Nٷ/k#O}_gbK??'wߵZ+9.t9I]I~* mnлN;_e9TqD,` '7#omƙ^=IMv: o=L#E6k+@XDF{mӋ ̵/DZ)p}EwWpW!KٽXk1ڸ+7,MR CPKFZIݙ-J``CJ# n) I@5ӻ`f묶uUd/LV4?1~hFEqܨRaV!)ʭqVe!.Z>>%vjX:I0w3Πn|)b/x.UHM򦹤]zHcX|_t6U̱Z Ǎ\wڝӏ 9[?sG^g_sޝ7Y=#76-~>|U |_y`,F}WƓAwrGv⤓X:4њqjo-& ~@\ɤ65t K`nT8 8Z`](*`Ȏˈ&H3)ҔDD'yEDV b@H>j^&"͂1K$0deaHÐ1r9"Ü"g4,bս٘ZiչϯV%cռgGM22o֗ 2{~k>QsycEk@ZPǽFZc.Fc_~Sh{y`b*&T'ߦ2r^]o""J) eFnhmZ5[hnR&ZŒƪ.~,,AjRK4KĨHlMCy,Ae`3h+r6h3h&N01lS+?^ſ?~go}o{_JXWw>{>n(e8e }u58\‰y8xZY> C0YɫR06D,.}Mm l"X Q6#  !G砡SfHV+PS hiH2pya?w)H}4nrvGKpː#@$(|I68DFIhX2"rB5kM&ś4VZoll1&_ Ţ6 \ʙ߻wԶÿOnx^W0NERy&]s &`XcaGW})J쯷u$h0 YYYhYjL.FQD;9ǁy>< 3y 1F_äNi"PVxMJօEU#bXZV-ދapw MKBk9\.Boవ|?{_*ovy=)M?V ۈ!)g0x{;?IV,2p:y*26Y'GA[X8jYYw׳ǁ-ZYf6C‚X Hi 䌣a  Q^U԰:/4@d`?E@dW %QBc,}6Ԫ=K6|c`p/^\z@$;ykM*]l6R5-z4yy<&aI7@<*fn(ym.y 9Lˤ2[/!{/^?4p.{YG! )6 ը2߼ \>|*SSv3Wzj"`جccQ4Y\_XFN~Hv4jvXi.c , ־ 9ƅ!% s_tHє-h̊w8^7μ`Bvlo@gEg,r<"^?I9j(^'<{1WyWG,-,9;< fvwӿQ{ ANX1r%@$ظ"gSuczI ِr}MZ}NF, 댳M2Gd[-hrUoզl]6)K(q4i2إ`Tr*B.w!dC6 f0gmiƕ=ZvtI]v3ƚd28,IPă:9&9jTI.|pkZ+âQkX>peW䷿v}Kʭ˳;[JW9Y\FwU&F1@mʀ[S0?tqu1Aߔm`= b3~[Fz4N}{vhƕe0g*cYdo)–l|)ᤷBw|x3JKʶOjIF\iZ񊎭 賗RHHg=1Ip\ppM Y8D(+lBw:۷ɯ}!|_|w;33^d>H.@ \ܭW ^S,\i$Q[Y]kYq'$i4Snݧ[<9 san}f3|Wn+]²fSVǷڌ%T*1pI;`BOc\MZ^rҾH]s{-26|:ߕoC=}o-#\m>8T\|qeծL Ɓ?PS]ͥRIkiyP_.#_H™y+gM3]1||_~NxDLJYץ~#hKK2KYW^[%L9}B U;fF\,ȯ߬;1.M16zn={ɏwOn6.o%-us@@xu>&居m.c@lK0b α.Z#挳rAlm gn0iTan@ΈA: #kI dF֪X{;lR;2& FI2ZИ(9*ViY|qC"%Pb$H]f@ R+i)s87O } DDDPF`x׷o}/2|qf+ CXg{rH'#}ByŦjR"U^ӕ1(O/gJ`Ԥ'k<_Yxm>(~ ѴjB9x׶@dF,C1T׀3 ;ʰ \Fơ]au˾ lӨVH>%!J"F Q{DvfqYo7z $!4Y}D`ղI\q$#ˀED6= 8hpfpEv3,h(t$NmhlC1tOyzԿSpK'yW1 9{ 6 Y Zcq2vX}G5 Ӿ@_-oD[Dn9Z0s/0F  cHU˷8taUӻ44<{tEAr!m+v)4b\ EZ َy# "Z>lG1GӱEcrپ̽ulZ?x[6ex*w>(ߎ㢏D?#=nxstey1FS`hB%Ә]KJ)RަeJ;TZ_ ,ڗɧ<3Xhvef5K*)kn+*g:7w)drnjJa9P:% eKpCRcϬxrʸZٽFC[m,!vkɽޗ/fftv6[UN%ڙ׽A9rAco}p#={)b0w$Q&P hلzȎE! YM!KYp@ XX-hBCci^2RP!:y$zb>8ɐ 4 K\]h ޽TB#j#kҪ.CpY~VnzId5ͲpeU@!!cgqV=LttNE-}&fA#D<Ҁj_4\~p\Yu'}Y8/᱆"Vr̀a$6׈GAWNoWCoBvjxq^Xq Q>zu䧧t^o?$.Րҗe},X@ڵUv2繷;ʓZ󍄗Z^iø8< 3Ѩ/ʮ;;|T=t)JWf,DHMa\JIpkɥ [b3Acf˓ap|S4|-Bhtw"=YoMq8\4ק>.RC >MB\1 lr"A="yx8D} "%U~j]m.=?Q޼ǭ>Dxy]yA'{3_L!eم_|;/>>lGC5ϢӣGX|sve D4y׵XhEPeV>2[ΰ70=Ô~oa4Wn0Rt礸9 Lf] {t~ d@Q ;x =%0Z HU~9$MY'vI9ycBW5/hX6àB" {!L 2Ά`h#GeFgYcŹ"0 y?  q^;g|ҫJq-Ղ %ӤdƖpst4LB ,,08`X ,YX"8M\ h80аMJ`-(3u*c7 ![f垕j=Zp卅6AW VbXJmj)Icr׶b۷VnصAU|)geb5{ \e]/}m}9DI !cSQD.PJWģ;ϝ d`6M`ŰӘWUU5([. N./4{n1YugYثSkN{YM- ߌ۹N6BFW x!x}6BB(Dž4H#>#cj[4,C4+fNScW\nK\.!%75Մb.61ak-ml2E_~w>E!Sx-׃b-RiRN0c 8sp+w4tm,wˆ{4aiX H2rt%qlIf&p(FwB]ְȇ@k zנSPF3#F%h*C !*"rؤvo̊=a1!')h=oՅgZL|QirVqcW}}}ZYK-`[aR(a-fӉ43#2] tl_b~^cJf-BxR5cn%^73sOLj^<2LwIU>zG@6-tȫ $&t "Q~bzua:oQ+϶@" d \ ( ,M@ 02em7220rA\6V3= z[/ "p09@ߨlZrk3b4 DC5\`#%Z6`E'4UfX.L&g2Hy0z@Ša?{8l*+5bXa@XZ luifHU%&dȥ1pe&䪽d,K cL@#4y"jOC/JbAt^ h"`BF`ٓto%UiLp8&̑SrL`WthQH&$)M2V>LXǔO͂{0xΫ5l}}@VyN%J@(CjѮbĈ&p}m'SkUuo> y xq/[~r1"G~ŢHWZn맣A@+Ö}6/be2]@1d$7tpa7yp#gd/#r&%X,2 %ĶG@YXY1Ve3|m"ܾv1 M(1D6&`Xj1t   h PKgѹҘ\.0˹wBgE3:2Yzh\}`99gEآ`@XpnUz* 0gI53+jt3g4 `l<Q㛷4ZLiOUWP;P,}B"C׆cbjʮ _Jg\,T|Dwv0*>Q._ 9x֒' ?IDr&on1%C />_*AWR8ѹ%>S>cyoNf|ae@\33Sbߌ.e^)21hxq&"kGk[!ZXvm~Кqߟ-[ō^f\E}m܋ tCah!u hEmзXDxlf|^>I::ڈ~`r7,}kr0fg}6#6vb\Ȥ Bw2 z[U=^:{޽6jE2T  5 qҽWJX28O94aD+9 .4@͢YcL)"+~z)L_VDr[X\641R̝~!YgJ(r"qAS8H6H>Nj%5?N1dWqQ^Ohn#r;҄Wf1`{]osXyIwÈ4 e # /7'ŷ0;4npK8J9}^#uv*FK,Dò!oz2gۼlrكHҨ`c BSQ8aK7>Bk`'݀U"F905|Jgn6.C""6V- 4# W Ɛ!/;`5nPUȦR\NFU?J8rҋ>k Jũ47\>XycKF,㪀*v~K:.t{;T E"xJ+Fbst]!tiq{;._d48vBNo]ԉt.,h_\5,F|.9Ar'}.Z+H>h={g{\Of”9q*e}uw!7|+[XLw+n̔a/O3BV4WNᰡۀ$Gk!aN!h!$5dd! % Zs̀a(FdaN` ܳ 780HGƊ AS!œDv/I<bԼuPHvCPU!V"͉j@yꒌ1!D+w6j Ch јBzU`)i*8#kKFS!W! &tέmť`fVj'HLk6r}U. ed0ʀ}@æbeTEbM>u* a [K#DeWH2ee4ɝfdTw CUOvD!Ads_lD#E@NPFkVMTR,T)wLZ߬>g~Wz(WDNCD_hvjg At{2UBYB<}4R,-_.+6}.c}v+Oǐǀh1dMZ4.k<ږJ{!Wio+޾G'= k`I>ceF`1`z|iv~ُ؍#:q٧Kxc\ɰRuG!m;F}Ʀ/NU@>{h,ia \\5xfel>xIy+e/g6?]rB2PԒuԐ꩞%q#F^wW7!iB YсWL4XVX6ȫ;x4,bx0Ԩc.;1f]R`!QMRr4dB@z![3@$14BW16Wr#)%)2s ,1pDr\% *ҥX5v& &l2 XEk}g+ !ƊHVa40eHD09b(e9QҳKL_16"#9l1!-'i XNm'/iP ?]K~\l]9>P^ZnJ'PuaOoS ͉bzS FR.Mi~~:%(9nb.uEs`]VK6fw7ᨵ|M;IITcXw z[so2 JmrgEKݓ'qliF ALhPGv"rFvI]BÆ$C,fIs>z y}`Vޑg؈GRakjjԋEԔ@rAXN;1%TzfR fF^(bPMY-5HȽH+xǖ uvNsc۠XJ3\Ew@r7,~97~` &{JsoL\+z곗sۊ0dT2;|* Ğwk%+n :M vySG:hfJ7c˜Pݗ'Vةfl-4^"=5WW٫>i5{t]o \zĹHLޏE=-U}jl.qO*OJƟ ]{ۮ KT"0od:I-6;~c p`m/mq7= ĦYn~H{ cVot!6~.\5|zA6|wӄ& vm3HGߵ$~ohXF$mNxg;l=#q;Za3>}kW^ww\d$EpIYč/#oN26 ϯl_~c('<೰{0[]Ǚ@ Z1k 뽟 *$8͐Zh`}c mta#!c0fnfGvJ07PN`fŎDE0M1FI'e2*Gs=-h C, Srd92 1/S% <ͻru7zgUb`ijцq/L:a?t_o˜I \pwCh ]]oK\<{*8hox{,*N8,!`/1JjlJTAֻܽ)`+ZX\gVf{ݵj9$m'2ruu=Dxk!a~}pٹ[5!ш>uVaraٗ Yxԋn#=U#nހ@{!{)A.O%ˀeS{Z]C1̬9`rV0d0 EX⏥M@3dUFQH*S\ ̱it/dipYiݰKFr˻ RcPFP龶G 9:S+b-(shuM X"wT-h7O"g~/o21zrc ANPK2N$?lN|g+[r싙z;/ʛh*uۂ*JB eJSvR*pdѷIIPD+w_3Y9|u]]Q 0ZKݥQxUzT]]o,~uVe4böh2;I"l$e`kiHh#< :s7(1Pe26: XQV` !пmD]!h]\y6b ,ɳykЀ'W.4(˺8eP4v@*^9|qR#$lH/>s"`!Ҕ=wIȮE1іgd`ve9c\&W0eՉ |7RҚZf3l1m\NQ+T *2!”FCd!y )j%'8u )!T=2jůQ l` [_^KjBTTko=/auזbXBU}V P'"+mjBDc-u^T*J!34[owх)rXJ/J.;q^LKn̰mĚeP`)Tx0-:p}>AT֏%Y)-R̖1[ƕ.Meb "Z`U@!PRBUeJ@.Ƶҩ͏J9  1+7&tr&Wz$tDg8D{DXcH)WU~`K`26y(VackKh;1ir[ڵidsB'DhX!PWqkD\sya%J\0Fj*|ye1r) bI-zQŪ)z}+nuP5 lVY *46:j/!tEd:%vq~O7ʂN(PvFU z򭤯a?;)' oR Z886R5 JY jB@Haۤj x% ҔZFAf8"'Kib@1'E!Hِ*I}Jpd&Sy dJ 9Ȉ#cmBZ a<  UrR03R SW'p^aEd;> SHUqWhDTפaǺB 2˖)wZziԑWMݻFvn^]iXrW6 !8i"%x@,;%, QI535CML2Tw 8@a_?&&+ky@W lH}'ӪKsE1*g #kz N Ӭ)UF\+vw8N ^/kR) Uߒl:'fՀՓ`x垯U3TU<:CQR6ee2 WMmv!$d L-0m^GPJ&WKJjO,6th%OxB3ˮPX5(Y(]r2&tlta2^NblHY-ҩ6->MxCǪb9ws9lLQx b`4X|ȣH$}j*d` Q)c&dqeꫀK;0khn*;Pe(#^&H93*68K`T4kݚ&z'5F ê2R\^J;aѐ8}YR_:erUoZՄD^VuwTyh{ J *Z;%S];h:cyUADYComK9(@ Z0r`B**!K8+Fc5]ϲa_m1l[JDI ׌8/ 탛I/4\Nj` \0q{6cri2|o|7bmtc)3S}XvyWH*EJ " *:$ࠢ%IrB)1h^s='1LR cK:\{s:e1g{N')=/˱ ):Ŧwg_MpO-i5c s?X'muX^hP"M8Kh/}Aە !5/eQ!D5`Wk! :R d* }avtAaJEBP E(X?Pyb2l{-醇e!ED1YT,*ޗ^Da jOXfːpV}0,%SPN$BJ՚hʜ0(Rg aJ(!K`>!¹\z|g~^hd@nbƘZ_"s/ѭQ-{-2M-jkY6M|"bZ/z&  QS"Cid3'wO-)Y7ӥ=/N eIeU{(_c%J Fc3wؐedA߉NI-%J]vSd 1:adq EU@P% *@1D)SX&m$L6`&>C6 ʁ5 k}phW]qaUqeꡁb|¯.G̞jhKHX w^ Qj(מwVJ06yٷc /9<6l?wܼ+=z[hdc3ܡ RNK)Y<ȢYa 5oTS> aЭ/@bT/{ uuRa_RaVK*:| d5J$4g_~,L/D1k}sWXbXJhz_yqC6ï_ WG`&A@jyz J3*lzB N*U`T9cJ-%s `,#x˄7XtK};/޻grӡ޿5{޸?>[j.ΏӋyy79foKSC^Fl'KGLX/ĢLNIaceBQeѱ2UPj( t2NM 4,K5CؤkUӥ;xqQ .pz$MpZWR(x (yQC!ql\1l ~! UCjUyd5;}DZĖ4^Ƿ X9+m86/F/$:p/|{7Qc^c J@5g4R@g+IF(e<6SJ ˹Ͻdx2^- W?/*MNLӟz-fwm_hR+(f 5 RP>4!aJ & (=%CҋEx d~ QxURXP`a HBx"dزWϨmT|SXGd eQh`- g#$@2#;E6,*>hl.v2f [cШzjO%Rd)@AD 2sQ'xX,KteO{l|hᒻټC~+p趱 ?}SC&DVI STH +"3pp㌇kRL@*ɀ N 3H YBY-GpHT5sFg5[կg 6s-)e_Q'1*(C,1B\aJLȷUxxLjU7@@;OTEj8ծ,ǵSc}[Y#W(*;BCE5ЮVh1K`'Z{C-[ SK#ÿO|Mm(}Lۚ3jFZ42o~ӏ2o:vfl.۳w~DtT|'j (C.dLJ;,M8%?IhY %%FRFB (Re6XƨNJN JtR2yB9j.Q(jS=*D"5V@"b4Q`YZv 9ղ(^ DV6*L#h#5\:bCC`}EUaN+wP bnx *A;KɃOuOLO^z}['K7~vrfʫ+w_;[筗LNQ_DJp@*TX/3ΔZN f ֮Sk`h"dQoj˫ECz696/@֗)KH kW<4j)xVk(,Ƕr tǒLUQ 4{9\Ih)he-c||}?zݯu>lK^+؜̻_y3IJɉ]ݑ9CzFC[:4hG*,IywLy@by/D:Z3nZ`ht324 l_ eԌ%<#uhca-28Q,m([۰eV(}tpFbI4x |%^XtcOJD jzWZ|K(0#UVDW*p1ؐ1":e:T@mbEAh*BWJ^k{M':<9>r ww?+?#'o꓋[@?t;wt}Ws[Y\ a;̹hh~d*hв.y `Vֈ ߗ^Aơe@F .65Dk*_rCbl*/;WtmY{ȋ M_gVT4'Q6luOsruCO,8<S]W2(1L)-N-\R\_oG\q WO0(Öɱ׾|^v?Ęͽ׿薹+dYBQ:ד}0^XjP'0\ԓΗ(EQt{(( IUks 貽 WB4 Zh'(,W &8\Uv\UJJ`JTQI L!І0^'QC9'tiʈ1`c1 @4jW5 `+W۠\PHhR!J gtᯘ, 2@rJB O^ɁW_~{տ?7>tbw_.0,Ǫb \3K 5k]*pY,5qUm0+sp(UVB&aFeP}=ll\jTںp Am^ H϶W{6Ӛ|OZt-}~?KSOlL{tOtk/tcsy׼ld{Xk綉d(Y)e91$6բl'9-AqVzu z}Tf_^xQPlq zJ!/Z6uS2a@@\7'KܢR: Ѭ|2ʽi8DiuRf3C~υ3J+aW BR˲ĖY*g DN`[GN-Ru<[GB_ *ן3Ozﯿ}Ͻ ۲s WZ^ZSY8ҕNaѡ;}EzSʝb_%YqOLǖ;Fȝ̽eaǦ"tFҷߴ#?ΫoS7]1U>:L}/=;񢉡\q2d}Yp`U8=Bz~URCEe/Ï# +L)*5}j "}ڹ)1]ZWc}<On1hƍh|xZŇ5;dS[ *e$@+),CDb,82W+{^ K}=XZ*Rj}㍓w|{z͈{ߛ.6c#L}k-;`2s:17?v[7GO,% XX*{%AB3}=:uX(bK2P/@SQ岔J d 6$|$BYҋjj 2h'h1Ղ t RZL#I\}dG~':81 SXҠUd2URA_xB)N[?Mxym^!QA#SA(DU ĕ}Uд-@ FGTv'SϚٱNveQX\=WN_?~?qNK8{go[oضm9ӰN$0gᑄ]ewBf8a:kn8. 2$l8PJ/4V ᙁXKE+i܁#XAU@ilC[PY鹷L ׳t<e>^d\ui؁4:4/]Ak@֚ )3Բ;8ՠJ0AyNxr$7jzzǻo3S]W{G>yɟ?⯽y/7޲=ڹ]z챣vT>=5S)_bs,ѩe-mC Y= /j B703pЃU70D *VLD+=,;ףP 52A?Nȅ^4WFK+dzUv4LQԘ$$vQE!AK&]3e-՛KP㧡Z,UK^-71f7{ rlٝ|eL_6fJCs'RUKw雯h`#|uW3^Mʊ (XT\9rWI2T)!J|ɏX5L(_kbi8:D Re$`ggd7cQ:K*>׹bJQt,js2Cet1Jp1좠hc]vRzd498PAc_w+;qx37^u߁/bȓ'['>R&S3soy宏}&:4$|lťTTx!``mNS%lH)KWFw@Y%* ܨjscqU?X x$!cI,g/" 8pAUy䅔^aCpHE}Tך\ݼ9JQ(,6t# z<0U<dCB_}B  =!T bVG-p9Ȍ$,@艫=07$G]gҴ+Ez̸/?wrzZ:6[WRᶍM(7\q y|׾̂O-RgXfz DWT)+X4o "!ڏp*ES]߯A*0(bNFS_^~\k֪ Fqbkv≯4myJj}p8FjXƴTaȋ&kJE^F'" bbeFszގ۟tNwi+m|{`na 7]#O?>*NUKJG)MW\k~ShdΑmd?;4r~N˰L CX3R-0%Dib%*Ty `$1wK%m`-h B;3lHCH$P^P (ȹ,*A}&-3A@ILE'Ğ;"**D KFe$W=a25Nt tx5 l.ĆDT 0P[Xh+T\VJUJvJ+ցCEF{6sB3]JRO s]JUqE&>2}Eϔg^-ٰe{O_ٽ)ӋLs<6CPSI{쨪&C^(4~VE(ꞗ91*rȳC5hPj!M:xS}8ޮkxo=3 :ED *kO`N,L1PҎ v!Bhm̶tn+ܶe~|!zsl3'󋯽v_a}׾/?qWO.eG֌aNʲ/өnF:IYHtޡmѲ$%GS%@y9|}Aׅe4&[!$DB0 ׄYPzJL48(lRm%yAFgL 뵵PH,)  38t؇]EzRǔ TfRQ BC0"(0 =BK*,z F25LW]52hj{}mnz+:'ٗ9}ƯZ}3K'/l ӳZ߼~.o9\ݯG|L_g}[.t[N56]p{oAãګ\ڜ=P\9M b D! b Lʁ꧃pu':+!H(j j +(E 7،Õ"(obWjX/BU5p}?OU2,=--1{IЪ2dU85y~bܦ MYz@>2^#{\Or|Ȱv yr|_Ɨ~}S䮻jڃG'g6vLW_GL]{ݸic]tvcO,.- s cjI^ 7J/m0NKPUa0SX0D'Za Ee)W{k!FhYD9tRx DvDT>Lk}sȚ^  ^aLT@DP0a{6JT+ɝ 2`υ k 'l%: WWr[+ 2:-zz9~wF lj~'^+;-lk'Cy;co5FaG{OoG\cBz"JL °EVEjA& ծ'L (mĤBT R0^kv6_p/a+&'HϷ}C=>^l g{4sTc<'CUz!Z6T fb/e=րbLSFKlsͶ-]S݌9i[?Mw 8Pw^M&J0+JQS`4 K ak_4"0(0RȼAyD8Qc(Y 5j" a5xhL" $P[\VAs\ЌAؕ2x JbêǀxUԒ2RC5@vmQi ]Qz(k*"P$!II _Z>ɝauКeZbT#0>˜` W]M>Hs ?G n Ѳ;gtd׍ĝ^|t3?p䵗n|+3?_WoO.:zuO윣2 @qQN@Բ BăsL R!A:  ,XQW( P"7&pn5)8>tuՓC̴x = ~J(Y*>጑s aÎN}),P$/թ2QH% e(ej[oٖB4a!(9=wj1Ҽ?}ѷz]NMsZ8ԱOvbJo|z~励Sibg&7SsNtRBPB}ў #ʘZzAJA),BDzSY jb2G^sGcs}HLM2vJ @<8U6`ÆɋUM W](0_ rD">LBU"C I{@`p`d=^}dTcIJi\uQCUVw 3oŠ7^{}_~|wFwﻼN=\ZYY-y䝯Vk^_㦰PZ\VYRKAtߟZKx%J*gl'HZlNSʘZ:,Uf AcMuiRJIbc]ԖQ(+t6E{DSN (+Mu p h^ \7`TFwS<`٬Pp8?|o|e獈7sgW<6Г3yڋ6<:#s>e_JNCY0 ,|.!GҚEv N5H2=  ɛ!uaΎN!݋ bVQ45,o_62uh}񢡲hTIAZ0Ȱ`jc p֜Рc^ "cm]KC-LN^<1O<{?MWKnaSgm̻nxo7xU̽ss>ٻvԩ l^{4<1?~l[@0l:QrPW^JAT(hmɕO!XD;-}<\UH\$us1V[D5Rpj)  쎂g ¾<:"\/-IbN04}UTKn0c῍5'gфs]*-#U4^*vVx{$UA %Z?8Mcc7~#'>? co+F1b9{} Ny"Q,(($ډ&~{jV,ip|,j'(&XZT G+"3(䦈lHmA_k4RUf@&b& i^("Ay 8X, c x ~l(Exib{#@; *zS\AtçFUsi](cjRٮqkUc;ůإ'Ot/=_xsZ^J'E~z/RzU_mwN^+NsIV8Pp=]a\{ UB:PD{^or#t]M_Ч:Z'p%ZuT>^rus yai~"`; zT1%%ա9` DVHtK-= h;ǒI Bk;:C3ÿ׵ͼ=o3]c6otbj}coڟ-/ӧIKb%!5Is`.N_aH`ы *_u+2h G2Z23J^Ωt/t@#%L$ y)%$ ˡB ɌRƬzXFJ^yPUV:0GA)ȂAb;HS'>uLlcFK҇aQ(ec$ Bd?ZDSU^\*&`p\M3Hx`a׆t&Sle[x{_Llu";sb_?㯾fWӽ&G|$4 5<.hHx(U*IArv4R$ע }C2,6UYV8$Ʀӡ3LiU;ޤ+ƙҐ:Yc}(Ɗnh`X7 ]bՂԁ *5u(a6LP0IنXX"-KLhYk!W;5Le71vsw\?3?kyW}O|ßj[G?rdY8vpUNYS|W='"3IM'/Ș"&\Qj,XT9xYCFF{5{ɲ:lύ̬GwW<ΐ3ы-zR,"(ۄ%?/Àa6 dÀlY-@h")EKCQg؜W23޳>ƍꪙr:7"=g^k5B&4MSb@H"B}iʝTj 񄧚a5Do=^-?{oWO^;_'/=<?v/N֗|Ώr}Z$;K1F;F`Ӭ}͐}Bga"ب82dL g7b} w.\6wZ+u5;;ز&X*%)En72;[Riñ~*kpPhp) TEy\fF|(SP9fཇ  CŪv/sO>+/_s~_{_g~mqoxhsp#? ֯zg\@!0EZDNq-2ʆQ=lf'` Y.)-*` ة֊eNKU7N UDQ"#n:Dۖר@d#2?GG!]|&|@Iɔ'H)__;ȥ;;; s3=3G8.g3BJT2ۇMrO9O@s eN zL_{)%dstL˹c`g?)1Ucw{V1C~sVbc#jq:)8lD-L5N~W~柿p`o _y'>wz#`]w=,Q-$ UB"$+ 3 "si@2o*f:4I`4ŰG aLQ[ Mogp!,((`6UtQDA8F"4F%U|ld=\[3bK-3M GWK6U{LfDH yd9O:KHs;O[)6t΂NYK|5$Wxɮ5??7??3ekw+f%ѕw4sPqXs &F)6RS41;}tOֵ"y~> #BSC=~>5r5axwJ< ]wFpflbMO8hS=O,IUgB'C . ES?Bqg[7j)GK[ۯ]k.?g?vom{fy?/'}Q=4n)@',` ni0C0c$SA,(\*<,::nlڷ{;Á⠠j"0TdTGQ:.&!pىfr wY=Mx|>{"v QNS$3J'tπ4n(" 0D(uiYUYt-sY"qv8xLzPp?G?Wp/?/w?R{lZ<L+b[GNpjw[T&\ -?cp|@{:\\Ǝ=z82ks./2}z^!6N~Ļ,w~{+!ϟid,Ls<}*"WE;Ig˸?Yp!д>?`q?O:j!<k: O޾?:n,ey>ӧo~x,.{:y}[@K85ߌkڢ?ZǮ0UЕ6Z5nLE,TVUWlzTxuũa0U @l,ml{6I~JtT,LU t*:T\;N-a{իy QRi0ef9)P+c|XD6|YX66O"b"voA;6Y~K'?o?_{嫟}[زPaDoL_$vs'c1ּP/y~ꕌM'Pdk 6jqtq(=?%ŷ>Gp㿩K] nS-Ex8UQk5Mf3;"zJ "GzNVp#8O5 -< yb7Vp!O,xx_x3|jӟ/:3;{oGo>7W! \*#& A++]/ bD&j J֎12&;GRMXT1"(fI0oD;G MDqJᢐYbnz[ NRPkܐ 21 V ЙVtO:p8^SSᎢg,c˳?l)qrJ=*y׿IE^7N>;k}'g~ϭS/kw$*h}A7vpS-HB[mWK6u~S/ dl3Qe9Ys!|%MQ<|/dXWj>+oxiͭ;fi˱؛[ˑSEDMq)fsX&^;CUbS37VzP${DuM?감lNdY䃍aXu|7>nko?89s[k_}D>%_{'Y_O{, 8FxKn T .a 4{CȘr3n)Hk̂QEZ- 특,X관(;AQFdhѣBK5BM Z*U2.s2ؤ>hA}Ϗ#q[p -8lTt-|$.4aٮwB±po,~e]O<_;,YO+/O_?'xۮ=G_:/'oXA p`nN4[#鏿מo'>ۯc|tA:(̹"Z3xTϤ`OfHp8:v\FEEӗ\`>8h\>-@"( "b\pHN )ھ*R)! |AzD7'"Έ/ eiɣQ锫N9hl [ˮ˪~+7LE t {eaGxZ(hΤlRA\;|vxQ*]fJ)2;o#rs'j\;Ҟ|gf6OSbM4{Oe5 ^aƽ> g:T4*ʬ Zxɍ}{5|ŵ>Mg>Ԍ+SK}@:yr?oJR]S?_?8k0{wf!Y: 0THs4}ڢZjB[5w1BlfYݢZ%b$l*A]Wٴ":`,Pe3ϡ]iZXi>-6Ou*t h'tܤA֫%;#̓lY &İ@TTpcTݭ$>(m`05}>l<Oُn\[bfFu,J*ԶBU3n:,R}eyӭpax:^B$ۅ;GENhW&\և@]iN)t\Dbŷ4)`rsO ,pVqp,.>ո0~]ob7(ggL4)ܧZRe2v;eOբ3^;l̗H_Zt񙓰r=Rq}%CIN`%|ÃߺwǞ/Y?#LS|_.Q>\_u1ڽ[&n2cΝ`}Wj|kw2^$:sfQ-ߡcg[pXmIvMĘK(*{tH/z2o CA EY=2, ksVĂ)n,ﺛ/?7߾"HLⴏޗ. j:Zf;ɻաE! p3a < Q  s#ldUT%p aD!`!&G8!(;zzj8V}}Uq9ھiQUO벭PO@HJXx!H:\QhUP hmḓk.ΓXx D O؁}B,L8cMgpr}A ɳɕj?BN?-ֵN8Y.ח k'>u!ua|Jqx lK{c[l㉊KxG- `  PJa d ܆l }@h"feiV @DUt- SgL̝;%O•\($NixkW'e%DڎQ0v▍pఄ8G_<_cļQz7>ELgL4e dBN'1XŤs'Cm9v=jTV{Y7 /ՁO%;CM.c1禴OX{1͎[ʭtj\x/Vd&5S{`vޚ luV-o;"l1\P\FcVj-sۢpt`HWPysUNkԊv rO밨 #ⴏZ_q/>g)* ?ryAʍ=G?w6I_[- Pq5T7!JA Z:F0RDQE;+2Y[HjHDcT3YtX gi {[MPIi:*8& d"yn-{H+D[$M$ mRd5?WLS[΄妘QYAQ%u_];okwϑsBطєH=7Z65<\O :_ۦ_.| /hI<}poC+ L@=7j F륧P&lJA|vool3P(?tt·NL=|{OwVE}u] y:؃ur}U]["zC?BٝS;/3>A d-iFG]*ț C:6YXx*(4J&?R\ UGy AѤ`$]X(fN,8A1M~>Bk hZ"S`t ,Xu #;O#< ݂$Щd{#G}2CEl(*p.|SepU$M+<$ ;K^%rwVUcgD2XPhEɐmYںt@Ulj2M5U#rkp.i ;*} r!ӍC9 gNĆ8OOG`yto}&x]*kM]Z!ߑ^8/x }}cGѸs~O#r{/3̒="Spj6p?X{u_[N~ԡ Hz\\EP-D).{*,+R 'ðRRM">U!:E:pe :pbP[ΪqcD@:!.a5+ JBIzDj%MZp"fU~  i>3hN`iinXdupwYg dJ1DtYkY\")PHo{0RuJn"K3㍡lUz\´) w7FҪ;'EGW*yoOxcj=C=c/E0u4dV9os AZΜ;C4󾺬3/l5+^!8(?RaR\h]woP#x<^RRQ=Y6-ՠYC[圯ɔ.;]! uQP#QJO.ͥ KUzu-U9xzON>rWr\ky6"J` ՎO6g}qX aPئbuClAzkڞl,ܱE҆$X4`jNBPdՌ$Gr%EHUyD , V˒Z@DYvU*0Zp9Bb)c}36!6:Y uXVg'mݎ1_vU#.BRSrAb!T((тxyl#-eGVa(bK*ZR ^Q"mӶ$NF°!$p8؎"FlclTbcaALF4"A Q|e§}ww\W=?ތqyM!>OqUݻq[-|nXpDZ>v` 1Į 2Pem)$7#I4;EeTu` a,/~}6sc2U S(;a.d)p2_H'ٵE-٘ jiCk`Sdc/Yܭ[<2ZM#,:)n G,<G^ܯic)Mm{t S|Bg8Ps{DY.y O믾xSWwS{T@BI"$ RNGWظI)`?zh~ 50X+YDHfT;T9eVxj_w{=VAm^ F=_=xaq0߲!to+Iv'/oIf{ZMd[U*6V'zsAURog8Znt5bc7+XKp!Z3t]{OܺqGJJ.qsww+DG6f H݋ý&E t mtdG\TS.ܕ4wjMi{v^F܉"2txJod( QA ;dg}QNͼBG춄|?deCXa-wVF?iĉ /n*@hT-ꝟ] Z@]ˊV{ hrAaVUETfOfD z?ZtR{8g(9I66>z>߹':*b%i:W j'Gj]<.c@up@Hjj{.3qC|Gtq? Wj|&*^s$ a-F0bno#qMxKfYK1AR^bJf}2:.BN7nNqRU >^;">>s{I[J P=%^Eԓj]%ݔsVL%bIJ5#t5K~ED(#(IyI*,5UU1ob DL.0)JBҋ݅\G֯BuH^='A)`l,UĐ 1 )SV[F R1Ys6*pjʺG/i`4:P@P*RɊWy"tyE>UzDwGa{7<4|/շDx5=w__˫3u[ H;edwډz`7kn4kV I ͦ' RCxIJn/:!§P_;xwpǵ.E<Ʌ~mBV"ǃ?P rj"Z@_}Gzm kF] UYAe Pa"]CP%6Mi*-}6JKS0ǴfQC̀p`|Ss}EFc-حGϠ1z eUaR쮳aZүC!WDu5P(i1YM0^|mD VD?B*ΜB[:Cm92X@= !G CxL'O37߯5ND@[T ͥz{}8(Id$ 0oAf4Zia5yٲ'R6py[(9#㭟G&LAFa&[Gq߯cϷ6#.X)H!vIoj<ºO#ddvc."ܮԱ"}#Eej @``E{,! 7COXzf>v "N NG?oOmH'WkZJ'`ի<*"Mob0Y[sX0k f1Y&1k@}͢(UGAEüfy@Zdt .,:jCEBvkzB s6 NաIhੱS,y@2x,ۜ"$h:his߉zm׹fv_*;$yFV_}O~EMבŌ-22L5#r:Pq@/Ωo=!#Jo^}D]c0+P4X iYȧ Bķq&tYΎyjI!,v8 2+H!jDz6O38r߻l1rA2j||xi$*zm138NB ,M i"EW{xj6V-^Sh 2z8w?{M`a'Cqlc&pXt"D&BvCaC)Sc n*yFظ'G<ʒ*>'kTJycd 2X0m iXMz-3^6m,A [%˥YT+k'FfVI%KtϪU*{#|_P"eg kؑzǤZj 1L< =Du"ھjepE#(<Ũ V,Ȭ)tXgW[N= րFťs*)h)ԛ `aұ1cѓgu%UPܻ""&٥ w3̓-O.t# E,eKmh42rڏjjUYk uQ#M4yȭ 1䵫t/<8W ~Ŋ\403ڙT@ЩڬB9@ D׵19H- A'oAM"#h̙ŅʨFQ@ќTHD7 nUƎ)ZLRS:9ya'ųGg&Δ9jAU R: !<-*r9YC{:JQqhQep&YWUzu]r@' !8LpCU31ĢP9#&ڤ[3QI#EULW1AܗN5CT≼" dGUs RJA~2@f*6@ 9|Ӱe %,\^ okJ.A^m]5򅃝MnuS1$$Ψ p&3.D-^3\EU n2dէeOEoViQx30s&b IM#/P}œA-zLe$_0ᯩ5K"e"#l)jUFrU㠛WBI dQ86ȲM,,_1T`9[n^EedzZ^s)sϽ "RwmGsePKa21)K=# صڅ@AxQѯSs|%m+Ʋ׵hH HR5+<!F eiMP8*bUJ̸dLPDJBFb$ O ,kocUgN$zG6H G*ZP=ca ZǕ _, !sL3ex&f"I*(zmb#=ߤ4c}}jpA *z3L,U ^5`'ӧ{Ϝ۹;L2[T!g(EK֍t8ߗL0ѩE%vrθS #;[2&NѼod;U6l9JskjմU9&GK\K|WEC^ȥ.-GgWPWKV2\<:o婱k%1P߾jѓ[BɤU?2"8M]&څ@+Z f-5UDERcN)9 -_aXC{o&n:e4s9Dmͩ =Sq"jY%G~)m|z=OZϞ<oqZmhx01lN's w,Z)4i()i#FmfnA$#pb;! HR@#'Y{* 1"`OfΌw@}TG;8WZg'EDdU(Z\#3rrQcku|qi2U2@+tGaY[gO1Mi"WU_o^\{I8&wz۬$6B^6mZe8z5Q)X;E! ʖczEjhNwb)j(tG(ZD)`šjn-0`ʥaȻ]ULjqh^|l~^K%\s}EkeBG\E-äq ՠ*i^Eܣd:v8GSEW]Zl)Z4P=e 2R^< g;L7JG-=д pj!<1=1_t2R=Lj_\yb>QbD+ jS5_kVpErxeDQ;Gb).pTCZ(FJꇄ`Y"L9{r[lUTh8gs!31ƫ!ZC "ADEcPJ8b}bp2Z~)nz%q)ALl9"LnYE 8rQ(1!jPUŜW f8#&Fe@ cU[luVƚޅzB[O+Ar"R43e("*Byٸq}6ӛp#ܴ/Y'oy-bkp2Q_-u<5팪L/cFQ 0FeDU˃3rѲ 7œɵduk Op K}}>3BPT pveL@37V Of}#jlE2AALdUg{2I3R$41׎Ɍ'[n[! NsĴЏ3rnԓ^/P{o}H~?~ ۯJGɉ-.]f|!ѱ+ eA@? rUNEhH9Q'euJE'",.\Jx@1~)PIy@cgXf8Wnc=j&ZD 1ATpb 9V/S!"DQEQSc! ԈigW;3A`Äj^jb dCeMNYcC N; J GIt'U|銑?pW'O򒭛֎p-E`e!.-f.۷h܊RzA[lr*w92%ьG2GT܉\:t/H\TWrxp p KQϲe62!f+Pm1ZrO#pDֵQF-.hyvA)%RTT_oz]wUUT's2QFshq`H< v~辽O\wHtKSjx1J!J PqBzVEM)lKFZ1Ji[Xa4we^Ts(f!sgTbNoeg2yާN?dU㧻 AOJ̔; !B,CBIU*HPQ5*;-:>A#sm8mьFcnTȁ9|*L1/ WdK *`0[|D%ĈUeTtFf(M6c"9J"]XG QJD^^dJ60A!"=*$^:QِYYr:b9Hԩ P[_ݠ3hwE7z(|m_|ݏ%q`R ()B)){`QE=SuEя ZF¡ڟg{f -\5aΧ28^t2T/IJե9PuMrLgG(EaR-&q辈 e>|`TP=Q(M#RLB!E""X?1*:e녅t<^:y;ݟ5833s|>kZo8u{tm1D2H'R CB @QR hP"!Jcx&Op1GAfÝgr9Y2Drh$RI"U`-BQ ҘCq[Wr ML{̰x"g79_P" EZyn:Q!Wmib_nrߎ Ȇ[#tD2.4?YumYoY њ82Yt_'W?V=[䌕-U^N+69ץknǺ>8 Zx JAiE +'j%)L\/bI7+:9.NNT~~QtL9G.h p ùN&82@R;2AׯyiUqi;#~^)EԨ(;U]EWmU&e9ƨD;Jr*uGx xݶ5әn #ot̑CgǞ=yljƯ/>r-_|5щjγs2STU({rBT6qUFrk!3DŽ2"*<'.%Ȋ&=8-(J%@LBT=yfREb1X2sDFV)0fO+`eBJTTZT"9"f(85CcC i ,NALr:ScosV IU7@TTqL9i7]Oʏtw‰~+|SgO}Б_ɫMĨ}Qcse嚊Rĸ/,~`U?ljx Alo.VuX~7⥢ e^nZv uđp f '9U{c X춎FR;QKAGV>̉2S=uETRp/"LYTUDJ)Ny,s#WAt'E_y+{n0Wl|t?^w|#<5[qr}5[U?ݽ2nܴplq'<>;b@ "v+㙖 #ZIJBRR6Ș( PSjR 5():`? ap KwSy*/+EUU"H "*cYc ԧ^ >B-j0!F=K$( VDhybui5G>ougdqѣgE#Aw "#RdZ7M.Z("DwYKj3iZ$b8r*` hTEeV1ڶ)2HJzLBg+}e[gSG:f{99v6lWיc"8$e\uJB6%JB'Egf1疤bDYHsYV@;3_S5WEFΒD @D1*L1Ęf6@f4̳c-BQOM95Q& k"*2Ǥ(*R"Z dB54_S9L~:eڤxQ,(].l{θ|{ΫrhemgЩӽ{fƿ~ʨշtWݠAf,[=G3==[`mvhJKw󎆫娬zA*Z| ˞^؇Mae ({5\MK)ÈC{=7 zJ3u[2W-6aAo9>U-"ȲC-cA+7nצ:qW|G=sz]c5\9ԡ?Y|;n:{|.پn{O P1٢T@B_ 1$y"!/C))1TR D!B,riIZCZ-DM؀B*S&7t#!HTHs}@4foL̜b5jZDTYEAZFUSEX"z^oXtxh\#dTjdi @ˏ뜥z*32NJBC8OwK-Zyou;}w߻߶?-Elڛy;) sˑw͸@(\ 9&oggch旼ЋH(_=}k:+e '*~yۂ4$t4{2T jpVF#kaRx/OE j'h?*"h_DUGۮdNGyyhE6'K]^NpF-Jx_?&]gV=0=5?-z̾YnD@NA ʘ2@M 5 2#do \ # ];w*j#|d*b D)(Aj!"6(@%\,D=8c*g9g"hLc; 1=1;;UKpGAʓMi@ nn=spELZ7xιs(='\ǖlzk/:tb{iSDoqG9}y^ k'7{x6yۯWMGO$z*8s3j -%گU7eZn۲\hfuJVy>s>=0k^YZp?u2A~Dfj *RA_Rmlc퓏ֶvwQ*G"Rg`L"@ `3uRKVΓm~2J׎[(d%eƭ6Rv[=}lkw[ÿWϝ>g/ߵw?_趯7^БW\m٫v<{A+SB}1'A h['$Q*3"fDբD0ٌZL3AӓH8RBY7 b9bD250aV'O <]ֶ>y1W]t΍N>)1S)vK A M ZU]'ʈB$"~#ЋYP Q(QT  1J "FފEDI* ɀT RRQPQgV+5RKĠF(A5"HhuBzuX xs3SKɫ04Ϧ5DO]]WÔ P%+{",F宊B"q"ۺ6;p뷍NSMO\9ᒕǏNͪ}Ǐg9q7喿.{ye|ϼ捏g&wlV*ϔ ig|Gէ:,jUӘQ/+)ǯW5ddp KA/4(~KKЋ:쒞͝b!zF 5]%'v*@mRV6TbPezAU9N2;e?J/Gfo;y~ˎMu[|쾣*ؓ'ڪԟ:}Νwh4ګ&vnm99fET謹J)+11;k|[!QbjTrVdSxXYZS1-Y4DYz+EZrTW7ڤcl.ߜ>gN_rw>|m'.f|デʋ7W0w"|P{"ʎļ Wom}fy[7/GȘso!Vl m2G#jV X"Ra|s%J bjkX')zPuREESJ釂eF}Z# TԓQ9XԸ)mޭm;xc"nKAcrӹhӖf蜌iN&N_8;uhr;^wɚVu9̯vC}6gy}u'b v &Ĩe:ݘٔ`! *6v4 RQUҜr;( TDž1*1u 4Dd!RoVccNR%}rAeYz٭\5AUFyFpnO +,XX7ښx|b[m-UkĈ\wES>vtO?pKOmBq?MOL'W]\5ϟʺ=ș BUQ?c)=3QڽLT4'\4WP{w瞺c;[n37S?>Uk6{Ƙ {Osf-:ٰV\a"Rj/@QF!*JQy$L EL%cIB[N,jV&N4QB5e7 LLαRnD9"ABKXZJ@"uAp13[GU @f,0ܵ3p׊k L n3t>ҒkBwՁ;Ws׭>{᏿83>.ٹBg8p kW9mbbݵsK^O_Zph^wMc"*RJI}DeR@?j7h)) ao i1X $ךEËp ?+"7/fahYUX%b6]_Dw o,UUj͠ <ڌnF3mn7>cy6f?sO뾼E;6z0cc~Wy֥~q?lџ]VdCĚUX219!AEDAT8P抁7&DAi$9U+݌1ri(ZDt iүqm0;f T'Zolz*c@Q5J-cUJ|BOmng!Pl*D&EXD ذEܥbk5~PO3D{+wfڤW<=knk7Gg;q }Hz|&Cm[6<-[F/l=رO>Ϡ/{W2G dLd! 2&J9M5³U]j^ O8Ik^5<^#N Ry j**j]sK68jR4b62peAFgZ6kƲk{z?"n:oϩ͛|\f~c=''o>Iꮼhݟ{-W9|=m]7\6Vp=;3Ý`je6liۂiTQ*JJJ/z!6lڋ6_J ~ r@a#wUDըey 1 , GL^G䈘L#c4"'M $Cz69*ЛZh -29@@Yh29 < HxFO1}઼^yr䘌Xn<ۺΕJk'W|}v߱qOv7m^}W߼Ϳo^w]|Wgݷw~|evֿٖW̻|@/j' g(FvuTʹKlV),ʠ^,?/J5\5\_#Ҫblg0.L`t40P"E!|ب,/ 5 e4#ʘWēKVLaEuekЅRs|}{?Ӊݠ -aρ~-[yGo;w]~͛>뛷/?yףSSg w~a*]O:/Nw2dQP;(;qB?hTˮF?#_"c8S reU*8لBCR`K!" .˨YI_"]'c2L(Y41 T'{ۖx,2+4}!\G c|Ko̚K]6Eke4"d ۺi<ۼGG+&V9vbES-ڳL(Xw{ه)AXq4wC'?2K$eu2*+GhV7}CE^@=8&_&/*养eiz\ĄŐX` 劉k뫳^-\pgY.j6tنܪՑ.QOMʨ%?hQS{zݜ=3%cj9f}YT#2gMϾ}fbԱapcc7|K}36'YLJ:7^vM/۶uz zTojNU"wԼ;3)MLDI-D{Dp2G7j"$ ǀFMXYQ (b<'VTA$L.Nc6*398ظ"ɱc(BLp̠՝+ `RIhMa̾ O!G'\Fc8V6Pո2&p>Ћm}-oWl|x<1ܣ@X}͏;qOUIAby6f R?nY=H`D%&d^%NTh/Z9ⶭ )uuk2w=oڳOkW??{k^©N΁\;7եgNr:rd;:O jl!*qƖ[HVjy0،$U{[(JBY@QD1TaJIfױ•*B+7L䙭(Z F-QS K:3C+Mڜ{x UćjV.*4T(q]EB.56mպȘU7ZCg>su3?/.۱?>}qG9}xUtɷun?*I5x(H:F3tm; ` /$H:Zi["z n\el.b2 azMi˙g8ڰ"y;"w}ukhfI̎함PeUm?#?xEYS\im͖/?6k N_]gOx C=!ЅA!JVzG̦Č圡( r#X_̊DU(ٱP9F*^fZ4i L朁Dn4jeѫII0(UFTJ1 e^hQJ+iVz!<`apIw{Ь2 MeOC5=qy]^kVsڕѨ~.||Wȸ-y՛ƻ굲΍_xZG[ E))3drlь әsj5U :մrjg fdL'`ʱ;e'6)5nE(Mxf:QP"BnoX{kn25Q?%kuZs];SO׭՗l=>JALΜ,4/F"d]%XQ~|Q9XO/܉P5')2FTAB%dQ͝!˜㔜0DDu RwШcԈ\VIY7 Ax]rĎn Dfjz.U*QUP}IU؆P6>uNUylS4 uoR@U82&2ܸUD[wlٓgţ979Qq'3lhm-OMdŧ߀P7k{>T2y7y K4ry p ?YZq5YҺ5`c cX"-A"բgD[ 60@e9A)) spx<Dc6Nm~~e_t:y"sZ{N,95l%ve!~Q>w]Vy>p]EbrJXQꠘ^;z9&HRBw,`thq I}:AʠeDD˨E)A2jHæyASsy(0%ګUn!RMNfMcff Ƥ0"ʈg%t "TZqҘaO#71 `(YD0b3MURQ[bDd S8dWGuݣt"m7mkWoR!OЋ+[ fn<͕R,-DsU eZFZjhX/b@6\SP ޻Jak}{Suo===/RHeR2%2cGW^F1`C@'08'@^b  X)[)Q$Mߜgꜽ>N{zE5u:[Z:?{ě-)+aO 9+,W,O2pkwG EaS5:\\wHE77uffD*p1 W܏'~~}? o[(}dQv$!Q-oXӤUJUx=icFTU1XꚌ$IM9HHC9q;:4D)LDסkb,-tc[4]S|佪 C}ha7V=Y<t~nL;:^e5CcԪ]y\NOz8MQ{gNmyO_/}?W9c?_~x{3_r⚃ɞ}fR ͜Hg. +"QGfڬbu*O8x1X!OH$ :$05oU08ƂKGil`],M4$RDq UmOrlǮ![03d|ĔPR^\{k1rhnvrre£U[Ŝ-i"7.);{cOܽ~M??S _y7mcE/Kqv^޼Ms,[ӚU}KW*3GXΫ806+pQpe:ԡK~ y%äpD\ E%C>]3M h:N-H0ءu+%!M79Bx]3g_nz{&H-'W>@ aBDU$9wsU)rBaS:bl4r_|v6/}mϬ_|/=<OW?<{^^Mu&|`&@zs CGdC0ss#&^dm(D&48 !el\Ce/0 %BN(()^=KCMްH1 Lfurz401O+YHJm3-lqN_'-W|k3~NEco]M{qn+ō^|O*?OcU^9}%8P+?(Τ 3Ld6;Q1_Tn$9%5VJ\\W$Ǻ5EWQ=͞ +/P:ԡ~mH_&cvIhˮ+N,U܅Y f9bӼ3`DNHz|a,5EۨV$⢸%:%ื'{O?֋#o}wbmz/UMEnA>T]2j[$JjXgkϘﳱ2Zbl},uf7uꫵxd^"uւj 4WnXԬ4g j8Wc;ho9f5B )SD ̹C"Yz/?{||⻿_8܇5pbTףOP̀H#ƪdY?@RX?y1%FW`҈\&φmxd ?߹pX07J>AÍ:ԡuowxc 6-@f[۱4%v5Jg)Jpe~qÏy"Պl<@*I7zcS6UO&:X0tFo :he|l45I;Cu2n6Z /]ո+_SOMU&DLж\$cwb5@!qv {m02%À6:2ɬG]'qwEܺgv*O'p5ԖŰ.\OAHdZ;B:`C< vVnK/|@Ͳk# ];@I_(0'^|JĽ)3K^|>uIg$@BqJ:۝>26Tdooxq[CɸVGWD\VgIK b`}<+=c=}c<ԡu_zχ{H M0gv#] J !Z&p/OKZwQJPX__VɌ&Pi'"˹:mQ. 8p9ZY`[Gkq]4eEue0%18R elVVC?/OÊ%9|EGNݚ̺84;D4ɔ+CZ/4vduĤa>#l?ȈB@)"aQ^[aRx5۟V JH4&70gOM>s|Rqt'Goy|[gORȆlN#mm.[+^[?m( 5]ݐLMqښpOvwL5-vx~;ARb:ԡON?xpLnXFvvne, 9A"3q{^dUɥۛzJ͉)%l1|J*際R/lƲO?/:PF;'οCO=:N<n].7FIZQ%Z)VX\vt CI*GgH@BS ^~U>ʧ>઩5kUb 8T4ONhMaG-J;X! ) Ff8fPE)X۾ʁx y2_|t:trNO@#JLM;K=vVX*Զ.2YD^˪[Zs{+oBbՉkZ;SҶbmтa"B;Bgſhw,{m=C(CP&[g%P3pG ]2IjKv "w+JXOdц@NQ0C/9$r[3$C)P J>Knn:ԜrRrQ.C5ıhXwPסuo[W`p"n튵btpA3Oɽ%$E4Jom2g3*|;3ܯ{믟/Ѧ<6›+9 nL_~RV$QU7JL;m+ ͔]5f͋!:})ä 811s4DMlA"U(HD.Jw-ϧ5:)BDͅ Ӭ8)5qIZ uh%#!G2@qqRY%wz%Si߸ULBg%Vg/_UujT(3xK9Ju?y}s>svBh@?>+t=Fa3moߩLF4r:(nrR (dc&FPQjdapONVa#5nz 4" _4즤0UxuD"c]EK,$e!ʤz)>aO k99jy~q*y?šxV[wkϾ!`p6gxI1p]mPmrag4ʈw57ޒzS5_BU7Ww|(<ԡ=p_\MV5m;li{uIaIߗS䱲'$/D):$KTe0m 8!JGU>~ǯ'Ӹ^) y89 P:+BkB9DWP2ƯflE]m҅"#Iˆ]¨mmE®_Da#9zg=љ9+캉M)ٜH8wl 4vfWvD#%jD+B6kf99~"0h{-ݹR-Bgwi v;yfx-2DGHdF\q1hpLȵ+Jlf;Fjf\HZ JPt%c~^%q R_cP:Է%q@M`asF-!g2C2߉Zޝ}پ怵{hOY5@¦[YL2'VpY8T,gi Inɱ#P4\*G9mǤ89PuK"0JӖ-L.?6kWƾ)w%CkS?]~fO$6#ݓ5e3*d]rBdXw%c,Us=7USX78\cH{{P:7u6r;7=m؏;DH^d #=giq#\ '2'0¶la* u[@a-A3&xuL%5@S2 4۔:V(&ST F5TBPڰKUXP|>{' 0j/8il]BG÷@qA$PTdapwp!HAF9! j#||K&ώh=߄ { aItnaI x>ZUWӿZqM-˜ _y|+Қ[lSqtzM J}q6I0Jmz|.AW*OVMq-3< V0G5 tK[OufWC@b*yiȥR6-v10D0:%:s'6V۫4&Pݍ,+z7>(cO*4:np06ad2gZ%d.TJQ-U]cYBYePe1VGH#Rn #QŔ"9"J9%+1Wnr2b8"njhF&!lvRf7Uɗ(~`m`aFZ3 i@C6K\M\9 4Fh?{Ȁ"3R@SYt| std93^bXbIbPS꓍UCfT`$ bԂaְ &c߀GZNuD 7VÈj;Gk+>~CۓU-w?U -A%~%gUn (WX|{Bҋ1'C3 ӓ>{7zK[JahV(i)[БFa[ĆWM֩ɳ l"-=:\jtbOd"'$2| v2#3LXcS]i 0B>ݖiPHhQ?uͰ)>/TY <Ў In r]gU`"Pt>޽s38GxMUucrcUbw0oo$}I]eUnB]Kcf0ٞQM|^̾WռyI7CPFpuՕGYN9K+~4*Fsq'Hq(]gC=%+mQ2i&P֙ks/~ڙ$K qY|, $כyݓ5r.y)pc0a%N\u¶(gPk#3-H(G^ !8!)֦;98%Tx%2kUq.Đ2 R RsE˔X-\2El6 8gfShf03pgke6PO&f6Ktc^!'W20ǴW}Koe6k= %nb`o3ם^ OVvJч*֯_QKLJ+ml\/*ޗ`OyCuC};ǏmiZzkuů>Xd.3 )X`hR̕` N磟d{VxmA'}3p1ʁaܗ8}(%&:GxXā1e"᎞X(`HD TJSV :d""m8VTHYqLY=)Om2!'flqvWf&9Ma@X4p:jh5>lkѐʝ,%2'qXpͬHKE?pt(`WaUz!`))'Yvn#WQ{l%BHl2mEpZD] JP6M {hDM؄k-y2 wk'q106\09yj}l`hW̒=m@$vWX. q֕i@ T˿5|~m*!98t3T>ΊoG t|磇4~X}w-F(i)Z}njk4d^r%0^K'o|6uo:t11u&cME`T2ZL==$ c7 1m1 ]rcJ pq?g39>gOP#Ew,pXIϡdJV]έd/'epU0518*0kYGǥ BVd2 -iJas#'tII@ՠMxR,8:|Gu4 Ɠ@ 38C9~ήy/cKb$F0ąj^_ cϟfma523C9ZOՀ픝m2#vL47nKVfUMŦT ] >}K3YufUuyH Ez'ʅ}Q-[|}-7O+P7Ro믍i7y־Sbf#ş\sfBZt5U U*NշmbИ6]XZ:ic~Ὣq L(wWTGכwWX3p635Pv 9P0 G` SZRS.LɰF10[dL :u䄜YU~5WF)*)]Ɯqxfb@*;9~X:Ej`,k8nZ7_9\w_vaLl7^:<*26O+cd Xw@$q|7O-Ԉ6z)x)`bxPj*jtL"Dp%C/}%<뺮CKWuqWG%QZzKP:7:#0߄ӝC5;]>4z2ډ,?7e,IfUN{Km )Rqg3| g;cQ)"Uvhw{|h%flO0V5$%Cz"x*8V!L9ݨQ0@?`8+!5&kpGpGjE*dKfi߉m- 7yP{}nқm #H-mҧޘ79SJ۟bkѻ z5OĩLVCu~= ֿu*1*rZ% X9czOI/F=[? Itf;ݰ栛Z%bSh P&ؠ +CŸ8&h?'ć:7pt{yq HǍ>ȫ݇%ƚD?K)m 1E?,n+:hS8[f}PU\_I9[%=Gu6 _;dk/{sR\Ru/DJơhSeuu p6"[SYp^ 57 o/)a[ 7iπ. XfP@fƱHEQPeD!gVŕpHZWDmt@$e!шmΓ(EDbisut"ͅj %Epbmʯr˦/ %z/00V8Q\3dGv[>)gۺv775.RFhv]>P->KT'Mg`];?[aeV"n?q?ɗf׊E#48 ujt@:ё7E].;v o]J@&h֢QMU4P8wg+s3/e7 l}櫫FCPߴKUߦA>dS/`6[Ԛ&wAqiK]4^iyz{6Na)Iݻ.S ֝-x* 7.:ѥa-#Ͼt']#N&k$U+ Db#4kb[}+_. 6~r:)OH&=I͌ Dl+FkبD05K)qj;Ike}(Ky}V|x6D9Mˌ;{]>}|q8qZR`xK?3XajAE MF FͳEFZq3dnT)Y&ZP$,k-yI%cK0 Zɚ's,F#1xuC}sTg?>j0HC1.+tY&o4{IVHa @>D(bC 'p.a0Sq[Ez0xN\?uǧ?ۗԇe' L$91 q`K9#Ħ E@ͻD'!Åc o.Dkuv  a[M׊Aʠ0DlI]^&yjyAɈaqE9} ӂS,sm?vKsNx&de/3gBWx3Jލ~ {N4r4rBݩ#_ڛ"hRfA6a$sjq=pd aw|cVF*{&6e7B$kufFߛCܧ_}1c3in$:ԡÏo*:ZFWYJ<Ɩ6C6Υiߐ@Ky*`Xe.ƶ*mGUVc.2_}n'Ér[u)D;KӞ3;-\7p@j]0%'5O8E9HvXI4J!!Hotdc .U 27+x \$B obfrfw _'#L%F*P8ٶG/>v>N'0ϖݳQ{od$VKoJJ/?GfOv^waLg3zxHEX9(fJ~QCM.Xvj G5c .Tn^ #3.q/s ʉĞ_tuC[l2eW]4p&аdZ -,(3Bŝy2p9dyVzAA*Q2Pb;}z$-R:g[;\lOYzUǣ{)Ϫ$AN(9Ot7WE]\L9]` cFaQ,22[Z+er) AkpdԖ Soa r}tAa}5kڈH* {"6xn7b{eWJ;^. IQ@7ӣ~?+˖L|ǪѷU:;>uٸNUǙmr]c67Q5!quulr+,XWK* Eb͖LÐ?\]\1z uC}VrR\zͿ[C^b(vE:-{\Ҕ~9HtMsKkfwr/nCHi*@G퀎 Kk8:tSo~ Mz\:+6 HX%c6HSb\ u/2rl>Y)j!.)`>љ$a`mֳˮ1LH]Q<7#'VvMZ+$'5F{wqZ Qt Բ!eLROJk}S__S1Nʐ?|W-p/Q1'-RX%oQUb lJ`LTu Erh۫ʔ3;cvzè+WY㪿E*CPTmw1ECbeKk@ Efl3Ĝ$ou-z6H'sN G{]wP>lmXiV?[zPkק[=p;2'}r`> !fPl+rbSEֆ.RqZ &O2;^.$c&]_sn֌ b^MՅ\u oo-Q*RámC9R4:>!-6r5+Ȏݩ0"]fҕDE2625xOwܶ ܹ}_~|?1?/{G!}??|sotqg={3Q]lJa'x;lmNdJ>hr8-?ْ`dds"3yf 8%[G@uxćC{uCW~ev ?]VܙO.>Hh8Z4[p=l̯ȩcmP`,~>x3zlu^?ioGO<`s#yg|ɳ:lC }(an-!p >TGͶ(5biI4":C#m2[D4_%*ooQD2rGqweU.DQ󑟜l"k(w?M]99"GkٲKf}j&jStܠ0ǝtZsqdjX2A#>Io}x|O3~KGKx?W<}Yģ*Tw/=~xSDvθʼ{`.Y @uUc-qYːtBxf'WR5TJt~>Sw}w_heo]x۪plIPdPI荝!5lq7,1 8$PBljG]` /ТuĕCaFԢmXP09eqlg֪N{'fu.^24f|{Cf0^* /MΫ]{J+bGk I(¬L[.Vç?|?x~gQ\֗:j[5:FtlKZeJ:blH]yCl.UrT4O =֜ P8ChILHkIQuo!W>W &'eFax:Vn-{neN< >-R"2A&bJ6NtuպUvV^k?r7_//ϋ?¿T_ē2H08\bJ)y(E"bO%:8#\x u(\pJ ` pj;邠ĄIUX$OF"ܫڤ2-{4NyMyI]3ʙ3e\ˣ5.b9ixPCl`1ƫ+p; M0lhsNzyrb,?~ 'wK/|k7oЦ(f#p2.ߌ> Cm.νO79$c feѨO#QhmїLp\ԌF^ݣ<:ԯ 87I݈xxr۵X^% Qג"v A$NʳwA |m*.F=q>O^|ܧ?O>uo˗g^>ŷx+,42h$/ghԯҨ ;.u 7z>X Y{|׳{d>E???0x{R/_տrqfW"oVn}"gWWNM v&0ʰN쒵XgM$ɪ3=Ƚr@P (6!@@BhH9Lo=5}zLh3:#5#hM HЀ( jˤ**{{#"3j%Oanf{ɨ=a'jzčAuM&^}:^:HqѪq%7n9o[9hJE)"`MFdqLl TWupu#Qi54&JQNgƑ(5q u]h]jT*np 3{z=D6tm2meeesi8Wmy<42Mfk O엇?~OwSSc^=ϲБdC2JI),}Fצ^p|ɚ+lA &1(.5c!*'R]8VbPIr"P}y V f@ՌSZi) DQ dX*{ Puz.(9*uABZјBaEr৯bϽ Sw|_={g|,"JE7ZML)Zho;/:,5ZawE>FELqLj X+{MK/Jn^jTu"R/EPEF[]9(n X Y!jb~BT" e0nM+sh*U෾ub埾r6'S'{{oѷN8.n~q{{p, i41Cf,}kYVo  2F!Qհ( (C7DjMKB(E / J)0<.ꠥkPU` V"P#r tý'6+`Ͱ| pFHrh> J֣2A[N_KNTdtY-OL9{~mg~`MC={vl{uo8tϡS/iMm?2ⵐL۽@uZ9xUNHNTML0u:\zãu=#ƅp\תFS!.<&J k¤H"CQ^x 쎇hu'Q"P623Z ^xnb{S_ے4=ѹ _~`} [¾흣ϻrjgܿ{vqޟq3ݒ -KE8,WI؄D!kc-ș`l`BF̮4Ieȉ8М)#b"˔1&ĨD8YE焾aJU  ;)5BKC |t٢RjZy IyR"ϲA{JE* u%64V,HfJ ]ç -޻V;yjrKߞ c/}mS dm{ v}E:ve'+nӞRP zNKжcBn0sf)Hf3WL rx135G1QjTGEOkeR" 1^DL}n`UE6ix4[K56X=2I'UѶUmK^¢Yt]]K?-诼1W_~s;N/[zwQ1@1&LYj0jc'_Vjo,ۏ6HPX1514J T0!K?JZ"ItT:!Uy 쥫#[ֺ M8KmŽqovkkVziߝ ~/Kz?}ffҹw~䷶W_xϟ}ss <~aa3w~+k3/{ĕ[+>>|hk=XΫMq,@W/`WRnp2opCsn:kǡi̚Hvmٰ-oDrjT>/-xSPU׃2C@|Y-r _41+X_t] 5-{%5k+vLTuu?vy뱕#ܜ?lʎ W~rC:y t|fʓK*WD &cL<,y`V&RP/TP>iZC_4!2H (i鉄 z2jkRU)*T@Z;nJ6do*p;Ҡ^~GCgP4:jhkxȜ#cb\ջ̹Yu_s+4"1D +~-ox;w>ʉ'+;}+g㻍N{,S?fOW%eKTz]tړr]NurJ QZ5hZC|Vo]6QȳVbܰŀlݥε٩E ƶZMF# %aJȁ_9'sn9[_79_=gOlle<`櫶|s}{6Nvn 6nNYvֆg͉:\)hbdMP(RG, zW ZBi# T09( A%DpnоD+HP7x _pejuKш HԚ2V_jSNEQfL^Vs\}s3A5 `縝ScǗL|O/_+|LyWӓw_C^pB¡%'y۾OwLپf1ile⤟Rk E$yɥ@r(aޤ H j ~XS׃\f3BWըm5<{]JԘ+(11öTA|9 Qeؿ/۽su+9sg?ϟ]y'9C{+?}5?~햽5?z;ǖڃ 7ak`LDC^34w׍]4h() e`,+{$J(?>2[Qwz/Y!>1s{gzBXqw~ɕW>or->|w~} ?o-L=ph[v?|s綱ީVP/y'O}"8V~&T a!06\"k b (ixn 0N1aK\EjT>KrHMa/F^(ix|S}DDd|jh] eXh}LL r[&K>aL=qaeev-;͛-;w_zڔɟ~'ΣӖ7-[݇|b1sy˦s]sWwN/g%'9D(PAc Cn 1L2(cd _"U)(K0a=%$Uʘr F!!c aʘ>M+T0E֐ܬbH֨@W>A6GL@׀ ZB)%4Iۤ:`ETVdZ'aK38-8nE"a6Q5CwU0Q잰.liY?;߾tCG^+>#G=׏,?WEН_c?svbzĭۿY?y"rB~&IG{Ra$y2LfPYW]T?^gSQT}|Уp&|ClCUnU}nLDW#lt([k3n[.[WvyIqjkJ5K>u߾βxssc'<45m~=~W^;߿Ws&6{+?fzZtD"(5pal2;DzMwx޼}^֘є;6Yicն%tԺ!!#i6~9\~Y*:*2 F˔RRDjM-Tvo_}`SWU>GBQYꙇF5Q"7]%x8K7ȍ6jwjq Ic2QC"i8D+w"Cd̅d5tIHSmx,#?=~j7\փw諟>1;],g^vqkwrö~us_zx-GN/_~Wݲ8 /Ϲy r(Uȋ IKg qԃ.9E-aC|#TfC1bGyxe A¥I+&Iq֞\2;w[v1d"&PJ, KsQ$1F_TWhpdI* U/몞`Xt4}hH ug{ln{&o^}.e26&Ze۠u2BDPž: ;tiacx 57RmRPiMk>};վ? Q{AW@EV=X7#t ISR'ZYkTDPT -K-CLbLcI-2d@:]cE^e[v񼝞>~DoLϙnʼ|O_U5iNjCDS cWaB+C_{EsKK}W/}߾]ySC,v~fwMۊ{ ^/~'/,C mKMC̀a+YXdÔ%2\AFI#Eڈb|⩱GTqZuܾGtTngL eΝehR(#hI6~T ƒr:/d:,e MBڇAD\.i|{A+cXKi)6>1玜/N;ce}?7sm-)˧+ܱK ?vզvzgE/ ;*Y@a, += +YE S=R%yRǠe匜` D#ˆߘNƆɫ:A4wxQK4a(C|?cMpD /TȘlΌ 'N|(cΘ3z9=΢kY`n.%DhMJի׫|TEl'&_ZjkඡaȟƤevSlr3N\9[h/;G2n;5O٫ß?t/~-i_>y U4u2$1e=i%BܲL۴>A H&ZwE Gը kJ཈i b@) H> 4yD%ؠV P#D!"qJk gHQxe2D:fUX8ybDnuŊ|䅥w}^K/>U-WGN˘3Oݻ+vY˳Vt+Ja T85p Ss  JͬRPjt<y 4d}Q xAQ KV}@ }Iq<{$4(qW4[3*kyQ0 Y-T8))zGA΃š fa_Zj몓{ݻBۦ|9_Hk22־ݸ'n?zzĢۻO--wq_<֩3C^B(:`g&= *KR*' n^kIiqz2/nըFúфzY]%wMX5W3X\(V'(UMCKDΛڶ^obԱlvLfr.mDZ\ᾓ|_fuGN==~[>7|x@}myp27ww?S }*;|cy'dMO]rT#1DCM&"y;)Դ9M<FyZtE-Y-j'eR*k֠GP 3IBȪŗ*+m<}5U4hĠ.YC`P| kW3))t,ߘs?U)d9[*:>?G5P@U9Ut"BQBa F r&ׇ̜0cOP[հj˲^0()U0KQ :{&;- nMu6tyQjTzv)*)DYyu ֶW-L׫eq+^\ZM$mk2CRN,5Lm32mm ^u'ɜ?׏_㊻a~ugN?aUc=塉̼%G}oWWP5`-Hs %{_Bkp\4:Afɪ. JEFPB)AC.pNMu$ -0mitTL&eF)SK02ȠV*#%M2jөFr`>Wqs2f(㢚$i: 4giU3 !ho A0I@iaVeH*P'Joʬ1&莛7?zczDx͏{gq33 k ([1ەR  `r[^5j񪥨zTSA﵎aU0Keg ]=Hԑ?ӨF5q=UVϞiL % "|2KPˠema-=\6Eut3?6Ww +J/<mKf}twܴCzna|WW4uZld\9W't=N P ƒ! *:b6NT{Mf2IΑNPz-P)5X"c,SGc"rFF# (zPv, ,j@ad֪P74BI.΄]Dj{dI# ^ HL"jOkR+.Ku<ٴ{'BF9 )3Řl_;cr'} ]V[o'HTӒU&8b& ~%N\4-zU$sA)6gUjJe\L5Yv^jq@G5Q {!bZTu\DHED G?m(DkhSdXD1w23`lOϯn)9(N诿%Opu}gOͼg_|/XOtx'gWqVs`}: )09CS60kic*Vd  `Е2+>vȉ 3M\0eNQPP{iTJNK'ږLDԫRtCTAnLmVlc_jh aV(FAϨ$`@C%TD!7ZH_sZIU%4lu`5>;b[[{kO-/>sOߺ_ݼ+}^& Q-DJ-ɜ-QD) ,ZGj^wʯX.5 E uPTGG5Q}(qSpЗխd7\ѽ=<̋zU'|"!t0ͯ?V\I6Od{2|:̱Yt!,cHN]֯<>Oq"7ܸ%X-/7rcK+O:j-,,_xͭaý;3Q8q-K팭UA=2+o^bCc/(ӾJ)̰2`7-5:T&0 #1'm!L2r"[gDv*X8`t%^T &w$"0L L(psR@X4WFMx푄)SLʟtׄjGC{~3GN/ l;α ޻i'9[o:'bz#1` 29r3qF\D+NFNi7F s -ӀF$M0ѥU4aը]CLxTx(oTeL̐ Y*T NvWS!F׾ <1y@RxUUeYibX(س?+];).?tz_ɣGO\8WϖO_\"&yr8P ^)tg^㚚" b)%0> s25d,[6| ǭeき3J `A`bb SLJgf A!`5J;bԲfH9:(|oȡx Hi2$x_r ?S}`X`Ϥݷ'=OO?339v9>_Y9/~y?e|dˏߴ} }pTBbpiRnת@j(: Z 0VqSG6>EԾp4OjTzKK6 |X#AZ$^`چʉsTLc =\(Z 1R(q0Jn6͜]}ow+wwNZZZY.zٍ9;w ,͚1:v80J xL IUte˜%Z5șMwRCE'e"% BT2LJ8EPqdȘN@Dx >oSnd4w3 P)JT,#6 Mq5jdI5nese7Ԅk]١Sityx?TA UH̄_&!2; DD L!LUasbj<ꑖX XuixzO =%QjTzFkc7Gjngxxe!l0gѥh޸?0 JՐ*팗 acɉ)74nN5gjY@E1<斁*AYj3:6k*`vO_;yKqk 3AE#h!j@Ȳ!gU]| /_ V`= GTRXP NVc/h)`#T:@!%@C*7&E3O>‡kJ=hr/ūcfB뀞iF*)$jy{5~!fgoj[%UBC^BRz^WJv{󭗵rٻ}ey^; epCh28 k2ŷ&J_Cq $#kTճXjI{F zZ%}e0;ѐȬ`հЦEgH =55yh +T%MiՒ)I@40bH^Ny%-M͕Z=dꮔɕ-ͷO=1=ml-t̮AQg ;e'H63Z@'7% lH &Z8{N.xTa7go%3լGeC k >]Cf? > >~ՏTŀ={LÃ"t'4toT2,ARGf0SFXz0|w2uBup^!j"f"(y7>=z-Yʜ T཈&3wQcCJ+WWVldY}0J( tR*eXrd ԋ$EJ# `F hҳe)rCNW+`[ZV:m5/xhr@TǥʏUw[l"AJsbz!I0, )<Q%hZ:8DU4iD@_rNM+j0e&K Cm!N` y^/) 9:gK"2tdWMf⪘ *U>PhϤӤ4Pjߜk6*Ea hNۤ"UQ^T-mi(ԍM]H2FuG:j^99sqv CaF'TpިF)ԳC^&* ȕy g4tEș@)R_PTi"cNBW{BPhe&ːqpR36 .Rj,["Ctp^J $xm8u" AFVz@L>3 J@FܱX. :tz"VIY QX9b@-J,qaX(꠬*> DPD0Qf9%(K) mX$hCčfU/yl&5w5CפUf\CBɲeQcߙ5`F?W4Zh#4 3j-~QjT;ٍ<ϯm>c ݲw9Ȃ:L6VPuj)dc^Jt˸. UK19ձl-c X6=4ڲ*\kvjT*I%Udɖe˸6ؘ4~8AyK_ƣ#!$<0&{BH,YT*uշ9{5{޺J0gZ=>{o~U\p ^;^scyE}{2gJD (0d(%«{Q4"R (aDC&1}ì@`(wMm6SATŦ rDR&M)QE ]6G׹&c [ .@?̅Te 3r/S@*=J\Ayu&;:PlYetNϪG*m6zg g5l4WƝw`h|}x1%&4,AS0_Z;"5 Z*c~MBd{zAÒ,ʹLSb͈D+;t0lm%D,14d;7|9D 0U6:ɅA04 "/ 38x3XiiC 15M 4 «Qi0@5d"*G3c -aoL$Aͱ[9DUNJ)%͋jH @+ 1Q=RQ xi#$ G9jYW5ҫ<6mK x('Ef„ف`Zxqh#qoZ5UeA] au 5q$#EWA/b.P>-S8`+_UJXB2}Ү~+ 4&-$]eiܪ;0Ɖ "uYT"=OU]Zz q cYT z\}qˋ̚E-5dܿX8w LtZhO3eD(Dr@$ CsVf]d9 Bspǭ5mv)B* CUjJ V[d˦$Kb%yS$mL3ń_N#hU?]>`޷lUw2T%pW,Y&%bP;e:Ё2-FuOb=lG&[C|QOTj/Dո5o|Яc W^O^Ħj{UUUѺ)6EO]z+=k=zMXk5YXvf:f"`ʨ̚ɆsJ_['e,^{GX,e(k$-6M#l֘64C‚̖fU^'3jYn2HS"+DET0Ș{U  紂(JT\̪$;Q ޜ 2 s][/H!Rr`&NPaTQr\%(TvOZ\ JhN(n4ƯjHALąs}QS7 9ok\7s/e Q2EB؝n곭0 Qj?Dq3#QvQINڲ-U[knz/u)kʮ~qM`5|U] nE$J:`8cc|"i^ !dLfL" ^E  %Q5L1 fCTsG@@dRM'NS%!̋DH&&ځ#60}&4B9-WR!'0@Kǁ8qMWacvN=N5!,XHUPCѯB$gDʈlnӣ FJ}i7៾f|;='k\w!4pŁz} }f4pUo–FJ'bLN{1ZL`lr'$ aH ʰE1fx_04YϜ暝 ɖVH7' ,$*ݑDċzBaYsq@ C),B4X&%̅Jh"eL@!^%0a `"-D ΠJ],HM5fUux Pa1oPWT-{dC&KJƢuȔ>!Qb5 )@sPKin=;|rsh*!XD}vf,n"_]%Ӱ%z>/:1e5q륆DҺ$6~@`F>`zFwz׆e+I 1hߎe::_8i1j`mnINC`-n. =۶LMOtj@Q*PQUדd.(lPr|!aj0 T`Tabj1Kk64I]! 4 G5W0O D@`Gdlp5*rT v`CտP @|Ȫq08XA% >HSCN`&zPV>-Vmſfdh0ZUis3 om S1{C=9Q>1#أq>.(TUiShCj C4]k\zɖc#4 SbI^4kdBO0,p2i(`) 4Cg{G &LgZS-li*έ:Cv\]&3)rǭz5ռ+<{Ƶ-炘Q8鹸2PXR)2i8d\*8@  NrQ &BDKedD05"Hs"`KLTҽჵ<_6U1W]S(JiVBT6$BC3HɤS[4LX*TNDzuOQ3T%pO =-<\kSKM^X҃nvOc_ {8=3cQ?KXЁ!ژ@qgp\׸xzz9ڧ jDĩ-$dUz)ٽWʉ|=灌y2[L6#3RP4mTJשdfmi]ӗOE` @P![08hI1-(CUUE5w Ti!>dLp5NMe+ʀa6YNyu2BbBPWS% OMM݀AZKZX33eDPR7lPRvVik\[\Jt$y<:Z( E4dLEUs)ԉ^iϡi@^{i;0˹vrN۝Sv23!/9>Od c/߻pk Դ0(DxBx/l3Mi8AWJ4F-'0xX1Q`s84L4Z66R$y[ZZelM~6S5ĥIuHuV$TxgKs%~m4O]oPE֨!ÚǕ dbrG4>KƵjI3i_ 5gzK)}ZQї%4(DY~QNz ź<`RNL/ᘇ׸Ak[ZQA}T,kZh-MddRĒcB8-,Khg$TQ4=Yt\!  b"@AW!*z+a"E!l0:f5%U.Hl^%U7 a ^%({xЩUfU""D'LeJ="bJ 7Rޮq`@BվAUʠ.uВ Pi0jVynVkP TQaFDյNǿmJ빆/SB Tw_?X&FLPxk#l4A^a>z]e'F޻;&Va~f{^\}NTjET3yK ,S^^AÙ!RfU?zʖF-[c b*d,jHՉ|IHCۇc3, ,a$?= Ȁ̠1/ᮓ) @=H 1&x'򂽆1a 0-9UHjZYB vQ>1qyl?(كH鷮0fJlҩ@k/FuTDa!RxJO^Ntg Y#kzBݶ}p@S J"t'0hXu\ bn,ɺI/QME]G#'K$J4~&{d<|޷ϯX/ys4_򱆈C+ JtȈA$9fiy IQ7yP„ִh*mC6G}=+iW4ъǢ\u 5q]isӟ3̺?p:z&CLkVL ^{[&![qPR퓜;9-[Zd-td1\ҘnjOd57]sc;ѵypahM|eUC|'FX.5;b&5 CErA ,uz`=r gIUhgL"CK L mAP%"R2{*r7pD2H@\z_a h$edd$\UOoԛ*cy$57jZ*IKjyy#jf#Te lbTA0w>2w@u{t"5ᗾw_ƕ'K#mGF%qG\KUK^t]Տ7ChdE/2 op:Փ<> Wqk\{ )F`#QZ6Xx͘2԰Wg^j 1avnl0 +] d@;]y|֌ekI[(zu|)JwjD!SF* i֐1qgP!tsu"V4&{ AEA!f*DW!EţIÉ(A48G{uu"^ E啯vn'LT+T iiTV?TM-$#L:3u%DH,BȖ+h_s% Bn+ݹݬ̸W{v>}0 (*cxGB &UF*XZf"&2L#MTD> ƬQVhC5Wu ` Pk`@(#n5)NAzg80XFSpKL N# wQr#$/5j>!Xؤjѥ!M?jm 4N7/y c\: QQ8#mkCHW̧3-{~M^qusٕ7ss 7ؽwהx8k@<  [Bݵ S^ZG%qE \9ml:qk\l@0eJ`e-¡\@ZꚓI5d2JQcL kGKD0d E*jx -cyEp,g$t5rր#hϤMϺAU~~/ ? FpN!s]Y{?}^'?1s|wj7F&?@ ˵QAlu$BT]£x!pAOni}ct5q=7Vx\/߂$%E;5aV<],vh7(3Qc iWbW~+aKY5?޼U|#_8t-h_?;毟j 5A֚FfD1.|EE; ` e el)DӎC!Zmд  ÍrpR̾* &VBhXDPWQ)c,{'Zx}=FTD*18QY*bšH"N,@QTK(tkR*C5TLt* S>@HZt]k=:syӁm_OmOF apl-BUEB&{-Q~ԉQQR>?J͞!1׸A4Ƣk G*5%j񖥨aZ z^D"l`A l6Nt~o:zk_=sm^@|[oO;vn$+zx`jA^ a.4R!3`F/ =VF-0 z II L tt(D:by21FUAbW-aLBKJTZ:Brv(eBDOo{K/U*DЪN1^*Z|}Қh`␻ذn]q1/7\7!;9U;ݵل~{0\Aʛ!qBG>{ZѾLC[>tU$ҳC$4 qk\cDDi_|x Ȥ,K+W zՎ(W,udB:\z931d~GeN{v]ˏmkfS%ŵ_c'^=n/ZCфRKUkGP_\4U4Paď"cs]&??׿Q'3;._=?7g^-K玟8^=plPIOpRE|`@_ORnע kWЮJi5aezן9{ӁmO_U;vtV>®?y+ůr{.m?P#__w&;;Y&%KLa3B( eh ah(z 0xSfa 7785q}sPY!T i&FD -#S/?~䁣s[vn+N.ꡧ<<ç9i{ˋ|aZ"50ƫ^-g0mr"Ϋd΋INCS zCbrbG@< 0n2 UE)L fKhjAPk9cQؒz!C-E+2RQ%E >5RP!Y\g3!Wʵ O}6N! DA׼$Au 1<*XW]D6{fX {g~S+kNۼ+_ۯ>߸gWZON[}䉅^]]#%K?Q,5=Y&渭c#/g M2X\ m` ;3]j\7 fԧjNX.3qɌNpyxU5 2ng ^>ozS>=޷wC |O_|G}7f{yb7louy5~՗[24c{}]ybA5q]Dy<a,RTm BƧ iӥtrigmS-~Ł_xdU7\G?+z٩ɉ ^~h#^W9ESfA+eb)Y6 6dV!X0QMIC_Ta1Ѡ Z3NmQ 2)PhXnkNrJh1S@A.XADl*]>2 1ܰ̆R0!XM`nAgT`N}S>IM r5w45a~rzrdS]|ppꛍ|vy}4c{{/o/~K5 iڟ~}2a( Je"w>!TXD\[:82jZchTo=(]FFnA٤LƔո5p=3 J ` 28zծj/`,M 9Qo?_BD7]?u3¿Uvx./Y݇f_>mO/ W-,asW77, ھO=b=G<<%Mk\72}%w eF΢U2CMCS )tnRoW'ymw><Ǘmԝg߼#oym7]u~8҅k/3s|OUI!" CTj."2̙ CTITByU/)DT5]Mp(٣IB?!╙vծH,YÙa6?Y!YPz"t(D#$9԰|0f JgA- yv%JxNg 6< P͝PɞHYDL }=~Hk芉"\#YTg̛uh2Z6);HܬF^ߦ6u;t'꽊/TCQfX&S;@ᙚRtErk9uyq1G]}㮣'kz­7]93;ٱ3kG}cvlgzL˯έ8xc/z /p>pXSXְ1p"&☼B ҈AW \{֤֛5dR W]rY =TBl&\JDE`C+e<%%/'DNѧiz#JhU]NڈD,g,~DU;k `I(؎;k̻7oӚ_3 [.m_˾sS=f2lA!,zMkh<}KE&>~b/ztOly-]v@b# 4LE+n: M;qGW"7Kk(kn`okc7i߶1⣫{+; -r !"-$^v^z= Wί<M ȧ|h#Z:J3Q`j :zX%1 hHm^l#NQ + lVZG0 5Eeo<)020*-;iLN,w.?V|.+koszͷ=tew|}1;N:b񶛧^,fW]2f9KL.}AT)Z[OjpF\Dx+ruzRhZbr>1q+n:ruE(6\ZcLp4O =]?] =>=~܉cO-,n=yU'.|^^n}o',a-OZ!ƶN,^)֥#E!JA$*>&0y/$$6wxɛ 0 cXbl|R䄂Yjl3y!,J>Z<^Pl6ixcpGT1mPat7DY2?GԩTSm5PI~8;WgÉ%5E8GemrLied`7.cWY[}+^}|ˌ}X*̡K2~=zlu3+v䜻7;D4[|;聧UK[^(&.ZjV m`U*3>+lE*ʉHPő3xh]Ik\@73׋&bózڡrb \8cR&+e13< ,ӯ|7O>ΟvӴ~gky:vvS߲z)96W,-b=-ם[XrK֊Շ;./}zW'!#DKxW@B_v?ĄP#3^"w=@Ȓ)* X(ԤBD>&*!Ylr Ȣ-N@&y ,2=1rq/R.ʥ#BMX*[Q@P2 f"⤨ {ZS+U\qؚ `9Q>^)/^DdؐM84*BND  Vuچ8bTg˷&Rw&TG _MoW g6qC9Oq=!7Ŵ*īs#{Nk&ʝ_D Q1QMijṲ0̰l2npܘ(cB(T={Ȯ©bp2B.^5pL,@9tEfQ3EEBj_c;m&(bP8nљ!:,ᜰI/@& R|BHNc1Ъؐx:H75QNi<\G&ݥW=t_ Is`}dO|3ŧ^w[}s?; xLkfuW=zxV۾t߱O?|cT69 >Jأ`4pKfdZ.Z6c7՟8ٮFcj\/qq"ArMR>?_.Rj|)@j.[Y}饏:!g~2=;3ܱpoSg;l>q־sǎ}[c{ӏֽꚜ^)D_L# PxѢ6Jd6*JV!¹+Y҈`y"4(LDI$+~MFI@_MbQ3B`DBPqvO 9Q@TVҸ?ՠb +W5J L;TTeuP^7j/*ԕ^5k?}Ԡ+XIIkf.KguGssG{ Ν;Z3mt|(4)̠23ب>YMxwG :lĢQa,WܿaCxA7/!5b+5>ABpR]Y22ÖP#73goa_oy#y랩kFnGOuE_yttlm]Z|~=vb]M8vwfQ/)S9f5wʈlf BS!p @IqEI'Ridilj›K 1$&G. ~!֨"eޣf-QYqnD (4$R;6?jIlqNXu%D6~5Q(ioɨh7}D\1c?HO\Wq~x7o>mTʀkvdZSG>n+:֖[kN|⁳qi3C596!/#t6bO? kDRBa?zx³lz|s)G =;y,mDk\/ov;+|m0iPÉ%ڴd {pv2'݋;|=w?sgGfr+wLXa/؛q3r^w-{'yoi&T0CDa%2N id0+,`$1w=4IrA@"k:jOW&H"x j-2IJ04.Y;}( (p('rcZ4܀( TP@!k ÕqS&P".Y$QL:]U$:8 Һhm?x6v;: k\׸)RҍBtx9yeN-&< m_=<ФIwBw{[yU;N-Y97Vm!MɩWN6QwPD>]oǾ!pe=`9薀NU z*,QBCA<0z>RRĶq RykZK$ ٤b%#)fWTERZ)%qTC*Z!#9 bC։!zuZL`%\6vY:C?Gk߸@w)g_:*|}w~UmXՇ(J TrIm5r(ݠA"F .>Fto=Էu|a =Fr"rR&7F"3磑.5q4Vu[Wk-p6\.t&S^ +n-n*=mE٥_65_{KGs[LJϭ*怇PP@{p/ eĔ՘l61s'BMNiQ1 W9|">G8Aj {DKχy(au/#`% 8|_WF'ўhX[CKVU4Š%zI..K4[LKz& H$Oa`* e*YLkY 1PLNjݪk^?|m+/`nT3=&ڱ%={5_;R3VME.1T}7!3'Jj9%#hb$uPх9`GQsCHc⟕55o.vNX+h XC[_=tydDī*6yHHY( @(,i`g > %YӨ&E)MװaUe`:nf NTT|j@1r4'vŖTM$%S9+ZZf_%0` 8R^~iF&hul8j>\vMwY/z[ݓַ':Ə㏟?'f6ٿ^2F8pW_R5Qjum.$ɪWռAyղ78'uƮ+ʰ~cB{X|5qk\_ uKPu/rDTL:aLdH?|g<>Sn}%]^t| gNv:0WdwO-%rKYC0))+ J@!Uh Eu f2'6r㤾 oADeS|E AHjiJ1 ! $:"L'TK) 2W#Wo/MkLu ^ۑтXnƵLUrj&,GGzfҭ.v姎._}O|{ݖ]gWΞX'۬4N,>ݿod]ߵSaxvND%^}ġP&lh>."hה02V:|$5qYp995PpIt ^?ŧ~ne2uT\Fp kp{=st7I2תXFDe9_?37X4Ɠ~?n>7h~֤AC3OqK`j ;nTu3A Lb: Y@L)F$24T`F Z (-f`P,sR Sq*o QPtX.3SL#0m]9{(lCj[:d 䶨\1?4}ܐج̹8_vWݰ6{[|u<}ѱsyc 5ק6[o#"Y"B8APj}E$ٙ!xb1έmz^kX=nrjUZ *$`mmR_Oda$"'{̅{ȱN|~t|O~~2\?3u7g1tuĒ3st+Egj汀D)LD0%*2U:Ĥa#S 3ԒV;5DeBlּ[|!Bt IM)Uy{82BY\ uZik_{ߕ]r ֣ʁ( jeOf*Bfƨf{"}x&o:1]$;ro?tv2ηvhp:}w;|}?>ȅK3b[C x6lpܙ;;ؠ(lx){;jYcZ._clص`qW,xÃ+NkUZի='t!M!- ŨbDMɃFi#ׄErG[s'yDNO?y>7.CSyۉNE4xEGJI"@5c(CTQB3>k%:) hxC0 V80LBX `bCHԜrXp(brlK4;*48b}G9N*qUpB 1TYT3-hD֢@ bChۙ 0i~Iȵgwٴ4d:hk$`kj9J.i۫`Mμ,olΫWA? 㗐5O~D}\wWM\ժVWz~+InVL\Y?E`"7 !)dۭmhcEYS 9if陭vqpo_ڔY3i HP4\grqM U:._d݃@A,SCiigV+ua%pͧy*Ljܟ: Ic (s9J2|퍭f@ɑI$k8-co~>QhB A6;HnWjHkf@06Yk$Ԭč{Χ_~bwb:'צ=l*꨼GV)հݩsTθXdz!3)%e_V2̑K~LŐR5SkDMN ;YdCq#}`Pl0M@ h~;_%rbˎmVӥ6 蒵)[BL]<DQFZb I:ÎSD`Jr#Y2\#Qbפɝ̺c֬=` N|_ :dאq2KVPPg%C#:~Ӏ 3߽aYd|A1{[Sݍ XcṘz)lY¾vk*}ٱ~l4 wX%zf{zsv%)g+ٯN&7"'֏b&X skLPR)[۫C^q~:}kp1iWLWtEWWב2"WLfZgQ&,iM:_t;3[6W=Μm.& {yꭷ&psJ|'~/RxJ&#-aIO͢V\[IZQU7` > {)%{pȌx{. U'/ gI"YQ4)Ǟ<6 i +" _ TP@vd`ve3# ]FXc%U }גߑfYf$i? 'CpϯZժ^uV^J,杚4pDm.&tKE?u~eBo"H,ԺΒQ 1@H1Jp 5@{iUP3ךBcC^ Rh "]X[?ePazQW&TZT4+WJ^~MSՔ7ۄUhQ#҂(.(!鈲r ! !wqNPv[6SE;`79[whgd-Ȋ0f Zbe%y 8 u`@||;.~\ F'LN{`X&0+; d|~?@wgF[j˂l `cj3 Ftf.msg{; ^~̊%+˪VU%BWke!T%QTwXrdp3̕i^\!7 kMA;YBZ}Gԙ̓f)r [6S k:ԁQaR|Fo"4 HjٗA ]{WCMď"{ X}69Jff;g@, @^HpzZ~/|=:xcvz^$BmX.Bfs;>7hN:N 0%vr}ԅ6-:<j@)U18DBKnt H.cDI-b 5d|+ A#]l4-*Ĵ۪VU]޿hYůz }f35*dL;Yj,J`5NRQt9dBic7SxHd A 8{][ˊjq>)]λG:3<vk;F)S# LwTj#AB3E6YaKn*&50 N'ySvO\xzy#1& ǻzW2NiNTstUZ"$%\G*PhN{7}GO$3.V̇-'2B0b̒-iˮT( w^-lEbkYk|oHV*n)j~!@ve jqH#(ٞZ1'@ 47@ø( |. .[&5X$))C])pph:!iyT ƹRέdЄeݘ]܍x]XWC rjUZ}#^=課)Ka*oJ d ]]bY;ZU3ˤuIIH/7uRZ7۝^nm 魷E1\@AmETnM WH- 46 cL见?N A[d8*r$;a(+G3ւi`Z_ v<B%J|p4"Z/˿MrD$‰d67Ob@6gn]rߩ5B V"3y^GŜ]K8h9 ɓ#Jsh6˃UƝ{+|.!N{V7%nտV} nO4~.}s*WnxZ5i>GGsRboooҗMUfsR`𴢻VUZݖ}UÅy43f4EE v9o@|-Vե*pB}#nBVK0} {O{{= B5tk~i0'/duA]ժV/ Q72Vʭ% `16jM 1 MDp$yVւ|3&vzywkˢp$`"3U +WOELFteLXygDBB-,Sr ٢U$7Q+#aJ Hق}2tm^cCzR 0 %%o?OA-Cpfi%{rEdeD\$wX01 rliMQSw_v(Y2 qaa٬(CS@R̘nKsu2swЋ;ZժVW];"}jD%{25[I9yi3j͹x!D.5tB>c%L\eoHb CG jL}UZq0"(9l8%yЛ?.FN@5C" ;C&12Q ѐB kYArx#FALnh* 66Nfq4Uop;W "/sl(=Ș}m41V;C 0vKrTrcuʖ蕣"H SهT½ob WRsx!20p`gfw쎓~SOܪS a\j"agY  {F2ZwG#9^wvo#Tp6wm,qȫkVU@:ב+5S2מ7 f_&:-&`P5Ei֣]XFGBn4dsK׬vAvR-,EBm0 h@uul=%.K4bލ>49Ȯ2:}.);ˉ/R*t0ZO+sPbm7Bwfg=_l*],f1x~L.(J)S~i } jcKGWI40 # 1M֚ K[^wݍMe]8/ɢHNQj06bA3.ь{'<~os9S~!w-UkdDYwjjU/9{-ܕO78%s:aO!a%%XxlFC&, .u,"ܝI y`c" h zu/?{~: Tj7,X$$j]使i &5w P$E &F`0 ]"aw`i>N_:CWPWtUfY#Qx)c+ISqoJñS;,ndV[.J D#hBơ%, WyZ1ԼOw"+]5dKQ&Μn$T;=yldkÝlaڪ%;_uC9ZCӪԮ@.:xrg/]Ug,l WǤuj]waBwZ=t T 'yDi4![{oDSiDCx'?:=1CJŰ_QHl>nY@&SE,jӭU Pdޝ5 "1WG@Kw2K-iLnc]gZ:/DIzdeBG] Ke[w+ ޫUjUZƼfWd,V;ipEVC .SSag@@H=ƍ&0@al)HB\\X0p 1Hm.:fPU@^/ DA2XrI{H .Yg LkARrO !&͆9RѶ-=#h̥Gy2egQ\Zp=Iof2"MV}",շqdt*c#eQ^4+BzN.5|@m SgOVl>QSsh@&~:{XaI-98,f|߱:zae5ls] }FVUjy)\5yYdˁDC&A(BR40bK{)B O]'z)%Nl3IH0C]!H5:#0!LBւXKڄX-=> hMgf2I]5wsîUnkkʆ'׷>3' DC,`oH/xuLjω._|#n#X/.1K?Td0y+'MgåK;?[pǭ & ))"HA)Ede5 R'GXG]I!0vםt3`o@^&w/ŹBj?W//.rʿSl"M$Z^ RV_E`f[jsyEHTF88 Cwtְ_ͧ7CF]rFݏ`m"B7% ( 0"QDRξs%P`#6 ]^f]l0iawFn*`贄 I8VZ>zC̘~ϟ<`X(|@^]e+n{y+B,"<Z>Iumo:У| I{ɗ.Gnu0BoGjAD8N}5T =+ÇeK\ժD1ֵ Lt]k$yk6¤@ -FrX$0'$Xz9 t`} z%\evcse(ՕWV{aUc i㳢(^YtuDMkB%@b[h"Ј Ngl_4&"hVlH¶ʁu36iyz.9jV n2LA¬S$ HA>rb J5k |wEW0} b*R/VL:28KZl Į%`F9hBo:UdpvL0_ԇZTP{l] {gj{X0{q344m{ɍ'N5'Zo]p2,R|HF}.p8 s W31Sˠ΁]% êSժVXϏڍv.a#!(TNup͟pq`@v%):,*%eW,+m_q#[;xZ@nAny0 o),%̊ziQ~J9@e+CfgQ޽Y8 6Pbtm iNQ^e|Bi&9Pf%CJPKԝ`&@UڄAZmQ0l[qXjg{h4 @KrrH֏%nF6sdƭKӂDhK8hX::*(d44>OyaK&LW"b eb-^;+eSyoUjUcWeeIj{0DZؤ*DH"MHQRQ[IYL͌͏uoS5db/.:eJҍ GxF2\( H@Tw x (U-@^0f -[1hj,=ɋi1U=qI>կ9W: )6fF28@dF'E}]bYQMH5,:=9`[;8YHfA ?/;oZs;ڎ.a2#܋/nԞH=7EZժ/umolOiSi5-lֺlT"MHܢͅNe=؁5[ [N|g~ss총)Hv4/8 MUdHP汸jEXR;ۂ&`0ae!uTM}8W,yX<3( z^QWT5dB%x6ZQxȠ)%%LPC?'yDhdz]:i26G3y{ f>F7TAlܔU`Km_H.}>/;`>~vu~rzke, 2J1s|䪡S']tک$uK"gD*K!6-ֵau|y:_Tp5~[SV/.# 6/F/׋dX(HL˔$f{Y~}k=O{6ϷO{NC M%TB!ZOtVSh]JY~IM6PD2%@CLB66|7_ JtfN:DWHW w͸tr%TOey30}s 쀭 V;ZeExi2{j8gD6U[&3 ID!`6z#+fl.a}*?w[?u,nu/۔=?q 'pׄ1yR1#¬tZgԛHPD e<Q٥~s:ڇJ8fym)ׅwd`TeU70o[QKٙB*.z4y[ J2A!nƏ=pI l}MNo'rםO w_q?e>\ؘ] &3v܈)ˬ;>r#`^^_lX#/յuU<\}&_ 4#I"9 zZCk1Z1E#qB-0?o{?><~i\;~ւKv"Rk>uimMM|ty [d`l$H4'& .C'H x8a2I]a+j5&?؛ Vv@@RZ >ly17ػ e}XWTMg |&`6~/U1T~q7"dX"-o^g%ƃGoߑ3gμѧ?6/}_>|8nGֿ zO?xo{o9c? Y'EVȽ#X?vZ{+ă t:*㪴"^Z͚jU/kWIrt/7B4"!PyFȭ^ѝNkHNLE֢D!?߰9p/~LMoq??v_ϝ~MϿMynN=ӝ0wb :dԔ=ֵj}AL߳4b&_ U4   @Ų%U6׼3^Q6VR,!;G!O+:ۮeTxe†bSQGy/=m 䱴뛳[}%L#6<\B5i䓛vߓ 8z;9~l#ğ7ҹأۺ>wݗ|-=qx윰No?͔4I$9o-i&|!b|fjIuJ R]T|$  HZSr UoP5$EBSH!O〬-;z@nXga*=GWGv8`XwR8%p:gO3X >ljB 6f&0߻!u@`0@w뚎xS?}op>y֯џ|>|w?C_@aη_q 83Lckj%jEt1K~945fnijU/jD^Q{InpaSpI&Hkj$x`0&Q΢۝Ԍj m{z'?{W¿>spCw৾~wW'~_QoO7\wi|fȅ ^6,5.Id)(>fgn5,7t%~x`2롛h|.SmV>ekAlUWm0f^p >""+^gl*/].a=2޵C$-*%>ehq%Ӑ9Վ Wy"] @f-}7ln<Sۅ{S_ێMtg6/[o>\9t~ixqhr"_G/r/y cBWZK˔@S,|bbU=]G:z˭ LEB`J4O)l"o?8ûڳ>o#>po~G9}S ߼|mz{ӗo^^G\hzfJT[^&*)Tsx C }ͧz:s*g<Mz2'b-tU=G<0gFI6Y>|k (z8e6Xs4ޑ'\oTgSAm'cCj͇7>r7ٙ3ִk<VTrM'۾M#毾uN|hqNnno(@C%6g 퍖2/J^=" zԺ]U++ /199 8 ac$hđZX|~gn?y}{Z;/7=ԹoyLsN5'o~}ԭƣk7_\Omkc Lt"[*?94Sr@C{`I:ެӳAI%۲%-Y Y? -taQI"Eqd tO{U~{3o{g bx]^VfVޓ;92c(T;!(D?BkjP)=y2LSDpZ^9|0{:INmpmvJ A)j2$ÍUFi8 tԳz`pЋ$]-iF'ٙ75}w}^~}:|M76Ļogg.͟8מߚzW>_|ϝ^x7_7J6pa߉1s(A7qKkҟ#=&vGοkr u'!EepW"ҚF;GʎGЁ#'#ϕF_fvݪ=mׯ3OOg?GΞ>pjw\sv˳ؿ7?ޛxc{oۘo]'gK9 m}⎙9j rr]Wz8'Ba6OJ}D"'IWk)]@cm,/rxhjW?4(i~*V}().5)WôxKSKNE +(hYO喟-yuwZiδӮFŷyxnS;}>}{wwԹlqM~o} q֕ܭ 3߶6;cQGS?t}ǛO=~q: RRSfR KON$} \ap%0WO`#Kv3vy#'t$uژ L|*IUCo;w{.PƵ>~>N{npvO_?~lzA~݇O.ۮ??:uwz|g 3$7eq@<1 !g3u( I/gIr^ܭ Z0zd8!CQF楤J['Ffn-}dywTFQf YgzԽs,1_91JbYO<9o:)Y8ttu[_8ƿηv.\Fob;o\ڏ81VWBe:4uD4{_d> BiklDzm v}GajQlF¨8"#/|wߴ"=V?:#:{ ~W?sg/׾z|?|Ҹ_M:Ɉzp|#?MW" Vc.L,/Ⱇ]Xk^ɵgY˺)F|i~9[2C\JѴ;9&cq6֬{n[7^3Xwv֏N?̡IG.Uo|٭&k+za䗶~nGg?yNn;>za{/ݵzJ<}i e' BC;]v6 ͗ `DhAm{r[|;tx#bej{y~v{o~O_C0a\ ŹqoЧO><{F]wovݪ)kfP&L{8 IqofѢYZL#b-;|K#:Uk#Z`&HG]K#i_U9RX^^qWI@R,l4.AءCg^xQݏF }j6IŦG,n;27ʷ=sR{g^޵Ns7}8Ï>}}#gsU#I.CL"JaּK įz}0 ;3$m`kw_+ߨZ8&\eo̖|ղ\(lqǎ;9N "~GOYB#~1c/QmmVܜmLxXNh__[;^7ܹ}ƚwO~7~s[{O7wrDLDTCBs -@SSrΆrn͟G?ExÍwh?7?rbş|o}ן{b{h3έ7ܞ*DJc3fu6*#SZbH]g鼀ڛЈ9,YCij@Їb :>3,J6+-?t7 c  '‚-ceoQp$罝ey[8;wJ-, `J O.נp. \܉vRm:qmw]].~1'/϶f?7?Ƶ_7OӹI(Նh&2I.ĭj:,ZjNX$ĦCJJ'# uc~I.Е\ֲ,8U@*%B)> sULmfh㨡`$zejN3m>;}1Hn;wy Wy{o9q.`+҅qq9'mN#-yqB:Veج]qq%c%7Ch*dccxj۾F?l>_~ ?M}w|ғ'/X3ӿoRw$\}Chxϱ 1yXub;c+O?{aK{ãϟ޼x[o;=;~~]2) B,\՜@m14Tޣ*;\jD,LXD&]MYAk]3l_uq]:2\eC|՚HWb]Ή2-~%*tF|!p.I I:;]:_޶m?ؙ;ϝ~?/\a|TV~46o拗zsbԨ5oA |q]Zg 䏥'awه3Md2yN${;Z㇞lHdO3,;U%,9UV'**ioȹhf@-"l07SE0m\z~:c9z,LI7E/If$MsUXb^UP*2,έ~otѴ׬hJMjkj% Z5F.znlϋuC4{$5,06"g9xMTMYKs9&Iϓ:rN}O N?q 1\>3>7[܇_o9~tݽ)te>IHGFB!`YCcq:۞?w|ܙs.]O}Ώ<}j#hP)7D 㴚B˂%bw%p],Klm{J gw+uLFE~MS&{_w.:f='O?&I2Sڎq7?3/=sI ޴n6oTS |>L9~ןiDAE5ܚ4Ւ{-Bb؉hn5D(i~P@5H0~ /g?gD+vޛV gGcڝ9 !AC<McG0򜿔95Ox ",y_gTKwISbU#Z8ɢ 2sϴ"l*xL\Af6*wlCz6f)|` BD fA8C0FM X"O*|G i/SkcFD%-6M K+qG5 Zjf"$S.M+ᘔ 1RXI%,qUXE, vUڛ^Ӟq7!X/y*=by*HWMtbf19Գ`[.[Ѱo,=v#Zd*A.Yb%! IwXi8\1 Lw`;~,%]V@" euxϼe}%_˿ʝwW5ɳ!8"Givz#=0i8i5;Qy`$ɤ4Zՠv`,\΢:r$lh)$$91",zlk-  0dH$[Yv7 @ C\0Mk%;u=$c)Nr>L<"͵"l.`b dԘ\ 0IV_KP\پ@z(q;`cUIݔK/'JHJ'T-+2t`qn8VWٟ?F@A5q%9`F<"yDqZ\ Y7-J s1i{Xӡ+ci`^elp iyp L;aY*kb5BZFt@ keKh@d@SøIh81Dxɹˤ\[5*CԨj[ J ~g>>oЈd4uFB8gDBoNfQg1&g'.׸;fZlʥETch R0`Y, ܱLLr@LD20Ǿhg:*' ̓=97ϻ%;wM;}k V:\"娥EZkTŕ5 ݷ=5p@:#]Y[dCՠ';%(546*ԒUl,dS-/qkw4Ǭ ej+~ϵT} ?$ GB3x(]2e48DT[r#q a0G:'B*R&ϤБ3N[34~=Q;npqz]74[38nD9Pe[LI i,(dImTU;w?DT)%TEo`;BVdMIIvKҋmb$Iq+]꣉bcl0r`/Z,ٗڗ]:vITuftJvƝFtc@ǟ{qc9y)aY$Xɹ!C0 9r9f 4+#UDC4Z!D Q l$kxXA$uX23ˁa~2u; nkgczMp!˭z-~^lḌ%c7vE=W<)M'l'T͙%d#Ccxĉ8#0mb49.` ̐~W9 Ʊ8X#mjuS" ,AV>1kmQBj*ࣁ\=-]me{e ҆j7\ .%cR'gq?QpkN6+̠54 mtƑ1WMYsUj8f hLzA8R3fc07ׄǏFզmP h4C#&fjjVcT#ci{B1MdUP)LpBZQ+90s@# |T,H 1 ̊IAX I^U[ V0K`aٲ:Yxlse0[8 z0?~1kg3׸|w4/ ZUc: HXRS"Z~/d_+hVA"H"i}4EZAL_*h8TZ8,kYz~y+\GVA`e !xa9"%/h!j0#14V#'m6G?ŠI# pzsV1 AafӀ uwDGa-1C:KKdJe&6:12Zi" ]ѷDCHȆ/0  ]T aJpΕ~O7jskP!bzZ0tPv\DBZJԁR} Xلw.2"M/Mye'ʔ_͔6 6KV mqm `$U&jKL6kL턂5jtZ C>!;=(*Q\gjQV l!z5kx7Z@cak( ǞV&!'L[9!0xr4v/}e6v!5BaҰq4lXk0qr{+CAMdZTj֪d⥖2CRZbL%?c'afL8N;jhlDMۀV`k~=t1WCGy!Y*(*ɦ *zg*XCEg?hӵDlu}\NRtկoE&ejih4~ Ț?5Hed?V&,3"Es 3ݜaՋt\r룑ƞ#6r Z9L͜f:,%IH^,X/KC9ѯwh@4K3 mtݪsCMBF^6eA-)#$oj|2 5Qc,rQi*jV-v !aWk˺!0MiWO'{֧8Osdз$Eډi44fmm♋"*g1"FN H'V/9U.Wnlz%gךXy5{riyh)wpb+#IKOЪqo$ !y=B8!ֶ1¼LXR0=o &DLcD,z$5+Hbn sl``haPp+EZ7З|DAV=]A "fq0jW/ EBGFQGZ;{íG.M&o sGVל`\z"<#rK1ێeb Hƒf>K rB+ux\^ظPRye,-kYZֲ^"x| h6W#Vm[1 {k#6gY(*SIEJ0rp`N[DUI9quG!i%‘nh8~ˑkp%Bq3Tm;8D5!Gd @hQ{pG= ,gKYH#9Pe 3ȁ`0!!§^dZD)c5c `[:wcݠ8)=deEKK Z)5RL.yDFp&~| B nSށءqNF'%PnRFÀfV &;'X(wܽwhKZ.HZֲUn ^pcrRjR䫱Y 6fVkZ4M58zB484[ϓĻN`+x i=9ޱ#‘#-d!:0vBaL53*g:w4$1qEfP#0vaM/ᄋ{ G65:- j`CF:dIq˖Omfd~p8ckd5&'W-ޡZ}"h /΢Rw@LD6 HX/ju<-^SwO'P.XoFPbԬL,CRÀUV\Ilh-衉8+gVFV`pb+<C!"v] W6^؋9XWNWve-kYd]d<{ ^aPNEd#!=ya;X$*Lfl+b-2;5og=%9+soDfճ@7L ") eI98YZJ3OY}3VOf5PH"WZFD CxK ھg*3inzWz22N{92Wjtyf|fY}Ǽ,:ݙDnmP5̥H"e^4ڡ>0 H-jAlhƁ `0DZ* tCvE>CȈ,E>'K =HUb .Tq]ҫ@΃`҃>-Qm{.p&mU"nhbN2<&2cXRB&CPuH}5T< Hn2ݩϝ1Hu oɜEH׉h919SA+2#C`xXyb[̌,kS/`\QU&iXkMxx|wQ|wU1: ^Ծ2|aDPI2gJ5+e p^u9AX8G( _~\~ Sv h%0W !\l#a 0L$]}iH$. xDu(=)q%PNHG Z2 v466{fM ED3Lađ~|Ϟ=vnOrFMf"S="=B,gh"ᙲl`JQ U*8u%HÃ.祹'ZMধOڈ(ԯG >l$NOmQdSvڰiTC.z=LԽñ9!Kō(B)@t{< g:|df^7M~Yfo<Բ_)p8(^!dI *NC@r0AdV_aeSV<ՀCK}vt#:r9lzW Jk)wRxx|. ؇nk7DWՎr&Ӱ&ۦd=.Uj mdSA2ɸ2pj ? 6v̆/w`d`y[8x'IU/qΦu\#Wi˖ /[ ^R2(FiQHa@F\ 7upLlV9!#dPch¢PFN@D b ,ECj8j7Ԫ1@ 'zGU*5㊹msPj`ԡڨTrU׫fW뙾4ʩXp BJZ.' m?nZw6X JA_R:hxy5i4p_!]#^PbϡaԄ\)&O`n+[6u+st]o;ۍW{Ǐ8~ٮ헜dFyk:g;f˓9w3Sbӳ \ ? P t412*)^$6_r>#WNP1G;pCAu@j*ԫ.(}P 0DR_@p&t2u2͸tPE Y*]P闺\;~۫7p?7w~ihƴ!ƌw҇=nÀꄡ!-Eʍ@Z GUFMR+=#XaE<1ȂlȠڙnJ6H9AlQq:<9$s``9vV(-4$w+SVsiL^I7l*2B0Hr;gcmlUDTѺP R1.S+׭\7n 6vo񼹕?~{|#Opc&:&gf&D($ 3rKUnb`l"Ph ҤוݛX˯%+oc<Ï7B!Ux.@ PR"ћ [vW])=3@XŁ7U;eKyΥǩp'sͧQw[q)_?_ebᄍ²TNc2 WDkuhMp]Qi~ J DI$ ;Qfq[>ŔΙY%BLɐZrM w2BҪ>J;%Z*uI AT뱉 #^mkGw˦ln.XgwnbƇ|%{rUn0X\}vLwN RI i2V7{VefуGyއ(,j!ﲳk7^#23xw=)߸"%Z]vDA+"1Lҙf]OK;x'9_S[n~Oۮw{=zzyiilz?t}d!ɩz;FB kJ=EDBFFQuW`2YhSd@uCW*TtT |:vo#>!XPeGr4mQjk54{t5ԔI_MksM@U*88s⒝`"}'z9:xߵY9o6qsrwl㋗o}3g-S}]pS޷/CEm^5~g~ $iԪ'ORb`qaad,Eɚ4 $ iE(Q'8 生3t*%R&kppaEٍbw^PpU걦?Mj-pql {q-]2Z:Z..-n6X?ѹ~ɰoy͋7[3k9-׿xGnh&3xdOӇONQs f ;ZEPn-J OJ_Yh;髽Z1=<ÿuZ?N܆`AN4(˂rf[T'3*=RZ^ tsd ٫^JyǛ;?ԡf8S~/_{Y+~ҼOY`PK+^(:論 [h#9鴴#5('#'WHi54E-Jc!#ANoB#$l)IumzKVb)^x ꓉Ѩi4鴳F[GV9%⑔s6nv᷾\Q˯~x{ۏ?TG~zV6Sqˋ.]OΏQx 2 j/>'X.Zjr,'IG;Q6mt|s.|/>ubY^4wi{prNgSs=y>q-+6eZ,-{|+PFѸ1yUQ,0GOJV @ՏdX8m ؂3PFh߰ hnF(o(C7y,ø7;*FqsjZiВUlVxyל7ybQ>ݎ+/N8Xz% Kli:%/uwE{.+g<˞h)_CVja` Im4Rx+( d݈aszնq mi~Jxx9j=c0Ail-jQ,qfw S0GA9J 8̄YMlkmNįxw7~+m߼qSJ ˺wq~Wc/~,ublEO]3GY2yEn(3m)'a1k/ԫO+ KUUG{ "ʙJJЧXoJ/Q+qk6\nitX78*:x^:?HM-1;v1Mbxaw;KǗ(~t3D-,sUt_uk/Yܾ.[螣 ogr׭{'v3K" 3C $tSv暟.Rۦ1 5bI(-l==M:mƊxx|(0UÍ8F/l`N\ 嗒(xKW+76d)ѵi(@`Fmm[j_gtdǷk:rϤm,دߜm ’@DTxN굀 0h*N0ai:7DzM7_SBoGW[:|?k]Je{q_-,x=}l`:ŠϿ`_|S =y. ?tG^z,e[NbrLC) -ꤿju&hl2HREqqĢZLgpILy5)+Ƀy£BJXkӄ*2K|ifAE8dff6ґ;`W3muU"f77 t_&I &r/3$ԯ*9DQҧRRRr"4 R"@t˅)TfI=Hԩ2K'ml~B!X1(y=~gq>;lr׹g/xտD$Lg¥g}+WKw ANEJ |6`@٘4p}U?53DD*P)D~WOg@#.-4־mL?x SEk7:Q:H|1BLp",GEoj!3D %-!2&3L^@ٮ}blݼwYIѫ/ݿ~`sMw6->8l9;fW/f}> 3ݼЭs:=|a>h Rh` )1SG^@; ``o %d=OAhìN-QjND3ըOx|<6kV4iVĕ"F>ZU@j):iU)d~jZ"-s&+vWl&IW(j .t&W]n=ȾܗXrB-_dXZ<k3{)ߴyS,5[/|ω*2Cɏ+(גCjҘLt "%僫F;"Z%sh~K[PD Ud{m3>:ʵբ VD~NDL4ӆU I(JY>0غ Ϻx{ݸ}̦׽/{g~Sܗ~Kq3 ǎw^{O33ʹ\1s'WJ/@`2CaUW"cs2 _#D@V"KDJ\}Wkؗ 9 9RQ1Ic>ߓl b׺lH7ֲP KKp/P f27JLflhӰ0MetG95r$_a[?^s0 ƫ'&luמ{}Amtj}'~KǶl&,!7N+PՌ:v9'k%< RaW #x-^50SK^h / )FuylkyiՋE[Wv(͐^\NQ&Ti!@BRm{UFidFaW0 "6e[[ + /}?횠,8!oJ!05Ξ$@PeJʅtAWSeISncaxx|?uD]h 6QLm*$@Px+< 5<2fTm|Sws]{?x?u7|'拥_c n"][|࿼+G^\2' }zz͠ eDd #aiC!^QZփK;2v1(cjJ:tSIMo\@ İ+kZ%?hti%cC(8j;Wl7_T*O4asMP>gfc'& m<{_/[z~㹗_4^}cyO_]o{+7ZDnwRHիzU'0@IeŴp2DcF!^{6ObQM!gGZ\\qΚ-%d?z%S/}ގO|陷n cǖ\۞9voܹ#SG^FiF@A"IؐV;Âs"׼ܐ% '-`ʨrɏUY# P&!Ug^v._[gJKOg~E!T 72Nq׉1'7,*8<`*T9垨!&X l@a\rCNU+\l3 \/6`MR{S򅯪LC=kA`NQDS%N@ mmIPQl|ՃY'Lx.MK܌w*ehT]1pSN-MЬjү&O6 `&:Gܘ ZGozZC{LDAOo^6v:N=R v~O\N˷t7]6-+clo|p :@ )Q"8H03Uh UTXEˀ W3srѓ,+485 $ 0bhHSŎ2A$Iѫ3lŕ^.2%)')FI5TqBulS&N0$4hH\C_zLuYs4l4քƸBI?Z麄U%6}FIFSO^qdM1ݰ/͖˛n1ɾf@} ](E^5וR q.3U z0((S9I*5ۺ3W\ϗN#.T7i^,ֶ R4k;Dߎ<>J5c'7}GN_^{vxufI&3mB/i*%XTTb^Qj#Uj-1Q0 9THK(9E(yxa2,K MEJ2LUhِwG]Yb̖* 4qp[7LUY9kJ,YN(|*48,RʩX8WA k;]r/{ߴk]EdFplPr+D33c(HڦK\|ÌQ?񂧨e uV1ū5-q#H5Cv;t:u}㻚FR- Fc<,f{PC̨k y(|7=sϩKI d"ԶINDKӾc[)=fr^ /W5@f)7a,?䱝;JEW]˶|/22_7?xO |oK7+KUVB4BWf^ة_beUTߴ遻BK C0e(h2:YBh Q}@$)JEOQ(R[>U%V*N @IbV+4]T 0AkUt i+ʑL{3 Zb6@(!񹂅g64oy =a~|nO7nX#.)꽊,Sl<u 1SUE{R[\ʸ#-jq:pi%t,Kc0d0n/0@*k 0b:/w C47ίq F^=C\y=ʥdDz@$10c2p}RBJt%Ž(Ud085W:vsun\)~%|S?e]XCjdIp̄NF(1 ?JbbK Gڐ) eL=i(x 逇t~4ճ2q[L )i` 9r @i&'wN-pӳ6o_ӅhUR깫C;dH_Q6m-ӗ5 gNT451,5d˫)$*e;QNɌ-+2sl+,k0.J eAͣjlΓCt`fkt(2dsliYZv+[^ӹb"3?9s:HpNGǐa*Sk^ev$2_eUYd_eQZ !#tCCQ5&ˋ'c*}D)P2h@Cl u'w#yGJ^Ej1Z3J:İV4U'ЦvHtTU~ZmP(T7B`]1b<% `Yp&;3=zwv]n?R3}W(b$%i~=礁h] u *5`(g~l:+IdRekf-f_HՕ]&ZͥCj<4aΆ\նѵu=ک1ߪ OkaH)3 B('S>>AQUbۼ,yŠTCUr39 z-L1(34a8֐K[Ѝؕ@D{\y.~֍WfV\s}%DVR}O*5ABdHDx"D˨6fPP Kh5 ݂>%-uoª{%4kV_Mµ_]y*zm*,3++Du!1$#'sbyhdUTxPAdN1pi̇|EYY'f=bZ}‘b(K0kẹɴh jFQ^Vyy&IE|bJŔPsϨ핫Aihgv*5e-Pj8U11  @dzX1e Qu^Kd%3rCj@uLHnF> Rx+j4;(X q!O@-؝Aċvfe%u*-[ʽ01'F +kљ3Ks*SnVj] kxLNP'ʊJRHPvz(X뵪o@Kw*Tf^Ra$)GzP[0*Vmxf'\_RxTԀ ET4.Q*ӔPd|B n@]C MNeC 9ֿ*JP|#ƪ) 7s$xPHALufE 5Kq%L:|rmpgQ]vsmFq~&Ը'X%H2#K蕃Ž{~j|*U^w#0r-FIQ™uV g%#4Ub }ZC8.5/L>rۓT w_;M`3`(k@u@`ʰ*H.UB'GL #tyuSV%@u d2S"^!ahv̓ݻ4,J}A\4 z.= *JQQMY1VNj,0iHT{ (lC_Z \[^VzC)= #xFHbQ䓼,ˑ$oi E+b86X4?rs#r+ ͵qwK0C^NBQf.H$vD+B)AXB`j tc]4hvuW!T-Ժblԅ^n#ERuwYjebPMq mY`li{8㦳ȅ3 a*`׋B0yq"ܨ1f F dzưjG[{aՆ`NL̢7EtA.YQ2dRG{Xҫ<]~&Tb=ǓeUј4/O;F}κ"Ssx \Y4 s>A [iW]3mSijJh5Iw-٤4[P}П{m7xeiy 䜞bSa Vr0G(IɌtC7v$cA- F_[g]XMVFFT7/U:6gG6Kt#ḱY2Eܑ /pIq9$u|G,ѻ3H܌|ML;b. ~V peShǚWؘsJ0+SY1`RY Uɂ} VkX,U)v%x[kno?/+aTZtNkYK ZMcj?IB"ڐ]3b>ȩ3ΐJ=){\?ĩhH{.>WzQW~/YŊf65E UtqY% h0AiѯTZ&rmzAѐ&KLL 0`)rzA[r¥q`a3'<.a6 -d.Er-`ZIgΘEUTî\^]ϿmoZAq0`<5l cFToXdҙF A0-H`'}Z_iO (pO"t*}")$!3EtӛZ("[KR'VQx-P5DgP\*Y;;[WN'؀mu,mxԩ;.nr͒kcVN 3Ve^zXHV%f5-R N-e;ޱ`qO%3R2cb% g% ]Mr::[eW/OhUλp ^|QNp Rk}m*ȥ-,L`PDJ]ڨX6p 8D t MVR K&#NF 6X@n4Tl)"$A 3{O>yw 1k0[ZH l+$V1-; KC0 8*2***(["-?uϪy朮 \~6UykrɎ1Vᮮ|ޘk/]y";bhdZ"61zsqWhK22(`AM-=4V(.mm MMh"8 ±3fX6bBfZKxN@JR|-i<~ݾE<Б5"KY~&} F dTcUbUFhcO;}ftؕYTZ9 Q `*LFeeg PBNqYC~"Gt\Y?OUR|˒eӠsjYŞ"[2H?'9 / 4iq=*'o/b9ܐcGA 5OZ>`ԴH`0 $j ,];B7d{^}rU/lj~pcD`^F-gC9Icdy؈xjt&@=J}nrŀx yFn)b8RbuM2c{#r-N5Y,Fn-'7/  h QhL)@Zߪ>q@%MÂbyC slۋͿ1QSe odbHˆlZB<,鳚Y#wWD$-Q% {>U$(WkH\,, GG26R+.uj&׋'::]O\f7?7mݢe5c4ZCZ8yvSX@$~ jg֩ %g,UV~pЅ6ak!؉3sΉ (VÏ]|[D1mmUCQGzpmZ,QYn)=H"Ty 95y86UaD_hXUJ,AΑ$Jo(Xtê!ST'DEթ*ư<h:nʯǡ⫖պ|Q;Jk]N$!+DQeVoShŠAz Ҥ*kqm:vD_nc*rXaP[m׽BŻ>S৅\ՌCnYF9xˈHqDg]%ݻBH:*XAxmЛZd_MZ)B\h*v.v=zZw#7Ngf1y\`Xcɝ^V_a8=k} کvb-76[>ᑁلYgB( ' S`t'F6=!FC5;ź8h]U=TXmL%hj&sB6x G t󰔲vtl[#*׮,`blzHWs0IX%8f FKAj$,\TyASO-vPe$c WBMBp>̡ѱox%QH ۂٍ=]$3WvW2KnҰ+/()f|8.G4u ]/|>Uig7ynUNaZC{]O] e-&' hbDֵ>6Z6 lt 2:߯#JWmGZ).g!EϢVpͮz&,^D(6t:o]|9n$j^q`P Z]Ԯa^#ޑܴXxY:^X!>mcP\ZŕT3n5txJwPٲ kgrR[;"➛ƻ?n nEsX6O9'aG˲ Yli1ZVt`M_-J-B({RzIBN!Vڟ.Ad~bpU|lأL"o`Ls\^,C&S䫵@,Ԙ.AƘ) mlMljr½N|#5^h5żF';Y8{ 0@44 fCzڮv"533n?MXcIfT;Xq6h:]u=:l ]U6wԣSuZ`:v/&Fm%3x]wu:ccg.+m0FqDpz!`^Y\nM6jUUXz :,Hzq'O-»UkN`mufp¥p jmG DS#)/ҟX.ƻO;zD h66\$АьBEcKɴϽclDѤt`%bp\UHAhDvd_ac2o`Xgye7@KчB:Jޙ=^SchT' VE޳7tbs^)[|WC|Faɏ@X;I-E NAxҬd`Ujf~|-GM|;{|:9a5OFAtwljUwC5󩬎tIRCFHsjj7jhVRU/9~ u&jB%R\$H¼ څuVYn; MuШ=BU[RO:@Fհ M0awG*xGVM6aAЀ N,a@as@-zSC֯.>g._ |s֝A]LxUg I# ě)cM8'B6rsbnx >EҔSbC*h9-r[P] :GJz5!& yIY]S9&Ÿ*{%NGRRw\h5"$\TݣSY/#/#&W16IL"R52q!I`%`,b89"d=1+F'ۭdc4ӑ/oswmYӋ-n&6GY1F):JB6gNС+@*;!98>-h[>U?玪0)G4 ĭ)K]x]}A ,'G`01&X٬2\&b>.LY0^( :5x\zC16!g[]ύa #wqi8# ,ԡ3i6f0PhOF^jxYDWZz:k, ]cp뱁x5q6u9J9S=?:$m#m9Hy.mx+Z*` 6}me_Kaֶ긘ӚR-*ڔVMK:mBϩ, Z{' l:SEGSA/w$60h[x,ڀQWV9rs {2=J;X]^r/+]HCa4gY^ޣB Sá`(ݭ!Z]ewj0%,|;@`E(W`&!dQ eSqBP.vA캔AOls~i+!%O/ uWE~W|vz$k٘e`B^ /4Xwl'|TN1m,(oݷ;nX+_ғC?5+]L%Ru ]C"jRwYT6sqiJ&j< PԮ`jGzÇ=^Ybo-L5=G'Bm_?F|M]ahub.qZ2#W‚<>y@Q!gͤWdq^iZYw:Z."i Ris Ilj-8]/mb6Jt! ]O/jmb餌qÍܨt;pb\6[3XXVso^uM=]r!,$Ck Lmjckqzu=NDƌ >a`4Z4E϶2yZ!sE֡]!'O>)X]v޹K }u[cZ#.Kdr]`;UB'v5w<.wzR8 AB^Ch#Fa!tfs:9ޤ1 5et_ieKTMqRGt{/%=mCvz9vU=9z o]5ś5՜] /$ße2X b]VpTzX@ڊ9T`Ic-,2aә7O|OI.:4Jr$RXv:=lmi1ž"H7f EQ}K}.G5EPmB-h4ׁp<hKgmg[[ZBVRstb]Hսb2X\!66 akP3'qlC;34ɠ܂3 ,< a U=脴VAW@'w,&&,=0E"B]w~O|G?蹮yG#eڛ TSr%v)25KRسV9H/8hD..NHksV^[Gl2IxetU_ܪ!Z뉽3OH NumkD9G+3_/bZ=tY'~WvÎ?\o•~ݵaxѭ/ Bm (ێh3ڼn]G\mCl`٦j*?f hڦdQw]WaC_-hj)Yo$C!tn#:O=Ưz։G|gӛe1)IFBASFtas'WF_lM-vD]-,^'5~f{nb' eoL~bKkɒL>mp: *gZbck%uaU#s!y|wz՝/٬ɫHri zSovs}uyU!g[4YpQVdNZ1nwu3[EKKR6ޱUQe /uyP_I kY 3x.'TUhwlbϒ?g\7(g\1f'Aj}_K_5TZ8,WЫ,Gn5]l,3pq.0ZY Hy P`pJ.7}~oS3һȓݷFKZr9RKb&/h{=JrP}knWO+ȅ\xFbqZF"&[L2MVsÍ~o)Clb` !akp2o m}{}Y dt2Si>Gq‰?U|9z[S't'O@TGfN^*t^ALءzUeR}g)4;^B ϿH",8`x0\yɉ̽׽\3? ?9ivvBN@N_86x';Bg֙u(i0`;P}f:l3PF+5Og%SZ-br"ho!9pזk* IJpO&Դ/dl;b1*kN.:1nG9qK[ܐ\agv [0$-iC`3g/*.}$?>~m/9yʷ6(ړXjcߌX(,JPErI֮=߷s<1l]E1[[zWtWUŷDQ)QOL#4 !rU쒥 k=]oMQ53o%ܠ0AqB m4FRYMGg18ڻgɎX[ pg@"*=Efjs YϞ-F 'k.9%ĬҖ}zYDz;X{A`Nhf`*uQd^q#B`X8Yxnx¡Mήt4Xsh6Nréo PЩuj ' "]T/T"}B<0Um2yIeLL¬Wȁ{4?p`1% UXK&DMAMX :$l6a~T:F>b>&x3 dSww@~=t쓫;^y7'/ߣ/Y{nY~WvE ŋ/gnW-Rs !ǹyʡ+]z.;,mٝd 2W5aWQ" iVz?Iw5@Zi9JkW)ªp@,Ce׭pKsƍ}M~Ե>z5N%ш,b@˰RgV|$R5XmxHv-(jw9>ڌZ.cMmBE? *P%3KpEZW|*2~PGSd0(F$Azw\:*Ac%vt#7|*\Z}w4%[o}+G?w?s9yk^|g:#6z `p*,)RX + EAsȌ'NWdLړs^Q_q8)H&bAxJd AB& I򆈗Y!jA,h[ci'#Cg8έN TnJ#<h&7:S`Zԟ'?;C:bXy[WeU#o|,3QiAm8ȉg` +)؈lS6"N!1Z*yS BU3F:ڪӽ3 nw g/鈍WVrUȝȶ2F1ynU^\g7GT3blW7VsA=TcV,Z!R)IF,% U5'xX\^%[DLe@&e )TߴrrϑUwywx.>} /zwȧ._>~)6䅃~+?wÐp1'܄l\ZS3 s@ Oog(ŞN:ݪ;&HQ]53?Gdb2׈z8҃I BcGFmGK&yPwA0wCy18TzgC}ɐ-PwpC%.^raξ8pvN ƶ#r9;5X%dr=ZQ)9JT{ BHjXFq`1#u707 ׄJQFAt@4876MW:KA7'atdppY$aJ 7 LiMLsXD[]dhB!kvj!yNpl$ܲH[8ភNM`Py߰L`c6Xuw{緾gyGxKo?y;卸G3ytǻO>~ ؘc!7yDS49ڄ:OCV*Bޑ$ނU)!A3mя6r(k,ԚUXYHĿ `tW{j0^e F<ev2WJOV!x,1фిM1NnvI_3DNGνS?汋߻yӝ;ݝ׽h٧ƂoGtMw?xӝZ]B.hO| Gzrzx &G,Y_ŎԆ=AI}Gcc\u45 Vx..\ tFRuCEXNKH,<2m~Ify]E0B̴""R Y zqT6m~YBFijFu"ɣ2ԗP[U7y5#xg͓"GVɄR;,5IHOm^J^ՁaCʈ7Sή]ҥnosWw6wk^q'k߶d˿߾?ѭ[V:,ۆr;G8FB>Reꑤ:z4UC|`A< G QY6`_Re#6EͲW9a8Rjc+bgF [ff7_ CMpB_ EqqdqeC-ʵ~'FF6UxG_*GUԔ}y䭥Wk=l/~$Jt䩨 "dYg!;ΚD'LO87 iw=v|pPfZU[峦lCmU+9چ j3Ø7o逤l U`6>2YLbfBcdA٨^Zكp%qX47˭ltqvYؐpi,iXx5x/ί.<\?|[_[^[}Vtobs^X^j?{N7F;`WlXQ?*(;0ENp/R V"~ma+wow#!.0^񆊔azgWi{X+W:k %z2 :wv,/Əg[ MY2cQ)$OdA]H#QvZ;ooz-S|Wȿ7?7O|;GO~Sz ?'nw3't78Knh8쁑Lj#)&x8LS }㫖 Ԥ}ZF]oEeqi*XaHM3Wf:->huK#3pyP(oy1h/eͰJgs6Gk=!5晦#V'(ya`#,qvV"K |Fwe^j#lgd8Q#.md(}uwƪ@QFcuLT3}K^jɔ^_߃;%&X_ «OvERd^d.ǷeO2 !5N2IQz̅`FR<#)4PD!\铧G`*'e 0]ЀĂ2Qtylt [KH'܍Әd7YpLk1sNc;jE#(͵-FnI|xE ;s̒*K״J鷚Ҩ:HqV K_;uDUwR&F~3v#ѣƩhTt}6"1>ހ0HI򂸙Nr8G!- -:˅Klymwo-hwF8(a&F}wBtb!pdVA } qmVm--*KO pM`)"-2;"&[ڮbDI'J4d$nQ e;,,I䢘d -ANMwedAOVH,*:k @n+ŭv$g]vwNOk^vϴ?gx=APt `f Vqf%n_JJw G6$fFtL̖I }׋!9 e ,$Z4^&f[{լFM+6]; %GS#O]koNDs׭h׼`e{쩏?}{KNͻ>|3U@x_#X.5g~7]]✑zUrF:v; i$rHN4E \EW(!rR\0^~9-xYE p TEf?$ y |V=OGYblWj`~6M#{hVq3I6 Xz~ma/zLga8 R}f{ JuK2#숋-ص¸@l9DLd_d$> R#e>BIjY, &*I7-'9i.!A1 ݬRp;EYR$<< T1lV^(12hoǥK E\!ek\վZVj(bo`H.=Qa&^nCZxh;hlV%oyi f@9IIIh(D[.v$Je,,ʴ%&+1 Lya^~sNwڻϹw(WSS/{^~\D!Pºkm!m1uGG??姗ݵ{C:/|{ן>s∏{v /^oB{oxiډ/~Guo8S^69.\m_SұڔE@@Ioȓfo#Br`%)XbrI/C2c ]/r`wL7v7 i:nѵ6ڿ Ld g߳ ^T?:]w ^\:a^@;W|vKX.}uw+/ݜm/OP|?X}ṍ76vë7ÇFW?g_>lyp7k7o+诃Nz V8A:m_p0WY'q߭;k򠹡uq j&6P6a_ ;偞"!l#|yn'y2> mEߗm8.Ki[(tO:'rљUd8EI%F8LR^:8}U.'I \(z+@:7VW8A$D|Z:0rF.y$Fp7wt󯘛b#g %.e8j]yjuY( Qep.)uJ4nUBgaP23REiJd2NUp&rwA ]b,R4=Z(HRK%q@Rer!fQ¢FxFՑLwCl::r\ *f!D96F!USzʥIzj{Nqȡ#Scc{~[_rCwNb_suK?|[G8Ա=HX]yW6tk3\=)se"4-)|FP:n>t}1sߑog{a:@@ ":+1hKX`^`uM#F>ZG9p2o9i  BWM,$Ktksp# W8]w^Yۛ77zupbo>q]kݵnkwvm$>;_>ۛ8|PԲkzciZ,3]s`:(5B`ѿ}=yCZBtxg7\*ƌ~W,es>9G4хdI:ehwCMy`i7#ss?.@[N 1[EEYHjwC ]ߎ Xt.fvu٦2 zXO, P0E\%Z8ދ L=!G^U/m小rODAӍk L9?98M#jN$ IXV5*^Dg]H!˥P8 *DnqR9d)cـșp!j\#O]yDZi cFyF9z/2ص sF0_我 TZ%[MwxQ ( *<&UbѬjBԙ5\$T{[wVqtt'?I)KϾ}7&v~͈z{oonnMg'׾~>‹iÕ)Ҳc:I W8E`.`H:蹜bא9.si6(VNdNkO̍}1+7XL;`ؐ=J"(Cuf[?Wk% ?HuD*ՌFh; (6f1 `;/NSy؊$Y WUr܃QJ .ؚ#ׁt5i^/j]ݯ"֓n kSWn;}/}g˶WCr8wG|{;~?V+{&̧?tʿp~ra*mQ>]7_Փ:&כK;PjdOrVX̡ y ;m,]/ؑ`:l~AJ 'Cs\J 'v:FO"](\p>d8[ `9/Y u.:",i.g65^}k] O@raS$3BT@;d$kYD6/<5UI;rIOՠH*؋~36cv+o$*GE TQy tӞ sT"Վ_[1>ɲ,sX`AuRfjxYyviά'3(Uz"^Kvd"Ν]ߔ!b-zA.^|)3bwܻ]ѕ 8Z"›-WV<2>/nO=oL>M&,|ho=67w>\qnvߒTdX`R8"$|![+ib_K͛Iļt㼘Eݍjn^9阓1qټSyDZ(5յ_y/:̓y=y'RT6a? K/.Б^h/z oš /byd8#;+ߠ,87$(-m[.rl48a>'ZMcq^ہOUHa~%QQ :jPuB<ɒgL p1EBO;gt"j2 ĸq`Lg奉XM9.drGEUY\މ_mHRTMom1뀁I:Q!uTUxjʘnd% )&V0<6ZKX8rh9IcKgHEc%iM*jnQڋhR=w[M=Y '6#c!$q\# :WU {.13P܎1Ͳ`=xϕ@8H %/%2pD9mՈN0 q)Z鶛"b"\Ԉu ',rlnM+G>(z@ K>rK֟xCmoZobv3ҏV1w7َJ`YZ`t\)8ɉiaT?(zd,cm*ҹCu#6ꤍ p+Vɑ%7.DU6o}ёv:?_WQ<ʍO|⫡{>vW_޾йg^_qf-L|sg~ҵ Y.}x1,Bv}& LTرx㢊Ҕ9puCz]dw4G20CAv3+(ʛ1}8j@x,02M~֯sԜ-\(kMHOg9/Ļڭk= h#?7Y8{1 [3]{η?z|o[;(뷿v}坘eG񏋽 7vi/n܁l&}|RIGP*3_AYLo^e m*n%RZ,!"jj2eV )dv, Q .+fj_MvR>p j1Pb󠚻q0ꍨK5mgQe^jiwׅ!W*@ MAb(O_pVGiB<̝ rX9ր16>1q"l;OW0U(|M-X ydN{1bRkUHu usiboag(=up𑞬/B5ȓґlv箥u ٯk_͛{sF_OO~x/]ީGNw{k*/_mo&AhTUB* mh $k50_s[%mm1DKK5S "l >Ӳ/_+;}܉ @U2)[(4* uZM_'̓🅭#bo}g_Ek~{W$UxRwE~` 1pVQ0짶8v[GtMpZpUEtCɰM"tW[ ~X8N{af\tط9@Dx C}>_бu; 6ɜ$t!RF<2%i'yhVq&jۥ G.uJ3o[)׌kgzHle>la.X[vk9;  Z 9Z9V8Z^ݘFF Xh~p,0i AwR8泣}D "4[sL-PV{X{LJRcmrLFtJObq AE5!Bz/|za!l3gŃqЛ {!IjQɵR `iĊ g:!"8T 3 1VUuɋ`?v3$TZhVQ oy|??>_C+gǎ{GOK_t/>Wtkf;:ys皃v[נQQP zZZ;qcB~etRCq~WECOW qn!imlNX2B * "rJtֱW w `KӓEA'x p"4t0ُ ֢ӫ!+k.vy{/SpC~v{7;J?O{K{a,{AЗyaz=7Ke9 "%I, З9k"NX:%] !T,np"h3gI/R:3<}YkMuaƱU^鹟;IVWum8kN rt+e}1i]}g3 btvsdz & `z Hkdz7Xf$3JΩ!>s0Neu,tsLɀc3Uxu/s: *3=tXg35?7r(M^J+ 邞ax6I\t2.$AV!Jrƥ%qrM  +Wz8pdQGy)Q#6' Rȶ[.!XTħt_z&ݘy\FG.yq*F1^9lY/2p;0)]SYmѝ.QSԱ \*dEA$+Ttr`##BĚ4vQZ,DŽVt\*PېQb|qyC-K*,h.4@N.6 (?. pxhDTHARD/prK5w urvhRݜ ӗwN牛ty׭Ϋ/iunͭ>{M[r}.gzv)˞uk_BӅH z|}0^FpErju0n8Z="yzȿ{+;Wʝ\?=P?5w_XpHN<ܿv}AiC;usJ^#E@kTW6BsPeZ:-d$?uBX8AR$e[N.C`t'WRf$1;13=&AoiS7:kI?⥍޵]im/SjIVY"پg`¡X$bBT(+Ui:i `+(.AuBM@T.H+:)ۤPdTsDMJD?.ѠұNQPȉsY:Y) 2EhAYYSuQ !"HN,6u,}jB`3Uk'Z3+`A3ݸ.;傻uZB #V5 2h"vkD DܴfUL $eaOT؅U^M IFL.U$#R()Ov`RRMfe[I>Y=Pg8*BHC4:hh<C`%ē:0A0X*#4F]r+E@X) W$T;L ۱ ,҉Pz%ôU6c=)ֿgo^97&i\y޾pico]k:nm]׮6Wf$V,H*[ը3*'+S8s);b沋 Fu•ʭf!rqn |(C^ !(n;؈e MsaG u``?U8c+u9䮁\ɲOaN;u  D5{$D6Iq߁v#%Y>A$#GդRHe dÝ}aءD!Ni7]#ǨvP614ќ>v+=[E!m‘:hP,ұ,4ǪQ!BT`IYMT+ccA+ QPV'W+6JQm(ќ\iW,iMٹoڢt/Yn%qi:iѓɝOt I4"hsTc ! >Z2@c`R%T̊;>6,'Z:qDݢ2i8TlZ10k*FܩSLZVJ"(9S5KjOKmAK4xuJUCR)C0]xDzWBЋ.k)Ȥc1;Q#\YܭDUI:,Q %(?ǿz/]y ]'>h}+y7o{v>09[a2vsg?=gom_-.\oOֹi̟ԛ:1Xs Y+Gu"[,HRrBS0l+Db6`H, U AIԊZab ڇ; (dcm;x4{;ESݹm9}i֋|s-$,ۼ!/쫟:TYw5ᣟ;Kv<+&ty{]>{˩O~?E1)cW:3s*.Dm?|AVFs jst9P=5OQY6;ыt!'$PV'u1ֺ_*]Tݞ:Q;Σ#Yzss=/Jr7Qtd@QZ8uBEm.7Zw=/j0} r$9!{} :rTI39v+2JgƆ;J:Cw=, ݀hYW¥c[K%4\&7!9.\ՌaʚO5UiWiαiSkw!‘%` qFP'8\4q: ᄵY)K]Q:F F4AIل.bIUk=֢3}1)w0Y#PU*'eAm$*Q$--'j:E))#SP:A{hL HSKZUVmޔը@%;r!FR1b(RB,d -YrDtY B* DYMjv ӿfIXrndIiCAhWeSm:2"*c\0*<%@GkBKb윅 U˅=MwDHu §^ݣ+ W^tw?|sO{?sWƟ}{ꇿ3K>qcxZ1I O6!(K/) i.? 2CqQ+i`+n v4cT;cA5I, eO4UA1`eU]S&t u:@:8mg$L0%v8h=E "bԟ H^./?ʕ;Z?{~~񅺉/6)6vuګo^ow>|cۿlwS?/ "[u}a>?`~3Xh,8˴OF?uKý84}pT9i[ !(,R! YywiDe(P2tɷ\q!ĥlYT_$ä ri)md?p^,K']NgJ2bͮtbo(p^u v/@4GUuݾv+BR[(e` [:&WVNp\8B]g~n53H0[JAvLgIȠ nvOZM":gILM ȥ2a bjkZ9"9tX>){SrpGP@$|AGNu⸐{풗ii3GnT lmPŘz hʐHK|DMUJ£p yQT0zDhJO! FU'kPvst1L4zERwDY#Ɛ,`wZi4F+(*AxoVּ{K{b&|.OHa;x$I'~S) A 5Zb RD6ijЁz3{|Z:Q:a G>ED0 V3__P=7=zkϾrݿ=94k^ yC/J:lN͹Byҥ;k3ܳ,j>Ci].RX+j;GyY/et3+¥)!@U*!9 1j#9Y*:XH2yTH8mdKm6"˕`'QvZGD6)$14 jdO^hL„lUj9w%e_w7xS xxiJGs{t3*a ,%ᬺ+aZ"KNR l:fY9 1 sY4i(GXFՉ65TXBځs&LI= &E8 ͿWgER:(mvٹ;M> Id9 :kSsUoOc)tYPB`ZGQ3gCvpu,mSJmZ܍6[S:ݱKrT4+FqB]+˥E4!*fm4&m%@|6¹nΤBvk,ƠJIE+NH*Oe#*4>b`AD&]b%\{,OX4 u f 0(<ت6B[hW6 ZM' 3NBܩSw#: C"CD:k3@TG@ ]-S!kY06-<1 F=k[4iruB<$"#uBC/xYP/l;3N4⽬SG;0M'@ko_z߳j7w/:N#/_?3/J<㦍C]lYɛrfK qߎiʜ93D:t[;I ".Ar-˕c!rʲf])DeAOy þf8ء@ $W Xt@/tC[pglA0F+}>t%Ɋ5 si&"qGzu??#j-!~Ν\]}?ܫ^N7@vhäcy\ǡE]*N{[݈J7EnJ'TC?4hCSr&b%Zc':G]=T^JY\B 焳& ,Jau'qƥ uNXB*-vwMo!4ʀ4'?m>vc6]ݿċ *>Zx#Β18TpCGm.]Or*HY$a?yږV7nyaeuK^Kx1F` wOΑ[4!̼LҒc?v;|OPMhԘ$V d DcJJ#,9*S8t^ȑ C@ I9 6IѠ/(E{ٛicW>z'66 'KsRUmo lY* y$QT=vڻs]r(mđv /vؙƕ1FR!g׋K>YøO*|3mt wdmu'c/XGj&;LZ&F5ew#OU,9\),8<⽇wkVc7f6tJV#P8?~}Ոp^S`QH"8"FnO('lTG^ ,s۳@92ncѶA ӨP,4^]~o|"CmD&tb̫Rrc&Ȯ·Q:8rBțQQ NHMYPIH0iW<04+%'NZQţoO_BܭihJz‰BkN4*UmZfj%hGK/yoN}o_>t3nwsBpj}c,KB'N&u9T$YR\癏' #J̈KN*P<63Lnzh%G D 6LA ٙЁB LB*F"/$l!ʤ8osNd884 'n^޵P%l}q!^ qJq減E?tg/o]C/Է֤O}}X\i۶Kmړi,Lh2r UчVBu[}:߸Ε,TmD ̭?ASYvW"4j2=o\]?zꑻ<nMp mBF9c/BurjQnnhuV۠0벁u\VPI Oqbj#g=БWon(Δb:hC1&>3G]mjИLhI; ( ۪YG߸yږa vHbr!jM3(.IGO4Q-0rB4lbՂ>ޣnFܮ`\za'lס%V wLP^f^w7>xצclӶ]ZC i y(\bD5$äI빍(^IN8%3GޔK_y5F6ji=r|fA lkc`7Md3u`)RP00j9r/8\q{&}CcϽVUu\{0z隨lUQwji⊗g|O9 #(=V$es՟9Qڑ/|ZؙЉ;[΍.܊xۉx׹k_M5Q`^af m3#@=iv:sQ^gs&昨P!sf=p׊W3wZ*KWwcHBdK%΂x̾ZqP\)+:h9mⴍU8m5SR$pmf!:b:n; VKBZN)dj:BYC҅R9p{l7w썧~Nѧ^+>wsO^S:3w/7@b-۴46*YEB:G.U37^UɕbL0j/×IbGnk0xAS: HHNҹuH[ǪCxv﨓o1 V]"}Z .6CRnAD\r{j3sqjŽipd/__:Tmm7dvf|[?]._o㗾oooķ|,O#9P^m8 phsc۵܍W6'O~gā?t>ɥ2AҤUL2\rh>{Ym_׌PQ@B^,VNA r\V<5G]As[9tNR%j3XmbgH% 2Ti@`3,Jml heV Ų͉u$B*Ǒc{jV:)S5lsOmz[)Ǝԇ+/\7JR=d$H*'eީb^P9å7bAH :*i@983ph[N}Ս[qڭlzt}O&o( 6hɚOG@QRښm6YD7{s\sURL9$$!!JCݶ>mh+-@2UURpᜳ^{o? Ҟ2- aǫtMS2_;xl\ʑIi˯lc{n<+劕lL rLngΕDkTzbJ2CTDXUuD4$Q05 瑂^3j6(b!b3Q.LfeH%u8Ȑ[߸ @5&^U* 8΢ڋ:`~+ `Ao]hkUէ@ޫ귪$52Hc׌Ќ#HEc(gzۺ]F!TYu 9D~;DRkDR],&\Q do(C޼(F mNM7D1o a:" N *U_fXQeQ̍.l;״s'$uh@ |E4yw5g8]$#gX4 G "Fl+r2˅Us ~4) T*iV/uf`"C..HS3wWjq,Pa|IՍIySw7 z]7$CDM`@ @lNQ,b#%zuK1S4n7ќ\e& 5F#OՔC07L7wA)`I4MHgy3 Yl8'b+)]UP`!m/S$ >8-n2^\62ͩa tE0/75;~j#F+Y2'^;c,ϸD[- IScs0.d}2G!4F-< fE y} :,^Qz뚖Zǀq"QI L!פ` f` lWtYv_ThfWU4FEiSZ BE@UyHX<,,o%'NM"3u˻Ky2LwS3PPzElN@㎍yH0A ΡBT CLEyb9:-vc 鴫],XJ["8$K0 x}̂Zq#ቧ;/]t`Ts鑊04pR&V@ȹ&Qs`Lh ʳ&X|bp]9G[fmp`8uݼ.H8 ÇI׷pCWB"؊Txh&b`!4E3s,T&z>(zLWiYP[^ǞF $ૠÇ104ӃZKDk[_0U+{F<HC֚y%XA <(̓3pľ!Q6+O7W-(;6\2ͪ;Lk 9/,\ik" $4cL(⫗ELNKY.N$lL"fq3Y,f1`>8ռTT$KʻJi]_]+2D8k  ( Xh"wCHsyzln Dn kF5!ZI+Mh |MQW5''*[; kX% `npIpZMK#Q&GMNKlRoj G,a slmt 5n\V 52s6Ø@D6v8bs `EL+f[nΔ}+R@ ˕A'ڄӵHQlm|MRy_qTI=K]p{*!"–m҃ /Hƅ?wnߤ}ꖩҦim""Z7^4ef{`g.n^IBsYPE &Kg,1q {U$ʒŒV,n *hp"ʗaP nyKr gߵKD7R%y h1EP+DS#h1"tIMVTƕT=\P%4 F 6+λ=|Ldf vYRQekf(z|%ݳZgl<1IoXIr}(P, PTkӆΊ1R)0jd+b 8>eZ ˒]yPӣe"TwES^,PPK\Ymtw\nO+mS)jKlASE4T\Ds ,y_|*]!uE iam1`Hʒ<"000 bAk["fQRd n4S M\y9-Mmwotu4AEwM@r @C*(:Wce5\>QERL0aƊJsU+kjsx1_C%([J؞[.:ϾtQ[n9X+*`,fl@kR+)Lƺ!AΣOƐִA#ۚR)?}ϘJCA&*T<1})5>)q3!d$e= WcŸ@ U5xٺK~=34ЯUoyuVxXD|ºB\q~G]eu7.ikst Z>9/aw`fOwmXaFCJT ~֚akwXSvzݦCo]/-rcRF jhtIIdLi0 ;8$I#`25i&m^>[dwlhud~Ӣ_DRR&sSt!@5#XB x* 8UM !geIa)E` Bp2AҺ.7a]#r:xu`Nl\Bi⠎uT󀛩R @端U' ,QHqWIjykh?:uHy+L,U?Y80`3(s۽逯^dCGCYF["PUKz?sK[^񋯮~1P9|,>}OӾߵk<1U)_sp?\16OrIY2_:ګW>Ջ~8܂~v|1#}~Ro}u^r~|0Es@v09A[,f# 2ROi1Pt9XiU_ O?}۪U-~߱wg)﮾QL~5~_G7=ND &}53S $d LޜtxdW:p D)"0f1 R$I;vCݹy1Rٹll1_k'7~Kg_~"D4O0t)y2 Տff[0h \ >޷~Uw맾Gw=\|Vgן82>{_68-"$&Q׭|PTTD &PAN)՚cEURD8˸J)R6^_x]ïnxMOuYc86^vٜ LTYkMgqf3􈔧9"2*xlNA3Ǭ%[kۈMCsU5E͂!g}eEuR0DD|雏e4D8ΉʒL3T ,q$$R&m,x 8DX$PY J^R-ۇD ._׿_)Dpa3S7wʧv2zd#&-v 8C_Cf\BFjQuJ><D8p HEc8PTYʂwهo29}sw{ ?gN@ phޟ:'»AbP^| z5`uxFPl u]/AԵ-&;t?b L 6G(e"W_faU궫/̬oNRt6 h]j. 0'6-4'` fVFaPsA[szY,YЊBJc/8[WWOeʙσ``sCgI 6g.e6 blqҚt\BMj*C >uϑgC/:eӹbI{$՚S{;{^=o̔b5*0*#͚LP 8!"$R-WT(O1&6X,pv%?wuH~}YiW|׿سGn}Ł߱C]++*$1 ]ƁYʊy%`^78'P PR%I0& A$,C_?w}߸Ȟ]Otܢkq[$ќܾuÿ}BvGS?=sF0f2@aBOClv@p8F9r&uiJZ,SF _Ab-tƭc%E`ٟ=t4CWmSGs;}H*xndӦZ/.۰o5WmY9 5l֑` %I+>y , .@i(J*jHvLOg-H96Y-KU?+]#ޙ`\8g ̈́DnVzBtuz]eV+, t<@)8p/ RZ>~-l~+e|N;]T|E3SgXMXGz{^MqչkfW%W͑4C 0'aui\e4?{xY0XBz _coHE@~V6S}ݓ<8GһMGz-mюd6}|WSc>=žE+Rã__ S,UXR58xuppȽppڷX3൶;b~6B\MG|r e/v?[R Qf*K]5ƨj4 & [}]#͍=N6v8V%aq镽2oO 9q.HpbbGn_K^8II/i2~I1&cQEil 0 "gp5ph gw*3kcVTf0I^#skϜWa*Yc%a1aWK@נgGCb53E.NȬn#?bm]U8,iݻoO^5'{Rg;3X!0f,% +bfuO LG@BWAYuQA'*D b [07,8r"}g٣#SOʃeg*6Fm7ӓJ. K 䆆׵x8G#n2Т= !K6;(8kN FJ,R@˿;ֶǏ5uV9Dyy'Z>wgXgK^|A'?܈i$h O&<0՘ksw.5(E 0B+#h5 O?O{\ǢJs{39f'O U~?1ȁ%{djB 2 iʊ,D 8NJ"_SȑF A 𵩀uPt8?WzǗo{vס?vѶNΊ1e=y??3H6={hp'޿?T@ 2" lyI>4kczĜ,i51^ eM05r]?|Ֆy gж÷^ٝHNN-oL +7H*4|ѳ9z?է&#ڱ?;]ጣyժј!cƭL.ubsMK~wvœSNy)x乃#}%={6g .5d+*_Qي4WDMQpG4:WjŠ[=a7E-0bqS߫NS51miϻedN]tܴSrPkgvé4LhͿ%i?7] 8r7+c4lyO VavE)*I]p9΍t6 .n;Ylǯ\smyCvwPnЬEb*AQ=+yEcO|-kOOyO}BM%I&Y, d|},qyok-"FxNMy[Z9^ʌuNL9-e~gG_}dJ2o۾zuO}=4(O1&|*2B(V SEe(d" t`۵  W&%[Kʔ)]%4|MEr.tunY4P1jӜǧjzT鲍>ħ)fu6?tmǢpۮ<p8;Wnz`fjhݹx( l-s2vYФ-oܾfR9}(;X(Q% Nj=]ѓ.%V4})ѴG%AYAчK,$5h  ;H5ZTE|^:x[/w\)(mm4t1;uc HzʦӃ/LEN:/_RLYg\]52/Q!"xxCi@@l-[\O<""Sŧ+RK+ʊ\ȗZ|Z-/#3ip=4#kVDRjz|,TI?j `L$tM1L(Yx6nad^<`@b>0PS"0pfN^hm C#=]wސQpTOZ<+)Sv44=v"οu`&'ͷޱi_)Y!͖AUjnY޾$/+x:>xU<{~'̽nk ˹t/t"ѳCzsi= fy[hcJ~uEe&*r_>rT}Zv}^a~b<_;1ٳ}SSM-q[Of "r,|bP DۗϞŏfM'- O77.?q`ʟLNl_|U nw'ݳUnرzT1\}e(=t8pH`;(vՊ1OWu^yXf/Y:OqvWvG{e7]hP|\ˢ>7v>=8vFP!I 4 PU4l[Xt&ݴ44>/;cymg' #Vs dHjdqzp+;.y'ޜ|pjEh1X>9RC'\ 4##1SΙّuN'܉'Knm5-Uztxatxtpo}uw,x{pw|z٨kw?V9vP`_u / e&E_{#*BIk$N}E% I.*L$D8[gǾ-?nuͪt6Wcg_9g~}yk:_؉tS[X<>%ow,)dThʪJCU%I$W @`+JNtLD~e28 ׯyΦEmS1鱴:3j 3͸Ks :Xㅠ fHTG >iyd0Q\˥Uƪ?EE@Sk:!tOk+2. UL*AH0${oYĺ:oSfgº匝؟;\2+raqpv^5^='u0CBGDae_W|r,Ԓ.|Sorf|͊hԱS۶a`=}y !bsAI|iD j" T=ILUK>Ӵաy KÙLK}c8w1":wz 4S?#PYa>z| BW95g܈k 5 40©gwBC' XcpJFf9 c-2CWN'>W_ԼҔ\J' Uv>vM[7u<1,2c|re=;%ʁS ٴF~tp7-O$Ό"$߶ՀROeԙlY˪9!"Z>1asK.1]tiWl_l눧DˊlJ r.e\(ĘY ["ՁfM6/+j(GW'tbD=p?سystyΟ>`J7‰i7W |ntt`Ƿn~H|q@z2f7r5FkWC% ʡobV{ׂ]/guζOZOOcⱯǏT5-,-[NoqvV9y's$O$[>:qΧ^рG!}mn1&̑4(t(pze-GX_:X`x8ibL&ݗ6;t _?:?E~jB%*,ztrU Wvrr_o\5ЉxL눽 f`+f[g[UӞQ5?3L*WwuιZR+"Mm=x 382 & F Pέέιry? !h]^~}%NSαM% a@L7A51޺x״nV9﹪gNZ%VB0<3jӎg+RZs,Y {lk6LX\Mgb#A3+G2iحt\'1}A{;KIwo CLEMerkkl=-P;"Awͳi $;͇3]Z9nZ_:J%,):HTz3VF,ej&06JKF'Rc ▊Ӭ,tܻ,ҚlR\BYF@ \6p6f_{7Tk&.Ig#!ӗc zKg&S# '44TDm['u55c`Qo/2IX\X\Ԝ_0nM2H[.\6ƹD [WHBL3KJ_ZoKܱl,4FKOrdS3$ H() ,=76 $ǢV^|c0J#h' ) nZA܊UG( #8( (MBm'56uTJޡTX+t)ՕD:P f⚮m"V 09oʫ:O%Sf.YT21$j[\TߔL16s-A79oXȲ! s/%BƄRlv"3:4n^RvĤCn#K# `|22]cqƬ2U}q`KtMmfYma `r@%Cƴ" 8 4PI2 L2BIO| @ڼt:20Nw`&P Jaz43KstZhl*vM&TޚJH{h,lϟs^RvXaԳyL\!)'M2`$Y6CĄ(G$adCɵV$T=%#9E]] _mށDhҜI""k߈?RP;ko>= 薉Dhpι"A΁,qqՎ'E@\bf<\] 3'xL7 2n9&hEYK@p@D0gsyV!8C"dsl>*B s@C!kb;BIV0yv:3+q8{Y|Nwϟ&?B 009l>\0as/=/2㽮;\Nop$ף%ӌqzeQ&'.HGS)Mz08₢$!-g ϮO-zl~U;;7]$ŵexjqNHXFz7.kk~f_&SCfRB'9/t8E$}w RbUϹg,|g͌~qf/o3UC@ӝU"_SYM YaFwJ8%pMښ+MLQ$o < ͒:Y(_'Ef=syVzuk/%OSUK]w^Qe]މ3HLz t Q|$6 9YVhH~ͣH8>jٿn ۚ*dZSIJ`*:EF$ܽ\9%gƧtD-=&u_"VGD( * + B\gٗlsePu``MfO o뚼F9/r?JC`Z/+32`䜯i^v22FpDu# E/%68d 09ZFHCq5& >bWĴ-yIs^Wtx<^]|֖_8TSa'<{es~;G, )] "dV0dž^x(k'$F N slhdp%KO\m ֓}Sϫ^ؒ*ݡrOko6^Q]Zls< 8%p.K6dZ) /C@}Ne)MD6T=y^PxH&D=2xd(+C N2l0W|*D)W 2Dn W2;ɱ$p ^ 2eP\IK⓯N^sa~tE% WwjsW6id,͗亶\hQ|M~+[e9Sn("Z+AA"J P&r rsB h| OwNz));[vxyɈj;޵+<:v{mWWND{ڪ]3rT!B2:d)^;qP$n2m$) P&EvT+"P4){,:w}xّCK4U>莬[[?4+*9|d<[_TMq wCo|@%F_WDQMB^:dp)RЭ׆9!׎yv)K}dtJ!×n^]r>)3*QΓ3ak-:p¿9LW;WnYFj˕@rYY?qp}wTRB] 62"%ȱc "pʬ!,r")S6 "*2:$UM›ojWl#qO%8?t+[vrZNE֭k ::vy-{&WķzL@}|[Ã5EƼQ]28m財Kd2et+ . KhE.),\琺Ϯoi8}񹬟,k+R ͡9)34X:Oψ+HheE:jj 1ߺ}qi+r+B-6Y,++QB%W(D8=k>3Kvq xh&.H$myXHscuNLsuUSӷH tS̖3L&PbѺ "g, t]cɲyV)^^V6aj|WyxWJ x@t#uxbͺ#':>7c_H3WI> _giUk+gv^͇8|ۭ+]MñI}rd8>uE9UJʸS^Eyþ59p0a{zoP~pI8ۄ!TQ3^‡_ dcq,xz1Tukd_Px˅GeMWF4y=yd(apjug6fg|-m쮑m|o)@mSr*:9b[&ñD] C:W?}WQ\燐+ kwƣi GFAEk fLjm,je1G8A4;LJZSXeiÏnETn\[|̑]://=u*3[vMegnKSk->ֵ=13Kj?{Ȍ$ 3~4M(J1,p*gͦ ьR܎6D>k5MuFy47X,m|ڑ! K7VvyaXG&g/}wfvE^}gt /gsƘii)p :OH PQ.S%y9ܧ'TVWF`%\=r"{$JeR:5Cy=.D>&&7D7'dx"7yAu8CO^k L?ޯLX`1fCND % M:˂?$G։a.?47ۉ;K7 RPbg >'y˂T37 :V/hSJyfURP?:g/?/5r[Dhٻ]$ [*DeêΑ38%[W$ Bkɨa=%9iߟv!z]t ; 998L״=OVy76ᛛNuNM\T0pe0s: yTLa"9O!fZrSdC[G'o))s/-Tꗶv\}"a丄o2EL[BNeO9㞏W ɶ ?<ԍ-F%8վU{/+-b$8q{:+Q *n^_̱BM]Xr3Kq&[3filӅ$i*_L(YSJS'U>4S೯(!taK𽙌uh?q4!RAA@S C Ef_oGuOOpD=gu bڇ{3TnX!~w}-BPDt+ktr'8Z34i2 PY6F)kh2N#"`<;'jB8m:[R2̝#n}i_`w<.:3'vЃ7|[[bz^{V|ǻVIu%JL9{ڽ:.pJ\xr:Xo$݋I32Giq853_xf: Mn]s7HR?z+LVHW[z$;q-l2=,k'> `HTx|{w:$)\2eѼѣ׹63ni ?kFW˿!5-㨅b 9ITq$$eeq 􅳉p ;H `[k&_(Qa0dz fƊ\!~MNNM LJos󧡾{/By8TO-;ҕ078Sbfc^9 GdcixΙ_A7xZ߿OtEzL 6v]3oԉ<'ʢع+<7G)NYy2.ml.Ψ)f0 Z>R0-Dơo4Н)+,A( XUt";N%MRVl< P% c֜g-K5!!t$.; pp8bL2t6Yլɉ 룀Hsh YhT @GVUl}?Xm]RVm}{S qyLcz$J΀gϻP|_WhOOrDق <7s{Ob?m z{*Y)ByFgd76"GmZjg3d6Q1UiB)݊6gY9@[xIpo,CpHTTY[ S ~e:/- ="bGy?݁sM EB3:K "(!uɂ(sD ⓙq`&ΘeY`Jh0nE:6O12-SboLk7-Û.k._:doZ9u~kF_|/p"zde'LW|E@8d 1d0MM818pn`B7M4]"q+0N4dɑ]>Oyݷse˷U~"t/I ^I)ͤ kK6Ѝ9Z$4\P0r57xlcєP#B0a L̜MD~372&xSCp+s_xT£^~џ>styU#CPD j6]\` "d))f H(]7 aL51LN @j8O3qTؗ;_ կqR3{nk/[`N[}%*jw( l4eB_Xf]0"A8cb FLD\4HiS P G5iGܑ8̗nZs.).?4* 7z.-Goyؚmh`*"@6G8flH&'5 *P8,GαDLg6@" Ph( w}^OiMM_olZ)*aR9kV{$UG"u907]SlLհbO -W;`+IY|AA h} hY3Y_ ;'} "j&Nu^s;W_?wM <~JNJ]]cEn12qHrs䶦BI(e aA82AKd!̂qMNX,~v*#iNw7d|:G|*q=G_/[So^7FnH8AP79Ms X3Hl0`V)r(S{@&( be=O;V)@Lc#A @uq*@:1eƬI \[ghɳk^jG ܧ 8=Y:n m@RgxBȂ5Kȭӽ|a^5HrCG eP\^w$fM G ]啎;Eeww8ya[9˿xyyJVm~gwG}k|h&ΕtI{r"Ǒ?X-[ Ps%rn33$X tXRdK۾'D޻lĎ}.XUXZ,rٖ-޹9>0dqyۇф998qPDi2Șd[-h뤢@TF690tdsݲ4[xys;FpM(i wl-sLJ?6X||,y9mӃ)gz[.,y̶C`i]4{Q&@"$N ^ L ETu< RMPXEu)3\O>޸//-߾+}_VLL]Vo?VLYirhTFpKs~)Y"9R-{@@$Pt2 }EuwJso:;WR+/>oTG_Rli}s?6swƔxF$+\S&sܐ 8㠙\"H %A7i:HDg4nYAx<|%9He7?;O׽w+6^yz;i]Gc NS@\y909.M] (̳~c]ԏuJ'YOAs@)0MeG`uI 0fV/~sg- 2O런͔ =db4bG#ZT2w%(}|%G{Bʷ>iY-ӿ:J˽ݳwwW%Q&p^Dr*;߼7tƺ7?UU?{~w.]U\qѧ)$>,iD00L"J"d QkamKϿQ?µMcTvxAr}Tr*U^5gޫ~oj(U8ܴA1Hr@$e30smPK2ESu @MO Ee<6:}cNONg~}cB9KΩw86&:xcS1wbqIH/]\ԛ%+y&#I3:ˤBαSdw;u Q3da&蜇S,339,P ,AK/'W}GCvP*ĸty p&?G~<Dͽ_XiZO&W } ỳLf@c䖖 D3Ac@d0X`Y79!>嶢߮'oONKb'l4 -,~_>xņcur;o xP}yY%[=F-6?zŕ\KPBwx蠚,C$R:f̔b)T*BPcJ]b Tzy%}k[ZVGfB=rG:Z:DsOD~7;C;i޶ }6{|2@g81{B0e 9f9bBĄfZAu613^lRԢ6ұW*Kç" GnԴPTu{㓉K7vOӯ]zGI[%[_|nrIӿo_[ 8ptJPip sX,!!$ s# u08lr raê_w*_-+W7t裁w~}cx8K ΫmdBL֮W^ާE/|m{O}?W68~a\Dw' "I%B6hLh0. 07)J-Aڀp4P>'dX:ҢWrg`|_/FҢ_hʞxd7xvwLϼqkzI[L-[R[}=IR]jJY"&ª.{e0Bi̭PdI3U )c  %X4Lˊ9/ˡ?bW/vpj[6l}qGVZd?5-\&}IJ U_LcSmg_4.k6""H`)%f'6Y C Aaț oZcK* ?E>4G# P DC$3vJ41;<V˖@uDɑe~hWh3y2'Gqv-^1Msڢ g֥Ϊ(3wbQrp] 4V. xG^:|/?:;7VӉ_Jeo%˶SWugb#^ 'kk ׮$OW^>bFPr0W5Up' MNjmu=^OYh.M=#h֛-;,R_]ku ʶALk։螽oLGgƭjUF+W߰W64O)?Z6?y+kk2401am13}Ƭf yR<HeI*C()]$6S|gXy{|c9:[:Xl3#3 +ꕫKC,.pȤy4Ҵ;ƾɔ*WXFrtM_ep m+ڒ4&֔67弿gē#w,FT԰%9b AT-P^U_vnJ6R*{mMF&ҷs{8;pdznm8sBzMyMyb{櫫^zefotLS%.&z] /ZW̖၉PrV`ܛ'ߛPDYit AcM k߰2ramЎ%R !?zV2vz25e2cRܹOB3-\wղ25.{s+3:}l} zr߿~*W9<"ALfpEĔd!cpՄH,]Xo:jGn`Ow▎],)69؈vI;76jfg1wW%j rkpê Lk0Sv LD" .Dgܥa#Pte pf;%LǏ?QǖeE_m#A4M)et5Al;5[uKΣc7^bI9xy1ߥhonjۻo{Gg(D*#.J( (WBu5&Yಀq[ZD8Wt)6jJKn箮m \x^SwW_*$ ĆBũdה5.]I{;x6wmX81vN}CU^Z[U]V-'lywڢ'|Eݝ *C^hL,mBTUN "I.3kϩ pE8?ɗ6^Tb73fS/j+aIv=.IE(>4L,#;'onrrmWܻЫ f>v^mCSD"i65 b*hw*Hb`QR /ʦGekO8>WB+nrSCLcz8y| sDY4YhVɜ8°ZՅ| xQg*YX|T"̧5ehsI;8ܟU?%ij{זjESue [wyZľT(~w\NqY<#RIUIh"|q?rRߏ )t8VU(f&3&y"F@Eq`n +TOޟ6ӴDH)sR{E4nK]H߼o]{g_ܲm@Tv9J1k4 c6:OErEKcXlEKLE?x.Dن:$G%UhINw쇷DfFU@֝ВRX<Oe4.p<&'qz佮<5}ߺ]gXT~w*C)"!@):$A5d&9%4({;0Y mPhwW8b|bP<Ø!DCiOrj_ēnci̕EiWLMIK!^=1frcEo8?*zJmDX^>եY`:uTC !{CN*3ƛD T]$c%6^P3&sQE|;KeyE10x9fG-׹~*W26 ƌ|IUJ@ id3WԌKz~\\Nvb %h{6SZ7ccQyS#M&MzCPG<528wHڦ"Z,nWLwH &甃&u^g:+92&uq.')9EGz'wG," sݹU@8G#Ѥ\NX`Si$f,&?+X[{sM{̫ꪮhF7@CfHCfB҇L|O i }* jf!4$EO @3vF{S]yל>ν7WU Dw37Y{:[{E&ڎϬ>tvw?`/]w]=42y)`;nv޳Q!䱜e.o ֨C+L- W_{oFPAX~geC9 3-J9sDd[oehg.$wҒ)tOֶ{馂D5ij_L/[kuw(Kqc@~ԵW.}#ϕ ˔zٿCFڕay)v|I\+RA1pb r{.{ҭW~a꯿~r|¹7.A! bj)mӱLh&'g9mQ{qw?Q Q'a"/i+V7_XdL^dnZ{9Խᄑn ݲ]n5<}߱S+i+KnGݽ""$iރ\m7&}[2^_LwrdEq+l$vWΜ^\+77_ 8VIۭǖ/]Zn;p_yg}WE/|҉Wn''B|Zus{XWo\ڎ Á\㵡?5]/^y$?rc}pPorn9=}}4b@wȱśyc/ȞnNd=z(tx+׾}\u`%W^^4\6XH);y_"*ǗVҵ[DE|py}c go6b*щhD{ wxv߻gß:ɊVz}s}#x &_ w_'_xg\}{[kv,vZE5UD0()cHV^F zDl>FXM된)j$?@B}G5 /)-5MCv`Pu~&ڋ]K⍵'YN#k/mlmv:O]t}}lgͣ;Kٯ=~5{/ѧϼqu'Zvƫ7ϯV?hבΘ3sQ+.+uLJc ttҮ'[}O||iPKԹsmq g:˧ӹ.oo}?C'A؃LJ{l+2O߼Qn<|a͝:V+o?O>,>`,Փwߒ/>x 9PqOSϝ~ݍ> WgR6,/vzƯκ}Ʌ u^[]ΖΥ˟=76<7S_YN|7ZiE3!7oHzE>r s~qܷ^ƕK .~S˭)=zzhn:Ͽ376]X_♵}O e]oS/s?7nXRVJ-nX{{=zv,f3c?E^޵sbC 9:/?ߎz޺n=pn͝<}̷߾y枮f{δ8bqyrP~^ФwMaN?x7;yzv?v[x~rpx+/'[[“/mSyD{n7ؗ޸2ū[r)cC7/~8?=Ѕ7vW:K=}f638֣v7co@sn,wDN+:ӽA!;7po\ϝV"NR ؞=әν(|=ͭ\rNލՙn?yԇO9f|"])Kϝ>4-.-;g?-~gon'V OyV=6+W[~m}n=^gwsbqexYݹ5-ir׷g?~jŖ=x:)S睫[gi{s3~no_{/O=~L9G{Iܣ3홵o~o#HgKS{W7dgX%(8mJ~F##*)C&49m,MT7tW:"@T7iw@[4~Yi{za 3 Ivc'>d~V+OZfݽ2JݡkkGe?b6BN_s.=jQDk z啋7AYJʁAߥ}Kz3y}f-vLaL$q7mLbWgՒZdo"97CE4Ew.ͶV5ek3-- 'fFԙ]r;jp랛I<;7݊"(Jl9W߸ ._8mw2'7^8薴MVDݕ L &yNI+ni=(Dþ'{f'gnۤ+pY3yq_%0fNd]̪3j/ZaR<>p"N3Pwefa9.}+~~^qsmf&vl^=ZI<$+w2}"9+"vOR%XS}=ԩ'JٗߺL*ݔf9aCNk1TكH0R"RR86{i !*Ք)o[l?XvwwߕCn"6cn1 D-C)Q&.T$~抈Pn K rUW5:@O5DJ0H!J`A)3NR^柾yO~l(b;˟yIӊm"a*E,/v^cK{!UU!E%uJ)0pm)S4 G"FZ'oJ뷿~?Os͔qűpH">!x0 %x y9ְ0~MԘ¨sB*5 cC(JmY'"Cns'ꟾCfs?vWſ=sw_z,3Si1r@ʹ"(Ւ8%bVQ1d V)D;4Vh=/D 77+×RU~%S<U5btKp<ʨ|ڑS']›KMY50YԔdyޡix(\+ $N?u'D%aDID$(dUA$X""E-e8 fD<p!Fqm/8m-uB@( yD6\*pD\*"h 6LY…R @B -CB]Hn"6{(AI*D?Z~O=FlǺ23L*:1yA+l^sq!I "ҺF!DOfʂ*Y YP$@C"f)lr*^(NGcdA66ݵO_s׋S0lLb#k JjzU)DFAE@ bb**!@D4,51 !"xu^P** yˀW( $'[^zaNbl@6Bb1P* ($6 r'E XLAV 3z6Ǔ'G` ĩaISMN^`.`{U CH!{Õ]F\l .14X1ԇ#֐x5`TƋg&;-s|%(8U)5bU vNV1^3 OKՈɑQd ޑƑ F sizQ3\T,^8Խ|*+$&")E99"z#gd0p 1^=. P-:QU((I)s):1}H႙^=Т"CG&l%`P&D_ދy(PH`%xcXG&"2D*@ZJNUB hI$FJYSs}۽~wN[ i-<D lflC$YzdAx ^abc!.[hl)SJN:3-"G jIP52z"+ށa}wǎ'!ۀ\aV&jFTf w{0r#eQeC!cث 8V.##v, Re,*A#RB>Z_8ϵN-F6YK!GgLٓ9DHWauI"!u+y#رFd&5ꉭ@mD zUR+< ;oΧC+ DF}@Jj%BIޓedB)w)yUbʆ=<`HUH13:!sz/x\)2(D(R%2es}x}`zq$, "E7B S~e S6G8E Otb[o^zs1h!Ի`C#,rSɂ8 vBJ;U4iiG:R];Q2=+шQ_yETw"k_YH `@B N9I-9Eg k5`2B``},XђX&T))Xqk.O@ DkDJa(Dɐ+6JQ ^(&p9Ld{ Y!+Lq=ͭ3lp8klƴ:C/,»| /pST)*vL\(l sxAB\G`f&LThKچIq DI_y(c6W0/PǷ%5ldx#CZmsҚ c:0z9RJ# +G)o^FFoFtuH|4C4=M !tuc@6xuڠT;$O2gΛ܏Uʶ3Ah$CiDhP~!Y~4h|lաzS05Ċ$0I]iu;#f"B椞%&D aMF+$j%ֆ_I(]ٕC"6X*$Uz`5X+ 15e]ʃֿ=%iϩֶ4:&@NhZ%2:UC4Tǯ&M(0zאEv(&Qm}/)nIѡm$ִ`FnL;nAJVuo]M#!zOsf.|=H_"* 5DѸW_$rU  xix@Ճ$51G?M85n}QFj舢GI NBf% $>PG6 U|!(yG$hzt盛 !QhJl3$bFqak(Y)^UT:а^'BlࠁFWTH-N@ @+5"HSC jʜdNو(-z+TQe5(ܨgBo.pNrR-K-a"6ġ&իB}z~>)7ZH T 1WL2ѪG/2&T)ai6 buJ bc->?kJ UEl)^T.'- 5_F3>^T }7{r72MBL%Ɖ:/eJ NPä !6Z T0Px+wT a#Ci̞\ dk)ZJQnR- &6|ПNhXJC2fIt|5k 2vlcW}vWƛS5Z&va(jQH V2 `DLmIBpjqr` 5<L,ҝX1:" U [f4Q神NZSUIgk _}zkNuKMuꑒ)p3qsaq:"oGiW4v¥ 9ք<ωdthXkG.)mķ)@T^nD]SŃirD2,&;5I8*aʸn'K@Hi٨}C 'W:5\]\KO6  4H( TpbbAgKC -#WmnBm'{ƖJ&@bI0ȱSEbF!#%RU|u"ٺĒzv82!CLB#$!Yä!0!w"6Њ+2物(2Teɳbt%B_@CPxA: 1&IFl-F?Aj=T#ǔ"9D* SFxtd/9ȇݦ:h3 D^׻ Z6-FGLU:o3|~w{ԻSک6sMSiГ*:{5""FUfMO?A64ak ׇsmJILjRL`\bM)!PsPU*h& #AIHwȒ@u\qjb%VG%K;)? ?I=R" 5wN&),ql*@XշkdʼEkF1j۫QV_\ $fP\sEqi-\#NiK%|\=cg7 2sr.=1Ȏ4rHW7 <È(fuR*+f18 ̘"ʜV(Uj$m tbRCm b`X"Չ_BۆReFK'wiH@ 6 Q{dD r&(VJ Y N9{5deiLlc* "I-`d˹B (h#:ȸ2Yq+#K 2?x\@7۠8$,cGZ.:襥wټ/Y5C6$_ ]կ0ot0Nɡ=DmEF5O],8oą(UQqN#1#76hd/6:PȎb-),˜Tfz49څCj#?0Qt@_0UB]ʰ@t cCBX~4?/x54iJ7IִzȨ@QU]Xb_ۘ Ҩa'*e-XZ D\pb\-"DonEs cfhT.֗X9E(50\'qdTo%hhg1U ""n|VlxL1:M*^Md4IJ`,Q) LD1)P:u B3%Tu/XZ29Fdu^%XlL\Yxú L4¨L"L+u,"4fܫ iD@lvR#83cL"nbr'[^&qaY1<ׄQT+MӴ|8U;>nhF,u eCN|DTjc1x[>!Bq}M#$h{}EwbnetXI˭K!]TSr+Zfj)R{fʦT;r4:Ԡy5{)NԍR#-_[;'2rd q>Ŧ;x5EucbsʛK{^#CJFѣHP/ "B'LG=$LqT㴾nlkLgݰdWa"у!aNDo"Kc;|bG ,C[)P/22;0w&ND7@l6U&!̜:i4 *_#FDeG1_ QW LpM-uj|G)e7:"'8Ƶxf¨\E\2l#F1DGkz‘^F :R, PU_㈎V6#e34X6jj'aTa֚+6&|+y1>M_׹;'wnSSЈ"G<90jXO}p5ף#6}#e˕rj[ф,F6ϕc1U8ي;/h7G2{vC])E,=Š׮ʔ(2`8;EY X W.!4Oˮp([Q~Bt1uqȶ};mKG? T[GJm^';NHiݺӴ`r?ID=x5?D:Rԫbp)Ncjt01{+:|A7zw:F)[iQI?C4e[܆+ߘ<)y\U|>B̨DCymɟTb:%ps0x?>ژ]WFtQI#q&0ƫU҇4@"a 1zETOv׹+0AuG{vJSD*"U3j(wҡQ΅Ѩ}>?J"zUKD;\RۼeʝE9A:>x1e2Ϻ=&vEPoƪtgO{eNH~:ݽL{[ϓ>8y\lHQ~g⍍h4.TR g/#*T)Ȗi"R48T'1Si^YE,+G '"cL]@ʡf6uV ]fnvmnlCS+izdx0C*߉qT&M}=KMv `M/8"IE-QXeTɭiH1F]JQHFߢUVs̝ts$*t, 3~hu&zt:_Xp5*mIg`G_cd%-BqX|g]r;ojME'ζ6{7[=wM*'0,>Jxuj\?:F$b 񠏪:~woG%7ZmB@x+8Ƒaey51W͎2455qT<}> S-JSJ?!l \페Bvh;X?ɞǣ)QpIatG?ѥKY0bqByDvZ4BAW}1Ln/˲ߴj;}.gS~/O!xx@K `ݓi }C~ћ-C\31 й{6&a$9>CNƴ4軆'x  ![櫚Jo=qC^VkSiɺJ&~$WzX{AwUQ,gK;^`kCBu;y H2쀉winF~ḿ49M׈EsIñ:fTk@B_Č7FQ\{!Vӭ4γ vN?jyW%S2TxVٺ*?#>C$۵'|EZsʊ DX9PBɾ//~+y*<ɛX0>&č ?BY|1:6s_I5LWLqpq¤ur+nZeIW ϵWX E{??[]Im:1Tcep`dJ#I>/>0m*|u ` u|{R sX+ordErgZ~V}6~>H=ESnAS8ẹwإm  )c,n6q`1U?(fiԭW@hE<՛](i4Tej}s/sEw7J.pFSN HG((8]n trVO<ƙvUXC{S-=n{⾴ˮؐfv囝̖gMg~irՕl!lsCMP]zGԽ"|Mxb(L=m pRZl$MVܲe|hE7dA"d'S;3ƈ;Bs[c/5j6ȑ٥YyEJC{Z鼙h^YVN:C}܌MŤZq a iG_WCV)b:dSٙ6r*Sckx,2x cc 0*2LAx|*DQwJ*x =L)9n0qR5MqX6D*R7`/ WCel*V[RQ1q`G( Z:ø0;V8Tק,)'PSjo1܌r<sdܧBBpvsߙ]\$nB\5Zi,(6WŽ03Dg5ӓ)wDt%A2XE0cHQ+yWVv·l1Г㿏~S:W s(EQ` KP%TEH7 uRM"g$_bJdyĴپ8ty߼b%Rp00sn,:XC=PoPuZVR-Jcpq}J#B.l)R_ |tzY*9AFi_glV.Z4mA ΂Y8I+[wȇSzoObj1=ߤ.,cAVS} kz niz}uq! /]|UȂF Jf>D0I+o:TDZ'$í:LQ'y?eGKtlm|&򯟰@U_eA'FFFKJ1;>Z^+#7MUrquCEu`\UCZvRbj4v,B%D%{lSQeu OnR/Q.9b4D0yގmNs+K9^ b-{H2cH[p3_,{H5dGP ǶzH[.wʍMdUA[L]c}R U0 pR~S0 $eze%9nrp :N9<Xm7VR՜֧I=e octQ̹]%iDƱb6F]*%CH&Lt\ %>$T}O9Ob$] Ȅdf`UpW׶S:Bv < jIjD1CM2{Jd~/ԍDNzUd#deL-'uֽ?3]!.zY2$d1`uź.71$ͤf׀C; f=)eS<^k0bzb"x&&Mnr,3;]كg5xd$mF})dR2 ),1 LwJإ/qU}>{ʲTp1WTL%rlЬVhYUqd< Xf{s&69=ZAJ<) M}:d/v&s l=&w (O^;VC7;+6r68>'Yp͈6ZAc; /)!D j.?(h~WO}fuGFy*ɒ{9xv h>B^nX6~&mhN J3*N$Pdê|b)Br+42pǗ4nWgIr6$f)8(DCa ST[AB-l[$(suցׁtu$յuKbޫ+Yڛo . Xps֭ }Mݞj(g1Hvuȹ M?dd]<+~uDΦeʷ ԔW>u&}?teep_Z)Y.uΣଶϳ6# 0`_sYwXh Va7S;5hj Dw@3z7/2N;+ׄ% cnT7>GE?W%j? Φ w$k}x@#g H&u)2$$wf'7wPmh4r2auv"oJ(_ŵ˝9'ۇ]e>A6UN:@{8wN_o*ɇT$ =%i˟o[ [uSc+Lq (IPS,H&$:^X!C *%Pp4'=l,@l?Ql13(#GP?sgk3K 'ZFAqU0" $ 9Q)'ͣ?/lGوNJ XP-)B6 /~KssrkIENDB`instead-3.2.1/themes/fantasy/down.png0000644000175000017500000000160713267071775016616 0ustar peterpeterPNG  IHDR sRGBbKGD pHYs  tIME 89bJtEXtCommentCreated with GIMPWIDAT8˝OkeLHRK*`UQM ݹup, _ ]UC)4R:MbM3M@Ks{s#g[ۙPIJBȀ  /Ma}o_o7@a#Yc,6()toi5:4Q6oۛz}ۡo,@Rt4_$!J'}ݱv  ?}ZqB c1 XYo (?tA:D%c&}Ș|}cuvtww  J6] } SCU =R?G)phD~%t#ojnyK(N}@Bޝ|u-^ڣ|5ɴWhV/.}cFTD=8{=_okY%5/WZ앂[Dg%qf~s K#_/k;jU3WZKF26/uO|{' KOMb&Eh[X~!jXGDTc`@nzP´B賓>6w6崐7+nV<`-Y-lQXQ}?#F^|vky" T0$bQI6>>B-1$m9j ɤZ=;9`um{#rhIENDB`instead-3.2.1/themes/book/0000755000175000017500000000000013267071774014421 5ustar peterpeterinstead-3.2.1/themes/book/theme.ini0000644000175000017500000000102013267071774016215 0ustar peterpeter; $Name:Book$ ; $Name(ru):Книга$ ; $Name(uk):Книга$ ; $Name(es):Libro$ ; $Name(it):Libro$ scr.w = 800 scr.h = 600 scr.gfx.bg = book.png scr.col.bg = white scr.gfx.x = 18 scr.gfx.y = 36 scr.gfx.w = 344 scr.gfx.h = 410 scr.gfx.mode = float win.x = 400 win.y = 18 win.w = 350 win.h = 550 win.col.fg = #000000 win.col.link = #a02c00 win.col.alink = #606060 menu.button.y = 576 inv.x = 30 inv.y = 460 inv.w = 320 inv.h = 100 inv.col.fg = #000000 inv.col.link = #902c00 inv.col.alink = #606060 inv.mode = horizontal instead-3.2.1/themes/book/book.png0000644000175000017500000156341313267071774016076 0ustar peterpeterPNG  IHDR X'sRGB pHYs.#.#x?vtIME&4=tEXtCommentCreated with GIMPWbKGDfIDATxl]$IjfY={#>QG>"@G`w+#L`QζTWefEx_lqI $in :眙 I̬̪41J*͜c sd|z1[$ÃdfJ9Ơd>zc󚗛GD/@suDT@>qo/3!Pp>G=(IUR,e;= 5~赿IJbGN> v4o=/G<^v?Ss U4y04$4`lh4J9moiRi>jPI2ˌ M O@f30c? t苬,3X=|9$"Ͼ7z]Ur7IsΒ{;8^IWA/Rd9R~^#k PCkRr~@24QRejMfn*FrODI=PUps34@2UYU^xQaTUf?t I\d4 0F&+6Jѓs95_~ԻsىU*ha~VUc9gU9-3!3L{ 8gIA> 2Zz"^5$ 7?mT !Y ߽}9d"$iNp'10se;gx dqq{ 3S8g^x.A}+ `nF^sV 7NyurV8I {QA{KmY| CG(i*TYt`x*@:t+D>_{IcCfi [{ $59V[=S9;2ygGIZfl粵鞕ǰ "KP{g XWJ)wdwo<%Nv_qQ  Ľrel%0H+}ؙddVN@*uR@ʠtd$%TolUo(B9c ,``,~]?}G͙+u]1A1HWRZ'XvU^s$kA=яJ3{UyB'w] `wDaA]7+&ֵP_#|ZYW;`F̟u˗/ffnF='bjf8eU.t;!5ğ{J{όjAH+ܹ~uPtVikTe {$; i4A03dkU5缮<97+4RZNI)͢oannApk5Cw9uAߏ5fRgýJH+&H""w9$JۥcuIZ(I XI-U9缮ﺮRV*w%mv[Ug^uZff af?߾?rqy{Tc׵RɮX4۷o?۟˷rX%*aOxo̲dLjϺ̃k)J9a@1lTĨ:Is9g]Sǯ3"Fsϥ*ND#!0cwqH:Oy:K#d4sr& QU!eeaԪ>QUUJf69Y]wqeu>}_?aoo?k^bz&kfO9:y5Iw;#|"aNm#V>*άѯ'N I ʭ*$QdScp]qc=#5CcU$00D-/Յ{?ޒ:6mx<3to~N[J2kuc̼˽6TUp;g]#8䜻q4^$pYU3s^GvƻswFK/ޫ杧.nbd~~}]ȹ5t` @ "[CoaX|" k?I)1FU^לs1F )繄|~1Fg!d4ws^ F.Q@*naqO dV'g޵G?277*33sj^5~i*]v\6wӬKwں9gjΜ=9oz><^;c/`77(eҕ||Vͬ?c'xoU9 u]ꎌ fEYU~7׏_+iM:묅~I_43ܻ8缓*U<{1&*+>FАn5?hםV`fo3^)a`4*YW-( *LAP&2:Yv]Pr) fݍ"q0AFcV@yfùrw'RE8$ )Qt΅ivBcDDo n]Zu8d7r=>%) jJ׬sOa*"XY8gTxftws70cEPb'X8\׹4Z0Z-nB;0*J]t.?pA0*R8@_Ǘ_?/z_wSU|>+Uz׼58lF{KħѲtu]I[j}"2.i'H ^AyKӲldC(4x@xSvA|c nȈA1y'w.4yRtV)ލ'57qTr$l\-N-ZaG_9!s9%BW$2J+auT/;cH8g_Q9guMseuM3>NvZU{Hs2p=e-9K}j=B@̜%=*a~]ѽ}y{iBE_.TUzhh33xy]gf1f7Š*fVלlZg?+V1;sμ =Rn=a*s SE=bd&1Ff5; 5jGu_81kξwJN}gg=xPr7X egUcSUH)y^n_ow__p3+.HN?,??%(yUq]y̏n$ȘU u'ILQDvh^csN șFZҜW/Q$:r]vBZTT]7L:Ut[ Y*3snxU&ѫebJ͔t]W϶< ax\sj$v07c%SEGxa?ys " ]WF}Mͮ80R+sFҲ0̾k=ޚiN@&$bA*%x1Z7:vcHeW{htaS'D{d+O1% %c%e:9b)=!7꾯-PfcmeuǬSK5qjsl 7sۛ$q9([{ִ BܵQ0jXlmkcݙVWf` V\٩Q4V593Ӑ{GO_߿(?b( "zQsw %t3;ywLއ|LrvTME e ݓTUFkMB!O2d:d/27\ YPUխzamJJ"BPU t3ӄ"&k@TV QTAq:zE޹/m\bd=z/@xVyX}բ<ClZ[ǐR몚8«P7_9g̏E^˿8;Y9f\=; ڱC,Ntw0$j%xz HYRn0늳|XJ#1U{ψm&q]O~vn*%%ҔpwW @-gCXBDVQǮh^~ xSk@؉YD脌Q &xvۈqC2ˮ|9DH`x#z3m؜3spc:ϳ)=J=O z13GrΜG_5ƨ*7˄^PwJIC7٭w~v w9z6;0=yW̼}MZe8Rkޜ.Uѣ)ի:Aj=92fNgNVdFW/>~qW#"Y?ҷhhrl)잢QmD8 S*c!PUf)|.=HϐGlʢK6Ԥ~b' X9n+>H+UZD cK6ʀf,V\$Cs/h d/66gڙd=YؼP[j[R fnyB5J7kA&?/uA)8)<L77Eqc0wdvZC()Xjy 1`eɺ Ȝn7. 'BR)<HyY(_UUpǜM6S4ܵR"OZ׍+%ΰ=B뺪 n-&ݛT[!3A挘c 4&e[&fҝK"r]9/wմy}HcZcTU,&s:SKa/?||yZm葖 ޕڝ`S?5OoO_>kA|vޤLtJsr1JP$VTk8F@U3}ͪg_W^[޿VbCD SHU5]_ẂKi7qn46Ši{1Fd^ FFHVW~``gN3'QRS|R$wƺىRdf56望#V%کE})f05ֳ3a# a%}x_F8nQQS:!W2:{3W6x?>ea!E<ʝ,ЌWZy6,om/kf dXEWj Y9!Qw=c9-$lU i[X+ƺǣ};Ң웋{7wiV7;[9{ ( vtps^n,Ug F}hK$0B`͎Gu~M#î*%s\X<+i*M.䒳Yq|h)ְ͝|KY7Z .yg+'mn 0[IC)milV n` ]z)x~+cyd-^U\6% 'ɵ)@S U(ތOkt9KU*\`%Y-&2+}Qy#E߶ڌ%aLS Hə6K QS춠E!1ؼE;31,|F,]^L#ꆳ!;F5__j:n[G'I}G3_n>S4FfNFqG XR՚>wѐ!EhVG([@PpVƈ27U0Sߛ@YPbVeB/nUhsrUAt_rNj*Ux8VǤ@;hĈ%9ֺ]f̝T#"3^1ƽwm`pS%`%<"do+еĵK)FES1c(+W>:<AuNiNg'U7ݷӷ?{GΫGf+I9IJe5' 2*DD$F ]nTI,VKv O>}_^Ya¯]D#ܶ(՞Ѻ5%U݅iHu2'z&5˛F?{{,0I, mL(s#̦׭6z4|LN0:M1^F=;,@Hc lDʽl ؖ$][7Ȳ,}w.cDӌ%1˝͜|qB_I7䢹 Gjh`0)kٽW,Hk% w?«ܽ|ZYJ mb>wO᎜X5%[oUB_}%nFڌ,Bn{VYzM6V |k4+Ng8vɜ$h5s]gUgl,acZ|kdFkfˬJg 0*r8d' 9s]=ArAYd$gܳK j̺m5mM ceMwA|G(%IZ(&D-=ۺoLǣ)b^V7J% #U/[r]«FsuXXW!kОZDY.j\mlN pfn4AǧJ䔂wtÚ]sE3[q{lR,i1Bw1IQ/;@xjѷ.iN"&ƒ4?tb)'(K*B-MɊX5̫VCt76 hQ&΀@ )o!U?\5+2')]9ixq8Onٮ*fVU8wu/YeXFp[dYoCL-yLO1JMnD+Pqftٛh֬*`0ƣme g}Re}'_.S+bƸ ,zҨn/ĕW AW%޽}fŏ) cEuZ{;iQYoQ{\3(iwb?Օ^B#Ы}a}kM%1^E- 0rGj@C #= *9-= 3tnSyjݗmJ!j  bi6e7&i&)ۼ +eSKU9r~XsvG\2/L(kΜDZvV- t򒅁-՚.yݽ4Fl7= El[HrGN^QBbmWX0+1bK@#~DOT $&E sR4ˋ*de@ކj ,U@mA.|{{a?w1 .' nO$Lݨ`]%m]-u`fiw"yd[VEXuK6ĻMNY&2+7v a7(c,KLU VZ:H {x/i1ge]nl-N!WV C9 "uofn8/n׸:K%>fn!]H.a񶄸T_HF[g.^Ԝj}6l&gU;Ëj~mASu mqM}Un +6_*LJf/2-vbu^n %Z&4"$_ú.1̝pW_ JRV5CwFT].&6k]U ºZ;s;b,Qz3Ujw1-MeWtwf~:0k3тkJ2:X9=ގCts{TaY$`]J鯐n< w01p@čSݟ{hئTmgsYXnn}E m B¬Q%A Ћw]9-ϿΉ[]%?Mк .m?yL=^[p ?YZ1TSbgޮLLP4=t޵mE qܤFl4 S-D#2qZE|K9o¦E.-cjK~ gb_"WsVՋo鐒)dg\5eSFͽ0ˠ"H (#r`mvb@dYX@2r/&9y/G["`c^\16θK!,P+l+h;\ΐLqլye-'J?trTxQlʾ_ϟooƚ'B` 1q|< Uj? P]iq]'c֠3۲ᩬV/<1T51Nj>NJ6n[@UL(Z۬dC{d&}'*jѣ&ntxiGSL*{mpoJ=!ʲPJV:ގv{{{0sC`(\o*M%6]õnLӤB6=1@awvvy㺮Y8͈*ETՇ,ᰞi8a9;KZۙ,rDĈ;z$GX+KUD4cÇ˵HrZU\PBobG;mdЍр7k]ff1ltU%J-U :s3e2-0a)ms!Hd Y>w:D}TZxdN;[c{ͫTFsZ,Yp*xھh9vCEg9gf{X1YHiRi50\vp}G!fRjZkLu9cK{зuP0ٳas2&0`oӆfou#cl<9wqTe,b}ޮk^A&(E%tUj&. ͙`5i" 8$\]PKm]}TQ;Oh ` NU!q<38ޯrs܉ PSc(Unuڕ8Ւsnu71YueY,.bWVjM"HNU{ic%J1n>*0Q%xBZZU(xPn q ЕO, sffS=BF}wűȏc= >Vé̫ɆlmQ;oŕ/#H?|Z.u}P5xm}nƲhʻ +tVEy1RҀLCt+8L}C۩fSUj/쟜;[rkDew lRQ|q}jY1-&|X} & `՞KGhLSuY9!Y9$)oF 1br4}s]`x6K֊pDP ,hBΉ,>9W1_ uUTU)8ql%_5B1avY;^ [0;\ euaJkuu](FxcKpSiǑu]v]g[usV,MTjX`2|mb\Y(Io>u5;Յi~XcG~qwa26t &K c>O9HuUZ k?C/lZA,11I~6< pe_6\kCAf;PAFkC=fsk%}$mڣx9JȍR4q]u`=іQ%Rf@NHF!mȍ̴<1;;YUCR2ae Gӎ[RB 1rzŎs؛CdK8WgDcLӪ XH:O6U,O욪:ɧ:ԓ-F$LaRUAȰ\;̥9Vx?'Ϳeޢ5a+`ٮ"] 0Hp 5S( W$ښ&;Fpᣰ>T>,SmE>yZʆVݙpiiS_ǹ3:3441[B;,C/8{S6s7y`gW' wRh[u>2S7HQC각j-!][{hsxx3]VX;%.oE2ΨLb{E 08)6E3yoeVSG~NonKaԄbk4 | FVNt]2C汒3Eǯ l YU|eWsoB0v9Z7Oؾw[a^sbr4; d|XG6u%)3>8qpއ=@>itj;"~gܪ{-o43Qݠ|T2KK4w_js͖PoHw:_=P/GaEz }E{\˰<82D[^t{YBHq<7z?j$78)>d9lΝ>q&h2kR%$}7ô<{A!-Xd07il\p]W/6iACԭo)f!,{2~u*X`vl[|Hp@3-3Km|`mKܔu~~"W̥=rݕ$Tyϝ>LoyO+w8$KkRvy %Fo,(7?мn{ m=,-vy]˦,kyv#y|{{sx]>hyqY>Zk$WI97fqy4juGYEo9rS/i* 歈nz}vΦ/*W`67SU&ӽ`6-ZѺ;jo =5Uh¦zh/|kF%ܬ"ᴙF+hM굲UϰgdU^ ]#eb1+D?]#>E"T4u^qDrV\jUUU#r>{ di yŇVۓ'Y.\Nk nr"U0L) K%L (!F= dxTw_IyMD2w՜B3|XN,HD{n:Űtk;{}jp &AS<@<)Ǐ|Ȝi&XjE@ly?~^GDg{Ly#H:֙䙲)s`M$Dkq3Z*eRB D̠O%'*(0,OIa"$`HKdGb&Ҁʎ10 LjrxE d9ɻg4q)rjsx&ZȥW`؈!q9aڿJdf(d iN>ު:53Rhw"RT [nTc`m;)u(cHdߦI9UJ*n˗5׏(Hf1`+D@&#V X}O@8v<.*My6Ӡ@yNL+ [ : TKM_mQJ|:0 7QPTY먐qO8.sVF;17dYuQ]`?[h}V ̋GQsCDE.L{WRVaYoZL=o٣'"TRg V<. H bZ9W?MHBrSvsM ;Fe*>UWZJ<]ɉF1w1,s 'Kf| ` UT6E/> F֚T[6t'.f{lw68؃;d:J{?a",ҟϽT$ ~akmӝrsfX/e(Si$]:Xg.e.w×ӧ8[|VEUp:=BH]&#"Xٟ2Ϝژ"*w΀ řa Ӆa sg!~w fN7:>wdLr%"ӧOC[n1G!@5c%;9q*;ˁ1ՎBs !/dVe47 qQU9@?,jQXHd˷HTDZJ{1kL4(HX@x[qf57zݼiYOj /yp.N5=q*ރdNϿ_uR9S8,56=ZQQ &2栀@q-<0 sakswsSf݈"æ ȭ[i>o| 4Lzˎ妍"g\3'2p:kK"ܴARE1̠d ]s<(&i,жMmfԶ^UTtf%"j*Ǿ=q؆Ƭo#IDZCaPa7֦pg$"'f; ,S3-zk6FLw! ;tU'wu1MUibDDma¼Ϊf!5CX",DT[Cyș˜Ғ$$6#}HfLR~ԙh"&MnuEb<Ĭ|p5 `D![Gtmg2ӄ A8NYbv&1T6p܉Xh61TxW8>ۘ.c 6"|}_?ަIDGS #lpP=N mRuf'CΑ2SaeB,%Iffei y-[D;OϋMyoXcA&R`D8!n<-i҇Ŭ$sC (3dhT9 :x%3c64J֠RQsb7Ք6#6b%#nf!(Y-Ib>)kP¢EQLLG Fْҷ ÆFY~?> jMf-:ϼxzor#<܄dcR35'm:h)`CBZn[߀˵ XC4XH™X1Jkmۏg#) ЈEDJ,,(3HҸeEy.q4IN*pM Eb4O6n_|J3- i\~֛yխ慰o`1/{?g˿$Ψ1{цiI ۬Z^89Yێ/KTsM7Cw%c0oV3돨 (OA$dbfaۤ`4NǶq;|1ZkJp%ok"!3L~<DZq\o7FΞzR &nLx[pzꋜ~4ߨyCoa] }qoz˨?(c۶_~}c9Bu9ʬe{8Ž}-Px|bTj^V [Y}%tUoۛ3ea0nJ prr|V{X6"ꛋtu0 C>9R[8JLnq;"Da^(r R/0D-;7O./XI֦ u6g&XrrI;KWdk72U6+*gȬ}P4OW巢O͇pݾ3?| Hi>]*ӈ-v!x<Qlc ;màWRU:N/JrlKRR\RVhoQr”1q'Qi9w|$f>h=i]XRJ寑Jhm B09@ ը&M[s}^5Viǂ<,5s4%l u}%@)_`U> RMZg,D=L ne>t^U®@I׵A#dPoX$^ip={}Y<7Ô[]x3/.nTG~ף1̢b\0ғ㕧sL6*|:szXyZ%d&ņ2h%;j${k{Cэorई`.H玤—f2SXU>D"ᤃ `˟))q##bt1jD/ i\"cFDDHTu u0-&=Ђ9 EVi5m!j "Op J1,l,d:5<릈3*;U'U(MJPG撽1{0yӭX,>T*׆)Rž$CR'ҸE:V^jutXuxW E2 s xچ W7Q x1`h'm_nMmr ]| [uOHj RzDj']hVKOTcAqޅ[k$zS:0a^'Knbz*z=g5EKCdytEZzoG dbpilM9" pSЎWksxٜFݖ94kUTl&"f+19yDZǝC(j@Qs4fPF:u=TnwnV tO*n4ZW6OW phhxS0-w6I4ewΦ6u[6q]S-1[Dr[ի"Po9CF2<"k92$k2dgf­Ӵ cn^C #`2mWUC2XTÂ()ֈ92"#M7J} 1:nN6窞hnj3 ħoU`șmWlt[:xtS;يpU44?M$2%$!ќLNJx_!E%IZzkbv13#^yQa|3 fֱT`)kKCu(|\_e/mu"˴lR{j\tfXMBf-+i3)5uc \yG!)‡ a#(D kg~A¾:j=%'QXnx8`Ƥ H z4["'t3c'p7&tĄqP>m 9>?026,XZkE[ W/4,fp1&]-fd8Ny 7 9ִo}?7o7"wr麵O=0m{Iׯܟ{W=GShWQƈ,=mquC2H`Qh?PxK!:pesj&BD ˉ!%&x5\~¤=qȰ"!Qb27YX E |Zrgw^fջl-dњ83eb!"cEMC$l,o$JrxH^#s.]pQi*-$#ztv̈́&t0PJ1en3ƭD.C ' 4myfMXX<&%DܣuqrbҦ1h6"1 ]+  oPUܙXl&G0XqU4Gf]zWQzZDZpI@ᓔimm|]ýyxW#^fR 3Qu!D8+@sw{IMn+~xѪ(e i?)>'X uJ -dhI?GU1 -ƋR᫊ fF-.!7;||x;I0\9W=Ӎu(wnJmۖUcudKbvDn窛^UzѢ(u3wl%SMG_/L1G ƭ5QX9 c*+pZpzgFsawmr$rrt,% n Q-_+s쓗vK\]ED^HHQXOՈˢUg:e+8dE|_Kz,c:g^ݍ~;ÑuC0~II |kW௪m:C33$ksO̜V;Yl"6[MY6<:|⑱# 9}HWa~sO~Xj%Q1<߫FښR7SS*[9QWmk]a .tnl60RDr3=S'Dט nęj d-fhjŹ%"ʣ+|d9 j-qB^}pBVFpeԞ~'eOi/z=dMbY}%jrQ¢(VYqXLk0t@PFo1VW- Vje|/eVԙyPWPJ ̱hPCN?U+Mq}vA 0gsU˰[}a<\ǃe>q?$ϦTNZw::1œHba4Yy: țeZ{G".g}Yɬi}JɃ #(gU[,:+_3ȓgtM۪yy_VDUx^Ў/W⯊βyC|ue.⁡,=1RN‹ |}13Y&F_?,Σu9t%*"šm yHl,8 DAKA>H^D"_LU@Aj:[۳yb2Ķ$3M|SipwYZpK5{J9fBD7b-X\o;T߻0p>R#V{0"]Oxv^ VYOKTņl|sEx(#\)zws jS|1`)+^r[koa4b/AdW&Q i@0$E)*8QcAyZ13SQ#eq`eM]3csV4.&i:҄G?Z7vy=a]-MiK@p͍0 |jZnn(joQKA^x\ !Ϋ:}ZqĬH 5߷̭6|孈)iE;%k<goO<#_+VMު"ou4ύimoѧk051nbj3yGjsU`oheLp0|zQj2#Q@w]e &8l:^rGk23FSI5 d^]LU>+e}n`9䈃")]@Vmp63Y~Ĵ6L Rb'6˘8֕Q{ͳ Jz5d>r4PP#EJ13Ys̓3Pv_8}V2b:Rݕk{|BA xES'?)264FE1>ӻ~l ٮ5ˮ< Qy;~? ^FMo:/*W ˭K<RUג? Tjs{QxDa`@)7 ÷6Lj3\ ԎPǶ}m;d2z2OtGO}( Bٛbc6Auղ! +{I3V^ɝun4!E8ݖ۷jRrYuU'H3Lsc2!wl{ƏLBv׃nYdG@G#xb^0R;'y]@ոphW\zQ\*3vc!(uw23ݖkkmuC6YǨf$zb  KEuO/ϨeH5+LWFATTYq -ml@ZHjD c>_`*v:1MoD 1nA-4W2WZ9ᕭ:/8Z+BpIG ό2f K(Q7$\Jc֚*+Qn#Hk Q,Ξ`ZDEb 9Ջ z-cؙ-P9!JjC|]>z2ΤUzlv7lWk+B_e/c-a!Zok*,NB+iLL0:8$'꥿S'x 3b)5!}HA>}}Qfښ|cc~q_igmMMXԤ~%JxܬIޞ'~o(q0p!7˘5UM%(0,$zӹYE`oC(s0Vj]⠸۶-)6wA`nۖD9P&0k"f)BYݬ{С,dsk ENLFA̲rRр՝cl[itK/u +[h4c}Yt8AY*>qɡW`F. E3`%Seqac B*WN%aUUz 1<Ynac(|GI!3wdEM[t90aљy 5^A'F\iOΩf99k[zIOquP;-_O83Tly윇}~Ѿ2NSm{&7e G&bxr:XW ٍhAZj AaaL``)yRI1IƼ$bIȍv}L+@U5%#Ǿkkșd=mjWX\aSOYyLTUi@0~zL5^`߀dم@xMM_׃dBUj1LUeA,<(AJyί&yaIPs<4N~_s+r5\'8GQ֠θSsZ GQ ͐`w K,2T?rZI5 5w0,@ABҘ syYg*2[JwxEtZ!̐ q9_ ĩ\S;PzE1EVX)_k1 ˇ5wMY>2p0ݧqz[>ǣ7ZɹO͙Ù"Rg"x쇇nVՒqhB4-| { e u t^QsDR0HeŰX'HrT'|`DSpP_RPv7'$9&_sm6tgr#QщM57@6 2J3$Nr{ZW~]r?KӪ~|ϝTQ`ҌYno1F Ur9W!L3fLm}ʧƪ"1%^]_#q8COAJ 0!O?d< XQ~[X- ĭ|VP1h7oo @WAeo' 1WZcQ<Mk Ȯu3~DAɚ/!O喘sd}C7e-ך6"-{:j_W\%.ndXNmCk]=Es\k7ZS^:Y$xܜ<פ`(h£o1ݳF-B vљN.+< cZLfN"j63kC3u%ȃz]7-_V]zYOhb"e*fzYڲspsɮ@Fy%ھK\ zF DZUGO"Di>4)m `{.K J?`$D*ⶌ#|DZ8@eyj3(ڗULÑpJXb؟JaNB9G X3J-x<_~?oG"Ump&M35>s $pǠPpc+OlxOVS A+fN.;! ;e( t]hGh TY#NIoL[l($M &'ԭFgu\='qh*#ho9M9$qQudͮx5ow4Ǘt@p$sIn VZ w{1rFxFɀ1RnNDG(7k+A#rt/Q:HDwDf3ZaG$;9 AxGQG>jD_x<5[93!3JV>?w}M ֙vQ|RR&s)̽mlx6A` aSwWaMEFKU3i-D4ѕR>PlK0cgjcG [zm`S')17ΦOSq<[pi0ڹ6 iҐ޴!e))xjURbI}ULC{c?YTBYzFl$ I8Ebof5j#,M>_z* s&1B[ ?2D.BDZONURq5=* Ӆc=a.=aPHMȈBW עE,4nİcl6p8)2DU{>7ec1BiS7;wIl,lv@J ,6bcz޶Hoҷi=0s!a#Gj-$n_q۴5yQQ7C%=`Yq"\! ՊT7>m y=($Us^D@TN,}ڊ1l0{JY)kYfd]CV5d]f.xX86AD9b.Sқi#x*EokL+LM 걥s>G2KT>4%ga&""e0ba퓭Tru'ayc\BХ4wYwbJ3Ӄ|.YGW>KszNZbosǥCVYa4fzqqK?8\$#0<1=wdW7tH^4`qw{@3hhzCPx rcݺ<92m`J;$"q4vp5S TFܤ6m"p7S"~ ?>oe &/_˟~ٟAf@[JO[k4N7-7/*&Ǔ^ }vkejjVTgfm!~/VDs V*a+ g5, ^3*KK"ʀUm5(eIB*SA6d\@~">CfC-^̬2Ҟ~1fh\htοsK(L9`Z)<#{; RLo<ڜHk pqƉ{Cߘz_Mb֬r|}ߦp'Bg6ݤ!VC.6f}vӿ\yYZedzo5] k:]a4B` "o?uUຍ`Ŷދms3p b6& )gby:\6gq. 6sKN7Db$ ^eRWIZ "IiϘoԀ1SX=V%D9 i|(6| ^ݓK-s&a5\^s^b[7t#|-+KfD(G+tQRebf>nX-\ﮰ{Ӊ/>qԪjx3ҽ)O̹5f6:EKrնbaJHrG(FL̪IbJX~1a, % c]OuBp;^s+TFDt:Zќ/X@lCf2U/IK\U&"^ d%,+\V͛HSyԶ>>]j>""q eJB0S_@ʢ_%Ky;ܳ |J# UYXV˱$xpabϬ}mB 0Uφؘ^?FiL)n@ "5{L3֊4^r-n3T΍*Dd1=/*1?m۶%Bz9L9qkF!e_GE`ͬ ϴgT! Hov PsQ>^WެX_|j?iy^~U;(%pEILO|/p W9[L\rQ73ĆU`}3xiknV&d𷾬<Jj%>}gWK|Umv[x iL M}%m{ӳ0`;/_2pQ',ecouaawCD RAN#qq#epV˸{&9Dj3%XUׯ0WY6$. j>+뙬 bIU $' oq/!-A!f4[A5USRiF`Rr8kE$3wUU BQDjĈȜ^:Wߩj70C;_Gw ~ &c|dV|ЭzԕbKޒng5}!_>_H~Woj/ 9iPS kwN/jzH/4Xk˩֊J+6FU}sN^s{ˮ{QTաy)bq2cwJsZ'E#&(mz͍ܦB>mWٞ>Ssp 0!nD)L+y?f.KSx)Y.MǤ0wIg$$e_UT"YsZ倅c 8BdϏ M2wʻlڱ}FIo8B7%t,yd |ƘymgHYYTuʋ8QGCx)c ۸֭9}$1N ffC9&|ϘƛKضuFUH 7&Qmmc}u8YKs2Ӝ.* q19O%tDb!b7m(q{&@Ȉs\zѡl2Oi3<I`s3s?sʁO_:6tom!ޘ,<|Bc(朔MWُ#V ڎ 1dxU5gϠ=H {;ĬcXLia^9fu:|^Ec`NbJ48xhg~X_ kP`b$&{ge8`}rsfuR "ps -{wbën,MV]cmV4K_q/2"Lf r-5pG$ ՗DFtxP4W a  BbT|])f* of, ib2}1e>~@EH, e*]`q^>bqqVnLV-ŠV|U|jM]{IxrΝM};]PȆ 6vL_6UD%^4 ."vҮ KwWSL 䫲U+YO`m[YϟmE2Fp$ 73{S@3HWI3I m8JDNSq"bc\Eb?hNXp3W19'$fB$Welf6@&fF qo8lWбY Aқ5j(:f!=D<@R!X ~kclVk%<"q<[N]F=u>U6Yyu|x mn * DC!4!|V(Hrv$@eslDz8ŕv1͕_9B  Xtu5WZeoCMK; ilxSlk=d!$ȇCGАAxpˉMJhs3wS ^oM׻-ĚjU9ff"/ug]j S!"LZDm siμavDZﻙDR hDiP1[|hCҠ42ff(*rښ{c+0%]&KyAN1BN|ܓn!V3Qj4db=~E̳+p?Ř=,hnIz9c=hko&!O&/SAbU@5$5>8\(İ<:Q.>yK{nw%x̬~}YW%)a-*A:$Z5Gh9밄wb]w<-vuۖlfRD7XV`m.9>zf1'b*B¤*6q͗H_8e8, *+uetUSw3rqOAg}3jjhq?1,S\nc4ÂֿңzsէmZ&V!)~k^Ą<La>%C$C0n" unx ANy<K,˥`RHEVȽܪ)=:GB e?ks*KݾineE.qrXEE+X)DQ5xp[If_7 ⊛P[r bef'e$Rb+y1;۶/3wIXTY?[ ӊg0x:o[1-'ūz)y6n6of實_bg? yc}L%z^Х_qsyEKhީctHqD3宗u`h-20|$^Uu' %Cn׮#TA!v&vq xs$W'F4ss3yG_\ %ȕG'6 e44i=yh!W93fRcV4%f,X",֠q;(>+{83f|KͻCzL,E@Mfߦ"VSXJBQt5Ju}Q]$ 禪տUd?RN3~.&4ݝ͉u5.÷sۣ}&>=Y[JǷ1hϵ9Yuq7ICؕ\g,/uy=D/UPa!װhr5i23) qlhFlcڙI}xJ[ÕHU<%$(t3^X׶߉./U܁U8,k*BFUKUG%w$NC 2lYM6]r)%8T< MY]M$9I)mk8W[Qm 0aYI}v(=;LfdFM/^@ٿb!2bC7:`oi6]1y#f=]74? 84yBc 1ds(( 1t3ucb^p@A:JJk!"EX b]"m d/ᖘ?Zm݇J% cT3o"iڂD\2[h6uA{_<6@aJIh[]E1ō7l)*Z-*a~|b΃E)C͝x:Pί.pmmc;*A!XF˕ L-(xd5>KwmMʅ[c#enHAr;/ɕQ9bRS RТG-OeI(\Sʹ,Q!2ש7CYM%ιU:>fyp{)A$!Jaw,dfA.cu4Q~Hx"B3ClC$dx]85ZEq-p"c ;Y)K*z`hŕBDY{f^-D9)b<g_,C]ǫJ=p %(I`ƚqGrbSZFUE sڜف gb摝 \^EX"u tьqwra"Z63-o=_"ͪNSz^UR C"9zN,L"\3-ּt !8/w.Rzī}T07AZ$Ī;|H@V$]̔3wAv4hRL팝Z9 n-h^ZD"h;z3Á%Z^F .++J+,t%rf.Di(RnOZl:+RN"Ό[c:SinO0#'[W>ͦM1[~Y<I"smׇ]IC"2ȏ6!3cgIFS1. Hr2}  ~ T%nrb!Z5Y J UWhu>.Dg+4yIY!"<‹y d"z։g@2] {*;}n7 y3tI;:OMsU&d[A6q FVPE)E煻Cnƀ,'`~oz>+oG<[XsmHS94D2t 2)ɦ pwxQd1L_4c8WҀܙM7r1ZUy'DZaNchlm8g"=C" sd񭶝VOy6'2: !*X鑲Ewn3O"Sjf^k=ViZ ^b6΃VE1%EGủ ,PFIj Y=j9+J{ ^g7mziHYෘVc vR2{[Emm\ZּeWQ>zĴ;%2T 4d}XnU{!$i{=bױXq4ocAA:>}?TGB*;aq/JT#s0U*?Y|d}5(1Uc5Ru4\_O-SCc~3¿I~L^3Ý}>/|YE/Mx o F@zIK|6hrSzkG,yȬ6q\ӽP_d ]R$!пrp*KZZ/V0c ["%[ ӴVZsi>'Vl$}.͎槏1#[u (܍5v0ihZ⾌IXtT8Z-{Dtj+^&]L8EǐÔ7]Z"9lӈCUh+.9E:tvIINLN'J V̢|2fVsl_E8P!QB=VQ!ONUY D,<]d޼lke3=le]ߦCz sp1Vģo|@lJOjQ`_uͪэ"kS{B) ]-真ZWN Ӷ!,"Is VVCi-Cj%Ni GiP4<w}".,t{opw*YGm?iNg?7ro ?3v*g/ߤ]W|kˬ-G}X_gpJ&0wݸ>V}F+J=pX$-xOb풨-c?A"gvu 3\&QO5AV!ʑ3]w9,)FFJH* 0Q9ly)T'9)%*x WRRcl6/}0jr|mkWZB;x#i dQB^}x=z]i@P _ ]Z1}v]bl LD$y; u@G>Qx [ Y|?Tsw/:)I//*s2obߨTաn T7U75?v*s _t݋X0O  u\ܮQxLtFR|^;VVƭYLe~ozEr3A [=Y#0ld}Uě:8}OB`R= Ռ0Aj3T[syMtH c]evtr6o(ŒE%BAvq"THM5LAVuCd6hw8X٦kUԯ>FC܃oxLz4j:L,L۶'mB,gD$;r{W%ܕ3>IZLTe(1ǜM^ݺD *-F 19')Bcs0$UPwK<' %xw/J4&^wpA"$Ĭ Ql#K l;IM?:n t@UT 񗪊*f"r 0DEx|e<Tx?48aЗ;yjBa3|A6BqIN 7t0~}K )\dRc3yc'fen+[>fNFaBnӘ2mNwmnteVu:(V,+}݇z5GQGĒ]csCO/m*#1bEHC"%,HD8@E\Ea#rJ;ZZsNѨY=+;zu66" r)Qx3W>=HT"Xbirlmrұ{gfT Pxy1J0dOP Mcl*.}hhjp_]*#^E[{Q扄e:MsC/kUfq8;q9ei^ baĬ`B(=[)kUٜ"h! \(usSt0JJZ&Z+c[U5IEN `A4pj)LPwr"yx0eQ]>>Lp, \)F~B j,PjFC@ P8h隉2KCk5%}|Kq ٞ t}`<̫7ϝ*L"3mE{EfS ?LPԗ07RkŸeCupp˕l\ H_9?m%b_r(+քfN4y\0Оׇm/`,B* :l$. )\L[Q!# Ti&V|ɸGTT.xG􏴍>v7|7>C8*@XJPAls:sNMLvԝ"PV Cl+oxg]y%&fѳAL,J wG9S0$v;G>B7"s 3̾$’HDS%JE$VrTp8OQ$@6%#tNg녧SSV*}>9E@Z^XgÇlr {ȴEƦTS!s<%=k"16 f6xl SħZ0{Nik"J׉[xL57,r^e8<&S3Ȯ^KP)bǜ^168lTyݜ[UnqD[vN=Qf 8IA1?ze_DMh%*e2<*s*z-Ta܁KTfCB`9ޜ,VJU7C>=iȡ6gEZF[4|$' YSIʊַș6,E4Xp`=X ]] LABa7s!{ntL@BI}rd:iQ>߿sNhA T@w]>T,WUM.os.q#'V*mxEٖN;+qͻW,g)̌p7!NaX(a"U^"nmOLlMiOĎN kS1EV2 /Vm2u@?5R1cl__QrAk"D䗡Epqmw=IVKDNzz}};d {*_R`wl;oۆNw.rEMyN"3)nVM.SHuY ~.Dȏy;bj}*i!mof)y<,lCYoOԏynТV jiYDoTRe"{LV06k$Tc#p8w'/h! 酓ţa~_|{bA>H|_fK{mzJoS_DI30 iA|׎|dgnRLk)NUL&^TP;,d F2c%(aøKPJ/s hP3g2Ձ4"D[R8jxrIBKdZ`ʫ-4\t1rL,6"q%9DQ$̤kvx0}}\YsqL}nH> yxmf1ƋGW{(D}o@HN!<*#ۤ $sP鎊Q#ZRpz5vjU=9 ku=m͖b փfέjљYI>9EI_N*jҗ VPTP޲%Շ>9 IPl}KxѩJHKuÌ|9oԚ㌖zQ6~1wSRl>e$$ `OaOjA] mɒV.ۄhe۴M;"=sHI-j묱N`vqf[T{0;rE- }Ev%Ff֚c(kvߠ`Z.a\3ЃX@u WR,BtsQk fzWU7g(Y#ڛZL!RΡ p|}yf}*?䩝-{CdrĢ>ezbv@,(E=N]|j$xy]%|gΰCI>h2pxL$!>@f)#}F)\@6r Aُ?:[F|ZS8Rc;ٵIM-as)띈lV{73Xd^FqE cm#))SQ3HXYU͗<\"~*V]OAW {<ւ㦛fO_cSOmkB]/zs׋(*Tf̋Ω6x=<-|e݆P+ߌckյNWoh.@&t,kD3|µƍ@ Ĝ:YESQf}{8\jfFqI`YX\!Lɤrf}4+u3={Z7쵻Oms5G3 R5ce|r,A9҅ ׆0GK_|l&ZaqoVU٢"p9yHr+{Sn\$tc^㵦v 6 ҿ,>㬖1oEC]=E7%;C=GCrЍq|(q-buVՏJb"(q\[\| [mO\EraukDqᠦp.x!m׀oȻ@DxD>J>B7" %,2s0?"ݝ^ KR{& + ?5 3!tЏaq̓xA_ҳHfe Y{.PYbmۄmrŗۈ|???iRcАAL6Q 1fm۱ςTY{assZ sen \~ҭ;3u&p}UZ)%*wɶ*3hM:CU7d*4-rG7aBU\쳲w_AUfy嚕k'Whpm)s>uWkx%/9WOng-eT8sLRT]Vws;V'e!,\_~; /C+&A!'&?6Ǐcr\#sP,v֪\(h] Ʃ Z@q^ ՃuPzK5[RrrP^=hRy_o^Ev%ůscx&PuX *EP<1#ǭn9XvJ DѠ[qQ TC +ܶۖn첦Qu9IQb˴*!%kH9"w`~ Ag+ة̾Kcln aJ`?? hYI;R-#)^4s7C(+Ⱦ"Je~-Gߐ/&gd? l84L×S^l:x&O./z rQ%sjE&bXCt>b !'Rv^_S+3֜"ܒژ2U֞3'u v1^3&0U-kM_LI_F/ (pI#"DuyiDAWܰ >`Sх^S,,Fھw|JW\{{AŒ/X#gW?]8b?tj̤(m0b%I^e ^z[d8*dmJL'qϝwK)c|W3#8anv |S}}99H[6)(p s Ĭ_/D24#"lUf V16 pJii1 Pm{i8B蜡2B`c EX"Ab;Zz6gn}zoeIî]`u#:+rF|$5;ݤknۨEU%^'@1=Lx+8b<ӻQ(@D R逡71&͍.i|'rQ (S%ġ#UEf^dL;!!aM#L6:={fp+oKӨЪCIs΢WF(=2 pY`Ep-oќ1&ȴ13ʞd̺ r,;g JxN^=e[975ےe!uHu#=o w@\ÂrkÓV#IMHa: 9Z~ua JZnWI[32,aQ̼`!L;yt]Ǚ/L4W.> _:)vZ}jL%grSřKC;_s݌/$CτG'XU|MD(p^{b9Ch;4s^ب$'|gC͍zKᙸ,P{] v-ϰPS+$¸` "Ď2);ny<WR{ F0"wpwy= BֹTS`"7\0͕t81SXBHH􋶗?8ր͹m/쓪J$a]C뉈IA2W)껈,?x&Z!1I#V~& IAv70|NAyWfTG:e>8Ѝ| ͌|p܄<sL 6)hhiU#dZ^p }zTGd[cWڀ*@Ŵ%J+e,ha*UmV / uUma; 0-dNw|u6+ATr9q|[uUdGkt>;%C7|m |GbT^r`iwkl-%dy4%K?oĬ%$CRp_%x3:Py]kѣ4U0N!7N׋5tTev3# #mv @KlUQѺ}ƚ s2k'>打0qQ0w{2O9̅[oS!.7)rOd9"U<+f}'q`m_?^_9xAH%dHI͖d1  cYghuޅ/"<E&k{L ,*[a^wl-hZ/ %*2(4k.O7Άd}*[ض35*BOuQl>ϲ8U:*D ewy#Kie #g?eF6/I7rOHQf0S8NR@9_[@k{69\ir,n~KP@+r3tW,6GW"yL#˒Dbf)(ҍ!{\sG0)yz1-YX$뇝ĉu"%ԜO͚"/Q'2^5,rMhEAi~$TllmH\T |E52=_z_zn/Hp!9ufvw1z[N+7K* Q(T$9 {wUNOwT퐶"9:\꽖,Z;bӠ1MYRLd0P q{C쭄N{Ʉ Yxy?Cxi i[pF/"YB(BtE COjn@(OC"4ɳW%'Mpz1 U^Fj۶ oqwbZ(>Kq2u?LU[Ip=gD/aԨ]Nφs]G i{@TI0]#M`9]§x~]@i _"dFhKa#Y-ei%*8땰z/TFѰ[ u3D:/|3=8Hwkabɝl[/|.FXgϑW Okm- t{íe\1qBӧ|lֹW`NT01`J,ľzJB܉~5vjc/ 5NK?f\1oF_^'iYr=kN>J ឵B/p|nM7-zQo3/8@ħrHt2>J툡bkx| u~4.o$bj|`(bo BK^hⳉΪ*c?;FSzZm]-t)8%1{-A*hGw%tңt@DŽIQyfƌL1#tǵcD4MCoIEϗl@5{_UUDcĻC]j]oﯗ5z{0uARS uc[w[QnNsnWMLPȍ$sZ8*c] oA,۶ݕf>Ʋ3‚ƪ+0,p+gy;GhBoEA,AnSK$l+Tౙ7=t%sܶ-ox"@OVB 㱛(=eWWKUK5D6@< efC(H:(gp.4Qq~BFozQ3.kL3'P|6O}KJ,BV? &7BRiIꪳ9:(DXtfG iw~Cu,Q"tF}'ݷB+)Z&GIa꺏(>7p r{O-qR*Ssqb+FˍEzk4c|S<*MOXe{æ=1s_FӧH܏cz㾢\&hكsD@,duN(ieSk$צyZBznqJX3OӗJlC^C"+uUD@c۪C D^JF!,,x j"s7p!UU!6&|tڿXm*Q(OҽV1A̞v,Grb5,`$[P] &֑p=vbQV??fw[ T[9+{+} ?@! YXXky.|ٟ-7|x[OOlP7-~ەbˍ_z'I0'*Z j,I(o?ZXyaY`L3ygho-'{GpOeإIG0̂yf)YPRӢn \+r8Ȕ<zD8VZȊ٤*  A%&( 5Bk{Zu2#2 !wvd$P^ݏcyKrbqi P76/R0H0/ ,N88L::2ƍTQWڴcRElb*KrF\'=y^}sjkOR\Ì_/oÌoMֿ\1_i  .6ı^1Ea`8+&V3X3MEl6]O j$JYxАfB@p:Icqt&"1}.(bqyRG(%,)a2›(=u&_cl*>g˧afGpbr(WeCҷhÑԙ-5 zfH.%TKי] #a{yPL۹yEpz\,, %IZD6U 2KQ@W?m:cAG7"plG! {K[ ”Twꂏ}ga`Hǰh: ʼ ;EsvV_Fρ=4Z&Um5;uٔ]U !U_]g=5h<FE dYCk=73ruLsuDyX'^Vh=KJ1cwdPEO'/6(4xq0?R**Db9X0#MlUf E6zG#-0Dfn54;v+6m/W iD&U MB:+w}/mofΦ\f*wmܬ{}+$*RDFbJd9 Uq32EXz!RrB$fj',cQў>aݫhJZs"[& x.w̃ &]9[0l__~X4?=~ޟ8|k|2gHW2@$1YM0VdKo?D.7]փ oZߔg;4[%W?_]ԓjf4ѵPjI|"rM# EU{JC Qͪzj$}q\J: 3U8GOgLR6KI~?Dj- ĶL0YN ep@uLwpN%,rvfuUYS$TɈc^O_)9םLX`?~렇^վGWkR5 )CTsx􅢪! b& }.v8C9PWds\"ǎV9}KZbƀ#݆_.Z-9a2-Q~e}^'9D`0F8`[՛m_ xFp&mݞ° ^5wFϨOox ߽jws}r;afqBݔǜ7%Msl;^K뛞m1\B<XxHC|)::A&>/<,YQ0yf>r>U▭دVЕgǖ)GHx}lw ED!uX?}p>! n1o#\kȯ˚M[ggJ?Uۦ]ήK)c-ZH9S뚴H陂%" pZACpV-c=^{T}tc1"O3s7z$\!N F3@{| yhAңr"xnvy#62$( 6Zi`? _~,ֶuwI^7J"y | I^|D ='&^:x5H䅹fPMyэ 6c@Ct"^WJJU%`>s0$l"`&.uf9NN{C*dDDך̼TA2FUzߝ4!W BvLu$#;û))X03\ &:#z(2q,%DŽDoܻ~ $A޲|Ѯ%{vGVoU7D۶1EDї{לramq  YRMŢgEG,sQV)уlN L$~m&]z2 |8 wv>`SnIjʬ k w S@1^;n뭭O0cjV܏Bs3$%Lc0W:c4OTCX `O{\kՈեuKv"η2trO@&_LCә"T!P7j&IqwL_#w8,(䒃vkQ]-{6vZ2Jz{FHMd!!1D4?sJT9U0[ wwT$T\&n^3'M9myT+DEuGv( @zFTtHl@sS1sVM#:+e",wΦo ̬rM;gAl]qT&Bѫ"딾'u_?u03mz||:j! h>` jծrIU%@5P<%>_"ܽdX&%fwc+>-v͇}Wna 0xJ mlw}ew^|>IwWS@oJ,C*y!MŘ(MEWeVNq=}dly~6s<эjomr$?'RN4+%{i+n} ?s헙$k )-wwȢ 4@vD?wqPAt=0mW tw.]WfI2$)/Wg!:=ZDxwuQNĈ,yuNh8H*Θ[u? .0u䷳;d2NķCH (_nꉿK+𤃙"RwvQcVg1?}pZs?~\ w$O'b=8C@Pۺo#n{/T{:}r qK~QoBh9[ok'##,jq[bS2knoGHoY0(V}Kwt4f$RP PqsC"ẌBc45B2хHɚŧ23;ڈt`ǡaw1ꂨ=ICF)\!׉jW"ȕNaDTN! Z-=B5L܉hO[TL0@*R]shBP ($Vc+:VSnC@23Hvis ᠼt|F&[L4}qs9~FLѥN.|jlj/r {ۙqZZ{Y @=N(VEfD K̎.NzJDz Z7SDcZs@|fxKיQLm?ZKD#p$FN,N"#:&49nèa6Jw%!EJӎtzUvI0 .ImO`Su~JL?kHumV}3lͲŌqAĪ'(uͦz0Ӓ#x<?~_xbQGuI[pA\kUӾ+ENܶ*%>LT9pSAL 0QK`m#/x\a{uK#n[7v7\Z!KV'wnmgrHGCNaFٯ)_fܵg!lp3.-8턀~p ` 2 _ (C/HӃpc0OQ SQ;9(8@Uw6<9 iLhO&d[WbZarADɱ9}4I {r׸pIOCBhkejr̈܈`Ԉx hr?1:H<`?^@ެ|*`BQ&R4θ?Р 6x $~&)ADfz}n__m* 6 uu/#|V}؞8Ɯkscfb>x͓j<Ecjc [ĵ [Z̔_ywe"o <7ZUOz\%ux yA"_ʿ*vǰwZY7"**R&H.{T KKˆ+6@47(\ǽ$V`OõD Ȏ:qS7^^` KmB j$:\ `j;lxռ Ɂ~S#UB"3sZj ;Pdpe!.%mwSOMTX1l#3d6DDƒTLtܣ_ǻjќsyF5œs_4+#tA=`f^I|=NBh i+'KͭL{7ݚa55Vȿ`o_AkJ)2gt7z~ʡ΄>hO Y?E;) D۶ZUj437EÏ1" Q mqNµp01U19{DS E#gߑpNaD"l+M 䔙YMZv5eJSpk yf0Ɛq<+۠ W2jDCzct6}%i]t#ܶ {)} ulb**Lf+Hr1X\?`3!jڐlWDHD_y~ǿ=ˬCui3FdOFkT πq1VZ. dp)W*v~e\b>t7$PmjYXIHC3uY4 M0~@;NHȈx6sũY9Q2H4uCx1ќϞӡ^7yw^ Gkџ7I*6s!!`zD6;/WgH  ؊e% a$* >nض90^]D$PZgٳ]*l5^%V.SyFLT-iSٛ R^ 0Xk ~J&U[ڻͧ@ XS="o|^,+rylw f69ԪJյc@-X(PnA8D y^3jˁ=#FAS9>ɉ6@0U2>Q@l-AW\G>X%cW;e-u^l"4kFgBbϾ7|gr3Įʘ zɴb`QcyX SQE,\d`"/{7*蓠/eßj]UY?9Nr1ؕWܠY*AK9ܕeZySEE|#BCfvNw~W @l1 ޫo?<ÿOg$&2RG Nse "Lj RwU3ڑT1J׿D fC̞ZC ַ]MYK^HŜKG]"7ԻQRMqY4W;9+T?hTV~3bo-UsԯAB!dy-] *-QnTQ)L܂w0QK1KgEL<,[RPƼ0.)ψ;|b=A:֑@Rq7N"2Y_:*WY:4OǼֺԽs7AkYR?:ގbm |$aT?TSB;M6QؼϚ 9___kmLsc,emgN \gfZ2VqB)ʻR"w{KăE %i9.DkpuofB pnݠ4WG-w =T\:C~?YĺΣ;>ٟbɒ~?#^1Y6UcA(\_ (qql.T4-11 eXtToN"8i+ꅅ |>!aӾGvʨjlDT'ܒw{IM,D\}u!dMI~20!]r"zK^/"9'o GdRƇ)2բGE5̼ #tLx?`]u;jHaaVNfGt4|Gt}32 ,`"J8jea|dM7;'0Yqj?g"&qAC ZJke GUSrokW1 1dz\[2k'tYĢzR$W$-Ur*qӦTuPm۶m+\{ז5nPV=h޸M/RWFdH43 <$or$FAo*Nai01%K矨]S[K|cF7$~yMy\sNJnk ŔN/܆JPd!_3ȉuUK@Oۦ7|ǃcTxz>9n>ORв{õG>Arˢrq7hN?]|wdp;vYde?ϔ]sfII=w'pNE7(a"V5>\-\.pgnDe|/0( >1[3:Z:%"'Fϟ:H(+!=9L=2HWTO>:1g6X}גλ' A[kGj%F<"_jx>:cʸFzSD%?c#5xC?~˿SF?6U1ZA;() ]D<,%^40`"S̃Ƚv_81":} J_fTAUh,4 Lacl$*5HcnHjb p]].rYkǦ㘓!eʓ-!7bN z@]ά @,նm7ض 4Qgm8֟gcw B186c̚<N8c<X܆suM&b[;",<[Ad%iLz̓(cs,g,- D$fԺ590Q*ߍ:l?;uƞcP6@(#qD@`uЁeSD9Š!Nj/fA$1ȹ@.*cNE@P9F^p(`慡UVÍY7"TNșVM./hn ri8i)ւM]KW "Ct,.!1;S5&( $D 1Sl }1<2\F4TAl(3nclDDSp{Ϣby8 fSoZOxr@A̼ RA`9l^T.oLd!("͚H{H0g b_{~? ~o_CZT%4>CR犈јB Cb|St~͘r]϶mՎ:LcՀus9z|̣97Huws}TCz++÷m"ѥT`W~iEX.Z5ضHf9:5 _Q7q}0^l3!Bp㬖+۷^L8,1qe촘4!ʡrfv;ya%2p8&`T` Hd(/\<\p*禈=N[x2FE W$GMVՍpQ B_Wn͇y}~x#%qH/q-rǮIfl8tTSS6uC/ZwA Z͘6t3%e2YII"gJ`0rP1G`&H ]0Nw?z2is9ț7Q!t:D5gB6Ɓ22ɮB;*hvFu=2v"u&O@D)ig Qm8ӓa&߁YRj=5R2,"] }7K͉~.%&vS~jwc5uu녁 "EO*c\ k>BƯ%bsX?o`ډUzD ifD$k?2毫_d4Ȁ 0`]:1DuYUJ :m"}3;v'e$ڈXϼg{Wϐۜ饞Vտ:duxRo--yj8nmn۶`%Z0XkOV%JޤuHkо 3Յ4^!AA:+GRǣn'qr^(0zPqC*i&|'=6Gۡ #hD猃Yih` _zp11SAcT;P[߮g i_^! <~bKzStcU!&M&C`/ WEb>.Am/zS7:cbwӍLq2uA ~qX G^⎙ ngSq. 4A@@/J;#Q L3N6Mc߿J,B"v=P q8h^ehX5;vMS D Fyi+J60s#rTIl̢n bI_2  =U&zvZBNRU9 <@ԩEG&zRQaںNվ41AdJlN/l4iȑ?ʋ;ҏ} ׶w( bv1UAy[bf"1]ѵ2E^%T*D#T힡{+\i6_D s[DOKQk5.t~;Hqb254E, xO)>"zs Pwvi>ĩblkR{Fgh=!'ǭXľRKwbF+/UM۶^qfAs{)$W%rƜ8UI]L_=apfnOl2E0@BPSSFYRϬZG^S^5]?1-ҧb=xV1~+3Oߒ20ЪkxxWD#|??ܒѱQն @hr%ޥocL;7ѕbK' CK&faq5PCv*nR@xDpB m Rfb[уԸGY`7_K7!}Rխf*Bu1y+F`Wˉ>fP"vYפ]@pp/[vEhf|lh>nY27!Bh0È|.03J)`RFMII(kw])*vpEӴ> KhvY;tsNsCJ d6fP<-]9!:^.4EYUɹT+3$i828y^һGPR.X * |/)Rwtmn.y"i{lvo N7|urO[^jȜ-63Ω\y{=ZaVA=4OojUgA93 w&D[Ĕ w)\47Z]>1;L=Noɞ,h\XEqn&ӴYU.k?}򽿹k@ol-t'޾ل.I$d&1) x h츘 G+ zd `۔c'qn[蘙|9Ĉ9MO1Bj?rka'C7U)`J*uF,sQ "s],:S : 7@ؤ2Ț3Xm/y>U@T Pc}}}Q3ED5]nP/ONQWէh 3}%w1U]dvPqVCygpW>Gb59H3!H۶UDfU#FUd e#EzzWD(jP/뽠6 kN?dwkt;s~_D"Hjc%,)r! ;L#X/f U绯V46?8::hL1Zr lśxϓh.pK,T'hr{>Cȩ8O<:t%8LU#_k)ó:DwaO܄}h&"Gק c$3ޣHx&{ 5k'KݓKA4 !) r! 9p0@`hqUɤ$Oqx ˵ܣ $&bFb׍df&r,f }ѾBMDAB92 n()s] A1W3;@T]~RDa>k-3)o`@&<L^N$4CMSciq8ڋ?j2x۶LkC~ `c>Xu"}8c cG&&"0|m+ |8)L;<ʩ9y /.}y}}׮9"*&s @jI5d$cvo0S`Dp<,1<^c_J}t8c$dt*ZhLlsWÅ_?^;?y$Aa8?sȂuqx~XKD1b{?h{/x~V23"cgf #8|d㓈^TU%z-|>x<%E DKc+ِ*ah̉$TלLٍFDӅ42+JDD!ixiQ /O۱ m3-d6befO*s?qލt(bx<@@ ` 8/ZC-~^4'!,SY20b0a`N(Zx3{;D&osD!kmLKU'@O7Tcyx PRtQlw||. G"a/Q0EA [P]0K>JṀŪjӀTG8BΈ}20p$}n}< Ya4PX@%ް1nRq!#: . A]bWB:=1k#~հ5<>^%8zlLT0H250%&d#"q!;tAͪNe muZNo81=lɁ qc#n4=͢q]fDp-@Jggn#,B ?L@ڏ1.Yk-]c7[B2եFȔpÐq2"D8u.a@Dx{d\0#@c*  d2&aAU`Fbj#Q?kfc-LCi۷>cu3@ɇ;śv,ny"1mGAFΩ5v5=5sE\\w 2<ê Qgkh?4J7r5`N]7e˖ąt:4q:+>?;'vYMLnwѕ:PhCge756Hz1g `)a$*0d,yPĂ@dM^ |">)C%FTlaOnLbV3 Jp#J h^e2ADR3cL_|BٰuΥg=|!Lt'=$_U.W&V밄l^&k ]wp"Ja+P[p[[hWMy9T{7jkt+tES P!ӈM% "Vsx5XqCՐC}\R9eR53BR5b/ ¾&ku Q')i,͒Ј3Eٵh:\3u.v$qGNOzս ^:샦z.v*>n5ol^ߞ\6+j6*9 WČd(To7xDH0Ls!hθh"5O,NS 71bK.).t+/W xriP}\g? j \3+4zÝf$nGֲMtnog+_8vd){5d%߻'6ON<"pZ ̌N~Dulotìۡ}ocuR@48ww$ iI7q0"$Ge NtőyT' y\W?g\8]vB8U02 hg%V9уiaM % Ĭb=E)q,Es4XWݤ[`P* (|3fq'ATtcv"KhTүU@N; JaB@eԔ:gg8AAcNfz$# o۶aIAomfaQ!ݘs? 1ZDח4` @NXjXMByY/MRK=A׭{>:o7\^8}3~ǪC=FWizoLNTnH-jL-7gQʡNBp57khPj PdvGJ˯vLJ.;񥉉:Scf:9ХXM G}6}]]hWo x7w AB@5*U-R`Yju´(`v45Ck j':VLN`}5Z+㍈tEHN1LOjh?wr^.kJWU<:=ڝGZv>OۨQUUW8 `W{[qo :.ګ?q_B4P 68l# !{IKų/mt"LU5~D=D@[rgfwMA* yTuqhxI*7Fn2+esH(o`_}xtsoXKQu3sk~Yxlh8 -,cѨj g6#7Y;]4XCIul|&=3XK&yiy)(=:DLF`jW@cob 쫟j&BXjNey-2Ɛb-^3}<곤ֱxk;2=u_||鹿}:w] <7| c:Ѡ1mhiFꢫCB҇cHؚ|̣ٽݕ&̣jzf7($"#$<99謙c:]NS=Q]lf__6]Dc~vHD/̋z7wʓOQ2\S9RnE*Ԣ%"FZMYyxSbM/NsTњzA|6-"zo6>EG˩qPըjgKޫJQٍ~ycs,Alss2Z:<0MɱM_3L=S!)V!r'IP`k= |~`-.|iɤ; >Fwɼ hAx|is1p I`T> ķh"-*˫ɪګCL+;Se6X_[!us[^˙9stc泠W>ut[v:/j^9椚8+-̦bd~*ڇeN"Xֻ(9bQx'5!bY[cR[.Xy_ofhח6as&,i>Gic e1_FfE8q8>9mXd ]f̤  <&qΡ" yMj-k 9iV4mtU"Fzz2S oü/3;~S$/j[<&I؃f-q@y&̇69' 9FS] 6~{}P QUv(LMGNa&f6^|\vQ=ϋ% Juߪ\#ٵ1 _inØw0O0I<'EpM6-Y_WD|'Bf cb3boņP1rL39aJ~q{ {6']&J鯗*1 j~"QH}LM~t+o?dYd I}{2! bm>,1^yJ6S`e!@ CQzD]9KnksNܜҋ黾.B6n7} R}knCmH+ 9"EA9!8ZPmh I! #RhN>}'7b҉M"ǀGXDqf3Nuկ1`۽Zkny 1q_9Q" Rbޣ6]*" AޛRe0{IRAsp6i"2oٙEqD4sw c2& 9mXZ;{oʇMm`kXk\5X*Bbɳ2wJ YeL/ tۢ6ɊD[PN}+Xowdb#ӬD@fͿ"'4ײN9f }²avD$ U Zk0ǯ_`LU߻#l$k,L*ʸ125Ul?c`NJ8ǂnVc6v̈́ųGf9!y0nmDR/~M!nt%On>gӢvdE4Cm%{ mkm:6Z9'dgg!4o@`Ld~UmrEn4apIt"(7pC#F}̯}ͦC2ETzHS"cPm%~R_kC)c%vǘŏ~#" >~_m~I2&DڄO_TIM|0]yWK,Yy]܁kmϏ!^sKY^h)".Er="7˖yB,)n- лHxҷe-LUH'BI\QY4H#/m].dYj?؏$oB,"dS>)"zY6yryN־4==9S@%Or$ QPP_&,M`<p&2bo3MpIX~bwvn:')yC̾kzd .֘, [vX^6=Ԭ*C;xŜk65 ;ۜ~`+S8z͘7r2 [-}»u)(眴Ss`39X,(YlRvuP& >燮̱4mW{Kȋ=Bw8Ls;fKLLqhUo7-H*THev[kB] Yr4!"bC7iC}Y7f%cl%ƃCw1Z=ԉP`=q`!+}Y#E @麼?s) BUܦ쀵_(L=G$oi~%~`k4VTUFH+(P=溷瀕,3"4~ ?-(uh^, #z =Q HU ʸBc`v 7g:2%*}D0zbLY> xz1Z {PkmX݊$~&lLJ V?~bhY>Ahm4%]!D_w0 $"DhL3{rJL&/i3ABAӗFUfzLȕeVkAkKB8g ㎕Tp&7Ja>n>nq>BxX?Knuai[޾Y 7h~ŒjRI?;8-%kf@׳lMDU.`DX01QIM[SxNr)3B|jZXcTWTb k#U}k(>JM-?帎\{mzpjG^C-`S5>]AH xT~8MݱCT6ih]UȦMar^sլ`XY'K2+,}^l[Gn)Ak&`Y2l;"=pT9*oT)O{8Uw*ai{n$/k|U˴EMn7R@|JhU@' } _/TŝY^Gc`{rmm,,'x\񟪬~}SeMt_wV_ڱgz-g:<?Ͻ#'"TeoJO {痱 &i9p trzj؃U#¥(GZB?xmRrLy9 !VR(7ky2#P%*5|4CqSwjt>ux>*wnMuM@"N+j29w BȩY|񝳌 sឧ eKNI(piwc̙v+}JjqTZ3@df9+, $8VU ),갋 *-9WkG<^J#fUjQ`?eR7:@*g?_|γ +,u샞1G\!z[j1n :l9fS=・A$N* ["B/^hJTjih*v}ж2y)r2ւof3yWxsm1JoOflĩh1qR*hUciոzf{2w-dnV79CFR;߲roᕦF+X>6&Er۫uqv7]b>@7"#v}+.ݷf=HN17fD)d>G_y_iN[ҜP$Z:I/x? o S=fnvK"sv6;:+HR 4%EE meDGҖXW!r\)teѿڟ!a`LO˜zb!{_v}ˣETD9ǂcN'%D0R܌H}S=/7GzN2oLtEkNFM" W@2U[^y܎DJ <Ɗl:6Ĺpb~H=̉TXChGo/ IU<)L,4SRbvsaffni?: QOr\U[X6 '=ρ2m┃2 s?%,4Dzsjg:Um@VedvJ@ X~h 0 n I ~~6Q^\6mt“K,hɀ<才|}&H<ڀI9xc9}hK~=hT*>^C5D>kW%,,B'ZSHvb 0k*B$xY"MU ƒUs1]g\}0`|_ep1A a)D0o+KyE蕦!r{viGq@F$(텱 E/ga{Eà tTf g71GӬ4=:!)E;/)X1y'rDpkJKUR6N&\n!9-V_$K/կ1?h_ ˴>@>Lgu-z)GL=LX1խʦR=lwۄjg7!ۊ~eYܓa.2'lrqS N8k$.c ۙCtCA&3`Vœ?=30xthgkTncЂYv`~LiGc| p w1sc"C)14 Y ,,C3?> m,wQ7h8 %|LZ'VSqMlj~,4UU5Ɏv^":aO_-_['4s׏"I~a{PT2L1Ghߍ$@7)nz(nfq ;RWw]y?i6o/,x׫z_T.Kp]ܼa6if܂4pvU,$ii9 ŽA~weE>_A$rݥܢ71C#p\)͵G8 )4*\U$fPse_{(ʋ*39v7JU%@RЕ?H<Ƅ愋j+d$\ "B[[6.F5n0rGi4bKpd„e<νchSp*V2.mT;uH'T5KAرi +nhRu`:B-q7Gqhpz<cT=8~ɳC+qJv`ȳWɂ&pA(\Lj@nRʔ*pO DPpNlI땀W1"YZ o*P"Νe7{z:W&0Q.6 .,2aJAGwVgpa iP9KD4Ӱ"iˣZD{Ou>و> `i!6f#18:#L3NyyH@z`#0( 3j{0ZEQ6pQf$ 7i4lHG-*Ć*3(s<0 ԓ%Uۘo\C#ShX<ƒќ&Wy2B +dGdN>[B׋/Z@'+8KLҙ fB1H.\I>"_0ݿ ieA

yo|N#Xl-x>m#^ӂBmw0F-}v6ml)HUں5d.]ݑu,DB}Vzَ#"؆jw 'Q'yh1tfQ-'kEDcݤ 6Ow>mzژŦ8Z XyQi4vq?j@D fSgı`I,{h&gm{:(j6qD )\uU:{XEALLAMѮٲ5E\@a1\]IWRU[L93[?R#:Pb"1&`iWسÆ-LYBXS3Q3YdQkMEƥ,+1}+`78.¾XG~NvU~TLd W ])4f"KIK$Y- e ,Qþfi"dMeFd a_&Xt0T+Y,5#'"ن!M\ c.SL &"=̱,ICݖk*EDά-`av4`w! ")|Wǫv 27Nnga̾H58 ,#b(>tjffsr,Z3JnΙ>nLL,&\*u5"B1|FoG'!(HV+J(40p4ljx1߾3n$6b HUGN3J<1wk8Y,cHKC.޴F[C+͢,$c/]]&(æ;'&CJ5-,̉M#?FtH7!H%Yp6tK\ ff;0G {\]9K_A>[Z#( ypMq7"'( sCnHo`;j5g-2P0*?hT#A,/fD ^j 9n9&@ Hh捘" 0]rn}Yo)*rN|#"~&G`KYe[#4ՙE{9# t fߎ|˛w>퍥\pkG0/șgL\]V䗉juɝ0D5 Q8YP_. G,1Mͦ&K٪3﷔/2dB@ivZEqA+ KjTsfSXX : ^sOy?o<ؘ׼H2Zh-Ť"*ibM; _w^@3-< OjGb,E,.EPh=nfl(Z K!!*k(ֳZ3KF_{>M]n .h8^ޏ9:Uwy0*RSj:w%؅1]W$+і*Sn\04رEng"ׯ*zhzJ9*?2>O?~]|f^9ًXax9˙HpjjBa$$/n5?FG!{EkRZkOPd߯嚻cw |*U:R4'!$='fpv>A&aR4mLfMn˵, N9^W͉yQ Љ x{Uќ.4_7)gSuzovxr=fCsh9/ޣxXhE^ƏTYDɽ@D9]S~ն_"O ={7YD0Qu@Y UpI:(a!Z1@72mR0+yw#*L ĶT N1m2(kħ1hy :]^mH3pF74*pm<BIJC3{N*hq;1IQN<&+* 5;pM97 "⓲)","hoTz]}wqOYRMr7DOq/֗8s=~'bEz"Z?q_zSeZW @pAy-N\E7s'=wbFOt֟{~ֿe,nzE®uq5% r{OHWwȶXf!]@Y7Փ7~,=r/ vw "RAHZL![Lض*Y0d5av `˚F6i#]/uSUӐo I!QqP1yXop7<ȠV>OH آ+S 7nQMӠ/9ޏj Tܻ},zڎu|NMڮGę!ЅRY׹Rge-B_7]jrnf܏a%Zᬄ(#0$j!%1rmƶh+ޓےWC<'a8bY-9N;w&{ܤI/3 {$iAbQ\V_ƘcCC?>=Ž]zݘv2^$uwْN:OwC-* !"3U;l 7 cЁ V+./VF^0_$Ǧ7홉R8Dt֛Ju㬷sr$p WmHLI>ׄrJU0{) 2ݟòH<>b1?Gx߿n+_r86%rVpVkp{0E Η/9OjmMxl~4#ݎ/l`3MyFn%3fnEcWvF$nIJ+̲a&@Z[f}4nBzN&r ij&B#OP<8wDv\fP|7cdfM]L[ q, h)Ջmk*Zv-R\Ftk,JRY^h?c?-| E*Ԓ.sIk΃˼7龵ZpL:~_?=,K6>9'y9LGΉkeDx;0\ve_%Qe Ma1<\RBN~%Y@̝T|Gգ߷`J)c5dt 6hPn{,|p!ZӨ(' sQu[Y4mB Cq|!_嗇!gmmtݐVjs0+U4U$#0f0ќSWibn"L惙[DPeV0'"fS`QjF6"@ ٜӖZ)x_v'z^.Ls7jM J&"¼ksS)<ȤI܃#d 7&fmDM;h. 2IV#傠ڜ;xN#ail>13Q,aMUoĪs`"ª@ gf2OdȐ9HtfŶJ@w0u/(9ZSa@PW61?wHVGa޻ *-E)$ǪpJkdLܚ`ovQ,ׂnD]bv B1yRn^ f(}]!fޠ» 1?hSfnn0¶)*P0̈́&fnkvȣ$ﰥw"Ll?fa7ښoǽ EuZw)4)?N ?==c\ T2J#ļRTMTG~SBKbiܷI،;+dUNɳ۷9w}T yds1wIˀ]O o͘:jk,+M.zܛ(CfMQ)3q5P"n߾([ 3+07^DK]rͅEeڀvlSmn8gCsN["&Nf17Qv(weQ@$,TyiUCwo2kvb)/D~__ l57+ x˶Z<]rsq8Y9g wXYTaaЦI F|]Cm̢Iga"W%J"|~ݮxO'6w*X,uP9 KVA;+e9 ;=|EpZ,bZ8K`5 w2\S*L>Y%lN<c|b]9̦Mf֪Un瘐# }gmnA&$"X*)=39ȇ@:XA4>1R?yo1- \OB~_&\cU"w?z#,ai4hR^@%鋤&[FgsOD?^skinnwK`~9Wp1Wi× VQ6<\6:L<1 FZHN Qص嵬=~Z/q7L2~J6! v+)<%h ,Dc O'15!v\L+0thܝRS/rV.rj$s[@|^MkPU%1/1ea5|:0mc0t5D~eIф->EgFuK+_{Fv\QKIOT}ُz)Y-ȟosם|V`T:ϺGpS| ܌9h'b}lk(?3Ԓ,쩅/HMnIWbfɥ &L4F8Vzq`760v %(KC0㸂 WDpfVn˞TRk.-C0<,v56czN?v{"s"/E];1˒E% u7WdQb#Hs7"m9s7m:{Ef)܍(Z_^XVH3 lOvקznvI+_s&;ZrY+{A*W(čsK}XoldA"OtRbUӂ^^ "|[4TDW3$xM%(0ǢY& +U y?V' /Ѥd+3{ka0i_Bs[[[Rq/ZgX-PT$u*)v~IJacK(ATkn F$'3a_SZV4gqj-?1eP.@\I& o W%!7mǽyM| 3V ̜Fk70Zk3ɢ 2c.9(:ېyɍI`36;YDܢKLT o!KG]9 JpBXbe\V=p|ˮ." +볎M?YR7`Y.}D$-+\,y> 寒9_RLkH u!I(V\?"hA)HZȂ{/~muZp h֗hFጞ,A7[Z|N"y8v# H)N]nw!3KXɿ"{|z"sJ [q\`9'|8!GFW`RLa+y]d FG럋*£JDsL&|mNKAwXs֯%VyQB-iAfLOu`sr5">XSKVZ@\% 1'A{E*3 ؄pUyNx5hME}:qWwSfXSW LeKI&k"O 3vJe=Bm+|%(=uZT ֗I!0(‚EZɉZMmLo)blF,< I0ǥ[{S* GSlcܴcp|A V!ia BhT~ya1ET5t 9%hc<NLltQUR>kfs^վ&Drh렯 I<`.c1'Y@;e =L0nSo?? ;کW\LU6}ʰ~$/_g=EVJlzƘ"m|@̸z*m)Iƀo9Z%(23['DԜ>~_rͩH\MIL.4*! k L9O|:63g81i* Pi؎#fѣr y$!T })Q$ yHLi@Z2~){EY%=NH?l"D$ =f ff^CZ^Y.E݅8X6sڽHŰMoQ9A>ާJް2Hf-AVxWW hF\KŶfyXPYZ 4M^ybnfe}Mۯ9'9˙/2ƌZPʭowk54 䃉Rn3ʜS%a#ak-51V񸘜{AR~{Ջ'O1VOzci5 (*HSPZ\GnffvF(B '9D 0CA M|o *SUͮ0"޺UXS%BȄL(:?㫽~šA鮽Y4{&d5 Lu7 ΜfL|RR=( QL cՔ ;s2;W(CA =xILRԽީ(&폝QnZsY=gZ[7^]}nwet}4d9/gw.ݒ$90ȪȎW 4Te8 #%*2~9ߙ}N)M7\5Ly&㗍7]5 LKUr/ڱĴosܯdo\{_uTÏr:3F7@c\Z=WCE)"f풥RX9.\)Z=:&75#Wm]~Ssb-1 ^זV>"@ÞW!,"$& 2s;wFDX&gp*eR(ݭkܞJxPbR:lDFَ_3)ƛU X4\2"QEp/kDCaT!~LL?'t?QOaݱ@n o+ކ2c*+{_=#dލ$_SUfݤ5U(v`%cjfWIGFJd֠f 1"AčHWlEy&?773&3uD ?D4M&,IYMR8Š\¤MMF;>*mVfAj!l3P80|[~}q!=*șfaQ2F2=Ue/TלṮra)E0+0a?dB2()`OԂ۠cMHJI 4=: G"%5=ןj$*+3U) (?)!"FcijFLtfB"J_˫U](YG8<[3X2TDE2$SQ&$R(MtNH-:+KN>/4Ed2,_?bRex:=fҹ>VPL|\ dԒ$38}$jTY%>R#xOå:w6M*dKokC&$]P7S=J>,)"Yq=ƈ U拞7|qx#;. EK@7\`ZPPX7_+Aevg4xx%za2 :|@$m?|pt&,D)SUÃ(Eu]#HLH{Gw$~x1#P- XƀU0chvBG6z׊Oiu) pm%"3V'3H̜|C@3ȷ]7g9xqe)LΉa;m[|wYѠY8'S(d7&v4hѰ= yk 9+|J䭋9Àgtv zv Bתu} >._kYzQg6Xuhb(-̕AĢ8\SZ9׮КL)9c+kkN^eMdMID&b')1 oN3Ս&ﰏqO\ 1hV [9W4Лk#&)ppu&5bߋI?TnSY#P\΃$Jc=uw3gqWF?i`DPl__zv8 5{$+c33:N+ߌI^k8QZkJ̷n5&S,KNKRfI$ Q"aQQgUcW!!Y =Ϥ1jvpn2 :CV+_3Ƹ<~GN$h|)cψ`lɫ*`BVcۆiqXLO@bJC"|E8gѢ(1#߲fga$MI.$VK5p3 ̬# hgZɋw՟_1HklV]w5NkMh=}d3숧Aqy&AfFEbk.ADO~9!ί z+4vD)F 5=(BU+҇!#y3A,y¯YA^ a #"8J}U3iJ'߀,b.D,p$p^{0J09FǞ[4$fr74Z4]73>\DL"n˩pTՕ#%IY8f=-djמN'I` [b5ަ1;N1)R17O0 -˼k4 oNq]y!' %vX3f U UZ; {__ϔ&v~Y?JmŃ.3 /%X(^JMR6HTDoo'ݳc?͔2'DSՉls6O{X2v}uͣ"Ț"pQUSS]iO9p&Du! 0yjt~;w8-zzc|||<σ,o&{de!m ^*{h { 8ݬ1;U~,cx|]?w$/S̛Qq;=NYScif&C4&bX&%p8jG(9T6G5]a|9ni*(T `VYV շϹx{00,Ӓ@) Y"|"a~nff ԓL"Оan-bRp&x.o?_Z*?oT8?o{_>֋kw*F Əޗ5ͯMm,Wt7P[SxS1:lU$^R 9C`[ʕOevw=;)? IK @K}ܙ:0qL>,ucPzI{ u, V܇0yYnP_WZ@bZgldGi+w#L1Y@ndj̡۵\ ;')􎌐 OPTd2gdR fJ!j*Agǰ%5MFLsݯ0VYΤ=/snn7bDǸr-H rJRbUg;G|qS# xK.C#lj4|v:z`Vfʙ)Ei8TcXVgA.yBp<7=)#ע8s,縭?/oNUV4#H<%ڴ^)4qݣ}2xZ2R6@N!E{F?EZ]XKeg-oUO{)"TMcZ*nk(٬ݨ.p۽梄RRʪӠt fMw&YcwTkp6鉣8>إiKTQ) 2;ȍF&*NLšʜH\-Fj w 3%ӱ**1 dAD0Re$$&,s\ݹ:3Qs!x۔+q̠]B+uPJ藨IdգD`dRqYSdcy SQo &O\1F"LOjD1+ a)"*NaAd㺮5 (zVo?T2%<:B@:[AX'@CTZE\ny>DPATݑ c(&19魝ɬaGߋY2)"ǀlrĽ 0Ŭ$րGA{_ђiz0}DbއY}I&a+)3g^I(fπs5̬"b+/G2B'PNf=UՈ%`D!cjJ ́T&JUݏ=fwGPc[15A} Uٙ,DJ9"{d'vI9534(KV,=d&53z(=)P8ZtFh )~ 6= ޷ d-B$ؒ$HzB=Ss .O3fD q3X:\w+>OHc"3qUfE7s՟FfUq}l6j_Ycl!gVdeۯ;% -Nv!8;o%{CO"Ѐ?8|\;{bZ|«_" 5<]1QIT@VWJm旎 [JOEJk܅S px]%N/ (vj),`ZN EFg!ejc>FTϼ,۷^T ]d6]h}}WƮVΈKaY&OtTxd*JŢLPk: |EII;YeWdh׺kW]5gA8 IHB239ck9J ^ ;`^ 3v$"=S-b5)P_]c-Y&k o9'څBM~ .,@Yl$ RF?%"757N zG!}~=ITDpDjDu}Ilǝ.a V=W HWYFb' Qf[p( "{Rެu]@vY؉}ˑ(=?#JqZr:VZ520=D{[ XHq],W!5#<+HDDIUCD͖qFEyvAI/"<(LQ &ZHR~>|09a7]-[*2I>{ .0N#Jr,%5S$6w0Ú}U( (I5F"~gٚe¢H҃YBbF}qEFLQ UآVꚃBރɃ>~|OlIyuCUE52/Pm* Q&ܮoBE:Wd1Ha@#i4)%\1V*Ǜt")qx÷Yf%VTRylFܠ$ )CJQٞ59ϵ/_7ueU ȊR};YE[ԉebU%P DEbZctd$x?sqfmPJ͆V9GQzۛv\>'`;#fM{4Xc*ΫiVҌh( vf(9=UǑW˒,PizrW3Fƙ9bmf1Qw<iKҬ2 _c_z7\i0c3ЌK}]~?B7`Tq뷨D6N7Tk>bb^>&68sywmJ냓 1~ȗe !(QmD@./~lct3c,|kO|58쭘Mԙrw#<<w%{\&J$Cdw/wwg*D/_.QedYhI!:T$!1Ttx~P. ƒw 7JVH[I3IZk_UVuwZs<{0C\0D2QUϿ[8C6}g^p0qZű;@rNoT!|RDIQ~o+>K2MQZkֵXTX;/֮2l[Bp,LZA>9rJ=ˮU&=+C~N%{]@o2͈L{&0~1""7lqՅ+O_ { 1s&x⯳eғ!HKYYz;D␉3Ã_BM->JZpOwW^J?^K ̔S/D.Bdw^psDID;E֦~t.F'oĶ:.EQD\ݵ57hh#`DFY^Q{TNBX^1J9i2,Pz8`Neώ@i"<<l&n䙑$׏co1Ya|sA}7Zwf]lD82LH=TE-...x]!R3QL7X{`KW8)"{x>.Og`Em;ωeZ"M`+͕2 )Pt 73kǒfw>Hm9VթXic#3S"!GDEnC`֜9qm!|I5`ov%B$U("ϫ565~])¢jj"r'aXJ+gge{ _KGl_20JZ@[u^ 雔ְ/o_ޑ]omk;.IADsf*Hz+<=q0deJUŮKQ!U > 9G[\Qĸjj"*VMxYa&~oQᴰCMS&eCW VfL kv3u05$S-JOЊNSs;yCr׉ TUeIv;π՘"jQ߳%J,(Tby~krFOnP]S#ۄ򺮶ŇX3i)Pg6X06Id\3~7O I#-P跏#]taMxEHDH'QxR JG/Mc3hb}YJ2Tdix|'(ˈ#`|6U\ ͣ0&ܠײH?\7rFg$LjGv>2o3=O)Tlyo"Z;0yv SU\HS=\GK<7nMmDD%g*~ UGϏwRT:ZPdJ#ZkSC9};&7D]:g 44[c,l`RcLXJ#{<\4Qf21 lJkpC%`=IiJ)I뚪"ݍ8c7<‘==`dB(^NN2y2"0'3B_ q$Ɯ>,"9<=ef^!L͚~u;t]FyWDꘇ.bswGw*h:nZmI"!XiXkGq"sOkykb+nUICg41U(ߖZ^茜8=c4=TT|ڤ5kѿQ{Sfu]Dw/y~}}1yu+\PJy"Q2&Ex\ r3p,kExɎ# + Wf9Նu_ШwxߏM<#~ߠJz9o`BLWG(=ڜtJr鑔dx(~f[3G;}xkP2NHgpf|[k^ԙ<͚m{ -|mͅ7hQ%.|$ʺӸQ*!xUf<@=5E8n,yx4I`:at*;DݚW[-_QfVf^Yʗ֑]U%ev%2x=5=#htʕ\שLr.2r"syG_ui >ӚA+ƠNȜbI1\[x^}VܿXR$$8_z* (R 23ѬӦP;cu*ZA9ܲOFk35։JU,Ay9!A @VNJ~Fp\T % wEPih DBr &u<[iL2 wT^ pr r]2\@]zȷw"If5Lb+)B)"^ )œvŒ~&AL͒5maf\muj53ǹQUvK*(2ӜjiZxbůt335_Uq1/EoӿpqO-lN鞈Ͻymꔲµ|>86"w+'Wl~B?~x>([K ~'ʍӧ8$(W++rTe{ZޙيE'45#ÇUqOWF!N-AP/>oCwLdp½ӟY +?CUWl[Hs/kD;u2{ <[$8\5־ؔキo|wyo ˸Wj÷3M@F;U|ԿSy Px{bƽ +1ݬZ!V<ޒFޕ4zM>Y몪ܰ_ u'V0`0^v{>@h<9% |A.Œp pG".,ܔd \j8Ԥ`& I9 Hzeېwv|eD5VYcw)S 7)o"CP͒I'g*>TMl1.rXNH!3!STQ`LLB\_J}XPq)*1G% =ѸkwEYtG5D .X U_'Eޗ]7jYhBqߢdKXAڜb3sUْMW rܦtv26cQDudV"=8}*aY)g[IWZm\a S 濪Y6IR"}ix$&J#LO7Z5*0)LA`ߗ-ˋٞJo}q;TJrr WSE2u\^ŷ0Ľ)T5] )&qM2TTL{> TDӛ{8.9[k W vŻ/z߽NS 5Ye&Y8Ti;OWfa*:r{E @& ӢYD^]Ǯ:Zه+ݞ7NBWN쫿O}oTr{ yޣ릍ȬeLH: #Me$Mp r䔺D t hTCdOn_;_iV ]1 XD"¢h!70> %~6kf:UAdO'+ܥtu:OL f#5E$v~M!5'y v̀!R牑'E!cB5 /˛gߊ eԑi͂2^gniF 59yakctsʰZ*e$UZi\ bDZ>ǍM;9 ]UrRU \˜(w(3qE| /| ѼAPfQ0]v::*)1?&AmӎPkM {؊BdvLy)"|[5[- ҙ0ycpX5ݯ\jl\k߲K*l$TR!75"TrH][쏆꜉Eܓ7ZwƢl,JU~;[Ώ=u+m:9T  UNsg,j3E/F f;7KP](71{9-;j>_#[~J8O=;k*.QVI~[rpRT,”,ymNI??X`; ݴ4lľu=gSn9aFMNLcɊFtǫo 7-uv9yŭS-8% 2eE:yT*Fk#0H$Aδs{3iujuj0z@Uwjd=U>9u[@Ufq@I9 P>T!tC_񽿞aK îQ\pe6\Ϸ oe{:@/㽪֓">CKŔ>g͇ڔ=dSw"{\۹nָS6k6+I8k'ǿ2LU0}3&hH'p\2Ze;O/жRjeaWmhP+VCZk( /]ek)x ZIDcF%,4 b5S f/>Eֺ[8 (]>N[t,pq}D˟XZ@xS._:Vti![|C{U7kFH舗g,~kSb* A{dfy@W|nO (5 V1Ϭz}οo2%Cu]y3KA?>Wnu$K3<D'Z̉FdHe)n<["&"$겄-Ld%BیɃ6~FIY$S 2={\ >fjJ+g 푺g{Y9ϊU}pR ipM-TZk)L1mhY%g2h0,օPEf4)9{1 {BmޮI]?m&j1x;Zr+Du.̢H"yLt~sple|^vIfpjdH6.?3,5l==#hul D#O5C}H/Q#\(=a/EyF 8?X۳McT~̎:j?*RJݚ3}}8'3IB"'GFCz>UqRz(vxNﰓUDwt/faf3-O7 .[M[Qoryc8qSXĽG8f8J1ϟ&vG?OqG8p!DLO'n"H2[NMe>E$%NJcI1_*馭z)&G<(lABM*19voin2)AlJ|yf"s.J)$A7xtvxYr  b53͙@,4R!NitSDf2l8=tBD>Da,BlɊW^:pH 12TFW1fqN$)=cDᮀhY GY2GA ҽx&z0V$>g84&JI#"E4AÙX\DX320"vFI)jgD/NF%ӡJ=3^"A!$R$r֏T Sa-c+Cy"bC"ųhhVpTvfRIfl-jj9uJf,'e &?׿[C&GhLF֔G/Az>wۅGᮦ3Ǐߗu Z=51mw<7XPpǁ1'lM&VK ,H[ Qkľ;KV+UKyVE?u=,"Z3 ͚u=<* b>'FPD n23Sreq`x!\MqIu]tUQ,Rѱp=TFJ§Y;J5M&=m͜BECS,}R' 4acD yM`s_<-;kK?]>ZC[6ǡ"=*J %o_/Nޚ:OʽMU߂wr WaELRp3l cɂ_f0Jl`o,,'e9S<矟DMS+=hL:}>ׅ$T#D U\r3f""ez]=_~WԷ_L75{}M'nM<Pe \5ؾF-]w2'c%Hš qO&e2TQ S#LALuZXRX5&;<q+~B.g Lj67YbPRA<3)9- DO$j?e+ɒ#HSu{zyA6~X,vUO'Fۃn?dfDI!Q#H=\LZ:ET%%j1V-rϡњYtx0zTc@ѨS5nl/ 15+3$k9P~TUly~O0py$xT֎N??O^GHym1M ^ZXRuZaz#< "";{kMwMR#TiLĬ܈܁bD\NGۘWfRe+ ttI-ސ3G h>-c1Bcg@ ڷI.4';3UiKYBZ a"H: xXV_sx'MniMrnǷԏ2 uɡdA-lJwü I%21j>VW)^*)XSHRW>@$B!y2(ډQ,p[y\5Ux])35;#$SexKYgSS!J=,Wn@DPˏPΌAߥ&BrH)Vv.Z96΃) qc|$ZKHeC?qD jMLDx2I*QRԪrJH^"emmLoT~7 ۶HJmPOefińmv'}?wZ2m`pf@-_sZk{_ _+#@U!]53f0mVk]Y>*ZgOiDcg]d@L=%PCԧ½|4hq0C&J#\Ye Yo 2Wּ;(Rm{c XR21 ɞS[5_ tUJ,#44 LHϵr<}&T/?~׋4,%ko~1[- rf;YuC{6}j.awt8%OaZs'Ad"{3xZ6ɽ;yEWGj~(`Ng@]lzlM: oV2f0^cu@e<ၽq31*~n-#ϳmEV jYEi,y(fFJ睷XٻX1 1F{JO2?HIටp`uӓy[~"֭ _@9C$Umzdaإ R3q8E\noD-0z%&HB"SzϳGrm[Sfư)( -MgyD M49/2״6aٶoGi""V҅(dJXzex134JJVL,+H.lfgޏ'T$kʝ/.r5?C;)[a]oh<.N{ё3F&>U+8%\xgsUȥy\Npn%"?mAHEԻ _󟾵UOoOMm%=D,3;Gj<16uٴEUݷ~J:5&޶che"q w#r(׶5Ũ SՉ)('gwIe0efh]Gc5 y cZk>̵6'TzAT6x? &𭵈>x*S耘mݪL6F# 8D4详B#ܶ&b3oM.ڿ<ϟ߾=^Ǐ+x&Tfk{?͌VR-WfZSL?Z*pN3SZ#W 0Zf `}/sFZ10X,"U;݌G gv ?UEż{xкFnflHBཷ2mq'2 zD6klBV|4XJv  .ࣹ;v.,F\|½)9{߷]qE.߻a&f?~U]U(\ .o)%YIBazE&4ac;1obfߙ%s1ԠʨE ]yKP TE_-$* Cs3Φ hgnhk"˴{x0T@ξ2/ ig".DA#R# s6Z/ aAӏ|0EQ_\v@# g8=)& PpAB. T8 fyz!=#%a QmdH]RLÀZCSF’8NK!ﻪXyVS*=Q6O%%y)L=n;$55&PPL͐ɨ^ LY%P2QAMėִě)0Ejb]}?8.L B )UKF`4igYj݃J=~Cs1D} ? gcco}\UXfƪ7Uy8dR|$3bVE-_T *"&<߇eLO]z1( T]̥;1V(#|@FD~S#_@6 q_΢F Vu}@) ^Uj@ Zղ,&c/Fe~"wvA ;r6|MՌ1d=۷L.wV2n潚Vb^NHz2`!6"uEζc@ir%G,P[(5s tP<:>䫧ڴWLx^UMȉ{l+}-絘>7D %.'B̤|<(n/'[lߠ%*+yp;6Oz]45WmJ)5u,7IJkoq^Y|ҐG[% )Qy{{*Q%"-c A$C$p1ɦ?->N)i/WU2w̙ai8Zgp:J5е|WMl; p̬zzMk xbJEfqp`L`lYZs[i[Z `)3vm}; Wl qST55*grb6Dc׼SK7&m=>`Ԍ; l<ЌQA2hH(, #b\s"_|cЖ*`uml?i~fڳbxx2j4HkXX'zP^ޞYB-NFFN-awd̞K榶v@1`8p* myCDXfy /@}6NͰ%=fv4!n|sp&H'6WA(Ɋ\~x#sBiXEj2U 1{'$le>m1tbJ;+qj9ʅZXq^K@ҙYb*;)APkEFl%mk G0)1S6, 'lazB%?3VxgQnjUKs Їᓛ3_$g6B5n-hʯf0^"+,U;s 2oڊjRj#: xYԑA8P=N8VP&;J!$' Z 8ܵn`2 xțXд#1@ ɺfkn<)!ːśtddbZ|~dR+ \fv ES[NufA ژy#?K*asz&ft]R"8^x?34i!:?IW9 ^ lR,vz^~3q } R0=`3k`۬tܛ(IS\k&BK.ɲXKG|VM#rh]Ia$QšgxD܄m0[tTEpuDzDq_=FfSPg_xtG*$ .UPZO,Sٶ,=HOg(,32aJ_Je&zfDŽ1 g ˪Up%儵 lo}(+~q &Xgi.`(4AUtZ{*پM"0Pg]@vDzuh* @)"$ CX]ogRgE<:} KdW0(SaS"~ 44X,%0ť1mߥb9<32G k7Ft"}{7l֚?[ӶiWۂ-k; XU־G3۶33 ڻ+L"@,+rk4|Q#BQ3@/!'vfmd"=e?YRϣvPTYZt9zjrOi801kgHBzwj7ôaZCf$^/dwzjzg vmrؾ}@:ZUm$>3V ֣i1l+~sylmS4. 8uE(@PS(j;f>КWAL vNSNٔ3z2U성PP4I 2 5EkO-.nJQц̌.mtZǾ7S{~l͘2gv'g.:ϳE."H-irq5ry.p6 z)bD"Gl*8saՀWSe=uޝV7T^AC3S=(Dz|ڽIS Lʶp8$ YW9S gr# Om#NuSmJJQX5y̬A4O!*yBVf3YGD[hfzR"m@Bzč`ӽ2&2ZɒnHTE)m^CѶb` s[qzR=QRD B7&6*!lz{?O yҹpikgdo(hT3b5gffn`!e5yˣM $Jw@"%afS%UNv3@*dSV9¤^k Nc4iSqCkoAlyt p}߶?9cDt+qZm$#*vLH b5 <Ǒ"mq`sh>{H/)d)5I{jv6+ Ӷms"Ř*~Pkq{ hⱫK4f%"bY8Iє5S_,)4\ HS3PЫOG鞽1 /ΐ< &+<=25YhSsDQcD:"!)!8tĴ3Hc&BV:ܸnk6pmU "lN8ԝ5{ԃTmfC ItP-c5[ks 5]uyqo3hjBDgz}nkM픻c^q[MD|a(x) -yNVԩoj-) yʸʉfUbE\8Z@kU7 M9Y&RGhSn&3asy.7Τ_[lhUlSkd`P$3$–\yhzܾ yMB\SK9 0I#GA=el=7,^%N#uoc}J֥CX8V{}ITIgϊ "8]R\j8NAAҽG{Hk \*>H q> YrYlQSDEI{9%|[P39V$[kbaj=2HXL)XI:.<56k)~#3#GȺ#QbX:0eƜ\K*lB=^[ sNM$Z~aA(&$1k+hV Ry}?weQ.WC 9o~ڗZ3m[Zk]+*'CD53,[hBք‰P6rNCS  qO\N⧅Pg]}kX+hvjW(Ӭ `Bg{R"&y֟x$P2'+\*I#הP.ή^h艀_IM T[GI(9ݪ"ij`?Z۹ ʼH&PT>*727%R~ֆ/"jjey}ޏWM䈏*2}@zϷs4n#5cO zTDGf"ٻ}={T[{C٘7Ã汄\Sl~ íIV˚{DHy:(Nm$Į"]3#_%Hۛy3cpmA9MQ5=醇)Nw& \)έQ /ZLҔX4DC\J{ML3O7\IAڦ'XJ S z1bT"\|DݩB b$^_5 %>_WI2mSSpWT%q/ iP˟iL)bXE\8@![[ylOri6kjI_83fáK 3n ~Kd6mK3s_ھf# 񥥎#wAE4͚{jqXw@Хq=ϓ@wW'k|tPZ~J6 "`m~m-%;=pL1;Nҙvv(Z߶m^u eݭLMw516Q4%+rkEmaZq>׿^ODBU;sm͒tF\ &6yΫ&ūB]BlX5w7S "Hf4V^ \u3 2 IvW t:c" ÑtڊH3+d :y{#Di- #:aچ0;OCRØ\$,^0doi 첥D~⒭88AϜJ,ņN:e ҁ0MFdwC8Y\u J{=sےٛ ^U*h#9`7R`kLnV63#;RN^-C#NɦmSFd| B_hޜ{5q™pf7 {8HtFEVKd֤ɐ`cJhZ3gOϞ4ÀY$hIZHQ~L"3SdWҠZCKxaQgũɷ7Uzyq&}O鱑t䝹W6"Z++UP5er۶/..lL}Lm6Ƥ@ 20p"zHa3$=MGWrS{X|ok͠,`6m*'$I~(Z lqd\/)>_Tg:X )`B!J푰^1?49Ex^F?JVk j^;36)7ebUaKGD*K28$\1'i0.T;* 1%LdJf<{W66[n:~4 5HQWU5pKy,:A6'rǔ)9LC<3F؃ oz%)WwA":pk2`e `t1F``8JJ3勵(`(d?B:_jxMYCf*տ u%|*VC:)]XDggLV=EE/4u:mc֦1rkba`hV(H !!f@钦jih9w> L3lcQ@0&@,լI)5Jvy"S-NƜG+m̏X GG>[e>ť}= dKy}W+ s9˄˯կ:In"a^ uj>iM^ }Hvbhpi,fʵ_ETS3c3op⺂@cI@*JvYhXG{+ehΌÃ.{ddsa<Ol*Kk+ΉK5nظZP ! KݶM$w>FOGs+(1oYMфχ4sޢ`yWLòsɏ %|{V~9HH87JfX6r$D 8a8Qa1uyrrB&jƗtڸV169Θd`QZFY){.);=\D5>Cso: JɨJ5Q 榌#]Lm='2?DAY񣜜2e@z&6:vYd%}Ffa%N6E,B}>f1;ʑ`drBeUbEU'@e㉦ZC-'U3響}߭5E٫.!mll-Br.6q@Bv¶m=nUE<ˠ)):h+.ZcV +聺9Γl߶%%,JJ Z_QZ4Kę25Cr:OƺN|b{g~X9Єh?πLلT(mvIc+>fy+&hmS /,=8d*̞=/TypnlaTưpemȻzF03yԚtsc y@UX3V.Vj.@A!y= I $覚jD$P'IP!e.,fN|}8W5؛(+9fPC&I%@Jt'DelXaK :5/Duy*9 ʹR-^ĞШBuLpݑx[A d?q}+zuQXb&TX[kJ+_ͭQ}~Lֽgn dy!ܽn "X3)i>44yw߶VGMWkdч/F&w_Fy 堳5Y|WM#^c:Ώa'|0{W _Hr%u\i_*-354 >8A?yede0YǦ3l{ՃװBf?Y/xygmUɅ?x)L"T rWLÄ4K<HỪmlz۶tu:fm%p=`p_4+lF>ojDO>SuyFi=} ej,Sܜ^G~7g"!ҙ^$"ò}W[^Q4B#1-kҾc:˧H7 S=|0lCެȠ .p ,%aWp 22 mIМ8LMJzY05f~b%FΤU% qI-EtZ83 CVk}=N6S#j0sA!ȖAw ؘ>F c+7- @ni{'E}^,N,ѫz62'\GMrf0ȕMU$׿Qo Bpr՚!:_ cj&>enu$)crkcc`Yk[^G4 ;]5kf$ ;7Ȍm<s@Ln CBee-iwD|ffJ3Åj󸵦wӈ~gu5,j׮u:Ԃ ͊c;jf5#CD[_\dGK< -M G~s&ġ{U>WR}kϮQmlM:̓=ofА54@- B#2hewq導4N4lrJJ~ z(\Df ZB՞gdgߣ\PVHMs,>Uhn.ʲgdJHjQSБ5$$.p/> fU`E>p glj4hƖ =G9CX\NT\LѻgF o њzjB$r5D}p9S#R &yB0&ɼK=c[h͌J *͹1Q)Oɐ`fU6UsWv%<ܫ{Ɔ=E7U0Xu=97ٟpw\ H7`fFˡHICGm-d?{Jj&GqF 7Y(Lq($ci_u9X! H^1*0"5I4(e #LզT<P 3gm6AЂYusĦ"bC)u-IQu<&yox|WK-0( nA60NVC>!,G%qC ㌙dȌ(U[ϟ>_f '^aI: l&Bٌ 0e]X+d6Zd)D'e$Xrgp$H~V @ 5K4#<#SH)H8%ՒDU|䷥xT2LOCQi)'ؤ τ-y`j"+S\]ّQr 22DR#ۚ'aPZ j"yY5r24aϪv6LƩg^ޓ _)gl&g~zw0nUK{P *MsauF6MR)s6"e65O0[f!ZHEhuJm~r8F5~)e EH vzFVH{$'"%6TLED*:Stݒ$ɍ3fsή yךۑ3$3 ^(7E :3`V&%ABҝ'4Vp{d_n }}+u>)^Z$]Kۂ*f3D 9*|Y7RLDd^kd3BKNAoo#3 (2  n9w+eJ,?⛜!|0E(aA+feKq,vϵ-tA^ޙ .E[ЮVW/S[(huH̓ñ_!b 8ڣ?:iDjkY ҿFvKoorKf:I3]t2{ ̎CXHa J_{ AMITH1r.6%6wVQ327vO]P-c &^'Ǝ,xSihEj\/H#j^@ zV_^U-g^@B%y;<). /2' +bs=V|-fc" u.SdGDƄ<l=k~PwC.f H I_;\đFGe.^JauYF%WJɲ=@ bv?|^ [F{GqYXdIϢ|r *r=6 y8 OR[v9ewx΁H9ÝmKr~᩷y-Ljtu~Ȏݳ .N mf`EWݲ*I3yZJD:*uuRP{pv4; zy+Nhp6Ȧobq|~H⋠N0Q> Rn]:<8”5[Or}QQ+n8%4m+ #I91GCIr;@h,ArC[{]$%`Law-ż z\UYK~q N WqN}Cꈆ"9h߂hW)A^Fj܇<:5<4vU0_)@]fVA8Qu% )ZZ48lDUB[(B "BU) 'O_#a&ᴋ|mly1D^CjLFFd?30#6HA qyj8B![AT788r PA*_X`z_ ,-'q߿:*7*ra3sr`nfqr^&"/y]תy^?7[DcɮPSzpvr3ձßp6[*i6f5~zP/a@ A7-T/2 BW$m.R\c Ŝn -#d(Bc03rBOoھ1Ó#јk}h wC.S.V~]9[ڑrxlEwt\86uW3mK6Hv9~<{U}]js[rwb˚gx۴V0^@Npml^jn~̂I8(|Pmww>k[-(1Y(W}NQ$p!:ƄO8q3Wߴ9/lsxm`fc\iTCOn ҅c7:.P".=_Wy7myk("lZ ?[1BI&)e9ӽ<5JZ ut@/wbDCWa< ȡ2?lnܽ"wB%_AaV\!$(c`''y~A@OkEYH$<\Ɛy`AU`]}Ixp#b56H.BKfZILBuNf0~whm+=XU{;)|ED$aŒt5 ~F¤XYS܃u't#O*Yd$`6D:Pq"ҷ<0 MI&'`7t[+Ⱦy_/{l:ԩ"=` :խsfd勝ݼ Ɣjcua3d?)T:`m`>]yBAVШANj:0@qw.Z&|k D#v~7M/H0ʴ;R}6,OJU^}P`/~;p:0ٶWy[>6[_mJ1&&;J)-裡M}в%l*Q-bjw)CސB[g9#r mo-)_NE2']9ThD7}ܫ1 ]ex A6I- #h%x@Ub$~zL$en6wd2D9dDkN̙݈r&HzF` DGA3?]/R"J0g6*zU Ad&uCzIB̢d9nTLj M4QqT'$v;Qؑ;+;Ӛ-a N(̵uX.fy0-<~oZzܣ\]Hv}Az4>)Ltaksɏ,Bbaz}/O (ᱳ9b8:p"=bN9Fa869 7|[UhaqBK_n=\3/#c@2&o|Bs91Ғ6k}2Ed- l ڠ}t&(1P$Tum ⢵Mm~ p|9Yʖ{*L9Q${,s1v͐s a FwVn?M_Bd"21 K;-s~>"Z{ird /TH1s/ތPf:z<N9ƒd ++T&(Ž:x4a#ZDvTHw%ѵ֜/lfn.8GEe @P?9!yj $Li ;8pA!!gPp;?Ĥx*s0vF{*] A5L2W`z!%qEw#S@RUn9xu_&VC5~ԈV!".!hrHW8QC0KGS4w$LB<{"1 c=pz\]=ML) v fGmh''r a"G'p$16ZؠrpGՖ2:{gI8ٲ-5$08KuAwOw Ήsg*Pd.'akcyYHx`9ש: mWŰ3M'$"V$WecZ"I#,|D'|ȓdDf]':T,#\\y&g *vDWZ9̛dcw7i^m+*Kسo+S4d=RX՞RQtetBB£G^ZkR"{}08=Ex-7_iX` GVM9dp Yk%%-8"Z|j+Nk8;g* wSƒHL׆߈9",Q 3X.V 䊰da]d9 v39PeM~G \+0cm/ Wb+x`0|; AG`nG00Db3]Z(UϲС,s2)_/!PuTQJiw'߹Y2;uW:vdR:F {vu܍0uAT4~^3;䘽c\C By(wVDfl6D&(9Gbxg4TDI1D6?vSm9mnHfg-#`{w/< l{u2Y@SX;qt?[Zg9$p%"q?W98 \insR@|XJ7NuRe |R8{{lΨ=0u+SHTkTz ƊD]<-| O!',&?!>L4-{IGKr{*CpB)z%M;>ux%~eλ?){}Uoӡs˞zqC e#~YGq.pmR]k}"#~V 8l^ c"̑jr!2'&ܗ|6* E,d}>\Yԙ] GvF8۵XԽ:E׍5K*F91|ZC۷;*~P6Ħ2 1QI M f>J^cT ߏ{T"VW>군Brƺ}tQe]?{ b~T/vD( #Dz3|PT71WC\ҜklKe39S~^ 9:E:H;ygWI-I-P{ .Lh[݄oNKqk1$><0>^k4-,A0 nRդp16M?L@>F>Mcר-MuNB;ul7:XHD|Y1Wm8S9ªB9S"rw9/0#o1Aci@o R%'ht &T2y ucӆ_|K} d4U+Ɨ5:Wp`zI4D9Qͼsj~5U "[kٻj6EE˲A-\#"dL!1Uuyx r\^v=t&7MX)6)*p?uADyI8I#X+vVHDľ6oUTﴅK KXϗ'\mnhDoaR J<$׍ú087wfA$8we?E2>baڂR'jSsyqcМi_,bYֲ0E lx8*;!3 .Q \Li'!ZJ)Eb4_Ƶ 2G?UsF "7t×W9D~w[n^|r/[jͯ0D/U\Rvh[`eh I^-k[D,JW2FMG2F hBJqN~~T5?#㴭[ÚP@?5_TU: {/UU=Xs_3ޕVCmn,Rv9hvB~KC!|"V`ݖ([" `fpML ,'xE9( O#[ Yath9*FbFm}a܋Bt z^U5()¬8̈́ n]&|s߃_p|O \ъLg[S S&܉bFM<@*Mća=)HyZ2Y:;"pK.3W+h<<ٷno]!j!3t` 6ש0D9 ۊ9, #Kgs#b+}Quv =T[B6ztڱz9Ey݊-J&`"Dɕ Y5TA'?50`LdZZ_jնŕZFbq?a~dҞQ g0):#8;xvv;t@9{ntsIv`N@[sRN=nLVJRڻ[/{<ʴP1;rЭp[6))]PQ^SuyfSGȀPZlЖ^ ;On&Մ=d Y*>J?ٳ]߹w࿻{"H,Ǎ 4b]t3w2|_o5tCnfTY7 )c 3P GyDB9399 &di}k"|qeWD|>KTo#ڑ"z޻RrIvLvЙm9 ȘvqȲ%c1&{[KA-WQ#4p[f>$ <\y$72Q5, Px09ymܓ-/OB62(O.ͅYBEJGe[64 '+$dA.6s\XYš BYcԡto:ϥit05"?i[v^z5&B%'|4C`c*5$Q[ '"] U2[a&cH5]@VE9@nnfn##{#-ކ=0W`bt@yr!o5#1aAnL\w5Zq[B45Jl`j4vcu*gm=2 2ΛPo"؉-:3%̍Eʃq ޔX82II_68 Os_ [;pՁDsAQ*Hj\9Va#W\4JzsGsNOѿh85CHD 9IJ;*́Q$t9$z#Q]x֊,u`'?Z+5еhgș8v2#E4V+[vpgDP®'ݡn?σЪBܩjhVX~9bRa^CsUuR#Z& D"/Isq*keb=WdK_A$1kGca^8\Ya+L+ĆUI?ҡndD!j!÷[`x/3 v S8l"f 7<sAP`[&•ؓ,jK7𾿿_ U )~-\1wx4.9jڃspeڨGjiTUշ`Zi ٜ9w #B8W92Z+7 VUecܞq\KTIx-!L׮.yh $JIc"S(h*S^N_/3&Qe'XPX(W@ &eZ'Ds\xC2)D,D ԋ,2 \`ىȖ)$}_xU a/a]"90P<\ՠIWiSX,Eec^eɍU`0usDQTnKf%BRB9",>Ҹ/$0m3ٽ~eĖQIkMqP1TYIxyze授6@/LźKC\A4$RLxF[$Gx#0ե7M _>:(\T8I&sY*^U1NG$2BH*L]B%n Fqr4b}YTCVe^`AE#BXa=;vh4.]̝LDj~8Z3CU&En U"MW{Y4Qp@(/֣nAz!-\~T~pxRDi!¬cSrN<3 RcPv`p6s5X:ZCLtTeeC?Ycĵ?D뱑{HJE@C\}u'hk3gM qw̹?Ώ" pϩ.WИxk:β_C=]J"fɲׯ?Ŏ0UԽc\X f{[5AH3 Kƌ-}:R Yjr$E.*G5ܧG\K ),,BL eĤ*$as)[D_U]d dB|Xѩ O blK f ) ML ɱ#C|OaF1,Q(SxH s(̠Tru[; ~e $/qDABk!f9+qVW:pѕ,N ]Fف}D)$Z`Q| U~SWȵM0޸<=+ e_smzS@_*c5+W)]&]G` ?d-E$ =Gа[y])cRDyiUxN[Շo,OXe3aGvxl (g\rlJ nJDQ UsYw+qI"3]שC\tu߸G?mV^q~GĜs&D׹uϿZDp7|_KzS"UD$ѻH\e+F,Sƒ;zvԃԅQ57tiSoq.~DCgfzcrf!m(=7`)bL8`e"PcA u9*t3[95q4/mKMBm(Oߡ"2X|S|0;eԔ%q(k} <%:$i}N) M|I쀶q N[babO1(!IG<Ѳ%2,A5Mn}qTb|u*Oũca RD yK aFcJyPJXo!Y̵Nަ;( 4I0HEss%Xx)NJfH6jd(֜Cv={ 1GP۵Tt形ڭax,nZ\dElz'Z'_"TPE]4Nf6X_ԽQǜ9p0Oc!qS~GUs_A1y9 k @RceHT!qz:я1l$QFyP%Vv29\E^3Bh j!"*bW/2>-H }.w}Df-oDUm)"c^/qb:AȄp!Z8|֒|-;afҙoȏr^|Uݵ5zO$Xn˓uQ?nt/\ m{>'z_8=EiC@Ru2̆jqpt*׸2E8ĩ y+O'Z>;´; eCSіV].;9P`DYZƭqXBK^ E7~Z!9)>E]aQ u k bp.OQ93y&h^]&U!&A8 y\9[h$B{NO^X0GPAHEЊKnvA[9=p|$; ;W%ۣl Jx ,t(=pe8ఁ}# )鉍4LKYʝֆȬʳB_:`FI>C{%LCL'I58ך_$l- kYIJbշWDs9a7ExAq|{7V)Sl+VvE-(Fy$'=f:י@H<e*3z繏"YK{@6:OܜJfkEXp h40k*@m:zE H93)dWc|N/6F.uV|Ans.sD,}"FaIO71F*2ǫU1?1:+KTPL?d ׁ1mZA"}D!cR@b~@j>cڿ>bY,Z̊ :T4܂JcW Z5'u3|qm-W! ]AT1/!]с(%e-:j͇J%=Qm~55ƽo!Ԧ%:TrV+Vl~V'A*&_7ǃ4u\ <%6k Q/%|#΋hflH;$!+V}V*L IHGh ;hNcTJOS$:E5(I_n!1%"̎UqJs I^ gdQ!]$($<馃P]JsTJ#Q<-j~ruC$ZY Eٺz,γWK&7{o~ÁɡKOٔ,udN)yD -DI1YS,9&AQ2 v;қV>PZJB0z,4(Yu?{'o2Z `d8kw:0sDc@WCTT5'B-jëq٘%COXFƙ: s,2#t&Vq}cy./ ?rN׈*Wfm^=V 7lbCmC :E~eA1x[X5bBͅ-6"q&16g~qx}*D(XyfWOhA&NT.:rR)}ODJM͕N\" FlYqQr$ F҈]kuc7gw?zQyŐ1ug;HHO̙h[x겾#aaf1CkQd!,1Qt9zGFZfM>qW7oGC rkxzΫ!& 4/JegvJpLlwA@8; r37:̊>5mtO>%\e{aaN%+pz='f^0TJI߸))#fKbn&n޽r]%nM?g3K_ۥ-Z u|>C2H *"_@|.Cw5Uk^,PnA^¦+q(Q-;ntkج{0) _VQc\/c/ @%!WX/spqy8-wAuKwCw'Ծ;xQ}f*l~=k,Lcwϧ9XU1Δ.#;(!pI>G"yl[8Hb&_ ef"#5h`zs%Y>KH25wvokYBmP^opՎ[PחRldFN;!! 3jX>P{,2FNr3DwNЉ.lR'̅YEZJ:FAAÚGhxѹ!=g li緟ͽskHsugE=fP$LFeLݑ<#,cXxx_8Xd 3LH,ޒ"䩹%MerQ"qVo]ab]oTŷ<~S[/`7 43 ?D:-eԐ NzV,zCց٭83SP2=dCSe#o՟p] p-ʉ1l:zC 2_osLʹWq}_TGIKr!f]I񟶁Oit0wR7?BRDaATO"W s8N"su-&Uկ V{92N_ 8RRȬKkTkYٹ>F kw8E'34Ӣ+ SF"  NISX:Ϫ<'03-:g+ djdNX<Ðkpdo$nײer}+wUq  q 7H EI9zͅcK ͮ 0ttA6"aQRkxN NIgn"nDTll¯^N!"cD=c;ϬTt 38,7B ̺p"-3) *|aD,K;#B{z;8Tuq|dl}gW"#LcVѐY6AwT[ވ c6)3lpx>F60wx6N>hϦ*_=N"rA4XșXՍ)4 ɠ0wPvEEHЉ쌰r +/E*e9ZCd O7efBrO#*A$Ys.Z]JJ-N dI{$Ě#0cr58+jі<ȆU2K)yKS #A. B0C󀄈 E8ff..]ŒD q{% h6zgoQ9`adLeLX^eߋwyڸшx;n"!":]X1>c`F1΄8^P5y #my)y~9GHlT$G6-m᜚Emݟ#v}M}=%u}ޔ%ly R=J{fQ.ؑhf;1* M) #e<@v/Szy8 IN2]Xh>4mUZI|+nAqQ<͹*Zf7UC#d$Am6Rgqfb$X4KwR匍R@< m*16`-5npRd\=̃A-sG}̶3吸œcsW#pV2!.JOEW-DEFp#blQ5jL%Ƣ@'sH~0BT8H*)8 o.vViN=|t;$7E3q<"0G&D 9d鑱N䜓[\M؉>F1RN# LxsT<{okTƐ3S rA$PiߔE {㼮+kHnwS@ X[zȳnjiV$1B>=PHCq}}aĔK̩N,1X4sZw(o}PϗKYT뀙y̜KRkI*gF ]Hz~֦:mūLRZ̀܆)xUeŞT/蝲;D̲` F\Y_O'F2&Y/gKFNw.kޕ[nn-E6|e*DZJZ&hegUa&*6r}57׺ ˴!f^%+Jŭ4R{P*yW`<+żk4<=}/Ms/Rݿl#m,|ӻWU]dHH\=BE\k~6fe1J#?AS Q'e{edn*V(屸{vZ@a1lE~_yYLҦpE:N͸IotjKM*BfJrw#"m۲'G%ؽD2jF?Fkqg6@J E+f aLzֵ61/qXiעGyO|N(Yu^q<_6=o`l#YDr |%=-|<ᘱA3m%mdY`v iҀ}%#^'Kڕ#7#=Soyj#}޳HOP {yޭIB"nclȞ:4T;V ^*fIumb\nr"cqa?ٟ*Pg5A%0+ض3*ut@@VRE)8!k Go`@dFxoZq5cA92cKgEKq[3*"4 DR{QKEJӕ}z0Woo7lΐ[ok`x xϙsUŧȝZӦ-7Ȫl-X&FƮ-6;L ).9=wOe1c4flZN:Qd|}Vey9>\6H$LeJ7Jy_F,pD(z'C&{G!6eHw9n۵ TlTd7<>|i!\C%l{"cz%Z>G8"jgrWziff &`z]=-' JËi=dlPrG"(u(>b+$*q4s]^ TI5"}rt<IQ]=2<ΩjrykOºʩM&Y.8{b֎Vi.wPHzJuXU5|j+90 um1̆i6=rcZnޯ4&mᵼuC2W ػ1x2b)K+>TrQaHg53KlZ8BD1Myt; Bf>X [;ڬ<ș|N>Ea>,z+JJz V/Uݏ_OgJQ PW"ÖΉ+{8Vd wnni˧q) 3kT?3gX6 ` m!"Ӭ%%r]Z1( pq1̄[faUeplXEb nvoR]"ɍsw:??s;Zݽ ^ ;ӯDyNZ# d3v 8M[L#RL-i1R<<~waAU]  ^Zh쎪k|<+u.'_ a$yKTS痻+iv&<q^nԇ( oʂڌISH>Qc?Z3` *3'_nFc(Qv)6(]lՅex6/ BsFu^g;[ 4 x>Z{Q 0E*q>88J6XǏ>"WH˰\E16ưJuC"6Tm wZ*4U"r;DL~I ˂=QdFur8A!_:zc2۲G`% ">]}^6M0*Nfkyƃ1x)Gxf10| ?~uY"`)"'!޹FZ9~UD YD;&<]uhX엸 ˆpFDM5jO1#6r徔|qU9ui$1!O;xe#Eߙ¿>wSh* 8"ή`;g0$;SG.Ϝ1 A̹'_2A+; H @I&r_IR9t`Yy'b9=MG*X&3;dJp :*E8!Ē \/+q͓F>|\J@IkX6dH Ev 27CAզAc M>3njf َpSuu08w,~ή>|4M EF7 'dOHA$M5|aTyt_;'*6È/U&4l490zŠm׃_( Ѓ#q3!!½_r<fqA7<*$F'hy!!#\םZiʔ1󙍙lɒ6Kmpfoz[@qd16u.`+ث$Kg|>bZ>ye`8HʺSi3hҮ|>2W鯿jOK$"_َ?x]DԴءߐw?639hȿCz0u]0s390]HˆlkM͙M)!bQ`ʖG XXEJuṶ#`JWGvg2oL yy6޻Dx]ȟfC۞/z}?]^q6T, oAaKGso;g!Kfj^ڃԸ 0>0>I5?+UG{'5z3GTyV 2ZddF$.> vvp\PLvTEirh*6L(pڸT@DbmIS*Vl8.o%^ݪR'3Yx((X|= pF:E`46-sd4I91,1?{8y R3@#ul w'77sHAϤDҬfvE Vք)\^!Rc0fuaE876Dzt2j <[Wq=k=٬"ȑY?5kwW*=U] 6>8M3HD4tL%VTK2|F<*3Mf_U<)?vzIs\-vm^oΖ,xZk9@V(Ź6%nebe}.&"E߻q[< pw{LeHd^JȨ@rB8q+߱q4V];4M:OhIDm$>Uٹk5,lcw bxg{if&.S|>ͮl ffU/o 3>J!d,ĩMrtN8 "dBv>1a)nf6m:$;(@fWq\98#Ğ0oԉcW^j?lk1ߩ<Foϸh=$6 Ѧt¹CnY)1p3)yb\;4]n^W0EkB`xU=wN~[՘Er,T wT 8p +AU&'eO dJ5 "(!nVɼieŚu@LfFc@Dqa ȰgT?lF)Lն bIx&·eD;K̾Ep5LBV!;6#7/vGaMuiQb*E*(V4qмH&Qw劵Frqq5BQ|b,)-¯|IR+:pzm rr\r1,* A;P#4H[Sǀt|grm{퇙'4ޚoaϞ|JҭړYκGP6 Gi N.aSp]8Z6v[~ٯ|R2/=Of&*:c*ewm,&"&Kñ{Bnj#l]̒eMxlC$mM#1_#hپJ\Fa>wq1N@Ru^CG2"7~Km\Nx7~~zϚE5\@,\JD SrA3aANxb_qZ-@Y͍Y-‚%Z٫wxiڬw:^ȧHOV0sd{r"f>$..7h6b:#Ttn*-Dؾ*I؂KABB ]Ƚ}@F\fǑ]U/MG3Àr^6\9‡;1cspx_F0""\ǜRsnaXѹ:a!%\e-v|Jc@jnLaDh{&NEiHe߭dEф`jlE>,{KK$t_EdL2Elys2cG@Cxxr*WV v,;'V7޾V@PL3DkJ|ҫ2s[b)ak^- }3̽]!ʬ Zn6cj|{If&O>ʽ FR:MWο?CL[;,+B zpIU>OcR+Aga3c|I>3BZw96Z}3loK^4آg 3oD2gj2jd )~ +*cC*o?EjIJť}8n0>@tUГY [Q%xƨܘ$,}&a ϔPmZ`)J9 pYuZ#^v3%Dvo۟>"s?? 5"j #B3㒝U_6"HwTR6PtAVcB ba=@eiȬ\l'd Wtt1-HCX56$f>@蘼̸^agΛy/^љ)^w\NPr&IBCw 6OB=qÕ\WgbYܘfe?ɝO]GeNY31#|S|mj,l=#G[Xȕc*f-.AB(#naJ֖ێOm_" 2,HXbZ1Fv̜ҁt,rǛ0713*KwQU/a,3ڂ,LN4aH1P+fsf)ԔB<v4"~R>E!ؽT :1w^}K̈́x-<#(:@3Ҽwa67M/LT},c c$)t2 j.hXW.׼eU{,A:ל+IhJh^r~#Y. ߝZf3OZ[V*obeBX](4En3|x ;-e}TEb +մcp+Vj ƞyYyN^<@F۲'6|soqi^Kf8G[ɬ}z {u5TڈgPhz= 0K&K&|_ѯ?~G4=1z601 )]Tmaݏ3_~uQ`815n'qh;<Ƥy>uZًY3ՙwDks+|+B$rxFGG ___;"ȏ?~R0 #aLK&W{İ>"3<D/%xS`<+Cz?&b:`)f'Yqq^ _?GbKJao sq6Qk/Hݣ@ltaD5ȈC `?~ۿϟ?WZ;hIs"b95TyU!eNؗ$ӄ| !t]}͠nݛ'=/Pՠy}=Gߥ5_A;T$}<M^z08 NV nF)Ҽ8jfUBMCcٕ*Mvn&%ʜ ѱVjRkZr0XxBc>|Yҟl4/9c(l1dn|gz<#6f HuDr15a}~]p쨴dqJ'pWZ6ah_)lf,xy9ۉ> K -. D2CT*v[%E}W| wI>Y.Lٺ3=X7L-=&Lk䙝T=㋂y6,̬=[e4_UPK\q5 0ʚI ,<6_iZbw\ğj[,߬7O͹j0S8㽚0?8QW=q'CNjT#f8gÇFpRͅ%#)2R'"^暄~-`-]㏘‘avkp p ʤҴ<`)h qdb!s{t'g&iDLC &I T(ΨA(i:a\zlE.OH@ >9_K}ӇWWemܖpwe敪]Me)b궛RY3,Ѹ" aV9puWrp#2q+E#Bs-F&WQ7 k=ĬOL`ʩ1( CR45 š],dacJ|)zk`oHB;yEAn,ul܉glS?@S**.*ʯ0 QeLٽMm:ސz)^l/!:rDK ;Q>b5*T>oD%_2m!ߺK k֮ T+Z#U-&n*}IB53$Kgn\ixy4"*XdGi5f+Zn7g}fvmERkT213`s䏨Go,CJ>#ֶ }u:QA2!.Pwx`MBf+!eAn})`0!̥MSؕv+8P\ߧkif|ր6:d=4(Iep6vu `$VGc.]pa7LE v3s,b ۬[V2  eWm@tDA@6'5zCx/.KOu#=EAř^vԖpwNVS`n+H y8" 'DnNp|AE [/nơ,#lHJ@L`T֙U3SX˾Yyp+-1rp ͍gSnwBq~&gѹG3dlwϿo5R]sҍLyíY\.Mxؖ6FqF,٘_HEΰњAL>]c *3cGw7/ЫBBΑNnr[DQ*IBZѵ1E8p:Q)vߠ "nFR fEۡ]hY>3d]5"nFD-75t- WsT`[-"7Td#-)Y+cad#QY/(ڧ߂|JoUxX$|Gr3/S, Vdɗv k1KT5OkNnPvw y~X;W;!߻l-blwԫZy^  g Ne1% ܒ7yNS^njLJY$O BkG%c]Ucw/DJ|hf ;M[,颜_!j'P^{SFIߞXrՐ7Z 7O5N'H`fO#ҽoR[͐-HX+wp,M%gћ9&_`'2ㅘէr(=୒S8|D  M_%3F7=Ah6/Bw pnpʜ%dTuҎRdl"%9%(QȻj+ZU,JUZ1Ϣ$U[77mAZ݇;{RWWߜ\uyVx{r+i>i+Lhhg{5}lKv}'4{vh0gޅnAA63A[U\0ݳL١=t#|882SO.ugPYR˪g^op,^7۹Ϭj>M%$TR(c\{Db|Fְ$s4Rh{BBDQk#\4@R5,wqo:d@g%pӍ2.*y"ӽZ3I"i '': $&sjG _qByyNs(g(3 [ul_0q {~MNٱ$ܵA}8Yf}x e\sۇ B%؅ק֖(dH>L yPn3-JD~Y"kk* 5I/JX*g)-uG p' 3exJGAƢE$^ Ț(3ޝMr\c{= n2O`+CkcG`Zjyudcnm.U ޽58$"j1޻ KakMUHقq1zfzbKR_ZMbf̘ъP8r z5uǡ*W˴z6kgۤ___ff1z0v\E)1e -Xu9 ʶ-l;E Cu$s/fA]KL0k -Ru_}ܜCg: qvG4ºǡ85Α"c`#OaN> XwPЕ^U,Y?$wI|4R:`JK "?`ɧm'Ch(&1,Oݣu[ 7oc睝8EzۊN[3mDdz{Yk+GA}}{c{%x+Qo D,o;BQD434aљ!|-_[!"-/Hpgxw4GEY|e8Av %@QN./,":I,FPqSY렳V )^cRASRe'5m= +P@ <Բ}55j!ԉ3d`e1~細ڻԖ5w?,C8{N%֝N uTNmld?I洛d3&DsfOgHoÏ?OPGw7G;($U9􀪾F& c DfA wU-]~4zMӦ. DžHszܖXD%7%!_q4UϹXU=z`aa+#c;|n[87<ǜKrD/\yo f"6hG#h3˿k?=Jk!H&̑9c16BIj=cfap\PVagDP=hhfZ0Evm\(U .r!") š8U-!_3$=\3cz+h!,:!Ȭ-,8 ftx4/A_wM*i;$=#܄yԦAʪp}](aL]cVwf V0j(GJD2 E~č$}{Gr?&$a΀QALXK'P d'UGljX$-b4~yCY-|<铜p$ p#`^1u>!A s / #, ji^!¬Mjb%0Y{0wa%q!#Y)adr"'r ݪeQ` *j,B3 &_߿~0&>K&$< I+E 1gǜY10?%L _5"̳q4'k薸 qCA"S""L|/³lA&(hGdko9TU11F:$+{Flis@x:Ӌ'W2&-O|$w$]m򯥧bĘL7$)b(%2EvvWЛ7u,º7Vr{ ,tS*nˢ*EѪ"(QJH- R*Iss yH ǝ,ٹ@+`Ca9Q= .}#Ɯs_3 R,Y;py8 QyUb t0H}9^w#Ve烱᥌JT_{5Zמ_0LNS^WHY  S6uC_ @am"ᓮ:MOg]f+T\)cX9)9wglLx[ J`2b#ѝA oAխ\8̶ir@H7g1zz6Qk.aV!zޖ")BujTqgaBّ;\&:Ĥ#+*A+ 5+~x=ߋo%?z]w*nj*VXm)ʑʼn,V~8GT%9qR~ddʁJDpQ9,>R-W炪{A>ZGibkѲ,iN<1FSm|pOm*ɓ ӌ !-zx<$JUww6A|$yo%ěd5cn-zUIc n_ϡĊiܡ4+Z.|!3uI$w NBIJn;~iwV-ΡF]8<߈x<$waC[)J23|mSՖ[+c}O7wy9[KD˶T]z"W%PfR4E?Nd򮏜;2[>67EoνgGpmgGpߓ\(Ojp%WNEl$ZI{"jDPm;'*vKSwphUa4tfAJ s|䶭_ګyf TST9 ~ZY)NlRzrcU!GF_J2)ոUH͢<aW*n??W25nA8];S\ixVط5#}38 T11RM|NY,>ƦF,43mYnعRw1jrS>'k':~tUɈ!favไuNhgw举[99dzW(}ThIB.Z1_c}, `D]aə2_]֘O T8[o֔`!9BϺ0m[J R9w&V`32"plB`fF̈r鯦¸LF#Uy2U}]s; 'QDf j N3=o]]m&3~xRQybd庺wEzip 1%{Y_`OJLh'F_MTm^Q)Û!g#@g$iWz"YU:EWZo(d"M$$J2琉B VnH]0w+Na3Sߣfi}e9A(IB)7k ~~q[sP&T$T"77ʙK]Q>"\7Zcjbʇ=%*&Jg3Ɯc(<(Y*z23Sʹjo3N1w/ #P=sv㭿Jb[YÓ'ڀj]L s*uxI"6Y.kPjͻ?q3mP%(x]bi[}c}D6T]=@UX y5ఐґo)5=hU<l∈t( u| }f3imY4Rf(9svY9ƗjeU3H%Z ֚n3g&)c.ɔR@8C'(6CCaȇRWLcMR˚!޺Y(PrŽWHS5} #p5royht o `H\lǃ.uѼ<>Ŭ5cJnsjVzzoc~Us4 u"c3\MO1M5]̮y!z ڳ%\Ҟ_)b")?~11O"@4a>_ސ]0C*if???f>1cFB4 's +Z F L_$.3#;}Xf6@#5Pׯh!=׌lS1G8n8G~;cfs@cj_ngt:Ƹ̤5Q91^d5MF Bz|}}]ץ*c\"1.s3Rm+ŞК.1Z5i"дqf֮k_ޥLGknJVN+z^{ E6c>ē[5k?WI+2a)kU$cD9> o>c 9E5ƅ?w+SwgUZD@Rb`^ kdJSXOFbLL?ȋZz1Q DS5ѻEOt,Yڞ:WM4e#s`InaHJ[R!RtFh{@j59ȵf~/F/ȁ&t]1+M$s?|i"3d('$`€ЗdHS&`F$Cw#_̚$DŽ4#}g:g>c@ddɓΆ5Q5օ'xmyj[n tF,KsGp`",=a9%"c'OJv++h"Fq0^@31N\?)̚l{pC~ؕk5W8lǡ:f5?6E,KIkw?ϕ-*45O/L1uE"e20T"A&f?Vg2S> =C!MU맷~VC&ػ".g݄]K U7꽤Dqh[֌[2}[h5JBs;N=݀nەFȒtνV\б{ C~8 pUQm;UlJ>1GJq ۋ00p&pQxiLa\Ԝ.&Kp7ACe=_ jiTP"HIqOL+LCz:mnT^Fht%Px4kNzV8YB 6sQ zāsAr4xRH&Sx|'bjs4MXH⪫:j˕n\]HIYJ )=P*A랬i $ӪF{ FzfISe2YT USKtruut+fn2h)Е玼] J"k \\° G7@o_o׀Tj`GWM޽Yi3# o4CSfys+"+X۩&VkohOLRϰZ45>LR G%Ȭ5T[kѴΫD] ` Y ": "$$KXe,41car= VpVƻX#ӕf;s֧+#qQR<}fx=LiM2hR.H&!>wY||ݑ|wRJKkmݭF{d'D5Jiݧ t'' M?MU-Y4n ęsu+saGF{η|ֻCթHĖWp[cK_~휃MhXإ?\gjzX\ ][!b Z}E;h_s$Lb.kjDԴ5MIpH"DߢV rI޾dwnm Xl.uyjj]N?(A -FfZoVUZ´?Yki\ r*,Q#Ў\޹Z q(W]d~pj?!c%"Xr?equ\Զr!9d1& Vxamߤf›ek%4ΌS&IBLp#ÊAR[4*jHz5^ LMGk>CL\}9Z"R>W]UP$л,0ծ\>,+WRBi1s`k'cXF[k@Ad{vW%}Z X=Oc]UX&,>͌{*TKpYcf;r-:Yi"X켺u5iV]_7Yv)NR@oAXwFy~igkv3V9Xp1}^/3ϧOGc#f*NZGqM6Dt%&VJ^k]uDy"[7Ypq]W|>/ 7!?1ƒѱT\XUi3݉sN֦mDUKP6h~~~vm}agP~DΛ=<4-3Z2J/oiof 63n-tgyf,s4kruK"Z|y^82,u`QYB5Cnp/4;P~㌡|<%* ^gL$vFf B]*౲،սZn3;`N5Mψ9=w)ګƐW=8cި߰q]"^߫Տ̘hE8ո@FĈ31E\-OBwNs]Ǿ1'OQ/ϑtoRP$q&|RA^>9Ҡ\My-0u1~Lrv?تj*ꯞa(od?X(%輒i_aO!9򊘉wDj`zF|< >(j1Gmi ZtX T CiYY#EĦdЉSZ.iƘTVHDzy_gS'yA]qœp[g|C3h!)4=NjF–e§8U ʩ{)x\ּU(&*%TӥQnygkoq;+dUm>7-#BλS=/i~^?___i]ꭇLg[oc2֙{yomW1^qMQ}aF>.X6}fbrbcx:һWk(OW9]!P] Wm&*pZ11g|B1ղ?:=g9c* ۝Omç#b(aR=p޳cc4H " JѨޛ^:mP7f,4DuS4%TkGT۠@4Qk}Fx8 tGL"'j.S}> "pWgc_D}f:95,=f/y6$NxRi}޻;9*xM9Vsz0c:/>%{Zg(B0cɀ{"(@1b mͮ׫ǎj̩2C 7<OSH?{Ow[-RqE: IS8{YaAu]@ [ %4Hxd}zοy$C9^PD 0*ìKtULwbcy.Hh\5B!-X*"OJb:yT]!=DA2(=4iT@dz Ã_""RTɔ 4\}W/e"bj{ R5NzQ5<BgPP2pehXepﰔ.*&%sF$L ܑ<d0RejEk~@"aQ *Ҋ,jz$B@M mj.oMlwnf2Dx {p3.Q)dFR2}.jm^ӇX ܈pwa[(}#BZVVz샆9^泑hc{xS < SDBwN)9xO#PޛQ) 8r2BUy"Q?^nrg TDB4T[F \~~~T@,&?g4՝CԜבpf;<"̉CD<~U~}_ 犱ˢv$7UnT9ܓE1Mf2){쯜^M=$l: Zf5jO43p^:Jּj>XFjeTS2y(D8]"Kx A9c*a%"7e""t)0Y`Qn% SzE;3 0?nˁwׯM@}U95: "Zg*O3"R, 6[Z#˳'ugɕ7zAMG/i~ew<"Z#'-An "җiaYA̜k{sb6_`._^߻1NJXk3A_¯sԯw$܋W)FُڪNl7M{<|lhd;̕L1pKJ~[NwsȀIu马mI+L2vwIx/5[ e|8#&wk7eԬGulj*Z^bMLk 5H>Uj >dD-dzc,N s3 khq(ͬtD6&(V,ljFeI:N9݊qT{t9Lj1M[)8w@^޷uhK6L֣KĄg7*!sdbCX a)}A @H"|OW%L !P7|^Nx#%g-p @4n vP "\&к@dYLJ&]EL$aV|(gi(,b*yXT]$\u;P޷WsN_Ҡŧ!ؘuv3sA;NIxB igmcd#b\.kNN2T101}N<8*vG&b*,?JX5tDu݇fVZ>:,yw^uSȬ"sNFaI[r< V|ZiĜs>hXVӭ:ڿ&\IsHeYyD7.ךb|<>F1o4>O|{GD5Ɍzl.sB {-U[]}|_ZB4R쬜":L]Q5y=w]{f?8T޿~ˉY_m=)benyX1n 2 bZ)'Z~*P!MG#<`jߏJxT^͡v5M[6Luiy&QWG4Te TÅ Ḧ,okJiL41Lv&.V32ftw idAeϚ(^e*ֆ4zjڣhddQ-J Q0M+4Wrc+V"$*i)vC-/WNX!Ȝ+躊nd¤əã:rꈧ5 1xsznGk-#3MC9M WK0OB|jQjfխ⅜tNͬ`"V|<%h;p@>[\{4VZ^doi'w3ݻIC<)8{!޼Ś *rj1- o)w&\JPycRqm&: r|>Tֆ;LLZdS$]Ejg(Y+*&!05P{n֢*[H46?$c0D]vֻJE3x+? H 0‘*dՠ ZS̗"Ū)QYڑ XQ],KZ3q+uJA΅BBBnWb+/XqJ-Hx ʬ }D>/hw'G-+sɦTS IO/nRxҫKK>aPE2QbYiGZ"TVͯLAML"R"o[TlnT (GFBN%SAj L$;DX u zX">ljBDIðȩ fW'Kf4,g+uVcBA&"{K7EM?ύڕfC[(ET;\9% Us{S?af๖'m'c'gw_5 o[k9go3KmH2㏯1"U\*s< r oΙ ;mi/D%<Y6t.ssRDp:})<-#mRoɓ+v2`գ7CϖCwfK VvEd=cXI'zh Zx8ǩzcE?ۥ zdL|>dr*]4n<ؿ>02sh6^@D-=O惬*d̴‰t&NW+J˜#BU b>@nLN{XҲ=H.I\P_: t0pPyss{lrP$™r HQ,'"ґ/ɟB߱8R`2Xq ĚDDR4rWE )tDD&f0} -sWKƒP 5s´C3v}{P|GS M5"zxz\@S"*Mg8Q1EDŢMBa2c"hA! 1)Y057Shb=gkH31kH?x790xD[ g` 4ӴΈh$1:9C<sH1=%i8=z.bKO :&OC)J l\m{yCkɘHU@D:"$ѭ!R! c^Ad EuEp3>js~ׯ Ӭ7n/cNPtE."ktȩ'8zIoF>AhA?*ZwbkZDx3 sxw~Y"Euzֆf.t/ {Ɛ 8uHwr-y1* #oe^L^HL% N^~܈*PGmI])RPǣ0k0;zM*bѽX ={jh#W'ZgA|i)HJWYnQ2m=&^% |n2֝ τEbG`$ i&HKș 1#*̽i[( Jym$dT Ɖ9Pg "u],4Tj;uFM8ДWVMtìB/IY)$Ѡz#d.n*AAu99R51Rb2a"#'=Q&y5|Yyf!ue z-rLLulZcƒ(%30EC$.ȼ`F|y.&E_ASN@6i[{s%X;ff&R9uƶKwm7g$F+[iK(s:RSl {^?m^aGSU$U )$l[J3Un7;?U<w]ī ]ixRh*<`HI+ ;JTS̡Y7 =,Kuh[u`*&̺j:[:@emKJ[ST qav&}d ,bp0oܨ)bS?qqJIs\}[{ᖳ ǯoLQrWOM|ALO{;v)@!>~ܝKYHˇ`)V$׋R1sac(]:Nc)ّI9ySL>x^6)8 3K(yld>E jD-%{XGZWY;okBlj|mup- B)TBɱH [&1vbq1oՍc֚D\}wEyEx Z*%ПWr~>2n7/יZTר*[Xu<ݚ|“鶉Ldk #- F$k)J~* OUx[~KF-;xdx>87 }"G~uRZ m鞜27/H+U?4N? bH(R35} X)EZ\13@hܘ"pδuA4Xiێ$v3aɝ*Xg6Î9O"@F!`ex︮ÃR$H.BJG"MPUl~ʰZyd!{ [)(HX=|Yu]|HJnʹtAq*[ c?Jc>!<R[&d4פGc}prw?|86}'+0%d!4TMUj! H; =W4^bd_dFĄ~ȫm6ɇ []E kXk@KqlO vMÍ,"IGQ !;]gM|}0ƵZT1GC94;~xe_X ;ϽE"<$k1FUb76|po9Gk ­W%zVW@`+QUc:[Z(Hը*Ev}ZdXz!iF&D*@l{" 5447\;%1z%In$I.GV32̾ݙn2a^,fF0~ 8Dw8G=s뷽d:10ܛU2#RO˭[?/P10/"1:Ցc ?~AEu[,$]U{gfq]5 (3Z袪y=,0SZ7m9Eݺ l1‹`M[݈ڭ5*]Xs̒VTqy{QsLfaaeֲ,6h/s9T˔u"Y`м7Y'5;Do憺bzKTؖ(;Pe=6[+J yE,D3dmW8^[762XUc<`C1FYkczY;&BI%O)rk(0>QE:Q^zݩi0w>p}Bv%姚_M͢F5|ErXv'tpT\$/d0%" cںIk ^(Q?w`bg7:YZ0a6Y:P"yIk+sa٠z) ,5`^@ T*h^Kњaj& A6 }uv&%jۇi3P͚钓?ǷEffQLYxz&1HGԚZ(@ }]8D\U#nvi34of^h%tw/:YFN$;UڭL/I,Bef(pތd<blZJ9 #.c\>f=b챙5ח\012"^G|#%P~::*b-D#SW/9jȘ lXO0DMa#B2[oѰ+1֣p>;A -:Oev.;ߵ|X1To`MQ]j5B F]<ng Mͼ*g!6A3C*2JJ FjVBdL27-|Nv$fĆ:.bI͉^AiAfmʟ J)ףw1kCESs(DmAVS49T&6 ) Q\RU"{.Q"̻yO3dfkZӅewɉ.,ydBmDۈz(71 f]wq}z~1p]ϟ?soGaY1DZKu! BXRP> cL45"^׸R!ӔSRP"y3F4' ..q(E;~:u Wd DÈq{cp,rkBziGJ*IIn8Tnr2LZKF!&95FkGz,1$d*@Ms f7sVM 2%ȯ 4oø,n.冮 %Tbrcb w=љ, D@y"ӈlr|AڎZƥbS"Cu]I~$M͞q?f_3tׂ@ؕ{Dm,CC25B1Tnf\RH❎ GʊX!lHL]nv#KDn=v!$*A\MU03EBW6yR0w~5VBg*{4l;,_]g^I!Ug\|fH *9{d[:LS)FLר*1PD@%@!sAWTLg=i#bW?9xE_HzD0E )YMB1zq{`"5/WT UXn&Jbu7 av˵{! al2l:(G|Ib':wh^݅*xA0{θҶISu Sn.=ĸ )TIRfp4NPיs_2r?v՚b>3S3m;̕ǰWSX=nw_֎࡝}b4טDe $Q"tƘ1^4WN#'jvߜ !3rr ȸ ?64T;G+uk׷ 0qs:bf_Eӏ_}䷲t͛~z]h%@RJ[TkBvk2R;|0^xɝ3v{u!s^ VOmŰ.Zc2z ΑGƶNɤe1`iU= %u8\"W'1Vc.ٔ+3qpEqLj\b93&Ǐ?W߿8gf[dL ZAʳ"l0Z+ & W %/pNkg񇫉8OAo91b0bY[m^Q_2<;X83O <3D]ړgMɄU ŗ5:Qs8Qh71Mj\gBY2 {ʵ}}\Y$-$:we{ʆ# +O+fk>㊄7BJ4= EF΅%Jêuwjoݕ_?KU^W@}H88f82A$W}.K >]y FtgU/러.$.Bwj>v= ۬ɰcrvTP))1Ƚ^Xh[I<Uxu &y1D}k]0]5\- m|͹iӳmIHIWh:fi[شY~~ ul3&$@X9]u0AF揨`lcsNUfc<\x̩T\Q]33~1iKE^sTqO.C^,Ro!5]TV ƈ0T%o\$}ߝJHj}&<F|N".˝h_F*[V%/XC"shs0Z )!R"%[KXt8-JFS*mS9#7\z>)i)0nW>8a*ky:LyfdiI?_FIIX(#lIyL-5.5*PS(%Fܱ9>|X^_i !s!X sQ mbu0Ŧ[ȚK3wD[YbZ",[2#qWbUA=bhjfڨJK:f4mf!kc֣bKaBE1W3'(TPTh2IfiPs1::%#A><`nԛZkHEj-2ZkyEOF_ϟ3%p|}i "hS۾u \|2-r~#ۚɈ—q4777S9ZFg~ CaĢD#+f:X'۪)+%""?JfMU-`o]VBN3hs5&x9 #TC0&ЌxzaR'r| W;}KFĸS 'βdB~ K5w"MMݑc؈1j=ɐpm"XV!ynwGz%*xj2=o9!/%| AľDkEoRhyΪ$;k5ɺ1ɚ ꇐ)fVKXKH_3[ ( XmeY:o&8sJF2 Ig,a9ղ ;],^ji9e|:݈`-WrB3,8MlU [nn#BaULjWZCzˆ4I&!Ak"]]־BU,7\7:)Hfm;}=2S*7fѭy^3r(m9Mb}%Dh5&WR"ֵ͈:29M .tZY _Tɣ{H"{jm)֯F9D۴OKcL 9Lalnގޯ2ou@- ff_m)fv]UoXǏ{gQ@@KHkv3 %eW$Gdfj7W@3.g͆- -95;0 *\YSysҏ5kE딽͎4KUdLYȼ; f9Y JGNNp" Aj][3T[K2T]S0F-sR$.h=U5P+/N"|&h 54뎊fDxRMs)I2֜K8x"UҼDZ-U"@7[Ş/ _=:ZsUkbt:5JVH1+r/jΕv @b.&nsKͯh?9Gss-A=vDqggUɪ:5D7 UX![+FIܚ>tHH qU03\˫Q " 4S I$ƅFJ|kZ)1n^s`ySryk@B Qbh!v/OuT,'I2PE:OŒT Ѵ⊦g|uzjn׸8-Dn`I KSW_AwRQ%Sw,NR(UrM1<[Dv]j"8o dEwa1a$0`\co5$O!> p!DbDka捏f=RX--jY烻n1剶vrgׯ__@{#w3;MjU }El<4G;p#5B7_[c1ft *+"sӹjz5ke׬=C7PjȩX:i'fvMN؝GD~L@EDqȥ`!L_WX{PFjO[s`6a*47{ cE=eITt8EjwT޼ ˧"1u [0.*fvޖ^iBTD ̌ ٴUE#Ǔ|n-Qg <T;lP5șTĵGTY@9*=z:z"woЮX͠=h#-阍z7rru1Zkyyk+?Tl ȜT:3`8ţNIUrfZV? z[pg-#Ơ@cp3kf^iD1bm!UE%2IlP|bJU-9%8Tsc֧N|!6m˗bRD3I&WZkz#& gE.~qXj+9NM;lQcʎnO,y b& eׯq;׫;&䂤V m-=r"Q'wQ?4g둓v3t}'#~ʼn Y͝4cfF"螺9ߖ6 6fYASu񺹵zYyy~dRUw9 JMa;_[3U#nMN}TAF>eX7:k0nڐvm?CgzfL!k0o*Ȍ[UT\s Z>"<QD(Ѣff­f4h&fcOϝo$O &4d#Ľ.5&6Sg=_H u.sP-f_9}uˌeMX8e~o~q-_Tb)LGm&*K4U L5U%)"3Zأ]|:%12+f Hk~Kٮj 1.i^3 ^QGrɳ\-D*QfdXfM>twQ$ҍLvP]knfE]M5y3iqJG 8dpSܴ"ƹy][sy轻y_G/bz=?̈s3cցA}i+ @[dJr2CWM^;yKZT 46NƉPESoʸU9Ha=:$%9X0Z 4UfݲAD4gNRrr7~iPVkMpCUD;>};U+}.Vm佖NBkVY&5RQT?"Tl`߈wv<+py;iiIRd UktH>71(LS()C)|=L?Or{}Cfh cdo ^<)볱e֥"AM=Nܛ$27G(byU,jEx^Uun^ݬȔRbSBaLTgXW7U۠ε*01Hߤ!ҿ`3Gf6\EbAͬ&Yj#YZkxW}Klx@0`G.FD'sV7UQLl)XU)1Qu{90;Z7Stb=x 9)48Lr-)-YP0? Gd[c?QL,Q94SQpk$n@ʌ^9׷w"1qBm=$&j^r/i\ɒ'j$C,m ,#MVT{WyzkdFϣ&1=X+ %T6L?kBLFMl"cg2ܔM˥Hmj J۝.1E+Daѹ=Qngl|ahRVbn@DBKn.=XL 8eTN+g&?Dc.zss+UIHMjw}r퍌ij5"TM$rWƲ`2^HL8wNy[W9423/Ƞ|_cggF>CMk™ 1܉Q]$7g^ټUw߆~KDS }~nJ{u Gz g;9"1uٳ__M{)|́#W Uٹ0 ySKȌLjƌ][,K 3e?lf"Vr3]Z m)!:Pm0Uxd+7&x?0pԴC6m):* V_Xο AtT\F/kyEŧb- )4 P5$T').S͘4UCV$Έl"WH[{h"oiqq iݯjMdt9`ji?HB½uH~*__/l~~u\Kծ GoY|# ;ul!bsW?7fp*;Oإ^*?OCf}fRSҟɆ\'%Z5sH}`S!=QaAJL-Wg}Yͺ)wJԹ¹%Z;UQYeg81b 1.#"o&"L]6Lf#|1kR(**MF mGjDHooΔ]̺߯Kͬ2 z_pmPbsrҚjM&V5`"".XsMHZ d*@Nia% @2Lf>CBfDONί*Aܮ!Q{8s?s4WFDaI2^\S%/|CIU7d*$&uaRƠ'/o㗙# 7@/ S=ٱĴ}q:isIItWmݣKdͽ "B[ Α* sj5݄qʸ2C2U+b#q\wTs=ڊcLT[9P]4 fOНT5f'|6m Ptw1՟D~k2x樯?:fv^OxnyovCiv`WSH9@]UW}lF _h@ SWN]Hj;rn#S>XOr ^@)oۊsYqf;0f-5g1Sq̈́<2aM=av E0|GSpv]vV'rtHEZ+@;K3'8Mq(F/ )0Dns>yzFݝT0멦F2 f;=8W)Q1I<;w]+S#+`f;D@Ljz8=Bҵ׌2T؊gRj{ d:-3OPaVh [D'f@@額;(e4 tiضlQDlƙn_P*y}j/ =_n=9f*zcٮff&v_ g3nkĝl]Rbc4߾Y큆aǏ˴FWU([-[LGvS/fMcRգ!r-DD~h41$b<,ٿen+'>($GbVL_O[f0JiY;z 7[-m~Xp[yP\Õ@ YF=7,gV[6.;w6f'1hg7]3?P=!lux_\Euf|YbEv/&4a 6b3sEd!aWWf>=,A~ݞ{8m 'GE|g쀏LA$&ICVpuXdyBɎT1#\H^JJZMS {LX )ϲMʙ̵Lk;vڬ|mmJ*{fU+u7.Ec~DFsmXs:qپ?^?yAVOKHɼS<+<3O^aBdEjIn+RK @6uFkY rD[?(4A/g梖q1ΊCbѼ\%qxNvձJ>]@,J5lR[g=6ǀǔ;B*J6Izdk9[}mU*"2XN.&Ĥ _iPՈ%+n dU&f+M&y,%S~.ɌMq,hp5#SO̼u5v:_Z.澹[{D4s"ro&;FUTFp𤪭F*n}YR<#Œ%N$xiE\ӺU%$r.oz4X\zX'g"b$:}wMV$}]ϟ? o)vnԒFGzFyn.]³Qe_Տe>1vfjQ\5L5cӼy-3l""J ,[H_BkHdSN9}:mA/5X7KMu];#Rp]Wo&{Tye7yA e:5ؒWP[W >B)kW?}bSoy9^} #+bF1mI4T{fr`Sd{'h6YV2r&[-| dcM՝11hy(m6)7I6>6C愲ѪB/oSh$0yԖvno@c3OԪ&m9ļzKoa&FAt"%!X)GwTk{K3xwyvoVM4U3MO{kw5zݝ\uS3H:h}_Q^/T 12lq#fcl\ޏ^ e3_PuUw9?d!hqC3z^9+?뇹K䏯/IMII{u$$ByLiP=21bewIcCfCs߉%*Bg4prI 1e\; bL I.%KzTBZ#⮆ @\4!֜DSILdH EuC&KĖ*!93=J)A;#{`J}fTO_sòMN['n7B9{X2:a)kL\18%qβ2Y͐wuNLe i3ҚB"Ԙ˙6b4PT*5JYL 6~.͙.+@|nHSyZy rKs'VR:Mwko޸"Ll*9u`\#;P-npT ҋ A(OHB qѡQiY}ɸ20fM_rD]՛1FE<τwH#̬ kTC%즸MJV2]$ޠUgéd=(-f2L HSzVGbUQO,MqtoX\nįϊJԎ8Μ)5eέ I=[3JsZR$޺ 7P=ZC#!L՛[BYݖ$7i==o9[NsΈҹ8zԪ!A쳼>9IհM' OVk*89'  4N6g< laYz0L*{+%IIgݜ9؛{v2!m]Y'-d-T#VS60t侯br1J F/ܿfDyKUUu]G E@ş˵7k+_2ed 뼱FqG_>p}[:̪ o `>]eݓK5AEn!'CT*V_^-@m;RY3G|ygZj@(gzmfOĐ̈́%ݿt)oMP J~`Fpy*E8j蘏ھWn)~8ChK$rǭ\==V$Sa!f`7č=NMEd'{W]Buя}gjW+]x:ڠf:j ǡǂ/><;k1K1LD+er҆)"%Fv~d!ub,a"%9FV1҇ݕ |u# mJ(ُ<s4HHȞH+"E/GfZ~4Tw䞌 ,ʾ«XbsH1lgU,IPUWw{83Α| ks0_;a97|QB7?F$g8jQB RIuZ2BUbf#8fVdἧUjGeYlEak4jzIU̱WQ}ɖ;L0|Fzh%ZxU6-?=ȹ}Vb)Il],"JpZ\RsHƇʦBpY,5ZLJ|,15=7Z-4PmUp'?%2*˨a+ЕcyAe”CO2ds#f"{5sc@1HAHfV>Nl.3.ʄ>H[]A:lW ɍxӲ݀_o\"}Ѩ܃qos3>dM} hsjYJQ*s(v Co}dUQgs"ȕ 9Co&a&A&K2Y+g?K"Ȍ4lm(n"JQ\ںrB׼lpfhSxHўE$T|ʭɪq~D GM x6#R׋=ak?ĶlN)\8!94$a(":)= oxv2lN En:(#~0C ."Jn|z`d'{GXDz Vzq|N;dpw~$gM L_]ZoVKKxiF|Q@0NnQ c9CC òbv3ԧd!-UYFCžDRKv3FoBhѡR _M%96m12VEáLJw| ұTz9[__?t+{)=w2tdTs[]iPI{9S}ɑq8V|ө!Ӟ&S竬lnR W3Oʼn7/~ k! o)q%Cȼ#+ xăh S4CQ% >Ihf{/QT; @|U9*+5VeoF jr(eImiDj*D.ʱDȱNERX [Q{ )&D:˳fR*h{PDHXGe#!Q"Za1(I;,R<,Y5 ,MUX3=/gZupB&~cP)KV=;3YT3 8dD" ē,t@xG/Emw"\벂IUq&Tk3%!kKlN|wj^]s,6;@"r R%Ӈp9 H!oQձ,yfs},}Z>K^!iRɉjZ{o'k*zp [r.,dFvm7Y%)3C@E4ayWp-$\ |V#bW &z m52ݞ!LCJRiD4oXDV;-"_arb }yoywMŲMle9ܧK-X;Gricw[PGML ۪l"rVr\.wl5s݉_D֍Y1sD8A4p@`tSg4}:DQŠL+s`TQ/`Bћww'̈́bz.z%2*6!u!8M9 Rn!{i?BE.zdN.U.IW൶QΝJdHNTz-Kc!mHeywg48AXegߴZ3[H=ccnDcHܼj\<(WxL'dpls%Qhm~l}N_­]M:RL*iFFReqnFJV}$MEB!B[" Lgy{s;_9ګ@)*PqwiZ7)ᱶ\ow/ή\(̰4ӭe-qS,s =&:1)67C9 Ip=׋sZU7]Ձ_1|V&/-* Ͼ@N;|qQ(EhTeg<,(D4oei8 8` ۑw!;4& uVQ }z^4iuvTٰf涌P8F`/7|9L_̦t`z%/zׅF18~9-٪9i{9+!'vJ\ BPu9sjPUV;/1\Ǎ3*Z]ɧ Sdp 3QugGP[˜3K6^!5Bzk>*غ5:9`bBO 1e@nwi<0΅G g$y2);7q!f tb 5rkRnUb Of>g:,9Ƹ다쁫!zC y} GpMqЦAlsjpq*3~~|߿y 5{|ɸ* #i-! 2`v xۢJ*>kBU8t,89y ЧJXS0 Ƿ]q0-vhDL8t8 :L*9@c}Qazȯ_/!ܷTz-ueMێd@4QС`:d.ҠdA=D敆3a Rfs0\#KXVa57~sYECpk5bxz"Gt1"8[q "s,4"fͻ:9uZq8y8dOU f*W7뺾n7{bfi4 9d莯sPb_î2x,9]!`+OdDpypaT܏qBW$Uxt8{y$x+ep*THFEZt(#gr>~ c ~/cRh,?#mh ^K("cYiqfI#5pWEF(ġ*,D-hI /3\6*e2YBAf%im"z0DRO䧮HuaRg`"Љ>U1D2$X 첦n^d>,;9NՄt8OL>qGܕ¡)jhTD8>)!곰iBB3DLW܍p9ftLh\u\,~TOsFsJ0Jqy 2\GDT*E%yΑMP-~VWxșU A ٧ܖ%ZMX5cgW#LG0Ead!+ꀧD/lVEEWp3k&wX Yu]Id-ܒR<3 7eH䟨agH*4OkPDGBOa|-D16uc1ngi:Fh "n0'ivF[&ɷ9]yeFsՆ:gkAfxKV@Ȝ̏h=?bՏ.(zKu 9Ȑ9`jo5AKJ)^l}Z#5ȪQIz2 _}}ɻƬ k^iۏu#hx)ߎ'lXȥ, zr?VT$;v7-GD_K-m^LI#=Yi]gYWJ=}x+Sփ("iTw÷%ST5N-zyZv-zr:n.pРIph\2:@:҈f|gcC4-$|>6V%5eݬFQ Lٺ0ZDUx<\WD*X.ƪIkѫڦ8(1nږ$yrXoIp}>ozbmG=aI1ðRyx"[ڊTceWĤJΥ*27R>NxRh!C+(>y $졟qA`/g=*E (*jXEjp2"c;{vI?ꨢgŶxMq3ةR䆖!Qܡ} B0,*?a)[1P4E=}2Lt]<tBd ,Ƞ8NX8gv8!)`ect6B&F(/ 7O *GX]$S^P1wapsa! -"BӅ>"Di67k NZRM oYo!0e ]z!L%ra A}T XPܢBvo|wС'"Q^ﯯJመsǑT2H +evUWɹSNAx{݆NJY:RA:}kuJ㘷\ ggm~ZO4cts"ToQ\9o2p M*e$Ckشěۈj?;/[xH;9(O\} eӂ˒yuW)CZowqʻL{5Ĵ`bщ_OҍpCYǽ\kQي39+wTѮ9sޗ/%Y͠@W'O0{`d"ia8>fF[S7BDht(VWQ=B;V[7wYwi.b[NSo+9ՌBC`?U( Ç*}o9J[`{np6)'0$$fsÎ-qؾl+9tUMҊBjZ]HScy/vgrb/za@&>cjg=sZ="M$f5l- ʦ$"{H]-&뾇ߝ>qV-v*=(ȝ2Yga6x5i-"]*"ylyvk+PoI%KN3]Kk}__}ަO&E2:aqkLzrus#045bt-hwOV8@?:?y 1]Y^Ef}ARb(VﰚM\l-ICg 0*h1~DzM`Ĝs*ʛfk'jtdݭnOTQ0炂#?@}uN!<JceAUոU,9[D)| TlIu߉kQ){]Nr$tn;T:xe0lTVub5flYFy;2XZDf!*eLN8|{P'&6!L'Kp3Aຮ1~zi:.U>wShvgJSUt {͢i$r?U~*ơ'En撒YLw4x51fӾkƐGVȌz5))$9dLHAx.״yq}Ĝ1Y1݇[n#YUp 6,ﯯc>TӁxy~MZ_J)(SC1Gzٞʮ\,˗9R^gsQP%~_q[ x_9 9gCW7_ǩfq+c׼rPw[:A"f΃˾L[Q\ 1Tg =߯WښGe,^f7>ߢAl; *ACA@شM6u_=m(4#&gE|0sӨ"qr^SFxE~1—B^}ڕA]8<q9mCzQ]DKRQ-dޑc|ٜF\F+1*g3=RQ9%1jQ3 ‘SPEkӔ̈́A##|ؔqbٌ #j?$M*EV.ܴ!}~CǒVl8R7G`@pȱ3 ŸY. `+cxMBa=pN&{, GN"v%: 8~Ms a kxZ;Kx!rD#Ja#3AE(dpp[DI.+q|H@*/@2ƒPq"mXɗL ^iqDDHѽde}C]bM[){@X 9JZ+Q6}0  LkG8NtH2+&E,K̄,17dV { )17ͬ}Pj]TRЕ#ф՚z]8>wvL.**IeGoT8w{Ӛ1DN7O$Ɏ˱N(*cplxRv5ۦd$9ZGpmEց92̝ UO];D\c l7=꨷XG--_]0|돛1}R(ڈzH:O3;nnbgj~O -PQQEDFGO_Pc??4qM[_'DtB.lծfTNnw:0,,XB"~zSV`j5:K۽4awz"2j|Uz-܋$aٮӲpΤZz قʳrpҙW*39 ٵ|7 3#j`0  :{tQB~iuCW>OcSo))nɁD13a$CG(r>CozTd@^ET؈ PM%iZƗ"ݩ +8d7u 7 |Qs w ՠUPVBZ`zu.[I٦) w>^V'R $KgL?;PEcW{J|[ r\ZB)ceऴ千GIsI 膳JJ.!2ׯ:q}gic{.Fu×8)'ɖW[Z)c 혚;1^,P| 7KeR_0?YfVOkIHq׏G8sMS-yOLC5Ӭ( ?0̮ Үr6ܝԾul~ĜPeYf;P5[y"}G'===o Ҵ`os:D]282}q ?JGʂ%V,ȼ"Cd6iV/vYVXM eݛS>F3SV"FƱ/,eppOd~8Mԅǘ99GؤU4Q9`:?WS\pSJ=j?~HҦgbVDfTga#@i#ox؅741NCs꼎/+(P;29iQό2Z = :(0˕ pɰ@& (Ԓ:i?1BC\Nwyѕ%II,| $ޥ=hYJ0#bgH w[QgZDb^ 7Gջ~ÚIC=V{MEQ {=ƵFu[ELq quY!tŻSoM?+c"O'\mvYd*)J%TO"3:~B-en hΉsg3X/jr+դk{[1޲gxOMqWNugE)XQjLS$.)SdN6C^>a\R*[R橒N~Nƪ*׶\ ޜ7WXPr}K蹞TnnrpPj3fOX͞&-caQu +kDl'hW)#C3 t?@)(ŀ7jp94foX7;YpGkSUŔ &3Blsߗ][f(]0V9@DX @; OwBdw8:Q2\̹③7AηЍAL^~`d$.s^!0ӷCGL:`tRi)"6j'~;:/'Tx>ҽ%"Y[+KD%7m\ ٝst=뀒^WKPͱٲ*aQ"E .jv_0UU+Ӹ8@8 iےuզ4#pwl0 w%d,X~.mwhV$֔1h6-MjC+lL q~SH1Ne?~[PLWΥ{^@M|ssz~fCu6J!4[FoǞzy3! ~Aga;U!nM!0F*H~uMaM p'`BDfJ{bo9Cd/AM?O,j% 9c,뺴yӯj6˰V@҂Ȭ:{ɲqٱ2VGzBD\HR+`Z Xz(*-:l XX'lږCq7Hљʅ 19mX%CgS4Aj~,W^(mL@̃{awDoQ)AE1аWTL|y_z8o빞w(Rzmuup,hA hCz[x YZ|+gnec$&xy.!ZHj-!#1/7k ;o8!CABs29Yۥ5;,z᯿p$ "DITHYf0k1Daf.qscdrb 2ql~}}]gI6C{XZ8|CΈw|gP_s U2eQ1{~}#A&rDxIVzä-/-RԶC:Q/IY3u,qw)Uw0H7pe.$I#J_3M{ lBm2b$xG˄2H*ܔOUTy޹qȈ=Ȼfe8Ih >MyʦGnJYYCLso!ne9#r$7Y̜Bpyv=\Dc,G %f¿jTMmL1=آ֪wdՔeŭki=ɛ"jdĕuֳ]W-&0}fkR=|\VgVԍMB( Ȼ0礬٨w[My}.W69"vr~=}j.!ሄO1_P~4d lN3vWm{ ۗKomo=yf\5oeeS%OU~4+ְ t3ɈFJI?afK@nII~#n F#SEop1`9";OAaU7#` 쭶*ȝ9h E-ķQ\IZmJGiNߕc@jCcJ~S}c 5N}j^[UZΘ=7HMopؼU)2  D̄G1YMNW~ o-@2QgWΌ8f bx/jI7#x1`}ψ8`Q})K䞢ݒFتj.ַ2Ô.LVEHa)fH2fe ǒW) 3OuC ZwghiSlt!} 8%]cu0X9Ş{."I [5 _Ɂ ,a ؤۤ D^<,9kAIlNYV3 =}:p# 2$yb5(0+8!*%ma7SjEC.^\_ӅՖryگ'vdsWcLZ{` tCI#3)EU0[c8?-nYE&ȄMc$%1|\wYm(Ņ |db[YE]cpҴpw (7t-(~07cSɋ=%U*){Z9[V׮ pT2` 0Ĭ,irnB! {C4S#Sh_\ba=8#?؜CB K6"eԎxgvs)em.>;B8YGPP2luj'*SO\!-+*FUP $7;Dw:,_ G?*|6 G[2ݗ7YޤRԶE bD<"Y2:͗oJΰFlJI.^3mo!hZ풲S_A"Eq-:E3 1ݢ<)^-J>S=wAӻ"Cs둜.Վe;~ ]cm_y-kkѻcKUp 'qOfݬ;hǃ7Ǘٍ d%VȰp\9R"z]ugv]-9Lp(~dаv?7)G\ 2>έVDVfjGd^o}8"՚>Ƴ4D|B֙iڵ&CTQf5U0Pn KGXfnu^Dd0c5s(%ݪ,9RT&= "J5RDbZV]?cை؍ڂpg,vŇUuK$7RmXK{D {ՔT|A9)-ǃt )O$5 V P,ݹ ՌvH,fvjF:iݞ6YW:0k#yj>t<ϐ1PE Ì}1B@PH M Ha'jxxe td6pyhg/ӱU=G~q2t8xX1FDsɱȹ~u?l@eI*At&\gT.~ZVP?{ ґ&&PP]buMr?XLpdO }g^]3OZ[ՠ} J#[CƲuhO1m+g9.7ԃD]ru3g|y(\,w㚀}lꙅ2bWa{Fk7E FRf}fRfM 2g|2ɼJ r!9e#J2Oj$ \`n$ Rpn 9o߲|]d f1\[ pQ*u6MF(,2 %T%b^OѳT`'kwI Xzdoc@0ʱM`93 3F=#uVa,oIS^WHէ2"a-ir N wndt0j}cae._W"k+!wF_=߈R=|suwM2$H3LS׼Ŭ_e@VrD(nyK[<iK% }ZdzϿ/4鱪80=Lcֱsʚtӷ͸oADib9ǀݷ8D*%rYIۆYgVDncJܔ=yˡ:RVWUK3<~.2<xvKm Zљkϼ7XS:ֈ1<GHC#t{>Ï3^>CN }RpIa. M]lLqnT\^-_CF& DHtLss9Ӫ3RuϯW }8P3Lb^|RD5\#M.c_AznH3ƜZ H,$D (``'&3眑v>"׿lqFG$-@|)ׄ񜗩qOH,۠#&:{q 8~ǜDcu>D"1jx<@@+\z 10c|mi<)_ߏzqh{oVyDf\<s>cθy&f8PNq3X%V<5cyk q|}}c<kNtcafэ+氣b}֣ughkNf3( w&ըd&L&K>^]%}[&P<[$SBԭ^ւJpnc#"l5RꮪCElAlJ|xaلpbZB7m ww)dKyk^D2N 32E8Ńq/9nnuȾ}c!]U8V0 tԺIhaf/s׸q bDV83YfpqD"=U,! t.)RD93Iݽe33akGhMȶv꟭o2"P7KWzG2 3Nv ]s⯶ʲi"vt̲ɂm5@B!:̵06^>:QM:X$EW *ø溾5aA_iS*Zr}DJ'd)ܷHi^ [˱"o%$֪\-(+=]4 `jR[+)m{!fmzp5Uc(rp2ȄGAۨTdlVFv@"Sd(frn*,\DYҒ.ܴLĽ[=ґ U"'5-38\$T*2jR1GXVlI6 m"%tPb~ MX:˳Lg/466ݘ`jҢi"- ,0cZa8 c3ʚ紀*V7DXLޱobTb.2/N} Bt$p+ $$y]Q- +Bݭ,i0}*L2 ͧxKZu1'e[rD!K\S9e}g4 ޒH1l#6Ƙ32cHMeGOD>1}B%S$@z|>wՅ Vu#Ct{Pf3h4ڃ%tt7{MCpLPИ9s1D4f ?sڀJ)eKL2ڵ]Zȓ?PoePi9R>[5@!gޮUkJ &"r'Mn9\k%l>.\'z!7eoa,>?b]/HJ[n˃μ6lw27_gIgo;ȣ$;eR0ÉXW#uʴJS#ZbƧe@Zo6kluXLh7U5`S;\M*mA/;Frٙ͜ےc'7hq#@ֶV^֏2{DV* ׫̰S?ULv6ARitV RY  ˵NA5g9(fSHFc\ƋDCDrD$H-ͳeWRh8Ll9uK`ԊjCj}Z%tb[ꭐO%&D݄٩-$ L*rt!?, '++StHlNZ-LBzHÞH7^j[C)~Σ~^Qss/lULLxR&֍wa!cUa-\M1FB"B %N? w@~ȫ_^iTUF LK4'5r]$OeG ^3_"c׆r\Qa}j|Yf4)ZFXwavDsEFUC*+]&-b`V7>\[&;[&1Sb.şL+Bf[r򺮖b!{ӹPe^6a҇[Cwuewc9vZVP@R?i# V^Rjͳe6 5T kF~{Zmȧ}ù+eXdV{p/WdVװ "QXnQQ#;E7M.U&0,,QS> /`TcyUn'%mR{mkK\uwpS%4L&NYDrY?,{v?8J*#k^hkp+]%g1EWWca*QLIb SIe,="&Cfy薞֒a,e+P曘sqY&ؓ@@>tY굲f!enF KD| q77HW3ُُd]UH4 ]ޣsy=lIJU`++g"TzC|P-apu8r}U0:uJ8>],Pymj0RecD\MdrsASղ1 6lq"-'dM6}42TwwŜkYm}߃3vF1rsƠjjy1y&̎q[ޜmW RsutDnQlr ny=cͪL˥%oidBr]h#m22`.[]VA:?[+b U/N SQ9԰ T,$W~EsD ׽w%7`?2T(ߒ=zCye$+` 'kP&:RRbH@3.zT瘈P@Q$@"Qmfden%nf<&7,]S 9~ |W ~EΛ[9|PKBV0/@PdR=T r!uG)f}5pNq=X< mDJXU;|04# 7b5ʫE==ЈDnM^ZUך(*?GIH07r" bYA"_̜*wP&mnf΋gmusz2ݝC*x~y1S5"v90C4|8u?+8@1~2UapS4q j>2tgDƁ&3a|Sh|iTLbQˑP-P;/^3T%1ϯ8?3Qd)}P7!HсTH5Ь ڀࢆ+kvȫKP*l^D/z)(e !喔UtAQud.iݲ.$j5u*jI@u+a$kAzEabR"953/KOC9U>zwg{oF5Rq*C!A؊[' IK.Y-Ĕ AS%EVxQ>/P'kSQJ~т!rȔQWrp rHFӱD*hEC)¯T ).T\5}@ӡ,8Z(:Y3΂sG8 fTWBB'z3.H&e|@t-C\+۰#JI2LqKCu93dY3PyVfRBcS+t'J^=u6LLRL*~X3qZ5nyS$quwEH d8NcJEj3sy daTDuH,TU?ѥ}sd vG)-"̪;zqu,⧐'B *e-|FF2;t*W.AF4La9z6ܟȰ21gIp8@%\/#jC ֽA-WjSkn u$"]F9R\-|mCA8iQ l㌕=D=DrVշtH"Zq=QURӫB[ӢJ,pYinm1 ~ԕb_?lf&K%~0(Zn=&>3f$% woE.m`&EZ٬j{v+lz<~y;½IPݥE,§T>fp>R!$t5%"i3[-1LyPbU\ʆٸ): rMv9v Li(.AXY1 ;,*c]skO#އSKNI^/UN[cQ\M{>w.FRh,(_y@Hi籦ʑ/]4pp)&)X7n;GR+cImw`Ԣ# -{&d]Ul(RRC/|z9WDVyw@rC,&Sq>*֗(2!P ظ9u槲QMDRPݾн`GX'@TRksxDI0^$" / ɡº됺o)*"qi1猊DFG h{h#@Rv'[Y{ ̘`JVJ'cA\,E(êDĆ֬~aXZCo|<o' AYw7~h=ifG *2T]‰Ck "~~Y^qGF~CJ.4dIb۝7 ,*!]}\G[jN-^"uEкwՈbS"-aNH2 פ9W?m'Y6 "q;B;}UiboܿBPRDi>'L6Avѻk3Z4$F`X[:*(U3~>O߷Zzcw[d  Kp܏1fCG}ZU U|ȪըdJvRqtbƼX~!sִum[߂zowc=43$16{2V(b-"}=K>~G*Tkxs w&-]<{5(^1+M+ÊBb ~Nn?Ro|=?G[̪Y2FwbX{uI#.7{Za%M)p@NX4 HpT&ur -8Sd&b=mVu/]{7ު7(4U/1:4 ~,sQ}~o7VREFjz4G=8\uN[5c׌Tvw+} g*R[y;%(󯷡=aEIQ *Û04eAEL,5 & miA1\ԕʭ6hKUx @}CTfDg>S ֿeWFz<89ƈY%uy] lpbrqW·1a4soft$I=&c*wI9($#!ZiV{nS&ߜ.cdȺUG +ffZB]G7'i&M\,+G1]M*QItƳ{5#WUc))J}䯂lI1çUW;Xµ혩=zcw齪y9 ipFץ]$RW:>qhPQ5b.4]Oqjpwq>v\u5v:}eXZ>S]OF~X_,sNދHyMtPZQ0̟k!]Cؚۙ~tFo뻎NƸW1E3dgΎT_mʽzUМd~ͨ6S_En،SR.JxEԷxC԰[ADw^^_܀b{E\.ЭfCy!,|Vq b?#t!ʀ&4r>=4ZHu Q|nDӚSI!g)c"rAT۝[jEZcfh "ɱ. K;UFjV@C-`majFR`nPyOW^ l O3Q{ĝ_??1E5{Efć}u]1BܤMܾe}XG1a#2QP͘9^A}Hq$ V}U.x#D21H1 ~8se;^_'1ucDĔfNgyB5j߳*ff(v]Lwu6LWd \bIgDq1V2k6}`lv*w.֡`D"Ϟzs;\i9<jRNKDBT凤ZfByegy>>5`u"P{$"'G (vT2n 4ʦ^*MT1<cL5Ȭ_vIN )25+10tEj^qf:ׯ_Gyj# u"uQ\HpCMD>˘4Ĝ" 3!ؤo ]TT8ȒUU?RZ7Ms63֋[GL ם,%qrX ߕpi+[ pIX#9ѬA Due8l"ͻ$Ї>ϸh7.G(?iVdWYx>ƭ713jyFb ?1 J;VchfAՔ66%Ԡ HwpBcҒf!4Zn*)+?Ls^ v K2! o\IMZ D@կ wnOV~ GTXh[}ᵆ䌥"~ަI{]{akXYǠ)*siBTgץ*3ְ35v̙\4"Dy#aνab0k Vz ej@.h߭ 0 "Nx(Å"לCu9o<9_QV*uJ qT,bʴT:pE3 D\kHTBM2%Q`45QMd9Cӝcٓrؗsf9#<疊㘱!}[gβjrZc8rD+N% ,cZK03%cFyKD[^ӒL15 $BMpc@oz/^ߴ3m2 *$x U5YVYP8ǑeDr1"h1vjQiNR￿UtLsHx '77v@C|<"AktN!K/$u!R1VqP3h#OՇDp2\aqjrպiWDN׳*jv12sͺ L KryBɜ33N̫FuYfu]u}=)FHX}Fwv ;L|I(HB+hcD!&CURr t^G_5]Y9=B3ӈ)#ʗ9Ԕ4Ƈ:aVZUd3t8F(2Q@ KH9;]נȐbkjA]Pw1 [\ʔR{fmDݧ̷Y7Ng\3@LyŵmEQj `ԣdFbv|(D]ibCup#0IȘR HFCmTbwDgH/ .r{>#gK0<*vH&%oruթ KDZ'@VuT┤HAKeƙA, H+u~R)]a0̔ s<݇oq1;SR v,l ̘8ƠfsMx<~q?!j {=Q}q|fDA\xu/|7YOvsUJK6;R7F٢J8}dYUo~hrfy5S%`v+6qVr>VpaecGVƏ9> Z 4*[wV8yi-1. qNͣf&dߑ+4^tAw+Rm491f8 y [?kP,f6z*w.-,[5+tS~s\?q^E[15%[p)hefIsFcwL9aR!dV@:L3ܕMGͰ5.UO5^/v>wfȔ<_ OptGܛ-na=Y1+t|HE$M<8|A#' 3j6UeZ(9 k$] 0[MT~ ^ػ+"_*BY:ݏ,Ux1{23s) TԪF1n2<" U9+S@8O13s^Y)FA̔$Mp $Xlzdsf5VH;鞓v&15*{D0U^} ^^tVZ݃$((Tr.+eu ̖[)"y#gȍq׭4 ~)^t~8r,rENUv"Ӯ2M˖Ǜv[[{t!X$ToU;JB81YZHL 1$jj6!*:k~݅ PL$f5ӔP1Tl2Bw?J{AH3{-UfԄ-u;U`ٱ?&' &[pQrAȗ=dLH/6[X)44RUӨvQWe3Œc̈́9 > Sf(ѭ4*ڠIFBI(Z4svՖun$m*’`[FBIE۰Z22b%-[: U9_8;^/wDZWN0@Q;fw\JɌq ʐgu2!g2r3F7mݵ Eajy18-s C=yv hM{0xTWi%8& bk;& 2&%:PRHb* j]mC "<<2!@>ZTE r NFBG~+˽xf6qUI-___mBJne|x|yNtqj̜1kbslT#|Y^-6)]Mҳy]?"z}okoGkyERU\>Tp19{>o9+]ϦQS?s̕Tn\yL6ɯzDn$3unM5&43#.λ9dekmAV`Usj]Wr[HIV :1Jު[`#et;9ֻ,#; nl:vyt(:Y<@YER5z?g\S#ӎc3V22hc3B".1([.Xz;ڔJ_gC Q7{5D56=y !La5RH~CsX 8T_[f9'K]Wj 3833j -)pVOD VgɰlҺhkD9+yOP5ZYVTպXmjXqԈl]}􏺭u1kJF#1,#\ݕ d-؛ <1眓9z*sކpq1i.!P%AmL.& tXα.{+ #y]_+߲ta&s ʼ1kA,ew疾$x.YxljH.+5i >!? ??8"08D> ?N L`yc?Yb=)!9dKA5Uay)LݒST??W\_ ߲n^v\CiXif5KUKdp9$rƋxysV> ^ϯYaD@f5^ȃ5'B=^b/L:buEζc`&Kw1Fj \XGJ́TB/i"tGS~_}iNwƸm a͹V)Ua )dK̩CR3wl3&mP[?\ung5Ԫ/HB#hmM~>MfefGsx9z&/W S5B*5 &;Ŭ4GF !xm l_<1L}_43DS**5:)OG6pSMܙ&O}7|O7\4[?Ny[Cbvi=,-8SfhatVڈ!xZ+j!ŌJbRETf]qw?2^"]lH\Vqia֯w7Lj@%yqDG"Qvͫ{p8ϧql,:l9q"0"C+%/P.u߅+VAj`1F)~2Y2&%oZ`w作zI-/VZ5pBbNzE(ddjknWF>/4[S N6B;UgYZB ͹roeߋңxn}`%oE[e]{U2t6jnqk)*8.:VCHT둄@RAjFO!j&~U)K^|>u~|)-;-QZskS0Ps# dMFi#S`ZK#h-!KE͡H05ΖZfXA& Vk(:Ua#DSh+y|$ 4\\geTf_5y[e5 C6&g]UK{ K{)XndH#:WւBR@&:](G{0N<"buyC$N=kfRI|H=1N>T ǑSjs Qr" Dp])7/NR$/u; 8 -y] L2q(-{cG$fԲmx)鮐0%9ϑfx^q$acKpy.[K+p2&bkduw8q9Y#l.|T1yjb!xgi8w Cͪl/xCUW:~?d:Gh!p.X.Onjnn 7λՆN:ArOJ(:$- "yLo言)F|ֵŻTaWlXD0sv\~w9=.H:3}{7jz>E %XE-61xWz -f¥Q(afgHN5iה0E]."q ] էpK'|j]7H=W%]zqԗdo& U-sd,7<] ż7$E 7/t֨!W @(Jwws 1Ĕ x$SHyKЭO*ĦkpRٚd<} vp___Wq|AA|iNokJuY9)AV ŵ8aAlFAO-@kUSza,Ej+MgFY]_*FA}"02)mKqte۴%KA2*Yp@QM3AHĺI{IDP5ew\kCvRa^P^,a-xJ]GT0BuTNZlTRE GXC,֪zHE2sYb wׯ{cjRJCi+043R_2X8qa=W~f֤ȷT"]K)K$j!3G) 9JFF"\2ݗ13ԻjD[ }}+y3n΃Yأ˩VVR 9OeӜ( J¢20bk 84z)smb0I)"b Їx?5>*nM!a8th/h`7uުOɿ6l>ON7}U?%Pq 3:TItBbI/-ut8" 3#j["Uy.;xxU$2JI za@r }Չj`X!8mptkQa^I3/TCowhި^tGK,$nLS^ ʔM>cdΠar^IS}W܆M+۴Vp>q+:5mf ϯ/2{.N'eradB0$@KȔH)'XJ %$g$ټ^RR[1@ sMIR^Aح[!.Ÿ:B[ d׫<1~YV^[zY}&翦eѪ"/E2 W(X("VFw6?_ *菙\oY)NB(t ]E^VGZ>p_ ?_Ar?4bǜx>E^X(v t_%4!"M,ҁU#ʬj&&p& x'b X!*n~K@Vo=vKGߝY@n]ϒwy͡f.[᛭Ө؞ʒ2y<*#n͖QǪ/Y=|T!}47˴Bs3?f$E)6ex'XXAQ}=5!Dz6#ƑUVKX]1f_#lkGŨ;Qm"mߍm \MbiL뵮ʬzOz ,.Q}ûLV:E^Q,~6_HJ&xW[ kmVQP!̗h/]8}H[+T䫉dT;@+߃>LI$ČW3z/Ti'" ҃Z '5wղn9w[X̶+6(dFb)3eLY"'Cᔹ"mW Ħ$0q"ZApQ︁7%(s۵_+ʫX4J `;); jbj//Rn PF4|rT>:t3顼ꝵ8{ymeȜL4UcJ*GU!vcD6kIcJżyƜ?~1,JhJ}ܡڑEq304X-="IR1Li{όlCUԿj*zSVwN$'88IlN3o9׾4hǹ(%dJQ5vK+$#pmHEDF٢DtG0H֌x3!,Uf d' eM~8j9V:E/]jgnjHw.u{.kE_%!Q:C\џܑWwrPj-3Kl?  Hf jbl~pnYSs33UXfwgX^GoxQ:gi+hmדL89 $ʤ^FiDF8@.W̢HE?,'k* Bz,moB‚9'!,Hv|fL[nyC=VGD2ۍ2#) }3ݯS;ETQ;YH(JYk@ YQ/ff1藹/_`-/n~W D6-D)@)!Ѳkj b4\;ѕu@o*F7UubHK+Su<-v*T̚!g;T'ɫ4ɅlԮ\h LB,a{־,"ase#Bi6Ɋ("}hGqR 7; 6.R KK6 _9O7|<8D4S&[$,Ż8]E#ǐj*Y[ۦZVbݩcsΈz^sqPUm$VSS)bT#8Vs+ .sh;|1ge~Vg4"\sr/֓(6TV\<\Yׂ t-N>mõ/E㖍~Z1t*z[]"v-n_<~)1V̢0oܜݨ&(T)h'}Sy̻rYMfYwUq#R6q%eV pzkoҮr^-:>dʎ)#GRjr=\y (*vB(#KڑoA |":QTޗ"e="T:`y%Zr6,I:<)ʫ[B`{lKZY: gs$>BAh1T/QKw3]ք_^{}C8E/t,I!WQ)L@"B#E:K"iX:qrZ0A"D,$NkSS'·eb(y/ƶ>r3+AN E,;A8(1- _Ī{Vا$Rs{^ũGc @ͷ͙qT "7PB%'bysVlWZ.fYs"#m<%7Ҽ=1 !i0b@8O|8Q{ٙiHMo"^3 ٧ |>ty6'T. iGQcP8Zv*9C;HpIdD-| w2Hy΀$U3 ta_A1[++3ifffozYl:Cp̒A I?c4<KQDt[ _\C)I CFF"AqQ>@t1UţFp (\D$"-1D|AZ8d'ep~Hj>Q:UN>O,KTaaEDLXc$(1\^˺7(#9+ViAMd$N堒%TLX17"S5) 0_UyFU}JW. :c&*&@ ,_2BmvNxQz v*))YcYJ>G,CKAe\! e,2x|">Bˆ KIL'XPpH AdoP NIL`"$K QrШ 峦ҡ( r4T 8B*ˀ̕r$UȚL$I N?虓G2(^>&Ȋ%b=ȄŬ6۴JL R+hdnhͷN 2sS4=lO+@ׯ_D^6j4,ꠗ|ڇuZaOmx,X6ᣢ Yg$fMkn'!IL;zZQ2qhUHWA$EϠH2ExMT6זX o=]*FWQ\J `qwMP:Qda[mZ~MtL_?يׂ4#Qݽ~p*tEp2gK.t)3bJ"Ff+ẓ0aed=Hd=Z{}W:=%m]kH4#ZA#"؃ʔS J@_{AOjA1%3)dUUFN[!~s,foOFDE ՓCh֖zˀd߅5%\ƙ*})Zu`ǓUEC0]mww-`풻n+Ft@XF'jk[m%Dn⋅ r?[~6n ˔ޅ&CEl$DQϪ7yly]#3\›p[ׯ_5L"Q!abҥLXjkfyY-jǡo6HR/]~_v]ulĶy(Z+j 8cOr3Ryuzl+0|{YYI1)|Ƀ6}|) ɜ\mu[yi(-)=) F[ 0-ݫ.I\ I NZMiU嗕JQ=m 'J}0ʍB8&RQDnPu\23yd2Q"ѣ>*jNl.$\aHJX$3}zس\@%s\_drŅGP+BWvɻ=o ډ:CdWW,+U 5zB*GDrg?΁np5wέ˼T T%noYZOsM82;m Hsn88С4\F޴8IAncy].eqBFp2z#L,:&Eސd2wZ90B |8# (Pz|\3@I+,m:Ke/B,`̹LY`u-H5ѪKy=Dvr$G3̎1Jw)Ne(|I=)[%;[p@c\Ktmd6Y~cu9UpD4#~<޶=z?v4`+OALqFe9qS^CǏ"SvovP_Yy`*!{ŽcDq4߰`] EL4Taތwg lUbЩJ}gƌ-~iV~ӆVm UCߩQ]M;?r  p Wɏ''(8+b!F[G#Ո#"ʨ ⺯i7:k`|\)dGhFpe!d ʖḒKIKTGzX K~vIU(jn2+0('1C${RQt"=)DTv &f F-q̴&,?ʡN!oHedYN?C9ݝ*n{(V-+r:O3{A[| 3'}yKH){HzXjzW޳դH k<ϡ DF<$2sxeJRqFy-yZt_$-1IW}+bVD/[:ɠr˰1TS $jaQ f.8-( /ngA;a<Ӛ֐^D؋Ҳ}Q$ar' r<|:^ W4^;%ڡ"YlNU5wJ"t&Ud`hڬQ[OY &#@BC(YU=`E\[&*s1x~:ox7 8O}w2ʽ\1Ϸ{є|:cVZW&Q zOLcڥMCؚQ wH8:^I',Eҿ`L[lc'px,3 I\嬻q K7'j?4yu ˷6:QU[UMv\Mh=•YԶP;xcu  s\K̬ŏ0bLj޻@'.knbݧ3܆K%7G0m.ޢś>aP|1Pwgd1!f-}UWy)%-f_aexɾD!9!%0cN;>2Wc"Lq( aoQNJy~yNfaSL'0 C`n:N 'I'cA$y+D–9Oy<LnPIQFqibQ1(2ͳᑢDl<z'Nz#LI`4"R> <}Nǯ'hN@p7K2y8`aé̬xN`<6H-=f39l&DM*i #><_8f+S#YG5 ơՓJTS&^5ǡD$zwQʒ#￾<$s?_)"$<>V]@LQҺQxcU?!Sׯ?*Oy@"ݙ*ﰙ*98O?6WU"&G:"~}笂@{3s w+Nx!Mx>fB"~_!*!3#,DphƤ(F7?d3"~?yFUTWBTwOH"-CD,%bVJB fUg8@BaTBh+It \eZr0vk_a*ؓL(%%wdgΌ @z-\n!fN笫f ( 6j ˋm]fu# &s8ʫ "ƅ*٬K#"٪(343%q*,q"sLas_~^/%b)/3T DsB}H갭'eqd#k#Vx??Ps?"BL>dtr<UhV,BV*Ji}bVu:ZIfsǂZkͪb`(ܲ\QEhqTBq$dM WK|5lGM0|K~#Sw_2;E!YƍDl]6K?Ʊ6yB$/?d/:t~N1W322Ё*Q5䂻10QO XHh5UZ y;Kͳy4Hlfmbtj/ ?i/a񌯯UJڊcgr`*[d%9)__`dTygxg_\PABu\Wx`+"j}F'>/`͌:lhdUfG&&*J*^vM g]-nq%Tज़mdժ$ ZnJ ff> *0 (ebR̫e9̊/jaU- uߴF:VM{?n51#lq,ޚA%dfۨV-#%l-ulxSr(I@ P&&2-7V7`VW-`ep̘$Y>o3OM'ڻ fp,Q}<ݭGJ!LD=EU@T八ďМjf~8X/q-տoU"w`DQ#o--*{K>~ߘ9z>eFeYxImf&VW̖;9Ś ~pO諞S'GЕR"(脁*?B&DT.8_j-9IYڂB7wnn&]2L0@Bz]k Chg"X[y"1p;U:8gpʮ!$Nз@FcBdY׶,zSrUeߩUmnz($=.˞ޤ-Tݬ^t`UN^W'"pX+8yod߯ߢh($Ek+ pPOJrp:% Qt D o]MlN[,k rMCH^RdR*ln-9݇j.~;"RD]En M̀0`#I7RI=[fv>ђ4'f8"Ⱥ%qQUt",%WPUh"ѡ~Vcw|$y'ߥ )o6CIT:}$>u:!43`NAVPq;zWoӁ;n wnnX7Fw"S1UtH2 DAŭvq"9/?SM6ψIn+`ѬMkQ~&e&i~n`ѶK@ݵH%JANNҲĈюOM[FL TNA)y+\%z?L[ֽϿXEI ^Q'\{Mp $6WQWRodӥR" 1d]g#"##[vĎ gH˺Bd|l*"dHRTy""sv]~~Ϯ2yzPBzc =w}fGPaRS(vA4@ȐClB秛J;=":i*Bu&MqU⭴k\kXHϟ;ɜY$YEq{bY>M %\U+,B|HȾY+:_/,WC2=K9J@HpBB:`LbfVyuQQ}vmWÆ@Ȇڼ}6$bGI.$ JY|1ZjPw^b9E(wV~j˴)ҫ~ g.3f* )ަafu<hYhӗ[_P)ہ7Œɂ2V1z&3l֫X \dot7te[HDqyldžTP <u9Ks1Ld2%)&+J8ӓ DWPV!E$I;%vSn U  Oy+Z'L/V`h8:pi-ʦi8dqv*K҃c 5KQQfJ$&&fɎJs0uAӉ 1_5(V s*'D% S$£o5t'TؗHPR^ZzpUNz˂ch-25.k ϹIse]ܖe33uqpwo6Պ~Y@{\$aRjHyd5]mWl" R[l%DQ8.bУ զis^U'ql %_։.DlVvCgcgCE& ެ!VBY fUI.J!LDlP†v>hYuD^a&=*- ur7)"((9CDYeQ|\cRJvfnw҄s*cčUo=!L*]?י% e}3+>a9/q"rVVU7ELupaLnsg~P.T![mǎ¬+>ưCvo'Bˈ+pUz9ʬE{׳* nEbzQYrH #)[RօFɄ"f t@I@ҳ 9ܯeѓёnEAzP rj[nc.Nڌ]' ;}b66Gz'O76Hm-beڻQ3_(YX3C'UYww#f7EfF\ny1gCo[^߼LsW:2(X$=QXfI*!3cN/KѰ!.7Gyfcq&_uqVcdPxist w yւvX!(Y }0ۜ/c~J8,c"L }|Xh/vOVzʶ𕪍;9jIUZsa;Y]`uRf2sa״k@ TIW<Dž 9&rueZqW!u#m y<%6:R 䕑:p 3Ei&]QDiK$t`g1pѽLqhQwTV,J[PbzQeGUǣsbwb7f97 Vb֊kG׼O/2]ЙN4rxvE.pUW1tK,w&q=hi${Ӷ8Iz<1 ,ʢ>UjDd:2*'|JoG2Xo`$xc9<_NL<(%!IȬ#;sǴLG=j` 3ɜY@o~lrDxsDB,)\ 2wKʶ+%$+qSGd[3S!*DB7Fat@>$!ebJ dd)+ߠ})ݔs3Hl^$`1X$K0%6&TCB@ɁØ>O,DT V&>1 {9Hk'`2#HZ'dNޭ s}x?ǿMMaZG|y.,M_֌NDG0H<_7k뫷cZ2|}:b4^},3cqt>~2+(!Ql֮ש V k|>#B`OTU*a\N&2d֚_W'3,kq_ Zy~}Zkm>__>X[˴E\T")S>ԮˎC5!ebG;duRQ>))SEiyf6{;58̧vln|ݝ`2dR1fA6BCm ۶C`7W)>>>ݟ'?`PNYbPk Y8#=LubSIm iߴz`'0n7[kJJ76$G`a*r!oM RX꽋SA$2,ReA)hb jSasw_=CA`2jr&,¢=^fIT AuᏐ6r[lqL L*+Shho:DJ7VgٮmʨXRr0Ff上m4f[z󩞂BI#2<]XK}9SeKc ,F i#3H1q)\m-'4. sfM>",@;'H201 S"VJԚ <#|xhf=io|΂8bf Hy(tC[RqWz^# τ6iUn92tpG#ngz55/ y2gk}*CG30v_g1o :Erւows?w{H(vD]Z_o{n۞ krM72&,:?}']kTM!mɇ+&8Zw'ɢ1 "ƕ5C6xC @WTz\$z |䑣F?q}W9搡tTZ&IuPAHLF"]ԲH>Sƫ͵TKYq\ (m Nw7"(y=ldm.Pxߪ+:=*.,PSIlQsOzdv[+7|.zP6{Xdk M"F :ž%n"'"g:?Q{,4 ^Sc?*׋Jc&o1awhXk *NSoyĈ!HFX\uP-YP;ab;*CU3ֺ5{^}?*_%".Rq Z}xOr;+>"#)z1T|fPZu#⭔V( ?ɩڨ5$͌+~v1t"pz*jB#jWTAߊ'$j2fR3]j_#\n,jp+x?_d61~ SÊ<:X࠵,r{̔zYѕ|s&?R9ϓϟ??爠=$SgKoyZkc5#T73K~ަg5#B'g3χyjщ&*owbzX1 xD6"H\P8 P`DZg 5 $TեŮ^,[|7* l:=c8 ()\t&slJwq@) (Lr~4 (:ѥ}.EJ`UILڛ' QJaO3 Q1ZUVOkf|Ce:c)3#sc*3}oHc\]Hzp1Vxe_fvf6q,p0Lqd8³X`&g!"(U84val&Sle|4b7[d Qb|j?ԞUM @L ʕĀɐb,h[|>t65JX51UXR΂"oYK^y-%ڿr0%ML?x<H_)Cb ǣ7-0k<߳5Xf9 cVti d\L5kK{[f2,N)~2ScfIFHAn-B]5e1("f}W0&5_3Se o1K>z5>_pQuG=*B@xiu= mQUq'$li ݇i9lrNSLM(-(G6;82/s'zt7(Q0 K)=myS|5\-d|>$};dl<@ب "=|P` #rY||UlspsrPE vࣖ5mɐjP̈́gz⸆d4ծVKtSw:--}cN.oI 2"E5}z/Yu15gaٚ]^='sb,j3Cݗ(SCh!\qZt+(iXi9c 5&=^뺾|9xfdKdlES 7e&֤e3Q'%yWˠ)H3LjRH➡s" 1n*4PƝ:{qpLmr^{,@=E[Ii"xˣ)?_hۿUi ؑjڒDY.y5 L[o}\g&p]ôe&Uc\ePcCy#t=Da穪:ƸqgD1XQ.k |vLM6M<۸.Ihk>u|~|zHޚ5 o__}<օ-y܊}q4cZ O GyDK`}f34TnP3%k$DXc1$=328  9R丮 WAc*VUJo`לڨ"2P 94p[S3D5&LE*UAsKLjWQ8C@$}`rImrNhyl" Dg bIޚ)iI9 u^/o *73)P9XF eTD%L1"" h2.Fx= bXS11824\Gt.3R)s2B:HjH 6;>Z$hj->>~wT`vxdfo?zֻ̀>LpxD늈z d33N4'j7շ(G?~4vHV9~>?x~^zf^HD ڟ꼯/p]TPX~|?>s 3%y+kt[_v4mR/QR&ښ_CD{o0Un8ޛ <=2ųz1zoRRMn\[ "ʵߕ$O:lL&jST7vٳQQmO&s6Dbk3 y\?::kD'(?8Z,]s]jVYk1/Z?Q7ffyA4*^W-H)1lCT #C__N+ܣ/նASSĿ޳BoMIz\.Ƽȳb,Lk/a(=sL|ʈ4zo~f^|qfqĊ渇(Qb=VNWJqjd7bN7Jg#?ah+AQ"!ٻz0!qZfQ= 2@^=eY?2FpT:v#VɝNU]A .Fp͝U.z$)rY\xcٰL2xY3JvR̘hC8{Mh-D/WJq%Tf Y(5I3T}(O!{Hr!>?mdM28TJ\ßT7Szd:jKQơy]>bR  aĶ[1U9Mde,^l"eIݚSZD.ߚ$%_b)Jn<x9xt/ihE'%,G״(`-jX©#cLɳ`]MV(:. g*B#QƫJ͝;[+n]d;HOpFFQTvt$-a><^v8h%ĽBlX6-wBj30f9J``> 6#Vb.Ɋd U05_ s* LʙwNJ|uyM%Y>3 QWabR}W/r"+A9qi!^IچcmF/,;oº$@6#PuՠEXW9tNg0K跺!q$x鶪Ffw*+b4L~޵b̛T,hMYU_RGMޕٿuuf%{^73[r*Y {i8 ]!h1z¾*ܷn"(k0c1!K%hj3)&ҦQ39GZ)wȦk /^ m*]P #^"*- S<i16tn \`sq-_|׽=L"3{)f-%dZBXZOm`%7i["C+Ƚl;SUt:DzUz I08T<|qp+z>1P+!7zp1=H4.53x<*Ms@hQBdv+=jj#e?iII3ߕ_D{<4nj9VdS.#Kܰ/0(ze*tmnaUoQv2y]2w5DdR`չ3 hj;kaq/Dq]'hREJl\jS:kȋha}*?urˆTTZZp#i+E~T$+e}KWDguc\Y_WwW=)e7Wg5%/7xB {4Q,|BFTTjnDcBp|kAËQz[[TY<%)[ 0y?\׸Fi3(K!漯1]qub FnA+3Ƹ0+8ޜrlJVM-m'B&0JZ]O\bq@EsQn;mhR,qO}"K92!YQQMlp=sT9e/LRi6')E}XN5KUE,T=թ\f$VgIqZc@f|(DP[iZQfTrd8;"Fm EAR1$;^:*:g51vḖ$Nحz "C0!!!nhrr܋3*4s~4e5Ŷ7q;$nlt2 gZ{aW|{ ͲH$L]/ގ2|C+Y`0mE"jPoYT*#T%Dʅ{$š4ʠD01 D~%`2PON@KTU(i*W阈ceE\5].kAY ٻU)7AqB1P>@\WQ"/,efjج5-̈́U5p3͜HzK" dm8l }[337,EHZeCZ+}Dl?oU%xVkuui]o;z u"%Gٚh!8\9"p)2Wk5"q̆I Ie{-9 XbGV`JiAOV/~u+]K-"G^Mb^uxF<[=B%-[YGC@u4Mx)SM2=FD(/ (*b%dFcZ+d$|F[)nʛGxkm@hK@YҊX&%r(HznI&p @4uoٖΪG e,CQL(r]: 56?ҷm! =6{I5^>ciɍ#x Gp`FEձal\hu=;+fxz:Zw>Zft"SfqE9*~pe_d/L :ꙸ:3\S埇(-+Cj`Lyu۲̄64Hi?zM ٪>\3eCKC{^*ujk-9Fwo$7'K| *EEUVAwVv u3dCBY6V pApȄq DF[+wgd:q0~̖0CƁjl]H-ɐ[ü`oC̬`fL,f.5U[eeg2>Vd_DqL@&9ȍ$cų[)_u [ ,$RiS9&NMĊ>"\o0%YA [尨4¬t(jD9Ϝ*R+&#VX'fǘ(mZ%kp`t&jYs[-w8$a3gR0k >@# 9F}9Nq{no|˕UsnluEjV'Iרdz]_Ǐ_7PMBMv2^NE)m6X`XoZ;/zfïx2`ZN e#hmؙ٬5ɨl$haj$zz]G6t*F:~JG^k\$ '8>?G pFCUfs\뀠?4< wZ+JSKj3Bh#jۻ3EEBޮ+v֏ً2Q! S1XKPdD𡒢kL1k2T*  DmѺ4):Ode #FhSLyZG]~I* ڎǸ :|(y}T,ZWS2<zl~d1 A =|YLjzGևz}>$ǣ_DZMW+6?Z>32nGk;?lS"9"uS&CDKG:)|)36"󕙏えFgo?w LhM 5 $LIbk\:1SܴO7 Ѣʘ&Pȑa2Rl{AY=a&ck'jB.BBMLSJ>[3қuinR MZ ] &1!v+E5Lںd)g <ҩi^JỲ . c }i6Z1 g*= Ե /屷!~izBW$<`lu@L U)͖MGmb[99/tK(7hޞJDdBpzfЈ!,Oɲ6rƂG+90e 4vz$9K}|Et Q񨰿Bjt!˨ vCJuY9ИCϙH$󙤿TS"p'/>׸j̒ᬈv6IGfϯZ4FD(mV|˚"ξAK!c:?㰀5 ~o싖zZG?>pVk kMib͚A$ EitgLT4k?e}:mYo X& YVLjMIb>T "FhH{ aq`-6uyw"O鞔`ԊDt}ZTfm)whip'ү?/jD8>5b e4j X1Sc6j/BԤ2c sCX%"]vxW=EBeM_y\W,l;">d6ǧe MٚDQ+~D?|E3cw>d IcߢiiML[i?t٢hiboլ-KzZ>"iԔ5Hޚ)5G me]T\%Yt9̺;Aw;ccMxTȲŧ>!c.p]qu&dx[ݬ7n}Nj1v c\rX\wF2{9o7}w&6{48<}duQơh~9UN;&‰m:u߬erofͭ"cf]ABK+f3ED*O>Y}gLM\olUЦ<pw#Hrli$> ?ZqNo|=ZJwD"l} oSeH2)ad8R*4،Ʋp˟?0{r@--EGp]믿eR")U=V8}|]'21M^BW?_ 6_UjG 6Z$"f q J[e9<).J}F5J+TT-!ҬH_6(n{*|%=[0i޸Mw`!_ à{{~V J^)HEy#Α!ؐTM{o:gE!Hr,cBO%įQ Fͻ`[G*rK8r}˲TKo "o(U˙ 3]Ai)wR۷yj5nj'=S%i!TUGD^/Ti֠^`pŬOæ"ZF-ýD{ݽrYQ*yS!fzۅ88oDi*1-GqrG +R"5cE|;%Dxi(|W'S>VrԷ&][۪{%95{͚]SE(79pKg$#r%b\\o9C4V@J SsY!yW^ͥW%q3>8fUߺ]p{ 6 ^\ZLU!c~9Tw"T d^j^H0A=&w*f 6߂+hdٹpt*{?o٨+eS^y~LH k9ZkpRQߠLiEe?5H,\K謁ns@L)$tědZ9WBQSԹ^NHY%HȄ ,iI.f-c"p]`ύJii1#)b/Ϊ"̂<Xͬ\#uF{jT D* !* 㕻ViDWjNj[뀃 kjRJ&zֲUKlszpMV.:.͒Huà*O6 b/Ir(3ւGUho؞4iχny,XSQ+XG<-47cs"l6M*Z܁T@əH 9`d&KZ8YuҪݟBM [ԫo:)F v0k*LcfӜCn`uDV\AAq2{x_m AQj.P^;〿]3FY3>qig{KIy&e. $,N^2|HyL UDWs)IH)qkh9K1[D<8iL^ X̒EZ"=.Hn[BF̌Ϲl wTʶ9(C{3N JWeYUL4Ǩ1"1r-|ipJ=wY{x%JOZy/9|?Y3U0EsC}3s"RazV3IX`u`9_:1R P=UX7Ro+9&,.yn$u|^OH1[k 1㶌*ūd:坔X"dI9Vʾ4gϋ 2}EDeb[Q["D`j͝` M !@.ZYDcїYa"upB1GoG^g<`oO-~}/+&VL6ze7Úwlu(V x#U5\aPń/翬u2#ƀ]k@B5xfCMnؘn1}jZt|V6ߑYR8Wx hb9X{|G jK^'bZCTY;HXʅM2:#Szn~,G z Y([XN|:CԔLݬBE= Қ@ 92 BrBMT2hC,G @d" yx!D!+1v"#YBhVZ@֑뫩fxv<%hHi~WqORb7EfspE(Sal?3kU"? Us?2]Z^C%a_<M*CUˉ ܬi@"c9y~SUKe.jNQC{J S`#TB4!@iSx >77҆\%< AyڪtqDȄaE5ګ"]]NR#lAﰭi i-HP?Ik2Rpm*$FXkQ@5iŲ4U҂5ΐ)[4kfFnΙ6ʭ"h((z57B4q<6tQ1n'9i6G mP|Jg>f Ӊّ 3 c\xϧVt@ +rTeQKX<7ĉ-1BpjtoBf9ݦl޷oKd mjl6Ͻ3/v]\-tK0/W+~ssDkm'K,[FB|A@(kXb?ܬi1E*hUywH_T{kgnO\(t8{! _0 FۀChқ*UWDA/$ u q(248Wkftr1]'ܓB虚R ,&^rǭTS!dDLTpE^3 R"Et XxF :7 Qhf`r%*ܣ /굧 mfp62[j8jQ*h鞒 ѕs' d8be#1LR17)R>1 5akLPv"B9x5IW3fW۱vZ@G1BPnUn(L9#Y- lփ^W`cdIr$=(`yzvF(\o;u2-HIUw7fc t8yɁ⭏zo=$7!は CvDs}~t)?Ɨ@}qjȖHm_Ig,|NZ75[qKX O/A"3Ffz4$^W:I:°d7$udfqߠ.B(}{ʯNpTNP|{!#¼Wɾ́RHC YP {,QbK`ϩgKܜN8@xyD[?m̷5iHJ\6Cb0oVMS"Q:1}K8Uob/XQ6:o<Žq-zX ntŠ$+HUH':za ja~ƴq<$A"w(o*[VX.@5W#-inWia݉ nY669zonM\cDH*sq}y%6L, xMTZɗԨ: X79Zy'" hB `)pިY\ȹ?jg# YWMâk<0 SD}|]+GF >eX+Tn^6_?LNYӉ}w CVa^Rq3ds_K8oqcdz:<GK)ўmuMPps]BLUhi'-0f[fQd6`3!eNY VcbyMUK{{UѐcV u>xJuh,64(ꍽ2PM:"ʈQ7{ncko0W7TP2ޜҴyklĈderQrq5??h_ 쳁cM(z{׍lSm~aɔJZ%Wbƚ(F WJO] Bm\0@bw2{Vf[ٳixO}tZr/_,c1Bd1&+7`xo~˥h_vC-a. coJӋ\955WIeXqFm6Mc#Ed˕,1^{f!8ёpî#B9rKkW.juTL?a?0]ι!J\TD' iwL\3?({V 1Կ[ݮݵǨOɥw 2-%6񉱈@)-~P絠/oB5%XpĪ%qJ G0G,Әf 3ZWJ )V[WQrv g:`: _3(cAqV?ZAUWK=B>QzDHYx\#8F)CeVPgv ξQfK%m4S,Isg;K}Z2b=#Gj)an86܃{v}rueJ'b Xy^J}|A`*I,~r/*+Vky9r$5"ԉy%sM}{VD4]yzp}\=jeUxL,""r&7F;^iyחp2mvgU;PD9g{;Zb@Q:v] aY;fMAڥtA5[?? Rʛwݧ2Gqdޜ3L1k0䷄ O9 Ħ^1Ktf,l']VIކו#F4q22ƀ[S>Ff+̾]y;/|MD+$.oRFyjYye".Oʾ2S];z'apDŽL|TDth* 3Jv88=T6Y">Rvٚ3 -RMsazƈ::"*(#FBD=ňy]$> u&(6uJ{5[X$"V4D7yHDBf34U\Wìv)~m`"ؼ6o|_(Aj7>fѤǯ_aW)aL!%S=`GS,0gx68Fme:Wr\AP){i0 i`&CcT1q}GG6)WkRZ@[fJZNcYĜLc/TYTi.nRbm[(=jGT D5o 7)'P&~Yў,%%Qe4Gef8Hs2MA14hDsYwۑհ^ԍ.Xвn^G4ڎU+{He7xFYnQh8=yL8̧ψ`p>2y}|\cG5FH2rrjZ!ͷN99J uˏS,v_W Ǹ./+;5:/5g@gL&[DfGYʁ [,'K9'V1g HfN5_3'@xN'ͬ=@s*lbtE3WOP9&ٴUKfʢ'랂T7n*BS&QUbSvKmurfOc@㡲::ͫ|#|tdkXҪ>Fϕ“h[BEinninzvxxv#tk|8Q:Z8llZ*HO<:\hN'joi7 FlVν+nCd$LG}p/Tg3-Gh5Z},[6w=q$twӃ+"c^؂e 1˔وI@8y(t}pG "+h x.UXA4Kc?k ^  {;ZłG){Jh#t}:g,/p9n[ ч&hykl~Ρf!:z5UMWܣ.g{#wn?6Ţ¹LWtXiLͲ}>S5Y ;H=i̜:Mbʛ0uT+ͻ9ˇ&j$~_9#*j\m };kIml/ep^?$$kpo.ӡUܳ =\ȃ-f)yE[$5S$^+, Ƕ;oHv嚣-/d59U_5g5zŎԕ*bɼ7*}%׮2pɋ7e{?oP_9ױ3׶%b+lXA[KM}"[McHY"l̈/IGssG篻 O!\(>鍸@Aʁ7 Tp% &A:R6v=t #LQZS?>/Xβ93s"]y|e\T^@ׯw e{l|svz`G:Df"ET ; Sq3r b]}bF,N#sj#[ Yq_YyÃuÜpcVendY1C;u6F*uq:%g>XenS׳x\ Xg3ĩ^3_BX.wzhC*)lXUc = }9;rV;o 6{mK‚!= 4:V3q4c*h2TrcΈ-]h{5P rV ,}VKEF84WWYe\vJcGY?^fjKJ׿)߀psŷ/ĥm|\*sk[UuGH+[9G5)#RHSgkP[ѲvU)^x37BWusOH,Kܓݭ 5C0" Ð*cYDh{' ~$("bԎ:v?擫lguԊP.E2)c\um|t,:zsֻkEf4֬}!g cNwsvXolBz(+ڒܮ8;%P7FXs甯6Џh`q]G8V𐿾Ue]w :aSw܅L3P7ltյݱ3)ݲeqܝ&f{|v+!L:R5V0u7Yt3gn_1J>4˔ <"7n6Y10˜RQycVU1*1:jɶ fسMzs;ݥѳk#׏âL{ e쿏0 3& ͥ_ \o3bYU5Krut^ʏr"ПU(*?1HkVU9o,6϶+}v7O72d w{ZXBq;g0:IQG8'O(l+-==PdO{qZObݷZ^԰dσD7끇Yݽ(q_-!Kvw{]u֢6!QȐq  #فI- 㕌oa#N2u*14^ \3ψL9W;⩵j{}&|S]*(?&XI%w`". \%[ DDwpOjm4E177BG&)%۶ M?@8B=Xe]>Dt< (}cg5oάFYOE:oQ3:+"*33m n?1%'Vb `OU0\ &Rcc{x 5Y_$!Z[j@k:kGf0O/d6BiPm,Q.S΃L;7(͵| O^HZ^yPȜ1^òBQpLa|e nu>)x-ꪪb4"Њ`9^U=zX?N?W͈pX0HsjsлO6F#g8#j.`֞=9=:HvfnGlfs,s ҷ^ƚjűԀR1OqьIgr~Wu`vYiaMEU}c@r W.Rf?q:9p[Ag/ڧyI8p]ޏZ81%XPDGI_`#zT O,kV- 7Zɂ夻y&قMw+UnG-jU 5dwʵ/~UO@^5w 3V.d&OW,L ;4 JƈtY@Z/%v$W"Vԣ{]A>y ҹֱJ=G?/ARFog)_? GA2FR ?{d.y3sa 2ؒ$7-W _^A&y?\OU㺤&6g^Dx1"Zv霙Fᵷb{ qjIҎEZ>Ⲝ)P#0XƲyuByG6~2I=햨L|co~} GXq/`_Z֣SN|X(37(+1r6<*32+%ʬW$(Zb%Ǡ*4˻=AaV\* AۉP-S1l-_hd_1TwK(52ifkbЋW3+42r__e]޼{[鹬TzRY:5jDa!E1s/tf-a;[W=X)QVY5AJj_p,"lTI UYX\ujWD=K1۬ň~^KUrZf47'TI! V8N9;M7%L1RFW:!l'unߔ;$䖔E`M}go?2kWnTӕ.S)4^;.]~2VyٵVҫusm)0n̵`L{\c٧fM\_deN|y [1*֊ù:X< "|AZjP:_xϚV *Jrsi;+Xn].6.ܠaYrsi~BpfF<,iV:]Gfv?Ye!ozP]18XIʂ,'Qմ94`gbWo¶#W7 aM޴ :{Z{Ϣjxc5^jerURu/4?;kn.ʗlx kf-Q+=Kb~^)3-L= *~Kq9c߿55d|:Qч.}7l\WΙs~ʚ0QmGopTFh~8;~A:=1Κ3Bx<2}_EªwV0*42/3!Ֆ;|+>|fwojbʾб (+ l4bUƹh6>2G VO̺1K^q#*nYlܑX9Vݓ̼[m|XJ]rUNX*z.@3QXIr}6P1s?Y\cJ u~*8&S?+# Gu7!Vǘr?V-󮢟ġ=Vn@h9^/ 3~z?_~_>ݱ/!U20d#Q>ag\>)mE)N/:Ȟh?z}*&?,!ꊪdx@6}v{2-IEK.|Һ]u}M{̱|̮2i$!JʺInnXni>vZwvxa1Cv޹^~c0yA[AT}pCegk -zOȪz{=M#Eqh͍ɖEҖ(Qm5cm>Ud,iY ;?{@~F|La[`9잳HaCoOHrU̼ƥxUϑb(6]}el5t*#۪3 wΈ>zz-eR㚽w2bb+t3j~}\/!x m* Qp]`!)+6(aW,mX3q1`i4h $i(CGrޮNz{twݷFu}_Qj9"d33X2 w&9Ea6Jpp0﹛; ]|Ox?1-])3Z>*O{?;- X';Ö3JN^{1X*:ŏVzۄw/ `fsY Por_<ڿж~ϩ3&JV X4$άSxFc[yƾ>Q|nRⱇY|W 5G?get9 Mt%7oZuq~GhH :|n(9/`/1{gd)V&vPe+R硥n9za=Ƃ *Vrǒi~ Yŷ?f$K zR3^\mD:3o1|Z'> If7y;s<gN<`e>s4c9A11R25x#E wԜZr Ivuxl Ex1FE k-ktw`=: /~GےvuT2 j*S%髳45"bIFUY59j˧Q!؞_|gjaV&oRa1ZRX&uZ0A'@<E461Ƭq]1mfL 7qd{O,v&]ꥈثᏊ fG #%-ҬGPgv녉 US1J^K6ZkJ6PdzGv K%zZ9YIw;z:e:@'!v}K/+/wQ3%Ew]0\ 9sY78Y| Cy}}Rg`]/ M`wI1DSa͚Q ]ݱ7 [/X=Unζ5/Y;%F(&ՀL XJѐ-g7a 8(pl\S8 zR挫j®qp%.([œ4v^ma;7z 淗i C"+>RNjаn`[kv 䍘# 憙 U+S8Ҵ#^j]'A-qC6gѥ0`=ɾpW$Ba6Ƙf64^?Z︒pT?PmO9t_Wbx$8)}׸5ƼowxsCէ:$Y*2`򣱯BRp?|?RW*71z}՜35 ts da2`;Vl܄.Y9%hYU[*)=R6o@UqP=jDZ9Tkʈυ~ZDjo)UUlȲ>2؜S0-[Y2}Ƭ,m> 1I kqcM} fjE,.Ygo`v<sWhߏ_~ |um1umVNq@[ѶV4&uc;%Z!ナK1Vl@GxnH|F{hE u}1/Vs嗸d0"zeU3ء`sŶV%Q{xZge9}vbӅB):KV~fVʪ}C VfVV7z)QpȀU&mt"'~_h*Wp+xee YVy_5g"#6Yˮk+[AU-"'*ܕy(÷e| F鶊q ^yH0ÅrImծ]9oB•^+`T>"BfGƺa؆' Y7Yr5wJh'cޕ0|N`aT`3dbV!\Jk#YjTB&K^SpQj£A|$u5 ٓc˦`rI0j9M)\rm6uFpj6LȆBw(5MI~{|f}yXK: L~ >5K$& ji;ᡮ jSd ٣*>Zր[gfZXQC]0-;$_HW}"\_,`~dpCE/e k­wX̧C?>"$iը-W8}{&(Nd_5IZX5 u-hAqQQȴe++UU+b1t[z]}c4zLb@An_ 9yփ;Dօer'(jhϞLN:b\'u}___{7[>4XqIڼ~zuo`f:_7I? |0\jzX*{gLji B,92qIV9&Vmgc( ٸZ'w8k"sJ,Kma='e12sEv\1XEKsw%ӕ[Kc 9>PBT˄^R D15<єz=nH#)4=K>)RM!rln}Zy6ՍTևR&&*}l8zcsk}KŸnPnNQ)w"'5Sn̙׈3~Ҋ̷VÚ8Y0A޹4H7s:m=~hk?D0K?+54Q=uLIƈ~HR:I$G~#"n}956͢8•e$Db*}Da 80#>rM73ЭSf{д>ћ @T[1M165T&h#}%@myL*3c a5ѐ^{WQz]TEջ51ZitHЩt! Q%TqnR眎jk=q9㺯݋9+473I!5;jޞs9}s}xxejʿm6;|$Or4ij{ @xz1j t8p(L.M(D>n>,)_sk@ŵ2ԏ4OOЏOs yR+2RDL5YJk5|<*'Db*exi%rl/0.a's"?r&9dϷHܟaEv$U!cuM,}D-m\[v1vZt te9;r%$m6Vk-7W~r\= PDlwcI.b1a*"!%*Ip0;ϻ/ՏP8OtE`Xygbo]ͮq9-/|U XG-.#lsenElWX+IQ`vQ֢Fmªx}2TՀYgVn`=nmq1:gڹ2+Fsfsk4*< .Hg?;=W9b-Nfq:y\-L;Pa@13rn4&y;˯6s0(Y$ ov%sBZJ#cn <3~XwR*`^ǎTrG03u]cu)J"]Ÿ4֠SLPt76lsl{P7I:g܌"讠  nκS嫴~n9mR maߕ@mY8EYsRKb1kJ)6jJiܮ(@y6[mlT@4,32GWվ['kbG}}K9gKnhYgӞ3Gښe}m>2;jlx*W Y\beM/H6bĮI\च!2`bͭ*jV[Qu;NU=aҫɷ 75bb[n:]=.j;X<O|gDz3Mi2?> }#eHGk{$nFpQ,GPH^bt L$;njgw 08舕\UCGc;̆?`ǁ9F^ePoԐYns݅gfz7.˄rXy7VXԨgfcLĕKݎc!|t炱h9!>w*O9d#;bLaGЀgT؝$}K Z3Qnyqf톰'3QÕf.z-U&}߆5=0IaarشU̥KY$fs:9;fD7ncP?֒3} ,*;GLےbqg/v\=fa9"Fwyh-LV`H "9[kƶhnK~)R&y~m\# OSW2S0̑#,4σfG>ӐLa"v`EWfg5)X|oXk?Nhߣ2`hE5SWV8wu z7#3h}1ȝvcL+/Qei> ҍU:fΰfpT2&()thF׆XKdݽ5e:lgI& Wb Ie*l71[ zꊅ)9 ^O9ucp HK.c#~>/X@lGv';=m=Lr,v@_7 .D|WzŃe'ø# -j]Nɏo4-}ȈqQߪ0Y/'12 >s 5t7a&ωF$yfZ/Gˏ?Q;d{.{Ζϙ4BVn93^#ϙx]> 1E1|L)@ڵܼugkS/tEUX4,c\mN Yӄv-2gƈoTj1hJ1LOe[΍sGէX>q"⊗G=^_-Ƹh̪+Y!bbs Ȗ{BޮF<aB͌WRu2Խl s3;I*ʫXZ#Uz3vz%IHՇC"e/f}* Y="UfQT)\tc3yfkQ@TS )l|"Ih */z Utu]\KFC `0բO q L\^ Ep&҂@ Ffl)ĵ"r-T&_4n xͥQK=͙̩Oi1=Ēc4+U%,L8o+`wb1#tQr)DGp;I0,R%*L\-ß%(U03Fʆ;a1 ,ƙ+i E٘DrXm _ R^`!D侔 HvD,H5?D^SMoD$u.KR~,?D\y/b݆VFDII9C;pVI3 ogv9l!45s^ו뺖h!1Z{s3IͿ'j}:oy蚏QfuCqﯯ9Zׯ_Dp o&N\E> ENzәf2rDh ک*ku]񞵯j\Y5{Ykh!E;I.Z~C?Ɓ-ʩ_+0d-`^/N=HՏ줎}nDĊJ}"Eh߳! zmh>[0*'U'Kݝ5h'Btz>įXBZ+cEr76\DoSt")!f5,߿E?"~jo54'T T)p2jPhᬌH.fcїA8iOMֳqhiP6l:G.( *LRq&U&_!L;`,NY[\=Ê0Io7saV0)J@w\Urpra%&o (:љߡ6Tnm pLX!PU9Q:K'"]E.ldӣDƊFPctd d-_$E UKRZ_1ZLVٻ>k)adrĶ?#Os}FL\=یW<e/#bsNx3TV-Cϛy$mkjt^ anU N2^2b3s!MFgH>2ż"RO93bG)GV%%cf{ϰ̝RC~&ioBJĜyږqdܶP>XD^ "I]&7)2kk12i+O2oR#KE3/ ,dp"f=a^GML'sUws{?`ΆoeA||mU-;Øݱ#SSHvwb ?:)z+:÷T{= pS v!{@-Q&uѮnS?ɐrIP?yAZ\m%)I 4Jl}+Qgvn(mE'9l${ Rf'8&FPͽ6?:t9"\)$C$ʹO{4?+$p0)3x.w2K9kYs\&-C`pz5Jsrs*j<i}&&CC{^yH/?QwjmlgqCr̍|]_a(<"Lyb5tT*W3Ie5tMwz4*Dv>\6"ERYsPJ:~OhZל5j;EHEA%Gi*SUi* HUSNfDYQ*;5xxQ;T27u▉L;T" RiFԻC9;3<+3oXs,ء=?"_p|ff<ޮc^IeHRPC%xD7ߓ8u64Vs%)z v~LRwRt|,Dהݎ,f2vdrZ"bj hШD 𦎔 EG  Ijm I`ܼrBpfe2";ٌX3{VJz#p%PATҢ P*Se4u_yZW9=$wEB#)ފmM",=Z7kzG8AbK.Mj2;*f>'D5J7\6maΖI7b%KH_{%y+A tz\U0!".%}G@d\^ug^'8^dƢ"h*4<@(#`Al +V1r kXow8Ƃ1~^O0_o_+U8+pKñ"1Q7t Vu_,BwHE40ۿf(/`U&0owMĔ/R5UCfdfTq& 1E-D6']ߗ&53uLzpk*jV~/τoKE_FJqk!*׺=HMIm9rZWV6ZN295a7f1)iG*)k輦wN5"ZUUL[Ǘpb]﷪1 NN%.UܢJVEZs`jHʇK&(YYkUUjxĢ!< ^{. "rL;(ƄXjj&=>ZUTN[ ]gc4_g.{F [' 푀%V[hcx,f6U w6vC\V.H*<,3oycΘ™p #ޅ!tN2(ٗ3;iuǢH'P'țT֜QՅxIRrk6Kief„r M1[ vef$"KT}"܃U5拄FׯKe!vM* {pU#Ĕ[/3sHG5nGAmy2]g֦6DlI}Wc^fc>\3Yz]WvsNyfT KH^We)O !gD{*)="&iׄdBWtKՈ<mV> |l.SGl;Ɇ_Ą^0GU7s3TAPZ5s)z('}J&&An6p2(-#Tq凖;*<]2<3kE#œEl:ڈ'L}Myb-q.-oUSzwb~RJ{f Ф-6jZ Bx;r9Cw_15~6`--ҋ?#[\ܧ*'(k]e[a6X&.|RfsRvS "lpf*,1W,$,gA>5Ohm"U5믯XXrqRY͜8R9NOoZw'Wps)p>gd؟Y%a˛ չu6,/ }@#,*tt}uB!HUܹX AkVJA/GmEky>]3G Fb4G0Xg ک|B ekk"J{G"Ě^2.2M0wg0ڼ?e_{D|It_r*ך?­) -,FR)hnpnە;<l˲˖C -߉/فNO:=leďO5Vu&8glAtT쇟3ݭq2i{FZc1(!DȼtxB 'ӆl3K cTv"ӳ!o ;&"YHY I̦xjUv=ڵy&(aed"x)DpFy\y֌Iv=ϖiGN+HRV[y\s}f##G*`1̔#> _"LE.ĚN!bjA#I) ?9~yV?'39p^4JՕ%jyVCu{p^gxڀ)D lB!k8ٹD!, q =!Dr4 .Eε>`qBYȱ™9 ]($F<[hG%0%?H[Ogŏ˫/=HU3# t+8uOnBy?ڀc@x$h/}Rͅa;=U4kίk…+)sE#QD?1 j*}6OAֿ(9yL{A $&U ^?g`kS}|Ign"?c?d׏ιX\9,jJ! 9k1kc)lf{*BW <@%D _B3s⡦88)ou|@!orޱ a!h*8%U(-w$ Ϫj5oyE=BBȜy~2( "[>)*=EPQffXju4ɣ*|XTS q%ѣpUڭ_Fe~'q=6$g)Xs!rZbb<ފ*~zH֬%Uj*$גW+<2-GvodsϋG ꅟ6"Pʹ@"zrHR+r@StyO"!vLF5fAyresJxqD+phy{f[Iً) wTssRGbEĠ.XH)TUj5Zg0LuY1F '=Us̟k 32^UŞ.HX]})|q[X$58Ta-Q{,%ܩQaCb;*&Bm~)12љ(fY`e{_I|缕bQ+I"0ek=閇{͞-|3D_+/x~u:2[Az} sÌ^MT9I[sv od:a謾֐w&(Ýb1+I"6{^"+"CDZ"DD`CH~e>ȅx̀#5K#aZ81}ˡB"{AK#}+f1VE;BAu+h U;,3>RaD:YdĽ,=,s9lXM(w&$ݸ*;X>ؙiEĽ~^#[Mwv&A(qm6r@IV|ffBߠezQu5SrpOI#\Vbdf&L}OELXu3d[<|Z_kn(\2@z'fB@W]%:g Y{XN%aV&6K%~}/\"0H}]%taAm _k(1O/٠K]Zvd/X+\ ;4&W.sLVHpf X(=";[$\=WȎ U`>'rJRIܳД;Rc^nL|1q OP D6TɌAp߬F#ibXM/DL82$1y2< bY,^?eO  bfڌG+Ħ& DE&&| he$=p2@ ƕY=*j 9#e/9uK1" HYKPv}<5),D>v,Ε0BSX2oG^_WR9+?X8ʳCTď~]TNi*5{ttE`(1[rS"MYa*!=#K=C 9LD!A)|T,PmIB̈Ae+"w=h RɅRGjx{8B wUEZLMrV̉{|=gx0$_Y%>CT3Hr%쏥JKD2qؒ)U(ac/x:W5G)xdbMp*5ˣ_β/FœoE:iNaesw*8?,.9sb [̑kTV1VM}^{ V055YT#4$C9#d((Mu<8 aP^ϝcYj"/F LK)URaVw EQBS(Ri1 n<2Oo!7~zć9z Lt OYKZ~-l>D DkMe %VI`²Klv/AO9?O? LCWi]gf\i^JBJ&Ϩ?FDKOA}DU\:wCPCBBd45amv%zJӆĜm{`)l"aYe~O.?n,ƪNJAz? NE(V<@XO4'fnAtIzOVܶS? Sg`YUҤs" f<Px)87xflE_/afND1*듷aǜjsAy|.iKY UkzfEGq1yƵiFa3 P\j>($Zliu`2V _X(!Q hS#dRGyc׹` J w s>k c;#V3n+q6V < ?T?3֦SeXc\ˇ!"# C1ѧN3'\̝FDD+(Vє<[cSǴ4٩3=4}?q`ܞV`AOԭ=jqm `@2U473JE=7""0#Xd32rՉkIP~ʽEf5]SW|E;bg~S ?9ecf>jzxpTU眥ȩopxN<=>(?7Xk#?m8Tuao 5+Yq"WxzΉ&ʹ!(81yYa- g 񼞅upBvhc_ݪj#Qq_L+qԿ`1(A-UP '1"٣wWVIXE@?z`d5JanGFD&ʋEwNB*6n؈Mz?1ǻ ]8{O\;?^0II.w4lfctctE^s{ETJA)-%c[/ASfxP6r_^ D ~w i>`݃`PBr™aͅ˳.Z".RaZ˨$8"Ju`/';iĽ?Yd>CTJp MfEƭ0?uP%wI=eË`es}c 3~Il;Ld8< %޽0(QT( yBFAyq'VG`XieT{|*#Z6•+sA!Ƣ@A5|sa)RWO1컳j:-+|n6q+@i,4/t+BTTtqUbsO{yt]HmE(Is'Ҿo&O['HG0 HCT{1;r;?.g=|uNtܳ{xh ~|\Ql -ux飳 pTߠ i\ED'1$0 -ګ4_KD|-*4ISFƝ)|&dnV锞u㦜(U"R^%k3Z+D%y`f +aFf(ˊN:_c\9׺K8|9d!yjiJ;WO V@_'[5 P`6U݇ERO(4s!:*ܗqD|=OR֜ es"vJZ___;ZRe`Fq]T=L}o{y}}9XdȜ%3^"{!TIR lSf|rb U_~}+oܹ&1݀1^p'0hߪA1d:byɲy@1=z V\C>o5[˙MpP04d23͵r#]H{o5hk)`p!Q{z/c^f &!&3]Ly_`evs^Xp x^曎D)0d-i:[x]_wTq]j5\3\Zƈ`1WFR {qGȃCDs{9I(Z+^Qb  KP ɰ3US\Q_ŝX`"P5sBhA̙LRL&Vf5,4mf8i~X7>nQTj2최LP4a(CKSE\UUCk| 0 @oM-@i:rZ "k]E"[+i-bI(`¸wq ,Ao 0f]5pD̠o1An)"gޜIf"yFXnHFjo#.Vo&5n]_LTzs sjIb`5tIxI#T |&ܽ.9zwGAk1b[ Dl Q,""@*W1tXKF\-gltG2^SF7#;fsrUFZ$KR&D"̉Y~)YLYV`W.Jᨣ $,(DePL=)DrrF5ש9tަYGZ$Jk;LH4{xq}<^EPK/v;$06L:R#o.tKm=G/~Ej;QL-_8̄/P/iX))ʞRbx bfkOld@DrT/ u{2T/Ss^+?1oV~"{]B4at#gYcTJ>W@O1Fg@dm2/RKcVfTikvN_[bZ.kOm;YmV##a'~uZv8>"1끇M> &;Hjr63#b ѻ_MZz{R0s'޷J#Vׯ_ؖo5%gU2fOK𡾖O,I$Iz,"jYսb/XA04Xp7UE=zfj23GUTn dWJkGkt 1p&H y1k2 uLX5Ӣucw}>[%uqǚbcr;;$(FXDLwRIO s&"c績_j>֘>6T(Ͱ\ĵn}Pm 2j cL¾@]9%ff@e/ }7|EnފQ:JҽH< !DzV) 2U,"]7~d2q?ji0,ϋԌobF۴`/r5kJFYMֵRh|jLac<}oP~O$XR\dHYؙ+VKqg5B(Vǂ4dr*z9$/g"QLEy@@F@e rR҅O4H3)S)*Z&lőd ȉGPN& AnGC%R"]e!o=!пj6 c+ʪ. љ!wIuip[gɽQM7J|J{_UN5reϝx>& Aq4"R&~q6@bÅ I2 PH`n 1c@ߕp&2F*'盫|_jY#䱏;qf,tCr]^7(_JH`{\WYIsSDBW? R*Ex~]UR53n;·:=jy'1PUM=vYq_*ǃ<|xSz6Nc̵qK91bbfJ&Hu}^}Ҳ`l(aڶa@WXN[Xr[t@L\m{6:2#=o!O_lziޯgөCؓY^ `t%E,NE2.q^Cm 7{m0S4Y@{汝# !TGjʼ#|͝@ &R_?@GaEQI79KcTڬ2[L =3Ye)Zm|;-Ԭl5wv-4p!ŞrD{ъ)BAu'rY{*g/sa="Ԑ󺮗̥L{ ;47g;"m7lޖK0yuVyl=<H>=g UCr?>bH $E};Bک82GcfWG\MZУ{Rm-f7kd[_YK^qwH[̫_<9bwM&1|u,Zp/ۖ5¿J#HgvTXM DߦQ8ޟHL̐YKLMSH qH_9`5qdZˆ>BU\}r3S* znS]P݂RP|`i],3K~~($fsnҿ\Yɖ*L1i(*KТA̋&(쇙GU@ՔF-wɽub 3o׳݌Rx5^]0:{5bbInL گw+a$Hd^ڥSfM#-Y &6=Il8 Q-Cov0/x:TtS=k[:l?5}>9{55 P}. PR(UYS81qw 2'663jZ"Y8KǻN\znnꋈ\-i9Au]֚u] t1L|e**x՚1$p-3{x%/m)y@G[ #+hZrjh.L8Ux x͚ w=Uy FAe|<c11 $"}!PRh֟ϏG|f8ë(LDhv=0<I1Ly]#?ϸ"Ad׉J$1CfX2 BInGk6}~E6f:jt?"hf eojWD`Ĉ#Y Qb% hSSQk{H#U S5g>[ ǪDR]JQG4D0%iԓ=OS@ .* TIOAkkbr'*Cm3|% KDB2Q[Uj gŃKܵoTMMQZ_C < C| !j\tR-P BBZpEP }` 3hHcs-#)"3 Id5QCHxt>#CKLpZ#k֚)kF@Uc 'dBS 2ܴp> Q+ TR<*oAjJA9JZ_ӟfhFFnzbAlSQ&Hw?_ǏT!<o~LJKV2M=u|`o+@ۡR(k ]|}t=gBX#U73_.f& lLPwf3<^&:ja[xPܣ]60sozDE*1*k+fl.%noѫ5mIyU^d;zפm##g&KER[XNЀ6Iz%U?\{+@:Hld*R+9x@ @,w,j))pݔCЕ)XsAdːq޹gPF}>sDdto[XpˊY QJJ# 0fHe;;^oBn!J >byQ26)R#P;k:j(>0?펏-o8{&bǨٌ%ݗj|Mfp~ˌIY/L,I;5o*%UY5=ڐ*E Rф{/͞ k,3-v eZ#NVQ& w=~ӑP5CĦ\#"kH\ʼnOA܉KQ9 _B1I) >uuS4Req]םtNȈe |ݨnS'5k,@զLSUCJM ë7Z3V*e3rcVcOWzרׁTgfdkZw_׭q"˺Էh!Ӿy,l|y֞8uїJqo7f-Vu59^TJ,}V=|߅hFҜyon9/~u}Od-\"/4 kjP D oRn*[S: Ǿ}1 $GٵU|^lsDU1-w@ \.ťvO X4kKIY~&,9OKFqN>0Z%GNz`Y-/~vx<_"r'%~f-ndfjb͸0y>mx<~}>k/IP8 BA8)Fi%U29TBG!ҿ ۮ\Aȉ-C=)cdʢU%aU-<&ζKŧ3UT's4mkmYCTJ5:n*+b#*]4QTEr*dY~Rq/c 5ϪsկkT~6{Zٸax_Ĭ!r/!O_yJHQ54Gȕq,>`уS{>wtgC{# ./1e'ґ@mwnfAǸPdjDMH+Ct_f۱ښo5 fmEPyAEK&B^WX-*(oƹKY:2v]6Gaΰ1Ԍɦd sH`(l?Q^!/LNmXq\ B*Q h*7̊BiؼGp]F-4_QS""uM4,yl˒}^P)~1gւe BEQ^IjCíթN ̄D*oLntvLs=P "Ǐ=rxAFxvgJEvY"*hyg*`h;VM;)s,~W vEU>v*jb-kh>wAs VNQwYk'\?x<cs_nTIϧEPݎ") Xc+"L-˄!bD<ղ3D#ҰݎDH٦Er>]3#$<ɦ 6wHηҦV#BmqfxZ[#riXMd d$2RZEN]MMzj(6r n;{,~ KẌ{(ȍGf9< jF6q4U?`v5_]:rTL]\A]A4w$jР<]Z1RZdL燑="(2*nSw6l}%uӹG,&?*ڋj݇1^F+j PeJ{=15H"[}^_93̗ wѷޜ%qI0_8T .05dFE]da0Rf>D.EH O*ϳ@0ZT8yϭ 9*bKfD"eU6S3bl~ `$L'+j 2! j8:8dEgPu*i;Ҟu;j&t5N,V\ݝ ׫,:緷=TY3ewTU]ooS=VЪH(Wv-|b#qLlLs$\8BAnqM" Vn_pFs_~˦s5H6  Ӻ5 UUZ^?dfrFZIZӆ|y-;Xk)j8DtjRmc`JGŻI=7U Zϳ*Fq}H7/D΃2 (={[P}J:c&v-C5MFJ,=koS<#33w"}%qw}-)b9#9=sHIJ$Vv;V+׷Kl{Q1f8T,`&a(-xC;+O K8'SP囔L^icN< مw//=-gK\I-sTW;@">;~(' \YHW<_"S(t>YJӳ}Jw+SfeVUbdG"?3 i -y:"n/73֟1FÝ0HB%9g_gH|{?gc`vQDŸ|>ZbIld'$FHS-Sq>??7WI!Iy%Yh~Iӵ,nnA΄gx"Ԛ "FtaPz1CC`rMCz2<ϟ?wj;a&̉,2s]?>VEyF +`|RK}N23#LHd !z)(vFffG{^v{B8K(Vme.5YD4M1чہ#7&QĆtKQDB#?T̓35KNơ }EXi܍#cHM9п.8pe֤RD4x~EXG|j3`Dh3$GѤɔ5Tq>~ϟ?٥:h!*2S+p&2ڷms#-H lUH\~4kѩ&5 BCPbre)._}d+͍x}Нu_\ rfgæ>-ͅ߅TSQ:1}g'kEm+ achH<1ixKZK:̠j:Es;VKM̊9Α |"ST~]f&ݯto^-vnК^[GKxK)G]W`zZJ!%ƙcPSM(:YH+$ n;J7nƽ=v&ZEHePMsvf+2%D,JUߧpՈ$N%5ϙ*qF^[[N kqѲ˚&Zad)۟|S-{9ճYփV]5b Iz?<3Fk`BLvwR^kNM(hc>қX `?Z+WqRo5X|P\WHQ`2m«vSRtQWLL;k(crirL档ۃrxC_Q߭H ,-mRpʹ *7Xʩ}:>!EU(ؕ)n%)HXQ*/4tOxY=!trJš%: y({ ng, _V-v̘ľDLF7z"Sꦊ4j(xpZKkdvdep]ߗN$[3-B&"#;ei%O e) Y :[.`IbV}+ՠ&TVnf;kh$::zAM55*  "1"{bD[1ԞVV{9%!HvଊIq2hDzHڵH!YȷE&`g`މm:=IY&͚…9{Y#ˆѯK~lG*ƾ7mZf&/(}RoGyZ'rDE m yD5|W^ ?XBdnZwV Ä/$l\aOJd3Lj)Qވ&oaoM%Y5"9Wdc}NZėI2\D9ZլĚZt{JRu콳@Rݡ?sj{JqWM HtkM4nS0s%pJK|pSS|qT oV/-{q /!",ËxbFDpAn{@dc8>:V{C+DmmXf&Tn̩uG+Bl J9}J ^-e*ڞ_l]t~L;\E~v/f=1}_7 =^%Lͻ#j7Nh?0\Ww7JKH D%on˘_4Vjyr;׉7\Hx'</U% w#2E=ߢ^3KV|Cb6·\ͮY./Kv&jRdD&r p߱\ guM`=QQechB)0+B QҍfFq*x98{B YD R1ӲF'$G"Im0LwF@L>(e bj8C __~||Gk@ kğ "ukGX蔐E,iZk`:S"~6t=TRl˹Z1V|쾗,:q\9Fc{|wOPe0*P&idYj;O>{7R,:h7Ĝ6.{=־7@W .G@^f_'0BUe6Qrɻ ωO L[Iʔ* M*.n;Wcm*& 3M|M-8Y'UCb:-J[唙.:lތәBTٌ,?W`V{@m;Nj?=F?#kK5fsƭ6CEb2'D9@xHDx=/31r:V(F0nw;a/ dYU<}ʲM@kN!",#HC @P: {h*_ZTQw27]x̰H+FޚJQR=r]ÆpXE"gc`ZВJUwF& c r/"֗1˿UgD kŐ25VI BVc^9NT<ԡVv6 Odj n¨Hbh"mGd@EYjs\w7b@6l[XUrQ,7]Q_74=~[C^\(eR#H__OFf欔ك1͈W8k }M|_X&DP=3"y~=Lٶ}\s"z*ErڐU G~ֵ/hUqH٪˟kw{A 榨*lBPt\4,F\XYzݣss]J)a8z9;c.?Ju-spR/_+YΔٹasBE4 j jlwbq\agȩњGuT˒To-Cܺ9ez*}Y/Tc^7,x/rEٷV1cf_ʧ7f׮1юCػZ:{u[=`9!GS)n~q3jaeeu"5Ksc^"{~%&?sdw f%{ w\ h#Y$Y)nMQ9DAL2%5նBL&Q|d=3iA-pZo@ȱn6WF](.^L ,1|`VCIu-}|i `:of" M! A>֐F{F1*L;'뗪~nR#>KQ4>j4& S۔`*pG!E59i+!@xQ@,^>|$ H)'uǏ?=ZkԼNh(([#'*B9/Q}~=㷏4q)rPkFBr ReL1P14,54ɔjbے1Vz{#lH(B1!b2TǴމdHQ5eLDwFDjL53 DWMhFRcsD% TLsJL鵅{;qhk-hbL;d ޳5 WV>8hW5{RDMEIJZK{fsŎ{8ڗ cD0;"4:c(Mzs&p;`j?1v͚%q??GiOp I,\%7~!C(oyF"gC>z4"ڙ"|]~Z=c U_>ev4fzFyPZ>zDkԣQsXy9ǸDBB~ r yXRx@"-␑ДC-#ҌivPT2^LL%~H30mUDa&H xb9):tYr#޺]tO.?ݢ7 gafmewuMgN.CU]Ş ;X|!` E4|]UGڱ `]E)& H}y5fEL7_-NwڌY<Πe5k}ffEUqlNNNb%;2\0S-y2NhJh׼)5[*S7pwa4r7Ykdspf.֎zBn:Gʏ?~}Z#١JJSo8_b&0/2c.iƔ:'0A2!cʤ8P7Clݑ2zZ3[[VF k8(9.!˄vLҜy%۱{=soeP;w k1/fL "mGW0 #tqx]u]Vy#05)Ex0Vj=yzTOw=b6XyN F>ۖbolY~{6_5mXyw,.Aj#zK%u_9v20~ u&ywpn_tM*y/mM靨`!! i9CVg@zdb$89PE܏jŇi>f yvT[жCb6s͎ʆonMI'TŚes7E6ØOERk-7kߊnoI1_;͡j7"Vs1p 3q1|KB yCx8܋6n cff܊],[ovRv)^E WHqh*֜)\[u]~ka|A!2ţ_ cͰ㒥?1oqKNlt)cc "CR>I`,W_Ϥq5z,T,&lo˛֎5"㞜FQHv3m9긔[B{jѭ Gx!Do#8ǥS$ffשܙ"ئ"fcM8D[g?S{1`{O&Ãb&4`a~]Y1yb *Z_kю!"0f08X_Jr^ϡ0M's z5nNnڢҵ$`y>cx<׀`2T8v*`V6ao f:__qu(JSy}0`{lֹUH"%e8]̀{hȴ(|zW*jã.:1Z4Br#ckٺ"R?BUȸ3<21! FkE\nENCљ^H)@ dTg4Rh%CATLYTh4ѮD5%ݪDY'c?Տ#<OG\THkDsvӯו֛;#CgMX\;9NPV2eKUN{meդZ3hfMQC"Qq,q 1D6mq#pHrzӖfj&jZ#)U/fjkF،HA/DsdTu0(u2b UBS bUtMӀ!~G}xzC%Dn$*$YD c1ȐǻT401R8S%3G!1xG\cP_ሐJ<RhJhOO=G aKSM2F"&zy0"%lHR`z}\r`Vy] g 4rl%:lB]2ӓ vXA9TB 9&HAt0#J1>C FɌE!ԽdK'RQȸܯQr쑒т W`֛3΀b^CM1^ 22gb|>5HjPw"j tf@]`[spHASCM w.5`FRõT $"lrf! pdMR[݂9,bRIxQ&F2xeyjBᤙW5!c8 W^{f58STFx$keڗi_:jYRĸLQȤɪXV{ !Zm9#nRPvx:j^۬!=5ؾjj[TWSuk_i:UF+[Nh䝧ZAózIIp@8]C珠RDHf nx($"u|DF6jF$XbiU0LU~qHA4H"U 9h9h 8R?oFpE* w\$"ڌ {B!PV͚zVrg |h%@ s{s.Jʖ&btji&Dlȝ!vm". ٪Fjf0V+ʒYOaXgMAFadf} ~ T~&v!vʫY<#y^G7U$7וD&gˌI5KuWDIό1q$ 1(hҀD,ֳbA.FS.TMj9e cP~Hʳ_ps}$@87U9,LMQ !rB:(DXBx}1>bGE4U cg55m@R{EPB~]ڴvq]PdOïPqLM 2BkrSXௗL-xzYuϦf#4ëL/=8@b~7U-rJMZQDrG2D-dϘ;%:H y#}#'*@fceBjb+#|L Cýd)T%V'."rJvOx%2#zױ!dTnV̘͜[K ٲ@e`f$-ЧXsȊ"{dR fDϖjk}ƒ)6[omӶ%DabJVyGVnM}5'RVtnme4ݗ~w)pkߴvTk< /v7jpWkA%nLjuhvvPw \yB +joc kXҬU˰zz[<;7|JKx$2jY/gqD ojKĭ ($vX[ }GTD8ڑy&*y[VQj"[Gh3+W < ̕JpYwQM-1sٿ[É=:eNQT# 逤jSHURUS"y]LQdh!?_֞+Taf _nV)3˫R+g22LLJV8|XٜwnnnĔ|sQSc*ˇv e*U7՜ԊyƦ ,[d(  y!!*HI) 45\zc'9 qD $M-Ic2#6tL%ie,gUx*fq]o̤ *p)G^Xh~xB"V-uj: oŊZ5E#~`LjCMUœ}:f[3ma{ݔGfLa{I"~U5)Z!7{{Jx 9ML5]q~ԛf&_c8iM^?O-L,%Adf][r~ on+B})T9@/|hut砐o8/lAF8YԱ]K/u07^Q"$h-im$<b UYE(lI׆jfij"D; jٙ1AL޵;uQlf;|݁= n~ cUՈˬUn;ōVٹ2SLyN 6ww&3jfY1R3j"IyffCG" J>\ ۜ(\yzFJHڛteAA}%U!=0wHRWRM,@lfL[8D|b 4WvqiQ2SR2F+iSE(ǟIx<~7twTLp(wf#`GD)MO" 39ipRqp+3QyJE5]>{WI8v\X8jSJD>w >]ٽ#>=UJTA5>EE5 Ky}pu5L穪1IpRb_Z뽝[ɶ]˶SMp1m(uFf} DÕh9w05"F֚F'j."8hE'3x}LIU ܍YK͂oOS7(Ք݋x|T7zSr5QF8 3jZ)*Ve&omuz8*枿JtWGU!G,nH͜$,dFȫr P&D)2&Q JkVV5iÖI@\v#(-DEyC%yG$K1r] ٣?ro8uj`Q% I4l51kb_)kIl0Ll3%fݽNC[(QY@L j@TxJ'HȠw}kDkMT"Z[* Oc f31"YAy^jGIuv"! ;s5ZUU\]3ZDho~Hޏ`*cPW:Ja̤FdM$\` 5Ͱ@D*O22|Xk4L18,1ѴEݏ z ɇl#g o, |fgJR3G3X0+TfxQSwVluwJRT\nWk2,,<_ tGPUAqx}Tn1JÈ PQI'}t:bl0WVTedty:m*ҡHHjSGJ:b8$/|y=9RF`:|K B>b2HVBoD"#uْΎ]>nż1$Sv{Tյ܏Y>+nL[fYK1}٤ҙj?x7Ou^qlOC8Tf墺|F2"e%س>k!*:Ax9r$#yGǏ/њB5غTs}^7#<|;ne6J @UVT[C  A>(2Ī"(a#'i_sٶ>Hs!<%DfDA"Z8YkI_e,X^е>"MXIB{fZD9~6|1rnEtx~u=Ӵq"wkv]i,J ݺjGjSю~*Zibs\SEXk~l;HJ%*$\Wȴ)٢r{%$;l*߯я#=5#ɔپ!o#`Ms\[BTD!r>#4"޴j9.#H:6{IxS/ )3ɘK'[L2eJMŋ1SI̼]k [1<| RyBhGz"v]3)vQJmLu.Dz#,CDsg A~ C4>*E>ZgwE߯O^H)UNd9c5UMC>=%T)dD(:daPziKN(L@G-<=9I&x\Qn|KZHhQkz QyǜQr%Xo9f#j5Dcf9}%u#sxDq誝_<$?1;CՐwZ `#/SԴ7W_Uj*6RblL44DxEf)k%1u 0,yhjgZF$]S,+`961J"*eϜYd?T ְ!UEQrS"Bg+TGZ(lľ;97:<nWoN%^ ˊ^ʩK2է?eQUo..jp| QST .bQY쑨+k_uQy8վC{"qƏG>Io2I_Ckz<pv1}MV zAS}j#~|qg  tv /l> -TF.ĩ=G,gLN4 A Nuh5"n7yW~afѯ_8 T\,2TgUIjwvdkKJ}x<]4/ZL~M]wn<3q?L5E[DC :35žkf*>T{]xXJgZ`g"/kKL 0ky%zJ֭:[kN%F=鵶"Һ"gr 9@;hkR$3 snc^@ ~Ï(3P!k '|e.@)s1d"lP_ U҂U$ʹ5HBŴ 8"J{g3SczYkfp.k-HM)E >]FE‹ЎIO3Br !Hf\[n -}& _&+{zyV 24-*wJi!e%N%M*JP ɶFL'Dxd옦"#i)Ⱥ8OFeq<|j|#B9t>/LM*+.KUǃr[ W,2v\=se富@f"~w-*x]r8 oIL!MU]7;OCŒ0xF0Q؍-{aKޟx6b M$!v-{J@77^nXxx]!!HQĔy-rT2EF}"N$|*d9r0O#7ȎWhˆ?4CEKdn5ƸŎkHI\^ l1l͘E433`hrA~}1loy'*6G"^CyMjAa$RGOCd0Ҹ@ vxUnPGXu^zSwHheɹEzy$5r# o*pCB榼̓C f/©D`ќ=l!Kac VOaviz^ϧJY7=5m0ڂIMwfQJ.-!^i gGNy3P @_rJGRf_x)2ՕPUfxv5(jVH/vOoA3J /'DHAmSy5WJ5v$ה91cR]|oPC3{5aUr!h؞͞0ܠ2S ے%޵'1=@\{7 Y/XIzTBX;G16'Wbo˩6ZHA_?{0X ԩQ\Vtkop"֘]}G}zezrOmO˜)w}vGEl%;6G­oO!ϔڮV%!Y~CP <>lݓWL>Zߝ0Xw)535mp寰%QD1.!B 1U3.gMTn/΀Y}&jֹHT1/~9ݛu͋AGHx PJ>&,$kP>_7D}Oίrݤb?_~ -[d(JV,K20*~5g$*ʕ'z 9Hcg2GkZ[Hy +l!" b& H5,*`&jPgMX#s\<} # Pjx֊*"pg@x=ݓIkRX~G^uML5IM?_|\Q_Iģz bZ џqIOCE5ZZ7ʡO!`F}\?nfkzY߾PYkPiAvM]oS(U S˹ ȋz32f$&mFz\WF5&af2Ӭ:ߛZ\}=ZjkD2:˂$z"iUuRU}گ:e"ӣw{d5FLUc vL~<8gDNu &fpM`q&QAw lgUQYN~@͌cĖ2y ߍ;uOgɳE܍[58sͿ A#Fc+ZI0}cEC]S>U#606#v;[kLe[s17?uۿǿ?ɬFnPԏ-#n7l776t bĤaׯW'Dngf5 5P9-9#ؠ$=w'+HVN$wzkmEw/zeq9yNٟXهYo q i*5,N߲C*}+s1.0(=K4͆4ɔt+2BGy(RƂ&{oK3mIdNMVƯ7OW# 9pUn |RKW{T DRү?|eS{{_YIa-"QB"Ekd1D-^ت.0x#qW+ׅ #Kx*Tj?4r_jY^1TZLUmH pA!LX4xuNwǡRq3`Tcil3.MN)B_z*k<;bRt5'+~tcЕ@ $GOLG+1q,}Af‰,0ca.HJI5R'K4ˠ jyNF]΂ycֻxxZ;Dˣ ,L< C?~}}yX)!y`S~un2U#DM܃zT-8CEweq%"ECfJÚ%]Yk)VfwXe1槞 sS3m@85@f6?NCZQwCT,s)]?zv(UVFpNwgzX7U +6LM0rӜ5r52|f}K"H*Aef'm=mU/3Ӕ*8ER˗W* |_]KaIYM@>Woí!D|dHu͌h̨PM4\t?j\RI YRUA3) ~UEfZ% **583!q^m„MmB&R:AFޮ|ԡ~ѕP뼉XwE2*VKCTLdC`VUq>|ZCujM )Q1&#v,4M4P뭘iDB1eGJuZJDg6"%I)1bHmj2AuT}UdA&~hTBe1K.^bX38d5HoADOh9 ohܝS_wWðwTQY\P덱Q4oIe2!V:t>6LZÞ+orX$TKk-"FE`[*{u] ,e~GdXY+Wc@zk7{y]תÇB!6}j܊)r3(p YtK8a24CEJo|hsOѮv U<_&h]nENx|wr!?S3hq)zk4Uɰ8WKתq4"?kՠAkО5b1 c D#3P6,Y|>VA)]V1NUfT*|s0L3JH3*y3ҏgWzEH~И[Z[c>nr^ì'&>)[>~<13mun{u$+o1dd>ilflnVj3@٬1ɕVqI!= wGeFGJJk}ңj^c"2b0Y5h h*2j4Gſt% X˭Tի@9bU-<#u "5 t:7C , K4wn|{_Xi#L.%?$ṒqסkBrIWīrï~"G3B /ôf 4f!s 6Ik=T=f1hrk\#DE󒻧*>u|MMPjICO /]`*fnԭw\cEZCyM3ՖTe4G8}}DJS}<$B,oL)B 6& 's :b]`ۨ`dtyl92.&=y##Z| PG &b3@KE2#1\ ^뺎#3쏇EEBWEa1}kb󀮪*wn) p O͕K)6)9X|PtუCg XkU UXOn`o j}./EJ}gƱ|^;q^/Uy,?ȷ>e\r<>N \y2E,g&(Ys!D\~:@u?DyѠHáEy irȄy%wgK& .[E3g֙{Dz3-A2R(*#*1Ucuu /[ث#A(< dSr`zPګAT]e.{^STކrϭaCuhjN!%uf!>R%d3n&<\OhXfK{]6[lʛ_jqdH1 ԯp -+jOL8 p&RC!U@(>ܗSN6(C]1NNO͢-scocy P0z&Nkc bhq&!*|!rؓl8}lWfY&&#w>UĴ[d^Lk2Uhcn)1އKjXLw\Yc *9p?Sv^0c)x<.܀7= bӪYϔ'~]TqOЖ;EٗXahݽL`jW,ssQ L7[YLlM̻{yp Fb?NkAtT#p5a٪[X|D, PfeW*S?)x. Vb C{o5Gݝ 6q~x. ̞ zkʛ|.O>|3D"|lL:[FĠNMYnʑB"vQWk-##2"zYgh9n=^M`aC%Mn8xD1.97UVYyF,(vZOp_[!x^0ALLa $5Pȫ*Sj)ЉޫJM0fE[0S! ,Y]REN(;u j\sOu3,aI*,&CZ|RZr}7&+e dUR؝ DB]{(m@ ҋƞVd7Q9T3H1I eי>|Jȷ[}w_+h][者\uD#A:s+LÌQ`6$fwd_vx6ndY\BVxFDJeL%M)j |3awZB2Tf}/}I SJ&2Q`: ӚS*j/@5}*ޅYJfƀ2׿\쯤NJ60֚Ǥ|cXST&=uEx-C%&x)bVK3$dSAdqPT#*ݖڙH?쐿6-VI^7c/.ߎ8oq횪wGL$Dl )2:tx^#3|>t? R.HU Ռ;o7e1W^'5L${QbQnF_֝σSfz{Tt!WlP=, x\R1/$J22v}-AoY!aV) {{;5G6oWGu6S2p3"Q2F[ ԙ̩#'2,f/]əM- l ]du:Erf ReOiMO֞yLk 7ř7{QKǘkn~,zTw#*etwI,qf:dy$I t|ATs.툲Fjb+vz/dObMjAV8FW@  J<`5)0?1TMy`8(|w`Bvzom@1Q8.n߼9fꇋjPHm`^,IDk/@EGsgfE]@KzD+v& J.EbMF"V"1e .eZ7+93)įrc|uPY1F.Zat P o{hMkT2wY1. v8Mo%NWdZyOLH(Ѳ&d,TYn>HA3K@V 4YsOF.Zl|eζ}DDT;3Rg9ao %C:JhO7" ]Z%h3a8:u*RY[G&zJV*c0(d,1Mj:"ҬE[>b?ٶIVQ-PEiRN 15Hד~wp+mZD(>¸k\"pw5{[I9'p޺VG\Hx>⎖CS$=f*fy]4NN-WFI&.񀔶꺩޺>& ҕoKͺi3`AH])'`6K̴[&xs)Mʺߒ5Y-Aݬ 5"UJޕ G2dDM0#8אaR3ADT#6FTAժ7aÈE{jߣ{͏ 4  YTIΕ^4fHSvr&o $$-i NyWHF엍?}0AnDB/k@c?_K5 ʢ̳ɒ/&Mm-#k4ajGz7WP.3onFX6ܹPJH xGgX [$GTY E|w=w2af0gde23OB׈1 AY Hѵ 䀻@r#_fךv푙Y9U6uUaq!!M1ch{z|"a__d]) 3z]da6TDZ;%Mljaڴ!:3\3u1.Pj.LjoѰqBTEmjS^ 57fE]F͙9#7IlG>ܭvh!ڎ3xJ65*) ɷL!1Łۘ\1C5!uwS2qķӚlҺfcǀrj&23l-kTRMnsNo,g5bXE8^c p]$b%-p5f#5Tx0Ϝ I}Y.Vv#F)cV/!(gp+prg}Oᤌ}f@ *-,Ղ&J06FDî~h* 3.*Y31 Soe$jfWAz.{2ؖ_ e%G50HSE!RpJ|E,5aAՖ2 䣨9΀[T침TjR"z}= p˙.R@}0wU`FإL*ue#`epJ0]S4s"#KiľKSqbIη9Q4 q(ϯW*rsaHc^q׆9 \$t?<&N—OWmVК]{'_Vd5P'MnVrr~_F!aЇ'}@i]iզm^B]T딐j,0V:Eni;3EB 7Wm^?z9lޏ'&C27V):4u3#fcEiWzC'4K~:Z**1}Fr5F*6Ff{i_ X~YOv3YuEE~dvjY+ ,$ ncǦ`ڻ0' {Uq\-mJ Ni1c\燆^7 (|^6^׿?9EsavSЕMXn>;z~#>8iK1,KXI`&,s%7>U]#WY.L%\ ţPbم ]nW3 D/Aj={#)rRW bĴanUvYyz6f&ۅCQP-YaoRκL(m8-ĔGr-IO䒖n-RbE enkzlKD]dH>M[~IMX*%RPPm啣D"1. ,=#cP& R}c]ECLh0Rw\G6L;86>LMHhg~Yz2\;Q߭-Tf9[rE"|~*39_F kuxDջc\+`?sl6w{?;ϦNp[J{(&4'RBCهH@ZbjHYT,ރ6`(y^toրyQ e%OZopy"ݾ*}Zm3Wѩؙy Bjp6Țͻ`޼9``+.WL&gT!z׾L*b&w JVp Eֺ7^qA}}!>i%o}E!R|wEN*n,SnHܣ£kAƸ^UL_~ djD;gq"0L`LZ⺆dwTdE9 Nr|b cߛR_*l@B8T쁀\7Gh6ĽV!IC^/& ;6FVfxcvv&u1TdXEic䬢=33?h@̂STKte ùϺy>~4r3xg:@m*GAB%5D@C Jiʂd굑"7u-QRfȢadNG|n3#@Yu7]P/&+srGXwx/Wg0vʥ\@{SA0S!fxꇱdn&&N+ugEPͷ~=7RWnfG0ۇXGo.$?g)}h6R!  JhuR=cjvؽG;#< ih5\T T$R QqPju^h/{RZ LocMZk3Ň;gx2Me 5saF3hn*-A>O)WEmVWOf|Ika2BzXL|ioj/d2v{ ޕx/pߺA 뿾ofN ;0~ _*\@iMg# F(Bjf֛93RX^17i]\^N= Ӛb,#seWGDSm^TYlw,ff LU_r7_[/J)%rv;uv[,xEDU|-wO,HUi ybN1;GȜ1Z#o~dH/'fl&CN=LR$Q@x-#)ͮ(Z/yXZr*0+eΦ^H ]%gi7 ?>'=XIn ?9_ʬ뺽i U{F06-9Y?!*hBVĻ 6eM$e*4%pGFn.J8#g@cu2x>qy U)Bhhjwo1 ;bJ9"L,sҚZ7|\DżFn&m1=]p+[ )^-Hؿ6NoJ픥\QlCȒ\rjhi=︇-e <,V}qT3.JyY_>D ߎ=޿2a?迾~i<_#ҘP6Uu%L5x(&i%<'ܓ7Pj1aT݃Q \fy/wȈω o8$ȌQyffPv٘"-7XA^ϣzxuܘ)u]!ׯ9U|>KrNs˟H[ϯi̇hGkcXװWQ{F;Z+P~/2:̂fESrR,վ߯jJ~NdG_ݺ>ԃiW;=[D+NtP\4ټZk]fc`Z#Y;D<6{eqZFI'xq=)*V7rbF$d;|g$N ?Uծ7=)fþE=@$::Uy轃r F > T`].kQ5{dsڢ#)%.L>wGb9kgHTƧjVw_[iY:!~LgrH(qLWȝsGؕ1N3TZ=>ZɰxG!T d!ET?rs(n#@h>3`48#dWY<,-Wᙡ 4J"lUZ4s=5)0Ӵc.< Yp|TeJZx9ON5^\:'*6, 9ff7p*&|xb\Wò拾qEf'S; 5r`:@T\ $xR6ޒN T@  0I RnHX։>G[\D3kfa|'J#}Ih1ќ{ei{8gLj'rhEus&5֘d@{Hן)GuM͌H@ss+cSO 63H/`QŮj[̆R{ݠBI1zzG#e㼮TvϮmVe%(oB>q7_ fQ00ĕM%sͧ)8nT˄PvhOm^D$ukA E41NO~>>#T!)ZŇ@2Wn h*oS&+ 2E YLNP=!⬿"J9Cu&qg3 4Q5g+H 3;+&.ŰxAiEkY#|nׅx~2p)~ q Bp4#U"9W%U*Ybov="mAc~'CO_Gmt!Eï{3뤔7C;R#]C7`z1 ጠ` 'r1#KL)^0I7Cv$}ɀhNA*%wHĺe/SBeJXYx0麙Y~\y\6iӖL˙|~뗙sb؀;0-"\0Uxr$sS=^+"ZɃ$?K>b,k 2Z7\wK2jDqR݋w K%ylf`|g:#W"(~@5/ǬTo_r1rɴm:qlj4'jW {~U<Wc))cִ"9044UыqϸRjxK JXk]x O_?sk* e&7m_ᐯԇbI(@m}R|\*7mn4eKĦJqRn?#'J6EIdèi2ZfdRRGLj6? sTV$$4NAL.P1h9_VnA!'"n.q,+0MD¬G>pfY @7KnL@cK6ir! :g| 8D.T4˝l"Y7:3~"9JHz~Q$APQe&"1n[Ȗg]ʒP> u/]fr7j|nr*V=е!s"w[gUk-m;XYJwE띤eo',+iRJ䉺,3o0cϟ_GU~ <042uF"%K``~Ml#ɒ1?>XNF@$PNl?cx4سc=Zj1nJza\`걛Gasiq#ۜG̉n|Y<ΡZ310C,hbc{ℵ&7ۤ-gf>M[+B 1纳ږd4#if.nm*wZ.#bZ~-:}aNR__Pa^`BRL~,`{H搊M*2 ;V$–0hG?po#y׼oo߲}LT)>5@#w3l`vo$y4Tu4Fa^!2|d~8C)9fw-̤H.欖Ok|$7.XOm4+$㝟URV/nyٳs=iu.wg\[q`eBETrn$&A"ʯV{gx\FFuUîUTDc!̆GFe@x]($}W=FW蘒ƤԴ&BB=Il+-IFzv˺OwCeniۛ ~ P.,6U&B\*@3kb[SUu|ٟ{Ŗc]Z6P^8{֚Y=SS9G٥f+i 0S3dbu\WY=uZ|;&yM4(pց "bMU1N[>`"#(q><:m!BTY|GڵӕǮ'N!@9UbGQ_#2‡Y)MO4MOnJV/V ~fC,3bv4'eDY`r4 ]b){ɔWύ[!+QԴ,r`{DM,?A` B!\l I~,-̅]9;*D<|G&$TJen"e*y'2Z4"CJ"|DO''7UJPS%(e,lS{Ӎ)V`U\{2E| e$3)J$7E.,(j,6l[U+<ޓ{n.(59"y]UnS>T\RWN+}j<_na|<7Zoz}gkxТAcX q{qI Aҭu>_ezzI9@3b\i2ԏ#ߵ(#;zNVe:ޚaܑ9TIcs#"ц"Biޑ p߯q_jBs֮|}?T^3Кkqv_Ux]\v*'AB;Z74q Q,8ugF!t\W|j~]ΟN$enz4ApCiq|=ill ucc r{~?OG;W$vRU[ϟypPU:J akO3]r>o5EhYM;hQiHcض{r%60r. &5ĺLymܧﱠ҄! W"v%T2 ~r^tm{<&2 e _3鐘) n.1Uᴔu-s-lޑ#60e9[rKIہsc\zvSw/3;+5"¢(AILPEq[n`\@C u|ʽ<ʛS̵ObIkɀrfeZT7\&Y˸뼮q^a'>ոVH|ŝh x蠓-a%QX;YYX^W!B0C=!5qikq%;c>o@GWU=_$ҷb31pi>?;h (np+UQZ`?e2Bzam"ќ^{Kݣ%"eiszόl/B;8:{}.f78$GKeds2&mT- %ۊ0=itǛY#Z:䉶99-!RQO9MͭSw3 siHK 1+ٵ͟-U/Ize;^J<ǒf.Oo}3IHz7w2c.'?LJ.:-oYu=yɶ .Iʾ9 _HP$\$3[ qW{;w#Bwti3di*? ' JuyK# =`$ͮMku:Шs#ev4;CDF,4' l&&e/=S.,0v;p@BƝ }Y6A[Mfpʒ|{κfyYQ5EO=zk#7k r@KƞW1ϕ\R 1rZψǻ~kwM7^;[j/lMW>2wJKfp#b&LluSsl%_I~Xl>rXe}  D4FC3 ˜M6@/`pdVU8kei!A\ Ah1c\0#* xP<ee}~Jhq*dLRzP"~4$G.pYSZaD2xcEf{oZK_R]g|&|%1&!n#AժŻǗ%=8|7cgB;f4#tdw_>󣪌rEvy! $[9 G<=m]U_DF|Y;=d 5[6?Ƀ4(@6 K δC%gd0z]4%y9V)I{)m{,POhߎz|;4 ClK#n+su( D_w+uoeWwE lS:,#q}U} ,Oli)ErI)"[*s }DE2GBH"f&B0\VN{ʜ9 ȚJH͵Jh9qjP X87K3$cn{\vӚ;dHD|`1Op#tz:$aA}ܵY,d#X#4'f{kGuV:sdO>9)u5hve*vD¹-2֛Nu]f6d-RA/-TK+35NS({UH3íi b#ϖsסDL5ܑ9jh\B= IL=E8GF1PdG% h 4)ySrTk;OymY5Ş1b2CZGFdQ9?cM׍`pw䮋 #ԒHOAS#+Tq^!Mt&)M]nfLGy33A+E p5WKz&&Qo˴^Y}1_}FA ™44].wE4oE9MO`|Ǟ'B6ܡi[@5MGږ|R 6;T ֕ws*D5  V 22]=؛">,hMiP2~: R&TY |IJPoO`_!򄕵ǭTGƎ˅ <7M0fp%s)dL)C8?,۶9;Ӎo_EK FN#_5VrJ9/F|A>M(hm˨VED4>e 9d~oneU= H9]fu8#eIQijqY\ogm;.P4c{l//{${rfh6Hv|JQDx<c<1Ɵ3rwu1Ջ$ڬ1|^= d e5=J\ýDpQ٣leN5rAV&й9 9_I[p8`dpڷ s%K:r,͕h)dݪ0Hk}oH~Q?2239pQJE.BNЗ%vťQヮ>'k)R|EQQ_̆mHU! ɾf\H4ҥ&p/ATc]ֱ5ҫ Q^#DjQ6[i}5BvW]9Om9Xc'ښOf.ꎼKyŶ4J4q24Ҵ`|t)Z.@ؿH55|,քr'->n F ~4,!0_eq0!~E4#*, ݢ)N'2eھ!z"i _n}qG~󏖡*s~H.љH@Ϧ`\8`OkhXbآ(XR'-PS}쁨^ 1GNlP*D77/Dk+)ix*^-?Ma -+NT$Jy&_+A15$*~}![Vnt|=E5^_1=/"Tb tQW33x`˴Poj4ИܦBUq<XZם1n (a.ڎgc%D%T|{Wm #;z.ZXH 馤hS 9:,ֿ)lq]65"RIx06)av%%ו$]L Ov9r<ILPѮQ)B^X8F&cq}\ˬ,'~<A.|!4" >Y-[1Yʵ1>DlюSՇr r.hE,rW0s{Ҏ/W&x+-<bK$EiF aLU}JAY,As^%&Q)# fwzG}XӧGDZ % Pk &,LDT Gn($Z̧Jx4w-|[Cܴ~sD8]4"*f=[* $e]:nS4Ʃn$]b(YCވ$ZBR˧Ý |h" !̳(i Z<3fa ]5w$/dCG2=e%7<-12̄DvH};+ve_+.)^K˺EL5ka @2}ii"J 1Y8#DR4O'TG Kv0ܥ>R$'wZ2@u~D3 vV~,Lw|W>յijK9ELHGk=*a=|Dܝ3ɦ:`=pDeĮY0bR;H-0!0}wc ٝ<m%8oXF\B캞p2a$_fl>kI9Z(|ɽM54o-"L#J F&Q{dg my~\X.J/ y^Db9)isi^l!mJLwB O!'Mmo',1HAm঒~(9dg0X2Y\JTz4W̊(e񡞜{usW^%1L\D=b>! wHlV71o)c#lF5 h\ )"m /d»=%l Խ`'I1nPskE63 &c_CX'gͥ5(:ZZ?ro %cr?Gnf 2zp(fNjhR*19}уwtZ@R ÊPP3#¬z2ULs>,U3p.,W`魫Z̬+C_wf;3nNN,HDn,s&_o07G{\Z3%R8u#P+=[5r118j #ۢrD|V0Z&722B$(jz86͇/ >w'# |8_$mfTz)0Izjd5i9kÑ1=Ch5|e"h48!G`4/HaAw}hEܣI3 !&f\xk)EÐ<-fokP6Ij?ܿ}}9a_d=z,skStSPy\*Q\|zީG"(@ao *GXc2N7dKAa oIDm\͍7JꙐӞ.H !Ēn#]!0U{رjDxpk6i&( aԂ)Jff1v G_hA\({YJZ![&(bUǶRRKԜ?~jSobj:{%{~- IT\WYJP`O=jBT]:O݊傾p 铮`8WG88ܷ֪jo[+[h3s B$$N$Fe1sր=j->zuԞ xڀ'V֪J&E-ʺ:̢cJ%z$*,mּk1`X)"T%W_>==ZZt:pPjihHT_C}i.2\["8 3gZ4}I blNءɑ쭵Z "{w"X`j~A(IbY t/҈q'ǠNF6X2䱔Z /GCķ633UH*;x6\4.޶|g_Tt:uLֈJP6ETIc[Y%|f@]!FsA8;Je^  O]z"ck"p$984"$)alcWjXY3CwZ˽3 ?% %z}&&>;tyɃQ2`R1uЊAc%1e3skEB|FqnuxrČx!9j%pC$;Q3&\L1?@FhQ: v>e[I4Z47bpM#w71J+R9",PДoL3T-ěO~~Q$Az^og.dPLINٶmeV^`c &cb4-v՚[#6ҟgO*/k n!8!t= ,],)FC7;4RjU:v#e . KCu%t-5<1Ɉ UUւ1ai)5Oz"q B/-|ZyE^,(Aq_D(Z ,ޭxr 0q8VNތ4N$\rr7-=R1' Up.,EwWϪmf[ AޏK`&;1/z#6*9fL(6zX')Z'lmkNBfۺwv%"bW"j)uP-ukM,m]Y(<ȶ]UlsYr\Y-ڵut1 +MHDryZN۶M$w)@ÖY 7b 3!$ؐLf^hD57/^u%쁨E |vQ2ֈ `2Fp1"\zelQάbs"ATټ)"ڶ3]+lFxXhH[ P]ڢZk=upۂN煈%q,RɴJkb1 r^V#N*8@ DD׶Uf8dA!=x ~g#hd-HJYƣRzmm'G)tVW{ƾawc(CCTX'wo۪zz!v]d*DlaLƂ PX5"IpAe,nJK4Bhl%Y|l Q>M-ij< ZDR0 vC@Q#'X)Ao7G\+PovxM8zNZlSP.آ"Y]Y۰Qy*ZRxX:V~1ƥ*3z@glTP iԓz) [F|J]F6UTÑE#ROĂ &ZZxE8i%w(~ra"hYfbC։K(#*϶e9ޓ "3~Q$``p=o[fzCDڕ!C 'ࡸǩ-;΁8y^! sr#ᅙ-D`aE"ĶmVE<7WDIURĥ]WR.w;ty|\.]*sẜ5o[RbP0HK3e#f^wvi,,<ʫ0CR):VGu9&-NQM̏ZCp5'1Զ۶G)m8.Wg, Vs"G+H)ELZkݮj9&0+hx7"$G {P(]]A/n] j\Jp2WB JT u IEw.RlDA7=Aq9P](3F=nFOg*_Eƃ}w6kFC|ɚ&Bn`u [kxOG\U؄\Te?XBge{%K Q*Gs3ӲDN)5Bb۶^cD~ǂ\1FX`l'unf7 qΠE3iDG+wy*=G$V[_eӆS,R !%(Pˇ1EȆ>ɽӗڼg)2#Nf8`r[76X:/9y]#bb%=nnqLQyZM4 ɟ͛@Nm e _FpV̘}{0JLB,*p7Sn!9ܣ+}.fDY}\Z)SL2&$فTku>e!E`w2RgE5H;j6\aN]SrF۸sg3SIwoԩHߜ^GD&7npԥeqEK:C9fs3Nٍ fg1&7pe O鸢K0=nVpgR2[ #u]OZ>}!iş(¬<ΦЍr3pAm=ct2gQD|e%*pڰaҜܻ ex4z< |FsBDIITh2 L=v?Dsos8xD椞JƐ:b=0p o#8~3g9"(uhsRf'ơ007A}z@!cdfk-'9fÅmYxuYz?IdTA!k}\$*, 1Ŷ!U(7*GNkl*1"}GtEf2<##z\ﭿ69߽Ku_@?W"~A`cl6|}Fi:*0M]AXEF7ͷʴTq&In$2@mqHAxEӾ؇PMPڇ'7{@w2|A uh0LJ*0pLEdnJhD1J$Yɾh0a(3sEݵY!G (tX4ex2yloi.:6 3]i#"j`N*!. PDTi2 1E/wGϼ:d7'<$utxJqN|C>?oG[l^ ʁZ#RtPtZ*޼E#|SU'IzGGNFxb@͉dû/Pǭrg0MypoM\wMG(NSH+6n0>?*t,AEͧc<[_sѱ" UUԝ>KyowF[|0Xfd{_Uw:;m|zyaۦ ׮U}T0*IMF3F@}^*RW]"-xw6+F"ŏm8)wys%S%7ʑ#`zMBZ /(s!hu8SYgͷDq"GDiɱfODBXo[yP(lmpђ {,D#da^ڭ*+JPِ9 AA/bgVt8-+jF~ xt []4,BD5駟Ow]@5 7A7.p R 3NZ=@$CUWV7}@{w e"(H1{)Բ, :Zni)"#LŶ-q [|ZkI0|o#5v߳Gp}9#y6GrtuܬR&/#:|ӥ)t\<|7o7 ScqȽ _s=*l`ԀC0MSZ›{+eTWPR&9{;"Ψ `m(+HKNp+iYHiNs,ܛ:38vƣ"#ϡ")` 5pԶ Y^il='@ KVܖ8#[* b4y 0e 6>C4;K]l: q-ooH*ljE?,m}ȹ}c^O9v2@{ <%c5jY:@QF4/ 5T]5 g,g%Ch (w{.]EI;4Rh,ݎ=:0aOtRYEp v(0V99>/x[gU؜Vܔ99MA0 *!oFXd1DFR`ա}cVgwD15xD)TB1QkmefΎX"[n5am#(>0 0X:™-bǠGɘȫ1JʣYcZJ؀w537!K9=pF6ly}49?LpAp[F = FvDab!y:<,ܵj0*-bZ؉#kpms*:F%QURJĻc'p7.# vVjrpzD"}ܽOFACݝN颣8PωPZkMn[&3UC2JAY+\5^/ Ddq"1j-\̗N539 ?=]VEY ,CquIE0; Q`-bVC8ĥ0 JWޓpH)亮E| Yb/쮚 ܰۨr0dL:g ]"6| wmoa>L<ߩlwB™%cEpA1t(xqkmuf@'FJ ^Os!"V =*phx5b6 @4R;v<0۠vah4!ZrD9) `RZOHe2! 4RX)0j|E?|UI\#kOa0IYm6e'Ij0%>w,u^zyRՐ6í4؉#-BK擴 |E5<'7tfʒ'2>ukV x&T<ڙSΉB셬"̆-lz={kmW<[D"ˊO: G.%ive=E Vއt,%spxBcV鎛+9==߰O.vȳd4H;(y㔙@rfN 4b''|4jhޜWLf*LJLZfL,*ZH.[$ysBiw[P6’Z'_DN"RF"D3qC@J(!$y|>d'o o(SKR#Ƚa6PtvGgcRD;B#n*ީcIFF r:y1ÆFFr1073]7IN)6%#3|3e K.MTyP\qF7Ƀp3ڒ~U7ժ8gHQcYԾYL:#9(&jpwM|o[d.[2US&9'}OFH"J)%GfBS.<DT>Ë́8F3SR*5{!~ ŬV.u/)Ւ&=+ZZTVVbj]tl2w&놲cۚrw={}K"b[i(a/ff(UfI##3AƤG62z[A.Dw#P_6`&yƸ0 I] 9a+nDbo-ˣ7o|({@s 4WIݬ٦&.W;{b0ĞE1TS1dE0ǖAа !`OLy!oexX( X|d-mBp9oe]%f&l^ 3[+"ZYYp8I}0s'T~LwKZ2 W epGM1pyv椧͉܈SoƏ^c(vqRA\ IAtqAx"nfrvw7.ጃ5\74񈏤m"?`rUduӮVvp'1:! V!cև'5NY`3ٶ2F pAs?5xjG&IF:stn>m 삜US uT#С ͺ?Z", ZPtP(aN[>fRkHDk] 椣Kן 3,iKte"O듈6o\Ykv;I;0[mʻ )".h^K]<Oy9>2<%2:uɦ;Xq`$/iLStl乎T`u\ށQA爐}*6jJYz ݜIpކU03|/jOӝKv^O蝤`N0Y),ax}?(az8 30B̽%n}CF?D'^,A4pvC'ԏqH\̢(? `*?=+vI,ls?;$L]l @3#Qe.QŤHaDk%rA+Ͷ MaFEZj<t )f 4jS3s E=+v\FBunӷ3da l8mf`Pf6,D9u1^ONͬHz?|oFMpU6H,9=ܭdӓ1)k.,Akou[2<"^7\mڮ$O\.uU u7p,>$-;mZw g2Z@Lr H\˓-P/*"Z|:oݣ ekk,Rk崠\׵n~; Ë;**I>,.~|0suݶ[<]lkZE[k8s8:śfɇصW*z\׾8F"Xeߩ ˗/NERUr:U=.s\(0OmU->Ͷ %BUdC 5K)ۺ2sѤbiki}|K-y;зk/k{|[u"4EZ$+"Tʙ=L8(h]XPޝOwwӲ*hCfƺnhٶSںniRr~154\QK5k~w~pW+O(-j"XkTrZro芰 AA.UDj!0'j1Hwϒ!LBaI $IJy4w$0 7e#qӭ\4a"caA'}uqf z !ȰiIa- O3 U2rE3n\қa-@uBNHBUdҢ[VԃD:(6,l$װfvfqC  8a0w `'Vw0Kr PŃFDTög&**Aiʜ4pmbN>y <'+ q RT]6 &# |xnN֊Bkd$Q•b.ܫ@৊H$$\BI$3D|$C%4Ѕpdw)H'Pg Do!AAnPh+:2a]% o`hNf8\f5o.J(&Jq֚cj!ADAj8:k`&/as@/u!5{_o߾/??OZ|{w$I>틇o>Dow8sZ9Ӽ l1l\ʲ Q񳜋D f'_>䓟wgx'>Qw??u__>^)A.;|麜vp/,}7t~|?j7?R| mݶo}?9Q?O~ W/~GdAH7mP2 Ve N6MT~o}|~>z@,)~{GDUUOן?<7oZKif}k駟ezU՗/_~駥<w?헿Zџö_#3}?対G?dc0 *g!Hfz|O|q|Vjf._I)XEfDұf}pagǿO~_Zr{}ˇ_J]N#*8{]Xȑ)5p]1}kČ3eM8|*`Y#/$YOkYg\B|f]3[u3z7!a:0a4-_Zjr06"Q`34uF4<tIԪI^4H*ci[',]ў_B!e͘x$#jத!з,>("rIj\abσv1Jt:}6yw(i>V)Cn{>E:ҚCU^3Gv ^yh -+pX 2C„Ι>OGc'LOΠ;1cʡ9X2艌YIjU#glA0d.U՚sXDa~WD*Ďb~{節NF"J  {[d}XWHh<ou*IE'u၌zc%MHop0wHqh5˓Aged(T.F~񋟽__}ѯ}W^}_|-#<n) <5ZilfQ"Dir<[]xqfա&܍?o>cn_????Ot>}bWQwl,gexd|yz}?o>>x~w^~;8z:=<<= F;? j=F“Ffb4ȩ{wYsfٺ^TEzZ ّ@Uiӻz…)"ן}jU&o޼{'_~mOW UX pkI6LYU%)5!d̊_/_jw&*oS/ 3Q4b XX㾵xv@zFoܲ:(beBg!qrHU9ӪG1N>R:h458؛ʬ>Y^*$ ڶmmk~'?}8h5WaQy|l۟ſGOa6KD*K]9:͹S욵˺F_ևKryx$,,|>k}y,/'1! >bnƷ?r3S&pc~ȧg"Ir{8p^W3;23{ߎЫs|Ի %2N;5P &5 .hU鐵˷@纭{盂sPT9+ūUa??{86۶ZZRJϋTfnf۶ݝG7r,B$1w_B;xl/*Euzƾ7_3+D& ]|8%tY!;™|{.^݇|4-w%~Inn;_ x_/|xۚHtZ.OHW1QKeYٚiU K,j)1O)j:֗|\8֭;`6y 2AY4{$.ߙŔLy8r¹`N4ųW:.c^?}N*@&=hQ 04OyaL>8f.n'n2ъ"Kkȼ#|\`e]vr&̚14X!h8c 7$6w.Xr\ 61m 1qA's=D+Lt,v%ƒ 6w2~R!s~ At'"{i4hD{R0|&ƒWMp4Oͽeow8G8oEkΆ[Xi2N9"G3Y _[mcC^<=i5 IњmҊ 8.|`E:t|<.\Wɩ\~վG=@otE@ENE<}ZQBٻ/Ce"bU-<(gxqЁXoK{bR;R%-8!ʔD iTh"߶p'sԙB_C2@63߶,&"Ÿ 1{,\S=ݝOr*lы#Pnnf|w=E3:݋r"Ń3AD,SB4K Wbo??09AF4hx76B(|B?Q&nud,}X<}Ww'~m3QuM8M3'p;ǩ#1 ,s><:ˡo.F{čȳ|2?ε@Lo| [G_t`8//uݶm3>I93(Nچ拊3׭5 ¢5=/4LDB$Qmaa.Jô#"nFČLJd]o0켛iDiA~f&"ZæIW4mPXD-GZuE_Os9&{gkI\;Ͻ#d G! 0#wW{rG,"Ν4]>]]}?̓;vZ0y,:C3m  V^h ۝-SC ) >\_IĖ,#*@EgIT3K`@dvF5uA5R>\ 3=?|&`ƶBkF1ֱS nY)M_U9EQE7=>`-~Zo䆿k.+?v'5[}@$Joe_CT2Nԯ:97/n=k:[ƒ9jZ ML,(T/ϰ&{HrHTM !>M#Y8S|KSm&%b0D+qՈXEXg5'YiZkoP8L%2 r`%j3T;"JSr.H"G^; FsgZ3k)(D/eT2%Ap[6Y0$Fe ƅA/A7./8Gfܦ*~IkM4d*Jz+bC/]˲P.EB3Pby6HF&0r@/R$Ki. Kw|٦e"9o@LRPq4}-b ^l;0ZC{W;% "yI]stYD%CR`&Lj1ap#YnePU 9e?,imFĴmCDtUV?`fښ~?O~}~z$'#u c=nЛׯվ[/~W}W:7_LOVN'ZW#j4]DMM@ށikOh7_=}D@^Z51zjs+5#ba 3hljhR:8}i\b u-{/~Yfzg (&$! !=B]7*A0TNHYcN4~2FtIh7.rk ϦWd\Xa~[޴ZNbgaQdX"!RI/Avڃw[ppd[K7@IaId&-hXg4 tF7;8u3VP$E%ģf2@Tyg ! KuNbʬ]3=4CRZ=ڱ';cj&a1:vuH!9KŨf)_7="-b閁<׫nm~.[g{oĩ|ۗ?Mk(,%&qC&F8NِP31mۻϟgE:vu$c4'9i+kѹL,! iY -gmcװs:'#ZkTzGTrnPӊRU89#͠*K KgM1xs$T(TqdŚ ip)CP,: _NmL#VN(,GG6+"9tKne"kXD! W5vr+{łZS, .#IX㜭wn Ǽ(po '41@"ZTcNLˡ=e_H]4΁rn(sb:Nd-LW61Vq|Ag n5̀5Z6UMÃ=>^>Oo?W<$g;I҇;(1ȸ]U+\JkjgmuߵYɆ ?&dgvGPGgaa%[b*QTnhm}`!e^Nַ|+o 'X{a PȥA qrLį #"SgqYK[ 1(df잦/ .bEҕ >ϾiDv9স] 9Aj@Λw*=j`y~ rb>kKz%O/O=;.ª^,Hî1 5EǭV>l?2F%`2fU 7suwdDM(Y{q h1ˑё sdxz_b58q´ZzǧUKDjB6=f..=<<.A< X~܏1JџOF>O_m4"FBʮLM%Ee;LCahF6*f.[ѩ:~-KtUJ!s>wpĜR&vE>-5]_7Tb_y6#Q15XN] uo\q3lbf+JuZBa񎼝q ܇#%D>sHx;>C_a%HyzZy7 ̘)J=O@?mfPPLDS- 9w,n[yj;FáW}o' gqA n͍֪r_4,W2r$]DTA<6k|蛚#Rrf =zG$6M)et4ݚmf( m֭>Zvx;&6/Dg`I(ȥR?+uiTmx5=>=͍@ݏm_JO?/M5iˌۈs!pSm5fd4M?Q]k3|!҃A5` *bÓȜ_,;6Ӭ-db_*+bĒhi§XxoL 3Ҩ<n1xc#sz㘧 MO?9#2zyEI-".ږ{^חk{{+S[[LUz@YH"EԽgI=?feT3#@-9KqwBLQEP5r},JJc`XHZd2ZQ\U4@1*rdXȄDŽHD-S89v%eTS$EHm*PuM!$EIIGNޟBBЊ}л<ʁ_|\D!pɝBk($: "L~,U^'33sSyw8+I<WupkDW >F&qEpFj!^,-¬&{KzTzgXR9Wգ┏Y3.aFMv6B41ERJz `h!0-w*NOgĢwFZ"Zk"iɺu($r"jm{H!G/I.(~#@1̉:4RTIԓ7SYW21sr(c[4ϗ>Im^;/]3:js6,4 )ς.Xd6}]NyRZCnڛ~pm3YucUѠߝ%=DBTC6W2l@tbrtU$ RW=BFW50T ̖ɹ)CS "BDg&.eܫW Jȑr=22l[.ftՌ1*.gNZRqV5Ε 7%`Prf 7Y'$[iKOgiᅉ`0L0Uּzl}p5蜊PY{̶ȒaE`=E0'[콋jW1{<`_m}黗7j_}ߟZ)CT*M =<e SUWj:Rߞ*궬3,)daK3W"NBތ ԕ)Z$ab*&Z2s=3-*6'-(oYseSRu55OSĜdD ϹG[E;Rpqɒ>3,'ԵˑNJ!#ẙ[nU .gpOS E:HE1iL@20 fˮڿ9z'yGptdR/,F;KFl;ɬZ8.lXELinD>yOJ3c0k@n B$S$)L~,r'N~m .qG1rTsb}1qmhWLjD)S3";F[gن5a82m@%6ͣE틯1Q˒1Fƺ:-[,-'S I BT\_O^

ĀMs&XCca ~E8٪kS5ɍ Fay^#YMI asᕆUk9̭|,&c1`0ʥ<:CkH %랑Z2!;5i=SP`E4޾)rFc$qBqVqPɩ(9i``̯q#O#tE9)ɤJkuRQ~d6eL!x4!vSU+Ķ]dPbb&.Ж`% %DFG.bLuۀgIe"PN {ζ_F #q~<"]uLaq3 'y@i:ꯦӳWʵ,j9#L{yQLJbl_GWw֚5+)G\.[ͧߞ6yppY#vU%=;w_hʽWW~|Bgxz7_7ֶpWS="5=*˹u86({8='b"S$,U<>xw\NtJ<̈Pm 4jĈQ a.%qP4J1RiGAX hX܁`rOVA MjDkYcMaN1FzIeL9NR_u-ק9T@,]X~Lzdu2dKpf;1F>``Z5EJ w tz\3z=T`<0U "1w*,s1UD$<WhF/+5NFǶҮ! z9j!TU# YNHt MlVq|!؄I"HzN,/V*<.O%Ȁ^ƌ:RQaԺ\ )Ѕlu|Kvs(K]9@RowuP Q6S,pV.f9L!L۟G c6ODVa[̶b:{oNHLo=b\ߏq?> $X;,6fTWgLF!Em *$qYP̎TN$RrHѫI(:L$z&/:ӧ޻jeE \uTu tWLW@Z+"R]v ͒/)&2*9ٚ@jp\]VqĠd"蠊Hw9D(ɲ'Ļ'1b-GMK5lZ2õ>r7IH+r؃Cs ]Yi Gگ eN"( ) >jY y RQXMj*7"0HU0* if ,2LU;ĆocpCHN"G#JUF6H8J-AݤGTGKw)j}6&$6:c&Z(MHrH&EVw>r_Yb?U"7:"GS|ng{?`< *OC`xmW*-rX8f#5U؊q0Sof35?ş~{oF@-s NɗL@!~) MvvdDcVPE SċVA# \&w y`floG=FV_.[yY>EG5Lp1LN΄AG*ۚ/,=&|:3$m22;Imx)&3=%Iȸpꓩ`  A-KXMk-/IvO=[:2S )ƛg' QĉK~2蠢J2$ }у<8whWr/RK&$۲EMeٽ ]s  G1u8sՖ'1!Xۮ %X)"⅋+^+=Au+v26L8:It{tiX?iS xdviqOoDeX ,).CX)!W/̔i=NPE"ﻩhi:&)rNҫ@U鑚u5XD a"c,E/ٳ_{_k1aYC1Ӧ(Ջ﹍f@I\fˉh ?8(\gsaϩ]z20BH=::~UF xjs1M9zL?c|(1ViRW8TVj-S-Ghɜ M/yJ<ШyjFi}%ɏC4{(`kNMÔ6Egvn&A4Y4k aR'Fe2+ 蚎Q$Ekߪ拏);ATZ#cD6S![ky=Tb61Mݪ*8wLKw}YD1`f[ W{|u1A^tJ+ yg!uYxOI ɥ~l[/[xnȊ*gnfV(_SG!,mXXT1SCL׽Yv_L $H'iENU޼V"cRjJ%v\qflf"9,Vj`^7$|kjdVo fwx$R3Dx4FD'ݩ)RV&󸂏ZhPv+Qj?ߜT,E4$"Ykj1 *{ d\D2fWӍ9m_$".֮G3—jTH"zM(nRk#|xzJ=Yqʚ/S^ "2}yyG`[*Dt.Eb NKs&C>/<d(Y4t~aGCO#YRNReQDe5*#9;X[0mbYFd΋2| "AEFU;c {hk9TfOgONQR"ΏSFNkDM\DŽORb5F _j 8nl3:AId ݫJ; ai'y UfV^^NFY8׈{&{=z0aMW):$DH;C@[1Xo&75U(ؑ]W![z8[YKR M%INfR󗍘mUK~GL_0ȼ|=\DȀ G,6SGRz4=ֶ`kZk M&E]2j0syܘGZ62(S9\+%;e3?zɱ UzJ|<8knb:d%NZ82~KŨ t ^p*uAmd4,lS3z˰r A$kT"wa@wv5V_5LӥBFEq?> 훷0K\ʁiJ~JRx11Nrs&H>T1MهP3sLؽ _#@>%4/؞Yr(.VQ(]޽{?`9=Lu䆩sAaQotŲDF US3ͤQ&2b;V/Zkf{vqR""lkmSU!]u|CӨ8J$<#záL꾊B6rGvCbV@~jF̣B ޘTOgnRTUkM+(TZDREv1,\](4;%m$5䂊6f9̲, >-6j6RUʠ{w_S)5rhVqexd 1%0\$ݒw=b G{MTN.wƒp#" 9X}EA*wz:^ڜ5̛u3&]/חN4m"ٶx({b]Y53v^e*q?>A!}_u 7"'hݻo:tϡF& ||/}̈́s wQT[(!E,)[)PGMj.!#|R܅rK''˜a<= xGhًS&`"q^ۖѲbu1 ~5`fu xjz6G"ff#ֳɁ #3=mrtp'<\Bn0*o(#"Z?JX6Am@(JI1DthCZ$\bSpZDҫYft]D`JUm =sj1&} ,,|ذq$fJPR Q/ү$5(MaZx{' gٻxN"S)Eϸ¶}}wSc-Z*r:Lf d1!$LͧQu""I4T FK,Hb'0Z9əXHiaRGr]I\CI&SF5菍\1XQB{!zHBCN75"cOk<:[Kg H\nݳ+Deޒ Cr,Z EJI"w 9 !U[E;y?3VqVG-FPAؽd@*IY058̚ IH/N|fI2`pZF2F㺏٭x.">c{Q]E}4Awɬ}t*- 6kWgy{3l7E/1sJmFt8#o hzDJrz*#iJ tFEz#Jyɯ\]&!Ë1VS*!x=ckI$z-j$ܐ S[S ꀛbq,wsaAA<G9(p ޽YL]Qf'QT"V6kO# 0 F+,VFI_FZs:H5̄,uHMvQHɾtA1D+7, _ 7{9͛qh~e}t,7l^v<\ypD_rܶؗ_}oۛ$F?; O_^^3=o/1[kF6aER%:e'OS ^Ek-]՘*g8`?sPDqHB1JrU`.̯f [R2v&3%#UU~9kpYzj~$ׇ `dȚ M4D \b1ٗ8 y#t&džsι`|Sg@&A-_~>|vy2S!<.M#@kf٧oG1Ӳq?!b;ZNx>7ODg3#Aצ9qOzr99drs& c9I]с$QM:ι~LsD nCSqftuuNl8GsD>`A;ֲig;d.3;M3g2fKC瘡'"˄W99Zkd!ĔRr!" .?>.GHĥ/d2 QXr~qB)$,)sXtIJ ER|u?+)+DUxRϮlF1\ 'lFTCfC'Wd=U:PW߲'BcG8T1q뮠 CWIͲqZZ:JF6뇥s^#YZk͚L=fD~\;:[7R~܏07۶ywgi=QgӇ2^EZKDm ٔ0at/@{b{wF|7k-\9ˋ{O}uA Tʼ+q?Ȇݫ50|L GU:уN8!T`L!s%GSU38& bM/[VMkIFDPumR2R*{V3 zE="4ge0F1v` 9]rArpzU!fidGy0 te2BO6^YXEؚ͠bԍRE@312cM{ER0c>0"YMZ) إW}lm~Us}`|o\z'M?k waߊVQUB{&ؠ]B! 8a7AYԬ5trN3D<>>eCfSG9އM_^ZikfC˓Cȸ6sOw^.K{PKC]+ y{߶Pj\ݩ\3&Fݽ)6 l]FSM<֒_1!mӪnUTfGvi*B{Ƽx8#۶-sٞ9DM#)&M'7c%W)Iy)nﶦ*/]͌ T3H{s0 {T_M7mPU1cH%0+[P)E" n! Msa֠8U %a,دDl[&|FxC:=s I(l9 *GW`"W$"a]LTP$:]UTm 3/ .P0 WQ!ٓaaFJ{S4]ᾗNX65_s.M"%0 'YHI䝙!"v33 ș9YYcXYeœ`+=nS%6Xj7]VxBfyzua|/?$K0{y^X=?_<=M9Z'`/p}*jt|ɖ z-W,1{Ɠ%ԍ|.·‹b%ܠL]f9XbL !DѴ6ZՄ?q}™lqH=DT-ةIOfj~x.@hp$jBvCO O.ϕݪ~DY\rLD@EwiD8Dt>#C-)E5CFi:a"a]I\[tM\\)]Vjp+RͯB>3q_IufrZlh3Y^W9Qi JY)BLTc^5^O[5X8JF?dr-x C%ANSaQLxD*D0%; P+ n̞bYS2;L<ϛe^NWPO\>B:~͍Bt|?g?~8O>$(F9*9g_w=MWrIrPSkBK8LЇX'K>Xki\\ S]Yy;9h=3Rno6:6ɝ&!P.f#6Mh $R.g.Em@~e] #Yzd 6P* Wf ˆDL?Cbp0+QQ:[sSL<ǛYRBD*2ZrYQ(2udE 5hOPrYƱHGOq鍇"ݵ hp8uPbM@8D>vQ V.*O T5+SR\e~TOC Oʼ3]K8/PѯxLhA}c~*un:~]|ۊOǟ>/Oێ߬ ?ϡI i"伟ggHY-l#kX_`GX÷X![:^ǯQ&2<}Nc@r#wv||D|{DI~}ɛY֊E˭]Z3ő>{uא]9tD^>ypȺf:BѴRĽ ל7VqUl\MԔhe^&}9V=M1*O=97 boW2J mg C("N[@޴>+Y>`-$PE L%?8@\T]F[b 0O@py\SԴ2u|fL1b$ MNb^o4L.S q{#D IEoҡkB To\ﵖŖ֬jp(ewĔCJo6~WkP$kjQ;T1\xO azdBN`%q!&3R ϟxghU2Jh$  ?U13H avE$ 8 `Pkhdc (ژ X2b[43s%_b*1fӯ3Q H>}橧ǒ4bpO",s‰, ˅*B(4j}ZBR#d 8 I(s q)g|jV*/Gf~cCELQ>;w8x2DB"ΨN  ;2-)Mu0C_U0"uWguߒ`xn1-SO΃=vg\Lmطo "s Fݵ,d\`؉ E)gISù;Ǘgw=;zmuOH8|teh5|Ix42A3v>D;O;ޤC%>4qHFv!ehՇzi]k燪)BCPF(%iؤ$dԲɘ4/S!k6DM5 0f*7 E*L*4FDhw9~IFXv5fӣ-&=n>ՏUUeBi`VWM* j&&5m5leUi[ TtShK *sh5lDLwaPm^ L t-YRk Q9nS3;y-Y`]|IOO'MjM3-/cqk(C3~D(xÊۈ sˊ`,}<}Bmң-፪)*,)CD߆vB^=WPfR +%~E&@MU>?'Dq³{j(CP( s,N̡z H͊!Uv)jGpA&C! |n^L!/rEftgU[`[g}0DMUI@ym`{VVRW_[pjWj^LvvS Fy[MG{XF=Yq 5Q kg??ϟ!y#6Xrc&w ^u,4a̖Pi@}a6E"1T8ϓGqX*SA~@%=pb<_SS[ڍ=ׂzy@NBv# [0Q~hvPEmZږV]afl\*T{qck#2f?듺"W{P3B_)"a ̔tКC;c23Ԥ q2Pڅ]Q|V6Sn:Jѩò{gYYUĈdTcZݳ黝]9^BcT*Wr\+KZA d|=zi$+FX̊ wak JMAQ@d; ҎD $=N!!ooy~Ns|ps}r-QVu'ajwh:}*(5=h#WK=-Xvx{dTAb;-I *YwyaH5L>$Kr˖_)(jk=+\S%[NR Q'nG0zԐ7\Ƀ@Y*X1c6mim L#w?w(<|X;l @D xXu6?G&EƐѱN^0ɂH%ooﷷ~xSGbVѰ&j# kZl#"Ks/)KNLPufmʓT$O*GZ-U-=IjVAN{(k`1 {FܽDG^ "DvVj!I ]@w /||YB!$`8# L'baΚXQ)ئj%,ALh)Y2hՋ{XeHjSaT: \IewcVe৲^:P!XU>P{Epg*.0H"$f*RBB! Xx b@<%NPVrf/η,qlX.ϡJ:[DtJ?qk,w7S1l+"DIT)1DtqCQ B1rKq?gDOO&?1QS9#f?bv^f:~U~1Y3"cCуifFgƇ$?C@TD$ΚB:&"Ȋ`j6d8aE)GpFIaDN`t?\ZI]!Qjƻ z/tU:5S+Ͳd&8I`6lqsf4E"9Qy '+E6)`jv!ՍP]a/(2wKy2`l"aO3(v{BT/ՌxaB?xeɑZfkPHL"E*5=@LRrA "GOOOМn,\EhAg@ay*B ܳhEHePJfFԜ |!1L[CX"2Ae= TӢaj*8Tw>LHd s< J@ L&">AB545$j_ a?"B$s!)a7av >ۆ@~2PW:^ǯ7&~u暰S; :nyy)~HʌQ⃶'hVDY`NuׁkUz?uE7 u߂oۄconq65pwUcԡBP\N-DvoU٩x^Q56b=P6P '/7|*tpg| T乇f6̬BԘVLȽ& KFF1:O b*xrUH݃x\p60Cg6Zr1!b"qa )VBY6 є-cq ]&z488/P߾""3C?ΐڏ|rȶo"lKfZC] $,jH,kq`һ@n*\[c\7L`g#BժH—eYw![ [ k:\7zdb3xY`ON&J$C=A|߼Huh>īz!dykw~-0ۂf6Tpw@yQCJݦG)`I]=T2³cY%P`*gi!}9\kq/)g/%S kX7EJWJl͞9L-jS%c$6)%9~aDzټ|RAt_5_%׃gAg/$0obJU*~7 N@z tK-uF/ZfMr͉6*~Kff3hhetf6V @09Xev yZeNr%}UUvV*ś-Td"P_="(kAmU|ptU"+!Ь\xU+x& $ޝ篟~?`MQfko<#)&* d=75W%1QY j&) nu_'1B4c^xnux]ҊV3 1l<B80!Kߘ#IU}VEn]5ġ:'ãԃr(;-{' WX%csBWè^u<%DKDdJ FgٷnX],>LF 31e^s@\%Ho /Crӱ>k8"i,RE)9OB4qYqYY y;e)GTld?UwĪW: 0`csEe?00'LZKz$d9N{Qs>7,@!GR{LE/,l~j};I dʊ{(@9$8 0n$jpOvRY $H-ecf1*d鞩iҲ'4So^MǼdfPU/Rmv u=c/NDwTXhR{A B t?>??Q%J -ӫ0X̀/#_*&ʭ譨f`ȁ 1gsBnGw|}Ghu_+]҆[5C*&`f䜎Ǒ*i" -H@A@ҧT4HQ³qWi81SS]{KV'$+Oeד(I riK!k>UtҬzKV5:<˪dp{J|@Bsj) lXZf]+ޚ6S!`2bbj‹V@0kvRDDYDw2 &pV%/GMT6L9 )%D-p2Ω [D\,' V"&6ƒ!: PuA`N(bEQ#܆}yy6Q?p%(^,%"G@O5J-2P"LIh`@a?ϩ*YcB[^"<8SZu`uϲs2Rv+V L$lF{'(͝cf>a'ȳHBƍt#6{@96c3'JR/ ADIь>^ӆ*j :D)J6yIڻCtٟ;%`(rC6P݅:k󽏩io)c窲**c >trk 628ϴYȵm)e. 0kc+svd蜧Y$3p;D@DhW.SgVTL"|r'9T5> cWkXkg'R rF[ "Py`IΤ*?O Lu\Ď1?6!F_Yӏ~xƕ("g`~^$V_/m6>wZnw͢7+4솝ۮ(1n >͟ (tr{ U4Mx }j#J/cOsg0YνQx^(5,F@l$raXϫq\XkO?Df!!kIz6+ Ad+TTT|_^{lK3{62 읳[ E$} ]jD.Fv7ȣ0rqKkQU2NB@z_>!BӨ~~}rE!za2MmWPf` e_g[HN`3!L$*I"ef_8ttU>Sc#ӫR+nYf`@/  V,-K:GHx~amwjVJd?v?_:~G@ ǰk'W洿0 Qqj pQCtDaiUgG4*UcV%2PGlw-~OSl/Z)YL's[Y}iIL}2'yXU7ε:\S@Gz"Yґ1P{ Rs̘/:%%"bD2Y.UF8[e۟+CH:K\M[eWi?Pdƶmiz@܍6r]mP4;ET8NZ(Ⱦḓt5x 3 1?83CJ[X!bP01TX]ZU^W0TfuaJLÖ OK^UȸַD^1'd24=ɢ<(ҢaCeACc53C$ӑ(dM~T/Rfq= * r0aq&~zxnr>֌n7,x(y$u&=AȉΌj{ ^]5E+MCv7Uo_Դ42̈^JLYpPaQ f>v,`MGPU~}mذ!"8T C9{0;7\P xWxuңr!g2 Z"D<p1:穦f=2YO퀧۴XK={0{qr/YRpsHT41OUe0S[̴!>,ÇpݻW˚v99doEv t\*ro2Ltj=vd ̜41bё J(gә VrL@JH*p~-f-ChG`WD5+ àAD0I:^u)> ȉpAE0J%r {%H4-Lv:9K.o:[#֌[N8enbR3 2@ (ᝁzGUPelm>~h<46jkAͨ*Ra`O53-"^S~K֊JJ bMgJ:< ebsBm9Q#g!6W̅jzӏ7Q3<&6Y~總!rB֞:~+e$Ȉ'>Ynŵ"21P`ZM]!il޻8+ꀈ${^<8ci6̿ۖ r -1<}UHhkvIrlՙ'mbX'U2{< B͈dd·p0L+'3WD=D"ed_&ԎAe)uc?PUChR@dJyL %&2x!ŦĻFFJ+hΝFJDDە6~:}GݶGP "2mOyY˱});`@Ba*?av,Q<4g2="f]_i;Ɋ ݿ}@tK2;q[a8WTUH,Mj8 oؼ ^/25szj!jx,q>ay i:1IzLjdyeynDwcseQ[)h+i:[iфo8繗MG߿`xPl`9[w"ID*X\7js_Ty{gOd DL0%+N`T^#Wf[K$l*2A 1(r (%ig<"qclVV6yՏN+ եe^HDjPU*K V&j (6A(寺<(([U!$ g JBtBDa"0#W^](SE!9秸p~wӕIz<^4bo k24g=W^!? j{v-dmIŖ\+4S7ezY14uf}˾:~ s'J`0ƀBKsN)4,9AMB,Oecbav^50_d{r0OR<kSnMZlgȰ?j %s_x"o|-zI[bMnqκWoԲ[[tš`S4AڍI vK$4Sg]%cf TAZE̫" jMRc/&>hС A@ӊgfVTGIandSLj؂* ڋ h UupoA&d vDeId)q]P}hU?_y J ƹP]HdAT:Po,;%1 Pf&6\Ff7'=y֨[jIœ =Vٴ]D%(qa)i* 01)NAB ՐEf\:Kl=ct;TϷ{ ;5^`el۳ QXY#7"a9߰@;3T$lxeCgB2ץjEzV ?W0b2t_QLȏuN(9a_'J1n i9mq^xbjTiY /XO2-Av T{BB(,`MUD,!"ބ6Ak4DC* !)TSGF?Y TnT'Ǹ騅8]fl0|;BPfU B$O+*3EOpNfNu"9ɀ$*3kI0Dƍܴ%˺=aP2:d:ɫ`RR½T+TмX"LW\UOɲ'QDΌcxlM*&5#k#䡚U8=trF.ì#YDX7ٕE#<1vBمDcx04W"&RPl}ϝ ̫Y2Ä#<]:4^ղˑov3S)Hӂgtt"͕e`Xh~5S\j}_ӉIn: @"I_ɸ@Of葺e8K*:g%C-W0Fi?ʧ{p'k˥2I3,[sRLoL[yKHl\vqadWUU450}tT*2gƨ0 ERZ܍?P['1w yV{Oddt8]DCuK;Yv%(%CʤtpT`1t"SBǦ]кXbR_&2 Af{b(T)A9 $MOzF@ЦYI'i̊踤jdJDqĐs}9ueSE Yu_qsI`wRl=/?ld)"c ?nRkx.sB? I˖g* ۳\{p]{uPx6ʞN-Q$LCBаxAfn.n]r#W\˹hLR3227 4(c~Jm˖u]\0DxLJ$9WxGʓw%'z%h"Lm2C[dQQǼ?*e BJ40z j(i~ $BiOsWϸehDyR±|7Ͼ˙ \yNQd<-^X~5goj1w$uy}\w?`lg 3r0A15OίkM?b{#O?gRc``iľ߿bO}Wu[_??o((d^ Wj(Pb"ff1biE,"/{ ܗplZt=qJVZf\~83wM>7ZHVRrr߱ 2[9TՑeKwΖiN/;DDeA z\x$5A(؄,kRə]e%QS䰄dZWg*ջ^K[{ӊKk^ֽ><ڜ 67WYX-Sh^KxE=Yzj ș$HURs [%>i=K<"Qqa'Zs54uA2u++`8o~8 |N-`ת9Bj~&E9ÕSW4aq @2?M3-m%gVℯ8HcԞK-&^`.dfM4"YߨBp2'g vy'ʲ|+F`9 h+D,B&4qXĂ @xP,E5QTeJD)o3+VE2g[fL]O]fH 9]\ >s `Gx[5=3G%H*4 ,.AIu!6$iFQEH&8 sBmk6 j̉@[jճ=2կBq_JWW=֬I(ɳ<]\;GOO̝]\ҷVWX$6U<2 Y[ꨜ%_o-w~*v1ƫz7Ln_9&̘6z%foCb%H*~sy%Q.xFk*XukJr:/ġuUhD`zY )دղb%)r,Jv^&Vane.ug~PH&ʎP5-65c 7+Sq>:FBM-Qi("sNVJ̕Ǯ9A*k4l R5Cpq!va#VK^Q7t)HހL @H ..6vÚ:ܤεКI;lOفmPli%eRYXJrKĉl$_M$ѠsoXn5W㓈/!{{ҏU#~~+1sT!QzI1 v8 ΚNPUጽ?s?Oa! q!3<]l-HB8'y?+VO?43+ZbMNLd8"MHy~M$\!̀6]DKޑKI=*GBhWrQIhA YD%4;t5V{]I$noqoU7{f("D8|AzփBE!R鞪lY\o*+;3n;۶Y#.D5_?J͊u#Bk=`Jc-?ך)[v%k2@V" @ wv!Z7IGٟh< HhDĀLx"']9OA+3dRy)2#!L0TRoA/iD$j 7pә'-=Wn5b LjXV6e b_wfق? eڟn2CQ5nvK uN 4W LF̙FrhPas$[D 7 .wV`3- ގS jOCs3qв.z}j|9)># ̂e.2Rw_$P1Y9G|}D \ K)ծ>w_#f5Vs>;CJhxSfmtB>lg;xzn#^Zl,Ջ%*ܙ黭Y)[cth{@Xx,7*#rë}Jt/lpC{O2%4Ћت*Pѹ&Efhaa"Q-; Ҝ}8Z!̀ TOE6;ww{峱\*~,*+.Sƙ”J&J*z1YU T@AUPu6&҇4orw0ۯ'/ֻ%^y+=Hznq2g4"H@W~%'05gB-" DX#nh*ֱ_o{}s&Ơ?&U-MGf̐EWNNq ) >'yWx7mPn u= /PK{(.]N4wg LS%mX#Kg5뤛g/X~5ki/^{RLe F )4{*;o}g嚱Z WKhT7(0)ߛHNmzx[5ӧ3Gp]îʕ^flJmh\;xtKXȀ[[F.ܰŠwW j)#UB Őej9XP=nf7m҂-]Ywvٸh Ki'mq1`Az<`U;fvqp_M툈nu+;>#*vENFw %X;EjNg`_kc_WŌ8}93"if-K_i9svVh2U׷t(T^>pX1hV{*ΧSXާ{Cmq 0^ 0ο^k?@7ܜJliw3ݨ=dm2ǻa+LؔB]#|x $|U D3ħYm H&o,%)lvwxM>]ūd)\5 ȜFe*fD' D-10QEiobK4GZ_~`Ƭ6k.lU)'`8(%dGe0zU}i]UުEjiLʬ7^vB܁)ݵ߻+ތE1wTʙ0cNܵ}ufktCtn9}k6e/?ǯho9~=֗)ݏnXVl$3{/휾AWu~$}"^<}Z5]3lf.VUemfG /`1iLo񪱾ﴫjKۉ@SA[&jVdTr[]˶T秿}*+EQOcXh4f8h4|a,!6M5 3惾{iFM;Q ь~ ^5d^7\+-!ͱ'|)YPVaJʠ%nO.*P]RykwtYuz@W9H:+Zm@E{ΪS*!|b3{STu D|(a˷<="c^ooofq 6E_VZ?o??)۠[L,}{~8y1#{>ܐ9xy<ۛooN:%HxH+%{ɡǑymf\!SP#.-"FJWUXU$dFd pnUhe9Hqل ִ@yI;1#f`^5W;(=S`Ǫ+vɇ*dj%I KhNz> = .7)S)Ā0ʭ}Gr-^d[+j<'$?F@ QN#9~>Hr$HW CǠ=vS㝐wd췺v)1OT .5/:*S/YuB]bu-vض*.rsq#6dD3帇"^ٶz(xul%Ұ/ӗтv(nmRXx_7 ݒBjS+o)-U={fLCD߫C2s=h]s 4|F-LVRb]c{s{͋ %a$E3VЏf&$NkR$:` ۴x"LXvB:bE['7PYꯚ8,[ZWnݒm3JBd37'D%ݢS8Ȯn~+e%]_Y+mҵ,4B ejFpFĜuIJ1Ÿle8qp{ nΰk8E (&fa%8|!|=_Ǐ^fa3^=Ҷ$jU9c</߼ߏA37V'f";ϫߙXUx석&EŢ)yie&}opQ_e[ǷmO7lxfVB7>embx`@|*7&w!=5܆\(+i`$y,ibO7SJk), R f߬pr,j$:%Yͭzm={p&±\]wYÖ*\ql;A*p$dBYs.TQiƚX.zi[׻J 1P&tFKL=f a`ιUUl$J#Ge"ST_F;#qmC爐[I!us\E՜mƵlN eu>>}{f6 H=C@`U㲊n2L@%VIi7(QQs)^o=,krĶsYFlOگ7܀1|67b~2xYо*^e ~6~5/NUu*'_c͠V 'ͻeRasNf$IT`Y_FV%b/jT( in +ux#3\VPJG-21{eSm^#+[9`h00 ܪ:z4u,)IDR[ཌྷD.tc*z_pnI;]1ƨy9*tGeXF6_+V?÷eX iVTpX=pwH(FRv$)Df)F :R*@LPl08)+<*.iV|0V63fNXՅm % Ghysp  /n&Db򲛧XiC=(|{>ݬbXe ^a!IW-~m @tKL]ЬL%sΌ?3‡שHUyZIw@?@L.b13f/sΟƣLXq<0>QXc1_{1\,SҌJsIGzjbt4'Q0f&3i_v-GlʂQJ䓑2pd~H n8 `%mfEB ""f@i ΜY[DBx{F2s*(EavN(44-JnϝOy&mnT+n9OxJO, z ۀ `!L9 ^(Hӻ3s ^V.n[ÍwU]eA8Zs> ?d&YfHH3V3|Jg\-LT&,9O y(T)s6br7>r_@dWuÙ@ʹRRq1|2%:K#K:3XikY?99<<9'c QTn+p?׼"OH)xMg[zU2/dCYi^Y,%t?=lú+8 VcSx()\D6pt0\.#(P#Y\%,/m /Fvf ,|fLXC<_hc!#"H+joHMbni@W68aWMv*gsIDkl9VLgfݕ%(5̵ivJZ~/ML93? `]U4QRz;!^A7a,y1,5|ӨmCxaSJp.V9 ]ɵur)̬AxS߭e;I73ٳ; Ixyfm+Qn m2<?\/侴=!`FR_':R&i?8xktBN"faM"wUmٶu!qgTܿs*_VR92ȋ ([R\$ߙjKAi3l/JYW~CK>2E@M7N=냭sL 7޵WyD̶"i9(!eW[4*]U` 1O/{Tuu-N|(WTu]8xa j_]426ǽNiseDQ]=e,t#N%wB˧8{z0բ~ ͸2̲M+ܶKwS@/uB%0̛ȝAY Y5([CQ0"4iZw7Ă2VMZS%TܰSWQۇ5V< i2{^J1бSb% KOΣ7uK ;gnI~h>”{ -5=K0!yy vB>"uL'r%̎lݎFd}Dvc.ܽ7F"f$~TTN͹<hw7WW!xܿvX[*S$#B"hH$dkJ/س-`u[W1xg_UfUP] Z@AVNU_PƼ! 8ZW$Ge !bϭ=:o?vd_29{TFk'pwm~_[yEE c*kܲڭJ.nYSu 9?Q!.;tiS$ Oefa\n{:bY/;`9lzE^ 2]=솜 O,sNkmŲ[9]o"pS &e 0 9.ua4)_~~<_wIX˟!bsjKA(R(A"cv]wR#_X~bb&b[{ P'7hMdTIazfFͥҹH[p/k[BBEoGݻ}A79ݔLx02Y%XhfZ812 Uz̼Bnl Ŵ׏FxZXPwx?'E&Ѕ8f6@SB'dn%osXpjܸ"'dg)g(D|@pR6Ssjst{Ie־y 1lӑz`+ V8L~ M^i4w9SLeKT*Sl-3\6v#]yV8Ģ(ؓ`L<4CIDS"I(ܔ̼gJ{^$ x|hQfJaCW8lidbDH,HѮCK3$„RQcbJɑ U'9s=*'fHr3d,n!1(eO2X$˲0! *Bi^j 眿'c%s""![fU<);9iHS܍6R%h.9sE\٘b#S޵sL `f3bUڽZUl:(lcVW ߴ.TD<ơa.-vO0q]QN7*i,4FqEu TRC[='<;xj]fZu8tlg]&I5LL{ްo/#pdnONhf~gTC[I|]A)qU;ĔskrlXCmRn^Q*4 u,D(Q_ʀ]!U֥&`25u="WPlCM+)xGaN;F!&a68ƘY7weHWV&tECB`bQ.]vdPԕm%lx<8ܪd˜IX-m[oJKu)czU#>aAȨqu)X߾}{FX6Deou|_Ǐ^`~zp7q&P_"w2|X@KE1"o8Ú\@g%POoх _e ,/ [o;pY-,CQC?MWwֽc( P.Ues| e9˃S=̎Qj !+|)+7Jtd2ۅv_wO9Gi*#I;hJոaP o[z !u.˔%QU[ y{D Āufn#Гi+woH]E=IcVWFE-: f|GJ燁>>>$l~\ӵ'؈] [=@/}t8~,I@vd˴~D 8$kihTDP]WNk!{ |Å?}ڷV#&m;6EǦu|?~~vyu9d )bY@ʵ|3_cH:sXѼ"ltRԶБ9ElsTYN%؎ = PJ.Q 4*jDlnpA}3;3 X$XD%/|V(Z|֕&H(u/o7Ҧd朑DߕE!rew)v7) g19/U>AD23>h~I]k W*Rʹd4fn ϊj`Ö`Jf!FfFܒΰ5D/XyI (H9g sw7w3?A̭!CH 32V:Pk% b_Y;F^"]/!v.ի-[.sbΏz iHs=’4|WVpq9/ADۤ X_w'"{)-+cżRY8W?xR%YleRš[K>DZ̈-Qec|ӱ ݷgwC-K_p ?e~ޜLɎ#a %kG Mc ͛,Wa{fMQ+'?f,sTsц^3avZ|fI#'df&?(.*J=g dbqCT{VaM赌+|KjKR2]!uR6V"I3^yUD*H=Jb]U9^"J%26[7 ( $.ۅպMrԵ~kQׇ .5˾)[)L|7|Q\ЅEg"_ 4cJFd7w:=Fq^,#mkhUTO 5s6:E?n8MEX>:u}yڠ"ա{Z+k.[#U)^/^و = L7rc ݎ ]xnb)./w^D& }߈H׋CQ#6]#2 w^%C|.8=ޠYV1,FUJi4 :TrjDKh(8fx %1c!md^˫ɾ \.ͻz[I"M29X0*-AHz_)ׂcC inց 7YTrOh LSWݏ].+srΧ1v ༕rI ۃ') R=<2Ȍȁr2*O3|\uϷb)U}p˨-qQ¨FZI$9m#3tG8s>89Z_w"} 73C5fV͇x<Ɯo~f|{{'3>˧rXf "yh&ۤՏcw: g2Cb, x{mˈ{n>j w+T 3;Њ(S&J-^R## ٚUdFiOi L3`eHd m [0Q4yL^a3( w:YIfcD419sy=1+XB4 l Ќw?H0g Ns`fQF#sx,@dr13%E }d%JGK>Lcnj 1v4I3وJ eՏ9*ɥ[d4iT)deV-Fxw=!!aTec ũR@d' sU(z"TB&M飀 ݀JyÄ .&g:dY5)!bL]%<1hq>L g4aΘ[|X טɌױ&n nC {n%?'.q[bQ䚏Lg.|>8fpSd Ap\inQpރك#f"exY~7\)Y]3=+z 3t{}ށX5ihffc1{ϬV7=/w)|UDafbvLWFdH^Y>z{Y O=Pe/Ѩq ʈ37}7Er bm] [ΛZei۾sXZ> QUBՅeK эZ+2kS ִ_gf :7fW\2Za+o<\>-eHqgq^uͱ[ 2 I0̈{zq${gR̅_"뎋gc(_P^mě|ۡfRiloy)h)+6"ǯ{˯e41#sG Blu|?hu%;;G[}I{ps·3{>y>[x>GT &!?ZvXK m]ټaӗE΢=%@.:#6lfeMN}*k_WN(cF| ۃVUƻ{ɕl yŢh 2Ԇ6M1C=Q5ZYs:~ %BaEjƋtKal`A gnGꞗ{SZl$\uΫ.ٗC VM^wAtٗ{HÍ<' qdhC5s#v?뼸%->^0ZG3!S6X^Uχ%AE톺=2ʎۉٯx<`&at܎i܍VD7밌\yȻm+E.."dMI;&̴vEzh E#3#[3-DhNfefBY.T*vܗ(,[~Մ%>-UoѲiE|ϳtL:,/J2Ü4ϹTjA"aAzB)F," ht˘5]'IәK.Wqm|zׇ{n#İn4:nTn'+f{XW^FG}|/WUfY{D9C-x7 fW$)Spj 8λu{c8gV^0vM' mQ(D 2Y23#'6S,^nzM\CRE~x p?$?L:YܚƔ 7/2# qhfD=?x<G 3 LC R{7:IK Bߙе#Jl&yW (D#{Xaw! Ľw͹*50n4̀$o/EhBdfG ukq |JnF1]/ފcrZ]+A][ǣke d A::i=) exsǯcwhZ:pNtw58#Rw4FMfYOx]{bTI("m6 F0gn3mHSBF[-c p&2A!y03ɘc<@O;ȸٗ.dy _mnU*q5;o[TJL@ڈE ҺOM̲Ҝ~Ƞ8J)hd"" 6@FsNg{Rl$1Uӎ|"I֢I'H9 w_Ss1?d#+T8y""PR͘ȴ2;N sga'6:P7R6Lw-륯MJJeK9؅^MPS۰r0s Rg iTvTvVDIugL]Qomz8}z&IM%y6?JoǨ9h#EˑP'kً3S7*q1,kM>5Ry%dG]NQ7RS=Ú*{u"s _,M,=&^/}^۫"+-Y&Xb׸q躱h9l\dڑP u|_Ǐ"~ԑah"BIzՓ}ΙkNfĜr>s {<ko{9`mY/mt[`1m>[+֤W(gz~ M?u REٓ7hZ_XI˖*aͶNʶ^ep`J%!swzdB 뀣D I( }a #x{c}yNxZ5mpy>P" pʉXhWrxty*9 GULQyᜳ+S\g@ϣX._KAg9h]c&#D@h,F͜ [Úmi7uʾw۷nGY )?XԪoH(#2"sYpӹWd}UkTr`\.6*GzlO8h:~ꪷoooZB l7}-騘Gx<ހckLbLo~.ҷqG o)qi6fFT1<ҫz'f1wWqmn f|i^5oR:WlNP;+ߥL VvD1@%D ( 5w>;^)9}x{S'F"~JV}481%TT""pM冰9JYdRL+DoF|5SYny+i[Fe-E9U VȢc@m~ 32CYVl{_ɶo}2Iei{`?#V[V-4#AggޒRWUɳcG[^JFGUV@5[R|x5<[D(67*-id%t  1w X6FGuw{Dpb=3u>:ES#W+cnbσ" }TvR{&>Fq㩳W?n^ĔPT#"хYWٖmӹΜQK{yIG,Hk2DR QwRw}OqozջmU T kJlADER"!b$J+\&/e*TU 6 fS "BQHg~pg0C3 +ttu2F&}S#őp w"i aLDaT7#U ȹ6-2)Ý&neZ. K,B3a!(ĐRETqK\eml0:\ʴB!6m* Gz8u5OKDt\!_eE_R+ӵ+Gfv)FP%v! cw*p/A- 4:Nz4[ިl"}#ܝnTmN{&ml2>8>c@Np;1d^EN\Q #fudk""I;L$okAՠĂeZ\)vV9&N^@1"=!0#cH5a j7ȶm*G롲DۙuR9&ZDNHm Ï?BM}EIRN9$a ܬg-< 43mxpNNrIje{0=07q QV}ufouyL&,R9d,#\.i*we(,Q- һ.XJ;)!TƦgnR8-9܌ӷAhMJyqюiO<7.ch67߅Ɓ0i2R3N>BZmf#5rèH[̾Wx *-5k [pEG盨̬uJؔ*d'{k P#mۛo2r|q|ǔO{< [&DgwgXE(9ጌ{UսOu-K \} r^I]) Xd@GSʍ\xQ?Uzvj ̇ΚnW ] B%f"Sv$Q*Cc.|>уͱu$ZL{rSf2#x|(%@cg c{q̆סt$Ak#)8zƩD5"y@gSq t̂ {fyF<8V*  LZx@~afw3kMaamۤw[G޻*tS<;K^mr>xQ_.o޼y;>Xԇ&NH&Mnf Υ &n۶Nt:域Nuϰ9X1VL ^Ylگ,U ,cJQ;{w|Uk^ K~XiDP"Y&7C '*ҫu<kd*o8*VӜXIQNJ { U'<_@kJyw_~!ZٯB5gƟYK$d;hz 'H^0Q|CDD%mlUZsBPa~1=CQb8JztB B @& {@H\#yǨPua4ܻfkHT?B%{0)SeV߂v͟1es Z.cXbz^9gtKElj?nd_"T5VUjeQnr9g+/DUQmEΪ*ʈn///1-D!Hwǯ~+Ֆ5ov#8>ؖn]sUG%9CfT,̬ݻuم) {| '|܇c쒹yr"0qoQI]*6 (]rz̟,1M699? n8ObAV"4*~+zY&}Uк˪6Z 雴~z{'?Ud) &?ZI4r'1l oEXdt{z˛BV3@d߾[f|^;̎LC!ÏjPL)V@ᴈd:cbk#DZBflՈ.GIJ%JA=Rڽ1N2FIRE=R-8o"dZн~:iv>dYgcύjTdƃGȠsn0z?闪ͺAFFӰ[3Gl&Mw7 fakIWy'?V8>cz8_岥h5u3V7yN`w}ꕺ!J=v_H53Xpt)>!k1QП(D2jfAt ͏2MJش^U+hi@Iu Jl$ʡJ(< )jS$I2xWh[8/%5Dy5a۶|N[dRr{DHT],Dh9ISs pXTU*v؟ow?HD\$\w's"sG(CM.Eʫ̂Χ7*qx2(؈0 !4XQ1fs9BAY7 BBKׄ>"$hl iJ7TOv uQ >l2Y(1壸znbp}'m "d2䋦`$F$NM#۷?ɗ_K>=\.*EYtMx`K%½W&Ar P[+0,ш=z'k~T@m(jZ)p_2IP8qD?e)i^嚬8:X[%r#ǔt:ΚKn)]% %~[U%EXf-?rK 'V5,9q~^J9g[ t;&/|a^)u9SLlU[PN0j:뱲b="QC\;'H;=lI Bɶ01Wx;aiv1m$IQѨ@dG>]cAeRP_CUVVN"rTTb?ᑾBxp ǐvyޭq5*f6m}cP_#g0dH$f$Xn8:Xm۶5Z@G*`4j"5U}%hxq|jmvڶ́nƷ\\}A!gڇ}zznRdNEJv2#$2wK0wGLzC:B&< j@ Ŕkn(Fjmӆ˫1M\Wp;[X5]%p:Lgs±2z<,Tkb[z9q yYg6=}g-/q@`9m74X6C!f&, R}&<@\h@ ۈwCHWZ)^^A_YpIVg6G#)ļ,tQHXfcrD9'Y)\z*9?sw3 )w+Qr2\ʔXG]9^+"-,X z>r~3C(},Vot$]_ ^%vS[^[;I#j"qXMb>iqYU_"&9+emIjw[LY尯YHeyg%WVRܭ@x1Oq .GgREF;oxæ_ymw1D2 MБ;!yd2SkͶLnnTϱ\5d\ģ#F5ëAŹJv#| J5xcIV΀EXNLjpi4?)7"&i啯0[tU?tc0Y8Bݼۑ4R!oy"i9Dڸz*o2̊(^M'k{M-\:/2^T+fE#nP) *p x,>qd_ofkJy )D"muineN_|iۄi O 3 2{N.UȺzS(7sOVWMÒ n =J51RGMz;1:毈X+F7r$j%ڞ2rSgD\W$ 69qX7𛣲AK2 al$)"bccJ5nIk ] 61s<0cd8%zA,^)앓Nl")y mb`}7`( Tek۴gdxc^enx2)n>PzVMKDmu4{Wuf֠Qex-ʜE߹B-(Ľll6uQ7o| {7U i| ȓOx:3;!:r . Qڜe{Hb-n( N&x'7|;F 6D3'5#m)bfz}mElYUxzzz捴Й*Tn+*Ƞh4!a>-fsG." 8/FuM7=N 1i;drb#yx im^;U9;3}"}7G3k~9^^~r׽DDh efN56;X,fƐY(R!u[G8aUAӓ4HN5kn89Fk(k1+9XSklx`,7-)qOc}^#04pUaHFYO!)mU# ie4Eܜ5D Kz.I scp:r6WrMȶ Vs0|Y`dהjje(1$=e5߳,I{ML Ur^En "X_eCI`G]ܭZOT I7wHZK>ʙHB"z33se$4?|qonֻj=IWь a R" ܶ|.3q=ݮok̂ wa,C8'yx(BW f}Z}m-aT߼MQ JKI9&|qn?J:k#y\u68-\ȽFF*E]t50OKjk7_Yƻ!:#sR-UAo>;{G-/ 0NH/Iܭ[VFϏL@޲pcH[RGsnݼ4 \G~> ۶6,-Y !=֟8>pHY;CKM+ϧS]Dz`DDŞJ"u-r5fPRñʷ FQm7|/  " [j{S.ʄMh.]>W 9ӹooO 3Ez@ %<?-~ }PzH %SWx[|cF[Y,ޗALfE;~qywǑOp@1WocKocFm̟DWjByv>.9ȃ79H~iTSwY sNXFT6H[r|0*fg1pw3#jҊQb|4H0sAj1"$"-(Q%Gw9?8>2K6BZK3nUޓNIg{ + Dicw&ΖLSM5̇YpL|i|d%o|D5&W0ng` W~XYkHJ=#Kd$ht5%V Gp}p)H5B]IހfMaj$5M-{w'*qau5מTYm[_Z?ԝ!w]WЏW,6QW45%,fΈn-%zdw{gg1ڣCy޺Hav"*-Vs12@;B8:>Q?Y;$>~}Z! 3ͺʖg]ܻ۾_ `?Mƞ*y$2G]㵼}q|ʺ(jgZxTLi.3afi>}x^o߼imF:\҄"@jel,furJUbr&_892V݀ y\VpuM0]d|knF&6cg#ڝ"JS8^ףc%<xUV'~8{Mn:"dEf䴔Io5+bi7+h)3'zUSXőHtc D,-.ab /k  Z {jb>c*(cQ_7 sڴlE71*E1mnYm>7c$Olp׆~ zh1jQ zʛKSU=zjϪMIAq㨰ZaF˻]=ycVag'#r~9͍ )r- cþw щ9Ĩtg>^7L|%(g0,1;PKdݔt\s:y֒Α`͔&~$:Ix'QZIX2;4Yb& od[rJ# "0 Y@>U5ߗy3+} &T)Fu4? [&s6 n)Lg!68 #1SF T $9+_nkGo;Q7_dM`lpܢƅk^G^/`^cX> iJ؞JĊQ) w)H)*DAI1E=ܓKmw]Cgvz+pr'չj vjMIKww9Qmn{k'">n2Rxx~:muo^}Ov1f~9yy~voۛZcA5D ”AjFFTJ6\K6Qf"m2ىKM)OTnZ;F@({iOVچ99{ʖ&**R!"MȼfKbP WIADHYLYXx%4"&7 Ի6䚚U9nSF9she!̄;F N'ř 0e\^   ("E`.ID@»r&3aTya`@tkxrYa"Zaf> ,Q^Q9P2DYg1TRCT'm;)WMlέpM&"##Н0RT%n:rX_YM,BTT!NjFJ/;"%#t.V򔔖=pΦ^ͪ@ԈNDz/~/>\̨ń>û`ƲQ/a)߮*\YCeub8AV#൞F˜٣U|c7fCG@2f ?b6Y O&y1L{M4oMof멸`2gk3//_{hR[SifZk/G%>qJ]a֚kIw'_ cJݳ=7f oI>[f$l.Hm:ʀLׂ!;nVK- R`N R9y" ?a8.yxucIIjVX]T "),o-JpGN5G#jV{[gg3b;"ilk0/1058D՛1n^鵼Y7[?~orZ0RǬ(T4xw7߯{-@nvzzy-xvY5oCo߾wv"jMXG҄)odXTlp=?m!ΈB5 }:8d7п׿ 0hΏ;l`"r:[S3Nܚ뇗뵻Hkpi UY~?8>cY{wuDs%*"\ UJdH=?=ɺls?HS@G<ܐ}t,Hْ"*9\f/ңtRÈ?=UOBYG˪4d5ORfHWF'(ķG[Po)X]טY dchZQ+4lvMFҡ06$=K&r BfU2,@}/9(-%$鲾`h,kWd'kbVfyCHaH cQceV6[,Np֯3HTI&~&ÑTюtV~1!y&&40"Uy5,riҺMipJ᪪Ik53GCI9̓1.GyI~U"E\D&$nT%sM(TWӱ5 F^?ayu\`Zܵi90cqy{\N@A6 }m%̽b;BHl#ƽ6}\@.qЅe鶕1[O)CJ[{3$wϰT :|(M'VÌm;oϗK  κhr\.3<zHoq|9 %>\-QJPB\i={fSe_TS`Ar-+ ĻUɕ @(Wq lE|D~F_^3ACqGQfvh=÷S;BeFDmo_lǐ$֚X*!/- x~_R=JJ;,=n~ޚ{O?\_t۶=bQp)5}WZ sG_iV^&*w}RCƞx2N[|92|-rj̏vGKb,5CE%7Yg]bo'4A.Uehz8st|Bnv so#2Ĩ-'Yv uqFx 1%EQ#Vo +B&4K@FD Lъ2MG[s QWJm{z[Dͼimy^UeQ$@qJ_8!Бy؝25ɸZ4nXь0\G#{e8݋*˛:O.@2^0ևu &6fu/"i.]}dsV@" Lh?ix2`t/饐nH4Ng=B<(a0~ڊ@9A'=-?}'e|J陸oF9Szz'[n^0d_޾ͯĬڶmfrrh1s$ֶvU{ dWA z"M?v*-BUK{k|_|__g';0oTU!Az.yWdzkpu(˦T> &Túeq)W DQA)X]MCJ9zJE"@YoO Mi>!1k%FY 1tZQpzMR5s;ɧWigB4K+NlTR?J(tQl&+2.?uq{閾w9‡ LuIoFg3Mp=۫/נ/;mhMk˗{lv:dȶx|"lg?,}43q<)/h_|Y%bwOo!Ż @f̬///f!<iBr̖\,//WwkmӦ3cx7{%PuTUfP EJ-1_ $ѫ?U͟-N3)3l)&po9 82d~޳;NYHT"nKs"pzX* e{DlY (#[NsVlBtKn "pZc;G7s,^6o$Q+@AjXە*vֈg6mDQֺP( 7f uٯiE! [PD/fiIv\ 7h0EL_kfeFUDvC:bs3FH2/ ^8T.cg?sE"6H(JoMTYIsMJhMU۞VSiY&Þ?{o_~9[Ow޼vyw*{./O;iT"Uh_=KnxV\_yf2 R!*-[mWmI(wx}?OWO Q@N77w_oon__#ܼ[7spY'Ĉ8Σx:ы 9Q7s.dM mT[޸]yOtj5U =/)ڶ7mS-K|*ѻwZpT[na4lv:T[S֚ fc){NgI IJkV1ns*vj* [/O>U2N:&&Rx7}oM)╆)S#\H9CA2Sz7 RZkh28`n{֥ DHRϟ૯oɯ{:m|湲6p{q|B,ソ//q#ުg2]eWAOxBH( @$$LlhGؑ!zlw]v:s.bqy{b!Q!4Bۏ<{fC?c.?IaXDXsanwӘ)__~nnlU-sUGbk*bΟ9gBtL\"fCUu=O<ǟO>Q1x`!Չ TVgcQ:'8g$2(lB[LcHĺn93q۰F^._$ ɄCwU5g!`t0jq{ &BIIYXJbO12(XĠoDUVfaTfowiHAUij=""=Ң/¹tjѶI: mVĖ6"W)u]u1ƾW>|^b 1)wibL0[腁Tc+X8Btg~Ι< >zfaٛ-ʪB4r(PT9u20 ]Yu% J˷]iRo_ @0;5"79Ÿ_z3=}5 |g=g?VUsi* l=FO48/^}XZUKHqN6",?aK)%Urvab%>n"n*b0;~nDaQ&SB-g985ڭTDD8deeaDf`QD8g/hTlt]uHD%K1_^dׅu(ybjO S:4H)cujq"~DġeHm?3C!RS (bRD]c 3gz3PeރjNaTt)g3`͜sfal6f6M9s 2:enjLb%4QbHjZTMKwϺ`\Bsm)-4Vdt0sMMn*͟H!D14!u yǜ3u~6;l0KS'TMkAsneRT%4ՠp ߿wi8Iha10) B j`^3vf7nvcE( "M )&9OGO.*k ?i'ӱ4N!E E i©ED|V;沲s}aYs_Z+̷ B é:N\APx ̳WY&?$WmF-Y ۝͟Z#n1XrNbݽUh5DoamlU|9"$l ۠Cz [Xڕ-\}Fnd V9:\\.z1 [oA; zS}-fKMc)cN߭|EEa` fOﻔ;&iNCRT/Zz33f Px1ASC !Q3>`: D9s#s3ZmfV9P99sQssGs/ss?sKsXsAsGVUV^u3TV9T9s9TV9TV;{VVV#=s9-sBs<sPTsP#T99s9PTsHs9ssD!=+Qs3ss9s=s5 -s\T k3Zd13,WsG9`R-s]^^gr333333TVVVV99h999T9T9T9T9TV9T{{{{V#Vs4s4s4s4s4s4BsPsPsPsPsP99r99PPPPPPd1ss3s<3s<3s<TsPTsPTsPTsPTTVsPVsPVsPVsPVsP9TT9TT9TT9TT 9999999X9E99Gss9ss9j999TP9TP9TPTP8V;sHV;sHV;sHV;sH{{{{{{9V#sV#=D=D=D9s3s<B9TV;sH$'Ln$.?$$k93SV=9T9V&T9TVZV#?Vy`jS9V#PMk9PsVMBkSZ9vs sBP *y)OyPP Q9PQZTV;95s3V;.9TVTGVn '6@#s<^UsP5PsP:sRsS&k4sP UkPsH9@9@ s999V#sPPs>k9999ssA)UU\]~V+lsss 6)}%UXrTg5+UdH1d+ddd1d1d"g{mm))s+kUFQ@;@<fB##g#5+-qgWWB~~ O\_    " & 0 3 : < > D  !!!!"!&!.!^!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k ~Q^    & 0 2 9 < > D  !!!!"!&!.![!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&jG/vhzyws /,$#>1"DC:741.' ܸܿܳܰܨܜIFE(&%" bcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?w6   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnj#ti<7q>?fu143:kzvbm6@;2l{   }8w KRoNOPxSQL@EYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,F#F`F# F`ab# # pE` PXaFY`h:-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY@cTX@C`BYYYYY-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,zE#-P/@Go@5/_/_o ='==U=Uݸ</A  @@(F<&`ѐ`ѐѰF F@&@)AF@"'F!@#=  @`p@`з @ H=`е@ F_</A ?O@@(&)F/?@Fp5P&<<@P<'''F(F5&& &_o@F@ F_6FvP&uP&tP&sP&)pppppphpYp@tp FonHnF2U3U3UaP&`_2_P&^ZH\F'[ZxZF12UU2Uo?_S@S(,F@S"F@SFRQ(QOPOO)OYOiO@)F%IFHF!GF5FF2UU2UU @= @ 0p?_/Oo?_o_TS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststust+++++++st++++st++++++ssu+++++++++++++++++ssssttt++++ss+s+s+tu++++s+s+s+++++sss+++st+st+st+s+st+stu+t++++s++st+++s++su+++++++sts+sssssssss}y:wW%')L?]%uy!1=DsN0Ess`HjgaAohQ^UD,,,,Fx*2p^$v  z 0 Z 0b@HX$dXJjD8*R n !0!""Z"#J#$$j$%@%%&l&'6'(&(~(()t))*V*|*+<, ,h,-v..P/6/z040161d22*223>334F44585x56:6X6n667 7$7<7T7n7788*8B8Z8t88889D9\9t9999:6:;;.;F;`;x;<` >"><>T>j>>?҄ڄ^؆$jPB@&Ȏ2: d|ؑ2PВؒrzltp>h֜8Rt|(0<0753.'24.'>V8u~mrwI6S=NuHBwbmkh@WP VO5G,2D(J"32#3%2#".54>4.#"32>4.#"32>8`IK_77`LH_7AH`88aJI_76`"2"%5"#4$!3#"2"%6"#4$"3#}i..i}g))g)f}j..i~f)WrCDrVToDCpuVqCCqUTpDDqZ8FT@. LG( LI L L( L@- L  L?I9II/GBJ!@ H/O0@H'VM@#0JB $RO4/G!4_o *47.54>32>73267#".'#".4&#">.'326Z3Z|I *(ZgQ`5BmK3zG8L"^A-Z+ ;7L3^TH!Q_m=~v9 LAMQ3ZB&RM9SY<[l49HVG0d--5>Vg'rQ.P;"0m}6@ H@ H?9/++]q10#!bfW.@ ` p   H ??/+3/]q10.54>7!MpI##IpMPrI""IrPWootuWD?@) o   `O0 ??/]]]qq2/]q10>54.'!PrI""IrPMpI##IpMWutooK@+        ?3/]393333/]/933107''7'73DDoh=y{=hVY Q@,  @ 0 ?32]q+M9/32_^]+M10#!5!3!q9hh1"@ 0   //]210%#>5#!(0$!BCn]N##NRR(1PX?//105!P1@ 0/9/]103!!1%0@ M L/?/82/]8310++3#) Q'&@n)n@  s#s??/]q10#".54>324.#"32>JjjHGngI0M7;P10N97N2KJCCՕs./tÓu00u: S@$4D+;K no@ H t?2?329/+33/]32/10]]35!5%!!]a CPG!"7@o!$n p_ s s??3/9/]3/2/1035>54&#"%>32!G0wJ^[Z_ >sxrx>Nzsiyqr@^ZaaSn?5f^cvprA/);u@K&n'7 o1'11' o= o @H 6s,O&&&&#s,s ` p 0 @  ?3/]q?3/]9/9/+9///910#".'%32654.+532>54&#"%>32)?~|y= !8Q7ep5Q^*b\*WF,a]Wk U^|r6$IrNWR(`l9FsK-K6dg?L)*K:Wc`Xc`/kU= ;Xoh v@:?o?Oo ?Oo@H n@ Ht??39/3329/+]q33223/+]qr310!!5!34>7!S:8 o7:5 )/.?:(! M !!@H! o@4&5H* n_ o  s$$$$$ ts?  @  ?3/]]q?9/]q3//]+99//3+310+#".'%32654.#"!!!>32:CÀvyE 4L6i}9S5FZ1O*Uhr<jI9eN!>0~8Z@"5&%5DzK)0i@ Mnn@1&)H2)o$tP`.s P .s??3/]9/]]q3/q2+9/10+#"32.#">324.#"326)o4o$H*o_o @!&/HSHo_ o  @&/H $Cu99M/uMu??9/99/+]+99//q9910#".54>75.54>324.#"32>4.#"32>4<|}<0Ph7;^B#=vs{t8#B_<>kN,*G64F*(H9>oZMwV3  Q-5X?"#@YG'$8b@> M%o n:/o_@&)H4to *s  s  ?3/q?9/]q3/+]q9/210+#".'%32>7#".54>32%4.#"32>'[lK[E9Z@#BS^0\j9C~tz~A6N3/J42L1'K;$&P~W%KH6ns'<(Azmpy?S?O_ @Pp?_@"H //+]^]]]qqqqrr+r^]]]]qqqqrrr^]]]+qqqrrrr^]]]]qqqqrrrr^]]]qq/^]210!#>5#! (1$ RCn]N##NRR(V}Yh@8RR?_ /]]]3/]39=/33/3++++10 VABU#X)H@3 @?O@H0p @`p/]q/+]q/]32105!5!UJV}Yh@8RR_ ?/]2/]]]39=/33/2++++1075 5V@}DEy^m#'B@ ' $$) 0 %$?3/?9/9/]9/3210!>54&#"%>32!m#:JNK<&?ZfW9sj3VA* K}xEI!BdO?86=I0UyZGJW3237332>54.#"32>7#".54>$324.#"32>7>VLc*G2F[m;_L Dvf 'u/;oX5R욅൉]/"EinV=>jVo?}ÆEywR}qR,Mg<:dI*ka-+XZx_PW 8L.l/PT)c( L"@7 L\\+0+%[0 _ 0 `_ ?3/]q?3//]]]3/10++%2>7#"$&546$32.#"SyY;dόUUϗc:YxLkc//d/L`1aLpEm  e:iVG-S@'EonJq X L@1M M8 MM [0@Z0@__??/^]]q10+++++#!!24.+32>qjnCxeYo?˰\R{q6G>{ R@5 0 @  Z 0__o _ _??9/]q/]2]99//q103!!!!!TV ?@& 0 Z 0_/@1H_??9/+]/]2]9/10!!!!/LT-p, M, M& M&@/ M\)\ / /0/)[0_$__??3/9//]]]99//10++++%2>75!5!#"$&546$32.#"&@veQf0qSXϛiy,`m+;Q3vn=kyA @R^  DI M M @ M L L     @ H 0 Z 0 @ M ?2?3993+3/]2]3/+833/839910+++++]]++!!!! X'{X"@PZ 0_??/]]103!!'c!0[. L @ L L@ L&&.\022222;2K2k2/2222222[2{22O2;2/2 2222222K2{2?2 2+22222222k2_2K242222222{22o2T2;2/22222222 2+2K2{22;2K2k22222222222t2[2O242 2g2@22222{2o2D2+22 22222;2K2k222;2[2{22222/2272222t2K2$2 222222k2_2@22?22222?2O222 2 \ 0&&.?22?399//3/]22^]]]]]qq_qqqqqqqrrrrrrr^]]]qqqqrrrrrrrrrrr^]]]]]]]]]]]qrrrrrrr^]]]]]]]]]]qqqqqqqqqqqrrrrrrr^]]]]]]]]]qqqqq_qq2293310++++!46767#.'&'!!67>7!     V3l-52OG@<44<@GO:80j'Z*1540,*&=p@$ H \@P`p 0 @ H \ 0 @ L L   ?2?399//++/]22+]qrq22+10!!!&'.5!Qo=,,&X(*.'b23T'w&ȳ M& M M @> M M M[)0)@)`)p))) ))[ 0    _#_??/]]q]qq10++++++#"$&546$324.#"32>bY]  ^5hegh45hele0ǥhm  efoEEonJKN @/ M[0`pZ 0_/@!H_ ??9/+]/]2qq10+#!!!24&#!!2>=~…yƂ?׃9B_?[MAvhmq7">WTm$8@ 6 M62@J M2,([%[:0:@:`:p:: ::/[0*_  _4_?3/3/?/]]]qq99//10]]]]]+]+3267#".'.546$324.#"32>G|6DP.<6vF_iIK]  ^5hegh45hele0Ǎy:I) 9gXv efoEEonJKp@K( L[ ? O  p 0Z 0__o@!H_?2?9/+]9/]2]qq2/]839910+!!!!2 4&#!!2>QńA/SrC}}B_=;maOfEgd`9N;=m;@B M! M*Z)2Z)) Z? Z  O _ o  2-_$**$_ 0 0 @  ?3/]q?3/99/]99//10++#".'%32654.'.54>32.#"F垌֙_ .QyV@jK5!ӄܟY',RtGHyW0'^?АqYS')V[PԋCH M@ L M M M@1 M`/ /_p0`@!?o ??39//]q83/]qr83933]]]]10++++++)!67>7!B4" !1w-^'.*)-&_/0!@ L  L/ L L@ L( L L@ L)! )/000 002@y I$k292Y2+2222I2i222;2 2)2 2W2y2f2I2;2&2 2222222{2292Y2i2222222}2[2?2O2$2 2k22222_22+2K222W222t2[2O22;22222k222_2422222222$2D2d2j22@222k2P2D2+222222242T2t222222{2o2P2D2+2292222t2K2[202$2 22222O2o2222222p22O2_2)/ ?2?3399//3^]]]]]]qqqqq_qrrrrrrr^]]]]]]]]]]]qqqqrrrrrrrrrr^]]]]]]qqqqqqrrrrrrrr^]^]]]]qqqq_qqqqqrrrrrr^]]]]]]]^]^]]]]]qqqq/^]]]q833/^]83933333310++++++++).'&'!!67>7!67>7!   +  J  +/%f07;;831,@|194JF@>9;??FG8<3z9D @   @+    / _  ? o   0  @ ?2?39/333/]82/]]qr8399//q83839310]]]! ! ! ! A8996T1d#5@ @ K[ +K[k Z + ; [   ; K k {  + ; k   K {  {     ; K  [  $ 4   4 D t l  p  0 `    @ p     0 :  @D  P    ` p O 0    p _  0 @ ??39/33/]]]]]qqqqqqrrrrr^]]]qqqr_rrr^]qqqrrr^]qqqr^]qq/^]]q82+M82910!! !? 5RV5BB?T= p M@ M( M M@H  @ H@ H__?2?2/+]3+_q99//+310++++)5!5!!R#3sW+@ 0??/]q3/]10!!!sWu&,@ M M/?/83/]8310++33#) W7)@ 0@??/]2/]105!!5!W-E@ M M@ @H?33/2/+83829=/3310++ #!BT/r//105!NNB?0@!p/?_/]q/]10 5!+<N5D1 L@% M M L62 F"))))"FFOFG@)H?54.#"%>32327#"&'#32>5N{V.CtX(;( @qoen:# ((-je 8ʐ-Q=$G;6X="+SzN`Q%7;O2#;-GuV/2c_v&<) heep  #B9MK.Kb3$4M@%G6p6 -F$(H@ H(O 2O ?3???3/++]22qq10#".'#!>5!3>324&#"3261fk0`VH3uha.lq+TB((@T+kt!{ϗT.J663(#Sb =p`Sy"UmjT"P7N 7@FFO"GO  @O?3/]?3//]3/10".54>32.#"3267R@F{ivI `XqhPl  GyP|ӑL8aLSced Ki?T\$5D@*%F!!@$(H!7p7/G0*O1O ??3?3?/]qq+]2210!.5##".54>3234&4&5!4.#"32>L1zfa/1fl5bTD(AS+6S9*TB))46i[Ty{ΕT.H3 '26 O{"#kS!*Zc$VP-N'OF%F@''+H)/)O)_)o))$GR$$R Q?2/]?9//2]+3/10".54>32!3267"!.JuFSft6J6V=J^ Als+K7"nEՏԃ:Y߇DuU1?B.hW9?dF#W @ L_F0@HQ O??32?/+q3/322/]3/]q10+!#5354>32.#"3螞Hz[0]%-'3 ||q>iN,  1 UTNZO3ET@3$4F//@$(H/GpGF>G0*9O$!AO Q?2/?3?3?/]q3/q+]2210".'%32>5<765##".54>3234>7!4.#"32>TksE cP2S;!1zgb/2gll0 Dq(@S*6S:po*SB(N+Mk@!AJCnQ:i^Qy}˒O\g73($Tvt:fR"*X^!Sda@&M F  !!!p!!!!!!F$(H@ H P?3?3?/++]2]qr]10+>32!4.#"!!9wbU&.J53S5!8S  '0  EmZ&>.vFAlP,u @$W g      &6F  @ H / F$(H@ H{ H ?2??9/933+]/++]2]3/+833]39910]]]]]!!!! By.TjZlE@0Fp@P`??]]qqqqr]qq103!4O9( L@U L 9F -F,,,;T;;;;;;;;;T;;;/;;;;;;;`;;/; F 0  @$(H 3P!&- ?22??32/+]2]]]]qq_qqqqrr]9/210++!4.#"!4.'!3>323>32!4.#" '?-+F3 4l|CQ_8Y{M#'?-*E3_?iK*-SsEH#JC5 5@@|pysCZ7@pXQ_?iK*+OnCdO#a@&MF###%%%p%%%%%% F  $(H @ H P ?2??3/++]2]qr]10+!4.#"!4.'!3>32L.J53S324&#"32>EΉʉFCΊ΃=~x|#@Z6>aB"|ΕSR}y͖TTzaZ++ZWQ$6]"@M M%G8p8-F$(H@ H(O 2O ?3???3/++]22qq10++#".'#!4&'!3>324&#"32>1fk0_VI3uga/po*SA)(AR*6T9"{ЖU-I6(5;aS$(48k\Tz#UmjT#+[TWZO!2D@*" F@$(H4p4,G0.O'O?3???3/]qq+]22104>324>7!!46767##".%4.#"32>T2gll01zfa/(@S*6S:*SB({ϕT\g73($S6i_TlS!*Zb$VO^ L@ H/_ F$(H@ HP ???3/++]2]]q3/+10+34.'!3>32.#" *9P;1 7&iu<#NG9 ;FE;]A#  HO;:@ M! L@ M2F*F)@F H)) FO=P=0==@=/= F 2/Q$*p**/***$Q  ?3/]?3/]]]99/]]qr]q99//+10+++#".'732>54.'.54>32.#"A|sg}T *>S50S="1UsADh@ R .O v . O... .......@01!!! !!-ϸ;;r:d:  L L@3 L L          @ H @O  O  ?2?39/3]]q/]83333/+]83339310++++! ! !! 3/1x/ bWh:#$? ͱ?3/ 901%!#"'52676?!H&TQW_eL5U@3)T)IRY *f0/D: P@2GG @   O_PP?2?2/]]qr/99//]1035!5!!D )J\!W-W@6( L( L! ,,(_  0P" ++??9/9/]]33/]22/3910++".54.'5>546;#";-EmM( 75.54&+532++9]O!8K+*K9!O]9Ŋ!323267TKKBm.'C=:3T)RPN&-k0D4 =?F*  &.  2*:s@  ; K [ {  + ; k  [  [ k  + K [   @H @H @H @H ;  @H @vyH d  + ; K i   @adHt ;      [ k { $ 4     0 $   8 { T d     @ P ?@     @ P p ??9/^]]qqqqq_qrrrr^]]]]]]]qqqqqrrrr+rr^]]]++qq++++qr^]qr^]q9/^]3210!3 ,+3D$:?%/ְͰܱ22ͱ22 ܰ"2 Ͱ!2 &0167#5&'&5476753&'C)@B*xiqxqwuۢngn`<\[9, em鎌d])^0@ M( L%#'n n)  0n@7&5H)2@&=#5354>32.#"!!!267^ 327'#"&''7.732>54.#"0p<+L9!!9L++L9!!9Lj@ M M  @e;/O  pPP` \ ;   0 @     @O     ??399//]q332329/]qr^]332292/^]qr83^]3/]qr^]83^]993310++]!!!!!5!5!7!5!! !RP!!쓢T9=@ H@ P  @ H?/99//+]/+2210!!  5 K]ʹV MW L@ LF L$@ LJ( LDQILH5H"HHIY"TH?I@H"I??I",_-H,@H,QDYD2@'---- '0'@'' ?2/]/]3/]9933/+9////+999910++++++2.#"#".'732654.'.54>7.5464.'>?WxQ'9I)pi.Ng9UpB3I/)C/:x|gU .DX5z~*T~T?mG8O0&E3 GoN]d0Qi8)H4BhI"1;A'5& 0JlP,QE60=O2NZ1DnP%-<$AP-:)!-HkN1P?01AP0'6) IE'5% "4c@J  P  0 ` A_o/?_@+324.#"32>%32>7#".54>32.#"4^dc^44^dqp`TnP+`~ަ`8T9)@0! 9TtOhd00bdNtS9 />):T5d^44^dd^4r~ݥ`,OoTަ``ށ>hK**3/+UD)?q\`k:%?S.).%'He-2A@ L L( L 8(  @4H  C?o@H9 3?@H/#3,?223?3/+qr9//+]]+]229/10+++"&54>?54.#"'>3232>7#"&'#'2>=as.Ng9&%+KjEAiL)! ?GQ"o#7&\6).ia4>4>H&04<2CB5_5o55@Hp44@H4C55C4++??9///+]+q93/]99//2/8329910++#".54>324.#"32>##!24&+3264^dc^44^dqp`TnP+`~ަ`EuJ`NKEBCd^44^dd^4r~ݥ`,OoTަ``9/q^v;9324.#"32>3WuBBuW22WuBBuW3,;##<--<##;,VBsU11UsBCsU00UsC#=--=#"=..=14 u@E  @ /_o  @ @!H_@/]]]+]+3M2/9/3_^]+M2210#!5!3!5!oUT=3!K@* L   # _ o   ??3/]9/3/]2/10+'>54&#"'>32!5KTTC*'*U +HfBGiE",DSM?jy5Q@638"*1b.P<" 8M-5P@534,~5m@B"#0-#--#7 0 (""""@H""(  P ` p  ?3/]q?3/+]q9/9/9///910#".'732654.+532>54&#"'>32~TqG!7615)183-$.+*32Mc9DfC"IO-A)cp$;J' -0/1%~#',,- 3M33E'@[.9WU*@/?_/]q/105!W +V!:'G@F""") F@ H P  ??33??3/+]q22q210!.5##"&'#!!32>5! +1:!4Q(C42D*N+1@%0* 7@hK)-QsFB"IC6G/O@+ MO _  0`/3?29/]/]]3/]9/]10+###".54>3!ÛQ`52_Xu-XXT]2D@  0//]10! 1`W̹س M@% M@ M K4  $@/_dH 0P`0`p;pSXHDJH@!58H/ ??9/^]]]qq+++qr^]q_q+r/^]]/]9/33310+++#"'532654&#*73GtU-8*K>8B >!^['F3v% #"RRRj T@ H H    0@ H?2?3+]29/33/32/]10++535733Rylzuy-'Q L @) L L L)  @H #??/+]]10++++#".54>324.#"32>+U~TP{T+)S~TXQ&!1!!3##0!4#1M\33[NK\44\K;N//N:7!32>7#".!r#:JNK<& ?ZfW9sj3VA* K}xE8BdO?86=I0Ux[GJV=Xf8P0 YtD8i_3&$V&ʴ%+5+53&$@ &Z%+5+53+&$@ &%+5+53&$@ & 0%+5+53&$@ &%+55+553&$P@ 8%+55?55@[ ZR^+ ; K   ?_o_ _ _ o    _ _?2?299//]q/]_q9///]q9++3210!!!!!!!!#!>C=\h 8C>oTW&&x !1*%+5&(5 &ô  %+5+5&(@  &<  %+5+5+&(s@  & %+5+5&(s@  & %+55+55&,&%+5+5hf&,@ &J%+5+5+&,& %+5+5b&,@ &%+55+55q!u@N L L[##Z _/   @36H @+1H @$)H @"H @H _ _??9/+++++]32/3/32q9/10++#!#53!24.+!!32>qjƁnCxedYo?˰\RTR{p5=z=&1@ &/%+5+5T&2@ (&), %+5+5T&2@ (&T(+ %+5+5T+&2)&.( %+5+5T&2(&3C %+5+5T&2(&,* %+55+55VV }@!H#3C !H, < L @;!H#3C!H,<L 0 P   @`p  H?+]q3/]310]+]+]+]+ 7   Vd```Ff``bT&20@ M* M$ M$ M@ M M M@ M L @ M M M M@ M L M @; M+*'[ 4'[0*+."_  ._ ?3/?3/99/]]329910+++++++++++++++++7&546$3273#"'4&'32>%.#"ml] gJRprbԔ[a+++k?le0)+-f>gh4Ic! e'#u^㴥hMd>KlcAE{J&8I&%+5+5{J&8@ &l%+5+5{J+&8& %+5+5{J&8@ &%+55+55#5&<@  &_ %+5+5B@'[ Z 0__ _o_ o    ??99//]]/]2210#!!!!24&#!!2>=~…'RƂ?׃9B_?[|J?sgn|%$AX?>@ L L@, L9FF2@ H2@ H22'FAAPA&F''$(H'@ H'9"P-'O??9/++]]]9///++10+++#"&'532654.54>54&#"!4>32,_fG><>=QJ2KXK2!292!]Xgl<{~rm5!2;2!2JXJ28IzX1  E9.D;9I_B.E:25>(AN o{B6[zD6UD6-)17AUq4x&DCE&FI)%+5+54x&Dt @ E& EH)%+5+54x&DKF&KE)%+5+54x&DRE&ҴP`)%+5+54x&DiE&״IG)%+55+554x&DP )J&ٴOE)%+55+55BN=LU@  L  L&@& L&R0GDD /8F99SF////W_W WG@7HJGO _ o  D0QRR>MQ$)$/$5>O8 888?33/]2?3/]329/32/]3/+]]q3/9/329910+++"&'#".54>?54.#"%>32>32!3267%2>="!.?MeOO~X/Ex[+?(%;* ArrtE`t6J7U;J^ Al9\B#0U@&K3+K7"nqt2T="+SzN`Q%7;O2#;-GuV/k92Y߇AqS/?B.hW91Oe3- #B9MK?dFPW7N&Fx#  (!%+5P-&HC(&ߴ),%+5+5P-&HtK@ (&b(+%+5+5P-&HK@ )&.(%+5+5P-&Hi@ (& ,*%+55+55&C~&%+5+5rp&t@ &S%+5+5&K@ & %+5+5c&i@ &%+55+55P'5@ L@ Lش L% L@ L.(G%!'!@, H!'!'7.G%'&&!+OP`!3O ??99//]933/39/99//+3/]9910+++++#".54>32.'57.'!%4&#"326XEtT.DΉʊGCΊ.Z"F.ܦ9D%(Q' d~x|#@Z6}Foz̓RInkJHn5zF.X*.qPsK#d&QR @ $& /?"%+5+5P&RC$&մ%( %+5+5P&Rtz@ $&^$' %+5+5P&RK%&*$ %+5+5P&RR$&/? %+5+5P&Ri@ $&(& %+55+5514 M@(   @?]+M9/_^]+M10535!53xqm#/@ L 0 L L@ L L M@( M'($G 1G ('+!O+O ?3?39/329910+++++++#"&'#7.54>3273&#"4&'32>EΉc@q;;CΊh?e;6aB"|ΕS.+|Ity͖T+(rJs\GE/Q"4%#+Z\&XC\&Xtx\&XK\&XiWh&\tFW"2O@#G4+!F""$(H"@ H"0O&O @5;H !???+3?3/++]22q10!3>32#".'#!4&#"3263uga/1fk0_VIop*SA)(AR*lu2<k\PtuƐQ-I6(5;a OecN Wh&\i3&$MN@ &%+5+5<[&DMG&EF)%+5+53&$@ &&%+5+5<&DNE&JV)%+5+53b&$Q  %+53234&4&=!54.#"32>;1zfa/1fl5bTD"(AS+6S9*TB)AUO{")46i[QvwǏP.H3 '26~hN'T_!R&(M^N& %+5+5P-[&HM@ *& ()%+5+5&(a & %+5+5P-&HN(&-9%+5+5&(Om &  %+5+5P-&HO (*%+5W&(Qj %+]5Ph-N&HQ3333%+532!4.#"!#535!!!9wbU&.J53S5!Ӡ8S  '0  Em>^&>.vFAlP,9&.'Ҵ  %+5+59u&Nyٴ  %+5u: @ M( M M @ M M  @ H  F$(H@ H ?2?39933/++]23/8+3339910+++++!!!! By.Tj:@Zl&/&m %+5+5jhf&OO@ &M%+5+59&/%+59&O: %+5&/r@ %+5?5&OK@ y%+5?5&/O %+5q&OO H H++ E@&/?  Z   _??99//923/33/29/]10357!%!'3ABѓߓt) z@PF  p  `    :  5   ??99//92]3]]]qqqq]qq22/]22/]r10!57!7}}31EEJ=&1@ &Z%+5+5d&Qt@ $&d$'"%+5+59=&1%+59dO&Q .$"%+5=+&1&%+5+5d&QL$&&,"%+5+5,'Q _B@+$$% po?]]]]]]qqqqqq5+5K9P8@. LZ5;)Z 0)_/$ _?2/]???2/]29/]10+".'732>54.#"!4.'!3>32Js\H %,46C$ CgGLc9  a{Quj2*g-C+*!-VR'^U';cHD%\ZL?EE>dF'@̋ВNWdO3g@+2 L F...555p555555%F$(H@ H%P) P????3/++]2]qr]910+"&'532>54.#"!4.'!3>32E8S  '1 .J53S.?iK*-SsEH#JC5 5@@|p@pXAlP,T&2MN@ *&() %+5+5P[&RM @ &&$% %+5+5T&2(&-9 %+5+5P&RNP@ $&)5 %+5+5T&21@ (&o)2 %+55+55P&RS@ $&d%. %+55+55T+& M @K M[+;K++---@ H#[0__o( _ (_?22?329/]q/]]+_q9///]210++!#"$&546$32!!!!!.#"3267&k6Y] 8c0e^^,gh45id.V&j b B|onFPKN*:C_@@G++ %F&&AF@"'.HEE1G Q@@6;.O"6O%%%?33/]2?329//]+3/9/29910"&'#".54>32>32!32674&#"32>"!.hvBEāʉFCΊBGjt6J7U;J^ Al~x|#@Z6>aB"+K7"nOPLSR}y͖TPIQHY߇AqS/?B.hW92aZ++Z?dF&5@ & %+5+5 &Ut@ &I!%+5+59&5Դ'%+59O&U9X(%+5+&5f&%%+5+58&UL8& &%+5+5;&6@ >&>A %+5+5H&Vt9@ <&[ %+5+5H&VK@ =&B< %+5+5;W&6x /E> %+5HWO&Vx C< %+5;+&6Z@ >&@F %+5+5H&VL@ <& >D %+5+5W'xC7W8'xW+&7!@ & %+5+5&WoK@  ""["" %+]]5O@    ok  + { ;  [ k ; {  + ; [ k { Z  K[@*4H t@Hk{T;$kT;$Tdt[D+[4 @P$4pTd;$h4DTt;[$ D 7{@Co+;K K[ 0p _ _  ??9/322^]]_]qrrrrr^]]]]]]qqqqqqqqrrrrr^]]]]]]]]qqqrrrrr^]]]]]]]]]qqqrrrrrrrr^]]]]+]qq/^]+]qrr32]qr^]r^]+M99103#!#53!5!9rm8q@H( L_F  O_o@&,H O  OO?/]q32?3/32/]+q3/22/]3/3/10+"&=#535#53733#3#3267|X͹32.#"!Hz[0]%-'3 >iN,  1 qW K @( L  n  u P`p u ??9/]32/39/332910+.#"3#!#737>32  A9 $% 1V\31,B=k>iN, 3D&$'P-3@!PB@B0B BB8g=@%%+55+5?55]]]]5<&D'Ptc7@Pr@r0r rrJ&[mp)%۴OE)%+55+5+55]]]]5&&`%+5+5B&t@ V&VY .%+5+5T&@ 3&T36%+5+5&tz@ 0&b03 %+5+5;9'6H9O'kV9'798'W y@=& 6 F )9I &6F)9I 0@p@%H/?_/]q32/+]q]/]933]]10#'##53Ӡ> y@3)9I&6F)9I 0@p@%73'P~Y4$2?"$?2"3W~3YuB'>**>'BuY3@ FS?9/105!'p#l'L L@* L  L L_  @H #//+]10++++#".54>324.#"32>#(E]44]E((E]44]E("/.""./"n5]E''E]54]E((E]4-""-/""/LW@m M M  K[  K[4t 7@,1HO?@"%H@H ??++^]qr_r+r^]]]qqqrrr/^]/]9/810++".54>73326793W?$ 07?B1-5?W3J20Q>+ *s5*3 !@ L LDdt@mH   $!4!!!!!!!!!!!d!t!P!4!D! !!!!!!!!!!t!!`!D!T!0!!$!!A!@6@H /?_/]q23+_^]]]]]]]]]]]qqqqqqqqqqqrrr//^]+]10++".#"#>3232>73,YTK" /VI-ZTI! .V&/& --fX:&/& .-fX: =@(  /?_/]q22//]10#53#532X" +" +4@#/?_/]q/]3/]105!E!$%nJU h @ H    @#H@H/?_/]q++22/]3/]3/3/+1053%53!53i;L!%v)$&$Tk`5%HHHHHHHHHH@ H@HHHHHHHHHHH@ H@HHH@ H@HHHHHHHHHHH@ H@HHHHHHHHHHHHH@HHHHH@H@HHHHH@HHH@HH@H@HH@HHH~~H}}H||H{{H@zzHyyHxxHwwHvvHuuH@ttHssHrrHqqHppH@ooHnnHmmH@llHkkHjjH@iiHhhH@ggH@ffHeeH@ddHccHbbH@aaH``H__H@^^H]]H@\\H@[[HZZHYYH@XXHWWH@VVHUUHTTH@SSHRRHQQH@PPHOOH@NNH@MMHLLHKKHJJHIIH@HHHGGHFFHEEHDDH@CCH@BBHAAH@@H??H>>H@==H<KbY]  ^5hegh45hele0;phm  efoEEonJK,.H@1R  ^ R^ 0%)H@#H`/ @@%)H@#H?2?9/++q83]]]]3/++]q82933++++10%!.'&'!!H  +u0^&-)*.'^-!0=1T L@   @ H @H0 _ __??9//]]++9////10!!!5!5w9\GWT2='@Z Z 0`?2?/]q10!!!! s3Z M@+\ [ Z0_  _?2?9/332/]]99//]1035 5!!!ZQGsv B7#5<?S (3@(\/ [!55555w5f5'5G5W555555555v5g585H5%555555555w5X5E5&56555555555w5f5W5F5'5755555555v55g5H5955&55555555h5U5F5755555555b5r5S5D5@555&5555555555u5V5f5G565'555g55555555t5f5R5D505"5555555555r5d5V5@525$55555555555d5V545"5557555555p5d5P5D555T5t55555;5 555@5555[5k5{54555)[O_o0_/_' ?22?2/]^]_]]]]]]qqqqrrrrrrrr_rrr^]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrr_rrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]qqqqqq9/3322104&+32>5#".54>;5!32+;#"*TwM$6ܒGJ**JGە6$MwTژq2YzcXnwÊKKwnƖXHzY2D;`#2@%%%%%%%h%x%Y%J%)%9%%%%%%x%%%i%Z%K%9%% %%%%%%%%y%j%(%8%% %%%%%%%8%H%h%%)%%%%%x%%i%Z%K%% %%%%%%%y%j%(%% %%%%%%%s%`%B%R%4%%&%%%%%%@%%t%f%%%g%%%%%%%%F%V%v%2%$%%%%%%%%t%f%B%4%%&%%%%%%y%V%f%$%%%7%%%%%%%t%P%D%+%%%%%%%T%d%%;%$%%%%%{%%%4%T%d%Z Zd K:@mDt $4Td `O 0 % Z Dp  0    _ ??339/32/]]q^]^]]]]]_]]qqqqqqrrrrrrrr^]]]]q9/32^]]]]]qqqqqqqqrrrrrrrrrrr_r^]]]]]]]qqqqqqqqqqrrrrrrrrr^]]]]]]]]]]qqqq_qqqqqqqrrrrrrrrrr^]]]]]]]]]qqqqqqqrrrrrrrrr^]]]]]]]]]]qqqqqqqqqq10!#".5!;!32>5!#(чA#JsQ  QsJ#AѐUC-PpF  FpP1ƒCS5q@B M M,$ @$`$Oo$$1[7 Z111&&&&##&_%_??322/3//]q2/qq2/99//]]3310++267>3!!>54.#"!5!2.54>$5b0hq >a7ibcj7e> pf0bRߍf35Vel99leV3fߛRb&,@ &%+55+55#5&<R & %+55+55P&~TN@ :&:=%+5+5M&T@ 8&N8;%?H?@H?H?@H?@H?@H?@H?@H?@H?@H?@H?@H?@H?H?@H?@H?@H?@H?@H?@H?@H?@H?@H?@H?@H?@H?H?@H?H?@H?H?@H?@H?@H?@H?H?@H?H?@H?H?@H?H?@H?H?@H?H?H?H?H?H?H?H?H?@H?H?H?H?H?H?H?H?H?H?H?H?@ H?H?@ H?H?@ H?H?H?H?H?H?H?@ H?H?@ H?H?@ H?H?@ H?H?@"H?H?H?H?H?H?H?@ H?H?@ H?H?@H?H?H?H?H?H?H?H?~~H?}}H?||H?{{H?zzH?yyH?xxH?wwH?vvH?uuH?ttH?ssH?rrH?qqH?ppH?ooH?nnH?mmH?llH?kkH?jjH?iiH?hhH?ggH?ffH?eeH?ddH?ccH?bbH?aaH?``H?__H?^^H?]]H?\\H?[[H?ZZH?YYH?XXH?WWH?VVH?UUH?TTH?@SSH?RRH?@QQH?PPH?OOH?NNH?MMH?LLH?KKH?JJH?IIH?HHH?GGH?@FFH?EEH?@DDH?CCH?@BBH?AAH?@@@H???H?@>>H?@==H?@<7!!.'32>7.#"\AUoHIu[B ( 60#$*  ,E0'L?/ #7M30H.8^E&'E]675/:M9 B?7.aY*-\]Jd;(XW >l L@ L1 4F@ H +F@! F$(H@ H0O11&9P &O???9/9/++]29/+910++#"&'#!463232>54.#5>54.#"4owe7 lq9#=Q.9s\: 9AF":X;$P~Yq,C/6P5XtB7'9\5/ZRIoR8 7] #A[88^D'rc$?/EoOXk:  M@ M    @ HkT +K4{d ++Kk[kO ;K[k4 l+;KdtKK[4 :tK[ @pOo @O@ M ?2?/33+/]82^]]]]]]]qqq_qrrrr^]]]]]qqqqr^]]]]]]qqqr^]]]]]qqqr^]qq3/8+39/^]9_^]33310++!>7!!>7*'u% 5: >MOIG?{7nu~FXV2 L.@ L///2/2)G4 G0)).@H.@HO L/@ L/O0O$??2+9/+]+3+/]99//]3+9910+4.'32>".'#".54>75!b 7H(CkL):Y=Fa< '+' C:\?!GɁƇGI`UEufX(LiSBpQ./Rsj5rTlLEun_!:MN7h@? L  L*F00##095GO0//'R+$$$Q  ?3/]?3/]9/9/]3/]9///910++%267#".54>75.54>32.#"3"K:!Mg\kh3*Mj?=_A"8lfFr^N"*eETX3XxEB{^8UM<"B4!/TtF9]B(*BW3?jM,(A-{98A90; A:HJBo6@ M% M L M@ M&0@54.'.54>75#!5!D(Ga86s^<  #A\:@lD.Pk{@ "$" >{lQ/8E+&CkT*WQDJ%(*%3$'Jz`PA=kXdN#b @' LF###%%%p%%%%%% F  $(H @ H P ????3/++]2]qr]10+4.#"!4&'!3>32M,G45W=!  @TlH]U)XKe=)PsKSDy*01//L5,\eZ%C@!F@"&H' F0@"&HO/  Q Q??9/q/+]2+210#".5322>7!"!.lv>yp6-'D4  3A)'D3 z1B\vx] /op/r-ll-: w@Z 0 L0 L @ H F?O>p`??]]qqqq]]qqr^]3/+10++3.5! 5@F!N @<3u: @ M( M M @ M M  @ H  F$(H@ H ?2?39933/++]23/8+3339910+++++!!!! J#j:2 T##@ M M@ M M!@ M#    @  @ H%k%T% %+%K%%%%4%%%%%%%%%%%{%%d% %+%%+%K%k%%%%[%k%%%%%%%O% %;%%%%K%[%k%4% %l+%;%K%%%%%%%%%%d%t%%K%%%%K%[%4% %:%%%%t%K%[%%%%% %@%p%%%%%%%O%o% %%%@ P?2/9/3^]]]]]]]qqq_qrrrr^]]]]]qqqqr^]]]]]]qqqr^]]]]]qqqr^]qq3/+82/^]839/9_^]3310+++++).'!'.#"'>32Tڈ   ! ,+0 60c9QtYG" -9>:0W_[SIE`=  +\b`]:'@#F"""@@DH"@25H"@$(H") F@DH25H$(H@$ H))p)))))) P  ??33??3]qr/++++]22+++]210!.5##"&'#!!32>5!Q&zV4W+F42P: ,56ci0* 7@hK)-QsFB"IC6:V г M M@ M  L M M @Ff I@qH Vv6FV"pRbD0"rTd@@HbrTB4&dt@P4g`DT `pDT 0dt@$47p_@oP/?P@ ? ?3?3^]]]qqqqqqrrr_^]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]]]]_]]]qqqqqqqqqqqqqqr+rrrrrr^]]]]]]]]]]]]]qqqrr^]+]]qqq//8393310++++++!!>54&'!?lNz)8O2Nc^:PNQw--qBoH@ M< L, L L@ M>F*/9$*C9@ 7CC7??9/99992/+]]2/9////+]+9310+++++'>54.'.54>75.54>75+5!D(Ga86s^<  #A\:@lD4o|CwW32Oa/ DPLLEe=5Ys=dq=5D-&CkT*WQDJ%(*%3$'Jz`L_"="5>3!804,s@  $a$,13 |H7 s|ںJL} yWO-=@G/&G@$*H@ H O)O???/++]q210#".'#!4>324.#"32>@wk7[M>EyrɖX%D_9;S54M5Q6vŎO%27 WwJOڂZc4.W}O9E2[OoO9W  L @ M6 M@ M--# F ;F#3O*..*??3/99/2/9/10++++'>54.'.54>32.#"T,Mj>(SOF4!%  *Lg>-]XL:!2Ryis;*2:"7UA- :J3%  +@X='RL@J$(*%2$ +=YzQ;oCKB$0MdhdPQ:/R@"(G@3!#".'4.'#"32>Dˈ͊E_ '/1<0%JDvX3}yA_@i~GJʁҊB(^l|$?reV$-[^,Svp:!r@U( L/? F 0  o#`#p#####OO ?2?]]]qr2/]9/2/]10+"5>3!!3267#"&5'OE5 +36+0277|  (4  T:K@% MFp F@ H P??3/+]]qr210+#"&5!32>54.'!T;}ˆ_l;R4$,*#;ۚR.eo?p%(qPWjR%/8@-FF &F11111v11T1F1$14111111111y1f1T1F1 111111d1t1161V11111111v11I11"1111111v11B1411&11111b141D1T1&111@7H1&1F1V1v1 1111t11f1)19111g1111@]`HI1&16111111Y1i1y1D161 111111111$141D1d1 1711111t1K1[1/1?1111111`1p11?1O1 111O1o11111011)R!-Q??32?32^]]]]qqqqqqr_rrrrrr^]]]]]]_]]qqqqqqqqrr+rrr^]]]]]]qqq+qrrrrrr^]]]]]]]]]qqqqqqqqrrrrrrr^]]]]]]]]qqqqqqq/9/32910#.54>746324&#">jQuyÉJ7! !.'!'.#"'>5!!.5!!B[97{Œ};;[=ErU`zu;k;uzpUqEQqO=@ =..(=F<<3F((F &?????t?f?4?&???????f??D?6????????y?f?T?B?4?&? ???????t?f?)?I????????t?f?9?I?"??????v????T?F?$?4???????y??&?F?V?f? ??@?????r?d?V?)?9??h????V?f???9??&????????i?[?I?&?6? ??????y?k?V?4?&? ?8??????{?d?K????+??????P?`?????O?_?????<<8O#. Q-?32?3329/^]]qqqqq_qrrrrrrrrr_rr^]]]]]]]]]qqqqqqqqqqrrrrrrr^]]]]]]]]qqqqqqqrrrrrrrr^]]]]]]]]]]]]qqqqqqqqrrrrrrrrrrrr^]]]]]]]]]qqqqqqqq^]/]9/99/9/1032>54.'7#".'##".54>7326=!^U6I,=`DyG:ohJrT::TrJho:GxD`>,H6Vaڎ0ZNHjI ]ȉH &V>A(%+5+5&(y<@ & %HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH}}HzzHwwHttHqqHnnHkkHhhHeeHbbH__H\\HYYHVVHSSHPPHMMHJJHGGH H H H++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++55+553t@H L M-!Z 5@3-.0-Z?00 .0..'_p0_1._?3/]??29/]qr3/]]2+M910++>32#".'732>=4.#"!!5!$g~Kuo5*fJv_L %,46C$ >H ==H <7#"$&546$32.#"!!QxV:b̊TS̕a9WuK[c8"8d/L`1aLpEm  e:iVG-S@'2_WYe7;6,`&,&@% @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @H @}}H @yyH @uuH @rrH @nnH @ggH @ccH @``H @\\H @UUH @QQH @JJH@ @CCH @??H @88H 77H 44H 33H 22H 11H ..H ))H @ ((H @&&H %%H $$H ##H H @H @H @H H H H H H @ H++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++55+55-x&/x'H@ H@5 H\!,Z'[1+_!_!o!!!!!,``,_???9/]qr/]99//2+]++10#!!#"&'532>7!!24&#!!26xAÂM1-5AUnH:(%$#&C{y=֋\ZtC~N" 8bړ32!4.#"!!5!%[hv@DkNXB9 HiC! _&@ &K%+5+5>&J&!)%+5+5h6 @ \Z Z   t `  $ D T      d t P D        D t   +  d ; K    [ k  4    t ` T 0 $     P D +   4 D d t   i    t + [   @uK {  $  { d P 4 D   7   p 4 T d      + ; K k  T  +  ` ?3??_^]]]]qqqqqqrrrrr^]]]]]]]qqqqrrrrrr^]]]]qqqqqqqrrrrrrrrr^]]]qqqqrrrrrrr^]]]]]]]]]]qqqqq/^]9/10!!!!!c&'i'hsh3$wU M@, M [0 Z_ _ o    __??9/]qr/2]9/10++#!!!!24&#!!26wAÂ%{y=֋xZtC7!!չx"@7-= $-6th>ksU=(E-@#&)'- -Z'  ('''&'''/@  ///////V/ /9////i//[/I/&/ /// //9/Y/i///////v/Y/F/)/////v// /)/Y////////f//T/B/4/&//////////r/`/R/D/2/$///////////t/`/R/D/2/$/@//g////////t/b/T/F/2//$/////////t//f/D/T/2/$//////////d/t/P/D/ /0///7//////p/d/P/$/D////////T/t/ /////p//O/ //)& @ L ,(?22?339/3339+32^]]]]]]q_qqqqqqrrrrrrrrr^]]]]]]]]]_]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]qqqqqqqrrr^]]]]]]]]qqqqqqqqq/^]833/833/]833/839/32999910!".'!.'!3!2>7!!##"  %+.,0F8009F0,.+% Gd  -=G$Nj@W@jNDi$G=-  .8(@X L\ /* Z* * *Z4:\@ H/__o %_% _0 `p?2/]q?3/]9/]q9/+]99//9/910+".'%32654&+532654&#"%>32~~c :OhC;;{l?^E/^vtI(Ih?CsU1J4c]]7\D&kaeY`d[`(DZ1=\j94_TEoS9 1QqI]o>7m@) M  M \ @P`p 0 M@ M\ 0  ?2?399///]22++]]qr22++103!!!46767eL2b'.*F?(X&,,7>&J@ &# %+5+5Z M@, L  Z 0a?2?39/99/]23/]833/839910++!2>7!!#!'4>L1,2.(  ##@iNDk#H>.  O'H@ H@ H\ Z  `` ???/]9/+]++10!#"&'532>7!!i1-5AUnH:(%$#&C~N" 8bړ!0=+T27#@Z Z 0`?2?/]10!!!!s3T&7  L@C L  94d4d0 @`??39/3/]83/]_]]qr^]839_^]339/10++#".'732>?! !(Oa}VGC=R&N,#71.3*+>S~V+.K7%XG (3]@(\/ )[ IY @&+H[!@&+H!5555555i5y5[55)5I55555i55[5)595I55 55555Y5i55F5)55 55555555i5F55)55555i55[5)595I55 5555i55F5)55 55555555r5`5T5@54555555t55+5;5[55@g555545D5t55555555p5d5@5455555[5555$5755555D5t5+5555555p5@5`555555_5o555 50_/_'    ??99//]3232^]]]]qqq_qqqrrrrr^]]]]qqqqqqqqrrrr^]]]]]qqqqqq_qqqqqqrrrrrrrr^]]]]]]]qqqqqqqqqqrrrrrrrrr^]]]]]]]qqqqqqqqq+/+^]9/3322104&+32>5#".54>;5!32+;#"d,3TwM${OܒGJCCJGەO{$MwT3,ژq2YzcXnwÊKKwnƖXHzY2D;h S\  "H @$H Z @%H @H Z 0 `??2?3/]++3/++q10!!!!3'9hsstn<@$ MZ Z @H 0   _ ??39/3/]]+210+!#"&5!3267!'_n|C?kR\F'#?HiC!  s@0ZZ 6 '          u  @ H   H @ H  H @ H  H @H     v  @ H   @H      s d S E 4 %          p d R D 2 $          r d R D 6 $   h    D d       D d ;      T d @ 4    8  p @@ 0 P  0 P p   @ P p  / Z 0 `?2?33/]^]]]qqqr_rrr^]]]]]]]]qqqqqqqqqrrrrrr_r^]]]]]]]]]]]]]]qqqqqqqqq_qqqqqqrrrrrrrrrrrrrr+^]+]]]]]]++q++r++^]+]]]]]]]]qqqq9/103!!!!!ssh\  @H ZZ  @H @ HdR@HrdRD2$dtRD2$rdRF4&t@ H@Hr`TB4"vdVD6$t`4T gTt+TtK4pdPD0$7 @`@@4`P`?ZO_ 0@  `?22?33?/]r^]]]]qqr_rr^]]]]]]]]]]]]]]qqqqqqqrrrrrrr^]]]]]_]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr+^]+]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]+qq++^]9/3/+]103!!!!!3#ssst;@#[Z __o __ ??9/]qr/2102#!!5!4&#!!26{y=AÂ;8}nP7!5!.#"'>32#".'7_d8"8c[KuW9äST̔b:Vx7eYW_2'@S-GVi:emEpLa1`L/.n@ , M M( M( M"@, M%Z  [0 Z 0  _ `  *_???9/?/]2q9/310+++++#".'!!!!>324.#"32>Z_ 'e⎟W,ZZ\Y,,Z[aW(ǥh\χؖQfoEEonJK#7o M@ MZ p 0@[ 0__ ?2?9/9/]]3/]83]]q29910++3.54>3!!!3!!"#}CrS/Ań#=_B}PEfOam;/N9d<ND^8@@&**4 G 0G:`:p:4O)O??9/3qq/]q99/104.#"32>2!".54>7>7>z!>Y7;`E%%BY4;_B$ɋIAApg`1afXjL1HjaM!M_`KKoFs    0EhaCsT0:"-a L@ L*G F/$F$(H@ H "R$$#RR??9/9/++]29/910++2#!32>54.+32>54&#]M'CX1;cJ)B\9<`D@V3`r:>hQ4R:% #>Y=:u$8'*;$2#C>::@ HF$(H@ HO??/++]3/+10!!::h:@KH v9I   F`pH O  O?22?3?/]]99//]3]]]]q3]q3/10#!#3>7!3#B(+,}876|ޭ~+hV/'P-NH:)" M@ M L @ L" ((H)!)) !  @ H +++;+[+k+/+++++++[+{++O+++++?+O+++++++ +/+?+_+o++++++ +/+O+_++++++ ?+O+o++++++ ++++++_+o+++?+_+++++k?+o++++++/+_+++++++++?+O++ ++:++++++`++O++++@B++o+P+?++++++p+?+_++ +" )!?33?3393339933^]]]]]]qqqqqqqqqrrrrr^]]]]]qr^]qqqrr^]qr^]_]]]]]qqqqq3/+8333/83339/^]32999910++++"&'!.'!3>7!!##X:>,'8+&&+8'-> ,;=7}KV+ & +VK8<75N9y7 L(@= LH /*F* * * G5;O;H/R% +R% Q?2/]?3/]]9/9/]99//9/910++"&'732654.#52>54&#"'>32) &4@"PY+NmA?hK)NH=3% IrX[i9&C[48fM.8q,'=*O@2># !9-( 'B\:EwW1]:a@ L L @  @$(H $(H@ H ?2?399/++]2]+]210++!!4>7!M:PVM&<@<:]&*@ &#%+5+5:e @ L F$(H@ H @ H ?2?393993/+8333/++]29910+!>7!!#!$)5'~ 5>2:0 (RK<8A:Z@=)vg+;KFOO ???/9/]3]]]]]]]qq10!!#".'532>7!l*,3F^A-/' &+$#);|ˆP!F~ \:ڶ L @ L H  $(H @ H H @$(H`$4T  ;kt[4D4dtTd {dK4 K$+;kiDt+k4T{dK$ 9Dt@G+pO 0P`   ?33?3993^]]]]qqq_qqqqrrrrr^]]]]]]qqqqrrr^]]]]]qqqqrrrrrr^]]]]]]qqrrrrr^]]]]qqq+^]2/++]293310++!##!>7!#4>7ft( &nuGF@:AHHA1tCIGF: R@F@$(H  F  $(H @ H O ?2?39/]q/++]2+]210!!!!!}:T1:PNRF:>@F@$(H F$(H@ HO?3?/++]+]10!!!F}:|:WQSP7NF::@O(8HXh @H@HF'B'gwWgFRH69H14H+.H@ H   u c  @H        b r T B  0       P ` p 2 B $         r d P 2 B   $      r T d 6 F  "     @ Hv b  @KH        f v B $ 4       j  @>nqHd  & F V     d t F V 4 "     @CFH d t V D & 6   9 @C58H  b @ P $ 4    ` p  @ ` p  @ HO?2?+^]q_qqqrr_rrr+^]]]]]]+]qqqqqqqqrrr+r^]]]qqqqqqqqqqrr+rr+rr^]]]]]]]]]]qqqqqqqqqqqrrrrrrrrr^]]]]]]_]]]]]qq+qqqqq/+++++^]q^]++^]qr+M10!!!!:x:|Wh:\RW6GW.P@-7!AGHG %YYYYYYYrYDYTYdY"Y2YYYYYYYYYYYdYtYVYBY4Y&YYYYYYYYYYYdYtYBYRY4Y"YYYYYYYYYYYFYVYvY0Y$YYYYYYYYYYYvYdYVYDY6Y$YYY@YYYYYYYYrYDYTYdY2Y$YYYYYYYYYYfYvYBY4Y"YYYYYYYYYtYYfYDYTY6Y$YYYhYYYYYFYVYvY4YYYYYYYdYYY@YY$YYYtYYY0Y$YYY8YYYYY[YY$YDYYYYYYY Y@@3YPYpYYYYYY_YYY Y0YYCUOK3234&4&5!>324.#"32>%4&#"326-^b,WPC-p^Y+-^c1ZM?/k_Z+T#8H%/H2%H9$aa$H9##8H$^e"{ЖU-I6(5;aYi[Ty{ΕT.H3 '26k\TykS!*Zc$Vk#UmjT#d:[h: B@ H F F$(H H O?2?3?/++]3/103!!!3#:|S::@#( L F@$(HF P ?2?9/3/q+]210+32>7!!#".5k$=-!;:<#+U\d9JrN(:~!9*  +RuI:  @(+H     t F f   $   v b T F 4 &         T d F 4  &       t 6 F f $   v d 6 V )        r d R D 6 $         d t F V 2 @$        t f T F   " h      v T d F 4      v d R D 6 $       v d 6 F   8     P p  @    0 @ `     @ P p @ H O?2?33/+]^]]]qqqqqr_rrr_rrr^]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]qqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]qqqqqqq^]+]9/10)!!!!!w<;:||h:@ H   @(+Hy    @H &6ffTF$ʖfD&6fvT&FFf brTF$4tVfD6$@vTdF"2gtVfD&tbP$4@Pp4 7$4TdkTTd+; H@ O ?33?22?/+]^]_]]]]]qqqrrrrrr^]]]]]]]]qqqq_qqqqqqrrrrrrrrrrrrr^]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrr^]]]]qqqqqqqqqrrrrrr^]]]]]]]]]]]qqqqq+^]q+q3/9/103!!!!!3#=<:||&:K L@# LF F R O R ??9//q9/210++2#!!5!32>54.+9tvE]78\BMzU-|M(':%&7$F: x L@* LF`$ F@$(H F  $(H @ H R   R ?3?39//++]2]]+]9/]]10++2#!!32>54&+!54&+7!5!.#"%>32#".4 lP:P352O9X` Ivi{F@oyGh de%GiD=cE%cSLa8LӇ|͒P?iN(a@!G/ o  G* F  $(H @ H O?O&O &O????9/r/++]29/]310#".'#!!3>324&#"326BDŽuM Mv~:tnsy ;S2r||ΕSEm1:TcvBTzaZ+:e@ M M  LF@ ?F0R@HR ?3?9/+9]/]3/]8329910+++ !.54>3!!#";BB2U?#@zqfg\aM /KeBOuL&INHMP-&Hi@ (& ,*%+55+55 Wd75 L0@. M!! F333999p999# F$(H@ H#R (P---- --@H--P???99//+]q332/++]3/]322]qr]99//10++"&'532>54.#"!#535!!!3>32E8S  '1 .J53S.r?iK*-SsE A9. |p@pXAlP,-&t@ &W %+5+5P7N$Z@5 FF @ H &GOO y- O@?2/]?3/]]9//2+3/9/10".54>32.#"!!3267R@F{ivI `Xek5nfPl  GyP|ӑL8aLSced Ki?HOV&Of -.H @ #$H @ H @H @H @H H H22H@ -.H%+5++55++++++++e&i@&% H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H ||H {{H xxH ttH qqH ppH mmH jjH iiH ffH bbH __H [[H XXH TTH PPH MMH IIH FFH BBH ;;H 44H 00H ))H $$H ##H @ ""H @ H @H @H @H H H H H H+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++55+55WMk:$/! L@c L)vg+;K%Foo +F1@1/R%OO %R???9//]q99//]]]23]]]]]]]qq10++!!#".'532>7!!2#%32>54&+d*,3F^A-/' &+$#)354&+32L.J53S4?//105!>?//105!?//105!T'BB?A@- O_o 0 ?/]]qr]21054>733(0#?Cn\O##NRR(?+@   0   ?/]]210#>5#!)0#Cm]N$$NQS(B@-  O o    0     //]]]qr]210%#>5#!(1$ BCn]N##NRR(?)@ 0  ?/]]210##.=#0)(SQN$$N]mC?h]@+ _p_@ H ?/+]q]2/]qr]21054>733!54>733C)0#3(0#?Cn\O##NRR(Cn\O##NRR(?h U@6   P    ? 0  ?/]]r]2/]q]210#>5#!#>5#!h(9LR)0#Do]N$HQDo]N$$NQS(h|@Y  / O  O o    o  o@+.H@ H 0  //]++]q]2/]qr]210%#>5#!#>5#!h(0$R)0#BCn]N##NRR(Cn]N##NRR(v 8@  0@  /?229/]910#5!%LMJxsU@$  0@  ?22/229/]3291053%%%%#5UUTVdd3A}: L@ L  L L /3/]2/10++++#".54>32/Pk=4.#"32>2#".54>4.#"32>2#".54>4.#"32>~,:hN-.Ni<32 (>I&1@*nk,;$`[.("# . lyODp@G  Z   _  _@`pO / ?  /     _ ??99//]q]qr32/33/2299//10!!!!!#53!}:もtо^8@' M)( L-((.'+n  n)8n@&5H):@&=#535#5354>32.#"!!!!!267^ 54.'.54632.#"4.+32>"A0}qhQlPn:ĂAVX} " ³S^>YO$=,#>V41aL/'0EC :O00eQ4u%GhBKSCeD" z{q0M8=o_/V'%1 K<_D=0 ! !9V?sy|& $ ";YCY6$9] O=@ M7..3%n$$n?9-3o 960@G-//O(s%%/%%%s @P @ ?3/]q?3/]99//]q]q3232/]32223/9310+%267#".'#73.5467#73>32.#"!!!!HV  >ll}|F (Mu(WLwelA TJ/J7#GT7R\RPe:Nt#{D7aLJR GpQ  CrS/6!59M@  L L4@ L. L* L$@ L889667@5999977979"D,:_"o"""O@0$'H`pO /? 8?1I'6????3/]3/]]qq+q/]22]99//]]qr883]3]10++++++".54>32.#"3267#".54>32#34.#"32>cW(?fCKqP/ B;UEFT74>324&#">FPU .?UnF@D!E%\uS\0A{oD69". 6U:jk3g_S=#  Dh@'LnHbn&`VET(6EVd+?*@ L$ L  L@ L H @6"""" ,A/A H  @% 0 @  ;1'''   ! ?33?399//]]99///]2+]299//32+10++++!5!!#!&'.53#".54>324.#"32>{Z)B+U~TP{T+)S~TXQ&,. +. G./([(12+c,3oM\33[NK\44\K8J--J79L..L}*2v L@A L @-2,/-/,---oO_4 -%+/-0?32?3]q2/]+M9/2910++#367>73#46767#.'&'%##5!#     77-T8"''$=H=#')#7 U9q@C M M0(  (0(@(`(p(?O((5Z;"Z550****''*_)_??322/3//]]2/2/99//]]q3310++267>3!!>54.#"!5!2.54>]/dm; WvH 3a[[a3 JwX=oe/]Rߍf35+esJel99leJse+3fߛRX|H"/B@#I1/I0//) ??9/9//]29/10".54>32!32>7.#"kƆE,Lfv?qQ@NX.Kt]M"H$Sn;L]53WJ<"]ob}]<Oу-# 73!;H:RR:H;)"bADp*$*pDAb"V@ @ /299/105>73.'#"bADp*$*pDAb"V;H:RR:H;#d^D@  //29910.'3#>7!5;H:RR:H;#"bADp*$*pDAb"V@ @ /299/10%>7#.'53+"bADp*$*pDAb"V;H:RR:H;d^D$@@ //29929910#.'5>73!.'3#>7;H:RR:H;;H:RR:H;)"bADp*$*pDAb""bADp*$*pDAb"&@@@ /299299/105>73.'>7#.'5"bADp*$*pDAb""bADp*$*pDAb";H:RR:H;;H:RR:H;H#(@#  /299299/3210!!5>73.'>7#.'5 "bADp*$*pDAb""bADp*$*pDAb"hPX;H:RR:H;;H:RR:H;5-Ca@+  M  M@ M%%.F@ HE:F@H3R?)%% O)?O ??3/9/3/++29/10+++]#".54>3236454&#"7>32.#"32>  Z}e^Q#,D`}NLzjo974-'kBn^))2)C5( "2 3WC/1iji0uJ@mO;~a:VL, "\$>-+F\a`(.L6Q+@  M M M M@+ M M   0P@7]`HO9@` Pp _??9/3]]qr^]]+qr^]293310++++++35!.'!+p DV/aR9:Sa-O9$@Z Z 0`/2/?/]10!!!C9TH9D @)P`@-H[O [  [ 0@2 H_O_o/?O*:H _/9+]?9/]q39+/]rr99//]+r105 5!! !^qK9G8U9X@ @?/]105!U9jT@ @@C Mo   / _  ;  p O o ?/9/]qqr^]q//+839/9333+}ć+}10##5!3p7PHm#3Eu"@ L L L L4'/G>$9*C@/ ? O ? O   /]q332/332/]9910++++#"&'#".54>32>32%"32>54..#"326m/VvHgAESa8FxV1/VxHgACP_7K|X0);`GJe;p1T>"4`UMc9o1T>#4aq`e^f5G))H5/J35H*'G6_` //103!!^j8^@  //3//104>32#4.#"Dzbc{Fg5_NN^4tLLtbl98ld9%Q#@! L L!F  0@#&H'&P P/?9/+]q3/2/10++".'532>54>32.#"+*%>$,<$4ec(W?$,<%3e95H*Wc6  6G'Wc6+97>@! M=0 L<0 L+@" L,0 L M0 L0 L0 L @$ L 0 L:@+ 9%.6* ?/]23/33/10+++++++++++"&'&#"5>323267"&'.#"5>323267.KKY'C=:3T)RPN&-k0D4 =?F)KKBm.'C=:3TSL244D4 =?F)/ !'-  2*,  &..2*%H+@. M  %5E  * : J  /?  @M%(H?@$(H@"H 0 0  0 p  @ ` p  ?O@H/+]q32/]q]q32/++]3+299//]3]92]910+#7#5!!5!33!!́ՁGZӃ#JdGP B@   @ ??/]/]9//]3322105!5!5!d8d13 @#RR @$%(H @$(H@ H0@/]3/39=/33//++33/+3/++++10 5!1@wAZ13 @#RR @#%(H @$(H@ H0@/2/]39=/33//++3/+22/++++105 55!1?7 #@i y iy///10]]3 %! {RVdG,@  P?_?/]/]/]/]107!!d>T"  H  ///10+#47632#"'.'&#"TR?K3% !$ V{{?0(4 ''#i  H ///10+3#".54>3232765"Z(g>2%!%}86'"%)j%?33105! %iH??103#ؑHK"??310!!#(in"??3105!# (%%H"??3103!!Hn%H"??3105!3 %H' ???23103!!#iHnnH'???33105!3# %K( ?2?33105!!# i%n%H( ?3?33105!3! %nH 3  @  ?32??3223105!3!!# i%nnqj% ??3233105!5! AّH*A ?2?3103#3#ّhHK Kj 1  ???23310!!!!#(iijב" 3     ?3?2310!###בnn#j ? A    ??3?3310!!#!!#htjo"j 1    ???333105!5!5!# i(qב) 4A    ?2?33105!### ܑב%nj ? A    ??3?3310#!5#!5!ґttj)F)ޑqH 1   ???233103!!!!iH"ב%H 4 A    ?3?33103!!33A$Hn#nqH ?  A    ?2??33103!!3!!ّK$hH"qH 2    ???332105!5!5!3 iqב)%H 4A    ?3?3310!5!333$ב%nqH ?A      ??3?3310!5!3!3!5!$KqFH 6    ????2233103!!!!#iiH"ב"H 8     ??3?323103!!#3#AHnn KH I A     ?3?3??223310#3!!#3!!jt " "H 8  @   ????3322105!5!5!3# iqבKH ;A   @ ??3?332105!3#3# 㑑h%K#KH I  A     ?3??3?2233103#3!5!#!5!A㑑tHK )ޑj 9     ?2??3333105!!#5! iiq"h :   @  ?22?333105!!### ב%nnj J    ?3?32?333310#!5!3!!#!5jtttAޑ"בqH :@     ?3??3333105!3!5! Aّ"%H :  @  ?33?333105!333! ב%nnqH L@  A      ?3?32?3333103!!3!5!5!AH"oHL  @    ?32?32??33222233105!5!5!3!!!!# iiiqב"ב"HM  @     ?3?3322?3322223103!!###!5!33AבHnnnnH ]     ?3?32?3?3222332233103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??/310!!* H??/310!!* *g #'+/37;?CGKOSW[_cgkosw{1mUE- y@ xlTD, xeM5@ dL4qYA)}@ |pX@(|aQ9 @ `P8u]=%@!t\<$x||xiI1!@hH0 gckhd`h_[WT\XTSOKHPLHC?GD@32#".732>54.#"Fz^^{GG{^^zFV9bLLc::cLLb9d^{GG{^^zFFz^Lc99cLLc::c# /]/102#"'&5467>76jnk5RS4l9R46n9:m64R9) //103!32>54.#")Ex[[xEEx[[xE}A[xEEx[[xEEx)+"@" '//103!4>32#".'32>54.#")Q:cKKc::cKKc:MEx[[xEEx[[xE}AKc::cKKc::cK[xEEx[[xEExscu" //10#"'.5476324'&#"3276c%%%V3eK#%HJfgGJL33FF3331HH13}5V%#%H%V5fHJJGgF3333FE6116y!-9D@] $ t $t+{+{D"(?4.(.(.1%+7+>:h:Y:G:::b^0H[[׀ؙٙW .. -- .. --#_[)4`@7*/$'!04h4Y4K4=442-_oO-_--- /99//]^]3]]]]332/99//3310#"'&54676324&#"326%4&#"326327'#"'ZZZZ. -- ., // ,0^b>LLH[[ -- .. -- ..[_#Fs;3F/@ H4.4$w##@M H H;;  H;/4#4;B p ?   9+>0/43?3O33/^]]]]]/]]]]10]]]]+]]++]]]+373#'#5.''7.'#5367'7>7"327654'.B 965--,,(17:"B?n0+(. P(9p6Eu0bb0uE`cc1u;  -;q9>_1(,=20db2/aac02P&/b@>++++""""P'''@%(H /+^]2qr/]32/qr]qr9/3210.'&547>32!!#!5!"327654&'&7Z#GS,e>SW;=>B.*PlzS++VSzmQR FF;G,+G>>=T,G;QAQF@(1A;NN?  33FF;A1?J777B??/^]]]99/r]]r9910.'.'.547>323267632#"'.'#"'&547632"327654'&6%( ? .@$    TVWvvWTTUzGSZ>==@XY<>><      "O-@" '*R*Qm}VXTTuuWV+ >=X[===>ZW>>;/(@& 0 ` p  "@ H"O_/]//+3/]/10#"'!727>'#"'&547>7>76 (_E#%?BXc$&}V+B,-SZB?N9En&86_,+i?~BCF_?BWVc %%1E[wK`_B?[J;*U/;q9S<K/@9M?4=C /)//99//]923/]10)7>7>7654&5#"&'&547632.'.547>3267>32#"&'.'FTl)@4:Z+X-;a)OII]P3N(a2+C.=#!K2dmy;*&StsOP"4&sN&(PNmVb(%)LtvSP<3=-Q}.-L'fZy'&@) @ P p  ///]10^]].'.'.'.547632>32b*gL8E+%DFfbN/"X2U#F)N7>-qEEt/'xSEj( #&b<^Q2P;`N]]5(o]H: 9Pwc;kM;!0@! @O_o! //]9/9/]2103#>54&'&'#"&547632L3:0./9@%%Hl9:Q0*%#Jj9:;b&J5-L9<gu#R#p@' LF%%/%?%##_! F  0  @H Q O!  S??3?332?/+q33/22/]3/]]]2210+5!!!#5354>32.#"39螞Hz[0]%-'3 :||q>iN,  1 U#Rg@% LF!!/!?!_F 0@HQO ?2??32?/+q33/22/]3/]]]10+!!!#5354>32.#"3:螞Hz[0]%-'3 4||q>iN,  1 UW Dس M@" M@ M ?/]q/]+/]10++#"'532654#*7>32 GtU-8*K>q &9#[j,G3v% Em\D"@_/]/]q10! 1g9\ '@ / ?    H /+9//]9/10#>5#53\"-1l,G=30T&# T@3/?o@H  @P` ??39/3329/q3322]3/+]q310#5!533354>232'LpJDeF($1:44"3 O.9[?!7^D& 8I*  @<5>#@Y+p,@   ??2/]]29/10#4>7!5!p@_>(Ie75.546324&#"32>4.#"32>y#HoLLoH#*5) .O8 9M.'=+Z:Vh2G*5++=$//$!"-7&b@ L L@p@"5#53f"-1l+H=30`.g\I @@  @ /]9//]291046733#g,(-1lNWu/0`.WT @_@ H/+]/10%5!+WU @_@ H/+]/1057!W++ _@D& 6 F )9I &6F)9I0`@p_@ H/+]32/]q]/]933]]10#'##53ƟӠ+ ?@(0`@p_@ H/+]22//]q93310#53373˟)@__@ H/+]22/3/]1053!53uX@= L L 0P`@p @H  _@ H/+]23/+/]]q10++".#"#>3232>73,YTK" /VI-ZTI! .V&/& --fX:&/& .-fX: 1@p  ?p _@ H/+]22/]]]10#573#5732X"+"+L@8 P0`p _@ H/+]2//]]qr10".'332>73[P~Y4$2?"$?2"3W~0Oh9 2##2 9hO0V H$<V_birx$$7h$9h$:$\ (  &" ^ (  8; \  VCopyright 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark of Red Hat, Inc.Copyright 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark of Red Hat, Inc.Liberation SansLiberation SansBoldBoldAscender - Liberation Sans BoldAscender - Liberation Sans BoldLiberation Sans BoldLiberation Sans BoldVersion 1.06Version 1.06LiberationSans-BoldLiberationSans-BoldLiberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Liberation is a trademark of Red Hat, Inc. registered in U.S. Patent and Trademark Office and certain other jurisdictions.Ascender CorporationAscender CorporationSteve MattesonSteve Mattesonhttp://www.ascendercorp.com/http://www.ascendercorp.com/http://www.ascendercorp.com/typedesigners.htmlhttp://www.ascendercorp.com/typedesigners.htmlUse of this Liberation font software is subject to the license agreement under which you accepted the Liberation font software.Use of this Liberation font software is subject to the license agreement under which you accepted the Liberation font software.http://www.ascendercorp.com/liberation.htmlhttp://www.ascendercorp.com/liberation.html'  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni00A0uni00ADuni037Euni00B2uni00B3uni00B5uni2219uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni02C9tonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveuni2010uni2011 afii00208 underscoredbl quotereversedminutesecond exclamdbluni203Euni2215uni207FlirapesetaEuro afii61248 afii61289 afii61352uni2126 estimated oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxH22073H18543H18551 filledrecttriaguptriagrttriagdntriaglfcircleH18533 invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluniFB01uniFB02uniF005middot commaaccent foursuperior fivesuperior sevensuperior eightsuperior cyrillicbrevecaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc  LNDFLTcyrl$grek.latn8 TbDFLTcyrl&grek2latn>kernh(6Tft&djxx@bxbxr&4~& NX&2l>d H : d  " 4 V p . \ r 6DNX$<V_birx 7h9h:@`{O,ePh6/yp/A<tEXtCommentCreated with GIMPW%tEXtdate:create2012-03-20T16:22:05+04:00jo%tEXtdate:modify2012-02-10T16:36:00+04:00\IENDB`instead-3.2.1/themes/default/cursor.png0000644000175000017500000000125413267071774017140 0ustar peterpeterPNG  IHDR}7 sRGBbKGD̿ pHYs  tIME  ܶtEXtCommentCreated with GIMPW IDAT(ϕOHa;*D,IARB%ҠKu O u !$/!Zٙwv޷úe~ymmôYR}s:V jzn<*X4Lt}=ZO2x0z.l,:X[\ĸ3>(o"$b"1i?4;n%66(b 7pED(fSwplfQ%!e>A2u}׎7gbbb~PqxG: 珹)HD udD( ҜVO'*$n}'<W>aKl$2>Yg[~CzzK$IFbJ8D Kh %VP2!ADPvIENDB`instead-3.2.1/themes/default/use.png0000644000175000017500000000301513267071774016414 0ustar peterpeterPNG  IHDRRsBITUF pHYs\rtEXtSoftwarewww.inkscape.org<IDAT8}YPS%*FPU(]QpDŲ x,S ZZЦHTY !{BK!,δp10po:#,>:\ [;`"`CRX1*ȭ 'ah)x*#b0cPcG ч'_H}2pfxj))03 QAnx`'b]uX,8 ڀW1dF l[n`v*ZlV& XjI,:9)t_`2%!ٹØqol@>XVԕv-LrOMF̢l"(ߡFCwYVڮTj ,s^ o-5L~~XcljV 2)| EyzEFc! FؔL@s4Cj=CR2aOTV}cI&9.o1*BqdWYQTKy[.z)(**5Zc 4ҧMZ}5~V<Տ%"UH٪dX=^sզ٬COGrZ4; .jKOUbuAQptu URѺ,D*en4:FU<6j=Zj4 l.].w^c`3) y'grXš<'3 8+[H{āX: djzVL'r<XV'ks!3^OƐE W+uQN kJܞʓdQa-uAtvb@efWʌJ!W-vVp ,x!8i;}gAzkKx^@s }~9i6RK@Du/PQуK=A8sWged&̻@N,J[|$*h˒*LyڹN>NQV۝Xo WNؓS%;"6y Ms;pCl|Xn;bs{[z7{™"oZ#7#w @==yGMos97=yDu{t fxpשZM£Ldd:>H M.3tn$D~;,n 9?˰cqLzZn_6b>:)(u%s:<#o.CF?l;nS\°PQ3O.@kIENDB`instead-3.2.1/themes/default/click.ogg0000644000175000017500000001300513267071774016675 0ustar peterpeterOggSk\KN9$vorbisDqOggSk\Kt-vorbisXiph.Org libVorbis I 20070622vorbis)BCV1L ŀАU`$)fI)(yHI)0c1c1c 4d( Ij9g'r9iN8 Q9 &cnkn)% Y@H!RH!b!b!r!r * 2 L2餓N:騣:(B -JL1Vc]|s9s9s BCV BdB!R)r 2ȀАU GI˱$O,Q53ESTMUUUUu]Wvevuv}Y[}Y[؅]aaaa}}} 4d #9)"9d ")Ifjihm˲,˲ iiiiiiifYeYeYeYeYeYeYeYeYeYeYeYeY@h*@@qq$ER$r, Y@R,r4Gs4s@BDFHJLNP@OggS9 k\K24 OPH5b6_H + #=G[b  ZUEZ"bj(V-X"E#6AED(`F[2]4|)1"/$T__2| H IhZj|I!T֢͆C)]VU4"|y EU؊3}EWgf13liG`2]ST#dezŖJlF%b:/PTPf 1V*FE +v[P#X`ۺa5c&mogiTZVլլ֬^zi/עR||e纋 */>ZYŢUTj *XAШ 02`slG6>ϔ*Z5) pPPΡ|9G.X@1L uJ@bWyi+ZEըblݚn,+EQqbeYpjett2L/ր.ēxٶq HU'2JMU)5ʤ R`U *j)3e.ضdXZS԰:d Xb)V C183Xj_]WJ*UDsi)#%D%"ZX 7N Zh X80j9<0Thz` Ը L6rڀi\$5LuiכfNžmnvTbT.ۂ&%DUI"3\F6 .(@S@e\;Ϟ"kD22md`m*cBF#"?‡ܧV ϾX y:n*Y 鶌;eW_r/aFd4^ N&ԵL#w(H"bE6hz(0ZXS(Ga&l˂isY#@jFJndF̲MRLJۛ T2YmU϶!-Z}#2v~d{gO]|˰is@?+_?lP%-DI8fnH'BNn!D:,0,}Ye,_ct=˗&x@t_xQinstead-3.2.1/themes/default/sans-bi.ttf0000644000175000017500000040645413267071774017203 0ustar peterpeter0FFTMM; GDEF GPOSC,GSUBNC +T dRT~/Z]33Zf  Px1ASC!!Q3>`: D9OsAsp1JLX}989.9sUs!sssss_sss0Y|{|$d$V$$9d$9$s$$$$9dV$9d$VwVVV9oRUs!s #s?:s?J#9#9$s#9###?;#sVUsn9css=evsLssHs'=s>hsHK>k3dWG`sj9~Xbfs&bbnQV$V$V$V$9$9$9$9$$9d9d9d9d9d~9#wwwwVV$#s s s s s s *s?s?s?s?s?9#9#99#:#?????dE*UUUUsss s s ds?ds?ds?ds?$::V$s?V$s?V$s?V$s?V$s?9d9d9d9d$#$#9$99$9#9$9#999$9#B$s#s9$$s#s#$9#$9$+#$#9$#$#$#$#9d?9d?9d?g:$#$$#VsVsVsVsKVwUwUwUwUwUwU9cVsV9#ss *9#*VsVLJjD:?9q9$$$_V$$9d9$$V$$B9d$V$V`V?9$V9%9Cf9sl71%vl9C%ssi1?CBLO@E9f@L/b79Cf?f7V$$dV9$9$sV%$k7#$$$oV$k$$$$$$9d$V$dk7?NV$$$$$*V#s ]'E<s? UU$##?#s?#s?s+UjU{UM&&j#s?##?s9#9#9$?%#$sU$#9c9c9cVs88s,k9999ss2ZHI!OVT+\ss;s!$ +*%]b?+}d|Q1dDd;ddWdWd"g{mm+))s+kUFQ@;@<fBJJ]PFU]X@-o:B~~ O\_    " & 0 3 : < > D  !!!!"!&!.!^!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k ~Q^    & 0 2 9 < > D  !!!!"!&!.![!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&jG/vhzyws /,$#>1"DC:741.' ܸܿܳܰܨܜIFE(&%" bcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?w6   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnj#ti<7q>?fu143:kzvbm6@;2l{   }8w KRoNOPxSQL@EYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,F#F`F# F`ab# # pE` PXaFY`h:-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY@cTX@C`BYYYYY-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,zE#-P/@2o@@ ===U=Uݸ</A  @@F0GOd`@  @`p_<@2/?O@&)F/?@F5P&'%%`K&&&&_o@FG2mvP&uP&tP&sP&/y?yOyqopGoGU3U3Um)mlaP&`_2_P&cGbb bF)b9bIb^G][\[3[G2@AU2UU2Uo?Y_S@S(,F@S"F@SFRQ(QOPOO)OYOiOGu@=PNMMMMGLG2KG2JGIIGHG2G2UU2UU@=@ 0p?_/Oo?_o_TS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYststust+++++++t++t++++tss+st++++++sssu++++++++s+t+++++ss+++++++s++++++s+s+tu++++ss+st++++++t+st+st+++sssss++++t+++su+++++++sssssssssss}y:wW' ,"-mB?]%u\1DsNpp`HjgaAohS}D,,,,`.T`(V  0 Z   ` 0 TVPbpT&>PHD>< !""#$&$%^%&H&'@'(t))v*2*+X,,-<-./D/0&012Z23&34b45\6D67788999:^:;0;;<<=@==>.>>>?????@@$@@@@@AA.AHA^AvAAB.BFB^BvBBBCCCCDD"D:DE2EHE`ExEEEFFFFG G$GPTPjPPPPPPQQHQjQQR0RHR`RRSS,SDS\SSST TdT|TTTTTUUVVVVVWW*WXXXXYY Y6YNYfY~YYYYYYZ Z"Z8Z[[6[N[f[~[[[[[\\,\@\X\p\\\\\]]]2]J]^^,^V^n^^^^^^^_ _._D___`&`t``aaaaHavaaab4bNbVb^bc ccc$cccddd&dddldde(e0e8eefgjgggggghhirijfjkdlllmfmnnoopRpqXqrVrstzu@vvv6vNvfv~vw(w@wwwwwxvyyv|L|d||}^}f}~J~R,(@Ɓ,4D4ҖjV"*d|0ЙؙЛ"f~ƛ(D`ZrRr|Ң`즒ΧDlv6ڬl&ޮtnZZ|³4N2JԷ@^8f &HjԺ FxȻ&`&V(\ֿ B8n2| 8PhD2NvȄȒȠȮȼDxɪR˂2̬Dͤ*~θzϠHjHx(Jj҄ҢBnӢDdU./<2<2/<2<23!%!!D $hUDO@) RR 0@P`@,HlmX       ]]]]]]]+??0//]q+]q/+<+++10#!!&4 4/@oo p ]]?32/]q]10#!#!`HHAps@*     R@ R  @L    @ H!       O   /3?399//]q]q33223322/]]33+2299//++ć++10]]3##!##53#533!33!!ERPPOFTR3TToH5F^}}LLh1:E@~00A H@ H$;%656E6%555E5+2!,-56 A@ r)9 2o'&/&&G;o @-56t,Au !?33/32?33/329/3]29/]3]]]]q+}]]]]++10]#7".'%3.54>372.#4&'2>"8L҆!p RoE`[IMf;-Nhu};nY_4 *1C\k:X_I2]G*r'9%C3R9op;-XR*XY?[xLLxZ?'~.Pm>9,=%>WtMQ-E+! K3Ep.H]a5@`^a^_`_`^_a_a_4QA4,"'4[['[[c% I/T<_`fc'ccccWc6cucWcGc6cccccc'ccc[cKc"32>7654&2#".5467>"32>7654&#3"?pU1 cw|5>lO. _ry4:3+ ,*:5-2`?pU1 cw|5>lO. _ry4:3+ ,*:5-2 > IvU%]0~["$MxT%[.W9gT5Y%IE9fPmMJA| IvU%]0~["$MxT%[.W9gT5Y%IE9fPmMJA%1B;O_ @6I*DfCB BA A; ;3 3<L  +   33/X?XOXKAJE4A''"*FFSSXPIP  XI!"-a aKJ/?OfSUS[AY'A44!97.54>32>73267#"&'#"&2>7.'>54&#"1@r\ 8lhK|Y0L] )3!Iq0>GO*(]39'!?+[@F[{T"B<4"<3((P>'1F ?lN,C:'E3bWpV 2;A!Rf9 A`@UeP&*RQS,NjS8okc+" <9." -cc`+.@V9+G1g,E .8H0363N@*6Fv&6FfvVfv@$'HoFVv @HF6&vfVF4$vfVF6&vfV&fVD6&tdTD4$@vdTD4$p`P@0$ip`TD4$tdTD4$dTD4$9rrrrr_^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]_]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqq?/+^]+]qqqr10#!IJWj=@'   H   ??/]]2]]9/3]10]]!&547jHKIKAÁlɳL- oLWn@ +@.1H/?   HT tdtdTDD4$td4$tdk$ jK4$@4d4+k;$ :_rr^]]]]]]]]qqqqqqqqqrrrrrrr^]]]]]]qqqqqqqqrrrrrrr^]]]]]]]]qqqqqqrrrrrrrr^]]]]]]]]]]q??/^]2_^]]9/3]q_q+r10$4.'!  &8$ KVAÂWdrOJrXm3@!   `    ?/]]q]10]]]7''7'73>DDoh=y{=h} a@< _  @ 0P ?32]q+9/_^]32^]+10#!5!3!q9hh1S@     @H   XYX]+/]10//]+/+<+}]2910%#>7#![ $.7 #@4$;!BCn]N##NRR(18o#@P/?O//]]107!8//.17@ @HXYX+?0//]+/+<+}103!.;!;14@??/+}10]3LK) U_58@#   o&&71o/s)s??/]]10]]]]2#".5467>2>7>54&#"Sj>L]jtz>^e4N_mty7[L>IO54.#"%>32! %0zsU2+<#'D9,R|nqj22Vq{j&,Std\W]e;(7!*G5;QZ11ZPNrd\Y\c8\;K@,))!::+!o6o= ,+:s;;1s&s??9//32]9/910]]2>54&#"%>32#".'%32>54&+7/iW9MP[x^cfo:0]V?fH'D~|x?#9O18S7lpk,=0WGHSZ^4^V)/YQL~]: /LhBWyG6aO&2C) 8M-]]P w@H Rq0/tX+?3?339/332/]33/]]q/+<++10]!!7!3>7!j66)r* !#Xo273 +10,t@ #o.+fvW@-HvUe,(sss??9//3]2]]]q+qq2]2/]10]]!!>32#".'%32>54.#"!<O+W1>N0Nd9N׉pqA 0H3CeC!3E(Ab' 6jewƎO5]K-*?*,Mf9:T6.-_~"4g@D   +oo*6'#o0tP`&s &s??9/]]q/]2]]2]]10]]]]]".54>32.#">3232>54.#"ko9_EpM JBs'5gO]3Mb[3V>#0A&-XE+EwYJ}_)IFHY1_[oȘZi|(MoG4L1"Cf2@ @ o @H s??/+2/]2]]10!!67!,TydM#f3 p'9Ma@< & "5-- oIo--O5o#?o@ H :u((Du0u??9/99/+]]99]]10]]]]2#".54>75.54>2>54&#""32>54.en;+QvJ3U<"FЋws8Ci<\_E<32#".'%32>4.#"32>7>1CLY6R[1Qx_uB &fUpJTN,[UI@/A(6ZA%/B'&K@0 %8&9gVqđS>yrDIL"M(S|T0KR'e*I7(OtK-G12P;,YB \@@ HXYX ]+??0//]+]/+<+}10!!7 7N7 7B j@$   @ H  XYX+?/]10//]+]/+<+}]2910! #>7#!7 7 $.8 #@4$7 RCn]N##NRR(|}h@8RR?_ /]]]3/]39=/33/3++++10 |AB{#~)L@7 ?O@H0p @`p/]q/+]q/]32105!5!{J|}h@8RR_ ?/]2/]]]39=/33/2++++1075 5|@}DEy%)f@8()R&'(')&'&')'&H&&!G+ + +' ! '&_XYX+??99/3/]q9//+<++10]2!>7>54&#"%>!hzCAiC"<. 3I`:E[6`en\4!4/ZVVhR%*0:'FgQD$+B=>'?S]d(Xc6jw_x@9 P72 2 l#' `"! p   T/HHT///zzzzzzz@H H;T T*oe" B4[BMzzzzoz_zOz?z/zzzF^]]]]]]]]qqq/?99//^]32/^]+]r3/]9/99//]333210^]]]]#".5467##".54>3237332>54.#"32>7#".54>$324.#"32>7>wLc*G2F[m;_L Dvf 'u/;oX5R욅൉]/"EinV=>54.#!!2>54&#!6H~=.UxIGlI%e?&W{M#!?];ӼH_[-,TyMIsU9 8Qe9}c)I0K4,;#52T@Z`d+G@-  ""!- -@-[`'__@-`-P--]qqr??/]qq2]2]1032>7#".54>32.#"*S{RNgO+xЄI4cNJR 1LjD~C=T^2*H]3uLe;\{|࿛l;@lNG,SA'[$y@S [ oP` \   0 @ P    __ lmX@]r+??/]q//+<+}q]]q]q10]]2#!32>54.+ޣ]=miAtƐR8i`Lᖅ߳[.cJӊb`0$ s@   @1H  \0@P_ _ _lmX+??9///]q/+<+}+]9/310]3!!!!!$T,E,HV-$ v@'\0@P@!H _/@1H_lmX P ]q+??9/+]10+//]q/+<+}ć10]!!!!0U,de,Ld-@-"-^)*))*)))H)H)@6 H ))@H/++*[`   )$*a--$_$_lmX+??9/99/]q/9/]+2]2_]+++F.(*)). +</+<+H+}10_]]]%#".546$32.#"32>?!7!xCmNv8Ȑ[ 1NnIņE)Xa>pbQ.'f.I1[݂8{@lNN.VB'\ނMi="$ @h   R \   0@ R\0@P` lmX@ P ]r+?2?39/32/]q3/+<++ćq2//+<++10]]!!!!!!vv'mrm\1$\@dt@@D&,H_@P`\`p0@P@9&-HP` lmXp@0<rr^]]]]]]]]]+??/^]]]+]qr//+<+}]]]qq+q_rr10_]3!$'y@@0\O 0@0 _ _lmX+??99/33/]q]/F( +</+<+H+}]10]]".'%32>7!7!inC !1E.2B, ,?Lx8g\:1S<"&?S-&mp9$C @h H   RR^    \0@P     @+H lmX  @    P ]]]qrqq+?3?29]+]2]/]q//+<+}ć9]+++10]]]]]+]!!!! e'q{$kX@6 \0@P_lmXP]+??//]q/+<+}q10]3!!$'-c$0@V-..#""6Ff#(%(."((((/00^0&f@H2^ ! !! F V f   !( ! "./!lmXi2)222;2222Y2I2;22t2V2F222222v2f2I22f2)22P2@222$222222222t2d2P2B242&22222222t2b2T2F262&222222222@22r2d2V2F2$2222222222v2f2V2B242&222222222v2T2F262"222222222d2V2F242&22222222t2f2V2D26222i222222v2V2"222222222i2V242&22@3222222y2R2@2022292222rrrr^]]]_]_]]]]]]]]qqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqq^]]]]qqqqqqqqrrrr]]]]]]qqqrr+?3?29//]q/+<+}+]q//+<+}9]_]33]10]]]]]]]!>767#.'&'!!67>7!  $! d^X-t7q/74NIB?935>BJR=;640]-4773,[$@        R  R^{ 0@O^  0@P , #    lmX@P]rq+?3?29]]//]q/+<+}]]q_qq/F( +</+<+H+}++10_]]]]]!!!67>7!t^y k+*$S#'+%[.ud1J@2[o---- -P-`---3"[`%_ _@33`3qqq??/]q]q]q102#".5467>$"32>7>54.V Q k{Rl|Q0XQօ1i0^Wڃ.`1_@xo%K"Azl$R]].$Yh@@[  \   0 @ P     _ _lmX@/]]+??9/10//]q/+<+}ć]10]2#!!!2654.#!R|EQb!$B[7:nbrDRt7O3dp*Bj@C # [#[o>>>> >P>`>>>D3[`###6_ a+_@DD`Dqqq?/?310/]q]q]q9/]9910232>7#".'.5467>$"32>7>54.V sق[Y((&-[1of6 v{> k{Rl|Q0XQօ1i0ߩmbX 8gXes.`1_@xo%K"Azl$R]].$@O\ [` \0@P__lmX @ rq+??39/2910//]q/+<+}ć]9+}10!!!!2 2>54.#!gy8CoO0ClM*&BX2QBoP^j@ 8U:4I-`A=\@<66\9%%0$$$??-\/?O-(a _?r??99/]3]q]q2]10]]]".'%32>54.'.54>32.#"X̍Q! ,JjHL[3&KoJ^{HZwÊRvBcC"-OnB3kdXB&P0a`16P5/L8/B0&>_d_d31Y}LCZk.@&-=,"!-=UoIir<sL@-\ P_lmXp  qq+?2?10//]q]/+<+}10]]!!7!9,,cw!@_  \@O#\@#H _ lmXP#]+?333?9999//+]]/F"(" +</+<+H+}]qqF"(" +</+<+H+}10]]]%2>7!#".54>7!Oz[<'n㒁ΎL' (Ie"N~\dχB;rm785"_+6Q6@ #3#س#&H@]HR ^R ]{ +    /?O O ?_]]q]qq?3?3310]]/]9/]]q++ć++10++]q)!67>7!1r-4w-^'.*)-&_/.@&!$ $  R RR-'-^...'[k! Td@.R\0@/?O...0''- O0?0/0_0]]]]?33?29/39]]/]]]++29/]]33]2++++10]]]])4.5!!67>7!67>7! Y$  N< 0N#, GZ`$;831,0w6>?JF@>9 *\(/-9<3z9. @          & 6 )9)9&6R  b  R^ 0@ /  / ? O       _ ]]]q?2?3/]]]q]]++ć++10]]]]]]]]]]!! !!59o9)[$@eRbR^O_o  \0P`lmXp `  ]]]+?3?910/]//+<+}]]3/]2/++ć++10!! !Dpp$CBB?]# z@yHv@Hb @+ H /? O __?9?9/]]3]]]]+3+}10+]]+])7!7!!:(i-(^3WZ_@M0@P@ HlmX+??/]+q/F( +</+<+H+}10]!!!6r%%Wuo-@??/+}103!) RW@ i   9 I Y   @!$H  V f v  M lmXY 9 )          { i Y I ; +          y i Y )           { i Y I 9        i @Y 9 )           } m _ M = -           { k Y K ; +           { k [ O ? /   i        o [ K ? /         { k [ K ; +     @,     o _   9     rrrrr^]]_]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]_]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqq+??/^]]/F( +</+<+H+}^]+]qqrr10_]]]7!!7!%)%WUB@& @p`]]]?329/q33q2q210 #!B!T/10/105!xNN!//10 7!T+ 7N@O@`  %555E5 AO455KOOOOOOOOOO OOQ/Q()EG/?O((/(_(o(((#Q.OJ AAA@ HA54.JO?>54&#"%>323267#32>7)*V-dl"FUjGNsL&-Nix?D;>7- HtjGu(5GE< TE!5T;2Sl9QvT5 $-B>90ClM*V(' P\T'9$6[C#&>@b77G< <<<P<<<<<@ @,$   K O,'4O$'OXYX@q+??999??/]//+<+}ćq]qrq10]]]]2#"&'#!>7!#3>"32>7>54&WQ~U- X}d}   T 84`P? 5J-3QA3 GN2\Q0p:˂=h^;4% +32.#"Sl S{otq8 M_ntw9ki7QQ8S@3Zig2O\2>q^(^-osI):cIZe%QY--)yq:'=@f 11  0"!"!K""!""""? ?p??;G / ? O   "0(3O(OXYXP?]+??999??/]]/]q]q/+<+}]10]]]%#".5467>323>7!!4>7'2>7>54&#"$LUd ^^/VH: L/D-8dQ-h?˂=6H)P>=t6 ,2 !Qh,M!xm Oe3S&js?:N#/o@N $/ G'''P'`'''''1/G/?OQ//*RQV f   $  ?3]]?9//]]2]q]2]10]]32>7#".54>32'>54&#"f][*B4'Lnkns;Wpl4 cP"LG9,jq->$J@iJ(>rd[32.#"3讞% 5]`-Q$  C< %||qDlJ' @AUWM:R@j @@  ***>066K///T TpTTT0KG/?O6/ >NC*$NPCO$0/$ QXYXPT]+???3/999992/]]2/]q]q/FS(/S +</+<+H+}]10]]".'%32>7>767##".5467323>7!>54.#"32>ij= ^P:V?+ ?SlHOW/ 39gR;   R 5I*3SA2 YT,\RAW%HiEB=AeE=(L:#6`P1p?5M2>9) ,=K(lm7#L9S8K_2b%g`'U#'@`''RK) )$%%R%K&'&''&'O&&&&&'& &$%%P XYX+??339939?3//]//+<++ćq]q/+<++10]]]3>32!>54&#"!YO IZoEv MK/^Q= vk10.*J8 .-)sS..) ?B(Ji@#\@TKPOSXYX   /      qqqqq]]]q+?2??3/]q//+<+}10]7!!)):$W\@QKOO@-H PSXYX /qq]]]q+?32??399/+]q/F( +</+<+H+}3/10]]7!"&'732>7!((2V$ ! "0"  5TuZ &>.vFAlP,# @|     R RK    KO    0 P ` p   XYX O / ]]]+??2?9]]83/]//+<+}ć9]+++10]]]]!!!! ؼU B'KZZl#\@Y ` KP` XYXCr^]^]]]]]]+??//^]q/+<+}^]]]q10^]3!# 4#M@@?  677K898998988+K#K P? 9+#67(78P0(XYXB`BBoBOB BBB0BBBB0BB?^]]^]]]qq^]]]]]qq+?32?3?399//^]q/+<+}ć3//q/+<+}ć3///+<+}10^]]]"!>54#"!>7!3>32>32!>=&*-QA/ w{~.PB/ v  AM_<| FTgA z|(KiA{%&! y)KkAS"KC0,9;/L5wq2T?#$Z&ss%%$y#M+@\''*+R*+K+- -RKO P"XYX+?2?9?9//]//+<++ćq]q/+<++10]]!>54&#"!>7!3>32v LL/^Q= v  IZoES..) ?B(Ji@S"KC0,9;*J8 .-)s?M-Z@@))GP/ //!G / ? O  O&OXYX/P/]q+??/]]]q]q10]]#".54>324.#"32>7>bk|C]vy>6M0,ZQC 8L--XPB a;qha8lxB^;Bzd0U$Hb>Ayf4WWN?@3  "GPA:?.21122\343343333@$H 3033@1H334.?* 439O O*93XYX AApAAPA]q]]q+????999910//]+]+]F@(433@ +</+<+H+}ć]q10]"32>7>54&%>32#"&'#!>7!4`P? 5J-3SB3 M#JVd7!!>7##".5467>322>7>54&#" U $LWeS[5[K9 '=71( <!N-/E.7aQ-m?̂<0L5%!Qh,L!pvNg4Y&1O8#zNi@ARKOP`!PXYX!/!_!]]]+???9910]/]//+<++ć10.#"!>7!3>32L4'{#e   "CIS2 U >#FB;<>9>[;-K9@8%%  G*(((O''''P'';;P; ;@;0G %  0V0f0Ue0+Q("Q @;0; ;;;P;]]qrrr?3?399]q]q/]3]]]r]]2]]10]]]]]]]]]#"&'732>54.'.54>32.#"Cx) $:S81Q;!7U9O`6Kf]lE bU+K7 &D^7FyZ3NYX,$$5#!4$ ) 2MmLZ}O$DnQE> .# + .IjV8@#   K  O   @# H  O OXYX!!]]+??32992//+]F (  +</+<+H+}10]]%#".5467#73733#32670%^5;`D% f%0#h/&1# 8U8-U9*)U:+@+ $$KOP?O -- -p----K+*+*+**+***O***** ***"+ P"XYX+???3999//]]qr/F,(+**, +</+<+H+}]qr]]]qqrF,(, +</+<+H+}10]]]32>7!!4>7##"&54>7v LL/_Q< v HZpE:..(?B(Ji@^"KC0,9;*J8 .-* n:@ 4DT@` HR MR L  $  /P` p`P]]]qqqrq?3?3310]q/]q9/]++ć++10+]q)!>7!n!G !"<.:HHDDHF`c:)+@+)(y((y'' @HJZ #  H@HuR 0@f R"@  R@D  R("(M))) RMd""F"i,<f"))@(H)+" ()@+++?+ +]]]]q?3?29+]/9]]]]]]]]++ć++ć++ć++10]]]]++]]]+]]]]]]).'&5!!67>7!67>7!+!E    &-*    P#)++)#Q n:CD""C|B"$$"B|: /@q      jt${+ %H$e{+t$@` %H)R MR N?Op  O O  `   P @ 0  `   0  ]qrrr]]qr?3?2]]q]/]Ƈ++ć++]+qr]qrq]+qr]qrq10]]]]!! !! Ժ$(4&2[W:%@fu1AQ%5E RL R$$M%%%$P%/%%'@'''P'P%$ P?/33?333/]]qr]]9/]++ć++]]qqq10]]#"&'732>?!>7!:8eoT4S&&1&A><#G",9W_2 .K70" 4CJC4 3AHB5 : @ZUZ4D ;KM P ` p `pOOPP?9?9/]q]3]3+}]]]q]]]q10]]#7!7!!#& ()'v7(\W:@F   #12"2 "22M218#") )8lmX+??9/999999999//]F;(; +</+<+H+}10]]]".5467654.'7>7>;#";;_B$=2G,&5ZF1 C%L-?+ < 1ET,$;,AB8P%W:S3:4#!*<%6U>R3M32S?*  "1@' -54W@;K[ T4TK;kDd $td dT4$t;+d4D [KktdTD @>{dTD$;r_rrrr^]]]]]]]]]]qqqqqqqqrrrrrrrrr^]]]]]qqqqrrrrrrr^]]]]]]]]qqqqrrrrrrr^]]]]]]]qqq^]]]qqqqrrrrr]]]qqr??9/qr10!WueW=@[  4 4&%M%5%%5%%%%%% %P%5%%&54+< =+=<=lmX?]+??9/999999999//]]F>(5%%> +</+<+H+}]10]]]]2+732>7>?.5467>54&+7;_B$=2G,&5ZF1 C7UvM%L-?+ < 1ET,$;,AB8P%:S3;"+;&6V>JnJ%3M362T?*  "2@' M-54vHf@?     0@ ~B^]q^]^]]]qq/9/9//^]]10]"&'.#"5>323267yKKBm.'C=:3TPJ6n0D4 =?F*  &.,2*L:@ RR@=H@#)HlmX@     0      ]]]qqq]]]qq+?/0//+]q+F( +</+<+H+++10]]!35 5,+Lb%?3&/ְͰ'ְ6> .  % #99999 9%99@  %..........@  %............@0167#7&'&54776?3&'ω;$@/c1e [U@TM GZ/Ps53%2rkiJd e[~+,@U ""!$% %  %%q   ,:J.%($ ! $ v! (t/ uXYX+?2]]?29/329999]2]2/3//F-( - +</+<+H+}9/10]]#!7>?#73>32.#"!!!267P*6'^r 3Clkcb5SG%:, 5!xY_wk&i{_e50Sm<0TI.K8~k"ZfHH"64@-#@` (2 /+/_^]]q10467'7>327'#"&''7.732>54.#"0p<+L9!!9L++L9!!9L'@o   RbR^q      w  w   lmX+?3?99//]33232//]/+<+}3/]2/++ć++10]!!!!!7!7!7!7!!! R..Q &쓢TW@ { T  4  d D   4       ` D  $      t d          d T 4 $    t ; +        d 4   D    [ K  k   T D      @/  4 $      D $   ;  r_r^]]]]]]]]qqqqqqqqqrrrrrr^]]]]]qqqqrrrrrrr^]]]]]]]]qqqqrrrrrrr^]]]]]]]qqq^]]]]qqqqqr^]]]]qqr??99//9/]qr3210!!w|I[o@BG G& & M@EW1o/WWo] oE MMo;(R6J@6,v# v?/993333/]]]9910]]]]]]2.#"#".'732>54.'.54>7.54>>54.WsF pSqs/IZ+Af?#A\9?EIgwG tj3cO10Sm/Y@& 77 33 J5?U5U5&@ 0`p@FH/O_ T@EO0E:00::0:0:+[o[O[?[/[_[]]]]]]??99//]]99+/_^]+]q99//10^]]#".54>324.#"32>".54>32.#"32>74^dc^44^dqp`TnP+`~ަ`hd00bdNtS9 />):T58T9)@0! 9Ttd^44^dd^4r~ݥ`,OoTަ``?q\`k:%?S.).%'He>>hK**3/+UD)h ;H@++  <3 @5H ,@% H %%% 8;C+=;==)C )??39/]]339]+/]]9/+9910]]]#"&5467##".54>?654&#"'>323267'32>7:BG-7F.2K2@e~>{ ,&($} /  bMX3&.-&  4.  "7&!6F&N_4$*($Xg]b8  963/#;,HRs@M * *   O   OP`? /]32/]]]]]]9/]]9/10]]%73!73CNCiGo)'iGo)'KN@@ H?/+10%!5!nt>/=F@ :: 1<9=0)00====@ H4=4=&@ 0`p@?H/O_ =4<2CB54C55C4+HoHOH?H/H_H]]]]]]??9///23+/_^]+]q99//+]3]29310^]#".54>324.#"32>##!24&+3264^dc^44^dqp`TnP+`~ަ`EuJ`NKEBCd^44^dd^4r~ݥ`,OoTަ``9/q^v;9']@@    @    #@)]?+/_^]q10^]]]]#".54>324.#"32>>3WuBBuW22WuBBuW3,;##<--<##;,VBsU11UsBCsU00UsC#=--=#"=..=WZ @  O_    @ Pp  ooO/ OoOoO/O/9rrr^]]]]qqqqqrrrr^]]]^]]]]]qq/32^]+?9/_^]32^]+3210#!5!3!5!oUT=G -@" ??/3]2107>54&#"'>32!G$_c`K.,#$?{?\>2M`\N]x9R?56?+'(9"c[3D'32#".'7326(D<>L)**;6L`9v.E,@N-RuGJe?22.A!~2-',*48I-YZ >1! M?3S; "8G$035//]107! +Ws:4@C& %'((K%&%%&%%o%%?%O%%%%%&%6K@$HH@: H  %(. P '&XYX@666`6O6/666]q]]]]]q+?3?3?3999//]+++]F5(5 +</+<+H+}ć/]]qF5(&%%5 +</+<+H+}10]]".5<7##"&'#!!32>7!3267k1@%*jQ;MI#v:C+I:) p   &c$5"  Wa1)!<MX-QsFB ) jR@\    `@ p p9r^]]]qqqqqrrrrrr^]]q?2/39/^]/^]9/]10###".54>3!ϜÛQ`52_Xu-XXT]2~Dg@8P`ppoXYX+/0//]qrqrF( +</+<+H+}10]!~; ;1XW7@! H0  P]//99/]9+10]"&'732654&#*737)QJ4: b0FWWu#* SABaqb c@1    XYX+?2?3/]/F ( +</+<+H+}10]]]73?33b[ʯtylzuyf<+?@"    -$??]]/]]10]]#".54>324.#"32>7><@pZFqP,=m["-72) ",30+viu?(KlDdr>+:$ 'I=6.>%$KC 7&0y@T % %Pp/   @    @ 0@`/?O  /]22/]q]9/]]9/]]10]]#77!#77IIG)na'G)na'b&y'4K?@ o_K@  % o @  %?55+]]5+55]]]5bD&y'rnI6@ o_@ & %o   %?5+]5+5]]]5n&s'4K/@55O5?555---:?55]]5]]]]]5:%)u@6H&()R)&'&&'''&&!G*' !+ '(&)_XYX +]+/?32992/9/F*(&''* +</+<+H++10]]".54>7>7!3267!hzCAiC#;. 3I`:E[6`en \=44/ZVVhR%)0:'FgQD$+B=>'?S]d(Xc63&$]&%+5+53&$@&`%+]]]5+53+&$}@&O%+]5+5C&$R[@&/  0%+]5+53&$iK&@&_5%+]]]55+553&$P@8O%+]]55?553@ARc   \ /?O@$H_ _   __lmX+?22?339/9/32+]/]]9/9///+<+}3++10]!!!!!!!!#!EF>-CE+I,=%+) \h 8C?oQW&&x]0///B!%+]]55$&(@  &6 %+5+5$&( & %+5+5$+&([@  & %+5+5$&(iK@  &%+55+55$t&,@ &S%+5+5$f&,1&%+5+5$N+&,@ & %+5+5$L&,iK@ &%+55+55#@k  # #\   0 @ P    [ oP`%_O/_ #_lmX+??9/]qr32]]q]q//]q/+<+}10]2#!#73!!32>54.+ޣ]=mis*te,GtƐR8i`Lᖅ߳[.RTJӊb`0$&1R[@ &/%+5+5d&2@ 2&O36%+5+5d&2D2&+25%+5+5d+&2@ 3&u82%+5+5d&2R[@ 2&=M%+5+5d&2iK@ 2&64%+55+55~~ y@!H#3C !H, < L @8!H#3C!H,<Lp @`p  H?+]q/]q10]+]+]+]+ 7   ~d```Ff``b#z!.;@ ,24"-1/*@H H  [o//// /P/`///=*[` -1/*,24"4_"_??2299/]q]q]q2+2910273#"&'#7.5467>$"&4'32>7>xN=? pIsEG k{R'WPO|l|Q53Ir1i0^.-|N{.`1_@xo%K"yQFdK4Azl$Rw&8B@ "&#&%+5+5w&8@ "&"%%+5+5w+&8@ #&c("%+5+5w&8iK@ "&~&$%+55+55&<@  & %+5+5$.k@> [\0@P__lmX+??99////]q/+<+}ć10])!32#!7!2654.#!K',|EQ,!$B[7:nbrDt7O3#?|@L32 H6(H//?H(((A>??K?O%Q>9PXYX+??99?/]//+<+}]99//10]]]]36$32#"&'732654.54>54&#"#2Yf7+?K?+%8B8%:kZq6D26=#PS$7?7$+BKB+IF6YE1'JkDEeJ834"$3/1D^ET_3  TH-=2.:O9:SB8>J35<>cG 7&DCh@ P&OQT@%+5+5 7&DtP&PS@%+5+5 7&DK@ Q&VP@%+5+5 T&DR@ P&[k@%+5+5 7&Di@ P&TR@%+55+55 7&DP)@ U&ZP@%+55+55*NET`@ ! ;; BGX;$``F& **XXXXXXPX`XXbb_b23JG/?O22/22@H22-%`FQ``O8[-Q=8OO  $  Q?33]?39/9/+]/]2]]]]]q9/3]33]2]9210]]]]]32>7#"&'#".54>;7>54&#"%>32632%#"32>7%>54&#"][*B4'Lnk..hpw=NsL&-Nix?D;>7- Htjr)pl4 (q$1GE<cP"LG9,jq->$J@iJ(shHV/2Sl9QwU6 $-B>90ClM*?2q32.'7"32>54&/kD%$I ' ,D.Rvu:OۍC>6B+!GqP*1M7CsT/j.](1m69xTlBt[}ИT  G9o3:iV)P?'Cu[U`#&QR'@ ,&7G%%+5+5?&RC@ .&&/2 %+5+5?&Rtl.&.1 %+5+5?&RK@ /&k4. %+5+5?&RR @ .&9I %+5+5?&Ri"@ .&20 %+55+55EH ]@B?o?Oo 0`0@`  ?9/]3]q2]q10535!53xq*\'6@[22',##,+G(P((((88@88P8p888G/?O+,/  /O O ??99/]]]qr]q910]]]]7.54>3273#"'.#"%4&'32>7>*68]R7<]bj:}F*,ZQC D>#-XPB &8aaEia1C2+Bzd0UAyf4WU&XC@ ,&-0%%+5+5U&Xt]@ ,&,/%%+5+5U&XK%@ -&Z2,%%+5+5U&Xi@ ,&t0.%%+55+55W&\t@ &&&)%%+5+5W;@>:$$&GP=28;;89:;:8\9:9:899999@$H 909P9`99@$H9:9 2.O! O.:9!XYX=P=]r+????999//]+]+]F<(:99< +</+<+H+}ć]q10]]"32>7>54&%3>32#"&'#!!4`P? 5J-3SB3 M #JVd323>?!7!7!3#!4>7'2>7654&#"$LUd^^-SH9 L/D-6`N,d=};4E'[EzP=t6 ,2 McU=sgK`1N%em$&(MN@  & %+5+5?:[&HM@ 0&x13 %+5+5$&(@  &%+5+5?C&HN@ 0&5D %+5+5$&(O@  & %+5+5?:&HO 02 %+5$W&(QE"%+55?l:N&HQO55F %+]55$+&(@  &%+5+5?R&HL@ 0&28 %+5+5d+&*@ /&4. %+5+5W&JK@ T&gYS0%+5+5d&*@ .&3= %+5+5W&JN@ S&Xg0%+5+5d&*O@ .&.0 %+5+5W&JO SU0%+5d9&*9'4: %+5+5WI&J@ \&]W0%+5+5$+&+@  &  %+5+5#z&K#O@ )&.(&%+5+5$?@  \   0@   \  0@P `a    lmXP]+?3?299//]3232//]q/+<+}q//+<+}10]]]!!!#737!!7!3# 7!vv{!{&'&r&&{!{w&&\ªP#/@x+ RK1 ()).+*)R)K*/*//*/O*****+@H+R...@H../(# )*#P 0@XYX 1q+?]?39999?39/+]3+2//]//+<++]q/+<++10]]!!3>32!>54&#"!#737Y9! IZoEwn MK/^Q= n!̋10.*J8 .-)+..) ?B(Ji@$&,@ &%+5+55&R@ &z%+5+5$&,MN@ &%+5+5#[&M@ &%+5+5$c&,@ & %+5+5#(&N@ & %+5+5W\&,Qg %+55W\&LQqY %+55$&,O @ &%+5+5#:c@AKPOXYX /0qqqqq]]]q+??10/]q//+<+}10]3!#:$f&,-'@ o  o_]]]]q5]]5#W&LM9>!@(&&H!@ H!@ H_?]]]]]]qq55++++&-w&8 %+5+5$W@U /? K  O   @-H   PXYX /qq]]]q+?39??399/+]q/F(   +</+<+H+}3/]q]10]]"&'732>7!#'##7362V$ ! "0"  5Tu@W &>.vFAlP,d>$9C&.'9 %+5+5#9&N'p %+5+5#: @f  + &)  RK    KO    0  @H  XYXO ]+??2?9+]]83/]//+<+}ć9]+}+10]]]]]]]]!!!! ؼUXB'KZ:@Zl$k&/@ & %+5+5#g_&O2O&%+5+5$9k&/>'ߴ %+5+59\&O'I %+5+5$r&//  %+]55#&OHK-@@ H? /  %+]]5?5+]5$k&/O)%+55#&OOɴ%+55]5k t@E     \0@P   _lmX+??99//9//]q/+<+}10]3?!%!$],'mP+M-@Aϕߕs y@J KPO   XYX /  q]]+??99//9//]q/+<+}10!?!7njl)l*31EEJ$&1&%+5+5#&Qtk,&,/%%+5+5$9&1'i %+5+5#9M&Q 7'28%%+5+5$+&1@ &%+5+5#&QL@ ,&.4%%+5+5U'Q K1:H: H728%%+5?5++]55$?@~==!!899\ 0OA'-\ ! !! 0 @ P    !982 !- 2'& _ _2lmX@AA`Aqqq+????399999//]q/+<+}ć/]]q_qF@(@ +</+<+H+}9/10_]]]".'732>7>54&#"!>7!3>32LJx^F!'1/@0$8 uxLsP " ,k|RC(6Ki#?U3u+!%Q] ,/.V`2Up>D%\ZL?EE>dF'0a Y}`A"#WM;@\91677K   =$(KO 76(.P.P$#.XYX =q+??3??9999999//]/+<+}ć]/F<(  < +</+<+H+}10]]]]"&'732>7>54&#"!>7!3>322V$ ! "/"  LL/^Q= v  IZoE 6TuW &>...) ?B(Ji@S"KC0,9;*J8 .-)AlP,d&2MN@ 2&35%+5+5?[&RM@ .&u/1 %+5+5d&2@ 2&7A%+5+5?&RN @ .&3B %+5+5d&2H2&2;%+55+55?&RS9@ .&.7 %+55+55g3 4@.$\$%$$%$$?$_$%$$0[P    @'H6_$!__%*__lmXO606]]+??2??29/+]/]]q9//qF5(%$$5 +</+<+H+}ć9/310!#".547>$323!!!!!%267.#"4::K'H6",eE^+I-4`')', 0W{T׃[d\ +W'WT):_N3R^@vII<<--( ($^^H44V 0GVVVVVVVVPV`VV``AG/?OQ^^F#YR+9R#FQ  $  ?33]?9//]]]]]]q29/2]99]]]10]]]32>7#"&'#".54>32>32%4.#"32>767>7>%>54&#"][*B4'Lnk~9%`nx>k|C]@jYL"Krpl4 /6M0,ZQC 7M--XOBcP"LG9,jq->$J@iJ(OI):$;qha#5$FHAyf#*kb;eO$&5&" %+5+5#&Ut@  & #%+5+5$9&5*'%+ %+5+59zN&U+'&,%+5+5$+&5[@ &v!' %+5+5#&ULe@  &"(%+5+5A&6>&,>A$%+5+51&Vt :&:='%+5+5A+&6+@ ?&D>$%+5+5-&VK@ ;&c@:'%+5+5WA&6xAT9%+55W-K&Vx=P%+55A+&6^@ >&@F$%+5+5E&VL@ :&@ &? /  %+]]5+5#&]L@  & %+5+5#.J@, /KOQXYX+??/99//]/+<+}]10]]>32.#"! 5]`-Q$  C< DlJ' @AqW9|@=  q` uv XYX+???3299//]]F( +</+<+H+}10]] !#737>32.#"3% 5]`-Q$  C< %|%qDlJ' @AUx=&$'PC-3@!===8=B%O%+]]55+5?55]]5 &D'Pz0@xxxxU&x}ZP%ZP@%+55+5+55]]]53&& %+5+5*&ta& adB%+5+5#z&@ <&z @   `/]29/]10#73373==[//10!7!!Nc'@ @ @/2/10]".5467332>73JtQ*-; $C9, ?_,Mh<  *>))>+IwU.JS?10/107!J))pl'4@"    #//10]]]]#".54>324.#"32>(E]44]E((E]44]E("/.""./"n5]E''E]54]E((E]4-""-/""/jW !@   ///10]]".54>7332672(I7 1A$ 6',#2%OW,C.,L@47<<&& D:@@p@  /23/]10]]]".#"#>3232>73p,QKD% $?bI-SJB% $?a&/& --fX:&/& .-fX:: %@  @ H/32/]+]107!!7!:     + +@ @//10]7!~!$%U 9@ @ H @ H @/9/23/++1073%73!73,,L,,!%v)3&$TӴ%+5?5D'({T9  @ %`O]]]]qqq5+]5?5b'+xTB@H@ H0  @  %P O]]qq5+]]5?5++',TE@ @ H@%Po_?]]]]]]qq5+]5?5+9'2T;42M@22% ]]]]]]]55+]5?5 '<T-:@     @ %o]]]]]q5+]]5?5G&v3TS<F@3:=)%:@.H/::::::::o:_:O:?:::]]]]]]]]]]]qq+5+5?5$+U&U^@& %+555+5553$${%$2f@4/?\0@P_lmX+??/]q/F( +</+<+H+}]10]!!2,*d@X&6F,<LR \R ^     `?/]]?3?29/]]]99]]]++ć++10]]'!%.5Y,# $-rb)QE12FR(H$(#=$+d5Q@31&[` [o1111 1P1`1117_)__??9/]q]q/]q99//10!!2#".5467>$"32>7>54.,K,V Q k{Rl|Q0X;?Qօ1i0^Wڃ.`1_@xo%K"Azl$R]].$\,$C.@V,<,(#&H(HR]R  ^ H/?O/]]??23310]]/]]9/+++ć++10++]q%!.'&'!!u -2+u,^'.+*.'^-$0$1e ?@&@P` /    _ __??9//]]]]10!!!7!7,9,--W,,GWd2$@TR\R\0@P 0@ `lmXP  ]]+??20q/]q3/+<++3//+<++10]]!!!!s$Y3 |@b b  @* H /?/? _ _?2?29/]2/]2]+9/33+}ć+}10#7 7!!!/2!),G+  -Bs7<`v *7@++[# #P## #0#P#`#######1[//?o )**+7 * *^  *   0 P  P  7a) +almXP9]+?22?22//]qqF8( 8 +</+<+H+}3/]q3/]q10]32>54.#7#".54>;7!32+#";/6R`5:V8&LgzC`ECux=ZQ&@.Pb77S8Bq4e]:aE'BziLH~cS'._f7aH);(<@&& )!) && "##^ ! !  0  0 P ` p  !  ^   / ? O    ^ @0P`*) ! _  !" lmX`*P**]]]+?3?9/329909/]qr//+<+}3//]qqF)(  ) +</+<+H+}3//]]qF)(! ) +</+<+H+}]]]]10]]!#".547!;!32>7!#SS~y;RT}&LvW:ZZXܝU:k_FNL   jg FpP1ƒC9t@J 87'"/ 5[P;"[555)))))0' *_)_??322222/]]]]]]9999]10]]]]]267>;!>54.#"!732.546$X7}˔-(#J,?_f52\RXM$7!!.=##".5467>"32>7>54.dJtT5 ""  NLD   "M_uKTX. ee-M?1)RMD*CM%D]8BE>/Beva0=>:5_G*6f].r6y5#Qc2U$0_] ?kN+W <@ 4444%H/H:P:`::@,H:>>%$$K   @$H 0 P `  @H  4O55$%!*O!OXYX+/??9999/9?3//+]+]F=( = +</+<+H+}ć]+]9/]910]]6$32#"&'#!"32>54.#7>54&-[m<1Qj96\E'Ezd6 ;-a5=D"=gK*%HiD(DjK'Q.VwJS^: 8Rj@kF8&9\5#GkH/Q:!%7!!>7l N  E1 :61._-:T]YIG?{7ou~FX74l@I--33!G0 11+O_oO6P66G++/+?+O++++14O 02O&??992/]]]]]]q9/993]10]%2>54.'".'#".54>77!-JoK&$2%TSL;# 8NX )-) )D1Zq{@\r$G;gP:aRH!#3F_}P=^A!]6gnwEΏKBu\Ŏ_8M9m@E   1/1?1O1117##;;7G,H/?O12R$'11'RO ??9/999/]]]9/]910]]]%267#".54>?.54>32.#"3"YE.brS\f60UwG'D4?sdEucQ#gB"A1.Ql?EmCOO=+B.0TrBCeG) '9J,IoJ%3Q:T?81$'6"!F?;K1n@6P@6% %H0.P`/?85H/'?'O''''''4/5Q6/?22/]]]2]10]]]'>54.'.54>?#!7@"JpC;W97gP0-;# 'F_8>nR0>kT !#! %̽@J'3&(:Q;1aYO a%)-)!,FeIZC%WM)@k  KP 0P`+"K0O"'P'XYX+?3?3?39?9999///]q/+<+}ć]qrqF*(* +</+<+H+}10]]!>54&#"!64'!3>32 LL/^Q= t IZoE1.-)..) ?B(Ji@SDy*01/*J8 lL#/v@T('   )*H--P-`-----1O1HP`O))Q $Q??9//]]]910]]]]]]]]]2#".54672>7!"!>54&߹%orR^3I$*MD; $2*LD9z M@[U;xx:Pvo-mA/CZ7p+k;{.~oC :@< 0/ K  O o    @$'H  @H  XYX+??99/+q+]q/F(   +</+<+H+}]]]q10%!.5467!`* V;E'>N0%: @n    RK    KO  O  P `    XYX/ ]+?3?29]]83/]//+<+}ć9]+}+10]]]]!!!! Ef.*q: 2!|@QK I! RK!!!F%O##   /?OP?2?0/]]3]]]9]]33++]]]]10]]).5!'.#"'>32/ +12 #. 2!f9QoK.KRLQXVSIE\7  +\bX:*@Y##$%"#$#%K"#""#""""O""P"""",,p,# K@$H 0P`@H" % #P XYX+?????3999/+]+]/F+(+ +</+<+H+}ć/]]]q]qF+(#""+ +</+<+H+}10]]!>7##"&'#!!32>7!9V9OI#vAM2YI6p  ,56ci0*!<LY-QsFB"IC6i_:{@: G_oP`P`p RK@ HO?3?33/]q3+]+}+]qr]q10%>54&'!!!N}W/ " -OlG_g#:8"TJ:1pF@V ;; 0, ,  ?93. $HP``HH90E@EEH/.?.O......4 O EQF /?29/9/]]]]9/9910]]]]]]]]'>54.'.54>75.54>?+7$QnA/Ne7%gN5U>2bM0-:-!;R29oY7Dӏ;fJ*6Zs< EQLL&̹ 5P:.:$ )JsU'7)"%:U?0^XP"`)D)!-" +FiLXd!8O2?"7>3!#32>7#".5467r;?C""GD>'K?1',56s%o.-  498>[;k||ںJL}  !2, #?X5A)WO+@9 GP'''''--K@$H 0P`@H"O OXYX+??9999?3/]+]+]/F,(, +</+<+H+}ć]]10]]2#"&'#!>"32>54.gyBK{j/SUs6V@-2&sBChH%2DO>wreGB7 WvK.W}O6>L[GgB Ln=O5P@6 4- -%H`7p7HP/`////?/O//* O?/99/]]]]10]]]]2.#"'>54.'.54>|2&0:":fTB-8^F8u_=-0('>ZD3^UJ a ")/(!6MgGE}L@:3J@3,,HP%%%/%?%%55051G/?O)O  O??/]]]]]10]]".5467>3!#".''2>54&'#"sv<  J% -67"LYyJ GFlOk>pa$T(w4DLT.~ߦaHlFs/#O_#?x9:(@_  +(K(((*'J'*J*JK'(''(''''' '@'P'`''(''(O(O XYX@* ***]]]]+?2?99//]]F)(('') +</+<+H+}]]]]]10]]]"7>3!!32>7#".54677'OE5'+25%m.-  498>[;k|  !2, #?X5A)fd:'r@9  H))?)K'&''&&&'O&&&&&&'P'XYX+?22?99/]]/F(('&&( +</+<+H+}]]10]]32>54&'!#".54>7tRV>\B) =`lcm:v:!RN^2WtCl-2Xgʶq@+X\))% U@WcR#3@,#))!!!P5?5/H)%H)  ! * ))+)F)V)<)!+!F!V!7>">54.R[1YONZo>MӆAiK(^[h&ɚ/& heT$ &P7fYeiBugkY^v̮8W? [l/Q;"LWP$!@>   t   @!H{ %H{ Ht@\%H[T  RM R N  &!?O  !  &  P@&&]]??3?399]/]]]9]++ć++]]+r+]rq+r+]rq10]]]]]]]]2>7!!!'.#"7>16RDLb8 bW <"@!!  K0@KP " "M!!! 0P`p $#  O"!XYX`$]+?32?3?2399999/]/F#(!# +</+<+H+}]]/F#(# +</+<+H+}]/F#(# +</+<+H+}10]]]%>7!!$467!!FMjI-vyWיOOC ep1P: GqQ`}t8ky*c/7-M8!7hOG@$88/ /GG*F*E&EGEFGF@HEFEFEEE E@E EEE=GPIF=G11/1?1O1111EFFBO!,7Q66XYX+?32?329/9/]]/]9]]FH(FEEH +</+<+H+}9]]]]10]]]32>7>54&'7#".'##".54>7326?! "2!5P:)Y^6hj6b^FgI. I]sEX]0S # #7&Sm1H%%B2.V|N$C fV}R'O&~>%Eb>>cE$9mew*M#0P9 C&i@ & %+55+55fd&i@ (&n,*!%+55+55?&RT@ .&.1 %+5+5fd&T@ (&(+!%+5+57h&T@ H&HK1%+5+5$&(iK@  &%+55+555~@K54/ [@&&&&7.///\0101/100 0P010.)_3_01_3lmX+?2??9/22//]q]/+<+}ć]]9/10]]]>32#".'732>7>54&#"!!7!A'g{K KwzIu\F"-:&.@.  s|6mf[#9,,$396n2-C*'!A`@@GI  k$5&q@ & %+5+5d/H@) **+1[`_%_ %_??9//]q22]9/2]10]".54>32.#"!!32>7ǝI4cNJR 1LjD^yW-*S{RNgO+x\{|࿛l;@lNG,SA'4`UT^2*H]3uLe;A6$\,$L&,iK@ &%+55+55-r&1@[ \#$##$$# &1'%%''\   -/?O[---3%$  #$'_ 1_&&$` `$lmX+??9/?9933]]/]q9///+<+}ć99+}10]2#!!#"&'732>7! !2>54&#!}nJT0t6ZUTaqH$>0$ *-2?N2mxEoN*|P2b^ou=O" 8bړ5O5Y[%!@g! \   O  @H  \0@P[#! `_  lmX+?3?339/3322]]//]q/+<+}ć9/+]//+<+}10]2#!!!!!! !2>54&#!nJTu-v'mm'mx8EoN*|P2b^ou=\15O5Y[Zp@C[!\ P_  _lmX+?2?39/22//]q]/+<+}ć]10]]]]>32!>54&#"!!7!!A(Ybl; QP hrUE9,,8^ V$_D!X^ _$`&!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!~~H!}}H!||H!{{H!zzH!yyH!xxH!wwH!uuH!ttH!ssH!rrH!qqH!ppH!ooH!mmH!llH!kkH!jjH!hhH!ggH!eeH!ddH!ccH!bbH!``H!__H!]]H![[H!ZZH!XXH!WWH!VVH!UUH!SSH!RRH!PPH!NNH!MMH!KKH!JJH!HHH!FFH!EEH!CCH!@@H!>>H!;;H!88H!66H!33H!..H!++H!))H!&&H!!!H!H!H!H!@ H!@ H& %+5+5++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7G&J@ &y'%+5+5#h @r c  \ P \@P` lmXP  ]]+?3/?32//]q/+<+}]q/F ( +</+<+H+}9/]/F ( +</+<+H+}10]]!!!!!O&'i'Ohsh3$$Zm@D   [0\   0 @ P    __ _ lmX+??9//]q//+<+}ć]]]10]2#!!! !2>54&#!enJT0#,AxEoN*|P2b^ou=5O5Y[${%$5l@8P`/?\0@P_lmX+??/]q/F( +</+<+H+}3/]]10]!!5,'doh@|    ^\ 0P`p ``lmXO]+?32/3?2299/]3]/F( +</+<+H+}39]3+}]]]]qq10]]]]%3#!#3>7!!OxO.^\T$MHNT,th>ks^>$(-@ )9I%5E&6F'&&^%$%%$bc  b  $',/%%%-  ?O,----^0  $' ,a %&- lmX/]+?3?29/32999//]q]/+<+}3/]]93/]9]]+}ć+}ć+}ć+}]]]10]!"&'!.'!3!2>7!!#v@*X  "}!4//tt5DY>6>90/ %('v] 0?H$Vk<W?jODi$G=-  :c@:16[,[<!!!"!_'1 _' _??9/999/]3]]2]]]9/910".'%32>54&+732>54&#"%>32M~W 5MfD;gK+;-;J{Z2h_x0'ovqv=0[Q7_F(H8fW[:]A#3S;R`4U=IYwoKa[,3Z|IP}\<1Mg?bs@$@(   R R ^    P  @3H  ^0@P   lmX+?22?339//]q/+<+}/+]/+<+}++10]3!!!>767$  9L 2b'.*F?(X&,,$G&J@ &# %+5+5$`@lRb  R\  0@  ?\0@P  a lmX+?222?3339/99//]q/+<+}ć]]]]9++ć++10]!2>7!!#!5't9H^? 4"A9.> $('v?gNIW*H7&  n@?^\ 0@ @ H  `` lmX+??3299?//+q93/+<+}ć+}10!#"&'732>7!!Vit6ZUTaqH$>0$ *-2?N2O" 8bړ$0$+d2$~@L\\0@P 0@ `lmXP ]+?3?22q///]q/+<+}/+<+}10]]!!!!s$Y3d&s77@l 0R^RcO/?OP`  `??333999/]]]]]]9++ć++10]]]]]#"&'732>?! ! 9ipSJw-v"E'#??@$)5>UT*, .K7%XN8 *7@y++[ # #0#@#`#######1[/?O )**+7 * *^  *  @ P `    7a) +almX`9]+?22?22//]]F8( 8 +</+<+H+}3/]3/]q10]32>54.#7#".54>;7!32+#"; R`5:V8&6gzC`/-ux=Z;&@Pb77S8,q4e]:aE'BziLH~cS'._f7aH);$h @:   \\@% H 0@P `lmX+?3/?22//]q+]q//+<+}F ( +</+<+H+}310]]]!!!!3O'9hsst@R  \ 0\     _  lmX+?3?9/3299//]F(   +</+<+H+}qq//+<+}]]10]!#"&5467!3267!k*`kt? QPv}\K'#û N$bAba $ @I    \   \ 00p@;$H\0@P`  lmX0  ]]+?3?22//]q/+<+}/+]q]qF ( +</+<+H+}+/F (  +</+<+H+}10_^]]]3!!!!!$ss$h@      \    \P 0p\0@P ` lmX0]]+?3?/2//]q/+<+}/]qr]qF( +</+<+H+}+/F(   +</+<+H+}310_^]]]]!!!!!!30OhssstK@)[\   __  _lmX+??9////+<+}ć]102#!!7! !2>54&#!nJTX9,mx_EoN*|P2b^ou=5O5Y[$#@\[ \ 0\0@P__lmX+?3?339///]q/+<+}ć/qq/+<+}9/10]]!! 2#!! !2>54&#!'TnJT0'mxEoN*|P2b^ou=5O5Y[$Zh@A  [ \   0 @ P    _ _  lmX0]+?3?9///]q/+<+}ć]]10]2#!! !2>54&#!enJT0'mxEoN*|P2b^ou=5O5Y[*-|@S[o   0 P `  /p/(()/?O(#__ #_??9/99/]]3]]2]]]q]q39/102#".'%32>7!7!>54&#"'>NޕJo[:QlGbrM-"Q`A'tQ~=lW_"32>7>54.ۘP ڔLv'm${_mH`nH*OpQօ1i0^WڃτטS@xo%K"Azl$R]].}@Ic \ 0 [?O __  lmX+?222?9/29/]/qq/+<+}9+}10#.54>3!!! !"3!,'VH.Rhe}wCrR/7R4P=[{Ltp63XC(E3 7ND]!FV@8 88 +@GHHPHH6HP`6 O;;,+O??9/9/]9]q]q10]]%2>7>54.#"".547>7>7>32D5`O;5J.5bS=!8M%m~D$vBtjc1-ci[qWD3#UmXjo9oŬBrW$@?[;>mW :CdB CƃkU    '<^aCgE$9laJOq2'D(5@e   5 G$G,P,,,,,7p75(444K 0O4/5!(R55!/R!QXYX+??999/999/]q/F6(6 +</+<+H+}ć]]q910]]]]]]#"$'>3232654&+72654&#"0Ne50U?%Uׂxt^yku>/u0vсSU)SH8 A@]A( $9O2ZU)k{l1#B`: LU?GPI3232>7#".54>7>54.D3J7%Eotuh/5fbXR&ij;X@+Q|oi):plbt=+H 6(0BiI'/Pj$8(8BgH&7Zu>PrS<" $!<0GY@=H 999pPIPIIEG$/$?$O$$$?Q,,1OQ??9//]]]]]q2]10>54.#"'>32#".5>7>322>7>54.#"4Yt@00,:8?@ޙP"oxuz>dY7gWDQh@" 1TA<]F1 j}'Y}N$   O뜍؉>Awe@ v8'6 =c|?;+R?&$NyU@:n?:NH::'g@=+"$""""'  P  P  @  @ "!!@3  N  "%%&&''&&&@Y'''''' P)  "  %R/ '&!   XYX@)]+?3?39/]]329/]qq]/9/]/+<+}]]99+}ć+}ć+}ć+}]]]]q]]]]]q10]]]"&'!.'!3>7!!##c7%V,)%\\%0D5*B:W6;B6yKV+ & *UK|8<A N9u@L77((/5G 0*H 0@;@;`; R%/ R% Q??9/999]/]]q]9/910]]]"&'732>54H>54&#"'>321D,&C2}BsV2UG<4) SuX\h7:Xk12U>#A|,%=+%:*QD #?29: 8+PsI#&E_9EgG&&7!!#![  )2!%! W:0 -E1+A:@N&&MK?O OO XYX+???3299//]]]/+<+}99+}]]10]]]!!#".'732>7!=`SNUeA)*% $ $018JaB |ˆP!F~ #:"@V JEyKvE F  R*:ZH*:ZH@*P  R%5U@ H% 5 U  H @.O XYX  ]]+?3?399//]/+<+}+]+]+]q//+<+}+]+]+933]10]]]]]]]]]!>7##!>7!3b l=H*vCIGCGF@F: RUO?W2#: @_KO  _  K   O   O  XYX+?333?3339/]q32//]//+<+}ć]]q/+<+}10]!!!!!TTZ}Z:T1:?MR#:j@?K KOOXYX+?333?32//]//+<+}]/+<+}10]]!!!k:|:WNS?UNF#MPW:\?W@Vl@ZZ77  /\,\,#I ,K+++ 0P`p 9GjPjjjjnTG/?O_IAL#/ bAOWLO4,+XYXn nnPn]q]]+?3?3??999/]]]9/]]/Fm(+m +</+<+H+}910]]]]"&'!>7##".5467>323>733>32%2>7>54&#""32>7>54&usT "GQ\7JsN) \zR>]F2  V EP\8KuP) St/TG7LP/QB2 Cp/SF6 cP-J;- Dh^!Q*/E.7aQ-m?̂<0L5 =Tbe_K2A|1G/2\Q;s:˂=!Qh,L!pvNg4Y&bt!Ph,L!pt Nd3Y&jk:[Uh:0@0 ))  !K?Oo2K0/0/0//0///O///// //O!/'0 P'XYX`202]]+???39999///]]qr/F1(0//1 +</+<+H+}]q]F1(1 +</+<+H+}310]]]]]32>7!3##4>7##"&54>7v LL/_Q< v1$tOHZpE:..(?B(Ji@^+e,9;*J8 .-* j:@\  K  KO!@!`!@H  P XYX+?3?39/2399//+/]]qF ( +</+<+H+}/+<+}10]]]]32>7!!#".5467GAA!<<@%aQ!LWd97!32>7!!4>7##"&'#"&5467!-QA/ w{~.PB/ v  AM_<| FTgA z(KiA_%&! y)KkA\"KC0,9;/L5wq1U?#$Z&$&$yUh:?\@ 33   .123405:.0//K.-..----?-O--- -p-- -`-----..! K?O p `KO`p 30O5!-(:(P5 ./XYXAPA]]+?3??2299///]q]F@(@ +</+<+H+}3//]q]qF@(@ +</+<+H+}33//]q]qF@(.--@ +</+<+H+}310]]]]]]"&'#"&5467!32>7!32>7!3##4>7#| FTgA z{-QA/ w{~.PB/ vuP AM_wq1U?#$Z&$&$y(KiA_%&! y)KkA\,9;/L5M0:u@8 G!  K   R  O RXYX+??9/33//F (  +</+<+H+}ć]10]]]#"&'!7!3232654&+0MЃs'UhzC277zhuS\Y+gMHv^RHJ&:!@k     G 0K#/##!K 0O!RRXYX+?3??329////]qF"(" +</+<+H+}ć]]]/+<+}3/]10]]]!!32#"&'32654&+0UhzCMЃsh277zhu::MHvW\Y+%o^RHJ&H:@E  GOK 0ORR XYX+?2?239///]qF( +</+<+H+}ć]]10]]32#"&'32654&+UhzCMЃsh277zhu:MHvW\Y+%o^RHJ*M-t@JG"P"""""/0/$(()$/O( ((%OO %Q??9/9]9]]/]3]2]]]q39/10]]2#".'%32>7!7!>54&#"%>i\zH9[nkrC #3?"9T<& %6XUQoUM,csLk>7`L2H/&IhB#ffSUGxY2#P7@[3& +G/ ? O  GP9KO#OO0OXYX+???9/?/]//+<+}ć]q9/]910]]]]#".5<7#!!3>324.#"32>7>_gxAZTmnru<2G,)SK? 3F**RI> a;qh  1:Tit>8l|B^;Bzd/U$Hb>Ayf3W:@  eH HeH HNK @ ` G/?OR_oRXYX+?3?9/]22/]q/]]q/+<+}99]+}++qq++qq10]] !.54>3!!#";A@6#N{U^6X>")=*M -E[8eM$>/3%?:&Hi@ 0&42 %+55+55#W?@=5:;R;K    A#&-" "RK!!!!O &@HR#   @H 2"! ;:-2P 202@22PXYX+??]?39999?39/+]3+2//]//+<++]qF@(  @ +</+<+H++10]]]]]]"&'732>7>54&#"!#737!!!3>322V$ ! "0" z MK/^Q= n!8! IZoE 5TuW &>.g..) ?B(Ji@10.*J8 .-)AlP,# T@/ KO OOXYX+??//]]/+<+}9/10!!?!%O::e +?_N.|@R  '',**P`0&,G/?O%)O( !&&!OO ??9/9]]]9]]]/]]2]2]2]9/10]]%267#".5467>32.#"!!Sv Votq8 M_ntw9kl;[Q2P?06%[ig2O\2>q^(^-osI):cIZe@eF  xl-KV#V&OY ((H &&H ##H ""H H @ H @H @H @ H%+5+++++++++#&i@ &%+55+55$W\MI:(5@a  M(&((&(&5))KG1O117O&!(O(5R.(!O).R XYX+?32??39/299//]]]9/F6(6 +</+<+H+}ć99+}10]]]]32#"&'!#".'732>732654&+UhzCMЃs=`SNUeA)*% $ $018JaB277zhu:MHvW\Y+gˆP!F~ o^RHJ%:%@i  %KKOG!O!!'%OR XYX+?2?3?329/3322]]//]/+<+}ć9//F&(& +</+<+H+}ć10]]]32#"&'!!!!32654&+UhzCMЃsVZTbSh277zhu:MHvW\Y+1:To^RHJ#$a&t?& %+5+5W&\@ &&)5%%+5+5Uh:/@/ ((.!KOP?O 1K/././../...O..... ...!&/ P&XYX+???3999/]//]]qr/F0(/..0 +</+<+H+}]]]qqrF0(0 +</+<+H+}9/]10]]]#32>7!!4>7##"&54>7GRYv LL/_Q< v HZpE8`r..(?B(Ji@^"KC0,9;*J8 .-* $,v@; \0@P_lmX+??/]q/F( +</+<+H+}3/]33310]]3!!P|d#Z@4 KO_XYX+??/]//+<+}3/]33310]3!!OtD::&:A/&03.%+5+5c&ZCM*&д+.)%+5+5&:@ /&/2.%+5+5c&Zt&@ *&*-)%+5+5&:iK@ /&31.%+55+55c&Zi@ *&%.,)%+55+55&<" & %+5+5W&\C:@ &&'*%%+5+58o/Ͱ/ְͰ017!8//8o/Ͱ/ְͰ017!8//,Bo@MP/?O `@ p p9r^]]]qqqqqrrrrrr^]//^]qr]107!,  K@ +;K [K; ;+k[K o_O?/o_O?/o_O?/9rrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqq_qrrrrrrrrrrrr^]]]]]]]]]]]]qqq^]]]]]qq//^]]107!&'/10/107!&'!T'BB%+55?Q@   XYXVvFFfV 9) VF vfVF$vfF6&@vdRB4$p`PD0 ipdTD4tdT4 td@0 9rrrr^]]]_]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]_]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqrrrrrr^]]]]]^]]]]]]qqqqqqrr]]]]qqrrr+?_]910//]F( +</+<+H+}]29107>733& $.8 #?3$3?Cn\O##NRR(?Q j@4   @ P 0 @    XYX+?]10//]]qF (  +</+<+H+}]2910#>7#!+ $.8!Fk3Cm]N$HQQ@     @H O   XYX+/]10//]+/+<+}]2910%#>7#!] $.7 #@4%3 BCn]N##NRR(?U`@)    0  XYX+?910//]F(  +</+<+H+}2/]q3910##.54?U3*!&"B9/hBH^?@Y p 0    XYX+?]99332103//F( +</+<+H+}]293//]]qF( +</+<+H+}]29107>733!7>733i& %.9!#?3$33& $.8 #?3$3?Cn\O##NRR(Cn\O##NRR(?@] o      @P0@   XYX+?]33210//]]qF( +</+<+H+}]293]q//F(   +</+<+H+}]]2910#>7#!#>7#! $/7!$@3$3, $.8!Fk3Do]N$$NQS(Do]N$HQ7@1     @HO   XYX+/]33210//]+/+<+}]293///+<+}]2910%#>7#!#>7#! $.8 #@3%3, $-8!#?3$3BCn]N##NRR(Cn]N##NRR(v] q@ R@/ `  P ?/9/329/]qq3]]++10#7!%뛿(F-eS(Jx2sd@d   R    P  PXYX+?/99//32932999//]q]F( +</+<+H++10]]]73%% %%#7!(N5Uo(V"n(6V(OVdd3Z}@ @P `   /    y &VF&VvfVFҖ6&VFvftdTD6"vfVD4@$ldTF6&pdP@4$td$;rr_rr^]]]]]]]]]]qqqqqqqqqqqqqq_qrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrr^]]]]]]]qqqqqrrrr^]]]]]]^]]]]]qq^]]qqqr/^]+/_^]q]10]]]]#".54>32/Pk=, ڏˏYK2$9_rrrr_^]]]]]]]]]_]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrr+rr^]]]]]]+]]]]]]]]+qqqqqqqq+qqqqqqrrr+rrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]qqqq^]]]]qqqqqqqrrrrrrr]]]]]]]qqqrr????3222/]]]]]+}102#".5467>"32>7654&2#".5467>"32>7654&%2#".5467>"32>7654&#32ZD' P_d*2W?$ L[a*.)#  E/*$ '/2ZD' P_d*2W?$ L[a*.)#  E/*$ 't2ZD' P_d*2W?$ L[a*.)#  E/*$ ''>:_DK&eI>_CI%iEy.SB+Hq.R@W>:5:_DK&eI>_CI%iEy.SB+Hq.R@W>:5y:_DK&eI>_CI%iEy.SB+Hq.R@W>:5z5(@[0@PP/?/]]]q10!@2zz& H H++IN@4*O`//]/]]]]]]]]9/10]%73 CiGo)'!a<@'%@`/?O/]/]q]9/10]#77IG)na'O&-4@#@ H   O]]]]]]55]]55+T//10!5!4TY2@??/+}10]+3>\ %\@4& &      %!P' /3]q22/]q3+}2]]]10>54&#"#>533>32J*+=^Dc.8C*ZVO{-'$`[.("# . [T.l@N    \    0 @ P     wa almX+??99//32//]q/+<+}]10]]!!!!!#73!+M}(%:32(tо4@u  ! #$$4$$q44444444/4440+,:J6$'#41 #w w/ 1't0/ u XYX+?2]]?299//]32]3299992]2/3//]qF5(445 +</+<+H+}9/10]]]#737#737>32.#"!!!!!267#!7>7޻Bmkcb5SG%:, yY_w*6']upt_e50Sm<0TI.K8|pk"Zf'&i;{,dq @bb GG 33'+k;kky$$NM`32E+*(y'7VpEEEE@ HEE;eqqy`p;; ;s*)(uee8eHeXexeeQxJx(J++(e(e(7x-xqulmXsFssfs6ssssswsgsswsgsWs4s%sssssWsGs&s@sssss Ds6s#sssssssssssusesTsFs6s&sssssssssssusesVsGs6s'sssssssssssusesVsFs6s'ssssssssusfsWs8s'sssssssssysisZsGs7ssss@sssssss{sjsYsHs9s)ss sssssssdsUsFs7ssjssssvsgsUsFs7s'ssssssssssWs'ssssssssssws7s&sss:sssss_r_r_rrr^]]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqq^]]]]qqqqqqqrrrrrr]]]]]]qqqqrr+????99//32]q299^]//]/+<+}ć99//+]/]Fr(r +</+<+H+}223/_]9910]]]]]#3267#"&547#7+#!23733".'732>54.'.54>32.#"32>54.+F&! F*jh I^Jٕk:evA%E}/O}Z7 PO&A06O4*QA(3`X@@4'4H(*VF-9jYHvR-#?Z6F % hW(-W`X/^bJl:^D#<6" "7P9?]<y}04 !5N7JmG# BgF8N19{@Q,))(( 4/4?4O44;o!/!?!O!!"w# #(w))))/)#)#)s/s??99//]3232/]]10]]]]]]]"!!!!3267#".5#73>7#73>32.#"KH@( 6XLE`JkZZ|I ~ *{ddU(&2=uc:% }uC=(EpP,1y̚9x20SmXWVYXYVWXWXVWYWYW,I9,$,SS[ B'L4WY????99]/99//+}10267#".547>32.#"%2#".5467>"32>7654&#3AO=ZwKPuM%\wCKlF!1;Of 6 ?pU1 cw|5>lO. _ry4:3+ ,*:5-2>SC&@gH&2YzGDK^#*Je; ?K-M MO IvU%]0~["$MxT%[.W9gT5Y%IE9fPmMJA%$*5D@U 4400 ##%; oBF< ; 0)(; q(1((1((1(  ( );<610<06- )-u,,t 6vXYX+??9/99999999//FE(1((E +</+<+H+}]]10]]]]232>73#".546?7>7>">7>54&MxS,bw"90(?4-.9GZpFHmJ%#F#%#J!K 9hc.!Bt0%Db<##b|c,0<<5P53g_S=#)LlC5b   Dh@(6,x  2:* )C5@N$ 3CS  <L\/ / y Ry@ H"   R y   @H  7p"p* *0****@/H*E 73 #".54>324.#"32>7>!{!$& @pZFqP,=m[ *4/& *0.(=,,&X(*.'b23iu?(KlDdr>)7" &E;3,;$#G@5@*2{@M  @  -2,/-/,/-O--4 -%+/-0`404P4]]]?32/32/]+9/_^]2910^]]#367>73#46767#.'&'%##5!_     75-T8"''$=H=#')#7 ]9t@K 0(  ((0(@(`(p((?O((5[;;"[5**''*_)_??322/3/]]]99//]]q3310]]]]267>3!!>54.#"!5!2.54>]/dm; WvH 3a[[a3 JwX=oe/]Rߍf35+esJel99leJse+3fߛRbH"/J@,@##_#P#`#p##1///) ?2]]?9//]2]qq210".54>32!32>7.#"uƆE,Lfv?qQ@NX.Kt]M"H$Sn;L]53WJ<"]ob}]<Oу-# K@.OOZZZZ?555]]]5]]]]]555]]q5$'^'GLWS@4_O/OPPPPP?555]]]]5]]]]555]]]]]5d^D@  //29910#.'5>73!;H:RR:H;)"bADp*$*pDAb"V@ @ /299/105>73.'#"bADp*$*pDAb"V;H:RR:H;#d^D@  //29910.'3#>7!5;H:RR:H;#"bADp*$*pDAb"V@ @ /299/10%>7#.'53+"bADp*$*pDAb"V;H:RR:H;d^D$@@ //29929910#.'5>73!.'3#>7;H:RR:H;;H:RR:H;)"bADp*$*pDAb""bADp*$*pDAb"&@@@ /299299/105>73.'>7#.'5"bADp*$*pDAb""bADp*$*pDAb";H:RR:H;;H:RR:H;H#(@#  /299299/3210!!5>73.'>7#.'5 "bADp*$*pDAb""bADp*$*pDAb"hPX;H:RR:H;;H:RR:H;?-CY@8+  %%.P`E:/?O3R?)%% O)?O ??3/9/3/]]29/10]]]]#".54>3236454&#"7>32.#"32>  Z}e^Q#,D`}NLzjo974-'kBn^))2)C5( "2 3WC/1iji0uJ@mO;~a:VL, "\$>-+F\a`(.L6Q+C@(   _??9/3]]]2]]93]3]1035!.'!+p DV/aR9:Sa-OW$@H H/?O`/2?/]10!!!CW6*Wb _@6c  c    __?9/9]99]/]9/+}ć+}105 5!! !\qKW,Ƙ}9@ ?/]105!}9|T6@  //9//9]3310]]]]##5!37PQv#3E@""  4'/G>@K@ H$9*C/ ? O ? O   GGGGpG`G@G0GGGGGG]]]]q]]]]]]]]/]q332/332/+]9910]]]]#"&'#".54>32>32%"32>54..#"326v/VvHgAESa8FxV1/VxHgACP_7K|X0);`GJe;p1T>"4`UMc9o1T>#4aq`e^f5G))H5/J35H*'G6_` //103!!^j8^@ 0 ]]//3//104>32#4.#"Dzbc{Fg5_NN^4tLLtbl98ldW%3@"$$ !H P P??/]q10]]]".'532>54>32.#"+*%>$,<$4ec(W?$,<%3eW5H*aWc6  6G'Wc6DR7<&@ 7)   @ H >87)((#77,4#,  T>>>>t>d>D>$>>"$>>>>>>t>T>4>$>>>>>>>>>>>t>`>T>D>4>$>>>>>>>>>>>t>`>T>@>4>$>>>t>d>T>D>4>$>>>>@>>>>>p>d>P>D>0>$>>>o>>>>>>T>4>>>>>d>D>4>$>>>>>>>>>>>d>D>$>>?_^]]]]]]]]]]]]qqqqqqqqqrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqrr^]]^]]]]]]]^]q/9/9/9/9//+^]]3210_]]"&'&#"5>323267"&'.#"5>323267GKKY'C=:3TPJ6n0D4 =?F)HHBm.'C=:3TSL244D4 =?F)/ !'-,2*)  &..2*;%f+@    J Z EU +;  @ H D  +K[@HD 4 T t  k[;{[KoO//? `@_?_@ @b/joO0pPO/O/9rr^]]]]]]qqqqqqrrrrrr^]]]]]]]qqqqqrrrr^]]]]]]]qqqqqqrrrrrr^]]]qq^]]]qqq_qqqrrr]qqqqqr/]q/+]q]2323222/+399//]33_]]10#7#5!!5!33!!ՁGZӃ#JdGP +@  /]/9//33/33105!5!5!d8dWY o@< RR /0@/]/9=///]33/++++3/10 5!W@wAZWY s@?RR  /0@/2/]39=/33//]3/22/++++105 55!W?7 #@i y iy///10]]3 %! {RVdG////107!!d>T"  H  ///10+#47632#"'.'&#"TR?K3% !$ V{{?0(4 ''#i  H ///10+3#".54>3232765"Z(g>2%!%}86'"%)j%?33105! %iH??103#ؑHK"??310!!#(in"??3105!# (%%H"??3103!!Hn%H"??3105!3 %H' ???23103!!#iHnnH'???33105!3# %K( ?2?33105!!# i%n%H( ?3?33105!3! %nH 3  @  ?32??3223105!3!!# i%nnqj% ??3233105!5! AّH*A ?2?3103#3#ّhHK Kj 1  ???23310!!!!#(iijב" 3     ?3?2310!###בnn#j ? A    ??3?3310!!#!!#htjo"j 1    ???333105!5!5!# i(qב) 4A    ?2?33105!### ܑב%nj ? A    ??3?3310#!5#!5!ґttj)F)ޑqH 1   ???233103!!!!iH"ב%H 4 A    ?3?33103!!33A$Hn#nqH ?  A    ?2??33103!!3!!ّK$hH"qH 2    ???332105!5!5!3 iqב)%H 4A    ?3?3310!5!333$ב%nqH ?A      ??3?3310!5!3!3!5!$KqFH 6    ????2233103!!!!#iiH"ב"H 8     ??3?323103!!#3#AHnn KH I A     ?3?3??223310#3!!#3!!jt " "H 8  @   ????3322105!5!5!3# iqבKH ;A   @ ??3?332105!3#3# 㑑h%K#KH I  A     ?3??3?2233103#3!5!#!5!A㑑tHK )ޑj 9     ?2??3333105!!#5! iiq"h :   @  ?22?333105!!### ב%nnj J    ?3?32?333310#!5!3!!#!5jtttAޑ"בqH :@     ?3??3333105!3!5! Aّ"%H :  @  ?33?333105!333! ב%nnqH L@  A      ?3?32?3333103!!3!5!5!AH"oHL  @    ?32?32??33222233105!5!5!3!!!!# iiiqב"ב"HM  @     ?3?3322?3322223103!!###!5!33AבHnnnnH ]     ?3?32?3?3222332233103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??/310!!* H??/310!!* *g #'+/37;?CGKOSW[_cgkosw{1mUE- y@ xlTD, xeM5@ dL4qYA)}@ |pX@(|aQ9 @ `P8u]=%@!t\<$x||xiI1!@hH0 gckhd`h_[WT\XTSOKHPLHC?GD@32#".732>54.#"Fz^^{GG{^^zFV9bLLc::cLLb9d^{GG{^^zFFz^Lc99cLLc::c#@  /O/]/102#"'&5467>76jnk5RS4l9R46n9:m64R9) //103!32>54.#")Ex[[xEEx[[xE}A[xEEx[[xEEx)+"@" '//103!4>32#".'32>54.#")Q:cKKc::cKKc:MEx[[xEEx[[xE}AKc::cKKc::cK[xEEx[[xEExscu"<@$   @  @//]10]]]]]#"'.5476324'&#"3276c%%%V3eK#%HJfgGJL33FF3331HH13}5V%#%H%V5fHJJGgF3333FE6116y!-9D@] $ t $t+{+{D"(?4.(.(.1%+7+>:h:Y:G:::b^0H[[׀ؙٙW .. -- .. --#_[)4`@7*/$'!04h4Y4K4=442-_oO-_--- /99//]^]3]]]]332/99//3310#"'&54676324&#"326%4&#"326327'#"'ZZZZ. -- ., // ,0^b>LLH[[ -- .. -- ..[_#Fs;3F/@ H4.4$w##@M H H;;  H;/4#4;B p ?   9+>0/43?3O33/^]]]]]/]]]]10]]]]+]]++]]]+373#'#5.''7.'#5367'7>7"327654'.B 965--,,(17:"B?n0+(. P(9p6Eu0bb0uE`cc1u;  -;q9>_1(,=20db2/aac02P&/b@>++++""""P'''@%(H /+^]2qr/]32/qr]qr9/3210.'&547>32!!#!5!"327654&'&7Z#GS,e>SW;=>B.*PlzS++VSzmQR FF;G,+G>>=T,G;QAQF@(1A;NN?  33FF;A1?J777B??/^]]]99/r]]r9910.'.'.547>323267632#"'.'#"'&547632"327654'&6%( ? .@$    TVWvvWTTUzGSZ>==@XY<>><      "O-@" '*R*Qm}VXTTuuWV+ >=X[===>ZW>>;/(@& 0 ` p  "@ H"O_/]//+3/]/10#"'!727>'#"'&547>7>76 (_E#%?BXc$&}V+B,-SZB?N9En&86_,+i?~BCF_?BWVc %%1E[wK`_B?[J;*U/;q9S<K/@9M?4=C /)//99//]923/]10)7>7>7654&5#"&'&547632.'.547>3267>32#"&'.'FTl)@4:Z+X-;a)OII]P3N(a2+C.=#!K2dmy;*&StsOP"4&sN&(PNmVb(%)LtvSP<3=-Q}.-L'fZy'&@) @ P p  ///]10^]].'.'.'.547632>32b*gL8E+%DFfbN/"X2U#F)N7>-qEEt/'xSEj( #&b<^Q2P;`N]]5(o]H: 9Pwc;kM;!0@! @O_o! //]9/9/]2103#>54&'&'#"&547632L3:0./9@%%Hl9:Q0*%#Jj9:;b&J5-L9<guJ&IL1%H%@H%@ H   ]]55]5+++J&IOW!@!!H!H!@ H!@H!H!H!@H!@ H]]5]5++++++++]W+@ H 0 ///]9+10]2#"'732654&#*7>rPX'S\.6*RF24 ;9:TB5Q7v'& mD<@XYX+/0//F( +</+<+H+}10!; ;1P9   /10#>7#73h %-6Al(,G=30T&F @H@ H܀X+?3?39/329/+]q/F( +</+<+H+}3/3310]#7!7333XTg >BK+U%o@3  $%@ H% 0@ '%% H@ H%"??9/99+q+q/]]+210]]!!>32#".'732>54&#"#$G61O9+RzN@aC(./, 5(<&7Q5?fJ(5F(*+#/82/&@ @  ?2?9/910#>7!7!OwU8B`|JpCOYSH]!1?U@1   - ;;;'A52""8*??9/99/99//99]10]]2#".54>75.54>2>54&#""32654.wWL4A(QyQEfC!"4A'8-Pn % (*)7 <<032E &^RE^ O>1U>#5I+.A-O82K1"#&,0}<2#087? //10"&'732>76*6B*7VC1pMhJ*F1#9J&1CnO,X   ?/10#>7#73p %-6D l(+H=30`.@tI   ?/10>733#\C16D l(NWu/0`.-@//10%73] +5@ @//]107%! ~++ @  /39/]10#'##737}+ @ /29/]10#73373Hki/Ko:@@p@  /23/]10]]]".#"#>3232>73,QKD% $?bI-SJB% $?a&/& --fX:&/& .-fX:: @ @ H@/32/+10?!!57!:    ++c'@ @@ /2/10]".5332673JtQ*.>#Nj?_,OpD)>)LXEoP+F4 8$<V_birxh$$7h$9h$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni00A0uni00ADuni037Euni00B2uni00B3uni00B5uni2219uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni02C9tonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveuni2010uni2011 afii00208 underscoredbl quotereversedminutesecond exclamdbluni203Euni2215uni207FlirapesetaEuro afii61248 afii61289 afii61352uni2126 estimated oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxH22073H18543H18551 filledrecttriaguptriagrttriagdntriaglfcircleH18533 invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluniFB01uniFB02uniF005middot commaaccent foursuperior fivesuperior sevensuperior eightsuperior cyrillicbrevecaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc  LNDFLTcyrl$grek.latn8 TbDFLTcyrl&grek2latn>kern h*DVdT^lvv,NhvNhVR0^hhn@<J\ d  6 < F P ( R X R   > \ 0 f x $<V_birxh7h9h:buDDY.yEoO7 ,;tMrphhb=F]~lWm493^Gb#f>-S 2S '!}_3:_ syt?6Xd`0=~ {b:, ;  y qz\x(v2 '/J[ *Vr;$V0_>vU s,FlKNd:@#05C0#3Cs\rYo5Q!-j2:^;hlD`dWFt%D vv      9+)*&*')*&(($RGCCD@AECCCBCADBDB@FQ _%&(()%+9             +     7,*)*7G6(RFAC@BBABA@0k[Kzvx:xqvdpshI\k/?ADR' ~alqmoqdenup8ssprq`b_z !!!  :,+++(+('))%SDDC3{&ja^^^\[Mzzxwzy{N\\\^`n4DR$)%*&+7  "!,*       ;,+-*,;  H                                                !         :(VIEFDDDCDD0nRyl|Ql4AB2pcp5BX&I    H  ;/--: L                             ,)),& C*n+?  Z_\7XuE88LtB'uypK<My.x F SueS m_ YJYx!keR3F 1 [|`Wb( 1K EP%#k c%>L;upz)NddhviWx\e=RlpS$SMF}Z[VDee0=1a!ds$m:B Q  a08 6   W t >U  TS^.Kni1@ *eo<K1 Z5 1;{1 OF wxYL1&$jJ|=AhprLzw3b Tx|z YXeS!g@c]!\-h-]Tr]s|OJF xnK]Vc7)+&z,"P3lQM[ij\\k1?V$ ZyO$2555w_ytwwzwvrt5% $!!G1e;gI+&pzrFt~rrtZid^M_il{?ONQOQOOPPSNRRONRQRPSPPOPQ@{j]u~u[imv56EPd'5E G:F  G*`UCqo}C?}ll^uinstead-3.2.1/themes/default/menu.png0000644000175000017500000000054313267071774016567 0ustar peterpeterPNG  IHDRשsBITO pHYs B(xtEXtSoftwarewww.inkscape.org<KPLTE˴::: !!!&&&((()))---999===IIIOutRNSx)VwIDAT(ϝK EKiPtw<1V`CO 1NʸR 8H˷Wȭ$mglϭHG :~]ĦIENDB`instead-3.2.1/themes/default/cursor-use.png0000644000175000017500000000405613267071774017735 0ustar peterpeterPNG  IHDR+)@sRGBbKGD̿ pHYs  tIME EvtEXtCommentCreated with GIMPWIDATHǭkTƟ.WJB#MTQMITc4=hb)MQ@ڔ" (r[`Y~Eszao pstx|vn웑 글!񡞅+jf%|cꡃYV>I?l@W՘P<'wASڽya|=*V 5{(!u  2dȸ ӺS AX VF3l.׷[|D# `}u&sS(0{_fFw|-K1(@ @R0tqG@F7zWDO'͵-*[^{2P@ z ٟH'^jAC>/p+@Cq_1/^u(?&_dߋ Տ}MlXne+K%i*d }_ز\o& ?ײAAlZ8Ue5Ldg12 *)uz?@ p<`"(Nၒ}m\׈,wl$_ڙ^#5Ŧ ̓o[wcæD_'yp՚q/d/3U>~8K"J/΢BKׇyS"&*T00Okv4Zrr.'n+]=d+[?d8BCn|ћ9)v`~,D`At!b/-3+K OO(!𭉳Ƭ/3I#GE.7u_@`@AWl ]+ިnSq ^~wjb4sTKDD@hy]Dwj 6 cm[;:Q:t=^ ַןZ>ݣ>i5q LnCH0uvD2H7?et~ \-|mUMvVsIݮ; <|G CB'_b dmwc^2w7lXmtÅ8 E/6_\rZ'W YӦ4J%0ڑf͍6%ф>aS-׎],u=ubPsQQsm_Ob Ù>A}WY)6(P to,xfo ё əfո ;3wזhW]-B$1ۛo6=Ȥ -Q2{Gk/ Ʃe}8)9`Q999ӻ{䗎Y&)i 5k~gRhG' qg=2q iON,k:d'Zw@-eg̿x%o|Τ3) &@D޽ Sx 7A`P>uFm[M{}EMeͿ I?T7kbŻ,P 0Pk<6c|Nh]Hmcѣu*HA2

]'iVxG ;n]NCkdRT/ZM33Zf  Px1ASC!W3>`: D99Ms'sV!`9x9%i9P9sYs5ss0s s.ssss6sF9Q9&sVV?q?V??9e?9QV?s???9oV?9e?V:VVV999W(s`s.sCsEsE9Ess"!"!"s"sCssE"9]sVpfaz@ssss-s?YsLd?k3dA5L9G=es`/AVVVVVVqV?V?V?V?9Q9Q9Q9Q"?9o9o9o9o9o9VV"s4s4s4s4s4s4 CsEsEsEsE9Y9Y9:9YsCs"sIsIsIsIsIdR,sVsVsVsVsVs.Vs.Vs.qCqCqCqC?E"sEV?sEV?sEV?sEV?sEV?sE9es9es9es9es?s">s"9Q9*9Q9Y9Q9Y99Q9YQ!V?""s?!s?s?@!s?3!s?s&?s&?s&3?s"9osC9osC9osCeE?"??"V:V:V:V:9]9sVsVsVsVsVsVfVV!sVs. 9,V:9QMVG5V9OLIIZ3.VV??^V??9e9QV?V??09o?V?V~V9QVF"q"?fhForC"=q"We?"bc7sC\[CDKfh8G^kv;C?fhsCfh;CV?Z?eV:9Q9Q???V5>V?Z?CV?V???|??9o?V?q\zV?c]?b?q>5>.?ts.i-',lCsEsVsV"|"g"sCg"sC"EY$VVB&5& "FsEs"!C!+H"s""sV?"fffViisk`ssDa3VMV\ssNsT%nX=>c|8d3i1dLdAdd?dAd"g{mm%))s+kUFQ@;@<fBEETX'NK8ZXZ /qHB~~ O\_    " & 0 3 : < > D  !!!!"!&!.!^!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k ~Q^    & 0 2 9 < > D  !!!!"!&!.![!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&jG/vhzyws /,$#>1"DC:741.' ܸܿܳܰܨܜIFE(&%" bcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?w6   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnj#ti<7q>?fu143:kzvbm6@;2l{   }8w KRoNOPxSQL@EYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,F#F`F# F`ab# # pE` PXaFY`h:-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY@cTX@C`BYYYYY-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,zE#-P/@o@P(F(F+/o@Pp F@FF@36FF=U=UU<P&`p@`p@ 2F?#@B2? `p/oOߩ +@ F:@A P@ $F$$$PZH$Ж@W F_oϔߔ<@F@ F_@%FЏF0@o   @'F 0Fmuuuuts?sP&и@>rF5qF5@p&,F p0poF5nF5U3U3Um)ml`P&_P&KA [ 16F @1&*F^Z2\F1[ZHZF12UU2Uo?YRRRR-4F@R $FQQ@Q58F@Q%(FP N)/FN"F MMHMXMMMMML$-FL FLLKF7IF HF5GF5FFFF2UU2UU?_/Oo?oTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYtstu+++++stu++++s++stu++t++s++sssu+++++++++st+++ss++++++t+++s++st+++s+stst+st+st+++sts+s++s++++su^s++^stssstst^s++s+ss+s+sstu++++++t++^s++^sst+++ssssssss}y:wW~ rj[Ltdje"39+kknL^[^t^eoz iqBHjgaASEyjDXXXXT 8 T TPHd  !H"h#H#$& &'8(()4)-./02P3h45h67?@<@AB$BLBDEdFlGHIKLMpNPOP8TTU`VXWY`Z<[\^0_c d|ehj`jlmmoptvpvyy| }~LxD$8Hx(PDt(XL <l@t8h P8h,l0`$T 4d$L| P0d$T4dX\ŒdʐhҐҸlӄӜD֜$L|ר٤,Tڄڴl4dޔ,@p,\ $<l|@p8l PDt(X0HL(d$D P Pdt , < L |   H X  $\ <p,d00xd "#$&&,'(*8+D,8-h/0l234$4X4445678t8888:;=,=\=>>???AACE@FFGHIII$I4IDITIdJdKL M$N<OHPQS,TUtVWWYTZ[]P]`_```b8cDe<ff$fffggiikxlo4qstXutvwyy8{ {}$}4~(~~lXPDxH8P L|Ph\,,\p\ŒĴH tt,,X@pӤ,pԴL՘H֔DפtH٤x4ۨ|lh<4,P8h(`|D`|X`hLLDP<Tl\p`d(P DdU./<2<2/<2<23!%!!D $hUDM%L@ @&H/@ Hp?/]/+3/]]q10]+]]#373I(((#Y@=/  @oOp9npn...@p.. $o%%@GH%%E o @H (?s3)>t>>9>).%o%%%4s P `   X+?3//]2?3//]9]332/+3/+q9///]q]3/]10]]]]]]]]]]]]]#7.'7.54>?3.'4.'>0Gr  /IgE`Le:TdrSZ7 ucVGlB!"32>7654&2#".5467>"32>7654&5^G) Zjq/7_F( Xjq0%F>4B<#C>4?h5^G) Zjq/7_F( Xjq0%F>4B<#C>4? IvU%]0~["$MxT%[.WlCxbjHb\Dx_oK`VT IvU%]0~["$MxT%[.WlCxbjHb\Dx_oK`V!=Oa@60.@75V`MyFF{C;;{:q959U9e9)@, H%% PI",I8A3SF"X@XpXX@""@ HX"X"= @7O========cKH@ H3F8A>S'==>]Q''?''>Q?322/]q9/999/+3/]2/99//+]]_]910_]]+]]]]]]]]]]]]]]]3267#"&'#".54>7.54>32>7267.'>54.#">GS0(e. 3 9&J;R}jd08mh 6f^EsR-'D^o{?+4A((F>7hY@+K@3GoM("@\ Og;+<%4W="=}{t3&) ?;615ggi7.gmp66/5vyw47#73+ "*{9K X*35WKB AAi|p%@///]q/]/]]107!iРP>@ @ H//+10373P++'I@?Oo??/]8/810]3tD Yb3\@At33-{((" [k[k T d o&&&51o/s )s??/]3/]10]]]]]]]]]2#".54>7>2>7>54&#"Qi= (^Sg; P`pv|LkT wlLkT w7ry?S>54.#"'>32! 7}^6"=U3m%RxfYm=;dv(]wb[ZfyL3Q9ww%L]42]PU{ld`dk>0a=@z88r..Z$j$z$Z#j#z#@t H%<no!n6?54.#"'6$32#".'732>54.+76$SQJ8"9R6w": ]i83`U?}~rsC 3QpIJpK'*Kf<|(?[?,J5zo/YQN^; {WtDAh>0.[J.)Ie<>s3Ǹ??LFH.x,@&y**yz%%rZjZj  $ H H,@FH H+o,,n####.o@ H,,(s    sP`tX+??3/]9/]]33//+3/]3/9/3/++9++10]]]]]]]!!>32#".'732>54.#"#W!r6FU1Yn=G̅jmE *HkJN[1)E]3`4A 5e]wŠK2XxG+(Q@(,ZZCdB!9,ss'9@X%{33s++|:/J/!!%! #n2/222o;(o5s-s p -s??3/]9/]]3/23/]9/]10]]]]]]]]".54676>32.#">3232>54&#"ck9 %~gDxcHrQNrX75.54>2>54&#""32>54.`o<-SvJ2T 4K`;ayE9fRa^6 &gWa55Qa-bm@bD(O?(.StG3X@$)PwO,UB)FI'=@`u44z**t!!5/E/%:&*&&  oo(((((? o2n@ Hs77_7o777 #s  -s ??3/]9/]2/+3/3/]310]]]]]]]]]]#".54>32#"&'732>4.#"32>76>lad3Jv_l; %b$v[PnT7"A[9HzY1">V42j]G ^mBnOqȕW>yrDIL"M-U\J:bG(7g`?`@!"FkI=Q:#@@ H?//+3/107373))))k&: B@    @!%H     /3?/]+93/]10]%#>7#7373, "*{9K X(A((35WKB AAf@ @H(H(H@3H0Pp?0p?o/]33]]/]/]310]+]]+]++]]]]5 Z;XeP@:@`pO0/_oP/]]]/]3/]]]q3105!5!Xf@ @H(H(H@3H0Pp0p??o/]]]33/]3/]10]+]]+]++]]]]75 5Z㚙on^m'+}@&z *Zz +((#0@# H-"###)(O"_"o""""?3/]/]9/]3/+q99//9910]]]2#>7>54.#"'>73eo<=ay<*O@- AYh30XD(&E`;&W''6`MaeJ#3;H.NqU@9F[=0Q9 z(Te9j]r@&nv&&fEvEEf\gWwWiTY44\8J@@ H H}ee)e9e%U{ H H H":2:B:::-9 99u??Q??2?B?3 33Z3"^ $ ^$ h%%i)y)))))) $$   H HR111111+111tt/2Ht@"*Hkt{ttt=$RRR@ HRGG$G GGB,k %$c$"B6YBMۀtpttttttt@t0t tttttpt`tPt@t0t ttt3237332>54.#"32>7#"$&54>$324.#"32>7>Cvb8O1E]uGT}Q(Gr<`I6't+&>kO-S㸋^0Viy+72oj?v$\"?Y8UW-_cEy`E `/@&+ -YE+:gSxݩf0C(Tx10.Qpޢ\@tt`!09p?4!sܴFv2TfF$P@vI(XhxR \R ^  ) i  {+;@36H@ H/_ ?2?339/32/]_]++]3/]q9=/]++++10_]]]!!#3 .'!%KP$ $,d )NA+,AO((?*@+v j(UUeIYiI$O _ o ;   Z&@U H&&[/?O@ H,*  R ^@ H *_O __lmX+??9/]qq9/+3//+<++ć3/+]]q9/+9]]10]]]]]]]!2#!!2654&#!!2>54&#!Phu?GmI%.RoJ\KpNpD,SxK 7Pd9SbC**_]@pYkpq+@(# yj e((f5*E*U*9I\@DH+\?`p-!Z/  @H _O_0+@+P++++++&_lmX+?3/]?3/]/+]3/]]q3/+10]]]]]]]]]#".54>32.#"32>7N1zɁݒH6dxŠT>aWR4gfZ}c&QIa9\{|࿛l;;`|B7/WE)k^s@1Qi8?@Y  +{{Td[??O_^    @ H __ lmX+??/+3//+<+}]3/]q10]]]]]]]2#!!2>54.+b?rn5]IfO瘅ܰX+Xxr7?i ~@Pp    /   R ^@ H_O _ _lmX+??9/]qr/+3//+<++ć3/]99//]]103!!!!!?X_<?C l@; 'H R^@ H_/_o@H_lmX+?3?9/+]/+3//+<++ć3/+9/10!!#!fne-@" z&|}y j U'e'UZjZ!%!!*)R)^--++--Z@H`/[? O _  /  @H *_/-_----$__$_)lmX+?32?3/]9/]/+]q3/]q3/+9/9/F.(-. +</+<+H++10]]]]]]]]]]]]]%#".546$32.#"32>?!7!n8rOw8S8[XS6ot[x[3[ U0T>$Wڄ;6\xB6/S?%iauB-8? ~@HW  R ^   R^@ H _ lmX+?2?39/32?3/+3//+<++ć3/3//+<++]10!!#3!3ttsTQ"W&*H@(#H?R^@ HlmX+?2?3/+2//+<++]]++]1033Q@[dt)9p R ^O0p/\/  __@PlmX+?2/]?99/]3/]]]qq3/F( +</+<+H++9/]10]]"&'732>7!7!}pd767#.'&'#367>7!  2|  # )3j,3043,`%L_-5987/f(`/C#(0,(#G?@+g(HHI0 H  @(H e u F V  @ HR @  R@%OpR@"   @ H   lmX+?33/22?3/3/+3//+<++3/]]qq3//+<++ć++10+]]]+]+]+]+]]!#367>73 .0)]'QA+0)e3o3r@Q+22+*$%%$yYi;v   V f 4ZO/_///5"Z/@H'_ _??/+]3/]10]]]]]]]]]]]]]]2#".5467>$"32>7>54.ޙO K ̗b 8kb͖c :lUԀ1i0^Wڃ.`1_Jʀ+W'kk5K}*Z&kk6?Il@CzW[/  R ^    @ H _@ H _ lmX+?3?9/+/+3//+<++ć3/]]10]]2#!#!2654.#!TtFOӄXj6-RsF6dZnyA;A\<e}*D@ ()v)y @H'Y'i'V f 5: J *CC);%66&. * * Z#Z@@/@@@@$"32>7>54.ޙO y $6H-F&R1UwN, ʆC ̗b 8kb͖c :lUԀ1i0kBY6 3_W _{.`1_Jʀ+W'kk5K}*Z&kk6?@wv {VfWR^dtP@H [@ HR^@ H__lmX+?22/3?9/2/+3//+<++ć3/+]3/+9/]]]++10]]]]!!#!2 2654&#!Gqdh{E pUeI3`Vpx:@;@k:$7t7p6;3[-"d"t"dt;;tDTDTyk%\$$9[/Zpo/?=\@ H/V/I/xK/*`%% _@P?2/]?3/99]]]]]/+3/]]q9/]2/10]]]]]]]]]]]]]]]".'732>54.'.54>32.#"hÈQ 8^^bm:"TlXtD_nyL6TuNhY()TXWM/[W%>\=?eK3H93;W|Zi^+,OnA30L5#?W36G2):Yc\k@D/__oOR^/_lmX+?3?22/]3//+<++33/]q/]]]]q10#!7!Z圜!@euYW) R^9P_o0/# # R^   @6:HP`p_@ H _lmX+??399993/3/+qr+3/F"( " +</+<+H++]3/]]]qqrr^]3/F"(" +</+<+H++10^]]]]]".54>7332>73hN 2XzHWwUs6ps785$MJlG#,`odψB@73 /D -Y#)'%)#Y/.0!%H!@=H!!!v!T! %HO_ H HvK[{9+/H@ HH@ H Hi X I  HR!)!L   R O  R/)/^000R^   G W H)X))x)g)()8))GWg )) 0V0f0002 2222222@-2H{292I2Y2)2I2Y2i22222 @ H0/!  /) 222222222{2k@292 2222222{2k2Y2K292 222222y2i2Y2I292)222222f2V2)2222222{2i2I2)22 222222222y2k2]2I2;2-22 222222222y2k2[2K2;2+22 22222222@2y2i2Y2K2;2)22 2i22222222{2k2[2K2;2/22 22222222{2;2+22 22222222{2o2229222rrr_^]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrrrrrr_^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]qqqqqqqrrrrrrrrrrrrr^]]]]]]]]]]]]qqqqqqqqqqqqr?3/33?3/33/3/+^]^]]qq+qr3/]89=///]]]]]]]q]]]]++ć++ć++ć++10+]]_]+++]++]]]]]+]+q+]]]++]!#.'&'#367>732>73~G/]ߎO  K,5057<@?=4n&?{2:4EC=<7m8;=CFEhy4 @  $-HH$-H@H%,H@B%,Hk      R KR L @3@     O    @"&Hp   / O _  @@ H   ?22/3?33/39/+8]3/]]+]q8999//]88++ć++10]]+q+q++++! # 3 3 p^'\#@i$$$R^RLRKO@p @@ HlmX+?3?33/39/33/+]]83/]]qq89=/++ć++/]]q3/+<++10]]qqq#3 3qs20HH9^ @$4D %*H Hf+;K%*H@ HIYi@A H    RM/ @ H__?2?2/+3/3/]3/++99//]+10]++r]++r)7!7!!:uVWu%@F H *Zjz@@RP`/?OO??/]qq3/]++2/]3/]10]+]!#3'rWu5@rV} H??/8/]810+]]]3@ WW`F@(vRO/??/]22/]/]++3/10]73#7!AWs(@ :HH@0HvHy0@`p @P`0AH@:H?Oo/_o@H 9 0@?>54&#"'>32326732>7C ]U#K[pJNuP(/Qm{?j^1UC3BllY^1 J'*(VSK8!,A,W\5  ML#5T;2Sl9QvT5 $.[W'C3>gJ),NlAW'.%$ 7N7 =/733>"32>7654&P|T, X|c{   S $KUb@sbK"?Y6>dQ>^N2\Q2w?˂=h^;4% +7#".5467>32.#"8ZF6QoWga/ EUcim5Y^53J1EnW> gz!oZ(^-ouL+.TuG-J5(Zi0j&E'=@@vj%Ueu9,I,* *  */"RK"""""""/"o"""@$H""?;G@ H"/4P (PXYX+??9?3?3/+3/+q3/F>(""> +</+<+H++10]]]]]]]".5467>323>73#467#'2>7654.#"P|T, X|c{  R  $KTb@sbK"?Y6=eQ=^2\Q-|?˂=h^ .3. 'H<+ X4/D-&]xbOAbC"%[tyU{|E'N%3@t{11{++*% I @6 H F)0)O))))))53F@@ H P33.PP??9/9//+r23/]]qr3/+10]]]]]]32>7#".54>32'>54.#"8\K9Hkhdm9Uxnl5 $B\80jaP91A$?-YH-9mec:hW267#Ba?JbE @J H@ HRK@ HP QXYX+?3?32?99/+]33///+<++/+]9/10]+##737>32.#"3 &GpV C  &3!Iz;fL+*='aWaM:R@xJ9Z9j9%#j9BIBv5U'e''*" *F56R6K))))/pOT0TTI@P`;G0@ H560/F)KP$@ H >P PXYX+??9/+?9?39/+r3/]]q3/]qr3/FS()S +</+<+H++10]]]]]]]]]".'732>7>767##".5467323>7332>7>54.#"]_7 udHnO5 ?RlHO~X/ 29fQ;   Jzif6ocO$AX3>eP< W%B]8*LQ%LwS<(L:#7aP1m?5L0>7( +y.dp*Y CcB %Yq;l"#@   @W H R K   / O  %WRK@ H #  PXYX+??39?3/+3//+<++]93/]q3//+<++10+]]]>32#>54&#"#3"HWiC ~ T_@q\Av K /L5$Z&s'QOX3]Q~!B7(!  @U/2HO  / FRK`@ HSXYX      rrrrrr+??3?3/+qr3//+<++3/]q+q10733""NҴ :W@N  H/FRK@'-H@$H@ H@H PSXYX+???399/+/+++r3/F( +</+<+H++3/]10+]73"&'732673!!!"E 2;< 'Bc 7 T\@>jN-"V  &*H @ H WW  г&/H @ H  u  e u  & F V f   R  N  RK       /  ?O_RK@ H   XYX+?22/3?3?39/+3//+<++ć]3}/]q83/]899++ć++ć10]]]]++]]]]++!#373 H iP|kE/!p@KV`O/RK`_@ HXYX+?2?/+qqr2//+<++]qqr10]]33! 4"KMA_+ H#@ H9@ARAKB201R1K23233233 222i2y222CCiCTC&CFC CVCCCCCC C)CCCCCvCYC6CC$CCRK@ H;P*%@30 P"12A2XYXCCCCCCCvCbCTCDC2C$CCCCCCCCCCCvC@dCVCFC6C$CCCCCCCCCCCtCfCTCDC6C CCCCCCCCCCCvCdCVCDC6CCCCCCCCCrCdCVCDC4C&CCCCCCCCCfCVC6C&CCCCCCCvCbCPCDC$CCCCCCtCTCDC$C CjC@`CCCCCCtCdCDCCCCCCCDC+CCCCCCC{CDC0C CC:CCCrrr^]]_]]]]]]]]qqqqqqqqrrrrrrrrrrr^]]]]]]]]]]qqq_qqqqqqqrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqq+?2/3/3??93?/+3//+<++ć^]]]]]]]]qqrrrrr3/]]]q3//+<++9/3//+<++10_]++!>54&#"#>733>32>32#>54&#"| LV9gR<v  @L];y DSe@ | LV9gR<vz00+KO3]QS"KC0,9;/L5wq2T?#$Z&sz00+KO2\Q"M'"@X H &'R'K/O) R K@ H &P  'XYX+?2?3?9/+3//+<++ć3/]q3//+<++10]]+!>54&#"#>733>32~ T_@q\Av  "HWiC 'QOX3]QS"KC0,9;/L5$Z&sC2M3`@C/t**"{/  G0O5`5p5'G @ H P,P??/+q3/]]q10]]]]]]]]#".5>7>324.#"32>7>2 kd`o= fijm8"A\95kaP &C[66i^O 4i;t5;qh/d6~v88lcMlE Lt7c*RtH!Mu733>32"32>7654&*{  R $KUbdQ>^h^#4>Y'H;* $-2/D-2\Q2w?˂=&]xbO@cC"%[tyU{|EWeM'=ѵ%H@ HUeu@; H* *  */$RKoP/???-2H?@$H;G@ H"/4P (PXYX?r+??9?3?3/+++3/]]qq3/F>(> +</+<+H++10]]]+]++".5467>323>73#>767#'2>7654.#"P|T, X|c{  "U $KUb@sbK"?Y6=eQ=^2\Q-|?˂=h^=7,64/D-&]xbOAbC"%[tyU{|"N!s@JW !_!o!!@(+H!@H!@ H!!#  R K   @ H   P XYX+?3??9/+3//+<++ć3/+++qr10]].#"#>733>32/@fM2 n  =BK- Jr>>#FB;<>9>[;K;@.::d:49d8p6T5 !!+!+k5H2H@C H )I**`*****= Io / ? O  @H 2-Q$ ****$Q ?3/?3/]99/+]q3/]q99//+10]]]]]]]]]#".'732>54.'.54>32.#"D}o]eC/E_?@kM+&Ec=AuY5GyZRfB zg5]F)&Ea<9u^<=UT) =[;8(?+.H3(9+%2F_@RsH!=aEOF$:))7*!0Ge],@T H /O_ R  K    Q   PXYX+??3/3929/]q33/F(  +</+<+H++ć/]/]39/10+%#"&5467#73733#3267%X0Ua ~}ix/}*0- fT I{:*.VJ:'&@\l>N/?O@ H$4Dt"& v  &''$ RK  ?  ? O  @H )RK$'$$'$$''$$$/$$@#H$@H$$  P  'XYX+?22/3??999/++]r3/F(('$$( +</+<+H++3/+]qr3/F((  ( +</+<+H++310]]]]]]]]]]]]+]]]32>73#4>7##"&5467~ T_@q\Av  "HWiC :{'QOX3]Q^"KC0,9;/L5$Z&pb:@Af HR MR K   H ` @P@@),H0@H @ H ?3?339/3+/+q+8]3/]89=/+]++ć++10+]!#3>73նe !! :@?D??B?f5:(@ H(%H@HfvT@%H6 4 d t 9 %H0H;[)&+';'' H=(R!KR  OR'!'L(((RKW8!H!X!!!8HX!!(((V(f(6(v(((((***9*I*Y*y*****i*y**6*F**@ H***@ H *9*@@H('!&6 @ H' ****v*f*F*4*****v*f*T*F*6* ********i*V*4*******t*d*T*F*4*&** ********v*V*)********v*d*R*@*0*$******t*@d*T*$******@*4*$***i*****T*;*$****t*D*********{*d* ***9**rr^]]_]]]]]]]]]qqqqqqqrrrrrrrr^]]]]]]]]]]qqqqqqqqrrrr_rrrrrrrr^]]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]qqqqqqqq?33/3?399+^]3/3/3/+8^]+]]+qqqqrrrr3/]q89=///]]]++ć++ć++ć++10_]]+]]]]++]]]]+]]++]]+!#.'&'#367>7367>73,%#\(  U, NN(/3-,&RJ:! 7=9 $#B6d$$#D<: @F&        R LR M  @,    P   /    @=-2HP@ H      9      rrrrrr^]]]?22/3?3393/3/+^]+^]3/^]]99//^]98888++ć++ć10^]]]!# 33 ^+D,[Wg:@6[*& RMRK;K[@'_o_P`P`! !@!O@H/@H@H P??3?339]+/3/+]+q]3/]q89/qr89=/]++ć++10]]]]]!#"&'7326?3>737fpU!E+_Fٷp  ')R_p>z/. TSG?GK#l: @*&6fRL @#/2HW 6 F %   ' G g  H @H8   @H@H@ HPP    w V G 7 '         w g W 7 (  ʸ  x h        g G     G '        s c S C 4 #           t c S C 4 #     @      r b R B 0    i        t ` R B 2 "           t b T D 2 "           t b T B 4 $   9      _rr_rrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qq_qqqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]qqqqqqqqrrrrr^]]]]]]]]]]]]qqqqqqqqqqq?2?2/++33//+^]]]++qrrrr+3/]++3/]10_]]]#7!7!!,8&ڋWA9@Vfv H H`p@] H_88888("#R#_, 4,48"#( 9(@>H889??9|/+999999999/]q3//3/]++/]33/]3/+]10++]".54>7654&'7>7>;#";n;[=8 ]U3VB. F?1E1 E .@P+EQ=GM0W&B\6   ,!SI8X>j4Q82T@, dN !! H89??9|/+999999999/+]]/]]33/]++/3/]3/+]]2/]310++]2+732>7>75.547>56&+74;[=8 ]U3VB. F?1E1 E .@P+EQ=GM0&B\6   +"SI8X>4Q8d2T@, dN?!! 323267jEIX&A<82Q)OMK%233E{4<=D),-  &.  2*@;^@BHx@$H@H@ H/]?]/+++]3/]q10]]+]]3##7(( D%?3/ Ͱ2%/3Ͱ2&/ְͰ#ܰ"Ͱ"'ְ6> . > % #9...@  %............@# 9" 9  9% "#$90167#7&'&54776?3&'em>WHs |"OJEq33|@ < qLv1rj/ 4>$,@u{#%@} H   o,,"## #R#q   o.@ H#(" u  / _ o  @ H (s(t,,,X+?3/]2?3/]9/+]q993299/+3/9/3/F-( - +</+<+H++9/99]10+]]]]]#!7>?#73>32.#"!!!2673%ȖDau7DngFz^@ pIr8h *=L-g6.|\f7;U82@Ds}7dTAU`s#7@*:JZH,:JZH,5 E U  @H # 5EU@!H#:"J"Z""H"-"5EU@H#5EU@H#:JZH-.$@ HF9V9f9F9f99999999999@ H9 )3 99999999t9f9V9F969&99999999t9d9R9B949"99999999999t9d9R9D929$99999999999v949$9@9999999999p9`9P9D909$99999999999p9`9P9D949$99999999999t9`9T9@949$99999999999t9d9T9D909 999i99999999t9d9@949 99999@T99999p9`9P9@909 99999999p9`9P9@9 9999999rrrr^]]]]]]]]]]]qqqqqqqqqqqqq_qqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]_]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqr/^]+]]qr/+]10_]+]]+]]+]]+]]+]]+]]+]]+]467'7>327'#"&''7.732>54.#")%dhc6IG~6ah`%+,&dfe6~GH4iff%)-Lf:9fM,,Mf9:fL-G6dge'+*&ai`6GG5die%)*&iif6I:fL,,Lf::fM,,Mf-+@pk+ &6{((8mK[ R^   RLRK  @:@ H u  uO _ o       X+?3?399//]]qqr33232/+]83/8339/3/339=/++ć++/+<++10]]]]_]]]_]]]]]]]!!!!#!7!7!7!33A;;} @}/}y9{*@ @?/+M9/321033զ v T=K_=@uDDjzcsl)|))NUNeNuNX\XlX|X   11*1BH/QLH,[//'V:I999HoVV@&7HV/V?VOVVVVVVaLH'I/?'O'_''@H'"QG,[[[[@/2HQQQQQ',HQ@+HQ[Q[B =Q4::4Q `p   /]3/]q?3/9999//++qr+q3333/+]3/]3/]]]+q2/]99//999910]]]]]]]]]]]#".'732>54.'.54>7.54>32.#">54.'&He?9KD~p[eC/E_?@kM+'Fb;AvY5)If<8_D&=^E/$kPUT) =[;8(?+.H3(;-%8NhC=^E/ &mNRsH!=aEOF&>.$7-%2Kl> >>@3 H33333@ H3>3>`p?Y$@ HR@ HRRM.C8O>_>o>>>8._.o...P8`88888 .8.8))YoY_YOY?Y/YYYYYYYYYYYYoY_YOY?Y/YYM^]]]]]]]]]]]]]]]qqqqqqqq??99//^]q]q3/]3/+/+3/]]]99//+q+qq3/10]]]]]]]]]]]]]]#".54>324.#"32>".54>32.#"32>74^dc^44^dq\c僂cc䂃ceb00abKpP7r &7H/Ec@!CdC1K8's:Rod^44^dd^4rcc䂃bb@r^bo;$;K'!2&.SvHHxV0-8#+Q?&Y.>O@m}UMeM+;K H/@' H?O  '((0>8     @;H/ ?  QE/?-o'''@H''"-;J  `/]]]332?3/+]q9//]3/]+]]q33/]9/10++]]]#".5467##".54>?654&#"'>323267'32>7%$4!9BN/6R9?gC D;!;0# 1NkG5  ȋ+TA( ).UC.'#9(7L-Na8<51 4&1P: k\  !<0%#;L(Lk@hgwhxgwh x   ;   @ H   _o@ H /o/]32/+]2/]/]_]+]q2/]10]]]]%73 !73 2 f  i m?s%m?s&dGC@/0H?3]]]]qq/]/]10%!5!?-;D@E{t {t:!J!!5"E""5'E''5&E&&5+E++:,J,,:J:J9@ H9 H6@ H/::A;A12<77.;;/22;2;`p?F$@ H;..2:/`0p00A@3A`A_AoA_2o233 2A33A2))FoF_FOF?F/FFFFFFFFFFFFoF_FOF?F/FFM^]]]]]]]]]]]]]]]qqqqqqqq??9///^]]]qqq223/3/+3/]]]99//]833/29310+++]]]]]]]]]]]]#".54>324.#"32>##!24&+3264^dc^44^dq\c僂cc䂃cRǡ3hUݟ_QPTd^44^dd^4rcc䂃bbP?~of{PEHU|T///10!5!|su\'V@ H  H H@& H 0 ? _ o  #@?]/]q]10++++#".54>324.#"32>-Ni;;hN..Nh;;iN-m0A&%A00A%&A0y;hM--Mh;7>54&#"'>32!HOS(3\G)DA ;1$} 3NkC?bB#8Zp9#D;/3g.K>48>I.3H$5"4V=!":N-BhUF!**-q5':չ H!@ H: 44@H   :44: )&9I 54&#"'>32#".'732>54.+L9F<(B9Da})%B1 0:= #<00?FA:R47J+,!.: @cD#,ER'6')>+#. .@u@/?O/?/]/]]1073WE:+@uDTds++E+U+e+@ H;%K%{%; K { 6Fv/OuW%5Eh%5!( H ##RK######h#x###@/2Hw#8###-v--e-6-F-V---'--------@F#H)---------x-g-H--*++R+K7@-%2H(x  'P*# +XYX---@H---p-a-P-@-0- ------------p-a-Q-A-0-!-----------r-c-R-A-2-!-----------s-b-S-C-3-"-----------r-b-S-C-3-$----------@-t-d-S-D-3-$-----------p-`-P-@-0- -----------p-b-R-B-4-"---i--------t-b-R-@-2-$-----------t-d-R-D-4-$-----------v-f-T-F-@"2-"---9------rr_rrrr_^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqq_qqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]]qqqqqqqqqqq+qq+?2?39/999323/3/^]+]q3/F,(, +</+<+H++ć]]]]]]]qqq+qqqqqrrrr3/]]+]q3/F,(##, +</+<+H++910_^]+]]]]]]]]]+]]]]332>733267#"&5##"&'%*<&9cO8v " 8&J>A\>Z^WR20C*2\Qb-%# a\_^*%5J@.ppP _  /3?3/2/]/]99//]10###".54>3!pqP`52_W3#-XXT]2f&@/@+H@H@H/+++]/1073++GWr@ScsScsس H H@1 H    @ H 0/]/]9/+/]/]9/810+++]]#"&'732654&#*73>QQ"IsQ60([K7@ek`H;-H1[,-)=3~ @Nx  R@H@ H&6F  & 6 F  d   @H Y i  9I          t f T D 6 &     f V &       t f V F 4 &          v F 6 &     V 6 &         y i [ K )      @     { o P @ 4 $           p ` P D 0    i        t d T D 4        p d T D $          d P D 0   9 r^]_]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqq_qrrrrrrrrrrrrrr^]]]]]]]qqqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]qqqqqqqqqqqqqqqqr?3/^]]3?2^]+]qqrr/qr2/+/+++3]1073?33=v{3kake61b@zzu u @, H H//@/P///3" ' `/]]]?/3/]]10++]]]]".5467>32"32>7>54&LrK%HhOMqK%Hh*J?2 *;$+K@3 W+OnCC ^V(+OnCC ^V(6`M*D1E+8dO*F^M%@Og w h x gwhx   4 T ;  4d@H? /o/]32/]+]_]q2/]/]]q2/]10]]]]%#7 73#7 73  'ot?'ot?`0&y#'?^ ?55/q&y' r?50&sS'?^@ A?<<<]q5?55A;'+@ue JE U e  U e u  d t R % *H  ,(+{+++@$H+@HK[k++,# "["""@H""-@Ho_O/?*+@"P"`"""""oP/]]3/]?]9/]_]]]+]3/+]q99//]++]9910_]+]]]]]]]]]]]]".54>7>733267#7do<=ay<*O@- AYh30XD(&E`;&W''6`MaeK"3;H.NqU@9FZ>0Q9 z(Te9&$2@ &%+5+5&$&%+5+5&$Q& %+5+5&$^&6 0%+5+5&$g&2%+55+55&$P8%+55?55@ Ho    R^   R ^/_ _ O O    ` _lmX+?2?229/]qr3/]32/]3/]9/]3//+<++99++99//]]q10+!!#!!!!!#!_QXY_ + $!d<#2:3&3qW&&xx7/ %+5?i&(,@  &p %+5+5?i&(@  & %+5+5?i&(Z@  & %+5+5?i&(Z@  &%+55+55QT&,{@ &Z%+5+5QD&,a&%+5+5Q&,@ & %+5+5Q &,@ &%+55+55"#@8 y y Ueu *z[@<@H47H@R,/HO_% # #^    @ H _O#__ lmX+??9/]qr32/+3//+<+}3/]3/]+++]q9/10]]]]]]]]2#!#73!!!2>54.#!b=mn}vIj`0]IfO瘅ܰX+`Xxr7?&1@ &/%+5+5o&2M@ 4&.58%+5+5o&2%@ 4&47%+5+5o&2@ 5&m:4%+5+5o&2@ 4&?O%+5+5o&2@ 4&86%+55+55=s H@H H HH@HHH@HH H@H /q/]]q10++++++++++++ 7   bh^^i`fJb`g_iia!.<9@M-v y 1{191i1,t,6,f,YiVf*8%%$@] H +  +  H$ 1-2,*/!!!Z///////*Z@4?O_/@AFH@.2H@H2,1-5"_ 5_ ?3?399/+++]q3/83/]qr^]2/89910^]+]]+]]]]]]]]]]]]]]]]]]]]#"&'#%.5467>$3273"&4'32>7>34 J43 K̗b .fm.5[͖c Hg1i0^@54.54>54.#""/_c3.EPE.*>I>*4he*TND8-J;V8)>G>)-DOD-8S6CoU=.Oh;A]G624"$@@DPaDN2@U>/5D3 9+#MzX43&DCU@ T&^UX@%+5+543&Dtm@ T&TW@%+5+543&DK @ U&oZT@%+5+54F&DR@ T&]k@%+5+543{&Di @ T&XV@%+55+5543s&DP"@ Y&^T@%+55+55 NH[i@MzhhzaajNzNN@@|00:< + !: u;iI*F[[*2Fp**3*3*_ I @5 H CF0______kQG@ Hd-P8 PiiJQ%%8p2/22;@ H2;>8VP?332?3+/]]9/3/9/2/+3/]]q3/+99//]3/9910]]]]]]]]]]]32>7#"&'#".54>?>54&#"'>32>32%32>7%>54.#"{y3TD3Deb#'_vUPvN'0Sp~Amc4XF5Eopz/;phf3s)YVM:",?(Ye> !gJ)VHKS:hW267 6N7%?,?`t5#Ba?JbCWN&Fx;3%+5E'&HC*@ 4&058 %+5+5E'&Htf@ 4&47 %+5+5E'&HK@ 5&e:4 %+5+5E'{&Hi@ 4&l86 %+55+55Y&C@ &%+5+5Y&tW@ &%+5+5:&K@ &j %+5+5Y{&i@ &%+55+55C0J@{HHt::r@& H+"{""6#F#V#$#*%  ./@;//FG)F/F/F?FOFF@!$HF@HFFFL9F@ H1P$)$. /@ H//$$P$$$7>54.q0]6(P$0P9  ]nij6("JE= +5FoT:~u;fUB  A`0-K$5flC9{a@CAw7?pZD '6i`V"qxf&Q\ >EuW3;=$K='"G&QR@ (&1?#%+5+5I8&RC4@ 4&058 %+5+5I8&Rtf@ 4&47 %+5+5I8&RK @ 5&d:4 %+5+5I8&RR@ 4&j=K %+5+5I8{&Ri@ 4&m86 %+55+55R5u o@ @5H_/??O/?@ #H @O?]]/+]qr/]+]q9/3210535!53,\,:@ i7f) H @ H@ H H@c H0 H/ 66((t!!f!}//i//"0!- G/-?-O--@H-@H---<G @%H"/!0%3P  %P ???99?/+]r33/]++]299]]]]10]]]+]+++++]]7.5>7>3273#"'#.#"%4'32>7>%' fiiFJ kdhP  T35kaP |!U26i^O 5U/d6~v8CRg4i;s3G^I6sLt7cB3Ju32"32>7654&*{  RsS $KUbdQ>^h^ %09YuY4/D-2\Q2w?˂=&]xbO@cC"%[tyU{|Wg{&\i@  &$"%+55+55&$MN&%+5+5.-S&DM @ T&UW@%+5+5&$&J!%+5+5.-&DN@ T&Y`@%+5+5U&$Q %+5._-N&DQ) "]]99%+5q&&S,&),/ %+5+5C&Ftg@ 0&03%+5+5q&&@ -&2, %+5+5C&FK@ 1&g60%+5+5q&&O @ ,&,. %+5+5C&FO 02%+5q&&@ ,&.4 %+5+5C&FL@ 0&28%+5+5?&'5@ &$ %+5+5E&GK@ G;FF%+5?5"EE@w77jCT%d%t%9I*#!3!C!6 *..136<2<0-(@1@1@2<R7654.#"".5467>323>?!7!733##467#@sbK"?Y6=eQ=^2P|T, X|c{  ,  $KUbv&]xbOAbC"%[tyU{|2\Q-|?˂=h^ .3. )'H<+ X4/D-?i&(MN@  & %+5+5E'S&HM@ 4&{57 %+5+5?i&(@  &%+5+5E+&HN@ 4&9@ %+5+5?i&(O@  & %+5+5E'&HO 46 %+5?Ui&(Qc] %+5Ei'N&HQ9==== %+54@ W@H/?O R^   o   R^    @ H __  lmX+?22/3?399//32323/3/+r33/]//+<++3/qr3//+<++3/]+qr10]!!##7373!733# 7!~~ǚ,,,,))s-" +@VV%     @D H## R K   / O  -"%!!R ! K   @7 H @ H%Q" P    XYX+?33/3?9/]99/]q32/+33/+//+<++3/]q3//+<++9/10+]]]]]]>32#>54&#"##7373!!w"HWiC wv T_@q\An- Y/L5$Z&]'QOX3]Q!B7(Qx&,@ &%+5+5*'&R!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!@H!H!H!H!@H!H!H!H!@H!@H!H!@H!@H!@H!H!@H!@H!@H!H!@H!@H!@H!H!@H!@H!@H!H!H!@H!H!H!H!@H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!H!@H!H!H!H!@H!H!H!H!@H!@H!H!@H!@H!@H!H!@H!@~~H!@}}H!||H!@{{H!@zzH!@yyH!xxH!@wwH!@vvH!@uuH!ttH!ssH!@rrH!qqH!ppH!ooH!@nnH!mmH!llH!kkH!jjH!iiH!hhH!ggH!ffH!eeH!ddH!ccH!bbH!aaH!``H!__H!^^H!]]H!\\H![[H!ZZH!YYH!XXH!WWH!VVH!UUH!TTH!SSH!RRH!QQH!PPH!OOH!NNH!MMH!LLH!KKH!JJH!IIH!HHH!GGH!@FFH!EEH!DDH!CCH!@BBH!AAH!@@H!??H!@>>H!@==H!<>H @==H <>H@==H<jN-?9&.iX %+5"9V&Nt %+5"V:  &*H @ H    г&/H @ H   %     R  N  RK     o    d / ?  RK@ H   XYX+?22/3?33/39/+3//+<++ć3}/]]]q83/]899++ć++ć10]]]]]++]]]]++!#373 HҴeiP|:E/?&/@ & %+5+5! ?&O)O&%+5+5?9&/ִ %+59&Odƴ %+5?&/ %+5?5!&OK@  > %+5?5?&/OO %+5!&OO *%+5 @[ vp  @ H    R^    P` @ H     _lmX+??399//]9/+33/]//+<++3/+9/10]]]!!?3%_yiu2UU @W /  @=H   R K`_@ H @ XYX+?2?399//889/+qqr3//+<++3/]+]3/]]10]3?37 i~DDXHGz?&1&%+5+5&&Qt@ (&(+#%+5+5?9&1qM%+5&9M&Q,2#%+5?&1@ &%+5+5&*&QL@ (&*0#%+5+53&Qx s22%+5?6@H[9I%-5-E-e-(65 H/3R3^    k { _ / O  8&&R^@ H/3, _&,! _lmX+?2/?3?39?399999/+3//+<++ć3/]_]]q3/F7( 7 +</+<+H++9/10+]]]]]+"&'732>7>54&#"#>733>3 To,"_61ekzEmu>iMD%\ZL?EE>dF'7Q ѐL"WM5 1 H@ H  5RK`0@P9O_/o?O7)RK@ H)5/$#P/ PXYX+???3?39/+3//+<++ć3/]qrr^]qr3/F6(6 +</+<+H++9/10^]++]#"&'73267>54&#"#>733>32g 'BcG"E 2;< T_@q\Av  "HWiC >jN- T\'QOX3]QS"KC0,9;/L5$Z&o&2MN@ 4&57%+5+5C2S&RM@ 4&g57 %+5+5o&2 @ 4&9@%+5+5C2&RN@ 4&9@ %+5+5o&2+@ 4&4=%+55+55C&RSK@ 4&4= %+55+55e6@E Z j 6 9%44%-@HR^$%$$%$$%% $0$@$`$$$@DH$$/82Z?O_/@H_O*%_$_lmX+?22?3229/]qr/+]q3/]9/+]3/F7(%$$7 +</+<+H++ć99//+q10]]]]]]!#".547>$32!!!!!%2>7.#"}&i0O FKHi:Xv_ >8.;<9~˘e0(`($()&")  JJ====m *\G55R I @5 H /F0RORRRRRR^BG@ H P\\GW:P*'$GP?332?3329/9//+3/]]q3/+9/210]]]]]]]]]]]]]]]]]]]32>7#"&'#".5>7>32>32%4.#"32>7>%>54.#"8[J8Gjh3Oق`n< ei1Lynk4 O"A\95j`P %B[66i^O #@\80jaP?1A$?-YH-c^eW9oh/d6~v8c]]d:hW267MlE Lt7c*RrGJu&Ut@ "&"% !%+5+5?9&5# %+59N&UsԴ** %+5?&5B@ &! %+5+5"j&ULH@ "&$* !%+5+5:@-&6tI@ <&D$%+5+5&VL@ <&>D )%+5+5W\'x7W,&xW\&7@ &K %+5+5]&WK@ 'G&&%+5?5\@b /?O/?__ o O   R^   / _ _  lmX+?3?9/3222/]3//+<++3/]q3/]]]]qq9910!!#!7!!7!ZX}}X32.#"! %ClR?3$.;fL+*='e8#{@ !HY H @ H @ H ?O/?_@H@p0p   R q  0@ u   Q  Xp`@0 p`@0 p@ 9rr^]]]]]]]]qqqqqqqqqqqrrrrrrrrr+/3/^]9/]9932/]]q33/]]F( +</+<+H++]]qqqr/+]q310+]++]+.#"3###737>32>.!  (GmQ R#  (@-C;fL+ &$'P -$8¶=@%%+55+5?55.&D'P*@ |&Y&k@ |@%^T@%+55+5+55+5&&%+5+5 &t@ j&jmC%+5+5&K=&=@!%+5+5,&t@ ;&;>%+5+5:9@'69K&LV9\'7Q9,&WM @ xUe  +[ 4 d  D t  $ T @ H@$H@  +;{ { ` P D 4            p ` T D 0 $          p d P @ 4 $           d P D 4  @         t d D 0 $          t T D           d T $        p ` @ 0  n      p P @       ` P 0    p ` @ 0  >  rr^]]]]]]]qqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]_]qqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqq/^]3+/+]]]qqr3/]]9=/3310_]]]#'##73\t" @MDTt k  D T     [  4 K[@$H +;{   t d T D 4 $        t d 4 $        t d T D 4 $        ` P        ` 0        p ` P @     P      @ 0   n  @+    p P @      9  rr^]]]]]qqqqrrrrr^]]]]]]]]qqqqqrrrrrrrrr^]]]]]]]]]]]qqqqqq_qqqrrrrrrrrrrrr^]]]]]]]]]]]]qqqqqqqqqq/^]+2/]^]]]qqqrr3/]9=/]3310_]]#73373 ̵apSC@@ HTd @HDt @$H/ ; @H@Htd@0$tdTD4 t`PD4 p`P@0/@@/`P0`0o? j`pP@ 9r^]]]]]qqqqqqqqrrrrrrrr^]]]]]]qqqqqqqqrrrrrrrr^]]]]]]qqqqqqqqqqq_qqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqq/++^]q+qqq/^]]]+qqrrr3/+10!7!&>@({   @  /?/]2/]3/10]]".'33273JnJ%tgS@uA[v3Vo=UN=oV3V ,N@ &@,1HfFH@H SyYIiY9) YI9)yi9) iYI& I6iY9tdTD2"i@p`P@0$pdTD$dPD4$9_rrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]_]]]]]]]]]]]]]]qqqqqrrrrrrrrr^]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]qqqq?/^]++]qr+rr1073V"" s'[@ H  H H@+ H@ @#/_/?O/]q/10++++#".54>324.#"32>&BX22XB&&BX22XB&l$12$$21$2XB&&BX22XA&&AX21$$12&&2GUt@( H)9I{@*.H@H +;[k+ ; k {     tdTD4dTD$T4${k_+{k[K;+ @kK;${k_+{k[K; jo_K;+ [K;/k[;+:rrrr_^]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]qqqqqqqqrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqq/^]/^]//]3/^]]++]qr10]+"&54>733267XZ)=HD:((& 4FU^J4V@- -32326737*LE@7CZ&9S;,LE>6D\%9S%-%>9-_N2%-%?8,_N3@ @1  h@ H  w f U  @'+H   @"H     v g  ( 8 @H@ H (8x         v g W F 7 (      V G 7 '        x g 7        w F 7 &       w g W        @ 8 )        w f U E 6 &           w g W G 7 &   i        t c T C 3            r b R B 4 "           r b R D 4 $   9  @    _rrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrr_rrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]qqqqqqqqqqqqrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqqr/^]32/+]q^]]]]]]q+qq+rrrrr/+]q_]]1073373<  //10]73~!$%A _@   @#*/H    O _ o    /32//]9/]+q]10]73%73!73!"B""!p%&$T{%+5?5&@/@+H@H@H/+++]/1073++Lb'(Tc{V%+5?5I'+T`{M%+5?5I',T`{V%+5?5!&2!T{6g44%+5?5g'<T{  %+5?5&vT{<B::55%+5?5.A&U2@& %+555+555$?%?Y@(@ HR^@ H_lmX+?3?/+3/F( +</+<+H++3/+10!#7@d Y i y  ) R \R^  Ht   +  Z?p_ ?33?2/]3/3/]9=/]]+++ć++10]]]'3!%.5 $: $, ^)PC1 2FR(?i(=?+e7@?fijdVkY9Ie 6 F  5j5 .(e(! @H@k H Z33/3333$"32>7>54.KޙO K ̗b 8kb͖c :lUԀ1i0^Wڃ.`1_Jʀ+W'kk5K}*Z&kk6Q",?.@LXhx8Hx H(xwR  \R^I@[Hv );K[{D+;@Hdt@ H/ ?22/3?33/_]+]q3/]+]qqrr9=/]]]+qqq++ć++]]10]+]]]%#.'&'#3 /P/Y#)%'*$X, ?0?1_ o@ P   @H`/@,H @ H _ O    __??9/]qr/+3/3/+3/]]+99//]]10!!!7!7&9`o2?~@LWWR^oO R^@ H_lmX+?22/3?32/+3//+<++3/]qr3//+<++]]10]!!#!} ?I3 @y L6)I  @/5H @H [@/5H@H[@/5H\ /  @ H  {4 _ _?2?29=/]]q33/+3/3/]3/99//]+q++q++q10]]+#7 7!!!!YcE7s\7<~c*7@!iVfX+h+:&J&53E3*%***  +7 R^   [?$?$_$$$$$$$91[/@H`77*+`  7 7  lmX+?3?399//3232/+]3/]]q9/3/F8( 8 +</+<+H++10]]]]]]]]]]]%".54>;7332+#?32>54.+";uIV݇#!1uIWއ.,|ck84ZwCE|cj84ZvBFAzm̎LAym̏L3ecXQ'3dcYR';+$@ V&f&:J@ H ''  *+++R+^ #%R%^ " " """`""""""/"?"""- R^   /_#"" % *`  +lmX+?2?39/9932993/33/3/]3/F,( , +</+<+H++3/]]]qq3/F,(" , +</+<+H++9/3//+<++10]]]+]]!#"&54>73;3>73+S3ZZ.RtF8On^6ZbVҐiS#! - !#"C];I3aYl|DU9@%vvo222o333euo  E J:J  ( H0 H)8p887) )9I| H0''( @ H((5Z ?O_;)"Z/55'@ H' +0'*_)_??32/+3/]33/]q299//+]3333+]]q]10]]]]]+]+]]]]]]]]]]]]]]267>;!7>54.#"!732.546$yݜUBז-(#H+v6;m_gX$EfA-P&-2F|\6r L΁~໒0*igk6FؒXt\&'pibQ&,@ &%+55+55&<@@  & %+55+55F&~Td@ H&sHK* %+5+5"&T@ >&>A#%+5+5"W&T-& -0(%+5+5?p&T4@ & %+5+5hA&Uj@%&n+1 %+555+555FM1G@wF4{=ooocsj>z>k66FV0%0. ((*(@ G H  @/@ HI9G*@ H*;P% 2P?2???3/+3/+]q3/310]]]]]]]]]]]]]23>73#.=##".5467>"32>7>54.SFmP2 "010+#  !J\qHQ}V, _a:bQ?4icX"7UM$@Y64;>Yfmi_%ewa/@B=8cK,6f].r6y5(_srT8nl%I|Z2W` >@w#euZjZZjzYiye u V G P`pA%$H// : 55H@::@H:::@%$$RK   @$H ) 9  %*P 4P$55!PXYX+??39/9992?3/]+]3/F?( ? +</+<+H++93/]+q9/99/10]]]]]]]]]]]]]]]6$32#"&'##"32>54.#7>54.-T`43Sl96\E'G}f7 :}!DOW+M\4&HkEHpM(4O.VwJS^: 8Rj@kF8&9\5褪 )S~T7^D' -JjF+G3oXa:@A+R  M  RK  H `   eu@/@H ?2/?39]]/+]83/3]3/]]89=/+]++ć++10]]>73#>7,r !"s630*Z*:]BD>;A@-o|A[/C4@,{..t  { dtk6r@Y H$#4#D#t##*$:$J$k00 0 11+33!G/?O@H6G+@ H+1P0 (H 2P&??9+332/+3/]+]q3/9/993]10]]]]+]]]]]]]]]%2>54.'".'#".54>77!YZ-&4/jh_I,&D\/ )-) ,I4R{go;asqBsZAn_R%+?.54>32.#"3"jFX+[h{LT[0/UvG'D49hZ>kYI)oK+N:#3XxE4h_S<#0CtPDi+B.+OnB?hN1 '9J,IoJ%(B/T?8*@+->% /I4$=+= 6c@>u [ k 5E %%-%]%I55'.?8G'@ H'/5Q ""6/?9322/+3/]399//210]]]]'>54.'.54>?#!7 LuF=[<9aH))3f ;W8?nS0FwP 061 IU+;, #2F3+MG>H#)+' -EbC]H"WM,¹, H H&@_ H+,R,K,/oP/?. R K@ H  + P%XYX+????39/+3//+<++ć3/]]qqr3/F-(- +</+<+H++10+++>54&#"#>54.'33>32z T_@q\Av"HWiC W.'QOX3]Q.*" %'& ,56/L5$Z&eE#1@7!"!>54.ع%orR^3I$>pdV# 3F&=pbT#0 3I@[U;xx:Pvo4ؤQ6SqD3~աR6PlA?:y@C  O/ RK    @ H XYX+??399/+q33/F(  +</+<+H++3]qq10]7#.54673&HA(9N2"V:  &*H @ H    г&/H @ H   %     R  N  RK     o    d / ?  RK@ H   XYX+?22/3?33/39/+3//+<++ć3}/]]]q83/]899++ć++ć10]]]]]++]]]]++!#373 HҴeiP|:E/z@b H3*)D 0    RKRM HC@/@ H@ H?P??33/39]]3/]+8/]+89=/]+++ć++ć9/]_]]]10_]]_]_]]]_]+_]'.#"'>32##,  0$*%)(6N;*δ|cJc=$Q_wA:-H@ U@ HrDTd" H0 H@ H&%/(?(O(((%5Euh%5%&&%&'(R(K&&&&@_o/RK@$H/?( '&& P XYX+???3?33/39/]]+3/F.(. +</+<+H++ć3/]qqr3/F.(&. +</+<+H++9}10]]]]]]+]++]]+]]!>7##".'##332>73 9DP2'H:*  I} 0L654&'3#3bj8bhpûm#;3D}o:7N@k{m}\k,Z,d t 6 F %E Z[1k11 H@@/@LLF>$I)8) ))>) )>3`NpNNN?NNNPG3@ H3CLQM.9 Q.) #M#/?9/99322/+3/]]9///]923/10]+]]]]]]]]]]]'>54.'.54>75.54>?"+7!6neXB%5Ys>A}mR/=[<9aH))3f ;W8?nS0L̀6dL.Cev3&295, JzO(8L2:K./BWlC+;, #2F3+MG>H#)+' /HhH\\ *BW6FaA& C2MR[{:4@ky HI /?O( HHO&&&&&224RK6++G/ 44&Q1P XYX+??3?22/399/]3/3/]]]3/F5(5 +</+<+H++3/9/]10]+]]+]3267#"&5467!#>7>767"7>3!#+1"M+^VnAGJ!"MLD'PG7-47% # 0"  gZ:HJL}  WVN2@!+f1j1z1h,x,uFVf@cHE<L, % !3!C!!GO00004$##RK/?@$H#)P PXYX+??9?3/+]3/F3(3 +</+<+H++ć3/]]10]]]]]]]+]]]]]]]]2#".'##>"32>7654&bp=bd;`O> SVdKoQ7>?KT,GsW=N?th$R*vH'4= WxI8gX5)6f\OGCN5@tdtdt@XHY[/k/5E6 F % 44+4[4I''!I,,y  p  7G@ H1,1&P0 p  ?3/]/93/+3/]]9/2]10]]]]]]+]]]]]4>32.#"'>54.'.C!Bdg>_K:"_?=kZG1<[<9aH))3f ;W8?nS0JJzI%3l-=6\zD.@."#2F3+MG>H#)+' 0MpD:1{@R t00+%u+ |***j* G#�`#/##?##@H##3/G@ H'Q P??22/+3/+]qq3/]3210]]]]]]]]".5467>3!#".''2>54&'#"hj6u( #*+/EՇiW&SR]~>pa$T(w4=agT}Q6(]n)I#Kg:#@B( H %RK # # ##@ Ho  O    PQ XYX+?2?99/]]]q+]3/F$(# $ +</+<+H++3/9/10+"7>3!!3267#"&5467N'PG7-47DЅ+1"M+^V  S# 0"  gZ9h:$@ yf" H H H@U H )$$G/ ? O  &RK!$!!$!!$$!!!@H!!P$XYX+?22/3?99/+qr3/F%($!!% +</+<+H++3/]q10]]]++++]]32>54&'3#".5467ycjIpR9" <]fPa6s:I8ep7_RW02Xgʶq@,X[#K*OGWR(9@z2j2c!s!! H@ H* %$ k{$./ -#-RM$$$$@PFO777777; G@ H-$/#P )PXYX+?2/2?3?3299/+3/]]9/]]q3/F:($: +</+<+H++10]]]]]]]]++]]]]2#.54>7>">7>54&ClM) qsOO^f5Hw uvp9W{K":/%qNcH @P0_\+j3΀;iBueq ZKD`h6@fJ.cpBp-ngkXyP@zz9y  JZj @ P ` RMRN O@@ H P/33/3?993?3/+83/]q89///++ć++]10]]]]]%#.#"'>323 #(ag$ !"#&&0@0'Uqi9W6R7 | >fKGvW<#@+  z { 4#+#Y"y"4"+"""*!d  H H H@ H H H@ HrTdEV) #!#RM""""FVfRK@H R KPo% #"!P XYX+?3?32?33/3/393/]]q3/F$($ +</+<+H++/]+3/F$($ +</+<+H++9/]3/F$("$ +</+<+H++10]]]]]]]+++]++++]]]]]]]]]]%>73#.546733\[9~}V͏OOoi3vz wIy[|zn5k/XR H(d#@q_COG@sy }k{DDjDk3{33* : " H44g4w44 22 --`pF77=GI$FF/GOI=G///@ H/$FFBP*7P6?32?329/9/+]3/]]9/39/9/]10]]]+]]]]]]]32>7654&'7#".'##".54>7326?3f)=(AbI2Y^2UzN$Z|[B_B&CWlDNzT,7Uw` # +D/g151R;!4cZUFt V}ROM~>%Ec=>cE$9i^OkJױ0W)7[A$?{&i@ & %+55+55h{&i@ %&d)' %+55+55C2&RT@ 4&47 %+5+5h&Tm@ %&%( %+5+5C&Tr@ H&HK/%+5+5?i&(Z@  &%+55+55Z5#@ y y-س H@I H)&   '' HO44444$0 R^$$$$0@P"FH@G H7.//R/^010110/222012_3$.)_  3/0_@lmX+?3/]?3?9/]q39929922/3/]/+<++ć3/++]q3/F6($6 +</+<+H++99//]q10+]]]]++]]]>32#"&'732>?>54&#"#!7!ZD"kz5%:]\j/%.7!*>. 'wy3zyj# 8]].K9x#4P7 RY  圜?&av@ & %+5+5e1@5$ fvjU+6*F*V**:J9 6 "\@]H,\-/-?--`-p----3"Z?O_/@H_O'_ O_ '_0,@,P,,,,,,?2/]?3/]9/]q/+]q23/]]q3/+9/10]]]]]]]]]]]".54>32.#"!!32>7ِG5cvS<_Usdw3ed^v\%0x\{|࿛l;;`|B7/WE)Fl$^s@1Ri7YIa9:@6Q",Q &,@ &%+55+55-&01@Rzj,z,Z#j#U"e"u"W'W H{Jj6V%5 H &HH@ H)Iiy* 15H "&H@`H H0''R'^&&&O&&O&& [/******2 @ H 0_O'_&_ _ lmX+?2?3?9/]qq/+3/]99//]]3//+<++ć++++10]]+++]+]]]]+]]]]]]]]]]!#"&'732>7!!2#!7! 4.#!3x8_XV_lC.  " 8:>HV41sEu{?Ĺvq+NnCljU%>k4aXhp;=Y9?_ @zZjUeu  R^   ?Oo@)H[/O/"R^@ H  _ O_lmX+??3?39/]qq33223/3/+3//+<++ć3/]qr9/+]3//+<++ć10]]]]]!!#3!3!2#%! 4.#! ~~s ssu{?ĹFq+NnCsT4aXhp;=Y9&!@   س H @ H`p$)H@THR^#!R^O !_p  _lmX+?2?229/]32?399/33//]/+<++ć3/3//+<++9/++]10++]]!#!7!!>32#>54&#"gD"^jr5½ijmy3mi]#圜 >#9OW ?&&  %+5+54&J@ &)%+5+5?h H @w H R KP R ^_oP`p R^@ H_  lmX+/2?32?33/3/+3//+<++3/]qqr3/F ( +</+<+H++9/]3/F ( +</+<+H++10++!3!3!PPhh$>@`Z U e u jz [/?/R^@ H_O__lmX+??9/]qq/+r3//+<++ć3/]3/]10]]]]!!!2#!7! 4.#!P!UDu{?Ĺvq+NnCH4aXhp;=Y9?%?aChh]@ HY i {-&Hس HH@! HRK 15H "&H@bH HpR^/`p RK@ H__lmX+/33/3?32?32/+3/F( +</+<+H++2/]3]/3/F( +</+<+H++9/]++++3/3/F( +</+<+H++10++++]]]]]+]%3#!#3>7!!voPPn3]YX.TKx,SQP*h83Aݲ3?i(+x@%5eu@"%H" 2 b r  @ "%H" 2  @A"%He u W*W6#F#R^$#R#^"!""!RL$!* @/ +)**+*R*^+++++""@-H""@ H-@9/@ H  !$)`/ *++"##lmX+?33/33/3?39/]3299333/33/399/+]83/]+83/+89/3//+<++9/89++ć++ć++10]]]]+q+]q+]q]"&'#.'3332>73###b"X G0’/CBN9xx&=99EV9Sl!e13/~Oo_c{Dk ,FbB1aag k<@6zyhxU#U:u:F2V2f250++3.[_o/?8[>%\&&&&\@#H@H@ H3`O )O%_%O%_%%@H%% _) _@P?2/]?3/+]q9/]q9/+++q3/]3/]]3/]]9/]910]]]]]]]]]".'732>54&+732>54.#"'6$32)uV:VzUXa3cG`h7"A_=T~`FPbvA5]L2_J.Q3[NF:aG'&ImGi}>gK-K6$B[6=2Y}KO}Z8 /LhBit=?@V f YiJ Z  0H  HEUгH@ H  R@   R@   O   p  R@:@ HEU%JZ *   lmX+?2/3?33/33]q]q/+2//+<++3/]qq3//+<++ć++]]10++q++q]]333#>767?  蝹 8d3b'.('Y&-+Z?4&J@ &% %+5+5?@3DR^ R L    @-H  @ H @? H  R^@ H  `/ lmX+?22/3?33/39/]9999/+3//+<++ć3/]++83/+89++ć++10]32>73###Px&=99EV9Sl!e13/| ,FbB1aag {@FjzFV99y%EUe%EU*jz( H  15H "&H@6H H R^ @ H __ lmX+??32?3/+3/3//+<++9/++++10]+]]]]]]]]]!#"&'732>7!# x8_XV_lC.  " 8:>HV4QljU%>k?0?+o2?n?I3q&\7@HHR@R^ H@ @ H@ H@ H _??39/+333/3/+3/+89/]89=/+33++ć++++10]#"&'732>?3 3@noxK?x+UL0+DCM4B})>XR(*#%9^EYz *5@u!!i:&J&51E1U1*t--X+h+"%Vf**i*  +5 R^   @[?$?$O$_$$$$$7/[/@H`55*+`  5 5  lmX+?3?399//3232/+]3/]]q9/]q3/F6( 6 +</+<+H++10]]]]]]]]]]]]]]]%".54>;7332+#?32>54.+";Wk}E\d$#$q~C[j,,Mbn:2Sm;7=1Rk:9?vmΒN>vmϒO6g_XQ'YR';?h H@i HRK R ^   ?O/o@$FH R^@ H  _lmX+/3?32?33/3/+3//+<++3/+]q3/F (  +</+<+H++3/3/F ( +</+<+H++10++%#!3!3SoPe@aH0 H*R^O! R^  @ H _  lmX+?33/3?39/9329/+3/F (  +</+<+H++3/q3//+<++10]]]]++#"&5467332>73##anu7jjy}4pk`# 8# RY ?] @h R^ R ^   Pp/?_ R^@ H _ lmX+?22?33/33/3/+3//+<++3/]]]q3/F (  +</+<+H++9/3/F ( +</+<+H++10]33!3!3??h(>H@ HRK R ^   d R^   ; K   @FH ; [ k /   R^@ H   _lmX+/3?2?3/3/33/+3//+<++3/]_]]]+]q3/F(   +</+<+H++9/q3/F(  +</+<+H++3/3/F( +</+<+H++10++%#!3!3!3oP-@wjzZ j WgU e u WgR^ [/O//?O_O__lmX+??9/]qq/]3/]qr9/]3//+<++ć10]]]]]]!7!!2#!7! 4.#!5s$u{?ĹVq+NnC4aXhp;=Y9>@jzWgZ j U e u  [R^?O_?O/oR^@ H_O_lmX+?33/3?3/29/]qq/+r3//+<++ć3/]qr3//+<++9/]10]]]]]]!3 !2#!3! 4.#!.Du{?Ĺvq+NnC-4aXhp;=Y9>@djzZ Ueu[/O/R^    @ H _O _ lmX+??39/]qq/+r3//+<++ć3/]qr10]]]]!2#!3! 4.#!9u{?Ĺkq+NnC-4aXhp;=Y9K+@UeuUJZJ<5 5 ""&!ZK';';'K'[''''-\\;K[@#H@H/"_O##### _0@P?O_@H_ ?3/+]q?3/]9/]q/]_]++]q3/3/]qr39/10]_]]]]]]]]]"'>32#".'732>7!7!>54. <(qvӒMjke*ƙmbc5cx"32>7>54.ԒK ֏G~s"z\ͷ{\6eUԀ1i0^Wڃ((sXJʀ+W'K}*Z&kk6v@mUe g Zjz R^[?O R ^   o O   @ H __  lmX+?22/3?9/322/+3/]qr3//+<++99//]++10]]]]#.54$)#! !"3![*-aO4)5Zqud2Tn;e9Z~UI}Ib;.-NDiF@Pzz<<u *#%!u!D?$?=+=$7 7777G0OHBH*@-H*BP 8R7 P%??9/3/+23/]]q3/]10]]]]]]]]]]]"32>7>54.'2#".5467>7>7>:qcP%D]7BpZA "?V dhal9%l;g^X,X_SkTD6OgOiHQsI"%Td,M"Hg@ɾ&P,w7:|8NW   -Ell8`H)'D*7@-%{4I4  @N H G&&.G..O....97*55RK@ H5*Q77#1P#PXYX+?32?99/99/+3/F8(8 +</+<+H++ć3/]]]9]9/10+]]]]]]#"&'>3232654&+72654&#".Lc5,Q>%Glpdt[}ZU_3=@>|ތ\\-WM>H@^B( $:Q4ZU)ji+ @^dlP^^bAL?r^),O7@#u,,u60F0V0++k+{+++' H @ HI!I    @( H  )H3339F)@ H)3 $ P$P ?3/?3/99/+3/]99//+]]10++]]]]]"'>3232>7#".54>7>54.C8V?,&ձdY)4f`RV,qr?_E/&۸y\#;ogey@1P$9(0v}+Jc7FeK:)2@/NK'<(8v}3Sg4MoS?//3/#C,)B@ t@@*(f! @f Hx..[-k-,{,,&i&:JZDT+ z 1#I/?@P`D>F@ H6Q?  *Q *P??9/q3/+3/]qr39/10]]]]]]]]+]]]".5467>32654.#"'>32'2>7654.#"fl9aW2`UE3Z{G%P*%c0 ba`{L( :bMFoS;=_?sbC"}t7'6"&#lc. {ё׉?FrH:;2`K-*Yb#CAhI'E'NH:)@""" vUe%'5'E'%5E!!!  RN R L  ( ) "!R!M  RL" ()  ( @( '(()(R(K))))))@H/?+@7@ H    "'Q/ ()) !!XYX+?3333/3?39/]3299333/3339/]+83/]+q89/]3//+<++9/89/89999++ć++9999++ć++10]]]]]]]]]]]]]"&'#.'3332>?3###a8 /e!/+-\\28U뺺 "! _ W ICKL]2&2]LCWN;@ 99*@G H1,G!I"7G""0@O=I@ H1P' !!!P' P?2/?3/]9/9/+3/]]q9///910+]]"&'732>54.#72>54&#"'>32 %:R7/VA&)NqHCc=dR$F<0 JgNQ\19Yj16U:;pz,%=+0M72G-*L=EF 8+Gb>&E_9EeD$,CT.L{W/VJ:XVJ&X@ (&n-9#%+5+5" : H H @ Htu U e RM  RN     p  /  RK@ H  Q/ XYX+?22/3?39/]993/399/+3//+<++ć3/]]89/89999++ć++10]]]]]+++32>?3###\!;GY>8U뺽K.\:&2]LCW #Y:@zZ;Kk@^ HRKP RK?O/ ? O  @H   QP XYX+?2??3299/]+]3/]3//+<++9/]q399++10+]]]]!!#"&'732>7!ҸDiWKOY8"= '047##!>7Uҭ    T E_:<@=G==9,:*gfYP5"?: @bRK/o?O  R K   @ H Q/  XYX+?22/3?339/]32/3/+3//+<++ć3/]qr3//+<++10]!3#!#YYҴ__:6:C2MR"@:@VWRK/?O RK@ HQXYX+?33/3?32/+3//+<++3/]qr3//+<++10]]]#!#@Ҵ:I:W1NSCNF"KMPWg:\EWn=ShP@#BjblA|AjGzGT\\D[K;[;CS7 H6ضHE6*@ H+)++++% 5 % WW!!$! H\/66\6E877E76R6K777777`7p77777777$GffOffffffjQG@ H76TJP8/ _>P,XYX+/22?392?3?3/+3/]]]q9/]]q3/Fi(77i +</+<+H++9910+]]]]]]]]]+]++]]]]]]]]".5467>323>733>32#"&'###72>7654.#""32>7654&sIpM( Qr\r Rn!DMY6HqL( Rr\r Rq!DNZ9gWC9P07ZH7T9gVC ua7YH7T2\Q-|?˂=h^ .3. /D-2\Q2w?˂=h^#4>YI/D-&]xbOAbC"%[tvX{|M&]x3X&%[twW{|<:[YhM:)X@ HdtEU<L\@ H5Euu#3C%5 $$  ))RL@RK   ?_O+RK&)&&)&&))&/&&@"H&@H& &P"Q )XYX+?22/3?3?2?999/++]3/F*()&&* +</+<+H++3/]q3/F*( * +</+<+H++2/]3/F*(* +</+<+H++10]]]]]]]]+]]]]+32>733##4>7##"&5467~ T_@q\Av iP "HWiC :{'QOX3]Q^3,9;/L5$Z&:!@rrl|г Hг Hг H@' H"2Bbr"2Br"2Br@V H&6FRK?O#RK!!!!@ H P!XYX+?22/3?39/399/+3/F"(!" +</+<+H++3/]3//+<++10]]+]]]++++]]]32>73##".54>7CMN#>?B'eҴYRR>dF&D: A<  *, @_?  PV:A@1d9t99dtM]mM(](m(2$v@ Ht@ H$t444@ H3$3 $$$ ,,A A1 1%?RK?A??A??AA??.RKC27R7K.1..1..11./..@H. ;P%7.? "*211AXYX+?22/32/3?3?392/+]3/FB(1..B +</+<+H++3/]]]3/FB(B +</+<+H++9/3/FB(A??B +</+<+H++310]]]]]]]+]]+]+]]]]]]]]]]32>73#4>7##"&'#"&5467332>7 | LV9gR<v  @L];yESe@ | LV9gR<v:00,KO3]Q\"KC0,9;/L5wq1U?#$Z&00,KO2\Q_Vh:C@M&]&m&0 HM ] m M]mB@ HdAtAAEAUAd2t22d"t""i9$99v<<$<47##"&'#"&5467332>7332>733# AN_;yESe@ | QV9gR<v| LV9hU=viP,9;/L5wq1U?#$Z&00,KO2\Q_00,KO3]Q\3B:!@ejzcs@R H ! RK    G_o@H@H@ H# @ H !Q  Q PXYX+?32?329//+3/]+++q9/3/F"( " +</+<+H++ć10+]]]]#"&'!7!3232654.+C~rpdYbs?2=@>>bEO[X*6 Endl)A-&:#@"eujz csU@\ HG RKo?O%#RK  @ H #QP  XYX+?2?33/3?329//+3/F$(  $ +</+<+H++ć3/]]q3//+<++9/10+]]]]]]]!3#"&'33232654.+4ҴC~rpdδYbs?2=@>>bE:O[X*%6 Endl)A-&:@eujz csU@K HG_o@H@H@ H!  RK   @ HQ PXYX+?32?39//+3/F (  +</+<+H++ć3/]+++q10+]]]]]]#"&'33232654.+C~rpdδYbs?2=@>>bEO[X*%6 Endl)A- M)@ty  H)+%&I'/'''F@ O   +I/?@ HQP `p &/&&&&@H&&#P?3/+]?3/]9//+q3/]]q399//]10]]]+]2#"&'732>7!7!>54&#"'>#Pn@4Tyh *=M,InQ4ruki#M+btLk>:S52_W/_e "M9@r0#v:5%  * -G  /  G0 O   ;RK@ H%PQ2PXYX+??3?39/32?/+3//+<++ć3/]]q9/]]310]]]]]]]#".547##33>324.#"32>7> e^Zh9_ҴY_bcg49R3/`VH ";R00^TF 4i;t5;qh#':6}t88lcMlE Lt7c*RtH!Mu3!##"3!C?.IdҴY`DlK(.D-6&EcCaL/P=!<-E'{&Hi@ 4&l86 %+55+55"W 9:V4V"0@z H77 22     26R6K   _ < 0 p   ? O   ;"(RK@; H@ H"Q6 P 2(.. ...PXYX+??3?9/]9999/]q32/+33/+//+<++3/]qqr^]3/F:(  : +</+<+H++9/10^]^]]]]+]]"&'73267>54&#"##7373!!3>32G"E 2;; T_@q\An- "HWiC  'BcW T\'QOX3]Q!B7(/L5$Z&>jN-! @EVu  @/?O@ H RK@ H p   @ +.H `  @H S QXYX+?3??/+qq+qrr/+3//+<++3/+/]]10]]!#?3е:I:wCN2@5E *++H I@; H  4*0F@ H-Q**%P  /  @H P HH ?3/++]?3/+]9//+23/]3/+]9/10]]%2>7#".5467>32.#"!!7VD5PmWfa. CUail4W]42H0AjS>sfz">T25KvR,>oZ(^-ouL+.TuG-J5%S`5KV!&Oڹ 88H 77H 66H 55H 44H 33H 22H 11H 00H //H &&H @)!!H @H @H @H @H @H @ H @ H//H@$&&H@""H@ H@H@H@H%+5+++++++55++++++++++++++++++++{&iZ &&H @8!!H @H @H @H @H @H @H @ H @ H&%+55+55++++++++++WM:&5@zk{ H @ HbrU%%@ H R K  !5' 'R'K   @G/@H/@H/@ H///7/?O@H5Q!! Q P',PXYX+?32??329//]+]3/]+++9/]q3/F6( 6 +</+<+H++ć9/]q99++10+]]]+]+]]]#"&'!#"&'732>7!3232654.+C~rpdPDiWKOY8"= '04>bEO[X*؊O  P.6 Endl)A-"':'@j z c s   U@j H'RKG!@H!@H!@ H!!!)RK@ H'QP XYX+?22/3?329/3322?3/+3//+<++ć3/]+++9/3/F((( +</+<+H++10+]]]]]32#"&'!#3!32654.+Ybs?C~rpd[J_ҴYY=@>>bE:6 EnN[X*:6Kdl)A-" +@VV%   @I H  ## R K   / O  -"%!!R ! K   @7 H @ H%Q" P    XYX+?33/3?9/]99/]q32/+33/+//+<++3/]q3//+<++9/10]+]]]]]>32#>54&#"##7373!!w"HWiC wv T_@q\An- Y/L5$Z&]'QOX3]Q!B7(" &tG@ & %+5+5Wg&\@  &%1%+5+5VtJ:+|@%L!\!l!/?O++( && H @ H0 $$Td @ H$4D RL(RKD_o-RK(+((+((++((/((@#H(@H(( P$+XYX+?2/3?33/3?3?9/++]r3/F,(+((, +</+<+H++3/]qqr^]3/F,(, +</+<+H++9/3/F,(, +</+<+H++10^]]+^]]^]]++]]]]]]#32>73#4>7##"&5467 GW&~ T_@q\Av  "HWiC DH~{'QOX3]Q^"KC0,9;/L5$Z&?@S H HJRK R^@ H__lmX+/]3?3?32/+3/F( +</+<+H++3/]3/F( +</+<+H++10]+]+3%#Pn"x@V HRL@+ H RK@ HQXYX+?2?32?3/+3//+<++3/+]3/F( +</+<+H++10+]3#!3!ִMg}:.&:1&250%+5+5f5&ZC)&ִ*-(%+5+5.&:@ 1&140%+5+5f5&Zt&@ )&t),(%+5+5.&:o@ 1&530%+55+55f5{&Zi@ )&)-+(%+55+55&<" & %+5+5Wg&\C@  &,!$%+5+5i|p/Ͱ/ְͰ017!iРi|p/Ͱ/ְͰ017!iРL9@*/?O@H?O/?o@&+H/+]q/+]/107! rÉ L9@*/?O@H?O/?o@&+H/+]q/+]/107! É L+@?O/?o@&+H/+]q//107! É`R'BB  @'7F@"(Hi&6F  f 9@ H tdVF6&vfVF6&tfVF6&VtfVF6&@tbRD4$tdTD4&tdVD4$itdTD6&p`TD4$@.t`P@0 9rrr^]]]]_]]]]]]]]]]]]qqqqqqqqqqq_qqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqqqqqr?2/+^]]]9^]qq+r10]7>733 #+y:K Y&4VKB AA K@tVf@!H4&t@ H ) V  %*H @"HI   @ H   vfF6&vfVF6&tfVF4$dRD4$rbRB2"r@`P@0 rbRB2$tdVD2"itbRB4$p`TD4 dP@0 @9rrrrr^]]]]_]]]]]]]]]]qqqqqqqqqqq_qqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqr?2/+^]]++]9^]+]]qq+qqrrr10]#>7#73 "*{9K X&4WKB A? A@+      @ H     /3/]+_]]]910]%#>7#73 "*{9K X&45VKB A?$@ / ?2/]39/910##.546?&X{)3Y.'U+ G* h@F  { ; {   @ H  @ H  ?322/+]q9/+_]qr910]]7>733!7>733 "*z9K X& #+y:K Y&4VKB AAÒ4VKB AA @+;+;7WGW5&GwH@Hw(HX   I    g w   ( H    yiH9) wg8)@vfWF6'wgUE6&tdSD5#t`P@2$rbRB4&vdT@B2$ip`RB2$rdTD6&dR@0 9rrr^]]_]]]_]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]_]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqq?32222/^]]]qqqqr9/]]+qq9^]]]qqqqrr10_]]#>7#73#>7#73 "+y9K X& "*{9K X&4WKB AAÑ4WKB AA& q@(++wF'77G@. %H%gw(@H(  @H    (    vgWGW6&ueUF5&wgUE4$tdTE5#@ucTD4%pbRB4$tdTB2"ip`RB2$pbRD6&ydP@B2"9rr_r^]]_]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqq_qqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]qqqqqqqqqqr/322/^]]]+9/]+9^]]]]]]qq+qqrrrr10_]]%#>7#73#>7#73 "+y9K X& "*{9K X&25VKB AAÑ5VKB AAvX @g )){{i{g" p /  o/_  /?22/]q3/]]9/3210]]]q]]]]]q]]]#73%s Z-eg rxDsZ@[  p/o/_   ?22/22/]q3/3/]]qr9/3/9/]r1073%% %%#7G b9Yo Z%m :Z dYxxGa@9 6fvvI&6fv @ H  @ H   @HfVF&y&yiYY))iVF})n;+ {m]K=-_@0>rrr^]]]]]]]]_qqqqqqqqqqqrrrrrrrrr^]]]]]]qqqqqrrrr^]]]]]]qqqqrrrrr^]]]]]]qqqq/+^]q+/^]+^]]]]qqqrrr10_]]]]#".54>32,Mf:9cK++Kc9:fM,:fL--Lf:9dJ++Jd H@2 ?_o/_ /2222/]q/9/10!73!73!73++++++3-G[u@gHueet@Hzrr9Hu77F@HzDD Hu @Hzyl H_@ H> H1@ H H@ HIY3@ O@@@@@@ H@@}n@zayɇ@&)H6@HyfI;& ُďiV9$ɏi[F)+@ 9 !6Ffv R;vH\.i;$  ۏ͏iV9+ ُˏi[)֏tfI6֏dV4& ُƏym[K;$ ˏk[D+@ˏt[@4ԏ[O0$iۏď{dK;$ ۏďkT; ˏk_+9Џrrr_r^]]]]]]]]]]]qqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrr^]]]]]_]]]]]]]qqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqqqr??3222??/^]3/^]8^]]]]]]]]]]qqqqqqqqqqqrrrrrrrr3/+q+q9/+]q9/]]810++++++_]]]+]+]+]+]+]+]2#".5467>"32>7654&2#".5467>"32>7654&%2#".5467>"32>7654&#32XB' Vfi)3YB&Vei'!?8.;6<7/82XB' Vfi)3YB&Vei'!?8.;6<7/8c2XB' Vfi)3YB&Vei'!?8.;6<7/8Х;_EL&fI>bDJ%kFl2ZIN7IE3ZGP;H@;_EL&fI>bDJ%kFl2ZIN7IE3ZGP;H@l;_EL&fI>bDJ%kFl2ZIN7IE3ZGP;H@z5@# H6F )2B@/?/]]]10]]+3@Ğzz&UV]@Egwhx [@#H@H//o/]/]_]++]q2/]10]]%73 _  i m?s(R\@"fviy`P$+H@H//o/]/]++]q2/]10]]7#7 73 'ot?M&T///10!5!^3@{p/_o??/8/]]]810]]!#3l~\%J @VH_="M"]"9I#)#)$%R% @#H9Y'6'''V'f''%(H'@; #H'' ''I'' R      $ %@ HIYy+;  ''''''''v'f'V'D'2'$'''''''''''t'd'P'D'4''''''''''t'`'P'D'4' ''''''''''t'd'T'4'$''''''''''t'T'D'$''''@ƴ'''t'`'T'D'$'''''''t'd'D'4''''''4'''j'''''t'd'4'$'''''''''''t'd'T'D'4''''''t'`'P'D'4' '''9''rr^]]_]]]]]]]]]]qqqqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]qqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]_]]qqqqqqqqqqqqqqqq/^]]]]3/+299/99/]q3/]++ć^]]]++qr3/]]]+]qr3/++10]]]_]]+>54&#"#>533>32I/4HiGdw+4@*Q]Kv0/1d^.("# . Y\0@Q     R ^    @ H  ` _/?/ _ lmX+?3?9/]q9/32/+33//+<++ć/3/99//10!!!!##73!\Q)n66{$Ձ:c@6zzZ j %$%"2B"(B(R(b((   @ H(,,& '*+./&/ &/R/q    o:0:@: 0  : :o<@ H /4. u+*u'&_o@H_o 4#s4t:::X+?3/]2?3/99//]]qr+]qr99223299/+3/]99//]]3/F;( ; +</+<+H++939310+]]]]]]]]]]]#!7>?#737#737>32.#"!!!!!2>73NeyCFbvEmgFy^@$6D(rhh +=M-,O@06UwI!.y\f7:V820$s}8gWD+E2N )_n@ |Zj<@ H%5Eu%(u((] H@@ H( H %[# )$#)Rr#'##'##IoH`n>oQ4o[KH[HkHHHH@H?HH/H/[?[o[[[[[@H####@!H#0#_0#H[QQ[H#h-o.@H..pfggRgqhihiihiih@ HhfPQV94C1u*O._.o...*#$u'* '())`)'P'`''))'LPighLuCC@IPI`IIIICX+?3/]32?3?9///]]]]333299/3/]9/+3//+<++ć3/+9/////]]]+]+]]_]+]Fo('##o +</+<+H++93310+++_]]+]]4.+3263#3267#"&5467#73732.#"#".'732>54.'.54>%+#32g-RsF8l^LH*!"$Q^Ohodn鍞 QKJX.K62VA%5dZKqS6XX-K63P8+R@'5^3OԄjtFA\<Ԝ+v1R~bV8u`*:'/" $7M5CdB!0L54;8 +!$ "3I3B]<nyA6d;@zz{::Ueu6%6.%.5.% !%9o$8o9 90999=..%%n0'$@ H$$u''-u00_'o''_'o''''0/0?000/000'0'0399s3s`?3/]?3/99//]q]q3232/+222233]3/]9/]9310]]]]]]]]]]&!!!!3267#".'#73>7>7#73$72.94lg]$AR Al @`Bj*PnW]qA@p AqN'Wc> sKy'J#Vb5ia0BmO+@Ä#J' +OqE#[c,0J^@--// Hz<<<IH@HEUe HA H4 H0.@0.0.6RC6'\7\G\\\\@>!H\\\\`````{`L`\`l`-`=``````````@@ HH`9```H``g``(` ``(@)6H@&H@HK1U>/- ! `````x`i`X`````h`X`H`9`(```ʸ```y`j`Z`I`9`)````g`H````````y`j`Z`J`;`)`` ``````@``z`i`Y`I`8`)``````````y`j`X`I`:`)`` ``````y`i`Z`I`8`)`` `i```````````~`n`^`8`(``````@vW]H``````~`o`_`8`(`/`?`O`` `````````~`k`Y`J`;`+`` `9``````_r_rrrrr^]]]]]]]]]]]]]]]]qqqqqqqqqqqqqq+qqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqrrrrrrrrrr^]]]]]]]]]]]qqqqqqqq?3/^]3/???/+++]3/^]]]]]+qqq+qqqqqqrrrrrrrr3/]+qr99//8810+++_]++]+]]267#".5467>32.#"#32#".5467>"32>7654&Ij:ToFLlF!VmDDfE$#6%4R?.$805^G) Zjq/7_F( Xjq0%F>4B<#C>4?|PY6^F(2XyG"G&}b'*F^5 !9*#MwTUC-K6 IvU%]0~["$MxT%[.WlCxbjHb\Dx_oK`V*:@)1\l?1O1@\ H (((0 H!!%&"1"1 0 %0 R r&&@6666&&!! &"01%+!!++??9/9/9999/3/3/3/]]2/͇++10+]+]]]]]232673#"&546?7>7>">54.2P]DtV-0:V&E9EU6`mHH&G"r.HeE, aGtR.dlrϰ-A=6hmLuN(lnC!IKJpK&L#37=R=@>?>??>??>>/>>@13333@333K+?HG@G7?`=6IA>lmX+?3/?3/399//3/]]/]3//+<++99//]3/3/+3//+<++ć++10++]+]+]]+]+]]+]+]!7!".5467>32"32>7>54& #367>737{LrK%HhOMqK%Hh*J?2 *;$+K@3 WJ ++OnCC ^V(+OnCC ^V(6`M*D1E+8dO*F^M3.0)]'QA+0)e3z)1@ H @HYiy'H' HH@ H@,101@11+.?.O..+@,/,,)'/_o3o3*./'/  , ,P,, ,/33_3O33333O3333O33;33rr^]]]]qqqqrrrrrr?^]2/333/332r3/]33/]]]]]]9/]2210++++]+]+5#.'&'#367>53##5!l  (z $,6 3)"hoon9O@y7ucscsc%s%%c$s$$3Y3i32 HYi H:&1 $H1]1m1}1;1K1 $H ] m } ; K  +[k  + [ k 0\( \/O( (0(((((@c H((#)3)))))))"[/555JZrfT[@%H@H@ H;'@ H' 0'*_)_??32/+33/+++]3]]]q/]3]qq99//+]q]]10]]]]]+]]]+]+]]+]]]]]]]]267>;!5>54.#"!532.54>Z;mc*'!G`Y*=tlmt=*Y`G!'*cm;ZVj63~Ut|AA|tU~36jVX|H"/r@KZ@##[##T#d#t##+#;##1/;K@H///) ?2]]?9//]_]+]]2]]]qq210_]".54>32!32>7.#"kƆE,Lfv?qQ@NX.Kt]M"H$Sn;L]53WJ<"]ob}]<Oу-# N&s 'n R?555cN&'n >?555|:&>'Z >?555d^D@  //29910#.'5>73!;H:RR:H;)"bADp*$*pDAb"V@ @ /299/105>73.'#"bADp*$*pDAb"V;H:RR:H;#d^D@  //29910.'3#>7!5;H:RR:H;#"bADp*$*pDAb"V@ @ /299/10%>7#.'53+"bADp*$*pDAb"V;H:RR:H;d^D$@@ //29929910#.'5>73!.'3#>7;H:RR:H;;H:RR:H;)"bADp*$*pDAb""bADp*$*pDAb"&@@@ /299299/105>73.'>7#.'5"bADp*$*pDAb""bADp*$*pDAb";H:RR:H;;H:RR:H;H#(@#  /299299/3210!!5>73.'>7#.'5 "bADp*$*pDAb""bADp*$*pDAb"hPX;H:RR:H;;H:RR:H;8/E@y  HZ2j2DH@ H+C{CC@ H DDD@ H  * '@*''0F@OG323>54&#"7>32.#"32>  `a]N#/IfS*M@2;:6$*tCq^)$3@$5VC1 *A,BlS8.gkj0ΐM?kK32>32%"32>54..#"326o,RrGaFLTZ.EsS.,RtG^C JT^3ErQ-Fw83wM,F33G]3wN+F10G/FxNNj>?fH'7dXQh<>fI(7e~(F^66\E'(F^63]E)~` //103!!^j8^_@hxhx  yiI9+ iI)iI)  iV-k[K;/oK;/k[O;/o[@O;/ o[O;+ {o[O;+k[K ikTD4tdT4 {kK;/ 9r_rrrr^]]]]]]]]]]qqqqqqqrrrrrrrr^]]]]]]]]qqqqqqqqqrrrrrrrrr^]]]]]]]]]qqqqqqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]]qq_qqqqqqqqqqr^]]]]]]]]]qqqqqqqqrrrrrrrr/2//10]]4>32#4.#"Dzbc{Fg5_NN^4tLLtbl98ld9#8@#!!%! *F O   PP/?/]]3/2/10]]"&'532>54>32.#"$$K>#3B'2Z}K"K=$3B'2Y|9 %@T0^V( (AT,-^V)LP@!C@"H$X$$$HXA HB0 H=0 H*г H0@ H H 0 H0 H Hг HгH@ H?4Tt@3H[$- @ H $EDEdEEEE$EDEdEEE$EE;@-#@)(1$1411@ '323267"&'.#"5>323267T"  H  ///10+#47632#"'.'&#"TR?K3% !$ V{{?0(4 ''#i  H ///10+3#".54>3232765"Z(g>2%!%}86'"%)j%?33105! %iH??103#ؑHK"??310!!#(in"??3105!# (%%H"??3103!!Hn%H"??3105!3 %H' ???23103!!#iHnnH'???33105!3# %K( ?2?33105!!# i%n%H( ?3?33105!3! %nH 3  @  ?32??3223105!3!!# i%nnqj% ??3233105!5! AّH*A ?2?3103#3#ّhHK Kj 1  ???23310!!!!#(iijב" 3     ?3?2310!###בnn#j ? A    ??3?3310!!#!!#htjo"j 1    ???333105!5!5!# i(qב) 4A    ?2?33105!### ܑב%nj ? A    ??3?3310#!5#!5!ґttj)F)ޑqH 1   ???233103!!!!iH"ב%H 4 A    ?3?33103!!33A$Hn#nqH ?  A    ?2??33103!!3!!ّK$hH"qH 2    ???332105!5!5!3 iqב)%H 4A    ?3?3310!5!333$ב%nqH ?A      ??3?3310!5!3!3!5!$KqFH 6    ????2233103!!!!#iiH"ב"H 8     ??3?323103!!#3#AHnn KH I A     ?3?3??223310#3!!#3!!jt " "H 8  @   ????3322105!5!5!3# iqבKH ;A   @ ??3?332105!3#3# 㑑h%K#KH I  A     ?3??3?2233103#3!5!#!5!A㑑tHK )ޑj 9     ?2??3333105!!#5! iiq"h :   @  ?22?333105!!### ב%nnj J    ?3?32?333310#!5!3!!#!5jtttAޑ"בqH :@     ?3??3333105!3!5! Aّ"%H :  @  ?33?333105!333! ב%nnqH L@  A      ?3?32?3333103!!3!5!5!AH"oHL  @    ?32?32??33222233105!5!5!3!!!!# iiiqב"ב"HM  @     ?3?3322?3322223103!!###!5!33AבHnnnnH ]     ?3?32?3?3222332233103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??/310!!* H??/310!!* *g #'+/37;?CGKOSW[_cgkosw{1mUE- y@ xlTD, xeM5@ dL4qYA)}@ |pX@(|aQ9 @ `P8u]=%@!t\<$x||xiI1!@hH0 gckhd`h_[WT\XTSOKHPLHC?GD@.)'.@D%T%K![!K[DT #//10]]]]4>32#".732>54.#"Fz^^{GG{^^zFV9bLLc::cLLb9d^{GG{^^zFFz^Lc99cLLc::c# /]/102#"'&5467>76jnk5RS4l9R46n9:m64R9) //103!32>54.#")Ex[[xEEx[[xE}A[xEEx[[xEEx)+"@" '//103!4>32#".'32>54.#")Q:cKKc::cKKc:MEx[[xEEx[[xE}AKc::cKKc::cK[xEEx[[xEExscu" //10#"'.5476324'&#"3276c%%%V3eK#%HJfgGJL33FF3331HH13}5V%#%H%V5fHJJGgF3333FE6116y!-9D@] $ t $t+{+{D"(?4.(.(.1%+7+>:h:Y:G:::b^0H[[׀ؙٙW .. -- .. --#_[)4`@7*/$'!04h4Y4K4=442-_oO-_--- /99//]^]3]]]]332/99//3310#"'&54676324&#"326%4&#"326327'#"'ZZZZ. -- ., // ,0^b>LLH[[ -- .. -- ..[_#Fs;3F/@ H4.4$w##@M H H;;  H;/4#4;B p ?   9+>0/43?3O33/^]]]]]/]]]]10]]]]+]]++]]]+373#'#5.''7.'#5367'7>7"327654'.B 965--,,(17:"B?n0+(. P(9p6Eu0bb0uE`cc1u;  -;q9>_1(,=20db2/aac02P&/b@>++++""""P'''@%(H /+^]2qr/]32/qr]qr9/3210.'&547>32!!#!5!"327654&'&7Z#GS,e>SW;=>B.*PlzS++VSzmQR FF;G,+G>>=T,G;QAQF@(1A;NN?  33FF;A1?J777B??/^]]]99/r]]r9910.'.'.547>323267632#"'.'#"'&547632"327654'&6%( ? .@$    TVWvvWTTUzGSZ>==@XY<>><      "O-@" '*R*Qm}VXTTuuWV+ >=X[===>ZW>>;/(@& 0 ` p  "@ H"O_/]//+3/]/10#"'!727>'#"'&547>7>76 (_E#%?BXc$&}V+B,-SZB?N9En&86_,+i?~BCF_?BWVc %%1E[wK`_B?[J;*U/;q9S<K/@9M?4=C /)//99//]923/]10)7>7>7654&5#"&'&547632.'.547>3267>32#"&'.'FTl)@4:Z+X-;a)OII]P3N(a2+C.=#!K2dmy;*&StsOP"4&sN&(PNmVb(%)LtvSP<3=-Q}.-L'fZy'&@) @ P p  ///]10^]].'.'.'.547632>32b*gL8E+%DFfbN/"X2U#F)N7>-qEEt/'xSEj( #&b<^Q2P;`N]]5(o]H: 9Pwc;kM;!0@! @O_o! //]9/9/]2103#>54&'&'#"&547632L3:0./9@%%Hl9:Q0*%#Jj9:;b&J5-L9<guE.&IL9E.&IO9TDE@+ H 0 @ P  ?O P`p/]/]/]/9/810+#"&'732654&#*73~j$JoJ#10$ZL7@1>VMG.M8`:.!`X9f ,5Eд H  @  /2/910+]#>7#73RC1u6D X Wu/0`.'3 @jVfxFVf@u H%U   @HR  _o  @*2H @!$H  /?@H ?3?339/+]32/]]qq3/++]/]q3+++]10]]+]]]]#7!733!>?##kl}   8岲o-q %'# !&&"N'&v  H H H @I H%&@ H&& /?O(/?&&"@P`??3/]9/]q32//]3/]39/+310+++]+]!!>32#".'732654&#"#rCV<8[A$(OvO@aG- '9'QSM>2M|q'"?Z8HuR,":M+1&b]QJ#4R@6{   Y i    @H @ H ?3?2/++]3/]9/10]]]#>7!7!RxUVwN*aaffXqK(%7E@X H# H H H ; A3!A!A!A?+O++++++G;p/?O 8&&>.??9/93/]]]3/]]99//9]910++++2#".54>75.54>2>54&#""32654.;`E%2G,7HqXB,;L14VD2gBd =[;=*D04G($2dO1 -5Eд H  @  ?2/910+]#>7#73C1u6D X Wu/0`.+ +@( H0 H   /2/910++>733#1C1u6D X %Wu/0`.X0@r@0@_@ H/+]]q/10]%73}ϭ 0@p@0@_@ H/+]]q/]107%3 \ @ f v x@_H `p/ 0 `  @ p   P @ H@$H@ 0@_@ H/+]]q3+/+]]]qqr3/]]9=/3310+]]#'##7%3\_q @Q@Pp o  @ P     _  0 O_@$H0@_@ H/+]]q+2/]^]]]qqqrr3/]9=/]3310]]]#'73373x̻]tG?@'00@_@ H/+]]q32/]q32/321073!73w####B@)% *! @ /23/3/]10]]]".#"#>3232>73*LE?) d&9S;,LD>) f%9S(1("/-_N2(1("/,_N3q| j @DH +K[k@Hp@ 0@_@ H/+]]q32/]]_]/+]+10_]?33?3q4@   0@_@ H/+]]q2/3/10".'33273JnJ%tgS@uA[v)EZ1;6r1[E)$Y $<V\_birxh$$7h$9$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni00A0uni00ADuni037Euni00B2uni00B3uni00B5uni2219uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni02C9tonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveuni2010uni2011 afii00208 underscoredbl quotereversedminutesecond exclamdbluni203Euni2215uni207FlirapesetaEuro afii61248 afii61289 afii61352uni2126 estimated oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxH22073H18543H18551 filledrecttriaguptriagrttriagdntriaglfcircleH18533 invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluniFB01uniFB02uniF005middot commaaccent foursuperior fivesuperior sevensuperior eightsuperior cyrillicbrevecaroncommaaccentcommaaccentrotategrave.ucacute.uc circumflex.uccaron.uc dieresis.uctilde.uchungarumlaut.ucbreve.uc LNDFLTcyrl$grek.latn8 TbDFLTcyrl&grek2latn>kernk 2Dbt ^dvv6Xr@*l "(np 4 B   $ . h : ` f  4 Z p  ,>HZ`n $<V\_birxh 7h9:;5FҸÞf~=!`:)M0ԜSIZ9 2׶m31[AYxĥ4,2~nr3" fiAXA lRs&ՙrܣki !dd. J)$H#H'lČ3B9/L% ]ҌZSN'DcIBDY`5]ADkZi,,UC~]LNv9VEFc-ϔ\@Ej)UDFO(:;19hMK:̬/P*1nj.ٓ'p8ѐSjEy( 侣jgHs¸ 9 (Q3t`}yMc{ppD* B`uGcq@ T] xqvsQ"1Wh$e C-*ù,,i:aDo.!2Gm޶ ]DкЖ{*m15!mÔNwhA*9ydϮG8kd6 s8`mG%&f/^0g$ Pt ͋_ d|[))R(B-0aDgӈ:} ,? ߲=[ѯ:aBKICO $Y!)9?cKr Zin~j/)!7=~xf׬^~:sn6?oxxw%R.{8 w;VMK0M3͆aqMp<(!+#u$ 4]ly{w fn%É2GLҴ+i*(*4R )Fer@ωOnhl7kq-ovP\8|nwO:E>tz$gKj5Mן0V? V۞݁ikBl5OGn7gWdQxys2>7ǵ='?G^~=0`ď"<2 gQ?gFG~_s)ÉO^\aixblHsb ?_rs~)w\]nv#V^w8kbsA|{^]Ьzvod/g'7ͯz5eg k_%6nB`:GDΙ;oox;0c`uyW?tB@TgZ2ҭPBbAE)Ev<| b>w~I"OHݼDRSDF%FlR~F:Kr<"mCHӄRB!AX,PoVP )RELEˊ(B )*H%FjL)VNtW/D&\ֈvj,BRK"@H$8#uCnBPBSGX)QPCЮRRZ6${p*u(@ӷ$ 0SݞcLC"@ԊlXjP Y4"B4=uՖRns0<H1Pb"B>fP5qdi5[U+B)-RIpdA5(Z*Y;YuZ(rFY3!9 ]֡ j~FhR9yƸe,"78(P!5RwLӶhcI9t=1+@=f5)R(9S4c9 c[CJidOHQ1Ì3`>|{d!%)ZƒrAY֎"%Z)j)QPǮ{tf@7 $? Ti}vZ 4 59̘%R* m4 v 9T"~ҚR@:MYţ@Q(BȔ-jQGRXp0B b'dU~/sڳ =|-C#zRm k4Ñ< NIȐX+a`۱6tIVG>3B@wT2$ȾG( J0w[!$rsZD,ï!:Zc*-BF GjU`&J4hcѭCdqF:HТRb$LgtusrA<}y,%f|Ç=׷신:%o~ݠR"W7ӯՋ7gaS1T!Ø[]p8_pZpG~t{z0x:g_>%3/_GܫKg|]B@DŽÑOK+jUd^] () 4jj`;(ww (Y$RB 2E#ն8#.MR FhӌuJTmPI0>}<8.J*%J^3{i7gPhE5(u~R3)iW4(eϞfuI'mhzA~Z@JB+IL@ɠbAl\G-0jZCxP V%fF %4H30K6Lc,Xrh)w xDKIH䪥qF`bB4'rE3Ip :C)iִ Z9468τF!^ !hb~|= @% 4dS(1!]WPѣtOȋۺF+jQaďK\Ѝc>hiL\eέ1Fw^bf?H5xJ,2J)(m~!"WJIc\OQ Rf0tnGk vM-JIt[^sIAqQ>RiޢIT Jk))b mϖ"}]v- {S(=B5Zi`H3@*>؆߿at>ryuV !>Xg[[u\^R8ybz:P4O H4 ɳڬh>!i,SFVH.^r%aORas:/KしG|׿euA\ m7o"L3uL48/~o93ƇP4L{6kSܣbCag _0Ļ\\\O~O_ݲç`?l9frܝֆ77GG[Ӂ0ό W/ko_ >'Wy8=>GyPNsxxu-qGLl^pz>|ć$ ~NB@5-9lCu$Q~[Ḋ#oQ"F̞8Th@8΂緔"B]G2#uKL mהM]mɶKFKGR<Z|M`45gL⚎y# ; Z/"5<:J t].JnHq~ܑS."NOB$=c?ӒOObeJ-yD= -DEfH̺%4HKG5 2Gg6T! {h;6{,FJNd.#RfzM>!g|K D?,LJe})fDݯ9cEyHcF/+P#+$1*"(HLb\K#%F4rEI"X# 5gH#BvZIiFHPmхR+ OZP!(gTa$dYZd٢DJAi5PJCbP P 'ja\b;G9izJr)\5SH(R"@MorD+ ) .Eh0HfCe֪ߢWk챫0"򄵚 r%FT5 pR'3(q֊тf(`<()"\txd<=_LqkMkY!RmI1'L%" {j{( 1F ڬHÁ7*T2k?<#2yu9&64 %VTQJҲER Tƀ-O(!SSD nUPsX \_?-eJY뙧MkpRH/}T= G14]4w4-Oj{l2u,ضք֒x@[D.g,~8Z]W<ӸDp@s_HӁP %dj{8 RHJSvXEPT%e3N/.Yk 9%1yo1JpPR0 JzӇG^gTvü; d85kNim٬~9w4pdL gg~nf/_;L®4? {w߾Y)ѷ-/>};- kqmǛ_iv;c}u΋W &)t8 -Y<>Ȁ<\Sb=9@ \m Aj>$[tO ~wO'T|-߽ciBB|p/50:Owox ^|݇;L)l/|?0$jЬٿŅq֟q +߽{GP2l*.z8P&zK*ޓBD9g]S`tvEGA0M}oOhe ?nIӸ II*4Мo% h#ILau7!@+M7iԒYa S#jBy:FBV[6)NGL'k;Lۡ" "O2X6H 9ΤѶ'a<*M%,v ])d D)jzI4[33{2RT:0 !qĀ[@%1`v@0fB !JEܙhouFBnz%$LǙgiV]Z[R ,b RĜZ"p^e;zEs1Z#$II '6(1n6d'qJSBhG ,XU8pDzIH,Ъx0RPЀh2S&L(3amKUQHH!=ʵrHF2(pUP%.@I?>I0HaaGO|rz=lɐ#hb G"IЮL)5#檼U%:gTD4BQ89T~G*Ӯ)9R'9xnz EDHtAjY b+aH@Re ֶ(] ZiRN,XDGJYm%!KU8R K3<{β;V'P q9>|0Α춴sS\{DnG/"\A~wHٚvG8-Wr-^I vo!4q{2MHx5,;%rO1Yg 8?(?˳^x Fl[G?M4oP:RA0Dm6q:b I!-ii.a@ۖ2yNTkp9eܓC9M3V79ܾcu~ΈnoiΟ0g ȸ}B )V뎶F$28崭ŏ]D*c4b (SPKfaItAZAiJwD38 B%z]0R%0Z$X2Nk!94{r 5(ۡba~D v%#T0]K*["R"B:tOV#aͼhEܰ:r!e=&fp=Y"uQPZW$k(Uń5󲠕ZrG J 29N=%KXfOD%j`ȋIttcTţǰ,-5D"$"W$Kp{.8[m0aqE \s&R#`3Fj:",%(T'(VC\H!C$wGƌ6 !R,m%T[#rDq `5Jʚ hpCw~KsvW$3"(Zbu1,oh/(#XDk`(`W+rH͆4AN mFa Jc9fl%qI=s}fgRa70nh6Oo@RRMK %62!̄y¬:ZIrI,HFe͠P$G+_!.w(|z ΡmǼ躞%Se.m,0wHQ9D7O:tEX=JBHQZsTYTL/;^W\~xTk21He(( gl!H%@_џΡf9뢪9C 8lЭb8{B@@LJBk IBQtֲ R1޽#- fB:MxEuKo:c{wJ/ f:MK>PP8e.RfޟXmV\qdiXu\Lw|7L9aw͟1Y/}pMC4W_~|IF>!w5uk֗>5IHw/ Dž ۇv'JI gh$gMϏߑO uzp|<pms \\\:~ ??K4Xz P躞i=g4#qsePH)R3krtg{wY|i%Ǒ?KxD9ڮ^Jw <3_r=_|)qys}C;._`0/lz?;t 0ϴOx?iׯ^͏L2oٜo8{ c oIKKRvqR{?%BkZ~Gyݤd! A0)%STCN@ !4b.dgQQCZPEd?3loX=o.@xx$Se%#I!RhMQ=QH1%P,Zu Q lqvlAT 2RIBUy$ -B<Pʱ@Bs&i2RThт< "5 9N-(8Q#)xH5-).5h;/1sqvضAd41Y&! 9b%#9ryL3ګ!cD Ai$RiDɥ3J|`<tu+l a!42'Zbu~iZ<$ H1'L(8()@02oRԇ])L%SGo毐T iAjZLӄxoQe9SWYրqΑ=;H52/Lw4k'8.4aBĈ:BM'\?ÈkOh4={MPr: "8M7c ӑsgk޽yKo.=eYZkI#$O?Ÿ'BXpMp~ƴ/MLbWؾwk6ORmFS~PY[zl,߱Csu489ma_]}aV_~AQ/?}kh+>yw/7?{f})ۏ,hu48qy9ՋOJ||W݁_WG?q7\sB loDqϹw?"mIzwW|&cl:w|>k>)=wMO3j`j8v5)D[X6=%L0C/=/>{A,Yڳ,7?aYsy~t~tw 5y:"P4 PS]-1A" ٴ$?⺞20m13>"CA8=WyE@ }!KVPl ۞L$Yl@ j0l){\w6!buD|v83.cCpV/˂ԉEKv+ 3i)1gtW=[#bo)"aM[ֱ0M[>B4%bt۔"!'1EKP/C Q ť{MFہ"d|J sJq5DBzD\~ kZL EgpcX23%lɣ[G ܀ Ed$ ېbT(ۑ(kxxnh4'Č$㍁J;e~JҜ_Nۀ,B;i-t-^HZ mOqHʀRrFY }D"lI. Q lE8k8s>K0.i"BZ\V̺`s "aɪό!:+~@w+;d!?'~oFO#-De1,t"5~$?/L[BZy8$3~T^,Ñx943vğg? 5gج1M{Za|s}򂇷r{sx˯4Μ?yB׵_}Ɂi9g_1kOxuuw\)lC83mO޲9wܿ4he>؎ øivy7g~N ϯxVv|'<}v[݆v/Q?'_m؜ ϋ_4߿p=1tMӴ̇-@_)p"bbYq"3_|7YɓgT83 oB 稶e~Ѱ9 .9CIK*TUuk4 e8Bo8G@;l((E@{lh/(Rs m}Oۭj`jI^cDږZr$N/j/+1¶ru+@?l1$P k(״O*9dʤXҖym4痈G,~0O䰠MS}9 rtB(Bd!jN \C&UDO5hW JUﮡ3Xe9h?lM[tG"%>jHRئ!@<ϔyƵ=QbU13 =%{>~`uaH50ÚsHQ2$n2uJ"@PV0CNeQ2Y1(|qn$NvH'/'Hi/ 4,צrЊR}yO|TqHj>BJ.0&yOQd-e 9gеcFw5UPlDTPqdJ_Cieh$iNh1]Om)EU$q&,Zy|$ HY0a^h@ãMT PZRXMty>b}oI,1v*T„$T/FWR3u!հ"dmt-fiRn@+Q<ɐℲ(a"3~(kQM9Bĵqr:"cTPAz6!!RjVPT#_ _X׭'[S'% BJJQ,y<3z2PHUj$JY~BjiH׮I)2зHPBK fk{BF 0(tchM\׳Փ4p_Ն0EQURӌ4{+%#f3Bd²cB7 T#iP0J67 <5ROGD5KZj4AQX) ڦTnC%^TK*D4b%P(u^q`Cw-zԋP\ Dž^",#ֺjŇ: MW簽E7=|G̊ql&4i3~tkк^@aB2zHp@~xV;BB:V=me <%~#B9TH0Ѥ$i2ʊM(wNvD%#y6OQ"p/US]ڞ%xR8kXpiaY3:5Tl.yxŗիW$#xϳ_2(S-䨸 xax0'V}1̌i |tw1  F?,f8Nd G>FQ,2O_w?Ю,ҵHs/ /_5|YYtyÚ@֒Ukٓ idڟX |ws=ՊfͲ=r:1Eg8y)n'vkd8}g?HT ~bxS\K}44%ҿxƸ#&Ӂq'?s^7LEr۷k;~B MW,͑vX=Ϲ'9T{ءCДy-ob؞vwٍ3Ϟ\>_3nx ۇ3jsҮqf)RK(e;1$- ϯy. O)̰{ 0JS(Z O-N3dmKIkȪ~ɦMH3pls0="3Xp JƇSSPR!Xp}AԇaFlhj-(A,HmYc-ysxn A'#R+Lc^ JJL5jS4 %DeկdRDhx -C& 8SI1Pb{_C]L ih4͌ӄU"ҴhL cfC.BE*ӣl-iTM \Si 16st@^Жois$n|uD (>bEHghnU1Z?Meb0}GV`爟OueTjA #Z:X\TAԀx:>xy w,~P,YWE@j) Yrk(HY#ZeR<ȘPWCͬHKVk"& m0Bbh&r<XTMWddcs/ F 0S,XB, /خ%H7 u0M62hJnJC=,+ mQJuK)ʶ*(DH_ P)HJ?fq,ӎ0/(>~ҖuL$rDQ8QA$8o7R(9d! ӂraݐŶ+G\3]iVdrEPcUGnӖ#% i;8oѮaF(YECنkTU]GKv$ L0 D mo M~>xO i5z[V5AHj,Áڲ?n#M;8npJacb&y躞l !+(c+>9ݞL~J$y=O?yq5x Vkaa88͋gܼ}2IlO,qdxWfǻb$j\\spODvh8-◿ ?pZs}/`1Fq<}{V=? Wgg/߿W=V?_۷ܼӟ}nJY=`ئ~ϻ? զg9?N&`|xf<)xkʬ~KZ.Z~g/EZ?+/zr UUZ.i..-j`{:2/xsw}H9wP"~پ;_so-X?HQ0B0X=i4tbz} 2Nl^;R?`<%LG ꟗ0>̀4RkiAPai cYj9&t6-[FL(H83`! L'RĘ1ʐ=1. ,AL?`!UT ZmEB!,#RZX| yCLHT er T;4D~ o43%D?"FOt3BH[M MW/q B2n$O) eʸ91‘RaP! 3)9lӐCeRYtriw&!fj Rc4]@LʲH,.4F l ÀI5O`8o,]85QsP8 H-?j'TLn-J+ !`ߟ/G~:n_\s9>n{ 6hUEvyY=g{82ffGzI,qIeyFז'WK jƢ|"qtfyp:ʰhbvg٭9E~h+O]`I9qeoPZc"g=+)E?bڊaw1'-?s~p-1%'SwK+|zu%_Ӗ;8w4|sJǙrŗ_|N{AN=g| 9ۗ 1Of=j`kl،#5$Cϗ_|^oP˚Sq|݈V8Ǒ{^#mհzqA6bG?y}?&LJ)DN)&(U!bDV9:@G}v`ipd>^^yVڐEUICOy@2b B"ԫR'l]П<49 qTFe\么BDUK6 밶D4HӖS/·\HV<Œ{L0JlTOP_A;"a-0Z d58S(2uOL8UȪjM$5K'kE :JB HU[tNm0yOG,=´Ȕa18RnB2ٶ,rp3IAqN`[>H[ \nFx̙;|*S^JHT-*'\&dBWi9Qkؼ}="8Ѷ 3B")&ڶCيx4P2V堂hFT'S+ ({EP{(u>R! D%Qޑs&$1!)6)p,Ii&k-R@VB[t<O$-hCJm,F(P/,>q֢Y'mӡh[<,D@0Ҋ]r!:GG~O%39"7#ʔ %.rGlbo9.8rş"dDH!eGFV\vLOt, !Kâު]MNZeAB0+TYd] y]9GYWX!HU7E 4YQ5Y&iJ kM{u-Ū7)1y5 =m :J* > iika@S~"Qێ4-M iƏzMEHIҖ0ϬJ[,S!TB+ "xgdm!԰._(viB 8M$h&a*虧uv ɘ8 !$,QИƖR̘FĄVeT3!+DqAH'[XKyR2#iFQ-~bTU7LH')xSw "RJ#rimLLˎiX|hI@cJ5]\aRdF㧉ԳxijRI!b^cI J)s[^Y.-*;yF?MiU 39 KP}%"'KK\ŒEVi]C [RI^tp> i '2S?q=nXcvebu|tbմGtW=۷\]4}"f% 5V|˫xK~_S5C9|ӵ<|z +޼U-_)RIiKؠ!pzzچW?E|ĸ_aeG.no=mY-47e W ۇD[3?!/>ZN2s$!J1VwզS Gm CY ~.^suE=r#RkzКtڪƻa a?.MNUb եcE'BF T]T QR(Q;KT%X)Hc9` 4b-HPRH F<jEbTd9@K+H%T69$HUE 7ʐBƇjj*kgü4NvAl݁.X/RL}_)BΙ/3SZR,Q(M̞3V{dtc7Q"./OۑƩlE\HAJ,q/=SmIi&[sbuFV?d&]yIFMWzv* QG-Hmḧ\$FlrN|ysÐ./ Zeh@|zmj?{_PAr ́7;5Zv,1͆QEX!D;|,/!-aaf>}|#V,ێ}wW rww7;_|AvGͧ'";%8susM׶Wgq~k+6_\/WN^1/9~r#<|Dfz#ixM۱:?>`MaGZ?[o7=x`4iZX\\4Ϯ.ٿd?ԋÑ^5n9=>`D"VafbF "g݉^aa<1sN % XbrXaH q6vAtYn=cG[K8pӑ< usCr0ajtTY0?HZb)by"EIu{E@3g?![I įDKy%ӆ[FB[[2C("-v3(QUGi<0^l, Bж Ua:q.fPmG^gкBII4q*Ls<ܰi[H -K3 oTdLv*+HtݒY QIDnȤr I)H:wNR*%i Uw,K\EB6 )L[6kƠc" u)$h{E3R`fOGYN-Zby Bʠr7 @$R $lزd3tmR'Ƅx̚ J#R2@v]H!c ٮLshYh8Brh:#ӸCS.Iib)6S(89G]G0 !e:~Һۆ]!!3J4pr=sUDBZgWbmḰ2 Prg#]b+p$KmV SB[T*8t*ER!y&T$l]?# ICUkM]#iul(pPbUirt˥*hTG!mȂ"nhԫk$"mî"s,1 їgN%”rIfԦZmg٨ZTW6AZhz@D2#lA,L0X\]|قe !D\3<}D̘%&KXlӀɦf0J&+]䂧BK֒=R%HXW."[dۡEBO+RIDgT=)t,F ח!aaF@´KΒ%+F9O([JJ"`e~!b1]1,i¥H25yRd8X_P)c6*ѭ1ezt)C-q.#Q"l""T[JEB(%IIxdՒBB(i||W`3)rkkip\a MB!HYPD?#6 R4=(*p$4{m+hM+-7e BY۟#lnZ mCtb &!BZٝhk,XMjRf@[Ud.nn9crfl2#B&aݫ\E3}/_<Z |z8W AK5)DqC߳{zn-OoƲX_px8ŗ/q%"%.oל#i칾^5ǙnϹ߿eusC3Wk>nX-ߑd8!rK~yvG!]]^Ԍ.k>m؟㛿kyv{͔=0)>7闯/V=i8|ڲ~l>nX\oksdaj%"^q^?x8j4OaüNrN#h,V09no%Ĺx ?iKR ? _s,jB$3*˲lJ8}jtHGʬQiiIBbhH[K-|j I RcO$дd"Ee%=fQ#1-n(`m )#|: rFaG5aKUB7?BHPdztuIJ}i4GcohYU#Hr$)ej#*sѳ2HI#r%Nڋ2Aw[i'8Cw,巜4<9=*tVCH%G"F6NOziPjG+-x[$M3f&DOY=^i]La5JFhԟCg-J 6o @u kLt_"Jau醤T$)P!/Tfa1Oخ!猰JrM'wAPJUb«FB&{|n-B)"Lk& ?6^D⧙Dm\H$QjIPiO\2y<Ѭ;ighHؼaho$Y3Um rߣ9s$&mH݄)1UBA?; c琦'vrmc y3Z<q&7'RY O;;[3Y(h,~7";,-]3#Ihg%Pin&7PeP1%~v@giJxg8x ZJn~<}zNiܬ Ñ?'FAZ\Sa@ϰ_EԋVq͞W8+/^xo|&K\]ݲlgTW+~_?‹qguu~o $dҜQ7Ϭ//x}qO|X,`k5;wG=g="Oxkc~N,mY_N'|`ǟf ?+ad;M>y;ny𑛋+}b ^\?0vt8pywOZ#摟Gɿ+_=;*GOR4H%sAJ9Te:b*9=~a4UC"d-dJ5(y\z9ge[#)2-O ABDOE%5~>ԌHKX~H$YdT] q.G%U@q:b+쉀,"69"Rp DW~(*R,ˁ=J )srTݪb __ޢ\)Js:AEFʁr.nP0>RD˄l\ZPXSIh+FTw :Ŋ`3~#27֒Tz֖P f,jj(S&H-:A@XCe R7]5)fdPHk|m$%R,8ЦR,UL0#$Nh[~ JYR-w:@ NeB3*09"?aeM`V+R䘑Bu:5h̑iv+DH"%_B ȔU] Y!$ Ͱ@H=u{[c[Pqd%M;Uݒ(Xa.2V(a8rn. ʒ@yO?ə)}0%: gj BHp:9!chaFTM0uֶ <#Bd",VùHʑpzD*M @X['z b&kI([)!BU ʲz ?(Q&%h}7*? # ]ߣo!~OSyx @ƑnO{x-Y'gk3}vOg7l普џw__AWp~u?q~reŕ~򚧏wܽӚdXmْUSݑ){RwɑB<˳5LJ /^x[133n?ܲXyk%N R?9()q#9s?=?3>ia3 {{K5{^ > Pf~ͫ3T<6Ap6BxO,/aÆEݲy{Dg[CgjW-Ր0?_p[6$8}vqO%!y>ٳb#/9~ 3B'_9#`=4i 4&fQLM]VϦFńDfT2#Fk9>zg1 m$S隨U)@w~YN|8DZ:"#ِ=[}BhR.2Ev"DF%1q>PBʠ9]nU]HHDV Fp!-[BOmMI)E6D!i~*ڮ=9%i]`sŷ=*p@̑KB?f}4ďo+xd8l őe1$KB!gmH.r,.zI%@$\ yFiҸ~ւ+0qT-*(e4TIڒA/ѢtTXhih.nqB IHEg+KR0 ~L°]^ƱlUJ%L YUH |B )s$ Jq_"ycmKH7EWM)ʒN9ԭȄ0e6x i n&/݀"Qd;DhۢMWv)"S*LSgZz*En9 ,KLüy,dU=^K|$m8r;C2xa"&A^ ]&4Ъd JҒyreNZ]$gs?kp{#vq+ȓ{܈-92Oc ǏD258|#B[ɟ`$ {Rrr4aHk= yސ-:z\NtEE@%I)Bf,HЊ9LbOئbR0*UkB(@PwO tTݒpĢ]Dd(U T718>ϥS(xmQtt $Vs{BtȘ\=Js.4n urH4;a1yil{fIL^ӑԏd-uV㎜2R,~ # F!SD!"8\p.?3yPB#M̮ $Dc(qvZ2sئ#elEb> Jv]٦fA$4 QJb Ҩ&1 d0/ Z&㲤 Q❪t+lqޣADi0J6%=jy^z!R&ŲZVz&q !u0 7NOeG3wU3bJ{.//Br\q^~\-/ϸ=qͷT+~'v \]_pv}f˷w益g<|Űx}8톳=M{kԢa.Qְz~ɼ?5mjÀׂ}c^vHk(,$hR*QJzΜsKw=mGR? y_~f(U+Cv 2(EypwֆpKI1R1)y'ELřAW #}j:!BD1*{EK$5WUKd跴mP.ѭ,YΡ;{FtE#R7TmU)UԒ eFg g1US.;s᛿b_P--=&H U5, 1w;ԋ^&t2[+aRZGBa< E'UqmA V(DWRZ;btEL" P,.3bf<`T4F\>eBq$,1ƥB,/ 3VJld U%Fn #"kdא253x,e529+rr],N'DE9nL){i9E87ʔz >Z U5(ISg Jc&We yv`K)y<߽/y4nLWL"<x@ۚ@' ]SC*Y]W"%)%(Cp ci'܈ɠ4J2Dv iÌZu]! ʌ\.! SW[bFJ?91]$r)˒vJg>tDq"S,Z#C)CH0@d%#(~.S7L]ö$J,S K! RنPtWB*>ih$) .\/"DX2򊒅`5 h*08/0T)H@.*~VǼ d7E\6~D4-G1%~>„wldM]D9/r~?1Reɰ="[ʲ  2XmñN8uelň!30a ˧G]sA)"%adD y!ƚGi*N cHZ[8V 1sYZ ]KbJ0=TŹn*.ѭ.K_MHmP2#tM}V.9%$Quˑꦣ^|`rSqPĞZIJwyأ8Uu Yz@F8L49uXPc H۔ BKq t$;@ MS6ֲDlP(i?=;jWH? ZnvIt31J\,%%1oSMMW>g稴& >&a^»2\nGW$i "v2&O";R%ȵ& u`cbѴ5Hn0h ?ŏ9xL_>v_}0"g ?́|Otgno-a%CJ ӎkpc~6Ŋ~H!E>Wd>~sRyd|/=[3#v{߽px;<[_? 25Þi??Wf{\w|W7UwggO!%\Y|݇Șx]^CypX%6l`$UJ~+?vqsLEu(2nƠӰChE8;dx"9L"%D,Il Oo3W?X].pm) r]&ꔈ#I a4jJP5Z*qs_Dh[2S\F@x5LRDeX\,eۂV2s)ǀR<{^:\tԪb3nbU!݌ǃH?gGXYY蔐U+oaEe]Ricy}ô1'Ou~^Jݲ<Q *yk1Jbb3*CZ% 灬ж %#%D Ң BDVvʂ@EU87H*Sbe4bApQBekit hx4geS8!Y4螔qr9sa-uToOT!8SFKMV1'Q (ۺʒSș?_Hk,D6Euq-Yf|NdU)2e鑐!zw51B:?8, 5߱|EjkDgL7A$,D a!GkR#Kʁ"'C_BY^\eXQRR79+)i2fߑ`uSN}Ovb"JU2~]^0bzF]P *ϐ+~¹uT҉G Ѳic$-ʦ g"G>$PD}FkHz*SO %܈J %CJqBLZR(ep] >c vqIT $QR e)ReRB1 [/L8O"B6tCl < ExXDz7tU)~n}ž}߳:9F1%1yf\X4yzwV wxYbGR~z]97CE|x|G2f`lh|﷼z0No ۑ ҏ3UUBb|aˋK2߿ZV,hawdy*03^dVnYV?=9yikC2fY"׆C{)El7+nn^2ݎW/H.;sJ eE[\Txwq#ժqgͯͳn/?h=k#$QGw||xt+4l{?3zwTTY~?f>&~˿D5 f+yP]fi`Xr<mzJ3nDF(c3LSo^rp;NJBggȦ#>=*rMShBT/Ƣ$Zw>RW #}Ew QnڕBV"ZDik!xk@ P t*FV(UE&3ݢ%;۴0=xM5a=?%  z͞T>'2RQ i#bQ9Sာ-1)v{l[bZU.V=ZdNOhcʺzPzG}v%$z,oU"'M$7Zd-}!F@m*zcbFFPքa$[LÀjd#h K~$2K'c{\fW%Ja&'09G%w6ʶh׏沝f2T3<1>|V%ᎪZr9Z*:Q)vB/:!! u]AΤPűҝejr T%BVX^ ,ʐV6EƱljR T"Hc]KGR=꼔T`R#'L47/K BfRe+ x(=yY-mD$ K0.B]3jD֖<5ȔZ>g DΓŧѴf,|/AѶخ~Ѷ|6*eQJ(QVR( ϥFUYÀc*Xo{ ](Z[* &8dh 9H[\=RHSR[K,0 Qii)dH,WK|wmH 2nFY{82M/H1r)ꊇ{)Ӷ %n &ђiY~+>ggd^~//~\_.x|s 4n矡O\FqK4 lw ٰ?0{>/9s̛Jeږ8LijW7#nѦlsʸ?n-jr!,јccmF\](U5逴7? s oiV(.جGUww3iBˆO,?sx0l}ī_FDXÄ/_pD=\sty`q~oa~%?O9Y}Z3|G5n?y{lW}G'֯1?GW. ȺZ]Ķ&(UDH}e+7%2PL(nIڋOY_%)"d!Ff4$?Eb0ҰɌ1R.Gii >X:SƍG4UYW*yB:t(AXAHĐ0%#FiɁ'FIø1ETHR$ 2Z$S-ѓ[s}"XpZQwKH$Rըjt'Ł#vqD"iњʶRbi cjV4F[ absfGHm>t!O{>2*)+Pꊠ$ ML_D $Owk;q`~d; 'C6+<)=x*A[6eS 2&dq#;/?!N lZL.01i.Mdʖ?z*"q&f<]N͐"mOv O (Q9ꂰL i˅OΩ縻.QHU:cK/,/R`FDHGY7f-v B!Blj Y%Dt0nnZLe!؏0DQuUcG)Ra@& ^j0g Fi5Ȭ1-QYȸ,;tre@m)XS#0a̚!, BjIDcL!Kp.RU-h;v*lFiKӕ6gBiE;V>%1 RUUEF=n:R-Ԍi+֖l 2uK70Q]|H3Ye,_eR.M!U 躃#RIi0֐c`mQMS.{ٓ#KARDd"EsxӑRa_Z2Q,FKLD¹처X$q nvnMNljdYJYB,eGbDf;L9DoBZM9<70 HjP2α?`UVckhd0a GTJ`jLkpӈ.ٓrt? VȺ)4XK8I2Zq@}2gJԦ*ǧ..p3FUbrScJ)ʒsNҒXUUrܦ\r 3$xp@ EIhTx!OyIgU'X."ldܒ."zDƀ#U]LLOX]L^2]\ӄPJ25X tKSԒ Mh(MQH)4nL=;|D~!:[₠) #΃adRHQ]}". ѤaFD" @טKԦY݌R=H]DD٦ɻRDS7hĘ 批ߡOd^ OC@_hFs(62+r~0"e ㄱuZZBՈV40c+AxzHH[|1ʔ,8gTU3{Ϛ@^UK!LĐL)0)3cn3Zc L4`2Ui4)b % YF#v3 ̮`c=v͇oJtq y$XRr1bP# LX n){TFcL&*R\Hm6[԰1[ .HBB?- TנFKS6x%0E˶BNfQB#,29Ivu%Ì@L %S% /Md]BDEVJEVE+J[lGmkB() CΑ<V\([$ U<X]>Cʒ=H] H物 ef'buoψa$P5/<: IKȎ( GjI9.UJL&TvlȴQ]SaU649ݲ|'QdvFwP,!zp=E}䌔 4LH yFq󀱖y8su~bt2( ,$F> .LDKYY0MYHܼe}@0JU(id"!e9n 5ZKzzߢ; @0+vW?F0 ;ŸcdH3m]!M3>K/.w7{j[36Þ8k~BԖx$?lgW\~v}ABKEJZ,R<_xgg<~xpIGa33-&"--oŒRjF6\\c#O^&bq,12z՜]_hV+l$ݢ~W,VEy|, ,q(1H] DI.+X+hMۏ,n3Lɸ)r6'~x7?sY}:`E'ӑ9O]/@y3'on(bs'/yz#7~۷4PKr18|?ewؐaU􇉋Us2=/_e|?3Sr~բ%5ϸqgq}֚ǻ'VgՂj=_g_ ~!Ҟ=+&` >ѕR1 Z>b(񘠪Ä(#id )x)#ȧN`KDpoGUX۔ye>P#澖fֳoÙ##2*k-AV !<$$L,vA B uͽ}oeUVfVDyߴFusߵy*M#7@z#e"Y[L1v4XT:NXgݞ8A0t )"DZùB3vhE`"Kxtt;Xm ˌ-i~źu=5[ɴP tg M#1'dۡ5fC TV8! !F()(WqmmbDjA)`tKi*O('z$3 d\->z䔑!eVF[7R\C7wXXײg,#CBeYy=b$٪4-No?OHYi7=GZ%o:JhNKty# a'Nh8JL0/ #*lu Y@WeU2?`gZ2w;kt}SfrtON5j^&հppZs-OgUD#p? jU]Z,?}fՆOox/ '~`^'z9L,7W4sL4 w<~GHE|y|a?{?(vm~z$\^͆u O3)dRƙEf^fWl"%%!->u/_B%!LwEfd\ǟ7辧4zFE(&߾ddm(~"l :}{NKlv(J [q֡%:OAxX@'[|. J\ZgX9Mj@ TӂO(ei+biKJWB.c~AVI\lj궊f{KNi'uӣQ9BCF7=># K7—5A٠}*eZ[3\{fEQ"R$#r;UYhB@P{RK'd* zP6{ɪ56R5onz/(#1D L$J BtCJKu֪N_RUb"(Bۆ8\ 8TTuA*?Pqˈ 4խ3Vk7Bn1Tr<2c56Q̹9{C- cHPjk-iO hK$~Y.n0L'ZQJBAצA)M~AGi~^1"*G-Ιu^px=Zˇ9ҹ9es:39fj~_w\va!ᑮҷחgJ,< y=MˏtOW'֧S%H5끦wdȻ;:C#mCQM|:s'_%JkMcwwЅ/?~ mm3eϷ~$g&3D)̷oCJwx\=Nu_saa1e>~+^'2\/6JR* q^iJJcJn)Zcu;X79R>pI# Re~2FV#fw?iZL"F<)@Z\q&- *'JE ۆeo-v)Y)1ΑS vO!C6 T dضAR+(3$L.S/i2#o|@x4\4}}sj|̱.AEWJ̛=qY/蒉E#vM&Ccc(RcY0gi"mH as%AFIg|m{۠RffkzP i+B74u/2ȅ 7^;t;0OvKRrO#~ĒںɥFmM'H"!XKaBD車<Â2A V\( 'eA=4h](¸qe Qz~mCJORG+K_$N:OBׅbl7'7c;:!\ a42~#xDXDžn#rajBJK7[ @ PJ'k6Gn ȢԲ0H8P>!Hh/~ jͤі)>,Zq,ӈPDĿ<.o5ל@5/ Pm9juPVVN(E]\VᲢmm=,Jv;͆Z -$rؐC6-:W!o,H2Ə 9*r-Erͦ.Kv(gaΠ7Ogxhgi6[rɬ~e{1`Ci8??-_ֈ!y:^\N'жϫ0LX+ѓ`TfzyDmqP@&aw[om{:hqY֕KDϧ3~4S= O躎W(gx|}A.g1PZ44Bst93:s~?hn/h Luqf#_<_#WR>p}y|mOo}ra:0}y]yOg kl 7{R\;~|d1W@&H`TEx&W{uE+YpÕj0 zq\?<@wM,%-=0 9йZF)yw'RFg}󑋛 y#nB3LG^ _s%w/?suuEh<u5/ixx|+ďYNF*|'RL Y>q8Ja  le1TVJHd)PƢ`;LۑH+ LOhbHu$QKqa]ZlQU%A5-aCd-xxL %5Ȅ e!&UMcRYa6E\o J 9?=(h`t-V5`~Ex0 /` Jݞ?tC-P$a+DnHsyiZ|ɬ!qyu:oZAJ+vU,~^%LJ 2UM,=G51z'E9O"Cj yif z<<"di ί/H I$(\I9q^FZg 'H5{5^RAkUv@Xt:!F2/6.D,b_NBDjYNk-GkdHIDYWOhj5G궐+S"jXjrIdi)Crd-2@J)E'lMюu>id92"&/DT=ҏ)2M(3w( bGfx6\?33nb~AI +*(!Fna$BɱОzAJTQ6[ڦsBE.cQC&<]9P_Έ\#(%vļVGO @-s>>`'tEQD,/ll`}qM P%J:Qm/3jPJIȔ˄U4,DRDe wb{RL_~H\RJ*#tp+QABո*me&>}mYbzD3RTa'~ :8ߜ˿J$VZbZP:KC.+kTJ3ضJhP?D B6H :E)D4c"G\<0BTu82cEzWBXe% ݶ840>b 4@jGN6i(E|:c6儤ܙ#dpC?XPV4iP!@ǜn '-FH+w۞_iF }s8)fvlڞůq1ieHBw }sb^fzҼ72"!+k"Sq \]cMu]xَနaqBbauO#%ƧW6J<1$Zq _ Narpt0q/ݰXm?2hCKŚ"y& >B#O/ C??yy:Gh$OBmA)i^W{1w={j"&޿~??D\vܼ'v ŷ|y|d욁-~wGT x4ʶ yF(MzZWB k16:r HZ\9%-v+L]C)P mj:|`Z刏#R=ց6aHm+4^_txuA0Gafca]@T,'S! (՞Weu!3$ Xi4mݢIJL(0=YZD {db=Zjw',󁡵!e|P"V_o-@IⲢL݂ŜЪtVᦔ̛N@\V8b_)~%H3l9O!):vLӠLCHu Xׂ8%QJV(rP11AԸ^!O'f?" %FtJʤ"1Fa%HP>]"a a"imSbye ).3}S QbBbJ}\#~2D'dbPmRhӡiIij~3=mv̧?#>yL?pcӏ$+ 9?$T{??cʁjjJg/'sizB|53_2=9%& a—#vI g9p:o>6?}vg0l;Ra-+k Ɏߢ/v~Y&/}?pwsyhѸ=g6%*_JSBBJE2Wx I@# <<>7Čjdr")A=B+Lb6 g~:1)*SuЋB`ێ|V5֤X*k M_KTgc݄nZrFb樒]R_DA2S d-eA[bQZ8DAYMT:k(~fx5~{PĐPJCFɊT]NO(עȌ(8{3`ArEwGF:yia>*Fb.B"zG\#IK@Hn{TDet hdLW5GiI1mrv PR$0$ʶĘ1ʢ#15axŸBou.-7;|],Q`I oH)E*'!&a RvNP1VkJJqEQriW,.! ]ʅb\G*Dq)R\;,RJŹB]zh1W*T-h'jHݖZ=ɕ,' shTGB>}RMCR0JDJż ~hT9$2+ R$b%W )-֘Ju3-Z|nv5F>3yǏRD3mլ9Oơu5$  1Ĉ*EF'ͺYچ21-)4QA]iCB %3?bb},SqݭYR͉_ŗϟ1gȅ(`:uM,ի 2\H~|~_-cUǟ8DQ8 X$XbDʜq83Ԋi Gnwf6$gǁiGϟlVd#9~j}"mEioogoُlZLa2'Xxۯ/e iŻw< Y(龪6 ૛e副~ ?~HyaWhO'~_0\ӧzkx@R9͎_WLi?~B]j DA0P"QHLk5}ҐmCNhS4!L@XG F4oZ/Z&'-b9Zr,ur* ~"(ɅJ8Pr*EJgHGᮒ|D~Il۳(&5mnc)2CTk(Ib!H6H!Lm]R%n)tlreHӯE!c'Ftd" 9j6Z6?#r$ PlZIm[L#Œm^<Ҹ5Cm %FʑP0$y9#B")c]Ga2>_R/V@ȉvEJWZ~-R*|)ѓ@J"S8cZC ^j`WT]n狌pA,#aBltgqHlrNuQrÀoN(ߡFXK}|5#%*lפ KDj.F!F(p+L"L#$\5$8ALF_\-PhVz@ӨD !2yHF':K.B)ą%KOÙճgdK!X72P$Qm15)4uS) !/e>SӬX@I TA +*w!bYU!Z)+#2gdcnUBi9x\ۣq0bEbrnYhbA*IɊ$zEbc|tmiʴVe03 z3(*} Q0h-*$+O2%$+`AH D>LeM5(s[ #EUK" r ?ѭBB"!ˌ6 !/B 1#N3p&4 OTo! "x bݣmG'h >gifD~ӣ MYS&>Z4P80=RWR=(X>JAK4M6B;)""5RJR 4HM׮XdD9Rd!GE!k/NmI2Q\;dƵ 1'00X>U߄kH*&."?ՎYiXOvGB\!$/'q_Ȼ[?, K |`9 mYD}Xo֨R5LRXgQdB Ē#2ږ0˄Aql) xsN ~pxYuY?fշhYgϼ~_xh\WTk8^X?fw}CM%!_+v×\_xå;r810"nn'Lif^&O"+HaU~M"̋՚@ӭh7+`6,ӄ+WhQl z}˪N~[Tgnޑt? 2eib)0=-ϞM3˅:f|ݽe{TRPB֢U837(iӑ29e)C4p=%I&PMIDz| N#Ն,u-%E.ף-0Ǯ:Ng8!ztt牀2a9CPB" kW $Y-֢tXQd*:2u )r[($I:v]l,caN\2ne"SD@ eF0Gи L Y*Lӱ iвCzeB (XkPzb۠&&irFkW Po ,u Bv !GTJ,]sp'JBND)Цp1bM24Q)idm;ګK !gu$6#l)Jc'_'F("R񄠐'_Qֲ#CEFJHAz^]a@5*[=$эFB#c!/#DB$Fi,Ks eQ;|4!kT@<ɣ GH U=t/wpca4M +͆ 5ۑʂgejE.[J(q@HhBH(m%ӮPHiAIJ(ER) n(iD,>`% %hM%2:- Lp^P Y8dNBa}<8*kr9<'HΊDg֫9!'aDAZo13Mni8q{uMΕ~Yoq?OÉi] >!Bċm!7]KEqMjxK5?|EGX"K5gs;n?cյ׿!NÙժ_ox8̗#ǻ{yb)Ӱg#ȑ% 4m8j=_"nM+>|C}/_x[L;V[—GӞ?'>kRHX;N?ī_gS:S慫5Q ir-<-?|iZR~GZq onqL3kiFk io1o1ytHW?L{r`l-Ig|w?/y^XV<grWoˉ/ħl7;"jx?ҿ{7P2>Z;2tZGZǏ$dU#a@ofu"*vÒ x~3~u`J;t J)#HHD{Na*%r5^! s̴ FOsE*v=*24+Jikn8,_JlnBBV!%B3RRB> kB ̄,(ZLg#R8[/By,Jp:0fs0#Y(S|^Wb#{~]saKPִJqkG 'j= J}X780dPZ.$-V<OPKrՒC3晸xkqΡbx b~BgA-ZyFDZ̋ U{tS߯Z]S3EKYy$ H-)B` H!P-EjEօӭ: I(B" %! qAL^m-gTCJXRBKͲTԝv->ETDja("eRB Mk>`f:|9~J@:H1k/T!Ifl%….y5(}l!eOTat}Z[G#V ~XulWĥ0]G:/~ƭL˙fBՍ3i+&vJ3"JDRȜOkҶә0iHaA -9fJ)Emz PZ ]TPxB=93= QMCG$-L .#_c!a9_\Έ\11Tk\-R/~@W~Dd]7Y/[-JJPG709=6.u(",R rҾ,uuVRAG:C١ێl;@ԭgIe5)Ŋͩ 8M8~ pM뙶F~>L3|~zJٺfug9?,l߾4IZr8x~_>!3BkN4a &N'J209Ɇgئα鸻7qz:kQ<|̉]g^u[^~+iY p)ba%<ը/L ۯyFwnd:EbP{?"%/ȬP}fs> "#BǏ4 p>6=ab1z~k߳{q~y~q$_#1I\)|˟ͷp8٭7 rٽy2>=8bn;@Wo`i_/ 7趢8VH%OTMPi`RfiҢV+,ّiZqGnjGYs,G${R# r՟0**Ԫ=}Qk1^]!YDΝ,á܄D\6V)TWqa8En (\|t=L -!dض'Z𵮭iE{r1Ն4<`v,1;` %e*P.LӐF Q#D!3YdjEHV9N6L*mRsV׳@R;\jȇ#5Rk$H-BRg[C["2&r UY JDj}[\C,T)nCeD:묫)@REȊPD!3vE:ϕrM2ą|F%P;ʠ02"$F*jP]K%$>ɊJ%FuW oI"Suf2( H mҸ@Y9h RT U'(%WqGvM_IwV(aj×'X%v ~DA-gkڶOٷ_i:83iWG, ͙߼0Ϝ><_oiv=#_<{qO91횧_X{TېT ]<,\]?í4 ?%rٱ]y/W9luܧ[w|y/^ +w{0'޼}ԒOO|? _ܒd>РPFspϛ[NG͚x8c;rbُu5ي˗_eO/b'"h7]e?ݻ8~Mw?}o%63Ś8(_ 0'_9b?oV-ϿW}~KѬ[ÁWow {P?Hx`}q!2|z9zVmzӗG\Q{wzTB+n3 \;3ڵ`%F4e B(E& ~>k#%خEHdE$aWImB%YtPHQϩ _LJM]. O78?~`yl{-xDgoA+tcY}64Z2?"+ 45| B١Ed>0X#!$\3? `Z5E 1N30Rda? <|'s-ҖfţY7-b:&lkK}`-O,5}a8Ѯ} ^3?cWdf>SEA ?' $Q @4Ta ĔYbx}ERpm]mIqhwϐp#%5u5KM4r'Ո=`B+j!$PsjC:):mPcpBIHԘڟ|BP,n:0 !NZ #:1G#Ŕa7dU1<"e%7+Tݼ݀_8?ŊI֋PH[m1yr 4 a[K_u+ u:h=**uPJ& BI2 MSCJÒvr }GZ(e\o6Ot#R^Z Vkaĭ{C*L9U14&]$utD-vˏKB0 tMV!-i:Эvd]?'/ykWe<p72V\b+E*nԤ\^Eԃ2- [F2.qAXjs"UrY8D(n/f5"WJuؠk;R$Z[[te+[HIVZV :z4/ЍpU$  \S_Ln8z1+-iRSq-,6u(,a۴BhPպ(iP]Haf<.ӊEH uH%I`l0~cdtkbΔ:lKgT(k9ݶi(0*~M31LCRfsh)0B'u m"1Z#̡JPD ed*"5PJj9jԮ] RaADdtLFA 2.U)a8mwHYcd)%i<ՁbHS#jvE4(>оxA\"4`r!L'RVq8>iqѶ-yYX_ɱn]8ovL>r}{g\5 i5i(g<}4QZ?p#41iHx<}a no1sx:y-/6cfׯ8>}~^1×x>7/VƏ{Պc8iۖaDw=w_y8NˑqD:G?H 3pÞYj7*wWĜya3횦8/<{~3~߰nYUq%kn_O]vç;n߼!K>zyt@? T\"΂%YmoUñ9дª*%)y6/HˑgjߢmHsz˹_&me`8d Ӷ )b=lzQ2͆\1̔01H!aۺbm;~t&_nK#lX#@uij0N= Q_zCd|DHޢ! Rq!3%WBP8 4]Oxz-~蚖T ƕR[h+3Hp3y=Q)Rjs4Q"BKiJHBT**Jib\?'`FD ̜ jTVArgIc5~/,~R?C3'jȈpiz )#á(cDJR8[{%;’(#EK2(Gw[3PR05V$>2# O^k)"jI1m5&OnG3R8`-{d^@i(X丠yk qdd[]]k BAe5*_).1+UK 񨂈e4UA @8/ ?4W}$. wR Jed۬~4~:@6Ъv‚S܊**!QF(t簍%m%cmuMM.A|:mjD:·j? :tҚ}, \*\~tA:xQ+ X{e uH Bf)&:4rnM D T=YHĆf򞫗H(1r{8߼")0mk3tf}k*(0jD%HpY%c3IK{9n9cU[[{/?US;Q fjqwZj6FaY1lN'Hdkko .1جVL)0nn:pj$Kɠ4TS+ws ؖxvl=/_pzrڞYLgӁ/~[r̜Ra_}-n7?l^wwO}jXa,x//#eq{wi'Ւn??{Zr8\Xx&guNK?5-yљi7RBQA^p)JvX+0.* FW?1ӯp=mt=U9cu-4tH4JKJ4GxF6dQarr3, Ӊ0<;ʜW+*>S 8m1] nDİB#1yn)qBiKĠ6kLȓޮXr m7W"ޑ3`Osĥ$ 6R"4V"*ݩDʩESEHm@ @5-ya)B]sA5~LPSr@HAt:$t +F6Xr_V1 pD+]efՀŒ6 n@^Fۺ4y"GЍUt$ =)`W |ʈ`v\95XӞOt2$JQd5%18EK<5FѶ *fEzIy,dLcta)]= T7Ct1jz&er‡ t87]d FJ`4#@ J-ra&Q3GUQ `,O~Xs!Qb8fәa@9&$jto".Viki(%FOwhQt4TbHHEö};0OfXVLxخG4Y#J1ԍT%rT\h;P΋x{6 k, D#clz^"rk>PuX +VΟkZ^ߠ%WaO̾<;"B j^z[%Ţ>!#mM5XUq1HhλGDNO]/ilVM!VD_ P2Ah$CPsI3M3ݢnX۠+O,u0jaѫ5Rl7;L?cFk9cBQ&>=}1YSeimL>]!ap qni.wd) JÎ[ۯx< r2ܶLjr 3'wKӉonsjjq);KzH,y):n69<?#JaM+#Q'ƉbLtf:jfyFf"H>?o^ JCFԒr ,4V3yɔ\WZiB\mk&3ETU h rLQ JH,i8?m(3 F$T!"H!PfсJh@e5aO'Rr˦GYC*Q1QJ"LyMfK'za0U=ϮQue}OJkRtkFbH]"u+[Bp0!3HL)Nۮ |E(I8(kpvyd/5'zLe1 nICHTwҊt~Q5x>SrḴG*ղ $0X%85**SiYQH ƺI01cVH~FOGt6(-rJh2jt+>TGIzNJPd-:-:d01ڡ`LS{7HEbY=3,)WX/ 22̧c%ÁRj\-mQ\'#ρOZt"R1)c,X mtf\(r"D˯ %F @!("F[D)c}5ȈJ!ҘGTTXuV!)ER\B MYJJ):6L{0SԸ9\2>|G#IY/)HkEcDIz)-%R"Ka:&O3My"VR$Y߾d:穖w"+%Y+d(mȴMOFBDɺJLӴ*6%?c ?D-,5$(?g~5LOOySеkJhQ n{OΙo|P Jb<`tF65a@iqH1s0d"I|xFgX7Zܹ \ 4{mkrڐ[;`~r;b7߱;],I~PÖׯ^٬m5z& o#x6D\L\͢^0J*U-_|-?}=n}NՋTNՑu\Njڶ#nOlkv~7 Y-t7y󳷜g5|__R-?ruurq[ %{_=cD"C=>OxYhW BAT6i f 0{8 WW,)Ii5yok1X׎ZmD 0' 4B4 hDGv#!JTGZnR@+uN #JBKRt)c54JЙ$ =MvER)?AOȘʒRTU>LQ!E֒'3HgJ*-M_#ZPrFy|s%Kjnڞh?D|%lZ]s#hIm5 hݒpx"3Ҷ$/1?HixO -9$އ8WԨTidnLiEX!]+9à^rP !2d>BJ(Эk;G[P`'6P6TGDh/HN%QR.ƴG 5n9oPz- Q9ھj0 p_i:05F'f$&J$JJbpZPeỉkhN9>~k~Яd~J[` kM6/ %)5 .k(v/\LRcDy>/H "DbRPJ, R+%-BB) Z(3!bԪzmOkri:A"Hi>`D +%~k '$G,FwX WDjzșw?z0LƚJ{,l4iDXRH^eL'L z^7 ){!U"R)(z`XlPE^TAjM\ T”@ s"hTL vDP;}BuuF BkҢDEEM[,#@AD(IXr>Oώ=(`"J .C 68;4L74Rdrռza[;pX-<'l;W @ww9}D5U຾Zw?X-x7<0͜#/xIȎg}*ó/^qoWՒ7ojo K ,y8yѽA4w^cF<:X|^0ώxBkWllKъGrbDyI5!'㉛/||>~ӖI_~O$hۖT/ ?5Rx:SzFHdh5,n[on(L h:24SL6RĘՒI #Rjunu{$ mhmO 'NqX(dLV;ĊS%W,i&fmiW8{_PD jIdt< -˞2{4ӬTDi|")A'讧HRfNJ5.zd)4Ґr Oeoٓs´̛b3ᑶ[ ZՎK=xi2Oɺz7#K1 _Fv7TQӉ9vAd-@Vr:Jak3Q h k jIa%9DJVdsVʊs45QL$ԺXv,AdDӓ JY\RfW F|,+M%baL S 9gd;ԋZOc Qێ,kr+o!ҿeجFLj8%` ??{,^x__JDk}~XCY/9Ocγ^' (ӑ4a ݵ|z7/_3O1Êx5bٳ`_^1f{;E/s>>( X{]J6Ӂ^[^xO8?l豤Í3?/xO?ހKF6%5!p.,珿lۢL! .PCdS]JIRz@eʻJ] @P]9@GG t!v,*܍Z;nMR42Gt7@pO\<#g4XJQRAR(nVb9 u-b4lGe,"hہ26LL{k~`v!B2 p@/$?WzS4M=ȧ\ }GIѶLGrI_Ղe7;C&c-_#]GG7\UX0B#K&,(U \2㙦QRb3vux:Үuv+k>'a__7X'ϞnDQLkᏁp)*K%!64Àd8"De& !TQEMA*?;е=J )ɇmIIt-!YZ4R qP?(mr]E #%F\1ned[7Qa)!܌BAj]iKa՘Fr+Զi1>1S+\y/Raѷ]]Zbth4aJ+tB}1FZ^YWXc]fl)*Eb DY7dS\3 x"H3M;l*՘w(O-'wm+.U mEFΑ0!;f_*/Z̷?iL^^&^rBB5|E /~$NJNB( DTRupQ2!eA"DtD]P2:DP +iQAHL+v\JҢMj怵}V@DRi{Bɺ>0ZĔJVU7$2@NphrqjC۴Ɛ|Bmxzі !%>̵(M&' ABexR G~Y}jOii7R`>i'~S;GOH([Y@cJ d)J PiPR3>>1ܼ D>'942\w7_ 1֋B aDD0 HBXY;һSD&# Y1 ]ӐsXN=/hW/n[u%ɺ9:PT?<|mİ>Waqd"A$dn#=\@hTQ9\_Pi6]zbOQ$B``:\ \!cu(n m4ǻ#hAtզHa;)>|˜*2vtRy)#8;L7^{aK^p|qo/^wh a\h_/_pڍgѮH#cu0T)տ-HBBdX? #5g^eYP0i;:_@8Gy/[a=_~7_?g3/X Zy,o]ǻw?[L#pQbz|FwT4;Trr 1e<MY$ij .Y91[DgXɣ#@WfAtt"@Jb}Z-;YBpʁ*qrz"/޼fe9ǑdݢE*~bXŃn{`Fl6?\XLL4v wc͗_"ƝN1|#egx "%m nw6-fySM9|1mHi4m$cMXb8̒ |ĴK)F ?׌'.3D~0O'4$c$gŒ,9g"QY[XJ< -y쟃<"]i(RUx&T-j:KYm- ]D]Jit$vlS4a;sY hhUw*4v3f(FӞ4;VSE=|==! A19T0*|4xBjCOb6I!B:̧-f3mnv#jlH;Y,wc5wY(%(J Ekᧉn|۽&ETC#Ԝz )S#BLRc鉥,0GS--k! 5Vt Nr"({%'JK!!GL`DžMwAׁKiRDA6BDi%1&He y< -$~=|>?P"O]_s| %;8́w?xrųn oޮpsMm1bK{^.rBF׷kNw;ܾm7c_p:Y/;޿o_~O Xׯy#|cy4\}pwtdD52aLp ٶFs~ܱ<۷ېN#{) MKNn 94=:oqY}w{VWWO؛5[?7ЮOuf4̧J~H/nnLP١Mn TWEN搳^Dlyqeu %^n9s5-Z7ӈ(BqcR8EYRuc"6+VkƧ"]c%Č^J9ixEk oPA_aDmicѭ6:a#Aq47CB8jgUV6_1cv[?vq֔}A.yŸJ K!qGqkyѮV&k!!Vf{)LUU0H$sfY1fOޑC (B"J)Y"%(OhQϞis vy8@1{rcO''KΌqhSH55ovW~bq} Y0J9>0 $(!G:2էªGGm'(YT_8ͤRc:buU (s)ɹ> s}$vcѦ!#%TN錈} Y;+kd"Oi$KVUHqL!TX$Ou{|hWR;HխK&i:TE!9 "D3)Z`W}qj0UI1D7)o?1S-5LJJG9К81h;R ' FYDQ*eR`eѶ#S} %uU/qj=~)c .hgZTacXF!2hƻ;li8۴T0h4 YWs 3j}6a!LdJ3SqN3H,PC@5 W[ @ZaPPAθ催%nA(|_ Z[2:wXb8g#{k+tdJ"C(%E-k!:h\THU:5eD~#~z}TB+$?cAB chI[\kOKԤ?F?HΊ%,*!MDH3"FBTed*ZG))dB(qnRk46X-@r!匿{_ԋ~G㮢gB3BHr PJ|| EObA&q]MUŜL31NR!iJWBk-y0-nϜpebMg$p+5( 6u5gP"4V&L^^?Ŕi-z[(%RL nqA0tCɵ,Y1(Ñf8ܽj[h#{|5ħpuuAߏV+-:鿀i@v-F؀ՠ`Ic5c4k1ѣ!HCՑ{lE'GbUe\nI ՀYRɓLn˲m P1{֠AeQ#"o8xKGl45 ǗRJ!!-.tnmL͖iH)1Od:P̾gـ2=Fh0!zrJA+λdc,i83,IR"7n0z{MŖ?aBkG)#sL3S6i\3Wt 6*v@.Y\.ؽ ! (w^<{ʷ_º߽ͪҮxt#>Kn~@HUw)<ӏsE{\\qϴsRl0gVWyxx89b\{.3 J^=Ŕ*)|񫯹b>3|)|ٯF@.j~PO%Ăl[hV+Qb[ginCc?[Xa튦i6uri54ХDΟ^WaZ)>5K?Ƒf'ag~a<ā8i4--%ئ!(I N:p0ґ$ZScb8h/nP"ey8S$(9I R"D(kKZq,K𢠬"я1(mFV ZE̔<y&uME+=.XD?]=QXUD`b,1(%43(mƪRht™%ui22dnꦀ{2-갨цvuMB`Tv `JG16-}^H`7rab #Uku+|Y7mm/*I)bl 51ZU!ږxէsϜk(4}:s"Epβp9󀿫2H1st1Ctw~pt:d$ zϞ_s}+sO\=ճ+xǿA~9I̾?|]".<3z#<J#p77 ~dG\k#Ϟ^󰻧m[-%_}9?@f7kTDXf=U3<ɰQM*9e,1~O#WOp>ɳX<\c3|?iQo~qϬKVW[TtP\Pgr6 ><EG=h0T2˯J&hWqUY04/">f4f1&.Zb;t2zE V.V8T] 3|z_%{[eX>ypx% OUK?H:N2c6l2dKgW ^\=̱P?D膦*}Bnɤ@;~w'=~:c\[15a!ViDUcX}фI2m2ȁ vj rA # OvAd<)] H3Fk? yȺeJHuHmE0' iG[reG=bIҭyĘ3fA)NhcѺf+})AmZr5 mh%FWan1GdalKIScF] 'ic-#1R璉墩ěǒ8T#Ś5X#qFU[n Ih)0B׮CQ,7Ĺq%RZU-մVQWIW몕ZBe[btvbƢK.p (#IIRm>J*!EjN"K.<׫])qCTOQqvkYaoegd t)Gv@)|ݲQ(% 3n5$̤ !W;ӭ(a&4 :t 5qA~B:"+,)MVi%#@ffrQf dR51U7@q Jp'kPHrA&8}YCI9-WdQi)\C~:V9DuLD80y_!B"4:BcTJE%?}-7n RpL j`zᄟFtcLf Di:(VBA!,[HaDZb&zg>vsAxGDޣ%~x} kխj8 RZGI LF\˘#a-Hy&xT!BDbϠ%ցLqħU8#̜,~`Qr"Y %Պ> $t)9/52'ҴH(H|,Z'p)y4QhQS&NJn*|\`;ԢMNJEiqƠ)0O=i:ѬZ0I F4MOGU:;gjK{p5>2jg4P+rVJ&LQc-qE3M2ys E]lx8<}r׊<⌡Ywt"W̱p#g,mɇwNe?]^~;bX.-F7gev C}zc{J.ܿwwLÙ|HӇ[Oa yiEm-C!{8KN3 O<|87/}^|}/^6?nsMl/onyBdb O3~5t|׬ W7?rss7|G͊Wܼ|J#zray䆟n?p' ,WKǁnfPgU1LV;"`\qz-_/ VUAL{\]\|bp%#k Þ`g\QR?~0pqd%yx/^6KwG?Rbz,IJYtӁc5@fAYDd?8P&.AL@] X'R!F6E1ǁh(kLkNPFaۖ0U ? =Gi@jA?yKbHcp:'b8?H4laMC84AB I$dE BhfS`<ܣ1\Nu Y!́=Our<~Zpf}s],>RPIXH^v4͒cȀ2g:Q/[bӑ * $2Ie1$p "XISԹbq[Z$?}]uX;U1b./>Z1ᤡG2L \ksDń+iD!$<jb#"ϔ< =.69#ER!zs`߿\A *%4YnIw$_ȝ~˻wog-˫-^%+8Ό3xqMul~x_So鏑O/9ܝx%n-7/o%rmW87_p:| s|ݯdlh?/?ch,b!q#N|`ww\0%zw`%q#e |7|Gr8y(Fxor8yVߡW绿[Y.XnW|o%|LOğ0`7/6-wxndzO)r<ğN,.ܽ^ҭ}H!3:/j@Z5btO-6Ĕ@i`L܈Vv"xBP s Yѣ^d21 UB7C5x]G<]Œ$qB)\Z8 n+*5?Q€}eYWRG'фP%ᚆZty>`z'ba)%DIKRGR+44XKx$YDfU*YL5Q^)p&gj%+/80HTugUhRHݒ(5QV+?"bK+sW1[bVaD38LV1ӀBHm(F1"*>F2D2gZT4ES_·Hq8!J¶ TEg8DJPZ8dFyaBvkRhgPi<1-~k.su>hYY< gQY$Q(q0gkFۖ*AHH<}1yOqbx8nT&N=Hb4FuhjQTHZئeJF~t\%@E,qu-a H %yb( PBV10wh#8<|v]c"2<|Z*?ݳ^b5GpBpvsQRæ=P;(JC S 9B8%1׳v#VgT궻Yb4|]LIe5~wOt?%i!Fdִ䩐ruHiMR/Mpj[Π]@"GJ FxO3]%E-QZE((kY+d(pJ2v,lcP\1+Y UP$E[8ڮChM谶7 ]`@ˆGV HdadBQ!jF4Z"FFT* C]];dj0"{ŢNEkZժ0F*D DDrqZPZ@v-jG =rI&0R0 s%̅T{L6a3,1H2&gbnIg\"]Vs}Nu"rՐ^YYzls|ړB&0%MCPd?Pe8lkЏd)g7x)%L;gC u}}Ad,. ^:D7kTݏnw~Ӟafb_߰tD7ڵc;1f-Y83+3>̼O[Ul6w.$4>r,HiBYx)JoGB0'Obɏ?ܡ%n;DVX!G;=Rl/\?q ?%d5H$#?}c<3'q$ݎtKؓ #RqW?Pew#vi8ӧ̮0~vgȮUq̼yo ?Fw=m4ܐLS߼AWd?~ J;?е ߽ga0q:r.;y=`0ML#M8?|$RRLӑ9̤1X(|<֒&#K~ͧhbb$R1!П ȿL-AfU5ڐb?h{ӶdQZ9$tc@ ˶LGeG)#Xm@+, "%iBkA֜wжCB̅9(g9>"]%mX%"PbFT}))ղըPrEƞ|D%vnE)ʂQ2NX(eue{(ض#S*vk2")ǩb!1*UTi=Y@JHגKA[Qj} 8Sq '!]# {T-)PRqrIyBEB}$!SJң![! %7sKӴտۧ8YLJ4UB5@+3$0FB ` L *+3"Ήcoۻ]-3ew<}]V/Rq%Ky 8T]ɘqMO *+ FhL”^" V<6eY$$˗ӸgCQ$H"5L!w E d('o;5@ \ΌÀg2@%X] 8Mk8~DH CkS%c}fR*j@'f E? rQu^hLǺ hztUdFSv]uֺxY/JX2 H [Hs:*KX/(k) 0J6P~ B.з0@.$iqHtoT0[!JV/iPOy`WJ#%$ Ҳ'k[H2}D*PrB XSBf*UΰJ[. c5{lAZb\=ε ve() KBarO#aĢF Lg8 1ZQcn~%<}CւJճ(!9=џ846AzCV /+vqxa?s_+o8g` ;pQw}m [[rdY-(Y zMʫ3|it . 342.+ׇn? 1G|x#I/՟ u^pDaHzx8=>cA-_~8=IQϏ? S#;pPČ>bAL|5D(>TtiKNg5gb|lº#ABHCXB'i0R$# 8A]4Z3Wcy_i`1[sAL3!KDW{D#1Ҳ`Tjж>uHmۢJ"Zױ,#Rk}B u i-8ո TG*V吮!"!(a1]W^r9LQ<:H*K!B֒(8cư\n1i(Jd$Eo%P{ՁDa^F:# 3rm1=y%J)hE\&rXѺ*53M2upG Ta4BY (uĸ I,ӌi% H\s֡{h9y ~ @jWʲu"Dv D69Ш1`$ɚ)dC-t&Rn8*6O)tat dZJ!g5qYqMWl2ae&"E<ŵbPLM>Qv#dRNd"% |pD1 )N#+mYSi6Qa=as{8>"S`+mhmĖ 'bXP(mmPJڣNjeHFҊ5f!@B lO"ާZc /RBsBJz\#)d`LjS/4}[{LGX逸vEV-DvO#jөI#YYe@WYF;6iZ(yݐ"cX?覩ѦA6=KNd]qtB ʂzҲcD^C|4 HX 8_MG.5욎#ljTKLaP˚͆Vrj7L_WOV0loH%ӄO kJƒCY=J@B US!%OJ!a<ϙuչҶ0bx|t=߰.+VYRZk49%]Gf%eMDAZ[cDrTcB Շ}Hvb"+Y!~}5xJ&e fM380Ap-BTZb9,ԡYR8b m(kN y蟿'O\Bnb]q>=2M#JNCbBa9/H^J\9/8EZKFˑ #:ߣ~>QI5U>+TXuojto& [ N,G(ez -BkdciZAWZ)C讞$̛+I )oC!uEJT yVIQ22-FBk*dyJ]K@ӵ.P-kI'w~D35іP}*2du4Gv a‚ȭELY#`Yf4mNZi%aM41R(%\CuHYWnf.nXSl)$RJǴ/$$+-\#YB!%I, )O5F nZ1.B6ԭuPȾDЂ"T% ARz@]S#J`_NKv_0W7.$FkZD\`#Ǻ( )* L;C HmЍkm n1C$O𱢤c[,PZ>gh@+,DFjj|(HT%SJ?ybm[H4Rd檂el-G6aGFH<]xvs2ixvse<Mx[6w _>;>?KRͦc>^8oNF#i4>̏3yqbfd|uib_$!hR!lI!7-qXxW|u xntnMgN_lmw@pCׇ>^NL/z{EF>~Qx3nωk-z.¸ i˙P XWD0o~Kgz.O㴰/޼ffx9w~ 5?-ƫ7-X~ǏC ğ x{GwuE'e+n>Sք2g mֵ>©rM8 _% Dee~g|_< 4߲m@8g-s<͋NK=n_V>>|!LS_s(i)Z BgJ#i[O݌r 儢fi$Z\QRXH Kb̺,X%I<=؋i(J!b&2-a`6;rʄ5Xtnkʵw_Lٱ3BR u%h*sR6ΆlƱ>|b~B1&mY\hO(jDB fC{#ºh_/ɮԿf)wk C׶i-I*q>X S=4Ŭ6 jWHJ~==B+ W"Xni*FQ62MX32gfsddFUsGY%F4}sG(u) T-c dn[t14 q])b$ Qj`eVuMƲP,\_e!+n_#JUPhgq"@t%*t9Q,}WivvGH >'tq?;+ y]%NGT"RK'yΗ;?|ϸM;^/?8Ke)GW+>՞ۏNY|gsq\G>8r^?%oX~CFfȲN|H' %?p޼a&pGv$%E]s']/%UXrD~j2#׮^vHg|w\<pxϳ)%L JZn?߂ ?)E\c[YHfr&'{Io ͎l$e}?1Vsf XV2\]&M3qXic ,~M#'[(!kAVe:cy1ƺ> tͪ+gEaL55gnG1!lvkd!1I6/Ij!@=x$12xruՊ,Y։e :CfyGsrM̞\Fg$,p${dG\QKI$-Ƹ{b\3 9D.HI}s&33Z[\ߡFJ'1v!)}Ň@oHaAUv E \jP2EZ?ԞK\c5HR]E ~٦ϒsH%t-i, Y%AIHA ?nwW% +P"'uMS8VJa-3]RJ$2̈́PͶJA-ԞXZUA-?p,\;p|8|p|~7LGrd\y||D^i}z>lx8Wċ]3߉.~/ <~apw~{fK1/;әNjW\*Fi$R\Z<5X06=Y9Nd +Jja^c/cŚ#y1%1/'lhS6U,nZREj‚)O۠ y!_gJtO($m"#Qn31Y/q1i5\$5A tkǚz-Dl73\m)miΤZM3{z2~e,\KpjC(+ِ)O (J҂µ-~Ēj$N:GG$nc>ТJR,xmK->I"~8rFZRh"͖WD $_7Ei5e BkbI4cU%u` EFDhBJuѦb4d$[P(d$VIm Ӓ\e/CxRiF" \]W 5[F!癐@o:DH8-9b )@P#g 20# $jT Q;!ˀ_&JVC J: B(E"Dq:u]Q2,WO&lJ݀K Z_Qƒ =hgȩ muD*\K # ]_!am˅֊}.l-AI '$ڐG* c@n:Pu˪Y!)RF:epmԾM&EHOxQkD8,8YK}'.Ld^@tHQqB)JĦ)8Ew8c)}!*iUΡ,iazAhKVx_u}8ʹtuB0N0{kYRdrj,83_FVLʺZ0li)CM %<݆^|w;}2B_|݋?-K_1d_ 7o7_V^~-e߼`90M;a9ȗlݽšq|-Ev|zxxn:hwH](ѐ避?DžwDu|G7N!HQǀ4E[ ⴐ %OF"JZ0`gH! r9P6kFsa>R#NkOE"D#J u E5 b$3J*2Og #2%IT̞9.(Ynks 4ߓzf=o^}j, f~DK=/û$ ܪc0V\h|ݬx͏yqoH+yӅxaua<4#DizbLtB. ·g8gWJص4!U˪K 2dpAHsL?.G0.MKc-(2l<~Ll:B5Y)O䴠j5MRõ^d8R&ODd?cW[!DvxD\Z&;%#Y4 Q*P4v00>buOI'LBkP;HWck/da4N7qB5=9{F2H밮!{^wu[q͊q>᚞l|C}(_Z3{ҋ/0F!]=5,$V/^2=?{%EbX[*N+-v\>y^8J(1R5^JЩw,Zvq J[TԢf՚h-ˌr\*WHeADAL8tχg8H񂑚b:4UTFۣɵt:ϛU~ 1m* }q)MCV)F :$RW|' "gL:fc5QЪAova-x@ZYJTס -(TTЍ#RƑIQa`W[L1T3Li b$'D#F׮ rРL{2/`8(VFbgڮGAeA , Ʈ8B Qrh 8RzMLMGg-Iߑy*qiY!26P.]" 2ֱ5NTipj0J̄8jxzUB`a<Y5HY1Mh[R\u,5އJ PbX0HdNiBoj(匐 Fr֖)ݚ# RȮ%EPAdJnM8r*y&XZ,(p ne0V5: ,8Y{R$JCNAX[/BGB fC* M"gȪGY K]%(u2#B*J/^RvLa)XECVXj 됢 CFLFE-M{ $ O׿$˂ 3k˾HR$ Izk⼐O4k4qJ4%DJvumפ(K"[s!.35,9moN1?=ǁlY#fgZkQm+9L̠bޱ Q+ ;VJkd2i 1|D[-\N=rĮ5Zw9D׭:3})FT0/cUS :3g?#t*| Vj,12$qlovKΗqeF z0G[ӉMׁy?W:`ݫ0:!Ӆg*V(SD?i0b}#a-g=ˑ|OqϗoW%HN<~| -yɟ?vaswom54 9rIӅWw0aB3xd wwlzEA iWﶌǑݛ;(_~7(סByycWtv{-/+q>#Ciqѹ0/+:k/1n<'?GZGzaHf?]ȥ_c>gY?QB?]COC0 $Lb+*E&*,s-3K-*bD!Z7W^!T d]BW[mqרR\IREI Y/2 8ƶ%(TcBQ2͊"kHM #a8Â0yӅzCa?L#HKinIC[/ 92 $pC$$Yb@:rE]›5ZQHjL@vuK)efh+RΠ4DazTZ*|X . de'ڐI~`Bą2%fn)si5K+e1 ÅyU'q|Rq&Hm Bie^ڰk[iܰ$RPt=Z*{Ckz(hۆ'rI("42uWȄyq 4t"gjfiTQ%=F iBkm+PU i9>>⫯H)&Xb!WESc+\ BkPU~(D 5U0JFU! QX:XJkpmu~C=VEh[S b U)k)Si8^ڢ@C#дz="G'\DS%kTWVF 9s>N6~B Vxj[TpF2 G0%9{8q%,%Ex [9bui{uc&RB2BnW$9]N*^#YQb7)tʥ@3]ƁREQ0ƀ,qm@j ڠ#H :y()PJFZ 2BdCI IStFcIԴI>^AV8(Jk4r52/J먈g?v6[q@*j[=:ҨP}(W臤HH\P]{2-iXT)ʴ5%-vU;9Fv~_Ũ=* ?ctg œJFPҲFJ#1 H)%-8La+qט`̘úJJddD S6O~*LvmW~&" g[aCH|8`0]Τy" "`-M%n{GeB 7-_}CBC}kn;΃Rw/̲E2^HٓSEO*,^R˂O=ؒ _~cN}Y'@߷ 3zm|_0nh/)R0~ Rxb yoݿ3GB^"M3<1xO͂^xxb9SdfۭLJ~ f÷$i_ >=7[|+3C <󫟾xtxf"튝Ud2υV/^/HXe٭꒘=>gp,n@44<zwU*wyYRr?śלN'67;LgӭY0 #︜N|u#idk=m0/.~81 ,crB(Ecq>@D3ضU&UȦ#ZQG7m]*wwNKH4e~7t7/DˁiR&!D3ZZ+$i pElR5oMq,x:Ո p|b Y&ϡD-}tfj[O)H4 ~i( u X^RS"oX"A؜|GOIÈn;MqHaCqd<4%4W#aCg n,&2y\)M$<3b!IKwHeI9ѷաt\bNqĹ95ߛ-]W~jK5{lh;TdOj?#+ LסE* .x_/'(EB)xBIMiYb!\cyz@ƿ.@," x0)(RcFHhYq`'R BNE Պ"Y(>fZ$ڑJҚ3E bzZEt!(q9c\9G'Q{24&GrP4eI?Dov!f" - *5Hm DDQ{ mC*JUO=s-Q7U]6 i1Y*8h+C7 e_i^Y֍]h<]ۑ.{iFڦ#Hg3=i^ȉzˁ"2J~o_A#(YjCfZ<&&Qݚtl?< gۗuKi͊aO1 W(֖e1ʐ> s! %gbN -V8"l4K267+F[PHTNFե}Vc,aH)aW i 9HE@TJbmJ4[T.(jh  !DX0ˌO+L\;+ռnd 4!,WxD2 xB9ShQ4+͖%sXe@ yhn>ti2 S"%$#$U AO߾`>)L{sC(#t@-Ro|@T))"QtCvTu!IquД rB5Wi@;v [H W!4,3J4v+rw53%yDYc.3pmO۸,nGg3Q4 n+zE4NJ;ϴURp_B8[#eYw,RI붖ߕ&$L7w/ZX֛ЭWWw2͆"'l@Պ?勗^{{nn޽'G^';vt'sb| {/sy՗<}~G#"Yz~zwϧS??E&'W)/k?r 6,,qy;я1r|v49z޽{m&0Sns^G91Gح=t֕Z<R'Ȋ w hb XSחRִw/2cEzBJT2UX??Th GdF+x.QYAuq\pHM'iE+.5ęu4hgV gYAPB.i|-2!,t6-)Z.Wd?ѵt JvC^LdaY{xs\1#J^qDLӢ#ƄR' BL*]I*OeaG6/_WW;D*޽4 jR")FrhBTȦ!#PZ#e/(ae-5m0w#iJbږd^{ 9D~d?c&>~b~Nޱ|c-Fqiگf,x[atsqv e<GY"eoj95u25f06->l^"yyIN gWG҈$iY,$Y|$RU2qzڅ&k`HhɸG 2NHi&# R7)8R*PID_Eݥp.X#!/Da!1KEJ ES H Hk>[ZbM~ƏCzW!WɄ\3 z[/Jɿ45^ g1M_aRc% ) 6W3BQ~OADY&1ՠEi jHWB n,m dt2OmFIMmRŎ\Qn/#9Tۑ>X"&m[2b6ĔIصA IrĭVd.g8'4H~uU|F(f) SB:tBT8]@)HDVhV+|! M-F^F֘$F (U,hp:v=)CGڦ'RBI>0_q8]B^s^@r)X|8 d!U4I"kٮ56TN%kT͙P߀i-mELaV2U[HkY3: utm3=9Rt77Ogtu 9G(n#\' B~JSv1yP|QB(MoHlP2BZX JWj{VRH'T"ev Dd kBZ] O:iR U6dƮnXD?Nۮ tC[e]5~X1.RZQ]<GԬ7zCӞJ 4%`wrxA,M==hfP4R@ɑp9@HIݐBq%Ot"M3W+Hi)ѣ-D_#{C"! ̟Qa[R9% /($BIO辁)d_TL0 ͖<|EHn\xvD810jCRC"?жw4;B:"%@8̔t ~$ ݠdS/0PDa˄)XHsyhv[DXҌ~h?o,Å%(d>!COs,D8^~VjL~4FB#=邾R$Wms~kR*LYHǁպqFJLxL8N3/i*&Y ,aJ9NgZb+N=Ri|Ibe T6k3o宿4?=S{t|Ɨ+v=ϟ.,Y '/9<=/c<%ȔHqf.c[V<G瑼noZ67τ_&OfױU~f8Prs~뿬`?rYu=eDJͫ,lpzm1ra<βWㄶgv5R+ΗmK4,S(]X"K %q⺎H)q+Oϴ21KbswZK89OG,=]S {#s: `5z9+/m+0 )UYm1pB8ӡfF4%焵O$QY€i{T?dDvw2 q"!Ѷ8Ñi8Ӵ+|0#bD[ Kbzܓ CB*ˁ8Jַӈd$3Ķ97yŊx-O&y. |DiGO0ۗ27&4l {ekWĐqBn jS7ҐGB<-;{BӭY|Eֶm#ͪ"4Uвԃr>y&-#]mˀ,״,׾V Rنa=77P!R!duPnePH*T&,=8!ԭ8bLs 5V1z9V ؐ+ʒ&J #6,:}O&(p)4ސ3|ZG d)HtT/Jc@ P$`c9<h h+t[}XEzOLDab Wr d0v?}ݐoa(ahG 3-b8K'wd%VxXma?'geADK8bdC6凜ItRXF ~`Þ=#Jsd6ۆ;[}@p0/ipC=_0Ȫ?܃ܿ! wPzMdv89tOBϟrzg8Oi EjE\ zv@p$HЂX)8sْEPa81L#/^dgڦ!?F--5[wX=سVnYB93\.|Wq&L[9O"$vW.BH'iݑ'8\uWYN3!J(mDNrԭB̆YKёC)HFS iI1@mMtEt BzO8tE2/uyUR lHc s\1H򒦵eq=MB¶X rQ-C!ls5ePMΙٍSm!严 DV%Jf|GF #]xW\K ,E3MUƾ[Q%T5L"euiLH6-9RoJGBkMH"uȩDR"D]:Ѣƴ-/Xm܀D0M?)GXѦLSfr=;;|(?Mqyp-ճOO'DlKSnj]M2.rk7uU$MSQ^8=C4U[!Bb{L(C]&RݔCODZ"҂2HAkB{P]D-)G)CT[A]&ӰpǁJZb]m$*m\!X9 T^!4nZȪCʄT #=Z5h$%4HcXa,-㻷h09ؗPb a5bvdP,q8Њ $mpB4,JPPwX)drȺ%nР!.nu( `Is5loTJx~*.C㈌e35^FL] xPяX"]]\_mdnnU|l !B`V<`V c?0\.ܾ| w]=7Ow?ī?O>WVtnnsOܽ}?|Ͽgݯ@HK?` 3ϟo9zoa/ŗK[2'2MS[o5www,y.=M]zɻxcLXc gJI\/^sw2/lvت"g~g<\q:3_`2kq4C*yF۲UEXF!'\'UC Sa+^}HL?guRUER7U@_LG-YXB? + UȨͺ`tWwz(׺FR%"$~^t~%IZ!{t9Q="?h3qFf-YHi@ ڕp]]3G0R!!`@HfiY5(> FW0`t~|e+<H'Wt@I2B\+;Rf 1ҹɹՓ#I~nZ xǷ,ӶO1V)K 3<m1uGJ-13yLe"36mџڰ}C{Ҭ7Wغ.Ԝa5h yPUCwbr)↔IL5̋/t#pB%52e~DZQcB+C?ygx3],ct& j3bus^s aȵD+yd$v˄;3DyJ{,Vih6/y ܈j7~\`or] fF͆3R i@&dUSXַ|e\ LeSV(Hޓ?_&U]"1=|@FkY_ĀJ&,THy $ Bd0q+A\?V,r#7kL1c"E-{R K:4<mMֈp~D b*4\Ä'SUU*4+t"HLn{W"&loiWd22D*RdeBmwBa;**RQ"" ḃ{YL6sDHO4  0rwxρ 62f_F>} NX"OYj% VLkXx-2Ir88rmr1mwUmX|M3&Kwif/nypGLb۶Y԰ݭYYj?#*]1N93+mOwg c1-/>U_A4Ox<.(g^K;k #xl˿7H? kdI~sdz apdM5w=DƇ9loe9?yqz8\n^ĴM),WkUGÁ[ۆt'Lˌ KvƑp RN4wGD*=VOgbK鷵mП?p8R jU˒_C) -駑w?G|GEd_~Oyt-]rxW"o~zəLw{; ;BzßZ 4TbD g𞪲nغjԸ;R!vCĈ"+M5yx- ɑ%-#hj*qٕSU#MT{T'PgAaoP" d,e$/ ΁ ]5<0 mױs꺥iV7Q @za:Yo?H1}"Ʉ*D}*DQW%R"s0dcB71gKQdps(HK(2kˌQX2dY @i,P^Ѕ!c$]rP?k4nl[1B^Y_&M3PIpV y!6+tZ 7VX)P!U֊2B TNH]CPb{jSQoJ_6! $ @S( BSW 1z)#RJ QNDQ2-ޕ"G1,~Z_a-{j0qM[\øG'[2q9TH^ӈ0M"DO,hV ԪXPRI5bF# &R( tBȪ];B8MK,a># rHtrF0#2iiPu[ӈ[*$J(5&YST)r&>vboV#n6FfHSd Qby A[ΑQHSSwkԶ@RytI hX"Zخ# h2|GpsEl6(GY2GjSXa `8/)r =B--4UӢtqB0mJI .QiCeB=sTMEv+INRndX$`/tOZ&d2X0] D[nyt+$1Lk`\:| GIZt'U]ÉǷ%'!rP2‚-VT!juTw,׏=V0ӻ=em[=߽ɺlbZV#9Fi* t!2ck_o1k1-5w>` c=a,ӄ02ﺎ4`h#I΂$=+[emFs/]!\g/=*^.eꙥB+ ~@fp=@`* ^\>|DnW<۴|'߾g#߽a19j*xӯحZN۷}@v~*>l5?q\X٬x w\>toirzJN3q,@H􊟾 6W<|6 bx:3tmKej\nSN!%zInv;d[3OlooV#A ɇY|OqFbO3n]q|TpgGadt\gVZDfyb:YLf:_x&ጕeJԚysb61߽҆a/’ ̪0/#hyT;XzH-jIݢwS _Ū[tAWJ$4,x>Mf7ehAʘ@/NKJ>,haoX>eGi@7!ۏ{8YDDٚtGun 3'$rfF֌+/C% rW&$1nY4bh4D#0Z@6HJv^5 RA]o RS*Lb.B djRb k53 {BΘn K( 2z=O?#G0F[Pu+pC D%J (F 'G*jQK` XI"#.#F5a;6er ?#mc_1#L c$~h*C Dj]}Rb@] 9Q&U"r$& EN TM<͆3C%@0䄌Cț+Yc R)rd&LgBԴW◉?4+< #O^|WLӞns[o!R`t|9.8۴d) [Lbᗿ~xi$8UeWo٬xv=>{0(Wn?xɫ2tG=ÞOW'?+6>t8{>5eDWZ),j^Jq>x3>{Lc nf0sVUh Wns>>dzUj aJ1XEI${MXRr7v+RrLfr ]ӱT0N'$ZWȬK DѸ VYe!2_6%^NaATn!)QVhi0Z@*ѦFLB"eMjs[&Bt+/t~wL~W\ 4?Ҋj' ]X<-prG *pe,~)> *Td,Sqmc a>ŧHcD5qpӄъ*E(8i-xٗ虦0(n54qPwA!E'|S!ȥxdCE Tlz/=?jpxq Bkte#D!z `Yg/-q}XVHJ*HES*"Ayɏ1"!I NH8n)z H$"Jbԃ(0HTFc<-#)L暤k@ȈTnKVc4/LnCJ(reÌ#R7In!\,qT>Q 4YvHGL4zU#E=\Tu|yKK@7y{TBmV,på4!:GRhې)l% YkLjIFSDČLHm̴횘 Ba2VHʁ(3Eۮ/+:]1bv+b\`J1s~j|?^=!2!Hm ;,91 aJ* yIcFKX>ù@#XUiH 15I ФC&@rl6ѭtesFW urfBۊ")?,@uM;GfwOJkNw%nP֠ǧ1V@"a@XhQB"|$qKj{KG -TV I8Ԑ|D֊#nCB/%mT !58D3,]Nh=O` ޗUۊVEMɅ+ n&Ou-!Nɕ: qT !EWi*DJİ0kR’<:O,Зe.Nr>*Z[Ŀ$rAL6r@fuGJїj F)HaƠD$-% wq&fy 5Z>|-JոXXjqҢ_m- Ç)(BrWO3'/-[~ L~JL4htcC. Bb4]i٬6,)1$ kxpg/^! uDix)1rt͚q ~{Owᛟ> kbeA&k04z~|RyBL="$rcp96+6?ͷЬ =|߱8ys{>w}K]#r٧/OxǑV,|yy7| wg_<3>/?|\^V<U2PGz[~r?J+~-nٽ÷o9OvE9μ{Ŏ$JzWco^Oûk9 W|ǁD^?ƱxΟ'_q^&aʁÞלp1xGrS3BH8-u;r>Rc! ֶR/2AJyyGKV-I9A*h$%1 82C|q^K! "Սk D*OupR$zHf*NoL숩 ?DKk,닫uKNx 5ON5a,h-(b"sE_HQݛ8jWY*M0bszvFBQ [c 9G(+JQH:m;Lrs-ŏPPUJ'RH+Jp=B$^Ȭݚ4ONYckZbmכ2BWR9,躦m{O:TBQ Jði,s漐_t[PRĹ#VK1I) <HݴtQ-nE` 20DF%BU:r 3Vi@{Oe{;Fb]k4 wXI'TK͎(Z 0Pr&5 1Ur*3ep n 1RbȂmyY'BoH-Km9zSAyDR8qJJtZOhiB#BNI߭?x8texRɯEQŊ[sޟܢDZs">VPWm}7~m[|aȯ~s>~d>/Ln{Zi/Xr;{Ǒ϶g^k0vQ8xV$yդ9|/x럼~B$ׯ_s?"ɣ??zVmr<9܎G}˟|IH0_|\^p8O"#϶!2=bŭZEDt:syqA(yXo7!ry5Ka1P}Dw8p^f||k}p3kÞp<#t8r K\A$zhg-#֏R V+ݷ۴q8^ "!D3hWAB4%Je23yİ$Z8׭'z]"9`ێ>yqHsq#1eJq{\k!X͑iOhR*NXr(kVYd,F#-AGD1r~ BdLN'LdL# X@Bğ?1RqFZod&i!:}6 _@ BU'B VP'ȖWտ'⼠Ew+VH?sy_@XQ"kVϮY{n] a2 ;'1h OY]ހX)dNkѲ"V%kZw-PK(I  mQ)!(N™\$߰ Qv9{cLE3cdЕ溞yj޾dԤ Z TX3FY~T>3ܽ />e2ґS4ؘ1DžDԗ_k'Dzk\T8V'BЮ%P;"EP2hY zS%:gJ)4 RE.*+R( :iϡz(!L8qAXܓ4ীv )˝AhJh%L80 PZ֗4KtoIh1ns\BAWYsblB'!XZүHpfZ+°#TLj)*Z>߿PmSmL Q,j=O4M}: U{(LTMHia3R+JI[xD,) EHCX[9pi]<"r2a0HB+ÏHcVdQI=Rgղ#F*i DՉsIV4nKӑ)q41ϜJh,Ga NJUJL{JQ(L" iEZj#B$4 B_SJ(R D0Qd{ aF mmuA<͘uOޑ0R:Δ+pDMӬj1F4qΰxaSR) f|>ҽ|E g}uY7KbI3}hW;ҶR|BLjrY255 EtB: E)1XkdP5n€V :Kٳ В)tfF1dSx<5 IB:?SzIf40unY5ReAQq:sqyo?pw[Ɖj{> P2 >r˟p>V9x12ߟح7g< \_^q8홇i@[c ILȜ'8=<nkDN+099ӯ_sP,>W Hw4[n7<{v~O>qxoޠn_o__'޽-W/Dͷ I~bSݴ4q H18l) Zqw49ٺ]k9Ϗ JÞ_2@X]@)(ې@@ƠeHbA t*/'tOL͖ZEF9*,vK.Y jlnO &Ό!~(u2ragʸ\RaOD(XBxZr6GKZH #Y%#"Rl/m%#B);~{HA F%2 % Jqϯ[JlvW\8{j]çwϮH5Y*DR( aiCeyA)Et'A5N)?ܲˋ'/e?<3~+Įg~w;}DhIk7H)a~X=Vܾg(=4ү-4 x"{(E?;ZN{)>ag;|]tdկlw|w4R:ċ PaiIJ"0Yc*a h!|zXfI\&֬\UA*3TIpm$YKGE>kW(ӢrBK SJqAJ~TNq1~%ep$i)~F&L%RʢDI(I&(fSj1n6k9>Cc{ܪ!@`Ud8>}~!f0V9'o}nw(KZjeAX[2*~+fV~tjP%ϒ&lZSЄL oGtS:d0Tk)ĩ 352#%P7uFG|` rF# s. k@[vREx7ӴbP"#kB5h\)L,u !dEu!#n!HX\׳g>(P#ORp/AP|[i` FKLȔ.V(!.'d͊2>4s$dlZPoTK6+T0)Q|Dj Y:* "F%IJDeqJrhuXx|[sHL f:~Į.mxxgY&n8D"j H?J A LB!pMs}#V5"T7BsS\YFHbXpq8w$yǩ|B >.H-Y )5KZXga.&|]8}<)FB Ge߮1R"b,3"iә2V,ێyQc\߱^w?~b{}An/6uabg~5w?Ә6\]sb&4S8]l8ͯmK̅Mx7?+g ә2-d9#mެ~r,x9?|FR*rlq'闼5D6kiO`W7t2=`v3Ͼ|~yEg^x޽o1yvݚOwOu?J۬){s>㑴}C 6H-:0aWۿ!wϟn )c+ۿa}cG^<=wM˻?o7\|W7%4}hS,, _9'u?%+GZRw-´?It!U< ɣF6fE6()j+zTPLN1(j9S%.uaLGJ'46,1dI!-AևO#B"hWLݮ2{1;Hx?($Nk {szTeļ b$KCex:Cc[BmrRVX'ʶB]W6FdXH{nCi1eE"B󓀓h,9'd@ 1{r?)#L9-Z˂.c~TAEҙ0Mcq]mQ"|O<~naFL81cկY&/Ȣ+I<+S(rRd]?lUh(Q_TBR*GkZi:AWB^6kde,Zݬ rnEr fk @c$j@!E;'Nל{T457zX 'eIV-vƘ39EROkڡlG3ZJ,Ю8HZc JORYHU(R(͊,%9P RMfddQ#%/,c-5yHctcϑ`,)#@3Ii&? `.oJ@Z@& uU,! eG+RD} B12͜*9bJ'駑%ƒ|A:9r1Gd<"?PGDV| _8}4/Ti"i3d4yLA5뚑K%~6Q(eY8 @(E Ƭ&Bɩޥfg|$)YL%rh!+X=M'Q *{HSMJO=tlH,&2!5DKi{#/)Jt!O+*fgm]xZU($0(~amQa(1}/ :lFږ8Oh#n \x9A y>Ӹ sHGKxPBB\&J*gEa 1޼vfr% J{pk3>#4w=.0Ot랔궹߮Yn%a6Og0]ϼ9@fy)rROp' N|fw8 tg?~"i[\x:bwEsyȵ|=\ڭxǿ=* |"i1p_7oq>g__o^\rzbGd)<>:˲8myb.܎)Wܤ$}>#03Ni Ñ(D)HYj%%V0RT5DJIIOh~|ijʍj!kY]5rh(Ev i됥OB R8ۑJB&v=8Mؠʠ JxSg)nV$UBʲ!zoYB q~E!hlrzx`kDWS2tX q=1콏odrI'rĸ`0t 3~vWIAMB IZ< Kn#FX!f-L.">Mm֐X{RAK~_5HiIE3i^m )z|)ͤb[Ih[?apY}Us!SE@ [^|mw82:+R8:ZhuMtZFm`fsA!#fI(l#@ %,%>u0mHTN#1=j` 9Bt+1U\q#!fn)%4L(ѺCMyB9|e~Aۆ ĹBЎpz$\rOiHH.5+nۖ/PdXבČԂTX[jPdAVD )DJ(cHr 9 Q NCTI#5R ѓRyʅq8 4,Gtͺ][ ~z"e.RS4.*F;iLY36k/8W R,s%9WaU6ȧ{kq-Qr(]Vi29 ݪqx!<)q\Ը|B-t |&iA.fHS(E?|Či)9TrPJ"PVo{yh0'yJUE}KI ebFdLmO͎p B@t0Ni )$_P« M}'@:ҶzifVE/y}@zڋnn8[pΘt>9%nS<||w}X謦=//lV Ͷ:TiЭ;ToytqÑ_Cf9ykuQBg /폨ۇ[v?%4f۱3Y[o~Y9~\^`a:yn=/|ɇibw}?-%$E"0;-W/_0O'ڔXӻ.:d?QocY=kәb̪[w}V7[$ Д' h0/Pɐ!W  @E]YSd g{Y:eSN #{{a;_apf>l}ǏoKuI_py{I^4[֗6k>tߐ"0sa}uŗpS+ Zh  NH>u'-Qf|ՄqDD 1e~Dg&tK&L#19%[,B%b(=)HiNn^n)#P% jRPZ۞==8(!Q]O̞R2B5H36gsF>d0__ѭEMߟX\K !R3ky%(ڮޝh--4J1e 87/ؾEIIRdc.$|X!K6s_7khNM)kG;Q9q3Z+Bb+3>ET""Dd.C-"ȷO)q(YR(0!EEJ]11C`\ t1!*h V04e }?@y]% xDR ʠ@^YABȜ ɓK!P{%*T%OZHb],vs[M&_B,R( nv"J/ Q~1TDʂT˕Dsa>JӴ  Eh~t8~0(o>W9pyML1%k6MdNc߽Gڟl,yfQXcK1O)5A KY=1EQO %[D)ybs8ttt%+P280AiB( =N8!B 8(Ja $R册~XŬ۷GD.Ų3aUh Z[ŒDұU3ں q)EyJYK6_ y Ḡn(h;9Úd& Aho?d->&z24UQ雖9z\lc=w!g(1PJƐU!>P&,.%fnBkGq\׼}Dݷ|xӞ冴;(Dd-Y_`͏3f 4PFԲp[<{;i=>d펛a˟:w/X_`1h?Ljj[^ku/^_Ֆ^-Y߼{OZP0v;TH #~??`|8py~'V=v=EKsdpb/mg'\K"?Z<>yvuXHQc9 Fny<xv`{ܑGYwlw?B`7+&Xoi,۞D=%KZuU}ijo&JcM7sqt?</_!}B0h%wHQ/E.uZ#F)DcVQ| q=VDN9Kf68mD!Jcl]mJnMOF ZJȶ'Iv $Rv`=XȅmP.z/5J},+qO设 ES'$ZR*(͚\AR(G)S\OI-ȧ#Q$8\,UZy1N#G H]p5ɟk;ѣ(RAfe@3憓 t@YA] EvXPB 2XkQj $7@N(ۓEQ  +dAJC>.Nc((FmW BD w^<[mf74=qYjiwQ#l`sV mtV^D!Kَ\_Wτ?4HQf2u)%k?BJ?opQ LSaR\2mא:lH )QaZuKR!B;H\pSXEr؂iVqYt-Mip1#5ӑV3+"R(EJOu%iY(ET*h)UcɦE@cusfDYnzٕ=G#I 2B FrJ=R )0홌]DTC, k;8\BQt%)%*ʕC vs53yRըj74T:]rJƸX!B`嬑B1{rѾbgp3EƦ-gUd+3(R44mxP)1=ޣM4)R^aA؟PEDn$L\܄7<}іx:"Ȋ Œ eX42U a bi6Z )@.` 09=#9]O>2Ho[Vw{0!%ZtmJAx4OX2@șn~1|`7MXks`/蚆jڮO3$"8WqϘwl=f׈ gJg{?ċ)たqbw:zpw>aD4΄qbs3p7wwx@Ux޽{Ţe8.-7vZ4^hMCł7yn^w_o*(qs.W+iD>~gO>a"n"CJ7,lwXc!p Gy5n=Xまl.pGZ\x?sa{Bȼ*\-qng? ޼4-w?'SCu-z>_Ś=i d`r3/l}d<tfn{_#Q~"$_ Մp,U-PWvD Aw Tsi_IYGD/("ySAʦNs?#ŒLu.9MBHN??ln^1 QzkRE+K.Nׄ$i6/3BrӶX`6~߿g%2nY'B%HP"Lujsr4 a>Uμ4heafYteUa4x7׋4Yd,.()Ud:w[nJm] )P+LkI7lX52%+θdBJHZk FI5I! D [ZB Uh]"kH ޶ >&r; $R*D3Bz #Q$H:mp;D 筟 L {yI\QE$5hKF&LʡRDw0W]"(Ou3HK'[z5 4Qr9cϫS sUXJ1ꡳiL0Td?uX8~ %)gdkhmCv EJR.c1E(MG=B/Sr!͎,%>,Ie1im DB05bHM3q0^˰k@IT)i4xG KxaCu E mrƅ*[1ZD5ฯSkܑ4ԋL*T[Moy/HDwͩNL\m)&E!%nBN4qpR尲/Qg6-vO[(- YD;$|Gӯ>0n۾¹-YnnI~ M*3 D  7H b܏h+l|q9Ѵ-EsԶ$\pBEtYJ3|#5;Bb^3r E-;`|&nKXNP#H4 =1 Lk<2İX|y|gW7_sqg|}?Y/o7Շw~Kr=3'՛O<~cVux!8ʌ]ui<2z-m7N' 4<{b+Ym:qj'bWV >0y^%;>Pr$Y ibqae:8.t]qiN="f* ?zr,ȹp|ܓB$7 #S<<=kˋ_}WlĒ_?ɧv@ay].i8u[ aJs_fGd!h%t42/kThJ#ѡLWl]NB.+e{.SM >rY]Q$gy&v5Jrz[r q<ۆ"$\t5"AGG|"ňm#|zÙVF26!BA) GO T=M$ǂb&ZJ[vxiL127ݒeHb:bNO@-aYBTOi$Q*TA4gkq=hILT-#'4B3S M)sTk )$b,H]#"j' 7θq]q%gU֒E*؊uV7D? MS7}xD{n &TgYݾ"%@DZ))Rǀ!$C@LiQ%t[nB/z;J)51VpB FnB+nvqi*1ܑrRHjI 2yBӴzZ,k/MBսBg$L,4{~C~A9sŷ6gPL3 !GtsD;@I`X9׭weZ0#M0 =ޣo^R$BNxrغ)L-Bʉ8w1̸IiG-M,RIW0MIJ1Q.ͧw$Jе grv7Ն?ӢnWlw;d,Ͼyճ ?mo37wDUH$O{6|_aBnw gwy8Q:}U-YgW|>XI[ X >nsCyڳx|8'滷5:xH#jfq4#U=ed*$R`߾Dy~t8br&L(rɋg7 fxﲝN)(\__tW;ӭ]O^c5Ԯ7wox:quq7q˗yƝ&ޯ͏ ߾;ѽj8UM)$Q; ZUcTĪPҔtµp[ $Ĝ>}5uU|\u$Sr,5jScI)"m9tL3m*?] #̎vQiqaM #YHLzrD?B.5V$XRO4CG 2B.Ӽgq=zK+t (ESG冔WsL%SJdd6 dKկBA5-E[ZYխQBb۶bKBLJ/QRDD t"@~,1u$UZBqD-Y#d,ϱZ"uU #7m")0W{A7k n2c:o7g[l⧉s[|Db ᦙk9N'Bb"YRi!1>WsHŢ^2F?3M^Di<%St<|WKzsMӷ;d 2c <'v؞#mе>?p0Y%{Zq3$O{k޽}h_\/Ypx.{/xzr؝PmGL_v5GTg9Z=G7=;b8̤8#8bdԉ6 ڲ~?\o}ft3ʼn=EZ.W=#~,=HNtׯ3ru?DOe}yŇ/wD'<"J&6|xCps\s>8Vۆ|`?h3?B#)rvu#)E%JD mJhu).JbhE 88,m%reU!ĉ9r vAإ!ɂՂGj %+Nzi@P%S GbwG<!ʦ4ônH\!BwLrzAD#M,ZsHDim[4c gQJR|F#~r <.J2Mw*_ ?{̢'Ntk\'L ba\_t QP\5vfy%EE*M))DHRtB㻿Fis:]}ئ~$OUkt Ze"gMT{sùW"e ":(zE_i$Bj]t#2ZЬoetHO4hU!"2?Ѭ7d!.aKز$T1+I#r^lDBZt"FJCy$h.yJ"ϗ'%Y Reu":lw;qG8X^]⬢H;l{U3g uAL.nQ7~BS d١9xK,CO !Q)XTT1٣bB"Ivٱ=VgiB O#qqt5i E)B4͈ёf`3J*tu\vXԈfikڟa'[3dQT94]dM=)q% #`+D"EhL?p&V+DlOH]] L03%͍|y~rJ)5Qxzm &hdBhS Lh[ {|МMO 3p $"iUV#n z;a?PFބm1 ?UJ M\dExZaef:ϛFY"L,aG$%8:mK,F"LjXuJ-m~#"Kboc%D4 bƚ CC~Ѐ :fIVZ&B-}dwDT]Oj:EH9MH-)2?}e8XQf&T/Eж~Cдkȍ!EA+.ׄ<5=9F⼧́"AFLILv[4AcA ۵ ~4Ls'HVMc݂ftFK A #1'2HE~]jH\XUQJ3łiayI?{w@Z֯}Id>yBrrCg3W5q~:ȹ'|ц䉡saprpPMc zeuB*]hX\l3n8 3~ˋK_o~S8lw,7%f| 1]/F+R[>'ܑoi:جIz9vqfaL;6׼[vw_h4gXBQ0֐UոB (RUDV s䔐b)uFB 'x~#&ILjY%`!DGu{QVRSɍXiYD5?O lCv%'.}ZmP(RۡuHpǩsƏ]P wᐥ"tvgo,9K@Ƅ4|jI9<2))q<ݖF g⺀\Bs:<{tw-*8tݦmHk7bEt[d*%tTp4c;%ň7$^~|<#HK=UDӌ:<I=eN8e1Ru%/f5!Mxiy9|6)2lۓ'RxӾ+RCK!!-(kYsEc[O"%利iK*mZ(+Ujݲs#: ;RƐ3y5 1NRDe5L9Nh"BJ/s =€~{}C{#ƣ伞ݶgh]u[W=/5oB]ޠu{IBA_*R 1N!K~d:ܡ/_JvjjjRa%H3G_z?xx#vC89R#Ow~;r {.aTw|xXT u t1+!&É/oy?@wsx@ruFn9?(^xI~ǻ ? c(58]^Qu$GDQbVZA:"Z)nG\t& I1ֱ=k쮯QtuI4E{(}P ׎,:wW(#JDM}УQL>ĸoPα--iYc޵쯲L=˺c4r>S"U"x30Z^@\H-WҦ-󂰚;dN<5YUꒉ@)Y„{)jǒ"^7?'x|,㉧opw8!Db93plЁփqĻ.7 {<_~aĺ| Doq11\\w|MR_1/ss)MVW^1 c|k4 O\F:4x95w{uEEM׀L~74n\ [B#7\i<_QEemJ6l7[bX0zCU7l! _{ʹ!/s{ -0X4JcIibMj8s^N8I{~6D.>oL{ъBJw:|瑵ِJ[6<Fኅ"Jp}<,m[若ɵ<5ELLJql_Tw\)aDqBy*XSUJsJ*;B0ڰiOA% Tdu\#Z!\Wh>d9tbyڷ V[߉\ڃr]YbŰryZy]p֢eC&%'q$sDIZuJ-&-Q+2'´jM{5#lI%#&vu]h4NP%N1ϑ!7P HEJL֤i$L'Q( %O6o[;ȩ]HmR(bL%0UP}Huu,U۳s]Pڐk](׃T'wmh"%+5-@+RefBhk)!QBDHJ{5hs$Vqo}낤6ʶK̺P8U' h-5<#ĉ|OJRKgjO %i6z:Q&W6 S !dN=s<3sA+.O dR(߳ƅa{MW;CMJK,DN!e5#GֆgM)=VdD)p{\Hbʠ6AO#V[LM,gVtQ P&6nK+L&}GWLߓP#H͆G[M5K! Ls ue^J ŀ;S*",#%:QƠJƺ n3?" M#jӆV U|U68 Dž~e +V[x>Sras#KHAf_wޓC-g-¸XA*N<#n9@ i>ikI8??tAJt?ptE/!Յ+w~y?/Y7EW"" /xX:t28޽} -$cZQ\zE I#M 4eu[mt;ѩRldcd-y8SEvdQ9<r{u,R ͪ.T;\оI=lzևXOY1{V )~g;N;Q8B4@ےR[djuG )^;fú.8#l@*D{XI\R+RnsI41BPLmeƪR$n;ƉVWހR,ڶKFL9WC;GW(?Py jF7"tڣg nK% i=S)1żXm(CZSc.`F(+ 1ڲN3PmQrQٞt>. `jjJ38SDs:T)%4tx.RPvZD6߈@!,O8%H\gVinfo4[PJ3DIC.jE#DA[ qn%eڠ#%JKb{@"DkCE7P,(ӡ"OtU4?g1wgrTyPRsnQm 1.;Ț"]ߓ׆n36 ^*#hvCNH/OG:!8/t^1sy*׷/9'#wwML<\=K3?~Onn8_W#8d9tJx-Rr'H 3/v/ /|+n7;<5/aÑnuǧ~g߰, ׯU=߾exuL*̔xz<_oG. ?t{xj|m!xbRs&}hmFVIHe# yiYPdƞTtg)qA(18Rft"Yd6tÆ0Xay]YNfh7;V 9 {pJEBH:d~ #BiQBY w%E(I{yDP Dr ÎX(P ƈsqC%W+MzW ݱ+BDi#FLuj Ҳ6NsH}ZEPi F-%-Ha7;7qhJ,qfODa~xÇO~#fEK e8Y~(`A<>RM+%i]amG.mkB(A:RF獉~kpݡ`!<=RD91rΈqQM.FF4EW ̬˾ i D] 91~C Zht- TcR!2tD d RBiߜR40=lYCm:3C&u<(Y`K~Pu]pmv8O?O醁#778kI)ᇞ, -v=~f5/,9B|li]Zc&L Cs%^?u8qbxx:/,tҹTJ8mC>UU~S>#5NXz#IB/(W;'_3gO_|~MTT-Ӹ"ׅr*G>Rbw3'Dxt/a_Ŏwן"$ )_㙿ǿY{6/0ve_[?>PSϾA{૟Nwe~<|_wXٟOHD͙7{Jʜ'O\WӑwnGz1t:#b<@집9r|kjBpu/ 'DeHko"戭?X+](7[{'ܼ|_%^p\g#WW]Ǽs?D]$R4m+J[v{1v"+}!475q~"]@m }k-tЌ",ӌ{d~Jj5HeYs鮰CrV7p"Q"!?Eun{ER&. {zm13e֑0|kX`(9uR)q:GXW5((Gm.(볘 }uI^&PRXJl"&BrmK3誡YUX뼠L/ JwJHi(5jiI~4j3dJ.RaFҠ*]pX (1Qc[L&0#k3WB}#XK[} mx˟}=%Gu{./^,4FQshh4QJ;iOO(Zt)d>%hg=J݆%Kr"JC Pc{9}n& FaM#9)Z$Ow5J 4s AfV߿9Ooe]YHN= QiI1`o %(IQTO޳.x(Q+1,*\m'B.t(ea ,0ݿc^V<ƴI*!qQKL6Nj--im9R0Z @脖yW/lOZJ=c &yvԒ)14īe h`%Mf9k8Pݺs\[onYEo0hϚ=r&ǵriH@{[ /nwiOmSE\ؗ < z͟%2ûdԊei d)>\"&J-onIօ T3;H!Hӄ&竹BKL^ySG DqDXOh-V6rhw#+sr% /.ɺ ;r5 P=I3dաtx+H(#Ea>荡7q=!LG]ף5 #-%$` R ڨSEV5e^8Oh)*a|sy{9.)5 V\EQe֔РOnF1ϼv[ J7?i^'~gW_ąÁzaM%\\oYi<3ZB]K-77[>|xlT/S~Ws6BBe ͯclw<~_Ŗ*?yoy+r~]yX" || nǙwoޱc56 <f`:μ[^b<^ܠ{>֒k`||\ 3BX? wz Ek.FY 48{O~'pC(0}?f~gޒS`~7Ļ#v=qt2֔xOL$gxƋy{矾px.=cxEU@;J7 &]R)ijL% BpM_0l/2&VMD!8-̤DxF9*u,d-BNOeuTr@h=FQ V]9e:>ú\M^^;OEB-֦݀*dlW lE)1FvRcB8]59fT~zKy&iXZzؐEEyx|v\D&+VI#-H)1jy4ӂ+jYN#˜&t]; RrZu ҸPDr$5)J,uD J!@)Ҕ(CGZ H(![vўG-BrqE]^ӌHZIL7l2Zq3H\ޠE)INoykXFx*X!ZZRI8D gtQS%ǀ*k@ bhҭ0shBkF2?bCl.VP (MY&&=fyswCFfUfWuQFXĎ ; ,H@H@ błE/( PIWeDFfvtFǀr7{{=B"J-x!̹NUR2)eD8c }ݞ4:%P xwG D"5vswx {wFyrR`kT-34l<ۏ( Ҽ?c삇_>bC"JH* _>N3VbpU]]x8 ~Yc1G͟B |ᄚ{#Ą-ݓK|ktǟȫ_W_4 ~%Gn~ qd ~#e_~Zixϴ2x^/ 77$! ayxˇ(m 3FOf|H3EI\(-YBuOw2vx>{^ywt_>r巿-۫ >}~ϋϙWORh[ˡa<>(Qˀ %erhen!b9$&Sℂ3$Aj&Ϙ~4iwwȾGJXt(}M@w2,#8\#Rtۢf>@*Gt5Ï0%MI9-*f,)-1Wk@Jxm~dT7A]!JBpN6d 6R0ҰQŪ$ԌjO@5EGC\Iԩ! ZE~l[ym7,@U#Uja8(eְΜ瑾s3Ԏ, ZV5ܮH)t]ѓ Eɴ8iaAHk[d=B =$дMO ǺRCYSVRnWD M8 b"@OyƮ/v$oR|%3Q]iiZ"ǵ)!$J]=A3,h RrkU)aD|&nzu=tT 0MSE’{n1OO'Lwȧ Qw7Xגe2 VȮǐbƶ #ϵ5G[0]H9 >N4hnңHF3 'FC`կSͦwbnMTs+BT;5<CUetQ4ZrHkPRR"+QHB_ ĜQPTa4q?nRPJB Z4%]Ʈ:Dc4kLI%@%O,u3G)!GW"?<`d4d%K`sk!!Mݪ:R)yA{yE*#Bie`gBʔ1_m 'D":4,%gŴȤDt\lI$L^UղjR"FG /3ǏkJQxʆb֜ohcÂJg'5%1gPlV5pOTLK6;j/3~l' ?ep%RHl01'O,'- / $57P~~aGV<}v͓rǺg_1 qu=sxUŷ9 ./yd]QR ɒ _?Si[o~O?œK)_h%rd#1 |-esEj/uF6<-_}Ӊ D'~~Ẻpg:|4δۖVКo~ ?0ƙ|wYxdl5nN{1I20qqqrYad"O^]2Ԉq~8j{2abscFlV<o[c[* |"~ۏ_䧟xɫ|-opwhC{rM]ZxxXrx:s}$KM3>%~=9g>~|q#VBAx%7wOzDQKc6xaiFmEg0?%A/ F6Bb Hղ3Z6(LI¹z+R#|&j+rW%8XDĠ!WI1Pٱ gLV@N YX;umG@Nbs]Ja<"JybJYDdtX#bncD3@-g?CR kLK$ ]ᮮ3tlʠIRM΀2 > RPAW )AzbhU.c,N+\iE]VfmKA(فPr}QFHyPM_;!$OUiяɔi/X[4PnJ:=l-5mmXBy!H!RHAJD&.,LJkѾ(I98F"oz)ԖĂL'HwAJ 4x@!g`FYTgLnIdmvW$pRRxЭW(QE-$P~4>L4@im%QVtVR%n1n"aDL Hܓ?(FSPQ&͚_P9T ٭Q){6, [P|m0Jkz~AM gfG%v"-iqydi&rc52" /J~%ҩ-AD  H Uq9bGRH0)vQ*JS2)2z#XVt%ZJ.Awqg 40 ZhcܶT()\lVdP9!HcMK=:/gDVpA׌;L:Ǒ  ;GIV=[d%I (8AZ0[-yfwuYmEAd4#I)PG@k|ۮ&e85 ( 9煒E*̉Y td  DhODs&,3}Fs!iV|J6פL3vՑs@!%r>#$c_ OÀE)׆$tZh]=2F (1C6kEi.1er8-ܢݖ%E|l-@_ r6 ba &S~>U^ &aSa:124I* =ES򉴻@IW~Y7 d:TkɱPJOX_3mG3a>*U0!fܺňZ0m5tw?lkK RP~Afjd-BcF<˲~"lnc-f"` Yd(88w""JZi ]03wwwb 39>~˫+ROgd뗗Re{.JN.^Ŀ3<^]/Ogx<3Oz1\m7_) vۢ6`-3z=~g ǻ{L#e.(x`G ]k-« sOѼշ8c).'^C=??]5ZEkmEyBׯ(JRsځ!e!;jl(ʒg8Pr~ j:SPzp1 e8D^^# ;ܪ%g,%.U$)eٞpfܺ% J䁄3} Г' #njH)Q W-pxL%'JWy!΁g6 9gb(Q\1Ntg!xPp,ӄ1,2q}twиb aH1LqE[vOf>(B!d}Xegt'_Y"rڎL$'DA:I r⋮})Vo0 >eئ'F"ef'ֶ% j$e)S"S vc Amw֒<'J|6=B4u bSX`n6NL "(ivm-kWc]3HB) BI 1B.X6Dŏ~Ĺe:u-21%T!Vm< %IwD2*'rf& .vtt]k X)c P ZU~HA #[H8Ta"Sfh2jZtpF& *Xj| 'rBDv'8%IXϸa--M[>W_?ogNS芾nW=Rcq]s_ 1F Q~X|"ęY$r:?~O.)޼|яH 2ͷ?_psK.駟 [iY2/u[w =DL03ݎeyxtJXZG?RzBdX!kqXJy553xRns 'dKyk\qtte(]'юqPơ͚,ÁHgg ˑfCFϒy5-bW_Y x?0 V+T2d[Q%d n%(r=VFyN>RIP a+UIK1] H(u](T&ֈXJ"lv%i=mIB!*]Kv:zM8g]Fy8osHᲮ{DCQrDHK̲>cbQbBw2e0~#[b$X71Ԍ~jMLPRS5 ] $\y)Âk{ƒc&?>DӺ'@e@71HPwU'ڦ$ - m5lM#"nCKؾ!K2[tޣ a:3|zG(q@ 3eHѴU-GL'*6x5J)Paˆ:1"rJY|[k':M04L`>|]=Xq-aU¹)N7H2g s!BޡNEIAHBJjR"u uK*B5趂 VLZ[TRb$ʾG"îZt˫g 5|@Ky53uB,/H۠1/+V9'U#zO:ݓW hCΨ\@եR$2RSQ\!EUyg{= 1Ѵ;Z PTA9.P2kbE CPJ8bf0S%ʠ+S:-! Ę*_պJA@ɱJDmSACNDL6ף=)JKRg(fXL4FJЙ;%gHgW5.AD!K΢Ju"M&Hd94\ZDᗙR VA2sǶY3 >b?-*J1`b2b?G3iV5 >ϵ"q;-A'Aӭ:d ia!,OW5À.u{Xbhd:"ȅpWR2Pe>pXdQk,/t )b^X"͖$Lvv]=q 0HzK҂#uB;>g4b"Q=S2\_..ܑbL ;W/ÑO/ <ņ?@C4Эޣd'kE' l5{IB~`ծ44ƅMl'J/%cYXp{L_0/uXxͯ_B3ZkbÙWSSf'n7|𑇷+oq3\~)J3w02y@oii v n֮c"WO8x%^ZY=F.W_rÉc5!G__㻷<{ >P/ ;dU(ՊB LxB3 Ƶ૷+m;k1SjKKCD#<"?S~$\ftҬ7S$#ʄidNdAJ~E$nG2=vW*ݹGotQŅB:,($;B\=&B\ %,$?aM%m’gHud Bnzt#?(NrD ]) @8-J#ئ=H*eՒ$ئRi'5H)"M"!vՑDm◅mY/hX~8kn@ݦis]EZ'LζR֔b<*+ FKea'=y'<{ωz[ȘψR#ۗ8psׯbF&y_S|ds} ZJ i OXeՋg4obچSxX uq\s@F}#Da8e)01.uhx2H@ČwwU,%!V0(L7^nX*D"O̳ŋafwuUKSr*P2焥vT0Gpś7hcn?8w\^_G\\x:o߾[\8\=tp×/b`<@8͜ӧ,9xNӣWi j]B+Ҍ=VYVW)>, vkdRP*pGG&D& EI02kpB$)hc^ahUC80zCsv'|B`*@feYZ#I(Y5Ȕ/0GGe78cƈ:J׃2y\)0-w9xuG m%qP +4Pf?̴[L@ #+o[\L&+G9˲BF{2!-@-VfӒ y#@ۯ:!MO# e>#iKv}I Z`\R `%u2' .HQH:ۡ]xWXRR]gQΒbB,K-ȅiTV#)kmA4趭=},1L? S1R1(q a;c/IZA`Bd_@=µ% c %e8ce^%A O-K~u62&G ^AQL-ZciYԇuRkh4a*5 ȹ:Lq<ޒ%BV"Fj3R֫`Q8/HUHE|":$r %9oߝFlʰinF4 ޓ 4RmGc/){_W%Wp!41& Rݪ0~TB4d) w7(`پZ,lQ(R%k_ɢQj[#㙶REZs^^EQ:KbN Hu+(,Ǐ{6?3iͣ'5!i e0I?2=[ *׋[oȢU@ IvG \( ~Zѣ92v,ӄgR)GE9nV,"#B5$2&kteX#M iziBc2v!Q/'.`4S'(ӈUy\/JdLS@lJq2!P`D%/+iCীR dq8X?J<?ͤc4Xۡ %T7!J4Lg5 ~O5,Z (8(B $QF4-1eRȈHV5(LiasuVV,#vuQЮ*($5UbI*d<݃84Yjm %]q[dBƉjBV2d a-Jc9iI@ CBEִS PYy`Hk% OyaFnhUQ*B)p 9&b >x0&gl$-XqpHfrHk7o˫K]_"Oڲ {uӭw["*4i~z& iHTKnQ m=9de?DIm[zkS2"nDdDf:1H haX=ѢCm91LosήV9Q;֚s{.H}x ,"&ϗWxpw_Biy<I/ y ͆[[7_+ͯ؟N6=ˁZdcYD? IHy鰧;nC4 ]ׂTx`QÏLM'5 s\߰ц7_}Vn^r>_h]p{MWhkǙy= 1ShQ=Y1xϺ J[hb79@Ș+=bbTix$PP!/#ɫ'fuBYb!Qnc|N(p*K%1N fVvQ: rmh8XM+Ot7 "+{ln01{/XBW4M'icOF'O4 (<~ .J)(tݖ0l H%aanY z:.t !^ԃ31,u,g,eƕ 1J:r"Z.[ЊDTE{y/%R;7Z^9]0khxdAA63xf$NB;tPS9g|WwS!W1miEꂏ5~cklӀՌaFx0@1ݏ4ʠrb5nxr"q][rc!KKF+b\dĴhX)/Ԉ}"a^Htc9= x@SFaK"A$I"lO~^THUk5GҘ$? =n;bx&mƟ?0EdicvPh;/f>D ຖe;bJv$#M+ź\__nĘ*̅qh\ m {/nՖ}L*PV遾0M3 `JT8{̦ qp\)kJLLi~{>3{^߾%.p ·~%ϟ~'Ka /S hN~uMIp"XĒ#ti$|ꉒZ}AЬ17xzolib~ϛb54y4ٽ~p =ۯ~`3yP2ZgJ-R[K5˅.%@+}q}q~a30 [᎛w{^2O<~-k<>=baxxG}@f8 _xrąe] ZڶTR0)g%]c3Za%YG # y(ؔRhs1ՃEV\s(ȉj[nR *ZJV4aF=_!i]AoIG;Y \X_Z^X]XV)t댌ϱ:,ӉFLug;$gPy%\fT!L UlxO*y mR2)g։$kIHPBJE*)i^"WLc͈[sM?Ƒpx$ٽDžb6=bS@:owuKTxʴP\.X)QY֡,aвr88 %(Xp-EfF%kYʆ nFUEjyJUڜRÉ_IU@阎'޼{[P~u-톐S%'"9b$D!|9C! 6ݖL׵9-YԸ:sa_\3].l[3Wd!8N2DT%ͳ vg77D@#g_Œ(ݶxuĸ?s 3WkyBI?c=@?͋IJ۠3_i4n[rwDgyW}sf_#J7l6#q 隁)gMײ6a_#Zvr$an3s"@;\f1[¸K'??Z_}maچG6%󅛛sX5,)ED5~ J <>=)~:#y?m{TeBچ˲p8\j kd&>-OO7JFQ#L ~鯮(vEnZEDX` \GY;!VjGeI(!LX) bIX)cF4, j4?RŠ~FTRG7HXy34-\!d"wHۡ+r#/jAWH~K9ƑO,#|{\O8טfT(5u"P%PF 5TK!7tf9M /Y%'u>nkD FؔmI J[4쥦k%?C6(Qd!tF+E̙F:Q XmQ7+=eDH(bێ2%mϯ]$!A}mshzP?X(ҷ׈(脑aLRM5^ur1Kڗ! !f~@J^^ߒHg*$zR0q5۫+rg>pϯq<_PhLP=a6:Nab=YgL,_|F5p}{:G_>aovmC)O/_p5W7u ~o/F Lwspt`>$ ݖpFJ w>Pք26oppGdkbs-I=q}8O4ʐ y%4/ضa}4Mۡ!07/n\S?!HO(E'd,X!븜tW( (]->J9<x۾$eAdؽ&*XgTƿָa0\lj>bkh-yD O* =*|! 5SxѶiz朑Zbں!ԘqCMZgL≲"ȹ"BXGt#ȑ$X&ONDd+ ixBH;KCL"v x:TuXeMC'/I:!)3ִ,a,(dӐ3xb4>Mh"D_ "uYӼ: s@)i:$(9bX,r귤")Ӵ/ybAP2q1ư,gTwdAE\WuFgOoF3F"R鬥MoYBxX>`5t`ł_&J5s&~6PB&]t6vȍìf !Ejko3yv3:>y%[ v~).//KLkQzD̗OVh|!=ctPì~ZD̀5VV*8§DّL^.4"3ɭhZ#'aC(BյHa!1N{=pVYQ)!,AH EխPl)R5aJ,UH^gSźjTL) mE`%PPFҌs2V, TOY2*:U+Fd$aB`c:?Hn"&.(gѻ7(q*7O~;7(b(IT$vsU%S,%m^o1d8(Uj(ӧ؛,aY($'lQŒ<\$ѐ -2qTEx!`U[ې58!9<'Ȗ~VYjtӡX筥-i+@!}uQjCђk䆢5!z 8hۣLG*H kq]*|\\_dFgf"QzÌm$45#"JX&ѵ4@lY É߼H0J Z ya;lGD)뗯8.3~Z=sllGw݆߲+\(Zxӷm-I qd7~pRp~:l743iZ"IiD9{a۶L=\N 0_[JaS'+s@PY;G.v0Bb#EqI%C 4jDBn<Ұ.']8OUςP!pulKB*(F i~%+q! YTdvSC `ځR)'ګJ9]c  z G|X1)qL$bEZ rbfCy؆.i1!-H`P1 sD5}h>b&. &ȺJ ՍֳZE!#Z'BovIJ( ڎi j3ƉQA5\gaK #t6ƀj\}QƅTK]Unz: /-+LYȴl_C+MFA>OÅAځft+u4J96(S9R.)D>tV$YWϲ8%y~vFK-a7@.RX@vrl̵g֘)WhAxP=k.Ukwu|9RJA@8iR&\KYdyXmQR " ZZºvM%kR sg)2WZWե؊BV|u]OJDdmX}$TGIQZrt@:kB ]cU~n9=COӢ*j/ۚF b$+E*J_kaC8>(hW R<]75K #r)E0nVӑᄂJm 䈠sz%/s8) Y8bLKђx9G!j9L)+~ H+"# "2|z|袱-9{RHeAJZ2eNlkԬ?-9!.dV5#Ƒǵ((5$VV3Bqd:_q9'bEKbZrr55˺"2 -qb f7p$޾eMu?ů Y*~FmI>13ʯ%xtXgk[¸Ee͆R$~~=r}uEVJ#WF8f7ˋ-Rj#:#Vn8l^? TOzvwKcO·#r;[^Ľp/z4TaWE̫7ya mO _y>Y_+G>}b7r>/#wn͟#d#޽׼3vcב);n8O_j?9vٻl2_&dư?y}uw?@Lixz|dZ'srJgYڦū8O~SA(޾zCv<><>҅H%i% n+YD6,#Zmu(ɳ --*&=ݫj^U^\&VТ.+z/%5::Z9J΋WmRօ%bQ"%lJ8% | 5k Z+dɈv@ReʑSPBX4_pi6(JBŏ~ E9pYOfò?a{٣ 68,aYuHk,G|Qݖ( a96iFDY[ ǹ=$pSBJA0G12lO4]Qju "xDΕcJ\ idIkk7f 4ddY~}cPRkhwCǺN?!nxAIqJ|QmJұo>z|$ dUN3(2فPbDwDH[Ś9GfwҒ( LD1tm48ݽЊ"4ZWFcr϶iEH"2F Z"m`c7LF7 nG.B(@4VU2=cD5[(LHQ@uQʡ`MƵϴ3S q7;a4aJ L)# ~&eĊG#!zuAH4]QG( "P- BYcQ(HȀ i0R#3vԃL5",QJ0v5H4xNHg3-hN :&;b̤i1%r)Y5"Z/&sS+TSK:UsekMlbZ? 鉰nK>$|+0  5H%.,}5KCZ_(k]Q}GZ EjHsͪs!!hx(լmt (4=u6XKϖmW9 Q!Xs {LHHR/Eƕ\Ӊ0MCSae3RC< _|ſ_vnӒL+2EDN>1x=ҺZ8 3K}Ā %~Qrc }-DYj_ XJIXEa|3V:NtM陒̞άe$鲰fSBx:y5!z#mW|4[Ɖ_k(?oB?GG^n_ləΒ3ٶ-/_]|#'-g2u4=C focDw[Ӆ׷\B@4=nG0+,R"_u5ꖇGo8?=W_#awOqY?= q??{rʜ -{~\}2 ӜgWe2 N8DGye%sӷ3>"a4|}\"+!7_3!h_4HOgWuEqZ&wx21=8%<>nkֳoc 9{ŭiEX@!!a`i j*u3ckXQdFk<'91ѿ&J1N2%cv?!s&,%,D)͹?4aBIS5woh?GCwm451q̪-SY$Q2v;,E@-+l/$LHzZ qnjCQ@҆ʘbtt#"x4neI'BR|i.琡cV,nf[SV#$LRfJqݮ 1s%IaU䙗 ڕ%cYfGau[ƐN4Xh+4r:J7-~CGƻ;i^oK! )D2=l)IAX|(Т`E#LL7]!ctEJp*0%qciC" 3U(qs Sp1c]yꕐfsĈ|)g) rH|{dʐ#.TP$mw JE6٥j4LT-Qy8ćf0-^#yDDejxmB0:8+QlJ|Rrj65)||oiY3;Oc[ByXDž^9޳L 1 >UͼxP >|>frc%y(6-uˇnYΞz\=}!(jAx |d߼zwy߼z??շ/x⒟5;-?|/>kʫ_,ğٟ ;p ,.p87| Ͼjs7x wUG]ՌՊntrguw?jWܝǁkq5-0?ִ5nr,)]]3 3_x%,m6%tkN}nK2{vחe$zJ*Hkv;P7݆4/ԫ)&L0՚zҏTu˦n )_|Am!a^PbjejHC P XJS)U/pI!&@lѦeIzOL׮1US(@>l:A,4X"n J.̳eLwE#82GjMħPH/&H0%╨[Pcƶ(f76ea:}\Uw3.*%.SWq"k*gIЮVMZd 9u1{?Bd niM\,.gYb4;Taz\*F"+M]ӌsG1+ h2U[#4QHU% Bz"s*PT,Âx!-iKr<[z%*Eٚūm+td{v2e:i*E B \&YC*LvWE2duALH(S8}`ɑZ -<wY7g[ X!жOVȘ2-cLPкޡR“B ? XJ NMV(&P&R 9G0mR|@Y"HΒaӰ^YR01ߟf!C 䌵UHPE&R.vۇ-Rc "ʠD,*eIYC Q-4 |.[7=ٕ;qTLdҼ0NaB(C U&- ?rO|t$,ue9ol05F L eQx*Y.xUUz\0,~.]dȶ$rT ^֨9c)&r@D)P!U+j]Ӏ5U(Dh!y,JekmSJVyV)(Q?%"HH\|q-e[r*Ԭ}]!q7LsS,ڐ}ڋ d[Q" u#.#.li (A2QHp8}5>NO3z/qUм|IӶfJL{I3yIRP?⭳(eFEkwH7]>! xBB8h– g(^A.QP$0'6EfPMȎBw@ 6(L<ԆbǷ6es# ui $jjKU[$;E:9VWW(E$d&e (c`ږe1Z/պt4P~sˣK#rfsg}-JQ5kP1uBL`FM9-3QKDcy8vkÉl4J J"_HpbȘ=bZY/D30zƉ-a9Pw}W2cf u\x5ɳT&JDNgӯ^ӭ /i+ K6݊,n~|W/`׭93ګQt+˯ŋo_=siϹݛ<}ffz89VjrP@۶TBəJ#qԍ~U͇yeYn0OX. 1(SRD.E ")ڰ^mn&,3>nq8 qNZMagcf]znV[D]iweY| 1  IcHOoPMwT C En\߰~ۮhFJ|mJO(ȂժT-n~a%UoHsк3UM7DC2 !;lU.`YbβdNSY=}Y}OS|p4-T|V G@0ڐPd%ƏTt"2hVӬJUHHIXqӑܳ0h]9Eb(]!$r&g]HcDLMc )Gƻ@ʂ w:d_" =+DuM8`#걳R~$hD A w˅J(maяQ,1 e&RpK~d<Ѭth]1bޑDYUcHR$ al$.J 9: RfGb@P&!A"MP,mɕߕnA Fڒ-y^c"3[_͟h)A m2"2͈Z4;q"A(;deFtӂݴHӔmLĺ?"UAjk6 {fE0 s9ɖx. ,ѕB&8"3q +g%ZbJT-c?ێ2ɗ"b6#$B[zJi@ʑ`:a,C$㧁3J2!#hW,nd9 ANYuŔ1tF@wq,.#bM`D%RHS RHm0MŒK(Yqf[%pgtӐԑ"`t}Zx2`5 ]/3S~{L]@Bam8D)ƋЛ-.fIe.-!SlJKZ1+aD +4Yͭi WDDLlBXD3Q.KW*Kt[DgfM&b!I8~/-$XLa@9ge^7,YikӖGBglUԖ2c98ϨڢuM6pI>]*}J47WXf!"_̳kB-4ІeH1"D1g'lhk8=#*3䘐Y pB@dKQTVrikim[0+7O'<}_Y$9KDž_?~/W7 19eS?pE%3XL32oxKl%1nm:>ݓ\_>H_yL!8ydϟ;]Ɲ KJl6oǙ/9@hgv|94&N R,q=‡!-]巯/sc˿k߱nBOi5G~r3a@jv;\ U0\_^sw{wLH0:z7ikktUC(7ODߟ1!#61T[&`s1~"K;B-BkrrPVhӑ3b>}f[4SS4 ޱ^q>ӮHI9T"S˂\DF90N2.(l ]G!Us!"uMX(etpDv Z5$OGr5=UqL"tgSnM {Vu?GdA Jǧ@L$I8<n68E*ۑhTnv8Œm;h n:) IiǢDY5"К3i!dmI!%fy-Hմ4R2N,iH ͖xwnW+s&% htՑs$댘=G`` #J)w UW "dԖgQ?/͹l+kB1Mu]Ѵ-<ӭE^:Z./LT:"5VTJ4-9'AW;^=8U<}L[Ky]l;ۊl-Ȋ?[ <߳j3 98gPKͦ8/=HalkՓ+nSo V߼76#@ZHόӧkY F={y:stږmy-'O햗^R;UǴ̄'߀Lv~ȫ}m?һi^y7~5L^qzMooFrsw͛//t;Hk,'B''Ź3TNLȦow>cO\@O$MG U70w+۬9"2x1Ul@U `H3^ĉL Fgn'HR1XSO\(Gi :8oi-BYU{E!mjƅ@֪e4~ G$B5rM}_[#`=veVĺAy®WvKFT )r- |Ⱥ!fAPābCLtgTe:a``QHCԚMh AK2 - RRBOz|O)y@(L# k,i>\_:mjB*=]x6jP-&c)#EbUUZP艑RU$ၪmHFFß>2IJkHQ6.ZIc9V4 %}Įv잼&Yf8b?` ofJab9J4J 0P5+jTF &I4rDQdYYtTkB_RcBhEDٌw8 ˚x*_2"D5'<%m_2ьfCV3b%˿k:"e+'2QoEږ8zN1ZdDD\!w׬-;U)ғCi,n!@(=mXih@ Q ZfT(*]7|{8>T ZjpS/]c+ը YtT\IS (BA/߲1 $IJnɋ"HNYh9p:X)!B"@n1 LLTyD6nibUKʅ("t{H -5*#}m-L%RsBjף6T"&$0u;K=>oBŷ$%3h~pfc3hK2rYcx#t'D"#ƍT׋Cv{IeXm& 6@[Q04Q lkRLcOݵļ,s8jmR4bbZ3 =ley?P13a֫Pw 0b*ֆ(!QWUqeMbM1ȼ|B jM3 CO o1A\6)7Ƒ竗8O<6-cLN7qr%/wOXoqO~-2kn޾c Q5o~݆OwaDר%B$htVrb>iږȋkr_b/w É 7ņcϫ |y}W/y Oij <= V=z7o?%u˻?|W$QPw-7?e?߱,]4<pdqIZ^w1hݡATk2!O7 2n2, 6$"P!R"*vUJC& pnWx)h-HY_쮟5Vف!`YyP/ښXwg['3yXPLVAq<(a)Ӗj;DRRCwv ҄iXP*"{8$q^^)0tv!dt!Y_8~j 9ArJ5+T2$t>0/sԕaAEiPТ|ۖŸ4 Q l#OdiŐ܂1H(*Du"SdHZPH!⌬RrpPʖ/la+OM]H9"%VLw_"ږ2jn#P5iikJFdAe"uj|T`W{#xgml)0j˲xj[qq BhM)34n,}|b+$e+75¶'%GP.bDX,񓨩9[3JKh'.erm7JH;btl..I"9i)TMׁ8K %Β[!F*Ev 2&rӰ\t2 s٪@]w4݊C9Gr>sF<k[n Q-.]B PJR#D`J&)LdM&DU6vк& b5msf<=`W-bdQm4DW+*Ī+ XYYI4ӲrrEHtj| h@Ԛ~t+LWZIe8Z#(,ꚔCO׏ldvPV=nrb<B#U(iVg9J3JBp8|ԟƍ;|*)dNy9.nb89zRdO0Ή|%›O7|۷xq{'Tl.=I{%u]Y5J5%}'tf5y@0H.z%~0-55|ĵy]2Nw\mO~'Z}IzrAoݻTo8wڧ.;͆)%y{Gj=TiaYHp&-SZ}I 9W{>}39e\{IC*I״NrOBL$;͆+oo ;w$x5Vi vwHc)pf+vRd15!,2 U"*é?4#.֒܌w=Xq:rq% h*rg{A ѭ! Vd'NCq]A2h*hkDGzϥ'1@VeoD ْ1͖%{fEΑyM]/ؾx@bQRsF] c&cv=f1j3**Y"*&l*%sb=U MxF-A'O#),xYԡm](`RSU"rhk"KE{?ޜɶ,Mzּ3~!#"3#+k2(ahZC @@Dh3000(jʬ̘ÙFu P">{{aAن, q9ܾD " >zu6R%i\?m: TsyPaE ,Pdymf# R $5%on0eZqƑG- %v1'T(E#Һ|J;ѦsɐRj$f?"r 4Mݖ*+:WJL^~0>~@:RUGH5w?vtMHr8>қu I 1% (c0a*l`mT0 !{ho-ZZ % ) F  n*\OT+$QB2)(d57rR#WB)IiF{p)t1^w`M& ѓLRd_-ֵQqEexz`.XA;CIF<!$~RSJg;kp±D3/g6U*4"uSB4mOL+Z*$y-vȚ^F_]73J;: ^(yF 2"]Cy:P%1 Hu#&h)IĶGBz՟d ;x:2 &(J= )kΡa8=gm!ò cXEbo8?9?_HBwܴ4Zl7D]qyywGP|9e]LJ ~_1] 1D ?/^)Y?~mZrW1f Z/‡51]7JU"J̐t= ! <"f< lHTii36d?##"HEb dQl)FGHӷ6Lj'D3l@gW_c!vP|D[13k4qOy/a*oj6ś1GOo̧uMu@Is4͎%Qv"|KR9GDkkkq23(i`N/WzODQV)ZOVRkdD 4H?3>|Amnȡr\B@LoCdº"- k` a0]Ԯ,mōSiE5]VGODP$"td}|# @-2q:c EH'O#ZUP. e !WsW/~(\ 9#ńH Hh%)BR!uR YF䕂2TzgL2lw~5ͶM@3VJsCF-t^p!% 浺H#][!1M)kR!Dێ-oIˊ3eHa$J[ö^-`M]QL+"= m5 kN5m]m{n-EdK Ljv 'v! -r1QG)4"-vw5V7Gf ;GiJln  qt :EZiv/T!F =J; Y(S=9Rv+ĄJD? ~ ^Y:-QFdJ5H-) hl5KA,Q Ax ݷ)Y(Ң]t$tyP\iBU&&BHE 4yRND%ܬP]SM5p~ Lj+!'e\Ir@gLtõTq^f!ѲL7E-Ne%QFmJQbAMpA:Î"LCTJ =( 3ci,p-&[RR$d)0f:䫤ZAs{G =a]Ή2Z3~}x`9_$]G H V} Yvn$baO~@jGLrM4ï+?k\L\c5 ۊ%DeAZxдY 4^GjZ[N'@V^ܽDL,RD{wa=g_0 )M:/dp!kl{[Kr#6za-d*U9<%K10c>=t=^*sfmjDփs)UnP75)JZccABXXB:Lߓz%H5 :]a5WUΒf'kR2p!buUg "g)"K)$\8Sk*[晼m!Rc)eFiY5R!R*db5}E_sE&ȪO?@Q hs-SXhZG\8 -*kp'RS h/f@g XѴM5AtN7B]R kƧ"kS}IQH %"Hq #+= xS;2c*DmZqz='yƶ:󊶕%_r, Y&\◄R;0v(JUEZ Q BXZ6dQA:hzϙyJciq$-!xsm͆e9_l G6 R*n7l'^~E߿z ~r"D? L3*6wAh!'k];^y<ҵeDG;kYS`>]brt:q%޿_۴[W.ZtOoO?Cǟޒ|q&P]+ּ{+7/rB!|p8>9[Ri=2S}K#5K0OͿ-]ׯ93?|_|mχG2 mݞ޼[ezaJ:>K{g(~ ~0G:װ3^>x>|`1QlWL < ȿmȔL/,?2a[1AHaAJ!@GLwn{,-2DvS'3Ȃ541B# dxA\_rjkYӄ0@Ut@}:kqD8ֆr"4 Rjじ/Բv c`T_Μ y5 =l8Bzi5k+*,!Du͂0M%eȾZi-PeG%]IGMAohtD[(IX S\Qa\3vCk-5i:+a͆,+f{ IdEyT_{%T- AtQ4DkN-%e9 Ha2KiJrmwtÆBơo` h KWY$\La*Ydt׳Ph @+Z\%epJbXHW(*(PPJ#BF#Ia۠|`+T)Wa)[Tc@'d Q1.@38"1ƺwb%t5]jr.B*XkFJgZf.E1ha*.UJ ,Ff5u!4.LF)&> : 8̾mX㈖CRLrD ~=֘gVp% Oi*HsB l77VcuSA\<1ySf*ǘMkDCAG֖3i(1b6{ j 2sDh[%jy'I>Vl(uzC B/է +iڝ(D_c|k65f:]؆f.#v_)_^(8sX. "H2DMI(>(]KHZ!BP/̈\[ǒIӶRBZۊ~GR1FWjׅFb(dgvKIKQ-N8mtSڥp~&k-k d +9%Y6()1T2֍t#,Viem%)KaE3DyQ#1Me9OVĸ@XQ, Vy`ہQri|uንnH ]zy$s XϜȀ4r|9k&r8a,vKD]a0)FFXY?A:LxSuMt0I`_q'> >'G$fWR0- w/0Ӈ^޽@E#q46X0ڲگ7={x:}iˈ_noo9X*Lv4M,9#Yö4Mtm[~xܶfg\x/i?ee=^8Ϝy%n(U$v*]A;<}~3Bj~2amf( [:,'m^1p'ܽb$7|9r~~bp:|_`qvw+ǯzoD+ǻ#g<>Zn9tIp~z >L=_/qqGq(OGRgi/kLmPB"LiY :7Zb\G0GhU cj~YtteM+q+iQ$N L La i#%Fw ٴ+4aiAP|[% hU%^Cْ2uY`h]˪tĈ2qJn p|ZVHPyx15*gZ,K2#DziYSRb2R<%| 䜪zA js Y$9͆DİȼNpeR/Pm̑u"5E7H~sцԂWQ4I%/9ZO- 9fu3>dR(9ڀ4(e%)ɂ6ئA,#Z4@%ֵ-)Py B$ZtጣmDjPMO+r=a RZ*PԊ=ZB Y)3XA^M!k>>MA0=O(4Xc]pyq iHRNjX$ -2i]Xs4YT?ek\KUx&LELR!Q$NA: P#R^ :binR:4J'%OH4W"Ppee <ܽ'R/RLS"}qfCO*r{K@* '!kI΅4_P%=ԼP z!(I4 -["ے R!?Ҵ=JbC)M)<"%l۠YTD)\q9(A}YrRJDhkiHәuT m$2|55#a= gLte9PJeBHm+ڵZtx5G"Thnl%2i_A1u5*[ t!-i(b.B2XtUN mzv1 [r}VЪ^%%VJ:zEJrˋe1A 1b$ *x1,k/Ĵk&gqĺ_i<c_|op>jd{^w]_ d^2 EDTף3nigہ;n1f>~xBK}|!o~DW+Һr-GzeFoZQ2NLJ~ ~|4ۻ-i]y><yg#dOcfwE`;a4/ne: Rr:v7CE_it=rsF^n{Cʉyٺ)J 094Ml_qy< (g9||%U1x8m3)F^x<ٟwxYdV3̦mSW|8Z=X6À=a4rLHc@HYbVi.hJ9b?S*8A *z%Gj~_\gvwHQMRTR3e-b#MkߢD2d2-@0?И~ .OaI3Zh|R Ȕ곸xRdjZƐLL*ekad1HiMø,֡lJC ĵM ̲.(!%UAAUкJb=|y k),H߱u(ۓKb4T}"Rba Ҋ'3QZ^ HIkj<ض-Bir~NEx))Yrk99 H3v{a,) Bn|!#F$Thm>]q-i=P(uVFOglu1?a[Jn{YHMBB*Li%ʡJWMt%C"U&1% r}>UZ خC*[WPJ# g9'=~oP˅/8K _^)!ZG';b6מߊ7kWGKi"D'~ 'G2ZL.#(li\tpM4OO"M4CH=WDXc(E_˨zP)iKe!DŽ/inv\gB\@ଣ(8<=bf8δMǧ il'Ȱy\%#Btds{SREusGRXg W SOG|Hg.#SZ?5ϧG6{P]70>8/y'yz5_DUx=ܑBT?)vY慶>H{cpO"$'˼yf ;O'>ܰG޾ӿ#> k9=k5 9zaAS~  ) X#n=8e<_(Fhp|x:f+:*3 .<-_U4"m4_x>yqsGS/__|x^;Kќ|Xt7=X??GX uR_@*4kd,N'O 7lf>>RJDٺp;%sq} eEEmJ &]&lh]qhEOGX7ImCWUؘQ jD+2u/]W9EHgnVLQGwn[ײk$ps 49JSBYhԄi&0 !VlO,A i%%MњD.U2ݑeIJRA45R9l*BR:{qP"ef֕xu(ͦAD.f>=ad Sv- 2-4bYF##>0{ri"HtH)RS$I3`7"LdeH)=%.Wco+/E*os4!]1c7LBRH4ZT3*Fx 6hIa!Dv(" (b8Qm\B@k|Ķ-thDr("Z$yXjϡ֙uhm,Q(:zzaH:٢PMG$GHȨQPJr|B,inK/,h"E_"x,?Unt]ZV,JՒù(PAB Նc5c+\[տM$́B"vp$)јFA0DQp/Qocki=k~=E9q̓YYwݗa`R $>HXH8 10hV6H}շneUgi6V;:F("vw~# j_V!i|NUNZbtƐ֤9QX= R|ŎBiv@k1¸)d>ϙn4Ao~oi<%p̿_yE/^~bJ5? T2 eѦg:gU^'֫-'e@6-&g3@yY3H}K4Mnf"1O,%?(2tmˋ0/OL*?#.=?그5Axb"FtN SIg*"RʴiF0R( 4*zTXZHӭ9>Q(ݒ:Uvۇlڰ G BV12gB 4oѲPij1T^ խHmʀ6IL(ْCmxHJ: )A`XY"7=u:|~` a-!U*$,FcV=}5AUErL#eWiFRcwuC :qh3"-d_)]Da8#M!KI rDX4%,˅d,9e (=?D-!DT/wXketb/3JdJZid×4@E )@^ $Yaa9кGh9a`<~x^W4z{ 2c Z ZE,LጩZ(B\hի2̤X Q(@xAyva Y-k$2Z.`C i~uկbn|:35T{FFm*B5t+T0βxk(!B.dӣN¹8dӮɷg e3*&\7MBQ,JȘI#(i5V*I,dN 6V '>ELjQ5VAbyD4 "~}BȜM).J 39Ddp՚DQkm\>jY<`ӧ;fXˀ,ҭ  R`# q[˄3 E;8W7DݐReZ#8-(G U  a*_ɓ$2fKɩNUE;c{ybwsV,@d(9uk8és8DDc"P%H:fE8?P"n}]?Yoe|$g׃$%9p2Ly!ЈUp2FZ1[u-IүVy$ H(TW[qиEi nF"DU R,n|7Y$q?mvضgyPʟI^&,D|_b(URvUέy!LVH33K B{mZ"Tu-s.$YY76ݻ@:LgˀnpHHF+r!tIEQUbJ \F)3qYUDm,)p3B ̄X?~鷈"PPb$gaR#ɒV<O<)H$qݗ_k{51 "9ϬbƳUͫ[N%4k{ㅫܼ'~eYmn9wk0{y֚ ;qϘO? ^zi!~ <,ܼ|Xcfp׌—h2\~#Ą)TxvcL)ZnV] HJ+]W֑rƖ%lpk톦>OgzJ1,1ղ=]PBUYjX(eu@8#RfR[WwrA6Xv' -sb*UMY5 _ٜ@\]AW?|$zC9n(|ausuw?1a@I+ ݒ/#nC ˼* +/ Qd+I*G²pڟ~IH@ k;lJSch0uTjwV0cYœqV3 gnC Z@ȡT% ݂E;^WzxL}͵4m*2R$nB8{rCk^[$\ X E-n:e&ZD0{DɌM0dEk.4W/Q9)yĘQ)Jϓh]QJ1>ݑ*J~`'{s s`::CgbP׷W @:\%Ll-Qfr#,qxF/>i Y|ɟg_}^rt䫟|uշ/ayx<ȟg$߿g-k׿ȟr/vo^ri^_`GvM zoO!m 4Պ)yZ(>BY![;O{x :^rOܼzIDua<\g֟ ] eձp>ɑ+3mi9}C ț5J׎'击p}Ok,z^@?v,LZ.tQ12<ӀZ]a+ӞnX[%Ƣsi8Wھ"R#%j 栭nYuy&m0Oʙqbؖh0Jr?T^<ՔAkmhAL)/u,d( Qy)VB0phE7(h8DYG,=4iOO\9DI/q@FfUR NWơF[J͗j)G&pvrBTs2>~2C:̞ $Rբx`7$%pn6݆P5HIvad3b2")TH1ޮ湾6x -rk[B*BW B6趡HBP|LHSB;I!+9KX%U҈SAlghבb H._%A3"JHPE8Hלr2@?;ft%0WcwpJu X f#ZsBBWR+V*Հ$PREJc,c%֐(Ĵ"P֖yB!4(YMBRTѥ_|>B99뛯in^VVՊ%jB*C^qvd㞧 LKuy`ۮ8sB[E/贩u%YYO1!8(TIȵ&sw qA XteYF35KuzgsV%bFF_k_XG !<ǽx<>c@*[ J;R4]7XVĜ/mӐ 1 ̋+>MϬŶ> GqJ^$#izs-O]۱ޮ1FPus옖4rO p<]n!JOWWc۟t>s{d?\2102x:p:y#pq9w?p-s^Wś {ųXB}ծo^3'[XonYL_gL\ݱ?δFWt;Ș׮_K|ߢf:^w3#Rhdd7 S<X[OUvZ͆3w?6e9qGiF(Wo?G$?,NxY+<<Of?ۆ;56H)H 3.{F Œ92%+jRH!hV8,#ZkdBͶ~¨28´PViÀA} U$x]&Ba c$k;aH]~!.XPXGբS& dL4>w:@ɑP}0|c;?/i][mI\(xU=N NMYm*1 ·Glg"ig j챶T}O"#R/BӶg%Ԇ%͞RcB+4t]ZUۛ+hlCYxgF W7/Yߢfws2(EkΧ3_dpdٲª븹r:Vln*HD.=g/Oo__HъK4Я{?O9zw4qFk}<'0,#}_}6n#Wu_!7t;~CפE/%:>/[8 ܟGs<|xb>N4w,>tAJEv5i05<eӜ y #n] "+R~SzN?x.@v,㑀"HJ"CH 8kQ4tp1$gҢd8ѩ`dE2hII&||9ӵRH8V-]Ba#k$to1q-zEVH nPEZK3ETTTwɬ-: h᰿ǹʬ*:mU$D5"281>/^B8o^%R"L%T۳Ԋdi$DHaP =*J\jA0m[R"aYLBA\9D' E:atnL ˞)nEU"ANڏS8\()bo^Px!iE'.#XB&vuPW|芿^FbWR2ڕYbi*!cAv-vضA3@nuU;%!SfZ.}#:\2˺c4 pDw}*2X:rEKW]#8"2l!AB^ PJ-]nR6R2)pT{z9Jc^[σvBt4~q[?۽$]9MshV-rH!XR1_p>izbG&TmK4-f]Jo^b xjjid۴p

@,q0 a:c-8{({>~c#A&Po~kvUw:./pwFw~#.ws|GoH~@Mr<0.H!9Maq|o[V!}b#͚ZiwK52e>~7$bN3pfEwyʇbXyXo7,xx}dЭe YQh;jۖ2K9ܨb@Tt^_ vWQZ}SʃM[L]&lUbDP$# 1# (I'T{w^HޕIvp)Q"ɖWdi\]$J?վ-/P|FȑЫLMz.2Y#Q3GR[mW%Ǒ|@[iPK`?X۔̶HRhD `%,*Y[<`(fBCĿܟ MJ|P(E /"W#){d># ?h/]3<tT%(A]Lc9#Pb !$ف,FTvn)=mOYP cU)?M!\-e2V99z..дZ`eFm.;9c %J&RDJ(VE*Pc\ݯhd{|ȴ+SwLm*>b2D[ʡ_i.Xi(kRϺݢSDžx0J3O/MbmE6ۮ!KQ?g@IȔćsFoeG4h_"@+ShJhfֆz@w廣@I̎$yF\ NݙqvTHD5ra@oWCmn6ծ Qu[ޡW*/?O2hk<#M%~587ڮGl΄y"j6 C)DE*!EسZp~ q1 EWiRت ǑroV d f{o߃2zGs3vUB C􏈶(!XZt]BF ky?oG;W cј5"% K{Ngm>OxK._ЄkH+I]G `-#2 HhlEOȪC՚4֠oImQT !ht[R,y&bh$t+QFd#z}Vk*[QH!` b*CR扪jdEt *)\`AS5 _MUO' vcQ2c0y J@ZfLEX!aOa)$J`9dF%1/+s pYT;b ju0Gm, ~eR, *%2Ck"xXVAxyJ"Kxqԛ=]?T+f73$Znkܹ7diZGlHNRhZ!#BKV#PW@ ) t0/3apf?ɇ#fӰEJ$@D; AJԫQogm"L#9+y&$zbUCTеbFw-ܣDGe,UB4c>S IZtfekcm7.IhODQɕd]SMxf]p)hQT vg@rjV2=6[<%O\@Uw(m 9zL@EB@΁m+e@َJE jG3j-f[i$X+UCGJѮ0Q77AEٶ%bTU$8'UZoYK,26&KV"݈'nMΊSh3>= Eƒkn0J ÓYEFzDPQrն^\ jX떰/K&Gl! &"Y ϐ#mBu 5Zd|B6\SD"iREՒsx(jbev@Y2MH%R*el0ڑDf Mж 2Rt< 2Ki"ѸHDQ/0 SB 8È I ں\󂰂-Y„L<ڲ|<\HO_aꊇwlw; MUR*bJ?x|fݮ&Oc5|[f$^qFM;E~6 @8l2Vf}<=x{|gGCLJ{TTnOgD$_W㈤ 9>>cۚvaxzZ7|'|[~W?=^xzz|֚/~CՊ(2:$޾´P75?{G@^#IY~kpy&f6M[nak*6 '$+~뿢 1pGد7h!9?HUIz- ȿo2O4K*?Ǟz}E m:T[!NRyQ<Z AP+B+˜CVMXu-YDyD]tht$eV 1ITNibɍb& f i`G-z2yW?mE5>Ht\H3 jt]*KkLD"uK a4bx"ꊺRH6Al7BٔkHy)I+2d~hBIdǑfa{V6mAbJM 1j1KB6(A+TQkET}A6FW_pwǛ|Ue.%ʴHkŒU+"m3Zw^*&25aA-# ?3u59F"Qm6!*% ]#T<MSDTΰiF#18洰\ DX=q tD$U,<"d! FIpFjO-#jPY@%3F5h& ^̼2[38=<ӭ/玄$3nXXbQu)k~?زRA r[$>:D,bbȵ]TM0˪\65iI.aX)S閔е"kT]?x-Hɣ"-){tQ9f482%UՐsb>^-hKv3=D.xVPB6*"\u7cTFJKP(%)GPJk6Ⱥ1$1#bm$4 h㑔 >uK07J*EFZL09hV[riVkD"h]:rU%oHF15LtZ VQWU"" Ep#󼐤*rtBe4,c+a&MH]:Th$n"\4@e_1HYY)e, uf3Fӥp8VaIH?zjՐ$jEHivoY9(!ȲB5d.PUT5Ifd]P0L]LYFDnJ ^EpF/'´b0F€ K"lj~US 0c XUF=LzٍE{iZ|GwJ lG {E۵(=g {H[_`%idIDg|\H$Bttk-|x^}M/.Y^ӿ(e I^ӟ{T*H4op|zk[t@- {zܼ31ؔfow  -mrjm)gۭb Aw[HqY -keTlfx|fsq^kQÀ0s=׫RKw| N2;Trm}C_^15TnfѱBHw n8 MRu[ƲDR^I2_! .,([JLO)ܟ_3hST VK>kw:wQw yQXY,㈴ndwf;a"mjl7Lj.n.85e`*B bdTOᙪ8{5bJp{fhR۰pt7~{7[;~׿-vu7w+C|rC ,RJx"8y Oii^]Ҫ|hnv Ol}]ys}SzM_ͫ+?y~7}d ޭ'a(n#&$̦|iجɳL !-^_ҭWNE吣{Hk6{̸ >Klae\4Bᆉj+,0u]GqruApa]",R2YBk#p f %+S6d&g1},n񤘐)Ēo[dW XvF m)3N[*@ ],|XP2z %5Y>r" R)3LJl/n~rqF5+fTbh]vM +?=aŬ)zt'8wcdToa9=]Y J'g<_W\g꫷\2ma6qY"(2>u.~&3ێz2@K_ȪA,#2/zKRh"[?K}vOݒ 0Mq}!hB)HĈ쪡g}AWH yLDdH>A(COvfC)5A&DdH.!u,pe/vw߰^Be@DPVlů~7Ęza8*;ʒ@'wIp$dMr$DŽ4uCnA2%0],e@KTh"< \hy[L[!JU@":rH2B*KNm)") #Z0|~&zbc e$!eG`R9&H1c=K0w3UUl'Sy4])'AJE{B:2FVU(i 4!'2tu,DH3ɀՖJ'!ĮۑdfrE|rtHƒ_w2g PZ},*$q^:HH0ux:b-ǜ$y ) :X9jvuC! DNt$ZP =vE+.B@!Z#O=1 +T!M#Lh#ɲAT%r&j/;LH)!`i,m,2{۟Lwc+lס`d]6T\N`š0<_%뷿GRǍ#H;oFHm[$9%dң*A]C:  1,Hmp(U??AL9R);T!$j}AĸPkdӔO0!*|ӌV&!"$nATH/v6PQCXPӏǮ7,>1>ޖȾDd- g̴ݚ? UWD0:V 'vMFuf#Ԓn Hȑn YH#9FdU\OvL'!L,0ᙹio^2zQ5eb!_-qy#??&*o~D7 햨2Lt/7ޯBl$'b$8=+QĄViDV°?fv݆T<U52>֖_X;af[7<Nl.ln([я#cs;F0=$9ťo߳ vScfg@|Yw<z ϧg>q{߀Ll$0p=X<计ٴ|_Q*l9<k|G_iV?~?y:^N'?[ׅ6%7,O~ʷ?0{n}On?rѧn˿J5s`3Wk8,t:Q5H]U<>?R yQ@-2<-o/ZT.o s-N[>tA?Ng.I%t?dٰYRp{1Μ ѳaYɻ?%H7;*ew?'"D,8i:F7"H$2YBZrp5HSЮ4bR82n8mqFٿfNC 2bl7akr xvs?"(Zf f8V-v<`hֺNJte 4UK.( QHRl]q:ܡ64%éQd*!ƙYuc뒴2TWJSUDvk,˂2N'j[c-Zi:c'Պp=RD_\Jʢi-o$7e&%+b#vkT D↞o:?&D,YU 5 8@( aIRmŖz TeBѡbbfAƈ\LUoS a1.h$UC\*][Wyd+jULĜ1@5z߱Oii{jG\|UבG lE|`ծ>//>{%3y15l`2|Ƭ.=xA+e*s2ń~hGfԤxRf]҈_QKv?]G$ B5؂qRBpD'U#iY&GM(`|T Ĥj (.R29U0FRvM3sJ;lm1Z,Z!Byd nEpOl/ߑ GL ೦Z:.1OpͫWd!3p.aX&@UY4,&;#jrOxۯ "͛A"*=rpjSb$)Gz xh!x M+Ɣh՗w3/oop7/>pxxb^s"3k>=W_3/^.,yDg*vX抏︼/>Z.wG?ל/Ы%wOO\\ӬW\cO<3QrHw?P75ViD!x{dXmܾ}V03=^/d{b'B9 j~ hsE'h sTT*1ٕ鹵-fv't f !P )KG+]n%g?$pƛ%)+Lc-Z0sF@4$0B#)DPU+5J<>~i:A !*RcXD#FDЕ%PY%&Tܢ#I&T@M3~JOdh6Wh+"b Ղ\A0 QbT!>8#~V&"2a/H$Lr 1 R)D܌i[e=h#J 2i*Ⴎh*ij1pd_HZy?3f*1g$2G0a "qfqjgf)y"DŽPltE-׷U|(8xݦRޜgTnYT1Mq";4(UdKXfB`e< PٕѤy$rIEޖxDyFh FC",HY2SlYJE,WWeQU *cl,`>Jj^e {. I!6Sf0 (0&Ā*U۔ZHD$잲kP٢ !!`t)mKRRkM b˭2 Dq"(%G)}q w>hţ$x) BB7Y߼4k 9QIU6!jL)Ρܔ E)fLsdjJ2@(-](v(UiB4\pHD9BP01#cM$!ږ~_YD!Y|*4_ȪtqO&] ZtO'^i+p1})kZ= $s!IrI0TFs0킪)> ۬Aga1OئcM(\B͒dk\&Q"Zu3D)u ^u]q9٬$}ll<>a-J&v|.#*A|<.\bꚟ )I׵O"OD\//eǟg~Wӏ?[=WW/^sۗ/_*b~3j55Xcxo!|1}'њ [+$>x7s}agO;y鉶Bpwwv{y`G~VL%%RJJN=/W<P!Y1F[77nf\ko-ZKmk.#>#4q5:.?ֆ9D]B 3(m 4s ]HjML!'ZfL#Cշ, 10P2RC {u~Oԛ+t.-Bg4PU+i4qn8T.*K12=iUy)]336<0^z-BeW6 "$hon1=cZh [M);iTװH~.hY+Ll(3pÿ;nC 9MD7#" rJ|@&]^!Dx8"%P! ru2 ۔\tpP,Tbi]a ;a[P91>=ZI4.yڪ%ʍ~dPoj9'% ~A IJ 7{D$*65v,VXD)#E*B0T+tUÌV%Z~Gj]\!yxA˚yOUKℌ$$nb=mJ |]!YEW 39Db TC_8"y4Fu-J+D*(^c4a 52(bND^d"@I4d5dC?L8gUU-qZbH[Qi˧?uƖhq Y*$l8 iZ`p>R4-ni؊UNÅi#uuWYJR!Tݢ^ݙyZ!${LDٖPý!4So_cD~`k˞$ϾwqwHeKt0gYaRy.S#[EWn9H-%4F nR+WfTI"}rj\fF/Ѝ$?c_c}B>GvғtruK^Q| g:ޣ$! 9\_4%B a͗f q,Bp-Y 8).=u˔N7/ל]#P"UiϜ5SͥȜ<_ܐc> yd| ,V<=QDX-y%M◟3 3 vHv݇3~r < vn;t |W<~|xcۡaZs}uFfgn_9Ֆsܰyqûi6+mGT5o{h~|#~v/pb>KbÅU3'ϋPW"DK:TLyn4Ů59<,QC ^oI La,h'InzHDTe|n$=X4`eE U dQq:ibZavlh7qrK5$zl<3FYb?|D-6 3v6Mt5FIkkx.@h\QrF'R,7x1U%j:nj22nԫ"Od%O!noa*q(QAvvRU@BF/>b $$MQEp9aH&3k,(GJpnB 8UE?N{o GkdTelD_P&_bLكsDe x']G!UE$2OyZP%@Lc WZJ@U6Mh"a+94a@Tnf=!K*UcHm4gER35J*t۠E@zv*VQ"%´-|jZ &B%.5S?PC"r@K#IsȊ2BdCOENj%$ Q k,yAeHew,V ,3OR$BC5˅ 1$Bm(e?VXip#B7;'m ?a, ݄k-4zLp)3 AZnH9QpT:w W ! Tr9*fA#T@?tuuwln6'6킇?:i" bO@s0=9V%F(.QC[/'p$o7K~~SKrI2?o Yn7|g'X]3a{QJ2k>~z< ~DJwY7TpٟmEr32$F3NWgdeȋM[Frxv|Azt8p{{f.#.=mӲN=͊qx"xO?2W ӁaZRgI8GrU\\1Sw-ċ[fسl#͚Պz-/onFq; ?% Y5]8}nEsTݒgUCty O`k- "2 M)5+ӇBiwz(Ϧ uW7ˉz"ilIGA=fbixKL[UCH#-iD(dhjbԫdc$GX! pxyNpֵ?ށK[4Y,8?}Z/nOGV#u1'B*!fT!8`{b8 EY05>#܄^4EPonpaB˄< LݢRj[޽FEF ij 1@|#uӒSsOPK&ȶ!jI Zm4m;vY07F0x+%1GDHD_0& dz#"BALS\UE? +݂8G\SOސcJMl5bN0R+.;^?U.^b L6wd)105S)Ŗ~ONHey|i }b8^iö594L˦.w"j10rquoKΟwQ5_~K|8h;Uxo?x.x:<a"qIYdt͋[~i6k^sN%z nyxtF&i!=lRȜ0L' ׿w~zagW!aZBe$j>Sw_ܑ0 hcf6#e#j|+􈎞y>ׯFᇹ %JiNC麐WBVmn]H5B%DA.GhE 焱$ʡXZ]P C.T]ShZuR^`kM;Gtniuɂ3Ac%;GN<Xi`Fv3<YWˀ m{jCUmtڡsDخlGJE݄ǟ~B[& EF%3)DB@)x9j )9˧Kb$f<"akH1 PEH6X!"yG&)˩W ڗCJm20xXѴh~"ҲD ΅vFJHƾZd] WdSӚ0E̴/`"]38xLsHsf3z:*۠%ג#^ҽ~h,$ "!KS6f`HV\cJֲx Id[NYITl],wD? .xlS&#:9TJ!BT\#"/Z2,pxe @s&D5"x#-j$Siԣ(;bhS3K v$NG2)~閌c{J|Obv4L|…6nETH"bJ6~Q:(N ]\r۶fGZc@: YhbdTzQ86 ms@I@Eيf(mjV,u"uv %"{@y4)U 9ج|([@U邐LFUj0PbU> j+d6IbRlGk2mTKber ]ܒpAii&F8$/bOېD& 1Z\AV$J sI GFRa-n}p1U]ނpviܡ!%] #G*&bh _vAPU &ykpkKBB.k~`m+ 9fʦYHIV0 -ł#+Iuq2ӟ/XmIc 5ؗkN݉np>895ә#1fsC'/k~D6|? @n ݉WaOJni2XX.:Z)[.se̝b}KӮm+D_૿ ???_pY_my /oEkTkn^nm=?==憮nyjEtanOurAJӎݎzayQ8X[qۑ瀲bCZU%/G+̲v{MwQU77yagݲ|qqR}BOe};WN'#+&sdy#L 4hs$XD^kiV >] ltרMttKCVF*1/LLHvsC<1Ѷ[Rh%K.Z D.-X| "B8,cXCiLl} -2Ponp>W8MRX^\U\y%I9qHFČ{WnZ=qmYWi*$.G91F|tgFJ-aO2m@H푴E3 U[Ue]Ǒ {Q?| ĜF~nkR[bRL$n !B(Em,ލ58/qf!\Ӏ%HpLn"P(Ӟ8\0tI!0sq$pn*ΩR5{ 3#u <Qt s %42Mno g5f q@ۂ @p1I#6%Ul['R/- w?|aԑȶe7"&U(%^ C2YgtZ灜2@UI -J,fM63k]#L菨lnZ@v$p/CL`qXe>=jVڐRbѶ$zGۖUfx 榁{OP!8DG=;К48Њp6]1].TaN +4TV!u.W+vO;~ *f~Wa {V ~l~f~oHa7\O@I[>#]/w36!|ٳH u7-[ӳQbU8'nTʛvfڲ2EeqI `хHHH1&7nĩvYv#Q}\s{Wo34 L[|@ׯx>C⋋/ov4+Mtί~pVXxhb&"ѿ$>ۛ7 3~y||+nnni r8ջk^ݖ>*p8 WT )'W[13#~ ,~aЩz1VNIX":{D,eH^dd58t-iI!} 4:q7YR#J Lj52yhQP@<iUPÄ[t[hZYN'mO̡꭪Ǯ78n"5!!xOc[@szzb|oRpMCR0^u^2Ðd5Q$I(#Hٵ<~BF[WÚu}xG1^39Gk, +# mB8S-MC."D* ţ=%eMG F"a=diW\aq()O{uEl=NKqIJ1clKTb ɣGJK)#P@SU˦"Jg]M߶2OX.MV9 ӑC"5)ZF/axFn![( e!N{qx:[7~C|L@ pTxiW|Re&gEH "3 gL'LN2du^,!#E31e6~])0KJN{tH,{nK}.?!:Nk#F(Jh8?ipD-Oeq+1!]_b:A2&bH]h3!c$}?q?Kq xx%6&>~#C_gƁ8?_=%pZ8}Dl'!p ?߾gy|&%TgRaǮpHz֝DH_|q+1'}|˛/5&Er}42쏴mKm@||Dw0y GmZĪe> \\]p8鲤ω IN58\~EəOIE\K`uy R'cJNBe'2S^CM i$հ^H2H4 #fEYMh$gu ![-ODOڡE +("]K<˼ 9aLGZF/PCjÂIaBl1Z}un +{E7XFP4 B %D[Lk4hmкAYB6 9DBk@p@I%hձ'=Du $?aD&Ą8LէRf>Lcg:h fK #B?UO2{tҡDH)b.@k0*}BNbE޲ΘdHƒ;0GBTkLvF@B Es_)jGV,tQ/#)Eȥ("8Vc]K"4 Y9,)~Ncl:-!+I=saGK/o|" [W՚ TZ5ׯzqI*m(̒eO\И"6)%oq],|wu鑶%+'%Ā0O#Mۡ% #HQ5 !U:NsC[Z %gR/Ј"*)2#S>qAs @3AYA`W̸xJQd!]GX:u">t}x*h ֓JUŁǙ<]e^n@0=n־MktҶJfTwIDaDA\T<}5mCnhLsԐ{OVaGIk;("Oa|g 9DXB@ZLӯYm/mC^Z_pͪt~|:r+b(YΐT?T7AX(di^[+GJ5#x+%>g2S fx>sXp>Z!py~{ٷ45?).z2JRxNzsuuӑv EVy߳֔(qN!(9ͶO#ooؼO3zb w?1^}m#_93[NS`>t`F_o_`5z֫? Y~nV/C[f71 #dHN"rO_nR⇙vKxgFysqq|dٰؑ;6oP\{KLxzx˯0·~#X۠mt]L E!{?|B f鮲r u,%˚HE՗Y`QJaێe-7w53%{r8-ʑcHM^ L:3{ahnͼ X[/1(k8@጖+D&lk$oZh.ˌi;RH#2ȑ%F0*Ϡ@J4 K/0Gi%Uc ' ~w<X ("TFII֒Gse9!6"8E# JYmݚhLC"ϵ 1EF#>#Uڶ|r=44C"*z8iYR/syXƑ%YQ3D0P_>JS2P{bZ}& #Wo H2( )yʲPd=|mb-nie^ i \9#‚Ye%ugDekGzxeYj AHZYSgrYGiQy:-vgBҶk)%ݏhFZ8Eۑĺ$_~y晰x~gA9l43\3hv]p I|4%!zQQ1H[yzz4s^f5~K |FJJRH6(!. -$_#ڞ:i\Ri" LE-yԤeF" פq8]+0 4J-\_\zV<2Gi4#B̐SD+C?r%LXciqliD`܆cнڢh"2yt-#c֐&THD{jhv"m2?_z2- e 0J"} ,:03HtHKd>5 &$h~8Q_3N+e1r8Lg jC"?x ݖ#ׯ)_~5[tb7+޿HWo|#W?7W$;Mq>qyyI)qpOL908U8_:;rWj?Ù8fik8Ѝdfm2ᄏf*<~DKWWyZZ3?H?q|rp:{wxG'iP1pUl8#Zux{u3L|77\ֈ'vWQ~svw[m|2 9Tt:~϶cx{bYI28=߯$dIQq,ˀ4a:1?ᗑ]l0eHc4Rd}yQp,O߽ϿG/8Wonݼx:?3?э#hO(ݠ'7[ͯ?'oX_r~x> 4=w=O3!Do^%X8-+4yՊ ^fwtIJXo6ȐP]ݨzQ$i;tD֜'BiėD 3׻?!ZL-Ym7ٚvB:4 /dDOd^]a`FvFwkTt56`^ѮWK Q]m _LQ Gj1LqGhA4=rYn#B:эAPa<0RaV;nH VyiF /a$?qժʰ"~E:rpyOCMXQ)brĪߠ^2dӞX,JI7;l6RW^H)^n(KJV٠qF\cm[v %SK,gՓ?ᴭU H 6-Jo?][KR!KR-E [B)5+YшZE-yS >,hTGXf]GJi@tmz^ ׈XW]oв?]JXR]IafMJs41 #jWclCY)UӶn{&$̲/ԾZ.>beemKٶAGZKJHRȤ)d6\Ut PêABaBi3aY}u(6 4nO,[Sٖ.eQ(jD72yJl/Z1<Ƒ]Ste4qoү^Qu!"v\K9!yq`N#_ '-77Xx?=rOyov#??2w!LW|ݚ8/nH!2݇H۷ 3mzg Gw_|R7^y+ܯ'tg)S%qLcz%a֒n{U"N#ZW)^RĒ-xF-OD<ׄ0z%$] Tĉ\ +R,\' z#BĚҔ"e"H\ʩ=M{סBUݠ%hE U1`VFHc1V)6yr&kZJ563Fr*8B,%`[YU[ZGȅBڷe:ZЋ@h] RT̹( TNm iMO= 9;rXAә~eWI@(9ѭ-ZerOh#bDk窰b)*`tКfsTBȈe_?=Z(rƋ@W@n4NkYGyh/ڙ#!F8</=Ahz9~0*Ԝ#:K2KH(!)/4Q~MFoH-5qV|bGHԨm-]8t#WqJMȅ%Fnnn(#Yʼ0N 0H~4|]uM=s쟞F}m/t˶鸺ytU]zb,l^]POWW7,әŊ+ͷo?PEׯ/ś~+w,$o^r}Χ#kݑpÏ₻w7|_G|t,ǁ~-9|Wկdg}iO\&ő4|5 o޼ϤE>#6Hg5E/~w9_nY8y~xLg4" Ȧ9t|F[Cvp~xt:E*H:R&N oϷ=4\@?FJ'(f?ݼ§i5PAOI! ?xd^W(‹P%D=\CR 0*W[qR@qd?PoEK[_(9\H)^^s~?OokYi=9ֹIF,P ( $$E!F 0H@ r1LpsknwݮʩĮ{^y4Bzbgdl&eωGY?\ohk1t j9`Q"dPc7p!Q8;?w/u /q [&+ R4KiEޢc&,*Y>}\"&3I$Sb- tvHYzAlKċ[UbAwBa^'ʲg{yM +vE(Cp.{T% Ӈ *cKDNgtՖ)YjZ j|9؏%KC!%~)~SU!b9DpST5PM$cX"ʋ$56-9RSc)Ԝe9h/,Þ=u#EJmr#QD+5]y\oK)91"cHHn*1O4HdWPLBT4 \PBBXFxe{,}/% *DŽue!fR` "EVʰi;|3)ٺs/B #<`Y5HUU44cmD9g~s{c$ ['MbrşҔ>DHĚfn)#% (~sAH2n7 JLiOGV-”sҢȦq#`=!+680A ym]Y#㌊Z0eu3gVx"IR%\@Ht(cP#He:v$鉼}C׸ab'xy8rH)Ή+Gn-n=r2l9#ۛWծc3@ūל?O>_\<}W}W C%Yl7\]nq W__7/oroo~3I£:Ev1,wOgc`^m γ4S)x$D[ \[ԦewζƢ5i鹾 qna?å_eIlqu||x fn_R]ozx4Ժa<B=S>bADhb<=zE'2͈,KzH m&zT)u 9*! Kd_p~*P4O+k)1 @yf"!\JW8d' Xy& )DU0bNْWl)ɯ+)>HPRi2H0=!5!J]VZ(e8)"ĸ"(;1Bsy['bm e5)5> k [wTi]ސb|:&Pb>Z#Fw+uߗIs e0%hӖȌӄ%⼧7R 2I!@O6[P[Bᗑ,ei-Xe]" ĂEJm14muY @C@UL;48wDΐj4(X3nf 6:VB bnZ(m|Ǖu]H)BH,!cĈ VKT"O<;d]$n!*F2̧jHR+5BAVi`W"g?emᧉ0N%6T0 qPLݖAJ\ ViA'E+kZM~<ebk.i༿/@L$`TJJDe m td"U`m)i*҂uX>ޕV: `]NQ|rLHqqh-H>uTR!έrZtcQuANyr⽠B.咮 2#.6^mːd4nA ^rȔ0cs;xG,Ù͆p1}7Z݄TmBҗ} I0۞u i$9!C>HLmϱ>3^fy¨զFBcd\F"Զa&qbIPe+ET5 3)Da*牮ʏC1a"@r&Fi-q(ŶbsAXVbLn꒛+?}n|B He 쇁]Cԥ+pF7fvVY4ţdۮ#%:cۖ tmKWRccy?`_^ 0OHxqP[狷Wĸ27/?gx-iۯ2,ç=ׯ_j{64Bi/.Bwxg<|D&=iamt~@~zG#O2Ln./5X!@]_3PM0%+KLM%QMSvYQ !G匐l6W#m,_He<&'QYt9&,|A+Mk"hE\&6(!Ty(̓ v"$V qpޑ7HUXD14ۯB[cF 4#Fg*1:ӉĶ:TJ )1V# "r{J#](+$#bFItd$eYůIjbl ) 7"TIِ|hV-hpG %9KB4 Rh6a5Av >eGKi%T wLJ wK8EtC/>.pmW*!C(V _u/J1NR u1U0 '~64s> eգWy!SEn k?%VY1MWW5C!`$X t=J+3bgT"|D@LD3=IS"RhU,jJOO,Ñk4&'DjFn/K$.؄%*3x Y2!8G A [XB#U!s*0Q u_30nKL9?H qh($-"RA"~%MnV (c1u=.H5.Rrs!/f"nRs9<`f^R,[+%MQn]ʦ{l`#,.#Yv(ݧ{ضn!3gctB5fhm 9gTOll6BS5,'ݐX\9VEPBDR\3 Hm{rmuȚd9xMA4'O{u[fA+քig6PUD0ʔU(4.zO#ͦAhlӢLM$,C \6!N%~??P;2͆'|?Qo{κ曷<~%)(~o7||ϰ$~?D遌_~GBpG0#2 nF-7pԜO'[W_| #_~û&eחlquX9Mg8#0ׯ0Frg P)ͷ:rGy%߿SR 2Ri,lHYd9M2$%r@:O Ɩ,Sm42FOPYl]@[[ Y2 i25U6(ekz>d&+3<9sxI+H=)&斬REg{tfm 1GpszsAg撦mBcZЦ-] u]ֈ5VyD*yČcle{ck˴,h!6.<=u,}y,K)D6-)el_"Dp̒7/Bt$"*S(%Am+ѴR n;²д!B I 2ZPmv1:c [դ"B)ʮGGT:,egds,A 08 B%:+oٔY N"r\uSnelXX'ˁ4X#ӂFi0G-60!܊Yb(gdž,2X )2Hx%]鸩 E^/t}aG[HBCE:@D`L4 #QsΤԅS<U5(%#1vA[e 1GKdU.9T:QPm[ 1.B H:Bʎ$*RNhLޭEHpkAn6D.Hvbt ɼ44DT;*ڶ6kDʾ\jt%H>[1UI%Rd R}hL!jE!5BDj;qd9i,2DL%u߳,4}E\q𮐧p 7WPT!-Rd)p!R ~)D{]b>\_jKΙ3) i `dgU[V*RHeJ=p4Zk*Y3rxCb6xP"#К|<$ƋLJ k Y.:ܽUX%3(Zrh~(uO)*(eb.ee U]|[eTEj9VL3Y灠&rN*.Fߐ 4yuh/RM¯* vqBńDb&S_ok!'V]զF:C!Rr 2 R0ϸan<$Qd*&b+` lE6%U 4»gX̆z+Iqlr6q"L}q\֔AUE @ZdY4րP-G[ {|B-?~87!Zsp!Kn#F)·J+|A+}Ssqc=I~ i]]$lm<↑o O6M˲\_^"sfph-MqJ\oy?W|ÇNUQfG6 ++Qhy\X<~x'u{m8 giBT?bFVļ8wBF+nc9}E# WW7mtZӈ[K~ fo9=Yo?'awuՆ/_r8H8 cuဏm4%J1>98a TU[H/$8gρ]Ӑb&ל1D mɈU27CXEY[-sTBnHBq;u!Wy:6LBKڋөP|)i"":Zr$-+yR[yn 'ڦDžp3yIuKM0%zALp*H<+e,FT wJ(D%YH"Ln,P 1{ڋ+xFR\B01L3R:+TKLݥ$DdG|z33k,u8Pxܓ(n&ܸd?B$Ȃu>a%DdYAݵeEĄddsFP.F~GgRIёC(&u$ιuE&ܵ)ѐ"s} ~L5YO'd$ ŝ`,$e2W &w]ti(jB0M_PҺRf8Ngx;rSh:8n) "Ԗ=Th%^܌45{! %K* Hem3 TkT֠E2DgbXZBS e+r S5ڰ2Z[ZS71Ȝ Ms(!X|`syQ\ t%25BIj󑦻 'O eYl uj/ٲ@#!#~h"x(R, H "R{4q:_b HqE !4+b ;xt!i2,:+ќR@ Ӟlo?_:0)%Bkb)iK*݇,%;G QRc=n$XHC)],VЙHDpG cAMڶbtKmZ>wnbٌ 9dݑZU$ u0tY"WBFr,ӕuL$%Df 3(3-X_!D- t(ڮQvH*IgjM:;RB(=Kpԛ+0´-R(l#4H2vW5l!>ׅ,qX%Tlu@䄩 ` $tb{ O7 7tyg'pVU! +M7 #URMyFGQއ/޼db "|O9i^_+iZ/a Grl4LJV=#a sޗё0B q/.> glx 1Uz^Ֆל~5f$OwnolUFێ߽oؼbC^4|n3y_ͬ8,3o4!Rp"zW|/O gz }۱_F,NV"e./.y: &./9}ӒH]xt v#mSs9Dmǔ#斏幄bqELT0ZP,#LX"n:ENMC\b5l[1-0T-F(Rv` )$hSC7R5hKe[TgX m n[1"3mVG$%4햴Aбl{bCh˺H0` MöVK,#xkꆰBv,+NQ.m4#""3]ݑeYM"+J4Y2%6-:P[>ei%=!:e!/k,i:)Q):I hH(ߜp~&XH(I"Ge: >alB1nVMGŔywՓLE*\ L$zO?RmZR6 1fLU#$n< 1(-@5RL6dmho߰[tBV 5~ɓbFwHZd!Ȁ[[PC(T|(5 XFq72. )b&?uL倜3'EŞ[52\BYm)R )%cDSqF!H[2Q|ZȘH!ۀw,;W#r Ӱ݊]wJ`&²2hkH\tAxϖ"¼$1e(J|6ۮ@uBeDw=1TՖ~JE̸?Tnә(4Iq! yMӣD$~lm$n.p[Uձ7oHSU-sx:VOyE+gR,DmjLUaΖ[ MKNuCYtF iDז) _:^FF9p\at+Xîp}yV,9jӑO?q,,|3rtI$5_w\ް #Wׯ?"2|gVK\|c9 wܼzIW²?@.=汸\i0%!-ro_Pi 3OLt.wO_}2aܼ?pfW=aBَU*_fvqYx%%_凟A&pw-N8Qscx67 ݁'xb\VXo/ۛ-n]xؽy?Ei9M7CIE$s[=W- >O(Cwǟ߳k{͎r 4s-ȋ/> VLߒ'_zN}!K 0]5pi;yF挪-ax: o5aYݰ,g[IѴuRdҐx|`$f"]Y"evEŌʹSƭJt: [i{ikuEdq6 auy"%#O*yLMċ̦2K !5ɭ$ >ed<CUBB'Yd}IXbضrLuDGPY7L n*RE&Th@&%2:&SrJ8<=R"!L'H穼ZSowEA5=D+Mm5$υy!u1u5ive!ą2wTgGKyzK4MY9qH2RBT&u!!\0`Œ#9B7P  D*+2#Ds52X5p%۶׷}PH<}w(݂ijI1%i¶mծ $R>U95D9L]ImU-+5|`Ç~^q-g J*!Vd0  ~0]#1{% +y!XeMŶ yaAH]g%^ R u9 JJg3B<}&B׭T:| ,3pMRH1((jUyg.I<%HIZjB~s2׃Ta8QdPΡ%Lh A_oeL48ײ {yaP\ IT$qY#"J-<ӵ[4u;)-$akF ](QIR1- u,ϮmURH#0%)R()irIhik?<@ڒ感θ+OgQ}KɅ,H@)xCP` )5DH Ӭ !5qmO 4ʵm~&M, l ̵&#Ye YYLY(RɞpzBn쾏m[|)YԨTHi8<>ЯvB\FR8c& MFB62v/и9m#Z)d.iAj c Bjd!/'lBB=\exiV2p>0Ρ!F !%[UbJL JDqzpfs cAxX_Kf yur~BK9,Gj s]21G51+D#K^H/5Prs )0<|`VkTAS`RF | dA}"H ){¾ d̄Dfe?niANlYm iOҒ5mHDtâ52=~)x?1uvUS]mѢ0/틗nKNX ]Co0N\ovb?MALiFZ_<~E B.ڎ`ٳ{q+r.,٣\\s ůhfWRLe}t R)Ҫ{?)~t%~z~Fg -j>}w f80Xoٗ_?! v^}~{R#ؾq,w7x?@#MgY;AnY{~0n޽a9_چԖiDnz,i^xÉoQK"/ xZx_/Yկ5ӧ;it>W/30{q4M|o9^8RaY<^NBѮzNO1ItHvW[~{ 4aW=&nGno9Lst:㯿0.yݷn%N3j-7l7[c@JrR pa/Z,:!%" 'ehWz u9"C$UCnf?Ws#]O=p]V$c)?)2ZZr3#ئXBsF(GwJ b(c=ò4kle6 jd K8HKOQоxAxt3Fiu=Bg-!0 Ȃ RR H) Hs@v$i%V VԛZsmO ՛ i `e^pF`٢hRd nw!BAB`v GN3*t՚mW|/p!c@+A ) ڵ'.g(Z:Q!`38-5PY+P71yqkSOIBZF"8>=q 3Z[8& |^ZTE\.\-7~r"5~zw] )jہP Xb#.3mP7S8a\t81UԦzkv'bhe[JyX:mRdg-H1ŋZhxD+P H>}ba&wP >xeA ARzqUH`4zoIHx_ Dѡsa3Mވ:H1.%F2XX ~$Y*X8Lh!@׬N͙ BeB*Xcj h 2Mo8~$ozxXHӭ %ThiwqBRPKêɳGԆ2qi:"-2+hF"rDkK.Xֲ@A_ZxF-,ȪoQ1smѶE O]uEc@8HiO1+髩;b×y)lwoHխiY ue Y&ݰi $T<%0R)hF%>#/*EҲP`GJ8gvcj:5( Jh*- K1`}~wD%1[5bO v}l:'kI"vT@b-n L $.>6W( lȗ"(DU)% ,=L,ikE&AN0b5^J,Ȯeysycf-duYt6G|FddX+wCHRqD*nE6ةj-R=fX='VT%+qHp>w\:D*(M1XEDOv^LhૻgfQk )ky[3#BL9PJf32V7;ׯgc,۫-2ݫ[ZiqmCݰ_k@0JyO L >|vi]9C Áyz_zEFpp &6}o<}Ƕ o[>z jr}>pugZ=_+x&Ljv-eDL {RO/#?pw:O9Ify ?6؛G62{d|4l8|Ck 0<1LӴ\ƑOt-J%.o޽e:O_^\a@kÇ\ˡ2Wf/ͻ#)A<ܾ}ôiږ%b{Չ58 $Yi~p ,3?wm0-8i 2(Ec`n1-*'~4-kr-R jVrldJخEB:_@dpni„ms[JYe:"b:XBt3,#!z BLSʎȬ:&rʘ%D<*QaQJ@)d-RzrEoG!RQ:k)3j7XFB8c-B:,I##%YfXoVrC'a]9TH%0qĬWX:ud:1kD [Ԯqǀ1ʈ#a8SB69d2s²)D@ -_.T"DFJYY|8yKDSiGA䌐"RCf٦baپ~Mkz4 jzd<^N7FDt ħ T"ZY{-\/V9rTF홆gkȪAvχH4qRL `9LF+ŀ,"$ (%)YuILWTn1M % ).BZ3MUiʼn 1A!F!³8@D PֆFui̙T2q!j/&2㇩v&J#l ]O%eW !0{q(xM.K ?Kİgޒ3^ڗ!fD,diɗAMހ t#$# 3E&jfwmG+^_* !HI#i,#F~R%zkGDD ZT^h[-ZY5ę5B%2C5] (RG֔p$Gok5#PljZT$)HCt*kiF7=qkϞ%Jh!!bb#E H9;G*ybj2Lxв3 ޾&*reX7~{֌~_qq:Φ 2?GsI"NW/x< |zJV^~qOLޢ5<Ĕ}Þ3?8גKŐAX %  atOYwo9#jBr:c@LHq+R4bZ&h,tyb Z^&vc5s_lBcLB3't1iLah7%}[9ct@!9 4x·z{5B[\8!vSP] Iax:B2LÀ-1/@eFJk\_1/v#RAZXF ?-Lg!%O\Fئ]I,Js {La!E+mI3_ Z7 1f \Rr؞y8( Ro}֒f}.1'T{Ĭ@ #zWLӈ|( rHr>WVЬ:y^0\#@9V5W4%,(1 J)D(pka ~Y 'rN~MIT zaZ<ӬmzV!hCICQ u(eq(m)FlӢU Ā E r 4MTϏkʵ-)ThM O^2)ՎB$ 9eOjZN!u*0eEt]3B?wJ`1MnF?)1no{,ِˌ1Ƭ?ǻR,#vv ^Jg%D2UDlM۳,]E8aHK¶]hC$sQ!fxz/s!]oa"%s)9(,gk QHe:TX2%W*Q:J)4qiVkL"njP 5K-S@:Lk)iDdC/X%t^EN@Rn;5׶q g-dm0 ? ɲEB}fFЀXNqJcĺs,(!p|vt0dtr/8mBVįk"M`l[7JtBRcB䂲b"DI  `%LÀ\a 9OmBBH3n}E*pDL\Mu[Za5#w`;-2Jʑ^?L3"׍1FRF肶[UhP#nUT4 ~4RPb-1C!HRL'ޡ5G(0 5fNvB?0?-Q*,3q ř[ a׻ 3`3i Kdw˼i("H#\UWf.HRjΧG[_+́f!AuйZ,Bo^rYd1-^]D3e_08imK9a"/m7nz@V644W+^|3og_~ȲxlV[GnQI0W[7 #w|a ,y{"%qYF\3݊0x>?ro[g%z?<W'ŅOwhcsͫ[%3onn?|:<03^ ƴf?/p%oInoo/? wx|zGX2B?}F"p8pç0\)RbնjB)gqD= xz/6W|>xՖpbYx>7K~뗷ZcAn9<=RD!¦9cUA]Hf%2m+_[JD)he-0%a4r§5cjC͠SH6H(q¶W(i #FZ-r xY=? qSUhKxO {U؁00BA ("3?~nMG(8UiֆVkn2A, ڭJÂq Dzm(uJP !V%`"J00.i#]#Fk IɒHAe8#P"$iT 2MT.8OkPa=:))YAobɘTNnsk$Z=wvDu$EFȉD2*7?"B>P~_~@iFHyjt|$\S]V31,ޓK&-zbY4mij{/"a#|@U)iSd^J9ϛiӯ76f4#8lmVv}2qFV}Lp r ]-!B |jI7?> wšqBD9l%{?ׯ_UR<x5%ekp7QQoy>#e"3\f_c߿gG}W-iwx!. ݑϴxڶf~It)RmY6=mfX_eW_୫b#ǻ^p|?k[3_&XiTu#ǭO4qW_ QPΒD!eE%$ 놀VgNJ%T-!EdHsun{q@Ʊ>"B r& G'ǀҡm:v5Yi{O.~C.@ &BoH1#kh ~A"()M5VHc"3 5Y#v"X*/T"-yZqyY)"!Pf2cU}/7-%Ծy"ѡ K A8e]_!L3%,*"T[V,-H1%+$fte1P5@! %^͊,ɳOR5T9BF7T4I aY*]YCukjgr 9"xY%(mA5dY7YG|1Dt*ȘPpz|!2Yc)`9]PD CDIM"%J&I!=[EiBZon^"X#8dӐ3EH >L*!Ĭ)sDۮ+[@!bm1Mu55[, /a Jei:B1{Tnڽ tzDdxE.(͊T@jL/=}b/ 9fqmq>W_2L#t[zR+Xbt칹aO4wl[1,)%z@mXơ"ħLL)!vO q&lWk`|>q 6/nKLe tL灟7E:jz$V7WAr}x}wciXϟ?ӵ=c+>~T{㚆vmPZ㧹w^z%EV4񓯿pxal^|֢oZ,'~۶#,1|"E;m*ș@9~WuX˔_H҃eu%xԎDIH)"{T ZF0az+i(V赬K׬lss3˪KAB&=$D? }=[-DHɛ6 wvMKcLӈcZsa5B9J0 #9K\PDKP$Yz90If:$?fGBXc&3zLԨZ0gJZ6,"׃7/%.Dz}S#ӡ^@!-5D?R HiEJ)JJFL֭(>XC &L-?`1'2֭\|,xJ^ΐjL/Ynuc ENEUx1Mk ]QJFh2Og㰛-)D@&,W,=uni;yur\Xk6ÑjEb%Xj.48Vϋ,hiэA[Ckz>ߒS߽@ic +h 0͸T} !%G2t%~Ĵa !fRk4 fE)<9okH*f-!-sGRKLOdepTٖ8rW B#Cf%DNa@"ʅF*=.(i\T_QҝmHeYK9?N.)=y0m^m)T߶''_{T8CYbN?3~8}ޗcŧ+KEv5<!5F'e1^M(a:1 us P=k2z~-q`81W+޾zx<1 #^cd<={V.JJ,O˄Ϯs`> U2HkCm9-G<E@mN3u-7Jw8,S\F~͛kib◅a黎qjO g;3}Ӳ]qF^\#ĵ|&'H4ᇅ/w3FJJڞN^u~&~ճkW;KfEw7/_?'f ӨF1j+b4{̺x{̅:Vt>3țzO?s:(={֕&{3mr<zcuM=nn'H*0b<‘D5 HMGvk.t"I[=yט26=N'}}0<'+Fmeɓ@6-Z;qO{A6+Yy1 gnMIhvAa2(n=)-kR<0R3>#M<2S=õ=FHG91]E7ʢ Z3cڅ)o,9x+C.PRaHU5-ˌ.u1 D$JwH ?%K4 D"jNkm1Fr#J=p8fnFU:H"XF]>JL&q$QRĐ2WkDӒe%4Mt|%"Z,qMKkz"c^0'46;vru+j4-B RB<:[; J/Ym0eYBkC OSGk~ 2p4V(vZlw 5dBzITƢA²U=meOY Ӵ-Z* %Pj]>`+j*9r%`^m@Տ㰀 hD-W\ g<)#D?TD_JKɒ9"<.eMRn BTD(B ʕV$uGυUgˀYB- Iu6]RFhYK#_D)i\.{Riby3>] x^N5 -+(g(9#@Z&<"A_&mmV*ix t(ʖfd!C!'U_#E\$>DQ`4e5rvCI"sF{1" PFӭ^T.P&{WFXF$)֘*F[5mIQUn椠^L}gg&HThH Zj 3̧' rX w'P9f#ȠvH#TQZ#*b\z9 %zJ+'mFڭab !$D\hV; i 9%sPΒN`:K8oX?}*6 (@ ׮ᄦ:yt_1bR qVq!-wEw(TJrpqR[jCP7qpRUf\ǙqB4zf|8Xc>+>޲8N':ޱ}7Wo~`S+~_s_1]6.K o%q`|<к~Ou8Cbz(@)B̸/{֮m9ƙ040M2jO~4Ϝ'V4}#՚W߾? 'eM){v4MToqF/e/3_ 7?p)0+R<>rس O{<Oӄ)ݴcAͫWRV2T[ǧ=Ϯ_`adT yYF$y/Fsn e~i=Η"6iL#EHdZ(lw=<n@(\gv4J U~Ĺv!x9,k,ӷ|2HڶQҡDfYfJQQI F6?=h+s"LZPl;)#!%Qd/7;-c43<>cq]%m†jgN!}`D?J%PEW lxQ#HFGp>0Vr8Ӵ}ͅ 3q$qy!@ӡF[7!^b: EIyٿ/448u=*鵤@AR LG~Ͳq$9T3RA`ڎ,*%V ZQq)Q1Mtx]\PRVYe/t)/ݒT0Q7BT/@B=HFz,#.|GRiCeC-9b΄qµ+L"g2i&TPREYAɠ#8]Lqtc8;lSoV[@inZ;nmɉHb<[#."$."fݶiF+4< zRW[׮\_ơEĄQ"tB j!řv$Iv ^F2TLd2BlS/ I %%;#F5g\"i@ ?\=Gj/un1bȅGj!KT.`j<3 Ye`jO#JWBʴ0WCH(V ˶粽:` UWa"xumdҮ:HLREΐc¬:T?Vh QJR!@&+A-4*XC(I+g_N?J"B$seEYM%CoM-ʷ6;$zi^%PGi0 zձϴu_յ#4\j?C@Y_!FdL=qLI`Ea GbϿy<X6YC4!xRlnO-DR%ɧP5 aL`^,g] Y0I`ZWE"2NHUŷ>Kt+UBy+\o6x9zz5~k75y?ל'>~וs ݖ?7~ BpP Ӊ9!p+-1sfٖx1'>֚541_niUskݎ#{޼yuϗ/작e'r}U's?@7ſnsXRKBja-V4=o. K k(RZzC.sݖ(K>-$ptDhp/v$Rth Uf8D ߽;z9-ª dF5j!D "Ȋ(=͎ c$2yy$%v4eq9cAPmy͊׬tֵuO8$Q(da4f 43u(b\* b@É0/jhL+U /&@IEB8Ɖ_SV$BmVOm E<('k/yAIn* ۼrfCjm:/IMC& SK" )#/tK,PR'r15Bc]k,OrF7rk: UQxrqE(EG_P9˴땔֠*L -\(*W C֪(m_4jWKR01<~EUB55fԴ=J+b\Pax> Xe9ԩPŃI1֞ 91Q&sېƑZ-#6b2ejGEzy>E~+HFdd(KHe|:ӵWhFeH*a}A* 8#iA74p}?ey:"Bێ@ZCH$!,8Dꕱa9CЩ&2Wg}L)Z Ex#"xȞ,$HS0S3"%it6hW攰J@,|~ឫcxaJ+!5s@wuCBA )W[|}gmHQxt[m@YHI"tLG,[DHA @Ph)h4Ҷ@@(o UH"6YBϠG Ŋ!Rj Dj !VQM #C>hMY*(b<{bQPm:RLH158qM& jÂ)39kdca˙xc]r c;-m%B a/g2%RĶkHH41}KnX w )?ΣǹGj㑯D*'>~}q洌H ՝K?( fsMnv<<=ͼqϯGDzW;x~y϶;>oaw1Yt}g4rxpw}OaxOZzYƙhpF޾z}'5Ӟq c,g+qoq?{yW^1O_!\~C=Ն,AI_>{nnnUOÉ/&]|S0QK# K5f7}+s w+WA Qn d`¨R'W)WjR <"=DHY.Pe%"X ^ج&Pew%#5U4"D-Qj*;.{" B%t`9=Ҭs5tQbEL-*ǟ֢}ͫWzjArZ*v> rmA jKN4gPE n#*UHUC(S®"*I?t튘#~:K¶WBDǵ=qqhEȂ""}A\*GˌLh jTPq QaWhۣ\Gz.mCe)gO&1N \-a.S34լ^uH!^Dc]jAÌny8EA#-|B˄ݸ?mMҔƐ,P7hIRt?>D ERxf$b)ȜÄH 2t q d( E?#vvJ+-i ] Y+|ȘGQD[q%)ԸvMSsJiDDhE{\!].1%|"(R bڎVgOZՍspH?1g<{xϰtWkڦyfw|8Twؼa8` yv,UQR6+Rq"po_]9~߱(gڛkWl+^;n|b}s5__X"Վ^sFn޾qb ; 1 H^ӯW|k-k}aug ~Y6kN3;LDcE|p@9V/_rP! 0nV|8<oGsbkaf6;R1O`KJ)tblK̉n}*2NJEy(!x4)uӐh)?ftIH-IUy8>_º'c4N 9=qϔqF7gD)J@c(>#uԵxN%a>Usq4A #k)RV3sn]Y)+38.*NUˆw~wKYq8Dry&#`) LK-X&YLXRL) TEOGo4E♧'%eĈk RуxԤa! w%0|kH55i>3뷵 @ Z5R{x"'ϋj<Us1mna:Qu0ܯ֦U0&lw۞jtB;TBס" YOQѣ]HQHmʢ:[o97~l;V".gp4Ԫg~@}IzЪd:QJ3sc~>RbFu䒰R"W=t!!!8O.yجԚzB&ឤ!eJA[0℡hÒ s(z[v3񌔊mhEDslCjCcjv]ja)Hq Ֆ<"GBŋa(%E!PhVM5Jhb,Ur: LaTNi󙇻l9~D(%XiUQ!!Nj]Gpm0 H)2P;\]ᇁtF |L,i H#XC#S A68g*QmYe5i()r>=^9ե"5k-Sk'h> ~Y#]BVksK))9GODEQN mAE8==nY rkD=|hTwdrJ4m1i )y~K0/SWK,B$.L..O]oX@&k5 ۗ5襛WRdཧ́ u n?iY=?-?1˄5 ?G?_ӁGꊫ7_o=gGv+4y|a:3fos~돌G^;0q89/7=㑭lywp<#Ȩ"g|:@ (1rf&}K\|Mh27+i0ڐbb]33oCQxs{_²?mlӄ3k- o4~ZhQR ,]Ӳڮcaji8fwx:䐈!2sTI-AZ8֛+e!kW +ሲѤtAl^KLHA4 t||KۯҰ"3ϑdd~_&/g\8߂<1 Tm5"U:X{> Qe44MOQ @c%Z+×[L\V /3ݶx4ՂxՆHB[AgZ$RvVZSG[3_gخEìa{~_1-OdТbT4mV3,3>7?1{BQC5S<:R%Pn%adD_A=x?}q3@ۮҁ4hP6XBZ]-+!%ȼ?zƫL #0Ϩ%3*1S/4a8%Lcu<<^]Un}*qA+UϔU(:C$ IQ5RRK4#h]IlFX(y:b]E1}E!Jm~MW)A/_dHܒºBB)2gZ2h֜\}Qt-AL'֛-4XQUg)52%¥4άmv.DAv-qZ~!&_kRc`9! GWB ɹ fΈ0-_tiΏRpeP@Hq$/jZ=g VޙPÂLm"4nG~eWwXW?$1Q.42i[KY(X4e^RBD.[j!S/4g:)z % 9-LOt}W{Rd ̇34to_bl(!Q~"@{EIL/~!B\FRJ*#R2iZYytXaJ :4<~S}jTD " HH$ !$Z"!h@5 EWu:{6N3k U7k9#eDYDzD,u VڹKY9ӹ›KL.0^ umPr|@y#*9x0EΡ@S)DF=!z?C>֠(]6>ֹi7Aru,q-Ț2CڶuQ^N䑮ݒqQ路 F#lvա$VڮRoԂGq8v˦ r(#&zC4 %",1!ӈ@ Rp4MW%%R;E_4d*!iYb@؞UT+=9R!ceO>ٽI X3)"bb{g+JI4MR2Ox* nø,fA 2/Q(\1Hx/׻+ NoR;xDߴdem:ⴐƕۗ>xBum귤U0' B͞\l S|`?aAXCZ/_p\&_!px抟;͞6݆O_ ,D}엿i w y_w,Ŗ7P:TpB0)k`&"i1ᗕktbyI֒<̏[GmIg &bZ\H)GJdja#%Vu," K 5<7-+-TדFbJ\0RUlv(k3Fd\g<H%XaIĒC J_K)Ѻ0Ra6bN`w,#M̂RDjͲ,; n{>лKrRLQB݋WĬtrPZOP `GDHi&F8O)l3'[E DX⇁uxUG Aδ-PB-eNިDPG8Mc65'cQE[dI8t[3rNvi5Z9Ohch>0VdlP֔@gVLd0gRlzKBcF753k*ld~7D0yHTx<4~mYFR1e5B yDRDfTT@9{(ZB"ʼn J5(Yk hm'HsP!"Z"%QUmlD d| MKQoDxkVG"ԗxDJşGnQvK(XDwu㔼[)eԁ힐LLyIlAozH+> OGbQX!X(@nJ5z$.4 'v-AUԐ ۃEn;kЪ%#EZXUe>lGW:t/k|m QHd0rEgnTi0/lO'D,4{b^eY|ٸֱY ^$8!aZkǑb$6 N*Uhچ4n޼(û0}qQYq?5e<8i諎)gg7?{qY֕-imwaZ̦QB1G^~LJ'ηH¾ѴnwI:^_|xgݳ_!wH%_R}N[qbk 6\7%W=gL%g~xw[$<>O'abfq_ilK#EI4R 0`|v5~#H*(O?`\f1Ѧmtw|-_|GQP_ppϫgOy5OyE % DXV޹FԔf/ k Ed( #4uy.JڮGϑmE|D[3Ś8[3ӑIiBbnѢ$:.~_),ݶ{7;|)5ZVKVSVU:Js]#%A໿3n{A w(:N 8NJI%R||AJ, oYӐs4]*/ 64s{bYcD+G:BX|\+4Fo$Wj(|ZJdiv[ʚlcK|<HtmroNaݾMu3MG Qn#2u)χk ݖX {R*n^VTaٓ2$X$kv!zA>_21sVlߣmum{U 9UXWc5>gRΑssAXM=ƙz3!VjJ -^B"Dc5-EiR 4$dMKm9.̇GR(1◙R Bz7D0'ZDqt=1flbpH)-Uߋ- mZu!)&4 r/DkrLJ#Q5h*4 $>7rBWg{HYWO5{g/E^WDI覣m"2{"zRu,(CꥵK EHȘ!ۺ0Bt}ZS :9DhE1@gX(͢(j(BH4IP5^,u"QpW9?nzX+U#wq]K -JZf?s:HㄬEe PՀ]RBAx&Āq0`\mn1 2A$@قi_"G 4}[cJO#%|w -T/?4L2i;; L Oɾ<'7-?|;6 ^~[xkJy<>r+'oyͷ 8,#Wo_s|:3(y:*Z$uXwF:c\;>GOR+O#I4l52} 4?=iq4M?l n.. ܼy9t黎cEsn./yCE[E< @,lS5|5yXXe! ؛z1 #/7$ &M+*ěW⧹RW/_t8?m44ݾ@@);rt]CB +mf/ (Zچ1NX4 kD TBRTGVd_ YF8-˄ɥq]]gk4D5 *gµH)YW##HL!-D_Rb݃TKC5gT:Z<=|Y*-j{E-OYTH㞧/FO't$hc\H" S`]:bE9GXa[4yrXx5?}b/ kZ{ѣdv-> ܶec3l9y[N +4o^rx'_}G0 \8yy-'._$pWL*bW]|[ʲy}ycb<Mr70Rq`wu|Ɛ![tr٢7 ӁniQ^~qغp꞉vU^ ?*0x*Ն+SW-XͼmPD B)#Pж%NoQZ Ԏlh_]Wa7l;_RX'1@H2>I$,O I)vipmex"H>#}sͺ}\]]˯X54=1J1<(>N %e;Ok*JיIi|β։0$ZP=&UC B_gሠA,QD^sl.9(=RP_!D< 4=RjXJw=˺ m.e͎i=Ƶ~#Oĵ1f$8da]*V.k#o/! K&x>4=R2 J/ i(m1FAd ~~YʺTTI%Ǥ!Q)Vo82eYP1H%Q)8P$~! qZɣP5L;#Jȁb55 ZͰs\FX]M##-P݆,%b9"(cZhv)#>S*vES7#2+kdɁu4C$~(QBagp&0x(ԢQ '2_8ZcsZŜMߣŏg(覭X8]͵QBqA=yv4"IQH9#Og\>a8M"qS~!6!bݨ}R'ګ7O=)WH, [\߃)!u#X3HQ >xҘEiSM> Kِ9a۶6E6_sEM*R+ETAY 9]oAbB(>"PɆE$)`-,H ,M69)%ZۑtOwdh9>[X5 9T~7Qn8b̕"30wQ9◅ր(̇{iPT<"4jUTa.P@ńcLgh E)wt@KH>yG_s+dz7#Yp8pgꚇ btZJ[a0Z1,3b}ቛ%0?]Ӊ2~Iؿ ւ(Sl;^sZ{b!ǧ'N#o޼خew}Ӈ[zmzT[dJexڱ\Gk {LXg*#g:ۓ?3kc#o?u^96-C|m[8 웞4`4}ǏDiچۧ6 ~ WVq~vy0/zN3j%~o;%xqfiaiz`' m4tf8=;Am B TRXD\2k&nHR5m_ўR/iBKMZdxGS i/.(*dɬahG!Y i)ݾ\QYd"gYo?/4x?QW$)BDx Y #+=hG fw_ SF KBkITɰ"-Mt-2` ,Zfr9E(n1͆( /OUDLX-I!GTH'kw$4<]G )xa/?bZ撜"Bd(ӡ D19Qt-") "FIpqL C5Gd Lבb"kMZ) X@ejе#)LiLSQJ 0k& j{A]hGHCgxT2yeQ+B$eQ< ĹU46)RadAeAN 9,*濑6F"EF:XV3e:r#q (ՒuA!9 ] ;\F!s5nb:TUmgY6;ȒTI`4q 9haAbP \|J;rwTErX3%a06캀0(ߢ-B:eŚ2qȘYnW=JYm(a@5g^"s!_1NQFB5PeZo"ZwU;T:ZN<)bv7KTi{,pbGL])5%Miz4Jh<~XӂC BkHUy0gi>\ Y, 툡7gOưN MSӎu]iPx2{&5$:2q8a{yӇ{:yŧ3#,/9oGX~˴T{rͼDL*>;mcG:8"n74EHH kP#23?_q˗=??<ٗZCE8#/o8uB@a=XM{NHh5LO>y7Wc\p㸜Q䔸xqMXVs,#/>yO4]]N3Zk3? "R+E* ]G3 'Ì0>4ٰ U@xDlHMƶ,ˑ'Pua0cfܐ E.(א$%mѺED(kU>WUE5z~`|$rݷd! g'r`?-[6L qXOl6=vaꝌ. tj %kT)GCRMhmQ"saWT@"JrUV+E%$@7RNs)U  *sqKaR x?R1q O#K($vg._ޱgI$ij3i{~mPR׸%Q }n4~z4m)JњZ^B:/R ʒ@*F׍P"3nҕ 2q1} )/hAfezP)#_MpGM-xK!R K4,0%ȫH&B )U}j5|Fn)a`:h)|JYvoLT-ꍂ,Ni"E20H yFJM#a8A-Nq²0ݣ, %{ =F &QpldheIE!3k!Ir" [4II~-qi+JeE0,X(h. -y5!G>btC 'JՑduA,\ܳSF0x;$T)HqFDndxn,y>[JH$I(XWDnOthY'Țǁ_Al023(4! i{~/ʾn TrHڢfY]-YU[I#>GyAY&w _vH"mm)#%sm^ ےjO5w$)YҌ*,|v-|!1"IlE"TE MAݏU[J^0NA6[%2ir8bcwu=~pYaTIM#v$mi6WM"Kw%($1[}u l RX(QBh#ՆG:PrpJcu >d z"eH9̔:<js*:{_Id+$BQs{_ BH%0޳ݾEY$YK!pF7Hy" MnA#BH'\hXytp Ìl7(%aO/y5W&Aa+ ZҴ3计 4A)upu?>m#eY K A:/|fv1c8 %<-#q/9g9EO8Xj _ .o^ls~0xaO^ycFhlOԛ,ۖgVc֫)o=<<ꔔR4+.mf';Xb+`x:@RPHQx\)vYјݶso~~]Rû7?|{";reljt9{$5)P/ 'Ϥ'k3ʸqxiFp89?|< ח|;Պvqsy/nx-JT^q`*㙰޿ciLF30}dDmU=iiچ͚< CBIs!lIBpسq ͳ+>>>p{y[]Ƕ]Sb{U}|=+WŧÁ}k.n9=`yfuup\oVq~|dwy{6H>0t]g9I.5+BSפˤ(Rm vѓ5i@usKA2X1$!Xmh;H$iX]T~K4s>L!9r|VeRxRaJ-ƀ %59 ͆5t­/I~&TL牸$ആ000u`dAq3*ct>ĸU^i[GIDH04Xq8_a&@H$tm!2=8@MR:D<|~`/1t g#SXf>?`,Jb5 @HUgDWP*BXR/)8RqfDnZd?# )kBObR'ImwfB1=sH:"+qi5]7R5-aai,_8OB`4YHƱćkgdDi"yu C)2ViB+ w+*m')3ǎy\pB3v7ѿvG ic5ϾÛ\ibb[?iDJnJٮօ vwTy}t82<?#ϥd:!eR_ӆX[<їKiLHooO+VϯG]G]7|xe J=ݹ6|&_&Od%qY964-HWxg޳^1:331E_x+aD%|/iuWCz?C+ݙKBӌv&H?L|ݖUN:4pH5UùXW=2=~b#IJeb{?`f{u|:=y@O4%zȥs$ƈ'qN-U?giw+vL~^P(|Br9|˯H2 MR0uJi Rtݙ| R f")]z脋fRbT,·j,Ն<Z4S7uC솔UAUVKD7` V(#Cl etQE*Z6 E"DL%+9,th>9XFH8V х26zR D5s*SEc-P,O",b.F9e;eP`bʴab5 JdbeȏGjtGf{AB1Nx5g!SlF-hH>RCP.1ِ󈈚Tg]!sR~]`D J2%J`xIl7 IKD2a.ϧЊ{B= 1JW+n˸CYIN:&D"DJA!BmRĥ`,$(\0 QL[ <(-QJb%#JNOc4sWxZ^XkL`iŜ3r)ӄ 'Y<(LGIv\McA*! *Wa;`U&g a4YfX'#De@;GS5eb>$KJL,ʻj01|͖4ђq(^>ba b(JgX$|(%yU(cJc{O,[ˤTdd4UU3V5a|%Ff+\ݯ~ߏR h Jئ"ͧr,267&'boGusNH]TiI*̓!wg҈QFsgjiR=OO3Ͽ]/5){?S]i"ǹ9N=<.%/d_6-V'0i*4SBȂUlMfH%Rbz&ZʂU Q@ R6x{ A B,YHS"ĉv5R:rBǙ'g{qh IP~bB/SV+k 9KUJ|DXZ]>O@{F$13'vRڔvǙ*b LB"4'lSP٪P(<v?KM/1,,iw JHbua>Eښ4tiVǞZ;?^?gK\q #_A9sy^13WܝȔmd%ٶ+b'͊ċt=?y%o~kv7WL`usɹ!&aF8jᑼP1#yb<*'>}ڬrw՟ )!*|!#Y$߾xdꑳ5R=ns[ba=RR(+/qURmXn28Ӻ"RU'=0"#QvCם"B$ VBSq]VuCeB#-3n"vg8a$ET 5U $ يqJ;rʜդh]#D"ע5ʔe8!c8H֚J91¢EdTC?DDHYZY"DI}D.*r5LJ;zMGcŗ,i\})dU!D?0-6 /B Rb"Pp\qTw"|TuTH'y;%5oiQ-kh>=Z m9K<1Ɂ!a;Bk,R[eFkƂ ƹd%ON? LD84^3eD jW1-`4dң?w)gUy"DA0k*0sDL#Ѓ 鞋/_!.E4 2c9lS![ l*1]a*O `F\Z:5,I瀟NKT-nsE'Ymo!.E+E=! ? QQ qjb\Ue d8B$hL{A8~Dc[ԛJ= "cWkGw'Ͽ"qM,2"üxFDjQp,92Oefċ#ͪa'DJ,ޓ}dݮXB\ʔ{f /RppO[7,iqo?mIJfqz}ͷp?r'v)ptKAߍ}jղf Z:<8ݵ1{W8ymKhݧ;2LjfLJ;Kp>D./xiZxlO{ǐ"wwX__r8Y#JI6ܽ}OeXn!s 5>~`׬P/.o|:7S&^zI^dSs2{,whc8=" 9Nb`-X?qqs}w}GۮӌHq|2DVi7f.za0PӶ$<^hkH#Jn %nXHigwC[mMC;ZU1+OmHӞWhY4E(m'O}yBtBUtfnYq%aS)b{OhN*2M4F!*K4%mu0F<͈T͋~,**2ư`*KDxLMʆiXoe.&ג-< 2)J;T(E9b*&2q T(&\q-Fj,BrH[|0$KNDS!3;j VEPVk| #>qi UFi%2r8'0ZJ7gLO2S3iAFXwuI|G#I= XfMtg\Ղ%>4煔%{+1E&XS=2bCT$Y&5<fB<PRn$ ݞ( ks)GP2aZYnqz3V|8<]+LMHEA`:0׻ydSag`KsN=qYB"hK OG2Fe8W.y>,$YK6=BKL]AH,CT>=Qݾ"-gdQp "b5#Aڋri/ DX֥'X~1M[Pm3DP2vJ..eAi27ŬsX*CP~n%Ѷ[^A,%r*˜jbDV-)B4_%.'N{l!1r> McvTnճ,pVzx>>QZPӇD`Ғ/V/ۿ qYpq>v,$I\9"$jfB)H瞟g37X%i`|y~E{fa݊l~'{ twbǑ0?=XA(!s8ҡ@gT x%Xk>ݱG.nf&]_b02?Ꮚ{f<LJ.9 6 {???3T,˖iٿ "S ;jW1Պ^3vAdrG#yu%g?t`/1W[\p-_|S~闑|\ǿK֮A8CK=1͟ߨ>ݡgw"{ S;{Out8'O!ޭ?<`{{~[&*cٶkN{D(25<^ryMF!jϯo\t ;x|xd{y5o~;$ 44iׄyfrY_m`#)YgjŲ?rB`4/qUMz 4R|H,dK[rLLGU5MՊew't[ljŖÁqB$cƺPx18`4#%41ޓD"3LŁf^~y|OkQJmjNjf=> Va;m|uoȶ 2s?s?9G/ jw<1fH{jdûԊޮyٱjܽ k4=~F5%pb]jODk >_L30x~qμůy qϋWT+>Es^:Rܱr5{'S%QISn{I=_YI|rݒzcG>{<@]4^_fV54n|$Y+ubҙ, ȶi&?s@+|F4>ψq"Vn ;<' k& {|(K4!\[oԍ1<VDRB?b4zL Xj]'0G?ӾETLy)" $_Ach*C #o]L(ˌNd-F[3҃2 cKH)bЫ5qZ~~$ՎHTT( f0| gc Y1td?OGU%@dN*9XN\yU~X@ L]9 U,Xhӝ>] "v1u(kq*I",~:Q_]&b\K nTZ[J'#kVź,a)QÀRcP F`%na+܋['RHH!iq\ eA=vd ЄsDcFZt82,vu);XHlPT*)İ`출>qBԵ#PVRa]i2$ِXE ں|wO}yI\',!d1r mI1JL "4$?ܓpIRۺ8oRD tɼKH#d?mfHlvHX؊ql"23GNGT+H‟&dL,˄Z4 MSÙΐݕ-5ih9(wk4HݡBfvElm*eb.K/hK ?eS R^9Gi`B;]K`cHy5{t"X !ERw,RڜDƾIR4\|f{%*PAdTժ b ~ *SKWmY3N^w&r?*tbZnU|%oLE#7_{T??QBp?o?pڋ_G_#߾84i[ Xtg?gfebej+޼^5>@ߍ<>+}Dey8?+\p>\9˲ϟpOSU엑g7)x#g.p{ aޭG#)Dut!؟>RZ(2)0C`/,h43^b'ӹ3fwyz^۶LZg9}p=A(&VSJ;^ϘRv7癘#k4 B;!֗op 3j]):OȢ0GCk;VeE'A6)s¯ B̕@v)s50 J12zz&3(*/4wHs?}$E8(FPT $8ٓЭ!zOZBjI֋ȜkBf4`,H aQ)k*I{qM?c\\BI,G4$P9"FTi[BȔLASETxDj1/[@|؅aבDaKPZ IA9szܳOftm-4䔉9xfa!IcΨ!<XUza5uu()imKVzW_(%bq2Q))2ҵsVε?Vl V:d|pmuet~?ӊ(tz<[R4Zq9nȮ^G#iZt >Tk K-: BZ¼z* &&OO$ P|48W!'dVyyZ#-hM %\J60c0$Iqv 5İ* H s8ٴhY:E A ˂8ɑ&N#NJ,NKg:3?<=ȫ1Js-a`4:CBaX d~(G:rd!"bMKZgR$(ZW^.>}C {8m)I2 :ĺVlжh$R@L֐~F` zc$",k!'s5R u$&fĶcyv{[rFQLW K,"(bDaѯٝ4g9·#qD¹mË &O5}#'dQ ^q:43L 4u,T}u3i<9l *Cb$:At\ݒu6C4!١noFе^c+ڋvA:#%EVfϔfsx1gꉫx>o{.npqrz:bUrw7<}{Gha|<`rկ\\3oi^]r ׻ )%z~{R"ydn!%R)G.|`kc}pBy~7o߂Q<ݛ$%*Oj{0+2*̶-á\sb _(aC hIAIS-Ѝr 'Ο?ݢ[xO۷g@("vؒIӑlU5!#IhUL)vEjSK4nWm L5zcZH{|04%x1=۠t3t4MKSl:ʴB#$5RDu~P"90.*a(S %AiȂ8uՒ}k[yd~puK!Jv@*&k@4 _G:K6-: t_b3u%nj2qiC[e_0WCI,l DKkzVb2B[v0Ck0ɬ!Q_`l-dzlZ(4>SrBJMV l@x y 1~j \-pΐs(nZVH}+1KJ,,~ /ȜX¹ش#i[|Z(>`K-13u&2EzP5(|>[m1K(tF jRbZPՐEH!RB 8a&™#[EJc-:0a!׮R >* jH }U7]J! DJhӓ3ֿ7eRٙo:H6 "Ze;v:eB)#WXpZԐ*:[J(_] dhj^iFdKR~P#'pQ&gMWZzxk "ψ#qE"&s% A*́"%hЉP ƈB6-IKZmXCAI*2VYi1)J:<6ok7bi6-^ |(HiM%zKN3?BQ($!_PfX%tB >w补پIc>pVU#b]ŝO3hp=:H;/$(\q81em牾Ϥ *PچF ղ'ᴒkNZ299)ȼ B! Z QtӓK@ŌQj{$(GOfWJl9~#ѬH崐D5v)"F6 HhA3%5(#iрE"[Gdx 2Dhka_HkDO'nI:, 8KTK9xbM#Z;Du@R#Y[??"^Wİ!PYҼ{EiyՒ"m5"4BϿ\ϱF5Y $k|Ǒ5`ttlzb%wJA}G 9m hCgT8Yc@߶gԚNb@rd9 ۖm2O|o |QR16Cϗ "8=qD|Gn<2'|??~ 7OзSd 兮0Ohc\]Wۯ2Iu+DBZV"S&Lkt~bf zPղ[/gR"FI1ƻCAHR(:a"CKAzN˚Fٖ(@D,%if@kd?ϴ:I$TX2x=ZV0%4/BXZm(XC@(AD!`=ƱNV$4Ϥf+7 E7l@&KQLeR7Iknޢef3\%ؖyd=P31%ѦEhv?FRE$52pu H a0QBN`:CLR$5c 6 \%B;X +VU(3 $n ru;I4t=S"blWxDVw?7<~s^"$#i9u;6[TW242!P\O $9Ft[Jtm;V\޼G;ATLX~YqAKE'( N(%ƙ"5rdb,/"e-~>aR[e z:k9?ӂj[R(J 9aZC^^nQN!Hx^_cn"k چ2{~ۿ'9 Jn?˸.%Y3^2ǕWg;̦elovխzՔs93jpqC,t0!Eb:I_[3LJ~u^o瑯e5'̮˧/W",+2KLC=0>>s'{=wiuCGӁÁw9gmON3Xe 7' % qyjw?| 2#·IW?}ͮ@XG~G?'+ui%ݦWe> -nnT5ӄ 8=1%t*G MY8a/| o)%slL3u{5әvzR;Zc0 %e:G+5~>gLm+tڡƟyQΑ;Tk#Mӣ#y/R oILa$Ҵ^X5X EFiO#-i]*UE%iR)HQL 4B΅0D9\VT똧Ȓ3RLp|~B)F$* x \'Zfn׿"Y$YA-v9:W/̀ϬDݰrqb#zֲCDP[XTu牒*Y C3> "MSQ Q3%f+'[)U_d'  @Sm)IO\P {s ȑ\"9&JHrd-EզRb|ՓKB3Zku25E3@ &E_[ƒC">%R䔐21/g<GBHUP Y(ӈ,\>HRHٓ(Q!@z(ce@aiӮ#N{.fd- y)J^lv,ʶ!u@mz.R7"e LS"Vu8ᅧo_qʄ3+kRS|BiGue~'p#ZW˸mp2>TxG,"PJR 8JcE- !Ȫ#joB0OLpe +yi3)%JmT*%*8 !e̯N _0zᎂd3=Y[<{iCC&) A0lW_q?cFSGI淏Iʦt:[uYiO6 h |?=Gya'_h;w\ [Dc c _Ŵ @ǙaH hDY޼q\(~i4?|3O _](23wimf@O{Z1v/_1GLFnnoW,{cyMCɀ sX)0;՜5(ܶ}xo(Qw7\5n >)K(#0?Sf\fy%q9|Hq~yfw55w̼NU g#1Jӻ/Or{u,3S?fЎWʲ͎g޾{?140N(]Ӱm{~xBLk~rL?s@Znnӳ?qh۶|>RaV4\@WhWIL"'btö"3:fm7(B`3/l ed-1!R(B#if#DAyM2/ĒMk*1Pyܦ^xZSDn {v~2X։Wɣ""* DӴ,'3QƐVf]U}{әugh]TH ! xxQֱJa*E$°|ϼhږG$hR# Ufa+q+_BHJBO{J(l^<̏#Am2S:#!T_pn!GZ Rj X'wK5 Vucϥ%H!#CY[K๠+9j2W+Y))dQH'ݑK_&IBZ8ւ6\) *4VId=F JH=@_\MiU?k1̬珨f@c֑r=vCmƗ8A%BdT[ scv0u]C) 9A:=;24KI9eiU}98=\$vc^L$9(vxT꯫pL=)4* & 2Wjh,aE6,ieMӡA){J H9'kuKIB8itltӡUJ #ĉ=Z t)vò1L^.I/rE.BA&81kߓ`"4B34#c45:(:/Y(>TUHD8sFJ|BPT%Q"9Zcוk%ɺv(AXcI4.g;fGORr&QZ#"d# mb}%ˑ9PTzYYWV ZH LvHGY$CyLCVp@kCDqX׀,ORCuE}B`;K(sD4ٟ ~ah{JuA6Ce(Po(C hk+傪FeHQ,+2G : e,iMaC^g>Ta$)m v;?oXBa6<4izF9]+0`#(m1d=%v|z$8U`O*9sRg̨f 3axƩ y鴮YDaiy<bBZs-Ͱ1A-!|O HqQڑo'Ue]2/3BHno58 XEK~M#~5^4nR|jl,}߳|b&zxFxx|:L=p|#J㾒 a>W2i:0>h wCCgnnn H.i]9&e!n,%-߼釁i~4 OG͆i:{Ғ~-_}O?ӑ/ O+C2g點{_h: k^g嫛 &|g o_ffGZ ?7Lcçx=E?)?K>}+r\'%mzQۮdIw~%`$8<egnv̲\[r 3?|1yF F޾8`ۡ2tHPR}Pa(1چ<4 W_g6-Oә8`x"vH#jAk|B!$v,j<RLS5EK!VӶӄ?\ܢ0dܦKɨ_ kz^gLCG!jrGhflӡ\G,KB(ڒŠZ)Z"/Rqv4F QE˚Wh޾nP$l|aж!0O$iPGH{DdcL#ʶ ;qF`L">!D5|]Vt%DcYc+(z3`d]g .-Y|!J#Z*R}9ztȶEeXO" T}o$R͜[Og!vdPB"lКL5lJ+D)˄\@HEJ3(R_~7lsyKI  s(X@%r2 X(j7 Y+5eUcspD4 d 5.膔 "/SDe/는T_I"4RU 2m %BLh"SĺYlF˂3e 15 :8bvUHWk0[B"s58iG\8S#S %cdb=IW]- ;<==b\Hu=L 1eAfif4X]']#%#i2h%2;T,j5ЍŠ0+PaP \%řuSny g:u=<gr=Q $ށ~͛? X?4Dh[7tJNgLӶBNuS$@xa\_SƢCĈ#R: aQJti1ƒjp<b ! ʺ"(,>h )$>z#@ ( 0vgtY ̈R9dҶn 9%r i+托V2A(O'3>œqp,Ta)3Eum:D }u/LN$_0MpIQm"%'5!P.*=٠J"R4-Y:y}qy:B 7oPRђh?!ą|ū7[MS&1q}s/p˦x` ,:s>qR$4YWP <}JS#4K\)`fNc'+IHS]#߲zIvFH9۟2θƲft8'+9f^]r ϗ' 4v7ޯ$2iN减5}l| ظi][,D~?|<>B42G~'<<=lj?x;*uO_ӿ RȘ.8WL^`.:|?)3r(yYÞ5fT*{=a1`Z<aɑӁaǧ=ooPȧX3R+n.xہ ovW3は߾#ۋ: RJLDo[,kl==J>i:TN?."f(İ2-J(=e#_JHWD + EHDגd]^H!aAZZ"b:hБ҄"%,qYS@L=Dº./ςmZTZ dYkPr@hG \ Ndk$|/y\m@ˋ[ Fl,B F;rAHݒAZPmՎgUx޳yOpس!j/W:nk3Mvsd$JU@eP\ T¢ $,Aa!@ p\ʮ^Mtb8i-g1c?7}q]C+2rtI H[P׿}D E+r#D4Д7~?RXmRPeM[ye ݶD%OWp݆ "! $nCNtĹ D)ΖZ"O).sVhW1p2^0 Bv;Z_TcU\I-TdMS9A(Z!XK!e>#+AI0| p5% lO+ƲdLLݢtr8y1(1/u)#RrVW {L RxJ1dDH)(ԡ5z>̦i"2,hQ0AH$!f !+d+05X]!8iK̩ )Eqz2YkR%ҵ9=?)9SDe:Sw%sbMM(?ֿj&|aߢO?_/BJcDKI>gfs10.3ۮ\$Hkm >KҺeA5=:l8_.l7d.3aw-_p=oJ7b/3OgVxe[~O,c,S^qAmILXȷ$ RA )wDHCJ8Π5mٖG w- - 77gIS4Àh|@yT KͰ a4R,7 f`<_pa&ڮrB,%`9J̫m7=?ʹmGp>uQC:MU#/ءgYeb#mh;^~ "zϾm9<}CV7g_G~߳3[^.oXq۞4C;t i8e9|yo?WӴו-|,5eR%酭iWϟ~f#+%eH_~e3HB qqہH^fRH{noqC|>Q)q9>?G,9(s_#_5}@-8 SrZ^M<^ش*(l}Ӓ%k_8JJ۞unRϘ,x}y׆^N1-3at 2w`aS%G>?#:rR1㻎xi;^3i6-ӍFoX#i) X($9zN#Nj&%Z7[d`GШ#*Tq~vDC jA&MQY`1rSFHn S%9q8]pC_S#9FŸ(ӢBnv+Y$ʲbXW(#R/'inyfrh`Z7d9"$Ai6HEm m }d+e[´ }0Lc+vG̑~z_(fW1a4-dwKDF?I~fZ.t!RCZ41\}TiBn:!Gr ӕ.dRD@#skIT-F6pB^*JlJ$!'d r!y_qJiQB`9a 5+XC!}kk}%v}﯈ v@BumeJdlC{2Ie]C.Rn{GR V tUZIK eH ]׏{g-$)K?Y%%!R8c )2.wU"뼰l>b!ZJ$i\vx:b˄ݶu?{6{iB\98gy~yWo~fKp}4-,IgO^gf<1$N#Nruw8. qZN4MJ\kgNz|*Vf//4;Éi6i1bx~eZi,nLXV6CzwXcȧ?3W6l|9y|4-loj\fOJ_l8Og#n姿#e%b:SE4 8N:^_0BR(k@O| ,hj?o0>[h~+\/6yPS %.ѳm 0 )rZ^>JΧ XCaz9Hjx?"N_)]i*Q!KuM Rt,s-@mM%Ŧۓ+AEhB!=6{(X7 yP# GÙnA+CP(.o w#DXhbqZ¸`lKZH+()udӊ" юia$Ai, PFB:/1 b#WzKiidw{/n7p k?\wؾg|>^9=I__)voRLvey& f|;s|OomtL+·7ڎ$ / Dkp|x|\;o4]'~l #vۡQt s\-GOODOռ;TfGʁ#F=/3>0@~;bPaX.3www<ipx}/+HHN'n(fsIN<\Ԏ8c۵8(Jt2r ns~'? i:!bWX0Aih%J6RyX DXZmiZie|Bg-ŪJ lQZ"mCJmfK! Cq"z B(gY[-Wu2䜘בn?q >pV.qj ,Rz DY(dc+2eR0meB6")V1ZUSV VVG K^q m)h4Y)D}eBYCF_^Ԇ 8o6 KuՌGRXhZ_Jf12O7~Gg4Fd'v?Rs-&{LI(XJ@ VuR!3͎u)P RE&lSIXZU`nB!Ui@۵4+dcd%%4Mv-dוůnKQEL#uu "o隚 D?C a 2^FLЮ:$fHD!\ B$%tB*'HhQ%bڊNyFv@f|Ls}+]Z2D֤[!Q,邵9D 5uLZ<];Thc]WK$B(()Isي̰#b#:3~zte򔰢aMD?3'Ҳ!BO:˙m9m~(qIE={JHb 7HQ]K0W((%5:+mHZ/~S+ˊi$8M>#ALk3G3NNJ.aH2q3i+nCv7px=.+[8hw=wwt-/_^*&v3Q+~>c|9oXƉ=83 TLyyzA+7ׯ_Pΰp{s>!·y1 鈳?9Gu]G;)!g5|u!$~`L 2_Bn^YBI|ea5!]r8">w o~d%UJ?#on[ B!4V LrOu >WH3Z ګydy㶸=>SqYk!cq4@ mQ0 ǧ'ݞl[D^Ѧݢ: @!:O50/d.h )܀$̗#꠵~}݌RFb]CsuUi$R)}@5 !V+YZTYWv}%(6x<0zk(9 r5-I*|bLT0GhmjVdR׹5qe~Sf#'3%4>"Vh0(Ec%-Fv!QAAu-q(MuM6!Z7:s" n Ғϸ̀,5%yJ0hU "(]\eMК\JHmIYaL(5V*HR#JK?IYI/H 0C(qgUZl49xHhkhF #$Y] ,h)+2XIkgCG%j!TWDMvR|9_Zs0 Jn}k k]gQ( `GfKX#7R])22V$*TZ*v%z{C9gZPfwM&#S,C, sW;qOpYQ"̅;?Y$p"GXWn#Bցk@[!`u-RǏ ]g(8,3>HT9a67 ̺lV^~EB̓NJm-2h!ꊼi3!%|Te&Ĉ ~uwI޼TjXWQ4*'V_+.Ӊn15 IB) M3j3ruwP,!֋e!1u]0ee]ωe8mU)\,L*,ض'fQ^F) _=2,Cݼ+Պ8) h-Ѯ4nKBj\}4xm8~)TfmO4]rh!lA\EB ˅l"%R7qRѦE$I값E22iDV]2T2)ddFJvXCMwMZ))"OfW_7U%r9=g=?aY?u=~] 늢w7J$~Y2,:ܦccZ.ɓ}A=󉻛[ׅh7- i5 ǷڙQk8~ya x~9`R0N$UlLi~ wlj]*Ӊ$a>r0) /Yqu-ޯ4m/MpYgR8m8glß.qZ8==a/?}?541F-մ:6 'ȷ1Mc48+Kd|y# HFAL ۇ;<.ta_o)k:}p:L}V<^߂^_\[%UWNgRJoվgyΨ\pv+r̻8!JgnyΈp8ŋUtȇ_~GIx{uloэExM? Z!fvMU8n{JXZ;*v(CɑxT WDH)Y36_Pƹڦ4;"_?(UUܮPDZI _{|ô٧Pe1]/hH3BT*Xk-4tGIBRV݈%&B+%Ըm?_Gd(uR B ˈs뼠al7Y*)srL3۷Eş1g:ۂGlN% A+qִL7]t!/>r7Ēb_}Wy?Û7|_=fgv=ә4.2p*iͰacmkQRXGE=wZ=@Hq F=᩾R&H\Nh$o8.v;Ou姿#>#D̹nv%Lk, 8g9 =ֈOi]I1JrxC x{`_2$ՠKf|4]QL׼2A6 ke1R#DOcqBs+QJdzfG/yAo:s$?au"!zj XS$>_9 ZUWZV1UNײ)$ѳ@`K]5PNmC,hW5q#H~*P*Huqm@d5(J>r8Hf'n#]r]z6b<˼P":ױ.+(-%NG7%%+bж]=Hhk1*ׄ ZW1WϺzq辇\*ƸʃrP$=rzan;ͦҭGZtPbF|=|n|!/WcZf۸BfK`fZ=kXySbY=qE"3i a(_WW$Q9ve].0B4*OL~g>NM!GE֕TN^]FamK99&+mб=؊L]ntAI0-F8fåH%a}Z1O(FIM=l*Z8zLߓDk i 1EӰD_eHrid.gOOt@R%3J0A$6 Z,+k%ȱ-%'F۴YKJ l9] ʢJ]her.ʑKf uzCFȴȑ2i XVi|E55&JJti[J\" 3I;(1jS`\pC+,0O %R_a&PUx+[qdUܿ/EL3)kK k!A Y ) FQKYU hq5B8@IJ 5uU4@d_/(@+}#@it}a͚HkDU- ~tR)TEVs5+\XcDHU)֫ u;k #El;kP'=YLbɐŸ&%BC!jz1䲰Ȃz $ON^\`Ent̄RFWwօ=ZK\ߐWĘ(Юr|ö7ږhE'@74fS MqEBw@ڻb]{2{jћ )U.l;hjGJ9M+lPs L8v t(El[4{P=>E,H-XƑrf%SCKM^VY:V)*ͪ:@Yu:Ra3˲ n6׾ata%N m9  wLہOQX*B 4e k#``zip"n+YN+ۯ3oWϗd% -wW y5u~[Xi .3Fky(c'Lo-Ft~;i)'yArrIi4`ω)u3l "I9&VeBUr݀OɒLEJ1̬ӄDgRn!Rr kZJRzZ֖if?2鶻aȂWJ+{ܦg><ݦR$yZ 5X׹J˴&mRJW$DvkXYE0.@R#Ca>ja&3Z`F{B%y&,.%~tfZhMeYGtf5l:J ڶb$I2Z.Ӎ{f@Xu1Vφt?ſ?1 <# Ƭm볹o] IX|!G@XkY\g̯|xe]@87J*<|>zy|< \M훞TXۅe](p<\PFp<XfOZyu麞"Y޿}ϴ,9xn7PץP_*r񫯘}Se;4rxqOO7~Ϗ~/_ aۻ='7vg|~|dg}xy2N38ȇobD!=dn+۶gB ۍ̴@|zz9i{THaٸntCO '%Y Χ#_ױ //>vanyR=ݎ aYq^ءzuRL Id&ɌSE"LwG.@ӐB"7n@(KbXM%qƀ(~dNki"m2/XȯЪA΁TheE;!D&>E8g@6uc$ogkɶH#By dHk)q%D)GrdYA1(GJ+JB+)DVyf"_0_m:ZqyyHAU{ 5PKqE%-Jk35.R%UQpM[A7[xg[BgPJ_mzLۓ+>tP%&'3qڒB$DYVB5>m0Rߥ6b6; =a]Uɂq$@Z\ېrZ(jXbpH Euo1Ѥ J)XeX7"*C!^δaz4ˍ1?%ֵvB4iDF#S5.nQ0K2i" lQU[X ח(V''I W FR\PI!{SA ʙg64m e*uƙe@+ǟr9|Ǜ_6*$-A%LC5f3`_L!,>3l,ZW+>Xs5:N5.L)vÚN t G$0Bp>?\90M`-%zЦodӠrTXRn4-?бE*?U`vXȥ0zR).L}xzEH UB"$k(BO+FuLs aL$gT 5[z'֬0O%ޓi%`ZFZv3BၗõRIxE"Y(Y6{igt ȸ\AUWI.vcz~f[15}#P7}! %gm%)j4%Lkh "Y1A"$dce)F #Ɗ*giE̤$O JYV%ˈ %Մ?b`-y] :6;i7fK #B}VIZ1Նu^e,C֪FeƉ/-eF=)E$-ɷ~_J.7Dl욎:vo1{G޿3w?04{.x|m 5x²yz~dgifY6#Ϗiod)le+Xg/8@=@_Sfl#B, B#r<ѹ~.R)rL4}Bi <}úܵ-'< Mۡ-Z˟|3|oCS 94hnm! 8cFJɊFToM[B'bIJ4ܦg~c|&|[< |[o4%O5vŏHsq-(rI?%@p8-̷9h+/ȦA@JH}} ݰ#g+f/%s,H".1U(Zr2Hmz9rH+:dI$I l NHH1v(E<}FHp0Q"){p#) )$IzK)#J%ted>@~F(i)H@OLKn@IY!J"->V)gVrEގ"q{OnHnL3B0@ӽo#(?Ta^i!+H>HQm vf0'\s!UQNki(Cj4i2cD[Z=rxH<{)T/1$h5,(J-=M]@M3A&3~>ʈӁf~_/m4H7ܶC%5J:J+e!05ۯi3˅g~7Xpga`5)(yfЖ㉦mX%f9'JӵLk|&i|a@ ,F/  D}GzkՖ1Vvϼ,5{gE$// <d_G~Ha ~ϲb ӑ~ uD'IlC6)`|OStB;w/w}G MݎiBx:߾aq{yF(w?Һ7|zy|T8=l<hk>Ik0_>aqq 1ïx_}5O\L/#B Z>e _%rh8=>Q"Kǯ9D ?|@8ix|WYוe7  ůF1!%@R)|9akp0!%ةnWbx5? j ˫;BWB[dSB $jZ 2n{AnX ι*@kZklӒjĔ0A6%H3d2 I0z5aTw~ǚ Ik)b`Zi7-_[lC*ȡGjEYH|-JAZBh6ȲTð)]C'J. Ӽb#e:\aLNպbYFBk:Jqh9cyY~Eɏ˴rj/.39(kPZ𨢐d]4m֦zzFhS!beFXm'b a3ip1ގ 1@XoPhM%.+OѓF9"'4?jbDB"BR$@ZVBYH41h^bTFȩ~1Sh0_δw!PZ#EPZfڡG4-x.1I6~QTq#tEDⲠ\#0*4s^v $4"R@@ZfG >Pn`eS!JoZCP뷤MC5,*V9c[+xT3+c!#^35" Fb7ە8ʚXcFm(q?xV2%DbE(vJ'nkFm^JM&z"QHUC@mE* 1v3ӽ! t dPr`YLہRLiA8]V2.>?"բ!]'Qb+"fa_'m3CijXhԅˊ>4T`L X#f%75c>%@7)jV_oI>!נb<]jϟAW"+_BJUOIm[(j:%V[rJ~q-BiDcAa R lۓ#A5[.' WخuX6"MBg]C"Llh 귿_rD1c/Ȫp:7{ OCCb JA;"ߴ"q4 3l.haU!W_ӭhrMsj^Wb5,*h%j8nXdWe]|%-8Pט՚R- Pm-v% fpT2QiiO:[?yB5 `4ւ͆Bo,ә|B%Q4tH0N\5L~`t-m J!)Z6X Z\BPtAȚ1ak_7p)pmeZ剔njt$RuƘW#.,BiliJJ$Jx9*Q UvB$Z% Y)k-0zO!#M/3]#5fU|l\b<מW^(JP q)9sUmIq%qHʙ~BtnMPڒsӭڐ⌑0^*ͪݓc1):zUD& E s1o6Ȧ!.c?2-I:`J yD JPL5BB2c- B)7hÕT$"HBLe_}Sfa\X9GToy~|$s߬y9/W],0#"FaIeFoZ[f~&4uh%8^غHbM[C3mxzx`ԄD캞4ɰknO1~:3_3(4f߳ ~ ?!"Gn֌ Dr>siX 9fzxf2S(Â,c ٳ! c l][r)|>͞gvk]a[#4tá #Mχ~/鉻v>n1H aX9 ڦaY<7]]w|<>㖊ڦtӆwo@@t?v;)l3IIy~|-% RJ}Uyr8``̉<1eFI ,O#7%{ӕ \F֜N?wY: H C"N%׼xc Q~YmnnkM90 lLhw}<[P#'oA|!'R(U9 {ڶA+q4'Fz#ĆrPxncFǐFSubU^ 2enzd-qAGmc0Lr y/3ueFHiT8:GRB*r0״,cu DjRԖcBiVn]S'U#q$0ӿ8ѣs&ɂpA'^ CYrCPPiY%BF@=@?8]NtM6F!Hp9\ͶfUl- ?M DU=zK՜@ɩTG(!H[!D2D3Z S%)QRjī/tV| בB||w<~:rxyfv<=r O_}'޿ӕhdxf0x&/3fC v '~_u:K| a?/Oqәw_|2Oݞˁݞq(I1ӮV<>|_Mj8Nn6tmÏ>`ajN<~~︹ۿww!кU?Ķ[OOw{8kx/ܭnnx~y::V >}bJiV 434mJjXoלOpss=q#ͫeʋݓsz=Mp:95 Q~qC)pl ̢>JQ񳧹CQ3VZLr㷬-r ɣ%@, T"T94P+ 1݊qxYb6y!R<Wÿ`{C3۷orB(7"1J ;2Cqk?_Ɋ$(5@IU%D((._S톤Zܦ-)̪Y-ʙ7 +3}ߐ"kjMH)H~f g5Beppq *I*D!EPPp͎vG1ڿ'/HI8b2^U\Z~ q6,>&#**8ۮHR2%MvCup$juV Ms@A ) m9,, %M ne Zhs5v/OlvՆbQԊe@4m$qQ' I'd^mG:lZl\9}IRֹڅv^J%-!JVR6y:)$J BXڢTc([ Jq\pkq=3v㺖/@5*Ƣ%@Z4T4#1̈́\S^Rr)%M͙Ϟ$$YdR RX&)$NW%T,YYB ,+4ZNGڛ;rlŀl&0m)PIJ̬{̺'XQຩ1RT!R_UK)4_ɮO][ܪ!I(r)5(6,uD:ᧉ{V '3LLfx8}0\ 2[GI'Trp`w2_/!RQRRbH a{s# f&/G{N#Op>غe['bܾ2>͘r<]q'LNW!._bWۭQJÙۍk~~G׭o~ݖ_K~?d[W<<Ro>|ZNGvww\^ T O/Y\gu a&O51_]۰oF#b٬Ws3:wݞ޽g\8N8cRng4I._~8U$Q Y>|dm[w7|e Z+H{<]Sxy|wZnY״G5nnBݽzr/=\#kda~8D)!QjM Y{@^|W=Fk}:怿\YWt* |>bŗxY eBUR&/g@:g=kPۮg=%r"9\\h*Ww-FڊW]ơ`N@oX4SV-R 9D g|IX^mְ<=abJj+DR@A#tHr9YL3{3("8]pq=6O:֯۟ံ i"f PKHhӉvW΂%=4-EP)rJ4횰 Ю " r 0Oib'I.K—ڟF23}dpx$!gY{-tc(s&.33;B0S@閸f ƀr O k}rR,[!P7!l-mvrUQZEa:qAc &))BƉ\9_!ZV {J4,!0e!$@I b iY@^1~@d6P%!9hڻpeB?8x?#@IU>^sΙj]#PQiX(NX1Z"u!H`v?ڮF,_Lנex9VHɄCSp9!%*,92(TTUкƸRSaVw)P ďc݆:FC, @O7<uX^I)!2vǗPí>B~=DעlnR1͢mQ)GR!0R7kr0`ԒR3I׈ 3YHP4Yf8NV.g,9kt"(OyٮQ~$%yLȺ)~A؆3~afae+H!mn-D{uunO,VѴ+q!d˙z8e(1w} )i,XE #aXPJ7BV(e./<R, ~?#g]Ґt]wn<=A]E)a/O-6055_3$lHU50Miȧ)gy:n;DMIHJRaN(qAtki"jFjB&R&Z\hep4sA; "ed GRaB6+jq"] Ei(C&1JP #zK[vˁHrZȯ@ kkh2t Q(*{X+Zhl0_<?%y@JE(E5-<#YwH)OܪGhE=mB)8iӵngEW m!|17\-v6<=|}ixx~zّgϰ̼|E7rXڶۛR<>=UJ)5jLӽ}a*dVcx|yvppsś077WVg/߿5CZ) H*t5[">,خ#L#mЪT4~4=XL5HSC)4 ttJA iրaKN8XUS$i3dd#mKGھCRsu-Z$ { $Z%Xm6LK8XmZs~HȒ[!VhT-9)F&,H@ע%#8L9QxDӠ[@CI@b+g:(#!Ąb"glr`إ=BX¥|dYV ~%gH,ڂ]21Djh$*%RӯqݾoBD҅ j z){,HӯjGk~eO0#ELMB\' LZ^VG,,4u9M5:Mu¨Vk%kEJЀ/sQ<"ӶPG&RPJ%Č2`khiK a"_L59B*!Fr۴xPR$!$Pm[BT9,PD.hQ4,"I1aZW'#4 2%")ubPZQǑGw~WKZB ffXB(KzTCX-=eRʸW45/c&R)T 5"8 _m-06+ԔѮI)f(DRΜPQa#qu%.ޑ,LQ-9 nA=. "/\ lQJGrDڷ!' 7o()}`I”c amY dV$%5(N/y#/DxmhUBh=az,A)z% !ӑ4Vb[ $i>3L ZJr-^ћGȰ,CLY&T㗙S}kֈTkYJҪ#Qj7L#~W5Dv=LWvjtL#K mC:]!E<~JX"JnѦ%%O % fFQaM_"#G $1k#n*2hX2vSF ker?tzlztde֤pưBo>W}J\/"٬>/L,‡ ޼)|biYWiYg-qYTƏ|Ovmf_7p\FZmBRf˰X{{zȔaxvF4+(UN;J 뙴,47o CHHJ 㨥TבEU(1\b/XQ9]!p-D:=ID!QRg,~<"YJE`@˄≡\ 9ef"È-{P\0,( y "LH۳LAub %U}ht D]!eF=q8 f) -KyMdl,p&vENOs{[7 bP֘x){rt͚LSgRTB"6AF戲0[8]sH4 J DšB-i@*I#|ҥT6HЪ0I4,4c6jzM [֢^a4=RDخ#pQ KQ9c$-#AE@N؆"E4$(QaAhK,j90LDuU~]cS>e(9cT~KI4!fm0|E;2ᗌeB­tpj VlYO JagY %DW-yHadVD)Q|9T-a ͞P$.:JʠeCLMqV`qaD?۽%f u蔱c)38gkdgLqANhU<(0eݔ!bDePm֖"$&\mKuӮ ˌՂx 2_8 i+L,Fk\bfi*hԲ{m1=?QR`i<eWp@iר|SA9.-7_ݿ zMG,ZMԮR=癘&3hUmVGPSm)rI - DLtmKUjJjx0N !¬i$ #lPj2 dJ'1 3XYeKt}20^IHj nAPeЙRD)9^Uz٣&&w8BL=bȒ=%[2 tA˞e 5䘫<ԭM}?_o6kim;r>[.KDXUOK`WDDwDӴ_'O"{edp8fr,=tb Q$H./'׌!s<)W!Ҭ5_V+_lV _ }oiWk˙zfiO1W:0 L[gd@ y_rFOcMz,4g9\7 *Y STӒ `!1@BHL5A L*323F\ޛivZD\cv^yR+>~Ciw]A7?՞t؆k[ھw#&3(3a ޿a'/Ϝpk P?u8/su+q5$ļxz~t 8s<nI13Ȧ9y"+3h%?2Mpawl7=o|rLq|rBuY}p k6fWEV(ھ4 \{2^}q } %HuN5qպ\?ԵlXL^"0LӢG4+n0a :αyt)Kj-C}=וRe;ܶ'!2zQMOeAEQـĒ(Q"g) i5}WWF٠P2 _bJ %Ri~ĈA_@6-sиOUЗXmG"J .(p9W vI!DB;*Mwl͖g ᆬs= /Qa^Ru&#bͦf?}s+WȾZyeRIJ1?s_KfLېq7oXHږQ Ənmq(rK 7T;xo8l3Lgˏ~r˫{~͛{_[#^ nn m W_ste8t=@fTW;r@o(8lzؚ5nз-H,8lw{viZ{i`g[V|y~5ጒOGLlzp:}lɯS͋,4}*`z;k6-QZBg 0|9cMJļJZ=]2]*fY@#wW74}G8/X8'\pϗhjNdT&Д,=T iM7Ӧ:r^uu=NubW2zLR gLϟ0bo^T7ACd!p=YQ){JWvR(-u7JҖGP@cJCj&Ջݳ, juAiA#]z>sL58Y9v[Pcj DSp֑ a-aYYHN3JW.!֜K"'HhK#9I,H'KM]Y'K#ITs>oo7?",#FJi60"`ɬS )Pm 1HS/eiێ5daY硺b)/1e^LcIG4kbQ"p8dEo}7 Hѯ8QEU"rv(HA-ad=p}Wwre \/#hвs X o-ij.tI 9oUc uZXZ㕬YyZU 2VeBvMuxs-IT1M*HD S2Nc-"G'8_1͞nHֵ-Q X@JXہV&OeYV[BRO ,zD ;ĺKN LHk49~ږ4Ʃګ:9 Θ_(\S#$Ly)p%~8)%DWU@Y!LψQ& Z,(:Xk+*x´UR Œ}mqBJT_Эg]VsU@Uc h ۙ TwE+5r^)ZST"Eb^}[5;ș|)h R+H/*"g:%U_2.t7%k,rQD;Һ0>}"h-qvC es tR|Q W@@zEX#c%U TI8Bܼy3>Ր^]3, "x<Jƚqx^ae0/QKV<s`,D %oC`:l1a'iի\Ng4s{+0&-\2f9Njgg:pX"/+eY9pvH(yC"d,xc@(R=F2X7+EBihڞe]Yplo_ò@8Rqh TI4+1O=jΘ:Eͽ *#2!GҁC JmGRmΤ4v䰂LX2hy#(mh݆, 1GeD59T~KF_Z&r-YhbHu3XәoqMO4#k4t&P̱"E]ǟ'"l]':צӄTWs=¼OxG?%4a('\yDRۆeD'd&M̓*.DO~lU $P7"s # 5#a4n_ɦ;uYn T봒v-وjDEl;`=I V l-%#עi6`:5֤]WK)u2aZU rnB=*kB [CH /9u]PR )gqHTU4 rn۶nL *u?3NmHs]&+Kټ,8c[ )WLRJ=X'Ch~B@!'¥OXC%I /~Cd_Wd_iA+Z %`B MZrpU2E"fY0!Bnh1Tb޼QtNӊu[V ) 5\2VQĜ !"I\HS`:ї_H>!4Fk*i! b&ZB \eoUU 52&ܶE7g[<g?cڡ S=[ )}Yx)ˆEJ6LH׶3/`4:S4Ye4&J#>.lnS&6 Roi|:m6(! KD2ϑ7ߐR$`" E+du!".(E\/ɨ 4DF+Χn6d, pq8wr JbBiCGZyzk6;ِb 5 k(wJhS!QY]K:ʇI%¢2Qb@*6vd_ XBhЍiLv]h-Fj0^_i~{CA:5kv^HC+^o葬52@D%a=)*Q42LȉٯVyn;:hR5bgT4PR-FǕ_j/8Ǻ5l !NOxC0XQD-;B<1XvdP:)"i`[ȕ։x1*Aa>=Sʊ( )C -mB{SjXWܯ`l[_!vx2\ 4 {(e("|yHP$ B*; \L>SA`vAJJ^?yb@D?{)-`r E*Ӂ0]HJVʌ"@%s5o MNUU)_23M&- "gą!@9RT)$ZR 9GJ5b49,z :D^h% T1k%^XToHZL.TH%+7%֔Es 4MWRUQ^i^di qMD kKXM}=Zٰ-%C t:bsD( r,Hgm!SĨJʢ k0Be,FJ|4c,Dr㊶i[>c4!{lrvi{d4HK1&cT@DZ Oچ2M s=0W1BI@nYcAt3bd(b@JiJxb6;5e!e))CfїH۵%e](qX1B R(uҽy2Ӓ H.m1ݦ2Iq@HA6U>Bu-;QW14[r#]2Rlе-1>ÝTk4#L.nKp! BdC-2h k R@#Jq5-$zخ;y})Z1/+ZJ6]i]ȧY2!u(۠{_/!DHeXt%C[#‡A:ZHk'Wg-~Am2JnZVt EhdQ0"eZ\_WqEC0}P==DaF+Z Qhs4-aeE^HRUoӢe]gPӌ{LLk%"1MPmz fOG 1B76i4 1g7R.>s~rmò]nR4m-}1,3vMloH)5GTW/9} fq--?ZS= Hk8r¶-kJVUz|yQm43a uMę7?o("?S}O~$fSop_^*að}?G2"pm@c Oɲp:qJea^:')|F!%c~05H 鉗|9>iCay ONGr blxn]^~5(Q%օhfWoeT3y@h#mXkIˊA0#3Xx||im)~׻=nӵ-i*yyx`bmիW10Mk{L<׵#RdwuE۲L3^{nny 'ݠLϺ-1i-~}Z#4 hHH #8 R/CVnKNHmhr!XYEC6mG #XP覊Q8N~A-1R4mT}+A2(`d8fY<(+bѮAl|ǵ=ቦ֊ї gG?h6=mH9LuDSdUȐt 4BiGRV'Ƅkix\0q)㑨5b*Rd%)qF ?~v: kfuq$OLD&V"Fi1m}# i޼BDhbI,QÁ)ئ 9b}8h R/xyD\2e]%ƑfOn-]SAY=۠&~3Jjx"EOqaUEPO.b$- 9vn.DD! %%Gi`EJW%z/uZB )%F[0 &D)kqtɲKI38#:<#EC@B-Mloi6=~PhmqM,x.)9(6sF2-TǁW a= YWqr<@ 6=)fܦx Vr uhCAA7/H˺>R{B(PmQWG=5E bXʢMiuA*MH|@zzL2~B:4RD[[|LJv1M8 mDZ)ap?i'$s\0}t83~W|zJu<'Zm#?Oql93]ӳee{}\"m.< DB!t]ϗ/_(!O2/zyZn?=q'Nk=aaW/8yFj-dɿ/ݎu8ܦA #/Zk3w[>=?pw-:ڶoް(!_ eZ'd.1@,e^vVT$%8Lgr)52, 햔#rNu/>?i[Pu~BJɰ4]G\xuВ?r!p(eHes;67{~躖%44 ,{]%5Ov{RrS!ݦ' HǶ <#7wwbĐfI1pox#ϤIeu ZdYy| \: EH,TyYB`$s?N8$"B k\jݵ4.2!jl|ųPR$YE ^c\iX]P4DVՈ-5mPݦ&}͜e[T!Fւi6zqtu#D A5W;JJ$庲Ki yӱ?ZK!t-'N1yd֡62m ) Z2 xMeq%ŀ$mlrGR us$44a B$ћֲ!YH ~NUʕ(q*aE5UJZ֢T%)ig 4HSŅ'Ln\jB/1J9B*,v\r'ԃLxQarޣJ$Ϙn:ZgItVj[B\WեP)CΈP9p~vW RSr6%~Gh#a=R,Pڠ4Ou)g 1b7꣗bf(mXϤ4b,41rNS` +vD&@Ҳ\[k! lBΛиEz,E vMR$ڴAv0#5JWduΞ\ 1Mtm[ڐ%,S5B Eb .VlE*Rneg4mChL&Ih6|tMӑT BA vpzf4Y3GT?;? k=PR&=1DRL|8Rxq{Zܼzt@mYE&._oڒmo~a LJׯI5/Ϥy3!#7Llj8ľAOrx|ď3}ͷ S+~?#7/inw扟G47 ki,C~'ϟ*:/aׂo~#WH֒)J̘P@J>>}7yJ]qF^ܡ㗏~? S1r}s#/OziݯË[Jk1=3<"#AAnv{VLȋM0Hp>Ѧ>&A2f^<5v=㑫5Ñ"W{a 7h]Ca T k\)349L kך 0\"om\Fm%&ya%HObB"z )Ur@D o*a;<1nC:_W!/RRj9HIKw@ʵIJ"~H A"{O @!-DӸʩ/n] j@T`]τuA\PYdYx1Za4+gu=J|4MGoі(qb d_ 8UHt{Dk)Ú͞HVPU5k^zK! p̬Y͏Yב~s_/nQea 3 лE!}Bdh6$P] E ThdQ F1"jUƕX-|ǿ3vKܡ1XOMz,4g95~}IdB%B JH0Pb^%SB*, $Ȉzovݭ:d\Wr]}l}<ϴ}WcT-AnL!eMQ4⌥+B֚:-6,a`RHXck_Ռ}+tf`Q/ J9uO4UzT!XF;2m9].XkRhGkQk0aWBBow;˗{vx2](Ur\/g6-7g?rW_`|)çӑ/~S>~di*c[_7YHlON'~1qYW6}OpqB" Z0\7p̌(n)/Oጓ,%0=qq^qne0@+Ya ~qbZLx'\Ӑsix~~?-Z.Vi~mrpz:UR|tMS70^hr L=bHN !,hӳ2hk- m!@ Du*f72ѲOl?)2ֈ2 Ӈ:H`Q0#m5-),gNW@BQJ7\2X+)Dr 4p}0%!C*[j7eF-x^*quR,Ij_:W) )!b=9#!@4u"zCΧ Byx2mG oFcBlv, %nK 1Zs9db(US0[~v<Y'a 5"d2!^jnݼL$Z:HnvRd0]ІT!Ktk(z"PM "۶G)Ce$9K4Z*bmG#G8Rx!Jl1%JЌ F s S_zF '2ԟ>< TPRL.M)ĸM") )!q]GQDL Ҥ|tHEq5n%9%7wZtwOϔjGiGAe9kgnЦD+Q)hXc=T4 (Қ"RfWQVάpPJr(h\UbDn)עi+IHBbm|N~e ET٦(Bǂ!'S5!U Z(LJF‱%9Uh%,9,`❁fA8yҿ|m$i]XLQB)yDB h;J3t EF6tĴRn%Ux b\H%׈S '("cQT.)"mK.EAkK)DV_5y41l ! ReN*0͆fIC El%hti5 A u`$ ʚ`tDd8BfW$Jvrd,mZJ,!bX)IBdma,'ܦG:ͬz|dm=Z"a0JaXN()p')HemY5eGQ(ˌU:8]-X˅[ھ^(Ya:0J ] D?ֱ{OGhe6w5P/I(m1#@7-$AVt\?u/>H)Eut݁Ⱥ}Bu[:b:[dX 2\_ }}1/ M'sM=H0J׀ЊL3}gDb,g_~Q1Ud~r=1nHoxx|@*ɇ(>{wlێ#)DZS%-kZW^i&dA*FG=]߱'?F:3cy@39{}-/W-?-3?nY\CΟ\qyo_?5?|૿Fty/_ċtlz+q$ ^K>|$)E2]!z~]dDWҝOڒ﷔0ezi/' 1_ӛơWt r?9?~| Z7-wO|:OxΐMuN@X#w_RD HV@ Xia\'XǙaOV\BGAmzrN$%Kq=_P K,k\n7ZIΗ}׶L)Վms:o fjXgWb%X]1:oZ׸T񛖈qh1& i:d)F͖$5Z:Qn|:㬫r"I%ym!nHJMC&!Z y% |53M3%+_ଣe \Q%FBfGIը[Ayp͎yѥOdRzy"vOg%8z84/ksRD@d1chYCBlTRYQRQUѠj1f TbN"t_怉v i"׏̭(%a5`|D{=ֵTaJjr!DߡׄU\ NXm^7-mv!)dtYNmn8/>_w}#L 9F6w,Tו>{VR8GgTJ/hmYxm6k`^g6MCt9mt:<|A1OtPN3s޾{\aܵHaWpRFww%^߱| Li;a{ǗzE(ͺ%_t`-۾t Wx=8pߓ:GLp$ G. ѓ;yƟ.;#bM[~:QdDg?2xxxx<+b +RPk%ͦ!À NJΘ鉰>q_CBWgP˳5@aC\˂%vseR`]: v$0z:alsCVv#D5 8]Gc6mՊH(J1ei)1W+S&/#R1趧4l,D^#rs>q8< sa&gP)bێeXT;kq#ZȂk1'olgOO8%+kL$*TaquZ%9F8X́#*'3H%DX*F*6#RmJ2,~q 4#Jas7 }K\#u}PmJ$yHQ PUkT6'$QRLq&XQ*8K֌g mqQT!9XǺ3}<-4uP{-LZgEڜ DI)2kahPFTQXetm\H"ĺ=Ou#qMURB+bdEΠ%L'ِU25et!VRO^F 8VׄlӁ=H6ڨRp$bf32#!&kWlA)18KA*A41ݡNYzy@Jr\Ѯ92_jٱLk59Τߌ%gF?!KFX4jGwm DN+:?KTJb \@ +q,QkGjpVRƴM)7Vqׯ?M(me4h)5e=Wv~AEupX!EZ_޾QoI>VOP RjP:QHBZK5j#M"o#JkXh, I#˲BEK$dogMX0` u2YI?ny"RseD Ĉ>.kh#$"%i 쑪 EB$ "?v(yJPslJe)Ҹ%31V$R50ā6&.X,)xd|H~ LQes9u[_$xT#UB/@$,3I)@V:[U@Wv% Vnɉ< ~ 2.1b)*ޞ-ǒXPDX/(ef+LUݢKka=7΢CH%y:THj%:?A;Śgbk>ź kYW8_]OwcѶA=| "FbyklWq%1#DEWce=̫֙Á}onQ?N861̗/_1 #8_t~ݞߓGii,Jq8#=shÕpةѾaT}q ?~@Q.#w;3^ |ۯڲ^otFoxGrH52&}8gXb\ ;?8ωy8t=EI˵ -`e3D$AP2-yh~f1ӿW;ЙW‡w_c +itӑ?5O~%!F5wixGa⋗/QRĖqn* 1>ئ%\B>Baj:3BB Xșe|ËG0KrL |Dn"Q)x_gJ@"c7i hwYk븊:D$[B(;y9R¸RUlnӴ57-o9BB8^Ț65TbW `i0a]tEKmJS~C':qf&VA^1u+H) 59ݢdH!i-% B+tNE-kkנ uH55H|9ӄ5y C UE Jpg[|s2BRވ:QmڒKd ][=;Y0 uX{5$1ʑʌ?.W5?N:3'[1DYܞa:63sGh%4%aI+vsN~&<\;lKNZ)%Iܺp 4"D#m;i ^O4F1R0km[%%J*Bb(le~T`Ab5vE7lGH( k$FjBdYcc@cD iMQ ?=i* M)'m( E65SR/&\"#vsGCFA*+Ă5%?LBBfx 󍈥BL)u "vc$ȗIH\E7}ţ/ y%')mfL2XnqqG|J9q\Ru+>;NXf% M*r܆g!xnW}?ekYQn>RQh8nm üvtO8>?,gktvI7[<֕5GRv3'K7\'ZmwkQB2N3rZa+_~g?'wOW4xd&~_߾!ebzr<á#Of1| .Õ= "Utx0]mx@'t|5*F~ig?)~ûr9ӟoCeY8?2^ W-┎6M_懯J-ϟ>|% >~:2>p{0mxZ˕cﷸ~8\P!0_$!1H/~f]cK=\.Vm8:ڒHt?zBM +n HçR =2 ͖P BBL_0RJJbc:DqP -ns@)ab'\%XJ| u%],K.is3KRĔM,ib}ňn-uP`\_#dah=PKY D0Nl]GpZ֊J;GU)a!LA匱=)'ҺTJ̘h|a`[M)uC4Ӵ;bEb&cT Y{Uk6[TkMt)ju=T'j]#Q0)!&l%F1PB(bIHhlC E$j)J! Ҫz_-l ~CEo`TL*h+=%D B+R-_4-Ev4 AUiZJ։N](3~IY?v:]*9.GR$"UFPSR# (D)RZPÇخ$vW1]!@ݞ29$kD+PR"`3D:Q5ic:<4hkPԞԭB_A`[WRi}-~i%Ps1uCu D:ȒQreE²&"!`D:TpFY,FiUy`<_,"F(hAUCX2y="DV9ۢ6Ս864խT5#nm1 n<-Rr,39 CQJ"m2BV/0RRH ADZMS ʐÌ#D"fQ1 XՠAƅyd!)EoJ+$A !ԋ} Mbw[ZJl}d$٣H~E7, iT4Kc]($96 (!V\A0mVHӵ׺*mݲ(V1l6.FY۶l9´x:Y.d{H!h/22 ˙4ݶ2ik$ϙ0\x8lyzz'5]^g|x=r|`/~ƹ54'%^7g :da|޼~ϟٟ(l;Np~e<5%V Ӳ,בyZ᧙~v|9Ɓ<>+Rr֟r|vC9~xoۊǽ\W. [נdGgZDca9].Hw3OBIV4c6:V_ߥjBW5L1z`6nE+stN0@Cgw yUX l_Jj3@ %%E4e\XkND0R,k#Ew̼ZjIHmpJRbeiJ5ئ#qh$H" ۑ4Hi$q|Fn;TUT iV6-!RDfWdI(mJJݿ?њ:m]u35`(Mw ~x3K{4§o[$(|̒"(㊔b9Z~}I@i F+dJ,j?HVvۢӍ~ZZiɢVj4 }a~wj F`ZIczr J yk7)$v˹T%`MWsZTfTE)z#%TٜkH#%L#!NIuʴChCUX*e:rٓD+M'tPEgXgK%Qd?!C/BX$T/C0 9JBFFlITdl1iYĶvFO "ZV_*P}SpRu2FrR!! R6=9Gԭ5 h_7tt!k] ȺxUV2_PdU@]"{r;si@ip,0^IS,i)Rvlvm͸-︼z!^ѮE-8c}=dJ+|CݔRpepEsĘ Uh=8 F7u-q< #d2C4Zn-̞"F!u Zk2+ l?2kXh-XRfۦ^RZZdjY ԗ?MlvSݎ-kX0i;_BSrEFQ|@=@ #(D߶| NR7,"UuD+M)Y 9FLɮٚ/fvq}2O&Iic#K|;N  D=YRf"sN{U9j4J \sσ{};ݷuY7*MD+gNÁ >f ،ٓRm%,ZJ)2#BhfkI n \>ShrI].?ci:l/qkm %RYrկHB@CuThbM=[DBme1͋\zFhM[9)SݥҾqAe<_Hj\ư]NXQև_'Wpj+B*_;"`3L zEpd{u} cgky ?xs3ݎj$y\^^(Rsu}ͺ^P;|T` yFb*!%jq^7Y~=l7nxu$6p owwXRKvH[hR[JL#u%p@ ϟͷH)y||lr<=>zoFrw0Upug;>:PBql #a;Or&0'|y@ɞ* dw}$lMG&4鏬Bt9nw@L&ia>Pte/iPcT3 M@3:?LT-5f0t ^ƴW eu[kM 7BHY0wG#J+m&[;If m+%2Ȓ!3F-ݞ،{RR*o"B6ҘP: %T:эQ7!P0;hXtt͊-Y@Y[6 A)K$׶)J^/߽g^Ѯø=:| pCp%`R#mcVRhú-XPg !Dl j ߶dOX@$hz"m %UiⲡeTv q#zCz#ïgR*v; t7 tF (nݲuFXGΞ$ߵmː2gu˶hmQ}+g?%B..$U.)Z}F}iY /O-[J5QM$;de]Vl 'St;d7B<W{+zkñzD?/~8dQ_Od*f7|:S*l1 s c-8MLTkKjkؖumïutڐ62ups;:4ѿEnW쯎%3|:c;Å~x\;?wWtZ/B7߰7jXrz<1H.[#o Ty^ϸ$o Vccw_=7?7?/~;s3{קGq Yݞ~DY5՞4///躎 R:_3&_ zx3NS%j>07G:![ik *+\_]+rIN*T)1ڎ5eiFŸ7x\?"lky߱N3뼰ߔw yYga|?g<-3T!X.SJo?8u@wYDMbBz+F6֔Qb ;X8|ğE: ڠ%Qj ;ȠZCQb&M+qiR @+&kh*!mD+$^UᄀjIn+iݐ>A-ȡGJ~I>4viKYU^. *)Ѐ`pJW8۲FktǿWnZ i:Á4=?#J k ʛk8*s-'`~[q$TױYˌ 1GRΨ"ƥ0Ë́$L7_Jmad;8)Mܚ[Bb /v=nڡEJn1mOub<4,ҰlS;yiIhE&WZ0<#J%7spu8o Y*e@# k jj[cCmVTEkNXAEO[*QKu\Pu(mчQƕuwפ1g\v0ƑA]RCZ=Rm)pDw3y׷yŸ_1RFUQ )>SBda3s,F|k!p}s"7 Ҿ{j^>pwz@q^gq@;ІN/ 4˲NǑ_o~LJQ@p s{v36N/)2M~KSg_i 77:Iϟx 7\x#WWǑǧGPT N*u}ۀHu8;A"#kBkJ nV7ChVD@ 5[>GB響_^)MI+*+YR֤i ɢ6m SVKtm:SdƧ3E!iOIaj`f[&8= 7U:p+ DX|f鯮'b3d &!RrFBZS+ٗqM.%hP\? &O۵~oZI"aR"V Ƒa5hI<ܴ4=v0~58U[9Ӳ퀭@8/(`(Ҷ0m%_ٟr vЭ(JAH1P3{q@ºhs=w*Ju851$JFAj, zص>h9qb$OJri~\4͜.ը#Ve MyLK:֬˄U\GMRBAu=5iIԜ%SƵXU#$Ąb;''Ų^ib#I͕*ڹ搙Q@jIX+)K2b##1f|Lt+. ۃ-ņѓ YT   U31T*vT%^%5Ąad FB4[|47bQuՑzJvʨCu[6>ڙ9%jˡ%:t7u_dfh䵺Mbb5JHDTUPjOU=̚2EK %vlк}z(5PnHaj 4 Dq@5'|83 7ҁ )QR"|"A-<}Kv~23OOY%?| Vi15 vOH4ZrzE޲]בbDvy:mI!X։rPm(V]G vwh]D(Z7'QoԱei)Rj[ ;>!bn5?cUqRHH Y*yaGvP-Hm)(azPӌwYgpO 9X EK(e&:NQ/O'.!Jȯ蛏gՈa"kmC6{˒FAP5ҼHU +R[nT:ʖ29/m >Sˆ<*1]~č>T IGL3!%?xZ|ܢ([n)#`܍Ln)!JFe,*LJO)^_:^϶CO [ I #xO_s=v=!xqƢ:MI* zN/Î#u|>|Kki'~>})ݾczƏ>~5Og/UIѳ<<|>!j0eCq($2b"^T-yFp5\vxyy0чDjc]$9vg)%cc6rspwfּ:p8-Ñvx*__Q2PdٓVdLyt.1mHx$LAC10(ئ ihqqy9!9tiCjn±.glghdd5=M&ݔQC Qځ6HH8" V;jh-5 $v#1UT()91{/kJքvԒY'dUz| `z=o0= ZܮE!r,]ζ߰{ĨBLt0 1쉗 i2-"%V:mt+6,djѣvGF @y 1Co8\P "'ʼ|F~'J-? [*TƮG~dcH#Bĝm3[${ON ׹w9t,8y)>2m]1J;RIL:׳,N vȏό°+7u>ʮ( H)wtons^&Η0t>֍T+4axZCN T ;FY)Ǵ–8;1RB =kb d9\G7g/0tOeDnuAtCԊ-OJ) |"H,[ ȒC=j #T(A-bh[95:2Ĝ(!6N}n@D]QvBb/nGZflc0Ip} !aiB)ePb+1 -vDI 5A 5;4B6y,k3Cƌpzd2aZ(k0 co J 4mb]gz7:G'ܸk6]  ,\ٶmZ#T!j*Xk9n?nR÷7QÀ4RVa}+JwR3)x_ٙT.TY(VZ } Dc}|!Wؖfmw9օ藶Eӊ\rې P0]#qHILv 駒S|kEk0<#kmJAx ;b:_N΢ޞ/>2KLZ18yB7N!KBJ2Yg8R&a߽G QJ!OhQÁ.5T>·h%7RkEYI a] mP2ԄRECi>c\>|˹`uޱ ˅ O7lk& I?=~+$~~<|G~&lg~gyw33[|%)ʰg<=[,#Fqrjѷ mc(GnneAôXߨ'b)(=_|ȷ3" ||_VoTes=ʶ($>u 㞇-y}|xôyVﹺjyCX0Ikb!W˅R25zʶN @ 2ҍ'wM)2#\GPD:Dn^jEBj= 5^v$VT3Fy{4tIrD(RL3X)CJI"TĺRKj#Π#BxM=vWȚp#5r9֍F; Jh:gIV^_PF K_ 5悫A1:{. !\e99WeOZ>d?cb]Ll"ez!F2-mAuu|xҔQNNk}{_HkĝKhiju,l/'WK/z쮎wwLa Ï;F ~1$?O̗ j葃㧏?76سyϺm VH9)Z9Or7o U=ewooifTӉ2h.wI69@x04F"3jE+O7 uf@vtH!/őClׅFISʀ`:=RD(XS wmczl׉*i:%hD.~D((mjJ RucPNTw42ՍaN (btd%(doG8C%\"U9c%DխU@R/Zb Pi5a=\mAY͚ m#cHc4Ti/][^%\@ j[%э;|rCl?0Ӷ]=xgik[P K9? V?՘`D7& RE} RKiL(Fߤ=9*jhdzh"ѲC"eYĒHDN3t:no4 "!D aѶ5$kr9tv@7 E!5  Xb-"T^T /\7nGKGVS۶@("0L%Q0! 4ZBu%$0Y2JDIDjLNe^p[DDk,74QvpCmrLE7w_݂DeveZ.SBJ^z+CEFH+Gh m"/B5CHn!ij1L󅮖)9J$~)ឞF֭SNi&%Ȫ_JP\\1n@ r(AGjLжEc֗G5$GQTVhGn[c`+43-Mҵ-R*I!w)%VUYmu<=CӇ=%o|=ӓ}f{p=w5/O9ֆy](-}s7_@LWm94C/~syG׶i_?!t͎gJ'~˿"˿}e:ssg?#~/`srޛv=_|$wCGN c~zuS1'oްg 2ln' ]xo_|-JJ )Uh ۙ?xis {QAk9bLHa/_DrKʰk˷̈G&!i%Ӗ i~Gc*}F)AӉ97aϴîNѵE?)]̖#ᚦՄqI"n)VsnEA}l`.+ JKjMo!4cRDh͏dY||g>%ኜ!'SE/URG*{b]$[ Nי.HݑuS>1#2VaN։< )P4~G DPe`hkW*K-c__RօJim/YBUnmP]t|& aDhENM RBBD3RcA"29J KOGڶCCGTu*$T+œe&f1=!& ^ DVX0ަiPFlrxEqFZ| $XmXRLu-*i(*V*jZrNDI9 ]`BQqGLe|JQH+4?Mk(-2Dܺ!\7EGG; uӹ:]O#x7nOH(LGV-zhj&>(\i]U4r3yBJ""PCp@ x߈J!4n:c%hdIViiT_e!HD7T\yfu%@ E4&kTm[ 9a BKnc//))zDE<+C@*!G*C֗m[Rв%"pmCtz(ղ>w D{wM-X%h=#DI\ tKHDkUȴ"fcB2Om,%9 1/abć6JÞ9<_rΈ\7z #XɌ"79bse1]Wt۲- t=Z(ٴc9?`͈2ؒ1>lᆪ}E3v&{7?p)uy=Ӵ ;:UԭsuuK k<(7,$P}0 X*w( vRr2QvV|&mЦ*Xub{8bv=RY6I2MȢx 21DZ=Pgw1'uY)Am^"'VLqc>O@9n\]GD\j^&H-y }OrF5a/̶n|\zn*C{m˟kbgꄼV7C1?k><BZ2c7sop#XGΏGN#i%T.w_iLѡ37t2Ϲ~{8=_8m| O//@p;i؜yZx:Ik@n簒3yz:zBV!_8:+KcVj뙾i黖DfMկhv3=Տ>GEsO~`KH!*ylkY=cSš% :sAQ7O],;r3bR`駰K1 -*T->Z]s!׉lc->lQ|AuF-\$\4rBi"%O;-uDRGq{!":OL~wT ! ;y]Jp+o_iCkX)jvޡeVvhjĀ0=Rh܇LUF.m[k6;Fvkb)Ii[P'ܶ`%V e ;n*hu)RºV!-Ї#ʠۆ\L+ҋ:i7M=`kCӴ% FBd]7Z}1[')c#W[. 5x(%RJem1V3TffrQs]͈.K%z)Rѥޣlwc օiA S~9#EʢF7hv{r_V+}ɐX2 Ў=q]Rt_эby(s{Tti %%$L (2J: "L䵦@~~/3ʌa%D;%BΕtU׏\*5MC QdY/)+6l#ƪ .X3tM.HS )CIMc]ڡǯ)Td5+]=I(K\!J$) D;"C 䅲V3nd]ۑ$Y@GdӁL5N']}"TG&nv]:G +@{2\"[Mܶj.ΠLm aКyYhcku[Q;wӐHlBc4U12أ_B IIV%t[}Bz ׉m**zd)d>SU@pQ"v܃ ?V؁uT@ߏ+{RtiPZA ,gh,gJ(]n;(=.dɥKX%s׬?twl_941^݀*N7D49ʼnA-hH 0MÿYO°u=U} ڎ~#޿f0 <_O)1qz:]\/g8qgȑ˱ZO//\_mJb}:L,AILcRqVZ"rۏtW(e1<=>r[1J?~Êjg݁_3z^>'gpߒ[C8-ܽe"}3c9zV~G.V7W<<>w[ٖ#19n^.XP~#>5jZ'>3(0VLp|O7-? 1 M4'ox#rIp^]&χ+I8o5Fj%OO,煸JH4\$4|lƺ{Rtm{O8>< Q/x-rl1Bevq7N3q\K˿$@mBBt;5t4, l WBF\^pˊzҍ!y ,tWaA-R03mP$d0vL\NVD6Px_EgJȺQH@ ![i#mߓmjbNT\iC. ίt>%ٍB}Et&hCѪʅ"mR;\% F X),Q))PXC3mů5wq|)Ac,t&:_W1 F*dPNb 1tŴ!jBl{H !QcqRJܺ Pf@ZOiL T JRe+ :TX((F#$2QKg"Rrv+%׷ PMʂ4հ@;ŕEVaRE&VBrA\`w,c}ݱ4$U\0H?r-Z[Kr#Lw"i1]K Ve=Ӣm3i]WaKv>nk O~?Cn Ȯ1֕JX E4uF)1Tj.eA FJeS^D} ) 9q.DPV=*S-Blr:"r"ei[/h[@ (|B(G ] %5Z7d"QMR'L̐KAѓDa=ot7hTRDE[b !zЬ3:7 2G A*CX*j~?"D6 2$6Ȉ/W6hc%Wk()(D)D֞VUΈRcDńb-BuSśv#xbSIIH%WJjR.@(nPZYrKTҡP]; # .DQ#lq5~j-n *F8p#J d ۂ5Jl:&K9JJ_1W*ARiHwRݚHRRyqi}}=E@_v^Qe \*dבJ!TLeEu%F ȅy 1md##|a P8I5 J d֞UBZնډm(ϔvE ))cg4>xnĴ=)%Mײ}T`ߘ W_ҵLd-G:04*W4RVb_#}%e@6*_`2㷍BJlFwLv:zΛiZ´C$laizZ_=Ӊm'].-t&U?t1();^Q B] 1%=w%+߿>sljyt^@*?޳=/gGpf7X3b8Ϟ`#/G_=׷{\P&4abȲn eVڦ CRx>R8"o9%YP }ˋ[Ep]Q3iھg7qh) VhbuWQ v{,) )./8_곸oL/'?/<>#~?Ϙ =zlp0 DpFk, W h4l>)6:c?KzҊ"W8g?_ԩ]I]'3pKaY'H!S֍!'a$ǂX66o"vȢ0fw"8Ob\˲QlKQ $\؈vLwDOA-R% % ߈ )!5)bIr(Y_AhD(#֩ B8G q1Gd.'a)%2O4Vy~iѐ׹LWnٓuO3ִ R" LQ<rx%QM(;L; ewz##;RbJ cUWt[ZC, ϡ%GGބ a-Zi)#YI=BH Ӷ|`[39gdȈ3I\-!]^JWHk."J=ʲTTcQe;+1 %vpD# ]kITwUWOW9zjmqCNC -Yiar5[.DQv5f/!4pKkveA;}%$S@]$"GL-F0k) QXMӚ{U"2%T1#ALEi{d#R{ač܏ERYJIDckXWL!_bm!s}>lO Lʚ][? 6 hE.Y;)hJAQO%%P{ڠj]e7m#m1#%J+r *,ɑRJH)tLnjU^ %J M9Lօws#D %%`'4BFyF&.~k@cGr@Jt~ATR";H8(HlCNgLߓejkj{`Fz5h!P"vĎzvH-Ȧ ^'ZJv)ӔHyE6 -r|4cz5u{.N)UCDaFw}= jVI}XSZM*{{G-j=)s$+mۙy 5 h+>5k݈̅mY(F5wHLyCRŶM%GM }<#,Ĕy~zt?cg#Û;q xs&'Èn OX+29P0Br"H0׍'#$/Lv5-/ïMHLa&ZnL#Z+n޼F /#.x~WU.0\3eOxP!5'1Afqχ{"`>Wp'w^Ejǧ8?Ee1e6:B x|| l.kzӲ8M1'Lcy#:|$Hdȸg/~@۞2 r5~ KѦE[5ފ8!B졕)KBImwȶc=;~ ȥ`LTân?bX!Q Z!l4\0-BXP@ʂAc1^Qm1"dFhHT*BւH(ӢwW] @QF!0u 5:`b&ώm~j[W=GDg㶙)b0RVdE`ei>ҵh ֎O<ƐR$v>ZOA9,v#܂eaYE/ $ZHqCc(F@+ڮcs3&iHi%hLײ}<ӆjQYGjTw@Kj![XԚ{pCnsizuri8~@ێLPULas&Շ]}{vH4q!#KIYHW:HH- KV!A#дK|w(G?Oܽ2ޟW>n7#nOaz«[ԤD-neYN4g)ik|*<=v [ MW|-mXȕlwxϕj8 Y[O4^ǞCסGl) `Ɩi_&PYs9OLjdNN6l\a~wj4x p }wM҅ Ikl9y>}YDHg!2ՁnV5Yٺ ݏ8:'M΅6/|z}˴u+/!IIu4tzoK ʐr@]y:#F tC2zfN!J m\pƑ'VR}39nHt2PSbmhۍDt=Xӡ]lM{u uP!;*ktF"%mz;Ǖ=.IJ|>PR3clgQ-W:0-{C)[(#DB-:]%&ؾK!\Z ݢA5Qb&BVTVH\7n ZFٶU%˙f(HBbc /1B dlVFrrH#P9[ߡLW/(JPn=Bݢ!Ȇ$)z:>RuA-E"iڦFbaD H5j"%Z@>h6ӌVvMϺjXg>=%cl Ar RKĎD$H =jw$x4N^*Uz*!`TK JƨmcE#JJ 9'\g-IZSLxu֎klU۰(㘖Z"Ɂ4Nma^1ub48Mi!]Gc<8|R+3/Q˼P]J͸NW V:Olw)xXtXv[8rkƹh#/#.(ӴO*8hڎ Z@:4]CUJ[R0kJ Np eQeo6XF)wrU"lZQeAJˡX03h-Vz/lnbUc{h:o9p-+Ɗ+{h,o{؈R۞ w(zw` j z2zsG 뜋b y&chD)P Vp_5io )CJN.JDxYBə첷ئz9Ÿ3FZ-,D3wh]gv,Ye7qvjMC4_uxn w\9]&ڻ-?ݟs}>:+_ops=o߱$~9vA5X.WLӂw?'}H.eB :Y \/llz)bV2y_abwU2W3a` 8폴}G(833qZq\x{wu.̦hĻwo@I;\ӲL8t81 a]xswGL[2bfk`DQn9. o޿#g-O۷9m/8EMOp?i;'^."ڭq[Ҳp8hx-Al(JFº& S^kw2n3L3ZfR0^…޵ ;P2r?QE6۞%+QdaDV46wy%)0%- 5)IV@Ft.DHM˪#m7,;j c.hUl 1k*u!)Űߐ5 ;"rUc 7oS)5saM^`*uG)X0_.#L3~mi߶H(KW2vúpwH 9XBb!q>Q @\KVˈi<#uR]5womO&R( s5Xsa-l?MA e{(m55YMGZBL` et;vHH` *~#%䘹^1# YzxĒp>4F[AT6(FYsT(|A 08Ӑ2QK_[p ,VR#ymqMs=0CZ)P!+C\^Q-`Nv@LĔ(9Ap־a3h(UB|#XYW)e̳lDCĐZ!iR9\#F9-Ra[J5,VL]kv=opָcvhבV̥J&-_ҩX3|u$+2YajdoӸpY^O4lh(1b*f:cnvؒ\K\=y"e VYJv'1+"(J+B^"hJU8rXa2*Ή-{aMIU=b#rz@VPVPη!8.Zju bvrݷ<`Mi~ QJBuzHe<3^qڑIN.I8O ;( x{Vq]Dp'ƱmotQ% ;%,10No2 /-5w~|y(H Q9,ypG۶<_Âl'<L]?e,L۠bN3X/z : Ũ7Ȃ&T4k4#)d I@5ƢQ ^ %Ǻ(X '0IT NUJ.RC@R&A+0y2]Y#ӑRB[)vÀ ~oTUهYD=T8cuYjkS B}d.8ƒn0une+:Jeubm01|o[|'G(,ao;4mʕ 9)#DQde<ˉvaGml(\CYuN6)R@e+T2ӿ}C_jn9ÑR' Q boPZyaєA*U0j8^ʂ0yT JvEM+[)*SϨ%&e2hJSAyy|w_˫KR[YD4,ϟtֶ^JTK^e=5e<0OD=hTm軁ue bLn˲`<@|:IeisLp:<͖\t22r{RUm06=Zq\'jrŸ"HC@8)`%r}+6+mp=yn[qĀv^%Q$‘woQ7"OAw;HȔF֚!6(tEB͆P} *PS i[jN5vT'HiQLm<(kf́~xrz1ޡra^pfAKp|UmyA݈BJqf@ 1Dk| ԉyz1B`WlvtThYk؞N]nwlGʜ T%Ҿ wG8ʠE%ǂИrH* )baqe$o}+e2)p6녜cb1 U ݈uIB2-ua!AZ)D)Ƅ`j-TBA7b7$|#I+*gT&b\lmQQkSmQe԰B8˗>rE6\(yLEdJ)85@gNh`O72ܷ~;G޾2^X6S R|d\sM+2 ,15qk9[C۴ u&::*pFwVf;`&˗'*ߐ~rǯ8ڇcI D3ŒLe}A".cK@)"Z]#ۘ !JF{wʒˊvL .nTMX#HN@n68H;JNHqxr8ic{?`6TnxKֆwbkn*ī54Z Q dE\"7mOJj8hA9w۠Ľ F;%7Xc Xy,}+(FUQ9D6,3*~ݖa{&L7bфLe5Jb+mk\.gJ{*UJ *y$UE X4۞0H1MktSS#Uȕ2E)Z2*c>=ӼGpG J83Mҙe|ĵ a-Pa]V9HG q&0lk"UE":!O#Bk<DIr΁f@M Nu 2Dn5ҚN f\S"XtXB T ËTe-r+Ϩ`GxRʨ8`;n֚e Ҟv''<6ԔHZ,o h#r~Lu5gq-Z S;jA`RIy`>| Js]1jM<0cmh`)iB!ae%i$2y]Ylja&NK6/XO,%л9JĸPBBtJd=f@HqAiSx8QVSN2woIJ8_y+n)o p9]珉Kg~_p ԘkeG>|si;·]?ᄃȘ#̑x% aZPqR׉yag^Q޶JQL ~m<=+ZyGU5f:bS/Z\1qQS!ȰݰL}aGN?<ȘXh ~O-x[[/zjYOWٿecF9uY#!'qf3l.tp`[+*WG6ʲq/ _Baeg5lw;^%a%nY֕^Y6w{H-FpJSs! HcW]b\ܦgY!wXݎer232ufgZO?w1Ntds`k&wHӶTnR7`/St"-+$P+M/].ض#fB6LmZԒ) OJpޑJ%ʙ' VR U6;Bs߰+Ji) +kmX+H2o(Cp:_e"xSvMYʬY;[ s ( 1(vˈz z=2]T ;ˉ(C~ď/;T,͞ T΋Kzyf{Ha˰鱮lIQkIJ~I3gQcDuz(UVrY|LY]KbNEf%Bur5e @lo(9C*xi󕡻u I[g4ߣ@bZȶCTՕtu[9x0t;0lJUu(UayO)߽]k@[M ZYֈ=;E5-LIд;e{|+/(2IipMZO8ӑA(8%\goԕrԴ "tFF+~dJ%$RX7wbv H\ȸW J?UUtۺFTy!EuL]([:oN#UI2_x?HG:e:e͋6͖pPJR*ݺRBuxEa$U@q*9PzR4mlwP800b^l %'/XgfN/pHV)E.]7ܤi@DJN; 4.xa{*b!Ji8 qMSҊ))`SxO, mIDL*%sJF W~A]UE@.eBkExo0NzbT9yZ%éMAF2CJz2RMNT0m S#eP"PFdkq⛆y4N;kHS$U*?EU&/i]J-Zf)K*5#aťPc؎8Y.\۠\ edEF{L-ˌ6de,j`vرWiH&?}wr,y^Xkt8q}=am/78ww73}=93f#!')RYzX+RV :K$sxz#?~΅? LYeÅE&\w&P$nKgv݆ӁV y-iFWMݲ^G;Jx"yy~RJmT$ei|T(feրZj,7aea Qoji=|9>eĉ8Q(Lқ*jOX"IlpAD7nƽqDqήך[Ƙ7l Y{:H2Sm+yYآGDSiD s鿋 ߗihlB0q=;́/+m.#HEx8Dĺ-تᖒ]FdTy&%l-nyqkj.ذ]m_DaANڔ/L%T)vW=@r[\IF([a"Zi}E+Z ~VaFh'lZ(x>?]fٷ"a)BP9B!8_'dNޓSFX#"ͅWLйnl[mAYh ~"AW-2fH-mWL3V uCsh, P7 COMSJ”H!2=v}fKmخcS XJk2FDs $D"BǀE쯨AM #U xE ʵD>v8_<=f8mUsi#DOrZDșuvC$G%VRXQ/bM5$lΠ[MXۢ$$npKiD0/mJ*Iߴq*]#U&'wP|V[L= BZ' SSѡtK&6bkS6{9cm5pWiV *S #H=m;V1bgxB6;)}@d/\ 4TVmb; eV@RC[&vEl[Dk Skhd%OZQ+~^}5RK %tpxоB*zDB^ Ô 4!W˯}p4OJӵd )n(BjC[#9(DeG~W.C='mDb+(p~eJJZ"ER4`R-!s*qQR }g/Au|BT)kp,ؼcqZ녡Rィ.ՆWl10GRdә}%#B~ֆw/˯hϾ Zzʻ{߼oZή( z=uB ź,\/bQk ݎ3q)yثXeM #DN:^=?1n`Vb < Ez9EjȆ-n蜙#KP7֥*P?GRyO YJeIc/dn;Bp98mٶ6tn!"3. AyI!bWg*\"V1ye~z(n&lU(?!Pu[z)=|ZDw`L-e1,ZܲR .V#S8U RrX4ZIY"r!WȤ2ߜ(]iP$R#JZwHM%Bh*0JPJ(f󁪪pa~E"+jV6u) 61fn ʿJB,NY?QȩlT*+.,%&81Rr AHRHH#wd%#9K}AIbP*R\pqEw;NIۈ5ΕK.%7H%ޓӄ "?CQH%f*evDcۻ9E"X7U!",6Rɏ3+uwe]zJ]21Jaڎ8^EDhwewImJ_ ҶDR Hr~$v}yW Rq\y.22~Ӑ"2BPХ_59T - 92V~֜yuhui/dOU!Pqh-Kdq9Jзjoe\h"Jɢt,>@@"O yP&./iD u}ϰ@hBh!cOwy j-[}Zq}kSAmx[g}|;iHٗ/J^Q"R/riVTڠNWh[8ojɳNS3T@uJ)X$ a[Q=Ĉ$mɓP&@ Jr6nU[aʂTT:}Σ\@WDc!%W H9BDKW l^B/d &t;g{tva Mx=?9!j-1Q8Η34F%%4\ƅݫGie&=Z(eHB݆1У+mj\ Mr9}|FI9t\~8b F~6a<~đx'ԄubL[(f09q}M]Ǐ~S~Wƴ)D$0Om?!dLp~#}O۟5|xh?~=//xUE~rbNW\W+\GB, j]xPi^Hiô5yMǘ<)zb{į~3wu5R4u|f8`ۚˉWOCNI^>>V=: ݭx3N_p,9TcyZm|l!@Pd M)ßltM,"ejCc x?pLiLзTJr\d#}2NL{8ŀ_~ɲ8$!H2 94̰?Pr>9am<"XOŒ`+d)Fqpm-L]u$)dlƉ*T,V,3kXHBb ܊AJz>Gv'_>0<&ADZQ2~=!mK 6~Aي~x""խW#x0uSY"uVtz ϧ:$ Hv=)z'fwS HLRf{)dHP~/yT u_>ݣd@ 2xDHR3- ZFd!iw"a]%.FZ[)~!m#,#~#DJBųA].6.ܥԃA ۴!uETH1Zn#nUd{#"ٕFJ!T]-)Dt*.R [ Lʑ,n$%pV(ߣkm Ie[gK)µ-[EJDme[=usy-Sy͕ȃJ*l@*j ֬-JUhӂp%:' M3Yd̥C%a+y+"e Y[4 eퟦB+PH ۺC0uw1]AJDӖ<|)caH!T1Z²Ho 0EkAFVPZˑ=ϸ % i Ӕ[uTz[O`t8$ZS@-B¯Ϙ௔.BM) jrTig Jkt5c+ $`;Z`2`rG\TMЄ 1'y)Ew@ihr˥ v9}H1%Bmh49(OR7dQ-TmߦII2*92*>D \f&ҼD iͺnt]Os8p>MȺF$Q0̗=?oHy_=_1G~ V_qu5ǰke|<#!ZgO_׍;Îm\{G,=Wcڊ|Ew-N~ӻt@IP4: =/G⣟f>kH6KU;.U]x4 ~xל+W_/g #py^FrJu#0H0t|?ˮ>Qr7uK)֍#u]33}עyYPYC4O- RU錊Bz_1lՑ獻{/rYUDXrn_1R 3/pmub]e#^*;4e96"6T'خEXgxT%ij4|kO>";2_ ko^m䊵B%ۦ?gL'yϙߢ?O)_t[qncG$з ʅpɲ"R%)QP"ܲ%1UԆ:aL?\>@+ bV91?(K7NR\O Yb^$ȔhV Y Zyn,JKi =hyv %2*2z4wڔLF2U)wwV`{tBV}*-:ǂv|G$O ckt!O#ܾTp?Pd!,Y;0]) LE6 $2ZAt!H}>~-:Kbm$y,uVid r\zu{q*S87[Mȉ n@*žYB@:zn`f1\_~9}z&`${PV/b>x =73ͮ%OhEU%-I[HI6 9<<1O#T|zy氿o8ؽzݛ?cY?0/˅P|p><5߽%ˉ9B^}L$/Ӆ .3~ "JR393]兜#BԆ,B[o-JwlYa_^o;T.9+H#l|9S5˺dyGavt|fJ)QYKV#Uw 2_IFREKR]D f >Qrppb͟(0;/Uu1",f蹜ܦ 7]?// SQZcmE+S[ڧ/b16-X>51dQY: U5y`iI>r {PXළnaeͬ5n 7h{__k3o听4۶aX/ĸkK sD&[G5e[ *X6n[K u&$JAeMlo˴UJtSʏZY,9rm#i>P o[%R._DA TUkF 4Rw]1S7C֊a.t9BRάD[[Q%2ndM@v͡+]^wؖUcK/M`(EEԢ)CRf }Dꚰ疪xDRDW\ *Z9(rRl~p@C@yt7tpXk\nDHUR"O2fׂDb{da6VuD&Xc"D_$F#+ֵD.RL%K\_H]m8y+E ef'%t97ú ~Zlˌ Vk9ݑebB Lecf) vrsƢd#aв*$9sI@Wr,Xܘ_E˲4AV-2 #(X"dL]e(-ۨ)A% ۆ ׈K!"sIlS =lӂٵ ٮW,Jl2Ȑ`rƢte3b:F[KBDaHJUw.]m9"ǝ'TU[Gm /DEXI X b 7,r.Cn`~)xڎ ֗K]*,L#%%Ks$H u.2#ٖϿ>~iDLX3ͮ:Вqy@+ŇO+~OZ`O \q>uݎ:NDU߾i{˪#`S;yVXWv;f2QY˺n\OgDe *Viּ-Qf֭аt[{,1MB۟wZe7O "ODƿ)r/|ȸ(ѷuݰ[[P|ھ=W$ ?$2Lvח3y#YJԖؖ2RhAyص=[mIcħ )&02jQ!_N)%Dfw QEτ(/|Cu+b)a 9"-d ݵ5 ŭ,D~8B5+}{Zj;h =BHPw@aLQGUL68Y6Zc 3IyiJ9:1qowuC2?Go **V.~B `E&edPmcg-oR}^4|Y1B`C-wxL>pvئ&ŒNR>%vYKr;rHl6ѥ˛VضG3n[/4ݞI䖂E=~g?3t(Sc^ wsE$)yֶ.Q[̨-&rR͂.9#D=rb'.qU_2\>Ana\툱Zn&۶RU]4MXc+X4)g­+~O- ¯(kˤ9BʖɹH]3;[i)Bت )40U"'I\3m0|nC7e-.T%O@@V(mL)*LgdX%uM\f*m ϸH.o=mU6Zd[6Cq{3F3ĄDT[X;d;bd~`Idv(P%Fj"~J=DVQ-YnPV+RZ)bԳ nX瑮m Rօt$Eusf\7"YBkI!QZrh+x4#m(]amz[d QU{l!,nP6ex%U!rQ-R*B{m e@SL늪?.[iC҂^VZ z&PJ ]5/R.)0MbU2~>e[3zwG""hk)K^F(Y>xA˱`\ C!έ+Η*ɚ3.3)iB۲m%|-nՑgay0\JL' e(Đ" %Sh 1ņ)kvƊg;L*'T2Dԇ}y/˛y8$rVUKY5W|A uh&Ta"D,R]cSP;uɶE.3Ҕqݖ_9ߔ,,c8"2m[c:_v-N%)TM[6aVT 2/ܽ~DdAe j>y_4]!]woMLO:1TxftO a)lHHgNe[٦PSշ_7"?)I\?>xd>^w;T~"0t-߿{ˮ1CCȔy9z?2 =QIZ4ί|D7|S5?캎/nQ֠x||724u# uv>2/ 9ej@jIudx%2M7F []7BFo^HH݁H(uU\>~~2O4݁$ Dum҄yƏW "-zftCf|y Ƿ?9T"AZdlDUIQ*A+j 3Q)JU 2a(aӄ=y$lZI" SwTwr{cjΕBiHQʄt3i"idA@pPWx~@ʊ/R4*K?]ΤT$9Fھ'Lܓl|ﰝ)یPnĭЛ2FwS(Ki \Df[3EJQǤ0hb)ێƹI2rr! D.(Kma-BRcPGDȀθZS}2"e<+1\IEq{tyL}pnh\!HShX) (<M/(աkrHeY#F*<mNZDe\О]p,QFƩ\lS "ݺ+ 3T9?vW?0hUÌn$P ѳ^TME U ١lW0u+Q\&)fde-xN䐐H/$U_f1*5Fي'mJDSf3{}HYW)%̰'bE6Iioއd8unBV+}|U@? R-)'R(4/G~@rԖ~϶qBjEOoc۶g=ժ"b>{{tfBBZ$ҡct$M@BHN6{ǎUr4Q͘k{QID_*?B\7Շ1UjmNeѥsBUkژnoMG3g  ZD̠`=wK"X@ Alۥ"M!PAKm:_cw$[4 9lDw_FX/oMC~c=n+1ouޣ["%% D|HIZnFa퀟.Hۡ$ ^11®B&EL S!.G2HKʁ|y)g$C#16!Tu{)R1W|9;iex=#clc> $ڶR!͞b eYi%LZbt3 w8` 1K k*]*_Wݍk$>IHI48bZ+5SSJ YZaDɡb i mFJԖ_p>U+iG Q"@9=mĈIbE)%5HY- h)J`mdtɶx!JeھEI"~^i3ED#1OXcyAuH!WIbLud?P2,eCĂah6EE3I㭲"7)c-5ExP^ζJ'Id߲\HQZ6Ik= }O\o_] iܑV$mųJeٓH6a VBXm]u a+U*n73Hc0l#@*ʔYA 5[S]CXdY+) 1J8PTZ*e@.d}&@Pژ@Rb^Iy& m[ϤBH"`U8T/[f@Z}{9^FטV eb Jtp*0N5 fBKENR ) wX*U =3 fLk5W V[MCJg[h BYu(~e (Ғ}&&24FbFh:| X3 grFYzn@z;H-R`ۮň4>1nvpRR`.ڶϽG!Zhf=zr}:8ȵsGU\sg@Κ H]@B R(y|L wzQ{(`xg[d`$*A-eLE "gK6@ RD}^_M4q DG84BMX/eH1Vlr-wN(r)XcڰhN(l{D+RXd>arvB %G")rg{)%XDF!IuEr\pm3[Hfײ]n䔘օn_!VBV0]Fp|8I6N9~7B<<}$i|_Ԇ#C%Y K}ozDR ]v;?9Hן? ;Ǯfg.nBR/MCX=7l~Y>}R;c33Ph %E,(e]D G:kɡƘ-maF)x^t "ѽu=uY֕O?&,M$F/,+5MߑiCJqێf/ئa>_:M*xFӴ dw@5(]c|RJRJ)u-Frf^ίXѕʩqOi2dN)$ !фjټ(Z" _lCP4ݣ3( q!Ki;V,~!;̺HX0qttqG=+p0b t,(2U|U@ 9%Qݞol&LdYh)pA๾XQkRx)iEKXF#iX:@sdۑDf}JY)F)WX n49:֒$9j!7H$Ah۲ kXtJ(\XR>r{{aYR0B7-+RBE[1VWEʹ#C>XKھ!%}5;H|ȒЧO8H#mtƶ=m:ZqÎ"2HBVH?@㝸k ]е;|{{EP bv89iiZhe`=vn$$LZ&Hɓ!2: hh0ڈk4؃,Y6"ZO~A a4mp< ?gD݀R`ԋ6J i"8o4ERdCH krT?zU# #Eh R|BQ`5-Bjރ ouRRX끦4!Js@ي,yVU/bBJ4aGʵp@M 2'{=fQ;,VSA&I z Ik'ݫU: Ev%kVòM1EiM=8&Ѷ MG^߈V3 4# >,ېeL Vߵ{BaFZNE(Y3Թ֣,0B*V;-#)GF Ijf* 62tM15=:d+0v8!]̂<۷@] hT\֢V~hvfQ7"T 6@R%Đ]OZ?nBln ",)Ole}? iq4zHG*A  pa*,@dX=|exVJ/T%<K7ݶu,pNA7 +e" |x@~Ba;3kKTNo&o#"gzٶmtmNn8C~̑u0Qhciicih! Z6a{@#"uﬡdJ@kG\߾ ie z~EÏWtӃBTu$(70smfU )BV =hi1Ar/_i ϟDC6o¼Mo/cX] X!C74Xn5^:8(ag%Tc$!,joΙqI>6=͡!hj\)sPδ)Dn[%,ooXvcKƸZUW1o8ɼpRc=@]2J*3ry JdSmiZȊLç;ٴ(U R+y֒ %WEXI8"~>kb^i\cldeЊ\>; ; "($ <8=BʕbS@JBKJ\9,3vwbSfGZnvqB SJ#lb]HB?@d4m%) `Vrh*ԍ jdʤ"\{TB"b.Ⱦs*=]ۢ!2HR7q%iwDm,eդO BUõΉ7Q4> ])T$4|/2S-@6CQ|zeF#@ĄSv'$\RB@Ebf2zV l#N*Jru{p򂒹>3[E*,3Av-_6HTӲdpR"LHMخT$X 5˖J{zDT!r,C;B R"%(=0*ZC`3m!\.֡m= Yxt -Ex;Q~ߛH]/?Vڎ-9X Ȅnk+KF"GrAcl+1dP߽an4dِ3^1MGZr#"}#ArJyfo*HĮtU2hrJi)B'XhDג3bStE mwR=x)o\2B+c) ĕ2EׅF A}}H_Z7#k]4q+Y+eƿU#Pʰ9OOXۗOrfapdn(2kQQ,i%|#fp}Cl"N'iSw @ SôtO\^QTօ%z?.ld"BͮrI>ay8vyl9cp8C`[=E)9 #3zo?W1O3?"D<ǾLJmjWv;WRdgׅq2O;򂴕f31gteEH5d o5$oˍG[_Iۅs7o_/ ?OʲL9Lh)yXX+ma|a;U5l,MP]Sp4 ۼ_?o ivT18}+_do%蚞Pv;Ge& D_O7l+%t\ER(LߵUtngB@e[R"J+]hu1=¡u=qR| ]fiEv F)"ÇZ!Ѣm~dn(1R@ZꎹEl@:P8Ӄ.gl`<% ,@Fum-i F`wiHXVy_ᥰNGT6Rs1(ۑEŸ+uxeYQ9nSd)d"V֌h:DN`Zrzi߾ӯLHF!|bq\-\RSי7C~TKBu=PQB"@jGQkzaulBjŲNtJب?nEQM] skhC5⺆|5 9$Aj #>bo"̷J[nkQ^H]٦3ֶDZ.d6N " Ja(Rչl4zm{ Hc*(RRj*zr\hG432D1V6ŵǺ u)X=2BYRHTû 㗥(H ֹ+*5eo!%DRv s")cFJIʲ%7A!*A6+3nwX@#R86Pm-+p̀̒ w"č QR{uFZюuRf8"dQj]-*%BיMF0L?"8$2qY!ӝ\߿~ÀuƒivϺ-YC]am+z~ ) ZE ǿ-_T1 MH˂v:U/sɜԋ|LveɱPF1"m0C|XUkGڎ4nZҺĒ*tCCf ]KtuC%ayj ?[ 45m5({03s1-#vwTHte~{X_%jlY(!* x'p +2$p$,grZ:~Q*N\-,Bk ()3<~IFہV[5&7"N&"z7@0%R=lĒͶBaQͮgXrkaגo-$cgbJLg>+??k)~ )N?oo%q^s,,VҺ"cFů,B˗otQ-H;y5b3ui_^ïy\~Œ C֌˿}~+44aCn GaRוTB_X]=RlF#y,ޓ d+QiyyӰg 63:x8T Zs[N=I^^ѻb$sX97Sg^__Z4 g~ov [BJZ]Pct yb9*L@"ɴ/39&aic6L,h(JrP1l=<`v۲##?5Oʩxnhyﹽ_|#rNhcuR`Y/(% EJ-apb3I6, 49au=LA 4"G?r_Q1@т,.Nۂ6=ԯ]"T"FJZ{/\i>~zeq]OwȘI`'4T%L( W!^e524Oϐ$)b)S@ C1 7dVa@V?#D*f5f!$d.t>D߾洲;.U.UR|IhڞuYC+#PP %G¶êt.gZ׳g+^#(R z`],Ɩ TR쏏Cz`9b:G0oJYXJ,XIY6Xg7Z42մBM"VH!Qd8>"0mUOY ""|ѕE 'ZLR'$pCV{hЧG_!u}iEKLr&炳 t=%SÁRF0 3 ~G _VagXdc+F7z@UND& BWd&)Vp( .$qhzE R=!USAgéFW0Ŷ֨UfGQŴNZn55 nikւnL; JUȝE|y(U7RI-\k \&Z# &15 VwH%X 'KA -ihXM)F?C rhwPcް_wXk) |y҂2li_K^^x8=0/KJR;"6/'X QF\nX)A _߰Bq\WkX+m։y?ve5ȯ>~_̧ϟӚcXZRHgxﹽyD#膞og2aXɌ+C׳ϷpȅmQp}y{i#l4ß@.;-ӯ>Sb l2Bg\˺$B6}ӱq'r:mn7GE:FDInN2k lY6>xeXx}#g 2RD@() :WAZW6W줩8a92nDed(PsE%YSa)b<浊|Lk}VYߐd/cw.Y_9yEZEJs+֖2O䘡SJgN÷!ˆ?Y0+M0E""[`@ ?Oĵc㑬6 HFc#zC:.Ww86HdH%AθGBZ|=I Zg[?S=8kIˈ6,f {ӱ 'X1=6 ,tT H)"ٯ!LkLD2)FʺV !DX QfsNlwiJ U S"g=) ]=fT|jZlHɕwˍ0DlC!z~y๞oXg݁jV@ uZ{X|B\WP1} JbmKuQD‡,7B(UO{R%ߟ()AզZȵ,Z:u*&)T6fŭÝ<.Vn:RAz޻2 \C$K2(:"EkD!5a S JikWV/ZKXgl aF,D1թbe}% %q!jGôM%8]"b= hA6Þ@ RN@ ǥێ(uBDZw]KX[ΔpPKV6&3\ru<O#5ށ%(:f~̼-]fvh&RНo-qw< Fk[EVib Gy8~Gi?ZKFl Ǐg2mYƕ9&mE!g٦+J8m-nt}Z pP =qHkY )%"&HENDI b)V"BɞoyC˂ u4C%Z6^P/j1`օ<ٶR bae,?S U \-xѠڌzTy$-aPO߁1HX7ElR{aca$~]P7 ]\Ŷb =qR׆ik+VǩbE1$ЎmQ^ m*NY(lUmD6 5<ˌlJ(,R9Dm,u{3a۶wXLitV"ݩRn oXAĺ?vb<"VJ7Ӓy0Bԡz}_Řϥ7@Xn|? HLca|u+>e/~͗/o|y{fV3F6Bpz|~O4o4q]&9e*鉰mx1/HFtb :GӁuy|_?v-//|x<-7m[Ӵ6tnVAU␥* $,T*$AABC <F8lA4X`ڡt\oz("(E ~5NfÛmpǏ 1Zaw`<!Î>Z[eCQJJ5z6k&?X(h-k:GqCu<~yPFbMA-kB}UT)x&zSWRۡ^J~Pm 3(n&l YWVh)q[Be"_/rn3t}̥۶ۋ֭IbD莜kWA5k~Dؖ9T@OZ / u]$0INR)2PRG։HP  R/J +/eͬBw|K!g|7cyF7;*O g2, +BQ(mR!kS#e7N-|\he'%U,,ELhJ/3o&RvdA6 EB #%/1F6+24Jm1 ohmSq J$P#BItF6k3?5_rD%`]?cD75HM7C%Jun~%6tF7b9,Ҁr x=oA6-niwHղ G̸״dp#jZZF+q\HۆWKXm*ۣDM6U#X1VcGPm17mK "s! ؒ2D[ߡ`^1g_2BZ3+bhLƧWDrTC![XDD@/ֵ:$i%$'DW%ԢlTU1PbČ:\0wPr[C".h])jB*Dp8Rc YJ}i;g,]Gt{( =CRζʛniQ 5,ndeY*0t~byzg?9H!э=qݰ}˹Fz w}L a Mx}%7m|ŗ(!`T-.77+}?]'ox}~tBu Ȱ۠#0#x];UlBЭf~|;._^PCl1qYf _"KmWX eB%8Nd=i8Ny! <{^|ϾM+;ھ%-oٜo%8tQ LcL~eaO"/Kn Y ޽-eUHVE~f:h w牰nxQ8B-[cIJ|͛7<_pḯx蛡]~`[<\"ndImwH*>qwB ٷ]G{i#m:]iƎ{RN+qvTʙf$0/+R n N+f7H!x6&PFB(xI)q\k7oHm۸iZpvYfN5O/=[l /3m{ rhhBXq ;QZmpF(u#+5J)Br<"sC><Qw1/3G1 e V42D-) tX K$@QReg5:Dvw  "(\AjwV|)$7P@) ZC,˼a) B9@8tĚ1bވE5 (-%%F $]cW_c=xu% gx@uCk zʰKAAΞtR@5 %dAjJjUWF2%\//4In%Fask-kšR$FbHI{G t¹?-Z\+]G|BQ, ҶG2dѐ#%v'4/C K QZ?8Ϻ:l7 JY$&t;"̈.yS}@(ɷ4MOJ͕•CƒT%*` iP%]^дܲ0@!ſBptHp)Zv Ms/әl-?-qڐRQZKn ~]GUD !|F$pHfRtİQ:m;A0s\zA* Z2xnnRI(*h:'/Ρo+nmJBpo"VYJ#yXJ-V6[;\%lڈp}Du;rm{ynT;<6MJ(o/(=T2$4\]2(lF #da^j/W.sBIw>ٵ2GR(f:t{DU* Ҵhp]ga ;)*LI( QD4_Wt`H+B E<#OIdSݔ7qDv=y0cbYEFj(#mB7Q`Ta1B\xw=t%r-(R"JhdOVq~->F!B "~B~»q9r<"?%Di@WT; "'F"EŷmAI$i"a:H%W$p2!l9W`ɦ[e%;j:h@QQ 9upC(}|SCv#0}rͮw\Gv#zF$JU]֭P@&$RKf8@WR2lA%%D %p~F5=1MyA31HJ*8׭cB*#1}~_{gZ4 P2?ェcZ7T]G!N?ؾz>;0 ˑyݴp<xo1)Ĕ7r]y|z~´l4\?3=Sl~<#mӒRJc;.xyE !/ 3oO>_? gR7޾{7__NW|o1KAڗ}7'~5~xx@s|a x̐,<< as8/]PRێmn6wya<Zʈ%9Ǎ7o1Fu]+pm42o+dHGIFapI"aJ*ՁXS;Z1Bܺ7T"?}byZ.J2]WTӥvvɿO+[EHÈ֍bI73H|uvǸ?c[6RBgǷ~ F}@n-46ц+))x]ۙWl߀uAϠs`W_S"gTX=@e#Hipߓ{ o("RV4Md?cۑ~f 5:)q!fbU%J s\BTc1 o0}a HA^x66Z3`4`-!K'(ER њQrq;( E -*nYu@DZVJ->).$Y<9xH¡D IZ>.a^)R 7 &خ|8\!DXz=쫻!FY $(79}V_Z1T=\VERȱc,'[SѲŃm ֌L˙ZwXItJZg=-oD9%7!Q)Ç@Y(eFu=莸NuÞ[Ze0!"l+j[*H).ONdJKN+u,[:. gpN@jۀ,cba[!REV_R) f[MX"JB$UDv+t@0]M-$*)3%M#'E!m { w#),u3thmBRf La12"PʄR)$UQq.E+%wm[{w۶l{m1][~OM>}H5}myww-'tXF֧ 8|yRXVźy9OguKÏtZQ3Gg낗 7|yW?7_y<ۿ;>G?_[QM0X}5?%뼐;K7k>;O Ϗ4lO/(͠,/yi =Y$~D Drɭi?ZKF#8ئٍ{z>h )Hoް&swp^ˆZׅ%qZƁ:3 P;i3-3#(Xwdn,a Qj)d^QJӵ;݁7Bʴm@a7'$ZRJ m-'uOtmG=m#Bp1,H ;mdjbⲤO5jޝHX!/ɸ0 %VUʆ(a0/Kl5}k6ռ vii;d `ں_6GIwL 9_pO4c=>mU-MhKbaYέ=R%{1X7T5l4HۡH(%ME$)Tk4]HXcg7p|iF b2JԛzmcJ։z6UKIN 3P4 e^\I%n[J9b$ȰPڲ\ Rs׉VXϏ7ξt C'TӒbZ[ֲ RԢtB+UMЉr ԸBY>cY2"uUL~J)k<+]2mkj$dEȅB%$i&ڵ q: t"~ +umQcF*d7}U-Rʚ|~)R"#ST XU$T֤uRuؖZH ѡXoD@zM['3~4fD.dTCltFB I)쵩m&V!Pl#IIFJwZ ymBIZThYݮTI|2/HKD]'02&1Z;=`mrTRY1=B5̗gڢѲaEG3faL]BǍPk4>67WRϤXHAJ "= 1k=O5e1JUtm!IDIQX2ߏ+Ѧ/%XT4]C$jįD x)Z`C3b" dm1-ĉp}kz6\ڴLi Zut"Z9p _7IkD ;t/%g-eiLJ kkGR7i !,".7<-xlk QchU1>OɅ4oHa6(Bn0r!Ai0m58# R*yxS(O1 )-ubfՋeiWPMGX|R VppϿG+n;Jh1Pd",a9CiI6T_@%8eFM#;ye]j. )O_ )q?1 } m4|E=!?%~Dzy^f,<]XLJ#Oan 31$+!xJša^<>Gx}|F%HB\@kC0EƲMg~/֟0~{ϧ?7?c|{w>.a||H^$0MWavLۂR(ml2A+7-q6 4s7_Rq]c?rxd/|\.4R#LWJ.km[r^''+ݮz^./4J\ <144aԊ@ȑmhH?4m=u"9ϻށy4cwwb]<1 =2э;LbږD.Jh[fx@+@AKI%&ѕM&h1_Q B-X21F@L+O0Ķ%W,dnZtalCL/2]RbFZƓF\Wƾ#4 xn4=tP)#FA׌[vY+W1#G1 518woH)"e=`z.&elԷs6:41c^h;2s}}W7k n/ Yf魭)9cUa]!KӈH0{P=" ML[D#y 9JxDAYBtf8R<~qSXPm5[\imKuq6jжC=Dj'L-C7&Ύ؇q ~o3)T7Tו>В"%?80gXk姫}fr3t8)cmDҍ,KPdB n(K_1c%=(یІmD6m%ji F:klz@ P%`KNm4m(qAɆfU"H=R*F*z-0kG%:0Rv0@2(ˌ4SB :%( Ҋybۡ1bdu_Vz3_Hrsx愈hio PsuGRlneЫH}X]QTT;"xi0Ra=:M0ZFmխخQT#vITW(H %IAJԱK|Ee@׵Xm@(JC5ֶ8}PhV .G/8ܿ[Yu)4-_NmFM%gOR7D|S.N(]z|dNt#]nk5AJk('bu =: gFT CFBe"nbn,Ȕ+c(_J"eQ"P%&w+YWhXgtHJ4〔u@D;qB)2w xlӵlC-2/Pu[ UB"v;kk_WRq+ٚGDg0ǘJYf_7BiH ZT%/Ϩ +R& rhMHRfG+c 23H}W[J)]:!6Okj|vl5GLcF6O %D@\Lיi[:-LX ia%t%ֲ򰻧z\HH'p|Gf,hSQ). 2JY^۳5I~!1G.БBێ, "Ix cKrTIJذ͈Rݍ5 *'nfr"Y(|%ur} Y \~xO7LیjѦҥw~1mDȹK#ic4.-0]IRH!Ѷ-Kp0Ϝ_^*q՜ (-Z+|dzuQQi:na#vayv<e XF'n)xYR[jAiԒu4G1~CLT̯6?1GldG$EȾr}jͶd1`=Bxzw^KS-!pר)˕a@8Fr)nhr(MMkX B= Q(e)~#D?(PJ׉R21Z1[)EX7@Zgh .[N0T}û "aݐ(ke{m{(2$D#e(Gv0akE!$b=S_HbH-B"AYK,MgH{Rd"FДEfMe`nlQaHi"n64U5 ivSw-7"ŚRXƄ*U TdT%"bwl 8Tn7v[@-2"0`\p-yo,qtȥbƙri"ShGWHa$H)-JPV,Nm Jk_ÜP.۽)$/ 1_vRrt{vW)esI1J߷dBJld F.5t@L ~]ٝ9zѤH1"]ǚ0NT)5D/obL#t@&Ȣb޾i!u"!\aݐځĔ0s:P={gs5RHqPΐBLu(e[dXgYOTWHE6}س3(tC^ Q.5ן CI7P _^}cQK6D_"CÁSdFĹЦj[dVg+,qxhV TGC+۴ލ-rWDjv=rb^s@Y+X Zsp&E9HZl!;6b Q W?&׊_TD%&rei 4[ӶaK9=Y4evօo>~֚¶rz3l*?ćo޳w6AJye b^qCGz_~'Da왗e]XCuqcW_gtT->3o?JFJzaĔٮ38z838N<=K8>~joY~'h iM˄lS*x</ak2=çHQ+/-ؾcӶ} 6roti(T(^R$1g֌>?!Q|3X0`:_4oDXۊHu\7{Xz o*j*zm)!2&?Q.MCv/Ohӑ.Wv:f~atOLG<75=PRdduEVp<)\^Z>p)P2Fi\rh>jSR!2JJP Noߢ`jOpw\o/5JȶԘɹrPBNnO3ӗtzlk"c< ;"Sۄd'AJJ( }43&(Ypx86F,(uC*~Y|!ڐc$0`?O'H"XRlwcMȅ"F#dZ:KU冮:2Vv( uoEJml Z*i<G%x )͔*uD"gASFdj%!%BI zUs{zd;6"NPH֗2<|MI /Ը6nڥD| Űt~ Rw Y bHXhBJTxCa)!a#RA]np9^[QS_VY)#`5(NtХ3t #%NamEmݡDiDݟ;S;IGQPBI4`L+\w)ZRn=r.yY}L7eEQ$Q[D榩u{(dȾu}0m[X3ڶy+ZEF7F *$|m%)FHa n7МϏ^#.WReBHFZ^ _V,LFҶ11^SHEnwlnFz ~#t-< dM\=Vjf" l*bj ͵ #P@Vɴ pgmnQ Tm^ d\HiG$P#ZY7hi0#԰9KNYl&U=JwAho`ĸ_ diJaΘI!mF*iڥaYB)90lۢQ q!Atmag 3rpm yC,M.L? *jDLQwHĦi;#d@o5np]Y%J冐ỏ?{a=uG {\B)(Q?׉o}y]w,vF` Ą{.ww+2cL?8^fb*\Ml˼-[+0#OOcƑ"̜W?ˏ }G'N'lV=&! w2ၨ=>~ 7i^>|g߳\_b_ A2?/39-cdGJ- |px8ua@Zy2w'>ysZƯ>0=PC7~[tȒ7iW|z mKr>(-o~4| ˶"/RX^L%4yl2v$rᲤ?k+‡w.m?y-$vU3ܦmn~{~?0=o=_/;~79ө=xCZ= r&/ K,)T\VTc0ʑr*؟^SX9؇HQDI*B,[`?d]^_.hBft;¼%1b#r7 @OZQ֕0?0]R`kC\[lYVRJ#ECnVRX-A'bwnGD :RM|]V6c܀ُqDWWhiCPGHQ" EzвmhQlˊ]o8G) g\Zk`Y# 1RRl>@F ڸf :Jݨ1 *Td(QQCFm%jBX"YhSCD 1w"TBkն=P CWR(Mۢ(Ȃp=B2MHii26й5yeBxdК\d#]?WHwduprvjQN8pɯmF GrfxךCL^ѣ`9e$TmƑVjET+-# lNɴF+#v % &2{6 jX_fD}Ȭ̓S CCdL6gԍ WD^!35Wx1# g-m7=3%g.~Grzx.?ڀ|R曏LۊwGP!)o"Fb*# k$./ޒcFIo*YqPE;Craj0QE u/{rhk/j[9i0 ͌Z3Rg[W]jڄRH~Ss@Z#R)A4QLJ%)H̱VDv$@{KRHځ1=xU9Qbř91C#Zv AF%DJ!fK)PsFKZy[m-Q3Mnn@}I)׍ r'yNRp#Flc"[alX(zRCE+[GM$#a\YRRQi5`]T z- qHĦwbhI+Ⱦs0=[dp*y+)_X繡-U߶9I\9 eo7=TKA(oI ݐ/Ocv;MG( NT攑Ҡ sE7m G`vqm姹.ˇityj=wZO@ ̩EbE $M]ܿ;n um-vaFq;̷4drF˄**5F+| 5 v]GAn; ;l%"dTeNoIuơ bWl˺PRn2Հг+#J(Fϟ>q8QL7_ny[^P݀;YWFg.%yL?◹uM o"|"vxNW& ^i9}B~ySB nμ9=Ͽᆬ"Ӂyy݇ 7h^>\[oc?-mܻ~D#8n9`w)gToE0rI9$iw_,+tX WG^߽޶KFp<# WgvCv o?z]@0/XI)3 ]דEq7Rr 5a:|qv+bX/ Pxt點-S pH8km {d5wtK7T,h[B7rv=;l~!J=Z $&9a%ƀ$#A'Ș:M u]6~7|A^8_㈨:p%L,og9QEuC9Cm*Jaijьͥ(DFJcRf>LԪ@+1vYFn@ V^n k¹7**%'eb75]Hұ߿;=PC U$jͫ !jKBnxBk6Tђ=T~P[I8) *qK N!JQFȞ2S!eՎ*a̺]&޽60v3 +t %&ӆX3J4\K% \X(  kD'Ctx)%Sr)c- E*1Vto["gbLݎP~^P(Hqm-FvP )RU~EɁ,%ҷ2S G"&5JP(% X!ml~uCcrg6эF *U. \@UXZU]D?CꎼzJ@77:ȞAiG+Չumgr*F[>|l!\Z K,U5푥No#%A7XLT"* #9"E| iYϏ-P3{K$1Һ_xx#)e(W4b9m( U6O CWrP,B冮d +ՎX ŷ{)^RhnG \3Yڞ93} !U#4:ж>ZI2 FLB@u=hڽۡkےP MG{DLĺ۵O΁,Re\TxX@8J1JuG(WҶ42ЄKbbTcG[A|(H}=e)91nq'$amԞ"4HHo0d\([F,Fr#vH0D$Z(^a}w+v-dj{J$2GJ7`^qʒjC~ZZjȔ!bJtnqaHvwQ HW}#Fc@[t?vq1; %HkBShmAv]_}p3 񶴵@w;4trkCQ45nE7\g7r56unRY #;j۝\@ny?ώ>-TՈH?4IJ!1V2#kCZQhˌUO*tΑjL+޾eRJmdy낔mj i_~~hٍ;2F~_?" ?O_B2/+;^>}fk?k>~Ϧ3O} 3ׯYd!\&DobhO_p\PXȗ1h0 y>͟ OT^0 Ǐ1pybXkJȷ߼es=wo)Sb$ʾ{χ7)q:9434_|bGۍZ+TOL®Z0\%SB~ǧDMmȾNԲ1w31xt-ѻW-lH+!mĊt{CH*2G2c dOY>UAw%+dY2!x]`x+Wo渧3>0t;;Ek{XށH5 !UZ;Rhbaئ3jI>ѽ:"K&EO m*o%a# K->Ĭ5SSfc:|hޘb~놦Fl XP8L!900\o4p\&THK UA:?Æ͊Yԥ9R(۶S]:-Ԙw< [d fyF3Q GJLԨ ԰fp $t`2Hae #O*b%=%6x<&" h0h0! ,%WδK};U(um/2!z0A Jى !*v!R&Er P֝zsnI*QTP 5\;r-dC>WS \7RTHHk)-H)xTlHвCyC 0H;6O+ѓr;Hy_aAHL-S z8AB t(gd 8;BMb$:QöyZ%dAN;8--1#)6=%n׷׮2hmFSJ)( >]܁[G$|F7$v*PĝZRAX${멢$UvXU* =K?rO ^AU 5m:E<"T:R!نd!~~&JQņB^h#iNR"zp ް9De] kTb*z\~C\V vo&aL a8}עi]E׳\ӌѮԋ5au򈰦Є2H1BYذH].Y]=I,1E!a2$OyAs&0mۆy!̀Y CNY pH<l*{%-{//8PsI͛&uӆ:}7L)p}|1nE?>" zۺF7_}ϑmn&9=˶mF o>oǫwoxZΤttpƁ-HۼB.,!n Zۍ%u<-3;qC~d^7| Xky}<5鷪T)8#iK\q }O rn 7 o^?ݱ),. ?wI F9Lw //8voʐ+0#7H;LB֌ n!+"H~5 (k!۽%Ů);lv}%OuZFt(&Js[G~J{JHm2Yr""~Zvzm1M-ֶÞgl1T4d ax8P&Dwt >S ]@Τ&&>,'R 4 @ H!4εBqTq/k=;j4!="9m?4D.Ilg)ukB Eqm❣G=QC+Oo JY\,/֕ ~,%n'\5~RM\&>FPR9rG\MB&}L"ߐg1@͒j3hIFL/ԜƢdh/q(ȥ00atBE5%T=*F` \v%- ma'BTSJ-`l:4ih4l2R*ֺ5ӊYH)<=RjE鎚*$r*T`gnXV,Z*(j-JR%Fj)zkہ!k9y# ;$~J"֛*ɷsP2Ji[P !D`(AҦ"B1RriN!ض (3P$HU[WEU*lhc1#׌)U R ֒LUX2 DrN i1[&63߰<.G?6ߍH()RmGPk-Iޝ8VasVE,/_ R$Uո[F7 ]G=sDEKAs]8>c 1?}۶״4R6ct`HR* +:'9Dq(@LN Н^au(\ڱL 5WLדKo9f8|Zbj9~!*䄨,yFcdw;5 vlD]%W) ]%b- 5 BrWJkPHעJUOb;E`nq414iFhB*ܾ8B=. Q%BwT)[wT8lTvzI4O97O1ݛT]Z F%  !Ab! [@6lP3+gdq,bn9=d1hU5s^'Hn?g9/, @N"sY7_}, 94߼>}Bݛ'ifn򼡋H.̶ݡ&+ƙz.+]M!2-֐>&̞uix= 瑻=?=qUO]$ݲ=1_9O/QHS#u:7s&\NAjR.4P- "E)S! QaVd׳# N\$R~ HBcDk4΀H,Sue}ЕHX7vk؊g=7-qY+F`5c홦%3D2za{@h%5~Z)"+| {rHض|$.m)B`% kNFQf&Z%ZbE+M+ɺ>D(#[bm5%ͤRƑbD++R*ď}mфm,+iDun%r!?%\\'.'i*z0Fn@uJ[qKҠ}iQOS_NT(\W.1ni!gv_?C´M*Q)VHAJlc-IJ|!*CUTd NKN ,!Ւ8_(yCہҴ0ھLJ*%$JC)5^$K"4* Za#@1XMJJ!D ! c#&)o;6۵*.GJWd)!r"2䠈[&^/zWHiHRPm[sԒ8OAXףN41#UDBJbZʢl[*)3 V YI5떰RPܴ5o ~+:șu iɶءGE9#:[c"O$)laA(w+s7V ndHL8t8i07@AB`}ym kC;JL'B$aנyTJH7`$%HT\RcjbJxҚ5l{G۳l^PUdи]%Xy( CgӈJ\:OJ"q3VvU-!T-0Z# DVg\״$s/@`L-1H.8daкA;<^0ݎL9EpA>< 2VR ΠmS#~#M3A64CO%ap(Ǘ I@֜ -`PTwkXEdCO,1`B>"m\!/]qYjKkYIQcˆwl 珐%n}>H7:됦AvFhB"V4^njjs#f o k<ʧI cePR̬{J!DL T)05밲H(9˟CuC5_X׍u<_G\2v\36ii^m:uػmyyy?Sxyz3}נ27ӌ҆-%Q_w=˕6t]Ǐ/_89JCӐ|_۷\??Kf +C7PZz划ǧ7Ngs<˚9%0 tCtk+|`|7s4;N#FjNX#݁q镥}cda3.ɣvecf'@IanHV6:r0"z=CLͰCh]zMG"t*ǔJPb'ަQbI.l+)$阾=ǵƶ$> B\PV6ȢwQKڐs8RFIVնH228M1J%j[[I4]G=!KQQ9xrQZBk2cr ϯH;#(5Юv,"I w2=’ Eܮ4w0LVj {H!5JɢwudVla}V34S1Ѱ&|[H˅)u[) z+1 tsaBH}zScTdp:<<'>=fu!Mc|x<iwдSB! ϶*l4Xv<a#YGf# F;l_UG-RM`lCk(mw?[mokmxvu#R iSi^,LX3әDDFx߲i8Ǐ/?\'u󌖺e v\dSx7_7O|w<{ ~ ~Gru^xx#$t7JZ=__~˅tHq:l}#DϺm8{}c=drz~;1]ӿG>RZ_10WǏ}an[ۮ\.tPHp^ƠagJB;}}|#oۼp}=34)%^.'~2^)123n5#FZ具Oo؂gJWt=țo)Ct2^PR=?o?>:ӂk,fױ-B*,*j=%ebXmY9 up;1N#i1 #B;RZHZ1~lƐ}G\V8Ct(tTՋo5TT<* 1 !.#XSئ mLX6)%R5,s-P9drJ_PBs݌mX9>0WJ8cFl-"rA+`)ߨ[>DLcR@θnG*Sc`FD`=aaL^rbH^VA*bD?iĔ%B_+8Jz౮EP'1P|B;?<_?|`[sRVo) ovR5`4nRL"`T_-Jԋ֤BkLӈk!S خYEev2].ϟyz9yr=9z*zېDep(ruiB.ղmiuJJȧj^)rCmKe)EPJDڝĶyu9ET5'KQ?T(iCZ[]-`&h%Fެ_B8a(mэM4b!K6FZZA Œ=בL./vM<]ÞfZ7v~mdF*% n@lvhnC T79c]@NHs#\DeC H G4]V^WnUjBRRdb|ciDJ(+" Xc9 E.g K]*(T#B:RLW{w7o:CX3?IwRT[r-(C k> .oD/y6tbXÆ_qldy? R:R32|x| xOuDQpp+_1gNO ]2b$k7 yb^g~oi/?#gJ?^Wꓴ^rr;X=Ӳ`?s;¸.q&7$Eb:_ض#)FbuzlSDJz-J usqx{_?l8O8/#޽/4mCT㛷d`'/xV Mד;tL¾I39À8u-q$TUfݶ-1/ 1AI7t,!Cxna^k]kݐ%g TeY(6, g-67mJ J_" 4)XL MI%3d\ GRx?MGHu+]VOkZڶCiMɩ~1E$ÆKuR x%3֍V5ĶM#a])ƖeRJA4?/״5FP$0@*Ú"?vґHZ=SWR)(ӂeR픴@+8ݎb ~EBAHDXU)#>#)Y D]m WϲHD"e$7y-Tտ*Ex)Ii{m.ʶ !sdb[]GY=as9PCOCZ/? ^~C) r">lq?|'])TwVuOp/ڿS?#nݤw]nCC@˕H!$She kx/]kqe4q^δ%\ Oÿ-!Pu/Ǜ\!1FbR |y9sz=?O?a'5o ʇ_nW"ieCGYկx=Rw|EH6K8][3[/캎7oO!vrˑ`S ȴLXmp\7Tx~~QD۷\o$) ӑu\+wÎ$ _xzxd | /h~|A}J.?_3ό+3V<=9򲱆n{-5X݁T2jlof)Xq^\t"gx9xzxk]ִ(pȺVϾT QQ~##xx ?k,ep@ ھ2me?װ\ilw+)-qp ;nӊ$JZ-?;<0-vH HU)&Rh!(a? mS3ƑC5Uc@AE1 첢߽Ň!F,R㳢ߨ¤HIDM_86RoovJˏuD)Ͷ҈YSCטIy JRVTJ,Ơluk˂H Q-:^ד }*i >FXGjYtHra)psDY[JqQnZsN'TunD4 g{6)/?Em5vH y\_Ra+p!G?/sg[q^i8<~mˈnvHH#~cыOk~0WǍi1]{MU*Jj6ŌҊ )~{O{WYݶ+0g^_H9cYM"K,Ҵ0;ș Y3wlgkI+aB;vxY~7^L]3 ;΢{ϟٟq|yÇ5X_h_?]D1^֕-+[*d`p1V$nPMϼv3t/HVp"]:-Q$Tp@J !sEaliø0.BY覥߱G0}u SR.H3n\s; ZN~`@FbºQ# aPЕURd[M^-srBa9,h T=P+gH)h=B rʸݎtX#kϾbAkú J'JXcD : 2QdV05(F MA[.Z72hH~؈o$FuB1Adt-aVk(7vP2~M!caGHD$B1iƨ¶ PBQJJ+kFh$ tD<*YT*)r-T "m Rf} |fF,uchlZnZĴQJa*#3#u{U)Z!E,(TT$oR~4ĭBb۞,&H׈/,$EE~7 ,nu݀n|XkpM[l4!2tJ8SR"tmFHv`G\Y,$fZl+ &u0}4m΂(iځo4nG Ͽwl)l+Zi@kN#JhX.iRl>2]+f7Hc73/׿S Iǵ-5L(~דS{_wi{iwodyz>TcY54>}A+ɇoF"m0^?=־E.q]y9q ss^iHVo4Nmg-#hLxvqaJ/GykGϲ-LӅ/FY#9eC1]Gt㘎gˑin*}7gc^F_珟\ 6m aZxP@ll,GJRWjY4uBnD$Q{'(O6WYR,e[*>ӆRGNhh:"+vĔ BüԞu(>Rݽl,dAzs^i5MZ;EĞ)d9uNBB%MK !,Hx ~¥N`a@Km 2;2ܹwDugS丢J!#vhg4li~$B#""hSY֑ZLd{=n"39SswF9*81ސ"TU{f:*bIH008ܽ#\ͽhJOO =PA&_c ,9?Lth j@Y {O4=Wda1ZEJq=^T%FҰt6GJخ:K'h*X糐^B'b~B &?YuMh+"jfɕLZI[3\w +3@[R(hilJBQ _0)E y!݄2^)o0hA_ R=5BY-RW+xFSw4 JYb^d~$ZEuT Zh:_ȭ2Nܳ*0 qy5EFzj%WGFmR]|>RQ `,ŀS*. oԢ)ߎlsWPeɰ,M|Hh]dRRUF;xr@n (E2-4KFL%;oIDc"#wP[%1ӓ1 q( yf XILR+CߑuyEC#Jl2'~Oz\Zby71l&vc-8=m-t9%+F&^h"%=8&C mawG[~D_/=WnE`Z7I~R0l=|'֗ n܃Өɖ$tEdD8ge^0Ȁ8.(Y;Q=9j~76jv E./ȗ*e{B= Ķ#vj ;` -.VDn~z7tcF+#XuR-l2r+*fNk8t[G~㇟Yρ˚J7#iwme=ό|:P-w4Is@k~5Ⲋ]\L 9qY˾0؞7o_8s=k Tn?<0XO 4W:Ο_կw!%AYߎQjaYP,!^Ƒ縲+*ΗmOZs<3[CM(d/~n"?rKzPMX]=n`:F?rLfZ^DbذEBa B Y/D6N;X|?ZI3qFMS$e='lp;j76R"=qy :Cxsw7IYJV+giϺ=%e$S]FW!d(:(rᎮq]O?N+%DH N3 ㄥq>7hh kwr=t^-4&'Tm3q1aT49&EnU)&,ewH!BNs~`S|0H5rCS37n꿰J!m3~. 'nGo:$k ]#4In:ZmT4H䣛&pPsr9ݢ@dӌFT() h,q3(rȠ-q9gv7a8_6|KF6v^/ M k4a(PˆV/(«i Aفq]rc0䲑 Y6Ц FSeY0)^^j.Zbl'ͦ@9jh'Z%*հ mZAZW1XKJI ;N,3(˚Sk0N,*m0͠(UH[*npp{t ԔeZy{Fh*Ό(]@Ӡ¶.cH?C#,$FvVvhV]OPjFLg\j#4YC1 (SwOaX{aT9ZkPТD N[U˲Raww'NYTtf\/mc\XnƍY8^_9 "E|H%%tme%߬ċ\vcl|]H)t\̴"O'JBSɅ:w ;М(#ǕV!˘@?\7r&V%JFMTbBWcAy{&P L D\\4*#U Zt.~nLMH tcD#ĀV&Q:ҏ'Wlе.T*nP'-,=RInj.:9J-'o8yz;cEX2\:Mב׈=yKLHઢMhnnnx~{-Y+cg=)pIqW>?bs{{3:0Q#~~ Tʼ<?ȇ'2T`+&&;gRJc>}@6jZp/ǑawO k"xX:8^.P w޳Nt}zTi]i)c;r:; G^mLynno'hqض먭b;û?'Q1(#)$eYȩկ)RZ+~x|y曇(x szQJci?qy;Tyf?L/w t%eJ3Y)uR&^)1t0{e[7yaqʴzmuȯcJ|m&+ _҆ex  ㏜#3NyB M޾@\W\S4ݲ춮P @UC;o(7ZV &H =a4aiΠAʴ;JƚH״iEk-i 5,3$R(m8=w#vARmpqM{r{oO_}-oeF9c=̎$m JJr,WAPءCz>_߽7(R*1lWr/f,ՠ녎$X^z9KvhS@mgecwqf tO 3&T2{e5(b4rtC'i(BtYj-"J\0ջe{ہF{/eף|GCmh]'H% CZaR@*$"%dkyCօNr0(@Ur ߏX۵-#\1BXN=%f9ԘΈI{7BٞZ H7l;Rcَl+ "J3@?#L5鞦Ե4I$Iq,箓zeICKKIY9DRt>> exBjH'`ŊJ&'m{rdLJG:cI$eIrڍPUF[h8?\3N h9bUs4mQ$3$U{`jbK A3%D5"f&ׄrH4&GBZ M7t4J\ZܳQJ?P[DoJVB]J$d'9 I[Yi?hVc I%V4/3ئVH9J"nHE)ZI)dJZ)Pʠmդ蝡 Bʴ9];|UXe{5oߡsl7%9zD*1nZO(0z $W4BZ(#}S 9$i"(7-*{K HlvG07wpiw#|T@wlRJ%j F[ܸķ(ˊ0r DUl7ΊfQ {Y6֣>^ ]F*uHoQ!vAA[.n4Q3nCwJfYf~y#,GQwK:nq^JStG/n%(Vк#Do*MIg A'Ʋnu?!ƚ,\蜥oooLEަfYW|1%γ$HRXRq~LoMk,ˌWn7p||bs_t1CG~|ۛn^VhIo0}|r~[Bp3??||?R?#~c>|O- 6s\xFI_YNTxccϗ/|n9˼<7xÁsa"N[^ɴ۝|:ljZ!lH#ݞm ә>~‚Z#7^gv }&R;r-mϱ 77 1sXtÍ//9d= w|x3)DQl;b)a#u Dz^a(sh/!BG8-8mEk-r<_L*"]y|ڈmōwۉV ;Enאj-#+w5*)heAwv ?uZiUwz$S-I"׈iOMJd4M4m09TIJ ˖E5rHAB%1nYB3ûO◿EiᔗBeX0MQic]6:?`Fw(;!Ѓn"Rb]g~1t)8Pኤn"Qu1SQД"يDiP)bw&%IPJk A0BDM=iRu~QZ%m F7:gH929IV8a]GԆԒQ ijA4e>Z58SN0FX (C(0yҖj!N ZeZ)<v=5䨥`A.5Q2lAJCuNJBlOe%Zq ӴȭQg9_CJAS V%OڲؓixvRh%)79pqHHgkx?@kן0բ;%>1[9\\/g\ =y:%ǀD|J{jΤ]q+N[5bhJ"Wme,Oa'VHqeܿ DlPY `ûyvS`fj7uBΓF3RJ# v5'J2`QWaW9 B+E> Vm4qt_7Z١JST`sTF4BMcx$bCD+J _?lޑ//b4)-ޓS"icΓ+ZQPcd98zz^7P(Սj#m+4R^)DQo0510VqO(ԿF"n\z &aGr[!-Մ ~{B  r`tɕvAJ49 w U.Eqb%o9!4~-X΋Z:ggwO0dQ9F sHLY6(Z u۠55c'WԂZ+)g?} l\Z7!L9]8O, ;.a}=޿'|0Ď>~U<9a˙2hq'l9vǁWM"J3 ]w<1Rf805/)MZ~#u_'Z).όÈG RQ[v~Ga8I$ϻNl! E`;E^#]kD05/g_`;ȪPn(1b8A"e< bvdv2`&U*newB)+/]',es G:8hp)$BXnؒ|7unZcu 5a]軁ar=U)kW1.!Ꮈ-(w;Ji"/)[n$Ԫ1 ίo}d^O7H5 81@>PSBQ.Bƪc0()$$!%Vrd5sv5ȤJ- =۲bٴ[sXp.JGbίXk׀n/c+1Ym4[rAJY"J f:e0a=yMP5~'>YD\em3z0 l@2H)bLa<{-."pt~GՕRWښɵ܈>XfKba &:o)TɤVZ wh0fQ;@MA:к-@'Tʠ+)(TSl3Y ϴH`C sPi#AA,vR<\0U(+EYNh3z[`c};O;fqC;:HRD"lR<7cg_]G\*ɖB!R ơKH {4MDgMPZVCX720;Qh;Z&ړ*d8tg]lnpHZezGSe s 2Ue5viFQbb90yO  ?hXTT$2'L 4zGԿ)km;&GQn`5qxOۆ6eݨFQc8ũb)!/nLMdb)[p=@[M OCh|ZqTՅ ڋ<_VP'm4)wj)Α\D~Tc'g*fHښ9Hz'JNe. L7doQ(B?`elT|w?Sqb FӰpN8tNRDra,~-3"%4Po s jD BE4R1;ðf@V2X7H"2]%M;N_=M6&I[v%ϬҮ[0Vq>Mk??"߀I+0 ˲w[ya7Xc6O'PFX6q x;rH,HRVDyG8C晼wfy= #1*~g= >g[/Eze0=AxB[?q.3sVGyy+wwwl2lzy= i/vt*-̇Nq%.ܽgm;|oaۑq7R$W_}~LD9 [^>?2t{~#,En7|O#foOOo91xW< FCFvd)=e }W޽Ou|r0у Xօ*y|fcQkXוqewsV氱;rM1uY)mW)9JiH,,=ZTu;bܘK$''vVirJsƉ6&?QZ &RIezn'LN^?|DkVI-c".+}u쮑(Gʆ|(Z5zK؃^[tg(5;ra}{גgRju=XҺ1(Wir>zвnc 5cJƗHE:1Z,8RU(a41er|}wlD³17^uZ~U1N;8P[KhCUVO԰SєeF w~$G|h%YąJqGASҌN Rhk}6,-IHY)Ъ*8^(Ѫ|in~v:?-+%+lQsB j(e UγxEMa=%u{,U}{%r t3ؖ7 k! x^MZ(Uj5pt|e:_.N]c 8R-"d,P*&'^ˊGQץAGbԴPa^O Èjc\G 7jӲe0b4F)Z [93׭Dk zgc%rkߢT2F{Z8ga ]jʘV) G`­Eͫ<&nǏ&~(E.]/5Ji_ 6WZ aK(T9(-0ɿfrI)QƢK0ZnWrX14 &0SreݯJS.Oj0nN"^)iF(.7J)AU0ଣfRbqbprΣ!lVi2w#(Bk [IxmF [Toru3}{c?Ng ۑ=1;^GOoe(^ߞ<>?ay򼱬+[.'=i8y09.FŹ؏| }͜WWr;y;9,ϛÞ%&YgsY1mlN fb F1_.XmJ=7w˙-2Nl^_Qzڊ\o?HTE)G3VȄXG;r)Pd;q-g6VVRV*~9+d-uOFSZF?Mݨ5㬁"[xߍԘ@M9ɷ 1-^ԝA#O  7! Yn34,E%n$cd: o*FJE&'Hj#$ΦR(%!0SߎxVnx'!g4u5ьA <-gyE΍ۆqV(PSuH-[e)ְaEVٹQ{G y*IbڢuC+#]+i9idME m(B ; } [BxGXbiC5EPBY67P[Bg01_=(,оh\iaV9I(pnp7g'T2VRVm#i>9w^ 쵲G+"gqa%c["^~rai NRJ8]›"yQEbjJF[BB3Σ'A6ٜR C 3)vDqNCw'cPU!$ӵ<;)10R/PJRjt24 mE9vU|󛟞qBoxut9c/aM^BJ8Oy?}bx2/\/ҐwOd8R9O?͇uE Z1VZ+?ӕR*<d߳3ÑeZH9z\$Dwrl5ޞOg6Logv[ XħWz{y_!4s?m۸Nn>xWuwyiKʙ'1m36Q:,s;Ls1v#۶| ZNS;?nȶ^NX'#GvgavK7_䒉)k P#5%xUgƑyR+~3ZcCUHBPBX%QVbGQZ=eZD 4;Rux}s,> Dc; i,>Lǁ1Eѽ%I"z9} CC0ٵU(%ggD-~f&tU%-900Kѓ1[?xdӍbeC+fᣢLoX3ål%/WT)- 35fj֍Tap=7\ίT1D Iu['+ROrET? JSb!UnM54MW-7HC "l:e@PB^'ݞ$PCI v{vj7ZPJf*#+Dm"MۺQX,Y3֌"hwLuBJ&\B5u A :u87ȸb#5_s@0UmDihp)d1] m㖧.3F6Y=HQ[AJJTA0V q+ 2"`oC\Qf^pAiZm2ޱݞ R(I [+pۚu#J溝qZa!fSV#e= C9m6s;<_qm)BYyg߰3#[1_W߰aG}F+q ZKdZi{وvܑ jwO\.EaB76Y$fbaoC-vTJA#"e4-m({R-tzc4h@JRq'1q95tv牜ݑ Gٲ-Fs8ӱrW/tx(y쩾B| f!U[oyy}E X7jxhE=;+L2a?Fv(+BmwSkB`!/9 JDfPInT2%:J<@-5t@in<@ji:7Њ& 17Oo9 Ki%.2sd0_Z|1{ЮeS"Rp]&vZ>!]>?F3bz2};)mc6+_0dl849]XCGDZ(Q4$+*):.R B!eKY𾡣&o3EoD?z]Xׅ{L瘯S; 5L+I*3ݎ붰=f>ubp Y:{\F1- %T~w|9mǜ~o>?zd&:3=?xhCp˲po?3?v|=W㮧&tk$l˕_Eǭ=I/Q"\ Ɓ7BOu;޶aϧԆZpy}؆>2 aM>7nh˲1M< ̻޸ٖ%9WxߑKo~x`"M3x9!s("׸1׶1,`(0'v&/T0J<11s۶dRz93])*):-HCs Q /~o[B솁1Jbz=~%>%.ӅFƶ\Z?J]I,Q= Je]PÞhq'%ZocVe( C3 !Ga.\Z0FSF(ў9lB HBC^t?RhVh%h(T#mRJD91 #a[T# M#RFԂۂGVt9S݄5 pze9~"OA`sqGI3)$ux=KjȡўRfYȅiRhmHY)k3f b,05%m:N7;w+1#X DY>R IKOXnH!DK>!kSuEI0Rdf2:̮S#HX0"˺Rv (zw WVdm0#B8А3v7JnXיyqQKBu@TvtzOgHJ J+@. "eRq=>,A,D "DmvqQ!G3YP"Š5YSJ[T#c\:!a+z&`v;!x)pz搠tfB %='D߃,ˉzFP 8Slż }wPL^݈{z¨]oDFaxLOrt9?=L(:Q4|Aj0pvXZ*IM 8cL#)C&-'C* \f_׊znzp;خTXb`N 8eeYVRXݲ//o_^1F3Ot#5Wuh6Sȼ |R oϯwV3^aOJD6_#)5ۣ'y:<깔2q-Ht<>)1!4<rz~减?g߳C3޽/s>g3]a 7ZHqcض呻/_q}@D(7~L*I9#ھF)kי˴nZR>23~<}|ǼL*43F_;Њ+c?0F^!|L,Ⱥ5(ۉmm{#at>nq4,  !o_4}-Xe!*?Mјn`=\/W3X+w9N+R"$FFnJ!!8{|Uw]BTӢC5#˶yҊhj`j%Ib&NJrգw=}5m*sv(~L5Q/QjƗ@Cw#ϾWN^J֑B܍d#$ϼ@mPGjH}дTu,Yޜ 6XL%m3IhxOg4PRle)c%o'D#fG'u#qm g,}C$~9Jm퐢Ӎ>U*L]  U#10Jl:>Bki *e 7rP 3<`k="6CVM~) /uR5Vkrh-?bmb$b]f_ 9l˯u$Ve[iEH{7'kmۚ_+ aiu|m1G[N\$+э;R c6Jyz% q=nGo͏@4= Ln{]G. ]+B- z=os3%끰yvcQ[GI4? %^ ەi Є5m:c;E<{r,i&x`UPnQʶhmXGF Bя{%}o^%Z {mQԭJLn@JH\mr.t]$hI˕I@ HۑvC* b tVVo2P`%hSs$Fr #74%PR!ebh~Ra[V6R7Tu^?ζ3qQQ+Ͽm5l?6" Yqh~0 z3)䜰u)Q'{t&\ JT1y0oܰTuˠ:QӄvPmsLE7N! B[dE\p;FG/Qb$znD714\՘F y:c~S+sEԆT7ө5Dx dn47ڐ-mV3x.>f6 )P}ĈU+SXIO֑/(U1fYNĸb@֫AkJa[fA6AYQ`  1riy߃V9%SA9"2|s2iPR2prwOQ:gx+'~'̻'ua\Qkјݞ·>K ZqcCO ֺOWT0zA2yf3BQj@ek-2z?%/7vR;8~zʯ>l,ķ?ݞ2=ϯϼx =/Џyf-8r^gR?RL ˕?p]zȢjޟĶv,sp=>'oy9PkI<{~Ƒw>Oy^FkSZ#bE<w,}`G^^s=aem8m٦iBW~xd&J)g}|f8Iv_@w?C6 ɿO o&-+ܿHon@x@{I5%Lpf䜧M6t-Se<|O'HK5nE{+qZZ v׿% 9#9LEJB`]T%JX4J5[H1Xm\D[ (1|i[~!H/ HBߑkjY)qmeO l0> {_(Ja|jҤr}BTR)Hp2 sHݼB Hs]Q,H75LL7`&J^釆-&]* 놱"+amH H B3;ݣ Lt{ܜ-5V|cRSADBzs%$9 mW+5;QBLHz~3{bڰa(6ށ-.YDgSC G4=TiG'Dm.$9m(b(~n[HUR 5Zo",uj%Qa^WJ=k,JJ.3}29^` "ChͲ ]g(u9_9k'Ԍ+/t 8#kH(iw-F~3uZg0o]=X֕#?2M̧ nۏW?s;/g8P²T3^zv }zVOOϤ"˶rwL׉\ FkBL8aJƇ'xy~ߣS 2pgwa6|q8|GN վ95uYx+ À3//T4 Ӆ0|zETȹfG'j)ȺzR"+8݄mx=|P1FƱRJ{HZ c /_Ƒ׷V[J5Jk)$,i0n1DGgHuC~GQ>#p'VAQߍ%Lqxgq y%'O oߓB`k|Lߵr:G]\)om]ƉZ6k:ְFb"0#JJ1# p~~c9_?|ΑF)+XЎ"Я.3ύU_3 uemژVT $Ѡui@eڤBo<%er[} 2 ׍gYg2B Ӊp Tp4!+'U aK BdjEhU猑=(ī[ >LjW") 9F(hY%gr(e[,IvQ;J8@fU,J| _<8?"j( m#)8}&~dRp_"#Цv%$܌9Fvߢ+iQ**C~F)x*yo?:K7JNPe||! E4ꆨ۹v 0I=MB`V &JhPѭ\78R 9hC-n`:o+(lT4%%Iq8QRhTŹ!Z_ %Sr@H 2v̟~dC nO l5JI6s=!xPC4\"1m- R#%5nܓRb]AֵxLGO٦kK?g^'^W_av?U{.V|7O5^__G7oޓzZ{,׹u7RdV޽{\!N|84hX\#jȒ.oQvG(eIaAXQ5*rMjh7Bi<[t=kA%*yno;QcF#H[b551v\-]zF7Y]t;wޙyJ9ew+,W7A%Tp2HT"J(rQj4-1W:%!^_cؿ#+H ޯ8gA5X*Yq 륢j7!hR)aHI.5۳Viu )9uHѼ1G=7|Ȕȉv/G)Rj{&7Z7uJMh׵N4ϔZnY&҈1A.=d("ANqX7(PZU)MyRr@t FnĨ1CEѱѐnjR*y tJ#`,U 357uQ4]yWE)LC e]~i[mbD_)R%) ܮZ⧉nr;"L;!1L-S& %&r"܀RCh*Z#V( UOje[&bɔV*MFm6m&25b-ޕbr#َeZv%5DPxA5ed(g9!EѢ`,:jiR!uPƲ.|>Pn{;׷6X%Ԋ#m$_7"c) a<3J¶EѬg!Q)3uY!Du;eT(P"FJJYa*ZvC$v_=⹪]*:%l$Hr(c1!ql\3kyԔv(y3KiZĪFo&# ڟ|:qlh3Ugзyл@CT0 TE#RNS/ w"=L\Hˆ9n`:QHlӥQDԚ?|$o+aъ)`*n8YFp?xۀV+c?ko~4\.wwHo2\ZY|o@ROA4|/9.^N܏07yi0436B4]_2dODқw!T;dg':_~O;{twupx= R{^~ap}ǴlיR+[I</_ u6*+JXѷaM u-L)1,%V(BTIbˆ1~b BcE")@ F ʶ!K%-uz@i.U7Us&톻H1g7Pڡ%\\61a jNmC oێA&j}k{:5,SdG )j8)R v 8/"$D Fv#;J ТM=Pi[ٺj2D {VI,=Ed6#tCs"@Wkϱ Ԕ %!%mY%fCӭ?66oзDh]k'7{>!O盽!U#BK:XJ ]#X-r.(7 w p q]59{kHQBo{lgGERi0]O 9abs)e߈NuT*T0N'j C- HUE $ Zl[!$6SsF[/)A9j;@:–8@Ym9lXgC6tDږvWF8m&LgWDUt!i;Xi !gRjBռ݈ȴRA[(0lE kܐ@{T&,]Ҥrp-&Bt=Ti"Vx+߰ a>_Ю-QBI:Eld&?SlB(N=e$i-ðG90yIƍg$[MB-ߞ 9r\Т/ӏI%u8)xs׵Kuo@")uj.-RJkΌ]+ ETJz/_1U ەP@<" eZdfo,qz=AiQ@u]#GDy#uosXYe9#q:F^_O}T/_tA;u![ap`[z>tGO/_B\Rr aD9O?Hg[j8>bx>rT~ EU2s^/40L<|_n+|eFshwm3]=9382WRw#RFJMvނ_ӿv/,/?StT1waga@(Z"er-ķgL>Ϙ##b^1!2U)bu2v-o_>bLB@N mER)~#gpnJZJ7\nqL"aQg[e1gⶐrwϿ& Vd`8X}1?l Z0 G3Rdj(vhC))PEw"WB lJgLg[TlkDiZɽ=5dpO/,ޣ#*RjYIIF`LeٞE(M+ _h.^6 "Hn_εNa+s\>{lYD H%;D5m%{=BV[4 "BQ$Bͅ*FXRkBU2޿Y()vHWRk{G.t΢ Шn׺Ia& ODn? U+USĸyi,y@lm Ƕv~"n;'JRD&-"Gv-6tJ#,9gzh,% H3ۼRח(3H:#fIXf$-VsNR!dhmPقK.T$2Ej QBbhjDt=%öΡƎ 3´ QT jj*tv8%oӬq95Ҕm#ot!~PT9=JtqȊ_v"#kfCGJ' {b7BYŖ(5B.9mtnעa%Bwg\"3X e"V )AtdOFKEcnWa@;ym9ȩ FC* + xC&ݷI{TiPR+,JQ,cu|:;BUs"[fLl(S1B 2*of#̶& :B]&|żpxBR#!d*dAJ˶qC+CVV!ur~k%+zl7CHi)[`RӴ 4Ad"/it1dU[8zO?c@;X54bCt$ڦJp=&{Tiin"Ö PJGLHdߣknaҺYx5_~&wz-X9BIJWv"Dԅ t {n8 a &1~]، MMֆ@"?eDU)ӊ4 /s97FkFs^Z^T4nxy{93}Q$OOOFuءƇYWʲ1޳]0ְLSIHΑ32q4cRLuj<eBn%Oh.=/'>cڍ\|/݁m[mǯ5?_Ck39%/>}KJ)G^^_yӏ||붐}]D*t]蟎mcݞQ w{ww~=wwIrJ<߳EG+o ;;c~K>=</t@u ơSwؿ Þ@X=#oa_}tf툉 ,y#>FhY?/|\FWv#H)ar-ƶm}y0x ujA"6 35Tpƴɵ:UҬL6HH|Jt]U+ݎ=J[metzdH!ry{ƍR6F„q7k,HlCSI3Vxtՙ"| \1+G\0VԋT:=Ifl$tm&s7 $ Y$y;?" kH+ypPnOYrt .QARZ$zdc%QDX~ 9L ʖ֒L-ӺQFD%Z|KlR)jJ3JHrNhZH̭)5bXsoeEUH)7 D 4}?B?kD9D7$8P )1Єufz+*Z4Լr o~w0֕*+ho3A󞼮l U-~H"&nIR*8@K0;CU|`me 4/xI :42ߨXmS?!ĀFXp*$/:\T_ l좀qʒd#N 9EU+F4QQJ 55OK8p,>Y)‡J̻(ecpyFJZ|Y=כzN +Fka`NR{gv|FV.'DXrCWdjd(Џ\יuYyz|d"ps̀2WBv˙#~+~鍏@.釯<|*5c?Yz,-ŚL |"pz4˄g>=#c"v )<Ȧ*[HX0VTv:1-3udZ۴:^׉. x.-oúns+VKxx| ě ;gmڜ?C}ƑC#4M=uzB-י;޾>V =7D׶Zϯ_9k5?|F&py.(21Fh{ 7#n xOΙ~0Ȳm7|]b:C~H1 d:kYוb7?!D ; (܎"ƶ)EA$8|jVUί'h5Fj8 Ӊ2v< ACEr|ETA{3\G_fQaL#ĂvPuC+iGQwPחPV3DIF6SBPu;9RJ5-?l#Ç]rMlf%oTGJhmzK6vyC$YiӍ>튭*ZDl4a hz2k!VN$<1NǛ8釁ڦ$p)gh%~CiA͞\orql3vvw!9#U(R8T+Vۤfr,>c\êB&64em\晾*k*xeÑiyE&RrF"X}C)aFپQx4ԜYLg4;<2C`jZpYvczQNkFvQ{΅GHRTycg-:R-uJMM* x?㺞~@9D!S(ȒpHaCiv:ȒoѢPB PĘpCOI@L-v;h?yB\P Ƈ&Q@+isXݔpZeE&E,EPB:_˭W98k|)a=J0qzŌGu)hh;4)Sڕ`ח/(]fѣ%(q(K*c$qGGwͼ[cq퐹GZ1u3n57l,l H(QsCJX Hu]f8? l.XZlF)v|_?/VTT.zדsAv&@ 훑(MiZ0әy6|UԶE3An]`=_93M:3M iM+CBc+BFbO5ށECN R[\rB,یq41QL JhRIhek;b2gQk 4Humݮ]L?P4~q1[T|Ъu1" o#BQO`*կ!tۘnͷiM{FV@,37mM(";ٟID4pdݑ^Wws.D S3~n3#>-W`< $lߨ?D:툴8eh²?rj[;uHNga$ѝïJ<56:mݱ3ZHޱNׅ1)E·_Wyaɳ'{ϸ;5tbƎirӿ%w+{\pGI rո5'oc#:ea}B+4|r鍇Go.ZHNqp/_>cv=-7RμzdG.^mO=7+Bh+:gfTΑoΌP u='鄱_>}Gr;DWݿ{#\}3ݻG~Cs 85w||<ܳu[װ.3}s\gb2uaVYV϶m0Rht,/gze)1#C70_&{:׾gc_u[f? d<넵ϟw#%#D)<.׆~^??A+9%g0PM 5--gvfx@Poۚqڀi] #}q`{J)[ZXPЪyJz9kH޳LW$%1JSW^ 0Rr`?xvLIΑ):q~ʇo~CVV0,@ n4E ]KImbiq3kQEad?^7Tjn-v$Q6 rhDD85Ch/kTܭCmZ Z5RLN2aV$+y(0hm*J' )3[ߠT-J6mWkw,D #5ou*Yk[O'moGc &XkSduR~O4ںFA6W j|؞2!LlSb{#r!\ڴK7"Q2rBpvp-*n:_P=)lh~^a (RRVö- smH)?6d(@9%| IHm$D@ȄyB*imb~Ƕ.HY v^N !Un g1n '|LʆBs> sI-(RSפIe[(J^4bٮX [L)W0-f Bj3>XJrtw><'. ("f 31+9WzJ7OI:_sͣd Jz~c? wgVs4??#̇G5Z4ZNF \ֆZ:]R%EN ]L [ L&,)3=_o#H+nߢb#_y<,~e?4nQ\+wO==`n|>s8q6苤z/Oy`t(-Ӊul.  nsF= TՐƴlF] 2eH+ݓkĨl9"t?2/3)(% GUIu_ؙ ݻZ)FFal82%ٖ&=cn@\7T4vc5T)j7J!NbGw{~w l(w;P+8aE7jjV{R$1gG¼^ZIVrh %$s%FITUTjHɪM([Yo+J6_90P!MصvH%ۺEO%[ւuy{ w ~fOY.`RYbQ\o ɳMze躆xWXw{X 6uc[Y&Ѵ"Y,L@ET\rDE! #JAo-"9[tPmʘB`#"ur+q]a#SCVUK%9}Kp3Dwh㐺m:#cDAPɩ4K50NBXWJ)Iy%f莔 >ްR&Bέ-Tî Zĸ!k1 m$|PʢtpVbEԄw}sLH8KY']N4mH+Wۖ.3:mE+G68I6P V&5 b(nGL,R{ƧQa8 5~az]Ob:j-" ڴϋk GEKP wQm55Ԏ*WMnh:BXj۪S+R(6%G/[e^ÈRe@ Q$ҹG [#{Jbv%\(GDh4ߤ6jj}#g9dȾ#Nb֕f]ro:Ħ' E-y nm:q%RH%%7꛵X-FWZGJIyV)a*#}CfF#7\}Tc[h eeԤ2%JN `!%xzHlTrS"2j_VdϑyEJD_QD5X_Vi⚈% . @'+᎜+;Dɔ~9~ xGʂ=)rÿ[%!!.[syEeHyO՛ʖiZwcNsϽׯGfDd&)dJDrC !~3$@ jĈTRTCFF9X2X.cf{{.(GZ7 ӂ5}"`]VcJ2:4MRXǙs> w>s`mg2|7|Vzd}vm<cg6 O<<>"p1R֊̝ƑVi8]Z^'Z=>p<7ò51&i2x#}_AK\ʷo1l\.:ux;M_[y%PR"|0Q޳.s%IιRo `&HPIBb6wK%6! ~9lAmg( m #B{@XLQ:Q˱cCFB^()M'BLUV1-x6p̼yH)#\mQDlu%Vrۿ!\w\e:H%J\W=)mU0ׅc4JT;Tkmżuvw tkIVG.b3';!.hV1su3"sYt=VM_*2-s6eF6PVD״oZhR5%*"W)U 93kOئeEzݡZ(4/4(PTJA[#) DA+B RӶm(Q;:KFN)cu9aC="+R h %˄ʲ^(YA).eDif :}F7sh]o~!gtױHIj3Mg|XARhmO\wOw4e>p=o{(~k" e=߿}Am7;/|{ǚoXCv77$))أ_6=Se\l7>=?.m86S۶c~<2dVY!1 qkZ֒+7? k ]aep8swWzWEuRta{+\")vx91Y\ƑV0,Ǒ+nS E6vu%YׅݞuZ8^v{J)pM%]{zwCoAli",+װ`_ si?{D gduVڦcYWm)ٴ\3VXL)0Zm낱ymx [+TQȉqB7m_iV)E"PQǠ\0 !.,%' fZn!f/l;֩5E̒`"[|%l6HYH/tz(c)"ct+XDjӌ2 fSWJu>alG. L5TG#BljnWz_J+VѣaEbHkѷn[TpOI k0/kiZH2"BpeZs& R 7j3"42"Dʞ[!-F;|UtyA(U9~oHQR:盔MTGcu$%mIqE"~D!M  59\_?/#؁19qr ʍYFʊ)+%b]Oʙ08Oo9|&JKDfI67g/vRIt#;WluJ, q۔mm(n8^RB:"&unsTPJAl*fv=i][D)ik( z"gX9NÞ2%pA*Y7eayt}(S69To[X07_0r=%#=#˼"dA7-~6R]*uu aABJMNdʍ޶bc<6 ) tĵZץ:4J!$ ,RdEp4nV^$VrnmF4MeQJ1 Z ]Cp/L\跆s+g(ckRۊvIa4b%j%귈 tw:`!^0] k\+ 471sha}HgXVa`)"݀]\vPc}ӻG V7$#2i-=+gs:MC4-pW8^hmH"#5=Lni{~r3 #qJqrc9 Mo<'sYm|Q$#k! R1hvǧ:O=9Z_W޽{uXǷO٣4Y^|G_K{]?zd#w=jyi^ ˙{ȫ+7op>]5 ;!%^^_0ZtJL>'lw;1&Ul,\#Jr'Y{_yqȪ54<>>rx}Ei2r8M<ϔ\pq^Epݟ 6tYr5D44MSR4;ÇJH3##Jklc\G ֥Qr򷵳$\u4Mb1$u1q;iXeI?a1#1ݖ5DQVIPu:5! 0OJ]'zim(C7BC2մ@ hEf K<%GD7#[$U$K&M#kq ҶZ!|`KEjmIBA3BkJHZzBB vҴz\f|()" BaMDzN8jtrZX%r~F+URy]3!D"eH`:hӠt +a}gn{ 9@ CVծ!Hې}TV"dzuX۰j'-k5V2)ybQʗRXR/r=ߒ "Ejºܺ"MyT*rktѶ|0J]gN-T)Zcʙ9mvH9ׅ+FHN+δTˌVH3\4J 4#{b?_XBɞu\TilF t3P yx}6@.^vJ'LIMVASH/g([g!$Q{֒3F*HDݲXB¡t;tTB={JBe4H FQ$ʐC B;J[Dj3DU](c u!%. (%23V;Jj1ݖ҂ ,B*G"Q:S-" ԭ8:иC ƻJqaNĢFL PW[;S1G\cXhU۱LniJ39FkI1] ~KJ /iLSckBUHA 3 hjW WP0^cjnZR7R@Q~ʑS!+.8I _A4-5~3Ӆr#O)nfuQ8wcLO3`>+ kiĴx4_Uk'glϐ;sE3rb D4i75js >jVM=b0M(J&6'y!wRJ65֔ɇ#{ GZimFrxyeօ BkR qDJ -u{ÇJF ՚ˑp7B\ʑ1Jt Y7 5R?C᫷h#s_zzf;TƼp ~ p{_W wûw,%4;qDGV||_ȇze9_V x~;p:10lw\Ƒ% i[ND\=~Z3<_~w<y!88cH\/W~?T3wheo8NXk|w4 8e0Y|8@ Ms^ ?=N3L^=w|9۷Қ+BO?&L Icߴ\űOTò.Xp:2H Z;rqf3pm+(- f3Mz> iÜhLm)(o(5lE;Qu Tq ˈYк%eE9e%ֱ]FS k-0 MS"L:y$"HV2*uNk"T;W44 tai!CӢxU);|i)vOZ˙ۣBߚ#9 XLmZT-,Mȁ&pR@JW\CN"mO#JFwL?J$)!"2cTY(uNhE[ T!!Dg [6>=VBF*( +%k6ՙ 2K̰FQ(,ӂĒPe:U2R*QRTyA?_P}S/]#Kn BJ"JZzDncN!`;h;(6wH%M<)׿b$_6B1M=oOwq?7:CCFṋ?2^PF7g S t[a<-$BKip- dAZ_Rۿг33"eoQTZ_=!޽zi0 RY֕][7Cog!k|'2 Ļs+a:.?ؿ{$#ח Iej,|~"Ix~>p8|[~LǏtJ3ia)2VA 3Z~_27_~J=>p:_櫯z8;tߒSoz]Ok }`g+E+yBx-˼p^k3.ia(PS}˼<=,{<̯'l'=A(/+ж-//i!bچ;i a.,Ӊ~0 )%7X/~kJ׌,uda_W8gqz>1.0Τ5ħ7os<8NW-1G|n%LL4|7Oxyyv +8]MOuYy4v 0PS͖)-/2y^Qj4iz hA[f||yF䚩6++u/UHAv=aw\/'fCNHˈPH]@VGDPi0q 4dReH!`va*քG(ePֲ d4KBˀO3aluGҚ=o24ƽ!h DC6+z)EEm#TG3"T'LJ+5/45"4Fp99LtOłv-K)N m:]Q%S!jP !,S͕ Iʑq'OMZbB +7Kb倱;'Y|1Č/$1UýƠ Ҋڙ,,mߐdGȹʷ@ؚ.Z|EPm Xǀε")4b kL7 53JAE 8H)+8H)\iw-RIpzs[)Œ֢^P,inW*ɣ oeGr*5jbhNXPѨ>dQ~sOiAN<@C8tjSJfKE4=t㯑#+!k[\k !Hk[Ibj6>PgdS m5A*DAw] q3r }-DžTd}=C i$qU$mYH!%[d7ଦ)El#)rDm_HaDqF<յ z!'n*zOX3X;u!KtSʒ,K%$%*aPw~XEk o$2WMH X+:/^meD,` N>fnGQUt nTvC y^ox#IޣB=6V0ׅ'JcbêoJglWI*e6nԒJYBBPւ_ꟷ$EJQ] HtY]JC~kʸuO~3{U4@c{C$s9GZe;R,~dhlţJYcBXkBIENπ@m,%GR X suzgBm9PH !ԉwİuAX]i0EQ̀n45po%4u+qưGaM6)V^3Fh@+Lp96-g P2B60Sr5 %tAu="jH"SjM,,PމS<|ELcu=)SJ"UDž4<5w_OtpBm#MKi3Y ˗O,!r9~pM_}d}}^5#B~/|gbL|?NJ>?*G>=r_{?vs}=oA:G#EIUt݆>}gOyϿ1?cJ??|q@"d 5۞HNxsP=lJk )n6ض<><@ۡ7d-!bL{`^fΗ#w{vOL Cr&t {cƕ)J. G$jzb a:HNp>^Qrd5u)M ea@׷;=vҖ'Nkxtg[.3Rp7-_&aVhkI7H2{t,,FhPW-\*c HC5- Y'*bp-1nKR5 Bs-WEv CdFT@/453ZJ3%fnKXGJnz%'O i nx`Y&2owZ$q?}շ7r!XӲzC2݆x&m-XŞsF9H l3o L J_?˄l*jq9IZJn*V Rfo (pnyV򋔸~ +dfiG3ZY( X%cǫ px$o!GA Jd̗3jؒ1n=6,WbLD ^rX~ABMZl=go1Xk瞓77E S?`o ڻ_B `SA =A&)v֊jV19 "bx<Ĵd0\[G*KΤ %+9*,3)g\;Kh {SX_1JPn=RfuyPm)b@;VHiPF1dr.M];Vf\e--٦7E.&$DZv/~ M.-uy7|`6\ߍHGrtL r P}!$sĐp(RBfHEnNVdaGBksM3TP e Uj ՍhRqů3R UV5C]0Rc=5L=~ݘ9DD7pn8QECK6tMƞRR r%Z̅%&2@% 1l $ 'a h Y), k]a~k"@HH+)icO [*uOD zDj.X ]$9?N'rX 1-ִuc&E^/˄FGa(%u@@M׊|oxmZ>F-4s(דJ%+FU.5=";’) ʑ2t" !e7DpG^wn`\J{Z1]GJ2󂏡&B=bPD#[!=dD{&sХkDݨ9ܶ4_1À*(LwAdCtYEzMbj7 KyZ"aRXWqD$Hˌsti1nzaazYugÎ,$eŌw{R--}sR3t3 K"aⱲo[2 T!*Ӆ XO)':6]eeN=>}&$eù;/KexẐb`VGP+j;SvP=>nwL9s}~/@ć/߲WmQE=4osHI ˅/k>r[K'˄ʕJW(>}>>}P'ЄZxX72EϺzĒ;|O~ ugB_k?4?eb{^>?#,1釟{@ 2+eRpvY˖d %%dH9|QiIC˷7hQ;+_Vs}|w}+9gNO7oyzzd:e|>jT*_>ej4,"$l!Z3+Oѽczq:0 {THdU1CD؎R qR+9ˈlZc"ĸ#X+ʺ!C 2-Hg1#lenjC {vDTGJNFІ\!Ԅɢ"eyoLƌ8RN#ITHOdжCX*woiT/\a1v )tEa!ƈP -e(b٠$:="uG-{j MB*Az}jOsg\S6!lF#%hER*4-I&Hۂ4+8mĞTL/u#q9Mg-q;wmR$ [Zaؾ'%mLsTȶFeX2lWu¹iZ@ڈ[Rs jJi9y]iorz+6o~[gZ)t!.\ *kdkB 3VtD"*REE&!r{}ĸێ+XDffص _(Q)dqVpt"MgԷ@׷/mKMPtO gPvs#Vf(g5*"@]QJ^X;*1Ơ?nhLSZXzP8סTPU4049ΐ)4健Պ7 FL**;@"eOh)VCbZ&mRvIL( JocEekerEh鱻;nI 6%7ڑo5!56߈6" 2_3GZK[\ JjmozL99efmmޯ8a%3޴ 1{pjn_G&ъ9aui:0џ\GQhqH6g_ɩm[1臁Zkb8TQ;jIMpJ6Li8j<9G-]ㅸЏ{{rNMB2DDd?tEwXkܺ'7uepv9je^XF^)Yo6ޛkI}@'5B+ שŹ Ar;bJԤqgz{)%*N'r~H>p RH_ӉimooG p"?+)xm?DU+PJO?פ~ H.]OFr]^GiOHm1C)HUBe麁n$k vAhRmnhek*ѪRC V83\n aUgHgH k1ZVh)`^qV[iXQ]h!Ϙ;f5"JA6TӁT[m]4?g2oF2Z ZY&n[@.R*CJ=BVD5Z*:K|nb?,%ɣRD} ÎaddܿEj6 R`Qn6T j\@8}r`p )( %R(JQB6Zɔ!&Q!]q5ӦMt#ѽk^݁>!R/3~qÑmTd-n EcӲm_Dk؆I pT}CiRVj hH`yZ&F9yXif;ޑ m `DtR*ibwzC[d/-Wr=4 e uD7RBBu8{|Τ+_fw#?#_>day=13mA0 ˊ0n1?B=!X} cA;^/ݍ_sGBu~zk5m0>~_72OHi ҙÑPRÉ6^/ga'v6 8227_ƑL7Kp\^<NܳLs$QBІЏ\.RJ@e̔Zp97~n7ίyzz%KCʡa+e]R`DZM3X>ﰇfL1wn{R$gB\u<(GʉywtA]#xKD=%eÛ\~R:'n<RZBs~~M7"r]PCby DG/Ol:)Vz E-"Qۄ4*j.,²sE9E|}&gw oݙwT$~ZJIpu1m,=Œ-W-5FԸt2Zb> 6 5GДYוbR`ԲV9m+ 4-?t}O6~@QlS}j]{EJ06:[o$rzxצ2Մuk U"e3C?;!1lt,>7BQyTbZ7B-y"ahk6l:OȺ1H-Dx)Ru"jPJn럲EжULRXۑBD0@I"'EWAr i1oۏH|pT9ji,AӢL1=|b+6]̹M~nQ%@е_=RJ712(ovrGRĔPE2m[J%!e ̭%1gϏh!1`i>cVپQSDVӊ.wnUAYӊRLE&Pd߶JjnZѝbw#aGEr\_umjo=v%ҹyAb]6^!L4!Pju EXT/Ԙï ژɠ4 R7Ȇ@\7PA*^F3u(ۆJ#`/tǻ6q׊ Y*s#J΅n31EQDUb.81()QrE.+lbP64xBׄZA@?oɈ YH)d'֗N&#ӏc{ۛ0/PRT] Lt@efR ^-S?Z,3}߼{DЬISSwP O/p]T!E[d- ؖRA76,0۟+)fpB&M) y"m[! k]j o/+;2No3@mLvpi"O)ZLfLg Ҋٟ 58pGu./ d N6<_QJ;ǒB9G)v< JAP +'Z%f c{y. ۺe-ic +5 l2hJJ캞|9wuBJ׿aٚAO o޼!t2t}*Me?54u3ww't5+ο/x~~cXL ˙F+uFF݈|Eho5%>ȟ}=Wy utBGa P)k_/?qz6 )D~{<}Eȕ<#D E,mF<9#Îg_cw=k>x~Y^ ޾G!F`vw86a5GbtƵҽwNOF h ic{ mT1u>j)w׉eYv#ko)Z5p߰Йs %e| __;awKɌ:ijWRT#!$mSuqa9Ѝ.mYEeIi>A=0_Zi6em+TȾ.J\.-qa1#m Ąƞ#`#v!I)c;RHMڦ/P+26;mv3PHQ-V3KX\>lD%qF]RZp >_0Af\9FٖL1n4p6;!)kCHvyX׍Z&HuoJ+6O#VLiS"{d{1Z!)ʒJvpN#F$O^/ J!Yql'SXMaTbkۥGrIӅ(*SV@SjAMrk2R*:_d*U׉#B[|k vt@\7!AKE M4gwiȚQFUHAxtYpb\++;B"S(ZBY!*k7ŶHj낵[iGN%BE"1z+%DjLzJI*]ͲuAV)-u&c BP.) 8r:Q,4uYB3%6t:_[Mho9nAC0C 6lka,)n!N3Ruα,TuHMjap#* xޣD~B+AQUAjw;lFJo.z@)A!̱mR`Vd7Sw 9`\϶8 h'hki.ڳIwd;)g>|)u[9D UF|q`="7RucٰOeƌ*멲xʹG琱lAD 'n:#JHd˕6uZ_P[h[2+{D.۠'B@-,1aLCל~uzҼ02oZJ޺WT 3Ӟ<ϭ n; mݎv@@t^m;maXn!{<{ K [jY&"ڶ*U޼"V1-@/14 w=vJ\+V9ha8U5 %PMG_۳|tP2`qb"l{ # )GCHG1,~@Waz~a.tqțoqg|AΙv¯~g`qʰU}7oYAʶmT)AQb%۲ g~>WJ?0u߿_>a /3{ۣwOL;_w<_gFi9㨤5rF~|񕯾ʼnX*/mU*RY ]s,KTy 6BuYyOOO<_/ ڲ+{[_|H^'if6krl#޿Gwгy*HM0㧏 cw:'߿,יr|zVlKX9 ;*JZ5V  9S"U0#e(AkԔ#d=%yP)}EaѮ#C#-kO H*LtyxaP)2ZG1+5+Β†'caCr¦m<V!KAL58+:T$qp P3?5Zb*J'Y麼;! 葶c7HABW\秿[d%QNIŃ&MO;JlCiĚR !Eص.Њ;JetLl.m.[؍{+~vmQe^(Dc>>݆"2}0G#1R\ϯGÎuG>#_~x{oGgl'~?k<_׍_?gzye>w\ Û#2l共J#rt:p\yA~|pw{ˌ,~~v陽q-:=X5e9E~_#JeVN;>?ҏ#a/c~zPJfV܏| / ۴q;Sd?]O;|y-X`u@GY{ "h`7PbB 0k~1]ILш)Djъvh U1z:?ΚM H:v2sBiv9Rrf;/EPsVܾQk +xϔu @ eB UWc:CǼ^0! JRܟjNd;b;lYX#g̸jGkLhۅ:þY?{-H)av-&t97NI31T\Qu{BK=7(X7OߏuFy+]^ucyH?tq29aw(E!ʶd){ĤP =f< 1A+W&0dk4Z"%u>X%:kmcS?@{3Dsװ!g jwdu97wm֢rfaJUU8kT'68*T9ҒqmH"(?o9ٺ  ezmm]ۦ(WJmR2Q5f@7)X V(L k.ZqƒDޢB %$:rJTF Bx}]ۮ IL+ ơis6Lw@cv葊P*Fjvfn[Ri4UxQ4`BAZoۓU` gD0:C,57 O( v)DdOa)ak/a,BHYW:͘7@¸h|sS[Qo`.HqTDi4m]sZI#dp!TA -r!r;3q]0)S Bf@1l7ieІ7Ha_buje֒/@{d9!J**Z"Heb:LBliθN~l+_ʡ]֕5PӔRr -Rl3:%Ot{dCU"rw"EyЪ&n@#۶jeK57i[)(-#u|@ve%@ G,3QɆαŨ>6•ssD.F#}&`m^b /mFQi'΁_!xh˒o\Á]|@GdXC*I-wTL|zB59z-zQDF@ȊH6iD>!x.?-Tqf 5?'t#B7t<ɮeٚf5f]ȈLB h!рn z(D M$:d+@(7uNU͒>sZsDjF3:4:Mř_Fd%I ~xga:D)'Ɵӧ[|L7o/e7$ƙ~9^Gb ̛=OEwH"mx&=/HR.g[>#}a{g; mVcچ<==G_fm:;1/} ^ aAuO_!SiC5e5}`^ChI gVxဵ=:k8gky1R>?~AWbN|>>>o &̵7 _=HuL)i:nS/nۡƚy/Hm3)b [T=1z&etfGBV$4kZqR8lQhBTfָ0lIQ L9A"$!I! EF 'TXc1JaGərfߣ :Jq$qȴBQe0'i$®O hT;P;'i]q֢RDjInG =wlyO (`/ Jd&=9춄5`Jcզ()9b> VJV2Z0umntլL",5 "gp a :+Rt>H+Q௴ l΅T3EԍQIX :~AL+bs=8j$j>d^ݶcEцH5SFhK# TUd8/EDk5WmI~bm_7ZL!D(k ~i;&OId`iК0h]<]EiBP9rL=( >A0MŪj%6MP#4%RĕnAYVDD!gDG C3Y( 3 aDА9-X-{"!j$eCQ{>hSP=Krߠd*n5 L}Āv8X6S⊳ FYb etDޯm$[TE BHJG߼,G]Z_~wv˙2myf'Eǂ(״yi-܀{1/XX&_{_BWr\*=@N=9Dua%#FPZMBftkY_i(I^NEa[)T#eDZWq7BseeYL4 Y#QR|q2:$y`t%zY*ȁLJ-Ɂ{ i]:Pt-TtƐɨL ]Š(:bD đdDmJNV1 Hk#F5V ϗ-02npڱgΔR#Fh[>~¸i Wo 4s{ss/>m :->/3~<<#i-OH=<ljpF Mwc~=px|&(.Ze{^DQba'fiۚ_O :·߿'#)3_⧙iYm×:sδ]Û;h,)F_qW|yzLci7~4o*i^N+zm6_#S鉬p>Qr!#FWVq||o'f: Gn>r9O ?ܳ?i:qv_>3 M#b1+B ̀4g 㲰. ?_JL4!f=f\6-?} KH jR9:Nt7_nx)솁Wئasxz;~HݰNk-˙nW.瑮u6Æt<Ĥ{Ώ/U> B0.hi͛B _0hfsQXv˺]UO +g> 7h9 MOLFTc)! UvDVb\3EY i-Ӓ.պ: Eհhڊ()3a<Ѻs-JjB5~9+Vt8TZNᚖ.خ'|:m*Q'E!)1Xrx~lAZX_gaKZD0 DnBntU{9\iYQuFY͓W.$8ղyF9zqEb"+2È24"D/\<$Z)s|D۵hCc i3uPTT"pzK%U)k 3a(<\ PmH%ל"%X]+ub'\JwGڶC12i#'eg,DIOSu(a xRnB< kEf_PJ]CJEI(c0YJse4۵hc1VVRZ\ȹ 6þb\KT3zVTb78ZKLb9ސEF7<)TH%kq^2'<ݢ'Uڒs[Rr!4=BI?VH2I@c!FOə39ƊHW4-Av"DWR([!ˑ4NMj-%*JWEeEwmQ`EZ5MG Wr E)QW;r@m**L)CӅk}3ε֒sȼLh!X,Z[J Ц#'(8XvHe2Sr u{O (I?PȋP$uAL{)կ{ƥnCZ'ږȧFk)zz"d* x\GRUZV9t, mSJ!ư5]!1Ņ4jCNL^frG$ Ouhl$aZ %m>=˼0ŸNFvXBWk8Lsİ" g֕țpH,+3~s|Ȧm1J+(k%#RfKʇOPpsB@.3Gz(J_ @5< _[޼xvt>[> {W0n{fo~?q>畦Lv [ˏ_?cn _6 i/ T$T%[<"lud[.nEq1$L*\eR2OHkw`:j/.JXaJ\h C^&VҊvCےb$QhEJLײuyʼz= $N犗E(rL }7дHXօ#B>dVOQN^O'n3L״5V/7bgLQB ?[m6()oI_a[{Tuj m, ߼2r/~۟膞0/u_O0n;vJa1 辥瀏? /̗3( h}c \cN8Qh]싯H@+-ryCZ4bGrF\H<!u}HQc.ZN }ӒlSUKUNE F[ц rK4lX*Փ/G9bێկLgڶngur6-]3/#Z)^?4X-AZlCZ>7x#Bx"L+y~e'\?֕[)ߡlC,`l4,p<@!\$cn#Y*cZȨTXm4J*4@%e!DUվx[ˊ;q t0nRb`\tֵ E\ɹillZ*%DmPkJJqP1 {)*iwC#R-EW5c Rp-y ~J)uY)qak׉v+PY!fz=b Z[IRX1$)K ߒߝW5(jTh%dH`W"WBd2ָz9ya4y֠ABS= SZ0dEPu7¨|&\]$RZaA Q1`]G.e[m%[BN%@PPZ^MΉR$Br1_XimHhiDɁ"Tz(*%de+.T\ufjSYɳ{D4X-y]W?ɕWWPzJ7!NcHEkf<.u[W g)4Į4-su )RTU☋;Jеr gɼ^ȳG TO8MtNvAa ~30=GGE\BJ-e]ץ$n_g?5!$e[h,T|͏t Q~Җ/Xw͖r! ӊʅq0o=M: ~:xxnxE_3ݖu\.O+omȻX/#It=YIL,Dt`h[a`<LaI34<+kX} [vϟ>7DIB{E斒a}a2ˈn33Q\20sV)߳+NڋpsFU9M |Gqxzes˗tƱ|<`O_7O'6ʱy㇏\7m?pb7)%yFWYxd1|B 1D4L|ଫF޼ 0x=#-2bWo)uSr^qA=V΁a]#ZT֗`*/IF x>J&eR}E :WAߑM[QlءG;uE_VIQ*T V;Rh['TȧuR!=5 ?MA=.3J[&URP:SH[$+׵eF傲HH۷~=Q*#[L ,_݆2هk$h$ jW'zZEDDRTVI?px붫pToI)@R=e^ƱRa\ׂVwR$3Ƹ+53_,:V3  Z U"#J yۓ3OLs.uE*gt\Ϳ`\Ū\{1h:DoXbQȰzN\G:a-8C^=2!AtHT!x#5$ǩFs"(\ HW=$0Cjgm,\֮JKhm!er[КvrR).?!@uoJUhmz].-hN lC9xƓ39V K4F@|I>"bAMy:'Pi 2$!nxHXt#@IXn1,_22Vq$Rzda~G趁uAA< u@Dzg]}OQHnѦt[W;HsȵEӐI%֞Mcx:(/aFa4ͦL5Tp-qzfE=L0NdmcH-o6! 6;'L;j.䄈5n~!O/tw{_پy4άg_*ہtOկ?z}k@4///_G_y|Hk'2E¼L3R*f`x<mo+4^/>~omGtLsf.~!zZ~>}k[23m!fܽ{˗ i9w ϗ3kq9shм\L~EˁrbzºVxh6S5mt|T5fGy|~w|~}f9sGd̴g<̻V)rnC@ YS9CXW6mT*d8~:<+/]||AjIGgl˗[B'qQ*ٶ=jo/i^D~5F#R?G;'ZkV+c&VC uO5Cm 9HHNZV~s (RaRMW!#"*r ȊEzO){s2R)JJ$k]ݧ4 3RS ƶFRiMuJ,%>Ui_ u~QЍeϸZB!DZ5,ir!:{\ί?#X-:u 5FbZd>qs]JyҸ%NMJc-FhL٢H!OGH3 {R-7lk 70>j6y.uxG0:*Y)R)(@Z&~Al_#Rk ,,%RA R*hf˙R 7wv(5)ZR=W.c>sd+M;TtyI DQ?fPUN 1 nG3l%mZJ7a/4ѴZR v ZWI/ 刱kR>,36mӪgtr.Fxv NU9_5rn{gյ 1 "5TJxLj1]EɆ lCZGue9Hc ) )3d@˄Su䨶%o-Ci ǫh:?OHHSL)+ Hfr<ڮ^2@W>>\1|~}Pcˌ0̈u++]Jz1iZ'uJuABs-]7ժ#AkT zH5}@(OTYBLkoHU_w>I id۲d>bЬݐ(E\}`'Ώ_k Bvt-cAuu,Vu_Xcd:^H>'lחW3,3B2_ڎ0p3ipz8H/#rϼk-?lvBHpv)&RJ]2Ϝ XbHfK34tEX_W? sv Ӳi{u<|>rsKI+w=:.KY:ﺎ8*1pϔ{@3O#J v %g&nW"N3g"" )Z$i Y GTYZBR@ak^ BR7Z5a,)TJfS_%AB}q+MLl/np]o~CFڻ{bI,knY%O5CS2h-J(2שȵ&bxwҤJ]WI+FTJxEn\W(O3M7b!+,Lψd {4޿iZ0Cdi^ XHۦ'PEªLSWY xE~ Vi55ĔHgx96-k8ۑcȟ,˙]ߓCf+(5{*Tm*ZRFJ*"6ݷLa+0<ⵕK36bq*S t~ϲmXӈ[! i##3yK2 9'FF0o+!39$c[B[=8 45B*Y!Fٔ\1M˼Np#(KiqcGLCFPNJ!4dRZ=iDPfҠ3+V~n ڴ(ۡ|7H7tq Ä(mэuky1F:,[TQ1qlnV.p[u"E{yC[,prz(|e#KjZ{q@VU"v;؂Djt׍hoˉ~k Cec-z *ШJZ%牮iJ\^bX*6T*&EkTc).mjچrmٔ6}G7<>x-y۸{ w{UUC/к%/{e_+Ӊ~F1]8N4JOyy~fؑ4 ?>??z:b-u7w|o`"Zi*wozBwӺG@ȉp0ƍZgsO3/'rY}ӳYl|T =^O'I \Xqdwsd?줎PaL wo^_^oz#z`BZM47GKxG3dq͎:{HU[ 9pR{@&ML"}-OFm3!WL/mϯ47*䰒H͉5S4(SI[3B7:L?H!Be]DVuZvlZWiQJSeFTMoa[Qe 8X,/טuA? t@RsE[V͎{ض < *^&X[F@Hm*|cb^uqe2hs\8wD)-Q 9#V|F}@dvYHL=zP aIX$(Y3 ۶E8RShYΠ ˋJlQֳHW FTwZb=*n,+MsK+gTw$*Mjl{rQś۵(k 9ҶxQ@T3 dzƴ{nqW{Gt0)&1^:mFJ>ϰ^$k+0VuAQ.6( * ,4X$ S5Mie]m-lیP'<eK$LJ|k JXZTQ J.8JwXm9'|õ;B -<J*DQQBў={tn+l'bQX0-#=0&1)N]K[y4=-e1G!$GqI\.i/hɰ,d_(m3ȖirrBZg@U`q;en;!hUEL bWFJag| ;bΘZˆ"R9ˁR7T'T!RX OKt;U' 4\lr"||TPNZ :eie–녊U5E3V:F~7N,ZYg%a`|ByjTQ]"q~ /O#4WA+AEGnw{V̗DS懏ɍbe\2 r ty#nGqrq[!ekLWu||:/(kQ|fh<޿q4mpjH|׌eik 0Y] k/ZwGuAwrk6l:߲-+Y푛LX$Sg@7qݎ\B((֐8eX7()׀R }=)lm&/a2#^d[1V|QpmxAE=1nbB-1Xe[ i(ߝ."0rMw`\aKpR na^\Qx_wx 9n*ĮiZ|C;r Z&Z4ʡ¥ĚV\6fu5%R ijA);M PkضP8mhZ%Vz(JV4#xg]LB_ʹq cL2EUMQcD^P9XџDŠ r:U>TyK31;RQ-!b["50>}5{\5W`u]k(ј iİ HHVy:9Z )g1FQJxXA.[n053(̜aÇD.1"|Ԝx~|T,˺bf3 Z i$5N&Pegp`[Frv ~G\VrZqr1[BQb!RfR^6xH2D?gEV iZG\r eږR % um'rCa BI+IiZSЄRb[ZQdDrRV\SJX=fr-8 9cJhtՐ*165lH +=fvfZoA;.?sD]GNA<oI.89'A5\n&hkp.r@u"vʒ(RO [zHc6互7<y Gה8iUچ' 1*nX[-SFxo,}q\c{cEƈn mP#njSz=FR6-I)1^ƵEHxGBaG3yF2(ߐHLe ˶$Hˌ Uė\ oCZ"!#[Dt& x++߳h' rjW^!4( :I$ jDoדB U9N端'J:JQǙfKњO#qL"3Dog8fzTE qK^N3/T1Lk ~[KM6N90O]4lkI\e^*V'eckĪz }߱"czJ[\y- w _y>q7[/ݑ6ۓ }G 3XGU%DYm̽nh\҉-*Jd, Ƒ|m~ǖN6|^d:MmQ*cCoہ\̱Tk $ac*ӐQ4N}opێւ鎸|H o:y *bmlZjxc(\2qJ-kq 覣irp/}(!PCDH#JN8|C4i#l|^c1Rs[UڲZw$.#B)ïZ2;( LNLJ eA)еAwEjpfҚ|YVнLKNhSQri{{F)rhZaXd_l ] h{RTjk#תBZq(FSfDgA_̠PEAyk!CMvGI el11ErV ]V26,%nM( Gp^Ji)D4]4^RQQKE&G~Xw(`J9,2_߂7LȻxtIϙM:uqcr[旙-nqt|'hw=/S3ed8m33aY{Һb Jw,&\gxG~<~yDQ9s 9{={敚 S(wq\hoX<uk˜v#r{+vuw[ ʱ۳ʊ;G(U)޿c9yobK{yb8T^_8=cp_|ԂyY9>?qFL Q. EDs{ϰ;^HuYI!bTB;Y攸{TXD ir%i\HKb}vCN4Αt@ *Y%m7lq1Ԣd[RO0t&L ́,@LipMj:Vϯ_hw7UY̤T"`,Y M':8<<|4^mہixŒnS(xzbv*ƈ2ii7Zt-9%z9k; G'b(^$ J޷(VK)C4;Cڨ1Jn8M$m HL+8R)7GjP\do,%(A@7Yr%WgYi[CNRnvVb2V2ΉTLJ.9iöiY( ¯*xі&R4-:v/0_QZ,zi1r4ZSjhC*+[4"yT(9sF@Hۯ *d\Giqhې"cerI洌dk@KE,.41{a+^rt@Օ#mZEQ 3Vؾ'+5ԸR\ W0B6ˉt))ݞ\3!Ÿᝡi:!mQ1J yKB"Xu:ȇJPIqUiځDLbD\5VY~rBN-TM{=uX+S#$"mS#]_-Ri#i[87M  uL2{:ٜi[(Rrc! k2ZjYQ5r݀]2:~fa rv8漢hi qLUeµ|_?7tmC hwR՟",? 4xZ>}ay\pڰu%~./G<*C۳'Ix:r>׍JM0ray>ϸ蔹,)gnB߾<^9Zmy;X3""=Ͱ'@I0PvX*9FBJ]Jx~~"DHo% 7cXL-l*u{//dU]*-5=L&g9FYE+1Kq9_N\˵=),y}-aa΄QQ us aWcvo^C))BDJd,F+|֒pK2Phrm.LRpQa0r }߉+HdfN$ H 3εi/Z+ f"hRwlFRhwbE9Qc;GUx"S*XB5m^xˈf'MTmi|#a8!Ӗr}PݕP:>/Hu:CcM;`JP<ܼEVߣB@59T2W [ %Gr uca6Ud"4UE˅~Cu ۶` a 5%eyw7$e䁬R$իv)bfiɹRs"&-U[V.NUX'm-ZY?P([4YpRC=fBΑF!^;EƐ0ҫRJrW XIcm6T44Yۅ0>`D +*m+*΁Czo$X@yCF9 /Eb:mw($BaOYOqB,#6`iHU y T #Y:tؖnQ^.JPXeA]iB(sQ`"l"3VJ)UC54aS+8'R@VU.XS:Guߐ^K5=&r(mTX3MBQS0ڣlVj;V8rn Veay' %-=6)bA):%bCw9H!kB\Bc\^1$|{u-&-HJaYJ=Yj)ew&)ߟlA@T={t(oI[yn@'4Ѹ2%/FQcRh@m'L&,y)|"H0FtL'~_2U#nwiN3~=T 77~o >}=4r&ewH,,kɴ6-Uk"Pf|ՑLEyMoz 'A%Z++%C;t"{lP謱yfj~"+yLӱN )K\q7ErPF*\RoH%MLJ S%&J"UEՒд M7P0kJt-5ݐCK%wk=i*LQrZ{ju!v YR WDiZXjC\pUQ֎y|nd#!,E,YAT"*m0x.R24y{t'l#hrhX!\T!A۰#$Ѡ™j 9f,~O":֑jsu;I8bmI {uܸ.{Źi(me :e&*kDE;9BqX]# =MUI&Zy9ɴZ$nXqE 0FS `yrg4XWp*X`k~Sr5~U,0FSR! B:]dcQi*kw]2y JDS]fh5tģJt$mDR|^Ñ|~b79 Sl{@yBWRNtoqFEYNԢ0dF6 СPEɨEV5@)`4I+ǷFv7jn͂oFڞracZ˗x*4Q7y_\ѿy"L'͋lPu\SZuVchs Z4f/r\)$65iZx:#mt^,Y\{!F!PR@u\HJTh\VH\/3yPF mȺc!B4lNt\gLÛJ,wm޽e?B U,cb-- OPM#%m?R Dc/HYߡe[ѩpݸa^izݎ<ۆ^I9f])%sGmi,7})lě8bzO ev#oor~}WL~ ~~j;OO4ڎ-?ۿ\6e3HB4 ,Y>=q{_szzs۶tMZɓ'f[]@B@W *  MXlG1Α⬈1so%Lg͎,!5?N߼{OV UijTO;s>BpT?"z'?D傽}OLQ!݁mגBO3IU5jA HClC;`][Eݰ#dw[jI|DH_}>UӑPơD kS̤_᚝v7$x9ނ'#H{tfLX F(m(sZXfEHmBVxN+ -ۺԍuTD3 <PSpejUB'PZԱݎeZ|<3#kYWkKS<9?Yȥ(l]mzl롦4fqW, :GREQ mZ30![Kӿa}G@p9H)d)ˊ33˅izyhravx J+\h{e_3&_=(޼Bix>s6ݎ/?=Bi._`O?L/,w5L,!d9kQ3yNu-a˂ ǿe-캁B^};Ā),/Wn;~?r{ہ&k\F0'n<+9&wOiAjɗ篼{`S1inw iY!`>u;RV|Ư7xQNgn7B I ~*Z]d?~AM΅,no1s>Ha,iPg:N4a/gڦZ }ѷ]EKK }鉡/}۳,e]s80F J23;=//gߐJk;7CtzPlB5~F z<%e; CGۼxO^_ fGj^FGLoIIV^vJHBmưx5gç@RuzJ_/UhAL%%yU J isDJAJBDFw-9r-*{ӆB"kqÀ5#a)9b9kSI߄Ru ں֒L|ZQ]C+ YR$+ ]IudYoV4@Bִ1g I RڰmOc: -bCh 10]ͦ"(mwk1FC"ʎOº.䔈ZjGhK7,W0;КVdBdWDLs7Jh)Y t5U ~越n[ݰmQRt}.T;RnH>Od&k|.%*ڮ!HU/BOBIi:iE S)feg7oA.taÿ}]-*Rv"uҵWKh@Jm[E6xFBf-$m!#$jMTE|/1"+csjC+xO^6֐^3hڛ;5v};<#/bň E;X, BnRuF(ղn#HIssv 2B!i]4UuAŘ~_)rNFrB̸ծ6@Bق\HݡmhFf ~IQ9D. `t%)* "437m{ӑJ7oPQ3_dtCʨVHg\S,H݀sӑ@}Hٶ ؐ.3:aZbR$a ,"i~b}=!Aa]^\fk[/Wiwo[Jm+Fr>"}=hO麑)Yl+iT(JB(QY%L pV^5ZD6%RYӂ_2J!suCt%e^⺾B!n%1m`LHuD-ihHk_1e1RŒvFDNⶀ2Rt\oJulCA=Lˉd(k(=! M^7 Mk.e0 y0@{رORP^PdyD/OO=\iVFHO讥_iciy=~y/O_!|晶k9Nf²mLӄL?i Gm(MH;~n )gi1e YTr2li;R "ZYZȗ TG$"kr(2q^ACN%-m4OTX8TUN_GQL +X]sFXqZ DN]q%@۱gjrFf1HLc[pm˶4A7R$ihq{ bA+C\ 9,驢n{T-%i@D%I2U `4+@QB 3:lh2kI!9"K6m-Y Yͦ5C%Ҭ,2TWD`|`lr>BH) $~Az@8^WaVaE=O Lɉ:A^+Zn0,$Lɢ -&Z#{#PlLId_1{ciA\WRuhkѻiY"rۓrBL ,z0\Qds nF ׸@J# PJb}~fX|.( .3иܲmC} 0-{p-(W pq=E*aDCDMB.0 MXn)[$]Hk2^PF#!'A*6 $( -x~9 H0%buxE̯sh;^GD@ F*%VX2ku^u[ h!ٷ=_x{-{Ců]lx9r:y7#߳m#2;Wb.|}zo' ^rXVJ'֍GN'5'>yhD6-%aO޷_oq}Kp;e>c:{aؾc&n"O1BP-e efo7o|x:>:/\'p:; jrh-~pޡ9nOKj |F̯|Ne;?׿5/gF<^Ҷ RKd?z:aLe)[i;̤uu=qI(*qKaNe[\p\pVz"%ϧ3owd-Y%~Ƿ~ǏQ =Ӊzd IH<-8IdmHۆ(6Br \bAޡ d &fH%TW:"JΕ+ʶa+xky~=sa[h@JO0O,aCj^v)v t1 5,T]#%$rH%VJYcU_iۃB7۲ⷅu5QF_eJ|E% ~nUdEQn F6o_1fT ;ms:J8ƗW5cMC1%Rmw,z zsg}_KR^3 4" yM #cAw]}##PׇE UW (ېB1ۮX !Pb&H̥8aL,"ݛ`ΨdC5qmi$I}B*U`%Zڟ!%&g6Qs1VCn*,yԕlQێԥ6 qNtMӐ2/g))k5c=] Aʑ-U࣠mz2ƵİRꆐYph\Z)-DH $1:ӺM$Ųzpfin[>gn@w^F~C(z_.'$Q E<>7oBr͘k(`\BFv5ӶT$-$ D_{R#<-ҵR0F'ŵgPIF ܰT3" ]\'pMGəTZZ]Tױwu# ".n&n i9|Bq К7UnhT I+HLöv:費z/t ou6k]9aڎkwO Hӌiv` ; 9D3uG.4j-6Xz( t׾H`+@9WXTa V{#VՄ+F_)\P'L\Va@DBې'>$PE\Qe *⺐Gg~wfhۣQ0\#(EIXp~x(*Z)ȫ@ {yi ZcWL|v;/c4qҲq-yD m.30kxY{sGH2m? G6B)lnǏ?XDZ%s&.'dkPWya,oy/2qZɋ;x;7ߡe:]xfx=/__*G[ny'm\*j7_{y$m՛u>(M"}7ppΰ|`'ڮG v*d蛁i\8t;\1~q\FTs8>0M??o軞85=/Gw<3#}_% N:4b͇w'yb 9xϼ MJ 0` %X'e*V~ z]>||!=p-yq]%s 8q~>-n8rszD u/ӈi hmCmx㑐#XT(SeDbqkJ[m0_i7e`DA DC _I V_ !+f^g`]G t-JDX#Bf~R^8בDf=>cv@\WΧ>MhPpĜSv̗W5m#[5#ai}4kaOZLcZ&ZjyL8hDچ *'9i$*qCmivu"l՗R.$Պi|R} [h4tfh R}C 5Eݞ0M<\!@jmJʵ#g!gMr*TPHrl3+R#n誸 EsK4)Edӣ#ZDvw@;GV;*52jA|ur0\j\ ׃Hˊq- QDEIe?+ YbLCD(W b f5ҧJb%eckF7Ogg="]odrL (S%j!FCJF٠b 0Rlͮ2.'Rfuk'bB*Yk 5PR]!5šQ+R*HJj2UUq0>WncJKlQRҢ@ڦtTH%)~Mڵt]느m"$3酢$R tczJ (]PFDAҹ=CúPJVOHe(BE*4FAʁݰt(A('+C* '-ɲTzXXUe>C ;R\1T kOIQnS<`mOhV[ my%ǀLg0M˴,'T3)UgCJ\فWOH>flĺKPls@+I)5t0M~dnbbMkOiݽ"uAuZ֒l4:@)"Ɖ0|Yz9Etu YM nGޱMܭcqOh<9n`?N 0 P 3 ް BB8GɾJs2} Be"Le44]=YmBsy#\YM(T6dϐ6[.D\l[/4w tD {R ͲH7 "$eYC:Qq/ضv-2SP覃"tzE`-L -ϯ3/3O3iJe R}Zm)2^AZRL$#)k YL4WѸc6[k`v7p;||;6 %HaDy?10ϝv|O?,+[/1@Bj-Ֆ_zI/?~/^NGÛ;>~޵|շգ:k#?7fYYÁuĎ͎O+FIN_q]WIQ>&"й= ,J"rwȜa]gl>Kn sر Gwc,89)nv{qb\ 3ș2cez9EwwB";͖"4R|~RE!p?`5r?>(,-Vl-nClkN8j;&"O'tp7*Ht} ]ÆRy6=%M4Y"[b3% g[V"۲жFir jhIi%͂uaC6He "#e"v=ۺ-Rmefn2ZڶG)ò ESEŚz7Hm<'DZFm91 RӴ-1RJ4I Jא2]'MS-饀 mՔ.[grLv+qR3~@i9HPER`Y/U(YxaPP^ Jda@HE2|ݼ%D 8qV4*6~[Xkw٦*oPaFa| ,jׂ šAH Hp!Q22ktj h!nkX"[ %:Gr9dYJIb\7VPb!GV*`|t9M\70-8B]AyC6"m_ W:h*V{H'ZHJ&Dq?Tlonأ6@º4j r:JȺD=,\xBɵsQRr:PoJ ]#l1ji׊\ j3WyFZ6 MP=(a'A"mאZYଦHY`eG "9J#5^)]U*G! it ]LƐJnȒ!wvuL +nǗc^MD\mF[ r\R%@2ȶ\zMTжeѳ3}^)*˵WfDR%gJ 0 yz@$B䗟RxqE+eXbNu=R+QXj//os_R3RiRRni w$BʴnQ)& iQ[u\;m׀Tg1f *y%&uZBD@MJ<u4hA] "wՃXx9k/fVP?ϰG+T7 #zh)KEHDaJaږ8ln+,+>AskngR v<4Ʋ{x1A29dzB48/q!źzǯcdn*4-lڞmxy~e7 t7:S#nky'mq t5m-Mr~=7eu9's,w,ae|Eq:|>F'@c1$i(q:>]W4iyۻ{3"$a A?01?7/Ϳ7 _%7kyO{K#r)\ ݎD4S%UJǻ{>~S{^>b{,`e1>__ 1DywWO o9t]/~Dz\b:>Mmh;~D׶L%G=___aE`K˲Тhm|L3km<>Wi.xw `1 ,( <>AUoƐ}/H1-<:^~8cmvi ngmt:{lsxwR(!E5| Xmnㄱ ejTζiU'Fcb͘²^d\r(AUdR\!4bPegM*2aHS2~}¶yš*J(52zm#L {mH9J]ӕfPiCJ\ӑDwƢtfzIȚJ\Pq02^8Pb RI|I ӛ+YiZϚaO>GrSIua(hHe*"M`f`ma}h4UEg٧=B8·{YG0O8mOݦFdNX3a65U5 s Ю!&(k5~r,>i4Qd@fwZ(h!q-8ϔc;mZ2RT8cFH'V* DIB]WyR˥BtŅk4CJc-jy2 k4qm@4u C9kQj}2%I}ˡAڞF$1J~N"z.~M+6u]8]]k}[!`4DRŔ c4c[H]7)纝MơXD0ɢƫ)4'JPbMW7OSr6uk-_J)rYr4>#T7u#R&k(Z dktZK?ΔYbiױ 03 {҆%D?9Ǘӹ>5llϑe(b& a PR0]kB6qAcòhTLTZ-<{uw bӲ5M%-j,?|G޾ {tn {^=;o?-}e,ܿGJ4ILO7w+e>Qۇ;>>}YBx9Ӷ-$H)|vĒgl۠Ֆ ㉻[w{@k-n@vjZ;l9, m߱ j]׏мmӄ5sy 7 gww_`$4 }fi$MR8Onvs5ߓb]Bݦ#|bm[1[. &Ԧe*&{EO k@^<eD(b -W9񸌔y{i): Z/ /L8RtzD΄qBm{R۴na{wn7Ñ752.gJYri 2WR`%G kITgAE Xa@Ys-kfۑ># $dj#G\338Lcqʻq1J5J31GR!XʦߐK-HTM8["Eփe] ENQNHL"t~$(O4`,5aTGCKiiK}JՆ H4=F7#r\y_S n;۠@q~~s'dٖ<5V}38`t-/ JBY_zQ膘g(H]1MSi,%Td,4SeQf)-%:b.X{ ).hWו12OCrhmbMRڢu{1y %3lFPij'q1ZZpXPD$Jr<5\zv!|IȔk<QaYvP i`8 )T<煶"Dv7PԆwi/@IS;DZ'ݠ`'i35z=yxu5 Rȫ0Ȧ?T **ɡiBA#5EׯmvK{dɤ"3JJDF!+R2)zY/-!!X#pn~rvjFhuDEM5r)HԞ^V1_RVU"ۆHY)-(M<1VaS`=]OѤк# UąxyAaYQEʵ1kI~a]֟E)3iV)+ԇ6ȦϵO% 5N5U VpAhZ վJ+6"bR9au0 {c pjaW +w6ǧ:jO'D.fG U"hJ@,vCY_9]7mILu*E݀R7FR1,4MT*Fׇ+1d;ʶuD\R4m2>?C8Gi+U Z >S\CYW21z͐9 6W "fĒH9ܓ,%ML@1 3rV$ LXQ} 4 YHOk0. 0L LÁӑ3~kѭcgnK#C\5I {RcXq:m{vOߞ{se g7L@Xj2x{{GS@ *z>}[^滿x+"W[W]O{{VNӑiXqӵJ*>}w;%(ʯ̇|I4]Û;.DV펏_>?dɑu{:}ơOy<"ē牻v|i~-7??R[a7ia)ͻ[ ZD.v{u,$Ns:KHuCC ϯJ OOi=ۖeCq r9g9c!s<__SDW}WDP.)%\ϴ!: 7.AfF|JP0M#|6[톢JR'vCDaU ]'#(Ea@HkbHe:$( D͆"Yw*4*cDd1YJDƵ q]* EyaVPU~LףdJg WB=)GL RP'ڈJ3qm:UMQm !() L4:rcKRKJ;Đe!{Ok GuRD ]au x'ߢqvC]isϗ+f{A'gYcuȫx0rњ|I\i=ayB+iv-"؛5.LER| l|CN=~ULQ„p nw8P4"|R$-)ZW}f2\\ͦz@R&Eh8׸TծUp 2*Ug Z!;:׎ ESƂ2Wlv:\} )]-rٵ\=!Xu#膸()Jr)XG:W|wobqYK tLPQR\!f10^\ſY`×77BX<#d>]ؿ{Pqip*Śe`rzĶ1_U1q:~E4 ,wy{ G޼Ϗ(Ix9üFTl7 g{8=!, 0G6}7<~Y>#kX畦q|d1 )&n7~E (LH⚖әnHk3_Sz ܶD/Jy{sG^O/ϴ]kN3]SP//x>_/h!Z_,!d2_XJl[#|bG)>gaW8rIw6Jn7lnPqၛ{ak7αnys{y]<~RgB`Pܾ}?sn?{nܽ}`Y64}t-!gi\Bϐ):NXZG ilvtc閜*Pm {yt|%+Y'B2tB[pKYQEՃbHs /=rȕK" 2=TDP´ /!(h6[dILEfsCI3Hp$3m%@[KR)Z1<}BJݒJ;2QH\kD#'_)!dMGt(׃*,gLJ(UqȥTyN+TV:,,Hr^넍B\vRW/]OL/Jzq rD"nw aYK$INɒB֋, FqWpw<)V2:D`]WU"JSr9ݿ$JY+* 8UjZ0ƾ2hs=Q! z_ZW;|He7l%EĴ"ɺ <_9cz>vU+0>L6H$]SЦ`umO2(ic4׾u`-Vwȥ%*WZI^΁ aYRDZ_ƁΘm,%Cxi!iTȠD* ˂3R2>x2@?nzpU$2'd,XV;YPe%*=˙ wGCuS Oh?#s7OX(12|Er2dl`DA*j# JLw(`M p#ڵǑeQFU[J$)H]n(->]4]k6?8YQBJRo]Z#ls"$l6 iZ ypzd<q>b{CD% *BIFϤШ~O+%u!]/ Ʊ^*%ߏL[SUSo r_5>bjS(Z}45 pK3&Kp]Ғh*Iԏm~G @[e~{[R6PQ ogZY<")\dH4m 2H'Hv,C yiv=4L~O@ZC3wo03*S> 9,4˴m1J3M#oY[|+F+]϶۠"J ~7|<~ae)'G3pzgmr#U o_XB"E)ȶP8LDMG?|`^*-ayP1/~xӖcno<_Qn>8efn]Xmo} }%GrH|x}Ƣ 3 _n'|j^3%J8~~lq0\F^NUm7PfS8N;P|efyưG| -ӄ2敇o9Bu_]o~_8𞻷okvLd"-Ifyn1[5ᗑ"Ȕ!D%+.ȶE%"mkEζ$`U"(A ;%4ss[Jh!E)~AGhY%"Z,#*EG:i)Z4VԬ@\dI=bۑ)״׉!88b9 #t4*jG8?nM+fe9RhUKǶg 4mOP h ?ic 1sXBY3Ihv\A ]mnX uĜkfXUdawxh%iy 0Rr3-9^g{˜c݈eȥbz24F1'g^rlݎϬVbě')49dMǷS%Qv;,DX<>~_Ӈl{J(fckPV?n!)tf. 0\^\=3y2N|=>s~~a]?S۷AV?V2Mһ-Zf?ɯy)Gd)%#$3EW|> T!$IVv[BLBJ\KkYSQcC7 G8c-H ۴P")y@j-Y6=BW !_PcCTr%s/ҘT@;ܰ^\h^1E%"\~]jA(ҕo(O,qW'FeI] ~QJb=D&LJ d%2 RIFjQ\t"JtJhe1!dtnW 1b`."bI-gb9"vYt0Ysd%( ĔZ.R5\KICbDOi0 mgA A\جiR VT.^OP۰-2NR.loP,auՑZǚJj4TmQGR#eR:Ķ]6'P,qB5-J&)!U jwk]JX:Q}HCh$RHh%"R2f_ k: U2-5 p0:-FHB Anv;QkHLq!# "B u8ψ*Pj4T7ňDC*CZ *ԠyYAZ/8fWb[y?>CV zZ6+ԺG5%D=RZuݰvSIxT9cXh*C}]Jk 3-gލ0 _&epYEdS4iDu2nrӌcF(nwۿ+"dOߐS&H)2)VJ\=k\qc\&l6ӈ,DAܚnefzcmKw9ssQ8=0QG':/3= 9*"E+_1{5\qex>CD; Ѱ#qi%*dpϯ?MߑB*r'=o߽~%L,$w;[Oޑ|`ZV~3il̤_ǯ_O??YJ\50NՉ\2A5$ _@35!)* 4n;JWNv J׈*S*r*C$`H6-t2E@/vJ RKrޡlHY&t1'n[%H&blYihlnRba# =\RRJ4!41f*7Ŵ8 B1FĈъ1iLr;?7y"g-?=aF ,5dX$"WbWHo'{L1!&+5կu21~ݻ_վEZ!xXgH)mS U9z"wh&GBc\"DZue!lf`zȑ8HiQ9Aѐ3eTqaH *9/C jrMG^a,~z*X"ZOWp 9/'nn]Th;xf 'iXb,ϛ}u8il ݓK@Lk:H+0=Ƶ(_5:/]QM4}8tg603ײ1^.4}<[ײ{_^ds{t %&77̶rDD9Naז!DTKԂP 2e.HwqrUe?}" ֕^v/MˀԒsl\.Z3MS/ cYI@ x8tadm@afǏ\^_N|am@f |9xwaԃn7|}nG׏_w[t5۷O'1t~ԲIOԛZYf}ڈ8uvvrACS 0A y #0˷nFf4۬ڔg)i޽Z<+*c]Wze|7gT<|X WҲpOEa?x9G+q77ӓ*2t&A#J? L/x}|Dx\Ϭ30JUt"Nn3&%b[3n×範ee،<"벐s7L3kXPmڔ8g~L~noX(==ɟ>m5י{ί OFt!H)'e+%ښ=GϺ#ФN)KaF~QFQb"ՄGdt敮h,1dr8\cm5y0eו/8g]@ >f} jLXʺhD* ~9LG35FbLP D?mB )`\Lr֕yOȁwĔۛ:MhxƟۊ* kǎ[4$MWȥ(Z,*W5b XX&dڥBNѢRnqJSBB(J!\Ֆb̊fVY~*Exfֶ7Mׄv䨨97!J(UL<&z;l7@w킳,QHIM٫l[Oh$sB]lӥ4dE(tFj5=?4@ "y\Wo4BQL Y9A9E ER8!4Bf-B>:G+5FN@KckE# umC&D;ث!~^CQb(vJк:צKԲ2 ZۿjZ:MCUc:D)uAiEVJW"vBPԚIq $u3LX"ն/="gtTцZE\]"Yu d0#/3Ob +vbk]2%b#Ҟ\PRjLc[Ҩav&c:IRɔn\ j_ϧ&ůFbKCBFR ji($4S<1bPILNHѨtHYEPb@نHRoJ⺑R\Hǹ?_9=|O +BZZ}R*t_RZ[h(5!\#amT94:ºPB#d.tfD[ .߻Hkږ~n3]{Rz7e~#$!ks̟}_kޠL"r=J#$@V?;̇7ox}y #p:1 uBw [eOOyB_VjS+Wy|~ 1Rk q=/=7O?~~R9ǧomv\]7aY<Jg%xx=V<>?%t5oygϜzo hX32t>QjnGliQt`ݖo؍|c=H>6SK=1z/X;"mv?6wڳwRڥlr<5pt<2ȷ_9s+Itt@g5xq E㊪tƺ b]!%xneu”NpYgj* 1ó0_(Cr#h5Bam MC5^!rM =~݈4Mwt7PLb# ϯlB 9afʞGO\.Ҋz@#:s.nMĒøE1k_?'*ug\b@Z_B?NK˔J-#%_k-R5D'BxmmMdk̑#RZ4RYchEpj)HE(I &DEXb77D!啛0(n? mdR ()ZK6ɔ5twĺw(grb3 c#;I_k 5UI~p3Yhj ,rF֕δ)ݺ,/Z5Ϳ=pu}v%Dp!=L΁*-)-(Q/K@Z13hb'R LCmb-t}Gc J53J+E'hB-~># ˄dM-r]z|?c\Pw[(chynBi!F4/\F9:bHZ/6Xڅk nLmKzRn=fD͘n4A8ђ2DQy/]rZ˜3 d-Ǝ~@۞"1%Jn#ghk۳!bLIɆ1 q詵rӺ ${Pڴ|k tnq]ϺF͆lF ,i0#DX˲`Ehݖ/g!Qb u ]O n(3o黎8W[ue7_]cfD@Knק'bFC=.,1ʗIZLyYUroX\9['H)f;햇7oօ4[p%r/6<-߿g<1Bџ"Je{ۄ}}jagp}]GoHˉgE'*ٶwb=-^?︻{_H >8c9s8k8_p WXd?܆׾zhp R JPja'hV-:ΐRCG]]QE0nPRXPU#(J%َu(_6!sf5gw{=U@#35! CXx*lI57tJU^J}ӄlC֡ޣCTzFT.KN?-/\m??b=y]w\0Z_-o/^]73SjE+r)U!t'H*yXaPRsAٶaRʐÂ( ؐ"ITqJR h-~E(6jOͱMZ)5B#D{nqti4a^a &4Tv8OfJΧW5aK-tlHY'dȶ!Hrlja%@Dj[$D R@Kqtj~ z<)6TZҏ;ܢ>Pֵ6qۢj *m.e* %gzl]9%Q]m mRDs )@Bf`iL!y&LoP(ܖ4)%zyeswOc[!bss ]eWwXN{FqsV* Þ/ /WHn8غ+Z*~! qI]n$HoNu'Lj桒tFwo!F3iÉ0Ӂﰝ?}~BʻwOgW\]]1 ͯ?@Ђ?fnӑ;ݖg>}k<x`=TŔx~|$!4H<=={9~L#w^L]@򏑹Ugza6(cY/loQQ֙\*{P)}Dr=Z)+f7 i!B8r,heHF"jL5ԴP 9(IHjԋiQX X2#iCi)0ǠqF 2/"N;m-D-(g@A"iX͢%y쟾pac>ۺX6WXV4&ϼa 6mRJW2~iRpxF-lnނv/s%FXE"Qkm1R6h\:P^ 7meek[/'R-b\N(*HDv ,GhI4-/3.ڡ]t~i߿uHRafCN0̀!t@ZHi C{ ],*б?lFq4Vx5w!/FB)ׅU9Z*H9!hw0ѺkN*ѮMjT +կ9!mY+!dak"I.R7Tpni=lY{ aͨ*mSwGM+ DI&Rj(z2HZ=CH! JV^V3U jvX:dZi;׵R\14lTDYզ ;0*l-PMj{Vea51 -q]ۡG=lnK8]O?lpfݿ@d9.BcLG+JIvR#o&31&t(+1͎d5# )gjI֍L3a>whZa g鐪u]UK =R5%kjT#` (70?t݇e%ybYCkM+%-Y;E#iP_鸶3G#}7$oH(9iRxws'#DUA̩Ŧ,ڨp"z;ݖ_L7w,~z^>[LׯlYB@B7tmG3߽E/?̯6't[WDljy?-k͜}4[%[~ooon"dہ?}fЖv|~ʔO|zoEHv-E F~_XSb m-Α:\q˔'*|{|Z˺g(q<YN ku%e>x&BA[^#%bjK,LJ3ITnYyۻ{f -%%Y 6;~?5Ml9Z/讶lw$?R%\rƛVFS-%|zFI r>BᮯXN'X0aqCgDpjdJk+u@THH1HE'$9F |BԖĶ5y' z!Ù9 ,|šFB< +`N]:O}qYWW| NkvH ;TnV#Z\jC o贡(EH v)sN!+HGo)"}M!q{O(0:I ޼ۏS$K5 _=M}6W8Ϗ@) DA)Hޔ)!E[!%'+% áf4RSQc?M3v"&j(6; nN]b QΡ)ʠVsA ⑚ ~0Ve#@B!]G\&E+[N ) JJM! 8Km[7 3Bdܦ#LEEKM #g"06wN6mȵ4b,WT" *(056պouE nDbXЭ"2Z[ju9KYK\pڵrrU@Y"RUT TF#"%Gcl4OT1Vc\#U4Dl˴znDm/E BJtW85',4nQL5-oYR5Z(XxP)#z<]zd3GhU4KIٲe՚Z !zbLļ4VF$熆5MyiR22EAL7 2Hk^ Z30zU-T0۴$W`{r7(" iX>2W!B(r?6N,U)Z va,)[GZto @[$"TjS~lo>( yB*E +nR4 Jši$GB shG)t-t#5DŽ$Cm>d,#RaK/t֢AF)QfJ݀.TPFH,J8H˙|<7h"?`'P-Fe.*j 2%yr_yjEoQ"FJZ  Tu뎄L ΘMŐTmI%co)\-ϗ(h]g8<~f܌=9%TȡCVBbIygRIE!sLƇwĨ RZQpnK?O8mt¡F0R_{K? `rix)) =5nooYrd=49v8/hNCs+E\VK|^W󙰬-)Df@+5 e]Yׅ{qEXC#$iί_DJo8gƻ+i{Oђ0Cx klϪ;ә V>A4-t]tb˞ Q5PDe&v?z\Je0Cy15Gz|Ƭwy!J\ci'B(T 7CL~'a:3{=>|/贡֊~?q=f} ߶urpiUHzh1c VDLEDbBt[)Vj5%jQqB2Xt U[J,\qK<"tx"D+j[!R<$HmНEJ))r숾W`ZBYjiVZwHaZ1RA(=d41Έ""c(ʠ / ۢQۖϯ:I-O(gqqxnGیF[bkFYKmj3`mGm bb5@%9RR3O%sH]q774jZ P/GޒrjŶ`$0mb|:]B"eK FHBF'&aTPtf- =J >QR@ Gpܿ!.H,$߬C>kb>mL Ut ,k:яd)H +)r#FGLV(M[/`pt!/p5׊&CsB̑Ҵ.Q]"Hcb{Dh1eFII9ev(&\Yί8#5KŚ'(dm:[T 8eDaS*$ZceH͗/@tW0: +fhiF-oۢtmOꦉBitri5e%[JeiXeOCA "t .kpBHT_VEv0"jw! R nG \d:~B+rSl6lF|nljd?Z|$<=#'0"GiO=~jF,"A䧿Br#D"'l(D8 ߴ;JiͶJ-~f($"\DiڶεH }k^52,EӄVF  ;DY2Jo8ߴ3E 9,a!w!&2Dye:1{x}0 !-T<#]Ԁ3[I@:X~/%OSC˺P,Sٺ=4-ssi|Pޣ{Gӳ0/?p<+oƞG͆?O~d7nd|]wu7hѱJW?ekʻm;-3޾#׊ٙ2Ӟvk$^"&ӑ^iRxod TR)Bds{q! pb9/͛hkZ,_kj<\,#͎rj\ ;n1"Kn7y_d-dZ#ۛk&6~:ޱkl%/ւ2^)R7B^8"~)%׀_;DKMNZ FR0jA | Q+vt@,ُQƐ煘#j7ciҲ);GM .ӑ/2 횟`υ+ ~ q{\? i1 H"+d1ܼhE@*њe]0ViPTl5 Z=D5HQHy,) c;MyP8=}B\UVuZ"{RZBL=I=b[,Bdy<1MTK"_ɂ]b|i{T#I󡒼!`e] RAVflİf>>N{S%+($mhuC=9c:%cnѺ#ҍ+n1Ld?_ȥ J&{OӭQR1NJ>Oƾ蜫ִ8hn8#SF˄nZ2(ec*nZD+Lyh xK?ِx}3zhj丩S#"kOx2]}.^Fw\q) Bn+Q;$YԄ#%YNGLߑ]Di'&iq9!b gЎ[sM)_ GPq@qvMqVP)(b8h6U^6|8&py C c{{rNtMs%==ҵo޼DHRuj]m!.#Q rLܬ|}c>&Dh(%- <-gjtb~Ebb I$vO ^q>Zq:) !~M_cɁ3 %4 tfݣ~Zi.0x0l;RtG 3m9MgZ޼թoVMC?dټ~,5nx\7|2a9m+>aKr,EC|i,ǧgr|?qv4r_>#K-Zy@ y4sM" k(O(G_=-/oO͸PӞFH~O1{mW4_``I3ۗb$?{p0_E9U%*:)'jĪ@̉h7PӭF4B_ab5ԕh.Y4!+f >UAUv'(Uc)`["Hӯ⇥%E %#Pdؾ8O)rt[\(Ȧ(q5yW ^&mjה1`GnH(J)/% J݅]^ !Z!29IHK`J.S$&m2uk"Y-JÌҘJ%7\9#DIbU%,IpԋsӎE i77` 9rQL3Jdr+18LWDLXMTC QA]Tb lpH_1e9t%Ec >zⱫuޤ1aE aӲ\5 <igbxWֶGRU'Y.&PW)` -BKbf!<ᦥn~b>?H)J>"UӉRtݟw4Y(Ysk,5zC+5R)dӠJv󩾿 Y dAC ^xl CZNѪG'-3IS8jv]Rkyk1:"ǟ$k'J4R*)DP7S$QFrA s /]O_.mGov;ܾ/E[H !E!cd9L v}QEj=]7P8C" v];ZoWHV1Aߢ] ~vu;pGfW%'r,!(Rav}Q8ť8My/{Ђl;tg^vn@ksX0n^`5%2<~3z mH5߼c>Љ:5WoWl>ΤyHO,Vrz>Ќ"@Z8sτ3f5!N37* >ikrI!7 >F IwyE3ru?=?|Nys:p6ur<[ЬGӅ4u t:Ү:(ĒsH}k4˅X2oitF#/V.9p<Aw ]Sˑ3,G=azn>}Uo9O=c=O#;~9NUG(to~`.ER4MGvk_ӉB`(°Z]$ZCj՘-Gj9D֒ȈdӡlZhǁ)J 0b%渠EK)[ ӪpqJXiGgo)"GbkknΝ(Y_cN\r!1}G~(92ro%"S{k0d{%: ڶEiEHpCAKE3dE, t$tcݐ( mT`5뇷$?$[ŚS γFDWx. pԕv9YA&lzeVe[J.F4~5`- _?i-H%3YdP,)Y,Nc}Ê(Zsԁm1\|~(|8#UU/y*y ED;֋t5=u◕lq˅aΕ#/uKH!i2~0̀4u[R ! B1C$#Y '$%R˟Ԋy* ];, VuAY0.RؖD":m 鈑9rt][#1`l[Uؘ#mB izOGNLD҆ r{nhS@w4 (#ִ5@7yxv_naVk-R5I[HfMp5*,P TiQ4@,ӧ OXm J^f*cH~>u4f ;鄔P~#Z)bXHQ!d͆blN'zS 1: tk|Hc.JnFЂZ毿!E;Y\)o.0->޾e;oH E=~>nPǘaj' QDr8[E)뇪lb0Gi vy"X7 ɑET61̀CtK̞(nZD?o7ϔ1B"S2_%{m?nI 9:Ӱ@^!- J+i+i!+$ƨKYL3OסAӌ,B34pyZʩo.  %붅u!}ju+7\ _~MT\3i*qQVRQ;]EhDVQxEK EMmHM~H-HHaqZfߐr96k^{E#w[1K޼{@`bۓR9_΄l֜no6yzn5##%h/=ж=?~:  B*.q@w9ַ4<>%I J)bf2My 4_wQm:2a??x>O?˟ ݮ^@Q"P*IۼOc"JF"Bb/ȐPC 9R ppX1zTwqQ-SDwdVU^m4/ZKFD~xO(kPt+/h*)HAgilG9a6/ )ajD"Hrmף[epa!R|FFxtCtøْ@ePm[Thk;g=hD#!}$< EEێ"d5Oc͜31e mHINB)!܂Ԋ,YR!a9{k(SbLkd&4ahIΙ8G}-8e5>E iD"Y}+ Fr: ,~h^ UT2iD-77pfEʅ JYR.(i0D\%)C(FAӮk L2VTj|' i5]5YHRfH"ŅΔUթ1Vz"9rDZFW1TL`vHIuۤ*VBInY@TUӶiƹi-6-RJ2iA G J#jYQuf$dX}uG4]Ewj-Z_{̨ì5C!-RBQG5 !* _%XȠmˑv}_rfXAɲu xY*ld"3BCcm5njҖ[A ar l_> Z{+vә1p:ᦙeod$:e<vXlH٬oXbɔ|apZ&goܿzQ?qgӎ"sm _~W/X_G8#PӇ|~z[ agLF/(ӌ6 뗄0Dlj$zkqرtCm[ggJ,4Jю}5@rQf Ӭ0=LnV`-JeeQJ4wL-C6x-/#*,HiLɕ-S"A41]=rI>Wq5NxٔYk!Q-KRЋ)%Io,9R(qU@ሔq{:|eR6w\ZCTk̦]ߐ|"IPr6,2%F\ZyDO@SU," \X W?FՄ+my~+C`7i"`BwPM%(U|GiY!bT E|فR@)3𧺆-Hz|9Lۯk ъ~GqQMG6H\"J6䫟D #,ᑲNsc[e,%L3~\ #rkT}_۬YFiΧBfᖜBHXbEs{~F[{b2r"ԅ\"Ȇ+mZk5\s3;jnZry#BB\,>\ZS8\) /S& V5CĶ#:e>)chwx&H6C?Q >#rJCpݵG, K 'Dg·>p.@.tmc]Û7oCǑ#V \`Fh Nn3͚þ_~ɗϟ(<׸B" <0nPFWi0OY'sێ=|ny1B rh+CgP/ ϰ"UT4,ѝd1L#UwkBJBЎɾ:4Vʓ39'ƛ{|\4 u ÍH$d$m5-bPB/ ~9PjEi.3"\V7L^+8l۲rpvE"⚁E"nvuigZM=)I>r9>}xMRH8"Jaqix^-JZ͑CJP{zZ |cfC[tJLoC]*rrL$FL 3z\P~K^z)>qIcz B`lPJ\IFϻgţۢ3vqә]!rH,!i,U2]S$4Y : _ޤ$9VH>|RQ)S't%$hHF5Y晱i)F*-IAJquC~K}`XL#yl*T"maPRB@O3RY^0V}d9BEĠMTXki"BKRt4J"u"&Ǐxw5Un,i mۑS iD GLb5*jXֶ%̞XJ+d kA%EњD!- R{Tlj:ٶ# ')Q}}xX2S _"L5%7|iV+\tÀBrgYlWGZ)G/=}e$R/'y~4$4Qj5L#c;дmMˇϵC "'H q۷.gӅ/)4Ji;|wܿ~njO_yUA~ 7߽Ӈ|#;y?e @pˉ*&>!%j|8r983dnn*J)8xY %2Z\?˶k9NgÉy;șO_.==/)}}w

-% \MeZΌ7+#XvԀN3 x=y>#4`Fd˂iVdF tK <GQ-m[qzqex>!ˌ6v~-Z(zD$HssCgⲐ:C a,RB1)d(p3F$,.gZ gdfo)١Q)IHv'ۛ=A&RfuB B}{S1l6P'D?QMCӵ{Õ$T6 H/!bq)BbdG yCm*2zc M0ό]RȨHIq0ƟDVGF B:O(%@ 3ۻ,9Oo9! 2kt sX Z l^Ĵ1V%k2TfۡJQz`FGDI9seBp)QQREC g֠4GcLtfNgB RӉص찪yv]%^bǞ9"ҼRa^tH 5]&>?Tm6Ƣr:w={ƦLJZnJ0/3Ͷ iTvkƎnME_/ %dnOXJJLR$R P0]vlo_!̚,Z \KCG"cLKZ*+|Y.qMU:w)J"m_R_{mϸ"hko q珐5j\fM3@k\`:@2g/5"ӵ H $À?2b&ЈǮ&++#2׼jaDvﻞu2Kl<_e`\FME ~{{_2-Vlxx}*$n_ 6\2/޾an6 ?{W~˩G~qȫ'xpwyXƉV,D?~5qSnJSr>#COb3iΕ:bEBr6j!D=61RʹD&脉%+?%hId]2#JWƒu4'fW _=Zj[(v#$%-ʺGDlE=){HK)'D$sp,Z٠l4=9DTp#i:lm ʞkX)pBwU|iJ,Յ"iB.#)UX-ٓ8;U͆yJJ. |-!ol|8RQ \5R\ωcnpkO .TMJPK9D)Ħu%JHR`[0w)aYȕ„ȊD a7ʚ n0FQf˺΄n(mPMhj+`e&tg摘ME%<\-HڠmG,qZ-s5r. !jSz.!LKb n gK?q% |D bYIFr EJy8^U MG B q0r)'BcB5)$dݠ!nijXa Ȍ#b Ҍ[Yl6Le0(RWt{-dJ'5 tmz!GRWQ U52E :=#5rMQmGr)^}Q$hB,n߱ 31BǤ a'CO%GA+/޾P"M[s^vM3͖axٷ>_Hvk9SO| cZ\@ x;=ԓBO =!< nA*M\H@]IM̋tM0m73!Ԋ.~o8??GIrp9#?7hoxyVL.F~zQ y2")5i@JƉv i;Ϥ_m ӰPmҴp{sG~%Jkӧ\g~_O#od/^`dGO,{0MgMrzS`:}!szd%5S?Pu8Ӛ|Dm*R@ˆ훯ȡP=n[o<~D%- _[_&nw.="aǧ? ;|2g?+pӄy}r^TdT+¶;R,jېS n LՑYDmI4i@T%>F8? HyDu;(,6e:1=uwX-sƉQ$ #+<3[Y&BLz:e+,HU #*&ElpCRX.hk*i7-!ΣX+aL|`wn>[Yhs-3mӱDw&1qMúL5zS#-vN2STET>!bWS=ЏGWCYiw;bJnt!W~retoBQZWG` E&ueTNH)&5>RVӅ4Cft6lv?G_Y]GT zݢSDZ8M[[6تnYBYkKpD(R Hd*/!2LںC He2ܔv8tբ a-$e9F#Bps<R5{t-$1/Hئc94MD^;GL[M H@ DJXQզ`vYɢw$ kR uGv,Du- gTNUID2Je[ћm ]čm|ubxjg&څRO!S"pLյ@@F͒dm*fK )z 53VQѬӑ۴Ht*U3C@J R㧁BJOdxGDž︜g*ɿy_ X.Fb,:&>?~ƴ 뺲l!#ʛo|-9n%%wanN=/=o^| `FO|%~i@ _| CF,~K9Slt%Ǖf>q|>%)%y%k9=U-*4>!3ܾ#{OИy]{2>?П{iԣ`I -gYy *ş6+ѕ2JenKrɐ\UFcpTm Y0#fjt:ceDlHB2=>VzӖ:LGHЛ=) \"%1YP!jZw(Ε1%ÞAK͗ ))glc$!k%"ꚛ-REn_6\%rK]k,:!-[1dR\\&ODmFwc,0J&:D"XL m/,@@%|;MMJĶ;e+톤jPk-V[찦!(B3UH)FRԨʖ3^Yn\&3VjT(9#z3@*E\9'Oն ?LAUI3\%Rc@i2@d U[2-8V[ -!l*VM:4)c%@ųN#ڂ6 ZAR_2,U t)Rp%vXSrBX+BZ/=^IJ/͎i0Y3Q ĵʠoD5 SD]zJ eLs)0m"sUlv{o/)y|Omk3- 45?4TM ^*ʹ=>Ϩ[yśW՚_mCī7/Y r'6͆q~S~|#9gvۖŶ .?~zZZPyLn"L~ͧ3vw>}Mx>bvLK_/8&Ȓ/7Ķx[ɗ,.ǩ"/?bg0LË28H!ؼln\8buw89=J ~'|Ymi?W_qO? 8+͋{>~DJIҲ14Q:>^][S1ԋJ#gQ;6 _}KXDZk[^ȲTu΂/->c*M+Hm {WVت%qF*W&DrehێnÊdlonh[DD"8$Z&T@-ޭ%.DcI [1bf[48P&9u#)1FE鏿ϑR1WU*KFL+EY&HݒcaooYiCBRov8ݶ,7c"-R)(epYWhn; qL)]sͲg-PfO@&YtÄ \9xHeE IJɃPnmGOy-9oc%^)L!S]=Zґ-X0 GD%B! RFH [i%Xց*7 ޒR`> >\Bp#$98tmDNȺ&3(Q2Ji_Po+Bml3=del4`d-n-B G_`U5>YtQ/pS\sߣDFhMbBH 3ua %~ -ͻ8 ’떸Τe-y!#wAi:~_;BTUiEZi8\"+A]Յ!'Ry,сU, .C@}{@]]h@mXAPKg"-j;Ha.?DcK4Ӕ^9#D*  Rfep -("H1M4<ӭFkSV`ɱy%B6-˰u6uj@wGZ~ pWs)ɶC \z 94ّ&}HV@e,p ˂LUTqYI"Yfd[63P}4>?a@fA }*a%Ѣږ*ajniwSE Ͷk33#\.gn{ULOa.+Ëyk,wBAIp>]usyt é/ExLΒس 3ֶ=JH6w>{S3LE0}OhdCs!D8N| x_(Rvͧx/?݋;J|51G8Mtۖ{㈭*.OG%O.7XZ1?[O'Ƨ#9r<yn.=7=u=yNGx%mrz*cii>?;e*8dѕ|"GW?GiM_W|zق .ûwuSz&0}0$Kb2" (hC1 dAL(fkȜ.Exjv7p(};h?~K!65ˇu!{}"4 nnʢ!FRϗR 쮬ְbgt%!2`tj,:gb$SJHͬYIZWvLmYgH!V1"Aj`>T0KdZ0ǏLɣm=ftA1޳=\yԻ[n4 2:Sf QTU_!.Vr%Tnj#ŜMZ|i݀E0}JbVSBZԶ瑰.TUlhwRfLۑ#IPf_,%T%PU,+iGKIRh9+>15篑"%C,!ơT0(!R⽣7ʠC*DAI[:!Dcm .Hhj"A֬t/]! Sw;(k"auX0@մ#TE_uאDp'vKp3~)Ҷ,1exĨ2tBą5Ia].PdG/mANȜt/D(Y6!:VVS5!*M %q9!"1r*]-Hn1F$1"FiTmIc"-CJ'gOl_d @k B!! .KRYlWݹXC| X2jcټSckV6&i5ר`u!摪2QXEV k\1s $1ɠ(~ҐR6kAmPn =mXhSVޔ<]JAO$dX FT5J_JGQ`2X2X܊PY Zt%жb(bC1B낲-DWmpRwñb*=-qPd2jBLDz!AڪEBH'55{6w_܅,eCclO'/c E B)ۘ #=nH>⒧8nX",4lF=ܲ?츽A?-1l7b۶+~{Tܾ}E 6 sI EpвhΏJw<=} >rW43LR \3۶}fwa˧'6 C\1r36lWirb᡿ IuCյym8^nw()86+/XsfGp{w|2 ⫷Đ.Iio]G6w6Tb&^zV[̦a>^8HbгpOfnH[s,Ô*%k?A/)4l9>QFsH O?]ߑc@(*Ph)VjGՖݜVS)HHEV~N-T%Cr.伮SL1%D*/պsX}9 3.b>Đad{=έU52QٕdHVx2M[FQ%כhYDqUEr=ZCt~  bTך&]nDf:-!k|6 !" #k?{F0OS<P|ZYGt+0yѶ" QI2+OWF)TN5-9eRH"!f*S ]zPtlTUXP?=_bƭkN~ϟy ?o #n~767Gu!!2rVRu{8{R#қ臂Qm7l4 |? Kf%*,VEcdn'3K vOza8?;OuC?OH!%OmgڦlE]F'k 6[\M)1m[9:? jPK(ҘBΙR$Jdx|GZYוmMUm+R%I. Qpӄ+t-$yP6haql}ֲ`q׀V-B9@jq}z2T-ÏQ07w>s~~f{6ڦtLC5-UQJѕ愭;_ץH^K>rVLDe*bu`UtNl{q*v*KQ`L0_z|KavTx!6[eg`Eŀu5̌Q PR2 Uݲa5^QJBQ 1-$eg"&ް.!ΏeJv Tmk68J&R!B,_3HWCq'#S#.=J2QҹJ&~2 -av$['ig @^_:ؓyw J;gG4;L]=b $,ۤ$)ir@o6([b2!F*\l*Ta"94f 3JZdJ_ PhY~ei*D0#OBD #%CT #9,X)#Mz-1X."##8y-|1KB6,ZD\:̌jYҘˇle#rg^ߜ-k=>]ޤH9b hjl<-H]04::%4 aNt}ESCL)\V1麮NU68PD=8iX 6s}_c\ hɺPXDZYJFٖOZ~A)qs[S! iEJ[9 AhjPy(y⟣eupp:gOu y(Um-TdjBz]qB $QP p2 +˲p{or=W1j,OI>Wu t~G7kScE!%"GQ#VҴTT n{KtseZ R Bm6[ */ -?мJݒۀPKN#6B{Ŷ"u5#nLN+v " c~HU/ޓalݎ4M퓤HO~s\\ zm[OBB][=!h0XMSDnZrwZ }@:&2Q^Bi&=T 8ϰ\)E:GT /g Rᙸiw2,vWܪ1/+0}x> ӄaawS`8]h7=4UţfYv;Jb}0."%j3y?j2_>}7ȇp6q<|#_>~+_MO'ov|38Oy)Y gpߡ6-y`s5$D,vLr}Phڎyy;{Oo`9yze#~[~1D)]]s bcx>(>;d-N8 QJ8W^ׁ:L,5-'uu*mp+\.}뉦q=}B4/?#oӏ?iZ޽a٢R~i^}xl['0@ݠ:U4W.gۖ2az A+.ߓb:\1U(~e6 ɲ+oc h-gR@?lF%ᕦJ5hmC6d"9M{7=eIM յ\Mߦ_9WXS$d온Dh{*K~B纪D-aZ _6;l?^`k;QƓH"QIǿUteŵ4|eZhNmaQRU_=~4bDtXJ/fuE7=1&ȁۘ=0O(e1!uGHpMm;RJ!M]ۦzis[BZUĜRCȱrѵ2,sݔyuaXfR ֑r Enpa)hP°#v[D.QA(jO2ߠDD)-,F6_5g-fgu 1Zc{(7ýAX{VjBF&)]K+Z1]_Bמ½Tb_ 9_@qn<^y0MW:dC+~~D{^6I|HU_!g+dDd?knƩrsy됛2C}+UXzXW 頱DⱆzsՖ~-nhZ ɓGشW+Bj@C!aѮi6]/M@#e9bDb`=Y90yR) ?JZ'_h#!{br:+4\;']2aW_cl 3͆eZXxI~;lWle"2/魫c)A uFOM ~Y%af]#mbDӧOt]Ϯ,krx klǷ`\&<_/<3Y˙}l5qMxĄO83<Y:~?vE`6-to_ӈʐM4=O"H]zA|Ƶ 4}| P~G i4M-o-N_^.Z i"f6\()4pϿ eaUTwə>22e2NƑ|[|qݷO Ƒp/e:GkLf!D}P!.pcp< X9W~4gZ/ 8 U 7LlHSE._>awTA,vlu/lھG[7J1c-MgYVڻ{rZ#PP\( $>=Hw}aJk/gD1.@BKEZ_G6نLP#fܡv;bL#j,D&3xyF-Shr}p r݆3J7Xe:0+FuRbY#(Z+E zGO`*!$-CvdvC  Z!j CLanw?bqq8UjSZ]u7ID!: Zb#d ጶ>jHƶ 1QDޓԍCT_Udg(Z6a[TQ쫝JXhIaEPvd5/&BJQLuH)Udt;\\O 'SʒE[ᑸ\a$8BC^kEéV*9DŽ=4M!c"޼[Y!]%PW)݆nPpZ^NH(DEk*gV~Bt{TY($j6xTBADA VnIi!RE1&Ii-"aɁmjPBM%9c+,:(mǤBoUkX׈^cE{O,~W_ a^V!b^IBHy!,0Z3~<~ k{D h3QB#lGZsWpªjҖ1Tm[TuFut%-3ߐrA6NhuAHi%R,du.r#!#0!s+~I ElT*(#Ʋ{ͣDdX}k7oJzkQʰSXc~e^PƐny<@Xo}{X[Ԫ⿗u3%xEΡFT_s3|@{8ݶ'7n" 3"y(3/9_N#lݲ9'd,x`V5:.Frp"J=H/v{_F&IIdES-Yt=@)f7(Wl$JGҒߟWO;y=IKݲ 丞i߽i6-r]۳ysH!E`] )&̂axrB'M23Bȅ>֕,ϧͷdxG^>}awק:z˯O|ϯeO?~"BhL\_ِDXg6}5fG.g{0X)ϯ[Uׁ7oݷm˯?i=޳ 3Y.ϴtߒsa0RẎqhz0O5'8c\'0ٯhjukBdzo\Cݺ2/u|::pzp^%'" WLt=~=Z̸r;3Y zY+֍y+\3M#GR _1rfGb5OWBp+_%V_/ (J0{#\C+Emh;%L (ݎv@)LDb3ٯ>$AgqgPjCӀ_%A$Z7hۢs` H\=Y h"̦ !rAێ.8mIIPqֈ ՚k*@+1xәk :mzk#9AJ(T,BA9XdĦ߲ Z:|(ut0ki\-uBH6;r0#nj* 1JaFDH=ZX' UU⚘QzZjY#5Rc{De+eÕuQMG)u^1!$ N-8dB-:<ԭM+Uc[rǜA8%Q6JFjŴ^F;|NW|۔Q5ع1x@C6۱okSdB A3Z<405vOjc6-tP(sc *fW Y mjmD(rJB=R=HLL"SdZWvsXB~] )"OE(,,-?戟 F"oM[ߏ8,g;bĴbTp#_&J.e~M(#6[nK<_X^O%%kٓc3Q/9̷_ 4uH)B홧+9{l K$kL%dT/4~o3V yF[ALJXh7 ~X TGu8\OOU05J9׸^ZRӕ|h*ɔHC 7ֱRfKt]ZR(B+-Z*HUtk*ILzԭn+m3nC 9ZDM/y+9JY*+2эC0XBV;R4Yr])DW2L2H1SAi:h EA`NIąiНc^)) n&##R lfR4`{0"U&wƏ 9 Ȃq8s| <|F;THw[.ב~ud+Rr:= X] Wog{80_8y0:ˇ|IG攘ms./g0 n:xJޱ>rkG}4B<|f˧<> Mh'_/#^v|D"B?)qz~¥Ħp=_hږz)~F 8ۮ;>~=nC SIe8 ̦#.^5#Zװ*Y~a %znQEsfm0!3yXm>'.'eZsWki?ɦ%q=Ȕ@W(fhZ(m5Bj BRi#ŅmgldHh]݇* X)3p@RFQJan{=a lޒf n0w:R%"V4E3 O5ï*uӷ '0 ,P΁|!}Ƅ0e 'nS1e9p^j^X18j~H9T-#S´}^QݸixBe)*QDAhR%ElS9)&ղ\bTME qeD&Y.' ?{pB3/ QJ sE*RAؼPrm*iiwwH"ǷaEXQ'P%qкg-! ÕHB@Â4 L|+BHkn$ϹUt!/ N9ukix.khE $]6FJyEG8G\:9B؞S\ ڴIG@ *T@B"NڢTK1 *qz Ÿ*TU7?2aa[-?|H^<1<}oo t:?cdswdw״woOW,a~tǎ3q  4.q\8ĜU!Xe%JI|=q7Ydt:2_%'P7u9s; irkaܽ}òx԰ Nzz1Nxni13.pALGbuiX}\ۦmZD(*i5Ji`]f2mu S@]}X QP*M4_QEThN7vek<뤲RyaEV0]AJE EfZX E1=~f[AJ!d%IxyXIP%G(%2{0ێ2]ko@ko2QrXk6'VG!Uay}~YˊN覩Փ=GF(趢𖸮*9TS5Vj&1,e$0ebBkt,/uCt,5m5V#%N-)LbqeAm$?ծ˺yUHa%ru+t|PY)P;T?ed Yz=Ň_s](&J#ssHrx@RE̺Zf5gG 2MvԂ4MR J"DrHێLaJsY$$B-JT̺p}L1'ATbV%FtLTKB*8bu[y~:ZrʳL#EHyozό=m3/\xww/O'cM3B?RNN'*"˼rNHk.#˕vLJ_´pra@iosN B?OxnC*0+o)La;< rp՟:~f 3n_7]ױ|n#Z6H) )%<uO\<b$:ۂS_GHtڰ,3|^h7R)9cwOGzærnc\æmѭw/>9<3. wG{ˏ?J#~iuU =~PR5-R&ĄQ!Cm[b-ӉPRb#kÎחZX_[?STX#MGR,$)P1H3"b"|RVAUJKuLhZXiHJu(C $P2DoXH8㰮e tJA)b|"7WQ?p#p4}WZ#($1B _HAAqHnEzm "ئ#~iD%XʠU=) #,KXFRF =هJִ֥AA<OC8ȅx_}8Ji|ЕYg'_\ӱ#1!q!% VaE*UGRI4# n: 2^" ʺ=^Ei)לƠ n6i1V6 dB#)~J#+9.CZe{rN_HD6niTrֆ2%_ʑEikm-!E:W/0B+" $YɃ,+>.QP HEHc4ӕݶ%SQ"I ZZBע%8Y ò<}{=o-xnrhj-,|9m2G(+q~E2P\t2+5+MEbyyےc% %ZOޣ@B֒6fv6WlA(t=Ӷ )R(/U>y9߳D_m}1j:<0=B56jiE4 +v(U0׋ 75|4!TJRqc5R|v;<`Eos˘91Hyۚ7m KP&JnIU{| k P$q)\QAH$)E"x_͆L<>Z9ӏvE7:f?? !=)F֙Lq%Ő xT22CxwǺ̀{vp^fegGt1]K g:$ϴ]Euػ$)`Z63͎)Fy *%븼\xܴ)y/{5/Dݓdy@㯤k>^z>oH\.4R8y`+;x:?U m3Ǥ9>>0~|bYW˅4kp-ԛښZϨb8̛imD)~[A[v6+^8dګ[Ƙ'a765ZcXXljoK><O#/)֤ŦaG͖kH.9=vnxO()3 fqi83rD"YS2ic8ilw=O㉴t/9ΨLKӉ:xc`8Ugo_s<Oyy=/߾QGT^1nqq9ebH!)V(N &2M#mO+._i6?_)Z}Gh-E*N uUjqPsiE(S1RҌr{ R5mʂXV3Oc7X_KRYJ^0OVWk D# H%ثjIu",c%V !pmG\fX5#1GL.c^gd XW p9WeafO:d x?[>p;kN3>.O {R,,EBH+hle!zHe \'%#E}Ay63s-YGcT~c Ir*cEJnWDA6=)DyBj^יJ܆eON$)XjE+TSz- UBRt $ƶѓÄ!hP %A)3Hx\XB&LHn6=2r|> Smj/FLs}@B +]g(K ͮb 6R`Y !Y1BQlww$UKBdh+k%pCJQEs8oBD$ci1a]ubB5zOR*I(@C%ImH)Į]^4r-ʒ1M rCۗXB(4t8N(5䢰 -T0$oŋu-9%e ۵Otݎ2nIX#9ĔRt{a,I@XWl"u7%-HcXc #dQѯ5.[{k("a%H rQғ̺$Y7*eD5B2R躱R, ##zX%3RL#f[F^>RIb"u*F?ѷW覒R(mYSHǺQII*u; R 0 [P*" 0HP#t 93Nlv)`|mqpȻb<_Ϗ0lڶ?͞OllB_Ï?/O8=|`F|o{3wy^FQFs>f&c|92XHBgyfnw:OX~ D25 ܾz7_}ϟiږvcpxxii ]ӲpO%:d^`iDlִ ySO3JE @,Įi|< @=GN'޿{GΙeYhGX=]WZH3"y̺.}ǟ7Ï7v2O 4RnT<QB!%QJx +oi%fKKQJ AH|ʺRJ{JE:ƀ_ɹ[2l_ N#Ed1\X׵zNB5;Xq`w}@Hv퐦Ez1="tG//J@ZL~BtKc!!`fd:3|\!by+r?*̲o0;NX7R Dݬ0ݠFj=ipBDP2/mOmjOnYѪaJ1-aFJag{qm~zwu,~%_:X2ǧGnon{\۰3ĄktÄͰu>L3RINHXrv, )v+>8{޽~#H͆aN1jǟ+>~8۞5&^}ݦ+⯘#Wx-Lv_ڶ%KL۶LzxƽfM 8kV`\Xea3Kt L1d +4GI!̰,tH9$J(g)1<PJwtmWQ1ӫ5vf3V~_᧟yP^W5_1FS D>363e ւ(nu?˵ynp@V8P r:!׵Waʶ-EXֲ25!|F$J<"%\I,!JYD߽$Z@4(HB 8Xmn҆j$&@ >2 Gr(#.ވ1-mS(i\m i:Rnw^f$ !JjUX%B9^[qRK[JB\l"4qW3L,+:ڶx|B+3i(J`$O+J4B5eE4]X9ZK1!m0bX0:ˊzk-Y'Qc9Y3>@i/bZc5 x?uT|+-%ʔY%utMG 4A΅fGΉ) XJZj%DuE]pƒC@UnR`LOE`T-:y1"H8DYRe1p>!QO ]RB+1(5 |(2YGDTT/z.*TuHÂ1X7JiКJ4hh7v |$!k9=,d󀒊rtTHcMt-i<ݴ0,+i1-2pkĔhSR;X~6smnʦjDh4méz?]` %ʺ`%T""R\䂵G"(ꅟql.BZ)Ӽ -BXWH#tBIV/|oYMVidFo~HpnOΙom~ஶ|_qp&kϬ'p>7<Tv˔"L? 4 WGR, ][Su`ks?!HRa<r ydx|fk-!Ug$u`zD^+Y0嚊k[Twv8ni" IVb!Z\ӴW$VWz08AQ Hv_ⳀZ:\62O햼SX,e0 z5ȦdQ/npD8i$550QC O\6Hጱ >\=fEmOнoFeR AJByHS{8Vwe%H"kSVZ6)X=@eYGRMFoA1~Rbh#ů4m!#Z2"%QrƇU m;t٣_2 =qj_u6 (s޾BZWFRpk$fy~mp(1#M!@ -N[HK]38`mZ|Δ9m[73'6WAu ))B't(813J;`:[Ff#O+h5Ĝet䜉%L^C\P\6M%D]%Ktۑ}@KC6m(LAlAD&k1ڠA ,F[LPUTrCaԫ\߱`LyFn(=4N_#\GrTGXj1=K*#UshZ&p|Uv5BRLiL|$ږ8zd>0con.)@|LtiŚu,3ߠ]G *2 6]w%"D)|u樈t"Mo)RV0)J|~otmZG㧈Pv|ç/o\pu[~#k^lW[\3͎3JJkH$ i |ypbws<\-4|Gp_} ]!畻e. ݋-݋[qb{n~ŗ{~O>f'~Kijs""O_F^yt`l<4_0JO, uiYK!=9sbg{^\ߒS"Hu;ÙOӑ~w/'$% i$y͋[|5l6 w߼Gg~~wSley >~t%q`I~znOgmϨçGڶ|>t:,=/+V2GL<|?~f44Mgu(Q)}pae'+ KiWg'p%۾'xU wx||?wA +k#O?)l%[ |)- @mV"J/3Zœ"0-e" W,PAX"Glez?`4 (2BU^G;|P4FYY=4MuuY틻Z̗%O]b:hP3j[CǂLs_, 󙶻EI)yx&=eYOt8#mK&eUiLJ)>3BJ"$%5=ʒKZPfL% P3uJ,s#DYE8W"9(X@5?GXq>⧊^i6ȦC8!qPLװ[橚 uVydNo^m-IFJNئc*DFDd,@w%Z 34A(INr&E`M-Kښ`Z̪eDLu IZ+kXhW8#)"R5 a^x>o}}HbpOD"(JPrf+Z!Kr( 2)6+))ڠT F 3!,ئ?IZ#8@4] BPD3T5ZJВ̧[ŧ*:#ˆu@v ^ L~4,\x hh7 B2gt2X8'\JuF \;3ÌUI*a@< _eV7O*Ē~ZMX={B0uD޸B ?RρkQZ_&u]k8 4h(n+nWe)-*KP!mZZ G5b+#Vk5)vKNJCYDDۢ!m~A @LG/HaFJ Dh"SՍCK!O Y/ñ>/Bh) EfD~;_dN+:TwT mtۢP(JڢB+RH.3(TOkQuӴQ2E$DQF/+Di_V<;v଀fW>2< Ve)kmšxVtL+z``{вgtӐ FvF$O~[=$Fײ:"iH,3 ۵y!aנ 2%pdOخ`eEZ[eu-XMOI9L%]_3W~ T_l ,~qļVRc f9I̗+4%T$8) |d<#eAFb|)1;&TxjCӵ3~׷\3'´2{w\7~gR|3ݖ(2?}B0Ҽu3qf^gg޿}?!5H]e_>߃VLX7ZRw)9+>FJ^{pL?˿ BW~[zϴLܾHt'ݖtqr}5K u/ D^EHSܽGڦ% 8<>q٦*3|;ΟR3Lj k8 #qXg |y|d+oqz>У r3)(Y&kɲ,|}Ìov^ ǟau͗)15$>?=7߰@mDi0Nk`O4 ?~黆鈕y])b$?.;bT C~W1J6[K'DF0€kSb,V^=)WIeF"k6ALB6nZ:@U[3`tO(BFdh7=9ՔjG R ~= - ݰ*3"vƵa(eWfR->&3':wKŒI"*vX,(*b5Q)K{81=x͟a5Ƙ* >s5RLŔB 5WB@*9SDPna(8L(%(%KEN4oeLEP)"@i_mA:ܸ ~RX7lH aδ.(PѤ"xBhk:,g֬>0MFiZWCZA:ziGn, %*XviE*4p9ɑK! 4!%B mO Zi\jwH!H9N }(^$B`m!HY a DT ~5d+U{Z/Ro}5y"qo_#r"1RV_kM4w-%B0O9`!78Dc qXsMKHcX,e?!zJҚ V+1KLX/e R\9{0"v&4)!@R365菬ed`9Mt:(ˌ4t/_Bu<DFMd~&Zn2c-{|ug*u,h(E :eb3œTA!\ i!? ~QRFgݎ͛kqG7(Uny-1iAÉOkb^|ǁjΧ3*KքDBdW;֧chOOǁ  /~h+ADտq(5qo3 hݻl[J׷4A)5Dg~>rspzLJO抧F-c^yKLi+-ɂ21t敇Om8 _!m7ܟ1ï+b\)V3<x5k,ǁ5>G6(br{Ŝ#9^7|ͮz;B7퇟iʛ5?>?#|!ӑ4ƙ۷ >t7<<y?[>!%2Hߧ\@rm1׷ > _ͦ>y kwUEAJv P9^C'kp":N5ՎZ<ڴGrΈRVKi7`Q,SO]@#86É\ JWbSLMDzzmӶW]rwok&3<"nIEGzPi(Zﱬ$3p}_%#bGئڱ*G_0]MH YT=Ȅ2uu PvH~H@9W-H{͋V0(۠?XYMjzg 6g/3X*,b5JUġim;.s(&Zw$͆{T%\&aFxyPZbZ¦5l9=?㚆vc|8CDIYumnwh2#*m<0-d@&Ko޵羯| ',3ҬRPR̕l%%ţu,~m](JkS|>0'Ÿ* nF(ɲDu՚^^_"3ȂT)ʡdٟA\*'٢"+zSM LTJR0O9,MR'pP~K Z*zC%| [2Srbg6v}?t!IAJ1OGٳB@u.!p9s4E0q[YxX}e:_Rb$ax9!I4R(.?︌Vȟ; Yr<23R*ΧWf_q8ɼ<>6%Gp>x~tiYy8lv;i8pvcws]SINT2aG/ EtJ?ÞMEk+B{{_eBdF=a]%N3xrF[Mp3mJ|<;¼Ю{ڦcGYe#.AɅyY\SLe)MH*>izNW!z5ۻ[^>}f}h47;Z+3%n/ϔMcFn8 rDȊqofaL4L2-l6>{?xK<LN\gɅ99blG֖rz~h5qZcRe1}%s-Sʉ,U䷽g>1{r3g{y1)f)cmO\.d?;Lkk,b BJ*1)[RHH MYDEJ%qm/,mux4-5"<~_uc5DS!S%R\K kzD@DQjK٠$a12LwӖiic<^7T]cAjҶ" 9LZrWdkN PN)cA"!T4]pMW-RYu-:BHXc@T81ix<$D [BZAY5$hW)1VYN.daM-+)չPD!  P4HPhb $Q//agL@N )R"#gA E(#Z& L[#%dӞABa.k RDYۢ$t0^~@7([c=P*WoH^e+-JY_P da"JT%pe^B! 5zVBӠ҈$)UҺPR m 斶[ m έ)~"L'ǬTB uCR<| wed<>uScA5+X%z;\!@')r~yW]%M:Ӟmqi4%\BcwHZaF#%]/aB(!hW["AcrEǦ0U1VWe4_1]1T V=)z2r9T2z]2-X鉱 0)unaG__ Gh)[)NڶFHmHWu_DiF:Ly _^u4 H([l*!:s)jZ/qaBFʲ EA,3Y*@JI,AD")3+%'u58tuaEdbO޼G EI31/hXoji?)Ά?d}su𵰮+ZQ^_WD\$0=VVm6dYF5DN~ y>aV7Uʷ$`5":\i60UHX(B@aDJ\H͵< ,Jf Y:ҲL K +Hm-N2-Qh'dE@-t~973XƳgxpٟRsz7oᎿ?pwE5 "e?ׁU䞧Yoqz|W'FgTQ_ [I㌰i^hL8^368Fڎy<#滟?]1rF~?#*q{ǒ<ț?Mlܪ'n7[Uw9 31¼PZK8U^3Ñix=w?pأC >. tmw WÙY&tDozX˜dЗ'yϰ?b!\;쟞ݒ|>b`qk~= waB*):^?( 2gOl? 2^ \㹶qȘW=C 8ir:g*nvZtFV,>xVabǑyNG+^^_Ym7mq`H)Di[mNGLc]Wi!p5H9⚎e^HJJ)8]Bo4k]z#FHq?䂘Zt训zam p}=剶ݰPpNUkUD\8ݚ#@N3B0!2UAr]cIB̩U Ak[,SuKNc$KʹѶ V2^'L Uq @Q%>ch3YZҶEiՎ,(R5͖a`i ja\L'm>ɹJ@ 2@FR/yFZRDXղic:׋"Lq@1KmP1a!:M]o^^8N>$9d\ߑUӲww D U{9qAHxY%1>w7|K~ݗk?,?gR 7k^>>#fǑ #|J"f=1vcXp@A"oo%q>x{eY7Ñ*ZfկVÏl7[ܦG v[uL/W b״Mx?C~WUcQw<6k:c]Aoѩ |dD!ck 0F/6LgD#8`4(&ߣJ1rf:һT2j).,]O1VӴ5px`w~ίW8X8g:?ݻLÌkyy~פyz\/Yok$bkLL4ĨXr~EZ @4K"SԵ@ C׬+Pn0MFڶ%ZR0MRw->/#exvG59cdZRynP!9LX(C[ߏjBzR24͚ynş5+T6J"yL5{%;J? ]{ )ck,qYw-+œHXԤ) ".R= a2ZGL4f0P:iֹڭ0Z`$, %,EB.U( Z81R3䈕urjV #q0_J!PPsmX))%m@߯QQJaGJP.%GȚj"d\\NV H9F;X[ir!՚<yt儾txnT >8c(t`@F+i3逻fS M#KOgH~Jt [c]%c^'r[BvC;_faB1MK~Eӯ+dR/S(֨d)Ɉꊉ~2-%yJAJoֲ$ 1,T[`$ HH9a^! eңVg`z}A؎1yT.ϵ˳*eYX((!׭ڠ <|BJt"xhzȡ䜭aVgP3Bʄm(x\;(bHqv[Dam~j+(ԭ:4 $q X]%:C)!u~G 9L &PchR,~I*uQ??9/p 1n|>0Ξ~ӒC[1w0t]0fKp]h%O/l2́_O H?}frYuyAGo|<1/u7~ݮR~t@ajhV}=Hrn5OWT||~}A IsJaFv-!%ppVhe_ 0|ӯx}~8y~~f0 hcԦ2 MD>?֜3p'65mN#>E>>q'khێ˞n"].?O4(BC/ַao툧)?0r8cٸzw3{4p9xݰrxs-jNϯڎ!,"X;S377,Lə"S)hmljT|&O4sKw|~}A(_P/ An(}W#3h"8qBX8ɳZݢTOrD'H/cy|Gq!l4tHaqDԎRt݊$hq,˂:RX¼0/a/h(ע|L #eRL JtDC[C 3V3 ׯ oz߮kHɪwPB 6MwP/^ȫ'1$Wm3o sB醸Tnkm.8ˢ(RHTK.з! RQh/hH_8~vXFH4" ^/; 0䘰’ZGAˮC]S]]<o#)%0WJj"m| ,^Vе;[>67W'J"ǀ!$]/-9I3ȴ@Fh2CA*eɝArM6N yi51+7%, !cRRJ%WluCZ2c[ɡK(Ь_)v+zk sω_'Z7{ldo=w7n|~vϟNoBy!&~^mo]S:@Si:-SLl ?>:-1G7e/("3_-.|<{O?|ϛ;x·Olsy9L~%/?|8*µmy=C;G]㺖a fT(K 6#M o޿2 Gae"Ξ7olv-woÇ/$]Oy7||\pmCPR䛟?oG-mr^&n߾a89ܾ]u G,#>( Q8g:~/~E)~/Agd>g^b$y\=\?F \7pؿ/>=u{ѶV[~8Oy=0ۿ-ՆfM)%1&b̬+ )$81\Fb r.9f|i,IbLQnab!H6;,ZUVr% %,cXMJ-4rj%/>HIp=n!-$Y# Jq/j:FTtx-J aJ$H :)#a|ZMCFt`[0rBu5xJ-?%Ha ~xBobϞ3anyڮBD*XU',v{sXj:/ִPJB ڐ0oj[RD2,woDxa ѮG(E3>Zˈ%Q1c\AjXF<|sdj+2iȹb"%{5Rb=XP]2}4"7s"HAI*p TiILimGg2ϐbgr(YRK)aCV KXh : ^_Z)x?7\@2-4,1` (%F:!!θLp YVjApYf]xDJݬ $J()I֡@ry?`0K#h')4ek):-TH^>aֹiV$~Y!gD(/0q'N-B2eHW㢥Dr\<9w,Zp'I%vo0ZWT8}KYIjOteI,3cpF!Rd-,DrvWQ0.fdc`ef0fZm)%ZMl2Nf5Du e <a8'8a$Z Ųnx%JF:J1!D3JF$:I\@̲0J֡<Dfl+J5]? ]#g.hg>q9_:#K>Kas]]M8Ux> "eM]DPDE-S\(L@H)F1ĘQP6[oo \T.$"J#TN,!e"j9/8+"ט:ҏ)^,HKp{n.=$lkr" Yo4p9@ [% 9Ȣ!EB&iQ0)H;Jy%9[uׂYj<t Ǐh:ג}5&WYCȹ;n<i+-Sd)F(yrTc}9LOxr#rz8f*8X)PeA~#&6X>}_&xGOH"?;t>r-)OAt?NUn/~S.i6Wb(lVre~tvW{5|G~wVMl‡3Js3[1P80yL%b(L۶\NgdhڶǗgR|\.'V~ 7{eDH1<]u,gFlw;_y8חqՖ<8}~;83_.<biʂ Q}O ծ;x1 3a*Tw.È`gJ,FJ/vCX.!+%4R+YE(-A92NۿlTdjn.< h-ѦE$|9)jn;2%~zujM)T+*%a*nPmPzJBpGIB^($|Q1q(>=2<gr F+*N+C)e)BHXuk/2!2-]35L1p7q1N)V̱КgR M*UH<"yHp)%ZU_oY蚷t5DLӭ6kX?TP$j7lnkwX2K@)tHc;BH%q",Kv)sxDۮPmCyu9$c=έ(20ϸ D6XCSm;R4Cb< lVBhՖ(#jMK#q8Xԕ,痀*ym)WCfSg;Jj(4MkX̗¸H n 1ͲD'0/<_޿î:TN'\*lXVR0ݮ|u$~X:D'dc,^.zJ]/Hc ^!t]Z,4#@>AE0ΘGWwCmݎU[(yTTlp+@ Dȹ oB̩Ɵ.giDY ChBL Ā3dףri5iTW5,b[dl32L3jSE@QDs;x^v=ie %޼e:S} !xZFYÛK}?Wlzָo:SDdp*nUui 6h,L<, [B ! &բQ{87aשtBP{sH]χ=?|>ŗ^߸}_o/<~~̰DǘyU?7y}yz7px=- xǷE\4c"JcqO3K|_O0GaŇ_,ݎ>}x'vm-?~42- .H _Ogә͎tAyip}GR`ypt 6w-㑷W)&/{f3-^ؾZx;>+NqbG^_sb7rg~_p:_8<> i>o>*qaI|5Á݇V8kX ]%|>]@ |iW?RvaGrm7 ]G;va Kg e\X+W)YO ݢUrY9d sTeqʢ&+ I2^_eҴ0]Ia(s )'bJx yɘkT5PF_(XЬ63@(3֮p44Xon2(cDASĨڦAI(h>Pa.t7Z9Q@u2IA8U !2ZG&GL әrrdee*b牗lR WV+$O7Q蘨9onqmKEv|%иж=mn@ HD$Eˈk5q"1J) }*3w_0U5J =uF&w5't Z6wd*¯6(e!eR Γvqn%7SZfWs TYkHK vUP[8_`-(C4,aXZ flJoMC'y5*gOZlƺN%ȗ 7 %&4QEE_3/gwT[\Qݐ(FtsJlwA!G&(R<9k|]h˶Aֈa<'Y&)F'FY[ס5ZL^;.?f`;r8GkcULLj(EdAab([NW :5B\=nZn\ ]3w:_k=)W.o\?pΔ3F_݊p/ OV-˜h]yz~fh8 UU鑛[Ӟ'z!uo~soT 9Ozn'Кzrcμ>>/8/Á/6 m /O8haɉ[~' "SHweY [Ϸ y;??ra]s~;PmMJa&m|1564]~»$ v:憷g6̗>23/=FkٟOnnyߢb~׎WV Պȕ|~>c<֐JM8kD5JeڎDo{u=A>]ݭ,)jo;KbYka<sQzɄ;'NZ @ te&-#O\T'a ԡLE)7B(JB^00TdJI(hƧcWw2P}")NJgԮ KաSv@k.t0m(ʣK%)mXp~ciB8Ị5 :RZ84~5ȔN2&]#].@4fi{r)WbjKPx9Ӭ:@s!fJ(F g=&Q×"^oѺ%J˕8k 27Rhz<Ӛ ocCIئ#H\- z IE{\)EʍU"2 !,Ut+J-e`|ɈHLFlMGM3Ֆڡ&LʑjΌtܤoAW#T13Z:\.`;)F5PD6;qb nGRJ8`|CZj t8G=0sFkKR%,u]4ksXb"-G-[쫍&Ƅs%/MmJfZfjDZѪb2TV!kZs(S)Xemp^P"Bi;̗fX-Jl&W`]KY5b\XƓ|^Ra:`cWBBM1!-MlTg5iAI2$.kB L1$fip]<5SԚ>j*9*4qYQO[l22U+,Ĕ2 ִ juŗ*PƂQsP"a[ߟIi<4W=ibGõ әj+}?m#1$ԪORK8G 랛{nc Xx:s|?tT8O?Ǵ |{#tnW9q' ~ElvK>oƲ[f+X~_[in8-y{zϧ3i?l_|^ 牡 2 7ly?0#h1v![*zy#v(ik9OnnG93REǰ0c|8HOO>VZ9ܽ{ g~ )Sk#4{ 0_r\Xk)S`Z3'ZBo iOc+UkV[A 2[Hmc9cu63Lɑ0/c(UdҘRZi82Dʁn!kbWn:p:cvk2Eok!ӭzq(,+VjpR0^ N;!鈶B%e2#x`*U[1iu2Z`|56.#*RUI7w"vYb!fFLFs<ҭVh)0cLk4%2DV58$홣Aw3%&Rʹuuk'-,G+va!L[:Lӑ *qTHJo{iVɃC1|SU(˂Hڎ0r>0 -!V\"D̅hspڡg\.B7ɉ$X9iR6rL-jH.0 jq -38.&tt!.a}GI /(3ڢA:  34=SHt֢AGl-X4 ɥb/ cvDrs>,RNy=qS g)7-%g4r87V 9c)"^,Y@U.7|TvimZ)ktxɍиT`.1W h,3eq 5,[h%]I=[œLak13mhu/(Mމ@W\a IlUIYiNUWD%`J)KcP5V+r(#%4]G۵"Ys ʴFޠA[jBƺf/p%i瑔`nH9O?:tDӬHXld.1DR+R(OL;ແ(uMVɘ$`SA[!H8eMT-)܆ ȯ+^gĺ7<>@={at3ۛ}۲>RHywCGZFq9ٮx}~%Fv;ZPǃlOoiVixNKbI~X;4}C)x%(V3ߠVB>όpx~^^0vkjJGtm8~o{J0a:ѱچk&"]i8_1Uc "m /y-*~~|:Kş)jn?~۬㌷_~ELMӲ, 7y=/"S_x|zf{L mWv7;n+_m3~I)tW_i$Qqmx8oᇗga#p e 㙶ip卐#T82t=z{fV-%В&Wu:t凧g}4N#z|hN/{U|X5=~ۧv->=gj ˅>?ݐbpYdOO⇎@vmrY<<<P1q!-X. Ļx@+feG+ڦa'RܠBUqG׿3q!i x'r/w?Y. jLwά__NXaĈ+l9h܂+L4gcY&aO[ e7Tq& G) Bw 4aCfEq Т4:^Q67QoXՊpT⛀Z [ wea*#5*pkVq]O&qўXf=YGShVjxcN\Uy㤔ko,9kec41W e8oQRe#" jQ) #FC $t4M/` JPMOQb?Һ-%Yje%cmXGBqBZ("ON T\Jɔ qdUpU-uVR,=%O]31n6c,(|˯!U7(!00M+sY/%]v"z|)"ˍs-ailKQ(C蒱\#BoN™\06]#6;e [)`1e>JLH5-']S3 "xqһ)!G)!(4J{9k MbKLh74 ޒ37ln& Kcu*+)Io:M0t9ft0c+^=*PLs tOk~PCxE lrX'2%JJ,vG W3mcF|ic?HO#."N1^u위g=uF {{qvߵ =,'r-F^rn]K8kl<7o!/֐RDF{Sͭ<H; j=$4-5T-_b*!it:S;Oz:6@n#]UYBh@biœ#ÄVЭz^^^rxF, YU5pYKZVe&캎R CwX^_FtVSJw_=|]ߊitw p'?)Oo֔/~;Ҝ0xsosؿ=722k(ϔ w|x.jCʰ8^ΨPxJ)8gپ&;> 3w?s17_<|t(9W-б蛆4ljd p8nyۿn}C@k4Uspv|1rY7c<۵%q+7Y#&Wv핾x#)DQa0Gwi[z%|vxJyr:, 8j"0N.V՗_r8(v@DF"iYmv)`ɺƛ̴Q2ζJ3t0ROG t8w lG)E ^ tis([_ ӭנ""'_{rIDJ*E- qQTlDfl$M)rdw (ϼD 7j*(ݢd>}5ޠM:$jq(N5|`ïV,D- wf*@ތH&k Z!0ٴi 0b a@ U~%R])/LzsIJ(o9wETG(+\(iDkẫ !N4Ko(Jv4P%@%VJtMfP5(:M2(37) 8GUO!rAJّRFWT,UEE9XY.ECE'wpFLZ hf"=+ )tM$>rJ#LWu&#LT32P0Vc7k%ZkDUepV'&z{/~2UMCR(4-v{o-i|BrפZb?ALr񩜥r_>Vй;M'!U18uMJE1RB$2c]H]^ȼL-M6$~B"(B'Z,A>klZVB@-1%N4)T#2;鄭/P (h f#~#&3X7ϟhF!}ONm4on/ؿbl' hQ5-||x~?@k7wmG54K"Uny~xFh/,Opb?Cx~xšF:Awq?q}w c\xz|m秧>ܽO3#vEu|~WgE)^_)AS23 #w7o(;͆ ,[ ͻ+ȅp?23l>4*,K#p[É\294}ncl/|m۳珴}YWLc_4q~3Y3<7=W0 4p8L%kzG7]WX_]\ .6[8RxAb>υw%JigZ7\o}?ȇ/o{xsp9f x{ ooy\+QUBδ53 7 o }ӱZhچ8ୣ84Nd]9tM\eKr@[pqK`I(/7<|ě;i_0O qnA=2G6-5EVkܾ} gV7تq2_0-GVCwy#4_P<$w +$0N]41-"&Ɖk"4XH\Z\,iT#F%eZ5c88RHghĮXizrYmޠyأipcZ^wV[|ĠqMʯ/Gb+8sҤ"wy)H.[i:TUZ% 94\XKALi4]|:4ýD 5tm#E\i );M۶0mO_bL~s!.TF)9,+ćT) %@mۓrVq&Z4RH9q|QU%kR+εRYR?RIJUq h-81kqDۯaZ(*RB !F%D"ESm;IewY G8G ac xߝrX|/P9C,wiȉjUIMSr&, YwQV\YF_*%D1! %ʜdBmVG)$tDmX9Bp]O)LiJNDРV E(YX^Ρ+ Ip5(s>@f50-3Va9>Ѵ KR&"lHX=vEl"*$X(/H^)Jd6sH>ҵhRgϽkjt8{" 1xӒbc<3@Y49WVdUUhMN 8R4VR~{*2ӀsΝ-eD⦝9$2L&!,V{+2& P+2⍑-[Ni[%SjdT yiTme֊(6Nhbqi9 [7c,K`t"s@ENP29j IDۮQU+iƽ+:ˑJ7iQFR$L)Zmh./ SM1hW3VPJ[rR$!L3Z~q2y AJ}Jf'OԚg Y iQ]#=Er\(9{L~%Qg1[F˄^UJ_v,d GF-EY)w{:eЫg.5 ?煻 1{x;v^ )͝<kv9p~GkQw|=k8fLD׿6oZ~ְn9Scª_QW uy8o.() e4~-S޼I{1kzuxsu<,5r77~ c8E ejdh< Uc1S7[¸C <@\0{s p\!-Nx:4JԔZ4<@YWӌ9$vtñ(ˌ^AѸ6] t-ַ`V2]K9bu-4J^Z|wl/Q6 vxyP8#{<Ю9CqZAbbQ)'Q( X+R"i^PU#JyYAWb5֒I6^]OR\q]kT-X#U L?YNe&# wBAS"晜3V;o,Dhp~r|hTbBlSrm*).bABȰ egLLkKgA]I? $d;&RV"̉tV Vrp=IѶ4G4mH%Q8)QF%º%jya "6VmPZSTm(,cĜŭք0bWLiGBP__zsͿc[ay?p6 _bhxo>{}Klcyzۆ/6()a憏\[RLO8ڎ(RER Li!0#8 {(,D]a8rlLZ[Kas+k׿f?/5?%W+h۷wpرxpϼ_|`gL]~s֚xv;J*hy=~pxzxdG!~i`9\l/f&, K\ږ_'~^%Ẇ՚5c8QC!TIL1t*,1[?Wl.oEn7<|;GybKLK?}0]ϙB۷Ħ_A<$eCl%E-^pze>{@ߡi:z<`K9 í9b6=:n.PKLD3@{Q 8v' !tB ÑL֑c"֢L-ׄΦsh*cZ|,pB+G!+1:ReVTYMF-#9t-8O>\8~ohV|SS"/k8gemwf[9{m'SԒ9M#_Ѯ6Z+m(%e B)Fj A;9۴1bF gD8A󞘢Ls, UI|:H&gniCupYLۭJ$Dp[SUQba7+W">m`ˈixgY>_'t|*6gT5dEFI&AEBʙZC,HXf~#qIhQo 5fe>p45eEF 9Kg\s\ZrA{ 8#e99()gr X`e}Zm-mJX&|'2;ZBUBӪ n%,qa:r^tll-԰Kh4A0ܾk):t(xXOqASpz ˌ35I[zӭa)FHaz*i^ފ/eANq (oR"Q& (Yj{.VyTD^{xRUhep}GVbbBUFQoxu:ˈ)4ئ0 k\׊V$i( ĹF,CiUvlrJaNxNVGTHr9K_PnoqX\"^i_UH`FE*JM u?YTgΈtSU !f)"2 ܉JiAhlcr:5j&"$bHQ8Q9b@$Lk .$bTjP:lMv09rl3ml2YkbO BY% Y*R2u*hZ3- ?ژ3bzG-ÞnO'wi`^xRSe~p+N?ҭ.5$ky'W q$N4OgmikC*%Jz`Fa߮N3)eZΉZ2vi?5_K&)h✙IFH߬|F7kbjaHZ5ŗ'jMN{3%0NcXfvϼb@!̬Wͺà R^,9?)Q4l7GMϐ" @'|3NZOT3g)p/?tYeibaOQ<-|Gt:nY]_ EeǪy}~/K~5Won/0K"ZMP{ε-n"2sI8 ĜXrx4ab e (kzK1W$}/= ,H/o^6#)ۆo.K荣x=v<ftDcܡdQAdc9 ^*_ XRheXQJu,E0cw UkRZiƒqZ-%L Vr) F([Pxcouӡ5LD{)XJAxxhkV d[A Z Vf#Qɹέq J4gZh]ħ3zzmZd/Y)h'F0Sen^*w(iB|F:pOʕ%, Z)|++rvL-4}ò?(-BJ :sXI Nmg@5n9;ho prI D]MO‹oD51Ia,$30a IlHFA4moW$8N"Z*)VkP 9VJuΟEZtP VkhSѶ}Itޞ-V5}C͕]c)jTKkJʌ3LvR9T*M%aW=2sqX DRU.ڢbNX%2Y%J au[ @vPU6CÀ yѶR#V8HWdYP:yhѝ߭ xݢ LCɅe|[P3iVk)r͊_?~~/03ia{¶9y}y{b\n7po~u-i\9I\i)Ì[gͻ__Qh!悧ſopw|o5sFO?zК'6gL0|q85/t^.aysu0M^M 7 É0/MK<~JD8~\f u!MӂV|j槧{[QoL@^ )UOǓ5 Jbjf7 0` rOlWw$zH* e7j118~%!T5,{p^y~%Eu<~xi}x|=ib_盷}@"{?p9\x_'3D:EʚGɿO;l{mI*Q^0iؾr~9ж ib>__yK\1)s13>|b?W ~s͆g]C5޾~Kx"$5'j=wX^D]EW_aG\pk[xax'͆h`>]xw<>=r>hn)k- 7ÏpY8d*-V;~l^ݳ Ͷ:Mg|n708DY.  ^x䡆;Zi 7ҿۈDУIdcg1,߾ +t)sP820%1OEz%x2hB(޷1'LZQ1\4ʄ"Dx]+ZOz|ۓH. e tCO6\ }80߃ӤI$mPXO5"UZ s9]4;eqTx> Z&p檼~apT/VNj8oLF[Dv`HOփ]WYnkk}g2e}6p,m12Wb֊6 ibTMAQ(X 7Z-*D1on@T%$ mըIe-ӑ( ZƠE !Tmu=U)RzZ%C$m %bS `X/c*s!c5t;\+Zg֓Z*ĕ5q,u+Kgl*E:=2_άs=xEۃj, q{sq-[fy7isulZ@) C™JJ g=m)q!\&"pu%j0U (~y>uϏ4p9ha{LL\BuऔEw9En]G g,gP؀aE =Ti BIO@.L>{Ilʂw]º B2-Lcw$ \U55] j,1l3GL1$v鮥R,&et#]14%"[铄ۮeQLEɠL$0)G{-X.pL<9. =;jմ'zA;{Lͫ%~gAY`-s h./ &.':Gj8f {7 3il|W54[Ͼw{lw?gnW103@i ӑ^ 21/*t.»w駟hgE.;b<~7vGX=%g^xo~v}=q\%u8_9?|}-!/1]'nqϾKIPݖHw|3eb]o^~zl ,>q{w(;4q9y{f?}B[K a)̜ }c۲/W{Ÿ^x9oz[ ;0RKmtZi:/}' b\iE¸g6-u(%Q? M%bn$b2qCYO\JYV$^%'qٌg18E&rxHB̆l:TX-1ϔ*6o,%) g\7(h9l_EVO_ݼRĉB)WLw[rvBIYt]Fϡe'ڦEYM.#"2*vR =#^.(1K;S$6-= 0i=Zm4)j.8HLmYU6d)5b HaD<4[r\o//xgj!ǂ70\+F%Go(EbzʐݼfrM,3*pDqb4V_!DBޱj X(:ɶ2׿ JVtM'ši\CHc dxjŖĬ%X,64L(k=9& N*!` L-X 7.p>agMII:&EY!FT*)GƵ Xtk ֌ JwuU(Ѝ[1#N#ˉ_sW\p7E5;qLxB\ F,l=a Z. il'A\]/?n\QWg) JWl7*,ʏ1եM#eF$UJ: K]HhsuFg*uњ3iy{ ά_o隖vçG~fY|aY#I/ѭ'N E[ӗgenZć>cچ0ϴMCk='0kq%jyo,gy;I~raǪj7n/[ׁqhgș3cײ2憪 HH)915z0S *# k-1DiA*giYM+}UtI)?ٜ)$-F{ѕZ qJrqh5-Rڸøp:`f^V n(XlDLےBҮ.TUP{%r5%Nη"$Q6 HiZ)˙ {%VB\V"5ڛL*8A9\{l6$+%0S=^ U\Ea\jD7r CĬQM/ k\+lÖ|>Vj(SڡHX#&ؾxyVEэeZ8pUE\h$l*"e[r*Wt?R_I+:oſE8:/aF9z|<㻎f;pR˙TQ˗giaON4&qd8|zd*e2|(v 6TX3ðۯZu;Ɨxxs#c}2 H6 |'_/集v-I+. ]Z8! 8vmOQae=%g }O? W(gv=\cvO7w߳ {H4LBW^?px~FB36;Pϟ?LLogZ1G͎:3ܾy刪ˈm=0W-UAZM;ȍi8Ԁ5v--S 98|b1~eӴ,*s8軁_Gnnn癡XDž{Dv??~jQElu^_cxZQ@W20;m{L}G*0LZ#+t%k"G§hv[ju %Uk|2RBN1Z)Zyքl9b3 D״5Tkh7[PňFh3WQ]NBiQok#R%DU*͝\c\hܾ{O]2M{j[*Lkۖa6[ZHXS f4cB{{Ǽ4c 1ǷF[4 ˉv3QT!gnn^A-ƓL^m(>WE3MnΑ g hXgnO X967T6Ka0YKAz:q} Vh5C ; JJ|n oXjnGQ ÷-mtuxWݎjz6}# mc}+2^p*!*r>x|o6~:emYNV602<6 ?}7j?7!ᇁy^-d=RAMX0I&ٲN1-eB YI B!Qi6ZYOTerzvW"SBDw=n {)!W5Yp#`K$=y@ZZcMV),W5)`7(4-h-k&e5J J+x)Sr7 x:GӶ8H(ʺxX-]D\ )FǵDEޡDݛt mo*blӊ"UM" V~]-SMf:V:s)N#rz'TT߱~ \e',CNl\OQ %KDQ]uZa3 :&\+H0ςmZN'?FyizuRyMVvrc^o%\f6wweN\AM;\/70V&Ep<m:2|'\E(GݠRg}ά#LΏ߳C4e*9z8XeYW=5LbIݻQA@L"+ j]]f]ZMCKd0(,.#y>A.5aE@B8`ۮ^]JMA:'@`ZWc uhTQ+;rIk!/R`)Tut L^VÁͫ7X#4O5Y!Z7ʇO`Gq%o[xif|8lYrbYVL+atmO߷<@g6S5iF[ɼoe]VjμϠ4__>DNtCGp>p'ka=G޿cPGw+~9xǑW^x_q8<lL+>~ T?[iFiʹH=/#7{6C'뷯G^>p<3q_i傿JZu Jg=CǏ(c%c˄o nHc:M|WgS m1]GXK+Z|`|gy]ezl$nP"*j*UUDyM iEBE6ءG*d0FM׋0SBx8!,E]5Fc'ӅvsR@8~@iwݐSX#<ۀra4-TJq[Gڠ˧NhZj ,Hۋ*V'6묮^mJ"(&֘ SXPX#0R(5]C>(r)P}&}1 q(ePᜡX-qk;X̰QK.2y]`8hC5 [r-8s~~$"_Xd˳\[*6&v\'!kg%Pkx;/OaoY{s誮T(*+U׉%SJz'XZn-hB8mڐQ4]OV-L(-#=e\%a+c* E"ߢ\d`p[\J.ZJ ҊWb&|fJYhvpuTits^(eZ(Y2\;|)hk1Fu)k{T(S)$rgCI`ӡEH_=@⑨)֊ 56(\gsƤ^%JT\#5ZIH*x"E!#8iGk224j:.nKZpAY^`qoR{@yac%+t]4f3t^<4[9k 90mudi$/ٜ'm9rmj,}j_ĸRXzִQ w#$h\òNB4}m*d#k!]?erD$"ڵr^*ַga<Γo[3!ZBnap Jn]K̉txBm+-8=(JIH,Ψ$J;""Հߒ!OgB ,eARMEӀkPXؽ m;* 0G\DPF h2 9ِ8 Jk 2]G߈|4h ,P=5 Pr<3#BJĢM+`uGZ3i<kXha2zP8 W޼ECoUSmWӌ(YMӢ?_x9̇Z!EFs3,$˶E]8sN㙷XeΣ2mb<}9b"ݩm3vq%OD49>.tzw+|VG- :sz99ϘVnva|>r_2ba+)~_z<}}2&,̟<<}Ox5<~ݵiۖ/_ȅ9te0 Ή_8Y 77{N3}cx<}UDOУUiv{>fؑLRPޡB6kY V9 Zq]֠u#qdm'Ƴ쇁q.P3c\*LH#Lw7,㙶qX 5 ݜ{-VX3Inw mKʅ鮮eZs x-/*ºV|j0vO(#6k3L rz/to^3󴠫 Vt2-tN5k-xALPD /(X/l79#(Q41Bg4ٴa]GT0ڑ֙DgZeĴ k(I<|>uzpրw#d@Usšk25!XڸGYBt^^Z^;N/?↝Lt;R\0t LBabtL3|r59ܼF$i(T05(ek ,#5:ntafR\q 뺊?Ø%QZb=?uWdk)`ɭ䲧HU|BvV4tR )oo%MDECX/i}'=E-yj \Qy V2i)MY=꫉/UŠ5ypƢT9˂ZBU)q H$K?iJjlt7b 8M+A1a醔Hh1ZGIg8gb (i#KdY'RLx+;FL-KbMg1,8%#VA BV!aUR4J, mZr"/8k)=VrĴⵑuV'\Ӷ=Fƶtݎ3vV${kG1 /3xy1tҴ=;ua =.2á(xoX?C3F]8R͆z7 !W G1ʦRJ=rQ\ՙ /^5GbF1v<'e & m&ggudHIڋL6̘%S s n?wQK=865Svc.f+eZ U5IWmBI(%~CᒽmpRK$k#TeĹ~BZ^)bPD|zǛ_ :.%JL-6<7.X ],tϼzl= k;r8zuTM%ɯgY(Y(|7$rOk\yiGvX+!4mO\Ψ v%D61H`Z%@Cs-s-}G]N<==:Z(򰐣,sty:뙒2(-6wۖ%D^$[?*rWZka'E'|݃k0^YNm(4PM%Y|q:szzBY8M\Q.'-ݎySƢ~qbw{l(Fc 'u!Ks=DSx3W׵|ncX%GTU Ӊ{Nׯ9;Ɨh}z[O#iYvxVڦfy||h}δmFv̛wooo\\ȗznݎ,I'N j2 4 l i:C ;4jIXP^S+taap &MB{ ,+mɡPBZvJ$3L [ʼbF'v鑶B^^нٓSb k`FՊ6,댭Pe7j =Qj]qkh:ja}İyOGKiQyV-{Հv79u-e\+2ς'\3(l3`%S-YkADTEl k8F7Ifa{Ke~ۿ"՚PԔqQԬYĀ*f>ž0ڑsfC5(b\1b^ mR"syAps5t90a%Qh+) m#-]T*Gei:1N')Vef^ 8325agTmlge "\785rxɖCvZX⊻ě}KXL]=1)*"8cA.5I1cILU @\h^6q93/M 5`O]Z$xCoz)E7tcBF2Β'~*1/ + E)RD8 4lEaZfzIӰZJ}/xfI(EgePfRG ZYR=R83\.i-OZ0F35'tסLOaI:mG\KtcJ [й, zVyZtqՖ)̧3T6}G /t=t6[\q4WKW^8Rczob=LIR+a+}TezPȇo =|ƄtBv?'޿{KE  a D* IUq=q^F]0<2Ǖk,i+hv[uLPikL%no7<< 3kOv{^'rZ6[F}?w=9g_iy^X ^^0O$ 3YUb\Npi7 Ek:먪}iR !S%r,P-X: A$M)1?ѸXDl|ɢWߢEZ,A+lu^i+fKNd**Xt'r%m!JpLӑ+ݑvs'S}urqO~O+ !t ~Ptq-늵 k6"xVz =1/$N+v2A-L/3Ꚓ~ 2EeDʉշ/OԵu[xӰfm45J6"L 1.tW7Tk4ӈo,bZG\Ft(%PiLe˴xt5!߾FDmbC`-T`g^$#_#K3_%(*U)TTTģtXǺL8./k4 v?ƲTR:Zu-'l4paWv iZ@XH9]{9US(#Vߴ'G c7~K;f>KUZ3Ll@)rLL]8tۭ\ו2f:։3^5KHZI/65a|Jm5-E *KQ3V9JvhI"? K&ȳFF+I@^odZ %NKymoP&RhV!f0綂JX\g9{C5ֈcӶJo09f;(-. 34Y`h[䰨+/O_B-r-i# EeWUƓa 4s/I%b D y]HE6-_~Vв9oh 8MV e{+F%/ہ ݑӑb~T_0 Q@uT m_>ݾK5Pkԋ8eWc%u)4ưN׷)ӄtV~_ 7- y%}z-*Up I+tԘPAI㈭DzZPH> :/t&gLvn] Je^< !e5o68|zp8o _WT(\]p'\]qOLU?l9+82\; Z <<::rݱՎ`v[6 ~GF#o^i grך:b|}ü,ՕWx4_YSk7|=>1Ġnǧتh.~:szy@"#7k"}|~qY黎22GێǟxwLLZWkXBbsEkRibϏb8䕐yo eVm2ϳĵO'Zl69v-2at8-!G3:-O$1tzd%d4JDZC VWT [5jYh\d1Z~.+ 1Do,f7e%L|J9>?AXc<><1'+z/nϧ_.&91B_(]'t1RKhMUûU3LJ8 9{+֔i6ט{jD"fLCFB\WL?Ft*CAcK0_~CSohȰ.!xK^iI)2=}YiH7\K"BUU('PR$C2.(E 9c+°m{jZWᄭ~s͢rD*S4ZJ?qU5yt2HL"Y/ȈZFJ-4o)1 I(DPkBmhK c hPLxm2 L3 ,0 %Cu KiiQ\;PNcXh"@J1"~tRt.38|Xi-5W5U]W -:"(6J2ڰĺbBrN\O 3WVa#7׬!Ѵ yJ~ π-kQ9nH42 *:M]kS9K5r>i{o(P * ]ΊHL:P^P+%Q#RDE`M#|-03ݢT!'~CWt \YbY* @BW8 2o6dm )rHT })Z*4!k Yp/Ǘ{Z8ǘ]S5wkk:!}%;5 C%.HY'19[WXsWCO H 1l pF=m64@-ڐJIӷ0puq5mk|ҥa ؾnߋQ10ϲu +:NS_ *2ExxiB{w(`ہΤ0fzNYuh6- 5df@nTIeow늫)IԲ@;|/& c,V)ݕ\7萨FAIZO.]Ą5e^) _Pc&y<i]cd:O(g)1s&Ls3b!-nx&N;R>UaK`gY&aLv?x )jZwg67<C,=>%w(j<4@_5˴|~a<￧ݧ"7Î|ݞk%Z _}H-aiT*=4SҢsto =gno^ m oW{xMOƉ?} ZLZ΁ )/ܾ٢LaWJiYz-w_>ZR1$?]J"Qh'XEeHK@ mJɹ]OQ)`{*PW0|Cc=(R#MD\dfі:ޱyBTKd'Ld]eJgXVJX@ˁLkL)b.!r& m7@Y׈j=O*GT#Z)Bh[k B1CWi%BUSеn-D n K<|WTgBT|ﰎGU@_6B:GX# 5ˁ$jIz#`DGR\kPAɴ&qA8)cGLV2R4xqESVH3BXg9Tprʂ³8UvR=RCb]OZ0S!m+J]ZDjES@SfAg@J\Rqhy:}KjͤE3*xO-U)=UH9)'Fځ#n`]\ "jkRω*|ƵmKaJ4a>Qkl7`H91\s郬(Pt́]T#s=3"%D%x>|$Dm-5nyYƸa%̏?3gYt)Ï?, 78iǧg]y9<>1w_w=/ՅΥKƠwDA|zyI<]x>RK&DHӑyZ3tBgyʅ4o^///8_jqMòLoi7qdsuD m+nnY7߼?w?z7Ē+̨jQZ-R3ei@e޾qLm5u\Q1TLM"E!v8RJOf@TQk4Zbb,|a,x'"JƵ=emn7 5w ,+2%$pxqhIʪJxh1rl96mK5l-RzNG(d%flB^Y5ÎDgp*5\Ϥ0-oi:c< 'Kt.c"u~C))ufN&LF RU+' o(r]ߓ0,n@E 8@{XE8% 0#n%S5@)"hS(UadaJhyzkpi+Rf(S fYurqc.D"|gjHMwٞHzN9g[ʴW! -F!J!, M\: DaLrrpNJ}NBj. QVh,Ĉ4 1 q]֠tްAnjj{ԄUc\ňNg-xp@Y*d0k<mjbh1F\=iZbhIʕf)r%hn=(EUfرJr*hΔrˑwF.S\6kʄHEѴb V2qHQNX H(UjZgRr$ UF>IĜX4}K5 cLg]gZե8[shE\ĔK,5jJ"*1Qk[i=NܶDžqMެ̪ʤ$(K_E!$DЀ%Z*̛D1{ﵗv8ߺ!͵σq%4\@Jn!n𿷆!J)8'Įq2 ܣ W[U5Ԩc{<}34͊a(Uоy8 z4GD1NR"_YjП Z'lV<^іy^;5 V-UڠƬʒ˜2QGC+QޑyVAnX^_p e\F|to.07dIʣj_O2xhhר1_AHKFۄj:{Og8*\KiJ'lFoSv /y\ 2Lex0 6yT4w~!)aγ" В1ĬU8|tB$`BG.Ƿf 0Уr*eXm7th$E"Z)Smq TU|8cW , ;'xr"~k 8qwwB4M0Iªmj27/{;nwC0MMBx¶5E<_yfxH͊tfvu ^?0 io= w>}8w }/-%Dvw|#̻obF<3ąuձ\8_yg-i /|#G6#w-sN]-Wlny~~35u03;[O 3=q͚Wl7| ;͚9R;Jo[ڭ_5˫=O_SIya~%j<?ۏ\^\@S֔0QW+8dJkۢ\k[R*af{B]UΒㄫc!?UVF9G"Roh/]8H^[Ӛ9XYEb\hj{mĜqba4ۯS:`_<ܳ,3ZtH=HQ>#KA"2P s 84bYVLqfa^џ^W8xG:MCZ"U8͌9gRn1\.<> OOOl8N)%bƉt)^bd!xG ċ b?2Ӹpy=%G.UU},6m~/~ɤv o i{\@ /)di~؉2υfuKլY.ȑ0.3qpW-S[()Aj*te E3o-23֢"3crTQDQ)65cV+W.=(Y") Iec`Y`SD1 [IY^*#%ma-B2-JN:CdfV\.xkjNFm |H,S X5bg(]LU{pꅏS$-\X.dfe=ipJdeMXW ozڻ[i֊9yY1`\6s* %DL)v'v}E@|c%ٮ#kGnIHFѴ-Ma.ŢLE(}YE.;2i!#USQU?fKBl=9\aDH;e5\ ѡIf|L%VpK8"Bd\7nb%?82^zEAXCAChT-LL#%Sַ텛k01H@ݴI1IbNקƶIX@J[2F is5\JJMb)EWraP93O3A.ʈg9GX&R1P:Oݴ0 yb⛚B!i˞"ͪc q^1OlVk4<ږ_tYRȋכ5=ŭQ;֫ ݎ.pwc>ڊos|ZSOfͱ?[yofydZ6o}C`2/n/g9[~are8ZC0 L|-]noQB^'Yu+XkƒKb]Dİmy/sg7<

rsw/<<ӟ}>33PK_K_''E:nRJY]#C%}.(W噪)@[mT1v8 LJ\D1I :aWH@ w\{[tiLy`2ഢ8%&މ8.9b}qY @gt`LADsPUs!$ĝsYui alKv4]H E͆JԲ9Hy]ŐdBSCuhU!dB"p9pAIt]4e2 d8k0R*MbIiJPN^RXㄭUײbdnGF"ACPhʒQA.,:PJy]J65EPyx+&z!goW ZJW ϱ/vi_c4%t[Kخ0̘XLߋy4Eh`dr B)YQTr2t׎ I̫ FAnr 08yRy\ AԾ˦CKk>EBZN%GBIymW(QXx:IU;RH0M!.QTE U)ŀQ$Trx)WW;ȖYbpI75a(zy2)rpBXN&In$_FEI qx`ЗʂrjKնR@A%|U)\N'rR0DӬ^yUa^fHG*u4]#82!/H)8`T2E}?, 7;r.٦?4br~)m\;^??7̧HYR cڽMkt\N.ZH?~2Ծb'yOǁ2ckp䛯o>0x>|Ǐ?xAưycFllo{oHF( 0O74]37|<Mm;R?=;~_ca:Q9J;dx0-at<ɀsHnNR4q@[qSm278gx!'4U?nZvox#Fk aBN-e$3ӄPo;N/'ơ'[g9cY.Sw誡Dk*Rq.52"; ӈ]dfIB^Sn VTdzO IEP2aj8d'mw RZ?ң5qpaqMŒ(EgZ)v ǧϐFdENEKJ38WA.c*ϴaFiEI&\3҉hӡT`:<@Qkt{7H9R 6ӭEFe[XFɵkGətCʄq.L{K[43yZHQ+M[,*FtF儷E[ꦑmî iHYk) "ZDYK2 ,=&epm1@rXeiw=]0uE31J;0(qMq"T,x"`.2T5J$ [޿ِK@4$=a]Qr LN(S/[SI|ԝlrJhSatY(JrEKZ+4EWΓH*gk4)}}ȅK)!ȗ3Vg +RCd8& 8[8O1MEZ"Y%TpuR| Xr6B;?sk:50m;0,3wlnoiHnv79=o#8}㷿>'tKx[uP`K`Yďr"ӧ!7[>Y8G+~GV oYp8*|{nv;qD9i=_߽aG^{ơBUS?pGO4 ̮ni7wXY2#[ۢ* {J <Ttsa۲}??7_3o_ۮ_b7_q9w Viq:\.<<>r8Kh|r9/qG!9cxc8O7 h.CO-!g!ȗ +&WVw<8koi5ap7MO{RXDM0|Rr 7IUagL 9$ E$Abu)9-9*(`Vgb<0?buC^&"Ӛ3JՎ\y~)'d$3*9Sw-w~u;)@\&:Dt^z%D6Bi)anY6ÉU݂2LL]U55BJZLq՚pF,KRm CVb)LWut "jRR2Ngںu;~a^EIQ,Jk!Q!(Y,U$vhg+5dE"ł ׮4VlD bT"!ev#q5W^.MNvXcb o5nd] |9c 0$ʌl.I> cST՚q jLVZ҅n!%kdn> gK3FtLS1]^xA;mRNqĹqVv0d L2 g1(cI lӒƳЀS8r;!,%ITb8uf?,60UYL[s&mkR2 NCcj{kَf?>dYo^4]k+h4aXu*:Y{A~s~3͊9'6݆9/4o>]݇_5mX. 9t.4_f>==cz8h` %̑i(ZYb^^g,VlV[:7r:sٿGpR|{^_?03盟8DSߗQ"Ԓ./U6N~EU5\HLUՄRIP`I()38j+!,4;r7-s %ΤYo(D K. %e(贒Hʲ̠͙(Rɗ4bs{K0~>v8XW%35WzPk!;yMMm:QOUH8J(*LJb?b 3D12Z_1#D2Y5`" TD3O3h0$"Z9sTC" V#RA.[QK]# d:[U Zyj[\„sPH躡j*Rm@kKə9H= &pU1ȟ9 _q+ ΣK!8''2U3R(E !SWӳ߮HI /Ⱥe*jA`<\u(_є8tE`+9ܚu\ )kЩ0^JG"FcE>Åfɲ#`Y0A;ͼHO[!(o@R[who ]CQ传 t`ľo[(F$4aAYKI Fq4(:R5kB?2@]ՔHE(!S+ݎxpUt(EJ _U,j^ݰ eZ]ΌܡlsBz22O*0Ք80xUK!%r*}C.94s YNk\92θn|9ѿ6deJ* 1mU\҂V iyErǕGqek ғ@Ud^>}aW4NLBcđt(u02#*Y(acHa&uD\&jHALJ┍m":,K3YUT!őTD2r"4ֱH)V|Pۊq w9V -JuDk0MM.yQ dgpQJR[()JLJ;Ʊ'gG^WTZQG*ș4J&,rмڂ[1xOPm6ؖ|at/JQqC_ kJ+gc+wxh(뭼Dx\ @Y%DIHQr?-r92q\:ܺA[$B1)e@S=0iB='y`Л)(^mJ1'j7-1/W*X c?$J[E onLc i*44-n6Jx?Շmք۷ئ_rd×W,a wk^mVD"p<5"0b|uLEif%M-5&[Ⱥ0@gk\zoYH<<L۬8wak.9*2;F{2,˂mvSi㞿ȼ~{onLӭm:>>ԫdSǘ0s|zVO?~naY u0g3-Uc=1l6[֜V݊3(I:Gw|HLl}+H"_}w?? ̨%anhe$kV { g,j%a*NgoaGLɤq_5%.p$6 Cb,[UwV8)\ZqL\`| 2.EB.pht̄뚒!Jl9Y횪Ya5g+8SuufF\2j#TXf7 uJ ̸^ u]BDkG*p."pArѴa *L4/2n!L*ty!E]sjJL2Ϩ% ݴqbUւǺ۠PRFV y^0kcyO̶%PFズcSw01 {XYԞ{0⭛V9ZHK Qȅ )D~I$aؔ2TU|F/6|A-ۚ8| ˌ"ae 3x91.NMt<_ڮ9j;=WߓWo^3$`o_97^z54_mJ]U Y{YmW҅gpa0!38Ioh"csGVmHbo;Ѽz U~2 w~7_t]0ׯÏ]ctp=g_qz>~=<>И ^||ҖnO٬9=5-C\8N @0n#c#zTeX ݝgج̅noj6\fKNysuC[@ y|>z\ =1#o޼8!ɟw-؏\ !|xA5OKY. ?a7$ ,7]uxeF!EH)QDZ"^p+5LL F~հA6v"dCF,cRbTEp`cOrt I+mkV`ȱ0_΄*L-0Pgt3r(ȺDg_3-WEڵ pBеH$ˡ7&n3j[ҷ" ζXqxk4N*CXf$cɋTO4uĆlEnc1B΁\ c.X)HZ{ۂ!8RXAZ @A_]zKHu58uŴ$6(X]*ʪ[coM_U( U2>y% -C&-*%r@D^zY(~?RUUC pX0^\K gBŀ" =V b(+vqdDYڿ&LW) Lz0PMQa"c4y0M-xՂ֊<03ZeJWAalA04mG!Ws yQAJ1@VI 7^E9t⬸B% )N˨[xB 3yD}P$8d#t.*ю%Gs ,= 0mՆid49/8 $=*3NLkKé k E+P\^s2(!B+re쩭'f|+eJX)|Dݮ)^vB{Jqt,ȓ\S$rsYRrA3ЦnR5]';&1'N ۷b3^;@1Lj2Lc4E.U#ϑ4aʳ䅿ڣAANEU5-;V0ק#`j\rϟ?w} |Ivrf{e\Ll~W+iFgEbbմ< Gj-% g.U5ʫx:lɕ6fW_Ѯ6^;.o~î:>Z"ekO/ϼ6+~GM' tWL$Ώϼg'UJ2H1b7|Dƙoǻw, o]?gzLk寿!fxtほGr)\`Z%UlN{T@9y9(ES4MdYueU^^ J./~d2ynG)堪MEԉSLrp׺ULRJKI E2Fb)KC 9T`|KI`,^gBi J$xТxH۬X‚z BV*?YLaa&jWL\Fꦢho(SJ5<83*K)l? 8npu*Bҕ!` RQm䄖,Vd{JNQn%ně(1a*$[Ie-T?FsxC_)?3]4Mo:B!U[(guȡ4en@\R# W$Rٚ9I8B9g3aqu]a*DⴠT!CcܕBkV0ߨTU~>5x2Nk1WJ.=Y2JNTtˇ1E:LZYb ,77%g4)7EV( Q+E^R ĈoZ#LӮm'BGnϣvK. 3|[#ht`K"L,XYy(nd 2)CS("NydfobNJ*#1%[72yr躣5S[4L\גS_"ϐDi]%rTp0bbЦz \D ƚoMX(UGΑ J9"9cc8y?氀 HX 1g5RK\v嶹tFcpRF)qg|+-kJF)dQ5+|9BRlN n 4(!\ *ԗ<G- nPgA5L[Y=ӏob1\bh_{=[nZfx̐&8 eĂM.cDl-`mڭ!,e剗iNϬ~?²V?D1C!Qukƒ+>~۷o=#Ӊպcᵣ>g a"_ l?84v~x|fz^?ܑIoLa^QO'1&p< Ӊ_c\2q.<|:˯O(!&>=0aLMT)N iɴqib&^9nWin]~ӬW,D^_{~7vxs\x9ݱt~/oB9i̬[ 2چ:0 v]|XI:m/-zlZ./B V['|UsLYuخ7?7~;}ߐCy@g P| ȃ6\q]w6[u$EZjz6,SOI ,(WQgyfd43~ 慐39ev ))LNЭe߱8'S0,7['4XlȄnHA, cdoV5!gϴU K͸Ę*3]Nd%EZj,L#a0j%XUPZ +.#i|w'<Ю_Bn)W@FW y+%]z3_jub!r<X5+Jr˅\g.IZ $.8O"Q&c@uf΄y Yh}fE*մyb,-@U\Ȅ~w)EI2^73`Ra)cïXBlQŒN.)vۓKqU+N"=-U(@k$&`,Zx=Pkh]C4yˡDkց0(TAfRQ4M}+Y[udN5tQb54`Q(UTam47xgvZҸMpy&/ ,'9i D !Ƅd KjVh@E'r1F-h'*T%~ J$ɢ#MsTظv{x e3FGw~9rA"FЯjON+qRO7ҍG)͔grޡw뇯45wxdÙ8|@]q￧jVՊ1LԛʻoxPMݚ fn mhG #QWSV~G^Jӂ (6+{p#J)FJQ 38u6^oJ-qˠg1%e0eoD8P5ւMVvªox2<GW77R0_ҴhkH1UM( HQށyqJV[L@” "ߺE&y Ja7 18xƑƙy,3= 3|C;Z__^ÙWqfŸL~zjpw_{v[xE.2NwH!%vw5S (%4 -YƁͪc-Ñe~GͫV\.tɟwhجפ%PlfՖUǑKF^fx~coSWoD+a>=ެK{~7|{8 Lθ7;4[y"3o߽<*q`bB&|/w?r'~;{o7r૖xݾ")C ~ϴ8YGYFl-u[jx+o1, HBچ9./ʣhjT&6502ZӕGE) Y1Gǐo)Õ\Fl+W#F*^{ڻ*M⌳­<iƀ2+zO Go?B Fʶhy?|f)cfNp_"\0(VzDf)a2e* /T6"729fB1Ns=F,B 51"Ӷk4QXN [1MW,f$:IV)%*Ta 1, 1⼁e!1#Ɖn (9%X28D9尐c7k 2IۛBDsb,֚y)9?4tTb  &՚ qְݬ9%n{v0z8ox=xk|xx\J+wONv5_ G?O#Ӆ=\dݒb[ .$^tk,O/Ē ̖̄rfxkx|92O &mӏ(q_{?ݞVN/=ͫW<>S59gغ'6:d2~ 8Rb/d1tw;N#v('T;Ӏӎq=oQ1C/ën1d! 3q LQW,2F6=8b*nrxf߱٭NM47ٵ4KӴϱ-##RP*DP+@*$q\n #T j # q 5Y-oG\ޘܴ}3k~$Hw6+^^xӰl_n#!&6XT4?Y=Þ2EVM0O4wN,a̷Č8브#$mi )py ZӀ1rE+o~3S%F~a%?S _'͋ݮlKِGlѴ%AM3~o7 j a8Z1: 0aUf'Wg533M@UPQhzKmUT(CXF LXa,Z+ȥbwC*,9`|RϏ *Cjoej-)^hrZ1M Kt+,+eQ9RgbyH^=g )V]Jc, PPK& tH9b# ]k$9[YbMAzD8Bә0{PPrxY+ klLfΠUkb;B F&EjBӅZ& :Ō$)4㜡R01(*XebB n a{K6%* a<`}V=!g.0M(`p8'.4B "]#ϫA}-&e^}+HWVk>1b94tx´=Mxm=m 3q_T]̮_rvv<BN -8ox6bmd^~0Ml\7?߲my||bt:b/7~5q/~r> JŒqס@2 ׁLJÍI^1st`ap?`au"i副;BNLPns8IBxy?}Ezzek[bμO|woWJ#8(9]oLt>sVp#ΑxaR"?|$Dn.ý/ O 8Gf G$doe 5YW͑thJB- _"7j~Ŕ8݁QX g h񉦱,eڑ6 W;R ӕv_!f\%Ɗ/BǪtH={7Mūa!ʕaܾA't&)aЩ ]1xv^m45W!vЖ0n˶yJrywVg4.{m_iC5ba!W^kH] j8Q!L 㤠L]PU.2Da"6gB#[clV+Fa[K:ԒciPU\Ÿ=7qvO'kJ֣Pۙf_rxoQh-sgC[AaB)iP-INr86(/Ne(v̷3]`x{6 yP6ې+1WAdsexqd ax]p\%+F+\:y?[ngjX+rHmgzc* oy7?<ZW~[b yqej~O;t4vWr|׹W|ພ@dh !(98=Ǘ=ZWN&U3qxp֐s!#Lߡa{*p8y5[Ne3麖By1~k[RLybtL(y}vI˽"v٠1eGNח=v%{i%\n7qvH)w.oF9Ja^K_ZKA,K k-f \ ! rY3{.aMAa 7VÄb O9Ud!U y{E(qf=^nx୐Fs"t7BZJFeSIb!|`hȪ6ަƸ#5 !o0v)Y.f1*va\t ||4 4bۊ&D]'Rk 6D|BY(9}bH,7=qvZbXfk 5J.޷hUC4k<Ή}^q(v"5@̓l\P(s1(+dH3"mer't> AH&~IIYbܾ W9Ah[oz8l3˶G)p^,K(%_|xt-__-3j~8nvA ͷy3UOW_q܏|y9޿fSoؽr8\X8x?X-98kI)q]hۆ/3R8N78aӌwi8,8 83vr&#o~%qDY4ѻ!΄rćnz1E/7Wo<(."/C\:Cs{qT]&-7ЮNOroZƜŪ 1F9qJ,RjY-15nh;blm&JɓoW+5 L7rklLǛP]9U eK)+Q+[тmK2}ӊ/#ehB-RN#R;ؘ0da$,⚁Q vAzhu2e7J cYu 0D ӶCoۍ ήHe[G_(݃t)i93|6-m0ň=NYiӌ[T혣y!CƠڡIxUZ:j$ uP̞ ]TDlIX@N9OV;[2\ۡ+"aJaܒ,ܪp Œiz6(DL^CKH,n0 xq)귴؟cĹR=F5-YR+yxf\"7aHWrB QzU%92ds2UIVEEu' S&qմ?$Yp1"jDЦ 3&VUftxLI"^U.`p˷=b+ r(*\$"nM mf_ЯVbn`okqohhJՔ.sMK'bN4ixݐE50A[Ҋl&ke{2cF`L{x60b"i5<6 |Jyݽ&dj)JwT@C˭|C#YWt!Zl"2J҈=ɯd**6Z e0io5O(bs%79D J/V%%rTIzPmKixXQ$ebZq?ATtLt(Y5\Oi]<)l2zMXxzxE!B h cswzY*$d;EMh)vx&W>#8mC'jʘrKunA_+L#"il#ah0V.I6E1Ѡ].y\^+ 5%^$pIv20+hIDD+T9=Zqo'iZr kqE4(TR[W 8'GZf._PCNedo8f\@ke&0'6R6_oaR!q>u8 4ˎy)/ UWJS`Z2Ϥ?: 8c<֯W{6ae:^6͎?}Ʋ{e4pMPc|8\>xX.lj_~f8qa˗'1?5u9|/\/Gv(pУP4|3A,V7_IJy6u /~z#kj4\I}Fo#z$jpv~//olƒ7OǣlM 4 92}9Pke, tbc^3^4s>iUO7?g\~̯oй}Vr B}-0M#|xOLy雞/?g fMHQRC͚Ӟnp>݇/$9EۍFtqgrԐXGFszgәR9}|[8ӛ!L-)2O#)GBufV idYU-X[_'` ?zūov =`HJ<}z_9Ƭj#4nZr8sURt5ݫ7}qwZ+y麖Z+K۟o^2'Jgֳ*snC 3yfpd>DSrծrZ68 5D,|T,5ZuԢQ% VJJKpD`Xk&],TBNTil0Y א/N]&rqpj`5"8_}9KE9veS)3:'j1ha;о LZ/bq۵C7)j n/2)a&, j6h-ЈZ j-*hi@Wix0 L5B)X):Bd2nejYO',[|bY`/^04N>7F%),q'LufY$'uVVƊ]BJ7RE8!Պ69J,*J1L,<*8Rrµ^:OsiVMKʉ9L./ 9BzMj d2qLQĸbcЮt:A \Oa4-ѭC[EU5%%lc*Z$i%s`>*ML6Zi)P&(~"Xጵ\teiZrE=oP7 %'rh-Q1i\'t2„yE55ӉVPS BAKrIC)gx޶XZ䐶maF-Αf xn{RX@Jҥ\ʘ|<єB'#B1.P*/GE29fP < "gUV!8kP:1=~i`}%EdAc* tB Vl-:ʅ0J~sB W"KpH"[m-U#*G]1G!Ozy&U#Cpm2xپ~f#(yۭ?g<8 6k1gwt8c4Ci"7yzk (CipVQL! M6g:}w?{_77dw'MH?w|r+8隷_^7|hؙg_&|D7n9HwӁf~*o޼bݚ#Nֻ-?~Dx5\])<=<+ht-әYBMGonE|߭h'sc8޼Td ٮ9FŪmYW\o8~-9%i$tʗ\{J(%O,P3 2t"zwC.0 goDZoF"-Ma^F0VVUi'Hk2),ͬ4jWp@SX@=0Q#VgWhՈ,%L|h&LWDlVӞŋ,DRaY*q-^i /S']cpM&keu'yEW !q[-/4([rtRqZ9'V+ጫz 1e%ʿw)'0_䈊Fmaq@^6##ˀQ4BP8\8O hP5PL\ߐb&#ƈyI5R⛆[\(q [V8IUoVa(tJ*LƉ@Vٗ|$]m%eX29f84+۴-%K[+NLRZhMRlJY*PJkĂ^KhMg|]nPH ɗE1yƻ쮝e)al%=GH֊]3Y{lHI5 rFkP]idI m5*1(ztX+z՛JNBfm;!e⣙T22bGiX M)T VikȡpVEַȉw!p2biXR cpp59Nʢа4Jfh.Xo*Tf{&<4$)gF:XBQ+[٬bLxTmsb!՚0n[6||vaϪixs$ 1kT5o<βxO^y³g̛y>RΘ0]i1fgqPNǏ\o6t<|!&/sge0gVkqͭc 8pbl ,®(Kb́@)EZ_&΂E ( )FR),BM_S$H r)ג)HRL]o躕QV,9`Ue9r,ܨ3Kw2/8+\D0LRz-) eGef4FSod3&,B蚦L^I9r6lB_\ʶ^HUJ y%5jA7+q324M RtGN ׭˜")Buo)-Tm j!Q%biDGaLuNY6B 9Ny&)IRTב~]/vs@iװyZh1N{1;Fiv+ m4qVT5eUdSzT 5%Y5hkm{j(kD{\'֒e,F P\b7,ryd/Sڠ1Q!G9Pfݭ(%ؚ@aH)`\2N^)ԸkFa1:1.= PAעԌVwTUPNkQޡv[FTBZj.FbXVZThk-c 5h#tJ*8ZdHr!,Q(2$R E,G28tۭbj0X4 (˂ݯdX*՘'gnE&QBZ;͗ ˌ2ti}KDŽEƉj FWEu2QT [v8rN=j{J˺#gkr8Y X rl#eB""f)0[w2.!^6Yhѯ1vyGv/v~cnÉsv~c΅i<1~˯yz:dy,u7=wwOg 3K|]˙>K1:%zT'8e:+RŽ=Ip%40FJiB)8vfuKV UFm;)9ZgiV JSXvCi/j)5aD^z)H,bCV큦^ }% z92pC~-;1KQKKHl(USbhuI(bn6ti]GIJ2ElKU kVTRdgR `L.J|E2WSs׷dˆ0EliTK*VJcX)Hu[1Ge_6=w&Ӏke/s1hYBW9)1 ijImeɤP K^/ӒfKLxߓ\jXYk4]FN6lPK ԷBXe)T$aOopF_AruiKZbyP H4J 5di2E.f&B:MrJI`wUEH\f6UȰp4Y慦ЍGka5Y%t14Ϙ {QZĂwШ|GY>Ss ^UrqQ$A urriBҘtx@Zm!rE6PS'J*i$PŒB5TyBL8= z_KDZ R[)b<ѴRhv! hw4]C-L%%B<̕yYx'KdUcBum5)w,!`#Gsss0M\i0 ]tw"/3q<ʆga2Nnb|{hw|5G|8G_櫗'@g[i8%T@8/߳ +la#o~͗2p ,#q䧿<ʰGkN=UK>aA;˰?ޮyNth͚GnVB;>> ҄Li^oy:y^8'mGP3qV!'~zH߭X8sn(5y1 ~-=f" j^^|*_Gi!rs4,Éw_H_4~& Ϟr'0sh`Wj]p&Q#QeYоEqJj ,0ЬzejyMhEKjEԆ֯8F+vԚHmKjǸj3͕'tE:;eF䀨JF摮T#IPb7OnQa#\Ehm#)-9D iqq8]B9&k%kLźV1(JXV GVGԗ6D*W;4\* ۾䄶R2m1&JT])Zak~52*jCvS36%)%jC,3Ṽdsd2M$e #aeFEYFJʴH1bY!$0`6]QB19p]$.3%mL3M+ 5%p*M6(A!.K9c=Z9`*1,L੍uTaF+U%P!Gְ%CQn*nC%3{UqV򲵱(Bz<6r8bwI~Tjʄ[ΜiԘHd :yYTAYz@˕qE}Gt Ċl-P4)C X{\P\Hwܮ $VdE6,32*Wf`}Ϻ RAwP "dDN A<(+)j;ʻ9eN)B)r)*"%$A[Oʕ|ْ=vKٽjLrAYLi[ t٘.JalohV=V.){V7XoVԬpmqݻƙ4G}ar[C`٠a> =w} GvW;9N\%/<{wK8,L1pq8 z8OLD߼33|߲?xw{yħ{^<Ŋ݈R0&t)џ?U*?{ <Px3>>^l^>cw~ymZh8O1\ Gj0O8N#MQzI"Z1Γțt>s9yʪIYN#ݎ)?~vM5UR[Iݳ+~g5\?rwmN3:ar)gF>g q0͔%pܓDjO@!Z|B֠s٬Ng]ǫ}#iZr׆w*<{۶ ӑo~ 7o^r9>~wiaշ5v/e\_r%4%>}q@ڢLtWsy)^X} 0ѶjÈm/V\kYR6 k5L*z5)G4Rݡ#Ƣ:/:YraVc&zy1V渐t´[1ZєqU/6\XB5b^%Rd"YZ(9Ok4if pwKM#&4b\#PNU"%GtS6<*F$j dX2T#" (mC QldM4d0XT{[bLӈn\[GUJ,%%k 5⽔4~EL {]IElƂLÄJ"*qF)tFdHtT)5ݫļJPMa]'6tU83 i3F+ھ' HrpmỎ.z{iu䴰(c֓3)Yf-,s 8®q_Q*BR)HQbMR)4m(\hJ(@eHK'Fb& Y%'r۲ZXR4Oax^X$iEiĵrý1Y. V21jHTqMDa9Ŵ& 0c|59eqKT' #)5 FkavJQ )иݭzLp@Qeh5䅔+%iR4^US"Qa hg/ߣ.3qJhU lpΓwIhZ/ha<[R4 <rqm<eb={JKW!83[a}+8wU0QIb@);j丐jK\ϲ,rkZ&RXY#|D{sK#}QBKyU*Ę2\ѕZ"CSr&ʉJC=Lʉe2XD\"/_0in07ھ'kHKi,j2Ӟ})ӃœTX'|䌑E_*rkEHyAwF|OǡKd#Y5f](9. t qN\P̟z:T*(u:Bi6 WR\ʠb [q|c>Rj\8O?|d=O3M1L31OOE'_=oй?$ [{KvѸ2yA5$U1=#@hm0ZJVib-<lӈY s+'h5L\)TuTk);I&r2jqmKV3q8#]C^"*l8BNtVkȩ(](0<>4!+C* у) в',gj((%1 GA#U9Hi r3΀,uj%̠\k7P)p]24r<>\Hw;m EO:%^5Ԫn"_>w<9y/xć7[lT?yzsG=?K1lO|5WR?^g?ǧn7*zEfJ<~抇 OIb{Zuܿ}Oߵvz}~Kjdklpꂔmv|̉O5 ̗?)~諚4sӟ7oHtũdb[_o~`~]8?pf%9%a/>'ϟωW?|]`y}~ĜNWKvp;\]KTkWO1QfJq:uMݬZ*xyiWSk4y8⧙nGӋ@HgRXkh5Rʁ0 k4a$%12Tp$l82DtL;w̴{r)+ a(ueẎqE39M' |GtWNgCȼ{$-~8R/kӴ=TSȷMoO Ca [Ҙ2̅uHͫo}޾#|)5>=/??oc\x“'O(>pPUzxd\QFǒ1sdq{~ßFB sՒD!]$%ٟ0Z!siG>V]1L#|oIzTʐHLW/?cЙon~x^/1/d)_e\_ 6~f))b<ipذ{sl?-ՊsHS;x왆LE-Lxd{wzq|f;utLt1կWklP?t{G+G dъؿK8Y?eߡAU$Ϗ&f1چ錫zm!ePE {)&jE39/DTRKq^p?=$#[?i:) arP(B[E)u-QgJ'iDgMշJ0ʏ sUݡkr(uLMH ʉ#C CL)_\l˂^4ڡZ*+IQqsTEWw`+\Ubb:+ӁP ko]}k5,u=)=i &cn(+$*x S{:-S0>a jbNZrJyİm+.JJ)(撵dcʴ++8TMKYak[af}o" M0IUB0m25ɟ%PKg-D>2$-\ "/J2讲RgV$Ruq1G*'-Ú*bD֔왇=؂ XHq#bKHOV`[ tA58 U )̨Fp)fl uKJXc$jc4KqL hO;G1B(e~fquPRFPkM*BM*$<2M#]ې1s@q8GݒrYg۸#d03L~8*gJVy5-9q] Z.YZ˿3j; A!dc-&#A}#[K]aJ<i^'vcq&rCUDdb~u'ySA-,jr4讍RZ1ԋ3Gr)8'%鄆-cfJB+D1E4snQMɓ Upg`]H%́OWl;t%N|_ %>7t*N&V~ORY,:^󚛛qq$MjU%}ø.qɲANӆ|5DImۖipjv#tc5?{#yyxU ~Ǐ{=UǙG7̧ ?n=&a<1̪Y\1~ȣǷyi^7趧q Fqp`hMAs#9te8wb ӈREZs7^=b8>pgswY-:xfqex#޾h ‹%36n}6'G _xx'|G/_)n^ul>N|'{{'/*T^LtgD#<n`>KKQ3n,neS-)}pDws#rqm#RЮuB^U-_rqI?KI#я-Y4+;x10#L*53+4P+ )Mj< (TyK];42Ł8lvjѢpAiݡ+c*P"uMȑգ R?rd:I)Pv7֐ )ˤiZT\ R&_dǦD)ZڦjA_n $Eɶ%$ 2CxOx,#%AK@?GME~qiaB1"_:U j1%P]՘bO :dnPQ9+r 1LQJA] FiÙhW8ZGcME.ĩ4%L1.M1ZbJok#$}H91zOSw"],Pl%E璤ZZ)*~rR9&x"RĵK4"ګ42OTTfRB5CKLR)t@7aj1SxiCյyP `r[>Ԇ#pivU 1+LUE5#Z #~Pb22kA"4L-7F<꺖KqZ}L9!e5(i#) G$FUciC #EErw*+%nEWUa2#DQzX-28c.r4 i!{"qӘ* aF2 񕸺"19eA[` ?/nW\cµK$ާ)FAΤJ.``lzR(P!ΌOSS_bcwU֑ P晢5N;T nB#RH3 @P)e@׶y&BۊhLVd']^8XSC&LLH35ZWVhc8wEQDٚq$ LC%1U0'e~O[UKtP` rzyϐiT \6ɓ.,)h|2k>0 '5j 4q:/h]MAo1O`ܣII 8uΗA JS-5$:GN#~8㽧jDS߿']בtߺE=sJeag3}`ffϬ7]4 ԵD۱oY=xNh8w(0v/+>}d0Qun ~~fs:sZƲ= 㛷w5߼ɚݛq>s(e7'2IGԲ*#~{O:VOxO>V-W c3}\ZۆfËg/*#*e!E\_3,&)J2߼e\RYǸ?˞2θb8.[y'|9<_pwړcA78KaaCfêjx 5UaGeiSJOz=X6K<33c^~M zM]6AjēO5iۊTkV ʊyל7g?%ۿ>Lnjv W߼f1&9Gƺop扇gl4>|!zX-_%o_g0Oo9j״m|:-n-ͦ%>]F0F3J+b$kw9xbiR0Y\=AejZwK4ZÎJ* KY'B )HqӑGCoW8q B,gtUS_]Ù<L2E*/ABgB39Gl#8t5a:c##9ۢlԔF2T7D,h-_6 JAխ968%QIʅ {uuaBW(3VrU0*5lG+vn B kLt0QCWOLB%k'g=_RpAaH tVʒT5qhQE|;%fΊY!["\ :GL1d1%6YY T%4] 8q@OL5Y r ^#1SqQ=jAN'+Jk3^0#j}!hYV1QsI"B(P.,Ň+_˧$*W(aKQ^0l;rHL:*0J9ִhৄ3 dG\ 0Og51)>'eTiE^ڡtM}%XcIIpZ:I K 81NW ?K&VuEIc|N:e%l+JR8NJ.`iZS-;M/ír54-rSc{1<|B9gO)lTE&nITBq5`fN0,XecPq8S{~wG5i&F6~ӗl A;gq0RY4[$I"!y%Ռ͞~uۿbWVihWc^X5<|gv@pYrBg؟4uM]L#]۱{U1#6,K|P9sFi9upb`g>3wÙϞJj8|O'>a fjO3p"ϑ~ݻ7UrJ$sI\ Ɣg}syggȓ< 5G>l3 xs3+O~55;'٣wOo;lbۆ%@JjuΘ%V59L}Lj5s tMM3i,czEi_b fa#&kіqYII9H3Ās-J˛>_HHiO[꺇L0GV>P-zp&AMɉT Jg^u0m|8Q9DK"M#̉ fu 1&Uq"1T#$11'׷L#9M4}9y,rp:Y^]1 #IM]ȮGYG LbL.|לHI)lI0P̮Sd>`aiЅlCv\jzLUVkna8Æ8䋫]8K.CW1:Chec:4S]i'iD Jq)E.6m,!A@XK53v*SLXʴGWI,ae0JS&h0 Di?TB\քyT9)Eτ H|ȶ-鲙J1J!չ co_˗}xډ0T̼C^/TT\"u?D*1ơH QaYY#'LҤ<IEGuXK D7ExiC$ůndd%9s?Ex=u"QWJSA[T}'/RBA $h$hMB*Rк`51PV Y":L%fUgJJѪ(F$(g1#yyٚײ. EρEO)Ȧd\%f\4US_"pD4%'N$r ^1S 8,"qby[I9aMFSحueӪ!jA9MGm*4  :[VI^.!JaH:HuW(6+KIhuGL˳"RS)@`l.6#Vzed pPS+Vݴ)8g G%vb<dkXUrPH'Ck6q(Y&)6}jSœtd0WW0(H,q,% nyǕy[5!P*I:I) Aɪ\$ If/"Y {=[$f9QN#g93N#Jitɲ+TїΖ#D k=UΠV\99ܟ/:!AT9 PtBW5I>0غP/L4m+4I'#?iG!BX]O?tgeѺPi"Ze+N._D̥g?k>-[ U֦͐QGy%#P/Q!fO`ٚ2'bijL z,yiVa§@AG^3]"Q*EC۵)2o m"] "zO4{#Þ&ɋ[?hkqxt{1*J:vqI0,OٓǼyH>f' 2 yRpGS<}R4V_>nڕl6Kt%Uۓ, t[3f{dO?e8%q%gJєȣ/?ev߿GN7lׯ9 '}ƶh1ew|㧜Mȇ׫/_;y{|h)\u,7l?{V/PnU$I!vdؐ!@xg <0xbj,D7EM_'dɗ6gQRD=oiH1`l5IXYzF(Mavh )JA.Ub}iY[|.Hs/jHd: e%["ϑ`@@z$1e@(EyX5Y? a D (A/U(Ɖb )ih,KTitU7X q層uӱ̑$"M8A|8Y֡'DYRr+39kJbV)ɖD)*~v\ ~֚0dcExvHDKɾ:KF5||zQ$ky ;e21`9LILIHukvk^wb;Ԑrf{i\(Ap층 FD\ɻyI)mݣ`L0]o/2\_]s:t:Zi~O U,1mD1Zu՚qXaNzeYmx^XN+۱? ~pdz-i'._[?N|#$w4Tێ_ wOϿos,O>H %Bߦ;Y4k՚ݎ+튻wdv< $r0 !Nm-a^^F[Gߏ\_p<x%%%裗|g|ۦj4+\lӂٴH?O% %,%hwSt:b 3݁ZLS?쨛4,w{֞idX&y2"KLEz]JaF; ht s(Hsqvu4Â:̷+buVbJEπJ+ad#v1E݁k{k礯2z)H׬dTݰp%A]Kߣ s!C[ɥ$FhZ~d[3rHQ.ZJĉ4Ѯf8X&9adChv2#iD]˜&2YA0=siKRIaRT+| xKgڋ+~`b 4`9gT tY-~u vRwGǁi(cO[(G\a{Eb!LXk\j_yw'.kM˗;pcUK|ݞ_DvK^Ҭ-qb} at)oJ:7kN3=:Y[9O_u0ۋK^>7/_f)ItxAHai6W5GqfI1<<> s<Z(LSt *xgg)iYBc,abf s$inU͡ikq\\]ӵ 6+~OП^U\u) >QkjDUh+iOka!r@rBM({1U*u錞5(SIUFAOruezj( (*:L)<Wd3ne1R P90S5iH*Sζg V5]SR` 7/s{5%g*<юSX,YU-C?O?ń"hm%^zuKbgG1H#ۺqXW-Ϯx|w˳O_5N[Au4ר)O45ǧtۆc^nO=i1m/ycn-iH qY;va〩]9qoOҩ~2PY?bLL37w??x|e$jPiV 4S6^inMrIGkt:Ky tyw5uӊh}nOGJ):Џ%&\+HM[oǑ mjV wR1q< q)]m,dJ<c z^#cJTX=]|Z&qb9#U>wNbZ(K`"k6BSgʄq (2X*1L^am)iځ0gDeWGPJ!/4ywϓhۆL^T+b['eaIغE{TITM#S 'ֵ\zYT]B4Jh9L6)ZiRq@ώSO{nE,96ӄU["%+{yoo.p`\0 ٗ ac9w[R˄w+bQbYz'8a*`"GNq`sA:Ҍwpszn{%!ϲeڢEĭ8QǷ;B,175N+XYcr))]\F-ZVi%`pbLg@-KNB(+M:N."E 'h[[ IeP;|JQڈ[F\:w5O(Ri9{vO yӭPaG2{DbhGe%KxBR7 ^\M1s*0|qNN֫C߳Zi_"{5VWY_e!80rl<{Ҵ@N=  Kڴah2ǯ^kأT4γhꚛ@W7y*>%0V5}b\ Dnt(~˟q,Oow9|oh/n?닎<[>|xG/y_յ|׌;‡oσ@~{|dxq}o5O*mq ~xf[-84nũ?S?Y*vÄ\aU!ZYbz\]cdwUYu+~/q"Yit'D_8{&9ܘ $)愩kdS)buQ$+4Y1,^\PoiV51+mGJR2ɲMXud$]jGLu%6rb uR91.kŴɬ6BIADY!CjŦ@C.)8`zd&LߟXo6JzU2l4OgPV(d Eʙtȩڶ80z qIVYF+Lcrhej*XlJ3}pmKFL83KYB@_•/ [U4ܣBYj ,`,iEa|#Yˈkjw8ae YYv{Io2dUDU=)F(Xi(1P5B0QVVk |yؕs8r{Rت(2~j;ȁu ED*Fk)ড়]BŢQ@Fx$1V"9El)U9cA9)$bDk+9!M+yh)~"PJf0OpV^L;Tq(-[P8#N{TxAжfp%wl׬l|ՊQA^:'yhHVQ _5\8T7oHqPfR6xOL,XRfGJAlgnP"0H]kRXe,r%fuh(e™>M"L V;ƒEwl/7PiE.x>̧qb zYZ[',3hT.%kChM'E)[߼O>G V{vćPu*f<Ǚ 4 ?YבM5TZ!G}s%Ι vM15K,@iNS8MU4#a09Q *bр`}-Џ:l%}A{Øg4b8Zd 6R&RRJ9SKʺ&"俗I\Q<pfYjsuMYz_?oTkj"4m0 8 B8@5 ZAU$R_R ;j) E+8\t-E[:wCŌ.x6Jf+ F r"X= Ľ |v!l./Mkn?:߱YXbٮƁy^(L(Qhפ9a8dI2=v;aǓ5cbKI!p;jSNO{hafT*:^]^*Ce,-kh0$Kl,?gkV/>SLWoXϳ{Z:ag7l.|?U0G'=IWĒ8& й0GJ<}Cάғ{ lVRtb'J"4KܝqYAB+Y2BnJ1 l!9g\IC-9%y\! )EN0h7roZnl#f "H8tR(X2i"*4Su5DRB ?sj癦ݠVgT!ǀQ($~pZR6E#˗|y&B 8IȶxƓj Zh@,PU-R% k8.*ξ ԇeag"{GHE x՚q"I00=@XQh yG'CT#)G6i28*92p^(Wg{BrB4J%'5B֤qZ=DgN2(aY.1ޣڵ&y҈k:`q*\0d6ʳG@33%2jq[c (p#)"} *WUktkI(r,5E'݆a(4JzPQi ,oD\E9'V![#ﹿ '"〷㌸,jO.W8L00N3irn;CwwfݑlRw<><|/y=rqyvf >k[?9z!ͫkV81ܽۡ&gklW P,߾y/Qib j홆O?bqWa/%o2/=\_6u?h|ǟx<>a/^}$2`6N=77W\^_qOy=*nnxhq`^c9^|O%~O׶2 >ص#K<=HZkvCk-1&ty~oa=de[6]߿W!&tS(^|#lV\/Dm8<ڊv; N{!TZ?a_J(:R(.=P5iHQbr,hgŊQܵҌBSƠÑv$"O+_=O]Ss2c) T750Pq )ZM3Dʓ&cJ^FyRZhFHfaipYN{2(u(e9*9WaAwJi/ [O丰 sh*9SFW$06RY"0#jnI)3 =MY#Ud< FNoʯ(=UB%NJ?˚_U(cbamje(4MT޳b<9ZEb:#u1zvx:vձCix`@۴{r 'FWl 8{AP%3LZTNIȋW<=rЪhڎ߽DYnWnu_Ӻ aG$T%UH"@BBU]dF8i׬n\eu֜c =kj3o7h>t<}?;fKؿjb?b+A>1͞?*88x-O.Q-f]]ѿ'jN>{hooyvw\]RӁݎOW_s1'|xk)ww\\_'-<{<&C6ui`'&@]9ASn캖d 1+G)=؜{wX]؇:R#<}rE3#K;?~OͶ\ /~]jv5ח<O?F 9Gmڜ4%czyX7υI]Jur0x ڎ0lc5ՊevP"Ꜫq q lV;?Bkrhc>4v 9!/ c(i=D6?E7nMP9w4Wݖi SE7]eQlӋ5: aꏄ(ZOb5-/g0SNت--kX^9)2M'ںՒ)9aEj30ɸaOrp.sqCXj]l[r 9HR;*H9rgL.x//P]2ZQTULqoJ!Q%0JQ9ʁZmLJ(kꖫk鎦 b⥮QQ"{{ j1\NP9.yB{T)p]cl%nKTx{"j}!OMLiiOݴ\]Phsj|@Zz%]@KZfIGGB`ΈVZɅ[ٞ-. -ݓ$O,RF,)4vj](w&RX[cgًVog\ס^1g`TjAuJ|y8KBU'̃\SX5E%BjQŧlB"f~1`N3'-6wqOQJaBHޣ%k()1fUJPq㩫4OB&+wMkW0 %-t z(SwlPX*BvEAZLEA3̐t0tDuqĮveaL\t+K@խlsmubӌ39]Ֆ^vn'neEљwg;v[TӁ){%iGN喙6p`}vjZ0qN;aϗ&eAՇe޽{O4M5uUst cߣj=v#ǬM0?a؉J)=0ͯ0cG'^|wpdmg/}t9>l/v\=ixx;)$>G{w`Nz)يW߾0_?0鈟5?~0 q.x%7oR[C6 ggg<~dqpwx⣗p<)s~y*cb%YПV-Cl[ydhӧϹ`Zm7 jrtgMۑb: qU{:iǛ[B<'MLJ1h麎8Nԕ㣏^[Jl[˟pϟ׼/19o~'Tr{w+wX;>s~$gjlso%o_@?O~ šO>w e^姟mVO&NonEV 77x⚛br˿[喝[bӴjWPE)zLRCtq'nE!,k/*ZYJY~YcԆRJ O6V)*Ii3"rEeBΤIp=uF $4UIAxYѮxӉiܣ܊zU 9I6)qt/>##OIYP *Q|K_jhU1o֒!v+y+6-yf=FWRH5(*efJQn0 rq;R."%x{4k(u𧁔vR8?^KF@{SJQ'nYnnNn09BBtr5"hEJX4auG,I&)eP` =Z<(^$9CGT*K\'{400(ѤjBD%'(A2)ORoTw4+P28b|l3ˉb-&EJB JQbخ!T(VJ" J6&FLjAmK8) I],|PҧE4b¬:jU7?B8ˆG+1+m)UPʏpAWRr9Uu'igjt-q I( 2@u ]YNZ.ˡ([5PhgCUu qۻlr U0uWSH$;4d U3F5_Y+HW)Q(q셝OrY*>*,YQ+z dVɥPBBW#gJ`+U-IU.exQh;zG#m :QMGi骆l PT"D'QZF )ӈ5ԭ\v$ü"KLgXjѶUG||Z$O0À y@+W\Pj%/ FyjHBl,I|0`L)9G#s()2'vEvh;tݠt:=?x&T֭(t㨚~8_AKyݭg=u1Me2xPJqJ4\_^sbG3qx)Gjky%f1kEW>_0gȋ^bϟ?gN[yn_}ٝ-/wwfc߳Z|Knny?NvÇwi϶X4^` ϟw=q0N#޾tIc"H~z,d>%wq_~9{q&['$cOѝn1@X: +f2qN`$2=&HO][E{YXZ0CؽU)t2!{4`%uVj(ZQr"k^Z>Hgn`st3q  (N2Kii(P\~2t;H=#SU5ms!̂KʡL4r2Y2'͆3S6si U"m-v̔ jj$p0spƒiB_JYL0Ϯ!XU/G,Dkb8 :FDvnH܈h9p6AJn.P)eZ!>$ER%[Uy23m]s$.TZɋK+<}ܼ*RpC^2RTfR-re!;k&ND-}DsJpU)dM n803uZr" Nf8|Su+ !Ii(]+ B$MBҒ[q\kpF̹Bi9"ۏ$Rcl%UJ g.QdU}c5 -Lg UDNwz|#ކXRT 1*"/;f 1I:e%Lծ1R}NIhfH\z$aϞ% ۴L b Y.DJ䎪hQKJcÇ l䢪D JM9$1II6%[a6 2yWM.׮PƒdcBޡMƆ\`*|O GYlUf1P9㬃y&DCgH Dz0u$&JL ]׍|ƣLiMr<&P[l<ח7>?cx8s@5v ˧|xjղݬx􌛷1RۚrՋsoYq:/@[ś?%?yv ,~<8Kcˋ19~BFaFj{*c+GشD^qNԶ×&.=gPp8|8zr%u7_⥔߾zMZQU0]S;qfu@i<%y3bzhk]~#vϟw92ŧ/Y-iL/?~~uGմ4ۖ?VO6|Ua_o8 =RTrxGec/6 ''׸^H*$tȸvpC+tᜐ Nk2#qi[q-ӔεL)ɨQoAKik2|́)\\W1TM2-aM#e=U'#$q0 0 QA]R,(zrG۞Q%~(CϺ='DӌkT(&*:=|Y#4l)y0fJ=e {A5짓ht˜oI0[L1R4N@dAGnjrO jSOe:qΠTk;aTM8M#fȪY痸߽o~30Aů| 02woxV;aBe8ܼ'kg(9?9qƲ>[s|!p1V-0@. S y9Ǿg "VYNq=_%0psKݶ9[mXּպn*x)~m޾mZl[s-gח\؏=/^oo7P݇w?p,#Ϯ]mn THJ;L.xvE!xxDU=%r&2 o%>G}O-}ѳ>?Ô y~ۻ[ů11M ]9|ѕNm?-v2kt(z3 ˡ䰩k8b+38kx8xNXUPG$ƑEhedVY5;#AyJ1DPڐ e2 ~b~PQefRl6gP% aꊡ?Wخ閨Զ&<J RL%஖BYCڑLl-bv\,$J.B~AiSȸz(RzR⾪"S7@m$[ l$>e Z3>G,dIFaTBHuȭrDE/3]3D~lȖ,%km $S )*:5fݑq1VV;ReD3yd#X fP(1,{?Om⺕D n $V݅|>/?~Ϟ?jjRȬW=oK1خVcOe-g;Ym6cx"xD;+xyk[ֻ--jb?ii4V-#/sE㏯9ag_l_`hcwoK~oΟ]#00N-O-ɷ=s?t+2V0UMt݊#e4SkɰWi(2!̌G*?{FTJ9sҕ0J!%TFU1¥BԥH\%ʁ)bB"c-Qy HjR,@dx3rHjT]dR*⣗m-=q?PdnDf˸?R|dNr)SAK1kj$ #E'4z!,4LQV1ckAN$mк&R)h(5@&,rG!I$4]nA*FgiL Jca8IJ?3~q#O;N'=..Od]S8>fśSc K+6j+O%g,kPuMP'vU-1."W&*SQTILLH%ä_84S㈲`IjE jh8G eF yd #:ZC ~cBU5j]Cq"cO9;~ΩWHfO[UCgJ3,pZ6 cØigJ3M2Hjy*Gʬ>piΞѶ Y)-Fg*cnwΆ"v4(Dk>3tΉx:aڎqne,:{Hze'TLpFK5#1`jGwm'Ρby"8̇#rlήQEq{L($R9L DxO4̫۠;ξnBRqHEs߱޵i$zՒc!Kcdʙ{PUcEDA!]Jjn*e7XAĵΐ$[01RvmZ6I7kB.)4FE1@Q7PUEz95ԵAXm9SL * sOJ1cUK(-$(f$:By@L:?頻4aZ+/S2gv04-)b]= fÁv-5p@c'i"Lj[ږ5ݮ  , X2lP[<2zf6F.Qr+uf! Y.B1V lkTP)b>2cm+B,N[QӌO^ "p­09ljL۴`fNw4u[3Mw\HUM "kLs ̳K!x)fqx|D-W7]rޤG,={x'3s)ȩ2*vl6DjF76h'mZBk`X+=m㙴W $ p{}b8_~2OLU9 ZmYi<۶=]fFaGyf]w=q{x-ޭx`{Xsnȓ0w3wo"vtVD{%sgh+uS^?9+3ͅmj\[OxS|g 8ryqILc1톜7󂵆aX+0" |)]AS9L)||ryefVmf\v;tHe4\3{e KNv{ZT58nnEtׯy߳]mx68LRDX8B\^]SfmSshV+OnF 1d? k='-֖-/_\/x}e?ro{o_^}GTi߾,3jT"jHNn-\Jl7WLa EN*Dlݢ448uC\FRY[TҒ-(v#eY!D =ɉcHW +E7<0JctJzVXRaOĸ D3iqE?'cb∩;f2DeqƁb ʬ1cBP͆_[ҒP?n6|pww+ mM=H1R*eFxS>S@ʙ1̔ :A^>W^cVJľIh\F'xiadݭ8|+aݑ^Sm~[lcn7||#ĉ ~d\&J,̧a8%l[ghnnUO9Éx.6+bzqqs Bwa{粩 zu7_pՆ Wϟx445D(*mZQGqyq{83ņ@XaXH l*tk0^J:RAnqUx/<~ TaXIEe?r|x_?2,>{I(Ќ~\ωvwaxX~oYOy0sv|;YDкR2GY1aQ|C,*i5 )I>890["U^ ]EjtBŅ4\{32>P_>gY: J kO!tE2kixoXr;YKԞAJfd!,3uaW-Cdw_9?ML.c5ɶgfɅZ7DPG 9'|L*MbGrXߊ 銠IDZTmwvo@7h-o|Cs9W[H:Q c 0ʠ غ(M֊txG1[՚P Zȅ0/"! jw1LtXp{Ȕ/RD@9?ejN?bxxjB]44b4@ ,J[!`e'e{+jr^ZɆ"S^ґ?A`;Y bQZsrAg2`ߘ)K͊+/K}$ V+LZ+ȁ4!L7! W(/D0mFEKfghȥE\f=}M֚aO>Oo3 o^AyZQ5w8NV+N#1FsnaG; SfaG*먬%z>ZSV Ww\_^1ݪgt\=ZSTy9e<{JZsf_4pq}N(ws{yg?~_ru}۷ox ޲V|x@wq|| sXx=zE. FڪG|(r"tKͺ?q g?_@ߢ)BY"Bl RHh8™;_Db]'*7 TĢYLB1UpءuT$*qc1%CF)MgP@U5Xp8B,q qt5laxp@ejK6vCKMK8ReL0eZ@CP2,@pBQY}%01Sy)+tm@ָ a>\8R: PB𾑜o\ 1*zbI z\iW[yΊbP?ΣlQtM );As!9W`5aSIFt!wU ppm/KFRQhP5ФM9#55C y RhkPqjMe8IUYlWStrLy$C;(Ouq 6TM% x@=lq+VHIPi'HJ&¤(^ QN$0|&W!M-}%.DDB&.PL3nP%cHUe@e g,Xӊ$u"ƈJLD% Ij8g@'P8UsFdkTIrI MLET?J81hSQkL]LhJJqcuNSDC|PrfzR8I!b@VyexR¹/ͺ3(V,AUEsB]?yyʲ̄9Gq}}E<я/^0 =}Olj>gx\_O,Eǻ{$ Mןszs߾m"mSxx-?AkGp4]bQAT,Ép:uAHV˪ZJ&yUpa ^򶦫[4J7+E4 (+ќCIyo34&m0p.r[ux+8E6 D)]DwЮ!Y$F%ExK<&WF+yB^poDKވa9YX0%ؕmu&Aq2QYP$]dU)B SbP.1|MN8cOޢC*T:gj%XԴ7xZhY__#El%dv'800gݐ0GꪃPJI0J9+ĭ .D0!lya\}iJa"'2@ g LUWdʢi45-q=B[U<<>0NDžϯ=|i.:%F޼^S`]x8g/?,Ų̑_>gsݰ{~z+whmEe=^\[yMVP |W|͟SoW<|V<>Ƒxxx`Y{Y/xw_{-IA,uÛ׼x /_%OT35tb:?a:{yū?=;*x8{7״P;,iw '߼훷h#5x4cU}L|).Ez篸p:_ӄ5DE^τ4cMb OYa^L2o7ef\k9qx@9CmŰgb||/)0nj*le4P* ޷( Y"M{Xɧ֤4HU_2D]-I("RJ!ݚpU)|1V,wqqsM]mO'=j{rF9C"xơ+6s wDm*cOVI~_le FgD7)(ZkE2K99'隸4ʆjkO{K )tB~%`R;¡r XӈV3.q4=Vʣ+gV^+NYn⪚ ,Oc(c sWP. U4#f]m_\Y2)s:2%FѓPGcN10XJa ; p{o߿c[L1JbfC'_Ŝ3Ñے灧Ϟc:\^.<0UgO_77+-Ӽxqw<]V-_~9a߾rEtdyw|ņn__Mv40٫SqԌL$5ГɌL[>qGԙ?/ !w|ŏپ5na'g/^0 O9 #c?ş}&y<e:nO{n@- {ox%߿D"XLV֐"@]w <4WDf>"U^HLA"_(J"ptԞ8(Lrv$"*%Zxv86/RdTQm2EDeU! Gl XW\H*"SnTYCe=!!+[Wd&&W(2)#=]A boVdh+LeU-I|U+R D)L߮PF6nBPA ba `BQHa"Ī[Qw+)gOdS@#/G6/竳HP P µ(iT0V!E R*aOxkQ\dM'S*7hS(K$0J3#(Y %,Q)(y()jߋBkT)ar.yF3R)˂6 ο۔t 0Ma੗qUlI 3T ,Fe Q)%ǑƭVr #uTfbBhCSy,Slw b&PPr!pACIzڀ?t`i7, $$Ӓwrx!0bM^>w?b|jWL#ixc S/@:O [rZ(a9MP*VkqFaT,q8-yw>n, gbrQ$a^2N! ". 8QUhkzr\DgSPcMOUI~ǔ*E^FQ)a⟪rx ~:Kdpd|dHII:ئ5,Ud [ᚖ;BTIP㑪 {*-NxmC5WPwum$h-KE6 "VKgy_*N蜡ʰPi(K O{qh+i!?>1kړ*S:*y'$+57JËDv%5dXN58o(enZj*0dR4#Cf : qePXugUAK' r_WPE]B峗 w֘gyzwc]s\lyxx ̑f%_|9wۖ`p@b>Nkn?ݐ4s{;Sm O{Hiӷvx߱G W=)/2H[2Ǩs]Q_e<%x<ҟ]r;CYs{ 2RFLDžtc3˰{O;uXe{w︸iy=eruN|_-qo^j ~Ҹ7,~Q# y7~w?F  k{!L<=^]rۡJ~ɇw٬W,7Ѭ:1i*Bҵmχ-uO 鍡]?|ū|sl=sXy=t7yxx0&q>>;>{o^ǧޟ"XCaBՂjMjCu<lTnG ;=LyAr1ShC+ z[m,eOC Q gڋkɧC[dv8VTIla*̘5ZX7 6jR2អ Ն9ά6<4 j5MYp֠|8GCIq1<Ӟ4ԘXGX25/Ʊڜ0iz*dXr8C)4 k+eę\$)t}/^#.U!PkXt)Iv|Bj4%'oAf5v@'FЛtY䛕д>U(-x8KyV% ~{M]ԇػ㴠P,cDzl(e&9GX=J*T H R?KZ\Hu-1,aDt"i)U鎪[/n:RD#n}F1|xf II+*żL(8i0QBHۈ*_d/c%GYw+-3~AC0j)K^VŖmG 9ķQ f$Lf쪧ZrRȅY)ΪL"UlE)E%MhP EF*h##RQt#8Kb=}5TM i9aXP!L؝K-EY0NN%/3Zx#89'q%5tO: Ѳɖ34uZ"9Gs"Y*%dkJ_㔢87'Ֆy1C'0v {bYS$QUST2CG7xkxyD * lJQ&QDyBVU'4* uJ(7t<*,a”BU :&4T)k7N6JaMS4mzH%h׈dT4|-6چDFj<(-D,2q#K8LTNK8 wB;q0sh}lY(2@е@+1U"q 4E!5%M-Z zZЍ U}EJ(kV0ŒfJԼRI-Ơ !%R;>~dsy.JƏXL vk² >xBH÷-u"74VsÇGܦGF(~ƶ3FI kƜO" Ԛyi8Iq@9'C\xg{'H6 O8z?\^<>ŋ+>Hf(C[np}۷oQJYq@[ d1<߳Zu,Xknw4AU8QZ3 5p`Ovhzt@[ӄ˫ki?ߓrb}*C̙|Xgy}-/^auU9?u_?s쒟vj> ?L9vtǷSIA6-ӸԊiĴHD1AlCG4B۬Q9I_kB{ex#%4sT(SOEqp d|5Fn\-\Ȥ; kjJ)85*鈶$tpFZJr@pXHX&;God:ɄoHÑ~{IuJE9ҕ< ֈ!) *:b.YgKBu2-XACNDX3Er*kq$ k+Tc"ʚo4!+Ꮨim+d吃ƝZ:?΂_jA[K,'~aa'?*1Y+*a +-ߜ2؅wtNYq1TJJ0AYRG3vb;t6sD*I0UD}(#cA([NH"ooT!%ae4zG"fj/2wki"*4#dU[Ƿk¸hӞpbI$Y.wJk7)`AWC l&\:B=5"-LhI)e~!#X#զ+͕Ftۑ(ՔqFي.@'|_]/@{uNY%ٶidz|Dh-yYXs Kt8bVi =-)lL,Ȗ=-q`s~{~rs *Kizq_r|8VM:gwt"[Gs%~ ç~/#a0}Ȣ4LRX_3,1>{q8ۮۏc%{ S|ky%U@g=!~ߑD̅ec8VCp?,tG20 Ϟ]ORR0xwx4ϘߑjYmT>r9a#[VT{Lч3^YUzTv,5:9iiʕ`I4Ey,5iMnaEkR\1ӑZ" E"eZj 8g^Yrtkm5E8Nİ4-9&J(qޣJ @ne Ui%-l_JAP Gq45H ]ᰗ`ףldE)RRu*k f 6+jdrSP\=cH'R]oIH,At/h܊,Yp…ƶѦRʂԂZmESKXM9l SDFqUM-5u Uq4c#9fXEdLyrM{YXYI"Z jVA,6e~z@)fϦ}biЦ|G*Ucl4´Оm)T+8i*[$"4gr@)g9c\P\̲Ĩ񈳖\B!1njkWB;E¬e{Xj]3 uAJ΂sX%frDE{ϟc4XXwNz-'i`1BXsj0k{RMq3){KU9-%ާ1N:%y+e8@հƤ_A6F,3ۮ~xO "B5@bEѤ@bҤqOg>޾򂫫ԂlQhmyٖOLqfխQk{@Pr M kz9n?qaqZ)&wҋJPkB{McI MJQ`rW-{˗_?[Fګ ^K5Ӟ/HPvf&V+冀7vTh8xzq{|8U2tI#D 19q7 Dk)6tޱdF^}98|:oWgg\ l|oGӝlGh]y 3ԪiO_ =[,jVxLC(Y2hO;tumɅn{!OSi|NDN! ]t|Q-$4iYڃ ,Sk<ƶ̟~K> vRuLZTzH,P2T0Jh*VnqF-x*+eatTPIIe9eV&{b 8#lK JUI>r*'GǟoѶb&P jDi;Lנ%ϳt:дM#mP-ۢ7gM{UT-_s R kMppXS,*H IW”15a]SdW-X3x5Z1XUI˂Vc%SBzh`1-9lMG2Nި2/,bbZ{E0&d8cʻpEm5`\^Y)lCwvC6-,BXIi_TC0(>Iy;yh!a~.FS"-sy65$T2կ!ҊSnS 8EPZk%N#Tk*L^Pz˫+TRơDw{;dy&Lm0 j˴IePTehtKHJ:QY]YjL R(ҡgOXNЍfQKbNfbL?oo9Xry%n4pqyNqZ]GRY>_O8FVtU64%&Z)|a y5s2LÞWwK6g%U;\ٖ_OLl> g_3w7wlVv;.[:o[']<ewC;Sq'B쟎\mh 8xgx?q슾_Ѷ S{O3'ii7_Lnf~3?9>~D~KRY8 vb|| sf84q:EJGa\ a鉯|p$3_yqYXbn/Xmy w0]çOBy7hi=}dZۖ~OE@&t۰x`/x} ˜,za<(no04%X~/Y:LJ7X9;[o߲{Cҫ~C?I4Hkm(X 1N2M7Eߧ?a;}hlcgzJ 4 h6[)`0˅BJ9)w7opbew YG.՚gWjCU)_kYVw\^]qwwpi˥ Ñ1r~uO)ƲZxڞC{~).H4U5#J%H2L7?O#s{v7\^_U~K~O oq8eueI!rfIK@i-W,<2Frq,=q]MaR1zn)'V52#˲ q⫯bӎgo^'>W۫k|ߝԞge ylei!3Mסb'Xqey2Ϥ BN i::PGM?ZC../0mKJ >ݑBȉ|/^kǙhڞg/x~ͅt_dZQKzITp u= Nkq-~s[mez:IQPݹLlF)EV趃d$Gl K]nXS=a 7l?)6h UG#1˼oo^vlqێg99Yi<Me9K4:nʹb5-*شeAGx#T,#D@ȁ;'΋ֵ%ih U+X1 ɔ\Dp45(_*)Vն! s!O؆j BUu$[Vg瘒Xjyli*]-8YE(%UίP'#!e#(xďО DD%.A.!J< و蒩E 1NtZbM"tN@2oyxDDHrT`Ɣ S(y! 3J#!klcڑEA%[O3^44^mXrlO1H'l%.)<Ƒ91@sդõ=)UZ 5%t{F#FLwF K\Fɥ$jĜhJ!7PlZKh5sr2< yUaD|+ю%tW`ؠh߃Jhcd]3HSD;qu|>y>ly4W$^Tɦf% !kŨFɩF#ko,8ہ5T8a=Z;R-XݝHeߍ9(xjPqJ ߬&󝐑JtqTyb}&-#V H7S5]q[g[jM qO55Ը0GFtg2ZOn O'¼$8R{Vy(brksW , R~o5I˄؎jf"1HVSd:pǓSJ$L7-ҝjq:8)p^߮Dܦ-{&ZL(-X%gA%3A[jFıJUS$8K\ԋҨb3SV]O*pcjaFZ:,z2}Á?Ziٖ+۷,lz9X]Ӟ0x Z ~~K ϞQvonV8pv`Q4T|2o/yLar=w޳YӬ[0p:o3d?cM_矽"cDw-?}N3f}B#'#?ϙqpޱ{|5w;y'sp` .eCD#u9)E=o* ~H9Re TJQt%Sp3xze=e1AiƹдXѮY{T=9qVQCFJ84aڂ e,ɵ(ߡTFENUۃ\tide)a|I>kSkZidb'".9W|ӑ%;REaH%O%F)!Ere?#eΡmC)urдԜ0 ߢ[@HK(qrЪPLXCfe3٬fDDfd]vTHUQ '_5WHHdc,¸Όt[Fŷ2}sk1}s@+m ļLZEZC s3>4tJP%mHˌEawGPޒ\'e:Ү9RpmOM%HԳg()~KMf&WUQsmZY٪)JˁLJ1u+QZg4RRQ ZɦA2P0WIkE\i!)#yjQv-2h~tpΒR%|W߁T8p# Y1 ٸtUTmZ ^FNb#Z&T-ђѭ#L߬'T䀝ArL7DI6XU >(.nJxHo)$qXڝzLB t-rX^L(6^PY ViF9;"([J9z, FH_L\P^cd1b{JɄifg0>-JUTHsFQе7|#4,8rd:J4K*Ժ0F,G5@X#mwAwt%YoY&5<ѴD;r\qaR FrI#,Yٿ2eqfBml(,q* VϙJ%}*0pͮ;>bi$1J6O"it=yTL]JҮ:B\xv!(ܮ;jE7/84g8L\<Ŗw߼f^)hӑK4u4qk|vt"Og1h~d>d~c6V{ƇG3~1#j#8B?R@]pq~<=yŻwQ/=e~1ϮUV+^y5k9>Yu+T*]Ӱ{|G=Wk{%{voPE"@8j|׏ߢ QxMIy;~\_<+~f s׿~~S>_}^77Ϟ#'>v4\kt; /)"W2e* i:qSr4 }7$0mKM U+_.N`e:HCjh9$1-)tVDxJ߿Ls=ǔ$\ R@GyKBYBZa7%)'&,XEMt$b:Hӑ'yµk{O|#[:XNGT`W7l8N{{| Pst^~A8Ec0ᛆ,䴐癶9 j:R0OXZMB(rR,g182ˈ;{DtӢFHuyP礄%j2(c)\P(Eha%cqrJ3 ROr˰C++u}+FdZK67ΥuE)0n}Oss1FG!Q΁v@>3fww\03W[%| /n^o{/^^T3O=^qFLJoN'^|1' Á5Xb;qĤLRp)M400L6&ǣt1.//?>ViXv'V][1SUq8T/Hs qrE[a)и xBEa\6 E)"4~084ZMӮϒ*Zxli:^S&\hFX";l+>xQy0㺎Z3ηTU(ow4˄-t.RIZr%᭠MsҵYnmW襰QSe{qZ-5sOHaR=.7r ZiHHYY:f0WL )W.xRTIȗr,B[j[G$/R 9QϠJ/`),NRZL+VZ69sH%WYk%FoJwʶI8Ja#KL(`M|Ѯ5l,$h2_`ՀQێNYtPgrMp^($TL"m߭yX#2qF+Y+q]O8+T{78r+t2 Z`YBª2M$ im%%<%+-%=kQLc,)!) BLq"iZB$5,%.T fƨ^'j_0HPƳ4R#vfuB=bk<_|:JۮؿyoƓܵj_?xG<Љi7ksQZ˛ ^iV<'\ ֫꒤#~'qb:Er\0s}݀r2i-Ю!OFBVӴa ,d߱|F 2SN݅pzz s+4NGTL#톬*0/տ//i}4̣__KO={̧p8;\\26=ogW-o}"3}-{"jb^s8Ҹc-ًa+xv{z_3k;]ɧxy_;JT0Vdu"L'rF-=@ (MM3HWb;SYsqi5<KRIIPm4)c=(M<1n{E5g*P}KRYod"t51j!gyP*r Z\Ƶ+`! #mEr\3X׶R0Z~oRB>vjXDhV 5*AX=9e%_mX`q/@iu RJM"5,af92#j>@ۈR8B %+$D"/RۆTpK %M4^U)]΁Z.5P*Sb,%dՖ%K"WCxȶ/dsF<tiI1AMb60NFӁHu& Hy;있)Э6PhrH!M 9vM3f jM՚ ĈFHid%M> (v9MR<+F.&%Yնe) 0[+ݒu㑔"]1Τg4:qYh9U(2Zqkv-^ePJb[ns7M"i9aqe*@%0`;M\&RBM\.IJ^)'ilZrT9c@=D_)陏JIխ jdKΘZ(Z a[Wz'nFQi Tsr2"pPo,1ø:`TԆX*!py'A#e'GMiVpBQձ,6d1mCQbEbWU ^X{X=0&.۬ZR)4 r0Y4^Y82R״c< 3Ym' $ *dyIW4 _9鮗 4<=AiydVk&^.-eܣt&W4 !B*(ݡUu8'u7pޒlԌԐXwlBB#^+{iY#`QJݞ__mQ֒j+c)2pQK{~_~<:f"oy-VΓǑ3?FҋvޢD:g6do9Ly0aq:RMÅrz}k vO{7t-?rݻ+K3r#Q%r/yZ)IiV,ݥQv"U?믿mW<<V-ϟ]shMvwʳ}yŪT͇~w_}ŋ>׌̇/_rf/8<6{jH",qw9#/oSa~ӮzNVS`4ʰ 4r}y y#{dV?K >zLH rVv*RY'5˹ ȶ_3-yd< \%⟣tO5h߉b{IE[65M+R mQ5u$:ض#N3f 5=Dp9$b6(]qUK߂D ېt%P9giѪZCUBwH5J氐+6!A7rP#~s=׬//pBm2QYje˂۷L '{'6 @ W/^1O 8T ZWLV, o6(Q%BJDvrR)l"TUXcF,!%֣pMF Sy#S8U>Xa!`G)GA .JwJjL 3|k< -*h VBL !,BҌÀuV6PU\j%42 .<f˸;t\"CxGAW\o.7Tqhm"Xk4KRBBeYUc L.Aq%QICy2/,]18֗y"6R^)jעɲ ijBIZ@JPi1/"tnt~tNe$0e|s޸ڂ8 P,Rc@9֍dK!\ FR `BcHˌ qǮ@MGlӣtOǚ,KB+sREԾ + ]HFQ)qUPɟMir#:ߓPGѤaf_^v[r=a^z-g԰HE咁F"UFɥ6'Mjg1e<0F9t|F)%[i N)gmW*kjx1w"SLqJGRM,!#M3Mnc^xRRHv lpM'omp&I L D:ocTm]\p.  @ *Q0l/Z߿zڦfJ칪43/A ڢnOVk=o@o8JE'0cFH_yJ8RsFBOҥ|'tc8Ѻ5![ 05K),~Tdc<mz6OA˶ L50Tgׯ8TX0MRUKizL=eX0Y(U kbZT1߿cIiJl׷8V+/=4 yZW=*~!e%-]Ni61鞵Xo<>px8@B)b& l3 IgR\xl8B&#ql]:ѧjqr<$~i-}rÛw\04{,\| o<כk֛[~Ň|;n//v\]\`z9Xmݻ;65<=vp aΉfQRQl8R2_~!'z*o4O~r໻7tQpVM{xahD>c>|X 7\\]DZi?cv<yZ^ w_syqApRfZ_^0Û4mi=qfZcچ7~AsO 8[־c(Qzl2MV:mٶoe?)?▿gMg5.O|I5zY] lW7<0~wՋ~-~2řLJ>C^~?F9\CZ{D A gw=gb* JM9L̻=[Lio6Toˌ9uVX*Rp{eh3xK nGjٹU{aTk<8Je1N&N7RBiXHȤ(eF MaaGq*o yqq Й݉%UIl(grͳb_qsn >S;~^fYcZq,mdRټ^QrT"]ӓoWU1jG<4Z3 BTZ(JAoeLv{<O3/y+R4CVR TPTw 8X\&idIcuR󘪉)bmvMIUϗIpגYpxPVzJ+Yz&Vr6hg &J75i1}^D2djuEKLs\ӑlj00 Zj~+hTHJCU1.$~!S5!FUl^aRv@-b3eQ(] ]w:9xjq"~kgK<$ oWQRڊfvB9,a$-1T)ԚT9-Vi· !LRq!+i]o1}/Ѫv0%JL4%x;Hy&u-2Z !( mCΉ8x#'c=]QJ"ݭUI^Ěq¨JQ[iX/+9aQѶ Z@JT6Ίh[MQ4q @۬Nӑے 5B|#0?jRִɑDPKF|+vk-E)68mf=yGBL \WYR%TfHIVZڂҨ#D-(xXTxV Tqe6e(dH=ITu]l*6b$Uˎ~@Q9[Jaex|$?m49^\2`:al8`oqYQ P3N{߱" l Z o4m)9F²MVbN~r>6 : . 5|A4 XVwBGnB! c4/?b~~sk7Ta9mG2/P3jbOcHjf$n-k{ԔHXEǝ8CP5R./2g/@Tbjeg1k2|.ڦnA\KqyٞmƣPe8ۓ:9 SmeBLZԪy2<^&bc*\0rԚ D@t0鲒Coޢ,uWGAk(qԸPSjw`%#m;-ypWMwbpI,p0l70u%[T42 F*cY(Im A6ce\hkdMf{K|FUE"fGM'/hA)Ú;r glbƺ ٠njf'BUIYKE>+b AJJ烘mKY/xx%TKܢT*-rHW]3}8:7&beU4y̛MÚG|yA%nonx^F <>Lw#/_#LCDkN\'7)o/ |!«aÑDz<=E Wo9<<c *5Ʊ_շ;1T۷oy|fnx^}R-)qx|_| ݆3Cq Ñg ֿslcQ1c^5ffp"JR9ߴTUkԂ7$7jE+M\L.4-QWRV\ko0P"+xd3 e DkEUYʒ㙒f*2 ,UaJlQu"u֗m)]KFd봢(J)<5: {xmT(a;J<6~@m{5'ָ̆0]TKi/4bS% fstw鼥$Mt]A6-$TDzVI6C8xzêkh 50-ۺu d+#]XXZrLJ[ly)QkL9p)CX'0Zw8eGvB t#V%LGu 5+ uE+Qeš%,ZȲ&ݽkYRk,8MSb$MLֻ+ТEm] s:᝔ˋZ%*\W,oZGNEV͚2%F* .,9+{.KK18'\*JLTnXc~#hkYtAɦ"TnzЦBKY][qtmO- >Qk>yWo:¸59Ҵ"֝2qc/X%D6@(rkL?lΐ1M"SGJݒKuܽ<.Ri<˴RcpϜO U(|؆˙w|54b8r{{G6|~-"Ůoy~z-߉;z.13E+%_f\2T=r/_?o;{~#oD@XhdU4%Q2gۣe^.{nw:/u"ȫoxzzt9Өo0OO,֦WTvxSjaa^4 d1UEV5R7jh Hn7 Xդy"P#mŷkCU2ATTT&qw((1a4-FytPB.G`[l͜2i[f6M+_v j{ e ؍'[BaLL\&݆`VMeL(ğ6LOO|E<䅹A傡cE^D;k$@iPR kFz$E`gRTUiV>*L5-8)2u (!b0O4"Қ<<=|f{-J3NՒ 7 F("ڜ@%tcAe8gEҕL"U:|ǰ!WK4+@kU1X'8bh'I}-Ֆ2OJd:(JD%:+0@4'ffC mbHJHq4VtX_ZPbSCyVҺr:ٽ~_dJDdkH]/Je?t}2\O=EÊ大b؆iDJQh3 7bF]E|B%hIiaX*{P3$tS*(PSt 4NT#8Ok FҚ:%%VDEYGoB,SNTXCѭXEF@G0Mi ݛ_V\'ՙ44]tš Hvf~իqS 4E!@d2o\Kg+;r/m=[&ee-w Kw0<-:HgL!\;|בG[bga^<Dd{X&L @KY8Z6rĶ-Xh-Tˌ12}̰mq*i,o9|m_1|OZ3 2]ń:ڮ#°E@Q]tKrehJaO7rIio xڊi`P]%N(I bC֋9@PL }OSR)ag0?-E#SX$6bXhӉk֌rY~`F2؆Vb{dYFt>aQ,$9xﶤe%g[G81<gW|98?YUd=Fݎe0samBt^ho%1ͻLFBvx9 Xsq _߽l{>~Y"f`fV]Ϻ,Rn釭t봡L6rջ<>?34sYib z۲Z>^23eBN7[*\N'n7T Z`@Hq4Ww|^z.m]´|a +@*tef:9Ss Ԓo\2q ^v=Fk/mHV|I4֕O)?=~RwA޿uYcx_>G)'9+_ Dvlg qYV]ҊT*B.WPfǍiAjŰۑc$  PXZV6[uXIAfC(-pJ,X縤@$1DEUa`Qb:?יn'DҊ 5cIAb(p] hs@m jF;qܼ~Kt҅7%jhO̔Ti{TEPR'0)I_m/"ڐm|9ФdJ:bgBHFeMUVnK,[otݎx:c-fC7 N;JbP$Li YYDɑl4kkf0x㸹xZ[͎w-X25O`LKt yhoy5Oϴm ZK&Dj)Ma0uxi004_i[K _c}owܾzE\eFnv{͖/p '1̿<YVv4XgY8ҸV{|kYbX| Br\RACآ_exOT[ 5,B̳^tZ.WZӕVM hj8^Hie{sKy%`3N\3C߲N9ܰ,t dF.ƠKԊw=q9Vj VyV!n5*khliJ5&[bLEQ#HKB :Wyvn=zL71#(ح'L PZ55(֒-i!Idо!g:SLD,}ksj˃Zq}?{/EW54STTIx7a~Y@%F;ϟ>s,5c[xxohxs_vwg6jYo!w %U5y_ ;~~O8NL1Rk!Lu0@Z4LH4,!]g~84e\x=6Zozǘ:ew>f<]|/3q8r`77NGn ʴ̄u"h,s8y;>fǜq` Oتswg32TTa 03Y_;bIGM4tC=|2_ ӺHp{}G<1r]eP *6]tb߱l#k9ۆm7x|)fE)faYrN{O>q8vCp>}BNY. 7fmZPb"&dp,N4!UJYoo%RS"Ub"ư\FM<_0UKYە+y[vV3dy0M4)sYq kHn!bM-UERKR,ui[tFlZVA!aunrj;:KY.-nm1ZR z=<]lyL2 U~`}zA w 5r˕c{:Ш*(/R[zJ$qe~b}K-8M|dx 1$J8gc> )ѹgsV"-8J@E\ JXa2uOy1b %'S1ɶ*ttsFiKzi{1DJrii֖te0N]yR!Ѥ);VVqWL 7m/'c +y 9[bJi <}ǼF4˳YYf?loQ^?o/}ע]{k‡o9jmyێ-gL!zxy~"Gv-%Wqv8)ׯEPkZO4l߽r q'5b'_VoYӉM3ρw߼<HiQ1`]òZߐf /nwZ.nJ-x=>ƷFhfa@ӵdrآ9@߶|9PH t)v.̗ |-<=>^=|7#O̟ٟnɵpwsKwp{wtdq oz~U*Г,e<''| yItoǏRx OOOl6-k|Oh1kǟe4-x̻G_ѭ'FX!$tvc>RG޿-9WR^USakR(Y8(JzBˑZTd&HI"0'pҐ֐7k|LV$NGe:RqVz( (<+1h )7Y;g5 jn#pV<ϽPF%dz[ӑ}B+/x$Z!k>)\R T`8p{Gərb^fy`Zq^fi\r8 Ey l`xXHR ukykTfr2`;it"&҆Qc\F#Ь IUtN$]m,B,I[ണVİ*Yij,Ru-4a,uj)[82Ұ 1li:rq4떜`G2,Vj۹'bRA YY0H4yw=tFd1ԐHJ6h =RD(hBc5yNTmm/6eƿ$kˌFEmӋp/q! ~Bk"1ּ,)\xqRPdj )Fa]'$ $n)V\ ZNbU) ]+M BgD(ћ; g*:38DgW+iM|93/Rҙ*!49 k\HH&Ktlx]` %Ѭ2jDJw2Iuե?ƬR 1 C{;i// iby2Ԁ1MX##fFgO%77F,K#6OݾAu6iPVX5 {Woq:^?`¯7ra {LM[)a$E or>ges#Ćjڷ\Q.Fs9 ~%Sei&\FFJ[|>raݐr"\fU ͎y||՟yzK.+ɩ«o9.0O)mw_y>??{c1#iͺg9Olj!-2r ||f+ s/'^37/^qΜOgno{qOEJz͆d +ݿXǏk 3/|˴+lґxkR&snA54'v a tm2ޒsa ϟP(R: 3 hQ:_9N"%jP tRXHBInՒL QC~EGtX2 c{R贐&iҴV>gR|<ݓc?yRFb]/) I,K.@ۭJ2BIkGKhk1e5¸HiSZ(m1> λ+QKKIzPusLRȋ$F,VuYk %bi~ pszy*Q!f2/_Z20f1Z0A-D9-27xbW#KiZi%8 EnT]e^ VTOz\ě@K8ƁyPMCw*|'JgSU2.r7 RjXo˄b B8Ӓ[OY5%R\hUg|ݖ9L-!deFU-1*$&ڶE5-(32a!#T_1@h}GiI QƙRDBF!5N~%R K xQ)a {C­7F(1kM#Zs.IDzwr'F.}9#&dTQ :q8*WA5WkkG<1:VhvZrXgTѸg>}x`V1(+! GA 73ӼP'{Ȓ?؟O LZ뎧3 m4OgB$ﰩ'lRl۞qo~IVK}ͧ3?w9QS嫯f:+Qf0-h3z͔T@Պ4-X8\.W=É!a`YI9G:+N SXp98߈P;rLtw%8ҬPN 9$1NR&)$Z51-{wSƢD.3)zi)ʠlKNX3]#˚T`LZD>&vsK&JP^Qr ftB簖˴p>9wM#4IZcf)$6VDJ t8A\ hZ%O Ig2 w 3خ(' ]Qz!FQmN$<׵R1\Jh-YwJ4)hg,oB9EbîTz+ڔe+Z% ݊!EL%_"#]5!EjUW9cL4mReѦZӂTc*ɡYYbˈjޭ9\Z9>~$/nC-4OϏL +p/[Z//߾:Nx8nonXBZO\Y<'[7%q8!J^q>iproZdKfČΕ(oY ><,v4\XnoF`#S?}Rp{{˼LXYlYBͻw, ,"(P9Ri!Ybp>_PT zE|a9r-qv0Μ_yyXr[߮O#/߼:¼pM\.Њ8%jO)-h0}gVJs}Jjŗ_3U)_%OOlooP`}=uyaQ)nxx|/9^ΤEEyP޷o6<|HTexNÙ;n_1RaA_ϐ #S!"/| É'xo2p></on8ygnVk֯_q%a鉶iXrf/҆lx>zBOGRhtx$/:̪niV= )KBʃ F2V [^W+#)q])qU]zjI:u%J!$f2oh[ My~Hmh5=1eUȣڶę@|<]+鰍cZ&zIU)Hp5hKd\ F˴\9w{J.Hya"ij ؖHmV{Ҕc80שxtUD YF]}Z\Ob)r4-7/^_ ?^bB+s k=|T1g6,3J{͖t*:OU1cRdESUN oWbO'NﺒRݦp:f2cZPKX+vc@ĴTa MAUR j+#^ 5٢tDc=Rv32͚肹nŠr>agfFI]̰ZFcHiͰ [Z%QJe930V̼FJ[K8A(ˈw.Xӊ Z qGҍh5 i^пVdmB˳ƸWΒHr'Gn_ӌ:SDL1 V>ATtdS(d'ˉ֊zjJ2-xg &JRGEՂqP1%wc hU1l8mE♥QJBSCSJ:&<"Jt(B42KMYtmD~v^j0}vl)$j;j (I_b 弔і 8jEӊ\iR4@JEFSmpF&iY <ێ8a ἘF~,"1 T2BytAq$ (`q'Q'@ZAY ^@G[M K)5+~kHSrNF;GẺ2Q~i<ӈ1=9F\XV+܅t#O8+炔%gF,t-ZTfϴҰ۵&(U A^H$9Q.77QF(ULy %Ir /PELXC:? 0N1n_̏P,#?a-Ӂ~{KZx؞R+ >q8`DsbF18x+g}ӧZĴV|?>:X눓w#o߼ȫ󯾤NOio(9s}}͇>{vÇ3w7wL%V=V)^w3G!,nnx}w4QF㍥#럠6i N]\onoyyڡk%)[cx>g^LŔʗ>ǗG>; |jBy7LWܯ=(kg>g>Mg~_9#OZN k+wʦ?<$8>櫯 ZpCGu0p|ٓ5e@Y򼣔zӏ:t GP ?~|oՖ[-}x=77q!jl9Nl  L:~GZ#WĒ+VVk>=?0N\4t, Uȫ7oͷbp:1\oX!7a/H܋DTpx|j uIt kxT"=t78ޒbE1Or՘)8. 2F֒*j:rѭhYʶ)5`R3Z ӒjxjdQt 5u)U:>FxQ4Rb 6eHdJchĔfqjL "NױÑ7x&W <k-enW[1(4K\^X&8ekR %Ͳ-P"_ ӂ),X#\cX.p'7ۯpxy|׌jL"3g axI$Rpv776+n7W32w_?{6W#_{=M)0eowv/?0a{a'ZOl8g1|sOM /k/9yϼ̴`x~V*=w\_{$j}E7 |_4 ?0\bB_~ (癰]3g7w5;ooи{(I jnUlR#=E5VXqbY"aK L~Þ3y^8/o_t<onɵrH >ZBI>SOm G6 3͆EZ9 GY"+ 2SbwbK'Oj-b(%'c%:V&ׅ"z5l |K]'դOa$}w+P խ uPR6_QN/dtE2CϾ$JDHW).ԇ\n^QFkq4btЦnL9^@)V` "ita*P٬R,SD{'8tƶ=T2knڱ;9 KLy|旿Ѽʫo866oz9f`^"_<||\pݞ7ݳpi@zN.$e!1'8[PU3Ng {WW8x:Xv#׼pu~+\YL^?QbCigoi~hG%UcNUy SYh9٬yf9}}e'= ^,4q:3հAv逭ϿGImlWL-O//=+߁5tw_}~xTKȻ/:ǣMg,/cۛ;beۮ )5:09LxZrJjw5Я7~EXȧDmv4)N M`IQnd1 %QH]58 U+a@,Fh)Eҹ Ri`lĴdUR58'z:Z)F;Z=z|6 i'IK5ҢD}WGѻgt[N$Mkv+ L$7񏔌ZL7Ezvg+jʨ.B^lJmXA4B-I jKrO0l0 izbl᫆Rc-b=QU\";l1@Y V)Azu9tBʛgZ4:( | ſu?ńe+jeKБ5'WU#%suf*{^ݒt,fN|/S!"^$Ն?:G3W5:zk1.7-}#_|iIZ/JhW_s>1o-S\7E7>{M3=v =|vKL'>-{x9?ӧ8w߲MUJVQQGЋV%~QYt1_Zս8R;xD@cicdLB2U l+şvc mkXBxcvfc5Oߊ;p J)+'s{Bsus?~n'x:snۙ;JJ|z|rp.2/ 92u ^G:gçt_}ˎyp'L/~ s<}H̉T2}9Fk޿g0Z~FSȒ/b5dUIZ8]DW%eKxH%2?c"wXm80O0|s4b2VIm<дZ.Q2G0ȴ qG9ne"B#_~ט(-ZŴ* Yy)uU.3i.kV-ER'Q<:6b\T! JUgȽ#;W۟Z+)uNPM؀5BR4X8c^i"tVн:Th]PMbF\ҸV %ѭP]12\ǓYlgdY*g;T9s~ڰ,#]?\ L]ִVYVVAzRwn?iB{x:JSs*M"ð7|=TVD&&"?o~|f-ez:KDw)&"C9N=Ǵxkꫯ8Mqn^{-V^Q >vl:3_}=s۷8M/x<=O?D̟?<0WdwVK2vD1 ɹGo_y ̓)i\Ua<8 |WTvC3W;uN#wB>)%vB6QmilӯĶ"JSkqbMU٠䚶|1XU5X]ki|:E6ƊΤ`\#r~05 i! K]P! \-h3kŃ٭m@km{JOt-UiWaJbr (iU +@Q@ (y<M[""&pçOin@h-Xftۓ#!+nIZIN$LM<3|zOs!jRW(6#WTc*r:WBSBQEZ U RLXNr@-t݊+V_PJ$rJOB+Yw5-DJ%Ԍ7UUv}|6 )894e}/U\Ӱ39ʩo\1|&H["0G'\xu8C|-Y&C8A乢₲%5^"9fNA:!/qFz6kB~?)bV$sbjr 3fwA\dk=e$na$Nlq$4|M/~mdÕ2rƶUiJa\f-e9c4XyJ`8ZJSk"4`lm+*|PP0>Q Xb@Ʒk{BUb%:WkjKJ0Nr"Q]!}yi=ε-ʀB+a7sT7RXyAiڛOԜS53sYE9foK_)MV`0P9D4'gӕQF˦9JQ#]V-z SPB Edqyi77 $&m.ZszX\%F54@5;X0=(" ۊ)& I9FIt}'u QbfiôhnVK;] ݳd$O#0O4F3J)MKe5 %S(XBŨ5P'*ey^V2k=2H^Yrc59=TdV iZ֠V,I[,~ʉN[208SƵ2IJۍ|»6O8+e-}lŋDN2.9Ų@T%!F2'Uu-[σ\NFp*q+E(Pʈs-u ԰n9FDRвFyOp~KU0kLNYhq (ReV3vZ pq.y409p~Dc (+HZZ<2O3_ckyx|g~_9 qC ',1r@۶tgf7_}Vә1D9Vq _<@c=8?|Nj81f9;ywg ȴ?boH0<]ÃxGR#tf?Sf&LP*Ñ~/x|Ǡ󂷎[ZnGg?'-T^xEi݀W?VyX*V|»F&n'ShP+1rj _rědB͠,!PU%#Z#qZ hmQ8#Ke9t΄ bd<O+a-͆{bi||µ؄a5ybt/N*di8YenkicѦEKX!k*x,oUPJ_ g޼f8}тR,(:༦hs %-Ii1.o4`7[*yUFY ł,ˈZPZt@5z%\ c ZRL˄D c]B)q!ՂmZj^PS Z)٬TU*)F$p4ĒQ|qxz@)f|bzB)H"b\ȵ⬆(*REdXYHWlߢ~sy8cƷXߣ5H3%*Jr-hJɔ0S+qVj8ڏ4%Z+v Rp]`\673τP8+hJ&U 1ȤYEU%⪮PRh#)1DO d aFMR(=&]оC37e)KDkH1޶ @Crpkú(H%SDB!RE,n*4!,sD2j40O Ñy^\nu-I̵-@Z&|ӡLo{1f#b*y~·;X($h-j[5 e t0N6o(AD_z]0/F jcg]-dTRFz1BZθVXSq8!5$rT *,YoӰZqDͣy y:QeOTybt[|n]CO2h0WMG,)bQԼWm3J)^ bm@\I:5SB`%ϗ<k$vJ(#ybzIr@ "tTCSGIK"XF{n4%f5Xg Z{tk)EqH QYu2sa&V hs rj74vLk x| V~?~df6-;0ګE,-{k)o]+k Hn{y̳g˿;-Oi}Gam)r|Xr% )8[iE|@ g kk~,aQ\a9m(Qľmq[Ox??aR"7+jMn64Yhzx>sws|Zi#JUp@T/_t/i?%o]ױ&E!-5ENÀi>nÉm@灒*8Skf2va~l &E ߾jx{ rۻ[mNeI<<WHӃČEH-G)KM8vXi9TTNRVC x%2" Db5/ڢ ?[= ݮKL)JhoRk-hȳBm$SK8^P@eo Jk1!7;3j(!=B$C,{b,d2J̒k6<-t)-0g.mף U s]p~Gu 3GHM%۠O]$Z 2L#Mג,C9 c,ެϮ\PV.:EYq!LqY`V!L NL 3߭ËB:)uFٮjt ?#րנ @g$z\g(8yb ~m3*ǐK+,pyzyƢ;·#8qVcf3_\3<>5.v;/!/^<<0p>q>MC%T0n%i _;>AS\l6|GPhZ#i>|Ki"ev\i%s<;wxc0V ˝|h0x]wW4]׷KN? jVLO'W_a۷||ܼ~ Kګ {=Wa8^߇mĦaӞ6Up>q pHbb)<Ϩ=(5 y"~w;kfGt!L6AZAz)ʂ6?]t0gA2t[ee"9ϲts `O~{gs}AN"QdնYM'O3%DvGwBEYKT`Ѥ*Sv4hc@9J$E &jIT6"l*bħt]&x4N()kX]YGREuj0P7d dX 8 fi{~[lQ%3X¹k  TӋirQE2$rZ¸֒[UfXZ0~ߺّjif#Ң4!L}xߢ}+Gײ9H|Sn7eژ&L+L.7y"R4)|!Frr #5GqM}Bt=XЅ0(R ͙kB`9A.$xAtPJriqش=HyCh+&aFkZ [$sRh!Yƣ kNf9i67wXݡWvJAU@CR\h8!W\R "8qB$nU+9eE)ݬY;6X@YEHZoݎ&JZ"~9DzR:? a)q5~ns qgϔjHRkXE23,kcׇX5gi/^Rdedgcr4MK3RnsE}v =5 5i'.a0%`2^P.2NK9v9|Hn02<V'xW^cGf1D0,*XʂBz6dqZRjM\TNVpTTeM+CО2~sz VkR ".H8GcA 33J" [%g@pVrub&A.>PDI69 c iJDh0ڂo׵" 89bF)-(ƈk0c4e%kwERkiRH[jL35QBhۢsOVʞQrbϑJYbؙnѥpb\6'`M; mK9-P$$4Z9Ը&1k ,BiSF(DZڊYr2p]R@y*5hMa&q ٵؔ(JJ2F)&T鼣,"uF Zܽxe!ׂm[RY- .([Q[Z jZt@ mŤJ6`G8ޣv;tJ($rlǔZt3Y eIPCu6[ƘQ25VC P#JQ^:a+:-`y\+5|B3dg9( [3Xo҉tH.5*%Ղ^ejc\dw{u͢* .8\\=w^_y)su}Lr}{p>W/y?pux abxأv$gjW|q+~`u 1P1*l{5,"M3l5yS4 )X4IS=UU(ZV_֚%g,|9./`l,yYPYȆnCL }S6ݖ\FyS8 Yh!5 QHwW0]JrWݵԒpR,hUյ,DMJ|"!"bTڢ&, Ɖ5M#ވo ARݫoQu!#Fbk[YLBLzѐܾ8,3kL#&S3T%iHa"btJXpőcbsqIBh_ ,"TtXEw *ˁf3P5K"bص, yP3({eK[S\FskIk%/}t>B1c:?#ROԞy m=DI ZSCNSΏ,_3^h7xac$7] W6 qin'yTF6D pMGZ`kϘpX8N?o_G۴IBqsuqOQ) ;tm[²xG0N aI'z݋|gFw8.vtwf_xpyv'+Oep?Ty'83ڦxpcO<>>nI>Lo4w?CU+z-k 㞶x%)?[޽OX~0/ ÞaU^̳[x:s{uÜ#av<\-OOԘǘ3w7O{7R8{㞇ϟBHk/noA+w]5ÙM̮ ޿OuF]pYD[a`۴(0믾o_1<{e^p1|Lc>7Qos[i]︆=}c 0$R\>.^K0i KTU]9ߴYBgkumXR ng3m33#Hp).!:r.RL0k ݟ4N8WXɵsb_%)CV RJ2ia\pFaڞA`bM'H\eeE"|z1PnsEZ$bEb6QU$(BkaΊ(fnV!-),Ԙ^cJӂk,y 2ʲRB5g,ʊ.Nz j$b\0 /G3+ LVZH_ Ͳq&QU+B^"@[Tʄe` 3$ݐ*=dM2\Fa}G=sFoZ0jі ϧgbg)14H(J0x 4L*0R_3[2mp ݎW7|\\ WW{?k i^h;p%~x֚aB asuU )Se}DIZjU8ų4y9ehxMiߴ,t1a;\rdI${` -c !-uh<˼qJzYJ,"ۥh-u%qJ$;ܐ(SKtTVLQȡTXnWh45%[PL+?\Ѵ V)5Y+-m' |ߢp"-W,A֢*=o1FXS8+Y(,;ܼě扺\pRJRsWմRyA92 BBa1:IyrߒО\ =*햚JYVTiF7vh)9m_RAJcJ\HEN%{^c\HlA̸S@-Z#)':r9aEp5LndUs #IJL"3Ԭ˨ ikJʣViXŅ(y,*tkXr]* ߴhgu,B4"[D)ڐK@i2TRFd2eY &z Uy&ą\D-$`24cAB DN4V1+Dk2*@ s+h-ƣ(iov(oVo>P EhkqYR %xcS{/QD ֋BNP|FPgʺ΁ v#ai\nׄ^7ݪ]vZf E 39FR.GY R}Cцݠmwue8IPgR%F<¦w%KQKbu SqNnoyss`)g_}FՊX_o R>#/<̗? ,p%as`=XסuŖqx7t[r$ۏ<t)'<==areg7iysë[@u<|'|3 >k]_3ϔZexZm?PKWN4k?~́#Z2Og6^t&=pi'37TDXJ4=ql¼5鉟|%/noy- }WRR|=V9B 'JpA4KZ8OXg0Ue8rŤ)Չu{9p֋8xݒ2̄ ®2cgJB0jLJPĸia)djRX-1#5C@8rI@mZ3x-Uq-匷Z{Vl$4ה2 F+B/jO4XAW$Ɠ^xԈo:21㈵گi`k8-[LYY5B 4p!fJ(V:k˦p0^8Π)q؄(}' hh-n,Pt+OL,># |*uvث[4h(lWLc$"ݚ0ΠV;vq& a hb GBA[W+V)b8%55<4to➢/ot+Q!7/oy~ *wl?37=a>n39dyTā-B O0Fb4M8yϿvGpwO״|Ng6q/ 8S2^`F3Þ~5D _s3xojzoͫ\pT\~~;v!-ev[\{i)9c oxs\x>>uq ݆߿wq蚎yZx-Þ~i/ w\x?(ip[>q{{Z.~ jʼS>KdR47{iՆq9OMǏ逸5?GLc]V߿w-W=9%xpu/ssWo=~KlS /Yq]0\]]VO' 6-0iDz,10qm0͖4\2t!L7a`#Oj"9΄%U%@L|dz* |r=4:H<﯉$B(\9.X#b&f-Y!Xt䴠kej0Ѹ?o8FwAzg,QT-daq2^TU-()8 ؆$6740/qNXL'4?|SKӉ|i[Αv|>X6N'v/9].Px?q9=vzy#d6*y^x5K \^_qߡcr~:K^}7| j.O\ON>vL1w.-#SL ye%a}K a*R<FqxOo^w׿?~w(kphmxoHu5\mw Hu\~4<蚖<=>nz$HDZ>~] <\(Zk{a6fIj5<')ִ cJTQ—mz%IHεTIqin6m!̈́nE.#3{I|d.&K4VPł*T`z@ƨߋ3ݑÀ^׬Z3:%jY$vKZ2ڷM ) n$d)UJ #:ÍL֪D%i QonTZoQVEfzYƌizCR2o] 8FE7tp*XA[)2fŤD NY] U8r!a'Tp$M/e.34(kLIDʕQD?]:ˋ.D_p֐3(T%RHurQ 7=TFD)kV6{~[' UWUQUeCnՄ,/Ҕ"F ,G)mPhb-keRYd-qט#މK(/8F(Fys0΀V3aR8]&v8-N부ABaOqDMY. EZYBA9c$^!Hk'kеc(CU %OeL1AI,ą\f#-|Ӄj֋^b g\e]LơREg[;EpT|Z5(E=: JMGʁ\:qi* :MY.ykuRlltO1ޡ|CLg`.IS!/ 6lV0{'̟b2Oe𮓋|۬ Bw-Ӆ"^5qeM+0LWYG'dT&PV(iFW -2HQ[a ICՊVUIQY7JR)67BGV ':Ӓ MHt TA;|9B_"zӓEi#2 MۡP%Sp[t?@rɧ,6:d&,YgeHN{\T?ܢMG IiaRkH'/, HL c m gi8_ >SB Ovt͇g̅uOvb{axTvO~{`/$8S ʴC[ǛOnÏ| loyݝ t&eVxלẖn?ݏϾ #}ݛ|}u#NOOl u\blc͌35gJ\)LOnnn8G޾yM أWi7=wxqK{8`?ݑ-~ˋW/Y陷FcD[c=w?O3.{Pogҿ{.3fN%0/Ziay]2l72Npd:8Q52A7=]A+ 5j18|7OZJ00BSDU[O`%To0Fs6+!´O_}P^n12e1e fGK@mTmQ9jLUE09%4?$ɵ0fK vB1Nxmk@Gr  #<, 1L x|4 &:޽ǩ*;]Ka+\0r9_ХC`d<G޾y _-!Yx!N|ao#@ +b\? OXΉpŇ?m6yfxz9Av~Og^xڛe4֓&̧tВ-4̑_ әv*H?0= Dyi[>p}sR>拟iQҽ~+/?y|~?W%8y#۾'L /ooLBQ:Gє8 8#=2:=]q:V 0=EG\r+/:Ӛ*TB'FJ}9NRN1LLpPLOdJE.7MGJ ()QXJԾJDru(WyF%`"/4ض%y0ݎ[*f`zbΠ65tQpę*aԦTDGbhe ״,m2KE.QJ.U6`j-1ȿɦe~Cm@/>>a7-uI"P*hwF1-g1:r')抢 2x<>8_v]ᑛpoc^ܰ?x4.4tDmow|Hw|K8/|y2qDe&j!Jqj XJ%]y)L*Rʵ|?m/>w|Io4e<yxgw{80,lnfyzdY4=Y߸n>]t eJUP@\a1̄3LwC3F øUhO;f\|9ow}yYˏ#xſy4ω+޿ɕz{<>ʯ7'5s{iZ w|x8˸s| ii9!7)M*1RbE8oEH )-vz\e^h!Adr.'P]H5'C^Iеd) Fぬ5~Y;jkń^(%lVb>aiR4\+;J*2">9u§:)-B\~[:bDt.9;cdZ/D㽔M?ğhʥ.XӁq$RVpME)3ZbD v_d C 'RZ Who X *. Az: J+bLm Em S"1&".1Fb?1UD[' .8r11Y(ήlQowX$>C4 0h yL *i]hkִ&"hkhkFU8Ӈ,K\1A΋P!-0jC\3BlM+hӰ%MG35Χ{qi"vN{x Cq:iy*.\Ŭ+MYi;r\/u %YGG;L!,/*@ӤԯA -(񌲁JgTEbNWP4s;X9VcrLU,PKjɂTtHaVIL։B]xӬ9ERk% e[J2+ljfX1E Jt]e2-_Ȕ4IwKq^iM>NS+rm,r+Fcȭa}vXq^0Aa ʅ 5'gѫlUr+Eڏh2Ϙ :+!p~zą6҅\3@,[dxb~;us||r磀B2^VϏnj|w~fX ~7r:sR9Mv#4i5836[>ܿF8G;e'HИ煯iY59&n-㙵V/yo1e=y*uzG-2M4ͰNuZIt_~I2Bzl6F_}).{˗l-?̶x<칻p:s|5޿g9K'u:Ybu3XRJNg3~GR'f[kkb:Ol6Jn,y>|x`gK_.Uaw2VƠ4'!-2eAkYK B@ g{g;ݎb(Ft&hCPv/UPZeiEJÀB w=(tbI8b 4MpyB9˒kNٽ3> -qaӂ"KĻR#E)bckU46JZ _EHɂ؝Zd?!t&%BLH<B u9Xj󄱞<=(Fht`COHʆV1hj\7l VbNSbFT)Уl)Ngېׅ'jI>Y_Du 38c`#57*D d[P YC?`2"I`ÀS:ĥb r¡[QR0Jw`kriweq ߖyz.UnU#/%?mplFQ"\,r54LRI5HWKA=hJ)ZFt헎"UJĆ ہJ(%8xA,=#[@a:|]j,5mX#6p(JZqTPA$~2я[4k U8ߑ ;ό?JoeZnxJ!l0QKGkѭbl D̙. 2i 9FJz\zBsqVJi8UKD*e M.NWc\+mYZQtX B,m{ըQ^d­Ŭh\]` hףMaCaj U i|7IpSJ~`'T{6Wא ఖF +Sh;҂3-E#%K*X+*W5T\;E]˵:oc!W1ӍuI PN96c/IcxV\ =GL eN{\?b'OԦ H]N kz؎FTȲ0 *psƴ4B*h u%-xF@m h)1DشHuJtKmr?JyȐ**tX4hbm/ћq'Z/tɔ{L'1#mMD2. n9ZR̎#;<v/@)H[3y;VRmнR8YDsF0R ]V![WW4t ?~TtL)1={s]=ٟ@[̯}ٽ`aOw&5n?}K w-?}||8c2!^3o><9vQ#M^ gg_|Ӟx8cwib;ht;֔HG~K;|,#)~OXCZzy|4jy/'54Ckyx~"w|xz#T-m-wwXmw[NY^y͇H\_]q<Y/_q80VyeMaԌ|9(j2A9I!"r3q]h,LS X%UPjag:8lcu^G_[/^{~|f3N3ǧKhYbx'N5xu5nF^?@ W|wc6au{Iy˔m8޿g_~^Iw)\{jiA_13O#gsnGܟPx?!:OOlnKdԚ4O{6Àr~>0l7ndm]8ȓG~9?g=waǀ5gB|yE3Mՙr>O7o1z)J0lGEH+QJJ)Y%V٦-T VɪBB(ec m4yrBiRtREql]',1ae>Tz4m q yZX'l7(VtV RDY.gu'-eƍP傛75ń{*e/6">l(Ԍ~D2ẞZuڍD mieۨ\O)%GtKb]ϸv\Ru l-|`I1ӅD\Y޿j8L3Q@5w;j R*N؊pĖӄjn{Ry&. iDK+J[R* DwUn]'嚈˞~F1+pA&ZJZ9<=c#tKiM$ Y( U*FU֬Rx_D5A-B*`h(-> $RK27HW"Q$r*F'EQV y͍T.&^׭]_5g"̅yjh8==HʥMkI(1V3,a|:9Re\aYgZI9OE@ BF1Xā_CIJv$,& XcZ^VɅv]dHe!LUPU*&JZH *-kLHMc\ &Dɉ~؉e!/rO[*e^CR~)KPKM֌nϨRMб`<%"Q^rBPôt|F;UPD:dy]1Zi2yWsd'k9n$qq9a(gJe9>K$(G̑jTS5>xV.`MG)b 9E_ᔡ F .xB.L 8?H C+ tx4Q!Hf}X4e:{J9E䬵]V.r6kER`K : 3q׏a@W#^['Q(F3<wP:C]Ia GVz‡Zoo[\?S2{tJ~Ŀ߱, W/nXUW]2\[Jkqeّ)RO} 9||,wxo7QJħoG 7/n9_+3޼(G1%q'NGLNiPLO_2NxQ]ZLܽzIqgF'oyg^b ,i5|f51g ynG_ܰB/ = k0;jɼ-KdBW8??Sj˯QKw9URȧ#ZNryyx|dbfvdO{n Xrb>?S6 oOVÏso[A)M-ƿ-7Js7ӽ7c?y=zǏPF_:-2y鉛[v7L#+~z@^3nCҵ.ZċkՔHQlw/_RJa8:yu{.pN3>yL_IJʺFkXca5e]iKAy9ajmҚBwJhYSl[v T)XQ*08gQ6Ӟ*~s%똨֐q`~ ( tUڈ!*UeV8r.jL˗ˮ*If$BXGZQ]EB 8r"ʂҞtNXcI:BwT*Fr8(eLMJ&Jy^A-P gv蠰JX顴a(q=8'eF/d+膶=ZYcyz(R *LJYQص*ÐFdsPgpn?Vqܐ"y:<'nxn#s$z \xͫW36%ߏ~'jY 񞛻;vvdpx>ΙvkϾ`#/nn|tㆿe/޼-gyqwMUJB:񊟿|2<j?g%4l.?KO vr uZ p`_ï y8<點?lqCǟ)v%sH&> ? ,Elo9|wSd]2V#g=p|fY#W~K0߿g+|o=yzz/s=90n9Mgl1 W??1N6Fh62Or՚ )gr0O'1'⟃uRY-U)uF;n V7$9\e,fuخ5/n> \G+DJlo_`\`NT u"*fY7ѹ.gtl#Vc[he傢d"ibM+U XtNk5Dua"`*@-0QL(q!/\Jz˂dIGZ:|PyJNi9J-I,(T L?ʺJsVSP݆RZF֕ R⽧2c0]'rcqCG-RZa^8+*B)3h%b|!ۏPR$[tdmjr[E*/]&|6xτ,QwZm(ΒG3/+hmu0`BEM;=T;ۂO{XؚJF.@%JAojT$(It|M56+Z-x)Y ~7Ѩ䘀BI}>uFZjOΣ'7)ZdС+9F*xЫ$h5v<8RdG_:\cưN'X'q[t+^ibqRPc Ql18n(P qMhRmA1΁^Ļr^.z SbL-GJ4Y֙GmvxcTa9 K¢nYy`pYzRn"C&&J:w/>H oGaTō=*|zټŬ+) ~J*ә5%v-?Qo[g=ceĎdF0nEK0  _`C;Q̌Ȉ*rLC+ks}s%[^޼bυ/ 9s#5dVUw lf{駏b<hmCk ah}ty7aXmVO}0ͼyA c4Pn_\[Xs4 쟞c0+x>6 zfGWŚ'n?{ß>kaϿ7{<}uC3>|_њOOO|_q>q%=?;p(B9hnZU ]%f6 2UG!v(g?)˗/@su~xxۛ[>A!?oFvFJZbF5gWhy <@--5g(֔Rm/4iv!3O'tb^34YSEU pډq8v JThMTJLifsqAT4XPUD@"ƯPxG_H8loɌwA9?3H]DZrոv)uZM8TcFql1,Z)&908/= ,tbL:|LxV,SvqR t]'hHa^S摬{)pSDJ5j[!ie㴈$Kɤ BӶ(HjG5l/~OgV59puu;|+As:h:0 K#XgPN1Gd)F\("3VYЭ5D Ӯhm=ɊyA;(MDbPA9NX8N4U*RIy[LnI5d[)IP[2x_\U#0IZ+_ɤ9021{ș@r XXJJ,fmj&f)~k(TROB9GmqXiw(~+[[K ##DA\6,ϩyb5Utqw8_B偮4C˵Pb$Ą}Ja%đ\"xSkf<_n)KJ! Tj0ƢT&倲 (/k᪰|xy\^z 2! k+5D^1+Z"řRdhe0-߆i$f zf)״k\Kσ24u.xBw ]-{y8KY{jm'vT9WXoP1fƓt0b*9wrM#XRIb^J81RPO{1p:Si曓> ,C%^BF5Mߓ5WP-%KXq{(%U?UK[\"|BJWBAPZ1 W! ďTyqYA4-eFWeգ D;HՉKz/F\*u2igJqN(RTM*r5ZChkZe9(#'@zw3<=0wt&יT#$c %j)RS a=໖p>S`cXB4VGI[NI[+C߂դ*8؊HC(J =%v'~/Cs&5s;>8=c˯~/31Dc<Q.{Z89KyjΣȶ]itkC W׷N{0"$}iP3?~=-'7x //ņ_|s=I:V5WWC4Kk;-/}>0 mדTC7}\2sY_lB8?n_ĭ:A@0?}ޢ᧏xzzfyo9Ĝ]Ӻ,O9gr<=>ryy)y"@f*DIY(ҁ4 4y|x\. p$o((/D菥N%4Z hbɥ`KRZ^Fk~EɅ%E:/4_ei'ĒQjmu+rY\Z 26גQ)tp8Ru4>[''rT@dI[SXpŠ۞4U-HNXDPŠIRt2B%!eۖ9L* %n'q ,_8O5S`:,ȿqUEB9x8`Ks3ZZq>jHU5iA}GYʧ9ʃMGT`NV,%fA+,*,c7 9T;jTcpL\3 NWa*-> `T+Z^ʊJ UĒ1eJJP@刷Dl9=i6b"o,iHjFۖ'軋EX b:+'#d- g:T['ѷynPŐK`>aEyMM8qs}Xw :gVM 3xVaŻט\ϟ\10V|${54r>x{p$$󈫊9"3q5JzCj;J)ǁwҮW잟/߾z=-+-6~Jo5V`$1nzY+U.É/nnw3O?T*0J^3eyy79qÙmb0s1Q^QcQ54S EY¹8ӶrT.qMӴh"8ul}OOyỲ!/(NxJp+"㙒FjeQ0*"4Ӵa$NhI.߶VHyvBwy[7Pd#e<wD9ת K֊S"SJ㛖51Nܮ!/ 8-SV9r)FHZ[P?a&EB`%N*grLX療+Z[l`T& ',T9'AԒ !.tƴ=ʁe!)%j4ӯеPL;٨LoI9)[DEBIre'bÇXKTw>0#rC_BJ\։w"NͥJҌhfOYJ84\@xAc8UF*$dH͌3B*D4ouD AI.JD L3 ei}sCK9"rA(E< 4v1U;UUHI_q1.3ׅnVd *BE! ρX!38% i#Q'UY:? %A5J+8%YTcIU.(19r$xAL8GbMXitÔlJҲ1 g-9B[/VY]ޢ~-"Ɖ4D*HޠCt2u ٖ2u]T!{RqFL9NDeh P ]1Ǚ+xDU9qTeQW䢅t癘 "9 :lq?kLے`;'>RƑ2N5fbhorG^RPkauuC<(qFBnkI#m^rNBGceJ"P=jVSB[j!%Xdp~EEYDdlTc if'_cELhg鴥t 78߼{n?qQ'dx7fNg\Fq:MI$߶-x|8Q=E+rW7|z?|8ϋ-__m=7]a}|Fʫ=_k>>Oeo/o;~T+}a9>?ẖz'Z/F<~~54r_z͏~!|NӈWwwzI2a5{\\l=<x?|=i~_{> %W7?<`W9:ȆĵLR Ī_q.|put-Agm}a<{Ŗa1jk;޼}^Y\N?:oyq~{^y~zO 1ج4]&A@?P9K>ݱS kʤaFyn8㭣|fr<q~/J$]o08-8t ,iFW0K-t  D"4@3:R1Qc@w=Fi*Adgi q<Q\/ܔ[bVZFInn iխXY_areGin1H Rh!WrՊ0(+d4ۮf#(GFvb;?wGauX6h/!ct!'ھ'm<6tKl׈Yk9#V#HwvMG\Ӓc5lBLcN]'j4aF N$m$t"B%rxx?f%/TZxPF*@:!D2Hr^$|M#V۾#Wa|,\r!0e5<.?-v< e\i;4Mi"{qq|#DJ q"='ɷk{Һwg~w/(xlSL̑ƶ52%r"[LqMYBUm@0J;ѲUP=?fkASZӸVd.{)c%ϵG!{Bq"i#a#CՊH۵hoň(-O.y)K<@HXLEV8 4h"1ғi|'Y%B%RF4UKXR3!gRXeD2mp<=ӯ誅§hKQ*h\ŇbB8[QlЫWZ󈻼A/VvsHİQ<Q.$,8ji9Um[ⴇ(QB!噮i ZQ364-n$T@,5E|m:LQ VIǁZT+YbJX%/Hj@iU SiWP&YxC)j4MKuŔ%Z M1es Z06-E(:%rH!$´khm`:!heA(M+ixR>7N:O>(E$Akgr!tfӃb%=AIQ,!g1qˆ2˳xG3GLOG^\_6+>ѯci'~w>~[@Þ_cΉ_ΔRx3%zE"_tUbۆrv0Ca4a B/? Ow/3O\|A8\\1^\13~y|{V~Wzfuui_O?SbݰBaOlIZ?[9?9 Yo7w{NQa<3v#T0Ns^2r6j0s}qI5'^t-'޾}+ZExf%y!K ? iTZdjCa۬HӀ[%frWdYLOPP%UI4$rѐtH81egJ[w]3iVޠah SxBYGb^-HBWD/uFNݳLFdwƀ5TP˪y|$"-d28㺎:B񾥦ŷ]ˋoi/q"t`I)@,D-ݜ9ps c49*oDDk0KI9ׄ1DzpFAߴdU Xdnюv^.\u!5aVYj4J.ε򇭄'´mQ˦jt9Z\ q}Op:͆~%xab3t.n8~-޴̳#bӚG^Rbp:sp8n/o~JEIs%[N=4EJ4煮 㑠 y`3kQ788/y=)t8L^d<7_g{U߃фyf̪eH9γ~yv7K HլdkmQr8 3YWvY6X9Eλ|ӢtNA>[%ΉlqwGIsWg՞*fAIz!eOkOi}^}FuPH)baSk q\膁'qq{)wwt]J,Mɋ|zN}ϩFP-/_bG#Z. z ~|{T*pS3Y /^wo诮8 . <՟}9O#G~a'yB(a|؏g?{qf<9<~3=S\.vܽyoExY2;2kp{K:nekt z?SfN O<δ_!R ˲s{x>Hߋ yUD_s)*M#񞡗UN\q"+"$M I"GX]H)[Cӎ2iڐK̜P(6X?ʔȪᴼĔsU&ҔBYON :K1%uU8%e Zw29%-JĵUMF63&AVQm.1n3I)i#"2QUc݂t,F)xGI3uLm8<*Ն2r:eUR)$Қ\)ӈ7\H)%"*1%NB@)+c3\X6r>  g1ϙ%F< ӠTZ5e"8FkDkCk H%ZY} z wL#]l{y:J͔RUJ;TI4_AL+qYP]I+&@+nG( -ejTa+p 'UeJYڝHUvƬP9.N1'Mi% mС*BUuFzXm8ۋK*14%V߿!ts]7t  5Xag\^lxFhAH)s[~E5E>}ƛ_~it_>TqKNQpV+a,wHх} &RN8e!tg:,kwILq<MDNW~︿Ջ O a)glw|Ս_7l$/%o޽g?{ͣ _~EN +{͆뙦JECl/vr?^@ 5)!/xDTӄ C3h)>HŠ|O)UN7t)ǘI2Q&(IYrV R+HL<`אt:c尣$@?->xL/DCqτ톻9D#njJ6*+Pvd:V[^cFkc( o1ZVO΂3LjI'܊YxҲ7Z$]9VV=}Ip|eIt}GPJ]~6JK9!(Jg;s@g4zVkLĭe k^Dp;Pٵ?Q Eeqzό :DWF#IAd12JⅩE#e*LkH `<98"l}SKZ PMLơVm{2bC ֭[c*8n ,;0]qƓRąNJehQ -B֨'׌^0YʕF2$;L]Mpi,HNWu+61*<*JYN$FP*KtѴ,kB#v*f:'Е.hi|< X|°,G\Et֒r!3(yc6 2ر: 0aÆ9 ךStЉ'M .- (KnS2?B8Cmڀm;|8_ɴ%ҌckjMI9G|pc\JKJtVR]Pvu\( M9Vq:i\KeEadj0g׿DՆqJ#OXX>E.R3.fyw5bX0>_=hx))~ZˣOo _O~9W3{ßyCO~ç[gŻ;8{>n;.Æ-Yٟ޿ndP;Nqyw[Ԓ)qo/_F\p׏]qf~#/_<_+jϾzK8#>W0<Cga^1x>r1)uY$Npe'X|w?9Gu<~[',˂i i^yHĀӂ<5kf/orGv9BLg%|ϹǼ8pmYZb<O ?0E1Uv~GAbsM҉M맏>m ƳG #+pݖ~sIՍPVcvO~`;lӪ4؛5HKbXiy!3)C]j!k'R-t#S+Ɂz6;acRz-ݔ#eܣ2RVr-ӪA? `a^>h1^K@M+-2K&Cλ5k=癥ovO qPk3$Hɉf<@Π[*#/'zb1ɞV\SR(RU$,t&8+2B\S4jlvWʋYã)CP"a(Vs"Q4VPes뱻-5EFd#t:>GkiSj#wć4c͏?mV6VSGہtJ .unu#e/L+- e>کS(yf0ց qIgF[Z9auE$Fє+2SI8/* ҟӅZ wPHXGSIzp%Q $ք=yPf?@b3J{3vD[fTIQ]Gk N +0.i5:tDQ #uR( 3_b$Nvz8 zʻx[#xagaBޔhD2ؚ8eioX~Uô̸0n@f4R)ilQUfs^6y#rMk4<͐&k+(bwWPZT]^@kА>t,.SBvFxHg/-n4%tRq݆,&pAS.yc~_i!Jȓ>3>{_shk? G7G?ʻ7hJ >suy!D#LT>q4|{Q,si<-5o︻~n8(m3>~͛nx~gnP/{Z'jmo?K|?RGƟ x˄҅8q0AߡFuꗿ:fTZ3Ϟ>y:xBM9W<}?/oB#oy5Ǐ8}G͉xbr0^^r'_~>nqBG6>H*1=ل*WwZx59%8QZt:s8'݈{ R:x[./}ONM/?/6GR+Sk,=N*04/krTFk`\aw#,)9&:hY%au lj>xRT!iyv)4a1i^Q'/vK<ɄՓ!# g,jzRfݚ^/FYewAХ(xN|3,㈶Vj qbKsLg!,1iLT2eA<'THq $|4qe id>pwh[^;Zn΋3A>,?OP& nw֬mQ ,jmPrYKg >}uZB2Rx)˶)-XQj#'PU?<dՖbHa{2'|p+-I"IQpVɡ17BCqC)ik!U5Ekn9ܧ/.QtZĈR rRV k ֈܬr5(J8f8*SSc&llaQ7j%J1rA_^LJas)ۆR)E mh?mkPQY>KUg:VD\*8l5>2JUbS"2K(.%EX*%QV4+Y)+޺b"3]GS5Vh4i $UʗR+6Z rԊ] [F*9a)Zf1, \g|VrWFK3&?b/~NN'̰CTC]S|K͂^&Gy'ek5q\%$%_ k`6Ҙ{B@Y4^6J1/:ZETjON&ń Q-\s8N60:vkeWϘ(EIEJ3% scY0^A$N58gAhU2]DzÀ9Ǐ Pp8! XXLׯ}Ϟ>CǣW'\`LR+-_K*4;pl]_0NG_u3ljL Oɋ& =vypϯ%߾&Ml[ΧQ~'H pt: -}dǏIy_g=hq?qzE5^_q<7ȇ |{...񎇇>54ظOwl\7|'7g.O߼eQӲp۳"*pWءF3%=MU.K}߳ `,a%o߿#‹Q+:>tKG{yиb<}T7w+8|CWhtbt w2M7Wyݰew})x\x8i}ͅ +L.Q~.Zb'FwȚzx)UO5#UwteO&j"w>(  &zθ,V{Lvr8kR!tCPM^NV5L]m<)m<$f9)5p4mGeO)`,^i];8|'EɵdsmtC DٱHyZ* ݆1(.on~*te}El4(#^;h@);70%r()&Om6˱Ռ;r0 1qASd1G[/+*v4~kcKVDVr e[UP8?`ݰM k)H% =i6j LCx:ⵓ]PJVJV"5g (90kUQ+X'n]>L@ 1A4MVu;q.c:ۼVM.DQjКD\SW, )%B_80ɦ'gpgĴ֗nF}fƕ)+Z&[qNMG;!5)2ȭa!ɒZD:O_jp?Ç;4 spwq٪7~|C-oxvG^~?k)ә_1\=|D>[=aNBE+oW3w]yC3\?ûw{~/yV*U\lN{n<'.ݐwS~27n0;GdU6Ʊqh& KnO'◿B;>ç#r}uųjcBsʰx:81tbk…HqxSsÑ/ 5rnp Ju“%$3>i S9o-xߢD\ c3Z. M7RQ)J{Ueԯx$c=y&3T+xyJwAg<#ZZQu󄰥x#lKIB,+hԜ08h S/ @Ŵ$)iqY*%tأ>Y4#2n ؎ EA#HEJ*}B7VJ\ XpQt :i8h`Z%,t8]E&X y!n%Ji)qe\k29h9lo , &E9( >m/p'ϓ/-tϓOwl6׳V.@޽l ?|@SHsg>D`{#'2[$DLc zo9O*RK#\/i;J|̵͖/=U|_Û7cy1W|o+P20/_In4nSf&ifGsE5B4̍8iquuI\Ԋģ>R寿yk$?{‡8㝡vQp-p:v=_>-/_m$=*8>߿7~Cg0!ʋOgrt}8M\_]QP)7 -f?~wg_}ż׿'Ĕ{Σŭt趂=3l7lOwwijcRI. IhɹК[`@ 6$jEjΆ~Cn  #{zpO :F1J)䙪4;.U- cJ32Mw }m4nbR伐H]\'9V#vm:F [ZHKKEiw88%" N.yӲՄv,P (]nrp'!Ԓ-[C[Rmg螿ֈw4"qS˝^9 ̆#Z {,}>U#.xl q1J@+Y@6Tq?9q a) TZxg1`솚Τ0C2B8\8tĴZ/+ & h%T(MLx& R@3,[2;72(2ETk`5  lUZ-ʉFRqny jq"8'_)haC[C*|љ4&!g(r:)gzbkK4XQ3)ßSJcGB?@Zu$(Çy$ ]esUD=le$Ɣ#iUU,z|@fb8TMϒ-_ {z][,j/vqιV[[{K  zh 4D %tR(2=Ȱ0_I$ӽk}c@+-?|sX_i;o8|՗|X}xdgs#(#_\|dXg^]=g5WBRZs{{ՖŚ`\7Oa(KaѴaǟ߱n>4L)||iz})?#y[Ӊ^[pw[^~=Yik{j,+!ͳKf֛ >~ XGQ:,5ɒ ebJ,T6vtΓR",E@@K^, Z㉮kxYw=״M.FO|$?>чD^\_bf?xru@cxI2 yA5ruhZ4cy@u+,H莬"(l̙͘-DJZfkiTii`S$#wvQr"ω[cZO;xH^XۓT PBM^33hǰ?aڀ[5!ێbEG{O4h18dgnqFKT~&/ |Վb< |h{)7A-if%4R gtBxUk1EoEL8qM:FJm5zM#Ï( :r-%E2VW(5ލA }pFcj1.xugDzg\ *A6tfB=y|dy!4-nufZ 5Iˁ~ΐ&Uj]΀F`x_ oZn%/TM!Tdo#F;Jx,L@Ê HaO{V ({:iӚePMWR=}mۓkzsT`=:G(Qn')4݈Z iQ6@P2lVKHIE6i |\Ֆktv{|hd;2X)gAcpAJMuA|}yJ:QSk;CL}Zxgi$Nv_%Oӑ#piQjJvӴ`nw撔"' =#Di&źg҆>+.cǻUS_p8 Lq3T-^9=hC׶|~x8v-UCp=v8۫|5wo o;\J5pbċkuD>΅De9 ڱ.[9I/Wi50t/buٓLhoҮ.Qa2,M'R(R\pFPB:Mce<-.q8B+*MI R&)#ƌ ǽĴ"(&EjZbs1ZsqV6zjդ^ў0blFpX_mY%\hq͊8ΓhEϭX嘆~bYFv8#p-.tM (C3yqaX)CѲy[|0Kg FR*x@pв|@>U\y&LjVb5FZ(#Kj7DJgW  ;!WrP9&%W'L q8/Q E(1{R,ye"ʶCOIOH a9_. /- JsK21 z&TRW\fir #qk2 rts| * k)U(O]YE;;p*u/Δu uّ g*=qtp`ªB*}F$"R+Z ]Q1FC5Vg +iO㉶ֽI'DmZF VpҭܹʅR<)| ؆bȥR%4kJ(4i^Α9h\@!_r(B&c摼$Bq,O#MǪ Fx8V KY20}O nbUO[rbY i>¸G5yNh#]1Rخ!.@#jTe=[K1 mQ)òE{cݫ-+Dǡ,9wHN7?]+xo1w;쥀e̳\j>o|AG{M>)9%k5˶Psexj+q_t,kQzxF5-?Ev1B=\] 17.6k<==pO?aXasGk@*Ŧ?jˋ/xw.A6pϳK;d.jy6C\=p߱߈C+|*nv<=PfF֝ O=t}~"-\` 'BEutr>~@/opswilhNxQƐbeX-ZkVW(9 )SF (^9(J)9QT e m `Z8Mtsy/FGb:[R 5KXl {MZ:|X1D^߃Jߴ T ֚F4O?|GwqE,3݁4f#&w2TtQ%l4#stbF+{n(J-X) )[(VZM)|@hN7=Ǒ{x /-a㤔D.a~Nvhנ0k,e\F,ZJ)CeF- ˴h'Sn s&` 2i8f0e+R#X84NȳG9Co/#Yg`L 1&w>]`'J\ƈW#泸tm\6fMnِke9p&1R(2Q*3"IM8S 9jEhJq2VaF/'qV[EYL ]9 #1~-*I2{bkޒR\A|%N#i0Ca\#@ZTg,m+ q8n2gVޓPLFDkʉ)DnZf(t$M'YlT#z2RB+֞\ Ԉ6JR;qk5r)qFmZL4+Xm0Ϧ\D kcNyƇBa)T)(kߵ4K ŬRT"D|Qc6 ȶbgJ\Dn=?O/߼df$W_~DmBh}ׯi M_1<<=ݮhWqIcui뷯O;N5$Ajya esJ Wi8BHҊ}{t='o۟'_)~|-%E68k15S*@~e+;0JզeI]4(N5nO'6Rmq׷q@ulC@#kXNX^\3= 7<~t<'qO'.kWW ֊aݮHf4pѮ'`Fk" (BKTt=?=p˷zZ8'~7,vKh%2ZbZFD)%.T;Ot.LÁv 5Ѹ5hLǽ9.-6rYDj)G)qn=V9%Gobxׄ:8׳V+L!Ȧ}ƬLb*(kS iI$b(NVYWE1 ǑJY z/nMEYҌzbQE$iiˈVXyKL kPŐƅ+Vy9TԂZ>J%յ=DZFTibmNd[2DZSU4 eZ[+UIW"#9 Vq:` O40MCKQ0\O#q%#>/k<0jX(UK%ʆIiJ 1E )glgL-UL+#QY{[pvM;:Chdw+JjbLOU6FE.s<1 8]$RY*D%P"4Zpm9s2b+^m9/D&4oLY"Tuh+&bBY&w\@x (8~ja_%rw JA3L`TB혳F;C1 k(œ8_)hcQYhs~s6cXtv(e;#f`)l{G9E%e*~f=Քʂj4Tͨ*t-zz"Z\}KՈ3HZ% >%eug)48ԢX[+:qxtq8iifz|m,i|@uY c0t º1*=;,o1Cd8@&Vg1U:tR>ҍ*YyT*8Qe޿G5~"%HIr;ۮ)QyiA{CM2zUUMY&L*H2%J¸;0w5c|YL`W=C~#6k]qw?|_^8w?R})&}#g=1:{֛- Pޱ]mеa^tmvF'_d2%#-Ӽ 1'vOkh/֌פZxvq~ *4V 9&޼}CZ>ʅ\+B:#gw{ʒ~QLÐ#q\]\ hQǁmX#ɛ_3yTq1U6؜k)uk{!:xR%$8߶Sk<Э7JLL$Hs3=@0 ya%ô uhqXyav"3zLqZ&@=qhz!fГ@闂rA ئ#OGЖETҘ*t@@UrxBԌ-6(!R(Z᭕mh)UkQ†e:HyQ[2J!4h†\ M_N{ FWxrHwy($eAW2UPj-s0DbP{\Xe3SLnxW<||O.L憾wؚ^G<ן&x͚#7W׼w'2?G7?,|jlg fWYz4-E+1m`IKf7M$ ;U`gu'\T y#gA_l]˰;8<<}vI]3>Zѫ@]?c $Bpx4pxQkeN4l.>>j{1<rޒ_x:p˗g6Mx:˳K8 y\2E60Ƒ͖en6,VMys3x{agOh./.9MxgwNíP*S'Lqkp p\UPq{g #B2ORq>2gc&/3М/1}2I$g*3x| L>cўFa gT2Ek {y"B&eQL)8jnn׿5@U;.-[RƙO޲{xוh>3S>|ÀiV߼Uo=M,?G{jYð0 Ӳ qzyxiY^nP;毸py wxvMl /}i5)e*K݁r˲pʅ~Ϫ_q<Hz"Kqi=k0so;4%b˯qw7TnR8z?p%s\x~\+QTfiūg K{N ~OZ"2s< !CF1- W-{=:@ZVhS*c+>|cZr2EyM2}'rĹҮ$/qh|xXt ʔ/4*PXR{0uWa!{P 8Ӡf<WՆy8#'Y]!/XοSq^,Dq˜J\F!@J q]u -"o-FҌBLEVtpbږ7^^ZCT>oRM0sUŪLIkdj(exrC] єR0U%!Cg h#Z TN2Ĝ[|%֊ JP M"U5<2b-qyU g D;V+YTے5kmz\.PDRXt^ =:tD%&EZ.%XG %[r*XQ!x~5v}!$^Vm)J:C Dv;PiA)Xɗ\`p?0҅$b4ٚajy l] eȣaՓ̹;8/8eL'4o Y"<{- r8f#Tv<pFCÁ瑙K|ƈ9'ލ UkLQxPd.1.\iz޳/疙LފdwWImI- 7<al$]*y;"ՃoA c{1D*/ޓa}#@& 2H3Kj }`77(4qJ:;ZihvV/ @SxAUcXNhm. +8QDD6.EȞe֚' 87eGy􂳕8N0m/۷ŠTfp|dz0J2DJ-s"ħZ-Q =tL`zӶa(8O]1mTӂ6bVJa|V(La`K1dS(zT djmn2Jz9*1Wrf\6Z/TuJ'셎U[E(Y^N)Jb[-֎2Ȫbfl1^sE%/_A{/,b?Dnpn:Xj˰L$R{v-h#:BD#1.L|ɥR~EkdO仦#1h/0 HTolh@U"zUR^MϘr F[{KQȠ)BF,&Ѷ ,Z>њw6KV zM36'Jh9q\2œgVaCtqdx3ҧ2ȨpTMeZ<J.)2fIZɖ jI3m16m!c\@; .EʶuHӑ2z x HRPmHZS }G{l.QÊ:G-ET~֨-*7˪'O44L7qr V,1Og; *1K,TxtH"I9:Fs-̄ Kh[m0G8-XmWWOǿ7p:ihuG˙ mZxbl(1-8M|H;޿}Ȗi5ȦLcdZ&<\aagTXu x~xbfw-ݖ=ݽׇ1\8w\p\%n9YDAwO9,iDx/=M5q&xO qwجW6g|XJ߉\yx_|aG>ylWOO||\ כ-+>}9ϛwXoW2JE_o}- &i"ʍ͆ 78tkgV8b;4OV+兜2w]-ݎ#u===i<3l7ǑFc{~{xKf^Da[:79,%Afg5MAg2o[6\GO apNLd#oh hc.S|>`'K@E%[gdA%jvdpKA$JNy6Ϗ,M'WyafO;W^(gJʼs?</rO-;v/ Gx fHK﭅eׯyXw=?nOZe<Lsb 55%6ct,DYźLrNo@&%&jVLITߨv!iTZ5JXzjĮ,1E6(?Q;J&gK'k\ ա3rT [b˪\(#s~JB82vfT 0*uZYjZ(K &ІKLZTc-1MPX\ .1z J2KT&ڔZ-ayK3uI4eC<>`1)բfS2[ 3jCbNh2/skUZR%cb<=DHJ39)D+֗͆U;Gc/ J(X)\!V(Z&ь#.V$KB׊N#.82h J7 -%ONFUɾGzPXmŠxh+D45{TK"A' J|16KJnfI "yt{,,Y.˂6-d0% I9J:Z%%M/D: Hg̸'쫢ƅśJ()Q$x\k#[o,'62mh-fz2s~yYm9HyEYm`1Z,)EyP`9nL"NN90Nf k {H`L{)q yYV4 {(ě`仨B-tA$:GÅN6StD#^ȧ_®7TE kIiUb޲{zdX_QJ1V˲I_i-QRsV˓|^j+2A+JH+s.F'CE`a}wEϴV0g͖gP7^^xsrf9}u-\a۷3==c =yϸuW7{{^y ?rˁUQ0W/w0P: Aì6/Zj %Gr-%YӨ|&XK3b7Q'Rp U|F nO0#d(i5rҤ*, yhǹ#y/ϴIbW=8\(MKf,󙮓-G^"%wOx7[Whb")ۿa9@yqVDӉ.xI  ]2ӤL6nX3H!zղ( '@j]ip kЦO'Z)!IY2X?`\ָ`Z.H?UV3f, ^mi |Q\次6)2k Nn 6L xRDFWhQe&k0T%C!Lݢj Ek &LE,ˆDVǓd2t 4qDTlXIYI.xHR8ס|HXW RJ{ @s>=OicDW<~?on>]1YqO/ >PgٟZ8<J;w$ 77TJ饀VY9_x3޾EM~t*Kj ׿ʗTz˞?/(qxyF+3^O{yuw;O,8̉~w/A<=xQZ?gXa:qauea&M:7&77t]Ǽ,fw x` ]_~-qZ]wMxo9HnVQ WT2yOig2i'pr'zG[l7'OG=ؽ/?vyA:M/_^bB@WsJXւJ9Ѥ_K^4+FpEYݗjWBVCH' QЗ?DZՔ 'Loů|4'4Ivօ4M7()|&8]}/Z1 4b'tLY q v(ڜ0[x5rFQk߭l7 [N˞vŗ6+KS_޿ zaw\?iGL >47,1\uƪ8ol6_vqs{x8s"ve|8ZeZ1g#ݪcya,Ӹ@,s~zGȅO8>M#Ox:rwstB$ޤ ݑX ݎ;I$̇YbBW4|̳h RXk\_L 1qpND-T{jm"kwhiE2]$Js465x 2M>čl7Gk%Θ1+r8ANhӡEF^ڄd,pq/J_h4q~g=F;_Fy9&aۭes'7i~qD\.S iyB\At!^+[Ss+h~e>7P"5gBu\krl⃩NJọ|~g^4 :IBlԀJ1p o$TE$L4 CQ4,-OP*N/f|C)i"Re⫅hbtO覄\\"0BGV< &0[kAf A.x;rpSmR.Vb7RjAG/YT=[ PBM9%U9( i_%"w5o4٫s\K2i;&"h܉j\X_D£{QN+YLws-09+{XwW, ] =iҚ ,^SwKT'X '44dAIkYZKu,Z{TSX(\ZA+Ē֑e>ɥ,B>׭8<}H.QJ"H%/򜲝 DcPF႓瀖FY2U2] :{. 9e[ΰZm/~JKI:ˠ eM%'y*dYm59D7PUq>Did2u&%hka2 K* Nij EY"9/`iųTj_Q#&>>=2>~vf)=O{=q޳#͚sZBQ.la50A\>É%Ҝg-KMfU°|w/+v/{Պ3˼/bΙ:%rL9wp^fv/B1Nҡq^JjD)?a6}tÚn_bPް k~ցǿkV[w5n%Fsqu{yۯ?'/ AЯ:< }Gjˎ-IU)-?'_h5Ҋ BJ&woܦ |"ͳȩ4hѾu[b,t#'lKV:ɨ V>#i+34TcΆZ VՖy4XRX..ѥ]"劔CzRZ#s\$d4$ "΂+%S[]]lȵI9R.t8̪yG-*, s\vtE^W`iTPTChhxX|ߣNn[(\Pb.Xoravh5[x-ɵa0BİH5zJ<-,(^ił\ieAiERx#RоLglQR3zXӬE~̓жd[D ۵WKJ|~d4+V C;WPhtUʴvnz'l3Y#kOR9DR<45ѰƱYS]əv0@˳ך'O^NGAMGJe T#.V40wrѼDZw3EP䐦Q4%xcIf"Vl8_.ȶ!Mm4IwƋ7%P)El*cS +jVĜd\=T[ |̒VJ`Gr~jUԈrm{ hF)yЗ(ݲV:R>b_]QZqj|9 EܸB_ku(kO2M36\3= CC_yU Zȭ=&0<,4qՖa"/j#>8shXyqLb\ 2MKeCceYȭuehra@U4k(PRn" D˒Kb>eK %&"&z| UbBQDjfG8LR'(ѶG;_qy%qKDo:ZZ8<>AVҖ-2Ϩ1bYys"^D`^p~C}yؠt 6-dIV:z} ZӉO#}1Rbf^c} 3[iͅnXn̫woO#n~npkv?/xo5OtސU{o:rxz_4?tYIQ=/?axsnû/_KO^'>s>|H<<{Sɗ;4aaH  ZkOhty[P 9#5s9{NʅOޣUabiT4Jf8t8+잞جW`Kw Lk-{wO4,mӰV3)xС0[y9 9^b~iR_lUu2>}b$"®W蔩iF-sh[h4gĜ0VAzL}k~CJ3BhZulL>nEoHai"낥&O{V$ tx˄Yk #Y0\r>wJ| g)9g0 81tеA!$$42YQ|X:ŖG(oLs)!oEy22Z)RRݬ1Fcr8gϨX4KBeLG|ÇbN'~ F ^U0ʅyfHqZV djPP}V2-P"78㰾'Xh㸼l!3l E>Z:? gYUЬi:h8pt<),/YZ ߾q@I3 EHWӌ5LˇZWeƳMCgP@ ]W#mEi"2]Aaj\1`SV0X#,V`(cm{8WRWY3J9 b}G-%.h-ވL)t~q95,`# *'lZKE;MZ.6N 9flո݀B23 .$ RJ|?q<;Ꚍ;)#岮8;HjHO;<6h߂qBGyglT߀ʨiĶYYJqzn{!XТYDZLa󸶗HeJ䘨aړ24j5)yfOܾ(1&ej9ȶ|iD `KfxFdH'0Y.#V )CiCr@{hVif N6W`52J LM.};42NW7TGb1cg6礔IyYQ}/6HW|5ơKd>ѶvifO#1Dk$J+Kf4Q< }"ӐH 8ޡ`ޑr<\hl#A4Ӂp^ TLrNz%oX3 ۊsx9bј5bԐwFQPX44pLc<<Q8`5Go B5s2`a>Ɂu%C_OGh癛;7 t-YWb:4d2t tZrLDV30ό ll:.D׭$-\b8jo~ po~{rί笮7{nճnh#Xk??}:~;Ն WLӄgr>|?bt"#o޼%ex?}".a/y]s{{*ONĘ\n9lVWquVKGV;^z?~GQ/3<'gΟv<ouQsxqdխpNixxq-ڧӞq\ m߳.8c/~eqV+n︿ ė?e8\_٬;Ϯ/gzxG^+%KV]@w1V+v1a e@k<Ϥٮ7ibv'T%SB$L0,Ѿ{#;ג2U*1RljF4Sa)Uv J#5Wk ~o7()ƙzKy&0%$.*ʼCt9`i(h@3a~Esv+!RƁ0WW+ac 4p{0L!0h=u^V%'t傮FT*~rؒ9ts]J^BihWWBPUUj8k.'mc4TjT%6q\#q*eqd&Vkrme "*Uv9tߡ0 yUq=hg!1NZI5cLC: cd˜|zkzv#e-Vɟ/#[`#LrJ"'DDʘq8SvՖ1dT\!:Њh+_<7"x3Z2<4"-V->TkbI#=q F5PPhlijB1ߒ.F )Z*J7%]IqF$C1]. ƴ2umG 'LXeHLywRfZx5'ZN%Ssms]cJxJd#gP18D֗3CEhlbWF;B[iKN ұ@A#,fT]/PBLV4ﱹ`[%D8gy?4J %(^"x\kII.]Mף"ʨƢ#j%n=f>s#8K>Gb*xߓ4Q;Ж,(t,`##ewobGVep l#{yw|* j9L9@t[0 @W+ǃD4Piw͚D!ȱ ]]ZTp>>%c`خz~di?>?9u8c7kWؐi ӅK \v'|9ֳqk->/1mt5)̼} [o!3Dnnny)'Zifssp?p|7+MQnOYR{o?c9gZ?g8QPb<xv)bxhP3s0nWawIopIܽew#jyzgw\]]s.4J\1O8YC&':r9O !v㑜%Vs}u#BTvS@y w7?^r:.893V~W*톾鸹-?/}|ЭV?>7x9#o^jCӶteIu U2Mۃu4M/ jA giб2_ 5ENj ] -*%Q4`'_$ v`=% }(6 mP)G1VWhqMGPADS"k-s&Q^&5hzrѨи5˴֒je{}G:}Dw=MKz*YYf1g:f-B^oim4!Ʉ@cƱ^oi'H 2yU9c29 f*X&FT9mڒ *gA64wT9JqIl%^|z¨Bm[TTqBY)gHLX=F ̓\vkXQh3M&?XK*#X~lNJtcѶ-8bە.?ի%8>X?8amC&DcjB T]ޣ"$d–kVE7RldJb@h bPƃդo'TQdTIR2LL)J` )Ȼ,)5JIIPAWtK*|Ц'L98֩JZwR$"R4m(GB Ь0ZctEb4<}O b]Qĺ\\KEi;jLLB] 9M = bj54$o힖C4 ޸0:`RACEsbw%,4X?Fj,tY` e8`h؏A^be0XI mЉ|E+< Rf W%Һxy+k Ӊ+ʯIDmfJXےDɕH$%fc[Ƨ~ӠŶ-aأB NfMGȎBk4Y *Y_+ABL-dz&9QjMg;MyBRNk||wL"n(Q S < K)γ2uU+Q iМSxVBxs`d[0S2.,ތR;fՖw4MЕ %TE"nxqS]j|DYr _7(4w^f<^j 3ř?i~y໿?.W_϶Wxxݷ۬98o#׮E-㞛PL#}2M3MQTgwX9Ğ~ճV|xǡYoWq-%^}?W欘'gr0|x+*<-ab?j{#)N@#=`1@a!1O =̣Vhoд󔤸 $L[Qր1|Tt JFv\BE;ab}&rr(i|[]Q@1~Af1Vyy2Ĩ (-|vc'$ d&,klc'՚b#@k<}q9>`LtCHEfe6l 9$r)J˥&/уۮE8N]HOlۆŢ08$V]ć[sf9#)U>ӁÞ %~7 ozͿYP_xyL2i. }|}wtTěo8Os[͆8L vgeLzKko1HRbZYo#qi\ oqϟ2y˗9nauOG)?>a '(t:Qƙvsv=J{8x-:Ls~w S'j|O1-ݎ1{Ib/s2Ot޲R͖Rhw'pg^zI &|=(g8H3( #sz>Rjd3jaS}XLr9OO;OG`կZVbBgUc,x^"3-ZA|(S27L!}G 4WW('Af(R' rBp7ʺNLq"f 'ZV mĀ|Lg6RL{u7~$,(lj"9nEUŋq:+ @ B o[3q$딅Ӯ49PW֊]xxµח,t2)=6b7*%YRV-pa| ^Q<,[UefQ$2q~.L\zBԘiAQG\<]_AӒ.k1M"/r)Sʈ*IPTQI('t&P%3BY"G 8b~J5'n#%+H9zSPPPѤRrQ Ǹn5s %djVU 1%,/Ŷ+ohߢ8UHL& SZA^ˑv}K&QjE-5:qaZŘ1r^"IKQ6b"D0;rlP%Γ$ #4 l.rsi[3)49 r!,op.(*8Qu&βMA+!`]e8>uAGr #[=Ǵ0 B^R݅Ҭ{r4xjh:i3@R#^I VMuˁԹuZJ Yp 5-I<%!.fu*YW)^YHSj$_s4P-5 %E| r wM{WW2V6L˲i9u",j"dY:JRP㴈"+itdf\Ko@%(Y,(WcnTk9:l%(IY(a*W- S2Y]Éx5dJƣ!(@K6Ĥ,AL.8>{S(vZdӲL?UQȡȿ72y."4["Y(T-4jH>XfYyG"E)۪:H]Yr|dFTv/qɾ[ 9\#׊81[DfMo*ʐPGr- B6R6ݠLfi{1T%ʦ)$R(-LZ(C̀x/1LE/D-f|4aDlhT27ރoh5G^P!$3+dnVU\?FazPUJJhm*9L5Pث~ZpºcD,lP%`\GJ,r;zeSI9^Bb9]C u ]aNM%HI2EoBUI(i`b@3iqL3B*Wm[60Ԑ 4%g0JoTLhrM %e!鶅"V*zkV\|'F<Ɇ5GeBˆG+T9.HߙvM*#9l㞢-:a=&UVp4l 8iO (q&r)L=௄e6"9L XUrh+RIӅy Wy•}ͼ{`ց2Hsu}_Ùj4Mhl7v;4KkqLݲjqnV7W`+w#Pj !Ta&6[)9z7oOÛϹeu4a4w;~Ͼo?ж?޽XoWt>ӷ 'aD[C1?|pүVqʲ[׼{R+oZ&yϫg/g/+J!?|>szM}E~f[gϞx+kN3?|p 'z2O:fY7YՆ޳]oyz%c3}s_ue5a tyƑf>|5o߼%]F~_?c^zw_jygo63TiMn c ^cgK_.~ӯEY9> 67OzK׶<|p9Q^Lrh6 xHSt XO K^6@ ({ҊK ZShFĂKCkMhIJY9G M\5f11̔haRT-sd}Fd2 [8\؞yPk M3ZyuiY_Ѭ:bHYa]zRgxZ)A++Bde !FBMGNRn%1joe"ghBZ纂gWLt4i֘a4SJt=JӸE(Y]+2cچ2M",#MKJme:;͓SzkZEi(aZM UEAF1MG"ꚆZCvA6bm8leh]kI_XKo[4y8JL"t6RJO씢8|#Q֢ sB1Ⱦĵ·]+89"'T1v0]@I-o=8gň8j i#E3Z0aF EA"fwyxScmƉT\5Љƺp:a1F ܊SY0\@,޷UC-;Ҕ|trg[,8U)7(vЯnM1\2"v(XAק)VOa@8xW0!VӵrH3]jvk5l+Jk8hj(hҭ:٬H%:&NNJ=zKU͢@o<4RJ1qH-}kVtͧ/Ϳ;`NdUS]c ܾ|xl{Ӊ?+6[~a}g_2'7-Mӳ]oӟȾ2+SUƶp !L3O,Lh$,\v5reFvu{[$'9{}0WtӇ{iGuxr>L[^xL gɫ7 G޽yzg?Z>]m#M#=-Vgӑc2p^+QcGDf *o Vv77T˅_MZ.HG/7emɜowL92ܾx < y\<2u\; r> yZ0\rX晾Q~{p=#́:pssCaC_R o޾fv{NoyW‹[NÕvˮo|؃RlێLaHV pe-Ui\4 jWA :/92"ea3{JV<31[weEbay X*ObIy&vw ]n5KʘTFh[7ER᧲LSS 4h[<@f+N[ņnlo{5H3z7"3N,Ƭ ˷v,a! 9Z,Ų"S[m"M+XJ׈9, 98RCmC8B17Y*+DtLul|QYVNh%)zGRWU`ߴ WlII&@ FAQZl1qu18Y'߉zRʴ|;R#ʁ_aȀrfŔ D!'l8;thL [ JKWb:i^ès.SU%f^-ݑlKbuLM-vXMeY jR]оxI@\}n}s+Ϙ˄jp(rQv1 {g2C+ws@NnCp0Nm*r`=hTӐeL_*^ . y%|pm0ya{㻿-ϗy×GLyd:>qu!CR ׁfôAȉnϗO)ĐNBI _frs=EkHɅ/~cb|5O5d2 w߼bLXӉ ;>m:0Oo^,+raG* Ao{eWXlce&l-n e$ w]*Åt i`0?ׁ{-8e>|6<Ƒ"q,py<>SCbG{ҼJeLi雖|P0#Á9n#ZMa鑻 ޾ቾ.)||#_} %&^i?pa/,s` 7IWT(9n\/+'y60N}JI"Q)q9qr>)1ny<>vqgj`r"Bw pbVPbkZ xHhiT᫪(PJrO1zK50a],:W2;|\%DUV1MsZXJs{Joq&,#F)jtDkMkmX1 g\;DtQ)l`u<*mbY KB`|8:t%,Li}<}9kxdgcho[wpSJf{ +߼3:0?yRp^dVsv'C1îk87?>p{sO'ڶȲ !2o޼afT̼+|QCon7<}Zjs?XF!L(h @rc9F큲dkFF9rL2oZTV H ! O I}ސ+:A1Ef4~'X2yfG7 baʅ~G7:.דdZa߳i;3 -`q#\$5-`$;-/M֒k7V@ZO#Ӣ-BZPxjԵٲ#17#(pr ˀ׆ )9 Ncйp>ڍad[iZhղ |V%m0!m0ډ&jK-3 ;ÅTwrY+UVJKOH.J u@Qe0`j$AT5:;-q!d0z1[&T!H#$h]E"[AE. Aι/9L؆5.gA[tPÝάŨx=)7+[iݢm^6 9ewZKL,DXڎZѿD Fi)Ii含@+/]df^@oÄAkqKs.*1Kwppĸ&*1rNɣ#UyG)qbdBHXQkeDL˲L",c/9C)BmCQU/ey-@I*LEy'ծmЄUdvK\g9jҚ\LE ewͺHbvbgڦ!LjvN.1PsoJ F;b@oѪC /MQPk,*";qu XKX%"&j*r6J0Ib_ʢUE F[)z3}Ӑ"` Ui"DNOr΄y{,P-ib@YV.&K JYVSr17WU ]cYx*Fr U ;"׉)k-CQS+1Mbǀ-*k[DG:Fτ 7).H\2궄eZZUj)9J3YjX'l,\4^gi-i[/cqVi"GXUX9-<јxs^QO .4ls|ݐk4-ߣEeX+F޹W->?RbBi39߰ mP]CZկ#ږ?J&X.O7#5\.#u`̂.1s9(' iZyb⺖4xeZopewrO<_`R8Nu?Co~ͷ?pww_K>9r|6t!L]x>=@z?OÅ2{E24MLJOB>7 DWݎ[t-e xgyxW|:]1kNÅ|嗿%_-ox [t yy/}i|W7?~aO~#۶Kxy55+H%(=]a|ibX/_sw4]~vH`fFn_,x7x~\EG'+߯vԆp]H9]i)'J,()HsRk6b_$(,B mVrshRqT%ϓ#${RHRM /rVUEӈԚ-yz"'GN xLNVxvEo+J7!ﶤ4 :SƮ4PJ&/8TQyq!U)D.Y 4tpgϴ/^R偨:^ 0䠛nKSqbv%-&L%e:(VJ6:J+o)uF]1Mh $tRm'%jj#cVK2ZԚ~pqmKc.QҒLf]cZ*)GP 6mW8 ~CBU q`jNPE~OuN;YUa ЗP Ji7Rq`0Zo;r͔IusVTnxޗ֚0O`~Zd VkuyT"+=$Tu]0Ƹ2UB.ߓlT߀.[9CNF4, 9yeIqtQ^ۓ 20E i[1ۂیߠ%ۑj*OziX$6,(kgHfjXLP8HJ,nRҌ^ָ"*>)ErBRx4uP[eQRF ,sP0$,ר(JSmwhBBA>Kd{rcKY]+ɟ*͒vRu-=e ̲6h)LkIϏNN zr,h[SXOm6$ո-}a}C2Zᤏ&K1+#J$J IڎbfQBqĚB%Ss%;(@B[HvP2R8 ,_K S$Ņ@Gw9z_ e_+JyNheq)C^0JI.k~v#%+2}C9^xnG"<]G)um`΄BfA!J]MףrELL gZj\p~J /Goc0JVZ6(З[ӡ_U4-4U!# RE\QnzHp%Q8NB:?O'fn˼  *,|q׼~S,%(^O7L۵ho_3^ݑ8iOi^f)R$^N'|$KZu,QZGRECulz}`:{zrRN~̇OaOS<~y7_0O#~xr߽z<ҽ'? 9 pcb5),sm{Zp#M _xk4 v{?=wG?g-W/qs|xd7^$=GKg\[Һt[=KēP.@8]H-pR)jex.)VYjL /{~K' Q'yns#";\Fno9no;{18H%`i%_/x>]Kytf_CA0ۃ ,۱,TEpkQZNFǧ{ɐVH 1y'(/Edwz疔mqSH)t$mezS'ijL-~l*)[HQ /&*%P2R!%qVa9mKm[j\RVx W͎b4q(khÊbԪ2,DhK/ɶhʅy0,}j|%k:Q\HȔ==)/ī`rXׂtmtJA W"20ƬyIŵ#}sgaDAV&\:ׁm髡$^4*e7NbR%5ɐgy\`2Uݞ UĨ~G mRƔN1JCPR2՞jQh_SG0Z@ֵc[ĴPZXi24D1r"k]c+BYli*$Ű|wA;r@-X9mѶRhӀ1PyA*Me݀6<\6ebU'AR*+x%Ƃ+lЌ%@4TcseZa AڮctaJ@fyV&B=Z+c+Y‚im))T1]0놤OMXi˥О4=9f(P2FL֬8!B (bѵ=FWce2K|?xMg޼`Lln3޿[ ݼf&<'_ٯY息߼/Ӹnq:GȊx%E$#yq'-R^J߲.8g 8O'oxk>}z~O~cOϰp?2,6d(y~v㺎phqxq0Tu h{r3L+ sd9/2RZZ#b$eᴌpq=͏!3}V<^Ϩ7<(\ )G²oR`s8/Mӵn<=p&z點_>(x~|[Gs%L38>\(Sw fG %g^8㉺$jI(0!OðRH8w$vxm)aNW/޲).BZ!L3b @PyĜ1UIz 8Q;A'.%Sed"&Іb-yx:OBh i9bBض#.{HJYvT(!͎4xf! ъXiq:I%SM#Jkǜe^zB~R^|ۑ$npe7;3yJ&_b+4\W9O۠K?e9 c0-) Լ`l"5Z"9e~Jt-*L^*Ԛס4)gr)mCHhFbfkX%Ҵ-&@hPdevC׊od*XP*yR3 U g]B UW#̊1$/)UBVo3s/N Ʈ(# h=-1'RX e\gQ427j|B|\hx21U4nĸ\fGE zLMX]MO^qq*A[KZ;jXzH[3O )Zگbq(P:@Y]I?TQBmK&= jӜF{5TiBzIqƣ\C2T**AUrZ=?8b XYۢ ȥ0>=6[ɡZOv)qV;PF(V%%J0J:u,zYunHݜ!KPZڎXӢ$n'4 iz(gJ$ V;BXc^:!Q)-"Pj%Dݠ[!WյB62`47Xi[ʼD{/aA**ΗRǐ3}v#2_h\/Tk\;M2 MNvT]u5/֓JY1R*톘UB,\ҊO6nRR԰*ARi8.rA]i&ݽeӑͻw nwڐ@& a 9NI"M9-74%,d^JYQ43EP9 (&X3۰\@CU%⧭Bv>gR X7-H=:ۉ}^!RagۢuzjV_TTO+P4ZxLOJM;Hq[xiov+9$’a3ő'޽{ <8]y5w^o>l<3ax| {\{Zײ2]Μ93h0HDMD@@H' !E Ѐ]U}ݶY]{~^XzT)w?z03'Za푚WWh83ob"d&cf>w<5qo-7o=<9Kbt)$6W͇w\]sE5O=Jkj9w4\|X3O/2{BM64p8%ǭlOrYMw?Pbbّsk-Z~ Sqzs o,jɛ7ohofs"AkgDg,U+OoZ߼4e4b#f?0P&L 7l{u8۰;yy})L rNa^I40#_/aǫO>EobZM(E޲r90q:iv'?i p^e$@" x)s3d ғ0 ZyZ͌xp: qAit@'Y4eٹ0Hdд+pD9(Ds$i)%@/PgqҭYI傔GaBrJQ11/'X~ĔsFKrxlo{tkzi5'B*X\h#M R`/c724+ǰ9tMCIΊ+Hח\lzO;.77b:޾@ ~`:M4Z)~:?"<{vw]m%o>lYݬYwk4MKM!inu<>Ű;Yxxcsa{\ ׷芢{̔6\9=?}BQs,Q 8Y)1_7"XՊtⓗ/Kw|qir"D˛VCBg,s8z<x8.7Xpl{" #)g$־c[>ssy%0)G_:#k=zwd[>3aƇB}˗% #9y:<ǭlr1Ȣ_q;w<Bˏ?YmnrٟCy./IȜFBM`J䜤.U6^ޤK$1'm9N9 12T՘9w*PbڥPoղ՟= :q{sMw/_fPBby;Drawcx~{/^=KsƲZ޾{7Ӟp*8H< 4xF uZ2#]/{jC0aT|_}BEm%&^.s"37/^">y' _}|,6kaϸ{Uisȥ+-m=vO^=Ik8T 6h/+bnZŒ˕%ݖ~bng[XVݞ`zsst?S<>>Qs3Rl./e ׷.[@۵,2<&|@Ʌ[I,M!2 'V )*%ݳ;ji<4%!RA!ZP`bYB.f:EHILDئic@e(*zנTf naLcbDt Kg 9 O_UJ>#XWEz\; TcpQЉhՆY]Ӟ-ni\KJ2ݰVpZސCs,LXӐJBLeƒX咢)M\\_ԜKXUmD(  U4=q0Z}K Sxw~m䌲^>#ĄtmLmIΒ?e%4g)I~ևB ߶UBEZa\w>KL%ިʸaB[#FZE`V0tNq~)(2A45䘨DFWa,Btdm~:\sO4ɊYk3^E1vy]C Qɑ\e" D1ɟDi:Rbt %l6g{u "PY/vlϴ"e;TĔis¶=%C,tDi tUTV~6`"034APbc3Ɗo$bPvM.ˡ"0R*Dj!S;5ؾ/X Q0(۝QsؒN3̳BK8Ogj&AKDEOeX/{xr=c\hp]Km<[b @Kh< qL)LZKƘDUh(8m75!dh?G rwg٥.2$Ҕjgn{LO;1G[AaWggy+[~?StPSZMzz"M\_(גAM rQ|䌲(H =] @ҫҋ%F {T(y@(۴yM҅Rp9&!Ǒ_uH=* y}=%nI8P)QlҤd ĜmIJI5HZ+K2>8\B\+1'VTqҚ5?EYtD n%qs55M Ͽ|o~9%u|sNS@-\z~4M4̈́yf?cz&Ye//6Á4o;qwa >pu \/ۿ;ڶaޝ8편cL([]/n|ӉzI02#_8vWKO\{yoZ:2FH48#1\,V 9Si<N#/oX^_=.؞Ņņxjjô?pqy#g9|7si!~߰z~K;A#ƉM^[h8U)O̪p~vaiC<|Sr-gixK/n}qZ=?z_/a~OTJS4NXJ#t3˶c8xv}M "rg\B/Mf\ D>.הXdN&q j5oSB+jQYC(S(JQtB%'4Xof"*/FǓdV`)i(: Z(|$Li,ZݨJ6<:֌{TNjՆU*!'- #[PB M/Pa 3:L,?뗌Ab4ZIZ)k8HG)bҟTIUC{LDIl!0ř/:JD'K HQоc>Ny+%UU ftbgڶ(59HGidSYtT% )™,2=4kj.̓YRG'|Vr OB`!#/{cm*^dJ[ɵ`d}#= iQh?k[[(%T&9pqVDz`&DMg**RdP!L3TvRTd%􎌡i9x"5{y2&vVՊyeK` 3m@a.45Eŗ-45rɑ/ec5ix(@bW/v v@q2gE( \Qg%uP1n@QPU]J74rapL\w2I0ƞOIGkXDWK "t[4үJ 9e64Q"duqmr #u1JKNMjڞqK [|#CI2mVT8JA;G4Og1 QRWJ؎fV? -kCYQFa|#$Pslhr` O,,{SJD m([OG8=x@k'q"Bu9U4%Ls'Ġ SŻUR%^ o }Y9Q ie"q|~q ) ,ڞi%EUHa06^L*c{DZ-`mh#smK($;,-^q${j#lUϿ:UQqBcuخƌ.isϸKjKU-=m Cd3)//?|iaϻ-IWVӬ~# vvOI ~Çja>_<˫%+޿{`3~7?sCg<{}G^dY9?ݿb̕ןbյl0G\]]r}~*$n>X.~T#v )e<Hݑ5Ñ([>{)zɻŋ[Y)Orڈ:fe͂#]eۡo{RrFд B*ݞ˫Knn=t<󳗯|Cw,W+V5e g}-X\1>gjj_V8~|`ss~Kf~!O7<טa?DkM|WyfF6%O,n.IxйjIX~_,$3 Jכ5ӑx<%kHǑj;7RxÏܾx/g9V!iBOJJRLYYla嵘f'͊8lEY0JEx[RxkABSVb5䢘byRrUy˜FLL`]i 4G"h` _KMA-iw y".\r)H̦*3iآj@mWՠ(%QhB^+Zn:mimPP_lo[2ZK*"3PZ]|I3sš\DK&_dds.J R0PhCEH%!"uLQd(={iS{.8N0g{+q2ڝ\b4jt(ڎZPLί7H9^q%9O 41@-(kPQE M 'EцmQ}/'J.htalCDӹ2'Y%]cѦ#%MH!CF3ł[~qM< hΎX\3(QZ)9 4 ( g#qܑco:H3E[Q& D r!y~l=O彩jC8pn{先h NsJAqBKQ;c<|70ڞOQ]/]PNr`6Ųh4N0̤z.|WjR(c;K-Tj8'aVfrrI[Gӎ-eA yd#cPƉ\NaB2iDxx=Yfq< Yگ^1G]{Zh#˿{xÏ7mqÛ{p t^KL_f;wދL0oy Ŋņܲ{ LÉ_}[W||z_ǧ;W|h*ͧ;9MGNWMcGlQljtGWGtN\5=O#vcP3VlK9p:n8>nY/\+RH ݖŊǧGI.La/voȥD>AObSΛ߼e8h39eq$΁޷X^]p8A+^\͚~&yW?4Rzvˋ%|^BY₏X.l6~ V?~Oa@*Ye(Fow%ߥ"+Ƣ㑼?-ZR)@)"d;+3Lڎf}!_k rMXC[Ӑ"6p"O %R;`wBtpeYVyDf;bkq&n"Nx㉵0O(r YLjZYdҒ4 iC 3ETɟZo S)U[;@r;vd(3UlJ$imz )c;zμyodRcEiVryR9MGقi/D%LΕ~'gdݨ!,#7[*5YiH&[< z.3kT}9%/CB4`nJ,υF;BrpF2% !>f >M Yb)}#hHVgaGn)E^b1%%Jnq><%Ɛ&HEbV9/frQv!!O8V'B[PE4KRWMB[)=-8l>+&)ã-꒜\"ޟ;Q4瀲8@TRD)MG$6ac,L#!Xl^iMC.3(+9%2?CHjV[+.՟DP,ep1O#V J[+dY8#*2PRA&Up+eS% Pr #]RDM?M, !rh=j1Mg5)L( YiW9ҴDT\Nӌ=_5h#G}k_\n,<4~R061nIIYصbUXYE 1i倭z{ǜI{5%'Z;@"+R„4XyTz\G'?4$5ISV; y8R8>tbuq͜M%灐 &VWqx'OX(ӄrݬZ‭܁JĔQb %I.)&6wAuKȃZJ?~7v!OQՂ[f~d<>8| ݢ{֋%4q:h[\"rh)IQIo-??x~`YZ,y4OYvx>TE͑ϿFr"LJaduy[=D=W,WB&FhgCa6^1Ҭz-#jI(~zCqx<O 8iP]Kf1 7:<, aUsF,΢#e(LiZr 4 q"gp:Hj |GI㑦HZ-h "c;Rt^V"Xz*0$RZ$m%}LOt<8[e̊B!iE Ibޠ+4 (hV4f gMT՚B*NJͬ/o1MʁQTIsU2AJ99莧=y +*{+d2UqZ.NNN0jFeQsb)Nw-DVRF]2#SvZH ͐LT<ɪځx'y0kSI"B4u()SgJY PkX RVcAiwU{:_xJ2Ziyƚ|6 YIOO*I#PR ] FQ~8 <6$gH ڀuq"*&/̜SچnqqKRlq#EU%#{i"LPZ*}P@& eZm}.Ǧ83MDbPZ0D\b!Dume(MnPJ1iAsgP< pXB穢\~5VarҡD :E[C MKV(J(k[T4kÉDAgj&dkBřaDDrXoƊZ}믩5%f8SBi-iaRm<ȃ@bZbeT+q,iMyJ9?X "00zorѠ2BBh%MJ|ѡMFBYjsZ٦ *w]bB{7э y)"I eś ZƑk)`aG𕔒Dǹfc:iLAWJ1%:҄,f!X 8.q'nn/xa˟? >|MmGR۟s:0ߓK=Ppb\:Q K<mZŔadzgN,Ӊ= %>DIiu׬nwϓUN0`bKLyR`A 30@B(pU'NZ_ QZ{ua:=2mx:\ 6/ve`|~ K/[:v<<>WoK>ìyfW%|]|#R__q=_~- >b%v8'nykK }ZȺp÷_>S5] ff'^x^"Q~Wl/L)ū/)8?Tx\+W-o;.v>s˟}1F~/9q kqigș-vsN<>>7WD0|0ŋg\{m- D: Mϫ/֡8\6U?ETjEu>>_Uˊ#O~%|6?,GG`Gp4AEZQSn!"qBDt: JWi\#BUxۂhed"v|o0(~PmGD؆A7挽SY`ڎ24ke.XߒUJJPBM K1`}G^S(}/yQkpkq%Ԝ)J%+92S.gI!.b5eN uI&D%CoXO%6/!ݤ\\]ဩgpz[9OfTTpދ=̂RE.?ƫJQDXsaYDh|#1 xLs{yі+)LT*g "Zy$S@.^RtΒ%Nb׬T y:]6KJQb_&nCPơ֌6Z@Vnw$=Rڢ!PPnU ~м"_Il2\Λd-z.N[(BR&ږ".A&V/UkAka#h#. c iQU5I|Јafɡi-Z)`lU$yb~zOwZJA{|syGW8H+QJD Yx9wgjʠTZ;ꏎ :m(Ӵ<=aZ0:1IAWO@JJ:JIJ3/|R-hEjJ/kzb<Д'. QBߊq˽7ayX2<J[tmUOV[ƣ"3 qےD_Te^.a(t*oY\ԳtTlG IQ.VB htdc[!a5(XY5ubG+ĭu-Je[4Pˑ}\|@1`h+"haN=JUm{eN5Ԙ(N1Kn4]йկ_:ӮΗb^FށiBaTn:nW믨 N)LU,(et(ˉj[t$Ug{=ra57d$nnwRe>bt%{pd).!2 GQ0Ѯ"3JZ`Zf7-T5+;j0 yyƬ:4-mרEԘ#4k:tq uu]odfJ^;o,bJ K F iYpݳgD-R"9)r.'5԰VIEw+wQZrm'`R TmU%[r$Ln f֚dt)hf-:tϾ޼ w(A5I  ӿ{k/FPxb[4}Oe ,%$^|1(7a_ W\>9qRbFVo^qvMuW;jq~TiqL_pww4r<Xu,'Upawܿĸl7É~fgN(*_?roN3-k]Y{%cח Ko~Q; "^0?DQF˟6G^xE_93h>1`6~sZvAZ#y3qN'6᧿?$44p*ÛoJS/f8<>pŸJCA Ұ~4ЬhV=V)q5+\ZdЍZfb*BmPsrfޑU9,IW=N+jxO4m 9%Tk ߃.xON4ay:$"oۆ9` u7CVxEzb8ڶe dv7Wyxt9_i@ v\|<%|{jMJECZW il_ad9\h a,\"T!Ynu4$%O>&{qۮxGY/nnG e\3N΃՚^p X-f/^v%.v|_gFD}ϟ\=?rL˂6 z wG@"/g oo鬧:C0Scg_<U˒3?'-\_]jYx<'A)>|i=ohw[Պ:E^KVq$%4ī/߼iݷex:ƶ !Pa04|>ZӑNYnIef{I5L%*!)DYF[jR tݚ2Q y<pTBJB$,z̈ƴ;b & MQiq^&;֑u[p>0icӹDlC X_09R&{|bDVX|X@RޢJJs="DZȪ$"c*(+ gژFg>GLRUY$nA!",K+ WԚLb+tlMD,6x(! \9wFA- W+J@k9s 8S6 8ͳalC=ysQxO<Ԧq(5lC5B.o4 JUq$G5k6 5] l7$,c:2fJTT qALɉ57ӄrIP}Q#k ,5UL(Y5a5 YѮJm{RUyB.V0M7-`\KDI>z~Q қU3'Z)mi\۔[QP7SˮքZ!&hrJRv4 ݉ŷڴ`OUNZo== ȆѮb 4C T'%-g& WPsd[AqZ!ztʤFK%Qd32$+3Gk9V^S&%!tUU b`TeO8I7|-ǁjR#F7Ui:heZJ!$|˄]Vb :#bdL>#|C9( x1N$Rל;+?NdX+ԅZotkA'&)D6;RIi,b'L TF%ebBA&|[ߞr٨gdPJ/p+-q<┢4 J\Ur f6 zAY(I~MOz l͇{ F)0Vsm<2)b)mCƯ Ks[#R%u-5Re. e?"\]~/;N3Kb.3;rIE.g;QF ȴچ喇b7vP*!,4|HG#XmeӖ qL!`D[/ivt:Ҵ5RdO3Eɦr|z8 ilEe|~Hq(GH- i b",Ҙ% f-19 #f|wEIq) &JߒkYZ(JoPf93ݕweBI zH~1 [Sa%Ssji T]q<$ʊFR(9ʄ4Bq<to]"VYrM&fZkI% &j\Hnr MӢk%9 BIN$"{3;jYN/8,Z PV 8 a8z-6DbNP9QK@e"j\ftBmҥ JyxY6)1OGLے(b#>v,+iH䈪Z5s Z;@T(?'\ F: (0Q!_R=nnpZÁkT\o[~?|]oxw~v Z߱]_‹~\fZs1 WOaOѯ9>I˒x-43xN6˗ #f\(\vV< g/ϧ=ůk2t\faGÑ_O xtvj=W9?lx8˳'H]$w|*U2KV|{..zqO9FQ|RCãHyB{\\]^T%Ky||dݐRbZK>q:lq3ÑnճZv#yX.Ĕ!'r)mK]F!>誘 _hĒ(ˉ`,ή?u+Ngm  YݮIjPmіeʤYbmpMCQv%P@;)'4THQrڣez|w)00N4B۲ '՚lXbiO =96=0N!1L~bQ^ *w0\ ^ ye[,[و-MRuB 瑬`{E3Z[ƻw\ N3GTheW"er7hA?I޵(AL59T539C G2R@klRJ$Č2g ;<ʅ*u,Hk8/1+kSFU !̔gyp^Nɘ,$I-(-nㄈC( \,YU ƯN<}  DR(-4OS`{B{Ih4vCLg TLilJBMt#'=8OQghLjе+ʡW>ӘH*OT~*jhJ\3mQH œãsPJf^3}F^wk5(\LD)!"9/8Y}nCଣefCЬZjZH0?Rr!1B154JKihSE7-Eiܙ0GTm1M]]8B)RKnZm*8>?AXףDRs<@U4V3޷{ Ed{Vc4XklДVaR8IO[2 ]%0N㭗c,+LxP^޵ҴXŌ)7JlH*cR`iop'B)e,5h:QtxMNm­0!G'J>~iW,FEI q ү${IH۷FL7U+$R0Ký^E.!@@ ggTIiFqf֐K oh'>$Y.&dH afZYT^s{4@ ۞ Ra/q1gWɸƑ.I)S;p!\-q1E+TA4]O:,׮[q,W9RGS LhKV(;t|?{/I\GSPQ"L*Ai_c G./\\B_O#Oڰ̙_XL~zIؐ@vgV|/ݻ;Lܼᇏl7ܾD\o_p'oIݫ 1TFv2f/aZ-/y=mпp$&B4hgyw\5›+xb?ر q\\?gI\+ ^pֲ /=4à27 Ҽ0Wwߓ3#g9-3W/^x?ໞi]G׶#KD }苢٬߱юH'XY깹Q4)B՛7<=KdL<^={~N<YeW|?pX+gB̕gϟN&ߦiv8PLB+M8SJԭ0' {[n=tkXGR55乒&ET@;l)8fR ƊkySY @(/Zd4h#dTEP zA[i<4ӭTmiA{Cǵ-<\sLR#~uZvke;ƐC8Ǹ[a <;'n+cmܬħ,um OglѮfe0b\#vz1ˈ6gpxh7꼠h-#SV VJ^"ܺ1RChE&TM0}C.yN#8tTZogS$krϚ 9$ș"%Lf:'1ځj qO1"B4?Qo+[i=ݍ5_pȨ$32KI9b' j5C RVBdf1mY-{ 0/ӷn1}=~~w̺?1N ca֤<~ےÔi3jiMt|HljqJ,2޶|?|(ݼ͚Gz`f~f'}0 l6vQί󌧁,Nǁ,%q<w4c8i0ϲ8M77ڎ1Mwq#՚> >9Dr_oC'_3i9/ݗ_q L !5hCX9W )@*jEvrtZ8Oֱ ?O L{.I;:LԼacd mr J)y­qMߒRf 2wh84BդD&Y5e,\0y},M5a&hJt4 bW%[P?;IJLR@io” v H%,giG-aP MIXmGZyΟga>k8?b݊D fb8I*VSDYٙ)Q(#V$Q rȏӐ%("_ZiPrmheZY!YDyb;C`Ӷ-*4Ä-sN_} ?|$5")mږi)ȧiz~5ۗ7oy5O %~W_p{s{ھ4piKJ-){LJOT9~`;M3m۲UɰHXl#iXk8N'\l<߁Vuӈ0q̻WBg,»wx|xF⚩PTN֣J&Lo(RZI&B\(ˌ]dxO36`!Fz(- AZ`YdcoÈ6 @%QжR6GASvc4:H/ö0d0oX4AC) q?`+L([eZb))ڕ'4e =mySq& RZ_Z^W:UeZ&xP J$3*e.tǪJLNyD}a0Ki59j)xew; )1(lÈo: #V 8Gw\Tج6L91155xg?޲_f< a\n !pq{ ./}8n؟״gp牶B˙v˰GSs)vwGBW8<X[Yozڞe1"4bOt^^r}~0@_uTg_a7k~KtIڗ#6=w/#Îo{3a|=Ui?bd1>/ )<ky!pdZ ]pȻWq移u#iŋ<>>ba{}i|/c?23͖LJe^ 4C7B ZE YM'I`tMNսƵ jlRi%uV+JJ`4ftXcq*5BU(qm1䮬âQl5޵{"^Q 4xGHjk:RJx1֑r}Δy!}&Lλ3tc\G$BL3ua-mrmf]Suۑ S4זvisI1/WHyⒶkz~^K0E ]cI 92g̫8 x *E^ܶLǃ>{K[k{\4TyzJNxΚi, c,2cƽedüDrͨyf<>gt7/ {!.j JU uέ@*vEL9KZ")K6+V8φ݉/=/߰!ޟy[E^{ J?}c³i.y:P5c-),s%H{}IJoB8D㌢s9 kb< ̫w?|,7KZcy=pۮXB~2ܼz?K^xA%@X"*K,9Qm5R\6{N#KIKn3psG6hRȬ7kQY?|_cZ3Ն ~`,7ߒ3n"}i8qq>vճly5 vl7rb{n/ږ{|ț[귿Ïuvjb&Ȳ,t.엑M͙8aH.??K?E0h,t4,%UR3Ⱥ_Q=i/_/[2`|T:Gb=4[Ji7vYŢkrʲϜl2JBȉ~s\PCbfN"@p "Ta<[ 9'"8(JU0V.j)42%)m(Y,ayM6%Wf"5_TwLjE\2jމ-4 }Njp]kVF{FwWl\JϥVd T ""g{F]-EfOa[Mae oY\4R Pœx^rZD 4@  䚑T-E:X).Er9,g;)"¶G5)z14LGRa8^QRv˫6)q o 2PN^S`:Zh=ei[S)˦,(M.!'[)mqF Άs y{v$lYFgT):C pB,En8Pk<أa:0X!=Մ# PᴦhH=yȈVi *њ9x^T vdE0닗>Af@C6+VXJk;r؋8%¸,Xr<4+oE8Ye{W[ rmˤ|F+ߠL9S"c4%Guᴧ9A|FkQmq%')Q2Igh24LE5K(o橅8ΐa k6!Ft<7gJQinj3VIZv3BFj[PQK Mϐ-pkhy (e FJ:(]jFɶmHeꆦ߰Pe"I\A{BD2q|V)Hgw5[a`Y, Xo.QUa{)ۼo0N0i6+O߳;M{V_Ow\n7$Uyxz73{6}G,s}a~vCM~O@yqbf\jW=aXؼ72ag0<<=9,Ye8JU7,-ܼǿwWl/6hپ|+g~$ԑon%8 DPg:q?W- LJ4j÷ߣhOy=0/7y4,d+i ~ !uK#׿xǰq˗/l/Dk+MD|<[Y+4 @ya=?5Az2tmņ8/o{d9n7<tʰ%CX450 6knnndݲx5WWWoyXYRx<_=Skݻw=H4'>MeOo!& qt"J }\LRCL%E2;g%+J+&gV@`>nn~AV9QKaWT1MǼ0EBT` 2jMN6ZXQt"%rGi52JIՈ(UDQT1FҌ tXeDQRuRд0/,$`bG1o%e3%L?LѬ4,ndY;q+)"33rBX/.*[cpݖ5JHhMNJsҮߡ4 8O'P5: aD9)^mFHfo/`(<1ksʁ")Z6gVHj(dJcr¶+r;ڐi-fUT*I^X|qbuZGId(3,5V4,7TP1$!(E* e8=34T1s[cJyLx Hwa& |c>%1OmxlNY6-'V]7oo -7Rμ~k5,W_}t?w$5%+;^޼ OT\oQp)Gl6v;ea ϕ9p8O\"Z|W[bNhDTA;K 2ˊ&W Xmhvc[)7 Y2iG8ns-\VSsƷ;!&)χryЊRJ9hQH4<TcP9CQmS$Z[N+HVɋ\:3Y,cIQrho`R )%CL0 4m4cpiW(L. -`EB))*2m 5-'oYdr(& ibߡ-5J5KA6Y׵b6mhԂ-*,lCNKDξz2c"@$QHcg`o 眺͹YT@Z bDr$s=t"H`Xg=˼Jq BdZ*WU T):'԰U~X-[KD jߡM".Gjejk5 h`S8^ A.g'3zi@Wx影D2m'(12kHhSdd 4 qPIJK8N#sjpa3mfĖm-qYh BE*$TWґ8opӸLRdJ߯0MGPt;ORfè /\ӢRͅ$hrYhqA)aB/й@p=Fo'bJWZAeDEr|o|c}Wf-҇VmG-4o_޿qF%)ß7?K]ߴ[BU;ͯKX&i`72HÙx|:_}2Mo~-W89?1Okz>7,%P(Tj=՚iQ_ݐKM O~/I6.MkؼЯ{1?n^Z1\neauyw)v|b{u<Պ~yd&N@Eڏk~&NVx5OU+I^!W+6 y eok.6LWlVkw ۗלN'p\2/Y."W1Ço/8N_~ÁyQ|l) iV=d19N ii:HP~9Rt+a`YJuooD9Gn^PiږvGV.VOOO#O1tq3{% fe>ދ9BGJT 7W2!ZCJ&L(tI OeLN:2' lw=ۘK/Ŷ4ZU)ޭ5H XB;'Tk@6IzM L:%Yue0|!Qdg9Vt|$z}#q^~uSfQvTC‚u )f8LCk if&~+}3?|I-N(T%s;5r:4گ5Q>GJ)J(#LД*[ 5*{{kpFRh8e;ϥo): y|fWdD~2qH ;ǩٚފIDo$#ܮѮ'LR% c3M*+thp ЮH\A)+t9WIEKE1ajE^4SSZPK¸YZ T0ޟ#eG|a$n\p(K) > |$%|C3Vi2B'T6d6!,qVca71ZqCvGPJ\wt"*JIbLYr( U G4+LypFC:R\dT:L*!]ˀqkEj-q^謃ư,iB"t4qZ.:ڶu|ݎg ÁW]swf:Gް\?/4~ oK5:nٟ1-v}bEș+KzsŇox+-]qr ;>~=-4q6&>SnZ3g6%ZÎ5%&<}ʩDR7ᆪEM/>psrp_}>~xfb^n| g7O=瑋n8ڢۆn 9g=]Œ/"5^a/(eiCXV<"<9!DXD&Rn 2'IDPbDLTRLZLst!)c)d"UwT|ty6 {ߒ)%uCqR3A/]#K*)ҤܐvͥSƙYi5S hx !$PHy 53'9DXA*eIp:Ȕ.<)MrФwkr8I!4B Q$Jh(9K|@C9#%$nZ9\ǜh%bWJ,$'\v(w8cU20CB̑`)Efs'W9\H!|"V1f%`?S!D,(DH#9 Z)V0]l XQ$QONEf 'DxB7 Q7aBA~oq$+G/Ypgt+W#u&qd}y#<&!9+St,m.PGWM.DD猱DJ%䀞U3(])8AF_h+(c~TD{1J] !IkyBΕ  M4H (履D?$yX',.2*3Gt{I=~DYO ;Nz)#@I'uYyMr::! ޶D* zt"S7<|jrHd-A:9R捣Ѳ2NK"9:VgL8RRPF>/)1O0G̔~uAɆ:=@rv[\o] 4f} x[D%Ex 3̟O4`\m_Iu2f\cOk+{RP()IQ.H)F궕x̨qfPRjA^kM$=8=ါ'5"w~)e 9h u($>WDM4-ˉ25(JK>'N2i/E")rz⻖1*Z%DѾ8)1-:T*r{"k2>~P1TFrѮe15 ;6=*wh`|a}і*D\F\m(V :el8EPb 82:VI0ES[Al7=~ّiz.vioZⰗO Ei͟')'E ÈWƁ"YqFSbdeϐG6yvN:/1s&~G}+1VM_/!Y^T :~. P#]}Oar!E^<{·wi۞]׳ܬ9v;+;{!9aGeŪ]]a_ =9Œq{zP>ac:|͆~b?/M9ӎ5^. oc4ωb/6o.V (eX@Yt8BR:)w!7+t0ɺbqE1/)iȥD@LK{ᜧvB B(肎⚞rd]QKжKkI5 ɧ*Vq74k'+\"Q3q}+ꐄd;a=[t.Lǁ0XlbA HI T3xD r⽰8NL ]329'r k}O'41N#޵,*c4։\{§8g=_Bxj֑#vTbLԢ'i1`KQKA$ޓ簿x4\jQx!yh(=EWl׊#DukH9e D)f6 gD4жŵ=geİZx. r9>W,lԌ^o0@N81kV͖6V^y9R6Ê|tkXD mtQF]n" ShIC!GT!Ѷ 1+7V pXS[t J80ɪꚌćLຎ8L"sk;)Wk4`XEIuE2ӵ:̨aC7q1_ StQ`8* uT3Ñn:dzjbPI!^r-U>OB3m6K8i%H]x:}j;+)ѹI%afpD.uR/]/"1[Yl0حC8bԌ) aU"=5(-6tܓO'΃tp OF9RPXk$bW&!ʝUkry7FJ!nBYJIU5B=q<qQxUI'M M}VTJ * <03.:`<],߾' 'ͥLkEkO4FbQ.vS]QMFNXP+t2Pc['(@ֵp㗐'_.OV>s@9 R-(gɺH@8ѵĘS"[s@Ht Bv )ynG9$1xr"F{O&Y-I"RlK\/uU3q)1K sP1QEeP-H8gQ.]^POLU5,7Y?oqY\;y{eٗ_B߾)Ϟ=qKzb ,~x4e(Prsø=0,nV4 :/ GYB e9q|r)} _})qG6'ݑƳg|Vp>Qќ;N#˞iQb{-6Rg9#M1L)VkRLL@9qnyS6wl^FrΤ)j)rZr]Vd1u=S 9OJQ.?9&ʷƐJi{p:kWb5SJXU 8"9i[v+I9w8ݣT%)ǹCts@&ͪ i4bݒF[a0CrN-"KӑX301ݒ5%582 G2EUjM\qmK**R8ϥcE)xE phKaI[rtF$9y:{8iv$Z~P9.S=s YJlbM-reYpyj$1mSˆIo(!,L1,/!ЏͳO/m2]T/_.\70nhyMm;LGQNtNt "p诟ͤ9由FS"ozhF1S;H74}MGޑr1? BeTKORYxnTH/'i:KBӈZ;!qY$1jwKJhx\" -1d-XkGrKG'arsGKZqYy8IP[HMaLR5q( f!lʉ|.irxcն0Zrrx/bRR*VPΦqD҄2ҒXT#EpepBJ|Whn:I$YtѾ`FDՠr 65745:EkI}Ky@QV Q1:Ek=Jp JID $&m nt:BȅǚVĚYa!d̋AihFaTEE@/tm׌|>;&UiV-aiJ:cYϙ0U.)q:p "*iB Op1ZG͢[JBp׷O{z軎1J8~1n(qܝjgoh-MsՙwG͂W_]%WhP,rp(#7O_pysnbEəe[޽4W\\\g_}?@,ƉzNGutvǧOs89x IqGc0i>NXQ&#ŊW/_n3,%;=ToX`JqΑ'OQP4sN~O #x%whxx/>gx BN<><٫4mvKF/ݿX_]r~ܡ ~G?S~o!ućQM Ml3ϴM%}-}v͘Pb %r?!ĉ|1LSDs-9dx OgmO5 (S%P:'YA ]U%RR䀤ŒX,VW-jƑm5+J΂Pr~(ƠUKTVXd);@bM¸ kUlnETxw }/e UTZwLI/| kRed1PLN%Qp~3U\D{RlZb6Ɖf Oq\$,pyLܣ|嗯ymj淤-։he?{{zsxy ?A͆a_Lby %00 Ŋ8}|~slqKyVY/xx|ןGӈMBtsb=X =Fi%淬%ICm?R!D!,ueSX19rhkX4JR${ j2=niVy,k>fny|xO?vX_|~+s[=>kEχ\@"[/)]ݚvqɴ#3-1JJCA95:b ŚT[r^y0(qMGrddj2 #W"1ݚwd]$5-J4Z(B9Ӯ.]K8t[ַTSHӈ*a(Z&$Ŋi  kV1m{LZC)tDĜpc ,/`'O֖JTy|gsu)ѯ(qR'݂Tblz8cċIYf¶w3pCa('9ۆ_lM+r[LjbYDW s!_ڈX]g*Z1@׀^zy7[Jc" pΌH,5'0 Ԍ *5%JyKH_KMOVhRpg~FM)<`fAIA6Q89{|3*n-mjPhi81gf.ZfovH.ȵJV9%xvhc9H|K.j8ҷ CIZ$I@GRח8])q+bTBdpg#k54y8HܐA^@$B*([8=|`91gTa}U\۱G% w+BxhP i:v;?{X`5φ@5Y1 #$ UYmP50Mgkк HE6T! lef|x˥|FKi%zcyVB;18YJS<%[5Zb3TK: "dH9JN92T3b%pRJ4wMG\ a55'ij;&?Cc\β<ʐ@k\jFgo8?9pk Q!l Yc@__3uh)FLNJBB1tZ e+~f*1`Q2A{5v0EX-5UJ̪#t]yPӎFHJGȖZRN=$l&m6'6tl k_$kǻ5͟,?)Jm.0X%T&m!Fw&ËGk\ْ۠8{Cc+]ĺ""H_RĀ/d0k+'18אri#N QmOE6d܂xLo<S?_p7/?a:X=TC8v/9ͯ<|x]1]}naT\0#M۲ǏR6<} r)nO~5pq]7zvMYۿyiw6'ϟpya97gK^97ͻ|է\^||/]edzKh]Xoiڞi 1:$`OTfM8Χ#/8iᰣgO=g?FWEUN77ً߽(gd}IeәO,7ki"ȓ'WGuD8x !ۆoc @4[v<\Zy ZW**7W{!z4ˋ>ٳ<,ێ*ψ<4ۿ[n.ojzxx/0ODn=v㇏l\~8=rʁ&V|{v CoX<}%p4{44{q8aliL_@)L9s&F^&gFUY%j к0!ob 'KH+eTd|أ"k1vKN_R f!lj*)O3t8&OO 6Cm * zkTa[*9\:Ijil2l S4 Jqh*QZ :'2tpS*k6x_mbaP''lRj_L 1bjAi3KU$.31=1T%9UrN٠=ʟF1=+-Zޑc(T"SHxm`~Sλ3DNbPKVnx~Oo+޾j N3_>ez8m MW+qǗ/`u-k|ÎpZ|~+t铧<><ㄵZk,zpQiqN4h,ڎ\lXi2t( m:͚lJ)4a8.J>gWa:yyF|8[Ϊvixyt_52m)Rxqޓ!H!?|mϧgz?a~kN5jW1O]bF.y홦W=DiZ|'! <=0}e=ѷ a7tzfw8=Y]￧_mxH~Z[Zgz۟돼y{W?wθ|Cc,9ߐˉ-/oW'~_sfj֬ڞO7-#}-7o2 84q)bdGmG'rAGo_R_n{VQqg[Tx˟|+dos>HDѴ= 4Tim#CF[Z02RAa$QzÑ쪧Ֆ_1϶Kq}uEP{֭P|QB`4_N 4O|G5j{^{15L5#]rʑa!v-=a?W_p/3(b.QJJ",+V5/%1Z(Pr)5h}$S%/q<p`ke2M&51h#!MCQ45rdkеƑjt0τ-tT6dPƄk*)0+)'nE=Fb:[Em)&Jf;rL5-ݜC=: }y´_J:6ئ2)T (*ވe[Q&V֠qaC6-UJdҴ'yՊŔB,oJUv+wk,* d[jRnF1Gbҡ)CL2k%$m 1+RiuNc%2 ATxJ䮡b1hWI!*j].a떪@8rVXE|7!W(۞a)̧Gr ̓BјN6t&nMLq8Js$(nҐĜRHԴt$J|[ZntV0NcrI*IRFL1 {k`"f"S0H46O}03rsR]$Jg!LM 8TeZr`Q%/5QdJDb]CTk Z\P3Ɓ{! YV%^V RF+u"@ֆZ zlb` s=؆pip(Ñp|`/pabT+}jQiTy3o[ ח/x|%Le>\o؟YH?ޓsC l'p7B\ֿ\-Ʀa8}r;5w̥2YYo MKuZ->VBe2FJkrCI$EV8Yi!(i)I.r 7Ԝ DK1rUŭ4hG4 1"eBiN"&ى)Hzj0V粅yzM\8%%x|鼔hqT?"_[ &6bƢLLӡt!QκA{<'PE%. ߯q^" JtmvF`JǒR=s8Ԙp*M1n5T%8V(XoSߍglkz"JIP zQH߫(i߯SyaQ.:Q oTW4%tD ]-Y'QHx:QI*š\ra.e %)F2h;ԜbMPAhvZb :P3AJ,D#f2geԮPj~KU^p՞9X`)ͨRLG&PR"P~9ٚ+j8%4}Ln4JND*'LUST&֊a=.xj2%!-"Jb>-5 ^݊Bq1fwI'L0k2T`r AE^ChSX gT ( ʼDt xG6U+GR3xTfDHL1F[Ԕ{mistې ߮ vƒvV%-vEӴ!Hif5Á0mi^=jTiۆ8Lfօ(y8Ä=;VCY] s747M+Dxw) Yiu`LUcy<#V»w޾}3+mN'͊_gLW+/.n8-96WO;Yq{<!e!l J9t đw_4i|UNjל'8\8=W__٬z}󆏟x?v?|xzGc"9{O&D14%ݞՖϟam[Á*| !3[=߾aSSw-ݞ7/#q˗ض!F޼sxuv[>wT3ʛѵ-<3#c4mhXU|:ҹek8 ۾-:g[޼ m+w~qF=cN0Uaʙo<|b9px5[uI^\m go^f|lKLine ÿgiR9ʹ n%SYẹ[Kxo0gxZOZtK*RҪhG{tmdͪ:-NҤTPUj5ʻ/o_ɛ-՚%O\Ӟ\z=70n}o:6kn;-2rjӎYC WWTyxiZ5iNW|ͧOQxů8q~C4-=^fS`.3_a7EBi%$^N;3 a&9t]x\bV^s\{ϧOf,鉶i~48R|l\ÁD~+y>XebgGțxvO\2kZxuHg=xacq3F1N~wCpLdy]aZteaFi\__#O0%UwRq&D ,tCoQRYbn. i$FDu)mZq=VWYHOqL=j!Lc|n^MvHKL# y@؆ ;\&YD-ɤVID4M:rʌ1JU_e,](鄸F&+[*zHDAk<ڮU,Tv8ia[:'c|~,Nk~M5 )Zba]G r&,bZ0 _Di(< glҚtIM%=Eg\ZU /Z^9h 8MGj.c5d\T˜^zTL,B8%01Us\+ȶ$S]Jҿ %RRL݋s,B;J)1.V+w4[B1(r8lf$6d'cg仵F,LJ3FlN/Q&T٦E)pVZ&2I^~#w;trʤ AI fuڮDL3F7v҄ɚu=) NDBQ2)xLaA)iiGe4+$eU(_XS芪 Y^9|2Zix5⦰21cPRFk=(*q$ U5eQ=\)f(*9&AM^@ %'|$O30QF4M}JXeˈq*?k2hj#F!iGx F8'~-i*PbJ!ę+`ߋ -AxDLee6vLqQbA+ 2."H4v`c"WJ)J2dȲ0Z R2qHuaN!3=媇)ỆDJYhu h=SSW1OvLZ*Xl13*2xwtϙkeН特6z%gRYoV_{ipÛ__8>yyupĦ?~4ÑwoswOw'9l[41N_xwKI0:ou7٭*0~CEq-o|qu7/[qog/-n-\3< 6QO~ݧ{(l˛޳xS֌ͅ=x @ {LHMay3"ċ|]*v>37ֲl|_r3;_AH{VkN#Rs$%RĜprH1Qj]zԖ0jZ<><ȳTj*lkLW cDkV[!_uZ1G-J8]Ԙd#H0Gx@%˪ B 2I7bֵADU'k)F#s4%tJMjQYX͆Je#*l(Eiй7ɣt6o:thO&z/]0*qOJnhNJe>ʃܯYȠ"ElD͉R#zoVA9erG1^Ab]KNU>jyO+r\ 9kK9<‰p`{ynɧ J$}Kڥ-7(-q5VK$+{X(cBhPJ&f(E ;(8/y9 *gЎZWS*tK]"j:CPМ8'XB4ڐrAk0Q) 1ge HIo *?E%kp;M@ H!HTuE點\47Vٜx|RU0:w y>]C*H7HIh|ӓhiv_s8aH$#u1xi7=OOrWxk〿蘆8$Sf2:SuFc]%e˛/_2nUn޳M<c`ƛO=\qq&'>=yy}b]4OQ8>NnxF;iizf}eyqiw gC 3~sFjML%?O-o|i^~~Ƕ9/W|{08˿wo1r!VkF~Zxs%y4ltXce6??r֯y #7n?aW[^|㑒3WgT/|OhۖW/9<>3뵔ۦ4qfݐc[y ?~iXV#Z\@柒XF}\o,!M)gLJk4NT-y_Pxc: 4̉9ɇ]\Ҭ{R ;\؜RZĻeΔi6[)-kZoi5V)֊DB1=')Y1fCҙ[Z?lh߂.UcG8hg%k[ Tt_BxJ.W"S}O4iZ.:)*yk,VCӮd騵D/ib3EKɖB24MK,Q`%V%:)Z_%#0e%j="Yz Va! V,lZUlٴ[nGw3*8c1 ɨ;ʈ6W#욲Los8Jʡ9bVU5H@ -C)Ƶm 4N"ozJPJEҭYNY>ԌY`r&Bs(.y H8J (ډ'& R0 i!Ei@W؏kL08+iZJ <[jJ&DӮIv)X5A{, a>H P߉qkYBTS yC'jRE,RI^f:Hi<'jX_c/Q)ih;J$~ Uq$`k! {l4eTl,GDC)zjMKڈ-C h=p(#5OqƛLخ%yFa'.X&xj[0!#E%@مvf(X׉BA eDJK PD%g4 s=wKL' 9[TV TmF%SC+^>Cb\^K h^;-~DYM53 {K$/T=1ȈF{@Wb8\#1ZTEEŷJ^jHѩdc?N7rZV[*_o?xĨ` y.<r-\]]O]]ߣo f.\{bopYQZ˪L>k~o%ʭyNH-7y|>b8G{gq`6WT9ޟ0ˆ)0LW? -n~5sv<>+_}-W/:G/~ox{k톱?>b!!L}xZ3i\ÜÞTUO M߱?γZg-1b^]_Dߴ2Кmw?O1F_2OS]۲{nx}qi=78ps=cȁ՚*9eZD^]^qpOPa &F7%~օ$z~qxxJ!HgvFq>cwūxHL19}zmPcLf\U{noo9;;\@BJiũP3D$MkIJZBሎ#kt ۴Rq 5u"zwn6bNְV9l23:"(r"ibCNoFBM(5'|-EB(V*# Gnΐ((嗩gO!,)* 5jmt{29ZfLq'_0Fngq]OM3anFJ*q++(Rv^S׎di*TgP]KքP̬BFAjG-rIΘ].c:Ȗ[rMO)O8 ǂNT 24O'j%7x'ʲrtنI\q-֜ЧaYH45<t=SaZ.3 kZѨ2ќݚGp Pz_+, dj̬_]3 ]Ӓ,ephljN|OژcE: g3PA?So[g=_j]F>yΑtIYJ!lY @B[Mp4-r[$$&mcY7#L3B^y F=G 9`vkD5-5 _+C#`18PxEqNnCį֚:Ohc *bi8W=i0)1ق1 [)WTQU"1%RX ʈ'׊1N~hSHnAʻL7gq$#~"EFHCLj-L \)gǿ3|@ˋ+vOr]mx㉗_|Ƨwg|3~rrs#^@cBSl_^[p:4͜ϯfgbLx9H (KvLӄ=s{l (8OȋH/eL):#19<'&24ןiS]L0 Z-/.q9gW|w4rvu/^Gj>-sG0rqSkeċ(/CJ.}Q8kHz*K4|G*CZrFAsh[j1f#:+pss+7o$ R4:lEh#%tQXҽgzڑ4k 2i$]LE2%M|z";9Ӱ6=~a.g,%Oh4)tzd6xDMe:V4݊X3YL 1h+dЬblB D^/H92E 0Lc[Uy\,ՃӄzmeƘEK5\3K =爮0Yy+9DŽ)`ythDR 2.ӑ#X<{Y%HƂ3۵Ҩ8/[ p37ĐYm/Q%nJpXT`84L( SrJh8aLȪ WHWV%䪪hJl-/e+1.aˠmFRt+M"$z{.Q1%~-cµkB9c])v8]HHJ̮m D cJ<BIYKmdM8o+S+#fՠ^5WF5K%cZ.uжCk>d2jK}9yVdF2=ǽě,kEKL8۠ikݞq`՝q|İN#Q \ *b1Sˌ^Y]/8ߜ(Jc:iJ~~4VT! @MJ@T8N'z<n%J'}'# i6%ExZc2P|#RAew] h|C 9%9(gIaf<Gi/ߐ \\`|z,D=+w#ENtY9g+ًsD^tصtsK- 9~?cw|?fONg-ac?E?srcZl^Olċs^}b:c+Z~xvzHi<}rxx8Kfw@/f}C{Fċ 햇4ͼ|#k8_p<b<7-g-w\]\Qkqk:hkq|z"JUb8x491΅g;{P0iqbh13-yƁ5|WMb}OfЁFPL E -*ďb>&Q{|ٵfEIZb)Hcv4f@I:ӷkn?/3??K#_|O߼C:N8<7_S;ʘx݁_\~8p]fivۓV+{~<_~DYk”8?a{owy`{sN;͚ӎg_Z v_~ Éw|0wv{gxwR\^\1&̪5眆h"q8nx|| 38MR3xDjpO[6-GL%n>Һl|8n'V]j3a q-Z)WgOlքܣȜ_kF)o7| W5*c̔(]s!QRew:ˋsibg8_ }7eƘUe|ہr i1]mV%"ےn&mΉyJXmk@hD"E-ۚZ%ń]k 5[ ,Ue/S+0u9$xvw12l4N jDkWi&́j '4S.w߅J2 o0VKF쪇0'L30M#%<*Wr*;III sYѮډP-e坳FTP㚎F~u)GtcѩPLw45PB[lZI -$_CB2I/C 5Đ c@5Zos"'A;\ E :bF+G c9  ߿)+ xtOtQ-i+Rw?זYw>>A |W'lgi8=ypbolo *lѯVo[1ќQ~W^o;-a&q֭?fw*W(So@ S8q<t& LqޮְYoy 3%L|g]t{Ç%n7/x"Dw7()'3߽g?;?xÞqƯ2)GÁنǻG3nw{i[48oV(@FsLL)s]\n̻#SxUW6g@^yFig'.W^'F;8oVƑnϺy<ƉKbNQO 1' 4qwj\r~qA*N|zxo4~͸Ҝ/Ǒ2Bi?(^zq'h56V657I޼xEB8e؏ipF*X#m,)#X|ӐL{Q`ֶ䪱@=%ئkw;\Ӣt$ʼnj5m2넷J%V "x8H|OVԙV2he^0JQ(L((^'TNK81`41hVmR·-%gy%[yj Eu`;JF[ $^g7xHQ|E91KPˬW`~hAwkB8\ӈ]8$ Fִ 4Py)t<;K_3O|Ӂ(iɴ(k"aBHTZqGz){,:b]!u)Z%ބҲDNtcP mzRtރӔ\1r ֯0*!5np8:#qX_ fÛ7o1rq~A<<ElY9g| (]0 |fr\]]q8igp8_:'@G)|⤜U+ZA6o9ӯĔnJ,^!)y` J;jh|KT29C۬VB _׊N&q`81]s1tkNkMFL㱋h$EMU1O'JFdnEfne-rA7 Ut1Eh<"f+ԪLq¬eb&F9tU4i:b{o E)B)ӄRd3(9t.'q4.goOYj@N(ߢTB %Z N)t- 5[qFy9|9+FJ?q4hﱍt 6%1j9*ƭP=Qm;jɄ0д+P 5GɈ;CwhM/yjd+CNqJ^LsbG"TJ2/W$ p5(uC*z@ĝXQ&;fq! h 65O' >WkI5^5nAAYIz𞜗.,-Q}c\l0PG795k(^2 2iF$,4$Ask+@0ݚD5߭PGBE6Ơ(*ӢW+mA`ilYx qB: 2l|ZXJTM/`C{#㞪5 9(i)RdU)0}A<7Uokmg]}ݝϬl*U(lFx_ ,%!FFXTg*Vy#S rʈsgk=}_NHLgbw${uCwB7PH-H瞐dkPAW}3|:&%Ѵ~kF8R5ađbxf, Zi?il|RƂLpIX[̮%I$}B[ F[IPYߗG-1ZO*4%+"1OHsYp42bj&i{9y ML!bqS)\hH 'AZ)-EtJk~-R9Ɂ5ڷAR^ #ȥd!L4چigC5˞肫<&J8+~Gbl[ 9C#;v+P}׳Zޓ,{rwg_qZ5)DwOAhSxwwG5 w#9zνD,6{20Ϭ7k 0NSb{g)d7 ^>}ۇ{r|x!h>(x!]L' QTs_!VzB)A2Fdki Vv )Jdn%\|t2 RgEgC{JP-Vb(; 1gӁa\7d48yTq̜n6L x-FɡS*p@Ls mQT1ixW)ߐK3Bm258Ʉ 9a2À<^0ؐc%,,S9jh.o(D4v}EFǤ"B)֐3&3ڑ3!:ӲRT1ߢWOn$UDb2$1Q Q0jL*b6Gyٲه cj֨JR K9 U-cc+'σI))N8gu(N(Y1߼D,%2*'@j)EaVH9c8X9k!+1WZ@󙦶w0>(2a%εh  w+cR|YZj[N#D8=y%sGByAʫuhe )[JLP[y؏85>[ڷ%R'zD͢WltHL-cƈS%jrhC.!'<Kt*rvd祥k,\ ,뤓FX4t7ML=Ƶz=NkS iDXcGm7 (C4u+ٯI3]3=Y82)}z}54j/nqjWbAΚԱZG677G>z!erEQ0 =8a3?~ۯP֍+^?ps>nsZ-%3_kY]_B\]lt瑧/lEȅ!ҍ>}vݎMyz~Oe~-+ƒ9xʷ<32\ݎ'Y,LiRan[Zx vQKMiKƔw{#(H- RJ ݀u k͢7ka;a+)luO4c~?%L\&R g:tBY'Fe362HZ( )9̱GQ 3@^q.YYͶG%!'JNgFKDkH"Ӕ2zBVV ;OPU74$q2hluH;aZmMKaX@ REdmqu*?B0JlcS).0 \pޣAI~ߏc$s.a W/PxCϜ'璞3*yON"Vr펤Y,VP{b(3_T$SE!彈#%m2%rw=3jN[t} jg8'yz%fZ/VD9o7MgO˿sNH݊_|NS ;X[v߾t:P]N#M8Hα*7[K=t{x=aٞ,ox駼ECsĉ?zܿgdoSnؽOYs{mWy~q mp<93SJ!ƈmvd ~1)gS _ł%cA/wy9p`.dpi 77Cv)E^^[jj[NGV9Ϩi/=~ o[J]?t4N΀ #(';NO<咐"7KÖ')p\ ݁bb!o: SR9:F$evLpRBNIνD1 R8bY'%$a<E $%J%*)[CW\ĪL: c@E Y9yFQ//N3oZ*9w'AL)!%S$OT hqMN(6-Yj52Ѯ;TU3 3(QȊX/:9N Hz:O% Lid 'әqQ DӴh_1 0HLI95Jg$)JBd5##j-%'lvGh3[LUs>I6pʊfQƑLAXtQb^Դp ={EDQr-U,뽔>F:V|=*^u֒&^'kl5O=jк*Lq0Qb#%eejsv)Vcmq"L'B-èüPh<ƀ[4twb/70J5FҐ-,A@baBͰ 64[#i4nN=e ,7+1A{?_O$h* c*HҸa<`<(qЄ8 洓fna.:,٪TT(kN3X¡mE䡣f hj u Q3g٠Z,!3y@ebqqҖ nWD#9lN@e=8bYxGL[5ʓ'ۖZa*G =9J X QBdPHFYITrT! 4cW-uېr`,QO}8.4@6iDy)M GoQa"{)·$"ԧlwwP K%$Sc.֨T(c+GW{=)iŧe<:'ΧTռULlP;6f֖xL췾ǻoX.\xrCH:2<O/gR/~ȴA{^y*ziKfp܏8 //0~Xn6Jx؍i)rd{Mc=1?yJZBT7-7O>~~@+~~9~@v9h? _S-! & R)j㹿ݷw\'0qKǞ71`"\ܐPCG(?T5{>%% U9;sAqusͲ]p>pmM"5h=7ҵ]2TX/?_}+aٸftgOnwap}s9\9\^]R/߾X,y|cu'!x/"Tq*Ji"LĢ$ 8JH)0=^j1$K00;=0532Y)L0 #L,(/2@{! ?cSgjt` r0IAY,m+,+(^e -y!|KUɡ0Dɡ*k;Dߴ5bb}08H9FJN躢]݀^F)i}v z0sյu{'b68b&bǵSӹG3Yt)-#YJ"cĔy"syEJ.IN;+y#ecg X=C"' %e*&#vq4Xb8u6IEtRd뉺c=R_r6i. 8IaI<䌲ΌB 3>A&tC/(׹x^B35[4BIϽ'J#v~ A5m~p5b"Vó|",]$WClw؊Ut"OVRXgƉ#H`-)Lvw0EH$(g-ɌL} z:Kؔ"1Du#)U/5[;%cƸVLSu&Ă5F֢ KȈ [2cݵC0hV % $='_r(FL@歷+1*MDPȄ$f  4bUDZJM-vJ#h]c Y 0L6mwJOk9[e\{tw%eHl41jE1;tt@__3y/BGztQhg%aRuK!TuB J3 jFg=j&Ab1 5.U[ad<4͂7v u:=Y9I}\❧?҄ S?桕[I`"o3Zg(TYr]/F#LUiaPB{#d84 $2`WW v~$ -31k40#{hzRxz9i_4KBiV-E>ZJe773php zBcpȖ=!rnG2Ŋn8ͶB5S(up:puY-8;|n?#^Tk'xpOǼ}{S,|vG||͎~;q*O.6h4y k[0!|:ɦ;ڶeg^2<}ɹ9N~)c8uLfA7lO{>yB1aK,&8n, e]zY7=zƷob ^5D}¦n)=^"^*f0R-[8ecw$znoo9 k ooo麎.//8 0V :ơۊ0 c4#b 䘱M-$ qlc\ fxPLc*+6('{MK׉;De,Ssj#hMʺp̨J!Y6_ۚ7Ua 쵑hCR\M1L5~ThqfLLC~,Ny2RjbQ#)%3q&+)i4@4LS,[m*Jv`' E^0ثx G)L玒rHͬ׵T]bg$!ѩr k)5LX2(~hRD[i/%2dS& j[2H:|U8TI\PE(PDjuJJJ68vf]bllJkRe2%//G?S׭efpԌh a4ըt:E2#~esZDEIN^Y|q\+Lj6j0`u+Եݬ =Y %MB(QV}ELc c!EY'˵\Ҵ,;T ^Y"i8nAΒbA)uFxZ%e(%Rj4Ql1R7XcQ_wvSE@(QBA}[+e3:*k8O;fk43zf| #ZQq:0"켧Z,1c|%TP1|Cv՞q'|*53P!ϖE@N4zj[LO>yqzՎYW_yePqw'?dwL nGS{>r<Τ!q_|œx-)(J3%vI4;~|ˇQ[lNgwZO)ɒy݁id#Pj_ (g{)k3P.M8(LqFȩX*_cMWդ)PTUMLf,*BhrBp&i3JpOPaYL[TNzI#M-%bѮeRӀuCL8Ơ,WHb;o%)e抩fD%g*p"8hkl< g/G\YW+a: >՚aq&]Yz޳|L2*UR*$K6eɞx`CCc ÚXOC0`ق!Jd&&Ɉ`N;!5" 7n|z9cꚱDN{wwǓDͻ#ݎ]y&@TU ZqjqU0Dcvtigxzq-1ݡc(0Foog{/.yX]SŻ/%6[tu'[ ǎomf-u4 0J̀hkyxqnΰpEQW @ӧv;OI~4v yk'"Y0( ˿c< _ `lyJ3T'H ̬PZ 6Х9`r枪ۖM. n'T,vo$ m+JXz)۶uT"aqtqY'NLb ^&(IF`BRFy[uM̙4ETm )Ɯ!Ry-%#dLk)SYUmTs \9qib£SOiXc ) SDTP-*g'*J\y,IWƎBgHc BWD5!DZS佋՘OY_>g<rMC%1%uXn41![E,%gY"1UKhE=gguҧ)Br!Vb?E>N2r(PFħN=5SPZȺ@Sފڑ[,UPU Ee|Ӓ!#y<#fpŬ=s_ţ?@GI,g!-pJYh;K?%tBYQRG3UsОKBk-q'ek,0b)DDriC .Rs`鿕ٕhY\YQo06tu=)lgʝĊ ҋh k2,:' '){/&nUP Vbl;=r8{^z}'c/3֫Bf6缽~p8Ҭ=a<2v;|r<?Ŋy˗}0n<<<0wXc93sdzƮ%iL=c -!EN+W3S=&?QGO%777 (X?3*ʌVErR0ZD4J$f!4i"LPՎkȁj %^G69L~P^fqR(NYΨ8/I$?i|C>xӟaAJzTFKD[. VH1F:5ѩO䂕ĪBňn7ô έePX-a| O@#G\0|#i$_3ͤIP1M5Yè\B Bv5c6+jYop(b_e Q~E{50OqB![yUvUIj4EF|2 WA $1I-^ۈ|ívFxw'[r뙭"TJuZ(Vu%o!S?Ҷ[L%Q\~Ceܟ+kf")R,&w_ACUk( ."!8R_Uى`18vKؒf8Aԭ#+֚oY]G?(ax)(8{U;%H䵿ǔ[I_(Y3HCiC@ LG7dUQ+BܣS՚xܑӌZJ85a2h8DuJ&v1D7.ӌ*oxvGqw?d:B/w>#non8ζ<$ȳ/x4el\q۱n[|gW[N=y&ŖtT1;Din7 8+G~x梡רxzœO6 Mp8 ~|a'>%O|W4 7wBNl6y5o^]Rm2i` [s8 !xt}OppϦi^]r5W"0 upb]tFGb\s%x:/ԩqb]7Ogv#/iF~59EV-=Ï>՛[6Mir~y=G?10T5}!!(Zr!S?0 YVPsqZT)BѴޢR$-[,dAz ߊLY4*(Y\LĔWkZd\88z3F X0J'06k5ÀU E k`):c]r0J uZܲ:'4ƑvuARǑb4Ya1Dy8'8AU%PKJ͋oADjdj^ؑUmEzCL[K:R2M#"2VY{<EAfYXt[`ѲiP hDT]d`Zbr=Lys+^ʡe F*gdR.7 g:pUފ3;C( GIZaM!lNww:?׿lݞf򧱲1=g,)¶rq?xy@ qg}Ǐx8]ss>ڦ?׿ 4!?p4V)W|K| q>[#'7WoXm6ɍx2G;qONk5wy~%{?N.pѳg?ܳ8%_3.>!̴?N.xc-;_Li+w\(yd;P]lh}4Og$^zKÚ--8l^߼e+̺n馑=cX]q<XWxp}sCU C/#3ofaLXW3Me ߶h'DV(0R⫲4rQPHǣdv)[( ~/QѪ+s*b(_{WXNbVǡ@)$L-9 (BCWU$kEyYM4 dFR^7@}&kyaZWFPjUx(1i*Y)-j|(Vu9 ([\bN8sc;`/AOfg˙RFR8֕|Mi{C)knsF~%^„-E[ҴB++S 9}E #!L8b-wF6!bJц)wL[~jPoDJ$nL-]J(=JT0S$68׆ViT娶pq^5Z9a^PD-!f|@U0MQ%r5%MVqXZ:u:SSJp EBZa8YmdAJ0S"|/R5\={_WmC*Ο{ q&GMQe=FKDIJs_A^Y(1Nb 1U $*P: ڷo"82$te@ #4n0.ʼn];ic1֡\+vi59JpM#I{DtD)'hժDόn)y-jteNz8n*C\RtB"edt0 )'*MP(bCFFɺ%G_S<hdo,!d)Q,fyVFfT&GfKU;ܱ^@BgM*Ohk[v?O]Oc:T0? Di\);+Y6Nqgw(BW5*ϳ8o^z;BP\âs[-dy}UcVEa!=$U% ki!gt_OiƠĝt)LXsqd6(n¨P(H13fr+t!j-Cy\b|+!Si! hB:8aBŽ`7h+pGB*X0maꠟ9{\s$ٮeW8z|S ,Ȓ -c1aƠmu%NS2lBhgΐQDL r9'Ŀ"okN~T-ۧ2VW-ߟ o|<\sŰJs:v ?!uQ5 ȳϠ(]pcӬ[La ޲1~G?w'֭%dH%O=b0v|МmGլ?9=I\UӴϺ/{qY_x; S"-GOLW aF9˶iخϹu<=!%|ͯ,O}GBObuG?o~͛W\\wɯbZ^<{<'W_">ׯ#UO{ha{BHAb?'U@eG_}mN dkPw(xNxJ{bu-_a.0 u2Gp'\ܪjDF|> :)4TUmą0:!9 VD W˜R!wcS!+WLVc4QyRw} *9>BJtJZ-En8_t wSyxx8u;3Nȏ~x+u`'a`{~7o0d Cyn{/P&3vdeX1x8Y_]`n"6ȻSN'\]1ǙW5O 9r:l:-gl6+981"ټ?S<3u=+_so)Xp|Ke@ٌn*RQ H+<.SeFR |#a(KIw߬YIIRk1)LDT&p1]8 h%e,ժ%ܾJVQ+)Ѷ()J|W5JEMiG) yX%8ɬ~Tb )V0%zWXQ=HEFSyn{OU[NU5J[QNcR6R7^1!LE3$8仁V aIP^) y)zSI͂BKwCiE\M,Z0I4-Z[ yЪgd3Z+ cLN(2YZi!2 Jj q@J"2t2p9EAjq:RB{UvÄkn*1sm#F8c ER5!h1&HQJ3G6X+LDYy:":%GJ)(LcuR% AB)t(q}to=ْ8J. s'ʜ﹗IoZe)efEZ%JQ"U_ǣp"0";0uݒZK''1)m#'0R,=ZW_@ 4WOH`s!0M'b 2b|fmMa9$B)X[ޣU!P;CfCr4QH@xc@r9QaGr_5i&# w..G͚fU,e*vk<"ЋYٕ?Ĕe;mMf003@^jb䳞j rZ1J* QˆJ3 6r BDMK&  8,VJR$ƕ2KS(LzM_ (#7M3ZjV D@X#iMֲk1 O Ӯq(#,%1t$Ss-$0tψݷii$v"Fp]uP#p&c\;D(,hQ;>g`jӌ8y|{-_7jE=%̔q$+u\!a ^6J hE ?3؂6+r (a"Ny-^7T)cpag6 ͪzM2$*#]ۻ9kM͛[~w~n o_xc?pDZ?yzg(4?Soҳii MŜsVemC[ޱDĊ=-7 $ZhaC Y9EdtO,'"x:(J;'-q1\1ŁrvvΡY45]4 ,k@љԏ!%ڶf?PU/xENw{>ǜWv˯x~_Q/^%a?l6wOg|8Ta_\>i+#W;hxϞ^7g4??_F:>{%B%61 -_P&q5cTLC`suUp8ae&..=^?9[ $㑳Sw[ {NVkb8ciaz#=cףk^>ݻ+rL<͆a~iGR'0q<,W+1܊v$ƓSfҚIe>c#cGԌcx`xlߏ386 g'cQIb-Yq#XjB2SyhUK?0$ՆmH֡qıV-=%c:CUzѐU"4Bt۠+1~g^Yۆ@[8kމYYi3bp=ZW0ፑ'vŌ ϳ"0!lָF^S8)v`*(N%KA{r*)7JGL1JbIyGÎT-ƔBUFAr 8r6F} ^H*Cmbc"6iǭ|K0PlJJ3x@U5*&bnѠLS@-釔!Φtf:&,%pF+Jc1P`1fFh_<`TVFb ŀ=S `,jZ-*qq*C"m)]-;ۇOZ"*Ң+-Q:1҈@ #i<`|Cz~4vx籫|'HQ0tv&etv{GEC=nF.NyN_ԮΠRFc*t%bq Xh*DK WIyjaŭΨ{+cE/-Cmۚnc<@wo,+ _gr츻?p쒿_X?^7h/=۫ 9jTm6l-q@ljJqgyGh%WW;7|3>g|哧#?G?A''O=~ / ߿]^o7|/|c0Uwq"zgqx߽˿%SɬN11sYW~wĴp%$jyw珟pX7Kxr' 55a`677-7q,g{سjZiaɣK /ا Mܼc,&NW H%_={믿e ^eVSYkT/^0qs@exCNϰ`Ek8<} VsnuŊw7X;?sYj*r4E(8LW3 q iDY`[+ tbjIW $( {"kפI)bEi#Y *eHQDI]-9"v't#2Mk0Z@2G;4Z ?i,ђ.#x0QR4TVوh"SƑq섦[`4F)q*,j(UDhL4fjIc8lwTUE.Fq8BY2jy P 0 B2]XT^6[VC)X!؊CrevD+=47 7{Rn!iG,a'1E1YA]oo œ=axx p|sE*ܟg#Lc5h$/]72nRC&L[S9z}B< $%f㙍ςB'i͊|.LMzaLps-e_WAI-ۢJ"1 h窚1 `u2Eyy. L5TʠH 5A9v{[đ"E)_}-! wPPVǀyNa%&T m|>[ci)T1" {>h-pnQ }dG$1~r)7KQ  Ȩ$4ňN|>1mjC*["*mC =SZC똺.d3͒54'~$SU8-=e Tu1caV.+9À"JZ* ]kh<3nEV'ShE qX rmgf*QU35d 0 D05Xo0V7EZ@4$yڳ b,./8vt#ho~[դXL1gϟ~duq!1kƁ~8s l9CG֤8Lj4^U Œ_s -kʌeŊͻ-ָJ"9#'糟 9c:Iy-?ُj C_?{b dh_/Y9yWFqoؼݐ7#o%7\5O<]^7:=}DY0|.R- a?۷G|ūs>oXהq?q)a;'y/WOys>y_KwNY3{S $) hd M,Y9E7yƁ!ǞeޛZ=F[кPU-:Gb hq"*ؤ8EN[A!vʀmjJu-?l&L׆eکUl!Aڑk+yNb$1Df'pV()vV Bx'n lUWҎd!B^т ҟЊ:ؿ,L 6'BqzERֈU^6'#eCRRHYp9IhCLUZb'o֣%MxrDw4 T IĞGjB4YJ̳Y]#u/wT2rRVOZ]{"iO)Zy.9|4X_1Gl}B&TPyBGlI.ߠ̙{w,/XT/qnׯ_3SRs~s~Gܿ}Ǫ0O?'›7xqoxK~g7ߣι}wExoӧO9v{Bho!i~wM c{Bw^w~SK7|;6׷[B(~q{{_~ 5][.I ^<6o,'|w{?]Ɯ8v%[-[b`Ys{{:NNNxu<~_.[r{9ݘh>:K™kSa&v7kRJM8NVk=9E?~~|O/.1Zs1os\@?mI)LT:Ȑ'R(ZhB!D|R/skbB2J?T1]7xcHiD;E"fv1C*@,#([ hɅid(ZC7[|d߀UX)y\Y臎#M`*2(U47߳{{mk` =aѳb)F>*wJLQrʠJbP^'e1;G1N%)B)=`a'q%H5RR$"uJ`#1d)eäHPZY")'6w-1ta$D@SR4駞U c.77ضKɤҴ8ԋ0"C8!HDFG($"1Q"3Ut(Ke$VC)h4q/X!R/ W7ŭa0FdWJ"#,41a\Pn/^3[걨*JkO IAhRxUjAF5%Q!K@L*j#׸ v-h\UርWhP%QWK~w?{B&T)hX erXrJm~E Q4Adtj5voȶO\FBթ !$c %i$$)-1EJȋ\2#ʶ<JU-(#.m?s4Gpԏ.AKLbR6ڠSɻ3GUc+)b%vw ZP&;*l 6˅V> b*o!Y`["%$a؆d2qЫ< Jy4aUղgKxCҨ fBFHΉ\ic4qam \BG )QMM$a 2zFDGQA'1?RЬ|νJ$C|mq o^Y%Џ( tĢQdf `x%L }o9P МKO"Q&Wai.ǎ-RmK;p{exr]9l{^]>B[{Z裏GK:t|ꔯ >aQ5 t) Hvaz9E.h"YJ) d,`ȳpS.6EBwD+-19Qr;' rcO9j1f&^S-LӀ. [/%PL1cz@8g)&M]S2-֘ʣg<S ֋n#&R<-Zy<@Ey~b<j e 0PohN>xx-,nzbR #X8k1N]S_@zo 8K`pnj6F?TD{iY 1ZCJ5FSK-0Ai-ԙ%킫=yq@”T(H̥fW/`虦(-4 Z"KZS21GYmFkǘLq5i\Æ< LYr1*O<ӄU ƭK]cHJQR&vGt"UzD!%qטL{:x*jN<3e: W0[5&69\Ѯ0'GWS#Pm5ny"ݬEZ:)$< =iU_RJ*fU5nD{!R<"͔zM2zJ Z8 yDp60@-lPWEBvhWsdAsZ@ @U7R'KAGlSPq"[ *t$`d%LlH0e嬢 $/ ߽cw㕥8C,c^}!7|5?y}I滷|W{Ep: 6W}qwä4_~fk8S&f &whm͏~'ܽ^{^=yA.pzNV+̢&ɚ7w׼x_\3G9"H斓%BZ稫kV-a\=^+ٚi7rQ5쇞[łfC8Dw} oVí aij;4wDw-1e> l7[bNĒ~̯ 8V<:;!HaڣuijhSaqh/qLjݢ(ih H43p0e=-%ci*$o8q͒#o8lnacb ?o_'4q<(V}OvúFI, J j !(In[V'+)h;Vg0Ղ>̷g[9LOSU8!U9fζB}_D&%rP޳C['Vw|bp=S8UšJ&S$DHAS 炭LGSgٱZ*Rԋ%Mۊy;N)gg/T7i[*(ӒT$#J9҄^4Ti9j;?(պEKi$%*=~QvPR`?X: $-D%ѻT`j 9~ #INHe(?[^J9K9CKʙB01m=H7H+ɼg&/%J+9LDuUrGAVHV g۶8Dj5s3+]"CmX'ݓp3BfpljMGwdRfzBpΒS AfQ"kYI~~i= {(i*j |H zEsǎGs_=P;x肷_hCJ>߿)V-0g`wiˣ.tt]B>Z7i.Z~ʻ_=|ůKv|ŏܢH}Gۯ߲~rI#9=;.42a-4kCֆz{AO?_cI'9˖O>~cxEÇ}ț^cwcj[;T݊v(rN;;-Zk}5 ;'Kc/]T#h=![_1ÞϞs4!^>̶;K^w7<| WWQi{>ܱ6z[ș#0lW~K az 3/RԾ!D8F0foN&eu蜰PĻxAc C'^FUdd4EA;YqR&MѾ6 n בF?C ͨ`Sm]@~Xs8*d:*TU-7YQLΌ-KFLR PD6=YBQ53:ftUa ,5FC qg)۞bO2>+V0=j+hv@8tFEHF(ef)K69`Kʂβm(|%?|bL4%i0Џ#7چ2vĔ횒9eUe8޽kЕA6غ%[U{YSg\BYS@c>8Pݞ͟)UNN?W+R:2EČ)BA$>fhU(I=a88\+xL;ݑ%%Sד[>]:gH\` C&h-m<8 բ!iM{$k[Ț 0^0Y+kKHdbס*^}w@iu}!D_Ͽ~%ֳJiV\]=sssO-ۡcQ,)7ݱlFuU=S?p~rBJ">ǭP .O]]3=wߣȜ=d: ?nOngxB {.^=~lŗN\R҆yW.3ٱ$[3;vo"WUUҟ{^߾c{޿&5ooްB-gW: H|x !G~dU7OgLff('_5iGxyVb}uA']?fN|˪=칼YtOLf67׼y=WP2cjJ޲Y9p: 1fN3\kJ7 uj1gFt*T&9'/9<<}u|wVu6r2Ģy!1y @@ 80BB"W RL//PC _}s󹣽\^]On7onVdy Yevw8=5C w=dCo~[a,M) ci '\|xwϋ/_?o0Wd3v?|˿N>st:qqy/_ohV7o~qd3Y5n c4kN0N '56FWmK?|`<ܮ9ws/ *מ|/qbj9\m/tül/w}o Ǿ'#Z*ypXp=/_"#u⇷o#=e$Hf֮njnٵA77ϸ?R\>&j?7}Kf?CC<)x8'pk^ ̻[V"W m+x?MتzX+e< 91 R%#ስ,N9 R5 *lSV #uےYlV`{U ,X-TM"mQ$Ge*˔Qޑ*bjOVN #Q8t݉'IY8b % (UƘJ hq 12LA2E+!3߲^aH3$ ]߈1[9إVSr1?U)DJMMQ݁Q̫5sqrCfE?ԕ߳5&< KVn"r}/ZTnEʖTC NPRɨzGV]1Ml9h_Õ Gjҏ0cU"K䤋"=uݐR d+) 9,t+!D!,Z9B8_ =*IdI{ak61MM i!()pΊPM Ws[dd0g6VC[@i# 5yP1弔#F'ae VlRxE"fD<:1v )R40OaVR08>a`gJFZ|1x2LDb Nr ePUy+N%놤k ;1}x>0tD9A$rU׬)A0G;*ϯDdr.q+t)YΪeSRaݕ}*%3Q3wHDI}Cʲ,j: \(=WLj8 iÁa6('x343#hTk#Ɖ@8Zd68J #Sf:I[1 e[%"mIsF[Sy[d8HWQu+'E %ndFWoK8㌲LH,Y<V"DJu#_,[ Bʳ%D{B*GR/쟳uXtk nKkrStASʋGj(+$8g\b^d)2M1ev-w#;J!=%̤i aH$inZS7( t\zj j΄\Utjs&$N 4Tr WTUF 4zEd-Τ0dŧ_K).OF %nF~O?{E74n*ByR9'ʑ?X]d2sLݑU]33ÑD$s8Aě TZd.KfTCڝ hՓ5_3~]Ѵ;>|54mCQ_տ7yx{n^+-_u| kH4˖-SB"D( 58?wP<토ҹrϙyqVc4,;e^y5$q |ݒ*4'|%K㑁\[_ 4x Žc$E%{I=L8 OQp@ լP^9&!nSφ1Cov/DTrt:`aZ!ƥ ƙ#J;j!j_QPA::I+Ҝ*db&u!e)Fp6įL)k-1$Qy8pNJd&&H vʀ u+V3f4H!SUFQ1sXq|LhoÄ\d.$SL&u"4MUCU4BI$jad#غEg!)^#)bM;r T`Hqg<βnJ1Cخ8v=Zl9u~h6kTbծO9TM/~%57[oW\ᑟsnxK8O|?P£L|4Wqwܳ{͌:ag莼?y= J Ӏiۖnjwy8cl_\տ QƲ~4u^` )3}7r`r_s:cWy?ٮhV:e'; ݙ&+n?ᰇ1,ݎniSq5ܾ}'~#?|ϋgwG=?_J| il4nfY>||?<oWB}aIENDB`instead-3.2.1/themes/default/sans.ttf0000644000175000017500000041723413267071774016611 0ustar peterpeter0FFTMMGDEF \ GPOS GSUBNC`gRT/Z33f Px1ASC@!Q3>`: D99Ws sIVHh !d9[99sPssgsNs/sRshsisYs`99edesTVVhV9g9 Vs9aV9aV].V  V.V-A999 sjsWsWsVsW9sVsssVssV99s1""\ss:sqsss-sSdk3zdA)HLP9wPsS88IVVVVVVhVVVV9 9999a9a9a9a9a9GV-VsWsWsWsWsWsWBWsWsWsWsW9 999sVssVsVsVsVsVdA,sssssVsWVsWVsWhWhWhWhWVsVVsWVsWVsWVsWVsW9gsV9gsV9gsV9gsVss 999 9 999\99 Vs[s~sUssssss9asV9asV9asVaV8V]9V]9V]9V]9.9..9ssssss V-V-A1A1A1sVsWB9G,V]9.933PW9F2AVVhX=VA9a9VX 3Z9aVl.V-buV.W9V-VFsj`VtVFVsjsjVsVOVV)`0U3?S`sV`?SW.UhV]99 u.7V@VUkVcC@9aVh.7vV.UUU.@i`sWx@sWZ1xx ksVUsW#V+zk-+7UsWs W99@ s kJ   V-[[sk~KKKssQ7UUXYV`ess:sE%lXP=]8ed3W1d8dAdd?dAd"g{mm))s+kUFQ@;@<fBw5+-|ZjZH-/ HB~~ O\_    " & 0 3 : < > D  !!!!"!&!.!^!!"""""""")"+"H"a"e###!%%% %%%%%$%,%4%<%l%%%%%%%%%%%%%%%&<&@&B&`&c&f&k ~Q^    & 0 2 9 < > D  !!!!"!&!.![!!"""""""")"+"H"`"d### %%% %%%%%$%,%4%<%P%%%%%%%%%%%%%%%&:&@&B&`&c&e&jG/vhzyws /,$#>1"DC:741.' ܸܿܳܰܨܜIFE(&%" bcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?w6   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnj#ti<7q>?fu143:kzvbm6@;2l{   }8w KRoNOPxSQL@EYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#"! ,E#F` &`&#HH-,E#F#a &a&#HH-,E#F` a F`&#HH-,E#F#a ` &a a&#HH-,E#F`@a f`&#HH-,E#F#a@` &a@a&#HH-, <<-, E# D# ZQX# D#Y QX# MD#Y &QX# D#Y!!-, EhD ` EFvhE`D-, C#Ce -, C#C -,(#p(>(#p(E: -, E%EadPQXED!!Y-,I#D-, EC`D-,CCe -, i@a ,b`+ d#da\XaY-,E+)#D)z-,Ee,#DE+#D-,KRXED!!Y-,KQXED!!Y-,%# `#-,%# a#-,%-,F#F`F# F`ab# # pE` PXaFY`h:-, E%FRKQ[X%F ha%%?#!8!Y-, E%FPX%F ha%%?#!8!Y-,CC -,!! d#d@b-,!QX d#d b@/+Y`-,!QX d#dUb/+Y`-, d#d@b`#!-,KSX%Id#Ei@ab aj#D#!# 9/Y-,KSX %Idi &%Id#ab aj#D&#D#D& 9# 9//Y-,E#E`#E`#E`#vhb -,H+-, ETX@D E@aD!!Y-,E0/E#Ea``iD-,KQX/#p#B!!Y-,KQX %EiSXD!!Y!!Y-,EC`c`iD-,/ED-,E# E`D-,E#E`D-,K#QX34 34YDD-,CX&EXdf`d `f X!@YaY#XeY)#D#)!!!!!Y-,CTXKS#KQZX8!!Y!!!!Y-,CX%Ed `f X!@Ya#XeY)#D%% XY%% F%#B<%%%% F%`#B< XY%%)) EeD%%)%% XY%%CH%%%%`CH!Y!!!!!!!-,% F%#B%%EH!!!!-,% %%CH!!!-,E# E P X#e#Y#h @PX!@Y#XeY`D-,KS#KQZX E`D!!Y-,KTX E`D!!Y-,KS#KQZX8!!Y-,!KTX8!!Y-,CTXF+!!!!Y-,CTXG+!!!Y-,CTXH+!!!!Y-,CTXI+!!!Y-, #KSKQZX#8!!Y-,%ISX @8!Y-,F#F`#Fa#  Fab@@pE`h:-, #Id#SX<!Y-,KRX}zY-,KKTB-,B#Q@SZX TXC`BY$QX @TXC`B$TX C`BKKRXC`BY@TXC`BY@cTXC`BY@cTXC`BY@cTX@C`BYYYYY-,Eh#KQX# E d@PX|Yh`YD-,%%#>#> #eB #B#?#? #eB#B-,zE#- @@ O P(F(F*F+_O_ F@FF@36FF=U=UU@F<P&(Pp@2F?Oop?а/?Э/?ЪO/o$PoF0@pЏO_oF1ts?sP&on<nF5U3U3U`P&_P&\F1[ZHZF12UU2Uo?QQ@Q58F@Q%(F@TPIF HF5GF5FFFF2UU2UU?_/Oo?oTS++KRKP[%S@QZUZ[XYBK2SX`YKdSX@YKSXBYtstu+++++stu+++t++ssu+++++++++++++++++s+tstusts++tus+stsststtsts^sstsss+ss+++s+tu++++++t++^s++^st++++ss^ssssss^}y:wW~j`jy"3kkk{Rni`[^^eoz iqHjgaAD,,,,`T2rP  D P ~  J d@(`,X@^(&* @ !"""#$6$%6%& &'X'(f))D*+d+,p--b..r.042V35|667~78p9::;T;<> >?v@8@@AABB^BCnCDDZDzDE EEF FJFlFGG(G@GXGrGGHH*HBHZHtHHHHI@IXIpIIIIJ4JKKK4KNKfKLLLLLMMNN*NBNZNrNNNNNOOOOOPP.PnQ Q"Q:QRQlQRR"R:RRRjRRRRRRS S"S6SNSfS~SST:TRTjTTTTTTUUU6UNUfU~UUUUUVV~WWW0WHW^WtWWWWXXXXYYYZlZZZZZ[[[.[[[\\\(\@\X\d]]]]]]^^(^______``*`B`Z`r```````aa`aabbb2bJbbb|bbbbccc0cHc`czcccccddfdeeff.fFf^fjfvffffg0gxgghDiijj^jkkllNlpo^oppppqrqzqqr,r4r,^(BZrh08@X` hp􌂌tJď:ȏЏؐ&>F@pΔxĖh$Bęܚj򛤜 T\dBZ(8¢bz 6d|Ħަ(D`ƧҨ4fL@ȭ`Ю 4X¯ֱ> ޳b(ZDr0P "ԼF6:Nf.Tz"P€ºRÀðHĂĶ0dŜLƒDnj2JbzȒȪ̞^lΌΨDϖLЎ>ѾnӀfԺ@ն ~~2$Lz٢8\ڪ*DdU./<2<2/<2 <23!%!!D $hUD@[9IY@H &  v  )  I &  v )  y V    T d t  b r D T " 2       r T d B  $ 4  n @fmHI  @^bH- =  @UXH QTH} _ o  GKH CFH ?BH} [ k = M  )  7    @-0H; K [  -    + ; k {   @ `   p_?/]]^]]]_qqqq_rr+rrr^]]]]]+++qq++r+r+^]]]]]]]]]qqqqqqrrr^]]]qqqqrr^]]]]q/^]+]q3/10#353gWh@!0 `p`pP`%(H@ H0o/? ?3]2/qr]q++]qr]q10#3#3jyE iy@ZZDD6D&6D&6          O?O   /3?399//]q]q3232/333/3310]]]]]]]]]]!!#!##53#5!3!33!!NXnVTnTNYnXkXnX@PjNulhhlqlhhlqrR0;F.@\ D'9955%vF?V??4&d&t&%"7/ A 0001o)o1 11 101P1p11#H1@uH1o@H753.'#4.'>" .NqNMtG@s_|dfBzu;rgX@$8rw|/Qj:AlM*\(F_7Hd= %5W@'2SbT|S,-PsK!^i C)8OmHMd>?P3 ,8Q6J2!!4DI+?S@ vy*@ H% H  H H H @ H H H@T'6 ,, ,,@,,, ,P,`,p,,,,@J''''@ H'O"E1;????/+qr/]qr99//883310++++++++]]#".54>32#3%2#".54>4.#"32>4.#"32>3WtBBsU10VuDBsU2;@rV12UtBCtU11Vv+?(*@,+?)'?,*>(+A,+@*&>,}i--h~g))g )f~k..jf)%cN !Nb_O""O|bN !Na_O""OH69IY@I${**bRrRRfGN[NI+Y+i+600%(,#|##,<\  *  *@8 H *0)&E6BI!I:-,JJM:,P,:,,: 666@= H6PH? O  MbErE6EFEJ0)M,&E ?Q?UQ3P??/]]q9]]]]/]/+]q9///]]99]910]+]]]]]]]]]]]]]]"&'#".54>7.54>32>732674.#">.'32>`:L]m@un53[~K (U]I{Z2BpS>U=Q#kF5j1 ;K0E*`d%AtV2JYBq{#HmI,OD7 B=0&73#.5*Za^X++X^aZ*iiii X+H@  WWHH@  ??/]]8210++]]]]#>54.'3+*Za^X++X^aZ*iiii!k@KM]mK[kBRCS  _ 0/ ?     ?]]]/]]3]]3qr910]]]]% '7%73-ww- ZgIHHIk)dG G@.    8 7?3]]322]]/]3210]]]]#!5!3!X`TT N H @ H @ P   @&)H @ H  //++]qr3+10+%#>5#5 {-1Xۨ5WKB AA[Op!@@p//]q//]105![Р~.@ @P@ H//+]qr1035393@y H) ??/8]810]+]3i P#'p@PY%i%F!V!f!VfYivy   yvn@)n?  s#s??/]]10^]]]]]]]]]]]]#".54>324.#"32>#MfgKKjeL(NqHLtO()OrIGrO+JJCCը߅78ߧއ;; ^@  n/@HDTdHt?2?33+/3]+/^]3/]/]2/]1035!5%3!gMW<g (@Muuze%V%)!Y!i!i##u'n@@&*H@*nt&&& @&H&\l|  s&t?9?3]]]9/+]33]/]q+210]]]]]]]]]]]35>54.#"'>32!g3O$D_:6_J/ Btkiq<3Upz|mVu||V<[>54&#"'>32?yst: +JlJEgy3fb3n[;w P{Yvl3"HoNU~R)ai7AkI8\B$N_57^Iqzo][-;eM>lV> ;Xp/7 u@Pvv@ H[ k {  op0Ps ??39/32/^]qr3322]/+3]q10]]]]]#!533!qh??Lw$% R,@V f UeZjU+e+U*e*&@YH $$$$D!# H# n@/.$%n! n ?  s(($t!ss g   ?3]]]?9//]q3/322]qr9+10_q_qr]]+]]]]]#".'732>54.#"#!!>32@~{orC (EeHFrQ,*NqH-LA5/!0civ@jF4[zF(K;#+TzOAmO,%A%5@uh$8@0zYiZjzTdT#d#t#T"d"t"5E22@- H%5Euon@/%%%%:/n  @&H *u 4s4s??3]9/2/+]2]q2/10]]]+]]]]]]]]]#".54>32.#">324.#"32>;so{z=EvH~gN{QJxT-1s`o=$HjF1dQ3(KjBAgH&jG^`CnP[QFҌ[_>upIvS-AjLNd:-Uzi D@-z i nP   _ @` t ??2/]q3/]q9/10]] #47!5! jGPe E9.Y)=Q@u((u!!uuuzzz zzzuUEeEUKeKZAjA4n*n$O n@>>>/>>>>SHn  $Cu99M/uMu??9/99/q]qr99//q9910]]]]]]]]]]]]]]]#".54>75.54>324.#"32>4.#"32>9u||w9/Oe6;]?!9pmso6!?]==hL,>dIGb?:fPUg7#DsVOoE FrQRpDZn>>mYMxW5 >Wj;Jc9:cJ:jW=  5WxL5X?##?X5*XH..HX3_I--Ja4AkM**Mm`$8@i'  t##t zz{Z(j(Yi H6%n/?O 0@: o /n @ &H4s_o*s"s  ?3]?9/]2/+]3/^]qr310]+]]]]]]]]]]]]#".'732>7#".54>324.#"32>GvQfHw[IyU0I]l7`l;?xo%IkFAhH'#FhE2gS5ݼ^!FpOEЌ/J3E|km{BNf;.UzKGzY3"Fk~:6@$@P@ H?//+]qr32105353k: Y@ H @ H @ P   @&)H @ H  /?/++]qr3+3310+%#>5#553 {-1XϜ5WKB AAeHj@H(H(H@3H Pp ?0p?o/]33]]/]/]310]+]+++5 eZ;dXGF@1@` p /_oP/]]]/]]3/]q3105!5!dXeHj@H(H(H@3H Pp 0p??o/]]]33/]3/]10]+]+++75 5eZ㚙on^T'%)@Du$$u##ZjZZzZ z :J H )))&&FF @@&,H!_  '&L_!?3]/]9/+]/9/q3/10]]]]]]]#>54.#"'>3253'%>ORO?''>NPM<%*MmC Cyzr{@GlUC<:DS7EhP?99FX;;\? z TpA8gn]re@zuuy//t&&f&cFVEfE{IJ8Z8j8;fR?6?F?R@&@6@F@%5E%5E9   H\f\\P:`:::5:E:9]9 99 }44 4K4 *h%) p"HH 1PP  R@_1o1111t=RR RR,kc$/?O 0@M6YGGBM/3]?99//]]33//]]q99//]r9]22210]]]]]]]]]]+]]]]]]]]]]]]]]]]]]]]]]#".5467##".54>3237332>54.#"32>7#"$&54>$324.#"32>7>nCva8O2E]uGT}Q(Gr<`I6't+&>kO-S㸋^0Vix,72oi?v$\"?Y8VW-_cEx`F `/@&+ -YE+:gSxݩf0C(Tx10.Qpޢ\@ts`!09p?4!sܴFv2TfG$PR@fvfviyiyse|jz9Yiu6VfZHUG%5*:  *:  0 %5P0`/_v  ?2?3]9/32]]q/]3]qq3/]q3]qq9=/33]qq]qq999910]]]]]]]]]]]]]]]]!!#3 .'!~?6d(RC-.DR(1!.@l  -u--z$$$  % &k{ Z@ H)Z@"/"""0)Z@(_)_)_??9/q9/^]2]q9/+9]]]10]]]]]]]]#!!24&#!!2>4.#!!2>ThuC!CeCUX.ATtH Q1\PsI{Y2k_,'TZ;hU= :ZwBrbB!=VC^<7#"$&546$32.x}@EuRmV!&pvV[.GDfPӘT+NkANOd9m  e<2[F*e d@F{+;{+;{{yZ@/  @Z@__??/^]]q10]]]]]]]]]#!!24.#!!2>ejңoR{:oNϰ]Q˂=H M @% H  Z@ _ _ _??9/q]/^]23/+99//103!!!!!-2< i H@: H Z@0 _?o@H_??9/+^]q]/^]23/+9/+10!!#!gg-@+j+B%R%UVVUz Y i jjI%Y%5{ @  $\@!!/ /`//[ !_"""_)_0 @   ?3/]q?9/]/]]]]]9/2/]10]]]]]]]]]]]]]]46$32.#"32>75!5!#"$&gYĐd#IhX|=BSqV[U/kYǥ e.V{M64U? @gfdk{YV  $  j    Z@ ?3?39/^]223/]839/]93q310]]]]]]]]]]]]]!#33 R͸>/8@(0 @`Z@_??/^]/]q1033!,,@ ) H H @H(   H* !%H* H* H!%HH@ H $$,\*$4..t.;... .ϫ.4. .......t...`.T.@.4........t..P.D.0..$.......p.4.D.d. ....t....`.4.T...gt.....P..$.D..4.D.d..........4.T.t.7@S..$.D.t... ....d..K..4......@.P.p.?.. .\@@%H*K$ $?3]?33+3/^]2]]]_]]]qqqqqrrrr^]]]qrrr^]]]]]]]qqqqqqqqqrrrrrrrr^]]]]]]]]]]]qqqqq^]]]qqq^]]]q29=/3310+++++++]+++]]!46767#.'&'#3>73V  wp3j,3032+a'@(-/5987/g'T/?B; Ĺ @' +H6 F  +H)9I !H H ) !H@5H&\DT0@p@@@H \@@+H  @+H ?33+?33+/^]2+]q/]_]q310]_]++]]++]+]+!#3&'.53:10)[#XH11*c-a'l@J[%% %R!!!T[fh [@) ))[     _#_??/]]]]q10]]]]]]]]]]]]#"$&546$324.#"32>_X\\A{~?A{{;ǥhm  efДPPәUVu@S *  % Z@@@Z@_/O_@ H_ ??9/+^]q/]2]q10]]]]]#!#!24&#!!26=yybQ}|>\uD=oaԒa}$8@ql|hhe"WU1Z'Z-l|Z(Z(,U,6Z662U22 [@%%:/[  ::*_ 4_ _/?3?]/]]]q992/10]]]]]]]]]]]]]]]]3267#".'.546$324.#"32>Mӆ5DS3@&[1VaFP\\A{~?A{{;Ǖu@Z9 3_Ws efДPPәUVh@> u|JZjrc@3%p@WIpTdB#3Z 0@`@ Z@_/_o_?2?9/]2/^]2]/]39/9310]_]]]+_]]]]_]]_]]]]]]]]!!#!24.#!!2>Ix~B'T[,TxL;RxM%I7h^ClN@^?)Hb]?@n>D>;61(! !!+!!Y:`6iv*Z))Z@A Z@H4Z@Hx;4@/Hw444:44/_o*Y*K***$_` R D  ?3]]]?3]]]]99]]+]]+/^]3/+]2/10]]]]]]]]]]]]]]]]]# $'732>54.'.54>32.#"Eۖ(:cfUf9?r`;wm`F(QrM5V{SbQ#?lPAvgL+Ym=%7ZA$<_BEV8& +:QkFd\*)RyP!3P6#53tН\9fSRn?]>Ɋk^+,`odψB M@JZjEUe:Zjz5Ueut {*: %5 *:4T 0`%5 P0`/y  ?3]?3]]q/]3]qq/]q_qq3]q_q9=/33]qq]qq10]]]]]]]]]]]!#367>73    -Y#)'%)#X0 .W@Iy,u{It F zIYiuGWg-[-k-{-dtU H @ HuDTd6zK[k H*:  % 5    *: %5*: %5'{'t''-*-:-----......{.o.[.O.O....@H .0.. .8x @@&Hw00060F0V00'0070g0w000000&000000x0000i0(080X000000000X0h0I0700000000(0H000X0h0000I0(0 0000000000|H90*00 000000000x0i0:0J0Z0)00 0h0000@0000|0k0\0K0<0+00 0000000000m0_0M0/0?00000000000m0}0[0M0;0-00 0800000000{0m0K0[090+00 000000000}0k0]0K0=0+00_0000000DT-'@{ H?33+]3?3]^]]_qq_qqqqqqqqqqqqqrrrrrrrrrrrrrrr^]]]]]]]]]]]]]]]qqqqqqqq_qqqqqqqrrrrrrrrrrrrrrrr^]]]]]]]]]]]]qqqq+qqqqrrrrr^]]]]qqqqqqqqqrrrrrr^]]]qqqq/+^]3_]]q/^]]+]_qqqqqqqqqq3]q_q9=///]]33]qq]qq33]qq]qq33]qq]qq10+]]]]]]]++]]]]]]]]]]]]]]]!#.'&'#367>732>73   a &h/79:70f&?|1:4EC><7m7;>CFEhy4.+ w@\I;& K[)9DT&6 )Q E 3   ]L+; RC&6     ` T 0 $       p d @ 4        t P D   $ T  4 d 4 d   K {    4 D jT d @ ; $       { d 0 $       p d @ 4   9      D t $ T T d @  0        @H     H @) r4DT ?2?39]]/]]q83/+]]]]+]8399//923]_]]qrrrrrr^]]]]]]]]]]]qqqqqqqqqqrrrr^]]qrr^]qrrrrrrrrrr^]]]]]]]]]]]qqqqqqqqqq10^]]_]]]]]]]]]]]]]]]]]]]! # 3 3 XYP} h)b-)S@  H@ Hi6FZ&Vv9I V  9  Y       Y y 6 ) 9        t V f B $ 4         v b T 6 F $        p d @  $ 4  i  @  t P ` D        T d t 0 @ $      $ D T t 9  p  $ 4 T d       4 T    p 0 `  / ;K{??39]3]]_]]]]qqqqqrrrr^]]]qqqqqqqqrrrrrrrrr^]]]]]]]]]_]qqqqqqqqqqqqqrrrrrrrrrrrr^]]qqqrrr^]]qqq/^]]]q9^]]2+M210+_^]]+]]#3 3 HH9aA z@#dtm}[)9IrTd@ H @ H@ H @ H__?2?22+/+]33/+]3310+]]]]]])5!5!!ZVW)1@0? ??/]]q]q210!#3Wu9G@(x H IF * ??/]8]810]]]+]3i W1@?@P??/]q]q21053#5!Ws HH@/HvHy6Ffv&FVf0AH@9H9Iiy )Yi @H9&6FH"8d@P$4tK4 `p@P"/2/?3]]^]_]]]]]]qqqqqqrrrrrr^]_]+]]+]+qqqq+rrrrrrr^]]]]]]]]]qqqqqqqqqrrrrrrrrr^]]]]]qqqrr^]]]]qqqqr/^]]qqq+q+qr^]+^]qr33++]qr10_]+]+++ #3΢pry i#@``///]q105!ij/@u@@/?/]/]]10] 53WsN2A@2y==y ( H + H%%F@. o8888CG@H?G0CCCC@ #H!Q(9Q 3_/P.3P?2?3/]q9/?+]q/]3/+]222/10]+]+]]"&54>?54.#"'>323267#".'#'2>=QW:W;4T>& 8gn*;"C&3I.E\u#VU*BwZ5_kN;C^:'C3@kN+.PQp7Q64T; ?bt5Y2ZIX`3@ i1y1y#@ HIYIY@? HG@  5*F05?5p555555%P /P?2???2]]qqrr/^]22]10+]]]]+]]!"&'##>533>324.#"32>r{32z>`EGmI&&IlFB`@"Yc80" +32.#"@iM` hl C|^9Vxm}U32WvDZj3gV3{@WU"e"Z2j29I6 F  yvF@*5 Gp555555 /P%P?2?2??]]qq/]]2210]]]]]]%#"!234.453#.532>54.#"52z{2>`EGmI&&JkFB`@hZ6Zb +/* 'H<+ %05ppg0.gxsb+.fWN%k@.Z#j#ZjUeI G@'%G0''''@#HP%% PP??9/9/+q/]2]q2/10]]]3267#"4>32'.#"#IrPu=flLdo/-cT:Ug9^H--[I/ӄ;XzJb<@   3 C  @j HF/O_?;_@VdH@',H 0`@/P P??32?]]]q++qr^]q/^]322/^]310+^]##5354>32.#"3i;fQ E-(3 Iz;eK+)<'aVWK1E@Hz11ve>U e Z:j:&6&)! yv /F@2"0GF@QH=##".54>3234>734.#"32>$]f@{d=dF&;UpHg]++aos.,1Pg6EcA@bD6gR2W&Gb<KQ"KxV)K:#E͇БMia>7( +32#4.#"#3=FTd>hM0XF@gI(7M28eT/EhE#.TxK~!B8'=s@ F0@*H     p      @"%HO  S???]q+qqrrrrrrrr9/+^]3210533 :W=3@ H( HF  @?@H@P_oO??O_ o?o@TORH/?O=@58Hp@#&HOpP S???]]]qq+qrr+^]]]]+qrrr^]]qqqqr^]]]qrrr+^]]]9/^]33/210++53#"&'532>536]H"A $ &1  Z>jN-+C. @T|zvV f Yiyt D  * t  T t t 0  @i H F0 ?  ? _   ? _  9 @SVH`   `   0 @  ????9^]qqr+^]qr/^]2/+_]]q833/]83_r9310]]]]]]]]!#33 0Ima />o@4F0p@"%HOp??]]]q+qqrrrrrr/^]qr10334#N;¹* H @ H";F .F///)/Y////////v/Y///F// F   6  =======i=y=[=I=+=;========i=[=)=9== ===i=====[=M=)=9=========}=+=K=[=k=========+=K=[=k== ===@======[=k=O=;=$= ========d=K=?=+====={====o=;== =j======[=O========d===+=K=======k=4===9====t==+=K=[== ======K=[={===`====O=0=/=@="5P(P/ ?22??2?2^]]]]]_]]qqqrrrrrr^]]]]]]]qqqqqqqrrrrrrr^]]]]]]]qqqqqqqqqqqrrrrrrrrrrrr^]]]]]]]qqq_qqqqqqqrrrrrr^]]]]]]]]]]]]qqqqqqqqq/^]q2/^]]]]]qqqq9/910++!4.#"#4.'33>323>32#4.#"/L79\A#8Ka@{3294U?@gI(>RjFZT'OjA-U}QS"KC0,9;/L5,\d/VN"t@;y tvy      G@$0$$@#H$GP P??/]]+q]10^]]]]]]]]]#".5!24.#"32>q{A~u8'KlDEoN),Mi>EpN*Dӏ0FҌ~b')c{~b('bWM&:@i8y8i*y*$$$@ HIYIY@? HG@''<1F0<?<p<<<<<<,P"6P?2???2]]qqrr/^]22]10+]]]+]]]#"&'##4.'33>324.#"32>(]pt.@Re?p](;bJ73#46767#4.#"32>CgQ=?Rg)KkBEb==aFv`)3inlh3%aN>@(0! F0(H ???3+/^]q23/]1034.'33>32.#"+:P9( 0>W7>"GB:;>9>[;8cQ9K7@Ut..ok%6*4 $I##H@ 09 I @H ,HO_ `9999@*'*H?99,)P $$$$$ P` p   ?3/]q?3/]q99]]+]q/]q3/+]q2/10]]]]]]]]#".'732>54.'.54632.#";pi^rM:aF'.RuFAg@ʳ 0DU.zt+MlA+ZUK8!+LwQ+@iLWQ'A01?**EfM~*9#JK,9' #/BX*,{@W(iy( i y  Hl| Ho F  @P ?  P??]32]/^]q332/]10+]+]]q]q%#"5#53733#3267*)U8}5x3?1 ҃UN?:%y@E!*!:!F@/    'F$$$$0$$$''''''p''@ HP ?2??2+]]qr/^]q]qr310]]32>53#.5##".5:4U?@gI(>RjFZT':ROjA-U}Qs"KC0,9;/L5,\e:[@79I6F:Jiy5Egw H@> H +{DTDT@ [*  K[`DT DTDT[D K[`DT `DTgDT[D K@c[7K[? `DT `P/ ?3?3^]]]_]]]]qqqqqqqqrrrr^]]]qqqqqqqqr^]]]]]]qqqqqqr^]]]]]]]]qqqrrrr^]]]]]]]]qr/^]83/^]]]]qrr839=/3310++]_]q]]q]q]q!#3>73ew:@?D??B?:*@$:)J)z)))5Eu6F6@ H9I9 H6F@ H6 F  @3 H9I H9I H #(#X###)**@I/2HI*4*&******y*6*F*f*******f*v*9*&****@ Yiy ,,,,,y,f,T,6,F,,,,,,,,t,f,9,,$,,,,,,,i,6,F, ,,,,V,f,,9,+,,,,,,,,,,r,d,V,4,D,",,,,,,,,,v,T,d,B,4,,&,,,,,,,,,f,v,T,6,F,$,,,,@,,,,f,,,D,T,6,,,i,,,,,,t,,6,F,f,$,,,,,,,,,i,V,D,,6,,,,,,,r,`,,$,T,8,,,,,t,K,0,,$,,,,,{,4,D,d,,,,,d,,,,?,,,@(HB4")#( H-#( H-#?3]+]+?3]]]+^]_]]]]]qqqqqqqrrrrrr^]]_]]]]]]qqqqqqqqrrrrrrrr^]]]]]]]]]]qqqqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]]]]]qqqqqqqrrrrr^]]]]]]]]]]]qqqqqqqq/^]83/^]]]]]]]]qqqqqqqrrr+839=///qr33333310+_q+q+q+q+]q+]q]q]qq!#.'&'#367>7367>73ѭ Ѳ P&,/-,&RJ:!C %'&$@B"#&$C: @Hyvy7 w  zx  @;   ) 9        & F f  H @  9  @tHv d V D 6 $        v d V D 6 $          F V  @H V f v D & 6  & 6 f v  v D T d 6 $         v d   & F V g F V  d V D 6 $      & 6 F 7f  @6=BH9 "       t ` T @ 4   @"H   P p  ?3?393^]_]+qqqqqqqqqqr_rr+r^]]]qqqqqqqqr^]]]]]]]]]qqqqqqqqr^]]]]]+]qrrrrrr^]]]]]]]]]]]]]qqqqqqqq+/^]r83/+^]qqqqrr8399//8892310]]_]]]]]]]]]]]]! # 3 3 ! D,[W:@;zi HrVf@$ HYF@$!!&!6!F!f!v!!!!!!! !!!@H!!!!!&!6!F!f!v!!&!6!F!f!v!!!!!!! !!&!F!V!f!!!!!! !!!!!!!!t!`!B!R!4! !!!!!!!!!!!d!t!B!R!$!4!!!!!!!!!!!d!t!V!B!$!4!!!g!!!!!!!!d!t!V!B!$!4!!!!!!@!!!!!`!p!D!T! !0!!!!!!!!!!!`!p!D!T! !0!!!7!!!!!!`!D!T! !!!!!!!!!`!! !0!P!P!!!!/!!!  P??3333^]]]q_qqqqqrrrrrrrr^]]]]]]]]qqqqqq_qqqrrrrrrrrrrrr^]]]]]]]]]]qqqqqqqqrrrrrrrrrrrr^]qrrrr+r^]q/83/^]]]]]]8399=//3310+_]]]]]+]]]]]]]]]!#"&'5326?3>73\&ObxN": 0O3S  Ծbo;v+5ZZH APRj1:  @NYitFVf({$ ;[ @'7H@H @(\dH     t ` T @ 4 D d  @ IRH   ?D d  $ D d  3>H @'H  P p  @ HPP?2?2+^]_]++qr^]]]+]qqqqqqqqq+/++^]33/^]q33_q10]]]]]]35!5!!18j&ڋ"W-`@A H H-!( ?@! / o  O / O o  +??9/]qr9/]]q3322210++".54.'5>546;#";AcB"7P33P7?[M4G)+G3M[?W)LlDi?X88X>jkl2T@,  ,AT3jmN]@ H@ HH@Hp@H@+H0@P$$HH@Hp@ H@H0$@z}H$n@ ruHTfiH@ [^HP`@ORH@ DGH>@8=H`p@H@H@p//?^]]++qrrrr+^]+_]]+q+r+rr+^]]+qqq+q+qr+++^]]]]qq+qqqr+r_rr++^]++]]9/^]103N~"W-b( H@7 H, & 0 /oO/Oo-,??9/]qr9/]q3322210++2654>75.54&+532+5^[O3G+*F4O[<7Q44Q7"BcAmje3TA,  ,@T2dlk>X88X?DlL)\)P' @Z)90 H 0 H г H@ H p  @ &323267LEIX&A<82Q(PMK%233E{4 ;=D),-  &.  2*:@[iFV9@HIYi6  y F  9   i y &    I Y y    t V f D  & 6  @H   @H$     @@Hf   @Hb r @ P " 2   @u|H  @@ nsH  l @@>ekH   v R b $ 4 D      d t  @GKH   @=;@H  7  T d t     T d  @H@  /]?^]_]+]qqrrrrr^]]+]]+qq_qqrrrrrrr+^]+]+qqqq+qr+r^]]+]]+qqqqqqrrrr^]]]]]qqq/^]]]]+qqqq3/103##5  %i?/3Ͱ2}/%3&/ְͰܱ22ͱ22 ܰ"2 Ͱ!2 ' !"$990167#5&'&576753.'$ & ?S|e[yf|Y ^9>NN" Zx7?ZW :P2@SF6F%5$' o',n#'n_  O_o2o  0Pp0@@H& Q#?o@%*H@ H,s,t2v222?3]2?39/++^]q32/+]qr/]9/q329/3910]]]#!5>=#534>32.#"!!!2>7P 9YsCFYV0cgF{cG '5A$rph,?(&C5%7PuM%.y\f7:V994$s}~8j\G*C0qs#7@wJZj,<JZj,<E U e # 3 EUe#3J"Z"j"-"="EUe#3EUe#3JZj-=.$/9)3 /]/]]10]]]]]]]]]]]]]]]]467'7>327'#"&''7.732>54.#")%dhc6IG~6ah`%+,&dfe6~GH4iff%),Mf:9fM,,Mf9:fM,G6dge'+*&ai`6GG5die%)*&iif6I:fL,,Lf::fL--Lfv@IFJjzEeuO @\  @  Q Q/  @)-H   ??39/^]q33]+q222/^]33229]2]210]]]]]]]]!!!!#!5!7!5!3 3A}@[sw}/}yN]@    H @ H   H @H  p  @H     @+H0 @ P   $      $  H H @Hp   @ H  @H0  $   @z}H   $ n @ ruH T  fiH  @ [^HP `  @ORH   @ DGH  > @8=H ` p     @!H @H@ p   / ?/99//^]]++qrrrr+^]+_]]+q+r+rr+^]]+qqq+q+qr+++^]]]]qq+qqqr+r_rr++^]++]]9/^]321033  sTMaO@u//zdU+UkU-QmQ-9m9}99U`u``S>s>>SZsZZyPPoPZP-Pt6F*I%*%-+$$ LLIK"I7KK7K7NFAIINN N@NNN!HN@HN-I,,XIA AAA@D"&HA7777ySjSSSwhS]72Q-' Q?2/39]]]]]]qq]]]]]]]/+]3//++]q29999//r10]]]]]]]]]]]]]]]]]]]]]]]2.#"#".'732>54.'.54>7.5464.'>LOlI.DT.}2Sm;DpF7R61O7:pk]uO 6Nd9:fL-9_{AAhA ;T5*K9!5Xq=:Y<1Rl<6]D'?bE-:" OG-@. .IjL-WI7 3@Q3IuS,@hM7C% (A/6H3$.IiJ-SG5.@P00E3#!4E'.B0"/F-Z{H@ H@H@H;- 9,0H+{o[O;/?@H@H/++]_qqqqqqqqqqrr+_rrrrrrr^]]]32/++++1053!53ӥø1[@oQ II*I EE*EL<9/I/6(F(6$F$9IZZ5QEQ:=446.F.6)F)9#I#9I2Q=_GoGG=G=0@ @@DH&o<7BWLRLBBBBBBBBLLLpLLLLBLBL!+??99//]q]q33/q/+]q99//]310]]]]]]]]]]]]q]]q#".54>324.#"32>%32>7#".54>32.#"4^dc^44^dq\-RtWccWtR-!CdC1K8's:RoKeb00abKpP7r &7H/Ec@d^44^dd^4rVsR-c䂃b-QsYHxV0-7#+Q?&@r^ao;$;K'!2&.Sv2A@-( H.( H( H H@ H3'' / 88@H8d8t88P88@ H8?@&HCC@3 H9 99 H   #33** P?3/]3/]29/]]3+]]]+]/+3//+_]]]+q332/]10+++++".54>?54.#"'>323267#".'#'2>=5V>!3Vq>'8#CQ +KlGDmM*#  *)9&&30P9 )J7 :8R4E\8<.<#;L /R>#<_B:2h'3MFo"7G%A 4+8AS q@Tj z j z jzjz_  @ `   _ ` /o/]32/]qq/]]q10]]]]%53 !53 vRTPQm?sm?sdG3@ P@ H?/+]]]/]]10%!5!1?H==$=:@^ H9/I/6(F(6$F$9I= H6.F.6)F)9#I#9IEE3>>E?E56@;;2??6?6?0@ @@<H&o226>4E DDD7666777p76E77E6!+??9///]q]]23//q/+]q99//833/293]10]]]]+]]]]+]#".54>324.#"32>##!24&+3264^dc^44^dq\-RtWccWtR-Rǡ3hUݟ_QPTd^44^dd^4rVsR-c䂃b-QsP?~of{PEHU| ///10!5!|s^z\'B H @! H H H   #?/]10++++#".54>324.#"32>-Ni;;hN..Nh;;iN-m0A&%A00A%&A0y;hM--Mh;54&#"'>32!+XdgR4GJDX.LkDAgG%6Sf_N3g=`QHIP1>KID3W@%!dVKIJ*q'5@ffV f Y"i"*@P H H0--- ` `"### @%H1 i"H"X""( G  ?3]?3]]9/9/+]3/q/]q2/9/910++]]]]#".'732654.+532>54&#"'>32WtI$ XUMS%8C=9=2 JGDT2Of;EhF#VZ4K0t'@Q+ CEHL-6 m 5(3!tpqP`52_W3#-XYT]2f~&@@&H/+]/^]1053wN~@ H HFV H@> H 0/o@ H P`p/]/9/+/]^]qr9/3]210++]++#"&'532>54&#*73AhK-1%)8#=HAk'^^)C0b %(dQP3} K@, 0`   0o ?2?33/3/]3/]/]2/]10]535733P{3klxk#  H @+ H  H  H$4d@& H@!H%p%%/% P ?3/]]]]/+/+]_]]q10++++#"&54>324.#"32>Ӱ+WX]T'2H00K33F+1K4ɾ[e55d\SnABnRTnBBnS @deue u eueu   p  ? o    p?  /o/]32/]]]q/]]]qqr10]]]]%#5 53#5 53ΨRRݪROot?ot?8N&y'@ p `   ?55]]]]58u&y'r/@o/ p `   3@ H?5+]]]]5]]5IN' 's.!@p`S@ H?55+]]]5V:%)@pyz##z$$Td:Jz H '''((F_@733267#".#5%>ORO?''>NPM<%*MmC Cyzr{@q2GlUC<:DS7EhP?99FX;;\? z TpA8gdR&$N&%+5+5R&$@ &L%+5+5R&$`@ &%+5+5R&$^@ &,%+5+5R&$l@ &%+55+55R&$P@ 8%+55?55@VtrVfsUem\)    Z_ _ _ _???29/9//3323/399/]99//q10]]]]]]]]]!!#!!!!!#! E !d<#2:3&3hNy&&x :0(%+5&(? &  %+5+5&(@  &(  %+5+5&(w & %+5+5&(y & %+55+55 &,&%+5+56&,F@ &E%+5+5h&,@ & %+5+54&,@ &%+55+55e!p@Eu [ [Z[  Z@#Z___??9/q32/33/2q9/10]]]]]]]3!2#!#%4.#!!!!2>ңojR{j:oN!`Q]H˂=9H &1@ & +%+5+5a&2(&ش), %+5+5a&2%@ (&%(+ %+5+5a&2@ )&.( %+5+5a&2(&1? %+5+5a&2(&,* %+55+55s H@H H HH@HHH@HH H@H /q/]]q10++++++++++++ 7   bh^^i`fJb`g_iiaG'3@Y,%T!e{lZi   tcU2[2r++T+&T&U%JZzd k ,([@5 5([ +#/_#_ ?3?399/]]]]q9910]]]]]]]]]]]]]]]]]]]]]]]#"&'#7&546$32734&'32>%.#"_QxXV\}RyUW11;;]{;23;\~?ǥh:6a  e86^pH,/V}qKU*.P)&8&%+5+5)&8@ &%%+5+5)&8@ & %+5+5)&8&%+55+55-)&<@  &A %+5+5_@?t{Z0 @ Z@__    ??99///^]22/]]q10]]]#!#3!24&#!!2>;y{b}|>RyO&XxG54.#"#4>32)W^P7CJN%\b6Q_Q6!1:1!!?Z9DkI'?xnfi5!3:3!7R_R7'BsU1 VO8M>9IbI3I:04?+%>-#MzXvp6.Pm>=ZE5/0&;9@UrWs&DCB&CF$%+5+5Ws&DtT@ B& BE$%+5+5Ws&DKC&HB$%+5+5Ws&DRB&KY$%+5+5Ws{&DiB&ʴFD$%+55+55Wss&DPG&ȴLB$%+55+55BN>OX@`6z${:ueDuDD|VjV~QjQeu)/),( H 5XF!OOO_OOOOP I =G@P/P?PPPZ,G-@H--GG@ H>PPP5@+I5SP8?Q!!J2,+,,,'P2JPP   ?3/]]?2?3/]]9/?2+9//+3/+]q2/9/]329910]+]]]]]]]]]]]]3267# #"&54>?54.#"'>32>32%32>5%.#""FmNu=flfJf]&C[ku<9X=6X@' :ip1?jo/P(QLB1d]ZS(-`Q6Rb7^H--[I/3]G*GlN3 ;C^:'C3@kN+FEJAXz3I3Wa?bt5īJbWNN&Fx (0( %+5W&HC&&'*%+5+5W&Htp@ &&T&)%+5+5W&HK@ '&,&%+5+5W{&Hi@ &&*(%+55+55 &C&´%+5+5/&t?@ &?%+5+5i&K@ & %+5+55{&i@ &%+55+55V''9@^d3d8k*k0 %5E22#G(@ (@H((((;2G-P P  @ HR$4D  5P??99//]]]+]33/9/]]q9/9+99/]910]]]]]]]".54>32.'57.'3%4.#"32>6}v84tGu++sL8xB-S*2QX/9x!GqPQsI!QvK$IokK VEr^-N#3p\JyzĊJ^Z,-\[,Z&QR@ &&/=$%+5+5V&RC#&$'%+5+5V&Rtg@ #&I#&%+5+5V&RK@ $&)#%+5+5V&RR@ #& ,:%+5+5V{&Ri@ #&'%%+55+55A$u K@0 _ ?_o @O?]]/]/]]]9/3210535!53ި,\"-@]u!!uz&&z,,BMDK &#G@/#G   @  ////// //@ H%)PP?3?399+]]]q/^]q]q9910]]]]]]]]]#"&'#7.5!2734&'32>%.#"XaEpN*%hBEoN)02tDt0.-iEwDm,1''b~U1-$)c&XC&&'*$%+5+5&XtW@ &&5&)$%+5+5&XK'&,&$%+5+5{&Xi&&*($%+55+55W&\t@  &6 #%+5+5W"6m@Lf4v4i&y&IYF V )&G@##8-!F""0"""!2P(P ??2?2?/^]22]10]]]]]]33>32#"&'##4.#"32>@Re?p]((]pt.;bJ54.#"52z{2,>`EGmI&&JkFB`@hZ6Zb +/* )'H<+ %05ppg0.gxsb+.f&(MzN & %+5+5WS&HM@ &&'&%+5+5&( & %+5+5W&HN@ &&+7%+5+5&(O% &  %+5+5W&HOD &(%+5U&(QP ´ %+5WUN&HQ} 22 %+5&(o & %+5+5W&HL&&(.%+5+5g&*@ /&"4.#%+5+5VW&JK@ G&LF)%+5+5g&*@ .&'3;#%+5+5VW&JN@ F&KW)%+5+5g&*O5%@ .&'.0#%+5+5VW&JO- FH)%+5gN&*N .2.#%+5VW &J8O&FJ)%+5+5 &+@  &  %+5+5>&K@#&(" %+5+5@H ZZ ;8DD0p @$H/_ P`_@ ?2?39/]q]2222]+]q/^]_]qqqrrr^]]3322/^]332210!!##5353!533#5!fs- )@B H! F@P   + $F0++++++p++@H#Q  P H?+2?3?9/32+]]qr/^]q3322]q910^]+>32#4.#"##5353!!=FTd>hM0XF@gI(,Y7M28eTWEhE#.TxK!B8'&,@ & %+5+5&R@ & %+5+5 1&,MN@ &%+5+5 1S&M@ &%+5+5l&,@ & %+5+5l&N@ & %+5+5\U&,Q %+5U}&LQ@ %+5]|&,O'%@ &%+5+5v:@F$ 4 @7H@4 t`@H$4HHH@&Hdt uy|HnqH@cfH0$CFH >@ 8;H@*-0H+k{@ 0 @@ H??^]+]]q_qqqr+r+^]+qqqq+++^]qqqq+r++^]+]]]]+qqqqrrrrrrr+^]]9/^]1033´:I&,-W&LM@o0]55]]]55 &-7@ &%+5+5W/@ H( H@1 H;@ H$F   $ D  @ H@H@3H@P_o 0@O@9H_ /?o?o@eORH/?O=@58Hp@#&HOp@/? P??/]3/]]]qq+qrr+^]]]]+qrrr^]]qqqq+r^]]]qqrr+++^]_]9/^]3//]+]q+]10++_]]"&'532>53#'##53M"A $ &1 6]ihW+C.@>jN-nN?&.ʹ  %+5N&NN  %+5: @H{tV f {YiC :* z,  p  P   @( H F0 ?  ?2?39]]/^]2/+]q839/]893310]]]]]]]]]]]!#33 0Il~: //&/&^ %+5+5[>&ON@ &K%+5+5N/&/ %+5~NG&O%+5/&/@  %+5?5i&O$KA@@H@H@HH@ H@ H  %+5?5++++++/&/O _%+5&OOBT%+5/ w@1ydtVV Z  @` H @H    _??9/]]9++/]q/3210qrqr]]!!573%hyUU f@*'' F @ p  @H H O??9/]9++]]]9/^]332210qq35737zz||DDXHGz &1@ &I%+5+5&Qt@ &&a&)$%+5+5N &1%+5NN&Q[ *&$%+5 &1&%+5+5&QL&&(.$%+5+5P&Qb 47@5)))0 H/@[ H*6:6663'Z@3Z@Pp0P0'_-! _?2/???2/^]]]qr/]29/]310]++]]]".'732>54.#"#4.'33>328`O?%d;@N) 'QW^yF"gV|p5V(6s-A:k_Blb.>iMD%\ZL?EE=eF'@̋ВNWN5@y44Z4j4+4;4K4.@J H..1F@ `    7%F @%P+P????2/^]qr2]qqr9/10]+]]]"&'532>54.#"#4.'33>32"A $ &1 4U?@gI(>RjFZT'6]W+C.OjA-U}QS"KC0,9;/L5,\d>jN-a&2MN@ (&)( %+5+5VS&RM@ #&$#%+5+5a&2@ (&-5 %+5+5V&RN@ #&(4%+5+5a&2@ (&](1 %+55+55V"&RS @ #&g#,%+55+55a1@w f i V0Y*T//T/ ++[+Z" 0"/"O"?"_""""""@&H" -[    3___(__????9/]/]]/]/+]q99//]29910]]]]]]]]!#"$&546$32!!!!!%267."#"399Y^:94Lo L %%}}?@~j b<WJ΃єPV2N';D@fvaUZBjBl=Z=E:U:e:E4U4e4J0Z0j0J*Z*j*I &G@32%4.#"32>%.#".#IrPu=fl=?ɉqDuCwo/?*MnDErQ-/Ql>ErQ,-cT:Ug9^H--[I/[\]ZDӏ^SXz'~b')c{~b('b᫝Jbh&5&"%+5+5&Ut@  &J #%+5+5Nh&5#%+5NN&U^$ %+5h&5f&!'%+5+58&UL8 &"(%+5+5]-&6tI@ @&[@C%+5+59&Vt9@ 8&]8; %+5+5]&6KrG@ A&F@%+5+59&VK@ 9&>8 %+5+5]N&6x (H@%+59NK&Vx @8 %+5]&6s@ @&BH%+5+59&VL@ 8&:@ %+5+5.N'x[7N*,&xGW.&7!& %+5+5&WK%+55.e@>     /  @H Z   _ _  ??9/322/]32+]q9+M9_^]10!!#!5!!5!&8P@ &$%+55+55s&XP@ +&0&$%+55+55)&8@ &Q#%+55+55&XS@ &&d&/$%+55+55U)&8Q (g''%3H3H3H++++5U:&XQW 22%+5 &:y0&5/.%+5+5&ZK,&1+*%+5+5-)&<[ & %+5+5W&\K@ !&& %+5+5-)&<h@  & %+55+55A&=@  &J %+5+51&]t5@  &] %+5+5A&=O|%@  & %+5+51&]O  %+5A&=8@  & %+5+51&]L & %+5+5}س H@8 Ho  F0p@"%HOpP??]]q+qqrrrrrrrr/^]2/]10++!#4>32.#">;fQ E-(3 ;eK+)<'N@kzYiy U e u 6 &&"2r%5P&6F  _ P  Q //]9/32/q333qqq/10]]]]]]]]]]].#"3###737>32>.!  (GmQ R#  (@--;fL+ R>'=C$@z@@fvVf@ H H H  & '  (DBBB>2>>>/ >>  Zjz 0 EPEE0E`EEEE/E U e u  >>-p9@@@@@@ H@ '&&  9?999 /3//]]]39/32/+]9/]3//3]]]]q3/]q3]]939///]q]q]]310]+++]]]#!#&'.54>32.'!4.#"32>573&!á~$!&&BX22XB&$11$$ 1$p-O Ds O--O;"";O$J<))>I$_w,!!,,# #,#Ws>&D'PUtcZ#@e&jm$%ԴLB$%+55+5+55&& %+5+5B&t@ Y&IY\=%+5+5G&K@ 4&I47 %+5+5,&t@ .&^.1%+5+5]N'69NK')V.N'7N*,&sW B@v x@ H@/?/]3/]+]10]]#'##53ih B@vx@ H@/?/]2/]+]10]]#53373hi3XSQ@;[k4D H@!H/?@H@H/++]_q++/]]]/]q10!5!X%wI@3O@@73)JtT2u'8H**G8&u 2St3Up=+;$$;*=pU3 P@ @HS?/+1053 3s'Y@ H  H H@* H@_  #/?O/]]/]10++++#".54>324.#"32>&BX22XB&&BX22XB&l$11$$11$2XB&&BX22XA&&AX21$$11&&1PUL@7 H  H H _ @ H  P`p/]q/+/]q210+++#"&54>733267G(ij"054+1-:p fU/O=* -;F'*0 M@ H  H))9Yi@H@H Щ 9@H{I@H6}o-=M H[k{H &fvn@@`emHpRb@"2Rbr$4Ddt@ <@H;@95:Hdt0@P$p@HTdt@ H@ $'H@!HD0 @+ H @@H/?/]2+]q3//]+]q_qq+q++]]+]qqqrrrrr+_^]+]]]]]qqqqqqqqqrrrrrr+^]]]]]]]q+qq+qrrrrrr^]+]qqqq+qrrr^]++]q10++".#"#>3232673*TNG76 [-J;,TNE67\+J%-%>9-_N2%-%?8,_N3 o@R f bb @?O@)H@H/?/]22/++]^]q10]]]]]]53353@@+ H) *+@p @`/]_]]/]10_]]+53E!$%A S@5 H *//     ?/]]33/2/]/]9/q]10]+53%53!53EؖB!p%R&$Tl|^ %$$HHHHHH@ H@ H?5+++++++++]5~ @ H@!HtVfD&6@Ht@$HvTd@"HFVv4&H@%Hdt6FV$@HVf$4D@w|HRb 0@p@ goHDTcfH\_HW[H@QVH$4D@CFH0$<@ 8;H@)-0H  0 H/+]]]q_qqqr+rr+^]]]+]]q++++r+^]]_]+]qqq+qqqrrrr++^]]]]]+qqqqqr+rrrr+^]]]]]]+]q+/1053'(T(|1@ q@%//]]]]5+]]5?5 '+T%|_HHHH@ Hq@%o/]]]]5+]]5?5+++++U',T|\ H @ H @ H @ Hf@%o_O//]]]]]]]5+]]5?5++++&2T|'@ *((^@ (( %/]55+]]5?5A'<Tt|@@H@H@H@HH@H@H@H@HH@H@H@H@HH@H@H@H@HH@H@H@H@H@H@H@H@H@HH@H@HHHHHHHHHHHHHHHHHHHHH~~H}}H@||H@{{H@zzHyyHxxHwwHvvH@uuHttH@ssHrrH@qqH@ppH@ooHnnH@mmHllHkkH@jjHiiH@hhH@ggH@ffHeeH@ddH@ccHbbH@aaH@``H@__H@^^H@]]H\\H@[[HZZH@YYHXXH@WWH@VVH@UUH@TTH@SSHRRHQQHPPHOOH@NNH@MMH@LLHKKHJJHIIH@HHHGGHFFHEEHDDHCCHBBH@AAH@@H??H>>H==H<@::55%_]]]]qqq5+]]5?5+A&U<@ @H@HHH@H@H@H@HHH@H@H@H@H@H@H@HH@H@H@H@HH@H@H@H@HH@H@H@H@H@ H@wwH@ssH@nnH@mmH@jjH@eeH@ddH@``H^^H@]]H@WWH@VVH@UUHTTH@ OOH@JJH@==H@88H@77H@66H@33H22H11H@00H@**H@))H@((H$$H##H@""H@H@H@HHH@H@ H@H@ H&ܴ %+555+555++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++R$%/8@(Z@0P @`_??/^]q/]10!#/8=@jzeuYV H@@ HFfvIiy _O0@H0/_ H  ?3]+?2]]/+]3/]]]]qqq39=/3310]]]]++]]]]1073!%.'># ^(RE01FR((A= +a'+@i fYV VZU *+ %%Z%!!U! +*[;o0 @P[     +_((#_#_- -]]??9//]]]/^]qqqqqrr^]9910^]]]]]]]]]]]#"$&546$324.#"32>%!!_X\\A{~?A{{;Kǥhm  efДPPәUVР|,?. N@ t{ H6  @ H HH9o0/%5*:  % 5    *:  0o0v?2?3]/]]q2]qq/]3]qq9=/3]qq3]qq]]]]10]+++]+]]%#.'&'#3N|   z?/Y#)%')#Y- 0 1Z K@1R _0 @p _ __??9//]q3/]q39910q!!!5!5}9\a2 O@(Z@Z@o   @ H_?2?+]q/]/^]10!!#!ax 3l @i t WgTd t F V f 9ggd'   0 P `  F   _  _?2?92/]]]33/3qq/^]]99//]qq3qqqqr10]]]]]]]]q]35 5!!!lmCC|.7-)<u(3 H H H@H H)Z {Zt#Z/$Dt5D555555p5`55@ H#.`  "1`  ??99//3232+]_]]qq/]q3322]]10+++++#5#".54>;53324&+32>%;#"@ŅSSŃ@CɇHGʅC08\Y++Y\84iTTiqHHu5bXXb5.+;#@ZjUeZjZjJE Zd#Z Zkd4Dd%$%4%D%%%%%%%%%`%p%T%@%%@ H"`??339/]32+_]]]]]]q/^]]qq3]q2]q10_]]]]]]!#".53;332>53+SɆC/]\88_[-DɄSTh-Pd9I9dP1hTUW9@[e$e111 H    Ht66v68v8t7767** )50( `(p((o(("[P55@EH55055[O_o 0_; '0*_)_??32]/^]]]qqr/]]+r99//]]3310]]]]]]]]+]]+]]]]267>;!5>54.#"!532.54>Z;mc*'!G`Y*=tlmt=*Y`G!'*cm;ZVj63~Ut|AA|tU~36jV4&,@ &%+55+55-) r@  H@ H @ i6FZ&Vv9IV 9Y Yy6)9 tVfB$4vbT6F$pd@$4i@tP`D Tdt0@$$DTt9p$4Td4Tp0`/  _  @ H ;K{??39]3/+]32]]_]]]]qqqqqrrrr^]]]qqqqqqqqrrrrrrrrr^]]]]]]]]]_]qqqqqqqqqqqqqrrrrrrrrrrrr^]]qqqrrr^]]qqq/^]]]q9^]]2+M2/10+_^]]+]]#3 3%53!53 ӥHH9ayVe&~T!@ <&73#.'32>7.#"KAWoFEpV? .'$  ;]B6dR= -GfFB`@8^E&'E]68?A/:gn'BA:1pg04klVsD.fWI >@D{z<<jzfvJ2Z2j2%eu%0H400@0`00@:H0404H@0+@++++++@! F00P11&9P !&P ?32??9/9/^]2]q99//+]q910]]]]]]]]]]#"&'##463232>54.#5>54.#"I5oxf8cf5#=Q.9r[8GQW+HnI&&QYq9W73#>7z0:]?C?>C?-o|A[V2@Qsjv..j.ZjZjU e r&r3C22G@.//)4 G))/P@HHoZ.0P$??99]]++2/]]q9/9932/10]]]]]]]]]]]]4.'32>".'#".54>75!`1ELIf<#IoMQpE *-) <6fO1@{sr}BI`UsVQr[L`76_7tanHDspa!SwFjN9@1%5$E$7"*% H **F000##@%0HH@B H;5G?O_@%+H;;_;0P//O/_////////'P$ P ?3?39/]q9]q/+]+++2/99//910]+]]]]]]%2>7#".54>75.54>32.#"3"6`O?i TjN`\-*H`63U="2_WvC/}K[`7aKHmB4Jr08d'G5 .TtE:_E*(@V3>jM,VcXGDUJ9F% (PE-E.V`8@u&77'|'''usd$$$$9,,<Ld666&6V6///G!(22 O@!H @2/P@H!!!!!!!0/?9]]]]+32/^]+]q2/3/9/q10]]]]]]]]]]]]]]'>54.'.54>75#!5!+Jd96oZ: ~  $B^9*YRI61Uq@ "$" >{lQ/{@O1"9XD"D>38 !&'"-! $2JdCSDFjXN#d @. H#F@P% F   0  %%p%%@H#P ???2?+]]q/^]q2]q10+4.#"#4&'33>3294U?@gI(  >RjFZT'XVOjA-U}QSDy*01//L5,\dj %@l |$$sUe|JZjsEUe     !G@@-0H' G #H0''@#H'P P P??9/]+q/+]2+q310^]]]]]]]]]]]]]]]]]#".5322>7!"!. lv>yp6*>dI*,G^B>cH*#(Ea\uy]4ؤׁ43~ԡ~3:  @ F  _o o `@P`p?p?Oj`p?`7/?o???^]]]qqrrr^]]qqqrrr^]]]]qqrrr^]]]qqrr^]]]qq9/^]q2103.53 5@F!N @<4: @r f v iyV  T F      @  F0 ?  ?2?39]]/^]2/^]q839/893q310]]]]]]]]]!#33 0Im: /!<@esjz  e u fv~lTeuVT@; HTdt]mIeu&V*:Jz  !@E!??__@#0#`### !P ??399]/^]]]]qr83/839/9910]]]]]]]]]]+]]]_]]]]]_]]_]]_]]]]]]]]]]]]'.#"'>32#.'#$*-9( #H 7WIC$cIiC $Q_A8;8<>7w:)l@7 (HZj#F"_"""""" ""+F0`+++@H)"P ?32/?3?+]/^]2^]]q210]+!.5##"&'##332>53^8EV9Rx ;bJCdC!.;;3O5@: ?|EtU/4[~Ki"LC1:#@OWgw H F@[ k { [    ; [ k  @  K[`DT DTDT[D K[`DT `DTgDT[D K[@]7K[? `DT `P/ ?3?3^]]]_]]]]qqqqqqqqrrrr^]]]qqqqqqqqr^]]]]]]qqqqqqr^]]]]]]]]qqqrrrr^]]]]]]]]qr/83^]]qr239=/+3310]_]]]#3654&'3?jMz7|Nc^:`VQw--qVjJ@}zGGe!u!!i'U2S,9nB~BBB*B , ( H II,IlI|II _%O%p%%%_o%4?F   ???O?o?????? ????@ H?*G%P *@ H*H4*9 $$$9P?22/9/]9]+]+999/]/+]q99//]22/]r3/]qr910]+]]]]]]]]]4>75.54>75+5!'>54.'.V3n}DvW32Oa/ DPLJzMpD@]@( } ";ZC?Q1 6YT@O1"9XD"D>38 !&'"-! $2JdVNRO+:0s@#5 u (H(H.P ` . #F@oP@& H22/2 HO_o"P(P???22/22]2]+]q22]/10++]".5!#>="5>3!#32>7f;R4n$' 'OE5 +36% #E;^BHJL}P  S,8  W;O/@@zeujzj-z-K[k}kJZG@1&F0011@#H1`11 P+P???]]+q/^]q2]10]]]]]]]]#".'##4>324.#"32>;?sb>bPB54.'.54>32.F6XC1  L|\5r_= ~  #Da?Bq^H2.KnaDcI6t*191Phlj*D`H9%;YD"D>38 !&',$(3D]zQ/lB",w$V:/@^ z .e.u.d*t**|!!Z!j!&l&|&J&Z&oG@ @1(G  #P+P??2/]]q^]10]]]]]]]]]]#".54>3!#".'4.'#"32>0={{{|?V~9 #+,7+"-YSk=NuL&pLJʁҊB*csNJtc*2in4a:#c@2#  H - F" """$%O%%%%%@ HP#P ?2?+]]]q9/]]33/10]+]"5>3!!32>7#".5'OE5 +36D #E+;R4  S,8  ;^B:q@>jzV)G@/! F  0  !!p!!@ H! P??3]+]]q/^]]qr210]]]]]#".5332>54.'35q{mh3uIhA!(( ;ښR2ktc2lxDx)(qUWR#-@e"e!u!!JZEU- H@6 H @PG $G+H@@/P'P+P??32?3/q/]32q2/]10]++]]]]#.54>746324&#">Jnr}C1gmE`<T\1WPDL5׌GiHύfgMrPDLyӁXP@3{T{Zj)9 H@c HtEUe&6'7GeuV'7;[{D $ @)HF5}K[k? P?3??9]]_]]]]+]]/833//^]]q833/3910]]]_]]]]]]]]++]]]]]]]]]]]%#.#"'>323 #,(* "> 0F<;$i9W6R7 >fKGW,<@Zy Hyy   Hy FFH!!!o! !!P!!!!P ??32?33/]]qqq/^]3210]+]]+]%>53#.533.W|P%;||;&O|WwIy[|zn5k5nzzZyI SO?@S!!wz:: %%*%%% *I==(. . 3G@A3G?((A0AAA@ #HAAA A@A#>>8P#. P-?32?329/9]]+]qr/]^]]99//9/910]]]]]]32>54.'7#".'##".54>732>=3srfAW5=aCmg15e_DhM44MiC_e51gmD`>4VA3R98fZRyTpeȉH$Dc@@cD$HȀe¡pTyRZf8-T{N{&i&ٴ %+55+55{&i &$" %+55+55V&RT)@ #&F#&%+5+5&T@  & # %+5+5S&T@ @&7@C(%+5+5&(yHHHHHHHHHHHHH@ H & %+55+55++++++++++++++.O-@ e%u%%@G H H* : $4 *'Z-((( Z*_+&!_(+(_??3/]??9/322/^]/]]29/10]]++]]>32#".'7326=4&#"#!5!!m5)V\5XK@o)08!TP3{xi! ]d5 .{!eowz  圜/&aq@ &! %+5+5hy*@''')))u u IF % 5 *:D,[tD+%dt@0_ "O&&&_" _ 0@p?3/]q?3/]9/q/^]_]]q3/]]]q29/]10_]]]]]]]]]]]]]]"!!32>7#"$&546$32.o|I r MmZlO(l{V[.GDfD~npH2Ri7MOd9m  e<2[F*]6|,4&,@ &%+55+55 h- &/@b9   :  y t///{(((e  H+{*zZ0'''' $ 4  @HI$4@'H I !,Z+_!!__,_???9//2/]3q+qq+q/^]q10]]+]]]]]]]]]]]]]#!!#"&'532>7!!24&#!!26 =yy`1+1oWp@ljU%>k:i\yn@t{&6Z@+ H Z  @  Z__   _???39/3//^]32/^]2/+]10]]]#!!#3!3!24&#!!26=yy¿>V}|>GWp@sT:i\y./@ eu@L H%5E Z  0  Z0p _ _ ?2?29/32]]qr/^]/]]310]+]]!4&#"#!5!!>32q5tnb#$bpv8?zm  圜 &@ &% %+5+57:&^J@ &'%+5+5h ^@@ \ Z0@@Z@    _/?3?3/]]q/^]/]]qq9/10!3!3!""hhR$@Ft{& ZP @ Z@0@#H_@    __??9/]q]+q/^]2/]]]]qqq2/10]]]]#!!!!24&#!!26=yy!~}|>oWp@H:i\y%/ahE@_ srfU e ZjaS5E\Z_$4@ H$4@H \/__/3?22?]/3+q+q/^]]]]2/10]]]]]]]]_]_]]]]]]%3#!#3>7!!2)B7,CԺ1(.6 h83Aݲ3(G)H@)uucl|l|e u !(H@#H:J)5Eu'0H(8H @ H' 7 G H@I H H H" (Z) ) 4)t))))!  @ H  D t  +  @3D+t+++/++"'`/ )!?33?339/]q329933]_]]/]83/]]]]+83/]q39/93329/93310++++]+]+]_]]]++]]]]]]]".'#&'3332>73###R-0.U0BZLQ99QLZB0U.0- U#c{DkD{c1f# {Cp<@3!|pp`eu"e"u"| Z j ;K!@z H+3Z.@%H..8Z$$$_o$$pOo0@ -H@ H3_ )#@ H##_) _ 0p H?2/+]q?3/+9/q9/++]/]]]]qq99//]_]q2/+910_]+]]]]]]]_]]_]]]".'732>54&+532654.#"'>32mv^$B[yPMzU-GG'HhAMrS8!`ilx@(Ih?CuW3E2[OM7bK,%Ed@vw{7V;(DZ1=RW-5`SDkP7 2RsI_q>{@@A H  H \)  @ P    0  \/   ?22/?33/]/^]2q/]]]q3q10++]]]]333#46767ުd3b'.('Y&,,Z:&J@ &! %+5+5@hT t TzYi H:d t P 5 E    `  Z    /  / `/ ?2?39/]29]/]q83/]29/]893310]]]]+]]]]]]32>73###9QLZB0U.0-D{c1f# {@#uUsUe@. H%5jzZ @_$4@HI$4@H I __ ???]/3q+qq+q/^]]]q10]]]+]]]]]]]]!#"&'532>7!#^1+1k0 +a2nX H H H H H H H H H @ H++++++++++3hy&.77@oZjz)UeFdtVyTdFqVf:J  ?Oo@ _?2?3/99/8]22/8]39910]]]]]]]]]]]]]]]]]]]]]]#".'732>?3 3/QZmK B@:Q#S0%:59&1>XR( %4ZDYv(3@\FVfIYi;3;5+&+5'&')ZZ#Z.O  5p555O55$/`  "1`  ??99//3232]]]q/]]]332210]]]]]]]]+#5#".54>;53324&+32>%;#"@Ņ((Ń@CɇʅC \Y+W+Y\ iTTiqHHu5bXXb5.+;h J@/\ Z@pZ@   _/?2/?3/]/^]/]]q2/10%#!3!3Ŵ@F( H H*:JZ0@po@ Z   @   @H_/  ?3/?9/]32+]q/^]]/]]]]qqq310]++]#".5332>73#$^ks8rl45nh\# /\YR{l  r@LZ Z$ {dZD    p @   _?2/?33]]_]]]]]/^]/]]]]]qq9/1033!3!3h/}@T{T\Z Z ; K [ {     o   Z   _/?2/2/?33/]/^]]]]_]]q9/2/]]]10%#!3!3!3/-ӺҺ.d@Dt{&@Z/ @Z  _ __ ??9//]2/^]]]q]10]]]]!2#!!5!4&#!!26B}|>=yy5s3-:iZWp@ym@Lt{ & Z@PpZ @ Z@@ H_ _?3/?3/9/+]/^]2/]]]q/]]10]]]]#!3!24&#!!263=yy~}|>oWp@:i\yk@Lt{ & Z @` Z@_ _??9/]]/^]2/]]]q10]]]]#!3!24&#!!26=yy~}|>oWp@:i`yiy*@Qssesesee e jZ!!  Z  (($$&[ #p####@##@? H#P` #_&&&& _ 0@pO_ ?3/]?3/]q9/q/]]q3/+]]]q39/10]]]]]]]]]]]]]]"'6$32#".'732>7!5!.XfEG.[Vvq)QmWmM r I|*F[2324.#"32>ZZٿ* c蒟W3!#!3!!"`[T'B~xI%MwS;LxT,_NlC^h7I9bH)?^WsNDx?8@E,z--fvTT [Z#z##Z/j//{..I.i.**G@:0:::@ #H4 G @#H4P*0)@)))P?/]q39/2/+]9+]q]q2/10]]]]]]]]]]4.#"32>2#".54>7>7>'IhAErQ,,Mi>EpN*q{A:Γ9d[V+V[N|^C,Ca~r[%'\prY$$XFs   !2Ile7aH):$/@ *%*@! H  &,GG@/1@11@2#H1?11&F0 $Q&&&&&%PP??9/q9/^]q2]+q]q9/9]10+]]]2#!32>54.+32>54&#4LpD#hQ5Q:% #=Z=NuN':K,C/2F,'=+RL:6@#@'H0F0P??/^]q3/]+10!#:I:h:@A f"r"""yfv""b$DTI @*H F@o @ I PP  /3?22?/3333]]2/+10]]]]]]]]]]]]]]]]!!#!#3>7!3B100Fңw::9ˆ2h2;IWNHS:'a@X"  ZjzUeuJ!!!E*:% 5 " &F'  ' @1 ''!     P ?    _  0  @@/?)))o))P)?) ))))O)_)0)"@% H%PO_O '!?33?339/^]q3299+33]]]]qqqqqqr/]qr83/]]]]qqqqqqr839/39/8933]29/893]310]]]]]]]]]]]]]]"&'#.'3332>?3###SAaB-ؼ0A4004A0-BaA PUBEM\2&2\MBU #1^N7@55&&%&--F((3G I@@V$H    99I@ H-P#P#P`p ?2/]]q?3/]q9/q9/+]]]q99//]+2/9q10]]"&'732654.#52>54&#"'>32ʧ-~g`q7\x@@rV1c]#F<* >aNUb5,GX-8dK+1e},NV^[;N-&C4JV!7*Db?*Lh?9X=$)C]:EwW1:@  @k7#<Ŭ:MRJe9<9:&@ &!%+5+5:@u9y @{ H x /OI8 yG 6   F09I  O0/ P?O??2/?3/9/^]q2/8]]]]]qr3q/]29/89qq3]3qq]10]]]+]]32>?3###04A0-BaA:&2\MBU # :@*tUeu&frdV@= Ht HF@@`p6@H  PP ???/]3]]+3q3]]qr]10+]]+]]]]]]]]]]]!!#"&'532>7!h*,3G^A0 &#3(!"&ؕ]**^:@ k{d t @z7!#4>7% # <=9,:k?HH?<@<: @0F@O9/o    @1H F   0  P? ?2?39/^]qr/]q2+]qr]qr^]210!3#!#B紴:6:VNR:m@PF@O9/o   / F0P?3?/^]q]]qr]qr^]10#!#Ǵ/:I:WMSWNF#:H@+F _ 0 @ / P?2?]]]]9/^]]+M10!!#!#d:IW:\VW>5J_@ ]]]NHHH9HmR3@K H/  H 6G@ KG$DU' HA&$Dd4aa@4#HaTadaaa@a a0aaa&-PFP1[;P ??32?32?]]]_]]]+q/^]q3322]+M10_^]+]+]+++]#"&'##467##"3234.533>3232>754.#"4.#"32>>&Vei*.op-.reV&8U<<^A""@^=9V9n4X@5\F(#A\54&+ 4hggE`;tpJvR,61G.^W2: i H@: HG F@ F @  Q   O    Q ?3?39/^]q/]2]9/10++2#!332>54&+3&4hggE`;t<pJvR,:61G.^W ::  H@V HG@//?_@#'H F  @  Q   O   Q ??9/^]q/]q2+]qr]10++2#!332>54&+84hgUE`;tpJvR,:61G.^W7N(@Wv"vkk  G@    *FF@ H P  P$ `p@"H$/@ HP?3/+]?3/+]9/q/+qr3/]q29/]10]]]]]732>7!5!.#"'>32#".7dIgD"c"CgImv Bi]ZQ3rcj=; lh5aRZX,i[DtT05أx͗V6\zN'@Uy%%t!!vyG G@) F   0  P P/  #P???9/]?/^]q2]9/^]310]]]]]#".'##33!24.#"32>fsA޴!׽#Ca=?cF%'F^8>dF&>:6~b')c{~b('b: @Du H (+H %H4+)0 H  HG  F@   @[kQ/Q  ?3?9/]2/]83]q39/9310++]]q+q++] #.5463!##";Xvxk|6z\]^]W{&Hi@ &&*(%+55+55 W9@ 1 H@V H$$9F@P---; 9F0;;;;;;p;;;9(P!3P Q H??+9/322??]]qr/^]q3322]q9/10^]++]3#5353!!3>32#"&'532>54.#",FTd>hM6]H"A $ &1 0XF@gI(!B8'7M28eT>jN-+C.EhE#.TxK&t@ &U %+5+5WN(@qtt/*?$F#F$ $$@$`$$$$$$GP P /@ H  P## #`#p#####"H##?2/+]?3/+]9/q/]2/^]q3/9/]]10]]]]".54>32.#"!!32674r3QZ]iB vmIgC"c#DgJd =jVx؀50TtD[i,XZRa5gm Cz\69KV=&OԵ @88H @ 77H @66H 55H @ 44H @22H 11H @ 00H @**H ))H @ ((H @&&H %%H $$H ##H @""H @H @ H11H@ ()H@HH@ H%+5+]++++55++++++++++++++++++%{&i&%+55+55W=M :"-*@Ruj9Huj 9  H W g w  Hm Hu6F H@ H"#F@  G))@  H)/P//@]#H/0/m  ?       ?  j )  5   -Q"""""O""" P P#Q ???9/^]q/3]]qq]q]]]]]qq]]+q+]9/]210++]]]+q+]]+qq]]+qq]]]2#!!#"&'532>7!32>54&+M4hg>e*,3G^A0 &#3(!"&E`;tpJvR,ؕ]**^61G.^W,: H@ HF G@!P!!@2#H!F @Q POQ ?2??9/^]q3//]2]+q]9/3210++32#!!#3!32>54&+4hgfNE`;t:6JvR,:6E1G.^W )@U H! F@P   +# F0++++++p+++#Q  P H?+2?3?9/32]]qr/^]q3322]q910^]+>32#4.#"##5353!!=FTd>hM0XF@gI(,Y7M28eTWEhE#.TxK!B8'&t?@ &Q%+5+5W&\@  & %-%+5+5h: }@Y I O & F@O9/o F0  p  P/3?3/]qr/^]q]qr^]9/^]1033!3!#:Ih7@%Z@F@_??3/^]]/]103!# 8@$I0 F0P???/^]q3/]10!#!3!B٣8: &:A/&03.%+5+5&ZCH+&,/*%+5+5 &:@ /&K/2.%+5+5&Zt&@ +&]+.*%+5+5 &:@ /&31.%+55+55{&Zi@ +&/-*%+55+55-)&<" & %+5+5W&\Ci &!$%+5+5[Op/Ͱ/ܰͰ015![Р[Op/Ͱ/ܰͰ015![РrL+@?O/?o@&+H/+]q//105!rÉL+@?O/?o@&+H/+]q//105!ÉL+@?O/?o@&+H/+]q//105!ÉN&BBH /@ H@ H @  H ?/+2+10+54>733 y-2Y4VKB AAH 4 H  H @  H  ?/+3+10+#>5#53H {-1X5VKB A?H 3 H  H @  H  //+3+10+%#>5#53H {-1X35WKB AA~G /@ H@ H @  H  ?/+2+10+##.=AX1-{ ?A BKV5K_ Y@: H H@ H @ H    ?32/2]/^]]2+2+10++54>733!54>733 z-1X y-2Y4VKB AAÒ4VKB AAK_ k H@ H  @ H    @ H?  ?32/2]/]3+^]]2+10++#>5#53#>5#53_ y-1X {-1X5VKB AAÑ5VKB AAK_ h H@ H  @ H    @ H  /32/2/]/3+^]]2+10++%#>5#53#>5#53_ y-1X {-1X35WKB AAÐ5WKB AAv @@%  /o  /?/]q33/22/10#53%s`arxsV@2      ?//]3/3322/21053%%%%#5hihixxGQ|I H @' H H H?  0/]]]/]]]10++++#".54>32|-Lf:9cK++Kc9:fL-:fM,,Mf:9dJ++Jd V@= 0`0@`/ /3322/]]/^]q9/10!53!53!53(7+?Sg{@ vyf@ H` H\ HV H>@ H8 H4 H. H@ H H  H@  HJ;1@v y 1f@&@@@@@@rcYihh&hhhhvhYhFh)hhhhhyhkhVh9hhh&h h " )IYy"@-1H@H}}}}y}k}]}I};}-} }}}}}}}}}}}i}[}M}6})} }}}}}}}}}{}f}K}=} }}}}}}k}}]}9}+}} }}}}}}{}}Y} };}K}}}}}}{}}f};}K} }}}}}}}}i}y}]}9}I}+}}}}}@}}{}f}I}6} }}i}}}}}y}k}I};}} }}}}}}}y}[}k}9}}+}}}}}}y}k}9}&} }8}}}}}}Y}F})}}}}}}}}{}d}K}?}}}}}}}}p}_}@}}}mTw^E,O6'?????^]]]]]]]_]]]qqqqqqq_qqqqqrrrrrrrrrr^]]]]]]]]]qqqqqqqqqqrrrrrrrrrrr^]]]]]]]]]]qqqqqqqqqqrrrrrrrrr^]]]]]qqqqqqqqqrrrrrrrrrr^]]]]]]]]]]]]]qqqqqqqqqqq/++^]/^]]]]]]]qqqqqqqrr9/]q99//^]]883310++++++++++++_]]!#3%2#".54>4.#"32>2#".54>4.#"32>2#".54>4.#"32>0?lP..Qn%7#&:''8%"6'?lP..Qn%7#&:''8%"6'?lP..Qn%7#&:''8%"6' !SjfV&%VgjS!Ib:;aIGa;;a!SjfV&%VgjS!Ib:;aIGa;;a!SjfV&%VgjS!Ib:;aIGa;;aUzY(@ H H/0?/]]10++3U@ĞzUz&V `]5XQH@7jzjzO_0@`p/o/]/]q10]]%53 PQm?sYRB@0eueupo/o/]/]]q10]]%#5 53RQot?G&@ //]55]55T ///10!5!+u`b-o@@ H@ H??/++]8/]810!#3qe!o@ H $  !$ @& HK[@H@H/?/_]]]++]3/]+]22/]/]210+4.#"#4.533>32 /#HUw&1@*na.=%d^.("# . lyO.j@E  0Pp \  Q   _?O? _ ??9/^]]q]q22/3322/]q99//10!!!!##53!gQn{$Ձ:P:@Q::%5(,0 o4n+'0n O_o:o  0Pp0@FH*Q. Q+  @*-H   'o/_o4#s)4t%:::?3]]2?3]9/]q3]+]222/+^]qr/]9/33229/339910]]#!5>=#535#5354>32.#"!!!!!2>7P 9YsCFYV0cgF{cG '5A$rphh,?(&C5%7PuM%.y\f7:V994$s}8j\G*C0g/b@Gu[[[IkIIDmD[DiRiP}[k}[kT9d969F9%a5aEaL H1@^ H H -RIQQ0HAF'K%)H" 9I8f888YHK_?K_KKK@'H_KK@APA`AAAA@ HAF d[_HdPXHdFJHd;>Hd05Hd@ HOd_dodd HY@GHAHYAN54.'.54632.#"=yy+}|>iq{#J0i]ho5n)7(跪Ky\=cX(D1">W41`M/-6 9P00dR4\uD=oaԒ {zŃbNIbx6X@=: () 5O;pwit& U$ 6WV=@DIj&:+J+z++$;4;D;t;;.779-3n%n$$n@`@^H0Q9Q6@'/H-/?/?/(s%|%%%*%%ss% ?3]]?3]]]9/]qr3]+q222/+]q3//3/229/10]]]+%267#".'#73.5467#73>32.#"!!!!dx ?gaxyE (x(I{sag? yjDjO2 (c(l *Mr~d[DvW2Mr.5zC2WvD[d'Wc/%Qd9E+O@vy/B@  H< H H @ H H HJII45?@>,?@ H?"  P`&441:MJD'????33]/]/+99//883/3310++++++]]]#".54>32#34.#"32>3267#".54>32.#"3WtBBsU10VuDBsU2;+?(*@,+?)'?,/K6E^ -MoH^R&;a|ADjL0 SKlW}i--h~g))g1cN !Nb_O""O|K|Z2RW 6cL-Ey`g*(F^7 HU~'7@ 5(HH@CH H H( (`(p((((((333##  "&H @ H O93- "-/?9/9/9999]/++]3]2^]3/]]q2/310]]+++++]%2673#"&=5>74>324.#">3DExmo B"#B;bH4O5,OnB *s( '1M6Nhm IK;lS1*NoEcv&9S64U=!$=Q.!h.#7;@| H= r E U e  & !!%!  /=:I$I9.I$$$/$$$ I0@P )$H@H 3999@#,H98 @$H @H 8?3++/+]?33++?/]q22/]]]99//]]332]10]]]]]]]]]]+]!#3&'.53#"&54>324.#"32>5!&06+WX]T'/E-.G00C).H2{,,&Y'XR(.'b3ɾ[e55d\Qk@@kPRl??lz'/@ H @HYiy% H@I H,)*@@//**@*P**'%o(, * *P***%-?33]22/]3/]]9/]210++]+]+5#.'&'#367>53##5!l (z @&,7  3)"hool9@_e$e111 H    Ht66v68v8t7767** )50(  (`(p((/o(("[55@AH555055[?Oo0 '0*_)_??32/^]]q/]]+r99//]]3310]]]]]]]]+]]+]]]]267>;!5>54.#"!532.54>Z;mc*'!G`Y*=tlmt=*Y`G!'*cm;ZVj63~Ut|AA|tU~36jVX|H -R@2Z @!!_!P!`!p!!/ /---' ?2]]?9//]2]]qq210]".54>32!32>7.#"kƆE__pŽQ@NX.Kt]L#H$Tm;M\53WJ<"]oՋBO҂-#73!;H:RR:H;)"bADp*$*pDAb"V@ @ /299/105>73.'#"bADp*$*pDAb"V;H:RR:H;#d^D@  //29910.'3#>7!5;H:RR:H;#"bADp*$*pDAb"V@ @ /299/10%>7#.'53+"bADp*$*pDAb"V;H:RR:H;d^D$@@ //29929910#.'5>73!.'3#>7;H:RR:H;;H:RR:H;)"bADp*$*pDAb""bADp*$*pDAb"&@@@ /299299/105>73.'>7#.'5"bADp*$*pDAb""bADp*$*pDAb";H:RR:H;;H:RR:H;H#(@#  /299299/3210!!5>73.'>7#.'5 "bADp*$*pDAb""bADp*$*pDAb"hPX;H:RR:H;;H:RR:H;8/E@]z!!DHUeJZzJ8Z8C8 H:C* : J %-5--- '0'''00(00F@`@@H@ HG323>54&#"7>32.#"32>  `a]N#/IfS*M@2;:7$*tCq^)$3@$5VC1 *A,BlS8.hjj0ΐM?kK32>32%"32>54..#"326],RsFaF KTZ.EsS.,RtG^CKT^3ErQ-Fw83wM+G33G]3wN+F10G/FxNNj>?fH'7dYQh<>fI(7e~(F^66\E'(F^63]E)~` //103!!^j8^#@K[K[ //3//10]]4>32#4.#"Dzbc{Fg5_NN^4tLLtbl98ldN#@ ""*"% %%%%%%@HL%/%?% %%@H%@H%%)%9% %%%%@Hk%{%%]%K%)%9%% %%%Hm%%H %%H%y%%%K%[%k%%H%%%}%%k%]%&%6%F%%%%%%p%@nwzH%@ekH%v%% %%)%%%@ORH%JNH%)% %%%%%%%%%54>32.#"$$K>#3B'2Z}K"K=$3B'2Y|N %@T0^V( (AT,B^V)8P,!C@$ H HA HB0 H=0 H*г H0@ H H 0 H0 H Hг HгH@) H?0P@`- @ H /E;@-#@)(1 1011@ '323267"&'.#"5>323267(EIAk-&A<82Q(PMK%233E{4 ;=D(EIAk-&A<82Q(PMK%233E{4 ;=D+ !%/  3+Z,  &.  2* A7$@l5: < *      dtP0 `o  _ o   /_o P   /]]3]22222/]q3/]q_qq3910_]]]]##5!!5!3!!!7 =X!l$ܔdGP 1@  ??/]/]9//33/33105!5!5!d8d?$ {@H(H(H@?H 0P @`@ HO_@PP/]33]]//+3//]q310]+]+++5 5!AZw쑑A$ y@H(H(H@>H 0P @`@ H@PO_P/]]]33//+3/]q310]+]+++75 55!AZXXu7 #@i y iy///10]]3 %! {RVdG////107!!d>T"  H  ///10+#47632#"'.'&#"TR?K3% !$ V{{?0(4 ''#i  H ///10+3#".54>3232765"Z(g>2%!%}86'"%)j%?33105! %iH??103#ؑHK"??310!!#(in"??3105!# (%%H"??3103!!Hn%H"??3105!3 %H' ???23103!!#iHnnH'???33105!3# %K( ?2?33105!!# i%n%H( ?3?33105!3! %nH 3  @  ?32??3223105!3!!# i%nnqj% ??3233105!5! AّH*A ?2?3103#3#ّhHK Kj 1  ???23310!!!!#(iijב" 3     ?3?2310!###בnn#j ? A    ??3?3310!!#!!#htjo"j 1    ???333105!5!5!# i(qב) 4A    ?2?33105!### ܑב%nj ? A    ??3?3310#!5#!5!ґttj)F)ޑqH 1   ???233103!!!!iH"ב%H 4 A    ?3?33103!!33A$Hn#nqH ?  A    ?2??33103!!3!!ّK$hH"qH 2    ???332105!5!5!3 iqב)%H 4A    ?3?3310!5!333$ב%nqH ?A      ??3?3310!5!3!3!5!$KqFH 6    ????2233103!!!!#iiH"ב"H 8     ??3?323103!!#3#AHnn KH I A     ?3?3??223310#3!!#3!!jt " "H 8  @   ????3322105!5!5!3# iqבKH ;A   @ ??3?332105!3#3# 㑑h%K#KH I  A     ?3??3?2233103#3!5!#!5!A㑑tHK )ޑj 9     ?2??3333105!!#5! iiq"h :   @  ?22?333105!!### ב%nnj J    ?3?32?333310#!5!3!!#!5jtttAޑ"בqH :@     ?3??3333105!3!5! Aّ"%H :  @  ?33?333105!333! ב%nnqH L@  A      ?3?32?3333103!!3!5!5!AH"oHL  @    ?32?32??33222233105!5!5!3!!!!# iiiqב"ב"HM  @     ?3?3322?3322223103!!###!5!33AבHnnnnH ]     ?3?32?3?3222332233103!!#!5!3!!#3!5!AבttH"ޑ" mH/?3310!!Umm?/3310!!UH??3310!!U H??/310!!* H??/310!!* *g #'+/37;?CGKOSW[_cgkosw{1mUE- y@ xlTD, xeM5@ dL4qYA)}@ |pX@(|aQ9 @ `P8u]=%@!t\<$x||xiI1!@hH0 gckhd`h_[WT\XTSOKHPLHC?GD@.)'.@D%T%K![!K[DT #//10]]]]4>32#".732>54.#"Fz^^{GG{^^zFV9bLLc::cLLb9d^{GG{^^zFFz^Lc99cLLc::c# /]/102#"'&5467>76jnk5RS4l9R46n9:m64R9) //103!32>54.#")Ex[[xEEx[[xE}A[xEEx[[xEEx)+"@" '//103!4>32#".'32>54.#")Q:cKKc::cKKc:MEx[[xEEx[[xE}AKc::cKKc::cK[xEEx[[xEExscu" //10#"'.5476324'&#"3276c%%%V3eK#%HJfgGJL33FF3331HH13}5V%#%H%V5fHJJGgF3333FE6116y!-9D@] $ t $t+{+{D"(?4.(.(.1%+7+>:h:Y:G:::b^0H[[׀ؙٙW .. -- .. --#_[)4`@7*/$'!04h4Y4K4=442-_oO-_--- /99//]^]3]]]]332/99//3310#"'&54676324&#"326%4&#"326327'#"'ZZZZ. -- ., // ,0^b>LLH[[ -- .. -- ..[_#Fs;3F/@ H4.4$w##@M H H;;  H;/4#4;B p ?   9+>0/43?3O33/^]]]]]/]]]]10]]]]+]]++]]]+373#'#5.''7.'#5367'7>7"327654'.B 965--,,(17:"B?n0+(. P(9p6Eu0bb0uE`cc1u;  -;q9>_1(,=20db2/aac02P&/b@>++++""""P'''@%(H /+^]2qr/]32/qr]qr9/3210.'&547>32!!#!5!"327654&'&7Z#GS,e>SW;=>B.*PlzS++VSzmQR FF;G,+G>>=T,G;QAQF@(1A;NN?  33FF;A1?J777B??/^]]]99/r]]r9910.'.'.547>323267632#"'.'#"'&547632"327654'&6%( ? .@$    TVWvvWTTUzGSZ>==@XY<>><      "O-@" '*R*Qm}VXTTuuWV+ >=X[===>ZW>>;/(@& 0 ` p  "@ H"O_/]//+3/]/10#"'!727>'#"'&547>7>76 (_E#%?BXc$&}V+B,-SZB?N9En&86_,+i?~BCF_?BWVc %%1E[wK`_B?[J;*U/;q9S<K/@9M?4=C /)//99//]923/]10)7>7>7654&5#"&'&547632.'.547>3267>32#"&'.'FTl)@4:Z+X-;a)OII]P3N(a2+C.=#!K2dmy;*&StsOP"4&sN&(PNmVb(%)LtvSP<3=-Q}.-L'fZy'&@) @ P p  ///]10^]].'.'.'.547632>32b*gL8E+%DFfbN/"X2U#F)N7>-qEEt/'xSEj( #&b<^Q2P;`N]]5(o]H: 9Pwc;kM;!0@! @O_o! //]9/9/]2103#>54&'&'#"&547632L3:0./9@%%Hl9:Q0*%#Jj9:;b&J5-L9<guv#dC  @; H#F/  O o  O_Fo"SP P ?3?32???/]]2/]/]q3210+]##5354>32.#"3533i;fQ E-(3 ӆIz;eK+)<'ai:wZC  @5 HF/OoO_FoP P?3?32??/]]2/]/]q10+]##5354>32.#"33i;fQ E-(3 ӇIz;eK+)<'aI4wNK H@( H_?O  P`p/]/]/]q9/10++#"&'532>54&#*732AhK-1%)8#=H>4T< )C0b %(`)?w8@ o_]]]5NH K H@ H  `@ !H   /]+]q/310++#>5#53H,(u-1XWk/0V.3 l@JV V y@32|&IlFBeJ, '6$GVQK3M!r[6CgE$CAhJ(!;Q0/$U]QU%q!'Gf+4x6@!  `` ??2/]]q3/]9/10#4>7!5!x@jM+/Pk<4MalfXq-('QD H@@R H/ H+ HL7G H===222FGGG( ` `L8# B#-??]]9/99/]q2/q/]]3/q99]10++++4.#"32>4.#"32>7#".54>75.54>32 5)'5 6-06 #=1-;$$=..="#IqMMqJ#/= $7&#FhDHiE!&8$$?.0""0/''04()5#;**<6[B%%BZ6.H4 %4@#-O;"#@)u u I  I@  /?/]2/]10]]".'332673ToQ h]]h Q9[s9g``g9s[9|E $@ P` ?]q/310#>5#53E,(u-1XWu/0`.K /@  _oP  ?   /]q]q/21046733#,(u-1X%Wu/0`.j0@u@@@H_@ H/+]+/]]10]%53H4@"z@@O@H_@ H/+]+/]]10]573H A@v x@ H@@H_@ H/+]3+/+]10]]#'##573ih A@vx@ H@@H_@ H/+]+2/+]10]]#'53373hi-Z#@_@ H/+]32/1053!53ӥDYi@" H  H@ @_@ H/+]23/]]10++]".#"#>3232673*TNG76 [-J;,TNE67\+J%-%>9-_N2%-%?8,_N3  X@<f bb @@ H@H_@ H/+]2+2/+^]q10]]]]]5733573 7@  d @ @H _@ H/+]+2/^]10^]]".'3326734JtT2um[[ku 2St)EZ15<=41ZE)V H$7<V_biqrxh$$7h$9h$:$?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a bcdefghjikmlnoqprsutvwxzy{}|~     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni00A0uni00ADuni037Euni00B2uni00B3uni00B5uni2219uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni02C9tonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdanuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveuni2010uni2011 afii00208 underscoredbl quotereversedminutesecond exclamdbluni203Euni2215uni207FlirapesetaEuro afii61248 afii61289 afii61352uni2126 estimated oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbseuni2206 orthogonal intersection equivalencehouse revlogicalnot integraltp integralbtSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxH22073H18543H18551 filledrecttriaguptriagrttriagdntriaglfcircleH18533 invbullet invcircle openbullet smileface invsmilefacesunfemalemalespadeclubheartdiamond musicalnotemusicalnotedbluniFB01uniFB02uniF005middotuniF004uni2074uni2075uni2077uni2078glyph571glyph572glyph573glyph574glyph575glyph576glyph577glyph578glyph579glyph580glyph581 LNDFLTcyrl$grek.latn8 TbDFLTcyrl&grek2latn>kernpi 2@^p4r|&Tv.8,:dR>TZ`6  . < b 0 H j  @ R  , > l .p(FLZ $7<V_biqrxh 7h9h: