teeworlds-0.6.2+dfsg/0000755000175000017500000000000012141202017013434 5ustar felixfelixteeworlds-0.6.2+dfsg/.gitignore0000644000175000017500000000036412140200333015425 0ustar felixfelixbam .bam config.lua datasrc/__pycache__ datasrc/*.pyc objs src/game/generated SDL.dll freetype.dll autoexec.cfg crapnet* dilate* fake_server* map_resave* map_version* mastersrv* packetgen* teeworlds* teeworlds_srv* tileset_border* versionsrv* teeworlds-0.6.2+dfsg/bam.lua0000644000175000017500000003521212140200333014677 0ustar felixfelixCheckVersion("0.4") Import("configure.lua") Import("other/sdl/sdl.lua") Import("other/freetype/freetype.lua") --- Setup Config ------- config = NewConfig() config:Add(OptCCompiler("compiler")) config:Add(OptTestCompileC("stackprotector", "int main(){return 0;}", "-fstack-protector -fstack-protector-all")) config:Add(OptTestCompileC("minmacosxsdk", "int main(){return 0;}", "-mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk")) config:Add(OptTestCompileC("macosxppc", "int main(){return 0;}", "-arch ppc")) config:Add(OptLibrary("zlib", "zlib.h", false)) config:Add(SDL.OptFind("sdl", true)) config:Add(FreeType.OptFind("freetype", true)) config:Finalize("config.lua") -- data compiler function Script(name) if family == "windows" then return str_replace(name, "/", "\\") end return "python " .. name end function CHash(output, ...) local inputs = TableFlatten({...}) output = Path(output) -- compile all the files local cmd = Script("scripts/cmd5.py") .. " " for index, inname in ipairs(inputs) do cmd = cmd .. Path(inname) .. " " end cmd = cmd .. " > " .. output AddJob(output, "cmd5 " .. output, cmd) for index, inname in ipairs(inputs) do AddDependency(output, inname) end AddDependency(output, "scripts/cmd5.py") return output end --[[ function DuplicateDirectoryStructure(orgpath, srcpath, dstpath) for _,v in pairs(CollectDirs(srcpath .. "/")) do MakeDirectory(dstpath .. "/" .. string.sub(v, string.len(orgpath)+2)) DuplicateDirectoryStructure(orgpath, v, dstpath) end end DuplicateDirectoryStructure("src", "src", "objs") ]] function ResCompile(scriptfile) scriptfile = Path(scriptfile) if config.compiler.driver == "cl" then output = PathBase(scriptfile) .. ".res" AddJob(output, "rc " .. scriptfile, "rc /fo " .. output .. " " .. scriptfile) elseif config.compiler.driver == "gcc" then output = PathBase(scriptfile) .. ".coff" AddJob(output, "windres " .. scriptfile, "windres -i " .. scriptfile .. " -o " .. output) end AddDependency(output, scriptfile) return output end function Dat2c(datafile, sourcefile, arrayname) datafile = Path(datafile) sourcefile = Path(sourcefile) AddJob( sourcefile, "dat2c " .. PathFilename(sourcefile) .. " = " .. PathFilename(datafile), Script("scripts/dat2c.py").. "\" " .. sourcefile .. " " .. datafile .. " " .. arrayname ) AddDependency(sourcefile, datafile) return sourcefile end function ContentCompile(action, output) output = Path(output) AddJob( output, action .. " > " .. output, --Script("datasrc/compile.py") .. "\" ".. Path(output) .. " " .. action Script("datasrc/compile.py") .. " " .. action .. " > " .. Path(output) ) AddDependency(output, Path("datasrc/content.py")) -- do this more proper AddDependency(output, Path("datasrc/network.py")) AddDependency(output, Path("datasrc/compile.py")) AddDependency(output, Path("datasrc/datatypes.py")) return output end -- Content Compile network_source = ContentCompile("network_source", "src/game/generated/protocol.cpp") network_header = ContentCompile("network_header", "src/game/generated/protocol.h") client_content_source = ContentCompile("client_content_source", "src/game/generated/client_data.cpp") client_content_header = ContentCompile("client_content_header", "src/game/generated/client_data.h") server_content_source = ContentCompile("server_content_source", "src/game/generated/server_data.cpp") server_content_header = ContentCompile("server_content_header", "src/game/generated/server_data.h") AddDependency(network_source, network_header) AddDependency(client_content_source, client_content_header) AddDependency(server_content_source, server_content_header) nethash = CHash("src/game/generated/nethash.cpp", "src/engine/shared/protocol.h", "src/game/generated/protocol.h", "src/game/tuning.h", "src/game/gamecore.cpp", network_header) client_link_other = {} client_depends = {} server_link_other = {} if family == "windows" then if platform == "win32" then table.insert(client_depends, CopyToDirectory(".", "other\\freetype\\lib32\\freetype.dll")) table.insert(client_depends, CopyToDirectory(".", "other\\sdl\\lib32\\SDL.dll")) else table.insert(client_depends, CopyToDirectory(".", "other\\freetype\\lib64\\freetype.dll")) table.insert(client_depends, CopyToDirectory(".", "other\\sdl\\lib64\\SDL.dll")) end if config.compiler.driver == "cl" then client_link_other = {ResCompile("other/icons/teeworlds_cl.rc")} server_link_other = {ResCompile("other/icons/teeworlds_srv_cl.rc")} elseif config.compiler.driver == "gcc" then client_link_other = {ResCompile("other/icons/teeworlds_gcc.rc")} server_link_other = {ResCompile("other/icons/teeworlds_srv_gcc.rc")} end end function Intermediate_Output(settings, input) return "objs/" .. string.sub(PathBase(input), string.len("src/")+1) .. settings.config_ext end function build(settings) -- apply compiler settings config.compiler:Apply(settings) --settings.objdir = Path("objs") settings.cc.Output = Intermediate_Output if config.compiler.driver == "cl" then settings.cc.flags:Add("/wd4244") else settings.cc.flags:Add("-Wall", "-fno-exceptions") if family == "windows" then -- disable visibility attribute support for gcc on windows settings.cc.defines:Add("NO_VIZ") elseif platform == "macosx" then settings.cc.flags:Add("-mmacosx-version-min=10.5") settings.link.flags:Add("-mmacosx-version-min=10.5") if config.minmacosxsdk.value == 1 then settings.cc.flags:Add("-isysroot /Developer/SDKs/MacOSX10.5.sdk") settings.link.flags:Add("-isysroot /Developer/SDKs/MacOSX10.5.sdk") end elseif config.stackprotector.value == 1 then settings.cc.flags:Add("-fstack-protector", "-fstack-protector-all") settings.link.flags:Add("-fstack-protector", "-fstack-protector-all") end end -- set some platform specific settings settings.cc.includes:Add("src") if family == "unix" then if platform == "macosx" then settings.link.frameworks:Add("Carbon") settings.link.frameworks:Add("AppKit") else settings.link.libs:Add("pthread") end if platform == "solaris" then settings.link.flags:Add("-lsocket") settings.link.flags:Add("-lnsl") end elseif family == "windows" then settings.link.libs:Add("gdi32") settings.link.libs:Add("user32") settings.link.libs:Add("ws2_32") settings.link.libs:Add("ole32") settings.link.libs:Add("shell32") end -- compile zlib if needed if config.zlib.value == 1 then settings.link.libs:Add("z") if config.zlib.include_path then settings.cc.includes:Add(config.zlib.include_path) end zlib = {} else zlib = Compile(settings, Collect("src/engine/external/zlib/*.c")) settings.cc.includes:Add("src/engine/external/zlib") end -- build the small libraries wavpack = Compile(settings, Collect("src/engine/external/wavpack/*.c")) pnglite = Compile(settings, Collect("src/engine/external/pnglite/*.c")) -- build game components engine_settings = settings:Copy() server_settings = engine_settings:Copy() client_settings = engine_settings:Copy() launcher_settings = engine_settings:Copy() if family == "unix" then if platform == "macosx" then client_settings.link.frameworks:Add("OpenGL") client_settings.link.frameworks:Add("AGL") client_settings.link.frameworks:Add("Carbon") client_settings.link.frameworks:Add("Cocoa") launcher_settings.link.frameworks:Add("Cocoa") else client_settings.link.libs:Add("X11") client_settings.link.libs:Add("GL") client_settings.link.libs:Add("GLU") end elseif family == "windows" then client_settings.link.libs:Add("opengl32") client_settings.link.libs:Add("glu32") client_settings.link.libs:Add("winmm") end -- apply sdl settings config.sdl:Apply(client_settings) -- apply freetype settings config.freetype:Apply(client_settings) engine = Compile(engine_settings, Collect("src/engine/shared/*.cpp", "src/base/*.c")) client = Compile(client_settings, Collect("src/engine/client/*.cpp")) server = Compile(server_settings, Collect("src/engine/server/*.cpp")) versionserver = Compile(settings, Collect("src/versionsrv/*.cpp")) masterserver = Compile(settings, Collect("src/mastersrv/*.cpp")) game_shared = Compile(settings, Collect("src/game/*.cpp"), nethash, network_source) game_client = Compile(settings, CollectRecursive("src/game/client/*.cpp"), client_content_source) game_server = Compile(settings, CollectRecursive("src/game/server/*.cpp"), server_content_source) game_editor = Compile(settings, Collect("src/game/editor/*.cpp")) -- build tools (TODO: fix this so we don't get double _d_d stuff) tools_src = Collect("src/tools/*.cpp", "src/tools/*.c") client_osxlaunch = {} server_osxlaunch = {} if platform == "macosx" then client_osxlaunch = Compile(client_settings, "src/osxlaunch/client.m") server_osxlaunch = Compile(launcher_settings, "src/osxlaunch/server.m") end tools = {} for i,v in ipairs(tools_src) do toolname = PathFilename(PathBase(v)) tools[i] = Link(settings, toolname, Compile(settings, v), engine, zlib, pnglite) end -- build client, server, version server and master server client_exe = Link(client_settings, "teeworlds", game_shared, game_client, engine, client, game_editor, zlib, pnglite, wavpack, client_link_other, client_osxlaunch) server_exe = Link(server_settings, "teeworlds_srv", engine, server, game_shared, game_server, zlib, server_link_other) serverlaunch = {} if platform == "macosx" then serverlaunch = Link(launcher_settings, "serverlaunch", server_osxlaunch) end versionserver_exe = Link(server_settings, "versionsrv", versionserver, engine, zlib) masterserver_exe = Link(server_settings, "mastersrv", masterserver, engine, zlib) -- make targets c = PseudoTarget("client".."_"..settings.config_name, client_exe, client_depends) s = PseudoTarget("server".."_"..settings.config_name, server_exe, serverlaunch) g = PseudoTarget("game".."_"..settings.config_name, client_exe, server_exe) v = PseudoTarget("versionserver".."_"..settings.config_name, versionserver_exe) m = PseudoTarget("masterserver".."_"..settings.config_name, masterserver_exe) t = PseudoTarget("tools".."_"..settings.config_name, tools) all = PseudoTarget(settings.config_name, c, s, v, m, t) return all end debug_settings = NewSettings() debug_settings.config_name = "debug" debug_settings.config_ext = "_d" debug_settings.debug = 1 debug_settings.optimize = 0 debug_settings.cc.defines:Add("CONF_DEBUG") release_settings = NewSettings() release_settings.config_name = "release" release_settings.config_ext = "" release_settings.debug = 0 release_settings.optimize = 1 release_settings.cc.defines:Add("CONF_RELEASE") if platform == "macosx" then debug_settings_ppc = debug_settings:Copy() debug_settings_ppc.config_name = "debug_ppc" debug_settings_ppc.config_ext = "_ppc_d" debug_settings_ppc.cc.flags:Add("-arch ppc") debug_settings_ppc.link.flags:Add("-arch ppc") debug_settings_ppc.cc.defines:Add("CONF_DEBUG") release_settings_ppc = release_settings:Copy() release_settings_ppc.config_name = "release_ppc" release_settings_ppc.config_ext = "_ppc" release_settings_ppc.cc.flags:Add("-arch ppc") release_settings_ppc.link.flags:Add("-arch ppc") release_settings_ppc.cc.defines:Add("CONF_RELEASE") ppc_d = build(debug_settings_ppc) ppc_r = build(release_settings_ppc) if arch == "ia32" or arch == "amd64" then debug_settings_x86 = debug_settings:Copy() debug_settings_x86.config_name = "debug_x86" debug_settings_x86.config_ext = "_x86_d" debug_settings_x86.cc.flags:Add("-arch i386") debug_settings_x86.link.flags:Add("-arch i386") debug_settings_x86.cc.defines:Add("CONF_DEBUG") release_settings_x86 = release_settings:Copy() release_settings_x86.config_name = "release_x86" release_settings_x86.config_ext = "_x86" release_settings_x86.cc.flags:Add("-arch i386") release_settings_x86.link.flags:Add("-arch i386") release_settings_x86.cc.defines:Add("CONF_RELEASE") x86_d = build(debug_settings_x86) x86_r = build(release_settings_x86) end if arch == "amd64" then debug_settings_x86_64 = debug_settings:Copy() debug_settings_x86_64.config_name = "debug_x86_64" debug_settings_x86_64.config_ext = "_x86_64_d" debug_settings_x86_64.cc.flags:Add("-arch x86_64") debug_settings_x86_64.link.flags:Add("-arch x86_64") debug_settings_x86_64.cc.defines:Add("CONF_DEBUG") release_settings_x86_64 = release_settings:Copy() release_settings_x86_64.config_name = "release_x86_64" release_settings_x86_64.config_ext = "_x86_64" release_settings_x86_64.cc.flags:Add("-arch x86_64") release_settings_x86_64.link.flags:Add("-arch x86_64") release_settings_x86_64.cc.defines:Add("CONF_RELEASE") x86_64_d = build(debug_settings_x86_64) x86_64_r = build(release_settings_x86_64) end DefaultTarget("game_debug_x86") if config.macosxppc.value == 1 then if arch == "ia32" then PseudoTarget("release", ppc_r, x86_r) PseudoTarget("debug", ppc_d, x86_d) PseudoTarget("server_release", "server_release_ppc", "server_release_x86") PseudoTarget("server_debug", "server_debug_ppc", "server_debug_x86") PseudoTarget("client_release", "client_release_ppc", "client_release_x86") PseudoTarget("client_debug", "client_debug_ppc", "client_debug_x86") elseif arch == "amd64" then PseudoTarget("release", ppc_r, x86_r, x86_64_r) PseudoTarget("debug", ppc_d, x86_d, x86_64_d) PseudoTarget("server_release", "server_release_ppc", "server_release_x86", "server_release_x86_64") PseudoTarget("server_debug", "server_debug_ppc", "server_debug_x86", "server_debug_x86_64") PseudoTarget("client_release", "client_release_ppc", "client_release_x86", "client_release_x86_64") PseudoTarget("client_debug", "client_debug_ppc", "client_debug_x86", "client_debug_x86_64") else PseudoTarget("release", ppc_r) PseudoTarget("debug", ppc_d) PseudoTarget("server_release", "server_release_ppc") PseudoTarget("server_debug", "server_debug_ppc") PseudoTarget("client_release", "client_release_ppc") PseudoTarget("client_debug", "client_debug_ppc") end else if arch == "ia32" then PseudoTarget("release", x86_r) PseudoTarget("debug", x86_d) PseudoTarget("server_release", "server_release_x86") PseudoTarget("server_debug", "server_debug_x86") PseudoTarget("client_release", "client_release_x86") PseudoTarget("client_debug", "client_debug_x86") elseif arch == "amd64" then PseudoTarget("release", x86_r, x86_64_r) PseudoTarget("debug", x86_d, x86_64_d) PseudoTarget("server_release", "server_release_x86", "server_release_x86_64") PseudoTarget("server_debug", "server_debug_x86", "server_debug_x86_64") PseudoTarget("client_release", "client_release_x86", "client_release_x86_64") PseudoTarget("client_debug", "client_debug_x86", "client_debug_x86_64") end end else build(debug_settings) build(release_settings) DefaultTarget("game_debug") end teeworlds-0.6.2+dfsg/configure.lua0000644000175000017500000002750712140200333016131 0ustar felixfelix --[[@GROUP Configuration@END]]-- --[[@FUNCTION TODO @END]]-- function NewConfig(on_configured_callback) local config = {} config.OnConfigured = function(self) return true end if on_configured_callback then config.OnConfigured = on_configured_callback end config.options = {} config.settings = NewSettings() config.NewSettings = function(self) local s = NewSettings() for _,v in pairs(self.options) do v:Apply(s) end return s end config.Add = function(self, o) table.insert(self.options, o) self[o.name] = o end config.Print = function(self) for k,v in pairs(self.options) do print(v:FormatDisplay()) end end config.Save = function(self, filename) print("saved configuration to '"..filename.."'") local file = io.open(filename, "w") -- Define a little helper function to save options local saver = {} saver.file = file saver.line = function(self, str) self.file:write(str .. "\n") end saver.option = function(self, option, name) local valuestr = "no" if type(option[name]) == type(0) then valuestr = option[name] elseif type(option[name]) == type(true) then valuestr = "false" if option[name] then valuestr = "true" end elseif type(option[name]) == type("") then valuestr = "'"..option[name].."'" else error("option "..name.." have a value of type ".. type(option[name]).." that can't be saved") end self.file:write(option.name.."."..name.." = ".. valuestr.."\n") end -- Save all the options for k,v in pairs(self.options) do v:Save(saver) end file:close() end config.Load = function(self, filename) local options_func = loadfile(filename) local options_table = {} if not options_func then print("auto configuration") self:Config(filename) options_func = loadfile(filename) end if options_func then -- Setup the options tables for k,v in pairs(self.options) do options_table[v.name] = {} end setfenv(options_func, options_table) -- this is to make sure that we get nice error messages when -- someone sets an option that isn't valid. local mt = {} mt.__index = function(t, key) local v = rawget(t, key) if v ~= nil then return v end error("there is no configuration option named '" .. key .. "'") end setmetatable(options_table, mt) -- Process the options options_func() -- Copy the options for k,v in pairs(self.options) do if options_table[v.name] then for k2,v2 in pairs(options_table[v.name]) do v[k2] = v2 end v.auto_detected = false end end else print("error: no '"..filename.."' found") print("") print("run 'bam config' to generate") print("run 'bam config help' for configuration options") print("") os.exit(1) end end config.Config = function(self, filename) print("") print("configuration:") if _bam_targets[1] == "print" then self:Load(filename) self:Print() print("") print("notes:") self:OnConfigured() print("") else self:Autodetect() print("") print("notes:") if self:OnConfigured() then self:Save(filename) end print("") end end config.Autodetect = function(self) for k,v in pairs(self.options) do v:Check(self.settings) print(v:FormatDisplay()) self[v.name] = v end end config.PrintHelp = function(self) print("options:") for k,v in pairs(self.options) do if v.PrintHelp then v:PrintHelp() end end end config.Finalize = function(self, filename) if _bam_targets[0] == "config" then if _bam_targets[1] == "help" then self:PrintHelp() os.exit(0) end self:Config(filename) os.exit(0) end self:Load(filename) bam_update_globalstamp(filename) end return config end -- Helper functions -------------------------------------- function DefaultOptionDisplay(option) if not option.value then return "no" end if option.value == 1 or option.value == true then return "yes" end return option.value end function IsNegativeTerm(s) if s == "no" then return true end if s == "false" then return true end if s == "off" then return true end if s == "disable" then return true end if s == "0" then return true end return false end function IsPositiveTerm(s) if s == "yes" then return true end if s == "true" then return true end if s == "on" then return true end if s == "enable" then return true end if s == "1" then return true end return false end function MakeOption(name, value, check, save, display, printhelp) local o = {} o.name = name o.value = value o.Check = check o.Save = save o.auto_detected = true o.FormatDisplay = function(self) local a = "SET" if self.auto_detected then a = "AUTO" end return string.format("%-5s %-20s %s", a, self.name, self:Display()) end o.Display = display o.PrintHelp = printhelp if o.Display == nil then o.Display = DefaultOptionDisplay end return o end -- Test Compile C -------------------------------------- function OptTestCompileC(name, source, compileoptions, desc) local check = function(option, settings) option.value = false if ScriptArgs[option.name] then if IsNegativeTerm(ScriptArgs[option.name]) then option.value = false elseif IsPositiveTerm(ScriptArgs[option.name]) then option.value = true else error(ScriptArgs[option.name].." is not a valid value for option "..option.name) end option.auto_detected = false else if CTestCompile(settings, option.source, option.compileoptions) then option.value = true end end end local save = function(option, output) output:option(option, "value") end local printhelp = function(option) print("\t"..option.name.."=on|off") if option.desc then print("\t\t"..option.desc) end end local o = MakeOption(name, false, check, save, nil, printhelp) o.desc = desc o.source = source o.compileoptions = compileoptions return o end -- OptToggle -------------------------------------- function OptToggle(name, default_value, desc) local check = function(option, settings) if ScriptArgs[option.name] then if IsNegativeTerm(ScriptArgs[option.name]) then option.value = false elseif IsPositiveTerm(ScriptArgs[option.name]) then option.value = true else error(ScriptArgs[option.name].." is not a valid value for option "..option.name) end end end local save = function(option, output) output:option(option, "value") end local printhelp = function(option) print("\t"..option.name.."=on|off") if option.desc then print("\t\t"..option.desc) end end local o = MakeOption(name, default_value, check, save, nil, printhelp) o.desc = desc return o end -- OptInteger -------------------------------------- function OptInteger(name, default_value, desc) local check = function(option, settings) if ScriptArgs[option.name] then option.value = tonumber(ScriptArgs[option.name]) end end local save = function(option, output) output:option(option, "value") end local printhelp = function(option) print("\t"..option.name.."=N") if option.desc then print("\t\t"..option.desc) end end local o = MakeOption(name, default_value, check, save, nil, printhelp) o.desc = desc return o end -- OptString -------------------------------------- function OptString(name, default_value, desc) local check = function(option, settings) if ScriptArgs[option.name] then option.value = ScriptArgs[option.name] end end local save = function(option, output) output:option(option, "value") end local printhelp = function(option) print("\t"..option.name.."=STRING") if option.desc then print("\t\t"..option.desc) end end local o = MakeOption(name, default_value, check, save, nil, printhelp) o.desc = desc return o end -- Find Compiler -------------------------------------- --[[@FUNCTION TODO @END]]-- function OptCCompiler(name, default_driver, default_c, default_cxx, desc) local check = function(option, settings) if ScriptArgs[option.name] then -- set compile driver option.driver = ScriptArgs[option.name] -- set c compiler if ScriptArgs[option.name..".c"] then option.c_compiler = ScriptArgs[option.name..".c"] end -- set c+= compiler if ScriptArgs[option.name..".cxx"] then option.cxx_compiler = ScriptArgs[option.name..".cxx"] end option.auto_detected = false elseif option.driver then -- no need todo anything if we have a driver -- TODO: test if we can find the compiler else if ExecuteSilent("cl") == 0 then option.driver = "cl" elseif ExecuteSilent("g++ -v") == 0 then option.driver = "gcc" else error("no c/c++ compiler found") end end --setup_compiler(option.value) end local apply = function(option, settings) if option.driver == "cl" then SetDriversCL(settings) elseif option.driver == "gcc" then SetDriversGCC(settings) elseif option.driver == "clang" then SetDriversClang(settings) else error(option.driver.." is not a known c/c++ compile driver") end if option.c_compiler then settings.cc.c_compiler = option.c_compiler end if option.cxx_compiler then settings.cc.cxx_compiler = option.cxx_compiler end end local save = function(option, output) output:option(option, "driver") output:option(option, "c_compiler") output:option(option, "cxx_compiler") end local printhelp = function(option) local a = "" if option.desc then a = "for "..option.desc end print("\t"..option.name.."=gcc|cl|clang") print("\t\twhat c/c++ compile driver to use"..a) print("\t"..option.name..".c=FILENAME") print("\t\twhat c compiler executable to use"..a) print("\t"..option.name..".cxx=FILENAME") print("\t\twhat c++ compiler executable to use"..a) end local display = function(option) local s = option.driver if option.c_compiler then s = s .. " c="..option.c_compiler end if option.cxx_compiler then s = s .. " cxx="..option.cxx_compiler end return s end local o = MakeOption(name, nil, check, save, display, printhelp) o.desc = desc o.driver = false o.c_compiler = false o.cxx_compiler = false if default_driver then o.driver = default_driver end if default_c then o.c_compiler = default_c end if default_cxx then o.cxx_compiler = default_cxx end o.Apply = apply return o end -- Option Library -------------------------------------- --[[@FUNCTION TODO @END]]-- function OptLibrary(name, header, desc) local check = function(option, settings) option.value = false option.include_path = false local function check_compile_include(filename, paths) if CTestCompile(settings, "#include <" .. filename .. ">\nint main(){return 0;}", "") then return "" end for k,v in pairs(paths) do if CTestCompile(settings, "#include <" .. filename .. ">\nint main(){return 0;}", "-I"..v) then return v end end return false end if ScriptArgs[option.name] then if IsNegativeTerm(ScriptArgs[option.name]) then option.value = false elseif ScriptArgs[option.name] == "system" then option.value = true else option.value = true option.include_path = ScriptArgs[option.name] end option.auto_detected = false else option.include_path = check_compile_include(option.header, {}) if option.include_path == false then if option.required then print(name.." library not found and is required") error("required library not found") end else option.value = true option.include_path = false end end end local save = function(option, output) output:option(option, "value") output:option(option, "include_path") end local display = function(option) if option.value then if option.include_path then return option.include_path else return "(in system path)" end else return "not found" end end local printhelp = function(option) print("\t"..option.name.."=disable|system|PATH") if option.desc then print("\t\t"..option.desc) end end local o = MakeOption(name, false, check, save, display, printhelp) o.include_path = false o.header = header o.desc = desc return o end teeworlds-0.6.2+dfsg/data/0000755000175000017500000000000012140200333014343 5ustar felixfelixteeworlds-0.6.2+dfsg/data/audio/0000755000175000017500000000000012140200333015444 5ustar felixfelixteeworlds-0.6.2+dfsg/data/audio/foley_body_impact-01.wv0000644000175000017500000002263212140200333021735 0ustar felixfelixwvpk%$%WWWGHJVIes__ߗ/k5/w_9!3ҹpf5_X Q~H%3̳Ϋwpg7_7FwEjmD&0˜%) o!:ߤsP͗9>|:p]g/g KBfw;>+jY1oOǕ><}Ib;^T8'7f[m20ӱ|IjcEӞJpjp <#XQV3R1Bw$f&M-/>88e$l?MjlNד/NUOg{˩jB5?# ?%YO_$5\Nܶ5g|zs@XX?՗}-'GZ*[GDUKQsgq+ Ϛ68beŔ25$j;p5\թ2UCIie{VCc7 _@Ś#obJgyrݎcgomCdt}.Na%:mzyQv2C.sB?KcIta<_ߺsޤv*)_"N q,6 [Z11q FiΑ`PkGI4%q(hr~Ns\Cn ʌX3u42Q\wd6Qߌ!+[}@o5I PY >,8rZWA̙! [B! [` L;]fdu f! ǁfܥSB,)]IZ =ּsS0+EƱLhwZ%$l/vC,dlSe/!5Qm0XC XcP{@2 K&qײ1ilFo;=BOm B))x@Cr$X&wWh/  Ux lS=) *෦JTEhęUNa^_L|JetGm{TPE/~W4 b^U;<'2L űP"iM3 Bm0Ӡ2qHS6nYk8uw`є^Ir 0%(6v":l'9S7S$- L]%6FboY@2T\ !ӏ~&֠FE-獒zhջ.G-z{ߙ$ WL]NPrD=)ϺT:/t5.m|-6x0l4~u=7u<6!Θa7GZTwKoGdc>V[K`7b9gPmEpVHOF6l0yd=s-+`8=ηt2A~& rCռ54,SiIDK;L|:Zj|aLf f7* +-Tx?(Y PmFs3kie?[Ў0ԑM.jUw˔C;<Du>k>)6 SHc37.;a G JGs'(vTs| h8R74/>]_Dfd'oo|Oyˇ,Dk XE(mw})̳^f &$=Hvύ^{? 1aTuv+k꿻 PC㸃 yr"X_ߢ*4 b9G>*WUB)w"  O{^0t.ҰtذBCX2sni+t͋ĚSR/>WY8zbݖVE]uS~EiǦ`|d6! gOĨ#rn,)waY51׬j^%Y3JNCS,H^}[/2o.BSa3uq(Ds|a |ZYD dC9z C,jHh%5^_F>N'^l,izXN^1|%-/pYݞbr"2p!9GwcF՚ۜDl\\c>ІmlG{H>C7bj7%LyײH4DJEܣkYzoݲ5x=obԑBxuyTp_4V[q+6dMcWFs}m"r*^%o > 7\*pHe ڀG- Nt^i|Ie!-S+2VYw"Ldv1(ܱ[]V=v5:2N\|ۈcnr/ :Ł@]'O$lgFQ~A>Wh5b \/Bجے;/[yi}(1]P\f{wVU̜͑3!yg"#[QM@[)S|z-{ /Kq`3\!HzW4Rfec~,kt_2^v[bYm G}P&(U%81J2dkGzMXKF}/KrPy!bUKVFb?S<ɽAºR}a gD㯌4V)W3_&PJ%͏g#e ] 5 ^1UhGxO||kӓbV! Qd!rg~=o HXx< pLuu}K؜C!'˜4mK#fٳaZݹ|47 raP!YQ1"ץO].#츦#I.cuaI}jrm6‹SfJ^ihRiM lX"}7B^4Z+g5QDK+2ݞ7`TAQW6FT' ʂMl0x/ZJ.KrsnVM{FC-/EMxgn:aa:dyCk50uj|kڒ}: a@>z]Ξ$2ȝ{dbA@ͅ=V j8a6" Zuvjn}9Dn2;$%C&e(ڴRn .cyƷܲ^k۬ÒiwеRHg `kW")iI8v /H omG E9Tݷq!7Zk[\ Ř _aI6`w I$ |B$-٠&R:aOiMc=\0Nctt&(*# )YO_{=WC;_Q+7<}+NIKtlE9`URR#]+ťYh:ޝ(YTpD#'q!;4FԺԪ `_0UnI6Olʞ)PPa"R|hKUKNH.g sCY'47Iٳ xrE;ZF8=qD=A=fo_j NBGj7@ףu}f95dhb#E#*rʿT?:bA;,G*PjT0osi{1ݚD+R4 g*2eR9")zᭀUsXA;I,`8a֏Eںn\ زIݲհvZ X_c2(P=If9F*~?3A(:=xlr;$ƨ;Y}ƍ*KgZlK\* DNom} $N:ѡ/3,ރB [bz%H8. [VLk $5;1B5jCv +zY$ ڰ*@=jsyf|YNꭐ60)V&nFS|]rc\h=ClUqEI;۶ɾ&xY#eSpD\u՗-AbJ|T~͈1;9j&]mT@ߎz%q8"~ۓ098t]$zyfiw2 %7zbYՑ5n/-h?q#E8PG;?ӾZjȏ6QP_{3d`Ĝh;-t>&'Q9N`xޛW^pJvmDg;a$euR,7_g:q2y6?!g$ Zfe{Tr\ݛsu_Hܙ$1S7O'v9P"m<,3p۞VB}֬$dhm]ӀC{\HG!`\U57)Zbi4^@0ҷ6rصȥvƯ: ȱ˰j 5-G9vDɇ=gBi&1ݜx׃-pCd9{KY7ެQL(O.7AWP;F]{*NsZSUV' ]Rbd.I{Ș«*KW/T*Eh9"MGsK) /_ZYm}?Vck21 N)}KLs˥t'$d//֥M١RqGb"&{q*ڈFgzer^ Ee _C\-\uJSsL-uo>"j[}|R`&w`1xN/f"Ъ)M8~&ԟgZC{jh Ee\[BhI-fSgv H=.4x3XqY.Mx_~ʤ k51ִx3δc̤Џ} 7,;IuyZ\jH(qVsyOq#E؊“eee[=8Ft3besCnhFt7iM>*鶪9SJR.'I'ۗ\GypAW͔cq(y ?o:\?c׳O%y2qON3)c"Ll /!HVs.`'B7 /ki8ټ72 `'aZ%no*j*`QڼF՝;DykTaQƑPXpX$hi bvZ|O o]^4_xuKK{ȖkMwFTB{F˕0r`\'6dv YӞHG*G%ƔN,huⲕgK2{/H@yzfRrNY N&vϟob}x,G|V7kO)zS$pA H" %0l| v24{4@K0rʢR+a,ǿb1DnȲs7Y4j%)r*SV^="x|?IexCCs> |9qt a\5ͳf#;YH=}C`d汸 YJnFn%< r@Y4]iy%uچӎe^w:%{dF:!Y7'\s`ROtaw5:N/4 CF0p[,U˜8h*'8V0>~QA1CGqsY\l-3u{ZzZu„fqb}1q`V̏^KwuE/b3{V `ˑ#<(v|JY[{~_~P33j:RjTmA46zNNX *ppQs.Ա먊GjW 9zb`[AÁx:]''JIfX<˘[45w-S׾cJFT,O|a{NaAȫmYn$h-1S ZzM>Mu:,FXLϾx?iQ"hd J [ `s: 3$b YmAYe+$œ穄ABy@hgTp7GL//LCgB  q< T rIEܣ/J;)qc V e$1B [GBVU1CX9.YPKfz%eEp5{I)q(gNX;& ǟr |c9fcJ 4A00 (C̄0ubdbhnteeworlds-0.6.2+dfsg/data/audio/foley_body_impact-02.wv0000644000175000017500000002025412140200333021734 0ustar felixfelixwvpk ["WWWGHJVIe4/]_w7~#]w?|OC Ow{-_̿><~3HI'\|Pc8GhHgq\{I<)=ߥW<~BUU1i0+e׻E4s_X_Ct/kZwM//K-њyq`$H'Cg*koRNK*GK0|`Rǎ{\r>#[v~#,?^CK?6+?ۻo,?:?f:1 rZNX}1 n?Zf[ GH Aoڥ4x|" 2hxRR7CnS\JT9B LEt5bD. d{"2zfT*)'QJ4,w şfWHC;'/dj.~Ewu#JU.CS25؝3i 4-yBC7 USq iSN/ ݌ݏCD'!ޏ &{ViC+*&2&·apYDi?`7fѯ{&I 4n BItWkcڬJ2X$:9`E(n޸LV%;m6HR*`ΓRD>7 !a/18 x̦[7IhmA]Y"a%;y F%D $SMj#2xB5*A]u[e0EXqĝDoܜ`Yw#B},$c TuIزqP*3Dľu tGF1a9$2=;~!D+sazg~a9z1Nou*yWg!&q@W%A!)AI4_j[Ux38`o y4~{DY;.$-& t)Vc4'!ivO*a{@LTL% n.T ŰlT5)Iy˲AcE I~m b]r\ ~wɼ[o"8V#uȉcfe/[<9A ~OAyf!OqBaP3@ZI|==p{tfI'ȯ2QwN6=%y v*yT3% Qpoțl@!A{CCg'79͟ٻnh![D0mg-@&Ywf]؂ aaHϣFm|b ƕB!i;Nv3AiCb" mKGF .h%j5q=dW]`)Hǻn-J3?Yp.*j}bzۥȜE]Z/L}_Ε#sfL?WC9+Ab{# J-vYV>n 0y/O0c=Fk:$>.~P*ta5|'E؎V Daɣ,T֪Nb C-Lۑ<ͥ%grE{B)+J 4F|jIyV "=: <'?pks<0Eр𩆬[k_B{V<\((5<njW|FFd}rrzQ _0~hr0=Iv+Nӿ^UQ?:+=3v ]6Hmq% =x~AmK*,pP|'tUн JT>ڳ*vE4xyC~lL{{lmG:^yH GzgXwCyFy 6EƸV]q%բWjш=3ȣD v[D޸RL\D)+6ȿF*ͶۘE`[ѡdd_4ѱ/}lW"0D&rVZm+mYuQS2ۻ|fzL< }VF.=b:PrfĤPZqAZB|J^fc]inKw5KAWlXSuͅf^%_,= I\wXIlX1~nIAujGP:OmKyoS uգ*!~KpTG*/^$bס'XO6ÿ0p; g=fi_8'lasC4Qa|(-,Dhz^O@Hp₦Q yQ } 9/_= 91!ZB'2ZP!fi g.ޣ/ )Ij/P[2wUe2*mjBӑyƿgFu2z"liȽ`X@/z^1 ku/)esۨvԤ!g?eD\_G~kGwg*nt 3[j.D =rSw#Ū7t,܎#ܹy'^^HmKPN㔩ev N/ :t Yfcd1\vU"~ǟ[*!u/ܚ[^D˦|c & ;7L,S16=+V"q6U]i㴓\mF[dYs~[M{B5G-!ob YƓ7Uшwf1zmǻ?c@ n|y)6;Gib) Oݼ$QxHDp,pG$xU_~΋辮q|!af䀮¯Ȣ 8LiZ5>\aBKͲ(Y=!6 ̰ 9jr B dmw( /LÎi7F%R)qo2)ͫ`ζw-,Npr,,\ɭk|Z)].sCu_DRhߋSp !ҳ915Lv^ښJŐk3~cγAe@x9$t!jW7(U)t)!ɞK8?8e1FA,*ұ8_ -i;L4 Tp=e 䖪P:޻QRjxUvFʓ^(NM0J,i\Ǒ(' -a鍫`9TObO+0BZexRįViCX^/8˃sٷWr~Fs=*Y-)yѝ?U; e@bZzۭv]pfQ^>@yzRS V֦W4]&d>pT6,lUyu &˙={ PFeb>/":D&^)QVqRf<}4'PB`Y9XX'cmca2l#^`OM#3/BC_"}wIĉsM2F1ƙtGdhuy@a,L& BTa%QKviMpZy [~L]ER|_=m༸ 'aY4Ll}9 ƙ-d3S}b7 meQT icigRf}D, 0?*:הg{k%owh Uo1kj#^,IyGOgוA`EUбnX˅_Vqż^Pq'L_xrt cTRJFdf؝bDR B%B@ٺGh&(_ACzJa: fGрou%=\F(;kld1">2\+;[mgŲ%b}AERlqּ 9`oR/dmXYGٳw;Coe8fq@iqx`,wۺ L8R5#3Xʩ&*H?Ѻa,&At6fhX6㮆L㈭@I @5RX#4QA(Rָ$<,2CɡHWӮUjג*efZ,5 XI \|_v5+U5blxk:~@ǂcƍTp7ņ|Gp6>, zظ/8hOCsU;cc3+HWXg+20,ͮ/gb\jƒA f: k_zɝ#3wx`@ɠa֔'Y ~|0[8@!iq,ށw-S"4-p])rXR#Bƒ6_#ف^eiPM&5`z}2^k_CFyUĵTE9S+Gz{WԎ%;|sz=GU݌d'0@&ԮGi"<33ns+(Q1l9z )INo9WGv"NGCr#9M_Eqn# @!8Ƒ5g5'S0CW xv0GQP AmTD#{~0Ec{qX(=JY2w)!4#>07g0r.P ~O6z(R_dA.D㡾 ?IbU&L%#zMMXQm"!{RyN'W^T7؛[h=u^¬q`umv HMئʂc-7E^#/fbP7 5jRYjEgM0Z-Й7ݴ2O[򖻠M;Og5:oJ{QL |dH_\),4y:  N(-j#*R" #x-Sb>IV="9>7[꒪`p K,&:j=ZA@122Ta:jvҀUٙhuyUyUn+L@%anyQGkV/g>UM~J*u$ w wDT|C8&I [I"$豑=Z晇s$jDpK+7 K͊}|ɺ76 ȩ|dJʟPIaPA$Vؼ `/dk2X< o1T8ǩl[Ė_ Kz D+b+#1Jpm;5ܛۏA "Us]SyO#(fz;sc&YM!E O| /*!mǦQsu9PoDlK:ޛɌ1xTUN :=w=SCst8SW4>+`MhF2?}G' ݦ@.4a'v<||K\@G _1Nƹ{ _Z&|L^Ăу:,>Cub"E=bFRP'ٮ=V"Uhƻ bS! E/,PdȖY4baW[Nsym밀*,c4ګ $G((ڰ@Όjz,b`.9& E08yuAbS\_5{ĻF $sfHSĭ/"#9g>RoaP No݅jY\PTbۜJ\6"^HNsX^FqBrxSaJ9WS اV˔+?RM!%Ӄ# ­{f_u_n;G^Y#TcZnDl[zqMX,Kn\ˈ ev$bNϟWU\wFr,KAVCwC u̲p_%>sh4~0y b91>.\@ EރU#͉{,mPi(({<&"^*c ,2#KjٜPw5w Z=zZc}5_rN7HqdHGc4 18͹mC4SuͲG⿅3mb6pW:Xn3"tI?A)1z8xragF3Cl$a$N%}BRVAj4> aȧ&sϮ0?"g6Ͽ.|kG 8G AʃK{-;v菉Mƺ#p@) be;* ­ qn<7 "RmaJ7LDzSzobݼ?&( P=l7 )jLZ ;gcuP՜-dI§ktM _ݥKXu$7 Cոy>[ q|s-_n9'ƪ7{:3Ȅ{pL>T_}y7_Gru.,pxz,AyhzHo~J@ )-iU,dr)h͌-93Α!ұEσRA|-א4X˂:pqZȰR [kMՍ=\]_^o{a3n(R;//8N·ȑVw\yd%h+R*9&ɭr {>yo| ..p E͈8~G.eSWo&y{Q떭W> z__9qݑC$ǁ BJAw5 ISM҇wS/~0v߶^ P5o&wC5mGһia">Z8"qjz}S^x?vѾ9Fϋ31O8IG֑Cؒׄ'`Nj=.0ozEdOE<bEѰ}1vwoѢ/I2? N=TsqϢEZٖq89¨axq9(q}&aZf&FFG>l/4;Ap׃9ґ؀(N.ܐ\+DV}Qdb;gK;@8V9ʊbc~rΧ-{\LYA^bv{wb GܞQK*U<+3DCꀉMl1ϩrʪIJ כgϙӢ7iȯ2@F})uSW*܌5aQ lM놠EO&`*1aY +M8sLujƨ蕏RwTj|F9Fzu}{.=Al o' ^3_^dב3s^|$AGuq?FHZʣW0krqP/^)\k -*kL6\M ;גVHM"gqjH Ċ|7A5(8M(骒'14xjl$cî͵O1=FxϵUь2!l'e']*ëWhVDΐØ ?M?{VwMXoD]Q(ӜDB!H_~>X[\ O݀&"|ERX=qf<^s$E ?SE$_5Im:  "+sC!{(wgߨ!F33Ywv1Ŝƫb=~R$pWCЧ8F^شy#0 tN-d0Mc`& I?yy1]Jj? }qHC7]d2:ݧoq%;lUk|A\OzgtP$X 2̢>b-]u3@q9ry0#܌@乲0I"0uMc]P1Fm%Ѓ|دI$L!g] d+*l9 X^f(ݷ:Z ȑQ I=nX*p0|B[g(N&(.r .6d/b PR^ LҰ"p3t=@ח48@% )Q>i}lIXxۨo' )/?,w;h j ZeaQaR?M"NjP"[*61Zbo.ësl3=1MhҺa:qx*g@}s< "|\'gr;qEAS]m;3ZI*mC~( r%8 k974e2Z.it+2+M|p DY3F쎿Qd{,00lY} {ym{KhLY8Z <y0tv+?@v/  5Ry{#rgq$N[vkBpEo GRT\#!Tm4fAq>^z9$7E懻mf h:rphr%a: uBlOhm bD"R7 uzyc4+uq1@B4FA!W*(*2Qyqx-5@_^ :Qq8q<e$r0Ѳi"! ;gCQ' ^汒H}i`Mv S~CYY 1jaTRj3`m_e)Jh;0W7]n}?ԍAsAgeALgLInj&>A{TY/ltqu7 2"l`dԋa+cốkV0ؿ&W@C1Wu[GzB65ʄn+c*iHZ )o,8wnG#B*zGU@dȅ:AH|LkUZ-B4TI`im(6K2kr!,9,c5qG)x7f;msO_g(РùۈKgqUUȉ)d7 5a#ߵ)(fp~Y٢ln_ }]dNuBI]>KVN$[&t6dbic1Ba M,;k &1+BR%$&rYX=ȱ޴c[Ko}9j7O ;jy4PUOAXZC- 8& |vrF~QlDl L=#؀z5 _^K193C5 S}E8i3B 2… 4T|1)o";]+T {at8m$j}UdhBX_~G@N:ŔzTd~S>՝dQLTkN%Pk-/ab rύGW妯yrs%TmO F/$?k,\i%=Y{GGc5Jゝ /|+g\S#Gz VOf]"{R.>e7jeԕAa%e"JDT:zYKJKO=?ٱ~^H}hu)aFe8))Em(nRW"1?ucDLR*5j=3k` }PJquS1ejMCeK ?7kEѥ˔AYsv273jB+s&Cղ;(} ~ hNX_$Yz mCAGNR}J~/br-6|k.t-@m䭎+i+| 6(ϗ:Z8:Iw1#kd Db|@ Ttђ[WY`Mk$+͏ї$- yĒ\k.rEtl(t';;DdJw[KabvF2 :g4oz$jCg:\.B}u)hT` |@0Jf /ϴ$(JUڬ8;caJ=T ws>|#F`mۤô'[y5 &͋Y${6g505^ɟDGt-};SAGg:dviVy5dI[_xa(WoUz,ݶ+5|Ĕ>#DffcbNIB]wzY2yx];@"%#.qyD`VU$Eߥt{&bϑ8t;japUR5j|tts"X>^R{4 sDXaCf$!6(9NSKp]mvmPlj, <S5&2 DF߃SxȂ]x9>A_rWRvHH ,gGX>e8eم0g Z1 '?EhD@XmANZ\ V7v0(9E: 1buR/q[O|EKVXaoe8)4'XPIW/Zy59CK`J69wiLA LdMA5j %d#hOJM:1G&G]VDgKu5GGD y4dȕ!ifFgtFuc eilGz9N#zK<nkQD:a+UvCS=hZ,uZ}xl^ H{otgLKRPAhڞD"5y"8;Ħdcpcrp?yGgxVǻ6B*kvcJ ,[ɜ'W|Eujdph2em+U[W ie0t c@wQ0ƲzaY屺Jb.Eˬ@[;~^7*zٹI4/NEqI3acW "kHh q G{K+%XEm*[ = APvHHpEe-IKd<cNc)eXo#u/l(ڑJUM&!mڠҥ"L7^f)b=\#&ejG<8%Q/2x@Nsځ6WPW8L"d:l(lgKȺB &-%1E.5y,ڠ 15R2=h2r9hO/UPKyfͥӳO;<Z{Js7+1,s8~`ei ŕO ]#T'%]|pmv)!0'j6@pJ`a B[ӏ)pMD͌ͣ-ּp쫚HgFe5ETģ n|)ɡIdjf;@ތ[NoM&-"DAN$ cdgmKPf&6teeworlds-0.6.2+dfsg/data/audio/foley_body_splat-01.wv0000644000175000017500000006621412140200333021607 0ustar felixfelixwvpklNN #JWWWGHJVIe$6'z[?W�y~o{[ɟE=UpN˘<}ƙ#wzu%KT+߷  6sy;\ChunK_%}Q>nI>^D2ž諍=E> SC|gђ^MO4#͓(PGO%BD7;Ŀ=|;*j6a#3?ˆvT +Ē*z>R"FbW y&1~bsJ%]`ĬdO|wdK?% eО;Ed}^\7ߦ"˒Oeɰ9k5!o>AԨ_m?/Jӥ%'{aoE+E$]^o8Dɞ?['>1Awt!45A!]RMNȻ`U}aYDqR\%JysXkL.2wio! IU!ߞ,冔~LE huYTNzK qÓ 6忨mh@nv0D"e^H^0@U8;_<꼸1\INdY qR"߮Z /=5B̺<`ˬڑۤd&2'`Cp4:ܗ!&8>tQ϶LPִ8Z+"hVWQ*  &1LppOj x÷FjKpCo56s{CpAg`ބzĝXdғh+7CitZ[^gt&|ǔ""ub8LҰhrjZ#l(_1P8y}н-E+z ?_|%] . _dh~MٮQ }lbS߸0Ѫ^F׽2a /|E#w~IxE_ۋP*IZ`'L<.Ճcԙ) Z90Ɏ^+|G1Ag @Bԫ~wID/(7WԌevM@{OV܉#p;̑[": k.8:%jL phީELgt1v`S{rsi6OA,FkzIqY38Ո];8Y{2kv$ah=󜘯7_U:^|6KM^(Y h3frd Xh"=`<:w֬bۯ {}]a/iƊB~8ϲܶcC,s5V'haf,}BZL <.uvp4u9P m  x=UvuXGj79tH|-!&-&ùeڼ eA0xGҽym8 cӎ:LwKm׭8c?dNhnO N[^M=n5ޯs<$9q3)񦸢 ј㍹^fT7Pr.Žă_oA/ڣ.ojq>B?Q:ǹo\΋SX6 A*l|>$8dᨭ2DNH|5?nfaϘym)>n&zCQb˞?~=h#Da"Qqnm%#wn.v$0_2dl1{*vprOsAczZx$~`3j#?"6߈x7{MLm-Ӫ_-jnPh,#5/Y='OTȸyqKն9Ѱ9uvhmFa*EEUIbZDH8[e+n '.wLv4޻Y@2DNR&Kl l|Ö? G"{|I-6(#LUJ6r-H"F0mpblwnsѡ@YE/&3 ^u7bMApk5A>S5zN?( s*^K!(S(}T'26 3$nAӨ@0`Gu&L9N$ى}zOY7)WQKt4Ne2,Et93YA&Ƽj%QW\a~Z@U_5{cnз%ᢤ4Ql`ANw LM${SbX*N^뿾?}~f";?o00c|'DI3|ǪzՐ*%!}[eH]'ե`%TRYȢjjJ1Hx)@u5O~`r\oN_s TjziwTO@[f;0HzDL8i+;l qh w(5dP~Y$=[Z8%4M<7{8XLGމcWX\~rr}oP!2k6GC1}F +oҺ=MU|⨮ޥp=2/ ,.hdt\X 7nSPي U:mKJ_*cg3Q;@鼪Ra>֕k#ʻ9H&L2Sh+)NIq>/b=v֠Ϸp6@M5=0O8H3M G9\x9c,~|+IDʓVAAp/eyzuQBpO\q9Gx^ Ww-1:5.,Jԥ6Og?.9@C([MԟcH|UNKvU 'bq#wZ?&g^N9YFyV|&TD`&LW\,@8lTd^0<+ƪ2BASM#iMFE[  ޏӟw89^SL-(̆ \ {fKUw[g!ptpկSIwlF}[WqINm$/R]3q:»&/2ຌuX lNG6@ggǡ1Uړ ,.(ܬQBAG6ӭ멨q~Q};[ Y'l3 mj)~-׉[*Q3Ȉ}Gg>IM)"C@d<6 ѵctzMT{Oi+`I$$ҎDY1ྛuE$<,S] Ƽ]+bbJ1 xZro).II`γo_f%gA5ң@ wTu)V<O丒7whݠi?ęZ*m{J72(^3S7#OX85rx{bpYrdgoYpZyzhڱI5'Tn3s{u~u|Oƿ/~S==_ oHk:qYVmer%KJ\]erߓڣ.svtG1% H%q/\eoIC4v|R! 7VAR(0jA4W m\>iar36N,+pC!8 Nk'1x$!ui`(k iE{9"$Om!׻(`%Jɽ)6M!(YuTHe5atoϳ2EdV t܄Nkeё49 3@[j6.-edŸiSZRdexٹ:/<<ڍ-gWEw)X(i䱱"8<؉iQnj:'s_*.;(fyN9WmV17giUA% l#B Z'F@,jɡ|䴠U g=҃XЉqmx0aFňz5ξP]C8g==nzܺZf#'nt0S1s; YlJbxc}&cwO^ЮGqY5dY -69r?YP} f JL [Fr{` DkesFYk)>@.P%H¶xh?kҳ/B^ImGoC ނO<4 RQiڥYc,BëVX;,t=dp'0u q0ǪXtQ %ʉ߱]vE~EB+ ʈtfW}@{O*[e܉yRxР@71[ 1آG ,%ŎK B0[JX'ȷObd]"Z$$m>e=Jq|^Bs 2̄$[z;Lh='6z UJ#.[&JB~m<0Q b'Cm񚹿< ~qv|kb#m?190 ";ͳ:]<>+I/y+ؠīL˾?)үg_?K{?ɦD0Jz:֓J_*m%i$=~7p%\A||PSi`W>yvjx(!tØZܱ:,BR4ƌ{j~_ujMx`&ؐ X3N3$mdTڶe &>6o>A{'nx[#,]KhE*/j 2x~ټ글iJqDxJ7 oLpr|/^?Ҋ'&MoGL_#̩K= jψE09V?}'SaVP-#^[D\| ThJ3 nNugԱg9eDA} ZaP3;wL}U%$CxA'!Ki(?)Lqܐ㊿\_Ɋ}( mV3Ǿ+oǪ u2^OڣiH>pEy|,` ]C")93N־$ly-=^,2h%v35r&ݨLܫեH1ׂ"dz0CE"bEʜ+Yzؚ=1li2U0^x[&^M*98P s2fw9[ ;vW_O?/x/~)0L",EU|WOq cL%/4ڡr%J@zkbP}ekDq1#kiõRp-G mcsĄ@{bC`G&yrgEJ wX|JzeY?Vt%o:LSXc0S :`7* E:F.fvˡ8- ċ*ϧa, 7d`Ǻ|<=w* tY^n฿ǫNg2ML;мU˾Wۃ|q:ǯLG3_ԥb q@PL(Ss>-|SEז6OԛY-"Zsc3Q)+~8?O!í>wY5]"%Y&]U{ $sE8vl2T`U+2jkƸ]8o]?)ư S}9g O Η9璴}eOIlnd?4;Q" #Q3 )b#o_w18B= X$v1Td `I ΗI]s޹乗q6TˊQH7 {(\Wum#dS,4sh tIW%^1H7V,[_N&rяc P.6p3<H1؄D2)D}# c0"\z$[EJh<(T i1q<᷌7(gėvSdΤ%( #~HT~w=n{(E3GgV *%P lY(X9R=d "@ES8kEURfeP[(p(;`6"Iz zb]&136GVĎ6rNk)e>㱆vGNqGBH,p…xaـjFH=A+z,(q [ =NqWҥ տ̞D~-qnb.zwm8^molUW~I_xg iu Z+z%6gx4:.f^6f UDH.scAPeH@ cTil &ƕ `"7@PRC2^eX͞| 2qv&&Z@mo2,Q9NN?B=Q۴@P%g""Aʹd;=¡Cb/5C )S[ub: 椅kj@fCàqAlY.(zd~3fDmudIFb(:YeEi {- yyJ-maW”!Zd[.&-&~ h"n4e*jH$܈Q+)1 gޒfi^qv9 Dq߷6=`_P2}`MaSѸ? `D/F71Q(_z9~,";vC/jXփNdIsP4ym҃q`2d۫ *=d)il6lDl, 5,0Lca""ڣؐpИO$m,M;ݯ-Ġ8]wC@٭VRu5'8&[Rf.H:^PQb<@e"#.-3۷ c P BTb*'UlK04tz.B@0y=g)zĦAȎ[i}aA`{wXPjx- ##&[ _i>&˵~D JguLq<ٔݯ@GYJy:ËYt>]J)c[LvQ)m-b+Ń*ڈĊdY&s)E8LgltXߤ|!hz5AAY$&E(L1braUVoVや m;|, B63z׀¢( + օZ=r!TNfeCzl,*RwH(dZřmxɈѲ4% X3XU!*@A`9^-ab=qUm?^65J`j,mVi+K"pUkN\*ળ5F_6,Q[]!,Lp'/w>E\NuVx6ًaR(yya\94 C -'3ij\I uY\ղc,`i|QWƾfBb\](!w t[, V:T(Uigh%HalǺáX KJfz* i?|!kovY)e,~ڛdYպ'*XMVfnvaVXx4HP"zևL|'j;(3}BibXґƍ0 njGl-S bX]j C--G\|oNfEc$#4dD4:'aBh֗A֞Sn_?s?{I?K@p5/1CX#Nc-۸C <+6 8%T Bf""u,BLe"^@Xn0ԏ, -!ga&$'0h̪V XieKV}? "ZD>dwd|ڵET ?pt\+Ɵi걩nTo6ăm XP0[pT pBp%Q6m.䶹ʱ{l@rm/6?D{Dzc?hgFTB.R74;Eځc-%`#.W1(މYݠ@m`adh~t[/ޙ?=ݿ.λNDo9ESL+\CSk?/N}-GDžt=q jA\LUkki(bB"8܂K5#ooZ_@aZ?= Fc[`nǴP"rE g9o:LjS^(mZ\ݷm?~|awmc[Nt7{L|&Ww,xƍbsTj<Ӟ6Z>{z#8@c̢r̢`_qp>[+Q5+L3 dywłZ q@9|!A(4j7p~|f@#Q,ck1AGpQ&W FRHx0@҇`,B m>7GFS.mכj`,rROJhuU*) L!v\Cےpٰ?-Olץ;\M[c=ma Q^?VPAm=V})q1oxgpX1̷m<ʽ䀇mbDG{ lPpu>L M]9!**Hi#!J M.Ay%"ZՉ" iJi G6GbBe{HsNQ)h @pViet ,FI:="4WcojKו!}g 7ST3KU&5}JƼ<1-ٷp;-u/(ϛY!O]'~ag*c-}&5!zm`m^ԄRQf#ƶpRi);&5:ϔ t1#0@& LahHhDT@utkАNkNڝOx QW& t%Z8(u,u٤ 9$r Ȣh<m3I6` 0Ё% W3Mċ41nZ4#tAKi4L"^3hB?4|ءA@_[N.)h@!Ե%Zu^FXJg;Rn?O0;?yք {X#vߢlR~~`hX"ҺaeNuZ\0P<=g)G?#`#v8ׂB]qȶ+:J /@~k~aɉFtAxσ[\{?*=utB|²3?8V&,BE q$SR+RA+śaukim2Ӽ Ru#β@rЇd(y"$K)LY:nL nbQk$H2E9E*^d^aS&QZ x%]h{BPBb@ZU&ʰ7fKg&Ssec($B( )&]CSJzIm(()$|Mg؃hTaةԙ1Ls 1n.zgl=fWJ3 sGvvJl$NR $۱u0 3-)rr0`Y*LcV6߁"ڹ$5c )aeRv|Jb;$*u%(7Wta[f6U_7s.wLLX4cj]dFTłZ<42k~:AbYnAHMR6)[9P/7K5[Rސ2'C7c 6 .y朸Ü=`08%X'T Lβى;=u:Z2`"~StuA8Υ#C0?ecd&Rz%M'!DֿcHMW녤U}툶;)B s 82K#[aʗr0r^ *x38LjoYx*y̏'щ{V89]L4Z7py#^#VF`%iI$ RdbfH L :o{bR8 GRcIB]M], F hq@F EW le1k|L/r7w U*-=1FS2j0c7_3]0(2K@v3ٳD Xbpf <7ƻŕg={"'Q?(qP6N877,0} C߰^lCʧdZq\EMZrhZ@_XDܽUd>Vr(Yq7U) >ki&Y?{8px,-@n:,AdCPYcj't]х'q7` 跏|QM$+tw'GKQ ^cs289fh<{W?-k^bSb9?#CXW)$֎*uJ3iG<>f@0 ZeTl#TO=21v9⻽#o}_PPlHn]OœU щɱJ*s1@\ WvKV_?#=^wz WV9'p^io1"jh>f;WZ"<]mA[Z>(#ylRt Q5ӫb ff0!5`h&}fր9О({'F(T[:άGbsCbp&#Ԑ9:(Lɢ@-_&SDg-ob -~lf: A$-e3y3\7YY9aS BmE^!pGº(vӴJJk`FqInIǕӃUFbw0G,f[?"\ޚl(✡Uœ@u0ۥ 1'\P E-+);rxuB 2]&YMb EIZן~ڞN l(v 6[V#aGP8¤ g^`^60\/׊NMl &j^bSӂ4`LO~x_ʙkd_.04>B`xR:~kn Y,=VjyaTQP[a*Ne:}ls1@d1kXBy FXR!c"iX!7FpWA#3ZAQToveL/S`&a){W@y"CQB!6~bJ4ǥ1^B+ ix z_A Z XEk+ 7SCڥ>p־87*r/= iP$,5#/ M_~X#K_;NOӠI@ӵ޿7tmo̵u.tvf& ND1, Q!sTM`UZ7V9AI\'^ ! n Ypj8gG[9؈*QٳÇ64Xja(V"zcͻx~4cx?&H Ծ?LR&/Z@V>zSBe2yBw`p# />E&>e \črմtm4=) 72tA IAG>g++a<=QT;, xOEdd2뛫4 KHBY Ҥ3Bz%ؓpL5UPSX9 mG*3J:AxsfAUA| qIv~}8P-9l3'*zD!]|.KYQ** |, ~{(p؟1~eOEk8d NYg|jP坌Hhd@ٓ2NNպ/a-P=hk%VA-9pϑUOX#iQӉ|xHLB2@NI1ţny}n9`˩x TS Q?*)uX %\K|u*ܧ-#W[ /(#8bw5tRzfCZmjlNF#Is$[L?9Ko[ON9d)r78PǎI?r+A~\H:]:T? 0B>z~o77 /љM5JSm¹#ãCާ*(G/w}ac//r.L˩V GV;P/oAmRzbHϭuȶ@sH ]ޖUr9  $ g q=ӊ>u'Uf1QjSms+"B Dv}+Pĥ%+1gտ6T+H($n= Q.; lgO nU 죘bV6~~4Z{DGa8 &n*.,nAN5 bh)_'i5PËO,w_|{==_#~O=<+eEj҄:k60z=&3f$VH'9F<5ܖ} tRP#PǕJu㩧!-=Q Ct(QZoZİmddFeK ͮ[.@6*9 0E@򺑴'`qoIK}:P)qh$7LO+ΐOy)LͿIB?ZP? e)ꕲk$eME `/"=]oueaijn1fB}Y5 ʾX5 `$[n-,Kq>Q]2ʙ4nV_@F "v Zq;*#\ :1k*X́hQGl6ťUrZh_7KURNKTNePT.xt3K7+IKQ; cN25e_,JRDq'a'!/y u$"3)L/ۜpXtHesVZ`s հLd /'~͂)CIdZZ1D^jm!))KWrYKVpw$"\CcXYP :,` jjUoV+[B:2PL8u*\( eFM:uM'<7A \#YUˀa !5̀LWa%mDZqŬ$l]8@[ȣX.YcŔcfţT/|,W c}p!/ޗfH>xl Z)3w3oooħ-e_ڰqW݄j i4Aw}wU8n*C@Ϗ@ s`v^xGغ>k][&5O~'^徦bTSRMBF9~l@@Ho?؎ao?Aʶ`8N:%j$I>zѩ=h^ 8r[1:뼑I&HLWB͠Q&ǿT BW)DxAR(Wtt0ĨbbpQ-q{z1L?j$`͑ύ8|FЮfgoѝniv7}$*RnQ&C*gK̛%AMUx >2ؚdf[5Gں o] #LƸq٘m 'o=_jSkUPkc_;_sx9Ō~u  o /Ke@щ;)2hrjKo-{Cet2g>1|5a?ĂRhe)s)P>#[l:TD"b?vYv{apXos\b7 =U7?{ʸG@ڦ'Cdf 3%v罘yR9 /Ќ2[4Lp3(m@0J^:{嗵7[.Fos:pkҔP/>YqrϿsD}ZbP|UÏX[팔T)A֚1=A+䍔,59n8},*d)e``t4d;S4@vfeY]eZaZz;} -؟ hsdc5;JȆGh)r`1X1C6dsK}ƛA5CX;ϑT mf{6` V6d=~?jlYIp3!%g8>;oyE~bEU>uwcy@!> 1RsA6>)$`<ҁx)R"Mbm5.4M8yVR41]ir-p&,< z0Z)m>5d $cpj/b@X8^6r\OeE`$3#t& wv: &-?\R;o~gfI57h:T, 2F&? F wJ*ϘVp^+5W9\M<`6D*햮_NΠT x:|5$Wҁf7p 觜?MؙWؤWݺ&!ytS][5q, nMP, RܫqY/"[97!TK!E26{3 Uw1ff~UVUZ syC; cO9Bt.ZI(+EQYguܐRH W_/r<;dn=,_[6`rb€Ri~fdkFxeO<^ki6՜$U1fn0FpU;A* յMVY*q/4PfDkq1Nu]`|K{V9nlYB}B%&kJDgBRXhH@|'5J3)1ʤvXནD[LIƉ{|`+& #P [J`9~䚽cCk 'Z6&es.s} Uq86 +2k"-YǰpT#s4& @+p$܀ؽ*X˅'W%?r6ޏSV ow>Ouxe.gB:U9;iҳ4,s!L? =F J$j*F1%5#|a#{R}i&uU18M }0> (kT+oO7RԒЯ$vZIanԤ&E5#&1clb88| t>Zz^T+s1 A;Z(r1n9+IU"e?nV6ٍ)(9XTiUz]Lzd^3IIEW-ެuD$Ee{緥9a{~I-+$'-WanEYk_-+o@mʕ5:RTgnM ̝=|htX C dj7K06wMCrSQ1`W\\{4z sF0Wz?lqhkS9Ř˺Mr/p>ƻ'hwNiئNFё{Pk+k>./.b8 +L\u>lcddO XtrL4&і\ fR<ΑNĶ.,+çM"* 3 ̛j(R)]RnghUˀf+l-&M"N&D%uu)Qhԙנ<"8m$ l5uv?xB=Zbp21D\(dO'͗bPlԢ•.p$J ֏4 ٗNь4!>9%5Tv d TjYL0M!zicLAAX2DBO"'U^T\VC]I&H{i^JKȚV:X+T5<_i(Z| A~ 2 {&s` EߞG$}闳_L t~q"*8)Z6h@!̻ӻ(V5,8j%M40jǀqED [eQl)(axqL"TH,۳߳fUBz#3ng0q!e6x}9֓ȡIA Ƅ+(  kG9m6\itfNE̲Rӏ,E: "&hgpMR죉#HL*b,Ԡ1?|zk#=a‘J Jp `[ _$QYyE8Y+ m1#V9c,6F׌ cQliұU /-o܈Y[ae9[y#oێU`* }KÃakD)@N@c!ȗT[65$eӪ03$a@Z?5arkK#O7s?'/-xwesXf8~͝{,I-#:oo*ILF#g`+:5y/j $q$KYQd&QolRv\1,la,b)FaRlH|A7F<J"Q J6.Pp4.Э294JGTx'R `_ #! OUB'D󠝹~xF1ƅ6ߖn%#V=L|Ѻml+oCl5χ!!m#eDR Ƃ `#G,nX61__Obmb~%`؂B kYqB&'s f$xL.DKB#Fḓ8&K8X0ˉYW,()Qdpp5,qqTKxOXkt[Eczn 51M8΁  8&(c 1jVA:!~8p !!.> Cp(r 9C1%B( \ Xc)p*)B9  ( ap"{ Pbq3B0hF10 uO |!Q& 4q ? hNа  $D":00z'pr82 +=e N!x!!YAAB"0@D!TC?G3@Qi"rLy'L 4HS< (:r&ǂBPc||OA @$ C LA%Ìh'Q(Ncxc@AT8S| ~ Q0XUo2Y4 DIQg9&|(0>:q?! `@3:ʃ@QC`>`pL 0 8p2*? :.:$qRH{P (qE8@S|H4? ё0 z8AxN2A~ qbIbNJqJX'6teeworlds-0.6.2+dfsg/data/audio/foley_body_splat-02.wv0000644000175000017500000005770612140200333021616 0ustar felixfelixwvpk_ii,Qf WWWGHJVIe/os$}; O}\ᄍ7;eVbݟ2U?Z?uOB}~=dž-v40ܮ9ls=zKa^]%vx?gB Һx:eg]کZk៚Yg ~f#ݢPh>)tJ{9̐And,vF&Ya` RFN|8dqt`lB\̐Q"&IAGKFǣwXgR kP\VTjo<;^]U?@&04GWjNwRN3,?¯&WlϸI ݺqZfN 12 8Do QhL6Y ݴ2dpXm!f/𔪙%wz{|6":cse)UASL̑xq'鳚z- ; \:4+Da]G9[? ?{)CCjléё{/4z9fb&Q+X$o?scOT~wcH`grVX ~6Cే^T?d*[;j՟ sT`O@|V^bw< LP}#:5mqĤg#{L_z蒳co%x~a0ήƫ̻uc>֏tHDoNB AJ*\~ռ4h:nCzМpQ'C"lFDDs^6uu8;%eάUBwhΗ0V.W]5ݙu Yr/ ]XkL Eܪ8S}nB"Ϟ v '"X@;Tkw?Tj8-IgT+$-pVuΪOA3R9}rz{8?9eZ|vXs#/UuaC!5s-90NTb@,XvdcVW8銀_=ٝ1޳#G'[n J/e(Y':AP[="`0(2Vb*B{'}h|ws/fIZ9۹͟n Dh_p굸@R|ƝFedFSۄψs~1a_uG$cɧC ʦT!r丠2sbisDF XtHSf @,$i r/-OMSZ(B[Rb!:3p:EGSא練(5@>5J2 PvEd^?߂SVlU^.xcU 媆Ct?i@ #x&< CTVs VoyXD@-%b=g>XU&@ۦbv?TZ[lt|Pץ,qg"o2&s {!l3>|$"#\U Sc*UTdw&gK"~}_^# fֶ th2{IIi,_ۢ/x7pcHN#E*EQ [Ԅ^!> F<*i6f?2ίgUmL;=f-SGQxY}||g2JB8pqp$_s긆*x'S;;?Jf4+GkuusB%"lݐ:(%Uw[¤fˠڈ?DV?(K5g#IXxE#YR1pL2gI4l &}PiT8o*kz ׎W#4b.ʧg"Y+ΕF)*´RhZ=nSzV#`K"2Y-Cqm%GD<\{CKFu0^ts"=51AoRRk\Z2iPH]Oz}#;|Ucsؔ2o]ZYoS6YP[NP:@[k!"`=Gl,& l A@u_T֛} UB Y أkI@ܾԅѮɝh9jM,u` ^7eLZi}޶䅶tD]ka#m O oI;2|m*LoqThHFlތ y[w#J& X6SCp rRuz‰MD:| Φ/$WVx?jb8r"98HO $@,X],"zL{;dW?)<)"y~v`*~AxDh2x O^宴WwQ㥤sw z^gORu)p>脄M9cp# ܝly3{(fNHl˻O헹|}c=CD$%]2]o=Y8} ЕBب8Yn (vZ.$\J|<}hTb%97[&ᖩ{#-}uIaQ` )X]NTFՍGt A2"C5xڽ^WrOq9G0]ԫI0 bMr>j_2.yۻ+lk Pn`ʌ6NV% qZRܝVeZʿ-qo8WgZ>ܿ/Gi/Ob]S<`,sxujYZ̀o C44KO_Oeij Z:I'@$ۗ3r{ p)'qN3+P6Z'<"|&n6drH7&(օ2 1JaF\+ v1)i9Y4);;f?xXg%/ I{e,̻z"zrpD;$$:_c6! (/8k5Rwi/[;aՍ+LLɂC%j*?&~cj|g߇t}Q!S} dĶk{pDEc5ҷ{Pji^nlD)Aݸ9SD&U5B{>;FLuK(b셭XJKAmpjjw{FLmΧK.duklToJ< 5Ce*!g#v@2xge}ك1Kc*U~fm2aY0}ů ڛa3?q )9!i'tI{@i"Bn0/ϗ8 _+.R\ &>j((2I& @3Å(^f Gߡ zс(l11:,YJ>\ [uNb. 7G|ɚnCF 0>DR2dT:G+G~i*t -4:Mo/عBu V)4>?P)˾fxxj!ҩ<<|'n> oB>_iPʣ*~d^x}dj3,yQb"$EܚK&҇ڂ(_ATD2W6LšH=l!QbOl} lVuoX*l6H,5k'K- xB P`k(!`w5Aa0 hPC$-R wC@r@)a-5l4H~wR uH )BDU.Vtc&Hr*,pE%P AE+F ~ NRNDN .E_X+,PBhWGZ*sK˼)D/Vl `U!Oi dl.J}Jv=-x@IPh .kkw ' ΤAHƯ`-ct ݆hs GG-Pbؘ4)]L.pH_MR4&%LB+Uq`W#Rݧœ{ y*"E+D1z¢= @Co"\6%%PɃnf&D`єSMTG%KDx,!jp/ѓ% \t(՗*#ETFU Lg0=N_ismo&u+/U}q .8@!5Qy]hB&pұk!Tyf]W4x9CHףv/Y$k88%`q53/I%Osĉ9USEwsCLI|Hs78wZ8 .7B(D"yy~-X[bZmG# zi 6 Iϒ`#,[X]cer.~Gnt Hvvh&{`Bh@W/YLdI(][ҠYbin^CamϾOgC0}hJ\rnHM"j>._,r31?gYK9V d)<[@~G؇ҬػEAoݤ84I_0/;>,Csvܐ8V$5̲XgZqLXQ}3atrt[ Hw:& .JQ9dAdS9`4Ǎ&H?bD6AP|*H&0/eNa^=m&]"i?'FQ|A'pW{\2:Jx̜xxAN%KO,U-3X͕ꍏSad: MO22eyX%NHh+< 3]tσo WKqxmKqu"6/T0h/wZwar2qC) q*+!p;Pc`a|MGO_q2F? #@QKJEH6rNRF#L!jE;8K0p0TuAxj7 :˽5JO~!?'_.ߎOd霆h#?gR(Dh ,Aav~ ؀dBP8vwݛwvmZ[t!| lTsŠv}rN- ̰b m%V@ͧ :౎4L:Z{iJ=Wn'EVhwTەs,=k^Oe]77ĿM}ns `#b Q|eO&y?qP^^]-@[E.uߐB¨7h4ss _M|_s3=AdLy3?|`\y-8ba=~M!ti:{7a%'OYTRz{*;rZ(?ij.#ͬYʱtdYO]|y%oƥS?hE%֥Gpzi_a(BvrO9Tؕ D' [US;x ZQWBH&Usߟe;NO"&_`$Ǚ_^OmBn \kє QZ)n'+k!:P};&3 {"d"8^a ?_:7dv^Tan,(d NU! ᠗xҤ85|R{>JE\*5?XIBĔK4)#18d[\ GDL!?D8ypа܅dKj)rPؚG%ȢlLOx\u\抧ӂűJJ7 '<78.CR~.#hk&'I^a6+|tQˆ%!1JWGBm[|+N܇_SR˅NqK~ߒȣ2 ;Wf#h4M/G>5g :=*O\~a8T(1c\Q>ː3jZʚJvxn\ب8W[KA)f6j%ptI$twcy|^gעb}Ns]/or$S 5-Ѓ̓_4KvfZ#AD5wN`*5pӐ?(,Um ?. h}IxN&9 Ix߮L0 67RfɑR2T p hhqv-Pn'2r8!Eښd9A ,Kmo1`uW_XpgA-O;!fxn3T;+"eWqѰSc\\\\eC eHÌ`b챑G![qȞW + JKn »kLIIN?>veť6GA_0Fq[-Q:1C6K'\JB> uKJ7IF6qgܐ 3Ӱvf=j_!7A5E\&Y*wBTK+n馏s\p}P o_x6ۓ*?sȕfq~2DQFCĻ@0, u gd2Y tCM_ps=rpr-QI'FڅeH >qދgV$"/՘,h *H$Ktӕr4H MLuggAIjRpcA~`Dž _4ժf|@5>xzuQzM?$~`(q׾:wB.zs.&=W gNHR`C%̼ibAOss(aŊv\EPK=JQJ]DDFp"wK, pMW`Rcc "{"r:#MH &k &p΁H&X־,E$Dx Ɔeq'=th >p ~Mzg|ʉ ;IM3"@BB5K ;.UX  X@((2ЄnoJ22p`Yz8GxhaHTcoisd&u Ź̅e[:Ihx} 3ч1WdžlP7FˠѨeݑg褭,6*WS υh"Ǥ4oU+KHb.U/f&G1#`ZeBYl|>m Б>]Q"q u=b :ܭMf邓ze5dIe ]% Y$RuA2'ּC{[Xno@-ĭʹaR )3ӈ 0,el$o W@[erOЬjQ@Hchn{/^TW2Z ]O_WCD Nz}/X_& kxND K<]8HQ^q/<'F" ֈ,{8UInHVN?ñ<Bynfx@~dsS0ћ5pbd\%R%y9h E|} ? z-ф7 O(Wڈ*9a0dM- dL5! {s:~ ;F_{K`-lg%kvb3'=XV"hdMDFSj>]/m7/ZϠ s뚽u>j+p]%׏ &*F-A$Z-^jMc I#9>(g/:\Eof'GeOH*g -E>6Vx2 :7•Q\w0;Vwݵelkd boYqs!i'{U5;-s!Έ7>] y\;53"Pٖ~x+c5%DkKF1V]SѣO & w?D3Rf1DK`.su}z.rDJ$['VmĻDt(fg>7\w x*x@mIFހgqo!M[E˰M'uIDOˉO"DP9x>G4ꃵx^_Gka16 Eӎ+o~uj_BO/r޷9͊ot~ > ET`VKu!ѕ~Vaʱ:clou;76Ĉ0sxJ6mZTV Jȃ"֊{z>G5yLZ# ' uTKʑXz}Y,GᘠTx#Ğx5nTqIZᣨTZ&sVa yAk^iG` .XdgQt*K_J\ҟ| pW 6Aa7t]v3dhĖ 0"^f0a8XDSYHg&g~SD/mqBlr0ĝ>O8FCc՜Bl;Zi>vK48cf-U\20XS#Vْ !!pn>7FбT:2!ʾdzO^~Y=  .B*) XN'ap| 8r>0ye0dwȻD@ka-89j.mLb5h,@-1 ĄT %:ř7+sB.Lܮ?L]?d }:^^{@:*4byJègx #w&dV\D O5N4>@fƮ" nX߲W0}ܷw~k4o??R N1Xȅ;݉ްh ]marsL;H":.8,ȚqraUDͭDͭ_>bW/adFPHA:Ts\bR]^o[8]|5-O00nShL\jڈWRm)<Pɦ\<0jIłW1{[zetiFk'a !_j=wр sԙQ*r2OU }Ǿp7xd(n!8}{sp)7u+~'tqsHg>|8"-`Ӝ oECStiiXh]sY=Vsl,s0y%^UJ za6$9hR\lőG4Te^Xdž'„C'>' q(+I"ɘfʶ/K1:`Z4D##u\ Rv ,0%kS9ȵ%*T sbçjg\j^0Ņ'l.?slmJ t fI&#ȩV;l2|F:+#htfl >3/uQY/K*t <Ig̳ @1%bM`QyX-0REIQDecV rAZpHQVXdTŅ>$X e7!yhpIXz`&٤l=Y*./^L>6+V$Lo)\y80i 'DKc{U=Y[}{,T[أZ2hRAƽ% -̵9\ *"ֺN; \\ Ue@q%M;0 UPEtBX '@?>sJQ\}YC^%+_ө.A\0wjJ؅ O`[tJö5D˦!83X ƀ+AgdYˉJ r!_Px2oRz#D1]s6k#f Na{eZٙ/<˳v }4?v1oS5MҎtĐ?QYznnY}~BKz5<=q;GkN&hv~:i#?6ҷff*YDXe ,Hw d68Ző `\JE ER Oi)l$w%8 -b4{܀&n)K b:OnRQNpTHՇAY2[j2Ҏ?dJ$I]1 ÎzE%* )1SƮw5j`+_ CG_,*{M!~ Y6("[>/0l;LOEaRZUBBD1l/=oٹ_"B.U Xe˧#h4xDyi9߉ۧٴ{6@i&Vx\OkQ٥۠Q$f\K8 @D4(gu !RYZTyMf: /l⻮!<nj~zƽ,{RxX_qaPUl3aLJĠِ~Ӈb2ft:&tE;13\QvN5RK:RűCȬ\]CdB䘭p^ނYx;]c /CdDhTN@p=H5· /?;PlヺZ\|~^XUa.-VJOp7Lr MLU[CSIIeՍoxI wiOYA/x䯴()NLkՎz= EJQQmX<8-CRU4q+Q3 qB-tQOj]=>$yAh?4J&wSα?s&-[b $Y[ ʐHjT s 0F#U8ۢ?r ,LO (?>t/Cb ZHΉBY :}O꤮5#Y֐o6O)ɲ &.9^[sI_ ɕg̘н[IlvCC)dT{1: d:%{;-3J{6i0h֔IsybSJ[ (>Drk5-pM="ZYއҎ>6_`ҫbKrj?!}3Z-{w4c}x[~3R{M ꫫ' %zVB^bs-УӛNRc!DQ"  V} WC6K*@Q?rg)O<h9!{1%qGprM>!8lRE<{|#zf$Ԥm:/Tr0-FUoANr=w18r>ě"ntP *- EaKm_yﻼ_tk+ʪn)sg/\_YX}[-U byHn "s3A,.s?Һ\܀j燿???0893A9۷XR@= W*FG 'e"ջ}=yAȯE~| dgFJިBĆ(a$LSid LHE``)i}iJRIA'"[X ͡glQ% .`kHz/&WDi`ez)\1̨4<` v *'{3%>Jofq D==-^蟓;myp@Li-\{Wf"@ uLMNe ^Q^rB?4HOcy)){F#C'1! ې*$<ϧ8ڣ MPA1<:N#ɝKV =gX>>oY_ nnhqwk iiʊdyLb _.I΍z|6{.I43* :md.ÆMҧd^aZ "k*D RJᣗ3bz)P]u{9A B`xN'+pxϝ02S F`dOumBrTO_hѽȍ:yplC>R lYc iU]T7eeZ@t5"#4mxouΤR3LNdZG">и NuqĤ1.]I D'{VXl(-)Y 7J#ƭ33'*/,tZ\7^vS:|:rg6UUg,*q,iNjJ1߃A16G;+5HXLME !%O,9 )R hJЩ3>Gr2f?Ǵ{ z)P$l*qAѻ5&CO&gJ͉B/ԏ"9-P İSH1#$TEZjƐw 'bN$6H2Ima@!;4^B^v$@mbBl6'aHmu ޛWgӆh5[KtJ"Ml}wy؜ .4}̗`"GDJwo0X t!)ߡ_L99#1Hܞju`t$Q"؂vnin6` ث/1liv gL3w%0}+*tv]WNfS:D&:mg ^sO~? @NzwP3=P³o0*471t0x4r^6%N4Ϣ*J皷FV* 2ǂ7oz+K1F"dkuzcRX2oXG~nc򩤸@d v.pDs]`9k(mX 9$R' zIFܴ/%>4t{qSۓ65ҤD?rFqDi>;1$8;m\N=Yt# 8#eڰH>uo3-┥' 7_6iAuV$o_T#p[צ֎7 ?iߎ/=Sx@|»?Yx;8"xbBq.R J4&` xhRJvF݌g>$Vf>=51K۰ (&ѪsPy!> Hʒ4瑾;#-gMP%Y.^6Kgp\`c,P!+.ЦKjlMB/rA&>B[ws7uhNRIkY/3Z5'F^i4vaM}JasVG<@B f)L\"|MZe7]B,%Թfŵ2S>M Y坨t ﮧ2t#Z>/>L=2t^XߥoW,tuܚO9(hM h}58)qӝ?&ǘ+G 'YG$U_Y A\ i ` pnglQdf۴@e#:O΄W_Q OLhpC;g" P{Pa5sCϛ16w¢y%bEsP.ÏBspK-I?< @lk >{:a-?6Ā39SV,(d#" ! 7g9@]j#'Q+t0{tư,$PaZt9SӻDp&e;=(npaVʑFBa~逳\cm^|V}XPaN; }υݍT ш_) H?So{S &>Ydpjtw6X &&`w慅\O٪Ӫk\@`P]JEFJri+!2E o a=7jqeg9oTW&r R+gDxm ^AUEȢi̛~qo*p|`I(βXEdo$cXC&bҷ.CmWW1f9ʫ=ƒ Z_{& #KՓ%TPoiAXm-Gz+C\x1TSSaE*v繷H4aEf|qJ3ԋM Bo`xjkyN~ -F*X{^OE5pP(FĉaǓV<[Lz4W˨6ro[ E% hTǪ})*Sp>\pB#D(Yaxxa}wr| uեMnvӱ-AFb-D: +&`NMrFDAM>†@M[&`h T,tuU;ZOqPwׇPnb 4TqK'&T&K >+N鯕3EkGuNN.RҒ )Dܳ*9ȸd~Դ_Sr 1bfqdtnOipS*9Hnm퀽p Oof /8JzOOVss3Q.TRaŢT.3B$Z $f[Fi^?[4s<SqjW0f N0r1'lstЧ 顰,]@lSB#@Х6Opz [ub^;Bv^؞:LՂzE誯:~cDRJI{$K2LL+*k8Tc5]!>cBmVhI3c$oe,@y$BkuYFՋe \ȉ=H+qd#5H d 3"`)| ` 4}H"0r==,䆋P nB 3b0 jH6GH̶j$"w;8f,1NTW'gCBT`}-b(*E{m Q k\i0ny9R ' l[ nt0G, ;*Pc8lTIfv8eF)ǩKć.\C*R =u0 /zL _5Xn H2q:ﮝ:g4>-0LQE )SJUuBc$^ᙚ(S ijɃvxyaCJL$k2l2xEph7K; #lH]HG *]COEe5mUPQ7ŘPH4]P4!:#(Xhި-Y 6lohtV) Eҝz/emc#N&R JVx9e" X0?>\~XG'Xyt uAirg ?i[ j'!-n*f' ~)Odn͑4Lcӏ]|*)O'L62̝,1&COGCzE~=1+EBFP:q~_|48. Fwjw_~&2- gcExhxDΌ\UI)1THIshsqVHP;PESiX.dQXAVQp+w:ĸvj#h݃LV `r [u~X67xdz89׿=qoAf? ,&76(gG^{;ǝq/ĊP˟meR­9N"AdG3RIF 4B"^`Ɠ5dl&7kʻ1fa ?@L ;Ws0泜Xr)~LV68Să H C##ǻ"!.#mN;.f꒣04ǡADFZ{{ځ( _ d/۳2_[CfmNx,/OÖWmCSD \WT 2Ȁ!)-D9C[).AHI`,W2Fu|\2"p),Vį9QP[~&ΠD Ch ĝLa˚LCDWAoޤCD-+ X_T|:#YТ vRj˘ȂAvԆ־}}sk}'Y_J%gOc\L&ݏso a}Rv/ZnL6>`e$dGFͯ#P&bFk!F{JR PnӖ`b(!,.sS dcQ$#!kE ME;Ѵp.QWDhtLS iܮ 4PLNgY%E7*o0~X%_2om}\|.Pó[ï TeZ%c,摡c$ܳgzF^4t##1̇ DOra$B<*Vr(aWӃ;6 |f%lBJoaA`$Y=2KAsͨ'{)wU!-sZAߖf.`UĎ?V,0i 6* R,Z'2${<zYE.Z`D_xal8Ytq9QRg@_#A yj/rભsm޻=+MCZb>  {i`a0\w c3Fp7d l^%-G)Н}?o|Sjاmnmu8'Jf(huG:J6It#wQlX)a+hk4hjtVި{YtVY5Ԟ<"ޜMv PְXbtEgV㣔$9!Uڗ$[&^? )=:yi҈% TTFH+7X~DPہX!P¸a$zy}8>phKx-dmusYؘ1 %`2H@eƋ@;zD)iXL]"O/;xҢw+l%bxCoЂ ˕! cڶc(Z q99 ՛8n0S$A`CiRZ !NCJE Y<Cz>SD8׬3"h* f3 PI1)詪1ܠՀS{bS1 9 N t( J:"0qD*1Ya4RhCҏcpi$#Ɓ#l!8cЀpsh1< $M9c`FRdpa8 >Pœ@(1&@ p%@ hB0$I}(F1o1x AdCM}']JY$@>$CB@bLbB %zfsA >%teeworlds-0.6.2+dfsg/data/audio/foley_body_splat-03.wv0000644000175000017500000006240212140200333021604 0ustar felixfelixwvpkdRkRkWWWGHJVIe_2?hmJtL$_x{ݚg}~$?(?_>t9l4׫D!"` IXĚ t51<waqE%]4|N'.߸ǜq\z_7Mn>"匜ʟxͯ(}]+W>tb0RY>AZ {ܟT4cJ!27y}!? rEEpyioNy\/?"|fzc*n9@\H4G htItQQ\^ﱃS!ˏƲ+׊;?>h듉WzBҢw#/* kiS(~f+ɱ5$S!5_G!C@Dtb(Չ m|IM8T;۬s,-Cq98uM}hJ@C~o =q9I(??l:rER5Mαw srB/TlCXǤWLX ]Uzߌ2ϚFcy\ߌ:+Vd XDqݔ %*Bѽ zP4|un)#쾺?vqRL lvvvw˥`(hC:  ;W~KC>Ɋo%|^.\rMu&1k.FXϹ%?D^ڤ*352^ g{Vs8,O34VwEudeɵ,H#UeD`sp cJ sNڊ*hO@yeQfdX7,h7zӽ{Q?p[#%Q! b=*f(,)!n` H*!^4 f֜ʷӤ>ޘ+MG~*lLOQ' 8SҳMe8bDH@aWmD:Zj FfQ?}RBBGEt%‰I(v5x9Mg?<ݔo'oG(VՄLd +(UEo TXJT~;}{9ܜ_ suV+wEc{R[yjEjR+">Q :[\`oQx(`dOW6dLuSC;|5`XTx)m[uy7OM?,MDƲnt( 5Tnx8/QBlLE`z<GV3p|e ȁ!S5=Fsxӟ5kYtKQo:Lϸ5y$k5;˼}_Y쭎ηu0y`czB[IGtbG !bĒK n_Dpfw\ jb ׇ4_ 8n@^ C JeY3Tcts}jq|Z 㾺4~ŦnwF1Do $g !F+g/!}79]L_$mX@IUEa9 Y-R"$Ԡ$Dl"5@¼e27ȥhz8X6a]A5WȺrbAG=r䛅@XT}$ {$B-)W"шf^!q˩p_3@;>LuqӒx,x~F|&#˔w1A/EB( (k?/D MS7%D'>v*2qSc|To00:*ȑ^mMH_Ƶΐ<". 'D"1!t" ʉ[p$ch ڻp܆N|;8.xh/1J(#pЅ(,/kl [ &h _@F"Fp} d,"nj{IRc6Զ tT݃\ubt{J w2.um Fxg<>-AioZ1Y칸Sy] %TMG|Du4WN||/[ f?mt' ^ᄁòm0W00]HiU݆*wJ!MrzR\LeiSQó{ܳF l6 &0쨷`0ʋ&^0O#ͥ\t`GL^5E?tUS'~?8Wsr]XFdk8|Г,bģ⪾u  b?R{mdVh!*`$["lsW"G=D.@0>>6+MAOd¥i_5g~S3uR[LG/̱!1ePPFF_vH} 91EԆQoJ NA`HV_o@W$Q"A Oheά-~~ rx"8`5˱eʌb 7B^H0WGJk*|0D  \|"$]+{7M1`V4KM?;)> +\[řsw{\;ۿ|$swѹ5C-ޭ'/`驫:Kc/`f;Lg}  }haN+RP89+%a7ZBфVSJ`%xCHFE{-X3ftm_jhC=p$q'2)&rk磗J4Q,⍃0x[b'rqt J/d3gD29L16?x>|Ebr%ۛcq+uq9_ܲVDD¿%NŃZ 92)T@òs7hpcIZGjʆfną()JSȴj\mCRźO0&:k/^|GpYIS4i]j xb-m@ ȆEmQ8e'4ـH|VH \ (¦Սewq*lXb9XYC T":u?׼,VfM9b4:mrjJT}W<KИEQI-mmI4n]lvf\$z&zŠW=L;n(4 O|3UԢwӲCx"r$vrBkshGII--CgaY\% (??g; pểޛ7WHY%;)qu>;ٗ6W} Z=@V^*E/5& +xL P1E5ܓ!7)=b}Ò 6Pگ%0 :C=epʔ5u҉i4́`v1*WT;OF%BMLF!sL?ُ>@tda`kScL&"%B5SӅjK=7j`J҂)g3)^Էg F~g]NQ"|_[}`)n3JZ7qJ0EOT 6E@E0}k0Ce0^,.L6Y9reUCT3jpd血CRy2_>T *"mq.< R@ 1,9֮e4  Q8+YqO\m_Gf[ &G*NdzFzzi){}} Gag@u+DJVmۜ}x7;8tUqqc | _Rp4&J9JIer {'_ ?P'ݑk`,(S4ApEM!vڇjRګMӚs g.ae$?Lb &j<#Db=a Q^jP-1,Qz֟E$ A# eChow5Tȹ#;Q2AL WFf>&,ZwW۪uB[ U+v:k0xc3z4Sn-'?<랎oAF{TXp,`D9BK#wH5AE3Sט xr9W3 DOMVhEvT4.r{ X&cEG4bxnRƤ0Q,ez@x%M Pd _]y'N$S¢tRUe]RO>-IH] ɦ,.!ѐ Ad\C )IgS0#&r8XšuLp) H`M&,NYP~`E'V@yK,#M&GxM"佮70CF m \t' |\ 4AEYh&h rWٟML<('zśLˠK8.x`XAtqq|zż '*,$ SOOSd橒ZĶ'hX} !TŦmͷtgc-RrUEl=.%xhxS܀d&.DOs Ic5rO%{{JF#NcHf3Hx:szRLͶz#۔G&rPeLیf"RqW»njbSJMe7R'qď:~~V*poRάE* 5"<f.a;]|Hˇe>E?<>o69*C1>`J>l5j٭OoL`F`Hȗ@H5,FxeM"Z".PXntnCx9K (; F%_3 &v?s#0n,2e¶ɟRpY ēj(cҖY0eת od:dML='!^#ԝHBhQz+.}(0  PC`gΤ7%Mp3Ά(Fb:-D{[E!8|F%?6C\-ێa{]'O7K5Pr@8%KN@ɼ=E\RN ۋ38 ) H s"RadZuB]ԬusH{<5H&2Gi.U1jP Np*jܛyl`#q# ogՓ.^ נC$ѽ+.}<|LȈbIA("撢r;bs4zރp/8o^U Cҩ&>c{Nʦt*/ƪ9n'd>N,>q,);wb^"նΓQGorE"x]|K,(O 'k2 HDjâ]%]H[ 1LO.bʄOIp[1.{)>Ȋr8gJ)Q m5a?ytHsxI"`S|uH$ߖRǩ1T؆י|t;?XN+)MQ*7hcGeŒڮZ@Cu@(nuB=d=Ž)*g6gG`9X>IY}D > ~x _~'iP keHed2t\ ^r oj(FA]s)PbUu^SpݖX ! 뛗DeHPU&MU]몄BI=5=+%HV"0sw}xT̀jW_t 4do%2V>$;1?M8^O4W,Ӈx[Kt߉~s+? OFl1l\.AMmn).T`#OdlHTʢ@RY Ǽ>p0qa5wo 5RA _mM\wtb/WeKUH (0!FU4FC65 YyAx| C>hEUawp5K_ чNA*՟Gl;wJj+2e?3Uq4z?#, KTk7Ul2i5g ,v8lh 7CE@7<1 œMmPYOVNZ_VTR)ǣgxMc+/`< %vmjI(<3 \ zlLK ..{cPB啉:l M`!ޒ[se[͚D~t^êZf@?].gc=aYsiYmQDK!׳}_D;?J(˝keQ%U\3}kuC䬔lO"^AYL?*.ؽB0F7ϵzf7SFT6KbIJݘ%SmUh;釉+Dl+UX:+ELI%c`bkdRɩEUyz 6@_[6Q60!19@:Zn!J G~t񓹐texlG롲Xr|`kZR-?N{\X#gWD4Qln>Yԉ}xjRXAZ:5˒%ٳahGYP QG j[.~w̍zz8G羿ծ[_7;ӧؿKQ[3/qs7ĦU+-YԷ銙dΠ)΋}b)t$Aq[ @e?qf-%&]7w0,$q;< 鈟q26v=i]gM6Iv; [QF]5!sZR g@uWn_?~WNu2Tjɍ&'b[ZKö?%{矞JpE9G#/X5ևXCkL]C^IUԩ A`I)qT,?I UKRUl b 6(+Dt9.Ӏs8o9ViktkR!x&5Pco #@3D566n&AІ/p5Ȝ$w<>Bs;-Н',XΔXOt `U:=.e|8r]Ze{8~w8̧OtB.Ȕ0y!IAsZMvW: j&YN#׽Cef㱄 juB='nk%TjW/Z(Jd+tX*lЇ *~.<#Bν`l] )"u R}7Aq3xL_ٹoՄX _MvK}/ne.PA1D A}-CH$399^O#} >M_WUM4ַ^(AYp9NܢH;aQwx-[CfϾ [h s i?mL,6? eZ}ԋJg-\l2B מռ 86TR2_Q5{Ա+A\I=v\,nsL|X,٢ {;T5QoB}C\2EBU-  ,^?ɒgoͮ.qaxx%M_m 29 ]h{8n ǵ ,y 8"`wuz} QGFŦ!.ffV{ڑ$w噀ν4h!e)aDabE`!i5ac\՞<_D#J%NTч:㷁FWdȻLy^ 64!GkӋ򐆖u*,U10f+JeUP3O)r5FbR޳b'É W"Өxz)I\0t(Hr< FGI$ċhCeW܁/1XY!p%D&T{ ؓ(t7:,Eb2ϙߤPR<PdI پظ\Ʋ? 9" Y*]v t?:5Zeiwn V),q02R:F>E(-j mҼs_۹CVO7ihԃE/˵8Xtta1{xF&&(U3#RN`c;56$D.j$$(ywX:jJ$%V5knaşoqU \XGXJ;^V/\[[_AAۊ`0BӇ}2|(9 N'RpŠAm)+]fRË@UHr#{yJM# L٣V5N;Ԟ6e Ll!iEiFȅ"ӰA[M)66"՞iED[]ęCiJoR(&v]Vu#Kl&#TUl2 $@@$TTMk.R쁺[2C13J^'ȨpWo~LV|A(2%1p+(Z!n::cjma&C2jWOlPuVLV);m@Ҟ=GQ[x{tt{YS.9cd B`]wXbӑgTs(/_J#Rq"~ ?`\"g3y8DTpT۞ ?G`MlA pJK>Tf&,\鷳P>-(.aş%~i@8na, O] +F=@DbA+5mLՊ9(6R'Si 6\:d-W圅66Bg_aZu.j,*cf:$>`: 4A,`9 "Rɼ ?10܏F3A)X^҉8,ܚuly*V^<4>.XDH-?P0%&F;ǩ 7h',|qSDx`9؀2 d )~|ZZ E;̸UOT E 9l.i*8KdĕLe="_aDo\=H|vz-F9 &\O-LД/bc?dHLr0 qz8pGXEMT@E(-a@IX# bX_8 `(wQVwi;jI9 886h/f%U%DaX[|?CO`\4<= 7zFxӟz|#^YwIӝsKUc{z8OyǶ?vJ*^v)ki5UJCpw%MQIQ2dp 4_L#;-J'[t/p\{$#j5[l<=ǶVn7>θ sc0RT=Zok*r XKflc} ho;{ K>?sk= _M"A,7+e+r5 /Gn9Kʞ?wRsTvc? σoJu=CcHQ[0 G =Y D*8IdżBm'qꐀ݉,J3&XF@^QE݆G_z^5j5mʱ}u@0[}o+8{c*"H^O̒vUǜt&ˉ`g k z Xpg4CwTmiߝ8"r$<Oyz/"rT銗|GV,e3( h@pIuvobn;`R ~+Eruf24eKb{pw ,=ӗt\-W(VqovNgJ8@MpQ# a*ʩzΪL+gVNG hp@J4v!݃AUXL%%E~M3?2Z$k YM5mI nЫȤ8; !DwR›,=u%'^Oqo,,ղ̤6&UMo(˻ ws3}1 ^mCclWYM%TF&+-r~c;/ {%'걤]/ 4g8H HĄ7,QH7]ތi`y.JXc5k^E z(O*( J8U(&[kdW}hl=@|GK;ee`P;8@ Z>$2D5ϕrSj_aO J>d{b.7VA9l7E9œjźHy6kjhԚ+=$g%xxi O g.T*}10\2ұf؁RտT2:%dz vEP3L2מ`\-r9 Ž޳cGaVYifK;_-<;+N3DzXz%{YBZd{Z3϶bӧZ)[W t 3۟kVIsIx ;x%f.t*R H\epQY;~C| IARk<?7ʞr1d0,VSa@9|3XabF&'s=shoe}ʒ\ !`ž[٣GKof=+^~NfjB/e"{` ֙R򫉋O$&sOH8/4| X A9Zʛ,Vm𒽇Sf򮻸ؤBJDQd 2}x 3-)N:5۩J{ 7#hy$D\UI+jJpmtV[gSvjKpą D @jV7l3/crq;$3T!  kU (r 1DyA{˿rv KTS=[j<xda)Uf)Pot#"8m?F');u^-\#2u?8QJXfc>}0>MPLqJ5++4U,|Q @<.-0\oO"j$yv{p_n/qkqj@P`,:]WnۃZrd v c]?tc nr9y `B8np&'Uqה}G2OFr葇gR=jr'D& FPep0” 5=Mޮ[* mU39PIg"ުs ^F'EySnD;Ģ|%"2 5tj c=kB].XĎ,GGB651+{2^9sip۱A ѱB h9՝]gʨ`c4ȇ~0)y=."&@}B7l3q{*GvV󑔍V ==T蕩| `4oax,kû>ۭj_Ib[if X.dD.mKcNM9+!0&MA5_;4g#hZ s"lʨ])N뭽 wAo"IP%h`EZ 2R9 "J@I/ e4kGΣ"vxQK qTG GMVC S GZu3>O-pbe# ю_vH4c3/3MyMFM+T)\cm\ׂeHflJ JjvtA+F4O͸&*j nY\z lk)A?npDRYlnJB䈉aփ V<4@HX"] Np^J i6;k*]o|75pMb/ ?I(( Yws>rb42cLL-=anZ6 my|%{$50YTfDU#0ֶeVT.lFV5Q)ҹV0=!.o-n99N%CƮ UF"kCK4ZqPK 3U ZG_ԓ7~wtzh F,sv:Y+e8${؏F bi0bt.%Zz.U fj-iY-Mt}k{2xաaTeۺs{輧jRԯ\8ʐch`ErSAZ?Z|y>wljL(maHkn2bVE `O sWWȂ$ IWxf”#9rahf[QnhrkڢgNa|Yv0NJY@&ǞZa~Mv=߅ع}YE'xZlڒ TPܳm=g>_\6= 1bfpbqov/wapS+:(0n|*_,d]: cWfնcO ^oEN\7+0}BoLj`Uu`eJD8(ET0u7ijp!@i(f>$;[V&=}N C0#uxAqC]YɪSK`8ƣL+A3g]@a? #S{;o=׎B4Q_BX)h*)ZXPAphiͷ>,e#gbzlӡs׹Ǿnߪ8]y?>%<}!j[A{^ HZwA2)+pA^P|e,"̓'zX?}qf^ +>w^\aE?RGcpg|Ws`)MPI.Bis+6kR-nBg;) UL XC,fVgVTa~YV-NPs'~Gt8"0U~b"$r3;Z"D `Tq/PYćX|JiU!=i#X /&җފ|qcd*=%LAf}I^.n+Z&}"R#FZvBVȫ K<ԒQ[M$ؘBb> |OgD]*ո84Ѝ-6; jB@²C:au_Jԑst8^֗ߙ~-{rq+J%y:I|zG8PlK{@qq%\5  hj6@QשhVXްA0N #pdB0 _0e8JZ|\8ܧpEʞMZ>S߽%xMG+-U梬{L1ju.9H]Q2EH:Ql;/sOC`QߢeY?NQ`v/07j6F+՛DtmhuTzZ&S> +1f%%e%atEEV{Jx&“ǝ$AEpo:2EzRe\ܖrXaZ LaFfĠNӵ_έJE}[Nu,"q@ct@FY I<`KrYGԣ!*KeT6R[]l,QnON¯F 28jԃ#$X< _5f?yA3xwT'UoǍv `bza4%֭Kw ?e.,>9oB_`J uQYga&l dߘOl(YZ2<|'Ij֢sw ={p:qvj3`!Ȧ3ތTWǑ"C.ͮ0B6=zיuOm Xw?ԩl?kZyHH :*N2Q] 5Z 'XfԶF ޘ".% opB *lBG-ev+jmTE/Oa ۯxNF ަ3cUkJ~!}hD.9 H+B*c! e sz3*!gp.MZ[Y09GLY1_ykcI;"`/LQ^KQ̣P$^2ZuK"4R-J*eׁpxKAR1O̞N robhAeY%Dg L`߸&@B(nS)zpP7H},Uɜq0 krih)6DNne5 `6fGm{ &ƺ8_>_~EW0!5x1RV&=~E7`p-S\Y9NWPh^KY gwMZ$rVj!GۍL|A&;*Q:PW9'rk=q88ψFFVGI4 t>LvtAQ6!`lt`!#L|! )r3j2&3YϬWzdwZ'c$ h^v]dF+P;aw0!9W NJ+xЬa`$Âa9|lKz5$ 9F$pq>@8sD{&KA;O hK0fRm )B:Zf3DR3RьP|UQ"QklљfD_  Rhb}®q hYPˠ!K`\ܛ?x/Gza7Ѩv& %T%jdnw 1(S/7VEgW!Zn<@.Lu=+ em.F+g2+t;nҞm<'uX[^֢ `7qF0ECzC7'vyPRJa&~Kmp,`PJR5,= ql1llGoE7.A|^,JPa(eCAه~CZҷJJQk<@LC Lo od` le@ʇ D9zP7(ʀ)Ãߟ$hDlpsU6K[,}piZ? Ok ϷOPK/ гߤIGɩO1鏳E5xLl 02DCH0tbnCh*?͇$Y#Cx)ȽBT+EB|3|;/G({hi@e @Я9~oNyO?](O73%h388$C.oK HTԔ:e,q퍹~GJZA$Ů-|1m!9֏< oIFxX}(-h9Ҍ&s$Zt9 (M( ヲ)Z/5d(C8$Q[FzXH9Dq|s ؎[&ZƒF1i5K|p  @g! D0%fh$&B#@6  S@ ($DdŎhD0=>Qw: #I 6y歍Z Db<*%~tСbt,#kb m 1%؃`?(%ШP>41Ɣ@'gH=JʞO5Q 8<nJ,Ď  PȗĞPQ,~4f5G-D tfLO`@g 0~ a]MOvܡdԧ3z0@U՚QG"61p rIG դ>փNG"OL@@X-({TVPA ϔ#x@D yD"Ph I (бr@L2^[yp(cZ2F!DYTp(rL:t#!$}>!3pq*%0g4'iqBP Px@~RȀϩ`C6:v?Q ƌ< ja4C"( 9@ ñ<=E1 g>D0MIP,DJP {bq&Px` T8$8 4d@dTA a|H‡Ę0A!=3`7@ Lteeworlds-0.6.2+dfsg/data/audio/foley_body_splat-04.wv0000644000175000017500000006557412140200333021622 0ustar felixfelixwvpktktoto.kWWWGHJVIe5eOww=ُ/cԧِk8=[M~٭D߬M?0%{G{@6|{GʥfEZa(3;23AGY堨OoE6OMhxKSYgGyۇ%J'>'E bl"C T F)Du;7H- {|S' E_7I 3lLb DGZ3"^Dq +UC51E"HPj :[m)fnm[+UG1fꙟʶ!Ie+$dgq (XS5X[,=a3" XéB74H r)(ETO2btR:&Ĭ7`BX>..lmj $1|ָw J=l䚜+, XKG4Dod{P+.ۀ{Y/ 0P)GtgʍiilX."B싒dnUv]}ֿF3ҩ ?-?LJ;#(F/Ħ'$_V7Pnh6Ɵ:m[mvܱ(|BsWTRYG,8otpnތ&j!- Ҩ:4ao ``3HciMQ9W۔BSޫ;Djyͦ& @Uqf~Xjdȹe_ATY>ٹπmXRcVmBZ%^0Z ^zBҰ9殁n1ﺊ]]O<ȿ%Z t5̷3,BFQ&) Lڄ2x5'6_.pSd[M8Hzz|'M^:s *et~L]CSK% NPcbܮ02MPԮ 1RT!V1b$ Uq4p1qlA"&F %7c_SN0&J8U 9 hGs]3EtH-tHzvE3Wʳ߳KWsX}eOs@-u8\7@I;[#QYoя\ōng?f4e~t]yw.!:R/"NX (_l} QGjXNy?&~ó+1%:L[ 3n'gr`^£55΋R*XZA"SuVleΨ,b7UQiNt.KHMw?*XҼBM=ٙm*t=8 _ D{@ NQQ/@'"=}e.ܛ刱N2`F픭tXɘh?Le^qo@OvȚ'ye3tW^=umkqcN ^El+, )VZɆ% bG&` T -rrn;J_eW/46b@Zc >+Q@kgp⹑wjf1Ht);I3{At^^W)&v5_j'x$r墬Ns=y6FÔFlYk|$=ވXJ$AE^k|}%YuYY318CʼnW[WB>kO3 9p•Mgc_ϷgqӅ˂.RXsjE^c,AX-((9>> A"j~7q!s0nOh,XNѢ /;} 1hLY.n G÷4GuPU$ԽMZÞeUMTcS#8_p$ýR:cABP"n&SFL)H%$J a|~!cT̻c3H\yȇyM q@?%>K CS{?>jm Ga\sql HEo;;*_~cS:Ih l2zRY A Il=\t:k" ԝڈKGaSlR#m"Fy<_\ѯojXrkP+cuE:DZqN!f8θGι4,P/| B Z%ѮN2 xJ D  Sn:rzXA yJSr[Ǽ'ߠ5a@AH9l>Qpo|lY#2?_d_" m;bݳHV>'k,p }xA@(KjA3 X+FXtM`D0Qo3WtMg`\,ʠxl\!YK>;<˯9O :@-_cʭJ]8EH?gb35de[IgU8uQmv JX oo PJ͏/i^4aYDޜ*XCCAT3Y%ʔ4bb~sU4pԎ92G1j$-#|×qXҞ Ot DVc18F&keǙ۱"߹kځdjYhiǥg$VmAsSvǐK0:зAU<$@RGem\9"s5c{ 4ߦbt?|n婻 1QAaVFZ\}qW؆`AKMդ=ig]>qO)( eBHXrj}U.0sX  ȋP^}rqEtlϗ`>C4Od$CqT0XP;yg*Fo ydBgKp15+|TcK'}PK]iQЙo4BcY*LA5Ks[Nn!:`5ht~wجz:#llBM rA쵽 bI0ݜH!+1j1Y12P DNت#9՗3WHzÕ#N:æ~Q,Vڜ" cx^PIr5g9X|BV2N`;8B  %рcFd< |iB'jsp$ S>)={|rf)5&I#@2bt~1N!#2l&7a/B&~"R[˞ZgqEC~ǏIy/OMgO;M]G2Zc$ϱ/eїѬ\T6~ q9j{R|6<+g҂)q]MU'U_Cy}in~@qStH-AcO1+L,S}8s|bWA>+WB@]_M ji%_eD-G9VH7֟H^" &"V-h.pt|r7D^ˑg/< ,1X%[CcZ(M;PTRzDNJ^j!)ͪF~C;[gLÞnPʱ ca)<*4=W,M,;ȕO>jNFF_uVCRvVF=zQgT|SKBu0[og "cT vŘnV)ȦUmtM_E81P.;[i3B69RP< K$҃~E1Հ[68HږH<7ﺸԟVK~tuwDmC~$(yĊL kQ] #0֮b&(xW:ǙW?7zռJvzD=&mώOMzEoo+qjۆS3wQAU_f,6#W[$w2$CdNàT%kC ]X ep]P/ֶC>ρFyWpϝUw~vTQČ7pH]%HD& hTHuN*i}`bZ@?F(^:5`L dPz" h48PZ4NC:_IN2 ͛S?3r.j7@0q0|Ykr)9MII`U Sta/QX$:~ &Gd 𬈑;uc?{2QtRl)4x.ZmnFB|0ɕ%5bh|fB.J3y]­j7Q #8b+²1 BkK("mR@ q U94ruԭ<B#I"kdm$Kx0l.r Ơ[ ꑂ!i$KE ,.Lzж ;p xUy W<& _$(5#hc] 6dP0> O* R:fq@2^>ꑞvad#*xNGAdңANcbӫA tOb:`fl޶,`:>f{k s'YDj{@mo0"{=B]U_n`,qRFA?};V(;uXU# \UJhv)Lm=׉%TGq4CyˏZDD@H%ieôiFb: 0|ZAø=D$Vre~q-_HQ<[)~"hBcuO&Tl󎿃܎ꃙDy;s-[`!OX,fc뚗t6wqRp3LmeMS+`h2݃(@حr+N8@̈́7ʹ\cR~V /2C͟BbiKJb^(x_Zw~s#׏Oo|OE{q>W?u0 )3y8¹V~:VaZ<﹍zk ΦRěQSG9 V{^EPj}FNCm|c#a$D7͒T6^K& =k+$X>$$g6AŢrfU$>XgiSuQhL^F~m4܋' Ut[`fx**@8VS!]9N6MqbuγRv,Kx%~ ʸ:rumjԥ#WާǢLrE/gu[&xFF#MrWPw.>9A#oB[MlKﰀXha'A( &,Q֯{'q̶`ddTNƚىNoyOFAUb u,iQ_j{œc7sM֥NiqHl T!gʧsl(p,KbjM|!I"か&a4e#YmP  ~`?-ܩWbqP4v:EgKEz<1B,K_߀WsW0Bw:/(3D@h~͂$.Oc>J HO wsIL*FR |X_?겡a-{D̉*Yf |͹@+$v鉛m3S/,J$m6Y}"X?WaB \{u0±?M]DJ}B,JÎQg,k7!1)` YJyp6,< aE E {쀍{agz+|rAV>TAF&aǔ|a ^O5`od68\G\")l 'x}2@f+d8 3IwnHGΆA Ult13c&:Sj"t{59~Su 2ug.+?Î.y~'N%Ҧb 89w󢟫l~`?'x dNPmi=#S/'.5ݓ,E>B핏F-^˞tL/A0~8VG`U΃weyAKN,a- q7[ɮ()猀vIq0d!-7XM{"tMC¿&Fb> bԘ9qr2Z|Diz'_!pטtebu uڱ@1C2(g}mw>9 V) *u)k@k.G,&h| 7HmD )OrCQ3Snp+?*e$YO{,BYj񩂲YI#70㹯A%{SUhƇI*Gj sڏH^Q2a"c5p )'$<.]ODžmmK$t̏m|=L]yڶ`<[H;]]_ q}䪀NS{a /R,oxJpӤ?I;#c!e>5Ow$1=/%GZG2;7^٬ARe'pŶ{ҚC T[<ƦϘ$Ͽ6ɓծD#Vm\}lTAIܪf'qW?v'J{ބQ F*gۍ}Z,7ʙ)n֛ɴ.'#\OV7PwXe n"ۃA xSAFjqwcbjYS: G~RL0w4 Pi̖7;}ikouG:NSP+l_3\ұ,)z&1.DW\)er. xv,_Uq [9?ʹ9+Իު~U= ky_GvU5r-P*Е4}pPZ29 6ewLAXލ`a igK>VHxz-4ru -h`(r/vPѰ}VoQl܆rެؑǨ\04uE9S?2 <&Cȁ7Ý{>a \ [wu% 90BoW"^"xQ weuDiŲ) ٪F$220I[3S#5}Qq/Oi<ү\lsH6485:J4Ȭ=I+ՓU!47~$J=7K-aCpj6gϴ l ?M`i< HL .81V03esX dp]OYRyx8DuJ(2L5x3^5-`ZW- vQ uv.5YM5?֯EJ ᣳQme0 oRK -gB/i\B#'&O%O&L?GG=Bkb6V>Ws%i*cԛvx +0 q T {V" 2_(X^Kf\CX$$^2?Up &O]Xcu1$Ĥ&:bH$]Sٰl(%|U܁eډr@(fgwO2YDj4t|):Ǎ{ԭumw=xVӀ,5Dd2U%@ֹҚi,TO;nU%͊$j[FfaMn{-b%Y+G}0D__v2#6׌;O2(72j2HnBp#Hs{JCZ~1F&s鈵22< e+E,]h[!1{;vA M U n}>F(?g^RT65'5JwЦӫk<@")u`W`v.oNḮ?=BP10E>8]vE18L3le4:w[SpTMJS92@ "AܩAm$Zl),@2xpJwJEsCҠ-j(B3W?=!+'?C\qġ)yƻ]w?ӄqVmϸޙqu,y)#NQ׃S@'@ȫKè&{dhD 6qrbϗY/"BRrQn/3CKVU3 x I^$pB]~-P .qa&%_bbbm"&(m,rMP^r2;a u`NIw^(Cg-v-h/x[xSSsClNȟzF&ﱏ+IVVp* ߰CDwOwOդn}?o'YkN {?{q=,7cZ Dd@z&{c DKI=`w6r!>NP:w / G=̻IxէUN7vr0"y(7otF̝@9:b:D% [x6ƃ|MWHI䢌GM%{[?FҔ#Ifw%F {ԏVe|mx$šwqG'UD:2iLqAspæQ;84&|9 O5nOCf B@(1i5B6ec`yrDz8f73@S=dv:(Z2;D)橊wN#4T랳50tˇ^$PAݨ\DjDfCIв 5,(JMPY,jD*RKYjm g obugfSY02-參vHW cEBa?&XnZ'#)] %&ukؤTpe09 ݕ] QLjW,VԖ &RBT٣`K[`{(ЩM <ؓA`D#8s=y!ЩJfF304tZP *1fHqzeoJ˚h^w v}"V+fPTsS+HH/̜5-xg=̚+n!(pEDo)b1)P߇7*fצ>o]aθy0BUC 0%A~.4sz[0T>^kePu?wo0,?>T +AsD6AOX}Jن0…6AkBg1H$4_37@NI 6}HI1+lxܛk_u ?t\ӟLZQPc%)]Oc㽨 ]lՏ80̕nT9g􎳌_( /W^.P C![SXtмxcP aھ%KydLB*c Axu=[Y㔷x&K(,T&< >JJ]S))1R{mvD>%<7'ڤ~]Ő·G}]* ?Dg[l j96%߰?El l+bFI33 W܋:ׅG'_ J7cCR)\yϑ?}>̰^#̠Nj]c 9\A?W#vJ[ )9g&WxLÇ}9wz2&AZtcZ`c覵,QbPIQ9X֎&fb=ط3aTb_yb˽\$l9!P<-vy ?9|اW;t@glDXqđ&\6j^Qd,(DaMjT (Ib2ƲD$ۢ'~v#?ky+9Bxh_*cQ2*ޕ.e?)'fdyYUFFv*(4gbYb+\Dd~6,:&A˥`DKϾ*%f@ي7+,{_uI~̻{s}k'm_P~Gt~@[A/O 6IJy]"\#p׀9m᫚?+D2Zr%ڹݷy/.£_~/V7ʎ~=fC36KiBմ9OGlb qA1EY?iY"Zxɧ}R^Jl?u I0VZJ_^e*W2]!I`uíc9lզ jT/avZeF=ztI(:&2|%pċ,z(Uֱ/oUB-wJ ~2fn"ĸպ#M?љ%IsW]M,<^RDKQ'0M*%Q0fl&S Pa9_ Yw,%Q|87J7kpII͞|BfdS,& N]ؚv9*%7N);][>ބ#`ޡ?ܵAKOcHWY&-E6nZ"}Jٴ+bRj&\fl' Ja@D0ad~+ YD@9o/T뷞\[uGrLhI利 "m:|}#0F^*QI7s]֋ЄԉnK2^E!M땭rJ&ܫxYQV]\!YË߮ g1H&.Y c.X$ "bI bҌp <^("09,e,i%y0A#NC,&7;;i7ε\~8E 52`9}?$}s?|Q@E'}'%!kMBx~E}wUn/B-^T>Gr^=ǖY>@y^e1)ICKn_ Ufd $6nmQFfgRC!dBp|1Jn|s ur"5} lz?םI|I-_8Ц?%Kb s݆!~DӔl ;m"0M0+hU̟H#jM>׀+q;BӿJcyც.LueSa*oE %Q$G^4="gi à5w R3PIMLJI[QӒb 9XL?`;3|9lbB$^J\>[ /g \ئ'5TteX3ԕf˰6 ?L&ka)>|D!nn2`HdnΔB5HXQ|5w-`ĵkjuAk [ӵlJp .Nޛ$սw/TZӓ b$vݍ_ԌL Uptxr[=I,Jr"tlzMpړ1e[\ BӈN9gJ'-IqD14(2g1%an ϨT 31, Hl`dgW6 UkECz93l ~v!D0}i\TCT :Q/j>a^*mQgmNӑjn@a}JTҼ)%p2S#9j2">4> Q&_l_ϵ+%sfiX1ݵ-lUҔ&oZmɧA7=ww$#,AUג T7/"Ԁ\pa98d3\ r@&B_t4=c<>t1u!)&we炽`OY$cH۠`!OcT*nK2IE/F)" %-*ͭ6>9 ESyR,Ӝ)"3TaR!QU9G;ڃRCo<^8`*HъP'MP*~Uc;:NlĘX /*2x9p1?IhFt4@A1%1Л89 [MV?hxcl( ko-hU4ܶgrsR Kō#FZeX1O! yL4b}`]Mq1<RCf Vz ٔF PCwdx[~{_:AlApOyF~ TUDH[L#N +Um&6B6d B`LX2dž +!x2=NwFV1@ a[zW,b&&ϲMkա8Fpn>Pzuk[} dtﮑoRc?aaV"P l94f"{`}=i0:$ppcrt\1⦌c(`*Rg\ՀB~N!-#z$Q$|G3c0#hܞ "*뗶9e)mN:z8mlVØd#tޥdC|dy:@!c03L%z,-|sg?=?Y?1g59*naptVF=p]X ,NE=spļL HMSoHM 0%#(덭+(t#Fmb~Nb.{H2P_)g:7h۱{ .=هw_)TZ;J0:oag[e5z;ޏ4r+ɠ @?j䬁Q }E[>DZ`Eu O{u:G^W\*2%Z͐\ ='fJF}\-lX&a`i(ϋ@AaY^(&F_T{6ۀQ'*wa?PeȱޅC)$O(0HRoĕ fspX'5\S@f銃GVTMAu[YHIdX᱘}=-SNPa[q5DZ P1VRDA?-vkwntSCF'lio~ JIl<84<8mA㍪_z P*/ MHىVe6:̮L)tg_y.8]i)ި+7"_qHwL)%OJY GVQݯ&{zovNb1W |΄`5-zɏܛ='K]&[)~8l:aoè:X&p`.Lu)dU !­?P0 굙Dj\q͢$pMć\b)ȡE) |52F(ԑ Ϙ7鄴o!ZM{]<߂TJuHvi`^Ta?-`S<0'Z!$_nbBXP}<ɥPY~CV(c>],P}/?w?;{So߼'4uB= $a@:ԧ?3b.*Vj&QxyoWFD~F;i6$rYj_R)]OJU#̖O)DsGn,бF'Ryڐ)R`b8BM:aODPT~ Eϫ{SwOI'Na| _ʘKF~O͹\m)7 m K۠](Nn~VݦT@)tƱÄɺRߥf8 2IkL-QČ|n0e`4b,r<*AFtDj L +I`9Y"Ye ,0B CDh4h!4 Ņ&ڔm.J ZG$ HWitO*DHND1> :ݨmQ ~ r,By?rqXo,H ڐr2=i=`  ̩AyhܐT: lY J2Z%QHw HMHH'cȂ$WB"|r"ydK%EEde.; ^W Ci;\ J"*(рT}x8L3#ab%Qp;d(cyArHrX5Z]Ka& qQDۃict&k =CG-qAh%a/I]؅<1HF!؍6x|6*Ađ<Fpo穙z{JWs>`7_e4ອ^p0Z.#*8&{5${aUp@sW^{?%黒8&FfJبdjh*Ns,v?z+w|t-fJ'W wMݡ["LLþDY( 'b:Z4YpiV998]avClZ]SYR؋f˺3-QH\'Nj˸fp2dr )F(D.@2Lq\J qqq%9 4"~q䩄PbNMp\d ~͸p2*bm:)ԥƉG7Vsfhn,c)OBnLyП^p<]r  t`{B$-DESɂ*Xm0(h1G7* vsPٲt&F eUKt'/OrGl-ғ|jj_# 2āqWn$<{jKPǟqb8¥& (Vzxv: bnE5*I4΁KVWU_lLyO N)7IrnҾ dc/jMwzhK{BY-U#I<0q+ҷ3/ 响a%CYb;aE1i}?^ i6Z_520^d^nMRA.9IX—]?(?q: h: ՜ZL&Z &8c7T/YM5 NOI:{fطXF?OYN?FFIO86]$eѼ}(^?(Q<{r ) 6(j6y(Lv1E,!vT8G)QZjkO1q"%[ arC &(jx*|J&ָ]~!q v%R0*=hAm+|! [S4c썐~.|RPgEu=SXKgoϙl3/Z3*RCm|@h Q4ߑB<(F`$Âa1س%یt(,Л|^ѷHR Â1QqomC&gg҈øEzKa@^qym2;KΖo&HU|0!ڥ 3tEԖ27݀ҵ;Iba:>(p7@;b8K<ȷ |=iez{m[||?C,iG4fBncIHBA”Q`GU*"an\9&bnte}|`#13\֠3X #璼= ~SzZa,O%wj"`ǣx5 i$=g 5Ȋ@I ؇TaAI ~q,D>)(ıŠ^ꕅ!e̜"‹E)%7^d~6Ϊ> )2+< EÖ-Aƙ@}>0e&.rD%y ( 2xh)1 Հ#h.<Ҩ:Ǘg`dJZf 蜴f + pJ D`pؓ?B?ZPIpϩLF,Zv.:Zeq)đLJ?-m?NW%y`6iHF,I/sK`t+AUxF* 1*V(wD̷MC0E|[FL/X%2o͟/d}[~RE5QB,U\ƉOƹ`3i@DC=#T,ep xJѠ /FV * ơJFf܅wrJnVfK.b: 0BT !C-QZ.'ay`R9!HC "#((',1@hGx-Me$Ӷʦʘ*cLqRjȺX7|-B` (Fm8[4Y2|*hr854 LM!7?w.Y $P)8<o@!ㄠ ' S 81B l`t CHc ? b C"( 9@ ñ<= Pb<=hCŏ8PBġ4pš'V8!'iVOECq*C@3H %(@F>@>$CB@b|(3 lqC x Pteeworlds-0.6.2+dfsg/data/audio/foley_dbljump-01.wv0000644000175000017500000000352012140200333021073 0ustar felixfelixwvpkH M<%@!RIFF*WAVEfmt wdataBWWGVHCj e`j@gH"O9hr,=ș$*@n$=$R:CCAxaA/7^h0tŌ5`cǃpL6օ2CX'$Cm ^|If/bC6gf1}zhR WNRM.i54;L(]m#Oypo{]{1$ӘGū 8_$94JLC9!!!_^a-^G$p<;1|#"@`)~P>g͞>| p;Ka_] 6miV?:|hmk[Sz`xpM*u&,yZUv'rT^GJ\!_{M̵4̶|Y}]&Gg#/)~HS8-d#E`վOa~扃Wy~JهK$;V\d0P/ܴNA~]N~0xտ HDX*SDi NBFs>dps,`< J5d- /D[Kp r$L.JW1|6qvzPd'k{3yrsTeDyÝ#K(FUXDObgc8g0!D,#5&B4"8j>#Je1q8)=U[ICꆶ;`gz?#* JƟ%?ÃE~neӤJz4_@ 8 %& ~3HΞiQ1聉b|6X|ZՋ]uph >C =9;!/X>Sp| Nߡ^5'"HY#40=@s pjHN"PkCy)i_~GrtfZa}Y1sJoC)i\V#O3?ޙs{8#q.U qDSzJ2,Fr&h63q+ 67>vP_HoHϞ7~e_p'w-2*{뇥7& Lybi`2 S '\- <0杍)ܢ"%2aw4$]v[IXu#Z {>4 ==G\3MR1>m$ctb} 8af# B0[9"9Sʎ/mpa@Pr Xͻىcz7zP-dMH݋`0C|?ny\s? bLOnO΀ۧӗ9X .O' ) ǰqQG1|`ZƖeU i4x:={h`LF$'' .ц>APNA2&i(䊢ɣ65@LOQ@D "+=+9쳅dGf)|Kx0Y.} Anvl=&p'q!ߺqXsIu!'+4,bu]8Mteeworlds-0.6.2+dfsg/data/audio/foley_dbljump-02.wv0000644000175000017500000000476212140200333021105 0ustar felixfelixwvpk M<%$-!RIFF%WAVEfmt wdata%BWWGVHCs  e`{s𑢱o}R_v<I;_Tnz~D'.L`ĝ}L׾:x}V/w;O?s:GOs *@\'|oҿˤ+bf/Gj { TάڜwwA~#L aEo >"2Gw݇]zwTHk̈o=Xxi?Ldvƒ{ˆ6_2Ob4 7i{ o#N"g'#шyDJSM+L['$FP6'RXc|QC{W94`[vRd~?M1l`+njRAbN# M @f? 2B1UY~L}VG_Lm,P!}G'/QGkW]1G qN010O+)})f(`Zt`vBL/概9 |@WV|K߱pEc"H@N8BqH 9k;ڏOקb\&mhhQW3~xЃs|<.w&v?F'D҉MfߜRLB\찱 m zW|\AYfi ؈r+m,g+fQ"w?OȓAB,!B^aeYsɆXy'yO1BKufvq|wȺ=O>&۔SR]x1 g,Pc 3)D҈{ ,tEp\ H~2p|-ˏߏ}l,CeNeF /o']۠K#-"p-oq4a\3 Q~27$HD&$L&? =>QbʠYQuy4 (Hk131KnЎHS?5K^QUyH/ 嬳<>HT1A4{3ZԨv8۞>G2IO wX0kgWʉsSבOiSy̷uFb319Dȩ#aM`%Plp"\ϡ1eZe{;R Ьd,O8d0/%pd]y=%Sd&?3(z@%[s F/ISTLeQ>2rSg#=Z$Mڈ e(<gX~,bHe_Ģ-ʃ0|){Ũ##%4Vv1n uLd5cbB`=O)XbEN,`)Ufċy׳2t[pޠ t z'A t*,rb~KZ)a$F9׭~@J ^'MAbڵ}H̄y1;lס^xR!5 n|)3Oy~/Xʟ.qu &+f9aK?,{|A +`P!UT  c!r3g-0,=6DJGtyWw8ZR:OA+HǁwZ-L9̧`歫dHАS+&I et.Iz.DU79@} a ;d4d\哱[<%zsJe飆[lN=b8Q9EUk6fh:BS8bI@J-ŀ>Cp ]3OiKײ/b\Ao BLO@tc>bX0B +A@@N1 ?O7{Xy)7BОz%oOb,<{6ŋr2&fkhs<~" a~l$q<ؑTZ0fi_ti] DVAfmI"pHйcJh/t@vcxuSaH4z N-`pBP@P@teeworlds-0.6.2+dfsg/data/audio/foley_dbljump-03.wv0000644000175000017500000000363212140200333021101 0ustar felixfelixwvpk M<%r;!RIFF*WAVEfmt wdataBWWGVHCo . e`!?yo=eDz?ϣ~zHgQq2 z}߯7bs&Jltz ^G٦fS'qW ~^{Qɔ?~M`t?`m_;_dϾ?9x%}v{weOJkxL&z&@Ű>xlp<8)2ف'/vյI7xߺPJ?lovc1tp!3\OG7 X;?H_IEVQL' q)x^`n=JmT`UQ@#ڑΣq|Pw*ton2FtpUT& ZkN9 M?EB?z}Dm-[2WYefb9BF1$(#>um 2-#Ux߿\ k pK,jml0Z0v'`2zr O TqY2 8Xų($ΉJ7 9P?O[ 85,*~FW=Cl䖦x &U%CAw/q'8%Á*y!,G 8In`.ǭGk%ғ?OK ^ ˱cx`1>PuWb40Q8d_rT6VF nTwa귓Vj54e|AtrxepwOd걉J&)8z\S wf* '3@9bJՄ؀%~1!hvzN?NɃ\>]9 ]H[;*C@蛰%cR(?O|VGZa'w'mqn#drh4]B_j!I.2R{K_p+ND2~]Ù]w)SF&3p"xy WdB7`ӑj!0C!1(whEHiz5 MpWX7\9/YN`C4`8tP:RgBZ Ҧ? mDc`",|oY,N4(=Rcxtm%V-@06P.Љ4~ U۰C>aa 'ͼjnΤI,m@*,F>|WPOB9F: G:{0:-A`<ȅQ8p} ĂZSY/"O,v,6.$Ⱥu,π\Ł ]t@gz,rocuQ}Lψ؍~pjWb(OI3!H$z``= ! gg8NDQ2J1u:CH5Wg얿O>E{pPBb/WUj! f  _6QwWVlnicF+XlIJxpRZG†_'a&h`#ʘΚn;݋F<D ́5y)G=,\12d:¢ZP91)FR'>+ DԸBNe$npVТ%s,δğOW\ eOZ8]`@#ā%+}v̲Xõ`];#(5b6f!$`R,֏;eZݮ-P?g5teeworlds-0.6.2+dfsg/data/audio/foley_foot_left-01.wv0000644000175000017500000001432412140200333021423 0ustar felixfelixwvpkddWWWGHJVIeH NB"4 A6 Q[ѓ*Hϟtm> *^e/_ߝu޶/}JIqȿ{-+zzq`O8+ d@[pR{8f C7flոrnmg7-?/5n/ZoF3VHK xt[iH'?#Jh;n@Q[ZE@Y!nxؚr( ώ,cy1ޢw¿GCv^;s?x;ziEس|0j6'?EۧG{{s^Zǃ )GP: &s ^(QAa6qE=0:o8UynO4 %Ig!t-wepdښK<PNmd4q帲8NmۨV~{Ȝ=Bu>tzOУLŶxѝEW&diGmE@aGAXBa%?#-zx+&DC1d1H7 p@YC%PEOU%/%(J($*e^lC+#^zŏH F&Օ{Y jצsgfANTcxufNa3wAOݎqp ;I los2,b#A|Nr?Gy幒Y},ohjh*x'Bzy?G#))?!'ߐ-?wMֆw\{{Vj%bu@yƅUݝQ•si%f#b^8 g 1&ni8Q )sۏŋL֢@gem)ı{bհ?KNjum$H4NnJYw.s`G}ӆf[zyQa ݨG28zI݂lm}(CFA`v"6s\5mာ|@ h@X!Q<'h$N7K͙/;lp%9XV`r7\L1q;Q(7H8)"sQ˅a j*1Ѣm M ,&+YHPm>C D>ɴII p/bR8@Jf|'a'c/Œc&ޯ*!T$ 'c|1n$p8 rL) Dj푩OBY*݊q'6 ItO9&4|<`S<Ê߿E7[~ml} m ״-YޤbQ3p7ѓD C + KnYyv*xqgEKtIvR.)P$o(ikS=xN琕m99Hx%k4u3+s*a-7q'dE UFޣ]tScQ@<r 4Zܖ-ٟD6CV>5S佞M?i0YjdLy`bg̪{^wb S-2)l\@q8^tX3ӫ.=$\/t >Of=%p cz"[|h^S 8&0d& {cԑAZNtY,$ 5B_V)|Sa@qU$6vueVz ￞]t Na#N`u(RIݧlQ# { t4IjrU7V²FBQm4v:1=Ň5dd8l{;wEs5LޟwlԫBacҍOO7fp'FT"k7-G6UY¡#4XSeBRiW?&,Ϫ4p$+i`>-"8LגUYDLa[E{U8A*Ge ։TPDE(-;ĥ&G쐧XVՑW[]I"#\#YaYu}[@QlcI[} K_Tx1?Џei_cŸe0ۯ]_r.[Kj"<_E1ˆl$cqs(7}8gC2V>ϪB|VcYN~ePf-IҎ#K1clVBX0PJ޺ 7{6$R_  ab ]9oShT2:(Q>ɹ̯* ^&wAjhڸZl;XaH|=9 [ Y:2|h8ғ|fPBv2 9 LeloRI(n,)0\dܫ@G vmfVbgJ$?L'*[I@}7=Y.b4~rCRop~++ W(p}9eYnD˒+K.DF.?nx33У̑5%4ftL?nj"f)ɘ`|.IC[E8/H.,5cQQU 2ƑFi3WaԶ=4"eY_f aPŲP#p V@щ@3FlY3GD&WH06A4VU⩵016GJvf);廲kt}{\m4KSs9DӖ3uGF#$nzf:st NJ &]}OJlQw lI,̇M9"S#% j$,X GZɷNjzO55'ugiY#Rn~XaRQ%ua ? $;:%Q^Wwlx%oѠDb|p[ȰfU-d^oނ9?] hJ?'0s>lSCW`ڢ&݀9^Ʉ!8ӅSNr[o>AW4G dַV4eV3gBh5h}d&dm]*Gu?nI1+UBk<}|`7 p#GĖy`Bb~HH>\덿KT[ljat 67вʍ^QOQ}6>LVUߟp~ ?JynʓfT" ?:+2Y.Dg\.tPVEL0X)h녆/%?E~&Rëؚ嘝]߈v)Pe1}I$DЎK&b)yuq1;T92|;ƌ^chQVtDilyG7ݻAI)ZɮkTh U; Y[H\߸iCa0P'd%㼈*ÔZ/y!"\j=c|-gelZ!c'y*ΐ*t0: |EK} _Xw^yuyBk&xq8 n} ZdO.*XȲ"%F@F7 QL⢭j (;eKՀ%JīSx]w3k{pXi/ t WazBzN݁it <[EPSL\sITUw?,F' CP0(KiP+*ILL8{1x3B9U>8о^R.VV@͆BwO"S7g2+e#<aH{0v1\mGxm4i1CWSxٯdXJqL;j't9z?$s\o s,,o &^`>;x0mB}8$(uak0] yXz25eh_]wF2xaBW(v݌Ш7l^r=XG*t*J~;΀(0s.oL嘅|{BdCj%V:@-5c- yAr "]^C8Fȉ _大gd͸]d7~Nc{V 膿Ng/YbÂ2[B<$%W٘t!sJlH;ƓL:角{6nʌ.JR| h 0%ʯM|è8Aoh|faDEj'm1׎L#ǻ9"ε+"1 2+-̙5 Ye'vvaIRϡt#a/ h]8b֋܆) Ar]3"&SW$ '}-=UkdB1F0Ҝw O_C)p?fϲ~-* b5P45,4Kۅ0?) H Îs7v JNOیڤp基C {]Kλj~&x(OX+fH2>wY[.4)vb+^DJο}ob)fb#z.y< gp%ws.onR~a ҕC_h-_4d8B(̱&{"-r߭W/K{~~/kW&_8qѽMv z}٭'2R'Cf$o5N!< ?"΅Ϧ_ggd|rwt6Ʊ &=b< @w~:-~|Ny% տ# ?-+ا&s+w*$f?y}~&*K+Y}B\6,VN Pļh K *Zgo|WMaf)aM*76>}i Gt-- E>$:ܭւ_ʶJ{n2CYZsuBMB;D|~atUziu'Qn* =+PX7OGB3.r`fRm- 빎,AW%pލp+ 6DX)0{Y DP  #D[T! `տ\hϤT}O1_m˵Y h48K?WAPHXb鰄 눔9{t,4ck;U,#_ymҖ@Ic*ͧ@U1{m\e,JzXk5I" zo_IgW:9ǔya(e`ў;(Ф/l&\hIY#9DO5vyZ8,[`%"GIq7φ:%ci.&Ct\Q=7tq2L?"3 BEѷ~oحI*S@W /;k?Oӹ` 8b 79)S[^.5&pLBmÑ`w5Z;pRěR5`>nBA%όWnRl ԰zL @wc\bt#tgc(Ul` NI'bem9w0!Y˩FHiucK''z+ l1@ڬ0"^mX?>5#@W*L:A!d>Mnf%Irc8P*.;A .vo&6.!j.Jj5S}bθG|YƈD/6?Y,{~}u$~[z$x#9صPz㫻\_9V6:>>m[4i ·/ 5-xfT:X/ÆYd55Bŗ @oWfXpNGze!Ž׍\U#о x83lUj-a:&an@+wZ,_S#|Ii s $JЫ6o:3ۖ&*D;jtL+rt0# 3\Xʴx-멊BUgj VВxǔaI2_f q7ZoK5EݷPW:U.\g9z~ya:YXuD7іU_:9щ0)˧sgCYmdp-@hz vKA*hgS=58¹H %Nl9YI?eKbFPiXL NbB,rƴnӪPomu`<)ZV' 7 ]?X$[հ/H~+%yoFE|(ԕK%t1d[vOip̷t0`^^U2Y)x9jO0 =EZRB)jL;` =*_v*eMZyMdb HZ%TKAO(+pGoyЉPLA8[4͕ bW踱Y WfAk,wO&:?=9BFBsH$@xe.15^ͦPțYAhH;_01aWk=qҽjXov5  XGrBD޲i$'_˕<$xJkIhsx?Ei Tq^~gJ 0`9*e7rE8w~[=yѡt s#`YE,nF% yĦ͈SA4RN`eγ1'j ˴nI-g*>v@lSiȢcI41t0f*3Y+:o;q8.A簲vYrܱJ3~yV `T$i;6!͑Z\ )8^Q+*>HTήpN]XDl fUry_GX˛s抌*$$*A8s=] |n| :KQhG5n94r""j%!2s*KN騰0+Tg'XIIb$rSm0#ےK=9wbKnA&$!w`S;l:Xa4iJ`[cgɨF`:W:1wM1L=dau{֟ F$!["G WEGYU8S#AsU=uw҆{dXaSMj_ )\}.'W"K)G*el,t\ 1K1K_Cȝ=vX׳IjDW>>Oa>)e :$Hd.2lG[] Hfr+]_8aCjH$)4s 0l̘f(#e<ŦXb j!G9%r\@ٝ2Dk1ǒ% qG@0$R$<fT$BjVijq25J,xPn^06q  88X&SFxӑFd1 ƨLk"]eJ惞chb5%1s7nUka!4@K=TXw) M 147B'o3C@$ʜ%!Skk  HK警zX5+Y]z%ʲaOAE\C~Zh8:uW]Of e~4;Ћj5Pc  !dA0UvU}RTZ}4;M$t`m:Yݙ\Ʌidˑ'[{N_&2a!>խNP ܏k`oQdA|(zY& O$9{aT](F<)%5{;y" BڇO2̓?YnMMj7섳;q1שy\f? >'Iˠ 穪 U7WJ"eqW35&|,̮&&M$b3N R#lE,X/A:!uY#$ m!numVPrB#Y|+/^V]FHcAط qgJv42a`˕bGf~F=ʌ2FeH{%Q;b9{*.EaZ dvh +t(t CAj^S7>$be;R?٘`0;PPu!*j w 3kƄiu{T|9lt p-XiąJ7nvW~o㍺R&"F_ªF@\PJӑ!ڽ\ï6yLCiF-MY;VwC} ꎉH[ T!ܪ!rv.LQޑ줋Xknb:ߡ' n37Уܿ4A# mL$qT\*-Ɯ :m'!{%DPbQjr[XKtw]>{7 _RkإdP/gy j`%H7#^/\n Dk0[cKKρG 9 j̶ ;+[e8/9ҍppnz DP!4RH}-72xmuŐaȃU"s00 bL^> /8;m}`ۥZGTB-oάXavb{Q~dL=DF h`dAP$w8Wor6X *LJ*_=gE Tqle JC3v+><\I1:Ik 8rɨ p2nOX\waFKhWwJJ!VT7W/&ũFHEU"5wI#Kcs:.:F%f=P$qoKO1T A7.Lvfbsy#7]r52H؛cK`6> 1IdjfhV̂pSD`U_а{uF/*{CPP裮7GUxFh;.0FK˨_Cϗ50YBy$eB ͶR(H0M<w~3WHN=`ڣ w h!I?jT!!'5&[a` ziʜC/ƴwt0vEaFh]3Η>]r}Jtf̍|O6irhSYC:7CĵTOhX ! isV @@R gYbq*ma]:0mN& zDts&7a 2'-hAj$~͊Bd 0kHyDvAsN2ƿXL !>Q~aaj^2J$L @AL,NL^rE7C/Xddn,)!/E 5çS˃ GD Na @0q6Br16Ў$>"${"a1mi#I!ґ#(B5v8 <\c\qLI|֤H̠8Z9`eDnI\ʧɶ M 9ŚdJ: c3Ovn;:@;$q99T,N?"ČHdWh?D#` rpE %%읔9per8=E?IL?%!S0P*`teeworlds-0.6.2+dfsg/data/audio/foley_foot_left-03.wv0000644000175000017500000001573012140200333021427 0ustar felixfelixwvpk//VWWWGHJVIe }s_QJ)8sܹp]Ɯ;sNܹ{`:6< pHpHzY*W5~?^N++K,EPV4)Ciܱ1nBÛ7 <5ܝ秥 *&a"E[Z'\1{$p:k{Cn:77/eh#_~gSr~5@6TD/*ut>¸7V\R0}80pQA%PP@JX/ C72v~\|c14?^r1q)t3o2Πs*'Wa݉id8DZj?ChכM.*tc1<12߭F1'~kpdB"VsDvẶ⚬ }=D|1k,hs?ąd"=O?{t~ʀAd3"Uc,RRF{*1m0mhh#D.1i9{ӝd.;!-l |-5fHΨ:+}cp<$8SCxh5s>l nL+"dRÚOcdy[W겳P4D "ż:F"c.,ESx,X Jf.86odØ&Fkjh%vwY@}P QJ=}T (|^䳁[LA($y^(z~ $sE{-扎l)m&vf73nٗPF^JLخ(\C؁CQ*f2OEmHjS"HctaӔL{[{#`}~2|4MM%G3ݱ]v8C='W>z>L?JƤ Ȱi&xͨ?yAh(ikxGUT=S8gtSU)^ v\ȃf42jʎFcC PNA9]})ΑGClvht̻mm'RP FzA뎑zn)!qL]Gqwnp ё3/_S32s) ϬQz39aYVuƫyu#5;[lX=8@xlVvS^I|LU,cfUYLi'/dAb1-MQ|{L+<$FC4HYЯFLs;D M(鉌ؑW{;H8/>"=x%]\Vq<>m@MiaJLh]ĖK {a2,Q TuxuCt߇hpτZ%p-D9 l&Y)F%x߀QH2 NWGPCh1<@V,Q,dah$ vjb?uFiJ+a=3{[ҵ.w&wa-ffiɕ9"Lab xi'ޓD}{'h}atǫg9@] ٫-qZQ&mi eÈ]B@QIvi}6}\t 7y3u"kkdU.~3ykŭ%||w-7Wk@>$|}jaw}mLԲ=KVBp&򏶤0tfO[lRNŀ9.ނ&"_-Ͷtҟ`?lO9m Bgzyp`I\}5\#hzhݥ\6H,x/`/TwUT7tolޘ!F 6tS H+ڍ?? [hˤa#^2dFT R h[b`R6.(wc<#(+,genBSvx"s"X͖e#@Ȕ ҍVi/} PSDF O"3J6YJLJ#kqq S9;+ -p|JDXfD0؊A~3s ,op?!.|2A/w6檰lɀXIGqVFr_S̵no񗭠NM6lQe,qr{yT7+UD# E9efRjxzL.`y*!eT G/W, e 7 ggP;D-8cgJ"wvQ"b-js޻ ƞH⿛s<٠kw.T cq$$=@XUi+A5ja _8c Sq'Ӌ 1g$?^/:kQ'A C}4QM|^itK~no1Ba q2ۋN;'ΥĔFXSr4\Ie+=t5fV&PJF|l$9 %0Ldg+*mJ7Ι?'&#!hqA3{''PpEWؘ"4 J@;_Hт{ߘB P\yM֭S:'=ǝ'6ߙ6mPxgNT΄Аm 2q) mA5g~_ CXAFFkҘW<eӧ#*]\ܫ ?QMSˠjzYn?OSe6įƣV,Yo zRW ?i WdS}v ׽%c¿r%U){&^|q9A"K pL\Ewd 9xH.tsڝ)'[A#5~j-[̃{ *l?G0^\20)L3,G(o$gwupШ*(,Ӧ6V ? '|7  [r ?ػzU,}-[*4B\. шuI$R2Ifmpإ*8bFhRΫFI2 nq6fFë`aSNwg=f9&Ld_$\ȷ\z54(G]}2rV4Mg.Ǜ\m$eEׯE )&@I"-ŸPUz9ޭ*6|/UQ&u`ڧ}O|22p3%vYi_V/6Hy/ 6[9E@?ZŊ! w5_Z+IiLH$8woܕ :YT;,]aPNe-2R/ŐYO@6o.hdXq \x\! cʤ*\M =b醶#j:̓MKvwђK=S;aKY>S6١ a;}B Hd ~dbٚeKo4+=^/ĶɈQB< FGbM$N}lR̝u0iC9xRgU\!Չ]b,i养0r7K ՜TLTkL&h`P>c2Z (=4 P|c<IB5k诎f٦!4ذIO9}B<_9Db~ e&'/  Al9'XؼM_Q:}KG%rKI+߫qۮ?G $VZ !"*wfvN:߿Af)D4l]*Kσe$ER,_>]q'M"}A C9|fp|TWeY#sXEt͋(.&dRB)b6Fn`+YUʩoxYzϩ^>%ǚiD-<(d0֌;,TdM5N9g=TEٍϠwܷ|_h* =1%LR6GL MQbvވI~VegI8M(0|8TI0FC`PCH.+anr.`!u^PݐFbApcD s:hH"AdcdS5"\dVsB0# @ϕb 8E*CPFD͐EX  0` | R,¨S,0%$At9qȡF"c H30@Ɓ‡? ! N#  =E  E A4d0,#< D00@ g?lڵnG G@wd~O?{w?=8?av?/>ͲC:'^_w/ cT/Cm]oҗ\wwɽ:^N ulKU*V_7h=R6b&2QcPWJϩƕ/i8S Dې\kJ+4/rdI8[EWɪB-ѕ ^ ج[kS+km4ZdtTIPbFCtZOr"xo3O!q3{1khhR ܖF.ZamAƛ i!ӕBI6 -9G3@lv1 1 \& @Bf+vB a9Z)H|:v2^Pqlq:3Gx<͋t:q\ >P7)d _ϑ '$(IzvU 6`TZU|P0-ʳּ[d%Lk{\'wxKr_K&~23zKoIgt&ε(q}*_Y@ᅭ0lБk]',GLn-AiKwHsw!ոOQ $tmVm>j<3Cn,pfQ$<ư)n H8óHt7ol%wXvj ĵhbλ\5T7s W; +zk_f=/Uӏ@"?+.ߖŒb |-T:'@ʼTЈe ))%.RnL{4Uz<ܩ`ɰmiӊCzv+Z]kpe%R_NP!z/y,@j,<fLR[bUPt{,uM,"9[P`'״`H*a웦]_[O6'nY[:.G8S[\չ,ԆfFdV}lRC"by"Aed/Cs5 ׯ=?-SC,G3B5N-x  =y# Ƅ-('D{OYR_DZ2UϧquԪ!K3#jeDBZq9m?3g1T ^: o]g7H^ܺQ Рjδܓzat=eȝ7Nqwc`gI@qbY l$,AD'VIU,>&CîE9;ΈM@ȯce"Mf@?}\ vu˭{vHt}/ , qNX&i|q|jl|TP;Z­*M^a3!I KҲ 0A$̢pWKR6=süˌ#P1nvie 4U/ja ,b,$1a#3"87!Nx,<<_.\ϖF>m'85_Ԁnd{O`dqE~D+:r'7ƨPWB:`i=IشJ&̈WG XSU$5D.kA7#nSAP N(DYJRТF (&T"E#Om{Zoߥ{Z.)[a?)=asVFwya,UaSt`͌r/I[zkÉL`sl;( 'J o+ o\t 6zkC0=NON,CETVsMkdI=#8J ͇/S o0}udN}TQY.";h1*܉iP:gAYfu~O${Xh",%GD_~zKO{%)2&ѷ@%(lDElҐb4])n 8+Hfd= V7xPfOocܖӯyTBi]O|a-P~#1dB(eJ> il6ywq)?ίfhBqRmZ̄xCoD`6 .;L T.F 7ʇM$SMUaW ݺNKlǾ17PU]Gٴv Qo96moMn) wjU-r5>D ~\ a*؏*33anwJD$t 7ˤ!nv!l $F[ 9~HPXiF8:wUϋ1B+&Ғ^.g=qI29Kxkĥ1zDkՄ,Mz@0압70a#ÎpK#_Ce¼DAdOW3đkyv yAgjwWU()bhˉ2J!0ֱ#0w$4+pq2K[z /Wpn釥!R6 %= ~'L{ DV/m ?vN&n)`~͝Vy×AȴЖlPWTmzaD6+փ1@_Ͽslv u6;UbEArxVx۸G WI}j}I#4}?n+"Q=.M!h G&9'9W"<47E_ʤYkF~gE&*:gug$V7",!}< 㗎<;D5gxwh3Mn-ETF{yņ9:uK.;U|$k +7OwMz!'cAAi\iyMC]{Qѽ./ᔈO8}G aDhRsao2*ײ qu1$#!la˙M0ć|9ӎ"'P<@2"VI9<3ѕW h$ǖPv!PܛƒTER6(q5?`owвX(Qa26hteeworlds-0.6.2+dfsg/data/audio/foley_foot_right-01.wv0000644000175000017500000001376412140200333021615 0ustar felixfelixwvpkY#JWWWGHJVIe  O(߯ߊM[_{/-k|_ޱCp?I֕?S)u>8}O?bNI~oi9h +HC"%-]Q] pMh{r* 7Bڨ1K|;Q}*=:6:%y/܋y'x#ִt#P]1J&(ԒLu; (E2A K `aA<@6&T:,qm5ѰT0 [o=$y=Cjr;;?> =WM}k4&(fqXb`פSMf{ I9WFv_;ODƉ@9ք3Ĩr_nWICq߱O?ϴ"ۢ߅ewk4|IO-%_ T}Owkߧd3Q vyy[ũ k.;#ˇp.)?HT\UL0Zb:ZD꩷'[q y@X1mJg"mѕ3]J=P@G(w ytrhЗh$)T8nfCr-\I >zS1k6chH}f:veb/Q?|I6Зnd{XUpR`2RYWJaM@{rt;9PK'R HF g2qόE O@vA7MQ!2ҝϬ\4 R0gvs8a?iDy[<5&f8ߠĞ؊Q: RS|*_"O^w^RMѳ 90^]ŨrXFnm~2x䀳i~\cCl-F~&wygIo%yGA5bCGo4I {B/L}{0m},߈=[#Ķ 'm+0~d.||,=}nn9˕{DaKA^/zXz,b;H$N?%*R_%-T;\ &X@j n,Y!ZJ ^ޮr\=kNb`M-q7_AR~+gs)%+UbI,j+>++AgNMfLzaʮT;nh g},LiJ!Gu@Wd zMn/5ŏ->]ݹ)6u+J)VMU x]tXiSB1$I^"lQw3 XR1LPxh$s!iQܑkL$?uL0zCMxZR Uہ }g`}&۫횥L)UStPK0sP!,l%ygq^LgX1&b2O,b\a/ƝlnXPkB6PgAhsK-űU*JnǷ-ר0J TiPF̑<+NNK2MW !H>\ICĩGu4_Ċߨ=_m(^n+n6у8ڰn<]0lfvLu0i#*z6K^qu)Fp C3j05H;aЪrrʯ6;/SCZlv>6i5"a: acg.>Tywc WYb|Ԭ*A{3rCO^)d[_ nY-̷xLgo6`T(&C&TqvyB~ғOk,~׀ CԢ.렡u%2)I<ܠ@ݟP,.Rt6.^d ?-65XI`MM`n bPf44t6#f]0]U?%zcVA=$0VN.yFz|6THEAD)*V7lڼy$B]Nπ6^Ɖz:;[W>TtHl4ih+} ihSws GSN~ e)@UV̇J ^V ,qȩ× iQcvTi=ׄHĬ!}^i}x8'bK":2f*$zu;f,e)jvם|fP8.^4$qBMB3BB!J{ >K?'G7uAu}i4,-a ʞLQykĹ^ܞF%d]CC2n\Hcoxdbsf7M!#Se1<9hR}f^>Gk(b'ʩhUG)I*tu Q6TWUrtwm֘αf+`&8Ix0"OK?HHU A/o*9²S2EXrmR=2 yZPPp,5DkjV2/AjQH%f2o5ş&c%q)JesfS9A#0w 㬼:tE  I! =/Qw rQ`Rس 9@7H]]OcXlC~lCdd ԯCG=JX؃23 B߀g&CxyIb \)El'">.qzJ;J{bAyUd %X k*S,B_DoZOAs+XP{.nYa;@)ҋ}_cJYt!H? ?&kVxaW) *F噚PT9 TR1>D/ }-Z-,x wǙۀrz&D '^AY3˖ b->DaAN j4bvq6 !'5ڐ|N `C ` n+ƭ-zbH+~_!Nq6( {>"ZOњc$IAbR'C8S 2谁R+5d{(KFv_?7-ALd)|ZʓL&o C[ܼgP]DE#΃&y-d(X})fUP@3<:Ӵwq,M|;4bk՝YÇo`[_(exl8Ԁ 4_ /6k!G4czTRtCRh\{p&3q#j‰LB/ p'CV-I\tq`[.7td1p$rLS16m,&M-ow ;FPAx ^e]\d C8R>:!kj$KiO?kDWswۅ`9TZ&'.$:9|QFJJzK9NT 3pDfx@u *ìC$) T>G)NCG~:S p1P@Jy Z9r"! z-gQ5I䇋0DH2ĎHE@AÁb!:!L~?|bF$yF LHH'0>Fh0x@ $ 48 <$p"1 1h (_v4=Q(teeworlds-0.6.2+dfsg/data/audio/foley_foot_right-02.wv0000644000175000017500000001554412140200333021614 0ustar felixfelixwvpk\&&JWWWGHJVIe />>H)heLb0cCծm08:S #w`ďQZkћ+s0L~Y.lJlԐ}v_1,x_ !\/Ử_$YƳ梂a]+ؽ>$zxud7ѺH?K6ҧ-Oj!dhO⠶?|%yjUK5dŧ WGfqR_~//_+%x?_GTo0!o* Ooب|Y]O6>+\GW-B` oPG,Ay. @唀 ??pp0ii8Q/%+smROsgL5^+VX5p'7Jh{ĀdH[(HYcF0J$5xKQ(S;^<ݢ2_.gGLhGivP {i$Nbn ? 㨦>zj/GGBӓt|»V,>k^V;=kmRboOrUQ3?;YK34@iIBi3BwXl`|-fDu՝~ ]W |Nrz VX :d/c-!n۱,UJT(b,`B7b[}?sv}4'{,cCK_o SqټkO%OȩxFD .>&cJJ%qfMnw@R{Rf(̳D(r_w%N:[>nZԙ~pJ7 Hm̵cݬe0%ҫII݋K%A\k˱=`Gջӳ̒{`K =_9.ȼw0 Q>{#6AzD9񏬨d0{z}dZ\<:1Q.sʣ{ROIQVX5l/{w޵}Bsp<ʪFOI^ddb 6V@-ʄݢm!PAp@bpB4ٓX|! Y7B[' OHͶS"~wk<;`:Ǝ,rY}cÿ>9ɚA +pi @Gr2g~]WJP&hNw_is[O> @^OgUvbiu)9J!=;Q?*c齀Iو>C\eslQM!QÍzl\E\{pnP7Fe*^Wҋe-5.PQ U6Xgӛ!UN N*psi(@c^/&*d'֊ _XKΐxpC@Ii4_1Dhr" Rhl&"m&]Qg Sx6\[jd(`CtP9-%S @)ϘDҋG$M+jtڨOg9]+d58t<h몳+Z&>୴ uuH 081@vlm=Y=ѡ=3z01=c?ijeh(MF!P<#Iu}ZPCq{O)w=9oMK1…c_%_iGE`yk#:j8 Og%G(e8iQĜ{b> 7٧]g3-z/_x&}#Y@&#o#s>dd5oQPDOKDXLء#CpLT//i|!%O>fIٴpS|)13ok/Lב=4{>w5{q1BVg.B3ԦdGePr-HjEU[d(T7),׷3H|-Ռ `@&OVovA0 GHUpq>GApG,lA" "oi[x+_c|c&S!y$eے2b6^z)3"7OE6h J/WT900OgClH%:V nZv"VbA/x=8 OqGZVda 1gsvlm(NOꂕה̜Uٳ^@7,}ypl:ai>bq˼n .CCd`~XUcp3\CzOP_&-nJ좉$̢s}:SyE52{<ï.b1%=q;B=ŕ4\`,tE[%0X1PeԍlA`LGr WcAt[{n!AHmtʭgw4G=.66񏓆1}FL3 unbDg\8WjbҴƳڶ ;آA׆ t-YKПݝPҨ1rzbn8[dŻ61ccƐ歑!2'ttPx݄4vG#vCk٪XøO~Wh̒#'鬆0~)A8,# k܎ӑ;GX'il3n[*Vu|v!PF)'[b/|V޻T/\f+8;E4-UG#eW'[`n-(b툶,U? [Q3%3ެz%4WWCv3/ &k+*-~)/{'tĒL 7w-e,A@ߜs%< Q{aKgKM A'[/PK7 Z3♏xILD5c8Z%GÕGf /^L ABiM_zC gmCC^vkgJI CUeݭ%%C 6c(,ٳj$hOYB A&K]'Һ*#UBdT5@JbLQnjH OS'IT_i1SJ z#B H@^yl$v!,Vs7־C^zI!:mG×X"/Ww-gqZ"MJιLŧDT,"?޽s`;1nuuk +5Ēvn2xmCߺ߰wb/(ߵ/EN2Е`6ȋfG:/ p%lqO6ĸ7+'3B7+ @1EC bb=9C]t2;RPM`/ɋ('o4ni{iͶ|Ī TGJ68qj-+[ǥ=V鎻׮aJג#CIFLCQhRHfc7¬i#,>:]/kva&QCl퇷9jjX[AIhC<ӌ]6[!g0 ['M+ӵg(2afnFgc UySz}fg ,Nh )Y1Ԯ{uM-| R^[!<4O%FC e =Ÿ|Ѝ4s2I?#8SK֫(4jQPQb"[7~8k'cWDSqJ=?FiuܴhխE` z@GlFA5L[*2$ٮIsWtgQ9'J+[0SO%[O7IV+!nKwai[ѳ62r'T:h*]$7s$b-2?P5IlI}"xf=<=\įӨQu"!0,j<_rYgVW9P%irQQ,i'ӶKCD| X-⳦g0V2Sܡ'U0;=J{y C,!' QbFvԫ@v?(b&F&A p"VHڅ@+!) 3:"(cfZ>|k1n2N(A.j(Bђ B` 1h)UTx,ƽ,f:kY}esyevHqJ>Mb8|/)o,IŢ:.@6ҫ`v!xHo}%qxE{ͥ - 1V^#C jjh"fpC+zE4v,zb,Q0|}5שuLnN| (lձPe@OR秂 HPMaE7Dԧy,:J,PY si`9O",0@C ZQʠ1v $PFD)Dx"?)T`2rT"|lOAC@EX Iጊ{$X%rE4J S@GbjD;8(A"h($@q)<8N#$j5'zlȘoiM 1Fٟ5D{Nb-ږ  4bHӌ[]Tn~4lEgb`Mt Q7r:iwKxQP4Qk8}l=q>A!Zc2l&f\,錴 ݉ ܈y6ؽ$`4CxbP/`wz0xT~uaE&*׹v"'|'+ AvS$#"5p.=j*3RaQb|#I2Mi;kPkRSWX4aPV=O7r+ 38[Պ0ݬ!:R}ESpX񥣀R'Mc 6V⚘g_ lbyց A(' Ia9 ^? |# +.J < 泮~M#yzT40h# i{6'UoGL=݊_X$W0b'pG=uo~OrVFlrGzTt loq?yveq>lcr}[ +]1IK|L^'SmcSAVj%vrC@M/:Ձ$k F/4LfmXxhtSا(?G8B(yc{& q8=yi|i„_PF/S v-Z SL%=14;9tM4_٢#n]̳lY(=rmnLְUzV:sYui0wB<EvDEO{aEPW•VY108\ Ȍam9“NZXaLVtr* CD?8BL+|81"M!L +aZ*0CԹ>dc(.Y@R++NRÉQC4_miDwLFW,]WPk4qbZq>$V (`E@ȎA$s$68ٞ;&:Q&|}F㜺)IpHdz5EuFz@[Kg_{/ξ 4@Z.Ϥ.y;sQגw"{cM;P{u:99!Tgއ{Gp#v׳Om<؊$K4h6TwZ>!dBBb=n$TIYzAב3C7r`EhEͷD/3Ry)Bc}?,='6$BmT?){Lc qp S,,GQ@}b'kUB 2•_FF&M|,#J>@ /d=`o0*`,N 3䀎lϹ%wWK^9uܡ=D;,&1.Z7?0(o3g-2&sҢ4&|0yzz{yWڒ 4]&DFv9dI(g*& lg恥DH|v6ft_UXrD]bk)By @ql^ӋD:|Z7&,GFJtӺ3f1&1 PgZZ9A }̾7K($pMR1[dlU<یYhvkNUZ,cQƄe 8.pz^Bi?1q#GRVoJLЂxB׸x9^Q̎y֩;ޠh$+GJGP\My`)Q%<}VSV&)"`Ia* wz\t- "8=G4{|ޒ6K=vZQ)+K ?v#[dڊ{>,E՚Z x '2|*h1A!u>=;ƾ 8GAS"P;_bSD ´Ot860fy&dS'ҫOAQ * qa_L$y5cJAP Vho؝.K5]'mG:}s.`H(>dII/tů`>%D²;D=VRJ~e"yoW5H\A)bq|3oW\/P/ 7|`o>Q%nr" )loY R$˰.`~Ā'˷X [ɾ*a:UF\Pv;,} <X"n֦vٖ؅Qx)m_ekjlGm4</oHJz[A$V [_C͝ʝz! 9bBU.x+ucX8tG#Ypnyb $r&L&{yx%ygjoU{_D+t;00,.MJY@PEB5KbF"=MCG!Ht]hA`Ё?+:jO-OvUFg`MO.{eEyTLq>@ B5AJj>aHFaC'YlN+,.1ә\NpJA]G# :*C#;CK4JKgMg[\B+tER.t)TS}Vx"L '~ (4b4UU,jKgWA/ &-jCH;{"'ϻrEHٟRV.I=/vWȝH6o ~~=߬WD䔌!h1 p9) s7wvT5_V9ۜÿpqw!R*%33R+iGB>K> #Y|QV`<`?fo_Uos('So˸Rwq%{)Zls%Pb{QUj12Ik˕7![GO~olrēEg0,JL4@e]`TjV~K96`<3iV>yۣe'Ȩb1ДȆLLjD4E6! |`\ZRقZ<(ԚϾMTU&(-C%ĈF1b4O.w1؞6/y ɒ}@~`I\̱5(A.OgU)CQl&:#_҇4}?#[ V{5֑YF{O~~FKad ]CЂz5j0ܐ'm2̈́|/%#phk"t-Td@^v?sjq'34(;?J׍Jё/Vh<1 fЖW=x?J&,"^L!,h;뵀Pp<*qu1=^ vF|q~O݂5i[=|&+3JRaH- &b3!zt](O [P^(ハ!ŚtN糊EN$yb^^ejbɪkEb@f7矾x=2*drECA8\{|)V% 6Ĕ)m5Gx`n9}Ps,YR1Ep<|]:R)u:{5bKt~OiW?z3YMePٛ%T%|5,OxˢzzH /-DU:CBJ-hqDSrRGGHTftޭC.ca?yV[ǠLjY@)ma Xtk2Llɲ7^rMGZ0mue?N>td يhA[ǹe%A˜lJ@~"ئxHbU|0BHeDo,ŏ́vڰBz4$0 rձ4:GoFٝ-XnZV4R#C.b3ǓPUXtp[ؗ_gZa!8q0]Z[3Tr/^ l[ӣˬ'_$K6zAeo m l qd{TQ=4=d'Z)Sp* O IhN*y/*4hH5@0*[Y:m?L* b}HKM*ot|dEh1,~ϲ4H3JOGWiFw<-̅`"&b%b@5;P0QfDD'-XX`@4>!`m AС 8 G4%U $(`8(LErˀA PBJL8< 4Jc0B`  l 3@V D2`89(p cfpQQ40v3 0h`9< PDCLteeworlds-0.6.2+dfsg/data/audio/foley_foot_right-04.wv0000644000175000017500000001500012140200333021601 0ustar felixfelixwvpk}WWWGHJVIe ~w_em~|=A\MY=}y; F?Rڏʹc| W9K\<>XubʫbcZ(YE%(Uq^ig~c Cef>f]ye4F#T祎_b_;Lb2_q_ƙLkf&p 6 DUUOan%8p["`jJg+:4zfz;ÃOQ4Ǯ?#d0{C VʠC(6U3ؗ5ݔ |L,?ϳQBW0 ]~+_k~ϵl)#FUmkv 7Ui&ъ#[AQ:%ZNjb(ZnDTk '2^nRz:l`W(Y.VH2*r |[6o az/!7Cp++LVe>:1I#ǥ2aNDw"Dǃ)녩 c"dq1jMHRbAN*:Պ%)H(\;*v"s?FEɥXfV6? ۈ6 ?vWֿ)uur%3VFrDϣ%v-i!0g?)anOzh2 )s&k18l4U.YmTzA a4m-v)Lw !7J%:Gr ~B6ĭy';QhmN1ֲ!ڬ)GvZN[w8@f1;|$/e!eܵl2t+-wHa=XlQi *^& d>{ |HZsJRѻ0#VtmQY ),9@z]Kp7D6ɞ寝m JGLHGCp@[ J^ߏ.kK(t%ȂxUdTﵠzSrWȐ*RBV@5Ўlf+4Niܑ mxr0`"hӶOIm$Tw6ܙrtjEc`~";Ud8?TZl>m $<^9v_'C:+t4f2gn[+$щ^> qfu^'AoMHYŞM03Rwg˷R3!? >-r2 _4d0W\#|rc`Xj~XtND!; H?^9sZ|1f2a'13\ڼKDx]?e `%:6 b#  IuA/ -KD?k)2$l0>-;EtY+Y$ `Sp֬Ԣ '@xdq4y7) Cçۘ҃LA19'8qӮ.Xw ;C)86 !i cY\$Q]y# ̐hnE2 )AOZx3)ĸkoõSuQ] 3ԛ /na׳H8<@ҏY Tf 5P}wZ8@9!DXćGf0*:J]Rl?(]|%eqhtw"Yb@dCZ~`LܥNՎLŅ|;Μfs0;gY$'=҈{TeU ׷j.i'+;0oTʣ7 hZ/z'/^ъ_ 啴&Nx]]])5~([/kvz@?b`bܦ~07Wi<?ZP0Di'K%kdu%mIIbhd%xb6 Av$XN ă`S Dv0欦No-5CC֚{-fbHfbA1NBX1ԁV$0La,htr4b/UfD|KpsKn$?َKi76s­IYF{`+N߅9aU});ayXJ>FOZg[C<BaU5/=3A@2 ~13YZ\5aum%JR%B֙p™8Z$(Y PNG>i0'QtNOK+|e43h˼׭/reC<\-ن2JqIs2M[-XہYdTN[` ِX uWwcNsњP%=gv齦h`dM_b J2^W?ju<]7!'1b }ך(oe1#*4t$ݯTT$č8xA1W|$f1}:ōVб˵K蒅0!k2%ue|f'; ]^xp,%Eg黭\г] |Env'y@5=TX@a l(Q橂aUEw[޴O{J ^zMPZlxr6݆gYiЂFgd+%ʌp初W+c cE-.f6P*5Ӽ8IY4(ᆖ^2F`#(/BhaƜk\~( (8TO]$"?_و0aQN{BJ\I1:ҋu}ڸ 8١\[Y zH+q)@\A|ꮼ们Hph@ar-j1fFă#JzT2rГ'س™ˤ8H*A; l,XJIrng֟3Gp"e۹L6 y|YW0)љ^+.MYV@|}߶WmhZ2$wTD09.*j. fdV7\ѡq1/)\iNp-Jx ˔۸7Wnn !Ce t= ׼_lեUM iN}"h;7aNJi 7H喩H9HggOQc v&]E&.`&xU?@DVC1^쐒XҘAU6ŀ LӇUQ(Β JȘ L߹:.f7/ЁcʹCQTӠ/j'"c-?&.i-~*F0 (Y^؈aSf[r}Ք\a_泔(ܜc]NQ rp:J MQMo$@u fMhi "Q \`MQqg:3`SO6Q-Kf5A`\ٿ4:ևmW-Gu2 s@J$R<^W cK6Ko<*?&_]OxlcϜń 8ȿ;{NJx%5#9sAAmh`O (u6˨_(H+l$3/ 2X䛇_a@]j.ѱ@F((U| /# YYV0\9! AG0P.t}/qV4,xcfO7o6hg_6AlrfmCLPpɩWZ'¢!١_*0ނlo{xJaS*TSfGHjyn1Zȣc4aqw~6s<<5_zC=/dS?^+jZFN̨쒛,,|N, 5vTȾ8el\fGLէdٞ^LIVl}cJvR(ȝPG.2΢nT&;w;Ga.(^7;;gz<۠0 ¤"ܰD/6>v0p>>x޵K¼[1JwSs 1vi P»zb(m7jvm;JaVsJKHȘ]b5>erS:O4M!sp}f]p?5@"x6 \Yq[п*7 fN;"4fyNKl #Np wAe#{yzIr%`UĒ"~"T?A >f? -fM4Ɛ?7 fsz7Z!!8̘!} OUp"9-BYЦ 9߲6 h֞lDJ]e!9:N} HЏ -hUB6:D`/,ogcKD$cN_vs`*- 6* ENj0NPL^u !IRȼ0fh^&D  Ӣx "\ !H 2Fh`<16~ g 䀳FɑBd#]H( |$-NáB@Nِ>d,SNTr ƁJҩN0 !&r@RCj zȀt*/P2! _<>,TD3 `>B@`p(T kx@ ?Jp|0A8(teeworlds-0.6.2+dfsg/data/audio/foley_land-01.wv0000644000175000017500000001774012140200333020365 0ustar felixfelixwvpkZZ*bWWWGHJVIe̯?]OϜbQk~Q? ?ߙ&^)_px Wgy徰[ b/o:%Yc Dڋe'z7@Ĉdj>){<10/Gvs*f$vTLBSc =b t_2;g؆nxOΒ[}` Y{ ԝ9m<:!b}QbXHV M[pW_G?ej YdMJv$1̅z͠Dtt H@SkCB _ɉN5#B`/'&~Se4O0mXr..ZƟ1_J`9"Aob'4^%b2uW8GV=Pr59Y1EFJOtTuCؒ7ߎd?'mP)T5v2^й/A5 x.,C ە2)f2B}^b6N")I$4n?^`P9Tc b>.T&Y9PbjmT0 E|MFh\ x}1Z40~n[0H9L͜ V*SX1Oz 0}ы*߉en:n^!5 3999GL)Rv%T"S_z:@ӫ7rgG>kJ{Ր?etHnm 3wLI?ԮVGQ?m`I2!%d[;] ct*%'F ++(^`aUHl]iι볙*bopO顡T' 2e>gnMui^-@*%ha¯N:+~SV<d{ /jaN@HȌxuC;xy.]XOHu93Zй/m.;p2q(G{Yͬuq{τiA~N%>5p0/gqqj&;+W яJZS$ZmՈx vW)0v- Fh#g>}ǖ-dw"rM,v bC!ɥAHjb27b<>PSu! BԄ&f'#r%2BO϶//JI}+N ÄԴ7*~!&HO|q({peAc7HmEQ٩Fm?'ŕQ<~8&ݰD` 1o{5qx& E\:L9O 5ꞗS5&Pl|PAX9  'i厛ͺ{Qd"Pt9^3':f(+4z4`!0;5wj h=WF#]KB̹ 7aC>eE5$;r-!>}{YN%>X̧M|xKɾЮCIf=(!?(T6fns>siL:T%nF^3v pL x)u<΂ 3H{Ju):|g՜u$MEcW{{|"=CT\/(/"sݶ2R*[Qxg;%*>]2Vbb|^|&=PbcT#O< Phk>\GV77H{QxʷM"b~eMǨ&Sf<S}<>qcv7cADX.!…JC* ,K=[ =_9$$msoKbz˳opEp ^c`+÷s y:Sbئ O#qoܩ@=Q2 #k1u(EB1DfytAHN@ps./puЏ|d sH%һZ!CsX Ӳ7Y]SNKiD '*B]ds T<'\,2ᅢyf @N0#zixdV@%50 ߈n}7|?[3=Lgxb])}jMŪVIΡ$`u_Ѣ7I%zkDOo ˥q~D;!tlþ/ϒHhuzY'*6 q+' 3m{O潄ԍdK)脬bNN_Oe}qO>+Vc//i\) Q$LYNDGQZ~/j ooU$x;XqE%"СgX]{6t*$ b?3k;C{HX?׸ C>~@G'Xx8Ψ@]E/4&f0WɧWaI3>m-g]BϞܪު&mB$]%X2ߕN8@)s*~Mn/Ҧ [ew·Sa S>$a+ ߩ\BHx 3TP 㢇vġcW2\뙾"^uq ۏxj0Hj"o'dZM{)SSORR49j\JG7~1'7N?#TgfJQ^k 3hlC]SFi46П5MIS|Y쬾h?noi=MWabUUjd\d&ORqv__$wLTl,TY- mfT2LCl{ o ̨9dj'4쇢b~[BtHc-㛓-@-'L*uFzsJI{{y"6rxDx8#<ڈyރffKtHUrbڀXʽҔW5dʁffN8_w\/^54C6sgp=kE1ܢܝu->_{OOJ_G86"_%UFDK N&Σ+,MMlr3*LOu/k }RLw& |aG<r} zL* cPaKPGOe0QL5oL?|Y,t1Z9*].9#K)^PG^.^ u-,$TzJ#&!#/?6rGW%ү>SJ7:ɱJPoςD=2n)niНwqLQ˰ih5;x,d QݝV?؉MZ!XjlX0\Eڠ ._/yLΊ j^b&A  # ;G%qpoF_]E&%[ܼVAgD+WH>6pK̇3CjF[ZMZa +)CLG"83>ӆs]CY̱(ljq4V,p Ѵ[ ,zRbC<&=wEP$綳/ϫZ⾔ZG`x f-)^s_ J^N$jThxXMظ4#艨 "! XR v8vN:$͗Jww+Ҋq#)!]*B|bPpyQD) 3/d ZQTUH= x` YfhDilhK`s]D <Hny$,M!4a+XVl0[n߀QDv6ZR}6DPܴoBܹ4REKVP C֪dQJͧ66 s}S na zjh&O N`IvI$#LآvcRhnY3f#N%[n~;ya4T_U+ ~ӊJkٹmpP=vn5o1܅tS?$~ ukgQB։&zqKRT kE%Z=`g{e"l ! ҧ טAق`N8M2MV_ Uu DY]Ch_OS_TF-;c&&bxuIsҪ/^s8sO{#,W^JKխYu>$xg#j^65( J@|N@^msL:v#Na+@3e男$)L3V[JŦ@;$ĦhJ$q* -D$ĉP=sl{\H2HbV{fhWC]ji@^_RkHj$qQݰD4}D?(i:`vMefb@d lYiSϳi3@ ؃JwmHr5*# ZX9XUh q](2yre9UC5ԨTZ9`3i k2"T\#W$+alD'qw|[LJRCs nbQeN[,BObЁ |\>m"5%a+8fPبO#;9#r<ނo V$y!pz0ɐfHƎD@ot|s'4Q;YHT°t| ^:qOw\Ɋ`ք+,uJ&VVj ,>D fR}ܸxݸefW#qN}D*@1tH^,`ck2,\r~L-Wd7p^' B8|bp"$I\Qs H@"]1I`A!8 `YGЈ2[i@GzPh Ф>(pIL;pwG>)Cteeworlds-0.6.2+dfsg/data/audio/foley_land-02.wv0000644000175000017500000002027212140200333020360 0ustar felixfelixwvpk &&!GWWWGHJVIe;}W/ _7n6{1Ǯ+?-twmPh"3|l'58Ӿ_yu}4/Ymk@?ˤ3,#vs%G|r sy;o7w&P>?p~%O|}aˁ8 5-y[^oCgYıʨG톶C|T϶qJ뜓 r2i]pun֖:c.6e!!dxc a })Mt"GR7M{ӢlQ,e*~P~Nkiq]'a-!w`Hiõ9FA|M۟?f޽ o}WH z íپo $mqP8G>ʐw|x!CÓ#u]0.dRTC<WS*s+Mlc(NəvLNb7^G-c霑їρ$TGa_XPUNrzXύxH1dّ:ܜ!Hђ]w[}{db4K~ÊصOBXӜ8:+Q9i fb Un"sɵ rP).c3 # JTU@RdʵLJx2!.6R H1 fѭ Zج3G^ nt`YH(e9kP&bdPsM)} &#p)1@J4=l#(1Gw;^:UEҧ4 7j72ݲݍ׎q+'wCZ3-ҍ 8(OHda$:,! 克BݏaךD(3vi=~_KÙ S[VͦiD)!nH*keT|kZ R>pk :v F%2yRXlb s"] n<;nґ'pYIp(PXVӐo>@LJV07.ࢇ=FbƗvҹ!D#KW G5<=Zq<җj~q]2>UN"VO݂'V846ak^YHF~҄F%R\v L-8dFt^K'Ilup? p$jMf3=j2$B:0 wi%Û2_Ϗm"F!k|Oow;'M|}d?/]~+E G3[i]9D-:x3 ]:g)`v PiAa7Gc|5t % b$m5~YSF7+ĩ껶R'kd{Mm*t F#bpw/@^[0X`pjB#vth.fT>[an#\x*{His `p6+~=^f~ab8e<= yԔ)-13d@'|;YeCbݢpS?^`wݯZutȹ]eAjJ H#h|c'9^Ƽ{B;zS?yx%󍠢hT1\ <ߓLġߥIRLӿZleQ|k*)BZ>yn+f-7+gmRh;͊2X i64Xy!}${kcҵ t{ri}Sn3E*0_r"pzQ8/@zSKbA{t9\6UGK}bà #WԆvt5oq p $. ]J;]hY[Y,ᅋ~̒Ꮯӄ5♥&"ёW7 c +Ɍ잌م)վ~D:5j&yu^[VPXPcYK[LOw~ozb4}S]߲l`eOOش[8K\A ƳȌ |?󓻵ܧS;`/R!nq:/[*bf2Φӡd_?t xK[!+^Dk0)g#X>*f-(Lk'e2n ]ƻc;{gV&]/G3Kj>4:?º 9žled.'Y`Ė[& `S ?l s&0DР'0}{wk < *"7 g &qO[SX6=]HH#Xt^"}Onf}D:i0Ϙ q;׸>E/ܘ/ 2a*g5*4 9( 87ÄHG` jX7i~I547E&9p;1 kd9TwʿK!`dJNozLԒ(a*z,e~y$Da4p:EE":şS'`uOU/ߡ>I{đhL0wfپ#cso#7g{-AnKݤ|-j<m'~_k_RaooteAT_fm qK(οw&#pA8V6-6S!`c8`Ai(;WcN{ls 0#% c5TUp ڈ zcj0YDGsWQQA.0|vr- di^Kn[6֎ [T0mg=2xGtF0WM?[\"ե'@~VدP\be=h+np8_- !] (V?:bV&01IhCm-82w[O"WV,qvMȺ{OIc/G>>CII~D(i%d=age69r^7Ͳ nlX7.λ،6<$-(k9lK{91Lgq1cSSk\k4}!{Ycɉ]l,QC5ƏqC(t>hnV&V awbiuƌe 1v(-O_)5$qs~6fSFzTyFq_(\.2mWbK|x7rص]ԩh=?$2T!U u o [a392R <՜Poډy7YK!,o%&P38j, Bhr9G[)V&--SGqa e-S7d^*#!FAlh9qjn$yƃ4gy+ K ʹֺ̭2%Lnokvi;.+ڄ*䈩GoN`7So../*1: 讧.{7/0YB)RD\?:!_^('5KP<+jtc'Z+sEhH&䇴p{$_΁bx8]Cn")*U=,ZUtο{8y^L(?c=yοwзH=G]nEB &Pv[b ųh'm:g_>NA_Iv7=w J!I=TFZXPD>* .92L(BOGbHbHY+z9~Ź0D7 HsƩ[=Yُ}H- )Pb$_vD_~ ԮH>k 5[f6ޠ{48'*Ng<ɞXmnBayU'MԟĀ [RF~蹍ſo/v50 Q)k ^l"JffaK`+]= .wtPURM(&eYǂFeUI, e,0^]!>?(*%w,g`~1}M"XAQw({ Aw߰z Y~!3괄] l@-,U>lj(g<%Y^E[Toڟb ,] Joޛ#::0Beq VuIWa[RX_IG[*$0iq 71lީor"h < " gC,0ݜtTxK ȇBf ]ۛ躞HsKo] \΢P(eܳYz{-K(\5u@NqXoTvS mӐ:d jbe 4ؗT Kiq>0)>2]txQ]QހW13 {?u2ő(7FQV>^a>fH$~vJz7 fhDVCsy1/g,ͪh SIv]lӲ9eݔ6r@Ϫ&Ok`mN…W-K fgHc Vlr*CTqs{| Y~Vs ii[=C}}쵌+G>Cd_*'^٧oZ?iLf_;tڥ9($QVZ2M<{~})A*kS|eYsf"Dmh{ti%[R s .L (fPɔϊ+ Pf/SoaتLĺUh}]S`_Z,wBoP4dlkg߆[3M≗IC@.pf}q$ۺƦAKrXO晜Ђfߘ'z JÀRwa#v-x$mt7!'EJS܊zo1M wbۂb3(S|A@Jb*y2{$jD5&3( WT`wC}u:aFS̾".[2 aZ5l@Q0C ;bG1szL^]H83U:N?.7^؁kF\ӎh)yD3-%؛, [ S^0R-ۡ|DIuRd,[:B )A0z-c.Fk⟶lQNU6PPCwn>XbUw:Bfm=5Aa[^${F?H<,RN$R2䴫-`M;SqnGs/uYLxƩX]Gs"7^L?,#fpFakRwGp`Zpow PN-(_p07v,{QqVԃ ,3$-Р.W IxX\~B9Cb>8}VDy 1'J_Zl둥E/$^ҙMZz @1qFM`x4ٹ6,om&Tg {Y :J4 g S\㌱+V*z7L@$VǰѲFgݕlq12}\#E(e)o!/ hkc4d e,,hUpC4@7)SG( 3*\U`9YH<Hx@Q0^Jy8+?6"X/CO?ߣGG5D0 teeworlds-0.6.2+dfsg/data/audio/foley_land-03.wv0000644000175000017500000002014212140200333020355 0ustar felixfelixwvpkZ ZZG.WWWGHJVIeoo{ѻ|ߎ?'lu?姾;1';M^ip4_RLx}_f_Cw0n%ﯝgvzvD7G}4e~t07ae2e}HKs҈,xiM_f~iwu-xZ^+c_rdZNc2<N)36ׄ*Jֹ5>Qo.ih?ltXߞ,/hs8ofGu *vNx euEuwoC|{ z*$4v߆q+'P.$"|SGhQxU O(A?ih)^ (iͪ1a ‰8AaBRO4gqXOXpO*l0#;dJjx܏}P!X $wiZ9S@ܡ9rj4c2Zޅy"1k(ʛ|Զc!K%M3]2TmH=jc -O ~221S )Q<>:~Ԃ*˪.v$q'B&ݼ-Pi툭:@R_\()oH bG-B%!݀R{JJlW y欋R)OlxNvZ5%uoVPREac).Ѧ_< baw Y` ӾۦzV}ލ8-B`f Sz|EP߁! ;l ꤨ$28' ](5-KaKU"% )46 '7o Q5)aRm!$%79 {[ ,o DŽmgXp6P \=z#" fŇ~2FYWּ{fkq/pMA{Nc #ylZ|KٗhG kU'\cAcPmZХ:.*ݥ~tXlK0* 6?v57ڸJTːaZFsSF4&&~Ɓ]|9YO q@9-?~x7E-}hF=N}X'wB@'j;{~ZHoSyOjBU)@Αx4hjf3xq]\+FotSKM4ʆw -| p"9Rʧ>juG4رs>Ռ>p}dRrM S,ΐn3?iE u d.W86KR:)0A-݋OkϢ{w{{>QUJC&Ŏ Qv >ǐ789^]ZٯV}`2|5-@ %pTp1GӤr*N匤]٦:༤˭K ^(zaYO@[±+ Ww 8G@m1 9C=e9 2l#;i0QV9;Bu@J!\@)PpJTUL#v;g *% :iaK6vmr8#,%\{$׃ҝ*e2W;&BlC; Оʹ0T\OttE#ݨJ1 -9KǙN!wf {EY5/>_&,\W aC(SeܗA:'ä<ԭJl]E1sGV& Y3d<{&gJ_S٠ >Tڟ aՍJQT4yMaȎCa#=e3p#BÉ!ө]P{ƀn A z6IQ[x vȕO! ၕYK7Q;$/.3k"?@V^kq T@*R)lo]m*_Ӳᾝ*ItN+{5/o@8jp+vk-#xhi6K~&nj [O5#.^f*܇ FQټjŷBUG s.|we 0Bx`]B^hK( \Eu_%AiwJI؍E-#: =5=j$ʪqq`,#}zq$rɤ_71=g1Cߙ|Sݦ'J9+?yƐܤl7Igq"5G׆c!6]Mu#̦~|΢ʰtYKԋ"=|͡SZ>q96U (o[CQ6ƒMpУ/xn9}c6)PtiWHbc&(Sh4[gAVSWsdfZ G)mBAK˶iD[.齾{JsOɤ>,=^D{I/_9{2, KjC娮E$_!G9.*): %*S\s* toZScLX)x{ϲ9G(L 'Z`̿g/B^Csj_(n/?~ ۦ@Eձ{o%/5M{E!^w9;g/ f.;&'*Ċ]|D D\jg6S~)b<3F$}?(~bMEB:e1֍9ƛۭ7YܺWh_ +b nᚒR.1d!%9f}dn$"iGdbS1 Pd)RQ³̾ IGI5EpowtT¿;w;PmCP17ZsGn欙?YU̲҇"aF%Mo2 r8N_F%] Ak0Q=hGD(vehMPv+1+Q`6 )#5ƛ|,R^:;\8nSlɀ FGn3XyȺmIBs73U rD?l1xP xh۱ s+ ʆ`O /;x攑WsXIʡ+]L  9i9龘xtOi65;@].Vqx&.y^_w۶tkѱ<%'9磎H+)#%4+?H9Pn~4L,LΎAW&" H?$)Lٓ p~3&+2;cHC7ɆC]YpQUFƜ8hɖL+n{2_!$?aIl2 9B<FB3$s~B;"Te59DGnFvS" s+YKCt }^n :OxzR R2S/pPt, tПvnT<4Z̉Ͳ9@AMG 'orY0+gMH@k{F9Y=3Fn̉:Ӓ3eSfhTNLbiN×O.l 5},t>!T5!W|t\5M<"Brp0|}r1 /3oFʬ9m\ݸگK$Gu~<-#*BSoJ]êv\W8'R֠j|x]SoO)ߪ\O@7F;܆+h0~ [wrxq~Bi"?Ԓ^ma1>| }Nx")16l¾2 VW*ZAZy =mQ3ި+Lo6Rk]5(Y) Ű멗ormk`+FigJ>jL{f<)[P1,gi)^jȗ*h8ӳ@1\@k"ԐWA8||!_n}ڣVbރ? %TJs{i\j; PdIm~dp>k}ȳPa ͭA-+jlD(DUC6NYX-s`Qwr̜yl 3:AW"n4JDFYaQ* x%xv@xˬKhΝ2x8ydc/MWv@rbY.{ M`|fTo\xérOU_^5 ȀYXR:#ɠ 12I<`I`ܜgl]5rWj5~]? q{'lG~}/F遒@Sй-$ `;%ubw-AC`! < X w]rD%n.%zobt>@E} /Wjk8**kU bn!^RƲzԨ+g Ui̼}G0|%VK9)ӳ L% 0DڅfFMEGa\󆌲xටP "@r`;WH`Mcܨ;zRKh^MKG|7fG(G,a]c"W J==G O^ZxCœCqU0QRqs̸/*§"(,ԩ*e ޴xy򩲼Y=;U"0shWV5-+Hp \#!IoRl~zM(6rUARY,NG7|uTi@~ǻ&Ҽw|E qB[c Va3[#AS]kgM[&rV2o%6 eBLCrlfб^bB,1d]Nkmh/CU- = `>l$I:d7.>tdF랙ba O% 5f\EA =fә 5q+&>iR2ta(`C/A5NXom<( 5\p! 4ֹ^ 8] /ub>XFl@40g ;|=T)jS]L#t# ba@ nMƮ?\!tv6Ƽ5"m==_T*nM):"6/, ]cVFKFvN:` rKMqQ5./}qH "^82 |"ݪ0L" r@'t!d.N~Rc;+XjFBaL]X+j>V3c'ۗ*>  BdotމssE| &M꼅҇NILw}hj?5e96JBƂ9R_<(%uFN<(NyȈ=,z/"Ն4ەډ r"J̩XǗax)I!/;!%DI0 %pj aM@~ī٩f+ᪿ@CPr_nS&pCqeF4v S1ծeynJ-*ѵ]IӌGPJLkFe#\YArfV4cY$=W4DW}Št !=cPԭJĠCxE#1CX܈Q5 ;0@%EǀI*.c???^V{>8x` 1~cF?1kteeworlds-0.6.2+dfsg/data/audio/foley_land-04.wv0000644000175000017500000002173012140200333020362 0ustar felixfelixwvpk#VWWWGHJVIeGkk{?-_Ῐy?w;lۯ^΄N}~YuF],%$rh}ovޟ,|' BpO}D]6|4w<4={Bdy>1Z<+rgWwx~>cۻ}u1R_ZЮu~R]o~ۖ/ۍ [i3NJs.rWa!sqZ<ߣq&; w{Ͽ:Fv9p e'>hlj_F+ h&^]}qC {yj+(.[e~``ĉi(?f96Z!jYygbKn0ESLWO2[3WNdd۴ pxt3ote0q";5_Ks%#A%R?SN`eo_̨{DSi]Mٱ +Z:fDlA{ln^Wycn3(Y"uؾ_7}ZVvLvKC l[PD0 )xMtj rD |=i)Z놇u!ي9!MNrro ܄)?ʬ&-qJЭ3:P/h v`z!V+I>)ͧM; tizf4y69+F 9#MTcmjL׸P1^ڶ8DJ*p([J> 04Z$`X0ے =5⁳Oƃ4HH|p&-HiZÝ`,gaBr}%m/08}J޹l#'S5AI-MdzI'}P(yG5+FEc2]PU؅J[v[٨&?ʻ߹?ᦦ1<@7XU$%HiyqL^h/s2w]:Q&(܏@ h< LjX}JCAȮ٭i710ЭIFNFwgvo٣AhH)9wI6#Sİ3W0A KҾofR.[9۝kTt)MS^ .k4| `JH~c=_LG8=2$Cr1-m:hqž5s6>F4w\䪺Ì Ӥa1 #=y2 Uv @R(nڍ^v֕\ NWDzIw(֗Uq(#…(ە >u) +[#:1g7/W Ҫ3-mA_(ȝcJdtp5Uz#;n&!T4if'2k'i|5??i^mڡ=LC0x72~g{z$j܋_濵h T?RRLn@I:(0_XS0@zEe:6&r驖4IL=ǏL{\=R#2avX#>N< ׆YM~U!``W62ٹ9JޕATY2j˲ݔibIa9PT<Ҿsț~sp@*tLW]1fELL~G6soZRw+Ym MfS4knr ) Yf0M<@5j@Xu d6?v @yWr}DʾW |X0,Cv0m/g΃eGPž6&l!o=-Pv` U|a) ݻj Oo+L0^-)|y,5.EVm RKKX,d;D6^5 sNd?zMyC{TR*7h(R~]-1Tҽti @ȟP~?ܦ 6퉠o=( h8ݻl(I뚨궧a9z*0x:5^|9ͣ$J6 /.ZAk>ǿxzY`~.}%mNy!G.䲄h*JepV6D*3vڵIg۫/NI,8jTt6_?5ii!o&)9ȍfvi/vL}߱Eϗ?Ikd|]mi׷aG&C5VEx-)%D-i,S , d@i(#>+~r\ǯ~>TzYQ^'\s8Ws|N/ch|s _A8Yr9wUcU W}SƷ*u.bPJSMqi@ .>@d-JM]0PJǏ`ZR:UJ>R\Abn!eO[{v+dOi#B=0O,$9Z" =괱,v;oF/ {)"{8>x0VKIlZB!;0J19&&F, D6-41DP$M0/xaÔ% ђ4x , jb9 < Ch4R\(ʛ,rgŘ4K -< %DО{XK"c-)PvwS&YuV66 pX3H#P * 8uHX,-SYI0qQns9yusDH2;ܦ햃$.F?Ub8" G#Yڎ 7Ƥx6^ZM~= %EITK :Hn̢֤jGɝ)(!)h*ƲdH{* 7:5b&;ƽ;>Xn*/1lB7̘m#G'~獍L%4GHA8uvTSUS&: [ k?* ߄ [!aοE5k: g@5n}~~S<AX)H Z03KrMKME ^{9}j'gD}7 ~au?![mbIjG]@ ~>@lZR3o#q29wYcܤ+ذ/gN*%sGfᚯ{-5$qal&L0]a" *z-&\Ng|&2WDR.),)=2Tqge԰pB$8g)jp&8Ϳo]Fe#Z@x%*Hk/dKcoqC5 鹿Ģ334#* d#~ bn4ľ|IWX>`' { e~HXZ̾G_F }GuA3]jm{BUC>H|_5*DJHtj5,f^0bQuG`J63Prx/edT`+戵`ğf]#6:a֗]~K-Y}#F0R4Rtptɀ#L% ~/G),xpzm.Yab%C揅d%gEgG%% <\]Q:ZfYSےf:k]*%0_;8GD߼ؠHds\q8# uc˧ZʤT=vN4f5vMn??w/]1AlY!'c_Fb`EX݀FҒ5Ñ;Qv0OVh>@֞8$c`1J/pz=wr[ f5:(sx;ʽJ=α.ѷUojdS+Gr?-[( UTqOm3B-~.qRv;kW2)`%.IhIXD8>q,/N'sF=-puQ- ]DpN{oZ>!Kz.bd{yZCoks>T\n)CEnl=> 3L\`V:A1O; _UV,٠![]xZJЊ²Ͼ-z sV?шt`̼pR}a!$_8!!}J͏{VpqRkB?x!#={=kJt?k޵Vw#ϲg=>r:GG,͎Cv3,ꢶt)*%b2ƕ LtҹY*,4EYC,BS*m8jLmqXJ~q"y շE%2I9ִzh0bi۶葦Լ%l.j(.<螅9r4tGo|W(H`MjH}SF)ow}3a yRX&Ho ]p%P;bc 4k6-/H 4yv*.ϻ\\4m ղ5Q8E)բ@W?hC$VC $b@$iIf]h Ki'VM83!f/?t} IP-UNFa!()u=um Fz*{9*߅bE<%_T{2=Ya8 ?!M&"x$%|tjNSDP%Hߌ~Q#8 q٫fe nS>qLWeU6g6<[Y=}W@^;P%=Nrs5{95ffi/=j.{>)TKQKcQ V {[a׿b1ӐQ-O]\P rBm[.'B 7605ta ^=P^wOv2w3"u>r)G0#c-8&wyYzv/ >ox*!t Brm:^Mi#XڃT+]|U+)YkE5 Pf5s1j5"CԲ }C{h0[43B=6(h/W,* rNaB3XpϚL[6 @Dh> Y[nS:eybƑ@1qN0(6=bDXq<jChP-d;2)i Ep;*k0s.4ڒK\}mZ}&ʩeɷPPrI0r387<[{et] +Stu5ʋ6Yo0SX?QJL K\Pn'e:Pq/>s;cQ й-וU~Afa_/Ϩ4 Ga}NHnbN+քaޣj*Jta_-ÍԨObe*P6 [xH5e4:?/Ֆ$Y-:/t2ö|w uKվjh1ꨉH%XiS4׈N@B^ ;1dEe;tWE2iqȍJPzBW(5 ;V Ztp9ِ@R?l^8l)B5n"B = $3+.;,'$Rܳӧ``W$v+DoW)3֒`?z}HYM"wUixSN "<\zjbP=Э\c;ʞBoW)/'DɌ{Jc,dMhb)C_̮#$/(Gd.ɳgmJg*CQGEKTcdr%=WLhMl=`DYu_!)Abu}o/6gҧF'>-=blXlҚucvfʐ2 Pܛ22>RkY?:- 2'6#70{CbRRD[ITˏq\W1w/g@?')&Y8-9"!k”4a4s~s!B#'e %pq] [|?_Sjh#41*ob4Z>)9GpRcg!k|u̡ Y~# +d#+u,Z[Eb9m+7l84oe.VbPa?ҳ,x<;cschۓ'ױptEh뱸ZkŶ[+Vc@O ``{ ߞ.c(f!>D4TMOߡd#x9CI~Q&:eH'!;ÒS,+A&\b*1sYdx_=^'`H@M6,3jХ(0 p7>\$HH2t +*2TYl:hh6}aD8XTQ5:VB* @ s '$2[2~@teeworlds-0.6.2+dfsg/data/audio/hook_attach-01.wv0000644000175000017500000001262012140200333020525 0ustar felixfelixwvpk M<%!RIFF2WAVEfmt wdata(BWWGVHCW 0 ?e`%C008 bPQ b `B #".S! 1 9@J pä@1yrp!R&fI Ak^tO? Q%]?,t/x>PQ{#Lq{A !lMz^ Qw',ٛ!{ EU7&ٙI?.TỌcDnkSBX-̢4yi0 q?AT`kfbm dM oCйGtOd|!l]71 Qſ0 j?hY^H7)҆6t]7^mmqO?YBS`"ƣ,;b~aj%)@F6RX[I8r&ک@E9L|>I Y@&"GNjFz'^2>R] -)ciCX`cC4(|RQ SM*]UXkp2z8k޹dq9cژ,JaI7' nUZxcTX٘X4Ro Zi8g?^xh;2c/9.O՟y9yHFU44i5QOEw 2Ga3Ȼ.%OB1_ A{f@5X@"1B3t(А5X>{^5R):0~b>-М*`DcCrZxHI"S2*J40b FCN%'3FLa2r` I0 #$7@#{oc3FuPwjل r+ߠ4XO+?=mlxeX恊6cq˄\ @g(^&2W7ae,yX%Nc,ܤ/ 8Gt I>{hyt:cQD.mJslm+~&( $u4`6.y _ G ,##Q?`oVv@NXvb -d0 ް&h3ype<-ØfKbhmCvj9-%RC&{8 %a\D8A f/ʣ~9Ӆ,~zyΐL`,x- Fc)S# vt:DCwvpk S_PMX DISPteeworlds-0.6.2+dfsg/data/audio/hook_attach-02.wv0000644000175000017500000001207212140200333020527 0ustar felixfelixwvpkh M<%P=!RIFFT0WAVEfmt wdata%BWWGVHCP$#G- Cfe`z11;`FN6Cf2CKuuqRLj̩Cٺ=.F$™"V'"aaKϒBPr3 W vo\ʿ瑤Ͷ/Qz.0Olur$8q#YҘTOn$Wt@owX,iM WC ~17dY6sz>m9as;p&kRɹ;4~/2)jcSӓ{=k DoӘdI襞q5J؉=vÛYSjR,6q$:#x5$^׾$JG  1 t@aPcyϸ|<[yR ` &}+ !"0 }>H o=t4^13_LȩoSh=|J g]9o1(}W_2,VޟAJp[ {;ct-!ܿ0ZЀ5''dR=ڂo2fq2DL8/X!=9b %NlDbGcjEZ;ml4ktա}v}&W{?Γ0'p=I4/‰1|.'ՇZB&h>4q q"Î11jO:IkhlDHtc}"Z#@Ak-2)g"寃 j b)F"Ϩ)9X9ywr)'RMw^P 쓇8͢&wCVfg)hmsTIMk2,GXμ4R؈Y;>@bɗ4:3=4?/ yd 8_'/m < <cRR{܇qv"FDƣ/0e IO7תyx)?! %NϤZ1 ,|]"mHtRneIթOPLNyIR*9A1h{>)No4FfakXg:-:.'ihAQEQ3D36, rS)e C`ГRv9/"[(z|dZ:5U R) DISPteeworlds-0.6.2+dfsg/data/audio/hook_attach-03.wv0000644000175000017500000001204412140200333020527 0ustar felixfelixwvpkR M<%!RIFFT0WAVEfmt wdata%BWWGVHCP& !]ie`oS'!V&zaaJH+meND|v7OM9]\(rc1>-?G|gj1u'CbQyWxrK)kC'J,5Om<`WǑ?@Q-p8Uu?;kdt>өtм@\]ПzOp_FַfdPυ4YAWAO&BPG b_ -J?'dՀ?q$zBCqw @݃S*k7NV%lFm۽0? -$2?sGUR"7!k 9ʓbI(:!$`(2+,Y ?PAgc@u+%%da0L'%W mb,Dd` d xmxycO}.{Bl$8 qD^}L#yn:"d^ݙH<ƊPKU 7s<`n!{۽a@''T&<=6& IC:rR֣o֖3G7F3>r).`l_Dts:l4kg)C0 jPp,OMo)>?h=ӴT@,or5&m7 , OU w.d_|:Kˡ|b\P!pfiSx3l>J` Z9$@'%> T #R@Tfg0‰ &Tj@3 6i2Ap@RVdf^8. U+hHBkIlc(Qr aAVD%eu=Ƭ}{vz@%#C^PqK5R› A+?Hp<1,47 %] &s G[aӔbTܠJ@1GATfRSiRɞ5=LgZYZID*%=!I(!Iؠ;!Y)1N wyg䙯#JO *IfZ[ l7 <3*ÒXC-QSJ& E!*8>tŞu#"r8PLCвn2R:TY[(d%Ox3!G8:4SA ! rȪON2#%sË?qFR,=Zs"!JZ.%DɛC N DN/)kFyDg6.bg o1>i9\yB(i6z$pG!bn0/]ygENŁ62.7qFvCKzN&v ,*CoV$i X6~ [X9Ⴧ3|:9Eֺ)jDVH]JzIO`Va&/LsX*O 6\_`;6VXn3KK|1z xÇf^hSI6M:K3Yi y6 pCH6R$ɜHn #Waq[%ȗA0.yLQ &UJ&i~:,sGl40)ڀ_yBkQ&!iy^L#T7IgkYjxlj۾`J} !)_=H*,<5Q| 6>X}l !׸>|f$NG ti'*sQw/~= LeuQ*j Fx ósC#@4TGZGiD7CdZ(L7Iϰq!wf@qO) >uA6N|<-I1gb` ) 'räTT̠@ͣeNU 4/,}ax4X!&̎Tq[* fxj[Ơ%lUG!P,ڽt5(U3CsйFS7E6&gwvpk S_PMX DISPteeworlds-0.6.2+dfsg/data/audio/hook_loop-01.wv0000644000175000017500000007004612140200333020240 0ustar felixfelixwvpkp}p}pӎ}WWWGHJVIe7XF{xoU5O73_8.Cؕ7|r: Z/o>w~nW/Ջ6{2ISx%kw>TID$W#^lsI,VZ&1meP:2TaI _m1z(&i>DþdvscXɔ=VM E?m&"=Tw$@gqZ 9j06,Gcz6^kthy,:QKp N<&@1C4x T`d"NLJ: %tW %@ G(e NCF>UsN rȱG #ʥ , I @@(x`HN+4tQdfa?coO]npS_Jr5k$Yc_wqq?gߊ< PF*~'j;#)S˕]`8j7a:_V{C'#,΄(ʄMGıWqS:얋̴98"Jj~:8E+{h yޢXdZŮuilln}!$FP|ȱOHu|'SmInv aȮm0$XH^f^?4LaKxxnFPđUH1Ja֪d[ 8">*MB4hEG` 3t#g̪J/'xJ5~ひ0!]>KT#{VLJ*1mBR!q% OiRrކ6V]"MB3ɵ26'Gb N$)0< 82˻,DgmTbA[Kd Vn*KIUGN106IY٥>nݛc[EQ6Y(9-kh3VǨwo NJy5EɱI}9tя@N \RJF#TGE؁+7] $\ ic7g%JyR"`-1ji_^ pv`4¨Y /prtEol|sA?Aa,gbfo\0ڹl"; 3ڶxg1w!߬_Z5TAw 6.ŗc'vM)8%V =tvO;si+*EX,:K vV`EB&]"*fb#V!d̅6uں8u;M RsGbQ: ЀvWApǑW[(q_dC|R-\D5;Wr'H̾h]T:O[qId670Q:~y䫎p ʇPh3"R;C䧡6eÇԋأvhEL1(cJg9N0jۏt iuRJ4"*oUI',#kX V* GwZـ;xu̵]< Y+)gzlÆ[cוo]cokٶ50:{bc} wf YL5WY,n*W'FF;nI 2 1~O)O 5(7+ 2e՘xL#\-}l{.#rX'|rtzOLɼTaϚgm~r<LiiE#7F\$V3F<QU;iߜb{EFԜߝhb ܵa yX;zn='VD,ŀu1[eG8Nx4 XF N>QRVfx}~o8+FyR`'u<)gEO`}'>: E˾szW`0QLɘg(h ] Fn"ܱ8w([ !P3ẼC oQD%5e"p#K)|y[?*G?FP⾚] %̵݊'珂s5~t9_v>-lڋNq+=УK8cp-zrzg^|u݊ q< \z $ v`2@܅$iz/H:S r`$Q=VhyST^鱱d(u2wo- {ow2ޏhଂ MD0J(VuVm580܆%vk{솁R0~P آ.핱UMbOS.HKQͭ.䒩ofR0 Xі҇Pv*n)2!)J$D3xUBuѧz:k#Y LA>'FI,'D~KSk0A8X5GRf jV[DpI0yH&`0渕 WM k/AbǻZqNE`= avR*f38 l`Aqa%O0:V&`ƶ)~%* gvF&D Nd7+fdDp[hT)e]*aIQuSg$h jz-;zԌ/xUtYӡi-j99*IVn"\'}i&$& EZ@X60v ׅ 'S^5_ 8Ԅ{j$DCɜ3KApx6f9,7@tHp~rV_?Gq ~'HP/* ':i@<Ut E1t^ GahA3E($P1j. %.8w7 =P@]BXd8l\`v`TΐNPWtH83:8\SnAK炋T mɋ};{G,r=29^*m4\ʵ)d~Ҡd)^,x䝞ո;xgls?-y̪1b13/me$XRMu~,n) .Lg{L_sڱ !)aOL&L ZDb05Z?]?Aƀb|Ǻ )4=IJ92P6Eھw4" d$_TҤy lmujl;!"Ίr2]zwwE|WXi\J } läc 9̛#_^ΣXHh1Pzޖ4$BRfnW^œKtu,u$b`}Vxњ_(BP3ռy9Og!|D^-a`!_!׷m(c#>i -Mp|. ʝ o˃iUzD+FD0.=o/Lv b@aP䠄04P(`/QGᾼeɜL]ľkr}gt:r7ZrH3pD{Vʬ~?D ?$r-LK= Hz.RLz =B&&RCFf"=coLBrIIVV{3ڰVS\U͑Z>1{˕3Ry)QB1,H.$cKF,qus^\` 4UIa* q,7BWXU%1$;96E6 |Tg(RSXEA]o]$j\Qbhjͻj:RDD5>Aݑ8p )m0A[3+BT lԱ8H̍2UBrPRS 4'E8`FxB$>0--ΕrOR P*Ѷ"{jjܙKR\xY,:e"'^›x:CvGJ~i`璩&ZYȣЬl^Ww}x6UK{  t{MNy\Gh8mx }^S?QMŘK$Ӏ婱h" "d'V^HVC#~0xǠىH!đeM 47~A-CaF$tӌElxzxA!B4/O`sF|>Zdӂj. i+rc):ik)lĜʊj'Zvg ]-0f)v/llpy 3iaO"e4i K!ZqJwu[!VvُOFMq3"AA25X](_3B$ز}5u5+Z`kv0Ɯ 8eY (M\#jabXed n`H)lRO9 j%"Mj6 \zsP8w9_$IU=[K'>bTYڔpup-HxU*v*89,PytT );@XT@D@E@ 8e 7h(pcK@A&7$k7t1y ,*5'xg+ 6ST Ĕ83&((1{Bȝ{2 %tWĜ뽀ta dK Qv7y8~2af}*dYX~Jx㼕 t:|(T;J̭<1 n$E=K;**偶\ Eq]]l1,]~V|<UK o+@H)gfyV}ptWI\B\͕c6҂IB׿<^\Y'4uIye+i^S_a*S! WZ_-%oi,^oJ/z?~ cˋޤ,~uSKqU!@yҚcjaq'=Y 1Ӥq =Pffu*%5ayA];WG ߅Jhڧ2s~M.6h*I=?==ڒ MBPgh%'/ۈyduyrۍL(ȅ+߯o-_w< o ص?/t` o'c:'?wOGmrU~lά*94Ñ* F!W{evI2oHU2JfpQ(b({xWWjK}•oV42sz~??_O7{9OZ Yk| MsTs|=Bexӆ9Q7Wg*\OC#V|#:SD+<| `dj89ͱ*0p׉lj9;'[1Zoʃ pP/^P)yvF*B 3͖[C5+[Calt9QålPšk584Sb%-h OA푽ՔwBݼhݟ2踄$xvM.sI!< c&70`: <;ixB T%%5f'y?KS-jY0áG"w.q< i3]҃_k12AhvX:삎 '`d~ƈeb-r~pplYnBT?jPrΥ/4!K̨%s\JQŗBɬf#aOzTiT4/$A'?eMn7E::p)PY!d]/w|$Qy3䢫7ts/8JnLd<ޚ/IPXA2a1 Sȳk3>{ xp6X &~ *RQ]r^pz/2I:hDI? Z9HDK[GTD. ȻEN&;$q0qjΝCDeK$'ִq Q4CH%"`E!!#@ 6u!$FwK( >#`_HOZ8rmp')3+` $0owL^c 46 -MͼDxz\6YtfyX+asx'#" ~F'ڴ78fcij+]XxVW~4[}Olh3VByӋ!Wvx@+J\LFW1WZ,|( +tqRuh"_ZaL@?Go >^?S*öSA?o.#~vHZyOAW;)wJoW썭 PѼ:L(Nwn|Y#oo7/He4/އ(Qdal>ZH7Ja`VJ}~I#8[Q I e7en= $OPK/Îy<|vr#bKZk@gg1V ƗRG[28 vBa d )D2+2R;񄞵llP1 K3Lc@c{.3Ѱ7G@x1[6+bloY]Bpnydh,FαU5Kô5bsA9HȻIx˸F8[1J$*JwU*/~X˂S}) F=?pDhXWFNβ3 S!8' F+@`S.zEGcРX0.oUCB6i dAy{ɻZH#,0#WƸeþ O}7%֏Ě7ΚJ`).u *MiWE ۗp>K^?LM83gwZK{y?jCQOkZH}꿐SHe滟]PV6&;yY/wa#B;Qbk4=5 uD -. Eo-HmvbH߸fתXr#2qA^Hsu:䣢z9ǕwÙqKuxS/JĖQHM[>rF? ,O >nMѷ眰CSc{t -}ęp&|Ŵn:5 ;w[΍ow.^w}4tZl28,nxx ;>l5,L1r&mOGK`?~=:;S>?>~Q%[d7v}йY͂_yjh'Y *d{ccjz5 SpЈN +tg..eq񰁜glb:#3S^3A:s1רOao^n)Ty:,"TPWgՍenq%ATBh`Gb *=_rzdC (_%A8hRB]\FV7ay +S'KVmJ]]L=ts13O,\Dyt/S*W`J&%}|ЗE %Car-U{ ZH]J8 ə. sj8qu' (;PUY-@C]=lNڃ/bK_^WLqVqx3 Fsb9=ܲ}9髛OvIT#[VdwFɀ$_v&'EAjչD& XdKtA7۲Kͱ#8pT4)ș[OkѦA#a$H,sH5Nfrz;2߼2k܏ߕGzD0yG9$O x{83V3чY,M$:1h3 tnD\20Xpqqlgd-ȺF6d)=5JR&?EyFlC۝P;LcmcDg|3HE,,K@udrT9^P/ɐ<@@|3Ud$a)ax3ؼ̶g~Lj*SQpMׂOoល-,lia08@#$Ȍm塰Zsᣋ- JRXE =r9;h 4BMHqc2)&V]w~w1/ԉAXO@^%h7=ڏ?ٗN%a Û3:7K^_*;51 q~s^4KQd;EхLWv pca`'21 ]6ͥ@=Yi &v#)ս&5#|鑻!XZ!- au^D:첚x l|*.<6|F,T~U5{A9M:Y֌ Yw*?4A񆞰n)d*l6PB 9^1U"GE1 !nZ x3o`5ZR+mרf MQ(l\ufvwbaӋ#.@B!4ncd}<8xרi\;L:8aѧA/`$ H$x#nTma8M@*fM(HJK5 ' BD,1-.'aN}8sthd1їge[=4N颡 D1;UP5<)}GW_ER"+ʊ\?]ԥ6".Z58 U`1'i{)o4:P 5;RTVycZE Av3LA\T,KR'u-|A$1uHi$F/d+'/ |%"M-|bsF@lK H :&R$xTҢ-kVm+'*8uggsy3/l5't]b`]\ sVLJAIU{05gexOa`X/jT|.GdRSY z8DGӊP&IGGpoz(;} Ʋ6NRʭf LN7|їkG5έR$~3f^oax M"xJ*m2xV 4"U@TR#a}!pk@uh:3nl7t#m6!LQJfX+'V*!z ES[_ C'f&){9S&adJp#N-!@P$+"ԏ+\yC/=8 #5kv Wp'lwMV F~יo :_U Xgm4 DSofxH@w|7ΪY!XJet +xjUPX+E_P6  X)P+5e5I)*3榻4ۀTz(0 r 1Ex| !$(e |G_1Bh@H.IiWD1Ȉ!B=Q¬A8PhD8 X&]B "` p}ǸJʰ?cQ}dl5n'.˺~\țT=EIs_U3ȋmH5? iCԂqqyr}[Nܣycl$>BBd?8l/ֶz݁{I'#{:1 Iڐ`=`rطcvER!;sH aQٍmʫafvc0R`vI)Nl}yQNyoDw2U|tEb<53|q;|(1:DR*)JVzl䴌##&0 f@ ÒYA5`R! D$,ub!0xj<@P'<;/'{Hrr.vr9៼ן~'it s{jOk'~'sGLqO[YXV kݗI7Vs UgBΖ듳1yʁpڰ|ȟh-$Wn;_Yn6ˈCJ8}ڕD.^6x(__+U1u1jt{5᳚%sqUD(gp<p>InZƠ8K|`;⢽-g;VP߆s/eh6aMra$m%G%]߼o#”=ᾫXS=HK"\·&Yb}c'L'K:ϗ?ha-T1Fǽjq ™Op : s"MHŰqrZah$I@Wj435\Y4בE5_XTR+[JgBCKYM9S<_K"#YJ^ C:NZ mN*BED2 x]D4)bR}~a]6˙r@"8Bxѹٕ`,!/KmXpyȋԐQ zfJeVTgVL鉆}*E)l0^Z}-%C V#~y9,>meZYȥzb+%.r5df#DL.GiKya1Ջ^,MdȳЦrXM%b;;,TFID6.TќGZq 2uFt\\A ՙ> @持);] gϤ_UTqďPCvf)AU_2 tbi 6m\'B8~}9N{Og6<T@aMqX]w!E<[?hXQqY `A`2un蠄Ϊ Q)s/9/D+3%)\mx͊# Ŵf;(yk)q3lQXYREC$ɮV^*"4O-4Bp8$StVE$fwU3~a] bwzI,2Q|0!Qb@9v6dE&K 0ڹ Xȑ( S$`Ȣ0JIh+,q|<xd(,Q$Q@~2쬍% _j~oOHw(,H:eV>38E Ļb;V?3v@.P.@DdZJN~!ћ R5pBD\5A֒88)9Ѓ ?r1= yuKʴ@I(hEs;BE\CrCؒٸ.6t -&{nuGAdf0xn H  A,d.rYh^!Zb*K77ǁPe= еʋK0$> ?fa(!3 i1b I|)xd O; Cb.5+D?yס߱D!rKSOd/X˶IHٲ/Oiۢ3uRH,-߁~a)/ }},\}ZZ5( $hWSp0JRX• H5Ύl @2$2sjvLkbY/rsߦw&x*Q9ܡf*)nv*f?&#k}J0ɒOlEҋdHSoTZo  !]3~ډq8^R}Stk"$ebT+DV -%yrټ˹~PK,dt /7BCAڎ0 o77^jm_Z.}=+o[{y+"y:~50px[=k9|{-;aTfr\ ]Wo+9I}D/7y,pjEx\mZ2 ^nAuS.&!5ɢ9 pb q_s]H.)ĀQqgGJ|d`GwH6d"^2}LצTx2lpK\}R4fp(![RV,qd>Ѽ/o7>m Heێs/L$ 5MBː[`$%Ƀڟ _)򐫨> kYdIAgokS3;jV[kj56 &qP{lI5etuKL6:ZH ݍ!sE}]<)MuPhD6[ٮBp $MBrQN8#H i(1R&h" %I->SW I1E X;5 '?Mƒ d 9莄T2ѝ r%M5Vͱͯ +FLKݍ`]?e!Ij<P%O\Cv;XU4%6XW+AP:dPdBwJg,lp5+/pAщ Flh ss a(+6Q6=pRoKU?g$ M(oJ4O(Vti{8b2ޙ-4;'! )'D:!U!ȱ \)pFg6K P =fd\άp \&T cڗ!£uЈ7.ca.t`0Qu\U(|.=ZAщ,r05p{b뜧br#$s\xFf2k FE$Rrp=f0(!J55HP0 $D0,mKT4"/qtSj9-|QnPo-57aBctvdHD8[¦ }4"RMV$ r{7a!D⎲KŊ@~:a 69z—SBT>dEuʹG?(%ql~ ,Ei|7 aPVMNϼ_KgO.؆#VT,8GJS65W+B ўuqC:*F8 v:JdRVҜx45/#c6 o|p%ZY}19F_|ޟ1OKU/bD(rFb0 m!!Z˙%8RJK8X2\g}weuw36mV:T?3ܖ>dGݧ>&5W,vZ/_6js kIչIZx6;s\AGf|wɜQu\b(SBH#&.['[f]  N?#nse?inp:<:or-_@J7u,ɿcvr!.oJ/wE?Hz`̲kxF,dg߃x'6f ǔWކXxc>ˈ#M1 3nC? iư\%+p%vI U.g)\g]5bJ0dA)оObR=[xq`?}}gkP? L} j, kurFǺ#kAǻL4!T)ڈ$P Jgٱ7M &V++4~_`Dl;h3P:$҂-YR : R6K#q|-}4ff&3ZUK'l8d)qdODhGKP 2 G$>5Op@d \tS&MUD k!m ;#nj]N'snn}Lr0&A*i2RINTxtҠ[Te>cO=E ωBJ&'&tl,9Ũ`:8@ϐ4,~VxVDquj٘_Db )JMOlVcS[oe67@wmcdl& 0u(Q,`^rhO'N SEKy(G"ﵞz;B΃8:)]@`="0\"OmI1|;&zM-@L[PG_%4p![FdJG^k,OFu ;hY105EmQE$wN :(H}gհ$+f#c(&)V)=BH "i;e +xad@`rᆅ7`WV@03`T(Ph#N3%E\aPiƜ[Cn ,:W 'qF;HOēk|x(EJ1 :9u䄎}3TOֆܩySg*"8FkҪ+WnB_ RlDw]1E%T{x}9. :SGC8f}T56GwdGaPklEOk쏽mP246욻<%Nگ)ˏU/? QrG|ܥ)\ /'O~GS1,x0CEQ丰㪾;xzJ[S9pE"}nh0 ҕ*$8O랢bVRT CVs*ag|L!OnwXJ[{oOˏO&oW/iɗϸ֫5[nDKG ɯS ڃQ7ew[0%9x|~}e'FM0NlS Uo3ihNQM]!hwE ӫ>ъ%BMG+WS!?V2Fu%]$ FPϟI֜g{.f/uȷ>c~cy - jٓeS%7(=OW)8;ƌhwDHp28<ګ $_pN]\BJpE CDZ2a8^m1>Xp\B_X0u` ) ( (J`FY ,jNt]\c )*ׯE&v) %^S;)_n(hBI&Sjih*`[.u[teD؃3x(ݘŀֲHM1x{y;p&Sg`p7r8hI#s7oC73ZVtk!J[1τÕ g*dt-$Z{Y7%eq)pLJ=#`.E  'ɊS*a_VAʼnetMBfEcHŁ܁Lwr eZݵK|j[/ pe䃥OSy4@Qs<8:d"=LEgFvRcxdspoV{p1DX$G"?8tuuӫR5erp&JUĈ O~qPu~0cCph:?{\Yuɫd[$/yD8Yƕ͔I/I7Cda䇊 n~bky='S;69PV_!c1Gp]uV|*ؐ0]-=!FEo-:bC cjR5n/ǯe)Yǖ/`E-.#{dFY]!@ڻ:k0}X"%af_@Ƶ/E)8*ԔAtmyND NGut֠v(1U]]..vxn%m@ l74w'@%H$ RUiv5$<$&O[SìQ$?/靂ѕ<: QUZ8*ٟWuKuJ|TDUs V &znoN}3Cs>;/K-7,G"hzϓWմ'J KXJMnwQŪ= sXDGv{I MCo_ |?}*4!g r1cր[(SKPcz ;h-fI=3kg*5\Z L^ v~ Q%!e\wWX$믘2L2TuZ}e2hHΎK`0lɘ [ vgcOI %W|ĒHf` 'KGwYBkPdņJ8s0?L4颖IA*HtPD)p+dODVRdptKQ"(pbZa2̜aBu9ȥ=Ȇ@d$@@0(0(D( :Ŝ)=cŹ 7d(Z863v GV䮡/yU^P?ͅu(U*㍵sS"V3{i>OM)|8&p~b] r<Aa 3sxH߁#Ff *$Q~db jEՙCb-EünGpLjkK[u pΆw9C(|_H p(sc׌h&Fp \Mv%9ot 1nm@!oy[mv$.v_PuA2}#W‰Ն_?ͷ̊fjaR\P!Fr_x(3(- ?Iɞ?_{2Rf} o%9f l'NXptX b=BbqrW,ߑ>hI]%dL3$mF2וMӘcMѻLI erD)cө72vJ ]Lk[XmK=DZFxspdjgpք{UtJUٕ;je׈`/o]I8C|-{>=7 ZqpkdßoìG mɋrvO:2M|%vc;o|6WH]V?bf:KX"s͍ X( c0  ! AB5߫/򊞴{;W# e@:DB)篝'MQvV ?>NԿ4qMzTBk$Ll\T@SPlzz2%QXm/3a9M˪Ԧ yk& >.kD$Y  s]jpʎ*r6: *kbO%X o㒥 @** z1w|_({[`z6a<㾒-l!OfXH Vw2{@h 74{o17Sn#D;g0w" ('`3fĒ'ښdU$U'զB@ i(/"a@#,9*cmi/lfY#@1$kuqZCU1eS8TASuLE54-GЋFXeDs(E ;!Yyk-%h+)h Z r uPX#-~#H1 aDπ@Ts O@.3 PUAp:R1m  i0/@' ^@@BCyÜv3򐦁]ޒAi 4_`TE)Kp_c6.!'6HԁȠ@ԙQ9tY8H+"n2O@J?ĥ_(-r)[ ' #}K߀_WX(OxD5Nq^kU+B)A{;9Ójl^}ݳKG7G"u>Ėl\%{1g #b}!g*'K[3ɫ*ʺH 66ޅ_bB']Dy,Qaz|v34"4s0R)yh4cfWQ_B 8Go+9W'ܰt Ǐǯ6_3yOteeworlds-0.6.2+dfsg/data/audio/hook_loop-02.wv0000644000175000017500000005565412140200333020251 0ustar felixfelixwvpk[QQD,$WWWGHJVIe-Mo? 4 _K-߯]OOW?p^pZUQxZ!ad2RZv*7vR+{z@KOiQj40e=pJ JA5q-ť(#\؅O/l՝!{?,2 B>ICO+aF&. u 4b4u4z[+DF|,mv.b(L 03+6Aama;#nLs(B~jRSʘ "i+K v$%#]<#b 'EpMsϛg[}u"?rc(kNC ⽾T6' 7?zUwf?^{!2=xU]}_* @ͼqY@AOAc=LBze"w-WmkT p UT-֬Yx+s RRm`S|*`6zW({Z'}Y!VۂBQQ`3BQsRW4 5WlP4Ia;jh-QAu^j>8P\P-iN0 bFbI6cVM0n>o@&-nRm#14)ɀ\ rn0`A:t)EGLR pd_S: Zxhpm( f`k#j;𢼠v4ⓉO!5@֭,^7UuGH둀(44P ws eXn@1:`y«BAA " Ddc`O1*8$’HnKO 0Ϡ2s%0EBSHHF80~QibN7eDWp-OEa[ *8.Uzs1:*gAQE 6:P"$%L\x o+lNB8XkpBy n(e=s \7V8O\"=P El97J `C/%Zf-HFX)glV.!I{ī]6g݇L5NWb@-{T|A y(D{E՜g=CP*w1ZCm@>B:SO3465؆_"e 0msQ*RG,"^B XKs4a۵) I3[#xJnEwܔĺKO)5I=|'l>Aƻq0i!7wL ?xEQҎN_?z_'xLDZ7^ Qck߄Y{>ROK } ׅrdχۿoIynR1}[!;N`H^ņ 6-EJpFbk#b$K>lgQtzL^bH=?4q4@x,yr@ Bf֚Pđ@%xf)nU0+7puu/1ɸ.z6rMQ ;ҩ(d̞vUsS?LxJ]e%(zQ| ")Z6ZP(ihrեSNnqE %8GKIeHWL؀8`v Oc0 T2DXP5tt@+[(`/Y2Bqd; [G4}zfmLj]O_ҋ[gU o:,xWTGPPܭ(>\>4>\(Ba-xsqυ\[KmH|"q8F/N`/ӅE~XOaKϓD*;AW pW%*6B8hjW*opLsje3YB2L>SXB1Ө ,8';Qy{@ =Ϩ`Ga8^" 4ԄAM6,ƀu^'Mxbz5Yx+̢~3 u%ptJ 1u`&PEW`1 D 2A-G+{'ryqC?+4q ]'+2fFa9%d\AY]KKW{? sGyՀ7C!V %#@.PX_8&ד i#.J@5 !~ H% 1Ae`+v|p"PcIWqS6ľdNOf˥؆2 s墓s4XӲ(+#!mT$;04(#TX6) 4lcɉ6AqcXAm&3 Gg6p/DYgaT& {EY1Vۧ&#b}cD!n* oU7sΈK> کZ IEEѰU$v-zp?g%9j:zI@{Y1=^2c`6x7 Dख(ŠS,& &i-@a+`#[ a|KcW q}cK #B١<Κ13c&axaYS RrP<=rTv4<~92Zʬt9=ɦӉ3i#QrdO~_qP Lچ)Ov8?80yu?mu~܉w}ApE~djW5y3#rS_ 6ﰊ_D[+[FZe7^2e`!76cM%Xywvde^->`>;Ƒw{r_DR "i8 U(1'?ոѳվg'O>ϵ',1 [3X04u_= qGߚ6GtHI(* /Aׯ t2o"7]p6|Y70LR e1I Hn+W}\Al194`+sU1Ŏ+-P5{!4̞+{9 ls)}.Oͽ*9=M|G97GphFK'HKkMKl:n+25 [J?h$QEoIJNflZkvL7]unu2{{:8$ÔguN 8iI1tY:$w87Y͇ ާ&RdklOQ&DAdjN?53ףᆪwWqs5_>p1AujD? rCH:k5I?=oqobQ"1vK;J,!G—z+ldv.Oeu/f?$u9?5)ؖJ2! .꭬-O1+?.DR¹eaǍ<4bg:LC}1:Ͻ\ΖeϿ~rɗkmjΟ\T[CtB7al8P48Ob±YQHU , Sv|O8 (^S Y.AJ=?6CL` /q;+};R%md!V,Ex  HOՓ{^-N04tuxC / |! phVG3,v4NL5]t=d@j!02&k! (@A$]#"$Zv)6|z_MFXə2J#;͊'z9P܏Z=B?v?uMEo֟bQo9ݣd?vczR|.ľ^DŽ̿K#SV8yNG5JS,_?t 8Jy+"J7As7SKʷr;'@ ~1ڡ-Z [w䐝ߖX]1ܚ6Hbd֥y*€uM\'' ͟tv^\o00Jm#kK~,5\_*жa"e5|:ĻzScW8S28XhV^E[b]$ ?#8?%|ݷAGLR)r?c t*q8{r>V@ Ḽ !%W\ ljk2 6ǂa+Zd6Q,*`"#"}p204 +)d9"sraDx"Y?I"O;@/m,%f+-P*q0 B Ѱ66 Kw'4upZ=Ylȉ0JK_@E+*MDq׌:Ѵ͠Yt7!<.P꼌ZZ+@h1 ?=? `Չ ȩ| *_NWv 6r3^ كB2H@5"ye8(Bx^@@0i1$VJ ?YXorh. D'! Sx62MUFf)1_WwO)/B(®iӢ稃xBa.XO.>c߫mvPtOΤT-[଩^Mۧ Y]B˩lw4Ū#rMǒNҏ="mf1Te8@,# H/r_R/}doP" I tcg6#JZa6)t""G+bւcmAų?d]t+MEѰ %H_/{.7Cno\jo״ ҃>+s籏rAn,.&džȑU8T=pF#`.YT0?3SyfT,+Kvz[&0 b! ?I* :jFmP~Hf֛K?BC{z%L P<(&N:¼6q2oSZC WQVbE)&@ݗbw@ZRِVpO2]X/*u6C] c* d|jږ-MK\t ƗӍj8hzF-0`Jْ+Q P 0D3/3X/^7p{3`Xt``wF,R\\ B8%hR:fX4s@@o*@)Xj6C˖q Bٲa*ׄCgfj ; &c`9beN 1KGeON4jK%!K!(;ȷ^)\)mm-@45+9"S])vHA"!DSwv,E1!`Z,SPr~֫D0N˕&~GRqF@|s"tiC `n+ L۶@mVpj'/Q™Hr.La`:0bG?F v,).|$)B<t9]^m_a=^zj/GdW!1wy%Ped~#V'S8]./etwZNpJoTg`k%DɍiR#UsUw- Ŝ,TvCdg3Eё/cN`/h|,e ôLp->Y4bA*UG u5mpJIWdDzCZ7r:ql~fY'%}ACPʨ讀j ӓN<7EӪi/;i6E'N%>U ļJ(f`$Wltd0a*}YC-o >7boߦL~7^piOft҂^ .Ɵn>D)X BҜ-ME~n{}r(H1j`!5*=% O{{x58Lia㿕}ֿ[p"{{(_g+&wpԹV?),T&5هRxZkq.Xt9Gv4[`԰mϐ$oڱ9QPLHc (ƻeRWQLxc?vDCpoY:`̬tXiȅ D+ "т<,;r(3HYMlibږT u"J.@-pP:Akć:ksL8rn|(:<&<|]w%sh^-5~'aZ& PaPTfUIA}E~y P uM $tTOi{ [?(&RCꮶɴ`um@Y8wa(]<S(dl^Xsx'd#$ 80!zhMzm R`=͑0A&L`&>~ WmT#s/tc $R{1AYKaRx2<[9>*]!b# UKEs@Xqҁ[aH,lƻ2 $R ΘKݔT#5O _a 䨅 ᙀ4qc@B@-xP]#Ein9Լ`Nmjje`y#g1>!$:m#K"AWZBl :B6H(`rTupCWs}Qd"-Y¼MC BN{SC"$pX0% N_U* T-R&wyI@ cb8쀾%q3Oc5rZ~ׇs}0\"9ݮa!t,J ϰ( {h -e 4۬۞ yn;踙YҋuPh:<'T Ðn|.?YZs=:"k/ LMӊ5ڞ9 at (!zVTގ3|s )r}jsGx.dd9h,Y )hOhp,TƏ@\? DD,Ĵ` :F[Xo$cRTWS;Q1%k)v+ga0e5#"LLȸN}0nFij$ %*QrE_:5@&~߅ $6Mˊ!!jx/p3e7^-cy(rd^G$:i*&5cFTs!JP.k=}2.\:O|eY8\ OO>G@Z$ɳi,J]m:G$y嚂օw9&3kH[H`c6#*nJ.5W_SY~ g4rnPt>AkEpz6Z. 8xB9-k5Vz4=s޾rƋa+;[9"bRj4FmmOBoUS~!j5vVd;"`0]5:F_gmWl;ĭϸ gx])LHC+Bk 0xd@:;_ C#/mIS_[11\J>&SӒO#[~_ǮYxS ;c;Rd"qd8a\?ww*>Fk)?+?cCuޭaNC>QeődעV!DP7I:w&;y/S,ľ eMZ +<ؑjG8Fc`μ 7tM!SXXG`K@~߶_i`կ\Ś]?):/A㽦o\oYn|QNέ_Ӿ w&!ddx0q5!^V9= &Ok&Q/b1Xӎi]gCB\ͧ& S@R Va 3ΎXj%, IHQY8N9,E@ g An ]B TZSw@&^ƢA*™\̂DiRt|BB U„L0K:D(56ոIeD p[!x/;Ʌ>3 ,_)CnǗ&4Y 5>MP3jml#~0 B*8^4T`h<&L3{10đ%A4l)I $+ @ņ8 ǝWBH=n4-VWup{} NA9 -!P@Z'og3Lbֲ a"HFfdAJ%ċ}`Uhk:J( Puf33$kxFB l%%02)sډmy N:bC0r'b pBknLhWͅ`tgڇ"XЪϷv CBIӞMl@+V _]Hm\Ov< qsg 6>I]}ҹHwĎRXIXFBD,JJf(?MS\_1z| .Ƿ^TEϼ7H(0BzA/CuY߬-gsekڳ(!dB+Dva} o D-1#hIm=!>ϐك@DxiW%FW 0SFQ)rQ@n5TP3ZXw1 #GK=䈺K_sYy! E QUZOsO}W|P+^Y8 ͡ El?χZuh>~ye;v#@O f O _߫#y%u$pe2 {[$\10JL,o/#2л 3OD>pet5%olpbFɧG/] /a9*,Ti"[&Vyo{=/wy* GB PKE< 3%h& #pl3GT-//8Ӧ))z8n{A= .￐saa=#Hzւkm6E,`J=~k .cF4Sۜ@)~8 f٨VĢ\8̟ԉCLL`b-aBi;ztkgfk ܶQ7H$91?KC|ڠFL@8V4Y (%TΞp.Qs(4e%T&eJQ:hv+k0(07A=Ɩ qdUsj#.DXYA!g}@o1](\S4HD/+@P 8UԡbŨ!SIg)^!39 e(9F8_SP=.pNY!&S@d~ðRc֋8Z{a9[U%/\A>t C/LD#H%pYXV#l7=DXbX\O^&42E#00_Jzp8] k#)8/EU\C1)yzȪp&hґ ,xkPhw#>hDѴqTJV=c.6SE7V 1C@y3A;d(B_2>[(z CNX4{b%(c2=̔ Buq,+ ^Bp]Yc: N ErW|XF#2#=>wnAtFO4$+a|D=T|tu85vdn|7yPVNa` 4aD'4ښ gf9, 2ã@fB}+jw!C8129N-I&RWG3@u4x )rFH9rRm^1&o1la;/w94A0FK) 'QXvCشw+7W4iB T11Ѻ[*Jp˽I:g*!y:?^%n`',A{?TbdNFˆ mGhDg`<`7YMԪ$ *Y# ,P,mrbZq[܂X$9ֲȸ!:Dum• ݘ{*X-G |ySrKBk|[>Tɱz۩ 5\3U4hƧ)rm=8e!Y#)Q 3.22 kB " !(A A $(n< Ƞ)Ή:HhD1Fי 5+@~ !Y?vB o86_ 2R+hϘeqYZ}6?C?˿O.SW;[wyTcWQqs/ԛƇTμky5pp̽s 3:oބ`;CzuOYJ*ܚ<^勉55mX@1rn&_qX}[S7>9#nuv~NWy7{yq]2?tq?&pqJ[sAQ",`Ps4G=i-]:Ct)_ QjYP{od!p [h▏) 7flg1//uEmP$SGvYQw~o:a @{B6M"8"U rgcbL̊nDV xzSaơn6b[`,Wf ER嘃66ɽ?vpC7\./ U7KlP)w,%ẻ4 [V, _dggYR6jp g)rH][1_] $!Ni LɎUѐj^+BQ]Ԯu&|$eZ:07 ֊x6n&ӁsEޠJ^םuFD! 5Z;Wg%`OPQUvxACiKpRuY]⛱]pX b# =Zp7X`taؙ'=­>%0V\5w hHN"%2`z5 +P`^4ȕu]i4a)>Űݍ|K I>H!Cz1QgI=j'6C#ɮ\ `!4At X/-! Գ7` ;na?sts M^Q۴aat#|T"ţzkb|l\6pUl !t;5սx Zi LdG'>[O+S @(CgG}L?UVb3.5nFdj&8^`@Bs#R6iZR͐M|g̽Pv?+߹ywz-T19RMg 9+sEy/ϫMw.1|ʳ)oBa50F~Aq ڷ}_Wu[ԟ?IKFY#Wlv;O>}^/Y=7#ih5?v?Brɔ>R|mz zCT|Tt|||- aZK4| (N-⵮Iq2iG#ƳaZ헎L/b<ȱovy^ ߕAx]],o ;Ƒ82}:\񺺭X[4?gFBwoxV$$ƶ\jDQn (^ɝ ل2k:>/tPSɪFYP0NN1<^ $bi @=AlJ >r /}Hp?b;ml^C)T#g6]yXˑJ~4Gx#p MES:6 ,qF= T>ZV-%!LZX!,˕Rrȡd  ČPXPM9@muBABMW Q=ċ~qyDTI0ܕJ׻d~"{:RX;VX9`/,҇-aF`_'DC25Aehc`)[2ʼnIנXd2#a _L.Vd(5`!Qf8̟3(6D2u݋vh eɖ >k;u'l<9\ 9*?|iqQ QCd=Qc33:[`gc At³@waD H81=1}Aw~hZ'8SiT8d[QZ ء`rI.l3Ȼ.qk@qD`Nk@)2˅R $9ko'8Z`| -L_@% eᾀlmmw@='Å= մTmb,Tm;:gߩ"J~D% yeMNCa4}2 @$  "D ` PkJhaAsC)77k8&Z'pRGu;t׼ƍZd*ۯOlr}#8yVj;L㓇m%s!p|EO7p_ե%ۏszyU܏qS4*s?9ky,T߅]x,_An ;^h6/ pxRݱLQYdvݹQ/D߶N."?Lkn˂ "Z?7&1k2m'y!(9u M0?L=% p.39Q%ͬ OFZPqםlwWom\6=]X':?&AKr+bv8 >o}yw-71kcb0g޿]gbKdv3(Â"? ]*Kh?%"M2hVFɱjwVpHLXL&I#O̧C='% <`n޺:zLN!{bhiSsH^ fxt0(H1 juF@#.=\Y CRlߡiH8@*r׍*f2{b!4^c]^2ɞV},(M4(jXC {1Z11R 9Fq@\S 62ħ50ONmn %Z j$08!psf3&%Red' ]Zb3h ۩^H۫]0Nm[^MRjn#X 0c 9ZK6:0 SEĬC!:|_]bT mg?դ)N&Y`"B[L0Jvq_( ڋYk_ N{ x*J7#73(eR$GZ>D?*.:*9[y?LDtp)(!N}Xqgy =ge!\;+<Πư2Fc ] l*4##yF"GBWr۟J[ZFgse!^o 5uSdxj5ĥ]ź-ߋKP*f>rTL"̗v\71(>^CFTMiQۣS|{ ͢=mOCvE`_kD!aRN$+E8NXR,aZyV3<0c>D0?38޵Iy!Lэ^oٻq>6]̼tU~u,u(5}!E;op)3D @I}%`k[AfhD^|ee%u+j\휸V>:hd"{: :mͬH=F4'Z=ى 7x!8$cH I<],af ϢI'$cxɴMw!Hz(n4h_,UoCySH=~SU%d_q[=rr2( ~LyA0)~h FR}#6*.;0FA9B  :jteeworlds-0.6.2+dfsg/data/audio/hook_noattach-01.wv0000644000175000017500000000566012140200333021070 0ustar felixfelixwvpk M<%M!RIFF02WAVEfmt wdata 2BWWGVHC[D'o^e`!M#n.6.9eUFv&G,MGz×/=z_8Iyɮ4Jnz>{7Rxd? Rd(YesHP**8GNs?iD4#k4o5y[ fkg@l<" \6Kʣ(Dk#ָhzohMkycGWL-^fxؔ Cy^":`pll[SWE ^ 8 1~hڇ-i#`BPhHrZÑQ(B0* ]AfwFx"X(R' R%o W">m SkFHCIH揰*"eH 'D>4L%1Ku 'q FFh C}eJw!)81s$I7JqF@<<9n~(q-aB4AD\ G08]wGe|Hf:Zg!tW u"|rĒL X 䌄2tY$L."yH#tx] ;dF|<$"kQ`BK?{l56 &n晄jkD]H '棧ͤ&V^}jfbzg2Q qkn5iƫS?Ry]T`L$ymͅ0֎SW~NP.~@m u% C+" rR ʑVg! . ѣhiKxe'JZp\|xӥ\ج pr-YzJHLVm@rO'_N5HHqXD[_\ F<mAQz-7d؇gǿ4Po zJGb?bD%6D_ ͒(?0-qv4#d 8T?0_5;2л&~vfCu̦c $*d"~OzGg36]:__Rtb`1s̑VcE21@yAΤ`/tbՃ_HD  ɒ$Q5, E3Ǩ3+M2ypڦ[ _TSӜ{\xS*F0QzhN_Eh)kBF57}xL\~~8HTU/U)eKb$S~-W%NE#(Uk'ISoPuH:HMwq`_1R >] tcˁ c1Ɲz:(v0P鳈_~1ፅA,`]4gP"0ҡo g $U9J,<4y/|EKmX N zUc5y(m(( rR V$ekm41K&4𷽶 5XV/׈ EzGݛi@c8=)3ѳ7kZg= Yנּ3Szgvn=2W$P6[uX>(*:TOS;}&j8/Ɂ-X籶8U$ݙp?Pچwt,c{CISDɓ;xRdHG܍ R~c:dt PFpVĝ@-ae{v9×\- D [:@4 EcM D* S?cPUk 61tظ[,HU$O(Xv0_)<(dqF Ȍ .F(?tH>]J:/{\9:/?jdY1 .9Ԣ|u9n*$LsB BE]c#+<)`2#HУ S qsEr<.:b6C); N wdz+}KTZ֑#P"c SX}bD@}2SdP0G%BX=c133=sxA#ɒc8BAPzfteeworlds-0.6.2+dfsg/data/audio/hook_noattach-02.wv0000644000175000017500000001005012140200333021056 0ustar felixfelixwvpk HHM<%vr!RIFF>WAVEfmt wdata>BWWGVHC[E/ >e`Ct)%" 3?߿%wE s~auc{c?t4=aP 5XHH*90=m#NKg%r4*M0R$ FD*MŘԋEgDcvu_t\Djjh.UF?ts)^STޔq}:9ZvMrg 3 ֖(SNm̏t`Q[{PGU-_=:la5m}v ›)ﲺ `'ּ8;:`:Y ~] B>4]۔MeO{hg/ŹHVh6iB+ƒ&@=Dƌڟ~x篈PrӀt.2šSe]D'ج 8YT7v^b%҄*åy/Oh柧OPw^8HLiET*{Řa);sn(NVbDɓ0(<;ŧ?Ҁ.) vT((vcQġxa  GZ0Nҵ?F9le%\(Ko ²8V7҆&KD8#EOMgbk:(#S}lu,\Tڀ,= *Y@ 8ɳ9k~Y OQ9*;qq7LY=1x`1RAuR :cOB9<2Y.a/qADp22bE`aLHl?Հ2Ȍ0%k@/9ZIvPC&d>"D{A\{\#5 X.LMYp{>. ]''T*@bT)Lj' #V4&cn{|>~b܇dQH<zQ )P #7"&_42GbR4E]Oׄ'dVRr`Jj 'ci)O j$a8TI0jσ|çin h`RYCއhƁEa:l+ (~nQōL\@TJ FrKJ7P$SvWO0f%!K3QT6iEpM/U> 1jt pG'soەs2|MF~"Wblf~Y#G: ZWӒ v | ,+?=R$F,!g @6p!| jėa(,iDx@ bcrHC#T6iB$ OYC.Z nc9O@! ogl"J&A^KD]7t:@@YȆfcj&#,`M?͏xͱGX1z F F.\d!3MPd(d#I3GL $8zH= =j3Q(JlToT)KJd.>Xv1v=9~:GԤbrZMp1\{髡*B{5BwB `+ƯJ&*tu" U- Tl0TXڳa8 ~ BbU_? kԧ 62ۊC7H$?f'&fjK'c<@CF`KĤ"D7YD@Ǚ9C6d bE,d ׹c$$߹'_Fo3F+@"9'[\gEF@ʼn$~%c L G bz-y Z5t~Tst0Q![_np&E.CE *D2N k' $t$sI/vPݍx@(co,Mϭ,5 TP M0K1, b$&~Ł-Z,S Io'-Ygfv+F~b4%?40xkaCb仱 ?I`\f<0-!ța*D3 {ܘ5xx>yeEU 4Fae q y٬ QX_.ŒBqAS.8aqXz-@;#,M%WRZA}cuNҜa ]=4o#9m@e+">g 8# (U"rKڰDw}-`G1nR|C2rF|%䠙DlA$'&idmu|_r1O0&VAI;Y@ lc0@˳鄀# }c蚥h{m`Sb>o<`)2]s ,Ba9*PR嬍 ]8b:3)j -AUչld|6]݃\#$:1R"s}8g}|Az8 3- %gS`>A0Sdsk-jӓN#4̦g7ah:sG I"{d7 8f{5 Qz t94q,hdJ|e!Ƚ鏒)4~q` M T2B)c) Ҙ'ʁwUhB%D3CR.k>a&~M0us'BdspDNdJ*)'r)L:1[qh |Pu.ȚL愩gOb-s{QM@DP& xJ~q?W#U\@G6"`'àb]zTnpIyq:/􁐣 I15CCIU!x>Pv(+Tj# x尜 &bgI7Bc$xgχ,É$=AB A9eo[ *4IyUQ4 ]cQ(Nu_/2RzhX?8PI's@ h%A̢)[<-=(Q{4ˁx t$- $9 Y'ݿY͎feGE@J$<5~dB7s LgM$2]Yx%$#jKtsY%tc֏warqU` K !*VLJ["m5ު%&wJ{ z7gCRuqx2&e kձ5#NcagI4#^=Zy) ֽMC&b:V u9AY gL%NT&ouN1ѫ,<~fo$(:גh8E(FDŻz$Ma8)jp)E-:a`m.h5Fs(N  Y8h !+A?T>mTi8d#E@\Gr5qt&ZkH0  uhS]ef*&sD7dKB3 %A 4HBURXU^`= _!HB(%ϪԬyX8v "iȄJT3@x~0X Jy`:gQ+cF[Ky%"hBCÃmpNaYJG>$( %u1FO[lQCBW/59@; WŊ5a9G(WP tr+4&>K`-ԓ7󅞠mo$4$7 ŔpӉ4g* PrA.'440L˃^ƠOI985Q%Fd ff Sq!dXLH Nbī!J Z I?7"IWDk+iу>Xà*\F^C:Փ^!;L9Sc@2KY vĚȶKbQ͢IV>N![tR'R{|NS<mlKЋ%AHĝN%̀< XBIyj <)T訃BYY<*5,J%dɤ"SNG'3<'5&ζ%(xASB0J>ˑxńbu x f%7 ԏg6$"L k_94: Xjx ?{>`2q+"*!'DzMC`=D}D͡n6J[Ȇ $Jr f`5CQ4 >JEBCqh[tL𛋊8LPF'QFiH@L*V/IlMsN_Xxl9ʍ@HM *;}"A9W"?1F>("= 1 qsdLbF?1!ذg8hR;>FEDVӢ6b)y .鞶@*A !_IG 4?S+MDF?L> cDMVJW-́Ȗ^ ;~'+/No I'9V#QXc^* Ii\X)&I$`I^Yn<=ҀZ@!j"Dp I229Bݖ @g.ͤl vF 'c6d$UCHV G36+fvЀS4%-ƞvFF64[V3?"DP𨁱5bժ2F#FyܒH=oY7?ܔ #>#ֈ3C  vR֥G\P1> AeO@$pqJ]rӂO# H86q@6AdlE'Hxs&G5N$* `Gv:VC4ܰ<)TV4aKsuMCtyl~1"t|kV H6$5! 1'weOj5g DIsyg0L5_hFEj"쎃fĝe^<wQ `xx8?WLOCa[L݁!DTݜgx^s>` WRI6Qz1s[U24hpR %ߖ9$q1{_ "dmBdg ~!%L()Gcز6ޢPQ93&_? @N6H˵}"egp'V+Hb8ݾ P=减_Q>xRYC΋7h6=pD ٷ4bm[*P0cekteeworlds-0.6.2+dfsg/data/audio/music_menu.wv0000644000175000017500000245560012140200333020202 0ustar felixfelixwvpkRhDY$_!RIFFBqDWAVEfmt DdatafDWWGHBWGILJHKMBWG&y)+   jY.4?Mex3 (  #s+>,blF?W}g3bvjB&B( R՜{2;?gflQqK9r&y Yؓ333se  C<Y9s&C7Ѯ"JUz^Ms)Y.X|` ,5x>7Lz$SZ/Z@@N@h';DI66 qovɧ% UzJv!'B)!$7#+KZO״{CW3fDQ:vK>Y]i2b*H3eOf {$S j̦ ac C2U:\" \re)LF<0%MQjrTqXbQw-),-s;?kl=/[XX1ӡ6#,Q (Ql;:v\+~.xah=  T|ih,ͩQ;r#3-jxܘ'T$=co]MnXb:O! i6W&/F3KxLg碭2߉dHЍt 3劉 GSAMU'9lF9hXjsS/zЩ cl/>DVsvt:v)?B;UAsBִ(pi t>~@psP(H!p08NG'H?Opp"NU<@g)^Zj*nJy?EؑN+]QTx[J67Eq%i&#DF k2U-bkῒe4Һ8ye|KdI9YUP%bg2~("~:y!%qwǛ#\z="K*>"\KN"fI7=5FԍJ * w(GlWH,ԘʬI.APV Φ Dc܋ ŷ9YJyc xǤ|' d=1)n>&[6$A6ʘPKdᤔ;ۿ(V) 9dٙrP+٦Tey4@쟔\u,0!KlL>rTb\Ač3g0&0{Dd/"b #OP4Ɖ?${WgxfG>%,EHRP FL6HS_³BZTs/r5,?D:6}$aSY;S@O>"@%IY*]}Y҃踍P1>Yfքem/!5J)aǯɶXxCƥ,5%msгR{XƐ{M&4*SBRVdJϞ'ҥdbT ~)˟eP➋=_O8R(}~>ثCk$Xv,sj;㘗I@)su먜 d<ŨcfiQ]j0}]NI B̔bMӧS[)7h Ϊ\7,/t)HG-O-K=t Z$r(@eV?vбK?/?C.yk.ɚ͍cbCj#O4f!gw=A}HOXقaYal,4f7#ⱅ)9 {pEy u(1Z~bXᎏxQ5d묱xfϒ2"Hφ&m1pw^V(%?Q)X(DqY{"zQCpֆqzCicKib4߱/!]\زtTVkofhwGmjgې+LhH t'o/ ~źp 9#SKY:wYΒ?o̼n+Jb_Zomsب(J+k߭`ˎdS26+1 ܞ8+[pb P~ʑIɁ!dAFǀ>3p,9`<|LQAu@ʳOM0&CDaKLyi5-مpxX%=a.]$MNԞt%"TGiv 7sEe QּWzP7QAQ͚Uo|:G]F˕*󿸡_/5Q߾†xcKtq2ȼ->/ـt=79SUz-x\ĽGT_&!n^& 4bU<,R;_ ElBuN6J-m>o(;86R ~-CqV/=-iV ɿ1ȟd) f9H㟒=)f ^RNeL%4mrBeO?wـjԝW'oRs-=~xv"Ck#!qb,C[>EA"x%y5PaMRvPn|L ܢk. 4WniqP^w)'qmG)zRwr&㪹s/件n~,j =K܉snQ,kJ4۩9\CJ)6RCاޅQgd˒‶y˟UW۱P}~Tr?rAH[]e刯964W\紨Q.A+a̅-之%cOpELQ|l34<ȴ1=¹/y_C1=ܞs/Ԋ C&gۢYy|| 4\h$$^+mιaZ>^+X:&7  °F[jՐ؛fnQTx~)nwB> %TPyqcՕ Ζ zї+ZC=g)qM(w Kp*bsla3}c<4HU5EIj,?5!xJce |`NaO42HL:# fZ@JqHVk4pV{Te!cX!"&7㑽G*g1eK_ݡ g@睗آWYv+mB^kg;~];W>ͷDV?I`5e2_h7?A{h7>]W3F?Q6'ǃ~ty"4`=fԡ̃#!Ma=aeoDp:,t`>P=h'ḙ[g Q3Qdl=N<Դ6Ѷr9kAeMGwPڠZXJFr!UhuH?3`(S25>OM4²#'Mdy#8!퇳dָρQ;]c3vm =*I]{ñPҹ2w+ ,֚߶3* ;1d|obemmiVZ a~џozPbgݍczg74F(f%%|-+rdYu SNK|? k2)W%2ʳ&F!\[ $BF:/>: @˹GLcHBzh*KGcx#o ?h 2@(JBGN9J*Β|b<ʈ1 Ө]&f@실"hr4g;7QNB2s$ZhYrJj=R_ Y[)F6>ſӳq}Ϧv69˞BImkuz.Wk^jk5MZv%mnipipӼb[ 7ZnC;ٔ}zyE_#WPb?6Dj5|ܒ)bq ʫYȅ/F=JR^4 ^=; /r2zy%FV^>Q_ZιKic n=K{Ѳ]ڼ̑^4'/'{Ȯh>R/ͶF FNFѪ#R:LBJgu|O8{.9o$6E3{#J |/3(`Ox#{e]t]kUUhQ֓49ߓjf56[Y2)ѫ\T^ءaĉ)9^ T /zʭj]:fèe.oחx[(q6s6r@`_-7\̻X^/ "E.} U`3lLU6KmS: 5q#QSX^lb"9*; qM Gz) ʑg73bN+?7mFC_S䤡wjKq?Kv9ҲHm,XG[lA~ m,2IKw(h{q=+Fw況H3/RLjR9Z PkYWlGLo+WفK%!Ep|7t?WC"(ӡWn'ـ XvV}b-ܱg㥖䒔ܢ"]VL~ێ3' PcJ:V|MN#+x,+Ti]pT>dd^eX0^!aږCT*8/TLIugC;{ZV@/rY-n2s) R帄G6 C۟,X6EEX]wQI;߁ C~~VdbăH xB*  ,Xs"4WԜ- /OV4`WX=-X. 'חڎV6E֞t6?7~ZVS^ћH;/$횗Q,-։e={QliDɜ[wʂi/DK{%Wt"*Vf _{bi!.@/|+|X%%$z$·$rĤOdL< :|3,yYF0tQ\VyD #d/ifDt5礼d]Aԏc I{Ú<{X'A\cI0Jlj7mGڥ?Nq;IOGeӸ/ ŸYxkGdx\Jr%bZNiL&N5}mqWJ8f szf95IKU싿CK)28 El5'#t2 &&G5TVK=qJ%mBp@vW3aɡ Y?y'=j>"hSktrD쏥j\m\}sjfngnI[ -; ߭SEi[Y^mouމ *5ͩe<|E󖤑X(}iSB.ߧ;k#RAPP9Λ%XC5CGl9S>yD,8l3 I񐜟Ff<[?"Ԭ\]H0Mn@K_E\qQixBB]N _~ʭhO1czB,9[FR_%qςW(z- {̃&"I4S c|5)HvJl VB1Tz>;0OqWY1?ᰎp|w<,@m cZ)z0'^䃤0̘A13RtlfCYkK =ԓx&š#Ȇ+(\'$kqr\@\帉+7SMV+Y*[|cu<$c H"6N~g%qUEsΨ%2J[e~ʊ[| Z:2bɑ++r1*ҙꔆ;bcSJ@$eos"=a!5t<*`&}&& IA;wGOndgYqWbiMPwJq@Vn ,@C4% ͑/8j+I5f?wV mY':azJPͥU嗞O yؕGcz)E\O`M5XfZ=VGjŤ'0z!(c#/8;Ӄ6dIY!y 絃!kyu:skbdW:/&*MJGWB"bZHVMGʩټ-I߁;1JKRZH?-9iXҩ4*d;KzĘ&&ߑ=@a(<~d @=(Oz@.+Bs?;@eUG7dz1ȥ0l;4}opq)O ..εᐪM!C f;KT}l4 ߥ.: W?BkU>jsg,ZG,o}h G7e)@Ht;)™81✆QYe =*yO8bp3JQdFfˁޑ'~JA]`8N;L<(Pq Q,k]=uiϗ~#,(ܘC|PMBO*'= 舉 :ƓugҴS2f3ѲK@K ϵxϱ$WdY?2eqO-39AYqxs$z=bAX*;&NN<+9RSNBx,\tn?{n [&AB {<ʍΞ>Qdg&2դ8?+yjˌe KߓctHJ 9j/{?__%^/_~u_J߯B]/# E_ߛgnu_sC~w>s:>QGouvd~ҊS.z{_-toӹ qKɝwu'<~؝Z[~g7pد8=ЇUΙY/a!6pأUa=ncfh@bƒ=S)Fq nA0Ó#clb;Z6XARtENV}l\c@YlyOQBs N%NR! =?8es<%J93#-/;+(X Y;'G-ɧ5/pk} ܬ\~r#.(_bEQ xJlvclE^ |SԒPc6g)j ؜RBr:R=4xl>&DNIKc=]y0ƾMKP~d _,NPtqaJm4HK+_g!<~t)<-綱l% xQ4[Ou5QB\O?ٞR IA|,oɞ=/Ltm-h1E]ڲ CwXTD=fUIUxJT xbcEts &4ʸE>)y0TVPDh/QQWg)yh8*g(SH~R/Dȹ*#|,$pX NІRВ b4,=DsN(y)SJ(z4Mz99,h^ƱSB?msM/RhJ?w~ى@n1h魎,D!bA5qw% /W4pgŞSp)K^񖶭@AEΧYDCS@A,WK3;mc͎"'M:ɜÇ&뒸:*[r`%] |ZeH#4fSŘ<MoёHzqq#I4g$A=+&â6ekK @tRvnZbv+>2J'>z 5I/+Cn__`A,;`* 7j*x|c2P]6 ~n Fm{/GuѺƠi+H]-!dIZ\>'a-Cw}G\ʹ61E~/rJ)P"=DcoGH86Ygk$*2c.M[;ڸq# z].~U7T,!9lyg]78dCsZxnF,;5?42g_[3΋j`QWZxC- g^x~˚yo&Ve&lU[yD)xOqqh>y6,uMjl5x؎8c䫅@WQoQiue*-캧L[o$w,{.0=MK阵Z3q;6_򍼧oݝ+l&_156,/,!o_Prͽh7?ha؈gv|e#t\L߬vxqފ^k ,BPrVXuq#п}Gcuޚg" +Jc!$=Ҟ# xXvnMjRǺ4#KAG&KrV6 v=-Ӛ=|UqS;*JJQOy1U:fGlvdSS5^|uķ'lLaulYfxod?CĹ(b1썋:\&S#Q+ץ1C("$Qҕg|9&T}C' >J|o2 w`#Y0IU͘n v(9sͣ f,gUnDVjTBos ;Μar%[R8b-7Vb|QI K%x[&ej'ŋ'Da #qw{Ib-kJ}h`jwʣY_F)$%7]ݣd>>ؿo/pU+fKC\(52ܱ0ٮ8Q.H?Z:DPݧZ8G6U=9ReEKAG^q76}hmڵE2nHsGT;پ+|)D!YIڽe\7cru-'>ekAv-͟m vm8J5{mHjV1Bz{ ˅}VmK_ 8D{kTփV\W _T:Q8:Tzb4]^IŸu$gTwmv[y0o}{] Bkix"[}e:\GLдjTݼTg Hf{Ru*_{Hc99<20D('6 Yn'Mck"'1-1⇞˜O{nG)^QjDuɧ~%[/͇ Q:GnYffzK»Sj(^]籠ԨYu`Z.!>ٽo!E6҂v2ԛ;~.ь%ľOd\G3>*)12ES_h(sd"Oz;.5cGc'Б`zϼj(K448;.PzߝvmNQxL RlQuxp2Rm22zyifM ߘr O3)C| oktz6`b;@mȁ=1yyJ"/Oa-Ecv]e;+ǵW@ؗk ^G Jpn/bܻ^#?R3+mQz0_DϿ %'z{$+ ?s@3d'B[r3sZZ%BBy(^%Z]OWLյ2${GYAP5zӥܲ'gcjA?}-9`ǿ ӎY֞Uκp4 2R (ֵrQHơc0|x4yũeљ)/ľXaZ ?zt]^fcu= Lgސm0)-i(2g?Iy 5tX[M,Ey\#f\?M/Yޛr3 D6J. Bd`{}D} a֊~@f5 n­r2°tO{5>FqD?L߫8!xUF@`_Ym 2?Ϣi廓vߚYcY*s`L#*օfIѥ29})B1#DYqmGD[1[zx! !+w4oo8c/s /7-~/| p~?~~|x^}qXSi"@Ah`j??Xpl-y-~G!8xwSq!E|}$5JK[ʔW!I6$3!"I n1<- c<݂" NsJ#UGHG)G> e: ɨ 㹞V ST3'Bk2g)# _Vg)\ !yy*i?F$.G&EÆe |j 5)Ꭸ(l9BUSg_(7;·8cx|O4QI!ΫD_Z6#-/14Hh5rEsi-_LV,e9kmTs{ecѫs3)Y|.bS1 c訴jRMiml^w#< BspTQUS9VŹ:66Vm/gԖyCNdŕh~dW/?VZזCUZg%O +2CB>h<*=֕-G#HGeN@A6wv/8ϒɩdyzg>:^.y˜Wߩe WםFrcGKjA^Qz-KV#/MLrK, R%gm#>މ}an~[&ƊeKFjh~*jeBcVd!buʥShU\{ k:|$&N3(i!/T4"BǰuO^veQђ̨pxQr !Yo{ax_S)tJFIN-& wzW1͋ c4F6' fSzoX.odW߁/̻"8cl(a,u^Nce,ɪkt1K;=zVCm<6HhQRj:U2DWS&?;w d%?64㘊V /k+.y \O9u&]g^LwAQoqH&oޣ/`LtNQe"GK~+㴌eE/<E}pD`uO;cs{>ȟsUb;BMW_gFPL·1<KDqQI0;ZVܠvEg4i% >Wwh3N( ^uC7TXAo?$YWf,(N`ku ZˑK-ruML]~-k`0p6~\XaKkj/O }P.4)Ǟgb':YLZƛ4budӺW)fѲOFEW\q(k>~Uq?G댔g݊؈J"3PSRZ})Ϧ ^"ʗGweST&eFwy`icx/④bɦMC/mp^yF:kZ w+ÔVk⳧Z?\fl"Ne_Z^ TdƄDHi| l͈jVydj6ٜՑ͂c6:2l9[bݼe1N%Rj)BjtgY/א:\?GҎlˤ%F A\).o'&M;ߨ^Ci$A>՝QW܂ 6҂+Mg /yifDx˜7[)Ed*1#T;fg,`S@/HG/UIgAwI541ak~a,# _zqIpFyY50=mZ\/oStd横krGߌqapG;ަ0%Rq9oI4^ٲ61Mj6ꀶWwk/~Ǻy]~'EȮzVWO9SAC=Ns)#Frg˄0]xy9jKNRURPY&?/-a5ea P;R@qNÞSkgS(7MkRyl-ιb8^pѨroJZ/'Wٙ畟+{%[o_߿_Uw%+7?}%ߗߝwwW{7{#?ɕkWo~gg3w ƽ'99a_С| \_:[?#=SOK?4N8U'8~E>xQd_}9O[ApZ;3K@{(Xƒ뼓IeCyd {<ȏ# )o=rX;ۼU&סTʅlJEfj8!9ɖe]?)~ @#pR̚iݭ^^sRa=(5SZz􇯣40Yt!c!e`j@}(s>Iɳ޽ 2W^"ۜmEVYj gj"Zv8Xк%eaXy#k kW Egg ֖.wD $#\]CO.5_Y %wQ-Q~` 'YaMm.;wQ)GΊ6z?>l#EC B)i~l2g'xG1!p HX(ΚR]JPHsQK|QQ/<&ș>E FIkr_hԺ;V̳hagUK0uJFBTS\RT S!Kwru 6N?~?~]j12<7t˥dq(HsU> 0$GO i3/ү$?9d>Yq4CW +-8ńLɳd}ߑ,JtChS7"P FM*۔]o. p6GôG 7Y?%$V}?2`yqæ6G2Eh es+'bgBk[N6v?OlPWXfNRJC2>{E;I7iXJUZB0^Йnv&yv(f#2gDVW?iA+mve9 ؟q*޲L*DwK[p]iaBMK~A pF;/O򊷘к:RnRe᪓KV]$8k#_:7ݲTϹ](s$g_^>kAs_ ,lZXG~VJd*kuA.ڢmsěvzNӒ; *#wCd5r}4]zgSX,q o6K\93^2|ANO)2)o>qVg͞/O g$>$c7pS:J~A`i7b"GOA JJ9:R {v UdƢjhYeG<]RjLȳ"RK 4)[ymPbË+z'?m0Y" k.tJDTEH6 -'T k1=_mGa(|[;| W^.=6|yу49#",'qTi]eOa al Un%I5h ߳.&VT¶c:{B~%}M&ΖD΍1\Kxu`#)y C.h%,MHFFn]ˆHϡ]ԗ0;i l8n1u0.. ,g2r`Ed# d[txwnw /.)bէb'iU,{wTybn_> j%_U[U KHQDr٣S\0.G6L`-\ B +1ӚSTi8Uz~y>6$qU痈l0^lM"Zmߊ& ő0L®(nX/m3[CWw{:WE~rr}#diXP΄ҏKh"f8e#҂*sRuZlϔ\"S 84m!ٌrWO4K}-=3S@u:E~eEf#lЪ_ ZKhMrla|A*95[P+%䛋\&ޢX007igO:ތHi=I@{qްwIt+jn睹~WxA>vO ExS2G%aIÌH ͊#7|,+$-f0nDػ_bL7Re[ ~?Xܟ`vi7|^rMT6gwy*l-q(sZ)gEXZ̀1 WA*"X\{GY:k7I$:J M?3S) OgJ)Adq@Kjb% o^ -et|GSG<ǁyB~ЗpDV.x&;W_YK83rgҔz/[C}h_ 7Q.qc+-ٗci\QY ONgey,?dŝX[9h)HU6b߫E'/w͟Wwo_3w^ }/:k}o_U[/<R>|~"I/XV(~PM0cS> |&:e_?~ݧ#>Nzc?3IDK2~B"I?q%.{ H"?8bXɶE[FƢ}f8 I<{l!z{lgSͲlNn,cHw5̧dyFsNj=y)Ttg{PTrq2W!A9 Ƀ=9 s8emS?,މ崉̝@!te<"r C*y)CB(η`p'S~4([j^#҉b Cmu)0rBBhS2ALðMf 3lh;!xY9DR#E^pW97$c>\`=k@Ip~rj_=l^%*.( ħ GSX0\!*U @a}zC#j gqsPE(>;E-ּ%}&QӐK<6Kn(SE-QuP]%V/gK&]z8OWbT觸 맶)@3MJ>ǥ&;!(w^;,)G1C˜,J`6;yZFH:Y^iSq,)fy;d6>{ߛBiY!2I%sC.nc:p#LEړ ;5cl3k#ͲtuJɱ<%C[nBc LE0HPa ),Xt<$mgi)=s8}pwqp޳x t.~t?!kˆ;WGVXLr}Nz7 81TauՊ#:w=<^) QY30iz/7Kb,0>NmosLb#y~Ɨ''m룮KI1iڐ%9f\†%5"llE".w#O9ӑT2d"Qp[4&ƒ ^rٚ K %=_ļ0/=z,sO{fP S~S<؄ړ(i!y sM srA@4+bB)/N=s:Ӂ,>?qwV4Muer?ᦱx\}$%(4ˬcIChj6u EO:D/ ^1ˈx=UbӉ =Rl=زAgO*#-R|zY [I:ڝaII#< "!)yi)Y`{j Ȱ)yz?-|N1qDn.Ə8#jޠ%p"pk.uI"~E㽊Pa,O@ '0Tc~]йjKDצ Op vyƕ^}dk=5m#: MzWW5sX _38o3) ro/aP1w&ꤡ},73WGPӒa+C87g -<=BAlTf4ʏ4f'AdSZ̻8сe"艆GG2g_Ǐ;4{3d$K)ILb_N!)bҗ)Q&y~&[IV_da5&ۘr%38C(&.=/r,\^z5ٲ윊UC^3wb "-]+X!K2z":^I?,uPBa0yf[yu•\ýQK0bڿVwe]R;*W!W숪j ݏdždBKBPL͇ ƄF (O<dNskh@ qbĆ>DI-\XOEZE01G_ڠ j%mv9 S]xKY_HEaϼe dr}C|)?Q8p;|?Ԇ*fG/TB.hM}iߑtNҰɔ^u5mU⨑;hӬL6:NO)'*[pb@:1 |3F4eL=EU~tpZdtň{9qэFjH`|3E{iՔm83>uIYP~etv4> L3,X -bj^4 q/*Kk*rHҎ\¸]fL-r§z> pg@S;Î lZB/ M 6'%Hcp.!(YxcDc_PB*#;߁f?Lc[OLwvpkfDDY$IW,WWGHBWGILJHKMBWGz| 2    Gi33TJV+Gq᎙q*hka8YVtj8<=doDEs]F+{ E, E%0Ƶ9xJVtZ:3@w푟:e9:5<֝iNph3U>ؒ.~ ^}L _D3#.s:SNcG&6yEIsìˬ#32xX.U<>`@AMԔPa T u(Ѭ@$ J;ȅT0Gcr!lH<4mLJXx^SژswaRw9A PB:NOQF߼@PM9H&_˵XZМϛ6SmF:_U|Gi2xÃ^K]&'t-[ryO֍^ݢO˕NԿzj!g|!Kkdb)'5R fh9\ f4@qrr-aRG8!+q6  dhKS=34v&jd݇_fc\Khf5;!K#͒[ _6lǃ_B)u'>,}*S:M Mt!E:w. DXr X.%iDy__8ؤdj 7Am/EpgApql_(9cZwP H/EA8fM`S %-hb%=UǝIT;4~o~l'w:!%I_jn:31A(NTQVY2S1&iOv)p4[rrQo=H9dϲ(X8\)W!am-( 4j*`C9z;9Pq76 ԩ@WcjcNb suYS\2pdmhgg} bRs+8K %9819qe͸4՟35aqYKMLk[QD`h'v6g,=;7a]r:8at,E*!`lHVy"ƢbtD|yz(scɂ!%HҠye$xl`Zv]) )(G>G"i>w_w#r.ϫ8y^7\"Zu-ve,lK_^&-Ka ?x]nnw BBnך3Go‰ő{2_-yrb./-o),ϒ7=st0P ~2V%Dt'|6lZ6rzZsFXTTԗ\97<ȴ.lYs% ņ2j6PFJ'yY7s'8^D[K[+2iQdJrT5GݎQB?jz[vHVQ~}h4$~M7cMC.EOyNGTp,,rr$d'`wakƺ+6sŮM-ܨIb^E)迣-^dJ'ନ̷S/Z]No ax[ĉSzUq/[a!c@pOplRc7JʒCxM!LO/=F"O񂌥`niQ7)w(_Š#baș:?qIr%MAv.\)X-W>˃SJu9]}tMO]|07G?J@NLj5qGz%ҙ*8υdU3B>Oj,2_81m4 i ЋY`i/h, tL՞ހ~/w# 2IQZz٦4t|?+wNt ҃r-5Bb< ?/ƎK6C{KVQG)_ɑA 1pN{Z@֤[t2Ӓ( 娟xoMlTট炑)ȼsKA+D+Sڤ_R\''S]KFm.t!PYC|cD{U)ة\ǔ5,$u&Ӧ7^Ge{C**I"ǂ%^s MI۷z-KؾҮ>퉁%,3^?b9xgK(^Z96N_6GĘ`֓ƪ5*!vBx6py@(4GS%<$ )%˳\MrıyI|G_RŖ^^ia ~r|u9ez"7вvM޵ m}HK> StLBxU3@z[5NnEz?疨~iyD&H,h^4hKb1pr"+r?yNmi? ?*ȯ_f%&ef+PwZ޹Lj 42Mwp -jxcҍc"c rxz<nQRa'-ŶenCb^ő 7Pe;([WZqlȮ|3Nj)P R,9 "~Ȧ*M؝2 ,oGcӳ1C7ų&k `=WM;aAFGs>aD&kAݠȌ?$_~Pf|TAqO)bkc{ZK]> 7(`iҔ[-Cf+cE%5t]SVx2X-6~_^s|Ӌje>l`8qH_BBU}7Dy~ /cgg!{Cֳ&a*+Gk6E~OuIrtI_KF(45ׄ>Ld ]&u+S:O@^~Xi?ߙp /Nߒ4WQRP`8ůl>kcC|p5R+˔9_W֯:i_NY#z!4s+k [3g- PEUw#~/{ye]c#ӪA9MINa6?2L7=*7i(°_@}'= /_*5`^s\5aa{x`ۚDvH/zӾ~"McG DcXS/}Vk=goc雦C0J(w}i4lεmW-׳ahΩ5GyX6 kU`63\v!9YESZE0/uKT˸7&?$&ץn|VO8)ڶܽz`B4ϩ).!i ?O!k|\-o)EлTT'גU;K.KiM>k3k(ꎊK bwڞ<=35K.A|%4ޏ?[`4}K~t}^c5с7/zG'On-TsqE0'.pdӚ6L*zL` V+g6̷S9*ǣӅ&[ux/HLȗxZJT|:1A$ƾq\pPc{LYh A.oAlndmtuW *pK8_ToЦK Z6CgokE]뾇.rZ??K._sUob+_{Tҭo,X4_]Y+:E=i-ƹ~AԜJy4&r>ն~mҀ`AW6=/Sa.ͶYPZ:$#Ue.nvk >O.2;F1Fܮ۴ŧc32|lFv^ _8O4@,)S;V.ْz; hkNWϲnUy#ȀH?ӟmIj86,Sۅ]fjdZPnӿo9O9sغ6-ٻ Q4rǖR''?gq2H. Ik-[&h?- ѷ$re>{JXZh7_"J֒&zBjAב]\zQP 9u[+HxqtĤm'=53O׵}+W~jtg)UjFԃ P,RŠ$}9$\ynj w\oB_AJB{`Po  5IT負if&OQLyoPZ!$$0`1RU*$8k?Srq'ՔE ɡ% L{Cŷ!q^Ήef@ɜ aLGFKGբ` F%,̄i;0? ?B0cܴL/X`nn͒BEL 1cBC~*B &p/v3,]5{?xiɒr~$sVs3"TPW@BG^7 R0㗝:N-;κzI}v!' ˬ3'*sӴP"Ofj"xY,s>3?dx!8F(X@2 JJ#9%nf. )HeTh8z y09'sA#--o0Gzџ4E ۧ¼7_FnMHɗs q;![YZuNRG;2q!>& =nnꏯX#΅YrhxF2F͎R;KK7Y-{T/./df5ג֗wi7jCHec^ٓZNd3)А2i#HgbWAa2 Lg04ݠ92/b{{e_z,@Y\`:|N-n_ԋ~L=l$ S&̎7D(yHT_w>v&>UL.S 6'F|6 Nx3DiŸ&KO?{ؗvV>)TJ,m[ ~ag(G_F^0 5giCّ ebS4!*{df,߹x\F}n61g8c rY4hqf_UGy%V#- {U6k|}rł23A>mhaKOT1fj>]b=ig?3;=t)a@̱B9~/ܷr)+empd"2\ʔNmHe.'w\HPR"*ɘFչC`>ƿTys!X5* 2 u)}$)|N*R=zdŲDל1{-Eaz ,k<&LfHI<[%<=\ӤY= ~K.6-Et@ƧOyQ2 &gKǾg÷$D0߈ڰ!LJhŌF{ 2$fYSDF|b*uLōNWp4IN/ų0P2$.'{ټK=g9Mƹ3F#XY%uKg*M$XEjֶKI#-GomZK-6YXD&/\>5yӃe$I yH\"gﴒo#%|U坍yIwlwRi@ةΪw4I6}RxsbEا \)s>#\ÏIF4ܿTDsar=dJq_,p}G\e|ƕQKNLY8Ǐ^O ''Yxcbi$/6aO] 1iݸE%"fpxL6x;[|Yr#f#1R,e5fY*+M,SF9>? =kؠ#>^bg<~11[J@h;ڌesFsiztjl)[%S{S4n8%B=P.QRmp$ȴxI1eI6Er_>ܓγL59)ގe)|e<tJIo#!E)q(LF@˾Ke /B=4ofl3ZYh!m( _;2R#|>ǽbl;yurNbޘ>W)/]uu$ϘNV^Hk3wt }@ӝRt̯D~ҍ}T7[wBK^YY{YGK#v8^w.7zi)5fjw}*lv=5t6 ҅RQ0Nݳl̏ 2۩BV;|c[URĢ  .LXWXM2;ᘑ>B'dfx_m5MEii07Ħ + 2&+3]?opas%S}-G$x/R}ݬelړ KgCB=_vUoME(uXϒ/>]K,8hl^4P2}b&*ǝ/)Xݎ$4Y$"Q#ʈybu#͖V!id\4iF?C 鷺h!< s=6hq;6U.'iV6G;{ezfՑ4{ޣd~>,7vkJR -7b1rK[-gCH?ujc+Vױ]-LN~OT-c8$~.nȨGKzT?biG7PNs62gC쑨~G-H"@VS=Y|S_(0~ޞj\},eU3wW~+4M_,!M#Y3wt?oRZMv f;ԥ=# b>s7]j帥!1$;ye6HzU:UL ǰTцH-]&YFEn\zʲM?{06;*DUذ$t8d%Z=5MRy )}/)qu8FEs_ؖx,,FZVۧc .?6Kx4 pQ` 4OSG y2E?z#NRDH~JBbtVu,]?/s"g\-ϗA?wz|G4Ε8;3|~|~N۟_qz+*zp=T)^4aR:>y5Zp,It̋8ss(suF_ g$}{]x?U_D\Hp 0H݂^ AD;O 'ū!0RqV~"@RLx,:{&}%#Yl)"5)t0/pM|lxV0(AzSr7# |bݯjq wYTj)E5W̑o @~Ol5N˫Ncܼ1#c"aT4?vfphbOXLVO)3z& r`Hd<9 5]%RD -Hb!0ZI\Q)ryՔUٴ_sbkrgKD0,יx_hC2fyD/ l4|wJ3P)К!XW4'lDjPihQb6s=Ŧ( 5D?hӡykZ?ohۊ6 ->{ZhAKS(r<)O9FQj97y%W"ߊϢ\U(J4lDM55X/0uSv"=.Cprt%3\鱡gb^kBE|:]RW>do n̘*"x99Cޤd#J );}J}sW KR*heIRܿis Ÿ;%>.sPK7Ecs ᰟ{ zCXwA$/GJI8.nC^Na8 f#Guo1f, pGqn>Hع|v0Ǘ˺ +Vo nt7REShD*&hl_*8^b1ϟ.#x?1"Sʚ,)cpueҦ 6B>2TZQ4UC25ċW?wl@r%Ejبp/ޖi5ɳ9.gMse /ѱ$u>{w;}y .Z8Sv>$48 |c$ ha-݁>%PLFV`i IhI7lpBCEdD<PYD.yAe H& X;~= {/t+Ei3DS-r~,%rrlgrϿiDR&=un&evusY,mng]&_K㻘%#2,|-$˕?:ϝWR'yW|'fW6!5J{Ԍfj4|C#z,=w݉Ubm&r:o Zt\6uCD|cymxGc߿"z9 F)7{_W;ۮw_7Z^mvFLhm`\qD`(e5Ds6#R~b^DSp $A G33" ?Hje(EJxYjfK}Tߑ#,G(GX/N'!Ou䔪T;_{ӏ([ώ`Y0e; ›nSbɨHѼQdNKaВSBEQrϢR q|r@_EKG2sH~D?-Χ8V˔]MG)p¥)C }+!ē: b&̧S$oi3g(!y&$VD)w1$=:&ze" $zLK!49DΨ,dhs?LOl#,HGz Ѕ>9Oy{L+dKK؏j?զ"*ul،9ͦRnT%v.l7{'&Ͻ蟋к3~l [~ݙpqAc$uȸ.G{9L0P)$EoM ]ZލLS煥f oZC{]rpc~䲟o3ÁةLU4tG xxm h>*dN \M[hv>pIQjp*Tf6Yeq/~*7"ުANQ6^eb;tI-!Ѣ0q{SKe0qoDΩwJ\c̹RZ$b\b twS,T!|~ќp'd#̜7yt3$ʓl AVlxVs.`~n8"d}I|(x-oKa+MЧ_NB,Xo/>RlIʅ:}"%oLra)Jb^BάJKLpMDǗƒn!O7ر9qY %ESa A<˅~>2H!*X@c垕|f91@˫*Qşdʼ{L H.:$'%JKM/~vc_j KΥ7Z|ceyE7=#fGۥz*Vՙ ҎPY-G+Sz–XEj=y',WqC9$)D,Ǘ&b6tCՔ u4{Ey#b3K4P ~_TS\=8rѢ !YE,saOkS}9 G{,)uB), {BdW1Ejfo^,pE~̒;"ZZYuLyz-﯒F+K7vi\zHf4ϻ$ {Jy^-1Иd_"V`;\J&sE~T{RN'D;Y$0)^h!t#""4Z=&svAXpfٞU/CZjB"]r]Bҋˑ+ݙSzQgQW@:qW"Ҿ~:z7dL_NL.bfC&c>dslTF,LI~[ڛ=$7?)=> bG6о}0q0VNmj)v( #A%J^B4SFQ_8f4&|/.M̎L}?} C,?F7g'rd]f2~}Ɠ W: z6[= )tϥNadps.-:8 T:l bҐv8DjhzM]2t m=3GPYƇ̚/a%D6%eb$oGn%yTϿnzfɊG*ڹ Ԭ58~s+ X4m=rFUr@%9j6lӁ>Q: kFq="ǯRM\ # ^@UhQEybqY%S`u>_J7ÿ*'mK6}lV;K>ٝ(!|h`uܩg᳔>ſFq P@:Hg|82P?.|ϩgyIzLE+.\$`5/p,ӉqY$V_ Mw4~?{=N{|>_η|9=Ju7&Z<~ٕ cc@uPR bdF! T90]T"(PD /ӂ@z΂_us\-^4QP}7[P*JnHpp_xמIಞBHow7sUOGH$rOB0l8x$XlŹ3CZx>ρ" 2g乂 2'_m1-`{VA4pz}GYI‘^[&|xFgy zujx{ x1Xٻ|OOX5,ZohÓ4 ql:#m(ְ^]ZjE%8Hcd;Y@ y I|yHJh,@'t D\pyqxh),9,g4@<,duw4TZW[`V@EAfĠ|3SCNğ\2#뗱;{>C]KV޿lW<{Y_}/nV WF:"> w-Cڋj9Џ\D,J>i_YsKtqͧOEO ǡ?99sc bcl?bP/K[sʣd`\lP>~:4\Sf;Ia;OL=E5ss{^v+v(}^u6&d^۔87/T֩뼬ZwSd՞jfZG)9,]hWL_]-k܁UΨF^lsKHbLZdUɿ#{#)?! (6)BE7Q`b< "=/ <1 yxj>NlrOKAM|iN LiX<,|HRN;I(+b~OR4X2XXzQ?QON^BO#,)ɍ#?iq#LYXم(.!gSd` ◧!雧"lPȔў2Fw岧K*jf?襛s'i 2D?瓴t.\'gFT;1eF9]NRVO +6?&?)Z~YB}. \^< r?[)K1ΥFZK|YMIPO6F)@5C]9ŸbJs,1>ȣ(c y*~5t !< M;(d cO&*Yip1it.*=]X| {B[[dcդu,h5{ *Xۊ+zc+ Y[ Xևc;ϛXϢ;‚hp Qj&elr G6:% G K,<%H.(cҌr(9RSsHz‰% ˜#|v>$2-Ilħ/!- K0fiX'scې/t-OȥtRLo-Ybv"kcFliU7쐛;Ʀk-јrIQgڜ7Ij#V9L_/(ptfgliu 9dr5΁[ωj R3m̙W6gP{̑KNbhd"4g#*ÐzF^4";/%zzʀ|a]l:Z+N\RrC20GY6Q-p#V42Ҋˊޅcl Q{m^,Owr2FV)E]Y7FBX-ϧ"f/ #ҥYl " >7}4`G"L((=ql0ځB/b XgS;UqjLC畒<='afo_>Drt ɀ`␔.9,2&_dQ y\~i#d&,wbB)TK8SgaCE<OCcVϲt 1Kr'?x q#Pа.*0;S5a6 `KfJ" q;[@ޱ*&qϥE-hx> Ljܨ*|ơO/ }ӆ\$YZ RTz| Xcޏq Y_,rI類]/KY, {h#jOR)8ی }vdb&v~>*BgFiy''@3 j O.pœ#W (p+(!FV rPաU,(fEgW3\ ,Bnk9j)XY:&'ZU#/{sodI ghңbe;z4/돲6ⳳǣ*d5a GǠFI\tF|oxB;*TsB&9AtD/*>=rSP5H OD1mɞT[I_ 3EE"n}‹#yET OW8bT\F,./uJNqy6 "g/y*}XrZ"̆@LtT'yL:A|=;O(tZ%GNSV#AZ2"jq̽EɗLD>X_f"p] q ߎCZ&Kh RH&'62ZyZ($)H#X}o]=J=MљKn3/Ej0Gօ.`E;agh- 77EO."G:G ^,[%qk|daGiQQ??:QuL(V:eᧆ{ȿeb:gZxu-J-$_[8)i@WĐjgYJǂwE̟R)]rpa " {<g4r~uAEpш5\(YZ `16$ܳ|4\IE~9uϺiv,\$T,HL]x^DeKYy_Hvbz0p}>X\!: 8Kw YLDt% #q.Y-x;#u}@HX9jN}'r h h% A<a.g;ܨY_<9L,<D?qzOt&,}, vD1(f6!~Yj?f t|g`RcOo,A p2bK#@v=H3?ˇLKOjR~0 q"hV^|FS3/3pFi$'d@_62 rADrH>죻XPl\^ 2G]S;6f34 ФINRFJen0z vDž'參;zn84|u2Yt=6 v?]gMa+ C$*//dԨyr2֘B|-8QQ3S`I~Y.O<՗[?+1*G:ZMGBfTe =`%z~9?؂BZ[LGt@\-ݣz߱B4g lgݲֺV =|2}N&AL,&GAKKuF4%%ϗ(=@D!aOs:EDgW/-T>eo \qxp'ߟ$<\?EZ@|tR~d >r~$%1joBS6AH2yBrUŜp1H:yDZr1u7(T*_tSv%kM'6o|__V9y iK|vaL,1.zt cPl$A68g'\Aܧf_{==Pa&:#c}A~x[ǁ>Β{9A-BK3p,K#3X?;qi,FW/N3$^h.e؟ރu5`qP"ndIqϲa`vG\b h`+Ӱ>˜$"AU>8%rI>%x.0ۺ=zj ߒr0̼u\xQ#60yb– N9?`2ᐢ  :%&H3IFdž! Q}3ݨlXG9'?)(bNNA7{ >Rj=$w+R1ּ ^B/2 H!! JeXO$#\dMyfꤘ"cGBȜsQ+^*fn6γ #Ӹ*~1:<7_jLK?>w/^|,O8{ fppϫ)(xRCX׿ ;uŒt 됀!(G_j 7R hp t,"P12:Z QEȎI*< F2-DGhI`,mDZtH |tz s 23cLDb12KQK#V36`0 1ET!4Ȉ!p(NZNEёJډ/f&8u jc X:'HwT ghaPbyT.(1!1ia֢ey:R fRզ,}0I !,)Tg4SQ9N9p3֥ 7˝vkX`CGՁy9x|4)H=f2ϱfBL5;a5,B=A~%+s|'[=d+=~74 6Pd(*Rt_2&a}#(u B/|DVKр4_Fĸ;` [{yI0eD\O0aP K8Nc--LwA!9StXN`w R3Z*[j9iz~rۈaX m"ʸn~ȲhrۇehT`@.0 z7%}v`mCsD!Q8с!;Bji]U0Wwn:L**!M}a8 ~n$N7B ,lT:Ŝª\r-X/G W4^Ҥ ]V5y°p}@1jtWϳym<׭ " FL9R5Sb``'2#P$̶XFn}Ы4.')<9+B"؟<$hc0*>u"QeDЯ,dhWMItƍY:"/IO[bIS*ٴ3Ot:q.HO MɊH.=m;۳g-Eʍw9А1zYT3ホ_-7mKLI:4fqʄ5\ZQԿMIR>QNK A,Xc40כfat:l-jFR6M\҂Sw~FD_? | d@ pͅU +[dDLhd¶ >Gְb 2τA_p|-BuZ<|2s@f6k g t$ڦ"CXVI ?`wvpkgXDY$/ tWWGHBWGILJHKMBWG{4/%    r B  d - .x]3}L)3=~- GXݮe3ֳ|Cg LĥsWxth~ul* yJ) >s ]2c]$n5͗ѻ[!-kFDMD3K]J_6_AS`W>1\\>"WvT)/r{!kU`/[N@Qq!ǝ`8ǧYD 9"GzA(Agpo{F5H3I*T-s-\=<&;9r~ Vr[#M\૓b:T!WsS}vC,nveQ! ҉i+=ᥢ[P=B} a%QYJW%%LԋH*D&Xdq\RH XRp3 &pXU92#KК c0#3OMq(Z >ryz0 jBb'Bx?xhw>cHaA ce?1 :iBF8 9H(?/ƾ}mkϳKn|̟*;y?}/aF#ݒL6W H?{ɅE=wyjLi=Ԛ)ds2c©c_h}@. 1`'Oq1j][M/ A(s SB$ q_gоp7 ԄTj c^3;d)}Rbdz?RjIú| [7{ZwsrkMY4ucJхWac23͇$TNCs m 艝>2l?QLLƆ2ė9FGn 23Gg]W&R3#ti@_%B?a)K2.6?RdM hɾG%8a03ۘ#  ]'yE6taaAoPĕW|7+y ]jY$O!2'9p~9(:?aRL_CM;ìl Ո-UtPT `R^-"y%b|˿M5|9I j_k7 U#΂ ` ^nR98@/˽?4$V<*=њyW[:-/?BGΈxZtM:k|P:2LdV ,IgIo `ug7Q^ mbM̯ep<&wu4~\GF 8{%A3_׈YtyО>ofК'W_,={N&B:926L9%J Z MǤ#vqBO2uɵS]/q%3!+'x1]tY1a.kF˒_E9Yye9#; 3P#LmdxzeBI x`>rPggWY"|b' Ͳ !G'<1N*"?>rY ;9QFTBUhtO(=өϗSĪhXws]̀}6.qÛ׺qb&>?e>7,]/JJi\>ސA3ޝ-?(.>-3i]v37tܤD;ã1GbcSxZ Hm"nas)%|&9 qh8;rϗS9sU-gD5=2#Ng\x ; TSX:}uiF W=f©ӠIpXNˆJIGP]G Ul@LХV`k>^@oKvbdNP"*vhG-A Ct+0dőT)W5 Í@(\$4wqJvA)H$0@#pN}8Kc\g3+0U3?\ZB^JmXQSєMOC LCZ94 Qa"&wȤkI,|44գf!{ʼ*IbF ǐIe%q Ʊ >/>r}\izbP 8n|>ݏJ,l4^^tȳCvW˅[2}At4bYEHJ2,~ ލ|Cz4Ov#{<~8܊u29sQ 5:>QlikBk^fbj q^U' Ю<[cS"7(v,X.Ǖ<)/mfڠ0GpFq98/חɄΡ$986ˈ_skFIt`}S@Sي[Ío`LѠudijĐsxE6Tx0+ CZs%f:=`h0 K]/ңd) 8)9Dk]P>oM.RQYq Jѐ鞝~;c6 ]d܉;)\ЯJ~0[K8hbOyjXl._ޞ|cI0zHn"R׊PphP ]5΢0b; X>.|E胾y+dop}Jkj۞6Fyˏ[A>/ TXbdBj/+<hT!;W1ȟC/Sctj9/.pw#R>怌<׋ҙN+=ϹK=> oJV`Hc{4Y4w!5Fg.h)/a ԙɯU`]頲K!|m^dP 8k0\!tnF%F!ed˳l0 ښ3>5?Fs ;C@' p:qsyoI1#פ `҅ l=}ot#婥A@̿ g̈o+PW4B6KW@j<=<*$Džϑ90': }TS mh*#˅MӅp xҋ?i*c'vQaS}c#`6Э"w9ŊO(0 ]OG9XOrwIWȻv/m.r =$7 $/L iZ>ȗߩD (^R8 Ks\1W\10|L-,Oe8|xh~ :LC+2@h0`L ,wڴ0q-wJl,]c2zLQɂ{8G.l}CbzV?A &̨7 f'(p_%YH11:Y`J=Fϖݗ'B.Xlk/kKV4A^EI0dMZb]z-%숖%'Cuw͗Bx8R> 9! k8"8aGsf[ k`6f-h/eXmK~wsU" Ya?=;ɿ3Jg}=CSԞ;{ U,vV9tCO?_:>t+2! Q+"tFjR4G>GuG6A`ct-~/wi AduwT|R i+js%M0=Q[Cg>1 YP 8%NQy=%Ao\xV9$J>%FZ4s @3$8}G|#VrC0„C= ELE>AX0>:o`Uمe>IOkA1- pSglb-MIT]}F)Dd ߅ay]zK7M&:yG`kc`حRE,K!lͮ?7%̂c>SDAjqYJckԇ}B:&C*QYK7f:=:͵NS |cwC_sVW 4{MaZ0\BoL<IW—bڣ?#Ǩ<(qTMdE2#b ̹o5% i,G-ЃvX# Ey1c62U Y" @*';>ydJW9(H!ԍf_]t/3OVR/~Xqj5o^?v8ȟB+lˇX\`!IL(LV'""I95-9K6؊V/%5[/,EE G>7l.|{7{p?y?~W?|}s7y5⼌+Q|K?GX(t.p>[㯳_O'C̼EÁEXT2qH:ލk̈́~ A3оٳk\W'V!)hM^MW1ŪvW_?[s۰^ozox>dP(+_?=A'[e,?"7&SgԄ+'t9-9'f=u8l:YˀyૌfǸ`1G*Ն K*7Aub#LW9zT\DpQ ta95ObjBd$``|> "h? FKA!(Vsf j(ϸ $cE9UaS_Ѱ:Z FOQj':$R /+oPHCjsso>#9Zc=:700NZ2)APS-E 5 I`G~f< ]oGqLD ;p R50&lJ]T#+9})m>K 3j =t(R]uGO}tCve!HEc%fBbC,p˩ ^-QD d z ~t%~7[s7O_řD1_ôaa6#PW/gm!{#XS>hbuQ44@? u)":AQWͮh ߑ02pZ)/=b_B%6}2>2kGOYZ4jAf7Dp/ZmB3V&k8|\KJsvDDENv!fuG|qHS'e<{4l@I)GfM:- #R:ODžfđ8b)Ycf#%,E kySJdtg)l-qL-r*zE٘&0>Z05kP̬ީIG}ܒA8&(#tSy(Q Aا(~N5 Fo v`M4Cu&1HdA.Od*vA1ǯ3f9\~ChJ\ƲYsˤآim' sgôrWIW¯(5Ǝnpu{{>e~ݎJZzhx- h/r#:# H!K&lHsl'YEIU6+_"`qA(JX^F tS1\Mz :%Ai=!dI C{2}&GТ&tx1'a~S(%$7@7.N%oygxZ6?J#%m0QLu/=,͔a.X S{*4`?>3y6ERQ_|>c?/*%=SU3h#2n%C Gk~N鎎:O`'~Ҟi"b_sOi}b2gsQeJFGMc! F4 62xNOcz ŋ\ӗ{RPcIra{*aќot?+ta~=,^ q|$ ܇#yhjg *P`QY&QYF ~_O= R%j&mqz?Y.W~}*Kc%^hVat JEG ._XȎ0t9]G)#`T Jͦ.|Ɵ+Y̳d }S)1]V>4>TO;ljNT RuACo~zqZG"ֱK9PE>k_JmQޗ@GSGGu14! ml*OǦYw~YoˉERNb) A(BG3qT ?qQG Fʼnfi6n}Ɵq~|} 9@8[V gM$T4R"k*UL q[M l*OӖ7 fcvN~`^xjHK9ca~a4,>/~ vP‘ssD1l$s6`1VmY^Mw ~ 5=OɘþL b2; Ͽ4cXj#08+8\a2pе)B /^Z,2N0WY`hʟ2z+?|ǣ܎imvm bXbyE^Kw0, eSFxوKav~@ WK`2E_ 1e0(V&#jqH1(I,]1,NfpzYS}l<\k9LR%tNTz}k(InGRGc?Ss5,dT.KhōR;>n4(KSSzinFB31(Ny92#f& 1z^$x!){y^4IHZ$ׂ#Dإ\I9Ȕ\ȳJ3ZǼ|~\SR˽O8+^[~Z]}zD+~۴:w߬/lYX+â%t$zZEa)`OKB 8نt{()E?KKPٙ>6t 1^SƟLɲG\$M?,CM#cSX}\͛%;,Jaog. 'LKܗĈssA')cOc:X˟EP6uGr䔐x\hzbSH2u|DMtCKgbxwB#<ā4Db܃8Т,!=R:"(nJS5'Bq8)bBXK'h (O|aG;^IT".Aao񑴴 Z\/-`}\7y//r72 Ro2)C]>)4 *pS^X#s!HxcX%]XÊȏY%tѦNHXZĥ拨XAبCʲ;븑)~Y8ٟ򈐱,UQ1 B1`9M3hG6!ߩŰE@{LiB@DR3黗Jˎ}yC^DŽ'?%JYNٷT"#b;Qyo[N^Uܺ=&%sѼ̫ Ϧesa)} yE顛K '7k}XێʃF*q |%t񎊔;쒑P ~! l$, HH#Y|&v6 fgE]N_`89'h?GS)h1q970ŗrY=‹(;:2rI8XR?=d>.EZr|Bԅ)L럯O}?-q.׫dIFܻ r/waQ^œ1qTbdB(=<< U0 #,As9]X, PLbd@f]uc\=K0S?xrO73O3<R6ylV| ՟<1䓧W}WHC>y뎃!%2 H7'Ea~sw#`S*̖ixWx{"L[EUb~~h80t)Dǚi?xOi1hW0#oF·T*$#t>ϿHMe}c-L̊W3zb}jCGB{, 藍ò.:Y-5wf-! ڍ})b}CH/o Vb[|z>}֞Mm`1y!zm: >A󡫀ӤY`}5r0R oNVs>>CbŃ/$DZAG"=IʷX֤5q$ >mBdT0 X>!?}.ِSߒX^OfZb`f&7[ )oxӐ H0|;3oTȃ ^^BɯISU^oہ+HW 6kqhm9p3*7 P<4@Hz5HyĠ1^&!.{ oltiK2eUҳ;^[͐uKWLD,[7!^/%ڮ:,sEωN"YXQqZaI8=u\엫sf"4sGExHI-'P;h䠃L4U0Ko+`"ŅIo2JeKgPo>R~$oiv߽lDgz"U&1|K;Xsܔ + W}hlYDU#UN Z@!җJ; z~a~&c?#EH &&Q:Kwby $ ;m`j 9b6&ڧfEUņnnFz pj ,"br~oFw+qfA0r/I J=k ^Qu/-ukbI܋h'b_%ŋ?Q!1=\ˢ."`qc_ =cE4cvdY%ĚnSyfKh#qHJQHYt֥4jGigtAuL]5yΦoOо+~tJ|\SR@̄x { <ái"Bv|+7s]Jz^8KUm`;TH\wa*RcI=#70XsU?#n蠹uPhM~5S2UiDq\*>Zshϟ(TSO>ȍ$x0G:(ʵFhzܻ+ߠ*(d`i!{E{M~K h;[(в m Rz#QO=@r㝲 {?R\? ?<<錰W_O_/_'mtM`׏WO瑏 ~O>K磰$`4؈=!0.sg:O=@J^pLmX9̆S7hVa?rE 1"C3PU-PW3`.oW ٙ# աDsޭ?fcZ@Mz'; \̎H AwMLh߂ # MVU :橎gh9ڏP\ <!q V[51ӥ}EP # "e0T_K#*@XYcw@m(i8ZGt\Is@9z#+' 0`u( K'y U9 >^-Ĝʩa/X tA͂^w*U<z.,i~XP whȠBHQˑc)ѥK?ԎEN%EAʎy\8+ gZ漏X 뼂{fqϚ},(c,φQl§6(AM7Y)l HT$PO;`1LVG>+QO>֗=+Q`k .3-0J񗜸uֈbȣ}CmQl@Y*#p%C4;Xp0rx(~9tة.")'VN })hH7<8>34ǣ$d=eI͋;{4=lpYRNKm{kGq_jCKŖ~Բ .JXR_]7+t%xlKεfZ>s&e]8Y|j.~9 \Z`^?tWUHD`$~g #1 {M$W;r?M" HLvżNƸM9K'y?K'么ni U6Lu'i\1UK`@;C%'a% Hi.snϧC*v|gs:mB'#r}!|6vZ='bHɾ:86Ӳ_NXRszs'_[|hm52[FojMq:^} 5+neXdk v6_,Uvi<&|iX#O*@hblE|E 3}DʜDŽlY#ӞL >q9k嬝k؈t^J1LpJ49MDU*jRBb|y=ĦEb`ƀWs9"т 鬽-Y⯞N%6sOb\֫+D3M ӉwJw˿%eˑIHBT?; N0a|*9?@2ϐn&GDb bFOIcqWP\>\JHItHl~1BDu^rP [?^&WߧtG y4\n+q;- %D\ *: =$QԱi}/)Ғ2gah~II 8Ҍd=B6'?Uɘǟ7<S8F &#g ޤGa 㒗_OAc TAH GR|sĉ|$rreV\j׏9T p1,+Xj 'MHp# (y? >6gso> ̠@0ͷȧxg?-;bme{T B]= yd;{,3OX$X)bEIcs})>f"RXٌVh t׃mbQbPǧ%s Sߟ!A&?%MfsL O”DYDS},O3KLONTMɗ. XNMQP#>*NSt/.,M|!JSE97PޜMOSlmh%%iŬ~?y ~y:'!XuDX7y2=[ -1nKqXu| ADE7 %!bA?& p#r?&z,skg{N%g>1 4h,G,ym)Df"MGv7P#+_V1cTJ8ԢL$^t`ʒ J4il;dnG_bllծdbN0Aw9\䕔[JQ=s}#m^u1=#"C%w{0QRSX(M1y%lW~ZڂǮVLO(⒲>ύ3>"ntRY_gea%.ԍwb<$svSO)ʱ %O{ڇQW/Q(v nKl_ӯiץ9Gu ?W`,7N&n }J1u [:"GMj3Y'MUY|%<Ÿ+&#^1?k?9#L eS-kZ~%F`8qKg+ӪyŹ(H|Oߎo"樿rs)A'QZ[,d1wA[%Z"H`):WJg_a-O 29]5rVɊ[3{G1Fū|v~4PayD{gY|^ON&TCUjd9t8u-c K,gĂl 8t3d%}Y\G /~BwVckqcW80E)5x'!1&:37\g_Dr(R,-TS{{є o#Q-^jgiK͞βSIJXB^U1++svTHmN+;"DX4oMgNR4rGJ[eݙƫz ^+GyLanBUX1 m4G P^&PJl}Z†#!sYs\ !E u 92'0%CZENӢaK}Bt9?_2|#`Y.{Uْ*Y 3w"D~|gc0qUJ0łRɀ9vp!7bM2'L%7FE6,)dby{$ ĐsY=?/؍yT݈-ml#ߓ>em`E5vE5b¢`&JCZI͛Ւȗ,-xAok2|Q^MZj%+e'irOKYWޔ~#s=Qbz!E~ħ"NYdVGI$ |RrO$S[O {3=N{*,L sn ʧpfDg!pE(<ϣj*C*W*AO/RgΈ@"88-%1y ο2r!{b^B͜uT7lk"7ٰ|/×e_]DSZ<ʨMxfU盾ZNEצzGw-p$Y6plV$sGPҖNO !*4Bz}eQv?S: t3HQE{ f*K]4c2 p PLJ~$" 2RaNGf,u@~C%?"x"LHr3ȓM^G2ώ$_.!?EC>Y+2p緉)_x:**ڄc0VxC4/tu'UŷlZ}z_Z6޺i)Uf$R=;jij+ZkYFe5 ȑO2}zǐEH4H}zy珚c"7eVԸ;wcmW;[O~]}.{bM V9zr `}<~G2w)p 0J}?6绂O_ZA` Cںi$DJFiAwwBZa%DG$n5qIqW[*f8$ jY<ԏD?(bS)ŤcvԒ#jqj>4;_Ou?VL+cV<>s?HTS?r&)0^hA( JPJY` :ǣ+Pf,=Aǯw0bFF\dB*RWl觨]Xџ,>4 f#W>JƮh7mwKi%&"H*A()қ0ySۼ E|5}.[ۄs4-5{0ڴ@Qb?^Kȕhs/Kϖt(HDް/ %r< ӯ?ei&WK剣VSSLJH]Xfܩ3{5a%[))PGO;olO}+n"m0IB["ߕى%{J2X }f3̔p5fh7nG5,RqܱFi#@}QLmW:7LVH[r#PϽMLIJ?{JɃǃu;DÕ%z=lM8z&#{إ& xދu9e|^9>X8Q]s,To0;^s=!!ʲFy73N"m@R3{Â!o0BN6B"s_gs`ݮ-#~qX\zD+Ab=x58t1-\~oBoahO$X[Tmaxw"Ǹ0;@K@yI~MXl'uu, ṃ\&l~z tX[8~V}!Vk\ !MYn8qb"(ݷKnu!pCuNw~iA/f׼eiv7>.u6]̜~Ky[& ;Ҫ"OKGņ3gĦĮp`Zxj_*x[g< ,yg!r +8GȆQ#=x?> 5d?k1qV;͔ dyG)SG9~FVCR7kk?_B fIFŌ[`U17$/>\e y| {6*.Z$C *!䫵%"&=_׀]{я4pCN ĀwB8쒡]~:זWCrJxҗL㵉 ;I9X$F8v'6i1ʍi zQ _FFh˷2p2ϙj#KsnK3rHrW$zҕ ͥcɳeG$gqD<77:OCO) <(h]쩋n5~qw4 *!ao-}hsTFWA '׻ :Dm742D3t,5L5Q_:ߖ `Mt# OPOxlBNw_nZ5|1ݬ7f;7qc2Idn5Zlp0ݚanנUz#$ij-5_?ύgc&F@}\d9/A?6g5ߘ&ǿT2kk Pnq:vh_uM)M*Dgav"R-|&d^s-Nڏ76acS2?Cc@5(ZnU n*Q*sr!# ى l=뇛0 (X7l=?YVv*ߐxdF?!ѧzOs~#gЬ >6폽%y{Ԭiofh'LX_t1yy}; A&C- zvctʙ^#ұy&ZchOf< \#Jڡ~ԼфhoCr;Rȩ./۫a׶"ڼP/5a?[=Cm[BJv]d~5PZ@A;>5c&zu]LmMl̮?:~Ĩz9b2~gN:Rv$ri<\ ]-wF!?]w@.XMaQtSWUX2羶!+܂>[X>0E9]r+`ka:?ޞ~9`#)IghXDwϚف$,dnAIPsUY_!y=al >rW>>(MnͱTUiW^5)dḳa"HJv;jE[- ~#{\+Kc/tEUj5yhv#5)ZHBH֗2_fgPO=:4%gCԭ-wޛZ%c$ qM~()?tK=_uQc%pC(R΂ǀ!Lp&KG4Iʪ3jV_՗A[߆&Ó XӘL'ee)m=ݿR|d*=|+wvpkeDY$гnWWGHBWGILJHKMBWGbs l_ g 7  E"2&>]I4p0=N}?3ИD~>;7&YO(?,xJ1 Y2Qe 8\eM3̓U#UK.33j?B5(ίwLW/;X"_m'7Pޖo#6,o:"X% ]ffT휰\Xwc%{ Q9|vo< vk@#H3 O6'8ٱ ϟX#_8u8~}J^\ҽiEU?o~{{At/y_į[t%zv7w##8 0“pr'~~9#8 A`{H<4%Al(eRP0b+ȴq @ ,r)%E9.2lقnv "̇Ŭ-H b0յ7XKܑfR<ɇ0kk!ڠ"sc>%(3)i#1h'bМ ^ C6Gxm_2N8F]]{Uq|вO ->"n7=wW6 )枍xIK3s:/ۄ[,c- {e!ɐ/n",3{G# ,PQ'0ݞ?[3Oq ^ ~s[^30λ4]x* RM:QIv4zSyIźV nV+y*=bA1}>˭6{=+ .דMp#yE4"Ls%ȯPl:7D;1DvxfN8YcWSRM kZ²6ٕ|E3B93g6'[/dKA'#kS*i\R/j.VoB{՟7mNV-k\S/7#{9eM0X7 ߹Ci_ɪ|aBe3Thy"re}r!ß:Q=v`;iBGZy4f~rlIa,į D=*Xdfd&g0uŰ5;'ls58ꝷ ٯpk2Y-A.Qo6-t +w^0 n, ,CmױQ&WbPWϒaTRF9G %K!ONa>874YAB3 sKXbg@T_I:S=; !aO*T+*|!w88?kLti-殼৞eD 'Ac!#uZ:w]ScA-z0.N'-}ԣ'F fX?r#:P1!lS~1` #a.M`WlOqG>O b8iQzu +UL. UaLE2/3ѮxXloWQ \ xp|ct|JF8VU=֏2Z:/#.;Cc` \b gFnaݫrKDcK0ۘԽ{vI yee =<=N3cD)/FU_5h$<kpq`ϴre\7mA1g 8^JQ*0x9^?+9 } B3B?Gԧ1_r\|r@Qf.K'U Dٗxv*/L7At/ĦM!$]Tp_ҟ1S tniک+g}73^Xɋ,֥<AY($ڌ>eՈx" U6A/ۘX'O2ԃF5:Q*F#x_{ޯoz{ۦ}-;!1'? 7*0CW'IǽCߦ?)&wiT${!~>uqh6]cx]~0Mݫ/O8!q )A }LӋ.:p"wMC뢵};^[-<ؒaQbT}L9IY rt>gë7n-Tt4'~+.~YAILh۾/u5̵zWڹ HKL<:x[fX `ikA6=ޥl ^i::WBkȷP|^t@G;ť=sE+l_$5`wqoC^<7&+QCd렳Shk]Ms"GGvG>K!˜bM* .k z|Mjzؙ֙f731\u&l|"nɓ\7C`q2Opg7`XcBMTC@Ok0>Y,?:mSH8$Om GFtSr C*%Fd1 4ĿNΟ}g=oB{>Mټ&yMy/w_׉?zu:!9&7GOn3渷2/4~pSPCs&Cd m|?o; ')Mak \hq1/) ,\`BS,f~GIM}x`P7~eM@# XIj~{7~1O^o&ř2_aʙ#^6xWcfS Hni""y؟'rxGy4w6wJP0M6xKCl!۬bq&f7Jtve@ojfJg{ka_t^lAy4Y 'kZ#ٰ1)XNKY|Hy)QNoFzT_d_؉lXcH XId Gfb1".J$9`RQ% a,S K+-hl30t'%4Io(s_Ҕ^keɱoB~r st 9^ƿ[Ț,> fM&ʁBc'B,S +dã{&=! 2O'`HA~X(2K a38O?` LLJl Prӕ3K/I (% ƞñq^]VsJO sb)[g[ߔ)Cf&UMI c}%yn@*k=6|@Ӯ ֔g-g=o`$t ߳fH-HtP<1|!![GȜ_"Y#TF'B%G+Q3u˂WlLw_ K9)oX|鎰K`@OC=χ !D&"% $x1a˝;z-'jهg, QQ՛?W|$咞jzC9tMxkk8s1·Iiӗ,S$eI^`]#|䳎~3VbLn.rت&n֦D3$̅ߵw&m|i͐ZHshdf;]``@;) U8#Tlr&VUANxqP\`ayyzU$C(ʷWhlXGnzAzrtFz]P ߳"I#0t˾ Xgb~~Z:;eP|c^Z&)o FG [-v3uPׁ1z4Ǫ7i]j ԗIs, *%?6tGWMl g]Xũ/FN!XmFTbD1'^6'[?1-N|c7k]C^|/tfh塠Hej~sCw3=#ǖ+vV̥4[uf Wp+H/g/yBB0( Dr^mO^@0sW suX1Oo2N<1Zt%\+*^d1\l( #8H]$ʆ,- ;Ofq=}#dnӁG|0{(U} ORl~qOX;PGr56-w`>'EB@ k&[p]Q_/vYo66VF8EA?,mMSC^$B)1WA_M vt7m />sAXks~uZz=K`w$HbvQ}`5zwC\kpK)b T珶zG6_}5D<9NFLܬ|`>tB!iiSrYū8;[0ߢs!2z2]Q_cU'LsX3s(1+mP OTZ@jba79g+bH<6&<^R[g^WhC?@ TYPk_ьj>#qE/m #|U<2VݡKpBѐ`}8=Rݰ(]XVGX$Vńs}+}1"U9 ?k58N&Y3+&tWȉEv2,F, uAŤ1iKzB^Ǘhm Qڦ'4K9ɮ@ϳ&¤ 5Gb:h*ړ e|dsB ¿b\jl5A.IHȼ_7paU\a>ODIK Pzrcl[j۔o+MT Ҕ=özI)jp#22d/f~-+yBWCf65;y~w/*֢_ {VS|3׶?}m̓H6Nӄ>6l_K74sjg~pī'H^ fAnjUy 4~*P4н~W;RmkumMtC{\IأX|h~L/4fx_^_Yo/kK4Piku:5?FӾ'ym{4KǭҳzJ|}S4eJ^E// bΟGln6>*C^=!+߅^ʥiM 2"T'$M^1f-cJZCk͝;<&?%E_}K~$LKwtP`"kAi"LJSxHBj" 20wŋuA=^Ji%itKKi6\l ?AV[\.3 3#}D8PߒiV16_o q=݆(=4A}0FĭzhETZ/%}KSЏhlTua>{/āڿ pf]43|#VV kb홱p}}4iv8s?[..>?`ۃՂt0$b:HH־A[{.}J~y1h|1; d%鴫NM%O[p_4A mg8 :bV+?90:虘C!DsE﨨u4HeE9iv`Ti7lfl˓ џA7:jcqApCʈHOZ\" LFU b/0 ?pt NFޯX3=EZpYa1W[C9D0Ɵ,+c`u)y/ћ.S*{Z\M}X"Q.BsR`ySXG2cx|cnjR%>km|vy*Ѷ)6LiK @ Y cח.6~Ѿx ' /sG$8X12h!@]&,R%vHK^ u2ߟx9D^-A 3̙eL_E&2cOK !q tSъ͘2Q=c ?V4a[5|i,ז<?嬸-DYE+' goYsC~y9q.HGR8ڇ1:0<<5?7|󞀦[slHʝEt2A^b)UNO.$A#d^ky<ɸ R;B K` x~lvbϋ52 Ww j6~Z/UZaZj,z߿66Ɩpa>? _{AUY2GB|SiT !F.ݗΥd ~xvH+?F*~ɦ1CCĹO|п\H; e&{ct- cֱVs!mf+wh\wžSmka9k K:.h/LU4%)SZ#'MҠB, *} CKo<鲍 s Sv7dIQZ%V컯 [/d*4?I=|k'җK|7{V &sHE [Vh%CDi40uYR&wbncnz]*٥yC/=J[Tc裊0\]JLroU ~"kV+(jfD8Mָ[p4g,XǺxZǭ`oDsgs|8oWbu4zkjx2:14$֕Os|>[hAW0FF# wo` ".:7Tl^A/9xa/fE(A&YJ QVS2Fa9+|+^}R^>8OBW[5/Ֆfה<{ʗD؍>˟yY#U37쥧S ǂ qȒ%hZ/ZNQHgKo4F?ؽ3Q U tgLo!! W 4_˰СM5R;H.uV7b)[Mm\= ^k@RqK]5 >.B88< *)_ˆ;m*FȓsWivv#+fG{2ޡ^[ϙb,v &|-lLwݱ̼G3@ڲ3?xp诏BFэDoG BȁʌXkR_ONvxE0 6ΰ.2*2L(~13:jny|c i+u;xV#6?)+J΋k AR(tȇb\T_{N|PA8/HJ >[ VmɛYF&ٺScXL|xH1LhSi.3T%(}`_NKsB;PI+NqawL nC@WK,~-RzCRI"%mT6C ]2>}YY@ha /2OG>QLkUJib6qyIq$xڞҭ72PAuoO:xL2[k#S|i5f> i /s]"?cXa'r=ieod7O :S֨13"@%\ل' q4G ?j i8ZI5Dz"j;*G> MYȳz">hzq@>y`jb;j*{";GM<&& c{MIʚ7bI\xZG4Z>1x,>F9kOC4 06KX {"&&ehf.:8@s<azC+C{;Ua %aN駔O8B_VRQ3R ;{X(bBD*ǗD{ҏ<8g'(N^)jɂLQIHU|ZnrUNIE%V{^cS>R)r!R#9Ә-iH?/=KXJ^fr%ُH-Ot ɋFĿS[FUTkRS$ Qz.BȋMH!-(CIWC,TҟW@X2RҝA2X>h!4#( PKX92`(y҉LD`8oq}ޏ6)G.D(6(٧"*FDZEcg}VN?Z{w,{eR9(GGY}MSYX ͚ISƐP3vO}N{%LuleC$][_P%>\ب;Lj18,5 -=n 1]jMMENK,ԩ=WzIiƹP5ߟ˂^(?5T%:˕!"d>kdip2|1e)%zV~W悜7i^kJEmIkN>=?oswsϓ-Bc9BDe bWϐB>t.8ّ"v|5׮L'7$1fZ١LrYqY;sGvfɽm~-S'jWkfA,/=+t& >j[`~'n.UNLbRZU͊@̀u)dGNdr0-31BPO ۞<;0b藏*w2y_Yr%~z; 8[6)•D>y Izki'k8 / <#K  BPiI̓!@eCh2!3lD).t_s_d9Ρ-~wPWR!= pdq/UO桓}>$AI|ǠOB\pǗ$Iv<)S\fv<kTkrˌx.i@#cD/B^ z)xܻŠvq^q_5 GuU:@WCIZczO5jzsE\K\ 94~Ōr38@"1 y0ZBGHdPٝ*pŹ55@M%0oeׂVpW{|G+T[ǺGe1,#ƑxO) ؿZ Hw?L}nmOFSZthgi}gͼE?) A?2.lvcN3}Vg?A]9Fu,iH=k):& `Z/CMD#ڿ6cDmv!zpk_0s,k|^ Yt<[%,mOf)u8V"D8]ȅ]3 o{Z+`Sb qK%EЁ,(U1lMX";D).)C__v|F}^v௎#v|o7Dspt| \o#)N[3)񰫯36Q놘1p+|hcAh[҉%rL?"?Ŏ0˥ ॅjq-5oEngQmM͝i1)3tO 蘃[0uMѪK5}ۉ-f5B'oɲ|/c8_Ye 7;Dd\g~ni2p 3G PAb ')L ď <<*РH&xs቉\DA{1j y(? wtP%fnLrDӥ(7/4}P|vWɲAU+1da .|1CTIeE2T!twg(^ݕ\4~??no/~w۟͟g|_럿O)SSL΃+Wv$>_w^H`Gy[/񳤟A{?y~^ }z&|DhZbk'q;t#P#+_2vr= ސ &eG;c*2\žӘHke1ЖrQP`Fz4ԗnX I'<!O~ e(RJ \ 8!3"?@SS n܁NLud|969[J8b?p!M8cA\<.S-y- j`<b8:h1pcIeJ !s?_} /d:Q/_w?P_>|pA?b`NA[z`n|^tҍ0*e*@&(Dg[Q30%,M 0 GTPT ǑPtaa IP`J %hX Q1)ٔ\d,"Lp"HባqBY!E%XŹb$$M$@P4GQpX JaȎ)jx$6MƑ@+r5ThboƜhN $%IvP y;S 0nңӞK}8y m:4C&;ZHdJ9.D(#r3܁tڛ͂8ͮxzhQ2؆j*i:{ _<:5=K9rdU.-H089azLD`Ԙ򊔛/?̝{tc 6 ͩȡNsJM\9I]Xro螣wjK[>tu Rc-e/ |鹞5YäG,tuc!T=a^PG%#5h"KNs:Qp0IRnZ CGe׎KRA ca;&KO4>*7뎸9 a~ё|;.Xrxݩ]TO=I±yY8n:O畦0%i(o>U$3 keuW{~*k`~S,#`o>V!;Ir+s3=;Ϟ{0V,#S3[ᑝlƐZ,X z!kQfY7/^zIsk iEeIgƜX-I)s "y~rpP,OzDrKAGv?*{O=X}O㲅o(iUJgcB9N/y*1Q` }$n1!tAhA61~Wo]ɿ+8N .sGRte]p )2p)gMn4y(1ST`dC 9->}>MT" VY$&:P;2xGzC/&C %Y_)IrM / ŋE[&e`H]/"?2oaz"kyVsw#-I#aISxEXֶ# h/w|~h@nGxXeqB6Tקm`myssf_&/e)[%_1r79y/INW_ :FHdH)[%wzG"\󅼪=LʃD!`rNU˶pw rK5l|%-<eRK={TwJQS@1k2;4N~%=*,탎8YS;.2)L#&6.K>_Lt#ݫ<6rs^Rv+VKlPk@mt9FGC4!e z=K/sn 㚞 V՘5q=R҂b7߼!c7 u2J@яH:{ PR ԈA($)1ȬX{VwrNKK`ƠPVoOɤ0Zn%;#{0f h I!`iOGǭکzmS0^H6| Zwn8Z&\^4^ِ{*б.ifn$SmJ/uHMXЁ2g%sӰs T :|dc8 \1d?x#I'L%kŸ!AtBBQ$D֙a?jC!ב#.-/40oՍu UMMȾVG9ݞ{첣$*l-: _VUY6 أjuʞR!֐~LB, G#TIT|QH7C?Zo20_u%8!^Uka^T6uwеgl C]78dUoLkIYV tcZ@cfYų.gt.w9$K d;D?|VtLHpKu C$QIO U W0u}%"~as] ӦfVY`˔c8Xz#0j2:{?yR*l|Ba2ӿԦ]-7fmڎ~nTԢW&ʸ"(J?!C`P&@X\-!f?rBm_25խ]|~z ]S]ȚmVah]ċBk&]KGⱁwϢ LX2= haR~T>m@2R |}/E{;7MJIM[c2OV#LxGE^?DzK]T5!Cѣ0L/$ZH9xмad+ x Y\pΏUXw̥%.n(.t.ƬM9ZPĤalg}"i13_G, ''StF2$/elqx/\! m6L}#~zJF|'S2 zPQ6t 0=$ WhlK!K]dW;!5,/ZQW>U2{F6d$qL > %~PR59=('C蕧'`u bXџ㾝I|_}Vdq` wMoy BIM_9&.xkkIRUwE 'l4(__|!PL0G ;0<-h%V.E̯;CQ53ᡶOA;xw,1 2,9_No7ŵ1zKmEʳ#<}Eo~`UݳA v{d] Y`ayG()?.zH~SozjZ n^8ӿ\^,̣UP}"0)@?2CP&=ϔ|Z3bU(U?V;"ULYkIxɤ!Ԡ͌?AÝ;,25c'`#.;LпK׬ʥV؂[lje.;w0܇4,kBҡ#}S:X.0G?!rg2rh?B0dF鳩=V+ٷ]z c˳qwxǫB[_d 1FQ>uoT~_7~E}_t?\g/vpyOVAWt@O#};pixq5!/\>8ev ڳ9Vxנ;Tᓣ_qѲwj|" Ìku@uwWn'aI \q!KpQz)ϣ̩K ",b٬*bmCbAc?KM-B/d0[RI#gi7~tJ^i~a.lf c|kq+f0́i/q$>džJVSôh ª'T)gG*w(VmC019lf&\ Ia|lo Ƃـl k,;Pd1L1G{o2ӔjNS981cQI{l!ppL1ѓ37K,8)&cCk$Q^|#MY",*L#BoF`]EC`$dT֜4&yBZYo2uŒQ5riw'.7H2|b,Eƹ%n4v+#`pshFu?LL8+Ye's,%0}T<`e40MCS-LnBJHҢuYMvМhςMsq"qfA #~l_doDFN*qipVS7쇄{'ARϗL1ic10"QҳO>OBZBv m7 7Hݏ$4ҍ˴2ngWy}f"Krk%7Z jJh"R6|\ '@=5sJpC>G@#c= hUq,/|,qI:+./̙sr~˶.l8RӚTa^piFؙ)i wcQ>ie3@VNOs wQi["1p5[L$h163q4y}  Ħ̉7g4А"٩ݱFgCD@s2B| j?Ta9G'DxgPoX \!dup'rpInH gdp9x1$KB;}%{YʑYU^;j.@ڰkڞ+l q2id8A|zL oɧv>=_FecՂWx,K}HO.ͺ#D`7|pRՑ'_Ss6Gh)/9KXYGE2v^aŢ@.O%fKH ﱔ"3C9 Pv"3~j͎DNj .-W:1 5d.2/]26u|.fe }rϢ6M.)f@6-$MR?GΔ6!&_=܊3G<7PrũÕcbʡ_mq[$ק_L/J0Iku|L.;5a=(@r8z%RԣG &ag$k/B2H_2ΗPR")k¶r{˷ֱ`~vFb$KdqOc 9gLA5OY|}UjFZ?!y΋*gHjsId6qNP4̾}Qނ DƸ4G;8bϐ㒜-p2*KZT.e?g]!;YJl6h^̏h >`؉%RT%ی3ݣ; bMxf3.֟ܳ70Ӵ]YCwaዒh)BA S'T  Q0^3!&)UK~<-0^:X)rȫjnzZ? R_PTk=#HytCIa19pICm LѣߓT.UJ3-PӔ Da8hE {|\q<~GM=d@@4yDT{6cL_kaPcro$h(݊,.R;vH*p\Gě#Y,"7J x ֋&sXa0Y\TNk_Sn)?\MQ1SsZ;ǑLt(^wوǂ.= xgj"}%gN'ãqyͣ A-n/9wvpkiDY$fWWGHBWGILJHKMBWGs} .#  ?) B  o  45k;!j fv!âswB/=}(mXsK?th+f8~ȱEB!>{Jptj<z"ə/@Z&bۑ1{pvyzi)kA^#hl‰91rnf@狠x ʳK#=>o }rSH i6x[3:VXoRlg `4U(6`ȕ}S opk\>>p GW_RiL5Vҩ}mm\2&(z>_D4˭Xf=ֻgA|eOC+5?*<) k}3KE<ʰ^u YwzVr H(]Ɨ%;~ wOS:6>kG?P|\\=821W"0/kˍo=1Ae.7n~ Qun:]Av}IG-="/M\ԘCPmxq9Z<1I5 F ~f~sC*uid^J^rU},0) ;kEv6v9$ K\2PcA|kx`kL.<4 !.e׆L<6f<5Ff9vfUTfߙ$$^ Kjcι_z'o~hj/F{G0=[z m /ch:Ee5; \_%CC ݿ- ?pжmw]EON! rܿBc!= )A S}؏c} 5S`%Udz{m{We`!O0c89,nĔ?>?ϯnomo_O_??WSӼi3y8}EcӗgF\ۇ/zq݇GeSs^܇Yt=K-O=+vxd|suΫ:v93jj9PX6һP]ڸ)lȩ"s}DzJ}_C5Vz<'^*E(pՙ%::F%1.4,97!A8 lf93H<˿+t$dBhQ fPPh_]$͗P !ːw5gDC xGER"W#1T xsf=G#D8JH( +GOfPxܞb6J%N?n2_p+@Pw_ s1# h翌v?S_ϐ@pcxG\4Ypog) ]b$N+ex֧).E?,=x:ʜ"z'.?xq^KF4L>,?۬<i0)L )y=V;b +15ab?>*7zT[ڍiؗo'd\wYgFNAW;Y=_*}ҾZ6O0J\="<-K"<1!>nsCO0XCs *1~.19Pthdȝ~By4p;K5ىQZ 飏4^[L|V>"V,6*rхE8,Η k# {Cya:RΔ,yJ *EnA"q"SA ᆓP5*4,M~sid\S皛6=1m4;woGuiN4Ml)"ل4Ë {4Rm){CxOy۳#E!y8$9* DksḐigѼ!V񝡆0y8:j c/L{+S4Iy>xMvD^G hf,~!|웨$hTڏR~i>@ ]~QM nSd>lBxjh28%'Y~;Ð,4^8zJB$O)sDL G&achGÌ<^cmVnSQnh͸[nVjof\_G۶6"dwts) C*K /@ˀe>t='svl""#lGx^eٔO )cBy/1GĈtnWGӍ%ўks2kZ4r%<_+^<>jEu5jB&HdKA%PCAgߧ? D )btP:,l<3>p` iE_ٺB{%WYp^*2! EO  Y7, P3ܰ>hI,ƨȹך;=P FYOG>EϏ~YDy!Y9YO3Ih]YvV+wӕYQ r̺[;!;/ֽWŧl\$YC2&,,Olw#ҪQag}fmWB"P8?Cً P]2MqJ`Ə怰dԳ$DCy>C˔O`\bP'-0”Y.'9BEp/9GX:"}KKKjlU8KU.MJ]r#1n#aȨѰ?q#й qsM0< a2 X-..DCy$N+x=Q?oVRPID}V=jIV)]SMK{SBpk9!C/+%uLnK2?ђ#1+yJUhVMgb|AFKHѳB)0fd9!oFѿN;Hs醹a3y9YEX;)>%t@R/l : -*K0S&$UN^rofsv`HČl2L:$gh&s/(=PLNnOHYM9~*m yEzUB}^,,p]Nv"y9P*N.-6{N]elm'y\ލMtzYlj]tak-ӕROmBSr6)]VDj~ ~?{=9kmҕHHԿQ\}tR]]:gDnPiY)T FwhK#}><A~;|@ ف` M(A`)C<=57}n(EU%MGqD =OOS]l "ԖFiM7;roVD&J$ T\p]Y7^q|S,hDusdVsg!)fY {^!!ԎB 3ymB~,xS-a81ќrQ.w.A,R4 w(j?ߦ1:^!x("gd=:Mmk<ghbhssHqiOFz5e 需H !&zyn.Hs@pUPcN+~66D &%n~:#1/YGKTijC:=neTΆhSNSgmUEe($)rMo,9(Dta].M6RfWNcw o lIg/\q=6߇{%?*kn@݆{i2 8ftqRpdM~gocGZ7V~Xr \^k~hIg3ߟԅlΖWX6c~c%'FɿgC璚,3SI;ddm^HզEHlg} )$d͊//Z19p óyXZX&b I>𖧰bB)3 ;uhj#ȟX3a;%=tCSc Ȫ(',QF)f4_LS󋻺 L}$^F$wLղ ^[7ؘ=6^NAz'ees}j ֕>9@GK 9g?RT$:`tLR=g+[;C(gЎ 0^>[.zYݸt)hʦ]:6?beO՜˅*fnOF XxWϯdžMo?b%x?4{+?KoFYR73GՊL4D`tI _υZ;&K0zޛ6NOE6"\DvɟR),fFR^\4bR__X44妉 ퟥlhj*!zRj kg(D6_./Ǵ4xiJfU24:K’R(7"rb}??ǯg??]?_<\l?@jd#F| O_>ා3U?|xm><=oE>߭3Q̲ *iܣUs3jAxI3;>ľT_6j4wxz>0"wBQc\?)sgω6?1OqB \' @7˔= &J L1D601! SG3!X'S-eLJ ͟bK"\l5JrD}̈́|b I3 yfځJ?j/#q06 qR/P,stX$$mKGz .BP4RƢMycВ;DZ*ˇĹ/ّ>8j"_BY5rKb6!]t,2e\)6X26Qꡟٹyesr,mrY x,҈6B^$|{b";(mYfZԳJZfF,j |Z,hCrHfҹ;3~h_ *Y);PT,s%#N,xDV "yLTt"<|Kƍ/kqrO2Ak38ʭhN)֩(+ܝ6< v 'q\d@mbT#SA8D)1` NkV?2I^_ȂpKͤSнg~}??zWм'F $9$Y5\ pe/1y?zthdڞ7|"@*PgդyP#0 kQΦ^kX!",Kt)ɆdYI(/nƾ;p_ƹ>{ύs),~B屟u9z$lc Y$I,Jƹ!)I̟0`rbaim7ZƝgOqDss)ƕP|Oaa-hȋ2Ϙ>VnVA(|>9̂C0D.@b蔉 *J^2A Hf[&ɟk'S\*uLI1([{,. b?@A"+&&.4A̘$NZG(2_Կm@κw|Nţ#\Bh̘:R̸6MO԰)N=o-#k2,#"s%]LΉE~Xv(Yǰ8I6;1lIZ\MQp>KeY",RVdRFSA\<-P.(ܛ{7vogBTyV;UVRNB5!^£ƞG0&¦Dr Sh+AZG=R(o+c`Di4wWgyW݈IY\iU;\<{ϧy|<""A`I4en}; !=]lä+FaF{SڭvZO;a\/ǝ˼,rem=>^~"It~ݟt8:oLLTI*H^vuVֿK5duc12Hl^fSDd2I=a:iRM}KoU[-ݍ R::" orJ" p?= @x7K'^1B*:q?]7w>.==#/1{Ӌ=v3#r=SȨ> C"LCciTT!)$QKK)ShBICt SS=U.1n,X# "J$e(I{HGwЀkJ=B=9P % |%1 ¹.QvFI6s$N=O?5>s?+C]3LxH4)`‰g34=6Z€!AxJtYӠ%K0lTi,HC!< q,8VjGH%rZD*)hlmTo #̎p(JGB N9%N\0qIpϻyjq]s~ uow~2׫1>묳H'^H#5S!,1`bq+VdFRHVo[Y6h<"YSèE&%0I(@@aa{$A(Q̆9hB彽?%j\T#i`k+Ztl5jJĘ|U+mIJiOg+* S4 ḥTA ‡ 2X]NҫdŽ,&SވG}G]KtgmGόquHs|~?}x_Ǐ$82;E"k 2qe# ⲏĴ `(>f\}+G:p>iBlj(ybRƎ(HV pTZ[=JL $XmMkyԤz=y=!mj$ sط;FlH 66ZA?kT.@ł^L+=+Q3!ōa%ը/#i ^oh-Y`H(qmnB_j1%<}W̲3J . 1|){ds)4a|!PK(´C2ĦXZ& Re2ܰ1bBeUJQD8xbde9㆚=,' n9r;J'Y6M6v 0v6U{%jy3t"XP^Z{6לŅ< M1)1`6`OOT'b8>a:@sDNi?gSϏJW_~yCUy?Op֗χ硏8Ɛ\l?OǗ9t٣el|\g 5G\>tcB0qB#@l" &`qLR>9E}A#0~`utI+ Nppx*l"qad yl5{{u'AJ'#4f`a K_P,[rh QT$4eq^B$Je3lQ(C^A9ɑ9WiI9ٜ|>Q+:$o/f N[lK^SgebRFJߐv!~Gw0^P pу#W0 @Kp4r 3V4_@a?ݠ 7j <z}^Lh3y3Yp<"R0>4aq)>2qY$1iĒ,*Chx %wBbg%:q墸]nT S"c&e c2!J0 Ϣ0y:ɗ,Ǔ:,J26nJ<ugY,']H)O;IG4!=+P(]~AT IJIijf>l0k;{~q c,EyFH#6 |%ת5Z)r5k{[FڎWryӶM4sV^LWm]~%&2Z\~{w{w/}?uuooǍXc38k_O9i3ç<47}R)%F F(<$1hK8Ԁ2@`&>aiGnHAO`P9Z9$i,sB PA## T&P"Ph-,Q 0IWJ [\(3P˭gjd{Egݲ]_H뺪=ꎷEbV3sfɦv:ef;Re!}L I#KxҠ<ܔ=N.u2Ii$%넫IϑRg&=?Gf2CϡpZ]x2TIJKE&n7h4Zߥe/K$V\r>irdl?!fe "y^O#GI;)*O_=c_??\ǯ}(i9C6yx@"8 A7 ёtD̹ݓZ!m z GMDWρ02@8]. HV-sӶHǴ*rl.Wrb7n6X2jk4ym3`)kQ&JL<@T M$G䃇 Kr"T#Av8:?h ] ΀<$=8q@}c-EG<& [2 8wcTOfo5}3ȩ'FrݹC#$@.=kxA[:"++v̝c휨rJZ"-ui';s\q彪eAzm(mgQvs/dSz4U/[= ?ro:-'_||^q畫|3#B)ǭI? xΜ2D66k c CЉA\٪KRE!J@0=`G$KƑfqaNA8gC0-.LOrRQǝxK< @=mtq&MemgϬX $sK%&Ý#Xhض!A"LʞU`f= +-[0)ǢMG[RlxRW?i'L1lsj5|ىc)w{ns )Bx{)K蹭MI$Uu)KҤ*s'Q%{>EjwdYrTD&lat܂ʈN˷x\iTGsu$+@+Q'],Lzk&**#?3[Fܧ:Iџ=']`K[R@THdȟ ,.ኺԐZ"4=Eސwy>/_W?xvy8|\|/^>/?C_lLa̖=Mq8Ft)ZZD\N!tW#f0F'` <Q[AH ALj`Xi1V=cFT,)RMR6AcKbL>OҕA呧E(/F(&#ʼnK$ ,y8EГQ`#/,8@!BBIZ!- qba9JI4 .~..i6cL虉CmZGyq+>GEG%r'O֖h=4/Zzfsgg,3K={ Un;"޴$/ s{o~ߛ?>b_Ӫ>_ D_?}Ys~8?|>{\ZC}>୲d+#EU[pQ?u9G%dPL})"Ĕ٭?P,F^"8K*5!2AdGn(3HNZB`(1h8"ѲIZvK" 1tB2ڐR8 Y), @#j䔖 M.hdDS%y(!ǰ56abK,[{=|o&n+JpD0+s#ZiSh|RaLҞrdC[S=<AC~aZēgNMJMɵ4dCdDzTׄe͕G7>rEz'y[ϻ/s=||ӡ|8ONkw*'{HC㒈UøG1}x]B26#?2h<% cvs 3l%II&W"^0x7C{oqğn<|y782]OGlqF0'N'X38}~^cDE::.upxYM54E; 4rAu0@PNr6H io/|B(Q? F, 崜)InN8iM3q2L͙SOjtKeRVvLpGiib f{Nn/@e&"[aq( 8 " $c?aAIa2ϊh)\7:dž%AnԯKݵl?'  M*aIAD}G\>~Q(6-,ݭz{.{fpu9"$džc,V,cAY{Y[f1P :=ߣ)_݌@YS"QAqaC ^/xb- I"c:жO-.Kٟl>_\\=”A13a!=(X#ʨvSmkjldavƑ ,ʊKRErsf 垨xWQ7W\l+!ɱ]˔4t?VaߏXiALOG}Db &l R{JаhK9JV'GBˏAEXa jCB V\L|#]d,Y-1)HԺSt*Ӯ[:X$ w:@Je>vW|Xxf1iv\bw_!B>%'pq'#^;B'@0^B/D֖][N~ǟ~^_u#'cڤ{S,77"0edI׎9ҎT{ 44bΰ O/G47XBDcCW(C)EG Z蛹B?2 CK˅L-+*^ͷy?ICDrtK$6הV]وEˊvD*6QX++Jci$dv܊͊ژSyd'xФ9Z0D]&$aK !ҳl&e &"]WYկW߳ +_H6Y$/_ж}y~lzۜfc=n Sv>I ۑ"ڂڪ%2a% 93k7豯ft1Kd3N.KKթӼmڲA?/}±S}ls 7 e㗊Kq{Hr K?@PRc[`}bѦ ZZ)aOIZ"0%l.hg66iYԙT믍-ؔQD]0%*zkݥLr*BR[oILFv{#u"{AղMꂊbjY%T7oȫ;vp:H`KltDv|*EeZұ`nX?*9zfYz~ϴǙ?YSf2ײt'>΢D.b{+/W;TPyW [%*~.s#5kۻ_Ҟ8)?CX꾶jT ;]CE-K@XMfa_uw`2W\/泬9)MƩ~߷[xwvt\17ƷEuHwT㫴vܗ6!ŰIyl wϋ$BXIAM>W q_СypiyW)Dd'W2Yz?TB$g񧜅`3H>s)²4=Eh?2̓"džF**M'Lb,&߁e-9amYÞzDo $x`Ӳ?ڐzzqJo WYڼRE.NDY\U_w^Q*^[bՍY6)t;)waqugWHvR>>m|T/M5mLp↺u, ,q,6H^(GgUgLֵz"" 蜿h F)tzm,7<nȶ>:B풶"0T&Dxye'g r$ZydĕyH}EIA"Zɋdx&Bn(\qtὍ`לZ[6(=8aUHbᮊRuivDU~IO[{(ǔ^xפpǕS)Q/PBRumFYM-U`xe1K%Бi:OxW1_5+鐓^A8RBfBcz~/c0^UL(I/Xv'1ѻIz *p6Rsʌ-b%2ҥʗ{&O??*fR3ͪ WZ<]Gp+8W]l7t.1kαQz1z=AW^SvI׶@5:eУ=$#~!W3 ܆qx 7U(ad5%rN>w(_ lq;I_Kt~AM܏[1C~͎Au̍iNyJ?[o!6ө(of~D"1앜NVWR8U šCc%ψV l5yܯ` ׀9b사mټ O&Z$yvJٶbXa~'3ϰx@;rrZ [q_x|Oa+{rIϮrj⃟@ٓ%WAtފu\ؾ֞!*_yE5"FL2Nυ+00{]îz2x lK>OQ&g1vƾ~S5#њI[=P)sSGudGhu:Kzp&u(| ƻlZ\3aKK9ںT>O0uw?,0G)>}̾rC/<$ޒ(ےR=ROm.]VU%$=5:gW>~s\rAtV#Yj[ۺyD7?wGƦXT6z0}4nY!+az.>WWf|J~"]~f~N?FlxmxJ q0f_c ۿb$wbʴn粗Jsmk'<&Rs{54Ηpg_#u #j}]k1zLzϚvs|(Is2??__{o{w}o{߻gOyϟNt//:}8UరI=^F|XSۻ`|q? K,obzܐuDmsH/,2U!ݰ3QzFaKf`LhaK0S^icy2`D_TyOOc D-6 DjwZA@9LzZLJsH G"@΃*9IT 1@߄`DMQR6C{ăd`,7rPU̪pKYYpb +E^6c4C0Ҭ4Ý2<íFtQ )HtlA2$x_ܤ%VbP@1 VtBqhx8 0C-r;onbR9OHx!&|)/e`wY]I}̥iYZO?Ͽw>7޲jm Ԃ\>*0&K6_w#UF^f2ʆK fOP!d4%tJ`Y1Y"J%GRsyQϧo޽'3.r\M~^'H1K]JXĒK9DdaŊ^p" #ȊV$f. |~e>}ϧW317S,s%X8;sA!@!@Má KF1֎ <֢$mmN $"4<7=,4dQΛ{$l7ReOz4E9Ry$]$P2?M~n^ S@D@z I=BicPsZR\R H~R*"!R= -ZYI ;OQ˄ĥIP4d"{ΞHz͟~OOK>C? l͉)g)|49ī1/cU";-&iqF^Ovg4u瞸7]7Q\eqJ.۟ ,X\c˧.]QK9 1MS[4HLjw R))6eYXTDKVBӂ`sH>st0 LSA%.Ȋ62.hJhxw"X.G@D0 d\*EFP/R83()q d?"S*!m7W#gs]9w9]WZaU+5swFzjmokѹƂΕ,=$ݨK6Y~< zv}*N<`)yG2B>,H&h 0 .kdA +2I57lZS54FUkt씖g5Ƒ3`.eۋs>T7YQҜe_mX!AOA e'U:i3EM@L+dg? AJ'ɱJ| Dh >@ύ82f!eGz(HTqO'_3I Z4wR 6^;rWT&Sp׻/sp!D/qBTeotȕ6X3wz-3W k 7\GO'3q$Q "_m`]3z]a7ӯ],y0*J]2ކJ)Wt)w=6Ax`RCı+NPuB(g(yF>D2AA` 5n}}=](KKu C3ڇrRg0ez)x]4l*OE<',) <Xq<7ҕ1|)OlJwTYkF&Ǜ>y̌kw[tQeWbx:Av[|&8Ô̿5@|2L' *(TXx$.G M_?@1_T@vu f4{6=r#5 sC Ճg\C?l?7l@{NqJ5|K[>x ZW,@lė$~X^z/yemk鏬.J3<+ڃbIْ,wA'4Od2jiH1|! imkcG;Cq;?G?0C &|`kpwLFaąϯ(U;.iR;S @OSa +! jǻ'aK`3σ}\x 󧃈mS=P7̌;d4:4'.ǘ?Xg]G?l9}RL1'弟 R:L^Ev'T{K^ˈjnwϪr,B$Du81;go+ҬLT왭=l7ֿ}jk-^a|IS[ 2T61]6*l& D5i*7% 3'K0s(T"x#A| V06@9p^ elj{e}.3`J3Nw ]]>HnlϨwFO?LD%ח<$WZP?~NժHc *Q|~ɝK `|^j/7-W|beg#ʼA/3ƽ?|>^O}//-_/_~Jko_ w_o}'?s?syywt|{,?NAOcO$;@0`rOwGdw}?/{?g>YF.nnrz-F[^֝TׇANa͠&=99|=\[R~9c}&"a"."3<1 \XԌD(އ 0?%z,P8Ohz׏7DΐQS`9,3Ws ?+9 .D/AaY G9*a :zh9q4+(?\!ً*/"zsF>`Ce[Uny9pMR05/\"HKrP+@ pT&7T9)ejWqJkPmI--jr.rw Xg>ײRGIÊ_@Y4tz񱙆@6æ:9EX %jVbŅ.TbZq! { *.H2`E YKO;-Nn&Ky,T!*Siva#_&gή,}*: KB ; H""=3"SZXN0C9/}(|xQ}Gx CbW tQYPmYhY5r+28[/FUɜ׷t0obj >Fg<[V"EflWs-jJs!қ{qA). kb lPLգS)i8wvpkneT]DY$WWGHBWGILJHKMBWGk{@02&1*  r y T>~23ArkFxx_\S!Ŀ,McޱhRҧ^C/CCJd;_uOsFIh?W-0,`h{-NFDLY7/2;gAzǾՁL`;ڧrHsQo2Y#L) 216, B,r16Y*=9=\süxri6hzKO䯦c_4~x6iFW!8w_Zp'IGrU C4s?u0~. 鳖#e啤˚/:0kC[qFXɚfE&B ˈ׈$zjux$w2>%F1=a"B M@.ws @~=tܣWW%SOg;H| xXCS#z ZD:pYp nіU1oȃה}hb>2a :WXo:R{.' .'s;F7fsItЖUAlYX}.+Qtz >!K 44W#*Y\ΈNZR#02>K<-cfnLtv/L I>ىg!=#iَZ=.Z%ygy+6I20'w%ea;XBP;g\"Vdy(#sCvR]@Y+(0{I*WwLʭuB @ibanDt&ߟEIgضDDs?2:{2d ؈:АWTV¤ܟB'*p"$>٬_ri1KlUc?/ G!_5\Ft8DK/GH!jHG"F7Խ V)Ù:|7:\ .[j&/d8\BT Rj'޾eP@c@\`lSH_4Ƌ WҠg,=`i.!} =%U)O„&ldlXS}y֒xYm 6U];Sɍv_ҺL ky14UCYwDb>籸WA~;Rebȅܘu =ҾuRWݛ;+KdN%4H^`qƂu UN8 %=A @;;^Kxa_x'ޢX˺*#)ڮ$\X8i Tj4H|##ѨΣ|t\BV_=@B%_Q&{ܼ =zKE`p5o]^n|4EhAez\a p< *$ '=Aml?y\y~:/ȔA,y^"euQZ[.hQ,͋Ţ٣dWw%&zgwOrʑhsm,ޝfK?Ӭwӥ}1fh+)kD?" H^iCC?*YoTFjsFǟU7C< g_[$a4 ߐƖhnR56NAt$D/`YqZU#Bf9R);&id©ڥQeG(^r@C4<5myz^uJ 峗] f݈6Ua!"b(aT; 6bY2dN`{*w`>l_i8NI tfxRiyeglؚƖۘs?Aaϓ<ֈN/,;3R'U |UyȪj|3bj1#|(00K!_z?EudgvpS"pr'/߱QXi*["hH$]yT2R9YhS]7ysqWh(\k;到,-ӈ_w=h'ܞ $.B 9Mz'cDbsmz+AS7bq=a啌ʔZ*Xp  հk_n{>bdN >/0]#$N,~7uYb=Q2R.P+oY, ɼasƄ?Sh xnU)0u sGTLxYG@M#<7{fZV+el{(yv0.@%nfΧ Z'(fC씘}QS\Gqn$|[ y̋|mL,DT.F&"]2݈i~R\nֿVZu-NwN[)zW`v Ad6x_}_5~W}7{~}x_GN[XGN%=pue?%Ǝ=Ͻvw; >;NS )>X?}g8=`q1ws~׆2Ov~.)x A+G MY˳&n*_\Bbx|/l9|ך/g 3`y[O˔hWr?/jI~Wc쾦o~/??o?vWo_ xOXV^ىOn0ʃZ=0aihp׏C-WhgHLs $@ A $\_B;pHxZ Imp\Ö/q Dcfd:SC5Z2<HEo wWE]᳞1-5zv69P\QΈVs^'⤍Qx;.<4RavFyzx?0cdJp=zPǘ>ƣ0A9-<8'a猚4l8W `;V']@;v!L;oRer3Iɞ{q(W/ -/+,C^v[$Y<}nKl9(.'Z)FvuE]kxK{cc^)ơZ*~lWjPNXrVF)NY~Ec8#0 V}P~ 2_!İ 3)r Ԃ#W@'XE%x^YHV0sA샾6C+'XT],1O4;hz)ġ톼WBb9<&*wDz> _=:1va< ] ͉9z5ky@) Pg ,nQxX76Qk!,ro}7*/_̻̥"' :ȯ;p;&h  J'_#Tr38' # @95fCk{H73 S - <ǎ]͘3Y|+Kݧrz˲h/UT?#Ēvv<~N)IC-q6 eS?)khX3?%ՓrBk/gW)tRu@<9f3- =@}[QĠ"Ìk^ws="R$U8ēraѽD (} @mQHr%}*x"  `M{(/`v\1ӳvlQ1FO ]S_{AcF+בelNo#Un!;[T'5tfo2A r2G='Hkfd3!zuzocP0pE >ï^ ɱ0 ,L{.͑+f2Z%Z~l?VsBz:Y/|FuGvCy6=CŹ:O7e \%ECt^Xg>;dEA->> ,.?{ؿw?Kv INCR@|†%L]WhZ^/:KDtښOJ7ΈJRpHѿ7V|.7~vm~u)\^r[i"Xh9Q%mfkŻʖ>ׂrob mcGN1q =*@Cyi%Je,SӑOAS7LRte y77#[/A[U@ 8k|My09F ]H+9w1.`[u|=3)^G&urh@μP| >5&.N:yC5ʊM$ܿn^SvrTx,>a{PxT[h2H(x8B8R4"uӫOKnx`.ԇV؜vZfD"b=t܂ćdv)Hɘ#> Ȋvm ~iڏN tm7J"v*T{*NbATn~'ڎ'85Ff*9l ٟ_4Z!<IJ/M\X6_IT$سS(۸S,YجE9MCbwFyp"hZ]2g{'sQAഡFiwΣ@?R_s?inO< lc{S`oVW( ?eRb3;mCr_@JΏ'HaXLm6sq )}.=St3 Do=5Du/g1/rEsd,e[929̟%W: +1g w7 @ 4v20:A=WGjIggRkDAYmIݢ  {1L庽~OC&daMp:F6!4$ڐN ׂfЭ<N3Ł/Y=P/mE|/AT[-B_k?d6&zIK/EW쥽m$6rz 5|4@SaJ5`R;©5 CyspC`_c$ڰ$Z;ciY#6eF-TK_Ծ@E9TEQy9zjrTG@/enD!<?tpq(Y}#H? JyM8vd O#YNҪ"12iOS~LX/J?"RӻLHPJov(r`NQ7Jŗ7exq@/<) or}^yP|v0ڙ '[ /?6~K7_z@y]CUi2P"ORH,йFLnLf'16Ϥ kncl+y<  _'П!'s |CLMek{aw?.+b??{_/x+5rww[^߯g'n{?wG+]/%{__uLvy_]UǟO_g쟛|}J_\Is0u4aA.>9M}U?N)uJم5bJ}-W<m۴Q!$%W ZJHea/P< ` M֐?\₢GD] t<@F4=< 2a#Lہ9t{bZ5%/ňWn?UMTR\c晲(~p/-1PLj]o8G0ḙb&wFfs| XtcZĴF÷Lpc(po8W_.K>ӷZQt=;lQR#9pGFOiǬ-2Y'JvNTȜ$R#7:k'2A1IDpتItdChPYD#yY60x43)rϤ[jW ("c(RaAAyO 0q,mIu&?1s?OA`5T5GVdiIA-%)ItHhuR=I qFqܑ ۦHe'c]S&iXʨ>e0έD'$pt%+=՛V.Tѻ(MFX͟7v29V2!{k߬߅!p& QOl-ŐQ,bpt@! 3gVEy߿{[-"6*࣏ ywI6xpsFa"ήb'wټ\j/.Y矜H >VV1lF 4[>& $U@u!JO䯭x*A,SeX[ CXajVGL>;jQ2w{=L#bmal2ʈ*\1\a1;u=6_ucJ?Ne2(.&[APC' LE (-֢Fv/9FԜFė[1K24ЕZYek‚fx^D4g>f|1o |${my"QSeZ$wA(DnO6pD--q^ 3YL2'DVqAL!G Flܢ;An.EwW70Wڕ?D >?]UQfk/:)ݜyU=Fh\DHblX\~_ۺVס%i8?Grxfb/֥z? <Qcׇ1" xKx| 46n#,+BkyVFj~-oja Htؠ)$FZ^DZX&oGr޹3- gDxw%of0 ")k "و~ ݹGa" hƁy*UUA|c}ReS lF,~_[GMh<6cgea}{%kb-%;)CLGd0:|C3x? dnf&d.Z,7ն{4_0}ol_E} 4QZ `hwk:-@]1{rZz\1pUؖ>܋ǶfLt\$B8/KRYyZ]&̯eDFZo6ٯ〽^4 rD(bZd'ػqM-Q%H]^ ?B czHp>C'!Udq cP_=^ "7(&⹉bs65g^6Ϲk*qA|J0 }ڀ5I&f?yZ*@a(we$-# lTy;RC{&zXsw9 ~B3"d@AAq{g jp}s-.}=Hӹ27OLp%|<<50'cwi'c 0-4sv!+?)X{9{K5ᖼzj+V 앜n+ ]!Վ3 `Ùl`*hdZڡ!wźË2|"m S$tϢXY(8'BI rkr@oFǔya]5ƽZ!imo%f&o7,#m}M<`xA1q`CKP[ 58#O``=@mq=믒mpi4s}1n([U-uK]pԅ̭OIB+'*`i1g\0*4l}o{ww1d^8w5a?hj 4F6|r&jY0 z_I\ DMLs޷ IĜjdc8:RLX95J=Z j1e6!n&.Bo9.{-m ְuowSUև\;$[]ɜ$5Ճ!@W$1Ͷt۵6-j_I%ob !.6X0ay!2d/fE:o|ySiDR̕7' V"Ioاt̓ϡ乄EaLo`upڿߚrV =Nۇ P[ʛܺ7tvasΩ?m\~]hU(Fȯf|֭o?0J9'!Cl(@A1LHAwmf+49XI֭7ocþwa~ }E±-pN7`HB5(,: EaorW '[YZ>gdlecwW|a} ^Mp%bl*H`π@iϟLZ鵝Pyn|S-]: VK¢] =/pϯ]|f 79Տ2#iM"n#G{QNZ!9="qŐp{1/]L;O,ݵim6*ܨ@afFU|!5N:Zș2 )GU"_ޤX\ʫlRk&xzp`Imʐx/|cA?~Vu\]R+1mA륰,狴vk<~Y _cc,H=> BP7'i_!ETH2)).ք3YŞ9p ͈~T}P%x{=E`⿜.l2G԰A[d>,sf.=wt'&}";o#F]錵 hKZE_ l^pLË#ʋsXmOEd!wfP,:ߥF;Y]-pq/(`XvKL )́N2$.e\wMu4VԱ ?wmxŗm<ԚW >sėbI,~>MG@PUr)|Je&翏H[j{&mޔ[aUVCI u~U?h3E wX-Cj*gi sݑ3=&ss\:\Y?PȞ3| .e.7Q3vt(Lw棧H`Nž).ƻ+mxfwb8Jd z3 GAg “Av%ߟz7B=R^,W0ڡ`#OjM/8.K h|8"9J]yET=U$7N^7Ŏz 7Q3`6.`NRAL燈a0TX3Gx秘:d5vh?V~cԠ7棁u!g{ԯKثɎkXFg)́o=-꒛>X \#L?Lzτ/C{P-~`0rփ-C-F5`@;l}{ݷFL_Ct!G\۩ۈ1Rhyiq;HE2Gh  =sC_:}F?ےȴ;rmDl,pü=EᇺS49|_$&Ge. /x i~Au t ͕zٜĀ0r[ of:]+.˗}8.YFL444cuY珵3,~c*O:"9>;ub.J-Xk F>TC4&:I+̓CC+wo_C+]yrd: @+s\<NGP4aG»m});p&kiHoX[} diA x냆k]\|{$(\X jooyOz$-E+/ƷFlR0{< jV8W ;V=u߾FǚG#0Gn`\Ha%ʇ 5z l~I33i\8&Y~EtOO'cC 933%~^#7=؁ iY[%AKֲh][ aK[)S>nqGyp 4W U /~Ԑ +`kNvNƋ[U[#|%Ot9w<[HԻлX^m|Su޵;$ Q9sO[&\ruv( p^2.4H*OVӌ}:;DX矬u bOɢ=YLd69]v8'\~[zI/잋j+n҄6YJ~HQ.&oq0~8֣G 1,uE,|6 0%(ЎƑpu^o]cӰayvDFplҡc? FΥ7p}7ot KĄ8hj +CdH-- Dm;˪e744}`{=Cw$|@ȆD%Qe5q/6R+ͻ}ş'ϡZGb͂1D![--cbΧ'?15 @Co?qUN$G/tV#Em2ؕg%Q<ϸrWp/}մՁ7@|>F}' #!0cd{bݽ*6qMXCᾆ2C)?k8.9ɝ w^)o$7(*$ 9(V+mg3w N2 / =AAS  7@L~q *0m#x[_w_O+\CgUvqmI_E+q"c#d@ҳt"^}V]@KH' ÑSˡѽxXٌϘK>?\mWs*ᲖC 4 xpF }00K%^.q\E9n`Y`hZztۇ@`ߨzJ"#pk΄P+Q׳#I*^o̺ءGz9({n_&~R}E7`6&3I}Ahz=ĵ|jG:y-eGaJ߽mx] r1&̭* ?$ܙ/GzDhoŃuZ߀U)~qC\!'"2pAgZy+M.hOqr0|:_/d۟8vB/gw1g%'Zty +{` 61iqgwX&yϿڅ^y9ͳo84\!c/r{7wv[Tno.v)23d1'L9=g_J %n_ o8~0[Q Mp/?(Boc?N=~dy5. 꺀1vWu:WqyDQ|HZ/Adr908s3%Rk(h{@WB[gmEy{&!D=)aP<+nh7:A.Wܐ!}vJzدM1*pJ^>z`R"![ +YJ* o-Eɝ= 8Cڧ|[ZY]im/ W2f,N-Dm}fofqPM-󑸥I3.GNq?Ekd) 1@.= 66|=njiޢ+CEM?0^=S,Y˫dkj!Zt8 k5Th% xxj Go2Z@08{ܡW 6*KzQ[@b8:r t 7Rv븭7lhz;ypf:dn1&,a^ؙc։YیgOpWoj{ryEtoKix̚A,ifm${W9Uxce,ﱤ5qZs\j#땵 E'sՔP4˘3qb&;K;ђE} >{jJ@Cy?Fo"vA" <_Gm aP/ &1khA~茏TY`CޣQ]Ieas})zYw SW[ݰHqWޯk:HRwC& GYߟˏ>s㌟&^g _f|K"9y?RMƼ')VdQep6Q0c#-v]QΘ]>_2;'jP)MDe"S%n) &KSsf^`Uӧ*.;;]bqkk8A}-Lf;5i#O%45ȕmf#2~-$J)~+✐r #<;CWgI3"%L3 4C߱̚Y^qit~|K4XRs腴 kPV^xNrw\44 E 2"͝ZOXS.>L|,'Cwo殂"(A?= ƬNy22)H#=(szMkoSG\\/ ϛ+ߔxm銛8]VlR38[9@0a.N$Jc^Nħ 翟b-;ZiB`.>PUy9A+ϳ(6cXk?m3KKjW$ҀKPҹ )̭;R} @ΰ7#<骎R 4|by*/ <7艥^V#%jtf֑o.94ы'<|c=A@?7ӐLAĖ,]Z-+ӿr*⾴&` >eSO+E /K)O~cLy,/&6UبJI\q`?ί>vwO >k?}nļ[5ދIdcѸ֚w7[Xʖe: z>' JI0'ׄs,j%?%V!y<):RIUkvwVaSN䖵I ~ rQrpG2}Sێs'Sy3ړ|h- zD>|7kM"'oD ;eBXB&|飂.(kM>z4K\_fګ; GSKHʂi]Ԕ]Lxڮn%k͆{oyg 5+֙6SZ+$ ,3;vg"3ωd=VKZ}{o S_ڱ+ԩ]z~Aozo ([ u %;/f=1MaOI&A gՈGD8\-ˎgǐq_ J&4,,rd<߈( hUƣ[g~롡s,/4lrK!! ~IT}|jBb>]4z`~hVG#YDCUx. %Ҍ:q@54Qu A*;*TzW5g]e b2! +ᩯPd^ŀ``a^9zE8,`8}z\bwO7t(OA?7PA'h``CeA S}O;>2(KwRgsnߕb_}̀/ahn x횔`kda`n AecZµÛȀ|>0/_C6b1w\:;onj0D-xRnyM*r%/<()f̋Sa[=>OS4ɤnMt<?V%䄹6]Mѝ96h <tt|5 L/J"*\ ݿplG:v{ӈ$63a}8#Hv?u/].~OtL43y˯җhcx+fDP$N_[GmA'T#gGwvwdN sQۿ1;:}pxOfOJQ'k%Jw9{ 9}A1x7D~1tDhXyr3[w/nlaH_o md+H2Xð$1+~7yq%v-j5s­ S^9.ȭ2|]Qpj,$a(n,EE?|!PMTuOt)]tHVzqDWwL$='h_}FkK47`wWZwsyzX6j<8n@ү$hL+4|_E3iQ@[xӾδ'wcKS!tz7<8 4p]KO{h.3wu,̞z%Lﮇi(Ff̆:!3^T'P@׀ ovS~Pl8{'w+az:pU, (}q>@xg=-4-mƲ~Xޚz 5OjO=P-@\󣮁4Ҿ|mRی+bwn,e&f@9s>ROd,POUȪ&5(\˜S~1_OF;`:]{H#dsܗzizH@ph^Pb6̦Զa-}[٘psP2LKBcݓ rlV׊.~_Zpqmeצd̩8}Q4$DPJ`&Lgu[7ҭP!JTO|<>_y]W2ٖsS_?pǜnjb,x`OTT?S|~_燏GY/Ǽ% 5'xOP/(W5S (X;sg? %ʷ fH E]qܔDGqD#s(Ltʬx:FQ 8VO(H&@wf*bTz)rP·*aFd؄ fsǯgO9ιX\'Mmqow,NviݔϤK:A' :YS4 GXe3nFuZ7^Yb"f㰢".M Q:c"5]s5`cS<,;gLPKMT:IG?5Tt'J9vC60}DAϜTxtrxG JGCbTqb9{ontYiOJ@8B(-|#fP̓͟gcyfIܨUlBz;ֽ{$w^G%g:kKen>bޛ1,ThJb3@觌Magcps,ըlxke,<X YiJPs9=e%s!؇Ma>5e \2wqI_&1wN(\b?+`^KFS!fei6_&n%].mY N酅X/- S9"DszFm,kqSqGb4?"Wo*eC4z #ª<{ǴKk)p2]4&~IԺ6a>#qIa.)яsH;NZ2p;~v-jOs=d}=#׮2J&ΐbu s5%v}:f̚Ef3 $m}6[D J#xLm0#7ha5k|*%~^1I) `4$~e?K,󋄅]x('fmi.pm7~̦` ґY" "NU>:e"cU\g)n!Ny96_] FGܬ.RYlZӀ>ΨV'/p5'8o.S3:C3yk`ZsgVcZY*593T8jOa>_Qo͋caM{QjiE`Yr/y@я"9 U3E#k0H#ܭg cW?/.5D3EHH؞U_Cvmhs>Kfr jtjLc( Ck4Zr7TAD d| i'dz^?3*c Tu/D}M߁VˣlB9p =k΍pg5 wy:/( W4kjZ] v{9SkX,}c(AQ9iҿ4A75A夼 pT!F '"SW㈐&rjL"KRc`ѤWeoUv"87g,|c?o^@=G 5׮FAhT|%KZ?67 2FFߎ;=V8>jhAA^τ ~-z̓׎X9@v+i2^\T~ OJY| k!ImOy( a'd’z IG?+us_~yRYu׾f`\ yd'_'~|]m~F#`Pv1> 3 'Y#!dHCf}D1u0 B2qH' 54"AX08=AY a6l.j|3YG(L`u ǔA&VUF.(/ \vQShK"Vi5GOӒ:$x4ڌNG9kcʒC?#HmP"BOg9( )AY*9ٟ Y6REHpQӮ'7M4TABlq%%-<ر1 1r1AMPoA]=j\28Pu,p!Zv [xE/30.Yw lnwaY=; ] |lF,5%%q!;ϝM+{M#U\̴+ /38Zq<2`Ztw-a.Oz+4^#ҜB! tDٴ`r^dBD>R^b9jֵaOе#.3 EL~m6ACh|[&/~QEKވ=@14DΧ¤Q*~vJq*9%﫮3XվR|Zy:`C4OE]3,"[)L3$0pv Z3(vz%2߫Xv0/`֙AǬ-7|aL mO 'iZJ /(<љUl!ِup٢oNO$ҋ<3aT\$J f` "jio r1 4^$j$t_ q?`eEL  ᯻CSo.o؟PFAlmmz 5jk1~v#4rH.Ɵi1d0I*#$q3W h7 -rz"ڽRMxW@5=Γo[u%uMQitew!.:U g6HT@oƭN=H^A3ZZ[9u=Gv;D׫ɰ?X+@uo=1l ~'u[+\8E0PkO' R턿cb Cl->XIx$r. ߯x7ph[80bD5ƘֶuƐ+eaw e2>hBG-] C{yF@都}8w6J٭3.9Po/AiB-jUC{+W؆y|J,[u?Ж$#^H]y CP5R \d[PgTJ\4y׸9@v9 ,Ws(%:@+Gaד#a:m~7ـ6}d܎&wvpkh DY$JWWGHBWGILJHKMBWG}t)) % " T?" ~ X - vA4{qo~[-U?_k_}n{;K;[k#7>.?з.xzʃ7|O¿?9򫮯O:$>ᶓ̓ jU~a8y΋ǿDk}q`X3u,q8?{/IW/udO}ب "̋X.@#"h? pY:2Gr,.7/ ,0(ɟ!qqYlif=[{5pf:V4% ?(Ge'D.uQCa2}gR9Mw:Y3Fƍ ׽  $ w9ޅl' 8@%[38."-qh #197sak?9?}>9~\.]f@[sq瀘uq?׭ACxlѷ%eriMm9) :S fOE!@;,w8,1. c74P'c+a''"l='鵡k+\.FQ@|AOk? ~p3P1͆ɍSXF?lLl6 0,_ a߆Lꩣs%Í梤Js\:BK L  [gs//]z2tOU#˕lv2'ggH`=8X0By _ƼBci t"y`,Qɀd }}ULO/ҀXZmz>kEϛv:m-B2Œ=;Œ@x3̂11Y,Ug}Բiި&-ӀP̿O)5z$=rA=`7Zg9) O dRB 6,'1{$`OJңY\}HHH-yЂCE@b#V4sŖ\ Nb }3*Rt堓砹8#=BJIѥ|ͮ/C1e~.R/.,%rDo}~S&; >t<=\tNNQ6YiP4J&8-RrAm4`sgէ%-uhT%OMXGR6a؜|Œs=bXStw xΥ@=*?ߣ 6lhcA>)kG{}dH8ITM>|ڳG[$e+:?U4NU%ꢌFQ%L3MS0 6. -7k}2-qjGɓ=P+>hHss2!# uG Ycpqj/0}jn(MXMHH;Y6j1S-^cXY ꏈpG%,1Cw NQer(Y"/7ե2=RMW2-igD3RI{ Ǚ99s'IO~ $i\x3MyR\݂f7-ܟsK,h~?`0+jcWoL %:W8s1Ǩ 8d4Ҥ|EcX:Sa`z)ChVJ:DD+/Wp.x_:}r-U˃j&X}quJ --r Mј#瘤t1&'!S2,vxP[mVSrK/i|KD6T GΈ"Һ mlъ%uɖYP')R$:R,~T@ ^1Aʂ'n*5[|jG0Nq;Tq5R@FiX:,>X@!07O ( -* "¤?e.{,i4 S@ΛH%[W+tQy$^;ïl" 舞} $*p /rEKZ<4'PD TB煾<4-iRgc6\hUfe/Kfhwxxl({^;>vzf(K\ڐ"vk݃]jQ\ CNtP:%QlM)Nt3GzXoӠ*=.8kSc(op|%RPb)B -i ˻|A ^wXip\4Y]2 ҥl5I r!a.71$"9丹c0g,Y؉VƑ4bP>!'.oR^mZ(^[\rh2J^&r1\؄f(gka'Ն/ɼ!{a]ݧoD!u0a!Uwx$ ͢A^h`#]|zہO=y~a̛;tuy^XQt7;!!0DyU ޭXM,~ܙy"`kqLA$MM +TlAߐ;]fv,b*f !=2'?VO?Zdzr+ӂiTiQYk5!o@e!Q<;z;ݟrŋ,{0{|}epY=4ېT0tm$PXj;$j{d f''E]@[.j!˾(8&j:mz;Af bnSzwI߶?8y )Di=;Or^$%B[:*Oh|B8%$(hnS 58-{HK-X+3;_ZFt=ϯ< uԲuwbb dNv!=1"̉%LvsQKV} A%nm-ϷX7J 023!";5/!;eh-Yk DcnXFTlIʿh4^+IZƈ>8 {$n+~z.m PH_ί"گkM7g'^m&(-^MuK >fdnV+U#|UD,ϙ̚`2$q_ ewYwp~QgS@u-Xx\ ykLo O~%'}qXR4kw`vUPܼrcu5eAӣ%U|U/_%2ѲU9OteWy׾O>PD p.o kܳf/I<`;xzhSse~#Ja0{S|XoVr>𳆺CZ1_MB%KxfVyĪZLa>~,rbϬEB|w~K˯\yF#jQ ԫױR g4 K_5IZg:G䭟NL z |E%޵/-/r ~B: O(7Ύ.^AFi`s}==`* 7y<0WֱJ~-21DnʢC`H36Is[,n#q9 d0R{o_ uYoV 1.h9S&]AiՕv`2Ƀ0ʫf=ǭl1[CIkSAkN79/?6%ș?9_pgߖdajq|lEƇveƈ?fCF{-|T$ ~w*nzW޿Ͼ|.塇~pX~:-L(=q;}q0߿ k9y:}o|{_xAmrtεq.x[=wKp`0bŠmo5߳ADI '_R:la!O:M`L6h$&idGV/% `PFxkGF?ވsѹ(lP##@A ic 5%j`2p=HE*MȔ.2MPa3F`נX1౦I-II(=(_d#Ɏ0xuh0UaANNLT@gh7?ް;{b{ ytሓAl1ݗ(op2SB4`"J9iELEeE :/\i_hKQ.,Q/̈2<9'-8f]LdXheOP輳Bgs 3=&\ZasfmlQ.5 11 U247QvA6ȧvs:ܓdy"DL#pG\Fg!lXGfϖlZ/g:JНZZ=ylvF&;.?-z-Ȭ<F8ER4dw8hFdOY:6`eVܨ2(wS&f/<^Y\4ozM)1ãKHg-|yW[[&."GrAA_͞T%;{'h6)ZDJ_cg.qIM߰KXV*Ӛ{جdb}$9A%p)/ruħGz4g>2@яNQаp&ܜEiЍe`Be Cl9؁;Fi/W3ja#]dh vJsϯ ~m~915<6S#"$K 7N,k4ΟNYe#1/bŝNNX |ǫRu칑=H`qRӃ!3[拹,b,gG>$r X;%Y8@/&Y|jcS NI{nU[{k[IH)9SB}~'iaRʹ?V̀T}HYBa=`Sj.Y$sdr:ta(ע?o }._akW[֝ sAG{2P6 eZ#"J:LZyt~mB+?٧O/z,(iDuiNW"<7h( E)GdۉDcUi@g+-\r?**`aK?'J7.4\rğ(|֩#PqxkԀgHV4K~3X4 g'r O'…Q",Y@!,NNQ/i?Uiz>M5Q%pmIB `K7faڔlX3> lLȞh!iri}8Ot5b~>͞6$L:c툳BՔ#iH.ߣ*0JV}5BGZzwA7 Xy,m>&ŘTDG?H$rsɫjO-7Dkǃdj]( Ec3*QΒ'TU8gDŽq5X ]_,܈oZC|9zM O>6K7m2M4;uPRY}6j+3Ux9 +( orHc!vc;tMB]z7.16%n8#kBa'f. jEݗ'[ejgÏs1fd?&mIݩ2+\â_v3DR rSզkB*RZ7yw4KDs-?u3V=7/X-_atAp0g/6p֦]5V+t'j-zc]9'(= v z t%Z<GDm٣{r$@We^Xnx[ix=v2"\x1?EY<0V"} ZI,p<ӫ%U,G+)A+Z92P4%%P[g9+7=\뻡B[V&R헶'g@dTwVI$xl;nD AZ獫!2իs^yq9v̩Z`侾+١-KV5$׺cOɃ''}Z.N MRf?*`l"gYΥE4gc B_cHM1R򅶬衵NwR∬р1l-?d@|8n!ͯ,R]21|DRpc.ysvK#׭0)?%A&"u[a~ ԕ%8)i@DY}<)B5^$#c`' xl >#oycf1E[ 2A/wƷ)˩7p7 IVqh+PerlZ޸;^.<40#8cr_kj ^4/98dfctemyW~BF@q?YNeavmnB'G yJ?QkF~&[>O ٰgʺˊs` t@F(|}6X,&B Z#R*09GJ̼z_fR h}.''~\ VBM #(3谍CW-zS޾39bƺ=A4k ҄FxAD>"!My{8z? Gߝ?dFW\+_3ߘ."\SGOW9+ ] ΂kq4M {1ePB *Vzo sbl$IKhlMME o#;XCҐPI Pӽ//-C'fm9RgnÀ\åU)JȅwBuA:;/`cWsKG0"+ 2"g6er|GUPO*Yfؒ/`V XfaI*̉D8W%"[* p.4UN L˛g { m/Z@0ȣ#ZKi%ABFL@(4;kPx$-{x2wj !Yrr%59H%S#?|RZ&KБ6"N-Rp$sg~i呃A< 2#*$& e=Ot!<20BD S zPLBe?չm_0N \Rf?,>oYxI\EQWw 6/Za=_]*߬֓Eq㊻-;Vi0H痹^$ѳUx2eGwBܳQ,#=Pm( }C9k.Fŝ!"CRHԏUC&}cD͍0)8[LTYk$qFAjZtțF"è鏥x';<(#br{sIrZX]aSъAXƆ:—cGɝ@~Se6Ɵ(1ZYqlP ffKTxMHo* 2~x eHXAP~,sUqr~2+c_iHnxy7ˉ(.!IV逈}ϋf9.fsC~U,ɀ[QvE&11tN?x˷YۄmhbТ>KΞg gO4SYí,-F_q;Jx9%HQBp ╧  -XPP}( yp`NH|^~}9?V p J|h6^zLG3k-:Lsxe1&`4fx9I7}u$82i?W9AR]+B:(Of$лnx f \֎WMr >Yx{Ю@W73љfQ΋I"*/A@Oy!f=4l;QНM5u}#P)Sr? 59w~2j:F0 pp8=ff a9-5_`]ssytv:*KLlؖ G˵E@-b> Ú='FE.b$ _[ . TBm.6‰->ayG3 g# @ZBѺ1h8KGSBe f]9Fh-$I[YySBq9ngJ1z͍i |{qxV&M%mPLpesK`T1ˉ36xN[}EӤ^Q+Hz@DkHu(k='2 K@?dT=H^oM5@)OFQ=3\y;V<4/g8D|B$2J?D6.#+gcvgӿ~/hEWqkOL|GnpZ3<#kRg OAO+B[.]K/T&bKTh[eD%2tP`5x3koFx#1:sXZEH]k< Dky{w 63k*;Y A3|(tv&[ë>'KLVW5F F0v篰MM̘ޚo+П<͝3Ê3VY8qѱ lFԎ~ @{7>c/y#᾵r ȓfO@ E~?yj΃핌MqOa2綤?s_O>ij, Y1 `!D[K!l*`1]YyvC:Doeit-;nzPGzfߖ 6ӜzQ`)e_ߟxtrimKw62*DbyI`[;&zX$3N,i]rq)e]ڦ2R0Mbf YGR^(A"PI.ڻ>Q@]rUVSnci ԁu ]i2w4 c롒냹4Ȭ+NA2G2B9bSVF& +Iߺ`}'^~ak~sA?* GF93't`!Er{+weX(s}2zbΝڱ @o=Il-V1TW$rJ 1oQKMNJESb]UuW@R~B-dٺW@OWox;"ڵ-J47= ބF_}qCߟ߫?n?q/_?||=/vm8?o-=&\_NW0qn8.׼Nuʟ{?%}+i? קдNɹ/S = E>z ##fhnV5.?ɭv0 {/}FO\`Ķ湅$\I6t4Y)r0:8gpo~rrc '4=G` Lj?\ͥ'nNͨPG!E~g\ 0 L HX ՞#He;ڗOJyR1*3 ܏9 : )4|'86nؑ8,J613-Y2HmlDalNE#V@J{ǙFY JU]!#XiS gR也# ظ^w~; pr92!hZXDěc.kVV`xe]~ӑrG1ѥ7Xc8ў]|!gBNSbb#_M/D?BY)= '>_,ΌK"N|gvh2'yڐM{Os̡eP(A=>sH6taf(׍c"Qrf4lBff/h7 n>wx 4wT6* )rv`e榤חIVw99>T zIFOˣd J|Ce{5&rcr,JtYRJˀq1!?Dl S-J"x0?En0srժ_ijK``(,l/R.\Qd7$i?-Jn|dNKj,DG4"Scsp"#4rB0ʎa(֏<]~fMxC&$U4, 1>J2K{SUOgSzX,EG ҆L{# sޡGL? ^al>5aǘz֫ǺSqP-~lP>{Np.%?Dx;5ʳ͚gc՝G$8,.z?KhpNpع3c Td6[Y R@\p /ii tg FqMvU1v@Ue'tdvcb%A WЋ(뒄ŷ&{zø7/t]ǟSKMBn)ωg\ nnl QŞF=Յ^K-OG\7wow#4C,+Ґ ,!*9˽hL:%a ;6+^cݳ2Ɯ-xayQ|uD+N N<ϢQO'pzCΆ< œCNG #LW& _ث8>MѱF0GN5 PLQ><LUBJLԋ#s,'!c$ +{i}c9F ',^|d-G]1!J8=<#j6Tz `A:GOX(/ȷS٩:5=[H}|mϾk!;3KPΊEȻLwLO >/) RD`fyQ*5҇zzG@8#wk/,V~WĚ;G-,v9Ζ/a#OHI"<6ވȹgS*,4zC?ٕ+/$ аVW'҇*3#ScsMcՙKs5wL,Og "+ϟ$ 8y J="NGm286jWԀhfW4BLMR6Q:WOҋepvii;=6Ilg~\s4.ԡ?Xtׯ,kCI||lh)qrE8(~y' {IŧɱC__k5%guX?ΑϩSOlԺHk_ <}iybBKX[{={9& XMֱ0g5]nj}sWFN\u/8/-+mw/+X}cue84dzx#pץH9C|IMTDހ(辺FeZPxf1 4oLAq6Y9.ˏ҄K :UL 9y Rg"(Y2?Nx鑈on"h9">Exݷ$PUVsQL y| QY\~|Y̢ AsF}:K{p6-TF-p˾pew֔CGQ-=@K Ÿ`(~Ev&6(a``sJW<=0l/h,0ʇ<PAJd6Z!*o`cĠ 3E hcIWEXJIQ QP]lc˩a$_.z88+Ε"^'ZҖ=6K3u>E*VK F 6MSEP/bQd̟F/3~-A" }RlerSᡓƂAhH%*AR1yRƀ'0[Ԁ~_.1~傂#dr6)`E4(wѣټ|u7G`N pǝLO00vQQͦˀc J˘Kgr_k;U?o?G}~-^߯P.{~g7y?=>t>+N9n=Üv;(|C\? 7.眨9|/}Deß/Q WS M;,5mʜr9Rop[G~A+cȉoe|~?z?XN5Q$_]]֧5s|^  q$ʇ%Dw ~uw,h+GFrX#o#u SRJ$ײi)Qr5%F <-9}0/|Szզ5TI*gߠ]F{xN$ G5kt3Pzq(|{' x)Xg0@$b)#L)5}(E#d[%DG$|#TcA3Y)p@n P2=Q. UNt1y/b w|sxB2A%3>eLё m4"JhaB!ˆH[A&c ȑ"zq APHU3f"PSSؚ$0)1HNČS+u. 9g 8MX,A(^ƃL]b Q3>OPF @(Fx6 SpF§!yl+afv"+ qLHB,oRK1oG!31T#8lJ?2*qS*">#.m2؃ Kt#71.`2SFDV ;-*#I1STbz~V0?Ȍ7:G$j0=%銔":{ 2D0Q O𥓋pՈsq#GȒ*XSZN#$3Wy.~vt"{XXBO}gxhì!ZYir04/aa =́|5;ef BLB[Qc -^c5ճfq_wܝ424"+ps6F:)o8^k[!5ڄ~v pAjyuY4lu,ӥGxxjFcaTν(+5ad\Ph*|| MB0g?#Y5!69qrSqyB,AJ,;Q!;U0^EGK&L=%n&Y2'u\荒BIeK*`LN=Ґ -|$K/(LW2td_ qN^.g7zqBj1?4Cw#.S%3YeO: 5_ lVd+b<-dj>{ã|r?_b4MհѶ*m` ]<_LqϞ&+-ێ.d3$}^(E?9 mgz kU AqڗY9O1IBFak~{8AV(wSϏbhH=c{=p1xpDBl4=.;ذs LKOlʬx0_-<|_'v M\xJXB}\dx Hϯe<9E/ &%9c.@DlZ~2Zwd˓QlIf TI@FdJiy6c.)]a71f䔼zF)_&VZw:"Xi{+u!t݇Dg]H\E+|,O%g &.N.YlrgRnb0TЎ|gy "̡C 6ֶ) ˘\O(3`c&1]7 @@%50-'_cyLN*ji(o;_o\1QSTa"!x5zW4e=mz7W!ޅ^$բK1(R+ɢ㉊}'*5֭z՛•mץ^]f"9s8GU2zO#G$zk{T,KG=;(y-{lhC]#*q|:'3x&X.@r<{s͑y2˅mwe D P zfRnghΦh\2#/%mWBU uH|9rШ$0dQ [7_O$SduJBކY_!J$UKb Zo iõN (Vqړ;84ܻ& CX9[ځYŸc0k߽MS*ݗ^xUWzO2DΜJ<A?ϴϡū1C!&@Zs`Aǡ8)M{b+jM=#l.yRL- `&s|(;yI(`݅1EaBO|@6<\G23z{ GB<"X͎10\b[="6h|(ǐ*WcjYZ_#/Q4_P\>!ČIisxW(g9qGlȍͥ eR'㸭%3EU[>=;<C]+s&tq?)]SqEP#Y-Y*`x|Sa=bML)ϥYsceϑn\BZ%sQݲ3__C1kᐼk8-g lTI}$~*5Xjt+?6^:j0J߿ L;2jl7.^eXO.bO.{bݬ:=]ʯK<$ّKvJԼ#\p;3I>I =) &֝# Kt w8vvY6oިt:)N}  $jsL*T')>1<hݤ+y‘Z}y<&5#.^|q2Hl&P(6-k)qr@͎D4M4Ə!3}:?D_y<1:Pו~[<ơ]օ H8W;((ߴf>B=m 0U ;`eMr=Cf?4R QF2 ~_ fB'>jy@KJsp!8QxN~3,N{L'Ղ򏌫|kB!NUH)%Kbdk7O&O?~^wU{٧ro/kpvyrgxXm/__o~?g=?~?3Cͮotߣ?!3ϒ;s:8!=*%*yǒПszk K3œ Scw5U,BwsPnBJ@JARn. _u?ILӂo!tJnu46Fΐԃ:#x?nB2̕b 1&v.jpA\(p*?r=?<>VdUqQCV*f|CKQ&ttXF@`6#+aA:-d+C5DbMROG&K!ťQIY2ǖ8hc#FnA5YI +wM ̢{/j.QOIㅈ(t;д9(4{,ĉ<ϗ+"qXأ6J47ȤWLx%J1_sB&O1J@kbu5bH͐< :sV:2>R!(El~*!rYq֨-m2.?Ohcs)kj CegeyN! +IPNCЗC.G#cƷп湿Pe_6Q&"w,2_Ȅ<̝'6=OIY!,p?Eaqr0muGXuY҅jpa]i,s)ʞ0 f\w{'hD;u#ٕ^QŽbM?=rW>{bB ȬQ:94e\KI?X̜%g(/!AxM'w/'$_ӂ;]%MU=}Xmי+[HLɄh'6w hQHDYr k0&3:Y'̲in!aQ9op%K%XpΪT1EX4V$8x~*Đw,fdLz9aQ99Kk8%?V h988gR,^7D1}!b4b1gjcQs/YL]kfs9-őgq;CG>SFsᣊ&)Kws,܎xOܡ%`G*F+~#˨8% 7\rnq|r>#OL{A|E ;)!Mq|GOA̍zIz;/Oٝ̊{fν<9,=(EOt.ςpf/AD<J1YqGEEC&(q"FsHxՒv%xSWCL*ξhܞumc/'YuCr8qE)cC0Mhe). $GAL,g.dAQf7KN#X.HcxZ*{^r×.nCٴ訸~T>%7ӈ߉ea /"urȟy@gɠ+veFS/ŁN"zG | \ZV_4MWsxǗtDݲŴJrs?$h.EO"(d\w2wd#=G>X39 Z( Ѭ}fgfې%ْUVe}Z7^:}SUT?[ӉQ# ҐƝe~u4D`ecA!)Y)]x\8l.~1DZ(bTp)Kؓ6>~|RɋZ"Rn\cO fp?9N}'~ #(K,<=V'0uȳ`a9<<#s7Fsϲ MUBZ:폺0e6-NhߏH=Ψ~"9GS9aP(D< s5 "{gg)d(+ԨLyUNJ\46ռ%ǒVv%ώ/(Cϛ?B~fMtj!zF$51Tx5Rjhg /|k&NJV7ggvUO?j/e [dyQewvpkhܵDY$RWWGHBWGILJHKMBWG}{ "#"3VU d g 2  &3\/HdOI U(@; ĴAܩ;Xǣ`.S9-EvvʏZwuO/CK?\ء\&@ e'ztpa*+\roRYp/IŢfY: 0/KDaUN\B?F3hOvĘo|,8O 0CRljuQGRu:s6SU5Ř72״ތIq)+hMmYxt#h(sLML>#Ň҈ T4K}j{RȂm ]n} _pVw=/֋z-+Xg$,tOÏWԙφ ~Hb 9\$r.BO@S8`&?å(RѨ3>NՋ%ytw%^jXXZ6@c9q }9S ӣ9X(X*a'.8΂>;R>I,i1!^vTre}ԍה4YD}J(Qrn,72w:&lF"/HQNq#C+\6H6 l`QyHPK/ѤbK ;;y3gRXaݏcu4>IYhr)3$?yff?aE,?,feD\T 2 kfTe#W?%Xlz;{ReApaB|=<":}&@ ">`iÐm,:~J~&?ߵ?~v>~|<|:և}\SǜGFvtRe <"ׁ}U}g_~/}Uz=a1]!ml5"JQpsZvApRkˉ 9:j-J[AsId&9k{<]!"  7z,@4% U3„YxD9H" Jײ̏ևK5~X`n6'tm4,`阥t<{zBR43ؗ" 'DyxzыLCrmh{ԛF,Ju!e,yiwA^eUWQntņԵ%#;"KZf4e$v9ڟb9$.!Yx27Hgy2I蠟δ6&pmo^z p ~j[ţMFLYc 9!'F'QܞE Wfō$*X|T]s#-;}}(Д?/Sx{,~NaFw+OY\$1gfKe2#?(<,;wJVEFًt%Ie}ZID~8o"y-YPyd3لpI$XEih~OĊ燎6m҄w6O]SOD??wCq,: &,;ZuP.]'Ч9obR(˜X50tgƴѩ=Wa4&O~gqI3`o$~>O'$I>92)H&?cюbnI)\| }A;4h,<?#=.:xJGxSM : HSg;kR!}\%VLSbJ^yےSx0/j!/{p_ibMhv~;`ni8-P9;,\x8ˠ339/яpl> l6",0;9UNխ=ǎ>W>/cX b#s3"D\40M¥Z|f$8$wg5V.&Тp%KpY3f $)+{,{U#KK[n>QvYT ?Gm!c:bJa4詬d(F-NYOF5W#!{1F0חka>M-Pp Ru& c-OpD'r!4=DDysg)jQ6sxPڌ=ɉ]neO4ڡ?E5gHԥhDm } 9MAsg&$Ҁ{8F/cFiʲ-'|~!"F]nS6X^Ry> ;b;vpVJ(/ Cz'm~&dfOiX\N<Oܙd}2Eț2pecfmۜ-NHt􆦼7!36ӁSGl)%^(?Z/j:X 訜(x=r\| hga> Du.1jp"9bʜJҏpȇ19@cx>Y{0hWW,NI lоWjӧpuRڬLS`o #̢3q4K$$/@ĔBRJ:3]$ d(Ln.Om+,+Ǭs)V-Z_f^rGz!4%U)oTT;.ܩ 6AB%J?Mˬf;T0Y&V2&q5PYxɁ iUoJ)`('e>$* l幛mm Ey95?]& "5!"ղo{:N!iK\Q\dk%| aE09؄=7L"_xIxI ;lz$Y8D:WdxcdD޾ǿJoQq-ӳ\ Gy-e/)~]k z=1aCZ5E5D0#+>̠|&7v;Qu?*)(58%#t6^1X(ř%ȵS_ Jmy2(]^{z\4Rl4Fxb|)XU5F𣌽e 9AJ b&6 ViV/$ƽ~JkAЯU]ϻRYoGYw~9cY1S3>K K D\7prpt3~m/%C(tףClVҠĖp܁;^F2{x}leY/~?Ilri krV٤Eǧأ͢ 6%k7/qggo9n&.>~j)oxX`lN;[Žț\jU`&97u$an-kWά^Q'OS K@X+@>ya1ra Jp;Djenes$Zr|@7c{"?/x%lq|\ֈgoΔ |)$P]Lqb'=߁Y,tG:s =؏TLΜ BYO8dͪqr]Z/⯶%"W~nLáy {uC\ģ@=:y jf]ԴJg[]ݾVgiUl:H͏_}v*RoKVoRe¿zI7 M7z&"=y2_}1{%?gpVɵ:[wft8X/acܐ~Fcj~0̩Rۭr?6,=p ;s:<{?Geyg3r >u[b܋oq]-u G|*g|m"=4 sYsic:ةF23f 6+z_HqǘFfVԞ.7L2{c@""֏&칎'Woߛ[-}{ݿp__ç;,7ɚK?;&i9b2BuG _|֓ãra 9?}~N%V.WZ"/æe/b>M>SƮ }L)5߃ݶOD&ڨncji;։Cϖ,w$b)ZM&3Kġfzؿ 2 Eig#s9 |Q5m!Qf)a8 IMl+ur%њ};fhQ `BʸH)e^Qs3;.8x12{Ya /Hdlp-{# 2ψ%E.,㙒-7hLYfxfcL?+ G ]SϽa!;s3$0?FL(7%H`t;:7*|xX1*ȚhGXY29(ǖ%o;٤( B6Y ~/@ߟq&)3+Ch s kVO=vYu)Xa{PSg0.";gO/hrqNaȥ TJ}[%Eg! rP{G~QFZZΑ"Tjߐ78d,$?Vώovz f9[j"«)Zx+Ӎ hDt dQ?%DMNR"UKj+l-5s#M/F:V.xnR֘KqYˣf5&\Ɨ 7NT>'U615}4"G*(P2H8Q"Euߞ#ٰh+%]9'#~|s¦ ]^¶O}"_i)%w,q2a|0,1h"K!rA-/Y I ^HzM {XLwD h;ƥ5%ˢ%DIe- I=oo L|Geii4;T𼄊Eve6ҋ^j˔fef5!/yÔ*_v^ތekSyvtxO ]Glly)KɳCuJZp&]6Ms`EKөZ)湵$}{IC0,.D?}vfEEN!kMi9h )}F.l:aU=`2)^$ |1$5=w8wzaA\F #[4g0T~v.8O|TOXZ(P5CT,>D9ÓyDL,z?]]^ʰ'-b$QAq ;}Y{sL*,D :ps!A#;SoW[F2b^I]cPMFؽCHR}jm!<# O&;/[S\97ЎˆԂڳӀEc$(ge#o𣖸ST)A,* +0fIi{ro=](P!XcDRăVH?=摈 A\ -l+)%Cei:)z,)6W;̕!;EY ś}ֺM_HXO'j3L,1ܞXύg¢czUVK" sE8+KчԔeysO#W f5`\:k c*@QM'r;1: 4& %- ]4#(9\tC-.}I\|Z؜GSZ%ndž Ŕ[)9 t$6&`޼*:u,,NX>"Zl/7W.KmLZ3wX)v|,Y8 3k ELYJ*_2|L}zHE>'a+;ŒՊXZ.51U5HBKF˿ĮSj?n9h/3F)0&4 .=eQH:)45?6pxɿT&ES85!͏Oi4F:V8ʚaf >#&;7LI޲V' ,̜@1BlaEs]Q \Wh~֊DlTXUm]O[PE=;YB ^K5r% B֜{i'߫-w*4Vz4=y/fJ96(@բ s3`)VJ 6U (K/R^ȧ [n %|_SR"7J;!4r^&qI33GApga k(X.6WTB>:-HQI_s Lga@ #'*s]?M:+CDǯBOGE3^}gfvPfE lӀ5̋_:27iAr[s_t1}DT ևȓHIvFFl)|Db1,C'yA$ YM믪m?[$b[*V(zn8w%VƂg@ڊ_~٠#B+j},a>hJ禦v]tfMR0z}4)ZOe;_0,pF~ô#˰X[۱,>ZKƧY6*D^yH+G G5L­4lKy}.`r_ T<$`xhL\8j"2FXB r٬ ,J+~ϓPIYh!«˺k$.4x(&,yT>lYL"?hPiOX^,r9\47./UsJm`ǿw={?f/~CǟM=ÇC\?ӿ9f>N͟o;}~؃q?"oo'1ey^wWWg?/?éH|>l,>޷477>vGy|ˮOct ^ԁl5&/n]l87هvB[v(2_z_qc5!a>H>9v{qTQwNam(GA &#w #ԡqytcap>{`j/EAtAN[8s{4QnW㐦hc&2 )6QfpzL <Ga"V 4l%8va [%zChH 1bu"B'hz@0GAK)}$%) r]Đc΄$ *Xitq sh+g:"oNmJ00>10K!3v!!pgdEs a|.#ebƅ&:J4h/`.(77k:qE{;8'J{cPB0.GIrjp0 Iv\qxUotRlYD5D 3[ރMK_lH]?kIy@|<EdpG(ی$SUk3\)M2$tw?k$u LLkXYEaT#tǝJ=:,jjI@yS $ ?F2t ʽxm0ٟا^Ku{< KtȜ6߶MwZ- K=S䥡<ݦbbca$e-37GIڀ9)+((.F 3},xJ0gM蹒NwQJa!FI-z} >9$F?/ E<L0yEI# 9iR(K3OcpF,{/X9[=,p{MQ%v6yU Dž< !H Or~߶_:&eXh=G+%sSM=J0hh߃nB2XMDhRh"_]٣9EY=%K58X!|gN$dgD%.Y҅=Da5Y-Qz2[Cv}ϝ{)-xbĀ?H CPӁ꟞O y4nx Yπ<0쩽e܈jB2$!+5o+s-ae1qCo_zX?<? 7\_BugD&ekb ?V)WV.6UMdn5Jd~$[QD1HP >J^eQ*4L2Q!dbz#?7?$Lpt"ӟf`]%4i5]KBW1#.ouwʒoqx< ꏓ?=$WZ1Ϗ!^eČN}0ˆH5}A=uP392JvlWG%$Nb6{_ &sޅ>MQҳ_ٯH&>@%Tϡu4e/ @fhKݸ]rhylgpOF:+VjTtzQ$v?H%Ow,4_gezK` GJ]_{Q+Ú%~.mqL[v@=?P nصVdlqBH xZΚ\4yyXS\*.oeGF,#^x|}cdHdV$:|4q[O;fZBf-BVkO }\K 6!ٞw$O)]xyW^zעQ/}j6XQA.[-|p(5.E6-/|>ˡLyY 4!Q3zZ>`/CA(Z+{=?s=,[;˃W~Bl !4zX [xA]̬5~ڕ;{?<4-}Ed]x(ԙSU6auʩƘ+=֣ ҏU,c \,aהeDǎ K_XYG@!X"~ uH4WF;B?هXQ5s_L,TC*G&TQ(娗`S/ѵ@~3<Q[*9>M[1 E5ǯ}3H];?4Zg*W7p}71`{Kv)YeH.@MlE#5Iߗp|/\WQ՟ \O - $7%?A f(Yb>(bwuM}4f"x%孳co ^{a,h] x]Cȧ}Xao-F'![ۿQJFuFz=6޻ޙ4 UX+'P9/x*䞷R;B.q_QD,!ቍ]~:yPRrۥ@71hҮ-꤆v*P eIo}$yiQT3F6gb_q֐'Yp]/?M..7653LqX\}b;pGnIȲ)Vk҂Hqz+`Ǽw/3.9%uNBgPQ@2.)/ߝV-^@ƛ>I/1a;aֱ,v }7fD'DS5O9Zάhc2'/eS!a;?ыX%`.SEzlhuؿ`ؤC\H\!24;s]Y!M*?˂?Ppw];\>A$@i mŎ pkOBra|95PR~7d5j26;J@IXjw_)}YF-@dڰ!OwPY#򇓃t9Zxp2× bw{T$s9@J$qƘ:պvgHOA3%?>w!Az ɘ7XX䅛7\6p w'Iue ArVdyVL9<טbSlS{jc î[x1+ӇJkI/ G7ZCg!ko5?]O| U)OE:PKc^BtSAlO?L*g<;%Z/ڲl}<'-2 V:v^Rm#q 粗%۷\ٌRp!o=jeibQt˚"B*R'@c)K|ZTm٣MpT L\x٬r.usES??s?}[~[ }.?_ןq7?<^]|[ eJ'!OAAps$Uhvf`~_ߞ]5_g?X1Ox37ßY\^B aw_S7ߦuW__>};ܣӢ,+Ԑ479XQ QR OY}H248}afn 6gpu8pB Ѩ6,Sph+]o%Ѡ"RW (9t k8ʑ3HlttF!q `D5fւhZtlt)4r%V&)PH@dFz;(F7uThvOX f&~TԳ?qڌ<^ q%y Ng,!T`a<~qV/6G.Lßy:Ȑ9pjt-҄sIg>w܏\0A{'/%cz}vLj̳3})^$,dy/|JRN Z8f͊>5p@vh 1:ԓ ?Fzoeą=N $z Ig&& P>e:t^,Q۬2kN@g2q@Ҹ sg.)R1 Y%]rHNJP.P{zqR(!o2Pi*FŋM_f T֎c~>/;x$mJwNz09‘=#|f.i)thu7wYLjB4K5azyQ.,|(}<)NgZ"4) i~M畿;l*/3?EQDHѤ$1A>僌ҍ\ڸ/Y15YT^)ÙKjYz9%%(*ſb$HʢsH"ɥ]h;q<%t[MTGS0[{3 ]F,y4 si{e5T&M&+MV ',mƆ۱w~"i!,\+Y;=$ONYN2y)BaaS#$,Dݞb#q\±G?' >V ]rXp,Y7_l(N\vMGY%1c$ɈLT΁g ?2Zt"gNo>-_15E<=C=w1u P1#?ȿcSD3!bE0Oǐ"O1Hb /3.N{L]gFuI87;(4F?ݰi>ʠiH '0ۃΕ|#XvKl.TR[8Ot'j4~(t¯@o{o n$]PCv{ƒ aN?Pjpz T_A.hu{_ezD1y7:w܇&6oφ!C:ڻɫ?J?uVڔԮM^Z(58 ^p$+v"Ex;q@~@X۪<苊w 佁!( FBdlA GI1 OuWvǤlEG$XdXy%jf  ;a>~OK=6xG&UؤĬp.xiezG򟿙ϥ1ʁ$cCۤ7QBnCPL/PGLREqL316YňU/'ۨpv?:Ϛ>%jbEܳ?% қ7`1T&q/BEEl4=/!!:iF|,S`(8,(xԞ#_@ia皾4Bm-%&;F+4\{`1\;cІ1yYs[5-o~ (e bY`R7[k2nqw3<7A4cPC`Y9Nڻ :VP;%B0g(-S[T7ꈞs?#Iُ0,/ȏQ!30!+rj}꒚;Ж6bމz&ǙzNvd3۝唧p(򘞠)c7`JG_Z7>5d#zl2g7n-\|Z,(?1)T~vW}^ӑ Xقµ0RIk|_]cK3.x=B8G~\(%6yB U+P?-_N m M)B]p[dA)SƜ;l ӘiPK# a@OHԤ:QP ]ly*_s+ԖݮfF$c$'Ơ| h~ 0W5 Wfu5+-/.//h YLh^@*`}H2wKl>Goa*/EgqlW !2-Y>Oɣ}`A;nl7N9 p.w47.*t~gQOU*fxEkh)Z_s]9SgGv v24dX 14@>iٓN4jB3)xce쌮(e}d-BgS'x [нb>$l'OyϢ/b@Eپ8<n?3gsqÙM=0fb72C#^"cP, iV|{JOĞ>2ڰOgUm11*ױ?l-M$e5*LR==B,\JX0KPĥKX :;k()b2B?)OIwxnɋSʴ^ZIo ǯG1Gw><x畆>]g/Qu+ORmY@htK "8"2D(!υMFz9ٜ /MNiD;g,E T-#em}9ףWd^'Ϫ+A I#H~R~^EԠH c=,c=4q%&峄DSѨۈD,_;v.Lu5+xPΒɩ$-G _N%=QMni>qiFlE;#m&"E`8P[UAac%K%7jt&/n‹VSx e92 UF *Sz=#:lOʉz`.Qf .\W|6bɳdx湉I֔=A7[&QZDpK{X`$C3}$2<貜OBE*Ȕȱdb2=D+}{I:x瓀r@AA=ҏ8XFU:&cYZ,!釦xf!ѕE]01\6[,AQ{uA;*$rpe"|SqnqޙEVi?YeƟ=I%|_qlDY&$H$qY,&jʋ[ o UtuVNb=M; @I4@>9HI~l@{la#ӾS6W*SzeW YFa/h>ehyO)Y)}YD"O $,&KD Lm{(7;܋; ߇B%h5DTsg-j CͥʃQ=D؄<-}bL )2 `CL(My o|ĀqfI_cj)B H}ҙ6?4 ^4#4ȂK*_"9{޽G`UŘL=˖d*Pt7\.4N?M槧``gavN2,`\tS4H{KL*]?dm:I{+0WC7GЧ4fFDHPE)dnHL,5{ aQS.tv Hl+\cZD?/6$SVF5t{6̩`3/ddOm~Ty>Ï li fu.M:]jUx.ӦH '|p$%Q$kx=nC*9*<~ez|4//7@YR̈C|;h<4yH@VwЌ!B9zb6#5 Oq^Ϙ3s 5/@!v IҥKREw,Dإy*&܂m) )H.u$b:9>Z-)r5CRc caoF#o_^bɅZŝ4um}( .i?Ol?Tԁ~HBjCc %L-Q禰wp,8&7=/נ'-UUN|TPHaOS~5H!=5--s{ tua95 hd3}>@D >.s!We$ڌbuYMOK:F$eBvD=nj11A%z#' ;$uRB"TZ]W=_6_J^SNmjp@Tdt/Z_YίG]WgQ.L[V )h}]?X7G韯GÏEj>xV禘B0_6P7ldT^$i@⪴&]2e ^B|&̔^1g`}Hd$Z菣ͳE@TZs]3k,pd{I/]N_(Db!}^8D?0~?#bru#㲪~X-g `ԏI R'̿,`*E\oX֕VR6F*HwgK$bG!vrnt!x֓oZo-Utm؝q<2&JH;L87?Jxb΁|S8\ƨjDM3,vRn=ugۑ)ʊ`~:_O/E|S]$KHR ]`]Q@ظKm}~?MPJQq$jtƟ-٪QLۨ$,12rn <sGϧrhe2e*Kl$Dg{GYʺv޽ȯQMʝ%8RlA6_҇X*eYGԗLGX 2;z?lN,se|d+¶w _e].-S\ p` }8AG9Yj0^;G`RZQ _n咩IҊ )ca*|",NlepV쁁Q$9"`dâ;aJF>+Iqy= P_?.R6ӉXA6m}[`zONULr I($5BCϹ<ď%DwZCn+|]fS#{)M cJ>x8R$%rD.HP 4UCjM# /nZ!R"C}LGJ=}^ Yrȥ< ;^x*Xۑ`/!<=|i9 VcOeoO̰ȅs95,f\T5ePYL?Ge=߳zlHq犇0x;<2 ;Q,F [ax:-nܓ%̟}RvЙ/ȩ;U?a *i Y⹠eRdxə<Is_4^S̵5.ץ.K{T*72NAZƾ>gc5f=ř3j9?5o%!mpFK~=򝆡n5ӏ^cc"#p@0\K( :]xWZ~f%sn^鸥"bq$0RԓPg}g1Yx f__`/Z(u-1RyǗ$ XA2{tX8e6A(p6jժȬlx2͚[檘#}Æ L6 OO"1Ayq 8FjH?'H H7J64~s9'.cztg=t@1lhS`Ҡ"y՘u?Ȋ.2ϑ–ʵ>./ `VvDZ9xpJM!P{=:+7 :D3 Nq4g㳁:6#e#8m9ع$iR|]^̫뵴V菳@p=;fթ?}>OoËw_q~+5_C'ȕ`K-z볇/.K-K\ U9d`8KLUyy#1RC=ϸf~-ԟpxv}m꠨<,.;;f&{"(}QWg' I ]*)O= /bF )Cg],995 F ̳xC'A鎚Fu*tR%Or@X{Ba+_&pvS3C%gO긼)|Jv8`၁ECYz5a]K:R`Z?6yLjJcI GkdSkD^U6/LQ[ {k#ω|$زQABxn[">&[*7{E.>sY͋%[y)$/RD=Epf# =D1a&9Qc[w4O31E\Z~ֶ+5 57\P6&~e|V΍9 {0%jO3ft^媥cِ}{>RzIqe-k,q,pF{M9DNQ%,;jϗrːQ ьæύ"NΕ*M4K- 4_S{I֍83®#Mu:R~"2#q%؝Sl@ػDOQ9MŎ>e)r/ B;"cIB^_Ƣt~SxSxݿC MQI _uS^DG8W!T%ޙ9TqKD1/'Iϒ&_8M}=%-KBi$e٧WS᭲Muز٩F࿿TcB6_:[pJ`1:.O x!c$U|6>xᲄ鬲ꀬZ%g Ͷ,q4U¹O2hh=MPP^CAzH%SO߱zAiA 0/M6V"_FO:~ a@Kh<|/}l}zb Jh67 DG Yѣ3D6ece4jngC\kiw.U re8Θ/A <} NG#qwvpkfg bDY$ CWWGHBWGILJHKMBWG|}%     c  z3@:V9^#J?ے@bis 'GZ%ȯ{JǨOzEP'yǎ-*V]_" N@ 4wL8QF 9m)+{e#6X+7JcM4,E8^Xq3G-)xE)놱§]?OKF!\p 2ԆK_+XA_Ah.XɂtQ4=;yv 1(aA RwiE>褨U4 j^zEMg~O !ӝ x,ayĩi"!f,-a.5vVpJ C[)/!PGQ xQ7ϐȅcOVD4db~+Qgh(!u0\>sNHDeqT26]b).|pQv*%Gh2A r3_ u`^_ʝt4VDX1cKT#o "bU~eEcUE }J ?~f9yM%SʋSl99 ~ \~4 n?3O[ON;<{kdk: A|CRӐ2)C;x<_345/[fǐ)^WY{2oT:MkTLYGu'wժ%N*^h(gJQb `a:E`ח:(Z晴aZ+6~1䍬:b*/(('2 xN(C=x2X'v.K\lf"Og0X~4l_[dNzM=O0+|lh#)Vl^^A*)s;H] Csp~?Q cy. ܃IF1|MބOf SY3BrP+*Z5vW]u%JuVH$zS"It${J8j"K OÀ lU,<)"%{!a9/ciʭ"̀qXP'!dXr gEx(l)p69m9VT[2`xɃ$^Ɲ9}Q)e:"qC:f/b}~rHO/L&/xN5MЄM&"FScm84y Y25Z^Hs?Ts"A{+t?,u*׀1`MEQMM#&20C̭Ox8Q$ZFÝЍ,e*tVn7_o&=@c: = COLhA~g" |'CE=OYSH@sy c OzL-+"3;Wj_3 UUD:I&dHDR|ZsMk /8&bu66B+k"Dl&ys.By!Oڠ;Lp}Q"na.6Yޅj-pI! 5?gA=EP]Й.!D@:z@\!{C4=$Ң`=Wh&BQq(Q#t77t؋w C=*pzH#mg?u߅g%P" ևa}i:4|hF؊GJ ڙw'pR((IO@6 ZFn:k'G 3-?7R t<qxŽcJ"Yyԃ^%T$rJ0 >zbOb /^|_=s?u\wJ%߿=~_W?/W}g_e}秏?v?q]>sou|! ?gtpv;0ǫ?WTȟjG?-vdn}}S<]sԏ5tzt+}]qqSOD-=eqpªa$\"EK G 6!׀ F|88CwpW8G*'Gq.9|*=^L_x]r3M,1s@|&Dsq˼jL zEc6öĘwX"LljesܓKy*_fifl^,#(tgq}l`2]tϖ+ã9S :bIJ; Aݸ9C9aE[CJCY\n q|@0m️s=͗ x$,@=??%;mYds6sJT: Exqa{<8BїnDL@tO<>JbX8P4 $TsF@d9]^KְijF-/S/06 w8߯Jऺn6Ø&i%-)6 +QOO"}?iRX<K-_w EJpt=ʈ_"e!?8|e:bܘ*ET\B#XUi(xO&[Xf{L!%#![~rS7-~i??N۸fTip:㠜t =hfwq6 lJNE2p ."Z3|gl-svI7)VBm*Oi4 F =<<R%׹@A0Bu*)yH p9+e4|(<ԩYɦ(ND 2$\G1xPE-֞ZQH31Q$b5/$;RBji ћ׶e>KĔ=cؑ4֟z.( M41x`'x1wQcGW\Zܤ~i:r.ѣbefReq\˔:l 'u6|^̅Ÿ&ۍ0屴YpYg?=؍vP /T 4' 'Fsi`߸R4cyq }ˇiE>'| \Bk`ͣg) 0 =Sf*-Yo&1Ԥ5Zs6e X^ÄHZ*eT8/~X+.٢` qA+?#cӺs(u8JiBs{QYy-b KF_R6͊T$NŜiÝ&@X K',sY /}%kL4#q܊* %vya: Uq$EW"^Yѕ 煗l"î]71u+)=rsR?&㡪X1a(|% o8"gNXcwN^X6Dr$n$>< y+*w1O%JRYSG\acr#7wlV0O9Cyc7t䃧? LcF;# \mFm6k˜qFdQrY4K#$;,0)F&$?TпƎLK$z$̀ "0##؃Rm+5Vk5Kmq1 = /q Is =BKhYS~n3tHXeA+{)MAp DH-Ϧtjd l/S. $T\CKFG^)1vV|hB"@;qx '/$Kz.iY>Ľa KRZ[BH3--qL;B~sSߡ,HG9Хi`/BٹTv|&%wf"j M:)*2 L\^>b tGW>N mo6x;g <'8P6S 7 5kWҳcd2sc )mpMO[K xYCMW O_1mZYq jkEtD_/qw%W"4"tY,#QM2`[ ď (fDRld.&aoJTňg*L`c}Jeמ#, w[Oϡq>椌5pqӟAi?:wVX̮1ȞX\VNጷa"|L~r |Z.HLn J6?śDS&_1jK9bjSLVg!'v4KkcIh^6!23CU= gL^o [龭ߢK&FlG>y|#AVGCG!8SSK#Ӗ!hc}]M>tB>7'<&=vqxfYvhd^z_[lWw|mX!(&XF7kcLzHƞΠo9 #`_!W_LǶGQ( ꏝubrƬ=qZF}@g$Bu'ASJ/"s7u-͖O͒&B|kCz50hq nCg#]Cχ礗"el'_Yzģq=n0ڥA Z ۜ-3-Qcq!oV5 pŬ)>U~4zYDEv$ R?ES,tocb]hK\cbf Q *^ꝵH& !MHH7%B;1J=<I.}Ibux!]/qm]\q\fk6FO' g}TŒIVHyQ5Nؠ>AK!>xTړH{ B7Fo֖wW `0Gu%~d㬿aP3Og+tȓ@fAT{.GjR$VLJ}XlY3ǓEy__,M q|\~S¡Y'z1W:}ߛ[9/>ߋow_}/;?߾o}0cHǥ~Γ/O߿zcW<?ej˾bq8u=RrSjbGus@0͒<0T!?"RJ}= y5&UPĖ>YwD((.\s)@[MV[Qb5hs ȺK0 ?7ln{ԟwꟷhTo|4d~ 7,R\k,&zlr` 1!F᩽zYavo7($3F!#!eBRןcE!FXKeP@D`GJ;}"6T|cG y?ԟϋ rH4Uv!EO V]߆#iOrjA7_RPLRlQM hfB-D&0vV6y;cY…>)hI X.n6 kqfc[ ʠz^YEm^\X°{ECiˉfQY>}wyDGeTLF~( ZdE-z'Q7VuOdQÞ/>POD@t<|oĺc7ђ"rfڕv;i 5=~ei2'xrK!7;JkCFt 4{f^9@:&?b8?ьʲQWƗKkijFPGE7Yv(h9 i"_ʧAd& U/oh/ɱ/_Ư۔QFf–MvOpӚ `z9uQ Jc͹>w',—% 5ѩ"ҝKcT,GI:JD;'_uGϭ'4^Z4 NT+3PG1:jl,hr;#]~&#ks)&nL 3csBuEC4/GeYqZWK⤞H2'B2E0S,&g%Xl&ir"/&$gzϖna^uUS/ȲA7 9p&V X7CdNSgDv^zqOܟ?oF`V6,dӥ |[̦sk1"mKܪֻw˅Bky^+u3QhhP yp;[j`Z|gk3r5a_rVpVy&@ G|lTR"bLV7.܆)7**7Dx:!pCL :=|h!x垿?%s:;R"sMFsA1L(B N< qT?_PQ0H-#=N+ ;~8ڵcV;2|:` (Ez>EN^EYYUKqFʳMK}Bw4{r\]S"ӎ 獞=;q H+֯NKq/knmOME3%ouGȄP p}"O(ԣ=UxO o3'Gb菢路WܛT=X͍}?Dl:!DR^#ex1iid;ӏL]|؊шw\nų<ϳF<;d$sik:/C>]j$ÿ|语~.R҆%j?¾g0;vfd A%ٔ;ɛwunqe.V0fhr;u"`:F5~= A6,m),¬<^V{ʝO L-)"&$̙Q &hY ˄fy}oγ%)UGCӼ䗔n޲JFM|%eR#H7IS͏:y)b}(-]v ÚGH6ȣ'T٧dfW2Rڅ;2R.kfGA, _AGBSx^?;K3كf.-A77,CvUwE4MXҲ'Ӝ߄5$oU!GCL>.c#K'2vSYȍ)|ɾ[ ^8J}(ͧQQ$jWEBu?B27=}=_?+0gr$MV˓Ï_y=᏿C~lsc^A<< 4r 6¼謪"3DO@?S'3J~L W`\8sJy{EU SBI%;0@leRLh0HpdGS߁N6U]q?e\z. Œylڕ5Aj1zY{ N/wM,m 9ԬhtڎEv."_žO7uH.b6w?naŋ{(:_D3)MۜGgN YLz5Ggӭ!'Ǒgc y6B/Ngtyl霱6tn ?Ǒy?ӗEP`NGD6D)V|~1q:tWnrA2__`0x^ivpD=b~:~XO@@9@d!*t!I9 wivݱL{KidVq4n+R]@?R^xXbkM0@_Ҝr-2,H|:zWʀo!9F_Z9$j6x'wn& 9ä Y!tRrh9s422>q3A"*N 'QʕD}R{N+?2c]g ETjCxOY Oj2,v< Fքî̉hTF8aKe1)%'̓\p!B[0 e :FJފMpaV>ͯ&6iY}*/E\#g]D$#ٸr A`n\{x; ̽qi4!6H{4eV ?^AQtľ<FF3x??z x- ]4tX|-%ƒ:n!jv@r5ú8qt}DVwcVSU6V)̣@ 'I,!!:MMShFYK>DAY\&ྚA~ +<4a(Fq1/amG 줣`çn%Uv/.7{g?1' 2)BJhcnjW)i$o<>"I,)N^V ̐qύ?ewʥD(u~Fw|Yed Xߚ-犨9w7 4Qcqs祉F]* ^ߧ!bM@oyC|xs҄ ë~| ?; "/_R.v]sG ވ<6Aj]x@!¡Hajg9ǜGL_WcV`8 s?)1ТZ9O)dfS mg)U6|ioitu]JL>/<ҦCrWQ?eEaLA!UZRZ$/7YY<Xnr(Յ%o}S+-Oϝ$it*KG"L`G*}=(ܱcr*zOX5|3Y:س3>ym2DQ.Tژ%'DDywe2C(#)(g &$؟4[y =Znq>? SFjZ2ٽ5-.aV_bH%KxW6K|;B~G2V}@I&h}]֟?翿q.=9{qp[:&緘mDǯ'q8y>R\:֙Z;.֩.8A+?y>Df"44/XJ*\n2k{@-t3¿1"F`)jcZpb(?8g! %hX,fuoxrs &ȕsHcI}0ŀn~9:؟E- i]r+e0njʈ*RNјGMnX˫C{5tޘ#L&UR66V58#Y4Z';V."$#?\(ALai -YIcct'W`cSPT)R%ސh.3f3A>mȧf.q]ɱxSTi)#XF-kAjEyYj9Y${E;rs C>|ɦcE"Auu ;x飧x!.HGo 7'ACUF9 A6Waʝ%bH:_9nU6J<:L\1d}U0tI>哷Â,!Sʆ(=b+yF OX1:SФ.3-Y֝ɢ,#-g[9 ֕$H\X0m;&/TGPbc6jMSl+:G6;K>W! NZ\3`v*X$XEPf^.HQ3ƀ:9"KNUX-QsGDrBD-1P-t0y2C,k 'QЯ3$˃PglFy lűK`8=3m;riBߒ eKX}g svQ{~E(= TO/פO;9AEy|lv 1E{u.,O->XUQ}, HCe!}DM YsRjbeQaϦw=#}Z;:_Tlʖs6й{%GY؄GHѐ(3%~'EPNKXqrrCgIJ B"5a})&q~~9K6qaܱ<& /d=G/?96uEE| ijCMDՇp)\\Z %tXsB#X!Ў(ݔX!J Η!;XyNta>żf4KXY_~cvRGkȢ5{g)Ʒ%JIMτ'hw x9pD4ɭ0( \62Y>)O묁e' qw\R"vI= x@cmh8IPh^?A8['Λ0& e51$+X/H)3b\L}j;R};98GK)G_!<uG({\hSFhX^ J\̣g^b3%/} jִ Qpam.)ay I5^=W5±[jRo|UƊE㳫()㘏\RӨqx;0s2Q̲` a= &ɥf<jEkKz6OtWP 4 f dm؅ o>K֤vQ}ED!Y{KlT%p?(1xiQ-8_5E)^ND"fQfspgOZ}l)6WԺQeg) pXǠ'2DxfKdC gy 'MYӸ3hQϿ=,KƹhA gh3 &QR9W ɬ ոǭ"H `HGfc )4rKQG,̋ _J(cϊ xUDu {6C10{dE&l<1DɕN3s+GH/V[FR\4e0&#V^fB m3_779O r[yd(V^s6P)⸉͋R |Ö*Epo/l46Do ?Gx9ia94q`P|a ϧx, Gai!ѾSzĈ if,r>M!m:8JsC0սWHƊ&Lv " pK(<壥ⶰedI Q9^zj!{6KZ d~Ť/|8ߡ;-.M|/?X7,)zA7"ЕMfw6nhA _:ZTt@~;ZqheWJ^*r:"/֏jNﭿHԙu$!#i@tlXկ,cƮ6!t;>K Th? $zmA=8E80Ee@|OY u(@<2MEko,-Oީ[$OY l =7ۮc bK7\@n&=ޖ*RÚQR#ʗ#N@'G Ë֖pRo0H?^͜g=a]*Jtvl#,g#[L)k;%-^  Q^h9Ex.Q@C-#v .1{*uD3 bZo3\hyiD? ة opo`_=:+7i9c˜#vX Tج˙v~_CgJCLxc.:Hp[x^ tcfߧ6U 깔q;/N7YOGa `/r1D&;1YGGRP+xd;d,tB_2fƚ/PN HӉ,{,G56'&&ϼJѰDI#`Ғ^oinl9\K5yg;{k\'Qa&ĽZ%i\G"a'nG/ja4p7Y㵂9 8yj@BYdɒGvT쮎=n)5sKk5EIOfqc#M±:?i^V챁Rv).5,jM^Mz,]Ic /.7c %_YG^^#=o??O_Ϳw?w_ǫQ?zeppt^cV֏'S$$Sbs;=*:NG)_I?`}{sGB:(1ks'es|l } "N`Š9,+4RK""J$ûHb"MSŪ$R:0˙omڔKIG1%[& Qjr\)%( O-]PX 2-$)k{5ةgY+y\C Ld)TGp`%@.pzAzҍ}_(_D,( @Dp*1!,v{|b^o} ;}K+Q[aYj`tʂr0@d GUTšqƒ->x .isR`N6z#ȧvOyD__>zcfbJh1XyAARMZ I"U+.PIAF~ StX1@!1,x#;96 Rad7P y>r̨儔9% qOghRa|ӭ_]ז9F!=dh3DCН |yX K7P&0D)ź|3Y @g51٨tԆ MK s`Hɟ0z !;tfTQ*J6F{}'v͏>e~!D_1W=BK$IX0ҫ I]mqKOiB#R>μ|C;$eg g#w?~hcοyM I?_^ui<xt@?{uB}/>X fSB/P矜 %o7>ЏhhX[? Gώ8Sv c-dbJ(0e˘L- n `A\%snU!!i.% R|H@Sp"RQZui c!o$V(c@S% VGF$vEfēq=)l'CX<4<,(IAbu //B/h^7Vm 588z o:'! D4,2B.< ̯)<#)n6Ŷ9v -"-2Cz}Ԕ)}zk?7;lD4eQi|7&ΑV|%n|ԍG<)+ɴ<%$z5/4דF?N4WOQTIMǛ0?>2`ZeW2ߔ=#SOk͞‰I? }3bِa𪽍EjWe,U9./ߞzXwf)^COs)ñ8.csPvâOjIDs9F0:Ppelv!x,. ߧ925yU.>pG&izp|G rLآBiB59EUjoʲ~DO8w&azу]-#Oaf5Ejex.lV 4Diz<ڣ^7% s}L{RK[l˥/k f_yy_SN -Z u5]rs\}uF/$!>ڛ!oYYb95mBYǨ.]<Пj I gpKB4;&C#(ab?/֟[{zitQ+Ac?DAJJpvȯE9(<niqf #'s5}SRoW%jJ Z1>{Nfl(f5Sb~QZj\7D =_bMGְTyDFZ~.^~K lx,Z_%>3MYV8͏xJskԭRIAMkѡr2J|)KQEwie̹*8ry8`mrgjdXSlɈ-Gtfr¢?9Zo(4nwE|`~]3 KR`bAz='ޘ!MDwbc@1ֶw1kij) #zMHRzx-~u{UN ˎm*& "<<*Sd?ahýmênzfP\%&6/$ OHMyu|!ԻKZQXcxT!xQyh-k .r`ggӟcȱԵ?S۽sñ|C`or+uey}Z1KC4z^k[p(堂;g*>weӭGȇv&IʓI:BOta`Гgث .ySrP}ge ʽ`PkM.RBjy3F9ΧtsSl[voQfpPF1VV_Frvw7cXKU!&FEΣA!oGsψY ee zDzXǩڈD>ȌeR/ W4Uc8v>2vM|pA(+אa R%ZھsXI`#ϸQ{ <;ğ25%F&]WHL @N53[|\>"3^u/eރh0<D5'pN g0U\ck}'qEQ4A> uC@ܴ@^o:7(ƍdV.I5z$#x>k|dxAkۼn7yiFX"3_ 366D6)Q6֣Oإ% hl/;*ͷXrֈJUE/RD^<%2`aTJ2M/ge횙 3p~AZ~j̱%F1)gCa=[R>хvykv5Wt[+]LoŽAD Z:PBӁL+νƛxB4~nd0臃kg7EY'PC DŏFLBNc^: 7)l|RMqy)||.5)b2xDl jwb<_RJ% cJucieT*+!I(:lh-Hտ+Gpm qkA2_lJ.^-ڕE]O|@+>BT|` +zOudF} t}HggHȠu^$FCAAwkuL1v]c+l$MegN%ix>nK%FG@{?n/{kw}+_w7o_\OŇ_?.{{?mCL}RK\>ո|'G '__;ɳ_Sɿ|g+X"ުmv܅SVzs}!LoF%Byy2B`9\8ȫ#yN?/>9?wk_CBo/` @ݿ_l9}Fw(^0}손%8j{šlЗE)ʏpE1'Qw#y;gwg3q_tSqw1M>*?%csxFG0r?A1qi1 bN=of l;XIYcXŵP(e#mMFޜI `0w$DbuI=ޠhz `M(}V*_|6X-LOPGd9L\t`pB0TF/M@>ׁ3 &, עXg0 I/lNJQ%R4A汙jW;qqyJCŘOJ"'7.r>Se]c0#YLf K12 f:G= ~} #?OES}% yv| P]WD%u\.QhUg?0<nk?!r0 ܙ D<=%L.}'jxxTSƩo`A\*OnrM_&q9p,V>9ɰ,H:U9 {SsTJyr /y Smu]K8]u†D՘|Ay[@ * N?WS+q? 62XҶː2WK/j: lHq?H_~VPfbƒv!p!YK{58uR}S 'ǚaC͇^$L3O,CpkK5dMx^rY&P~0hSFi]+1/a.',-‰n3y|GgIifq%d lbSgW*IzJ~bqy-Ч.‘K&&ǽDʚ5}d[A |+Ta=%7!A.4-NG~ 7%/驽Eᵢo1i~ йY!qq&#R(65IebrP^g? 9RE!ky]PgDP1ʛy;a#<fQ#N?߉#Aؗ,!戋^3d*/ǨӠt\ܷ{B%?w +lE_z٬Ks\2u!$1=gn.ּĿ0RHy]@4RzYLYv+ -eR/Ci•Z1M4| .@K6ŋ:6LS!3g+苅C~EG J) Z!x c6)%0FX?o{E&vkS3~UZ 3*Y1/}T;^v/=uYS洖 gW;&ئ]oUXǼ搲r}/*䩹Y=I-r09[k Vc}bIYn/Mj/8ti駻 2 w]X(vŀVREaqeC. RS5ঌf^<C\crX6H `+ꚥ$x Lgq𭰔-zP-RKޔR1uѧ QOEƘxfna!#om%ZvUo{ >)[oX۹-:$сZ4u`.|!6]@y|yo鈴Vq:[P\ "6h(4Z_wP;4G}?,0mw:Qq"%o0@CԬ𯘩VkT{thdY P <,*+ede!! >I>_k6O2 iJ#a8l iq \6 Z{mI,45[dx曽[|)1"4C@*Gkq=JqR*iw-U|A;׋{ؑhߋ[),qq4+9u6sY8f"5V2xV=rM;R enh#>[)Eep2=OM+ }DTĚ83ɜg<)McFz hmy+K:*J2e+ Wws5!- Rg,MD!-z8F}`4Wf'^"Ly gI5>3 [b%}47vI@k37_b|=7џB!=B>6p85 ~6<|ӟRtrw$=؆4/-o LyKW5!q;SIJZ/;k[s ꑣ13z@ڡ"I}_Q>dbB XzfiP#C{8oo4{yY$w'3O1b2a6JC?H,SGwTehV"&xZp`]}Ee}C֜?86 I2_TKB>sG.!N;&> @xEW/~nݣgi)PyA&L4%'/>֌`V*e1f2h\'p+ZoN}]&Y[ju|.83rIww=%SǴˋF$hQp/>J|!mtY[P:u'%qKjAѬ<rgǏqH]QGf N,,n207@T %fgXvk?FqU^my&=ɥC|d4XK>e?%iF*Ysl}8 N2wKmu!JR+LĶFV8??M8[$5|?3c0#ckfCFaVk8dwvpk idDY$n;WWGHBWGILJHKMBWG|  ! b;, Q  a UZL4XK5ў??}_?N?|]|/><?O/C|}"c-rr0ABc|N1\Ǔ;><^'TF_>Ey=I)=Q5ŹH2@8Φ E8#ϥ޾]x',3>tx4-IMΩ`?tpL\魩X%}<(ElV#"g9-Ahaַ`rIx03hI?zR/NAYDVȇ)=4PV|\jJXȴ zߣ6d̙n-8&DfB'I}-29p% o_?uxdUvD-GN-sɗZD~9xWmj)PL 0,"&1>IrO B}1p|?DuƙjO6%~e z2qL^ %FX8!j&7*UZq"i#'<E1>K 7&qjNl91&+f/`K[)/\HI=Q TTY6/)$(A:eGOPVذ8(?MpmB X\d7hV@W.iBG('4ŎS7EV];DXa{oAo nI.Lgh}"`"{ bS1sE12[7v*MԳGQF.i٧2 DyaˆiUG,a!N)A?W/φ11 kJGXQK;ѵ<ӈz~a&bg^>KOZ1>\oSJ]l>|6#_ zG}`8/{Ȕu""gE0婕l"وJd*KYRET;G0.H4艝{*brM-.{@gGjasvC4 hr%V4=_|ExjaӬ#g* v)EjqҢ>V{*,e)]GesK~wR=]O]?'H00'͐C4,b~Cr/ ¬ō/b4_ ޙ F-Y)6a ABEs qмCAC84_;.W4G56#" CKy2ME?|P3߬6tq̪J2_Hg"Q~B+R?;\JI`}$8gC<10+TFZCcnV<,4Gݣq!gd1Y#p'֗$N@[A~΁9Y԰L*o]7K(bw:|&ICf2"3aN-{|/UqTsps#~'!>8\zҬĚ|<ō|? =A‘w67_ u>#jA>_??LNmx;nSyovroYDN)0yy}G%Qq|"N(RM*4HsϦLS ^xpuL.zY1RQG;ϋ(1}-/MJՒ1d|t+֞mHkBfRˌVR'GLj+@V1b3^ν".ǫf<;4IM>*+{D#zK8N~?gZWHuV&y.,6]$(z9K@7o2˭5>ZʢQa,Zh0>#ycz[!|]8J.%iaxCeL[nQ4T‘d J3QƄ'fwL.62IL4K:`#] G`Mit"cZ&<0;N*n?yh hp菌%BWuHmRV 3t# CmcwrO@أD#;y`yw}/})Y^@?#6^v@P[Y>^ZN^%C;Iڑ:b' ?E; :c$5k-fʽY.BzԱi^ L-Ny72#dWW_7UfEWRǝ"E̙IĢJ_h |M!< l9RErxrޥ+1+2kN߁Sfo(ݟ6XA`b")L K //ab=?%GdžPA_=.q6=k "0CBZ˭Η acPԋZ/3%7@~(JYR "sbAj]L"Gk|xОY/N, En_f7Q" [>dqQ\̙Kb.R$s14ޗey9a2 07:P,ʱO!y<^0?DyLiO;Oˊ3x۵D05:14e *C1'8T79 $%'x;X;FϞ=€Fx;^XۓőT0"M`Y&n%x$k$OI"F d+69ƿex]+ {a%ā(VĮ66+: d-谧/BU2b'a2IwYG8T3 ҩ"ne #W&`ű3gC1f)qY,?I *JWat<)Ǿ {Eq!Ǯ\' 'dc}_F/>4&<$eI{[xeR["Zb;I$ϲ-=wŷ5.1Ӟ 2H~cƚ&(Z'xE>+}4Ȳ+0c*|')wzO,E9c^!P/3;19`x@bDMo,2gl,o6Dk"/([;]CŊdBYK R+WFw*+x;WWIș4w8RK~j}sן?~@_W+K}/}_oߋ{?b:l=_^z>'{gdƙqiCa;<<_6?ݿscQ~)|U1G< /;S?ᓾϽs ?<Ũ k-#v<(Aqj#FZ fXLFRS%[xSXب&_iTThy(T: LC3e}4ǣ bsm R沍r83NZh!DwU 0 Gė|E\C!~DsK@=V"Ӏ}ȩĆ&6MR"OMGeT?+s03mB,zOCoLM*:H/qde-e>/ur(^с'Y2A~*V<>#ꈈsFœrAY`"@218a&R"%^9FFJԮ̐TtּH 1lGDˠ(.ٺibR>ݹ*se&E:-XCLmɦX,FfB0/qL{HO l2 8iQ@V|V:Ҧ6 *ܤGHt^!fdFI&,CdӆѤM-\҃ՂMXT#ĘCJ|gφP`E;RPKyO?Jxcp}?xy#(tDJ`&D嚐RxiD0P&g&>|.p#?^3=)A5Ͻ71%T*z:e'D,$tB<>bO'|uH9Oe?פp<Ie$I/Xl /.5MHeBN)V*ERl6 \5FrXr! XJQǒrc@cpNLy&E!B*'L"O^Кw h {Iá<;Q_K;IU^1m`ji叢 Ոz(O%^+GuΫE?Ť†GcAN %_luOJ*NoU4_j 9_R2̤ j{N?bR()`RPU'`ڇD'@X2s9_PbYOUϔVװ4 )-FYU3[U,۳@ a #Q \|s0ܠ˔hGKBB$5M8<Ǘ'3qa?FP!de1 Ʉ^Jʗ~^fL)'|,è>%-G;wg.h 2F'"%,ϥ;FqcWYD]XtJ4^h֨G)#$X"5Ab&gN!}RUa"г+M:{)#3W>Kxch/{Xr5er$'tO 7`XX:>j5m8a=L gÞ*Y~za9ͼiN&TѰ=E(4/|ς/(`X(8 Z7@Ys`ᇾթCByjxlk+xfiEbl!"Es52_% :/_:x?/0F=N[NxsOR{8M lQ#-2.ohH5OsvZrX^'-G)(GkgVG K~OZӡJU E#`ם%~jBO v\DhFȝM7 .صDSZ=-Y+>3paU6J-?^+i=¥_UDJ!a?[Glpg"O\NtC^ Xf=d2xC{}'ALm8Y/P ,n_r<8d8z,SQᥓ;`S(y&IH IwF^֢$_Б3TB(WҐGADr{D '!:. lA6 ݇ }F>K&1kzdU>}ZKx&lKǚ7кsL^\-7b)R쨏MUO3R^c#r 绎l4Rz||mK*9Tm Dp [[}~z)ks*\n E@X`Y -Q_jQ"Q)ϵ I22?;y IE'DɡWsr{1H/d۱ 6 ;61йOM#t|O MO0 zb!!XK=X!  (qo#`#8KTɘOYpN%/@K,\"%:%~ K0O x6\/(^Y`;>dK {͏dSQRNoMA>%YFφ EQgQ3Z| ~# !|6ī3XN`kXr?&dA_t_.ڲca MGbG%iɏwD-B@=, E!5]PD+fQ4,g""Eىх?(Ge@펳VGi 9E,̫R#KcQ WqDnHzՔ ubcBlHdAR%yf xMQܙHgh.ޔ**&)O|`-PE5I=hTP4AehYDϋ@&47v@1V~1(t|̡)uLXЕ .PGQ,uC֤2.O@~@gb0N RAw,z_J)SPӦ!mEȒ1uic^~֧$}THbeY书ݠY"tg;9 FWc&KcD Wd1༷Dak/e6bB3KZ C\e}1HY}_,Phdc ~n6.=Ң_]CoQx.z~2KOQ!R0o45 MIϊ =Ua^^Z[f/UoӦK(7-:eyK *D2g_ݫ@]rKDJd=1(Hl0PTe@Qk1Y,`iLI iKx~};\merxem&㦟M 9Yc\ረu>8VjdxD*sϐVqDJkǥ=eXzs:q7-Av@H8)`9;{ ӎ柧|P9p.HI*ISC&ə_e (З6>vlW%h$OK5M"X<ƨ*L$Ȯ]\Aߙ\}r֔([87XUgjLoAy~?ɷ_'|{|3o{_7o߫?U\'7xs|5ݶ2G8_uמ[Uh{cWfó9Y}=|? ~gsGuO\s-oz5L,'reQ>JѰ%#W0BnSb\IJbpu*PYǻ| Z+ŏGׁ.0"ƞ 8" R F(]j I,Ix)9FVRbbcTh)(z,+c`R` jDEM@$`x$K<"ICG.bX8q2@G1-jc"J4JDU-`r$$$ daQ-O,lڄ)y^){lg5N vz<9|w |h$Gf98Fz𔞚!ϥExp{=`-P 8[G jGVEfvd5i=Fgj:8Pj GZ9 "SP кEOe#(C)  t ZI(p$]1^,q M_}d4dQPf6" h=|H#)3%(~uo\aF .g A@+CUrq)93=V >QlhMSF)Fu)"*cdo,靺d UtVf.'X+#I YN'pa) ,alPᜑ\7gi5K2o~e1]k l(_eU#k\8ۆS4Æ%#DL$ۮr Y :lwNHm,Jd~mTO@߫!o.#{*ԥ6{ ZLi>kB9oX~P<5c^Yg~|ެ 1abiڵ,#Qt^|AO' Ea_t1?H"b.DSbd.פcyn=SsP%l~PV;U{O~Xp%QA%O0?N&yfZ 6Ke6@oEzC22-GQ7Sq.LqEQ=ѠJNE^~$XE;=ϧ(ŏFB͟?_Ȓq'LLs9dek⎉~SL*ʖ+\ld >s"X^R(cٛ7w%VnQ{-Z*~6OKR$Y:b3Cn%u~'y֌478ab(g3 $g>اaX|Ȇsk̂[}.~ͻBz.ÃcTrR}($۬OJܨ.z)h`w$<Τ =O%&μWO !ϲ]+=c_{lbbJ7.$gu?Fuy'-s-mV:\&֬E]uQm%6Yӣv r )KTD.a~8,A3@ܬ^/ \?y$k%m ,,fc}Kid#੔i`w~~ft!x\΄Ns1#0H b˸4^IE9ËnG/%FԮ<~%#mx@ :dM*6_e,f>m?&aQ=!, QmtjcpMs|mv@(,h-| BH?g.#_f`gƨqNv~7PNT>%1-@^$Rgh6M$ds:Xc>-91EeЀ /ԀtHe @8~eΦ0 7k{ W/z#ұ|(aW5*bH:O)vMSoo% UB~Yl9w>Ӭ8!#&Iw~qw"j G~9xղ|#vn"/׎^Cf{jcgb&V@9wLФOS,:)4`iLə__? ˻}䚲C2F%.s)xxZ^.}St q?RBlLYr{%f NZfC?w &:Kt9\WkyZ/nk7C--֓tҴ" ?yO<= b򜏣tN3`t7_0E9KSv󅫽Io~HԻ>;v)3.`B{bC;ՀgB2!C'd.7 b,v+D4G5CܜSݕcfMNŵ;_zhI91SbqfgIILG +X}4Z4C3}O$ K~ʮM :;M ]lKQt|no\B>U%7!bqn(BBp({@bm0S:@JC̀.!T_6~\lyMÌGbtщ䵎&mΟb2] s%Tph0%ڪ)/~*;9p6Cs E9J@S2p5FY0yj`2\Lyɰ9wvs(K\{b/:r)JxNbGKvsM*xwCSmr_ؖ = s?1څ_b2" pC>9r5 aftaxF T}VBJTz]u^~`L̦s]&kx/8h5L9,R1Е*O7(.jKy%g>r;W .Kh\@c=е+ݴ 9ŗ  +?{P:[B>) \ S:d@[8<y)WJ:ux+kh/fR#G\ɋ.'1-r8MуEm:O3 E+gq8O9b<ר;v7u[ע-E?ݪkq*ݽ:K cw^EG[ZPT40 EA h TuX>#L?Mc1  >((ec@7&Z4]I‡?a?3 {r]EޟL=X׏Š`uJ8v sHA!B+}H΀<#GJ!IJ;URNSӕ㎃~&a= P4gȖ[GvÌ?}AVi@?m@XE~qrd%5rV ;o <i]̟b_He*Gejcl 9JZ8n;W2[ڏ+,V\wJi_bc i[bϼ4Wy hU.YU46eY%E2m0١8~m6w$kc_1f/lx05I.H㙹LK|a@0aХdk AbV O 82g< JbO/yd-BOIT^,1@80(O9"Tc"Y[1!ޘI$|tly$;{fI3 =EaQsf'rW.M~^?#s}1g\Y]:Dvz\1s4S" ?ܭ3C@=X7?f'[iĚz;.5ޘ,ӼjvGJME߸/\R]H/-,EkyM]5oC$|gH7Yޫ> seJ7ՋqxDbp"MS=T婛i(lhAiZ4HŌTo(E}IuZ<`^R9T!7." 0p8 C(%8&X' Cp#eϜv¤6DN!C(b \6_b~B^[K}T`},T%ȼF/;0fU({I  >tLzhsIĝsGT?wlt;'/Pϵ +qRFtcsHeL]p--yX/USs1]t6Z/^?h0 \~p)Bq/ޫP0r nu,---J *^lje}9ޛ bZ֩թqR9S/G#p0A=E}6S|XY6$J/AM ?Zs5zH7"7.b@X *a,!b&$3VZHCߡnZa1 '^dƑ^؄?WdXcI1WG8 oH/CcG~hw޹V=|$WpKO<@%nc 7#AY]=QhG1-ZS] _l\&^+š#rm*qm~>:;ts ' 11U?h"h,I81Y*0|w.*̾lC%ᙏOq#c3& ;cPꘉ zЅNm4W4t}wY%"ϴ<|zLy߱ɴ喼6H: Spmh"P/2&:, Gy11!Kj0~ML Q c4&_-CO^%.F%-Td[RфzjaCY~()@$=7XO|^)}}Rm#Ѝɼ' >ܚy+lVO^{Zb?s8b_ADT/Nf/*7RW鳾`pi]"GKB!?}=?>rw$ .] lR +m? xQdt>T-ӘJy/kT+/)‚<[3Aǚn6aï\ '٣^bE[:hx/E)<3ΜŚ!%o+31T:.B-;nB=El~vis ]*ϜՃ&I## _xB[ȒAbXFͮy S RyYS#Z2>ʗj+3:;RGgxnD)*p_KĎXJ|NBaBl}`H~瑧;u98^{W7^碜^: }j%CVTNPG?q+Hc33Є4z `L6[pAH|D#0 7'/c.j wKRbri^߬' ꥯF0zCFOBd8g]"28 ,yZ.4oX렉Zg-.(~KkS}“ei_\OEV!JJ8jG3]E3(I㳫AL.G˒xAWCF=,C}_7fu"Hi U9()J:N}E%ϑ\"c; ͋{ߙN̸:&Wz.yqVmF;DsϋN0v'tO'Ź [w|^S^1wF]9#>>F,5-xRXRG!cR~M2[|v)/Hpƭi)Dpx/+_˭7:$t5 <"YJ-AJA^[d6+w2aĒjZ2t5!9ʺ0lO_?oHH&djNQ_Xx Rzk6.U,o1|5 A m;Ԡ{,Ic49m#7̤MUcN.BۅϘY q^_$BKzn}aacaq.^˴s8TlI*9D}=P7*J_Ҁ`oEPppZmp 9aCtn}KPm#F |3P L^x8F? (|FmTK@3 (P/4qY[Qģ3,MM:Pi(xbrư:BkP~36PH>9,ޤwAF#æ<B}ѬSE^)={}?mןn CÿO_ N|=K)a=94i`χ)V.|?+ ,Տp$\_e0#P]$>gTO8Q. PXW,{`gJPe aUMO= 3F#7^ Ģr@L¦zڱY>Nf .,.tBȀÒTWf L pcBT<"ybg9_0Im`s}@n/#s`[NsM| ?`ZɎP6;TR%I:KˆZ_Խ4/d3#⊨\ЊK`C,N/L>6G~ hdEf_l.f0 |J<# 7C$wHl|>K5*M1\.K+@{ VYCXpD=7ZrzUOC"Hg? ISi"LLP4ݛ"RC>X%5>O#d s43_}8Y OP#e5n֤шiJԦS1I/)&}=R}r/u[ݕ,ِQU 2{F$hVE1QigYUŚЅ6K(2J4(]Jt.5 q^ZqV:{sy т;.xx6{sd)J(ȍ̧>T}Ʋ"dJܡ1`FRt:(&&ا{ 7;"mk#sYܵTx9Nxr^2He-ZKpt" қN}3i|9d.ȌMTԈyk}wVe/[M27m Q(9(_` mzK˟qKw uJ' ,‚i,.jEu-+-hZ6⁖/Te/]Md")C عmBX q36qG{,`&HAdSS'&nt@Rc#95d`H#DIvI O'cR\?yI3nj [lsBHIx^PLhN; xOvXVKSuqXw !n񀁇J,yNH)L@cNd*C==Vht 1Ool!;,>1ZX2!P &sk٠-[_\(]U4-O7TE[|iAۄ\ГsHsJr0pDr8sQqƂ?_ۧI{Z#_\lU/y_cm|iu̦+ }^Dr|xG"F| ' ~L`sfGaJ( OI(_a߇^4R!΢'$/HPgHGS dT0wAq's!4I&NbUȴ_'܈ڞַHe iKK\fxݸߔfi.S%XVVT=Ӹ*A'Y:F=2<[@jRx܂H&ĮFz=hCK 1;a@MǾY$d$NTq'w*)=QQZcC)a +c'MQP4EAO( 2EE#IfgN| AsPW:sN?1I#Gy2f-.8/TC+5%K4w?&CBsNc%k6g?egrʓ0|b=)з!BM68*|jYzGUhP :=#4թ-f-KcgX\݋T;_FcF|XMśMk^_-+a hkHl4R <ݰt>&t}=B&/Z.dP6sl]6U5Us+$4R =%1QٟmhtI[q{ q]bì,x|b]B$h2)QN-t>cigEStmGdVJL+_f2fr#N_0vSqEY>c>ZMA4:zsgyi-'7S\QtLK^p{E %x7ĂH6!pʭb_Q'7]*ql9m]WW*=mܛs;gDe*n4f\d &h↑KJp!>K9lVH |MCeytA}8;`6PaPΝo*.eUO2ASSƪfӘl1|Ηf#EWˊ[2qx q 1Sκ ϳF/?t cuvܣўSj*-z1'|T#{;6KcgI-VWNHfU"ӱMXĘ2E'Kc?92g"P<e ?qL(B`M O8Ya;KT j[UFKXX>ݸ?e+@(^;>,اESDDeCSEEr.d!ua<Ny"(cO6&2C@S ZoA9yy-?:B~)9qg D;rё9yAN@  eȧ\Ol&n= S3/*kKѲ^)S,V: f},,#QĄTr*$-Ɍ v=4 (Z Щ#qt7Uw:E\OQ=uǒ ;7b<-67|U:s^}s~Hr }u!K|8t4If5:ڴzc6 32#'1]zI0ÉKYrv4"CCQbpn Q3 Y%J.wiayk;FL [;6#ϏlcSCnGA]ԊMs+MgJ>|1߿3L#o]˸|uΉudd)V9Jq0Ec*E;*YLz(s$)LSԦe@*eQ)tH4<I>Y0 ?8}HLesh4<0)Ys ~ 0T̸'qds4>@ogigйH6WO{9ϒ'?=#㛧UZ3܄LǑVOXm M`ڌAP7ZG=aRVKl(.'#H˲ID8@"( app8$xGTT,WsN"Jkq8%P9$]wZd\G9YszZև4v @=zr(v MfGK 8Hn_~p'=Lz]{qFET֟q;h!IZSn!q! (xlq,;bcÔ.Ŧx  z(#|A:1@z⮺Y?Z:Z1d'l*v3ӥeNlLg:U-[Tflca4%ؔQ`| e2 !hΎxa̲,- Wo f:\CKH_\gGh5:ޓXO)Ui bg|td=~>ܟϏ/r^.O=TóZNqvE b + 0MCO"` $#Hnm#$b(4DmlwvpkjDY$N>WWGHBWGILJHKMBWGl    % Z /?5m@H,"mR\:Ӗ yB2Dc0HZZݣz--WmذX梹$-et-vm*{vmĠmֈo$02ʂsLtI$0)35Q[JZf͡{&?qׄΎ??>q}_}rfZħ߃coSY~,|~!3B;M+X9_y4T&0/D{Erk}YI0} DBZ$ECy Ԋ$"#j@eC &$'{řgV$a+kR2xw=Y:SM7츨佦UyX\ jZV ˖]:u9M-@LNNbا!*!`t0O.{#b E>s؈8E(h'%x8-xϧ,F"E3WؚR{=??~>~p9q͇8#38?3Zf 0(fK(bG4WP|as&2$aPbiaX0ZtȂ BnDS4-^l4֐"%DCR;6KQݒ'^+,T_VnێiE˳/sqqJBni0Q72 )CLy$|ض%dia*EK=`r]f39LH뎨ob{j~yJ>K:no*@ͷ#絾8njqBdEF^P:Ӓ"Jtgn (גIȕH Ya %I9"T)0@& M@lFf8y[C7t=cfRG4cvTAK4-9l#윬:Pze0CXJ ,'czO Dc. GCXc*:$ytX^TD4Bgc.ySbIjB2Hyj#Ѫ\" ZS-K) e:P;=f|)4eLbܸs}Gi?]q|q_%<>핼CG_x/.OzCِe !v!y'Zفcxlt;oRrzCu0 1T͸|d632K3?6GQՌV*3^d'RV}?3څj^͊TkMǒeomd}3c4L|YZ(b),6f^t??ϧ(pI7Ώ_ã LBc` H s>p#-`6 &’Y0NwD**8Z1pBY@[4 bgNܓsH=%"=͔e 8ky^I@fSRQE-sө,50(h$8_ebEkZ}*>u=- Drg0l269w L/+hZ%#iF0&!&=~,V$& ڧ,!#*w:3Od< ,OK!̽Nt@ )Ψ4cgC *LqtjDtE @]KDB}ج|T"~|/xn|>~s?3틿< 1 !=QDVsnZ b[xeXDŽ$'ORb#Vy뙕b¤MKd:(ME 2-;;sDKE3L׶z*;M,#*.Ǘg"SXG,?6e0@|0:Y(_2#07^Rʹ|Q?;{'g{}]M;3y9xx ۧP* V @gKGڝg;"i%q:d2ƕ3p"9|Gp e#1b5K"iщX8z.`eob#j= B<5Iy"i2$&$`86E4yj=usz40Pii)f)NkOzݼu]acK6[]ZیV&Ռ'_JӥBs߅/}*Me~{kߋ_/78R3߿Og?翍~:ƺO 4(B=aT'g (Z] @xȵᕃEc%PK&DPDHLI( ɠX =E%i@cmbڂ[lh \Kd@mqJƊKS(U0d0< $j N'A8ɲZAjjÜn,]i5;a/__[5ay_U'ŕsrTu#O%4U]֥l@ <QZ>=簖bp̥ 4 RV ɨuڜ';|6zUl$c3EPC I ΁$n2!BpH\Nĉq#?3R֝t9q%=SW&C~g'OB%u $\0`,W.4dU)!;U|Lϸ1+ҥxcp@Qk{GjJ(J%iҁ=ՙ6s$N )("B!\΂cB:<4Os#:q tp da<&(0 !p"=rfYW/Z"z"t$B[.%zttǨ]-BGd__u_>=:r^߰W?ܬ0~ E2dxcw $*0_̦J82eLfx!K1D 痖~n;wu˟Nc_#?>y|%k_9 %fzJh>~TzT<*h)m8͊'=fJ`&ddG?>E23dHh8vNק>A}^wL|gƢ.zqaM_/Ϻ_bU8%ɗ;z/w?ח;cq_~|?}|츝ԯ2}k]剠+gx%áohL)ÝQli va<<#qKUc3K $HQE|0'^ [+,3F 5 J H 'xpǧfAe(!# 0>2SFRK1@pD.hV$ $E*(K-ȂI15l[ge*=⑽mZޑ#ZWl9muue=tgVRk\ROꏇh73>ΤX[)y<Wj?%:'f?#\WMZN;9a\)& ^7 PY tB;%hDȇC9ܩ),=%:Cʈ 8*Û4/_;/gu.?Y߾3~Ρ/9ûcR=>ag &#VuFpc Xp1%$ZC_g΃z2 5(5sψDB9F$c0&cC2- I#Xwߨ79+V}{{o{[z??^??vٟ /}ߚ1c]^rՉFCxц$ywl,CM̓-!e@jp?C Lbb3RH%@G~o9??vOo?~Rlfv?;PS@ Gn@Gb]o_rUڠG?[;8y 8$WyN VXUs2ZVn>Y> ]h<./H96Q {8 &HLkFGF? yN(x40HޙXrKS{sD<)44砡>L Pvl |q4g pnNslb{R;Bk)( &F< -7d-me~cdX-STD0),f,~16Xou\ VKm,p؟[@FvtSV7+;νGl gT> ٖV!~ѣ#"lD2M@X,N>SOKq޼,(V  G`Nd4e$Q6DDΈjvGpɝED_ fy _8ðQ~o:O.K𝍫 X3#47h?Og%%=Wh,pR.><4}${eì<HfҤ<7Ipfq'y#; AY~ZS[DNcB&!24d 9DSw66͈zQլJ#I٤ċ_iO;ѧ 44XKÿU݁PZ_%biReb2۱L!MNDD r6F٣]s,{%5kEcMZ$q}.zaB*؄(@EuȓGe5^[ Ra:s B -AW>k>Yw@9ҤsLS$ߧOQ1EcOZtGL))84g.Dk` r{(GY_"o^‚KIl$4 &j_~sVZ7km#ôYΨh^>,g%yi>N@aK9ȋkBee.2!CBN;q:66ɨO=ygIP5դKmڗ|5,IH*CsR/T.KǽcyrδC4I>:ns2_G]gM{՗P4KiBxGԴ(@Gz 7ڧ-aI0v'XU3Y|r݁g4sGDZ HI l;˒]B͹ir\{_r9-GE(irFr$Fy]ۦoD2ncCC=|jTeϊg?ZcV)Qd%œT0W<םKڬb][7KRh()!Zr;!Ӧg+%d] OxsHT9$ڧmzV tǧ9ިZ_IYNsJ2&#_KW-1$I5fY tOԱqTL)f_G1T=se{)n$]I$t31?St#n4ͬB5{aPm Oćua, +̚I">ܮY cJ{Hj60A3/._mvuz67U%Jߵs=}^R%ј[uz ,oMWTZ&^yGi cꊪ_~uq'{|1bFi$kRD/ӼINs[NjZbw뜯ՑS VUMTd;y9!(¾Xoh̳/u*ʆTVx. 8ʹKIzYy}"C~TAD0O]m)qSXL Rl;ld'JEÆ6ja &]o$l13M8r뻿o޼^лb*f)-cg%-YݷQr]WfBdw /ߐNX^NJr]ho34R7H=Ā-LKv;!oU |0^r/چ5<5mS!$? F?g$,&밲h|vӃV#g~05 ޑ,SşXG(rE27P}XJYgp΃,?/.26:ng1>szÉ36 7'!Te杬_򎶃#/$ѹtԔn˷0e3MT&{V\ntq8¯.-]ғekR)vo /XOp:ii%,]EzUjsY0@unO-B؜! )8Bk*yN١"\k+7H5}Fe1)Q5 Q,Ѩ>}R[l ;YVm-VcYL?rR{ 1m9#Cs Tor{L*RkƎ{kQUK1_J7R.U067G+/w,8]M> 6ycԱJtM'zulFZ$:~]v(YziQG;WG҉rC:D}cs+_5JYձN+/ 2ϗqbpn aZ䕙k'ד1D) b7hJY85`#KH}ޖ(;Yltȿ8<uaE/R\ᵃT1Kfۉ ~Rd-amoB>D A._U~xI2߯&vO/j5~ O4 Ŝݥ JQˮw#G|nU5LzȚ*,!o~xa;^)7\J{@nMBl/]SH%F #%FkEU !A)sxWY^G} £N iY|79ь+Uzޒ^{E:ts'GX̼t5,: -IqN֒v<[2nOb32fH. 7Ímd4+uEjm__:"l}/N<"経FfnCG[Gn z%Ec'ņ'el-`wT-8#[x{c MX%QT$2!® R0\2_]McV+*# F!JbXV>]f 'vi1fIŔ>yEޖi׍x7wctk/ub;|?!IM_>MӖ Oc<ݴz<ȽY .rhmU:z3Hd]n12ީA]-?m%(ݮD眄[}Z9i;﯂0jMB露Zջ|Sg:,jݷQZ<jHV  Mq];Ɉ"M9Uo38Vn)8;q󉼶*@ ˌ*qAǒ̈́&g|31`KU+7lfPC;++Ԓ<{X\`OH/Ki G:~ep ~պkr ᐏ\uTkuw}z2nKÜ"oЊrq< z1@nXǰ;o( FˁGN{Xfx*zNdVT 'g+u~ikmOjA ,ʿPU11#bs셂fV!aMUOo gؔMYpx~ G?9y t|cA0'n^rks WFE+vi1is=d.wqm2. hP*T-sfz*5-d3My: .:^1H%7#XT6${ibO\l+AW~w̳V~W {|=#UY!8C!hs-醴imH+<.y%9f d93iO76/y]o{[ߚU??\s:v>*wrtT(h'$^CH1a O :;%!C9& 9P1EPT>E%I2Wl fUX|!k)TTR#G,f@hls?-F#cP'<>x>xsU{U(2>QyYES@q Tιf<\c ӺFPDyB$P%vY"e!-  ?( FRJY'=CwD#E02"bپcU\Q yAKҴ/oScź,QƺB/M`?L?M_c1a7mw|1?zgt XG \2!LܨٖMeC@/A$-G1'H@&aMpۊ3iMXѴWje7-ބh5U}gIչJYex$jYZk&Х)SXYb֢e$EiK VhȆꊋ& 7Ҕc$d PĝAyh)V yOg<=1EM|.Wˉ;p!br΀OG4 0TI' ,eX c:CD, <:UhQ8is6UsMWg HG%ebBeϊ F$ѕAyZsUr2iNqAĪ0r{Y/|9qGv,4bh767fU bDO١h.&iq )-9&w6v^tW#fd4z^,(zGӱ+@2; bJ Ld{ =DHi '/?܃|?Ӟ'9\8wv~.piNJ t̡Y$&,Dtf1g%Q2^)4~׹) Ռ$O j.,ɩK4QJŴe[= 37a7+⦇e)p;*[,kі,q]R%d{H(ObM \H U eb8^C@IcZ"qFsE\WEш:JpĮ)YXERdZ2ìЖ.n-] (Q}N!i fΞ! BHp';k;ˣlʝY^\#R:(}YEyNKXgVo'/u}_#u y rg)3%MIKZi`Y(OƒR"$9L&AP.&g  ;1kF,~nqb,YmWZR5r{e uR-%zQ)əHkKK*,+;Aoќ9S@̎L࣏6b( _p&=t$U܏G5.0kcEPif <ಜ<@pGȅ 3 cB7~,P6 r@&0ap/4N04 J-)W\ޑ>Mzc&'c͉;*AbuS^n^Zb KTɀ@1=G.lXtRXjKdk{kgY0г}mRkyEluCϾtNGγ w"% />#!M$,M% @~Py悤~9@cI8[hȂn89g! x*)JKKXZT=GoŶ6ҊeMWC-CYq#r?gL7G䒯=҇E6UEK0  OTDUG0P36mg>F/c_ʆ3 hšdS!zL$O,N9gD$s|;';S}J'3"GWS:g &&D5<"ըdCS Uf!7&ܝUfxO]:tt-+]lSusa}ގLAӗOz! j8W16z>Hs~υ) 338j0AMoVdRb-Y+U.V^//zm EҒI(VNT^N{Ӟ Pc3r fH5̳:.F>ƑO?hEIH8 4hIcrɢ3#lчbZz9(/v"7s8h2?d ,V0 FRG;y /W?ePoZG0}+B#gbe #3/IW1 _kz'$/>? |1Dk+kmwX$Wk^m?!u'( .򚼛SV.._M:]oW݌/E)ZC  4IuI e#B@)ۓgaeK+=8Uz8B!HsL&q#98Gx`!aJ[?MR\"xҿHgoE3.._88N݂!q)OokTiXAEuSгn>ECR+K Wdgj0S\IlMX&iI5%9;dxe(:)%6veLmbaqV(lL8:&Z!1fRuV Gs45N3D%8d Z 8%"9u %B2|_r. ph8b˴;l0z^ (!mjqcl#.I{&6F|9:{r^?v2v1‘u ?{02xɱ]Hᢖc|i9kh/9g B?N#9DDDX!Rߧ4Njve)Ia,AgzYOb+(~XA15& /pI"E?IB(G)?09 (#3'qfS$y Ѱ'Oc2=E.؉JB{Z*3  B O%Y-$ƕ!\B:za%¥~fbX;":%,L),*Y|zTqln+W+NyGb)XZ71iŜm"9L3VbHHą%2-߹pIF6'f]hw;5?gE8jy1Xm(\FeO4jԅٰRY.}" RcQKVCEHUq֛֞[߳_dH?u~Qƈl_9Na-h%K=y{ue4 Ӆ2sQcLJB[ZФn_%'%w:bGaf)9y!KX͹QƝ<)X4Z\{?{O i"`1]G.?kȝ> t;l CҍTJBDhȚ#_}{gڬN#I8cH+HmH^~ԃE:Ixܖ>+]Dخ ˴%NIn),̷]~O@ǎ'Ӝ%_b׳Ԋxe>lN){E,i/c킰8}!IۈӋ*-ᔨg#s54>hGHw+á"[\ x'# /RDl" - jd}ّB8}㜪!M^#J꨼lzNVGruO,7-oR4I2Jlqܿg[3"(;)FWh}jhڞ1`P'tHGтr ;դbU_G%jggd'npņ4?.uɂ9OY~{ev@.hlN{!&I'VJPҮ Z ͆Zel?[0-l)QTA+vZ"A)3&W])d?9׹I"=u Y?uf-.M]FfԉZ`"Q˃4Z>M,j|^⹅ubx XYJ&\Nɍ |LOF:hO=B&<&P\BȄwIUscb /!$`bxKMe{DBgg;-gl.R.tleh=jK1?II$ue*xAe-^$ >;u'dGp7e\P(Z7{]Q]-b&I@h] ӈGΫsEV, Nx`m" O٭Je_NFhM~ǵ,n?Sg5o&/c.ңMl2c?F"gK<,!*˝؈/Cf E(QEl#>;*8wd7rnEYq*%F֪MsڣV9M@av_t,q Z2Jfi^~hY ӋЙɫ$-~dp{Z~[PphFm-޽#@_qwm2Ï+@3'JQE.oJL*j@8S_!"C]G2[^nP՜[30fN,&>^TQ2}uA9EG9An}9V `=I^n]Zj˯k\}X)C960MI>)8;XFh 32Y%|ʔ)?c] F-,%iAx,9T7J_hQ+ǍtX#(`觪|~OD"fi_h^U(dVlysc s ߟrODYS 2Ob0x w6^lqPJ|HDRYֿtIч='xves$@FR;ڢ}3{H V^ӢGƦԅ֪z 21Ϙ}17YS 2> ;rcLSGA^,cqSV׬%۵u巘.W@O\((~O>Yb ꙍ]t`7I)V Ք5B2i0  n=}{@)]ڝ peg-'U̬/V?ߏWQ4" I]7Z}ԑ< 4wZ-x38רedסr YW@QSZ? ޝ:[/+-?XW鏟?[]^+?o/׾{op?>=/?\Qs蟵C\q)y:Y~蘻<nwjA>Iגp?\=rz 9#c9E*$">q C#N\ar"GTAQB" i RZS9 &YY1̖q_0שIU-TA!j{H4h%|&*+3J5U%3#<*C:9}Q@:(YiB2cV>n(L)Z쩎$& ӓ3pnnIqdoKńݦ99d *)BԸKi.I;tuȠb `jXb0F Z`wH H@*Pm0pi%h[rus$lM `!H&` a5Np[5[2C`('&%,c<䣡sBu# >WA`>4[${ᑼ;[ $B.O I1pІɧ~:TP,˰s;խY y?XbA0MQA*nz.]A11]y 5(+DT*~e-:`w/xL~.`ۿA̶YG(xWGuUN8&X-`8B7Y:Ƙc@5]W`++@y8,\T2\;*2ZCLũe<+Աz d}/NL: ~wφJs͌Iu%lp_0w(oj}k e"?`'! ψDţp9Jg#Q5,Ww#?^e hh pEWQ3 1V_q 7b:K 0Py YO`o4@y=ju-0/s![^zΛwspBڏ$2;OiXH?|[tHS5pd ={SԱS[’-XA͢5XC3xHv#FFz>Fxp,@3xOQT8=Cx` DV,'v{^ K9z [YJ*ӏ ]Q<=+ b1LY&*O٫3A~V)i:oH=WWŕm @>-~4 6Eӝ9- ./(w, H20+ w:fֿFntcE M$"8F nd`4"4;:GAEʁ~Ld|~{qP[}ڬ_e.=.z}?(sYI"[bCj?Vf2YPoV3 QS}F+,'"]t6).5&RzƱd Ώ0ζ c!Tѫma04w7jP-XT/ ,~ԛ&W;Q6-:9dJhh?#zm!WKsjcev݃f! 7c ph xǒ& H? d8D2Gz'#Or5Aj|%\0 [G<~,޹T8ohPM@JGWvbx C}3pW%C"i"m)rElk`!E~;?6tؓ@8 wz z4%sBK ث$N(ܣ.ɚ6dѢKyFnk~V^-~G0CiYÏ7> <' })_* m3OmvM²g?Gu _B/Q- e~z64&f䐼/D~ G> 3KyH"FnST-le'-9r-.9>+O:Kz4G_5>l&6?q+ʙd_=ʌ`/Ђ#2?\eKb ˬ ݦ1{*smmUio78{>)3ԐSȅ)<z>U=&3!03s0\ G1d)TG_j$\E7XX.ˆ/_s`?cz(,inR, ) aRs=0uV7*ׯ? XO[QoӶ>BQJBa|WK 6TH%V=LYL`²N-uK@is|h8q\N3|aŌA5b҅43EsLB{G񔋆t.P>C7]Л;Xu@Ŋh:A`a#҈UF|ms#?buL}4*es:OoOS cy*OF."}]?8a5b7Ft9<4DpEf:YGϽ.Y54d ĽS0?&qU;w-"҅$bg B֮{0|klDbq ?gS9psC!2_<Ȗx9FFj\ 4Ż gb:q¬S[YK"g砷q*?p̄#;r5#ff['3}x:օ3|w_}URZk!Ɵj`O'(qn¼i-oR Bt4R <ĕT%&zK8oCBi k?X*b#/hm2{+Nz`T\rBT(~U&@`2;w=|r^=W1.*a=Gb%9`RGуyrgɇ:m:z{`~!dV},5 Ū'- fdƣ{_uهU[a;qL`t(N o& WU/'H(*c HO /Xq͚+w1[iX}Ǝthힵw{{L9ɩ-cL_sС<&tegF{BG?xfVY2LzSĀ_ y7청.xiD'W(n|w}?_@0o~/~o/wWw?W}_x=8هa'e_꿼G FYOk6KfX+3EC3/;O\o8IiGO@9/O~߸lȑ)?ڷS|ijp{jKUd? gi.Byg:OV=:S- #11H$G`7,ƎvZB &GD}Lls(d|XP$RѣgM3Hz&ja@rƧ,xqc #@ _\o؀Ts򥩃WL>Jt36f6=,De:;nM\tG|CcD&- Q !N7kWC͈g \Ύ'k{19/ >I < QAv?ow/p ^'$I=]hK$ 6-LK% >JrsTEOl{/[[xhmhs_WWmotg\Iq{Fu>{up~Z,wvpkfdfDY$ըWWGHBWGILJHKMBWGuSD C28*  Gp wZ1~ϣuRf9V[Ve 3& 63Q:y;ؖMW2zR4޻웉.ka{O-W^DA![J pwĀqă_ި]"\̽UQqvH,1؊[·! aH4J>5[cgx£r`upnhY[О *=+ âx֟"y63e ]ۥ-?Y uaA7U,kcAMNӥ+MB6Z 1eaxl[9o  exoLޯbd ^{B]eXu\G"HBIx7s._ u g-;݀|2L^ ޫ(J+r/e]TX߂\2x$< 86 ̰̅ EGQQ0I  mTJhAZCW|](_n[ӵ:<! 0|(poYTwwdwR %J1G -]oE!sO'g"hݵޭMjy.&g _!ޛ r9ѧKf7Wƨ#{9c,\/ g-}Jbsg=5F?Lv1\Y7셱 w%s#'<ߵTsY/ Mz`zP$#`G3$QpT0osеkכ*~D i /`82qFxynbCt1]'$áf p҃>vkhFG2Rـ۽@<1wp(-y'ukI{=YЎϩMM]H୼ }hv:̓$|VT=k%@ Uvލ@Ta6co-M@yV}_}+Y~S0)8#D=)\%^,B}xLg@3M |>UR9[򆽻?l!.{ސ8|+v@ 4T;[4ﺺ}[IƐo<L@^f/uEVK 8L=~"o֯^L9)gҙZM>زf!M_P_h\π#m]mC& l`D?~ol'׫󣊣_q4)a$!EVRah b}BPaa #k$Oܣ9XC:Pn >-֓VM@V4.%Rl,~'9gۉ>(SP*C*l07\q%b+Rف~(6O>!Kkf2?(8C !eIq=*Z? ==a*.ʇ(S\}GEA9 F} &֙Z9Sܪ>>M9(c):hDj,=DC}Gms\廉Ca#[͊IIia ?66zEլq>₥E9^nx|?YS: Sd4F^D@9oǛF Ek#Ô/iN=a؝_D^sQ㙏0y-&[E~5ȿfZ’K[\rˡH3 8NjT}9~}~{֓V)$ٙ=1d1b$\\ O4:9o=K]h@iO-2"e 24x$[GKSv-j#=4d`5 CbppCh=TzXzxf!1gBbEcQz@7m1 &"{sOk+$&r>" n (LzF)*;ȩBz'*vcmᕪ|sx )p$ߊYp$ӆ ~Q'_sk :l4P^8lpEfl'P^IlRYeT\L_āOWffnD5ԫ:_љrz_=²pnDoY\2sN, 0AuJx̜~W|T41ӻF ^'zEë\&&(cɻyLO!0MM=%FǾ{z<Do{"P/n3/,A+ P _vt{O9@p2>C?_;;_|[Ҟ+!7(K1Jyu="V/&]ٰ= CN;4M7W!m5wz>]~ #wis;DDQr-Co1z"ۍBk F ҇'=P"]y6Go8g%4I>9r L>ΩkaWRՂK7[*D{㏧.gY`$|~d9<\?ta ֗d_#F?kx9"tkKVTMY†- 1FZ*fkJy~ͦ uV4T(%Ybm JuINM+uj2b(ޥ}Ԅ)&+_@mem4.ZG,ᢵBtx켰?m`(*MEK;=l_u,nɵ|6 oDۯf)b8_LlO`>Gy(i[j'{\nx)I3_(0tw"P ;tytgt drU dd;ZMkh~(펑ߐhuEg55'LrrY/o+šᙬJKT/ A] Ƹ="o!S f?-Ӳho]=ΗVVǮ[t\1MwiP9W)! ,u5YƇ|ʑ]Թ2kZ[@]M{Vph]+R@ ܏$ø֢M˪dAT⻘#>p]9F1{Cd?Ь{͏㽈eK؝2~ߞ[jLD &pK' %it3H uO ^9ns2" ԑ;9㋿Hȸ]{GxZ>e{p7\.`x6*OaEcEɌ5|y; QTb s+[mZȤ`E}Ĩ-Zx՟}N 1ӗPÌY1OG)ZX=s*?mҬV{ !zΡ/nѻ)1 H6LHϕPk3oz3f(}Oh,AAw)(ZyƤS x*>i=hdri衡fԦ uM?^[ߡ/^V`0BAEá4a"Kz?%eWߵ.v;w*]z)fk5@#|Χ,]zY"D.?% R^/u퇤ޤ(bv s`uO@x1{%0FoyMPz/7ȖFkKtM-\3ُ ;`Oػ8@OURdT>9@Zy?\ܒ*`tnTaYf^KV6B:2\M*\"%bުcl>{(p9)1sDNDϴ6'C3&jX㉄,3*+>7^W`w^5|nADF?ȸ8<@`â߻e}w?u:ώ?zu[zq(@sf G1y?i=ǻnl||8]۾ւuV8|2j푷)1(.ĉC%\9^cQ1DNs^o Ha,#̬[\ŀ>GwΙth!#عAhh@ ϖcKc˜6݀&y?tG2,Gz42njqق)lpU1ZH̭g ,'Rfhqe uEj,V!hG#dszDĹ[e}VިY6/~qIY j9N?E5`3%C͒,E>!Ua,L.)U>2-e^0c9&3isMw59cD@~d7"=Avt3b<}#(V4 ٓ?TgaGII gU3ί[rݩyRK.qTl3 4p%bE6c=ri?/UY"픪XNXT7dvdoĵdUK2 y=V΂F;㒤y d)Ź+{q+̝e٧?^ YLjP񌞍|lQ^O*zN..X7E!QL;;:  *%#¹/suE{Ogyqvs  #:8 dTϻrJg[4PWS,;SfHn') is9Pb퍊.UjueWz"?9cl@hK(x7S8~xfZv zp~ˍHmYJK_Mu'/`7ޜߜK }JZgk-PCLvl)vg8MΘOduRf)Թ@v.9S3+k"B?kDs#֩r*>~eɆ*X/'BF=ΎSLza4e Gʢzfh(ƳFW!LriKb_.G '\!95-W?\D^P0ߞ9b8ڒlM my+޾>ֶ2m6EKCZ#)NьWi5/<ˋr#?ӎbY"J)T$,^N+0GY?W_ 3S q(h@ yD;UO %la1%xy*Jv[EDA1QF@ImDj$vs uaq$-OlBhNJ(1{ؚ+")aKw/j_ɪ,a"xcn 8oˍCض+ ;-^c* 6y ArD8v,xlZKpV]Uove|ʷ%?vj*4TmAZ3Bd+B e;?)-xDiQp1.c{0"t_wReIy+o?2i=a.sch~Do9r^VP{,s|L]a3%*%:;߫Р)-N 6ڊ: Iym4QQED@#Ӫ[Diy#5gKREZ\p^z31#zsI :0#XOO!="^0,}Տ@uӒ1+jh8á8ܲX! CP1'4Mŷ]N\0\UB7\ASXjJUa?~~+1kj9h9yS5~cx'm7LI|-68!#Ҁv:;m髛 tH I!\p qC#*Sbcj=}!}TӲFKZ;cJWvG'6;auHSuJL_4j'ӂC!CKWk9[Df [W(7-`vȨ`¿?C5M> R75BU?\JWFv aז2 \|>a@3ZXFK{4[x|7#86&&]HBr (egZ"R5:q~ѫ-k_J>XT;6@{oAws v|`F##95רI(n8IL{0 XvIuCl!f@r GA>p5!Pǃ{_Gc22a} PyBL ~ d˿5F"k]? wOQ7]Fb`=xM&y0hA:U)H %3ö8g]*gvM:'谾+P~zu Voi fBJ u~{ M ݮԌͲ6\ӻda1. L8IDͱ4ykkwh Ll'&k+Зk쒕y&beo}>s:50 8M- pǿaWkaha5V7`p"%V'DZw`f*'虾zD3m=&c;zǴ'9mF)7S(5Io/`F `~u? .~TxG̙a e< | @ޕ'_èo2z#= P~0 ڿ$F=.2<Ͻ4M]Us ƫdR]ذz0ެ̺gb!HU ?I%C38rk 6쏸+!vsn?WO??>?)O[O^?#TgK}?{|Ƒ;j&* 5N݉0 Dm_D>$?p>o;^ v0=9G-:K_#1Á!ʗhj&9GC[|ZpV6H?jp$gKU_豙 S9+*qE(Vj^uQh^Qp !Ae?-Hb#V?z+:F?cwI_믖h^(Hl?:bI9;4V hM6wDz;DB€$KZ K="\VS9'0-),3eA|Kzlxh!!ח?m+1ey¤5.Kfa0{#Uc%lBv>4ڈּXj>Q:f{LHJ<":/ SOS(AXD,CSk?Osx$>)(hܸ-ERxiO2Ѩ%/]Ți4ւ9 ,PdJXE+ş(bKYOgYDȴSTU.!FlOA<IJ"rdOqŰ2RDx)zޘXEp)\;3K# (6ٺ#3[oYudH@4AI-fiE?2.S>NA3%XtA\dGا,"UADyo&*5b? !ab0sc??jI\΄;~e8Թ!2KsbQra+V35'Q@1Ï,_yT6H/_C}y4Џُw$rl뗹sVmQ u8'?š,8w_)_z&'/JCg?e#O7YuMs}ϫ@)R(wK8|NJٙ*D=gS9wpEI-?pGKRm(ewK'x2p&V6y@GLG@SFt"Yr0֚yqD4U/l-/5/&YIkRꗻ(M ?}fHW4?-)nޠfBOeŽHo]qs̓TK ]+|ոɁǺgsߜ-|(4Cjzz#ٌh(ˬV< X&xzV.?K&8B 55*-[yvLツTp Ō7rّ+Dϟ9!@QC[ hRSAtVE=`8OK]yP3^H?إ@Xd_fq\+yPem=JN=nD8V̞l ~>|;b$ Ǣ59<sŬbx)`U9e~sq@_ [&˫'r@N'iBvPS魰% _9n(6׭yA&Y 3T}}mF~uL$N`L#$t`oz@uy@S3AFHfk/Ϭ2Y 7BLyaSψF53 cc{_<.@[u;2r<ko2!]{L<)YlF"K^wwΒz go;q @}[~^J)N}%cm roY!@˛ȏU(]on٫ }˫?;ѻmqX ?:cEK (ۄ v@1]^U5ku|yMIp1<|2cI&` :co`5}~>#wc#u׭?DV 䧘CI?|mq_{ uwGh l @DyYCɸzR84(VHCGndr`.Yy榄T iuL|!7oA" 9ЉFe30( BDSq R6BFN{gŴqܙl؉gN7PG]6p_ as2=O!pp 2bこO/5?-}?+)薵N(~멇<%X1 O 2A,'J|p{`ŨL͙ 2(yo8Rgr l#{q!W[dr :642l9t6\ʢ^S!W:_ 'r)P][?eRw9d9՚ Qw.ϡbt ,쐽`g 'oAM0q}8T?OcgpqHA#>2;́:%?x(IeC'+piH+"{ &H<9'NTtNN /EBpeB>fU9hωml^.IPwb/6RyuXA{Ǒd1ՅKF7!K@|ÀC_LVs䲫F,9< DߓoDbIzjcI?3/\$ R̺X.ڌL3Z0BՋ*#'t+=81/6^u<6ㆿ$5 %:8#o1r}wIҵoM9Bt$eoOΆ0zVG_*>R56 82] !`K %H^922h>y減 ̟;Ff7;Gs];n <mk"4Rfžπ_[[4VuEfcV+ qE)l$0wydta匤@u݆#.u_ߖs/gd[i $1wg ]`fG-0 48&vW7w!Ş Jj3;8pp4shTEUOt*Բ}>hht&Gp]_@ ֭N̚N+{&b`ݓCY58d 2H3Ͽo_eu]{+=f/]W[w>לf?\wO:x«W8G}st\}[~Xq+lG^-8Gb'~:̎ǽ公X:|E6NۢKMEx~ O;ȳAr~mNQ^~!(|oQЄj n.|,rnꄣcՂ@9qpfi\쯁x" y`խ44OnL?d9Aky D#Jnm S5PoDc8G HLq`J:qrfIE!HHhPY/ײy_5>/gsAp' 5Dڧ:(:+kΦO@0VO\|#nJDwNXvB*=|n6d@gOxtZdIž:;wyW`D~kIMYl +o ?)qDiGߟ&mQ6ռ^ЛB[c-lt˼G5nƝوE>g#5^$TP-ޯ5?"ȣ$WIB9Ghf7_=S|8\,N/T>`'/k'/ye\cX]Hs~@-`h~QB ?>J}s⸄Fo$(0sd0G] GʑKyq/ɹ`v{a9K2l2*Af1q+Uڢ7]hI\u^1L.|AG,h>p5p(z|,)lhpMƂO˂8oDpҪ# sٜec M~ (-iR'璈3+eȏH$cE}jSFz#F%<͊a?OsV~ ,jx C?ӡ` !x Oр0ax9#GǍ\)8UlRMK=p՛ Er{>B͍mH{ň8TwߏJ{'MyBb21D&|Pbcdn"@z!huI =_I>!e'$%c<:=q)5>Q#GnzG[ޙ.W/qxޱ0EW:}#;W%?ֆCȖޟ".. 9_O9q \֨]4DopH?$*,L!-jT[5xL%'`nv(F;ܩHdN|)tbIy(@!X԰ʒ ]!ƃWEF ?TCp @v7-UL|g ZLf4X1A9l"ct,x1yGJmQ,atL.(h3d(P0f^.@uU*IT5{{ i}8:yU߂)-˩QSѽ$ \Jp0J׽B f 7 ?|?[e@}WO;?> 6%)8~"\͇8_÷e3 `'k<1]A*zk9J1sRLE]fO5G5ɫ$Bo\$Ͷ/!u2o@1_A1"‰md3^Z?`3N@Tt FPc[#9Ŏ"$^ό\na׬8kU;k_5nB&3'z{l:,64ﶘ;-+ʆ~,"%Ic 1@p7>!ardb#LRM8Xw_SIoH9?ӭD-.x wZ(ц9`!t'"~~ LҸ|mm`IH!_OJdOsy($|s-~B8SFr֩6d1xrt60_zY3)@e)1Ҙ "`p-+YId)lmh gO]>1"m- _k8l/'} +}e_ǟc?s{gдa#Ό'"~i>crqq$x:n04exM=p[v`ݑ!Dz~rH)Ҝg^UFި%FtIc~O{v))h؊^(ϐ(] 8_Txr-eeӱikJQkI9O#CۘUzHۈXJ1#2d)b/2jHy wZޢ1a !<5u : ϣCp }CP mzQkXP1J@o\-4ܓ{x Ō4.Y05 fXA0F#J ,X)fYQ/Ť*Kfک%eŹؚI4Y*]Ȍ OiC~Z9"Y}EӃhSM!?4좰'r}/POǔgj^βh<'jrxx(,BSźJaj]!wzƒky }*~z w4aēT&棫ic2фit6$rEYH 󅴔{B5LƤq?-_G͌Ȥ=Y>F;S /#vQ~ H3/ѱNK= `뼢\>` &$S)T.QMv ?G"Ye};TUY4rjё :g+n/UqnCH̗wrlˢǗPM{ ⹞˜a=ڶD", ,jR<bIM.+2{y=Gȏg$FU~`?,z~=3S؜ϥ^=ۇ#uxP <;82#".БhX1UrqTmq$zӉ۬Et@4|!j# m 2lDEtriIO/fE賖a:#H)n!LGI<{R ';ֆYnNS@bT 58Svʕ{jEqO`>yjX>*̧I CkN d 5x3Ԑ"tpqbMXė=U*籧Q&?td:FeN|e8ޥn?/g#FŌL哻qLwc^7Z# z?l*N]t,+IjQH1C7)ʗ<|<%;_q9wR)bSq@؋" LF+H~~8.d=Cц$UV>Jc [m3ڐ\O0c̩ S4Ϛ4=E}s)R&^WLJ4ou",S>7Rc=!8Xmo MPR'1*aP D}i- LHQIa9]hW_L]礎 L[)Rێ޻WkL)W _.ϯ]OO_̎:ȌxKCɁq[00|&GKhapu.OHZaF[,7ǽ\tpAϑ8*Su]B}xJѼ&̤W}Dss߼4SlfQg(>rB.ͳEjLyë0?¢ ~YLDXT]Ho;p{ ա}<6|HHL<@07k[z(iq~XܙJE3"{^LO3V.Q=_X7g30H,Y&1._sn=8=ތ?.PhɄpnj+hžHJFg`392OK+3Xm4Duy ZV1߷g1:e*2gV_*SkoDqT\'@h0QtV. l{$5%ۧ{ aQ(A@NF>S7sR@qjmOJmIыog:$AFt\ trm#U3w90 )m`nu*O76 }@[xg X:=|)Q\ vƔfy@cI]9~tbwc>\ )灑}g&m $Ŏ&-</E|Lc`IA` hbeMyHi%Rf(p* nK պ/m6dK/K@GT8ЇE\Mr\cF1uik=_WIGEK쇏g 1 <ɘI2J0 CL)Jl_ Bi- i׊?L}WUﱦe䚺djU$Q42tr3M;u?ͷ{*{מ`WcϦHPn›%k B]\D/Z~/Yz'6*]\@ڊ7mhgװM8K/L2Mp[`dF^UuHs,q]KfɥE_<)+s1\B7_а"2_kPHDڇpj7W8|%" sOơD2lwQ 6~K-—cwCLc33M*z)v(^M/8@M8 q]i qF*בF~0W1H`ީ<'i Pqۆs=@]jB;:OGy&+~({XYfhaNR ya@2Ro^`3f=`p(Owĉ]QS"ߖI_WƙiD^\h- Fům7 0U}yW~>vԒNj -o*C &\:2B"+ςX+4^A8sfZogԤo[>_<5`!Pbo٘qYy Ø~ykW{KPP]+|(%"oYi9O>L6A?zWyG!/E3~9s Ncb K1Em@C[-dx`Iu72a؋c R۝9d 1j9k(ۆ"prz4x̵7HeYtZh%BoRŗZ0F_? ϦӫzQ% w֭N@(t;Mk%ԋv~%vd. @[|;Şfb5*'Z'~BK>^u7 .{1XQ@uGy0HC7RS[ir]t57XJ6x4t[%qƕ *hiX 0(+sh%.~ $;[RpZH:ӞCo^XgB{Kz, o/`< f)r}u{yY01|p |\PH,ؠ} Ճd&0+%+b+cp%Z=ې1a6jKEZ?=E%n)QKcb1?YE]0\/7;V~ ?Ш"9a?ofȷwvpkh0DY$lWWGHBWGILJHKMBWG}~    " ,   Bd ]J44<\oR+o߿w o_;%[߿w_WO7;[߷//??O|n)>8BRv$>:~|DN{ߴt#g? S'>pO~Tg^s7x,/d:fG`|F1z) aPg i])JTYY4-#wD5|g_ǂ>LZ=N)5ئ8EY @RrdNr\g=^1nBƄ |!3"+v0혃nNW0 92 ('d IWƆu HTk >}2_%**#K>֋Ѓ}͜D['愘 TXRFu3JwV0K M lt~ P(yc>Ҁ|*" &qhRPgH@i(d ;ʥK\rIA?^G]%vZyP4`э$4k[~D|2}k&'eI*! \3<fg 0eJ{ \&^!A|Lr ,ir3Х4qSeӜ2$XԚ;L9)u: m(ɦ.#OYU.pᒾ,Xv*l~ˢ^DY:ܼd,qⲴZ]YfJ1?QOGdQ%}PJyZBNyJ92}B9$dͿc?dGn,@Xȋzl$DZΎ - Wy1yYȯHu )yW/K‘P. 5Q㳋aRT9R\KȒ|^BSn!k,1$2 am|zv?9a"|!Rq$CSܿ!zu)1ObAdD(#'SpQ5I @"OU,,;sdh`2%3;}|sndXؓS2,Aab S,@x`1 jb)I @:ş_F?2Y"?dcQ$*YRB|ÞNVG*$+YL'%.Wڅ7%)5Os^> V)$- =Kp-dD;_3ĹȘ.nS<puH| 8P$ϥmv'UDAT<*9kx\hGs ?3ud(R>5 }Z8ʖ6oL  梔R.P/'3֤G։ICun=ByŐ_ٚ$%BDy)5(i*Y"/lۏ"2{Lhǯ(0C(?sT8jI.0s2hΏ;rH2,%' 1؁݋?p$5g ?, d rWObE~ҡg}iQZe=!J,%!`4BZ-?&[EDOXy(\Gm~C{d<[¤\Hb)}A峤'~WG/:fj=-LO1mЎіmTѦЂE(z1i%g$riAw:#ƪ.%'ɿ>ؔc+N{*(.=QЉ!~ w{^eTL&?oQA\G [3^M$L3 l@8 LAž}Z#,GpǙڤN5^|.^-$/\:FfԎ3.([ytiDwC?ՈO5@.Hf޼]WH;s8> )ő"R<[?q'CCT%ʩ& F t)1rNC|kZyyN"ybc _[@qֳMEC0XƚfqAى'KT@uzo`eRMPU#&bQk~vLϋg{ _B av.ּh3㪼e9 B6pyK+t(6)C\-.9/\=cTev΋iC_ ~Er0'nS0/"JF mIPrkP/L7U?ͨwK ~?ffyP+gUV,`1i_mta9$jʎOa@8 <D>msOCĈc t(3V˜Sʃ wRY]FBGe~w1KQ,n)MmFfә#8VDdڸKSo)0V;Y'U?GP1>#w 5;r&,v6<k'$Xuv}jWdT^kY[m::UԓӦd 0%x:D&<"+Z$V1*ފ\~%M> v<_O[XLjc}8_>6y*j.'r6''->hBQ3 ၷ{I; 5f xN@+@x,ԟ 3Xkl5S,}2~U\Iޛaa R&$cg|by0>0KOL?;Tt9TXǨ k8Ӝ _k0խ&`օ;X!to?&|ⷙEQLh=uf׋'?pY4fvPPmEm /A;0e7K`{-@[%Ѐ% WnYKyپ)_kwyB[Sy;1%rntZ;]e?G+WpMBg+ <0ʚ,^~ =y qͣ^ZM9?"(̺'mnXY,ֶ#fڟ7[?#,j3Q໗P+ˡV6|SY+gṭu/ ۊ,jxzV)̕2gKfbEMCK(ݡ<6ݝI<&x!`u,@n${'1Lܱ23He4JfLnI&pkAlAZSwםS(KsƊQ,[ FJ_{}rixog=k˔q#~e|`>rR?3o^?S>ןgIwP}vW. Ühsr|_5Yq\C7_xç ;>?͟u>+8Qfjj%tkش}>bZ})xudrX2CsñXԱ3j!e9;\ (׀k7O/Kf$@XF"#J|FHCA)X*^ Z Z,Y'>Sp)RcxP}X ya "S&`Z7iM_۴>& Eޔ"L2 3#EH;p뮃R| L :th4IJqܐR"gtaͩC:E,BA\f `=(Ҍ2}x1X>`RqOҖfFfGPWuH.]5[jĶo&x 8ZRj9 C>sJںLҥ,_% -(,sZODX͏"8"\<ǥYbc!֋KA9%fHa=-C-LƻyGY],D'I+zYl&2ԗ0S9gˀ&-]aIj -F`G:\,::_,I'. >E[2kPߗy ЗYGcB+}8ɽ#U,0$8Ee,S]DH1GF<jb2vĺ%(L 1FSǸȡ͢C!_pac]2Qѩ aX:eI\VyrI>%qg!&Qߡ׬DGxzDZ`ƲIw*“5dIԚqWX2Gst+]_H%(!d347ck۟L ]ˆh-zF^;2\4; r"&̥ |vY9l^{kݑRϿe4`fڎ7i%NY ^d,c!gN֚Oe"s#jkr=9n` 2lcťg>VV&vn>7鑄rT:Ll̈l; %rAYrz>̩=.̊kA*tNQ\Cn{몱bb%LNbumK.Yi!( ĎB$hQW+hۉ=]Zzqƣ} Gt~^ }Tm=w/\g -c\b4x "h]Em-ԾFձCrT~iÿې V^Q3P}~z؋ ~ڱs =T]F 9YGL1?Ȅ@Yx.k|".']Q7S22gI=zJ?E:=KST0Mty}뙎t߰ ӯ@FUPoL] f᝞Ǎ*}m1fɊ)q>`&gF:@u&D&xh`.z l m _/[Pf\?ȏg-IB<&yIKz/&W~Iffc @vWt+8xGp & V)/Wf0YOXt\v:t\(FE o/An+lsc^ 4'K4S~Spq]N<<8|zdC՗.~1Sȳkc4NmCev6\e O2'VVyU7SyҝLL&э3JP,OM"rdM\:4T0(2O'0M#2F"%_DP]oו-b>dd%fA,1 h~ϬƧDZ"$pP3uLH X~7 l.@(ā9W"S[ % q$ y7*~Xs~IB !O9F"_H AAg@1;q"osrfmp dnhzhz{o7ѳV\wCffWow8$;kM)iخFATl~SX*?$8a (WpmeW9TP.(g#3c+kI+(jjl /]jҒM=`n]TpNNωaDŸ~IR,[ITdwⰝtc M^}clP>e H]?V h8!Nk%ȿRrJ+iRO傩+( !=Q.ZE<)vsAFM9§0`OY^ Nq$]LR$S⤌ߗtGġqJp)2>l@4ƩItN/)QA5%W1m WD?`$ƃl°Q|CX*~wMN c`-K> aL:tV"0Ţ.,b<#h|hy9Զ \Jͱf,+J9wLl(>`&,T|5Oes|&a ̆D[FH EjE߃7]16m3mc,EGF!^P0d&u-(,rAJ[VE(eB|XIqB zI_ՆùR?EsaH:N)fiy4QIM7gJddt.饨9WL5S CW&uQUO2M[4,m?^{sJeg)4r!sKl$JqiPTbwB9I_n Ij;ZRϒ4^ \%`r5EynQa};MXF '^%X.Prra ~~4͇&vrsȨHŒ+6B[f _{qlϒ4 þ4Εt1gG%Tk . Kk݋ǰU|d&L5g';0cO%ReA nU3WbJ>]8 xgb)fIϔ%R3kD0vJ>~A1vYE)zBW'}shRf9sf6LOu$c/;JcgTr+0kru.F^Os#MɊ/\Z%Яx`e|.opԛl14/I,yxjQilg&9Fs ۬w8svePlJL6)\{4cw` -xegT:&{bYVT/"~BcԅBCJtQ\3%<#F)Nʕ;|A?Wt1'ӧo{Éׄ2TuN<ѧԓ Afѿǟ5*90&U\He`*wHx1#>#NgB/^!+Tcϥq:$%*wNFG@mTYQwbp&I3^ j'|h^)ggo.=RDR=ieXv>S pxp3+U\,DAy3,7䯏l4c8gmnB[EcͿ۰K\q+}*藙"MVKt .gY˶)c4#A ǎ^oŹ]GQ\~?P1CēV D (92I.@"b .Tg~gqӡ1EpCN J/j"a`{#,f kN?6x4+FN~E=p"V+;h\aQ3DbW¯*x(~쬗ߠ(kAB CҎ-TUEG$_j# 0d>IYHҥ\Tt^0:42zZ5jHWotّy^/Z[Ze@}K} 6mӺ x#_b z|-O3ʐtV,\?8׋Ɠ,W᜴)̅:プlIb֩~Åbj΂[s6*_XOnN^*"et:S*2_:Ee>"Įfjhy?T8 ?OJ19xiBXUdp@z.}nOwj {o`)̥+LA$& :7"9aq Fp|7cĒ7{y~]Lp#);ex9ss"pzpM^]Ja@O xI\Xog̞J54?k o_" fO)_,PW H{CO ^ۈDW8w(Έ2խ"{jZJmRaZ_cSQ:u m2 X-[șSy u"|< a3 ̅c,_J]ZE|l4b7C舨XXodB"mXuLǘ iPg=s18Ubl̷)Yz.q6glq`QI?kYVfCl[Clof`MA䏧CkFmrne,,ݚ㱷ȔKԾʍ qj-ljO^Yܩlte}" 2+Jg[\ GnJdQy}-Ѓ@y s!ϼv /1g _,̔ڃO uȞ8A=# _{tPAJ6a"heP()k"@#ǏS҆h;lDDs8^u w۝ Ck'L׻r*4OkPGlNz7sMq9 OIJ"^߇8 t}mx zςTdDi@Ujf&"/؏YgpD)UצMr{Tȧzim*@9{@zZ&ݐ*Q/H$3l{߄ UÇwzF5'Ŏٰ0;g>LRݣ ʛ*qɾx+L4.Zr3Q۸Ml~4!O }F1v}e]PiEO.GeD@D9xޞDXo#"?D;CN}ILwrR՜ܩB? ;Dv"pp7"`{5'Ev H?# AZ>\i.Vy+Z[;tf~ )6x]8L=E}5'߭}yɳ+X p`Y.a{w]Wm~q>rߓ}/?#_|^uσ>8~7oKw8mHg99T|twLzgE`6jaG_ L _.:5=g_ܐ}菉!7ț7؏G`{[5O ){dEyտIG@,gD pP"ca&A.kqmX$CC)@BӎJXSϑ7N"H 8rT @opaLdabYYg3IK@Sz,@s!oqzDSL5 ZJ:t 7FY GwpYe[sU1"trj!\ h$W >yx~3ilJ 4b\c#Ol \gR$.u,!.A$|V`3|`4\Y\{ 0?os2HO_@3O+ ?X%Q{nDtsT4i0Sϐu8?%Qb/s'Hl&>/#wBOBѐ6cMRGL8 oc`SV>!92A-қUܩeAՅEGS2KtĹt//L7)=S_bj_jWo}Ulwq?`?k~?R97 `ØFt3WH@9j`DCU\t; ~j0//55ˎef >ns@ϥ'M +RO\,1hyŃ=|WCQ,-nt$\T (g+.Hب9='z^>vW%Mb@c}L4[xy9a8BJ9П=2~#OFPH^x^N7cPB;2#/YUp8enP04 Bh%ϧ(*a>ŎqR|iiPW"UMن5qu'XX (KyIq=Wd= t`SZSgsǞ?F>)}Ӆ漙5,]O5O|-06g< ZrNsʱӜ)qXqE(5%=^l2WTaѓXg!y񰡚{4Ec- i&-O{|'xRsq%}ƅ ݛcR'-l տ:_;1 +kN'̧SDŽE=JAU]}Xd.9 0yưr_=5_.)D(Q#/]"Tdc{, '!sʟW (JT[W,|+~aߛ^zˎtʬTd&q)wϒO_t6UO1d~v݁4}<:~kU&? 5V>1p/O09/5_fO.$wXUDEow\`#:" M (b?C#㹴^i?_ZIs^.¡FYg(X#c!K!}IMM$BHVrr*[IW2?p=Oִ& Wdf͖ĘifܼicIڌJdrįA˱M;is.2|^đ}$/T1y=s tS$tgb/xHO_{ȁEG1pfC%!~LqM>%+V8Ќ9 ~E(+S$$lA8;*~2I2_XF\Bx_Oy<62j^~k]W*/ɮb1i$F߼M ^_ju|oc=SЪ7)-UIS ]oiN:R;|n=e04U&_O>)>?w8\h;LԏF(i%PS#b,-;JaFSbh.MG$DGQq]H ȱX-$\{HTzE~!%@x9nTneH5ΌA#\el`@La&5UEc2Im1$"Yz.mb`O8(T-MC{OPm.@N;XrTZX)l#-?b|PD_f0ɱ+Xf ^H9Kra|4DyDO3/LNu(Ȥ=J^4iPՅD U:xؘ묱YDɌl g|'B!((c X,4-&ǫ2"KbYϒ D` Sf }^t)/߈øtJ]Ԍ"bstI\Լe#tHhe#R O.L}6Eh)Τvҍfd…p6g&T92-7%c9[ʒg׊{Ci~/ b^̒M\ޖ^>wjMNa=t9 y"߇X-İaJj8RUGМf6%8(h=fҔХe}elQ4&K~5Nɉxxj@TތKyufb "MK._v$V^gxTy,s,CiSs̹E..ז\+OZ+?/ 3GUN=ӝ9y_.fhU9B˒ kr#)[T>EeE3*9v/[5- _.IyYљrcs@P.8n<3uV%'hY{^~su\DQ,P x*%)!u꼙^7=nfiYW?yr /#$[XJHljff[S+ӂc7/Ks5טmȍHp/h#WʞWnL2fIBF>) 3=.sy/|ݑ}'Q_NmNK>tßs6˟H"z<>-?3}+ԃ}Lr<8|3L]r/Ėq؉e[Ow-Od5y8 θ!d6{sd}OEA1D! T+43˸AO@P^Į Cb3T3A6(+"H^~(eHCDst/q!l 0Ň maybљ?,a:@@V#Bfl%vTKw;)ULP%漈/9 dRhy2hEXXX7 `aH0JS)%q^Mc"GP pO%cJ=Oѱǧ19%ئpG̀ʝIh(,ɺ= QϡpXVu˔D-$*K,EYK`?#ɉfgdO =xҽ9zMdg],G|7ԅ}"Cfe # l3Y.F-MHJw$/@7 NBZM ޹(I6[$Ja;zSE;\~`y'd$b!>܉hF{v,9ԔYŒE2ÌG \ b$ A:r-? XYBl#bt;|д/ )|FOz!U&(Ai9Wwh2 *bg wT]}YԄ OStU83!t)_"!߃tD*+/J2?<d O͡\Ruhވ+MK<fĉU^X)2y?;|}JRĵ*,Dw؟EPQssRGs Wbղq/ߔ(Kjg ERVzӔwd4r`ܠwy;SC;qV,SۥȽĆl6'ݞ|e %Da)$/t,_"tt9Ǣg3RM[^ |) ~Cd9͐۩=MTe߳m;kxl'3ئ*Y4pvmGSFٍ,bF>9;a]1}4rL -&EpZzcF,N-S5QNyJ?;|*PSP;Ϸ\#KY>B(1bPLI XulT' 07W_rĚٸ>~#5;lj`.ldRKP\S|IsE)e,jR W3…0&u)s\^H,Pxgm*#~kֆJr~4M uK(_ /JƿznXSZhjg)K7_Tkr?|y88\KDΘQWwtp/ȝ`T_sEH!K֒"|6#bNqFnGn}(J͛V e|ߕ˅C g (‰}1 e8<Ϣ)Xo~\¯LcmbZ/A^DweiTPdgLIf=v㏷J޹p㗆`{F~]dR.,S-~!UWӂ3ԱLÇxE>KS"TX,'|c(YKT 1 F3c<t,84PњU' Nl}>jYwU ^M,ma2J$~C]۞ x~V!R&1Atʯ#04CP3-#< `^}a,;*{΋=PY$/0j.БlR*jFUo鏧=*!ˁ;;[1:aC$ Z]96˿$zQT_.KQSn[sͧwG8aq/Q61:nd`tTdZYsqŨs鞖8}j]W)<>|sh)_K=AI(E&x%!G?}S IW-]#<3;cdOpkmu4F_IooWS؃%lw+qL?Sf`|lPЪ4ASGcX8ԟH<(iCغ~s[~2fb6~ 1icBWJP-qjbV}6SSYڦ;|qi?knK<m4X}m,>nyӉwgʃ=}CK/ -il[QF5 (^l [<ӥS xV2mʛrpGM|fAszfi@~ u,9XDf謙w iQ.; >?8LK(TmySϝ! "1 }g+Ez!ڐ0杙G}Tsu~k^뛽<}'xӿJoo (ݔ~J;/GJ(- 34j²hPh%7CV뭥yIgUD=U 3?vPA5yw@jA%Vf(u1~W$R[p8;)m<97L ~X:VS3Mv m'<Ɉԃw:Hq(5<ӱIeb@Miyc0{o^)} NsRQxB_S:Pb%r6 t3-T+D"XfD|k!xA*mDn8ah\EQ^&g&x PB7^ZAx'<ǑPsowO0&5"tdj\p?{~o}oo㯟pӟ/?~}qp_쳧o3i=a Ky> :>dл~zcݷ?=|2˗yR$W=wo[59a2,I#C\ Z4 iV"O]XM?Ӧ͈ѓ|NN,F8_yJԏvj\r)`)f@xrCHP?zK<VIqO-DӜ^&mjrbːFi|mDAg}WAcq8elsbBDC a#=7_^C~JBD2[8}*y׃tQylƹˏ!D!As̋ QН SÄwѝ04j'S篮y3k*19ѰC?LR3 Qw9aKߟ5G(dD;C(PJqT:ͧ dF9"YY,bgz`[|7)%[28{][2CIFs?_#fuEͶn ƾ`⬠:-?B$G幉:/ȭ#8 %2>\gI yL4)S(vRϥϗnMRZi|8GIRl-L1UjI1:*?O(yׄRQFS&͈eb+4?67"~vTllA;"1OGxi_Ԟo1_JElpA? _ /y$?[̟H4y[,IZO;0L\2{),4q8ƈKWs=NpX?є"X!姴 yA,Mj9`a!yq\l$a*YZ&;˹4^8j.\Ԩ, ,K~6"Kyi²!^?S&#$s iMKKœ25grO8K]6T1C2펔E[=Q 1w*g+?kNI{z ?%ۖO|Py4IJ7rZ4OgRf;غSԷuĕHKH|c>qmxW >C2z񛕁S&Iz#E,{<^*>m<|p˔{"b_M82c^a2L~O˖8 Zlʔs&Kb'E&aKRA|YN"0ߙ;uT>n.#|m4lXƽM8$ψ?z S-0) šv`Ll;cT{X-$4NCxJJ esw,: ER;^*B+?s; ιDE9} CRZp8{p$/5}$D"a{'.| 1 4">SAa'( ǰ(b|t3)d8AL{T~Ro>~Yߟmj4#dɒY GH>5gd5"Y3r Դpbݧ*xe^0M9ťXNMӴ{= C!jzQ5?~؍{\&(pUPPL;̋&njeֱٍ%CpKa@D{M~ody5%0lS E" {Ɵ+q{Vx<z悬TJ/*HL\j( 8brUd 1IJB:d1'.zehSSL?Eny+zPck>6 "`L)-/AF.Aq*@C._Ɣph?%O2R5J :Ɲ2?ɡ*q63:Z;o0ELG)i{\≸zV;YU疼/k]6pYǢ?2aa)?Δ}Ķ ᐓ`DO6 ?ЋKql?hqzh(lS BsLK mIb]B\rhu> bcFd_s*ueZ&=>62Ƥ^Sw/l#R?9}+yOg6%aNN&L/jTADi^XIN)/2@X$8瞵M`}c|/obɫkhkmhPӫ .Ezw+sLȽs>E./DG^3Ǖ 4/"@))Va|(gN K)Q*tR6adge锪Lim `.MreҶ}cǪޔ\ɑëxqFu޸dQpߢsi祋H^rݬj^]>ra);Hսlj ~6-iOAG\(5_| !%υM7qٹPg_PdN\L+qٜm&CnTSbT˙E<`c[PSzaLYY@ $VIy8|*0 p]S/0ywfV),>{PR EEL\[LUt$_jȡmgbS]wU ƿYT*TF}H]/.Hr0ddU[W7ϳk;GĠ ߝ-Y.R@jEgp](IGǔ""T>I>LA@- "m/`C.@dz,CT1[_堅QZ꘶(=*P1Vw >͆Xt)*'Tթ{,b0nwvpkhtDY$טWWGHBWGILJHKMBWGnu֪M"2  ~Mj gq;4'f-_#z-DaĚר2eđ6,e$.-iך%{oO4 ˽S7|(#W0-M:fߓ2ssL0iPn򱮿OH/\h'L52.fvJTN1Qp@_ib܀0*{Ko.2g'^|R\rسFjf'2(2+F|F!J?_?nA6PMVnOɩFLjeɗ4JRJ:/w{\1Y.i~qkap0tlθwms` ܌zk%zeI_Wptr9VJfV\'GD}4s:N˪E΄)dK˥!JQN.ixȺ<{1rY 9mP0bCNl98m~G#x9ld[-9br4.xi9?X?wȧ0Z':5!QrǠ\/wg$Н}aiOBoxI#^)3ɺ%B4,64π%jLI«2M\cDƆ1{q(W9طWQ\7*23$LZgS ɲGS̵־t?jURUcߐ1}Q9'>gN3[Bp|+z =~!O - 1>‚)dz$5& q7;;B!'?é&ӵ= qiQ"B8zZӔաHƙtź('p+C`廤 Q0ƥ& 'Ae֦_q3O`xmWo. _,U[1C/Kb`LJEtus)4Ϛ}n8|D\k[@sR;:2 E 7$x9IjCg *L[yL|#?)K[$m H-hKU0|Xq+" 37̘!sOI&MtՈ $c"v@^!E37a:Cl/_/jHӣ#|$?Z"@H@H }iJaxӡG'x% /+ܦxvn󲋣^AGCm䝖%A!xC-Jg$/rߚwzP",:&6mN}:Y~woW_Eߗwߥ}qRׯ]+rO~ /op'{>/^Q_[]?{uW1/փ\S>G5>O5pFxkG~#M|[u~j`wsC\+`/\8;G*۷&ҟuIryl=ŤJ: J=z9-DR !voMF/.HGa(۶v*&0-^(C~J&]*[x="gyͫlOOA5pQ}HU;HRN#DcU1LϞn oyYKe j|ӫnsC+|r8Te@'7RQLp- i,pg Sq&+m;'h Ou< 5b5mmd*1a1o"5ДƥxOYCs?TZ`a?8 bPh9*U6>ɜʣEJ8k 0q`kV_!iœ싀Ղ\*iS<9R*><\ܦ3}q*u1P9[m"3]IM5vmEc@qwD0038ZʲsG<.g}p=l:9[sg?} (1-[[ o(Yl" #n|TCgtd6w&&TD{/j32|yMdn#=+rQ7Ѐ.yBfql*zϛ)x+GN_哅1BQE"v&ΏSo! N!'qÍILjuF=D)FDr'NPZtUe4 Al}99Yq ^h.5!X.aQg7My1bYːfG! ̣<Ғݘё\F>ϓ= 8J-Ѣg*zQ%IG hq?E1x[1O ~nhg_V;S[]R}m@Źcĝ#I([-1EO`뗆E^x#$k ̔sꓒf2ՑKmE(@XKTeYDIHUkxE‹elY8ՙqQ"Z*NJ&օv܈[L wMe}^[KPw|ulKͥ[,O*jv(9,BydC*v⠱W~$v1՛H| ӎ.9? i`Ounj>J"4TjR7yLf{PRRQD^Z0s91jDTk2xWUt[778=]3w 4$] 8]2WO]oBOys*h~>dCs4X\_|IeE+j?!+UM 3!{ջZC0EŭfWh,Nˏz ,f~Ll p#fMqK|>҇-(]lE'Pph|s1؞s,ks"AJa[$j#'˥ jRt=>BY保XEX#Kg>H(9D\9Dţӭ{Sj"kɮRk֝422ěH*3%Sf.#:4G?G&^@Y%0B1,>!7Z 2t\Bpq/HNFXl/sv]+->qHFn_}4cs%btܧg# Я4Eo$.crm.7a;d;?h%BgR`1E oL8rKOy} !X^!:݊ࡺ؉iiY1xwBDax:őlX2ؠt-2]T]&d|F `e& jySO1׻v^e1xNs4o>;Gr6 ڦ9ﰧU\yjܐ;q,Vƫ}sl.,Y$g^8l`]݂-[3z+Xb.&T`;k՘Z%o!gD-ٜbf Ri&Ꝗq#ʄ &(Z+Cj,m>"l[/)UWZG}Mސ".ֺ=&En?VI"$%mPwDF"!T(6ɰ}i g^Xīdu,ww%*#SNaئe[Dpړ=u=<eyO¦~QD$~z-UMTq2h.c1XRgwBOE{sL+^`#$,A41{ X-as%]G۶=VcYQ\mlsl[*W挲pJRie"ѐEg_1mZ%kL:}VIgKF\~R]7yCX(n_`[0<μ#ÿkt5$D 4JlcȶH ma-نk뀱gջbd(\r'M Ϙrro~/H!|GMi^}CO wq='8seCݣQ)mX8vCʤ5XZLt9Yzu;|+huZN f6I_oS8'o\d*~ T0MLJl')hޅ  K;U۪C\ =΅eV [C/u ׮YGf `Fh>YF\p-H5Ί\tw 姖ګIH[7p9dhơy2o o݂*W(lISTse TUj\-Ysh~ (̜0t.cCɕey$[Ѳ6m-ɧbZ\C6`brIsC7cԷ%T,vxasx߈S_X|V:gwng;phh_RZ(pn\u.ϴ}u^:$竪85\O !Ք˓\ ;'Ul]4COd0WtpRIA3[R: u1N6mcZ\zYy}8XF}S MNğ( ~s=֋d9zIN9C/p _dx.U^jєrŔ? )ho`3ݬ6zl}| n+b\-La_^R結<-Esujfۄ[-Q:"VrZ'$ @iElqX ^ߟ,>W"5ך`ջ |pnX eԽu9 x ?ކ<maՁ2sӛL'a ƓC+28e^b0{%Gֈ8 p˦G|1I "6_@:;ŲxQ\> Xo"R0y}IΤs̢/^ M32ܕEגi.* m%]N4j]׀- {0>tW(eUǰQXabXmC3g^ε_ в6[~q Ws NF8Pk F#abPX3Y?Y] T!{6>IRшp'$< #qM5G3@p `8)`$X'N#. dJ­H,qBWhFfPQ&D\&AY`10 g>Ss2ժ =؆ \ATTvH`0XK85&1vni7KcLE"4bU9l^pgM\Z切`._KL38(|at~<FpL:7.yLKYv|pN9kSq$wѦ/C 2Bf|djmDj I7cGƑl33|@y"[+8 JM;v,& /,"E&ﰬ?|bA$a#'x’G3B@0C'SGcyye+x]@5N! dU*BzvN~GFfE\_f~1~G_B%~(<Ǻ#…8b=1NJڣk`%O _?<[ p5byeY3 v4=p-HESI<>a΅.< |*Xޔ1$rcϺ|b?9sɊ58&}+D1/46 [h)IN稤o|2YU$*Y 1;p S $2CWAe Ÿ fMV?}O,! !?z&%Uq]}%ަ X7P'6;<,&M Tm;9t_Zo^{i93w]Jy3MQsKC؅`rjBwv\2/> P]㲏QfBiS&1ڡɨĢ #fߴV#hѮh>$<BQd -\3ʥD7[%fG|M6:ǢX2~=O*fRd3q y6#B05p (;jG^].+VE"&DJ?IU)|>xz{TE`zk{/O0^5wc!DVj) \ˉ,J! ;N"g aĝYNV|.:%)m.Ck5 jm3DlA~A?6= ,~fS3kRUr As8&8I+/W]ZZ38?ERM5Ί " eNƉ||$_'w`:,{@/իC,#:H#ҋs)01>!6 ܂:Ҡ Y6i}M]S[hm1!vK#)$?3;h>`F5u8EaOwɇ:V&Ƃ"+F!n'03ƬLje&j19A s6nɼj*T68ip#ɐo,"*Ÿ7҂+ax g"S"_ ם%;Pix$gHC)sdQ^udkmUe))s BGɆ"CD@`Y̢4V4*iR=cU EWqĽ.r #s3zm\?hm)@ h+ G푠 ЄZưOXZwV[}u!w>@'3D+a)sR.꜇[/;K0RK5& NA?$=& Xop-~t{9";6=h#3TۨGra._W-ڪvbzt%Ea;%.{J4:D %vL/ߟI`OGzߩd[č~/\[?hq\Lі=d1qPfoy85'.8ڧPu qW߱i!֔DpO|cr+i٨$M4Hm"8Pliבj ݻcO'$#t#!m'洏$!kJCye8vg #X:(V'^|n*(Pyq> – 8bQ:.&*9.0AwhO::j% z8l/|3}/T!G*t{B䟔7=ɟ4-+Pp\I/3wVf@;sR塵x9b/e[W76Ms3{KtY]|qA׶c  [By<#!.朱uLȒp Z?3F}]B:X<> ⚇?< L 5D >+…^9(/;{)s|}<`*xك\OxXw֢ůb")Q}ӥzVilLJ2JrMW5CZ6Wui+UXC337tଧ67թﰆcc7k--'*L4q> "]>rʬ:P|a`_gk +}!t|v~Ip3yQҧj$$Sr(Q #W >et_APhW{C۟0:r\"'ʂZ:*BXӋuK S #\(Abڗ `z|Dc~_vf^޶ZxHӧt9l/꟰Lf>LN;:2p2]J-qݸ]9;TŢ*-S_xu8JST-kQ|G_ =YSD.⶯_05Dݞłl=z8J}ŧyD~m GV_[](L~IeJFߛ;C鲒3~y`/O5"1/ggtlE7:Ξe[ a!$aMp,%Yxr^xjpW1J8+M 2|~ϙ4"M.\bb2?m S ;Vʂ;JZپh*;2T{>0 .zCbi8b=33jп\kk~NBAJzLe9(|VR_] zE啽~" k"C=q\Hkgoh & hxhx@Ht2bޚ8V~sŃXҝ#Rycy[S+{o}G>?Wudž?OGgt {rp?%U+=z鍏>_׿>kfoS~x⃟~=GIg~y^^h$)iPƕF$j>"H#P& V2o6e!Z.l"-xtE !#Qښ'<P#7R"].#@ XH1a'&^srkodjt\3Z%Bϒ"GLpF2^4&ӣ!:N$ 6##Y:Q 0"H6\p<$gJ֥v>b}Jm kRFɮr v9%OCK&^q5 fp 4]AS4ɜhPatP)*u! VT 8b,T> G΀0i yz mCvz+pMb?*xeF]H͹?%GʨV;T#4`&Ff3, R,l%@Y'P;GDONJ,z 4g1¦arU,杽Zliż8s {xϝ:y`ZncXZ]bϯj}(Y֥<+{@ya]N$Iraoy%ld&/ 鼤oF漘0ӌEOa 9 1. Ja"apXGcr!Nw$#{jXgiDT"9 `NR#?KB m(Q,7ZgK;;eJB 4x-(}K٢DXH,5nn{ԘMl?eyAbSB/J ʸtYHdIg\%ADlxɈe2pL|~i:0)qIAPϽ4c8KXyk2M//LDvlɍZyebwVRe󕷏C#Kk$:o_G,}V7Dc/^XnaBsDDPThQַMUEО!jG A3Swp?EclPH?bb *'dF$ub yDf9Y,Ǡ,ȣq4~~ZamzdwD0as bGx:}'g;?`9H *L>=,(ĵ,0= ~>9CԼ?ã*Oܢ+j3Y&'?U?x$4vzP*q\+/g>% ҜSMW(wH·O{JQ\#k Q U˜e~A|PyW!()lۧ_k;XiVќb 4K{ ~9 -R7`ű4da֓ȴ5s\ƃdk)Z˺b=ds?{ >f[ DA:*J >}/3.;SG1aO{␰ = L)f'A񜑎F-E8d$9#^ <ڴS2^l6R"{)~cI1QrK*K]^=S7kP[Gk7nZh3!=1n~HV"c1:=ʐX P\R DP2e|*RO7IaUh#qPFyCE#kۑ>å0ry]ż) %pg\{zq$lK?o-8ryU9N&(vede!}rUO~yx8i.5+*}<52S:Nj֝s@g6Kw<|--IWƕwcfB:tt*L#-!3LL9 "KSDQRRz$q'"hrWkbuy<};)zmȏz&U,mW XD93| ci`Mp<)HoY(KY&:=An|p0JO-M}2!@48fǃo@q)fz~|$)6h! §YKȒ'K;1gޠrx% UЉl_{H+ol~wP,qI4)%22!k .j|$v-0~7̢mĘGiZ<$y(AAXj 7;2>Y*hl܀}[[ZcZjf_l~Nܺw{$ %/B. ,~ i[6q#!p1SzxUnlwv!8ijJBnotq${ex ܅;#I16&OS vBu/Ơ~"A:5y.F0&.?:G1d@P?tgى.P>h7K)p$u@\EQ4gK\/vT҉fEBgɝ­g/GCQyy(;4%[PF0*z$W7'L(Np/8G[~/P4Xl`۸ ^Vx맼VZ9x^[R0 ؏ ƕsH_k2&w“J}/R--ȂG[DzFVL r,</;6qu(4v-yG#||2hO-7f.\li?AeMb;+⌟x;Ei(5]a2:>{XK?~_O|ߏ_=||8xXj^GL!MEóxuo]#0^ޕvῴzpi燃fE횋z+)qo2<5,0y$ 9[4AJ$%z 9ʡ5ԔW 2rHӖ!%_^?%P#nG$E| :Ș>Os!KM m >ngYA/64D!F5ߨ78FyEfl&ᙣ~M2JҜ,cEq8C'_GXG/__}RǏxt#ΌQ ő{G9BM8$Ŏ3Sǁ'6e0a ̐P0`J#.`Q !9cKyi@] uӕ~ j5MO߀_nf;`")Ci |l:g㍟G&V EEESk/#uTl x!%ۙ.hL~n6}-ܮE` N ƼFf.o8Uq;yJ4lP: IBi|]X+f,wϒyUX8V Q|{x|gؙKFK D`Ex>])]:"Hx`Eh[pGL] N-ʸc_Ƥ0w45Kh{fH76` s$r5=:MdɩL)*kttZS\öݣ2耛Gqҩ1;kب8% %]h]\bVT=Vvi]ifB̝y3of"dix*,v[YwM{e>GI뻠#³L>(:G񐧇q.L짟m_(zǝt:Ykik+ %T y8g``¿hHsd4 ؞"ԋ$./f'V/ʷ3Q^P{8^u ړTdO;\0 3C 6Lϑcb&6s&Ϯ#m\BK JO.ɒ~ažT9Զwl8!Oм Jp)xp,XAK1, a(%{ԓӞ`/@1VIa-a= z uA}1 n(/^ mOwЪIâdy&z oMϔ2^CpTK #?mmoP5Vvy*EQ-/^WVSLx\plrqq X\&9H Jp)64)JXE?ZҡrJjL69. ;ydbKI֛cV:>&H9%乂s?394̖|iܦLqaNH+lZAgM_X+s[;02䆸$0,.ɞU->,woZ-x4Y֎†{-Q5^~jft"8>ěA@,l|JMC4@˺$~ҥz[0TYw" ϦN .|(1<8~hI,̾Me\v55DT颴kqS\Lq/apF.ɏ& EGN?OlF6A73핣5P* %QgUcƌx4Y`ڷg&VeyLvoK0^n'DHWA.f,`^'zγ=-ijur\}3q7Z!#wu^4/pC"FWMl _6"&m>vtDp _Pێ䗍|Ң`Ao&jbwd8҆cGxVD8~w_w쫞Tph1COQaedP ; 3cBK;&)؍=w\`)Alb>/aXMohef>l í >7]C}iƕ:uc<.[Ag R34q kitPKy e1AUoT%߀1[ c=nċ!W.%ҭɲV5{ޙ> {ūwcv~Qa`izf4@$ACJd,`iؐS95l@rRm,F8y Wp~@nj ordM\12`'uwS'u~$o6ez@KP7lOQ1XLXe{Ș,ls=p/%jm#8)zr<]n68xbVo͵o{*`a?6'N H%!}8|ZAيWBWR-ųį)Cf9`Aw7-ΆDjL{޹ L{I .}{NQhp09$lxd c>ϓ3.p$l|@M.Tuݶ,ߵW~9޿V.U(fA5ߚpL \t"+XngX2cg&;}>-a5 $.'LL~w; ~E^߀ok}/N=E_+wK?/I?|t{/O_Wߠ͵ W>7nyudO鶕q`r_};~'^hTFCۅY>[։@BlY .2:hg r( QG?ILFdw ir鳂!X;TUa2A`F"0cJO'Ä$ѿC|SH+f3/C:r4A?߹P0 R <i1ɶ28̿Ev ђ;iR ZЙQVfdv`H!(t2h 2(#3#\EZ~6VK 9o6LZpG(pc>/{z9љ11 ΄bQh n)%n!mʜ=F+d7Jn0sn. bg4=z)<!_ǶNy"MhKX"Uv2€mD Oؓ!ِ ?P;O.3'iq ht3}(SHzl8 $o@E4"t +qK|?$<%! i2豢N'=s9^t8ם>#I"E,y7ˮܫ[bs5ojE]v=YAdʝpRr\NP&l =S~Pz3O]"aA9GҒm+QYTQee B=0q?FCgýOc1y#Y4){5Sɛ7ꗦ)Iv.w|$2S˷0#~o/{^qfEJt,ޱuDtOLShE^"V÷OGŅ8Mf'Th,)JMc}CDOz0STr,(V",g\sX4<)dɑ(:%)ؕeZei0؋Y_ ] $9) س|<>@~: %I2ك1!MVZ)d>"?aÎ@8)iX(IE'X?'')Ş" Nf!*S|*a£tv&8EX92g*vNJbNSK,=q8gRcWX822 O>E?ڇMIk}aJڲˈ?߬UŨW דQ=4bd$Gu*_njEwi [ڣXfTؓ[z |ߘg[n9[T;qiBΟTMer 1JJYdcB lK9H5+ȣ2َtBV(jjBitqg,'0KL .4߇XQO}2/A=o' >By[R H.?DT sC{LX keiSe** 7g[r%oܬFW>Ir![>$ ]9BR9͛S.;P#fTSVe6N;b ;v7AsR\%ϋ>NWdHD5kd-l*}wh~>!>I =NwFZ0 7Q oy< ͣyH))*sdPuV)5d9qJLy?L ^ѱX/?)s=T2x5ԑzEb+/s8U  jN# 2g9r4R{ PA>ɣ E/yL)\,zc-+Se#.,Eyd=OHDbRsRZSfto$M#c-J%'Ip̿-W2%4,)bG 运ǔ8-9hV˶]hF6|nLﰧ!]6ʕɳeM9Ϳi^zc/yޞ-߸Zyؔ#[hT̕FƎIkLFvʖ6,Ē/?LhayĆN!N?q9cz")qV'Hs>Gsʔ4c$9JXWl~n(7WaĸIΩgaOɩ <*asHaH"av~tKx_j4"k\nZԹڐ}EjՍ8/{1;w5]]mgD+f^ՍF/~Q[&Ô~a 5)JR01Tb,)3H?='Ay@NuQ"I fpͫBgsHy0 b'#?R583 ~lG ONs;|%n$4*g>2NѢsM 0 /a, }tt.i)E~G>;4pU}PjL,?%#V|!-%N3[j閸g]fC2eJ)O"T_ta=K'.Ha' 6yrHg bisX 9o"YbmGrA?4Yue_XL_P^4wMlz;>V47drgWZvVm}}%lo؀n\q|suw2=ySRI;bB6e/6xJ,{$cT`lpHvPD{qb|_Gֺ*6IN-FI?ަēt]4\R@GРX3ѳ,Gۇ)ZHH2Ls[m{6aVḓ*M̲,*^vUgފj%vUw5ˤ',r 'uX볺W7ާ/j'6HL4{@A{f?{4KuR$k 9M>8%H!T(@,U4,|HG:&S,C A Qk`§_d>1HsHi#Y:i~+GlSI"l'X lH;Ϯ‰=,g7GUo{ƁMOk,O{!)V]gFچ0/ܕŭhTTD4 8[ x’Q d46=3Dzf;lyҐκ*!U dkGfuV74$1IjjX6yӱkkEmAgmΡ!mMJm9W'h銷r1Tq q sVbC؄ a S`^ ژ1A'2^x\y29*VX؄Z|0ԌX$'eE!k´,GYpoZQޏx1owg#Y_n!+Jг:g#Fe`ԔNs֋$#Ua[+6QU1J)Ҝ3*3PS=_ZJ i>/H2"Awѿ?;[X&UyN yۂK݄fLg ϝ GxAxRZKi_U Igm?52z ,%0J|~ţ͂RKlE,%:*KBS7qBG5:NO"~>LsNIޟ /m h P;?r#YฒbRk)khQ~9;GDG; WM{h@1E~߁7?,;]=Q1OTz-X{Nb/QS M#g ,E^BFU͡,1POw4 q&[!327 Q?9Ae䛣tx,r-Xժ蔄xb䧊 E<3|Pb($P͓yT6|e[|yM<7+~z 09t,r ThʺT"H>LQ6KTjn[-)KO.9_ ESё4* FbXO;֪E?/̔YP[͂ˤ r}?|sЎrM0VbpsZ;l碧SF K܏s3},ȝQrJ#EF̫sDҼiU 0z ]hV&&sÔy;=^ґXhQtB6OY$mOYQ7wvpkfk DY$L0WWGHBWGILJHKMBWGt{ #% $)"     $ ?23|;KQb+=;5WZT$r֍"xKB{r ZGk2Q:_-8s C&ЇXeْݣ-!rF2jiCM$ );VQΝG/ MfZ_y;/ɡG~Ʈ$rXNsOD3.I5gO/H4E=Kc 4]y.O6'މi5QtC=:cARʊɞƢY;/ 5%1y˖3GϿ-CƷiN Y$.1ki ¨q\nksgFI1\r=ySv!q0 ]XpFw T~YI;cT|FYHTN9j6엔ͱ|EAne( ún Wߒ8 1ۄm\SQL/~꒖HgҒ)uU~]QρOǻxП)CU ݲO\CSR@Td&BPW^ĝ|I0}b`sW{h_8&O  nJ(X982QMwbGΑ)-U-rQF=!nSaO!}?(e|C_{YyP\L'y|?ҩ|9-;F]3/qlz02% h͒#nEѫʂitiz.}I[qa[J}` T/gܞU789EYW {4.O HUiaZ[1GEi G\ݿk&bԜh|:S/"(y\΃ç^@K>_z_tQabu䇇g>>ES,{$\0x<}o-O8ߴ$be;dq; i-#x߹@bC^1̋5 A&ErN\k&QW.  RG2ETo=gL<[?,S1CKZɂ~QRi\ĥI.\SGY^64:(:JIqQ<%6?GKH-€hp\~|\zDŞn\q=o}8(e,lB,<@3u"!bZ$o|Yk#?m?%R/.lts$dj4/JYǐԞׂ!)ϒ{SA;GN/>'$7OC9 H={Ԏ%܂ SX&W4<DhTg9AT=S Rd_2R?*i"r$|P}?y>!R="6*=y~{(mXMtx ATDa%zl6g4Ao繊7!s3YEg"_(>~^@wQW=\2 %}, %DBO9NT6qqB% !+` :~А]I$9yKRS ϣģ\!Kԓ%؄Ca~e=z'ndH[&j=*V|KX絺hgcW)6,q^n#SEˀqwl_,hpiC1KۗeǷ77>{v2Ȱ(6g-#w,pJC'@Sf)v5>g #G lTjJHߟB}=r9$ϨѮ6{NK!6 }!huv~%3JlXn=sS/Ӳ+~]YZ7}K|1v]͔.Őצy oR|h@ m8~\BeL)~49E*ى7'%Q-ߎ[jjZJ)>iO8N0% 9'Ҭ|s??g'-.t?hvޅ C~Gv|qS˨y}'?~N1)gBD &hg?9D` t(r 8{Blȳ󔞲g#ppR+xst&m>9J$`u %( plP+W,F[ھctW m`ءQ7 !!.VO ?:qy9ߝ*~3Rm:=m& x@XwIX74]Q$5`E%JjɦSxxq^#~_$qz!(DV2ӓϛz, ٳ8xptMlNY/~3SHw{ fme MSiV2Cz}dAz-ȉޤ]f9Ό!kR&WMIh6l~Zykxq@ǽp[-#G2X[a8N$4-C f"ز4v"{~C^8/?hHǚJ# Hh3k~Q%L_璛SW =TVPMs$k jl{"~0BgpgyecM|K%e5Q.'oYmc6"bBP/8"Kݒѳ`A96SVH0?Jp?KKt4;6"Nq$)Jl|q琖%E]-s!96< Kւ(=,߳s*:4)؜]X`p<⬡ 휡uB l\1!Ue:VcYn99>:oz0x!>EGȆ:k.RVɋY^,'b%2,kN֔L u͒ ڀKfԅ!EEF78G ז5OY>o~,*]G&?uF `=vu:sc˻9;:׽ ͱΚ(%<19"'N-DN͒ӉPҸE.^nO;<)+%J ~TwrZ%%;wH_XLyFDo5`ڋ/Y\/" HĜWX0Ey o C)c*Dj&OAᣣ+'XnD0hvR8W!ᥨ!mYibC0}p86Q񿊥gs^AxB8/DiY(&ȥI\Yj1=8#BE Ȗ U`kF:fq-Q#/O.Sy&O#L H5𪧰Ȣu-i1#%,M#OEhӑ~)ք/u)zCx sY/h8M5ɋ܈؎ETzV9Hsc(aUdRS{O Դe>$g ,9ex 0tDUt1LDKU795P_ (\,w6䗥lr,g@gSGO$.lG7)-Sr^d9)r/Vܱڑ ;*i卞qt tB+f:~" ;/Mܩ}c(umOջn6֬g~AN8ǐ 왛OyC̓۶NOPF Y4ȋ(SX: }Ng]$>LFp?B=48|@X`q!y^ xsfm T$/˱N՘J _Z Q%/LĜĝRz)=\i v}g!VLj #y9$GϪk#Of`87Ėz:xDA 'DxFGN@&u [f0@-ͨ "0;lK4j<(υ^ja~jÏK"sOMP!\W iMGPk !ɎDJ{=8f(֊@S&$hf*;Li#H ZeTjK-y2/g$4ee㋝d}sgKT%vqľ(2*JO,ё;w.61~!CI᝶yٞ\|#(x_@G$O=K&|<?Mk329:jd,1g=Լ;Sf(hyLH£Q;rRƴ.zGP,@ҳeB m& Ǭm@FE#,B R>kB "^zY/;#zNi"d40&dC0,]1Kh |FȈB6"mN!;hՃĆaѴ(CXR.!s>.#"9Jy'a$αO e4"E"she#qePGw@.z.9ۉ.K~L &x܈Q'J }x˝W9|gcYG?%T;SX\ 6Cܾ3;Cxj/1yc BSjʅ--Q,Y:ωAI_|a$pf]Td"HeÙ7gYmm:|^p y*<:}:;oS(0+N)l ۙMd^~6TLOH@rހʁ`T-GͶs*WT SETI^cCC OK⅌(ydϤߥ&x 2 q!so@KX==%o.dR3d4h."C? YR#AD2Fv}5%~ŹGj_/DDrḓ %_?,ˑ# zA& -*Kp%"R(NL:2ML<-?8k#¦QV$9c9_{7_?!_Ϟއ9 'I#e;D#)DZ_6]5_+~D%~cޯ:xq;G0gd|mՂ<'=_J% vRt݈Id: Tٖ'lF pz*W q}3c&H`ܦgG8:3<%G ;d~3 )gCL,@ ΠQ"!Xa3)acq+%-`KyD4t9XC8iөNg}LQ/zrT28>kSLs -\/ ?H,{ Ĭ*0b ^厌NF]b>q>L_k;rK' [~GG1^EjC\mB`Ctᐱu@j9r!8#z@A&RR X'W<Zg['ݟ .#uj,[gYs'̀(D/c9s+`^%C>8b19fa#bF&_PY.)-G$/ULԦe+.4!pR~?GϐO^GcXG&ռC~4-GdY$9d9VB`U+> o>\eM[ZWZ7哹k9NYbN1K_泮.>-U4ˎ*TiO (e1GiDScJvwYn9Ul_ʝpfN(=7+/Ĉ#}H #n'Gl 6Yآ;e*!N'dU"ڎKEDŽ8 D>҆ IcT;ԬBr"'"p21_,̍<-$ $j.gEG,xecY&nmx4MB17dhQu`~<4&*-Ld'4ɋ^v,(sul~6ȵtG?rl)`iXrSꙔ)>>8od麗ƹx͛srċ%„9!c;fvO_ZC&+3j de\I "nI [;RhTk^E #2hN3< <6PW{-+XOw~MS4&֓C>~K*AS/8.[fcOI[sIϋA9牐&^xӒŵM$J\\=޼~\(O(uR `dhdj R*cYZX~DHȰ8V-㕻h. 7 AXkvyXg-G^727W$p 8b`[%qX UXm-S}M 鱭,xzG19_S:._ {7׶ 9~\pYs'Hx^_c)af?ؗ,R\FgLw` \R%A %vzDDU4U/ݱ)R` U܆`+8yd$샧C}Q>&OI, (-KY)E #L1VϹhۇ,4.eR_x[#%Kgkj+Xq7_o  $ zsH }! {:fnZrİlt^C?(2U!C3-eLoA`G6!յ*{^Y~H=P &L>KߨF1vaZQY,^۶f$rFG g/H?R:Xirdq'v~??[{D3ⵯEk&@Kٰ@ cj6`KP]LїcA~/|@krU}(N` _ǜv>?m4,4 =hKls*w^mN1XB ;~m'6 ѻRalM64LX%۟y`ٳP -%^`+ D~lDӶQ8Q, r(ůU#> ~NR!ܶ{K4==CM%f[[x. լh6[H!g,N J('*#b6=~N [x^P{~`nX1.'CKD),1=o6a4aa؛UW6mjXYm415bKIKcP"(fGKׄ.H &{0gv([sh1HtzXOP\esg=f% E#M}?:Խ?ZH&.Җ|ƜK#h0n~u_^LYP i,Y3]9LyNTw)ZUgSjsH}/D%RD{ 1gN4haC;+Py4ՔpJH}lé DHd%6=oO&'o.f:̗o.js;f#9QD|7Xlx!kPT>FG$IM=$@Hq xL˦>@Tk$ƃ'˂!ʿ6}^h7P&';B52 ey [K౮ kbRf#n열(w S߱/J<űf)@ {F#^shhjW}ZXXTG"m7H&3Vcϵ}eǔm *<(sKGS݄6g;'h)8^qˌ(6Ya*b|?_ۤECyȗA(лK/t?g:t:QtGp8x$%^W9 a?U]3Y(]^co cʁjS*)3{T 6(3~q.9Cv¸%Ki.EGeG1/ieAC_38@*c, )gxIӕZXm>0tD۟w:z1S"zLnS gNK $}SLGAp{XFܸ#G$~ђaOSYʇ>B笠a?:>_1 SBc?J7SF"=c3ׁ%? '98:tч4/R/QEoXx#T`;fr`H*Wjq`O:@6%[*& yI bEL8`:oVq V&A{)(39|f.k bB}GDyc6̩ߕ?zl3ϲ'~%0t)NU\zAI6Ex:O\!7_` 0+nҢ;DYFS>5 t/ܗj#X4I2~_# nl"1x BȭPKl/"|K,)9.=E1ތ\npfp]1PUt~톴:yS8˫e& EB!KGj;Yje8Hk1/t"A~ԥ<ުpe~Nx;nhI#,7đzq_"P#Ɗ3~\cM@+9fWeL\EXL(]>?2?eqZq`2T>~.mP+JD "ҖgAM5~oXW{lR4sc cU.hRf * P?$\I ;G DO&2x@ 3 @ L[$L, ㇵĀl.4X7 M/ld!c9C'dg%Zf0RNg=?ZG|op}"T:]"槾*. U$J!7I}TBx}IFH1^cC&D,{!@|cKou;uӈ/A _VIAwjTzhtԋ8!/ lzX!f (]k~=%]d2g[k,ݼqsk?e/bntnr%߉dK@B15:׀>uR3{W8˰reeih䬫c6R9p!,CA~t9n>4(E/rҋ&$V\u;5}.yɚK?ֿ>0#JO]NLOS/pWD'ߌ5|Ŏ_bb,Iu՞{cP+X)Ӌ ߒ?Uރ ~ٹP=ėbQcC[hێv^ˎ;|WܐZqEN:˘s]N&#"oMO8dw.|8}E۴tbv}QIf;:XI&?7jNXОX0t!O8AD gA' vqd+ /?;b2 \r},)?΀9-oBʂSrV(rO9_ЊKf+߬".xR9~܊6^GfT{ J^ܨ7G+6 B53-Cv)cM _OJsª\/-H[8KuS2O3T'|$fɺl,;lÔ%x^@&)wXvT' 5,f323 OE-.!$v;<ob e@+ܻT">`ߩZHXHS]'V0;(kF[w\ᵦ墯6*n wl]YZ`ɿ(%Af+v EzYO0HE pb=\G>dԅ(Dc-! TO5]6* ;Z3I&=C!YQW5&(9g"j$r:j=/&7"w ݧ-l_áj;Z%O._nlT&Up;ZuN$^Q M̥ Nz3ii}^$P׶PHdYM "Kc-ƊHM];&XjG}mv]a_nJz%B$ʶ ?v4whk<%_+6N) {deEy|\eYS~BHbVSp/L0 /Ѩp䕴Q(\{,TXY{WߠYɻ ZRd Ba̧J1YFNQq#h*YI$fmʶ ٷ.?ij}O3‰%g GQW"pDW8 GAf+@dR{]7Le-n؎F4!SDCSI_1ZG[Yr@ӑ0Q-(VވB:Hw3TfDEAW%I9>MwYk_ `KClaLC~bыPr'~Bf;7Bͨ7a[Z6%y1dp_1@e|-–RctaK3ZSN- N;߮e=jZ+.Y~0^JwSJ\_zNn5)T2,X|%D O$08f+8"/ebksLt>M+;  Ǐ1_ÈcʕxX2q7נHl 3N/"|ϗNQeeç92MS*ao3y6 b@.s?$u?L- hA~8AйRM`]ay #mzHn)CВ69$񡏷7jcm qZLa E8ޠ)f\[Icz8'_d0IvvD^<0E¨#J*9`Zx^:e='I0"Fso\,kK'"rݮv6X=O`Kc/YG)f{{"Nu$s2a'ӭ-s$l>j4k˚V@~ς(0~5𥰗C SL.n?t׭Ϗ !ۅS7d05# MkW6=ƽJmB`Nb~t}pd{g=,ypOMJ{krRսm{N&-VBltmq(6tM?_[WKm-]rcV87N~PbW2u#-y=32j׸onHp]F3H2Z|IhҼ4n:DwBjb7FgKV:?@:\&'Yg|-F4]Z.Zs<  K RR=Ko/Ld:mep 3PuWx~N }w?#ջ 1{~/u5>J@U?w ;_w Qchg̖U$[H٘_Zr䋂 oNhuBGbэr?vsdlyAvFCz^8X&(?_?x/Po}7w/ͯ~m~vR=G9;Mz7H~:-&7QVD:5/z2eOC꺦Ipl;(t|+Ė>ACD<>FdK։|#Ѐ'ȕ~΀?qIlBL = .0 `DdF a63B(VŨˬǞ!bySSw!Qj=: yD)ӋT@|LM^}@ϝD0tg BЫ/YZuN9{K ;KwyMvY fHkhRYr柷Xt@ t| Lf4mj"Nu"Ż|ND/"^vVp?f`0.a4c"%W ?/f~VYJYW&`{an@&/V5d))ٞ ?O|'%AN,zlj"=n#] $>B$p,ŭ/Vg]/0*qyBjediXTJJ2(陞dcztTY-,q!kܹ$s3Mq x y>t58!S`2s4ņ47t ƃg)>\9w{\" q]R&z.B&s ]-BΐAҦOj!")XY7>%3{$9'&!ĜO>H_P5 0o( TEB}r?9)ɪmcQs >3Kp;$y܄I#rZNeVv#909p% 7p|Q}'KFSRȗ+ X-*W6B^M ',{ Rdrg4~P/9E]O@7y0:(p D/.R^IڧE_J'd9UNCb: Ytr֠T=G4wZZ2q- ;R."c}J=x$>;RZݟKPV-~繀I& uoX_4cx4]Mh%Y}#OID%j-%C;=vko]/`'.돊,4ݭhxLY 9QAD’"x['EhhҚ{ bnw}}XCD{`/9X|.Acݤ` -O'i\K%Fa?)쑉/g/S. )dar@)7WlT{YϐZmVJ5-y`;h ddUv}5JrFV>6\&WzP8q 3o6)dr4h! tW5g.}'.~N }ZW=T׳YHo<;8g6:Uq ' +4u k؏ɘR "c>T%et:,K}Lk_U8f|yB8ҚX Yh%#"}E.|~<B|H+& h?d`^)s7V_][9䳂 hǼOvDD")jrdrW2~g(#PC,v 7ѡR_\IfuJ?r SGI¼_ZNY )*+Kr]UәHMkk<^~mC\,Ns 5^Lfz?9p)y;_Qq2;vAK~H1t)5K)s;wZtUEZ/WCBcqv#E*Ϩ,qa[&V :eXE*Vg󗳤E--Ne a(3^WF6fYY'0S ^{.;ỹ>$U֛+`fkZ!_``M~^" I8gpd^#DSHG_x4k /׷<΢~S$7bu:b胞 p5"H>С,C 5/O>+4/kͪr% '+T֌a=r„3VKp'~M6z'关C:KO]Ylq4wYb!m38+hy^4hyG"G6o/z()\# NtԈ& ho9xϥ XC:ڶ!HL-3L9HH L'na/; ׎y\Mɫ9 $b %gL/n?9.L|e׃wޖ;e -wo'ЦπWډǏ*X܅5vKFr%z~R[]NBP>@q,p.F%XyҴef#4{=aq dY)çgOȋ-WrrSʴTW/#).#=&2eڼ!{89K>(4G\1`Mie'/SLl6;bv9%!˦KO甉צm):ac6 VE5Nך{hat>W t [בdq\*\MOxPHP=kf( >}y>\J!F}W}Q1-`OQeYd9RPri^'[-Y3BAYK_^/ӵ)GK '`{I30KBxdXXHkvc)—+A>ZϥGi]Fg"[봃w$2)sG ZΑ 9 ,GiGV܉qx{WQe+hOZ&Wmp, ٣|(lȖq)Q3 o! 0B#^Ky}ʏZ'Z#X /~$pLL=43Qpf=Tw 5;ySr-f fL/(3[?ⓥD e3d$'E*gF&[7-bGZmomqAaEad,m(n-}=k띭P$X#@H7%.r ?3%fCybxSy%oL9%?& +>CUi9wO:-/U6&A?5c+0@HDmAċ4kxz͹#n?3OeUAy ,s1^o|ᆯu*9bX" 5V$,s7(3=EwOlSbi V_y,)tjAZPh320Es*{q_~}u/`Uas )zMg>tF,:B&b> E9ڦ)Ằfys~:}y]ϲզ9V n=k&e /o?{{???O߾/^}|7~mu?};oߋ]+]/ğ}/7kk:>Ϻsi<;'*Zujݺ/}9}?n7?^GݾoR6(_Ջ{N?^ n\>Hn۝>¹ 'ğ-$P֋=ZZpR.4-}H 1~Hz48sCgFyA?0;mbr^XU~9 j BÅ$hzZvE* IF2Y ?<{'0qߑt3{EMG29ayĂ ֺfbb$*kҤn$aS}^ݍmCA]k<AQNqB2a #=|̓r=y#6 G6MF4g&)GH=N`B64 PH#'9Z HjΊ Biqg&8|.e-܄NYDկ0Z!Gf@\AƳr' R"i"Vd@z.hW~z7 0x{qɇ~'BXGKzdL/W18e;qKCȼEq%">2ңV U9f̗2pHzY.Vl|=,I 4P;vyEU-x€o"Nߟ[ !p4e?3b;/xnl̳gS;x|.6DH?B9I8Q;/N;ύ/TϋLf4u"SRP9HH܏nq ,R;eC\{;lE>#B iCng{V̟󚅀2*8#ٲ Y2-D\ĤRT"Ȕ$Ljȼ"7ymCivQ )4?wݏ 9؊=F)Y{(ft 1E<Y&E?ʙP)P W4Tj Ny?nSC-G٩Y z"y D%3X CO "LR0MV9YJg"QY7Yd*ʹ`ߤwN#i0I:DZ7e",v:6蟝dHP/FK|x2ix%2Y|V\~^kqeO|햒MxJ4F7܋ZF6Y{p_Sc,p/ O<"2QTY?ϗPI:ȅHQ"fcj \RB܂,|B+gӗ{u*T?eO6iK?5^ҧ8L\ y{!(#=GNOx5daIC3~ғ=4i~дxSkϩHETrQAFp#PTC.ćF'`=oY*eɥRO=ȢcT~y!,/uF".bM۱ NkTP_K6H'$bsOd> _t(%bGc'rx%2jdR[Yecܼuk;ejo(O,ulY8"]n4׳GZi)rtR0U,vƠ;a5b,ٜm8fYk4B/`;~b@v|T UIib:2 [|j?? bMyGICI J08\(|:˧`h*sXJ0${>A-帑@k>|}k''eZ)c+jN\hc?#GOϼH$R4"ҏCd3 Ӈp(|h?Hhn ȩAQ\r%ˡESYsmIC,\\DucE1eF}zJ;BlÕS3 MVդ eP,xe&r y5Uct? .Jb!ӱ!,#kY9B3eìg-.>82$Fä OVBق1e ߘwJ4ܞOWfaԖ:+F1hVW.eOD4r gvUs/`>$N@^)DiP+jgE]ҍQJ#Η/Vqy5L[ ]0%—vAٹc4HGhÚ).I%cɏ2\&̑<4I? wbpCDX7-Mw\ZBYc=TR㡕= fS1Cn41j{ |UFn&edt,S|RH4@K~ziX,Čn|^Xm/θ|\j=MY]֑U  %{3RYZQ -`دE˞tޤl]Fvvu8S^{ˏ(owWr*8fl(MC=V9mZЅC:?Q 77Do79sf|'6|#Pp{~=^P| j-:u xVFŤa%^"+_HX)ߩ9{T5 J]9| PH,tC?>Ã/}DI-Їj$y3i9G@ұعpqb&OM.}X|QjS~Aʆll>|eܭ'+lqhץcv%}K+SXBrRet3L3zt{'Y]WGX-[ڃ+)X yʿ2(u?K!>c4r*RzT !nlv+B䜒~O;wVMEl)G,Y>&7T04|ٷdI'¿wX0hN2^&@k)ѩlҳߢ%4:gcn;,T}KU7w|{m_M,jD%8=Ι@ A3BsP,馃 bzc9xpu9vxxV=˧5߱U'܊}EٚG&z~ P6{?$#\RڢPΆ*-SBr5Яr9;#ؠ-]ˊ2_[l?@kF ~5NsE^ _d$b~9d yWA2:9CD'jaYZ$f9B8uʁ3ZX.I[~5 T}W("^E[汆 #u}Gr[{v}ցƘӾk٣8%Dj*vc}~Ȥ9a y G@;`c SL,OPYj=4a7r4)BuĻU,pGRY|oW{զ[[dČ6?#c >U&kx\ÏɡB.A qXϼRQ^sU(ؓIgljXsʠos27:|u2R\ )G6O.mEbuTB/dU.dI=iiՓX:+籚?rBѼ Rb\m[$ P\ǔrgqɟ_r 1=ʂIwgG7*30(q4b|cwvpkFj DY${WWGHBWGILJHKMBWG~7* #2!( E ?  { YO 8 Y94kɿu1O-O{/K Wwz~>>=ǯ|09OYy f֐3>N%݆U>e|_ Gr7gM_} k'zvf:oh>?!e0~O7/\G zbi s~JqPUY5"8Qc9ׁ<-+`\Ϋ;=abHN ŝC^IŚ@0>T73H)lv#31?04-Ӂ;3qk-QH@g\ʁ4:~|Pd@SI⻶(P)Ir$:r:OⰀY/ HPzz_pkF:B _΀+j:QO˹~̿x8%?awy/SY 1_Ԃy'o; NZ.0=A$cT<0N$Y?#I7c^>; 0.N~(nSkSAwP2 &)2RH#Ɓs(hE\ σA $$ePSɢpPAԉ8@ @#L 4LX',QX@)o" VK Qrc-!iMZ(6r}E9F}`g}@ 2xHF#a<(NcILŁP4e󒇄҈Ňu3AJQVNNcr2wP伖U9$O|%DvFƄb^F>8c%6G^`h : P|aY8';cf8lP/߃d0{_Gw"gzԠl =L|ÓӑV%kgdzG N =-Q@=q6<*D0%&!E6!6ϔ2SAck8.UFmyܦxe_6)Own7(7)sżЮ==daOJ QꐶF(BekbJ"c4 &,fs% v695%riE!"2P$GQ-3f`7y $"F t']ۋcO+xŸbļ6M~*ܞc%&B֦[`oUcecdBXxHid[:Ne>˞Ӵq͑s,R7u.cnH^r5cҞi+yO%l +ץYD6VS qX)D-4vKr>T^"Oܼ\T%F&^E>͞B$4 .#2܏;Po^C cfT 0+%QnD $Cv) s*Ekwy?14塾G+#V$Lia/DC| OȴhL0ODCri4Y,Sp}S%}WW+[ޮWmEr{e+xuW ?k̖y % BxOp\ b.pA.tAWmÄ )2C/*Kل斖P{uG{/i+luUt{6g{r>[ 1csP;FF 7.of o#uDtAlO,s$H#1QaQU=!c#;l %~GfSȄyf^$JRynd='_P"}|Jbӗ^؎7 f\cT3\>E ϾLP Mcٖ#j+AedGJߨڸmI֪!*T(+_x\I]&-Mh(#sUdgf\)`ZV's^*NLALٓswL*eחdټOc9"lQ`Rӥ&_E#|"JuX"N%rܯIb]?a~Klp8HvQIsd%eE\b @xeA4> "\=4s<e(q~gD4?n% _G 2+Y3$UU:,5O7;w d&-meUukXw[&Fw5 ] Iz(O8Z"UϙҺQ^\97rY\> r3ƹظi= ":I N 1WAc&D!l\qez̦`l{ɋۭ[ɃhSmv ezxUZSGU3s,4, OA<|:ʶ&)*C¾ܔxܟ˿ZkF|IԼb, _ 1\1 1gzi`gd~nH{2Oޙ.*򎫵a|s'L~Es:b=;6NW8(;wm֏sŨl ݩPEA,P?aهA=y@Hyh\{a,B,'Ѕr-qǤ|e}'T!5#Q"I<h)yBX&@#֥( )o _\ž%b'ԉ3`x I1&!m/}EpA R_/s^ky1`,ԩBQ" :{erJi2PQH{h(+kYnRγ8xo/_rH ƛ4t:yKi:Yl X(|T0Ç}VtL*'6Yߋ^c{ގnrT >;?|z~M!E#dWrԸYĈF J(upȂ-AjᏝ'9&#ƴTDԷjU@z:,,mc()Q0м` guV/$E'ݥ#AȂn]*E9w6,V xogA#}6|yVVZ*_¡Xg%~xq|5'*Pck& 4g|RGh^ŢdۉuU@4f&N>Eq/3vd bgěO??؀eR^ x(/ "a0SX?G?^FC1]|Y Bw$qŊB5hĬm8_TO낰CO\'_E?nE__o߯/_w~~o=]W_c{+S oOߟ~w7}^G푯]Ս%>wT &+LNz(?ѹaW=Pw9΍2]?de߼Du';6M9cZݝNe>1ҧK~LHޛdJ#ι6:y>g ?W:3BŠ$ z dOinE[G~IJ;V7rbaZFo|c4!Nu B篕j/;|2򑟩u}$$}4U9m#H^篚}ɿӋ's| [ \\5=x ^)͡lO[=t {>p'sH̎6n.A?E6AHQ̎䍏~}8clrIh"~N9J ƔG`UF3CM 4& JOS{k&)Gʩ.Rg00TapkO!yClY|ћ,&A00N$OY B@9BH01P T!ڎljBM.0Q4gh0')$)]=x-/j=Ec;Jmyf<qYvh P0ri!.v~3@r>oŒY 5įux0GȐac mÆo]Xx]7*FT \7>ߟLZ(l[tG2_3zeg}#IO7d80QfFM|?v\iZy,ٔu҂,OEQ\+ҝ4*VĮfI-P.qlZ^FnJ/|&7%^U kh(zI)4z^ˢA2_(dqqV)%Wx 沍1Sp+l١!*H: XRKмl`1X0c 6E$s;H%i9qŒJqD1*P pqtjOqgēΝU?NNQ;2k!#K}O'TBS-!g'ϟϳ {~\,|;YFLH_fSkm0ȿ2f埒 gp_)Ѭ245/'t@ҤWRi]-/ }e02в*g8O >VQ6"9-+z 7R{ g*$y(t/Y,,Jf,Y)KmGaE-Kh#G8@ /w"Th^[VRc֤>:|ָ$;$G=q2_45=iPiaNJ!GRE۴ZGҫx ,Hvƣ(,rOXr(J CeQ{Z sޱ%/Ȅ ډO'0}ņ)Jɗ?t:)6EE4"D?xS\pW:q_4g?\gVAKb1c /BǶEpٹ.&IIŤG\ĜKs^z,?=h%x(:)+6.zec.I,W%ua̸ҪRב]iO][.CeJd.Ijdž,t3v=vAܳ}=hA=SZH|6ODhnd=BChhT k0Bz^v!)&ICC<}'ND^pʮuU^24]zή Xtʟ/:W惟OLn vJ@ C"&y!av逢 4wQ8 jZs,h9mP=FTkPyQ ُ !\Xˆ'Eq94f72d^K_X>^ E-\7枂.۟Wm *.¡tXҩ^}hnMp>zMR~? zt|{0e ~bBݡ v<45M7-?ErIx+Y\_%A4Sg,vp oۀ'DP)~MK\{AL͂ڍ-y\r.lP>JYhJi'6H[`>8LoZD(*bߘ *)+I@ڇI 71"M~wt::Zd)=&)͡j/ؤu_v 1햄 EЧ;|m4Hs-/hDRr:>,O>qqlԌbȠ!m ] .OyUЋ4 r V42\Þ| lZ{>=#UP7ˍM^ /ēO0 83St…lq!~>zӅջvc)._|H:{̡1ϳ$KA f`Z .K=,^_j>_>mDSrUWMS)/1aݢ6L*ƸU'B}]p@06?Ǔ"O(ߧ2BzX,Y `<)B3lT l%ʯnJ ^ki)1+Sl!z ɢY@ވ8y)|6y!ḏzJƛ8r ?ǐ`׏hb5BDhEoP?/$VHx'Ih  |GfxykTL$%+Kۻ֧seytb Fo9+ܳHV70&힫]~IkpfқckcIK.f k2-N'"QC'\)ȎZZt䒗5/|2ݧX=iRyiL`ieX8s!L4\L@ *.R0c+ok3˃R S";FtAAxvm -ogY`zͯM*-nIl⾸%a T-sy`' e)Oe_k:;t].&җNRV)-#+6%'}Y$ryS;€sw?z;yGם;'(,]:~uBG#OnUL9={vOBؕ7ςf 7Itp+k^ۘst<j1z}o 9phzҺtCS2%zdHUخJ[ G8Cvx QC K2{=2mWw3p`k֒1T7z4 C˶I  nP& B_ .&n [(fJ˹o V/o?o~&W??~?tZN{o+O=5?E)/g(ԏҲ{ ??l?^/nst ?k4(w<K||nQ hAAѬj!Gm?3.O{d5waXDBNN^{:OMcFOXpi怒fK^P= k4*TSrJL![ f]N5 qPwD l`0?,&_:!bk :á%xk8$5 zq@hAbSC9<Me!};Q ?ΌV#FcED"P__éu{f%#}jd(z]=F|JC0e1Aو J lr*-T'bFxT^űPL=6gmlKF?% 9~9νp -Н$n[Z!7qŁ ցB \0_"yq&Gb}>/|Ȧ;NS42\%}d(MƔjgc;yE)GbN]g|\ +˹FAa#??od%ƚ tC=d5&d?ھYpf7i'O009̀]R&"38[>:~ k ZȉvOO4X!ŕ&R>HPS;D{?'Mv1##xx 9Ɵˬ`,Pt;uV`d!5BS}ץ#\),WұሟCRno(Nnc'A_S͢8z*h'|xJr0ӯ~f|TXJr&K=+gG/%IX>$=u6'o 4rB8hsQ-FEG~Rf4#C䀊SBR>O6w OU*D&uhJ>ޤDž ~QG sO;T v|yHq(rŠTdϦ{qr֧,_iGkh֏+e nʴYpl:,0>%'6ܢߜ-֧.4PG-K{Ily>2$S*r߳msb6MϲRTgalΈ&`(=>Cm& 偊BN I|~˛t;W s\nYxOJ(pQzN@.)Ǭ-RJ;wH9j+BǗtBAF oclz=訌Dm$(ZQ s"w)3sR"tٟ5>6qIMij wZDɍ4{/)wbx x8ߊaD\ٝ뎕G]MoGN+k&Ek"Bv䙵-]rYm5>yXa% ȚSU'5l5g{[ڦ֬V(%(̋=$'q\Dx^&s3;ßHX;tIRTz,dp?(,aГ$",YΫ_ٕn*n2҆[\3!gTxRsCᙕi!P0ԍM _,h*vb<ѢzgM~~/߁*=J7Sjǜ|@yHh^$hY ID{C?:.f*=#? q;&ʅϾ[4U:)ή4{"*{b@\,9 ,>}a NF?{)iN z18{ 1X!"N(i@xs`ǔr Һ' ؋jrT! xϋgL &Ԁ1'<dG}sB$;a8Jҗ?lltI m1d ^]/=\nV%;#Mo2/%'<[ԹvqPi{XU_z%#Yv![;~Ņv-Riyk/Ȝߦ -HQ͝Ck~Dl=+1Ť%ل$*Y&(PÏ3cWJ}LONDžQ!p)߿)TC>lrA?9Pi牿4Fh\xPC$q}\1Eb"ϝK S"sEebBYKCSB卋;i{Hty69GR mIxh{2)Ce\~ίtlSraGAccG~nvg)RTZ<}~S6;ގ G)kjE\"{s xƌ!{a32*ݱl]Xy]JrYLjg=.,{%/ؔZ+[Cj?];ٿe/ds<7V}jd8א=c"GOqBewN|ei 1%©xHE<*Zy.6r'Lah,9}0\iGE`S:>~ao !ʧlP?t0Y MIJkWKo7ņ?-l{TlY̥jVO Z-M!=Gey; r@\WX q%V& |Q3U~d0F$'cP4Bl~&|BrTJ_R19 qus0=KY58i#agˑa`)ˋF/sR_hC|eM#E{?/;: $˗E'F1"#jSx-cfSSֹt4xYѥ9c}X͆̑sSIYRVid8!U}\yg>{cHl#(=Gg >TK2dYk0䐟M$nc䧿8i/H'lS d򠔾//?7Y]/ i΢) ud3?o}>GDmadKGoЍ-sKaѧtTCGnf.ѧP-k$vFyr_>xT+1K /,~S3`13'҈*/_,Fe[Ĵ)uܲy}eN\ ױ{a\ 8?|}8㗵S4egq/Ehq}zpi72#|F5+nuYOGjϏ}ս~ㆁM7L Y wS}&=fu I&26த{)x;@Qo(q0d 7L)he0v𖈉 xcato[a Ġ"!7mtX:9`qMEa=Ͳ rs8ӤG#qhmTHME&J%OmXb2+5kD[95XHc/@xt͎&БD^u6'Mc֊L 45P[ӛ `nnc-_Ɵq5׹֧ 7:"cϋ"%KN|)6ɶh=6#ÄN*_E*IH2X)Ć9 5rOKg.!4vk㏯ItQrEjAJ+,9GwY&Li#Ɛ&<hSƀ7Y]Iؽˆ"y*ӴJ@RBF~EY^e9=~Ňw4.s3] 7IE"ⱳDKKAؓ /F.$R/e.`J \bV4P/{'TkZ,cB]bGɭP(V.g?3땞.73UHkm>r+Dɘd&͹ɱ eƊ&Q`Zg-@0%6ҤMpbY; !{4ƤN@MuyQoD3/}>kNX(mт0 .ĖlC󊲥\$xk3 %C$YdpϾXnJ3Ɉ w һl#~? fg9߸qdNHկpε"eGD={( IBe)s,OpQ>nH@fr D9 C )cjx<94/>hKh>r.$iy>?7 Ϲi#q{]Q QT;*bOʏT$r7yYH\tF^tl"< NKlĐaNe1AM#ġeհd~ GaOKEd!ձkk|쮙?s鹇7߹^*O?7(Lciqޑ GhKF<*eAXOH 4  Yfɩ|p`|'9EM$;%Qq#Ӣi!YH>;9N}CΟ}!t!(Q9 |:hCZ򤎨 5W)Pq/ MXҗM8v*ٜ$!uZmJ*K;-0$b_hѪMc,ҋ;$&w5lw|>=cN)r^o:g4#w6. PЁic&1Їc-X7a0*KPGR!G Ip*1"qB 5x ¸cuk>9V@NR"Ne!HpKKE>m _S,{{~ƜL)򗍛/$i fWdxjk}^%vadveB2# PN,%h!4Ț=XIvOhbh߇U1a3Z$D/Bi`Vxg{'y?Cܞ!鼸 $;YBX8"J BqI<B! h]2R UȐaz=,%RB2LM.XX";DFcǜYDAW2 9 pݞZ>w?}?ȟ翯g.O.sR#=lU9LZ&4].BPf1r4RTn]KeEzS9XԺ)IJ094EAX Y1S %aEp >5A 8A$d"G8=*(Hfm Jn9aÂ(յo=me}[| H[TK=Vm͟{=|;\'yE@Y>sN[,/v"?ČU,ag% 23ŀQQI :ʊ>Җ,@9 %h-IJSKP*MpbtRD,I>f4 p1 *0;SȔ>G-2#QV9ZrΝqbh2T{g!vEH}IrAKSiCII //|~9/'Nsƭپa<ڱ>?5{Nt@V_ dl 5}jl3ZYe &[FMҲԇ e$iT-⌧|=#+%}<$D[I)^ňt!UX C*Լ@HF, &Gb" == ̉&h& aqL:be{ &d}!S~`q-o>>_|oY$\q^NILJfi4u bo=( @1gՖ-A$H+v fK,""P4%Cb i6y.Ɍ S((81us#HhXʘ@tP1q"/ +Q& 5aw\K!#Ӄě\A* NKƅזoE{/']L a %Jem9)v)r =tKz2@})_??_;qdIK?F?l̪rVq]T z3=B #%~0⁹[.NgΧneLyNּJLOl0k0cd@&Q,XP1@a@&F|j@7D CgͅI"$PFѰB h У=u (]tK$Q26 6%H$6/;y^IN)]Qi<<^9v0Dɵ]qM,r1ˆKrB.ְ8{z>?oy:8?Og"ǡi= ^hcԈbze3G]-n\^`d:င2@$ 0 c|`Q&`d,H `ƄR,QAاNh M~}L]PKlCko+Fq,s0 ӕ,A%0QѢ7|yE)q:mS#B N#N7*6 -gЎCQۃ>k.9//??SO_oSN=Fۺ}?|}|CQN>M zKh#['A_1X)ITd`F9i"FFFR`0*Rp胠H!!>461(qiHk]>Vn=K,q:,dBwV*OiQ+sX5VIQ2-rEӕ Nb{-Bqbr]ccQulј+vjLr)qDo1( Bgc "Ax!tJD8C7XHGfy%g~)VGϠ $(cNff\ti/cwݍvR?;w|v9=>1?s9uY*>r g*?nԎx.^#} kjGNq;²x@wfKJggnX!n(`(V2,* G@p#FȘ|CL4z@8;Á*Ϭw([ųQ-w*x?鍲IŧKAB~\Kb">{IϒToPmrU־dZ/$t.9Q3q Rبe={ ~ 7lm|ᷛ?[Kuzf(kT2bQ̄%PEl%Ceve[U%rjuB*ԅJ\>K4+^ R-+A v&{ .Z)mnh}!Y)Oha|kc3>1HBy5d(s2ıJKFi^SPll015((fM)$# É8IO6 5 U0ԢBhL$ӅbE-YygFd zy19Dكl9̔kRS7ٔI﹡_Fs:= '>z ˵Uĥ4cZvwhYf<4&k(7 FqKpp$ia3bϞ Sat>g?qa߉|`ua#` O;- |'s"Bs%_- !tg4?~~/[|VEyo}e^~5˕wC3B,?J1!,(% *Bx6y,l<\ZFmh.Iō▬,ɱ`3\$-7i- (VTTw~@ƒ-le"&m\0JRr c&4KXZDCW!S1Ą[K(;yLMHTɩ`IG 5EE>ZfzgTʱ֝?NyhњԝSq {fl!(Zr=*?VI-S%ҐS#%t0˚|H %ˆ>72o?>?x}7cCf| X#rO sbS}֣<A%d} TZ # /P `yX!g܄E0PDX@) ` 1`m) D '9"(q` eSCu%iZUGD6CIV[D6Zv8+,{12MےlHQc@ d9YXjpA)v#C[$d29e +?rqq$\rr>nD{ZIQ템qUW`֙sic5{[1wFhfUDH!FgqC#2RQ;44<* %@ҼA2gg(z E q7HdҖ=BQV m!i.Ϣr<7zWfdwy/)WW{?_t!]g}fZ(W<.;ɏQyQ;Y[;{epKM\.e9Xy!i&;7ΦP&\!ΦLg1T%IyNcOG QS|}\{{ߟڡ?,C8\:\ѣ5@Ly`-OOPDEO7NEP=iDB@Li'԰QX:`aDɱI#‚TANI߹=OמGx{f6Sb !36#Ï17Hsۊ`Ī۫[P +5Wi)DBtN'd '1HLN<5D$(~\ݡ=S=4xcUw0s.ygہNI'%P}ÃT9;m(y!ncA>m bIY\8,{ݘgz=ҋ:ShO-Ӕj,L;aZ5Z/ʨ|iյI\бx!sV!'R {KnelrqǯC&Ia,D7:"19H>7#epV@TeQ=?7 P_,r A.;{Mv_^?g?o'o;?<~z~k_~1zHD기F>ҥ~/˚l:OZ!Sfr"t$n1zp%R(4v(3%`nmR$ G  )eHpQI]܆ˢIj5x5qyiDKєȤ"9x|0UJ˱:EQn\K4Dd"Sbڨ,y+ayE ܑx#0 X5 4a:&uHy5a tydN B|d]NCA!YpO8dA#CC.BdxCԊ xKJ΃"Zh5F|c7ʔ3iSjyV2'7jI/+݊]6YŗrZVvsow^ˣs~x/<?\٧_._?q^afk%T< e Eadz Qwȣ(˞5န C3%0'V~ded9jMkR; Dc Bƀ"Xl"/= ScʁԢg\-QK6B @GPaD%ʩpRX\1OYjK"KR !%"P VEѱ I}`@L\"3"Ӓ%i$u4i?gj|+sjmGTDRRmU5lU936j].>sfIxϑ$%:"˔9D6P͏q(:~gsu Mwj|"qت( e#7GmASP&yhRftQX"1J//{#G˟?׿/TowSm8rpݒ}KZcGfp8# 2!&9>{V~a0[EB'r J呑RF&dBm 1iY)"B69bBEaAE[ӳf5>¦Lj0D*baM9-dEe9(l$" 0 i )iOt(U A-eRMC-*P8*@p9<hʏcn3A':i`pA #b4A #=N2PΩu @>/0g}kFXl6dTz^S{{Q9]$sqyEZUMk:J.˹ر%z⛪X_e$$-YFJFL>@4jQ(iSE=l3Y8?cIWfyq~?=Oqv ?r.!P\e>.K.p#TNvR\CxFa@HZWXՏ:$' +$T54v,5SLh_`oF ?uY9A|{ _=L끇Άf"1I xҫYu[ >p1-`KrY]o^C7NpҴO P(1)D"%KoLJPz}YBeiw +"0 2y7Ϭҋ<Ǚˠ2lPx!# YMbe<ӁJM?|0RZ9CEn9_$Ô-->;Ii '#(`N ;B^OL[ 0XJLw`,]_a;Gq|P#{Ν3&߷|0Z;ϟ{b3vreq Du$5U>,BBtB T4wna$Ǩib.P(+ APjFNꂴH;Ͼ~o[| PyG"粛K o\fJ0HĹyB @jqcsQdȝ+˖/B)i+BPXcH3QIf7Iҍ'J qgbƱ`C7+qtc`O{I_{`Z(Pp;K>9bD$c/AUID!84bۉKM"D)Sby-ahaN*p~ޠHA$7/8K/ڹsQ.R=>1SOEu&i&DIfQc Ei*~I l%|tߑOQQ$?\A΢R4dD:6Xy YW}.%Q>Wc )ϑzˋ-{1H4ڤz~~ᦩ ab-%Kg\|E `FyzeHzh(_$᫿GdĢebQ^7 2r$~'\2L+.p2=ȟN Rf?4}> vы.MH1ҀQDR2t9J;v\VT%]=%w!-+YGexNF'ѩaA*CJ:}Ng{/wH2Cg$Xh (pzA/7W N:޸Lne.ŋT?\k1%>=g~ >g*ѳ'dp0ZJfO(PeIǔֽa W)AZ?geOsK T °ɖiyy%d?,2RngUnW{u!^וcMwUOE{J0\ȏD,Yxڐۙӄht("@&E?c Gl@á˾nj.!IM`)qȎJӗ?AUdp&w%]4K(͚qdDPtz=9@ߡCjK(p8pL#Q`WM)4C4ByRTu{X 4^,\l2DKߧ ;Q^>l7/}:!|Y$.՚za˚|e璣5&`z aŔŁ +)/_6 5o8EM\Qg(FYL/7ޑl$E(|J!>QaR$ ACz^zѤxi8%Y/="#tr_O~$,pb{c(i:ڴذjUIi:fYi*Q+4ԙTy"-$*;1sCȃt^m M|0nP%&3_P4M|LZ__+{mr]P㏭MpCg/U BKk8R# \6KxX.klJO0lK~Af9s;2#񖠍NNJ]tg9hWO٬R7*3GӮD@+ok\JhϪ_QKXm{WZN,E0D7ms 5NoŪiz8Vf\OQCZ&rP#(zLme吞 YqN/cݗ9.;~KK59ה255aF}͸wXv!ģ@o3r9{6H@vnJ})ؠ.AwiBg2ĹJ!em5OxgiMIqY_zS| Fo֐2(/qX"kt1жh"5]AT}ә2&ݤDPGIY "^фh˛c-ANIhi'PwNcgX?b%JY٠lZf#'h:~NǢ:i'd&t"h8k!A)sY&|I|!Ӣ=oz uwAWKKOYD'T@X\QTdPK0i$K ',*{_.4qz %"u8u ϶ҳ(`xzG9G!Hi)ITW\DS.ML綴xx&6 9c~~52%uLL Sɦ\4kO\:}Д=_1E9*S]dWkxNoq|-H4!/V4VڳTL=XP7FJ;p6eQYEMβ(o"s%dm*Mi`?\t1ent,S?Ckɲ7$LW Jw }?1GmZ}W{\iuU1 a_@;%e;q1F6HoѺch&~'i\OK7,С:(ΐ4_k#!~[@kiqOI5_fW& +1 v'R±7X&GחL^M)k{aPu^>;\Nănny/؏UGA+*HFM(H1fZY J%;u1de&bQ{Bv30kI)RBQn7^li hXkyZS~7q@xP~ d Cfܲv¹K"GKN{-]Kqi#υH+&vx;ab!oy)~9SSv`Q,ؙ̽ytx6޽4}Yj/0ܿ6t}i?C""ށzN<{ChY剝x;98j̑Mb?ϲܕfCfنr2#Sr+ۿ˅r =ho`m9di~V|elL'/_`cb-̌-W%sԪ$䤷U -wHpCS.؜5U4q:y㶅2k Ehݻ84As[~G0s 䤱={` -vjX0;BѾg`}{%-MιnQ܂)Ψ=Y|ƀO GHd Ċ xl/Ro86w*4,_zps^vL:ʘҢ 1[Wv/~_~~۷I۷"T [gs&t>S Q>D1FاYMSLB}x8?N/g:l|"y HpYrէlu\j3hJm§6I6V91 {8:ﰕ+7}\!J\1Cjf~,~5j,8)a[}T6ڑ<6 <9A5ȳ+sq#4j3?Cj\FD,Ƃao$&C}8qrxA,-zWsfgDvkʯbFgc4I$? ЉcF_^!MAy6A >4{byT80[W_ITzJ%1aQ̠u "h\ 8auO$ԫ"Wpf^)}8`">2 @5V|2Ev` } F腅@͕C6f@H&١" 8,c?Fܳ[/WǽL2ٛyCi&RY瞎 x.ě 6/Xla XagXD`I]IYclX.pk`6MXckd׬>s*v?_o/YݟϻikC&G>򢅵\ ZC$y3 K n ˡX!tq^UKDz'$(#ΪϿvwsgO~x}f~ٳ_6Gx6]Gz[vL1XQ)2 T5KJ V\: / F$hyNR09 3$7'9c({52t^+A.y'EyJ{ ,'%8.oc]4M~` ` (REΤe<9 %{N}i^Ww >/#?'Pi˼9gOʲbQᢊR*J=!tL>{j#{ƈ&xIr 0ц|qu?}~>z|Y:MǸ4u,lM&94b(\Z6]Mdii Gɹ>)X6ՅֽѲVNGO|=6ȼCg0}(0;Ir->/''E(I}zr4NH!DA<5 E8b)/Gs\hnDIr VS -,L&LrXIby(I zQ9B~GQ hp$rN$EdLꝉ=E*wYh%E~+y:|z~cy&sOIٍ,:JuZQ)Im.e^:1zhi w==_iI1<1MRЀ:KIJtLYo҈i9+ֲ0*KQVIa7JI],-xb'`jnbe(c9_HjLTEn8N+OiŲfN-AcP͊PMo7lrkM1- ;Q4В9z([=Yc)D*-caGEz4yc(a! i'? r1v(4A |v:y} t5o.Q#23kȃf؂tc:u[LPP|}Ahsf~HX*(_zxFj,w}ll_t?`dI--ejwڝ ]_]Qu+c_ N?cG߳NIU^.9ZZvQAt@@t'"wFJ s$gӊ!/61褋]%Pg *z'6yֲ`ǫvt /!T D WHn[`Nn%5Y>i{|ceAJ'yv$UuGo"0xuyE G?0K,Z#EbZ&>)V{DSv 5wQ0ѣ?J=;ׅ tV V#E]Z]üd*2^+%$YH-$gSQJ^9rl5BoR\}њ @f?4JY(b'*nS޵#Q{ J]]>:ŵص_Y&./iMHQ? 8sxQC- }Pst +Zg-g,~%:8QYxċ-dMm%D]R'5&SG"|CpX`*,.2װG2 eT̠ozԐw 0Y)klZhŚRbJq(giA1WFTyQc z&7Y 8?!% ɡAxd,k=y( )Bdl+)x-@~2GsRK@io1W^bŞ{x=EEp ʍB"{gZs9aY{}zK5)栍jb zq<8x?F4 )raabrpfNsZk]ql쥖W11agikeexP- |hq q^ Fk"re(CR ] HpG, ID"->tpkT5{[DlZ(Bqץ) |zF/Φg>G;?zu;W{E6Æz]iZZS#w~B;ʛs/u`TF‹) F/23yP5PPz%}8%V31vZl`poAoy\y^)dkJ/w^T~pl0< *(Om ?B,#!˱<}?@,ˤ etf ;AmaOF0gcjy+g,9pC ssT%F?6| =^ ƕqcD0 &"?ݷ~KqdzCeT1C\շ[CJ] U~ߺˡEh륦VmKz{`sjHca<| piNrm @qFw^Nf"}泙S@7yL5Il$o =L,3Y܆:(^xE3rDynv7}|/wݾr|:xȁftOX#H^=gxʽI%?x/Xģ~&۹q ?#?mzZt2w4f*a)"g>tHӍ7(ku==.B6$Gw'Yߞ%zv~c 8#GH5=t98S{PJJk^d9QZy ˀI>8Țs ͚DA~ ү9NeX1=HzzV$S3>KB U>Vners5.O2 %]FX4Bb\bb ^.UBQ>9'ZU>jW=!䩐ŝB|Ԡ DC΄3h[dz<(u=* 1pQtF߃wCȜ9oFG< 1@`vcmאK {pVtZ.qhJgbpMX  O ~,&lzeP~c,~s6vNN<Ǘ@;Y2` i݇j褈{*HnOٰe␚`ehcae %W]<M@q?$FEd囿O=⛎|19vg8CϠƅ6:Pf% (c2D!Vayf+Y?mܥG:X[rgo-- ZZw^qE.6"Ӻuthc/ҊՉʜ]Z4#i[=f"aNc#T,\ʤG,8<xLL﨩"?M Tǎi"Yh6"Y~ F$FCtp IDaOeڡH~¢' @rQi粸|]b*_T{\uL6F LO `S4& >`qMǤ;^ ׊!y)N˂ 3<0|K/|-M}r+a W(c阚o>yR-S3ki,82wbGgWdsrPFU%e["p} ОUdqQHnP"㩬*SUZ1oV"csK aY:sf9C^/R) $)١w&`` zyCПKltjr}|IDJLԒ4a ,? l 3u=DcYggIZq0:;bR&"*5!?D vQ̕a śhC"Ԭ`)Hc9='{fpI_cMHǖ*`Rbh͘nQrA`ēiܙs St,"(\!.$Z[ΒctX_Ôv6jdW@T'dc|/~rssѕEb=A/{,թ(K|iiBMl(zE}Mu$I YOR#%٩&%C!5ug{x&k_MB>}H }Q"¨ N*>ۧ;J`gؾQNˁgOc0)iftȈ3%pdӂ&v15P$K[6E_P۱AC*X7G3]vܜuKO]\Jg6Te@,j@z͈X,&t)\ML-ܧP x n5`5>➏Q dim3t86͘C*Z4zRTN)y'Ms*~,z3Q$Ꮘ+%VW3\Het)9 4Sy[RTfHDJPC3,{hƤ^);6PI?: Ө@>534㎱Qf7{ ?q5C=PtS=jLO u{HT`s 'sB(٨`uɣ쾨8< g ;L<IkG@X57_ķ>z-1z\,Ck]\XFxfCZahobkJ|hTst/[R{eU#P!<%qgKZm Zkp]i? 2/zZUf@-o?4nIc9::Vŕmxe~$"Q`Ȣ:64>Ki9` NSf4]%sLBO#̨kxPt) a 5"}:Kҥ8~(ƑS$=} MưT4^69Fwzjh~ǥeJlMaI?Ft)JAK:"8)u 2& +`[$ـD?{20r&hRk]ӭb4}h!y^dxuP;A^+9xQ6Sb3u1\ĿY>kz%[~瘃VN% /pC1Ѵh,z.&H-FN{&VzRRؒ8CL 1>y?ǣ> 67belTo("W^ CF˳ē` :?6WyshQ{t Fzb 9JLZ*~~&Ur>1<9-~3jGperzrٟ]9 kӌkJbrZg2.W?g vsKQxPb |0*pae< b: ))k#]^Fq B]Yz{$ǦAOa_q?hv?/ßWpe7P}Lw-gVohwy$Ÿx,ulh<&.,m_>}<)尧IB7A}dXcf=5;~TM:JI9z5[]į}kql|:~4d4Ri?BouԈє'z|3})a7+Up4vcEIWOe/@!,t/kI6?`Y|-(xnVO4i(G؞FmxpzGý.:) ÍB93#F|::"j>Z8I)cb&Y Բy4Ț^G8Ĥ72EB/XJJ9z uPvdgd,3)I6X8ƱIX+9>KX"Ǯ?>0D>+6=st']i!_!s_z*~_Vۅ1Z[KbGL>Y)$]@8ٜqUpq5^UV>/~p_L+e Ȯdack^$rUW=c P+6 dv[D<2A_k͓h=eSO>͝-;BT #J1J($=ى[r eYdGVz]W3l1{Ai qURyVo0z%aQ4~o|^׿?o{7 /E^w׿1.OR/!W6t<'^Kw U>g\ogß͏пU1Gb+*gH4܋e0M2..\`u1宎o*rCG*㶋]-9'jyayOCw7_?77W%wc_77x޿b=yaK.|Ἳv/\rS|z@Ea?}y|!qe I@M8>8a[Jͨ> P>QVr*}1AaQf~S$y4pv9`xT8(tqhD%ψZcʙ°@EJ-d(:@kM eC@80;S4cPpJB^N 5# Z@dM Έ#fG(DH؝ꘋXRa>0(Us/Mtd|@f$)<ЦJS8:U.0A$sl ( ,PH@<0ƄjI,Д!VȆ,0A(0s 5$aTgnsF%w֌o{u,H It۱l*hM@#صZtm p8˦dBS [s#gL@\F5XΤw_s+[WsaKh,)[a P14@w&ܱJD۴0SRj.zX qH6!QZyTދ(>gá1#+"Sh ia5];||Rd܃4w:o>B^U'É3eAX -!D] M/~Hwz58GO w,9t$yƔ)SIh [!m)oAa+٪puPcX4bFR3d&|Tdp4^fByf7WWFWȃJ3PXw{M;Za<5 t:zf0ychr< XbV 6{-/6vCnŷ+/0Q LM̿d¢]u=UsZrJ6z ,4~s_' {]M:ae? uVOYZ4~kıǧ"Ȗ5D(Tz=<ŭaM˱(C! -y6GC1אAx01tk[LrAhugq\һ"bݷjX6{ G8z4KUY{i/b)?B,Bٗ.#N6£¸]IFI!.GzKn.ç9qLtW%M4taJPNV)$>%ŵ bz8]c[16-", Խ\9gcr+l1ƀ *PJЫ/%{㑧?geTdkb%wb@ OzU@^Cg/쏴C_m0WFZ{>~cc4b%q\WX~]Bs1H 3k 9E%xO՘QP"p3+9o^g٨3>@rXeG"K`.')°/bWs\ν(/lЍ_.* ~NI2?c:*SPkG?_X%(ga@^7ik>kURQ՜ẋ{I. WNƵ#ّ^ML3 aTE(M7KZe8c]f1*\yCiD^[ehF%ZSJ<Pv%|y/w,-0O#2 XY<6@odϣwClKa&quH#% ou=5[X%QbCo[dR֠K.mU ]vHW%`gY?}uu5g(!AUߚ`݅vm.ibp|Lf bIsSO pFF^C}rȓAZFw6oЇnţO'*>*>[LLY%OD؜y/=_p~ `e}.U]]{C^ߩg_!n+C*9\ɤlc[L!>hy/F+#[V R$Dl% [d:u+ 6+#gL}e vfIS=CC:)[?Ù=v9dY?܍' =z'oro\7K]\Qwa$(Wnase_fR:Zd"0Ϋp+~3>㫚sxYꧾ4&LR͚xwb’s=$?\OwJj-I9/›Ŗ6Ijm0' 0u;Xnql@ۘ| W^@~j &o}Đ8?T.ߏ6_-=]7 =}}_ߥ?n?O ?ӽ=Ѓl)ˏ~]p~uO~?p~X9<ğNu^`~΋S?[p \\^{P: oW {z4zt-dz0n"GSB+7:ڹߛ^`,q dG~=!pUT`BJ p 64u<4iPLrT략ߘ3yBU1X#?2Z["~ HL]0/:l.Gv0?6ɧY&/3ǭ'ޚ!Pss@ w|}ЅW)>5Bb:.,hp30o~RnW?#K#?R!_T[R_c[(ţj ;f4t ^l<kHb7^<7?Z6X뒫Q]%B3s &)#$f :!%6ޫQNAg3#Jc8;kg2"Ǡ!9 J6Yacp B=\,k{58%>~O @1.,̿WnX޵BAhdM!U0E_Ȍf]M4^Z櫮}MLhP@|EEC n) ]w `啇Hb||?9q 7o}Uv+;.=f`aخ>~K-!Uqh|PTdrb8.j) |29B: Rmh@؛G&l֤?2Q|1 Wi_j؜u=]qi㸆>Jdi~ H<9t!ѮxQ;P` 9 &se+mPcmU%h-n0s(&)Hd!)52@|57w^d-ƃ|"+*_Ff*\LdT?1lKZۧB!y` da+Ի^4T\JF7 @Ⱥ.G@jDqSKF|q%-@c٨ pkԓ32pl`?1׵^kK w1hcMqb;DJ/'0jC"77ʻ?ƋRN8>Ӫ_`k[ ƦrCy(D h|EUiH~*~הG6? p2&~$r&__b+& !u8lN(9ںmmj[^l/xxBp5^ hc|tȽ_)F#vOS1u+~EMp591L4bwطµe Aq@AֳmScvMMw[Cо^=`ϙc 94(BǭrcJq/*3aZXVQTWCVF:8O< [Gc\hQJt4}3>^HhP]>up(|*!({3I"<_io4?:CemK4#c?dg=}&쾛w49 g<MaPWVbq[37Y2x@A~A37ԺKe+!r>.VWB.~b]Q4 WM^QcUCq{"|(ع1d l E[4oc/BCT\@(t}fzʪbҗem3"O"D hEğ " Wؼ6򺫡7+H|j2f/scj=E|懩AлȔX)^ }a05qaቩ[8{oBw\_% hg%¤ ьG/@L $`)u( YSfF=U>㨅Qzݦ͠;1܄Cu|E N@ͼ 泀穵G!`WР T*+[o7rtUֳgzɴ{8'^P je>gDa35=u5C b! +z c䩩V _[Ty @|'iP詉6s @"I150ﺚ[i0kt=+l= 5Fd Y 50d T#2\gGoYn.7C4B$䖭oK`s0'%mb;0uM ^pPqAjئ|^u}RPp'umWjPrV aa$?8ud?x{.C=oЦBi"w(X=,{׊BZ`F( f?3KA i]x(քЋB8㿕Ww &Ϣ-ߌ0\`b40pH`??@Os.^_%n}ʖvCeJkl&|>H*M}5 A cK(bgޯa°~;d[+{T[Ӛ|ϫTy`9>Xy9*.@!w/_6 ViB'1]0}c{)V,`34j!y u䧆"n , tlk:eT6E` f\ϟyP+yN<~&RgOt@C?yE[KoTmka7 2 c߯6KP]s5A  p -yߍګ5}wCv` . }}@ sIpڟ)Y^̢*k@N]7;|^O'=I]aRl>xM8|F'Hn$`O2EH0QҠm "#wDz= b}Lk$d\_]}~e&i|~Ni<vL o[y`nHt620+`x<`/xQ#lJ0-Z9AHWx0^um0Ogx0 f Hnwk6"- "ӭ9!znoʢ4oomh:Se0l7CYӛDҨwĀ쿷 kmK: e r}|(nyKl( [œW֢k˘ww˛F- \ wa>9981OZ_H?2t }dbN߈s;թj]ٛtA1FNwyJΑWJ6gsIٙ(Y!^Nv=^Fm`ceHǍa0 5(& `K:#psa=im9ޞi l 囔}6J& kt$?Hˏ*F;Nz\:\ta8V"P~6yJ^Q|B 7/\{hn K0YQ51sE.[>NMPgp7U.bЖ5uf1kYLf|Ku$"IpGzw;C" jEE;!6dθ 7' U+Ys|gER m56/gߚXukƾ`1/ Xy|bBȰ5ɛd?x!-;o y)Ơ1j|_DvKrjkv˅{yq`}<f`YPycmZ:UO왼赲~YV?b cq!)XEqݴ]鯤 l%t/6>۰"'KZl0(.n"oхÿ!¼:-coL@Sg\~f>meڌ= C7^nN~q(KCҥR P[ʹOlF"5hZwtS^o)mS"L˜Ɠ o&?$?NLPWBr+ qepUeSFZo/ŮaagA F3Rn9l~`5zltA3m¯XM?/ QVw@K? זwSҍa 1YJug&=|lWrɈe00wwX!q%]IslBvA\{,\A|}TEs 9QZs_y3cem%{ *c|L0 h@ A|b}~AH.K{8g"Nb#+qy:R̀_ҏ~Qu#)!<½FZ :hKMaH >^̠A%@}p)g $ u3+R4W|LPY>lړ1!j'k [WsuEpY\p%QHarpTX6U~x|uӧ5ngQG4EBgpS L|rJzycgN?{ll 4#{ ,p~C~A">n{a{i^oj(ڳiZ1+DC0AIFÀƒo>_ڰOߛ,MZ| N F~DȰ "av>Ŗ=X1]Gn*@B:rͼ؛@t ?31F;!g#V}=}u<=S+/4xWMaׄ_cϓm 7srG%Vi Z>2+ SFZ'LԦs-Y8w W踧I+pgU Ŀ|noބ5 6d9`>!HXL2;1SSr:_e u[&#EhIK ̻omn=Iߥo)Κҿ1@[ϧ5_ơ s"~d8:!z!JSK\ܜf 8Z[ee}f̡oK֯bWi$ϣ\~Ǫz)Y֢!xdWKރ.-Way#3H - ڭ+mooVɍZh?.oG 隆%l'_^py@ ȁ.S:YQ/:|&'J:(0A!u g(]e_u F˧e{v1I*?6FFMa8vV\z?qO^) be}ȇeLGK"ĻntQ\y\/H;۪rJ)Vl"=^H-B#kcUiU-A39ʞnI(yYH܂{9uľưt,2ezqo]d}oA凮~TN4aM<>nx D >buc{RPfExƙyUN1}u>ײzKkb/?ÀA4DGdE07!z;؊ޟ5r962,B=` :Ji N[]kLn `>ŐZ=TdxGUmGS.]!uΰbHqֳHAB266iQ/p݌3@@>Pc"sU`7ޖ^Z]~C>;t2A,?Iw4ЧՓ:Ws58 ^*pqԥ<[3cڏ㪋3M+dwx1 (H!u'QQ Fk9vAXѹpn.]HFM/46F®sAg P}P^߶zWJ%5ClH˵a$ &38UH'Vm t KE=oV?>N_%;=//9cp<RgADFcy]Nm؞Ry+M6>s?B@13yPiׁ._ɂG"ڌ ]0=mUB8^ StUF{~Hիf7FܥC[&~ a] L'ƺeR:Ŋqlw9Ɍv>,n/ߢ ni_Ms{WhB!q?)s;3&]2fm 5,4Q˂h9Wy>Gڹyu'A_*L.7C\nְCϑ$f>WC 4W%/ LG/Kfp]/z&M}73a:ɑw}[Z}uןzy5hhi~*0cQy ߿ !VuwC ߅ | <ꍉKNީ]:4sE{W YwIgh皵#xKSc<Ԍ.oxB <"VXY/]LS-ܲy}._;W$zW(=c]3ɑw.W݁ZW3+]ps\3=<게\"*#33a3T4KkE/ӏ HC'A$ #7Ԣ7p@?Ă菌&8șo:z*qL VJYd vu"MKB+wfvV\(M3ҩB?$ F;ɜHGgFXaOf] ߱qEC?+Ϲ/}w]}{z4>ǫ?czq)BGzCt!~} /{ƙ?:'A">OJ?E[)X)qhwT IA-D~;'%0D4ӧaH^Y!WgdPNQHP;my(nPll!8 LgYC(<[2|i|A0"1()00Q2дx[U,[!#B)3;uYV^#9s'SН^Vdz]v䈳{ Wq^3@zD< YthIk|,Ahf9.*b)J.KNAE,dSP+st)?gNN5;r$?Ki4/} Ks*8 f)S -՟3 빎(p} SV.,͹Hqi+;uŲS4TFNxOsI id,}VaHk>HQ_>LSovg)75t"蒒,deq7XL.~v/߸Y~,B*kj ǝ^es8|JaM7 R 6.\4~ 3)WQjwB?6A!-řf ʗ9UӜWŗr͸/e}{JSхKX^>/SJ?i/' oֺ_H*'$9,p`s?_.O7"澠UqJg |Gh3uEE yளuO/=)j W좆;bT%5RHz<>z>)?m6XÃTF =x򠑕Sջ]ЧSJDzrl X(,{^˶p1tdR܇njy0ȫ/0xˣW#߻Z +VF.+by: >"iY(؃hy9T˖&iTซ*Y݋1fyxtKitUp"Сw gyĊT e6r>x 3ZI/Z!kߜO%!px::褶6>AW}}U@AQ^D0}[vi^4 kg_cBSȶ0rf -jm_T^݈-ktY(3T_s%5r`[%07i 7Z݌N9F)r}{?G<#:+m m<tU?5\sa oN MBKyoCC2x˙ ZE寯a@K3v(K)Z"`rG|hl?ж$9*|7^Gi1sY [,~Z띑Mhf<zUPVNnz^9Խ̑Bq0m *ͬaWR2װ3툃emdՏ?coPӯ9=A`(~ \:KXSij:ܹC{31*k19 <8&?2T@-M`x!m$zj35=J+B`7lwjt_1gs\XƱ+pDbv@)'qlK$F}eI~E0?bvt0x #FV5`{5ſY ': (w@xKQO5s2RFµR~P:EVgα^^2_aN\;l-d(O^xLւuԇIoMٶ~PpcB3:Wp`=};ݏfi5pY&bT'ww ,c!؃nIK { 65*t=rLYąYZa]n?:>d]4KW"1ux.`"Y 'tc`EAgxbw|pmub0{_hMa0>rɺM&n*cS]p8r(3i*+0}-!1j6dVn5!(߾ݸ VS\]O4N >%`|Pav@RSUN_[d+9-A*Ꝁ2കw˒4kip[-IjͻχPUZ-!V E &M^{݊ٶ2< o5ހ 9+ X1Y^~%{\"!:Kssې/:8<?k~=?Q~.'?|?L?~g{C+Y>j<옫q$G [!༮|~1E?'ԠЏظռ^b6&r*1S PH&5*J44SʙK4r",Xf۞4o Q;P9XB4&u\7ef*i0#_澖;A5MCGp}h(ƒY#:³d4L$@4X/a:~)%=hc8SǓN)J.sx|qrQPsz+<Y%Τr9)tC6ϝ=K X怛FbW x}&_}ǎ$,' Gy'\41k ӳgqPa"͜r"s?sRKF5b)(sɟ0 HIpLOb--}.%7qY^އ9D峳z~dvFOD&AȪ_⣜wr^1U[1t,N0VJ3Msi'dr^sANP$i:Q -u TXR F̞_=`)U,4]0#qF>j.BK.)ʹ~(ySa f5yE?B$f?IO({;xr֤[.?mWjK?8.qeQs(a^Yū\fLyK>V/E*tp?X@֌_*! 9ƤNܳRf~9_6٣9EYPOQ~gl/ X/ w=K?;^lĦ|xbepi숫nC%MǸ?f"~a~{41ybE|LX+Z6w/_mR;60Ydu?˜(>gtp$MwBĥR>;~cчF/皋0%kt"EFxIdJ5GTM#^NFpw|1 i)lIh$jL9؏wL!ؕa՛ٸr7is'qCȜɿW_L L p-m EHu&ڸGPs4&|\ˌA}~ E*{G,WGSG/U/lŪ2XL8|`!D|e/.EQye夰,ࣩ)_HzNQ>k' _E !#ѝO=MB1XQ\$äs0T&僕Dsj,WۜI:EZq fw ^OsS}Bvp!Z,m/{vI6L>C F#L &a?O↞!{S/%pm +`JK4RbƢC(7+D1] n,%M~ y<(8>eSGڮU2J^y磒]N:̢V8.(a'{Pq@ѽ!UߵʛˡO"dvk1yF/W,"_0YnVq(NM?ENk8pE~NX+|Br#Ԏ\j+dTkx1$ŀ w l1wu09dUuuS6ϲ- djMc&{h.E$jM@Nٝ'~5bLb &2j05E3 ڦ_' -LC <|uzcYUcm2*;_b>HX۲0_VF+ E|Wt%"\x Lzʅt^Zc1Vgo* } c{vy4ׇa<45-T cIHOH_ŗu,>~42[&4Yb ^D3XnDw_J%W0u[oސ pHs7D 1sj '< +WT,zzѺL2ѫὍ(xn06tx~?3o.??.7S5\Ǚxl#3#)qFjlGF`P.tGF!#(i|$^¨> a0SJ$XAޑĈ S.b(&&%QbUe$šE#ܔTɳ)ZQ2AsE2Ӎ`Yy^ U4A!am2(#ɓXu ;c-Rd&Z?is(>Ng{(G! ݣ e'-R$]BEG63,`]sX'J ;Yu 8rEbca;^Sr9y;>T[́nbpcw:(W}X48g7`a6({>cƥ9y嗎?fXc燷ZV\]nAȺpEE",|垀~p4WdYho:+DD~ALw2!rFz/AV~ZMlXN[ix)1#e$ `MO&Qvu?mJtwC˫^Lt}K䷆lͧ2@w0u -H>\nC1{{2Uu$}<~wL6̰(  0pg1A3rH}gc.ffo8Rړ!h \qw%Li~V4샃.[ xAVڍ־!җ͐ya>?GylG٥u0ΔEvJ_`mz E}y[ OW£9,݁g2R=x054\5 γ'T\[Lhh {=CIک!`gXXԯB'E\;ȼkT{oCAckb9mutO@qٽNԵ7wUxXI&AG5g. hT~29tIǾj۾6DSO0 43{]r/]9Xrk}pgF\3'Zg ­^y r>M} &7h8 {X}5-vi_*ۅ|F!bC uGK^7]Soy1@/Wp^aa c Z+fYsww.l#J 8 k &/2-1W֨k<0s!_%lԭGߋ?>[w?~/o{^}ק}%~E~[߻r?NڇC@$mY{k7?ջ%?$0Oj7N[ȹr?|q%3AmPccqYɧ?Q|r4ygaP_76IŌD P]͂Τv_\]Q=y@-u˔@EKRiNw|yA9qyh0:]*9f1Q3bfSa \)69ܥTZNA-dZccMB07B)Q'0AAV Bqchкγ 'LB3[ga!-ϾM+Lpn&2@[k;)te$]o 0uA+H>ucy8\\N,`[c%| QbYQ#cH#4-a7n.$>Uf-.!nC  5 R6tY9 =kJ_ºi?cEf8#X1EoY—QhO qSC7[jYݩ~Ri_cus)h.)ߑTs ؞Lh;MN~AIb ,mAr"-{$q/ĚѼ쇑RQG;)Ε) a4Л|udS ihT;4K-?&ƂW"HCP=d9$S͞GHc8\&:V"_;ϝi咊2i:l)Q9k#;aQd~ש%#8) f i\kR)~~ nȸ}P k樝_2_SJLPb*yˠ>"D%yJ#*3|afň;K?n>[4DQRqZE/y寒܁4bK,YN'ji1jCJO#n$ͤ:$3+fk;R A*i9+vXwlء1@Ev\ 5Ӎ)^`K ,܏P,ugFU0pހzV1t~>3uq獹:3Y0m6q8=Y!@2FO<SFkK;rSY2Kڐ(7jNdIڢ_fЦpyx1XO6"St[FO yk_TreN (Z,"m[`)1 ?A>R &J\!ؾ4Ğ[RĮ,t>f w'ن|?QM)Uِ((gZo EItYJ -HS6_~JǘhPROLxq3ξTEC`J]2MAT3udq QՍ`hν9b1\d+j;y?kQ>13K!jgXM1 _6'؜IXmӧB~č5S$~NdVQ_þ RZN_г /*=K8 H/sD ," )^KfSOhǝK( kHp[Tȵ^8{XyQ$h^y쳜=\#cslR>Y:C~Dq\qҚt"-! bs_E<"xR<9HxUJO HΗS:DM?!Re1A$V FpqAD "GKc>]/<2 Lf?kld%eP],ݼ'7ߤ>H#)'O *ןF-zHu2f%7y 4Ep0"ypGl %S(c ZV(ϯICM<:Ź~fQW/fIȰcsG`. Vq5ezsb#8{kE_rFfګ0\qf) 9==XݾxChv8Ls@)@iq XU8f+u.J`: |Lݭb- l|uNX 5 $/A7n rd}CvYJQG[m YŰ޹5yn ܰa>b&,[;GDx]VCbp<%ub%U HZ5OQTkIcǥ:!Gzҥcz)}99}`mhs//(7B6t튦&+ё 5m呿f`"m}@:,:lAIo?zHTU;zZ:& &`,ur b`RF = Z՜C dm"۞3)|JJ_wk6re KTnm}Ӣ:Bs ߟpdҤ:5$ N)P -{h \F bU4:^:sˆP5t?Yyy#C;ΕxWnB~$Q"AqBk0ئ'u$R(2w~٫ǂKy3]+S0$dzdOe*|`!3Kub*d1ؽ3Xo?Ħ׿ѧ>’fG_: K,gLVs+3o |G"=5 h/ЂOR!-Xk/b{ ]Xv.+S  T7χȼM 2[|l/p6fQBUAM<*ɷVѦ\=cۃ3tpGYҞȲ`]A UrGP_w;#GMOSŬ ~ߝpf}%9V>7eix ِi XG2II%%02ؘ0 B\=5YbarNx!#( s`ax@3\nڅ(5B+0z.c$9j#ǂu#<"dW);)R~Tgp- U3hs|0ћ0CDIGrnPӷfE/5f1D2Npl*+w2+N'i!/6IE`,ˢ)DC2ry.>%U2K>?t 5͹%|h#{6tyy>[?It43,jeM$В i2Æ/ӗ,'\y3w7c1mYأOb2ՙ'lbv.3]2H1Ӊ4hL*Us¦)UǠt~qc95uq=GπAL7u6}HP4*Qdܩ%K.:) {| r˔Kb1z}Vn>¥穃_*TPeD 1 x,ѕv*e7SPYDuDgݣ+%qcy@8iIPx@٢r'w队6?S9-y)MZ@t_Գ<2xZwݙHWr 8wj,€E(xO:!Ą!kF+d8b-z-.Y˾iXZvXJ=W%TbNħF913-E!xIFL2 ߲VgΫ/zGE) uS?lo$DQ3mܳXjz4̳1CNF0u@ 7L)7 +\t\;s;#d ҷsI?^/8)%;^IfrtaPu@S+Wy!Td)yeFBdİ?.Tp0,+˩SKNvYPa*sQpY.FztY& K UBˁ8'O[`0"Zb/ .bbj',jKO1YNtIËOnI,jӊrRz{ܡ-L/VĒc_>&e{֒EDlT͂٥!NL/c?X\@4+kG cG<&s)ZleCywZ.>'8/uޑ!IA}^z"VP/!|V S@M獢lb5":HO&qݏh86~xr^e45V%%HS˜M"!:Gp?IGEV 6jueeƵC6q/PwF]=/a6%A!u!]A }FNXa\ HB9}1_U=u$";'9=:aDl:zZq:o|eE PR$>hG1;E,#3+.bDr9cj l(7 SE q '{jq+0{\⏶ܹ.{iHJ3B9o:):)B{y'{=`\O9% C?q='Uz4Ĵ`;ORB/C8mMKSN d.\Smh_yp߂3Պ9;Ь51QA]:Fœ{d>18BU* ߷K6+p;|-N#gW!J<{žLYR]n 籁q~aQ*# h云x^+ƕ3~{u*mMvZ2B0Gᙛ B9V951Ĵ~xLRo)7vKzniN ςArkok#jK<݉ak aB~oհe9h_yΘ'2⻽/sO:JlF7>%?}M'+qL&&n$֧!E9qF ߁:rV224.1"ĝ|{"T{6"h-"Rd4vAj tsg(, GDJa~ -A V\"@q#RwomKC}u]ﹸm=f]`65g.x/7 Zߧz_*ALwU}Î!+Wt-ءJA +y|䡃<S@<䱷/yګ+Sm\Y.&F$7|,J=bB3`i@;c?v8eKE" KYa/<ב']ag;mٻALy<z2 Tt_ٹFyʝkEY@z(~N#j~(s،O8WY\N'Nh 2Q%*˧l:b :̮͛@[.9hk-ߣ̺fhWY>50%0~<@3k/!]كzʃSIpB+<+hp{v_//d!.]ytI_g$v*>%p04 ce<]{҂s|2{ᄊB%Ύ~-+CgAa~gߧ,F]95AjC1qhن~lfWIfvDt>gE!E/CA[2WX?1 b@TJ 67Ҋ7)Bu)ulp mPV>SwKcXǟmi_ҕ+cQv<2Z,"ҧ DnBl;1. vTjEA)eB֪{Q Eĕ kV:ӎC1sM욣Itl~f.ԧ?ue!x0e4Eح3 `%0? jwù;KWj'Zu컖A֤?*"'$T{hpwa?{La/:A~,HM÷^_[ouG~ZZh.L *QA3`hɵDk p1xsU!5hw4|`zg@_eEQPݲwҕl 4*ь\uQ{m02*tW>?LN{qȄ O`#}/q S:x7qh: lw1J-.Ai%oQC7([GUOH:\0,MERLR1M.-d ,'6y4+L~.^U 96|YhZӳRҔp^<8;˳!MFHvlN/JNߏ s~,O.aONUКH+;:ׂSe#`n,B_K0- @4"GLaP"ih0-F̅/Rr.ŝ٨f3!3/ܘҌ|f.5<6ӃARG7~Vg>=ĖsiZKE,JDϫg /IR,/}K:d:542},in2\?Y+2RTS>2e}6JXf}J(evBX 0.4- M =ZR‹skl_͇¹'*9*!#bihU*4Scx8wwdb kl=d9T2Sna`@A`<zf=7ɐ~:aTŐ%Cѧ.O Xzh)9#C+<9sC3_́Eğٛĺ6'bKkjA=S]ŋ@96{&LQA>$}J m$rCK7gYa&Y%=+)udYtjbbTA?2vdi ly'*ߢcbipikywx*2t>!:1%4Edxq sNbcY\}(?5l.J Q' ]EJy)@_w䝛qEI"?^wW=o?c`>Hޡ <;ZK q nOSA7ee, g4V4,PG ]>Bӛ֨r|O6/1eʔ)C,ڴVCՉ6O~NB3Y^P aX'ADDdngv_R(A> &9. `"NYs} CC7cc.YL7 .ɥ"M26 }Pk+l_QjV)0/K1 o֐yd~a7KČFًcuL)<;IkQF &MUZ4 RNm 9 I憔?MGp , gd ΍钹Cx޸`Bʙc8 k/`^Gců+9U !g+s7Z`;iKs-rwkkEyEI&%4!~!'<PCy`4({;I :1A5.y6CƔXT؊̎EuT(oJ4EAKiW oJ(?t$/Z0Sѱ連>8Vgh1ˋ &u<#GMޛcA󂍂~udوgmΘ"nʐz65/EDqDv^18!v/' tGFCRuAaW Ev/V,a#"d1ڳ:v-|j>3`FNQybjHHO6A_n+#@)wѓ}FAv4@mm,}CKyx6&lr4ŝ٦L|-ĉo ¢&M9){X2,Aܶ;8?c@82TQyG<_o.vƄ`f0]w' s}90!&h됃v]\z?*=% Owtp_:ٻ?C{M2paT?q8  -42| A(!akQzMlw[H"zUbQ"t)` b7@[ϋ7iA۾W }'aڲk2W5 N^[*n?:۽d o)L7|C2k5l9o %YSD& 6Mq+4bi`迦oKM ËkϡP\k>Ҍ6,\'[;ݪ^ ׵>Xso!Boq7Ly_QbxI+d,q%ax]$8F[.%ȾJk1ZPd E#4Ws ؽġTדzjs.`fj)c:||АŽ>_~S̕E%'ũz 5sQr98eDSyٻRL{l;ۚi15Z)!ʄkmw%Wt}9eғ}hIen/V:DDygĬs9^9=dE)~;u).\n)\#AD,&\*tCpK]~}1^xרg `8^ ȱ2C)S5!~K[!33x!.F[e C0.{@ܢ1-lb3y[6|U~iI\G7tyuG x X *Nr#[8@x3]O)qܖ4]U%ZJӖC\'V '9Wz;)p~ݾY:]@p~d4&>p;&_=[K{s:C?\rV.}pr|uC,= Hٹ-9)_]џO}Av]옺'2? M>FxqkӱXCMT;k!bh! AJJ<0EX8@ZGioDs,Ӯ{l i${yhm4W Ƴ n$Xc7,6Ӏ8I}QQ0ԫ"R/ ?P 砸ۃ߸'d鬙]so0F%'*=)i/#TO:֥pI>"E!4Zlp>ep-ZyUH60̼)u0dmd7eRS <~M]x:3HX<\~>#@ 0咝3 9FȂ:SkIl ixM] pKloL fINC?w\au\ 8LQ( |V!>Zs31p/Ӎ@3)dbϦ"u  s| sMh^Wa9m?/j"s<ӠiXz \A P}Ofe^YEc{`tŰ75o8P}{(p1U.cc=&=Dž +ǘ{^Lb{: h,`-O=Wc՛_ d ϟVWopr4E"񞺚R&78&0K`= KBv>X[A['&BPЯ 3$3z\]3~x2PiلԨUC w'~\&?c>EaOIʫ}[ $T0}e{f) .4˴^k.>{NJY.R\0WȆ;ۃ9o AS~#)j WK-_R"~|g߉8?z=d}9_r& ,͖9ۿӏo:FKG On$gv(3hCZMO]6iUQ 殹p6|sJ:lJ>$ hb2*DKt%%5w4[Ɗm[}mFSr+- k3>(:'.ƒ+G]Fs+ EG}\@N%;:K|}9!Z}w`5eם іY ?W5ʡ]@Ӌ)eoAiR'Rt˜$ezM ._6b@هA,qFb%_ƤdZ(7r1p:#VJ&DZ`lD2?3+Kmhڥ`dJ8g\9'M10O=i䍋] GXo`w6o@/nWx?}Y= 1'k]tw;x>?OZMC|^}Uc*5l$Q-m}U7At'2SDlSURM?KƘ.] gk"Vc8BjJ_^X+^G!#EC ~fyX0oJ[uGCVPFwg&m1$KtAm-.IUc?7 3 c.m'ژsܘ*XXAݺvcޖb'+JKW{Dg5SL9-!8[/sPVKA؛| =2kX"ctTD(ʺ?þpPN`LKԇC55DSXT5A[Gހ+,ZW˲^p[ $C.ge0r=̓Zoϑmt@z'bAƜ.0:&WG \mw )rbAtci-gYv?Tx&a|s \/a|r90V`=`To-jݬʝsd}ON L.Ld''0f%h1|&{`k>*[4N:Jdu9gy|Os/Kxĵ_R@ODkKZa4uhog"BMQ9R/=?R$[cMx1B?,y>#XXy -!b%q{&oCX|hiCirc[~ 2}}7v>߷}}?__tK_ ?o_tɩ?K?C>Bٿ?}܏AcɅv&egou%诽z㥂;t7ʼn+FO?J=?nOa1\'7$ѳ@.NBᓆO'755z>wǠE^8QMD|˼0  RUI0 Ѱ#eN8$[+t&:Rqw4t,4B8Fdn[l8Q۸0]YǑܦISSR 2(#I3 A֘u!h}t9`'-aaXpz /31`"46Hs#,Qɚ簫!;^h?e,Ӊay$[D4 _ SR .m1i˰Vq'F#d /,I_,b|UE=3lJ[p3"SU3f 2-VيIYR@3N_yş[[ϏuN4c%5\PJj7bK2eAF1K\fQ/Sꓗ*@jx&l ;$A;ELZ$n;`Fq` P&ӓ/D*S.eo0 KCX ZzY-9F,>LN."G,Y|W04{Gd/>֨e9 g.),D>f=+{e-̀d,+ Y-6q(/D;:I:1!Кqz;9?!%#yN_G K.Q?.$I<"/b0/pJ3SWw8<"5{e:ىbѦgYŒ$i4^90O*He F8lY>UӲq@(Et J;ɟ0J>hg?%B\c;_RߛVV6$^~|oyΥ;a_14)-ew6\pB5I >7VS,he6c sʊL8&U!m{>oy:npMc;wTc/}a-!'(3 ÓcN2k4 K{,@鬛Sz ?~ K%wH3L%F-\ K;MW˃%ˡD7: e :%~r4=;zZKAgPuyn'Voş rXP-ᖇ ςkiI혘4{$+ !@Eb'*; AI,3aW[lR㪓dX=; C1qCɕ%%ϭnDa!7t6:r/#J^@ 0ZYh^zX$ o1d/]q1: ȹĊcz觠&VuYOSҤ(,@ uGOA*W / ,{賎 Tkh>u7>mTdMY[ s-,YFT9ݩW9֥|]<3 /vsWb- }W!+-wq<~K :_F2VmDws>ŎeGm qZZ.K֟/Ȏ4k#N4C72!=7886LEyk;X2>H}&;CKTLvlk/¬GW`y߀Y$ėqO , $r@.@_MCm,qΜ ȖHz_2Ƥ8a DFN< 9c5Lǻ&;3GPZ&W:"-!3|c';gGyQJ%`ij652z C琜 ~xJ~*N ^o,fgXםS^с9!%,@$ZUL k ׍muOS3&(N<s~p p!.͛WC8+6P$vA0q4۳4`ۛC4OPds5>#Ҩ$/(cVc1זx~$6_?3F矿9 FUq s3]ڔfO[`'H%Ӽ|&i0@D{G85fv}'(%y@Fjs o-?#wWG<{; .82l.U0)VxN62 Mw$6h.&qWRQ9/#ի[{^Cг\$_omPB!8#;Ȓb7ZO7ӗ 6ӝ|%ܼi5|\Ϸ?lWf#Rut \wubM ?$ՅJ:߯!85a>E_*S2'5--6*(Cϙk-QzpoѭrOյ Ie;h =iΩΚOmY"ϐ4|is@9Ng.V0iwoY p^<8N0Z5G׷xDڴ8ԩ]1c*[``πSr':LvRK&e|VF&>+]{o?_o ^{}5ûO㿺CœcqwV>gv%?4\/`o3^e5|ޙ]u bS XlHL-]" BJV+Ŕ  #$ 6`7n)kFdkc #%aPX"M DM d,*:G!e dHTCN00-:SDZluG¦etXS&+&LA`\E]w`: @Xf( ͞1 @$?dHl&$p!mɞ*9ŔN.ƅhHP090shy6#8lc2c ii.ϳP429<I=X~,px+(3<6s5αK=0xI dS9WqZs&Z"N=[N1¨gg`yS i //,ȍSSYXtӹb譚ƢbC%VJ:nu%ͦк݁Z"B[$=Kx)/ܨ7tJ2"Xr {;4ˊӚ*guMr,}~2s[I'TGe4G9+ggҠȩ)5Y.qؐ{_3Ri.TibQ}$2^3'gi>~vR J҂Q;< (TS|jH qGIYdAeވI@ 4TǮS.DSf XNd_7*ՉHZF_}Dˠ:BQB2B Sq+- ϣeCFIlx$CdѼg?Ƨ\0Ԕg&ef; /P/R_w. ߣJ7rJhY3tȓ"y,Wqx(>ZڸMXZ}Tq/"kTixSzTL=_=ZXàpaRg5sé0W`2"&} 9'2^4>-\+tTq76ǴtYf)E)l]p`9M̧{GS5yާ+!/9CA&`BXl(@ɛrdng ƮNO{s2ZY[KۈG /QE_0 Ah Y z?`z@Q(b>ZTr%o Rz%_DIE8^H*l*=oQ[+-7dr^SN+{QI20M3JpG=Q± ufsR =G_ƜelZRͅ7juim،WGnٴ+duƲTZB*5'!qT(q٧9K_j"QaL=,eBcC hz96,ڒ2DWVW+RE-P{>F_8.? B(0c<񣑬X#Z|aiٌ8bklZdqB^#e"o¶Hd;(Q^+%e:|Ɵ2|wH0@gIXyI/;N)8 6Ԏs!#kǐ.eMk'-0zSz>=bE½vxH^qIFGəϿC$MqtCOB0ɝX$+ Ivt!:/cIϽcZWwXZ{v˞|d>nhI&Ÿ{0@0,pb?{ Ǒ…;XnY~nR[H΋+_seҒ 2wr$('HwLQH)Ω lC>oŠK͂Lɢp_d/\&Dr+YOv6e~cTY3JY履zu\.ZaC$:(߉s5g fϼC# 8*?9>W)$5TbxΪ&dެf*l?cl2:;1I7Nᵨ,+?m^hgTSdK;T9,1?y>fKsK(D!?jTjIg:~媎7e-ڻqh3 6%xj/PyE& XsGI4: c(LqLHS/g  >s)g =/M2ӸwoD6r%/lX .|'u!9CFI|Pz,gY{oЂS(4e}އ+O49^/TiTtnX485rOmϿCpx(/Jt/yYMiRu(O3\ Rx .%!0c#(cQҷz, $DRG$E?Ur+v&ظV'}?'B v=jKI5G{Xlu!s)D>=3Z2pH&2XyَeLC7*zTs7Y&Au~=-YRFR*+HIC(~,CehC2::_;gÓ=yb¥x.Ib,+N5i)Vtn鼇5%O^TIJpQ iHC5$㖙 %%kOYv!f:*yljyb{ Nw7 W7ugYh 1N&kޏ0#sfj0E0 tz)C U5юse U;詶 u䳎E9[ki^Fr:=/Ԍ"Q*rL%!SbɣQ#_(4ӝ;I\rqwHWo&_TrNR]}U-LXŞ3T):M9uS |~N$=>_dP #l 4Ms}ܬ#jK.|] GNI.E=F9U>8iN(/QA!Mx Aqyr inD"`"e!۸}x˱wTќbMb0V4$ 0GNShUgX7-C@D6XbIz$gKS=B 5[x{m%eg W6H;h?E?kOQ!}=BS4{^g7F 4f =h #keޒh:V!Ȫ2G+8܉ |LË.yEӣe>#:3=eǐ0m,L~"9蟿|/_cD<Ywh'H0?t_϶9O=-k?ԧr5?jɭ/G:?e hHzP_쪝LDjl Hr*\=J"x}۞48 f *+J4MҴ8QP>ޛEu)QZW LG@M9c?Fj$.GBq } `ڽgCQU+`L"N-ȴ%f^@l2ӏ vjz1U(L1HO/r#"Z9`uL./,j>TQȜgDCH/jK7%pBJW5" r{{SHyu-l_Fl"`#k\e/wF&%CD苋~O%f~}^͒?#X"LY1/shɚ"=5鎔:o,C YY4qע&I^ľ1#`;#EGS2]aة(YcS;9rɒTfŢ;CJkƳgg*w{~RN/⦚v6: ~,l&Ṕ4Mz.iJ˂ ;Sx3-tt(A #6tlwjqE|1w)߹H*tirNQ/h۟zb);t :#Oz*MS_ $A3X]J?K+˜z?=9_ǥ}urYpXg |!_C Kp󢏨Lw %ML/i\OYTG<fG'XX,h4Rc͆=VVI5O&_ e1aʋ=Kڳ.gS3p-#DžX^I R2l6E]]&3,le~Vollct2{J 2Ɗ BG-\R%?9ka( Y=  AM?񜑢!7dV!1QyV)f 3Km,,80;J2LcA$?G7gxK ؙw. 3ZFȩ;m,YZfj[ʅan2H ޢRU)": 2[@=M?ԂB62% Q0% ocFx>u1GlUĒ HggVW&$wrD8:ZlXs&&Z 1#=$ňdIt*'Qj0^8%b2j=3D*:KRSlB_g*&m,̒ i!oEPgG(&u<5?Öytԛ'oZ(xpJ7Ce%n!K$COTs|Ltx|ސ74r}Ә>,T()z ù9XS2L't1pNː5qQt,bU"LXai Ŝp%A햑4[Ō޶Y mb_.leND&x#Wy _Ͷڙ+k\^hϿi;s&+n)n>=51d'?)'RȀ)P#Y0{HG$>E?Qj^9gٍPk%"לpN1R?:Mσ2xЇ)bܧ-jdrh͍I!;DNa*4J4d_v?}RyȞa7D=$!*~$Ov  5>2p3Tda!ן> L-9'ٖ1hp&~dئ۪Fed~"A )͙x(=x:>b(j~JydڅY\ J,;Pq!t#OҦW${,wY+rcga*YjJtG>該Ć33(4ުCA%9 KZU@'V:=ov2 lʂqi4u;ɾ\vz-ni}qJ/\3j]|bN4 . 61~ G'cRA:%:,`hOZ(O"^G^l-lB4F]N;.R#gӖ||}OZ}(N1oI<- 1[]JmPҋ%vśUCfbA<8cw*oD?B@ftC?>U}DOg]l$ IUm$vM.c ~ᡰdr aoo \f`\|gvQ:XN~C4mxX:Ds0^v7|/%Oû 2eccj,e{v[$#eijwʖ-CD#!G|./SB$p;e 'dӉ`{VjoQt\{mM + i"B9@NKίc vq(j`;BOC(#F"+G>39`$h 'g$uk~{#f'Z>X.Y !Zޖ*fsՆ\ 3zrth$\h!pTĬ"~ k Z r?yi1{N"'oIb3$ݨj{,#dꢝ V scch18/xct|S "ÏK,jJa kE"+-LRV_IptzРp0$kXgicd8{v#;Q}+[䵖T\Q>X&w\Jl&KעmTl,C,AL(x}g7x}>xlO@-+^a,5|Ǹ^ā1?=r*:VE4 EQ%ߕ˧7~=i՗OO}vycOrc (v>yA I}aXh(ς=af1@tJA| M!Fpq8ipscAKg#L ]~YxŸ"Z%P'O~gq9] Jq\׾1V Y M'pЋb ZLJx#≜o!]QӴ?\qI mQb<ęaCt,e9gjL6UTp8g_P!BzTP m1T8A!Z{'Wp`yVapFu̸;5&7ʧ X8H 2 [1WOˉX%ƹEgX'xR);dHxB(6 b3 DL ?*Gϟ$r6P{3g4fY!_8؂Ұ8Hُ墳:DeV Ъ+˲t7+wwNgeNy" vQ3|lJW /"zX)eS\~"T%( (v97FĜG c3GqgUg"P, O y??DBiDl]si޹CV>O8Q8e0QL<#xVDxn8H*ydϯ`K%3 r:zlT]>gpHQ?Y{C7Ӟ v`}֬ny\BQ/=aq=&٣{HSM깄 I֬i&#eE%yГD 2幂^ qtqO~a'vh8a2>[PjA@2^\y\iwtabl)""ed*ͦy>WN @qY=)r成ϳkc f Y0Ӡѓ,t$.Leؼ,Q=;{}4lQtg=*RVұ^NHFע8v.y(R_*+r_c޹=e[*M*֕Ζ <C3B.Z2FΖAToq ?/ep [=<3՞RT;G+P=HC$g2oHdH,ϗ2ǢqIA4 _z$5rÝ==jP$P{6-~dMG`6 k|O.0v2e uS3j9d0M+61/}GK20K53wqP^XȰ|MT84I#:HŘ? Tg sUves^o֨A^}y琸g<W-Z-=n*-8 [$OYSCߤgqv?!Pp䝈NQ>D"6!bIb(F0iYOD6zJĒBO^h6="iJvX6:wR8.RvvFu9/1e}Lz_hrgb.CK=yo>ab6QӉ?? &BS$I9etpa'EGwZP Z ҉HO(b4&T>ŊВ<+ll1Z\y'_&6ڳP f Tj+,[P3YxAq( e1aht-Q-$2:)M?Bu, I02s s._)aI&p~/91u`2 @ >Xӌdן{`ہ JמLP6&-V1鏵Ry.#WS^@gdłOfs#ÿ! \S(/&Mޤ+Yd17ֆqb!#KNj9P*Y=y/ NGG')~2|u R;j$=ZhyBXD\CF=;5*RA2G秢q^QWX8xb{lG>j"}cWࢪD1 HeD )"[c,Uh˰NfpDJе BsI@ɯ֫h~KA+G$3()KF.\%v&r;!mhzz(0ֺfA7^e"YL.~c{c$ )4rXsyj~I.ğ}fh`IA٤$ї%C?mw }Ƚ։1sr2zKRa1W~ݑ2ɜĆ]!crXj,n=w2%l#81iə)^ˆ(UYWY˜f>9tƸsk@޶mr,Z})Ku~ 9ɽ;3% YHz4We! @HJOVbmr-싉 U)#iXSfrA&ca)/ƾDaRu|HHz>:/~L $;!.gi^0qyp= ϭZs$~4ň3`OAkb?5_v`)yL{>:g{]Hx! (P/ز 9/\"C`gn);7yN~|XkrjmȴW"쮽\Wz 1L?I%%oҙ^AM9pOOx {k G М#UGnm;&CYM㠎@NJpdHD\Nn!_5M!9]sc c{cJeZR&'2Ar$<qw[г~1,J%>vB?ƿƕNpftJ־U&Zyvzߠd/TU8 | 4#Ek7e琲ʪ~q3Y*W'aX}3|ߩ5ΦPBv^#>EEZSaW6>1/x`0x{)j~#;37O,*۽mf/lS!>IV =XBowy2Ĥe1-7[dX.SV(rh#h?'Gtel܉Tj]"] K*>l!kS <>L_kw|v5ugfЀT%SqR;3!`AS72:26@p@2ђ,dW\ќzDJ"3\F;"'&UYPeW>'U@Ki/)ޏ>dbK+D#1'Csb__3޿a?V$_ȟ}~}x5eo_.O}s|Џ/^|@+q4|uO?*ݔ|g_~Gߔ/=S':C#'1$d1Oo>wc|kZ?̧GG`Wu~9!p<3c{g@ {޷?`z0za$zDgծJ0tn MYPw,nx Vʻ=$|,/wT?n|tmZNu/`cIatU?TQ>/DqIU-Xqj+:LeP"uX0fx>{9`(dLIlVݲ82Tڳn${Lʢ{:SFo)/.CdOEŰ[c!zHM^XW!OX1WM$_\3}Y';z'XjjIsA/F^p0SHõ@BE5 pAdX h\j_"-@99 BNZPպvǸCl17ޤD?26Y;inx8BDUyIنCAHF9,&5ǒ b)nni,b4R̭ =2]&ɤ/B 7鈿!jԖcp/,\870@L<1ate#89N֜oNG<3Qt,qHݫسd]Vp.jqF/@YP󍪘O^c sqFv:e` puI҄17"N%#~®!\qßl B/2;cwއ.!\@=\͜$;&^Bl~lIS\^UxMi8܃d|`_h-c;F$]r˘OVڙ+25~K%VϘ,(,ǧ IR&>2LW #PtbX|'^͊V%4_HcQ&@P3;DvoS.B3taUP׮EJW}Vvŵ NS*5v@k2λYWfTa/g7&|f]vR.DR" oƲz\wfse:l_{u Vd,\ًNmN۳Pw i96Щ|syZNM{ e!Iv\.ō{AEܼj-^vՀ]L\Z;xD]kx\& IJY\{&Q|!CԬ Q'Z)dpv1OQy5[*Ds|tڜ?~xp[Xؚ.>ЯJz+γlXIhh݊_vh%79^T5jUa(0nS_ ",c}pcS>b@üAš/ 1ȵD$jsh-<5;.h Vq i:QYGyT>9&h8s:;.CYD, iXBꏭ)ǥRNXìjh9Ԥ+"B;w߬ 9k]& 8"5->c21'Fl,Ԕ`(A(hmb~GXxZRy67JyBF_"&P' uG \zұ<#]oX-:\PT*J%MU=Bw@1l[;}Z45{xN~JXOW|uY[S}֛eCz/nOڠd,:ߦhtˊw^l OXed^%Annt 7ǚ֫B/V~c4Msiр0`6V{m޳aչW{q2!y F Ư|PX/ -T/;ȼzgϡ keC˱-q!#3^2v{Im{'}!tLLo.wr~-m'tD-'y;!G˳;ŰP;jksk(ŭ܈=ΚixuBy ~I(gޤT_S ?H;DN'fgO7+3PȡbC.Q n,vtˡ*5혉 u^?\ WR;yyq`4P A,e}7*M05#O3GY9J5 /KSC$6Fu ?.r52y}KZP&XDg2p-0p\sZ[Y f_f03c/7dߏ 4{ =iBiJ5{m| `LkpCBo[ 2ȶz_Ɯ>ދE$ 垚ʓ]5%}F+Iє,Aw?OQ|~)5BmX"> SgeWt.YA@7WE=~z 07.fe z7@9"KUY rd,pv:HG|sv?)Wx?kZ*]6TEqܟv(KXD|m{_X 6[++[*ܗ+K Rw0D]/#.,uӂɮ&LJf'r5ull_%F:Ԍ ,D+/ښCS-hd_PW#)w|-w{@3L-oJӜkbhF {S{A ً:/.nO??[h1@hUK٘Ъ+WeQL&JfO೭ִh!+jijT瓵񼘢7~^9q*Ql9_3VR5ۤ:-/`6ɇ1:mDZsl*k}J-# 1J^KuerC =)RDѱ-/$찓b#N_._H_7c\%ȷAZh3Д\Pq@寜NY`[ gc 8 et<K{0 + F'Iً LA]Hc8oO#G}YU.f_'2t9x&;y1+v&_gNVh3(ֆtM0 w.9X7CmdaGԥNu\xމ)?K9t/ч?.HMox=/τu֝ ^Vb~ɟZ5Z$<;L꣎1 YFDQ/Y$J}0U$1r$ 9P b y3 (l>X(F hq'0FQ2' a0i=AG0kw} YN"J"yd=w?RȡODV%ݙ_-EbQxOtJ5>!$MʢIe.rqTؐڡSdV"*YEhރ(  _%\-hxR9ވ"0 h.ņI?kRkljw>;72K2|1 O8) +_ğ;Oy'tFzMKo8Q *Uh9yK>œ3}H! 4(wY[:ֿ|Ϻ9|r,M";/  җ$ן:JaS4"BZvdJ\by|FTA(&9e}b.h.хdmY&O#Ovu >ƺR$BY e02a/=K,>w8s:*Ʀ?}^ L%†fl y5;օ+F/Λ^4={&+bc۔VeO{bх81F/?4aܧsjG6*gꍶtxf?*oCn'v ZOWp;14ΙBfܧsa?q}z@ Sj/2=7jKvoK\ml% ;GÛ* M%㳞 JjY~<~*d9"y<#Fxk,URomMn!H}Fm4ê8rʤ>;ГOKz"KQxWej|$|;98~8"WCg|GpV\^E 1#O͊dMz>n`unEFakQ%,RȒ@|x; !'aƈ4N*Gz_(ϱ'Yɖ6oflKF֒$“]+45X ̩3&d2!j)b]%#?UyXy N"8Qg+J: j%?yԽKH$_y 2c@.&"EW=6,1_RPt\3X+K GZsetGb\'Ay)Y] ~R>!_ɲ! {}B/c-h쬒 |Q>(p< NQ$/-ԴY,;CCHi":1 }$ET;eا{^n2;1s,#;{dy}0LI=scrDlYK6{Z>ڠ'D#X E8!܇١pK\dD[3SƦN%l!PZHTU3&>Ҋ8u>~8ZwK+#;qA0۟5#& H;t&ZGs:Uq4l%*eT>&3~9k| j)z$c[ &)[e$+1 1ؑVfګob})a9T5ypbwD{[qnyށ i 6FAk7/}@pu1Ѽϝ"30+$bwvpklh DY$mO=WWGHBWGILJHKMBWG|A(/9#D  $c - y  R 3cێ_4tt'7` I'ێ(h攢50J*t(e† 6P^5#lJVvyg+?3hBazÙg}diN=;2^븃tK)`cV9QeD8uz&=*\`jz8"m0FD_ HԀł&!v 2kȓ90fH0 NUM D#oNCB{Xt-ͥY*<!d7E)Yx[704l#V3 y5]Z>k֕UI.ZXs;V'Zq~_(gH|<5Z 1uI$˚<}m/g3Jc` YW鄽˝ @b *w KdmqJrU-,%`ۄ3p)1Qn|f_sc_Rs۱\f40BDtp.QiBbaQHFu=5Qq,x<ϋ~T8[5X|ځGXKSEh1jʠp( 0{ _v]:[W eH^f%4?~Fb3#ܯ0BzjD&+WeH y{Zϻu$=aH[ _T)X2G[a wIʄ|L 'UlMq~MSwzb-"دݎeKonxRI)P pN *:Wgsq31lTQ/tL;uzF>JJcQ` Cgo͍BίYx+ܔ7LEfř0:4MKO|K}o7__=~>{o? ]K?} -9~Wz,AcmGO0_|ʹ_}IsՃbr+cR7?鏜l}'4#pwSZ8BEapN?}(gCRx xSӊ x!#lVҫJ$ ^cV]ؓTk$!'epC >DtaK¼d~|tqa{;r^ʣPpSH 5 hƦ׷LS³P#Gs#DH]BJHI:j%'d-)@ ";7uG u+O\^Z529XE\0y hԏ=t9d $(B$vN`rgcvס~F G? #88p*L uDbP P2.+8 'O\yd$W!ZE\{ڪ}30 ٘5Ì Ne9`@".T _qlsGT$0:L$0T˴B)Tt ̹c6*+jcپ9Cyu?mh?OsOlF|u9,[H)6bQSS::Q Б7i gj ceIעAOϫg\/EQ&hFt)Nz M֖nmin!Ķ{ i 'eTqnǝya/oj<\1?~cn<J1Y/.KS dD;^{ /~gX6Êt)})Yy_sKx9'}^Ez,0g-%ƆIQ$Lf]F&D_Davt%WbdQc^˥bb~^caц汞rYo`k0!M0pOecu0$a]D\$(SX \^;j|X,XLdhl4'[% 'ϯ$Qya77wf O[#90Rui0lSWG2 kHfq䎴y GP,Cs=Sb`]uro՟ ӳ0 RD;?'6$.F5]UGV$R|JJ"Kxub9/;m'>QF^0B_ʄ'i,dQPyf.5),U%uq܈}Pǘʒ\b*kNqg$x"N5 N`2w(ZFԓ򥟾(~hX)䕵O%)Sů IPZb3ɚGv lp98)Ӑ0)kM/O8ƈ7$ BzEpYė~IbEV&FiLZә! B3527n nړ72pduKEG;Vt M3G쬹g;J!1hځ]h0EK0sHs^ m밓EEbP/ѕE9HˊS~R?'"YX -s 4_l*ڢT {Bl QYZ1D|%⻜ f|SlDi@9p8؉$~NEๆ%ͿRsRT3T]CiVtoloM^Ufjo>fdW iΰ癓 *H2aYnA#ϳ*VȹC,.gq6kbW$#5PVxɵ4`? =SdMY?پxWnדolgc/`} =1 5ო#SLtq)KsJ"hƻr]5Hԏx uB[r 5s i4]G~?PX3t0%9-EŅ.QoHN䔰aEp,>?>Dr"r )OOfb (Lg3+7h=׿Qܕ14pMxΒєsc؎ťG+;˚z3''Nw|O1: |,}ƌktiy!ݭr)ŠՂ /C18j#@a V1MWwo%io`K~h Cχ5͸+G,^rY;ֆ*asR)m,LMnBp ŞP|6 ‘ ]KW;{KDl/D~D@jg1;xzVEɄG6ŠV% 'Kc2ijt:{RSlŷ|!5L_G@,'_?/5NZP8̬Kn=%m7Vl)D|ba͞9;Gy9){Rzs&= l0'/#2Ɍ I0!_بhm~ݝo9_v"ʪM=#>B?sX ؖ[տGudW/yhՓwH]SYuXN, ? GuίK JrWlfJ#C9Y |u€Ka^SRVnʵɩ5 ?fL40aL };`rjxqH2뉿]cxGvdGVy^rpACzpc`) $hF-(ŽuUP^4]S,yce8w-Lfl4"z,[,%Q.\ҧrJ)/?Ǹ,H 't!n66՝K(\%ՙ2n]mXdD*%xx(?@:?{ 5'7|F4r ?; UB߫|Gjdcx5҆{AQOkQj,' 9cıV[Ve[.W_}(\C9{ "]qB}p3ǧDjM0 2u^6,dMѭIRD{МyZIIMeԔf_[m_ 9=3O03z=6kSֽt,}rW-`&Lt]N.(1v ( a9Q_?Po.eZ"-E3v(/cY",EK|%E !s,+P*.{Y1_eNu Z x%o=™_?`PBYdȮIB#MG: j?A9 {`B&Ovd; |M7޽TOBh,r@|IOSoCԐo3UMN/ 2݂ r -AUZA1r_YrkE]]LA{mvAVFFgI$;vx>`z8e\nK9?UxhnG1?O2YP9ƠDTݺi?G*Y8sN+* "Lԝ1"v.G*ZwI}ppI/g wpCi+ #+r҂c-"3[M$\XdgTn=$zaUn7+"Գ =4ݍ]Ȭ 1Krjh6ɘ,Tr~iiN.6Jy{I"g't{6Q1/ٴoQfV졐pHe0FA>L/їR=wR>͈q ~SI sMU9֫3Ice4ըX~X !̵D}96u`\\j9Wq(ždtED(Z2-,̚_j?R3\RSXd;iR܏P!ǒÔhaOL< ]E)iECFs9R,lx2+bzm_.z٤i6ZTtq->8f!ܠډ١=?PI<) OLqPS2DG^ FK5$= ˗8k{"l^<ǐTQ~hĆ;j!{n|n~=*tØKyԥ24DtxO.O}yn3JBzO%CdzsY3LT .mDv}zy{lhnH38N^J' ;:8 ڷ.wGVTJ%뙗 2!Mp>>) >IH#D-w,c;%pR\4Xxq^断_/R+k,cR% !3G}fQZ~vV\'^TY ,Y D03OCIG6g58]\KPŽ̆P%4vt[%0:PxaM$뉆 >dZ2:;qI,ΣeӨ%^GyKwR$K|'s@џDcOǨEGs^-Yڼs45+78ڤXZI1gfz)cٴvto*TIJ%0I}!zA͂il{gy?I;d8{"Uq :SCܱ@3~nATv`X$"o~>}ȳO4y<9@cd 1„pvh0Dlf۱N[2ˍI.4͞o_i<m#Ըߣ;Jb0QɚBdhZ+o9*zn\B+PeO\nE8/g0^ Z_l|=lmįF~A"JɣxQ>DpxpI\Wӏ{}VXt*f&_lpzͱSˆ|;rXOJ/_wk>(F*%Z i Z h}GV~|?p:dK Q9@6kX%MseX=7:L̜MQ`c`Yt_M,^^4ڔܪ$C c^f Ҫ_o et;{(MhkĢ-h$U|M2cFwrm,iIGif[<_=ǎV-Ar"+wpIaϘDl`@F,>kp-l!R*_ҪƮe S*QؓGS֟Af=ȝ x*30ThZ|Vв#BvZu&V^4;1?Yg:i)b (LKI#?hx, lFBM3oJIV尧tCf1a#O>Ч&e`+) qUɇڟza|QKboI>Y!Ԝ)|W©/)S\O󁼝QwG'`,/OET -Is}m/^EC,<5S(tQO >'&VIw免%6 o?qıؙAyC:;ox+XBn5}$%,ʋU~ycNO ]RT魼> 9W'"?t7bB],#ZH'5" *M, #o~`Wm8ʶN ,xa`?2\`St=hKA FāD7c.ʅ_fұak  b(aR'ƣP;k LnS=e=>./}Vo_9o$h}yN%qҷ̜X@LDdSo]@jahtT_CxMɏQQk«R>Yѐ&/%%FKNIǠ=@x Q t%9i>{vhy4_9AEDE*T8] Qԇ ]{vsirY eul MhU9\qDrG?ּA$o='Z[bМc}>g`%eFy\6qLe~,J1j.Ӑ4 PVfU ^'(A*wPq [rfZ?<6~Kg׻nl,cMLB2Tkhp?91?#ӏ{l2, 7 ~?c5=g+Ksuej!ɢй,p?pVhz˧/ % ;[Kc7Ƶ{q~e΁;R;: q~6(a}"(輋n$,KO({?Y`ޣ֞X ϼtOSE6}zQesD3`9r*vsM=9i?aN>ۢ!d!"Lm.g_]g(̞G!AgnQK5AG>{Ϳ?zp~ⷢ,(-G w`cyajxWd1jͿ?YdF!:p$ "Gh\y&Fߝ+ j4k? ^)AdSj|pjazM "ؤ{//~+}_W_o_>?O| vk?cCOjQcx}*.8X>tixćӰ+{? {çlGeϾ؉?cn~B;o<=w/1{ܼyDͅ\qghoa&5 ?(/*}i3_Y#e c2Pyc=D./8%$Yχ pe3dϠ<{:Eth=Wԟ(S%8Ȩ5Ivܕj=if&s|mVy]tsvhF,fx Y5טLZ%?><>|l%C)wPrmdE`KQNt?}'!3*8I8W,Do\fI7ϴ8x>`ۼX R+L2F'BuP AGEP Omj^:!W"b_0ei9.BƝ$/Db&q(B˼dɗSeII jUJ#f *\22/Z'w'_7&k1-j̔VgTqמgȹ1Gx4!kVY ezfa쟁il3\cϧsO~>;jO9;M" N?rL|eF(L -U7I`%Eo?NSZdC%: :|R)? 3H '3,z񋋒~/1;$6/6nia;bC$&w r1؇9˘-/bK_ʚ%_66Y1d h 娆0*_dB{d ۄє-[L.kR ҳ(YAAAǘAY D?JU{mt^Yl ?Ql"`wd,Y>8;/NKz",b9? 1&?8UhL@L}gUGMSDDžlRQYRͻizcRNJB,):&tSa9!yfus{K;#9.YCcphFlfHAJwcd%lނK /-s,SŠK/_4&+S/Z&¯o 3ϲɡ% 5ZIΆ0CElyJdsi QOt|%꣗ s)3zTVY Pȣ4ϧGi MbL]KA1SSaУyv񺃣d%K0\P:E|u`4\.L $m܉f{; -pkH#W]vzY,Cٿ8wt._6c,LddNyCOyJ?ot;~leH6./R_NAƞ IQ4%$_n1L#; )}k/TO%hfu񓑲ţJra#?NΏAuĦ h"X˔Y~|{M%ì[ؔ Q+^@HtAvx4V:Q'H%6ymCtbŦE+teHݛ5{*KNi_PhpM݇J:z ;W%5E.XgMj pjr6:z=1>MDš0p̱u)5'~P0>>X^gK 񽅑Hj[ꔃytD ..X":DŽ5uu/sWPb$S|{Ʃ#.m_y|O:=*U>C35g` VJyx-Ct yT$~N Zv~ަV%RpeT(8 O ?< }} 0)X O[lsJzC?ƄL2`ֲ6t 34xPhOV>aNj?;wv{o]}_u}_w_>N?}Xps1?8|4҇4T_>o˞/>|xvp;(BPFmut^$jf4f?:Ȥَi^'Ǝ['ojޤ?// !b2y<dSʱ4Jh*v}MN]Xsp,m$O; $6XȌ㶤欄>u'K sa#CwrHlՕ4))?O:3`.`.cF M6f_L8dJkj`tQ-8uN0Ə@OÃ=n_OT}p'6ϾAj'i&)b&tP&5켣!A#rhGM|u %]!t L~, ʨv8>$ 6YwL p=Dsbc;Z%Dܿp%,|nyt ~Nj,#+T6x.";x #5 c؜`  6AYyg06b/^bkn/4- e$܂JOb>oUE<9o\.H|ڰ07% ^xֺ!̭2 QŹkTGS̽AxtQR-| =ٱc.[M^]$.UEf;);T{H>H0T !aj0{qs!7.[H9IZx^py2=G)3S ~3Hwx?dٌgs$;ktZPzbBKEzX->%#EhP\'rU̹\(oclHTv,?7gB"cqa]O4WveFqN\gҼ+ #"k%ӚxTJ srW.2=#%Veu)-PgKqy)V `z\rE絏sɥy{Bɾ\$?f &O!!>>q v<; eG=ZФb6@Kqoz"zD!5iJ I\tK;6%x0/ᱫ{a&SAgSy7%yD|2,e{9qL>`ɸRs) O76O4B8tYf){gDb.1-⯾`(RX2$NI qv&r#\1B>eE*3Y򹴮 aBc#zJSwٮNwZݤeըun=-; 3/%t%dc dI/fdNZAvLub?/DoK?1H3c^fUNup#̆ˆ$I7_ԈcT SC5iw-iT+v־7!4OyAzk:ܘť FDMyxrT8oxm士'8/DnJŠ,lD)~U#KWTMrS]rgoCJ,zܞ5uy^ΝaÅW DZ4GJkl$">z0 OҨΘr`sYaϫ7\Qp4I$sԛ/ظQE9}tdN?_M~" *n rK4?~Q5ٿY4H35 lHƼA oYtךF%E|jO+Z;x\yr3ay8ٛxєTh!toa2lxi1朣,_NdBǍgR/YO\_yYK%hb7]ߓ"-pzlw`R엍ɝcI)Ő5-/f6R%[ư#4/c0 ^LcFgQ %^o=r_i?Tp;ԅziJl2fu4/<1-%'󆄰)͵eBD"?&D$.X,xUa'-.n|?{^8^>ڜN$F%)ċȟfx$ z>!c@@eFq^|)1bV /sSچHrG'˹Iya>`I27MTpix,OE/iU#SDnws~3PYpx+K%ov9R< Vg?@o^~Xןٞ9Kj9u~={LJL@gdCQ^¢ ت,) #%'a e^a!#t1VM,nΫxy|L/f8y>}JfY&<BY?v?!`(ќ{}1,$oGiDe%$]xlmj<+JIE]5 T}Z={^-kjgoˈT_>:/ix^DS7Ә⺉5P1,|/UcI_c>WjyC_MjU^@-K%8τ\x GjZ8Dҵ:$]ɤ;P+CjmjRvۂn8O_`^|@vn`.?ȯ4*ފ@jb]OG埿:lgr4A4K0K;ۮȪզ=@3SV8md^bAmď!G>q/XGkkf/9*AWPp#_,.MyFUl26"H1s mƝKSS*ΡUzw!)gϹ~?-ah`d`Y^d0 % ,Y"WQg÷ȞRUkn̒i1ɯmgfC7 [!߇fd|[=k+I!KhpZ)Uv #W]na"%UJ/+Ʌ=<0IYs _zëR~/h(m K6{䦍Rf[Ÿ`πE░M#h+/1{ &n8=y1 ,\7c2qxP:+ ג"'. 1>{=6E&Qb80*H{#ώbRdZr4MdA`4#=,; >Тq@ԦjצlQbma?eI󝪡E)Rզ֏wyH=|C)kKP0}?F*OXb%,_pyO0>R=G53H_bh\ ٤Yހ2*(w3E;WK.<{ςgqIuJzv-f# tُKMhKn ĭ \{>-q_^K_"2xZfcѲ~鬤pkn$ҜԼUJ_| @^ɉf_%|qѥw`H)ѵݒ99~]Q"I1%&k/*w^Y3G j{JTaP6 p5'|RS=u;Q3EQd; h013IYɜI*AS|O1quӇP.)(3䗧T5@JкznkĞwj$}/(jzDXhOxW \lC>߽)Nj%\h&aٞ&ǕE'*b]enYL%2˲_$M@ F#XڴW< vnvE`U<^=*bjlV$J}o- He7Rp!*I5xϤ{pOd1 [dH,JSKA_(Tx/vq.pGh0ksv01E7W/B_݆K-v7֚c.DCPShv*nGvKgauR=\;VxA[W͵fKRK=TBU廼Z`%9Ҳ4)D^ ~|"ыkY1]R[++߸5J pIvcq ߗ][>t??nsahs 'd*+)ql><;\g^G9*xzy颖@#~Pe#םjD  \<ꘖ ! vݧ7 \s17?qL;e!>H q>"h A!- M 0j/2 Xx,HѮ!%!MY9::%Эq[BP,# C?RNK>(F)@2ЀG9!c!%eP6B 3(>X 1!22ԶZ_f'}~Է~9"5O'YyXK;)wĥL -%}`ҡWh,{+&1?լ l ¥4"QOq^Hg}h ^9eBF?exԸitbMÔX(ߨx0#Q4m,C~] ]F4dJ1aV6oR$اnķQNc]TU,md$On 4ƴ8Q}B~V͢E ǿU4 -{.BX2s^C,Sɋا1cC$-`L>0;e}yP߁m0?㆟[>BɃ PzeyYfohATu*xx,/6pB(.ySBA13k R0Ȟ3 _ˤq.׈76?GYh.3ys64~6#hl-Q9#Zl ebhIpYu>,yvK#Jl2"g{L|_%m,=7Rc%npiN0Ri^ZG͒?_L@˔:[ \Z.#⼕ZzxDMAo Bmq'>pqW{Ip/I?Oe)ૈ˱@ʇW&<(r_ XasD/5[=H  lZK$CՈ x q>_^_t:`mBDL"B&>:&L\|wZKU.=g?=ѣ cBxPYc_ %6OJshcEv?M.d$4Ly=]lm3)֩kK{h'\KqTcĹ>7gmMM\I<5#5+{w~g2/yd% ]pϗ|EMI)-\S(/O'FW"5)f)B9"QCUI{v|u!gA6ҹ{ knRtVJ]M B$=іZl)Gs*[xM/G &\=/5lSR.Z L~8Xڗ+PxQ^0?fbU'5 /ڌ иM,Klz!SPIύ- ҅G# V'ѧ0>qGXjB8gOXLKcD5˰RIAG7RѤ)D{R%8/'#j,BC^pLz}X^=ܳD5IP~#KZ|9 +L{d>6=y+ wNό7maú&&`±*D=u2[X*YQY!ݸwZ3oYPqb\àyR; xE3c)YEU5?- h(A>{0xmÃ1[tYsϋB]cb^"B+X,%c/ٳ !{m11_kIW7!n;R)hEןnv:msJj9L׌q^TjIɓzjۻʚhnx h=3bwCxX@ nY{i9O3)D 4 >DNYfgsG)yFVnLaiP`C)9=yj}L l󘫠ΝCE攬 {2],\၆'/Bs\hۜ?x_Md;6 HHǦ M 8>:riS¶l9@YK'-4xvˍxxgYɧy^Pzt"T(Dc\@-? UKs%҇+Spw#0d#Hyɏ_j_y ۉΤaTlstv$[]9bUg,,iO rI>]mCbFI٨GLy`c7 ٙÌIek)Gj ~h5Uա#!kW ΚhLUj>1e$墐y>bIS9%a1Voǽ9wbHa'>yރP&#yJ]z5I1+{?y9#|r%FBeJVآ))tuM#fsp{.M] dYv{P$mZu8%nobFh">aO_׆d߽g4Dޒ%~guo@yC'pxp?O@z_ Y,zJO籖:9ʦ#/E ^G(T%Y |G.8#6Ű00=o zec0/bBIJWI#y$^FeOx ] 9:Z]^JIፏ}6^!щM9+#7^Tw= 4I+ƕzY5P9Žn5azf#wAxy"O>y p@@rEs M~/&4;ߺ&_jp_|׊ \Z#T`&eԱwy$>B ;!fgڿ4Z_gFcJ3{QZR_CZjҰ JZ&1C遻#x~jBlܗlܡRIK/οSM*ipa+ ƲEy*B$,(?w.JpI|}(OES,~MN]@ǒ0VU0SLO"q鬜_ K/*^:, ѿ`p7iT}.K&#tV[P 42B(7" $,\=ƫhlΏ) e+2/qr6^,!9Qo</ݿEfxJQIFϣ򗜥Z1 \ &7v{WeԒ/Ӝ/h' Ey?`a ߸ie!4y!9@(,~guP~|>8͟_~_ {#g}{pyׇ~$gY?hÀil\-`Gxp4W__G"_(^}~US]~g:Brܕ2aw?Е J\|YhQBZ0Q"&I( &w!pI8FN0\grMla 2lc# )3w!?>c*Ʉ$ \ܣp{ʩfmHgh)("CA9<%w󾈅\ LC8WlաT" [nÒQM:o9=ֻv^\\v`lxd/ 'L'U))|C>%01BHd84;DPbG=eN3]S|b#.h&w1߸F\%\RрZE \>gc{L/B38b<BlɧEO*~nNj9>蠐TRY]$bDOE?K,f/@\t?2Y(QPC"YN9PQ"l'jIj@ ?wERAũO*9MyN c >"h`N<,Y[?c=__d77s93O|WcSpKDB7.?o?;/P^Ʊy<Q`>LWx~=N}Rmas6u 鑠DHeww+jIH$P˲aj0%F* X!#V묺좭 A\`p:g2UQմNƀFNHAK IJGҦ D-)N ŝ1`DH*&JNVs,:h1(ؤ)<}GYS<՜/myD)+.` O>,c|$'m)> .7 Et2P j,v&يƗ9ny~xy_vT =d K/y;v2*:2^Fe42"{@h͞\ S0~veY#Y|ewSXXr},r7Ͻ/䡿99. ,,ԅx܎ZȲ.ia{ORedZ5/cu~m\0KO)d椦%.&^P/8ycƪ`#&^\W܉ DoZ9K0 峽ݼ%9LX겙wuzGeS ɧme8G7KBWMo MUI K1G_!'FE#mG{x@?0O5^1`J5JP qa5?^"Lx}Oq04C;LI?{9ۇxF[1K:*U 邠Paёv(0Ϥ1MEʲ/(= ̞Yђe߹<A'QXa^OygJ4`oEnOK<%r~4ltMb|M( Y43-n95) ط;ŢsR3!PT01@=fbnBosa2DL`yZB] 4s~x1!@}oşjqd@"\'ǼӰvm"OfeUG#^`1=dY )et#ӈX#X^q! TNQ Sl3+Iމ+cUy@d%E~cp%Sv?2GF+ovkmu gg|Hc)*65;:>&Rq|~/JLax0q9O@ɵz6V3',$wy@^2E#Km j<,h_ Y,$kϰKӘ-|;Wڐ_պAad.M3v-"0l?2b=q V ZkG6F;/~ͻ<*x$YZoq9wg2PġUxBJm fl>J4ƾPwIcxr΀h9 Yd߽;lϵw^a۳cbR57jl"݀Kg~0&e>?r^uZ0>6^G*GUsu"}NݒfdW#Z4u#EV}c7{Ax'/T]R~r2fOC+X~zCمP,S3 xһɂ޲ii\xR!(rN4Ux=_b 61J@wT(Qﮜa&W sO]GߏNeA56KzG{n2tu*Dsé>[L>lR,=QzhoBk(\DcwvPI{R ld?ٓeyQlYw{=gYWw_}_c?}uo>w?w>].j_vߜ3=] yg ؖGͷU_\_<ڏ?{O~˱`'t<]L&~m\ yץ ̈#p9DN@a7kߞMxr>ΎЩ3Hv]@}|C/J?H&C+3GGLceX r űjO$ډk+t聰|ҿ=2"4)Y8;+J3u]ހ='% 4Z(+OJL:QL9B$}.MCMH% 㼦@"j&E>V&P(O+.5c|T%Ifvn\auDox@R/š*b%wf@!<kкg/wD#lOCXGJJ!f#3 m?fr-&m[F/X0ՊY3^!lE1+9k⎾ć|6oK}~!RJSa3k|"`LsTz΂ ;e=xc!Z8زax48Q,j~U׺V6I!,LV^#_+= v%iYԢ%},u=Y.xɁ;=$欞͏lH=ʈ&KI$M)?#݁Yѣ[.~lG) [7*AlοdABAlgңT6,lYL9%x tf1Q"i 4/r COI@NQGLQ>bb*ZxܜhSd% tt$)M2 -yix >K18<$mDϩ`pv)]jtM\ =.ZN?^|V??Ob#1s6t <PpN"2Y-h:r.Fl|{xgՔk R1$;lz`O2|1DOOO'f.'oIpjnXkpPJIh?푌U&4V+>K$!=ֲltu 3&]X^ I|7Fb,>?O>E&F3фߠ"TnMл~ltZ}RBO+rIXs`\vdnMJ7`z _ј^rqhADQ`Q%k D(X&|ީJO.{(>w{\eR鴰'ZLjN21+DŽuʲz&[d?zV##ңċ :lrp48'k_}Jl/G(1T!|WMXVXQeT{ @\ty٦Vٝ: MW[EWGyj%"~nK!=xa@1Fل4KxF ~j,W2n.I~DQZ-+hY=sݟ=S/Uxysw&h-I_}w,:Y¦QN[o Z=xӝFN9' И`94c;r-|=NBvEԏ2 ^ޛ)Y*Fy۔y`\u߲w Rx/qF\G,R! @.l | =:=4?RRGdeއ:=^BgFIqv߆B9x$2Y}SjJN53ϊ?eaˮԙc1\5w+ f+{"/$"R舍R9e) ` Rg)m8W`o`pψ~`R3&)aٌtdkLlWW%^{ӏmQ*Uw#}2?nOAw ߏ+1q}j]MT7cb7eY#iw ?GPҟ,jE[Р{rWܥxnMN5oP툅~oJmT,Pe`< `k5ef =ι}]8+&bEj/,p H?gEW ܍XYHk~̈}b~m Ta`Q,.R$%$0>u|Iė&2+Ժ k>)DΖsroVRF N-8$t*aBAA:k^&HCƦ=e27o>^_Wd^]ǣqPS~$N]\O祒 ۂU| .V 9/`ŰHΎ c SVVL$qJ6xvN?r\> 2,/ß=d˪ā2#ծ,W.Oޘ7_ -@^7 zMTfz<a=K, 'EG2=ddrcy^M[Wm gLk4k㳖t1lO.idy]Q3}}vU r0eڭ{t“m&}g?’wn AZ۞600y0n`LNo˓jeuQ:o2k?:-Aqk'7yE,fG! wD2E=Q3U!.&!|v<: јUAAmM%|0*Jg~\X[ X"~zu!dV33,cʰaFdWcǓ]%wp?D7 Z&a;ww(\yU*׺5 Yov3ju"PȝJH_-Y!K}g4~/ze5%ҟ_^-7BȘ 9NCZmG{aiz-H;W8L6=ïUzia /NۚAIǕB9ѫ鵎z0!(8Xk6.Mܰe`V.K^ֲg t Ի5u[{E\pu'a,c'r5U-bCC k筻d$W)D4As/>pm(ami ^|BaT9snWpAO?!skh"J5 t؈ S8~3GYB~^ؤmq} '}.L7I?5Ĩ0hߧHΊ}a~UL55ҭG֧i$ow>ǒUy>Rxt4x?Yjr J7uzA.=]qG=ͅ_oأ O~V#^>C><3DWEb 8l}aRτd<)jDM{ QVjv}j\Wgj# :*9s()sl6^ES($$O#=\^D|&|1 Alr3 AƧ>x އ/CK)4WЫ?o>Q2(S9&b!6GZWp֟IXp 2ިf)!xdY_A(]p΋y򆨒_6lh։f݁OX?%h>z p~C~|@y~WW'HB@RhF@w74'PG73f[cSyY DGhlWKėk^f X~FJu ]<'s~&r:c)i^Jl^r7\mB)CQ- cA lG4*n:4dψbC E3  aSqEô;gWJero"F4b5DKS>ϵ//zM{wmG?k)$%dR[biқ▲+ٳ0 zR,lIesDB }J!7P6Ѩ81'BMaXùg$OSZl5frXt?Ո8'_]\c,F)}g/!XyOkC;ckDlJY7E I^ b{ e ;L'.>,*ya[bSR4EFg$UtGE٨D^ؗH=(S*ʛOS%L|ʤJX2Bq;B6ٳ !-/)P0Ry ZY9Ն햳019QxDof;_eO4g6BN?oXeМyO9jh2Qs$5dȥOO u~1d_Æ*m6=9]r)EU9 G%j[lYxD"?#Fܸ hOJJ29/^Sx#&~^t ӎ:Obc&#-Bމg /\.q B,lġ Y0}(3 , a: }Z*юEЧ0sIpyM_rSwf{AA[{oY]Tstbv"\i,/,2}@uM9h0hћzK~8lםa9]0̒.2KDsdцJ.vEڻU PEuX#Egh1^=R0#¶V3cSTszz ΢DrT0e?f51TTVcc[ Y*l~G(@e~xوoIҞk:w@ W-7;ʏ)IhN#K#onS?".z"!0JoPmg⣦`/E$VDɹhO_(U%7/W>JVQ.ÜN@YD4>2;c"iDvw>2'/K:ɢ1 xM"ԌpL82@w Z_T <"2zi]>!:4g?"R}^ 3~=M_E]Et>J$ioZŢU6ags)dwF&p:M<6t70Rs3È$Q Z rgtͲzNjcqgPPWQ#]ƀy$h@}Cmnd˚~m&w™e 9V.^z.`[)~6KH3ƺ :YzHDn ʸ>18K&iԍj"LT=ɿuq3KӗakeLKAH?F$]J2vF|dsm2׫yʋ1 nK RAdw}i fq9~Evp80F#f^d >H!1һ1LsS>haGfo <9d.U?JHnum܏i cö'gٯdsOtNmMEٟbrȡ-Z}d~e ]1-S?BzlE#Cs/JxMLAw{Y^oFaq#>bk  .b ;7f"\8@6kYKQO# a10Vwn3Pd轲t5PX]{t;*;fG ;pi/ 1O^ji.6I%_0r+e ϵW5܃5@#rP{WY-)o|" *!8+MC>oCy)uQ/B>7Z] 1(_m(@>n yɈU/, \d8GϯSzM"/ ]03Bto;w_>0 PD610Ǝ!:V POI1;8?KZP O*6g|_4w"\7dyV:3cc $d#W{P5nlRʮ~yK+7+İRRMLa;Y328!$BxXy?m`>K**|c]eD;q+^f"?Zޔ oRuڳT(> yͫBf): j'"Y̥1P15L1V m@QxGc*Z@'r |f= ^2JGOTbIP[|y%xt*ѯ548tkGίߕFb%YXKuZ1!`9&2 q  C]8ŘJNA(ȦlIN9/ : jn!Am[/gYy\ ZsnyLB-KbpXR\L:M^AOQXD@H.gCs+g,98ǚS QóJ/Nҙ}L#eSWZ♋,[#sznA X/IDFl{m)[Ȕ1i1&HUjt[C8+E/d{"{?t5@Pc7M:~/+!B38.@1M'S >|+ *db;ԧTѢK;,%fH KfZ.ϫ-ܣ, )CGU.ύs4`*ML*ם}HgV_Ǫ :-U&9Ưg jWgK4«y3"h FA fIX;>>J.+7^kMxEE%MZT*sO!~ټED}Jw.6&6,rARTe,ֳA ppMF- XI8D@u y>8"3"fGt#z"ftEx/ƫ),noer?ڮ*!B:v#I)G>dU&P3%cO!Y|{%_d-|go47FkZ.㲬h$`Aa>EÏY A=V*IG:yzG@5Irw ѴYܱR"ک8ߦjō3gª.,ųI ]Q_"g9)}|c瞗_??_>?p?m}_/_{+j??/ۿo>/o/>s+]txc"t3'-"#)$WX<%~P)Q9m)4 $>s,H>0*G Hu`M߁anDRicHX"9’W-ˉ4 gSmE1PdTZw.Gud37(b-A!HFѰf0t%cUV6E9EMxҭ 'yĂiσVaS, $b 0B 7t*Yejq PHq_#CՃa˗TL EF v8Ԁ 5P|} 񪟧ypIr!+& oϡu:@nYiT!Wg4qcO\ҮD{H`$>Y=`ڦDԱ[z t3'nM?a0 J+1y 'F2G$&WFLDZqxŎJR`5(6Up2$.V 4:E9";?`O XHyE%"(/) 3Lj2ՁO)_Uf _,ܫ$ 4\ʋBlge}Z76ӲxRfyؓ6"`ߧޡMf, ؘHh6/g?7B+Xmj,l-)ƸS?7 *1ՈOV.wJJ=\TA ,;G21}gق95R,Jn&ώ@yLe?K9T%4?4OV  /2N`i=Q{{QIr8Z T=+JOiqװቈe$A\%D?T*v{b* QfÝ\vY BmB(bY)`\<Ŕ j ƢD5>/zȰ=PIrb B,m\}qަeѝZJKeU0q6g,,>q6+>ii3tG:N?=Kkp͗XSJU)/L5=) iZ`uR#Rʗڹ˞|d C\qzg5;{dvg. M~섧U ̎Ӊ8!>l"LYR_06Q\rBe ;\, Ji"d>O, D03̑G/ytM| `>/ f>\ea:2~ZϗżX,*Y\0zG ͹;[hbΫ Kv¬o}%IxMRO7,5{>f:MG0^TXެJ]RƎ!72=\i$(&tHU@Dd$𑇱 Nf)eK!7ʞ&A6{ZYDm(Lx3% ߟ(\J)?o'nHw?ALLæ0IHB4{a\(|e(\+fNlܑhc.`1~2Q^cCz 5_o'MKK>4o._;ټ@GP}tSi9`cL<fA0$1~|JbE.dðZqTlrR#Ӊtsʐ\UMEs?_jџov_fOE\*¢5`_tBk$DajpqsF2KXHp(\yL q~ڡ=YaĂtQ*1Ѡ蒾N/eI;BtwdTSVlKܧ)(iVR==Y._8H6'ءW$Kƌ,ĝ61\^ZB5~eag&WKZ ӿj^`6IƞXZ|E;Coc qGLMß6T=5+)DVn ᎊNsuPaϝəUa1>&^JR^WL' ;d!'H?OR:jKS;!"H.\BHCV Ax4#|hHiO/A)X2B=rt)5XW5NbáZ):iCӜ^8~J6_M|xz~`d w';.7P!*8HʼnWx̂ ޞܣRY ۙAgsI&9 fYqUS:$ e`A|j:3GOښ*Eя?(ǒC%&#9u 1˲D6_^n*d sc>}%/|Y?v8(KX>/$:9Dx?=1~d|mT^ykx`,w~=W=}Ezelrz/VlFoK$/0\aV0C/ :넔։JT=tNIP̞E,I>dt(D;l?Q2Iʈq$Q*{N{Iq ]Z5;ŗm-VϓN>^ޯ/Kuk6Jo\^N|xe@z%B1`c[))^#p yT8eAGh^8 ` gfvdV:' t۵qIZv`.hQ/&ɇ+R8URϱ.٧f? vT>_h @5Vlz ђ&IDCgRΰyp =cK$5`.?xљĜ1'ߋe' "6sC?dt{!3̂=B'(`  ߂w@9Mv1Yu5A] bdrDzu4QyBT;޿,3F,8',|9\y? .4ޢL#s-8Md=֔e>%C6d~tpu 6l~Z Ow@^sNo( M1ԟ_{&}zW2=ZRϴYg  GdpJpJj M orBg5 MMg m{E.N%dYZ?>ڬ\4sOƿ>|o<_^{_^:]/_?p??~:]ۓОnb<3 W̉?:'ß~](Oǭ+Ϥ[˷?zoxi+p "UǮ4ټ(@nZ}-}2{GӠx#88N01eO%_]Z1c1t/8:ꋸ@d0O>/AF⢆@~%Dn_Zi]tHЀ"mF 1B?ӧrMzPlu)p݆f`0Gndga]3aD0[{+~M ͔ Ү A{׏9!{I)8s#|^:&@D&#j@% d R!BJ `JB%1CBJ$"ip M3Dr4 CJI2hFD $FD xCRh  t qO{ |OQt,T8y Tmi=)iРiRYzP2~ IwO>`cs8&6g |lXSIGӗ9xUpzm BL(5pXrmл/SYFcƙiTk*/Ly8@ItdfhGBzxL#pAGV2 Ӗ']cIN|ѣdEs7L1Jgq7r; 30-"K 4 ;|XM({$c\s^]-N$MY(r^*Z< CڙJ]v oP؎S S(XTĆq4d}ʁ`r%s/ϟzh@^pH Ia~L|4^,I䢌XZ-Eј*1x4G\; 5h 񞋟ymp Cjtx{ ?}֎m*,Metr)k@2CSFh5<{^&Swp?ނz;fly{p ,.Y'l7IxԒEeEN+H NA]SjJf(E64B*Q cl!"bYKAϟ\OKۑ˟̆ 9oB*$Yf KBzv?_#) $[{)L}LpɌ'\jubo ESrE:ŗ*#XGZNy>n .?.fN47LN3SD #psl~F{٣x^VM.Z*YuXb121F S!ikq&$ ſC:M(\MGLO}c.b l^욌ۺ /gq} W5XX-uT:jhUEmp1žvj c+Ϯ`Qc ԲphA|;ěA"b5Ք1Y?&z"w_eΰMc}{sWZ"c&-FScG>Z<=)fbtO$S3L_0|@ȓa!( K_A0KsY]bF2b"⹊ţ^NWr_Y 1<*aB@ēvt&>\C(q;d*0QyrEDX̩Vks|-.[uضܹFV50zOdGڂFU*lQ'Q.|#>bT yI#sslL;Qһ#HgϏ~RZrA}UwLN_>AVKyP&ygˌ (8iӔ@~,k}ȀS:jpɤn}]*;XBђ s3?A # (Hx%.Y |bsbv><$gW!i<'w55雳sJ۝}}l᯾Y~9*y!!<@@D:ҿ4wTCc!z x4XQtUQ9{;cԎtQKDT(JՏnJWm Я`v>hDr|1مFy6K:;JcOM/ؼУgTUJe"XQ4`\*I%SlpHCGy Aj)dʐ@TT瀘hLdR]lKL{W jG"Bw/&A*r66E1g+;DqScR^/A|k/cKz3iA5iZϷ.{WU?aM Tc1ݲ͐\pcr?D/Ӵ B "8ØPY#&4 I;ߘh(o~gb_f9^IO|%ԋ|~r<0V31yHӄLA1>П3& Ιlqh  M\Nk]XRxja0 ~4ޠAl_ x_uؐ{X,y Opu*gP_xL {J]{GY`IDy"?.fx+3!ÂU笊v ̯')sdFybA? {7Z'؁ ]o ڠX!J,^ H1$W_~>q!mDh[gFEpn7GXg%e\\b*r 3)Alq$I|qýѬEf_L >@}h.D!aOrm J2Nl4>s;rM'eRU?Xjp3rt$kNt6@=\?KY3GIah  (~? ' )4}/ 53 z- wM⩲;)\=v 喒0i"hftjLvOxA,5od{Ez'Ce^v6_ޑ\(|hzΧˊ&-R:Zs?{G o~???OoK/^7r}k]w}~K/.n\՟ɷ>}o?Ops~=?QP~;)Or1.}|?yqT]9goPe ~{W>Vx]ZU7Jqg=wTta -#쫌[[8rإSoB0qz"z8hzɞIsgkH=B}>Q0V1V̪kl.KPC݈G-;8 BBT.v#Xi93d ob_$Y,q YIn4o5 cY^'YK8?K/)NZ0}^'r^c]eb|QHi^Ŀ ]&*z =/)*pcɈO @yFA6KO[-[t =--)4z>%_%YSÃReT$u ?%sb$O"|#LC?\rYù԰!0ZmzhhdsaW_-9}z,P9#˞~7ڃ]gѾB(T82>m3{ye\5BUܕL;F)bj~@êPQKJ",6h!3D{@4ȱ`48fpycxRNLC`'܀zs317TIK 8sl#rs3A; 23D fɡ b:> 2Mh̞H%唟TjyAWH ?ȯ4kݳ=Y|p~ j~YV Ǎ"IS@yi,kp[c\W˹C.g +1̣_]g Y꒗E؁}ya Uf+c3unܲiHwD榁l)'1u')vLori`cԎaxy= !i#iSbхAO[ F598 _G4pM ?x٥A_4]z0W*eQZ\B[ѫG ';3kJ,i9Y]þsŪ@QV"B_.B ~#e(7gI?o +17jeQGNkKZ' ۻZ8Y5Ri R2,zyTƦy1&<*z8)3KPžJڼȌaKӞTKp*Vo'sI*r/`Gm?xyOއL,C۲$  8[!Rf#H5bA:A=/T| Ci<Ӂ$gr$KKW =_>o)y5xXCge82=Ta3&^ӓk8k#fjl2իU (ZX60PxV]F0 ]yMY9E9,wD_$xh7r.=3%Hǀ9~DA'(g9FκSMXˮ+wucE2{+ m $.Ar"6bSfr^,Pcc q )s⣡]L񍍧ݺ&`k]#uu&Zk%HٍSgŭ"ak3ٹ#U¼69dY6̀0cL-jm 5&6Ts~iz%SO* Z^v999lW(s~?d$nI(L'h e2E>u,ՈxO7k+m>g{x-8wʇы^Z+/V¢'Cf/_lTBZ26ؕqOXmh\!ZRG\sz[wY8t4a>>AgӷB%E|:$2ؿU+ 8!跴>ӈ!Gԡs/Hբ/ӖconEC0K?I؂1ܣ }H2[f)jv"vܢpEFIBTuZ0|`ɻKc߿k! Qgs #(X߯_`dB,>DvyM"/rNqd桒JZF@0]y IZIy)1C2ri=BL E \΅,;۴ywvpki!DY$IWWGHBWGILJHKMBWG}  > 2 h 4 O4*7?_?-[ou=O_[yVtNΧ BDϔ'8>}4fE>r__~8u!"Wn />XViߥ6}2@EfyYdUĸ4c`{9"34<MK#zSzUK_Yu"^+L9B(; Ks@, RR%@V ^brMҧIx -2ꉙ4dž3Uʩ`SCH#qO]>S18qAHl 7_cȼ=Hgd;8*n"HDq! ;i ? h:3g:kd:^G샄RY'yW$Yl+P*ފ2B@9usx /|e(d "$R hnZ aJ;Ѻ,D΁+nka#0L/V*v^ 0NN=Q1 |=E6vy2 Hsjc¦O~<Y6F`4KA!ͼX>åboE p(#`b0~AI1ttKGMɝx'-"n S55 !5qm1-m\Ddֶ50?wOQx=m-/$̸Ŵkju04=;޿Gz_~/_unzq@|^H좀@7CcBt^6ߊ|~UҼ\Gz ,\5۽ W)?Yjfw"^4sZ4}S` tk//qlY,aJD;||Կ@J>s23wXca2R)A3X%_\E)-z`cB4JV:5ǚ an a9/-zY ?;eD^2ȡ&)O?<1/+hs>s^|Uj BKIX.$X4c&/"e=6HW$~z$Oъ8ӥT6F_ﬞ益eZ"14і}(}^b15졣S!Q%LiH.{)ObM^,ɢyί\HlǡJyJ+1"p>ŞOn=u0s8ʷ<É 3yu9`d, ,B#nCٹUĜg45xD;_P-PRá(fxrh,ssϛ/d_ht^w6;e7YSҀK!# ?GKȄg) S䆴N?5yI KӉHwؔ{ڄ?gM/%Qo4>fogﱏh~9Zr{IKI4]. H\*N<-HЗSҚ{\&ؓ;:{񏥊g-){^U/?2)$>-9zS(>!h |{,L^jО1 IX9 ~钗@ɱlge-tq1Z*Cfpy->L5ҏO0>gr8-¾ ٰsH.2"sLywHQ΢$ Q#de7kLQqw`80*Aiγ;O4{^Xt?ňgq2P)+%֐KN$:`A4\`! KdzrPQB>lPM'cD(N"P!S8R)iQ٦!r' DC#^m R79 }Aq )ɷOP!~}OC$D>HΥCDSF"BΞ>)HQ?ix8ѽyq=i~kWM!T{#ҥe/H2呷_n?]/yb6u/]2#0NsuM֨plcݏcxKOSq w1Q"r [w<sCuΒ?ؒ D="Sb)&agfЏ9Ϗ` Sn|<.4wVaTMЧ=P'|Qݡo ZC|2 NTu- oHfʟK~:yr:?A%bC@I5B-%$z5waZWrz,]Ű*dUcJKY |_Q_19ծ%^_U|EgCL/ C;1aV`v`pf)Rcfl,%~r@=ƛd"ԧ=f7 ?O|ICD:shA*?2AocC`S}9 7k(S#hg))!^ƪRz;_|4e…6OAj|V24=pYRGQ9 $ >+e(QZ*HBńHؘQ' ao^DA1ճ..I?WUKT|Wtg^|eir^LK{bS/OY*4 1{BGmR)ed.O8OAX;"OF1oۇ$*O)4d緑o ZVf?jP@9*|EY GL"qHL#O'6/t?gϥ; S@@\=Z(g9҉Q+M/ިϮ_{Q MRy:)H'grcÓ ӔSnhf2I9$as։NN%1!wϑy\ͧY4*(˚h$YPsc̑G(gEW۟/Ah8S4eAތ8u}s}ir$4zQʯX0>93١?SH )dE_'&[Jǿe3yz\ӗ?}PN#ưZG:( ȟF$! С)aqgI ƨUc1okpآn% Kjø8"( )rR;艑CfOl"= 0:L0;/'K0UP+ʢ@SǤe(*P"J MȚxj&PQ@p9>ʙdKג7ZNb8@m).,caHOKqcZG3m:D>TB-,9,Axz?H Љ=XO6\CޑDg ͅ ~8 Ʒt~PG`o&h,7ȇY!4RXwcz,5)1NGh8dDKHIaJ O8\op?@"\ˡ}..Teq||~a[=uh<>r?;Gyf$鍖R;KVF8Yj$u%@KZڌ|AqFk>BRujئ)"{"P,,]. $ӡ(JZ7,"ӆGѧ{9w%iSz3>w$ʁrN X/KYyU#yH\®hA֦.7֋478EXY%osI66E,z2S7!,()+s咅υH(5u=q^'js̎;ߣ^Lfuf7Ǎ qWZ_,]/߱-JǸGbХY4i3=IKHIBϊ>Kmg1y[y(\*,,;$كf=zϻS_<~<؟rʸ72Cdq \4%5Jq <0(s%=50\GrϠ(`ЅIBhT%S]Bz ;ɹ<yY!Nlˇv쪥L/~y7wucv?DLC i@#ιJ> @wt14C JZO>0ݜD0*q6 HrNiIbPsX 4*+G˗F8rcڢ` 7{8{uIZ7g[t֣)}($~$.<,qN,<Ţ-&nM,ԯ/mw% 7eJإJ6m.#Z]ښ%D+%ŋ~хB8#)"3OP8X\d>꼳=M cGd$4U). Q֢HHtZ)%.2ǒibYpO^{pcל6W_T0-godw~f<;#us_W'C¥# Y=l X2a*Ü!K@PBÌ119T*%n 3qh)K,i@o}EA+Q Y -O?7|=?})߼e0-=yϏs9vANctTiac@a,da\TDRބ]+֓Wg?{Wiܴ #j)|IiљL;hI ihi>d, ̋D@ u1׸cB Ű AE+J 9b0XKa-bMF7ۚaȌ|zWGϳ>}s~>qo=urZ?6=EdAz)"{H$`Yfrn 0DJ,LHz+ eIGG (Ica/!) 'j©b%C[yҷqI`H"[9]c Se:M^G B8gc1 9L P6$4߁)Pߜ|_suϟ|OGzGϙΉ$)CE0!I6r2z&"y z6#0H"$eF$HM)cޥPt,B%;sÉ%UEgSIJG@ gܢXM/ MdC5H5Z(>矏G9GCwާkDmI{鐫ӡ4Q\%=B;MW3'&hDBwEfx5#X`)D6tSR0frb@QzmO]b<C7uTa4B\ YIe69lc&afc`H MQ뉂Ũ/LR31JhT;|SzRW$E!\|Ï7/B?T$\oYϰ-=j N&#s5=Oi7X~ά(a7>ЉNj_Q2d7ZmO(76'V(H>X05ĘbG0g=+cJJ#QlHn咣c*bs8 SF%\Ωcmؔ͊d{$`1|3s Y B0s!Nܔ)IMrg `p.#Gz͢ JJe))<R9 ӳQNP,n6imS&%Z-s).BQcQM6FҸluOR\|hrN1Wҙ"U%Yil)9KUpEiϢNKąup^z("|se}FKu,(_&8}XJ@Q%pThVmU9#]o~O: eOM˿?>΃ׂ駼i\X2@+BpXf,GD"C02Lϱ2ù ˔IM'i@P!r1dx'Jtp 0oLIҬ(d9 `k^4U~xYvIJl{,[ &74H|No+n[ Q@M)BiA]ácGXO݉mFaUKŶ"gGa,ҤhњY2ذQn!Di* BKyQ$U2K4j1YחwlR$R:ˣY\(ܣ^z^54>oeV@d^ZJY~r7j2^2lgbg-ޡ҂ohCEQGY'X%fShzwLOr9ڔ+嵣+\=t>7O>zPtt>ѫҿ״ǃbr>J.!WB63J%6x YK@w!;dBDKO!+Ӄ" ZTf<7ĉSVl>1jm0sڑ&F$wjEsT#ǣ* XrY&a vBI- ɈPa0q3#S(D#9CnaG'6UaΤ s|! R%MDfŧXљuT< @:JجcuRO(2% bw M3_7i^ٜI*N 87ז̸~.Yp%9RJˉ;jZ,]sRV98mm.eބ-4?o?߿o}[r|=]?t9utkr29j 1A{2!ώי4o YpU[0=U}b mBiJQM!q˚O%XsFB&&qω]ygkJ@/M3uaɣlCQ(b72QP#~&D eH \s +'R]R&㐒ܕ=-2o^|>|ɪNkqΧ8`z\/I3 4+SS1RgrV1МT &2e%jpƒ1O6X?!K2J <>E1߰ql`Cءb`cB4zJ'rśR6ؚ0ay< l[PF468sA rSpEAɀeP /%XF]v!J)~YZBy)'":T;TT,oxda9X|a@ƨw +Muʣ0nhwM$79{]uejTݘ;eljMMT 7iOa:aۖ$6$:LS2WJRF}IŐAO" #2 FIJ6Թ3pa3IKeP?<'09 `s:A]@3R*hC0G]2[7&٧z,,^0F/(RW$4.jFTFoXˎ.owSjhrWOs53cֆaIRWg[Rj<%ISl8Jdn%xcr_~Ni=ǝSiH?!i}z1?)KeGi"mxi6_߻_wɏ\~w~d__ǎ^t~#c~N>_y9h1C*[_>fsj 2T-g cTWF$ `1ha1@di"5% G4KXN$8)PANIT ;`bS* _72c^{\=R7"?Se-C%y}8DXK$ФAi].d]^x*ɫ򘸚 , '@S)b3N)ctI 4`#'z$G8Xb0qMg ?<L?{,0 9 Mž:nqP`g?؜G|^s?xQtX V)$gJgΥJJ/.MRת0v7w7>ws_˭羪?Ƶy#=~b:fAyuxl1:O$L2gC!Av'Ah™ SEA8,h YdNs)J91 @CaE 67Pm g%Rʊ"q!B 1 eRRhTԳI)H6E=Z\@)i 1kɈcl@C pa -HĜK+[\6Vp“+séDm!رض{jQdžG%sB9i#b߱GIF,L̙9Sԩ r6'}zkP ;GUN:EC&sTOQ}oı:{7{-9h f$'ιĿ>}[???<??p>?g?mqu}zև?R/uJADX|"Zp7Ƈgpz 3,BE Z1B_{ 7*1cf({ !!ƙD#D 5bV2`pdJEh[a$XOXO{hFpOSDGLiiD'**& KC$٣Kh(' "s2aV agzIC5BzQ ^h5~18R ɇI:dh  =x(y?ךqtQ&jCY01:-9E4 y+cX8v ;-@b>CHHCh:9l n q~ox>X<6ː"܆,ٮ&a ΀XU8N=,/p/wy~\lף y3 6 Mt%@ybnh JVLMg) ?%Õ.4;rZ  ZslJoM|c ,we#1N}fPf۬qKZV<v9p)@q(sga``;435<%DRC ~|N|Hv$,QRF. /%.*]8H t碑 묢` ʰj%gXͼ% Z&JX8m=fSE]taqBPȞ//}iax|?Ims3 7-α4G'~d2[PJ hL  `ar,99#=L@f,;Y;xU^SvNFϧ< k%fD laΓ2H Q8#:YID ޳2s3(GϮ3:Csf"VĴ6;:鳢"+1]vsyRG [2՛ƔQi(z8^A13a.cf]pe.9 ViC*TLvNf|P(/ R@{025O|~&͒jxtקTrN!eMdyŠ"ŗJA#W9~ Civf35}S $?;RPBऻu?B7h /;!5KF>zI=_ï?kG7:͂m.8|V/[ $%MZwB׹eW a 1 smqs(>8FiF, Q;d>KS~ %4LoT)/q;A~Ju4t|BcgXn!x#z%R`&]yAOme~6{rK_>^˔RC)zP͕e& / =GI>Fr>e&Z׍3>;shpDJu &BFƎN p6哝mllj2$PE;t`;?j@J?1dEU4qWF<ڶ tc M^*|Oϫ\Pi>KP{bP'f'T\4fCXՔ]R,wͦ*窦 TY$/:-[cSMTgɧ]U".O?;X 03O3yZ.;eY+wJ 0:m=~VܸH(e"2[+»qIHk1(w^5R8.pidl"$ez,E]iw^@4š3Lɫb$onsݛ\6֚w銁fWDܚ;mjV, Gp1=, ESX$Т-Qi±/V)z~U뒌.Ҿ!9CFqlzwmgeܡ;AH\9m w\;֑9M?&{ uTeA^&n%G)G _\`Ob+9/ٽgX؛ *U Xt\B:% _"1mgZi.;솦E;=\,h,LqcJэ.@-O8M@2עIlX!MgIK/Kapj|٨$c ҉y+{ %HߢdN?|Fmh7&8H>G0), #\ :Fs"ͫ8MmJ{'oz]>׺|!VT#^G]6--F6}b3Ipnu'BIӋ^fw/`ϢW6XR:L^I)$غZY֤+ γ,j&mP;'L" NE>8iOm 'Qნr& ]Um,H+ [-e*}r_/xg:Xub?3{gMG?n"@܊ ff9YBOůUl+FR;XZ-FbH/POUWU̳%Lm -iOpDpڦ/w)ZJ'M $8}|P~!% \S.!K!5W{^ŕгS݊&lnLhwoX7$ͫEՒ7lueUd] vqXO˥%~ xE6T o(Mymu.Gr֨Sv##x[p@#h|H5[YǦƴ𝺬O9v] ǖ-N3B 0#O^+CjRZ/[d:yC# )q'\ssol:1EHdVǭ@ m|h+wֺ&Wλ)X `]zD%P*ȶ 6FYREv6 Y MWxwJlkՉ^1O̊ !XʝBʟX~b*pP.nx}_W{N?|!mBov),:zs__*u#ۯ~{*1x|c(NRE[aƊ}ͷ/Gj'σ~̠ghUxY>J k;Eh9s{̌w(R/;T\`@O6)(ueULõ60ŵeL7l'Ok{'+ a^ O)EI|J&yԗn%eSS_h;\%}GN`[UWϐn.r/rI.I*g!X[vtpGKD~Q 9w8$Yo9AQc/rʎnL#rLŷo~@FZM^ۼ|+՗ŻdX#>]¯cMN%@l$B(ql2 HE@:$vNQ)sRJ gRb1}yXҔ_yMǥAtL|Uhʑ<̪i?~aV0AgXn_*՗vsԋLZc7fF#Pj F ^I\[~Gϟ??oo}?g~}^|nu{6٥OCY>'G;e*JzÚ]f㥠O*V_vNw9v{U?ȑT]szH)nmt:@)аk9xjSXV -(ŕ莁WTb,Dƍah(@Y*?k~] ͲJGsC_4:F樖B04<qMfTHp, H>V$!J(x +JiIa$=DΞbRQQ 1GbR%slBA-L%OF2Ker>=;3EU%<ᅶ&䧨H SHza,ʸf/!9kx/$9\D{r QK%Y 64X$$gEtޔ ~xh)@ 4 CErb")^gHg#FD^9~,`): "q>$d24+y式ΗlXU?$&@|wf}?v{|xWFXM# GAF MfI6.,ܳ5iʜvӿ/s?|^?uX{z)E@D0qυ2d ٪>7' YњeT7rfjDxF4UlYi\-A#"ҪdUcT!4}dNe !? 3Nǚo=ex?jgq|~+QгƥH.E tR,=JauD (!O(a)҅APJ'WDƘ#TļRߑ?~?l]5>;Kd{Y䳧%nI  ]H.EP+zcYeԛj#^eOm(PcMJ4 %=_[{~իQ;OU1KbN#H- &I'2D/ At9v4nrQ '}΃1~Ḹ''`vOsBS_R ?JP@M"mZvbIrtH;5M+̯c۔[ Nj010PH4694L!^MpbL, }S&-3`#NmJV}^n[{UܾvTi٫mPVe8U 6Uޔ5FG4\As޸NDK1hf4sVd:͠vzsV JٯeWNY RqLUu#͒&ɍ"X̍eQ'O:y1Xay:^.e_KD41 aZi * v^E;@tW>HGF>:җUl$kE\Ѻ < Gmq$NڲoJ_CW=~am҃X0w' ,uN-swA)],N {O=,ˢU 4Q/E+&tlf_gES z-Ԇ'Cx|<+')O97dGo KlʠUL@2G iC4K-L-ZsKf9i{dqϥnl <?%M22ւ|Axhg6o} s2>1nPhGl>=Qh% 3HU 9Q;n azTޙwee0kO,cڭu/[6ߵy,xs`.b>H ԝ!Ǻ[@7뫊S;@ծXEj:^kd G}cV[<5_`@+.au2^UB zLw0bO%L?Kzd.cdJP||ǘm458 B#4"F Xekf&J@c&ӭ  *g(Vs$PAlZMIw ?ϪXHG:Z-jKL;^2G.&|"mG^n5*4vxZnT5.Ak9> ’]z߹I/w! UBaC)C@ycL~=` iC bhopp^ul#+` \S$A'˗BCPhǓQ;'lUxL_g3ϛ<0؅d@IHIR9},ЗrX0YS 箌'a+."Q!k_: &r\iPd>ɦNCϨ2 ʟn} x8E񋦐?uGIK4Y^ZEÝ1 ~͜?@? B]s^"m/B)|P22-\[}z(̉jd/.."7ҵϮa嚐p/Ab3 ,4!ɩQB;/qx)L|'=8rjKfK==H2iv7-rhcF6sy^sjiLvwZ2A)tɦ "j8"gPQj`Y7xвuQLSF5)j y/Ғ 3XT/.:#F^EpQ6_3`QD㆓{C/ GNzD"9f9 *23:ilj_o/ww?M,?U$P휁^t"7X_PR1/.!x]Ͼz?}r? %. QI` :wd/B'!N]g I)АpaaRAj:4` p+ttb,O\Nm Q]`'p20.oGc iWקBtQlJ͑pqހ! r;U9GI,A%D۱7ˊ_YYwJq/}٬`xVQy,n 5yG$1٧%Tf$gbGc?M'G$ QG @D$Xd 2Sl zi;%RfIHD).I;z*Գy&hs˪H#> >q 69 =E('|ÍG}e/~;("h2TJݣţj,B8wrA) B`TWG$JwD^$6Y*nԗc'obH,Epo.U+Y]6 ~ 跘Ȳ6tv5cZi|Dj^{fire(o 23y*<=sjaZKxg+7_7nNվsqsQ̽L,GӔ,J2= S[*Z&.)VcK̿Ii~Gl9u8)$acu9db9 ?ZY(EQŧv~\Hg=D .4'!~8rH3w\&L6gB4^,!/,{Rb&px D뮇,dY+I=>d\) .9[xvLy P\Щ-E='m,wl+GG3wLg_lujTKk};ԗ5*4Lp$Ti4J'ds(\R.ҥ%sv.0V cD#ofuw=ʋ6 6jJ O )CXklV"AQYx}⦚ PGLz/D+**l95\,aC_>uu8gaKyh,T}V˱gjCI?|uȻ%A UZڪnܚI?X\5Z@g?Nϧ\?҅빿[:v]o^$MX P;h : 6fi// x-( } ESY4-tta9_w#!@Q%k=G'p>(GƵL5mP\2cMyRL&q,4Cf5{PY&&r;=.{>7ĈɇN<'?Ag".m-o)!ςEC/4=bDL$oZ0-pAә5_ډJis鋣f`#^(eQS^JT%W|nH>B:Ԓ)is4AE^G/*_ۊ@.j""i}9>>SjOy;KR.>smlbE,NH4#K[ww.b+f$RtA?X;(SLKȒ6WYoUi}l'?hNVXxc,Q˟z DII`J5^p.<.9L"ςJc4?K/sL-{Vv*qbDtOk9?c@ɜ1=df; A,J.0d>u{8`+ ,%ksŰ*7^4BhTWg9_%î'㩞&b`A!h@-dM@:JQ DH~qĪ?ٹX0imDX/"_mY[sr olbYcybG`||R ,HvG%lj^=Xlûyk= |^|KxaV̟'M}Bi;P>ˠB o&8){M}5)f|Tcm"q ~^6#1YHl?w(!~l炍 mbncsʍ=2䲻6D|^թIŜc2}yZPchѱL[qFh'ݟ 3NBȧIwvpk8gDY$?WWGHBWGILJHKMBWG{}F:>,'%[laX ; , 3 c3җ&o賋MjRҡs1PiJO0Kx{/kC0,;  9fu`hp#G ﹄X%ydX^:L_ %zđpe8tlL9?gcE@T邙VrK/kBT`FO5MO0$-zܬ( ?mU%F h/= #sRsvD-a3R bxHg7P8=&ͺOt$vr:BZ8xRb)85 EZgN8ًP<2O'Es>U Z~m鶶]0_I"lZ*f@>Z-?{ʺ[qXU%O&~1اp"B/X,hiHH-;x ZY,Ci2{`ǡ1y_I=-G`$޸W'޻㏯ߗ_?Eg_/~|gr8s|_|o}-|.K7Z6W֛#ӷ`?~xr(Nj?oAߪ/|?Zw+kG\6ki]0gھ/Rw3\]Xi/.?$ ٔpDQGP O҂jt svdfjÃ-=QLh@{s  #JA5@d f1GSS{_g.-z @_2֝UPq}mU|`dM\&߿peѺU@8Ơ\U?eR"O3 ]!++JT0H1yܥAɥVoKDcP$ՈAIЉ. 3eWjc20*|8S2Ђ]A@% 6lZC@@"1\Gb05 D80K`]ȝēJ$yN#98Xgi6HV[I)C2S014s #(T't nlBk?$A{ u B%[iVbX5V]*M{ a7L,`N<**>(65lL5V#DpwAlc+ OJ*0tXVcp<@b!SxM=4nXlg|yڏh!.$:sPW],/fG0m:~xLlh{gG!vauI+bG]AoLq26[ֹ;aч~4)v㰅z-2 K`d.k<߀l]IHJ`vaZLѡ{G+qxֲ޾Zik:K}r^kVRkE&4AN/*r_4hgkM_5ձ~p鵺ls1DsϟI2$ doEi,k;T5NP {3YP {t%R"۾$,ҧ!y$FJˣxDY%_KF9V'X%IP7*G6/8S>c( xHǠns2Iغ9_q'ss6 >.bX=JI?he[8*;Lvt߉˚ʥD0+2ļIm;=MbSĂ .qap(>s QC1Kx`E._D7l9ވoT:ZO&x^0x~d_gZlҘ~닸jޥyTh5 ]f`uOpyhNS+~ ƺKH]/ytѠG$'Mg߳CSV7@KGe~zA` "=K'Ġ1p_!xˬ!dgy5`3x][Yw5գ#{ .CMZ,Mb0:|Q!G97D`an׵z/ԁ=V;^*Z49DJ@58o'3L Ȥ3D:ղhgj`4H/G\F8Kh ]ߗ]8͉o yepi#ƬaY(WAh TYCS$YU;Z_/U[14DD_KyIBL^e)~22Y#y N2R? /P|gOLTaA|{\|QDU~hOoxbr5e>| kLo=93ko)USQ hVZojSXhx+Z1s<p0 bQG-cǓSjfsJ#w5)OU/_Ǘf]K;FaM9ϐ@a1: ˁb"n^ds.>R e >g\Yh& W˩K%61ՆѿA:5:ex3&!;0̦xV"~,#gKwJH' $<Oi)liV*YpJ%``:b iKx:&sB~_(W[Yߝc8wbqdR:Bj*+R-M.C?ʙ&'O'St9=f1A"/WVw<[@,Zo/@E1kHs Uվz,_ p{)MCz7.3NNi$Z!b|^1k%{j$Tg<^pBWy-g0*IM#G/|G_p:9C&.1QxաGlP#WE'BF6  23L)/,K|Գ)9`/S֎X?"k1d~xm"D .TKDD Fs MS/k3$vבO'4ڄy{:o}w԰g(!]4^mYިzIY+ E*\̍6gPܞ- lO2T.J U LݯN&#M Xf6lΌ LGjJn,+|kL%Cwc-NE5Z1c w3fxR /|[;-sz'W%&#ϱ 7G~Q,FLk#o)wرsF ǂW7D`o 3TS]|ૈz9w7% |wDU :3r c(]"5݊<<89 &#U8 yhCU7/yn #́,y=#S *_'D9N2"6?D6np8<&=)'半nDžPSBKi?-4/g"%CaCu$ s?. 5|PA,ׂ*YLoQy)513\((:j5-? WT 09d~& uKZc~n۳h!d?KtQ1n%L,SXf(a zFэyC}DK{G]Le(Xf+1%hW % 0@4K-\;ɜc"GBe*ߑ-2uNUAy]־$;.J#Pɒn9.7@b4N_ ra2 f_/-M|{bW*k;\>?9-~GU_ߓ~a.(~/߯ߗ"~/_gn_~o߾u {? m<}n?/ew`ܙ?Ňntv_Otke/|xq*>77msh?T\>Օl~7s>ZZTig' σܤ\_MyvI_FY"wlvl~_)?EQ8,/?n. [ 'Q^P:"䭣G?{IyUٻ" wprʈr-BNm;Ƽ_es^oZ~yGyng){).+kp=jDp adɣ)zŊwrZfhc7S/jCZYLq8ʟi<]Eb;)!zl#ޤ2nZjv@u7-w:_!S0ΰ{޺K:{J6G-Z̽[pIjAIJM^_0)bU_th Y7I\}^M8\ eKYV̼ p=c^ P%f 2&3"* &2 {27|0ϣ<*4o /PV;_u`<>w|$/^)BI#2ܑnT.Ppe_ 56ho1FM]4n}R*W$c0h~TfyzLsƬ"e &@ e̯wYrMt+="Ef`s}hi^wfE[5{'`?q'!tiyŃhA'~,_G{{&55nw~C+f€E72jk,4TA1}ޖ+ >tIAңhF^ !Ձ?O Ua'(1 ̇ķ3'~}oKkgz/F>B-z\!itQZP}p{CR 'Hb;nTVlhrކ 8݁G =R$^ 9`&4걭C]3m߅q׶3D s tRql!th*K8>؇7[ o p ^\b}_EDsWBk+R..Z3h[pvcH+yݻ|k>g.l̝  h;<|OʹMܚ9]ev/"-0ߣd$d=40N3vax3}A jRߩcЏ `6>u*^iBhc6*{}& !{00s\HPSJ ڮTQY|_\͗U0}a7 =Sm<  ×U@ ʨM9 07 v@m,gM#h\>*+ݧQĈ6{J2xsٿ{%uQܛ8).uT 3Yi^qx3w A 8ku!?B۾mnlVtol~-qH =7T3q5k:GC鎟߆7#im"lh#Cp6>FcI#!.O5ӕrhG*hHA"E{weW4!CyLQ>e Ꙑ}p;QTᡃo=n Ϡ0pC'IrNk`91 bZ/VZF1CGRIq{(ר!fp`ݐVŚvW#w+v! 3.h'QF23Vℂg%,:W0hS/^SU2ޫ8$ G/!!Һ >dע酻]k_[w-(ʊ=lA kԐ\@)yHXCЯAӘqe'Atך,mx CY>`F04$~w5asUM|1M#x5@x'Fx@``,"h!P#z[([l|7iw)AO2wy}` <ƣ&2$:<2˞e91K1@ϯ~=WB2Sܽ~ׂj96 UfR/ߦ7'aޚRGE?+ʎy `| ]C@ZxQl @r0BYkW^"}]WBrV;`¢}Ɵ"X=B(3yPԒ>Ў(||p^ $ fd;qeLP^_[omMnN-3KéZg(4yv1Gtl![3g7e3s<կ@1aB[ \iP!M{>5~Z&(9㄰:M]/ӣ_ u~Nw+áj8HkAL6 -gMLH(!}F! FWqDcHN3eNtooT,(A+ۋhV^KW[@Q:0Dvy?`7eE+% c,G"VڃM b3oťX̭5d(m_;?Ccqcf `ۿ4' ݲ0ֈdri[4߻%@{W \A93Ҙ,L]_y߿ogݼ#7oTG$a=o;j$gAU .5}&"[Ox *)p̸mHdWhLZ+Q\>E5 Ro\BF³C0#g {wHO3TO|-T^8G=*eާ'>EsD,ց Pg9Sb )#`ϖ΁ G'{M7˜ߛf;{A.*a?# Bd]zpSXFC1x$^8/y&K}fX,Z#'x'ݛ'!W{͕aJj`@Η>.5Ee'0![p&/ Xm $3Rx],Dff&y MVKZzekG5 rsT%!lV/f/m^z0.|4_|o5 We_,aFӇz,g,pS*|M$^cZIyYWδ,^"y>]%Ð:N#j^ 9sx?c6.H &Vk|!=6&${a[Yw1k(!< $kpBnmGŻ*5D JzOݟG8ˣd|-%+}彜ewA "`{.^H78E'ׄJ3Z;HjOy%#\MSHg",~7tk\#8~c@,aJH?Ѕ"?-]52ux}(pM {ܞ "ݒ໽fG~POϾ izfh̷$N UTYs߾H.iJ[Uh6:^gyjйgXnx(|&SKKpH'O;5֬Ei_W߮@.%BՓPg51虨r+{%:u8p1)@{WMvD2;?6\ߗؾ߆/=䣿?z"gR#Ь9 HQZŁ[_c$ޏkxjZ_]_@Y=,"E {KZ24OíQL" 3ATyw{couv0=D'\9oC okBDtBbЫ>hL# KN`}q]`ETja}3J/c)rpst2ٔ`sSV]K680WPEbHxx+5LߊV~z f9#hhXn>?>գ/ 2GJ_}QwMǿbl7Е43ڌNw$&W1gnT1b&\ ۙ 1t]m,)Tdog$DuXA4À]f,)ɖU['`MJ d {<́CO>[[q[.d ά>*T**Ld?$GFc?Eɮ,}ǿ;Sg MAobrFcQ];z䐝s zE&?n%xh|~eP=TSToP v(krGi *A/+WTдiMBMH(~:x+<Ѣwi-7.[Hϐz- Qx<X*Uanif] TJ}Bpq+:/@"ρ,= zW,ch l:@?HԞ?R;ېw^fNT+dMvNɄҪ ))0u@,]<&x?H 75vo%g1̠L$O@+T_p~{Ԯʂҁe?X*"g/dg~RNԋ/o~U. s6!uJƲW\Yo2_f^S[ * 樌/>x4pwnAI|՝wGYƙ\X}-}..ovU~W׵kYڡ3ia<,OgN$3lʠ*nql!kf~y 8p[pkέUmNQk`ƀvDЇ)a}Rr.]m*2 אIsE1b@^GCy }~׵ U# \psNq*AExZg ZxW]=horpuDwȍ;e$PFoѩ-DWaA:af?~i9;?5CC:޶#-v%%.U/cRBk@SLFX Sώ aA0i \<uwPf- ^S>p9Hk{B!Q -e_CPc)z> X@O qYyb--Oߵ0g1<6(R7% "o5].voXwUas=5U*7 v>9>€oI׸Zu[^XZd)3E4186Ϧ΁Qۋ>ߕfggaŮ0\ؠ#-a <;옉(܁spi9/˯'ؘNo\G ,ae@A MY3hvm6M T؞هj$A`sLxRzZ}AԢRD:^5l;ݩLR$n`.1gsvpQ@_ݷ[hi\qS]a v2 .bE@KVݒLÁ^wg" 9K#"j\f>:Av%Sի_9>'[ Mrnrd.@y|b7ob9-.ѓ ?>K!9\[a^/שfYw/Sa`O?x?^t{?ҟ?ΨNV&Ə(}bSF\9׋Gz9}gkөn/ݛqSaZR*yȮ:ѝ3oŹ=~S0H2as3 N L]wo@j0n&\E_ *<9,do|A@^4^$C pfYO 0.X;p6yPHga!@(. QPc^ÐrI IF[Dɦ-͘0*%;һcXOr.;S&)9ST ?ۘ@Z3`C#=&˩Y';^ύn>Ŏ'UǶCRu-%U)Zҏ43ݣNDyKr)݆>/u7y0\vsnz"bnyuEba_{P|:{L$8Xi-%VE/]ƯL:6-9\ 4H|@b,!z4Ԝ~:Q/Jcօ4I=rI:MCT! p!\$rwQAXLVTOT}(\ja2>ugBɃ$m f"/ iFϩ!/jYpx|Q_4 .U"UG>ǟEXƠN!cO4ʳotK]Kۊ=&1Z o=E q*ڟH-8K-wT逡K/,vDkLkm!!Y~g,= ɠX)гO,8gKCP5Y ~,]f^Kxe>qO&Og@=TK)1~ @ļK$c5 * i7뇋rKOD,R\'/X&K?^{ . .犠yl8{ ?&,6$.f78dS!،tJhiMRwN!b ׼UycJGh+!Mka.N uxo;1QGuyNC<>|gQabNj9(C D] 1c7omxAt˚%*q08sۋTVYcm$a4w梛^ꌋ Dl04loLLΊC}&IͯgEhg̋S0JOK2.y!C 6ט068I%xf9- fPJH|ԕ 6 %\vWrͥx/+:bc5$_xDks^? ,wCSn\P>CUGNYSD ϸ9i/1kXVȟw6LhLmLyvo?؃n1+nND3moT025 v=| j<ϟ icJ:@%i1|6}K :ZgzYcr`疖LIBd+H8Qڢ6}L#xIQ#Ѻ 6 pE`_JL`]<&K@Vi&ヶa&C{Ê*6Bw߈QpƫgrdG}u1j>KRaަ[*6Yᮟהffh*yS5d ؅xwo_ĩruW$q+@Iͨ/|`an /"^U +6X?:o|!٬ÁR&;L"-" -fRDW睊 kQ&уK3vrڶ>O$ jbPwuD'iy(`8#h~ ]A.zfbgwHĪ9bK8O_%bۛ/^t-湆R0n Yn1Ms:4Mtoص9tAd |/d|Tˬ+DMm*D8{tνWhny0bV wPcWm?ܶHoS+MBM ڔ_>TejG W'ន1uZ _{ xkCy=l1dСuی |X" F_8.´5C]@ ú*y{ {B_kRw,C9ׄ %h&{N2L0;n7W>) /U0eR8c|o$, 0(JI'>gvx/ǻo}9φEXg&ÁM2wB`=4Q4v0L|EZr鯎c]QbqR! ƛe T=v)v'9vuу3cQf4~Wc0T6j]9KwC@Jgnh>'4d.i{C9Ҽk1+nY փ=oA@\ tk .8e;>Oԡۇ 5rQ{R0滖uf!6-c.b!47J U3 {mo}odU7u|l!6> Hĸo#A܌0}C )k5 siR9oǖ<&D {y%!mA)Al@3kS~y &鬅$Srp}]J#_?4楕)gѽ߼??^?gsy^W>y>tS];_0> 6 .8?`Vd_Qg)w.G:@g󔾫E?L M2m=@iF4Sq@"swBD, * DNWڠyeL kbv"g?Ol- N<{?菂U}K0m%V| zJK&;Be" Jk yȾc*6lV\曏g,$&Ej1Jku3sy㧜Z̳efO0cT="7$6rFNQnQ E(Q )>, ضT5Lϛ=p)fu'oI4/דe!雘n(,51t2;^Zrĸ"mo|#v\QڒhqaL*i'l__\|{FtY4"O3t)@O.b`/H<LMӢ:QiaZυ8Imc J#)r#O5 ;%Jˠ3?/J\Rau!{s%1^@6O( l7Nuw}lAڢ lҰbr}ÒFzm %gHrሣ==51'+n:Y^ǓĔe$c/iۉ:|B d[X\\*>ΗPo91*=y<ZD阶N3) ĮaPZ T$voQ0;D(A{Կ&w/(slӓP^Fl #"g#>CR71/V?Fo["0;*[ [*/:AWgN`{7ޅW[,\}}a #F˅e>n`|Qe1Djگ C9{:H ܚ;⑅0kapC4' ss 9< 6JQ%Xӯg! ݾLoH.&õ9 -N$.c)5Cpr/1v p"/!?Wg~? haS}pRX"5r5r|#<^,RpXyhw1a$pMK0zN {XP$1+Pّ^Rjg~K \UؿĒ|{E#a;m՜8ajj |kڦR{4M|fQA,vOLT8^"'A'X^GI}"9j r.v7 `jXy"Q3$ya2KR1Z[4|hGI7/Ul{sAm?F* ^d|do$f|pGu+A5ஈl=$8t#cwnYS35aޯ(bZD6\?>3P*#݇NdUG_=!{ٿy2B/0Fq@U?]ף'Op>QF,)zE`/X{oe܅ Q0'}-H!fڔޥ?ص?ptz ZC5S84V+laR+*I84hR&Wyy{dh1Ek=&PG<wE?ؓ U@;]??w߻^ߋUz|3^?^_]'~ w {?׾/?7>Orsi+څ7xjtS_;ٯXOHx1W;v`s?0Ю c^d]45U?L~u1h+j1V*2R mnT C%8PtNQ-~@H.x8mVSW[bt !I&k 0zr` ^] ÌZ*o"mσɴƬ j $z2-Y#v0z,criҰhUL5 Vh*^}H!bc%̟׏E)/_#~tJFY5Tۦjz|S}4'_UE5 -gy韌y (Z:ʉAlp"}Au `WRZ`fh#-D4h9H}@(*P < |ҬAuu^iR ,70# A 2k;,rM$e4%zb9Ł#`I29]dO烐;$#?q5rY5B K O$wS7I~g88>ӫ[wHt0iBH8ӂEEQMHmdobQZgѹDhY[a2 |zGGa"k."x9:oNS*PXG}VB^.ò [O?>,1Ч4#r2j$ rI%jI;/9' &C'&fipDPIG/|q)]x [: (2S21y{bf)N*S"h^9.l\Y %h9IL86)æ(PW.Ȑ;aSJ9vרD,TXuylA, F>^4GOК-/7EN8ǫ}P,W} ,̒Mӟ=%>*Dۨ /_GY 9}x,aTIK0 MLLʅ10.E␍(y 1j,jb~*v E{fO,8)0j<بws19c.,K0>yE͆4Tu~ ߉FJDq*HwWw񥲤b"[j7:Ěѕr54aOtL"p2e QrS@p^0ygvrhzGAK##c)p=GkAwvpkgzDY$ 7WWGHBWGILJHKMBWGBc14 ( "& TGOW  M WA3.( ie֜CqJ}IQ$ʟKFY6^\8Qs(OQ~ɨm~,asJs,2ɥ{scIf}%SYH P!&_~v~x㿥B+2p"X፝e0]<%?4Bg93j_Wt:% 恗-ifA'&ħUDTD܇U;q3;eHY6t)40"\BFE1._96_ϳDRx6Qm> =ʦ@β.H=Yx;:/'׺0awђ6 .7WF1"V,hHLoRWqa:/9e |*6$JcY/(㛑K=n)S+Oq.47LX%\!LQbIA;5) ayօ8,t?}*PYRqtА /m k!i;(oBZ􈣪5ÔE+S) #18X<5`-sڌ!=e?%}ҫl@TJb_1rdq lM,+{Oov!(o@a~` B_P֏ы| D0ԇfkp"F,b9ӿZCphu\./4uEz\@~_#v/BaMt7=4Y@W-⡓R7}!k|''ߔawp1\qUDFLTB|bW)d\+y=>Wcbygw!/S!1WLb9I&[_Sǫ/`wYI'`QX;pL59Z+|J뭀Bs%K;0Ǘ7[!lY?a-G|-uNB.RRF CUj@RLofsgIh_Nͩ>{?8?Oy4(+78jEo"H{|N[)xsi17ƶn?&GUiWќ+ b:HN9_OxyGah$0NpUBݵ*|1-9^[J_19P=8鵌9,z) 'wa+P!y:?DtfF F% @DZ6b;xo7Ļc[ +ozm4|5<0^)˳@) ))!&nbOCou΋ (Z7[D$pC0J{ai7rczevi<]nT0|@A7_Q<KA`I!I[; &W]7Y d@?"HjAyrx]I`h21btϻ׌$ ^8Z]mJ"?մt v0K `p슑k2Ȏ8}3_ YL#S[<9CR:`gO0jV[P=CwrIX1ǧ6]"@X<7=]<Kp[U̬k̥2'6Y ^Гcq: nhftrw@qK`%fdoqMn wZC]TVD .nOAj.jzy?J,RFd֊ }YOSS/%NPo0CH_~\0:Joebe[3ݙi Π=rWf{I3/@.`V2ez yib`w_&GVھa"M<|\|3ZK84^+F#X;a?J;"[fi uΤ`1:NWӵ;b4.v(C{ s皪 r$~V]v)lb- ;m׿ *7pIf.)LgWF~ &:'n"_y*Bvy~<`ņ35?/?UDG֠.òAVgE x 9(UR>E̸!!DX!.T&@:LB4ĕы0ZXRt"d ˜%x_bP!ZҠ$pHsS*$[=DQ~T34`!D& Eʘ +DN&)dȂ НDc2!*=hЧqqLftt˨1cLvnp<a( h5'X Ii]#ִ}NnR0gGnk $:h'ʶv$T_>^)k+7+OPo 6QMgbm/bt=oDӓDF`i< OȦX24zҋ'o"ivp9&>e~ O8TR}DMóP9^?J݉=e0(ek?=af^Y%QM6"|OTQ܈ҡ͈%'ՙxEX3|7E|I+HO>g ) HIΞ/LͼQVTUy9v~ǗFG'D2x1˶UJ&ʾi)O֊_B4(:3 O{$gAr$Dsa O.Vt)1.R&y r[s9$mPXvL%V9e;HۧY9 UEF^7qo*)y5O}L)Ɏz8էx, r;BSK{ڧ;Kሃd%p4qRKiVZu%WVʗf9H6ebcKra 0EIZJXt!aGa=7?jᓯ'zJFzވTצerEG@ɜv*;zudZ>ɞ~$ٸ% 1 X D):$HМEWC؟M ɧ rhsjth5udSzlأٰe撥g=\*ɒdcW1IR%3z8s2:lt Y(o3'I8|<'W ["Vi:υ*T,1tF!E*v;m {j6DҮ(v_BOxI X_-nibSX> {Qb71zHAT̝G )Oˮ>늦c(IicsfZU',%m3=gAN dAYbE{)Km}aIZ> ,\Z<(c:_Dl 6~ǝ9ݼɳ&9.i?4tO>Zl~C 66'U@Dǡ$x1lo3yHXvDcq$Cj?䛼e~>ēϓ9BN|H._v3Sn/WҺq&ܘ*>΅(\ªpcwE\ (WQ<3xHh<}B|>j{N"Yֈݷ阱Ҧ%:^0+)}w^G 50h$x*\;g>pU\E3jO8h@^o~-5\Elwv}uMQ}+RXSg?񝿞8r!|?r烇;eW}S|ߺW?9s7j|#VMOSӫLkq6^=`'^zL:B=k$MrQ72Y(:d՜Y"/*;5͟UUTSRD:ŒRX1]DzT 2a D!J̺dHalFhEp륃?ԙc%[2βk9twpy^:j.!8Hr }c$IT5M|<;g8ܛqNՐH5`!Vc~4~}eI2Z~Mp9Zp!s6z ` 5|;DϟrpDj/(" +@qa 8sP˰&%#uRBxa(cf*eTy@5,`ox6>LEUxGQ(wE \\tđ?5P"Ks;θ$(,Aj?翙hTcw#f9?BKur)Qڏ.q4:'mٰu\} .,`/la2f2EJ} ghYX)h ֓U+){glޙ"MrW̹X(W?Qi88#ΒӳT7g"ďh)׌vƎ#^}ȓ.XLA? Xfj.3SCI$i^&)uC  ndD|cHi>%Ibg\X(lX~pѦzptp YT$auXdx~TâDS3ߟ$ViӦ*g0\ {raНK$ide/N JgOǕ;EsD EUeOj}l%꒣J[0_l^ԌP}#2 cղ`qe_XeLguĦ/XcFD :FO $/Q4ƛԃ$3 zIQ"~&@)'uOOV9eAy\29 >e )w:GD&ze5v:od$l'|4&w fzmDb +ft֥. HoC2&;hOYyHЕ|{YPIg%t] B(0%zX_ GMnD#miRIXMt竄.CL)OdIɛ'۳ܪ QٔwđgDYR?F;3N{$/gb˗vcm57KfCi-1EzDDS"gË'f+֡tl&IcFat@"; Xl1vgΫc ,H %=cX'6FcR AU<9Yq@?)(IѿCE" {/|p%Q}Fw $}~ *QZЅ ݱ=h@ks~si4נzr,U0!Vc=z#~`YĆpZ6X"_SQ\tn(Ln䂂cvAq+t0f 9#' ] Dt.α,J%{孄IВIw9kO=y#jx]gc5(5n>a\pTDXʺ,åxNS $2h3t};ɿgfQD˘V|+d:qs(}Y압 Uq&TFlKIX|ьXsdk+(`? O܎5.5%7U2ϱΰ#d*|0ʏ`?L%n0Ժ!LlQPIK-)č {p6 (#kԍ9O;~ӽ .FƯtv ;p'De_7;K0jE~ '^b}Udc)GMYze N})[N Gg^#fC&ti6b1'7^ڑ2iEx1Mnɟd/,CU]B Z6Oz?~,AxI5ghϐ?(-N0o9; $|W ʹ5=HTHeC{T^ vUXhAzL< ْsR̀u)O3ߜTP?ĝ:c3wXk y EcɄ?7g;|xſG(3AVk Y:h&CPCWliON'vٍ+BX8dzqDy]RNtz ʊTtH&efkpr7(X]"={"= L> &,uzQ55-|DŮ# 8(OK7 `Y$ЃY 4bQSĮ_x SYܴ+6E<ضuz@t%Ok\hŵYHUa?{7ah)^Yx[>X]W@֡J)"Tގ&x- C$[F HF / 1ޫDK]D K{62pۤx%*I5\̆su31d܂&OdM,g'd:y:JC w>ZhmE!G'۝{޷{*A G8Cƒg%Co0 2915剷{6cPq$%Wl8?[ؖu(6E/a >5[*KZBtb1d+|nuʎqMkkyM^+m#- :V9[e>=6~j֛k[]hXxԩ " D"ÃZ? i؊Cل虓$۶ Vc ؜Tؓ9"?|JwA&n-5}c]S8J$qlsD~̻(ZݪcJy-܋t1֚-Up cgo c]K9ǎ 4gOS %ߖfAb?;tN#<4+lcS{:.7qN& E*Ϡih%\<77)b\l O94?_'w7Db.0vP[cUW<Ղx6heolkHQ#W=,:7vp:d=`툚?4+Oi灜],']חM8{ )S ?)g^ܢKZ.ipOH``LPPoѕ̼iȯ+#,j%Xsk5;H݌{$H}`><04=}[ÄyliZy(K׾D,*=( 8y0 5&ɩ/6^.ngW59aa/LJV@#:ט Fj5Z"Lx`k\n4IBɕ㮆t92E'?5Dhq!s%AN]&- I4Dzo^kj ˟xҝ^5?H(Z;_&NrK-Q[T)wB wt/*3$K74QT-Gb-_.s4G i$+Uȥy''"}A> !y?;+~v9'']v>4P>뮷fSs4]2lKO-2-j}($Pb(ɚY6;s2)ӼC"Ma:M?{hKqXH̉Q~lk!wI3Q&b prG< 2=f2C9:=YaN;+ڼGG7W%\- 0UqZ11z(Dl_@IsLbY{U)J@IN]_6&h=rcmakZ`]{|O9Q1R)͊Y(lrԅYUs"G(ro殽8:LRpIbFHU(SqN:?y!f܀Tl1(.ǒ\/;ݼ0WƋ}W5r+QbH;h~f6U2`㩱3j{`}o[=d\2gO8Rׂ}BD~N*m/yQM Y:\ Oc;XW:%'s- FMa!C˸k29/>-$ {ڲȅZKA><+%ݙK'| ®ސr!px.K*G$L&FPXg/RmJ}EDeSޫ\ EJ 1\#>UE\,L9&@}毅|61!!gmcN3ϭrJO"O_9=e|.h52B6R=0: UnXx}!1۬/qD9t짧X{&O8G$F9od Lޝo1|H$6hړ+t6B4` ߃rw<8>9Sp$,%"'Q*Me~T2opֶ !gE-*4Us0՟s_ UxsNbУ& [K3G%3I~E{h@cvQ*A$tQr$NY;&E&d@ZvbW@֨S+G9ZrEe.>!E7ĩ_*ժz߹5ۧecho]QVU]f.7gk5gzIqf/gHSR5@T%p?{.V}3]{Qiۿe݋e9tDs,r7c&'ϳ(PƺVv5?OuHX1h6B f1x8!? Ë &dT_FuC};BHFפ!O[CPĶL0Mɓ@^bqKT3vwQ#gkU\ԁ|/u!4>cUY@klҼc)lEPpeA$UY}/9z{ZyGW- g|YܺkY? *:s@=aa=!%*䝾29kOH༖ vm/Lo/H ux%XGND+-6fd"YbLg ub6? J"PP4-rwҤppnbc @LRE1w7% Ty[/J5-sna;FzsA*p!0sDZİ8XNӒH?zzS/Дxu2<a;C!VAZV<'.dQޖcHB'4F~Y R(__C'a0r;g'mv[/dzv HxVO0֜#Ang N[!1l3)SnwOn@7pQE2V*oL@?KhpNrWrs(qCUrw" ;#h//:DZ3T]PwB6+P}*X.gE0n3)jw&@ƹbMl> _d[g`G~k)2oq5^;Qa6~zF8c Ы& wWzU?\yr4VFBK_~gI5(Aw%øB{TÎ3,M׽RPP8'#/C'"b8yYem-PGXzQk_|4Dv;Wx$W.l/ >,zX)g|}Hz,&VJruxYyK|L)/z=%+EpjI)Hc?/'wHD;ɤNΥpH\+| a:2 4-Ū<* Oyj'?BفZm:@9ܘ+&Yc[<'DR-L9!G6_Ĩ'W{c,;.HRM'|kS5}ckK `?sTcx kvX`Jr;mrN&7>]cʠcH sMmL¬W ߂-D);{&#gyDBelyk fš./ӣY}ڎQRFF|@>S_rZ>n?wȦ\`\*2m |}bUcY? y"A0/[\A3HlTǹ#/Ɨ?';g?W/OU{9pK5~uO^w߯Y~;}~%~Kַw7?+.tWsm?ŏQC[蓏z'sX \{ס?t/MH_/߸]\9u?aGh|+\t;py'O V)\u;q݁ q:~{ɡD)kħc(jn?e\Nclr {. ( sxP\jIǁCi%*R ƱTY Vɜ ]Yt.05Ǣ !uVM;S<ǴU @S@n֑*}38(Fxh|7@=ҙ1)b% : ;I2'Ģq`Ex)n?Z9?fmPyq*&E t6bD1ƻ8CyU_' Qy8L]~h@C_OPD ǣt/`4?)h{I(\r`^?<O.qam¦D&tpz遫"q#rJ00[P:k^O`?$Gvfc`bLO39ِDhl-Ï\YN$c7q2P6kj IINmOUAw, /wЕY\lDحLÓQQ/as(CEX(POA*%|=}]|ԒgA.tŒlc6%Ÿ`&Po ;غA7y2rC[ꤗ_Y(&eJ;S0MPbL=Ucb"DZK;dD.c]_DzF늜Ȫ99r}_Y\r cȿWT*y-PTfA8{ o$}{E֯$/hђ3mBҕpRgG񲉒 \PwNQ;œ"%T&ot4ײ@/aP";єइ5"d2=eHӲs'"axLRt2?!.ꑈŌ̏'2&J1b(+mǼ#LM#oz,׬JF&TOSE!`DBcjPtgMd#-/K"^EA9#Ec~X vneX'<0ϑ sQt뫟Ζ;i\pR!DIe{w&C%QΟ,?@3,xć;s;2$ _%g8?H՞ A}41fY*vA qaxpy@N9׹0 |'H;l*H|`dCC~J#/2K>vX&#x1;UnȧsUpIgaJ|dl~6|Y7kAs+iQkdc?2 n/9 v0lǰf", /Lb,2k?6. Wa=#ZVtK#,{3{^JYiH.!eB!PW^hoRYAD˷T{b+oŢSC 4='vޡWׇk1]OQ#bi+O:bũ߭'/Xj5K"vP;ggJ/z} oQ52sb2dX~LG/oMIy00∝e80WТb4w\Kgai1"+aQ}ߵ]WFj42x8jꃅ+c1=ގ h:gwY<ӺtۛTQ2ݯ:TΰBbiJO;hO/*Q{ߊcvj(.g\LL-,CE\gZ?X5;d`9Z Rhl!B8yG; kNHN/>|"& T4Oěߨ :[L`/ry~$A칀cpDJ/cNy,:>)uDabYOH?OJx"Jyv~"gY4S(+?l c @Z-H\\iY յ!ꚦa[ c׶5 k͉ 2\6[ 1 Σ9ˁ8 ¶Ja[A_Jw"NJ:0 #4PQ"}aYX*TƾW+(6IJʑS|ib}G̿zͣ9|D sTcAdL:FUFan?<4KK?_wf>W_?w{o-??e?]O9n(?ӫ?-|^c}N.?OG/򃃳,/qY\b`H !:>8KW÷^$ l?gɩʄ2޼nQ9(⻄9u,1Y|"*'0`d8ɬ,^4!-=T;,PNBDHV[, zO ) r9F|&!M"K;h&11)96'M/0|盟/M e+8C†BLN!(ЃAdG#JQ<2e#`aD2;ܒ*k4vRDmHm΍`-UقTi.}a2wdM9Bd)Z]9N;E;#R5[ /M`P k&bq R/˗A;r{91Œj܇s4"c?ogKG=,/$'%O"?X{zE ?O@)ؖ*Ν[`cXx5XM%S ׿ұnW}ό3'WƒabD}py#~Ĺ{<+TaHaBn(|eI-I#gϖ(7cGrP ;N7lq )6Vn.]ߣГ.ͭhn,*?hcid5s',#dMF5VnIsO;dtˀ('O'!J)!eXSM<1$`) &<@Џ˜oVgU9 R.B0-ioI*CY,/N|]S9>1gJ*7]0+/V{pRckooxZ"9I_M!PYq!U 0H͜K3txM=4߹#"WJ pDm8%r}bgIӅBENI5Biפh8wV8`h#_?< %.<>G>FvV7|z"C##YB^O,M'y+lv^2g(ا4r$Gz3zЧ'WPuS+v_DV/{īe9f>.jf5T׍M4u2)):>ܵ6kh~GU `Bӓtx%Lٸs֛}BJM6OQ>ϏoZ\]67d%!$3Y= Pp%&=9DOͼ&*ar cȁc!џ=ٟ>72Klڡ3|=@X9_NX,iOd|lSr>d3F*k*2\E޽ѩz ,KUt7|4,w]fd9\-_q=6:Ѹb!:M\2"U\׽cau~,ƺ%Cyܺ>SqGe /cȕ5{Β|2#A ld t.a3&Vό8Ը'I c?.,97:|ڇaL˹2_cy) PlLP18NKQ ÇO]l:eliI<\<3f $9H `Kwi 7_?ᅵ}?>_?ί/_?p7g?izAįO`5{ },I8]%kz]zB/@g\هG6|A1d |@c*QqEadpn-sCr5rN C!F$ ) $AQ"0CGpd#Y5₂cʂd )S9RȜ䴔Eᢍu2̐yGS0Mɔq-eKSHL̫GF]T^Ms\7Sh ClQp{bz[siTǂ Qys,Cc&UKKY~vl)p&<~9z@#9_ Q>ғTyq%P7l"č<)!jHoX"2. X*?V;,^6D7CۄS -dOllc`r,d10;s˰㵘O 2RdcsS[iX@x,0g>dzߣ-Q:yKʿ&C,J70rtbUIJm~ki_sl-7Mm~>g9X耠!}& 3ܢ:~#FMŇNGN'\4+dZSQƼy3ZXX!  }>ғ2&xcRJ-0Osf {M҃N`N ek2Ņ47a`cQvEorI>?Rb'#h6=Rgi_6垙0\ETH<J/`fP(+:,=2֦1obnoeV%du10l'˿.+-B ';YXa!Kt|6~>PߦC_1w3}'9Г ?,\7-y$bwn0#ҿ@8uir4P OcMDgSx;ۇ't ¦d^=YRǾ#C~,8Q<)O&5!5c̮a.2~%"չNfaHHom2vWo,Zչ8 EcD06n%s~Wu>~b'-Si[Č*'X ?ϦK 2ps$B$f:9njڦZd}QigE 3韊I~ȀO 6΂p^Q Y]4&}dϓ=Ѫ^+ߟ9+S9REP,=ZS.@0s͉ '#6̋,&1g-N}i{FP &0u3m.5ÊH ;yYkX|O?J:h!BYl*wXThJ2_g5ўDAyٕ&=#V1ª (j? $˅:\"+lT?)gIʒ |kEx~./yQ6 9=rzˀ!9\cMXn !B|4E{c MKz:h8_B6Cb6f#e'eQt2KZlNÇ'4>B y*gr<Ƃ'"}!]*vpaQ4ؔ b+f)NT*~hFKTfFt2EZ=6+rGai6k 2…ѐG0Ű,Ry @:ukO&4= J?s,Ah6L EB&' XF_!d Hnh$e(e5Y=}B9+PAo"Zk Wes%p`#'7YB֡ YuR~=/U߸PqR1P^eKC/-=_mچI|y1r7f Re&.zYBs5s %8XCOA H3S#sY1:JiIJ4'Rs #P ,ۉMhgznܧ`ȳM: x3q^Ȋw\>54nLu.: sbbmFVbQ65rebAC&^q,",Դ"ܧL:epʈm 5!ri:"E%AwV2}uAגw^2ެ%[PI煍0*hsw ЭYonsAYGjb@$d~PYG 9o2Y5%]i:eѢK)?΋ߖ 6"UA|"="Yg3 ڬAM GG_ JC hw&_8W9%.o)9mrsH/*=/CsqF#`!VK&,~+%G ~,xpaSY֧,u,|$ҢKjg0fǦA><U9?xg)z@%1:{rAD /wLSKx0~Xp]=ps<縔8Қa0l"8ŘCx<1gTC>@ $Jh/!"Uf/FhZ7HAEOK!yAvWJpljeɷ(h'qMNK~|gUEpgFs:2F b},1Fs%W;e& OoG{v$q͵Ma;2Df{(k ÊU@qJz` <,W1ϞbOۑ E0_4sbs1֠]'E]g,FBA9fIdWަwnoUy~΂l&^չÿDC@veͥc?cnK;r^$tҝc%H|^G 6PXмCiN9W'3X7A2ؑd}nz02'b8]! 4;ƛ@ũ 9/k1?1'jjͰ ϰ8/GǶ*5@dw$\OTϑzUH Ɠ5}e9Zܵl#&$H`˨ܟg~ؒ<{”.# x@k̢ IsrX ]D> 1u_~#EݛEfSZ\,|+dd ՕLK񚼟 ʁ\7TPEq tvSLJ=VJ8lUZp(9OsWޙXP`q3ˇ#Os#h;vB-֚g-U5}!m#|?{2cs# }DPȣM,z/oB;s4PZ>TؐGaHtAtt+oٳWUmLmE6 ̅- B}nQ?'a'Rhvf%8S˲sƞ'_bma(:uֻ:naY_LBdZ0g)J<Loĝ+_<ǿgӆc4ĭ;9'QhUq+'D< ZeLgJbx3Ln dIJYyPqK! [L9q99N,2]x?itm[3;7v=!ags{PE&A(%izW_~M 3 U683Nua'i9ɧ+k 1_rrbs-qS\JQX-H?`J큗~~%"dˣvV-d>usc@1!9|8&6-ɍ׶鼻=*Q8-W[FW\F(JL /.*ǟ9?o+_+o/^o]_߷_?9|~:|?sO0DsL \B-/Gf'6Ӈ2Jš4L՗ס}]<9i~m퓣s$Y^Ϫx7yblMӟ$]al#Y217 B |0j~#tGdWr=Quw1zXL(SQCL5Rkqy}vȁB,u@#|s8B!L*V3tfi~L[1{ph4ҙu<Gф(N5w]x*{h8F@,5]1 gWg WLpTw8|D%1"Dʬ6n_@,&4E3/lė;lb)FP%klTw`Gv @&ɨ/GŚW >#?6J0d,p ͐ƍ3fols1d?>DB.X:E S h>:3C?&,~ٜ{T@,¤/TyezQB1QM}g8qcQddRݩy[Č*Xȋ!6cAn#J$6qn"VR%-kRu!JO4Gs)>S|1_ 9gw\ |C,9J)! '9O馣*ђf̛#NQ.ƾl/xF4Y0JCQ:5u,RXXQ0h ZpHҠ)"J=ES2AQ\[q/1sjP0:G>1ba!eܩ[XJA+Lu!eE: bS•yn$,K73fo0u'E8lplfިhS"9KGΗﳤ oX_Yf߁ҥ"r4I_.J>d "y L4фct3!/RÜɷlDI.D2kBK'b'"(_J};~qJcX\.)㲐>=ly.jZF\BZh-;x]3p4is{:h솅RK,b+텍7Gϻ/س,0:E!rY!ːK9޴*!ZĢ'1O$kBtF"v ΊZ!P )ԞIOtQf5elxM-E%/,RȝQd5p0b6B [wOֱa\iIM#j7Gogt!a5Kp`A<}KICS<ď3SDJC'41gG#|`FGNS4hr:icJp~')A)L _d9KD.YPJpZ/%Yfٝގ'֋I9h?B }b7)coSgTHݏKKƺ3RdǦtqW0J!PLqDS7Ѹq.w.!ڛRfN"W%@NQb#c"t站T;u8^\v #5;^ķK[y~r" eg1S;rNp# Eۙ!1j WìNC4&qEmrv*apA⹒տ>7^p?u4Y3|q"$kʲ*%ذ'r{HF̯͡*S#ǴGW?g!znBxO54_prI¥kr=Ra}bY?x sZX ?HX疡(/B׀O_ͱ<S^ȫ2-F!.Knt17%÷b1ly#Bv:, }q%Ɖ EҲZ~Rߘ6r(eGXҫiS{lA۸lIž >"t!'z#sJewx18hE°^15lLu|べEoaNL+Z;x3횺igDL9Z)MqSiϪ̨%tyɿG(;$P(\v0yl@f-Ş"Yr:B{?~K42ʌ>pR=jSP OAUSw%So9Us-2]HDIڥ4'\QH/Zߥڪ;Q"C;ɼ !On&U 0g55tiFn >djK^lKMfE+7gt| )|[6_q-/w鿤zGēztHz=>H+KxV@(!n#VnC_L쩗vrGe60|Nۢ&'Kn4PǑSN$~X `s_A/قbɴ˞SԽ gPH]~aG_Œ#= vnM{?'0inў= UFʼ/JpZK"䍝'$*$:HGc~C>ԜY1!chp+:^0m3,h.e՛MH <<lw`acL-=#ztq9#c@;\nkkG6jc6ME Z2iq):J & _KQ)+o{jʋQ'*x0}N`[VR8ZkCP$ίZXNs97e@ޮiH[z}֛Ó_e,Pyi#`uW\8w6BD2 azz*sjG3z鮅Lk/ Ȝ|@3(7\h ;qFE4$B<@20;ϧψ3#]U֦/ nPh~ CL گcȘ\:hkrE#s"f^nn( p""Wkb9\;K;\IjzTiB.;UR#eI"8ΔϡR`-F8D ٘h1K1H΂S~5K n 6_[h᜻p;.p4A<{TrSd%.UeLj{?j7MΕ7Ώ'ÆMfO10a.ϙ15~?`0K=m@yJVܕ0\C~ /E]D? L8G:H]~.K#L@f rPtR1ϓ .0(Z]+]w3Î YD#<=>( Ѝe.9?uKXCm̐sF ۣ!G2b Z ׼~|De~ϖZh;3Fʋ՗imO{FN GxF_h'c[N>wo/_WwsA~}߿~3/o7W{#-7߫M[%w߂o}??t_˗?}W+_U-~W?{ٮu}?s>t];8+~G,d_v7+ۆ_{O w!yɛ7QNC\$_)zV3?:snS(X=, Xsc\Oouivc:|$ $tPX c 0ū@Xt }lQd霁DFfp\N Ha:25dp(.d~ )e!^}$'}bJ}?^<:@csT@:ѠL b_z@9%ap,pֱƋYL#r1qԅa%@ v$ko/YU⽸  8̜!y3,dfT ZQMcpCq;Hw!ۡ *GJPFfhe& +: )>5ty@E#"^2ERI-L}#ۈ v.lL, ~zg#{Bi.baT?Wk’04[dIyiW_^p1XR"%YNyR~X%kb6}=[*b<ZJb$ 9$F->sl1(A gؐDGzw} y[akl*z-ȷELprXb/v5cxjzte)l5PUv;~Lx}2BCI͒IµJ8,BF3 hQgG@XAc-j~$i)EC!~Z^ <էDe rCKnu,w?: B'eGKa[=):Om"禠Qa{.ҷ&lkAY=|Dݔ)- ~sVIO+؉d '޵E;K7> svɻJit*u bE%Q׏=>[D-Z~#Ə㖴ohE69 NDBE,w3 *gyЋ#{k ]L $\X\:n^rrfYt²f!_ϝ/_J׮4Hs?`=j3^pgiI|= bGv$_WG2V5=yJI[Xe+."/LERN19bb^XK|'Ns٠ &4X]69&o_'VSaJtqD֦``+[2?هˀBm\^[] 銃8C^F*vPԗT*⚇\ŖZXehyGc}abPz 2[_ߩk6%@L{:K9tءp@&;V*2YbVk=WA \8BO+tU;l'v m1Udef~uض $,yZXS_-ٲ| \Ogh=GSmh̐#v<Tlϯ;:/ڿjVLRw  F^F&{R0тЙlOQy> F}BCq~,Z_C~}eK,#!Ҵ%Z"荜(*ፁ7d`tjCMc ,wxv%WA4öy@cM9G@+bAs+t=E5e|ǡf1YC0켦77^"z4qAۏG3ZYv&ĢB$]J\ Si3Q4_w+6Y(n.X&";O#{+98Rf7=kmeFf9eG$-"?GZ`ўîоF4F^{5إ/v72jLYu[f~V6<1l,ZN7c2 R仚#ϵnx ڶΏ!fAh9>wMZD6 L^P?5>E(7MD-7]*۵\ն]@ǠWÏ,K*Y;^K]C Xo^6ewS!Y_EJO\[wã¶ 7s~,Rfa vk_^qA- ȣZڸ99t1}=f W Kф~Pަe`j!.M{u]'Uih 5R'6 #cʹK.EѴgk}an,i|{ >*-͵4LAA?~rΫu?Yons?-šǟ\Ct?Ч#4O6?Ç_߿+d|,,#Na4( :#p0Tr.G/]G(j.T)&kͫDP.GX(qXȅ`fNzGb±4>`1pb Bf LfDQz2"1u0b $ܔ0)$02ȳͿhG1`aNH2X(# h͌e"A.* 7E? i×Ƴu-{g$mA3\RI= #ŤAeP!Jɑ<tO̩h?G4G3"& qVfG<\TGk}HrlKl`k UW<WZhHd mw&; k/^M R`)Ye1P̈́%l Z 9 Ʊzqr{6pӔ )3 J\M` ;j$O-@"@=:uN#tIZy`-J=0 jTiɄ!Vјr;3_e" =Z}ޱVQHp#B7M! *D^g0ܙ8DHkIaMJ2dD/ IϞ𤌹p|vF]ﳏ-F8H# *V?j"H.؟n33msD{n `Q. %ordpqA+R0zdNAR\!=bsY+s g%b'ҟ))X1,j̩|&"_BhemلXs?#.@,͵Ԯ= [+LMDM^U}ƯITh5x#rrX$(3e"-fiT!UiyYJ}HHȠBH5=;eBl1LO%RMC.&$dOgIuG[>pu $`4I+/?}ě:RD& ?#%.tZ3 9VRaX\?ϝm/Փ ksyDfvW OPOqCA>Ad+X?gOr=A;!n ""̵"KiɰJvoL{JJF=-C6x]7]e=ibܙy &jpԣ7͙&R#NOA.\zҤ/EiZsj,u;Ȯ[oCj[g5LGdD!B b})(gW^ {yeBM'.iؐ!IE٥W5 rr&TᒊH+D;H95!Rz-GE3>59Q^VQdIa5dD7^AeJ c,U[jE+iQXke]^:)/M?&pp,-ҿn0/D| /1*\bG8J!*?.}6!@UF!zQu\ XKԧ.m4NIF>c5sBp81[O:%Py>Gx$B/1m==m4I"s(;oZZ-3XD4>eK%?7O@dt:[+R^,P~p>~81ڈp7B[P)W{9Yw^'<2n4LW;c3!McVc}IDAS=HZ(ײ`[e^٩ m1TWUYB/]ysL PYO =c&8LMg~2yM cX2-bj/քx&nA"xybio30,ky>h୥U}񽼳uUړ_vCp#Nx,!8$j3_û*ua\c،I蹐iNst67cV2"pJM^'9 S^BDAdm(p^J\ɅTz8 eRTpy]էL On/xurK%ʜ `.=S +Bnƶ 'ua1g -ne9NRLu.<6'S#(QѸWy}fwcmZR|6Em ؇)@3JRßǃ(ffBq4z rӴx.ALU-hi\?G0j $>{K~(4^c0ܦV%JdZ0¤&m-`x_/" K^}aʟt񊥇l^uk=#tvV8SY]OP = IsI(m\c0i!ɞTg)Fv쟦V-!Ees`r:cLVm`]s8c\^>16\b9Le>?M />zjb5jGm,#; ry&XdM )1;({~5>ENIb(/TPg Ʊ4:j?nqepK-juE,"$ ΁Wp˻+CrQJ,xep7Ywb Kq^miOuC+iTf0%:FݠiaS?rGz4:MlL k/X[PexHlt6ƒ>E:P͗a _8?S1!%ݽ4SUϾJOuDWlԓE0| !/!_Z}/i/Jԣ;zH|dR8oZ(FT[i_ 9J0yCBؘэJhq.0~q ,'ͨ(~)~.d2r/hO];]^2}StW°M7ۗD C 79dN'7`H-~ܨgCwc7$}s4UCp;ɻpJuҒ9CE%x[P~S:]o&&$/=yitkX4s 0$Kt13G)TS2O-`ez.>a>K1XAKBҏ=9ߟ!q\M3%.X4d۠."WtޣIWwvpkHyY$'jWWGHBWGILJHKMBWG}|+H9!#  '    & zw$]jRs[~/}{~?~߯&~.%~;o-?}+gOѫ?y/91ʡ}_\:zc>8uPE_+G//TIvů߁'3i!?PG/PFKrTNstO97fHdVE)`f} + "\ݸx}WEx$pN]ĥ+H0-~݉4*(I? 9Żdp+ w<`JxQrA&C9Ĝ#oJ} j1H9mN(JH!ve C#ajܨ\|;¤dE(e3⌂.I|&L摿(ޛro׀(juQJXkz`/DFpqu ppP`C@Uhn3#1BQLa+C}H rgScËrEl®(Hk&B #c(;ـJ[goAՌp~m0;z\80ۼo [GB S fFcظC.[H1z;!Wp"x'i] )#B 6Q5B&t_hŽ?'JZϒ㹹,%z*rbFϳ#`΍g(\S5&Q *_“ i)('8-Jc? UO$ P:Wyg &Sm₸D8/cD,Q$}Nd-q @I`+ʝ|zj~Nԍx#ԓ)Ys'4A"<'308G ?$α=(H.=ux@Qor |Csb-&}b#gcr?2GIܚZ6#Ȃef@RW?+_>V6=yٰDM[Y,N*g -#긧nMb4tǤ$ڏEq^=uQ)M#G&*"u4J<_!@G k?q5Vb00uzd:p>S\zsݧw(Z ThQ8EAh*`^@!T|'1@O2s6 ,%!H=l{ޒX)Rw,ݘcdGY_j1ah)s*/Ѷ*ճVͫ_dB==L.& ω>EmQWyC-Heq5Pti FLYZ Gz?d Dx Bj .";#S2cO PAh }#H?18ٓY3SXfʵӐ0:t pp#FxoDȰF}SBͦjaz Тs=|JD44ӳ@lqc Ү<RsN^T%}$Urm k%5%!!M?3%p>lo9Tgml==X7P3$BYjЙ ctR I8do\cRB>Q;L 2 Qdz{)im~=C[l|{+l\cYZڶd?Lrr^ġI%0lGj.S,P+k͝W`b`OIR9bHAi)wu.hL:($H{t!:2,;;Xw #xhätckq*Gά.ɋ2ՙ/!Za&cnxͅ>kcjII{AEQ8Wޓ?QNj6$'ЊS>CЄ$vHLv_r Ǯvp^ o D& %$ώ@'ȽD*FhqFem׹O<$WiC|<)şˑd$OⷑeIޚrAhigMJ w~-OvDv?jXy8Exƻ@38/c:p MC[ (ܳf,[Ns vL2#'gC21)l['t8c4"L\cNF&-Tg 3uYU#"tS씝z@cOϯ=b]9 " 7&Yqlr:]fxϐ>MI2eg;Kߘ363LޖTd|^lNT{)E;V?չ<6N;MX5%4$yu9^πoJ`pmHXCB+O1S^i.ʅ%ydOD ';6 9 \?g[Foݯ,N0Lj]A*bhxؑx=)\NCKzm>p|]zk88;LAA=悴L>q `@Ā_t': ت ORJss eigDT^Js^Zg3Gc 5gZbbOP jʲ&d,L֖x[-uesX~M#KC'͕jO.Tx|9C`X ٸoڇܷYBp/ ,faHvɎCGF8Z(I?KHzj,"~-GKD;H`Ef3DU-]r#EekI5{l 7kZaorc !7Kyb&ᡯ#`Jލ6egWU>S] r5gsL Q udX癦,ēg@%-3ו>p@L 5T%_æ"('̎zp#U') NLOk15-MugeUq-Q,~H^z[XxrV>ܢםG4{OT Xm)@G')`'#<^53h|\Fs{x@/}.2O祶֥ :(,38@x qvpԐ[8B`C>_ -IՂ^9C23/Tg>VcR[v MajMsLQݱ6_[[k>>ӏ緕?>U_':i:>d pKr(0Dꀔ|)@_KsBס-Se?o.{)o`6pp Zb c>0jMC랯!$ qLWu9a41B>Ȇ@bmFOTѲNi>Q4+E) L ] ܫ>{TP!8wO940(B@-'4\~?b5#o@jfY,L gj8s} ,uB uLXvרj0_/(An#IǺT|4̲z<ӄ7KgOx1bodi$zc),*ډOs?h:=,`ɟ퉔 4KÁȢ=162K3(hyִҙ<8K…tԿ}q9nE}Vfn@*{nwp~Ƭ*$fd2cEel/q <3fzpEHp}nzDkW 9px\ UH:r+7 %/II,À?p+yz+72V쩏KedY/7jF.ðdx;!j_(_cB0 %/ @fnXUIpUBv%f9o#i]u`zdh7̞ ) eyr]XQL*{K pi;E2YÎbaLKUay` 3N~}x{?;)taԾ.\y7tas%ʼTVbn"Dorh&o{cZeSEpv$t8Rxfj,x%f@g1ybQ3]p"o2 ?/n1Dg y˒\7 [g;?'-Hd9\_Đ!Ku,Lj=``z^M|u9`҅п}F7}NNUҟm-Zw#6p׃;-r?b~%a6K3F4fءIa?Bɒԯ-: ^_}9Y.8ăƖ')'I ("4X'b](yu˓`6rYmn7}>;]~)s?F WO݋hfXyxbjzq%lRR":|Rb3/o~?uq(K+8ۼPMbfC5 i^.' c6$mI?Vz8YOH2klp(`)0ЧxƇ*F>4~$%0SrU}.v1Z8Ƹn'$W_# ߘs˻&\(o򪼁,8cX3鎙?uL;(ú@)q4˘s~:?⶚?΋ 5~=^),Nu'(=84FRlvr֓i4˚\\I"#ՕFoq<\JDIcU'lbF){U)No(z\Cu!jU#}Yq- "d#6/+.HDu{pryq-rW9NZBz?Pш3WǏ4Z;*L IU T'ɥԓN<9?5 s3azMYNT~. e<2ȅ7О6$U ~ 1g P&dz猟(ܜ$c<6Ts1JF 糣UHXOPQg26]EA)DltJ &K+hʧxx C;)ӨJO~RɯWCu~y_+Uc.Uw`bI\rWfj8UV=:.ݑ: 8el2CEYs]H3' ާxʃEp( 2e~PDâslh_k2/;iǖ6핿f{>=e 6шtҫM4-F$_V:,^D6_Jg0`r"ڱV5I{8/Q>$AGxh=6]}wZ%9j;?俅wӬ[{ʷSO?#-3'|9sObɨ].+0rP nwEэ?k:J ?òqF"*kURY_-3A:6 YyEK*wzHj'c [i&Ls&DrS@Qlcx)?t4'ȇ>%dkVzK?aKIpFlJdp䇜lg15)pܪ4ِ[rqHMIAZwknUO{bi~ua>rHW/|iTz :X0[Ru}nBzZfwWY䯈c.tT9ĄBڝ$vϪ"ξ1PUd{<|'ږmxJ% Ʈ:?Y2(q8>ɰOxz6>̮N k% 3̥8N р.$¸>^ ?)N܈Z!zEy)&fq?e eY0 %ɻ}i 9x" .#SI2*5L5d 74r&aS{YkoӸ1H̺ӳl[$LS䏘y'ڑ(pYv\tܧT5)."3Im_fn" ;Lu(k=H1#xq/k@K ȿwgG80t f Ǐ|3fuQGR:V%顪;2)1Dɤ5-<0ub ̓.'aX]9UsXT^>E"\_̃=|An˯pY(,_A.i +5 +$,NPApCEӮw5yƵhOo#+ zy !HXtV> M+KH& a )jв [D?%l)(J3|cr49Vp.Tf ]K ;Nc$DdJ`ٵp!q:$b+}9ΧF79Os6$= }63 C?__cAS{#z_?oo+8;W_٧/?N0*>}mw_o?U-/ub}KoZw`'M1;yі09:O>64}%HstTIuU)8Ola/<>aψK2?ј ?JŸ8L{ gs s؅R ?A yQ!m\X#c+Y~041?{x1[:GVrH`%!)cTIW(NН2ॣ%'<2rxrcshӦHG0DOsGe! h@hkw"[ΎO-F$^FvH8suK1y0f-G_yX*klZ?wLxca9\ܓh76߱d >[N;4&ӛrKP KBå=BB̬`XjSGb% BR?Q0;C!Es 21t"L@pADP#ZǖrsQ_2,Q#dֲÙ2FܧOY1|K.6!h\YDȇ`?& dQrBpc@NtR >]F:rpȤjm)zUq~7F2UT{.VVZ0M*M)2U;y?K, EdXTOU(ΰבd'E~/3wi-H;4՞Ͽ"6fxB̑'^ZR"t~bCAMpa!!ǓHذZ(}%Iś6#k_hGQ8^q\)Īeh,>φzGٴ8ųI%Eɑ,CcG/LJ:2|`E 4x:,~.#CE' I<JCiUhk3Bh{'2MO%Aa6J#ҥ=Z+MKqT;O`)ZԢCrϯN<(G;Vr<Ҝ7k<'.mG*yK4ӳO<ٕ}>tnHw,a𜀜&ݙ7/SN,9q u h1|I"Y8Z|PDsz 埥v,E2 ,ɹTElّRF[*܈kX6zS%].g唫(_@dm) f6}$hHa̺K;=$^D3-$jxZ4>W7KE<I|R$Þg[捚jdvzA(\x/EOWSC\n:B!sQ=/!47*BQ P!|H}ohF/ "1i4لǍ 0P 1]i@ħ,:.yc 'q, a9OA;yď,rs;6&{bu喠I\qiI%24*-3`@9h'`?/U.frp/Iߜ%V(I W>K8؉/FۜX܆K٫FOytkKFŖSref/i𘉫#ɕE8I?X[K<ſ}cjS~TWE_Ȝ~16517Wf)zuAWkD i.my2$d=Kgs]zQ?s)UEp[Kwn/Eٿ;7 ق+Q5`':}cZ4>,o (%O*#L5S|@'>:1c2|H9!#afR*T'ٚr#,E.58:Ĝ' Y nTU y=.>\R)9ͼER?"ŞϦ9S(Uÿ^)wO^_LYǰVK;_T l={2[eQowӴm6-Xd"+[}©>ER/6Tnn㒆#jR0ڜߧ+ɧxIȋ,kg{P sL2è,?yHz +s_%=eP\ҧS lTT-PBꉌHL)Ye)L C)=yQ|#]JÐAM\>Y)C9KYMᒩέe B<23 ̧X.xGP&!ŵ34wHd#_N"lBBsFl=H|jrԘJcQ?"n~̙n2C~+W]V ˊb}2V$LaU&;O/bD;XȊ.6ef)ji#kƧfBSBa*HPDB;Ըi&>EVy1R^q~ CG Eg1xly6llp  "?} b i ؊Vcb/Xמ s˹lĞ,m|'v"uը,:zC,"~mi߿?cF?le~.Y;1 _ _z5E@87早9Ȕ"" # \zA]_@sI؝ѰIqh55Z J^u VQ 2HGx;ZYΡRE Kǹrh  W3t|0)/Lp!OYaq_gǃf=q m0DWiп5Y*C⯏yT%MP^P0sQPGl-bxgS},Z9ϠIq9iEu{Ȟh6Pњ1:هז>EFω`ĥcO_'rTԐo Y& bV-,ܱ;`rRQĕ(9/p34ե_yQ<, O{%̧')f=T?Y/GXK6z)ˌs}wqb^: 1[qU@(C`@\M\(T4Ts;%W kR:N(18ɭ_]+z%/2MgŜ-\y"\<7,h,yww:#,q<, _q,,rRvYt~s$Q4HT;#z'IDGi)Z«e.)(P% E*ť3y󝯯Dr[*%; ?1BaE;Byg_&@TX\R^:Z\B?G:IJO{,D!)$?Y.zG/_pqI\ZxSY֊Ў @? aazgeYy>T -?gG,S ]'P<'pYZsNpB@HVaj-9b JnuVO#~rZOia?r\PҔ{ (a| C=ه9L-,' aIK囙FiV{|ጦ$d??߹:| WʔF?Sv*Kd9wl'TEHR҉E8oP;O]C">cM J+N" O#:+ }Ѳ<3AIR0o,~(kHoj;Wc8>i-ݴg-H}Qde L@:dNGD]?1 zRrg;3eTuEtrI^|Њq;/ĩRIo;Cs e׵c9[wE읎% Ls^e} n,\`}: MetbAFx)9k:7oȎ ~ ?,p`'GKL-GOEC[sMdcCbҒ!̈́"'Xt4}Ttt4vz+7 ,e~^.?I{0!Q \B+:"w$..xˬ,m0rU"'jGcZظ7ǚŧ2,=M$|}"  qs/B7lzpD1bi/R|ʖ{֛X;|ɬ0Be<_8/QqJCe0ޟa),h%ܧO>cϙ#NLc;FZk6/~*M\bȍJ\ 1|> K9TD Q,W^mM#=e7kXXg9jCǝşH,\Ms«sEU9wr5Fea+h-qz3ϯ~\\dʐf|MƢϵϐe$y5S\a,Z7GX٬Fs?gcA0| 3$T9O9DA K0C|JOALwZa;77ΛC֟Kf#sʏDh ksQVK[1;a߉+Ӷ)E:+MIQ˦GR;.6cҎɿ3ᖦe "l.l7ڊ%e0iɧ1AWNp#y5{Kw(Tƈy9-6mVVjdz2/]"څx{A*ue: {Do甸8 R7%-~i=,ј=Jڙ0JR~挙FS_2r.(KRzj)wNv~ў_=&Ikş[Fy.F$ՍYMXt$+e+zMgS |Գό !'̛h3"vIt $T*Z|IhJO|ޮ1,X/ lg6C5G>1-?TlX'.ҋz*X))Sń`T(d"Y=t0#|\1{bcLYhMHbq=G$ cf kDf:QQT6ÝtNR͘1c%\7y5Kj޾b:FLo!hʅ B㒖= ǥ/.i,:NnM7h}EÊp%CeC+<{ }0K!Q]܈g$beT(ˣ1hGE5 PU ,32ekEKL3{KڠntʛYޑXsaN|(O(<b!Ͱl.aΑ_ZN4 )pu@3S9R0HQ;|֦l#[sQ3]~TZ&"c.?{93R5DXE6E:fnʫڂnYZ+7qǑA9${%OՎܜ]7֪U҆|t$f"?"^IiPYh*~ _&Ry9*wvpk smpl<<_PMX teeworlds-0.6.2+dfsg/data/audio/sfx_ctf_cap_pl.wv0000644000175000017500000011274412140200333021005 0ustar felixfelixwvpk7]Y<%d0K!RIFFpWAVEfmt dataLBWWGVHy{gN !dq 8; tye`dy7+y?cS;//?k@&g1gyh}]cپn/k\$L$nMr~a7ՙ0MxD LGa5$#Dxu oUBM:h.{ rDcM"k>cmR؉$PGYV;gyg<Koט[eAG.xKfh쟕6J"a>ZjaFӋ6ySq8~ob=F퀱郝.|\/q * ۳HH1tLY4b7 A{ QFC<wƵJι:4ZDZ&3>iP}~\lO%`|qtWAHkiҟya#r*[U O ַ\n3L9?Ju4A.R-G;)/='H袐obHL;]: ߿.E919|y׼)=3($#4|>)N +/*?BYB_?.P_;Ɗx~|y^x*Q16#:bGpd?hkc'`{3%OsDS(J5Iz9W|VQ6fK sg:1AԳSj-bObC*FoDёmB-9b[x"6̴, 9GgC‹9ZweK rŜ%$ֹtIg=K{&;4 /wWq--Ih \ Ꮀ FGɋ>^j%R ѺKW/ɊLž]~ܤ4Hu3<bG*qca_0'vk[GsjNH<2}(lw-P~O,׌,|pH]ײ_q ] #r32 YW)%u/v" "O?/GlZ3*F/i)EDžlt5 ^|?E8[ BY(K'|?H,L/N*.f`å&eOכ$4?sr]]PũKBE[q js Nn$wʎLw0\u}8YbDMjTho^: l H i}B$]~S_*Ch췺yKɂi~06]d #ܥ3l>vޑ\-u)lz{FIE8YX]LG|i7oiCX*q r2/9*gو_,3R9QeW|?&K?^#SBK S2Q* X?bSOxڐ\OܢHTux}yʿ!B_舚\Ue@*vj_$ZW++b `dMr/o\BR_!EMeF ~b$#w~(})ĸyE,8ovDO{#=i.ˍz)x)4 yhE1k ﴎjb!B ͢{y!̼Fc]";drJ;On!5?|rzxsSCwN$> ĽUC'l^fMّ5dr:4Ϟ;A0<#tb#gSꐉR^[@8w*ABpĢV܆mj*%82KW]$4Ϲoe"tQhOzV ej O! 祜)]gK|~0i;{߷pvyc:fSK.i2.8V8]:1Ck ږKUU 4syM1B/ 4^˼;r6!LmF yM쮍KC 9 [5?L=<fo*tDAh);@BKK2U\md+4[bJ=E~v=^n|D$6Z$ppcVqR1[lNcgǚpzX\\* Ho8 anDqv"?N/; a&2@z'gTk׳eKB `zUyHvGc`3(Pÿ*j棉*PHHZ^pr]Uc<+5{Ik>Ht9 p:;ݏViv p:A9̟'Pr?],69= e/:fK `f?Edi9Z\4HۨUY. \e.G'w}%#acb Iv۶M"UvթuD2l`*ΪM#(8 jD6dg?Me#RP;bZ\EV(}ZobbR_$Ɛ )^\B,R=NJ`OPbCQ.u4!: z,?!UKK M[t鬔&ۏqjpkB(/Z $QnLnC; N ) R6np`\қІSa  Hu'\y:,FK: 1HOGhT2G#~F ]=}Jw=Hp}Z{*SBLT56oǝP.r ㈜6'uq2Fd)w:e&,ULc :qgkTT!y#PǒJUfdt'~~FU{Xp5Kn  >.A>KAA*(]mn@@_9XeQ>z_یQ`fh温Z/DG$RWϸ!MsoB(Y5@h8Dւ RӉd!1 6vӴz~YPc}ni5JmnTMLRsE7NCa?jŝ"mę3t6w_>5 mWOXa >*JB)huֆ^b#R]]S/8:N@ ?=eS޼Ԣ&%H1`)S$qύxPv|;CrRɾD'%tՂxEV'dhDХ[pZ/,X"f=|Ǥ*KȾC'Fc֋7ob\"MGp!&8}?oyXe3eXhRkDٔhh,dlKjM= Gg=K"H;ܗU|T~zh ֆ;}Sx 0f4{)PZ|'R?EhtI'Ξ1zY@ZLZ|aK Cw"Y֒ <3uz+O$>OyI;EU66v77q4M`7c* E?19ˣ#< !.̂@FcϹ2i&)=DBԛTM|zPg[Y q06uTD =E,oYE^']pzز༏,>*rjt0F:ĵrq9b;95.i2NSOɴ,DO;r$1ъ,7y=#r('NSeJ'C e&jeߧL|yg ]/@Lz*%)<E+Er'(lwUfWwPߟv3G#/q}wJ>iHox<l{y(4ҬTwkbyE,p\ 8+y\KU'i c"4Jғ_gbIz<[xvwL65GEM:˸yB.1%i<, xu|8sA jRα•'0:˓(x5孽p ǠքA'@=Ƴ8Qht"Dz|ɒ":nOgA"Y3ZeY$pS01,1HqDfQei`&X1) i&|~?;~;SEeMuqI1xZ~>Rg{DҔJNO[}ģg2-1>]J\JG[zbё`yv6I0Gʪe~f PfY{<Ǖ?eSj~=[wla5"|#&olkGOw•UIkGKXbysi?*txN%Ey/> KF{s%VN"UV:<{2MĹ-4Әh.!puMa-Jˌ\i1v;j<uhQɲ 9A,'RaQ:?'Op;Ʊd2{f|f¡i'f`55Y`r("{94D1I)ߡ LTv' =S:^4+GD3 VKm "d;َ;DL \xj ^ux2*%He~?֝_t@b+KwLKf2>U}~g/[#Y:@YU]~mK0G*MSi9DB)붴Fx=բYy}48c 7-Saa<ߤϴsd 9z*1)GlxH/>ũ$|Llf?''&6K-Dx冺"CS E `A\K5R i[)f,Ia Kx[>7o>.v5C0D3R)]I$5e=`(l|9Ǐ檰%3ejr\Z>U% H8E()&cyRf?Fb8"Qմ 4S#)Lm X9gD+(FI9eR U`| TZ^rt$VdpbA#+r)ޟ΢#Ss O,;ʌp@[4"ĦJ;S]J61 jo-#l-k;ޫbG띋,)Z+׶C,VT%$r~kyKg;ΚWa//LC6H?R`IPM$Ѐze׫uy6Jf6y)%4 g%YdಔhoKJHd 9 3'2g+YhZ^v` L=/Ctrt#EG6oC'L'mJ9Dx:$?g>]BQR~V41 #9T,U6ms\b:nN=.Mfvhl74I'2ƪ&݅x&)FyOBJSs=Wxx7?WɔP{Ͽ¹ݲI("ЇY\(WLˉO4`s$vW^M9ᢲY PSD.+eipъ9qdoy޿v SnD m-QijeNO?Eha>Vl^6':Ut)Yw)ۜUz!N&Z况Қ xPS΍yfJt~ɂkߕ+v*P #>UЉO-!ư+ІzOXWk2#htyuP<bDYA(y=='sS`%$W*r"0!BG!{f vs,?<2D>XBqBQܩ}0wY #?•M5 LBOB_;nXUbGJX-;L%Q#mM]w:9,bVCQճYuqnqYhy| 3f~K)67ŸSY5뺷d,N>WWʶ@3ˤx[U)s!##ZKj\ ,MAmR p ,&xll&1O\/Ym,~#{r\pDL#Dy}$Q8x% ~k/c$n',1?]?7ҁPV9Ԕ7pϝ(8fmsP&{̘A3DZ׽Q8#e=!.a#}K٥)ϮXJhkBX]-ۼm9gLlGj) "eYQ},.vIp+mټTôF[/O"숌~M}??[ٯza8`4R-~ϯGϢfh5ǃBU( F*pDLDjrU#JpU IH B@Z/{|@s %JF r܌I*V19ڳ(1$VuDxH"sϗ٨\G l7GL\.z%j?H@)":;_ѧ"q*3KY Sȝػ]%0L jʗ(^Mms_G>MSk!:%/)G0J6Xoϭ|?.F ?ŀר[^O(oXzY_`$Y^%.<κ['ه`&F_rpN?0E;Ӑ.N 6o/MqqZcC3B;Jʏ.q3zIcK83 Ĕ*!M !G1!-A-yH? n3w5M hJҁIDz;\6K(ڗKoڟ@^ OגbQhgϋ|b[[;'u@Qkr+⚙ٓMH4]{@9KO_cK%jPݨ(R:q3t,my)ksc>"Ħ=k/pXxϥ[ QItsE/>Jb\˚HpsM$E'[^񟻾9w""/dl.XssKY[z£%s9K%[/!3.t^Fr舰%gC5B{>kCB$bG:=%jLC&X(֎ h&=kb=TGܸ&$PlfiF-37?$HE?e&$&^N; +byYl+Q},͚K$P#@ht܁ Oy,#Υwo]_ϰKR:╮HbM10ι/wg+!0_{ZD:WJpbU}NJx+^2IKhE%֧0Ѡ,Şgf8wn+ i~w ]XlYkް}:@W^JDzyf @֕XA=$ J9wVPByhZK )})="|]UپRs9Fv@ xNDD# X8X.e/6 B81lR,u@#|>I[fK]9!h2uX \TYM#ۥjB2+QA_! O՛|(yL7 ScП7]Mn?+4dk@~&|7zG HJJ<7_? h.{V ]헬r \6D& P;Gs銻uJϛX1Ntf 謹 q^_ZrȨ`l <i+ƬX\ <Ρ! x*JQSs30&y:BA)pR ~t '|Lu귢|0̓gc0?GwxɈݱ LOZOqc]sԨvo/aU^N_T/h ㈢y{YN1:$iZvX8_Ib$~F5Ь ҹuv攤#llKqHO)m}{FCr3~^VD2S ݏ!ɡ;' .5יNaNhCt>׽(i*h焒Q9/񍱠P/=Ded\Ɔ3 dN>[%A ~~򛣬v*g/ʗSʋ6mׄ9 KLHWb;$=?с#l|i+"G--b3?UW꾿Բ18?`-W DbۛAf_| Qe3_ ͘g,AÛeW_If&|p25m؈<^y(6|Tlwl>гK/sf^z6:f8lrȿϪa*Z '}/'kҳ'P(ʼU?.E3t2lK^ª g<,i+МR~ʧ|B7vo%5;E?f\ХF$&T05,<&E^&AoY'@0b!OS ~AiNRKÉ]0jG1"{d!ᵍ%+FfqCmo'AF7}֡5`MpW@qRV%fI:x"piq3ˍ]_ ?<ؑ x}_{15%i,sey6C!l?zUPcxx{q83~s|ږeʎ58 )Z'֏;_lJk "ydZOrԶa(vcq1bϐi.kG!&LI{_; ̏}1psGJr2ə 0_\]r0^ױF\KD5!kqd͐JHI-SN&E煅˹_$r}qyhSq#I]|.DF%my=*KwࢀQL)u|Y}8`\n h] "-G L&mY`jvz[@٘S9$?BK~N\YlPƤKt 35Oo;FO8Dk%ҳqoiO?yBdOO# ~'[8=p[Y.qrCQb?_)Fvm@vZvnZi|I؏Q}Gv"ּR!`j:U3ꉃOϿ@&, $j3!8+>|ݜ1Ν2Bŕi8%UBP^hAi$4 u?WugW9":Ldī/5AXF  t=I̊5IgьL0SfE~v7c 8?| R[dK%JZ uqK@XF!sOՓ?Nw~NC;.96w[oJm=TKĬ֝SMvsAğ*6fx{{Xe1=bE%:e#?̠E )hy@l#1FUopIj]SYsN OpKaIu^N!][ݨ;6DN8'rj7}P֥*]&]Q:o?އtF,:jȋ5!EF<}S?[uRygRz7tl~sMD &:?u.j~%Ò '6v%B]@".{5G^# &N֮ a f\vċY~ዃ %]u 􇿟!L[Epspvׅ&|0=u1^]uJL[(KXHj3u{_=ŠN5`WYjT>O~(oUӇ kբ8>Ic $?S @ 45| ;>!ю .Ed,eg ($]v%)%FP΅orN6 Ceb+SF"%σ~nW͠+0{!4l1!Z|JQ_ o^;+~Wx6J9_N Pۄjz->`KIg\}oȘ{p6&B@5Pbv65DM!;՚. YӗP_}+h)V){sBAi_ho -UD5)mU(娤D5^l.# wyI3q2 d{h ?L;x\Xe?24,>qbӛt3q㔹JZ8rCh&Ct}&2+Y͌.~hG?FVwq95'؃Mmu,4}BjTEUzI;fJa-2!Nf7o]!p@]q6>4t^̜X֔A<ߣ?\0T/n"ЀV.\:Ě7{nyj!Kлp' 32( de- ׄKKZtP&c%zXUī!Čsfhz+߅9F Nqs'ךx~`;eT̼LǙUvGw52H'] ojfvxp\*y'*3=;re0ud-_K Z"8T,T&1< qc.mJ ,EkjnȾZa$lJiߏS9{¦Kä*5{RLDdu]7(P/l:VEЂjޏ@ēhmg0B*,LIwysֈKbk!)F2`ams]5D5 ޺6#Xs {~-(1r"{ ! Kx2SD>u. >)2흜m.y`Bye >EĴ%%l[PdFGw9+v<]g:)O>+ГX 5*3xҖѷA81o䍤_ GCӌaV@d?]T17KoG΅feQ8 m8=~sl -O]a1gszT ʛFn98cYE&QEi) )눛C*t]c=3 ,xu?W?1Z,o1ah'xA@)D!v+ uG6/:NrrW6 k!33=뷹L[,)?U@߰vy76Hʹ9wژX0p &gy!ЩNP+cѠzNߣ\T<h gKk. I<ö^F)kƃ4IwN6>'sVXAali)7W:}Yr03'^}V<;puMo6'c3iM?T+*xr0n5XӚ+EpkQ;;177O܉ 0?Z%7?F)}}QnPaA1[Zص(XEfj쪟Y!Bcq3Oo2:)Rqܛ_i}j7?^鯋<*xdQkm dsZN(Ujj3pt+?}\ :(m \ ugc@Eh8@W^MΫx^r~Jުȟfx[P BvnvC;-i*Fc{\r*< bA 9Ɠ!vw_ ٟi˃Ifu[J#g.W*H!iQC!z2 OVھR?%;4Z\*7:(dN3(8s{/\&ȞWΎ)Wc{8nWD̄GRn_&4?3deB>B+uyA%pۢ޸O S^5 {b%-.b4NsTQ]`Ns/`|l jB by[q `".Hm~)1v x5}ק3Xe0r4lҭWDQr1œEs] "[I_?oz2|#'eҟ{H Lk(SeSǐՊC|~y~$ƳcDx,+&,}I<~ + PqShT0|ߵ9Jr~ߕ\("$ `3)V~Ԕe,X@äawF[<+ydoa,55a %?4ltx&}ow/W+rekM>h$oOaftx$UQ׳ P.5 f$s_Y,(P0w3{ Õ=!< wswǾ}529?F{h "ceX iy|z#'e?0?7*gF [3& C5hQ{Eu^n~s!cX0ӂ˻p`z_H@5U/*0$"DUфW X\As^p]Q'6 SN P@:bŚW @?xw-<.لߋTMgk_4RL`W\ԥ&pƥ)Kҁ9nrfq@- {&_`Ag}μqIt!L]rt!o0o'H6Mtov ḿ^# '=,rA[1N8̋!fVjWGxo{O﷠* w:sYØ*lWB`q23Uk bkjgk.J2['n($0AUGD8kR3ӷ#~1ӤbRe ʂweH~DMĀ lS3&8VU=>C+';;[r(x=e0Cv6xҩBʥò5LnpLZsQHT z3kmxsF 5)Iq.'U-bP4%Ͻg\Snc ~Z;<]"\w=A<a54, 3_ JZ'fz!d;?}Q kkRc4f'w3\P[4!b" d5 5we 1C?cT#PE58*iSϓů8YcUEQ?`C$"ɈD͊&f/s.3Leo\"^q+)T0U{@V)~ ᘎ:hYu)pJ+ϰ|CoMAJ$ -IbZ6D8nn>ڗ**}d$},$kp .uhxkG=~67xyAhG^<b=o*b]|5#Fcx O1UpEU&'m`"Ka/gw{wRCL~&g5?HZUdFXw>>v+ Conʇ4ۨ_π*ӯ3xC +ےj Txpy[~6E\jWƯ@RDܭ,݂H: |W71G%͊gXXK!oWqAPj먆?c"w(wA(PFe‚z|&{dw')Viമrq YZXQc?ആiawU>R A(HU~>{| Cvw+9GT ie~d#ZbG!ƅ\c џ>w|wo)m.VR\h!W[1O}KS |s׾F,ho*$GK5,#r?ua;l&h <6Ј$^51mÀx,54|MpS|9v={OA.t;:"l-JFl(t SGc>=gݞ輪PJӢDRF\_/RF|6*`tCqû_p8b_}y#CsҕjaaPбR[̰֨ VBeOj W*}'O]>N`$2!~f~{L1k<0 -n_zpu 1:!$OW<hOn4g9+/ε)6&֗;!DI7| }:T-xlm3 tш2J ^|b80M97]p;ޛ?G>ܰ4 57!KM]t.$ %5ӳGc2Eh)L+8un|+$kReA@o=2#Z~ǏxɰVt3R* nk`6c\cE*N\,՗E{_Ơ܆ =}0AvQ g*T =R ]Jm=8,0.2,7z?]_?pF4f0ن9Lqk<ȍyA(]g*izSCȕ STe/<{ؚߦ:y:x_? '~ߓ&1a],dms!D de%<zQ(K'w>a 됆FKkYIQU EIĮA(ϙ% /I;&A m[o*?y7M3 쿯hlށDt p)3U #ZkI(QS#>ޚ\c }nΥYȀ{?I [ Zt؅CNY:R4tgqY|v>0(؅ap RZA[-/>qbsܛ?gn} ˜2[c=s2@)n]P&Hۚ |SǙfjZ$bGÇ㧃bt∌Ѻ߿y8@ 48Z^ PoGaC/0q%/Y~ǀKB&?JS$bbaNLmJ\E+zUCDvoԨ)>+xc'̴W眿z0/ĉp KPm^Q?t 3* * 6텫ČyI +TH507[qgsؙ5[7n\ڹwAH3us纁Kj]X,E-/ bBcb'eQV@X_= 9?o.Hܮ c1c׽?O ,[;{Їă[#ri>GqHgԪjh^5\x!`~ƚbxCYufm?Usz5 SH`cxBn=0`?J< jk +t[]7$<=ϿSBG1l|og$粎;hi蔀Jໟos{^s $PG`tsTf,mX/HIA^w.'[jKh"/|w2R( { ab@39 bXiQڙXAlb>ǸޖAaEErh ȾwCS46KF>su큇\ ugn3Ę\rQßixEy0 ԐF6ҋ)~^o< ҭ=DŽ_]sHӤcM<1-O9D%2A+O>aP9}17~\~?Hi*./ʐ=ªC|@@ C6w"M\q R;im8XoBẅ́Hk[}{K\ D/B3ޮ:=PK?B:h*.s6A8OҘŽ+1,VFC!`xAۛ"O֖8BbA*J3ٕ;IT|mP7peJtÄYН娘 @69ZHV Ef޷¯0rXƘ~ (4eiѐRN.κ7-2bfOTP|S5ypiqΖ"󮌜LL͞e bka.~%0c %/SKX0BYEʥgs<>}>9^@p9h#Uq7ş=g@˪,BхɈ1"(LJu5EPQϑ4ЬlYf0eWǢ QKaZai‡ofvF;{gtJUbAޜB'SzAf;?5*Doo9_oYXX1 3 No]/x>, s>o=OD*=P&sa Vs-K#u߿˓8'W6 r檅 B[=t!{TdR5ݼM:]zuzҚg_ZlVJ ==)"K̔zkӿH^G-X^ԭ<՛c` M\JAJQp6=vH^|נ﹙nZ iYEIJ;V'mL4Sg[n/fE9|\)WJ"NM[oT[-.@)"~e p+3Ulj<>߫<ҷlx(`J2;4HFz8ąP-MJD<3H 2j|Y^:h[ogpJ\אŒ:4׾XTƈjo uQJlM9@k!P//XܖcRW"cFXt}ϕIm 1^Q*6sq eOٰ 0lƈ۸cSpsS1C, 93(DD(r 2;Iӓ6{)b'5SoMT8D-oh( ;[`(5`cEfgH*0uoů9pLd[7JkqOmLi(NhhqS4!FBe{iT%uT=ӑap'KĔo5#Z gE %wp ϑm Вt]RSa acj M1ksy/x0MӾO|ߛk}`˥I ;d0!M \ZTC"H@N]s:0*-(&^$He;yy_W:sm؝X^= ".TCu]sxK&h05쇓+Q?w&>7X1؞ 31E:5i) ^%w2Bhh QQJ;X_5EdR^K,iwGMϥkk3@Qgن 3΢BUGgs)ԗT]*灥woy' ޘ TL]%FMOϯo i 9uDۇp8绾?}yIY@<0jӆh%E>[욦H؆$BCvq}112`mVaqIA1knE$b2t(Os#-7Ozk iXD4,=(oҰd8J:F;6>nMsp%R"(Di~5XTXQCX̀f% \\PɽXMq`n#$zѦ|YS*XܳMxGLо Ad{_~\ªC<)cf҂wws|5% Jxz#pI\G"qsM)LVxy $v=W"j@)HmZףJ@mXN`x+@;ϩ~^$vB$Q鱩"Ohۛ]ya"xvXOǺ닖 ?{&w%mliS(2Kb<R6을W#@FԸ# N[Fu}9W)er"C `W饁K<&Yȇ ddC(˫f61xFo=_`a49b9EX63gꚵUNN?抩YĖ3e`CxМA).vአ~ Xݶu]'~yt͟] #uq>^cȠT\,0܏ $P'"5yhz)F$ԯ|rΩp (@qq66 bpO~{CԖl#C4TFvLL8}ǝ+K^I[RgASyzA)y4Z&qa7E6e}pA¨ { Mf$5$`q/?u Br`m#k.;N"AL|YdZ; .@JP1>3q~>^iNZrPT߿О$BpCJ"x}>rk@*|o{&7`6xۀXBAohhC4fȖ;+N6TBƀ r@YSCx>=>|.{N$OspQGtY5ᤃbG]֐,8@N[ewԠkX-/NYW d̏Iܒ#tޓߐz|@lE}0=NdA X=Y`H<7=}<0=F.EZz&F XwvpkX)KY<%ahBWWGVH~~T^#1 o > Nb8#OrZ=[IxjMd`h:Nk~#J(R~ T, *};a3ģf-/)h`RDNfCBF$L@8?sy}w?|sE%]?'߽fiXJ1a!;<};GO4kzǘdԢ[yS @KD9s xV57K4lXwHQÌ{)P,]C^`}Օѥ(D*}ֺgD)*:,cNrPaĪkE@pŜ5=1A0uZPs(AWN6sS r~Ϲ4Q8E4B3 r3⥖?g bt!@Ht=7su 6DVdaV`QT[X<ǽ,O~c)[lVtx{S* G~aM6?WhBc[|b(ѥƆg@zJ.&h| n7Rӓ-yW/2<l"b~isǰ@C'4hCTξ=^k :'5\lтŞlBg_s5)IL<<5hPBĒyL_:?~?d W{_H|ބkHq{|ڿΤjxe0 &4c{*6F0AαujֈTQ6T`aQ.X,,0e@*tbQ0L|ZfCj$uirHE?|R/<]e29f*'m|fƪu̢ wXkLTV||0X N9X,%;ﱶ.Jsި$<=2mDXȺby. 4')0FbXq :b%L!~Y Ka[\3->{;YWm-a{].(sLFxw5yܳ>}?EJH!z1 Pn\.CφP J 'o8߭b5!D԰@y=>ޟ8 EDe`o> 9{[|YaL!ᕿNo¡Otvb{$$0MT9 Zma$s# ixt=(E>p$`)YcD,-9dmIsg7u'.8H!1~ql afvg10qLăd 272Fl@{NeOPݛoF(H Mw6R1[ fB~j;n!YK ]@4ve(Kox8h#T7~]2ew?$P〵_2@8` 2%k[ϗ_އB^az,P!Wc;r95!CF si U}EkPssZ3 phZ~AHЀۢ`AIz>_3x {ƹДi\RDSqy395Ixgw*9ś2}ȭ}Pp*n=;%M"9L )jo\ò rŃ HYŇ46D|rv80U$w-î ^;B9>t덍1voOs {K#nF4w}?י4T"x UcV1p7$,89܎imi bs tz{%g\=?@( l[G3KgMKB}w??x\&j.:T:hZr=lR0=V9䠛lj v*zz4ɯ3ioh#oÂA" ӡE[(Uܴ V^3߳~\:G&$)?y'AALg,& I㟞}0^p(<2(uq aR&`L!n~̿9hxՃrQx+İ ?(Iۛj+j  ❃~e(Xj.&q9\(S3OPl}9KAb49օKuz8p! Tl1kPXiNReÒH.wZHdAΙڙ!K浏DkT%p;xg tjV͒p;f҃g+Z|Gϳ (ں㜚 AJA4|e"$0^xp$/ Is,6W;*_7Ʀc,3 Mh|s]bHϐ2n5-KlPbۯVDv$ e$f4'lٍqQzcgzlzns.wڰvX}zs?B+2Q!AF=TSClk ?{N- iHjW %РA6zNSTfrCɁ2dq>9]C {P((jYXŜ̖ 18VrGN!eWzh8*H? qs|?)B8 xAXSs, FvH-ԳD&H$lۜ'M ɀsXXsICt]:i豙y ! 0mpan 5{6qQ&@C^H醾oCU."T eNB.*|nvhs6mCx!(k]phXԐP1>SETC41pjx腆s.tez@B۫^~uMDX޽qs&1%) BbEsA3b3 j'π'1|Ǽ]LnLx(QŠL@;2av2yƲPT$ g :xa8EE5e2qDXC1fIp7U`}'|g2!mڄ4pܵK<*c?yʺ2?ҸEJ䞫՜ŧPx:l $1 M`Xw"`,lC23a/6y튆:5 >UyN9O{†4@w#'vhd SݓyP qI#;級CXĆ= '됛0,.l&`cQMg`34,s av%H`5&`J.#c>p8 *@y'=-ASFsۋ߿ j0/A>X'wBlPjxni#6)wKGqCgI\6?{Goֻ9sF-+ٖ~pz'?chj&)[+ b2tH"\/`q>%-;rg>C; \ ,[T-ygK.&UG I`z_Fj-N" ,w*ƌɋ{J[x=plv* MAhPuݖ`X$K=HEۀ?ha9ܞI+7Geͽ MqðppNog0Y誟^2MQ8:$6:E?O-x,QZgSc ?~s[p'h2ʆbI|1t6@̮7\HQiM#8->{`sxJۤ 6X̄*VecB +09̨0c#4P%u${1<=G I[/ (v@UXmCAC}`Y{N҄-HCnS0Xqqј|ߜL6o63oYIʘ= W \ᥡCyI3B~9>†; xBmʅNN Vu* a'MJM'}l^ Aih(, BHoPE1'f!t2x~W >?g-f6Z:P0AnYE֑pԲ><[ev$&`7R##JK?ٟ=CP. >49X'/;wIB J0EbD`֖R |X&Ƴ<{#00ֽGV#U ЋzX Hdxt ?`?r~G=*1(2OnF@RC|- |"l0 ¦LNj/)q& ⻪Aef +*8O݊@2 H$xS,soG) ^  k3m,+yF I( $~* R?~qd)U8,,c3"A<ɡ'"$ÌrenH ;:2dG$NEeV{hz*uys=L)u5Ig4n$DQaq%*z҉ՙp#ؚT^[ cK[˛960#-ؚ݊Z'%{@S7; ua=#uD0An# gGb͸AHM\|2?k,Vb!J/fnI0i:ATR#,G\žH'̐`U.O9ai4^\(n'g<`z8u>=jH?zJ 0JAR0T]2p;S lpI^ >"-#xj%[\Pԇm(Yn=9(JSaE/QX"3=|VYKyJu犗"~w.98I| !Z8K0*XI0NF|L3alZF?'6)GLQ rp!09~̆wX>tY 4}//$C(d":됀fge2.eA9P<3" Z@Ŝ>Qł(VC@mLMm:;Ӳ0:`S}|&`R^0 =h*lyxe"{qТ0Aea̲xiS#;{q-JBb8I kxCsGpDTа.՜;&gXXC ̯ٯPQm P84͸VO6H&{lv qCxƢ3pj`=k$2 \,7 D|xtci?.!Aҍ'Q31 Cax9IU9 w9'BD"[%C8y1OhtA(, Yպ; Fs`$Lxw YȽ X U4l)7ՉB=[(@abxPI-Ҙ.4âcAb" SS:VFJCIِ:,Rw@>0F}_bB9`{,JA@D :3|Wr>9H>i:8CAvf7ϲK8$1jE hC%>Ā(sC!}X!!wVzw>XY $ >s3dUFOp+?5!P(4?:S[f!1YbK擐=K?>!^0DOEHbW4V;yA$&- - ?_ 'gց|Ģ,\<,@Pg`8?f/YAmL }EA3>OK*45w5 ~z]SVg+!Ax5ǰ+8$0lt@D%03W >VD;M0QO3'D/98J/N%"/?yȂ !=x<$Ee\ 6>0B`Z(*fXs8sg& %XHEJբ$lDF ТZ73~$A8p&p/*4Og:@ɩer &Em$?\&h9*b$dg?k] ?'b f,it (N+lHȐcxrl#qz'HcO O8uńXhḏd-JWLDY 'nA H4`|paY>k0DW',9)ŜzмPO9x#!1h<( ;D eM|): /*#(RRbyCR<U2=3!>C*^wsp\Y|v %;8P9`rAv(tى}A|Id\'1?sx^zT} 8 q`įp+%'FA BbQ߳srC^P, M(pgzmr+oA f8bL4aE1pD7"A@"z` 004A,&@1FUqa?<H5C34`tA]<H(Ly@2PyF&qD8dPPB>G35A:*fLBXF)QF3rQ?3%7f c鉋q `g8H430DP |`" u &J?C0C`!@`p5D, h́F3p&: y ubh"a؁122 @# '@&}@!*X:L@С k=|1/`~;?[t! ~rVY #NʈU^T:m6??H<:->qmpt7TOX R%$Slau#A{Tx全QVIf+KbQeW8bXI_ iT~*}e~m:Y,_:M :Ya7<~NNk=CԡƩ6]dd6m|cJIH皥0;{ \C1 &ܽG:m?C˞@@r_`0R UT<9bT *0oQ#kC__3+Er' ̖., |Vx+pO{:JQd' $sv1?cvmW?d=!;gK3Csvl YFH#Cm=<l< }Z]:p-~o@ P;B* 3,egvU~+PCj-eOږaz~L-zAhx~v^xwrH(ڼ^&DSeѠ/{ia'[aʃW:sam0.)_m$AX\ug/a1kxUPbMQiF~ϸ"op4lH?(@)C$ufL< 8=?/+ɲUwIY` ŧXg+Keql LYM? (<6@=tJnk,z&xqqx0#?Z`a?()?F:^`ܰ[_Н>:{щ;^ט%|q%_jrA߱E5T@:}ɵWXy0 >s !ːO\XCx+ïN: >'~3ymTLI* laD 14Ԫ]t5ɦ^jz^\kjZT,=8EftCiAz ثͥ=g|J}!:"za"dL,V'|AK 2ȼ̞B҆B]a|f0V>S,A1guKj]O 1XV+ m10KC]2.'ZQyߔz _wSuqɋm)agvgs(eCFx^M~$ 2p'=5vɾOsta?=OQKSfA4μ3Ce1s0|^A_XZ!7e|MH(i^ )fub޼fZGCJ'(׳B c_ =C){ R G,b_!d{jbmد #<MyaaWC#ӗd@řƹVGkse,`Zx@?h0̵4|f2*5@g,ItU?'Q^2wa 4ؼ@>t>@ժuh2_Y[ߧ涑{8)տ6Yޝ?ᓸ/_pGZܫݚ,uugsNni~zC,913(Żrx$^(CsEIJNRD0M-XlОa`8/\YK]).{l%f[fgԕ F5> TZ ϻ<) c4:0J6Y %wOcأG8\w_<#, Gf$~dACh lhPY^ɓrڴB0PW' ωc\&Noġ) Os$x" :3UcBޛfA[ q}+uPL;+./SҟQ[`u,ijS-DScY\;Ҷ<̟dԣX1k,c']YyG-y85D2EI;,QouP!;ѯUq#}[j Nd)=#1 Ẋz _~ &UeTͧ:٧KH*SZB\ܼ%L=]DQO=BSƦ `mEOzflXhń.m/bq髀nϩSuEU{ 8_}6++*ETQ8g}cz۟y($ }~ 6W$笯P-4@%3w0Ʉ 5)&}k[_OHocSӣ0uRi,20UcT֡L4m3?5|fOȥUCJ߁=*YPO"Fh8"wn}~h>p 'E5LPngu ] %cO5t&֨X dc@Tu%NO`KWLǃ haW{)/-pgMEϗk>(`FE8Sq#gLL,U )3#?-[l'}~ǶuhII$%Je^W 3uO2V(VZ|}w[e59{ ]>u9C4/TЙGeqwaxLϔb"CleXpfIUZD>z>٭W? }Ss0Pex9{\-cK^3eX K| n_h[j.iw(mӦqb!9xhtiʘF eأm7,f͙85. Wyg1wNAa;P_Z\>dUL+GGБN·s~;Vb3 Y䯖DQd;#j.b/z ;= >"}4,]ߏ(ѿw/^6rmkQȘ玾X^)Ƥ"Jv>P<^7{,Pldz{8}]Kb*ԇF~;zGG]كE=2ƛ~V 0<^-i7>Ϡ~Zep]%4 .w13?4˫E0.)}qZAw &,ѳCC@ɝsK8E&&{R>&6Pe}V7wcw'V,yyXvG4Qym I.Z5At0x>|ºz%#Hjw! spP>_>[d}.Лg^ e`V 6m~ڷY^JhV&&qھ+T5ZM&w?^k$~=>oHX% ?4?OsݑΉ!6S~/^HΜ Zu):u{=1%ǟn<l Tн)qViѴ@ďЄn@H?wgH p$J0iBjLcBZM'P߮Pz5!4i^Pǰ@yk+Q`թ'/]ϠsjXl!ޣ} g.GY2.ܻ[+ſ I+!E PIdwr&$q)= 溘ZfK0aVT&*+"#K?IUb="l1y1GNh~yեStD$ ,hra2 M N7oyy'Z$duuC_YqФdB\%IJ!w|އ6B˭u{,4e 6`t+q'&Z_5 Mw՞7&V1-)29q3lШ8_jGC@iL iQv9sL3~j@VuP{RG-zi4ÉRv?6e)e 0NM"͈gv9! ha)\J% q#ݬ*Ў$n"D6]wEt6kL4"`!y/w!σSyjĂy/ O%2ej;@93&qnjtzݫqqIo|t5v KhVQ9+Y`cb?9'q $HgSrTYVڄw~V2R9>`j$3ueȐEe2Cp_19zO{P+kByí O}(φ䘊Y CGW~ݵ|M/@ssN%7,oE)W>1CkpGh BLVֱGm>ԫ]{Ӆ2xOu,dW&J4Η3$G.<1:+OSRdX1!$$*M?uJo ϧ|68v%z&8zʜUaS8xWځUl>?R`zɴ^b%Ѿ381ˡ`oyTSĥfg Emy w{770{"#}& ف1*|9!i<,K!2g cAY5dȚޠB[)/?[} _x`皘w fxoH+aaPؘ4ULyzUh{^NN%Hۡl0~‚t5ψ,OܹscDaS0 ϡ/rjxAg̤~p ю5.3Ec#,cQ@*%kjUu bQzNWo75`/kBX~NBM>/Ybd_LFQ6~ ѾX>RgF=;a6Bp ՚kA% v=I%,cH`ȧFC;[js͂tACj"h;L\ ub.br=ɗ3X$:GucFT;="Gz6okDzG WZ/EBY@4w'7p wK"+ޚ`f(>!?raJ+ʹ.1|cg${?Dw ETy;-xk.,S1;THڳ8UITNjb4'_iNc>fh,]I64]HPo`5D8Eg @np6Q%.I O"rs*70Ui 9_oLJvYT4^4v{7J*w#rVio :4&gc]54)_EN?%Vvb,_@a៊|-YHW\P&I~^ϋ8}N8Uw*p [cX`e -: ³4ơv6[ [C(ks#=@ Qzv(P )eC-Xݍd`H=|ha ]g@/IPczmw7.53fɗAP+N;NBkeqW^zF8v" B^t*◣Xq42$ 3Z\,Tɤ#h/p_Z=T036s1|եXb?E=k .3H),9, _iYa.Y>d>mޘ&:klx*ہ&ۇXNQՔ/#/S6s6a O1rY裔I W%0Yq]VX O=)D/z 3dg3o@_=*;\wFK!F'CNo4TOB!ޟrcRiT|@w6`O^R٤$Q(KV~ F8|1m+gjreu gqIjchS!F[*z+^*(g*E.x&-MN,34d}gv"݂ gE:eBZ\;B 5Ǽzpωu4kZ wi]hW=\HX3>X"q\ >(O3W| #٬|iNt\=~Y}bR}SڃPu l&/ilz)10z(iłS+2 DEŨU{RNen)Dq2&߼;wEpNXm3i~ųE>~] ,KY[ $58v"=vw[GlԯGM ?#5^ ۏ>20dpxPӝgi\B(DN= c*y}![ԫ;2,gnҤ7m/84+c؃5[833"<)r B@t3\!o~GeAXBŔtDZ;tGt]0`'GHv/r<>CnpViU\5ivfǼBYbSSr3E+X fza,.wc*K~1U TYfdyA&j94>Gf}r%&mC^DeLE*K Qi ?>aƁwc7W5xgdPR5~QܩU?ܫ }c򨔟!YI;}/˃9+/4l T;r2cV=x !7 UXv-2~Dž.(C #xT:0ZsR"dCC*|f鑡?!5D^$ܔMp..Ԏ9: _kP0?:`o"2ɯ\.1:x$6KH/_ rP4ᩅg(/1*jfy:˃oJM™md6@$:~!7E*G,'U}pj2Ԃ8 I+ )a'BofaQ6hu塀9Sy C}NP;k"ءJ>pAOY]& 慅;|:a</Ȳ62CRfqydbP} 2gl\z:?wʠӧ4*Ty?bF)lir4#X0q5=Nו5C }eAMOQ`%I '涀}08k܅T;LC9G5}C'┋Cp5ð h&bDB _bUS#ypxPhè }ZKDPȫ_qrL3s ژ~96T O(Gx©Mrkhؚ,p "Uݯկ{t^v?7RC͠}}!%>Tc;Pz\#⇱K4rt0LjQ+3N?Zn`&zQJ3a,f05\4.LI4> Kv:xSeҋV|td+E 1s +]@zP @._)3-ܯU+RS?}(yzaCބ2ܱa ÀA惛~yA5be#:wˢ:bN;!`z`BLEˆՅ^]>U QK0sОxvz"?l2}qfފ5-o ~b(&PcgxHO-\xB[+%k3TD_u'Az!6 옥;1) '#Яp#}Hszk(B|A^z$jS|\Ӊ4 bcxCdcqU:֓ htap6׭^uƗ™U6"Tb;? <X'ab?Fv ?M|3yWQ lOyB'P8 ?Bh᜸8$9=ѹu t;ՔLf:UϤo@yh:UN65 uȡ6?dp#'X,*I܅,ϢP.>PƥEo>c~PA;rx1(#O! N~`7%V3Ng3Fpb]l,$/5Mcw&"Y5#_cųOj<̕QׇElƨh(Ig 84E ϡy2qBu^DW0;SC,>\34 :*~R SkpgHMI91r֤\8@HF!\*N.G1*<3wvpk$--]mQY<%EBWWGVH~.X:<;68Ri¬p x,Oe|Jpp bklf$||B&*N!AIٙƐ,}."$lGI"hhB^Q=ys\Kl31JB4ao&ݚS[0.D qav^[ET|"_[=Y+,7sh ^2q6yK~bk8CLȃ{L,5kxZ}XP ?g'6~=F, l A. ~癇x1s091}#C2U W024ƊBwofUlvKƪd/Qʮ/\ҒKcZ̦U>QR0fє-ͬy! s;اY>$alX?&p~`  'G(dC7^": $! W9&{ռ+4:c4EqW gA\9BVy'_GMzڼM٭FLz6%4A"]vqj3=kD+/ Ƌo 4{/F!j.[?}`73 >,rT!kj,} BASf8 e1?9>'x7`C.ڠ?أәcNt[@TI;5yB -*.9Q[HzWeף{;4işK|lLYo$Da=+/ wXsJЁSIU41b"Tcd,%dj;$#~>0ɉ!dx{~.OpPw>UBʛDG7G>uGy1,,hZ&=3Wu @6@\\nU׾;5- -A:C,,FemX'1 a3cj'~]?hbMTDgv)K(Q?,~I4` +?P+Y8I .J9 ɓI4s5yKr'CĐq$0$τwa.\K3/dGL ࡅĵa-m[YުWhe8Yf/[)x';Qkၻ?Pxp9a8{G#ٸXo Z7ɨ5<Ƨ1c&xt9tb&1OCXL]l/g̠Оz(B_- O&*y=ꎥ"]ɥΞNWO1bJG) rVD[}oVꠍE=B6reaf] ?:29.$NܳC,,&C,Wg3!DY!h4,)qO%Q9:H|30 BO EÑ. tip\Ot,h(%Įp>| 9\f /Ǔ}0>]>J`.G3.V~޷ߺ۵ oc|t»ytPl>BQXqW sʼc\Yq0 7% $ ?s<19HO糕}bWf}NC>|j3|hÉRo\MlDH4;,ne𝇮.6R SeQ=j2DѶ{},t3g`Ky&(bRzt8cm˕IT|U/Zl_ۡ0Phc)xa'B\A O?"9g?|ךx ;p&wN 7((]fϨH M 2!:P+_ݢ޽qk,.OH M=e;Ҏƨi"LA;?unx |6·+h쐫+#Sa19$$N"c,PiuW%LyC ؉< ~.`XOQɊf(ZaS:\Lx CBras24GVY5_`w~jSu(9;(y'.L,GE= A|Ž~p d&1Β?[`g ENP T A#lP[i& aC&0"wRR=GD9p1frLm*H9)ڗFL^+9n5GG:p|8%;%Z 2XI%qo˻\'YKuD`G2A? Yt?x8 *l¼ĕ!(<#qぞcc g`hH̉9g8) 9 hCB03׼M* 1a.N}RicN__Њ_:;X!aLE"-,K*QLS{'71fbk3Xcй5!Xdy"*iH HM4Q#%$|tjC E֚w"=G/C,]&yg).7>;3hpil6Y)ՇM_z&] Qa`#!1y}'^h]^'J3JBՆ",J-޼58ZHjT0 Pяix8#H dF I|'lLϏQKys4IP sc1SʀgLP[>7tA@Gaff8XtsO(_H*|,*d>0P{ǚ 1< ]:ksɓ8sO mHT>_BCZ)T͔̳|"6rp(^NbHXc ZAw,RQ+|qL >Rf_Zleqڄ)3!R.%, ~(P~l!5):?y'&^C1~!Rq!zC}he(xt Sp< iL2C@ 2:g0cɰN,Qʐ5f6!)Z|j)u}k37=CT1HI~Qg߇Ck:&{aZޭޒRHe);pȇ,9L9 F;C/5k *> 9L'9;2P'rrO&BPz"QQlPSwuNjiR]P;B0勫<8Xи*4c#D6ꀚ:cNHRH]6\mJUZg\|Ll3f8apPT* G)6 Q,3bADXE5Y`M7,CC@}  %XSp1>(3LD^Ry]ˤ?чf#{ R|܌wf4`u ;p3?S^R3͖'_r̭`fD,L 8nRB33&?u<=$XSZ?RxX4/C$;ԄgB|&tr0FjC1>ӗn24*CeNt\rOTpb6=t0R_% ʤJ8S{ ~gߌY(2?WORҜ ~| 3 2C< p@2gyG2'މPbs8BH R 41JaJFՌv2Lu?czq0xBW lak _}ԀZ.k_8/;9.394> TCZA*Dm|ydr(]З?'w`` 6 ,}UW 0<`Q T$R@ bdg!ؘcȳN7Qv`w&K)hЇp圩\gy&v<5xp܀Xn޿/Q+O;K6"Kid9B ]p}@)N\0CS҄u1C6,Vl4"˥P;E#*x#dƇ3GƏmjG_hfRaKbJcE#gS(dbq a8sh |Ga aLaSGBS!׃M6W T𞄋)ك|P\Oݾumu۷5]3Ŗ'gP#t5>abxyN(d 8+`c8V(; #=< ,* f9a9p{B8#cL|" Qa1Cl@1y (₃vh !w8:vb,3%ꟚZ+JٟAQk8?|WdfK""9 _;4^//"5p K<$T b LEf -p Ѥ;29, *~ g#>pcTpXL #L@e 9 sT!܄MG hBH@~ >8b 8(ҰGfjpg:!H}2?OJx>Wh{%L`p?dQ8!q!+.Tɋǫ:LMAPwb92@V5OݙQM|@Eb(qZ5*x9֚ v3gg '|@4L@p#9G0R3KxtPAQpσ2' b(Cxl8ѕS RN3RqJgpzp2,΀$1DPixkT@8ƅ}d 2?; ;.q/!?BW ϔ!4"D:xrPt cpe46˧6#-:o2D1= 0n?0?~2?4P<_@D!\A@s 848!@La# 8~~x*yT> Bp2e}F<+*PX!s+A_,'yiOo1bU^}l\{<A |I@Ş':tR$0_dbU 3~pwⲀaʒG(%CLB<gLd#`F1 2)">D/ Ïgpg?at," %Popw8HarI%> pApP#?&Ȃ0bcso̹Wn-U6Fqa6\3#(, ;`afyJa}zQ8C F  0LOg l O G|G@>xP 9j/b\dg gN-L+,q h3 3ψ"8!(g8( AQ'Vޚr|꿪b tX3v 'hL(@`b19!2P|X͌~7g͜ςc1Y:>So1zUHR Ak= CJX|Jǥ w-ͧh&ҟBbz00z ab0M ~PDUi>h)qM`< ,g2Q|~f4Ee"W,T=OBKq`9V Zrat4gibLc7D3O`?"V6rv zm@ާ&j?Hv2E!=\`,#\i3O;+6@D6 36Dty8qP, j&Bà 8<# g~z8MrFB DrBCl 7]Q"0!6fU*Gӣx4y!Qa˜tA5m.WuXrȳ<~ -DLgBEѡSO~F:D d!L #b%D>9qrdLJt؁~2C zgbkRtb+: j>c3S `\o~fc>X,*,.3%lXJ Rx=lg5&ꄉ"l#) #hL`h3ApP\ I,?0&"< <$c(BgxLjL A?%&gj(L| I LL,)@#7TéGdcx*vivJ6! ą3q]΃.B@]7dH0? (腞:"ȞB}(! &"P >l!CO(s󘀁@Ud?q+xTm0`0)(C 'auu"DD#tH]:ptk2Rlp(& p)La v9̾Ԝ\ }=t^f,}c+J=8σj#1al3;013|U@c`zqt0 Cd&( " Q<p#}3<` B<;`>b =-0g4l|'jaԮZߦڐ]Jא gV<}a4\,2g<3u@w7c +OLGL1=' pBB! '#  DR' :Dq(98t4Ar_'  ,/3#:XU k J@'0%0\a]l]geUU, ߦN )LrX#GQC<(< u5`gVDB X 3tơΘd!O P0 8"x@:3>@(`S Y 6$sq V VD| &Cl!a0Ǔ!z*-h=1/mvVdn7=ʉZdBcNJ43c.}n0b0,XXP@#R<x@ͤxTD1 fp@:ҘP#}HEd 1p]OM Hc ̈x,`(}&/b@sN@#p4P:>!j@'0`fh_?Mп4 õ/?_$_ I03HS|^OwJw:Ab/H\/7ȩxyq:I?Lf;ѫt2(B 0˸?k][ f-w5-`9{:Wdp/@|}ǹ/m:Kx)~w6C6 41`cx 3h Ρ0FGا(ES@&dPq-RDȔeQnb 2M켿u`\>GT9ǹkՙO4UqJvN2wH<>L c *5s?~fq'ʑ(] 퐈im H `f"p1p%7wZ|] "J<D@h &.\J#Dz.D2@w4DxdP $wkz4q1d9znQh NFJP=~2rp$^{ߋ|"pv%5-"-@S0E̸?b._^Θ?hF#II ;Tt` fR&Q$Y} ?7P1ѬF-bߘ!ȷF+A1n1 Ih?< YqEqHpOGċoÛn`Kյ)>dPfRq\P]=4 [ b#wa;t4tYց)-d(2^=ȏcaQֳfBϟ5sf2IT wza]My8*T{X"Xv.j=R 5wxdkρym`ZQ.Wc'XjPzz/rvh&{<>+" +"+i9mRR(A h?W? .p9pUоH_m?j+??oRD`peY 0gLeO'Tbpƞp߀']Vg??je|`;b!@s k;诟 r1W񄏁w,+ϰ m 8!uU%d}_G|[:|]Dp'a "V;  5pd-:\gx-'#],xa(]]k)1.IІk.<͞a%b?j%lV: FRISgXu|E 0ήc ui<`tWs "ӺZdxS*93XNdH sVC.jzvp=(5=8ERB9ڇ \dx/+Εa ~l:Qe@5+T-4VMqQPN"lq#X=!D6>3Ӣİywok. ]sk Z`{@CwDDՠ Fh)Ajs8g3%EAx֩ݨ[W]v:SokT'h%5@P%YAk0ǚ}2N4R~U+ ]|ᵰ)}^kh]Rn2&jeh9ܕd!xo[ &\j)`gGfVuw8Ob"q-;#E kٛ~>? ;h1>]eP{0( \UaDjs:7D|' HMy{~P!Æ?əv N!m<rp[Gbӯs7owM[ A'_ E&C*2Bu}VmR'<|fO"Ufbp[cctؙ[,xx~o߂̠*(ݕ ZW>LI R<_5?S$"{_l=QAБ?{_k哔H&G~aBx&⼠]vϓ76C\qVPgwJ!_?6?UXʬeڑV9,?_@RXش ,wJ% Ybx̡ZxbC楲 ]YR'*^z]`1G\L goUPlUϙ[t!^ LjF[g؛没m^5Gp>D,X ?^lvյ.^U' X'k5X,b.Gv`Oڴw*exa%>qa@r P5C o\ˬe$R!Cbl:p5p/S}^Bݓ H{K N0n c@\Ur"ݚ߀cʿAl7BĜ{oP ]$tt*;9jG+W>G<rз耭xE/G3%g3OiP$9Ц0\Si}k#} 2y=@zˇNɄ|Ɯ&@B^a|A9čBZcRʵ]xj\%$VB2K.8n)AYo9ν;++ szg웅PCHu!/ vX7%mެ/R JIӲDu$0gc;pƺlnχmqK9!wo la|ǃ0rEèM ݢ_??75W#KiY"ˀ+fG41AgP5(کZqj q7Oz'|58,k 4lq3O55SeM0w+)h-7 _](sBmLbHL[ZL)Mn}+?/e VF` z)`tAwJ\lMފd;@##"حc<x GP 5If"H5xȕ`w^nUmqdsYyɑ#~jKߍcwaN8{MX6ԛ@~w\/.>Ǿ >w@]TDAł_ @3в6oIE^i_3~uS6BL^605d%֊O3 _eWv-lna=pC<㳵X>9F̸f}iuK""d_pXtY0]\ZWFkڱҖ{' =Sx=¤i؝djtm k Ǐ`TXD1fH:QSn\ʨ$C,)Nq20#t7MniKh6(_>\QeD_y&I3أS WuQ&n`8T\6:p|l}g+qM}%_ݜhʵ`bv1f0^jE]Eɿ=-?XxF_@%8 ~}ϼ!9>3@TG +/MY&_`|Jg?ėngqnL3TOɜNwW@]:itP#&*uܝswK`p\Tӿ7Rjv\o^o~s]\bQoV{F ߃?hF5L4[%ŘtFj;-T { Fȋh`1SO)ݡxgrU?{$7 Q^|J4= 9XkDy{8GR+/X~q͕BRk946W?Pvs_ Qϻ$wawx=Dv\CⷯQt.[?IjKp≯sJ ;3!Wন13Zn@\yVx{C7ҴWlqϷ߭fȡxr6h`ƣWc`ʸd!5ĮR'{9$@Jriik,Lqհ'nA$pw6SϒT[N ʇRۍ\t7"`v2tFF'T)Ree[*/1UiUو8Qlpz4f~*.r(|VUfK$EgXZ~ &Y5@L>ݭ,x`}Ʉa[M*Z .7~Df߸oI?C*. u@C vMzw1zAaJSXT.]#cS8  z>`m/#f#B~k9YN7}Mݖ > 0sgɑ\t# 4h^972ƻE*6̀108 0ݬؿ0*` koE~-e C|kp=đ9j泺p_$O%l" f]equeSlAY|7z<5sƐcOA'`orY{qX:, +nr>CR[HfBj4 +~rWMMq-k g7޾a߈>K3X 8sۇ&oU[CrRh`#ww@/ `YL+2vp (Bx5rJN\m30 ө(l{=} bԴ4:)PD=Em^ %YEpU;6LDtxr>Yճ AR\X**CkKG!'$`qx3.p7f>xd,:6/c&IO? dvԷF304V9ŷ9YUG޸,{+suMkE.t:aZ y:nu2o0.Q2_.wuNbqGϭE̫'1*ewA|ɏ*m "~GrGK/9#,)Ad*H`he:x]0G7Gt}H}kp`Q13!qbCtnuYY"H|!D ~+  =x%s4G2`,h C*1'Aݮ;16; S~];1fT+@-=z{x^<4Likg Ė3Θm+Br , ek!vHBtp}Q8}Zy_zw{wx̴/k['!G܎OAeS*v2u&yY)‡,6ЀG,\i75r '>{(E9G3 g:,oWp7 rR9[sX{]ʙ-[:Da+䟄"*Ai`R<؏oJZw*!+K @-rtA޼Wбe?&1ĝPjr ԭ͸ =$((|ݰh$)9+GW,#mOWm,+>dq$]#߈`^I68_Zʮ<Ӟ>WٞEO,B,62| jh'g Y7;ٰR?;BXx#zض'^Bg(Jwf03 ?Ry Zukď3$VC/?,m,1\H=a|=]D}Hk+Q2GSk: >{gD*S}InU݁y P՗K7yInW'=rT0n2?aZq08qҐ֒CkdweYY5aw)Xrm=~5Usa=/*20Z+'ÏRf<uf >5M9fګ8LëE,#ejюlmhѩyhP.yB/yQj͢e5GZ^GRU5-@j7w+S/]nz+ ![K/nUI ^"? i?oiE #t[ty}iʺxxVŅobm#[_ KSvB I̸_"݇cd4ךy"{Y8ݎ}P>w9E$F(FF/̙jK20k.5vH67Lc7zhgbO;we1[:=nڃ Lj<˞k4§, lƻ=(yֻD0Yo|E/'0Z480Ի]ec>%^~ԔyM>u6 Hx'TُTLZVD&IUaĥ kgAߙ4Վ˾î`g2&Ϟ#lY(IeD*׌Jn\i:C pc:kWZbEL(*|1{HT9+rM]V\իea:(gL 0q>v۽m$%$Q EPgJڻ+cA575awʲfVxx҉ X޲/,Y4? )F{Vgm[7Q&jdzͶ#P87O6}3z`Zqs 8ΟNMv48!I^y项 J0nAE#: \B#bZ]Y7 8L'\Lu/q=GVD?Vܪd.kgw8G7u3%?eg>iԑG#2]sR Žg&> &7IK 7A X \:g@$ -XXZC ⨚g lCܰqh!W q smխ9e0fK|2SxeI/6QRq5e+<ӈ|G{59~S:*mu2|[L_ٔs2r8*ǎ qWvfL\Jb\QN)̘aYח;EkL/?>|`i7m"HB ͒%q=0^䢮5z̏;o[Yj`SG&pafo-&]vtT9+A8+s&k tmbpkbû0'jP'V,ry6^À-\ߴ^U*O~0Bk@ Va!eEʦ|4O` ;B( ~#Wx9<<ĕ4h0qb/9&ݗj~S^@T1wLM2L\ >iɿ1;8>`TW ,8oߌy\Yp5)h'ِWؐWoR_R2B@"'"lE>UM^ C-D I+Z󶬲~abuO&y-NDڙ^ ݇ALW!=G_)~јn2"GS_X5 b°ȿ@;g3xyy;''mR3 xZzt0;!x8ify8KxcO1<Ԏh]@x0Q",-1EIg(lxqK̀GR0.cXUvca3>Icc .8S܁sc5V\B/$AX¤ uON8[ d2F _qZ Fteeworlds-0.6.2+dfsg/data/audio/sfx_ctf_grab_pl.wv0000644000175000017500000002451012140200333021146 0ustar felixfelixwvpk@)DDY<%!RIFFhWAVEfmt dataDBWWGVHmg/5!& ~  1e`]m73?"졇"0 3 A؟Yi ߀! a ?`ds9C~CalhBCÛD3&=ih.)b̀4\V4 >X> I F 4ğG/h <@%3o:@jN>e$C` `4px>΀G̀9 p3X @(3(NxBNbb1g !C6c#sXxq?k_{O|W/Ӟ?wiFGS]ۖ)iZWߊ/^j292m e:eޒ^^܇N}|oন罏??Wos*AC'54t<ڷnq֦ϭ+'$\V/f[^2?q5d\56Xʘ`ITV9+_*vn~Dڟр9ŬO+?yk| V& ^O_J{i\Y6<^K|l`[) MF*"/`T(9 T,Qu0T]"/˙Tz%zzyg $_t4 9//U7{gd؈) 3TWc֔'<J$2cj4<谊5& LƢ"?ZoD@򧁘"S@wb^Gw5HMa.6 1RALNTZLXGIPJ=I{Q""hVrLQ*Q]&0 m0t? |U l(I$n:;hztTq)1.-UI; Zԃ=B# , nww ##8p{sHME8.Oov\zrK5AÜߣ&quyMkmUu\3?<qդo HXz;`5,dC] fP&;r:w:s2{w bMD_~.>p5& )#x5ڟ{ gw?3>pš,$aoR_+0++_羵|%pלSY$28+Wt_ޥeQ׌x\[$7ZO&w"F}cܰ‰X s5·" g{BX0zz9&s  ZhCS2Lױg,,<+:7_# 3ow5 9{V}'$z?-WF @d_[j 3 x=E5Zx"Wn\ȜAFkG/ <:noɫw_u//ųT^&:*= ~$Hz8,s )k:838ؽ-t|Xȓ$Y?Ph8-W|'!h|%P J10C wB^J F3k9|469AI:b0"`:6-2>WRlԽ$lY)r'Hrb/?.~Ο)W0|P`«'$Ebo:0Vǀ]p'4}4L84wwK(0@_fB]o=` ?GVzEEU|׿$)`_LH%N0&$Azﮐ?uzV|HhgGs'5{ӖCHuSn2rhQh騹0.LjF9~`M7? ~V;W n A,LIگbsYbq:1n #)5!Wq fGF}_q'T*'иut- `!NwGbĉ&{q}*]7nYt3\ h6#1Tる uwkLZwotoe<EdqoPrB5rw\z`B7qH㟢Z%ٜ  'WƬ|Ӥk` j2ܚ*_P`$Cz6w[; c|adSvPp$Mll#BX\{%FyM=S2P@p802ؑG@_9 rj]FlY hZ /}|  2ø[MBf-,_UAlÞ+fدa_UY@)ijm8 B`5WáX+92jj⁺/t{פW)T-O$c |mY r8LMnȬlY lJrI4Ji]RwܽfMt3β"+XvGGxSczopz焚>èE$Zh9Nĸ|a49y~׶Q +ImxAjڲ͐n 2ُh"e#" ½F^ȼ_ 88 g6(ftaD"Zi< mǹ& T7 dE`c^EV'9m_+ؾlmj$΄8xw 0rĚ|+Ρƕ5 ㊰@lgH9n,o#@no`mS1X:"6.7!a :c&H %`p!8ˊ~m11Ʊj4%]od(.YEL:wRbj!b=Gc{ +?hu6u{`-hjfEI@fJ0ypo'-9=]!ޓ|< ZgK9J ׂ2Bo H ‰-ku1-9oſztx}>} R3ϩw3-x3Х{ۀO :E ~ ]+}! qٷdݷa^9坄th$,Sjf{'6`uۿC߾/@pPd|Ef)&YΚ&"ݽ4FBhj.yiއt #vp~ȣmz$NIS[72` 6s6^e}+!YFΟq?m'G,}1r x=kDtFG٦@NL#C U[_x߇hy[">)dK "_]O x |mG;m)Dėj?g?Ċ*KbYRLZ__E (n 0XҟZkT0we-,H}Pk^^;M]$lHs4m]wS{iZb=2Dx "&\%lCǩcIo C<(.H=Tx$5oD O%s&-qn5eғru:WMP J]!%81q  3Ϝ&dōn| qrQ!pȣvfE\.'"Tt"|ץBhD! TYQ0漼 nT:U0<`yN'tm''F<)]qq00]BS -9΃֍GCv_6!2zajž LKR\vbo62=R[k2R]2uMzUELvGp=AptID֟ue:{Tuz(9`lXc߉EQ/VFaVV`@v &g[dhfgxGW&j~'<Ex+G|ojR|߮q̓ KRB?rUEvfNYaXF?#aVn0ڋm񩖩}r ~mi%ۿ;Cs]=E>WpY{E&oaK~I{?}r]j;%]n^Ol9G 'V VZF'KRT?lojfW/3Rv/ٵ'w!HY(%O/ń)C)rHX 3@k]7SiR~.p~>?L+ =.&?X`toj5 J[Xz@l^Z. \R꾚ҏ]pMq9A̔ {jput殷I2sB<"X8U<4ڷR)*a8+.6?k{5L"6LwR (AVE! [ Xa+\%-`頧E'؄v9 ]r-_Qס>b;9Xxɞz4opf5248J!b)L ѣzt-}'H''!j)~= 2cdE,NOSH?xAQ[1Թ2#l^H H$zvo19P.~:O\3.N(yJ$3{"mHh}ݥX +=?@hVqulGQ Uxu$FSe`9SWdC_\B&G9#oxndy9?Fߖ3z׭x 겥¡ 62"Α?Ԗ}YFՖh`113Q!{N(`:x1h򅄬 LxaXS!oE?"1b@pq/ʼnR|^m!K,Ua0?9)qKe .'ˡ`f<_ թCr/Ӯe?ZU *(Cī<6%*" ϜLW_=6L3ߖA+Ga YTuL^,t\n?ĊMfzch9@P?93x~(OC5lT޲Ep:3B>" {Fi[?u:o{ChtSK~{^H3Hgg%yb.k^a[q>9$aCa1;;H,lOV{I lT?=7s#1Q'įx$wBJnp?xNlJ9 ,CL!dqsͣ@syX6q-~Ix!hbr.cG @ 9e9t&g q+OAVQ3mMR^v'gB W$ ȄI]]IGtϡ ?4F"4:7p #k7qK e2ݘ86p V ,ܘ\!D|r"!Vf??ל9y.]$`xx;RٛyXcO6bg3苝bttzE 4 m1=H!azqn]"`1nga&(EfGfDܸ3#x"(葷W__KzYw4!=ϓgaM$$,bj; 3aNfp,L93|:,|KF0T Ea`'%}p`n7irq B @+3Fa0p! CpGuÅ2b˟XY$4?!ǃ!pP[})!Rb@k0L)GYqDK,d?fHy&[SoQmIDGF-> 9b/rMS `[k<8"~t&zZq6ޅhvh C< bjݘeqLȏP`crYk>ʷHqN M^"p2ϴsA<16sra-Ơƒ<fE, 5C裇%=E3]y V Q'JQlAgRr1~F=da]Y]iπnC؏"`R\}v dFCrG<?d,ӠBAOfX%`}@1@@΂|f\<69$5s^(#u,'_<Im#E_<&P^&=QHSlcLs~J$m#C SOde [TI VV.F%E b+yk=&V{3Xp gp!w )0qlfB> V{`K{ }̇ZRr%"9^,1g1PN瑡ƦG^Y yz 66&IJEC;\l@< % Ak2'= ^1dƠhhAT 7!q$˔Q|8e1 ?s|3Y')`k+=%L]  នC7(9 x )1`>Zc@púc_ >r~7NKSMHʸ4+гGBjSlA&neap\v`5`2OC([#4HQNDt0@L#gas`dFTcZgl N&cfag@<""s9y`0\5B@00<>K``p|jGĎ6#Y yD5CYP3sX0nI (3)E9y 8Y) j }?9|0bxχܤD' 0UGes,PlWMa ]9 Q^2$3 Іp "L 7$~?҇83\  T:qb/##dE 5f?p.Y/OʒVZT(!duh葩`79!y9&9||qxB6xGA|?ɤzbozXO@ħK3q[LġT?cRC teeworlds-0.6.2+dfsg/data/audio/sfx_ctf_rtn.wv0000644000175000017500000004161612140200333020351 0ustar felixfelixwvpkd5&]Y<%!RIFFXWAVEfmt dataXBWWGVHy  \ e`o?=e>,lC1 m}s#f P{I13UB '3 =~, =ĸMVa@n)qU$J4QEd%ޓ}Bs:.i9|۔Z6Xhu\\-$OLO265*4Fc5%QrfɛeyS+~^V0'3^8NϺڈ3xV{m|{WugwQm/M}RDOgw)06x^Ԥ^ཕ7-98:Qqm{8-A?)%F{Mixo,O;Q=@ɞJ;or\6!_P+A&;KcwI?(N91X Mt@ :0yb?܎[}+vj}EP?@`V !}z{{zma7&9 nsP673i-Ԉj˓U \FArS>xLohyz ' _SA" ;W͔߃$暣sꀀt#O ?{9?s/ OS=`쫷"7qa"aš`L r Y2PA'(9%2:. C GGmZOFq &xtϊXH4|>5?apn'KRMlsr+I`u7qqDL!2v,7l,Jzquظ6 ,M0)YAG:|xo2X^z35|ff`#j~_USE0Vcu60/x?UC?>X-YtƛY^{ Y}l;nߞ-oXw3lᜄi򤟯π1FIGA8%d~h\]M _O-,}nq[(E۩: 764ACF9%'(|/(6H9īsE.^7p`=)&]^ߘӝu^";Ľ=_ U~mz\ʆ*hwbyΡk'c9} \b>}|'¡d3?]PQ-}eL:zQ*}HGR+?~ k= HSCx.h"=Z Ư| %>vst!IdJdhڣg&S}8eRY ciu?7;) Y>O7t~d?4"Cg%mġSg}"|=v9VV4(X -},Z+8x\j7)ר `?DA(j!U̻3LC?> 00ɗQۅ?~f<&P2ăB q 6Dl Я.&_7Ry1 ^츶sM<" .b4ۭy2Ag=>yH/!_lhˉҧ~K$*<<Әl̋wEi޹ƢLl}VgfuGۍ.+ExPP?Y WP#omus_Ҫ2>RWXNF~n*Z]#0)|=(5ps?Z%Sz#Q!:PԐQ63d{?k1Po(>-7ʇs5!^¯AYf_y,42u*-GH ex'5h>!i_ZŽ ]H{U)e]/Mz+yE2Q>{fߟ^ʶʇ&e,z>+!Eґyo}m7H0"?%$9wimcپg?WxMd5{FÓaX!֐jH nwcpߦ9"v-GW\9*ْ6HAP]Ok׷LFc%A'@n5)zõGWʲ#OmoIn^sMX"֩N5nG4i{;}װ21p~AITkPB=l|evki2&nUver[>>.0wϵD/[}']O6w݊8|{cKp9[7\ h$o3]B7<i2٬|PtRsN~-D1v\?Au)&q!9dù菂٤ 1W&TޥXضx_?fX qbD4)K>N( y{н5KsP~rCh{Tz*V/OeFw1fxOݼh" ;Hg []O`mf>#i'c&U"$(1 f< ;NB2&o>݊+~jCO͢no+-EY[7(n9;7"eK納$%cV=?Uf-9WbfJH9TߨmO;heb9zw8h7s r*f40H{|9BTAM!lVr-PcOFW{\\`7|l&* @w*|~<"hW.*cBR*¡/f!P,խ{ =# Vu;XLÇ /IŇ ȴ7q(ƾ.?ļ 6o\f=MA-.?N9=7Ճ~3oX`NO}^iíbJۯ2zڒgi¸j„:g?28&wHu!Ï蓹9D52h H{F%jj ur ^ghsx$+A~D53|\+Ԩǻ篡H$LXkK^Q*>O ҸбQS=);DBTOψ85_0M)@ Ӆ:WfsŶ<>.<%~ib*JC*NAeڧXySˏp蟫7\/Έ\7AYh=@ p)ެfW+!V$ײ&^'@gn||Vn `:?qDF-mKOgN0*Jo_{ӫ Qh2J-Z,.WwC['Q5 z_cGgB sp hSyyp؄u@?J-ѳ4߆:m\~tDKN|1t, #;Q&Sls 7./`LW4bݏe]V+|М_X;wXQχ +Sl-=+Z([+6z[{˾$ͶSpġm>@%s!˲qėIV_g0k2s{f bRg][YeZM1x%1>Gyڽ^l8\+M# ~8\@^ =AHEЌ!R`$v"|~_9!˸69*vu~."#BzުsxrH@b.wXEp KድO>{2d`Ry) {V?WO9y_)Jth+D"Ўܘ˕X -̓-u9*层&*9]n7g< ?Â@jɀ%X\T}J"ݘ9>s0bLQ+P2Nj`L%1oG^zi6yV@iƦ}3<;)xt'cIϳ+aOuD3}`zEmJoyڒHSGN (s**udcNZ8P> #H"Ւ,8E$ByE)(~/a$/Xzɤ'Ty7]igZ}2 yߞuE;d[@󡁐j6{IawpZY>OPo||+o[&fr|zhkk60sZ;ͫb4-]i!=~ ^ ЮJ*fteUr^q7=Ї~Vh/c(rCsWƿvX} /ʗ-3)Zu&0iN?4]Cv?L ]keIBﯴ/ Sf/]{[=vb-ɁMVj<#ۺ"7 =\lv{%I6K3AAc2:205mğ/FKУ+ؚ|G/7umVb<\.rl.5Ԅ`>)ӱ/>K?癃n鳀Iŏr:[oD9A=c#OywR狧7gEHs}] }mXC捅 oOfqY8K;6 ˈo!6QKHvK{~M?$=X=ZU!SP ߫3 wKZ\ $?_Uvaui廉jp A\8VO9, aÌ IPEۨsR4%y/{axȲP(-#{vLz_5 !ނ'`Ӆ Ɋ}N uoOȴMw{>_3:mT|ha!U)f+{ ?"+o 9qhy~i*s\*VI®֛#lcDMK$X 2:}]AœCGf)hlemH\V"S2yw g ۩:@oECJKᜉtǺ)&;6%zۚ/It69s)OJ_E[|% =4,Lb˔5 }$qO4 omʽ7[2~eޘK1\N ;|vaZC;9w$oHl>˒.kF.`ʖ ,LBtyN^pѳ`J@L5!{ sj9K%a&hSH ('GOƟ]gkӌu #xJ>iv|,joif@e;bTJe朑 U'X|5 Z%@ nD"qL7?* %Ŀ?e``"5mBNLĨ:VSkʾ R$4!lLL"d =׺̃~4-adQ#?l(ri3,Q̤'W*>u@׌5_+bdzY!FFcUnÞͯ9')sAM-/+ dsOh{!H24<%*ccYkJ}3\\ `*g1]%b.G\+&[Vs@юwp&1Yu׏ˍ {/!{CLw-%fUKbFd\VLDCyJ/B|15r˻\h n,yCw|܂=S$_!bJe+OJG|Sxdeߡ4^V i,l B9{nCQ0_lFˌbcdeGgj@~nҬ,+;/`뱤L.nwO\/1@RMf`?%p~&b{fM$u22eC  NjX>FcC+sBg %9G)b*iMlH#1NTh㥡E29\>wãV;}bh;OUFtϒU0n-lL51Z6~͊wq(—?x@8a{SPE{%eWQ/ bXop=D6A s}\k"QW)s?q e蟀ـ}VNA:}e 0*(PKqYC&k +B 3ĞI?𕊙i)F|q緛/`I5uͫI4jdTs05Y#9taØLf`|l`Z1Mx5#(l5`Iy;` Pɧ#,? 9c6A7uJUgPÙ⟞Cȣf5paE\jTrjKrcEAU&H0lh98}߾K E|ph,]:ÁN]a.x&c0#ǯ˂|F^(Ih9ߪkk4*ZѝzyDZbX늛h)˰jC8`#i%H~Kɠ=$yL3VdfB>QWzld&S޺eu7Yx`"8*T9 m &]{sbHOdx(˯tTfWxljqMѱR 8sNTusp$NujF*Z“ѻjQI"WU 9.I]0ɵwe_Ҿ]ѣs'/=jL$杛XG"lT'+,#":M1<ۨ܄,{>|f'5)b}r9C|%H }ך?wtbZ 6!Wny'nH;?/ ૦FzK&*p]1Odqv&^ ;:H\()-3y>Hݏ<{c?}I6B@<9YW"ݿъ ِcljg9.`?e'kT POƋb#Iè +`h|ܯp=G+b29hwY|22 ʫؔe.xi-zBg ل8`BaW2 .p^sJw-} fĿi*I#*SKz9-r3; /@ =#^@kFs/kMUX9bw,>CK،70\џI'x"o#"PbC?|p׮$e?޿3Dx)3;|>*sfمd[([L.MaxEL@ +FWTv z†:~u2DTL/ouPg\usQ~ւ9quWVA)P| ޥO&NV0MOkQt_^JFX{-Q:MxQs2a*qcz~9@9gٻ !(W=_F3zW}Y͇$!D! z`*GAM`qz;$oSb$~-~Fse/¦ G:itf9F>N"kؓ#Or+]A͎2Z, cW;i_a]Zȗ:rkB%贬Z7I44vY^ `,,a]NzdǙ16F}i Zf>Y֚$N3əu!,cP] Zl&*1ZAd-|e;%* ,ٟ0K19X]NE'aUEHkv!)٘q;" ]bk/KD`y_M3 bc"zK>12[wOC)⹰EXA?INu]4Hկ I@ZyG!b845>9[}#@9fi'\Ty0 v 0OMeq!r F9fN& XV?_.,yfy {XS=.9 ujq`*lC0 \yЧ ^Hb޸kR%fh)?@Ѱ AP2u'Y #>؍zĦU"w^܅u3K8ZyS'Oҿ5Q([`&=ٌe,]59OS\qS5VBzy*ˋĔkަ՝dBGÆm@}YtFN=CdKOv=1#(|V C/o<!E$=lֱt6dDJ[Ij0.8KӤ>SH_HK _|">sCbIeW+Ǖs&< 𴤺3](PT90g>-HE.ǂ0vuvfg_gjVQ $Wi,5QHh x϶|&.uM((:>81 Jao CyQ6 nw;3è|͝0'd0kl?qwO"1jRh0JGAr,(NROB+*tq-l;*iۂT4g\ՓlNP٣:` 2=Vg#D#!N]@Rs %`N2xw*Xl+aĄ+yɁ}]qgh>u_(f+hmGk}!xeZ}x:×^`9鳢C7C0?bɫJ #>z a3SS=*-¶<1nű iT\Zk 1<zcSp? Yg.*pQxW?Kh eA>|q/ ,."onG.[`=YoOfԅxܥfy;E ^>>wp qܣcwҤɀ5b;ªagܽ0+_,04J *6y@~#0_ޙZ#T*wDpZ,H:NֿyR쬵@X^q6pUŃ PXW`r$ *\&VǕ_a E)dsm a=@ۅDUq.fsƁ*[W e8`rmd%hlIYD U9oLΣz'OL gCydH2I uk>ȺbCi* 9 ; [1X~Bo6i3L&L|!HѧBk،gLĶeDc찣}=ƃ5wO(\y#;iݾa"G/[-*i2_2G Xq-<} =#m{<{AKT9D2*QꩇܳiL?"ݔRbJ!qȟyWp!F|r-ZcazHxOdB{>xb9JAw9"e.JE?Cqk1X FL+D %+3b$ґwvpk&]f8Y<%;9BWWGVHtq]\$"v C o ~ =RU"gpIU,Fԁ&;W2j,N>azH>eP/yRV:sJࠞo4v(2Y*7Z;(_HrIG /rX, dv/1XįϨl{P?]y8ϟyWzoF!kP0c]#/ Dʞ!Ok3f<9 76Ef(u2A֛xO~MD32bf&ގMvS[2\Nk f!T/5 #00y8; ̈uG}!PU~Xn)g@qK v D8ݗC$ !'ټ2,1v0w@pR ͌Œi/;GV/fVAxm|p4ƋEH5X0\5WL[}g 1GӘXSL#Z%*g WY^`&j.1G pey$@k8yL{̕U4=hw[zqp4#y^D/1L9S3󊙧 ^KQ+clfrN!~}g|ᛰR gR|HBf äS \M3 ,NR 1MgjGeD7 {q;}SRMp4t@DА?S);.[G<&V *_ $?}u@\AKمCyV5d ^w' ӈ 0/%ұT+DrMUаʚ@&v}+OI@;;{e̹`I5sxr/Q?ɿF2""X[; *a}qߝ#O VDƉʄJ7L߸G ^@ih[\7ni( [ͥRp<EXB}섅?b ?{>: [5 i 7O^N ?yoye[Z_c)yUwE` 0"&׈A[p2x%-M>AnYaҦvh_ϓSB}xIɼI6fa& , X(G+_W<8wUxE /ݡCkWi6F?oԃ)^ ';j $59De\t/ fυ3pb:;c!F=jnV@0+s2pΔ gItIgUlK.GץH,i*ʣmcW@q6N&@=KvxAVJ/C!kyƃ:jp"(>j(qGu*ӧf.F~dO߱9bP`0j\pwgZla'o wdb'yG?C @in42cTπf|(({%)n¼W ,aBKD-GzZ]Q%dTr%jy*Bz8:^: \h`+[hЩ8FF O>(R># /ݲ`r(}c2袍g,YCC( c߅$4. =s0PSJu`'a`1:1H l~6>'b@C@M,H3 "٦@EJ=`>a ʢ=*ݩ<<#,=]$ +>&S"@?P" XGzHO 3gph2pHgaXL& $3,<"  MT 3Cj*ap$$CzcEh>c(A0(ct6t ?!@ýFb( G AX!z& `% Kteeworlds-0.6.2+dfsg/data/audio/sfx_hit_strong-01.wv0000644000175000017500000001062212140200333021301 0ustar felixfelixwvpkff3bWWWGHJVIeVKveI7>  7߿Gek*߿o+w>fW[~/D~E++e;g_܏`^ß~PyDz~{a~ŽV|X=qR.s8 \XpN_|}Y8]NF+L eLr>f.-K~d׌d~R}Raxȁ,O|}W{B3d@9)ǥݫ^*129'ID4^ϵ =ttWcdIy͝7x>SieRG_X qB1RחvFYş) $J֛$T9bO`ձ7h؛@ ]M]o;7Q9W*͠L: b ¹ \2)/xQ"=D:T𢏤{2 ,}㮖>vpyfvXZ-U7"ۉlJhW@fS-Ui%u&4k;3u(u~g@bxbgDy GEQʡ` @ʥn ˾ >g0SSeC-Njgl@2mi1ww8^/5̘BLɍPzj1‡z#r=pjR!q!o3qoGW1fl|8)y@b.`M|.xhQy wUp<=!an@]mKV~/d X9nPZps6ͩDTN cOve>g渣&%f3|+|-ȦFqϔ//l ~h:h+Q{g-]> _h\/iOy[kc {&wU]Lgn&&<"BSH?fbcGfx4EMI1+ȒzgCgMlFq:ݙf}RkUbmG~+,eȂ4V3tY{Wk A6iw@J*7 t5+O"u\#%HZ>% X8I|ݵ%2֙\[[`fjaYkԘaƂ,M8d1hT3Zꑗ7:m?W^75 <쮭36vw[C:Ǧp)? WP]j`wOu(hhĴ\J=%6&!\΃} /Y N}߁HpΏ(] ʑfBi|xẕ(Ƴ/IZ9j@ ğtnHry(5J" vü@iRs.$ ҥn_ݺx.s3tI'ip<6cN1hS1&7=ToR)eNF;1pU,Az=9XzJON>>B@W QMsvk3|Ga9cgaŦaHV,GZ!4~@j:NfHoЉ@@%%3m 2譫q}^ j'7›k Xe7>Ye*m$nN {PLAw Ck p6Q/pn^-r& w>*55X6XqSݩ* ^YLڿg2)[E.y&i#6'!9ieX҃_DՐf8 _Q1,DtV$V2^֯u,+asy6UDcp+>c'(Ц}fLy&ij@MW] *Ȧ4ƚjJ9> lwwAR.tZY܊wlu0$h2B{&Jb+K>Uܡq!L$DrB.^A^@U uWQHQo"J)P+UFʒV+NQ6PN↻UQV/Tݯ+%G"c}r&y T`]T_a-oI1zoCIO௅ĀzXƵP4u 1I{Zݒ Hmkz?Μ4"1ˋTp-a#lSddFAY(LvaB>-h WWrL2WH6컣!6_z\yL ߿͂eC&?u<_DZ&ܢ,)lĂM0)ZmHL)lPk#bȆ@ۂM=BGBh8bTe /B$ Cq'N Aɒ'ܫrrQϷ% jbQ}-pUġx\9a)Y^1p\t#^?UYcި>rmr5&/|a ӰV(l:w~_Be4qF7 }ZLg|e#1JYT@$t8dN@Z$M=C #*~*Ybx{]&8@Ő-)?tp֕1beJ+ET_APü5kFۘUbD}AX{$<# [aq Z>QL'\>DKpP׌-ORԇNtg$E_!X^Dteeworlds-0.6.2+dfsg/data/audio/sfx_hit_strong-02.wv0000644000175000017500000001106412140200333021303 0ustar felixfelixwvpk,nnk׽WWWGHJVIey:Ir;_;eߍ#߱JU>/]"DԯV?7~yw{~_Tq5d')GoS]љ:R#y ` ^ՓeËsׅC @ITŭ0;5:b+Ю]>7:bpľ7 г}]Z;"cQD.gb Y0 i]HL'/kb'z }F:BO\ 09嵍,T 1Q.V| ju \RELYC#TEu K4 y=(JVtLĩu6? Yd3H9i:E9,5b֨X<m>Npuj1o}˨4T5.ղYΦQR @caj@օ˭(˜&D&C!07Aݤ*&g"ŗhC@Fq#:\<=2WS6lp n:skM& _Da[hrəf.[[7}Zn\bo l"axEy"]\;8Lx]gZhZg1j .o ȅyy'5Re;W͇AThm0r<ώ$nny T)&bGˇ(mBSҿ8\"6AO_u:H od4F,\!3Ri:)LLGnMI=PXE +@I^QL?MmU4⌎*x>cxV)֔r@nPj0e;?4cՁ0?eoE2I3(E#fGgj+Eucbi*Hu_n'WgK2jev,}]tVf3 F%5dS\q1N^.mqnUD[i܂-gyo4;DΜ ?#ƵX/=k,5^$&"f*@5|oJjb\@E-PUvU0w3vec(8eŊ&:|yFɨYŠN,*F-u" V11tv; TU(:fG=߬|ͥAIa,\܂T[/2ɣcQ,,*(ַ($ ΨW ba B٨\-2U~o:3fzIIc>퇸 xn aYxBb+i)v PĞ$PJGW b>#p4,$"Nc;uH $MFSuqY5 x*[/`ai}]؀f$HosݣMf"63s3|2UaObk!D{BT~[13B5YS)_oj/ hX^@a3#س 7Pq/`n#!W|)}Okqڍc!Vjk\P\;=jlOzC="]df,}od#։nq&Z))h$,[~7q7[mE@~6=ٮ?4sR|{zK> ={0ڲ9^Xw ނ4S PM 6J p)-"=G5W=eus4{ڙhQ{w%>|*h7 8e<5Nn#-P"wzT8qbNZrIEZ=/jp6CHt|+@̍姅; ֣"]z$x%-DJT|3aܵ4k 3f(4W$wLDN)7 lS?}o >́] .G[h hڥ"Myg.s{Cr w8 7*csR NFrt=gD1gWV3\+}>k>/#[4kKw_V>X +_xRm Gx㺶ͥzÜc鵡xB+uqHBb&LVHy7 C b aLl#*lA )[]N;iy$-7qq!}XdC*u /2av>L} a}]iL7'ݘRE.2a]wN^LLpݹ4Xr<re$imwwO_~h#]>8 o<10!i5VX/HZm9Ls_XnnOJUnN=! q Gyjоr M.5DP@raQ Ɍbc Y07J$^W,<| ئ"kB?[9єĂ6~Dqx7B :&1C[ھ*`Bt>JT#|pD52BIhkLbYhAJrC,xwMy@90pA>g:·-:hpsjEC.zT?3j'2uDz%sSy#K yԸܵ:E&yhg{Jw>y$²% , אF3(@ޢ#{%FUAZ.x8:9vʢE.y@ke]-%U9odh!e1hKM4KHGa奃 zQp4Th%|Dteeworlds-0.6.2+dfsg/data/audio/sfx_hit_weak-01.wv0000644000175000017500000000770612140200333020725 0ustar felixfelixwvpkπWWWGHJVIe_,߿q] u_r+_k}u#~z?&?h;fr?}7LwYuvFμ'p('?grRԕ+I7wszi?o#{*#ߜв͕eWƟN7Skp:WE0X3{cxY?G?X~+_5:1Iv%yjv PJn ׿(X(S,4t <:qȉ# \"S9 hD)x-7N$&τIMd6i;#~gȯ%^{_%ROSKPXNB%K؇v*M$B:4;6tvvĔ/dMc8A7dpJx)_XQz`*y&h)o[u9)5SBAer5K`yh52ٲL%Fe|#C8Υd}xM*xpwOmTw bheaV"3mκ!q~W-VzUa1QU JT҉:sˎhf4۬êA nbǝMuNi-?g{0+@!RvꖔYvi)]r?&]c'I28O#@E3w|qmv%iFi0q9j3f#Ö+6DT/'6~ kӌ8DiP/(򱣪޵0Rt6AXesSO߂hO3تɪ8m^VfW'hMtwbEDŤs3Ԓ7r99uJ;T[6ѯW|;)MΗL!UwcoՓ#)'ՋT$g=H:Ec|7jaI4@D-9w[i:Z.^7#nJÛ}:v濓œǵ;/s3 +(B(Bf[Iɭi[Ni|YA"?zab(Uvqt1Pw/8o x9i:w$]:b:YfQ*pOM{ϚDfտekPX^hrH(luϖȶ\ɈCBS6J0'a_ .+kH۪ADP`Ce O9$*Ɏ'KR>ƄT,+jXܘWKe PDBLD%*Qt6DшF7 _zKn:!"8 DYW>Akd0oxnn37G|윶-c/'y8 i2><_m 3s-$[gՍ}\>xGyb4,#أ` ,A cnd >-vL=\q5MGSo~> & (̯+k8{fbf[AD m`^;_eG mopA`*ŚgijIhG qG&F#9t_fU?Ҵzpnz|}XA!(iU/] I|٩'WX8\*ǟ\Щ*t."*?-Ƿ 6cJ:ɫ>RFaM&T$Ÿy {th_$-5OQ)mj;䙿sٌN$XQn i `}qrO'G^E2Cl%y5b|h%jlFc VizFabFMr@#w3ŞP`h' 7ZOla#;bAf{Vx^]nA}9F/ YVm:cl3cl6rԦ5WbcGZZV4q6֙PêO'dbSBLdM*qʸޫ@eYP~A5X1ґ9/n 5[`/[B"8:Y7 MŃ@:HW-G'᫾8: x՝%B~Ow{v4H}('3P1շ rb,|/"x q$0"_4ޒB\&8Jꌰv:%.ԝDM=pR)VsW>|-%.O9PV l_a0LpUG$`h% zY|Me[eiS 4Zg(/ᄑj8HV8sgwbq_Bı.s6 zhx+w0,qZĉl,9/̼xĉ%7G5.Xb%J~`^CVHcT}&1JҴG! (,l?Y])ͨ M|(@2Б_$@c Ѐ%(M_sH郘-#tt@HD?Nѕtmj#;teeworlds-0.6.2+dfsg/data/audio/sfx_hit_weak-02.wv0000644000175000017500000001100612140200333020712 0ustar felixfelixwvpkKK#WWWGHJVIe??Qr/vߊ_}ӑwwm_-V?w1<?E_VO;aL8z:ڔ%椏qn.gO?rC7k>9;9J4BiUW~ 7t3}p$4(upq5stt]&ɸhK*1oSʴWvXbB#)b,GOtcqgWݽ&Z *Ah[UAT*4r1ѱ NOET+2"r m*5K6dՑmwaY{&*q sOe% FvM/nb R0,InG \ g5յ^nK\vs&z2 9[ :2m c&7\{" 7\5q1zTb" HFSXkƢoQ~o<16>0NINkmg!<@I_V'*-2¹skD5J9ؖkiWgF=1:]3db$oi9Ҥ\eR((/$1+Er^ 瞋O\$v&W>| Vw=_2TL!3־-t'ipkQP$0Ku-|?4(kA1 d<.FB%^-S9멿#v{crwh#&(KØj3HV*_i'f3Ht N Jb"PU'd2 @R`kB"4RaRzWq46 \PcF0i京mRd r8x)P#* ~2k0umD& X!p&/;Yc.IU>d0U%P)o_$( 5 @_)AO 8|*`I"Lkjuxv sjM6-r-gCdӘ(8vz*jX>cb& C6O3_Ҡd{M{fC 'IX6sPV+p.|g ҹ@WX{e|d >jiǪЎTe!<W ?H rJ d \sVZZ1o!4alWxdLTX2u^VOn]wCr̠*X.K8dnͧ(6r w)T1_E9EtA+" # s3l%c3/e)$V|ibw|l3 C 2:;}!w>'<, hGduLTD8ԌPeB)%Urej=ke")z5?E+cME,*ӛBc}7G=DJu/:;z %^ҭHc=,q=ĭ8 YV)¢=ۓVL6Hcezԙٟc sCW_%U(俇aj`3Hc/:Hpȵּ&-U {!aA[Ve2Ơ<4ҝAHoJ~pvU`nEh~QbJ 2sgN|M 7(xR`SMELU_XA(g^;nLt:d6٫Ga"n5C3)gp]l)TQa0%Y(Uٳͼ_Q^1w «b Z|FGU4oM%2N?=7Tޮ=$}^p*:#ķ_E2yVѪyGCe@4H`XSFt6S_AiZCؽX3ĄJS $ߩNmaRm *wSoD'Q{0_YΐͅX8fVdUiQͦ^ؖ x{Jfn<莚V }$HHwU{4k9ov=_scu<@W_&7JUI?EUKU#M֨с2q%21 ЏKCl)"Az&='[pT=4T  `i1,! ̒Tj|\8>y2d:Fˤv~i'oly$>E[KU|)XY;Z~\:E-tu;Nos$Ƹ_r84#ZmFhz 8?xq - j 6ɳ (}Ȁ2岥0uAJ@G okq JH\IymGnkƟnE* msx # H6*A\GsC0`3ONtoz'dihe/e[J/S&@/[n唺K:l3)VoU ݽYV5}d NKgDgz/䫲I4dn8&ǭˁ,&hU:M9oCT",tS,=88O7ɑZTh٩[&@>៓Ԫx5yQ:YXėF̹o.5 ~dgN8v_1ŗ_a927m%}ڗht` Ұ+BmƾQ+^>ݕ&D9]V7?C/4}OQ.#{c:8J} lmQ},tLQ3ew>jIo_Z\Ȕ1gm+5DEu;xFpp{Hq+Xx4Ehŏoz_Tj'Eyҁ@.(z;m~M)j;~ɘ9 2{bIuvq$\ż I4Rk ( ׭ewϒ 1:sYVW1PZC [+m4$Eņ']eEn>EfuD͝3=Gm`WwuA]إJ'}j,xSZ6r0-%Z$SOpgRT& Ǜ`/W|TE(^jq.b4Ui?]r屵V<-}u\Ƭ#!Y`4*GzESnŪ5X\%3'6ћtAJ-/9ĤM]{zRF4_k۾*|' OV_ B'"I(1A{\ olX1ێxhb"^M0#ٴNZјYnr+%& Iy=c`r}DFR̩xO8a' 8Ef}ht!a'˱v90E,wj|`D@6M%1)_C堂?/PGG.q\1Sf uzΦa u RM9ΞQih!_‚E,[Tفx=F]-JL<$~^-H@㚢Ho/Cd+v}P*<7آDbQ$8g v&cVIc_U} lY rDL96#C}0V@6>(\850XrV(H)49`@JJp 1L4hteeworlds-0.6.2+dfsg/data/audio/sfx_hit_weak-03.wv0000644000175000017500000001024612140200333020720 0ustar felixfelixwvpk]RWWWGHJVIe1sr>ZD +wU]/F_wu߿P+wa{/x7vksW[اusex?ƿWGw(gЯc?|^O >*ݚo_4kI_5 ϰI+wt%+[gn}pfaM؅(4val+M=O=%.Sx%nq~ Apd>;z%ͮNXoU;7>̥z^FdN2ʇª.JU~˂BD6QSЄ"rt g"2 T"?VQ_桖NM:)\(_MV@N]9!W%PcLbeYљܠe~'+M-x4')N^ZpC#ys$q5b@, ҹAaX["~oWNz8eH`"$H/@&- Xі4tnhR Uhܐ4ulX@b6WA`р(K=Lfl9(s^(r}Rl A*%Zx')+h5[:?, zpjm.^$z6,ِQÔfF wXf)IYrFA4 rteE`\%J(@'+ ,n*aϟȎ}a:PbYC*- ԠYwm%CkA=7Z6"sN{ٗIn[=wdc &wn! ;3-boA;SB^q1FQCܽx[M%>9z oCX%~ubdiԪ7㏳r嵯TI(md @ %w~ sqK')8YĘ;z@$BC&KdR8 PP3ג2L%'E4>!TOwt>1B\ 24kLú\@s< 2) ԽtSK3߲f-:r J/w@`JA3V"ڨ4rV',1θ1iw(Hiе&Z m΀{v|,56+w=RQsx!6I+ J@.c9qfX#n3~DϢ=h$,P! ;e5QB`{%CF&Bsj&*msHFBUp[ 9-SD#!9x !(WF\Za)R{'V ^~,nTjS(rNJr*n[*Xk[B ֢Yzp6L%lGd*5| i!] V_RHr*ڳfb<iO=ۃ#ylt '>-MDpJ59pSz&qCKS72ǡ@UF3t7-i!褡![{6BByu"{zCg"lņld=2=Q xvNYZW;bY ye5V RW}!Aǿd0b.ci:(@k: jqbN lp'r?F eKX8now /K ZmB+).i|yq-$5-W8}tss-Rf{$|Eorc3*e,a@NgnJL3Q ?sS9[[\:LeW|.VcSqpܑ?@ cPgg? E^ͬ &\|D5U-,|=;@ϩJ LˊMRs:fu儹PE֤py"c0Bv0s'M_V=(-%H,O=¼7xm ] T6\b+ӏŅms/ɽҠ3w)nrwq/i4 1a&32?cS(yi 5^M28a>HLViK7P5`J.*_H|IC-X,"a0aER!RQB7kđ~ʹ,rOAHYx n$L'*,l.}u4tVBR&m`d`>vEi_}|j4W0|}Ls$Neqrh1 Vrц a9b\"k C1Z!b@_"\Q }<-pQbq蓊 |`QrEf1ӆ8@?m-_I*\YfPytJSgF׭~.rcN.c]Id'Jd.W 9e DGQ}AP0 RvZo|.jƣhpH=Q"U< gmH*UEbfu{x2 ┧N=P@ `-ǻoc]6sEv<'' ]Ӌ"0,裈 #y 1 =QAI(TPr Nq$O~ү37BRéCK^0 #k>Y8$*/wCXAC"kD?WJd*'l@T< O0hp`,Pp.@`@ (@h @4 PP@( (@p$@@d`2pP@ "T(  ` B0@  @P@`$D(D@)JGwN\Dxp=E!g95I_=$+7W}[{k@>_Y Z7/ ~o˨h}0G*G?7ȿ:=Kk{3ү|u{wlܭOі8Йc|ճw$د ]~n*},"sYIzk̤ϧnG^3D2_QR}@O!iE# %>lH4[UrU<.?i(FFIȈ$͘$MGn* ^rz~śU8ltz3Z>BP&-QKUc<5R7qP|{ݨvFY;_@X%W^UKSN 82Ɖ7j-wܕ7CCnfc^̓wR.|9 a/]󦟻ێ(2Z+=M࠮D۽tʪ^:jx[w+|5,hyNmlN v@3:ǢlU;fCu_X +*ة jio=.?E-\ {iӏR՟?pHY"k;߁㵹`Fum”=֪LcalYfF4ho=ҫYʿk^k%n8j,#)uś#{mF5H VW#1'^}af#o֛mmOR*?.BT!eZz7`;Ξ6E1j"po" ĭ0<NʋAK0~?dSj蛱,C| Ea(Ɏq vK ߳ U֦pN(A==۪މ3TzK{[}SGdՂ/JO.rk@#@ɕ%)roX@%U|^/)|*ݑ2b"}\SFq'v}1oV]2a9.(erΩ@ߜ-0Ԫ!*IE48MW]T-37<,ikg#Ƨ^ZbBr6՝<K"TajxuUrR|&,v:8`&R@+g dIA˝&m±#3򂠳)% r-pY}b_u(bc#mŭd_D(J'΀Q,Zq`c"7uȗ=#_fKްWs]ev4kqX@b>ndȚHc01W"tCVV|U*>cO>QUOni. nzM;,îqh7U5qycch"b~&K & (:z jc/*]zC4kŢ]UJJӺ)pbds ,[N QHd((_!gX|Pr_CS"!kZq+%5o?4WʉqtY*-[n/OT]-JiB,vшnrfM˦ih|<.a.o" _:ˀ?j'a>Jݛ0\kUz'O_J1nC~v*L옟<,bQ|ȸ+0&؟NLFteeworlds-0.6.2+dfsg/data/audio/sfx_msg-server.wv0000644000175000017500000001306412140200333021000 0ustar felixfelixwvpk,6|WWWGHJVIe Ifd7f>r_K߿:;w_~HvW/߭߻[__.O /~fxt6h>:9r;aȡ{N]594s{{2'N[.Y>ޅô{,mXN6_6?EESZ^д18h^:/IEmi'&Qt$:}_'eim"_nf%kU$дzPS(I2Ԩ@m=ٰ4A"䪖S/Uzxt1>f\l#%Aɑ.PERJf 4CHE&h])}`-s@ q˱QBPvfJKxKwY | ǨxD_Fz!_0[M5WJlxAyO/&Xf _ -#pKOy$zl HrEfܑp :KoXFp?h0~S#=g `I!>@w9N# `ʑȷʫpzlsZٰ_QL/|rXڎ{l3.ˁ[{ n #YR QCu˙26% t9oO ' 4 P AƞѸ^9f?fL#Kus_/ 9D$'NUŧrEh<̦`\^e .TXقu x:y¾ĕ=*nL` 8 sF LbSJ2DP+syN 9b L K9jBB "T"$2:qN.8rTy^xXLH^#3tx #q J jvcOg=?A]p7D W n4jEP0@H"@ذ4!8 8Z$C `X2A0DJBp)FL" 8HA2  ̌ue"б$aH,]R 0x" ={Z^@P`4 04@8`9( 9/&>)8|Spx)8==)8a7k` I=o!7KKjKKW?v_?%}ISil\nY8_S m,!o.Au" %!|CWO%PDz*O?pj+)*:B9z$Pp Lޡ+[FhB EcJ$샓!w8]Prx8&{MOEMg(,P7emU_zQK~,GX4Do)+Ťg]Gi0Vc#2kZpa(%4Y|]yhqepzeBǖ}Agڔn57zLH,hqų O5a΋@f\%|qS =cZo=3lʔb_>79kerG*9sSfs5%N{EW:ݍh KϲdGF QNQ'|y4̅z}X(B?~^ig~49Q1[DX ^ 5K܀P%*8udo'+'vZ>1᨜zz.'.t_G t\r<kgQ~j,f1X -4e%k3IOsN+vg]{eqIΦ&! -%~"7dZHP1E5Crf8_+GRYxM>H_ZFCOZ$y;}фYpVD\ ހkAd\'Usu g<ȁҡu%b=on1бtxɩ{c2o KrB| +7!1+FfnFV9ٌg~JAyars_݄*skTXn12 s2}pCLڏipn7TRM%ݹ;R"F[̊*kOjx9lb(?j- pzL#xqceM-sGx7Y9K nyJ*sjĺAF~mi-|en@3aҨs@Դr2u?z]2 of$9p{ >4FT9)Dɹ̖'X_e} hY`}*pK9)0 :>q(٤1@ X_,8@\xHZGScN w- 5?>q<KPf03奊jD;%YO@tp(H[¸1VSO2őay*!Sxq9({%b:Z2 lH%( %u|GGiA1]\qɴK evh{J-gDij}Y7)yzZّcIBwPKw,m9*35yCäKEF]"M?g*Toạ44. 'ձqv pz_:$aa 8v;3D#F/o(vroL ,5*0vOt#б:bG2tf0}u-?'owbk'nc|V 4: *:{$B=rj*,Sm hlTi+)"m+ _|KI >43@׺Y3rc?.$S(PF1G6K>H&V>r4QaֺޖB!MqLY ZS# qTD qYe͇]_da}E#{qLf4*톢="g3a3P}R{L)}{@Q8uA%@,qVz.LLtdYTaW h" D0zF u]2&A")Yc}.o\^qOyUTL|^DOP?5r>1aeyW&1غ zL .o!Uv;ڍ+S"̏Xdt+pl\91ݢM' n|4nU|D~?MX|5@ ez[|9̕,[`>y$Y {D ӄuDЦ~k-<H֥o &g 5-&mq=B}89˛[ЦuyU 9; !sSf,8_rTf\5>-T+#||jm'ܻe۹9Bh@qSY-U+W[T}}|.o=N҈F夜B_ש?(ڿ]\܊}C>~^slށ¶LNu~uK‰bqyu??? طj/k~JJ<~OZY-z z%|`\vٽEI7bck̒uj"ےF4y= &)5UYw/VƤ"VB3.G-{iF9~Y/iXVxJё0% OAN0^dڦFKH#FXqHgzIx@Q N8D~[! 搓@:ADoR#H@[ q]B#< FV{͜qծuy;i) s-H-@]lBe=@=NkU_n~)?{*}'7 /\en#`_8|"uS˯:_y]&Z& ʃJ;[[PNR>[]F>um޼׏&6(&Eo\NɭR} 6˘E%zRzM5*YNQ;Ntʆ:zY28_o?YҡeI\gZ~u Ah֩jkʂay*hD_:aTT QGHY:qvgG`%Uw0bp!CcdW#ib OXŠ^Wx۰x'6 m"Rf V_OpaNRQ7#3'l ոDd/!m*kd(Gd> ,b44~Y# D?JWUv (,2k=(2=ˀ3 %Bd!BuvDo9m]aوn za3\#`/|ܿBӦ ~tЈ8xVԎk|&iivަ wQfp]([ّ#P NOI{ݕ4%G>1wΊo Ab6#!no\u:vs6eWO/K3VRt\%iØ 1&1x՟HI`غW Wta(7-w# fEkGhCX g DY~SPhddV&ˋ _$(q|;%N13܀ ܨ4D^QT&[y=bwE3< RS Dҋ'}HFg*+Rrx}#fr9Rs-(W6mj64r+0g@oUotъOژrE"xQ@)g c;zHd sU$dbNuo95kWB/^>UT g g@O`NJƸnQO Oד3' {NR_*0{}"=yc <"5T E!붘N~ÑcJZmyn }p"WqXH|Xm{P?ҳeHz}j}X%1Qɲ%}3a!6,pb`3𖺕7: 7Ňsl&gt@ eI,(QPCr6E9p"_D%@f'CV6b Y zѭubvI"41:ꕒRhoPznV# 1ÉC0rH:E;RD_#q&(K b;;:>YxTOR$T{hq| S.T`blX椵[Qpzaҳ9Xb*(t3N,OoC s6DhbMMoL3-CyWeP*F1M@WVY@#7 } brrw£5.ئK3UXtuUH+;#]\mqL?j])6-xkRii{ P vGB(94a#XmEI~)LզW&֭]^ ; uZ*̲ٷ PU@=4t,9~q36|wvl,mM1vD{ +q6~L{@0klz 6F>Pk6DW:r C֜ 9̭\9"b~O YĆTDxr@nKD6bu,!yz+FYiЖgI"BPr])2޽~ IjPk|9f~& ~YabZi2t]N酨 }<;WVoF<Hjwb.3єH F, {19BfWYSbpД,d #16x Yg)4/ZoNPu`5t0?RXщjL #>]@ߝ=Y0\ƴE0eKI"E[2yEMc H;FW_^Tk٨%AʥR?l6|/>)K,rsa Y|g$:K%)YLmHcZnJPco#4EsȆqÀ  c\MZN@H+JAT$mhf;zq#iYԶ `pسV޶%,qrWxQR7:@gAJb@v1S+*jɑҳ ¶h[{az2!S9-OAܙV@5TbD e27Ez x0xH ~J'3B66V[a^#wa@xzK'9B I㼤 QU-#GeҢx1!UPl6RnL(0VmWSIU[/9g\P`%'E %}#iQ_5L z&`3U&p.2Ш;mJn'{'rt- @!nI g`QtӐ̇𔧄Wݹfq=_S[)弗4mB]J2.4A?87A>+.fq3$Ťhbc'5bsU&\"nQYDo.Vyhy^$Abx*WUMـ'nҦ!=e &E_y".oMSrEt΃  ) DvUk-A%Z7$J@mҫCJsch|1aM;%%De_ b6+dC_/b,qx VAPv9d ;C∜K > &Ƒ}Fn Sĩ7Xbv5ݜUy3c:T޽;o3.dWJf/A2cHz[ i\vd>r)gXoJJ,˂*#7p)qtBx(#,ש-DKueҿPZFŷ]oóX0i96vʇJGS8 9@ xs$ԁ uTDiH74p:@l|^F)j2Ep=e.15^ ȷJ<Ͼf `%W  th=ٽ#rJ) WaSn-ij5^}_b`38)܌^cBću*GUs3WT)1`w4$¡^VͤF5ydU'dzJ58qME!fY YOO %l->\퉟Q^Nl\j%]. \w5{h2oxC5] Y|{ b5bd@R%g0iP zrg5M$DmJ5ӝ5\o? փ*Yꠙ:ͅt҄ccεerVJ28K{1ʀ#wd-IC3ER[됏,dr 0vA H#LH)vaR2/0qGωȗ-vEp&~;@o@'̔ 6jk[aJ|})I5_ݍTݎ6vT\'QPM$5k<|j'|EB;K;`Уp8+#S4t[!5q'|݀x;By80\'tY芩H ʱT(i$Yx.J〆zfL+)6g^b dI-/34J8A;u]PJZmd=vs5#t91AcJ@ (; #!:AS"p3{Uv"&=kiC-.V1W#g"zJ|)8M !B8r3E8ja,F,[QmD$ %D"iI$ teeworlds-0.6.2+dfsg/data/audio/sfx_pickup_arm-02.wv0000644000175000017500000001264612140200333021264 0ustar felixfelixwvpk#5*WWWGHJVIe JWoߏ˧?#}?iK#N.+ҜO38WO^[ߦgn{?xԖ-9E1C.a¯I5,?SG 0MZ(ӓqwFvLX3XDdu7x _xW5 AK8C %f=υCGFLwzB'q'/k:m Yb8WI ~hqB׬9Gdov^[=,HKj 9ck6eLEA&QC,rRC=+۾:u{r7FBչ 'z ~☻&:P|6- <6\03A[DɌ :iI,=i>TwfʷgtbLVEѧTVЍ qa0WoXᦇ0¯lb{¹jѦ¶Pt 1.zEafuٸu;ɆTZG%K9g:UZ j,$#Eh O2GTղpB ]a Ez!pR=D'tGAxз_ƸVlY:A2M},)`x4?3TCp"\r hYDF4KqSlj[nSXASug48@Fd^OzAƒtQzv`Q Fc)JK  -\2a#I FH9@1,Ceoײ )l\#Ү )TE5$ *4Z5|Fnה)CW$JLsR_$2[Szc9#`q91m|ߔo\/ns/%nZ W\f+v ['mQCFQK@d!;ށDBÅsK6b֩e@ܧL8X7&4PKK3QӒO-Sa~)/.x.9d r+{pk% "PMG;MQ"[tHv;E9nhԞC`Y$hc\S5i5b ً*qehߩdțI:5@E1(ý(&g}TYq3k=^tS`T\0 |-k`F cUA@x bW.]ܫs4PɻG9^Ԃj|q6GB x%<1vYFbz<}cEX^MT2Z\f+yZ Jet{l|P &$cs-Ν]ċʰSi2 !a1*r.`W,Fأ^I@zӃs`A*0ebjCKV2EqNv&p}ػEc1~QN1#BQmW=vLIn52F6s>Qaixy8sov?r l? sLCâ9̆%ғrXkcb ?ܒ'0I{ j1jy

>:0 "[Osעa$5q6D^SOUj-rԘ"tF'PD}bb8 FH`'a 1SZG>um]R[ǛIY^VDIDޤ դn6 "@ iZQc!zl!E&x%W@ FNm*6)+h7*ʬqiRn}k1Џºb;C Zb8rzdu*/U9,+CSry ̀b5s 0N.JD쨏p_a2DGS]<1 VLl&ZC.s֑3Gf\^H A Pɳ|'fTVPpJB mE* 3xh%5\IW|Oo eM㾝 ٕF.@9ɼ Մ$Ն_z2z ^?/{ROgy@!,X8dUC2Hev:I[hg(jMizDnd1B$g#S5T@QzX~)sHYm(۵3°;j*՞#EW_YRKcFzh 4fIJ>4n1;c6>$ۀDD2E`b|vJ:ԵjI<_Q 5G\F '魧XJA5P6t܄$Kި x[a7 5+$"ͪ[$0o(2ѕ؃zdÚ7ؿ>*Lqg8GľŠe=tC6<"4 Hc   )<})e)?=<9dJS}MgU=´gG=#y @pYUk;Rj/P_֮8{ .?ۅ`TIl,cZЛ (k ڿ"99w"{sa2R[8(:mi!?FZNkT$*0r&nOet,y:Ul 9Dk" G 񟁜 &IJ.ikVF&!7. Nk6tMo (o̅QոN9Sɰ=s91lџȨƓ?Yu*X}hԎGcR, B dUI)ߩ4p %s)P:>5 EXj q^䘅j7t&8ZlYPɸ\:L۾vQ(CSJa8& 4d$?X1M´51Ҡ"&o[H Y{v*H1B䠵LP>81lK/_4x I xFG[>Wُp.S] ȉt <(T˂:rź44n"-˫J ZT+^tV O`s*]:"J5hBYrt0# a0k ޻*_ԕ7f_ݹ&r/\QiN-DKb╞@V#qAַ}W\9zȀM+ibAJNƖJ.sb U*(U00SWP[trMgcR0.?X;%_" (q#o4+ ܒsA3͝V3nXZew()Bb5ALϫh .keJkFT+O ⷎ)я'L 1SwxEX};gn)a bohw8'I0[/Cn4@bоaV0Ѐ9plHXyF>~|(Dכp X5=`]QײHm;G+Z#-Vױ}p=RԈE[l_ov5gVc1-҆(P3+V*>$ǥcmv1_v(R,]avE֪ޝiBOcc{\q8mV,"=|UPxudM+:oe\`ȁES!;նz6YӢ\TW{0 KWAtx[@1Lv~~dWh&/cOϘ@x)A|DM…K8 )T85ŧHWEJ`EɬJ(5 h!͛pj-,l7dP4QZ:\%Z`:p_׾n>pH +6HcP,41v!;1.-~~U+? QRo.͂SFlU)z:鎬ԐQ֡bƀ^m6P,\c$ˀXZ~=G H|sO@W@\((4čǹՐ'#h{5= fnA5az;a`rZk!z8&v3Ht-#cyќT4 T^Lgmh;̹;4&W2DR.~tSr{bw$(_4i3f7}vxrhʦsw%Wx؈˺|B8H+GRzlAcχ7'H`@Y0ުx:Ǭ Ae:r/symx7RrH}ɿYB(Ȫ-b˦z2x*VpKc̉}=B&.jBirC/.W7@)Q\ڜaQH(V%dIsz# Hj@ KIٜu3s2޶?cW?J`˓XGEBU,SRi,J-کoɜy;AYP ϕe! ~LK5@uWfe($agK| sRuXSr]5QpVQtNa Ԯ4QP) 5 [%u^D?jsz`Z_'y tҹvLI<+$X]ya6XKS:Y," @nU41&o|8_3l7Q[b>1=p1<:4,q@h&Ztq&?*RoL:\n;AW2ù/` #UX( 2 ݈Bmg$ UIVe XNl0/^x gP,l7 2fy^ 3\b?Kdzr3bZ8k#z@IX\Cʟfd.XC9yU 4T`ٍ+"~E(54A;;;:,_Mw'ZeKy/!\>p3'W>R]s]eN(^D{~}V7խVř9I2T\^7@テ4ru6p}Njaùd^fࠌ6t_)^P{.S'ˠ">{Nx̧\]'YCpTS7G=Dq(&۹&KW,ׄ#ƸBHhկF'D2cL(N.eYr!J7uEg\!VSe+| <>K6vn9{-C ifdd1AM̢^n#3_nm!2m7L&5őD Ꮓ5\Z6bIRlKDgS`>9y<ԥ4$cFH:bԒ|l*ZޭR0P_H^6ovIt@qXr(MqY*eyܜ4&0@#@[-eU3g^>=Ҫ㾽 9{qDHlK&#-ACOA^ c 4񸍓xn'cSޜ}u_m7g{d1q3Zk4 8QĜd-NSmhM&uJ(z[*E0]dgK1бOZBdP,gQ __⠀=ȓ|cfjYNwtO8z.{k|m8DZZ`̂B2T 1A&#BaDhɘ\E=Wh@̕3+9qvg!=?V! !zVglc@7g?Ak%Ngv#fO)[5lH47'*) qtiOGrT$j^<xcj[CA&%ic40@ f 0OJDxk&d=Z};j(s@pw>K | AfdE SY `A%f٦v:bn}lQa.h跣O8p4CHiCr(^̵H1b/![}М[t2L1L=BȩZN#|">`a׃-C {s̉TJfa;o؀kdDI'Ewi}QIk/uwSzZg#[ W/9̜Wa,L8gw ~.s' [},7\9aŮuGv^Aj`A10 0UoIZxR>%/~r5m0E\]`. Н@ecDiRa0:+Qq?PDԑ.pN޹BQ`t1v%$ ,jS\ɣZ?MruLr= Ƥll4MA t-AVts1+sTF+ruX6^Qs&ڃlOVЕZWSJ)Ðcfun:tJGZR"+ B=Dς7>Nlwvpkn QD ~HWWWGHJVIuzT  2 PB \+D6Y<< /BI_@z§0]"DVYgQağ9oE:Ɲ:Lyb'ZR$ ܯU^*J\.BVY$ZS-#߳Ze2t pQf1PmVcU 0I=|Pn{Gw@1}Ut 4pˬУr'-i/`v@o#ryH1CXVvw lj-]]OH pQ};\kBtxfFkO,ǐ&Xj7txb#IN?I7ז4{yrƊKcuNHk^BIb,r.|6DִA\evI"!]!%҈??}(%s~T3$$S셪Nw*Z0x/-É+;%m>F͹K"zv[0SS!(c6 β D> ꆣ,3D w|ab/Hm>љbabjJ $ 8RLlZJGȯN#{1=_MӋB40e4J43V>@]8*=Y1+(RZؐ@!Mi#M cױ  Fɺ֮kk^d |Xʠ"8cPn8 x',7VdaÅ7{#Mb:Vi@D!LBz}Vp'5`u l6pRgpoG}aRʖxF)+A^I$A<شmm(>-Y\Ƞa0T+B r<BQJb-HJO , םw(\O {f݀- TEGFB)v{n]ф{,+{Yum QRB0,Duq@ݍ|\(KiU%*od5KpJa( B$KYٍãm]Ϋ(Zq?Y&UQ+PbFA"G {Q*Cz]py':V襠+fE3paBplap P[.V;.n62m1ӫ|hNI#Y(C@%$M ׫2je ˺LJ=FMZEkVDNTPCq Ag[ͬ*.<T<^8,*uE=\G ?H"ڄ>'Glп0Zk \'B C%F$ĝ e{%F8;f);|C%'FdN&-q2.M鬟-l$&?X#r$7rnVf*Lh~ȡ5'O4R]fL,m,PEPT*E 8 kFw:Ӡ=ꑩ di'F_3g*(R1d:zL?|cp*1g ghZ[3CKT<;IRuSVb+a` pT% p40R +I,`0JxUk呷{7l?wv>‹i.6eB^TP+$wsP.+Oi;8z(3-6pH.h0 * .ܡ8>P/ڿlfJ&qMUj?8|Ǖv[ܒZgoޯ3:cFG- *WH!@C:S$Ԇks Dܚ$" b$ %ygrSs&s̻b~8),-`qéԋ*B8Eoj4'Nd) E.%,}Z#181) K2+W2^ E&ƀM,^q疥$\TpA:@tX @gAz7&7S鵤Wvf)]G&FW_З٭(Y9AI ] Ep)9buWݶ/> ,Ff H V`ӤvD) ٗp4v>[E(_9a7 ߸}`̪aXy/#2˪PQj *,{iwCޖS1϶pQii':DD DU A*Q/$6]b#h_S sD2 ]fԪ>"6 n`6)TgTr|Mw_ZAAYJ=KߵawBW/!WU U5,(wx\%"F M j TM:i+'@ݱ$&l ņHKɩP pyF!˫JC,ǂ/c;RO?,HJ2{ Pw湥3 @ RN2uR67A^(&8#D'X$һ]| (*`jx[V'Ȍ"HUwI @DצW<STNϝ2OGh_-\  lѽ ]R,C%PpXos;ZWϯeVDB" bReR&$\jaF_}\&sXhxJjMAJaơSQ&U Bb`|?ȗͫL!ho +,=c[僭wzЀрZ.DBOec0r_8b{QLĸZQx.%r"@\^e?Кw3F'p(mHMPD5W7XaQ[AC)iM $Xse<wj?@| ۦ+BiƖjq :Lw/jBSmf׏?:s~rҎN0,#Q<}GKVN%hΤak."u-ң.=f@3X)JC$osmzAd;H^rB+T=125v ڠQuA襷 +UcR7m8f* N\"_#+V`)vb,K[X!ZIC0 1_UyqO) Q 8O]KwC"yyO:]ƙr8Y]|z_&26EVt%pq3o;cbTTO [R ʜfobSC"sXȣ.fyGwU<@26I+9!l1S6}y(^ZEic:kV\e>-Ѹ_Keu4:v(#D,^r\s5﯒z{K y hG+a>'" PIH#mGL5;*9'5g?S?zq7gQRI!M0߮6QpP)Y NBb!K($-W'`^qď샧& ӯ6*zM[\Xs⯥,(BU!N\92tv }9΢0J2>&ƟV_檤a 0Iz)΢!b67]NA7&8B4:GŻBܮ]]aC )!4p*D:Bvi5ܖ#*E^at.B9^@@~]'gäHH`)Te 7n (m[ޡIej]]z o*od)al>!=$ܜFM6b 3LV[6ܤ@J|/UWHs.4L@ۮ?:6Мr{ ~)v"ӌhQ=s`b1!VɇqFI=VHAYM:Dꕒ !*@4 VC n>#*dJP1P>5m%:9IeUmć)q7ZcF es7ˤK]|+p)rk^py>޸g uGIjdXBd~+$K+pʭ`\UjG=J[S9Ȝ|z7(lKdz G+%^KZ&YcX{H.\{J5pX$Z B>[Br[kvzwIFצ[pY$l3SP0u !-ث, 9(ǦxO7ZG=AY3<@v"Q wf[#XID&y:Eu E5_[LM&5KŠ$2f5 *eWjKXI)qcar z!iw޿8Q39/o?_ /iNbA2 h6N LHS.zTC 5jeu ˷e1~ϖ"ָI` B Uq2PI޼T 2zw/_gk}͝ 2v &> ]SZ³M^YIR'Dsƾ?yVl5 6bʗK Q`>1awAgaAyfjum, |_˭ykP帪Dm'Vt~6;]ze?9.Aq}jO:vrw% Eʺ $T}/Gyߦ¾ J:Ք6s{.B$͑PJݭxo9x١xAA@.u>#2)Z?ǯP7j:3'v'QUԳ˔Z_# ?C ?Mag/zOKy-U܏<5;nz"qһSdĺYg>Q |kEt}89-,GN2f"z]w*j鶵UFk yAD*c M 9H +XXDADz?\Bz ̷r؀ۼAg]ɋƿ-`E-pծ~5ۛFGv Oa+ kDN ;/CMbk6ܠ/-ji>.Уz;(89߹~x6zkwOH覿vĔ}?2;kf -vfu~ i葥}M=IAXߍ˝As$ pTywAۦZ=S 1~YO Z5x3Dfͭ&G;iYχmVNJ7߬G-ft{ I&!&ćt 2I/|%9I w8' _;gF)` bR?(Y5aS= I|BShY4/tD@Tt #A炂T{3E2N,G@răp!ڍ_[^Ia%5vzmUrۦ2cL!E- .x N ´|%lӡ(·_5+^E*N8w;ݭrBldQMoLP7\IE)7q ,!IFT"c *?Lb0'o:{cDxo^0yl~nU mZfj͠sAUn>Q)ݭx'?;tB2]q(O~ .E%@~D"A/qgݔp ~-35YFڛǁp./0UcZAjjYVxMK /;}tQݛg]$9K+(M9ļ8 8'F (/x~YrjU[os,x뚔s\>''}u7Nr> >J?[-Zf`\8`pu4 rƵAέ)Ĭk#,;:2rŕIm;X5Sʨm5B+xנӺ q*>9RY>$x5|D7XLBO\1v/k-YHѡ}>)\OI""](bvF,8"Mr!3CJ:-9kL >}&+pM<px-ta:J`|A'ˮxRO\%/ͬ~ ;?y/E-IԎB!Z'ϪKl -\*8RJ_CMtuTL[|Q}AP.oG<ힶxJ3}\K#|J 6$ް5@]ɸ7ig4XÓ?O{Y>z_"9 lj®gъɍOrʕ:1 lt,k;ײ/:AF Uf hKq^yɜ4 4ZҌt'Ie\qZ4 &Y9+л9qDn-Usq$f3I4@1~763K5 ɑ?]찕47KPC(Oy(aE,X[>y}7灠X:qDv InmM^bsEQ'ab9S>c2%6S[ &?4-|NQ?ך?&Ly C !-mI,6:>Ȅn $X}^ʜf.Ma7ø ZӶ]7xJ|Huh^[Ǻ/Y(B(^Y\s^,RhC-7E|x'q\%'Y:t9$Ъ#*ZBMǕ P-|JRSnA%YQ}]s NC-Y͝<B@ 4XFK9!SЁr_bPn]嗸֗Oo@zV Xz1!:9A'_N~wpg"SCb`E@,ӎ(4ARhAxC |sC[zRj"ԑ߿y(_9릵]UmP4эCU%нA&h.{+y~0;6g<=IYjɡt \)%PwCC‚5y(ۻ$i5 ;r-aÙ)ԕ{C5 <&g^Y65 E-D"+hY\nɚVk cz-(6(SX <(x6%)[ŧm$zlI+j$ ]}TLTXY0 < NU7g,ߵW@\W{"nT#d/z2a ([H%:wRT|᧪HLQRC4E) &\SY!odh_e%nV3zGƖPjSN&2RYmhy-wnLlfh]XH')#",4mJ5'芚}d- +#l>k̴ܼdkWq#@Bw34L|5%'C^9䧋C9 Y/B~D4#;=[ ːmIZ(zy<8R#&NrDq(]L!ZGP!)(?^ WOP 8Ƌ;JӾ{8J5%Rbz A3o3v+[\ atYv˱XR'5bfSl@6 5yU5c̬l͋$/oLc.6Z1,ti?CK eC@5+!NShPE3d-mz~AX l*EeDWLΖ[s:u 6i9k5"0HY` ʔlq@wSh0r'0z h'.:; D'We8]#2PNtdžṴoea YnaV&a7f >#Oė278 Dr_ !{CM1BZ= K9@8aA^L&*].B .FQ6Tx*  7y5 N[p [qx(1k$Ir5͝ռ P 7G HF_)3sT#"a\}Vƅn)&Ձ%TÎ1WCN>[E| &"~3NvKNfܼal!LI :?\86U|77Q-ka/'WC!COdlz+\ٕuiܥ71o[PR)&_ fēHtʸ.;>/3qT#btln C5$0ԥw= ֕h\JW3Wcoɐ5zZ YT5n)>Tl FP`>ak1uu=;`m<6kP% R>g9G܎_ YEv'{<^yK_x(}@`3&u&콯l&3r Q!JQk}Ke^)~ 7XXJ,} zHXI̸n. KWTO/vlG#<# O %)"l'q}$ .~=OnǡBK:;E3F2^?]PánCc\)>vdԂ# /J1bF,MW- hVsXP1{x}1p RʾUT(ge8ۊ7Y ZєB) r4pxkAZbں,Fxun# Q+B MAJdt[lDB^؄(*dz="н1ŢX)aP;$ MG~(wLP(CEb^Y&3aBJK-,#ZYK :MuHrX H$tcegaѸCD#{gy@[<a@Ѱ(G4D*[X!Trng l &t7~7Ś?b$ 1*a8L7Xm;Ӷx`@0Ì@d=޸s|~ߖOC{/Dc?u^Hj}ӲsG+%.a̴cmæ(@_Ig=55\HnwƭT$ͼG0k -t`o(z1t'hw#2JcZP\4 Yl#]n^;d \w}{@n?w"o7@K74  Wg‡DB@W R y;6&G#<83L/G2!׋RB vgST'^Gr?4mAG(>x_E}g _ .&GUJkr?:FXugŔDǔWϽ3`/4MaZ9=cptC c&l0i%J=Ck/#F{8qz 3#tԗ[ krс(| RwǓcx?eaa|9fBzډzX$%5F-Wih.c带3D\sAM $Ft֫BF@<٢:ܓJà`eHiµQnPșóC.zԀr~ r2@3Wj.!3(z{~-8-PdXƐqO.Kch0zj},_D}%`کإI*o]*{J ơr].Ljw\^k*Hr("jJ t0wjUƽiDžF>8:M|jԘx_{JN(@ʔq^F>6 8ClV#Bz>ߘNL?%ZNdQpp$G $3lQ~f$tfm Z11kQk%K|f}5yŖ[tAel7MZ2'W{y4-kgV52`VTQhAa ;L2t~)U赞i 0o%XbВl{0#ń"sR0pǜl9*p ^{geש$oFUz>!}1?ҧ~~J6C[Ng@vޞK0ж1e.f`(#@\.j9{ì mbqO(><(LIFz搓_} l00k_e' f 32/9V RmUoUeYyȼ@<Oix g(vet(&x8ٖtlW6w^Tv,gTo>,q%8 ʟUv<.3֌[߸dH, Aa+|5-{aMt<6!B&nkюҙ*T_kw$ a1C#7 [_P_OI-Z_)YDYFX_Szڶ$<}tV581Og\@|dC1ժgHcZR@I &Զ(>jFgLp$&٥y|`zč+Dg[tn&w}T<^p-dP @<Ma[%_խ +:HMKwB~q{A@Gе1 n0EemǞrqe>Qc> xA).wQۺgٗ52%2%P(@#&}KLY?@8L)-u;:2l#dHk]ԄSzK rwC T='1~+: t9T $mA~"0BWyLD=dI!s*N4кkƅewi,y)| Ajh=ҧy1Bٷ8qŃ)""Y;1FW*<`FS\py0Le20ޠ1b>B$@ )ū܇TXZ)}2iG0aކ!)zPK{׉b?s *1Ny;!U(4Hn,*6k!}0k>7-,\!}QH (")x3[6UmӐ#c}j~g2UGsj j?U@qK}3DO^h 0iʖDk*7QpCdYLJy 뉢<#K[g;ҀjpNvE9u0|V4Aݟuƕ RagIaW,gIxnuci?ZODOMiU>i }~58`θ} #cdA;^_XYCe6 ͦ1V1{n>"#t_EWqć5u6icxM\3EZsPp5u+lWՙ:Y<S\ļɜZaJzqbi]Xk`x1#TGABq0JiVLC2pϲW@e Vs6'5W&q|e-ɉ29 xa%9 2bǘ%>}{q" BTQ,jtN<_ƎX!;NE5`goTS,dflƺg =B읷¦=`P|oT2c.YUfoY*r {2OY,RO[ "}%~h8sV?e3C 0a>sưF3٦gŁ5϶L`oSj:]~gMSG4 NaؑMEO ֘[@sHP yy\L' ܟrjt  u YWbbx #zB]]pHL^ܼllt.qnMwd T`\T`j6OwL>ۦ=r}dC( PH ,y7 (&7n)M5_uJ 륊StgD/XC{UrZ[#gC>lDCwp'vQYQ_'@(R٦I{-gJ=ĽU}w/F隒Thk9JP6 P{v Џ}gLjwO&!ꗼ]^5&jyKoV|Пy/x"78>wp!|lH$G?u:O.:kc3 %\3! ?$vIDs,AV>IAOBE*wb1O8T}$b~b6eHx,J,:eu^V7-/5QUxQN3;abr|mPrͲGRR5L3,IJ7;WGuifV 5ġ$)zs5tbV5W2_jo|K@y,=PX+'\͝NǠo|KSMܶ6d/1N(z'b|K A nNaXL[՝箪JZʹ?zlcTӐ.c\<!hD{!Por>3\T2 (ԫΐ&uz״{c ޤ DX, _sh|:͖Ts|n,@ lN :bAԭLҶ6co\欰M8̇|J$1`{D_^ѠE0f?Fj؞ .DHm}q;|(<0-A's{,CgcF;- ]>5F^y\rI(4& ܁*.񠔭L}"!r`p7sJbddYEOukcK,B/ׄ@/>1fp9xp}u_wU"nIrԝ0ы~ mB|Qs Ϻ\xNKᖏ_i"mɎ#*RQmOx}}S4z%H)bם/IX@!i6mЍ"yMT5vCjA8D`MQ,-Ѣ/u1!`k.a>*rH љm&a+9ZC ,-/J?>BQn":<$7D!~9.: B,g;Hg]I]=|u8iX.;c$ o:=쌚xSSw:9zJu4R:4?X9)].\7 fE\>`^u\uo`a^m5ǢV`z.'\ۈE=<6@kg6*qF^.h\z8XeBԆNNapmCѡlᇫҡN9w=OJ]_$ڙ 422_}rm*8MEwv+ch& JC{?[ˉX3ǕK"}%5#4ՓZ%q(L_Qх`W{j'l358N[D N[V~H/+Y he[l^׶zB2-#3 ՅGކ * sPČv \f? J&lYǕm s$fm8m0w XɆN C LKJvJ0Np~ iC%-iXpI! '8R1HVLO""+?T.!.'8b_l&r0o@mlƧzw<;ME(iq){-G` g`u`,ɵ>ۥ3l!ʑm̵6z#*'.ZW C8&Eqf$pC x2z ׽r9{@+`=n^!ux7M}}|p14 %0f\NA~rxE Ԙ} bן8m)rKٚ⳺OnG V{r@F>~+ Y*\uDJ׺?Hxx vޡi`5/{ӍmM=WuL)t/Rԧ!g^+XB.sq>Nˀ6f=8̵-7u9oFu#6}ܴY]C*f _ζ#˹|npQq8di@6ܜp wmtZh Q̐ $k:n_^J'iƐ̵6π6Lx3Xlȴe# Lƅăg% R:pfcWbg-@,R+T`W0HkC{&֗7|HawceDF%.0HD*`fyK*ȑ zUF)CnL"ɩ_VJ`uf{-'WW0GD2QY;Z6 !OKgm}`_ & TO.2|M4q$Ck)6tYcUeX{]=}5}s|ci8.1C!<j!}۶`QCe!BБK #纟'2釥%3MZ 8<+lP5ukOHf VP;W"8z@_-6^YkQ ŹoV5%f)8\ӥnj!GkJ=C:-1yYvWxf@,MO=i;M{Q!+\:%J&V;'3uE |2W?cYWz'Ut+7W㶽!{,0HQ:νX4NX۝ JR°e?kkjA Ca4EH ~Hle/j WЛh |`k,wΕNu _bQs֡C9:U*r%ou 16L 37w^?xDTQ3i}wnp>`;l(R}zWm(o֘³Z)qb7t-a$A0aAav/k"xFʜ* #ED.buq]mJ۰¾~a5" rHqSl!z2YFfןG.>7 *| 5X #cX"ٖ]Xg2#A/F:b@0oC[bUlgX'@ĩlA`?ܚ\iiT>Gx~Q0;1쭿_gY|v+Xbg%611'z;,WMoѡ `_3]W0;r_{Av74$҆Al乎<1hAg7ӍN#xl<2c|v45ga,tF/jҚ p>7r@av-BT]P-DեO|մCzUiץK(xQ@5uEql(E*㽨{ eKCotDZ>PHi  7+fJ2;*=<5r\Ѡd!l| Ӱ98d N' i3:׷DT*GDZMx]vǿ!#V"sO .ܪ*Qc遚rni,5e34@NR,f>y NcV)P6Vt˿싕kvTjҶhEb 09F _RwrFEL; Gm<$ϡҭ<[m#nd q׾WjuA9.hA^J銘5BSvSxFJ8 ϟ |8(7U;7Ѧd[fq? Bבm@T|= ZIQ1TsO{"J#KAw^u*~+۱"\I d jhFd:I:\vb?I0Sȷjhb,:IPg)ͨC_UI)gK&Y{x[K"mL7k0ƛ~!V?S! :|d,Kk,mRo7w C>vIĂx廵?רS$z؈\ptKhwܰzJ(՝=9l/ [7ꀷHy0%DZMLHvl'3|yctD%ǫ(1yq9uiGm엇7\F9rS`v剻 صkC*OT$Zҕj\>9GwUo:*h+Gf9VuWZ7)TEe$iC| 5cSQA/-UxQD!uK8Oҳ?â&>:ЅH7q:#4B(,v]uy#EFUxuxE_}S6p'|0nc򊂊y6QS6TqH<{>lڳJ c#\P{ڼľRda2L@ד;x7k%uYLUV:0dQ]%wvȻ~ X0Tp# PbrtX%`ѯ/c8Td=aHaѧ?kEUvRP o%|>/ODeurJg8i)_}0]w]aEGLGb^:wW4CpsW i+dd cǃ3<gY~Ld{x3A6m/\G*g$V aj[UF1 J݋}3{F<GMРsrtuI9<e d>Dzz-p!pjn:}-cjq5Wm85[8$<w'Zr% f ! uQr}2eKmt=(Ji|PaGr@AM=Kք/G^JE[I^sOZz$b5b- JL b9\o-UZi/;ѽW>/#uHaG6LIQfndĀaoaiUfs3̉2f(FtC c[)#K>0ҺÙ:Y~R0j\IȬ1H7jLώO`?qKǬ)k Tf+!tCTQnm uBU8n)\'Q\̬oy  !JPq+)svp(o,_>3b6Ajg@PK[ 4]Ѝí\w)Z>+T[t$'ix>DzԚaN5~}W˿0y%z~a(wr%;VM _q>>_ Y>27B$`~ǥd"ٓu `6n$^Ģ4]b'w F1n@_u^"a"3S0M|&=&S1aDGo%N s"*"L|E`>:*_<כǀ]c:Y6ʍR^Ps^]4vj(s26zZz~M 8_,Wcڮ)+3*ҔU%)qFnq//(fDBm5j1^忤sG@mtooSMM#N0#wKX5ZfAAݔ+2]QFXﶢ:zY&:d-a)]=tYb$cef%:D0tIZjS, o-婚r-U,ަJ!eA#E2@PLxӟMPP'Qɔi%j;^ \sN5ĝ i 2A&^kq[[Y̢ĝev1CYW]٨*ԍWuRv[8^RW\F"^9x9pC0tO-2%U"$tW;JC** r >],%lR!?!Iz"bNBi1 \~SX㡲j\aLf@=9Go8bZˏ,"18h+?m"dˀ٠A\ Ҍ 6!eUL٬eG St}Y[ĮHE2O7Z"J5*{dFa3:O9qv3{180!x804Ds+^ OwG9([H]؏kAMuz\T3ڗ -FeP4V=&QEnz-9Ua4$%X]b:~>UPwPĔėR} :7G: R%;9d;H̵HS'0焑SF&yB]$IM53<?-JP שVO12a ha?k -觅M^8;}'&~5&"Hvƫu' BžoԐ'óoqs_VG'r` |Bq<ggv$y KP*6,1%ϔDlGNZ []p4M\Ew?a>i\y&$Lt1F ݸ$s 0niJ7d8554 FiC+m k$0;Gd IV{+-MߖQ'eXh2ukAe'D艍Nr7t %{.anf .!ٷ^gVPD.5V|(AkV?}"O-L&y^DkضnQ :HWju6bb0Ac,óO,Hp7HaI,2{hجD= s6<5m?{$"m?I|GD8ڵ C қ{02@)(XgAI~YfsF{ xC| KEx%ЌpcW6as?bW".ovbg}CG _{(Z˼qr9jjWJdTE2M!8xgx -(mN*T-[ͿClGmBv]bl&!9os*mHjaAwdWms.U'9} $6xtg7lP sO6-$3A!sG9_#%r(ON  7RHO 3fS-p`L;\%(ƨON~Ttm?Iyxug(.a?13`nq;s]S1ϚݔTD$KZ{;?HMLYid;!v)vmqCq熬dw(͌2(7P|O!# s| }b0"43 ֻc4?&]Q /q\tP,آt_-dKlBǺ٨(w|=Շo)ـo\]DH'C-6yeɦr`J| f$lqy=kz3[ls/fb`G(du 9>gi5PK~8ahMˤh?I3GWB_?`>mL+ Ϩړ(?U>`dž幵*(YtȦ oG?Kڠ9zV!n&.``!H̖ŖH׹` ؐy:]jT^$9\[O൬ږ Xڽ]$%fM3"FJ:iѿX3&T&^E}\xtnx;SRoNt j' 2z,[ehYIjfX-R ɐF0-y޽+* S*<`*-e׭a4v4Bt>[n:v_=6i}僨Vuwp<4,{ Ie)٦_H@ӅW۷nQY]nlpmkrLoϭh 6%. ];oWr_6ʝڑY#$zb hMYŭX `(kX-'a)OF|H!WAͳ3 \y0\28iòc+F$ba h( &XUu v- v.ԨC&V+a Kھ!mQi>)"15E.8y)H|g)IFq1N/G5ci#8Y г0ΩaE=D@p",/0Mٍ!Ի7FZ';.헜mpH\lk*dCH(d3F*~ik y+@EC6te>T6yҌvJL WgQ'$t7FBu6VI:K*7.12~Z6zdhkB51ǭPSg/3zLdgm\nGW="/zQXfɷ}oEȏ~iq&чtUXڹNWRDMwr$[Ҕ>98 ?_ٳ2᨜lJ9f~-]`眴+_D/Z2([:,QPoyF) M eRzׁpoG(-..F̾X-|G oܐ )I K)АOkM=#|$cAn,[ke￵twb;,:(jF-~Be,N!*"WC/yq-9QUAKkHPJxzb$z= W`b1#D[_Z<$ڠc?K_jh_X8YWOJ94C&kS*6Ժ(]F43r|oE؃,N<@zNagꑤJ;G1dVcRt=Ec1n8Xe ["ȧpLu"+:Zi:u!Wb`AӸ9 ͼ c ,NZ$fGD4_(KJҰ`p 2t4۟9)WR6[MI`WdKk-0ܳnw)'p|~as킆05jrL{'>v#e.6n=)Qx 8WtfіnP =1#v43}Dzf]{ylE#:%rp2beF`A`f9ft.4,r(3~\o,5ܣPUMq;3BpgGM&".MŮ<a2#B0{=ľ`S)3 hơPG${eoOJDDz\Cx|[ڏ 7̆ $&19$B-0`>NTrf?|]vo.jTy},]1HPqU1 !|mdY#ζc;.AԨ!pv+A.PPO \C&2Lا%Rgۏ  tO~xnƽb^wRf(ٔB]8<-Dz@f]jVP"9R9, .pI#%\,5[lx98f!n&ND#Ρ|ڡvGkG C  _6ly@oUfȟ=N45^fgΉG2hsTQOϿ?@Y8`JL c,Ƨ)!/ qO,/ J_؞r:3/9Dپ tX- _$0Fv}ܙđF!CGؾ^u鬶L6ՇG+~Xpg:@L_iƉd M2]s\;7VsaA7u Kxqç< iX$z1W x!M^U\Y̠x#u^E0U_<^VVvURꙗ2$ӷN\gQSԠqm^3bϐھQ]`ոU/IS-T3;ʇt*jy]Xl F J,.*d“hq m3fE‰ћ 8EzjP(鍽' e^,8񕼵!Y?4W +.QaXuR:Ja'\ԣ7j]gįBhhc]6=!$ĢFUFPlAV6!JrZPB@Aî/@9`TY{tqdwe\\ TPC)JU4j ?8fځp=Ie$meA81I, e+%r.:4OzԋX9ro 6EyK|tSUsjQKWvRxSP}Gt^b]x2{; {TWq3͹H5ӒgIv*L81cܱXH\zfHy &9ٯpٓs6 lv/$C) 6r3mw8$@mOƱ1 JlR*2&QsMC/ }XcOoʓ 4Wͫmij229 Oګ~,R8! fB4U@Ye+K1}A2Zv\ jRQwhy%?P>Ruىd"HXFow!ͮr$!\2tV8[m6ȉ|KQZ^Dپm3EG$LNml:gO[]TsI}Ќ;fVx.fDⵋ%3prnc8KRho$k@l׿p"l鲚,q#qT>IBvZB<88/ a:v;rz[R8ԜJ|4Sڭ"V7$6S+xdJw(H>:G NS!  |˵IJ?yCh}όwW#)$4~ƣ2)8$ <{)x1{: 0iy㶻g4g8i/$\JɎv7ͨ*:4yVBjSwKߏH>iiGlgDx["B% Yg? ALo@m\(C|_(š})KF >dA?vTH6ef8:f]j,$Y8q-a 4?PF|?c9[8Sy.&FPFft f0٨gO_$xJ2YGzyMqhC¤<x){CK ]m37sy܀vJ!DFpFV60=g%f>y\ams,? rBu#)GM{jޚB$JIXRXB bAlt_Go kvYwT ^p2ɯ jt ~Lfu1T <6;c9|zepCũnBmRFX RW LjMn砫*_OsXDߣ"B;ue_\7\Zi8 9Ev9Tu'_vȵf=:rB-a:Wa<aJh˙x2FIΕ6 )TD'f\DK#m.`KIk#qc gUzK Aj_% /#k^t~q] RG;t S(HZbxM1C #("=&Da򻻫;8aٯY碼=G*NJFUTM`oA^@W|:16 f׎gO _CG쐽jruFDqI_bb;†\7)x dEyѠ9]̥-H"!k_pLj.:U0MvoTKP 'wVƖװ͸ cԉ'䍼n›2tL,Xad( ".| ]Mup[J$6˪Y Dsh J~aN: `:nIwdtl;?z1XEdO „mM/B`śjw?!J&.Z/rJ?@.F^>I FyDKzy'll-2j3p)K:PXnϲÄ.)BQɦ03I|k%f-StZ*CńW 8Sε1Kzb3<չJEoHfAyvT0 ۹Ra=S8Նui2(o|@ލBjpm`sM'ԓ&Lny̅.&68(l"1PQS^-;mK3 K(+7m:bf{!p¬Z\J`tE{*POS)g-!LZo4]t \K,`"׉|s "OI?@4G4)Ҥ$"iD[ȃv_fjY[SҴʣ = s,pib8 ink1RML \˅_=58Kr*6I>s.[gkzwD7` 7pтut jR 1 w: CK |e`f.VQGֱwԸ#5UѹA=I>-AVǕB57nEMƢ6fB)|OM_&"L҄ '$۩TO.())(AK -" y~ `6m3Fiwa08ħ5@"ݭX5W&qP.Ͻ]@" B/n5&Ta?|ss?A|hM]j1r}z^8-T'JTε:E,>E^BN95+")يyhizAalړ>;7F̃,:+] HDE0?ҁ!A@i' ̳EV#f!@0Ը57_`s\L@ZPȎ[Qxa"7%, zuhHɩ ES m(,n:3=0f!YzZ7c\h&6S4~g|Nc@Tz xBQ‚'?@[vFge LA=W8&_: UtyH1ݣ߭!/Frn%("(U^R@&C>*M~r)XCLO%E~Dcv}ݡx iL tn2x>Vm])#5u~\ ϔHepZ8`LP.Migr 6ԛNh}Y%Z̷PzW. s&}K}y,9\@<#zsC mRȲxnᙡC_f{-MFbye2fR)ۧ_űÀo)s ĸR2B&7ГYÿ}/b3PؙJKqk5g){0&5qfʼn#$N ?H1եÏ֥iO`Pj{(ğ?Wa]t̊/R(+眈Ս@|IR4Cݡ%[F K@ kn&Q9vzk3 0iW|G0ܨ e"II2,NbnzԨ:[-XCt\ګ!a>R',amƤ Wד"o Z* vm񿨭-j_sҊ6 +Z|箲ga0㴚fT̪O>:JuOAS"KQdP>nœ=TZʛgeцq:{tdk :;%({ws<"HNR7NO#}w[X`/+a7 ɢ^#x3YC UàqgPm}w c4*'+"Ux.WJNk<#o@K*,*jɘY=תM 8@y"򔑧:X#H!=Y]z M},QQl.m pTʻDLqh8Ljd;*F e~ 2b'%].h%{-fIiR7[`|+ 8)Y-La8zDkdCJϤhxw+B#Qj:ܼӴGLuѻq1eߙ U#Jhf8zhZ~Y$=yMj'ЁxjMOnFԈgzəL7.?LD/3hG$TFEX=Յ5ݨ$'yg!`1(-ƨCM:Uwx(9~ƌ$<'yW wluȮ9,S 'j{d9,^JၗBWy C™)@tP#I5pH$,?rιO\Ocy;4(I`&aZퟟ9Lߍ&Z\SouM^\TkO0vwLNq~ .`xgoJA Ǥ.F-cG*6 0djVk£_djK|CzT2:as4*2Ӕs;]V)h(=2 l?6Tb?$,h6 Xz ʒW#%{|9 wj8He-9Z+zrq˘.rj+6*0q۶95.& 660tssC#(J$rZ?ywz+HϤvq+uvYD7 0!]5j)b`pn@r߀Ϳ}|"_t%^T t›ė[3 F*[t {4-_wՕ%O/f!@2AMW*`.󲍶Q1ܝї,_ߖo8QoC9 r$yjlXA9JT"}ꝅ!ӦE rA_CZ1,0v^qۯgUUI%\T̡iSˎ=ëĘ+ g,a$0^ \+76aq!|@*c>e#`y'Kl ~tO?El$2mPޠ@"ҟr\ĖU$hg\b|d\ r{}ic)?O'mP35XJomUb.?Бt}YhcE֜r7q(qMa? ɲpCπw3cD=qMoa2qV]p' cn~>:Icw% IA!R+u5C"P@O&B2  Pig*t{U$jDx$ɘH%5xye+ F84oՍB"*.|P}FoWH  ;|%Z?֛8bn-}>$G߈31H&W'IG3#ȼ\VѼ<t&/@/s"hv^_$70ǣ,*zˎ5+l{5I(g3H/|>ILqL%5~ # :K~PCv FVkIƨ_B#fͣH"d 5b M՜yndE]ǝĠJ_"1g^4eⱿL0+[u,ۨ>#o g PD[!uAhܑ,:`5^5u1Rcb l{n˯׋ާS NGʰX?YoC8s{EcHw ,"6nyu\%c`5(_ES%\\b}A3ڲꂼ-7tq0\@r',&W7$bS,"сE2g~盠>632G@FKǧ/zIyWiNm7!5G/j.NgͬRVrR8"wfcb\RjV*ԀLѧ{Y-ȯ#`Y,F>2sn(Mʳ̨ ֚"35?zŐ~v늳 (RAH hqW7aYZ5F2ay?cD}{ɟQk+̆㮻iż'6֛բp S2W *o^_.s1+w. a/5vqu^eӟIgZ)V /WW#$no`[طCOr w&EΌ@/]?ƈ"F]ΣZBN8%ʡ.QD@NfkFsd80̯⊸vtYZLbdNs@x;j>d?Q_{`W֝y`U諂遙{Upo,#3`ے)y`o%rITت6!qgGz2zVgT^ .'I:5=ԏR ]$b!dln{iA G]}L.Vhm0c~>LhnbTeju4*1]cTf4L4i iXn2D IMbJŞICK{uX%yfw<ߐcep\X:^t,RJrL3O WxFx-*;NKpbȻrVqXlhH=daMl CD2CUYc\r9d=ovi{VޭnN% Ŧ1 p3%0~үjLZT\LeÏĮaGm ;2`hcVzL9E#,FO/:0Inv*P. K?]e|q@JX9H*͠fb2XlNLw^BK])2*anB]klmz>@tr\I'mt\ Y3NHr>[͇a?-؍fROzrX(TzB3be=<6?hG:F&ۄ**"uG)H'sMhibX֬2!Qszyj ::A0+YQPH&9V63"M &g+$ N >dxDPU5!,P\a1.n2Bcu4]guprӧǴo ]mWU XN> C vxQ IM Gqm- *N6+;anQrCzVB.=0A ,/j2=ώ҅=wo+t??_5w tjCBiQY(]iz@ <3Y7̡4_XEXP%)Jl*ISO4 V Da2>KA*]jKp5&e@LM҉0J9٢[H(TP7d X!},q#.mp4:R9C,LEʼBrxV#ύ_۸oױ>f6rPwi *}J!TЊqAHځܼ$9ɟjsKq욉!~oDڴL-ŷqc` v5-(Ym!(}^'{/o C_ Ɩmg| g",1qUG ·* `h;68= |awYO Myc讁YS]6g "CLm|¡`*Z̰bEI es0|,UFBb4(o%ůfKȆ eI5]d=Xsy,  13V Q dI%f*(`Ж7]N#zfYQ't t!$HLX) ّ]Wi$@Crt늧7I&l+LlJ:#d˚z(|uˀ1p墩ۄ.pBL'B#UG2#9hVЃ!TEtBQ\x~jUϿ A,/P 3 &A_,R\k?lcX;)Vi!ǞK0?`4v *@ݰ{ik3U@RqgLOJ (`bZBYI@U*Kr܇+GG 0t߄)f^cEF 7 MS蔟ZCYqf-1]:`kz;{R>Q꺆^SS崍GL 9L_ͧWd.qmaHi)Ip#i|sPPj߰)ٿ Ӕ "4"ʢnvi&5\oZd()O8Dp>X.bDAaL2ZU:A۝«;TBI b͞H *d! meVWV>ҿ;Hf84 !w!Y>CHF7-!fӅV&%vGTПSrUx 9'>,|En,-H(EH /xw1 =k@u^={}Z ۺ\ Ƞ-Kp46jݣg%iEɌ,_@s*yz! \? D*t(_7㲽7Yq4OL/cG&oET#gE39nJS n4/N8p֠CpNVU ǗĞqȵuxdxSc/2M"hACX?e+؆S:veI$П^١JW5֞Պ` bC[" S4[]x OrE E9Z&\D {9ypH^,v|m!ř4rzh"@˚ua/m%od|"ibW2zѕӿC /өnn|<(袍: ,R`K:,]z CoЭ3BM2.Sfء<؈Gega)3iX/T5jOk-NPh=RR/\Cz!HCBa-$,bf/jA.^gz91=&d T-xEk6Hṁw)@scdN1٤L6r3ɂi9DY[|3ip#J"C 8bpOp_F;rs8"* 1gQ;FY(t?C1q(C"$9>TB(t='CHԩEGm(*By$A2X8Sa:&N5$4 KA, A&A8)GpPGFQ欠AO|BOW  d:XD&Ð`'2  |& cT.1"ȉG@D t2d{0X 雁1` Fh@:N5xI(4KK ",AF'4 x1ǡtIH Qd?6 <102t tz8^ |90A<::I_a <|V`<~>teeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-01.wv0000644000175000017500000001573012140200333023011 0ustar felixfelixwvpk WWWGHJVIe @{kU Hf"H*J3q3g&T "iH2 N,LxBB*$T)+Zg99PH [HMz.D Ք6+߸Y`=IN;ŸΔlxv~{{{|is I=n/ n?+sv5߆:mX])RH<oYFr$2Dttb-nH<{WW_wR73~h7݁1:?3-eԉG]b7?D=VBKQ2R#GNdfǍ)$PY.&1@9rbtb騵Eo\%TɌe cJ|w\WN}RG>g8];w _ZGiPȓW̽gɍp2i3ޙ'J`UAd.y&D_!a\ұ-iq4(a:#MJ Z]H1'ưTʝY!etޥ0Y$8V"NV?؍=D@juN\|0%P-M0';`@f|t| n$J;RMFHugV*j_֗R(TA3w]3qe'YS8=% }$Jp˛P5u ]Y~q#0dY$HCL΁ 8 _78UkM+)vy p Hc j]j,/C1Wm3Zx :xL%wm3LZfZ]-N%h֮:P=;ZT5ickP%I/kjn^sX-UMށ+P}sLwyv_K4jT/}tx&!/ 6bɃ#.+3Q9ܯ26r |03\G?Y\CDZ!0w"#dCF'2eWp|hm}&W޵MҡXs]w#(L~yض,ܿǥt}jču,xVQ`X2F ͼ(I8F3W~.[os":@%ql`ԱyŜր)X npgZ(KCΓ ץ28ӻ;((o:_XԨ'3mEW-%bAzGyJ)“#b`("KK/7k{JZ%es"7K }z]NDE13z;3C$,V3*ȇkg]d `t( : cL,v<ArMsmYaNQnX<%+dx6ߠ:=Bh~Fhq8<YKIm.+,v0dHQ>m6~q,b Jf:R[~bRB->qOxQ}2>8(1++/w\xb6D_qZӧc_ٿlM12xuH؜fu]z҅v! H|_l {i?u?Lg,߇ zoAL؃2A˼+83;b.T?Gdܱ3B[ 81N>\;-BܹwW2Cmtyk{=,)$cdO*78)%AdKePgU 2ܯ se30!jPҾamaEy[ϟ>JzeȃkJ% UyDcCp|d (WdAcNS21٫Dj,$(bmw/@|-ChV "pî,~h`>c'Õ(tGՊ Bk8\pKy~7{k]`L$6RFBtq6m {n/A"'eR#}v@J FBZ_Ԑ~ӀC UW6l@G[Wt3(6>ihL{ombKFib<ߏG褄(R&oаފWEM:L*Nh"b/ys#Td-a(-Dp .Ŀ>Xj_@jvSZ42`- 4 S&YJ @ )ez;}0WT 77f=c$hC[.gF+ٯ鯐b8 yO^/JOZ$lp|ai՛PQUٌr"[抽 ᧂD_ {*j7BVNSli9$9eZPZ6&ulbP_!W,&iؗ: iXnqHH}($"%dgA4γq8(+&Y t2-H%2(rEKRoWagM!Rh? 6mb'6)R0chZJZHaW$x؀b~+kO^D@%k]'O!>On<lt-GZ({ jXEYSrFp`. -@ޭQDOO =~ǨܢOhӪKP칈D,Fϋ9;Yi-%ZAqc( Pyٍ$7߂m} v&1y`s P`,ֿzm;jRɴo^۱8HT1° oqxA"6B(} ƿIeJfiƆ"摽8+ ]:v] +N4I:V*rhyK+دM'CgG$u74[+*#J X˿m!jM%CHBAumte'._S0t*BT4+ _i}(9RXQޅ>`&#"-393o. {ڛbH5uOBްX0_t.&z;1o9Xqⴡc&," exdN iz,rkyTk7WCKWݵ"nQdms 2A@Y f-d Zx q1ǦXOC+‚)by*D_~~9>K Bdrwâ ;)gMe@p1awy/ZtNyc~ {T ]LA[+vweX*\0{$K+43w7C@Ke1xr;Щ8DwbY`$7G+6SXy( _Ҳ*oIŎ{a1qV]L 7W 坒ijŖܿܯN@Ü3s}`toh2k".V&r$ek(ErM<#gg'fchP6.N'[n_湋1Z诋Ca/ ' 0PkGkm_{ɇd1D6H=f Xm`ѝ@%OU+rٮt$Il]M _hPdn@ZNt0'\1,N5PZ1u*$ we&}7\>H<ƙ;Kb#ڢzavu 9u^Kd7p] &7 OBq$魄Z{sw?W欐:.(\RƗd'c(s&l-$}$؏iLVDgyBXN>F "h=UL6YaN.`hl ww8;?ɴ;T6wh3W;$DIHu|H4יϞ_MѸaYζvD' '.X)#~_0Nl;`=2<5k[5J$VOUp:1 $mXNw xUFG%0 b7#ۃxEy&zcVPc,jw$BбcwF*j{;~kn$!Uhr 9U}<6kMgZQ$ 菺9$TdϖG-WϢr]plPK5O 2@%Y0kdWd-q8܊,)aD9)lUG,~IWaǖe~$٭>P(9q" "kc+`teeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-02.wv0000644000175000017500000002374412140200333023016 0ustar felixfelixwvpk'H"H"M%WWWGHJVIe?+^ߵ//וUݸ\v{wŤRXJc @U(G+YVl9VM)S̙3Hoz=זpnQ.kÈ'tvy*Ht‡8/ojD{2辳aFvGfUx"L\~%(3t(AۉoT}Dqل$T|F``h{˻M|~D ;ߟJ/h}/#>qK3'3K7C1 A)"=A6Pl1ԑ+ϥ&DBzV2~Źg2? : G&G!'If830TT" o.:5CZJ47Vh5oR󝷪n[!iq.f\gִ3،I+ RղO+A|C&ȿ> };VMiem\PCn.<ye}Xx?7k>I j$HkWmPcx Eef9|QcCqKUPj0Xm#c`Ux loM_a@:/ba7hK- XH<#ETv[Ckͅ &.{B+A]5<[}$^Fllm4JfU|rlԿЍ?2-2h4j:)%s{S$в`SX7HL x[4[!P1 3^zMÜb,S|F^h-cy;Շ34m j_9 * M0N`, [7E7,` 3 S 9&:5/hq1=ypͥA_P>\;tf]5bue>>7bRwgwDﰝ4 JF&L-觩)eCii.+yCtRgc`=`Y,s6LhAACzc{E0x_;]EVU^d;V%0~}Xy(BƦ0!ꘛp|ߓ+Ek<=eO2F!F.\ĭU˗4ED0BievNu9_YoY4}) L9{nֽfHfJ?Y'ӍɃ^$@3T#QO@x0J顸HdNLBb*(;^T3fs$P!0"ɣ3/;NS+s$=͂97(?T¤gȠ\0C[+۴ԁ蓸{W+GR<\3ՋQ7#/8^yNW5a'~;dWzWۭhp[t>`$@iwe韌a* s áo h?{@ ƹznˆfjfNJ%s4)"3]WPTɩo}[o dn7;zJͨ(p(;C K>@,ݩg): `k<2W2snZcýʠoj5ۧ_ؒ};EӛO_*P4uqWF\*0M0,X,j *c9.';K(A]tY<1facE_7h2xJO:xZl % jY3mUV9R;caQqq6~rd^X P*_F倁P9/5qGj^zD.nwM?Nڌ!_ #VȟPg|C2P3$6&92pq~L,ls("'MWj0чϙ@ 9(Ш`{ ܃&h-0,mlW1"P5NyZStLơ]Ce7)x?QX?i%11Q:@Rmz]erV'lyl^8;dZH69i1MkӰU&3$i\gVA'V3cʬpT쓵\ SG&Hݖk+4oJY=J$t_֓WS1%k?Y3xi: Ih1gҧg }-%0ˠ& F𒮑ͱ0EA}n 9=ӺČBveڨ-:ݥ\ Ȧ iXH߶Z㲟}>r@Cyz%S}b2"'Iڿ1D~1#w^DsЫ!҃#eJ l0v0st.;/ w*zt">7ha|kTo3ޗJXEa(QBTyֈ%A;ӞUeu0v*A?8XV{J[!Rq*:UG{p;LPl rG$ Gq)Ό  ImtjR<5O!Nln>rVVƸFnpj^ҸNFp[ւfa)ByN|g ]3<{C:_,hl$HGEr;\m95Cq }K5b L\W' \*:BF>&:[:p ܗH ]+՚@%{sk\ e`̿ƹ ŁLK5º KK{nʾ;c;V,iN2DhX%kfh9C$a K%C%i֫޲Nmz_FuT`z3<'p`u  .<_ZXMLC`zQ]H'JSY !KQv\% +_QBAd",`>߷(l-boZ~䟳\.mGoXEF,pڇ0;>PD{u|0[K09'\^V on;_|Q3Jɢ*GrcD"u"5bqTI$b|KZPɽ0^GC~ŒP;m?PPA,8$Hˬ7RՈy*`Qgj ̾ܳ@֦P`1y+ + mm1*7`)1ɝdA\L\DvCk?rwcST\=Ci㬻YMp@ 0 1$+µ"xҽK&!v!Z #/koVbl1#]b虱l#E‡53Q*f\`ƏzRS9JT.c(b=^48J,;37X %vF'ɝ*]ʄ[FU݊'i[B*&FśGBRXyyf#7)f":zјL쳫+<60,\%IͿNn{%9dȼcS1?G {R•ikY3ޮlwMWCYI+LmDŽ\ȴ*F~UcalbZ!(@hUHAop(gsְ9$P*1Pk+mC:m (Uh/Gـ (脰6/-}]xݰҶwona٣BK H3Ẃ,9ɇm:M2Ea "M$/]_LяhsF/w`$]OjD<1[J?0XGϔ,vH@ɮT҄D, ;(>iʷMK̘ysև1[u(d= \ NOhu,}]뀅łޠ<${6Pс׺k~j`-zr~ͽZ }"lX- %ɤaq'O4kc^P;Y&:|9cԝ G/W˞"ϡO8o6,/QO G'1TDdR=*{KrGۖ6zפ@ 27ˋ=>ҋwpL„QO#RQ uȝ*p9[ˆ"3jPMʿĢ zZj *K3H빺Z1abO8ƣ 99[~nu3d`c(52~\g輚' ~Q(x+E'.T] I/HP@Sr$ŵۭšC@c9!ꀥ.RCK-jSD-Q@RSj(y1wl4X~Fb(`+,Ŏ]vՕFKXwzIs'A옧*{LleD6&~tpy=r'* !`wqS`˾fcT+-߻]%6z'MSjAzTW;$fSJOރgg$ Wv[) p b؜>~_N< !w|,}ݖ6zJ> I\ =MƼ@ypq,`+kF-N -T r%_dRS $s!7j8lL WQ-{efɱAGn7)"NR(㩛poIGdKH1XLY1⟹c(ÇW 5@NҡEe Lq Q'}hC%U/峀IN2yt (C)TKUAŷx5`א#nKlÂE%ki:2yXMޜg(úhaON B#i1*J05rpE*S4<2v*=p =rf(E|C&k=>Ye?BiXU w!vV!hKfg7__N̟ò_ghV;_QreU [K1o }l`+ rt 5_: l.(V, 4])X@?|ՙ*%|y|,{Wa00>0`a{AcEHif4 l.,:v 27|tͪ*&*EYg!(tg{,н9StIV[Z{PuĚ5[Kq݇NTB޽˻3%3!&ȏ؛bl cr:D:1/\<&7}qxxO^@` ZU=tdk7^iH )Z'*e*eGM7:i\wոI&6* bBgNfA%pp*^KT r( + *>Xo{JƺgHbk2^^Q0~ E<ȏY1hkh7r-#DbgL_sHޛNʠ4h{(mEAXeٚbxD|N@dS;*4c  `{/щ-m8Lf`ZJ[7vq ף9%K;C2$h|JӖ aYMkkZCW#;kKc;Qdrt6onHuԬuή))GEz0^SSܠzzl5ݾ:CSDB)@cwmA6-օX3s# <6/Q ;_Š t^ ȮQf9\~re$ŬOzy4J*kT"Y8a~%de2< bZfBBLU@(mu#⃾H`lbd%pF^7J<8JwFNJV0 e'y*ٽK*fEQU@MΓ5ցFO28E鏁Jhy В%ESD;l:_OC9WfB>iw."\!nϼ[=igV!YΛf6;VR'ptgԀY٥EEO[}{Z`y( \cEt {[uꐐXy?Λox{ z$m'JKd6+ۀܹoo!ުRfS"+D ٢) ~u.<uE*[l)ƚF<N{&?u" )D}>+ak_7cb6'U><ٵK%G'hf!vBSNsC$J癡Tz &OO]ltHA-M =`yԖɷ?V^[)_&7`/VW}Q ̔f(HɄ@̖ 19dɫ.3P3 v3w^z+%?[vr[4ٱ0N!wV"*G(˵_dr6\䝘Ź״H9/7@wy h7F'U)H_{JRթavXnghD@)6NxJ ޣgA"_gDLT|5?x#t>e:$ y M3֞d_?$urL-}YXlv+|pΒq&!qn.^[.;C t闒3)d$ Wj^(;cVڧ/\ T}jyd[ΠY1"Sd,9m;NKw=2@'!g TCaUUPYTW)i#.8]SH6zѥn0dRm68mIzI+ɶ6XcֳVu@ V讈AH@ع^!>wR<4vٸQBBYqмaLT $aPG4A ?vECHhIxM"hYYU*? p81ӗT(E(+" 0J?’aF#8XHOzQfR |`Ze"rda$@f@*Jth@P|0+Crb2xD=@(qx C c>@ h&8AN taD2i :cP$CC`#8C@X!h:0(0R~0$cHAcEh`L 0P 2L   @80teeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-03.wv0000644000175000017500000001305212140200333023006 0ustar felixfelixwvpk"88rOkWWWGHJVIe {~o}In>2 0귇\1E9' sN3|z{i=+l3 N(.Cź4$W3恊(gd9LE$@;MB2°X'ѡ AQta`.r>n[.I M\gOvW擛2oϋ{/G*"1hM/ZAy{1*o $=WHq*Q}ӿwӶڰ{ wY 3gUݤKLo݊rV{ofZ|5Wm-F>3Db_t!AFTɠ6ԦaK>0m˺D?A͵8$4DV2zYGհp,tnH䐷a5,2Qu7Hd -]$\͋G]p3OKI_xC(+zA;pq1;/U%$wXĒiɻ6݇l 8o@Q&X.dm@AB K]AcB9: ^oׂcw4G8WRpLs{xdXpܝNm zT4̥M֝2{}?`k7g(g]H~aG1 B25Iʥ,8_,jvB{"=CC] ^he6/ǸnEkNVkcʰ۽ }삠`/i_!A#{W ^94+vКq;a)c]Fseu4\vnX۩ a$ kZsX{x7 &`c=h ܃a6/[h ,jC״"`E=ǐRfhp zh`#J>e1{RPcH fZX֊Oznr۞"fp<;[:Z f5LSLѯYV"E?6m[@<|òQlxyYP1>HG'wVT]|Q߸ə2~U6YSu_=VÉ0clI>ab=.j.kC3^)6Bn)?̑Ax=w':`ؖ¯$8':!V'\vWZj'oD>Zu@")%9 U•t%oL풴Y+ٮLu;M15rPE:Mwb+, ]h2+VX]MN7rCj# g L'KҒZ,@B37ك4p#1.k$g߬>!BJ7V()`]O\51RlWS[D C9@%sVq wA6gv6y$<yC(:q0)H[G$m:"<7Rװ\a; 9 ]XFr>HƞTر{q#H\ijBL}iPo5udfq> kB/nb #9Qd[p9Cù wqW E8@\}ilJ2RT$M[p&}~L7 ;Z 䯓E+SY)<', rj^AE0LEtSOr\[HOtk`ҚYfONV3""/1":^!zXx=, VӶkaxI6.cCY:'ȅ7ZemI&t-y*2?ˎHy; r=|<˜[`ki[_#5P'0Ȧ1ٙ=DFI(c=h!J\{NyJ >6BMJ$اZFܪrE@l穚]L13 *#?!5Y^'6R/tvbYp?U*U_ wa1dj($8_< yTxzI@7/Q8 u+'Xqk^^TF }(ҁBTw"]vLyFԚܷmu@jÞ`,mGn@K@vFHvl!!TJQѷCaS @| ' Du^:)L}?T@iRIKހLuTWڇ(j{o._u#T9gd IP"lumC --6| Ir17gB_ȟOZ4-GZ4;d}"%b}[J}y)8Kk9"Y5]L,XiX eaCk&1_ylbH@!# ~۴.VIQR%&KVQѵ3Xog)ip 6Iz/ WԀB?>[hvcW|kMV -|<ޙ`*^Au* $ ]4~k"^ VSÄ,\ 'ByHeb̯bE;v5UQYrV=w˥n =Fi#N|/ aV-R`GˣMmۺ ySΈ35s9sK61oy6Tljv I;VPOnSo*"hpcu~2Eɵ׆r1V,~Rg7,Z(h{fU|!)+>livn:G 0ي׊6<|($yYQ|/NQ)+w85ߺhq_tiԮJ侴 f]MҴnT)ņ$I\QC3M`NctsP0*N?!~'{K ǜ,`G܊sMEXe+dŢ,s?L wRȹDy`McuvVAXY%7ˎ,;M]p?s@9+"`\1uTh=ДI5T*Hh{NOL)OZz`bf04k^,M̔ V2Ce@(ٔ|Dͧhn?{GPEfX'KN\ =WE nV  ,MlEB,aI{7\)&r+ V"7.Dcﵝ6B:1$lDK ;\~/\N9AAcaMca~ZSpѼv42.c$^R+]Ϥ(8z^13oClq[Ns8ۊrv OYS@Uo-<3?@mȔqjӨv דԥ~(e:x5f:{:+UMBbK8 ؏9iM2=Cw0 }_}NЊ`\5tЋNoC slfK.˖ӖUǡ"f`߰[uwUW;m2iH5c>*&&1,H]/5O=ԍ 5aƲKnE+3WtdNL4o-ii%`$DEaȧGpY ՟E~'爱Ne/ z"FpVSOԏ}qfN?=2r&C:5I3!k436I^д,y2ae#hM6 C2+i fԕY(%| :θ>ʦdُ3졖!^g-6 џBS Z\qOz0@:7o\oLZ$[l4cvGaa.&L$gMA`Aj{iÂP ⛽NC6V cT慦. Y6N =d-D(PO\A S}tuRxU$>Ue[֢嵿TltP,g+6, ZkXd:*v .7dJW;}T䵩vO5Eyl{ TYDBBm顇cɾ#]@oZ.ԍ]ӒXo, kXZ(,ĈP\:xiqV=wfgnJXPw>O gSqѷ1g3Ѥ%AӇg:8"@#P@~AI$dA9l88JyBTI pE 7:ԍSI4gOb K&KBlY#ۀ@}\G'!>΄".|"%9?"t=,ࣔa+3'#*PÐZsXAV$LaR{<mMVXj 8h P ˰)GP4ǃc(@GBNBj ## |t?. TA' @L9` "Q  ա:.4Ё0?p Wt `:4:qoz 00wt zC1zCW~t`:{|4衟X!PY3h_@0(~mx)Xmo 4PQteeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-04.wv0000644000175000017500000002221012140200333023003 0ustar felixfelixwvpk$''wWWWGHJVIe"G{}w{w?u &]&Nk;I01Z5DjFB BȀv !%NB@0ﴗEy|CFgɌeDE>xta9 :P!90`U4 yћC)Br=Q(EpE)@!{I)*%uP@YZ!C3{oHnq{ok q(X:_$^V*Ma,nz<2U|/tqhK>|lߤ_-(bz{Ss|p. >3/UVz@Qjt"g%@s 3Z ,GEC l$*eT4f.@dw`J@;vGy(`ytȣEQKsՓ5o׻)/"Wǁ~ڄU4;2U1)D-ͥI_]*f,eQ'F n8vqqN\`}ijZdHHyϋVvaf 86@u^Оu6"ACl@۫B%J}FIN~+_\WhC4;!P֭!|Ȼ73 姲}eqPztόZ=A=ނ1z=1V4ҕ_y5 K8$\c N|yqsH V~T KSFqBcJ\8 X|+S!4)y:PB5ox $,K0]hԹ<ܞ$,Wʠd̒ n:;Bc. H~x }0'\=LmDe.?;fA'}Ev/msEW(HH8(\ E1B9y-|a0-!Dy:#̴^Fǃ]`tDľQ$Az4SQKÉ rea֗ݝ;emT"M_@PU1#C; (qk&9ufQ?`?W3:  r6;H DNt.LigXC䭉| 9$Af bgHښ3X6nzM=oySWdﯾnHM03yh`WB9b&qc,TWu]:opдun0{߭=KlLLQ @)zvC-+ܧNHVb<ߘ_XSߕ&mJAw{CT4 dV53k7HퟺJ+e9*k/[vRy@0p*|M%-z V:近W~Ak@j>$v$A7e%;cb]u5W'xC,[b>yWp4Nl"T_F.x/cj5وkESȈ\ {XieN&5󓍄-<>aѤDu4 1$)X̗)tB/ t6gL&J`)ǟÉ4e h1@mV&'t}pIхHޛ# le T^*$u Or H^;܂.ɧzj;0ψz \k6Cћ@šs5n  y+.[\9;}6h79I3~HO]88#r9Hx(ִNše ?rYJ h4"2L8lS#>P"KG%^ ֵ4 (7/ z^Yg]F^qFT&7{XO{m2/_!DHa4 j-ak b,nNYWGmq?)Y9U aܚ$Siuqt.2+ W&YZ>%BMPe-?{RZj+Ecd6PFۑrt?ɵamhUB?*co2,Iiui|3& R.JUVa6?y7Q}d #FiF ';\x7<`D_kyXI,UoL҂W^VX#^K tBxn#ZVĪ*{&p#h28! #4`!`:FqO“XP^ePrK!ҽK~rN@۸GVQ+BFN'Teq3OA1q&u76,y!7|[oMQ4/H2VITMoL) 3u %i@ڐ ay] ԊQIRo . ̰1 "Z:сjA$s ՂsK%JTy?Ό~/ 6=Y`2UJHX\BX"d - !:-]NyS~wtxm~]AŻ-1;)TtCދ>>5|*17ta!&uw@fW\uT8 ;Hu}Jxщ~7A鋁2F3:U<ߍd¿ ЉW$-j K׫jg~~#VH*o"dl>RWw`Q m~i pyu6O m)ס/yx'.Z(5Azǘ!Zᚥxp7/Z/FjdS8(j@NȳQGy Xw(X$[F=-+Wt`Xc ߜƼv q>w{CClj;1Qb2vji&z|mY%( Tqs} #on: c#9`NZxAO}e-"t66 )_#cwn%T?~ZH, G?c#}h0 A-Kn$B>Cm)_8()@*ӂs-S{-ODyͮiRkHP\jGuk ‏LgՐ!A}"QuԨ"J"u.d@K~ɱK9>a?CF,4x¶1J6Ouvg˃Jş%Wx )5'1X^ϱgk_\.G#q]DC^cS,yP`~*ZL6:YىeU* 4k(ՠUq,S,8l%D<َ.z>lX1o<0S"T35(Ky4j<]/xa\}tQwJm '+$*x}nLT}B|Z=W`-KLqa4Dq5r 7 !uX:0/Z }w:qp(:݁C489 5D+wD ,;ozskAfFG i] 2re٬I5^1} f&r hmgoOFiwJΠ[Vi-M}aJ_U];ׂ| OcoDgI/e^ }+|Y]bzϟz4iq|Fv j{_mGbw[lNaP f,NOqR҇|.۸ʇAJcV[ʈ&]D|}e<E+䚼G{g? q3(_A*ù8A;)Hif\`-Y ld; d,L}jLmFDg1eg~_KxWgy5Y+ҿ nS&Cg}K&қy2^ HaΉQ?W j*~&e8:HL:;tt Ve'_SAIkqoOWV)š7O)OR^R-=t@3uB7{2(ݘ6n GTP@>x 3}{eq59/l{,M}04. 3cwW1sUCoR)U?!qM "K<hOdG ]{uƈ6n۷D0 aT(f[Ó[5?q4F>Ī! O=MoM'55dY CV3[Y9:E'U6>gְBS$;0M w3ќi2`_`X=;Q+9?u:1c._Q~ X4z6 [/{pFLa;J֙zm_z`T㸪dlU\!C=AqF Nرi)W~o3I8ԙ6(dZ3H%~#eN*Z\@!0Q * D4cTURGLSFޠU%.{5Zu}(,L̾2xfj;Lp•}1p*6;|t2Ā <]ĵ2$25'G.&(, _ ӴQ"Pi0&K'Q%PM%pjX?L!rjc`+B:ߙVO D@!`uR+c완Gቔصe;\ HFSx )׋إژ5QrhBqwVizO]ƌF[YLVW ã {dM].)nPAi if~߂U!lOM>8Ztdg,lÒea1|kN,j0xwHm8VjO\B#Ia'd9RUXP3B|A욹 pӶOXPS`πs_z?|vku=U2`]Lg׃IYcԱm5 AظT gZ ;qRox;~;TsarCLI>_=ft br ۘ9!o~BS4ko";"sHYqx;vU:Pt)rTu̗i&%#a #fzqE!91,<z`A1ؒP7T'h3 sfQMJM/էtg%P6qou#hE5s,0P ݼ-$BDIM#{1:eK.?"{Ue]\=&C?RcL"*q'~|^O7$2lᴳX9(bTdHp6UEbQU)RNJ ]䴘f @_=hS'Lu( ͭo' "+±#T;C,pK"  _ṪXtvg'c!dzmiwJPAd&=ΌѢ|0B{K4' @qNl)D\Ξ >Û[ G97L}[[U奠n!fcDW(m^#ϹpSq[^әn(L0ݘ\ڞed\:ux cNǘm9EccnяF)›p$~ԕ;U2''0ihtt,M'AYU*K4i)qՌ }EEpdkG r^rH,{0HU #HQ:͉?'t%FX`p0}CO.x閡e$l#K(<ː- `D[yQMax֣˘%g-_T0lUf^^/X$PIS˧ 8r;"TyŐd7"-=L?~+W+hZeg[ %x"&QA-NmJe=,Z wx?$tC+<ģ9"༥XWkpU~ qOh)it*t`hO!gHl֓ :\ pŻ1Ψ[S2%MwS6:T\%CL/Bm [47*KM@2GA,xLyP-K#;Ln&R QbdC(Z fa%x8>ٺD5 2h073 "a!aPԑZ8N*ADaVf ,۲TXv2+҃0xr|d%_nVi ߱/B&d0sעEpa@)ҤV_= 70-As0! G6 {d}L& NyڒO"/%5ZB\\l/$06'ČxHցϢ.fTmڇOМg9*#ٰ!*QbIQV7A_Gx=B >@"I1 l8"5ϟAv0djA&?\L8+5uY0z )q,P&s]$P~D>U0$.8hfP˨ Yp`x 5 > 4$렕A)>@Xt > AN%xiDg@ 'VBKy3 <YbjMOI1PX >d$Qy0j `I #2u4&9dxO `$sv/|ם?/8+HQ. LjNь(&,8(0.2Y0b/|pEꌶ14'x 82->y_G}tWMk)gxR ]G#'* fZNLzFN?O9{N:Lלh!Y+=<.84Z$EPtj)+hä?D{FȪJaX4@T-=.M9U\KM~=0kqdb8۳eKJ $:P a@6@ѲQPJr&/_9r9V֫#Y\"|F3u=2vcWi],λ-mf 0~¨xB)N g| B$C>Zs{(/:?i囀7;ܡ;/vg/#ҝs.dj_浤z[$`fR!Z!HQ i6FӚ)GG/# ?gɷIQ~Lԧ$`I44Kg-[Yy[+F;p =7Q6(nvoTnIN// _ꋫB;,pU o9vg@ZZ `s]vkVuXKV&FqXNYgUIw»toq'ŎIC8r{k䥤*@z6=!1b@>!AH,14^ò}%%OMxKl`uĪ( yP6D+u;$5%Zϣk8&yLad6Nεj&x֛7xpbc#sw% x`g>.\qVtAx\~bҞ?&v%yV@6w`0ZM܍-KytɄAxo H2hCJ>n *ͳ@gJ]nĺN \39< TSkIt:ݫ,`JUVҏ@e}V䟍7,tI4ɡwU~.~m4K~]jb_7N!ϩ2,T [vB~9_ f㤷cX]B'J8k%m?jE%#Bk )I ,==Jh' %y^ptsP5nk:G;1Gh'pϡm.Ѐ=*=0$YmFp&YЬ펿}3ld;|9Z,Ղ .?9 7(oL#{1"YPau(c tJ2raZai(o tJ 5 =mJnlL-::R I x/nNP`B u^d j@[zL,ڷñ~.ü{=vۚATpHqXYvNJ[u |]8?T`^J޺o5kIW,*VU#]I9%0q=L}:i}TyM-˪퓩(s@© fSČƪSb&ž7kV~!2X^1*f%$x :bI% blʊ&`\AIFkVlR :AB2[Qbְ=w%d`Ji5-cNac]7de83`ooFf nRS Cp1w>U>+9=`YF/_Z䠭aoP! ?QUMG1۸1Ԏ5 oxm7(~8Sv1(z1'(; t8~DETO5RSGֲwg2`ֵBj"w}V|҉ ^ψUeSP+I Ad ulq)*i]-?&=X@o|,;sI*qF!: !\:fۤ0%'): Fk ue]ݷ`րdLr?_:ˆJd6&,o!"y&y TdIkzmZHxRB3:!8oě^n/$>-"y G(E&A胠R!AM:IчJR 5n$i`h{us[\F탃!jL>e!xM9KiL"ZK>e ԥjz IjAC&Xc?}nUNkelӽNK رUBMMX"'+=b?[Sv8QN KOXQW#[EgԀߨ(/%%-ȹ?=_ ٳ[%(SH VF38s/psF(s=OؙW HXB=)bd~䋭brA32f(p5u뭤iؑp| #>@Zv$&p,*~F*ҿ4)ׇɑřj=HQYQ]VX~ú`:ɹcQWj{!uckmTvfe!3[DTs࿪l(G`A.R\ ?N=yCx=\xL֘qT/P;rҵ"`)sNpcr+e#7B_v#i}~u2N3Q@9RߙݻWA:TlzAO>UM1#de ;I/"%8΅&}D΂u% LJy.[?_w fʋr&IuF| ީs3;A67X^gBXc@<.BROv${Ilj- XMVKe#;XjW\ (;!G>.-UZ6ju:}XꁞFN(I|>lb Z抩˨k~bb"=!=ײыNlځ~c;Wf0D ڑ8*.jK(21q 4`o? [|ՠyW@G0 5͵0uD/q׮3]TZ*a>< i?JH0i 2 #5hm'iG:x96Y *mΘE/V $im9e͎91R)δK $=F+^o=#7V;恴4¹ŸWN /Zp)E  :,] +JRQ36Hg`m8ۢ Ҿ5"_{Zs$%aX3F;Ґ^RHސ" ۡbo9u1̱whA2,Z2i?DK3PϿ,X02M݁%q`Lc!v ,R׆㈳ mE<#b&بLC<rޠ|"b]m[-`ee 9iC`zId"O |i HLa!գt `yIss83`ZzP= gP0mz[c-琺ؾJNhFI G>)"ʏ3qC» Gh-)?>M %. nWyT|[T4҉>i4fm֙6hJ؇.AHw@GeڄH>7ݪJMKuNnm̝y?5 ֑QKz$g󪅱²%eO! I s?r:Vc[nM4$0# iVV=pxPJL!`|B NcυL"yfN臊 Z7[B Xe7Ҕbd\/yִ "E*"Fb@ /i?uI >fXqg3f:aP$"1dhP$R J6vV]ȒF-0CN )&K&P%?*Pr |L"{ 96Tas,V,stAGdF)kݫh/*!tʰd`瑇*8g!.O0с?kG?zyˑG0TP( *yɈPts,LAʑt|dG6\Q!l:^Ogywyu/Ƚ+57_?:mXGP3= M/}pm\`aIC+$+Rj UXkoscb͚@u=)}K9,a:YbF ո9Ğ>Y!Jظ|GWӯLLwh5I(ZUYg[8c҂>'NEc$7 w)&wԿ%;KpI..ܔ.qk"q0/Qxpa^AdQ⪎bٶۿB7Ľnq}Fp{7^0VTW LR ;Z>e.SAeXN D{(N</&dA3w!HE0 4c -m M[zVlr%{ *3+]A`0.F=W壖[R'߃Aa>ܦ(Sl䊕,:#kִ:N1TEdM W( 4? uHw](Ko?TEf8"7sDk ̘wka7赦& ]s~&ǝט]\i^I`pU xh NBWl \ich܋ G wCT=!^5 l%s;Xˑ#Ayy:ԗ{:Z|z ImU t7p# |)My>ƀYqS<dXh%HOQY4\A$Pg++a㻠,֝kWW-e]3NAOY ):e+5{#regj%LqaldNɭl94ҕ lּ}~?m;?I38%a)4Z=BB P}lΑ`Ob ~I}&B"SEf[\"mz&Y^sIu1Oim\uLddĞ K:!S(qU !\$[_Oʟyu,PX;ә"]e_1f&g=:7=L /w_;$`2!{ L\*RN%F37pOo.1CEA4aa8ˉ}AJ@H4[:43. i 6>;:`WBM;DWwǛHODA4b;lju DIH"W/ɔLh_@ѤpF#G u;㩄ZmA\&E287[2Gt>ҎIdWkOž(,/B+Y,ӰzW8)%ZţvBE{(!dl]D^I})TkCKdRƘA[vcǕFǧ@aG0GL֠vFLo ?ݡ>&q4|G4rA%Ɲ8GHR6C9%S1ĶI3oOa#:Tdͪ;yLX!r7 S`ix^n,iMsR3G~IƧI6pM+6Q|pVzOU<Kmz}jyY#atYAYWi!ޫ? 'Po9Qx&-A#f2"mt}ГòPK[ 0P WRTN*5:tv_ٺ(gؿ|ݔ0qՒMWlS% іUn o폘q5h *7.Tho| كd$=֖Fo?(SrkMc Ӯ?,A uZ7^i"#BU[Ď(Bhn^ .>7-};VϏ # CX \4^g*5xk;ۏ%PC Gn>k(RxPQ"6Spc|')HFY6?4VwE=2Qk1[Bآ"aQ ϼ=yhNcOcd})2[XcZXG%j\kD]5Wx3R1SJ92^'ʀ@+o2I){&`n`J>;E-fn j?D8ȞTKTsF%XlJz%V5/)b}깞w'}gY[D.aQ&;t"bGBՉ;⍊^IA'P[, w/3Ѡ:UG\ N41*fꀡqAӜ ErX@S5=312 pMtV'RW傒}{mMRU" BB ͊L2$mXA܋VY97vgsG!eh24u߸Pjdj~ј֣ _KEWhNJ$it.34H0 FpP;>V<)̞R@w&k2ZR9(^0^pAJ~Ye[vB;gݳqsNS _)W{}ݴ-fߝRz~?=_?/isfd֯$E?:j >]˜`g؀HD[ϊYJfU2b`Dž,(NSN$HvOz\D87{wN-BY{dzBl@x3SIF +@AO@AF5+jYqf)mU-hq$A̺<2>2T+tsxJA00V %Le=\}饖=W ԸSv;= d œ:O˸\Ӟ` NLl0KX- p E6wܭ\zu+ؾ&\J> 9.Qfd؄"*}Pƕ9G4RΊx9"?w { ¥qw!i8.H5ZAv:Sr{ŹSY ׇR@B56oII?eR\l1K˺zDdѾzҝ]a?Pi%RՆܕDxj@70S=P.$ak@X>klU=%7'zb\N]шc%wj[?x? +> k=vIe Xb6ZX[~z>ap672%fflE}٭WSsz9[8Yd*E,F&&3oѫ7W'`GHTSmVRws=ج3oӝ[C=,K[1)$o.M_LIخ)Tn c\3o)ͷ}"wc.$IYaI|}V|gQ|ݲڃsc@hɕ%m0PwWktX\Z =TO4/Զ~;uQ߹֗%BX^yBW(qJg\w&3A?$>*7pAtΦsmՅ7ZC;QM9Ӧ${ᳪ mI+9NC%Űf_^̃609BB' s^l*'aBpݼ[ ·Nbk ŕshI).5|(?u Y)SQ$3[UOHg- = e߯uw)~7`jh4OE^QAw'Qc0Uxf .~;%k+5ZfLFė[W쵫%-5N5BOg8"eFx)d[Y"zsfo8k_N{HN%}H^Հ}cYog19ԭ!?*Q_[wNs p#g7;$)lmC58 #aF7#L-n54ԑv)Kt兲7ڪ&1n~;rn9=c%𲶝]J3֌4EXA5ɠ04?v=K''mF ji 2۠~X(yߺu4 7ɇrLw[}9 Sd'|"G_8zv~ziA羭 #..+$8P䀦 p3ܓJ63@@qӨ1H\ՄԳ {H9O1jkAc(( f yfaZPT%+.t #!hd$-Z3Y:oH=Rh=JCkUԇoah{ԉgUtw*ܒ#&q^ԏ- e(qӴδtok_o ݡZق"#BF [H#-rI.&LoR ԯ  i=MXߋAC4, Gx?%ņ 7hb՗W9.s8$֭ 4)Eq5|V _yNkEԜΤPQVdu`SM#mUF-y8ql['T]lXQyrV$PGu9HDW~n-XX @oЎ:(`tI ͻ^,g@b,TYRC\DVsyPJCe28El2-y < ZWLN,wcu͚`|ϖ_IecsQL[i4I?֥_ Gkm<""5)ْzZiT$7!IrR<3Uj+ODRROفe|̮2cyytOH h|NH5\kؽ'kz c|b`AX_[ O]ƪy0;ŏzXjFV 5o?f,ͥyRvdG~a>,Oxn.\:=ʓiƙ5{5G72xQS8Gyc.W`_t囚Y`]FO:r0dHmqɻ>!\k d\{@OR-Y:iRWd{_"#:Lxiԉ dEby!K^9A"p* Ā!D(uH3w.IPL!FR2@<)Y@ F0 zLN20J$.F8A&) TT=BBc(X0MB±IRMt3%lj˒#@aLhA@bpqFbSNf"5DO^L8rcA4!6@1h8 @=QPO:``Pzbc  B@3F:-IB@O$`M8 V 4` d9(c"  #`(@lp4t`3&4"8ʁ1P`yu#(@s -`S0hF ̀FFnUnj i3Ы0qjP@%0``Hjem;p&@'!18 t06'J;u402 yj0c@2h2 =4` @'!pfxE3`؁FFFdqchƗ`)>89aS-08`8Qp#U0`` ̀9 x0`$H PH!xF0Hd*Hb#1pfաteeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-07.wv0000644000175000017500000001536012140200333023016 0ustar felixfelixwvpk}#}#,WWWGHJVIeV _oSRsgѳǝfVubB$K@C1 2`tdJ ךD/Kݻﻨ#?KP  ϝ#1* pvmL"6"T?/W/o:9O|߷o??/mVV b̭|)[?y Q:+  hq@*~0igbZgB}\䷵Kw>-kw~5ķ>SkXcP!%vDLdn\B\L!hW^kot7S+iDMeww^Yɺ/yP*ͳ=g_,0>UnfNO=\r#ԁvfq)w]bҚ8k!7LSdxSOUMI@_k0xvRCM[TF@ga{<7xƒ'78H)K߂ NvAk_ ]8K+A' 0)ΈɫCdsuTޙ"rfq{"lfжjˬw14N02RǽL?؁ Tˤ6tf5!(۳ٛ.DK9VhM]3Ùs2Rq~b[5U4lfKbYg݂GգߎIR w2d?u|=)r2SQg Y 6wb2!bӿ@8+C$;1 NH|׀r&&',\Jay[fui`&o$'R!Ƞ@_3Sl iͨEl rgz`Xݢ@u  == @%xkfؠl"OÙ*KGjQyQ A_!bdj54%1Bt(~d4(L+Z֪pHf+ܣ`mV1xs~la+:fƲ0΂]$oA4Z=Ը ȽUza>ں\^gKd۴sv ~Nڱ}d^ =Rn$}{Jw+4s4I #`n{7ϵ.弿9o{N/wu`H6+ ˕Fj"cn3.nzoMx6>O,~NpGJs$a@*- ȡրU ]HiהX\5 L phҲp!+dTɊw< Q)Ir7CF4ݠ&PfS6S -1:A n0e.-'q-:4#@7)v"L,`87Ѥ䌲逮Miipӄ \EiXf]f]~K||Aj#=<:o-\ جC׽$ph.m6~ ә1 hś B̺NxX$r|qG!qU1q0rṔ 0k_ O՛ =fBY&%6hsuw(Q2tU0+-JZי:;MT4e\^M|QNk3#=hEgA+&˓`ɦ-h*Q^;Xa(RΆ%H=^8< xhY%iIMZqy2]PGI$0A ;Uu`, `?l@rS<׬KUDKw>+Il`ln .M\1+2QL"Z&8VlzGTK{H Pj@TO_nʋw>zGqu5!1V&QYެ֐d_OB:S#0?saCgVkB+C/ܜI/u\ơc/ֶv{СcV"׀SSa6ϵ9X H_"|)խo/K> yqٗ%1"E 4sU=] <;_­R@>(U&{g$ՒwR~fY.9H \@m\nqB!8!Xl=%BxS]lti6~يh?^Ƶ/6Py`zkȿeU !fXfIB̻@Ub` Mq2y;Ʀ*۸R)q v`)Y2v4ңjPPYs &glřSyz;jh;65n7U3VcISo%80`HŢCe^ aٚWyPdِS~$G^atnkk>Rs jp퍜<k?;ֿyLj5?/ZК C^W<3:avE&U|(l7p{ E_HE d YY\Y?r&-4g[qLիJt(A Z@xݛ琛UQLi^~֩yFvu%  J̟}W}EL;XXX+~gSRe9`G=2Y܋\6|a<}=I?X }Ijε&[A ]OH0ÖDvTTﺔדuj<,"RBWP;:$6X` ǫtp]8|pGxf1F2m@ /{RBՅ,O$#򤓡Hgp#LqqxЈ+111"TNSE͖֣RP=4-1L/3:(I,…4>g;gjϊ=#% ?C锑[U4x3F ՔsC R#?s]{ApNEhLN-! ̡]Xvm NuZrݵ&"$ M\Ꝏg-mGlQa,HDi};m%EoUV2B֌ƛ 7 lϺ, e &dø5qH  X<'!ffnt!&7|ӃR.YyKW᧐TH쇴B0h%R,.?N)("RyYթU߫TE`CFǴ%IF(YwC cnHE&*MOT t[$nB> 7l/3DU#Kdd$Xj>B`9h#L>,ԕLI3J_[9.("i%3tؿ;L˚DCb-ޔjtY#^DCJ G4@HTI{F@B#g+k $Ǥ@1271R0jHԏِ16 80A=_i# KŒю%Qp,`'8C@p(HF0$bcQFmIɳBTa3   j8G:<8Gyi*Y2P2'?M"2 D=QP>:sS| F-a#0Fthqv0`@=>t}j5:0C;8h_teeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-08.wv0000644000175000017500000001664612140200333023027 0ustar felixfelixwvpkWWWGHJVIe ;+;o~}%uB~梁|W>cOskn#Z"] ;s-g;NX)hı C`;69| ':V|;ݪRkUpJ (7KcZ[Vu)LMfK C#!jD{0@9j1 CM!PZ<6JD.e)m "̄ .@Gc$MĹBlN{[+lV)GSV.+N(S>;lN5y + pcazcXXȇHlpX#apu(x|dy/B8paROqvY`_ߺpV|ڡz\D+p9LNN}!?ߧӟ ƽM}6}>lrxʣ̲T+AJPJȦ Ht0}?!!NB ?2on8-Ik6Uk0uӺ1 NP\ߺ^g_^lMO'*vb/_eؠ6v1e)4Թ7g ޸It]WMtN6K/O,AEt?0pLy.i*U#aӄdv>ɑN~)N Y8\Uo'u=m@~bGXΚNc˙ě"Oga B5 ]Ӏ?6B6]K% =oԀ~_ap$,&;nR/XqdUc\ȒpɨqDjG-䅋ϕ65@NpV۰GIbJSم)axȧ- 5F }_uq}\/e6v¼G.ƍ<>ZQP> -V uvG x7xaO X_(Rnӕ*QS-<ngy/_oWn'C37Ꮱ5Ad]?9UDm-^t *뾭aUI W~-lSmӬpZ.>]:zș2p=i"@G@nX1g5;emyNT#ߙFܐK^Si=,~oT() p储+[nj+ p8\ţ; O=t=AjZR8p|Q&Aӏ}oe̝F´=؏$fb,yxg!)E<<0S#|Ҩq]f<fpmQn` :ĥeI(~%?_Uu - L zIs&B U,r0x'E#Y'Tϔ?תWfw毚Cxm!OJ: KTxT%Ĝ UE൒_U oCq⭭m~}XxEÇ\]aNBJ;1Q[gHȁ%/`x٬mXݭ:JG8R19 #Ⱦ`k\J+˧PEj:ʬrIj=;)v=2jFlCLʧyXBq‚tjkMRQ^b[tnUIohت[ƹ5E~EBS:YH<: {FNMSPDQla 'ϰxz@1]" 0uXɱvon4G[osIfZ'oT~I`pF.hSq|"޳H*YUc1ooL{<Dd 8 hMyHm`Ԅԝ5yn!q|اU%WgOz\&@dMX#7'êQq5GAs(0jszY5rYqܙҝy?}i2dI%)ms{%wB`5'!i[a`!{F&mH`̀װ 1#j;if2o3>acKpk]Dc@eYlPC*Xz}%nw;6H"cB`S-Rg%M=+Qw(wC@p F]64N~}H\ Uflˑ$w =4$&[&"ʄhEұ twIi0PV{SBo]sGwbѬ!Pg7̣ѿZ~< Yn/ccJyDb:#j hS-lk@ mcDG95]A1g`#ylհ/E/f\d܊ђ;=ZhfV`fv%aHHP&{Sф5LT}Y[Ae Kɉ,-8bMʉ} G֢SF/Gv[`.  Φb >;<|~ނ3P]7؏NU*/ fU50f%52л3.Y8E%O= 3`rmO#ɮ P#Z 4z֢UT4K'J|ECot1LvoZAf#8k̺!=9n?Tyx,G…Ux٤b:"G4^j/΢Tc*Ÿrׯi ֝Ç᧏7 Pu' E~ˡ1s``$6r8Ovb'ۨ:+(</]KMTdO(ےA*Qz# 77Þip YU' OZOX6#ȇҾ:9+PY.]DƈNHr+AlKPrwV#v_xwƁ'KPueKr;-~]QXƊ9GL݃Pկ]aYYghf y%y5JF(~rFs4rz ${Z5@Z7!> ~d J%Z[JL 0:v`J7 Ê&hxj˵'zdLAZ{`/. )/F޳7|wG Ù04ko Z4_8]m.#^3ِFlȷޞմ= SWW Msi@ \5foTot_G0\z Բ(}j%BO"t:KxL?D1HK9q]#]&R*ӹ]@ оؔ佡r;KoȒu%K:Ą\ 6aU$W5y{ᖥcX2F%σV 0mQ1Az3d4~52% rÃV8D #kJ|Ս'D*~Unj-iXchS!;*dݝ( h7fqR=~@`Y.lj?IuSH@~65VH ?c uR)njŅ)&?8D%paSlʃnJ Xa -V!Lܕ9QިW'eRJ}nQtq"~7z#;^c'fo0=h}Dl55äudQ! seLAndXv@+. ˍĭVЀ 5/ ҵ~᧼ nJ X&9k%b:,H+y4ϔ[\dD@MnRuF)۾3.\@"fC1Z礂4Q4i7ZݠQeslIv$cry[m!}6G6v;-=aIH46:(نQɒn6zuTjI!Nkf#lOÖf<P; JX}&-%cOt4GZc+nΩ*(Hĺ.[VEIAyrL-mW2U7ݹsV%u*mtv;6EuxSyW疏S{#_ ׸ q0g`LѠy\MnGܽ{\JK='۵YhNr%›ƌ,9Bada2Tf` .`~0`]w4'*j:!KA&X#Kf"(]@2asD*?+/XQ==]Z-bT.,oK T!v2e;ZtcVEod  x!zl_v]- xK"ΫhC cDD7=BoT48 {#}{Pp5k2L[loęœK 'NkT-67ﶚ$X @HG)7o`pLr?Q2ߵg(zQ00 - />K+C~oW«K3j[mAwhdk)ȣ!Lvdƞ~FPN׻mUK隉{TaS^ս3/Ig{ZPNzw"O]21B0,j@\d(QCRVl0*3y/k٥S>A286c..J1Gٍt;<4()S!\Pؐ_(&[ۼ8^ֆL|+T71o%ujқp<(gEņK6⅁;8aXF0aL8)E\HC0-Me܆sBvt}z/ & V bIJ&7,Ü"+wwWώ{p{:dPc8k? Z\CrIA;rVnѕ (uR5)_j }e4$m Vv5a꿎ڛ:;'%?9) XW%ZSҍc;rvegf2w=)8v̈́jT,1!)! oP/hr;It?+STbGDX r26= ]v,SZJ6wFWǖc6"1pz~ thHCջ}b&m[ ff y>'l; lc[ql0l4TH/ Oz؞ێ6 LVJ7I+ 1(f(/>H0$tuş](q8]4 <B۝hRp )eTGZAKF]~VeYGe():Ti97NU !KeF`}#]^4 _rYXʦjʹ Wv.2WzUW_̒g\kIB+zhdDLl_PcDg}ϑ$]fPpBxqޙ5HIAѼ;qr֮Z}5&hw6,,[\bx[np9)"aD$Q47j`1hhD8A5\# e:Jb|&hEw> h7~x.p,ĈYHa֚ ex礱MRS=+W}zedθ~c~J5>*kFt?s+?O? i{!\lT+b[<}:R\s']r66y7pcϤy)}. gxa(qޢoK>SCQ_4c e`}h3 @e;aW/@{~|׿U!V,),rc 5O ^_mH8!`|dE'dm5(b.$p̀{=w=xe.F}~,pyO O/k*׍ F+λ|">Ɏc齫{OcH>Y9%{2Kx #Y'Xi IY\:)ϐ^@l*վw|DdqG""sG @ΩeGJ佾ʜ3,':8VћX# %j#fߊ䬳;jf//فwlKrZ Y[ 1m2^#Z XjA/b0w.a |ߌFߕ~AO>& ]:- xzAkǹB}31keorx=xxc0O?y#/h 78s/`ݴy&3فP&*n]`kj7BIYeUI(J~6!Vo}k*g&'KˋF6֠y)j"x55`.[+&oX/ԍuXEL"~5qۼr#EM(b^jù-݌ QN ̞h" s)X6ivdߎM0 ؊)"sČgLű'dyoRF6ǀ X a?+ 18BL(/YQR]ƞ@#<?@3EkJ(°xT)fgL'g`鞵2IJJP_?9̈́|'Iv6nR}cK5@PُUp#ЮYn5h߼ hp%Ru4]!^W̞ 4ɟjUݥcˠp* W^O肹2j0uVr$y_ۏofCU'y_҂JOCnƨL' rYDw2<럜9QAі.E 9#lV=7Tp>E'1AUbD~GYXkFC*o)p?dĔuGs?,3@I*'X;]"=$͞;uB<@yOBtab-OU9SyryyԦkpb3/D:Υ3,l B`)RWD[(uL{|8) #zUݩ+!MNyı>l篩O:̇|)_PzMv\VʘR(z6Лh*NL>G@4HthC#Pvᣦbh%2'S.Mdo&dQ)>*l;t㷲LO}Q)5|M^tcuTg!"r\?D}xsVtR,)Þ~&N!,ku,\,<ycxڽjl8xq0lMtq%n_Txby@T&#P)`"m{Z|{F?ΣV0PňpvTɼ^b"KeۿCV鮏4PRSd#<(ƈ}wȋ ®dHokdK]̅l8F8*w<\3%`VZr&=Ɨ\BOOraZPHi >B3K(V7.{RWL79c锅$Te|~52Mt3I`)3%Wr0W"YIyY"oʰDBɳ(.v,1sY1"d*c+8%ׅ !D3~/5oW)aBƁs5V\1³Q^-` ^:[|X9scz_85iȘX^1SAQgL$^ΣCotH؊(_a?3-]&؇'nK ¯S& 5zPD7X|O-?`sׯih+˓P0F%U!ӫylNm-)JwI8:;}_^;M9CMm9ʪ%F쫧( kb Og$i!ҝ j\rja&/N:ˈܸWԏ=eTT]YJʵY@It-2`z.?Űs{ /6>|Q3=bR{Yb'  !"DV' T,jhBx܉:lGFl~HG[[U O=i_8αq~gioJGϏvQ>*c;9wEþ{`uC`k)JYHGY%C`n|Fsi]t%ӄ&vԀ;ER&\t`\SigQ+юq9Ր >@nON6?^A(u{9 `MrJK+g~%8\`Erv)z_hJb&2Y~qio4;Hg[X;19t^kOx iB%3k90ʩS2 yL 9C1|\+4Iƅ~|v_hC9LFb0EII B2L72zx HrmA'ŀ:hq!?U9HVS+ļȿ_z` Я` ']}^OD ˩3s};W_[ey7% .i/kkHXDX#B#*B{nˑւNY{=-6),D鞂δ `Y9Q*;$#M{F\§X[6H)D3,AkW0~9LcWXxI!EJ^SZȢ!sq1R1zBF XV8WIQguoۏK>oY T"c-(W} o*J ϰ"ՍINEX6 B2R׷{R СHTgT48=WY>;Mj݂o"Or$'&y!JJp55Q#ڱRK[ )e)óLWeMeV,IСd{Ь5z}&xҽ@"xZV񑪈~Yi|J?H7t"x4T $*igJ>θܽ@٣l\R[J+\Ssq!A4P6}{)28hN”rZiU}o^J-tl X#颯I: 4&gNں>sݲg:~JmP46Շ g0}3",Gw$ؾb:Q)OuO7;x-twL KS/< WHDZ]OT+(6Tų;WOyE?И~ndR" ?1ၖĭt&[d`NiVÞ&watYnsvJ(@wFq"dTt3Ӆ7TLN<up@ :(22򎘋fgbUٙy0V+ߊ%Bӽ")E }Ja)aI(t0OIɀ_lO#6^L?6Ji2*17؂4*QrƸIĖ"֭!|w؅BZ'O֎5w [3*"PVh8Z" 8TJ͊ˤFCiVD/c,.UQ`m̄ȍK& 9:@y ^nw@b8Dҵz# wt3aJ%L)sO1fҾA/Bi.cPۇG "}魉1d"2R;Jrɰ = Jekؾ 6:vbqMG#o*%ٿO,BǽCYhI`a~$4 Nd+v;-%)JC8-M)(\`Ta*Hӥ CZ, yb.1"h_"1Xc-DM X2L?m}kk_N5R쨫=x$@})|}4JP`ydP <ɝcFR%͚cx"+la5L%b;ܼ! 'AN#^@P`930h 2Ph`up K&ot^gBf#yFё_$ aVPb]G0eQxuʖ,~QMz(y"M e1ka7#"+5RÌw`8Q`8LBzIC*啁d*Hm★H O1/*jDԖ Kr0Dm3}VAlEDWI0#%DEe2uXBToy~"ptRЪU8䑣aT)&4* Cc ̔R{f=XLMJuhf ҟ: Yd p@ }*@Ox@NH0CaNayF$`4<, TJ'hL CFS @8 ?$vPƧ@$ BCO teeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-10.wv0000644000175000017500000004465012140200333023014 0ustar felixfelixwvpkI>>WWWGHJVIe$o^.vO>;w9TA-ukS\C0DrfyK=~<+[48;%` ڗk p)Tc:5K\t.N.g]rshohpq[3ʔn+=-:itak+ܟ!efl ^]SYV(eo7ʳ?Go?N_zˉŭJR@tPm}]&p;9#EeF7|jxttep2F?3p#o9\-IF{sCq:Fsqf`Ql3ዔRȉh>p`Tf_(@-?\wnwPmRDm93ZxP-֝YpnZFpoʛ/8{C֜cnm,g۶C/fgB]Ϳ/?o}ީ{˔px L.o0 FKI0c͚IJ[>?1CGOw[ʻA7"*F.t2K+R3]]27) ן3@XSOg?/7u> P$TP )"bڅhP kk?ၥʼ2thDنjӣL|]:RD *+F2r;p;^6znc{;AB=z&Ac097@-@| l^ZTvY?'mGJ,N ";-gtD[E0A"l)e)ƽE49TDC Vc_M9 ހ!;W3b:b3F,Z@ »G3>)hRZ$>b3=uom9nỪM@P0Xfd橱uT(=KAO=jGiF s%kIpAE׼⸙)D(+긢vcFKK-%N^/7bķ)Ol(+VweRyǪwOk9_s/s2NIIgBB31orAl.I$)#0$_∻/KVj/8h Nu|./s ,cu^f5(lO#S-_vRyH|rPy!eJq9SEvz_MLT/6TlcqP]1M_tR`/BdRo ;XbߵF G,oDoGrI뗶o!Va(y .sW m{k>}P''J- ^TzJL)j ^4zqt k4f% x%#؎Kpn2&A^)0N+ x83S3hs6eߥԬXXm'r6˪犣`vc@ɪ:J9_j`UsMsmo<ѸBe]@[הh,>te"q,̃d Xu.:'aѢl |͖S4ZũgZ^@[QauƤ况gZS{8?DkgL|1cs[@q_P&^ |+}sLCqJGQ?ԗ =TNV 1Ty.@29cƈ$h'K+iu dE6@{LL߮;nua.qULX:8A$̅يh3'R*sTi4[iUB*<+zA mǮ@kw뇸<]| ySL ٚFuFH;k\d37%@w&c_HǪSII  D_`X^ct~{ 9A\ZNiupic5|<26cO7xG!Nyn80ASу'l6![eO'=ma1gusi_DiߍP#gz8BoRHI4[k1Nbկw>4IY\a$D~0 |k 6u.ZQ%C3*޳p=b۞0yAHMtfwI<_ԍ|>|@qR?/ĭja4! m^)煓Yn84yPm!_P(Yaoov}1LtDz` yuyN[x8O$ԯGey1rCm@:IfNuSTY?U=%eTl8-Zlo;T&6wɪyݒGasۜD<)T` _'v䧔I}jcA~DX*OĥDaSĪpXV:wxDc2U.4Y ﰧrf$tU?6P;JjM\?]1 '-;6GΝG߬U]&ȱ[!ة\F!}XzLu3] ~MwR@[.rZS3XxqG7se%[g|MW`rIeP>JF/2bn'}6X%%`%0 ʖa3Y;Nu6tCB>!=IìV'A 2-η_Jޏ^;/ѡ7W]IE\jyI=jՠs8Ol̕_jYY &@+oQBrx44_зWZ8"<]:)t%xJ@:nm{] 5 9Ӄn[׎8U<Nc+z/왴ɑR6WYNqYz`sA"@bJUtF2 }1PR*JlBG, @xU k)g-c>7(`j. xd>N09Z@gBLw?].92zHًq$Zݱ΅\ e[/7RzəN~>G<*tf;/s| 271+/f0&42!Fw$cZF27*oNlg3hd?—Fh1_LQ 6IV4v"G MHzI` UFo)tZ ]-;gR<_Ig8!&àVnxk{vSUw5yzSC?b U ,B4 $W}Q&dw TM(~Ј +G}ib=LQ`tl[i}7-&P\F?']jP7!҅wv$lP."/RRTyx*f Ym& ]))[t-ե3ӆ☮,]T`JfKG3qikg\Ǵ\Wx+s=W? Y<Й`j:f=\9ٜv;udxfsǨ[i+`Wa#}Q:5$.v @3KNynd9ܱ"Tz؎@q潿ޡ.=;?Cp,Wb~pm8rWW<߷:n ,֬:Y \7F%F S >Bq.J7{ƫӃK;Ջ3 8@40Ջ"InU% .ߚNT}P b3>%Uc_EOki*B9y؋8OpM5c[Z3 ҥϯ"r[>KN7]\chc] f ul$h'Xon f5qAqJ8oz"L(J"4ixjTUl2^i/x-) PkNZ Ŝ^Cs3z_29cUo~##rH:]zܽy*kO/ c)^nOZF9ퟒ<1XȮ`,@E ǬI˞^`'h F~:bf)`(Vt7…40ٔ\_iGJu`bڠ`(cvFQ,__@RYX5{hFRg4 1 &ּ5 ^SޠN Y]rfHӶ:}VpHjaA`*2JR;i. [G)e:eT8"u7 ׍܉qh8reI>@4+Elm J6$I}wil14Ԍzl?*jS]$x/C8xITB4Y+$0mlDjeJN2b)ȗ! 4xQ#4c)vZGK~-}_{0]dXH@J"DpUHeGY@^ \SMDVSsd~3S0zV-54»u)sѽgE`$Eʭ|RalC=㟍_"2+7CZr1'$Q4~213b'tFَy5Wڶ[qql˨Ieuxr)#X4^+_<_մw-LqEJ5yS.xKO< ~%{ZwӚP vY% ÝaYނ<:^[?Dr3KC8zAFoLv25Sd^SҜh[ ="\əPȔesD98 c716Cn'GB >0ͿS˘a ϖDs1„>ntm_p.J"b($8_-%ИߪzGZoS!H3x +\Сբ903 iHgFztɄq>|}A/i3E &V:]-O7ꁜiU3Z4Hq#<+^,u l)؛ZOLcMX'GPCHGYgA%d_lڅF" s+>U~4ìA,~3ړ[  jIQ8hl$y`] wX ()\Ok)cy2ׯFCAn>s9:ݬ5!p*2uDiW|;[hـ BȟzO (%4wFh>D;)@@ dF~D'UaT05W,_7(lŊ'̟WҞ>iB^ղdKW=HtUn%Y_T1]0GDR 8YS*ogD Y#l&K"HjXWfN0q κo'/G|ܓ7yGv;XFІQ\/S=mv_gXpk94u[YU*NDTC=Y&kesdvIq@XK13gs +,/U{HM3#&6jT%/X,}s5FNcLwz9dP`}t\lywuߙrl+EDJq׽嗎WWI]e`u/I Scz'%, _$Ԅ1BRu8OZQv@@S;?ew*J(R4ycTHzwj1QĿ)6(e˔ZkWo 'fk>RQһ(Ѿ$/ 7Wኦ|]v ']4 zQrfkz.cUPt*>NiRlЋ`[3%_I=f U`&7FN慿$swbz&R78d_ӐaZ6*HT6+y]x:)=/H]Iƣ7U+&)3GkAΝv[" YOgbV&砌RnC4! )>Gaq?`&93 {(i_(+  ԰ * 588hF~zX4%gr9d|KWb y1$[6b3Y%efb{Uj<E7ikhEȇی肗<^F?RP^jdM4hU .AȘ0)~"oܼ!L$Fxl݂ڳ ch2LJ?M:z:gnͶ_Kjo:khm\ 5#X7Z*;xކz1:վ>1֗Q r:C7de~ë_dž2r1Z}; }p^I2dTq׶IRR$SlQgpu"@繳]v?? %{F䓊T{c;Sf̕tk /j?JSⶲqIWX8fut-Hlބ[;y l}2喤C9vW\35KQ3 jb<AK,}sK+gw)]7:N, oߨg SYg u,0@bHB!_-{˥e >m '4xv:y OSc,(CfȫCGd.m(H=z,Yr^BK\SZ5?jxA`"HV=+XvLR{apMl iZW}u?/t8WЛ[4)O)a`Vm<F NՈTզ/Q0ʴny*(l˽oa-bqT/UR_/Ych+W%suAwmmY-jX\PĔ5dTYu w(D~~NnW^kk>ߥXd7̊ʙb+D RIJSX)-S4t].dXҚn ])Bׯ@?t~ hL0u=\fzF\fhT^}/rUedФkkY4`YkP{fqӋՁ}G!6)Ӕ~"tSD*&``;ZD˥ܞ k@A&I@L(E/&yvw>=3`.O;s A$4&͔&OEKϞm(2kFߣVqdq2""6\'o^jRI3Pee`qd.Rb{o[jFSxgx9w̼g&23ƺmvȶӬFo鋟4Fv7?x9b<9Fmt񢭞q`i#}ӆ\Q%nWi_G3o?'\PRʁqg УI0'~ EM]YMY9-/}%} =<-t5a3M(d*V!Ͼ?L%,–8%aw==ScL~P? MLP¨ߥ;0˻Ѓ%qa~?ҍ_T50F^>Z5=U*q6rK>ngP\깹SãzPp`Ar\uk {.璟4 N;30G2|9qM߫VtFrK% Hya%];jʿKa6k0KY +9ktR\R(v1=d7hNwq FnJy:#N`"͵S`͠Aɤw\?#I}ԝ/j3F}"4LkWqJQI~vq/ʏLBH wx/ +[s"ad 3nj!=$",wYmj~[wyi hN$wF}o} #Lx4j <#a^gTe +d57@NQ%\G7J[E?~w??$Kpg" bZ~ 5KQħ3 ⋙INJ\|r&4>ܒ1u>ʃl gA |~_ IY ēgF mI=seG*wc'"An(k9 솣A.%+&LF#KE !Aq:v%]Yм[1 Z]l{@,A [ҵeH MXhЉaX-^o[k\8+͌b[P]KCnה$?΍{cn{/DQJn1k%)t@^5u27\Lvͫ'"Fil9l] *8vG?( vv(HjtHWq,:IDI:75WhSw·gV{xq7Ƌh,o{/M;۸Q^$ŝ!uRAơ~D}Ѿw~eİ;i zGGo;Io %0d%Z.59! ˔U̍V7a.\|޴1\{qQ4ޖU}ǀj-FGI4$.D8.HnyN8^r9rQFij8b3S>~C[,OS':P9PO]gMu DՏm7DUbs/T_@^ap ?{h1RX8ŲTtcW GX) yr@2{mȥ bz-]D>h 'F=9S;o>PH>^vdĎ]̴|ې>U foGaCD9S`](Jm儞ä?DL$|<rRT3 Dٝ7dW _UTRZAܓh ̭&::lVsѵӄ@ 53 a_ۦw}+H;v͔< kJ=1@h~2^!Q K`{x,.IGstY 1G6 J"Q)X|!TF!y Y[WIG#Lup:=1Xn&l:Q2Z׉;4WN$ Rsxm(H*4Oacs_ZkfRt;'۵mM@+eҊU9YO HBK A'tдm/E̪uL 3e_eN0ȭ[ˣMTJ~s1:T,SK9c3! +4*Lc=w|U.YCg#ybT zP;1si|kpfz Wm\;l !#r_˒?l} 8.Ft=a;b5&xM܀dAGc FO #na:޵zZ3ĵW oΟ)sT⚘D-Uf6k(_d&{1 Y/DЊC,~a3e8BY'+ wUAQgQ d"hޢА)eBBYE.Q\žZ8U\o Z)j8hEw;= eJr&snjJ߲¹8ynv<]hh1~9ʮjswxBjק]nBZ=z9xO"4jlP#cu4ƣ-] NiNuJAmϡKlr?3@+A9 p֓:;NŴ^Uj)3r#7LŽ!I`F&?˦FCZĘձh%ޏa>k[ɗwh-&h*lS-V"(`t??M\h&AL:AJrx0ms uI#6 u}66R)VL)yD |F9 ۝rl,ewpT^{}UX-S%#,*\#(L\Cr@.p Z8$6A'}23&d&rHŲ= 6#-}`%U@6Y.R niZ Ks7[b ġf7 "Ȭ%߸t(d c `M\5Q@JPX&[~秞Ez@8F"VQJ9In'J.-;VQ˿ XBŽwB&]i_$}ỽ pP;N5U-1 ˌ55|DٴBP@ߛHD7Yzڷ{.ӊ)n{ZӋ&Ux'd]9mJp6:r`4p/ (+tw'TcI7мƣXaO=nGlߤ qvӏ'L|4 RFabLp )D,sn8͏eո>I| _0-O?ܾ!.2"IMFBO)rzTӼMu(snfw ᔱpKC,ZmFWkBl.]$Ah q9MhF'dP@a9l=}~_J9uZsBמbrvY Hb-+ÿTvVdo<U stω[+o ~;I뛻9.a@ϔBx$p–~;FC?:@VW0&4ΤcB>PLh/C5G1]bZfLg!hndB̘StNKHQYKx'#w D%8xl {J2E$vL_i?_ g!+'6DL&cxʰp-ؑɉ sQ\GgDWH36ނO6s,=ݡfBrW@14 OռT.|*R@P×Sz?/B @=ۓA^R+Y4R%haB;߆BLAư(UceQ !4 iUeeL:: oVzHdjb9_y]ү=ɜ&c!%-8J;Zn PGKu٬~=S<tDuӅ`!J;O]Yx0#[B˚Y?,|}~w&QvIհD*F51^^„eVk_$2lsmQ/k-_2}.[،>CcHWSP[D-޼(eIHU ,̆I VQ˽f6ts7 mYsw0$o?N+d.ˬRZJϩ)8 䍣S  r"7 0˚\&j^`+]݌Uu 6 q0,E-2OOLx&T+x~t‚(˔c@R 2DYC428yOb-?{f[9Zeڇ(M- )wsxf4<"+@D@XTH\?jp /:?WIqSWh !} t&Q%ˈ<"`J N1=%E_# o^m]w3( S8l$sDxQaI\2CHR=SW4.4@\-}n_ LMf",b9Bf U4HqX]賊[` Kc-:g"%`]e)}6{5g5SH-GnJ26YSy3`^ VFn:bW0c2v6@zaMՀ U}gAd S2t_Sɖ\%xt'9%C| 37$އ#9]>4Q4.yeշ_M&HCbPItXpwiH3HoXN@wƷ8E:{ ,rNSjyʱD&xI`) 092Lc80}N?[[8ΛKe#+Ɂ;.TGB\ԭ ]Ŭelɱk C7sk{ә!V Y6{e PMnC he$*>)cfT<+L+ }fTϫv&M*+ZR}bNQ}pp1. Mß! *t7ɞf!븩we). ݝs|XG(ܧ]1m!4#ł9.P1ڄo3Q: EJcdο'ܭ @rHε#+J,e;i8ҫchAy@NV5 J?yr&꿩nzC#hڥ:QH<]n\6UfgNtT=.X)9~}gΟ"3v5Fnys\cv9N#6ih a:]ۛ#"a2q[K^"qm/`1]Yqb 59Q0ԣeHm3ZڷBO{G7@[O_ ZT+.<njk"`%9 KC'/L4N :H^!Ĉ\/WǑm<ۺcRWP;f9ܠ®Bꏩ vh,Ye$SE,PVC&PxǖG_L3k!>\kڣK]}ixri,P T\'T2@Ϯ\MgR~ H?p՞`}X1jUBΡtxI'Xu r `FʑAkL̼%T iV]Ԝ'Bi #fv)VT9aOd+GXtdp"ܕpJ+.xuVdehpL,?oP'Td4xa8#DB`Vxq|«=~0[!^rϪQXth/i %% E8Rm-HD@/ O R[YR'8~i>f {]wPVZ`:ٕO Y Jl0iKOG~f&<3:2B.#iECIgm K̑T=UHfIPZrtQVˏ>J0\!fHܸpxF0k#M-JFv.TKX᪶t'%PUK+'?ON&XFӶ^H'k]N,pX]ĺۑ?X/ 4…2@B%.rhOYx?Ӧn?uQԲ#c xY'oMa0[̞0yeD_d:eqxEJG 3]Ӧ)y Z~jU5UoZ_JS~z-!#n SUעȗ nim)(Ȧ8D"|,}$$ׁzhQ?{3s#i؞&ULuٷ?k3CM+']eE>G/-3ʪ;6éf<}܁DĢ!fy YXx]O1PZ[G;ّ@E8xGeK |AP22&$I\h 4V}}(0ecuvx[u1@͑ ζ)@zGm=4DדKL:5J0U %jFjBnfs itK%'I @>, vL 9<ǖv/'\]($^I? tD8,~ہ;6 $x=ԘTmXi[v tbߗK R%CNݍ-T pPGt8v@ X'\P*Łm8brٻW= U5|t4%x"bz[z) ^~Ҽ&?M?B:6yC3JYڋAqS jŵ\&IEb0m^gL'2Wh锖Ҥ%PSF9+; N {EcVnIz55feXnmhYլ.7/Fe!c=sotޖII3tďsuzĒs.)Tzo욌z 02Ձ_ $iFj;^7C}eagoT~F疬 \6|0b\*Findz=E&&$ >F~XPe遈d gPme)Q*" 3'! z;`:7!xU=w( 8;WxZ0fln1r(8o־æ8!AK-b)ôE͞ Ҝl\%E}<+,mV{Pۈ`hv1+!%̆OwW#.d_l?K(AB- , @G+e/`/4fLjteeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_short-11.wv0000644000175000017500000002755012140200333023015 0ustar felixfelixwvpk`/i+i+~5WWWGHJVIe>xm[rUoxR(nrY=KP1Te٪L4!@m[^27y$}#qԺvLNZX]/1r7EA6@QK)"X .' 9)dҴ ԃ^́?2_z "9*c"}C[..Rf tc?cB<^YΓ8O5¢Q4 ?l*iuvش_/o&|-RR& „آly1m4RKұyoĴ\!RȌbMX݋KiewxZN|(t >*(PC AM" O^!78F)U%Ri"H|%4C4ܠ˚FE@luKgD;C= 1c"]h!&-ł┑߫#'>[*;w'8K)?PՠH Hm6 m %$MNb>x2_%/vqwGDRFq#њ-MI` %dBxxEQ_?Qf5L1&QΤ~a*Yj:rXZnfg'mDVѸtte0B -W /h[H#zvϰ^ "֙JMLaC! 'XY, ^P,ƉAnχYiTA4 5=H%k/6@v JN"2#dD@N=dOH@GtI ,/ю99з8ȹSA^i( >j AP"N-yS%Y[=O.a_OMP,fXPԀn90RW\Q~<囒CF0Ĺ\uoSI%kd<9+?-{տK鯚N!Vjo4_vg4(ACVcن_2) ?TR;f* Ej̀zj#P?~u[L]幠r&j '$L(Wvsy$fګZE*-~Q`q?6gb"P31,00 /f%3mFmRVc}TX(UT=^DŽl_5㰟dD-;=+v|qrߖļi-na{xiHgᢨ-ܖ o| er )5THgm_lbDV H4-xpwS\Kx?bpIkmMkY ! 82"ؼOቂm߯ՌϣNB%=ڻWeJJ ̹ G)ŭ)X-fTެq#8x{mMBڑmx(qT`ϼsȿ&^c".HmjS=?T.gM2ςRɀZE~v:%=D͛/TFR#>@f~ҿd݀lNjh>Z[ )lDimm]JR9-{@mz:|Eo2`<.䕖|?$Y} ^ltILʐy| HlYu{;{ U[Vo CGg^&f]\hWKy'NXx4A>w2sBoBn,>$פbA7D3q?1?# uUC+ZTt M9Υ/An. :ThwI>99))*%Ke̖A)S'aZf_ʇҭh$~jHplKU6p\9j3.nM0&DHQY)V8LE$M|!!{(TxS-ڢ'7fX_klzKZhzSrBWEe%U[yb1c˜F\ L?tu}IFxUao̲ꘫ$L z@9$,~y\?Ŋh^Q{zQ蜞sˢrS*f֮ms[kCB]U=2Ks e*]&N,ȝP50*UԱ l]bW - )HLy?'N0.:(*f[>Z>!MP hc*_E 󺟦:܈e;dL-yo{m~} y`[~[f:B`J) e>q`Ite2X:ޅ#fӽP6&QrMeT, dm67Cps(z,wkECNDIk $&=ݪED&ITd`GCƺ"AZ@"9^ٴW-}GRa偃WIRqnJFBޙa*R>S2W Uq4Ng{.]RYC]_#4Nը(0|Eyv뫾~ :Ey7Fg*C"'bvC]Г 6csx`[uv *$*Fm7`ɧѵmUXLVcDWU0qvlkto𐘰>7.f ÞR˴pxC_XUN#KB%Z/|.g٩H4njY5=ܣAhz|𫖇:]$0#* I<8s S9Ea{`wrǑE^78˜/W_JMCly;Y5&/ma 4(|K&hW#4"KL)s0bzCzx!264Fz|ZF{/kVpʒԘEW^u겎_ΦJVu6S _Wi 9^9v ϳ;Ͻqp<ҩ:^u 3fz^}FTM7!Ikġjjnq(~L\_J ptXNhh;b0K{1ER8r<&SXskC3|Vr8>q`+;˿)[ pُj\{E}AI,8iQ0zî*OJCk=ea?}ecsHИ  !l*A"?8g[͞ M:#}.=9h͓J8Dҙ.6tW8;ޒrpA ~)hGttT8qEl3쪜Qo5Qddg_"T0ȍ;xX:&(>.x4Ng 5gkc<ЂZ1w+"8N0Q.nazE}߾Qfy/LWojÌvLj&Ca1V.}i 8_U0]:@mɂ"-y68ݼҼEюtH`*%(^_14uy :IB|NkHODsᢽVwnuUhY"鼂_qWg Ix~b]F Jlbq!\[p6)ͰMM%$t!X׆3!>d:df#jYwweX c 0F,rהZ1%-T *l.rDS<+6o愝m'SH=lZ%N"wXư!bCeܾj/r'} [wEE'60Ƥ6]kͣ5}Lzq#B u0F4h}wrgƈHo8WiTP=2S7r$xQ2y̼pNC9c& j|dt5>Ii]dnTt:>^Z$P?.»~^%,}@؄l>iT}%yOh7^[.Ψt(xdY#HeQ4>Iրeډ3u!)va'4کiH"s퍱|#)YxAQjyC+[9acfNT4XkL/Ql) NT U{ߔ=}$X^iS҃E̴OQM,7gu[`͒f-"%Wϙ}pW5k!=M^ȁATxj(  Pˠ>?kI7LOl$$7iT3L50뽴^|DE5X_n2@KЍGB]Eȓ|V2ѸdL(/x)VXo#Mvl}*jaB{c!tt# :!˦ʉ3o#4.Bs4M\47f?8--};M#\xl=|7L,* 4BPA0̨ _-*D~6n ""D">*xSMF }-5g1g̤&ۺvt;Y8:(-a-rSUܾ{Q+LݓsaBؚcEL=M2T ? -!oĞޓ0  @9k.Q 8ѤvQ ۛh=_#R@iuX{.|t1wb RQ@07咉XcCЃFzШtv%kI0eaNx^8:k;-pnf\tKg<,Sp2WQ){(Z 3`amz5jۃ1->譐ot&R9vW6ld+>.sSEct2R|,-tZKvWpi5)oL4W1ܱXcIaGr0lȦB[ AƯؐ[!m9Wp /KA ZJ*L-LiMQ||Q_.nN (֩ﮋ<w& wz>L( _u%3> 3TG/,d߫|+%?>EJ9_%\|軁1fP娗(D\{Z8k#Tx'xxЀ1q%3L:= nrDWh(rY}N.pJ+;sp-օZV874ej&+ =d Cj C t< !)h.*?9۝uєgnsQV9I>[!N^ L'>A}\'\ED@;$E廮hJSb|0t<_W̭UbM]NvDlr=QI@K),% jun1 u?K~1}ju+o _kiⅭS9nP֫is/x~iKh eY& +`b7U8 YdY^ H#3-/YL2 `Y"sunOUQ'~ܗ=Ie0+KVɠ?r  ̗ ;!$.ھ,).,wS_7CY;h %0 $Ƿ"y=f njL&eU%-:| P~MNtc1ZiVkP3fbHYVr/A<`⍮X `V6Ⱦ(Kҡİu-jE %=h_xz^׽$uy.8:YHX‘͛h<ʭÔu~K4& )}O)xhU/q( :o?4 s(g29eX쾃,zSWb< <#cob C5&k pIBB^w瀚 1^5hRT@u8{Qbܶ⽨5<۪_|W?!T i;+cdl6ɳp:eC0si 7nob軄&_{«΃ 3(NMWb!+$RKʸlNx2Smrs }YOrr ʻƳ {GVkdż%)2 .9'4J;F_ Fܻ ψJ1Ҍ\56;CXe?!{5EM-Ӓk#&\Ja)UIr/( գЁa(7ܠ) fRp0qsX{rĪeWn%6Y|m~L=S63ι#с>Ek+>oh$Tuj?_W C"`mĦ-}H)5!J-GWCֵtOE7 l⺶w/T*o G~&˴7?*j$I^JKj͹V&:IJ~$DzpڪXs]l'"kVR#Rt̵RN!2{8Z.Zya$S[p-){]1tI75Aa B9bN;%EkSIjJU)I*&k#ø LjJB΃CXGM} 1#y;b;gljR2r[8,C2o.1KAh^ӬnLfǍ>b,D#!Gݮ;.qˎS ȸʛ~7ʜ\AvmJ fRҔ:bfUdrKl&Cp)gq z꠩å0.oCEsEʾ~XZ5SA[6Oщ[.s䩁xH(dh p8"*4Qg1R;L d wFď6* KW Z (-SG'UgI\\Pn{`mDV ;#Y7S5;M d6< F1'NcuuY@̣f }kԪ1K&aZY[z{=y/xLRA|+(@,D hj+ H:8t0;/b6lQVK DlQ4ʈ )55Qq-2JQ詈<|4o*hgL% n>a}4oa|V-֤UpUAcb󕑘&8a'`"^T3]ExD^QP(̃:]hQ\:݃oJeL`Se-p yD`/ Yk5yO VN}Ǽ˲ ӬCǂ}sT# Y{@ PtvYdWʇ`GDYOe<QT@SȜHXDz fF`M_[e~jSaBݗ%I$i0U H B,L'u`M"cwy]7wGIPO4=7K[LFㄑv}i(Ru x(lIh(d o6 ixr^z)Bfq i񿜥r{aGCyܣ@*a$uJ T- ?^7Б&B]}pc@kDYo~ec$ #?lvz1p.|uXLsS0+oL~߬/?jpEkZ9%'{៲?<ٿ5ԋI[rM!It{pKë's]}1EEvE`]X~}BHD%ї2)|SyIhqUxǃowr![JWotJ: VQ Wx**C6%:ѿ:WtSë:8!ڼYUaP Ym^zA'.jE]wn ]'_QIHs4ni:yG+nH+AĚgJԇ,c/T`2k >s=K HE pQXK$JuB #kGZ2i9}@C#̏zYkSc߯#t /.<=& WZS6is\ԱyGo~/n _w-uʴkoTY7O }e}iZPY*MJ燏:KaXxz5@lh̕:If\VŷٺԦWIi71uIРf71*< 籿c6[ }X0S:\ ,1L:=}B06SV_ND~>vWџMާqJ*1/X8>EtXԅq‘5Y~FRYxI}le}u I{̤L8 %@ dPxS{,(EӜ!KuedNGzjڪY~kJ%@@ #p+Y̵v3> ,iHV"k1X-sa7) ǝ[Ô[S= Ѵ#4"L%=K6tsMG(*`5!,]iFp:Bd\P3ABSCA2AFKuN3p:b-"ҕ-'D^r ت~ -䉫/^k,A5~Ȣ[lⳋN,|QS"e9l1dyjWnҗI)2VS Bg=@\) q1ے_lr 촖}~ѢO^?\(DEFrU pGVʵ-DZ qՑ.Ub5 #Ž>ֱP̮&;X'@mHFPOx?RʏJ:.8d]M_YQ A՘c'yo!G}632 ^:LxB]=Vx@$wڱv8=ka @ő:wM%`xǙ02ޜC~ۜ:Lb-@< [T!́CO?qtg W#wY#qTDjbNU\“$ Xq@:ΦMGY^c}9h|NiHkWm?0b46v.=H78D8p`4̴^p0V/cBHd@2~<~ˆý*aNu7i3Y$قnBpHVAKfoNE=\ɦx`oU)4A`nCJX!ۚVD77k!0CNbig4"ق,wj5%֤E'op2?4ܕo+Ӳphc 35UAm1x$\7ä̗zm̭ r $Kt{R>: lR.G&:IDZWSsHRv5Vݿ6SȯʇyikW# f5#޶~BE*/Vb﹙_~R(cF[9G ]B-I"^ ޗ_-d n3A4^œ+FH Kt̋0/nnex@;2oT\JBw#;*W׶K2)1&j/ `X`CH;O5; k~y7,IDBFZEK]e p<g72F: #r<]zEa-~w­`ʾQS\XWe{^hvsl⿙rJK-aIg5Ѱf÷ljϫiSVY sŢ~~F|b~+G,(n.Xt?0<_r fz\:ES&ڙSb㳫7&'$ww=S>GSH4ƸZ8DCZ]k'aZUh;Pa.p!40 dÊRX΁gXBY^w2rɭbbݪw#`aB9p֎-A9ZAO $n)hz'sj)Sb5GD>bԻ?Z3c]CH^"OxSc9œ"}l cƈ`U +ko=,Pxoٵ\xˇE<$\|dzS }MlCpfgճ~A'[p1ݻv]y'guY]_lΔ.b\A_J.qszB O prrwR`h*YtY 7CT g+̬ݛk \z g* "+Mw e\цtojdxೲXwUר61~f!J`RH'ӦizUVjaH5g9b_unՙԋe!>f3.&Ael}ծ6JiN>l][l.]*OӜ$b`҆3|Egm#F,`zT{F}W\WN>2Đ1b NfĦtrZ~Fܣ@G֝Tn|>Sap6X ~lT{+txN]$|w%usu{h1ﳷy@B .2P19`3+@Bm>N0ͮXAP}9nSjg[]TϪΩHJY> ahȅ*pf8(bvbM9yQKoIsZu=8%q 6?\o&'TxtcFr=-ƙ#eU3+.=lG\)Vxz\Cr*I' ZeMz8d Gfv))c2O+ f_\UAcp"$/a  VMt\ ">}B=*d4ͺg0 [tcvuۚ=4fw>+e[MOVܥEcbyԐ9`E4Af`)5Xx^ sZyx1̵(, (S%#BsJdjmcB`dq YO] @)nĂ<ڳdpY}T`|Htzn0kVܯh)vY`L*ڎ;l&@)؋7qlJ_4F0Y{E Ѯ3Or}ݢXs,q'T xS=*yWQ\#k5>}~TFƐ@&U;YARhX6s!b̺bο! XEp&vbV(E-@#8[rfH_VPFG?PJj <5x9cWzxXȇZq rk tCAIᬚS% ą{0u|hW\dLF>b ?D#`ȳt[4!Pq@ r1I݉>0EΉWω#ܳWJUyAnB\B2DpԼnj'0?Ub?(R-{[ٹ.6PHZfb .0['iNNPq=t!)4'*, cݮuWy$)11E*C0Kؠ׿' q 4]Q;Y}r$|8QdAp)F91TN $zZ6%??V9#Y8B)pMgb(z^N1I-׻os}ė`^xgjdRH *ַdAX]AlI-ɝn6ytLJ!4NgVv (#)8~ʖcD]}`b?J"~(T;iĀLh8MHLƶ|3q=m&;?ٷd99S v"!*,,|C m׆ AY%ȡI{_[j-3GTNp{uR%@dX9«opOf[.FܶT !-Gs y%yImU my哺ww}4r/!S! =@a:,2}B> V@G9[2jhxQڨ?ŔCqIaR-(f+A,0LQ~|HL1ܢxRj/P0puX+FDJ 5Q7R f \>}xtjIPAPAҘyi$M Q#"EE1fmN-ke^N^ n隯{ulW9gyI! YJo-`aK( Jvk,O{^Crah3Ubjp;kSTzu+@d|AۘePnv*B(bҬa,7]yU:ƇD|E;$$>wqI-uD0.S!捔|1/Da$ |6Q0]E٧4M7 b`5jP2(0G1o aVz@lyGq]vOosO޹cvf Ahc2WNyG\~= s*a+t/U",z5^NȹM,VC`՛IG\&1U|LPg֯\{T婾OϡQn!bp*T+@Y5RW%t77Nss8MDG."Р%sNT~⑳}N+(>AӧP'Z""&2 %|ʜ}pa "Q֎G"|K yv'5uߗcY<-yE`hTiAm88m[8]i.dşGAiQ$Bmvi>>_?wt*7ၬBD@uKjp7E&5d(b*Z}H/})arZ~HhpNF$PSqpىk&6Êr4^30gp?HKC7B$0J,ͪSӅ8FFKNE/?$ꃤ}?|R$q; ᙀactv:`XYO֙F㇟4n?O=n]ǀd/SXa p""?]W[UU;}PNzaL&=NT&SlycfaT&wU.eqC(X!@Kϡ]j̉$S3=wGUy'0ŷy]gf+~L:H9Ak B. "B"-2fՁ'o-,5ZQG>r`ṉPz>pp+UFAn<R}7ɬT '|^o dUsX5\SxJFt5SdQ9L,K! |$ԇC )N ҙ,VWcQJԔْ.KLyYQ".ߐ-Xϐ݆ 5IW:\(b;8w0EEN0#<@H㹌qw_Al-|<1!;˺V83/?gm HfB+pZ>Um}LGaj _9"ʄ{NiPAxiB0{6F^??2N}'6BjedZs~SetS\rw8mG^5L+wqXMzYЖҧ0^TmʞQ֍pМ\h#H${˹,K:Ac[N*z>פŬ:tRvZhRcMئ"V=:[ߜ8sG[DbZm[(y8"AA{p?DF e>sr Å[VS-yfKЊ"9  3 ξoKn  !|pxX4خ Zq8۹saeKRh@--yϒ(?sLJg' ۇi66sai+S.K'PF>SiHxIw ҲF"YF7e*M-n9gHK X;:.}íMR3+WFlDNDpƘ膌9́uF0kE@t{G{*9=ɦF ˓Q@zd' z e~)e|A&g׻׿ėyA1Yuj.@ YC!.dg!CD S5xo Mh^?;IE-'!p?8!2WȃӲ (<T^/@rYs̵opKjooO 1TZ^Ǭ =`Tbp ^ǷuLI& fĚ,3x 4" KIq܁cm*?7hz 1}pjlvr$T:qc6j҂<;Mk*ȣ4`u:7!cQ7ǎaKR,@v ы>Fv5t[lEun3&pT?ۗS}Oa}g ('7d@dQDYb J ;pCngVIӏLszNqlC0Т9#gmßA5!@>)[Đm}e[ލ8@kf+2}&3P }0mqLKRzͨc'vEKDF!INDKq:0Z}7/ #];:TxJ=wMoǁƈ j!;܅\0iSC5/ m@ʰu)o&H(8zwS|VZG|ӃnS]w>G8Z/9]r{[DcjɌMRe/^xo}OHsg9jS; ̘65/ . oNQ27Zտ-]׳{<u ǍH!~]9@~(Ŋ',BkJw)5t$ʾk{:R1W2al[ qSR _m54HIh- 텸@k_0ԯ硐8T2Q>ıu,/two8=xvN]y瘦,33@Ug#28!:gj>==F=~M(d- Br/i"nuhbwG Q<( )ܨ!¶'>e5xMUqyaj zyd.Qyʜs|\G++\s ѕ ( e)SEYkICy\yÅX#a ]Bhd3z*K@'%`LOp3%[QX8]Y8@C LUJ j7抯[E0fi&Ӑǁ9]ա^4"8w:'==߭c'so/rG6n7bȫPdnٞ;gYV1[~4Q~G]/f>]@(K{PӅb[>rAŪ' G{ou$LL;&<dU34=!# p؆0uֱ^,LkPayuma^nUD }5NQ m\Yiһf%CtJRj.Wg1ID GR+qfZlXsގ}Lx`;.ɗIuQ`V?!ܙ x՚"@;j`F?ԬTyGh\]/%܄|xHArҁو\)M+<UZ~+qZ@l.>醄R<d=pj&=yFQAC>/ }]꧿rcA(0S8o,Ad$GJk˗z_Bҫ QːKR#zT0t::@X=bBs^$ql*tK5&"C5X jUyA8"#/vՎO|e7xoBHyr7ýr+jZbxv,sZHtFjWN=H(Ɔ*Gv mI@tn!k=& A/W0` Rv!0/#)[)#U~b5'Zťojr5S48ntet;2,kUBUdKl' s%)Eٍt|GZ6{;YGM ]V6PJ ]FCX?KVs&)Yn2 -9"$tixq`%LZ(L8UGRlA]$xm ,k1gv~ZB(D7\[^OhEty6㴍 =읦W]M"e-Y`% w͎D.H$?IE Z Z;/̵βjXkrBle1Qoci-s Wtl:Nj>SG$Gq%E]z,ofdrhqΛ֍ `M-u_9Ԧ'; nZEsu.ߡxZUh.w \)y?Im#AN0UK#wM@7j8 ^M"QRЅ4X]A )Tdݯ`nsd)qh Syەi:uR+]m],cآZf椥/o Q"|0٢]5u\i0kү륔?I4K+y-Fg>bd)iBɌ,OHKo+t=P a*+tE,Wxx=僻̩1 X kp8-JfS`.Q4Q˒ d}SAvެB|GXL:$ 6T%JKw! S6 ؔD$6 O־2J[!TVIU j<y툠'V)y5Hi~UI[⦕+1KܺbU/ji#wk_8YE*lzNxyq0,=|-"Is4újSܫu"2u԰R"QmJ A^ ĄqPCud>5GdHx A.R# =Q[ "zޓӳKEG^#'KV-&.9 ULM%}5jy]QWz{ beCf^_J{q$;а[Ć@fkFuNIG☥02,F?7 teۛϢh3:bU+JIA*~tI㛴\T*JM3$;@%ÃiYܨj^rK2|85Jrdc<>u;2 +8hMSZ$+.Cu6$C).HrO8˜־(hP%@Y:eB♄`ƊkDL%?,2Ģ׸Ihy gf[ù֟%טna E@GGFA TO9uqi.1[t^0xX'3@xJtL7RgJrɍ-!oZèz[ _39 45;b.R02 5v׭@NX`Ae7pay[A*T(ڈKdtNyWl!x.˙dFL|ȸ~Q-:pxdi3$3ZUX?D^<ĚϷw"[\7ru;t?W8oA V"MxF dPnYTtr3wY_­G 0Q䈒Z$`24Oì ),>DnzUb?{LcN7T0H.5l"mL}8EGqc 'nf!9_C߃^hs>: inIkDEewY7kRf` C/ݭ>49Bh/~(daxnq'˝$2;U0lE$q'`$&enO/(Fᮾfb+DC`l%aZaxWfqH<nT'W2uk]lB=6L7-zOmS=KGďWVU>QSElA ,9*nT*'. C.h[Y~ev&x ' /iC3{cXLk(bPCR&an$ E SEp9ZPAԬ`O OYa=%!ݼ{E8F5S)Ƶ4xNcBE{[8\V{ynmxj>*K E5S{ Y@^Pl@F| T9kbߟkfHtMWbc[*Gy RuN[.ww(|'K)T0૊$b+u\wWu |uqtw *jx-<4|Ju| ?7!y@sͨ2&L˅ U+)g20,w@'K(D \Om^ yHIQK<2C^d&4G2Q~`v-naށ,j=|\oxI1b/A'2Wq >2uJȎZlEjF$7H.L$7x RQi?'3fTxN* :S2u̻Ih-oF<`ovvjpEA%=Γ)=b ˻$U {U9—nۛ77*?D{dĢ"uijXBl f,fvtCKpzW2j6QشRCH%3 GnJeDMR>9: qO\C뮽VM|hp>o\_W1 BqsQ4w}+Eo8|B]_zIPH(#ouG߳yR8HYG[|/s]v?Vk߱Rjia;>OuݦkܚAdF˻(*,hG"oIbma_@~.+^ltծ7dEWQ:lQԕmY| DsW=vZxR Z8Q`÷!.;>x)RAm}MM,\/_꼬ߢEM.-@,L_&C?!X'ᾼ73>?Q%ۂ4Ϻn(waѱ P ʠR92D)@ʪ M eԋ^jdO;'U&*+U/[3S:`~]1-3,RܵbRA6tLCa:]+ΆmL(? H,"4r'?)yta_Y'FPhui;Ohg&W sw9z\oT֫$-eqH^\*\3j ]QwgB¬y^`s*<)X_JeN5B^{wNۦjI0j;S["b\v7goq/ZYcA=& #D!/Gm|F.W̗^xqVɠԏDGPהET}M8Z J\j!Fc van&p >KJf+F͡FѤ7jUڹ40 ;5Bwd P>rR8w} rh2>K J0%muQdCJA" N[G!*?>Sbƶ} v];mbCH1_sBROQSu%¸ý0n}e{7G @hDf_$r^1-0l"y7bg';P<ܱ:w1қ+ ֛AڗNacP2%a"BMe2%W,Zt.jH<fe6H5]p pnA߬x0S^(S9al?_U#߮%k$U/\l+Y1\qY K!~ljCvL kzI|v3_b_q *k0X}Lp )R MHͯ>D"4׍S4ّ zJYG(J{u跲ɤ/'pa-Ч6F}wПDsʤN)v9A]/mvOfpk`O¤ԡm$'X ӲИݷ͒ vhd}) ,$.Oi^X[q<>- g 9Iv8IԀʀ"['<$7ٺPqs"' zI. s̠ z FA Oq<ǤsmBf[&v7E* ҇ e}R @ν4 ٺ%IQ6ČzGiOׯMKJ&n]^SӁ|'Sr?[8U׾.0ː ۃ?]Z;$;&4B%RƀI[ByX_ehz?;B[I9ݓv0uGpGEmQ,dgd[wh'Aj߰pw;Gc)=I ˃eE@V2\-9KWu?ػUm .+.zx 0B5O@=BGAa1 !IJvנCFu?1 3PB[gA]YȡQd=]#dߙO(+Dvsǟ|rYFe "G-R &LeZ+(1ԭMw1E=ιM+Wi g'J1:;y+a ,J~ >~ļ>}0P78O8si60WzD3 4Kӄxbf tdfm8h;X%I+v%tκ\RHԯmm)⃨>I4kEZmQNh}HS=e~SIvlq7zYVˇi$+v !vb V]$K(e@vf-# bd["Z6垙=͞쮱 I}g!S2$y|@ͫ8܂|`NIOPz>dHB} |b.& ֪]S]*PJ'1_deC#?OoN`N|W`R^(Jir3ƴV>g0;_R,0V-Q#R?}Sgv+=Q-/eȷ${MA=}ӦuDp H]S6셺s?@ 7 y4Vk";o>ݣ" NRMYm7"i-abj-,o#CSJo߃ duRǜP">:V4Ueat/tid7ۦ691_=My2F2T#쇿+ {f}ظG2_t'Q[ t.,NRLS1Bipl@?JMu ݓ`2gLA&z!i(i}SǸ;dW=#Tt՛=ZlhV*"T0^F%̡Ҭ22i8!:1ҏ-yBF<c<)r(6#?Eh6Z:[Ѳ;@EjzH>`7UD !בst>ZY3z_ܶkY!Al#x6LT^Pgx0$?f٩?\w񽊛 ,@ǤS! t)9v@!l7;(~A}[R\ƎuE_Af&XpD 13Ch]_C6m2aЖ໎nw|Fz`u-X1V PɜLa +bCʙ^Фv:*_ܕf0枍 OHHk*Ipݐ91 ӛ"x˰ }sja|*F䤁"#Sg0NQ䝑^/IՒst7WvDgN]Kh*b>REGe+š(^ŬX?Wx)e?(Ɩ{@j]sGE4us11c ]C} r!UHhHqMT= =v*@g .Q ; . :BHSj2rlW|nsd4b{Dg ǁsmtφ5 1Qgf xXCxhfwnhQfxXk!xXC`HCH ѱ?()XCKx؎5 ǁc`NBjG5X1灇5<$hc7P_F0p0=ֱcoׁ(A"A <$|,c|Ag(c?{2ԃO<֗raͯ>$tA0Q ʘ74#`<̀?22 'JbV" f"2)'s7~7>$ÊEyKPmT *6mB_y1GꚰOMt2k,EX@뮬5Dmds5U{y]ˇYM{Pղv) ܊tAş;7/IE0ǝkƒk_Կh$ x,$T?ߣ^oKΦai.Oj9)`RAӏjU{ ;x~f.U!_ @RAS sz'I˽$Oz*)kִMC R\oJ<kRsg؅SLf Xԣ6[beaIra-9d3j\e/"+ (5i7ٻӸxp#dC"4ʴqzDh܃|\!2^E+[Oxa'1 [.(W/T-8?2yc (_ ` m?H#ioiss 1Cڶ22Ggn)5Rߡwm\u]>q7Fs[$'%?vX ^_T< 7mf=IiK?:pD{5K^p0·g2bg[=Ws9e睠( ;S*ɺV*,^ a)vF T&J cȅs9E M-s?9h^'t(1rʙΨFmw!T2Ic'in1)~dV鶿q OžG„V#ØKd aN[jN_du7mƟ;%3 g }Qݺ~W`/5jMļ=y}䆢"n5s%^b1/H@SuC L}oN>t5Z7CBזV%n,ucݴ'3$?.~8:diREK KZ7uk/y>ccP4g:yӜ?x x7 mvk_ˆsWɡ+wV9EӈV!(ubOT`<3%Ick`m1?D\OA媬sn:쑿#X'\=;W{p7Ƣ;d|_+zJFmA@.Bj>Ebrk;tD]Ȝ%-֩y˱o&v4E&thrΉO0,Pݶ 4g"K3n~6,@zT3"\cS*YhD&L'̚J9LGA!tVi4jX5Fl{b-+VA2z17ۃ*R~\収t5W^[u&Z˄~VPA8FͲ˛_Ǥ9KNoA ;^\ b1276 KRfEb :~W'̭g=N{Q i< {@ zE=*O\?2;pӕPHvP#!xH59EN) 6h9"Hu.B|?} {􋃦U|xA6>=]u߂r 'S$0n NPNx lTH "MRCG]suAC9t%"?fo6p9H!)/nkP|+p}/_=j+׷Y*J(Gӹ~:w+FmSK6ɜ`${%( . JϒqI =o523@yLQPI&&kjCSDT@k-3I~ υD<ъ0"AXw;8}gT>޿Gh]Abo f;cݧi3|PgՕ8RkfeBA`0Tsڤbnm3ȸam W@x\\Ak858UA$BRO,:_FhF%bC) ɹ訁Np @6g]uQY2Ťǀazǎ)q Ff)]Q9 MoFaIcTpUDNe?M/O>o":H7|u arB4>.d7R[3Zb,bN fHYCXb?"Ǧx$*z,5/ f0ZV^*'he _,!aCB;TmFS"2T7$TLW#,}{3 ~] >5]L{,d%./2=j5 UR(`7~&n 03q+Td)YXdWv5\DR*&jHNQ :ZK7­AJ Ic-z*g46)J}w I0BLm2!nVc"= )񥮋aLio+\HtwzM7,gZ]Za7VݬzBGEdhȓ e(d#N/tm}_ȭMLWXQHJXI.>r3˶l^A,?S#:cǀ)KYi/v˧3 ec'D7 >[N~Tfe~](2_9߭&Ugh33kM{Pш`98\ܬ)2. d{*w  8hݕTD>ܛpO>&?.T(J$B|9\q\K _Eh146e3XZ$b`]#^װ2YLO 6!mE@(/Cxv] )ޢ&u`hqpʱw[xnNi\\gk¶R9kq􈍥jGq\whhj(^F #ytt;aW3N6!=i';X԰ eЄu ]˜qԜ1B2uƛ}# Ud8A:-#i;,lGZUǰ-,b-̮GBHv4X"<ۂ/ЊY()[IQu4׿JRj>P|fcŪzqrF]7.ӹ=3&v@ze6|)eRPPQ5j8=ku FE!Y#Un]<qZ'^v0t+(F" LQ!\8}lm^j$'_WD SkO͚ 7]ܠ4ן9~VBq1ЦR,FȖ}E^Q$XN mSW" qd`< ~**QE!tB nTػ.\}`s򶓀H˅N6 ə$dN;pk} ̭>9$oTb[Iդ~V'@HgVH"#ŠU-q d5@hK$('.>zyl2ʒ MH0>jFgهUt.?{}(C3>ӕbg[YT䴧/= ӿ|ka XmI˰x:#0@&:(4i3[ձe֒_g'QM!3Q[Dhò:,cŘ߅t2F`f@%-hI A,s$xATHm p HohBu5fs2yP_S;Cn`O-^)q=](_+Q ^LLWϗAQ7>̠?p>' EZj]֟ޑ^OW˭Z^ݯpv]Z0tKЯzvt>YGEj* # !fvBN/t)0KM#%YeakpHÑ 5\=ԇ%tS]G^uC9Y8ISsl/ Q-'>!r4|rD!fHH.!HԯE(tLZof1$K[ϖ}j7S"\m"F,~DG1î*GQKSUNU &jFv1??=Fyc@p *>|?V ` 'p2 `C]bp;m>Q1+͚Һ.=1U{f Y2]adq!wK;Qš!8M*^R ~J8tS;;ZG1A@yIW"%RZ@Gֲ[Pj"x[nA #VyV5Uqj< "Hq1[<~W6Ħ[6xpZ5"$wF${(Om;FN2шGA4DR%9c lm{{*286Èv%+z[rb1%PI7{UDZ)tBQ0wDNj$>J SB %qƤ X95v>> ߋѻ&ji8Cq"j}=tUd0N=-RC SXݠiT+8p74|NkkNf&hM\n$28Dq*<<!i9 :@m 2 xxt."b |]* JԂa)L5arg63"E$,GQмb:DSrSf>o]r`Wãkx=Y%,2j0pXj)ބ:ZŶc:.M;Mv'c!TS_L0+4L\)q3 ({\phUy~rTm봬Oԍ.Zޥz2^5-kȣhbV(1V$URv%`uc"Ԇ: E%k*oEݾ+D\HY ';5h 5q|}lj]auJ\SѼ ]|{h9l+sZ6ˆbRJu^WTxz\h,9?o=.t2zh+;TYd!RnWc1T9Tyd._o A-CC^e&w(('260;6D- !6TUſ7YJZbbe6T9ܠql5EL:!׀jE&XTRd׮2. -Dzqc 9QFKTKdž/U`X1IJpjIS3b$at;]J7y`n͠־>B"Gh"sdݕU(iZbI,Ժק`3X ^;1awH=ԆdjlFgKdՒ{Fp t zi:W{8IY}2fd"%.#zW?m: ahlI !@d :׫,Ip8ugT~#fMS"|%+ ȋ.աɓNfo}L)tbK$ 2xNddU$>P%' &$~c9]s4qg WN#K ixIK "lB;].BР$͆L G2r#RH T7nv$xޠ`'gPcݠ8LKOU%kGvt@4\de \MX#ExU#W4#1 4E$KkW/S)brV Jv߀=uNX, {WsӁɪ(9n2`XZ]6ra@Z[߽O2Wծ;#inKu!(*L{&+.D8ad\dݔ7NfOy}bVݠ g ,I320dT))hHkYP-)dvyD"nO·Ø @KZWb$_MLܺ\==KLEt)ću8UJjw, H1<Ct<<Сb04RB"d8$pqڮ&lkg >QPB0՚/e @Ln3/ƔqT(ҳM-;)4X#f>AV+@6FS#GxB5u BI%}ZPU,҉Ni0;Co(R( HRrܨ?/SX@BX)QzcQQ$,* |`IӉ3y3WS"5Z?Ӡ-yH򑶑H(hI$YyiySWǔ`5=RaX(L#fDG➠teeworlds-0.6.2+dfsg/data/audio/vo_teefault_sledge-02.wv0000644000175000017500000011043612140200333022106 0ustar felixfelixwvpkUUWWWGHJVIemH_/F}>HowOg>%==qۜ&;.K'\45|vk(Fvg٫g/v/jbOm\"e!$\o*#{{WB;YIAnuBXIe,FTQ*MvxFꋿl1ıhs԰ʀs ZtpMWT$8@1mUpX{8roW/Mt=4AXrg`˹804>IavOX+鯛ߒmzآg71T:nK2'RkܥJ+CHyտKnUOͦO|_]-X Hb@*2P'f`qـV"fRaXA= (kIqCwZPv-\?on*b;Ss 㩼(o(wɟ L΍->7NM|GFC0f(= ,hQsb<ԃ.X;| XtR+"],S?|JbG>2GPoͼf~&93p* |-[T+@28ShE */X-3{晦|`΃ $Y{BjGa"L(>qvŘ6mFWzWVXV7ʿq_z8 (qG3?0=[طad斀X"b 6IVb?ai"͞&90dF`qJP6@7!] = F13A`P޷k+2Yc(zrkuMV쓬Hy5F;A?(?oрOö́ʠɒniV-nfRʿjq/E~t3FÐE=dd*dPF@>%X5HIi%wϳ42G3dl$~4\xɀi $gCZ]N@F%afB~CSN 43+a{Sr yS9)6H,@(DEڂTʔ6O螑D6ŮFWyhzewm0e;Z}41=kKJdpG&И|]m\5 O>+$ 囈8ɓ&)^_Djɮ-^rdF)k~f#2 XSH Nn(Ǟ" yݳt֙f3k&e'{Vet,wWFlǠsZvlD՟lp KOrVX-V2sw%m%Q-1-kÁ0M|2* l|6 <|vtcŻ_ g2_wz)iMj'f7a#5. Jm,HnXRPê-.>dQnВ-z0aLu jUȱWSjMo~ ?ɟ˟bn;/^jͮFA_A͵ԝ9 هZd8ߵ3^܀k+ڟ]c(8K\^A @Fcoe?AU!p7X҅ &˂jTz!E@2hx3uɱOh\&XB>uAα'5R B MZps]ZbWձ_{QKd{n\/H"Xw VVI(\cTYEN:j5s0&2ފ bːHa$_# KX"S! :Δ6s=AXc v5ð &#Uһ;#^3W |3uWU]drf35{4%b<:twqyl1,Pz>]2MEٍ$}Ðɋ79B?x"X}rþFH S:@^j 5t)!`g8 AL2dҪ) , ,Uv dNEa%smF5A ; d@x!]+ J*cw+SEƣ~LgMJ7?.qA3<;3h:4u2#oNOR m?e-G`h55r:wQ6 :K堅b~4ܺTiPIyt79GMwj# QYcmVCQi0.XA;ۘjY%c_B+OZh>)GtWLl_)0?8'7wЋJ>`;Ej{SN:)NrݱN-=G<=59/v@Ҁs64YN) +_a,Xwކ|-a@M'_1{eChFNP"͡=SK(gq"0jjF8&DxṆB#q1 :%~hKPKKTI ]dn ş_+g@le4FAвyWWxl,Sv}׬@В!Ww)`:oSYp#/Nd b+Ԝ|уZH"ڪ/B "/dNf0P1 X^g1|RmAe: lw Ja؆4ޕp%ܛ6rB|k`i5a )}Jsj$C[:/C6'ʱ-VAL/.dȱi"E1+ᵗw@!. Ѣ J?<Wuϝ/YY_Õ BKcY  )x1aeO+ZNx f]fC( dl7r12ih.C G\XX"aPۢu$3f -enLFЌb}O8Э$\g*ϼm@Lֳ zn?&q_MjֳQ9{X*Y8fDǺüJH?IYìǼ6Uc7w7=RWJY؄`U1 i;A^u dlu%#Ef FfTT] W{D r1|ai8^aij vZ+CpεnqapRuLN[6Ysm8/C!v=Q6 ]8gU&cŴ=YnJ zؖ0=oqJwAأ?RGaPa}uaow&n1}F 6Kw#7~,yD(BE !/-xt8thM<;%SH0?o~wc\b$>T0,nC;[ i_rY֔g($센Шi$rq{,>Ha359},CӉ*mA gE"ķ\g/ӟEWEJ=䉚=tbKqM#w{5(C/vβ:gfƒxk%l# g]#+jm]#͒6tA =oEy =༫i0\2r',8:2ЁheS}Hc=PPU$$Gdr)e@{n܈|^Su;vTHSn}󿵴(c*<U| 29 2)p*+0behoJ2;D-Һ\j*`"?*- FFٖ LaEѥm2-h䳧Ǣo R zQYmv c}˄?dҹKL%Īx0*H ~e's\; WYcṖHdwjZ_tJMͩc,Yz =Hc, y@wJpT!͵XTEL0<% ő>!(!(݆ZG( W@UL4n[Tˎ$ױ#͌OZ0dD]HWcZ\T}YS8cZںcA.CK Zw~=6U)YJs#٘ߺ;u}{6t{%I>ͬH8N̫ߌ*K,P)[R;D.?gp0wv#A%y#OT,L*v4N ˅qbHb习:^C}{}TLB^d*P7h7⛘Lbܶޅ=v0UYcyGYB37H,@b2GeiC>[jDn#h O ̑QQGx>:THb(YI, m3l!D :bIN.(omzyqWҔҿ`r֡T#:x]DLWЄܮ{ZuW끍|e.ěqnM]rhE3[>~9ZAVٍӬe#W'/n|ۻPyH ^A Y~ݚvw_w{3#ۗR :=,O_PxSnf%` 39gLV^5!#" *Gj۳1TŇ,Dh26%4Z@ g#TM| BfI‚ЩGIJy!Usr+I\dp&&BHFҸ,̎zQ3fU˳bƨS*RK`zR'ֹHg?0kNoF0}%L'?kZ$aq A6[jv5[oV?׊^ֵd[:~JISy@b)&CJ'/*-tCPǧ p9s Uu04j (Md9:/rc\DwRI/@#pUϝqqM[H P*_m6B@7K_œ2*oc̾4|~>Wu:GNv Jql$,g/[vSRZI4j1Je['1Z  U7 E H>+IuS 'H ]VΊibT (eliq!SNk AOl/5ʵQwՎ}y.f壕ӝӆyizRw\zj;0Lu=`2TUeut"LE  8 8#)MWSS-AAA=Au0A5`NWSFaXk B[Y^.N0A)-v\[AXн# P, q|" l~W^|ma7ub4Kk_zk~3AL1@>opMM1 ;)>jEb]{QK綌aڤ MM@pp p3Ԋ*߸B9T™%b1wPwgdwVݍW;Ǯ0$%{SwUqA^ shxP2phS%~3i b{'b<]n1ŋqtg.if0t;}a `tAT>i4ZEO'܋o3bTMg܍[׾ QՏ0!. mVq`q82mrn3RbE(5-YFLYiDhu-iPCY'Ӝ"ޢ5<&:?,~rV{عJIߏBw|\;ɚr89"P@CRU0m7D<ꔶ X{;&AO38pW h{.eRς\յPu |)^`/+׎Oi 3PB3l3 2;^L-FX~SL"v WoFmQO`Ur.M{\*lyg6#i[vW[K قjTW?3b`R<g(F;r5H~#Vެ Y"ç@Jmh5|$$LDX{&%i(eP{ Q_]|尮9R<tʛkt[$O3%9E/ /a+*sBw]vE#iprD'۴.?Ͽ] |$i;\6Gg r=lj8p'ҞȆwv+pm]Fd$>`+"/# fa;dToV5:^ ީ)iBQd<r[INqC-y_c9րѿcyy}Nәy>᰸(`FFst:=]~ O$B/]ybӭQ^S&ɟ?W\sWאapK؀zUJ%a| ve̺7H+v[JzB~Qd42R6NTNj}Kr4P)i#`aGZ)`(o 寠z9ٌ?; ^+!)?ј46Xw,XZn-(wB'qtGR{6ӆvWY)́D5NiA槱STؙv=p;H3IrVcd"jDP>o7 Sbdႛ*<~5NVTK%h!WLed 2u?G CW|1jy,fɾ¼{YA[ !?W5,[YRUJ'Ms-8PeX! n })0MVixjP+,BeW[<`rAL:^m@| Jp!\ Ҿm5+ӫ0(+9=`&qj#5x:x?P]/;nTvU;̚j@t/L|qwG;W0C>?B:!m ]x:d\5{.J˜C@!D6c#N!,qvF!3UQʤĺ)&]VRKZ@u~M:S7#J`R;3ޕF.BF"[#0O7?oˆfJ$PmOYHjY3]dx3Y{1x8g]90,͑HKV˟)ķ1eS MNf4"H9*@9aHsDH0xh1(% *$jLq%|̥@'hnMr{i<M-%CZŎI~G5cqz]㵘_5ۨ}'~ڴO +uu"V#=*~W2-y];-o_T3N ;S1RI yFKA !'%Ȉ@dQj k[.V$ ~ָ9xltUB&dP0@L< <%jj#٨{x/=`8*&Ǭp;m :$dc&GU=&,{ X~&եbćH@+'z @Ny\RB+ y؛e8[_u!߭Q#Pb,ꍥ9œn>ÞϢs_t/"jm΍דI / d@lh˃MOgJReSg#siXbFC;A-}.3˞1%kڃG|<{Q;m$c[>/)diy@{xoz7T&\L;Ɇ~mA ;ƹ@܅ xy;E~?n+,IJ6xm[jzȺo9OR([skOȦG4,΋suN>_6@ *ΦƔYpϵď j:Fk.x oi4'dTW1`5x<čIA 'z)37X.9\0Mk !A)*ue zs-zТ6A3רfe`!o9Kgtm4?43al:X(Y\id`іf<Ǫ,8N,a$Xul24M]4xj1iia,z[*CcDX~ fu[k+܀`~znי+!3(-AO%[ijW5>3k7թ/Ia64~4d@e. }M_3pK9J:>o~靄 I 1:X@>i9GlQ3}Ym!߉cdA(֞0]{~ILI.ߙ+z+85OSg #U5W63cTr[|- 1*+1;agApk!I *Sh4峵〯'ݗ'Jc?0>A &J!(НYz5X령W{\8[7yR?FQXG C&Ǥ6M:d5 \K&8x #6+)fz '-iPaNM=0i]RN?:܂F` rcJF!=$9ru4)\w2ן$ %*\>ڑ "1! Xޙi,JpuQ38>>.OIըVn=b9j> +@4x<} *{qN rB_ֵ|߾If\ք3SǻVcULr,Ԗ O̖^$3;c],Cpiom1o!Y,P!Xd\.`O*g J#ԛ ,a%2/Vס;(mX&OW+[\][կ?H {mr-)l7gdh> OBI?, mJkƜ&JM9 V*8"OC}zu:{fԫ 6fΛXJ_Ϥ@D 4nCYx}.N@4˒"x`j6|;gV nUL)w3~;=Xn&4Y珎2a`pb p-`!a[Z7N5S ) }`r0%I$!@OZ yRP62z^GD Rtܾ g1[WԁB@o~1^[Oitd}Pqs h}o3Tzuv#)5`Tgwo[Ә*;SX@wf-NBۏWÑ:\A̋7ewWB|>㧾O-MxFe 6&_5_b/xY5$HDV٥ '_Co{ J I e`ܬ0v!/ׯ3 ҕ%^v`\ToMȏ a+Kf?~{u=/Τ pS5Gxr̀=pHJacog6 yPȂ߲3h[ ]uoQ7iV8ELNy;&m_=W}L@]mRBO(=x~Rm% n[a|_*AmD˯M_T%!5'n͸Ө3[CE?<~ ?5%[EhcҤ*y8|S!gD9ݔ"@p1?`-g58JMdY3#E Kޫ/^ *^TJck&'_b94{ لM9sS֧{#\$E_=Vm3y@6)Ί;M~_:d᧋̏Nk2Ihżn|Mў%r_eь ^\Su z+"AbOHhg T>>Hni]66W.j1 {yL^Uvk[Xr%۔d8`$÷?Vr0hzN{.`uR%Z -wESg2"q̀'?P(HV%]~ f*YyDq9k:߰('+ϯ7ey }2)5y O+ǻNGvk50>)tǛ(+e8UK:(?бf Ref Ă+Ϋ_؈a ö-8-n]GN`._5c9 {/>>+.ǝP<0۪dSs^d (3!0<.Z\lw D>-ZXC`F>x!7z~f礝 cf&|=v6&l_ڍ-F񘘉VAwZ D6b`t"H^Ч4#eyzP~9L֖AP+|F@Ts 7ͥɯdOLcE\)k ~C`V5|6#Cux =< <cݷ FN+R\[uu +L:@/?R!El]#B qO8d#7II.~bTU6Z_ŵ`뎲Zp~U[xQk3:]L֛&W1O!ie\{x4K^)YS{ǧqQN}  2 oɐ:gRbj4@FJRC(_iν'($ᰡHUھ ?l05fJJuJN~uQoy5)Q"\y=CbϡT}ʼMe5\*C*1ϝ NfdG9u:_ŏ˫3̶Y0J/~)eSs%KH*!!d?bc<0N+2^1k;}Nt{_kv6a1s*\k|:B$;'_5:W؏ѩ/G cYvFb.FdsqPPJdB|9H*^g)} "YL-^ӂrP"6S"A2HQۿ>J#~zNG6\_lF ƙ!ue/0+RƮb6YçX/z(^]{ dHwnnp^:!V5t^6߀ mNs?MrFψ,簩iy{" c*KHE3 "aqe+O3MFEC};UI-H'XbJF=wōi0Yzge CX3yS-[K_x/%؞7RC്"B)2C7@A(0n:l+["tO0~L \@y>gg̨)1&'4󀼭*Kye3tqp;DWNꏪCq#ܳv/=Im>JdBaC& -Eaޭˠ ^}p>kVT*=Weq4|wCstu4\ZCݷZ+(џСѮ6 TGGρo>g˵:'vFPٚ_V/JXj΋/\Og쾞X53Vá+ìn% f}2$&jMVjdJv|Ltn"e5,4I[uϬekI}54@'|F[O-9x>ONxjv11-f'󟌣#ϊ%[{N_ʁϵ%jԦi'1"YJliH6?>HcGɾޏ^>~5(mHs"ι`AƞЋ Uz_4RC?E>~u%r☐+'a>0E+yņEuΟ HIڥa֐lL%{H+?)qNdf&lmO/qnI~Մq:YL6)fjͬ v7Թ4j  }>ݝfchRyn=ًhY D /(WnlUV~{Z)55 \J=p# ]1 kE9]f.[ͦoo+\Q%މPbZgI+ڤ^|=ηUsXڧI!ڲp5OB 1Ϩ z0l*u鲾"?]->mSbˋUm)E:y(DH@QkN&YaXSr)_;ݑNηQ]NibvߦqWV ,jV[.MsS%N| q,:4YʻQ^V^'7xF~fd*dl]6Z_3pNPGׯj'kǭUFƦoV `i8"XX3Ȥ5CY4hxOm(Toc5E fD$ʝg f 3L[Vm+UϊRR;-Bq]0IsBԛ J9!̋- ***Wդm|Hn0˵ep~y0Bd c$08Z ]F C ׿)2qB|Ok!" XQ`HiМVab/+xxFO\F>zL2$k| t{ WYi 2k*Ǿ{>U'1:0'Pyctk,D9mcK;t$˷x/nmӸ,HDul#K$ך#{jiF>7&DF=Ҁ_X7* <7)X t| JrV=7f`@c4pKqzI%vJ2R/fbVUxhLGeZxA` י\@ArZGNGrv 怗@p *-vQv:xqJRF߾ )/v9jX?W N06A#%sC W$}N%+ȋv-I|㗂2JM/"b.hOM Ѧ[~)uٔy8K[ҥ=$ T*1[B$'ovF+]""WmE]3I(}i[hQ6uύNHVh䡁szpJl7#2p5ĆK%! weIap6 4tݝ @W/CB͞OJde cI.ABp^^3f1|ۉ<}jU;ٙѻ8 lN凑Jnc`,!J+?}eMtOBPBCHqOMaVPp;:B܄2zI G9OL+vܴ*Pple*s#fxϯ`%ӝ [ 2!IͬҞ NdD+H[=}8:͒f2ϒ euЫ`2q7EьB+#5}D/;2s-lE puyS XOmߝ4Apc=f͐#VU%Cd:ӝv\^~dP 'h mDvTD5EOˉL̳@iѼ$??w2;{y{:/cml,(wg֯ST[5NzwpVrrE- <ݲ8)g :3 ')ڑl׊}] A*swLrޣima%e!B^}QNTΛ%{ Ӥ(z<kq?O.D5+L3,2V RCDھ*`eXZ#4KӪ "*rTA7{ZE"` o .{ zoE(KUcR+ bz|<\ A3j:\\OEJ%j 2D$8( s]F=-_U3<㸉"g-΄xqf1 c]₋z@T-kaUFn{!6mif*y-'pnURڿEQCwv# 5ľ'y?R 4z >&K $D,̓--'B/D+ejM y?W_]s|^knrSQge)KfMm }nP!lgI AJהg)$)pia܉19󁘘 v=%'nl+ ϛHGDnDL2 3xn#K_qe'S}-(Jν4W:CW0~D0-hFot!\qv@Fʢ C٪GCÐc?RW0cl(f',jZ1 !@7%yߘ1oC V?8 <#\}= b&gj_SL=CǠ _Qi}B^TY%7-2DgLZ+<-mUe[ez L_{2'Ge+5or+s<o_6mhJɔt@Riϣ5PR^$<G^ c  9"11s-2S!nُ"*wH`}HYw.S^~Z mQWS%S-B e l%0 ?Cϔ/b|j뉗*~ q׸X$o2o#AL׳=S Q.)|j=+U buEsʥ& 9aHxXMV8 q~7 pw<@G=+Lj)f|}Ͷsd>]O&p^lu6>v)lYK@H aCBO(H7C~1 Shd(8e/|`V?RkV, l2ν oeΓ%Ң8Ib2:9M3pߌ+!V)ͨ;\/"NdJΦ~Q>VL_ƘճB&KCiMex94jtӑ 2sտ!fA!H*E&o}_*ϋpRR8XjN9Hm/%7 F^%KĖ0f@iG4I=DVRw[,rܾHs :N8Q՟4Ei:#jXBҰQWVf'|F-+ RkKFFs 7EDϖǽax;|<|ag"tj3s߮$EMg=H b*)vTA?@Cn=[䞸 IOzduҰȃF{CKJ@bOW|<][8 wDI#G<9'Zc)#8g"^DVs"+@Y Z\mjhgϑW{1݆譛|0 OHߜM퉥HڧS_ }ܶvά*v[5b0g.$_`[<=;0@.fW,&ԽM%X(/:9 =Nsc&t*ENNd~=?\oʎ$LC] d@b(K!qY ehܛKDQDm{I5D2t(Ͷdͪ6 5x1m«@?@ׄ4 Odt>kbkB5X&\$e:T3F9oR#2KzY|aXWy6C#Ѵ+GCuhni#JZG9U䃾hImxEdS?,z:NlXkq~ySGC:^= <1|a$/N6DTb L3H | %;nZZr)(lZDӗG?909x %u;M*,emPNd1O (]Y:P`+.bkgNYߡo,Mz4JlNXЭL<7$ 5M_wQ/;jl#0o\YY|#jňh 7$Z<ssYHy7Vc'z]:} qzᒚiN ㈀e^%)ώCV kgq[.^"1g4+\9_3#!+r4DeFNAUޡ,=I;R6% Gixfp ?ۄ+H[-'k깡īB6) d+$0bo pp36)zE#oZ`4V'O|f?7 # <Wayc sV[ش) p $\N̎f]kuJ]-Wd< 1xJ4Z?/jҶ"J IA# g:CڅG̸cA[{YW~/#!i-3j("zVߋ3u+FH3`APLm^ ഝM yb"4p%;L U+wƒ펝.gATBHhyX@)@ޗVG+ȡr2tE! LT>d(冩_2He9sʆҺVS97v(P:1 3Fa*![6Am(S_ JtCXЛ!vqcpeZ-+ G1![8EݎNФZp9t&C1{LAVk-abIXv@r[F;SK}dWSꚑ6 Fc֍܌ x1J$hWdұNff:X X0 B |f9z?l5a>ܹFtĞi&EBn킒LU,h$̄o\ңrl,j :E (_H4: |H0MC@TI%i^Mh aOy&E=,5uw\|U,"`_,FPIsG  L=@Fܫ#V 4av2&x7@]v xM|gfCN., e^z^&ˎgit oӔDx:6.=ѿS&!w8}8.Mc gk;hU]5Ki`_ aC|ʀx7'G' a :o N3j͌')@ ̍gDUQ{i̤\˚l 7(7Ȥ hLap#S ER3Uķ$L_&$o'a [N7tw*dFt?W<1pL?RIG§t٨}r02#KN]MkTH,b*@O ~#ᝓAk u^g;PsDC}b!eV#;gM;‰ ar O( )_HjU Y60CRĊwryH~!^(WI$Vn{GME(i{ܾ#L_Q9 -f㦛1'P>1cT W JhL xީ\\ܸ+%?vycZ8\:~Hnλ..X}uί.:63Mi×qPjzt]߿ 'mb,_/&7GiZP%?[xMz~i{2PfAPaq~FO!d]تjOT zW[SY6)E&C evƐo=_*W{~[''`+<gGHEV|cdl(^=V0 Dr۹T}Y{Ӽs|<׭=p(dא$y@нzFE7UC|iSAtv'>isDlֿFz/I./(e9 ^h#%PM \dìIYk%]"&Q;2 *(@0K@` rС# A& D@v>'p |9CS#s@:G s\(tF?{CB{ÞAR,>yB`C]h`c!v!1:tl  CA;qC (t(jhB GE80eq/,?O6m [)<99q; =ݵ9m«[m[%Yhv\=Wuz'ǎ9R #[QwQO~>͋N`6v_yֽ61ʞ{kOn8=187){5V<(J:-e6(k(-l'DCϖQ.F Bms -u-3V?/lBtz=1b#>SEtŪxpB*㮀fU&&?% S %Hb <斘 iiG`b95 g8k6^sELñEI7fI ^-g"($z2J榳Lhí}U%?Xs< ?TTrdR vvQ@H 쵎ߨ,\%T*wrH9;ٌ6&>ԫܴ5$, nmD'9%3Y$2ipң0$|J̅#OYw$Б\{l3/xZMV=0ˇܐU[{?߷`/Nzߒ܈}tCQV$@M@9֩;,~.8̥=/J+ϫX̠ǶvW)CH7֤Ҿ۫r㿺I/Mq4p:TE@&Vۂ0og 8BXXc:82\L(m,9/2$~_ ZB w@~>6bs?w>'ihAؚM|B.q>C6:(I*j`?^I׎Ϧ IS%)xsQ Mm6x!PM,#{Lޤ?A,E0rhQӗZok{P@o :TĎko᙮ˑlj˓XJ,z VWb]/ bs*U{.2E Htt<^IBh"hcnvO9ޮ_>$`(tU 7@bq%taکL7F&-U :m؅ 7Rc;#e}.:$73eh)Ly\$$Y |^98 nPwj"KFw,UxGSjuWNljDlBbϙ7T}C=fU:4kË`صw#ta0 +/{Yλ9bֱo\x/<Ͱ[ѭ$w0V !e4MsLɠշ,7Vd脒 7KI6B2呼tрzpoHiءRyqr$mHh`*bX+(dH'dgU=ᷡ_.y GOjSIj RC3m*o<#|?!p{d|YGLo}`>2qOf&xg-i+ aު!Z_8%^=wPmqdJpZYaw ie>i~𱑇\[l*qh0r9v٦z]=@tfOq ]E˿Fkޔ`UР`/e[6[TۿLà!tΩC(}*V^|mzVM?Oly2w3v`a٧JxAz5{1ejrwvN!;uV ,8Ws]Hr`M%Wʜ \L'(O$t2iyJbL, e+82}=dD,&}F+6+8{pkhw-`ka7H?\ePŲ@GtHR5}nˤSsܬcB ̨֛P׉ZoGy߉ RciΡ` $,R3" 1(o,lNu `59J'2 :6MƠ$фaXsQ1p86~2\Eudb9+Ӂ&yqLCSVirCB7Fʽd1}WJ\[_LIw/0Asvi yƸ!Sp;Yy(:)Fd*Qrૉhy7X1q#@.6-3Cfjbho9I1Nv!0~^rRO`$@+)5->f37:hZʣUEùwUqS HGպsb>R (QRI?>L ?QZAuzKjΟ+47-8I,9 `zH-W_J&gkvNjR1johfw\0w t#9f.~mY%1 c}G>֌t%`%7Rx.4k*pcƌ]2fe'`@xd9a720)Y }rUJT`4OTzr*-!9מ71g͏lby Fnz'u'YPF:!FNOpzV3uÉyhG 미ιo!;+C{= ^9Kb9bv5P!~ :gdZ܂\$ߦS:`5Nn}0/OЂ*FHКXKY<<#ءe7ru+IٗI 6{J1207651hRU?j5+UD?>})=f:nOL^fߚյQr_,=У_{IW(rLG`|ZrBX&==0H4o$CbLo0pNz[# ;+!mP D_; YGlUģ"/+d g3PFUw4>oOĜ" ݃ VrX A @EeiG!i3lN2qi4q.=Pya^^Ytp y*za:,]xɅT5H1\_AhkSXQkW~HK"pMaM6hl;nN%mzr)U2RԸFP[0!NJʡqRi/ϓePL>@#x̅c~*_ϥS2^yUUƤ\ch0^&lΣ’PE[ MiX7 8Z}Qޔൔ#){ 4 Φ;[7d(9"Te }2̞5Q㸛=U@HhĤ/6wGiy'+Ul%ߍ򳰷h- TWc=D zt==õnVVHp zg$IA6߂"CsriT׏8S@>0Zwn(6U[&硘mf'kųKC`E/@ki?gY-OIm6wQtw_]QؘHQW?pn:.3͙j Fx86xd!D.,CpD9x7:A 88bUpز1 ?"7K u0j,;jh!At!MwaEzzA)$wjȲЅzJw#9 P[@ |- xf#mOŰS~d{b;2Rhi]Y3E 00q 0(aoy;>d2CGB/OS\ޜ2;KPPN8@ V0QeX +N"r %{Bo">wݵƽT yKrBOh8o?7Sa&Tf 7-<)O pdk/o;Re+g$<`F4Mį[u15T$5OT~Oz߿wU oΆ㙠`!^*( q3HD0WjLyD M%d^=zR7><Z核ZՌeM Cnbs&WZ2]˯,`C*!Ĩ_5 fe5",` i,PK\ `D_&x#kXl䎀vT\m7ADkh^ 폏J!6-eRЌ]2lOT#`:xnZTH g$F=.z8p"z*+p`twKh2hXy5Sn9G%@H5f."RTmAQ5+ lWU0e(lѭa|1t7A`E,hdm[}7q!.sXat!Nl>دØ NolR xew&D9#BX0[%b%if`6x&}lO*Ӿ)O zyd,}vf0`K[J냲*:)]L KZт% `[铁eKJ#P.Nbi -E ktոU=K4FO|;=bs/qVr(]M7zDȗF.uE@WP†4 }5n{O[c= 'yeRǪ7_|$6C6{ |@@uBk-E;jlѣI5 d0,E%|A믆 5LЉvtkeNO Qky 9!W.ƃ *&J EPVϢ˛4Dߟ҅O>ʰǦ`[O4X- qErj)r,>6G`rNl`ue8Z̘Eht>Ya9!g'Ii={;1N_A@kq(UA3B7Z[^wuvt!`$I{W]Z {v#j.9$\qs 4Ѕ7K;Js(Kܤ %,xO]RW9E )E7XPp"ZhZ(B dȇ8 u/wIf*})mL8bE_$#O{$*i+V, So0#qC=f _Μ]wO5ˤ(n+0'8S&) VII0:6aHh GC $}3 0D"8I8!qG? r$@Nd$zf~d@c ()9teeworlds-0.6.2+dfsg/data/audio/vo_teefault_sledge-03.wv0000644000175000017500000004311412140200333022105 0ustar felixfelixwvpkDF2]2]֪WWWGHJVIe#ߺ?_?~}䳯>9wEd;7pcD*nmyy{~0[%g|t/lҝY]{kT^"1Mr|?hm>BzNӧF5m)!Tf|%A[#+LlT[3 DqsAn6<U%-Fz$W^[Т\ͤw~4R$$k | 肔v묌>y #E,z&!-Z\a&ٮ<W)ִP^7'p;[7cHLJupv<8 X\WdֈhKRI~A< ̗Jk1 pnkTdbb}KġE!Z^F:-ԏKG2QxU -P5GZ~NӰvBQ$@\ñ@x'؈f.x&(()#S,\®raFjgnDAӣX38HΑgq jY&r.OZ҂'諁D T>Ցׯ .nqyʝB<#,N-@+&|;s Qe+u.0(>a r/oob^}3I234Y ?]U}t@4hߝ^i;Wq-sLHprf":C2<%҇245<.: pRnLr3]1G54emo׈0^;ȸ " 23\͸}4 Pے!4F-yh]Q/1OicӜm$o5u`kH !mډ9{\شӞW庂?E úR_ ~W@zT߅9|]Hge/#?+7i4qj_//- ZlNB/za 1nf$W/yJl}7&+UP^YxIc+NOfq,`1؉~,4K6ͱi/fD %q6Y[[zϤu }#@8 1Jqn{cf0u km|(о W'kN}o#U eJb.bt:y Ūwyt+8*C+8 DQ∔49!y![nA8;+r x2]} rBݣ!zTx7DR6ƎxvpƯ,br?"?au-IA[\Ux(PD鈴8;1s[@JZlg[4}s ]1Eg `8Vq${p=fU |Ka#83YXMʊz4sYC @wfjKUb 4Du}~mk`fwOGڢJ$J{E_``DZ`XރЫI8ZU`W[ ۢe$nwŪEּ>3"go- ]7U,N st^ڇY)?9 `0邨#Q*!A'T9|xOA|ڨ)_{ 6Co5ݴB;ډ"(;,uFACqѓJZ 2 S=S>qVF?H:7AK}/O46ц+˖xpC_3>x^248KW0#|AӒ=5N /.B>G SKv50R%oSt0@䴙~ﮠܖvA HcF{Ce _(Qd0ύs3)D[T/GOt<#)7Z8+6JtcKmC50 maX[1 "ͱ0 yV_0Ob^B ycUj/}cH[ 36Z簴+BD58ì? Q@ jGO8#*`BUoUj,2 ݿ5H, :s c#ӻ 9N<7]Ci/1EŒ /o"V7sQ}--qz;,Ly_cKwkQE ^CWDZ_f8s uM,?o'T `1?`N-ilS g4IؿgMWi[|[w4䚨mg2$gGp>!>ϙI88kA;kس$ب | _͎Ȃ5b7 c7Cצx3TF/E%ןe芙Q&2׃6~C?j\.6WQ~ǂPp)&L 7 %@0|lNDZ(1LAOX&3 zJ*؂;E[Nd s.fw(9ys K`l)l1_st 1 ;Ja\ũt>EaL"9\Z%.l)bKO#.iAU|ӶUJg{Bˬ6|{[JRUm3d.ٗsRvGEyxK\焷NwܹF7  Up׆aˬ?_3,, ^jBvWn@/1}7Vh0b-\Ʊ)3&+Rfdm?Tb8ݞswjM׫pE;E_9(@l*Jc!-JID@&4<) Mv./Ko?qC&-Kxfz\j+"65"[SA'_h'YW?$vUϦIUWXc}eBQ}J*Zq n)?/HTJbtT-xeسqh]Wv/;9=F!'K?'K'DϜ#t Zi ڏ@(9Ȱ(^K"͸UeI, VE:QS-p"1pHcC.kL(;r[Kw!^e\ ˖|<3!~N\L;6I˖Zst yQm95|>B 74c}ot#gI[''qH ; Z~:-9(gas`.Kc *E&[Id4!G27=|nNXY U^97Wd$3^B]l(8%w ;+K<,$~Gx!G5F9 CR`^~?aZ tLz. ~at*X+h SD$Y;Ϥ@k`Z:gp)cSe`^PL`E^@ƛ!l!pE+JՀH~P:JzC^?+/QԀM.,O7ȪzMEԉ#cC`&֎];B>r\ Y!Voz^1u(g?oKDOy,\4|~c`o=y/C/m gSog$Po{BYAӈ:. >~B{i?Y0y,pcaQ,j!u%yVv!Xp P%hEŏOǯ*;B|4KeɍzWZ9sx⋏N|ݮμty 4_ 7 4R4-reVeE{i۴ҹܶÅn.u;Cwx ^{A_0N$L N>v+6aoShz:=tLq$X9U8p,a@.`mFCL E Yw(Lc7ݤ Io]st+{$\`=pyQ(׊WŁ_^xs~w?{zo g9/߈r8xZ@Ƞ?PmLrݵbGKYkh\f>C.T}2 y4YN^v:rS^RI@hA9zSpAh4`H:T\mю8םDwv n3}2P׺v#Pv0O/ڗa=f'cp>1/?{3|h{NjTZmFM \3"trfx~d#  #ҿ]Rvvr!t]E.,߼I5}{flI9wx"SultU_@ˏp ݉V!bu).?"T9XUJE;$cZaI_7}ɊRMo`q˚G*:gnN\j5~)$9@;nz^ d:j!$@Ktc^@vԂ%+ou$-d !orTJCaB<`z%&sRm\c4Qi6.!3YnepBcUsS}ѯs`㨙7Jd~LG)s8mlKE%-@;fӚiQw.tKЯfhcpWof]@Yά^;jM.9AiMkD[I<U|U,,t#F\.y\oS æ $GNR[?qLk]~$&"/D%)6\Kj:?Kc}VN]h Qk'bSMϏnOmå+ ڄICZ+.͍iO\>MHq` *[eQ[Z3աr}@"tуeuۺeo!L/" =i:Ie^טceNkbv/F h="\`c+% ԗN]'>0ckRlџ=$EѪU@ӪBWckɹSG*k롭`՟˽O뮕C&}Jvbd),lw%#!pM\;[DxV^n]k+8b1=<,GޯO,/,fbY^e8eBH]#W۷(e&>CQPu?~>Cwㅓ&4Rlۢ\#ŷ2ÖrY-.zՐȋ>FĦ)ģI"Vt  |`R)tC׳5uUW(b]@9-1V]rdz&T{KR1{+ 01=X. [ Lu2ah|GKR̓Wٚ@!"zϚ.Z}z:jY7>u?\3ɡW '-t- sM,vbT}.ٲj2\ 떝o쇤 [4~nW)_8:Yـݨ<]fi-u qH `/@:2h+kS+\p`( 7uMoH0n82s9riJ5VTͳ.GP^PH2F`\y\ae(zwF];5ϟ56X=rBxLin~V~]X27XyFo;!z UZQ6%W Q=Lbم,7τܢƫF~JjM1=or0#ҕgunuf*@@)RGqY|W s:;VC!ҁ%'=|k =R,q/ЗɚS5LڂyR!!?Z"Ku*i.E.rJ̰؟ymO4˦؜Zҏ{Gi|b 3 4|L,L+^/['FW)W@$R>K>`R@',^Ge 'S9%psEg>Xa#3ŚP랆7_@;-M -E,Y$g>62,0!oYt4:8A|Enw HNO+Q[; {kٵCa {{C5) ?eo} saULvnC EZuwKL3{ YgxCd|BaQmKd1ފ'1y J>̏Le؋FUžRoí9կTT.M3$OVNgc3q^+ |13 62qu[0r $GSmaHuy9͜TR;*CIf~kofBCJqsi&m<ʚ.Br0sX%޶Vc J&S0F!?GXd\^OBaOc;$ͪ;ܙ޽:.9kAX%G6ٹHVV ^tO7y簅|)3s {O=2 0 0D9Jiq;ۼ{7hg|q,O_y%̦ZTrq%iqΩZ0i9-˪W V}vlPZ`Q[BO9!F/K_ڝWU5(؇xH&/vr[Fy7,HaxtLyC.R)GN2sDϱF1iƒ_H}JQ?LQE8^6; )oC6tPa lJg\,y+G04(o0f{us[C2H_+޾Dsg9lZ!.I>ͥzI5Pq^E;vg̕m{@ Q|s:SdvAkQ (Poٮ vd9 x+PTjxjZTE& (4QaB{>x%(RAk -maGf$5 {'DI a+ Qe"脬@t ]yvBt(2~-/sܹ(9|},KueO[A/ Q sEqXUzdЎJd9ZQOu3 ٪a$ ŏT4|) }M/w}4,t_b}%6:?Ivžߦ"%dm1krNvS[{^ d5h'I]GFE\Lbȡ[*3WAӾa hi c<~I}_:z<̓;4XlA E` $I ޅ;l+瞻Nwx3*ک9|K8TL+LNh;msTM-E/}|;NLF@ iˤt\b0(Jos&lU[{i`Ơ9#AV6*wVr@ד>GM8#@e~̛c]-ݜyLL;t!"rx;BXV׈Dm0 P `V1П\B`trqnp:fܻzErk%]c< |/@vĬU, k锁hQ\u>C;_D" NijsQatOA.(e4Xegyeа[7[>E$bƃMvnz\~#D5*v C[) ,N$nzDQ THI"<>_F9 B}yF5?#Pi Q8/Հ4%{(e8\]E%:0#w"#F7rE*U#\@c00 ;Mbˇ4`qe XL8IAc 0)/#2BȠ 0 leʆJԓ_B6J H)hH-avlK:дObipQp0pVr r|@FUu<(8W)HNX T@zLf 0Cd*uЍXHƀˁ >/ 9P5&!)Cb P54B4 SY  < *0r\T6(uChH~1P1 >OAXDAHѐ5i =4_mJS@pPg ,(Jsi _1_'"tPTFt;G_o=8t H#((!i!āءPX\X!pH$@B j b =Єc|AkNqBL":AIx L%10tOӁ/vh>1I~O~~"c~C;ku}5_5p\zR$%߯?U(|TO^5sBǷKP>9wl#{+gMܜs'JcNlί3~+zFGp6vGq&n]/65/]ֺhm5_oD>Os<<#ܕ?)|&\M/E=e.aжCU*n3/Q$L%>YNDv?2}W( ڮ/#i$x^.,H'}poo>w:27%z@Ziޱ{&K8$(Yڽj:7k=}eĨ>G翂cIީS8nM30-"P ZY$0#$s(P:F= qC<j[u% fj]웓{-gX[81i_k⥗qƜSiN_948U7i 2 9/eY.1nWn tTíz9y1[҆(SW@#uȡҙ"{K\V_7pʵA42hc|F-~wy6%ky"~Z{$lt?{^9^ c(oI= %+ZQ/81ڮ]Q%U bNk< (pdz؇f˧ k`|;NU2Ǔg0hQw}G{tח'giIG%U^~G-9[6ZhfQyél$hPI+]Nıq&1lU83F zX>fk~A]MX#l$]t߻(ω .,GPTus(38_Abh) Cտ>>V'9o`1@ry3!Z. ͌IC{Fդ;Dٖ;QaL#z_Kć,wqj(9 ozW*ᨇLbpwYuT?thڈ*Rt2S ܝ7P}&DST6Pjy?doqQ0(vU~g@f(f誡W|8GWɐ\8 ).aIVba |/m1G!b> %=U,@ܒ$ͼ5{(n:!UH?#p@H4{بG h:P HQM,Rg" 7ʡ̜TSs9[r1jΪ,5,80f_w ! ;!-~6NЃX}$IA9]ARwke/)\]PyU7M/VŦ/ʉX1p| 4O\+=9B2bHy"* >\\KU+>ZP0aMO:2_7g1 iK:jlOyo@b#QzRִꋧ57V7]|Kk0 xT^}ЄxΣiuGgz>cϨyʃbLEMA=@,;zedGkTގrTDZE+ .W\bDpn2dc|>^Em?>Wb+l:~~;1M" y FCX~Tp8X]C5BK֢ i_x_HJ'RE=0 GӤ)84Hau>?W[R =PVٌ쑑"ɀCb7"EA(ԢVzU*$; Q;ZBg?Žf?@*ݱG' 95& HBm) ((E.=2qkf:$ jfiq^:q-Ym [ \_0;\\ÌڬB{pcLJNaƆ`Ёmu6ͱ37 gV}ӨҶC`3Zi,4Rcr" &i-j僭9:tg\\] |nɅYpW[vl}Z6( Ⰷ7\@Om'cdT/ZbD%ǽ6 ayj"%_Eט]AB6oPUhغԵEÃKf뼖v81`Ow͗:${^+SSxO|kv=`(ѡ +`:`\2"/x3a]܆0rch#^uKcmS5" 3,!GA m?X7y20BQ6h47|hXSqezBa\rb ۡ|QQsIeX|':fP^p kM!F:#2'$0-ϱm0'ck<,w~) i$ҳU94-wJ r"yB^{\k" E%[O\g֢/X09#uXxT7AIN,cs&&b`XJ/z1DTuW9SI֚yuJ gN45EF!0$$]- i?x^1V3^sS3>hjhTtu.W-*7f\d~˓LޯUz΃[]BqT&!dy S#^K 64ǂ< p@Euf4S<8,tPAֹ3M tN 9I>v3C!6?i G쿑E> O a[|ރ`P7wV%ȳRa'ȻaDO5;: X6, 6+[{%imʧmz$ǔG2"Mvf" Rs|`{# *S)ޙ{ͪ,5Hpqto{R[KDܲ8(L]q" KZG*e@8+\=]є/ɃMmP\KHck%VH`$7BPzMAG>kPV#O_'`y@Ni淰.r L-IJ 1mwl Dȟ#Ry7)QAr\y@< BFhoU.n .ȣ(Ȝlao 0Pv2*0$8C(AP $APXX|:=`8 2`|dCԀC t )|,!g.(Ɓ0=. c !>J>$@ a48)p|jxzlT"/L ǚ6Ah`(p 4`P3` 0p$0ph`D% 8"QÍ3+(`Gx]@0P,G(p (A18p 3p8z8F  [oZ@Z @8zH;7~^>0`5 ǁCO4aֻ f8/j`d3ځ[?1teeworlds-0.6.2+dfsg/data/audio/vo_teefault_spawn-01.wv0000644000175000017500000002512612140200333021773 0ustar felixfelixwvpkN*F,F,۟WWWGHJVIe =e}Z}{wKG7{/_H 9__B-aB@I/_h6x9ol\zΕV/.n1hQWS q5a$;EDk,|`Yi!ja|eprTY A7 5qy9/q$VyT/^/C@EM:\"r>qt&нpo;6ƥ1]2T޳hA<&(+K. _p&5=EN,MVĤ<!Dv9JuLۋ^ψyg_)Uk-=%j=4+sWQ㖁҇&ǮHr0Tz 8%MϏSn\YMc;7K9R~>XPeX"w[-.0UAzЫ d W7j*b#_*C5 r9RF㍞9Koh ;6GKB- cyq%]xcHsGW2DEՅ&?Q35I'!^Lj[zq*ͦ1P9#DD`IHce`y}'0ќ[~'}w7|M6drn!Co g(pX(2"fXҸ|\e77(Z ,3i) `~(Oe;{; CI2¶ zy ǼJ/4HGҒ& lUɨ9?WboCV#dil֛Cn3v +{{ QcB{ @ 8g&^閖V~ekZ\Op|.ˆ 4z }ҏkѶ:aťK$c@Dy , _UP$Vm|`v景ok߇~%^J"> #-࿲~Iz# IdJ"en(Z&\Kt"S$xI솬Z ?^,%_$ HG,Af[56u[v3Ǹ;hi9EQBŽ0S)LiHS[wgE wKNWYA8<0{ܰ"}d" vj?U-8A#L@=:=ZVTt-ꆴ46+qΈ?HS]  Ǖe95LĬݶȅ&4;H0bҙ&])rp;QR[Y|b]>.rS m|Бq0}N*LJڇ.AZ9V]Xp`UaNkaѕUd_g/lL8tPpzVa܆#B)v{y;xTw^؜Ի&>m+2 &X0n:2^\.Tf%ANWm))HK.x7\ȉ~,Nw"aᙹP$C^qϑ$QČfQDൣBC*GF;kvL @M&Rj,U~`C~_)|'N*X9وˮ% 3tBh0.T-.29蚘1So&HYeGAD6˥klwNEqbxnV`^r:SyHCNrO>.j#5lN K1ߒ~";ùUف:{-mqe,yTwOP fF t"7K~ٕm !t\ EE07qAo~XmWP,H"fRSjo ֵ<$yK-hM.wY@9HB3"mʬtrJGOlLC#53='ۇJqPC&/t\RDy"@ O8(žQ4RS]X{@9ϕBv/',bt:~z"n%R]eT-RƭgCbڤX0SX$^>&s-:v ,r]% X$:gYlk !R[gyE޾'Ջpj]麁 (o>CL5>&Bo .#:ŵu!ff[6%q.}||CڤTLUMr|gs0"sT m6#oH__X*\ot ~WΉs0l9 *Ն2$+dk셬6oa2 _{f 8h19=t/;tw/8!N\1qV)CgPr-7ngH倭%*S: rU{ 1\f /LDRu;40v9hEƂ\ U^OW wv08q:e[+#Ӯ 9{V}*n&L?ќb1os3B=s/lB TKqJx` s@{lbs i^K00$ƫHYvR1Ėi{x;1cJ1l0ogb19[!Fh˿%{R- p`cVލlo52-4znknݶBGmE\P`^*)id_|y%*O\pkٿgWYް0=О V3M".;;:V}??CL̞aMh 58+AҺ( x厅AuCm ^6(uC:4n LÙP7gwVZ Ithw&ZFDY:aMrÂOB1R&A$d hR${I$w1Pĉ'''Bo5FH~Ǡ x oGH֚כI6(Д^UTKWW dg3>&dEW 5Dߪۦ+ܮR m)FE,n }9QWrlH;?P}e# B˨U([\1G%f'nѵ7/ut 8@6>⻮xp7{U≙\! PG9`K"\vP"xk?!]ʭH\ `(c`òy!0aY1wm*"i)PueGƾP9Zt}AKМKlq<W1}%O{#9\@͕3b @6DVlradMe=D 롙^ ˥?>AtvcMMqq?A 8SM"@p9-;8-U_E]-^<[CU(qޟ^;-Gm<‘ogQ:/PuQnVR;"̪n֊Y`ŝ*ȤYsҕjzcwVkehgh+yLe{kT*fW۽%7N)I,2@w'@kWlmiNEբckr9:M(2adʍux2%bԴF4Q|1{*QM~ r]~o$?6S]Z+|i` GA\^|T 2TUI^_p?c/"H {8wg0Z-h%Rztxs9Z,O NݨbPo~dۿ)KvsVEC& OF%;z`_w_񥱂'rEOA)YuZԣٻq1[oo{>k٥(*niFF_N|,yO"NlHH"qut`{;LƤZ=:j\()z4riRٌ6,÷ŏy6emnSulNAh}*82Xlk;n\h)P adKJe׀Mg?w.k/C%LknUAG벪r!V7 ރ*]D74{ K[F ogPz=֒X@ \hiI+SJf:\"x~?nh~>Y?Vkn{;b.'N5I s]3S˨6=&rUݡ:g,Vj䦭;"jl #<]j#ZgnߔuLz~owD @u.;@`4ܢR 7]$J=`*;h3 sup&#hakNniId p;{eC[-{aݢ(4eu' @VӽJEt %QQg__&aT_dZ,R:C=}H]ʨmWSi;Fy0mFuF0]zkb-EkQmSc2<K] >ܶ^ rѻ{~UOqx}i!Cݺ2؞޻y6N^0?u4~v:oH@ _O,OݲʛY|Qz}mCqE9 TX&Κg3wZS!:y, u|i!Htb_- ЍX/X,՞MP3Vu40r9j,4ᩕ4|\PǮ4_9?T.X/pdVk֩\F c-%!qi?H+9/<ʫ{f{̭v! *GSN{y1 § ޱ6J)|>m oQ4jPp$ NP4y2XiSovGݚWW~re_[hfI rE,B1e2޼ɷVT:D:͘k^վq%0m[ o-vDV鼵lˡ{S!z>Vi+.*MM: 1nnqNKjT=M 9&QI^o-2|UT8t.2IZ)(6]r|9]+#!6pbVz@6۽⩰d߬-ZVy |<W_z:4 *.W 92Zou2V;'[56OyVY@- 7 6ectKc Trᨋռ0qiM٣&b_q5)*1[~:j1-c3&6dX5]j+qk5x$n"v/wȴyͺ%fqwܱxMA+$cq;CCαc贉vd(lmsA`}*\g\d<ȕS R˺Ɠ4[zN*h92&T`T8iKx#<c  AlyQ\5[O>.ٔ+3aW.~^sa{av=(_UOo 5"f6\dP{c#ww}IR'_me$g Yq f݁N3?CP):,ʺ]*e25.+Vm ىtjpR4&$lPh|Lr÷j"Ħ3܀˵Sq>cN~B),SKK7;DϠ4T*ԓ"K;$H~|[6Z")qYYTP)3)CF٭?:9A ^-wZ~ ]<)gNb+:5\" h+aڀX#JB|+4U5`/RD'Eq:@KYJ#0ē-4][Bܯ!z eBԠ;vdjwjWpn%mUֲ'(7_*=~Y'CFL%0%WC<~$ AVkHq`AŸ*( b 2vi*6}sZ uN-;ibWHE- I 3E>#w+T% \2s01q6?RgEnUa~Ai0m66\DWv7cX2SFQpá LYI\ '̆tGL/cd[yW`1w(o晜:z#iPÒӠ`}C] @7-0OشmH BOgO`A4jǵE(lH:FD@>vkN6Al(]BL7Y3ڥd&}/3skB5!T40@beS.MW^niՊ/H s1 Fdp2UxJЄ&>s0B& aч A8%X;d( <4Dr$A:(=89$CG`!HlK?`{r<3$J?yEr{=x+*y}pEކjx[MF?_wyY}jSOuq!3m6o4O eN2F $uQQJyzt38 h/W6ХYзdm9G ^;*iA>^>P6ؤROlSV=j"7FAgH .*@ra,_:9%a5izEߍ^мAS+ |Cu.ZҲ ve u/P_nQ٠̻J7IM]W}Δ))/B)a#gf{}WR@>m'~sIY`(8#}^)*n&_hYQD82W#0W94Q7>V.1~f|q^e++L hʄa٠Jᐆm]*чt$Ӿω &y)J YWW+נ[CLK[Dk̹'GsO{ȩ1S57Ax yYZ%lW?DUѵeyDIA% s`Νh9_ͼXno(XF(ȍ Jw︞ИEޡre >)4 S5;~?1߃/bMITϳ]9Ia@Z(4H,]O9!̲`_O`Yd^lSt_ "fv@ġ5]sXInY72PV&bKS4ژ G~$ snS81R!szP5[|rN7 yU4,=ӣ蒺nKF/׊/҅fAp?Ud=y6i =8 _N$˕2@l€ ;~^cVq&CRÎBq`ph?(4LV=FY$t jz ]aj4}o+\}1w.S~]MQIpP )e9Vl|H7Z'kP1pʱ.}}BUk#UюrQO-$=72f P7VF3+/"wm!=\6,V l )/R($:dG쮯t:c a](Mr? 6L<.6KK/%QԂ |1ڵ嶅._H[#?ӍDAY-fp],Ef5 RIT>N-D85XVijc1^av*88b3k+dOZ%o%6N̤]ۖ,ᷞlh trJ~|ۭ@o݊#TLc%E67dwD"'dQ@XoC{tiU@&`7݌_}㋙%yRכ$;=pY#*#eݙ# d%af;r=ŘWƆ9Tp[xfygU0WAksS]EQJjP:=76 $-(=l}QuՖAgkU EObS*s:^Of6b!#en_c:f< ژM1LTB[h5*"<ՂTZUk03 KeV+rq-ЦX8Q6 `9k]YXxI(Dl9@}EX_c{,;Vd/!roH( A[G!';XZ,Hq}Hצ_5%F9`?u70Rb[~&3̡\\M)vauWu [c*;pX,k^HQ)jS/Daܐ3{95+L-SNwBk!PQ=/òR4ɬ>ݽ!qYFL<,)+Ztc؁F[1*|c2"(\&U>l%u?AKg1Hў1OR:FJshXn[=^'gU+.ٰ JcY8 b@{h 06{.歕Fأ[o}Vu {/o_U1o+~++LߨE]:̶>65Bt'L]<Æd']'5tv+_@o> ܙCtu?!\S~-bx,YNCN5Lcךͨ !'߭EǗ37YP|XI{.? \e8r%co2_sgZ3i'9*i}mYh] ۑnGHeM$Bz;O"8ZKWeh%cעg X<*8;".;l/%q󯌝 xM8rN$ՈzSz}㕅aX#zGxI}wAkFdjhl9G%`JQDYK/(EiƳ; ժsaKj85&Be YN̤vwYAi׮C] imsF&sȡfEn!p]'Vgv'd$HL2w@`ן5D˞<ǫhcvcQM(ug)<-^5!1@<0΢A4#e"ӋվC1 }u78ްbҥꃍT4dy%BX֣-_{ް.`)mx j:/ƥiWq hiQ!D5f(H`^#?\Hט$8MbI[c׻$Q4tiJy),pI%$a`|LM=2'OA1\ғxef$2vB@d[vFsIphټirڮXoMG@D^䔪ObxI[hۢHկ^E0~XKbHg1Ba(OubNiɐ%$97`ܲ'`.}8!t "?SO4 d)*XpqQ]:"W{nlj![/E@s+|{=]jJYhqU}YIJ[h%Ӌ4*-MAl]TNT}֗hGB{L2~mT"1/]QŐ{@; &LuR|ۓ, eUBU=9(V8҈))J4rH#ch&3t.jMaTYQmnqgTK1]ɿ<tĦꊩ&a xJ.ۓP|-H !)djzLxu-FYX6P kHZ.|Vs'缸.oG~>iX5lt x=kReɔ<%h@џj.DTd@vg(jv#o|H'2qʋnDW ({w`z&&O?t\3. 3Vkp|Ln" (!ɔ;ȟ>?E"m>ϓD^' ٗÂawHkg y>s4AjEnWMg!DNؠ e4͉=aߛgK?w0wkg`dYw57 `kb}g4T 6P\\IG6Э=*f:~~+^WK %V'* G{OX7؜^`=h- ϫTcMwu/rT%Wdoy20Zgb#@MrwnA LgMT wKvѯM]7-\dS;{B*JƱ)dDMbOU?FKVi.:}qoTJ?6а-ef`CPe'3gDPpQSUO,m0amw[8p`Ry%r>QCηB~јmY*{.g 2L=1&I7x،wW?J7#qA]gV3E1?px1z[b]WONX<0T'v~]{jwӻwdzSvA `Ĵ8Í~.@RIԁEu]R5~Kg"K&r"һ}MOw#mVmGPAj I,J56ݟlXMWQo@bs@|S :楢atH[zt5G\|+8ZK^{-A$FƧzce}z}RRByk<|PYʝ$+j==kr障6͗\үtHd/ZFi+8c˺p{0 aQRi[3m~B@,n GRP&80lr.6Wi8XYoP z| qsC H$Q =xpy2 t甡TYe-5Bhlr8\?gy^s0\y|hA>ܐqXD\å׈zh]r{T 㔽p'~ 5oQMX?Us~rO]FڋZm#-K&,Φg{qЈpp6n Ʊ0{{އS +||U&m^Ik0s@2k:.AXeD?%) L5Bw{4 0eYJۥ`(e4q#a[= = lvo~Y $ U0H'B˕NL߅vW1v|c'v"`U)B߸Uiύ*U¼i{uS\a.C{r1*v^|SYW컆ONob[FS2n>&9}y4Â&]t_F 2N<VWXz55rFѰnJmk'*v95J /tH*{‹r1 Jwi{;~ |>Lu]ku DGȘœӧrۇ"Q ^s Q& Suf+z_cor5IuL \w1| {DXV2W+ϗԁ8S%zσFe&6WRcZ2Whح3ƿM%Cs"1c犽OmEh=2 >:YMX6UWåw) ;\՝Dg{65a?H4WwtŞq|7n_{GmI Ȯ- Zi<[_|o]7૕fdXRZCk?[E1=;IQO||NRLd̓?dw&Cþ[ S䠱z+[VXPTw,6 7/3k6z(Y&Ol9UֻAHP @3Ded3a%u! ǥԛ pZdb.@­SZn&M\ sgzՙ}h/g5'=ݯ vۃR,OQέs(;. o韫OPlq&cyh$ 1=c*yb ii_m(͛wA~YjvJ^OQ%u:]nA6^ kuES] Wӣ|Tveo^@;INGe3MBYZ9U 0T)rĨHE΅ov1GJh˵jB-#t'\ndUu4ήf[F 2KhW{HEfvXo>ڙdR;1M ':x3^:oߩ~FawkNx 8f5 )6"VL3pGD>c7G5Ts*s;}/7q;(6{Wsf RCꓑA6G GLbB"ѓpգB"Y 'ӳ2(TNCiv!^u4V]@ ۦ\2_@@^#5z!{:[G٦OV;l;ӦIy}g.97%M+AC짝X'hZ9phVN}3rAyɫ2g[6l*sYX vD͖kƓSpaM#,.Sʝ9`P7kPKоIdz&y%rY]I_ .M؃UD0lM 嘅nEFH rk_ҩLXEb.~ۍvTvl֏o+-Vڰ7KNbl ;-`Ԗd"ih:aji!:Aef AG#TThF!grޅ~0ƞ{U]25[b8TjӜORy_ǔv{1 D E30*y(b5x 97pJ,"x|`þssUjD.LZ)*nJ$z|8{E#z#ٵHX**b_Y Q$fІoz}o1<CE''^ԏ$wyÎQϡG| 8OOx\ҩ%b(Y G {sے&H,f,Ax8إW{HR(7eVX VU d4Bhg#,1U$@+*2ow7"[pOyЀK?6.c/cLc ÉpIUQ rU"dD7'żǨD69+zT•w"z0~j8YJb*>!vaN4IliD3׼7B`kA7`xJHfjډH++"y?=.}ËƵWK(Ar `ڒs9☟|ZZ|4Zn} I;= |M$u+I)Lr\Nr;X@ړ$ j-USt^/c$Nq8F^y#,tzss ]`Ȱ1SSb  c&u=PU =f~X˚E ˤ]fM3ԯԁOݥg 7pfQG[TЍ;Mc( DnhĶ^ 4O_#/R(eQC­t˂< Wyj;:y@E4 _:lȰמp;P'#zb_gleBf7dK9>aM`<^bOLF5Hĭ ` ג^ ݑߪR;o! Ct j_"`E|g.k8"ҷ!};DdB5 ܸ+K <p Ϧr'_OGpi$Byd~ ?QTv vܲ/Q 3f.+Qk1~E[Mik3l:Vy2c{nMNx4r|$!){ECaKnO07sD$v,ʑSPu<`,F!d؜c~,>Cvu#eQqJPֹ&0E ,vs[~xVp-~ME:E\UG— BA|XC^h=gP#?SfO.On@'eH4YaC-t$Ѱ.UU@l9IU iKgxLjU qN"mu6n1KIZEf[T:ߴf{h`mtnrB#g--Ûw;4Ы6u%93t|ܶ||!}5Rs8 i3x~WvBBg۠"tHD_Փ6 ($F$\rUuf)?5$:\}H$&"FP^71S_ Mk7V)-uZrB!bNϷ?B[̇$tQskY [ ;A*@agAyAXX3Rw:BQSqf$㠵羼 EQSɺ 0q+^GX8$OĈE!Xё!S ОZ$D:`K"9& ɷJҨ48$^L%zDOaF~2yri) B:8,ig \>\PSЮx Q/ X4>CO]" 2lHw'l3OHS+SevY=@o&cSY؈/Iou<08F@pjSHtpJ/ʱJ`If79\KȤE*%.i()Q|dZ>DE@:xGHK 6|!5.oRS).Y{evXl0y|%ud+\~X/pn ?^zy08wm=4zO+Z { J'?zܒ&\LY;giM֐~zg[!3+/k/UavD:XzUZreA-On0Hpdz( NRgafSjr8ksLٴ#VN(,RBqtO5zw2kJኋ}^ZB *YYBcI/-isQbN{ag[pTǡw[9L W࿎V(-̓"Vdl{RE.XE2cjeT"%[FɴXQJŊ`*{_ ns5lVY\|fcO/I o/CL~XVrH{I{s?֣xs2_ϓj;fSq`h:ϊcN68(fi[WjTu0)$Hyj?rghUҝ#p=hz]\SiR^,ɽSHzꔜI!ll$k'9C$ď:' ƮU;C 6ں`Y}Lg"!Zzz ?@)FK(yXX|L+ {]YXR-2_Hvُ3|SjVe4/:){q$rRXEW'H`I#o;LPhWK8v®h<`'i]XD@ED?JX1PlҎ­`s!U 4`pDR8Zj4m;"1UY~|޿=EFs_jX1=蝯2dfl^{oDq@uTRy8^cuo$88rB9œ}v+Q0v|3f;͋χsH] ; XəX&t׏̟dzLVlh9ߜIoJЍcN*ێΏKL/PSZ2;asuSdha<aPG3"dhOMi3U_> ~Xjg T(5T$7ILQv.U#N2{錖K?A7ÀWC"lk-鵀_y Rn.[Eva<932:1ܫ,5ٖ6Y&,sf`E *֔+ȲHDqcp?ݠS ~|PQGd N7ؠOސ2YZr_ Ib(aD&?+*<`1qIB=%0'_x!DFzjcVXJ9[IbԻ?ԩT]!y9JVF F;2.‰mE&$ ş ZKlRrc#y0PgE :_Id+*$sYb==Z%-n5:1<[;NAmɝN2 S+X5J`RRM2jkNvePՍc-+glM@}TT|L6EkE)弝G6&ݹVlf M6.QV,7jLЩN&7{4ċR\]=}:z2Ei;X0`(q~)WqũMtNG0[T]%.%|"~[+΍I ;,xBA󇓼|s;&2զ Ik}$]1P 6qQ+KP /Yjim9:TpA_ymom(Rfcwg܅:`$V:ramÄf: uiDME 0a_Tu;Ɉuaz<ٝ.p?s섀Ð2)k ׫ O4vWv⍪!U7í_R䍱g7:{`O$5J@by65"^f^w*7o"C;w@8oȣ 0, ROu{ݢzgMkednrV`0KF9 AqKN=SFS\NW^2(ѹf;/PͮT2F}/08}!9_$ꊄJKQ2mjkg}3VW7 Sq|?rMy:A,&3A& e]oO 椪\aIoas(ԏ̐}m)xl6<'eBxU4R :'2;Ytrؒ 44-OXpLz57Y$?U\&RK/n8n]sAůM1nǺnGp:k*aI9/$P,X)qmL~e0™V\ɹׯ&h_@Y-SOwQnQ1uR_ps3 @1Go ;E6h+z'X|!z@PytR)*v9!=,J8~%Aə`eI"5@P,%9Sy8Ί__UqS )1O\##H:J.P-?iY0eXH52r7"f٤1dѧRyjy,O;r=' cʂ6U@ 3SV~(S.nwI%_*x0ᥖICÆD0yeދ_2 G> r/4\?ral-A”8 q{ч(a{XEe"GB'{8S\[ti ?bJ3j~"X6 xX ț;x5qUjyEжp⟁  6xIz`H29nI˜X^- 3x> 0 a/k효*;.KT*Ǘ|ǹyM&cc:§tO"UF3/THBw5Lxg:[xNO?r0IM_fx?Č<'2GVadrgrbmiO+PDf}?^mH^<*dyNP9HT~ߩǟAZߵ:(ecvݏl/cuevU},;o#_о1NO͚7l JR8I$ij|XuThMY,Y^ J@BfT dYB} fM?4;`gySk3cZN$PFK+֐R9n0kS%2E`a ߘ"jZ+`lݦ0:;VPjCD6yז$ҡPyoQK~.yZu+q # ? ViۜCmAdK;׺8b"<2i\эç$M?*4'{x\ X.>ľ4/?Cīg5戰_G-|ȽRb3K_̜-@c-"`."J~ 7Rv\\|Ʉ++:Hk_%1W1WLWkH.+w hRoӹWAWM o0(koUAM3mŗQI DrQ#p=Hp) ȣl³& w<.YH/ >A^D >(pcִ*e~$hrҔiގ äkJi*Ҏx|Z69[̭mn KViP>pF'd9N?z z:cOXu$nbYjtu- 35rO6't1(9 KdGlCZՋ6doa6^'ɕ7u4\b#l.L0M (=$rk.#I3Ih6K`;x$ursO@ِQ, !^0IU0is[ .!.?]\ >M|Ԗ>*0J`4j,о&`6%zMn;$(xMZLW]l8zbyJ>7M#SS21 U3ٵORT`\+3R\B"Q0<~UVAjZ.K`7onyryR߀\N+^(hbbigjڙOv'@TQe7(| ř .Lj;LpbR&?/ݛcX1x@ԒP,?9 3`hy }MgY.Ar*ŏG,sqͅ:DA}a5z:J`N3- ,%Vjm ^TP؜fXikU.>d@` Yb+[BbP``nrГ#&˵R\КA4YD=4u#OE#4 *ōq[]69O  Nbbd;_yJo7$IRȔ-=ug||[Z4W+ 2_#H1q,I Cqj2'RȀT[C+!rls!rR su:UW LB#[ۗEGc C MJFGEvhB򾌜j; 3- 7Ahs{ %E|2.M/U @cRm?*K/G|w"b`0LxB5fJCԕˉpVa@5ݻiAPuyk)  Zlcͧ]E/"bR_&Ķ+ _ l~\^XT'/@h憆u;J3RAF-B%X r|kuvǩ+󝳻y;Z=gt@tjC9AW)(%S%| -7cc!7l0*D cM;p98;T],tAʆ@ a;ٸ_⮫ܗ9!j2Q%fߜB!܏S-z/nzY`h_cʘb\Q(sxgXڢ3̲ޛh%RM5?<͘uhxH?iTFS@5ZqLĎB+~Z0+|3CX8$DN5pI׹ejQR; Ȁ7LԆGd{V㏼y/UxR8Y߹ɟ R8_hS{DK*ݥI%zKO+A4f>UW,bܹgp ycvG0RA5`s 1Pr<viG~0\friMJgf ep&Cu\(MmoSS{Y1ׯždV/4نWv<ނ$rB`.ư7l)O7*#Iw 0BBZGp)&&&u|!-z+;y%#Kr_'P&[txU/LpD[jWb/Ʌ] ٷyJ`꒪ a(Ջ#y<+68hG?do9b6K!|\ sZMq{%Q7k3N~D`v qo3隇?o3 upUTt>kA@q+rd{nBÅxej}B|(>~AǮ]-/%sE7%SaZvdnoK>r?hC-`)l=g/u"˄IG:c}@< #[ϋ>-qW]*(:>Ft>GdPVʵ-ڤ]*{ՅLR;I+`\ W&Ev ӄ &C# PNͧ6DXD#K(?TF]KQJ, OQsH?=a#Qeobj0ȐF#ZN\91ܡac2mw􅕓[APB=B棗r} mb"b+&踑Fx;S?M&xN0*~N5ƾ"غ׶G˺IY$z '4x/#YX {'p7}c|~[-Gő_DN#C:e֜:ZPyILbh9E~0MA (Jnpx2Czj80l;yq8d>TAp;Z. 8Rd]Flr h}9>VOxa4nY0W㧃Z b>iCf|vs~K^uMDbU`A;kKg BL{<>e-MYZY=Ƶ eN1W)qVEzx z"k}gsf9/PPzր&p~&$MLbC7Ysh-dY&kW؁+m Q)p8vud(E.e\AD '4}K;&f FBiA9JXESJ),Dwl}>gpI|@BdM_MkFE.*9-  P gg?exUZ* [#PfA-zj|vPCe\kjnnݘ{Ar;I!)Zdx XvJ))a{kb xC|9hv0l1IBiůZIIEEˡ"GQd4i6C~\n5Ѝ4N !褚!F<϶M>^;Z1WNL;C'$^եm%tl j F5JV#yL'{Zds!>N <|oxC;!lce Ol9WTR@>ް P!: 6}Hp\3= ^zr#xAu7[̸,뗊[6c.YƼj=݉T _ޡ\y0ڤ^rO?+g ;^Ϫ(=Fٿ [rn (c\ @pު3 1n1q`bju , Jlw 9t' msp\G>u,t‹#Yr0S4G}q7zU3M[7`jm݄7CB DMe :`((v ⥶Hޠv_T($͛-`S 4oYcLB!Vөh4g^݉vU^̻ޚ,ϛ8">)k/zZ2%?؇ǝZZzK;$??( ,&Tt21d6* KbG8+S);btMh lN TˤqbčbGI >)TO^M7G̬MV ߜ9oWܔ+lqu4)`m`ۨfL\aVbq 3m _ - H  I+yy.0`KQ.kCyf9jlD7FYɎh @mF*\9&  /aUQ8{0[LQU0"%/2(k0e0fvzmfB||7RNF>R^zکР ۰&߲.~bgYSZ_T5Y$sK2Q2#4?ՐȒ㊑ࣈ<] aL?NU'EfKrqsǀ8&!d]N+1fq C' 'eLȲ< `8t2ӦvBC!F VF@I(䡐)U6i*"BRpWuꏳCI=9 UyEO$5$v){$1lA4⇮VuѤ~ziSYB',2CӈϊLW>jKv͵UhFAË&kj 0B) C0 @#lP)G ;hUA6gՐc48QFsu? x\E?#?0O0üE)"s !cv&\E0". Iɞ@9b5*g OYGXeMձ$(Q0H],mCȬ'@{V3 V`raD|[eqTz@)P•Hq&y@ eVıg$d]4H A Sx )cx"92xuGT5c |?IMKAaH`)Zc~@`LM`MܟF]|2"c0Mg(11 udģ1U0 2<2 l'ʴyg:$T:$HN%G>XP AP!BS LABm<@L$ wNI0Q0H1U|؄D0ŀ)AAzBP XNq$zA?}nl 6!!ixx$>D2@ Th'#'M'zK8$$Hԁ}@d$Иp }14pdP Q* tr3<t!T\`Q0Dc@L,a#R a0 P)C!61TJM$pP(BcS)}A뀐ƓQЇ)Jd)fY a æA B`H@bZdAty(2Sl@V4J'CN3xC*V9$^g|btJ@0^)E8cH#LAhC9g%$P(z(ҁ(|䕉 Nl48# Dxyd Ĕ 9,f5"J0TNfȰ@Ptszdb$\ cia*2$ O٩O(Ai.@aL'CX0>:n`*VdQ\Q!#\Ƥ1s ܟB00R5|\{@(@c?9C`@ $sbBhz𙓺Lp(A.긒!&"*@ 22hs >YZ@ ٍdRh8+@[ k0!\| R , G9fS(H<42Aճz`0(88" ]{ !X<8NIj@~b~\s1A |D)3Thx@ #<Ԍ0  Tjtfqt™lP|IPyeGH@ @E${<8hp e`B(r?Ҭa204A82 )'§'ه9$Q͟> Ap d>}6 tKiȟ]c(@ݡ(DI@d a 6x(AHW>( R "nhg!HR(C}QDNuFMLP 6V|!P8 CC~y@pd%X.$Qi`rjr"(hGxd:HYAu RiEEC  UX>H2M>Yb`J`؃`w@P rS`LD$8 CCSa(/qUi tr#HV,G4k&>(8aPlQS'yC= $(1`<84L rh:+H( F:'LA&(P,!&qq&)'z z aLU7teeworlds-0.6.2+dfsg/data/audio/vo_teefault_spawn-03.wv0000644000175000017500000010270212140200333021771 0ustar felixfelixwvpkÜÜ4 >WWWGHJVIeB;/{EWw~?WHw__|o \^n~M̗Xٚsj>,C о:}4,ugcۀhd9w&M,FJ/JbqH69 +IM '*LgY*Wk J4 Fd(TepttDjcYK#EgF3  eIô Agt;MM→]ini,tQ{T>fR gު? &yed*&̋mX}]|w_LQCGz:"8n@48/jdiLm3;'mq xK}Xޑkˍ-:^y=qxMCl(o_.7]сGJGq,_{g_(~ vG, 8c! Qts )JQ9#}Cbǿ8 F}NGA>rrRylX6 Łw'P) DZj-G@]X@Pf씸hElQ.PO)Ħla9C c)nA+3%Xv/q^Y[OޛR.@܉&j8C>G=ƑƱxX?)MJ4A2Xh5F,\ACq}oS6 4PiE-j͚ ;#'Q?[ڑ@{L{ve\WK,)ȦY*2t& u9L;\s&-ΐ>RWD4l ]3 srj!þ'R{\){iO |1z<?sx4ۚU掦-q_>"]l?&PV|4቉r$`ETb9 с=>悃XD~Rx5n'܀"ҀuU_XhB'={.7X-߀ɦia2S N1](Oq/:C5UcA31ް7mSrvFɞ (-ӑQ+?[Wa, |EMCw|g @ĝ꛽tlL^>=mf5s_쎏t/=\vdٽR{{Bd= u[9gEt6ɩÂ4\+Kf?[lfݣW6p8G0[NYkdXv_ Rb']+b3_DPChř, Oy+/M/>p֦{bCw2O٫dZ9.^tNu>k*E/ $WH-nXkCjUO:R\ZJ]|uu1ԧzoZ,LB`5K/Ð'>pI+"ܖYO&_g%6q R}?Td=g6AoZZ53gƢ]|CJQQŲ DLgZ;hJ1M+RKA5I#4[ߒeX^-]R0,!.4;P g: PfpᏡr e!;Sj tXXMtM$JIa5n`3 S6`i![ <2-T2o 4A!F'U ]Y7,mB;~Ao_8V@!ķ9J L?9w\Q=aZU^jϰ^ ~cow~{&P#q jcЮ Jt) AlH -y({ōtz\|  :zgH0.XfoF{h.E# lrbW}|Ï/H՚)7HzM Cߔc& #vبci0o:X=|9Xlrɵmy/5v5IyYULXP*X }A7Gcο:ߕvgd{:mqGƔ{a4,G 8@ xђ: Nw^1H^ij9W>Y\")Xӡ/,ov+Ψӈ9Y4~[z,!;6M1g5\ͣߜ߽\0~p<M=ATƀ֔blb [Pt?0,@Id4}96=6sF_{gT+P$ּqNm9rءŸo(:݅~?,X'nϨ/O?7viep8%W{<@ߠ"K?~fm)(cKY'eZ:7Z?)>| PjR-8!DjG{n[z~hLO ?CT{~~zZK[nTyU,V<'8I>Nwe%S }M[#|BJ&r=WO ե"e[3,;}̨2pF?r{x_q5;?k~ ֯:(,'ӽ bGK#$"I姹ŋ&<~i7vܤ'b:Z 8"(>%`ȟX"o"vTRPa4)±D:B.21hLA1Xuȡ֫E Eņ3Uo݁M*]uK XODhVuljEisNEQpZ4 C` 㟡~MZ|oe xU"Yᙱ.ӛ6mf-6RoGH OOW= a{Rw} ej>2I|%df!q`)$QKc^@Vi( " t z%KM\߿Z,|/:;DP\& *l,xZCv\R+2;ERL +FDe5}i_[s hgvogNq:j\)&tH"8KL*AV $Z$(t%^rsFS O&rz%N,"Sd9P2 NtE'hlcW1'I?KD .8/).WO.F\MF4@\% eIWJMsj3j(ݽjeȷ +FOC02bA͘j1`_2odz3 ڜ@9gQնOy9zUdp *Ju G( c$7hqQ"YA;:᤼O TŘVxW:AWηsyN XcLFaݒ MY?%T#\-(W7e:<u:E8RQ顸dMq4":%,thjij#қ { asj<<[TFO`4M\ΠΘ8Zb8߈>Q"|=Հ~Oc-|n_, YrB}{T뽱qzWx vH ~oy;j$(E՝983ޠ`rɡaMz$#~eu.]ZdO8cpfP3PJLxNim i- ۃp7 ={:)%vuG L6P[5:lT QBgJe#v|_R[>H 㧊@? ѓ6.r Ը?@$[Bz UV 0QXԆA*!RLX`aϨw1XE1k (r`B6sK|Az^0B/ Gj-( 0~*4ޯ\ y=*At8HaYjfH>^X rЪU%Ѩu[s7zGŏ!f%Nt vTD(ʿ ~-\p."_5%( x?f`$uXW?m§DYv5+Y\[b\ObU"kDZȁ{Љ|3IMIݪ-I gy:Zf< f?lg?cg|w=aB BEtU&]տB6@OZ T)h75}}.ޢƇf{UC_@ڧ ޘviVFN<%6'IڠSu8$E1~5eyɸk9s *&|>1DU: CEh*}+ EL,juG%<\ N{n^&;5&(e@h?TߤdG!iUT-[T2gg~ï^˯UHqM8U8"rUF|*ޑ%aD#Ytf E4RA]2gԯzXanJ[a:"*at`;j;)-KC?X; OSCKu(T[.R!;E;RIb+wd,\ X12fۣ(pǥjX>a⚻Cwc9Gc"]?DfRA3t `io#`vNZCXPs(W_҃| ЊVU ,c޾n ]_9_E͡TLѨ~4c;;]1gaL2<,><'AwQ)]]BC ~`  :]ri/6ş`=#I ĭf3x:'f\ZX3s65|9-hH9D8#lb8ma\ WIUEЮ!8%SXod+%Nl+5dtvH'r!GxgIÔXj$6.uEL~ʧDk_ & U.\ t!RQo fQuwxW˲&P+}\(8n R2bN )ǃS:H㕼d$Z֒2o0>[YYCO#PPZ&YbSJəll餕m|v^ UJHPTd 2L2'gQ6SGfc8ݸKڔ{!_Gÿ]4!mgN2x"ɐj#TsbADoKbJ΄B9:q֗/)s].(iIBP/8MO24lpH%,3uM9)Q^:wD{8W~Ou[az2Xa~7 ]$m59Te|A]\P:KIg ~VPT1chLQǹa XU R '׵εU{_l06,\l2\k9AeOEX(-[.BD;M4EFkfQ,feT|NfqO.|*>&^=%3=c~OpsgEdo@`Gw)!#d-n%; dBEj2Uմ;f˶Qygr?̳ {Fec`rħĆ>C$4NMS99%)O5Aؤ)̑Bk+w=۬Kףs )if/3DL7#+n631E'ݲH~ D]jL8Bh<nGe)r+!LF}H(j*S2TsтLaPCꗶ1@V4 6Q_Kt8V q2tsw)'1MT-V TB|1'I\5#"'_qCrN$SWMtyDB1l0Bһ7''QMV=y<Ѳ9ئ,Ϫʯu.><.9[b)y7Dkni5IF5CKgU1$z%m$F&Heߗx A0"-}{/8 &YS]D ࿖ߚ؊O*'+(/p@͉:E `.4ao`\Nr[|@߶p?..1ԗE^SӃˉA "L5 ^jNKP7o(|05@WDY> ]4gV[pWӉՄv:Pwq$CfTjs@Rx=S)B[A> \aǶ tiag*XϰR\0[=u)#P{ӯP?{ t9rD iI_z>:| o(56!Kwh0Aż$svll{Ń/\%{s}BҦ}Φbd.J큠g!iduZ&L F&52le@,.Q/)#S|_)&Mguа6֚E.rIAډ'v̶-lj>g{u4#C"Pp9|K 13k?B#YcV g:D/Nq68p`7Ut3+m{~4'5poi&y1,HۮOMR"SڙnSa:8}ý#G:p(qrNe&~'7II'9k ͋⮄daҐvjU'&[4/ x{&myjbH~RQݍd$dT_ e!W~A_Ⱦq$ԟQp4?24@*>*a= wĴ^P.u$8 \f7;mF )9Fٗ4?,"ܖ;} K){3bI- C s;&7(tֆ5t 24 #oΑ:. r0aF yZB] 6qstg`5>i z1UڜdX="qnk.GOF]N&Tytۏ phN6(٫F-ti#@?:lDa΢ X<5];DrkHW3zha0Y^ RUkptqdQ=}ml ''{Mz?iLHck {Ⱖ5[g4?kz,߸ Qg% >jޅN]XM *-{S9 &be ߄pu{޷ 0dF.Ѹ+7h>O TE bK=Xp2[`0an+FX`)w8M0Cř3;3,?k<,R`4]T_subdl9!ڹBXHJqvs`y@c*F}ױ5&8U}RɆ#b!#}+:ZԇM9yg]S;FxLBc)~%|$;X8zjl5VAM~_h> &3v W%}j50j$C m r;S(90E?}ㆴD[^* CW$s 5DEC M/h'!&?.w?b)X۴qe|)s j0b5Ve:4'gMR#ݽsgsw 0MמjsK+-ӌ99L(, i. ]))BV}(C-{%5 S|ё֞MAZP\i&dc]oEz3:o?}k,(YX1V$ެh^$OۯGQjS0pPs%f%vWu`wtļg&\+U1w׭kco5.9rـ:@* 0 xDF`/DkS'F2C/XޤXѤK3׳#d5D|4C,o&oxGXPq "E_cMÑr,D|7Cڮ^Di+eצYZ0a":ъq«HtED#ŵ+%>x~\#w#2>kΑgLT$ D4!D',MPor?ÐEʮh ]f?Xy=,Eq#J,HAJKN 1!NE:_ql'J@W ю&䚚H[0hp>쑘W`vٝo@qa(YЌvp> 3I }vːl@сOo⪜a@KE[ ,2t[l RBImK '[Ap_[ߴƑx-W="ȤfbQ(K ":P7:#vڿ͏U4E2̈&r^}gIst+Cܭ#n®6t@ps֑M59e\S̚o% &C?uɆeEָ9=-!?).jGqC9`R c j؋WsHJ8&\SJrìAm[[G OLG҈QqzXe47fFjvIWs^Y^An5¾E` >4h'mdUg( [|ӱبhtC44 rM ;M'+"Q!2KxH:d 1Dd0vDuPyѶ?-U3QfR$ ][7Ƹ^5HkȃY퐲mdyم&jlUK>^Cn!( Vp 9 eƩIbגtOf-/Z\NUx$;ʡ3-e\]$3h_Чk!ExiLLf/;R:9MN(FX}wH4x kU558Trfdڃ0#zp`@Z-IP#!VDrә@ů="$Ϙ@wek\-#mst`:Tn5m "JQ{[bL*q adBבUhdȄS :ϮƐb3 ~{2n* `kgv$vV0‡gO|#hV@?}1" )) W)YcZppKnwʄQyQ%'*%lpcdZ3KAuHXFMxGbƢ߾2:F ;@˦A Gj+$s FCϡIFTd/,0/ 'T#7 عHWSs*A32C߷eh4&o20@)$|mbͬq d aj#ވIRx/fEo25H|N|Qh|ݷ͐1]n7.UÎos߲D]t` 0JEe 6 1F IP]\A+&8 gaPuP"dQ]TWݧ}Ȫ<eOdVFp!~l"XV`/M\(0?S|]9cntNNJ# d7 S;Lqu{(V@e93$L v6C dK'嗓]CpGL%Zwl a/0'ľagҫ΄&5CrmBG53rI=fWVٙW[扏؏'a9}_1skZn0(ěFniUir'ffo/Tk%79OtĶK3$HC ٤^Q0,+-`9z4D:ۦlj#JfM`y;4#t.s3(26ܘ`9vnњ=  q):+eσR=)><j~p7BtLM K Yi^0pӃ׮1Yn2]2c"HWzDPH% R'2h(y~HԩgU01c"G+4KHl4S \ekw*04Io[*H8UYh&r0Mp:5ɨ+)HGCjIRŸ.xȇU `\ԉmXPW71@o hHhAɚ G),ͮc"9, ZǞ54;7[h;0oa 5ؓbbuD82HuAZ*Ɯ[QlH]OWH3s#+DrttQD"/o:+?o<ʁqvX3RMߨ&CZ=y3Ơ݂$/DXm $H ބQ>ay=C@S2dd˺/^1Jcܗ!%X8r|<~ΐ̰7IhnۛQю':_TSFk f8 ޚYE&!k&XH9Q1 nHᕅ+( Ũ@CЭPv(DZ*B[P8髌=#9z3ޒG\;Ƽʠ|DjqG oNv64OP:8 U=rAy @G_-DꪮװX %y{(t!JD~'KLel$~ N6DJya`I_YO qbN-$)9ur0+5-غ58Fd kenuFY3Ҝ)e9xOr1kH"8UGgvohY CH[neB|/+5H/SƼQ 2Lii#*7-jLMYǹ(}TtԳ1`)sSvg@,dWt\ۜ>i29bc?b@CBNJ'P;H r!e'@`Uޘ׉7gH$:JWMݣTV~s96&j f2AwqM$~nFRuT?kݟ~öuY=8hl5f4xfB\S-Q*KTl?{ 8 0)kԦ$" -$4̚jRBϲ]5c|N|YN, .%b)swv#W@p7yФ_s~ lO{?k$֞BYPDnpM?EZ'&C7.|I?Vo/]$6A.Q\dpnXf Q"PTB#P7fA,1| 1o) +:0,8O;~e̪ȗpV7[AQYPKAzۂZg?<U‰ sD]+bV 89AYvJR#1(옖~qCzqH#Jc(o`̋kdz|}Pg0?i PwO^F/)"{#V'np/^Z&SClJi6mv;>AZąj]\H= ٓbۘjVҎEm|^zM|dFh¼wOCҒwH3ۗ&&2JLp"xThR~t'@6.3;E 7)7"r) x?6TGm=db_b54]Do皯wfX'AXF9yOW[1!2A{d]۞z̭VrNIh'DQRf+$\7O/MrFʌ4zu4`[ȳf!0 yD|xx$c30Kdš2 IKU=`ls'mH.BQ|p#U'pCc,}lĄT=64h ϑ";_eM/JYϬv녍i˸PFC7Bv #ܯJLKPWsK7 2Il&p)繙?; 8қQwZodC.!:FMRn<9W٥:$4Er ``D$ umt7 =liGܱv13 ŬE@nG2e1 <') :&5AtՕuXWZlXxIXƐuF B-MNm dA0ʯcķqDདྷ n2S(}ڕ{}a8׿ΑVDXW07U 1" x/ņsj30f2=R9l5!&gQT%H8 r "'шJ ؟ك'>ïDkBizG{ @@0: 4F\e|K˫d,*T>57#Xû]b$(y+bE㤎`laմ% 7=|ڌD0\ KԵ #;Js9dA;jv}XE ~Lt ]ɿ9aC^Cwfb~BBsޜ# ꈌ (L ii&I@ZNOmMXBpW4l4sUTKmH "bx,>f-[za@nN'D$qr{_5cCk¦=elK,J/\Aw""J[UC$U ήǫOTӝ _ˠ<*cuM$q9HaaLve齄{ᲁT_KO02BvJET{[ FlB-m5DпKYcqۙ^oqP{P(QV*'QpvQQ`|S.x&tX<dZc-Yd& FF ؾ7T\!RVxJM4 ȭd Vݍѥ+C!Û.6U:@P 9n u>$6 %ڻL{"#o:mÏhz^ #<5vbeqj.(0@mΉNIS* d?=ͫk3u.J^&T?/(w* Th Jtk"ڀ-?{Mj8]w£V0hW1$ek`AVhJO =۝$hKHhK=W?ᏘmaҩYFk1Vߤ4 0,1<7Eq}2o=ؐhƘ8`ga=[ =_gE Y;k17fbII@n~!\~5&ߟd U.@`N0<؇I*E+-[AJ?`l)Hlnާ_nJX9YJ:wGp&PZ!_k%I~ lmޔ 9W +xlTIC9vۜHe}HUZ-sB4 nd2#g; J9DsErt-E7z 8߲Lbk *')[]wyyQ G~5( )SܘX?˭D7CqQ#41 ]Ky8#eHEݳ&!467h1`G4斥HwAt5zrO#{РGNѠ[{aa5AE;,B,_>c(t|ndgi!W*lJ:rAW˜vȪL[2?!Xh?|3|kh$k iqNUQ~P-"wﶵuI_7'WphXy{qU3BJdjqFEk ?22.WD+KŐy]+ D)D B k\7;@Q /*ޮm]4kfiXa(LJVִR6(p *1EG`M|H:Y]|^+ 'NB3Xq>{mlʃAOn!0&ʜ@/,x׾(XOȊɰNGU0 uey %vd*BSJ-zι7Ƶ2Yzl!1qYn2 A$%@5MSo)XjD ]SSt9mHY;xӂtt[_fi61).;XW\X¨[7DOx3wfR?#4ud(:]9!3?LJ1zs?[AeMW Zo lvT1J|e P՗;6$]KOeo?ցrHh1=,P r\(MI)Xd;BfN)l{h~D7FX[\.WP@@gZH }KY-UKdcV(Bg?x&Hm1̕ lrEDƂZ{Un6a7O@@| (OdaxWO``dvG_xgFЈ}Dmӵ*d@J!X7L{nSgR/?l2uyQ} Ls]:4`f?XzLSn)|¯==Kas vkw<CLA4.QnzLEʘou;AxÒG{`j+VlK8ti9P><6ŀГ?aޣ:<ԃoxEJ"~뀋-8a7X6/MBczK"{ɝSwFKrvEyAQ.a],"KZ5,I9b#~C>c7+bԦkrA.Db Yo]dV/ 4J[^j}y@$ #pF.,Ud͒I |zPd +HɎr5͑rֻߥ3؎%͍l1$^ÝJGaj/2{{Ŀ"Bcl&QDd.J&Qh~6K"C/5†ewg4ĺQDbৡH=$=VXB򄡠DNLBz eԛQ < CQ?fcr=s+z>]ThlRBS êH.$|ɷ^mHDTc4#[* *Fgce!:P$ Hls]nV#i@繼E``(C:7cQ#'m3S c&*I5+Mvsw1Mm5x2$j"XUP .FD6ge!t9R'[cL;U6./)1]-f{]y&/K0uZ^$ƮEq셍$ GRk df#Cjn38r/ClSNW.|5aGcϺ'Ca͂dkKIuY}UÉy67}bPQ[}qVwe.i aCtEn zC-qS .b`CoY6r> D=IIzJ>^fak@)0ҰPH -L fć6='[vԯّ\\Ts!\W3O|АR2ާ| md`wQڏΡ 2:%Iwr@$'nW!3B:!z/He4JBNaK¤s &=xny7b3AԲ夃,IħJ,sQ kG0}Devu߰K̎8D+[v>U\8uI"}d˅azJ-K?җA.Yř_!0ϧ-w U}fO(3)jfB<s.GSnip+­?[@ v戉1hcPa&h,[V#ޘxj01 ~"B$I#l ;/1$S:U脎tnSbqĔj&FTEԽap4lïŴɴfL( IWb6*QgѦ]F%O 6OP,q0e'&|Wb~*sŜVe.^A]ЧU|3uEd`$|qi s0j(D#|bUe FoM^n5:a%,Fy'BՑJ&QXEV)j+-k9]g)/l+U4M1[0(4]y xx-Fe[ ~#-vQN͇ɻ}2VFgw7 *Pl?-0MDDrѦr6p5Jeט.,2A"sN7HhdCg- öE@hWNo _R4ūϿpJ<<&]1XfeBꋰ 75",r7VcV-aӵDUIpVQRcgP_0 IO>|ThD ր4 [ؒ<G*8|Sf9f\ \p 5-/ԁ@u;^M,MI_fv1M8qbU1\I,ĵt QE !n7˺x.9g0r_}Ǫ} `MNƱ:'UzjMx]x0Mn?ewy|FqPQZg"|+6,^tgPE ЎZ2 рoA ߔ N>ҵg*# C ~WE,@;K9 !/S ˾JpO8Җ/DsUmU]+%8 H=:(a69`Z1@}3Phj#-ɴ*N=.27=5=9rL > 154y}߇1X,_ӌTljC2) IFIؒ;z|V楸.52Lr Gc]KL},I)Q(tg=!pOi E#k0:UMNqC=Q&4Y9tekl%x%[^\'{"o-TrӜsE /3L) 'r禵UxAr jLdfK2(Ƶr+ޣEFc6.jP0 GG4Dt>V-M1 ([rB G@ .=zIZ PTK/ DP[_D۰F P4[DZhkL#ezG ;f&9CnD5rNq9x Ϧ [``aC[=߰ZYPI}:iYuusNJuU괈5g; /s$l~ytȫȉ@rD@cx"#*|G^il~SY .ly3έ)ذlH" %XeKԹ;?i0#R:mfTПaW֋ )m5Dc{C$GF GF"M6]!ɬmYGDJ>J k:T*)?jEP. !8 Ln^8xK $ÍVjaJ֊AP{/T(`  SHh]Y+qf;GG_T:=!Un]'XUXSЩ  #+" sS=-}oC!7L;WܚL:ྟSB ñeEgڇ Xki ,|%eփڙ^a(aQo3@`{Q!c 3p|qw0rcHЌx۹8NNf-z-¤Y'`rSAAhSo5c1fKNw;O#׻XS4Aى;O8u{70N 4u&;5. 83Jj 鼖*J MU Q,jYa5iضf20zoh%j<y៭ 0I{pa`n^*E?e3N _ęQ$}s(ѡI"Q@'Ji<'>Z~\#0x0t6 ^TQs$%y=֨7fb8us!.&N:26V(f)0DR(OA@/ȩz% xt4eSB 9 @Ɗlpj*Q#ԡCҴ lKb;B Wy6b=lf3|i@o32gX'T"k1g_th<?Vf#w74hA}$b0R~ `G)M@ kovq /+aG '!1"K.Q.LCÎ)䊛i ioO$aov6mh=͟|tCR}S/p&>vSknOվ <,3AZF pt4CI|PX~t0Uqor9Ԅm<{!PVs0 *x.' hqdJDSJt9}ax?QlCj %ecup6)2(j2]!e0 odQ=ptS}UBE!>'~F\j Ҳ@(Q] .) #rRڊWYֶEiO p#qa O ~'=MoSL{hMCf"X;?fҎFC nE.IQǾ2 ؜n|Ҹ?>Wy|DyR uS b +x<}V.FVib!szEl[_W29zm;ggU%f凉pXUr@Ylu? d q"^=g4p5KEa6K pVi$X1?].߭\,e~eo᥻dF] %!j|S"Ø,kaB"%,ާ:W"Y@@>->h&U mKfp4-.a,iMŗNAxY*k'6O桜4MORuEè2,*Ado!Qf?_@fWPD5xeQ4ִPOv4r|U6ix/WMXЈ7ܴg ]p6\G$1l^IRZB4;:aJ٬e!+o 9D ;>po"d RU4"+bL滿V{ձrHj8Ot I,sa/پ`_䎅4\,OKSC4hԼS(EnƬ G"{tA|[oT]v/;6(@$V)i*<2oϿYWa+2LAWVvT{3Q0@9HFQ@/aZ0DL.Fgݔa/1jy @-($q!!IԄRfD8ttY{ K#Q̆x(댠jBm 5rZn,{ vFoQ #e܁ aBtW:Z rBKm z.5[@ps9ըե݀@h\WQnwl"5Fvuh()l 6Ƕ@+Pd8*#w<MHueP~ˆP4m}Bd 0P X -02X@Oֈ+j4:Hv*`Z q Ã$bc'z?զhPa1ɐ)tT#,clZ cWv4Q $:-˯e@HQO;Qc}.h4,GUU 7p8䡛ԍW1J/-cppkLvN ¢ fQgzbE(T`6l6;T)I?~p>qv` `Mt: 鏴@t@+ܷޢ8(=OpK폨z,&=Tbs/[N:*JȏvQBPEK m҅9P-;b0[@F݃ 22)CWG =KCރS:Ek, 0I@#ZArXU+r*OtJj3ICbQB(ha-1jB֠-w7@К-%h"Ҫ9fd"- N)\HO`H%jI41 wV}N@s3NLB2~~71ט<w55+O?+ 0ׂЯ$Nt^bB 98uy?cDc 2x !, 1NmjbRDbdH^C~@ة$ %iZ ( Rs490Njf ˅"7yT̩z, AE 3XڡIR#蜼Q\|yhhGus,% 35A**G[NX d(1ԅ'x?X^ QsŽ''kA(}tvuVq bcC"↝e<Pf{IAHw^sT3Vgh;qYK]0ᎇvL[C$&Ӹr0cU^6>>`?d&@AftG.D3C;WT* }PIu*m.hp 1 b(@СɌ5@('(&9)Wy 4X7ل@Q`>MlM,LqFPQG"sNqr*!w lbX9th/@;1#T!@48$& r"5*8@$ lAAb %QFa`RSLӓ z $.H::V/d(PLLP 8'2BTၤ88mN@ EA`~#@D&ԧ0vbO u?F?ѱzd@B"$q @B6T @1#Rē0=qNAg6p`R8B:<#r  ɀa 7 #HC(! KM(*60cNd!P@102d>h `Ĕ fǘdLD@Ad9 2BtFƉ@#=C!HY h6teeworlds-0.6.2+dfsg/data/audio/vo_teefault_spawn-04.wv0000644000175000017500000002447612140200333022005 0ustar felixfelixwvpk6)_4_4sȬWWWGHJVIe}/}?./߹'G3Gr߾2?2mgpΉi  h++)#N oYO]% 7RCEϾs[Zҍj磩KcmbQyw; P0 f(\KW:hW<_R\gP1;ouFiQlR$@"+_*H9. ZS^~o"avck' }"fw՞*.+iohTѐ(%ɀ6eժ^djS[Ġ?=DqNS%fU TjIU{P3}2hL&4p#2ȟ=$˻*lHxgZ6HM"^)ɇSS0gC ֐^fSU{.qs| r+n1oqAC@jm{5NƏ5c٩UahoVjw"k;#/l؜nn{&;CL0E,gTy t#h: Wz-O2Ijf9Č5 j#қGXUYeN .3\V 4JdO%f6ymLnq[S (X^Ğ4kY`-lUY!$] n8}lOʃz.@Hiڟ~.X~đ-IMTzV7t9e!\ƵEK{2tTa* >.4>_fPe$S0@L.uaJVP&tn+;KVI|Sz:YiއZn3(bcLѬ V<v3Tiiz%(KI2V ~b&>һƄKNg6CS}kadBHer@(d4Pfw#o|-v1^)q 6׆{n9W iG=ߓ Efwϣu9PODFn< q2QG!B .7LEi;"5#¶G6ɥj.ঢR~PfۤQ9[0Eiw#~ZM+%pJ <'Aɜۆ+-A!Ma.*0w2Zj,=rZ,NOC|2a( J2k9Xkĥ]"S(#Lg2<ŀbB2 CAZy(*+Ipȁ"Nmx_{./}_!(E? ad LqDА6QICScXaOn24Akx5 HeQ'T)Ѩ=B:ȦHJ%@vBa1Kœ_:uYd}!RtGGh|ꪦ!8^<3X\`/9 OQ!@O`7Z_9}:e]N#P;k՘֎2#+Fx45뀜 #R{0<N.? ):o]y鄯&*q%6!V= 3L/QmW Jq^Aǔ:TxWq<%$?j6V*6 $O)PlVg҅!H 2P -~ qڑ9 jJ`]H3*;Wьj&5얷['^OYg40_Mu!*Ҍ5r$ [|Xd$*E \PAEɁ:j'8'.3("֪ 4a$9,ƍ,dv2pP2s*~X98 "zH@&CȆIJ&[\qɄd,PgXi0P4yi c yye4;F ԙADP"(cJ!0pekS.k|9Ƅ'p5pk,)R;";.O/8Ps$W3DAT츨TT0Qyij&B*i` '<%|]s@640-LԜc cS>Z4h CEbqD>=lF'~.*^1"cPVJ *IYZN7V8`Ժހ\< FsG3y}GMkοI0L@/˵!DIY(ej'zK+kZSkuy!Q<w-ߢdk(F5xe173R?ލkcrCH3u}H'"˽)$Ԣw\d Wm;!uz3O`v1wH|$()nh߽? o@=&b (GU'o&={k9}R2VmE%U:9/oN+۰1\8a'G}. >tmu B8KNyDi499;6\?\1JB#z>/筣⇦\1DeH#ə}0誨|n '~m* w~kߋ.:z {θHNdf,0$3}_i(yP<@a "MtHS^2`GKK0ᶇ w?Н̈́_-!(ihx2-TTBnEYB3V],:-]c- 9ǖJjeEe 2F4`6v=r̥/"Q=?42Dz¾4ZItZQcՀ B"7bsYBx9یM;ėv֭ BO$-+ ߖkd%G*kJ}~<#L >E;# Q?0F&ךR. \I; W 7YH\ rdKǠƈ}FB7]S+4$Bk5^#o+# 0u3[,4mB/ Mp㯻;璿-GݨG$B3YW CۣjM.&tI~e$$.:`nFJ:BÛ'KX}t\xЄQ&cZ]tO70An/^\6Ъv!sd']kxtVT1-3~)Nz>K"~ r[/v!9ķMt I_}Z>ִD1" 0YWWF?5R$~$ CYxExÌ+fK!%D;\:xL*.ne/Z45A‰^D1pp/2dv6He5L^V $ѥa/y$q h9^9HR,SM H/bcR 4], ӏ3h}IH *Y 6܂ l fwM ('6qKLhWkDs޶v.SW0=ad!) 6ab9:`>ۈoPM3`/S>4Cl~j 1Ҩ/䭢T<`cd hN" cj5Vv֊9jd fC՝I>F'cૉS6Rs\69Kx[tI=}XJJZ}SC] cu_cyUWDڟYlt#i'<}.$Ncrswffp8H7RwjwK)D|y5qpT{KkDȅ;;9{p`XWn` pi:-TV@EHXb~027ۦ~zO ͜ۈqv0 !(f>#^Q!Iմ͜$ L2,u)w@]`LnJj#zT/0oD8[6zp‘KL2|]O'v.@l66i5k֮&'Ȥ{Eƒz#鍹q_,oCbTTTG+yX  N%&ei7X0W#Q2.\0 z麯}pL ‡DltȎ;BpA"ɣbp)6El3)|z>&5=GSGFxS|׳BYm[@`O|b6 wu}Y"* T& rteyM1xCbc\zešRoCtg1v95 **A UnZmWT Al_", l=|^EY\˦#f:ElAC/,_ExzmrC,IC;&"~Wݬ49iL$#"*u@kk gdbK~ af'ISM Pbʞk(0.$뇓BcQ}]p?xdX&S~,dL Y֩uz#K5$(}or#lZ۸84ٿ{~j…r]\tq NN@@>=dTH,i3556;X? $&'P%յ%ppruzLH(pF7;gpAbr{'@7lW ޲gVs\FҀlBo1$Pȩ =A$I;DR1DڊAt(aH #wwt<vz t,*!4!\3giGNW2 ]28cx%f+=06N'yl)dKX@4+V(4D*dQ'I"lSA(גz%k8j|K\QMVRn3i$gEj\#"NK|gU"+~"n[@ 0LL q9NQ27ml؅ Z4QlmeN !Jf NݧFd 8!EQWl'ʷP s_XN}OaBrv?\tP w-%\TjvH$z񀵑GռKɾբ.3n#@Ƽp}ad>a!mJJ41ΈDB'* :rs›W>E|3Sq 2!j]Ĕ9~qLNƸ8!ҀGh[I(9|y8G]kIRRU뇎q=y\ ^\[@+2,a"1K~$.;a9MI6lHdXCB"=`/CmCO SW @bj'"MErF b!y&,ݨ@]Q9:4OJ,BDQƢS_ͲlU(ɽl)Xɺ*,ٲnZnՌSm` -J*1qI2:xru X vv 0˸AAPJIMwΎkQ1xcaJ\@ 2?pVu &&k$ɇx>P ɤU$_׭H]D! ~ Q$93`qH~1B˪b{,'Rtm ` D>J|jPHT1uHlaR`P#{bG6~\πtƄ@#X4xyl#rP~ S3p*'xP.ZV~yLAVt!Pkh##<::0~MAFThL (G8`|ZI18с rP48 tpF7\D AqI 1֤ʐ2O0 P L0؂9P:6 u4"PQ h SPdk:Dhd 10$ 3@>INԠAH!C1P438  P&(sK<$8ՀFA2LbD#aIN Tf,Ej @d'$8A T# A4<.P&@h!&ȇ76 C" IdGR8b⁡2B9$^p2IBɠIadtL bbpAbA45Rp2BG҄\SdmdAAs ApQ! BF c$ I'`je8HY q1) GR`"A1B<  1N C>ĨdđAE@J7:r ( N͡@&"@ā 4zJ d,=:#0 0Q C T@T8 G-Χ?-'JNqP=00teeworlds-0.6.2+dfsg/data/audio/vo_teefault_spawn-05.wv0000644000175000017500000006162012140200333021776 0ustar felixfelixwvpkcEZEZPWWWGHJVIe1ƽTVR*bJD@|ܹ[?"Vj0]FÀl֓zsc֮L$Biq:<?UMoRGߔ>M|׿Vm2 ڿx;w.J'I\2Z_\^){7U1  JLMs%(̣0Ej-uoB~`;vYu]#)V??eo菳@T)1JG Po#>60I-%%KF(< y U𢡊\S[|H+`iD/Vn_ w5˲w$>[KA:؉6EGk?N/-,mS?0VZE6!?kKa8ϣA>j?Z ji&Jnuu>Ѻ^.ZGhnʝs'pq#dXp DרBZ =Ap\ܺ"Xf!l0n%pXlnE]LQՙtzsKXdT VVM缥F/IND[=ߕ_p1Юb|{[n>GO|pmIJ;6{#9Knωi˽.~t"!TA-D sqwߐ{  Pna]CFzpV 1T:&O`Nӡ%DI.KD,w|O^2ņ)`SEBߎٱ~ >B;HeLY^JI?*ecuu wfUşJPVhEtR 'DFy!ŻѢ+_&5$Hȃ H8Yj6ò;Wy/{<7T +}ڮcJD0a?$F+44[yDg$g mhiUE'w) 8m뢃.Q~FКk17P0dC~i|0g&5̫d%($/ 3$2EV(Ze/JPnh jQ^TK 1\jhrT,>0_ڇ+^mΌQ̚y6bl}$ NUFZl(6%t| 4ү5xRD &l`wљfWغbr؛[FAfxW^Z (h?col{VzA{oBXT~ZH`J.%N>PvmX#/[ r&}Պ4%#"5e>ݬQOtc ?rDHd]CpQռdТEusT\0o"( gb(!oJ~q\T(|huB~J2. ZJU?CHf'hgF=YeajzZ8_g#&DTz U2$k_w܊DFm@)mAEo64ꊱr;btXzʄhq qew6j0<]+C#Q&"/Wo' Dp9jM NZڪ^XYmzSAnAS"O9)%Aٱu㜶m>Z~# ['shqƃZpfyNl8?5M}4\::*(C7Ym,ZG|0deTW֩vՋuQZxEWRm[DۙU}m:bMMN5q.ir6L M'Kܮc\f)}oY{t6CK4> Xܽ]t~!BVyͦ 2W P[\!iu eͷ{(hS i:E_Fr$ yJ޹oGs4DG% }5P; 0 tؕhJ+\ *N;A8ab)nR?]=A /x_\2 iN[718 YKc'vٞ;uJ7hl36uI#Eaz dnq)ܵ~^Ž=ShŚh3fjN"6x(\v?;"jb΃tgJٹ=#5Q 9U>!V8U {YAÅQ?E:m?p…01Y6ac 8Bd'*ɖE>9MbsNC⥛ٯ KT(q '7 K@O؏\i `V pŊm;pd,+ye*ȨA{G-_6){ޔp,yyFqOca;\VwYʹ&6u&cDV-jVӁdԢ13$}/ 'b"\jD*f#0sv{iSzS`ey;/>"#3`L{ݮ # gL(Vc7(ZWDx^ NNV$.d%uNχ i.eט@E$Kq,xI`W~0nDbˍ]mOT[~JتbqD L_|/@ G;!U-xW0'0=H/:'ba&|kF6 !B)&֟N9#+8ML=SIr̈MٛסIj=¿,68-9uyh4^;xl9 ~ȏk='}p΀h\\ymtkq[,8LUk8HM: r]g!d&9 |>A@ϘЩl{=p&Sn7Q4 ?!$zMўG  &p84 ahGu*@S$@U~")姑|+Z <h<$r[#'be"Vxu2"߸*\iY.,(C{7;݊),,y#Ms' 8NG`l]8PG` ,R e·׉U]6w˸ ҚgMTV1#TrbBlD9LDn>.hm?$>PABn8dM˸?A-(Qͻ_" !ʧYo5N8$3ponw_RD=iC/ Q&[ x G+C~ }6Amp_m݁vB0%1[_. G ?Q(o*hG \';}FD@5 (r#}7NpeuFgSi/x"}Jg/Y%>;-3';ډl{rDZiU&DFt*4O30`z .%MsZ*A1::4'X&5C"PW2z4F*g4/K"1*D ^ݍB-c͜ȁ>BN6>+I\̵?iH͍V"&B-%~M]o/ރSW$$@t fn7w "\AD6@R!U>d!:t} ̪RZa͛=oYN|cҿg=!q4Д(5Q$2K_r!syeF)#씳Y^$&Ԙ7 t^{gɠs1z~HW+|#rP(.]#Jfv+ZZqYaD; AU`?'?hq1BuBBLMc:3{/eޕ^Lq,Eׯ*"^7ZV>9'$ _?"1.yb5TضS:ɸ<>\;Fv. A,;r+h?5 @MmYQnY"TkQt&]SMn죂(Jg)MJ.ElĿhO zp8hb6\76v_a$.?'p楂sm̰GmRn':܅}1LwJgf承,C/X&/40}PS\Yzѽ#(IST[Ӯ7ed0+`>?-6mD-[v2!BТoü&h'-^0cApC(jwԤT;UU^(5#Ӹ\ADIFhpMl7ЈsE7r E{7 ƄR-d9ߗ^Ud^*7ekE5h1m.iMd2WMlt/{T%`QՅ')Ćt \d:u% ,2F Lg]n>OљhMc~S}#gJPuv\r޻07}ocLvJzOn`I+5Td8/?JwPiaaލ(p_ :`ID?AdZZ7Qv&|7泈Tc rM&e+-gP _iW! qv7w 0Q8n3lj(sRH̡ϩ0eTTxvqsѝM6jKEʯGfK%Xw_}_o 46iJ1nǭBO}@}'C،GW_ 2;ٜ[ Q3Z__tl;ۥ"S1낑Ъ;ƼK(#('7%t=gMꄔU;G=}*DtH=)U5F_*4/<@h0y0Ka:DXGgKa$;fmuV~N &t\0rZ8qDLjn^Qgj2X0z[PeiUL!lU> KNݦCݔ _hƖ?uU{M93_0j:\RodtJ,DuWe vãL97Jl #kWh݊.RKU/b4ؙw_l: utO=:- )k- gLr 1DŽ'̪_> ;QWK@U"*A쐀G1> ڜ˚}4 H#` Y/2r~S4Ih!4MW^/؍qb1,#L-! .t(7xw:/0GH:_UBrNx$ZSv,U$YG j|mY7&+_&yCE(GY54\TN}iSwzkcx+: m˴(рAMquLxOmyp> .Lb JX6)%}Rϕ!FÞw,G u&]f~]loݦ" Kml o%v ,&C*[`=bTl3.1 zM5Z&J$ͻ}$Rn+E` Q_syW*˯k&ZNy(0nbq ƺiV1űޱPV}Y]/ ]*M=dԉƆ?:^ 0&޶l^~d6 _#=AԩODP~ Y,:iRV/y X+2 Jh %3ABE":ָ#K$WkOMg1ELxۙIB]=cof_%lB2U?TovGM)񌚷7 =*"v EmMECB2@8biju*Pq,;pFeÖS5jS;܄ʽs Ci+TfFť>zR๣Î:|L-B,!z[7}QMn=&m LRF"Jl::1FZV-3YݑUlFM)ֵOy,gKjoARJӯ6ҧ'Z?,S'o_+꿂d9D$ Or4EoD_ cDۆN>̲ ,B"l6uE?_ ƞ`86MC9+2`nE?VtftF EM *Z+bT?h;~ʹWʉ#Us6GZ."@##$q!֩.>^AY4k~y`5$Kx xyCT:oM[iQzrL./0,'}VIp wMA kV9\@VO`x-Mt{=AH:'>L?ޯ{M\ dSſť_uI[S:2 _}&dg J|GۮilX-;l -"+ETs2[> d:C+5 ;H]HV=r`}aՃNzu?.-`}K=Qp7۶H0rmԡVMa,:z[7Xn7gk!ޞ: 9_E ysC\Vȑe+C[0Rg-zۈpK'xT'rna2~;,_{@,"x!7Y]ǩ2S.%"i.f.<\pɶS,u2 M\xWtNi Mh҄B67KD0 Q~ '`"\˞8\"t"&־JgK;|`>/NEIm2Q7]4 TkcD,w@]A =dp=Y8D*%<閑bLy`sȚf͢.$|m.,_]T22A\.e2vSF3-`'\ Jel3me [^DU@j2J'5uxX~ |fWs{!Cp$e ٱP.B<^݄ l8D \s)A/YɶOk4^Y?cR HA!sp+zt^_%P]HIv5?}(~ E߇UDdi=cO7h, A_Ћ q @AtSni!?aЃ70GfmlKCBh5}%yL ?"&0e.,( iِ;u+1תr݆A7@iȿ= B:҆mbG-lW:\;tZ +CZNNEr: #Jѽ*X?x Yӣ+q_NIqV~~ݡD1_A]\)ZKNbn}GצY77`NIZ? zy"-γP BL !|ry`.648Tq=6{X ͺsjXV>,gEV+Ahx.pgVYZ"̤Is0qu*27жYB4'VZ|*M} aK&MnƸ9}ڠ>b46OKq7S[ ^,gΝN9,ZVɕ>0EaB_T۳#Tf40ެ; j&MZjɖ|MA>blU1 F^.NC$#6r+ U{YQ@hy]svk\FեV͗`ҽ^4Є?JNͪ0)Ef>I*|`yƬRʐ2BTijP#u p#֬Z]oMs28J1]yB@+iRuDŹ+lݼBl m -\\䶓GL% 8[Iu\ڊuuQz4o u<9Y/$-s)U1PWÑ-"#Ca-:"mhOv86 R&+Z !4(mr2x#HؕV~@m%Ep#s.3չ ZDsЌvH7'եc(0!RhPsq4#m/5O(T{<"hʂD.x@]/7%ck U1~X Yrml(o3N|Z>Fi:(Ʒ{% ]-'v5I{ѣή󨍣Tvy-,DK:$/󚣥;J1Ȩy7Z8r܋΢TIވ@8QۼeŸL#Ҕ9V4L{v&`H8Co“8qԊ8Au3.}"?]]`0'd{{aISc&@GRI&nuFNnjނ ߱xyS'D ?âɇQɂc_9DoCX%0S:г1 5ٖH;X # n;9]27:׏`rE~R "Ѡ{zxRuy0ӪaG1,|cdXV֤1(^ $p-Fӝ MZdsBOhRt%2<) 6f(9<סG, L^v%yRI]bI-СZڏx"$6Jfb1u^dZz KTB_H2D}JzhgO3p߻w>郠@˪܋DhU$鼀&‘S]I1jit!0gwnO!r`똬@h'XM3LE"uxa `M\JtU:hСElS_,y%"biʨFS\d,UTUpeE,3"']^L9+2=k>-v5:%]< C`[2E@u/8X~RO;00_wA-^/ZUC.u2 JW+U ?<ط{,3o԰>Ⱉji%2)# oE&O>#NF-DM?MR W&q@ʅ"DbʇޘղpM0Z Ni 1+7liS~ .W 43J+U,cP1XE}ⵟݍp/69b͵fR84%vQt#-I}1o:W9A@MG6BFW oxuNݺ~IN`cZUL7!G^+ɩ8䁰:{lO0ˀ P6'*t_)C_Ĥ|V(i=pFGEnXz/HФ#Ov1QIFrZ`_#p)+1o\Mq[ZH?I/VtZN|S5T~{m o͋PJh^|BԹ&=:-?Fguroܜswg(sT8E#c>YIP餄"7Aᮍ* m)\ }rѩAT ϖ%_$pAdyh9ub-?a?2A +/$Xlై9wA5ӉZ)K"1~,W{d~{sCX^s_n$!g0 /^KOgZK{ aF_ k8 *S^h灨:`{^z^~?$v`tؑE_mn:Ao~ᾠ 9˽_aȜ$5ZDJBz{lj$55T8\BUo5Ve{_!02Jtg!00873r+\_Io:-zC!fJt/jo~?&, dO۾ҙnEUPj_TV狱V=` M0 ?unJu8iC L]6A -er\뾏z} ' T< :!TOX +N\ZM"JtBV8IdXR%T}hNӞNk#t=S1ӏ̓7_[uNj3# sVݤ'ЯͶo j`$6$P0qT2jqGLg'HVm\לݥI"{Զ:̬~pM˚1*)뵡\*}deX^7Wj lY,WhU?5'̈LVQSv&O2I _z{k QIxhύ\l;pĥdA/z/{?z$Jq\ݪPM,{Z0ls^cgۯ*'?a*{fGi?e;ܯ W@7}0%![kLDU+B2t4"6#;g!(X㋔[+cs '㫠Ri3@LIG}\I~ Bwj7Iʵ/hd ƚk)uEÃ(zEq4t99; mVާ` ?bϠ0'9tLnB}P߸Z*Q[&Y75Cf,R%_ua'|u|ВZ,'5 ]2b,ўRO)G@q57qMjm&YvE. Rg,'iJ{UΓ`|ݫ~`sX' JE ȉV0.uSt yq%w`|BCmγɛp^T"pїUӁd. ul)9 sp-mxv:4,ȟSn{=٩ͷ[dəB|Z Rɼ\&Y%ū[1[<‰?0:~^ WVy'6"xL+#0hߧ2>cY#mFakSE%~/B%$ѶTYAcz-@RiE11ES0 isrIѰcuLMFLi3T%{x> )esC6a6Ɛs0PPhvjexrG.RzpLGX on=|Ȑ sW6걀t;dKʘ@LJ5=D`Ŋ1oy3PÀp$tY5q:5]" |,xI QAYx|'ϴf``MEJ _'41=Ii-6ahXqQE̵nJ]v\5O~>BzT]t|#&u&9?4~zۚJaSʭ"0!y3P$f]3[s]ӢڕP}EƱ)C#t 4Z|1M>-plJѾJv4aE2m5 .bfU;\ڇЈrS۹`*߄: f78 n[ 0~,:9gH+9>O fPJ%p7=ѝ#$A$?'J wD Nv{A-+e2e5Iet;H@BAɍ|XayYG8p_ZF#Gnv0v-@!r<{=G&KcEt]ȶ?&_ublٮ[Y T w;(xQɒ?d@SqsA{^M̨O2]Vu#NeuM´8e_˯DeP^X~F 7 C!]ɍ*q,z9` '8(bQ͑񊀵v'sܨ T٥ƿGx@D1kKzt›e#.f.BO[)]-CZ23%h?_3* b+ʕtSRZ(x uI>ޖDHVl2S:mԥU:+pǾ{cyh^9~EHDҋq!Vk/цDxr?+Q9p$VUBM{<۝Ba#@pY@mّڬc tG`?9. +2@x 9H*A6᥻E ql'8ω̡\0(ӮݾrXGCꊧhPNex\%WM!vJj!H,;Z11 1VN|i vXmݦJrٔ`8+Ҳ-/8ǎe`g<󋟑$1 N.ԁeA ԛm ӲmK܇|@:!DE$Ϗ)Iޞ<4, D}Ou%3+?85:d墭gfg{HWnYMZ>"տĿ$IR@Ef#De BJC  2<DCo(;7q#jU%AVCdžʚ"ccv [c[3~ }B cE/'sܧ*nE*K?7>3*#)X"`5U,J oW&+]g@AY#'%cTaL8ܙIe M>Y :R1`@H] :̸BJ?g ~v7PǡP/Ná1^6͔ĢD%9MYjg''M6cvp&A!'^Z0V<)㱅G{P0!;O!/]ynSvuܱNtj%\L"xq2MhХp2/r)?Q20N|yNߘW7DioM|P\9IyАhFbX/GEz?TčY^!gvf 5jPu2Pf[9q=W U=?.% T3m|LX3>!YܥXS<\xs5c>7JaZ唋]J哈Hk~ثe|Ӻ/ u"%T7L :撔09:zg Nʛ9H"4J4q M Ѯ({05v;JdRQ '|30o#3K>-LHF . qk:b P>qIvQalOj#d$ң#@_f͜8+iN[6ǩ(I}>|TE. M}3 )1[T_Y9}.h 1M` ZȫƕqfJ=0Kg\RAp0ϕ\ 3Owonkgd,FR߄jU{%9ԟ#,gnր3{?.yU'J|{6g[uH*>噔7ؠ7qgWtGdBA> P^auy26?d 8FjMm7O|xFţ;UxYjt#`rBmxő8VB<˜PY n ~\귇Ed85֫_?"cK$*do,9ս-S'Ȩ3 |lQ$mn!0KZLHBlmz؊j^p*6b]^3;B*ibq"Ek');_R>._8^Vۛ QisvdM\Yjo4#;!xr.费 s%LзFT>ڴ Exum [J )QmnJ$Yz:օ_ڧC{[~=ɀ!È3w/]ft= "skֆ|V a>ojSv(F-7Bu:y,3/7k5T2$)4DUJRfzq3͂Wr*M.~ EUc:bh3 D7) oʅ_N9 ؟"$=%|r6?Haߩ3RǺ@vXT\2`HSfP=,:cSp2Lexd+ : nΑ6t^և\`fYx;<O8A&-~Ckx(g8 [ʆ@@g௨OW vɢ7jLBJ31xs!d2P~zCTYF|hR; *eN2V402E9vcezo"Sg҇G.hpWk:T.cQ~Jܣ]휠l/s} *ӭJ;Xqq\crky_A ~Uw3p~& JȨ3:}x~zzO!%byJW8Zjs.H'Nw*ٿimvdpn1nUQ) 8ï3 Xj%7 R|AOULcQC%{hz$]<-7Sj0 =/<>%Ѕ#QCں @#Bf FÖCv7S<2ډ gn7HtF'7ndUo/dS  Wvt_n'B߇2\qޗrD6g'y^.3k&779i eP:02Vq0O\ئ7%XR[Dr׵BI-lZWVE$"eۤR =DdS: Ziطr]aߗ9Rex !r$OXh"0_0-"d % NnVHG#[?CA x7uH3,jl@ҝt|(l\kXdKcDΌ&oʨZyXJ{FK܄8;9,wgv) Vs(Zhĵu yd]Gq_I Y\O_rVέOzp! @#WZC'4у/QbaYSE瘟U%Tb5`2TRc<|焻&4P1y|wz!a( mx_Qy,WR8=lKKho/z-7"$[@~?Pg<+-M2hC=ia3u{z诇RA(_Qn 9kJmny oFx2MiCV;@]se%⭧@%_<4جXg&w&gSs9q0 ܉Pଦ H픿?Z\B$pօHοƁo\yo^ip&5I ͛nN\'1%,p/1 Uens@U* jv?M oyOtZ5 ˨7 ~cRD呂qq$Wα5x" &6rDjE?PQΤ/l_.j@lB+߮RvTƷDr`uti\{S琕@0nF; SA{ VlH]yܝCHޅ ˜r;.AY[Jg S 6GZpێli)Ugǰ@cU'%(J:? T%n6Ds#@61T R*:t׎#f9AgIx6W)8 j7۫݀ !9;6f8 V2xrƯqV{GaOz ]CH^[Óp۩ kp IOYNO2.4F(gsUoic>Щ]:՝{<&Iw)#f2.k-=4(}R1jJ$8kII őb~d{7B9ʊu ΊfQnB'zGj.m4ݴ5XRuk ®h.ڰ+^܏+ +4s6D+S14mB"8P_$IMfvekHV߀8>)ApId.#1,8*͏[eT,E&2Ny@Il8\Z|[HjTmwad -ysGRE)H%R^t֨2X1{p)aHNI0Lrcc3ڦ<zkF,MAwv_0T;2>|u͞HCi)(XX]1k">amz%.D Cּ%ݫ#!܀/[jPGQѹbD +P'@S , ʽV,~=؎sK~yoɒ @3zXʯsAR8}l3B P!@9VXgQ=rK?eߢH5X,w#v%p:e{68V#`jyyNtqmc4aa{}K^/c}PjpW$=PW7Cq2'(I-ĥwݸjW}; ,Fy}D\ii[^*oH8$0#g~&f{F`ğJtZ upvGXiFI;^-{# 1T*n;W{m ;i~e(G2&noپKCA?g0R͋WdB_]tmLhȦPP85u]l#2Ki )s:m<w" 8 "*z/q@!vfgPֺIܬI֚r4Tmmp`(f9:-T&)s u)fN'p5ySN:r N3ա4:׃`DfZR  кhT~g ң{?%4 ?;!r,BGמh}dAokd.GetFSvK7 (k3uDoTES~>Pw-)J?;,6aX(Pwf]Tuq0ۇK<̀e=C0MHu2ЭYˬџ|Ӟ̌ m\ C9 M2' .2?.2s;pSgf*V>VQް4D(d@iis7Tnj)".u"Nd+'*m٭M!cwRXx8Ώ(;( ƺmza3$w`&9U=4nA[$r.WDWVUd#9`jhLe|ךB A1e,J9x^r2'_ȮO@ GPrt!L,ugN:T7Fl <G}ϧThOAI):k:d+|h AkHITO*xLe+wH~Qak *>UƃA &\ u h?JI@`&a\`Ox*AV"ψ2-4BXA6,4e|ZR9POGG*LÅ1iJ 7{L1Q J$|͋CD#R.֗9(2|*{B\#w"AFQKŒ`5%jGK#3+lH +E"qIpBv#("t a'h,&5@Tǚ* <(V4"IJhfXVDGh\**T<@18?2$!\ BC|1P 00>'%!x%4tp=B2#8&B@(gCYVQ*HI }C<8@1 8=<6A:5%>50Ї?Cܧ@?`:&@OlpO`p@tdBF8Xcp  1h'G<'@^ 4dh 1*РQa84*p ^nPS5  _yeK!zy\=<( BA4p4hv @.:3])Q(8p5F MbN(A@vm )Eteeworlds-0.6.2+dfsg/data/audio/vo_teefault_spawn-06.wv0000644000175000017500000007604612140200333022007 0ustar felixfelixwvpk|))VmWWWGHJVIe=__o?Ӷ?{|cim!@ ZyRP9$л9JӜDYb<-J # j9y=v^U ,*E;L)"i8pB)8$PTBҗFf5jwA\ `q(@o9#EH XN)IǸc>RՋQ"?(` K$2rJ0rX/OSQpad _WF$!} Ѽ+E h̠ AD˹O$ثUf0C]CeslN1!>D,N0AsA}E+[Z12̛esJtO-D]Xx{ztKE'+'$p8F%%czǤD __ _^nn| {w*Y~Gog)wb\#FbUX@N*,wlWUl8wM窙8p;?_~j㲨 0W} hE2Frs@UnFhcfQ3"OUr kɬ9`l⠍D/fy.f?XܘԍF;TRs&f5j1QTF!KC8^=Gy +&TfbfK$4?0dIa|gS'n'5К7~P4Q1̵{$C4~kƤ&õnlf@rYߡi笣[9{7M?g~. X#sTUɵ(z9JC^2w ĀF($CaN:E3.P)r81Q<\Q$AP`|PS6ތZ2&~c/Y3A'J5dGIznOn@dp B iz!3$N^ X<vw,O2ɽ 'MO/Kn8.d@]ݸ;dGnqs5o[J\T!7< UHTc;88$1['=tCy owi M`?W .% 8Fա8EIeq -Jgpq AOw"ڋ'X9ȨKޛTzuލgwu#Ng?mҌX =A`utq8=*l E>YȦwl$$wȗ6X)57kh_O^[Av^!8jY)֕RW;&W͑Vƈ>v$!/?{>inX݄SPiis&OOLLAΐ6QPx[ƶ$}[Iްg2`ܔ >4KasPW(L~fN{2Kh3͍H568èPK)4v Y6lه=͕9.>%0w?C2WBfdDn-k@Lu1#aʈq̐qc r^ 'OTs..#K~]}WEJjn~L9ÀBR&9eT\!F1q!,4[2g˃(D(qq8ta<CGt_=vzlW,-+B/dIed| -  M҈R/fSe;Q va\9/O]|E7@b1q]\.,z%UMY4 ,@^fhhcg, 'N#&Blj) ,Ã&oۣ^6B)d4:kfH{.݈3'XهJ42CDE3`Vi}\Zy#)ŘXfWܤXDO8M򥜷B[z*Z@.g~1y;ϲKrxQb+jziUE3n 00J֎w\pR]r${1Q9匟VSSYkw ]f@c݊$P?bhZ&daTɎ=p(-%R`-!)8'BP6LA)W o?{ Zc3k r냠\}G{w՜Z0Y_J)5O st$ t׸HbW.(sJeV^Y~0>M׶xWxY6!o0 "QSFG4]/d$6H3lLvlQ7X@1^M#26B'ģKo;f(kw&hu1^1<;o?a5q_ٚݓ/[u(ڮM1|HS'g Ykq4WfȚ!xa@Pt`Bn#6062!$۠,2nvVXՓ5A4ӕ$3U++! `^'E_4/ {uʺz;iy}`NQ8+K ge**C:m&x?jg , $F([ycE.2xt*#d:?||e\g?ъJ"jG)dBLacf{J0h![۾szC *08X p=YBZ¾\w~jG'16QBr(v\@zx5"hQNuYP"*`fWNLsBTn,`S>(W EF9_FZ?O>ˈ޹/)E ]iNaB 9e&U30*Ye:Tw(*c<_Ȁa#Ъ~Fot2+I&vj#[Po:щTLÁأFr)-n9Aɢ > eajhx:7T5}N)r{|1l)M [Qe2gcCڑc*Ux~fpU &W#\Qrȯ0+ѽf{Sܿ|L? 'ߞg]PT!60Zhg3 V-)$y9@+£.lX zR-IQ@c4AyOYRYoJ5.c}.iӷm [w7l%1 ZZ4.5$5= 1V1üIS'PXVr\OgVҖ%`h*vB:174C."E@5ϗaZY}[= Ӊ"ZPP@LPuUaMg`D&ZI s0.`${ b hDes(Y*lK<ؿzh? _@*{ub˴nKEPp n'r:z\2o3xZCr-7M+3K$&Tt9{XEN ͩIHM"xt0 WTiAt$s䩆U>ߊ6=%i`F~g3$~0%S4O;6T7z j Jn7#pa柌]Q5;y򧠫V c:JD&SAPNRNio -[v>)m?|GirdCU= =V) )?pĸOo'0ssҩ6#Zh.*D|0Vw,RI>{erx#mhɅMU?"]8oX[X9?@K?[ūp;[!-{sje , |%2""uG2dܳu[c׍_)/yIPd?(Fc3_W?[  uBawyva:!C9AzGUƭ%hŜ&ew*!oȭ= `饃Jfd,>MA"./PDXRS\DsT QVNm]cX`r=\E%5U}y!E|t![A2:GevB% ]sM G2`&D`ub=J^zYКf{&d|]v.8A5\7I:'0o1UDԺZkQh/x5C/23F$lEVY\(+ vU.ԪԎ=<M.߅C*i7BL)i~ RY0 B5D K t"U` 5{n_WixRc|cw> }[x4Zr5V(N -0 6ލ8xA ̋S# +B1ɳEioxOA?nW5ppA@ 'X_NMU.ĝNl댙i^t%Gg&G@a8+x @C,Og)eT!0Em8G\ߌFHfL9^鈵^e읐JRj1eN y=4FBٺ#x@iQ%>/ճ*ņWp%DkҏakDrܧ*vơ1itJdFK2ʼnE|oDL @CdBj BF⋫m.D3@ Aߛ:2Nh]^ofԅ* ڧ>+9O0:ѹ\ÎΓ1FUCVS&sB6*R\0k÷.9lb=qYc=۟E`_L~~Ns4F.-# UżLXb/0dז \=h-@dB K'.o|m=^ _'o`>_uޝdbU K)8KB[niŒ^4 -~&}#E@T aƵ/3+AqWIkۗ'%K@^V׀ =J醫wxxЇNY`kک(+۲ M>G]`^;1Ѳ3ҔŢ(<G77 O]|o !X )r*F2K늦Z2 k|(%!ZlӁhr1ux1MLlb 4Q}L@ѿ&K ~:oks]R߈5*Moin$J}L+.TNCF(p imᆕ[b+ ^kdGmHeN+2Tziz`51|?VG#vznGp_v,G[E[{O}AF6-GSϳhr8&ql`JV UuU^PsjL }GZky& 0a3C&^r怯6J&c,9r7*C'Yu&ipRɻ16Πg+ [5d?Pww>3DAwlƥ!9x'瞯aM"PY*s0c`7]o+Ȁ2}!ꪙ,zs ޢHUʱ6ޏaS.efb!"n\'e6J͵`)-h7/  l6PfA@Lh?2# E>:TcI3<ܗ9B4Vg+QQ`#?6ӠMEUneO͑QXt&(lRvHt3 ! h#Ykx(Sʦ Zeź3O5w3Je=֘!JU*1u_v"CH]vs]]1nvieNHAHa 4I3AFL0Drڱ mUW8ߜ?PcB-0LqKi.R<䧕ȵh%iŹ5 +&f A{JLPcrS m[I-O?M&bT]&y`;DiаH%տjkL*Z&1YFx̐,ښ\l"N>_12.*$]$R -JqTp o?QBtﴭ- eJYXxܯ"D9,c7X$5^8곏֯` #,D1|WIpN2Ŋv9"֪K?CG;[B=YR܋(U_nފ:Yx@_)E goQ@h jG-xY3!5`S` e8`8<_a;hpN[5H?އל7 Pmi?O#Ȱν/%2F#,K (y%ϫV-@HrHgϡ* vk+G0Bs}WD2emv"ne*;qpX*hBVRC`Z bN9XEDJP2p1wKc/+I z(xCqgܩ@{?DkD~bpPk1dsQ} ""i39Ҥ`2cX7YqSP" SVqUXzvjs __V0+}2 אtƄ%Drgc0;60,$ :ԉ".jbvDj3ٶf`-9  4z+X˷n\;jQ{,fq)" F޶P}g1sj^hoqn0E5Zf Dd4 I;L}Rܚ=u^.ݫ/5]H҂RLl.ķmU( X4%xAeSŅ-n4+/ JR_02!(u6Mےv Ez6iٓ]{dVpx. Dij.5~Ȣb7p8!r`/X%=3(*BK{; oS<;'so>F`f'#67']j0GК%wC . $-#/XQgh,l5ΐpl]$}څgb M'ZVAxNY3&z& pȲ ZiiY}  ;CtW EeSvuk)# b[dqnOo x G 5?Y)RRy^;PeD#gt}~ L>ho]duT=)6TI#mJ 8i췰?TCA9^(VvҜ6.6tR:<6TSL<-_:\ Xy*E똳CB<}g,nk6Ѹ,RRQeHeś0f) vY@݄0a4sFei7 x;l[W~ifm0(;$U 8meC,Poo۷Oh݁,FAu̱2-Up@M1{ZNkCe^(7s@hD=+$HplZ}W` wg7؅vQ\ nf =-ҟ.SӴ$qpShMh񬬜$]%$'KI*5aG.ĀXk*|cX=V#ؑ~|^[JA4"Ysy>KWrF] vkMȿ ӛU]v!6e`y޼@z %S=L{5pO):*s_ oJJle,?n!L >YAVL,NLX,$6APqŜg+_:#>z6QY m[b397\_9OoRfSolԣXrD3ܔHKzU8f YO| AyYH- 8F=\W%|3}'9ߙޟoe{hA\z4LNC[Y\WOf֛c+-4Bul\(H&P!nj}{6ckcmqT\: va:)Ϡ,DCŤsG1F Kȑ g2U٩2"ҫ<:>|2\!Lj.DdX+F"NSS[orxG5tDT-e<$'x ` ը]ļi ș0N(##^,/pr]-f#*T=BL@XߐIK7 -}g sbxnAÖNgDG| JfBɅfV D(Կ.D+v_B? AbԦҲAWZE< ZƆ2g7{I&4lSgffvɾ߅3S8޺q0=m5 Vs!jn!sNyV$Fߧ+<޻Qg%*RMcaldMha_5ug\S,dUT) n$ `~ %FX~7:"~ J% B ŝ=$^8Kc";Vchu5ѨּdU%&Xd_$:_{Ɓ˖O[xm1ZZ&Z b@-iIM4O|TpkQ̋]_< =`y_w {HgxhY9qåx cơhd^2^9aBF=Ř}* ; 6jp]R8@XCy6qКNLa,gЗنV;?L8cפX6 ft k1=HݫwVHbQD5,p%5 y1̥u8 Td<ox6!JqkdM9}\J%'vS( #$~#-MiPt  spsh"z\!7WgdHf / ]~LN`RcNLwizXGJ-w T 0_XB ?n)/JxlHLt#<Pi<PԷM`u.nKiSY!ӉӼp{2 ^F>Pc: $d*q r@ YI/ 1QCΰ Ya \_  X`?]P[l!\4WK"WzGsw6;:f&C`"M|%/yDJ&: m dgnjb _*oq>̌DeP乛Z{M&0Р,t+'ʚ̥_SX}<Ţ#l;Un٘OII"kB#?GFfp}϶-UX EPbEɠ+:1R/F 4l?-Mf1?at_Gw؜ZzyEuhY hqݸVq@K`$ @/@A;]-:rE_u m:3{݇B2O@ ~\ *W誠`J&/!ms l]Gꈐ\mbs,89BZdawv3)Qmf.YѨ:_R`%|J}=Tj+ wO 3VuӰT7wMĠt73۩9Y[1}1zD@ wn͗7Qr:ûQM̶ e UƺH*]izAзPXۼIe\#䅕;;?pWˍN[R?Nrfz%pUn_o2 _bzdn@>u'P!A٧ߛ?y]=8p X-+8%xLD ߏEA)e*Ggf̈u(XGuԜ9dw7aηv]ouoҺz煼yЉ6njɷ r`%@Ϫ=,-Ė(Y놑|TiOV ?PI.7+oL?wΠ2xtya~>6F]ަd͍puZ(yXK@ݯ@- WEUVHf9&3H܉,ɸj}3<׮ 4Kwozݼݮ7\U K&?Hqv幂Tp21 ?Ɣ)$'rA" j2VFaVa*X"ăPmeC!iw+|F|<5f->z&5w^^2e::\3|ʧ5Ґls!1LHhDΑAnI-b=Ó?oytw4_lCs["Pay35Gz] أ70!֓`9k !ad]R2tBLM}I_%ۺNs 45;V{k3Pv#QAz\XC 6S$8yvd!`Ft˪9Y dݏhv*~<ቾĝgمDL )gAIq6paRݺf'2b /zAڽZDU1-KmW$~f^47d+uLa$"9hQCIJD[UPuTۏJ666Cb\ sXN=;}} k*'5s2R!ۜ t_ ZZtHkD/b 8.آ5QCT  g0!s(İ+D/Q9?^c# K pM23'0nĽ!M؏ !}݄Y|z Ϥ %'2<;K:CQiK)6bQ5oKˮF(YJ3MIB%h]ɷ߅s⤝빮GZ1-?X3<=- &$խ[T 'D-:q[g Wn8JDqEH5 9RaB`1p2HR/i*ο~Mޣ35}yv9Ý⥗t/Bux d &p{?}* !et0 @?=2. Y=غ;ޫՖ_ߟ?WO𾉟N&&e0%_}׬Kt0NtHv<%VNa]ub;PQ9>rn(UZϛS!>jpRA;ř|OT3D /a.|h+-xK2v 3d%ht7CxTh(9Gٳ#CҘ .=.GHR@kyHTX|O$SoKW>}M)|+ 5 !1dg}:Z 5m =,=e>͋N0 <#iK0VkxJN+hF?<|9s{>ā\oR3 K.kU+ lU;m,MۭX\Hy{.alv2QbZ@; 0yT:mw忕P!9?JkAiѣܧ[7 [~Z44 ι]͆Uާ^YgS&"uSօ͝@)^ub.>/s=Q1>|$OEm@a?*eFURqtDCʄ\CӲ2S;ZS5e^Th67PaR^'"4zbߙi]g`Iw*ߋd#$q%cw Bބ"S>Dj)/B˛H#::O;hS# ~gr}Vz9Qyo8ť ΚB,ݺAs/{C\%S4%,'*2{U33M&hh:Vр)hXx%`K%K&̛{h &qgs"3 9 >[zG“\'O8ŵ$ 퍜Xٵ-Uty;pjGab@kDw$" v{ 79|˰_^%Xizء[e;]jb9ȭFHؚ+(GPҌ&jB[9!KN36ei1m4lY>&>R3"9hhKgFh{gXOѠ[حdf̪.W'M[Ұ(!"bƄ ikQzN;XX4uxfG*l-r;A&k4X 9;i/EU6 (wB"jG(Y2*wA6TîV "c˕Ƕ:,\d^xœyӷH:ʧ ۱ʭ1QBwA<5$۾C ҚJV&O:4Ӥ̰00^cܶaBh/l;;k_9 ]BrchQ_-жfIcUt8 $N4m\y؀)j"?nv {[m9?1EH`$HFdzcyF{㶉nCh)p8JO4&{)O\G,2CPe5tP\+P)0,:!D9)*zDzgաop^cL_w"wQ:?c{5/=<9.(=V3L1L8aRT'_QO 2ѲvlY!(^++;\.I~h,K <`{O=;yVńߢkfm2Ohj1EǞӻ%!/á],=Ǭٍ!pXD3 ޾)饪QA;#o?`na~XdD3!eL`K/D"J@ 2(=%[& gX`(H*'-atTiTtQ/HM(092??ΟĎ@$<h|!3]|BZ1@dM,!9ֱ\2m6Jc&&E8-Zt=]u¿}+y,y1.8PWoǑȣ'z T1HgIw<t.!, (ce [1Vr"vXEH?L4l^8,]r)!Vy })Ul0E(xן/^TC)FEjeۜ16mR 5#NHQ3.zKl=R|jȠKNR&K{w2s ceTMHp%lB]86XQDظFL]֩kJgdشyrkaeՖ X@p6?oK|Y60uR/)`1o#/,u]YQl5DCY9M]!Y,zlҮ!לEOGn7&Y4r#/8z)SKa.$6H {%yQu]R8I?ֲͥk}ҍ:.njSnsꟾYrH걺ǁdeQVیA@iah LWw׆aT3bo;KT 8yk Ġz Xʼn{}>3Asy>NGr7I\S5b?fJ*2M)e5$۸Ϭ/h} -^gLbC1 Ȉ+k\G:+q7}{|O7=~wViNq|QhhӽIF'(Aj!B%#Ff(ɦ7WeTpZĢTqǣABrG%ּ_%A5>3,j 0($з_%& JRqMaMLhgsx⚲ɓt=/Čmit'F<`a!@AjX=J}EB.R:q7l>Ь¨ATHKVHja>Gd1#Ƒ6R A[ڶD<-PM|"%"mxr$hZco}7lS6Ie4ENHpGƒ|vDe7N6&eR_6p1[8pSr Gt"z+7rz~_&GjB;L4ZO>4xJMP?||UV mk$nj!qLB Y(4:ޝ^b-Yآ5FFgCTk{,{MV aPn$G ;c:Qx5%O|8SHlB^Gڌ IQIBk'dp9sQowW_o6ɆmAm56]LK^/B0f)T>udg22НF?l$[4K0-9\-uK嶶YϝƞIPs}io׾oy}0Jd}%P i 39,Ap1Kt17\Gh]*n| TTo˱, 5t:1^RWxH1#5#r$۲C< [M=T2Ҕ@RjnOЙ@Wu,wv7<3`U3L˸Ymv4h5d*7Br`:V6>r |gQl=JЙke(OZ pҜ@?DF#L=\8[t@t,uԅP|GN a-1݃A+y oh#_OG l:Oz6":ůќ$ZR/%#5C QfA}ʒMywhφOT.TW85F11kQ,X I'YB?D9J\إsy.ͺAtytS elRP~Gf Aw a[ր"t"b,^2K#I}(?}|=qutM6F8Q?]2 ZJ>UR 4["RqV.~C`[Am8}gmEؽO@mz @ վ>a$`uW9*ŀ|3uZp/ aDZC1}6#m{GPE `(t(|dAP|SڄDmP@<ꁊU=V7gK rTu؟:o a3@+F$q2ib^Z?w{AU5(2$=f UeiJP5$^hZ/$KYS2cK;%nR~=uG> >oLpy@MIG~Չ&Ef]mJVwhY&9wh;C+#R->{GנVߤj AMADzbm_.0߀~b!-.I(vsSz<4õj*V"hEHI|vힾ;AVEd=( Mhp3hC"\;dS5oKf֯یY;LRb>awLeLc 丂_M4jYάWzk/#wNjt]mNЫ&q?=Yv~)Z ܘ̝v[D6co )Y13l:^%HsHNZ M KlUŁ`0B >|#4d{ĩ Ή}½̓ ]8@jL<=n&^!4jd&G٦sőJqX1RIT|_C$;{T:!n8"袢Q6KxWVbe:H ؓ :| N|sfCjߣGMp!P!xn08zYKոaޞV`i ϐ`bUX \L'!@,*\TʞS}qkVʾaGnz16jE5ϳI**hӁPуa5bM8C +F&JJjaCX56(30}vib cY׻s[ܙqA܀/o2V5Tea=s 6Kg9ȈniJQG#>t!K9o,r Oc@kA\Y0yb6Y.YH֜,VwXӴw)+""_P,VUA<$xDs5Gtܘ -6M6E69ydfH`.\C %=@>)=߃'o3s3fHh X,p-ߡ\\`,׍6pUi]2fԻ+k+Rez<ܑ$ AIe(}X+)BP<4omn|&mOKq`Z4j iC_r Y-& Ua偰*cIE+yONRM%= |$i7TD+0Y gzw=w۹ʉho'o9*3y A((1HGf#hXqY1Q)h_.] ##@⨇o5;.D pƴLC*8iE2{pvq-/\CGKi:LԢ"OT-U"Ÿj҄TPLi q%yn]T Xnw}8r|.1ӢVJ^o# s% 5 SHhӔtM'񪓻%mlӯm2T 50$*ɬg9ڨ_OaD"r|Ds'm|md,16{SyebJ̐T&>6(AcنdPQ:`OxԂW%5bDhXjDoa-ދM~k#z,а++U#39V +4!mڊO8xa)kD$ʄr)"[32"Y#̊oE1/VbL@GyS=M<ﹶY<>|_MVmhI T/UZ;8ĐeĢ3JfPb(mv[%Ş}Ydyg6gS8B?!SBjdr=9fz$BaSj)hN$KSs/Zcn=$$gOYA xNà4=O'i96݅Ի>`L2U[9(<$gVbpִoJ0C lҠy A* or&$p3MD1n:g:ЙOjeeۮtsva &wSdH4"w %A䵊9R #JB XY~Ee Dœ2) :%rJç(Qw/542Ɓ4c F,`x eȕ\ej>8T:eZ40( PS!~G)d@S`q]'Ӈ {8N5Ͻ^@낂H97\BGGڊ*xnڗ1H-IAo_rB_kqGZE) 3_?"fE?sMgPDG{du~T`f\&rgA >y&$0\o[N/H_vj R8>?Eug:,wn 5؀0AX*.2=7TM%$PPa[4P},ƨ@Ǎ;{I0qD)ϵY*jO9PnOu-4D[Mx^n4inf02ՄTaF,3Wvh"Rj0(fgL^ X Hژ?pۿ?9?Sm? < JR`wT!,:nL2ʢ"Cv Iђ, &i7 ¡ZCG0Ŷ4P /sQ$z JGxkA|9[7v&N(pʁ!WH޳wFoĀ@R%^Dξry>I D2#_c[]3Aߣ:Ć2;xnϷ99?#cz aɈ>gz9ꧩo>1Js8.3[6I*cJY0 &MU|-w{'+޶ۛFmZe^ @VT;75!UF'Ѓ`]2*Ŋ$sq,pxf/4P0ZҪlR >?l27@?fQRX.@E8KCXխj@sLK̖^PW{؋}{3Σ}&|W'9'o|DVF?&L;b$9(oЪ!b|xKF4=vCy8>l"1u[뾀K6*sXpkd=H)dǵLENYie&Z~?Z M(R, bTl8d*=,pC3Vy5ߠ4Nh}ziqI ̫k''~*)/<'#TNLHYTm7(e[f[!l-ޕ5lx_I^jn38O9rIfwZ0DX2WW)W 3tBnm!8c&EH~I"+I[Qm4uCmWE^߅ޕ!x zdhchS:sD=0Ӊ酫elȠ=Tw!j[ۙqD&Br#hnӁ +`EX?LVbUCՂX4}JE6Ҩ%bj*0fSF;(`@PĩTo9TjK0(ӭw^)Ԛkeڭzc~Fe5.!ʚZ~,+zVL ,@$w]#"8ۘ#2m/%Ps;!S<".gGt |]"Iл,7lb], -Լu_Ê"pM+{N'J] A<*b< C|K`#ZWDwe/Myu5W[@L)ӑ_Ϊ/6"P^!7mB> )?Cf2mXjCcqn%EB{q_| O{Kkl*L)&i`Pr0KlsP#"sIpM0&{pXTܥ7 N԰ }uJ(Zh3C+ucJx<.1*yX*+#~֡evR `CgA@ZP4pEG)/pQٿJ[K4ԌFA)d4K .jRwFz'' W鸒}I:dIϯBEP O0yNzW:I<mۚad/f;HT'V5}ʀB*D!u$_]jo݆L)xrp(ncg5'zFz/I6eMb۟ԩЎv(nVLr yINr r0#a6) Cba 糚DRR| {i"% TcED 9p"c>/*,_wGidyi\^<߰߭]0K P8g kuua3/xPGCQT«?Qo7 -:!&}]$xd.+A>8[+II<?2a焤29( { ӡ7s0=CĒ6hLYP׽4f)"zP5R.8\'eнA(Q(c:DQ3ܭP@!_HA /tz6ΣUqKwY"U$#,.\|ZYmE6T h*6TxC ~%ių+ ZdZ]'+un,6n/䟔EU0MJ&,@˝ؾe,dِI9 ZIew,t1\)}c m$lz5$j&ɃԅD"腡S,^OE0Xѵ)T8hDt0#*0ħ ! U_LQԾ"kZJ(v%0IA &U&NǚɠKGR};ֈ)"=UpA}R^ X{W9\Af1sƗ8ܙ8Id;*Ԫ{h4Dp鮿B5B65!d #m#<@w|gŒ\%Xjσ־::"r .0OHMILyP'I~nDϸ`~}aCT &V3E`SSE"ax5};0c,\^gV3 t-DzX (}C)`(@\%qM F&LFcb ;3z0&pRj#t{YC&D{T 0"[ F|3C xI\BG~6P#_د%jq8 5 -D1PHlR1`0`P#9u ȓ لBAH@ 4 j c4+Q B I!I(Ri m$a7N &59b$8xi`C24ʇ(4  \Y1!У>ܠp,Qq!G9 (,`PϝьSp,40v"!Pۓ.# =Ma >yëe䐓Ƀ|* C9DE aD wjB8Q8e0= 98"`CĠuQ<b 0``S <8>( hLk!䈊e/*hh H!Zj!h`XȀ U50`'$Mę@#@<31! R*@C##55E!c*ҁ1y3dP!qDա)I}!HDQ03j$G(AcY)$c;@2¬ $V}@Y *h>dh@@=&-Іc32r4IAEcC $.Z~N@@O0n=1 V= |`T%:*1$AA&p2 ri < "xQ9Q00J|'N(+N0@gqٌɀ9q&04 :G1%CR((D@8n@L)"4!#Ɲ(A (( 4"CÀ@4 0R(1!'J 9 UE80('R0{F 0C2@X[bA@p4RyaRT) HI1}\,L*@f!G1A00A< 4022 D2D=O ?{)& steeworlds-0.6.2+dfsg/data/audio/vo_teefault_spawn-07.wv0000644000175000017500000005413612140200333022004 0ustar felixfelixwvpkVX**B WWWGHJVIe ,/wg~w;s'H |czW|=szГ>v2ƳIWa7i6-D- s$@ԦKh!gvۮ]L=k*1Ko?>,Z.B K1H<_ pH]>\&,x)KK4Oפ L5B|҉ oJZxp֔FAm?JEHu|QY=G.bЪcG6oNj0\ ՠz(@o4I sxZySuš>ꮼ3kB Y鯏/>f6S"o"f,^9m(>R_ ` \tU&F]eiw⢰w&èΉ~=l}u׿)2w 9ŮY?/v3Gɱ[#<-LJ!er9~o,gЈ:I0)p勐La01nsaٯ9]cmОa-Kd(*NTbvY※Z %1H;LesR'4yz R"wmW13]FL,Cj5EU+}Nd?4n?ЪAvXgPJ/2A!3XΗh&+]+:6wʣ`9 3w`U*XU6?a5+ j{3|3"Ϯ^/I<#`4t|\ty!_"V2wU$:Lm"e_|* d AXE"׍\ Bѳ0wnU<O~)|~ff>[))KOf9!L<ɋ vr<X]FL>/j=겑V8V?* b m]n,Z@ƚ@u_ieg^֟jD.zKi{LpށuH:01;PV}4)T;P*S.Z؈/` D(Z#6S?9=8`V?^#Sbr5녷N4Y 9bƁr+ -PIl?3N9oѐ-OFN̅ZG~)tI,9r+.TtiB89%.gZRTGM.+.k7+:kej4v4t2)QkĒ 8`󔫡^QsΏ/'Ǖ'G[?9&! '9M}t"Ypa`_54Gk~82a"1A7Ś(L'Ui67=yi҉*|*jOO.>D][ dThPu4/3R1+ -5I,FqL*x'r~Lw#dЮ'Sl@ݣ8ڭb~BH!'h?阒OmS΅@Ƹ\?$nFg)*Ȃ*5kax޺h>6M$"jr?(Dꁉ#IeTTQ_)"5ؗV?cg(5Fo֣,N˾lL_O~tup1+({2v@GXj 4sshOZzQn?P&ßt `,W>ESéOau+_7(jʾ$kPV}Xea3aq8s D9G tٵTQhǑ+f< [gڥyft fD7Blu(.6 U؅VU8 FGqUsNi~/e[r.OyOM7LFPgV)" d,u+F>f }hKbO$/Vq{SQ5*hGeԤ57?̖Eܠa? Gs7^_nf{LdLH6T:y ¾A?G[b_X+ u|Gm:faqG`R+C{ >\85 ̑~ˢ<TGO^ ~s6>1N3 YdI("ׇAoo"Xk,bR+y;˙8.ZIjڞ|mڅAxߐgw3H)N֚fZ}4XXJ R5k'q=3sD&<-f rPD1yk./pqXkOjL+pe813q|&CkwHJĦ^2^gpv> f?!@֙%׮!tQt3bd4f 庢uE\deWa֧hv{9C5'wh \zgM4,zEN[M;HIL昸Pi) so0۔bQ0Mo،LTf]_SǓӖH(*UwKvEۄPX*g+ ׅsx'}-$u" 3^ )֐it3z 8l@C&>Q#0-& ҆(ƨ[-"a)Yݫ((Vu]Ț]rZF}x#C17>=:P17iKUZL)2X~|}ψXg6,4BOf‚&^ INN**cD v;U^RK`m@l;eZi*ˍ'cXK5(Tn0) )KC[{f<x3iw+vRmVB,Kp5)\=i//󰘈Ue-3tT"!xBλ H_Utf0`y< TBě: f4#΍ :jAVk{=y 1 uKbTN &͔a[ho|utX~n2)2:=j]"$\XBknY^FGhp"޲)U?.KW#e-_$W$ɇ?<[)щef|y0 8 Y/4Z,S3| xɘg0Yh1˞1]Y p;Y )_M! ¤Mp0酔~FƗP 7ǥuxl>NdQ7H,oDrTL1.K@QD nyF2 CV+@'oa:?P?Sɬ2,?/,yWIKo5bRFtO"e\-TGmo6y]65 rd_͓i0o/1?'ԧƗ:S_ =LÃd_b-9<|`M W/.mZWK־;~<Ǣ b ,镅+rð?w&T}vneϭcwNX@bUV 4_5#߅ո9 p3mּS+7qA?z~js.o~ xlduxM9Oj`e)&rN Wk\sg uk^38^%]x]Cݺt D/ '[78K =к'xϖNykfqD_YVMG(.{F:-Zrp㰗KmDDs^*>@kU?"ҳoVNwm?PxfbQGKT&Z.00Ϋ1Z6bnٞSD\M&ypqՉ߰G-[pIZ9.sһIŮ Z ={dE!h։62ΚJze+KӢgdDU-Hd3$E3x&BmKHBU U 0'ӗwW°E{womoNHʮ"6E1$,Gxf#3L?JGӗ壹}/ `TG勵79b6[xDeо>:py;R;{0 "6D*/R%S-Z32b!'Ǿ6x']M)~C_ޓ/Ʒ8,@F&\߫u 7PM>HaS!ko|)qE40SK<9g_MJ6!-kMR|Wc,F9=x_lDr;OBe[Þ%ۓ_7)nöۖI˞`Ygt/`I,w/OE7.m|hu?ŘsVhImt/}QiJhRcأv)dT hVrD ې밚 7QD6<78iuL[WKWksyᨏ 4&+dNYNZ,`)&35֋RV\*@>SaT;]򸖼WrgTW–ɾ`^[pT(zu0sZΰ7ʐKݓ9\z ]?eC2+TX 5T#gfiC _ĢkܯJbcU-Z)* 0|l?ATJRXy0R2h +@?*fg i,}?C5C$$wym`U:{c]ԍ+%Ԁb41g9jr ^ɯԳ?5=b2W|m u5z^)L7t&x%L=~5ܻ Tp[ Z ga%p\ 6C0BJ H]-Z/A 5XdGJZ Kż1x$4@ƘW(Ъ[98qg'X[acA=Qn5=쐀QZԆvWw6& &:]"½8>'tzc);&5OaIV(*e$CcYC{@D(۴M,/m2Fqч(@1ٔ"L*Hu4 7#_׉ :D+)?=ǚ B9؊ %/GP, ϶5?ՌAbJ!:(^ӛa? iKЖh|B^o3Dŋ%lD`L+ux-Eƚ ;J!{.S C+OCڴ!fs} U5~k䠹x*?hc aE>>fNL1wi(=JmKd"N>Фj'm MeqֆdL$EVVАцpҟ'P2gR=ZgzPOfmUp4xib Vt+dMxer TLc@zyhQnidX$?|b3*рxQRNÀRE'5rPrQk @<T+h0"3Quxq\@@8D TbQ'RD?r$=hH`q@pOB` )Zhu/Ï%bxc2Hɭ<O1GF!x@`=?*€C>G d1TPўJKd~Uk=?m{K/GGwn`-uR6KQ({ǢWzgh`tM6\z ~ZW&0'dT!i[o24jHܠ_9v5UC+"9 m|* OʅUN~/M-Wv(q9WW,="qwk"#6⋬,* *Q鰱"eb|.j){$c!qaiayrrIi5e;\2d7e75w[-vMDo.Lڳ rWp[`yZܴ+},YNkr[}؁~M$qy ai9!ٰ@p+h {+&Q^B/OK(znRlysBKaX|4+WYk3څysӑEK*L-RviPv e+sp'GTe'D )^yuQHfbq{9Fk'.͢n >߷%Q{$%AKQ$0<2R"YMTd8w!}~}O~g#/o,`yd K}~٠8QƚoggGɓsHެ0Mw ءޓ2SԖJ^(Q;j/pMwvE/zO:1 /oB-S $dP9+UNP}{|,)E_0Ǝr{@UTu#?ԧJO!zR(VM;Alފ vn"T(b~Ab' ԣq?vaF5=@T^sfSuT;`+6:Ŏ!rV E6h4 =Л[QkG1 C3?sOK=kq)8 :1fp4YojE[ .wEMtOK]qzݝiT[7qR뼕 vyp;**8B* ލ]b.I-Aqm;qָH\ "Nt2ՒX?'!_ ԯg1)HHl13VJV5j_}!߷c}"oMz"ӹC[N >l~Qg&eafƣ[ڝ8ІzUSmڏ'znwJWExOmZ+]RϏZl[ݡ>." ׶|O2 G7OQ*>K*<;nZӼUn}W{23KC2V+bUc&!)D_"dT`qM$+aR$\ֆP^B=>#*[Ve9pp1 lp^& .k xzeBrtø^wܯՎ ,swŐ%VkNA|JWB"@ol73=5|Wwz3(j3JУ@^V4wzӼLNQr$P!`羳pku)2Bs*pM"!w;s Y'fNL̹hMr"$9b"D$բ&/լU:C՞\@$Rlq:8Lx=yU M/лo9E4AE$/eiE KvH(HX23]mH5p'8fxW$ R_GF6<]Ҙ- ܯeW4)'D08e4@r[(0#weVM\bQ OlF0dgB \Y7 F{HZ+XsX No.fAT!;35 ,E8ڍ9NJyX' !DYVzE`HjṬȖ@O(q$ E!&$O!`&A'(T!tz@9ahPd"( CrI!O{PM`Bl,À$  7@Cd ϧL M Q&:` E@Ll0 @ 08lb dh(I@I E$ Pk #h8Ҩ' A948Pk@18 ! 4s3d 5g% !8>R'TPpRS P EEj*@T(D3e`ށ d*$8` D/ DrR+jp q0P%c(2( PE0@"(hl֦ZJE*H$1 PSJpI@ Lٙ; 1{$3-&"3u}ْÂnk~K$)н_goXr5Cةim6v<#Q|nW@߹S;DXLi6,Ho*:;w9wGcagV!qߊ,D gMzkӿ 7{ѯ,YQQݡKMw3Inf[t.︑h3%h?j,4"yyjY /.W"$={}>7]MFC=fIH8 Yf!==!Lw|m{TE E41< ,TP'aH+4lG-oz3U(N:Kq䙱 DpS$sUn`U`/qS)1ɸk􃸉سk Tyl71X\aٖy0^+@~F8re0ʚ"?Ձqcķ /7J^M B.'MZy9`"[Rg" K. 0PBo=&ԢT30f1aP\N(ZXsoiDcµC39^0>CQR} D30Vid|:4/Z>=Qe?;<&QNpf\۹c*}Tn|E0h Bߟş~?vM]Na OI-@MnRK![w.nBzUƟ&ӳV;o>'" ںQY^f~&Jd?*|@0L[ vE"!JLF50JzvwR0-N,Kcpr,KcIIbmA4zAH`pn1 d#jl'$O\T2䓤zH>3V.\Ocq:JYBQy<{ra"zIa9!݁'l(Ψђ52dfDvvQ&™X}8H*{ Wa,7 ~64^s1o.)V~DSt$ >&; jl{0º:e>-t7iPI_O;"bӸ{5=k y<3)M'$"y&2ͰrŅ>Xh~VyŷS$%k_7o"=tu?x4 2Uȵ\" UX9IYDN9s:1;"26myENŚ&0KVia} )9v䪫>6$(ay<9F\AQRn^Ak 6s"ksHNBVJOѾ8hW|8 4#߫acu Ж% zGhine({0SW?.rqĄ̋HX8ތ8HMό*iKG.+{̰ Մhb:D@\MՊX2La& %:!$8PQa1K1; COrQ?Œ+VLxT3Dh*CP0U+5: Ka(lP 'b ]^"Gѥ8 1A pY7PzT,.֮AX]awfo0FNbS4[ ̰eJ'ԍV(.z%)K¦Fem ? E,AɂX#9c/:;d(: *hF!AC<$ i <81p@VA:Gm`0pF z(' &J%i rրfq8! ƲAz)hR:D _F@04SIҊo3*L0>Se)4( (s90p0P8tyv1h ` xAgH/2R8(F\Lǀ@sWn8^ T` 1^ x)ff&bj`488'pM:wbsBM3(0:f4/3p :x` ݺ+jBc<T&d Tb#x4PCE L1 Bt1qH&)d it#PRJ*PI};! CR(q/O |GZ! ~}L^`مO_Qެ.т O[tD -IM:UgBZB0+O*` 5ft elo8c?Kz?HB#xĘ<Fa'.Y/8?ю$?AԞ]9ËI~|2U)k.KQ4P2i W >|{~j 3 WND:mf `WE29G0BY@$> %uo2`E2 <-wUZn=HhY` (JlW?k*ܽ48ŴHWK:1[RA&v>2D܀ kNr7ڣ,D; A8W4>xO 5]Do.҆L'˨ )l1őyظfyWڲU;RxBw-\]u2":RVR/7@b㒟X{&,Ɂ_2-0\lȷMw>lm4pQߍ.qs+- jː7ZTjB^=D }zg,Hn6i]IYM ma$rffLKPw:8""B- ;61^8H9T%ԉKAzExN18GP 5 J]C.A%y5#]:QnԵFR?"jD,nIq>Ʃ7#2rݚgl209Ӕ CU0F}Pi8\JگɀeMOV ,0Z| -yK2XyI$%vh6 "_3Z`;5.C/?";[:;Zb4RvfD, 7f!mбbEͷkO#Mǝ&I%/}Y@{_OFlZIDl,]h4}FK߶r; 4lϩa91৔#IVѮ^a~n RFs@-hR,XP$0lŦy]c}䴬%2goќeA f%= &[3vF=6R>gCŊdZ#bh ҀΰCs䓦`5Ё* xP"ԜH ʂM@pzL`J(PdРef0,,$'x8((h`1`~:PxD$( Πxi8:ѐbO: QTQA8@i  9< )Q M$>G34!(f0p`(h98R@eA 0#xP`0:P@ᓁ.=xEhHE@[ $c@ˀ(x-@ \ϡ[vxA#Sd`؁gQ(x+3΁G1 ܚ}2Po@ 8 4Ln@|  ~X |65<``4{`>@r 6x΁A_Wa`hf== jQoS`W:D>HsNL|0qq0>E@( IHM2@@u j\i9D?Q W߯Ȣm6o.d]5 UQ,-ۇ( r7]i AF"yv?Tr3d ٝərvk GG!! f$2&ezZ~מcIQ'nKyrI+I{HH|Evɣ anqJw1|IY2'9[2Th"jU]'kBřSۀVXD\tad!D-r[#Da*@ŰI$8mu( u& !TJ_l5 }wip-@[9eHl v0_jU_U@!y[&ObhmiZxGcWu"ڔ>Xu# ͝LsR0MrJљvw28ӋlHK OhIWiXx8mQ4uBiVYTfHqɑ ;Y/;V +0CLHPG-o%3i;a:*15JS$#IdLaZ$K^]TOR(+{e G;_'\"2Qv@._H $,-7R+dǜ*j6: .,h$cل $hݗV+Y֝]Sl r`. SCs;3G#LKm RؔnjH{"n]v=o 2`ƥ!Zj\p5q_NVb&|FB;nGWh"*o~ vcrsv%9d̍%)iHv%84 @gl==A`t pfvQc` HHS I`M@Z A`zRD@%AQh'v4@ `u_ L18zA@ (vxd(p/  E,L&^FF~Y >o \z"x'9 jҧ T+,Rce(ba!?uEuÇ'@##![!vk4Ic_FXp6bG~t >)tR}y¸XkH8oPyo> l>8u-tv)0lmLo V/sgƟo*4jC j"P_O|h/[u@dpDNA쀒yr`N1|3i;B"G|3.SHK ˁ%amZt&Ե`ib%dxjD$`AvAҕxwk8c?x0>zxMɁT4@T)Jh.=DYI3Rtiwa"jƹ•D2nv;b۵Kf&3$D$/l; ´@0$ΌN%Nm ҥv4TvlyGPpf)8ps3$pqe`Ўu_"G&H J(q]!yJ+hA=jB 0AE}x G>0Y`8 tsPA,fgqD.9$q@a@ 2"8ʍGQzJD`С uP &F0:'!h@vL z?)C@!zu`:a鐊T"Qiz8:4NP=}53;0=DyOw^:Sf١sC|30:[C @DCWݡ{=/E@?d@ 4g l?Xg? 4U^ v35<~khM ځp0 ng Oh@@(02~]s@4pO2b 2"K_ڀ Ev wPvÁ>90:VϞ'Sx" 72 nG@Ox<2:;X5xUEk`>ځC[O:6ˏcp9/9ea1to1ۀIH ` UD| Q`N p !C'z33 $FPkP#!2N@ = 4`ph)xB;ơ @xZj` q:1043qh*B@ @! 1PpMR93B{RSM RLSBBP`@G@PMh(g9@p`͑<L:PG/ V%=$ 4i[`N#(MYA1fbp($v08E(4 TB`hQ1<0GQ0ʡ1 ß褦W 0J6A@F `@ w ` 4s% P@qZ `e!%<As60$fpxb`<teeworlds-0.6.2+dfsg/data/audio/wp_flump_explo-01.wv0000644000175000017500000011335412140200333021307 0ustar felixfelixwvpkRWWWGHJVIeTK߿z=[wWK{-?|qqׅ+W.˜k@744VC@X'@jȨߌ] =Fdzؿ*$pCq"/y= X[T>_ZGoYHkk =;n|f]g(>A􉱰培2?x?He&Yk8{Rkwp@_?\:Kڻ/^?NS9I+|;k35`.hmyT` }ń]H0]ҷBqaOkU".^``Mjl*pڐU#0JfpXi94닊!M(w ܷl|cǿ-?gasߢgG ^ &=<'ijT?/ޗyS,aII-ݿN*N-ChF%kծZvH_N}{ބn`]m>=q=Y`iA3읳,b] w '6{' ]Dǡ1KPHQ|31"z1dQހ{𒤶+Tb) \|Gn"68ڗJ _OQRli!n 6]?1|kBB͂@3`+OC@y+]onWk-R175HэH}JuQhȈ :#EQۙ]ܯ`kNzMgZPxϘQn\36 DXt Eײ<ඒy0 Y,#Nae5-ӮT=k$c<0#Ը<0 b1ԐH Zu t صxƭU óV.5>gPr62($_bA`|#DaX *ST]f89p.T@頉!*%H5 L0;ME1<߲ #0~>lw;3-/# Vȅ; :kz:naT= M(A\ɔPqD } (IzRtX&(8ُgfU1k:׊nKg h2ƶW?ȵ'fA4p.6s}PBk.aEb;P؍?, 5$組Ґ&MnRl^iFѥT(`oQ#n3ɡ]TUu`~\|'K/Gˣy)PJKg`ԝ~xRSjcuv}P c[-Um@3!ãW-8Ghc˸*|r"|Pz8MifjSqHMrY_2]m#BRk%؎1&_W~U7mx6*e(:ѱ,2e_8]˗JYkLUPzq]+RR+#knVvyJ43_H=ȟ7=U լY";sZd~H7H"!+H WcHt [oEp{ ~wYGׄ]25Â˴ǃ-6E uKsg֫eOƚSvŠ@"abbo !j)aF>r*٥|oez@eEf}9e=" Ct.ӈR[;%#K (>zŧpXY"_!(rJIa9QQVjaegO}Q"BW9Q!E<= 49-4dHu@MX #[4ue  fRLj ]Ed5ۺ`ن6iBklA]&!Cc;IEG s`a2n1_(6DƂ|<?]2Y'^X}ny.fo ?##Q8uH]&LD7}窞6e"B캐$7Kad ᶱhjLe̷p6"}xJ9BO{n%H=)Rd4J }@,,B&{aPW[/xrjʍIX^ˬ*@Jg44-;AJ aϑZnH(n@K 2 wK}+9R~9=\"ZN`ru˿wQ ﰕ "Vd*cTS{h ebjv]=YPxe)PH85r7P`b0lZ-wQ2oIX|y&7)mʹs[g5L [X-/ +U1LIJ0`l-A!pC~E7V? U^@ժ}/+BhfY{sf nxRd7 G[H=CNpP>O#撟̦5>U'&hPT̜o:o"ޤKbZ:<֣p~N0:{?[u4\KD0Djt=(g@hJgX6!ז%HTe 35F\`f+AzγCXKÇ*Wlr/>4g+'<5dõI "Ѵã Y%F!D%- ^ ~ޫA;eOpk Vs}oqQ|lv6`9 Ɂ͇TE)n B-έBu1pnc1`,.Õ%Ğ6i"|D_ C5gIEVةшf‹g0[Y < 1*Y0'W\$˨?y~/ ׶MR~\'gdiejG:BCGSLzȦ8S^d|*): Et@ iͨm*fQ1 nW!q ˝QU)$jC;yAӯr D`7- ْpvq< o&+$!`Ԑue"[a `JqYILT NѨ&hg1rT`[ ۀ|tlG^dt]<}(r` r NlR{V4^9%)mMƖ}&W&!R"AوupiBH/'MDKhA 2H ~dv"WH ؅PLGYwD|>{ #@^S1 O7=<ޏ=.5Ee&\tU40 =dNS;+6jΰ_&K ' r=Q)LvuЌ/WP%#W"3zR Sl0j_ Ŕf[9WV+!Rh?MEkS~6ϔ=لeO'ASe$nA=l,maY7ihAHEG3M' hYM&d בoxNae]yAompa.7X2p )yLN?JDeil\O)j0%L;6ii8/EH>7 _wwq5`Rtwd ͧa!u:;{Igs rNt.Q䦔F KsPyڪ:c<>"妕kF?l}#9K;mm5[ݥVر[T(&͖i:*hhά_#2ٗ89nS:g`/c f3sע P Ep_okdž.^w^tp)S/KҺ<aXꩣa G@l[3y$}uw:{n"0f5~`V cn_&K)~8$/}-"0[qlM-d*o̒2VA3E^hך7דJݙ0B9#A"|x0;%fdoZix>Id6#ko 0>iqhdE°ϵdL4A=),T8 G!ڤ 7{2b2KM{Wv㊗oa. fxLxS$@S~B&LV`js ŝ2hh:j-n9~衼+ xgP+NGG;+ AUAga^4bHtru} hl}a)Gect݄0>hd(f;ש|:^{TD~VjXVˏ3 {ֽ}'72yejeylQ]APWf4_,ʐЩ"'M˒ l0#pUVJTTSTq*E}>Zb e5+ h]]:ǏeƉQAa̒RҡhVYMk:mw%w 5.GVW2>'FL{-t6 o\cC7oևAM,f>;K1@P(Iw x1`ь k%C#u& f{~_ sxg3]jM '[݄aތ:kD)?cM3=RQ0V79RY@C: pFUdבŪ$ ,X ݦG9P?hЕy&R`M\ڷ+ y^. b (,B?Fp)c %cFnM<6dxhrVϦw)]7 =,Oqj]'Oo_8[DmilG_?䎣A\hєp>b,mp+-GQq"kٜGGж}hhATc0˲hLBw'Λ'}ts Ժs*MzIMTA!V?~:[6N].ʏםw=JςuZ ./4NŐ S ڶE lFoG'|N*URћS[bYl 0͚@-b0DGr2RFX.%S e<}&^""tDzn<Μ9/63FeI1sk^5Y̆  NQ)Zktoa*QB ן8to/dYdZ,G*%7Sj)V:Ѵ_tk wGՔCyGnU,@)%S5DZF @ ?qHr#/?KYbn:uS*o)N,^+]#l|j#lEs&+e 5`!^q?9ۨOڊ ,!P$W7X%YrسD1dl׆ۏy.uhݽ&v<",r2V\C3'4bV*xkmlw־lX&E@τ{xOk+,gVʖ,I,tpԋ2SbnNj`-$ h݂{z"W͸}6j-Jps} ٨ <8л: Xt4 ,RQz86:Pi%'Pk3rrH `y ^͠z7'zb5qF4M$ӕ>%_ `Ym7q#t>> -~QtV'` PGibna3;>㉮jlЧ~qVUJH$zY ^u_R1F/HL`}4Šc)$V s|tL=耗>RAoY8#Od$,cѫqŒuRV|(ոSy?$sr5$^xgsK2 W-olguiK&ÁX-t0j t)0a&$p & MLD0ej4ޅO%kKA#R٠h)͆`vpFֺ~hޒ0As߉rdK*\sZ:Zѷji\PdM #z!>ļM-#*p1,d\J{#Bh;~т1T!_T_MrwʆҾ>/ wT@7ET0ّ 2U{d?ԯcUp|[& ~ˈ>.%\:cUcI" iІw#Vr(w."tBJ-;`r|SZҗ(N&>5 te8f6*T^*fCױ>ò#p ?twZJӲ$bsQxVD .Tsʠlʸ_X*^8/=T#وn?t:VJ>oj-.Y? &6Z~U F|U*5CY#dq:1eUױt;6X067wL;fG9rp vz0 bfl:/zzKr15(Cjx5,͐6 }Z˪Ü-~z2$׸/ȗOـYGj'f?iOw3OHwcต~bK2yQf|ёv-#Њ+H:` M>~oN:+uM_jh6#PG_u"xL1ǀ7C%eG f دCȎB`eiР~&̴n ,Iң"!Xʓ?:MЩNM:.'TfBTe'(a'LKQ7Es\3eod~E.rs)Wb5 [ 'kR+|8g3_HǪio'#n\GIGٷGM[/Pf }X.j(0#mh|8N<X:DӬ #pљ@[Xg1 Sg.i(}Pi`:g>OCamE%WlEs4QO>ԳxvrS gZU` KE 5 z'M2D ` I>1C邼koXVJiN q1`:*l]9vW,'s^P4})f$k๯3r#&0XKF\OZuT^= .כnjJ~8[SY'O6?amu|.i7l \ΖȱH**_ 5*ދTE~*ao ,־?/oԈj<G5)/ff'W{=?>H\<mQbS GAO@.P&V|U.߅^K-?n|I5Pk3G tPX=@j9c+#,++M^liWH.P/ bp¬֤ ]z'D2ܴZҤ@qO[߿@nSuЌH*03kJ H$QZp q@Rʵ2*^=b]=|jg=)`ц",ᚅH tx1u/"S՟GCkf59[Uz'x~:hCAcaF:Dx ghYm"&w>^(iLaijw.d5[de)È{&BJ F+/7080&|g#2 <᪼"qxF`"-SŴK]8&Vghxԧλa6},Q&j0&RNL $auG.֣q[ H6.QJ/tG[oıY[8J)䷏iw੒$֑\}b%F'qF2i`.2:K 5D!ՉMXu}ע"Lz~QkkIKam9V2$D!Y%诉\Tq4z<:Uwg=au#-/wOR#-^ÒtV 04.e Zy:= (c2t1v- 7F& (:z&j~f)[ $d cqh;WKŊ sF6=_86_ .U$j0^> 8;`ke6Nk{SwƖ(ui8$KR:QΦU2mb(GA|RZ$`3ͪH L (mĢAA&a0dBb"&)zz%\6{? dK.g18x5~e_͍66)C+v0)7wş;iYʏqVĕrEt"y[-v*Ldʚa맂ylmN?%]-s}y$J:f$jfN n˼9H}J),LۙaS9,TFKܥ? i,CjE|f`.e61u|sf`=]?ٿ1tLפهE120]JRneȨlަHxꡩ['Ҕ C%FH#tWl 4s8"N eW4|`kT}JNn/*r[~$m>)pQUik?TkMv*{IGvflCˇ %UsrktV1BLM42| m7⧫Qlzx1兓LOIx䌛=+@h+YFinvkmWlG(z۟&7I@G@BwXn&+=!ǢkcP.? aMa`~?IH Z1\UV'ϔ $ -e~Jikp& +c'H;ęՁpd3Vz P%-^ۛU gV[M}/ gVj8=*_iKTE(uA/Ծ!0v#r䙘P֒dâPb2hdJLPӎ96.Cf'~Bjh[$PL2vNd?9 a<'@2gQU?Y>`\G)w A^˖,lkNdB3|N !Nk|% Ő\<_ q@r pq6T'mm(̰(DytÑ[<$R WOMe}̸Y3M:]`\8/ fqc۸=>OC͙n{8YSV M)ouș _(R&K95/cjd;\p  KJ' YȳJBϯ!`cRló4K}iuah6JGV `=Y{J}؄ (.$1gJV銑py}~s?md@/\뽆aY=u Xk}# ٨?^3#}ѵSٖrN~ ~u2n]1EHEЛ=1[iHIBIwg> tY:;tae" v|2 hʈ;k쬴(:)|P;!g#ySunFM؂gIۢj4هZi[׊e^gv`EzGiv;jjw[{oU^SHHjElEd'JRKN^quzha?Jt#͆8eшÁKƫ=#73*z+9+L[n1dU C?- KZt*ʛrۆ&.k.ayT_PUqB`>h ]VfDhq=2J<0vc}~+ʕMG[ bflu+Bi%LqIMxzql7uf/twwz+3xRc@{(T]{SL.G9WL>Gr\__L 7KG>;WH9޷9E1 m[qSu5 {mG%}ե%!½>ˡKdnS[=> ;oFVsQ.Dhʔؠۭ[Yw8 ~HK}`H̑}ꑅ뗥T<6'h|qL6[ver[˹㪓`7tK5N8Jc޲=` b/=Nhib\k8' {wyg LDV"Ҧ2+co/j*z(=Y}teFAdE ]EVMFfMlTL#"Xop=ّ9٠\+ d'=o K;PTqnʤ#q&=RB[R2 X<6Qv-zUV ӎndF\91/].lLFiX|T: "XEqE=Sƫ2K$Ac:#{+}_~i@-b}h ~_ 8WjJqCP]/B= #=O N=yva#f+KXzUnˠs ~C0?z8kGqQt(I<.ʰQ2\;i Fnh7Y_Pf޸"?,2P '"[.FxI>NnGJ QH1ypfgdg+$ $m'}IJ&= nW8d7r)JϪ%H$inMNjrTyy%#O<~eB:SWʱ5'cM>xisvwP"6ZN uVdqƧ2=jV>De`4 42A ??Lsf=gထ5q6VG@ |'!c_+Ľt&D'|cj "c*shJϝV褂(aCv&[-2k0-)^#e}lfjV 䘊6BA"-Lr,x*;֠{r;ߓI٩/Zn=BjD P%S~.ztJIrQ{Yv/="D~.6.o&!><(,19x$N[Ϫ+[q c{ Qܡu7U)*z2QƯ&2> %,bSUGK'7r\KiPp+`|7q׵/\BIl9?Qc!*VDqHTWz [22d 26xք .ZuY˻i g-phe#2ZwqlxPV0@K#'KT㘰ͅN8Xbne]v-ҘhlKbYƏ tE yןxh׻9Q3<6冷aq(G' *(6UsZȍ[C=*VAslΓYZzlh B+͒~ .l;`M[|߈{$nӉy>*R)**rlPpG9[b?8n/W2dKTr$_OKx0r5SPl*C !Ҏ 鲫!n*I+QҍVR~F&$M =NH:7kD +0`q$> [瀱a i\u6فm4»A4ۮu܆&,Yut[MLY:]^Kơ{g,b>ゐ!)"fU@x6L=YRn|Uo񭌘5<94 KOْ7D% -߽k LD~9l^ab !' =zs>bb`+͕a3-m @6 .[PBc˜91Mkp74@ڨ4PaQ6R\Mn*B~.?Eى)2IFŗ/߽)!Qѣj;0Krj&tJnҘ؄nIi Ӎ,(b^3l(LzќMXJNG_?Hs1µ,"MI&ŹcKة,e`I$Fk&kg%lf<ZGij|KNZLT QU X9lu1'+l.oi|qR pxl1[PT8 ζKmeOZAfG#@a}PIqx~U dY&WM+E9̖(mܦٌ7-8hڗU( ǘ RKl(Hÿra翋d1JJJ$4#k^OA*S6Rc×x3 | W2d{GnyzdzBD~|?U~7p~}ޣЖMP/^+] փ ? Ԋ4or, M fJkk]Ht'; TI̩!QJt_/ %M烜ǾfT]!܆a]%WtS;/22+f! q휞~)Wv}G#tm|b^KzT Ƣp ־y08r}l22k@k̙^#HS9L [/0p(x@@Fa 4;#|\IJJbpp8;XKVD. 8cxdRnfj$C.؝i|#k>U-}MuwaI`,u%ݬQ@zN"#;rNfZ yj*&U@aPRLBqSrGqͤRW'1!hƳ<6!4.q.uag}tX?K>!8@I&1B8pR@ͷ& ?TS L&oھR4z6UlIQqjF=J6i'cM7if },:̯tUVUa}Bd6d6:㕟Z5?gy5V| ӅCP_ڟxl0UEQL ';Ta@-RF7_v Í[2cWY*we m۩Bi=V竍fI. 79_2nT`oȾ '=y(~vҵ YsyHpujF$۲R2aTjĹOן3 0Ffv4=*ׁP th6]+)(A)\Ak( -qؗEӁ͕' 5.u^?O8a! s#:} ~1Қ/1H/37~fRi$bf[E˗U @ Qx'jǕ?13exTZP> Zu 10V-L*Q[IX 3/1$ u{e))daDt^?1X~&+'z ,FiPt5KDg2ȫ) '0nlּ`/(6"*'7؞duB6bQܱZzdaDZP\I32x%g|QU}ۆFM<$a"eciZ@jסYDj-q9sS@.?:&py{zR̡M`VLWDˠAmh~@Lh*ۙJ?hG&7vG;7"vDyV, >qSw]5e#h;S.]xPvjֺm qZZBy?svvdǸUӰyLI3{ AbNN7 KI߮ ma&u91UJ k+O2{ pbGTX d[҈O[r:…a`eof!iQg[ߗo.З=Г7`Da̠>p+;uDp2VF%GPP|4|˻lDC r\SLlILbvmk\ 9Ԣ-FP?8I]2]5)4W١!sp9cdaQ|ulF.N|HG#h~p R}>A|k0DNdѽ tY(ACYaN9D܀Y ?]-솤A ?=9a`%v>#Jh"/[N#2vدhXab$-XThǷB\5@*`EQu9~(w60G Bzߐ0YrN_><ˀ'TN+KJlܮD]}QHgg@t aW8~B DakbK%;BxR\Pݪ.uy% 8M)O/ 9DSKp[ƼPQŁ.8yHW;etٮNgQ^nV3{dwEWoC@;ҳ_y?oFyR/= 8 GnqoOA :/xCO}g<ᩳ=LD[P rpsoyۊt3Lkxu3w s$hqQg}C;B\3bۛj7 ,F_ E-+5!QyQU'9hbhGvA|wR</!svz*1ՖB#f)|)I> xG_ dW^tIϦ׻0Az{QDy0wc:Iy1;|TG .0&^59lSmc([BDP|ub}bNMl""Z<ߡ!{;Z:I:*i|NGX )[|Eq$S-R18 g:!3S4Wϲ{=Wȱ87( 5 q\T4^*f{ÍcT:{msEPܷD C2Eo}{,vcbZi߷\MUMq(4h(gverz059I"tZl9 Gǔi3iIeE`] $D@Y cU,݁q*a Gi?5_Rs{\ cu (a΢`aJ{O< NRM#c1@kl4i]+EkwhIS%ҙZ/L&(4X,2o kR2>{(~xIeK ?N!tŒb'=7jE25s6'8KZ϶"d5F<#vwH(S`B`z/P&|)/&ߕ3?2<(`by.TËN ?946 /#ˋ%7qV-0O-݆7LT Qa=<-Tg:*tdUyA+D.,BJ3SZ; VyMJ|^}&o<*`o&P8_XU70D@q^7/%L|JtgOsb!KrQϫJppGgIUX_)Ќ #z:D2_^gsP=k,vS+'?S4Ơ**e+{V$^u~ZGz1ͧC7S=0sƎL^rY䆆= S:C>l6V+^f带&R.3rfd 2Ee):l+80 Y)6b5G@q,C12 w{ 7*A~~8.H6iXLPP엨wql'E|M.]wv~P^ Jh:ԫ2Vt%p1|ÇTzu`I9NC٭FdnS g<&W|naD{+ǿ@/M4Xg}z9t&ҍFInS_6nM뚢]9C\Q#VroA8 rz*9XLT(6.K0Fd'KCzNdo P@?H>憐j 92oʥ]5MXOw$p!wp,U`=.=Cm2#yX,QEd΁a8DQ@gr-,'ѱ=Ƣܼ9'ȾvY@FQl $5(Ip_B4_x87ّA;85X7)Tbzo/w9kK?yI!W72N,e #ʥ2$;8欎)-mG\T{7f}IAp}~EٺtZ@X  mوqFAuG5Aߥl7LWk&BT:;V({ LM_b, VDž]FjF+˟i 7?rM/,(Qzz,*?λ'P庴 @jJZq<0̠%{qǃ v_l2<rShb5Iqv3 XJzHGU_ L3v,oT>.³H)Z$1>K2J CpFH*)ۼS\5wO3qy4dl WN!Nqoܕz^~DNA0:jIieB:3 sLjV/6vA739~CM>I(%H%K;ҮGEXΏ3w[]qGޣm-{P֋vB[^R!gdOIס>Nt%?\cxK8XPl-+CaiYFɫ+ A"8IŸAuY9qh{Z:޴=ԡ<22NBש76~<à%p" xD Z@,N<+ࣚkvE]:`IY5?Shߪ-HBpDO~=r%=1aEuY:bڤW8 rV>d^ЁbV<|By@mmīy.o*54y*`CS|'>bE%UDYz#dvs?\L]1`ö~R@wPّ9 4%FHp {.ۃoAiGxT,亏IlX гSzӧR<؋C(ʥQFķo|{"GUwqKCKQm*wݿpJZ [t u]lPÖ^ Ꙕ#xoA3_I=orf0s7MpG5ErYp ΋_p]׿1-)GoYs2 f0_B55=mÓ\eWXzƙۡmngn_<''qbfwm˽!9d8zv7 A帵 TD,g0j"-LC}Oyq#Ntd}kÞ 呢M9! MI#j)ϱuN2V)j/{aρWeHpS[;ޥ, -/,-D U:Xnb|$^ElTgA!,+D_kҭX1Ԗ:/>8Gg4c'V&J_57CZ>"hPP>{ŠOR|>\LJ&eN)3UlgǞ$Z~tS\tA4@h>1(yv: > G\5*:ZJmuJ +D޿b M'.1pgsaw O24EÖ"2yߚ}T^UU۷ 1`WO5nz ƭvI>E,]S?T3`nB!%qd++;0f [ȧ>5@7[JOXNŷ tnN» J,]CUu"Ks˭ dd6Ղ"qc,`5> yy/D#yңgsBQ?fD&|Kt]̊ tb-Ď |'GpGQY~`>:xbb%s\Oz.˶} X/}qj=Q(A~y}GϮqN좾?@g`Y]WO#*t0V_'i[Ho{x{S/@'PkHRWHHyPB*Ň޽gEy?' %A5Lq :H<˜D4EIJi-YČڔk~2R7U Ʉ- +iľҪȯaCjwGFe!J=<թۉ$xQT7`'OptGm< (8oJ>JFrc*p}| DhJA`3sOi4Ѕ$ӯe-eſ7D6Amdhgj_'[I޸@_ꋎxI  t[! KDNuTz1$b&vnSm={Y9d˘)\FO~q؝z)]~gm[7[5bK][7O B)Kyeע/jہbtڨ[0~~b=3"B>]x5T&68yk Zsc<%xwU$ HF8Nb/:jx?*Hb?)l@r<cn}}ܘU玔șp!@g8KV-I3eIOeXfB'Z Of]>'34Uou k~)HE?JvKda8Rwh6ZC !h#+d>6cŷ?KG<,5%S|:<=to/Ɨ5W6@:X0P3 LjHP,00|%|dUp=mͰ$LD=)|pS#"H [hr4 @&8j)1JhOJ# DŽ[~וO)-EX_-!*T"$O'f?fR'Z#6@_YhU" h郝M0TD0<9|yO쬡F{LzR< .tN&Fd'OodB`J"{| Y}`(|gs0Ͽ3\)~a \Ouo7{0:ʯpAߪg֛p"'aȑ#,Eo0{UwXmȎe.q8n8 v%2)9ե:Vu / )~Il^A5۸;~{_X2r<+ԈAGx9+wzJO@X{M[1t̂Y6&Mᕀoʒs|F+=~U(^R# n?F8!1`0Fʈy 1ٕ~Ҧ rnKaω47qOr(Jٍ:)!s(4IS}aYWr:)*(fť8쿛^z*Iˁ X7w)iC($ :ـ;Ȳ:5;3s& 楯WN'W:00 AI!|M!n&|_"T\ %d^.L7̓ %k 1<4^%$,nkƷ]m^Oj26[%&.$֣OOSjy̓NCYK$&CHC}vzwf:r \I8H:AZRp27?&#~'g^Z_9!-exWJ3SЁ urT,I H\ޟ]|qF#3@0ʵQH҇ІfOQQW *0Da҇0/tι<5E'{.鲴7ʒDlr>z98 w2\1Z=Pޟ`;X N1鏧f`xKDFhx{qEAb SC}{}~6a ǼD ߵ%- e+yy@&Le03'~oGW BL$ǎ .@g+7ALK5+w?L>?N#P(~cN3ʗyw3e.Z}$f92ɵr:yH A[gGQ[u&:qM5NۉF^􇵑sď\΃σzְ. *;f:.W^-³ dD Iߵtˆ‹G!T$qP9<ܦ>MNO2)fZ,%F9A\<095c3 GY~7z79Bթ' qJ"^GƠ(1t4՝DnvlABAB ?:Px}5[&yʂ!eaKow`%Bh11jH؍eق;;ɣhq{6ɽVu*0 k=! z12V k[j7{YN倱Se dcwe~0t ]%IxF?RTfv6Vg8+ ]ʸCR?T+pԵ6.C$ xbi A]v!Mb'숆m1N#4u`x:UGf hqWK/ql 0/mNt22O`̚T"@89n =0jQFw8 2TnPT6 իȕ_!cvp_nEI֤Om C;bs3y>J?k{X$mt?ʊ+F>(U@:PЖ|,&TjꝹi"`yo r:E,HemC[z#ܯIjQ0\SL3vj{ЂЎ!pO=LMp 3k(M/J*Lhr lC ^ ."˄RBbD͋{% B{C"lf~sQNBrF*wi|/pm:XleϚA=@I}Dž׽,0HRT(=[P;ť/P3^{?n #^BؒNI=I1evRdžD9WRU6^iAqDmΥʕ :G ډQO>L:LR"R7Ⅽ:AMDn8 RP".cͥAnzQq%J̄ lϚv 6͆KP$8j!ۆyQ.Isce6\tX B0ѳ>k~ ~ Bڤ$kЫ\/b45DBU/`yowen ,V΀>qA(g|:_+ ~cN[,ռ1+Ę{"0PXK}[ΘfT~K}_cSfS:8.FTr:{5 Ar آ ȆDh{<_d22&LWaL H+\vv)(rچ6L!b? Z8z vZAS`uL rldѩ8ư/$Ө[M`3qcN*e RڙeŨd]@ouV9ґ X7HcF|/Xxum )ߘ7iUUuMqf򗭶M0~Zz35³k4C묷E懷ap$+^o5cFX`> ,QHTRܩɰTY~dʰ-uhНŪ LURxlRm֦c5P%z_}b QW@yl!Zgx+FLc1Qy]&maUkE3F"8y`yP&Y1Z7Ȧl|mkXiO@U` 0/ݦ8X.Ӓ |)FИ́v\ະɈX  C5l7#dR 3ウyUd@D12F @1`M+pe6b ы?z:ưeO64fuRnJ[F/cpJegE%OC>TWnIze5tJWGu#Iu(-pEt!}c#mS3@'^G@7Ce`T+it*@aP E9VN: ,! ^855Vpj$)1ij8X&:QXJ87.E|\<t3?$߃i  (:r8Al;<% @~I[)Px #nB9:Ujx5f !`&R#TbE?m?Q !pelRbF"?q`=*($Ts)1Wf1ɠ9iEHEaH3>b)ToEN5P$3gd@pH.qTAfBwC["ᠦ3&h0Bul*&Y¨:SIC"Ji?砐bT:425z@RL0 *`Fb Zea#o*\cf k 0ĺ A A!5hh;Р *aP33: tqA2 0/!h<Ш|cE9lSGpc'`:^'PHHp>YЎQ>ah$la( *m''(cu.h@HU΁c@!0U8 BFh(.G3CR@Pb$ݜ( q(3fpaz)4 #J;F| W*(@(x @:2v$Pd:%42@<(` (0`" 0240 yiLSI](b(`8@^dBWTf[iQH3@Z ғ=#`d QEL8Ѐc T8dzӨ"{a`43f`F0 @ A(AO ѓF5F ;p |K/:u:tyxJ < z w_C~Bl4teeworlds-0.6.2+dfsg/data/audio/wp_flump_explo-02.wv0000644000175000017500000011232212140200333021302 0ustar felixfelixwvpkʔsZWWWGHJVIeGJw/K-}_ m;|[_8S%ݺp".U E:Dx'jQ,X3 4 40$$ .mD9+x$n[|py0쟺/TWN.v̷ͷ/SUާR{gV~8x$]{R_/})z"j)?J~A.-G𧞮qx?󛯏{| .c͛we[w&"&ɾmtirl&_U 7cwT֘(nխle;֌7pP!'oZ}t>mWi| xNwY*jZ&bydpTQpqFU.J,n21/%ݪ3Yì k8y m]2»@L3G([H}_98B,Nmk}(rYIwa>%=n_mܻ; E4ow;f vo5s`fo~Nwk;|y;l^sJ42zdt4cfjE#ţΣy I3"µ/::{Ϳ:\H T*pt%]AB(v&CR#fhdeH@iF\lyWHԫ.i 8k]9- *+`/3(c捇5J4bB̛w 77̂nW H ,&UAl.8A/D:-ЏWXǟyr3(U.`3 Juy䰎-ş{ ^JfpĿpt d2Bl9Z H.䎤M$Vjߐm7ʼYYʄgڐdUR{@ KO8y \Nƈ!Fw'f]uglKxdq^_"/8j:*ZPȦܴ(MhYh%NqtmuQ1>Aڴ@ BÑJV<θi5YbD=mqIǟ rF#lR'bgW7ro-H)IA+8,(d#0ٖ\UĥbjAZe=L<T>} ryߦTGq78Йqѥ:IݵdܒB`U Iݲjizߊ׹ NSh/aY`_ :9tN߰OL]oBO/ОQ%u6@N"[ā 8]NPgUKsM2a7 7.o7AwgOUdўJ ˜N\lBTM5"4Z,vë_/I )\})/^ҸbPђG/:+ }9H&5m3eq{9WJ %VnLN,1dI4_7?Gηx>x_HpOT]E]`݁4-_QuEDxB{AJou0s_=VS&t%g Kt#+31/ Iӥ!|AYQ&EB_Hx HIaCyo$v.R|4h5OޟffuпY\5Z!96VLh0`FI@r?$h$Jr&Ƚ}Hy8xU焢*GlFY @1&.Ah=GoDxH=[4wA1 x{(a/1@'D5'[MI>*|qeI>lSx_4na@n7m*&AN"T$eo '5$V)x3JZQ֔K m̍70I.~UDd9ζ 1+# Zp΀,GzL8dfosl9V'B>Wq]W˕1xob>1\cogkj  NW֋0azl?7^WkA03g-Y">{lCm!i;8ʀTgJOޡcZ׎LE' $MfPZN9>W_bf KxxGѬqyy%B6ڑhҧGepʻw%"g3{4/%T**X>6(Ak&ZGGj!Cge"(t5޵_g7mMvX7jjH^:^2n_,dWftl3ܬ /j,\lg1Vɛp)6+AEJu0Vb1E<+oQq צNJ1%"QL i`n߹dp 2`Dl7XdFL U 'xc@` `i)vFZ~[4hvjйzAC`])[yNÁY xn raGT=JCI-L벓"㪐(bR名sE6}.Ʈ"jG&˄n']pw3̢ӘbtM=|}ׁ`؈+9Q.P ?>!HzIo}P vhz2Xݜ`(WA.hMIQ>nvbyӹx0$Feق^"e 0BYJP3'+P3+~< W5mX.]H[U9||GɜEjXNk`<(=^^U"㤸{72:9؊,](VYO惃Sf4߃snI! Ђ QHKK6rw =>DXsiMc|%˘[ @a;gNY=0c7C{ ϸžfV`B4r #( UktS' 9 ]Yugm 43%\܂k7?\ySd<~g-ԉfF^M8`Y6*k0Z $1  @b6 `5(TNPXotܘC_k7yR확r2*pRM?>a[KOǙIoG+CS Hky)wip4fOH]`zi\|.4}|_^[Xpw4 Qc6M]Ѻ3]YQH 8^~YP x#|g%&z$3ESA!1{o 8?GCMDr ٭(o#O,(; V9ƦlDLj!XD"XyKP1ڮ tؓ*D@PRlzM&"#¾"cmwe9`rlerNOt_@mt)!I%;=|U.Sv9ORL$>薙0"'w#TZWBsJOmTݍCB#rDLzD7y=4;r 炅c'Bㄗ&5 Xz biL3xP¶itw_I'KG%"b=,Ǿ*I<@8VD)*R{cͺobަY j%XS2B/ou.Acjs@svxgt#ԪzD}\z 4A2b+6'('-^}a|`y1SFP9·N!}rtO\`Ioָqm5]ֆ@Ib<<" v\Y]KEVE5JUNc+o0IH49#dҚhʈu\7 M BVdžI^_)5N,iڪ}+iawC]΂ Mgjmf"tsKM $nȴ,E;,MR-I0fJDr3坫m~aqU1{h /f-cv~YK3Ū/-4d.t41Py*q^sm͉tA\6$JjýSv'}A%eR4\wؼ)Q>M>rM%b>-lH1'+-3$_H\ģve澺߭Aݱ0ك͑E%u߅~4 %cU%otP}~)ola$Owd@< H*؃a KHq@of;L 숡Ы&L.F&n(Jacy8Nx|k~6MKtpkY{ x^h,|=:+r;F'~he] BU' r^y QNc^?2i u\J:_R{G2.y:iuVUD9xfP_ԉx,F![gY(Sr%jZ9ٶX Ȟ_{sR7\!- 3eyatTlb=;+sVթ&3F ewh*G ;vi;*(/7t~O[ +UFE @{+,YPtwq#:T#.'.ŘrXC8 (wz#:%]/k9E8e&7+4Ng擕.)^@Ņ0:vmܐ' "3y!^ hXNⶓsBca>i%\DRfW4u^; %'sR{*'EXq_7 礹R$xӻ\x4/|h]2\g>)Mgl>\LJ34L">dS R GF5-twуtIC&:YsAٷajisY%^fK<.՚8M4S A~ QÜw0ixoDUu?B v<,̆zԔ S9G;pLvr1u躅%BhZ0 \a4d`]7\m`m^=i0em2T|ۀ(y:I[u2YVĞZӅɿi֙3K m7鼛l6{ul$Ѹ=8cOY̲ 0N3 ['l ܐfw\^Q*3xpRo7p6XsR^9z3p4Ss{b(0 L $@8͡(1/i@BziҒ#hNIXyA)6 Tc&q!k}C%ivWςW]b!!jhqkoUK䎳ޢմ83ΓHF3˶[ gUt*}4ג}3\ոϑ́o_F$NZo.`hǟRD:ҘO=x_TR_dv~޴Ad58mPE(QWvѭ CЖ|&l ȵNC?sFo!=2}nfg=o*}19 N W~YH~ŏ|u,?M?iQMk Mӻi!` (:kXwc(g{VZQA`h.huv?6mt5L#8%XCʒo|L7c82n}O px=&9~ \*<唴6BJ7BI!7rkE/,=4y`o9P6&^e:D4/16Q7a#?o<Ƥ{ ޝT^5@bHg[c^[iw؈[6 H,h2_M R_EDxAKGbaS9|<S&9P8'<  &RXlohqInX* Hov+oF8H;-^Zz;~ eFUD+,KCӚKYE.XĬ4ɋ;a׸&mV &b9Y{.M.֟lEvO QG؁*_(;'H\%A#گn,虫y?")? hu#Q#'CgW!x7gĺw1$# epPwtĝ _Ȉצ%'% ^/5~~W|V|#0S`y]Z壤TO.]℡On2?dcd)2h^53z?cQfFtG-_fH)51pTo32ұOٔ] 4,-zHgeRWE&ϥjnb[ͳH%oFu6$Z:NcLI9a}Zr1ϋyv@X_p?msQGJ]*,{FUlzuxR%ZBCk8;b:'|+I+u1}~+jt˲5Lj0prWz#8H1N wq߀: 4 5hљo40tEйMxt4FIT9[tD!n Ӆ44A\MѺKC{o`=hG\dw!j*dT,񳵯}⊏; xwR E;5ب,LR('(u+M0<_0ѿN=P9-TP2{jɱCz@۰!|9dqği6 Vgxr93˽ioȀ4`(DvD?csߴ(ua,@#K*Z^60Ӏ31.ueDSU!^Cl iW D֡0}B]iQnMt,=˜]"91ٛFS8el.bgAq*ޘZ5}涤'O*!Ps_r*Ŝ99qbjK]^rn#5qݳNf[%FՐ,*3sy,.ScQ'KO-em^)E1םq ~Fq؞)l^ hlֲ\ÌʂEO[в,rV#O\KaGF%x`c_!1[ra"A@cΕx+KW淊dOcI=mYuw^\ap;̩ifHcԷ!"Ҹr( a֏z3=“4Պ;,7ƭbp8;okcҵe )gxK#諎Fk*nZly4D'؝(%>?G&E'٘/sΖ>ru5hP8SIf2\GڽMSnH˂ R-ĽBH ݎ)1Ox/oY1@m;"1 O:/2ٝVBx6|øIMk֊$'`Mߥ n 2z[lKe,R|յIQĖJu`mtvoqX0Y=KՂ&nok=S_嵭hY@#YGRc@jfJA.> ysA喅t//Pƪp"Q~J줦6]Tʍ΋t56Hz~VnqAp.h^wɺ<,|--_Oc(T/y3Oo(Ff7yX\awľSy4dho#&_q{uI퀏qCqE8/_j rv[0]0&,FPZJX ^5TU2dmDL"V = ͓eSSkY 8ARs{)ώOpQC`IB$ts/7k 'hWcf$7j6͙ȽFЅPμXXWޖ04񊶰qT,Pu xH9Uލʪ''3'٫JšѮ,اYX {30l2?8o♚Rd[+]az)t:uEZ8ÖM.ʥ:~Jc"IǤMzMlEFlQar'ҖazS䞲JAE31ݛ =}pTd NWlɼ^4V9DkLIŚ0i?:.oWeRJBaکFhѕN2B2nf嬻žIYiyA?FzOi.ZTzDk"vO9_K'3ex ԓ/;~hF-,]AO 6fO՘RB$y2>] aeYrKQh"w8:HdO_aqbUXD'KGIY$襙q|a`WU]sqZ?4_/,{Q\M0ijO ͺtB/>::&hGѡg~R)"\m?L8S@.;WE.USIV9Bٴ=I,o8&:% H=Z7zf2d jF'<0cdG`psv ʧ |w+ͱ#ɉ~ =ogދ'?[\jJk*mi=)wmWvytj|p;P) yra6]ݷv.- NL~h#5q D{hfUml^\dZz$=*l[ɖ9;bbOcsj' !EKvɰZCjI-5zHu7A)K+AtV- a%"ZH$j||Oi1^yQ|)f,Hg9]'sĥB $sBi6ky,oɩTA;mԫ{53##LLrO{Vb@e36*Do2F6C]ϾCXR@|$ѸTؖ龎}+ J>]\Y4au@ּg')66Jl@ ڛ$I0$2#ѯ/0yHFj}f0FL3$ l~?7Ms!?=๨f=RAkU|K*j+#Oo4 9nLq$:=+~u5ǘv{h@q-X gqJ \@Dmԥ\K2L&xI 1{QhN {W g^=0:J޽E \:IN'_$L$?gnQl/pN1<&&Ґ(*f}s 6P?u@MTN^yct:UKb.ns+S>ДQhaVy}{ynw- "98YGv İؓN2uY.$941Dx1{_> .@eRa&gPP։s!u{|5B^,}Aۗ_eQXBm^]1N`5sSHT%^ONXJXn[*W)QW44?*c@=ͷEy(ȭ##7#y\% nMA)4!RizB"cB ޼\\ȒL #K9cO_8f&V><=l _>(s2k= WTɱ[:Nj ""֞N@Yiq3W/:7^qRq !z|䡣Oa>W'~|Ȯ~5u9EvqQͼeX\#Q 5 E Sm%Gف@] v{zoH)&>?@u)-?%K߭cyƍvQ&-aFnw6G2:9p~.̎af \|RBӱzg]{(nI| OpwI pSEexF"6m,Ai5S{&V p~{R*qE}ֿ#ʠ'pBXv~k̸~=Va'p!cçÕ'؂)v3ج#wƒ$H!:жxp/DɪjVk I24}.y@I ,ҥ^hNᲑ2( Ru-\iߕi0aX!*zCrH|ji`aQcw.Վ(v"ܲ?{EoA ,]bNj a$bh 5}\l&ld+PI엒1~R>Rz/]o;wY0Nvkebbb2 GMmogߛFٖ?f.a]E b+a$<2^=Yւ1󐶷~ :/h!>e?"g1{ Y3͍㈄"`pԥ ? o燦[tj/ 5I\0VzGX\x,cՆ]X3?B(:!zΕ `y ^nϵP/E^oJ;%x>D1H05-p@Ic.]ߣ,dwEcK9eʾGVGNٰĒ57,f,\1Jn$Tu@w;TcbEq3%0D0Eix=̀<׉c#[;=Ko>85]2;V .LO`niy9Ovɬ kB=Oq:`ƴFɉ 6őK]s\ ۏs%6-4wHcQa7k햦20E2@j$Oc%"6.G8݁~|ǩ:c릘5jjS~vd.ͷrgԅ`΂drdFI'ZC3bE{ku,8Gˌa{*)x|䱵!'9A~ fL8i؅u퇇2%o_Z[]MYe 5X +nS,ÀJ&cLP7oq*Z>,<KSdص"Z D 8!rN4v!\9H15Ec:Niv>'UA_:OLәbh[V!o&6&BUx0E\$(w=#"ny4 {:iWz yMѪH$D`RrCVH!{sߜ/ڼT05d[SKQz kG'R3|3%*tj 1V~X|eo,gdZjsH_c\z:B"TgCB¡NZ`t o>@*J@¥p!]a{&? Ie @S; [+޹n$:aaA}θZ+C)X)`?לstd8x\[ŔR΃Z\ًZZ!8J6ؚ6-J˞hX\+@ΞT1^Kg[ly=K/B.yXF~uGu8\oN00>9)/|B`@[ qIn5-Kq^#`jom [R8u5#`—q\r 7+|+=TUۊV`L w~a%3Vב 4h 4€}241?3锐A^`U;SIN^-68˕{(zETP=ncT!})r%rR3s~x8cq/ouE8{y 3%!߃]˭ NR j]hģUQ0+spUL ^1K% Sџ10iai"p9 )ף5=LvTVʇ]LQd&@#XZZDژcWUd|  ۬}`B';M?w%9оly$(,XjzwNiH\( aL!m^TUi^Xʇ {LҬlzl&$KKЕqU{h|ڔo[.AClY3UHJ:ovUz؍{sƕf (7m"פT$Lv67C2b.bC?~qp\Oәݏsscs EupǷ(#6>W>fF)OKӋaT6 Dl|M{K9l*tq~DCQٴ.X[ ]=7amo2J[eZPgNu=xHw1+WȎɫH~;&ywN)gzdw%$_vvqfqq-"_}e[ێ Z,zrN!1BF 2b'19.O-\&=;`v> 7X9:ݱOnsGÓWW>󰝽)LOyҺ^^@^E:Yf 9&{6TI`Y9 ]p1On"m%V!!PKt(՝a>G=[<аa^q 0UARKZuudku7w:BhkMZ ſ5DAEEA>M" , u*hr瀽Yk jZEt:Z>iO"L=M`yE"?V\M\3R(Y`yN,0COTy¯M)]:ݽg\ +Y#cq@ZP.^ci"KeSzJZ+뇴R@i5cUb{uw%Mpy1QN9䗽deE CI-f\nU0l)4p 7B[<@v67H}?G<18hCt 1#)~*2->Dmà0ƍs|̀@={_v&h/"WN]QV'~yE*rTvK$Mnп8l-Ece57rO2>{XQuqo9|Z8Q<.K]9qad_1Ik.DMjJa0x1~e#7A#!Ee@Wn¦v?:(-1i1)p-7A~00)0uYlng[Mi "Gӣj&BKAW=@AepsDj=kr]xExT Bek2[mە\(lbm}Z*0 2mЀ5ٜ*$ q ӒAFW On,"*\0?-L|ʵ묔/ymI} *8ȗ[C ?Tk0b~P ZP~*0 XI,R-_겪?u,OߥoMenoEeu}([iqW$@o X@(;{*4T0%%6P6jHK~Y!e#1+iCCr!CAcܳԤ%hq$#ix8dͥXa5Lh2UO!fmq--JU䤖FY' K7)V\:e-#N=,D唝ͬq">;Nbbv"@(FS6a2A㉙6l:`?fZe貎 +65D-ps :1vtt2|;*@Y_Ot-\U8SsS -7 QjuN2أyeλ5n^j%lz{ׅWB{!hPǁ5^'$DLfdBW~-:EKQ* PX,:ۘz0nU |W҄z8"KCq\  ¨* ( #3NC K_5, >r~Nz|URޙb]sб;4"!"!{L>{ɡoϡ-`LcxXWb͹wa7ԧ|9'8Nq`"J(vH[s21`9so\̞m8OW9d%jD4 ?CF3;d(8TKRwm Ae$A_%\; Da@deqڤj#[u ~1*n+Ѽnb>췪]u$R7rsz.O\@jI"LeZ G[afosG,m5J#q[9sKaOKoIh~j>sB:Xc?ɻT|^\>%f$t\cB!s(nws,̖F:nO`7T :F!0a ͧU9+7J-?YxJjo\|5\tIҨ@8hXtŪRD1S=?cWы q\gOb?`KXFe6"KiB;rTw1iĮC;(yց}>'&jCY4Đ# bhFrNR 0/4"hi2 Ik*y}ږ&!y't?XB_y;dP`YhOmAf$ G]suDQZ3}w>k.]3sCFܝ'ި"yMu$`]T:W$յ3htvmjq 9.6|OA~Yg+1jz %kVrz Ut)ÁwP6f p&1v^YPv@(օ-5TӠs#dqкվWuKمM_>HiawymPl#7%O|Q3]#]۰a =]|,Kf>h)`t+YKH,஡Xe׊tAkةeGx|A~WOFٝu&MJYC-kAg͌#ٻdK]+IK/I5Fs4ZiƉ] J<}(vo/ 0Dk%`?$JBaH#O Bm~n1I/+S(.VIRpx8g2W"dRu!ʙ }+^7w=-:2dOM\]QmdMWrO!D# V"!7vSvXjJ%ULȣzE[r>wqW\D8OB 5[inA)#4TX;2A} E=Ɉfpb4eiyIwNazŖ+6-켣c/+ Џ,vk`!v# }k!<_MiKQ^9 WI%1Ђ}!kf&BSfivsp/}oB߂'yJ&F1ޖm0l xR/~:&Syc귒%޴S]!adQ̯3UiD0 .$KcXu{mlW/E3S Yd9wIPOy,S"F`%NBr[zQB F<O +<h +չ[>FSf5˼R{"L OϔDAhmo ct^s1PK8nl -;͝IS)f3\u}tBJ! CxCz-sfݠektZ:I Г_'Cdtv#Q4ӒKѫxʚT623ܵX i k7}^ a6jbd zq {.֡9sJ: %ߢg-pdG}W-&|w)n'83!0oC f XU|w-q Nɬ2-Y_ %}Ûj5Tg8LLhPuA^qYɎFs}h cƲw觹09/j}?|ۂB~b[C ]e e 4s fbUz<Hi|Jc-158Ari Ok(atC91 : %q&æA>]^W߮rN~U.&{ r;N~QhF]v=տy6Nh]ad^zl=T4/\ܸ0|&so7Ȭ'f0tݹ#∕n!ڒk2ףz#+FsA@ |5||$vρK ծdƌnCP|y_xW=ȵ3IT*aۊ *z"(o_YL4wc!>_:J>(-ݷqCw׹_;Y[3O!Әwyx^ ? 1?|vV^ǁXMl uvm}K. c|AN8x ڶ;N+vP(Wx$Ac=ݭi"7*h[/1Dtcp{Bd2KqD$@h\<l툔ټy445BU3-v,!N4Z@sˎb8IӲ>2}r=$4wI%Ȣ>#%њ]|1eˣ,AqƏG|XV5v_(բFlcy"mZc3s$bO|x 3܋QƬpNxӽ]〷坋( ›'}?M毄s)1^{yўҷ/M~;!-$d$~B橋Lņ߬bz!Jޏ\ɤm52KΎ%@<7*|%vSGXD2-WIT_>jmA0L"D۸SB&I2RXM|5#C_|sb5?m]15 ӟFլKʵxz D+Լ,B!EQt z2F (b(aUBpO$2Uv@Qd]|j>:@4-@:2SsY^E50Žk1*7EBF$kjҘPyJE8&>G/GH UHiD!W61L n95`4̣Cj~hs`ᔭJ`@ςv8؋/q lI[_@ճ3L~R7J1V5?x߂15/iWˆ^>m'A)G P'{SN u$.gz >=ƽ[@ φ VpvGB[DD -h  rJu:i]s=5Q6V-H{ay^_1z\o"X/.)5}CB9*mPX*Lh'*]S1V4ccUgIԋhsiv~d̹:1 a2\ŰO[>& 叺n:"uAߝy-~_[{ AQlPܿP^텐HcZRȍi,dAșNGZUDlõdCV}授3v32Iv qb,@TuX hadt㰸 |_u\:;㛙0~6/; 9nSn F1_+`Q @a4U:Nfr/\.2锫V$N yXɕSIz-ƴVD~QNJyp F q A(!Zd2h)㘏`(n@x~B>\{D73۱Qf.^P4|p [J(_j-ikJ( $Ϫ(qA6DN왛=usPx=F=!$. I *j[x8Tँw)Q1s{,ZM:!0ǽ(Iڞc|)ܱ;RѓC>@^,0 ǻ ϘO+[Be}wxj#=,u坘 s(kZ4 %iݚ |+LFKDpO{SFM%Ohy=v:飊ǒ08n[ʵ¼:N k5\rƵ%ѿ[o 5XGfT#PdRyϽcί?Y=H^!Mp+lTOۤc~1e51!G T )Kdd,PRվrR_'_\X?@O ?d) FZiOp6CP >)FE*J)BW_}wͅHx$ݱ{GA"/`76xak4jP1.%=s6g:}d:wU<Ltg'rMWl9Xbzv]Qt/7бE&&3A7]YϺ.޻7Tn1Bokh%LMamu֢Cm@J,J*U}y=Dda(꼀ZYxf);PؾL[sqDqUgj:?5vn޲nͿz/WEotHwȢ"n-B]dkܣ=pЇC#Tc1;أ+ϕ2,h&db*l1ݔUfbZES/Ϋwd{=vQx*搯B8;Nt^K8v<8՜7lEFSd$!ҏ%}埥cVVDFp-?.ђ>.WߡGe+dc URC3 &_b|6AP9io W|,g ƅR 5`~N&tK}׳ȸڢv՞g|eV#? IϑB53ϫ3)<+ tfwuT!aAwU4²Gzu6TEMIQJmZG!؁` hxlMBBZ! wru !*l?/z5=~ځZ@|l̷ W/x&@uS0 |JI݌o㋯wZn|ǹw [^+~_HЮҩ%)hC+ r I$\ZT4N'J}h-zN?bgH_od״ނfҸEi1k6&NR7G &M4I=h# ]9G#;{b}3FQPF'BȎQKVX^Y@)%UE* R y5| NcniF(e*PT܆<`NabWY( R Jی# !RLtګع MđRwKÎ`AZɕDcz~Ird$/GhLN:)a(_y/[|eU4巀gP\ zP)y|o Ys)vP-hTNZw=ePHk"n{2(dcÐmQjTrf헰Vpft;pW~l<1lю +B'vrrrڔٸ⹲tmi'fA%OF-Jj!I {Zn )bFjAA0qhshٹhP9*xl@Lb5v\Q3󳽁"Lk}H(3џ܃Tp $ ]J1桏UOUc_ /MYɹcGp>L-*1UH Cn?'nukΓ]phFB >/dnY,{d|HH:o{yfOVd5Æ#1gtW|U5G$BJC ~]{Dv+4  #S5)tmo?&j3{*7b#( @o/G0MXB-h{|{i>39IhbĦv3"<3.Oۓҡ 1&[~a^~(w5[N^IpzDY@T*KT"әJr̀20C"~%@CK%=FWp e%g8w 0w +U g"'\Z&ɶkE"ĮÙ "]An whiN.AW^G+!UD#|vqVdOqRr7(Q `}=aKZͫ Yd^fͽKcПr AC;4{;RW%s埰Aȁ\#zW(~D>]Uה/Ck?vEv'wj/NB8`]jA_b䐈"ɂM y" Yi[ 3,v:Ba_t4+B q 6 ;D]nSH:<f[(D|iE+(< ~2Nnt*8'Nt`#wwQZbR@j5R &kHK48bcf_Cr [eOa-(jS8{ U`NN5Oxe%t̪6` u%,'[MMPN5ĄٷˆodP*80pmyU6S@H6I>i1 @x`4&/t` ,!Nc!W^'{A` Yqfb0MFnWާO1X=׳b=)a'bH4(*F}k)+J{w.-)puӊ LFԟf@x5R!gˣaՀ#QPJ4!VFLB4L*0 1~ X{yNoEU|q# R%4;|)jfdeocJDKvY6yo2=?1^ < MC?juaDD4$bUUH /Qoo~FJGhC2[v?sr `2a]YRbSAS ƨZTmh=2@gQs'UKXD3zP[!%v6#AFzE5.LIrG?4R3C DE5BM.O|̡t_:2R>zw΋O]/!~@w9jF:;N-eFk`_@ߓaFgw0{w&lPRmQ~M@0ˊѬt3#]GR iz&lDs.SFRf:߲S5$ePgz?XmFGgr_ab*`@zQъ:07\T q0wY8F|WٯJqx\',`s/0q5 #klJ \J8P=IXͫKA9Itu9q\VY*DM~đb&adϒN!%u)f %* ANޤ.&sMe{G/ r|Lu ̪0z-AvZr)0L{ȋ34\(&t7m6("V`UcԄ! T5r˟kx2VvayJY8 G9>5Sc#rdb!3lH] 5.Nn AWxaA)S ] i%'qiq0rKOsݭTZĤ!\98x勮`fbdLQUY{-͵VY!;"r'yga.8Sxε3"S0يjW9a212W3Z`JIrEy+DQ yNdg"O,;=&nK'>}x%iIx$Gp7Z4B+3gRmJui>!M1^ KR4Q?"utJId U:}qLIͿppf4 vW=bM| "%!#9A&X"IE@%& m2$9X(op+d)_ Rblu#%iPbrDo==L#)pU}a^c]YZ]){ e\WEV MeǍW|2Oon][@yjtSc+ Xo a3ɘ9ySv~33:LOU8י x:*djoȘX9:t|m,c,;52թ1+ "LϠ&MVO*)?@8CH{n-? ·7eNÎ`kޥ,jrL xّL#=Բ@9Nsq"lZMX $AK ReY EP.$ڭ,(lsQn:.Ip aR⩕s3%x lR ݥ睏;Kjs ldΚB$gEԼUU#mvD|w$K8$PXĵF" :Uo qvN+&K<^[fęN.[;;b  KILcʰca&9:W&;KjfA1kguMX)*Fa fךF20EgKm-ByA0hq?$0j*_a [3*h<خm?@ q?a`\5ComD-' aŇazAEmGl>:iv,B#b]9J(GXL-|^(8k`3`*r""A7(ySKl1w Exܨ=yLC2$Sp"X$[tflpzX2"P$K2:t*0B @ o+|~)HsJD~iZU͚5URd+ r"$ɮi̬nֿ*ׂ!;Z A=@[.gğzѐ _? GJV2P?])p$8F%op[;H6A?z,@ZVGoe)0A]3J2C %Mc?8%oSacq~T]BLj.[FR{ٔeB /N% Dg-I74M!%oe׺ƖoK`rZrb" q%/4:8r!zҐジZ+T'ET-a6K NA)~J^TAQPJq0򡇥pK0xLMDMh@K`#Ԥ58Ωr*AGhu\#΀%2Η2|Nxtj&lQ"aUH3هm&m_bUQ[P;"JFF-\PCD\ `yhx<[LJCN.`&3$+lQNOح4hg`##V*LAi(B9Pi1+((T9 ``.v@F$6xP (.8ʇO6avP.wxbGTF۰ $ ڇBA_߃"W?FdXpG!K@5.>ZselnV4zHFE+2%EM pn`0bBء"':R8=Q$,Pwz2(!j&jG12u BO31u৥X,:cE@?#ꞡ rXP}^:E"#p3,D|"ps:!2rB~91%tpaž:&PP*E_XH|@3x0A!(E!K.@5|O PS xNIRh+8k0Xe݃2t@ uiY¹Dֱ @BZ0> #(r!}LlCOd HT9!%B#@}8NJӢh(U )Gxc=ZXTLƨ^y3'8&I4t'*>8l,ͮ8 &OaDi>@&+3%@ᓩAQpH$M(1TQq|12!FvKA8~ G c2C &&\ <  ƆD0AQ!:R4nL9kG {:  s TbAI@ $bVgbNIv@Q% Q=ρÚ@4l@^~&( (tP.(2 v4 {C(1q4( =S8"-dq4$H4<Er"t=$^3F#c &t Hm=LF f12`@@IȌd"%F)2vD‘B0K  b 0i*82@v̀,<"65X!&F@hMA4`ड़ t GIމ(PCЀP*ba3eM=+Y#9RaPc1r H @դ*CH+hz3{L2g4"s F:&0d@1F0 FL(10#ԨrT xU3pPZ]Zj@zhhx6@v`fL02W:&OOV0.4 GFi0\Г>yfzx@#G75teeworlds-0.6.2+dfsg/data/audio/wp_flump_explo-03.wv0000644000175000017500000011544212140200333021311 0ustar felixfelixwvpkϨk0WWWGHJVIeoM?+rfj~7&^ow}Cu}sā\.:yX>vR8 iV/EB Ah]̑h>nF2 !*PC!}x[l.] luͿ~I7Hd0vU[k?rw7hHeQ?1'Uًuo./:3wh㹾/ $ 7IgGg]\|20]h:M%jȀC EXNp.nG@p“tQ^ Fʮ)?FO7' !Qeіذ\[ #-?|&X5pGg.pNs鏻&.b}'._3J1'T"+{tBreOݫ\/e"?jпPO~o#S3 Na&*#+ONT4?X!DgBrf unC~st~[(/9߾܌lb\7 <>:û\]sf}E9u4 (]UO=ez;'db մeç)q2Y,9!lB` .&W*n*Vt/,QyEdP2Uh]}`-PrzlWpd)4+WrJε& +F#$HhbJ87e*~]F@ FK Ah~r$8 %A1 \rԂ <¡ uu:$E.(jB<-L Jz%TGq|v|)Q^-!ya@Esp{(xhmidLppa  ( Ԃ Gp=&+G9d@=  pWBklݡj^X;ġLSNY -mSdH69'u)V IqGkg4d̄D%|;,@fL͊a튁!~C Yp|%>AE"rAQe!]PN)@ g'`7m6A$0xO=[r ;D3\n,! *p8A9_45};4dݗf0$^hCGBBh-C)Sw ֜jmb9LH2AeVo0ZN0'7s79$4rv | ?Oݴ&nK^H_%rՔd2a~xֱ@ y~4^ te= GM`H'N12g,cUiI=x]:Awf?g}!r|%܊ 렏x>OELw@l7oZq7; 'H>8#=0g2A ehe-~jA8Kյc0C%} $?ѩ1W7}&)ow-mXAu>跠[BM4 '$ă)sVkW7APxQebǷb1^63fnezpYwT^v,;5և:^N״QqI{9  9\zPlÍ^ļ$۹K+,v~p`INTf˪.H"/کQBG#+h`H-wszwtaݼ9!zfTH!~ь_ ).[o{ΰ ղ#{&{.0jM9*`I)n'#K;r¼neJAr;kKHN6VXWڦ'7(.7@t>3sZhǠӑ&7^Cpf8k8Tf[:`HϨԃ9d8?H4Fa:ch);,`0-~\[p4i Q1g^5$nMSq5$]֘A2EAŏW׺倞[=oHv੊BNl=q+uuVǟldYh*% 6"j\ZN3Pī>IP WU/kor?z@0 }-є]ݻ>4NpclJY"!ZŇ/^fu?Xi{j%[.8ֽ/^E$NQy@>O6JhC*~U-C!I>G"&/–y,\; 1ʋ)Ta* i6,\|cqh)Y VL+\2}zz! X*U_ݻdeMm9%O^hEFTHzgr3[h1j5#W10| lkK/"v(v=aHVd? SqYvL dyuEd3̢9SgGEv̖I%9JQaT!$& śT{.Q;Z̚Bz[.E\=(V kEsYKߝ4uDL(*aWS0PUWl*aYy .?ȈBr{\0#*iLvow!PmrZ"-Qrt"^cĔ:Tе$ 9i>S̨B-[)Ͻ㱈JHDcM4#@\sI`R0:5+9'q}q,)M?مG3~n(Y 4gD?|H Z(dLj=y~Mzͯo%O߀vaxt*ϫIdfF7xڂᣌ,yuu%#B 7&:U*SQ}CVrE:8HNA17R]0-hӯ1s4:-، c7r_c$5j6n{^-]A(h97aɈ4Qi-!(&B:aI09j*!*A%w FNc˂ElViDHfm&BHT:$+2vHɤ􇑷}lȷ{OQbv'rS<9Yfڻ<WSl)~{@`"lVI1wtC˅w5dNu pB唋834(xWDe!^CcvSԬ\O1 dZ|՘?>VuV mT2&z?DB $ۡpR]t]sYP >$8&¶}Ux`KYWzu +L7'̘)/}Li #\~|GayFlm=Apt-{rF$@,eSUvخ'XjR#yK'Ձ!BG5lJ2,V^2N3poZ#aڔY-K/Z}vYX){C0ZzT$ &X7%?ĉץ$5+?jc騘p.w f_kiػR30LH89/X$ʀMnMƶ.C5f(Y{pV@copX;~LNa'@i0:g/w+@n=9SF"2{H\S'4`G} ijHC+4@7.MO[,Z5HEy}tŨ(~-j } NTMx~n1E 7֌8h'j( %1nϨ %lV+q@[]m<ļDͩ=pMh&C1 v>TJgWMەCK@un"gkH)׌ ~zkJ [QGi\*aZ.n7Zu M;XNuX2w~U>j5p^RK83TUn+>Kq@8OXaGTt^p~[ ~\W !ϥťa0Ni_?Er2.rnEB-`3yQ@Ƴzg"f0=Y%-%LH-/$w9ar t;$8E@yfPʼ[Qm|mΊ5n^2DHoor$ hIqm%s鵫9^48RZƨ'O|I 6&jj1 VK DW"xMc__LFTE1`xD1@Y.D*!gY& 灞U+|#1[2ªw,'uiD.?lP2Y%i!^IBB PKr`&T m1=Q 5)"x,:tW3˄}UJb:TF--]u(#VÙR/[qCÔEα/DN_>G0 De3eGʼn\F*͞63e~ڬ5 \~ 6ɵ̑;1מ׻Z$D`n"qRȆb}7C}gBddGEB)#sf3ң6o9)EI]97X3m+~ oZ>|na>Dֱr禄R^c~{|?;u&ET p'6vIb5wAHQ3_"a=;GU-ԡ5nr0c{ˑ~=/ϠCB*籴ZU[C-S=rδ?h|3[^xMuYb!)BZ?ɏ [Qr?)]md=]u '-k{oJ)S$C&v3U.ޚ^4o >ُ~%U8ٖn"9ؽ<~5wcv/^;ZiM{2Fxd 9忷D c)^Y-d3r^;&~qBe[fh{[ OEIu9O/L7gR $7WTb#f(e~EU,@ڰY#ji>h 9Z_Wi5grFlE8\#G'~QkEgqD(42\d"rbDC߹au*7ٌ8۔`_z.r ?"b14DEsfYaWX6r`LiXd PEL9JޝzԠ'Ukl$Tg۟a[کʇ my-š lNr*xT\LՔ y syN~{^fP};uGL6B^G9j(QvSԜBLmT}+Pn @}8ŜѓJM㵣C!x(X:!M`Op3jD}o|uGK=)S?,KH[et#}kU5-q"DzUDojs)(H}?)IJvʢv^xb)F/㣒N_"@O7r{ޣNJI(ؑ_ a7i(JRW_!oo։_[ LG8i6>4K_uZ}QnMs0h5sȤTMCt?EMRS9/?fSܾ " l(_pSׄ$_.rPM&Nm1DhBW338*@η k5Wa$1Y}ǺtqƣbD@(oSA^)ӸF`l Xu-CGi=%HD{>Uԅ̌,@tItP-$M箟)UP@ZSii/7!%hɿu)X6i,81;E-Rb#Q?%qì*!aZKN:~X̔2/ )W}Л#{id:o#o8ExӮA}V8l`&O0JG{#Q!71ެ:kя0/e hX@rª/j~>rL/YB:OC&~ {%c<].FYQߪJ,S]^ Bau %jKc^VMN)jع)5 AU<9 1*66 * KݩAsD[ꣿooFJ#sEnkGpERBs3?j{7DcPQ~g#5!1V@(KE[ȡ7=O~DГi5a^wsBJZl΃쫐UU A(`#^CkeR|3#j;8@9t:ǥn? ui{u}+fyEolDi2 %ô\_I0!5.k AqIE>tk#HۋPʕcG}B'$^ݥy47˰+@]|%7-&Hvx :lE jSEyQ` ō4˽Ic5ѯRumlD}A>kvW&f@\'loA|{6@fӋ[(sˏ`!yX4)8!/e(}@ KhcNTͽ:\]xdc5vn uM6_ A@T1&fHek;_9UWb6ޜqS]"(YY"@ FġZ /3_ۃC(v_Nb^4pA]Q 3LSž|e JW^ R!H v!H^`owFZtqq!J02n*cE'>[㯭q(.Q5DwJ#%kXt'Zs`qR"likiQ-"?t[Rޱ1ͻf t2 JId/$#x]_B>H?7/\"C|G@jdAy*Z-oguKv#"5ꒈn͇سwثx+"M`e81`y@]zf󷊫I?̊Wc(u8.q #Eѳ~tl跄{Xn3Cc༿,S*5Od H`wrPEMyFZO~B4D6f &)y?+~I:6l\:=ܤT͙?>߻mt5aVx$1FF϶[fݧgШ !-0$p`C@~1]2갗|}o]ԑ =X(/>`ox nkr$àq25\BB Çrkhyy½0h@ݒߔOE;zَ:l[T͕H[S9o\Sĭ(ognY%_[/FOCw)&țdG6ϩNpdXZ~{y/Zrs@u|W?i /B1l7S|{{ bKKn!]TY6˵aN3Sq<0ĺ8B>8ҹҔD>NMA>hidp Bʃ0MeD֌`U`;JD:I00x@-jԝٌF,?w^Uj56TXO=eTmK([?x:-UCYb 锆=̘% ǽŀ$":E,l[jty]x+x)^':D; U*j~#,a~`R!ViX&L7P2 x>m8E5rAfɄ2>!F~֍NbSksD\S͟)XWu])ŴS8ֶZ(>dt4nkWY/(DU{ׯ;t&㾽m8T '`0pA4?"6 폴\ҍn Y.}_/IOhfw"-ƤK$uX37ΙDOOw,/EnJ<:~t(h}p "~KYFx(|'S}쨟JO9g<8 Æ F +E!iD)H7\ hk㑌?cjiN!O;FAT(]zuÌq.Z)&B3yRht^ TC[]_ėXq#<+vU9Se ~r>. 5ߢ,J7<-D;WNܮU]i#`Utw^üF.y,,|U,={]=>mK m pS"m|Yc$=濖ێO[D4Fp͈"0Dn9#HHL_ܴ`|VDWR.5;*,pQ{@H go{7rgSG0NϨu͆s;Á[qwA 2h`EHP^7iwUoTγ8d 3ާNJ'~eϫ3YaD.˴P]LLh㈹VwuCl˅~U5_l+ƜFAݷ_M@0999|d$K(cFy:5߼LFW x}nuR塛?'q s#v,j:@cl^ g]XE,ȃ!/ݏ~˄"P0 *mL;)j#0+٬Gf/"v\Aߨwד~0ƚ{Ne=#); - aGdtIͻifYo>(Og$ϔ5 J8:Yzͤ܊"|%IТ\~<_,5WfU }[DWa/(o#w٤+}kę#Tؖy1fcG.! *)8;q}arlŶ'7)4kieYII8vFY嵬/>(уI F7n/U 8] KR>T|R,U,__l]7.S#^YfFN9MX&%6LJ[nr8A4̩.b?'~'(_Rrc:T0嬏(7z{@.v6C [)ؘ.Pb 1uukz@6h9! .DOlkBns:s\k}d1n}[4q@l'WrEe]ךAx?1}}XCCnܯnX'g }{Fh!)#g tih:)1#BJ-Sru<)\y;쮰4y$BK˻L(eo.\մufXw҇|!9Jd~V zD=U=U~aS7]oHz):)'ݐ^ TKK^<˧igỈOҐ9eE6[ܛiJژ.\&عQ>iV u`gĝ3 X=\hl,s\;zRp(# .=d| Mhsaͩ:T|%QZ< =󔻰;Y\3+ħIm-gk\'b;PgsV)Cf̟k$cP^~o͘*+YQb m iyajZN7bKFC?ACK{֟|g >]rV ADZrߞ3j-RHn>Td / 4L<^C9o:f(^B]#D;xtI! M6ْsrʕx "(h(0a ͽ°TIaA"vZ r4xLS{(N\,}Y԰ 9ؙ_7&vnX$%+3QJˆ%) )ei2NWrP|j+c1Q3jTxfqiMng6/ftojwg|w4aLuI4jLuŷX$ܜ7La,<>_ߡWNmЈjL_iA-d gGmQ:e4I 5e%|)ф6\4#Hw'e4s9uk<ۋ 2f_ɹU.81cPQHU1a ZNڱ*r=U#|{VpaN5Pshp8Cel?'FX; _JC 3`N% \̱`sT6^.SB~X_N?y"'l<.wSp)+s{^C4@G]`9o 䌳|#{1瀬IL&$qM䖞L i8FѳⰮLnmnApmM)- 6}6 䡼Z 戫JJߟsk({Wsw6~Kqy(bCn0R5W@՜[ HO6gzi<܊X'lAB:1 ]. +7UwMo ߿+Ep7%D6I!ߙ6:bV][Av&RySǿYEhA]tiAÖt?'ً~*-6f=39az K (Qo|xڃ/_fE(n(2ԭ涟eKR@Ű&EjHV9 _SduP3N}8/~)-K917p;9%x 'wq@ =ŭ?iug,\"~ 7Z&$HY$jbݷ"2A#bNWǽ??Qv";t0Hreg9?N;NeQ>ǘw".\aTv2&mw/x=(A}eC>(ǐL 6fLоHU8XzNN~b!.,~71J.rl|z]3׺/$>\|}7i_ ۍ{6Be|vY̚ \~_(7p$ʹfOa^4i >H:z2bWU tw6~aqݡga=%:X=mNN8e(ra\ M+.cZ3ڍ4F<~֚57`@ WшQlgcf\& @1|~'y6E9fw۵2Pp7r@<Aњ&2p߹"WTȉGV7UiӺggOAZP޷p%E(u;'l:])l'G|h/09AeX}2}6$Gw_׶UG-g  掊jM M =ZxŶ2$\v9|{A0YFb`f[ qsTH Zxv}DaaIGhHyÿO6]#Ji54vGT0:a0H , 5g6F7ȁ{eeO<~{cQ\3aE/̪`' \I,Jf4 `E`?} ݦQ739ݯ. 7Ad<_{zr#'Z|kh2H1W9:ޥSr4^/ rfbK?iEPɐ8őg=؇$%wC1ʳjDVq ᅧ Åη_'bDOR%t R;C>=!0ڝJ!0=f "]#AѪ7՘QA'p_w u.Y nOH:}=y$͍e[|5 u' "y!J%dGqhLg㈗}*|MqZc<9j@6DLGzx+1-GKKY?$(OĢq, o.'F'JAwu!p"iP<3- ԐyV4JuX܄~&6Xo*Pw_UƂ/}alHՠ۔Eչ0sk'S<ENC3a%L.^姻cQ:a:%~|](DU !&|+0à1`ȩ6bp%+Om Je+Swiq QB^jOymM݃.P7;rHwU1TYY4-Pd0b%Sȿ/ ?И >Qa;?9}Ydrk?n6Q*<|1%)/#&^>pw˵ j;ha7a(Vm̋pCߜ= ?E qQ6tgVkI"{P6dn(ʔjL 2)_c̳%ʆ6J(k@6u~PK^%*$OO?mc*;[Wߔǖ  R^=̧$b@桚4h"eAyZaH {w;6o 3MϤ1&YQ=yPfit3|TT~Cln9[ 7kH > XhS=R/U7:sߑQꁅX ֬23w40ÚzҚ-à  @Ȏ%OR=([˾up(0ul(g`8їh=+1}8JN:Gqg;6 D;9IboHWSXR/T;`g#l RYi$>IvfPIF4%oX"+XRDCR0[~ V;4ȴU 7 -1f,@SXaS>)[-@xPt5Pūfځ'龍5&+,w"/1 ^%7h6V,h$`WUd<E nâ(;ܨ893 <ZQ2etp%VVdUĥ|"ƒ%8j𹂗 츨|OЊ}G C 2۹7& 6ӂEEf}ibJz%s QgR.cۄbМѲ}0Pڭ'㍃#Aq"q2Y9m~ wMZIQn ONcYt65*6w{ v浘zr1}Y#%}42rF,tM:KʠCcXE$x)8^IN|7J8%&6jJ9jv6Jc %Ƅ*0zwB3 .m6<gh,(Rvajg˿'\̥@iT8C[+?beVIi.3_7vF6$8\b {/%&.:v7IX$H&jʯ%qX'i;v.LI|/(TKC$乵K̐%?\|Q},-6 {N74 0]1pB뮭6bQ#c}' d%P NA)DZNYSf-=Y z2%URy! "uXCt\/W~#DHiR˞8u1|$w-6/@_`a ?k~7im20L_ڌP{|Z p (O; N{X6P{ҽd`ع HC*tS EKF\)upI?ZZ@=4|^X_ބn2uRh _cu CK;`Dk 6ƞIRvz#>Ra\Ņ \Jގhu[BȎ=ǂwХz_p阉dG$Nc0~ts]q98|߿~^0S*u9,I4E`mKXtL ƋjA;TͨVnaCiJl)4j7{Z8SOqU-|&G療yZb_oY1lqMϷwee A^ֳQ䮖7"M$t[^;$9 `Jqe loåuW5̍ϭ>L>V̌P_cvormۜ4#Tlq%%d>әunt烺\F{!l |!-4Xw4"],y&JfrH47rmSvȫ#O 3m+aAh~WG Iol\2ZTL?\bq%>'K d'{.&3nL\ «Q_"7)D9y͢/φnpqQR1"8۫R^%w[tg,B bT(ou ԏ!::p0#H@φ|"$g{xq1_q8^ͳH3n.x괍Km h2 3̨&!})bL?;v|N1Ps [0 nB˜p;#%ՙ-U*;)<" }]3Е3z2gGajnD^Lo!'9,棇&gRҪM/jlXu’:#6mLY3Uê2hWf|%@ŢNXeˬϤ |H{߻b¾Xw{ dn tG`K`"Ip~b7sFCCpa#vvh;#Y#|ҊatVuhspLN`o)[\VK{GN]<%ʙ*ΣJ鯝D 0_D X[!E%!͆6o1+vs\43|Fv /=].ӕ9/ k@@LO.k F5{ń5Ԫyx8 r$56_;F 7?҂l,XWmBn!Axl5ARDf &!NOwXn#P+)fˤ|{H1{&ת mm5jN;f{W[xoG'ZG] pzs 9G~E+"SEx~X*b~ yO$A_r{/zv!OR!Sb #) t2. =E>CUNMn%pV~9&FxK:-[g4{sL8;) w/\p99Tco,~Ig;8Dϕx" -LNG΃MskVYU$ i)_脜%OA'i4ʤ(!f6=.9й٠PhhGC$;Z=Q-{O;`/_oYmJ7(m x6A:QW)Y7G?iw[.O-vjR1)U;*219qb_*%L]R/XxMO6Rދx/xkN) '^br D#e;J2Vc>ej-|[!1Ad<5C0L'{,؜:S f\.<^֚#ذ0c]:셚O/mq IExМsɛ"$C9n\ {ݲ߸՝]tցT0m1zߧ*yc@*k@1ޏ]QeP#z?"Q#,VG9" Џpl :)1xLnx 2ӸKssVN$gW)J{ pfr;߼W'!$v{jsz2!X%͠w)D^hzȳ[JjgoZ Zc[jiS/b#mi_ۏ "#a Ž'ٺHHGQKuC 1Y`1Z-#? D^ 5 @_^@wV{BM>NCP$eGzęM+p2e(͠\ݩ}|td$AĄIVw-'pMסB %,?~3Z~i~o7.|mYf,?b"~Ϻ3}2 %Z\3eČoҼ椠8Ɍ)B-9i rYDk&)e RSLf>/` U^ r}[**6p_Q&7Sw[C&FnxaY@ck2_H ~ V3NVڋsot7e`q"XxoDwj.+5߽]PQN(VWDl?"ȦIZ;U ]D\Sv4-8&@'L>lu-EsT (o_'ܴQ}.{c:' 3? E[{|bn!c4%:ͺo| Iy&ߊѨҰM@39_ٻG,v5SOWX7gp TVùk};5ZߪY#ֈ/%^]i'W=ح"\E( fx[Prd67$ \(y", h4갾$xm"/*BMIeS$4=a!T#(V^tT5U3c~uH}8Db<хd}$?KlM_lx1~Idz*F^VpFR>JO$BtC.1aA|6͵鿌<-|&Z} zmX(# t Qν@j&9]|otfNr?_z;Ɲ ,A)lJ]6&T⟉w6A:ˤkя1ct>J<>S[-qcidNh͘.PwNlSySqb o?QNfaΩ=oZQ􌚚JqWHSW+b6O82F.S-8d?6'~aEŹ, =~"V^Ÿ+,+huX{%":B}%,զA:KG2JjLV5cNiB^cxqƽ4;cyba1 TE`ӱB``!պsbsz*7j_;@7D]6y3Xeq֊ jQ$faC@II/AQU-?;U I9drg牉ZqǵL!>ߠ,lMO qbZujQBL,[jp-yW{FK̚Y57 ݅si@Nƥɕ;ma@32*zNHjxӻ0ɆF!F|:n؆Oa# \RD9nh$V{Vޙu_:YJfMӒ̀?{CWuE$ C[!yO A8Jػ¹({FZqUkx$!^YJ&}WTto64"3fRܵC!AEO/5 cKlX׏(ms=Km%x3wEsIF8imrh21-ՃA)2I:K2gL /Z->rVǡI!TkÖPQ+0'نwR$PPlނu*oxFp OM 'V=m 4< ' WƜS$v GΙ虬3 5z/Y(5+rXhS6-0fON>rXWD!Jix }s<U.͋;ŤgC{;?.  \h_Ћdvzzafc \5PsW{6VNw>(^Xe[zGa$b[pGv\JVUL׉R#p VgKٜ>cjkL,L@Ľm Zf#l<(cҊAI{yw+q&ѶVƾO,)nOQS:5l+bʃ/ ( 0rjS${tdBΣ-.G i_LEtξ|>=Ԟ btfV%ۓ*͞L>~N[ /;WqV1n#ӟULRHL59cG~)oYÉi5x_(+NIB%+'H_ =³9bFЗ᱐V;V D)W1ղ'w1W@Jg[!0Yu:͌M2@[iu/||+jӄpeLPIdoN\ɸ;}@u3uyP07@a#K $fihxc 22^f5 yhO P T1e!ҞHAerۑ*|.[tzWB tTl pm(b767 ]?}O?5oiHjފU[8lra! }#t)R-q(( I(+3y+^#҉!h| ߗB ⒏ljӟ/cfJi,a8"@ s]37s9!> 3 *w ] aUA.fA3zN| Q^Ԗ12'_aURTxgJT[w-^x:0N=GS>o*_dt̀ V,OKZ7jom3X!A&zVR9^()a3&$ Ȧ2O%ӥ>t@2WZG>2TGx q%ZBRJ 8l, 8CƭOX&C(unbrh?n靨V])-oq*+~9\IO6+H#mO9I֒A() jC7n翸M_кs˹FEbfBQRŻPˇ vK˔R#2cNl8+>(and]Xk}aqլdw(^λhE-w 5;F8j9d a9~5O{ gDLqd:ǕCP hbqRSI 0p$L)нղZ2| R==5`BɎT߾=$?Lk\}Ri8nɒ>XW|/% Ǚ:5cf"w$g!l+9y(0;ó"cY?aB,8m)2 z`=PSxUe ]nN>!}VO#@։/xkpCcVX"c0Mn &( [G4j?9ko!j$ͰeL 5d# = `t&BUulrpcJߩ fΫP.vx^oVy~\R{/jFΟ$'˸UYy$xdxyZl^MfdcodTH`ՏW鼢xr`dUX"Q "GkVe /xVh^*(dhj ),D*v9p#rp ).U-k&>޷92RgiE-pw]{,E6C# hGu *x(?QKk>32~$P3^ay {%A)h̓$'yW L撈 %3$ʮ8rE].eQ{_# hOVGY \ lkJ҂U5.N<">Rǚglvq:X3J￘g R@6X%zֹz.S>>Z"ޙMfd7Aj*Gz~ΠͬTCXuJ ͸erl3 ^O|hC0]K򡺏 u(6?O,ns^|'.w>ވAۖFh$t^ث7#MN!2 }r JRŷ֑ I6K<;}ȾAȬ'uqD|/@81i?㭋K֗ݾ|>`ޟr13{ X"gh>o}NVmIlYZ|^!]HԵZ҄ m3\Ir 3M`ۖOtYͤA%9!8yl E[ǺEKpBU7Uj/FS. CAJe+ @Tw*E30BJ%phoUۊ{DI8gt?g9C٧>xKh@[y7lTvPbXHw4,Ѳ :$'IicΈcu |wsR^tӳ~ո`i`SNX>(]vW|6YF=ē|KfeMb] N]GSW~i;cUN__?hu">K-92Ɠ Ӱp+JS `0Dx T$",iCW{KZzv-kq}hi䓍,x9nwOԾ/3HtoNSRghq͉յj;0%jjN'm(v?5\X7c\ߢɌoT8R%0AyÕ꿆"-Bg TW=QrqQ8rZ5?EP9kzØP~@1ɔ-"P0nPal`XqX|!u~&|F`. A!Q=z.oʴ3(/"$hJqAD_1CȤ+G2j#5[9!4Νى[ha; ]tw=XqRbx1hHWBEF47(KqF/2krN˓_,+KYu&㗔7K CyPlp mS!_l81ݙM>zB*Bv /DbQ-GuMbݲOEQ-o :E# 4pZAz xiBEN FJe?Q7`ʛ7ި9Wڝ sޅ_ƅ AݪeaώJHPH^/ dlgc6myG ,4'UM8 YxʎiDgG[ oLs7c")GdC:&@H׏t(/(sK߰VѼT߰w*ֹώi7>eC(lغUd (n{"t M~@#'!&c4PwDk0 2nd&>qOOMm^%2s EOOE7nZ7;hCi*J.TwzDWv֕d(\Cރpf^}#o"\bAWMh-jƒwr&({éPgd/zUfU&CSOȺH݈+óWx;6ӳ6*5Ak3{ hC=/f)#=`Kc:v0ΚH:Վ !KzsYv:dz[1g~e\q@Xb~C+Wҡp4x28h`0"i|b5,'1h~hTo; އI8?/֥6īr?z棡UXh}4/ 6  ,(!*{uk2j՚.$DP˳e{[<4$U;꯺p?U[ G9DE*aUfW2&_OP$>ƚ('ODZG[>Ζ:~bq@&bR-s\]CBEnve+BLOegdrQU/1 &Le>RFwjV0[a޼l!_2h4}_B;^Bs)f"u'DP}rc:/_=зl]F?/ӓ؎A[kk 5{5#O_8{C _XoXRi_Ē d% lIm/4u9"3KNCvÚk&*=eFPQB}Fu1)#~+ge@ {UL!¸i;*6z^TjZm Kz]%I(FKhx;?{ґ̍,(Kvi+Jlm`'pV/y,UWe8VVEY^VӅa3_%{'}EdH1,32ea!cTuFȊVܖ 6&( c-6_g6bzT kԼJ)=Βw,* U1=wiU$cMx">?] C ,HN8h Wt)uq!%AzT\p7tHś QЌL(oTGYWے]#%`^>z=w&~lqVHJ &lP3sSvS|n/*U=j[2 b'ň)~!uR2#:5=zzf@ BCN,!A>&`1kob&R%J`}WYpn F?Q!x:뿖Sq. <AK߻^s D LnPA$4/M 1ݢ-9E}99KdixYb؝;6LP[(Aߓss3N +(n]`h py_ݩڏ/YlWb^ѡԣm"3,4d 3W|8]C馥hp1}?!T90h >[?.CƉ ?VLk3^<47 m<\PNw/JꈀD3m 9f>ϻ18gJr3*?Nc o/S[7vn^80P[3Cny; yZT']t:tp>խEuBѯ" _@}xI-v,/џ*Z7Apb} `r ~=mX G\e`6mEc/ڤ5_'9yrOݤxS,kT WcEǂZ;?Ċc(u+) U-ͼ](ͦc 8#Ěf&j*{`P{~\ѓ;fvRQͺf*:~\T0 Uo0ax+-@iCHNP =ҙ_ SV.7@J- W$ 7)l3 ڋal 660`wi nXy 2 (9~^gcF<أaw#V fL:sϟ-f/ \H'%3,V 8Wt%&6RhypH焚D5$(ʙYԘ/rz?Jl9#Qq/NbBRN9덆-oEƟruכ#i@y<,,p$nFUh nnau_/=P/$rP6h2rCNᨖL;iQe(7-1!6,H9Cl bG`NH6Ѫtj Զ5c68\9YU??X䍷sOXB<su=tDEá׻wLzWO(gP~*D["<^V)ѕt6\t5)(6V!n=svOҔh+& *T~R$3SdMM} TT.|f]'8/_SH8=De1!båRpԋBHGR̈́խY00tS ǡ4m:hN8zHM:<:„w$7Few;.tSફ$Z g\7m 9[c ũnMZdͪ?DneEQȾ Py yY6>-c  E yikM-8 HkXAq"!8 5U38GL)\31|moՊ=KaZK%Ϛi:JgP7[|3HfL*qw?Ch{( 8(K vukt2eo\&3حA[ad8|^<ӓ%НCJwk0{n\2śOI@ ' Kҗl]fY3핶Y@/{:EhQz(ӟNpߥ2/bpg){i$~X؃+9j(BlE -IJಎAt+ Ih_[i7㶡s~yfܯMW UpSǒaҌC.p2|5ĜJ)B&$Zk^kdfٱ/RH|&d.Em W}q4sF˓Ur#o&+f8b`TWq^;,hˢ> :u yU$04 Y?4'%Inhej %dNHȞJPtd3$' >Y̳  0N]8!R'e1 39+j%R'LFOPÜ'9mQlk # P5J2.C2TݗqXEfWQzh`9". CDB=; 7Cmi {Y!PYP٠)!5"@%Ц)@.A*{Lء {3?Ք55( =`D6?R9tQĸ$E18@'r Wz89yMYW9LU?S?ICd:{K Lˊ|~~I.fJcya9p_Q9,ẁ= `iW ; ;E?X~@?< X[Z5`qzi-t6ƺANN614az,YZ[ki/Z22u=ZNr"t`*=#!4LF¢\ Z$];)|4?IS^Hq@A~>OԾ̀X8}IcDS3A,t)W EԋuK-8Pz8Xi㝑fREGI4 NL4u~RC8%EN8~--d6zP0n>ՑOS>! *`ҟfr 2x[g6FY4Lc\3rDC"9ZęBQ$eaEJ\cDZQȽdz_#ڕ2rF mJdK` :ѥ/dp4s"Uz8z=ǔì@:3LI8G$]GU{\P6d (*KEȁLJXɢ@I_D r0|B&ЉaO=' 1YQF"n`hkK𾃐 <+d"]+ AQFg᷎݈gix)ӦDG803iH2.q)` a$IP)QF Cا|&VC?d0XNFT~hl5 $YcYqxŷ b x1Ұ)ۦ:2E\3Fy@a#|O(친26xuGFAFÝ6N<92"i9Ƞ|gtNc V0V%Q@ҫjt#pMZ%۷P |'aXe-2Ȉ!MlA?ȼja15ܭ"hs]y#cLU\2.?+SikYbb~iGk# e/IO@j6!t|Xil 2fheAX afc^sRO 9 ?y#~1ͮDj B9?vQ#!7n0(k<B1iD$@ pFafByBf# (KHxVͰ5ڐ&*XrtH:١a?0u3bߩgȄ83H'v',@̦*Ÿ*D^/oOFMV ba1FdX!*Ë.P <6CF2!±XRX+':*+ 2H4?x(x t`G1@GH  HQ%t&(BI"?3iE>3VXЃGbpB^ahWB Α<ON@HLed}ρ+" şI@0iJDfbo3%C6$FD>#mJ iUCX|Fu3 Bݲtga@BNl"U,<"S r4Hb@ʡ ?H6 G+)Sҏ pUh@TWJqp)mr."X, 'T'<#nB>)` MNMd0= - %Ey @i)'d/NcntӁ6?c"> h hMxR=H p| BV32B2&<N\g(-3iG2S!@<;K !2P@S( \}HV4]>q:`4D K)P!Lē?㆏dhc$ 9IrAOH(%Oؘ( ?$/Z0>cFzAA eH 0Yg# D l0AAqA1k dICJD `x*r;@| 0֋, #+ :S,JJYJ :@ƅ)@zv3A UetT&$ 8 0n Ač#30Zq| f@L0a% )vh3 -zhZ'M5  Dלs0p4H(8!!DDΡJ`BdHh cAxڂ̩t3/$먋#(BŞ ؍»|1/a1h0' 4 Ǖ!@00#`h0hl/F@;*T :DW oB];pҥ4Z>؁ 14<`8V؁À8~kxԃ>ԡkxЛ^tAz1 ?13`?4AHh c_teeworlds-0.6.2+dfsg/data/audio/wp_flump_launch-01.wv0000644000175000017500000004314012140200333021425 0ustar felixfelixwvpkXF::WWWGHJVIe#_NJ[oU>o'+C_kW^߅/~c_ۿ_߿\/c+{ޗEb~_nw>}/ZǷOO<߹w:7s3ρs?.^}Gi:AC|f $~XAud=B8ȝ7 ˅VL3aef{7SWVᘣ-R\fN yґ*Ք~j;>GR׌*̓i\+xHJn4MUfN:߀JFU$ T(X< ?r٫H>B6&?6tۗPv~R:A$7; `| hA yJS'' *0[L?=p$TI4cEO\g|֡NzS@U,ْog`auQ|4F&3G#y Mqbu)'$Jw:e|w3$TIYX0OS5]2$3:o!ȳ:V9uCU?> hBҺ|V,_^CP?ʪ44AkQR\\"~ CSz/w/cCx*mPc?/w- ۯLx#.t:mgd%-;SY="{$z~]k𼊭pPEk22s'#NRK037 XԹ6   }-#KPOr;,w=8v6}bK,;A7[#G'>6*Կü1Pky8#˺,S@ѿN%%UL:ΧpL㖒19Ab+4no:lHQj1e(.]fiHc*Gw2¿{I4ɥ|q> @hLa Nyr"3?3k'̵MR-.W燆ziɜ b\֝G2I4xv2pψ\>`A6]Mtgq, Q|kaGwY)EqT|>BV?~cc]U6P4ͫfVwCC_KzmLU]1XkBTYG[й[qC'u"xwRwt88N1=J<ْnѷ9;h27@%DeeKL ѵ )lC @%h{ =H)jW]U/h3 wT Jl`7]hn x0l+`*D733D|DdxΆSB5dM\w6N{ 1k>12JHĨ<Ԑ HP[W,H'Vu/GvY˂1JPj({r0  YfL/  4T#\P۾ @:jI/-ZYIyw7a0 cXzGny6R<Љ҇hU&XYNϒyR KFҧO[0;IpL|8g K^5-Ѭj'KzZ_T" w wWi"CdNƭ{k-6`Di׹ F0rFnx?yՈp=T by=كDFpB=iLWf\hekVmISm/Ce0.6%@V3}9][F;RؔURc3}Ʋ\hYx`ٺ䄓hKjfќi|sf|)b~H DM[8#]AЪ]i\}y xQi0]Csg,aXKN$M7< hGp@MEO|*)P\mi=JMo~ J Z*7 kƥÅ 8M>ʲnIdh|D\YC;N滧TSS| (U}gyyʊI&w⨵:OǙQcQ$ms?YZ.P^;X*<"ԱQynLQoZ/ Gf#Ӂ%ZΒ3.ksOA:XIRՂaiTS>9n '%V=AÒ7^ɈVPXDZFc R@4& CUy5Q4 Y& V9"V O]"b댸s ֙OA8܌@RLx 5<|v{mlp }Y9f$cI\ebzzIE7YpyU.iG4(̲ڱ4}yohƞ]10 K^'gpS_* )k1nh ~B92cAys4 ,ʬ':fg\~~8nHA^oG[+1׫5؛_|r7-]-i1M칾2x7ۆPaSIժm;-P4<ݖie)JӞ`qwخ/ SX3 G9L:CFS˔c}ݯDG\ ;Csfsrſ{ԀͬJ2NV瑾"`zX].fX9}ncWU.GGWH!-QJZuzjw Mэѝ0x?SQ1rh;榥 =,`"+Ep>?C4k<-m#S 8H͙P:L$P t3d3͋V"8T~+, &T1q cϱDo]*λPDʶLfW%k27rLReKqHs @/yzsȣ1?_#9ʥ7^)$+%'{RC1)}Hl+]5t'2!E_e`?P]+y736diK!@i8ME[;%9M,/ێ?Js䉱pvƟ{xJ<7:)9 c\tIVt}hc#/s6|UUZ£.6uP=EsƳJa,ob*ۮdUik&k m6}AOFU!0;C -J&tǘĵ˻/ ȔT?JAJkMy_L~gr+ AVAim74~)t_`MvA|BJ`#Ij0C FA=j)4 i@"o^ǝT/z'rϽH~6Y/ܨ))H`[`b'c\YPz# ;[#PSs_Pd5\t؁`x} ʌ#ba=։B>"SWʋu'(QbRwT.8 jrP G\ ̹s #2lfw lDVhO_8AcGKbGS &4<T /!gʽys#ؗ|Krr#ڟ~ܣ85Fyc tl\Qu[!Yy5  m/T$[TuAי63dAW:PiN[GQ ϾaPUEfr4^ڢ' 8ǜaAf65,|js+cYH< lL=T-nZ@zCD$|E~4o@eRQN~j* 7B9GGQrI;SQHt{GˠYcVC2u@"W@aM_ :,LА1i},ynDHpJFOi[786D $ؾ1G&ˋq<9adH%DY{Z$DBK0/Nm@VRNe>bopO ԤJ~:NnIir9=$x+ȀQ,>c?}uDyG@i-苺/)&}.Y@v{ Wx;A:t=ؿ MζZ1Iy礟&I>v[ b'$/*#3nʍWAHnj-X q-xN᷷+_/-Agn{+80@2+9͈ {B i Y0a&mG׋J&q (eUh%Q* vKb)Tdz> o8f^dBpxR(og6i wBSb0̅9@'9Gϴ8M$Rvr/=. ߠ1H09& ϴkC)&[mϧ9i55Zk 0ILBCmJiz .9F}UVXƸa4`TBLAj8TpAE84Fl7 P{f/md.GR>ڵWb-NV;z~ZR|^iDb* +]e&giW|j"~}zzAz$%}vj蒾fΌnbľ@}{LFWq36J)W0uj!1y(H.ća5R%HcOOƓl!Q6mWC%dF*yD]_fJ7L!#ZyO&;Hm^bXh8/#Sm)'x'EkO9n?/zUrA1py!v~vilдP:f,*R v(r&̓ H՗sf`jQv?pd@i~;A5'Ȗ{.^Dxtx5WMtى3{-.TYA)MϧՒ ssj~2e'K&-^ e~ ׉}4ړ4Ӳѫߪ{A%T !]X5T]kN,7pۮ~ B!c8+qFKb%2ផ3\IxWV0:ܼ%ʌ7'ЧkgD qY9|:d\'ͅWr̩- vLQ.l$2&/B([̞Գ/JKlWD^X3Q%`Nk+ :BɅczJ;"-(NZw9қdЅhMrSMF.? x߄ci!+ݾhdHtp< kd0mo7Z9/ -i4j7*iY4nwڜKpn'(Χ.tޜ+75b vc] b^ @^pV Q%KYVLv)=V#IOˋ?e*^ w2,&=cXҀ4c}*ŽE'<_%->8U*j<εrlx;u4wfa.S!$x $YK}=*7 4B3/JUqƸ7\j0~HKZvV=My 3}`s=ZeI$,Im0 4@ LdM2S.\ĺMB82dJiQ l5S{>/pAp~eQK?>gB:̮-;ZSg^yW`c`$-o!ȓ{2L{tf.9z^j2 q2]返4m_(\oNd;e_H07ڮerp7{^D2P 1d#aP`A\1C=MMrhfwە]Uq. H/v!@%"nL1cNxx*e5Ϛ@ A0eR&=038R6Xy ]ϱ tZOR’}4 k\9{FgTݹ!d.taL13h &H!܉0տg+ih5߃%'ÝHv N:Bߜk~h/H&2&'l51f1R1{0XK.$1&$ac"*3'@˔'-ElE mLN?GWh>t{G$s~V:Cl'kabs~A./ Ith$iJ_fnCq!gaސũR<+⢌`lL(AE,;9y#p6Jdk`p:.+8Ių!3vM@fr;|fhDE[L@)CJ`ei.\r~^w:m첫v +o%~l=3nkp Ұdnu~ F"5rƋlnV1O zD#2PLPOp̺rԾ4bPN%-%;0oАp@[:OZ`q:QYWwsJw&Zs Aѧ0u@D-~iɅWs\@#b67HTYH ]_ r;rH( q^I JܘqDZ5MVLVJ*0!`V#eNQSl &F7E Re; 21/PY`ʀl6H$`[Zz>z躲+FeS݉nGG~PbuE}i1! sԁyP|#{*1Ai]>+ꌺ.4 ? Zt^ \@\'DV0ճL4CX"4ED$βt( xD[&Ň[pPG#+ +dkѕc#])-NR=gڂwW8fM QHhcπni9m0OdCq>Hw˲,VI bd:#;#<76 EGmODHع?1$GdjƟ~dӼ8 4̑Ƨzp]s ^8F (vokY3 S΢0t"ϬJc91K<`deUe6l6UG &W~Q]9e`,Y{cٙe Öko^9f=lFS6al[4z}jXkeqtE+K 7k7N:8~bRf=F)GnS%o8u˴bH`I(uoAv 7 ueL_mne~a!Ob!\͓q;zkx$8]U aI K _qV8d$,#(?44'lI|E} ]VS? =?(mjUDZiUܰ}{}%{٦vNGGlSȼՏ9~rͱ[#\n-Ti@"b懀fFC5mZB?F10aN1MAH쉕 y> %~f=mIv~Ͳ4m$6{)k S^&mŒ~[X[O|X3nkEI}[j'ovf:ܪL UY,E2fU79m;s(\_Ok(f&1i +X9?9ŌȥvcÒf j^ F2@;CuGGCʌ+\.g C]r-݄q#Ysol\~JVywHJ)4DU2XWLRU%t/jRY GSҚ ΂ngmX%c^9} ڰɾōA TX8.0+JOV>仃XpxS=?QL1S䦱~xI RF}a"H+۽pzEg7ڭ}#ĹpVddV/'RKnNNMb7F<߬FrG ՄyQ'gg%/f6tڢқi8߼-Uw4asYc m% `&w1h.Y-~ _ߐ!y}4dwF z/StVzfrp1WMŒPC7o#Dc ٿ^| _tXzLf\=`wϚ֋䀣ԁܹ5ˬ. gA1Y c"iS%]aO"NhZwV }UP⠆:YsԺBn߄ԗ`UDΥ / Fš e mEb3u&V[뽶Q`5`,^xsA@t] C5ӷ^#j8u XQ3o͵m hI\Ru^HbށRJ{d o#UV1Hiŷ8[dQ@]L:J͸BWtWPtܳQc3ݮɘ.77c YL|Ի;[,y)Z_5Tl*; َd/b_fԷuV_{Ur]Qۥ߱a0Y @Oq &( {4'_EoY(~F-Tr `9;p+ʷq@~t[؂PH-@\YuYI&9U&s$GPH;**dL!H# QTGS% td"X"4\I+-dAνZve~wP|/9űj+|ǦY ĭ]]r*fyQ%tn%eGn1\5fdio?DU'#(83~s@A?UhewaV끢8Z7LlSƶJ1/j4&+.,@Hi- 0oR^ 5Z?wp7ZiQϓꆎS/AHϦmNjo)HriAŃxAFBwx!YzG~1]ksҬ׼O9(!j'{T!vS6*|+ ('NpT,iH kz9 sٽTW2fNd-fQfWˉX%>}mt9{/ͳ ` +n(ˮ#|ɳ.d&Ɲ͜z E vC4dѼw.˘M@}ԶAF"eps$]K?7+`Jn6RAjr"xKHKGPxz5LQ&E{o0fik/95ZtŽU~z}RUjP=x+s"<_b7t~0 T F oR5Vp38Fkk->dc_9Ek#/6"'Q-o .A BNx NVt@jri ;,?H{7g8N<R ۄ|h,BI}I^ O_lVXdEg=Y;-لcRѓb:xU{uvcQv?ނb5g+/, Ҭ oT**=ti;Ah0w/#-A:^6B 3e Sj$UviFԽM# [˕qz`SWSбa\\ͪR-ZP9Gݮ+ٶ-xa.rr أ֧'>^!%"' 31,G!I `h-`laqܓF9rUd|A$% ; BAP=nLᯁƔq2GնPp Megi6lCoӑDrRi9{(-{3:="bvrh! E/h Z|6!3QSn5fzỏIg`⒰25Ss/QM&t/%H][ 6;Jh"yc #7z8Sշ]FU/}j~?.!t?u7obi\We{N~0B5v篠7Ϥbɽ`Cqmy9Rqp$(抭Guf3 +?#Tz1f-As6V݋" J&)AZH鏋rd%_;zUAJv2{t/éɾe]9jbjq֔]R{|?oUeafhٕ;D/O,h_}S.]\ApD=q'<9;fxlW d*A&iFqgNf^ pjzr< sT}oLeiТ'_zrObDђ۴0\LGYg>tA徳~)!+ŏ}[yAɺ˜D;sBrmմBJD|?!:'zoQ;Œ/I\>ڣ|AQҞ{Шɢ܋L\B;ZY#)(3*2nEkY.IbO.HƊRN)p.41:Dvyԥ9,?5&p_\6mU:P$ \jf8cjwlQFvF ŒRs͜չq87/1>JttsdpF#m(3Nޑ&i&L8WרEjAZ1q;U(1_jX,O(|"ZH8G+?8%c zr=]c?h &z_@?VdV0}eQE јɨǍ>*&ú A mwEf1N9YSgBlQHQ/XK>|!D#aT$!B;k*{覰m'FncW2a=E\Ҏ (Z4KnOb[|fDy5Er|v` :6f,Z7>$5JMB fֿXQfxAKqZ˽0#4'}(3JZ(Ss/1O#|C^ CfQee­le.cvfژlɧmuEjG6.VS,.TH=oPzn=q ONVfcKy͡pΈ-L hc\ȍ @,o.Y."\}9%CkJmM}J9@!kw6d.o"v&FMzjXO8Lj!oB ="qʐDf6'FOm^UU*i ] E}B*P$e!*,;aB!0C僑 Vc@ @m|\* v8Eb&#)0 teeworlds-0.6.2+dfsg/data/audio/wp_flump_launch-02.wv0000644000175000017500000004316612140200333021436 0ustar felixfelixwvpknFC;C;zl$WWWGHJVIe#:_~/ F/oTpwXw~kz_Q~Gw NN|wٯ;˟uHɱX|ww{ߑ? |$'. :=B`7Q=øׯͷ7l5\v$s-jɝJ-C7!*;ٯW@_I̊zb)H.`㈊*-w[N-0AU4ͿyzH'eU\33`o̝ qܹ> pyc267.xt'*r7RE[eO@y4z`"]Gz":EZ= W}/n#v#K2eTws&P&OdseS!>[ >MB[1UibG.;yu} ukp^ rSÌptS8w WPӻM_esH(.1ܒ9NATӢMQR\ q^2~ oFC5;@ΰL&\gIc'ŮYtk‚@vJ6ས}|+Vu=_sTkZҤxO4w§6 '@p7%2R_Fgs )*MXT{4J#LҚd?Wx rR3]0|GUj)B˱?+cGkynhp;lGl?K[ PN^<߮_)nT=imcDJMǠ\E i^iĹX JfO>~0o=:/ ԗ%Bƛ8`Cv`!=CɟuAAmuw,fTBzl&fBx1ShgKEL6aVx]?IͳM3+#d4 6ņPVjD|^4z*Pç ÖIA\F0va@;m0cŖ&[qSr9 pNJFIOm< D-P c(@:g ʧ08h4G?Nz߁low_ =Zy@uw>F7f rnEe o,%Q.OBOo<#gr\MsB|ĄK5%hVs 4+keQs+Ok.DƱ/4Cx2?ᇇNI:=QLL7_EF$tELFa |bwXW":Kkhh7LapQbVTL;*.#1Iv9?FBY'#@Eo`X#!~x_n ;# ߤc 0i pnA\ !@~WTU'\rtZ' gf0 "!\&[1cz{<eN)ECM_Mf: jNhREJd|wWQ/#b7.o!X3.k0u2?)ŸOE{ucpT+L~=Xg )-6x UK:lZm-;{oVL&vZrb6>6K;tѱZu`z{\/w?Dqtk9%E:k^&_(nv#OuG?2Bqxe(? DzҎ̷I渝W?4Ɵ2w7iAx׍y*Q8rޕPiގy}H30&,ol y.%I4'1C {L/Oi?":>3 +EІש1 Y#z. X׍3qe)&Afz=98p]GLX$UC-1 [JF'Þ C/lzK)z N؂tdZy[1l0 `dn:hʞ3K.v%vF|)1Ψ`< $?5]S~$##Uv*X} hhUxau'īQ%`i$QOŽ6*+j"68o$,W Mj"@. HJ 3~AT[4K_4B!iTLfyGm..g 6 E4G4 {!Z+4K0m r?.=|ΉI^B~mNMm\E];<&\2G۱mm%71JFcpC9xμ>HKA.Nto(IluZd.mʹgJWB_V!vb1I$cAx 96>m 5q=2%6 /;?ج`-?9JWTeaW|Bt Q60u3@ WɮշӳV1g!hEܶ=._ %$buC(D? GFGǻ .HJў +};[g A}?+ d3) C FJ˛j3 q%0Ul-.w궷w' 4TƏjkZ*|VJ>|wئwUN~ 0tiǐeXJc J+[ޒL;v?}R3TS-K5u-Ԛ̍B\F?RŐSۤcX<򅑃jAh_3"PG%MIaA#?q~s/*1Jmݓ~(Ifו`$<;569+҄1VÜ$~xr#Lfs£.)K,v=H]t#ۿyW%3A=h 5ɑ\![^dm88eq7B "8F05qyJҕ}-V;1 tMO'xr+[S{_hw$tAwzBp#Xv??q sP+lR KR[D>1װX9jRHm:ܥ)ǸCЦm@_-B wj9d2+ $v<=spἐ NRtM J.~9_Z ienh8HgOx 4R@b?^:8K/os֥֘Xϸ7DݓB)01p[fao]8X`H3o k2ՠSN&l3ԮB=DY&sBp _cնFDzb7EoTe8G}0mqO E5׈ޘ@m )fCXQEC!UE6d& `md]Vh衴D:"L,SL T>Kw;Yv9X܎6KyDiٜZ8(i.AY7aPtg5zM"eY,eZxɛĥ1/٥֥MB;ؖG5.d3[րmv9}*r>ZJ;5nsUplͿ"?)cԶ"E#V=Mƻl_TPEW ?uZges5Lrጮ2*hA׿`m8FñBn}7p޷8x]m/kʸl+&`k{[KDsͨ_wv r4ͦY?9@hQþMC"Ş)<.g [JnB4[3H3&4BE^PLiF;]["EbJ=2@*{y3y6߅38flea}W坒E6#/!G5J?t'QB04@z32oT2fluazfpG NDp-}RZ砪S D?Z&NͮK1"97'FcG{?íb/?d6yf&z<.k`&݀40\9_&0yt{š{!?fО +N= ~Zo))1荮 qZ*_Qy4j`dJf(VTq0ʩt)a<,7lyEBb+0X}& Ev?qOqnO{6Azhp 2L/Z Kz ̲ROO> 30*l3r@1c!d= _O O(VQ}D(nabTdЌq*'׃Fx~u2?TsMbb pIoӓLi hA| m B "=M0!c3m{MBh,M]û׽og;F mV ]md^KC̖'Ӹ=ilގZ@(v >\o {<4Q 4qCxϹx{[β d{*^))OL3ZlfuvJ7Y6&,).E VqͰ,~5Bu O5ɂ!HD|IqRkN4p4EOJ!X2ڗ{7{gFZѥRRN_3(  ғOrbYGhE.5CDÅ]1zF~ @`DܷKHRz@?$)_?4MDraZ:ɮ,Wg@\ KW&%-z3 fw}D+uk-=bJQ+[s~Nm*sJlqZzKHBɢ(o̴)8 F<) T\%?T\Y#^2:8D'jݧ2 "zF娺Q8-O9#6To [+SG\k&^ڌRbM<7$66Hďj"Z(|??^BnP 3j J ,vA m7+QWWe&.2FoӸ!`7?j5j~U;zT'G kſ"pWbڅ +"ЅJC>P7;Uc435%LfA`w4uaiCJ:SgG,H p!+q\}T!S ;[Ҹv]cpǀ+LAʯ,<||asC:ƬZhGsʖ< _wt{4Vw{SGgdN i ЧOMoI 44 ۻk>PWVkőGN1"܌33Rf,;0kߪnŇ I!kfu-|Ϫ9v)ӹȽC[31*YXl[q4Ez΀kdHa+H! bGBԔc٦,e܈bW;7!ؐdI;rΆ_'\keމiS}Ҳi<[@[RBo~y D}K!uLTF#ŢY}Ñ-J *`#8)e醱 [{ŭP-Mrݞ FZUKtZr-rXl":5 AF))nAc׌51kY&.i3 Hh&YW|""k;%& ۙ m@1Äy{ AG= q oHyf{Q[U2 RC^aW7d ̕HT c qW%ubXA(2'@*ɏ5cHw+^2\fSHv]d2k`u-ll~Gnk8<>.&we Ϛw1f~WE'̕aclUbynD2G5Ac%-El*g}"X>pnO"&XK\K"wr3.NK}qKk? UbXbI ]ĨܒzG/Isxi1Y3T|nV= EX3r>l͓h~KE[ C θ^#[ųGغwl e:uo*ՈJ+D_ |fA"}ZSpڐyNbQY|F/0?&գ|d#2K5B^"=BKZQZZeE耵B/ hfGFrr>HJqj B-o謫Em t0ҖjtZ&Sll솜 GR1(FyqE&x@kѬe(0C.hQоiLJ7 gM; sd^CF'"b"yPiцT| 2TĎ2:?vxMJVHFਛZ Ehįv?Gx%\n ̭mTwF?gi|o!oFD!O@}BXcbFDѤؖc5R\7vH6D;eo嘝-9G q0N<3v v^?9П0y1Xo1o(:($1S06-V0@\]t)&oi~"bm#CHbP9Bgޘ@'D%AG*JD)wS+Mn9.$pW;F5K$ݢ_ܼQ7Y*3 ۶\m,|N܅G1O(Jcj4u0}Kv-6:E8#kX@rw~4X=cqCdAzaVȆ^j!> /]8rh{EԮ\GyK46`4EevsTb;wyn7@ 2mb9.*tv3ν~QzYK4n$=B{z&(>f-v]-T@TR18"k`:PsR5 {*rO0X;4 oSBc}SJlw V0)N4\UB(CveVÁ;jm,5XGM[p_+!1B/]:"Q˕l&ҾJ!D%(эj 4ǝz&k9RN~5l7P*8c$-ȕ[ۅ{j @j08&./iP~O9 @eo"f_=I]bp\<81<11CTX A#פ^jStXTij4#C>ơԇA4j@!a#QA"Z7"w꘤̻Ͷ˕kS+.:H0iX0s*ObfFѭ*c>݈dfij]N6fEDυ:oCzlġD֗7MSRa?*dib{x*/R¢̺#Åk)s[0{ Jts3^9/IPWæhiRLjy6KfxP4*m[d>$]ࣇE#x: \q[A|5 S.pu*B-&h^mD'9/ĪHTf22Th md{Dp>7?8]2z}B|Y&>"E0=$Sc#?6drdiHp-xm;x_fOtRk^ yA㡾⸈ظ1Rŗ\AItn.Kl$lf{2^W^}O\?©܋E얟5rPq3a@{jѰ?NumV3Q#;g1SNԇvm&vs{?h=Y!]5S|d]> F`Hpu W ^dnM,x} WVՒ [7wjUg_DTF~g"%YQ5xVH|7lvmgAQ24`Y~a- @ @V>"؞ 20H3,D F-]6F/ٱ7(ӢgFpYv6XmT(YXGse{:](̎`IC.$ X]ҏ@[;Dvz:E#s3]S.H#*/_\L6_Pb1I+nASu洭?1$d f@C),K`E56tiUY8Z@ѹcBkIHhŴCY}uxTX ,˞Mg{@bgVD ;M:2&⒑)V +7i0rwZy A8GrK/gPA,1{XKڲQywBzw7,H7VjpRODU0yi^uL+<4X=퉔=R-eݥyVnκ[Uju }RAɾuaKcD?{t3N[sx,[ F*}AeM:Y-q_w&n?b3)BoxXBE3/3չf!0*h JwX+!u@@nkŔ\?*7cx/L=HSv ?Ω>Әv)r*CI;*+)Mɳ &/~*TBdh69PsvLEn`[#]128i`5l$v UbQqݾh)>ZOxH2 u<c>V%n̫SķܥVrGxBAqGNAt [i@&e试DA>0t4&.gFotj|b 5YCI&# >Xn]j/wC"ßUfQiSPo/Hq {+y7ݬF$aLSO`;yHШcK=NS8u4+rJ]@vH"7W ^vQ'~rRZ˼:⎱8&r-Á qk117 H */Ӹݣ6{VBȤOf&T֖:a:-#4Dƀ)/QM!~A!E_ ʫ6n- [N NUН&(q9df- 7sm4-8Hk6cm8t-;5'/*miKX9y)QbT'Zg ܶC0 խf^C>b(\g7†?Mݟ4nO?*6{ix@*M5gZ櫌fC)/DLմ*α9esb%֩mE'jykhjg %9$DiʞS*(Jhq78FCA '.f% :h"e]m y/Ֆ~LT鲉RER[(ԖYNz|/x_4uT h xtlϦ6 ʹ5T;އ˼_]/|?}\^Oq$Y x4EPhJNH(b)aHECaPPnS"ghvͪuP4vd+D˞|s--*Ѿ>noG.䍃 Dl{P~1"8!z7'.{z!>=ƺR\E&{BK9Pn2YUj<5< >pxOpחrE)W|vN7™* ~ژ\ԫ re6k ʚeEYqg7㜬rc}0*cjxE1Qw7;oTtM9CU} B|'lXJ목tzJ<%?7:f uJx_?rdv8#c%.*)w8PSAf|j2u  f_Yd' K^G}(;| h]0v,.غEWKTO`hRӎfwBG_$wƫf:*|kY0a4ͥzj? sP]M1/OFSKt ϟY +s~֎2.|׿dc4UA ; 5ώq#*= f{ +%NH;6Sput$]B4Lm2b\sbge⡙ֱO8Sg!LYGUm^'7e;}#>-T:iH~<[(!6^Q/etca2yqBʣsdF!$ֿ}S@+7>C!q-" x>2eׇHuybϧiYs;F̄[dZ qJt RJLNj] #Ț;]Uhv&ڽw'ێ~`8&<3Y<)Y[>yuh|:T" &u^WwOh8v2P)ib6`Tfp^DAV!ftUϷiohaOrdOٝ1OfJv^+۶A|Yf2 *)ߙ~/;:pD-vTx֠-"0PYr9a8"xX}ಌHvyM7'BlVt/iu( 4pm)?WV3òf]o*H3-q Iiaʺ: 6Dbפ/?C #zFj_eN^߫\ yԮ{UO" uU <e+i0#b'hI; ~0|5xCR\Q d8oTC/L:ʪG*jw wwG(cBb,%<ڴv%+[gh8F[Re̝RûL,Y~2;DV"䒩9*=od[TU죐m̟e8L[jڣ"B?UDD$IQpYQ5e|~չHqd3KgHAF>le͠oA,9@`;]VR:J uĦ,,[Ȱ+uHyu}dF:sWg„ L؅k%e<@JEx/<>*v2&V K y TA@ͱ/ n,xC~\d()r~m=&VTOV")H%")MDm>tg ԪLS}zb5^w5$4NNrts %u}\捦Nӡk k\VA+\ɥ ˄YO> F"fE6qKt-. 2)GeS'~R2KL_EMtύTVYmg?pߋ7}_Oaia}~dM6r-!Q丅S* h?Z¢Q NlJ*%TJH\O@c}A| ' HXFk` )d|uq-Ujو3mٴa ;wwURlO{=2n"u~Rt=ƌeH5 ԛ1v'ow jt*"xx&>؀*%}+Gnڼ% 'vC&(oĺ/@n̂ +O4< % A623! BƁ~ŋ]Nu9@Ԗ\Ghn2wuɨXڢuSr̲KYkJ:P)}v$גuDTU ~D ׂnVi`?\tQ0Mk9\ŝ=od2\gZ&IWfЊW^limQ}?:.X% (s8M[KN ͇2>r-  J:0w#YDWH}јTPDYȊذ= / QcD0 $om)$LJsI; q.#nF)=#Q)teeworlds-0.6.2+dfsg/data/audio/wp_flump_launch-03.wv0000644000175000017500000004145412140200333021435 0ustar felixfelixwvpk$C::::? WWWGHJVIet!^ߏKחo7w_' +we *wSb߯}wo]H-_=r{wq E?^o2}-f~z5zvs!9?/Pp7Jx^G-n>}hwDRGbb_\;@ ecet [Jo2&Ao!cbL? "q0Td̼?oeiJpӢos'kWZ ezܕAz#x"rp\]Ćb| Q&{X:k+K;KSHF0ܪtuej_TAl-X|_]"#_]Sۊ=NtY >djzi7a_i[Uq Mv>ٚ%VbBH*>7I!Q`dﬨ(1R , h1$&7Z#]@TPޝ$4m c5)nY/:sqH/a_wʼn(;f&OӤ& BzȊ;!o`)8-o&l]oZu3[y %px8Ingkȳd;ךS?fp50) Zm'dO(K8? 0knQ.uXm<;ӌ:l)*Ēýw8 CKG=/WəKD8Oz G\ͱd}]"˘6*K9I,8mldg3^.ߣj7R\~s.*J)xc'h6 uqd7l'&`̨4VK5=L"_'lTvt֨l7>d):f%F܆=_$U4(+T%b:Ff&63l` {wwNDVDWCXWjˁ|D#S'pYК6(|G6PVrte9,'3 5^tbY.u V"Y1]響e<,~h`UHۃ.-&(^Pg$eu*mͩRw~Ѝ+T1YZ|:Wͽe9^:Fg e|5ߚþ;Z\_h:XzDN) FF]SAH=57Gv΋D5"n@SRDAz$U1va4]Tk `PGrn3>?hCs(<"1 R%P]clLS.o,LSiŬD)QҚ" {zytyS'lk˃|01ƙ .ȠhIzi6nQtcZ2ڥ?ȣ&ꭚcTՉv{ f({^ NpS\0#T)jHK4bS<8״|j:[V=d?\nR-j&FQ ok[s'ZXڌKIn|dE8^áϥ,L|I=T¦[oq W~jD@;=ַ|l ŭKcxZgT÷rX=5\GqگۨXl;ESgٔ/0(YOoptWtϼY;r4_xd?[iluiS&wS`!HZmy4_2O{c#D&\<o!V1!r]5[!.[Rhs+.?N P>NWSEeI0̓(邐DSCR/+׳8nZ*cRj&(~CR}^LQ*8\m R _ .|X3lH1E;Aӊ^I'5K QΰVݝFR(3'(hղ8AϗQ2nL`7%*c3WN3ͶpLlE/W$u^x:FbZ 4eu~XRSYjeDςӶp3JiGfܾ|hז3wd|H9r|FTkkFV,nSL2:LNƵ8p܅dtDY,k$B*ڶ ߬R‹Y<~-vA3i>9ִT>:=f$HR:!S(`(˿XF' UPKdM<:ir-(XkUCǢo7XtAKyQJz>'R#1 cK~~)+^yFY-bVSk:"/ M c' Vgb&V]G36Ww:R#޸ m\bh/:i`n01ܤ4@+;b GH\en+ic7Tah?}kx;gJoeyɖ/.ۋ)r7 37|t!|s+V'Ia7#+Un`QQpz N5mѐSu: LUMSPEvY0VB!KлK%ChjE2)J*i|{pdkۆ S)U@|S>TE&a-L2n/ $L(PͦڌF2_.뿿PJu L``ӖFJu@)C\!#=3j!զEP%$`(c((~B+#Y|=iVX"$Unj(׳yx2vVrLq`u%I5ŧl&*&FPdNxU4wǤWu!:1L>UFŶxaQgmhB<@rA&7ݻ8\C8?VL=Iv'oݦ _v"J)+fuVz?! <:z۷C07bpVoݛyhNXGxA(o3HaO1 Vʗҽ|xT;qAuƐs.uΠ|#:?R ķ[Nkмxpt4{ %TN79ikNgۊue4ٙOd_)weZQ\-=+y(l!&اa6{cbwinN?X &L] m:_(ڦ9(OcZ`J)l*u<l޼R̯R'eu *oO׷t#"=^34Z zD]}/3/hHzD[FW*[$}cU9F?`b1Mܮ;x>6'?jV$Ad$k5CP6>2r/@:{Qq d#7~zETsӳ˳y)Qwo6bœJOnZ;*Pe]~`ٕ9̽AʬzLHBڢ>] M' h6x7w.]2RڰVZ5J|'EL$ZP9Z UT BYeHLKKzH#Z..@ӟr;۞2iʍw0&0w3>Q\7s8.kI>VsY~DD飰HR5vJ#Y`LRSKbK1eJM楨3vJ1={-eMfsC?$7 )%Fj@ x|5]DD9&ĪޔzZOgpA3jS7vvA2wSi ,g•%Ə6^%?%$+Em xhc<559|&~!4S2DYg_ G1~ߍcX"!gYW wO[Ź  V @AZL3"% Ƙ1eN`7*K܆x9Y:v+ֱ09F Q%]o{ܦt\3UwdB>LӕşX?AF{FGBg)XE-Nvđh自nW15>V2%pi ѥ՗m8ąT$yhHQPL"qmBK"d~AY K3-G],:}1D;V{#NӉz#T,. -ȮM ]K̬LFlY~{7G ej'”S F,ZyG -r, H@t$]$u/7W#CU>^4-Q'GBUªw!w5c&D}!aJ'6@*˫ޢϪG?N}X>2>\u͹E)Va |Od2ShX8<{tG(gXp`A$4Sb1I>=Xh2gf)k]sV3M4:..٭-q ۲jʦiƞ wY93LGGX,mwmxho;ZvMVI'HӬy@%V6j*gR!Xvץ*iY_MN 7*՚0]Ec&ŭ RSǎ6.иaI"ۺ9qͦo~FӒZHcqa8IKҹd-ݾ<%7uZ F(Lh6:7+T`>+3.--#ѐb|(dpZ|ofj:ZuM#,0j*|2`nCr'?BfH5 "tOd΃x_C]XQd"Mºb`@7-$4vxη&jw<]gxQTX*\Ԏ-#qTWM-Rm6ח%Be8eKCߵw5*D.瀝 5]YVŵG 83yVˮWXwyYn6yv,elw)mcfN;DOS=4rd坰#ZQ F]~B;tR1_\覸Dw5,qf\my+ ,=P= Xɫar+9 |QGXI=،$Ȱ刍<|j;,`Sdx0.}vȷ qBͅ4zfJiGoEi]_Am6kB da4|R?ERH d7u ȝ ee@Rx'')|A[&_ƭDJkAB *칗B8kS2;`c=9h&iP <:A<­]  %9Hn89-Owə|jXRFr] &y?β2.)gU@ɚ) U-LXa2`XS83]my`g_̗ Qkֆ\=+Ѯԑg⪧upm{^(mˎ筕\v羚K6ΫWc){0n"kC:C4q-Ê"Roۏf$I75{1k8  ^BFʀ՜V2ߊ)뽺 #()Iz% %ݧV`7&Ƞ4(*X*I'c館C>'\+$3 ^8Ca mZ-ww],uFXxgX^Cs)/3޷9f 2xMe/R⹂0ė{DkYXg:s| vmʄ3I++S+Y` /{ŪFI%)Mu8=^Q(~{0^R'bԼgO |j6r\]06= S[ K1d! >f[ ٱ&>F &&T$稂xG,Yt״Bwf{|as =4yssXX7NYXKWhLp = %:զ&'+<6kÚzc>?[D7m p[qGWiW JS4Iَ^涓qja ʦȢG=둺8qYbY\3'*sx .IAF 쿫 3ѿaƻkRvʾ7V=e^^IB׌?M9}o"HYwg_8J5d%Dw&JjQj- &זtq`=s׎ӹD=S(ŨNRCHM%SG@3wKVOTz($R2 ; W]f=UAJPjaLֽU^[e3k#ztr`6B<)V_.ц چ;ߕXn!YZ:Ov^%305a1aԏ2Ry~<}78GW.Z_Mu,_x/6\kVu`I odOA!w) Qa_'q5\29iNΈ7*=tؓ; `A`-iu6h^Ѩ!061M,^l9'Xk<@0 *Q6}v%|&Ň؞8Viĕj&ei3o.#] L4)zh,Eq"Ή6 پH׋ 7šZrnvsZm)KF &(O-8^2#X &URrr]]M} "RIX$v9d:xbfeHx M],:ύJXJ'¦R:legW{`HOTt ?CHX_w !iiA1Ia v/+J% }!P3vIMf:bMHN"K3k}yFFU!;)ڷ:1,H+&befC _@_oqn2 (#/q`K'ɀ!?fnb6-zyw ^WKV5\q "BN0{}~D2~m@b0ޒ*ߜR oC0{RƭS2ӟnwv?&> rz,<"Xi,0-hp[@!H_R#l72%XeX`l%8VwF"nXLg( H3j&$8Q 6߽, @^NB&]&oKNrmTĖ2"$f g}]=Tϊ"}x]a_b'OβDm/=ȊKڂPzi{^6HRN %`{5`x4UV4q,ryxݡ`ǫ&vH8.UF#ݠӭ_h>*p9PhrK{}fss,XTJ"1ˣ uuw_шM(#2+zߐz5ty\q6 a'H.'zsO6cQCעr wPt p7@)mz,uO߄P3C@St@䰮H.y~]hNJOV} Wf:7*ۓ ==;~Tb]zlFKܦʼnEUO?R,v=,UZužRv/:'ÊY pW\J?$Si|7W9p|`ʟ"'{+guk}eR^>Pvj-yvJ*`Ӱ^XT1ɸΡ2__)zs#[ӝGrN[!ș3=ODz|! JjH4}C&%nXyMt U~T $Ӣ-F+c %87*sz>~zZ}:x.2p;‘0euqG \ۥ{Vc"S+z̜b-/n˟X |Gv?]9Vs0~xDH3YL"l'wCq hV Qb=h#X/ۦA2SuL)d0mzҳvsr#oN[GB'4 0pj&OLh c&ZT7JdiģD/anz/4~ID~=b@TvMކoh&tF:ZjpdO*Y}SJۮtR/YYj]ƢD2.X !<0fTBUYq9ۋ3.Ou)a+i70:?l 'W/c":qN~JDg?|5t0 h)'E'!0Q~'鱔X(ĕ,EوVEȗm KD\]Fy$>e̲#uH}`y>EBirM²QoFƨpVfWʲvw݂&7 1 Pɗ'gAQ03AԴ6KL-'!8q|L&QK.?ch?r#<0zߓ/xoLB)ʢ}!v5VN]>ay\VjxU"DnqdfIA(}p,NץqQ.=;z}eNL~҂8rabx< vx KJ_tjj]٧hU_InACd>>cY? fGq#WMZb%x%4_[5I@ Keq7 E";-.\l% RDCAqwPhpL}YWUG?}pu>ʶٛ@FOϭ&qip?/ El4~{f6fdFǵ+Ka)p1"%C<bO0^T sސ٠t Gu},:#)ޗ҂v|Y>n4oW`Rhh*!,PS"jbk>DllY *[&#ҳ!827`6RCBX e/yEgP&p2!q`eHXIBjH>&2ODȁ9D4Ff,] 1n4gBe)@YË => e&J& _ɸ @ر?@;8 ge^RAN&#-!B=E10nAyÜs@teeworlds-0.6.2+dfsg/data/audio/wp_gun_fire-01.wv0000644000175000017500000006110012140200333020542 0ustar felixfelixwvpk8b__v3bWWWGHJVIe0Sjfm۶m{o{/7eoe[?Q ݜFayoo?멋Γ_lfrW/w=]S1K8 CC7OF!F: ?Ͽogy D9׌;8a.Fq2t_͐.J5z_$A|7.2 E4fJr$7aWJ*-t|k:Wցt"'ZUx9٣m@vͫAжk 0!A]AG>˒8PDY"n;%'+5#e{ $! D3Q ZYR~CZeR{_+UZ2+Lιl2ېgk>M7v}tj53V4Xڗq6CƷ Pˤ: iOU?g8vB)lӴ/rQBӷ,Q HPoT]\ Bz %4y7kcpP8.@3ck*n#jʹoU fTU,ZА+ ͇>4: 1.`Z2Jq`fTT4K'vpzR]dw;2A8'iK,nGs-SZRd^5kGP nVܳ+K ~'C.P~u 2FK&XO~=̑pac3,@[_ J[ Um؉p~do܎D"ba /KYWd=d3{rp>\Nb;?LbgEST rU$V,b)o7p"R ɃWrCLj߳ǥ q1:2짓VEw$~leB gBn(|~&{ y`;Etat4ȥ[1Q 9v7Ā$th@RƬi0=ʢl(#O?V:Q PKhS|H7\r^tQ8aI]K8咤Kͽ] _Έ?u!(wR$[tqrba-@VDMWG&>"˖fP&3Jfe9>CmJX/" 'g b&;3r`**ӦEl9HHB<2ыWj *7 } ք.|o&=D=5DL)!b* 23|/̫%p;QyQq\ Xt)y\C \᠝q@4jøi[/:%Lo~"BmRdEj(Y;B;v7'=VTB7<ݒBYk 3+Qj"R6!1,&Z/~<ρ{jb.A|jJc&DcwPC"!#y-pL5.SY| 8u0C ׂZ!Ieeb5X`Q$?d]5<C3@7LJb5b92MTҵr^~Hi۫5G6;US/:!w"Wfs!0XtT&KZ"rX[0fU3fմmǾѠ &U9!2(z\/2ŧ+Ր+ +n HMEyh <տ4Ɲh gb8+we#+Ĉ.-T* PF/f ڛX?"oZu p<|x3e^u kޠ*N-p:9b풼rIR>or6P8]$$'>tx=:!BoHj2)-7yy3cZAEԅZTKYxC?$+3V\BsfmC0(P1wP:w:ven ž@١K;H'~aH$z0uYjP}VăQ"J'E"@B[ ^ϼ#\}( ~cbT3#n^^>FTz5Wh Z×R >^͉B d8ݢ\չI#Yg_uObyy%v1x2|aАd׵s: ΆDt%ʄf֑#$%|qk|8p\Lm=-gb"7f{015>[hי' _3})S9a`l}ZL^QTÒ&2 ͤ2eyI^d8p`!^1*K:rQV'Fκ#8~^`RTKx&k]T#"o(DV~V֌~']GgCNcJM'ߝ~G̟:SDn9@$;?U$*屰p)=X  W?lt-:H<.uqU`ʡGBTb|].ōѳ T̉XK,#:Dý;pfu!%UlޔBx-hz%N@?+FySc<w_-p@|-/EMM?2V!%J,-[C>}7Q `fvDsԳN\b$جᾲ'F( &~V7NT1Sm3,7oK !~ }>p`FTO+Q hFT ?9v[r\)vJ񯀑6ߓ=2JOrK1 c&hU݌q4+n%[m6Q;h[ְqj e6 WsJfz8H)_Xpʻ @%2/]Hۯ Yo  kS}Q/%-v gI*[\T%>u~j;ylEus* 0ׂ!LC Lg.{J0"XZyO?ى8q4M |-($JM&dd{B oׅ:ԌUcvh^0-nަXЩ/Z\""?3w !MMwNE/ȺLLh 59 li2YP{VGÇhǑ]3Z@H01&ֈh{"؍ۯ.ADH/ Yb}fy` )JIϖD&Tj|Es58`sRZKc-/V^K JEe-P oT֞Ylݩ7MEXBZ@whgXhM}8[OC[`OU Sl~y"Y*R;XE9W Vis'c@6 !\lbx*K%;YCiH.+2FvШO qg] Iz?vKpUl3'_T>ꏲjf_6vX(d@]vl(hYJc&:Tk\ۚax5Z4'{*|c@:`skXٌOM`"?pٔtԱQ0O=z=%xj/K4I`P7‘?G_oPį "8ڐ&53œ# lW+Uk{vi? =&s?PanTo\|ޝWKh_c7T{@A:Lɂ{@?>i{t ;a6y=cdh~Iddo=gcMcuCбk̃e ax6vM0:uˬ7`T"&I@\DS %˯*wo{T# XEeh Nc*VJp@;bW>MPйsBtu!z,j.IRvNwe@/ ^a9dw2S&8?pQ_5^rW@"řR\83[P48`48Ow57Va9 GۺáHF0ZBT:8Q@߫֒M;8Z0Hx8"6銴afp ш5](މb|C@h?o0*f! xXUQvLtŢ΢dBm%:` iƵ$8^6=&(VǟK'w]כR\fèmW .|O|'Qŧe0xXNFU|`VT}x"7-ǚM6r %*IB'""Y{ǝe+[eqFSc4)׮(,1C\ fG/Fo*WPB*u! !nI`&C;#ݎqAG]&((]ӏo `tLKn pkUH#1mP .D& hEʢ[?`j' R"Ҁy5)ibL="/cR{DH[[f6ǨnbP?#hv/Gfݬmݹ+;,@#^M] RIf۶O7 ԧ"[e3{D GH5` >dgAǹ*(hyu 4Ȃ7˨֔prƌrǧ0^ω 1𺲽n/SNjh\i:} %+b,F K[)D:~{9`*ڡ )6Qe:v073q A"Q#W؞PKkQa DkBT Nt ikP˽O|K-$.*t\$mYA@kTh2xNƛԔ+MqX^"ب3):}~"짘r,7`}R (_r/! lkǡ<>2E*g~)_\ ,p,bSO < @Z[p 7ߕ5ۦ]/haՍp,Tfי4UPG,8í=ܯ?Oh }ql:%u`ZO^ąn`/m\g=[td=B!Vʨ Tܿ2+N==UaJ*K0D+PtJF1J9ˍy`tbD%GWQ; G^P:sυa[^-QocyH Bx30y v: Há*o ĝ+NÅnX02oNXmNʇE,T4l#1&uF?G ӁlkPs2E%"_}&y Ά t?aߤ|"*%gɱkL#S˦fGC"Гz&k rUSYuj0SCrlZKH9nTYxZg؃.ЈvX(GHvj ;y+ .D H-0E16ScKRuT+2q+2C#%n~z%FԮpUዕyM\Ȏd+!F Ze_f? ef|ɖ7 L$*j9(W tF q t)zs`둍rC5H: 7D=RwY`U|mHi_̗+ -Ԫk:T. G3a#T_1$Zhe6&O{!<RV2b~}.T`KM6Fx Lgq,F}V"ql MERw{κq8W(V[H.'A=|z|9n^zk[eUt ;O2fL49 νaT*4.Mt_S-j o8CX Kl80S1%PSݮoWQv_ac|OiXYa~Cc653K"jJaBLk̹ {CD HjFjT@;{K ,wh7XVӏ.x^m'S/Ȣ,${em%Ǵ{$%$L}0rgKȖfӬ1i |*,AE':Tw#F0OS gTҮ͌/;g KV$DP=@&LEASh>kMmU>FAiP]f&~w=DdahPKԻ$ot6ljh9'481Vg< wdwBkɾ!NzExq&B&LwkJcskbJX0מSB҈efDv Vy~H_с &N#D) TՅ؉EWyS~U#a@&+-ǦfڤCW2+^nc6vg_BhrOg{'A5eiTWGsY= 4g3{w BbfNc Kʥ`{K> RunSkYO*4o@ rZɗ,6rm0ṼI4xD % 8ErmeT2Ўؕ (;/4'+S'w1#-5qD#0^c@hl 5.TƁ'tYQ"TTMAhmKt}֎#_&5~KD4ĜbysnB:-םO]=C[[-1Zku7 e"*Q e=tJs*}FϟU7щ/Px,22ᘛMqdN @@֦g~}dwk )B7g c8*&-pb [Ћ>h97670} jZpiVIiBN%+[ &7C ,o!Xd$ o4ROU1R%Py?f NOB+s*"iad7"pKa '`ꆟ+8h'.SpTp;frJx('{֯nɒ´¢Q"ƲTSGH6JgW1v^O2()u+ ʓcE;cSnLJ41},a5˝D@dwpo+~t&Fk[QjfU_$V,*# @$Oib_g 0dh~KRnFTχY3Bսr?3NwlCRbXɐ\ u1({uD1ʄn HiJbc`QpJMx%Gt"D-L!,n!k-&4rW>y;K"4y|or[]ꯟ&uwc7˫?ˋ|1 [=8N[Δ|9B aWS!..%.i<{ W&sA— ˅~ .sEڟUn e>hl?&oDؗ&o޲ v{ʄ;T&#?vR9nr4_D ax;-k8$@ύ152jIVҒ3pw'"^#ep'w/:!9VUlo_[~M.@&Ah؈c 27bdr>Ri'/WRBv~=03A dM MCq Ny-ztl @PTAC$>ӕ)Gv@k=+qW,D34~r[lSin&wY_W#K!zٙ]RWܞ8Yɳ1 ]Myh܄ P79zO@b@;88_ITtZc,1*PYT:Ԁc[:E-qlCg71s.~r> w|o\OX t Dۗ&<+&۱'lOOIt@Y{kY)#@Ԋ,BRt(fd`p+*9u{˫ c"Grhȁ76 ~97ބeG,Bo2./{):(;h,B9?g 80I l}Tk^<3Y"ĆU;Ɏ|x Yp&!s} ɚ`9GDT83 eCS¸ XN}x?ǛY&VшP :ڐgK{^5OK&Jf5~+Ȱ3Cҭ-l"w/Td µLRmsdI|MB=)VʓKGF`&\Hf 6"<qJ1'h_ڠ]d8HA1=1C%{fjE)Q걭g|6 6NA{m Pe/Nu2h2 (ڝ3 sD.WvvCPLR оIfohFSA5rpO.ᱳ>GUӬOa$ٺS9 D $`{Ԭ9U.*EY/l&,dnV"t<z$PdV1B֫ X.~:PXK{f# PjF{z8k7ԟppokHvDyQW߫=@nk^HR6;9Z~_C19Zq^0XM0dcK+GNwO|oOcm^&յO.PlHOcSbmXƎ )]TR15_ O2RwSI{u9T,Ibi J^ɠ+TRjSDԱf !A_7KPwֽ@WU=|x?N`{%Z\̓awT)4ɥq%9\ڵ{ƴd'),cG1D(reSQ 18Gi ɖBK%jYk?a[JLPk^2cR$7 HcDEJ{,UDY䃖RI !clM)pL"p{2 MݬҡZ敧ÞR'`_p 0kVJq/ ocK3ShbG U0m5߅^HRsTy ۦ6O 82/ac9 _2TOUbN[רp{8,Y ̈ gccٮyiI1'HnFjb)$sx"`lrt+|u0p0"XPV5CPSE䨣O(cH25gڄ:C~c]8e޽? /Y9ڣ!6u0"b̐3k/p XVYY5.)|ɛ`n䡘^EVRӂn/Iv-o6XY#Ju 9v|%3XHБ' Ap|7k!!nH4E6@]r)zG}CAEp&QΙr T{zٖ$_W)HUʾ6]'@[Ӑ>rX.? FC%BAG;ZrfE4A!9 Jr7gzbӣ nOeU jre4}9 `G=&k~A.&SH7W)DYIinmر`]{|G>lT=Jd:Ҳ6;HO7F|>6{2S;|BƚfC7F} SbUC?!Xm.2Mj ,3W 牤~(E#-iJvw8Ta jw' Fڋoa3'D'l9SMI0cR0/ pشc¢Mg4k{bM1\@p߳Li>vI‰ N3۟m8m#F0En6 ])Chϵ,*o2qeׇz.ϫRA[ "jϞ}k*~%{pab~qQ,w6AhB%"݋P6I/xXY7h,}_x];3 E+^onVNҨ"Raٳ^իVV +b>!(òR嵛9K |[dn]JL#܏C##ϦZ'7m>>v!EJmQ,N6ƽJ-~F}AH:\2պ'R}ͭ?'K{&LbnXb.\c`r"`K)苺{z/9 :bd(R=emy/]{9#], et]P<->8:+-I["F-BrN]VOqȂ?cъ>…Fэ2% P!C=b&jBV_` V ᜄ_nb>t/wk!Xd-?ޖch1V)De˃žjrlYULȴ# }yJk-BrhYCHmHln~[WAӳp0&7P>"e0xQQRi5t?B| ?lME)ۍdbt%Ÿ8VGՕv_aWtjo;k ?ΦUPŋG8$jŽчzL}Qa{Og.@ Fu%FJၸ"%Ի'5k2A;:g|/xnr6 "|gKR@rb# &_i k2i"C@gVܤq%wq|aEoLGc3DSW9nǜ5xA Vy-R6`my$ghk%fMMu򌧻 WL~I / w]~H,״ѩYcwbq(3ĖTtQH(éSaq(b#7y=ej܊O2挂v34W_dx,'"f%v8*0}<(k5w 0dѳѧbTP,gcjpܧY5p"ڨ£Zƍ~&iGĬnR vr@:72*xk\:\vXA%,KNy@#G& !K#t_ň\v-t{($ky7";7AP@][x!*d nF;.:caYWb/da\-]Ncrngi/Iه+B.ѸpS'w7MX$^}̓jhD%}!_[{EUM9PF+__XJ-w7:~zaР9;oѧF;]&%Xa>jNc)H*#ay ylw5F)v̰pTjo)5R.l~P[QY1h61/U}P¡c!si *Q;i_i΂6cd~ass x_ђ-]c9"wf|- 7mb1"M1dNUo w?+WIZ\LB>vjJ20';ޕ(@-dž' sqbCe7bK'N@٦Ʀȼ ~ZN2㦦4pvܾ^=>snb@>H?+ uN}}㱿yŌWM'O͋ $!&mEv(&`nA-m' 7u|}-' LMTt썦i RLP:>8b;yDһ-c8*ޛPc8MiؚG'K%-%aHd.yM-i6b BᅭJ6>W0i.ȕ$*F8o4r<$h݃E \jI:%mp8bO"g C_zr0Ǯûun:S* <}O# mR.hފ![Q)"=oYHFL(ǿM ue0"T2՝ٙFT‚vGv9gR-cnqMlr|ڳ^.&CϯO'%[z=W_=@bw::ce|w5褐 |[] AՖ_y+~Tcat?|,d0$MISn}udS? EWTѩm{zphr] g!Gx2jZql5sVܳ\3UlIv'v]S[  0gWueyQ^~T<$WZ c+Ksm}..HI>tzu*:O-<8@!sq֬@hyz8i*>=lUCQ}PYqFʱs^9iϹD>Se]SFirLH9FqvǼ&j-;(Q1ᆡM{6b9\FEyNtyϺ+h@as.2U` n+59X][,*ty@+՘QF ?XJR`z"ܸ}vZz/ ^j+ܞYAЀ4bFQݛ  oeZsi_pե L<NBaf"?pylSU[{<i9Zd? hR So91;'uŽ-qx|&["`9RzZZ'DWV-r<8hgf,j=,l-P x;׬FN. {ȷ<[Oa"ysX?DZi֛ZSi78 ՟'-1n;<ՅS%h JveT6r8^OJ$R$;[64Jw*ݭ;]vUV՞ՉCG )_4ǭKԲix͗xZ1XDnL<ƀߤExb-t] ~T)PX.)r`5e,wLQ8 ƳhpVM:M5xpFGklx:%(7Wπ ^jbAہyGDiPX#1K5 l&(_Z - "[Fk!g?CZan@HFM5o X$Ԗ5 @Bq rN(07nk9/MP?dN*v/@2iEP AHxT dJT8|PJ#G<$R + "Y8XN%+kD5_ 7M">7 7:5ừs&p38tz1EA@T8dT*єF苤{&Ѡ 5蟌Ӿ't_>M$6(i -YSPܷ03mrmX˂ 37Y,аdu' fL':l7\ ?89%dCsN [m7d&;, Q(63'wQ|ZCۯ8uĴ( 7tHD(U%V4B]?l_bNIPu.W1Q 6uo{`(*yC iSaoNظm<XaIAlTR~," eGfIbaF!0魒"z1Hj *.v?ra{7>3ӒT^zwg\㠭ϗ l9_Ո;βD?e@`8+ Ɯq-e+ݨ2`Ω?QXM –8+@s9c#`eρ`]A,%=  ୅s#'z Ӿ:gF9ɌXfD3&1;cT04&XGdPԟ_\ 6JӧS$fAY?~h\DzJEG.ȣ(`DeyhŁOFTEYA=eYprô$)lK:@O; ѡ#e%(dx\2UDSjwl I%}ܽ|栺?`+rO.8 '\+J0X2\E!5俔^ck| )yvia<.cRz!or~`T^{.,|Nf :SNtlp-qߊ i(~@ar;cçF%uMK> ,aAr'!3J'6$ektF;GBk@ED58RilFӡcjFyb*h$'pf,KK>C=@ЪOwM/G@3 7{DmPQGЉlxBPQ3E5NDCxjǠH <>x`*>ts3|&O \P,xitMM^ S L(j2oB*DqTya)TbJcǧ?He k3lCZ8,"͒ $dFÀXq1|L8!(1~u6|Rh "):@JX] ̘Sj?7C4&)F*t #jCX'MCAOOP>@Z˸ XG0LLMd84P61jqFFCeO2*4P H:d0ը\(4>DP$ y`8DP3@ ?@kFSP!h@ ЩO}ѡ (9<(22Gn i⣓AqEF >tA%01 )h00@)4NQTĊ! ̓ Qf$T"5@z4. L@Xx`иi'͑Cdq `p&@8';x`p M2 JC$CP$ 8 2G dBlra@18d `dz2 6c 2f؁9xA6|T8@ViG# ؁'503z((xh vY00hEU3@3@2ׁteeworlds-0.6.2+dfsg/data/audio/wp_gun_fire-02.wv0000644000175000017500000006420212140200333020551 0ustar felixfelixwvpkzhddWWWGHJVIe4?'oW7m?|zO?/+.3.ߛ#߀7GT8Ώ*{-ob AGArhƋq:?7Q ٭_Hco?O[ӽ.{HW\\h;%w$V.ܝe+T jGOy";WN/O`7͋bfOK!ӕX%CpӒqCH/b}G6۝VMn~*QxDl) ~\ Pb7]t"E0~lʁ%+A`;F|I2>3ף75mj.e7<$'IzLok9M%~KDXYf A)]ڀثB^d6cn ͯidɔjSbI0 >m Ɂh[fHV"`r<'ĖwlNja23>  /et FQR-r-JE%Y!%emBh"T5Y~rA،vw2l EEQٕjݎʳ0|W@v!ƴZj4͎BgkAB2!3)nF-+N"PxS݀" deP#"7s=KX|ncSɓn#_-ܭܥ{ia]t(љx~Z՚8F e kUj6:CIjyAJM{ԷWCE]T(Ӌ=Qt4=GsqːJ'(xc" PB #v-GT!HoT1-E'\梅;ii5lz$`0@EjDe*À,&Oa3.i ql" :}W;`yIX)tLS,/'_}GE =eȏ(isԶM+MR0#(K`;e, o#l&5QzR,CNj+ J3b+ W)O4 'vQ.sO w;+%_w۳Op>} sq.:'u]C &2 V$ԜyA*0z0J2f9E $ ^DCgCXнV.՛aijnP-飩_ E;_~鿖œb.%ZZD=ffTq7^pu}LrGɁ D^@L/9f׋/Gj,T2mr);o}^neL.90ZO#pk1 ]9Hʡړ3ҖzvUE(bgsJ1ElR/Xi9 Q`U'M=Aeˏ@><#_y}ĝoD.2mr?2'I/r/e"\N_P澋͆JƎ<9ռznioAH[yN' g+Ϙc</K1#G]F9꤈e__6X+f<:?lNԌ;MᕸpUbw@=XΉhv j YS .>=' w#Gso=4ض氅qwDu\n%<^_MtWv|D["Ya9qy6(-;ŮŬ*B$*ݨG9q Eѭpkv8Ƅi#GN^BP-rNG8vKUpHI>j@zHy>\S(Jţ\,CbXByɨMY3VK 5g^ {m(YHm'{,)ӭn-oIͷ+Vrw!f4&4Nxj!'P/pXvV{zn9+}s8;O%Ly85qU{4,z^@4`9}P*]vi3_n_438!p!70n"@I8,3LdSD>/5R<(ȆV~n# >`'ݚa }.pq=B8XLokQl|4L$?i)djm䘔Ui\3.ل'=bj+5Ԅ-M ΪRGrZeOtJ,b)X>վ?5+Dx;{2~~{\/H &-RE~WS8*- m7;wQ4vz.Ũ2k H\?IBG'DB"HkyT*l}U˖f?#(GתIOVNU|-S$' .E`LM%nmrt1u9cBQH& K,dhpʽYik:7$YM 6#t=wܛVVR+E%P;hNcyo&b#y޵!z?/:r9ˤ ?V4f-C2?򪣩N\Rz؉&SBMlKhjg0u"0j 2X"AD6"Iy]D"H+L@In]եƎ]zVYR{V~wMCL$%kXu9L{EJkk>zpTEDHpTN5WBnMӯ [6WCIDYc* Y\m2}#/l77.Nfwzc]py`jg9zgGkSizɞ4Q2SL 6q80/xoAֽ(%09P:J=ՙ3hDwqPmC=۲ޜ&N ߣ)EeN%f&KX(+MDEc hfX^"ґՓ I\ڠ_1dR5NukEbgmYu-&g g isތ^<3b twxbtrS5 ϷGxzt֏nK ڝ&A`m2+wG+FaN4k1urGANAߞP$ŐU 0U6zAmq*U:}q'W dO sY.Z}M[n8NYy{(~vXf;nz#1d# ű:`f!j Jfrs|4;݄'8_;ypn}Vo/!ru'7ȮSӅl8oaCx[}ˇ~oUsDpjpXSb͡A-"X.l}3{ե3Nbs?yڬ]R͹ΞU&3dvٸʚ }`z)x0?"xArR3'a:_-:(Ӻu#r.x×}E$BAj5>ѐ=Lf,Mpv0y__sK:%6?5L#+l7|ѲͶ9"̴0 X']]$xRjS')4:n,bWߙYvt6Q;%iQuz4,4a]MSU^g|O{6nDKL{DS5f _ _ P-?pjo{dk%4 4- ұAيqs`U.$gBfz uoi>qc$bHV:3|vq@Ux;&6o;^~faV,{X=Bf~e$:/CPS<%fk쓡yv]dR0/?`UϯOr>Y'&s %Uoh{1]P(2敠 עkR`{;=킦`k"%,gIZrZi;Xmyh'\RD:g_Ie?}9nFzG%h7oX{w&Ϗ*v\pah%ouk.2{ږ<[ITV ^2,'Mư07)T|q()YZ7!wORcKnxVMu1)ԒS:Qw[?^:>}b )*.>rCcH@b,C=[%=RS*Ru|yS#}]f \0sx$zA]-7/8_Pf'D[DTѫd8-5y `^\T8x11*[ỳrI:,ؕ)Fh~Czn*mE.Wt$af\F.F Y$JqƹbRp+H#zg}@9dLElAO;g9~Õ7oxUgX2-rjo Tmfjxe0ҌKEȷ((!Os#D #<ǛaA0م, !;zWI)3޽GE]$H(-?I((2 Њ0*!1&K Z(lZQۭKJ5HlŁAܣjzHI*BBջB& U_m~ϛmH$wxٖ*pBRn嫇5#ov(L}1X=3. UU[7(TxE'7&6?Ȥ 0+Y<;#p3R4QMϸ\N"1![ſIʋp Bz] #9~m_+XU|0uȘūլ%++}%J{~Ճgǖ^!Yx!8 ,rqBayg>RT?}0$u~mK1N-巒'~༾W5w 8'+&u>X>x'1|Ͻ6u>[pW22J<ؤ+Qab\;S?T[UJf 8GڏXV_=qt1`G]sO/ 4+fCdԝwM~ _:7ݝa rVC!;tW$L#ů|l:,<9濧tA$]B q2bM!"Y6+(*d`3OM$/V ^.mSn{Dцs)LqуIMW{,jb)kdefKIo$(2b+;C$I)6$Xqn,a7;_uZġt-n'?}>)R;JK٭kfZiĞ- r{C݌,vs, $WA0.к5h5Z1@u}]^2`}$M%$^_OFa~>5Z^a`{0F6\#]TۋQ+' 0hK:ql%0`0b6n1GWRVElj/033|!`_ܾ: 0ĻۅIhY+ѕih}TRSY]m,5|BTѐ5;EFo숶-@u-`v=K/CHV?uǀk?gMX++oLckFA[rmfekqiFp]e01G_pY*)-T+c%KMd*Պzy㵛MDY3o0[ _06W8_&v35+zH:Ng Պs렕CCKY"7ܖcF۷Y)#%P9Nxᵡj1$z.V(q_Fw뿾9jώ)SU]>i&eCIWQC?w@C!ivˁPnz|[cI~%ϪpUx٭|7/NpP4̺$tdi !~88 W.uPѠLj9IL 76 Ay~cIp"_hQq]^loy!ЍWQQ`ӲXpHpkpJ53zo_nHb;FNY{3^DM;;w zK!Pڒ^UpDt&(Mmc1FxD PhOs 5 O/ry܏W:]dyH 4Iy%R KD\)@_λ ;C鷅rnM~8BCAi/EicU/ڽX[ (<o%x-ÕeD;9I1 Lx:iGI1{,Sƀ]vœ8?`IJB"5"4vE:s Ew'B!Nʼpa_oQgʨ}@9R")rZm jx`XtM9B(H+{~ ] o߃$~ ?=T{)hX . ܔ>!TbF!%TA=_$s+L-݆fy8P)߮9UyJe꼵 a[J~?ʚB.X ԕl-1Sb=nYjAmUzT5赓#DZ TiJndc4֭T t (ٳs۳mT8\Uh8I>paqIZT XiڅQL9ulu?KJ9[-!NI Cr Z%)MksKXgxK,Xּap4Һx }@TԚD3+'5]$2pZϾO65`Ea%jz h]$Qf-Kߗi{P&3tTh %Eic nSuq aMZZ^ %fPT7C//&VZiq{TD#yѳ|v%JƁ\Px6T:.m@p_S,6. $"<[a:uRw7hTj;z:`TW{TN"Ag#k#pG,E;.[;H/5s4vylL fgbr [x⹣x?&{U{<7C]*MvCUda@z2kVj? Le#5UO0 s?bV 7j<z\2\_>'0iiCz]'c ı|ŮW[ } ÐB0fX!0炕JAahG,M}_X |ƍ<67-K\Փ%P6 G 8&xԦ7,`(ND~2#Pm$.S{fED,TdIq$P8aNWsj &y.A(Xe-c EB%C?4'ճ\@$7H.[S'îiPhu,gˁe*WnU5?5")Wv%sv&Cwí_:m" I!Oݚ&|d: Bzb #_-l}M_y)^Yhs\sVfٜNW RPuvJ=| k\g*)bܵʡPEf 87/iQBڌ)S\++9'*k']2SThF9ϺEApf"vr_hvyp;bxG+ S,d\|q#[OxC[Xxyt]q95No`\`(5]0fMCЇ>!Fᜢ 'E? 2 C\Cz*\4?`MO]~x^ɒ7Ĥ^|;KڸbPQˮwHJ^ɴ[[,drL3lX^k qʷÖjߥŶo@6C)FvCMC0 d>|732R~mJ2>ƦGZʏ@eU )IFz_eY(.*:`t #ohba-z)H$c"ꌕ+1[bP9#sxqP?%$ zmcy~]帘Rbω0u&D~`d^94g.`# ߊq7^j *A3/5U蒔T 8ųlG}Lc=uVW05ϒBQ%L.sӴ vب7Cz=Uu.|,x])o-Jw6b4,X 43 =7c(;H Z69p2l?ذ%z Ax\G:AfWɛOrUn|V"\XƽTh8͔;(xWc$W)8W@@y3:;}г9R,%0&!?TB lm\[-W]V/d;ڛD.|lΐxʧ |$蓅o;7okF]wOf͐ja_M'ssb]*G7glgR2ȼZZwּ@Q1"7?mä'#B44vܳx!R\ &ʥtR O/ a* %¢`8iFLBň<ZKweuP 1KҠ#>}ǑsRtx% MFPi짛 oedcMDsf6Y0xK%:;ŎuaΨ|UGeUK%عlRII,֛7`\mm?$Xe]&$&(UxH2 ]=2k(RȆF.8(,!+LE^C^i2oWԎ%˅ШiΘhR*],{z<"=b'3tr֡!0& InI-/)PE=jZ΢ 3`pH6Bߐm\7Qbl u۲ͩ!c3C2C#S@%mКS~[\^-DamdXLЎ?ߚI'2ΌR#4 ^(5sןebuVޖfЉhU4\T 6"`oN<<vvp G{?zi_ARN:ڞiw\v- @bRͥ/xyZܾJV'A"p_iQyXL܊e,-6; ?f̊3ʶGeT^j>-{bW< J)0.|yijpɔiCO-S5ϢBeӖf:ʨ`jxIoA^2b([gUKet*%Rn <'Ǘ" Zr3?gjRa1i P2K6U x<^C20BIcs8yi:KV~f$P afG4Xݡ RV[N,tjdM6v1 t*>`L*l+2\ɀ;Y=,2^&#^jE:ec thI/*4:`e؃*)V\%SׁÌ{euX1 f' =R9VSTĀV}e^qE#qS!^V<, xVШH% [0ƫsu^!6-UQس 7w"t\112ʐ -7{JR ʗme%;B -a1HtlgDY7l85~;qM㩌PzMqƨ}0}>w8:2=*hs2"͘P>]goXJyWFo/iPGd򢕘"(I+$Wދy:i []ۛkY2"+%J9'xR>2K%SQ!kvD6Δ 8E[ jL/s5˵&*PfF@L!nI"β#"@5~51MK;ш@4 qCuz<bvO}:&%_ nYg %IwC#Ϸ%.Lhdnҋw =d՛R&=^&3Vg/@Xw@ D{GjZX,6 ȴB?7A<4٘dᑯ1c4T`|LT p3(J}Yb 3> Fˡ۲Y7yقxͧB7p=m:ҋǸ?#e!&%G䂱pgPS~H7">˧ݔx\oM |oHqJ=^"bc9ˀEw<!<2 8iP5#HZbHF5'&c=p:H5 /pQB,[Hm„WO/8m3}JJR{iwz*A"=!d]k܀w;uHkNXY7ituܫڟx{Gu(@_~nDZ0/,MRTJXYOHCYeN:LX`pzT }{<֍Vd2K˕?םv19p}薇2ܛ'I&|yyB- y>vf ~qm'7cy=] f_5HSrD<}# Zg EuGsD%*&c(Ew`Nˢ%)H.oz ٘E@=`: `gpuఘDr8 ⨟\4: Lsk \ \7,FncujoiB]K :ʴ3-22 4 F5u o1A6vA# nj36[$lKM[ׁ,Z9 JXM(fp ][X+ x`S 0nh(yv6(ʺ_@l1JɌҬS'Գջg Bnc Z8otSt&E8_ܥ+pw\d([~2 #Yuӗ &[u!4Gԟz~lqx. )8^v5,P'~靑8M~I_oGd˻^eI7wZ/90 }ҽiV'\gUΞXT1ԅ$øs:QrH ՋxHp$X] i7nqjE8?Kh1C3_lVuKHwFYPZ~V5 ̐q&t`h2ܓ07}axAtɐy䒽!AVIh2vdjz: I NP@Lwdk olJq9%u-RY-w}.^7W>%qK/Y iS7RY%ꄨD"H(E"@%}:w$Gm2NUi>W Eq#%pZSK\J*!mET62,R8a BiU-U`JY:08eEOJ_ I(A;տw`*[uM"q/@uu,c._R_^Ӄ 72!xoB7f l~j2WE=_0ӌ@GQ L\wDZݎ/܋c;Tm/fVy|[AII\I "!J Fq >?p[odܡt^\e͓fgwIܐD.9* _z^ldĩǫv=SWɿF" XG)8PWfC$1ϒ 7@$$uLqAI'r4Eʣ$1r &^ׁmRj;2ɦX^ٳ]-!x/N#f=iaiG%\7m*'(zAzO*e~[ aùNnڔ+8g)2"izJ~frk79&LƍPcݸCqU6֕8#_{B^|ŧ#y&DZ*oJ^ Q KIDD:tw's2 l? WD 5ndiYtb6L4x;]gn>;񘢺b+HP:E-ر֛e8kQ4?覰7;%K7wET n/Z9V SEck .^\t~qڨ$P!g&ɍ9 - S4´40?p#kéNQ'ŷD=T0Ub6;"!op.⚎ߢj$:J?@SpEӅ xJ;'IO|O m,a<( p !5;( ;tvGv8wS \J:"]+>/;Z?܄Sݦ,(ok tlsz>+X,n(G"RԦ?i MD;7oZᇙ;ss^QǨe{'bpV%][0"5T2dH{)Io97X,WB'ObÕ*v6azW@FG/zzI`qz0'gBWQ]60s؁S%b؃*g|UTt4 Z{P?# S`CKl C hKvr#6r68^ d㇊>l4MEn,5졈p4qؕ<9q$ߛH")K0s3hB=!Fʠy%[YY37^R؂.W7*žnjGUO3Q\y)C+U@Mep^[XMZZ jF8]) @K'/$7`d UdIEJ 2qv"pyBS.׶%01;$8A* 4o87Rx͜!VTwTB{ .=G?2; SO19= IU ]Ý]p' f,qN!`HXiyt^ڻ/ݹU~>`oѥq}G lgˊ{VvGqȟ¤(۲BPY|5Q5YZ)BgzD"L[e_eIAՠS"oT[~σ/h!ؠG~3iã 7ktH1ey`5ki w% n s18e G)OlKc/=lץRv뼺O}%nUuEwй q-Tl]iTr0`OǑ9R%ltBsӀԠAv`|&{@rlJ_;9)-WHWWI4q+LҞ3_y6- CZ|~ &qK -8LJJ!ºF%W Kq566Ws9nZ1 rQ9K/+ՈfDغJŪ ?xxSoQ5/mL*bvia{ܺNe8A(e .λ&RE!9aOdY)񪡽I~Y!۽ _.jZ+_K a@!BES7 I$p c,u/I? 4=F(6)K+nC]UB[v<kގP͊ Kv87TGv^)y:4]T"WJ+r!CEK3s}=T_~I㋷}Sj1WF, jc[y{s|XN;'M KJ`D32YT_/Qr)Ӑm/wk.>%#WJd'R*ZN(o"$S V,b kɂi"!0 Mz~/y}*v1.\Ɂ''%RID'@PpHFkygzbU 62.t-&ގEUfp"%>W@f)cu*``׍CN&Q+m hc REӽj}J5ф= pOL?բ{v; <8 r&&la:օG?yWN WW}I0nZ4Y\&&bN4hg6ǥ2ggL_()}(:\Ul n+2Ob !&Le Cnl+]Ġ]h4 &+-u(0^B&o5$ %b0Y3p3$R!Ou@3Wx&s/6L!D^k/[Ū9Z> /"(9{Xcsc^vg@Ff Bigڍ\78L4(L:Qn5rQ7Pgk=#+/_A1zS#,eBN57|/?Ɍir*f r=xnCs97 TyFt1WɽhՆ!,QFՉeH:%˷]O#$C7 zL b̎܁Ceb "vLs5$zqfxM#ɢ|X3N?Ҭ* dILMޔ'fQ RVZ?6|e]2GN!SAcLy$<_Lz,Q`h~dL|9ID'+sC1M4T#ADf#2eDg\AC6 NQ>,J^ ƀ`p|j1.92"0V^P R4,'r%ny$T>~b?RJc^/9961F3.#mYTLe`աg] l'?7s X bcQȳI D NhS6)ͭ_1XPx1\PG,f}Ƒ#ԔD'Z XQAPrP\k2:"USt0ǍpD]Q0=~JXӟvz-fAR>b U`*% -  >VL RyM% G}%L5%dЈMN3Ꮖ$u05ɉ$aS#'M$,tGV]P$] 'zh?4 ʀȠ@`QM0 x?oy~r'0h)LƂ@"@cq?8DsA2;]=s !DiC3Y q #51$ F8Z<2\KF`Ah`nlR#T*I<:dd(2h$PX+ 4Ä $(:  3@ A3Ԅ P08(]<9S"p#3T"/+D~A˂1 r%S)G Ѓ 2 `> I1pH0 5$$TPuྚcBA<:3ౄ`8t }y`` 5`v,Zs_TX'fv!CPȣwg }E٪^-L8IHĮ,|pvM&| /g<]Dm#8fdߗg H9m'Kn -Wj]v5roL<[+:c+?ΥIx{ud\#:g GM pNANԖ\-fzł*Im#uˠzVA7s!\aCD; A]/5/+?+Ozk=.rHm!a 4Ӆ__|?)gGB_Qp}ldPZhmK+}~w6P Ee4 3, M%Nζ@B~8ԱZΐ\v FTȱ66ݶQ.Fx!,Z9lK0]lQ*9ܔ(@Q6*`0#ϥbݟ;{wvjS4岑s")R,\2s*֯5Jd].%a(I;&~o㿃 n_^2܅PF„/6H6q`'LY{RS+' U:2JM?[eeLh̠'e=DŽˀcu9nsLyBU'.{v&`D9m_ , i ө ]hD\?ON8hǹ ƒKpqe)06&OW΢}m) >RZz2Fڲj!DtKg@? G6 mU`oCel7MK78y"OX1 DГȻē6R*oF8#2C$S-$-s/D§lˈv:g<zma\N}iSbr r?zTpa&^ '48V*?W/gG=1N+yY7ɯF_lV{OXaӽ@8.3% kP#Ow?@uj/YrOpWx=\•qTa'͚Gq?߇}՜fu-fVU7^MOb`+ l`>;FYH@r֩K&s`p\i4$~\,`{NŤkfuό%2H \m A#!K 9_lW ij LaojxeLKG~Z`iYg >?tE\iƲ!B#C6L+Țqvxy4ږ*ˉ:jjQgE/`-$Z`POFGf5z}Tny.-?[$c0'YWB 4?JX}hU:\"l̽a04WW0[5'a'8T11+nݬ*F63_ꘂc. ijbC佉{u p>P։ܾV@z1/J,v4]wVP jHqȩ(SG92&Td&kjio,U,U2 %FLo^︦P6l湱*|**@8&,:iƇwJQwD/T^1;0 T; xlnz"-UdxpОt|3!yo^': hGJ;'cⳆTqCdNp4ĶJP:B y+[Kpr !&Oc⟣' {% ťy ::vQ1%bq2- 쿢]ѝQŁ]~E7Cz.+i]$dd[$(*{g!ǚ'n 0a;*֕#!`c}#3mRjz>P\>R ֌PDIWu :%㥶7RqEZۑvSk wAVy)7{q;Y ϲjJyJBuٵo~%/$dƘ2qBFsWYSuT-Z~RI@Yq91Ɣ珗3ţRyB`P{9wx>[G/srb°/gd٬{do[-g КI Wނ%3*ujJ_"Ϝ[<|炙JNN]7B{D}7psiQK`TE 20#% ?̔[H,u DgzځR=03 }U^U}|xVRE@~ 7f!2%-ClwNk1?vH*}_rz@BXOڔ,H]>0pfSoanި:n+V{$ĉY]% .{ݕz4x5N8Ԟe_/C=,7o4_Y!I{x(”X$V[_a.'I]u6Ơ.ֺzyG)dE7g~hLME pktVN3N2A*B+9psjh7,h9 ^nW])lM^L ʐG Fw2Shfv1j֠(/EmSrU?3_[ >^ţݥhdȁuw=MXrng!YNjsqh$vyobZs抂?}Y Y* s}.^/v4,pVR=W4:![w%賕 ώV?hY\Ϣn(~)c(y#](=Pik w 7BT|=r 8 ]Ej8Gx8.> ^[[~xC'T_"CF9froVnJ9EU2vix:W/Ia|;4B ,IS_ٌ'i2ƃi?Du٦k+q1F5>5& Zf64Z6v."72[eD uNg~a4uhkCn:H#cHNVV,7$@|ޗD=ʾfExFT7} :`Da ^NR7ŌDyNOuR0V"T8[l%Anr? H>ʹ-Ңd^;л#5Z\*/ 5M*א`k`OF ➎AO8é+J2duSꣶAY.J+o#.1G|*Y:~ z8n"^bokjOn?~eaCsFKe<4`h35A 1pãKV>*<#_zS9ΫW3{tZ+pRkpn)B BؑTQ6DTu4䨢_",  1-3G=`I"'#UZ.։ CJHV11 -Ȉ'@01gK㚆D \j!SoJ>ﺤ]Uu L뜮ސF,q=^Z¿ ٞ{ E1N֐i/+B&96!txVW٠ TIJq_iVӲxxO-O! Lakg U ׿Η{lcF `T\2B 6Gk Ch/Wik4 o8E{-,qՉ.`(T䝳Q*pE1R6S?6i`U(‡s4P|?z.t^`َĢ9rWF&G "Y0V,啖gi!ncAͣА>l2FUi.Wd_`\*VVTjHlWZL΃9tJ9A&c8Y!5XꁛwIrs/Нd _ aA㕢vr,<"iql6wAH1qYk T%xEk"7UzOS_5%H`2!Tװ{~@1\7$8=! &"Ag<R=F[[on/o%EW=9*_*:[W[M/]iy ssM`*)L ܋co'8c2& 2ɬį9?iFr%kCԉu%L 8(hVyaz>#FLGv c9W2L ]IQ <0v5Q]N6 }?#6 s&.f{ T%ھ]o#:@(g]8/?>Oƙ: H%gL4Aǵ:.QKޮ?LaE}ċp+\ Nsr nFa}R#j 9&ş} mL.bQ7졬#4UPmuSLd.4j&*t6}"Ŀ.(Y_jӈ9G܆=*O1^8w`F~\n;&Ԫ!zTm\uZ\,fomgY#z`Uk*X!Cy%;*Jƴ 1 8{g UOvұڂ1j3wj l.Z.pKs?>*kX^8I 4PuCpVX{1 Tݲc6+<P r`3vheQ X[;A'%&YyiN7qt_Qɴ!sͳUWVxwBd^صϘ^.r02g|P9qRN^JwRl[8I\ 348%O%nE,$2V2cMO;Čw""> qJH$%)+JĈI 2~êf5nc鮕?s5,rNڗk6(R<\Tw?zݛ&Pܙ@eAPEYV/OTTX*zZR_VA ]F+ɠ /̝&n(&4zhC!l!sQ$3P y\@P Nm{zϷrP$ 8Ђ/O7[V'6nu}`)jꆮOoY7lŷ38]\N{^׻~|i%uǍѠuz8 5L1lY>Cysnx.T2-y#1;wx֖<aEi4$e/x^d|M'z=v8^&H='y(N*6Wԡb?hȀIOmo#c@l l(Xj8Y!U+wSڈG_.޴ⵤl(YGy_i)n@ʟ5$P<Ѣ-MGٻPASw*|ք6!{dOx)Mxΐxpkp fa\I"8< lД}YF6z.uww2=~ +/嘟wOK1]ez?[K(QSrD`P%Fk 0} >Ac YM^(Γr? j7@o&84LRX`1sBE5\`*Ij0H8 w5q[R/Zxކx;/N1%0sx/H;Q[J>KЂDtH|goy\0jdQV_J({mUQǻ3C޽<\FW{~:|'bewɋ8^Y6 >mL0lrF"+pA1"ASfdTm|Xl]"Mrv9n:bofjEٌHٞSLwG"10[@ac}KGlzu*1{]^+Z'm.x.#4bgBCg|Ǡ<\5={NityڧpR?O~~ z&` b-`=u .0%]X!WāLV۶K3M5@e gQڒjF=gjqES``@` )'ml0 KXJHp5s _p0YǮA\I͹j8$p$rY<&ѓ yfr0Ţ~&` yiook6}"ҖVEWF?fqf_LZ"-e"E92.>r(he"9|A8f&FORYʨEgoi*cGʐJcldDr ?ȵ܉l߼͓l>svU>#ڷۄLuR^9ĎIСsR֧jJ 'qԉ$ߗm9 (8QEx!ֶ\ݥ~bQr|:P2OٚGSGjQiz 2\ +' )gl>?gƒ({є"] Q Z9U}UqlvGآŧshn\\Y Ky"rx;YpJx!| z~<^?WM^{ߙE( + 2'kZZM6X:{Z]NW :rp F)D#:ȖUG݊zkMS`pЎ6B7$"k:8T) M 1,s縭.&1f̦۬hyKjN9qk`OpB Ɂ bI[Sksn Q[XH"K@ϩ{d%W0w0.1Ea|&tf*0!z,qZPKR-)_IрkF )r nÓ38&:v[BlNI \EXݖ"΃'1$&k(§+dऄ!{&;x:*+3xxY9 $2Yں5 ;K^k1}:+9uO"Tg'2.>ߠw{_澼OPa^AJJшZ$J6N0YJ>,ƝYlXo(ɯA!JUZΞ/ŵHw#T㺛_0Ot .cƒ %sP TJ[d9O# G{4r Zp)j']xhdpO'ػ-N݅s~mE*8U\Eo1ەX H:DAQ? ph5$ g->Sϝ.Zttw$T7Pu9n +L *|!-Gbs3i@g"We SٓmF8ڱEDK PC l5)+.:!R?#5*qȠ1ehՠ($oguXy>FB=Q&llfFv>U,$pk<35km ynE9;HGAYuQk3rS35Ղ x~tt3β]Xӻ3j:t2]UpMCcI>-mWyEm⮍u֓ܵ0&usUգmJXWbB!hEf>V(vl"XZ(< 2on{{X9CI烎O r +iQeG%KEu)$p 0wDҞJ>@ J{3wboMVJȨ+b"d14&HaPfQs?㣝Aj۹3{kp^%ɫ_4j3E‡&߽{hmo85#,) oZZ]1eX2揢(\{+`7'<n&E1 %@& %r%01rE;QK^'4W)"'(ql>~e댱T.Q 4/?2"xjf)RHTT3e/_L8-ee]]>VW ~L Ahڮ6aU-I9{K ;8FJ" Y-3~P:rFMwȜ$c5,|{ӐJ +tŬxM*cI5|.[~{xxj m_: `)xD_ @3bpٷ-}&Է/sr[>؊U7qȗ6N%+WFn`V/`U(bԠin< K4[ `To׹mQy}L &8WquF罎ȁ\̒4& ~1zʊ Fa pH/NgUt[>e2bl-ҋkohbJ'[L(8'm)%BvC7w)k%]v!je?r*UG~Dz67j$$,?\ďm"(HX ;>P 47:9h~j." bPY|[*IF9+24R9 0[^fZY`H_| JEE/< }x{qY4#@?K`|T̕E :J^ H[›Ss>1=߻ .m?EBEHuH7(D2e1~X0|q.X37hKJߊMedlNѓ\sjΥJVR,%> am8/z/Z?tD7_+ }Ff!<2 軓@jν%QH>9F)y$ :ZizrӰ_t]m<פ+|s_~͍}TWTv,D(z.ۊ[^){}X`pK:{ZtѠug1J$J萑od.ngr̩@7SЈ72K,ݚiH{R6cPҺ2̋BmĐVGe E*ljEpgWn8Ւ\rGIa>[_I`0B@IdҊc){E ).[Oq>2byVѭȩ1t6"CZ`ȗ \60TݫvD~zwOՂrџ`e:S=tmWME2>YeZ ld]o[}Z[L9yBl.BIU '"X dRhj'=:J}^+XtC]o%s(~6qshʸ&\ TDy㡏j{A٬j/_QXR`40 ϢW Le32RK?P }OlPLՊMhl֝ dSS5+Q븍MP5E彪kO-:0LHEYVKٗ<>\~=QH+}-t OܶĩsbLԋuԣ}*HS:@nA$׌𷪖ƟL63NS ,G8'ߖZW2t%+9x[y:\ZᚹNI!Zgٚ_!:Nd19q_sqU˼ӉTBob|SO,ge[rzoY5]:)(ïM6MsU x/"M}Kթ[TUb{/XD0`V)5!dhfMeuwhp  -s {a"/*Y zÜYڞ}z3ԡRPi19ήj3o߶Kq ˩aq @:?* >[h"g7l0!HUBe/'"G'j'a:,mpݶ׽2ĘDo-}70 iܿ]x6AfE1!pm],[J:XiI!m(~!pT0>}8~?SqXH)b/:\ۮ7l9 ~.,3cIk38zB6ak\} |z[=X|g3ڗ-bލYl;qD+ [_ Ѵ*1\?v@۩3CטlsLY7>$ S{'E2,-o8i*w<=@8 G$ 0Bz" U\ŕ=6wv`y6/EH(J0xfXRPI<^jFq?bPnBFYN{'7Pg$Wyʔ @Xm[3pFqTXRk9JZt+oH5@<|_9MF.楂E D ; 4oDbB@ B mrT6Z[uYDflXUu9{tK}m8f) I(:_0 7_׈ם8I^9S9n* 5_ݽ?q[s|ՉIP@Ph  C<q%w:xyzR1u0%;Y2vX!P¨J e0eDݫ D~ vI0&ai02Ӯx`4;)aGA*\?ץ+}wM0">5pd$xZ"p ʼnS)kD=p\&`R{.rh&Zo"OĬ"4qr(`_GP(zix|bgwԈj`5 v|Wԉ ue\gS[7Q086>-(o: 9jrF@鶤v;ov1vKQ 1C4DGOv.# v 0͆B}|(v"@Z]M-ĊjB55,eW.*,12%M˩{h42@Q&žȳ208(i%p{Q[K@FոeL̐7 KMw&@GH:]/w>k A}M+u-ҫi׾域%֔r58+&L}Vqs\V&;4:3I5{px×e3 h%ǁG =bcf<Ƃ+< p**ʝ ߓ-'7US,hԸnL)J=@vav{$4}a+G:f.~_F})b>8P] sJi:Y.!1`Ć9E^Jo{ä+`濞6p!w1xsx@(wIܠ^lΝ+֌s %qi2*F6ؖr*$L{TDO_ےl}+ƚG+9d#IT+/-tRRhymT2W&f-hԩhB'1*BK-26mt+ T=fpny8UD>!Xf+άP7Ҹ3Kj4xDr!ZոKqLIO͔0c`y0:SfDzfnZРע>mɻaKm`Nkՠ=kҽL>-jwsxYuNFQSr*h>F*{qaK6$bG@g*(izX/{a<"~B~n& Dؽ *y@9(VD Ga4<+8_d["EAtũcrT+֮ `3Pe&,莥(@|%-9t-{C%_t> x88}o_ug+f0b 7~k `'N<{Z0691N6z@4x O}2[hz_,*rglt/$^zC,P]yaGV}4B)؆5uMGiKU$[f>ಏcx3_٦XGbP|:_8l)h]0.@fm{וd?1&^!i=}cJ.vm KsAP̛Nғ)ax`C 7  pDH+ $³ij_ý. Fi*np%$oj87Rs_rFROnfC!Kյb&=GH8y ` vDdә'Dd\U"Z<o~t23c<'qHjٕB78$RJV(BWD! ̟^H,d8w,;E?0FTMis9G/ Oc9[0P>2y{+L¤3e=?:a[]TvQiM*?${1q*.mBUvAyJ,L9ic&M=@ lF;Ҽ~ 2Xo@|-eѓͫ _obě. mE;YEU|=&қR%,4^쮻Bb984ϝc^1m+(;1Zy a`fDa>)p+/Kzn ʢ:(k%B ˶.*h=\%+:+?8m).wAZ96fCGȧ)Za^#4U 6MY(;H)킜ҭŮz]wD:nRfUuW>|KCQNjց!~eeBH**ѯߠB_s=0e LRsU"2wS$F7[Zoca0`.^w]diMx#p#N?7젂"mk:3hno~#)\2$ʆ ! G_E6} kc%$y/"?,{AUfW(AmZ4 7 3!J ScGza#\CSJyKdn/ .ƆɀAtc H HKcQWIPOV;?0(櫗 ս3QRQ28x׈ͩx]I}< Qgĩ/ FLГ@)' 8QlXG@ґd1͝Px2Q3S@Frc0s!s1&"nW+ɋa% lI~_L$I %҂cV8X8|bHH;(Z撲KzFxC40`eEYOR'K$YgC'@(r#B5gZs-دg/yO"߈qlD7+0=-i%?625)"0J,ɚ~>Ȋ6StRjNiZ .lyzi?-cM ͽ3b(#D/9gSy$Z2}غORՎx#q$/=D52s5zL7˫\+܄&"YC F^C$/JIZJTZP&pL)N?ֿ qO]9瘦q $.<\y  f2#1mq&# p|{v(Lb? P_V(&2WdTL tKQYLm8A51<"r*%;CTC<0QP Ɵab6GZȟ,>hP bpc -@m:vUNƠ}y HZ9!ZUv.VD4PJ<]C#[~&f2 K^ScZ #6#?[ّZXbB;̦S*$)3vhp̓@f oȒ@KHtl)c MBY+ $)T+%?>NeP(vs(RфObT<Mrؒ )(5:18j Xp XG#TA F@h|8: Q|X)-@.pbǧh|C?`q =P B'A1t? #`ȄzguH i?8T1h(z OAzBjzZBP%WU'De;xA' 2*E}+(gVxP ΁9kO`0?r*e6xP|SE!R`  z 0 Qc.U/Hag>4A,BH )':ځL/rN N N39^&3al-)<81Bу"Skgh Ad w}0$G "b@q3~FĆdDc".=> Ƨ@G:@U?&6P"Ar068.2u`2 A&(0ȉ* '4PA ‚"| -C@4IFȦcԠgqf2"Hb$-!17 A=(9 EPS\$"P\`H|XP<IB(LtL@h*}1:mbPSL(Q4$ LE Ia 2S #T#BSZ5aCX9 "1t#HМ9͡!`c(:AHc KL.9 (rs & (PTfkHB(ـ<< R(1`0U PF XQ` (V;4@ ouhda`vPR@603ׄ`d؁/th0<4tj"&^@/20e}4<>-teeworlds-0.6.2+dfsg/data/audio/wp_hammer_hit-01.wv0000644000175000017500000004450012140200333021066 0ustar felixfelixwvpk8ITT/WWWGHJVIe~$fϸroW}%w/3>8D1~~_? =,8t3f^p\&Ȃ*UQwoh|q+,[@z-i4nrfrJ_M&R%eA؆%eq1W2pZ{B_rX߉nh5~+w6"tp1 yp8޺ch4xytۀ\Ԣ 9_Ps7=#xYywn2v!tgoGWG3-9CC!%Tٸ(WƙC]VR|) P ;T~6E5m:VY+ک3_/fZ_n_ޮNH{_E f A﹑ͦ\A2 ⳷n&L^sgDe%T?:WBd N(4|"A)Q ;gJRXwuYDORejulz1‘\;:0?|nwcɿ݁콾 Wd!xTvF{8EG|D"/*}2T̛G#}4RAK BD`ui֗12 9 嫯`$?LM$o;m.\LJ̅r9vYL?g!dfDE}"^ه1֋\)P;i+ՑZѷm7lt3)!ЇyVG7ѫr`zzJ#7(WJ :Cꘇ>۔J7ƀbJN A7bxǿ}.dzX<𠥥T)sw]^Y_ޭ晳vl}^)r*ub`ԁ0:tP)nWǀuZ_ W8=4Wu@LX,ny#Hr[@\qkN]!2 R=P@\'.ƯԽi6:fIRUCB ֋ õHȈfUkHv&uM&`2 Hҳ$v ;+x2Q!JcaY''-.$u(S kJOGFzI*/"3>%*[)+) [8ᑕs Xy|l< ?솁=9TwftwG0<5OgP'7G U~õ*gGy{y?ӗn~6oe^aS raYe]`Cԃh[ ~Qڨ1K}cԤ{+9o_]nkq7lS*~+5B$@^oɍB8#tq#GZy#)SH5:ﵷv^t()Raඪ,= =5ck ]S:'TkA"mU#>ǒ>4RwMko4(?gv +ؠ %]. \M}ǟs;T)QP VԇۋK|O߽_\m̏g 0‰bT9(Ƭb@xc346i T_g7NK෱M"0([6w1yl<ʘM;κ8hِQgV#NBhz!,/fe,wK<—ga=hc3 4oMԣaLtͫ^YLe1~̭$%e^нyyb?^f -oaysW]󳆮"?UZ+ Q~Ŏn%[b$DU~tD~]qC/Wy%]FzB2s Q2C8B&R\u"qAѤw# p8Q5=>Grp\ŒDlQ_LtlI+U$2(~HōbK FmsvcSi?} pHȬ|q]W?w2K򌷌 *em3g;v(5 bXR{fK2eb) ڋvTCen)NG=(uVQ TeԌD Ǯu_N)D[b^)Bo(q b"RK?_wAL'T[Yn2 HJ`4 &g L{u}їq f4Xj{Mt;vj-l3t8EkIpUچF|d[N-s./_s8;L>#hjnD7;b2%U/\_T8U)mMMAULF ݫ&}IoȊ'a)g*=b"ˠ%{&4Rl8, hSdy+11sA"u #c1x?c&9UǔM $hnZfk,7JQN;W p`\~31!?^Qc_7'j(\La^[Cfs=DhPK'AE6ld=(`_V~?dir;)uU6bBlϭpxRBB[({gnGAxx˥n4:. Wj%&rYؽ:G-5@+vn" RIjc7<_VO!O[O\:P)qΆ֐ F 6O P|dUu%3#f;k3^Uf >Kpͥ@ui[SҒ%t+cw4#6sRjR<+QK\%eɱy I`$%J0)4ڀE-p1XӎAdn)S/"Ul~M]N0A"/$~Q>:r P 6Fؑy$>]v2hnILQPRm(>4T@ P##ଋKAmF7Kc )# dy(уl(M1=bF=zAl9FW=I=n8oRpbz\dR?ͬ9jwdXX:(^}_l_eup0{,{I xԩz"2`UQ#,1'8 CM M̖d5xy~v [슯e76'QYmr%^%ƒl>v-=tQ鬋A0}=}Nqg=N  uKu<`$dG˛R,_M10`u39 I8ڎߟ>p2քpl5x7YJ1bڢg981N]u!qVy>K3nk2Q*C:ayks,,11P?ڪux*lK!J-] Z faЧ56Kuk?QF]Cه7SeWЏP`-4?;7Uϛ*ҿ8c]'UBLD/nQ64=/ً_&ixb!U5Lc~SPi$b?yJ.ԝ~Qx^[~ tk\Z7Qmxjd(0;A^"Gx )/V!^ PV;wV)tZE U ڹ?!58GHZφhGiR$Qk}f9T74B{ ?9jEc|zJks+cѱ$l ܻ$!sC; )iՓތ|4י:D7ckg|`tq>rϘhA[+``isV38lГg[s:=b患`"ym~C=C0DVVuu~o yKkJ@H%r!]LD/O#>ɭ@C@nIIn[?oNsV/,}Lz.͍xgZjxq-!.LY!j㗮naҴXH%/yhPpxLqql8$JYR@XFH &r31{ҧ;8@:#tZ%Ow{#^ciPEUsak| !e@il~eު-Xu}s{gz>-OcޅramGzz(n7w["+px/Ns5lU18*Cct3GW 1Nn)0 xoIf x F)fϵk0@ |'2a!Y|+͝#ABk3kPو`BleR2|3%3^.2Ii@LVCIh] ܲte|6T puMw6$tyAɪ RL{Rh+ G@dpT<a!fQ@Yw0OGj]?ڋDwb-=pl7}|`Y2o%-Lu_aa󤽑v'JJid2Hxb)][/a}TҽofsWӉFB, 7E ZlyَGd!$2I '[`e^ûu" UȂZEq5eI5z+3tSx|?լ¥Hc\~~IjJlFAs^N1TI QW+q )Y9:&QlI ,{VM,a]l1޳uB8x%QPLd/f4;5Â+@X40;B>JgUg`s*&8\r暛уv?Ij1=Q| 2.קx 6u86UWn/LG֌ Pq20(%K;nWЙXHBHX׾S"to$uZ4IʺbNXp3Ax\e{4ćt #:w/ PɀpWsB|vĭk칦k­#:];s  ]UE<8V"5o v賓P[\Ri ཱིKZ ߌ|%Lj sYdQ;5u3PG3 p}[e nƐWa#t d9$j35uhe O"MC>FaiTIYWkH$h sIpm44@%Ej,$0#H<.Ise J -)RW1V0FK$E8>fK>g~HGܯ'{i_skD(&&nэ~k1fk6ܑ]8p 0*HQ)/KTqіςIޖTq6LB`@+ş1slu9Kq`zsQcSHV Mp"-Ϯ3XSE,U@M@2*@ =tWl&yXJ)ClbDɜ9B|pv܎Lt ݶӻW)3:]╗im>mYEi}^ {༩vd1G}Z ?1\ު(av\P~2Iۊ%˫nÆ/,/COpS@= <ҭE2o|Y+h?"~^T`IGpoC6K(<z)<6r{r!R>vO(MĊdpP&$y)Ev,y|_C_)_q{4K{]/YlA~Aff("' Xi+D5Rƨp+9I9ScHlɱ1).[ʗl{3VTRn ?\T{ódBvf'݌ 0 %;hz㜹_;uR@1ŧ T鼯Dh , I{U,rzxGX lCcd& R#pnlwݚdfD՚jiUٜdoy5 <5sas+ HS<i%ٯ"{7?57d?$v3HR0Y:4Qi8epv _;skl|^D"1k_wX>Њ{*# tT :n(K muLi$.ԠĄFI}UTM BTu5l7 9Bۜѹl4[Wl#H'}#&҉耫2i6R5m~iIa/:!KH^7/T]Kŕ$3tVQf_Yh'*UzMV&?b'8QQv]~\W.6gN&=#jb0V3 Mp,guW0hAlρ t$ׅ}\cфzZ(O R= ~!SgL#@wr*e;M*j|hxKqnn(KN6rW6ɉORdeM/^Vֶ 'R-]BMz.ē\U>Ί@!V I z0ǐHb7OYyN2 C>%=Q{FĿVltyV.BN%XƠ(-"&IJ2 Fbl:ЇbFd١̻?( dd7W ]#fkjA#q;}W*^ؖ_{{ swo m'XSPTн[U0a Ik cmEQA*k.]4bãvOi<9O8FY9e'T'&mO-p2(>ɏpOCou@DQEݛTRw{/dG1]diR:,g֦D#϶+nu, `/Y%<.6jXIyuϙ^lߵm?ԭ] 6-D/>6>t=$ZxHhNx* f`TڭLU|ınx!U +9 ֺg._259.Ԅcj_'{><뮦)IVwVz4kو(j U$d^`0^;Oz%]W{7Nq e+ u"!T! myy5D/Хč AE +?ܳ!10}`]UČޘheڢPDC)%%Go}hI! 0oޖL"D_ !¢nM:I2h90@Z脒(sP[y!:XU[XRܥl+RX+D^L V7NvҸhRmIޭ< H%LH* h.hkp[_#R齳1:(ŐHAqXEP*:%P45v.=6@"1?[;Qڂn@sê7Fӓ >6"nr bkͺ7YOe;8qC L[S%>z {%hf˪)V!K -2>({y?=jf,|>!V`ƾEpH<T JC[2LW@WLZJuBsfӿ=w&:. LnaSR @U ؄jdrqhQ0=}4œlFFbX

+e&2=+aW@9@ĕ k B$ϑ!b x =rDWԫ*z-I;ԥ8Ut]w(<⓱8o4|&`Ur ]gJھj䭮6'n JAIS]&:61]ȹ>LAo,C ucu,huia hRJ]@}S*><*;Q 0xubRz%Eԍ'qɢU-GHocK9"}GU˴f.=;5rtZ;GIBu NpӃsRoW:8a0 ?jwe3h߂n O ĂQ<߭ S뵫EsGBܴoSsEMƯC n Q]"``.O)_)t !6(Xd /\5qR mkYa1e}!Jp [m#~5)bw=ÙKt0}l+@+{$[Xm3/NOLZ%2\ݤZˬ;E xt wVlܶ#HF2SLϡ>nP|cTHt0 50n3ÙlvYMYp<6}WWW:G|cEQx|L~^J=묉 u@UT\띭yv.^4P8kؠP6nC<淗@S7&Z42Yb=~W~c^aGT,9vxElՄ1b-uJ)LrOekElh}`8ihEtT3wʶbԷ8ia,$n A_Z# #,խcԩD;SWPwu `=, #7Xɉ?왱ܳCJ w rP%4Oo.z)f&LJ>Gm_)_szZ(3mE[cQ0`M6/M^Bӏf\^A)tvUWyK}$cy@C)T|tJirs9sR߻%mQܨXZny>$?1-ڟ2K՘[WH*ȈN*a*دiGx!v%ľ"- +vR?|cq׹ +{)Qa&g]O _w 7AFm\J5L:^ȿGko~biqDe~ UCtIn{QnMRV~Ꮖbzc87c]mJ(TCSXA (M&3,{Q]=p 8Nki*9(ujvw{j(l}2?ٹ!5MTRٴT[ = =$qK:wy^f BϹCj{ ˶vv'iC-^wRf7aȟLJ Q?;M4]3E fk(Z{I`'-"/y{$~̜#b%m"WPsdؠ5eԠz#d5ߚÐE hmƚْ|H0qa w6 WVkLwDn.v@M"TU3`V+ nɦ; ac PL 9df5n3a 1^~Dylba+/9TV@V4 4BdF% G>7` ՝8{DAuo6>Yy+u+>ԁ?M(Щi .LPd8WCfOqP&Y]%>=ux.H‚? kKq\vm'p޽r!8') l ϝӝ\]Vٸ?6"4CXa'DK9"t3U_Ë'pӮw>?g, Zf%Ķlã);3vDbI5$ yVŃ@8?>Ԧtw"rVKI浒jʝmvF"$&CLzzd1ψ; y%yg|= ǴQb {$P-+2DQ,**ӟ^'2' ͯb=WDmvLXD`~¡9^k&b VjXntӎUwPWxjԑZᮦwF6p_IYjP2W5m.PLxY#9Tѥ;CnP{n%yʲy7;JdӍ>mAXQBkנ.WPе\E [I͐P wk^ ǧQj2co-]4ҌN*p]v&|1o߰|L?10)󭟹8<|gͼp|-r߹l CwuFØ_,aŁRݬ 0ȏ J`$J?\* 4I;oH z;fgcCI"fc\, aX7g@%i,Sbx Hֽku6gf73G'^H9a rA٥ә8ՖVC{5$£a,/(z%ڵ?pC5'Vk|dGl%nYRӪVoֹHS2=9giI#/jć{7FQ1~]eETXCe0gtϤS06>S2&_9@QK8JĔU Ĕ2VFj*M1/1[m! 6`Aza#:| km\N|N/LǛn{{s]f5Qٌ⫞_l[ Vq *ʥ>!'݈"G;.\)bsd^}yK@^esCߋN;or?ͺ齽>iݽc;_"~a)GхZlg~JxJW~mbG3xS2zLɿ kE{4:;z'[$n;lfUY4o9>%%@]8R.rp.fޑRqM`( (y NZø8fǗg< cGg6lXtGL9Ub45z'5h~&Ѥj?p'[8lf$]ϟc)'I_*Pp|"hzo̰; ݝbҹLaN7eHDoCqVh sur=|Icݪy]e8=bҠ8dQzaХ5yb3E5@B}YMuS6c] '{EJl;UFRvtk{xTpʾ;֋mqV})zi7涖SfjtȭjcTQ x)Kw|S|J% uSw ex8Hx\2Ã=`@π3`>!/6"ap.LN+`HB h ou& >f0L XC8tx@FEd9@+ax4ʲ'L31bbd Sca`dfTj`gkvLx~]6'1teeworlds-0.6.2+dfsg/data/audio/wp_hammer_hit-02.wv0000644000175000017500000004477012140200333021100 0ustar felixfelixwvpkI@E@Ec[WWWGHJVIe$=76}oV;eQAox}B;߯/}ߌ{eߪ1{vx|W|>> =ew;v F};!9)Do.K+q} nB]zNV_%WuSBjfnv =ٗKwz1>.@Ukk%/]8R OP%!^ȓGNXjN/Esd2{}&2 .Ђcfvc[Tp0Q%d2AU.+"l}!E]0E +aHL/gc+EM2Ti #K8}o +/YSZGNDL|VO06P?[3<,e3`@!Σ?n$r !wsBkV(Aޣe_sI%d[r>iAx0V:L'q[% ]m[J\3QI*ՌS2ַLg2l Lj"zҌ2f+?\8$?j2[fh Gnckx!kdGpf!=Nଢ଼o3x:骠k 7uIKu&+C)26a x]ǤP5)9L*ۣ`.wx FOjYHiI)R؏t)C";P 8$6MQbݮI }S9@k!KRL\I.6N;d-j§}XԀüv@iIJkZ5ߧݩ.C3CQkrU0FrJQ(v(s/nN%Z{mtOw?Ɵj.rn<ug m+-vQ^zX;ힷ.c@dtd^#kZ]lf֌}hy`%P۽~WMeKL9]`oH 9{%}xycXs0dFhCr`LԋU`$"~ƘOe-|)|;7E!L;|ۧ7_SϿ- $[M;:+JvVd+AΧ?MU_jg/]ɵ1 `0 M%n ؞^IZ - 9f^#*g7y ,RWO4@u׉V"ӠM_yv#H,gh+!m">ŗaoS ?4hSr_?t 7!7b6&8cgbFZu e^;HF6݇Sb;?t#R3]/8]V\)5zauigֲ_O< 8"si.jQ9F3)/&\q4q>Cn' b!{6oȺ̡4Vި*q J]de-Pm!N}Yon/U[Ɔ%Af);ƅǁ+8Q}NaԨ~r(mg h)3ԀiN%6ҽ6Uo)5MC-D`}zC0l}/׽m 'lxxW_"=JNzf&&;0+fՑ}""̓QecyG:u@aOG My@[9#7w1iEfc`|6ЪŪv<CW { Fz% DX?û+&4$B1.,DmB"+dkOi@LˠԅPwŋ8G}ky6m5>@,NgB,{'5a0$.AI/݃@:q:IݙL~1 j?Lb4D03+h89$MDi?m{JW]pQVoSs$LQS0!KixsQ̤^*JIM[@Jm0|x0kQ(xu0n,l! |l!1;(J,xR8@==J zu_Pz2 1ō>-ǐ7` Aȗ&^e@ pY44V.ҏs`Jw: ,;S@#A>mD–GjϢ3);W v]59_f&˪*Y/ʅៃJ*f@ᎩJXtij_?vT+@ɫZġx{USꄫG\G5&w1 1eyNujfӉyȟ$[i:"=bJ5rC'S}~#P^Iornw_T6} RŋRD0l\3wh:,t|e(Lʊ?cU~[ 1MvO{ `Q^#EiTXsH6-NxA'i$FL}ཆƷǗHJ}׽Wv+, aW Jx 17&Ph{9wOAܟScDk;f߈|(9Wo_. #[\){]_o2ud̹?Q7V"&t[6kŔwИs2t+B"Hm[FEUqAL;~ [/h٦H$91X!;xR v;N堜|zƱRYrȠe-^`ۖnyN?:Q m!e(|Nfܨߡ\v*7^S` w:#s?ܺj~JJ1'O8rfᏵx{K%9< 43J^ܡEXL|idhQD4-O)R @t]df9w06K}S!]r'!qΈaYN)r>,>JT+_RTp6@|;;5^gGQvo Nh#25&'}1FdM'\׆Jo*mwAsuPiDՅ-UN:MDQJeEV߈m|fȐ`&4ᰚB,aDm"A$x6ĸ̵t9oRJܬ["* M)&/)VC4lL*XFJx*$I0s"̑{=UtŸi:Ŵ]!:p,J}K-p#09f'/_MqeM)T> OD.UyS?&CQ6ĕ8< ?e 9}x Cuhڌ2[B-so w@V1Y.j+F[ b(_j^_k^, i "93u䆦X78IGUf9ЀFk #kg7IOKy zЩ.;+z%%.jSј~JM+iFEŕuKyoWN x x,U LzR^xiHi(D^NSv>4 j[`+uڻW25mQ,R*Ǩcm+ΉG "Oq+} gh$Evd-}g.TB=5'2ЈS ੄P֜UO)GK(9Y FӤHtQdjQ/yqgbج.߮coUo4D ;xx_-v>MI=l:k ih?{D H՝XmD I#ŎʤJ89Cֶp7 >θ!>z,$}~ΪIuRÇY*g]ߨ%2es>枌E,g/0 Ժl)w'x);PFT (Q !ZeC'bY!խ_~M$gUQ/ /! Iz"TYUU'`e(v-3`!1Q׫{KxgҾ)b vEpL!WCKDf 2b"d@=s1s 0<ĀDo]lH,z J.鞐wp:oo?ˣG9+yΡgV=AY>kJP?>(wRt̙ʺy1A,V@[\hT0M#50qK>JlgDM ձqU[Gxc^0˕>dKH<`&iIO50ŒJ&fhnN-Ձb_ /g#dhKUtxnݏ@JX]Uf]*^[ iy36bpR+V@^֟ӫVk@=z$i$at!TUT+"!Oڟ h f`FE8TU;("F x! AԛTa:DxUb$ KU0I؄n%M6Aƾ!zx3jr0>?IwbJabM8!{=}o;qy *NHBWLbA_y4G"g  ÙN"Z!҇OBYX(_*{9]܌ a@} VR,0 b4t?9EDOaHgKMC@(y GԳBunƗ6O[u>Lm{["sa?%GΡG8|G Wg`ªC*z;M+Ns>gK"exb-9Ba5}G>am:FD:Dߨ,T=ahtUGbXJ.50>AcX2>˽hif]fmlM3 %- PrMc1]Q )"'pݘ.SugqhcA}:#!g/VxeEdݑ,W P5ʨSiB+QfSқߒF (L 452bXb\Z =9q[U2 \)CH'#@H/0ͺtHvGr Ȁ6f`D6e:|p)HaT~wHLl*g>OZ Iy[¯I͝}j&hi< Lj4X5IG2?4!9|:d T@:)zdh @VԹ c̳4p'd . ډ4gxE^UA5Qrϱ =˄ƛ`hxxnNN 4 8[eoT/'M^r-!iy),ơq ?=1?)iCwV}ˮ2Хϩ#OJsb|]EoʉY2H62j&O㔒PS5Y2ӄRdh麠glv)&oKsH bjYRqrDn5bDɹ9`X?Ljt~&=y'oCEh1k_%z(p4l{C_LeN\^l[QPPAE(QM!c&(s ItO]_dqd4gmxxp0TRcMK9&&e2fDY{· 4^eR2B(JR-K<G0&aXet `H˜3"6r"P9VDH/BD+2|K0,%&1"+Z8ncqro@|i0Z( ~AdјbhMtQ` BIJeiZwNe‚5۫nBS u[rnBLq2vG7/_vjèڌ\\(ⴞ+ۋ|Ku2Y|/j 2Bq?u)&bZ&+"Cmt!Z1/@ k.dщYO61:,UQN/t+&wvLKL # ],+s#}] TX|Dy1 )۹b"֐,@H! h8 rED(WfaCԊe$VZ7xEV8y ˍW١C ȤX.!E0Im"=Knlb^8C / ѦA$]Z06Nt'oh΋>T{?'S.Tw=E?//`KXcgw:0ZyBlw\oO>oD%: mIWsdqG?1B..eȶ2JH Ct[$Bd&{\\%RV=SmSO'@wF.%92 DIyIK#^eՄ\:$gɅ] !X]Op w!ɀg BOcة+7#5LBk%\ Rc޶i6OQf|AT1(eiFePfF{M3fŭ.57Άix;|ٕFA-~t~lI9" 8~ʼnZ.,5&W79"Gv4Hր2-f?^?zE26'{LrgH̋ EM*.d]M\MQcbC$#C76_ugDJ^8"{;!L,Uhe j۩W&8F(?:O yL賨D7륯t tٻ!toוEm pe#q /L_ژK/`RQ$pbso)gHD'ʥ㒖S'*QpoJaY ;VV1žnNSN\o|EH2IS{,v .DJlX:Dsnp]rzg`651Z1$Hq]uL=.~A\1= Xd.EJwj*5a5*3P$n34+nPOo@Z:e)KmSQTBreM]P2` DL$5W.eU}R(u-8s e:P@1N:xw_5|2g a[Nq1QyjBlmDzG';i>ӱܴi *3G%`s6s#msB̘ y%ķxč117wX,xF?a0}p$P*G;~o Mndcj( {v₏iz w±ESůi& 4Ė[x;K#0N9F/x)1Zs`6 R0<,@ :)_+!a%c3+nM6|#epi&6S.Z'o6Bj<-%§\asQ-JЇ`6/Wgnſ. ')uaےN[ V#nzL*ẀwR#5l+-;k%ZY-q,4#ز sƦPLG[Ŀ?5z5"WR'57ع&Zv̫h?MF1YՋLFN*vTBӜ!&0v`MJeN -M~/}Y@G]×c>,w|s {(NLtl;+/W, 樠Cwk %CqQG(sӁ[e??|C9o2'2#?}d_6Ԋm3Lmq hvnq9IUw]=jؖf`Mu X߰Hd2Az|N9hW !&Jvj}tN:s߀ʇZp ԘY#P@DT=a\Wf"EWNrI .W)%< ߛ%-lƆ/;O>]H +cDka7/TN˵QHs{[e$}.[L0hLY*JX+< 30WЖ ,bmphktexUPTUslt8n͋~r%)̇NcဠAN:' wubQ4َ,תFvlbCIh7)z3gfW2IB)O aeg@V(af. q.p2r6`2DE-u f52ʓt[slT5)&K \g%96]uHf4x\I) -D ɥ@8PMD)pM7p]uCce l>U'EIͲbEV_Hnm6- ϓu2Nf ؾMP@8_K$48FmfThk# {m80F bߪAe]nu qJa;GR sRɥHV\Zle'ctN.-MDdZ MYnSv%Jl *Pd}BaQvp(q/"V8Koe9nAiF x I̭l5s;ȍ g%,"z RFORB93 P:Wu]A7p*@P7ԧfd}Y3̹vEͽ)ۿ{֜}чŴՌ)uF/@jPHQٌ墖\͕Zt,%Ҝ*6v9VcFm!ս&uc$4`}hX2LVUI3qU6p@.-'Aiڗ, E)$)"q_DcR?C^cVdVv\'/]h Gd1kCArCuO܂.3^eGɚIjI'WE8tUY.`!/cAR.4bmmRyR|t2}Zõ!pS#]a(eUIZ+'ߑEww|?.iδ;ț6{FBnArTG8%˻*d|X&Hb~4WеsHjI}=eIfXV-/4__=[,G"Ɓ_Ck4;lybC/nWc7\_%|/) Y:Cڍ+u8J7w-ȕ YÓХ}eςo6aJFٕf R]N+\CvQ;h s˰ɎE_ Nd9fTtFe6,N$XQ#l. Պ`gl AhΌ?31Lܹ]WTr?GܱVxhI&.R{:Bv!hSlU%X:-ِڢ1 r%2k[Nk V94;(*V˜AnM!TGh5j{RxMb!ad؃2&G.a|2 JZ-lI[ DŒݚﬥ1%ސ t*%'6ha=fpɴ%$yy#1۶`xoϥ[6)1ԉ nk[v/, jQz( =)~.d/E=/W^7еG75ȂkZ6%QN_cm ׀ac]ac9!P[@A3=l2&`m{8KAxݡ:Rt U~­UBɘrWH&!%=$jG&1 KDJHh)2u*IZD¢2R+%8r ߹ănEߵɸD-[CYJK07OX.'3Mnq6SmLhf ꆳ╢@h $= \% G%uhyV+`Ky@4#I ۊŀҏ|<|БtZo7( Z$kf*bL>R | eSVu{4PU&qHCfHWDπ0C; mgmw VbWO7L`L8z9yC &#(>ą*ygzEbZㆬM G4"26ySiuZ_x6OC%&qAjm۟k w(R|F% "qQDˡF_pZEkߌ~4W0J'hUyxW|k} cʏ/Q,;KYj615u(/p`c4Ah{$=dcͤ)lL =KW-bKoamfdXӶGýȯtF~ULnc-K:4x?CN=o o@WLE(7YQ--^M:W>`gKtcEyrtԷu 鶠Qq x$E9~7xN^=wR[w뫺7(X&UgbC_q[2GȰ7³"Á}qHk(睃n1P4Sè΃xiSa".@glu4Hu9c6J@s6qpl(c}pY.S < FO$KM~!72w2ؑfL49 T`!ʴ|h*mpUwIթ: K2Egc){_:{S\D0t2*8TB@+*QLf$ĉ>ep@l,}Uu,|H=ri%Yy=Dן k̐jh1FՊ.AEy){,MHMzOf <-<[*:h(kwF, k>*et_`܈ |u.K{_M q?}Sxsqe׼<i&0zTɂ3m4?A&چ7v1(I4e5e¾)f_{^VQ>|l\ڋ _pCQcq7V)Äp@.M @4jv ^v!a4t3|5Ebi L&,~ OjV4'iiekJ*H[[SJ͉G7K?lgM@9ZFџ QYq0FkH$ uiqRL%J)/irbsu^wdKxxp•Ibg0hSGjsp``P-.A%UW };&O#̋8@m[db(`S!]KPyj*sD y~n}bAqnՕh*,kb1|soqPP߶q- }MN/_@yPyPf4 @iT7Ol|4*_{-qBNj߼c_°М/ ki*ۣKtv'w8Emw˃ =:dWǒ@G _vuBG}SC!fКֈL s #$Memx-!A57IWHU9gϣ*%ic>կ4߹|R " >pg^N/k˒%QR}1-ԃt y?=d&{6Θ0mw=]I_cEb`4J.^żUg"F:#=:OXÓVM B9V$Kjox-F>1J>ܣFlV4`Ɛ}Ya"7*L /#O u g@ uzmH&5C![sVF,Н;C.FEݷ^ʉT8&|Cg7^;œm*PPUOb\d6;9QN|p";T_*ʎ^<iYgrMTih?1OK$ ]rMmGEv)Kވ2 og]->2_C_5C })xvX2*\TsnB" Zg8Դw "8B0(aS|6uk!n(♆VXN:Kw LՒ-UAgIUEb@w^T#2AUzm1,(QmS$΂F"2 i^ؠAgh-8 >j%IuŕB hնH t=~A,d2 ǁ/fc"J1d(2x.Y @w7SEj1ElnF@0 3@ ;x g aq#C < PC4 0 lpOQ@3H X`d`2 a-0S,p?9#̃50`A@#,F+TYteeworlds-0.6.2+dfsg/data/audio/wp_hammer_hit-03.wv0000644000175000017500000004422012140200333021067 0ustar felixfelixwvpkHo;o;9WWWGHJVIe&${r>??/c=M_9ysp~)7uZ }w+?{C[Vro˟? `|ftB}>*N=ωw9ℸ !ꄻ6Zw[v{-?ؒN*WlK⹮,cAW v 9Q C kO4SH7B ><~+?hLbt[sDEQ :Cp""v 0dۮ1hō ҠUIDdU4ϻe`*,5#+CvOl]uD vP,<:K`A uZöcèݱ=JUAVx!I%v" M0Ơ MtYTM+H?jޙ;餢#3P_Ed.M*I.VIseȊ]oP+:2]nH{? F j^6#t uzp|AۣŷlE֓74.<<;0s~g_ت/n^59wX.3R8EPBGx`s‘oxt:)Mwj汒,r\e`l%>[Bՠ~R]a n(SJ>x6{Q2Ґ)7dh,/7H,bR/ yt5i u{am'AJ2g`lnp21_1ޘ2Ȧ/ HžP)/$@?F.{%skpTl\_`?ԗ_$BsS#7j&*G?lbXꋙ"!S]qĬ_(2Qfġ$DC$+1 >T9L up :??m_O{oA-<$֏Rw\I{tuA4GC`u_;6.SEO5N~+a_cQC#,ȕ+c"^8ؤ@$[rprhBtx@i. Y"x VhG8+6D8OhoV^pp.@d#&,vSy3am@@{6ݧ{fkUzVݶ_ eT!^0?eǹV T*e05I|s\vitb90 Rgs' ċgF}\̡ߵn: R%$P?*mЄԇv݃'IHmq$i}eBV=w/g9g ;Pa[=|lcN[s}FW9if KS` ;\ #c֩:ޝ3AJc-]g: ECzӸm p´7D#=1iyDDCIc@卋S A V|pi[t/3+aT~@Q)exT?7%{*D #k$=iD;ai([JN6(;G,Yi*NZ6ѨTn1EjO= )cL|ӔznSe2SݶpuՖRk|R3$5Twu֙j`<bf5o̾ LaqўGʹ>0O*zABC.1w,)!D `i],$H27-8XgjhIe(X~ou>#R>>WPfUg`M50Qi )ut{O7gx9& dƾm_+ܱC)yg@o`"}~H, xwn~@.E rSxgh͘Dؐ4_ãoBWXƮ(3N_(e_bජ7^ftG ?؊*QE h%eir"ݮd6&>iUw%R~Nsdgy/>IUޒb}SՔHR˄2dXu6Q^?÷?#t\(XfRQȿ;| ]V6%zi4yoO!#ʻUc'   /I_i'g5LE )2Ӄ†ζ^,e\gHfM-4O5`eIjs;֫Gf̪NS%r9Ǽ4]GM8]sȏúyjY$,:rzQ#K'J^!gBd\^AHO@K ZG^39Sj426+Rb6-}46_\pFvg e0%MHGUp 4i*6Go&#;q<ӝݾH6x(OAջ [q9c/>dp -z#oV"y>pae7Cݔm mD2*diw9IS4{R6~I^ Z2j1D-b= @_23_f`OPUbNgQX?oy7OQ] u`ݞ3^@b$ \pd:?-LPOvc$ " R j>zE|<VR u* _[qq0]`% ş鯊QeQzO>rZ#R3ֿ*8SsjRT#ޞ; Vu83rfs3 ~U;Eb~3vz+\[[c~[.m9MIB%VvK4"ݿady&pȿuwS4q!\H;ڋU WENAm'8FҎX_\wl2IVe.6YRBk䘇`KqR6&8#=oc=פ(T?n[U$;'k{k[!8;`̩%3 %J"(n:px榝qف?¿BTfQipDc gp d53dMp@<RQZH*{g6uvz3;!߼,N|pE?2%$i?")Q"rWf&gu PQ!7U*KŰConȺI'?fRjCؠ>hj,P,Kt DIrV2zD1> XG j+17Ō?-%rCj,.FL^1e4Eo.up:]X'_Mt_`{0\b 9GOns-HUS^a IhG٠fDL̼ڑ^U { m1֒]޵6R?T¦}.\`'@\'BQlV=Pc+~ߋ7燳fRTZ'J2aeobyZ,O:g+ R))cƛphg/؇FؗE?q<@5ПU@Rηmt'))ʃؚEl=4?7 5xe3!&VM  W$WVfkÿ~%)ŷa?m^~T8`S*^QZ $Ѷ_\E`ejș)US@jP D2`P%1!TxS>rDE Gh H]x+/wzG?7#݈6CQ@UP'z{9p ,ϩR-MuDU{խ/m3at@0${KF,D)6WNXx,u daLw$2w-8M'OgX.)!ELPDb%nNB)p?eqZWGvlLb_|/nJ-#>Q/Ɣ FX `88s!~ەX=c9TB2(2V,ve_<_b~i"T{?tO'|@9%+T;Du(#^掘Ƚƕlc98(7[S@oIP-2G{{ږ {;88#~)ْٝcGu 0Ɩ|e#:\̈́ݵٺP5g0rtH Ʀ>Q `ۅ9_X 1D1sVaEA.b1r@Sg9u>YXccV&%*D,!]1jXWaJTZ?Ek[܊ ț jc*[ ¨O)k2A=}#^=x%8HDtm F12qAZ¿u^CΧě/4w ? @*j$go.SͶ(q^SxG,'0nX BgiLsaqqYpi\fw=牤I ^}1"@:'Yxj}{Jz6J? Sr 0M } d(*J8IV%ƌJkMvM^Y°nsih&}KnEܾqr*R[aN,VE=Cj- E3_8CvI76ݕdS#.4eb>[LS{SJòjhXLplMg9-Z "uVVUKnl;lyO1mJ_OvGoByB/3j$H |"voMDB@ᐺ+a}@Fk&PPq%1DcttRꁂګ{֥\ƛݖ"\ ,86Ξ e[nZRzR8UBR*gY{O>*Ì07ӽQMYή d. $m62n(_&BN"Q%f#Pd qKdJUC Ň ?@ X;:-š4wJ}&Ĕ$c;e(@I<9~ 1asٔr)|'JV%1+T(R[Ev0Hh;Tz믏R@O!/Ѥ:N0h=ZHy,%EB+Cu6sb,,/շ\)}yt;t_ÁcjpIVw1_i=8m3/߿EGU#"wTcb? A!_m^w_G4|Kesv}W@z}num[vd-bP\ ` "cYALaijxՖ{nnR25ްZhҍ*@ rf جc7s~3Y'2l qh n(U`[0/5.6·Щm/qg tܫTT93q_nXYc)?4 XiϪd#6|n|Fj -r(x0VeX1.u9H_rm8(Pnrf MGdIqہ VJXy'UNK:L3Iʛ4dG!oe xyc^ 2娸GQJnA}W@.[  F4#.N$SSSgiX"C)gu2m/=(rL&8b,n%\j? :^ 4TTHYg_q=2~u9\(=$ o-g?Gu3ϗzh !ϑ![3wTϝI'mHxv?/j $y2wahtIdx,CR⅊nSj8~i*/Кd5xpJNOo.mA8geS6H8̄}e}L.iȉw 3#'|ЭHUN,ӀaTju 1jYEhQѰ<$4%^a"CM0]$,YsioNADP*QmxK\Fu @mmWUn|rFL\pWdy8,|$Zi ZPT)NY V߰ ǖ1"xtD/DqlapY?` t߱Bt1lm,Ъ%a#7gs/E1RTjfw'I&m9dsim)|i'n-O>iaIYQ:3d7TW،(!S:| FUHW>1-fщ§[qo;z VҔHT!>Pi뫤T B>l UusJ" A.h>~BqҋϔP<1bQ~ʠMՄQ&[A\簖Bfpe|vR +V+Ĝ~HRۨ1Iфq2ج~zհj"0sĿI}DJlfyoX>R^&Ҥ|4A'$pАK6B]/nY L0fh4NvAB>?Ũ#tBReH.'5;ޗ\6|0cbDN$d SDB<`ǥ ayxr(5]rӔ+o&N|HzfWȂ9AߙOp݌tvrNߝl{oVL5!wJB}keXy޲-gi_aDzJ-k97Q,BR) n=nW넨x6E#"`Ns8Xiy$))] tjףY\^& yO?g1ogʿ0ZGJ"w̩×ϐ*F_#"3;9ֆq d^]Eeim 65b/bz)!A&t['Ȥ\FfwCȿߥ(fw4/CD$kNd/8#Z |=z(7ONM>CntV T{ aݡ!2?  _#H3&hj9gWI:'_0a4TԒ 'E?V"g3wÙmVTBd8 eYo.@YmRyR|\ս))pr`UHj.#HiCwS4'<嵰3/XnSPܞKʘ#pX? /U"A5c+ºD2^Ahx{Y߂}O €`uۅ dkC`bA}PM/T9t,b|-\*ݑ7`~U+tVey>|&SH-TAxz>b́ͪaR§.1i6ƚkWYie*kHT P rr #ٸ!5THݪ[D̰UI"-GW43;^jT}"C$8 85J4.0~x&Wyh 'JuT+a)1 !XDbڈ6MЗ}BVMA*N (zBu5X/9YM7FD6.Ԗz@*Dp0Wʖw:"|ĸ$M_F,v" eRDcXl2Whlu\TL* i,TN엊?v^8aCE֡U@O%޾j7]Yr5dpP*G =Z3.G(&tƘ\!Q"t# Ӧ˙/TlzNs"ϵ4 ZsG̚Umˢ&<=&\Vh<! ocyfw"ު$w|-Xͩ8`rXi-/g-+R­KJybS.쩊NDSLW§e)|Ȼq \a2̩@&k;;1ڌ:MEmM_T˯~ \j+-=A֒vY-G}m\B,U`#}|bwl(@C<@ЖTrztx ,HL@&*Hp?1mfOtsRPϸ!=إӅm,`!Xa>O#B FFՑ"QA! u%*gvS_cOGPőpoJpy8(~;WMې2E*ϋK?^?/"\i$$qD0VLyq-E\zTgpWT.#,3܅bdB--SG;KP$b4 P]A,:@:x0P+"2c+Qpޖ\;p).[3Xα<aB=[ 陵#`kD~-/e=[ 7"+%@~ MLs`loeT1 <Ϯt;Anp~tK'E)V\{.LœJXLjA0S4̂K3ɝ;B?6ꯙ %s'[e\@p6zY`9DPwh8fU(hvQ_Fpթza>87@ !3,M!J";*z~]MS4O~Jt6mI$ DZjtwF'dIPQw!l_^5zvո*r(CeP,dƁgLWښΡF|Tj^[؊r̈ zСY|GvPF% b4kLْ&5H08rczc_d8םq|0Ggewǧ_:mQ{U!x!zľ~xx /ζW<}9Qծ9p.zգ61XMH?X: R=%0BK#!u_]=1( \ɓ3RR 8l­P"JV4p1:#VeE ! 7GPhd [F, d|pz^TT׼4 A"Qi(5) ijDz7yYĐ,(Y$! B!JQuva`hI %cR.ŕ 9^tj%iC&Ɖ&r @CH̙t&h"K L4=&^PHX譬VIӰ&NKS<.CX\8-;tRg4En8@b>dV<8qkBbJ3WF3e/y w#4|-dTjԪ30ע$=2v 6%)MY؁l8M-CU !Pk T<;Bb PT&|1UncΛm^V1?˟\SצH-g[7ِvX]<\ΣuEMHҀx|4DW-WֺHP]!Y; +p$67k-5 =.*={US18MѲt+?A6$̀ {qqf[g>b m4_>3Mw!܆' =6amٿeԫG Jްjf?҈Y(7gn:ՔܨF3Pl3`m!^^E%DC!)_aAxQ!fq{j ׫aa&9-MXzzEq lLjy#ކ}>HFYC!ռLC8\Te2-QV`NbxѤgl8Yv#FNia`u.R ʗZEee-/x k2UY?#0}&&ljLl#୷ s$)3]Fjp{!;VU(li%7Qb" y}SNH@IC7CPrD 5C j dl%H_]h'GCrr-/j6 JG*{ ͉ήsJo8g'3,g<+'!"I/nGh?nz  ?l=q} y *>sq^?螑 ډa !MDz_A؎TNqv^'v2XqE/p#$- siʴ8dIyNE3Td)A?4Cp(t5*MA{zEŊfFGݧP3X5}Xo| ApЖڢWqPN :-`_0C~m"{/+@a d1Fu F5&)nRB{V̩{_PM]g@U9tD=$M/@u$B63-QiRn HfPdDֽ؏tܽ\8XvRkOnCh@hvٖ4ak鿒ws^5u8wu(%rInJaSDZe$tegfxbzآLKܦ%.X X]8P{*by-ͺmFWA rrՓJYHTΟLyMz-7fD3 ǔB 0:N&јĕ$N36"7GƀEA*S&Xj&)N\.,loG Bs.> |+ePgMHD{ ?M/6yZ8Wf־?BVQl'3؂k5\k<ܒH͔޳*nnNˍϝȵzwj殾f ~=\DVcƭ}2k3jsQOk/YXp?%XV g\+9Nlܙ-YCcڹҙ3A†\i 汚 ٴMD'cQ(~. n$k 3,JV^<23ۊܱ+] d#LDDW^=2?:5d8؍Z>K:D}<z̿3v iP$l8+[.USTu۹̪)mZR1bq@wtGyΧ>I\^lj?/#V]o̞'㪥OC%,_D^dm =Iц[0"}[Kx1R}/Ἑf,3^*A;2x d) y1IeV&Ah@@1~dn% _)Tj6ʂCmM!r/`IDfxH HǬvd#xB5K[!7v@&а^SI78X1< ͯwMrBK ]Ph҆%:(/+'RGOs@APOʻ'dʗ W9`>R:]GtcKi`K@f(wޝEB1Oud%qj`1sBqK$XSznt=4S"TYqx5H!M+Xuxbnq'8h5iJAs{5jfD-&@PO4^Xz,~%#Ĝ3sɸ1@p߼"M:Ƕ1:E+X4d*-;>GxXdkzYiԓ&O9[l?G|l]`jtlsKfmY ڱ,obtFǕz%mrGyЭt{tSpVNAl*dvgѦwPb̋_Doy^>ok)J8uQܙKޥ $,Jt!l{OERxScm9VbΒy-8o4!% ᧲R7u mY':A1 @L¼$!zgYCWߵ.; 8/,@P4K0+<1D?]=)ңgtyB0ݔ蘸:C!'Pkt}Nj&g6xV'?zslX~յԭηH`fmS %2p&\dC +wYogZ sѲ1f$gXbq{`Ǻt:K/ +2.j<<-y顨|w_*~E^F*﯁ Ѷࣿ{ U2ᮌuJP){oX?z4Q҂RlDy(qO-@T auu!27%:-_T b$ڳv_sr2fs?FI@ٮM%QIlaCM7ͦ'-PT_!_._@`ZnXf9)JjerI;}rD)_6t'*gܑ_r&7qOPUOoY<+% 㽾w#uvf 3AlqנQP 2[•es.^0T0IƩW%Zz,S/2:7-#>zu4+•;\^ncvvHsx]rگKOJL KO3}?؟ ֓Ll:2 ReM_< )BBX٦ZVqQ8~zP=}Bj"ST}`i'aVXTř =o6"{+"4n>,'>Ų XjP );p7>? I1C>A8 Y EӱT(}lʤq`>e_@CYۏā&R}SB L= 7 wD?k55pe;_e V,+PQ`+Iy8مC ܝoIz@O-G|žUszN!<*(ߠѤKI4tɉa~M6#m ~2Y} ]>d\v0v.+X!Y$-uh> cR-ؕL~FCmO *$p./E'QgkO0 Ug ύ#jyg0A̞v+HCIyDGp 3UL5W[:v?C'=f=˚<)Gs+{Xzӎ xbwSN4Kw!svP_>o5L6 8t3кdU_v[{* rJEQi&o΃橡BB"hܼD,WJ/F)85-%֯ h "Ӽ+y?~ eϑGf!EҬ+5젿V? z}xM:?D:b7 Y"I 0g+f('y33qee!vN KSM'{CkfLYòu$ݎ)0EeTa\tf"Zteeworlds-0.6.2+dfsg/data/audio/wp_hammer_swing-01.wv0000644000175000017500000003650212140200333021434 0ustar felixfelixwvpk:=KK\WWWGHJVIe߿_ bC_ko_^/k_G{g]ON>.u9mDs\>ѫNzj-p]KcRN7it 2.T0 A+:ӻ<][[1pQk }f~UjpfeVh`qF-TޔN1q!՞uIZϚ\OEQI/XDnx9@_8 '_YUr- QÎA;n@jI=ZVSєɡ'\Myr/3uXbLsx\k/۟ A6tD:'rl1,0ӖyZv}mkؓ!9F=fru@`]ߡnGx{;ځɤ?HQN0 m׵ eb$9p6eU7nBQE ፦Սd[Zy<=a2<(_6sDE+qAOc.FiCE=3 sDa7=@~[1p1woIP9AAP[' u|"ܸ? l<8Slܺ]ZvOL/.9gՉ*iMp+i\Zo ɠO b^LVAEv \;.I2..( 7#>W/GUybi|^U7*,MՆ&ɮcOHz!r>i cj,Ce(dHj^Äf(ߌy?1վ(L*a!&bbR5{,jpp;kC,/h | @[ {DG]'BbpyeV!6Ls-nTx̧+?A 4deU8Zx\|3kIИ3̋i!څG$5&FzMhV~k-375af[7‡O$2^}Y)szw+_Vu:7wVՆuFm]q\CňdRhk 0]._} pcZ8=/lCrߏI6͕ $yQՎob]_3c i^8h]ˤ B!p>UKba乇^ʼ y1`0gDҚq >YQT1bW&vY!dN[j+;)?"8C&:Om8,^>mTٽ-VmMRSCdo;1D["53p{_j}[M=uѽz޶. rҲڬ(~E{UGM~#6`\KX?@Q,C@K+Yv̳q FZA[6]`]q* Dj(ֳN \z]THNL]CꀉowC{ /q ت7LWʉ/7UI2.U/cۅϑji?IGRI@^F9E.WaI!f%Hz#7/C0b26&UQZH:|3ʏf߷dg5 1=,՗;m-4Ȯ -"2z4咟KbCpLcAE d^9:3qV24*B;Dqa?]0nu/p[L+'f89& iP[(0A;L)IX]w˝=o`0d0ł!_T[o4ˠ}Rǵǹtz'D3"zGVk:C2ߛ 忬<pyWtpi21FA\AuAkpn7Gc{#KHX?ܠX jfhy䌔d)z9I gsbfEc{H\ɀ|F YW9Z/7,c";sާ$Et$nj@qNMb >Rj>0++&@&u6HX?Ǵy|:gjtG~GS^9[ulJQQ%ճEqNL/{Ibf=<\=VO?'Mr}ro*sW1&u{×覧'pMBd[)HʊvlV@ezA g$nO?Gw|6vbvMe0;y Mu;&eCÁ& zȷhyc-QzQ 9$!ssT/?'P-4V}wVGB肑.8ܯؤ1Խaj#% T1FjN쥄2DZK[ ;S mĔ]1# >dF%Ӟqb/ :WjRj8d]3~9_$oAϋ=}>o pw'+HHA*]ùܵH`O|Cz*1g[K^BGC^s{`MV&ޠb{9jg녑-G`%y'O3ho%a2ۑ1ִ_8Ψd(j':ҁstߴPgUCY!'5hS;ڼI%50 hU rQe3b>KMW0N"\xӯ+# W*QTųM?)p2ޚjὼ1kz"oquN!Qf͇.x h?,^VP;i 5ֆ*rkNWNQyn>R6ʽjTP~wwCCͨZIQ^Jd<18yh=3=qNw޹;À[`qFԀ[Sp1E4Z\Д=[ӌCۉߴ|z 7#.y5#5'ߪJ1V0Qb̿5oޭ"."c4ڗ.FRyh%Lx>P&ZDbz 2(25h͋2葐fեJ6RYYl?5YFU7\L6@׊%'U-+f.! (0hڼ1K8񆚽Cx;ZӁkOpmJ{r,^Sq!aEh1MDX&_]z0msAk YˍЎz87^FcYRWMq27T͊wS.%_R 5NohYT]8r=3ctEBsؖTimolLVc_(-welpe5ț@e;TBBa0qy^)^?S1-]dȱ۳5Qa%Of<Xd)3zq']| -6vv>B6+qlqWUSO FW& Z.O[F w=StjRGZVLI*h 2$1FDgK9ƫ_\ 4@P?\!4E HSn] h(1/ F P!S? [=5k'+# 5N9R/pg( lI*GCE[xd4^1ȵ%F:3%<''y!m~ ?h S#b |o:6vq/'VBE݄ň =FP!h9n{Tɀܻo8Z# a(W }ڻY{NF!IB,qZ-,>8T,YDQ!Tνц!u ´9;&XY`ةrB,|z_^} 'sssagy~gA*4Z!@DWa{BhzW>h1zޟyl%xyY+$w&nR7̥RУGY$ŕjQr@oq.d ̹Z9) v5Ì*m.R<(!AWa jFe.]](oN,{q~98327+km% X!R- dMeAV' 8?^ok'izi᠒w1iUf$^nzP%>SK.-i31;"@_}wZ"4qaxLKGpRFOFol^`߉|J͂ASjiZZ9t#+j&coevM)*J@i5m8! *7xf`6UE۵[/SH6Z^kKuN׌ӳz>䭑ao3` :cWF$KS\v٬+1]fdOO +*mId;"nT DɔCw2gΪp Ҟ--3 g>bR ~:fw kx-('If;m2~_H2]=5RTM=PW`GG,Ĥ„+a^ ˔C+QݴuȽ jyke 6v{.Ǐ~OCB;0 z1- M˜{4 ,)pT"?rճo:QF}XxЂjy#6nl#+%9>xrq5̗D S lyˡQ;Lm#GY'N\YcR!ȨZՀg`G"'ԩ^k3o6Wb3Uzw" $sB .Ͳ2AHs#ÓZRJcҪbj]ebpYxj!єM*~2ya!9rl4TĝE8;?tz<#s$h ZpNBGT2ȽK[?.P{/:[V\ ɴN7D􋴼(8q%G{ۍK"B*)ݹyr|g>SиqQpYo1"LiJ"'YqLBLVPA+$%C;o*I˩ȅ{ʧv xcſ8o~x$+ 3mtF'%,U V53@hw@ +xl K1-R>t@t=U*@)ِ5&?=xLPM6 #L @ㄧq<7&sЍ뒱B8+ګKaaP$ K<7;=V4NSiO.?7̍Nr% W":E"i؝{9,uS?R#qX$_"}7DEJ@R fj٭{ \W0 B'4r~q~|#3JȥAԪ=4ˋsz9e\L .n%;}:is+MU}Ve3U \*[%Q ) $0fr募'w:JT FmxZ"Mf&G%!SFdʰȾŃ1Q;+%ќ+d3%ںS6F 2{TiLPwm-q,":jm:iyZgJ8 ]Kf"wB1Gigzo(RLI8Hz Ǧ͂tyl ||3wqvĻ:N8.BuMSECԞ<; %(UEM * v|Kp}0L0cv1 *1CBJ),7k$@y7+5GXt'5/C6Ao%?I4WDQM3 =f`2DX,p7[$Qw2+L܎2>$e3*tDÖ22wVDe^"\[ñMxFSkOrV-G ͽ"H,(rϑ]\O9;sR#>?- !]@>0nf2gb؈i*/AB'&+[2YFyKg{! `o|{~lETi7 19HM zWhWM&Tcf^%a D '\ P DHEg!3J џb[`H!/{ 1;f)%?ݚ" ٥l&;<#'˗#Co?5yp/;찡K΁Db4!":A,?4 j yqPAiXќ^h堉@7_=J'QINS'2v(* ~#A|,KĸE6ųCc x0Ô뿙aQ):WYJw /|01뇚5S .c/ӫF"0FllOE[7]ɉu b#jzWh=*\YfKۺu5w PV3eޱ?&Z'6jcj|G^~nGoHm)f tMCGC-ރ]׭u-g+0؄qH ?yS!ŋ1a;QʕI 2.hL 9U$ 2xPm/G';٫.pBB;{DNAPy=%.Ba|VH/D&Ճd[S k-zv.plv S%]Y+K4*V_8__[|S .kU=@ o RmPa2D=?#|ޠqM8'ԏ7inؚQNS%UH+x~Ъ}ԍyʗWb.!}Ba582`G]d@`,;ltqπt њ8HeF"s cQ"M&%4ϱXlW=?ݩ?3њ\]FSWBp>w,rSz9lPI6U{H2_uO.C[QX}|#}w/ 聞ƢP:>-%kK#ci`9W|`d b%/A)PG]NY3 '*?;<om_Cw6 gʈcۋɜ+PЖU{Gy@kY&IR\3`~v5rUphi0HŽ-Pz`EX{sƸE^.](f4(Si]q~nUcR˿bDsizCFbg׌u:⣳3}ey_ͭ*d!1,['%v%b3#R" c쿿ݛ^&mԗ$BMxmOzF>P\'osZ騃aۮGyc4 "JR>D(܂ïLdiހ> la8=TaQf1OnVP^EUPC%Rk.]܈¾4sTJ.^u @7U9vE3W ! %g$L;[:\&I |:MQ0 n"@pLO@h;c]EmZ}s1O1`D!:Oc; J?jïUɭGZN)Tq 4=1.F|ՂUPLy孨,h6zj}>~ÆϸL3_ \O_}o1|Vy֧c9`v{kFH._*a0%t~Yg_зi*0UILNh; U!y|g:zsJdM`hW/AƱ7h$X4)3B.a&0AqNzɿn}NO@^`1v ʞ8T;;PJVd:"E *vq'u gRQy.'Z#:NbJ4~&Ra l1 fyQdѰ߿$lQ*Q_a#243o^i,MT]OuR$V<$NDP[^ u@yگ9VRqgs;yQ96A+pSk:1`Mi|&S.{Mw=yz:۪I=tWu—F|HQ4ݚdqs 0K=ݫ$ Tfc2vKmExY]@Vy $ X]Eh&,Rhqy[SG 嗫4P%"rx.OCgzI &a-n_.}r Dx{Ala.ZBز-&ECӕ8t  qrc~T(;dBݫ`հ+|RrjHX0O7TEgڹuezpI:=27Ly9C8^H՗RdQ>g11f֫Fh0Ͻ㕁ro0XpoN|9b-fCxQjS#GzɊȑX@227ߗ ~(ɯFLQ3+l\Ld1m-FOٗ\sOճh#r:d b 'Y&6O6.k4p$G懑~\fa\Id&E C7Oipl%q>9_SiɶgH(QLgaR?-A6)2L[Jcdys 2a涖6{?{Z\#WƾSc* g5YdG eHFF{iQ@;[0@!bP81q6D#Z0-F:LN)38j=hAB3jK3ja%gf`1cԩSN_{yaEvo;?G|T7ñJDsB/ǵʕD07@9,7M5Ԓ87(eWsqT aMYC6-}a \띺KWx|fT2ItEUf nCuQi K;aĔ2[*JSq5ʄgVhLeK>\Or;!?*O @ ;1d3gۍ+XK]˰qbP/>j Ƴ@q2 ԌtDx_G> d_| h=r6&jV^6DfGGw.  _E6cy9ĄPӊ<*lyAz bK]!+3KBb⊂"<Նu,4#E3L~76@?YI2SD4ߴ;8w8n$jjһ p|0ҦEm8 ,Pp #"6 *J[t*q<OE:z!E CD$_eSU:2S)6R,K]y l)5O0IT TbIY V̯) A $vj%Q#7&3ʝo`v1qWTZc UB,m"k^滞]Yhp ?RWb,UF>(U0|no n Vrʕb~oL2QΗX3x~I 2 cbD0H)^#AeE5\ªca؝;QYjc~ղP@\:Φ":͞٤^lF+@merD+ߧ?m2dᮔXj#S) O s2 箇F' %Ha!O ng<hYe̕m6#(<Ct (X^xvfy7nۼ.ӥm7% :)b)^B9?x#> ) 6gavwLA.EN}X鼫 p'. ǹɼ dM/q̃s`tH2#uhc˺4T(@i8xNj<%}aF&3`Bpݨ#uw5` ^u񳃂]Ojxܾ 'F0X77V2sZCj!,B;1i> J OqEk1g{ jUJѣ7Z$2^Xѯtci uQ2/nLV}N=]I!&B%/Y@ s=DqS?╒ZF: -f=qQDC +٫8V0NFG)ycN'7_NDQ)%KP8ڰ"l\D0R|EǛh"|M.E`y?H:H6KHz= m`YxpeVK0oaM m<D MM~WWWGHJVIe}}wk{oU?k/?Ο} hB)6FNDoy#ƿA=ݼjKs7޾m uh/:|\mj]&@Ƅʨ2]H\FfvqX42f^.11px26 L~ UKd#UTL҄k=&yldEVg=jRwld'9랱rGoOrGˏ"RgpnQ~$u!O#=>䶕˳0.|W78iDC s`25YV%EK:n#7tDAn973tgM*]* iFz>;/ضM %COkpQ\ӓJew1JW rDž3>a{rښH)qq^{~˽^?@X 2~Ot!JA5wK<%kFUh^ΣA9Sa#a7Vg^c=&crE˸4Lh!^ 8pn/M]X4- 1L/@p X?@X`_ʘON1fUL(L*ʦ2HFt]I`^@9t>.y1#u2ꦐ[u:f݋j$*;JQIE39)r[V'͌|I /U[JTVc]#d s{0.3whP'?M黃NUPw(Hs$:++2Pdإw;u !?f/YWO.ځJ|c?f"eɱY!čY`Hjb!LdY1h'e2!Jw.n 'sS%S0%?C S{ʿL-Suwb]ߔVNխo0n@.kZf9986,U`#E?D|;FT_>ꉸ(j*)= ϓr3륀(o { NɔЃfkL [niMv@gBLҨ0Fk?lX+ ˡPrg þG;LpIruFH`X;N)~춨L.=93Sv.[Fw|HK_x>veh ' )V2Ac/:%좯'S<rЫ/R(I ^a ̩lxfSrBs牳2=jl:L%')ٍV[N}fcj'TjJG *fnE=G )\j2CL{ ( 8ˬT1 zcwaخXTe:H7Wp`XE$Cf X)-%~mY4;_(Qr\?; %3!tG36"a>#DQ04:H]5kSWb1b\_O;eV݌Ӵ"6b)3GLLC3b|:/l &bHn܏/,I'u@#}}FRˡPȌYZ?gqcyfQӼE\-+h,ޠ:|퇉̸_kIG/ g߿"W\0H)&NRi~;aMBgwu' Tw=ۈoQ,Ť=ٚ  QWq1L8[eQ= 6 QQӹ|쬞m?xNZ6Ǘh6U3G:"Da{$'<\?k+ `uEoo˧U-BȫQg5=%d(=EFK~̼>Ep~/sJ7ఝg2mXɆ) p`X^/.)'gWEC3I`ݎ 6IV7 zeLQ+%{]gF)o< 04/-WgHsTL|d6(\\?wcw7V<^=H? (j[3}P^ov? `lE զ@ 9/[{Rƹ,Bu3xL6'ӁuOx2̳Uo&@q3ڠ'VÉCCyiV!DV+_P62uΘ!g kOpM6zW M7I'$Fų:!u>czdeDJI0n6;[ ;?Pr]/qv/|܎;;K"ػX&ߓkjbGO =l.+EenBz7MBU[_/kP)1a IkHpɯI0u*)G$v/*yu{RF?έH -W)s]9qlL{tHOD>-uSx@l2m%iډo2p종zk|U8|w4 40j9728EKLꦯЋ]>eY Q0@R(0R b)H JWӱB[<0IGgjo"kJlqЀ 0@B )He֜J,u}J|6LVMs獆5= {~ܞ/s4{ޝmpۘMINye30'Y=nQN5̕7YR9/OryhOueC$"}اĂ1!K@6Bcf9^AkC,^IF|jGQe XJYGWQm^=\BٸJۊ>a`a9"uu%R^SҡBAޕrŽ:?ͽS VBthʍ)):."zJ sRW/&o,;A+eKV8ݾ%n+^`*_dUL9EW- yd9>a)~3\}9DŚMhlbUGN\FO"]B§ Q8I$:EPh.'|qa3SHWNڎrUWD4d?"^vQe-rQꁰsuf ?MWh6ײzK%|q@4+?I֜^ \o<$N )A5R.UbޘB&nQ;swtweaozc&q+7[ EI;PoVʂhdpC-N\?["RW< (m2g;Gc̤Z?eoْtQ/2AY Пl1g;ٙOͤhEs-R@/-[{v EFIH( t/}Bo0'/WºrO\R ΛwrB$ZG>|,{3v73j`s^4RUH>f+ٜJsJBMCsu/WUCN,SSd߉N(ش ̾>\f{)vtl]-k#9mfD'gW?Wvuɯ ",_ԊsK5'~,ؚ F5b+QHys9xn(pFޡ;\}(޲h$!>* 8b/,^o*qy ;PJ !nȦM9A»,W+,(i d), RlI;qxz+J? sz7'>AwLB@lS.VnMUBRуQ$;S9msb4Av]BV"vS+ONv<&4~ ճ[0hY+O$<6LmV e\ԸrVț8m(;w1a 0ɣjd-|ƆGex6ZN80\|8ԐEc;c0]9z~Oc3-,CaDrX*W^|)[4 zo*KJ9m1 7 Ig 4Ơ\@%y삎^rң؟m<ʱSdo+>J݋0Ǫ ݋R021̗Zdee9ve7-vh:t%ҔۭjycX ndznWaCN, w_(:=ȑȌJS4]=ac rH%I-[e-=PӟTD=yG<97VJQ ^8C/Uz[AV00)2'K FRrI{W"6>Aڑ$2{QpR sJތԚjY&)JS-)QP;ƫZ[~>?c@= '1&2KcκC3 vARclZV{Z?'Ϳ ֶwE$@4!۱dv{ez=?^-JݞM@R'$^lkHUܼvSgK-{^ FN+!-wL)oTC:U 9O!D g :ٰDikm \P2N8wI| !R)o\:?\X JtpZє!Η i.BYPY(F Rf98l J #I| ,-oS]|ߧO_:ʿXK ATUMl *PyZV".Q }`bY>KQGm]͒Yŵ 9gO`& 4*YQZ/:z,P?"E@1}Lcxk㿱m . m=fS}p|:wsivm!k[NƔf scA^V$(ˮO1m6iyQ&ݰnMC#D~TgHU;bM>hM};U3n,9(X)hZ!}ҀA}k[F҇!xǡe0df>DHPCm{3o+\_ʈN9c3鱘$lxeYE;2`HO?7 >O;K<н8ݣ䍗g(Q{vĸ `nRJ9(AzU_e;#oZ/@5 lQ^,`*as3":!4gN XYGf,EnR^A.I?] @B+[y xȓvɾd/$A!{C~z+T2,1C͸"I! nqy&lqL3TiGon 9(y% WC{)9O1JVXk^WP\t-,0~J8KFt͋i(Gb߳0/}IuXbt Tdg !F5&)o6'Iy2"mIQفsqZ0|qIbD%BvnMOP/dϫF\bbZX+nCur.[ˆm+̛/l]75'Wj"݁#xǀzP\-FuT.N]K3|MIo{; [ 4lf<3O2PW kwQҤY]T4f?l1}`1@v@]Y{ JHB<1uiCJf 3{ Z8?0 0b-f`y5#,}fU%#0sI5˝dKgYH712̳Yȿj/[ksKZBboM{^l5%Ut6׽F%q/ Fg[x:[/.&{C{?&{pˢbĞvhENe k>%` h%t+TnG Jz}4C8:XAn6u?g: N܏јe;lViщgG U=D߳L:5!]\D'@i|<B`~=>K&ÊEpF<9J[#)qzhs/r*Iԣ 獴*=OULM~$ }<=zSy}A7n#pafqZ\2y/ {1"a4S9JSUޠ\UFZ)#ʼnI!p@2ZvU$l4mQ#2tt?@PN6kY/. OIH&H74YAm aؚ:"kbzq ̊?7448?880Ћ^5P /f3QFA9-P(\qk:86N~NtA{]ekr5*|ENiYz#YG^np(<7 l$hP5}=3>CC(KXckEϋCNƋrvsaOh)VϚD[2 H$lڣ\$Kc^Kqfi,ob{ O'Q|KrkM_wUYI\3]iM9 VurqE{T]q&yU$rT,kπ0'M ,.Te+Cmj{ cb='nW1fTgn xlT2qf+1--c6gxW#n$Qtz#͐HMe#Py鷁B[>ɾ]~Ƨ:RlmtPÇ*˓6n 681jeTX+H,37k ikZWX(Gh=%4.()rj}[[bȌOI/HPJ'0w(,)QTfBjG*MZ܃~8^ zC&q 0)b1 /黸gVJHS NWtHX(eqRL$+0~PGXvl2U %'-: y,rW``B̌}ؘpq~\L.ng8K"Ѣ}Ͼ?Kln>2κUhse:rl:Pa"dT.isn+XȖwh?‡2h$~S}UwA(Z:) FGw!8 @$F*GXz?נN~3#lX-fT:nH .M{Ջp׌ڳm7ؽ7cޒVVl4P)zMe#օ<09 쓫,hƀ9F5ivG#̏Yv*ġЩ66uoqLv -`j=B mʳ}S&z?&-lLy=J; \MWGz #a IF^TOƪ|y@ۏ93T״X F(NK@Gfb\tF5\Pt/e r!IQ4>,9? فq;娦"a]!hǏfͯ(2Lomx6:$ )~HYjwMƘ@y dFrdR_I'#&|Nfbv^eH/ JM-a'm>@ԜGحyܐ„%x<eqvwnT6H}1yV h>;A0 m*h%8g ѠCi#he]4gnpAAJr~|jpEfbA׃:@qRY!;+r8^#di1 / HA}<*gײR^_b(Nw0FWsLjg *%4J[]"e! ʃӂMHgQ!rrO vAj 4Sp1 BM%T}8ב7%93Sҡ@C`#.UDzIPdLrX`Z/68r1}l!x,AqjX|>:E@c얲,ƶ)mxZgt`98Ϩ3' !a=~Q$\=6u9P$z GRX(m6xyJժJPW$:^Xuc=IǽTQ2/nLR}F=G= _n<9CJ7z%HfC5E$Y)9hh+2<ޤ!fs6uʺ$5 m amz^5ΐ;,\bvI-F`e9.C4O=˱B0-5ϏmNoBh OЮ7fsήc2Ҿ ` iQ órz)QlN=bpy,m_õtBțAΦ!9)@ z PLZ:u,B klPZ &© $Dc#?atPN1Qt`y?tfVT#<& {k8l5C9_m"C #\bT H4bA4(8BYMW(h|PрaeAѹDOP>3W͹>C+J5ZqBQk~*'ёP - ]92PF?!;Skؘ= J P<_D +J<yfܒ&p03v,.vh&B{FyNyNPF6\KAǕ .ehQo?SQP]Ggl_*e6i?=A'PǑ&5ZPtYO +t0Qɿ76{i󒉮mOvss%&\jEfN']_=TTZ~VH՟KWb;O d"I~\֬BI]ozh\.纑UADK * >^3l@S"F6 Akiݷce]d]]:RldtPڕ%ZG )%&U EW̮ zBcF|-r.eXcz):G c ¬nf}2︛ rtЇRܑ؉ݦo}YNLG JrM2}eM[J.*OԴ2;֋O&Nn|\ٵ2^EPx˖^ MINYO'2eXX2F-ҳ ['La2rh2阗|!:Odӈ2%Q j2)Q1'dũuf.phC^fX} g `bOU]AhI ZK/`*}R7Y ޏ,␃l0_`Fm.69jq'OcnD#l:ΑYGU;r9=0b%J9Y }YfxmcKqnWep KL@>E} ,WY[FussJ,1 yJzv:GwF-YX T쫲9o;^O0/ ck#ځ&uGDL5^'Bk5"x bе&Ì1Pq"1d c_sখuxP (_N), 'I~ 7%q}tޔ9DWm+m$ ! l ŜPz|C!LFׇr& Dt-eLEwwufxki_i*Ȅ>[Lo ¿9DN_%3}ԟ!fԃcZrb)r+n†Ug1`̊mԹr w9C'7ATH8`F/:9@=[Pˏ\.nC/:PP{֎h,Կ؃wbuP"^̋$SČ4\8\::4hꠚْ WB'!k.-A 9>`LLd6'_;q|1mvj!n`,VKY.\-[c棹ґ~Nu{O@nk{w]BN\\CYNCd}!l|3PLV!EDžKCe FdGB$ nmnXǢ0CDa>)~@__@ WJԸǏihjCB_Oۦ~}B rL!EDԌy>+$BE^"HЬSbK|AK軓dC(f5n{whߒe}4lh_ڛ~h|Bkc>N7FfhǙ'WC_˵oD75 f' #{Ubw4h^t}t[†:۫b,AK?nJTR*u/B;7YT#^?@YS.31fX}Ofr]`l:zH]vQj#LƋc۝zyll̐3 s"[v&V:)/+|OC$/Fz]8"1.)֭I{? y$=@SыH)MA,2}uݧ, PO2dauE~j ˣsD9p@YUK+F" F8 ]{c†^>CO>z|*k33tW&ŀq#[p +ƚъ *?V ྫ{Y c> h/ifr +C(.{!KWZP6ypvOUr [:}=3ҳFWƗ ϺF蹗'rM#1 J'>>rSJ ``{a݃7L4^*wế0u${]-E1y`* [cygف Ȥ!0FWȽdRC)XԨ3$]WT0i/lhy wt.q7$,ZbsQ#&[9u`)67\ .Z(#ccnx3/,R_vq1Y4\jvz}72EIV"=:Z'}qs{ks 5nZs$N̚NR%H6( lYzpEgƆ ElF|Hk*83 $yOak 4fK%_tW* ayWoo`Xּ8 `l~vz7Op_v .ϛ&=m h2ό=F#Q+Z\Q]Djkui4'lbm:BaU={%3@ m @r28O)IE-[,A%#ו\ee5FI 1R0a <. m+=7U=eZmjBa` (F]5ˆX2:̯^'iI_+Er/#=w5,jow,g],k0b>WvO jYO$l߯$ͦ@?RiM?UV ʁJ86EnV# ZBѩ:xcatٰO^Sd>ֶYRL K4~p|5.' |o_p!h<-eYK3ѵ0cH$z I/yg:e]ݷb})YB4z*r V3av&0 *gÏ~aY}bK~!R42N*a/||y7U5 Spa#څ|c(LQ91UCX`?9.*O2~jh;6}l 1:\KiRQ` <*vt+fc;Ie^0BҡlspLH[^&3!1GDKx^!/inCx촴+J}LğdwRhuPyz_bLa l=Ϭ. R Iԛ~&rvKШ'kqe5 {coc|BbJz{>jeU%4[: #l// v_V-eHcV32ߟn$~ݫT';/&`Բ#':%7i{+)W>R- 8/%ei[Л8Ӆ(L? Qf@0ڮ(,+UCZ0;>TIGP5*eD"9A~ìY0čG|ENWI {z\b#q*qn*{l?f@G oG4_r\Ne3cKTL?Jj*&nfӄTެf;O,72X.À淪t!1F.`J ;fݘ|1-"2xql[(SHpg1:rn!A*zzRW mg}Q_ڋJ3/  l&@~( `L"cqtQ=QhnמV!?ymeU <>K!Lxs0QC{{#(LN#e#)"N܎wҁv&Ah-no}K:4jűL22lLNg6U x@YuA㖽,WAi76eC Sl7QT'*, $̅v8t%-', ΰ؊ڄDy .`H$t/4{rWvz f7||1[qegYW_QF0QT67\lƉx:ϻ xԖ#6O0y/\oLa[*Mc8< Pn,uJafX6eDnZ}{mtּw dm!Ļ eַ_YBFfNdsC?0|~(HNa!F5$:z䁰%́AGٙnH忊noo./A!x;옞f@a;6eÉ"-9>lj`um ~8rѐw=20brCČf -vLɿ)ErmzE\LHVcP,A_ϱѴ VدtMfBJ~q`^{ vX `B ʒMGz[:ao}eFcL5~b ZI]? m|VDgqtvCzl`l&i)%m mӈtM)}1E݅f>2Џm0l`$ <&)ʄ+@4*IZ1kNQk *M%/ [9 eQ4`o~Sa+TB!irKקR#F:E2tl ȴDE˩Տ*&'LR F08~ . "NPΐeN޼`/rjs'+sQ*s ,M V3L+n^ǽ1jxyvY|Bf|gKʇ-X9 G>ӂ ,h75&E& AB-v9;7`})7r6cl/_/U1S&xfPffkAuM:" $-i.HZbkmq[sx+(!/K:Tðe-H;nL, O!E5ϵ8,72DՉ*5Qn]m}qhA5&WMwP&7y Lr4"Z2 ͏Q /%ɼ;׍c!z61MM{™}u@߶~W~/Jt$,iHYё9yJFLX~Hڐ{$;cץQO܍,{?aG*j+7GfvMɝʽ34- N`֐3aBf¡bЊ'Ԧ/gƾ]s晡v)oK쭇x*xos;ߛjy#Z{W%`TJ#+ ; D4 9!bƒ9 \.A- Tzms,[r<>㳸`R)ʾ\ E^C?j',KMt::Zb9qMNcxh:I I< !~aiXV,= g o%{ǹCbE#8Xzy $·6(tRd#1VQ{Ώqbi}}wB@*ŧ#BCp9R Y|!n2#idqZF,@ۘ8~≶z[z޶ЩmdT+d1%W"%kUޗ'5k$621</[U㞡b"M *^}QgK9[i@j:#H!PG$ + SI);Ds[˭WKoN±gٯ s(gD>5bVoΞC";B-0V|]gߌåU|6z21՚pワ$DU(gv Ѡq3CuQLu o2q\4{_k1g0аvVXfwzzoQ|^*]n_Bg0i`}[z;kO1q;$Y>pDI/L$6_Л(q|`fJa^"E](*^߹-%R͚= Y\)ţ̈́tVWi~T'66bF+LiKӭچbjEwWeFx,*;1_,JKE>=9*#J7eq/h.Fy1(Ƭ{;X1Mt;㨐\~̐\9H`" ;nح2SLĦQ}=8I,ow\QeEtڄܕiLi70!6+"ˊteiEX[WK8*y7K U23yt7ީO 4܁ץBl?靰5JUYӋ+G OBH2ͦ3T3zߧDp2*"C&&Ƚ>L/ dQ BPY*&ö*~ů~v^)tIBn-~m5nUY,&=;mԣRJvg+ Tf8 Eŵe+0͡C)J!/&\ƟvѦ 0#lYL8PGAbxc mXj@?kh/ M!Oκm= ~ HQNq%@ q\\Uib'g71o6Z;.mu9ǥA"Rig11qX^6چё5CFYqMj!} ;9jBV6q$0N0׃ؐC>Zi^0ŗNMqPI0gTWN*h1up5όU~4͠\5rlWc?^ [wv8 {qĿJ܅Y󭌗acV`Ti]q}WŒ !d)jr=, 2L2O< [1Ƕ+۪y# \0ό'0vK"J G:`<>pVJ)5.@<Ӽ}9(Z_n)hDK +ejJZ~$LQ6gPQGdtyZ@m r2~ZdzL|\w%B#+ڧ ߍH$<֭c$c}-ROT!Z%VĘLLRt G;rRIev XC7 irKߛ|&тEc8h1Ȫ_d+"jcpCnST@mZ8}:l y4; `D +䲥5c:"WPvPTFr ۰idԆ;8,f'#U‡&(+^n-1>+ ADoҏLTiM/3<1=p0wNH[պql2q*ZTdFۯ%>2);p-ոr2"?gxgiD;UGHXEpO72owOz-]WM/E%2KFo4rPɰ\Ѯ2o() eeUo#WӿG{u :3jFu^HnS󭉫ѕb\ Hd#*~k2Mޝ*{ZM"=_ GY[B{6HVs6^ǣ.eYz'Sݡ Ys$e$7Rq~A򊞖FǯJȖ-5+yD6yh^&ƅY,T8.yE.~q,5qMiwusx(#w#DL Ljafjq\{~ aeC j= s1vT{̺°Y|o0=;@Zi'NѦ@ B=!Ri8̚2QaL@%xSZ?C2HEiXӊZ|!VJ3(*Y` .rlnN,gy +5 y_DYhVwYҹ^|C~QIv3qRP;~/l878K7~@,*g1༳$E"g`,PxS[iіٷzJYr*q/qRUĐ)NGo eQmFY/D@ɈRj*iw06C1R 3h*0;0yAQAEXHgltXn3x⧈]L\E`SoR-1EuB,mHs[.=~f3\ʍ^wRX%֢*ӝg\7g /ʸW=YI * ScpŽaċ`rt^f+1'uXRB9؜)0?ʶPHjcS=ٳ-5ڗ -d:ĽZj9_k\Pa-Lѕ8COntrEG0hUp}K&F#qqyeR,wa F,Რ4-w:R;Z[l4_K1 pTHzr3mGT{ ˫3I R\t]-E<:H$n\|QY 2~|l œ˾? ~F V~ byXyx_ǂ5a_Q'9JGXЖ.G( 2W<[%c rFt/cbqfyS1b!8CpWšYjߞrTSۊw-0&LSØc (΀ܨHkkGr2uV `&|7`K4uM(=99\ \א<ЋǗ.F)j?M I^(7,̢jBBwgFP:]y 2~C2Qkgi1 %}<*ϮIAo/'Ů`> L 9J #TGÚD^qO[q7V'ttZvy8]'tHY^hTLCk7,+m b|:BKZ-[E# 1RL`YPՏ:x|Z^,yh.ؓ% el7B;nP}haA+:|EkPQ< ǵ-z1jYޑxe/&ЩŠI-Ox:D|p"J#R;L"ŬtҬ ?j2G\6ڤ|Hr, )f*1mas 9O=UJbmp2*{E <$@U~ĩ>3qg%"GH`Ҧ]6qc&e)lSM=`{FT?zx"0V`LgUuͤPFg I04:!&q:6hHGLLe| }@n`6R*[JЦR6*F@#%l0r2U3 4 4+2 +3z|" OExrB 42{gHJZMW#tpu W PK"O`I4%BɁc c(4 y<D"UH  eJ<$$CO@Jd7B2@KA'%TEqPQEq~@z#b@k&NnAB FiKB@zD(  (ʁ`(sE1נteeworlds-0.6.2+dfsg/data/audio/wp_ninja_attack-01.wv0000644000175000017500000024235212140200333021404 0ustar felixfelixwvpk6D(r&WWWGHJVIeSumw$@u@oN$@I (tr&s`3SNB LhԠ{BP87PN$4%$0)g3[ajY ^[~DOCP`k8PC ` ?7<4R H#8\ART*%M~Ц|描+AZ (i@yOȓEww+r\UAܕ! reŰ7Ō"iA:JWcd6-W}ŒP@U qCXݰ0m)Di/h>WvN,*3 GG7Y_bO869_7AjMJw&8qzʖ?> kh~scIm|0v`$p.ioX:RRR۫[ly3vdKfW{x^6 Q ?9?kٰ;2mڷirpN}k,j[1|c*(l} ɦcI~Sxr;K]5Wd d4g>NmJ|vK|fӿiыپ4{WUŤvd]C:`NDUĖ4F S'eP,Hu191U,gRFg6g0uZ;1-~p t6]7+'wY um]jH5Yv/(jAyYئKr6ѯI]Oz |;3/ ;e+2z+:/K^PERV,mtn"ѵKژЀ;(9#{9IP&d?$}9@Z?xU#5n#,g%` 7 i3?K$v>RLn 9-/~^ՓAJ&42)'1O{֕ФQ) R.(mۀN%[pV|]pMklGSׇ ?xNO.ϲޡC6-h}T XNC-ZF-FDv1Y-.*֬8S1/ܓDL;\hxNU*BqY; JT&1iy$'2R6D?П%ǨxCHBw,kmF[ ГG;k&2RD/}uF{8Y̠3q|ijL!R-/aax!.Kkbv?0=hx"t?'C(kY+:76-Q]]2?T /ZJfŐa2-NX,A:p$z6W/XtW).S.w!rB=p) {ZZΈN{ ݪc-ua_$nխEnQ,Q{ abIa)?Q`>28l,kvq2ftH9\.k=fT\Uma]utn !%pQ'ᕆ>I>/bo0TtOhֹo+Hog3` ,,~%1WZ>?N`On ¯B߶5-$#%:3O$Rcqи~4Gb,׭)$'.k~7r7f_N=r' W<F) V%/r>="jW'U?R lWE2 NSDi:oYe ~ s= |bU_FD$ 8+|jk% U,Xë ƛC(;S.;03#7y,p AK>xlҸR 1x- #XوߒOD֘"?T_!4*pSK}34Fr^vR'A)o#ת7f.lD( )Br:\mcfM9 1 I7x ) $bۏwIG#%DQM% VN0%B4u6h;kԬJ`T7~VhM2l۬X7Γ+/h{ }-8.qm܆\9inr`:+-=٠j*2v@i>f68_3Yg+ k *0 /A<(0NH:؅*l;_QILGЖHTs Gz,/[J Ac}_ۦǴvr5y2sSZ6]a̽.Aymyܯ)n1%GCMZ$$W̪R7s  /]vkU'9 &Oʑ9 +xs<2^cꀇsRnEz:iꓻ_ZFC)$wd\F N3YXZ>L28W2eU/O^hc]? C-4M)%3Z9lV,TťV,qψI>XEwR1_w$뾛ol<hp`\}&-NbE2Sg)&+|cUO,;/]xr"ٽMvpH$kAa6@mꅙEJ *HsAܱrD{a ;\O;.[k|^Csې0`U[5O{l¹S@D e[B%!A!Ӯ½EIȈGs֛ЙދWO&,OmҎ~6kcҠ(H`0UD>-ʟOq]pm/lg X셋v ZX1#&mJ >7Z}j|/meoP4W|bkFDe?3jK{;xHuZE'㧸1G{pG~pJX 95.oã7=J9v`qafF[.* ~oAлɑX$l0*W1:P3a e{`ưRk:^W7ue8A5DpF h`DX"*VTm_ܥd+~_,l EA ɔ\ ^*Z ^h)d`ʈVwAq9wN$qU4+gr4F"=iK-ŠTz@hFa4z#_ 06ydKwA|p:%ʯ)1)meq|V-$y!{5E">Q-2]|x(Yxir4Fx$nǵ%{z fSiӨEpkX5 keCIئ X<8TwztZxi/y, VT_  `'CE +qehu%;w> UƇsْ| :!!!Dj3eי <݆' p˖6k9 \ #8*n4Czf~bvȖ^7q;֊q߶;6z{˸bكK)n=4C=7;7(o pd]JIeS j %uk1P,rNODs|-K<3L fqĊ͆r͝R55ޢ7 B_bB?}w߱AB"8I& 2'{ 靗QFЇz~'zE2(jݯ:#}ɦ"Es`‹6 NN/)]}nEG7ȿ 3ŤjbqccQ|H v R&_g$,a79drl]Y9lh+cYW^؝.sgmSQY OlA:lx*JaVY-Z Ajy!iuDnwgo6oQdh*(<S 6S?U_7rj0gq°PP IZv3?wws>bd.h$`+ha# :\AX |^b_'bO^50>RIֽ[Kԋc@&m *ڗ* |q3)C"e'?Wؚc AXӵ(ZΦpi&Xދmk埻Z4:ȹY+hyѺ&Ki0 5AYWކa$`;@5)PIGR;R ~ݞEmOo>l i )K )c~41-Njkb?Xވcsg,Հư"rN$)ژjZzD.≚HR#HuUo$$He9);^w>_l MZƷS5V`h q-;Vb/k&DDŽ %ˉ.QNp+?{AVʲf$߯Qm$fſ&P3D_vЦQ19Onw}^_Kf[EHh\ЃG^fU?XiJG]"a)%<<.?;{{lV3qX>Ny/V2$+ 3z)3miD Mf&dn2vAEU.wns#>r;D1)Dq*j(E䥃X&p`~_uTi!VðT*Sd.#u.kFQ\'G!9~$ʚ=& CXT^C8*ɌG֯)ٗ.jn-[zڇgp 1ud|2;<|OsPeʫ^**S,R ճid/Pjs/?9̱K36o˾ᵹ ~P &Z_A5CI1iIDudgю;ubU 7#L+x,gd~p$+]w5rsc\VN+Zj/9!+~4R'[c38fܒ2DN[$ĴZ1A̹ /t_,ݐwk"!wۅ?M1[740Lkc0@R[jos5VpP gINz?;03LZqfMEs +WvxnkK*n*áfO/'8ZFV.rz|}7/^7dn!/:0I]U/y~U@' NCTuՄ+tV!zvy И訣\bGb+jJ8zM[΂ng MЃcm dlx@HtGP0Α @I87Sϼ enKV*8Chq 3)]{jsL}P{+%_KT G鈌 cgtE GJd@ϻ^Z&i.3"nx۳޷~c,T7Ӂ2?{M4uyFdcZ #0C]U'22E*pR-bw)zY?KP% Ȍmފ; =E`t-G2FIvX3i IZ!`\1^V#n8ĕ r03Ĵ_aɇNHQM`l뿰 kS9q́L$a']P$q%44V٪XGly~"p9|xՉ9Y*p-BFXqT+4ttQ'؋15d3R^~dnc)BxyBT*ΣR1]?\ˋ~T{51'(JhL8PF.mCQxa {(^JHS3i O> e#zrM򌬫b$Jnv+cp0# :|syFI{ʼwc e˝S͹kD\56yAPp%PYG's#e* 5b{;e%'[TjNxwVBV9NY#źl\8=jCObM83RQY |%*OCR'@b3?/iͪcRif6Ym317Rh cK Tyj#⍦O54ߍ0GaY,ģt?y3JKiM;fD_*-&%0xp'6kw6K%{Z Y*fG]-~)sR’ΈWE›vHTnX\B6KX}^&} Sw[[4hNM{DeY?C=O+7m( h()e4m*YZǨBg~.jԉ8)k8+dҚNlJ F*)yK;VЁR7Omm! ثZU|b`1JWȸ/qNƿw|H5긯iVW+mhcM/ê,zandHFw9 Tk8hv9Iؔ=##BQ;Dj9*ڜly$촆aB*Hdmd XtGvf&1 =l`ADJ oʿ 'hmӎ S!3#ʤ4tg9"(*i6{nfCf {ʾKfwX,~*;óU¦ICaٞ7̏\%X kEg:=Zj I͕! `1~$$k Qts(>T%%9ALݓܔP6{i1_[\%H1W\.NP5 V:1:x ♳2^ֱ~:8i>{hRKXqA9 I@t[cՅ)*U ofܟnBv/6d9g"H"q:NX7ەt8DV75s$jq(BwY7qUfo pϊ>[mA^^^]3qnnNxb-\4Dtٴ\## ?hXCAO)QqKΕGU~D`qLZW"`)va*8ŗaN1 ŝ(媝[Pa;$ 7Kֱ̻Za9#ArôrHtup`?BpT?UIv#=rFqҌ S ]'vE&q9 :wB~E-;gH09yIӕbt%A/ 5v\MMԚ~{jlJ* 1j wL}],`P2fBP~$ÝBugC,nmJfMZHX0(xUd"i篅\49JJ!}Z ]ԗHKqK ܞiY.Xne~"R·K?C g̊%̀gn_/Q px穜(DӺfҩ" r,AYEv_!/EH,Cx)1ţٵ:}Yp`~ě.`d!rr8i;uh_y(~4@:H$hPa ΩGAVe뫲t:5Jej  ?[ٙնu8PiեMrCt =p{x z0B̙Wԣt-=tst[D|0Y .2{F a6i+$Јvg}u^bm kex(^Y "Sm"f^ ̥*+`F]̜/vq9j<"d-)֥ʆK=V F -M:+| 8!9+w#E9q|yG>0{Gw* ~4IG-EЀܛe+f-}|89"6wVBFsJfp}LV%+ڶRI?\P\v0(39a}( W-+d"tX7~_H͛k`$0C%#-$XkUXھ5Y^rZG) PW!rzj^U +K>{RxM*ZAtWBr6j{t7q J.=(^j+''WOzscyjV D߿DQvOB.4!g4fU'%@GB:dyXo"SZD7UPq7AE(RSZFҭGHW(fU ',izynvg\|mh˺cAPAj]?E=@۲"V"<tVmc^Tw|D!RO>O9syS`9=˚ح><='O/9766/ ;i7ZLXÚ]6lEXsdKM6ڰ߸8qWө"F, `r VƏޮ9CaylzV_=ΞST طC qjN"E߹[XAP`7i3!eϕ(lO?S7YO=W ?ltw1ÁI%~pH@RUo}V^^o*Ï܇0^:(5/^(ï9E8D4T!J8x兲 UrZ-h'vv8 @8#+0Xa#!_V}4 @RǛi Wh-Ҟ֎~eYzYFA/j ];L[r/;ٴQ- ]q5vWG,z^M I@xWN߽ݖaG9Đ(k?4_f{]@W$V\4~gQ]_{}7NDzԒ%F51)9Oė?d :@ @+ow+ (fnC\_2]jN'_) Y ;ۉébf8A).sCo=Q>j˹kH)*H[};rv"6\yFiz"bt髯9wx?ͯgܞ,ҭf$A F1Zj.1n- `fAq^m!=Dz1o [&7!33sd/#ݡ93xHj,/7ߟE1X咚_): q~V W.X٠7Gۭq|NŽ{ DZ89cg 1lt+NlӃ"6wE)edJkz~>;eol":q']?:(厜H.PWАn(Ќ@sFGNeVґ&&E{bZo$rJl Kd5*:1)Zks:8ʧGT u! 7"ӪnA ?z+qwd<']=*n߼$( %ye;T~_YB0jO*T(i;wghCi\ NoEZճuJ+en"Jnu9!q_8ZIo^|2H;#"D% 2S'djI[!a = :xs{3{&GKAs2ȁQ:DǂuO IQdNWdEUdS,w(4a\v<:מYx/ !FtiHV`?^y,䫄>ee1vJ82:HE6>|*RAan}rd iaIQDžk!=9=3ꎂ"\C6yrNAa iIIKf5Z5V<_m?4Mj97)z20K!쨵"(nu4BA#] X80xzT6ni: t`>e:ˮ;62~swNpLጆgњf}Bɪڼ_05ت* 7'z&PG/:S*9%+u%lw]l2&k #QG>z4VL#s,`a!OHT2;_8Ǒ^aEہ/E?)ݔai\ً 5b\~q$=kԨD=(:kpn@:<yg#\W@[5s6 _K1h—4OmCVwvtA3F2![ %Pv >XySbhd96ޤԃI[ icKJܻ$,' 8@8N01W<.dp'܇+qH̙[h.) FmLlQ{/ ,D<"<դe`zq+! Wm5 M0&dͷ*(cCT5(N ǂG=ab~ezr"i!L͵UQ#E;Y-O1_~rJ&}5I# * if~0@ͺ@8eآ S|hs>J|ni({x!HX韅r5Jm׈<;5O, @h\2_XrsgYHΆUgJ}*_2S{-7x*2BXP\o95A)(na Xճ9lwI(pآZϸ),Ϻ,N-C1 PU_J.,~Wu!=?6"Kn .7 E5zHSCrEZ=:Sdi%L\qG-9y0v.kܬ?Vךǯ'm*vxAH-ѹRR7Y@APA[[| }ͭi_reI!t-y(yqK @heMZ_h_"|P3h^tO3,ᝤ0-s!Vc,"C xk axMhqԥfų߬RJƥX%}WG\ >1[vh$mtR@zv0uq.4XY=ǞA'Q_wS  fr ۡ'7ˊ%>䝻O}iL:")81V!1T sbᐽ=#\-iuSy?Γ&G<,D`=JBuL,g 7s5Pߍ\mr&O *l=6E ˋ`4vE@4qQeBlgxt6~Kp$nDqo5|s[/CE|mЄ-vU-;]'׼1oL=|,F' D_c,\lM [g= srVs_/?<wbDWY0R?66ZNŒW<(/|6y6P[jv%,i 7lڣ,zWX/!s O,"opA%k.\[+=odŽ_(k߶k54P H|!ZrSDaջ ovrmT'֛▨`('8 ϙ3)k.mz'/VPk9V76%<`j;^빊 4\ΪvA9[?}tn=@!]YaT*Q#:˫Q(U.P^e;Fwuq45vA<ЩA P" kp۬<}dNg,BDȬ=xޟ>%I㋷2*9ܓ2˅… ՝N2mo#+@aw)T S53Pxy(䷮&OL퀲yF?U }V22T94WA&uŘ^$lZ`ǧ[?oV 1 ^9p4eH$wvh]jJZ63iuIAtb3qNUiwdN%")7H{+M&2jʅEuٜa?K@tqKu;YmNX55^ěy!sA%~nf`GAx y ߲-ʿW\i.@wz/MAsTUb+;ˁ*\M#+Pr +] E9I0zXqF*]_8NLDYIG*l $Yb5uӾ72Մ9QSIEgiTJ@mӴb? PmJrqd\"bޣ*#^̰`X;ߎ/Mԡ?'"TF|K)dŀ5cPU,xg$Nv*td?[ʺZ"b g.kpNݸ +@Z^YEu6+JppyWƀ S7PFu*{OnAF$dV#/49YzY̺5lnʤ28( Ԙ ,`2gH}Md݂LGlGtA0\`e%[Ux0%5WP:X36ܺɵ|`?^% !}_1s !>3E/G$5BL$\~J+SJVt3&:f-X|9)cB֏ 4ZܨB >J_-@yT.bד7 Z4l(tIʵxm!iC +g1aJE~U {/3THu!#.6㴴埀b(&8O|/ H?f _^274sI+/45%8NGLjVD1#Ӷ%+ IrdvQVu%^/TVJj2 ԝ Vׯ Oe>biKn*v&}\3C10O_ xEo,1,gy3Kĵ} EɁB+X>9?GT\M F "2iN2]/_ER7 >oX6@ܴSZ{nrZ}ANAgSĞzvoo FE*By=lCfB͆NƩ0`Tt8)ܲ٘?#BgdE shR8{ɖSuTu5#(L_8!n64eNC+I97|]>E-^i p¥S=bgNzՕAU[z} RSM5S@l r0qBΚz5庱m1N÷ LZ} ÌBi8 r3^Agw҆%bhx:˚~-D#Q&9zi-铥\5](K*.ɒzSѲb_+x~½"Ɨ6ЕݩC`6)S⟲2]HN3I5MT-T7Z0wyH+9*(sP/L#Z6 -ܪ%>Įqkz/vԱ.Bm89|#@gkWų9pts7o)⽜T/>ҰzuC~/ZT#}sA Fk1wO y=|f6 |70=j|&P,27zAY=!;Q4 ;QFT󊸬q;ۖju2Aog!cuJR :r%ʃkw{`|1v%/>]M$XSYm)ҟs#ϸ^EZBeU;h5{ 2dBC cIY6jdgZNnjnWwrd(,Y#(]0֓  TZplدh1yޗSZS@Tm gA#H /,〇kEzr['p҂dB0O z9&cRU=l؀SVF  E9q|2 07m|m}YƎPؼ6;W#}$㇇(G$"-/5}|Ҁ5c)sUsz2'h2.#0nLzc-&4I;+v 'y.*B)ˎ +zg W6uJ; W@>mKMT I%UkʽL((vw3i;>Iç<({1Y12lU0Ik=QXהC 1KE(fGN+mUMQ /C׎ E!܈M1f3\ k0_ oBkI]Gυqr5~q%r(ܣ=+b6`՛lE+> [r6uT9j`w>1qq!L)P'WHR1g)3>@z; #!s4Ͷ>:€~hNٲe{Esðy%rI&+0\5֑sl۹T8X)+bdZNpLI08!(F2wொzO^rH狨{ŗ?xr.a2FDܿOþ_+FW7EEZpP\*'3- b7'J%IȞ3sLK+u`DpM.6R*gpT#['#nh#kV[jLúS? IJ ]tzqGXǎ掱 76Л9Y ܝj02/ J[orD{$_OG{X& 2\_s&쉟!x>-bSzʽI8r~nې @Y_b&]4 DWGOKFS66\LjW|43T Al+}W^c8-#N?_q$?s ZS(s?\U #[E.ZT=aPz ][0z5T>'m^$./u[#%Vڏ~5f<XY[(U n}TIƴATc䨮x͗×_Vm`T@/݀[Sp;| kٳxcҭX"lkc?N_ny P6x)-2LMYN션XߔtK:+i|T\ 2.&ck/&ߦ]N#H&o܌1pv"aIݑ("z>ch%%w|=ыip,7} G,ߣeJC-R囔ɬ8[_?Vߠ"t6zFiOE_ܰ-!Z^)KV%17yV̼g_r!ӫ It<}zη$3ĚUTIIaY[d1e7#9(6=܈"'ּ -ngU6UMd~΍hfʼnn%7u28 6ԞYhlAy (g}sh&RYwp2VKsfHsB!;)ŋ;9J7x#K YP宁 v )}: -~ef8wN^V2J-.Y&|+Հ}X5ekG2-p7(ȭ A/傋"k'.G*rcXt83!|&#$1^GH@q;_-$A )}7FP qGǼq(.8 SZ=5mZU.':_[~؋e\0.`C- *xIt,2EVnb 1y:Sf#Qǀ=quC NvZ_|B[Q=u4͓8Ezǒwn|K1 vBMHvDFYH@):t0U'{xFׯjwY@t1b鄔`Rkwj^"2$D<]{DG>R BQrǸQ}&;͎rɤNfKdXRűԅ'L?k/|j?nWEv=95c<]4U ^ ݼV<96#X﷑eh  3Whu~v8,X n׬w#IYn+->s }G89zڏ.);ݣ^qIpv&1j+anTsru@Xj`xbɟMO DYWQɵ*+nZx>ʶaєDYPMɎ;c+1H^Y tjx*R5H]kl X@+sk ItRLO mgRΊiU# ~GhAzZz>nz &. \LDb\D}9.Gg3{f14 <W c;=TtbBH;3H~ բs> G= h.΄`zr̿B+)mݩ!wOV?Z6ȡsW $ヘKЦC/~Q1ǣ{IzD=9٬ûCU&jyߺ΍@A*:f·[U^M[(R !#h9luD4^Ў}En7P\??*eߙh !ȉuӴb?RpHe_s+Sp~>Evv]}:e &7(SөvDm/,c>ene!u#ԣEb+κ&sׂMI:G7,C*/V{)hl #Yb[Usц߳)i?a^m؄I{mEiu5$C"zvm@MM^o5 ^"_ a5A<ȷ37@A8$`# UuU=Gw # 37Op;+uC?olEKVY:p4oqH"Pgt 1+X}qG8P%KԒNF)KO 49҅jL_)=*u_CWuYߋx۽_Dx~$fgF⛉]G ^H-TkL$mZ.VWm~՟z{5͘f(>_Ѹߞ4h+rB"LBK %.lZM 'B*jc+ޤ94}̃Ȧ TW"m<нFJisBS5";?,:0~^u ~&}襁[pv*PTaT<>ZUDЇ03N&/s-i84~زxnVYޖm<;&;MA}SmUg6qQBin.㸑ɍ1402)6qYoCЕBkәt[1ҟJ c,,+GMIʄ՛l`}%.;&z`bz>]8vyH1t63p3s * ff7߃=QoqY?5Ureȍ%;vc`($UWC0@.}R:hW@^]|!|ژW>ox )%ʇ#"lk BsQ֌jAĖDA3\/FN Zsjd% "51lӂaϿ'w@7>W nU%\f!to=o8O\jc\*"3й4.~biw #JIv>j4 %h 2#-۾Ly/=v3Ur Zφ`6a(k-W-xk{ |-Kd\e`7bΚ`R|rȔ-06:̭4ں^~sEiu9KL*vy-Ʈ^h h"ߠ?s6x<~0֘?fv^(j/@iKy !i.8*F/F/QԈկT6Tq#B9S0c觛GQ<1J?ڽΖ7*bP\ "G^`i:O묖|h [퉵Sf:Y{MSEp!%}dǮBr̺Z':|J-3m\qg.:ckh:/́7ۃIlH"GvZ%@\+͡l2K U6;eiPj. "g \ug}c<,w;ΏsfI)}z.Oܟ/=+{{;+93%׫pr&p!Jtٙ LzD\혱@w] \cLPhE vrP=mӕ΁ϸE e\mY|4GSlVWGRfqCC55)vPZ)E`h&k|h[EM\T_UY&В7'EZ5gxaёi0 M]x>.1 ooZ\ۨp:*_<)r2ianBmiU سt"r:(Y* ^.׵WF(ryyܛA$J6w)KxvZ?_-T|v'MD#*`NWoXy OS; 8\)>K1茈:uzby P l3a aFJ4Z$BKj놈*VJ? T!Eia xD?A§OX6> (J2RM>sB/XaEۜv,8ZB{z縑P~X֊+ b9Ux[}"eHe\V:(je:Ԑ1wfX2;x8-h6X8Yȳy@.ۆd525 .h ͻRs_7Ho!+?@ SݭNƒ:T֯'-~w_ Vo'+JuK#mJ@JG1D\~ҙCN"aӿ uKl?Zα^lrŰp뿚<>F31t{xfl,Vh0SҎ)wã 0,pIJ\rN|amfᵤjEBt!,z$L셼鍋ᕾ!ʌ ɡӵ[kN./`+a1UڼExi{{g*9(mɹb>PhE>W:['cd /iiT`XiÑ)l\D:{c!9I]'D {JH])>}"6UpO>"{Hw+/ޟH ?OU3QƍcUZy 4跀wƝV=pѰzD0K8n3zyټo9dð" dd$ubI%OVO\ӖRlͿҧkE80XzK/8+$ظCճI Hza'Ov怒"j+# 3,#uJ%. b^!_߰0bo6J>d{eƒ)z(BV}HTW$&Wc?c@q>4~ {ݣ!yG\_@QK~ CCY,?fKBP`bD_yEMKUR;9UCw|&eyN9c^/ w+sAD:obi dvLo'W3GS˩le~dmiw1Ys&cwBiOlWxj(hLҭ?{4)Yt6Ξ+=ʲ[YajѬΈu"߾#$ Э!DW\}e28Wiθ뼦% 4'#̖ࢺXHy"a/I d Fp"WƜfO/P<6=B5RqO}^l2/~mlQC&#)EpJ9dDd!S3k &[LLcBJEٛ`/HVp|8F1 MRQ4(~FsqEm+7A%{g,*_*\$GהJdL /yniې^xuy}\ɴn3E//#Gd-1|\PM@jeqCr`.-&U 7 2IyBG4VL*EOtA|>.jn :$^˾s[/n;+VZqA0ФӟG@< afY'rB &:@3 #FtE":&l&'W7udoGi/KGWwlZ`Z fHI$vQ#lJN")eϠ8J!Pt+*!ӾK+_B$R23sޛ8QrM&)nGGxY&)]u/ P6xD뉢cmSwYzua9qcJ:"nԌ+?Cef,U+{ Y%淞)?v/ͩ[$+g>W5ElwqJ&|NQYUjk,`hBy4>l#yHp+CՉ!ST^ѦY:ECj(KeG'$/i۬Cms*HUFEB)śm77d1T], vX>l4uA@/s E/A?S[2*NI4ꏙ `Sl>Ԡ@gSd5#Wn'*Ǜi4KdaX`eVόwKK*!ڥE}qN M:}zk+OR$ sev.(t8?=Qn>^B%?/㋄78H>؟ׂ ՓTS:;.4FXAM ny#8|QY|`D rJ{^QIQF@(F;:^UP[ؓ8Qx!7:,mŸyTtӱk;S2,h;z#o r+V%PT' N:x'1*>cV(,޼0@GB"!tyM/,!B+KPh;b7%VAwX c @!\\ex5+ıE*>TyTuy{n՛[dD2}wNBw}CD5l(|k Cu_3`яTw{v_x?eP;~Kjk7&?5dV{q~#QM&a^1Uf] ?$cۑWwt cLxO[S 97/D_2F^`^ި8 M#E;Z yXT_ 漁lT{n7cbғ-Wvl)e^L`g $@vFO z Ie7+WY/O!~x^)c.LNBIc Su6*AmUN<^K_&8L9shvvb||#'OE+]7˖|C0A$|DHhmۨ:P i BYԷr|J EWZx:bb>ΪX=1*׹rmyȿ))k4SpИ::>[A9[YS&#=٥]tَ|=*t&gJ.4n㌍$oNwIn]=XBuЇ|{Zԃ=Cȭ|xt)7o Ct7=;-7Faur`8*m nhz%SwM"&I ;6βo $*k|_u  \\+]rz9i{Jc,&,*t4w$w:%MRP]-6f6^9$\ҕoQ=aKo3Y7_[~#rFL_3eX+6)eHЦF*kƒ#M^?2Ek9CM@HquS`X:I=qlʶP-C_*}.T.@.~oI-d":h*G/p$^0uŶ&E,fɷn#q]Nj laVTu[]6@"2c(1igڷX=%̦"v:({!#O<)QU~|6P?dr~=#tD79ac\G9-z_J*>2bkSۚM$*u괱Ƭ{%DI,,nF9U{&^>6{ćUjOt#bbqG2\Rcs9⻀LP`Ȃ9C8~Uzlv^%5N1'}=e;W^Qw_ uޝGM5|l[?7IS&PBU !b@8PęQv0$"/76G:SCaЧtfY)jWbꑞ!@'=fZ6MR4!3mQܠ 9YLG럏%id~C+h(:#Y $Z=I_e2vBK'd,\[Սt AQؿXW1@15,z@ТFuuc b`Υ*^TrxNLHZ),+!CU׈TƼ6J=4yܑYԫ\eaHN*Im^4ߦLL pԉC\O&&l4=?$c9(dFUk2C73~NA A2<3(SAnpq}wyk\>A}ܐ{sqҹk8=o`]2&">Sd G4*J8Wt E!y3xnj=/ܠ_׿ r{tJ/Yσ2- (CKxj13xqi ? LfRH l@ '.LLb.9 :N{@lA ޔmo~|3yP,&|JO[wq@]-$O9&E|)-3_sw,ԓq[|P0.VR./!43;QS;w6ib{Gf<~z]`Ѣq6U7؉>{>uyM8yl Fon?rb"~[qJ{aL]]˫}C=C3unD_̓l~exiGkT44xE}aOIT&$wh3!ڦՋkNv+&X vx"۲ph⏨Gl-jag°P3,32zRa\0ȨXv_~dw* š!?KWYLeאN>@Ļ48] ;XDYswK4Y֭[ZGƄ<8Y: ,^S¨J|Zg<Ö-*x+l׎$`fڽ `+]ݪ,%MLºmc%*Q9SXC[`ΰ|N`LW!yQ _7yictMbo(r _?U/C221Ekor (PP..zܸ7prt X>"[<}җʼnJo%ywi"mOE19Lpch8I@$_>jL|VW<h9Uok!?X3Ft,C?4~L޴V\ꕭxjHb9_Rhv$Ԓ& %5$X-Zdʰ?Y0N7|XC{\rh_c_40"⼖y7\^Dz5F4mheP ۵~,NkK[Yљo r`>2qIΝHneC[݄8=Ѽ-;Ii"2,,?qPst[":\HaȊ796Ks'EdMVq.X E ʟ/#(2@6"<^=\}[mEbE2I.e 7߉%Sl\-br.P Ψ rR,A]oX <)d\KE8w*م4S*r=w eϚK/+Ka24ǵ[X"zR >mDpӊ;Ϳ%L;S3$٣T#1S:x  薆Of6Ο)o ,;)J3l4ðU1$%`~k]$1  HP}DMg¬6;s3YLR]cisby:# l2!/$1H霙B3Oź/7*:[xv{H%<>h% Kϵ5TЅ}F73Q7?g`t#ޞ w{_id&Η'E!v&9xUsߓY QHpEݮ܂gU}Vu쾕CWj÷sNgQ|T8hC3[&g6m@A$%j_2au7 ֹd&A$O N8Z~L.@ J5ߤu‹Mn4ј4^Q0bv!,d˵W >ӆmjI\Jstaj2dj-IUW@ G"6ѽ#˰o ٵXi|>޾N%yn3uz/9IUao ÉYё*B4vyYKwK7zq9z[?q=k &G{jZ/a^[rl/bPaW͋*HڬR~(i5Y)[kyF7tLmOQhpN [ܐ) XZݍ9ؾCg5\O7h_ߖHжut0/^x{ݸ \.!yVz;+\Y 1DgGffS&L#R!tVϯlm/:{etR{ nW XQ#iFݨa|TEN\c5z%vʽwRV]>N=՛>ʂ#R; )eCL=yyM%\N9Kg@9IF+dT_Б}.CS=m"͉'m\ͥ VɞVwYsC^-ۼaRkN J|{sqRQ˚ѐA*@?}4CUߝXxZͶ5=}@Uu֋a .{W%bte0^+HZN@$TTP{q.SE_B'7  M%!#I\z%DXں$se؍~L<](/kۣ&ILoVȐ/&?mpO4ZƬ& 5aBnl1zQgfF}H);4F; JP| Y?tOS6 ޔ>vIqnu[mXX}6ҁx5X*Ŝӽ & j?xy3Thm1 nYc%\E/G3V%4ɛ}ƧA?3ǼG+AnA}whQ1I.T#syCp>4YԝzKϒAm" w"mNPPyC!T'O CAw/mؓS`?\. @X_/!Vc|l#>, <B[G&00T ;J|6X!XyR Xת18cH\eJv͞$[ T 3E x'pg9 :|PL6%B0,Y8w 1׊'S1;О%ߨ24uQ*6zeo+C<@vu\4kdhWW)VL,m݇{ӥ&K8Ð5yg}32zjk%KuMM[h[SC m]ENZ QWؿ% z} w wUξmxw0ZUT~֜))t*==3y q26ZF-z3YS~L% 5:(9؏$&lm`cDQc !mGYưFj0Nbr&ENfȞ{ewMcל7.iz&BZ[if[p4:A]G휤Qn!Bj1 lx'k1ׂS8&w^UE3ލk 'Otч_mIu=mLmȃZཧ|fxIiDT` SM;P,jXX(Gͩ]Xnw˪ ",@3n@4 y[R' /O)861RЬuͼ߄ø~ [Q[KvBG-u=eV'W΂6/Opġkơ=* {>/M@)_`Nr4dB`_;74{/ru\_bh^<֧_pvbgЈ𠝑UÌ3 EȹYL(oAUUyjzBHz.\*I&_zD 7;P c8a=?:F9 Q(]O2cZ:{WA`ؙaƳJ eKu1-eB5Z5,o`pRchͣWZ|F?߿Y#QKZ.[*_fGUr'mmjCڲM{Wt?H9f3W<`^t6E-vAy/Yշ,ň ~G358}ekHl֊o; O)6uayItX%R[fJ"o'IPqPbތqeop$`kiqkӇbu8>8iɫC{9?܂F)+>(m$X̙[W~\jwgY~5%>KƌjpȦq1AV$l FNtxoqa={''f T -T*=m(s k,o);ܴ'8H6iԺr|--l{L1:԰jsX8Ֆ@Q5 SlM1,生xτ82~a(R5(6:ny"'#,>] gD^ KL^s$q pM 9kr9SA{QC ԕɱ47!H_f K#6'桦aX)>P? -\xzq,kӘ9lUʮi:ƦSQ}Z Ӕ!A0 $@ٯGlNdd4-ȓg.[m9B+qg1*!npDJ#J+ƾ`D:b4] VU$zI)\Y]Y,Dy58ϯ+Ew×r_:Q:Ә@ R.([JnGTLJM!QABq?Rn6g(YkRc Pjږ֊*dqWgEΚ#9 3\~\uLc2/\]M5Eqm ݶԨQ>mY$;~1{7Gz 6ɳ!wsyEh/CF9{Y_G¤?7ؾu wp"[пnD{]: nWģ9L QM*dNsΐ f.'22wMg̋B+)a 2:@E0u݈?do_+b[HO}= uՂ5]O<e04Mh A 4b_<&G)5)ex=OOJeq3˸ C>z-l}!Wb+9UBЦT0K0bC~̥W4U6a~%jJ۵CX4&8 ¼HiUsf7Ӄ|SBLtq_){ E"G\nRP&FQseugB}2^Hugi32;<ifT$/Z]`CYHtf9:8ڝ޺Rȅ[*Yŵ*|; dL`fU`)¼0"fUlrps,bY)?^. H)MAh kW07~ᇲ 5I   YTW Gl, \4Ϲqc.p -ٸr~+zlb[qg7!o]5E9EؚvPWxGB"<|I<66ev=xkH5zb:^s"r^0mFL)+Ʈ˺F3)]aђFZH *N=~`[xaW9xPE~@FQ#)}Vz"94plW8YbS=/4,$kW[^\'r}zC=k tQlVDtRBx4 DI+Gx?}}{sHvdmFDN ٱLLIFyԏ=C뼖}jn{ycC47ښJFsZNBua1mϢ64X-c.j'"qΑnWA+?!x ɷR~a.@,HmWZC SxV:gS`Y`᠖C; HtBN5HٗYTXUz0\w# cmFRheɖ 5u-U i띎b9Ns=:ssEϬ`O}p%zW'=8y[!#`e$BK1âqkݯqR{blT5}u w1 ?v+UvۀHFIy/K0<"}S=>#2-DTy%}Γ_j;G|n_NzxdB#"i%Zl@X}ip|审t{[J֮Vay0('2F^Ek k|EC VRU؋ERZZ7Z`CuRI-vln䁝TΤS 3"Nƹq Qs1՛!R^!ıeS@ h;uֱ W v<Dj(+$\ Bhː6/}m]6Uau|ZoAŜ Q#k ܭkY o>ꪞ~jZ;P斣: ~jl͎tzQEޑ$*a=vGeIJBAԉ׷2N[^јuAl{-ZiNV/Z=qBPA5çBaեBdխ3bA%4dy7*sSr]D hs{ +wM*<ťzu$:"fߜT&>o9g;RxAz2.B_e!z-p@0OXOݮ~5VXmҫʸԔT}sd~uDh?Ue a~&{j\ɟ+ >O9{0Kdl`=TH\뽂yLzFJ}[Yur[8z,"8m+9N=5H:["hˀ_YuV6I A,(NJ KL2M'_ett+@>$ (TTнO2zF߁mLPحWUCPpq[]QDEsVb7Pߟ֌,2dHdYs?G17DU $Z(~t(} 5숏1Aqls-)4[˔|$k'r%";@ʴ2쯕͠ܐT1/" ?2z6 &su@>֥څj5R  zO69© >-3_5+AIg4<: qP1Z`mk޺(vAkэT>vRԲY~)^ -h4gosw‱EF0ԧ{X6DCbN)Y_`pG 0 1k ,F]`}RpwIAil;ίWR>O",4nAq jZxXYX}|i1Wrh?_:Cfߎf@.֘UiF.@655-_{EKrjhmj5tr}żgjsԙP b 3θSo(=1JĀ8 [UdhWS#h5QCIX1? Tp4}#xO=7>z.Mxpߩ;96T?"eKܬ,bjo( ]BuUKCQa%ѡzoq|;8/Ăj#臎JɾSm:/a 7bx5MA`_!s-˝fn<쓧 =RY#{==uî+%9RC:xنmؕrzwA.4܎'~&1 竓c"_Lsﶞ =Twad7G㳡4МU~tMQv9+yKrwTXyKI X;b_?,r)TՄAWJ̀'_5 jZ1"Rs.4Si](W}<ZF~fL`D SI\IrDRr\)̇@G V(odUy^ 9p1B g oPhP$͙q=}֠ ~EW%ȘTJ Vc(̣YQMA[6wκGűG2 8t:(Ī^[si Ix|5VM_=pǦ|'u\{}qX|S{PX <Y*HzE!ME2){KE$"r؂꠱'s^D<\%wz9-XB}uʾ#px1q.V*(؏EHvDW/7>jzvk]RQΉ\ά IvOR?B fIAЉr'i!ێu ma<f'0d '‰F\D "YZ]%"ȣLe1jJ1}u=*$PN& thee0/M.sM^dEb:u;7QAՈsg^z*6.As$51!mqy+o YhrCSvnxt-^^gpCU^oO|b^wxeTZ:tyͳL3o6bCnِi [+C 2"ҷ|y)O_6k:,2e?2pp`+-5VS62V]|I8NgY&qOrv%H覸?GgTݾB!ĘN-/ak/W+=O3?gQs 7ks/ h-,^ o$Иy۫aB)--)X/`K?/*1M߁18VV 4Ԝ o:c3RN<1 f,C`535dKĊ"/FC2#űmF4cjFתU=b8 8|9v%xқtXרeؚ %xE!IC?h\C[}mK/aQk)Je?e l%hwS>m?-i9F?8TW>~v~-:G\B l"`M;|.[!v"Qq%@pe4lz5j3g_vDWT.NC4jn (XtXc7to%v̺#D#Uxg𪎒D͠POŔ ='\dNkAZ¾CԆdQ>/⢮%8f| ,q9a}ct<48VwfqL萁K,MRb/:o衭ɔVY(O9QuIZEZٛ9E}I/^"º!wz> sC};!>#Nj/# s{ vg@1 _軜ϯx}lsݳ45r^( ԡr# XEUjĶ0.39?D "^ LtB5: EEȓyINMDt70kU:bga$TLXWцœQxQ`xsdf94f/|~ŲwCQ*K=]?pSL M{ۈ\&}8YYAk{+'(Jf_?Wswnmu)ϫ6:>&C4pWww;"QSv(KCS±cz p@5̸wY\25kn}ƮUl,,gʼnĜb1ޓ~7gjG;B~h{WX,|^6ܹ//_23 A4[ 3iC"v߲.'bE3nz6f5'g"K\+&܂̬ET P[_vSoݱH>xHyvՅMK`3AlH"Bn*Z}O'kju&fSd<3u>"dNS7|o-~tHd #n\̋At]jh*G6%[Xڙ)nf%'QD}&Uzͅm6MrLVK? l]kcB᜾7fYoJ@LC{4t&%SH~m !sboQ _l 6,OuEuv2f~ifQUN/:Z$`+L>kd>}ϸFeu-ƫfHg!Q).5q+)d~t[h VoBkK/6g:K‹ p#u]2]zyJikI^o[X8^ĂjsڡQ<4tTWk]SrM!nKA.@~M_UcSj^['s`I)%= Pno3U0+CXF)?]J_y(:D'GH]+ˣG8Ǻa0}}ei{w7 t-_L86$bo} aìitN/zKxGz_#V"4+vs9'UE̱#mp½& EN!/iP.E͔:Tې9- 3*:+wa6AԺgNru&E68uEdK%BXutf l\iS77 F],UQLՠ&>9?hSi9ySrb`0sM rG^ͪpjn{OԝC1ialRw{ԃSz]P`hS!W!Jȓ94$*SHb!%G-ms*ooNK?>hE$|Л6yJc"Yk&HO3Ys/W#1Lnx_bƬP#k;y- xZu]gb8q{M&ێv 0fi*8jmC۟ 'I.hraoL# nplEȄlWދPxr&9_=z0Ѱ@3U?KF+z2bOĿAHj(Mvѳߎ~e)%[;)>Sb6od! ߝ( eٲh~,N~ǹ=R+r`Y8^t?n_Ę^llӵ)6rݧ_5`忉cf0E? /ُKE-L^‡ ^2Xpfl_{|1zDh)UFr݃_٬v3k"Frwh)=EفR\{[(OȐoSlK$\Jm%M>zwHG ˿^N%T9'c?KZZtM s== x`vG aM!̹•{Ut !c}|U R$j~f. b o?{Xp GjWk-?wQJt7s_rhU9 a8R,۱Nc<~,9F(FL9ᬪQ7 arr1!ݻ]?^v2<`@Ox 1@ rbY7>3W@xDԌVA7RG6)B=^~ɰ-:/4ȷ-,('88hkp߭ FfGQ7WB!a57~GIƀ ە\{ʹhTӏ@jt8:1`}[P5ϾƘU BϕږL UliB"ohf mۓ-Ahxº~) {՞ρ(O{@p+ \숡`،ϢU^6X5 \h*3|d" \~H*EXT==_ZGņަ  /UMokQJP$P 1s_\w)tS-fj8vB #cIAw{2y1~$%cYBw?6BH]Xm5zbxD#T Sݱ3PG$w_J o=躑9\.\9)׬HC2Hftfd)H8P=J8J5M&_QCPs,lQe,:=-M(a?Kyև׭Hۆ[s7}ʞ@; X41ۀOtJl#E4 E7JC%L62'˟pT(Vԙnj*.+#NnSP2nK]J r2ekWwquȬ"q&YC ˀs ̯\!IdY% F] PfF"2G ϱ;,<*7ꓹ_݈d0{ܦ'9_BG?b)Y\!ϛ`A+_f?EW C(ͣ3B/k ZR'YzU|\O&N 7qYfl>u7lCfne#l|e(b?8TF 4ЬkOLR^vt*z< & 9?CL4nhΞq_Y,4'WŢ]Ʌ"e8GߑF[8j[LlCC0X폗p=h b+lFw?y_W 2<ϭn0]+2ElL0Dl+Uq6sQqaMoaFD8Ծ M[L,6e`|ZWtR{lwGs 8ۄN( M6U2i!#[;.qd}]5_8sWvl(ߤ{@ꕁ {SﯺTYլsCo| E܈U/jJ&< W_F4&(f^6wMS{D_JObV p&qFm6uɉ2gq tQ\X;[x'ǽ–?IKX[ /4VйZ}&NcזD3ȼ -7u@"ؚ`ÔR{_!103;^il [V=O 'B[~6_&UD_Lj"(U Z"Xh&yccg.. .n.U> Rd0W;j33A[f0 0%(y?P?ϧ󃳳9nIjR;8إ2Fc7*Ċ6js;WU'&^=J-#L4i =@!ӝЋ݀NQ{u=q̤WA Yj,Zٚ?l'WGG.vq2p8`ݢܶh&tZ3< \%/bdQ KՔ9ةo_ٔbN =K#oQPs*E{ ըŀ.S&zߥᦰ}M[>E`tY&P3xGWɽDfc@/[rG:ݸ埄hب5A; 5+fQ'V!+o `k9F΢l}򶶂ؒj翃*1aH[ 4w2,ڭ%DUa NHTT?ҟ6V-i01<3zNIdbyx0Dg2L]co84V೗#u˶$,_M G~UIg@ڛFvRdw@9ᇺ odIGo~-92#3#i&|J$Dt #\ YVw_^WW-syC\_Dt r0$Y%pe;o{Z}x mo zn$=NC,ɉ:gCA:Ye ,drv`@ʪFP3T! 1s^U.ӪRЙ]4?hT3]LLj(n܈ 3}]e kV~qԟYRrU!썈͆0qTaځ WQϪIeK}L;E)&\DVC yKUyAڤ3G1{̸z~ s9$W+:m@n"%)X||-!ReM8AsXy ٴÒymQh*I:^9Ig&,>ӝxtdgY2xK[^Kr2,ڑ#O0frO_5><YhlA4#\QNOLWUVĆuE-%:'kP߳61X*>gN6 6S]-FBHLC)"م໏tc ɷG3"?2v gnj]kj=/BT`]/JQ̱|C3(iL{l%23X<" CPqij,c<F,4R Tƈ]TB;fl)YoVHџ:]El7m3k= 0KM  b324îIT1K>=j-D-f/ ٫Liyfbx_}&Bqäd5nEyN~?fxÎ)sbZ`zpm`Zkg[7O+ZÃ|{.v/7ŀ cUm[۬KͩX"g!OyLe2JQ|?e˸!-[! "_aFOC]zgiݽCII(?8kZ Pb+>nI'{a ](j[ lP2-Pf!(5!oC 09rUeVvXk1<.rr\zp 17 WT&aVCdi&{='7/V,'L/J.}J_]i8c`coNqlJGUƧ4c) X< ,I}OBaEü vcB~/Wƥ]ۭs(@EF #NRA&2mF\`ޓf>ZzYB]7;𦥽҄!uʤ.UW Neq́X1+{~+7+\>s5(aˀ AwʮY[q<ղhO}7QȮ`J:gEǕ2ukoXVp!+b yО5]? / o4(S M]WmPZC1pDSI.rӌ!?t/ (Ic^'xwvpkY6Di|WWWGHJVIr]PO 8 ,cKQ$We"ώkaZѧPuY3kڂ}4a hRR{wSVՆrw 2*]IVG:+i r^ mSr@> ޤCl~T\K$;Ii#7||~ 6#ߜ1z4Ca3"̼&|s|͐=k]b'Kmi_KNj;<5#gyKu?%N)W_Dž\>Q |y|_c7G? ~ n>U7÷;~d-3JEHIjEI$jn2`4XfSV\O;? 6V?CselP0UP m9'ؾ_A>;aT9noy3owLpg\Rj6r*eM_f5aՠ9&?.,QHBTŧ,;O+!5$ <+;3)\VVnuߟSV=yz)4#_8IZX;!x!" Wp,g`%}HBD]1(S뷨 QO }:VIK]Ř6ӇjhWEɱW=|U%GS}҂^E6svH9w S'8x̳g.0:82}IU"7*ΒƁⰚB=A;|7rk.oR'yQ zv"d!.GEjU 1Gm zMu2jO-4,kо?r_%wize0/otTtt. fa :J1d\4M%p8 o7>+ƔUPԏvs|i~76Ų8ݍXLuϔ,ɭfח}ҕ^2 и>m%NӬo+~c9zEj:з׊&BQ0ڼ7!z͞M -wƳʖΤMw4̈́e7c) Uf <0#ۍygsBWx XĕG2OLOQoჇ t, dN?8OO/8m${Geqz>^_R5xFr[̫b+6(խƯsueIʚ4cSX(O9&{R5d]Ӡ*t[þ\7e=Jc%nMre7] nF} Wz$tcgׯzB|cEδZCq=͠&jBQxGSyhƣs8 |`@7R1B8b\:^;_U~20ORbIZcA뉯(}2K (;z=0ftZ06 H]?2M{#܀V!f:fzQAOa}3Ģ}mӵ)>Qb3ԟim<` 8G`kb};\LiD&Sdm:^DžAZ^C,8-( sDesXw0V/JY DCp=HF7zC оS=Muo亵5ks@ZGIմD.@pِؐnS)VRg__`67u s%ƭ Sj< B^ stna0AB>Ή sv" f˲u2 ]8(U> r@y-y)a(^ ĭxDf# *fN6':U|J"wL\s_ !A.#o5dIajc,kFSwB@G/c7i"Tb[)85BYew/Ĉ6`ks"?}ϒO̟ŻE,J8Ni9X_ܲV/ŇE$Nߝ3L[Xx.58_޺k&{ܠy_G΃*)HWR)gAXQ>v?*Yl 3Dz0D[goB*@{yR3U O Lq]-Y>wIˮKMg~a_RfuO ۈiWB!<2_+Gʚ\pK (-QryG=R)>~;\eX<%6O"crM)VC'" iUl)Hh *[L<zAUy9x&T][IRUV{ (ɍEqHE<4] ue% .cbzTmgfa76io KA@P"H">YƊR;tЫn~q:$8l`h U+gOvIKǑtL4ඹ}=lQHGua̷ux9-V-Qi;TdŎjAo)ZJ!dJP-xGoe|g OFUEQђF:܇ۜi^4 D%B{ xK1{̝SQnB6+z˝ߩIe6L ʌ6a6Qyf"\\:7(MV*_jFby>/6%9i>| *pmܛ(ה*C>#YbEȏo]qHљNܥgxLlqQ?Sa\W Ce7˄V1.7_(Pܙ3ru~saRQn?l(Q7tZZD97DW+ԝVlœ.WnaZjOtN3J^Oo7Jil&XxR%x G79fb|]14B&u4dMitiS0AP}.yZ`*?65޳Ne\Ϡ+Fϐb@3<(8cu ~-]{k'q uӥQVKII`쮧rK g1uzfri؝cI]yVJB~V* bo {LIz{O1{!g-(%aqn2GG]dE)c$?pe"݂ܦi{7jҠInъPzpEs>V };*f秚zI2o;iFizq^~X&|5tPr{ws.uZE{u*zi!qGZT35W?hGT-Kvϲ,kW^> ũZqOtDQg0ISL|C j9h!୼XfNz_ܟ3:G\zX;")| _68k\brϑɻ/>CU6e;х2rxtK(KkɭmrgşgנEfV^jCF+H{ ?RA~pW@ "ż%pP% v GufOĕmr8;b(r"`F9dE|FRAcKs̜\eg hbqGG"q+Wc[qǷ'y):k:[w۸A,"+hڭdeQN5["&#X s*Ѻ=GWe% Ck .ԁ`pKuM~wK}F~wJOgOk[AG CEq#_[^}In Jόaq$ɶgmF"]=F A3{fu'Q\٤{-qnoHkAR\R_6Dc8|:ݔ6=֔;T:f@m$[%Bmcn&͔{L9t*}רpEpQ Qe)y3OYÞU E83ܚfaT %uF{.z2?5Y_cK޸OQ %Rşqy%l չ^t̾B'pr"ӽޔ/bkȶSlH$kB0ehN0+~L^'Ie!,ߟf y ^< MڧZw )0lH.?L&חV-l64*KFQuY֥3 D:D@} <7-ɔaZ3_K0)6y:kp ԫ䩿Yg(z0.Q[ۏ7PlфGF!\]-}Rz,˭['ѹ~mR򐒓鋕T_|$ [ڬ\slغ[f-S_,^gCQ赠x7/4/F1쾶4 "3ҡϏ4#tk#7\2jW@/vhSVEfx3C;V>x*zhg\1]w>p_;m"X@NX(ۓF4u.4IV^ʢ ouG%i󱜹j))Lx#Nvg Jm;5ʬcS^2FPU%p=Ct~l.x6qBG:,ixI"78q` >}|߇BF"Q[ 37= ßyS}yuʋvpwT$yAPC8Ql"Qpa|$VR.!1X l..Ι=7Ù)3gJ8l@d˃~6#;qŸ`.wIaZa vl!1K׍4gr꾤H rZ{?#yfkuFӜɧivB S# d܉ 9(P]G@7 GJ_e]a݅O9#gD  nl躿+Q1,|98? VeeokF4:kO:JbulRE8fU5""0LП~$.w 3qz1ˋN2eF|M9 pXa4'l?ʵSzHby:/ދ:x1 Ĵٛ}RCխUz6!fj+Lꮲ'\܊lwf5/CwW螽8{5RTq>fͭ+3ӳ{a)^oRT-b $Wf򗋿'UR y>oN'IkZ|Ҵē5Ӵ*qG -tTK`q#HlGuH7>Fߘ:,Pz")ťCh`I/-?yYx(ؗe% $K|Hb :yeс*.kʿB&1ؓV/OCBZj'bMIj_^îjFP'xnIIEUٓ5g<2 7stԴ)+`ɚ@ k3-R7X[W_ю&e.l9Fl msU('{82Ι鷃p.*@>|rPvu͈%}XDT̹C,?.SKYgɠn0h DNj솶+ڦsݼ`i]FYz,>c|ˇJuW=+_J11d{+kBޝsTHtv(5 L_q,"0O,0Z)Q|/1lmW]?N8(ޯCp?QzcMG #ʥqxlx)֔Y3:ə)F=-t=0w6YeA?bk,^lR3WMaZy޺00ՀФn/[c?7WU'Y^c$|+V{ h}7?H"8op+nW]_^J8!3# ~O-bcyݕ%+`+I@j,g2͝1b; ͖&C^^f)VxMK\Dđ[*r~a6oגs/{pY jozg+Jf-Nr6@ H^&FѼ 4[Ӵ{>tD4'ʃIVU#G@T{- ->I԰˓YapRe0!!| Dhܥu2(3ӆfs,F4˫Fu}Ƿ^j%褼ȩA߷u7cd _'}X"/y͜i6U[cy'_hXKBG) ^5N{@[{5{?ޘ? ^N+MWՈY:t|KՐ I G70=n< .ߔ!fwG|(g,׶7St]e%UA3ls ߔ-x;>G(Lu]ؑ-7qs[~tZNB` 'J ! “ Q6X M-mP,R oD %)GP~T#]F*rJ{QU|k宱poExm} 3JӐꋑJG/,Y2!m5b+yvg_Oyz1דŽ)ۛb 9u( 9xhkt/b9 cuP/! ZqKGh~X;>NITVȪPInw;CRQ2|bN):Hqp KНotPl|cx;C?J+g1a\Shݏ$[͜"ʹZ>@Tz{|pAQ@" C͑ER(Nx`?:8c$,&fr.KLaEY2dmW;P]nm2P3kp, ƽ$5BUi%#6T$иH[$]`2ԵQCÚȨBx.D1sf* y4sKlzw*6fY>؅#Fc7&1 q#MDØȽ|&t6s3*M39cb`1UB|oRUPM>&I0ρn:ִx<C ?𘭥KإH=Z.2NBSۼz`7L= Xyl~;`8KN&Mɧ?G@10/5-#lpC@ 8+Xr< ޼Flo˚Hb9;"&oDd9!!$$dt8=]Pwr7 >!ŀc{/̔h}Vc!TLi셆E A"SI#,ul@xa*jy |O{bjyb`fqlD=C6׽ ԠSuߎJ~s Zqmvs@ mG6K } <(މCNMacc#gE+1K :[5y\{ADk3X E6-(_ʨ9!4-ZW;%\qDĎc2Ffӫ +%re%OQOS>Ej:b@cw(jK7YL+w-1&V[ElEǶ_Pφ9+_0ˡP& _A)$2*9?F[I>M.!싃|)6U+k%8 3U޳׍H;.n6,KqZJQ|ndz*2h_33Hv|^Y :쳃%zqy _w|_ԃV>O>*k"?ҽB0Xc BXJޒlX)4AS%m%8$_:UI"ŎW.f/: "dLwJ%\XlkB鑁9#Hq!eF_ &84giսn&RuNh 8B14M&wrJ*Xv.0a81:Xkof*Yiܨ+{; 9̖)MUܮHn4/g2%Soit g^ J %nW6MaT3{[`{_k5T麈l="Qޖ"#Nks+ib)&>6  }-xEWc'JVЮ@j|TZײgeqϹi:} u0J 8Nd< : ӵb# У qdl<1nnJN'aFea @Do oŪi^XGDWi.ojN'ރGYvIda3,dEZ/j'\D;p4)J{;9\h *MA#LhtHXcs6U7VP*\T`պ(!V ë~Ј unG%41qE^0Tǝ/2iK:xuShe;{d7<@$oKE:e/ŁQ$Y:o=?B5HX챴Pq5yanNM+[7%t"QҨO3Uc1ʣ' }=*c3*~ٰlD,'aocy8sTEj=)voY.ӺM8Ό|)jj;O"L|^g5nEIϱe%9:- R!0ã'66H('0}?rgLpMYhY9<hEͿD+*)|55i$Ǹ=2iTKv- ΒaU;D~5gj^x M:Ƹ)KCЩIm%)õhVp"1_zKk~k:u]`"4NJ.|-b+bޖF=;f44>ص(Pֺ`U6GPl/N?"KO*ȣLYa/EŇ@nxq7tl6һb}2jȼ+~:VY-r"S$>TZ u(3]XOw|B,7@>.=gʩ *;Ʒt?c-`[{eGkPwl^c,͞+/9!ZSQ ,FZ l$wnɲɕkE9Xaσfz^F rzivF!Ao*;F#̝5{)Yk$WWGl;&˓P3mw4{JjPOS]ZHN N R{jK244㽟RS|䘠(IZaAQP. ܮ~XVN=6t< Z~E9T[&ʗYU0HEy"E}C Z6eă7{(hA~r6ڪa%5?yؼg7=KF3#7څHOf^ʞq;mβSr_e<+('4\Cu_t'WjWřfR v=kgT&db pZ fL=3XmytgH$^蝜zsoB "9ЗG0#cEfյ6Zn8]C$eTCٙC09*MYgV%=}`/*!Aҋ8ztLOg<r񕗑(ďUqx5n^zhL_j ohn`"HZO}䢪] ʷF ؔW*px=0/wN>+:y*<]S-Le篎o)GвN`: w{pkk\M6$C'Z] =Aq,dCGN{(G)s\S,(9ǧ{s<-vMvQJwd ƬWO5kC޾cI jS[Ψ!V5 2?4]Swf b* &hj?t ͺ@x#˜q?s#R aFͦjh}'Q VÈELkW7C.I'^74S@IH^^13Їh/)oIȿ#A;Ә b"2Hu@S66y.L=pqdK⫞w+dl2|KVH;'$jk-죑>eY^yĀS%[6_>}BT%/o~gF,AޥgY  ls3Ϗ^hiR;K/e8,GILbI "غ$UѾO2L1dMA~;- NnJ 1bVI'$}cظCb7m{4aW_uS XaGGU}o(]o+x(G ĦИ6xK>ubxwpln jk=fUqi>orxnuρueg OڸQB}INԱiU4Y yTgjCrxўI. ʕ}Ͷj(Hr#Sn9FWKh+sdž?ib "I2Fϖt;da=uKhXUR[yTf 5Sx^=ч9]C!/`="O Ftܸ[孥6UD;"}u͍#.t =^ٿ "$l^GAİ/ƣЏ<&PH^67p;)]x|!L_=Qc`$1N˻G7qu(ʣֲq % luxZz̩P#uP6-Ů $ycR65өhЅ ^oB.Y].'FXUǔI6!KuV;^ܕ뛮0":W᩼jqOc)&Ě&Qy,tJ*0*][ p9bSs&<θߋemh@ KɋR Y6bwHg$vy"ú޼5(л4*p.$PՔ/g9[%H:)L/.'DnMrsPCLt j Bn?wљ~Yyee +(LJGmZ<3*](5G{[{6*J K5뿼HJg Q"Ui:.|UBѤ,pa2g,.=;SZm=[Ю)9q{ɲ:^Y?L+'sZYb9Im%ӄf၄Z3?= 9׻5N2ez hu~ijm<,ԫD4/y"=߼ 3Nr~0m%-TVWFh:.+/Ĉ>E%/ :{nbvM_e:a |X~Ӣ|陨XÊuB hHwxqX:Sop/>h' g/lB8>0}K2d^ eiyJrC>৺ Al=Op)Zg{An0,+=RGکJNƝTY= R.^[y7, 0R3XWҤeD C\ #obQ7%`akyސLuc+ lD/q3/|͋G9 +Q%ఇ\[0MHXr5ݢY|)i+R{!ǝ+i%F8!" ffMWŅŕPxPgI][F$.V"lEfW[5:bUzvj?YD4g]eWy `N-sˢ@>մ7frϲ1Yvo׈K@ !-T;:=z'B)Tؙ 8gTyzkˍ1x5)7f3>eDz|`6EnFUwĒ2 Ȝ'}E8AEޠSDmvɇ5y}bhL;"])ǗDMoD` ~)?U!:#9<8c 0E%:xSvy5%E%ּd8ƱL1sj/17KՇyE$TGN6\4G @́Jæ[cɑd)HnwzD6˩F*_Y= SGһ|L|3G-˭@-u4ɬV[n4ݟ+bqnƆ* j:LSxQpX<[hDt˩5=8ht=;>n<ͩQ7ѪtOa ϓ[.!r.@? dtKaB[,"#{RFMNfHwZW\[/d4@TKִM2">B/'.f_:4e ˨fUՋx\zʽO#JWnq`"Kn`' 8Qc'XqN7"|GUr7&*WLP]8ɇ~B,vBMn"kHy5f[SUIJR [awpGfᑔ8Q,ΞlQ?iz$:yᤙ\S &ɳbk8f0 q7i11KI18.|6}1MV )p+S^W5[M%8f6svkfgɻA, J_T@P/{M|Q@c{O :t^䚖v6MY nlI 6IiCaNCZեMO-z?OmA5%6DQ;ABma G|ڻHSTN1="wQY+LżIX =?LT9G/l_W9|_-=h?qyzqBG3N ?Xf3аPIeaá H`:Dqb`,t8ׅ0X@K!F0,:oYu$?+ FB`K.e ws:S樓7fI \[B&TxfI<:n9=Z 3܁bR .ܒeϫ̎LX'8e8΍'̋$#Ff]4}Jнo_U=͠{sVtZf5w|`eӃef?S&`đC\BW&T*(ےm`ڭS}d4z6ҼE[uqʀi"t2N&]2Z'\@A3SPҜ`*LXw~;xghT}?v@oZ)+ *IeOv [T:^9sn~#hrm 2rWLF"<24[>ՆMLӸkO$;ѳ2m cD ℎ03@|: ܀(@*jei}in/l^/F'ڷ犪kajtTgrpWİEɪnip n/KDGu{ fk1o!8HT156 8=:Tq`3-6 .,z&=K}"atv1Gz35Wgȭ1IC3>m]rKpxB jqd&5RI8r0!5>0j)Ax@*۹&Rۑ5qF3뱖0X]aZɿ)MY~;OLYAJ:0(TХ7H'ܹr0 n8Y|,kl%~ͲQ6"M&v,ژ`㙞 =m2;: 9;67c 4eK/f+ugxk4m/GQՀ_}cÅ5+d\"Ír  7rByE.C2l08bTBplǚ1H:܊)El!uqy=t=qP&ejEK-즛v U?0H0殦#ٺUef>@13zt5?_;]2;BA`1׸%px@12ta-"C /C Il$e_[Q8daX4o BZr{qf4BO?RAO 45jdƭGlc 8P=@i׍oq'Yb]:nAc^-5)|4ռ*v \MP % :hV.̠>}`ղHH{)+(=|SZ/gCDs>(!ԚH@c-` )ϜrX[ s-@B.6@ӘAֿEEo-}Pq]qZL =b=nc,hخ%Rt5'G6=^1b Pk;Xgq pCIbac?(3G -jd;lVLOU(D:Qn>_#XE Ðn;8&]Z%ei a? }z  ` 0;YSш ^F|| 6P38#Iw?7EQp $.ql%1  Z\m-Xfbrs_B̰0Ap{'ؓ;)cZ7! 4CCiao`2 $8;6&-A ::6 5!NN+P+$dp!#/DŽmefhvvMC-H30bQ 9j zЩd3TN? P@&U;Do>HVyRs:g D֑Gy4Zq5) etNL"4{UtDrHP)VDE. $:h= a%#C<|N+1ouizsE k-Pڀ̀ug#a y^F6Lp56XDFrd00`[P^he4[a7EAB"΅cS֡v*kxsFO4)(3bïtFQ,DAIA#cx`,?͚ɑlvŭ8\qF2f#Sk#`GRc 36 $^6Ί1W?,`nS5e2T1ڊSiPxt©ãոpz"PDSoޮHW16eC/+GlN#c$Tek5 ڔomC#j܀+) k=K(ߌ(kPib8@Sb4KRz'4$I̋Fh29!ҙ 1H`IbjBf"+H&eA9*B@V= ΢0ФyGea3 NIF)QJX 7!S+tSR53D|Pk+t޷aAMe>Hʊ6\$rInfW CJ(D0:D LvQ6!D#0;*t_9Q`d`ԇ ! )"b@,Txp7Ⱦf) C(zXCUP}1ϔXo6G(k1xK5L ͩ|QՑ>!ACh:Lx;G.2} X5s ! 3fteeworlds-0.6.2+dfsg/data/audio/wp_ninja_attack-02.wv0000644000175000017500000023644212140200333021410 0ustar felixfelixwvpkDaBWWWGHJVIe)yןI84: p9@~aO@8m1w@'@lTTLˣqsa@3Iq;V,I=X3#~ܸc80a[yФ?hv|XQ?eC̈`bN?\FdF<]3+[XT9l eX>>z1d8(māM%i_~4?CKTDk 4Y,,yegX*v! /1wX(xjM7(L8+\kK2N?tKGTbKGMLI]qf(t-o(?V& y1z}saddcdj#BI3"Hy^tTkQN qc-~x?.e>Nq58еGY.9jnP:ЩqcfO4怎9O[~f6GztR\Cr/Z}3ڧ=[ 6%тl &^@=nd7v(`^bX`#&xп/f6d]Pݨ흳T]łE&WvZJoGP~}4vGY@y/W$i+MUɾxX1}^_~Ev`LIXD@buwrfiMw .="ݚ1qsw:vH`ڒP|CeV%C.<<+ôItG_xi=JwNa}2X7*f4ؒ@K(d`XMp+B] //lVܡſbSk|t?lřDd܈?NoȭQPv=2-ʺA0(ֆ0,NҔi^d-ы =&69>A"q1u[1= I% kLR'qAy|"l/؂TOYP?-#N?R*s6)G~uPd\GjY-"*̻/Umk$le.jt?][Mb.d*rG}\hOo|^Jq?~N/<ߺ&ޔi$6T>;=G;o3ˆېǤ>V 2cglQ]9glv"ЅDG5#H #38I+1L t`0>`/M]XT %o)} {I;Ce}IXqY{T?rgI11PR=2i(^= 4 UoD͇=\bµbIhBRx%}i8˗q|y_%u~ %' 4N+y9)u;A#GFxU^biYY. ?Mˏ_k"aVK[ɴ_!Q/Hm.h #7c\{7u7aݝ<+Rs&4YoXAd=sNo|օ~:-rNu7kk8?aTCtǯHcش:}|p?'0?E90T"| 6vLoedA;=ؚ&UZNsA|p1Ȟ-2D;@PXhҩ3p~g,|q14\PiBT( W/Cf5]"f-)%QRӥDS߾A\B3uEyrV2궒~zLq@wC/Pw]zq'}% ũ0(I|bΦTNJ1Ե̵xg,;p *+sUr5rcf'O_XN':ƙ:չVϿ/YnA<dbl1/@(+Ii+L'N_1 d>]vdL-pM7muZŸ_˂^ф "M۶p^Vy_7K3=Ach~dW-Wӫ4s [ʾAG2,*?xG}G'LW^69 2VwD_z|@wHj/ ^{P̀UyӀB#[jwOm3{IlUN1Lkm2Ư&:Ob̿ 8?E VO. K `L䳈WrJ8ͅ!cw[=* \en=a!8Ӛh7>-f{_po{X$RZr hΣ6oO'~S_787-N ȼp}@N"Wyǯld*=-NY.7N/7X E<qKz_@滪MfbIrJLmp Mh+R<,`APηx$a|fCk3@w(}l_R–qψ)/OjKX VX*qI@Ny~S}$H(g:Σi5g_8!4U›crȉ#\8bmwFZ/S|'qX%+'fwq ]r|ogy0`51RjE?)߃WS'K@z*+*(a5?z<(B9Ehw4fjeS>6K{IJܥw/8ܩIAS0<5[sTX#&e1wk4bY0&קbdke-3 Cm`CY:wW͠^Jb@V4A_| ^-оCk:Q|DpGai`I+}:(GWj⦯.HUݶһ rV̐t%;R1&0 PNd=lNk9OmW,~SpP_2CZgdrB3Iz!:ӞaMd"T4qg0#t;h[Q m `uo6HԑO_{{hvF0q[zJlnFM-K`{~)MtPŎ0WT)T+"m.1o5kscJ ZUrKU8>Fm|W5Y-4IwpB! LMgӄo:Uu~=DZ>DLv7}LmUwĎg:lg1gt=Wn ~i`bR:t>=[S|d9(]ez\_7c>kV C_Q*H{Lv-ybp==o+4@՗,;6Ie7o<\-ղPJw)jRpA&ZCob]$B=:r 65z"\~i`W U2w\ ۃp$dDS\? g5y pgAV> Ct`2:s7n75uvy`zj:/]*IƆL5n, $ᜁIR>~[Ip*v lSގh6LE_V.7@e {{7CM a طC0  l~`5]bjU1wqF_5H)g@8bbuφDTճfY(RǖոZfʭ11ARslՔ9PQet!+cy&ESȆ弸jlnTdXr; pZz/8t鍏J}7/k1%>NG {\CEnU%|R$*Mp+ORv$oCjR6pm{&SOo7|eEIWvlȆ+ՇO<"o%; 9Yl2yflv/KK<8΅V|S%c6)Vg4PWu^siU(WSC6hBv$> ђ6P@z<<pysSJȏOSiˍ0j4щn¾q|.I5j^ۣ*xjz)឴9K&xj*ĨZE Ȼ};7RGW BV %WeBRݹՔ@#1 ޞ\awlR90^4;#g.h;]|c ?ހѿR!PBQsÄN!DNYT"7 OoHn9*Ԕ˸DZ(~w+Ri;PdR/ 6[_%1glGO aHyyTZ!BU6Ó9N4 cZb1͹s0U;Y}㷹YS-D7<Գ*y[jʴGO兘?56R8g D}+Jw^5Gi 3yRmKY/jG 0TD\&AK8u@c]6Y* xZNyм&# 72=F>5$fXi<m:nlȋ +?)0BL+|c)ɬ}F^ ܨ-m? ߜ=wU"r~O. KW+NW`( jC*Vpǵ0?DƖ[lhA=W^z@S^Km̕-B6J ƙ"n.@^JCr؆\*e$6(q&60w6ud?N*Qw@a5jOiR3:coaF]bfSoL<_JA%ҌBO՘rտـ`q0xֈV/-msFHͅE"t+S%֦R[ \k<3yD{ላsêx@/ġ^@*L4+gOegi.Qy(WIrۉjeL;y<&:Pڱl(#>[ Y 8 uE7/H_3^:{|,#qJhXAi4{}uy:У?uz|k&fq8`rdQ9$@B]x[9O$h4~1N.Ou1bgqw4e` b"J7leV=ʶA=|Jh g)" _|1Kم/ WJ5w ]+3,. KXQErC}( Cs" 8>kWqؿޢ4dc wh]@ &z_1tzs "3t*.dNDvstaO4f>d227]HJ%ޯ/bIBU42V?&F3"K#ۙ=2Vق*0^PEu)̭YarA0.#Z {]0rB.{\Hy[n,JS{Y8+ ̽']\խf"YZɄwZߤ~0x:69(~'!acyBo-I;K+&O}f՝+3$cgך\$Ev43Ftplj]ez+SKf{zr$h@_iB1xG{XxdZ*1;oz[6LwV "DS5e7lh&=uwx;;)GiI_/R@ƬF^ulĕCas}*i4'yoMCQ힟[GTuRWOz>~k jE;;dBׅۚ3x8`N_( @4!Hkf}͛JT*$/H9W^P}Kq'EP49L|d\ DU٢΋vĈo8^lº%"};~ k%ʬ0ڭlmMvC`>1@FU~%=Á[7\ߢb2ָ-2F1n$)e-%VPGyXaɤ)b0l2 zkt0+r$F瘵MyL3qrӷXVH:!dNH6`N&KD!T`\]..鱇Yjq)+1L qoZ7s8~˪ib 2S_H$$L*h$gkpNrw/ \eӸ3z>z#@$δVҧ^|\wZJ s? 3kDISR웵 Rd*+ܭ]=qS~7P~݉Y՝Ie$r9: t="&%X#))LxL4㛔,olDvӼhR*Rs N!$>Q+R͢J%;9[ήSkNY~eDiAC|6ٌOI71l2k>oFKJBM'Dn%@/ynu4UJ {c| 7+5 U1jagk,f.C$p\dyo7XDCbN{Ķi WVCӼ= /mX$ЗN@G|aIcboG3fݲ5 (X ȷG{rdm̦ufnSDkOW&^hX9QC &ƯOAm|-#1{J oYU}"F2LrXncx9ބA·ul.Qe%ϡŐH|ضa`e2cbW1%3఍QC5gB#MIռ߈N4|8뛍~kM9?7y<\Z,vԐK{w6Y- vxZi)HFtjnQ8;oVj{P4'E8!ɠUpA6fk94" r/FJCE[dwZdj""-JHKX^ ISv{{4'vc5fMC@;o,G50÷b_蹩e@z:I ,6˭!𶺣MT]QntQP]V~܂Z|vieisxPݾݝWä7.~n|T&k r)Wz]$'w&[7X+ pþ%(9t<= ICfߜogb#g}{WSm|'6;q5;x. V|JDS癟)~7}H0ylGܨRMzd[5 7!aU7ZD\8D0WAe՝(G|"`"Jl v9OެsrD%Fp,C~DS@.L/ p{4Wھ@RrK0b~{Y9%>+Uiȍٶ4,f% 6;(ݿ5B4X M~ fP͑AG Q|tVs̓PLq'JVޓ_ME ES+?'b E{Ύb&&A-\߹P,]+~Z?b# z;o GO0@z :jbk&6F-6-y"hR2S5>ؔvF Ըa^_vDͶk}(nV8QįZkFEyj"hD3 cw2qY9cUdk^3G>x5`T'~è6iԭr8І!S&OxWskn&/`󄃬NJ;gn'󞑴Kzpѝ[$㨹a;W+-#węZR`6 Ө$Vo@ -YK059F|ߌ8xz=>@neuq6݉a d3>t|0`g9JcxUm e?'6_֥2\XhqGD+y6ƣBl+|b_ 29smnh:1s,kKC1;T2kNFLdZ^V7oNg2cIJORQ[p7!tL >Sq818p㇑^ dOadt6vE,pqՖ~;2e Y  K)άc A30H,-}Q/[[( ̟Wt1.:ٜ34\@hb=܏EjlؓM\dSMs&/NEA 5^4wMݤ 爲 D ^!qkl]qLN$#hHMLSS f*0E Mf;~'Q%[9k9Mt}+<2kE$9qaA;ꞏM8*YEqFr#D+~Pe/ȦbqzqbGS}_&blY!wau'aE d w|B7hZ9,4f3.E^_nP `n < e Г{T[xG֞׸n\Ѹ?_,+gZ*z/o PSb650^NoQPĻ!4}-`z[SSZlJJ ~%_@pD03w6d4 _Uؓ\ Bl`6CBvBSݦo?KDAp&>jv\Y&@!F+vg}Z0sɒkq4֝ # Q k^Hx^$A|;>4KpqI哥X0&iD o Ŝp &D.Cآf@:1z'$˜2NpZ6o`&-ikҪN+KC}[%Ozn yX:pZťm-WP95h*n}& n b/ N\P`ª8DRq )B &-Nh;19+M|s9{Ʃ Dizž,CIlfD|\+C8 4c?H?%bx( z}mTQ t>9SjuBAb1acsT g?n7\{m+ڤCSrPՄ}=;!>9绮yro:CR+B:3̨ )ڝgx_γUWy M|TJ9,s^O^ZFmȺA@8|my!g  ɑ.&f1 E4Egru689elF`KG9+Èh-:NL)BU5vl)ؓ؅O+!k,N4̼3ׇV!>[R*d䋫4s(b'K M&g᳭V9gq:(w/z!sl Jߖ}¨T ѻ]͡-͡SHw_E`i@0Us柋n96Xʂ94RL# ,D X!0,7 戝aI_ڥ N^w@eTEƆ(GſHT4V6䧃BgtZːAߴ`&0i',I٥Ax^0`ԅ{n x(xN6I觕.Ba在&=U)M@4'YYvcVSӸz/Qί$JX{4V>rz'OQۗOG+\KC9͕734 `A݆ &ֺjaYZ.Rfb1VZ ՞qa2\zK8zw8?qH$WdP.,+fQЊ֍N!&޺]G7w1% I?nm|{f{}dݥ hRKLBr,2ى CܢڇQD G"[!b`/ǜgxtk$4O&O\;>@dθSg-$㭱zf)+jUp8 CL VcfWxbdNV'Lذ^ۮ&[(FcOwr)2>r4>&a*fc(›Ym<e6`{NU.DzǟiB2+,?:_BC$&.wJn1>fԟQc:3LNpǂm%"Tp`ו봨rR"k|{_^Sz 4PVu2LvDԲs +uiˀZ݀Q=G>If鸿i#;i"(g>6;6kdgެS~863zW˰Eg6܋}gb*n倚45lW"Ml7w^v8s.Bb6xg @Pk8'ĦF}8aB tӹV\u$ ; T;eyj\zs$>Dj{}.\; Y6'Gڒ+Z9E S>珯CQOUl*dp;G7uvSH~D sQ]$:1t:-N,5qȎ~8#S:-F+d 䫲鱪~\YQ'~x}eP/U5V ҜD+ZD/s_ܚOw|3/Xf?zO9 *8hNԹ]X]ftXViArY5}Eo5 xX_"Ѱ RgK"fUKطC]xЖԫ32V imڴɁ9k6 *|yᢡ"}li$zX37b^z49_L*z,8 ֡<"j%By:ZL()$ ͨ ax `!,V_5E NOwL'#M%C.<;SudTvG$ܔf׈/H=\c rvPcڊ*(?j"} 'P[LcdX&0m"P5j}UclK )}nyBoʑ`N> ! ~Ц+Õו:H~HaG?](uF5PŗlHV}?0M = qQh tC$g# .8A ` Fw:1DP+f Y4·$">>QwW,(Iز|jxk}tY^'cY>gA!2]aUOw(4b#KH^Gc*t ) `%\|ep?n42=8Ƒ=3xg-3"!q-:_蹭lMJ_םG'M~:䧞ql݋'F"eR"?:C7rIXd u @ "hi:>qsЊACl44/s\kHui(0Фg"jHubh+|S: I7Ǡ}5e-Yq赡gPE,d|?!o ] Y#{%0s΄n|qh=cev7btF3/ mj`˩;8*+:~OBlD1ɖKaY c,t88ض! %*5n_vBsPt:/8>Tz97˷R0dBd,6k*]Ge -n~pG;5d߃)h6b@~*GoJsvKo3pK-oՙ@]f~QvGʇπwgm(v#XuH2Z-Rɖ~0O/]j sp.ZC1;FN5PBiFe}3>6( a#y948o$s@ v@%MƉ c0a3?֖(}%aQXe}t*N"?oS}PoJ 5BCy&RhGNZXjwܬ~Li 4Rjf2ԉSVmlISAf+ qzSj\xiv*MLIz(㯺N+4ް2c,TM%˄xƣ;9kCn#+"`HD={zalp{<~ ߱CF9j[oc5L*wQy cZ)@!xy& | {k}uD^@jkZk.÷窬܎mjwl1$ɤH$Eb1~T"sKC#2t @!.izDt@H ^ߕu#]BDgP üfj ?0C! (_w4PGlwJPf8ǩғ^A X>)zQ;wI HXD.t Y%=f72(DOk -|Iu@oP&#N.s^uylf׷t.P4ߘmzcFEX}׀9nҹ'ht=f#!T2i;Wڄ6ӹ<1#ʉF5}({qRHf/>Ȏ~C@]x:)7zA,ef/?z)nTߏ"W&%~0=xB)Ny*U{Y.Yޣ'#5-:ZaG$?"kNLbgOh>ɮ+PZU5-P/_ndL4G!KRZ#;2_e;DJ +N l'c@d#׵L"8jf98!s@92?eIƼPBLzHuZ)݅zV}&8>_&+̔ás\ Q,"0GA׫ eM-ђ&ηQ2ظ3r@ڿC!Y&KU!Qo l "Jy=YUD/یJ ]FB)6^.[:*ǚVԋk^EiL"kH$&+*iXFFѢ7l*9dZ1Bar:Ŋ _qr 0Guj)- 1Ach ~l@ <͚\“^+#X!- NlY8&X]ԥΧyG1 '!O~LU2ՃJVzf(T. ?s0p3;{o)ݷyT͞C<@`"r_a F(a厓A֓A3bbPdL5b+(:{ QIզ 6d`:_:{ _hWZ%;lN2XAk${aV_,($8#=*nZ 1)( sjsL>s$PO&̅mqwuմ@6^ubOȹA]K!j^catAÒ\yEg1f#So1Wl9\54JT%7k% 9TOGՆ. R gZGЉsA8Z5c p*{#d.i%0=YA=@߹Zݟ*!>进K}u6Zif/i3HBۃxϚqSaaV)%\`Y;/S%]KV}cY W +vgQ᪂9=$%&B6MiQ;Ψ\jQe$ƥ2(WoBc:[\BW}?];qcDq_B1n}Ri\V,~GY+\ə G3y9iqY Qxƅ!, [ 7fH`GbkȀ'Zq"܅߈0uJ{>f,Pבӻ-n[ Y}8d4&^6o7},;1PKFIl38cy=9'uH>CtƖPTk«NDs->>R# dA9zUR"x4̶t qFD#J*z[6 cJ iR},oJDM-QK? 40 9?iGe<4ԣ,8f])T?N>bԷ^/`WK bj&c#4Sry,JZ;TA4P ․3f*h +4%ݴ4 O=`PMR #qz b@׊.sXWxx҉z h:P"pAB*GŦ*MǛ0CIr-Zќ7 'eg4}%~Z!ƌITd սujxqʂ>; 2{TH$={Xx?x!ƯcuF.mIbc &3_E׽l"UQ|P 1ygDxWs.$TK%~oq8yhss2PMyU^:}mg>+>M1 gIh3( EECbb11f oE b aaX7 3 Zj%Џd׼Q&9[aAOO1_iPؿsBo347A2{=gOZC>%fQD}"7BI1.2L2N BZI4vxhV1q`Irr;bLYR^gGq[GMU]W*v!2:X_g,)3fCB޻v18s8VMnS*Q1{5yfb&x`#5@2ayPt$Ir%f%e[Ģq5j P=S@cQl8?K K\nM!0,c#E r kfCmŐ΂c߄Ĭ+͢uD *>'?$e*wa3zv\%ɣĆ1 ]Y'\["f6\݄R6& 6yWF8pQ=4JIms"&o3,1@~ =9+.#!%.crMJKer>ssB6'Y"hM3e* 4ђ)߾q/ /a{M^1Wj0pSfz&YK+' l[|*;*wXk. ԟjmd532r eZ2>kf%h7q)e]]!Ͷ X?8<49޹Ht AO/"QRh iGχ5!N]w̙EJAo2mϢj?Ro"nȝj-\r 5 ~O54 ,!tA9JZ$.xc*0qC"Iem]oK%[v@z r7ܔ%-*]4N%˥Gk/ܿ7;j<ظm>7)_asB6HaM;|3 l~fqRVRs<#PF}@sa(4;b`Ү8}Uz%Lg-k uê>K;p,ʛk#W=̉"i/L?s:Z't @?i9 #PIXfurRMpuf⿸4y ♯?|/AIBvί߼Y!B ><aӝP|hS³J—\ʘp=I s¤ "U0;b!M}%rKM+=oOa%r)DL{[{%єL=x!(f6r ?Q/vlC" g@TodE*fF<>6(OE BjͷӱjOy8a [\S\< ]3t{X<;S?ba)% W`z`-_A{mOG,g 3cXMtĭ]sg+uLqG|'_V{޽ I WV.dKpNټBQ"0_Eel]C71. esYp *9awN{q?ik"7SI.BOa9l@؎?uM |˧ ooL9LeSDHx^{^,-eX6E02#Gh~2Q%}"xCUZB3i*;῱AxrQڱlE5Eu sXKfˤ1OK#|upIJk xqRP(c 4KiA Lۣة/HcS[~XCLxŭoՌ<XGϹ s0-f.A9봷UyW;L&hQD7tFT 's/*e7~bJ(̋ӞMWI'YP%E};->øa)KI0d$]m&t{sAcPJՊpR< 4\ b.֬S>Clq#"HC] G݉y4r'jSmr]' j$Clj"yR $7B#*7U%w߾ | qnk3V.?X{ žLPۿ킂rCt@L.qNy߷8HQumi1dQaTFЌQ9-VEE!1 VtwI/}HF3\uoc o"d@ I67}wBe M2wN xN'Pv7cYT {H IA'xs ;ȷt~-+WP-=\Dbs.v]",DNjqrBଵDw=(̇aCayCq˳77^fpuG0#(laUU񦀀fB&|i=-&(Px0[cBisW4-#% O53R #l"L|TUoi3q޴TZ=)fYC15H FI~?u> x"d`+gKs!9*"!wس(*b]nҕBNJ50}*;x|9j<͞>ES=[&vjKH3jD~#3Co|ٲ!&j:Y 6%J*>:W\R rxXexfʠ. ^?S VJlt'N6@^H TL`Vj >0o["W4γiX;H=0צ ױj$L)g\ xKE'o%;00+&.(s%C b(sM(V$:#`0/[Ea^n%G;c9AL ,oJۡ*'>$ dwϏDJpYI{^t oB$B b&Иb DS* 36 βwf( ʛe҆*7CaZBJ$o(8 6dkw4Kc m,-?@tH/ `- ~R"i=y%DnC4=xe`+>bU{#` TRC a+< NIf *;Ј>E UfϽ۬)Kvxm VMu߾C#.4%BLdUdzoEA6oӷCvx&%v0q>r.U,1?^orq'oY?҃y]=C< F}ԼYFߟQ* Wp/9U~jZ)WPr:&.Scѭa͔Ѩ@'򦣃_-s w>s*܇;R~OAE[|YW)PigKڻ0\{C`zm6pDnkbau%K^aT7jAJ~+b/gjBha>&*^-E Ȉpd~:$O®6)ߪ/滖$KɃhfsT?ʮ,Hm9j$%H򎺂l t7o-&ET([O_G[R|i8Z2J8|iVo/~~:EʟC@ǻ1 `@j%_g@ 56eaX2UӧkW|ϵ IN nc1}7>Ju%ZfYDiC.;5ĦNZZp]ڜ5} LE/y+\c\Ɠڛ8?oJB#)KFs قfm]a9pm}dG\ů]d}k}Qڠ wW]%x3:)l^1QUD6 JjI7 $W );h[Vycx*d 1`L)@mQN ̵Gc7`8_a2g1tŲckЕ2~NQv2{hFwTE_f—@~tK+8ƢW@T\K戡$>qE++CA၉!/TܝeRɬ=O] 7=c70D\c [ &RlyQPKr?%N 7H oHyj=UdTֈHTWMIwZTffX]J>dSR[ _ɑG{7n!hy#ĝG`eF2ߔ@~ Vpˢ  {!NI^;wF}[$jGKR tіIkoN|.srGMð!rr?[`5Y8\9{P+¢ɖ+SX3T^j V~f̮Jzn[K!ʌ3j z #izHG+B! :OoxS5C]0iSV+G1a 7MDrbV{g45p ^^J ͆Y5 T P6}$mBO374dxޏ C?FIuW}+ UdhnNID/!w&Gw*N'Bf%}=I)Hh+4)t%ӿ37bWX4mUXLki݄Qeh͎6o naDߤF )]z4Q|WjMFw?z{Py#aw[ogҦWhȘ7ێo5Kp+Fm< _ٟ=`?rs7I"j(lWF<"qHo?Zٜ2;0y!dE;G9GY&̅&|~L rȻ?T+r. ! &:J:O9 $5khbY΢qo4mv}2ZKܣb?"7jPcjb蝪po+S]Y1ag6fo*7II9u-KbzGiO6$uw@خ4pu86NJ> |e[^8EE#ePSU妒\x{e8'WhFj鈩,dE3{ll8{RVr@8*c"is/DZ;XH+>i7w 9B?κgH܊9jk8a"Rpj1s{ R=Lb"2!ي T|;ڴ/ 7 ;\ $_P{-)2+yri tL⑭u)`J#;䎊$zQy͉3gp;ComFJ ^Kj!sYD݄Wt%ԮC1g4%?˱}d'KsYљȹ%TF 'BoUEuLiPgh8mo1`zm`P67NOuhsƱZV&z7g cTaS``[ya{*նbtX:铔d aD@8`$fwk@88FJ9Nns2e:? tSHKO0D"nlfdw\d> h/S=_x(fs(O?J6ZzM_}&~貌]gq.xr./TD#F*ěi]\:Ƣ\krJC[.2wLEa2`B4QByd  tæb05?-SqR[aVB-h[Wm~DgG1;M憫)6NE2w|;$a :X&PA.KwU2XC[](o[" /s$Q}aժ͡FmR=^IӻV73$'_EzJd0D©{r5Wa "eg?^uNјWhEō1?pV yY3wUֵGm5Xsnwkiݑv`ٌgeƀڶ;i`sB, "3qا\%&1\C2,i 3^E\X,y">4 F;s_ݾ+nkɹ^W6ax(Œ.34HfpG'k,U}x9]ޢyBvJ=]kN}@F e!Mdb͕jp nl>lz܂聘(]mXӝ~/!1S5<eDz'xәWTgV\"Չj[u f 8}^ J͟P}y)#g Ht jDͰ f[=φ)yڽwwf QӋ0[}s-Kb -Rtma8#ƹ;(?H+K]kKbFF&3Rb) z /?FL:3# ~s1g-BMx"Y?hE.Jٰ Mj(Õe NjTNeKB[VPLSjҏnbCIП%ԺG'}o`C"<݅';Q@,W/s0n~Ѱ6alMx y3#^S {82]0 N`zpy9A& /zR;ƸX)uJe7a.gcg' T~bJ{H(*MFDa_3Rs(=l|mi 02&}hT`k}$O^L5'K1dq_\V ְf' Qe}J)={\ .Ũli4۰zl+|#.pZLu`|0mB'R"c ՜աT/8P=uh!E+AG((jI"M<̌v$ƀ.< pr;BD30FVjꢟ˞Ej0) r>La4'DfթKwsyK 9 &S g8Ѓ˟|^;FT2:-|!,_|(R2TZuoC' t Bx8Fp]ֶ'DO;jͣӒ4nC0P`R bI@V~Dɏ L:g,lw-/19ij V.uܵhv~tk7ߎӎucwjy%'2bh_5` ./rVY> $$=)Qab )^㎒H}U ~xv76ж\5S ׍/妵zwV ={c~vVH#!d 9΀.[48dZ\~R\P r['HLi~m9ϰ$im6KKABss5Zyp Jӧk9ͣU:WP V5g6(SOZ5M0Q.Q=!U}`7Fmk-0r逐ԕ$߸ZZD`hkGQ67nj}T2e^vOF)J|dQN{x3r/Jh3H 'I&j[rWii Ē BM]e;5d r!iOo1|] 6pf]h]/V$ASOx&c)SvԱ_޽I k&|pKWw ,X, ŘŬy`ŧd3#g aՃŴjնrI.$!O&3_ uH g![ a%N?y 3ӪC4ߐ.AޘJܥ|ۤDIj'">E7Y]?Bv!Ju1uF2l0SX\-Ea4<˭2ju4<>&7{_EJ:9$"md!+6wm5˱ P*@wR(e >ݙDYF`λ,p _=mvPb7*vxb ԌO3T7~:5 )/q HK> GɇȮ GU0ޚblҰ \a[!՟֪&8V(a`K%fcMœ7pp(62>,ҩ ΍!) 1k2!8K :,JM.zJZ;p6ǻTpϴ?N{h : < G@Q;E߶o&>UQ&4Lj"krq l1ǻs/ӔG{|U`8| !T>*y 5Z-׀j4,騒6H>&'>3R`fELMۻSv5Hb0d.7ov8ɰ^ u,:inj~eԀuВd)w*/ߢ`$6T'K`%_:-4qњL=Ҕ6G6@Vr*yK!4tŖM3!V"Ҷg2_goy0y r84$>w$Ch'Nãh {:XfKlf|i[h,B.(?;il(~ӯ}iz;#9 Jb3Fwd?JM* R_AmCΒ*!B/oy2֣C~zD8nzR̟֛}O 6VSI}ުI;̍2 cAcM`H6,Y1<_oCq 8G$0XQXh I:USm [bY)`#k*٪CNG_捑Y 6:Z!|YGGe{14N9H;|]i4jaN/?8&ǎ l%[ђuk@3\D*\GUJaG҄bb JW%["wA#xВF_4 Ή)^z0sTs RjKuMdunKv׾x ]YS]+M:n%*/%#T> a IeԈn02`+m N󴈿}8pcz>opp||ܲ?0Bw7a &A;ܰ{J 5oH9H| "vY~_n0ZBXIx gy5&z.ti]軑8{tm}"08E &\j*)2̼nIw U@nҦYtɺ9kg@FƃCs/t?#uk^|D $6U&Qı<uušpB`@uֵWkWWi[5|W#(6J;"p[zFFir1SAEDSFܙk~ǹ:Fn uEM~zr'MװCuW>,}eqy=[bEaZo&y|@)7/jLC[TmX!NT05Y\XS{6}>MK6vǸb쓛 ^`bѾm(q6|JGʁ9;CؑWAh#Mn3I ~bB }g`%_H1Y,tAni й&ME~G4');8ks[͟ו"(,7ԥQ*3{1 Ш#Y"I66spbtZiC\yci6RquL+͂|xWD /PeS`eu= &ۧpޒ핁^gkF{)lf'=@f1>cHV0 >srD3R9J#&}k@$`$|+U'j6<#ቒ'eI9% 7rBOMB(ᑅVT4 Z{fz*eQs8X&%&Ɗ_b"&:Յɍ~L,;+-0z,곧BOU+87?u 8@ϋJ|d{^:AGAX|Hs@]ԃLD*&y: {"{Zr4(V}flU+T[f,#RX"fz%JQ٭f.m3>H]V} -b~vGANT2X63?|jJC*U(= 3oaUlzhPV+9wLCr \~Q&Z?v,aqSc]|6%d:pl`^umraúz1 \4\bi|nww-O[U/wy.,:uq0<3VvⳣIϨu5@9~~Oso Nׅ8ؕ_yl7u .[Ǥ,+:h #Ui"E<9Lp{N`OIhcP-ɼ/Hg/0Up\$jפ=js:T逬e1jj-4kGQNcFvIQ8˭ܔ~Ͷ^9k('`X4tKu%R(ˢM XѼ?U(KF9(pY!ִ=+R ݅|#̟:WLKK^#@\aeGc·C VKMuɊnnӤ&8k)pmR*qZ灤Ti:Ye)- z|u -tel.Ӿg;c$*&Sl,:g*u@p)h KFڎO J}qūEb&;$? KKG٠4Kxt(Y+dEy`P#KSyS髎uo7vnh"W@7(6iۼz :t\7]rK-t""g@L'Tz^X1H%_D,.=aS\ C)o6%\_NaWKՍ. 0.wԸbyNrko7rG5hs:uYe~O@Lg68/$Ch`Fse{nZPXL,<9^;@Yridp6?-I1ŵ<1j_Q͜$q, {~Q*WJa#ȇL^r c+̛{^ҭtvԿ3^s^Z+)S9I"a Ef@A'*>G^RwD=8\Oݤ,/}A_"9hPGbvŷl&Fto U>nc*oJEU݁7"Du'3eNU&* u"[ e9 9f g/mT傀a_9q(]Pbe°J:bo98lZġ1b}:4ݢIe⼌#ڱp]K`Ԫ|a>_ߦ#ԋkS|r?.5%V1x|PI֧CxJ~ͲΓI$@ g VX$աi1uOZ@oӠ׿?;vݴl=0߄GRS2SOZ"U@9/$9p(A/''>|:g+{d`'kX UAB4yiHx+ټ0{Z]] ;cXUF67._Z83B.?y]&ʰ354;Ud2zm95[c))1W4z]Uҍ21~@n^0"T$NYj'd芰'5H4m˭9B\kf#n;;/&co1|##]5A~j0W+^稔.FhɈ20P2#!т5\1i+ mHҁFnSiag1aۑ^??!Uרn3C 3gfwN8w\xl]Z

g#[V剹brn|@n:aEm<6a:sѓ5l[`;gn;Ss X*xgo6F'dҳ)qꟋK+AނUPa8]Qqk\$ m;*֣J ZcNB)eH%{w e~_jWF6X!EmϔB=FKouɭ '÷hҁa`[5*<ަUts["|lV9m Lk:A [<)y7pT gS[A DHPnBp *e1p< bO3% g8|f,;Y~GD0tZ8+83Q ֍ơsC?~ȋtZWc`KfgJ^c҈Iט}E[K[ƯYDv+PcM2'tKr4R1Q#N 8N Aig{$Ė$MdFj@ 8.FTp$=x΂,ݹq5G/#y;!e}A rL>ײ473 ʰRJE桑dC0THn,,zP#"KOXK, W>z^k RV%OF+^8(]騂\)" DW@+c{d6~R"D+b@ً5 tPQĶY/J/)}92(xz.Yp3>3=tnyΊc:ma{= Yfl" 4Gy{yqC{_}?ԛ檜^pY|>"D8Gq<'2eM:S$wW< Xi@WŒGEfGhs2nŢ@vR;eBg(!Fa4yhY:T2ZC@ms'K/E@4qn=10gaz` JpeH,7iKERu`SEGZعh!Ο17[%gІÍ.<1T'š'`J}Z M,vW}yN"sSlLN;z2paB3A^ñWD 7FP A>4&  Cd5f"X@2gA[s9u51-!IzVa($zV_+e# R q~7"[ʜ2W?OYGp 0-_2 I[o]qQ_6yN+1I]<vpA/wx댏">Vguw#g##64pa3>6֕>KW?\{{mauPp(OD ܨl^(T+`P<./t>XU@Udwm,Vs8z? +|jINw$!{;)g9-$6S㨎`0Ma1Ӱˉ/Ѵ4m/Z:|Z+8*IޣBH-,,`:\c# Ov@GBzགྷ,9C@ CU3L-oD*B8pj 3v(wm JK7/\+fW\V߷F5y{@\>~y$to=ʊx?q4P CAd['7z *3I{62Vcȉ>>!s?VR ⒔mva]Zyr iE.R^H8ަp5zA(Ch^UԲZMg[7ƀe3ן)n/E@]9Sq.KaZP>&:Ho0e '%Ѽ ct(fC<!Jh8: iѲ -W0N-v+ErwRr_r^ Yb4(1#` sk&REsME  Y52@h;s>Uille6$Wjy ܕXC0J:$'c% |Dqǫ>$' ƅ?azz?ecP` J' GJ/n08p&}oE5sD?1wMyٽ _sKW/V`]P. mK Dv`ME(=۩̅Q=i5s:pVz=}~w?cݓQVg}w ϼVfAuTdmwy{&X8{WOfZ÷sa~9pأ|%SD#hX)_X=>쟔*H1z `,MzN[oxPaJml[AόUH%{paChQ9AW 1[oe8X~P$ ܨEȫSd]sތtb*i0\nj 05IXDkyp~Ɖ >Ľ:3' c8{9YB/n n;F)Gtg!7AM 7tХux^k=fIz 4* ZwyZ]X=H cJ(h\bw #.ҪڊFV#}w,o! Eh@ٻ0,M\.fʁmGyЅ- FĪ$&Mi3_QW3aUo"apy$YH]7 UD)&N_C ,ϖņ 9jL>,͒lT9=weu /^dR!L§_ 2 J3#DG ϔ7%I(;S5_qfK8nu4jJA)>z(S0aV]4Z7_j6pU%GDsewoXGv-56[_ZMp|a7Wp{S1.2-XVY+CX|Q:gN1{ͼ(Р:W ua+b_ FpKeY/4&]Zr𢧀7-y>vȄk020Q[Y@?*G2.UG?)ϊzWF%BM Mp/jֿpJYn&u";c7Kruб}V}^|\?V@k )x;1Q}SB1`- @#ʠUc-o=x%}Jv˫-P|#M Ho/Nʨi0eVQo';mSH CS^`k %⋸Eθ1n>m_p 29}e{ʃR87Zα.#qDc"SyЀ.akhoq 5/ͧ"U4P mu;Q+*P \JV iB^dD/R5g.&YFm(0r a'sAcdz%tl Vx̎r; ^?OKΓc$eƕ^D~K"uo`vp,`D2p_;t%z:4X Gk$]j[GI/];~\>؊"v7ZBr|ǦoiD @ڴU\sO%_CAVϚ7Zv`'MzNHLTBS_+Np\L0O6dy.L%b$u/.cUNd Y8.$9xtȿOʊ/Dv;YRN+]:0j 9g9u^_>|2B@" @—n=K`}]ƅo`H>;CQO#k̮Z tg b M'W9")#WW\ '#FM#$W9(SA!cC.5.BLz~~$N pb1#ÎBynVb\dVcWKٖ5)Yzʎ e20 ϲNjtP3$).:R}|jC;S T؇en}L _w\8O9HC-V;WP݁T+dA޴d+ 0T ?-NY#ͤ(Vd%6POWZY%C<8NOSSO R#ZtOXPܶ"Oz 3V75(\\)o%w^xmQi ɼ Jr͠k 7>;Bce8ߏoձ ӦW&=_" tbzWyEYxwC$Y΃B9Lxd4`K_+-Caآmr%_ ߤqIإ _'LgI$8j>+T~ yHv<^ :,DQ}rc kJD!_&ύIyiLV 﫣c3mpy0pa<4#֭ T}ɘ@h+Wt׋$wC`e۶+`Ig=:HZE]* F&QS6Ii؍=/2U woFe6>N(tRF Ԙ "?l}΍vjIVp3ܒp,ɨ\zNy4l8c4eVu'AKanbYX~iu4~f*Z$, AEu"\\N!a{T&5Z2m?"`(Aj*/[yMwA!0HL@,w>æ; ƲBO(r cH9}v zLQZQ҄I=QKL}.Jƪ2IXlZ:7RbYW-8LYjFz(~&fRq6shixA\ 9g|UJ9= #(OrE17٬~;hlq{Sv &1tM!4[פJ8K,FY#B|yrWE2Tv^iILENs|u,["Ȕ$+㶤cL^=xe>;}RJ^Q͓ȗo؎7avt`[Rc X`ru,_..g|Šx {jo&Q|جizhln]eQkl>lwE 5eKXjCb{Y2}4'Ak}D[ Wk=YcEy@{:tnOZ牘 ceml)y{Ov99(K'5lH) Hc.D&B$K|Hف$iZ#+!N_o5IY^Q6t3Wl2 }*@.AZ#rt_JxY*æxOKAv8m!_K*8sV5,1ấ].la"Ktו.F9j5Nӌ fZ%i=TLp<>ӻֆuqӦ=1GHf1q큌yNg-/0U ?q#O֥a6% 1,%7+Є"&1ZW?-򤠔1 ͊c"soS doZ_SyvVU攑tx5E]!ď@SEM9q%<--b/L8C. ٷ;{҂Dx\<4qr,pvaѦ:Acz[9+V宓׍8]ՕylKeCІM_'К;IC 0$@_`1vM2c|M%8.W|l*0[ܺ#Dyr,|9Y\c,_bK iMlb+ę[TQpkN:gT @n n8RE$oJQMā҇T\=-w %`~>4q5Pg͈\_{#jx_q*+ge?᪊!,_Ɉ~X;2R Xt^7#Ae\t狽bJ( P%[d7lGp?kh*fkdCp<# ʲWujʷa7]Ĥ[v t-|NΦ!:-zR45ϯYI9OljM};edU8^ lk{o(ynYڶ nH+@+癦t~}߸!Yg4owX CհYF< NTԐ9X.Jϝ'B\CR(_P+*ҜSOb[S0LnΪ'I.n|w]ڍ]^8^j^ %2$bjE-,[}.r*, \kڟ(RC3{XNx[4aU셽@Mń0>ViǐlrMO+;eXbZHc[Y!SXJ`"j#I-ѐThQc`=rv,َ`2=;23\Oˈ90:J=rXp*Zg7"&:e[sJ+tO*ƱPH,OwL,Iڑqe7X< s}nYagɏ6W86 *M8u6ӗ XyC\ޑFSGyэX FI&,%9tn^v"5|6pdw F١UD(mLB0'gS1A?7E-i'CJqbBNzJLIq0ǙRcFí*&'5] 8mIsLx[=bmכÿه pM?[s]')am 6fцB {ߑR XhLH$%- zଞ@L)#m0^M Q?V߭Ť}ߨ:V} ūRG)qmY6ŚqFO&dܴCtՄ|qLqa!c#zK\%/[AN󻔮=l;goOL4gEMcq1mhB d Gc5 g'!sDJW05͊ZXM/CL"F|^7 ߏ[M$-t⢨tܘwSn÷]1[n \]V@;!#X=o]jG<- X %@L\9LYdìt5*|hb19X>̓s&ӳYMg˻[n.W ;H,FA.K3ZJm \)p߭v 6D bdq.~2#+9PuB$ q2A\L{ճ&p9}h=B/3ѳ=D\HQozܱzrlrQ =+GMx`͒<:%t5CŘCDDx x џ̖=DBhBMp)p@:}{tZoϘe/ |O?aE)*freuqUK0ii&8+cHxG6g5|Ω-‰}WZi.t#-eUz{3N,qCM+' >}^MĶOSQ/>#V1>Tpef":p%.f0E0-|*Iߺ*_ S`{-z}G`zS)T˃$Zv2YZTL|)W6l k%Wg=ٻmoNF5 m=dRLZjgFA jE=/wJUI) 5gEH&އwQI!V&;nIuJ# 1F'NDRPϣ"`&k[9A_ƨ/0&=Wߎ^W+v͂"y)u6GA0'_a T,O~ydWwACF}<9iH]Wlfڭ&"jϛ@Kϩ#P*G*+=M@7/ !ܖY k=~q&k@w 2 "hixQmʾ4LA$skwpl"G^ab~h7).-q`+@F}N.G}BGtEPrϢB]96%)CF[F93sl=C5js> ͒`&gEmJ(W䄤gG@xLGjYhRP27E7vyy 9KBd#1L QtH^4pt֢d_ N0oRbZAa!EE7E9ϻ^*NZQ$NM~q>A!J--T+Վ@m`M$D 3ԙ'RKԿפX/m)Q 8vS g& C&b-g}M yPtَ@*/۠L9:䪣~9h̉ǹ!~2$&g.oɏǾ#1QIS؟"xƯ ?6ݷ5*%r^_ t"o8xbs [j/*Brogr_fD tg2XD˨}D0%Oz mk^6!S%?Bj* p6xcqIpap4u.RȬsu gF7\%Uqq46 P)ǀj< CGH-1н 3YNAiܠd ceBͻ:lIe /%jQ ? `L vLi=/ ='6`;YBe#m(i)% I$<^\zn  ؂' EK'~2ڃtsHO1A^^s7kK} Z! Sܷؾ]y|!0@{:L˨=•ymEQB.hQZHphdC"Q ̶ۘ`NZaJm}5y5I!8A8DڪI(V4?RUk sBV?+|-U(+jz(]{w }FoRBg9Jx{͏)wA;p/xc!bM =hV'x5coS&ayKK@` ؎ҋP qlWA+!2W tDݫSNc4nkh vyOV lqorʖ݊EaO{Ǻ8HybsTB}/3 sK/A$V0N+ա$$Yj(.U9.h}jV*Z_d2(P\{|jC2D_n$KzY@0Jd[ D$YJlg@οĴeצ_$^GZ(.ɹjoPCl kanbUwafzUIPQ-/_'x:}nB(E) >Ɂ [a&o}&*ȌT ZݵyI(Nx]U4?q%>H"QQM*࣠?ĀE)\xPyaj Ĕ92'K~+4fNgd4zKҌ+ Wp׾8+=xKFr* A/BzoH!W'b?/8g| xh@lJ ~6\G궓7)_a+0zBDQyD&jYZl_ݪX~}b}ZK{uӞ½z;⡴5)K?=najїads2U$mz "G%gxAɦڰaT[ʧ;q`X_}Wܚh{.N_-DŬ,h~(I323Y^99? vk14li)P~c!nG4Y 3UN'ϟ V%p\2~*K~ /%)Vx\u@zܝPgAUbs9oA˴`z <\.(a"{5~#D}1TK`c #]_U[#m-o)Hn-#R37E0]boF% IQQvMaC/hu:NhX htnݓ9ºOj0+tļA^DsȦ`l#)/oDmۯe5D.GxƒȜlN`pRUAr…kB1 K\Բ;7f L6\\#eS8ZB m%Mv.t^zQ0@BEl<Ң$UV#SvâR 8;>5ώ\~WW@|rұh{:V6N+]٭`D?&S^Gio%WlHPl "p.3Ӎ9'q;ߞ#CPQ>IqMY\2W쩳 Al׹] 7:^ Usgof/V)X3[P7^zܕaxFu,tϔSF1g/ja]{o ]Oᒤ$1m+j}]`Fr%.Jc/e |uRWf!OV 6?euT ?{[hޔٱ3ė=mQwww/Thȫy^00' IJA&"IWVcv`ez2]lJrQ`u=n3Mu!zviEﭠ9*qqBN+1ʳ ©8.Gh},TRb.t߮6Naˆ6-Oa:3Cpj/j(|}cbEu"ZM†X)J6S2(xbDV4d09!f_(*r\퓩a0eAoRrp|H gSDE/OL33],y6`S#YŠ3>nԥǮu5#6X[La . ^W?rw+>j{HN h߄"tel;4{"^I#ݍ&1G󝒃{R)i"`;#zގ͞"fGsO(^3 wI4qoﮒ||̍ՋIvU§䇈c{DzI׸y{zUS =i\J"xkmK]3W:9tcS2B" WHs;k ]S.9 ih,03iWV &'٤?Үtwփ# (]q5,gqc!9w;Mƨѷߛ}tPNɠI+VrB˶^su?{ xtSLhL exL*)v*BB9XjF E9#dq] ܓ KШ'RyȇGx@:A?oPPOT;L묉~)_FӨS.pjj!oZFa;uK?j(j/XCF!8k̟ئ#`ާbI3mhFɮ !14rɆ!XILc;u& yM܅T`WqYO_[k T:&P#;W qeJ53:iL01A@٥$Wdh0Wi DcT6g"㼆u(s7^f/G0k۹s$QK Nݙq.A2 7>t"L)*,čS/ԩ@&:&?)CXH>UQGA"@sIhYEДf1LYg\4E"^ xI5dCxM2Z!uMzzuM/&g?, |?y"BoQ~UW!J58"/i+d C쨵*[^oNW 5toSwr<9KRm:X֨#} VRձ]AMԲܣOhWA8i"w\:I[)Wr_tQOhzί>>n*ʄ6 3w;Gj@!": pSuaI.ȺHM!K@|si$-ocVCth^J0xu׿d.ymrS~hdD*zziiڱ.RD]MCw( '/I}pn(fmlcpQ([mk/>9Բ.9x@'?ER;`hjȒft/hfd)MB`S,/ܙewI_2* ||Oo8H@A[Ra`W/pkgMtcqyls4b|o>|R$&';|o:rv`ѭO}0+ƗKpw7"LFaK7_ "o_ګ>K^i9O;ԈY8E<ҥZ]$\nfV>Z#zH#>EJ㧚ȿĚrJEm_{qY\/w# V٤SB5u`.cz?#!{JiJ|:B_ G҇aw;U)_ޤu)%Yޖ 2l(Bc=U|1nl}?[*4{9O.ۖ 16ߗ؍EV=Z! s1 {0Il *\O~> f=תn@s΁3q,O< !51G۽8s\fI]q/xɽ!_et1y>+"&(PJ;@^u[ $zaU Zۑd_,j3B 86j'=BMg^?G`_9%i"݊GĶ-S%~Rф'Lr\*Uf^Q+1pg_mGD;;̩_#fa77r}a:U Kvu`[{JIB=;9A]cwt֨ݤ4X_-"K?%٘kKR2xv\-˛cl]͏GGMDm:f]Xx# #y!A|VdRjt.\[9%~Kur9ьԑ\bZt s󡆅UU#ZGΜXߛr`]; C7ж`9VB3:I*VCQ[aϜݠ "=Nk-n=oin3]S1{ KdM6Qx f3+ND|=OY"rT]ɋOGfD|WJٓ/.q{z]U[KP9|H0"{|vQDSYڹZԐΈ_?ay%d)Mَ}lR T,}SkCT"@|z kFUNS i徸+3 rR 6wA W(!|emقee4QckK7 g6f̕,uB||"  *ZmE 04pz\X|~A>cVځAY2dh©^N)XS!תp4خՉ!KayzmjtHGw9{< e 9Y 2aW'k9TTV]4MFj~2h{?g+CV >?EMJG|~V֩AWۡJtH<,Ra*ڽњWRjY!.䪳k lx?_Pưi&FU۰wnWUifAJ;Nh6Z"fKX5\ҞRTY[\OSbyaNjwg⢒$2jEgL{>FUǹMF~FrIO t[_@84bT{BXXDoNucPFCE33 2Wu`HD!i;}n:{L<1t)q^~),8r\3VzSg4qꎳPyOoeSfzD$_ȠFeQ;i&#;G 2\oʶ$L^IGyꞧVeƯN&@?iC9Q>?N!ﶆNACiYցlK7V1A{osD%?/I ϜB5׽pRrJaRfB` KVr B_\nMj1:.M\2^P$h,_NY.v{.6fC|sј ݍS1mF(pK*!m'cg!{108;9! cJZeW`l4m3Nڳsdo|̑6Ŭ +=m/WUFm[-V`yrLEH~L8#31tH9]ÐLvń-H?]Ԏ)YfIrFQĨ^NОɊ(F[ܩh~oH{Xtdhd jp52ڀiHs$,uI+u6%K5 g : k8Ceӱޗ YŗGp۔=Uwhq4=O.7 ھإ`x 3 }z6nhem|w#T:!@I4Xo F$ 00MKa?v/ RG|m}]yyWӪ5"*s)|O`V3 C0aI3|U_Fv\E*-tdhV`,Vn'HdI|]O(1NXw_RFHX&K9Vo:$ [ ;Ji.pnH47ͷ|SůDӽ]-\;;|n[LHm *.$}tm4XHaL-ocla$ečxH9V!!:ڕ#W A8xL\gYx@޿BX H<{*bԸ M4 a"K [@*w A '^Yu_'4`r Hϡr4=# scu@)0rEsA w̵]AK7JҫH<1,0ǯ_7ah3^ljMqa[fc%9ӥQާSYQ;&s- )_RΩe ` Vr\$='r|"DU{Tܖ(1 u؞fJ(Hc6FU`kWg؉n 7")WD2?wK y둭^ 3 6vj5P'DWh-eh6G p4~b+=;E9KY[*p.(!B bŽ ZgЗ*prtLܗf?yͺJ<8+U$v7ΰh}īGv9:gݾ !CO2{ȣq/xJ(RrRLJ*ʵԋV]Jz;3d1ѲIY~Cֈ=C$d2c$kސU`7oӶ$=scGO 5JXt`LYsU)qOSEg}&Ea^cbN&6ЂPG/cJ wK8LgRŏZ.j2O1!NlzA;y*i%h^| W^v60O%66l|u&6K5ɽ=/ i~`}!"o\s6?fj}[ag /T"9xozKw aȔ5y" wJ.=1 O㝅z>%54Zf6-9`XlB g8 BOqME+O~ܽ)7cYQFx /;Gd#L##_(9g0F@unp`egᡅ4t[./fQ~SyXc e'Δ l #key:>Bx*cOgXqb6@(x \~ y:%hMl*z5ۄp }A{18bj攝aί˛_}Yt퍙u1jcEiD3hA䣤na5:-!Mx ZdjpD6, 6 hj"a5Eux=7Ph^tO52zތmT Z6]A}3t-uV!25VYo ^z{&F) oN&%v}+ a@ַamE'dO8~VL݂TU"Vuc.bH8$yTл1ۛO>%%߼OX=H,O|1+I[ɫ ~QRAU[4S (". Ξ0hC^\<'rܘhZ´ g~@1RD&&w~)F//ʌeC3D;]3.Є356h.&焃"0Rw&T +}iZ)BWށsvA,rIt>6/E _bQ$]a=Pkģէ ULIPt~˯]hA񚂂Ħܗ>ǵ)Q^w0@PQ>i4/(WV4Piz 6Է;jųژ*A'`;!#){N:e[FfM=ƶJe]bmRh9B5mIfX!% 0jE#nI4kا{(f'*ڜ>% U{Zfn@ϸho, ӟ$Lj&qmS0Ӿ c#q䂁b!gٰ݂YHWK9\b*>$̞Pնs\X`m/,6Bc #B$8ҹ5)L]Ih!a(h8!V ܬ.2g[͒ ]z9o[4}be߇DS^E z5tIDT!d d^MYwaJ4JŢ+ gi1̢\zjn}6~+p?M3#t5:k9'ˠqlLO,&wdkp7ya&Tw2‰m'aН @`fareyԦlmᚭpNMP?% !ʽ-L$`><|Y>Θȝ`&g-+ n/ 5~(ܐ^>o xk5(}4=O{+=ң,.ʮ"8vToSҋs> na% ]N! |ѹI@q2aAK#klT Ӧq^3ZY%xi͂NJp7}d07r;6䲹hّ'%Qf]&悆?Qv^y-A 1<ܫ'}"Jh̅0}2 9z#_H =i_\xXkF*vu_BMAcڑ^.Er*`0I7٢cl]3HвHY$1l35U*cX;NԳңZ*F,MX1 "WJf&{:&TU깆lDҺ.ey1>Uo( Poh,ɐN] w+h o@lH!`/Q<Gf bG22(1UmG:,aM0It6L2x{e VA }.ϑ(?3jl0yK{'ۥ{fع,ױnrocvjF˓gwVuv^ßŭkՀKy`>U`>+TX@@&05kaEpLjT3i|78}>!c5^P'-@E=' eaA bct>rO=KxJ43JjKhG%q~)DRæ .lRȨOYboN ^G#L((r]k5VK|wߛ` S_0&вݠ[R4ɔiny9y9lB9>i"e@Υ)0a^"|{"+Z qnK]*:e8[ahWҌI.ECm_5L@NgnӯeGfUj=2stPS'|ގm!"pdAyv{D)> |[:VxZyX+w:}@j@ 5&k z|e 'v$~;zmZώU&EHL"2f1G=8kj4 rp/c[;AЧ$uT'QChڔT"=p;ג(7%# '!IT>_0ٴ^aYL $4wj+vSGbTvG/7/qRtJ{!S[mo`n] GˈQ3-OG|J4Lcd_\IK3HX>oJ?M߫EehTQ Ņ} ܈A97"Uɟ#Ўi'llq|1Vj*W,lssםwQ+ ;$A~\-)᭵5Th"S C 3+ f$&ry8Y#cz'f cqҺidf4q=G!bU2F_&X61? מ(L%-R0);ap7|&n %h[x퐵ˍ-6u"ء;zHq MԆ˟^U&@7#I8 ӬLۅCG/I$z)GeǤzNĿg^xVj'r>axx5;YzE*k@ E<@?5gyIOktv+4`cpAWÞ0xeG^p8$Oމ_e*{GP:ھYTCYE d Pf](*dHh*n*FU$O5$C7oF$ʼnׂ)e=Zv:&M4^ I#5}\T!+ox(cSX`b72fM&fSp5ALsC 엞8vx*ٜab?]3JIlzp4?! 0Zj(\2&cTb<'# FQ_jw[=L2L೥RKN3[Yd-!1MtPYG(8!ɇtBބORTAz۫kq;kdێȑ0^JĐt B~50K/m!B 6@w 7Y/0S><Ӕ7R4w):ZN%<=APAզuoثaae68fYF!:B]I|Ma7Yݘi ]_c.bTNjY&{m yD˜UJPxI:dq#paKG#Sb+.+xʵ~Uto71s ,Y ybh܆ja# &vHdUZ~z fyH&'M'ij#hZ>y۶h_,AAX1X$eEfc RX9ٚy⨤l W?Y!şrKo˜:ȗeԯq@[4:c͑iA*OCƭ^O0dly[og%ǖV ho[,6 gYYd{~V}A dV} ͕/vMM񇕨7{^{JNRDC{2l  Ju9 Z^?g((W*NpgfO5I7|6mc 76BnyoI;9uKvwƇ=YAi|1m:u}ْ_ڋXR1ABhXR BxPˎ?t`">2eΟWXҸ#5 6'^YQI)).ЌUguG/V9cla}JS~~.6aтp)%PJC,s "~j}T;L'u7Ќ=*;D# ڿFmŲq?Ȼ#\pBf0_-o+sQU+v/a5[;qEkѨ8Ȅ$fY76"7dZg`[?+EyquRA0E4?R"1:K-^W-}79Mx2CU؏O.&tdj^8ԛȦӆ_%Ğ.w9ZK 6%*J`u Wahd]#/SF=>PV-B>dq?$:U*?dɣ ZEv b972 nu!ʡ<љ:wHCJOmoxB`5'Yr=#`i1$a)3ʕ`#mp#ɔ.mWĊ ޟe:\.@ބ[$>/-[KOIx\۹7%X$N,,R}JAG[=d'g={isvѼ܆V@8 ޣ+5˛EtH[J7D17mrSYθt :d$ V仭ml9Tň@Ua IYa]XK9QzՕ~\q(nPJf)V!4:3^y٦#*rZ{5?]kx |AjW8M~ju*2'Od9x@j vPDѮn:ZYwpכA'S UndC$'rmZ{eJLSpXܿ[%13[PL~4/h`̈́4ڒsʚS@UpHSڭuteVC-+ k8 bb=z=grr!&~L Cׁ(py @5K2!hzTLlJv=5O6Z./kQ0bDlb.g]QaCPo(qoO^r.J|R2J}I~Cg?d\hQbT]7+̓)WYA*ʍKQK^ڟ)IhU6eL6%n>Y#m[̨v0Y &H05 #-q0m_|1} 1*Nbu\gY6̶lb p[S, fGWH~w1py5&8=ڗ4i@u=M(ZgDMisHIǜqfKsH jM':M z:`MG)Smm3_ZZO-N}$a@p2^0 ~7Q_CٔƏG-#p9eLYʾF<6%@{km p~R#u;aCPu,**<Ĥ;CZ pdL9d{o8V~صBUv'Źn<9;cwlbi zCuf8%__r4alQa^hcVe,7jn;lQ`Ah9z< 87LA{RQ`/Rc<~qR[B T&2Eve=\;2#Y]b53~VX)i!Xܟ*pXhʦB$ݤBSOGd\V{Lݥfs)5?vDp+bc0W;d  COG|:Yct"k$0Ϡڢ;zO! o(ݗTBN.aqdm;fz%IbMWSB?d"1y "d'FD>kb?-.!0js^ LzbV%3#F{T'@-]LܸM/n;xĵavGf@M1T[eh17 &͹ 6@/1~JYzgf4=fhQ xTn{7&~NGOpEZ/A\=_kq1x.+[+Oy㻆0AJccuű2T]{wq7|侴ev.c@#psEuJ[7|]1#1KׄSum-YmK>"eƐ)C}bi;~a'Z'97snS͏j< MS_gh/ɪ75qjD7+9W( Mu dLT{=e3ӛ1b08bIe{wh귇n;:/pIIwXè7[B~AB |T+C}2i V܈Au?*P^|#F:uڬ&雈""K;+?NZtԳ`5Ƹ0}d0D _gJc'x|^ޓi6zr ڈivo!3&O+V Vժg|}۳),EHݱ dkܟ  :xi?=s #MnMG8˹Kܘgߦ1J-B/L93X1\g1oam129UjT=]*_aKri'WIz4^n(qSJ H֠ךĕP߳&'jf4cU>~ZSDl7yy GR@K C*7ܽUE.VUNzePےI8K0XYf= @Pn|ņ~@ 61K06νS Ӆchh3r3F=٦nH7e(Ɛ`o rč{F@ߐ|h-kBa,UՃf&bQALThc?U>Y<(]򒞟W|utg"(SjQۛ7]G`Iu@?gWI'7=dLі= E&0Dq=728 A.0l.ŧ|OGy e*-+3Z-m.bv rcP^[ƾtt ,t0H`kZ  'o#cUb=z/u)L\6𡪋 _OFAcTP惑˩a dނK[pO;6Qe֊^bE'Oq'Z x!BFڠ٫,)YsgVl*7Hl6Ց1f$PeS ׭f:_T獠Wӣb`Eysޣ'xVM*=z-A@l |Pxb~'7VZ48Cb.suRD}i w>"\F%@yLh!F򍢀Pͽwĵ~v1H9Y]Zvus_ehKY2e8:o G?mXGp0cdmF3C&0>dCqnTMke$? '[i_.Pr y8^WJF4<QWr85{m _q1Tj^mеGAk!%[U4A|X5f~C$C~.]lN} g 4r MjY,-"_qjp TIvӲ(ÈK4c=Zx /xM ] @ܪ{s.M61.Wl`)n*LD8c8[ې1ۍ" Tiԋm׍m){'Â0* CS²\ ә Mv bƷC=*a*HeӲ)S%(u It],*<_Jq* DQ|gV._i W)qQHS@xĆ*Mwԡ,bzW oWd_2H?@Աj=-nJ KN+} YǦ˿8CE8@ 8*V(){e% I].4XsXo$7,mXǡ` ̫~8ۮWch d/@ӳ\J"j^ot 4 [kl0sCV 5|{Y)26 8JzN,H* x:[kiqƜ qY䉚Qj%Liډ&}ga,E6萇I8^!ZW ̀9LXR1D . W|@`iEf{g#׈xI%rZ0nI$T6CV JP po?fÍ&QyWX6!Cx2OuRCFGco c-|QA:/o\  ;IKopLquGY)ïI%' VAq c- *mdj OլFS9%!:^lۡ (f-l( K>63 KQzZdNBx̜G2Jtڏ]6é*A&.sm/\: YB> ?TerSC0L29W,ms}DĠو#E?aA< ݧ5='s?o콞\Pǭj9$xʿ,a7l:Ko@\R#x~@I"5d_ 6D1(Pu_}' L89`};Mci 9c!u~Q_]nLo~@i1TcWďC|e꩒b+IQjRGz%ƫ<b<փϳxB5%Ȑ*P Wl0R 0{i[xⶡj5.CWhGT:brdf7y?JtG,l0Ԉo٧$ÓOj%.o+r ɋx& VBJf-PPwe썙ro\me-)qyt(gWbn(Yo 9XiUJ\jfN^_B繆=~Jyq(hɻrX,1 );ڟE3'a[0Aw`~w)K?d|E:W)S=[@*l)& TYȔ ?lOry[=j'o֘Y:rC`!'AmމMSO4WdL2ǠXcxv$LH^lH?8.HBUGݷ@4PB 6: WOEߎ4F̅ȹ7Bϼnz".}};G񇵳$|ݶ0pJ7aޛ\ j_5p9 @k\c2!)Ov?z, w7^K2MN%+gKv+蛄f Rhy弎nzo ج6TEAiԫcVT.n<ɞDh}fpšt5>u՚"`ޙ|T^j*Д.ۃ1 ƄEs- {Z58SY%3W6pr/nJ,+x8`4'|~ H7s[5m1pѐkUy6o&JhmP+T,pҶc ]~DXF$DnEOxۛݿI˦XQ1:/vK=vW *b%¶~}N%h.];ijCT7#D e&v1j(#^^x2kGٙBߞN"x}>AB]d/C.6CK,(?ߝ"{ZN+ qZnj`rg(#R[ލ>~QXZ[sf,,!w&7{H)OvrZՐ2VZ]h=ȋ;[k<St=3E=lXb5Ϗ9*Vs/7$Ѷ1xLԝ4)QuvsFW~&ήӥ+w "|1.:A鋾}q/t;腃:ҭKTg55@׽Ixq޵ּM\r2$dWaLb'(gGf LWuDůDUy`vW?%\>ӛ>EmH!DB_{ʗ!}|qcSC B(- sȢ}l4hDJYl}Z"V#j=wU9!MHXމ08 \9yלE&bC03ɸC.#+a@4oBNrwICle^S}Ʈk ~Ac)!U8- ISM:r4 =äQs^\Wƻ-)&d&ٳn2h`!Jv{bA Xun+[WRao~R%z]4@cަE1V~g/WG%<1X1@͐hd+2@Sص{㎂QV<ndSܻUP;A6; qzTA;a~ OB^,^LH D3 L] H,1taZ8lYHSh')qw֪({z.# )beӄ֔ tRB6.ԧBfSCL΁˨4ۘG}Bש3P@dV !l9TKG*XL]Yl7(B˚[lp;i%\)h,A]0 O y}'oڽ>?8eoj@H l&oB>ٗL9~oCB!5M[80CP @9}O̿ŨP_s[ +0NnFv(Ud!5rdP{HZǡE z4JΠnn[@! ؾY}67Cҁeywvݻ!4NPNupDN9E j.O!}"m5oT!YU9gF3mb-al7˾1 ¤;Q4iy !!_)0ptheR.9\2;Xpdn9p2=I#qH@j2KĘ-Kni9ʬaf}yD 80FZ~+^W#K~b1Go\xlt왨'!׭!෎H.[(WZf$MvǴG⋄?1R8Zҍ36؝Ce3XG~|HަA|L_s9F/ J[ϼ^L˳yfۭlIaUP Bfдș&T:GH a@y? h{'(~\ʽ'bӇ]w]~coe)Zb5Xs\P{H4|' L(NJtrt!ѸiêfB4dK.sl m* GQ|5kt!]GoAl+ʌ'TnPyJOPǼ"-s$'>22P-j] !zĭAlqxdԟCkœ 1e_1ƚ*[h#MJ>/R&ty( XTĨNP DWfMJzDi8mFq17تx:ͼSZ@yUbŚ||Oּw>dW>(ZA;ZݬxTѢ?M¥2`(HB="HME.ԉ*ujXIϩi-ލu > ViX9ZΛT-= Vjtڼ6btqǦ슦ClV0# +3)lW;wHEJOLv Sy wX^94Mt'&`g F. ޷b1a ;,%M_nX#vO%BTd qgVHUF j-[qRHn>T|zZdO ~/0 ҽhLŒrFn^moO'NO-\1tTN3 4cY h1$1q4ޖXv'Inɫw9dM]ؗ.@$ p1߸T&Kp"=RN:# 5.'Ec(ϗpu音ƯRܓ8G^Ӧxw|?uPQyN`J*{[u\ ;^CLOzec6gmk ,.8 waЛ&hTM2}|Qe޹Y* $b U*4O3Ӣԯ(la3~1 v]z\:"ŞJTWmS ,gAr[K3}p3sC7_CF|{N/C6uA /7=1+h T8yײ j@7qAnrR8(ll0Dd_RF1>-@eGxltKd35yJJK̈?sF1CW@ *|e K.ƟuRO v&j[-8}? m d рTK'M[Ah.hA$Wz:Vv[giZ ]yJdHJA#7b9*jܧ!b7^rԾN=ldڛ#8[}"佨ZWJ/jp}N~R3 ]bz͌ؼٕi NP7DP#E|!AX(nrY{ %Й=>ʕ&Iv/ODIxAD>_Īs8}mACf2$JK) &.I%*Zp&GU qWlLgwN'G'~ܨ)iQ8W 뚺 go̕}NIB&3C 7:|fDc2toOˎj~{t7!JY1WLb?' GFt>~yO t#X,jHBs<m TKELπ4-W/+{lH^]Ε>**-~҈`T .6SQM'<":a 6}w i~ |dLw GǝѰвXJ+KLKa?95Jc!`qG4,bPx(,۹Zk'^|-B sHXCŶ"d9پjԣbے5z#Hp 3}3@ zK;)BcU.C`/=XQ{N^:\;{[мB|S̆.oøF 'N?~rN#a@ ,+ht ׋u5-Ms7CaLbqH'欟f9FI+r߾!10ŶNcsOpj+虲>nvdr#H | ;`XxY"e'bej!jЏqe6a[A=%ovn%H'+&$m J_ usE"T ;MR 7v$j8]5װ1!iQ;>Mcq#W0fdӆo*ri~|B5ͭa92Px(09C,/i*`^ f.ְ(O\ՎhtةڮPcO˛/FN#pbNݗ"QZu6/7݂c_+g :.-[XcOq~"?,q ߜH1l!RXHsQm}ѼL^Ϲtb}mr8ِD#vN3 zcFCbnYŠx%M8&BPYYSAOI7\q @nŔ?(.6rox7wspjѺ{@*A=I鷊;WnX)fm֟H⊜fk5X\̗TMdC"b*z? Ҭ) JȠzo?i諎>^> @z*MjZMU{qLo։b~{Ճ! ^Ƽ^򽚸l'up"xFz<ѻmrY_vP76ٿq^JL)'`v,+qḱ>50WH| lhQ pt@K4:'.׌GXu?lR;)Qz R'ᕸU)yhJ~;SbX}Pcpl==EH~\fVPM;fOLʓ|wk i o^#?yixsSi#<ע8I"O?;FZ+S'mף)r> [{Nۍ!XZy6j)G-dc Ei&fTWXxNl%HH%IH{ AvѴF.RA)ʓ.,ˢ,EAs#i9JubR/hux8q@xSDf(;:D;mtA bgd?Cr4%1h3B9kA}e]c>+̊븑zIIEW7)?r`CҜ2ߎzNA^rJ/i+35䗡-?g7EsSʼ.GvjlxS'l.D;IP(l>+75-A(֧m0}YOa]#`"[h)F5m8u&:p2/ޡ8Dr@mSpR,SoubHJB>W:$'uFbG[^Q{)ng/YQۈ%i0Xau)1T}&JnR֠ɗͽfD\He8De! };~SPh<|LMCS믬%#H( @c%fJ #Bi>᥵I7Ė?z\݂Y<8HtbCZ#-_DA<LSJ=ob́c{o=}[݋Ͻ1/hFE•Jfg |f mRj"NO hbAȋ6\fc,{dSqx\74?A 쭨g9zuvnXaמan11/}%Qf-tXo d3ȂEbΌa#VM\m2'H֑ϒ;%2K6)5j#QoH"@F ts[6aRXfڳMXyvoS!o3#I/#lC%ӑZ,~S(EĎTʹv`/O]/'!c!c$ZGa[5Gt>t=O%~#%ο&gԯ湨3L17E^-j7Y„88"rBiϯk$CA.+1z|fCu(D=8ĸKߒr]d K ~^ԾrXIpJwȫ;NfWܵ1[OͿ'֓]f>-?y[)(ǻB@)^=0@<+cH_L8#żzeq8Uskc~b_)pC[>!UQnh5YjJPYR{+[-}"aViJ!r]ޮ= qLޤ9W'5AR,i|t2Κ+Q{ByiVFh@+U|"s F#r-n\&TZІJ%dl@u]x7*ҕf2w\=uwq V6|PI89lbiU]G洣4UZ(mY%a6KQopY\J{ ;7H۳^عӹ. NYۘ[`@話>׷7]S%W") O9" Kj\h Go,XBr`Ǟ8vT qMЛ^eb%jw]%o1N5?9F+L2@M64g8 e&5>@_'iJ86&r7'#l7Nǁ MF`|,jhjqe~ln~NB)`5ڏ<@( D:Gv9ә {. ,0/MKظ=ۈ]8zX ֟*>'ҔC ?in0Ya. u7CF'|W2fA䥍ӽ6%d+&WU::8;읏_n"DUxMXd`]yr> 1s%\~Z7,$7߉>F:T!<(P7H_Kըz(/+l硐e'Oo aCwU#5l센S ǯ5x]`]K9++4Zd;_xiA(9]3GBr\[?BYU-ͱ<i"F?h*]ƩBdl|$"J!m53QԐ}E|ݤd[za0A~GEW] uhO KBrLAծTG D" %:c#ó3w#L1G9ZHoTySmԮZCh|0F(ם@*d; RCŴt: pZ]_lH3M)$|gkU Jͮ_bj?x'Pؘ_}v?fd⢴KV+(!!/-I\,X`b|0UqaPn(!d$OiFT2a ]F9ޭ'AP.?>I|@9X)@Dǿw~Cj\onDA#WgkZ-*m|~ؗuߋ;NN}N\(`;I_Vr :ȃ17Fy\DAGLCmR0q8+ͼ`WsuYM L  Fjܹ(y11!rw9-D`-v vԍ\F }5gGWeKϻk372 {.Y{MeF*k ɾ\WR/70vyc8jD͖I )!ֶISD=׍E=%< TcZ $a:Ъi7v?ԇԜwb0xsE˰h&Vj4- [>n3(=vd9U$L%jx;uЌ*OĻP[5BЌOQQڶ-Z-yUUr%YuD .;D%+\4'0_90 Je@U b Dg# _)?gxIV0`ZV$VA̶TRY0ዻ}&̿D%˜B#c㭏52w}=ӰaifY.bF4X2ڒZ)苓M=x!'56r[W;aΟBt~T TnwҠ;̖@v'Nfe/^T-}q{7/z+3䆁3. At* [ uVK޷W˰Ĥ}TK:uX]Nk3t0:D9q!q-Q<2"# q} 0pգ] pMLz'7^`':>e_hBQxoOt9ClXuHE%\Zzu}fO_{G=yȹet]DaVnM" 7:ygMXa,q4FXIި?3$>TIEo RsҐ\ȁbI@eb:rq>Vow -;ңƍAVcW6t4y2(J|Ar7#j7!CT{IN BxU]dOӧ# N9ki6dv|u N3t~1>(/"xkG+bn>E3-YMɨa^J54ƫC9k/ٔu^\ΊR?Pnf}2JFm|շH{(q^HTnamڨ饫?:X$ޛ7 W܊qe,0:"CD CoRΆF3O?eH;6 3ŠN|.F;{{}DX+pyυ2i˻Nue!ybx~rwՑTQy M '%B0 Sd9Gߠ W;FqKY$'! [SҮ.>.DtSTdBda繎?w=HnZ5'lH/Mx*XK~]uL\% s O8"V:5y;/Do6>Ch>k*L㦳}tLn$C>HӢ)Erg|RkJi/U ʱy wa$P`æo4`{rK<O-_LIl/#?,au`T~l46r]C n10Qf"R U9pZzc!mp! vA``K!y8S Ӗ(Ez ~}; 6 +!<Ϟ6~V8KR`m}+"fHsBIHm4-UD"dEfEpkk(G‡j;0}.US{ZIUA#/][ H}gѡ;cѵ=6UCobnr@eEplS-\[CmL.&>]pNjZ c6LCZ# s wzf_MWWy z#[G|,׷a%2I?3NsR-W{JG^2aM'C:=kS߅z^ҳP_@a}A[f |55Me{TI `K×@$_ 2fgz,lPU,f/YfoD|vN6Iu_Za6xM+%:l|~ ܓAPiGs{oWW.#j{B6O6OPei=jq,wݛR= i4A(Kzͅ>gf^]^eՃNJSGF~Ef7cv HqQTSdzYEr:8V%,æe@qg`憺rm~e!7mfijo5OmEUll0BMZE8X0>Cu\}EιR}1Pk]/=W34yG#kV9vt& WFb)]IlQ[zgʆ^ʯw:arj_Qa*[eG; Q~Xl[e#7}Y.;,>^jCD`^s4<~{rx 8BoWz/D~0SuIDӚ& NҴ)v9/U<nh6X@ .ѹT԰_f`dz{Zp+C3G۔yRpr8=p!/6ICI $Ml㧺ΗcцelB !M'WR*zc;밴%⭌xlXۿ^;vuZIcf@ο߈;|KȻPT8WhޟX֒m;i]EBGk-?>a%73Χa 5X>`/|٢֯ݦ#oz=kJ!vO5ueG9lz!JXD~6\VL}_6\:[)WfM B3k?Ợ D U`$ljzyJ 3(-"E(&r\ݐgTsLҌoAp p0A؀VbzK800cx}@;4;r/ЫgdDPRAE.35vCg}cH}96J<案)U?9FEܣI-^;_|g\PD2g4@V$ uȏLԖ]=Ԭqⶦ?'Vo)QBDOyhIԑnAv$Oveq6E\ 611ɾhaV &8K#A\$k`wځ&3N@`8΍ 71w-JKu(3ud'x!-.4 DeD{|]jyM q F="^9.pBxJV0S0LQkekRev@_Xfv4U9xlr*bگ`$^ ݮ^yg$a_ ^T9K ۢ+]Un57qj@X{YJߎ%]Eb+;|g^2(JYO .X9F ~KdmYӜ~(,F׋Y1)|^+(&2wcD;[`>;Fl$ aQa||YY &#W ʿB cx^wX9F%re{?["z}hdSpBeh!q7#{t$A}7 2mj2`v ?SVAIαD}U~UvjCmG$?3\DYRUՋvvKVSc=W?=A|f?ٲOA.&9P}%#\|sȓanje.çMUYU.총0 %Ak]tڛB94ntsCLƒĦJdfrTv{+000ֆhQC3?Z.xё2H(e>fIjojfŀo&E,<"~3@-Zn;v@OйiGI[祰HZկYH1 G|j 􍨏tl]^0 GXq:#ՈL AL)^7/V DU&H $b8I7・HtaD]e<-FgY(K_Ѹ/=$3f3I /&_;r!ϲ‡YG@U}LO.T nwkdd[RCV;>[$J Ug!uR'mْV,>*Qѯ2{X/vrylu6I=&p̷l0 NReӘ>q my%jzC7u823= UYZ5stDO5VU6lgP|O81+v67ґdl6KSۅρb^"kWDcXٞ*.Jk Y&BM=QgE\1F0F.VC))գDW˘ aFc=$ᕋM'aOAmcJ_ W9t:+ºdoRQek"^KN+j;F5'<{lB}W(IbGJFе1 jqj~#VV$uͽpI Oޙ!b0h?ԺIڳNEDG E_(钵"i)#!n~C͓*Rdk2d#nzzh7U6v?|>bڍgJXFz1%;mȶTj C{LV*^ jW簘R[AXL%&SDKRlT݇fi-;$%sAXY^4#Ǟ fN't*_X !N+R2hBN 9`6o%ՠ=N .-:Q|>"Z,ʱVMaϿeYrNy45# uǫ %bHqp$ݶӽ'4,?;Xf ?9tqx9 hGDG{@@t?>/km~l?߃GBz٭ְ7+70X!-aq,yKό*ԗy=[EȽ#b'!)RhidB:l|dT]]eU,r`u\*Ѭ:=\6U<_p>2C;(n2i*@K: 6  o4EПU|րlrⓎ7`:@Pt%O"3^ޡ7 ID:>Yw_ĎunuNc[@zLbN5uX 򉽥 W,(e:߮iX+ET6Ŕ4l)s^ElYkto2Pm3zyF1[ODnpuDA)aV;m^v}oyLU=f)ܲl S%+ڮc̭tS*'1Q;ǀ/@4\q BWpoIvu^YcѴ%B=Jz# &&&.YYE=}n*N'A@==2 ,#rWO,6߬Y jxtae4s/]@_K w(^n|}<׵K7?$Z-n&dO О;6GijRpys>,:{%<v) |]x Z[mq=bRBhvgpq8@l2mY>jy(N{yXF3Mt9G1d+t:^Ж1P Ư@pj*GfqU_OxCFO[ԁYo|8  *۲iNr.=.45tbb'CxJ7Ž󦦃\‡\|aZtxKO߶-잹z|C3+I@ytmĂLXM]XV(9+k_x8Dԁ:ُjʠ !rnDߜ,vp^U]zڹ]E>$B^+%Pwd6MMt,U %\cxv<''mI;F ktŠ VVV-pIO͊8 MһfgI%ZuJ7|GÍoj*LWZV0RJ22XKᜠl I8SOz 1*|xI ʄۋ:O_E"It' :һգ'/3 1(0mc!R{.SK)h7lotd#,f ^l;<1PcOJ'֐=)]2!" (KvsulP{tY d> )rv:pSUD%4^yŽX:`~ 6!xNҵG$CpfDE%GJ~٨3^<%+nŧ>c6~'dfV;sHؒ1&)!,?G +;݃!ˊ2S}0aa?ݩʖLNN#؄BN¶`8nI뻑6pE0ݨݞ(B5h*wPhX7ϛέiL&GӋI7XXΎ ,I4H_ Z۶ma5ǜ1ϴ$q){bRa/;zz7S6oks`1C K "yDE޷] udݒ46 <̘w/S('tr|^_:aF-:\ bs?:JDF<\ȇJFB௿sq=F3 KԹ]Z<W﷋QXTTN?fxrYTWu(o g] v_q( D)C+bi"fj=ZWǀ1y=p+<ԂJ}2!k2Mf]et sTqP8菌85 xΓ-8?mWGx"F䗯'Xd>foSH1q9,Ͼa푛 7\n(..&{Is}2pROOM6"K5]jfD(~6vd<EmXq `.q$&֭‚w\52B%sWuTۗF(mXf#H|ՐS©Ώ^F,NM Oǵ\ٺWu6t2&0 Fr=0TJpu#%U]cy1fGFm6hTtJH֓L*P4D*C C'"B(ZR̩3@}Gb7ȊN|Li/} 2^n6\?5jLTzc}PWՒJb4Aox4 T:lUזN?GFs\7f!ju*1usjOd1$o@(M܍FEY ap5.T0-Yƣٹꨍ).F^o -l g=q;VH3TsB <vjB4%9@WvZ#} n0-oUX}W*L{~`iH8*ARV/ ??,M+eU9&7sYr )c;WuEh?uc68_1>gctl^ ?R ` aT,Pe&T;בA(7͠GJ>Ox3zC#oDˍi/@މ;x k!}N@T2MĀc[RVm <;feiR7 2n(PrPrndk‘fKGٌ}u2Z 8;1ҕ_dy9FC$=HXz}d !67<}Tҵʕ/rW6])Mn#p|@Vz= =JGIȩ pE0Qw?c/Sb f/3OM}8YGoRWiAnF1=Wr:&e|[GYrŪX`jOde:D]M! f $ޖ.ȓX rWw11?.@ttcxb-Qse4]<3PEY%zaܼ!Zik`~˲ B@vxHnjWt杊 Hc>숉[z}2@D\TX=&)]D\Q\P)ypTAmpdЗ=XQ|=h`cu/cΛ Ĺʷx*[|;}R -&m4u]ZΏ eSNyKd?r ؎ $) 8nF쭬ghez޼3&~R H]]*C~s[- )AEѫmfYE˓=xm{tְ) YW`9?/f<8ZMw,hb00{A[s_Yy }d)i%;oY3d">$F`NyUQpDQgqeWSTZDÅ=~j;$JHIL@ҡb賨4=rES~;ԎCnM:\c̷w!O"PN9/ykx+bL4}qa \x8C0p§ֈ/5hֈN@^ƨcrbHAEoaz^\`9h? (q!ȊU}__TzX!gNՑsq ϗn?ģ$AaQ r~pڋD=`AXJ8vr0Fo2Y%WZ+i0~Zs J`yYd`՘FOr?5Qy.%]bu+'W)B\*Č3ʅO Bu_zjcX*N0R.TuQeul>I|W9- d2+xhJ2FYphᘳ>G9M>ֵfxmJ@e_U Z\s,>et{>%/ZVF+S7T&_Ҁ%gc4tpFcqDcM3^*2cv4b@~?:w!=# `hye [LqQs,TzGD¥  3+Qľ "c$[*:TH&s})/jMNQs3Rtx%VM$A24Vh{`BS }{s%P3ɻqW3[(:hA2aUP%kC)?w^ XFDDe+p5ܩ#ߎpG"b/=r=Zs p\!-ZGܗhlY=„B; !pd( .YzҮUZVuTU,JcՑw٣[^|۶#dAEpju 1joغ:/xvc*&հm^wU/Pn5)#٢$ b,[.!_`RJIN3;'3v\A~_p5vQeG2D-xvi(1 u8%dZar G i,)hTXķQV 4i| ];參 +)6EVF}"H}FsU+/vmG\H hq9ƍVAй nuVFY(!nR6[9l|^רC>'Uy<7=Q`7 jJ́hx`)q0 lL \L*a)}ꚵf.(_q8s_;2#GoNSի=]F )ٔ?]B!'i\YqkTQShpsIW ѿ+)xBK8#Oy"2Ew?7lLqQ MrZ@5skr8O |/,EfSZ;Gߨ|wr32K<!yAxUw|.Y6hbSKg u4ըǗD_9.v,YoAzKoO(؝af:䉜$t>C oRd L :ڈDpǫ[chK,vmX=:G%D51x*nc6Q;"}w-q) ǂ[TskYx&nz[z7l5@xH2Ic%XI?5/כ,p.`quG̫.8xC7ITJIM:pN؊RFmq+/Mt/!t'B9NdysC=U5I展xI_(˰Y,Nob v-5P+ 0̄2nOv,͜7XORRwU4w8I(QXO$}3sFǜ9 Ss#3h,qe̖ɑWv;v8~A-ΝA[ ^5HvL693XhoV Vxx)r7Z=blYK@.j>#RkӺ^ =6k"[n}=7. Y2JF* ߌ* M2G@d`,^*w`阹04ʶ`w;:CzÌ+j%gUPesoQܙWBl"o1A׆_ 5tf/|IL3=P[.|eynٙl@R>i# hFZ__u'xuV˜Q}, , DD>Z ux_;$!"N䉾fƒb:hbQpId  n6gzqdh҆^.}XA*RWt*pnDWFNŬ) L$80ujW{u $M)k*BP+ATA.39ga]'f&}^..#qXR%]L[?7b-lFNV^&Z># S 4_h0񑺽LLQDdwsbr"(2]Im^b@)Ӧ|ECWez3F@eH87ߊX+u3Ќbx"7mkrnRxlˎ05XX>~>O%{8cI֘@M0!0MFhdd,-ȖݷdMweKFoH^hӈ9Xre?ձY?ZF׸ iSv%Yȿ}ɘtw{R}g)Yo"]_ t}ՕcgƩ'}jZ%]of6#dZBO3?n:#kPO@m];x}@rG@:MY[dZ]\d[ۖ@c+.+ >z_<>n{`Zpsn )"^tP޳ƌ(&D;tjjÄew?|Poj;́OxN2 `9?KyPLx  -xDy@5`98HQq'^츝6u=?V-n^Dvw:_Iuz@4%\pS r"b0_²\[!Rؙo y}V6B!uyyg Q\ΜPǃ\Nۑ2}\ zZ;x#mQj7SN/՛!Ytg؟D>R?j6T XB_? F&QCR,e"9(sfHp?AK~^15\)(Փj4G0Viic?ӷNa{D6)bi,m >͡;­c5!/L96ҩϲ5dc"ES4*Y`5 {S3IDB^UXMI,ؽ ܔ 1*U5z8rd_@Qv:h0Qo:Zד7_78@]e;oމSeC1"MQ$ה;|-ƃ+dh\!>꼤\+ե Cp  4q/ l7n!J ɦ`D!B7Zġ 'YΆ_?R,?a顯"M5;mZY(%9$'Y4hKSgԍlߕ:HFj; Nխ0DHb?oC,хO|yެN چpc9(Vmt-鳓4_mBM d^WfMts7#)cE!^UP֏kwk--RZRU%[ܬ!ռWIzN6kH>6 r,:u,Põg]Ϋ|vv ;&a﹬/Aؤ U$I{: ӝ0'V^=5I]8{v BWB&MLH6۩荙o|Ɉ, @%M)p@|Lyj/A[Ggd;GWaN 9ZFJG}mY6uX[&Kl1! ' ݛ{^ihq߾!%i@tS班YYj߰rD~i<[9P$ߡ\Y Ѧmf"*fw#6ϐQn78A5 //:y4?E}<͙H_ @vF ™ Jin2\Kt H҅2lR=Nb/ %)ԂuV`ܗx¤N^wu>[vKHRR} IѕHuR?vr: .O]OF`bvZR5pcZ÷zAvv9Jp:'@HE'b527Zz@pS%wIȩ汃 #fUiP*'!< );Y #<̵`̅iI܊ A%ul@jsU%e4Gd]:}ur2U Ю']Fxq`~&V XNE>FfT}qq,ɧvm$u}L):#-YjV=ߠw1:I~ +@OS!iOe*B`mw0,Yr;^;NpNdc c}YmGe+s]U\ 7l#t3ۓ.Ħ;,@-I՘g֤a#q2ZmJv`QZ VP Ml**1#uF3͚!)NIGOuE7nD,P">$t:s0.MF La&2F& r|owIN5Gywl)HU7f&4M~rbfI@ୱ֙k>`;o~ot@q[3ZS!ڙnGCִe7bt8r*ÚXi "`mXĪaԧ E~lB?DY#3z2p@Au+:RU皣htk?}mʟ6'~R$9մ:a"ߋ@MmEn3!(l;ρ/' FcuY"GS{oŬ]j~p_Ja଒ih(7黠!1B-Έ'/B9(D7&CDZS `54~SGIXF`c%X&oT Ѓl4`6jyjħM$|R a8*Q`bOWtƁ< p4u$}fOf{.@z29^RQEZYE\wgcU|`bwB|T"VARC8y&ņn{̝Bg'`9J>|3:oeL :hV'= pp9`*2'jȥl;4bPXz}ˏz7#m .lhmY{{ w𲯋1M:s#LJ]V%!_rJR`73b^ȲSqV2Fzh+E"P6d:w=hN4z<* uW7o"+>33[ 9X w `D ώ}_n9B:7d B>`SZusq Q"v k=A̮9Ǹ TU)HD+wxEAif}Pws΄u B#o~';DJd|Q @#k=Ίm%WAjmQ]Zr0" w'no(J/i"1цSPi8,+j֎ :*c*G Bh']#rdbrnGo328{ ct۹tcNGk C>]~Z)s}+c&HP2 jM3$7 n7Cpd@Xh~wN/꧱WmR-rsmԊ\oAg9~F}e~mIqv!k?v# EH&(JkP))bᖯ_*k% {a:YnPu)B&rw F?װHm]`r(8cB&%rmՠܯ30Own(TCw{ }2x(9Dr33"EPFZJ>kN.tr]3BҿWoJ+~1I4񒩛)E3 ׄ = E+76.n<1![<4w)Kq(># @Xom,ι~a5i=FnܶOkP/ǍB6fu5䐖Z**Ob P>o!vT=FבE3+bxwx‚~[?eS& "id'|&L<_xu79l}Րm173Z ƙYcboF;1HKj]-6yd|W Ь~ #GhQRj:w"qXMp)ijK\7r5:ݸ4-浠 fl>`JnKpIfi٣L /GĞBAQ<MRaHO*N~ŵW՞ |F0׸{Hi/ڶ4N"N8>&+O pvfxaCSgL5p18I|/M{= :s_&"Io\Pl B ohIHMXht78 @'#Eo]S"N 噍ŦLIT2N9Qp@Y 5; 8ڳyT.oIIZBY68^ߏ{zU{nf`1^;!D=Ofqu$"kķPu dGPJ㸱{+4=QkGܠ$G},fPь (G0iʨ ԭ",qmUK(8Kd|MJY+%nUؘ+Jӈb+e[:\@Z">ڶ)C Lx`tBHfEy' rF+gwsyir /8N(»ME4ױ9Y-F "kz?Rm'#Y;v ˚mP](w',qCi54 a{xW?S3,C9Φ)\u{ژ )#JQ8# c_9_'Fzk7,QĜ$t蔈e/izVo8C"B]C^8=̀*S 2Y0ͺT"|73]?s"xo~a{!g-* ߋu5ysuZAA/t"\H{a" E&ЅbXu&w#nd Na%ahQ5H,`MI>=w >|K5vB7nN tK`;ea?[.Ŋ8Pk*'i?=$qp߫x=(]&*m/>:5Y%EǃoTD|s wαi}9D~Wlŵ+Cz BTwsF7L_v_<<ސ^!ڋ\`E}{F@OD֞FZt_dyiFk%Ģ~XWنU=TGi?Ŏ1.L6hk8Yi`G$ }9G@q(P GHqrq5U`#y\ Z|B;,fԙ0ʵrs-{7'qK J;(M6 L^$c٨6K(>{B܂Hhɦ;#Z܄s$1NĜmc?H4/?)?9O?-G}tz=8JWf)feZSFQ:i-Id/VR\!ӟgRP.s@ء )S>KzÈ-ͨ+A?Oi9)h+Tci(s@aEӲuZa>~S`o b oy .^ɶWG!a9G*!KY\~Iꍓ!L%#p?d.&i rR'ӳ]:Z޼+\>D$NpVP ,ܮj S+Pqs+ /s8W-buPE3x$Ea``{ֻұ8괁7Eja.ϫ/x h뱃GcMk{ViEFa:(9,2+c Z>_O 9~KHB;hiq_ՔҲvtZW#Fȧ\leר$ߪO,/9@MF7Ԑ\YF}ik_zMa R.%GE֬~QT=Ȍ"vځr2^,A&;cW)fTR̎8S)a0L Ϯ[bQ>I]T tAM>Q+heP{ej/IP =o8Or_n+WIyVo%9*2D6)^\ؚMvD7ԇ%o;$ bv\ޘ/XpMMh>]vFڳB&T%/4kXK`'ObT(XJ8zbqy1y:Y@|ȸx[Nʏ;{ݦlta{VФ GE(`ȱ<<.4ݡ”rYb7d%W;*r&G *4 lDEXg L)+>Ehr6E-\ʀb#_rhVrz‚GNBrtQW\Dլ0TWJCvvPm7˵!-iCi&ǂpAu[g\y)]V"/)YKNc|3{+3 UUظՖ"w^`t3YJԊoI?eMQΡ "ZJ}+H[Bp+h(:}mIUxdKOp*4z"TУy.еfHV賓mtPIGx:AKDhV:uif ,>Z`q$I |AG"˻źՍ=Hc!C1[Mg|7@&PK U~nbXq.9I<)[q%[{qyG0pp.BA86Q|T0_iȐ/P.<_דܠۗ2zV; =Q/ _yo;sn餉Ņ|(Hu7uwW&^z"gl 4k5W0HATMZf̨2ɜGP7+}]y7Fe3c ɨ߲/QKkϘK/,{JI&~]bB0`ձńV+.NJZ$4Fk)}EiU0iWu64T?NqOm(gǺUeiqD5ʾ4_/0q6CNrh@yDTq|m,@cچgeE:T3sZm .oO袖J=O_FV>U»^6GpNP eZjn~a9[1%T\̦ruuP7kgݨ68NTz|Y@yN4;NBC^9.,jo6ѯ?m q^su暑#"\԰ [ g3vܘliɎf[346")%1LסJmӫ~p"6Qڛ Skoei]}"bH "dQ"*,襵 +-ѫS+ؓ/\4蹵`$Oi'c_lB*h uu$~P*fQgjxAúTQ}d ?[ $T Υz(y4fHz; 9+t ~:_t|5-t^g@%x#ϞM]Q,%&p)O]Qh8{r Μ64ãAQ1s9,/wKzqxi>㟮z_6+ZBw*K>!3_mRsJep#:JۓD# g&kE/x=K]q}Xޏ?*{A, ABPYIv "dh{>Td;}X7f([+H )9ׁ >?stӛ`),vzҟ{20';(y2j) .^'Dk+_jlŝЯ4Ѭ^ٙ}-V sRy؍]2U+ 6w;QM?(7U6`(ae_ۊr}!׵ 3BXr@[TC_1\8v`Uw[W7yor!bpDI =^av|Jl.zs %e(ȳձi(SLD 2b3fZ8wS*x 5 ' !-]eM* |:ϺO\Li3Clo?_JTzXfJ 4 X >Yz,`^*n9#i{ 0ȾÎjB1U<-At#RSըT;~~z :A7=I6]-&8MJC1e1^垶@\Jp x%<)7-Vu4ϤkyIOx,hd)T8^B7FlMVwۖx,qhJsB["d)L-([BAjn`f>Vee2g6EIe Nր[F^pCV t; PU,7kv P|-1WZF =3e;yB~q5bvU {92Pk_nLF?ϋUжֻv=I-v@eMġ =O 4l -<6HrVewla!E`V~`v@[6502:% {?ӫ VE'UY͚y^#~IZN,TDWC^@" 4D1~[5f}['6?{w3^9>|⊤ܣ +|ؗ xnնa+֝~Q뱽!zIhWuIKVeHm_(zƠr|+rVNq56O0ف2eۃJクf-Vi'%(s]CJbLP4dz$qч]]+d|LTUsGl,~=& E*ƭ4 gCK/ѱnLr3(09$B"/Qړ'!X@J5gf&^ɗNP)'zx&Rd3 Ƕ 8[ЎS\z%[<[H'\ /"2?U_FG$j܎̊vHqeTBD+ݪSmɂ1T*so(:=[p)/њÑ\>6܅("6:Y8j=΢r4t볬b%iCj~Pv=WޫK]1A&\YnDɅ4x?Ys%XT5OMe/69)x y8^-E==kV_Lg JIʷÏv1ǔT(b^`cj{mRie nǻH.[!yDGDU <7d^D[.0@E=pqk(=? hǦ}etYQL{~ L~Y#!u:ne9dt5;6_Of{މ@v+u]tCh:Lk.DnkM_,?͏KUe,IoEoEX"$#(}E$Re$E% PCƺQoNҹ)bKN {ė};uJ^|zjIA .3eC:057w}6MBAhX^xH:ZYO%TΔQTV$Ӛ[(3rrt?ATX]̂дsۉ?kcG|d , b,crQOfo 7>wL)di2 VhMJLl]9AI?q:AiDON-{f8#g84ѯѴÍUYOvt"pCaoO 2לxWo =!m\+ioEt+Qo>*RABkܹcDӤvweOr,w߿QJVqhXU}8+@vڒkt7|Xz+%4ϱÍQ]Ӧ3$tp 2S|@Z&>IGR v :HӷsM-0}O} ,rᐆ3 F<kX#,>w[DY2򓣱sěye*)%;Zї~n8Amdžo " ԳC v+_ ,mVcp>mŖC?6DzSb!5=ŭu.WG"s3=S40@Dco%(nvr CZ!}߆ 8B_{{jJIRU`EќOXf3K;k/8׮H"Kq3um="Am]аq`!XU#LM#oHDP ߉(Rh f9S:.t{2nfIdڧs8ͦOP<˹3.)cxy_ϏHvD#hnqE PWu$45S rEEa9 . F sEԒחQ.A!HLMh~OskcB eGdB"3NlSy"4Y)xǸ~ # rW i?lQ%c,8d=0Nqͭb35H;cly˺HZXE ML7UZ%r.]\DÆļ[;\c֦Dwqѝ`"UC(|;_6+/k@^se*¤#X-4/[wVDoz4 eLg pQ,P--$-Rɘ3VFoYd@?fZⅅ@ޖ/k\'?K4z `O a:׎Ŋ ɗɝa@brpɏ>ՓT$s?"X+s]%$ޤE2Z>D5;CBK6gf:pI*) ز"P.XvLg IkBVzy< szze:J fL֔wwjN2 az3+BRKJ xK@.NpC{x\s2q (E`5!~csqHC?M; 8HTl3U6HYr(M>"7ŸiZ5 2Ή߹zXlz7֩h$Z1-=@+"<4u ΆAܮ!X8n~^[31u ]ٛ˂T{Utix k^9Z(JGq2%L Pgt\T5b0/d=%%QrIVf?1C1kr" S* ڍFJ-6YcU XiIۆLX*fZ0 ~.  @{8OٚaAW~ 01Jp+oUf"A⼚ࡢ⍓rej^f;>;u&;LS1śVq &5 e Hql8TkN o"T—]3hCmJ#]M۝n,ebyZ=[G{4c]B]v(ޯ{=Cp}1Ti@LМ@K_= y"Fl|ޢj1XĄ%EM'g>H[DM֌Ld ݸ!W_O=n60c.45 %H ?UO{}8j¿ȟcUKv@c  9P6%@<Hz%AVבHʮWg~n [>{W(O@JM\^KY٭:XUгGN$#-(x~&a?Ϲ"6$qak 7BB`lKnh5;s/r 8, uwA"Fmc^wcOz}I. /rU]r9F3՛qȃ殅6z`'BS8qB|471ω~W2-b_SO .:n4*]PD=w2xKJ0do۠w }ӢHGө q1hxkKg>PׯP8*PmeNǷxev3+}< j凌ʰz_1Ҧ?0AFpo63~/A"{s!qSxl@Éz`҆h I3ņ>a]PeTm:Cۻ6jl*b-Cˠ~,!/ pmu](/nj1ߌ=IRf(=|-[l|~%@̚;+a^/RL_h;;ޫ?ϖJҝ6^gs:1vmy*mbM\Z}#,("pL(a 5~)f&QhFV +#H}=@%G,%Ǖ Iwfs!Tc"{K s# ~w;U>բ16|eS!&Z!(kv8bOXk&WPHU*/"-;6oJd?WBqAgW 1 d>>K(:4ˌgI^:6b:T?tD=ˠ=іnޏzkT A3d vG4i9SQgVbE]=\-\zv3*`v^<;>[1{vr:]6jS t^XB&W*y`- n{BHaԵ4drzEߚC:ڣ!¼% ҡf -N삚X)P.zC= Rs;::㙡##.3@u5H2l~<׮!$ .`8;P$->]Ӥ$$Gr5tLw5 TAܩyd-8$aHN_m2A5+dT2 4Xn[R҉f{rcGϰCǏ^+200$V糥L#pQZ. ye{C/ZlkGB6 #]}MmzoJ]QQi6 :_n?n86!+ BǔR.Y٧ YT$(V 톋6i J5& ۔-L 私x 9 [ίG@C82N\X. &X/Ҳ9;9-n-~D%s=[`6{Zj!|J]} )&'(<ǂjȃ.x|;ԹF}YqN7da#EIݯFu?"y|-d,SШ! 'LGRsٜ"c!'./f̙4C LĽ+t2`s {i[nFH /si|"]qJi\:P(K("|F>lNj+5GбoniS7r펢Uя r?y vIQRcı8FF@aU0U'hÛz]k }T;~(xZ3y ]ިC﹎$-'jc o[`^8ɆPp!#k|-ԘF)iAt,ƎGx,}> {4]ÝsӂVG.uDB/R@ 1\RHPLBV<6޵'EQí< #. v}zaj~!=L %|n~b,BNݨ?8Dd=e遇DEʫS Jp!1W}g-t/J>^M]) dUn G"vE!.6I``z"/9a[o|7zY7D>xrs$0[NCNbm.T38*3X`wS# 0(d26y}0U!ު军9d%I?Re7ˮy,Y\V4MR,=ӓdFju˲~㏘B C^w7\2%d{j&G)BaNɲItz,hL& ;s]=),ΡN:?dnwZhhk=p< I E)p,cq`heKkM> 7-߲v;yvo x. f`'CE٤t&R`q$]C|/[8Aȳwfu Ϲ/ .A}x{xޙ5`n'hF!?')AO2~\6m gGC,6d1!LҞ=xpuXqDZLѼ}Q~[S$E7W[ 'g:m)؟ٵr^Ԫ+ 1݉0ȥ /%(1xQ8ZByq*~!$39]/t籏)wb:J+W(ɝwr;6~bs|VH: ?jcQ쒙Wi"J| X\p#*N\m86{Kkꯕ:Mr;5@_);ewyX~4Qg=Xt8c&YM`68囘͞ΞAtL lwLΚ Spi;չ}: ` ' L'Yꎅz 0m=bLLJ@ rkVw T oc, . " yY_'χo"-BZNX) qBNջn>XiwU ۅIUk_!ېqv{r]WFN Eg'Q"( )+YP'\9ub~3ޟ8|$̖r3\x P\EqMĽFrR7jeZ7,}rYűFNL.Xq6fFQo!P{W-6'8:OJr2VJon>+>>,ʟ[ӂ?JL 㿩-U=C,7#nUu{N:hr8\C fTUYnI*a~+p&ns -,e+dMe/|&n~Dc '\V}0@j| QR3p?XV;cGtpN4WcrKCmh2G-&[ލ/vfڙ)^!CwUt~|Ob mN8q&wHQOLZf)^ +5 Qo?({ fPWpʷv`0=P'ρ+n+_wHOQ`0q_;dVpt]o'6OE1> &cin\&A)|6ܟ=TbÁx# )š,Sgo.&AWEs{d`vЙ| Z\~ҖDÀzn{Րeꍚ֕8j~nŖHb.aa-')D ۜ֩]mhl9[2ol,/6,'qHڨ8ұ _m`?ٲ}ÍZkM۾; ke И.}5!gc 2jʻ`0ŁKs1y,!{>1h7OdH:(W4nޏB_P'UvsnTPɥ492??I@׻k]iy]NlZXA}ojv-*`czgQ34񞲅4ODwv)Dpԕjt٭iGvER ),t0O7&ڂ9%XR'ƱK:ѳaAl2vaQd#5;ȃ_2x6 ɯb.l}$[Yۋ-QnFS&cf=&gͪ ͝XioGex< \XutW'|x>_NgxRTډ@ykLgJZ犿`˝ )Z#Z{u#4P]~$BCiºN,}JV_ޟ$024M.q[gu"(&$1T)IGBSAқ@oN/ 9/9YRLvKY@\"h,(&}fJc4{P+˞=KoxU`'07{k~a` bgyS␰J/"^ǨN /(hyQRyGƲ$.Pyv$'iv,~떂kT/Vh4nJ"<@iRvh&6a^R"Cq!KDqdysYeEmg2,QbPp5]O7{om %3wUJqT gpuMxψE6mf0 %fd ~ON(dڳG Φtz@z@m~ 8a`jH@R(iJ|!˒ؿx}2*vb@kaUA>FHBqڎE}&Cb Uh}.";F\v"y3@J)Te NXت}vk})Gd :ZIOUnWACU^JY^gvkP\MPU<5!i_n\(# 55Zrf6T=n8neb T2ͨShǦ)@HlIV|Dئa+= R @M: .]RI 髳бfl* pf hA[NW\n9w|4һ8#JO#f>f!U>>kr@,ў F]_,95šk 5Wuk𪖛\UP1Li- D{8 "ecu~ġybr߅e O!w κkDd#>O6SQDrn,ZAU|_NC55dos J9\h~"ϧ)s&E#;뼥~->ӹgp+qam҈!xov@jEY43u-Tah|߁ ^S88_/O85eX['KM.i p78n'bW?Bˊ0qрkSow`r%֍zg{ Jxn|Z YFRqO|ټgfhɤSI(Ћ^t ߌn9] 5+,\Y V j&Q15>$6sG.LhC:+sSx-Ob}tj- `fjZWaU]AӒ?DEZc@P,8 S;7jʭZiM^ 7ʐ)UlX(M%MW=WPV'';wEPiYl;xr,6g]WIuT`(4e_dnpa"G}䵱̈́\ԣSU]MUCENfps;\Wg*kzmq^qu 5% c׎Kv_5 4gp9vRJ\зr%>iR@k6Zˏ}i̳QU =*Tʵt/91CljLR7ኳI}{+(aJ :iGحV#,[QHLGh oW:؋n|0FdQD:.| rv8[|,{k' (Cy=b9X7+oݣr?p|x䠤j+綠?!-oqSR[;@Ac@ulBy`H]rƏq$dx;eȶ^pr'-&h'*_h0oc hF~ 8% #R$Ejb5VCMt-[њE(Mb-47'i]16x'LVM%ʥm.jZ[6}j^?6wr$bҝ@B[9<NOaBy:tGHM}:3F 8s3&? ooZAh$;] GCÃ_=R͟dPS9Ԍ6@<ی~:?=- w\^۳f]$'R+W)ݠʼnSleOl}j?YcXtG[>q  jMO`E8$\}_U=}u8517@ Biow4Ng)/y*ƿ^Y@7Ϋolr׆ܛb+ݿԨ]Bƕ\nU"Gir$b>njJh+ l[1y!2D1N~R!(\=^ACp g:8[ yX#g*^4;O£m2Xu2gRřџ3Hێ.^Q7r)4$[O>Eok$kDDZhuQ37o6{9zv?=f'iFWE"'tEx9'u_ZEz}euRX[PWU1g]ߤ3<0XxC'.oYN/ (\qÛnX@Ħ~W}!5N]?i•3wtfƀeѢVGL*sL$m7 y(KY`TpB&ƘQi~g11-7rWr$ h w*!) `? y'${l c٥Qqܝ*^lynYmAM^$#&yη( gVUQ7G=X oq$Hiy>WVM,T.\cbUp)6 _.? 16 {LXT:` d@|NqFK'r<)UDq+i޻ϏZftBlL8@;ghBkNFd.2 dw =uRokt,s&&,6Q [;dN+)$x^%Ul(-̔x:P`8zQf?/v@&|֦S8 uU5Gֻڳ k=6ԭlT\% n7圝 c(v&2I?Ê5h⏀9puc˵/ߛ|pRKƥ{hEUA`A7,YکyQ%r,fK}a%3f1nbTE3o#dgBH]n62>qମ&BeBL$mEU-bcQo? fkehĆu; hO1:&Aqp;k4qjՙxK)tX2Un!z*5}Iy$Ν9=1tUF˄#⎐obׁ]:YoU!V%YQ(!r}M+E*&Z=DEx:V4m: gC̽Fl~:VySkh~5"MMe 4rd=_S:-‹&D .m\ja, -3G#^&w &b;Ǡ knx W~ѷMqR1idE(]AI{:۵Jم;j0`aeي0j/#|aOVjBG mrFh(˜+*>?fPAZ4LΛAf2T2fʕqD]E5^y\zN1t9Q QADOG7oZi>f5(;L;͠ '3-'ȀQu *⻆:\60U3UoTDx0[JU/x}]+(퇹6ygswΘ4`>Oke(.Z_׺6О$/RXˍG>X"cY9Abz @a'^x낖9 `퓣V?*{8(\AFt/ڶ(z =)4M.S ',:Thm=g=SxF.YC/Խ.2r -[NB'\smq_}d)ĸYZ<ユg+Sd&es䖌ÿC+BkOpg87p^/w=JaSŰ'&]0Q%;r08pRSµG=ɞOי13{%N~~ Ro2!0yBܞq$ ͐K4 -g~? >>f$Xa_W6ӂ8%4!ht`Ôp-g~aCIUc]K$ )这&ĴHv yg[b-.$E #Z`1ef)P鑡jC$eN45KDYx;#zG{CH{ۢD.0e$Dg!HJ &4a RY vADRjS Ef Iۚ/~~K|Ʋ#Uq3 C [7ƏEIGzd lA$NHe>+F0חԊgގM?[;WSƒz`~Nd4Qdd=hD=՘j!ߖQՊ7?&RxK(5TMz{}ԍvg)c zOF;ieQN)M56]mǼPWi_e<8mjf\#Hv{[Rr'qKAaF?6}biy@9[i[b^5f$obpxNR/cЦ#/,a|otDU:dgjPV3R,輄Wh2>/vvІ.^V_P:Yߞk@.SZdùIjVRBedsT#zY&Z,t;XYХ"GtskGɚrs; tԖOD+*q/Y0<%: _5c{AO:TB#( dS leɮY]J]ղBa)2 Ybo A}-;ſ֦=9[cJu{`;L0fr[Iӣ2gnj6smd1}L.5Ou\$'Z7|͘k|(DwNw)S \8 [%C6TIe%WsU uW|fS~gԲO@.HaMIMtS݄7Jbu]+Mry(2ףRӀuy2mrbxŶt6+ 1x6HV: d$YgDBIjﻺE٥+At7!+i~=nO8PJ?~k֞&GUK"zh,^Mdb36NP\e<2Xq+(?Xy g_nRFEfeUwiҠ {!qs:T#fx8`Fk*m+2kfZLsW3.ՠjEH<۸d?\p9r7uaG-iLCaOqC2DE#t%+g!rfU} yy1}Ll FA){/ur| _Ȋ4 ͤFĸ+3&lzt 2ESDW,ciJǓ>"u $M{JٚxdZe'{gqч /ba?Ṵ̈̄G#6WĜ^R_[3Bla|(w B<."`5Ǫړw'PCWY ޒjolW*!_f!\wO:Ϳ (JȣUiJ֦lO#҇)u/¤fnhwrcJarZ]OI}0n_U ~C3`710WJٍ8vQִ^x6&HC۟DN8P]dɳ,1]M^%~.oH8@K&kܢr`ѱ!?@VcUHV1L{|gv Q~p`z?d^F78: l0+6PV`zǞFOвxKYY9Ɲ]Պ&<: 7%<`o^pU3!:zh Y/QƨHkRV1EolQda zV:p0n[@+'ӦBFs 3 lFg&15(B{T~t6@bD%K`a?gx*9*j>ki,g [^̠^$!F_WMc}_\Ѐ ;l y[\%8)M$NR7/AFLGFvh-R ʿbZf;zBraR=ك*=sr UJd7V`w}]X%1UKȐHSU3V1ʹ'[{2$v2FD{qk4[1C{ӌsm6.CW9 Ȯ5b)/GއɜQƛ~kBk UŲNqQBRۡz3JsWՂdixWkDcW`h=+gd-~yg Alj8R+@Dn#7tmz @rstM&c|ҁHb2H}-=6z41϶XIA.mk,? <1;AX%I5jy#uXFd[qȧ\_ƒ/E>-RHuMPZg'Ӑ 74P+PhRHՐKjyո1۸. XOTY5Vq69\bMdJg#|C-%() n5w v[ W_]Ϳ FMō hwgwvtL4A1NI: L8~BՏ-&:3sbs "/V}n"y-x Is<҆QQgxIŬ--*җ>l7 Y. uZeO(bn9y 2'K-wW[wi`#VvEP`KM&lonq6DKV?es2?9{7Tb|uW]IE2 zU+^Tl0_xB0v"hÉ1BK,dP *\C]PggMd3RD_PIMW 2n݅lXm*k9U_ ;?3|f=b;VPB=Mi 0JsIZjX'| D$sin,of9_ucsI6wMz3Ϗ2_4)̕03$ԱQβ'|e5MnCn/ʦwgKE/ZZ& cm+)T.Ňrh kMqeXSRwtW|+%-?LX5٤>L@%l[v.7ÑKǏ[#Ճ8/e%pGua6w©HB2W%MOL1u#zG/|ѾƢTp~`-@BJ 7v~RmZ*>p "+3\R6~8܍uaU>=?e7Luj'`s pRͲ*GAYm3.P]%\Ъ]¾LY_#d =m B4{r۲3۳Pﰞ:h1kt))tj='TWDHD6LUԯh̪j^6'Xͪ &ag7~Z<Q ~dk\/ LX1XA}{- |b tV}3XeWPC}UC d6A{Edm$fƹ@.!`C 0i=y)F@ KHi`U \^&25bcٟS" WHD:(+ `w Hvj>tlip0ALp 25"IM3wM2n?@rmFU`mlȆXZڤwSi,B~e pe@I#@pdZpk߹չAVT!{-bO)M~;qB 0j+}sqpOldǘ&K\]k^uٟJA va0e g3MS3?}MI`#!^ஈrO7e_>ٱAz1sS'gS]I&eS$a%B;`Tp)^P3^C^+a9Ǽ}a۩o+ ;ipJGm|)5zQY\LbeTOYBɍcPh@%9NyMђ8Ji,o)h떦l5^HaE/E |}Ldm ؆#@!4s)˲KWIk+58ĺUjH"|e SU)$4d[C_ޅuX|也=ǯ20J>I ?n~j\DvΪ,mVf(XqgkX„or PKAid|V]ʒ_Ϭv c҂[_dErXbvb/,\nLsH3L )ՇɚlUU"_vJAn /nm9+W6I@ ES&(PG!`J=v$ a$#G)ͮ#-fes?igҵ5'!oNTb{ʞY^F&vBG9~a1 MNު.e !I sԛ c`w-SEI\#tw-!빰 Bl%2h٣;? TbO0:+չn_QI@l%z!3wwNd^5ǝ^ ۦEb^a4Bp[} I58bC} f}"Zx,Xc~uFm>^Bbиd8m'̭L @o)~ ;7y!2^nمm@'AS"v|j..Á8qKSX,ʁ{5-=?df+$pHc"0}F~(3?\áv-oW/`l0rbhk*AB-գ=% oxNRzUFeM43n090P78 IپyDCDylJƛI~/!9nmaSiE 7|DŽcƛ`:IepYWu33!yC=aۚzmw7d?v -m D^-s[G@,xH͉*KKw7w\`D;][G&SUqiprzVЯ&m[x\ǟ]qgJ5[v*dFUyN}nuTL H*z*@`g'H/1MRHi]TK*UO}fy]Ptܱ;R:4f%Δ*(@tȏ鷙yA['a<]1 W+Zbj:\7U:Ձo {9;&?zM72)^!/";lܨ (H|=QJ$~ }A>$,8)6A;:ږ(yc{wXC=٢ԛ(ugZdp1 zImmѣ*ݼ$Tt?(׿{>Uo,.%D4D6~*,F%q=M|Zm~5]BC5}8TWA@B~ToGdy vS &JE u8~K$]ܨw9[r< :GNZ=8dˈ[:hTZ+:~K ^=Du@{" 3J5}4512VυMD#Uˋ|\X2 d5n8^Dܤn]4{IC!EmHe4v%u r`M_.HӝmU;F Ϙȁ'Rlki % Kz"硄~Is,a|c  -Z==Cj#~ã=hsW--׹j2pwrIEC/ao7C.%-|x7ˍNLvհE .zT[:qH3 z|gw81 ڣڲʁ[–d% ~l\m4T(sQ-ڗn\+!ӨnػfA,[q3E⤰;| KIyYE WiM[ My,kH}P?BRY; Js.>`CɠE$pĮ>|kW ]*R8T5WWw=5,̏Vް7YSÆ GHJzd+ND.m0 I1VP^X"ȱsjn/ TIdz MW-E-ruPb!:ž!8_oL؜{:ٵ]fB2\/LxP|oz/ّܰͲ_H`@BÆ`bETSC )@KI#B4ՃN q_i@Y5ڌުEu;pRYTyË鳶ȌE)mwvۢ~û{fudSа&okZm)fd_5m#|َy4-K^|^,$뜌76JK 4ݑ9بYpK P:'&Srno~#eTJ M_e:^CZ!ovx$ C\]rj]ܜ~n&f'/< V[S" WtG8&Gv:7h򩆑K{%!W&ປIW1i},3]e5U\+Wz{8) ꪕRIRF"b*w*;-!QD4B&ڹRRY$sw욵vxr9V6!feg̮}km")0We'ENQ^q,?6ɒ M h4F|-(kɕJ!C],SnsOwRjZx5leeJF򘂅t џ%#_ywvpkf+Ox5WWWWGHJVIoV,C t O _3]PtJyeOWj]m3ŕ'$rDRJfjA`)0Nδ!u?8gP8* `W.~߇V]y6OT<ԼBV#OM)*O H(u \`K#p*ΖG0viW64ɾd@_(((xn>&.- OWA$9b6"9q{!LǕC8Zr r#3& ~^C?rCa-տތxmWYߌ燥O=d,3B<z|2$d#i㧣%Os_MԡcOo|ʽGQ]!1e[m|$YdطAI\4z01>ƙI͈WjhEe 3 TrRlSeV;E~ 2r1@N3Ki[-UWp"s+hݬkmLmb-~|[~.)cF?\Ol^Aw$B:.o WD[3Yӳ#ivs/0rSuY?Wџpv8wOk'cr=~-VGƖg 'ZK~4Ǫ3` B@Ɩz0,Z=9oG;sA g {R}uTJo&dqdTM68=1!7=>j6|S:t_Bu NuH3u/f!XlY~>T0VWC_SB&=p3a:uUn{#TLyr?Sr渚:1}IOzgˀ j-4`ӗY ^` TДhF<FXU5{aX*<oEC",>ɺ1QvȽL#ԗh/3t"5bFGSֆ^tbŤ7dٴ<Y!N=%6C=6:((k MSK.< E;ciUÈ2fGm¶_AktJe?d* eM.?sW}^[ }i'p#e̝ jI<c7hX4uCxxǻ_f;Fn?O`U{"iQVxg&;ӣE*\{8?:36M<"삘,ABb_Z V ݍ?ɬ:槮w)8ԞND34s jW{7M*>4k Osᩙ?8!}C~aZ^7r ꧍S=L{++媟Qqh@W_ρ${DڙY+JJZ2q(r.6U4XhC U|] #WwZgeݒUŚV7LE_d4+4aQ԰x _(Ȫ Rt^j2ދF~l:sBzԌ $¡&p~6DQhe}V#8*[3x;d2][-iZCLus+"˟|a'`:vo= HYs;'5.WޠFz)BېGztU$9j#Mdn%}w]閷Cf(>bji c]b]]OݠfL7IFr#vk]M4$%%{[w9`wʡXÿMH7zzo Zڞ0Ea()su+R _brfb/[GL\<2y1Rwك{X Z )Da=GZ][A=  ~AXb~;)_#p`ɀ3.eMFK\:W>.83Q*E8a} <Ny F] 01q'ƝCxjLOު=qPʽg9<{&f2cΧ!תh+][~@r{"`}'v -UKj Z9wEHCEr[)06qydb=5px~a;A>.^1S/|V᪼|Qd"GsޠqЦGH稖i²ؚ:Q#nm$v C7cލD#>i۲v`%4+e4Rr8ʹC/l[`iS?ҼPt.g

U9B@_ = x6\֌.aADjEEqQހ[-P魵u#gL"1L ?] 'v b0xCH,m?0{1&Y;/R4m5<6#7A`| -@X?fWt3Bd1 Mʚ#z_"xl8x':GPtINbB)foهhGslh4_J FWg`ݏGk+ [xxOš^TI dw[]g͕z3̷]}u gl5dE{{Z9dpznI9aHI ¿cꪗeE5pK {_*) k1D?;!oyBu| eUP5gX't~r9'oYRe_Y.򁚦ivJI>RHr@ힻ]@pXY|M}_]`5ۧm;mZ3=W*>q]KP`u?Y i㨪 R# ]<\a4mCb(Ah0c7Q6W$Japi=א2=D:ڒs5!:q,W6*GV}R>q׀Av{0OKĺ1;W:WΗDI9rY']WP[PQ&E|/!FRǨwE#pVT"ac1\w4y}Oҫ'"ȇ)*@Jm>yj8IG|.D պr*9;e3RT!sК.l3?# #Q3/e;ƺ*$5a{Wsi3p& 7F_Hwr tCd~9۟dLS'esi"鎴KPg)<XC[ztɰ"` V,`BUT7 ]VCYS r.S5ẋ~ c~ fz 3lN ڕ2V+y+tAQmލF`$(>YxTD 0P*׃谾1'p+.jPdlW[0ÈNm.VL:Ԕ9IrjdCZ<%-Z4$BH*UE FaC/%iՆH=: w$ A}YZN ,В) h+Kk5 mݎPώ8[?2:5XQSuM撤JyXڧf&ncLt>˙WPZTxshx5PO3B{*s̔Ǔ@PX G𱝑#E6 彮-Y%>=E;G}b3=h~]AnQK_DA,tG(JۧpW]®8X2 c -/EMYvUw;?Q6׋Z4 -h=zj&LQx -etAǜ ~itwi@z1yҖ0r%f?W6L}ܿZx17þ)fa' ,^q:o9 AOE4]n/VZfvzUޭ2}RS9c Zr y8NwNiFgLE_l *u,w`O}g}/kyj.G(M{qO`tn5,7}H.U'mIJq!7TcJP!-T?NoVv =IH^w47hts~?ML Qp5 Wߔom˪T@#oJTTO-Bnki02_'IYħѻ/)0H,.ws0:&>[CGBa6x c MT9ulexYqz .G^neϔHXCƭx)D^g ui>3ǫhbom}(i.W5^}$h@=J\^JkUEZfn ̀\6@n%b:9, IJ"ۀn6<8_Is8g[ 4HK ~uDcN-ޟ;Fʴ-B'纬jjދ\V乇}ev8=n8W=OW_׸%dM':U99v\3@R/?ևw:Dr 9M]$%ƛӀ=0^,XǁDw]PzJݜۥ-;^ӬntnRd%.>1/`E D':da0DFm!'yϻyo π!\gr%Jibm5ʹ]ú4;og9^Mq^"DV`;VSw$Ȁ)]y\w~m&Y7u|{\)Y(e`\]?{XY<7x1AmqtZ[QǞc!@}Z܄O׉7zҫ,eOKԬc֓OηK`\lW&dK90SD1t-^e]$oCQ u'¨c} m P4coA1k3z4п8ڿ~,\N[%3qY(fޟLy{ccOyQƿŒzl儠j\hfړ_QhVbtN Ӎ!wOh!hB2IܑjO`J4[+.أLݍbĽ/{n3tNQ6[zq}I:+vPςka׽.u=SCQ͊q_ܫq+EĜ{\{3d5 e;2VݷV%@j뚅CXK84|_8F"sܳJw3y^]Zq$H({r6We^N_7kvZ3w~I+ն\)ݮZldc|$<+r]j:rdnmwosiMG{p闵!h}ͮJ ;y` r؃qa_b,=>^EyXoq֛w, )eX}pNoo_E0MldxVb5]n9s²YK8i?Tz5ܾNǟi_pdM]ཝD]ғP@b'>Ɏ;z̈́[Tą+wR$,-1SPG&jy +U{qF$fXFWc lT|HwIѥm+ZMœ /CEre>_;f#I8Enm{"+q=:Vf5;E$5Y-qAieov57T6WO#p諾ꍕ**o:`2:y#ǡ~{ Z<֔пs r)$:MN/Ͽ m꺸OY9S~8*\K4㍛+gj"qboy3e/ GDrD>brJa|\g|U+iZXJy܀XLl^޿I$ 䦩,)vW7p:@RPuS&y}̲h%r7;bo zͺ Sl.Mܭ mwxފ@s??Z|@<?yh6:~h k z|*3ώG-m]ObA+ kB:ɑwrE14^ο2(bK58qQ>TIމcxTSSJ%mK4ͿaSmSΖqx,<2+4,i ?&Vz~.ڃz3-M2!-^o+|E>fcdyN C6!QlI x_T@r\{9r By8?2c-NL6Plv40"ЋݠY<_f^FͲf|%tVHit$OOu FK|lPGO+b \Pt$^٭TACRJ})35f54&c 9 ` #&a#.ֶU"%@TN5 ]XߓIW?vѾ nI[A,-8oot eG\EV ]r e=9Kחj-_K.JPB8cK?u:wGF>mt~[^FLGdV.K[̦V Ĕ9pXY)H%EdTl櫛]yV{37 "Rsnkdyz}_З0Ag'UX`ᾕ@E "ҟh-D8GM^;&3AA4jH?C=i.Oi@FIM#Gkoh4~+</l1az4WwzzF/Iހk 37%۳jҺU.jf4d x5$/6&yZ%x1<ެu3< WD/ʺ Ɍe1uqtœ4יpoo3aC#9,3vdKYrATb|. 1w F>54%>|YY'›Oѓ ⣚HS!vtU'Bw`P2/"@dSgr?P3^ݿw3.WLWw^ii˃|&-TZ:WTfi2d[1trATΙWr0 [>-Gb`\{wء- -T`*0WϞt\Dh=#5@T(3NG5URI98P ԩ[b;@y 1JiKW m.pMsxXϿûGFʙҊv1K^.]2ֹ% a\/)1(mF.~fOZbް_wk9-/2HLa^ՂLhNڣuA&i+KsQcnI~bhӅϿϐg)$\i3 ɓD^wPHѐMJ"YǭnyJ6jL85Y"u>3QpH5 sY#e ?1ɿ4Q܆]CE\ܹMlB!AF㑍\p]C*8Ϭ K\${_C ^«^ 7g-,\Rϴ] /U_4ΈL̳:DګaYNqs`^;`C8拨j:S>d 6daGvaX`VXy -#E4_@+T͈^mFtnh0,[8Kot)ᲑZ'6 YsbI)ԖV`?^-;^'Ӫs!8S)jFMX9&|`.gS$_fuT3ûK.HbOBF|u9Ǥ&A~iiN*%ŴD4tಂ 9v?0N/NS6f"saz'C 4=GpkYc,rqsL8ERosޚBZVw^Z^l̓TƕXD_y^W98g]<(lcWF֥GQLRDd:UVCBPz-0yQi`Zk|%:c %-PK F''2nWiDG}[\TH_sN (G;lDճ"ˈi4F9 R /1+x-fbpB0߮W_3No ĨL ÆrI&%H UB%5+hxV^#xC .ȿCUd.m=h<VHhY$E:!`?D\NJh4CJup[ yrf")^tH(!:w⍪ dl^b`Ʒ^2%4נtO4:jU֝ДOf:4k&S SYg6O!W- UZy̕\ qX pBsDxwyyuƢ^yME([ m7Vzk)5P~%z[M/h t8^XR8w>!\\)AJɼjW,nkO,R1f]>x43$J̆֡f{K҉׺#E4EwA:ptXs(,ĒUtA'f; <}}wVsS8Bb1ejƒJ'G | $6@410`|o!4W cy"MQ}kP׵Sl,Yp4xqdz s ￴HnD5b=u8zA|=_q1m_fp&%0\:3s\\NzH(4Mme(>z #uDN؄#,͚AU\@1*ᓋ(]; rYjZ֓ \k_͔7Px ǿU{ړE)B|y.=.D?@m{Y ASrNAy%N8#y$l?hxP*HfO]թIxR zAy)=Łc`OԁR{dDؤŐຨt_$p̣mO`Kx׊[[=":r_Mb|,8' pC}(=Ɗ`C6l@%ʹB^ظ4^_i( :STY(NX)2n:.zicO/ 17lefJ#Mx3lt h W O}FĔ) E>F|AM;1kZy,Cc5%aw#ˌ1$xFXrO:6I+,lWߓebB@,3'm"1\?|>퀒Ӏ`aO';6KA\,)#i #.ШҧF&"9J;P?QbJ<[NY 8x*@:.h⟧(`XVuȹK4P@NT֞G U<Nt=r:0D 2UPB*" :Dѿ3;erٯ 8a0Y<$9ws.͗X~\jX˰Qm޼0cw~6")+JXE-EXb?RX= 9f>KsxOĚ&tkyG̽R,nlĢ GQ I^kKȩrw&"A݅8L|Gv(>U d;R:Rt\9 ՎޯtvD;:E mdx3 6KT(G|dIڒ9^-\|A ǪOf//[ׂZH!.P]jh (}f_M`uJFR,@͏X'J#{Z·=(4~T;Eg%I?HBv*m {e&?g80/a\.\quN L1<\{/褶xf@i 7:5..LF^ 4c.DcOcEfBC$ Y.vźI?; = Bv}+?(s%U͗oAgm6xd_ zq^~C=Ν"߈7;/]Қ53_y\UG#71tF$ʣ'{ٜz^@;S .=hHHZx SQV!.?@ш/S?NkjcC2 K3/@ AA88tġ̆H0v ַi.Ǜ5XiR}}@%h{+Sawv'" RϣZLꉍFcP<…LUAXj)m w4U?tOfb/6M׌_V;~>`(Z-Uy 4 7̋5 \SwFƳSV17.&JFxpZ|J PM)1'ŏ4$@g/#2ȅMaU<27oWHҷ&Ux 0)/%'o W[nz-7=s`jGVzSV^~B6Ȓw« X/|: gNT^qKGyS0S52noyߏ<@x!=Alz[xtHɚA-m5%^R&:( g'yC0|5;@a!Xq4ec,+pjHW )9)kU0`P1`S=̒% bny.>on˔w[P c3[[Bo⦚S%iNLUa`X#TXG>upHE$O-6GSxOW+#C^xS?bcc:_雿= м?kh׼ly$Sv__w>z3[gIKTN 5s=.?Y4gwjw?QJ^ͦj"͢9/g? ]k ;w2u/'^~Am5] mg.!ZABhRg:<:̦ dO1syiQ]Ws5 :VVٔ렕h,U^ R%`~%qGBhpd>j۵׏1+qul~n/ dT}gFgDDLIr34}FtD˔`*rf >OʖUqzRyklz>_u I&F-Dyd_mqW"N&kd7S7R NZMjFnŃU"Yc`׊<A}b'T) }W0\$-{{rq*bfPlJ2@Ң$J:JN cs);$}8է?x ~"R"z!= NQ6<9K^ /Zt6Z08ĉRdXj]FgTMC/Hf]I8Z0{8JcjH|isMJEU%$ꕅ&=wUUC\n,8e0r@[$&ߪ{k$.-}$xr, |ad2d(g2p6&4^#D?206 SA٭Eli:E/<:O:}kfVM,97yYg}^'}ѾJp#gwYѭmjO lr2 }+CEZ/R/졥;e ́?![HձsGT NrgO283F"F(nDC$ASzǶ\GsY!NUꊎ^km:TyZܜҒ|}{YF= ]WE@D_DT,VtOY6&.-5~ /Z(=`tk\96hL1;mA#pcG)wURތ!;RǶh9@zT4Ƴ<0PlZ!zT$/ʔ тKj.Xn~oS C棭Y]Zn5hEU2 1dJŽH3aa>.=Y&sЌR @&47?qvrp05 G\n鍬fo?ݭBw1H ͘C%׎V]C7߯]&e)toZPOX MiH#Ȁ[+e^<ErC"ym) _WBf o932 w`WO=UJ=|-AGn`!R]@?U+ H5.Yp=cF !ݞMܚr.k#W[pN &lţSh~>ŭ_>ܒ&uiTeNh6j#+1k>71/mNS<0S1(Z&heЩ"K֙Rtqw (f55PQ',Nặ(N'uWͿ0Yg|b`,4o~oX@CYW矊L]s,EK}LUsޣ58ʣ a2zquJ׬JU~V.ޢ6ԧP}TOD|?p(Gs3Μ m5m6<:MɊ֮QXnQ-1UgQП_}0/엗2)Ɔ?ЛyC}*=7ͨFnK=; RmGsFI;ʧ;{PFN V|JrDpImJ7 ASQ VCN%%b\LZ"XpRB@ ]+DeCm0Թr#gP\.__&(KAl:y ftJIq ۼbf^1 ;ɟ񚾔.c\AXhVLj7U $łRvׯ.V8Zši^9:`s*u",CJg2B̜(g bW$w\ ~QI~.kQMDT-c۔eIzY%q7@3umHe113+ mnbFPA: )#d%q6fHŏ?yF,w,wLdJ)m&leʋo"+bPP 8_,qC\'߬z VhesF S2JNY~s"@`egzW \ &b ϓ/cզ n GMያr?I9'~$۬lРm*իDSSKʳ}Jv!֐'*a60200YȀѺCB*Dܛ@8*_}DZpґ7`t#Uv  ɺ'211*iޝ.nʑs}*2'{לHMVŽq DЖB)4B,BCQ3shJ҄zKE#H=FN t;k[ fT.-%mbikQfA?x,#hT?I}|$TcC-lB>g;2.H5p7qpL~bwFmщR9Rҫ5w԰,B-]>^~w4O;xh?AdLX;>~!L5-LNm)b:xxDT%sNǵYtϘ,q|yct\mӍJC6*o@SXՑrY '7߹/x֑/SJcX\LF]+ =g()G_@Kbu$>sVp]%dbbr] rw=|0>R'֣;![0v ٹQKϣz5+hzck|Ѯ푦"NbnH1Gu-LϣLH9H2Az23wr캯̼k B +c: >)_CJV F{y.N~y%3 DWk?1do&U|Y~ AsS:S:mQs\$_?1^(o|> )2 At+3TbIf\d yD55kV# 8@maew9'.)]Cbje&Q>Nc{pPR %T88O`䢏y&r.ٞ~棰bH k|~J6/H.:ͼ<^n4؄x'ۥ[׎TP#cSXiPB<x=\5<UI;P4RL|X8kZntVB>;/XI&Aa('} fZި!Y;/=c<Q/JyPGCȋJ.DC Xɕ7+/iYqދ(71[%Cc UD9!pk#[:=0 _"ШHi `mWDVBgiW{3-~C CM4d$Bd6q"̳Af~x?5JÍpR)tJd9 4wYĽ4ɍ=Vj"&+uCU ]Kʟjzoi.A{1&^L2/}δIk&&hm6 xd[fK(ӼB͋䇌.FI,J jQGB+󡀶C'ZZXBhn>w6bl G:>t~Quj3re8|aqzcQbx+F^)@0 IPdl<9R5HcYThS7@7#C ~ewա^|?H;P'KES*3&tT5ݚO6SQ֤Y4UkK " M1bx8s/r>}S%_ %o6͇LڜB¸9EiPBatt`lCH)%\K\mf_~0" n&jסt ,9W~Xg0L)dE BXt+/">̞ .l:2}=Rr?s7AV70cp_ ejC?k R?-2sEDυgpcfJUUU"׈Kx'>ܱ6iڞ pp#͙ǜ%vE$͙VCa2i.,-%.> 3Csqw0M8RrܧÜ2gyDrw)' wJx,VpY/Q ]$5k 9*_Ws'vI7 B?N)@`0j?yX(㒥nB9:l)mY 6pH M%qrA V0^vj3 O ]dnG+%s hEY%@OC]IZԏL n/v Sro F7*2zbVT"Ke |w1lw|ʫloK*hDӆa(ט 6afU{/-"GT0dz,\~Et9_ci_ښaS7ӣ9%gP>Z7&.Z(NeH[`]^+SQ~_Sl ?](Z<H3/Z=DHaa">XpXjsÐ1& T d&PqAKenYů8i~Z/t=lI! 9c`=8A##2759G\x+.ðL#F=jZ%Xh08gRV~?@ѸK2[j(Ơr 8ڲ}|v * AW20*eA!GbF n˺!)eU̪rM[6l1 lW U#xAZSHuxbT?(jl .5[uH7c!7W.&Z TiYI7~BѲ8i^p؅pϽm5cAL\ ~Ҷ 5h|6b>"*ZgWG0v#G&N>#*lh gq ɀ_$bYr% cAuH80Ə^)?6oWӒ_6V0t3v%ĺMCX}q8 t3:OB*+!YR`J+PoFg[%jY)G^AC$qa''G`k!m(hP~8ΨjL#"})D-@ Ϡd<k'5S`%>1 *1d`1Ć\6'd\Xƞ?&d[Vt,`'a]KT+B1Pj¡T?tG`0DY8X?yABK(Oпh#D*gnL 9qHhҵ>tFp*=Xb@uD56'|HI+OSF){lT͏2ns~ϕ"H8Ơ~̀N-c2B$ُ6>fǛЕ,0:@i<̜` 6z@I:3b0f# Q/( V.<<¼>(FK\ >=#mm@&V@( S^#h{1"If3/,$J"1<3^}9= rX·9eƚpGHad_ZD `d?mJJ4@EOu1REfd!O,lDBdXjA% QZqjS(i;nBh.&s0GDyJ\5{Q& dc9`@=Aᙲ`xAb?@L4b%@|UFG0 q5q)ٓYXDETJ0l%a0cXZay& BrVe#+Q'`FQ$b&*ģa³32ʑ"GRS? 3$0ncHfD>|PD[Tu4XYG U-pYU +~X&A˂ x_0%s-8zaH*TM[㉤DG UgV"SB&1I苍^g.<訖@FzńX罙Bk0762P2Sj?2:Ti&} ;$s%jxa*iw PX\ ɒ@5:#g|$RhPd( +CȦDlj`%:d&TP4>%DwLå "D*rER^1YxL 8IΝΥI3s+Bϋ6d$v-QE}& -Ekd%h*n1@1jt)Áet0 Mg#oas$ec ;0}[,HPm +d9T5<_e uZk 9pEH=T\ZAxV}t",*k" \ڃ+^ v}wò}fgewlJ6l?5VBFɍo M\(vlKB]Vj$JhK,Q,ϧt9+`3L!1zVX!8Z)`&I=n E 褴e=kK鵧2qx c$Wd,Gt$I|Eٿc7s!w͌&6ya[4N TS3ޭj'=f-ڶӦ2l(~#g;|bΒު;2rWZH+Kl@Oh|Z(_r>1oXt=n,.B>N(ݛf$6pܓ>r"f(=,ǽЈ,R5JWEpJVUc/IW" jnd-M'8v=syD^I^,WqL&_X.d >ܛvvs#+8^ "FMJwndLSͷл>u{_'5mXçy~0&v:<9՘pqgܭNO$r/& d3a K*qZ muk6a&\͢xrȻOt{дͫWq!/h WTJ+,$! NփXOÃXm~L槺8Kg #Yp]774ӢtHP=V7^G27;սַ|4ayզ%XMS'?tV]+n# vm{ Y sx4$3z*K=P}3L䍿 `v=ܯXrxze;*aBKzSm5Ipf< _Z]LGDL[f*䫿,3"I2Sv/v떀' ;&}^GjR~]N ynw}`] F`3O⍾(J~$wha3جg+OQ8CZ#lrZc֚ ٬WTC oF#UwQd4zNG0cg SDc2W@HNUx4h!":=T"ҭtCck(@4*[;^wKW`¨(Y lV/`>4HJ~DJETT/<'[=uț@vV C@k^sET1,ghXđS^jQ}Go8έم>j r)xIx >8==mAϜw `սՕ;crm}\7oAWx(&+73 OQ&(l|39yV}ޫ`W!c'bV lõC*F;klQ$_۷<Kлȳ/}SuѸldJt*S=lMou'hs0̨)YEql]N|CP|f<#o|m'bM=SL9* @^poa@80DE3>1l1(^`jm]Pw$A z(1}h2*X{Ϊ-i] a#!$WآWe3/q:(o>_5=]0B&v,8 j|ݿυfJQɓghg/@W28J1*NV~L,>vJΑ)8e!hV$仭YSz>s%cn$G66~pԃ^+V#A;YžG )+/#ZzˆGA?a k= x{]Eӹ^ZB7lUZY[\2}L<W͇!gpv%Fq5[IX5üGm%oZ #P?sQ_ uoh  .S}.^Ih-]f?Oݥۊ5їJgB8V) ZTͨi~PqgWuҳU2v5qn_-jna 詵삗uU2,\ݸ[E~0!5=gJXF~ fma]/2,~g*P1I=XM6x4f*T! 6J=hceQj9~)0IGy?4951~ح9^7P$;qGd0xѬ LR*Xe_ OΡOhjeF2YNx:aP` \.x[1Bـm\^9Sn1Qjjb+MHhb1Ŕ_b&`#f"(q aæ/Xדq*;$~Go&M 2þ"%b56{Pea'8\/,WE!1 nA_Q12veڐYSYDXPo"30ܪ\MnxrwEO40> +q8X"̽4,mkx{'$0*f̨k |ծoSt@ 6vG'.vi' +@EpQmxLrWذ\9!)7KᤠM" w"(/dn?IYӯnT ăĩQH^\ ^ˢ|wiQRZUښa }r:Ode]@+\'8+z/_/[ocQ)'ri" ߃F˞ʲF {_DCY{Kp+j X)+Fߍ0,s ƛ5}tL t $/C"r%j[ZՖHj_fPAu,؀Ė@ְNkfC'R5@Fj f3xWRgz%~TirRZ:㱊p z'EqD6ͬ+2dK ݣ)%6z~M n[oOl?ɦ7Iz/w9d A>&+a_?^MJVuw!GcfM=#cB[(=8" OfU獒m'Oa.qU^nlUTHB3ssVPZz#hPwxBnO]&dTm$)[Vн?}dpG@`gi4?.me:X?lQLz ɤyAs8*;h_+:m#rMo}mӳ.q/+Pg"|VhMAicCllGRȢT`2@: JΟcp{FCBKWi[%Y휚*8tuMۗv56&lv JVTK0Nt,-_1?RoVKAƒYdʕ6!vܩB;$=Qe[ \OcHȝ1͔Ș4[Vˆ>gm^VK,fM]d O~q`:/6S@Z\y;ޛFUF\dZdXɓ\O=b&E274o ^ mRZ;88ItD+L3ɯ-^=EP_kcЉƟ舙1iFmϱ@p7%#{d|=W:xNwpw8&Z(iBΰ JM ^Tb:A4Jm`ĩ_$ƙV@a -pLd,$3 }a$ݺAru$)!bS=g. @\s0!SHc)n(>r>Q5gvO$UwT/bӗcN6 FoF%|ԙz{L$9Q2=V}cӾi3AƲI/,_HS`c=jHa큩Iю:4SdfxaE2ЃE[fˏTS?NZ!}hU2yP"CE4oXev\c"oTTzy' ;/e>yiԑK1.iqgADe`):ND́)s쒰rO2ԍԒ,v6lߨ>c~JЋDMY)耩_d##$zL7;&}4/I#{VS1f3L>m#(x/Y~n-֞m.<X߯f}bWJ Χ`Su*~W@KwM 5|2n Q$yLY:9pK *Mu] qjUwaS9F(JUż7lŞ1_x͜_U픹}Ꝩz꘴ Lq~/5/'rCǁ׆c%MgADqcH8LUuB~|PhF6YLE *v#-vK(O[z|pa{Rֻ|"~'hߊ(K=%"%12zdt71]k)M/ǥx9*t7 KvAY~.t: 0/,[MӉ;(:!8#b*H6I 9]b oyVGc cB_&M}' ؿ-#y; rgM#HaY\Ťz5Хe4Ѓї̧|*Ωem[} 'i_+&yM违HjG$ !\=Z:"2 e?ل{WESwfW'"-xQX+{ؿ4Jxש>ȧ9@T sJ6+ &A61S3_n M cַUtM) VZ֏1 g cOe*ښִ}|o=mɖK]vku[AUfc\8wM=BX>sq󗺳q֮@q?wi&P%JI"5a^ Mj*y𜻮 |cBWiH3-Ӗ?L % &Ekd<-T wN*3 zvX[ ˖H:?UʆFHda;ZE!칶8U}s3_))UeP֨1ѧTLi>}I%P-3ۑ9MabZ|q{mi$6:݁^XJ+ jwKMI*iŚGcTZufs4vw~cK_L-"XU7 yC谇LD0"ÜmTH؈7 /:}Nu, bcDzc%Y,#flϡ8j0Ap.'4*D8}l~;cZ䠄-e^Ug!@4duoV9l#iz 9^o7iˠʤ}]"jm~)- kK'kzzYxV3,z֦d0 1OC{`K>:=6?/cN#OΈ}hIx̤ `[ ifuO?ݯD>+= ؉XEYaRu*#,KN4ZcѭfrNuP{`S3Ɨn%u޶ H(^ֱ9ۦ_+?BmnP(#|(Wk|OպNM,s렕ևz[ "4 CE.R/.ǒUAq;'#tNFe!*l_b$/ŷa)+뒍WG{"<|79G:E@R`fC-S?XTnw`D~+yQsHx`OaǍ.jEƂ8uVPbBxC~Etoof>ɦ^XҪr\Uڏ&TF{ o\{jרPmAg n402 m`>ĩԺ v G d*sA}02^w+JQ|(S $X٩GR^u'| -}-Z3-*)Լ1Ipb Pd8 &>~5ff6v1EK!^@sA%OOw}[5k_,BWe/cܾv-o^L;O[!$Yp1zvM@RƑBbd罢J!vbձE׀̠ SLާdu"vT:RBJ!!n/p=4Fs͎vxvv;ܮ+PyWĘ96w5U*"7ed=KՀLZҡ K wŵ,do'UҠL0NyvrKrZa<\^Y?P;i=X nOGo#Ԯ|>r2lBtD%@XqջPsi{a5Y,>E7~dYPjrBiYߐ}|TW3LEJy*'Gu|-C'̸ԩN[*UZ6{*DukXiTG՞<2G*OW:SCE958Is6S'1;_~j1BM `bZh&ҵf'P%)-NpN`AU>O'O{8- s*zP$D;?8+55e["nuN<_9LPx~\ ŀhЊr8gHZ~?Q|e~|+:쓢h#w|o8Zɧ>MHKy.%? I4G]۸?|AF/Ҽ2jQ~瞶\[ uUv0:QӞ떀D {e{ dB/%O2?7p ;\16k}/V ܀#`8W }#i;{'[^ yq`hyk@ \"rYY= l%W#JZK֡f?5J|#E&2c cZ`S޲,yo "{ I~Z(:9SyJ|7;(3zE7D7*vrT$Wh(0)|{8 LcJΞ{ka8ӰCpG!Lp0ԟ7Dm5ҜE#;t$8:͕%vUr!=RV@帝]T̼*j}2PTNW0@)x2@YXU\_Zh!NO}j|ҩxT|KQGwGc*)=wm9jIEL6aֹEv8@ȫd˘^y !2,6N~To虑d;֤:+S+@399WI+EY" bp&p/tWb #ϔP"CLؿVd<<+5܈f(-L2H9='VYE̻A}eOmU)maYm:9%g-]k%\kdH[T4?.XW^^@3̓:V}fmT>0 :ާ!a. :;|\pK$k9 .StkZtRjr̜?gf٬GwcogI| DDzw~t\OYjGSTbŷbg-O})޺ƃ`_>ߤܰX'RN-"Y.FiO%=O=9ꏚf,n29. -A :#.V2yeyٚBMȧL(C#HJQv@D6h:yMY$qb$7R'a$O_doX/0[ T7 R$'v4&ZG`E1}H\Wqow?=5Sp6>ٰ*MA?m:N1oe#OO8xyeMT䢨ܚ) FG淫@B OkGxC Tx4%1 UsUc' 2$3!ڲh9Rkױ18K2QG"q  .vVb\*_#**ۑ˘rFkH=v)_sJ0KqA[:EJAiLOS# 77a?QT!8׼2ѹPA76N'j/KěPc`noFeqy qV(Ih)O|nTɋِOf~$\{EaKq̀r,+'%8aO|02mtt)Ӡ})CHK,>T[<ș p[) Ѣǒՠ f sN\.FTz&KS >c\dLFЇECZYm-wIFRfʫcZاQ4JhrS8J7此Lg(e%#Y\R٩vԣ:iÁ#[.+xX+ܰ ϖU`* 35Ig,kY2p$Jβ9/k)^||-.$0E"0D]a >7dq#+gj"J؎5OPtL ԝF2AQdYqhy$#oQ!ٜCߕ "p[70hϴRś+O V0`*KF  YMKK9"CϬx,t_V㖽7޸4K&d݈cH+ mH(qDgyoe]o1I`m6. ;՛~oFN7WBdIzg.ÆѼ(& 9R7w ֽFh>ňJ$!MkH'6M-lpס 6bAe~0w*Sk 7}'{2jnw7-NcN=M>u?EE rSۓj8wL\XئZ ]dWCX&T(X3`% Sؤbp_%Ie-~ q?X97. ʆtGe f]9# iub0iU~GC3: m(YG8IOylY|N{9&}lnhKe,h\ru4Co Y9?4j#%,kg0*RK`C'nd Cl\F]pNX3$pv2IOAVwx@|So5N FVJG:"7PI'=UOiQ5]n2l!yG *`i+A?Pg<68t1gw Ki_0F@U>&f}?2Jb7!<xE+&N:HNDXF &w &d0Wtu~RQCJwu\dl1&]\bՆYP&{f^ d~@VVw]Q+p`X7x}004Xzh-4ތɼ򱘵wx^p`_zmbx,zidjps6 (߈hT>OvXO[_D%)|'9o)._ʌU`9go ScKBӭ~?TG_w~O:8u<߇ø1[z8Az +-8_@EkA)+ ΁JysG PRXDCIu[$06?cX3GC faHTmӦ:?3U_6 -װBRUYg8[?PnP h:$>#}m ѩd/OşTuH@_(I2 %1!:=>l<Z5璩̐ _ 'mA87-o XdbUK VHh~w0ofGEO]`<oYO]{$ S9օMeدHw4 3pRyf[cj,ho6⦭a$ 9 & ѭaC003ÃuNH'?*}yT>H߼Vky i"2j~5td1>Y~rA / W`Ai*=p7Q@gM+L.Ӵںuq!a;tvݿ5Y03P$Um587/9Ȇ_:xS G.At,xpS nS^`)F!rK̾tvPWq@hi>')2MiC΃w C4if|<ùU!uc6Aa&1=٥Q+c\:}EHoҔIYLU⬴#|:&86 CP6bMcRwc9Լ~+bUKW$GPH C8k"i@5}F\ʽwS35">'\\X1iPv4vl{29=m{W :aLD۫ i =fl>52ꛝW2m\jWkdZD&G6˸XIrn%PMqjc e?%'dų}Ǯ>|kgVF2iy=`6:C`+)QZJ lic4N}w{ Vxڻ5U%ouZ͞MMX<%Tz hk\}a6a1Ү2!F%1!3ml,O0> o -dÕ[yB[lyzsΥ i% n0Wδ9Liζ?@:7Q->cDnz't⬪'g-'-5֍/="qN_Dyf\цwXAQ5U%g~TPݰa ]]6XkioMiؠ0_Ba.HҦ?!jb nxTlm̢R:&}l'>f?u${ 妀^v1 -zV>>LHXݠU1,2|ҹd 2i`E{Q3y|ƃ_ͼ9̭+sbN%416z" ycΏQgBܝ@GS@⩰鿰_KjII+a T(%e1v =QYq{EӸIA͖U7SոcbB耟 vp1z>*]|F٬QW4_EBB- ݧ~INݚ1bjSiRyܞ[„!5:.jV{d^[]>T_ǎ~!)m--:|$H+$Nĕ8j_ktzM2[sa-2gN]8o&!߭0]"hSٍ% MʬXxT ;η),?Kτhp==27+S5Ͳkܬ}?aXi_#k;LE^Xhuf*j),zT1ĄTxH&wq]"0 ޙWrv}UOgcCr|NǸӴg2E}ټeIQu/vNytI ~];CrGNlsI{{LevlI, K !m}/?$*BƗ ;Ѣ,-B-}m`ӎuu j ].b !)}Mhлq]UP;>=P7E$|_cJ{ܖ)4vjdb-ņ"d_UH>e$W(_}(m\$XHx04U-9Ysu,iYm ]PH9sZ >=dLV᯹(<縫%!ڃ*YS$?J{1`PO]z|b{6 "7!߳DO'R=?$|lA(K)\AHDU4 &i f$o^;}fS}joGݧ+ 6 WOJuDv`:R_6R-MXkr tn5tV)P.ou IgGopKe(8)f.1o2xQ0mIi…YJQ_w2]@6z껐q!vTo(nnUtI X~PWwf{rA D"{vb8W KQH p1bHGa 8Q []-hq5T=$T:[g-,H%lW~sZɁgZuc7lZOjL(4ų$Dxə)< <"5m*÷X8 b} ;mɷy^dA+[v^=M M0{yy( `RZni1w+aCԏlO` v[ZBD11=įs8 ڵo*7F{Wtic= [`"y]ckۀ3$TLFac$Ξ!ڏդbL5W^L( 0v,v Kwˀ*oyG"Jbe>o݉.(-Мe MIaaT۱/!F9O٩6)cEGn^u[ògY:u\U,jo4܃ EFk2/qΑ`Qs(G/gX19'Pk6ױx286탥zp6L`Ѓw j kV /*a?t _2V:bm_mNSӫG/]JRa(#4 >ru bFcF)NLJ s~lP9(z>`;OGݧ89<*pOjKّR*\*P0Z@yzdN.lg^ɘ>2XU#Pr nA- j&ӛఛùv7)i3hl.\0{#=oݾY {9(Bc9A 6oDJ+<:|sタ?qc0뻂!+V߮jy: 1BᘍeK}v >Kۺ7Y9 &N6W2 Q~;u;Dv;,6}0 C/M 2?/ufI"m931aJ(n{Mϭ14=a~aVB <=ӚN ˀN&](6>̭Dڹ 6+:7ӖP锓krӹc;!O.O0|n)p( Qq6|S1*2 ϽW,܂!86|Yߜ%P8((V}(I[@`JٚYM<~![O#ֵL[*to<jEHo*џIxyƽ}M=n,3e=;PQN} ʡhߞ,TUҧ̭J0w~ Uf̯,%,6GK+ ܎Y10>RFqvI;mY# $(mT1iufW6c-L4=)[rϕa ml_Na*Y]㕆'rĥp]ࢳM#5Ӣb*c;+[=q0ouDQփ`ZsDƵu)а3x`WJP0gL>6#kj`'Pg*.mXj[ˤi>8^Mpm{-%wP'=M.8 *LgMLb5cr/%9P23)cJ%)c>^UlR98(:Bc˲AHt҂'{sM969riF6*3b/|S'.N3(2v uI%J늟3OXI P"]ִ]!- 㑝v0כ]\W8j4Ԁj~|f~(;9 axo49Zyq(˸xM^pܼA^2nirkI.T>' jmhн}# 1IeQCӠsDqme dDθ`L0GNJfk/8 ZgoD )&<7H$q.Ov.,L&Ne$7VjRX {__Uymg;6@K!UQtT*Abw!1.7A.`JDfR ' \[m}"aeg~$X12>j>g$G% _v,Q] z<Â>8F l `"XC%qWy85`:OڟVK`?sn^Yfi@|< %S/6eIeG(H~\2N;Gi-_w:.*`b@G#(9=0 *h.,X6 =1BnNSB$096O <-#fmELG*S'BN *LI]"ym0uÒx3JP35=&(eb"Tqy7 nl0O${YU2_G Oѐe0ʺ`sJ{Qr&h6 *Xk]kL\Q kjpwB5Dnmϸ2gu`sQȞK_q;ΔkDk!T>s]WA#m6l4G!ԑAS!L ~AmE*8/Bzr5O\|kQ?hw6:'G~BC;VI ,}a/!cvE˓óz-w]xXYz|~z/r+&wr"ao&-{p;$4с tϐ6-舰cc|S@]'Hϥf_2eߑt)5`$J8b6 7Bգ,Įٌb&ҿIpNr%Yvw3= O]"|ͧФe ګ-H%/%zѠ#,_ȧgY@ӗ[ iI0W^'ǔ,rz·H#eʠe+$"!vJĢjT^sXo Jjn1pP ^,rv'{zPwHqۈLQz=b@_̤'Fʥ )`V)B?RZ:xm%ReT4l&­Uسl=A$w6mzOf*|BتwF,x7oH?eƬUpeN'b^̪v3Agӧ,L7RoxxVѾbms JGC˻p$uLCu."8HNcxpi:{g\#ywYpQ.6ۍ>÷fxypol UFV8sou0qyt?1mM#9ÀbFKTifE[[եVϸ#JkXJ+C#xj˄-_}Bʿ|CZ ~ ypUrޕbrp81ɕh_ѯ)hIJ!(}ev.&K>8' qYj~>XRĪfO(1jV3D _[@j޵-.52A9V"VhPpfgVܑ`!PAd٢µ`DZᢅ`4@w۝HFnh#ZՑuE>s#F9@_"L|z&x,/S٦M鮑EfN''[u :)E&)!4H++0qcs> P6x_.w_'͹J $\M:!b sf OJy#*]ߤ2^⃻&^pMpsYctw{,gf^\T H}uvi>k8:>Ìuy'L ik$B?ʙiVHx.Ve= }_libJ0< z "*P,i1d]4 S}'фҗ GIߍb ,jJƏCF raDAe#YxEǑ)Oqzl(|s^inIVWn]C%n$5'IkVL= zf杈G7|S 䡵*XsX | eRʎ4mVE$7ԙI3̍]P3EԼ'Gg"7lv`iDVmsg_m]<M@{!B1S FhCL6*l}^YgG5 J'附BrˊƁt;4R Y]iuJ]K# iy!, 0\z~pvoVȷ{` lؔ AIQ F,a JUjEaw~`)N TmWȏ/~ O h|S{>jͤ}#SZYh~HH0?!&ܑ<7KX0^,2) N6Eb4VK- 8P FՄ7A|_r6jY>m.YD2Fͨaw"iT[B88(_V ͠0[ˆL?rHx8=F)F= k@ca@2@ sWUyG]EYI i:7\5JL@ $9c\NƱr=Xn4RЗ57RhQP oʡ͠?41Lun'Zk^QW&gC(gM@| ݃\#1X""bbtx%0]9 N|Rֲc,$U⺍[qQI?m~y* лGfl"ހ$wjiw az#2}^Y@u] u4f>fHmA~zHP1SU+xᭀՊSS| ?gznIP-1=m!'WP` PO`ZpŇ8A2e!KQm sؼF6gy?P9@ݟW}:ZF)3e)Tn‘4 Gh( .b D˾^9h*вb6͂{jύ6W>dMt#P,\qDk2haџ fg(xxruQ\Ue4GD" MoI50ClP,PT/PJd  ]I;[U-2mwܹ2ӝs"YSF`dS'SkU`)H2s hat,6*=eneqq<7++lDc-|rEBzec.صgrF|7K# me$\i|A#1:y􅀁FH) g>Q\BU5CWbM?#+l ”&[׶~j\y? ۙAm-ZC7Ĉh}\n0I؉Ib-UdJ4d *P7MſAO")Xy ;?8!*/@n%{n~57#7NZKrk{Np2NQZ` `m^d*;H!diiw"TVuߨ(*z#k@/@;I%j8amy %B'8撻|agIthS+)r2m3Cfd֌0<İ 9*G]yE9Q,12Q?'SB4 COȆ@l$ˏiaBf`}Siu|ݖƚApr Y&UF%us{E$cUcMZfN#0t #_CM9%Vܶ J&,Xޥ͌%/o$\FƘ)O /.V!"L]J!j 9ª: p(h}dK1w%Nʯq^=JQ'g+ Fl5Bc@Tf¼p}4AgRXM/5x<,*aWS֎mYn=h<*kӞ|skZ kZsͿ#C :S^1ƘwvSD";BѲoP2 V\8gr"%M oCc s hw6Lemؘvܻ+DDXgISnLGЬ>BlE6=NͤkE%o4Ԑg >6h<^׭Ur hu@V(>}y*[bp4kO3-B AGopπ*p#zZ ]$ QIj0SvΖ‚D&4JZp96IQ -+7s`>-Df`t,hλ7`^22!2tq'=ocf '2 H4VΝݸvFG~ spiwBNw^(F'88 KZv UNAwwF$7r /=fZŊQ5`:'lRW{e']@VU//' 0ƎK%{\qƔ6~g6&N ~4t[HX WX]'\?Jm[*"w:z?6;:i3'?󣽏G3R8 CPSYq\,G+–ӑD4H0#{a]w?@ܯ }:,K"l_wᠡu?unYf̡D~L=h[Bz$ 0tkKwrЌNE:쑏NCQK%#z Fedc`/'OP`wEFsԎ_>D_HC# )(@|Y"Q )6Xw,_K؁,J`,_8+(w0v_GFw}_.rl7HsSdN^|y B83X;tn !ŦfȬݮ]o7K85Q&X^<꟫^\ƃn[2$WeaHz|ˆK`\bֳxI+ח'L# mOCWP)+DZFlvMb/5[5%yπR"̡:\ [ċmAEKYز MKИe4u7v= t'tB@DQxw\n]o)풇T)WXMÛZOUOt }xK:@UϛYKy)Ľy̎.KJR7z]@vzWq0^PƏI @2K 1F|"y`Na,1#wtYT`225WQMEqc@¥".`9V 1iiy]L#VϫVuToB~HƇDg#Ύ {jލ,wt?$) \ԓ9ՙĨױn2PO2IRf/J];ڟ'uIkDG阾 %)%\?u9C*A*9}Zw2DKf"\JTtj/*7ө\W%K/A=̈́'7OˎJrU\ )82:ݛKEoTM:{w.)E8 `щ[ I :ciG%+mwm&KuP|XN]pFuP}XHss*X6DIIz$!R-n= ybj<)?YU;bފ<(1"ZYt$3}n0҄Y[qNz&tClMh4Arf) kWq|1(.g<X1jv2@: 4ڗ ^Ӈτ2#> ccOee7cܰdzJ.ܹ# eGt(3հЛ'νw\wٙtF8Nk*fn/„q!uGfQD4-^ʔS@U6k18"p +_[ [< ܏͌RH+ &5C~녥M5v`DEI:Q%YCx mq(o ";ߟ45 dSc.sCA5NuljE ʣIL6 +:r t=ySߛV6KrGEc]hv}q~\ K4+#59{%Ͷ%&NvЫC9=Y\κǒu2ꡀ􃚔ၔN%ElӁ}HܷDn[-H;utY&tI2A4t^>/@:k %BQb8~)hO٭dޡP- kcuJ .Y ;svf b|R"C}*vPdr5(?9bh 8kVC:EuSf<} \}9FɎev7MZZuq'z*}C5Gf}Y洱RT]_oҼkH޽GTM3]RBys~*;epn*DAiePn>?eKr2ňVH]F#m.?[zE,KrooCiODopIӬ$+(JicRc"ya-t9W`뷲)x2q~3@!mo8 aN]QΌ=VRN32K!QbJHDm*יfcsٚ1{5v/Q|:'a[TiI?R^M6odƂaK }-nd˰7V)yGU?d:ݶ :kgk1i*\[|gB7;2u4if4 E87g+\s2}8_j*;MM xJ<,m|Ԁ(fFF֛JF\c > @ePь ү0=kg.ҫ[[kʋ$h\8j(d@F4Rȵ!;Y >`qdr YpiFK MIMdG r^V?=Qw% t77$r<#M_cj2[hl41n#N8ϛ~0@W`M~kIiPdޗ)nn`oJї<~Cߩ?`B&hzVKYGXHkĪ,AX~cc/9_\V?CCEn?j\鈼3AaY-agtc[&[o:/mX8oZ(*{_@*[vSP""l;4uw/2,&]F%<򘏦5dCY2#(y!ȍ 9# 7{d~_SUyRK).(lQBEPd{G@j2zmMG\/%e"n /Ͼ(ez EmM:ɝ<΢+Z/4HCy31b2j(,Vt LyK6%%&MYDqVs* * e*~0~eԁ 4ܫcPNe6s<}OxN6CMm3}]56OӚ|߄=DTŹ[+/SW[VY1ST"ṋP)}N c𨉍8׽i7?61"MRnV]Xfi(x"[S};d-aw)@ŵIIGq^D* xu?z>I%ks/MaD~A4¤. $/z@7;NJ~ǫl|z1Mf{CZ7ֻ$qLM/-_ Ƞ=(ؕbVQpk{&~kE.d1 8v-|EU_@>ܘHog2Y8J^'.:XF77SzS >`-x0%mdqqfuӼ{Y!{=&xNn pK`aDn%ϽL] D7p=o|LzEB瘪b'*37~rƾ>N{P/SR&lZĊln=8]`F+6{1m%#1=`7х^gm[^p__f}lUl!}G[ڧz\~=YPj׌Vޟz|נLA6}Նaly㒈$,Z\t'Ji/m[Ghk%ris΁wVLL=ɰ"r@8yAJ: HAsztJ ϭ[W "Ǩgs~y; [99ub g<>oFxظV[ i^p$BE&x'2my޾WC*([zTS*vb8.'YC,W-5/l~R3i\-[O2f"_qlڵ??kܤՁ08ÿG7U/"IK{T x"c&'w^q!Q[֣طfS :j5L{]z >OjЍRV;L'aՏL8 90ai޲t̹)\M۞9!LXЈIw^ Ku;bUDm0?Vb ݫ/ӷNDjN9,UiΩ|).Xp#蓚Dk*&2wMT;$9j4UFʻ(HR9*JB+;ͷd3~ w!-Vy簲yT605eX܋ %iS3AZ,o57]$/ gBj(0Mĥgx_iUݵhRGw߯ފAiu>[ ͎SM܅ jIM/`w[$>yN}Es==/$Dnh(tAv#EHmyU M…Tu77 y.d:brU`yo>tN?-.|ч{يX]x_Uەj!9)7-:DO%Oq/bW-b{'pJlyyIhmt}CVEZ!OSk+hޔQCoߨf5}(]L'w&| ,s!ӟP)b9I"1dO`PWڍdZsӾWS]l(jw_(O!h''sm!׫#?gi`lsNԵf`$9<Gv `>gJY_DOv ɄnZd +t'2׃-4~pYO{@θN! v c\k̜;*bO{ 廈"}؃TRh-̖XԤRO3P>!p ku6eX!Ɵ*?x_)*gb-tz UQ."`@~]o 3 OK, Hz%VڡJQ:z`h.f> >̥'̳Ð齔s'TfQ Y%{FiPs#BXP7i"*F Gyao^YFa?C ]}؅*9=';̦(,dV̬03@N 7늹YW\yZA7YH ZHk{q(4ux5! ~ۦ>`r@s`T$VQSL!~K[*}+`H k e%2{EXaz44=<i\Z KHr\]c)-ܰ}װjc|e4L;x 4:G+"//G\r^AB0(.0/N0.O} o³<\ ʁ*Ù6r==}e?̭m^guf0EyArq81f#D k3z ID4c\W:Qf. SNj Œl 1XGu.pLe͑e#E]r&{EVPzx37أjb k$?Ư?)i=/q_3PDc+h~4ײа&d9dgØW\uLu:M ~9(7] 5=ڲbJq&[vF"c& \(/'Ljv}"֠93k̾&j#d-trw@@ #n7'>;UJ`O^Le;ئ?9<*sЄoBpS.?OoqcfXQ*{QngkPcexM^A@#ةJzSR$LY~bM躯];n2۴qk028Jrc9y 9m^8`}o兖-\瞰Y6 7XacU G3F=V (bV5t:?H.> I?p|n3ēzc6cM %hJ-Rrw+1uW -Ū hB W$dhZ jp,W-.>&c935m5L> HvJ ʶOk䟢5ve9?ytAOj׊χ/]YX>tw3OSg $E*|sX{X+J (`C!59Ae[k6K +> Y{VdWH;=lbZԎjd%?61#qK݅☎A?i&kN FRY8dgD 5=ZTZ0BO'GWb`BA{n"K/R "g, rʠv+BrFEpfA1ZAq<.@%ج%t .Lj Ned6Ύ88xB7>]+ 'aQr{ΡZ Ω6׮d h>|Fe?GG4qY'#U1Q-oׇ"޹[ 9kŘcct,ы3&0#p1,\g<+О iАڼ".zD.z鶃~  g)KWN6&/),Aթ0 -װ](NfbzEQ;ȨmWzt{_czU">ڦ(uLt t$DNeZ!ouzBCvL4+zu u醻H|DV" LQp4 c>דsTU]-mQ@ҁ﫥UfCL #.m.hrʹpEȻ\E"yA )qV$q0ac.LIͱQ1fF~&[âo=\0Gol`7j<\en56\:REfKɇA@V'^=R" ǶX0C&z%X Z|cq|,# õob"ҕI aQٺ)d%)("2$Gf%^مoCtkۑn0ayҀGo5mJOax6#ORhUE&3bC`'Ӆ+{i>41:"KxQtHt^K6 $$]f˫՛+kbEYl/:-jkE(c(]Uq纃OL걡Dsr*(s0޷;rFʠ)V YXk2sGjĿw3퍔̦ݪ,YΐK'>ry[֕pf7&i_Z-A^!'4z,G>L 6>^Z(4WZ+($u_B)#cӝDh*4tgzڨ\?SK:`uuh^ONjE7> ԫ'#j By"7*x:tWn pG]XvӯIyg:gT1 &Wgz:Hh z3DDQ )Ë1Gk0 ?![`cE<؂TH Qf]f*ù ;4c񃽷dѷޠzHqPU_h%N[4n&\[l.ZOu%8hi{9¼[X.y/ƻsI#ǨY@~i'Րlb) Ԉ{tHITrJњ /W^u0cV8q3l&G{bs<ޱ{ [9SjԟKdGSYc[Q98 1?oECf 0.-BJ'm̡He(>uWȰ%l"d.WÊ cI߀T\ݫpXV͏yT%hf,ǃ.ԝ}5TuZw6@ {:E=Fw1$B~+4mA]*L:Sl\ z2̾1Ĭ=>+HNa*1N <\sk!.xrLe<@M>N7Y/ݦįW! \(ǥGo"zriħIJIwy0j릴/W+1R05|͂#dF&'Ub׬~A=_)%j!Xn _d p"Ƕՙ"ᯇ۫䑉OD#_Q|+>JfXpLLs_pHa<أ.&@)3wQ ne#q+1Li-=-b*E+J*n{2D99naMRQ &8^]L*v~6 j{Jj?8gS;"ڟ_~ Fܮ şzcT͇s;SS]qtwӽְ`) E~;AC:ݜ۬iyPr9C4_ĽG|p_xFbP !͙=Άo3bM OL+'*5ȴ+kŬJ+O,)B3Hi#]pAr<|N<4j3X ô+J1K%$J1S$i@z4B='7S_ە]5%=޺J' Ҕba3QI`SUD;wB+88cZF_Qʨ=K4Q)9#6uRQn?.driNJbH9RÝC9 !rW>7opAf*@,4*~H;Ѥ)D~#XђN#rTsj+r0J}\Ah\%o!x߰LCDY%B5{0^긏|kJStE .uD%‚"upl5/z"??Kk"?מQl#ALMVE/h3|WƐ|>>$4~=P37a{`eطA9ͿqR1h'>3T!֔DI3nT͎"'}@ILx{Qƺ4 L(/Y.uVj:l 珩.H }@w^npQR tq++,(aZ)_TU?4Tr׈Y:5my .0Jal 5(>hA9 LЁ{ܾM4A˙g޻lA 9!Ehr4 A@K%u AnX/KJG|xDERBIo>9Ukqo?~̮mjtiY j'zϫ*"xhǩ4bNoߏwbc'!3I37_D4O?|+oc`wr-LV9g6 ȅE&tex5 mF4Q;]߮£^N2-cjÖqlW k;p z&ϝ ] ._(R6' 5 دG6&ZD", Շu?yvN`St.r j}{E?!ψ1_6gO+!ՠ>ݙFG; ě"ڂS"F2vݗW26].:%1KR #wt?WCSlw콷?V<ꀶK4MOթ s:7yC1J-yrP%Rޟ:7LΈlQuUC6ъBJLtĀ>kY2%L滝Ўԅ K`m6}bbUiM9gLJDMFm9 kҘqU#g *ײ gjlZGL:#c·r=Q$DBƉ6Z/lq\/8ԇ ul+8_z-ER?Cy _nÙ& (sy84vL'.EC(2Ai,ma\EuXbҟ0#ojcC:W$Le+־4sٗj?sDpm12B4ftL .5tT<`Vw. ϫeMdl'mFBi5;26,&ekCC=8sfp@{w'k?eX2wj,2Ux`&UmpB9AُX vW;D"m:N o:H;yQ hCXwjO>9Sl ;Z*-܊d2/Eâdua Q6h@XxB0+ |H uo!8o7WЋ!B|'!=duG@’g\\C`J\3R2k6@IVpLʪl\b~ҩH.xg)Z;L1:Zbqi8J,}T+jWF)7XKC}wqlظ}僑dDggIN]'`Յ0~jlH Y^b jJ @s% e ;T@%5>Ԉp}kL/{0ZBa/3=?x"7OH4OӺ%CFqόeL"%S3'Ӻt|Ќ mlPDn4T@#Y‡l#u6b S >y `,xL_Ș161 >ik`iTaXƔZTlufGXC[ZvN+d`Gk3" , =gkŽf])P+ɯM[W)~k>vd5$ܫ YRR̰Cwj)~x9E7,/Tpfy9+!.AEJ|еhRYZmW;Do& օ^5Vm2殤|-bdd:ÚiE|D'f]@BGwep-NJjl%8RO{\?yZYEkgu-绀_0ɠЉy Q=]TpL/𕡔5ݫ\+ڈA9zU.Ƶ9ZSIfCZC5|ymf r=wo'kt67DA y/mpp'Q}[id{2ik9obeԟoV!5Kf̚}`]ɗv2nH1 gǑbI]S1?$#ȶJưc#XUѱRvxHahE H5aH@o/ 7!9z4$7=cKYP:aeo,W[ܶKh? ^5yY3p\$ba L5_HlI vRdL!\ QFG<6BmJ7=>W3#[Rr`"6Jr|i dۥH56T#m̉F)VѢv.m: y+7Lh=&Lv3]D+=SZ;{h~]e4%a.+CGH pz#4_*N )sN/}KM4,HKo;WŠI$A);7\*Ɠ^_ q~}W n*;]Hʹޭ*2I\yAɻ7pϬٷA[L HḷDh:9ףTDZ9RiFdI*n!n4d;ݣijć_qGI,.#֠|2);Rōu~㶀5rj˴́_{;eHѶ9/͒ ۅ$kwPR }.ngֱIxU~ -Cݿ"hU=: [Q͵4ӟ[~d)C=}\HWb,{,qpqEe lz2Y֛ Tڠb{gXկ+S[ F6[FrNaxEJ۵-]ܣؤ]7D 1 ~@d۪a3jءhcOǸ>Y\+Y/T =vΙP 1]W.nϗ'dC;<jx=_,5sTIW ALخKӃ #{pxb*~urnD|G41 <1m!>)2,R}) @BJ'v~ ȅ ^GR_[E/rtl J s@&=-Dx좿mG&ۘPfOjXi}0IK="gi~B`56{ ZZ3Y8cYҒS}5}b?lj2 ΪuI~-Q.Jdeiu5A1mu*xjcCYpH0Y漯#a4{=/ݏGu[Y|娺*n)~iǗ $ݳΖ߃eJ`m)OcĨ@Ddb٨+&-^W &R%ݏ  AW=T8dp-_;o # 2" ~gߞ:?o֕߮idBሂW :wzߞG[ng>g,2eQbH(LٷcM$#5L/́G2g>qk̐䡴6Ȁ!8Nע(5jpE-5 rdG@\h!;D|0'(,a*5EEȑf–'+1|IbyX>Z ]*>iڞdԃLp?rJ5{+9 \<% ~+llz"u vUcاhwzo" EĬXsnؾJ0 =D,>kwƶ"m3Iho79p~Fj}IB(E(4sKoTW| PgrdbX< ˱+"cv,0*E'f3m\燳\ b̹T|C7I-tG B4o~\Y%TQ';uC*\?FRLO ,!. GxkΚ[wįyp4E$]ڧfo 0g :yg xsR[ϐQ+u20^`LdW;+X5@}KS~أF]uOB~#Ɵqg[GO(#=J; `tK`de ] ~8.ʚivpր *kf2]`AboBhϓ$r;`'[ j 6D>1sn8\cq(G GnPm[6g1kDk\T?6-#IXf$֧TG8n}=F^a5jIV 0 q@NZ.2y`劔fJպ1gBlOH3&cf Yu؜?5E/W)Fr4avp#sF5rl$J%fىs0,*4˒{.r]h.ܹteNaTr.E t4ƽ"&5[ j-joG:q5㒩,F|.@rnB̙ou0Ll z{"H=`BJp:LrK| :SSEi}k4cqHdkjUg_a;(v:lWBVڋmL[YC`.!,ӹ>jW2[3K.y1TF%"@>JD<8Z/^S-%)WDoOs– *"I| 1@4=tTL멡jE47`aL-ߕ;P*"(e-1T[!kc?xkCuӽ#ZΕBJӺ3(1Pi$ܯ(1s0dT :C?-)]G>0/r[ B ߄̳ 74Lξ{255춅}h?34g~]>A84pt>oTk}9(;gJ'£$j&>|/ESU; pctz"%u,g-.N{:JɁZcn­&QuOtI3r$^ ځ0x䑨ֳ?_14j?qׂ gδuisQ_Wj N8t'n[M֘ PX܋UU2 y7'aA !:Ӧ.ԇ돹9= ׂ Kb7ߌ9ؿ|wL>&d*MN=Y30kGQ=㊂i#$LyW̘j]#kI{4:4gN&_VY8wWKa"D-AuuPeHhz첧:sYxM 0Rm[*Q]fD^vcKFW~%Kqٓ! ?T_ 7?FK)TY#xpa+qp-x)Yߤ\S|.0_ҽPfTy\B/b% ЗY=}o2V Cw_Z},4LkJpv MmB1Ǥ$8 s*q3lzI{8h6-*mSWأ0{GXdrYEc@{]}fE|gƞϪ ds疝;T?hzD{t$6xˀǭ8>)3\EE`C(9$u܇X?촁O3Wδ]nc HOn.;3%A@8Z#(wW<)S/-B,Q.) KB"8m%_Ue, OmTI\`e,Y_΅mi}.b~h Mj8&F5L^-J—MԺKjeOS 7:" 7Gy~f!gI;/8XEKg:ee[`x_c{?:{!kvD%X/I/k`Tf*T2r2y)hpDKR6ىk/y&+Sm#Ae6za㽱IQw{`yM,h :himW@Y\hv3l ͆ا%XDQq; NT'B<ė,_Oڝe6|oµVmmw&%LסuPɜ#1Y2{kiy{s?MXb%PxϨ[(CTĎ$K}i rjZRF[ 3C+[o*`>ط!׶g8wq|KSeZ)e; YZv;3~_,f 0:BԿjOx~ Rgz/;q$ĞNnqGQu6p}g9?G tqk&vӍ5.@lk`F+w+ % REl,`[Uz9F7y]qVVM ;Ď# zDɀq0;z[΢6=Vq'g<1{7B*Zn9uC@# Yk_Jm !v]y.Z5+Wӗ$Q݄߼\5FWDjQLAO5Q`OFGSCؚ (h~<&8ʚ\tEˈb=h~g xDڅu(>^ U58m֞ݬX gG?[))'+aIe-+JU8<;I3 2u:7- 8ھ0NԼzu:<k" ٷ1*59$uc7ʓTso@ɨKse(p[[\< aVIѳEfEqr*lxlP;OlkA|TҐ-zkbG7"1fHiOxxEGAd9;iKܻ+Ry-๊ՌnT7ofSRA"jf1d_"Yޠ g_aZ$]R1!^6(o*줏.&D0vI=zUQ'*OVEyܮH-=~RĕKf,#a[[FA\d7!e ڮkWL#Q+7NR=K5 +}nEOJe#\:ཚH@4 'UPun>[uB+xҲk*h$ +F 8CfBxd5Z +浊M$Wgt'2Psx+=$ҵf|g+e۩8;GW)]K:D0Yc!Dۥ:_sԡ-3#툾TzbGA *{Ӝ|D݅vPͮGl?8^dXB˱V1%GS2zUO2E;H 彂CskjP.N< 9]("R3x%*mi4X N[V4s\c?Zozwv"aSD 3gE^Ϙg$n _6!s(h,<"y0}06\|KDEI_8Ƛu{ŠL=-ڕc|Wee2r$Nזk=*66>+m%UQd]7"K䟛B6k@ $YT`n흹5JvT=Z+@CXSHJJUG.FlFlG PkўJpeA0 V?.WGd0Cd 9Pv4T@LђNV6_#K˸lCLbyĄr s0] QVWj8}x g>)cRqn$w"0!sL"PVCc; IrehPdڐԆ!tOGf6ݰ*4g$y.-4r.3992.g& H7`:4C[75/&\I: H-goT c:\5;B4O۟#F2-@CyE<Dxw͡}ڊN5SN.PZ"h5gjiUlZn!j-S$7 tZӳ۳8Oo<lt$l Y m C&)sioC!bœ'nױ\Ga]Ѡ4GAc's_04s≽8y0ktP-uś97~DVz zf3Y -V 4W7)w49H>6Y^֬UDD=t2QoCݲʜY2fZ z"hJQhD׃g[.pNPTwA)əP+fqdHm.ˠK=Wn*S<ւqZDTuӠ+qrx{i`+&Yժ"WyABoNcFAi&Fؔ*F4T7?.u>5V~E'-Ε[Ɖ4xEFl!Q'(V9 T ]]ѥWM \grs0'R'Qx(/jzd~I<^}I4QNwy6t$ptc;͜rG15SűDoQp8jUUg4Ut %,[4jpQBXrH5>mu}:LʗKd.X5\F^I+(*mJ,O"D,|+{K{ _RX!TX\]+{7wLzZ]Ey(vX0< ߡ+×`yen=ȟ'tK/)S3hǖg+#ÂRb _/䉍׸UYLNE#١Pe6iۜÐ:wo9=A_*?L 0"s~\qϠx#"1$[/mڰ9Hζ:: >> 6kx9h5MF}=p-541.iM¬H]@=Qa1W*ظ-mzP}s'ys ߵ?Dqb Hv#L_?Oɕ04pv.<]rlJ]VE -Pw/&6oY5Tyn|]Ed_J)qGkX/JX>5d RPPvxW1hE.ylC G%q!m9N{xp2i7;ū<YRs U5!x*|)utBsr<% yi.hJc'.Z{q^ߴ7L[`9[)C*H(-IणyiPYRqi1wew ]@[Mzy@0-G>nhgx P5O ㎝G[Cq"3rB!9{Co]3t^% Q߁qM7nEQ!Nm*. lj^\7|y*wZ0(`}Gk=iQKS8m:TΆΚɼ6?|$ /&O f=Ǹ=xV!HqgKOcYeܻsej~, vAXBQ!hit' <슀H[o O@oćI:dAİ]"^QVW$o =NiGEѺ^i~} Q3"ls:(X~fk*FI&VMZnں/e _Q%^d#^U jD1qq>Y?'8#D'T&bLyiյK7Crq +_r"f-H p獠Y"T:nazgM/m 3su$>#(O9TQ>0%=/-`,SA 4RO $D'Ab]mCsEIGAflbt+\a13O=TAmYG5ZvI,2654ei 駽'9'&S&{h=Xi`7%P{Fpc343F^tRđS"`} BRװI8"Z7R2G0F鍭/J + (ƧQM˱ϐ jUx:š e'@EDdӼ 2nhs䗴KԬGMgLE -;"nT4 gXSEPQL+שuegD:$׎f/kJ^lI}>E- 9I'Bђd 7j0q{dnG;YʢLA`B9_ THVAфֈ}eȌap(\糫*FZ\*š2'YvVBuѪ79 g;4Fyj<7q:q"F, 7yqcg:#-g֛aGrSG)D {V%˽JXbh  ,f~.U,Ñ a5d^kS?Rm=A=7upt4b}J$1`G)'a7X) =*==Yp7dU.(pMCOLYs\cs[Asm5קlqΑc=!*2ZJ[.iJxG m<[OƦΛ"Jˎ?N\ GE?zٓBp$F<]?oކAur*.Yl7esst(L:c=3tTE_Muy8~;%Ƚ_͚셇g]s.ZvQLğD+2 O]z݌Nf\]sMwɬsSrl 7=2+Z/d>.NB#H=ϔx6W& \w@`һ{FV4?i@3ކ~ BZuWԷ@˸rN]>bD;f.3i>+ф_翚PBk\2 b:}'=͔$3QFؐ6-ˋ7+-Ѝ["ƈ}77J˶ˬ#NG~ 7' #=Z(J1N6_U%)ҞY{n'`(>4!?27^̓.*CRQb.?dn!ٽ|V~fMh|x#(:#B{EX-6j O-~eF{a#"7/bڸEUm-wMTp1$ֈ~M©Zmx{VM'<]1K',JG1 cӒtE9.cn~}|25 (Փi5wxv#g[v. f^WՌoyc{MWh5dv;q\u6ɲy sQ0&p^}MιGS%:ҥKY0k1]R{i{TYRc0>նd52uƏZ4n=Wsnc 7\䁼9V%K$5ؒ6xnGyP!&aTI#[ziz;]5.f?vNp)uY `vCMK/`O{ʷ7I~J0W˽vsjzNd4Nâx4m(~q9-w=D5T[u Q9R"xو3mK l# FMֺ<gu|ޞ fAUxxY(uϼqW8.m6FX @%tH+X^n-<=j lǍv=ӭ[}Bߚgt\_q~Ғ%J7 i cn%@Z ?4gJ:%{udFSYz6-uBr:eP YlvotCxCݔRˢa[Y _jOn3^>Rl3~jqQ ߯bUR;f\i76\8:*8ERcɹHpk2x.PX ?/I,l'w<_ZTGC ͈793qw.(;-qd)j+rdr%""sC70ZQ]Ps>`Ytv1sz&:Mb<4,M;O=ҧ[v݅∇JeE;`c8EA)Z'9a8bD}VMw΋?^>RB3| I,~ΚeH :8rv@Qh{7(bЎ5Ry*s7vL}angTL"X%%ܨAma&P Dmsʿ:ɷ5\+%[;UW Y#!ZU9(%# zA}ғPJpz0mD!cUwOuۊ s k,XfCfF![Xձc*okR*LD&ij{mϒ((O'WDNA}w̰Tģ)#4y)+&NE+~T 7}__\s`@,*p x_#fWf{|HjB?y ̚hLQ҃(OTT{؅8/Gʙd &u'KхvNl<)uj:rx[njw%wNute6ӿ3d l8QMoz/2QԒb}w` B[: cy,BPCNDO_-s\">&^n5igT5%L(f{3c.npz'}D=ѣ/S-GEK?| ]b_>::J=1)XVP >6|zoᲅw<+e'o|sdAK5G:dOݮBV[軣"77u ϼ}0xN?ނAO a7 D T*k zëi7@e`?'v>J&!ZIh!M 0( (*2?&QpiUs֣ao9. 0}&}HTc;lIP*4\5H!x ~CqqU;ؓ%'WH&rWy= 7ͪ!jU,*G jpGykuGY׭Lt*-# k"hE^`T} OB:L +϶ Y@Cg3DmZ0T`Xʮjݏy>n djNϓ%4ƫ^i~~G@`*plgdҀZܪ'|gZ`;{ݡ{T}-} ȿ0'BECGI+( oK /E`6&#}+z!Ġz|J}5B'.ɿnA<| uޥݦC4pB?<}&- ~w;n hZmHTΫ8%'z Bo ԣh8L2Ou?: TYZv%@ixwD0&\lRbfogA f,Wmv(㭹&4LjTǶ: r>`e15st]3 +1,ly4b{4kNA~}#ܴ}\Z"kٕC" /0^lQA=}1_ˋNIÙuHh_3t~}ZOaG1X\_|iwԭ-GVtk<\a>#{/xg!Tz6yU7_+`~/5UPx o4i 󋔶ubf6Fr;s`#&%ycVoN188eCμA|>rì FyA->{IRss:⮧\   t-JN-Ghg^t("|FNrT%Co}$MmM);a&_ꄔP4U22ţb(V+>OÃњ \d\?kh)"WX…GLQL,h/92`y}d[ӕh^ *"Fousy0$mM߳>S"lUvC%KOBOYm&E)оaB[%+M?cܸ J-(RX]N8ҎLRG= 1JF.%ߦX[1*c|2(GB9&tR+uȅ-$'|̈4&Q ӕ;Y\fϤ.h-E\ψKsǕGu'?:6GkL\!tv|S r"&$GE\Ħ t{sh[):IQ^%T ҀhKizk8JswP<`3ůجK}ÆB Eي⧑Y}2c2 D4fM#4Y"YFtboR^1 ݣsE%(ܣ\O$N_<~\j|}#$=ekg|wAqA4 K " pV.ma]먀x\5r342wĵw@Ztvpp=akIx^7U rGTp 5ՁFzNGP >s[e$$fDjU&Fڹ#'IjyK?~=" e+3ḍƥE%!"djUin: XXҤ4G`H3 rYx7u /M$qF~(8YÚSd(1}D;$o2^WyV4T< G{,a6L3bIE4XǬq/~pEe|ErYv 0I0YAҤ>%_ r0Ůh ,q82POl _ėM"\9jCBE1!Ю&&T:L<e ]1]=kMpSO$J75swU,>5qi>23OxQ( lUNө6/:oB B}P;Wo{P<:RRK2OS'LbKǵkα /a5鴶W K҇&uj)L> m7(EU6$.Tln5^dp8ǎadJ0}a}g~BB-<?9.oU+UF3=*Vut!YRؗ,lj*I*A ϼH賷rjmX fӥLvB0}S53M-Y]= `h>i>9Dfc z@2yC1ߢ>A -35 !pZGO)2:x_P =Bчo\3~U`5h/@Tx;?߮M3i'J|7"Cu涱΂c8ms̓^|g=\[ꯒ ɱ/7|cl6YN2>s[14n0z_.1jZ"v{>ZA?-$Th"t (~pqWYLvvxߛ9_y9w6r/E,&ĴvF]!$&\{gW| omf;A:*xW_-dB ںj.@{4:2|W>L}N'_ r*CyhNiL/jkC_nxdG~Z烹 PzK+4 T1KYP'C;[=*I̠iTᢞ$NhRУԘVḙ% {("qg5ʦwvpkƤWD; WWWGHJVIp^"i Y  DRggPե`9ξAO$B z7*0L_;L}\)æp0Z1|lcwVn w.@E02.5dPݬn+$(][xxP:n(Vds8}Ol\Ҧ ELpT-ݛ%( ՞@^JrBMx]9B V#z˺)S P'wd{Gr_>lig"-`٥Bi~l[q0cg\80dn4aoff'A! ":7pjZf98z0o L 3%6-a%Z46zpURѣ{*&E,\ '*̦g f)(oا*i 5<M`ms,lo wtOvk1m`?6bܙ3)!fH|,Y{J7nr1>aGq;J@(/NMM2gQuxc0;|Q%kK)-]<}j*yEXK~Xl;7O}9‡TݶC ?fq/Jn C/ŊrN-ba%wp,*ۢℕ?ֵw\ݗ@ߚ.@نd/K&`l\7 mickց  ̲=_􇧭jzN{Z԰q\>_^ʽ&쐣G!J׳S[Ω<$BDH[%gO*žO#?o>1A3ҏXv}lx/d`Edy@{q#3ی)~&VK9ip=o%+h'4vCSDVaϪ݈+Wxkr@Kc?+*NQj5=HЋ鬰 9updxoJÚ@(ܰf6qVB! 5K^jܴ-gw鮢CY7GK"]S=NSvs+7}EklA5|V_MQӕ>N L`*zSguY ݰɽyg!c F3A YG,LJd.2k[`"X%[YT=0 FloEΙ9Hz8jN0.@eLeK 55V29co_ec&齯Rԕu[ RcCc^CrZO](;1g_P?\ .l͍,WdaǐUÏ }nW6ݣc1Kew$b| DE Up%CY0V6|^ıw_Jqc(b XRd]r'? ?gc;n:< )I;ҟ8IMDb8Rktå(F#R'rPCWAˆ9ur]9ni(+^sm_ Iopb#j3!i0Bw]9_.~U|G?w$&҈$D{50pVr[QBs'O[1Igj^qG`Es҅ڣgi].CQ DU K6tp^V‰1\>"}m!S;zny$FXS -O\K.jWw ȅҦQz98.i~Q^2bv^QO(z <.]D|rVhN8<(j^_/4qR'Yc̻ZGPep NCZJp(Z!41ρқM p brkӧ22B9uu1422:n9;#W޵BbSC4Өy3`( gl2oLe ᲹBİ S6sb]:T5J1ZbEzMDhYNc?' ~qd`h3?\c:9uDaB|;p"|oڈ(oJع^X6$7b\ֻJ& D0Gr_Ξ՘lA7?rEg?U.q˗"wdr5:ӻsz Ǔ+wJeI6weuRk|ɟTՋ"Τb i}h"nt4+ Ƅ{})Qc ȺT ܓ|#$H4 PB|m 7;GɄf> .&M|VJqOljXco<1MME$x1^+a7f((f0Y`K\$anf GTvG7G15CoMrlׄDO lp2Oo)㯶V|- j×ד_2t3/cQsq: ae*C%^C5)bMȁ+.SltJG)P7"@4Vڟ*Q&K YqaO+ZȹEzBX!uIÈ3;$&>zΗ,{♸= ұ(5,\T]8ނL2>iS%n*4m"obqE%D_e1=qSQٔ|sA@I&}24x]MͪL{Wfqng!v~(pERCg:#UzEޟe;'@u.*> V'SˈIgЁB憽-di"DF$>[efP1K"?XA-DL ghov=:u?$rPh$^Q[EêAČj$*Tu].wuE?"[8g]׋Jlb`+ GFvǣ9yQl{j LFD2NΐSQ", •/?w[j}̍ }O#b>o\6˾VJ1>pWUD{|V!39tԧNVR6 "L(Yx^|R5P_)92~Ğ*GtVvN;eC.'* _yeȣ Z..,&\DM=+6;5L'{jrgQPkƄ&g[իc?'[߽o6FMnLw;ޒ7qnG,'D{co0p*1tPwLv^N18zѕ ECm<ꛨi%M0kLUr @}u&HE*Pʳ##K}p{bC7a XWu?ZYc\fj@}gO!QŕM N+tcGc;- 14|M_Թa[0ѕ ee}56༩Yv^zM}^F'9@ B]H\qք!@}]ڳrBEbB03Av8qɵCLtÊJjF4?߹kf Y\oO{-L*$/Aean Bմ[TO2&灪OĻ3_VR,,rZW'#UwP灆BDgG][6$ьݠ >^x i?&[CxC-7^ss>ޓ^zuDfiT]PNQ!a7x}|CM$}*mLSdjR0`%v<=EbLZf J=aO?]M_7v;k_9}^ u}_m'cIع_Tr[wC,g!Db+ `[%7O㾳mD312,7x(C#"o=!YBi&w{( /pG .NȼZfoFC'1q?@:(a{XB譊hϋԭQ 1ȿ"!01JN"e % . k|V$6Z͏vN# @u8#3Qae]5Als,/ q=ttT5 Do8 UM(>#f J#(%BHu]irv^r_HLh::rogY*tj{숯lr& jlfm cB%N.$X?&Qt $ X}ϸMfӿ}/򳵅ukUAA' ;9ADdj!ⷄoB y-XpD6{HanT_D&aEps>y#>6?1 ,x7ǯ^M;93QS a!$U\M@zfqOƫ/Zy>[,TiS ^C7J*w5J+0֊y|S/+:]: FV"VETf2gr\[o)}})Y\K7;;#=%X)퇥,!{|~f=wJ"#LEW@FBa$qm"VQV_qq\zqGfB,^Zc}Gz8#2T*I~" ﴴ&mN*\#D|X4q][G@bÝczn?՛R+)rB?u>\KۼVVd O2~; G~ &LqXEn_â%leMmzr2zRmG^5rqܤ&DEo w_Am_)ƣtp\2_V_[6rb}'؄o#'eNAx7|Q61"> 3,/hz,?Y8M/ Aޕ\'^=Zf`pBݖMĮM'{;H9Xm&NDԳ Wӄ>>p85.19BV[k}"ؕAՕ_I_(Ǐu@k.L8,؊q$TU|ϭ֯GWd91;!? @E9 9kqb ~qn5.zTD#ٰuvb'Ii;LZ) G*Ze1OڀiLuX's> }o e?"FqlF8Yyfȸ Ek^bہk9bm!hmZaGzPy:(<'f=ô ;類q^*~W`p[|W1 P5=A31o8am!@0%m{}y'*.,[q9s(6,8߬vYM0y<-'(t|bIX6N=-UıReQ[fgWJ{nK1y4cD?t|WD C7^Ҝ@]<\b ]N3clg)?8fVD;5ܐHbШ3L |k?9 k_l[g֧ <2,q(wgeLx(#60jrW/[pZ+._ݣ*'潃iM^b 6(B1I 0Z1S)eNLMC4-*ȉ7q=Ghl>Uh] ֟2)ĘNR"RMS# /ѫY8r⇀)^YMa%-w\zcI1 lWn?ӳ\nL2L6?*WJcW `*sTr' &<T591 Uy"<nf m^F78MvfH?^qzFt}_}*B6SPH{b<_BLZ*f䕊.BG1圩?bX\I#dfj*~)x&&s_!s3/Ɩ F֭trQ@&'OРw19ť =:A#?o:Cw܅9O1S"\f2W0; g-4㧠;iB-xbM2,KP, ιtNj(8>l)s"gp W:I7 Kp"QIT`JۇS2Ip<p2d2}6ߞhgĻF{䭌S[][6&+D=`r$gWdDwHs})?@n& qݡXn.8id%Dr  `~"&wzeft 座EAѮ6Bo3JwޤgeD`p gJnGe𽛳Y̸E //8DAXkt3|-\@gku->M URSp,kI̵0]"$k74V2-'$w0Ͷ߿Guse*LJћ`jwZ]p3PT_;(Wk7⵪PF9{>-IU+C%)#洶Z g5ug PsqSrzBW(W`tu]6IAwM3#&lJ{Rz `̒d`r};G/iǯdK!oP^&5* }-&SWŁeC'ǩZz;*9^vÆ6dv. >\#"lfsvYxzNeAY ֻ&g{rGy 5F- O?Wpu<<5L;xf XS$1Uوqx{V76ܟ. @냤s331Q9&D-aj!O֥Oü dSOrՄ2DsCےpMZ N4jq]Ԗ}Q@ sd;y)%0+Z4x_yYt Ocʯ*>mySJdM7QQ ;g3عIWEu;:M>+&nqIbt)#kSa %7ls=)I TkMA f#f:xo%is~[E ݇l,dssQlYL+1UcTcC,*1J;~XDL7hpyCǙ1(R0IE{Mb骓Ry2*͜_dH9c?RS12ܹ$EΘiܕk!d.f&f/0|z% lUuoY!;Bp,`xE]vē C *asb6Nň*خcg=M@>Q-Ct2+yC/݅z-Rբ穴lW`$T60UGWU4vV!bE7 (x;u#XлRjzF-BNދ۴?>|Cqak^߸j_@ʫrPpzM8jw;0AԷNnjpU,EyMvg uX[Ry3TcEu: ߃ֲ>j3HBi]M̐y ?-]P:Jwo%b؇˒m3e(3rv]DGQ!7ZVfڥ9が s'FcJ;ץg..Q8V`lGҊY<}t+:lRǟ-T_>W{&k:1qY0[Wo s:x!AL6wPgD (JZmrN#OilPauLCQNrЌa.l`(l|[&><#}JO/HZ1@-wlUGpF"f%!\$\S "3ڽsZ޲WUsJB[ v-e}# [ xL( : G]+J8d{$A_AN0Vr3yvHfCh"Ș=keWښ Hh)kxjA7gG^Uv~.>??dQz9Ă*QЪN\t$+5y{8myaaQ?0hKCa}'&b e#b:Q&lHYDVkAA9\˨ W'CVF!Y!"'U|jlܜ;.Wzd89ŌL!? ń"\:eC4 8W$:3y!x})Dhn֩ `2OeRcY{?d*.qbJ 7wDpO/~ GܑlLʯE5$`Y0ѷӅvrTD/PU^eX H7)M^EJU(]{ǣC)-]kcaڲ/XpК$.@ר+4RG\c9w'C}0Ko`vpNr Y.ԍq֔5;mZq](4T,sKK&5Y]5®Y}&!z]2A\38~+Z)^: 421fT 2~ ,`/S8R? 2lZwl_))Vl[,^,ѯ3\\3caބxJ苆%/eֹ[<̃8 W:s6YTҌmz/F@\`~WT)dW{_Gh1/mD~7>Fr g*BtiCr BFY%FuXc3@iZ~\AfbS=$KGM(S*-k9xbĩ _K%x%$TWXq>d;'#k,`S(+zͿc*T ?j! >p@ $XCYm>Yǃ9>oyO(&R>ͱӈ&x׻6 2{|G d R|-ߓ۽~o47yAU扙DԈӾS7lȜX,No-5ceiPv iuݪLxY?]8*/cV-8WWhW))#w3#(X,f!5LO}-dq 8O&Uim#0 [ ?+[3eN"D迤-{Asj^Fh>rnzip֗o=hjlP,\E$;mX2]!/ۢvK/ĿS5LwP tQ4w& Hf&v簨EnןwTr$8ySXMPz1(Gb + i,&o}ZηS'BX,`ͺ%NP^-P6@%}$hVJN+y7D^߶MX6? 4;;_ACݰ!ܔcf 9Ecu ڃ( .au Ë sE ms}[`=Xpޚ3 X_FH|KA-Fv4/ZK~NP$P *^^@Q:) I0ÌQi˷“SgpZ 0![Z*)s?0IF>QvԦەq>^S63eI=Q>\,_受bFGs{=g^Ug":IaL~ dl kw)PDL MEQ$cU\RB`a1qS"mSLiy]ri{"5@X:ewh'˅/m ɦ]-Oq ,Bmf.4"u:Xno~Ǧ0-b%T;%&7ǿ94A9K2L b p4 p$O2! ;ja|Yul²1 i $DNb13nO;%.ZF붺Βcc.ş&@kS>;ޚ N 6['\086/3/[艷R6Y٩zּf( MCLx 〯D*Nf5N?|~;|*POMp~w+:³ _*l<5T3xJ~'WC6QQM|xQr+7IfXYK.a~Rى8mE'ComLp_S+(kC+t=PA~!_Tnzo{ZrD9lwNtYT !qIoD_0K@Ɍb&F1X R^\ѳv߽w)}u_ ؀d Dϡ~D4i*b^8ms63ZSW1c3̮VuUč_疘 s ]=`ic`/ؚ.cQrTiTqO3 ߮!S*ۺ.Hbs'Jr#8ZDT=pwu%-/ߗ;jM^]•V6bWYE|8vw7AđmhUZ⢻A~\XרR定bKxC6y:V=Y|bSv w<*{U7gރPoB8i pt_jLT9ӊ ]=+n SE= ?%^;йbhv;H|f|^2qcy+Tw57zV ?/| u"DXq]If 4AZi"rS(H=sWaY7I]\{5dCA*kgt;`x_19M461>x(uWjuN`/<)[&Z=lN R=Q\=Hc .;%y $,| iw^ڰ"˦vp RLr[L3p$SgWspM|cqdoI)'̚)ZP'XUmU&qI~d|F5xŕB 'e]uK4ZF<~Y̚^Zi!M@ILKQcHlxxC~0/gӸd>b-']5~T&΀KͧAVsʔi!ž U :ئyZX6O&-Vyb,KfõkJ]:C ?"^mW9<7+Z˱syAP|g^ ${҉6JUTaPNoZR>8.ysH[eJez<\k6ѧ)w>Z 񺴶.pE0u(P4ey)B6\Ÿ_4-z$WvgJ9MXG_cOɢ$4M9EdsMdH4Gq pfrzc$ 85'.rG @I*l~_3$3#ߘ+16[~y KL~ `o~+kg߭"x}d c[VFQTN\a?3ˏa)Wgu["LˆF"̔ *b5ntHϭ6ANEpB#v[$95f*/vyVJ'&NC4BN9f|KrxV}N/c;0tFه~!M-t| PٮBs!.GM)lJ&!3{%ϛN!chČϨ!jٟAX`3ZP(O L5稻"p 9ظoT.K:@u[iUq!cxG )M# HfzM/Jg@ҘQ~@?(%lkKВPon T|=UTi}qQVVt8 l4ZVI?ZZ~Mjf,F*mzr2'+N[uو/`4frEi~t2l0Ӥ-o[990Q4@@cl:l5mq [ E,Zjd/i*u x(8^f~iKDBhqY8$7!ʞFSQb#~9~UDCjdf5qDoz!6烁nK[#f@~#A$fD i,s uՈ)@q &O'VA6cݖ6Y$+GG h)~K%Dt-KIqdj_bd4àPCvD9e9+i"*p2+h[RrI},eǪZ NcaBNGPp{'A!=rm'8jFo f#EsT0{LE 3Εp9ZA*"o| Bئ[u-Nv02K!h+r6(; SziFbdE=IRkwd|piK/~RCૌ?H86QƇ)ryd]lW,?S˝/D X^VWhKF10lP੶;ذd;n8%asgJ1p  $]$*N:wV*7W`d:pd*%tzSP{0bLa:v4"Jd 15d+vHx":٘Q ©+<1Q||Si{ OT@vÀ^[ߝffЫ{@=SE=5^_¨I`WN\[98nW.\]$ZU=&'t$#za jڶo]⛿8h,h6v+%Qmڎ<yMP?#mI' k=Z݌ʁ g:~n Sxnmm: CԆGyR>.]idy7PW7v/8X őAy/pG-<)9_,Ec[0v sHBC9SK,ovO|ݠ_7B6g$ dM3m% uk+&A+-@y ~u(WEnT9=ĥ5RrC_r~1|.AvHOFlMʞrc(]yIvjPO7~;U`l/7? p[M'5\91Μ~ZRJoC v0:>ۯKPxvtLgT( ӯÊw1 *x.-%qBΧ!+N)j.e1F= VҸKe Y"Js%|#7 ZDw=G1Sll=GMJ羃'ec.W@ppΖ-yp϶ۛ||WYT$]& (J3&5̓=g$~ tNnM?#_!2ZKMqtK O]3D+xy6H|0Lu%5uQ؈v tÿxpܗ@9h/~ο:UagG2z.ֲ0/θIEx^x!6!68[iqBQ)S4ix{'֏  1vXێiVp=G|"],{[IPW dk~{L?/ƛ`[wݑ (.ϘP?'T ֗MqSCqx!Ha@Z/ IU  Jy[klZཕ8 w95>D1I=XK;3`Ӯ.Mی&Q0'+4x(հ0SA$7>yrx8u+;ȭs\{Mʌ4an5&dş9_);w(\#ۼ.qgYjUaԁ8Ig'r@ڭ" ܨl -.*i?) fpwi/h,*vt<9Ս1Kż oG`Vʉç0 QG8 U@_+/3ٕ˭а$ _m?*ԝb97[]dD+:Sj%"1+\d9Tۆ}=ԧh>Ꝇ~Y9}n7dXWD(4Xjh@C* d{ȼȴ5V ؿEuzCxE[h\&BColl,wN;y,!*n9 8y24-㙴*!%4!\TUCKlQS]-I#j}TH }Lh}^c_a:w6A-^m]}g1|LAQoJۼқBf)2u?*`Eb  o3 7f o6ފݧߢNǮiۊ#[XKIU"I~*Ty˗Wv`lWmqm>{Ej!BLňFPBqp.,4so*ʈ~|/I+R& ?l &ֈgYZ~|yp×CM~`}ی<-ǻD ǹ̖bL`RL yO׶EP"#iRooW}ZE嗏xX~CDZINJGKv0 w1ZżgkbY9btzj8[.- 7A-c;!,O´i_YduۚL-' IY@h{+aINA{[?,I,MH]_8JclfCΎG MA2Tsk%]jRq%/NvjP5n,u5}8UAd=\,@*ٴ5rNh0PHjZE~99\sW/#r5T , = m %E@G#DZr+^59dx7ijĝğ4B=,a&9>դzvMLCcVO^1"UwpњG~ ?#(֝(9B0O$b~)+rfcJ\^5|#hRIGXjlԍUdÛOd{C7n|i(N9\ aԝԽ[ly4WvyefA`ڹi2{ur#,n׆/ 靬wo(F) )Zey*:fLԽPSRA~5R k b8qI OcZn}_P贆;QΗJh?ׄŘrV</R+,v#/B)I /͠Qjr\E@fĵx- YKnl7j&Z/ }@ ^e|8=S^ >ΊQ pknc2rJ~Mt &V жy|/dU@~ ?3ijn ,-65>%Q[[LW1bck1_q}#DGpޖrNM:#7 !&FA4"O)D`x-_9>x/"W 4 dx !NLDź|cUaWVeY`ǥ%xСV48# Rtz։Py+'%;N)i.m32E8C~XL¿S@6fB f8՞H G_reE<xmuʮX9؅(ar! @}\.:7^w>:|~Ӄa#Xc߽Z'("#;T~ZmbGE%бӪq2Fr5kh=ʯny %@ y1nn[=ZF363kmbT<lOի''3w 4bBgNܝ7j#L|Du3띡-nP޶@ik߶f2 *APdB\wnݎJk\}P$-s@ޔt]*HwJzveiQۂd>!lm5)Nw$:<=DS\Gu)O%n;xf3ߞ &Z$>D 'J`:@&s%w/3Ȕz9 (A[OC:훹Ke O"j]d-6NꤣuqtڰC =O3Ҙ3C"bg\)n^I&4=OX|qv-ukV9:L[QңM3kw Q@7,{(TZN^PߛOH`fT+Bvn ) +  #8?/::M`v ^fOgiI=1ƾ̘-(?V TxCyπ:aO@.d}p{O࠹Е72Iv Cp+&ڞ#Mj"W}% c3Qw8AG!'}݁`R+>"k4tH(+Q.0*5BK^QטʹeN3#[[Y0iָW5ov ʜ旓%e NHM~Ţ;+IJG$/v|;zUj0MIw":. mj@g>8C9-x:;*ly0EGA*bHܜy>M+{7]ŭ-9:LŇW{U%Zc%>"^Z]FQZ͢IYa53Br> Xz$83\bw>Z#\nsa:w_v˔Tea;#g󅝠* "a+o$`uX@Y F-ul8m|젞0-ˠ6`G+=j~a~sE%IWm;@ƢSyJ'Z Yݡ)֐}Un6vpٔn{]}YȪ(ZV] m[w8,꾎ڭD'!Ss&}xךU;j*ҔtWwAFqrv20el!РerZmNo,U; k!SP|ȭ|k{(d\*;2 \ '][;4%rNOO{w!$RsR{}z|5k; #V{^ᴿ.J7211Qyonfnv_QP$ a1_ 9 fb( Qx`tqC2^ I6Y m+J?ͮQܥ`Jp՟ciA Qcயw՞8_9tYVW~Bds<D >ԕS"3S'"'-^ɞ ,R p/.ɾŽ,z@5ƱiU6) 1mZ&#v_E%2r")CCAd(\jzsܷwR1*Eܰ?ȧ^s) \ u|cIi]L0̵kdW]ܜ&{'f}K<qAL`kQw^MY-=z0XKz|xB/뻀w FӱHWI^~9is#_x z'-gVO(ZsZ[oݫxwi/dgw"'X\^.7fj?9Q2S}]02u⥼CM)Lv7tc9I+GLVkv".Al{K(a1a3h/5(i.a8eAK q->;YG5J^h̄;|sJMI?k>kSs2K.u'w_lmۏbͬWZ῱cb13 gP4tͯ&nP|1ns:sId828S7`\/FT}@hܞ0 ؖßuOBpտV]0oyƻ7Rv%{wLv#dmrZGlvNb &ż2U\v2۔1807%cq#rZEH3gtyש¤DMFU8;'SD}dcsv> \Sn0gsvAMdX I ) D =$3xg 7eqyᄃ.+=Xj4߱G{cS?}`E%$'N:5̨-Ym%|8HEo2}7[]ɀx][35 .;:*-Kj]aW7uC!ֺ. $w# |TUU$+)舜WnVID^5lua7ޚv]e)l4zb"U|#@i4%uإsפֿz(^yZd4~僔&-AY[`Y+Cqv #-rT,xX:UL}"񍣘\&O7ja11 7EGm( !볽i-oȁk1,+Ej#@g1MYgӷj`Q<(< q5QJ9@H#^xAƧ(`[o +:7آcYПCCP08t=M\S5爯w!#o_]?+ E{i©Hͭ39G~>q|Lb뻨ˋv=CKطqL =) He9'3/ۤQ9"ň0XT̪Ҕ}%|3׻ }_ ^ibQ뽿Ak$,OEDqAm.9ljfCHHE7L8ӆ䣵Դ0هR O,>ͥxwvĤa90^ 5zGo<1uw0/D4Y}μa#v-˝;T>O#{TqYܣ2HKE܍RbP_Sm$9Q5֦ n(-ǻ)xbG]wsbyC<,u[0~Hu.VgO^- ?V|l(}|/\˃ ]1 њ뼀I*+`&F>&}-ϢbCJMqq_zhnbBu@}wޟ83,j*Zɇ]A1u>4#eA6&-8vee#äPU7'e2.goA4?9-թ,$A>6@ UggrzH@<'dsa3}pu#C$>ePup[df;mL%ԅ U+R^u>Z1+zI&r֜>n cPʒ><#14Zn*V3 * wN@ɭ & MĹ1E"hV^)GȥܷOq䡄@4ǜd!EBh4 L?31H\rvS6Y߆ '~\kt{$yڝn_Mt@`/S8s૗Afh:[ɬQ# UA BX\ך&BLV?B'Bgh^?7֬hA?86,*˸[̤J-ȨcචHB!\!_o~XPj`]ʸ0tt7V6_M:FU ڟzU BQv%Z*rj?3Qz]G {.<.ꐵcEkg \oa#>лT̋bU0~k{9e<eSZ} ۛʰd摒_-@%2~q8W9*7nH 5 Sf*(XM/N$׫k[N\1Fq6b[ r@F!1teVρ58 Ycod_(e?hSҦ!zƁb PqWuo_tv1&=H*זIu_1|v6u#66ij)ջD ]u/F$Z ~ɠd2Zn bRv0@ ϋA\ rG}A\_DFyd;*` -&{bcʄ/91R+0ʧJOH6F3y3xl.o2 sTA舒&ԘNٲ) 3 Dѹ]S@Y%ؘP~+Ju޼<n:#W5]q`2>d>SB$.\DW(/8 c|$vd5 #FW3TY;aLk`?.%&\8C~_7,KJҊ6?m %Ǩ ,~1pCsԲ;̈-klU41#:UDMC nm"njfWӱP>xԴ-ΘWRp/KA v|2R_U$֏MuB2n"9z/^!Mr<Oq@͝Kbc /~Ȏg Ű{B٬.Ŕ}0(w.f&gBesE+.֣If/4"Sz;8?Lo}xĩ`C.LC" ,SZԈ7Ze)ux*gsuSm1UG sH!}F>qFyPa0w{ 5Y>ŵ?+J^HB7 \QlB-Ht]~ #7oY? A;Z<7^{f憂]f|H$<8\`2dQ&GQ|h1X90cUEح+ 2۬qd??>$#.4˖PHOs7Od2>4OCʱ?XQJ}J9)I4I _ ;?dWh%Q.OCz+1RYjl^85Cd.-&Cq^Љ7+ DH>LW*+I;d:V=Ӗ'\jZg:ԗ j3?QJs?g&*yCάC MvqER z-x1>Xfٔ?v0 'GK+٧X[kA3"ʌ]/x /(jtr`wXj_&lJ3lfymK"|1'.'K4)F~TYYT>rS o;4C$A` Vr(=m|I8yqHA=݅VuҀGHHt!I 63YWAap~.(}1B*"nn:\=1 ݉v置 ƫ״tLUDLzLEK;42#(3!<)b/L\j'i l Rc3RTP@69VH3/L5Ʒij:}IĀ왅m{p5t4P*$Ē808tnƮnNw|vU/r~9mj1n5bc2;߇-Pg?yH}p%@Y-c7!5MJ}Z JJ,O:*vɧ qp9_iNa&G< [lA{DrJb}9o( Gs[s~J."ժ°CޖQܻH#LZ۶,XU",rw7QAd3i ;*О=V-QA 90\ӈz!ٗA3*T& JKU貸*$RIv' 5,n~QH /hp] 9d?!&ҟPK 0 %Qc7o*wKfLf@ʱ?S6WOoYӺ֯3J}|>gUjS=w!z}LY?>9c+hSbΫa`8jD3J_W"ءiPx]:Cdid'KFHc]1N eGUTc_շ(w/gxJAA}mk"N&xAt.,Jm^^²"8$J pݱ-y BkP>oA]Er|}P(°z5H)!:/Beg.Ȧu$yaݕNȒ hdzahYyL5D%0}Z b})_` :@=x];i0q;E``1<`-Uj ՠF&rJ CΙ2xgZD#Icy%icA)O=ti<%ѨC+ݏ~Vae jv;_w9Z.H+JU)\<3qL3tVޜT,/ \ W~csE=%R1Y8xtm/.HB*V z]3Iez$zM *##GxđDE`7ҧ(6Z.ص ǝD%'.Gb SkCKVTQW̖]px,c @Ԛ/sQ>-y :29O O/`;K啲VH6}(@ 5m?M -Ǘ1: R* nLt$I7R^2v较d A 2 Y?4Z|1]pCnE|ȋFtgICc<ͥ+XR|oR[ ct5'l@4V aGfMby_v~@2Zd1 BqtVC̭>Le.aI&Rȓe($W*ʯzIu֏b) ArQ~c-U&+%r+L=[bT3bUJpIfŭ՜5vK+zi0Ta (&I![+\IB+PňHpe3+\/^*b{KMKN\V$i[B'Ma I Hk͘}`c(ݕ(LRozJ9iblx_VT\8eM̠ޅ}Pzr#PICm=POFEQaFV3kT YL0b_Ji8:52B#9?A'L#l-_NqqЇH_PbzR#W y5. lID˽ˑCI_:q `fI~ Ɔlf#2c(RMb;.jlH'yΗdH~? V6E1FSf-MN?2 ӌ Mq)7KJ-AP"H9GjɓL)f]q7$~ř$Y$>R!r$|26.i!uq7.~'.16g8/V,K^rhP:D8:Ej _bD~{KOpY8\Nx~Nw0S8+[eԐڋW"ȁ1y' (^c}ZsyˍNO$l[- WM7'#$ׇ i{*^R-3>y87jiƷ. Ui@$(!;ΟKd=%{ڑ6|zi@Y'LJ>&s& &`I -eDl` >NؠXy3XB,p|Ay|thT'!)af:Ql4(i5Qd}-1exw1<ֻ[BN-Sǔ|X$9ZceTJ@γ #!dj7e_dC)fk/G?̮"wtIZDB (.Cw{#}awpȁ"F]^CW@X/q`&=Tdij?;ɟyz)-$bb=n;AI@F#95!QHCqfl_vz͍qA⢃7"]HrX?B Iˇ!ApA([m#EɑѮ:Ojb)IǑࣸ&P&tP !@[|nnKo٣xb|{)^2??p14u(u%4!fbe%4C8Rca3ߐ trHJ|~&;8JRF\>AYsqLo***p02)e؂!]/yXbcO2ZZ2)i&2,1 -.W,abކT_99)ݺɐqcT(Nٿ1:f_A0u A`b|8l"Gu 35ySEtQ6r%H qؕFHb8]%J=E0/Vl}pzGqmuI2\-Z1Qd/6^xH"A0NyAE˦#1hX=9|tBep4 MfצS̜? 1BXb$*qxs@)F?C Yĵ.2 :$O14!۝ bzer.yi QjZU~UU@Gm6P|lpsS}c]}3x<<~X xXhRD1 DGY "8&JiY}tM0`HNaBU:ڐe5])ba"O [!7e(:iTF;J^gB&TcFm4Ķ#@r+ d"Mf#/Hz$zb  ''[_?5 c5B#GRS_mc@BĐAKCi?xLdkhcH>W:" A.vĈ>#[n]>*BoFGNN@fYG0 eUV"Qt/)%u,:f:)gl8f|/KrUaA(0>Q\'|Q ѱ(!2ծ\ Ed $8h.@tP e%P-P-FLE8>\"u`wRY!`5\O @B(td7Ђ)CB"pM/'6j6I&: 0C0R U1aQ؃'\Zo>:"CFw嫗G$GBZ8m0wP^GN Q?YV< =Ű5zb㌜(lHr K"GHB"Ї 4W Qu"?UL3EQ 4),1Dntp5`*XBMY EEehJS[Q2@ rC% JG¡'`A'a8X|'6H8Ca^=Qb!Bdr"1QB%"Ȁ>4džvaMLDZYk:c*pÊA6cL#Hj54D"[&f/B=ӿ AbR5?P}r!j>֧L}2#"X|BF'Vc8B1,$Q[#@99N848EHA<%$T[ZBLj#"J5B@mrb*~26F2 \2 O?+-RF )MI uDG&@y,h)(N⊬I[2hWS*Ή@y)_D ?l40Ib&< ~0G 6Bjz,1qTv|B'Zѓ <3yS01qB = BxAљ@0#B;?$ M5!74A䃺 ɼdDGD*$Tk!3ݨ I>teeworlds-0.6.2+dfsg/data/audio/wp_ninja_hit-01.wv0000644000175000017500000010242612140200333020716 0ustar felixfelixwvpkssRWWWGHJVIeiB/ߐ߿Mo/߬29)~t/?П,9wۓ/y??aN݈nP'$W&RQ8i/gSljpܠNzȉSE^9(ǔG_>jcȨUHNef,?owIdNtf.hN QP8\r IdD7E~L:jÚ.<6;4~_`(P\tw0ܓE>'tj {Zod`R.6IGՏ 8\ubA üjEYl]$Acja?x(![[뺱]QKAX ^]g`D63bͺ0Uwwz\ ;jVb_yWl31)o}(B2rXN <|yy^gK-Gn3e[ȶraJ4J 4lB|7Ǯ,-1gr~4(bOic\RL,u8g55!C8U% ERXŖeu")V)a>c(scgu!_q|V-2P՗%glaalH[)cGܨt`s}cEJ(ۄ|<?( 6 Qт' *")3~B>5,Cr<$;whf{*1:)&^Ƞ7Dk /V;"5Aد>ގ5`,+ɳL \3ji<6(rU48!3+ N_,z-nmG>̻\ganx&^qv!I{0b-ֿ k8g/"b VFITTMY:25P"[GN]0.8mgU+lX &#(*o^1hOȢ\Ϙ򎎮VMY2kAc*5ꆖ4>2 Xu 7/%G 4[w}?w9[dz/1~HEto\0s-ys5vn(CxB;sx*ƞ<x F&`Saz 7qyM: R.aOv^Ct2J.@?Tf!\Sz]6ޅM|{@,k$_6٘??tS)ܾ$A(,M 3rĩ43kp|I~pb[x65-'"`%Ttv8*SE(bD؆<<T6W Fp=a8hb8Nֺ\***ЇXwoMvBW} \*΁r乬.o?Ot￀U!.Ǧxp1lc;u^C7:|n<-v&تx ; H⨛IKS܊Y|輈Ԯg?_uOYaӡIvSoɺ|U{GT92ұjy|LLfv*s)e߮1Z7y>o&h5`kiFHyDٕQ#_\nd%:i$R=/IxxGll j5̔c͝tEOgKiaϸ;F"Q i3IBSG@\/9>`Rʌ(xFW;r<3pOQ$( N>F' ՓZ{Aj{5g3 `x֙Ju2Z82ZFyN>]BJ  &:|K4oéXqE^OmKIeO&*jL'؈^U&V_ ޯ](}!Yy!gCDĂI-lr.l98Z?;F+ڢ]c $^GEo!In@ ݧ&6~nVҩ.p*Id"~˖Lq.S>N7~t6K2HlT8],xldM))Wf^-Tc﫝%d֤+:D 7jU#p$i=:ac_<2c/K 1ӳTJ.:_5VA0MUg@Jk 8QB>B-1DϚ8Je^w27_Sե4($4dennUIM- }7I oŹ7)kC@9;wsYɧ?JOY)Ņ.pA!ʲ+S/W@mMDkgFH}oMlOfA1򆄡9$ܯyQ^ï ſeb^P1|Y\pqŦ`R˦&֫TE YV/9~9jgng-XeߨL(W%`}bink'wwS k a:A z ,z&_EoU!:feVpR H"ބ4)z.TU~{gVP OX(:E c1MެAsQB8] "G==!T=PV%tBĚKb;h|"3A 4:KA荽ls_ۑpt;lA^JZ?&dfiՏ([ P;} )ޞփ qQz̛tJ5gC6v7-Kn9582!]­~?fa{Twh?_" Q-~x\#)A YZg6{Q_ z6CcDF$\(mЫ+`R }׎ yP1>@xW\u1턘u__=).V4~AAG 3L "E-p?ZY_"3a@Mlzlcⴲ`<nV&uyT$%LO qB)#MrÉr]^t>Zw=0@2+H(dû\A6+ȦY"m?0Hf=ږI!ķϽ,"iH?x[k#~Ǘ/ WFw/\|Qm,UZ!_b,DVNS-]TܽZneF.Գ]ARgDG?+F~cX% ǧ䯄EN$(U%~$j3:pcxOMDb+Jn%=M??N .}2nw*p0:J4|`<˭nz:N 44 `x5Ӻiö+tXQg5o&mۨ@ _ۑV[ v4}?O u QBi?sr<:eB=0Et( yq|9T(>}Jw.͛Dp*PM<@:0þ¨ l!y@i+m8q~ :Xos˜imhl&ǧyLAj_CzN+CK.֗hFrF:8ťOCgwZ Pb|{=7Oe} qv>L! ^͗CD!t*Fg^\[4PԊ5 čwtγҋq_5Id-6DQARyIzoϧ-ޯn YaII&1ifI/Q NˤT:Nwh5MVC'Ja#V 7Oۙ7;iKq=ip{5Cpݻ}N uȦwVJ:RS"bFMD$,\zVx/-{Wř꺋%"XDƔ!7G Sx^+kT̯B JRDBOt=rRE/kқt z{u6uMbdZ‡mnFϧJ/Q>ٞWmAZΌt? jBosp11?5ҧ + yѰZD:j%ҙO+<+ʾ+K/ԓC -9GOhG#iSKJ:-3&x9rkQ$Xˏy5*ުVF6rKC'd\b"#[ۃsd%M}.;y99űj-!A-T=.AxCǧӞ6 +ĥ?7Έ5M j:ZF0ҳoOc~_lb!kܸI;z &R6KȒ:@EdSʼn7v(r0zL8*jN  'Qֱꥀ*]k51u2f-U𘱩siҜ7] A@K\{8<@ '5% ~K%}86 ĭ;$p.𵩇ɯH:Z.:TsY| Nrӥ*Fq}%e Hb;L0CA| Ymuew /mK Nv})ocKS \ Nƞ'Gw/mwYzsERUsNulSLuՃdAavE;9o!ɖ˦D}fīu Ci5Y$|+Ƿͻ4)~}tsJ;|RqHn7U _W@l}cWF4nbNf&L_Ɠ|3#N_8$(w` CƬZ?ZKǦ:Z%RCW`oKfFsX{bFtˑB5Tܧ2c=D+9gBE|v#H)xZ^`Fʃfᅂ[?<(ܠ 8HNJO-p;)b+6XG@pjN@i;T]{*[še+/c0x(uaRx*1"LYnr=&iY' jcư~v|L{y9DQzo:дt{\n!Ya'lK5xju?К/V}挄9 vǠƌCTk*R1dN?-.Mr6O3y8B)3> |O)V`Zetl(x|(0ğ,L2ER~U^1os_|Dh󄢚Sv[t|LXFWC:&-{DArz8%ODPh.-{BVB(ofCu{Pn. H+B>7?u[i/&h,.Wwv_nnGE g|Pr,<5̵G$A&YsAQj~uM/uׯM(-!hGOwg 3_s"reQ"Բ3{OlM(UxQ~'gBh>xch"[nNAxRkTv_CP'cz\pfҁ扻Op.(puA NHvsKkT$`szW@~ *\d~H>Ki-UnOV̭K CZT)Y_~ 943zʰMo,a5ڨnq(R([$ E3|e2)sSv8EzϢR9R O8~[`wsy^KWӆ6k#k ZI3,d:=ZuA!^)Qn,1u?7m.e ?;{Tu螾[fIxv I5nj 5\6M֪oᠢ 1.t[O wq0+ɀd2"jф_Mhu$|7`Fx Fjp摛Jd\,ʠ7S$?*eE14¶JY$D;UC(oNݒ+(%0X7&LVE)ڲ<$ tK-5*S4 &w1SU3<7V4R|3nfgUuyft͕F"R4t13\sfquMn1B95OrX4` ;nۜ0;}! ;6Y&O7a"8WIVp:vxWdwC4(M+j 1Xl iSls\X{pڼ ^P0۪Nyqpu PPI3maD,n*%`a29cyHIVR|.;H̔(}zjc༨l*w YvF noC~Rx &-WwDY!."?u\]p|}$\\٫;YR6j)Ʒfu!Ytmz8ڻV4"Sk^W5òMkK }8qayv-"D̃ȁ̀ՌwH7.Bf)Ro^x/!C4u=7dLFW9anŤF0_jbx:whL+!LGc塎%#X=~@$B&(>vnIjDldC?PhoF`)|f ʪ nի\IvɖY[O>DB7tXY;w;77r#kwTl]ǕnI(6[4jE `U0L/MR]tʖ/ڬeVEdI亪'W E{E)uGYh(@Qa5e%--}h\G!H?$d k{Dt(g]uYڌAm'ʉ~/e NnlllU+9VQ;%*EnMkB]iF0ʓn ӡ"$he08{qBHFİF&<=G/ *?WSo%LRDpqR9҂^)Yߊl1ƥ)4^]ݎ˪XQwrȌUܯP.y wWdӛmϐ?{x+~ۈAK;J]s,XTx~rm.4-^i^(z;iznwq'RbV8\TR^u:q+YN\ګ=ڏo$-M7iw@-%=XVMk7;I^Hq[N$Do,ac|NԌuHb_ VH4NuojyPy#{<[ @`H9羃bKweiHqp 4nӧ¾w9sE,`3!]0AOȈ7 4$&ȅ^˓q`85-x: Hl06:CCԑɈ|JmuweYx#jZ]f[+nw@0E x(0Ad #eC( u!iyp72b[ep_oW%8p4*{ P֫`?q͜2>؉~$=ͧ% T7nδw\hاjvBc,%bin8vفڡ[_'ޅ&5=!mc|r2,Kyfui`oiIk/ϕXϾ9i ?D<ݝN^m28)ըFB}تOJuh KBޫAD5rk@C . %{ºSرRZR܀|(qЯVÔKJdv֞4 &:26d*:]Ět}O4cʭў8m:L˻) ل$O ݥo[FC{"DuˇAӺMf:,FOp(-Nt9PQ^7,')J{ B.}_xYogsm]*syL_½X`fūS)܀.b/!yd?Mm׊`9y(r7z Jj~O;`9Gԛ,/G捄 1Jg+ 6tWhҭLO-oCdcw#2!O #j(x|EzEdF^E8Ma BҚ,AN0GbsNDK-FЄu`^E̲O_ !+c9Vi5y Lvh^$c8tE.NʤVp Yeٔ?*C{)YZڕGKt۵5He(euTs>>Cw7[>O֫&Q(ԓHXHHAZJ(st&T_%T~J\̍p;<3U{qu;kJ pT \?nt/@X`/1U?Iu u˶a!lz usv.qzJr ~!*S0=c/oІA}$ y\ѽTFfWڻ^VZ,ȣ]|8p:.]OLw"NJ4yT|jb}М[ Xm*@M2I6 Az^kuJέLznExȃDj@&"?JiQH$_9DPb`L ⫰.ހdJt(ZW̨Pj#;Z {e)9fײo𳥍 KYOc͙Q3.VGMPM7ow.L]73E&YQ:l@%39sa񇌽qfy)H3;hHAriŜΞK&$OPTQKU-6QXPV>Vߌ)+)q+^7ļy¦%+ Uc@و/HQ: zcidpnktK[";;!6|j 5-H½FyuA/ 俈r22Дo?",/!)%Z  (71ȂYVD88r[#¡|@eUvk㿊rau99ucgξUu~O?pD%zO>O z?T aWUȕRnb"ig ~m*E|X>,}EBb߷ kF^F~ wDMWt^ B3t@[V 췤3W0*Y}Fu>4GlՐaf?/xZ5mTFOZ1?Y.,ju= |q&@u\>xCZ4ӗ|Q!}#o>Ng3Gդ{RRn@mt~Κ9Nt)h?xO2~F9t,MSŊم7u^R'[v21}1,9gY^B{GWbRb3v5)y 6RlgUɀυ 纷)v?$QS G^0)quiGv*quGH%Vqo/jUbbnl)G]:̓X,Sm3tE=1 Ty0ճzJTB[>}~NX|)]2 X s!sÇbtp}Øks*ْKGrESAw?g"F9Na3pYzr3}$dU]-6Z(&3_$ Zqj.ߞ(5P9iO 3n1ど]F>fCf k[!2_B8Nb|B㯿^Q`V9Hi9Ii*1KY.Nj %PDSO "CqWTuPiD~'dmCS%ıR"vŴeK6J6X̥O|c W MQ0l2ÈX6vo?q(!&N x{0Z^kfW^t|(K2)s"Z.I^i:l h`-UzCB R`< ;nk-; s3[X*wm Ǽ- '娓Nr~ I'2JIl58c6ц z,5I\qv0wVOM8G;rd~9"^Zm;W~CFOS˥f ۉ!r!, .__!!_3?KDrfe !"wZ\+?)"o eIFslDw4|5$AnI~,$*MQ4(7G/vD7Gy Z݆谓elj7#7P 3{ަ*re(y8emW!zwg^$)P)^@;w )bB˭Ck$|j$ua5ܐ}_.8/m8kZOsDW!7]!`fk(uQ6KUVԔ<6/quĭ۲ǃau o#k#VE?wVtx7XJu?Jg]'ϝURPcǒR!\gX+Hl(}[ MLi\+FO( ~r݋Uznok||ᐐjy+3q j؉zoZ1J8֙35h bg$lgpy 1]q7tD+L:}D!&O %Ǟ[!Ȍ =qvN}3.!$>=7*åzGpV@DxfZF[ΣC &]Nt:O2(wODCMSZଦ}m !6jQǭ 9'$|͙+gG6$d+B!mrQx]o%b8`v qN_ZT"amW @(ϒC`cT{K]/TEnr\6!TF-_rRznKI7U_JaP#5>=ۇ 5~])*.5r/q YuxD́aVx%[OB|DkiEymyYQht7}:8: nKW*˓.qf~.ܕ@A,}O_׽y|yfP'nӃC>ʽ#EE.|/@{mWsهbQj JHTraDAuL/h޼ ug_ƝMj5i{7=a_ް5t@S@9/Òw,^ n'jܵ)8depީv;Jnɷ1%ֱrt@m@`VlqN.3nPG>}banH!^H0yѨRb Uf&Rfcc ou_=FfuUD>i0x(9wM@:!I& o&Pwng'vUu氝5?[sEuOЬl>4 X.l ^nm'wVYJ.l9-kE5\:|}vY=>(q2_%?G)j*OHZʊ)p쳮n5"(^{A*aסus/u!7a·}U3ӡIܥN ޭViilʲO0í&9☓'vXhb M Tz1OXû2u:M^#{j*ԉ)_%OT{]N{>=$ej^ZZ,MeEARʘ~>i(vчj'r?YHp,pbI5Q҂HżAK`ҁ:Xy&*-'?2 ӹr 8|l]G4C)PF`36]Lz-6&UOhG#z02dH7'o R(Zx*TteYe8.YX8/m\=hG_5Nt;ef; p1Ya |o~G4?eo-xH{^5FdOfZΓ??;C7&oЊhٵ/I k8u/-,bvRU6YPvgwҸic4U3cihSfgh;~35. 2(*7얊Hd.XƌR(B=b{JA]J$05@x"8 wo(֭v ®6Ilk`pZ8L)ى1`fHoRj$=fP`tM3UDG{jVŠ#Y>DF` g;m5 )0L59Dž`ek?[ӌohA@/]ʌl||Jch: K6Lh1 +LD[8 (ɞ)ç} &M7rPݮg-\* f.M32KpYԒ^+b7kTjtM;g?ڥFsbY~9MK\:BӶnWڟ$Yr^%PZ}eY~ 3a~M% |P,`N?-A3̣n:tx/^)G V^Y%'YG@؅˻=f3Kr֙% 0H`'v\R~'" HCE=0捈dt|e)PFZt>X%xa *(=#&316gh!y- ~qHG+~(*%+d|^(0Zy pl3/9#)|`~t,ނJ"7:8 rfqmI=FDix.Q^Oъɔd?2sIbBc!:8Wx}:1D249o:ow:qJߥ9eT\:@`CbfAv78>v\~QE^!C%Յ#졫Lgh*ڶ7z<=K6k"_n0m4). +)6,C93'δH&WF=5[fmb! ޔ9m~l1Sfv#kz4]y(78p+ɄN­H(@!zb~K5TrQ@Cx)]z Y7ϔS0Ls_7=c w:߶g>uAjX?`łl4qD ո/ j&_ roSR_N;,j̰OZ؋\;pԶI6OK,VSI T[U3@a2hSuo~ y7\iCg9VK azSQ4[y* 砵oS n}Ew$p-Aڋ]x~@8KnhJ2 pɠ'Y;o $xHBrBjݩN$+3ߦ\xU E 6ka1Nt𪷖S yZK11(gE^ &|CnM4pճl"c߰Ǖ qKܣ:aNIs}bhQ ˺,4'X0ow2l.KQy6@2j[ޑ:Ϟ+vsv=ʁ"FHGkk5dlUmi_7` ~d3@M&SvL?7' AxJTнсy| fџQ"80_'+,V ЁɄ$Q [RTxWI,dR¢@V ]decq>$>%Vӹ<ɡ*$b AU8}n-w_jV! ?tҸ0~s47 N{\r]>fZ&[Яl:M)jro([ٶ}0;"PPdC;*{pΉ <e,#0#kx۽e,/PLui}Cuy@3`b?Ҥ%Pv^YaY|:Qq렼%B#G&u=Q<1EaI:#q?QT(V %а88wozG䟜IV)0%EwnAYc-&T3k.ŁNL9cY$1--!DȹzbF',ZC>(i' l''@괸yb*:ziݝ &4~O ky1 j 5,GR6xPYwC~)bGn#mn KERUE,vAXw9 z#rҤmLA2|JˀC/Kj"#n`u  \ʡ썤8uިࢴ*l]72vS]rA\!G Lއڭz @,\^/ [vlgPs0ҷc {s|J+9=Oz賻y}^,xʒ wmg6 > 0m6{ 3#6OGz7 '[ʀ*NjL\@fxo}ٓkrG1tdAxײZ@1gT }YXAaj tf 0{S/-0<] X\=F 8KN!h? 2_0yCي2Q24;@5Y_'URL'ip@Vx/l Dn£!i (C8G#~%ku`;uTQŻ!bs(|Oޢ%^V2B- /GzJaQ(D5f3ҁrhWvN++ &&/d(} W6kHA8vMNjкp烾 e0mWv#(^R^]", "u1@gj a\'jz^t!v5!='f%6 uk@\r2j.OUI`wiQ>gMCR!<1lł.Og ŵW66(.o&?'x .¼d<ۮO܉Z d3aދŰ PZ}WG2[j_[ 4-Lj9m-S Fˈm_􎬯Z4?+ wU|dd28oJ')( U} h&+h5_0$[s C{ !t5;V&](Yn!B??i~~4\Z ΢A(u:!}Xe%3p ɔ嗢NTמ֣ۦ p<|?>{lk^03qnن>/4~\>7T@dfcE"pz^0X rNvIpݣS'"JM5]i4Jdc$-A[ڹJ*dy:L>*749*,JJͭlܔg 9?fA̬wQ̧/*MU[1X#qй<#rPPYKֹsh8¿}ϸ2O=w E^ӈxٹGK7kfBU~s 7Flmzn&n$vuǖAB BL0S䷛Q}9֢:? Ssעm~HW); =P|\94I<SYI?e)l6"F%k- ; /6R:kq MJz^c -&E@q ty;]4!WaFRIX L@L]8!)Ҷ ƴ)/,~jQ.2ՅN=VbGMb:vnt?XjxO3uui W `PSvO?X@` s[F>*$X srDٜ\k9;3ƾ[؛wզ*%+ⴗGh[lE¢`YBV?!녵/W^O&FI2z㩰W(4Tf=zx+]tPI"N^9z< w=VE#lzB1cΗmo/CF=c"% VY4LU|f }l&o8hއ,X|:ˁ3[AH^#^i$uVB7fa-}f"h| ǔ#^_T%C1V{yo;hؙE~$'^)ڒJܙHY x_IqsI7?^G6ko<9xW~Ί~"voT5ܞ fؘXH(6aG`=J1Bqrb-B ρdߜU$hCTBs"*:`u`b6R797SԯR s+upbvnG|7$)Nm0YAĀg` `>;j86XkԘ ,V#yĉ#:i|ymM6Ρ=~S\4剶ޭY3zjWxl2:R-8a?!'0 w3]'#B,mP {=GLB"4d‚4I\}u%NVO!9I2w }bfkSQ-h5>/ 7DCQrVlQ m&M`a{W1ip*n6P9W?\A[AU4h8LXN3GbŢx"Iخ<ğ_BP3 ]Q1ܓI e1I+jfD!ZRn =3[fBcZY\,N)b4p[Kol|&w"thqubw##* g 2kvxsqPƨ%9 LV0̦EH G g9lWx%nVszg H:dJ!ȖZ۾Wmit%xy_p,SJv3\sdQyMm_sBxJq[ 6k{,{m1ooz}g2< Әls{*"瘱E}ɳS<,kZUN=dS*P 5Sw*zhp$+`bKsv91!m/970lP!aO7OTjHP?dӿXs?IR[QnR/UCYp,Nț΍׺iUݒj6& nk;>ӱ3wwj޳T_J ']nV܆4S.4Y"pIȱw"ЫFdKҸRub?D\A2:XE`q4.@]w@mȰL N_L;,9T.zjOi~ɖs,= H`iݮrd]_sH:b^Ӽb $(F] l~鱇 'bav T4Lei_ФTjae8 Bˏ`Țz\]S74g]FJpқSqA? /iѦ1#.beR\ #yF$}[ɰxKA}׫:IIy]3O(ܨcDh]lmh ob/ xblw&ŧdH8}^ȅ6h,߶6Y\RewL$SSQ>+f?KQ|M3N\xw,Ȋ<]|oX*ӆze&бәxjQhO1"iȔdc1'ee5<]15)K؛bRȶ1QSNY)*ڬp腰#Sm[nFҘJ ӟ>nm b`kC)OyR%!.vXv͆.M.fJ׺;>P:MeBUȕNa15qRXGܗ6]WZ-dM?^ \sҮr&CgPdg[1 cbCHJA`7.UE|nxٔDA$_S#d#nd+Pd..V Q+(b B;بtmeA x 6 eeĩO 5#}4a+dzlm&7·kCxe4)X1rͥ+6Dt&G]D܁9?겞P8QŇCX)ok(5 W :~)t6u徹Dcl =7l0(zg$,=/T,[ox9O@g@MEkG,S͋A{pE8?#[*yP$ҬMf0fN [?kϻr)K頛?eVS y Xg0Z*X޷|n5-~;OܭI`9AIib c"TT,X QќNO%QyƿӘ[¤|el=>Oq3~7F {[ ӼU]WE |[zHTr`[/ЫYŊ3lb$1)gX|ښψ50gxTvnw6z5YHkM#O{S[^?TsId%,Zݪ_,%TXL-g`Ү-"e13Ia Qk6GZ<.MkO1af$["AS Cՙ 26YSS 7d(~g8k]ˡ,uX4[x8lJ`u[ o!1z*ybmYg'qs`iXy=\@9TRWDA1-\t)1B=%߇We"%MzH?v]5 ;O~_I[w^1R`ǨAg‹O|~ژoaHԧFc쯋HSf„;;B*V;a ہ=<'HA @E2g4| m,#b/}~CBxՇtf?CH 7^Q^JˁnK@㚘nf$hV0_~w \snߊ-1>|\FY#7;?:ʗN'+'9%\p} 5xMH2h&-tGV$SaUPRj+EcƣBL]E5ޟw8,\ ْݴY: B'aL&Z 0A-8Ah*'cv&\DhPlB Fd9,7ϧR7'&B 'w6?*n:ݻ/jkv7Jw凬S$;ࡂJɢ[RxYFv86<:Yk [ < 1 S|d܁<z0z#`$÷Cª @UGv˔Ag[!^ \ͼ?ZOPL#Q=FtXcWrsA"} VLCOWpRT'TID) C*0`־~:zUZn(ic1#vPI0J!EL)SG2u95 " D 410OcIQ}vKH^xєR-hgqG!H{G}P\;zvHUu7ibn0_2MdTOr5%<%2u0bx-͕jd4{n[9AIU֝ǩ {DN~p:ۼ]Z !2Q@C';&p'AFn- u2,,f#!z&7ʒS#2U3~Gi==buwi9l҇^󷐦 =&&Hb-hR^z}~ GnwEň'o4sb ߠC ]Ѯ&0'?HıM4`Qs= Bhkq,"!Nv!Fʤ |`"3,`"a-֣Nҿ͕uL0{a_?Kצ } 5ޠg3_$`JMsFTN~8eв.+.P%IեGB (K_Pw/fKoqɠ9).GD4J V9}8<ٮ7>x&vv\GZ3ȄB@b"+ !C :ݦȻ(H6B5_ʱ"}oqxhny>HkȞ3̙I \Td&a9^EeOWgl^pb\Lj%Z5#!Q嬨#pWV~H' {<@p#ݙĂm.Snk; қ#4}N"Sy)*?$Јr=rB`F˟{f:ƨQ0+཯~+ YIVΥU0!G ӣV3X!7ϹGq@jfC֋0>bzړ ""Kpj`6h( AkHޜCj’]/!{=.KOQtԫC-JV4Dœ^ķo=`Jt(z /}W3B _QsKI<[nS(^1U|&i I%`߳k}BD!ߜAC^QhA OD *غ6|\8Pw5t`Shu`ɹZ&cy^qs9TII@sLIe> `7JA1WC%HeL@\37g$R~/^?;_W哦ArrH >sITN#I-&fA*f"@0i2NbȍmT1j?a~CyXؗKٞj+6;`ĜSpe@eUxH&'TG.CKQy@/ŰrpqQeQuR,8!gPVⲑG)zD'Is p6u502fM/qF537hTB KV<4 ;ӊbŏ#N;ZB(!]I6qXy_BcBn6dF'\8CQ*-KU1TXrS;7rb3$d}z*4NQi]dKP֒U)Ǟ!w_cߙi=*+yhWh9vsRQXQ@,UF0 diȿ+Vhia--\aZSqmn$;8t8Ҙy[gV!4r|I1݆j Yn‘AjL>=( [ta"<<<H)KY*n)DigK7&GX72*enV'suEWS[/+0d>e UBMRMp+mHʶp~)m\`E;]<ιъe0Wh}COoq)U~S'uf#'^'A(RJhd 0?÷X5y-`fKB7mNH.&z@5>(Yo \LiT >aP\jb8"Àď oTX$_L_ԼHC⹈~)tL_!g/$׵n;.ITAR>v˃W/T: 1YimqEFʋ _|*)o~_oXXtVtI@ .۔BM4(}l6O e$GInTL+WPltH}&`"Q IݘSHNcEӘ,꽙a$w_a+D&Ƒ"؊70% RƊ1،X64وn^T*>E 4{X8o*bd򱾂տrbLa.& 8"=chhQBإj6sC;'dh9_ *HE+ ɪAz&A3ǐ'" `iąz'+ u$33)"OV=A/Qq&]~l?៺0|/d2tC_T- uɇ3\Ut:'#xfCdo&>oA7֎X-:6H?z~N CIӅE2顒q]3 -.5Ԝq >8e!6ӧpZY߽/<"Vba&XW-bI;`v@eQ*ٽh6DC#٭p—t(w(>]/_޻JktLCެKaTCѢZMq% UA1[UWXp{d1 f^H*9*!{Qٔ ٳUfcdփtHE` CG,5҇H'B&!T_0&FJVv6G`wWJÐ1kW۞dWlHK=_bq񵗢بAզv9~ßj((1ɝH!mOxWĨ4$H'㖔nDMTʱ,Y]& !<>N `\%Xo"#VZHꑦͅ:]K__`M`&a0X 9t$•2gtZ; $M#T`H>[{xsXg8W !pň 0Xi9DrpWQ'<`nY"xixܺb]LO<2-dF6&(6TK$$G 4 OI\PPq4 IFV }gl;<\=OB< L뽘  "k/ׄY*vxTd x@ͦaiy7KA+0QO&?~pUd%#pGbsN',f'= ^{}SA{ҖDBJ_`23XpqCy5Ӑo|`rD];PMHq$*pZBIExKDTho6A1f,@rSI9(8؄ ghU,-ZGHafOhsZlf3bmGjT#px6X414#ϥ?@w6E1z3d7WJמcW8ۚ]|hjk TOt>Mо!FgI#H؃?QE7+SEa?8[0 $U0aVz`q?[6RRιV0*0G\@쀩I}Ev7] B;r΁^0ON 8ٸ}ɐkn|;_ObeQoLvq!1cÂYgC]E.[TePPdblm; 0D?HQ/o)x(ŧ-~?\ qo_~mtm(|*_m @pL^i'k'A\L07rװc18?iwg?n|=U%t{HA_ ޗQ4e,&D- :oz2*D+R2[M،kԼI^ӿKJh{}=y@sW̱=g&mFa>p]SE$I'K[oL#@YmEIsǢ11Ҳ f۔P>/R&qЗWY< }8\IH-gGݸs|핇[jq%G(d$,#HW\gq4kB(„\qϝ}E Pa_M /?l-Uv{`j\~j]>0}Xn.i_T\$8!= H$PQJH3%`ɊL̎XD٥?aQY6Gr;m;>8 !C ? \,j$s8m1X*#l& ݫ6R" #; Rj Nv%E}d{w6w.4I5E% iۺПxvGa+"{^׼XCQlh\އ 1 s)Mf m%jN |Rd>0No_\6Dy%A9;!A]zh2h)߸:ȼ p#AwްBb0䉾r(7h#Q;?eZS i8F۳Zy)`]f/FzrD˒#!o?KRΈzUtpwxb 8HCᇄiz}zp;dH z+e-d3_7(LסCtN#.>v~zp$qq H6\Zh剆 x8MaT !'3|5̈́J<:1 <0g;_7d]mBά%7?V[w Dk~({Ȇ<(ޚZ^#!Y(a*ރvw(bL3eViߠ ] ýKƃDE2--Rd[auC1ϰ ?{vc*EI)+샫t¥ @MSQm#w74ԢP$k|( vh.1tXVےov;7wpRTȈyϟ"vR֘P~4j4|3q9@¼U3bAjjH.tЭcLp dsP4#OE $N0)T hju#$bMTX^d}^,eɳ\g\5ohTޖ"U?KdM ~ǃb/F3'MJjIXa`DU QTKH:,dVc2 KC3;bn8d2(u[-ΕpNt1h2}e}jQA)'h7 ۆ0 =m?վqUU=̀ Xa,#ATsnAAJyDL@dK'\pRiK^]Tb՞%1gQif' E]TJ,L ϑX^ۂf;Y_*6jgOmZ~O+t_.^Up+z34Lؒ(~zF4> }LvJ#0b&0wpf`17Z-qm^*'ER\'$ ӂmԜBA_Ry l(ejjXYFIHڎzbYjt%QB욌TY6{&b/}Mх<?d?rnltm JMa l0yv|->J}3ӡ 7a#|`Br3X/uF<{ܻrOeZVm2QE&]$(k|ҵXwOXByIev75\9TF_΋5 u/vBاF/N2'#N`<]#2x^8|!?놫fV=jV.M19F-6m/J!BLW)RN uJ gA'?< ]$< .c:I_G8$S?J'W+ 㮔OLbGDB_B˹``9B&ό6-8#$ 5dy$w;$d0H^Ɋ%n ↑ٌDiGSVPa׉@m:0g3ZGTS>0)(\J 3Y#?= a۫VAvfڽm* cN qmG̛Ws0C S90$/-'mdG>+.₀<3jm Ң v@D-g\'|sxʨf ' $Lܰ2 0aa(w FHEi_ <]PAК$fm߉Ǵ.\zO\wU :e^+\cL9/0R"oIY\߮#A< WK*-PuV{g"&؝V lS!BEI/0vS0J"gwpEu 0,MdiSu6,X?ļt{UHg}ll3MwGG~N2n3G36RS{J_. m;*kWX@hJwlv "M9 qjܰ #m N'"kS 碨:J;ұ.Ysx0J"¿vA&Xx \)ΝP"s͸MU<H]|nSxpܼn 9fl39~^+z_1+9 w LYF2ȗʱoh6:a]0~Gqӡ7wuLTTH XUH+Xnt;iQ4 B#Qʯ*'g*Sq4ܪHècP@8/֙6K0W)O EޥO ޛ@Q N:V۹"@GQN2bqMg'Kv~Ekh1h8K2+[Ξgq>Cv :' @e=fBr|4zЅ{`7Ǵ%N6'r=).4 Q,ڞ03d!}I`3ձ+`tb;!w3xjMK-VYkz&^z W 3 "?ʟqԂA&_qB7Օ[lN3d ia~`Z[4W*Q3 :z- Gml.ռ*b=q J7\Qpe#*}%RJƓwج裞c![_bsƢ%Z}U:? mW[M Wӵ^_`iwLE6V$i,f$B3>% \Stx3spxǒ)wC1+a?\Qϋ)bj_H!u0hA?֪ͣ$2Dv='jZlHd 'm腢}*n@JF B7 _yw,'3u_>P,@"] ^%n?^tƊ2we  X?J@9ѰZQ?Ai2u9O=,ycG!f$Xﱓ| x7Ӌfi#dgx(Rt_5iv%},u*FR8G+ '`&>0AP2[Nӎ)jÖ9JI(/05pel [-9>%ZQiޝ~U9{4 UHhq)ᴻڪ7(Oq֜<# x#}_WߖQ*o')LeV {B]H TblssS.=Jv6|{CBJlr@ ax7RB[Zc ry.(^R杓sA*,1b$-"7V9C¦UBed7l~,5Ĝ.)Q4 Y~|̷^L<0v")盟Q M +)fX118)k4s^4x 4Hc]qj7kN/kDdצRϲO$p jf@[=\CuJ gN,Ǭ[_g? ;w]|];>Z mrVTFo,|EG> ?ZgQzO|/T%ͻ6Hh{a!vu;MK6f][}sB 8O#Q1º^2JrջJދL,B;b"U@OۃAfmPjA7eA '_E锢<賉tUD]Ý;,nWS(Ttp> 2 s;^k=KmJ@LbCUӯSeicK9'?5JDVM #`gAv@fS?V6h%"CBJ) :lU%腾)J7 R*] Ŝ^<>a_㊕C5MK!x \)- lCEn!/v)!ΗPG4g0S<E.& j:8|EA| 95M_?c>#j ?c:6sX`ǢCgr#-4꾇1b}$b\2;U3sCRxcruw'^OMWSCvwB2定RO8ը= O9q,?t3:b 饯2&gsM#Ǔ|v&]}ĘRjR2ecVM9<Dqos`QKj 6Ġ}}۾*'!N,tS:\̴ϴi^~rٚ@2!9mAA0`<2G5E"-skH@lw1|K$,\!߂uA2*Gı©d`m;aA㖦uAP[tXI2Z~6vS&Hg'1n-SF,];8>>iFZ4!a66b > MѻܓP[⹛qPAՀ@)<gIJ YU#<ܖ=)xJNGyqrUs)ڗ;F2sEDmA.xV'_o!יFL4U9r0uG\A\{Ǘ (E[I/QI|fIªP?9gUlZo3r JJa^1} zRbU ^?_Ѕ+a$Xi;jX1%nAuIO /N5A&6}Owhjq~"@ r6. wef+SWХB]4Eہ&nR '8Z+߱YK:񽎊mXgߠ %/iu3|HDJMx8以- s#~sn<pB$k}OL^Es^b8'ٳyîJ =@}XzL=+uC5~8{4tߕ|b%ajD6[N@%oNaȥ-uM5߫;cnBG[H*.8}z~jh|EMet&5Њ0-)auLEHHpTi<~z3;T֡lijm>J"×%o&JG/䇡N?R;jk ȫr$D>|ǑswЋܓĩ5wȡ֑D8̍R a8u/e1/:Θ}&@=իU6GrTIvnXڳMK} Z ~2h"Uo_LrWN@<:uG:ۍ[BN97 Q\%1ŽœznF'SgM>6ijgܼҝp3v:Э~53>tƻ^H 2xyzL#^!rvjkYtGnʜ:y]5 `頇Ƈ/]1"SrEjV~z6'Z#sI/T&{M%TTx,skAbRLЭҏasܨ<;V ƩX\n- d<#~M74;UbU)ؑ9M QM6dÎmߦrI>#įWvqMxu/k[FfBQJC8WiWr[<]vaAL:1ҨIҦ%OY 7pG*2An8LCFڍ!tGJ)N1T0&?%~#+OP*u"=6 (j5cҨ+u,:gq 0܁ ,qEc iu~X޴d!2MeOpnjoh[SgaڨI~Xr?x'O@k^ qG l_ӍCn?s+ܟ dd7/Wh 3 pV9 5bs:)쟁W$46h콀P_bezWGV T"Q[7q#|$U 7w0$Nib+Pw,%(O5JY6 ]CM!Q$A4cRFQKV{WL9߉ ̔e64<s jF[Vϙcw à3XxV ȓK2Kd7w6W5Et~pDYwU72kr lej?C*aPsA>+D} ' f(=_]ajchME3?,A0K7m=K5o͋\f];j\\ SS>}Iͧ)\>X>],FGif4)痤4V[J[gsRtE"dEXZ˱t_pM"?jJ{(ѝb=*GZ! D8}? 2qi JR)(0d؍z[*qtI#oU998lH 6wy!g,ρNKҒ ')ӲE>Q{^L`ֈ?2pbBӝ6D7_~c@/@:޸}ё $|]?]Y9AC "|q c`^ebBQp r(^ѳp\ rd5O>ōԉu%? `XG+Ln9)x1,cl^{ppZJW$ߜ V;ID]WCE.<]8Q,X4#%KϷB:] >{N̝ir!o].釩fcڀ;4cJcFy53TKA`c讹uj}{D LWr`.w#NN"Q)2d18O\uJ8{ i|&u%pќsj"fD^ 6`aM:|,=ֈde[Dϳ @G TڦusěoCzu@&ltUL!{!0>3߈!1LsWCM"0QF!X8Vk )ٌ4\Ⱥ!VN6HrbCc@`Í,=jcya!of4e\RVp0-.` ٙ>/%$URAˠhQvr Af=1s%xDV}u6s(JϐЦBSÆm1<\|r L6Y2Sk/bP[u=ݵl{3T5H4Oŝ*V39= Yf7C@%"bp2~"ϛ$ckE3Pͥ:k=` mo*:8FQPtHjZ;-W%omYYk }*᰽9 #+hZ3*w=#ܸ.B11FЦUU/cҡ/\qmbFAWS ؊5 k1F&9oD6"7h[R7Nv#%CI*.M5=eRh2;8Oi)aB ĜyhCF ipcw-{:XnГ(SDg$~@ L}o_% 7`HqT}7;9V18I␢I)u=Z?#LZ"ϵQzq}NM*1óy^#L٫#gO˽huR܊1.tݠ\ g%`P\t>U=}>aŅx^'3CKI#ՖHJ>;FX>,f[ZrQץ!mpgThmL۰\ʮN+b2@7Ǜg; @-g87ݥ@jO1e%qU.Q{&ihxe;R̯F-{!&"Hbɗ/^,3{%41к5w:fϴm痴ݤpL8~Q-l+I8<ۚdt`}YVA>[7dKM=_( je6ykG=ޱLЩ_Ng*g%Wh ~|~"9~9WŕVn 0Bۦyphk(t0i6iL7j݉ŦM{\QtB齢=1 TQ-j2i@ {V&•66X-LG AQ\&y4u90|$) DjBW*5O"C'yY^&dZ1Djp/IwfɼQ_K: a}q!]M] ER+}&`udy,~Vs,# 3,HͿ]/ ,qoӊ4nx"G,e6w# -Ds~o.VIx歖`DG=& = ђVIZp:w!RJ?W0'&'M)Z*O>[4Mb4 nz]z3`ېQ<&Ezivg^V0$4f@;T[K~"k#9sv9}51o56~baq,a`WwޟLoؒ ݀!^&i&hJݩ_Cabjr14bi ܎E;W\[LA-kl//4/Cq+L9uqKp(/ہCHۂzIHEE92uKT:(6:\8vOd #dn{ GQE!gy] 6(lVGGS /-s*Kd'6%CNu IqkC)nJy4/Ÿ #&&)J5\q bv  &Yp[P&}hoAa`tyImh# oBF U ͠'_cd &U@$`{Aʪd}ε,"@(zPM/ YGv(ª:F4gOJ 度^)9;Gs?-?)asYKY_>vѸ9P&m][b~{o5#Ⅳw4#G'x6cJUq+c M}&kbjQc aټL /(sD"|\YF6=;/ *XAj JM*A4d;dޫ7aϩ&凖So{x >'(Ik!kX ۨ#FciNӠh?uZШLqbN}WmRmHXkڽ,dxLޢ߀#)8ic]9Kt}CF NugǙ[ۿ?"SanY)-,yUPWV$B\T#k@T@8Le/5 .s.c+ʞJI[,wz45#Yʿrm?= F mW'mݳ!p`Fz+mE}֒v-&֋^1 ?,ecT50bK!dܚU`NH[\1^'#"pN#O 1%V@^7'!y!T1Fc ڜ&E` 9V78fc{\1 >Ex>]u"υӤ"ԩ5Y6I&Kܦc폱ǰϬpK`{XTrPT\\QMU2_FxT쳲Hܓc4>dmHfȺ2.lY}\}qEcE&K`?xN920xw aS:*x꺙#|5Ü{FIğp}6Tgu.m/Ժxy=%J1řPЅCD&b YP( oazkۭl#++Gj ?if].&^V ݭTTk!׷W'qd"yqe^#vȁSG(vG$0P5f~Ά鼤ctu8ކF}MsEw?8Yw3knsۻIMn0??0J|J @9 :q:o)K0Ѱ„E1LfoN_H5@<݄6>ʳ]ɐ[.5 =C~~=LteөUA6= J^˰ƿGɾuYyܛj}> $`w_;[7n_l{]ϠΖèm0Yݲ P~LX d4 `] xs(*w3ax36( pw 2m2Ϟ5J{! $o.95y|1pT#jY_ 5nĝ,.IEK}K@'dB"tWjه'ӷ| YCq,-?0=D~}!+];zY?K =~N*g2, #eg[99ssffBԪRgƹǨ&Y5͓w&N5 h5bo&aїׯ~Wzrz;UQPpxyf"kE*?wCygq~kry_G# ^fk,`d`ύqҞC-'>XR>ꜟ+<]T .)`Tāӈ8a܄{'V?~k=L!?tHd$Dl+8G2WMcg 30V+**4wz ;l̥\ 6aVW0e*.nsbx|6_q9s=a˘)Nz` \HTsծlyڶ<m ]ST|#LOaa,7\Pqvir:-,ť4bH/K˿,ĢfyQ]t VΣN?KyGK^ReYYDFw| 242Sc$wPuKRY,-l bƱcȦ) pNKP_|n?S C?SF}Nwd(f)swj' ;<> ]}! RQ"C5 e37 5reb]L+pNW$.nJ#,](Q\GWӽu0گbI!+t.do)˃ݍf%3f6lX0+?CFt`SA>O~B8@Ɏw$$J OXvM T2);">f ukTy %;4176Sh mF͌}ZrlTW\^TS> v8K"k축OMDf9Fc*ww0m.y1m"%߇!7 iBN|HzUX֘ksYN(-cz5[-TCτ( MiRJ;N3IT|RVtgR\O9^Fî Tb[*fZTd 2w?#%cŪ~Lg^TrDn]/# [ٛ ,Q470bH\ 2r\*Yfg)Rr/8'ދ(.&AcUMsf;OK?J9(iPĪ9|_?od SxKydeh~N3"[ac3\MS"C^Vz idj?=ʆF8ſO%XBWHHMk:pax_~P"r>b&pG'cE_eaPAd6Nz7P2i|K q;q&M:2g e$uLwi˺Pb[P>!4_~? |YJSdL@PgZE 4?"\͏Fm4XLM=4l03&92, 0LWWv"MI#]徜ws)khxՊĝj怖=*rd#gϲ0tJzXo4B8}.٫H2Pb=uL 8V!PN6rs)i1KJՇHQ<6?l?D4хeeZVzϮSt3 bz,3D L3Pؠזwc۾~15L[hO%W.3FM!gI#\`4d``&Y}*(GLnhnD 1N}JpElO^:4,]j:%Z#>qrRFOˤRK^~z.90.s2uV,뎉1 h|h4>\BSbg׈;b;ѐgwE(kUi]ӼȻ3=VF) D4BV: q>Sݕ`ALM ?Ξ`dvd*.Ny|ꂝ-Ԃh=!sSmL̥ <6OOxwl\t1!Wu6b8R{!IX:%kic;JDs{ g8 Y@0N,jWU^ @6aiUx*LʎRUm'W^O^4K^\ DNI%R3J{JDԭ?ܽ@]GL0nDGt mM#cy'Np[';o){Z.4}Gr{  u_-F+L+ {/eװ 01(n:'齋܄ьw>cxgOOO{x7 {> * A+cx[Eh uMxu[dhd?z 4#U,t[T8u˝%wkja\;(שv9)g9*pƶ:XG8VX<)@yĵ('fZ` [73Ez˂GW'{0 O' T-4oCPS#6Χz'a5ʯ-7AϽ[lFy t~ 7:Ĥ_IfRdD^AQ#L̞8Etq:2:4ʄMcOfi\}.>T0u~)^cf5”ity,#z%l4tw45YMzjUAMM#;OKdݬ='!YVUyK#/0-K' Ŗc<}`}PI<ٟ:ے" |-SwrGONm:_xr0E>}]n2_pÔ肻TsCxo%qioS"ԎMwt\3ȺcWo4 HV$&PD1)p]4K;Can{)KmTxu-q:0JK8|f4 Ooe+:1CI.wfe`:3ZWnK#襋I֑1\ ΘB+}GhǣWmRc™ *a#:9z#+Ѻؘy]i_sDaK J׹bg-{9#_gQb~$Vݗ*u,,[_RX^]NW6k`Jppc)BJ93r"_CCTh]! iB%BjuNSR_4W*.iH8csJ#laHj凹h |=yJ ;\B{ϻo̔M8̯W9!UtpVR:sN:Fu?!,CXp:Uȏ^A[ I4}r#`+¥txIie 5N nԐ NӢG@s̞D wf5uq7nBj,}S*>24G]7Aa 9OAHC{F $㿔LBV`%BbDT91\V:sdDeNư Bu;aII~bN 0\.veYx=qV)mi@8Cߢ㸓{ "$m馍sEfk*BS_zE<أHkb>~Q& >LU9j2^c"my(G6i+59[~v6 xh($ɜATD׸$Ó!8߭M\hI;,{>DQ}>Q-.7{k2 ։uW:W V;='3N:1' *XT.Gml4AoUL4O8~.4ksk5Yl!-@"+2MH2R1Wu;}A<B%Hx7[Fq#ЄxZHDlNl3{-h@ IA6修9y!gIvLfӴGϧs>撠y\5'''Ƌڑ 9E%q+w ug,޲ٸFlҔH%H{.'ؿDadŰz2WO47 7kx;W$I`H0 $'7o/Q:]g(mw+!4Qle]1F%Pz 3V8clRl :]ՅƜ@"f7.M tP4`VtqCu"B0ȃƁW otObm8NUvVҒ6B,/Ngk:/94r O'@J"Ya7~µ^A"qbC +j7s5~53&$5__s=P]aC ؓu%-5݉E^C10nQGuHJ7 xBSn3вJB.(%1PvR~ 2N$ME qbuDўqPq,Ka<2`F3I-q{ްb=sOBv^~fu `OL+bʌ:lh@ZwT{q`gԖyBCLMMk5##F/d'˸eǝ}~z*B ƃchqqyDؼ<LbY—ZNz>_5Oj%BDwb<0Sn؋6gkI@J2_\&+r{WD*3hJQ ĩ86MQBLW&ߧ?zOg{C\aL+xcdgN,ewP㖗qg=M9@ACOoE:GgoweU4|mE2>^3x;Q4Mi}c\͕̓kV|Ĕeq0T 2GGNTk7yh-E(14H)8vXMſ]`&]h+_', i%6 IdYFay6דF8e8XbJdc k /Qrˠ@HJ&3Qj#5l RVql߯MhW+:7758̓hMϏyM";Aꢺ)LC?Mzs*I4ÃHjYl׬66_@g֮_xX%_LCWXwnIt  W"lK/H(D ݋\$SGs0P0VI~`l?ӧX.8Tŧ˹qlf 3*Իb7QeKy9jQ)QGS@LFH)iI_ .IpUKI5_UA@8F X:Jr!JjkHTi?8p|?U*wm ),?΍h>)S˧˪y3$oF?8OBa#pNC\{DaMKipݾn,x f!='ad 1F u1=k 7-x),#⪚ڔG{H!1v 0g@qb!+$ ubˋYҥυQ8(}Mm`~0L~кe&{Iru $EXT MaԛVi)VF؝=|b^q> Hԁp3ǖ-RM{>^^8pH;ExlJX"xzEQAɆ/)4Bg '?7 UB11u "L\z#Ǎ[T 8>qɓA " $deX)0ΉBX#tpbcxrA"){ H򉌏@ 7FPVWARژ@#@( I/lA!{.T–dZy!)pBD| ,4)"8*@a~ptPCuO;sw"`G>x?%teeworlds-0.6.2+dfsg/data/audio/wp_ninja_hit-03.wv0000644000175000017500000006161012140200333020717 0ustar felixfelixwvpkcEZEZ^J$;s 9x@y8Q3$m>HgşI$_f]eǎtcc>˛S&;K6)O3-4|ypEcm %z ͳOdq2˝|Ki>650Kж/RvN_q-ODw G7 Anrj_ n-5=_h8yl9WzF9%~K-}>N)OD^ؐm^aPgߑhw }|r(b)_-B}t–'{ X_y]]}Kɩ,I=ĵW5(O Q,q@j%ÃeZrK`VBՃȌoZpwx' yn *Xc#,o)_MrCf,tWs#&}`>e$˲νȦcPփi_\,adsQ8[f1⩮f>@W@FY_>w4 ̪`LäO^H6|U^dW]>P}VU76&L'sjD#>GF΃M7 "`Ս% s>ZF,VL<-?;x118'VIGun|eii+]c8>dnc#g=s.l4,#E>}ABB)sWi͌#.rWq9.M !(iƠpZ}u-ځH*[%){ҭȰodv~+B%r@jK?mma~ Tq@tWܳ,dBkXkrY[<0?C!UkCd[b'.E;d}rԍg28PٴZ'+NCE \R^9??IOxBQE^h?v\!x2FBC:N6 Pq? \{}moND # FրšMK'gq|*?. EyAq*5)=hoIp>kj(v#}gQ¿DH f`1̨ +2s:L:u&;a_Ntnt܅Ae%2D #Y4"!x]"~0ּr2KSDmt}2kl|_*=-~.CE$=ս+w8uY?A "\*_̝#YXikh$Bp{ira)XLh468 d**c" p]zruET 9R/cP^{hN#OuSIW:KvTPg&ƾ߮L?PmMS%G|ዟ5M |Ż^LعkNIQ}u:r֑F2l.IDǤ<_[P'C~: s?4%HR+n9 Cnz&,ⷬ#;CдE! To/|車(QyٲLr&Th0j~Y;քH(̐*x)3d7u 2FWT`BwxȬS 6̉J)pfhЗFtw 0̓SaAquc)SMkyֵыcq/d/.$mb`*E:ܾr6VϽ *^ ~y+3(Zd[MRd h:k "ͩZ܊GB(U]? RM{xvFiZWT?7Z".`imLx>B<ۜͰgFi F箄^} %쒷5q\4jťc.3Bǰm<9)b}.hSzfBՄVObAEGu.TC/ %XziP9D[Rq6"M)HcYc;GHF,U-'3Ne;LIp9jx($ۚYi mshc_y~jE"V~!JL]Nr]NO !߻ e v l+u&*.򀹤qmw!د<{M@/ * S# 1aڷӚFۥbLpwq-a˛cwyRyIMrLzNO}ʣS#x勼yI} ~l2@} i۱DCǯI(ZUiIfI;RUM 6= Ko`t~P塩$B՝YLS FN>љ']VjTʦ4+ MZu4OT 퀓44ҵ LCpo]wskFƿfE%\#o ` fewp Vr?A3h ɬxE^,mQ=%# 7;q\x`:J5=Ah;lS936%* >_4N]iহP"yWZL@.lgQ*JO`#Ҫ`!h ""ʉ(XvCz"|{ A˲5}dDDT̛ƩT'n"a;5d3":4q` ˸HTN<&D<-)Sy@ͲnWPQ&M'WcVPb!K8kp2VN1M%vMi܆UT(nRHPHB$W !my9ya'~R!ZMxZ 2|=Mj>/w@k&%w }@uIrOKr8aXaP_ZuӍ.N`I?v<8進b7c9~Hcݕv$<ݪ&V\BqO`GNi߬Vh6Vs .Shl=8*?_qqZb0lυ *oR0o0q[!5w;O@)ݿħ/D&UG-}[bmM5DcW9}F'ΒZNO^8dU{I 9+Z7wb)=2\sb'%ڂ},< >"%Iz)}P2nufrja$F>~̶hv7, VJ'Vh?|Bu d"4ZE;]e_o@vck."9v;֕nBPsDTSku ;rG8bRW)6#Њ+bIx>[P9%0|z[ˡ\Mӊ> ղCr90TNvkd U/U}exbԕT^& D 13=@fgsU(5?n5r7/‰2BAؼe+#ƅxq)zF֍ಒJ^qXB3zPOqFm\#F[/uS٠CEdChԀI"SE.cxN1z8i?s%G!*_5F8}+sDFo̜ʈ-f$){GuޡS1 C|]EMu1X40dU,E)Z3ģ ݂\'tcܝ߈S9.h!3;mЇRooIkx0ˮoirCA_J3/[ݫ]r)fPbV^Í(oWGsYG9X|ȹ2M?x<v߅ӚJchL0H"_ɮ_UK*;g)޶}űX צL6&p \8M7|&yMYaS JK._u'"ߩYϤ-2yMOۢaK2){%ω5}*:/ho:xKB$+a3*nL^ɵ mUN_4[0Ua=|QKA l=9O3y@̆p 9ӌm#54D7EHXi>׾ /l jvDN16OM]#[Zm6^wV:?FZgexe(@OCV@rf:r7Jʒ+\KYdYU/1iqnV ɫJt\!*-yoG^$_ UՒTKJ(_1z;OrcҨ,%8U6_ m#0 z| ltdOժ&+xR 0fc)+Z5 Kov%G`` F_R@g l-ɮM@$"~l4wŦ>vT VE>;**uH%nrV~msOPʁѰ,V/%X~9]MzPGfbRpzL\-Jغ9~Ő!7HI9pm f:DזZT "/AI$Q$Rܓ4d|}OCVO"|eQ#]w؁7K]C}}e\d؆վیV;^_?WቺB8.!¿!kt/T^\2km#[Ф]4vB]֟~n$R@㩝[Oh@ׁ*F*Q T: vli09V=^ , }cӛ?;& A ;yt7e,JBҸ'ɴ,LUSE?E?;Oؠ)ІGbY9,x ~u41e] [torlSVb__E(&v%R::%+3&ʎi:mJ ЛJθۄeq%U+!&ϔFf j[K޸}Oyd!X\MX(,$_5C9UG/)y4@+31?w/Rׯ9;s 36%ǝΒj A"(s*f֦ _dNZz]L< k2GQIy!(=Ca 1v_I?BAL ݷqr Pv(?x$F0Ds4ön ZP${ݚ9@-Dx*`ן#b 00FTlg+y,J|D% K璑W=}#%KΞ,wX} D+~f :m3ӧ~2K/2yh@D((d¨Nʲ-Omf+BѽdM1Dgcv˲hiM/Lu52_xaQ=sОJ܇ٱPc`;iM?!/U;]ԫlaO6a |#pSAi:pJv#<'b (gT0 z eX:"\~,J.~OArmikKj{{d1'\OwDs)S.ǻ!qߜuh ,4> )Io7,/5i,ٵˆ $d6GjtB%awޝ v:[-ᠭ^Xͽ5"nj)Yj!z yA!]r * * 15p@/!`ʷ@Mj`}ઃ(DBeGUW=A{æwtaI-vdM>%,Txt; EfH \Z~dUSSGYЗR%'O4. |3(*E`)^ej<uO 18{Ocǝ|'qlqe5GIY? ‘1GSeEX4[SrjC\mBp ]Nʁx2som? I|M C9=oYwao 0RR3`n?C$軛 /y`>;ҫx5.q)pDŨ]ߖ< u{E25o$U,NKl_;?YGΙ歪jk8qqa `MQ!oq+aA*!i(?4= 4EAz/ah\ $== v?c̀,cY= Ćj@Buokˮ h7knz,T#/~pc;cKpH·*"GJFJ6>alNyQz; Ҽ >bGUY]А!Rt_%I7xm"_) DzV Nk}.!&C7L~[ amՉ|ynq1ۓK*OXU#3R(rױH>|ott'[aG#01buQl`wrTS"zKЇ 17m^Р?C1[-{:Xni(]FCMyO$&.xV'q85\K!}kK$w8aƎ N>V^gzxJ-ǐ}<vf>s,pG#Ù!tO4\&3fDJ7+m+Atu_0ù#ʦB)|V8vx:c{]=j}U& l̦Qwq ~$ǜV@-&ztK=q˽8[I7i[tX汝]8ܧNN9ޛP; s=U#p%vh-Q*RR`2m$0 sxuht 45&Ci=:8jf;=X!2KJiJƷR7~DǑ` [1[I+\v=UE`x 3;m4/A(ׅ* QF36y`|ǐxna6/O>&ﶹY*h9H/bӳE|vuduF:i X0Ow;T0kN w]PU `X?YF8_Z~Nٞ/x {aqu8Ns& VBc١ c'cc oG۾8| Sɠ!ȭHw%~ULW5 V;hWt zMwY05[dnUϢh>XU_];N ;ZC U7ݶd7mMCzU%䪼ߪex:^%.c*8~HZ1a⋥PrwLJ).Džƙs@BhwқGr9Úϑl=aAv}r<7V' i _?wfYP!ucZ`Cz{:p*,ڽ\ /X]i "<{i"]GiI#<>X~~CʔYu1m$0-F΁[Ct$eq_gU_-|ב1&MaJ"J_~:u9WB.fkUUfs&Ϲ<+̦@H9YϖGcNXtFg/tOEFH]-tLoȄg _ aU%Kqx4ODz|HV:}%\V5з6.8$3Md;l"޸rcӸ=iύq)?f<m![t{LG& x9*#2=xlS5*eٱ#~m'K-ObN ƸGPC{[chK3 e6.:>!-!LSʷ VH"%EB|"gB2g|0\Q:\;Rnkmr~WMӇ/do-7p6ߣ9؅Oi:WPө}dUفQ@HeՓr:+V 5Qi:AXg~1roR0NhLQ@)铄b^Wd7b}\Rc冓gWowe6^Bt9S橕XoѼltyfR ݄.-(k<] ;M9 #a  Kjvϐ`r8qYe͠)cy9џl(r gVV$CETy6+󜓃'rxø \H^;We+ofV% Wda[ fi/\ rbBv`vM}Q<3[uH37ff F@= *kO0w6K$][RS'ք&OtL}\^@6y)D\ozދ0=3Ü㝻KO,;d0|AJ/"fhs6EY C`ܲ496W: ,*%mBzL"0[Yo"c,7bH#m4GE(L:<|AP2#D^V{yBBDpi@B;]ǺŊ۝Թ2|3`.(m <5:2p}iݴ:GdJ bķqiʧB!X{$Tk?)|4^V,w1gr0#B P&c09^ ^2ꦺ' qW&3ۢ0D i\gVc WԨe4KV}DpiXT'5@c&eq\m͍<S|5C>`jwz)˄5l)o#|$0%MS]σ*w jx_a1J&<+.0Ͳ@JMk2b` ^\oKuhRŔ 8uC}{R-׫?}b2NQLaˈ h]5UVW QĆGKE2GXwîeB°[S3XjZ$<{Ǥ"X2k2Mn܃SSru6bQYBcIks=HRN]*^O+ JeNR`B}dT;AЗZu\"Իt$]Ip5Q k WFU`tOnw_R&Tm֥琴y6&n^@ոozef}xM DQIon0sM$ȕT -Ϻ'Bԫ< (Ma6|U_Iԧ2S|F+49p"PZڽ9`ǂ $8{$ xc<58mdBLÐNX ? Z GctDžj`?-ʖdMG1>AW{~H8mf,`?m>4 9P, kf$ʂp nlkVwL$ebP8DXIJXXqPbwQ!4 YBRSd*N]DRjc2ǃ|?\DF./G[Z'} A NXLMgvF-iCqg_x55rhyժDtrdo@ 4H9B傽s[W6KSJzX4A8Χ/hr-8 F6LDxP! QWUwY)aٖ!Q0?l?i;#*wku胲?䏑>J98'wE6,.ˮEJJh{#V–c[^fo ru! ]"~7{~isq!InC5jL8mZF6>ʍeW3 }3v8'xczf!Cg2h$}JZ?}kK GgF('AF^ dŔ8-N.M`'~8q$c^`-,i}ފ,Q^&_ ӝzUZv4EY^X'x'H[ng'|ul5pIWl&υei&.zDLX9;)1qfƬҏ{C"\pr):n\8aHQ~]oGdyIZIVKv׎"f5XQs|Y%{LD\vKnbmbSb)lH&ڛ " 7$ O+:dNmOBi<dTSH$ GZHOQ^I;nJNn[JGE0cWm$NmKӒFwٜ)ڏ՝> <_f7|G fK4l6* KRJ-[U5:Ei[~;*9Y ~[`q KRF֞sJ{o;ZBUѵ_ Fzޑ@#C)jKmh Ċ(uh6/.Ňv2 w.9j,9eCl`4ůYN4"~],E^Wa>ϰ5ts"-%}%6u;+K d-!NH+F~r/3tݮ Jw ge8|7}K)=I_dMdxQZXp2ۂJ0Z] ](IujBʽFdigtN 2@?B x ZHK3h7Đg[ `u 䘇R AP 8ds {F> -MR5뿛:}=ӋId0dr%<(2dz gրlv-K[DK#D(=ZxΣmAV/7}av:ڙsdp;lێYn}R@OMzkƶZR0ɉkČ^74?0UP3 ,88b? UqՋ5|i-.P!Bb0`whQΉOAy̾md,pI:ގXU}<ظƃ*vs[C lшL--~,ݹxҎF)~xuH&3=bY^Ɨ-ڴ/ ۮ=D{spZIgbٽL{FMo1:Ȁ哞# %B> >_J cP,l(| Y2eUGG%ʿ2], jcSV\6ܫ¢xj4H,f]L.~N{)HPTd/#BËDɑ89NѝkN_{(Aݎ(ej4GHocL}NH$Y[RXݳ_‚:_(7;V,f@Krl]8'cd G%Ԇ=bF K!v=myE;䧩Z_Aʏ b,S8&vvD(^:$|gt]*.+\#?OB *3m?Lx$3δt;)lj|~ߢHI$*AE|&k5GloIHKk9E05_ "lCP|һe keEN d֗t *Vx16MR#ޞ3iIdriBY6n7*0V[ J<73+ ],4 eA3$Ӣ`;kLBդY :9gM^e\Ra ^Cf x]~Zdb_<71Z!r|47fم @o/Bb@P9)^RS_dBcMǴPuxa oI>ǸeWdCm5;co)ioR7ψd[^?eVsƟQ`Cj;k ̻2.|RU6 ր<~;8f֒^ȟz|mRg߶54ۙ'Zh J'y à3'ot"l 7J֍+N Ӯ\SʹqԐ1&Q ATP $9%ٶd:gކy@Qq(}7+WKR{Rȵ3L$mOSA~1r.Ȋ9>UەvA&*V`6UN/u0,-H_@'Qq#UIΞX,&݉]eDUS @N[wm)//EX=Z\gdm|aчԋ$Ly>u᎖n&5K^?`- sԦPW1mGR~?/X̷shV'0 (j3-#|Y*dԢ8P%r,5ٿhc=Ϻ_vĽVI1UN.`HgSҁEu65y-4w[xl-(b a/E'os)]@Oqϑ i+c2A`u~6] x:|MX2p~93^]tN8ƚYApGP'ErF,j(\\K*('xۆ_fbOB w xL@-V`Ńu@E`|wW|p1iPfG^cG?b1+F ?ŭreԷMY/|Ηi)y$WALDql|Ql?,AnW`i ?_ a>߽Q. i6'y~5㊦` D,wL1{;]փ6il 8v$W1W `(gºX me m*q cOX%Vh4{;F'r$_I HPWsF[Q&&""R'O{ᆴcy-05$ Q{}sZh,HAj-5_Pcj}i?sø:  P7雘́)KG~C㹙-ݷUTE3ι$̏# j&&Æ;gDõ?TlxZW@9Q0̢O//_4j2D&N: Ž8O b_):xL66bG*Y7\5?XqĠ7fa6{ wf˶i |wd*ͷRtPM&ӹ~TSG{pL"}FЩVMD'(F:cYcтHש >p/'2s%a:BU[.kN)Pk%-Tg9 ̣FS%-Y?p *2xD-Qj/ -pQ8.JC'Ga=xEn_qn{)@ %G\ǃOXN#&m$k+p+H/݁| Rmra<5}+> 2Bwx9ay84{ Ɋ;AT,D8gԧUʶo$N q::ʴ*f8d[^ko%ԗc{3Yw(x5"BcwG\צhzR::kšPb Dΰ/Dl.@j7òb70&QIAF#zycV3u-Ҕe;d[ v2ױfk;\6vQ1ޚnTO[3b>'֕W:%ϙpم":14Wq8+@Q$f#'x7,& )2c'y[2V 3SDYCo*ԈȒ*]6j!Ƅ{6גFJ߀:k񏝜45ڀ^ c(*ؾd[uUM28vA4ݪ1dy:?LMı܄DցdɡPg;W͋qqъ12Ʈ 4`'J)@E!ʁHg*i c\ e&ؙfp($PT5wJYG|\Œ6B!L2efYT]a9#|7@v8Wz€9C.z[wM`ŏ ȺS F2L֘-wߌt7/N1UQ\I67=׺E¹@шp4H4U`TpfHҰeUY{JJM#ugh@:}ehVJQ:X>0|%O˂F0껙8 SJBz6][-F5z3 %2D=Ӣ`(*ʋcܺ\NܻZjel",#)ฟ?(\bg:g4U*bұ LcXj~0xg` hP2@>Tbv%5I %|faҟW7eny3^Ah/< 8x~>{]7DSsZ\Fs#xRw3HᚔH'~8<`=FeB(IH4dRlrcN`ַٯ?i:.uOET_s N(D#]JB<"TB˄m_M]Ta{Q *@(^oN C4UdUt(KiʼnSi0ITr/d~I(2͡Xb&-jj^OZ[1 '3s篠ؖD=|}Qdd~Pr<4ܹʂ[ 7$uP"KI.2W(DsٸA:f Ws& ]~ ֵc x;TeNcϹWPm)`yƟŒ\6jiR W%1Eux|4 ͪrcL` Bz}(>N!b<8$UiL.-;_iĕ ~5H#ڈKGC0cQ _Y|-e6)HHg,sp/Oڬ*`yn/ʼnB@ćkSha 9KAd9'{<+t6 Wa~Ź@2PO/\(Y"zm0Rp(1H`1艴׊ 9RX6FQ5G DMCC>=:;h Y!ڐQ(s`|R}~Q52ƻ64 ʢu!-XXAX|`Ȅ;}>;JcX1U_PoԍS`A x:5Hԁ p3ǖ)RM{>F<{CxeW))C&&1.u "(Q.M#t xs@)1CQ@qFD@ C58n8I ,dF#ͩ: D0 V0>H}^ X!(;e+ M([O@P_mD!@-Ax6h=@@J:_#g\!P < HHBpp~A `^`ai@5֙CcM= p}np@\ny>teeworlds-0.6.2+dfsg/data/audio/wp_ninja_hit-04.wv0000644000175000017500000007051212140200333020721 0ustar felixfelixwvpkBq__w6WWWGHJVIe8oe}]?_S~Y?|*bw4pe_n3%ט$=}>'$kzJ {VTA`+|@ܺaLJy${ sw o#5e;"Qѳ]i RTY.aHRXXAe0@ -+/Vi * y'Ҿ = "CS ui!?A^sc8Eh@҉t׫fÍGSޣYqZUP KR/lV9 v3=4QZ_K )gLu N_W]ِ0ײ` d PAT0+V3γyN|*f~u6e>$HvpҬEq˧u漾=t˘\+ YQ ߄!x$,Q:+t5cT_ %m<ك?P "5U?O!up_&k#e`{_@k5?ou*gp4f" zμv,%? Q$ S>&gRf1zA֢*uikx ʻ҆LUu&^2_& 󜖯 _z?@!-w!a#򌷷a^м\G O.rʨ L w{2_:&c4>5_*v{/riF8k߱3 w5M}_ҺچLN)Ъ5l)x"1k0q0oOڂ&+š*Gr/>:W2b6W*X)_1s=;EI6qx]cOsDMbyuP69C j\%0I{нϓzEL}ccYIeZpƊ(|#!׸or؅su iɌr(S:Adol Бp=ar[K+߅ gqk)&PC!HiLTǼkhl7Si9; ɮph1 3Mb B|3Ez0cy0Si<[ԨoeE^43֪sy_d?TFqh[[П'z=چ3ڥ˴P\X c.% [t1m¿/rh?O9) )enm`hz S\hi]j7Y-ja :$KX$oy~*W}1DM Nz] 4s_LtQ6?X$.eMh\v1l|X.#kyA~ծ?tkl_nL@slud}v[}~Ä6 b'-X%S+bC%xCԍ#X-q5H{5Cf Y녋8+vQ&Axp͗f0sG$5:(VD2LG"#r%@Ojf`0P8@.1gϸ6ײ؝Znp֌N߼&IJ˸yCNͯD[W;+Ypv+8$A|ah$lM}Li:FqPZ4gvSKUB޶ @&:W&^GP K"0 2|sH8tmCFB3迺&PtiE9('g xika&V $bƳ3.F M2a2A6j6(kϥi<0_&Zw${  7.sٜtu.KuǗ ,ۚe n[qܙ./T_F8)W(/Z22`سNYGDMkX,0I%3=;Ig DzI.%ooCTsyt8?IoHGldB4ӃIFOz9g끷;%s*d|PcBc7vO?s;zB2!_fTLwc;V*WCd6`gǯBr5sL ju';0TFjsWsV-45rFVt2^n&Lj3v?Fobo ^p Tr8$_hD_K߈NQxYJl8y63y($e7ЯPzϜ#oE!^H FD&)LU? {ҍpˡPaV7mжTzHaCk&(ŭKU^$ 03!QS8゜'l2- y݅X;)x;ؙ@J1A/ ۲#[j665T_KG;PIS|Ў`|~-hU6 R?G٨G䷿J#w t"%X7Kt;avbX阠> ς][\C&&TyhH, &Ke)aG?Fƌd6?0a{p-u:So|%Tm|GQ1b,qV:?!{i ]'E#DwbU﹭ ;t"t rP(Τ%g=efmj˞ōqo@c1K @.LoA V@%z Vr\7c=C6\ۆ'qZ-5KuXw".ܭv5ʉÂyU{Kx1^f3k_'‰ȮwXk>`H`9UYDvC.9ܙ)NY ~G]ycYB3h6:_[5ŮpS=kz::Y RMOt=YWZE΃4V+r|BwI:Ch#|y$_[5qt%Q J.ikԍtxd)3LY߃OQ\`RVm>d 7^ɝt{"[*R-\>Jeadcu׶N7M?<7s|L\:p]_-@VG+:K"0W*UΥ>,'zx6W@mGz(8Pռ~rEnk?xjX=4 W.YAk&絜!c/\@>cOϖ%DKTz8̄x0>0$Blsg\*/!tE ~g5XbؔY纎nhY ޥX<:!fjfRU֚ dTƪUI K־@Qk|ͺ\^Ӥ lp(z|1R蔅ap%ݘwMo uP:ֲ* >عffZ;ys>)"^A 2uj10e+YȶbTS:qa,s~yԔE!~2$O?H#?yZℛj\ygB:?mkFY6?4-L&,&2= /Mc'f8O[h_ DF{t`oK+vz`?#oL(?!1~Zs^DY1r* 0qm/r-c^jd*HUULx@{ӍԼQJLԶG̣jg\#TU6}k yg+O-Ϥ^( tF@;=c?%pxiO8R> D.|0 Gwex9d~;+!ϴ^1Ê^z=08Ψ ?;q lj^T됌K@4dArS|$̧swjm" ~)O@b:d7)sY"$ ogx$qEn@)o4[7?"SD2>W:Pc>8OA v3L|3%WBenE^B\몐XͲJ;|)݇)XJ^ά< P8̜"Fkc@\R*2ۙeF1/}`v%$<7;['dEᕩ;{ja;٧xzW; a-w%hDr&Iȩ`ZL=Ljjn^lfo-zL w'}zkD27FD4Iv}(ƬPò[mꋮ[/A"NLluSx)'K?  TL _0zz\7 w4Siu/4{W8:4iU`1S2>#&_vj #H %x NL&x'Ⲹ& *O8_1&f [zM`ٳVg$y n-1>SGcn`($ڏ9>v)\ڥ:(@U[w1`Jgѯ< Tuʚdg1?guq^ p>= nH{Sr,g5Hʿĵ&#R$W1v ٳѰsaѵy r堯ܽjik++NqY畡*K\c7:!X4b9ڹMS"fRplp;5:Vmz;Ce-Ѩ/YU:{lEHѧ1sQ> L!B´lӝSD55rP[-,j.u=ԾZr ϴ\'R1m/I/P9-½SiTcO\g"zWOƈ'-|?NU{">Z.W0~N'{ f3ܼ¤feMoFE[{) 1fBu=O\4~Hn;r<"1+e@^(2AԖVU2õ' b@o[KcYOR2S: 3IwHb85_2^xryVEZs9QijJ2u®Js=Zb~wn'ȤxSܢd9B(ہKr9tJ(p<_jm9Kz/!UvTo0,LlsŔ⚍-$lʋ M?PHStDtKi;G飃w9r$m2{Uۋ{ڔMCbm}-9³RZƕ\ Pn Box `@E_8ʵwz6}ic:ڼdf+#U/Jƙ+9q"] :VߕS"K 8|IеG[[]- VDѮ&]s &Zf\v05C'=f̪{}y2J1>Ӈh>î0w\1;.xeܒ~SicP`vHdM2yh,O[lѝd;)<*pWok(e\STܵ F P\o<`"]M~>=( ,B&J^Xh㝰uE }R*@X+٘@z5w83{ OTN|ŸMpnX,/Uwo?༪LIT$25PɅ!8V=ёhTphgreAf$1"vԐ@:mJآV'ֹ<_WZ|ZRؗ)"T0ȧY_77'(L}s/5[8C- )q }PRh[ߡ')7Ck X ,ئXģ&D*%TCcF 2k[v8)$1 K,ô\yâaoqCU~ /W5pxe?0с"bZʮ&U'3S[گk493bIzC rad#&V**l޳͕$=I\[^L QpTr v>oklW\.tba ͰH] 1F'ֿ&2\*OиmF ´ޑIpBzƫc> hYˀ%`*6o86K9ۨkH3'SL j ~+O׶g9+ٵT&;h.Mb? Hv ,SЩ%GZo0$V CcA2Ӭt]jJ׶XhhJg! ?-![#Bx%fV Eql >O4WW$($-\ 叭h2>FI$.6^OB| K+iཁS4 Jsx+;E1"fրqȄ>ƥuקzr]u v0>s> "f juή;jLjh}8H Sv,MG!# Qz}9M.L!r]&‹+ݯ2۶ޘn3%A]֞'Dq}30heVgqXWP%pIG5~6R`qeDUL%B)AMm^'H$PK>/wǍ +>b=eE5~mL0dQ">Q|܃ pl*Jj.شWAZZ5P|K+w!mMV~EdzG^ĉ̵S+p3GL>o&hot @r 5k$get|ROZ~(NF&9[yi.)q[L,Q{NQ8^{O_,<*ԃn-o1+H^S$oj*:Є8(J!NU;' muJ[.ڙ ;duS2r&<&215mz\()0﷬N]aT>bOӧmҰ}~_}4q.:P`#թ1|~$Ěa pH@nOSgg'[JloWn&'(1fq,KaK(VͧՓMpT-$en|K |fܶc.[ fpUPZE|8 :Ǎc`+rO &Z7Ύ:p|K&CZC'o1Zg@J36kʃf~7 ilxQ +(w ?H,"Df1)|<(\BCPj1Qyy@w 1\1Y OS?)%I?l,!),u,>46N?l~}fi]5) L0B9uHeiMG[,[Bګe|۔1us0(5MB󛀹A}SP *,Ji膃] ; _Yh!x$ݳ]/ς/ &*ڀ!VD73ƌTA5a!z,dE "(^(YWI YFe~rq5An2;)I+;äQ2+\GYՎz|2#0 Nb~S׬]hMȨb߮M|{_9^2tװ_R;o៷ CIJ~T8+1BB0Hb ;c/- |:@T]_p|ÃB}}˛IvNza2@zDv.k7J|^0Q˗ݕ2- ґbGed[I,^U'DXC#oQByE-8E#oz,,IpLF^2 *g[u[KQ-dXڥmB}zV rTf!C+ vT;Vޓ^$ΦE 2JӰMmrdY>Ard7~V`k&ˡCL0)tu~uq,AvzL8xrH $h}`{Y6qƻkܝoSJ2=NH#M{p9=L]q(ge.Z14qǐOo>3?G" kГ M {AsG~㉇,tggy'/ ݏu k)Sw0FJ:t;ڞLCj5(GL!R"~@C_yڣoX*yɱAgE:DLuia72.IKPɱQKEӍ~ %ކ 5Ĥx7F=B r$ 4.|2JxS{((cS][8=b u՛\@fFu@͇Z wʾB6yՆ֊q J6U?Xq>bPI)Dm;oׁ3'a;mF/ qY>09ŲؤU6)fa.n. o0UДDmx.sojÄ I]5cc|Rx/,ZcH9>Rm>ۏ@$Vv_ $+o0povj+= p 1aVxȠ~=p 1H1X^)1qZ}Ěo GbP;B[-<0΃=3]5GZ)ep )-^0Fs&о'5Wُ2N2~\i[j%rf ;5 B8k6pvi6%#띨0W7̈qS%Ǧ:cr3r_"JN94j)bmLX_=_o +3=~u-^4O~2(2U SxxJ0ET _cǸdĎ -,bbm)ֲQjW7]V'^@)"=VÚhu-5ܩ-fMDKs|"`{G`\W@ t.$ DžKW&Pʟuuj5,\vEۯSSݛVKqja] +Oe2^1XƾV{0sWQ0,N:{K,8]0=gp0{[=zf70ItԬAFF#@a Ahǧh `SOjrnv/Uyz}󊜽6X^ZzoĔ3k'2mw X\S_O' bYm,ŌNmT9PaJk4wcny2֬q_ˎ|&B"s2 }nJ!cc _n7 ҋL0q)F&'K?*O!&pE45$qj$)#!J֬)9tm7?tO:!_ճieF5GD 11Y]n(\M[Nݳi^b}9n^LĩGrpyU`To$i/5T^iȯɜcXhG4: VyѿqlȞ&8߽{5vCabw{ַ)S0 M4۱%ǝ 0L@veKDEv|6xs>Gഷ)Y)l坝r?ty!{Тبz[]}pdT9S{Q=XY<X6ty>~A7Q2NDQ'{dK4Y V>v:-~z=9 S?+)m"tpj^vҷy3>)٫LIo7h58sD)' HZz0o)DZPc2Q1Q@-~"LՍO3AM=xQqk狑Ywr[8K1Y.^ͤPݶh^w~t :Ιwa_\Յލ2O8 q=RLHڽW-yN|COy93QHG˙) fPGM8q%l}q(آH?[xr[6nwWsAVu@4xQ.=G4X5sdo2uQ6'-ÏdkIE.D8dw]NdniRKt.mDg|zjOc_0/p;)Je.Kh,㡷QG}"npx;[\%۟M G,Kԧ'Ҿ|F+'T; >H``*¡Q~.Wy8IX)zh _- ;%mW{8k$~f-LbOBEe`Dq:^ANAccqphdR ޭ2$9Cb}r&~ZhSN4Af\'tW*K9_*#<ˉ$%҈K .UOIvyK3 ۨw<=jzCI7%2+>aÂiqwQhq<}:5%'jO!\|ʽ0>XeG:.?X,B8.kpcE 1nk(k% lvheGM?U8խkΏ #4&\Gm s/sIW*_~G6]yzJ&hrWi!!-XӞU"x^TFqZ#@/$|l5\Tw'[*|s$ND|"mr[)%dHXO#bi7z{G&7ВQ.H0Vtb&8L"2{9 ]R݅/ywB }yy_|z 2><@HURvü7]sg0˦Dy<-#E:kCur/L%.^VNF{k*ۙc1o⧿le/AI1ɹtN[eT 9eG=d=~<7COmzc~фj3)G@[om5 (LP](BRӸ5=(4&u;$hʗBtq+71O}=c0:#@4G!Q9X6tlF]iLeeʒ)#Y` *T? yF 4(¹.4|Qt!Ґy '=U˳k nݵ_9'~ӕz)pיA"V2G v_UWQiݮ ͒~ge| M`Ft9涠VݔmmN$k$IhwE1xgA Ay2pEM%LPgCLgSg$ 9m <|-TdՌݘJXQҔ 6lxPݼUk>>m#b.B>P~(8>D,|~4a$"cO \w7\aRAs1Y BGPFi [.SwcS@aYi5֡@j0wyl3ZE h@i`-IBgW7>=$0h!`SP1 \GTfJzhP_۠\_؇4ER8Tq,$_8ᚍwzoɣ=xg6#k;}cz(W>aBRzCju~v,⭹iɞS!/*|m{f[#@Z$3?3&^{-3i$2$J Z`l͛p[ t6fܒVh6HtD@IՕ @tPq!D#GuU*51H1EEwfkV5Vf8;!W,qcr=)jaϣ6P reM֕)u"71wwKΓx f}`apd[S9v*|3)(og:8MV+K % 5IF"õ c(# J<9ƒb%DܝzGYҁQk1[k104d[_[ڙ ijх-v]l@Gl)b_[+yڃ!}jï#PɘC*j9Eɨs.6sao;+0Lq<AKX'_yw3ѿ*nTH^F*3Ϭ{Rf1srl35M_0fLZY.&jzJ^ .ݨ"F@4MOQ \eV[>vP.qv+\`K}5FAK~2 L:  H(neD!ь訁f~mnM1 RZYF1kЛ?o5GО[uf1d{(JxY*?3sf~-sԁ;S$d`Qsen\OJia&;m In 16iGD}0o>`\fiZ HyiS]w몧a]ܘ;n\etU ^xRT'Ι{k(U&I Kn{%u- 66fd ?i2k;YIQw]b!S}lo9""/*-I+0PJMs XNg;MG'EaB0z\asټG`]mt ` /D^JZ N_꽆+ %OWLs0@ ^l0A@|),*ScBP@c}[ 9 @æ5Hvj\;Ҏ!(%N+-]QdTQBu0#A{ hGqQFNs]DdAVQJ !=ebl (C4TbAuJNDTHXX ;x(re..{!E%T#T Ž 7σ P*U&L9 +PI 1rޢ5pQД18ꞝ<-~+UlFN[@ Ӵ6:T&ݎ Rv@9URkqHGQify~%S/`}e? d)]}m)I04H5Klf3UOrj~Gȃҙ6P)1 6=4(wg`eD/iJ;X׽eg g<~fF ԥdZyY*cT<-Ɗ%qPA^5fajM>dGrR5+9ϫ\C;#b9Bd4DLE}]`55J[rh*Z?2Jb4`ѽA.GkUɯ U|,c֫s#6##+$S2d}g?^@|:OI?\'P39dؤpS&N tyct'C{7VL~@fP*M/DJbx衟ZC= '=/24+6x p%{=Ybw5>Ѳ|#k+?Nr5+ÑDYxFQv Ѳc}F>"z21*p7q^s(##eg[fgЄCTEK(Z~-oNNBJ9Xʰ<^<_}<=} ?9UcK!N^]~{x@\N| xK\s#\0YWlEkw/Q624.lHxpN@*+9#j lc,=B2=`*Ȁ=_GRُf`[Q$?^c="a BH|GEZM:O#2 -!҈RZJ^/’)e@Mh&= ^,m{@]\]z҅ZoHuZ;ƽP,}I ~Y~y8 9RA!Fܽh?1pNY|IC44NNtcS2i oC^c AV{6vܲIbwWj]2+wٷR|R( ¢ {<}eqqXP0qL (y?|x[R NC(1 Hʡ7g s\ہ[fX*_k<ts& TI,U%8'{0+8;@ SDŲwVVY})V uO'h'WZs"<IYqC$ON6[$vwy4e~E>m l& T ȉae[I5(ʑ38ޣXa]Y^Zo#D[Vo[G+_+<$*~֪_v!|4B$y7GC<_} --]pk+_(2AI*͗ HdW>HT%ZMqiz=٥jc:땙7]Na7:~i);Lo`|.1 Wl |2Z(XԤx `1$V#U: ;Py$[ΙuY&. ]BQiO/ffll i揜/fR~ض'7OxSF&H5\?TWA6FL8Sn##3ZP݀έWίޮUۖAS=s?[v- ةXisF6SH*Š0jLEܗ ĽK&nܙY嚵 =8 9LG@Viy&$,Vh,x"2 y*^dR9Lh juE͵peO- sbsޗoV(66?vȕV_mP`7MrSFBr}q:]{pWB,Cd`JMs!3mvkͶ&\𐾨i3c:r>Zɰ0,% 4]Ro"rF&=ʨc@AVPsf!мh#Es WtВin &7H A(:^\P\}}SҬba.c4tJjmK^Qcy(L; ݇,-!UB+ #'0@1n TV T5ї5ELDnWq5v?9eј5)8ƗH Faul51NQorq~ }~m"A`=gJݡE 'dAUsxYEɚlø 4 {|_Z_QpŘƚ+8o x7_Ng|hD6 gTRp^]'ֶƀ2ĀUm5>θPz9-߰vR~7%4iZO | J˪Nx &eA๎nU^Z LaxЌ 6pEWW䆍z /LqNJ빿BΖWo/M Ǐ3hSc# z]lV;-0 Mq%"Ih 5e:q 7Z1qDVemA[;+] [Q[*Asu5 +]T Q}F#Uó6@&p}M,2`Q>8#Uf;@UƯv`BΔIx5r+ v (HiCU]00Q1$ TrKR7I _iaZШN?{ 74Z4D.YRCh}XP`/&pl4x|)~.@Vۧw+<AG>PYjQ_̟pB SSF97SY}`"s {E$X: *R 7eQsF_T#>cAO:|uk{B{-`U^`m*ȃ`jS@XHlMcAO{ #BBW)sU02;N@D+P*J1ߛ;_E#wNciVdeJl5P!V4&zsBkC MxBP c΢itGF{-Lr'^#)6ղ>{w:oC(Ӈxϋp"xl\ٞ$VZ>n'8̇-xJ9Gq>HlA;z QPxQdidNESʐ-*4 61A4-+Ply0D0cTd.q$n9rh֮j&Vdpb`8K.'fΨtiJ/br'o8g>q;C?QY^12/!rx"GLvl$[)RکK%pp$꬜y{g~5='γG/%V|÷3(lBp;diҰFX/ԑACQ6;e/'|YIإ%,E'.{HFBy짅jk7Xv> QV*{'{cp)!B f/,' cT-I˛ubzgyPG f*"q2;jK7(Ԏ6<8lX[iпq'P?wr4DM*Fć*!o˾htƥ?"zާgfo a!{OUX=}f{ ;obX0V?Gdm8zy'⋈>{\\' JY"X_[®g(ي?ruKb7y/VPCAK1gT+4ٰtQ/ ]Ex&RTEdeiP Y{%tM'o06ʗQ죯9bKnUIi ’ΐwñX -B-/f ~`g*ɥ"|ڒH]°*Q'"aN*J74NarDTh"W'So ]B.ޤw~?%x9LgL8muˈsr=7E8VttL(սh/'3Ƕ={&/hU1KiUiA\aI3÷Vy߆ƥ ^Yg9:FE9Ow)D5` .E:V\Wec=9<za@8v*5{~ڏ# S=e.k5]oXJXq72#tVCBb/ `/Pw<kf`>S*M@}T+~(n%Jll,KM=ӜxOl5~*wN ` Ç{e#:MzEC v KKɨVqjZb>@e\<D1Qۡn>YXܜqK*c2~yb3 @1Y R]߂$i0qjC VS"F`AW@E=SS ɎgZ"sS88EVG/x`p4ޒ|Un-)A' k`H;˾\@3m@厑Y,>}??LIlTVs= uM& uT}J8S%GofŒxWn@0߬砑Hj C#Mڀ[=.d~U4u194E̠?[3 `}IOfp"Z@?|t{GzqpmWKc9&R1)*;QE G4mIu2ȫ7Q@2$BB3!p6vJs呙L[vHFXP L=~pT$.@NpƮIأ቗ :PmB?+=Y a@ᄡbT[uzo tkF_y5C8VzϐhVO,֘ڙXatٍ)ޏe"0oaQo8#BE m9}'=wyնJ /X!􄂱2`toGu|Ӱv_I]sJԞ,8׉̀-\%$T%8swOm% q~>E3 \$rM|W{Dq Srs sPşUT(({sZCSˉPq+2q]Sr 0쿺3]*Qo Ĺڹb 2{ެ?Q 8>)վ8mJ~gbBήQz0{W*g - C䮖#u{0vkq>5KtQ%qW  ~gkys3C ev_jfefpy2sڊÐ0-ı&BkH'q"gC$TOSe;Fw=h/wЈJKs#9{XZ]Niq&#@ N^#R 1n30#D͂| VbD]kk: 0jnϜ œ\4r78ߊ(FYZA,H&#XHu]&o/uuh~|n90,e} r2J+\\cbt(2叢,rD7Ep|zg.w7{p[ @.GJ֨}ea:½ mn0nKc?@:%3T8ZF^D,,4ڄ` b#"x^{{P/lőhC!fa{X6SH6)K \_1dqM֘=ڮD'h^v)dw;boƏsœy3/em9ykv@ꃴa23' L?T08s 2;*}<vF^}qԠP͍J nm'|x XD[ז|X+k-Eh,y& [ "OyKO5oAQ5T8A姗zJ;"l a__ OCS|}7рAd2i!.ޮTdӔO6u3Wy\q0Ͱv3؝NfaӐ)ψopK]1H .Vxsȴ"&nUuWt|AHr\x0w`tF Khƒ"4SmeaNfAһ͝\}:O@Lkղq0هEh.r+J;fs7Gנu={n%ٹ%́?2B~-yU,Ap c@b{<~J,EX:H##@EzUȊ UJV[u@ 袨( @GeNxJ25Ir<"3wc 3ĵ\ej+i^DUN[årҋWGQ`>Cjjef*TPu4KAuԄkۃ2=$XQc,@ @!Nfݝw E-sЎFrYE@\oQ][6F `|P/^Ke}N =K@NAfWI3wvk?iK>Ft`10/ImQT &{TAFr$vٮ?"&=q #j-3p%z@5$Y\TC3TD@gl!?qsO:9}6uY :DU}Y6J @XDٸ6F$ TRRcfgJymx_0t{`1,cļww䞾]*{@UNdId>xUVD=_H; G¿YLpCflΈ;qM,Vnۍ7!g(3~d7#xECV^ս-̓bf@5Df\l+C sDKݗ XBḩ2g0u3Z5dNYRnԾzyQqlF8r2]pSEcA*wDPUC.U!J`WcR@uII70d[bjʡ}!e\]$sm7$Jw[~P١ZF]>AF`nDSnA m҈xGy&7AK#SH 8%G7Hu}[|qYLc͘7QnvUS7_d,/_kr}vvt'MOAvxU2'~7H'ߌz:8+e;5%N_)40󹹫1?l|Gfaed7̏󼏦o" -_v[zɟs+d{-ꗢw$qw0VD|F՗=ђ~9v3l7iԆ wҨWņSy n!#AVZP`ڜ!:Wa'Flamohr E?bL\CO3~~`? e-?Tc *xziw/0wX! ?419N~9\;vS㚴eJ s0kQ9kt?~Rv {.|sAq~,?rV6c.[m?d>ae]hXE&L#~85 a 뙢o؂T@mP̼6(}Y+Ac:MxnEVm:@-q^ Cx__[ $2)ن΅Xb%/\/1ZAOȹCP|恊umSF>p~;kC;nۯq0gbХţ$ZC; n?S4hV^(!#`phr^@ύUxBe+ܺlu6^6\@@ȕPU`1'N\cˍr8;ȿ#tIyllm~v oAS .ʰko;3wvXi1|šOPab8:h7J8z2a1"@bz&>cTWhr6Bg\"0  n^+&e^ϟ CJ!u)>?ڑP8*a~me-WF{{osBӯtP IbW:_ǐ;M^勺$Z[R6?b%4W7OᣍOQȐa M3, ]5kT7ђaA3p3 d|43ڟ8Ή-~5 SR^V٦np \ 'Rq?Y67 R!ÜGZVte>sHWT; rA+ {_g>Sߡq:~N,ۛ_+F\lj0~ ,|/KQhrha^?tߏ'ʢ7֤,ca{?H+1YJzq6 >.[\@'uj&E|plHnc</pnʕ-$oX,Vma_J"9!P/k>,p.M*]^)]|-( }Pt>~߫cGߐ?U@";td}$1.0=~BGUcT bHf?K+XnCPi0wp+,P5HLd 0la5ӏ q MNV\z C 1mj9OV14 T(GQ`5Hꄍ-ɰq T~]d2giCvUs/%@9+?f9kypX=s S(&ry H'*2OE*:qӅzN {'Ô:6\rLWn&p #=LSd+ArԋJjKp =0 #]h%*St !\_$vnh]ETSa)@zTi64(Oнn/o.Pb7r#1/H/z.t= ŕ7VD Tmf+N/~ Zי@Ø0JɈz#= ½ԂCCR+ȠA_>@ziI{ 2B`i2OĪ6@ *tˆ i '~M'6Q#w5KCGQ|دC E54",Mp9=z{SvF)FEPJA:}ؒmYYygޜtEBa,aX?F7[XKy̰Bx0klƭ h\ M% d+'-DlHߖ%᭲t@01ge ŒUwX]a %i1 C-O4d$TmA}hB2fi62 DieXm7ݎ'1LT+.&!#C|@X}X~؅ǵJV­[yj80vgx 8?4\̻G - Pi{[8h<}ۯ ;tN ~u Q*QLʯZ:*K'ѰLZ#Aeax~$8TL᣷^[HvrOK~8قO` Ҁ8RьfK4F,yÁ[$!Iӎ_,~,eA:Sa L*1蛣[tXXݍ@;Vcل; QGY;6wl^ea]f8%;ƨuZZKo+Qp$9Rq<-) @cEI!/O-fNl.mَB2H ᙶ4De_[]sͦ"P ́WZw9J}_"-'y f-rqz@_)xqgBgeL*Ul\#+.g!m?P]}@&,f[B}9cJ9FiH̨_k t}jҬt_Dc~pp*l@Ȧ0}S4uD\ނV%2#BI J*sXZDb-Ys6g%͓Pĺb"g Q{X)fl' 2F<(;GE B$f?{ }M}g8C eg^nί͢^@<0EG-'Z7h XJXJ dhw,U]2Ff1%*@gTŎsOcI ]ΕQZ,Pd*\ rtYh[L<"6!#;96l~&)je ]3u`IQ"LQRyeHtQ EA" V<|,od]cWu@iBwW' N:QN w b[,FQMPbۖdٶ9;R1.5ѭAr al:;g`9U`INtVw* =n]]>(ehĩ.1 #m. a 6S`(7?B³IMSb"@Gz<)n~8=)_gHw]GDih#Ȉ&;gu'. ao.|Y.8T?ȐsndHJ{R01="ܫ30K{%5j#Җ -Dy:FƠ@$LY8Nq ~FQ&M(6[w3JHg6!3A~#0"*I_oiWnQsY4Ru-/=RcM*iA^vcjw)k8G+mK ԔrL*PL9$ѡCig]'8kyLuаFsz{$T)ȖG#T{h"5d7=W_g#?_ ? uCLMičO_`ߤXU>9X|(t3SW3'iw"t4W~8=&aз.GSfG0X8+vUV K:UVW@qC5Ep 2'>KKl(ࡱPZ ĀHɁGTU\)q%YAybaQE!T'`悚#tyAAys*x*e 1r(n &=_ehh%e<Ĺ4 bY#ѓƱ_+!rnWbmg(a)"k 7XsBaУ8skD˨4RN?Z&:Gdታdܞ愈lHI -%eG\H4(VU1@؞c+xtTD .1!%`mqL}iaK@ Qn(PS*4rb7fi[mx5]A %İF$Pײ\4QY36ܞr7M?] g wJG!ψ"v!ɮ!xW`Jfmf.lOפVWFrM avi'0p]l0H;6mE7;H+*oௐ&.o0bXZK8[l{v &zҝwRJ EwzH$m;fvkK 5^`n㛼D`A/pSz$7c B߲ѴnQCg7#<B7Hű_ P;/1t(lĜOGDLh's[;s_lMm F3:SbI z#ْ#s:iҌZG;L~u8#`БBф// |}sPC6F=K}Fx¶3ίu)!f] !KЯ:DLJE`b|}J;J.0~܁dn+T6jn/~ccq}zig792횩RB(CPHkan8:P&ęO(Ѣ8Ja% M4mEcNyJ\ݙ,ґP(&'> UYqct_LCSO7v9g\ E}_zs>k.QMA}Ub*Pւ(H^v cdM$%~zBCFPȎD! T"H^;k=Qh DƝ=yyX9r5lI׎$Pz2 Oj 1a1XJW&ӦiAZj$XX6k8MU.<{oPm$ 73|WKz߼dgc>￟:o5OxG?)}ֻ&ӵg_w`#{Rғ5߳D*ү.%u$o[ {EEP8L{P]gs>L+OqI0'846MJJI4GDu_|Fқ-@'ۈO~gf2dc,+){?[&¿&}3Hf4ΟOlpk{Sf6d̂"4UD#|)z1IT$::U*tc%"cqMq UXQ.h``yK\xlGj0 5Dɮ~59^N"ҀD{V5 J a^0| SU .'GL -T8!8Pdw・*Y0{'M< Y%S=Ծ']<5*G`iGXY!w1ozEWoEUŴHاuV!#MXN4~d0rWwR)^<<ϕr9CNQ$k7[%zs!-6I^~lng "g|du\Ml~е49L=i}h2qpٛfP֎VCv:Eqj\|J;jZlUQ|H*ݥzcFw["ww-a>z<"ųf%KDЋzQO{ѻT_%VdoKi8U +?Q^]jo'\K Hn iɰv_/6c(9"mHn7m3%* lWq5 ,$Lj^̩Z3n=d2LAJM)iS 8 -Vh` H/֥1 4 lQ+ir R _@YL&\b"x28-{y>o G֒z,?L}_Yř(JuF,9[ /fenY.j A+UD06ps;f8`3jL)6c:d@_1nNAT$~} 2Kd B-0 ǰ;qsf_҇}KI@~é6~yc?I>I\*LV L&ڎiΚ,v}6\ DD="+!tJ?d L n6?ro˗Y_J@"^;A(jdzJFxrn=.ָ4[vZx Qn]:4ԱkR凕y8& Tp MrGos(p, H8*Hc怟PQT:anG=hYP+(uP=m~+Y S 7[t5O L%ڋhV O1%VlV:0nDzDш3_ZE|n"np&Vgԧ{Ӭ>pjsXuf`RY^@$WL^,ۘL*vߖCt(P )/|U&՝@(2>bQib$v7$Mߝ&%X2ٱ^>q Α g"3U:;) = v"28hy#tyѐx!x݉TTdu1j~JN+<1 9j MIFucJBpPIGPwP҄)`a72áK%ZgdQ#-~eoHH5`QC+"`G>#uJ&gsP}*Ϡ4KEZrcpAy0#SpO>R V/l-ZsAX6o7<+\B;& =wѣ==x性%F' =^IkÒ8N q]GAuS{D%ptNy7+d9 gUX9ٚ.nDdF=]f Tr8HM|w]eoqygWBthT2{_՝aQODA{U#, qLZvItE'OKW5In!(=ͽGFݶ  >TW˛:]VNMj/eԔ* m\S{wWC0b4Af9}Y]˗r:ɫ:]hNYڢI]{@} 4}̡(r&ܰƞHt=iM$Е߀Qk)FzYrDީ̎qjј|ʞ̼NisHjxU!F'P=Wӱ.EA߇zgBɅ& mQTZMoqH+`>)?.1Ff#[7/~v;V6a0-nAc[>Q%UPyY,c HXٟ2ړhm`q?20 c_}0:$'?BjSy;clI>jO74:.oqg! s</RYCJ(>G#j|;C+̷lQB|3eg@HƲ9i9bu_a/MצBx|ӊHm0?nDC+es/M\ZwnwxBPjx@!hI#("H,Hqa@  "4(H0@h7&1ɳI9kʳNS-$%{@1uvƝHv=/o*YcAh@IR-b g|A:́KZTPA&`$')D0 tmqF eFv Lqj ХKUc&E^R9x\yϠT=v,8aAebqS j, mf hZg\KO1 聆}Q=AZd2q!ͳtlL27el<͜𚞍x2!;'0 f96HW|ռ#蝪 $I0'qucFy qfb.ALoEu7:jDsEyL@ۑqvzn,#7pwƪ-dt('*mj},YӬYKl*02i /8 !HYhC;4t#N f$‹{|EɀXo2Vnz'xg.Ė&W:L↶;7hN#C9B:T]x0|Ҧm"廝._쩜Ps!J=vVZ wTxZ.,T>ّm8R-ܞri N(I:W!h@56yj~WkQOpc4/QN7@P2LU§ؽ=wL +P`/ h{u -6[loq?`ɘ{)N22"b-u=#'ӥPr|poR-p>C\9n.-@\l"}b/IN[PoC#Z !ƈ=]6=}IxiH֊89_IJ ps3aB^hn+7!yLYxV<jC Xkqk*{2mdҀ噛.k?U { +/ԍ''ƒΗϧ9=+3g4w0HGF EAZ!o[:o7y_/5mmMbaQH{re kO۳`"*5dExcƠ|81IEZZ/fRZxn!Dd8[9~`w#{GW{zN>>>_ '\7X a4[1>_|5,qAay0*rJ e_Ye~vM0DZקd4Ěc66!㷻0dQps#l+MA`Y6Cex&y[(ʅUm|N;P pbܸ& gGcx JOI5pBoHb V9Cx8D%K@&s`ir_,C"DX&菠0 3.3 0yD|V, &![X`f qB@rƫjπ:bhmH,j(e $DP }'SzZ@DΧ0s1!7ԔB,4(֜^dV60t 9pV#68PAuotc.4Cs.C5b'N&N%ZEBЖXVJO>3YISDnWnFz8Y ~G#~Q '}tF*Ԣ/5<&VH)2vȍ$.EA.[=8ʫ(:;rݡh,lN$ P~dā:fuGM.hQ8QKI:} qmd67:gZM*07rw6(@v(a/ -;yԩWw3۠ģ/£hUT6{G.*LxBmV9ۦW]hG } `VyNgw9k}h:1"@}<mX8jg xwn,ohl/ƴĤF\=Gڝm$.{ܰ[mDzNQE`ƱrMepY.Y.BΊ2`h"f.*mB^ K<+:EGN뺧?:_Ֆ}nt?-g[7a^~8_2fQ a}b:wG P2/J`~ C;)򸋥 ;H`vk(]Cg bq_R0p`ըyF}~ܶ$9P =KܯaG8r.)bF>Z`ybm?MCo%)ߖ&jd𨺧FW9RF6)%s 5Ri_dړMHGBwOFY ѻ==a,!v [yKr|XYwGg⿣; 7T r |KN9u7Vת۰S ;a|y_u˽rsa׆ UÙR 4?ߵ!`HTo~IvxSJ m;( T F"A1"/PV1KIi(Dc^qB\ <"d 5Zl\ń}F~>M6`❅&G:0 aXz=4M 1BX2{$CRVv+ҟexzK X)l es] |tZk IVLo_fm^KMYtE(#M}g ЮS;[A[Z_(5gI{˔X,˹Zؚ g[A^ݯdN5RvԚR"9it(bƘZbS;Cz!X:* MF=#]oe7[ŭ.M6yسPP/tQai7@}}<HCi 8\gǘ/v+__"׃:%uی:שFl@F"ӁVv$:;TͰFZV?MQ*`,ǘF=$ AWaHҦp V;89nʪ˴W`Qzҵ)kzYl@+W`m7GCHk//|E$.]M3RѬͩ{aNURb=z Lʶt4<R1Sb7.4N[ͼN) /nas &|Poܠ.FLoMfC$y)79IN[?"0w% p ԑ0K~Խ |`,RXQv]C>Dž6g nAF ?V 6S19fSD6d'gXlujRذF^oʋgbu%tAceW¸M7eNaV)t`u$Ph I1_av4:jj?5\%NPY_#*-)/ Z!pP1s\CL@S%"0s M ASzL";]_G*'eL, JS7 g>As8wz5IreKXn*16 /} S B_ZH5:*AV2U ng''K!0Վ htSWUX~-9MwPCy XE|q݈ -Y$2AX^fċ{]t> WѲ& ovתsB4E7(][WGk%JԭHT;rX-ձP =.eur~ԥs>D`!jחf(4P2{Z 1Ww2=hf=ߐx=[]sv03'pg/ `~&s^.̓qLؽ|mh(NpN0<ƜdKjt~ 696.!RrdVZr uk8 2'M ;C!CMޣl? {,d ɩZdjے+aO M8Z["&{+Fa${j{!KsJTOEmJ wT:9"Ͼ҆ ߸#ڑ߼ix0_R[ԠNK\G5~f'ȭ `ZF0c{I+NnqZg"ZpT!L*i\Z`6󋜀ĥY清Z~޶HPa,4x XSz x5[v1Ɣrcb*e`XH3k]hH*Ua/)~8|ԥ73:4$HQ؄-ZSNڤ2FLaO׭0T MI嚦`U6 ߛu:)vp. yc_|j{b28޸rgQ?#"X1|FjI+tca$40(EEpS-*r@e!6 egԘI/]`rt g1.I*'i-fS6vO@AYb%Ѷ -m:) s94"Ʉpv=1$P Y@#4pʸq!f4G}[cb鶬h&g""+)p#msX׺}WhIueI*} 2ͻ"4Jnd8TkOA 0G4/% C'stք7I!#AΔLGt6@Ȉ:ωYAB].MaAB >):]V 1JB,k5&^DWtŞzF͹hRLk(;e]3`sw2GͽUpz1!.G-X'%va%yw3"7ʰ25 `e Tkk)9rRk]Ik[b<YI.;Mw7 H F(F: tZ0W .(Hv)ȼ& QZtD@2J0f94YiTx ,Q%[X(R Etr+cd&f.ĝh} `7WZ3,#rTC>n /]el0Gc7Yj9<&'F#eXVs`HApJEB:L ѿhG6_ p{Fҹ O} ׏[G/2M7SzR @}]BI^]ZO+B!e9[ZYNsѧs[}҉VT"E`p!\Wf9 |ϾZ$-;{ЙzFn!"LiI ;mXM󽋑n = ^15 Q^T@HDԥԬP?pF"7?ٶ,0܀ 5iD0h àߡەxчpv`| hnj&8V^h,vUYx$*w΀dkQٺq=O]4[I) Q]?V_lp}-FSGL}ͩrFS4_gU{A®ӂ-n8HX=؊M5Μ~j[ܒ?I {Gs/B\>%Xg|2F;CUďt#|Lx(XC} {IG@]8t/pbxU꼿Mgǫ}J&HMXk/P=9I H}h;:4A'.>{q#jA]Dxw6$oᨢa^cg%5}] F=#M72Ӳt)ͦ)q['9S'@Y^TOiQ fVDKfG,]]Ʀm-249,Ts]#AW҅稸c`>929@l1s4Zr8ij }-SԴra \%)N^oA쾕p?>4 G0kn]fٹvebYH~6`M֤lFhu12Mnٷ YBw]&A$]>/UT$]xfmbW]̥4 <yk,Σ=&v r^D:Ħ`ĭa߰w0E# OAa< +^7 p(kr\.Uydv-4Wv$. ݫ!'rYhI"ΓHUJLtFTsC$h{SJUIǔ^3`8 !约,gL|VwB`yf(OT8Q`0YcRJ2Ԣhmh0=k uZQD cH!4 :xN4E5jx,Xm4ʚhӈ#z #h\c 0R0 UtTEPyN$90"LPI:T@;\vDTI㍀]8M|.&Ì v͊ _I=1n@M1VsXO<4-\1X`{$DZp M oF`]DRxoC"V+m@/ `it+\ՠ|rfZ1܈^f 4(V;PPVDn2qz~8G\Pۊteeworlds-0.6.2+dfsg/data/audio/wp_noammo-04.wv0000644000175000017500000002004212140200333020235 0ustar felixfelixwvpk ~fWWWGHJVIeIHMEj*RSQ%aYcYcY!ַbו{/gE&/|ߥ_G'K} 8踰N|ڟй*<;{ C".=,;n \B>Dn*Q+]?LRNmq: }:GY|KKg+$ k[tGe< !_L!(ҰiyD(܌ދl,yR:"R3+n  ~,ObYw4 Y0j ~3t'7P ||N%t\!ϋx.+se-G}W c/KW3u>A0\ܷE)֑ +HrM0cw | ]>f鋱fSDΌ)UP pTd5.unsaL ځٲ2nQ!uZl92 6T7Tqd- $wi/AԂƹyDQ@reYKGّ 7&fɜ* gK&q8PA&d?+XՆw5Ty:*-Ã:u0$ѝJʖ6Fj*Ţef3_cS5p+JqnQD5uQ:ذ󃑖UGɧ)C<\qR!9Cҧy`*vi0fˎ{ݗ}0 qs}o%k~=Kӝg30UFl2MwhvU0CI==h/N7'C^hf?XB%s? ^ƭ0q21dD-4 +myS|E)Ůih$X%!*'cwx/39dspis„i:Eu0$u1ezK ʀ+?F]!a3@?[g[ Mˈ!TLWM:sIяWkbƛcoA.MoEOVKA3%Wpqn }|X ڠaI NcnARڱ/X+/"O7d8YfL3'\%M`8ԫ<8JTibԴ=s!})JcOX61GgT{OTGF !!ab:ȨW IzkT>KXP-K2HYwʹqm+U<̼L9QAY!בʙ,;U(?+PcPXp+Ag\' . UD"˪-8]'|4D`Fvc(v1T`H]N1x406DT{ < *4 X,WY |x97Y0[Rn $xKxtHTg ZAS˴ ej ]tncvj;yRd*Ol'y  哜xĘS0S9.$F+VJQGd0bWu 0 Mi% [t'm. `ʨ Um 8te]&IcW?j4vGqCly:g>N;ȉLM50j^gi~][I06O&6QbFS9S Z9W${Z#h _`3au6F҇$"IImb2Q|$Oc`8,ȁ;YDel{sImF o_m(;P wwv3bZeYƾB]tRԄI`%dcBeLBSQlX&=),th%j_C;d3U(Mo`ϩ|O..uX+b/ _ ou|Fnv WuC:yK,oeD4r$bW =c¨'?1l d08w,(הԖ2Cf 3,*FMs5E,Q~QDe-+„OQiC-3֠rk$PIQ`m&kg:0ysg\|MqBĮ^l0,-)گr9!hjN/}[W24z8P r )?O(yq n auͳyub79*u/bȴJ>KXTF8C~%=pQ@ }:<[CWPKbtcM)-ғuVY3Xa0dHǤCs[trCAjpkdh\q'`e靅UGp]#^=Z:A(oD({\PS+B;ea/JqBBZW6OnXhabqȻkcAg1\܏׿T)Wl?6l[ PnXq޺ %]w&ME˗n+b< M۳&¦ˠ F$ǢKşIv"7D+v[xew-1uC-C܎jZ E#V |#KE:ȩ%SORpgY9rO+ "u9h#LkkLڃj$AreWn:\%$ZlGׄxPFqt~Qs,@.al]2Ed&Ȫ1x<+}~vG޼|MKR# FOff82/b[XudaT8V2?z(ށʐ(#ŬPuQZ>_ť53)C"뽳[zݑ ێ9 ʳѓvYnfnKr3~öE&^冷ma`#S3䃔}@Yz풰h9ըX6wO`V6˵e8-.V"Hw[L8?!'%jHߡ2kң= <xh3֍NîEh*o-B@<Q5-)8s`%/juQPBy< *I׏Siї~Uw o%4D2mlN/t<'/L\d n SvB2!G~Fm>ЍjḶ&|Em!QuaDA`Xc8,J o~(\y@j,tCKa1[)ʋ kW#c+ nc$q#*1ZVE7j |9i2 ڞڱxi<][ٞ⊷uXclmUOƼωl붅r$O/yӞ> 0#nX!kf xb!)/U;`P'9fWu Y*7xxM䟓nfEbXRD!€D"£EC.j L(!aHD*2`рdP H`CB"l40@C4 H@(aZP EHJcQ\ MՔ9mT.7щ2oD TTɥȬa3seGJ|A yuE9?">- H%AJ1(ȦrpMt,gX<ej̆^ 6a9"Q)cGNC^葤l6|ijć룖żA?+(.u~T X.*ۢ HwD;MioLB/Vs2yGf4Av8^2N#l^X;;2v$<,~uʽR*[å)H$bi3]4 76 z|0qC/ZcX`"ղrE2x_ y)m#ZsH:#JUGKaȅiW$OpA^= QIZh,>src:)xf&Tn# R=T3ـ9FzgqGnyf!y!z<=""'%K4#:1jCbxOqۏ>YRmm%;.31/ RNT2m=Q¶L{!j%Xl<6bq}UDϽe%;{[<si>a(jH<_lSagts Z}eUR> : ؕP0 ;[G>H_/w~|to_A~·;\? _c{yFm9&H\}lxu#͟9S fޭfTwhA&4eYT_#)D ;:F9̋n˛ݓZ C6Lvt^P8Im~IqIپ)3ueم$-7Pߠi0 #lIqHB-JF8e `Y$'nAf4v8ު%!U>bE1'!dSۢSB .n`sS/huobQF8S#i[^ G G;7IȍCʘdahT%ͩ䜆f3D=[w= ]3j9 -3洔ƱIu7Tv%NWɍxJ^Ha1%TuIeXwQ NUfv^ sX]Z@ױeX͈WvVۉ- SjȮ0fYh0Hg鑚5L?O^9NʎyْHVsZ9uRa@7 s]":pᥔL'38 k[X "&{]3%c(z9?Gw IsĢzLb}z͂D]zj1#zU-GrF˙ݙ4Fz qᑹ^qP x ˈ8JމoqysSAYn]A!"I8?' xN!T9š3'Aaуܴ(qN@!bhgͷ)A8j]'NL8fYMd=rd6Ut$ؑR[ixUʫ Z@f_Fm^䣞__\_v:2:;4xH9_dlb6aotY7``4zOyt7YUj 6m4[V[DYb@ݦAboJ#d:7ژ 3j ND5Z1~*87^ƅT޵ROpm q+ Œo7Ɔ&}B! Ok0).;X<\4`l \ G>6a%FT aPZ(_"B;Cr6RSKrc^QHok䘿W@ ju 5 TO -~zeZYС!4ܡkg-J5#QUΥ|\kˣu(Fv+Sq*, Ev|FP:M`aGޙ  1@5ɯ\Y&4 (ҿ%xVEV\hl&%}ZlS<̥yI=(jW=]b?N>"kCkr؂ E d.W~@\ؿSֽTDJI?]9rq•EǪy{[$x Z7iSlbXD^XϕOݲWqDr^! I~{9s4 ,xPVUajsϱ3B髖aq$')=˃I Qb] PmV{@0Si4B;tWgJ /\Fͨ i ]@6iVbōMЩtFK* Oj}B TcCkHDLJw@$R+eM>Z^,a)'h,^_8f+Dձ@u<~Q"4 >#x)dr(2ꄸ2<(LP0К u]NKΪ N1mm^7onҝ$>S'$=Xz7kHԌDƇ鈜+KfBn:@*j*B zLYh#p,3rߣLetNr|t'֥v%Elteeworlds-0.6.2+dfsg/data/audio/wp_noammo-05.wv0000644000175000017500000001754012140200333020247 0ustar felixfelixwvpkXWWWGHJVIeIHMEj*@S T`Lcm~~Ynex5%e>NsGb~w18yl]~?:aD45.A$= 5ٱQ0jU]oo1JAݭ? ygF3)/~nK6%U[sďg=|ޕ?H>%>BW-'Q?'.ULQ<^hHfC醊ߘ/-!_Qb6~b)Jfk))yuldxn(\T\"^ УA+֠ڄ(,TY. Q>r&o0 WSA0GY(׃9 sk?÷# yFj֟|ܝ_ ӿh{zvTͧn$/|0篭<5_|E n>K/Jbe[j_ 1gm=#N/Ds/ioWb! F躐*TcN68pܔ[6lϮ*ߔ>ETF8J>Jxm:q3xGx|C{o{jGxf sSjŅ B pv(vxU usb30tvqlWiźqkГl݅#Ąɲ+AYuJzLLDEn߰܏MW_% BS-ӞWw0Bt`zޣ52=cݔlqyorf7-AYC8ɎV湸 ʈnm9\.s5=yd^]`Ez}sOEsnMp֞;%(w+`V47Q#14o>nJnDM71*>!Xia7/D6v젺ZhL2rD-Τ$? в`VL}Q`ҏ&=9kQr+aUF9:BC.Wstꑒ͑mCs`VGT4}ns`rR x/-uݏ(q fO/诤 y<@Xds~ÐكA:r04?yW%dcF#QXϳP nyV3d}J Z#XU}B"Mp+od2@@[R:x[b M\<)SH|`FFyޔ$Y1$ay;q&>gR1od$\msƖx/E!4L(I٣. Up=gCpZ3͚inPq;&hB!qdFńv zINJD-}m! P!jew"2W(*[ɬkxiVlS%x]aHul H5J|QBg6k !r˵P\^ ɨCڙr !M7X<,GCT꼅Ȁpぉ|NUgnúY[\[j[ZlB>k-Q#ncnOpO=<'nS3ts]c83< kU츲O,(! J,̫ڜEv=  *^19^2Ytq[|W!3CG r/ux4淚26v)L+v/&&qX˻N+؏? aWxaTR*SS9h.v-(]`@ z*Ulm@BəA+ ?W4̽ +`g1v"^9Pltlck(ݛއm# =[W=x&ǗJ݇-vA8E÷B>Il6=]ȐhC0Lk| 09] o C:q7?QۿbX:\T {h{C/xĵ%Lޖxf8-AGQ%m%t$T:‚!٩%opeZTsb %FUYI&̝G?A.oƿ}i@tH}Yt2dvOA ǒ2Ή %+Gv=f&J}x!jL^7AۍZ?ь7p6]wS7fTX EC!Jss>Z2ֶakw(|'ݟ01dB!5ѴCQG|fT!&dЌVpt^B1:gG㤶: u,Du%V?BGPCJ# ՕEy8se X#;U9ZDv_BDT(aw,3ŝ8 8UT %=dúY Wm*ӗKK KJ$L+GS 8 {D\f,wa§< p+/LCx}{}K}KLevBc4 ,kOūj|Y d h^i;> ?]v=9U]B"NFs&eD &:*%!=I'-ns؃dyH,wF{! ^8a%OwTzsy_ځMIe+UNĊ?_c.12B66}Q75|Bydڽ"֔k!5QWN1ݴ6$z܋ 3MzW*.f֙G}JMEQv?>R za"֖^ҕ>u jLa`&2C۵&jƱ\B$eBDñv%t9>^O뽡lo՘1 䢜1͑kviKF(eവV&m<3V=tixbss\2rV{̑x jZ _EgR&EH)Mh`%GFƤi deᶥ/E4'j4>.59,X eR%ftI:0U0=mhᨧe)Hʚ_&=>Oq;"3L [\Z偦c2V-hdn ,#ZS&Po-qG@46v]HXvFahBC?!ΩaIb4ܥ(ҍ٠%ulңNC)"sxWΨ4cTy\cQc^D6AK7iyEqb~#^$cUey2ľh!]Mw`cKw7og Rmuc?E0[[ 0ᒟ' *nxɡ&j)qV r/FD_zh$Z4>t !^VlCWvB%f!#Fi{`VjG<f8¿w@g~T= ĭa2Z8m|x'j3; m ;)h/bH78a ؋]0 p2 ۩Qf@ JtIa,[H%n11P4"Z*Xn4Ȯn!&\Ee;»]0ʇ Iꁍ|Sy*ɢlu_j;&hY4K[GA࠺xû9i0Z#_^G؎Cu6L.UC:2cmxoRysWD7 J^m'ck `j 18r> BkϪFcU\ϐڽ"µCc ! /2U0$*+vZΌcbiԿC8^onb:FKPY4'TD+@Ta(Xm\W/@f\֖ n!qDy9fO2׼.1oq6ðII-`<< o|zc9Ti)Ra|oJvNXFDA Y`>J%DŽ_qFLyL5(@cxE'F~Ӊ6YJq7` L&~.dSqu? 5lF45|wK"@XaO\YhALBZ:mak)j I+( !򗸷ufKcJf3o"ޤPݘkWjg~u"’ܪWx qp۸s@"IGs.@fpHZ]+O5Tr{ WAT^3lN 6VS,@]94PF>Z!$l5>x1mٙm=q-G S Q5M,$@&C<I)Q 9zÞ3L^PKbr,<)B[ ,EAVvh/q:˪*Fox 93A?|ɒwm:޳"1q5=~P٭4 Vf<&#ԟz,\M&g5dN%};wߗL+ɺ7~?S+C+i4mS?HRQf;BmJMBnyҽH`K=`E^zڹ2/Kfg+cDG^ 9*/{ݶ1U8S%ƫTW<+&eUvߘ !_eY''߉He:i#Rs!=U\p>8Y'gAX`͑ݝ** =tғH(;Ǻn0Z-3mdj^) O(/C- G,QZ#T8;8j#17Q[ʊY;QW:w^[{?6OP\Y-@ w ] ^XGPtG#|/d5ä]0U)+%={4-E_}@_w5gw;_=xpGh+??J;/{ݓ~6ϸ5^_0cm/~UL #|#9*Di\=fJsCd%Uwƙ^尞/eS(j;8zxuYPmxD5ht05i$B_{*?ccW(bR>|!8:Gb!ОߌHg#sb^?<9.(g!a&ŃDzJU򐗡)/NkWvBTk(nL?a Ÿ'!}>k/* JL]ܦ`R" nA&+EX'o4$95ce7oqYC̴L)8Y ?UY e%}0\u!˄MYäqgae>FOB3h$P /rr/ON QX@DzS@F0KH"1=*~? r?$>s+z1Ƥх?O}Y7c߶H+%WUFP!`Q6F$7P*oP}PmՐ5b@úu =tF̶d V+8aǞӁ1s>Dͤx`b*0MOoP$!XbA eZ&lV;0fA33C..R},TJfb6Pp${Qo~=Kxg?4j$p?q&/qeD]/fLFn0g$=5(ʓX:{]頙z7{teeworlds-0.6.2+dfsg/data/audio/wp_rifle_bnce-01.wv0000644000175000017500000000422612140200333021042 0ustar felixfelixwvpkPPM<%!RIFF WAVEfmt wdata BWWGVHCj6e`  @ @ FQ55F_3KΟYc_AE`sS%_v] eR<޹9ǡJҫ dK،2i(X( #M;$d:PL)ܥac@2APS`em)@!dLlB/"2^Bi0 @|J&080WQ ad?.J`l1GlAd71چ+"ӡ(AOJs|&(o?WҵSxzD9N?Ӓ2G\TZrq(OO#yQ;VUA06k,d-PZ UJ2[! Jʝ+JB䕩~3'e‚έop(cI1 / +%<loHC׊Eq擖!.&?0 e;@\p^uWH:h %ǡcZa.cS ǐNIRjYgj-3 ǖmH_>(?d+snPBF϶)fPZSUZ%Q1' #^T<!F ~ʓexV &?v 4~̹"\!JEWHρS_#If#Dr1s׋nw<ș\p4(;NPS'.z4+;w(+G+yCWOyųbƔJd^L#nG@ >@M|m(8AnXTU ~y! ȣ3ͧ Ghȯ2ct_}ǀDsEUJ{%MƎkl|'.`wҪ cE9텘EP d`94 hup'p^aO VƠΏ .`g791!&{Ygh#% 3O$ gA.zI4MWoiǸ;"~XBfNvJh.mzB. `"B=BtCkR;AcP21Q;&l]J=\4rQiX.1e8#@5K42O/.~ö@ T1D<"&A6J_սWf^A16#ZH$-\R,Q,LDE̦9ʌ;Z>Q[\p*=zDATX@ q=ɔ)<j8L@X0s@lm|@>|H.%2OkML\}?z 'ZD(GDH$9.x!̂E{wK&KcPިi(V@& :\-#@oN־McRK v B`BU^ n#€~Ƚ N0 wH"@AF$Y"DcC~dFP](RWeɀL"2c&W#?=kx8iu~!R743O}μA #.;'O!g̼_|wK@94X0̑*V@]X*Wܼ!O 5` <4cg*յaD W_$L>3Dr7}ɵRÃFK,PN> GG1,xh@_1c xGt/~ `3ʗ"<p}_(| 84UO0Q9ŦמIS|F᯶q\`j%v#(a1Nъ }URL2^pny X@-SqL2ɤČ6KQ5?|ٲ'J+`#0IuFHn;)W@SNJ7 pNDpC b"q1ڼ0(a&?$Δ=M/:EkFb \ui%J `?Q q <"/xD̘Z em IHω -B8B/T~44XhhOG)(('՟w(IN2%&Gbc=yC9Z9CdwbsфA+Nd;tu8 Y8 ail |΅naN3s $} X0%=CΎxu3,q4(ztNt晖 п'q0:ww@йM@;@ȉ:XXBϽ+BtCGkк kd2F1GhLbiJtnmevQ_H`ތXLSM' tòj}gѨq[=t05O ,p} fwv3/?EYL ՚8Uvg"8#> t:O&.k1ӣ~n2G@4-!b~QG_~lZƽAvbRY w8:f/NiaOpLb 2' Əf`P*{(zQީOA:၅%yR ؀%}+p$' ڍ >2MS!ifr;$!9zB5 gܱ6S?h)=8 T0A=b!=&,V'6|H:{Q?CG&~C"mxEQ#B#͙!L(DH3&ކ3;LH@*ಉ0/ؑ3c_&r1%?!E'F3"}reu^ [1uDR1Q>,YJ$|| 'e`kbE/S rh` _ E8,Q LQr+e`p )a`IB0H4tdO5z *o;w :zѐ09]@;|Ma6qK݈JP C= 2aFD 6Q{WF*Fj]PA$zc,( PwFIAQ@v"B3 (k2-$j谉.K83o ~YiwBX_v -yOtt/m7O>U\V@GDOhJ Lk$rBARHV6Q7S<00SCv9mLSb YQG;6B|$(F\n'VLrbm.Ϣ`A"r1#T6,"gTU0(aAIE1' d*՗Pj ~ʓUG:Aw"G4ona?!1Čj'P? =p(lwRjfi&"ѣł7Ѓrf d-#a<`(n A'1&MV5_t&1EҺ4.G%0wz8hxD^,>5!7xC(T& = VA[p6U_^BOvH`A!RHP}NߟP&$'{)MƎ;'.! ;䇸Yr xt'&Zq'[P]4dc'@9;N>#vy?\LQQ83%4@5`?ëI1MgZ1C!z-WXBVR1n9 8_ ^<3Esِ?v]n(cX6Gh)9S vF|WFQIԏf`ތ*QDn ʃ5#RX{3SQB&t׬|"gSaLy!%=#ѝ *]kTى0a-LV!]=aǯQfXGP#,c3eBOo0q^:aX 4=@q|{ὌI (s @!JcO@/jU{}kb ,,QOAk s6`1JYD&bl% E̦9ʌ; 0Z NrJ'0 lx4Ђ#9 @XXۮfXK[QS3 X9?ȟkF#?7v%;|KNcF<0n J.Kl*efP]'!~a*9ഉ0bq_Q1Wqя*~$sqؠ9=xb != &IBZTQwPgN_=*2'؆dqy}tc~8fIGMpBLя 1Cq'ٰKS?J$βLyL <ą>XLD=:N[ zgK"g2NA۾P[ҠI S$ /X͸$xvĘ5p())ɔ8!diȘʨD9B1n|7I'8`N!c8('!d%lsڤPI,TЭw-"  I&3&dX( (H E@$@#hHteeworlds-0.6.2+dfsg/data/audio/wp_rifle_fire-01.wv0000644000175000017500000002460612140200333021064 0ustar felixfelixwvpk~)NNM<%!RIFF$WAVEfmt wdataBWWGVHCo$  m6e`@  @ @ !BB@!B! $ @8 p@ (@XDS\K4@X2c~/@P8CC\R_CvOcTUUv~rI^٤J g^օ\WB_P 3u=L E"-$E' rJrH ScN0qM(+G Uv,9s4=HO#:*bt[7A/oYw,?i,K_Cshظ9́>l >Ncxz `'V*HҲKl4Ay߻ѭTE]RKM R+`Bؙ{Lg=jԀNjΆu:vwR| _Z=yI|gMmdoK~<'!iHB)wf A30?p&b~d)\^`G|c20!LaC6!! !A#2f!@"Rh]p8#E (!U?AC|cײ'8%ʇcկ% Jk/[TF ?~ f@?*1|cX҈b)܄T7+X.ч:aPBPcʯT471TJ&(Џ3Cӹ q3UV2jBYp4A*B(h)F㏾(X|?S* ؔDbXM.Bh2_2]SL1pS/rQv!egă6',8?p:Zxa?CU$Ɂ֤B氌 cQ_2xCsSfL7!H5 &Cb߅+ԩy5c ,%q dAB-y L VQ>I,YKxh&gb2_9?~'.oy4)4uKx)JҰ-Cұ[CV_!쾃puZm.|t4Pea&E<:1iK1nJ"ʬcļ]%8JC2"JK0<~%k`ۀ%Ap<l)Y=уCcQSbh{H3qCR~> SgNQ 둶f>oYƌ s\' 9Nϡ?Fu[EqXhb*K!:Hi/eHM-j3s&[ w2` ɀ@C<>Z|sru+iJْœhӨ8rQFЈ2!ĤC S#ftPO+1*Yq:_RIҿI$^p$ i<B`c.c|jC0b!`e9&gN9ͧ:is<C#rQ?I0z 5u<,9s\@-}dX fҼHT 3C f4 =NY% @n PpPpp qU#(07?wa;Ⱦ\D߇j4 /^B8Wuwq:LtW,hhef Đ:<%x)BY٣ 'Pc. f2F #ܮ)-``B=2DŽ 1̓Q* x d&a<"(aIlOSf4}޹RK1,bϯG &ZXdF=G] Ls)ѡ=x !5F&"p@eF @3o5]F|=ezк $|:Z*HP~Ndp(AAhis 1° ټHեX/sH|5FN;Mm*) L<2'>&1 DZsH1",p@SɬB?CHT[ԀEE!@7rfwC̀0[S ĸ )")Y,<"#p`1["h6`H\b&#@1D\5 ZDDIóZP{ 4TSt]}) ~Kg@ǛF|c}$bW=ϦVFD2SL)uhѮn#8,?:JX4;&וHZ%`fui\\ 6 C!7\O[V3ݟalÅ1S;1 $)YQp2P%5e]$C/ >?a՘~CIaH)0i<ҏ#X,HB# 8PA#LnY$OG3N]iG1M~ڱ~Svx1HB8%Wځb)P0˸8<uR>z` HE S*䦂'gB\ D@ˍ{{c rB c.;8p|Q }La'" {_&E?EĖT$BFpdIaA-& j,@Džmo(D| $i e  sDa.mFH#`{=F4fBCp`2d=9ʐ(5ʞ B@ތp(dQ)DD'Z"X֫L& ueA+NO%]9 F7Nۣh(+Tc*7G`0<v+ll0 *`iqCd"V17|: ٵ`1dltG HeBDCKdUUA L&5/(D`_1! ȈVDYVBjH"cU\q_`@Sܢ ؽ]0I!vbjX+Ad) EA*Ep&. $`jMN>GIУy`@6y#BFÃp-p!שBp}7?El r Eu@yBL{ĐV y; 懑@0nV,(̸xU#H砨T/j&u`iCA31$=j "J ܌\U"5ka`"DB#d8GߟxjL$yu"ШKMdA ,$6o ! x%6 HI0]L*7HG5 y;< #@xcs,v8$#>4pЇuA?tǫ4$6 CZJ .mo;<qoO9&.eE+Ah<~avrw )Ò?N~v\J: CɧEadz^6j ! $v`gL ^j0p Og0LboeJD(T,'yD'&F aOj LBfqRU @՘ϖq!RďYm"&9# Į8%&D0*Wc~pf4 @npʏڈA$"j#<&L#U fRۃ CC {w-LHky%c82:\U3~\Hġ"<ǜ4Y,:sl[%PQoxGsxKF @YiI$8: 98&$f@>b8':$i .’[ @Y^'z U ª\(Gy>9$<y(`Y0 ,"a0Rd\lw@`B5_GX DN"p!wG5:`z Q7xMBxĈ_L܌H <=:,f7d!J7xty#jWs[(Gw` RHBCFגiU|ol `dP((z $9MS?qyNL  M>^˓D(,4’EK d 2&a|"e4_SِAf"$ɍDa u;EM(0pB7O*."Fdá%Q((|mpw8J(h(Gvl& r`Sx@F-b(?h* BJR\6 |qD%JFfA_$L` 'RHmCm|!4$ R0Ϧ< @Y|Etp31O?&E^>K<(}Zv))R,"8WM"$IZ+;ɊO.U3ƈ9Ae CZ5+!pŰqC Ⱥ>=PI.`@09m0F *9P"x|u%T$0f$$lZP=>Oe#]CF&8J6#V~&j(!Ą4L<ι|DqFWc` $$` Ճ OF:Cn@)g/\6x%D!Wc$ʮ?|"GacP$tjlt/$! af'|&I @M(@`FǿǢ0&&H5 V +y+݈ @F%-7FHj7-el/ [O˽T8f  Ν!~BK b@qSd"dQAG_J?y2 c"a;:wODje`K)jfcmTriP#0ISkJ,vA,2|}&+#û+@1JQٟ^i@D$@ڡS@6RLa{~+>AI(qHj.S*edGo H ֏Jt!E)`dh,ӦC羜9Iq YȃHH.A+_** h0 Y_H0 Kx ;@Tr|~k_n \I b,@ N|'s&j#pz|#SV3%ǻsb0Q(AQBw^AC;0 @GPFȼn1&&@hv8D9m!X`D$(LR_]$F, A4 |ЧW`R$QNF fkTf$EyCcż;eb.!08ca>J>Ĉ0te:ك 2ޱN"V;u\ r!Pά,ppa`gH&/HQZl8Ɔ>М>hJ@"!@ @ܠ6 g?fL`Dt$pF3y D 0 ;ɵ`֐Pㆊ@4쟩G; F !jCK /d9B H0<|%>arL;J@2x\|.ا&`h) `CћOQ 7 B :>'9_: XS8ZY %0ͽ#T :R` PC(K 6s݇ƭx  E6Ux 5@#P $@7?:PT # L;)SzDڱL,a.=yTq?ώU=P T6 l@@9LMN&~EHLaM)D2"Cr$R}9cl|"U\DI$gU=+ypfvL.M1|bTB@~ s!@d_9z̭E#p.$R\jaogaŬJT ?_u8B$}$ CIpӆ&|xMţ ³\c}8t 5 D{AxSmdIpy$'P"D`O?y(_H5f@# gsqr$v|Spf@ 4Qb݀!@5u߱NرF' Xэ:Kt5a( jCjpԟ=w0|,0(Ju vZ HF0Q ;;Tņ>kK OcG.MGa\6 D TQ<߿YGj4"eC =|ugu@`4O8:k#|P ioԎ`@LR "FWPw;%!T0 .V:؉q9 Ё?v5pJC#>uf1ф(`”CYH[h00E )|Օ?,,(#ШYCPH.-RHy@':xMC.(µ3>< DH`)4Q#쇧 EކdAD-BP|S39 |ګGHV 9b%&Eyө/( GLF_R*Ѧx1?٠U+h= ڙS} 4b(Dp$7f! T,8p !f1ߑ"ddMaXp>XP8-Ti-P:|uF~ɴP,꺿: هш3LB"&4Zr LG0 ٢T'7<jL4E8p2P-1 @V*#˸"Jg0_}W䒢9L#$4z\>3+$J Ch:ngc@ ͂\/3l_ WIt>PzNt|v_9C!-raDAYI>\^ׯ &*Dz SD] (Өi%T,R @ROݔ+"TL@DZ`Pң/~1Ca:@6JP2.Ptۇt'Y)29*0. x%ݛåi.\ 9p6`ܑϑ@ PT"Ipk(1I!j;}8?ObV ) 'W,:t&a_? (.LTi̐т ࣥS"@`iy@^FHn(5†+ ^b 7~|e+P0[m"3iG.z<6LN "\q #C.v'sJ+L3Ll(x2Ma &XF$ -pP'=T` ϩE4P&NA&u@sOT縞truЙ2$M(1&Hj|l(`3#@($1!u=Q"ւSg SSP#?i }@a[h\w:=UI`Td.$jT5f)BO0&BPKfC_]uZ%<2XQ=26nRK, eId'tJSMS- k PEzx! PwL!Lk 2b!@z>0KHhdPL3| c .%ɘb3x e*b|f | `9 YO |KT$!j`$Hpc%AH ra!dvz<"c > }hMg֛H&~yux"pX48H $Pʝ`(@B":8S,K0"=ɓ5d=$!dݗB|t]o+EsjpY.T*ō@QoԼFq~NUI`;G€'ߢ F;.$ \O/_tG7ҚܗX& A$r5#KqJ- <xeMX!BsbR}ճU EI!bĈ#F4A wIߥgfqDkxz NWIP ,$W3͚u_ª\u"8"v:ETp ~x~H#i7!H"/GM޼}#&RKۉL7 HL  RGp%:㮍w/H7h3r8AUkS97W:s:~ lצ1?;f:oi< `HD%b46z,⓽P0HP ٜ&FbO6|¾GbݤhrHQF8{w+){f\ l o o-o N 2tugl҈OAiЛ2~TyOr|@u.u FSإFQEA& qtbPC82!\ȁh 4a!F+#& c@]g΃;'G})} mJdڌV?Լ d~?:?¤g+x8bOZq:i88>5%5؅%ysr YQ)vUF`&a`FǛ,\#E:0.}6nűkPX*>ZAu-8{+LӸÔSqu42.E-Y-e(sHۅB kj4l:Q\*H`@ zNAI0(iNqisX>*d`h7/Q$ O! }e`.cyH,PB N=H@E0i)` )YQI1rjqh<%ǝ0Qc}`xG1WsBu;Dn<: H̀}ؘB}CR(@8(6;&h<b"["30RaQGdƤQOP |zf VPJ9FU ]:uD#[WvVC 胬5\`d09Y ~S`R)",T~B@5JTm@Ǩq)Xv\&5ngJ~`^D<|==cXb_SJfVmikA錭8?d@E0WIn#J*L b*=K `Cb3=U,?ʵK'JEq;mS :Pc\&QT@xdd4u|m 0 mASk73ZPG@g| 9nN (T)|$)b1 L/vM-V Jw:LcC$@G@~~ьÓ& AJVd4K0r ujL D:mmT6K2|\sH[@䰚@2TE5 8VBI"ĝҡP eCϟ2xʞJ_NP?Ahn@3ry'հ )}czJ{G!>`CJ?h`Z9x*{!  (3\MP?Md 4`h$>Q H  -&jzvPD>*ib|2Fq-pa &D Bf_]g0@ }jYrK0ˆIstC\۟?)`Y&A,&"D&"PdD?8;F(D`+??I >N13ߥ9R"wu / @z @r.@H %?8x\,$@0_ U "Zˋ.`A; ҈\٭CS"PR҉y.`2!@$D R䯏},)2I"T= r&!ԥ"y%2׏#A D$&I a<9Bp=:t<: `3q! b@ ɭg<_S, хg?rcz@wۉ'd l͠-1uj*H檨43)rF kzL>(1 mFq\+ȡ,M!4␠GCD*p .o S!(}3?: Hf(i($0v%0+r&,@K~6E:0@ $"gQUV`HA%=ա/w]@̩ @ |2Ft*t'Ɍ+jbXB' s`rxb~J=x̹bMN8$[BWa8͵$Df9 Ac @?Y|,wJ@P$6TX :skZ5@I(>Z@P( XL Z p0 )ӳ.} \J Ģ h}p!ӈM1#PSͬaѬF~|Yx3ΰ0ECPV?~Ae` aC`Dx~AB2 <ucf , KJEc4,A N睊(@8"T[ =)ߌ9y$9`xX;@*M~T4a!/y3b"8;T~$,>#b\b b HP=&BPaS~*`B #ֺ?e+fHFd;{^P! (AIP1#6hxMH[ hG7& /ɠF@8#(ZS`R1p8Kg̱*$'@ <Ɵ @ uPMd>>t=,$Piew.# '!D壞Pd.%<܄f($<Fh^u 48CL&VQQ=sb8-( )eUb4ixF{jO|'^E`A#:\TM$x˅'-<:AUQ;3aPH b͏bC>yqQ,Y`41&ׯYe@DHL&1\p|{ I9ADqcXtjq@LK3JHxnBDlx|n#3v02 8|$?Cp+]8aHq]fZD@LsYä¹C %ptT6! )dql;_ B%jn~\<Ej( $H $2lN_hGdNu e HԹS?k;JH@ ̜[!U͑J0Q f8g 5CI@,prw)^FæpN]hz rv c&@UX0GCW9*R鵂T""~7:+2q؄#Oٽ3 |%FĺU!`㷷zfFd2š`vNb>|0Yq$L@JT ܻ{B}(w K$(!~𓐳Ph@Bs۱7*0ȝ04Uhc7n@PJ@8䚊tIH_V-DfLͼ1K͌gȸ:TA$m0^}LƑ+܆Lk"Z, z\r)@luL=%C:9%0#98cP1fA`D8H}d}O~QH8[pEIiz>Tl0Z$*JX t4aQUmeY;"Ts$ܥ`onk)alc8jBUR}Q H&hC_?|NBPOЄ@G0vTȡ@=yF :!AN 7 P#+Rq8 _́ 15>dD' $l8 1Z$TeZ`.f`7>D2X?ucxP?1+j 030\ ?}]WHЃPG5IQ%Y2P<6Z'hG4`Dz|J55h8+/V د:*DgDF0Dt4z`N9+0*Imd{ J(Pヌ,P>XA Ų]vOq㌖l,Miv ,ڗI=q&PX`/~?˓!$TT-&><: B `a8{|UAŘ!L=ep";"7 5h@|RwlcA -#d7f"_ɀ \aL54(As /; 6,a$)'y@gpC~>1&H(ll2@9ӑ=ȑ 6,BJAs`0hÉJ` "5H&P<؅\B1 Դ0UD[D$C0CP31HRGM(vj+#f׊?0&:gK tRSn^'b&|&, "1q_ޕ]:DM-HanEߜ L$&%"bXLA 4%ENŹ>lLYB6W}{`B!K\ˆ04ټ/OLj,Aq@^}(tQ' ʑfIN R8Ò尙{LB@2 iذʰwHJ Fx$\xT\}~8ȣ}d,)NDm4rnJA?jF82Kc}H~"T/dQ$||$?jq G4RǻP) QiI_LBPG_]8]: ӂR90!~?.-E{ՆԒ;FQ"b>.% ]?vVoo'6-`b#udǜN@q dPc$|º mw ֐Eߟ ՁG's0)u\e`挍GJ(U֥Id5&H &Kbdz7xF(`.Plfij!Dm0 Cõ7+T]~7ʨNaQ>ή[11Nbn,)8uQߘ0՚VsA<8ʥOX$@ ]/ɌIex&2AꨓӎC[p-n&jftVq<)Y~~W bnx^FnDqTajE#uiω< Z8U$&5nS"CeXZB}YTBPZ M" FTpC;|HABDԂ `6[nOWM! F WIL^ A/aͲF2$1Zl}BB !,'n4ɏ= N5tBA^EӸ؝8\fU"}^^_6)Ļqr)C){$@q 0^¿95!&X0k(D>fl0UlDkc;L+i`{GQ| ZѥϠR$ce‰Q80GܣboMXLoFnC@ x@‡QX sshɌ6#;G̓$ykiOT Ήb@?+/I[~)pm#c A?T) *?'K c2߼e9ԣW}>Rגa4AHQVuSN e=Ol]Y θdx?#h4ɜa̐IfweElcJPxTЕ@h $iZ FX @q1sa"NY Q2 'skb4IK}*8~< &$x98P³eʤǰ@)B'h&42pi$,AMFn FT nH*+8I0=@A 4$ IjM&d1>']Sa !4 rd8ʝ`(@B":8S,C0"=+Od_~$LPΕDN И!'"%58L@DFNp~:n Iڄ>} fT?c`oIgaBQT̝4ə,)1Z? '%!m -,nѼmSt>~p>r@@in'Ox2f#3<9a4 ("4#`HKQ|WH +0EKQT4`D!d(LJ: F1B JQdnNNjcfSSy_?21#G!-eGsT}u$UJSyzisv5*Vɏc@h ψLl(^k7 }^( ~t%)#-HJAaX]%)th"IHzȁ ",4_3G! d#~?Wɵ<򑰦Aq=:F0e?n!Ġ4 hJ/_3ɠH`ܺO,bΊ]f*Ej8$i-(H(gl?zE(Ԝ0 cpT@ %}@95 UN5'sȮq .Lxn3&>YDv1v~d;*Rʀ1~И@TyFlv2;-[Y; ߁^%|'*%Ol` [%ZڧJ|Bp<=X JTzd 5.V$gMr_Vlpfg Aʋ#t*:$G)B3ר$8u2Og`@b ~*&!H,8VN1f[3WE ֧G  EaV0L኿ $ ¾Uƹj,T @~DJ]z21eƴ$-o ןjUp@"TNL#@~8LئK_e(;$B?{tYn DK%RxOjGuH?@*BZ>@ڇ"4]@!!V>0Jcb5:eG6h@s`y "V3QE &Y0XIĉbE bF !R*ƃK\&@^/[h iѡOYd8>p%"VW$:a"`ؗ#DeĨi$O+(iD x~"PvXI ~XNSD%G,X D1W $:]bN"H2{q(h$#4i ("H4e4S::L슖x?"ŀQǮ6 48,](6@OG!8>*( {lPG,ɜ9H *B9$b$ y@O&8I T3!5P_ 0j("+GkH*HZd  FHD||,&2(dΟ0J6F\籇Džᐎ&1Dx}HJI\%^Z#DF`蜞 IF n-D(($ȪT`)h/pJ{4P P =^0Cζ;l4g' #tz'`2hHe2>d*33Ƿ;< @#DBD~"z C5&WufvuH 3 {k7`" +W˭(bm|=@)ǮZ@ pƹ~* P&`L shS"aPa%S^Q6](jf /YV0q7L 5\4gPd |+G2V,8~@;VWEC` *BAb Lј#Ի(J  Ճ(J$P RCR 4, *1fD!@J}WA @ S:f݉`4 ƘwhixPG p mL*(A2ځAsr~(AQZQԇ21 Ꮳ XQ$-$2CѺws If]J'ABN"NAAAJ =r:`@IdoRvT7aR)#A 5?ʁn ?hse4 FS%ȵ+ud(@ ,d]̀!d% x`iKJb J%u4!d4H؟&Cj?Z'C@1CA -ׇTM` H@0ðV.%1CP,ԧ Hւ;EzПf@D!H`QRȱnT2(dBI$ "@ $(( PN !{* r:!`L\j={%ԀR4no;Ta@?..cVàL@3UA ̀xwE(z0s("\aK8q")R  (L?S>[h30\,@$D 5$eLFDԵS h@X !F[w>hXDBhF.oc #BɤHaGt@bLR*`|sǁ T r~L$A@`لmJ# J#f ,vpMj@pqC ?p(=PɊ@hAR#dr2BgjM5ȱhv95=L 1Lh!a5w^hD(da\W@ P\lU?ypmd#?BQ'o` 4/Xl |G'T"`KyjCxr"YN?01Ѫ C~4v,"ԩ p 8b`/dFG$@:_*1㣎~p2w~q(8xh?Ep V0@"Crh${,=pt"/Og  <18|{a(.Ǒ,G^k}GfX!Xȃe荸G3+'̌$lLІyx F'P0"hD d #W@FL`&NjSCC D)i 匈A p7z}>E#Z 8.6Q2)ТBXV>i$c@DUBhB^Wk9fXT?>̠>~7h, &N}<|,"aD7aAC/={'y؃a(9W,UãmX1"@s @ПS-Yb s/42 y@'Kl1AH0|>!S p[.$P ;W/^AzF @[oP ,‚86$w;@7 ! HcAz3 @)c%"i` GKOHtwK9ݛg?Cx QY$D;b@ŹbL<2FsX„伾}u&s06"L8@-#`tQuɯ\ BLJ2FMhùn}2x, >RP HuHxFg6 h yK|P%3 @D%d/&>p~ >SJF(COtp( IPC r doMat) !,qHD Ш4LV;CH:/~ :8Qle3IF>~`66T! 10ќ/.JdH?EX MCfPɩ0f)<'NϤE4#40U KaeGgظRO`/e<9 9Xj$( s}3YiFCq(/O(8^$Ԡ,!XN;<{ $HHT,B^t^1@DTEÀ ]yHjĎ)W2fdr``4xƌ ,7Y'FZdh2 a8uۓ.#)EMfB:C3P0&c鲙DQ{<>,YPWQXH|tz~Xh̐dP41'Fn*tE1Xy,@2qi skdX2 R;Ԙ: |#ȸف!RGA`D>6@iBٮ? $@(FNx RV &6tN7')HK~ا$KL>$7"DCdR85]: 8 fq苫?,cf%}dL_Th!؈9rOW1dA~Ȇc gf4#\% )27؁OkPdb$v8 fЌbQI] T(D0&̭x-Y[88ed~jl4%.鏾_73/rPcp[.DYS@ ҧq+`t =9RSe|j11FG 8Iv>y̬&>K,} }T*HeB;+leL P>M^yiMa}Ǩ:O/ꝒsM;oW (3!$:PBqϋ4X22h*@!'¶m,"}rY>sq2[`מC\:m% X%Pq: ѶSaeg!̾+ZA&0%~<6MihGe\ŬkZ9!?Pͯ~J äXV`4T)R61a<:A/^cgu* n.`"<73b|ōOy@pl#4P3!4:#I 1\~ݪ+VPeOէ+Z1Y@R\mJ1y_$'gRB dϔ3fz¡0Ҩ @ӖD`bFy!_O H|_!5Y6@[iH }FrA'%A}'%_% *al cC!>&"Tpn?}Lh 875t(Y䟨b:$Җ>v6VCxH(3$B@}"KvS0%Q0'Fz'"h0& '?`%)먆aq!rG$@YOX!)^>`M˵ZF)B'hW(X|¥4 A: Q,ݔT0%DII0=@A 4$ }hdd2dC?PI`p$Tt zȠAs>CtPXaI:瀁">qTGBjFq>C)94PXAa N|XcP X8teeworlds-0.6.2+dfsg/data/audio/wp_shotty_fire-01.wv0000644000175000017500000006374612140200333021325 0ustar felixfelixwvpkgAiAidZWWWGHJVIe3k///oooߛ/W_}׽O_w-:ǎ_7?|µٱѹʰ~5fޝV"x;7_~UNj?]3wϽhLFMrɑ!x'(TW[]獲ϩCIMޒ=C6W`" rAVy5Mt ڡuM@;TS٥8wHFs YR/c  u(Nh<ELK0y Xfk!a͌}j댭4&22QT3΁D * mj[]ٰ'pRe?go$FXS!.AH&YR Gqj1c\EZemSnΦz5N j= fݥOwc8ol= _kmfrWd̯)|jC0E خVw)U&͍~1-\ xiN1 i*Wʭ-b 4Sat5[-w>Ln6NU` RG1NV-qc-"iѦ2k)Tki)&D%䴧ͪ%U|.F3 3ВX|qonnH"rH6<-jSfy{%8uC|%c5ELED*V1&, wkLzuhfYҀ=Ǻ}ܜ)XՃ0WU[Eݎ/Ηb9ŀ?hA Ir T 3y06ulmFS!bf;"Hdƚ-> y 9-(jڒJ#P>ɏ %Վ 1A!ងxe^k.i9zWԶ^YdXRM L\[* $}pw;daU-bBZ iN ąC׮jʢak.f2prXT>ٖ/<>A8~ SH+Ō)`yY 0:CO8mOs0 O)^v bt"||z;>jw ⣳a5LJhj-S!*PONmJSQQ4*(yzcJHe@ƛjSG_D(ۂ)[pWDȭ xYC;}-ih&Lv̎`W̖KLrRHa]=3fTc}*xne w\( C{ iWەzmʤ=THԩ)Ε?v$W9+ݑNP!W^7p#\)ՀH,t z@KbqF)Y !<(b2Q^" mcI9V`Tu􇲣N:YFw9h;cyfMq`n"KKs 1p|EMa^;p|A yӏS@3d3IW+A{ͱS\1n{A2|_>┬F[ z+0{}UҬ  ~9=Oeo 8Z %+ qIT"%;Л1F>XWCrʫPȨâYu* -@7~"2l5-2)IYAktlvml'σP ftm`m1q)m9;7=h=c7&⓷+GYy>5*⽋{K;s*  xbJ+fPO}|v-C0z2֐ԹQW&T('JCie2q;_6vTԬJ.AH"NE^Sdč7!-2"KX)Sm3Aj Ze)كXjIAlaX֐FS3e$cODzZkQe-V-Eat9FD@_cDuj/5%$C9g)X'YM؏oG o'bڸV^q&xA09v+`jBf&H G!UDW/c:9nvY ec- 8:&A]dD~Cby?Vc=4X=;TSm? Cن$rIr?ZCm]orSmZ-}!º\#T)OyA6f6ic VzA`M<W8!~BBUi`2K;m1}tͅji-b gTP$MC}̦^o__^xSֱwFU$f& B# Cz B}zzPkvAxk7ڼTGr׮E0c뜚 K T:ń7c~aB.ݗKqO+ʩۘSk|h/z,b> jʾ8ɞdU`OԖgi v}mz}e% c]#heU.Th QB3:p5@?naT[*#nS> u (A(l ~v-PWjMTTn%0LK/eļ%#qM[{s$nwc-7f Z nhR#i'S͛=rs9"[]z`6B5e{R\DH& mE\:ýSqvn\{]>>n=gu:a賫9x2=8Ỉ/tv:)UuxL6֜\к5i!r}cvL2m(AgLLl.E0X]wJ&r2H MՆ53WT. oB0Yc&Ր4#2m´ѻKc.6B`Sݢ\&\x ϜRCI_8T+xWWQ_I @WU{>u]_1kVUxsvP/Xy ^!asZ/PʒG' 8W*?i0:mS )Eo0<߸*Gͥ7 sƧ{Ls(ߘ߫(ŷTM#j׹ñ'#-RB! uU'{%AZsW jn p$9WO \B0\s=;H_<Qړi//!}A݇񋶂5ӗSs hO]0VAYICdv(aswhZ*F>ur⎌6zV ?uлs]`s:YuWVޅY ښ[043ߥlDfmmJ7/ᨓ7*ݞQ$h(Go|uI q(sE oq> }Һ:g歊'|uw2u{~S>`UcBSeG{w3Jw'4U촇SO]7$a2(3&q YEB+"6KmB)ڸǝgQ-Pm~HJ1!2hӖ:NEx] znhxf\lx67'u7)6h+D鸫kYң}Hal{j }:/Z'`~L ~Y/nA1+ȐRKfI&@W8:o.C_CPA +Ə{2^Om|B(^s p 8J(a-v Eժ0^2dyA=׺"d#ژ4E*>./TgH ]2UQqlɮg2!~ѽ#P6H7௺Υ!^?ȚեePfMsϔXYnҐG ~R""+ "%ir| Y3~(׈ws0]FfnWXѸa8P6'R0AAH\'#$PYp](F1xt8=ɌMkږșтMG)lFZ+M39וd`Rqo5<-Th@~˝DP ^\J3q)'?sG3Rt-kzr+E4s;=<%uz27GwzRt&ِ#ZvٕO)mb!>7UPnY^`W G\۶nn?QjA;0)HSpWeφϣ5uVϑ{\GAʥotBumr쑟d8^Zif!$=6eX@/IgJ"|Oea$6.vJ}j$y܌Y+oq_[حPu2z$typ\% 'ML>ˎv{t=Ʈj(w +2kU=O{nW3h}pduC蕖bDePSj>mt ҄@NR얭D+*2nU7~8#C^x/;(#op7gK>a"8q0*z@uCS9yL[( }Z/@HȏMq)~bcz\ԱnD#o-ZPAG:qFTD&%\|6J[OFeӊb:3k< wVu|&m8U1Wo`f ;eϐhs"a9[iah5{ڄrxWZhۦἣΏ`eAa_N.,E7wLj ]Mџ(tpθa_\ jrRB\rLYA؏^?ժjG%@{옻 $b3[&4VHd &@3N܌>G?3\UKk-ˉVm3!s"΁y1Q>wmq m2k%%. jßRys3yKP!I})C(_&$#|KyK$QS8(`oŗ_Lz/qa.8~2wvj),`t$OvE$%e]<3q3s+Z27UY ę5xֶn3 pQg( C;Hvq7;A(yðS SZvB'_liGnN> PE_v"6SɈgaYݓC#|Qu ZT+ (aJ+v;(z 5Tm+.BѓqI=$*<B^r9U[3(n/Ʌjhg"'a!?HNbH[yjW*$((# ~Ϭ6/gV=6w)7sHTZRՊΣ9<ݓ)/t=H5逈s;iefuߒEуNļc_e&dKծVj 6E@U Be\M;Dek /]&`%+2e 6*.2#cX@y8#ptm "m|a~nJdoY%ґa8 Vhd%,W=* zt!ZS P۠S(mRw軀߃ԣS/^ ?KXMxu`{JfXl4àŏŎU+i-Ji<.qr${e'%cFм) JvEpjp@jtEe68s?[؍-? ~AR&ӓW\*ԂUwB R3:jXʫ0t*@j҃IݻP zhBRghƿ1獏xtdnd[55MaU m\%L-YAqr;Vvb:szP- @*G̯yε#mo?/))W?hS~a/.z198DI\)(C p3X%vmFk ]_>=c)ѻ2l&3#D.߸~,sd&I8&aܣ:8#D׽/|k.jfyc>eGnwμZA=gZ}1"XKWZ*8)3%`e%.˶8V'f'`AiOEdjͨ"t>k y<ɅR}sp#g8bX}]᫘- 20JwvUoԥ@r VǤ*C(-$;^K=-9Kj:e{/]]&ݪFc$}P^& ^"KDȿ3*D?@MG$(MHP-ܤh^;H]IZ\ydo%Z`B@>5Aje"a-qk끥xodU@dYkh}R`XE^H!3LցT$D#w&HZ" ߦ ʯE"Hgn9YmB'G1^at"<폖-o@+̸ѵ퀞+f`JYvb‹a O6\ld_VlҰ\ 42ܝbSOPnH@*kui,')t>KKq}cZ}336P',Va^ۿ٫ BX7T<߃ө8>?&]}Fo簾f-}L$BZ 0`jz_ouuUs$PtB0l*2{g-G+MllR67Ϯ{%gM5Y1ju<؁<71gԄ/^%4H+Ar׳*HQ#V*ŐUUAHa) ĥ(wr?Pb&׵byJY*['HDŽ0iWb-ɹQ8JCq{YQ _#gtT`R6#(&ϋ'%A@O`<@8g੿^ܯ{`l(ĵ*WqC:-*"/p` tWRvi 6A^.CEWib|;2+ܐX,7淙4FKу$JFB W3Bd r͋~$`¹"q+a=NL'mfB]Mǟأ o:4gؖuCʺЖ]J/Ww-&qrK0ϋ%Rf-$$G@݌rh@# HV=r=ʁ:YtrΝI (pEdR%֡ .#g`8XZgd)#6uimX k>ʍoF39FXєuU7_,')/8!u.̣mPz1Sl>cFj]W!+Kҫ&PVV]tJVl?g{#e7,G6-d 3Kxu;fNJj;=؀ d0!ȹ:Ջ!K_epNOh㇊,6 ˋΦ\i7 @*.?xjK) 07BK&4k52և둘[8XÐB Ic緒FIhw`AjUSRjC]}qzSS) s1福r#1^jp2qdN̞:b?,6Wz?vXWu uY52yb Ee%$rLR?8it򳁒KYQ4>zLOU EzNVf$bӯaSD B~a5(x_̠q 1`UK>\ Z>REɣq&#NjAQ]|_+Qz Va:.!f֌ &:fɴl #}dh<6Cjgz=?÷LJk`r-q,"w[ `nۼtIz||egjI  5@Rҗ*' ߑejE(v0Q'㗫GY `(‡ (l{{RdJ3…vɸB´[ L܁*{&AOR4}A@~G&O4ӄ0ʔe 2'cVRACF^?b>ɹS79jc@a 2`kk(JDv]F#9n!{0ٷkmp8L?|X~Lj9#,CW f5g/*w,Fi1M s+&y&UʏK>_$e\,#$`;('J@Lgi3ME.dmj]Km!LAQKڐg*H[;oR 3!>ywZ`m[N˚'.90C䲿iB\1/H>RX H>Dgs ύ?5]V!Uv#T1ʋV.=^>״jw4)Ṵ7AǚdNc *9бnZ(:A}^3] 1k;ɵ>nr,>B|%J}2j0 @? 8/RDLSlQ&7E.k{ѕf2Z8Y*O ?79wP eU+"1ms0B]Q;3j*ВUG7D1AYrgȐV|Ǒ"^UjY=oQNaip)ޢY$;3$0/p5҈y g^p\^CW j>@ ,p$$N_KZ4-yfiY$"Ċ[0(|VuGS'ΌgIvUqC"&b;$[{{e=l i|[aׇ3$4ܖ;4В,|PS-c+M6 %AY}D. `*y7޿ʹ2aR;@ br/~aJz{#}Ԓ1\ m8Utmj8D࣯Lx6?Li+9T-[@sЫbfM9 9.q# #Ԩx&e=Yﻤ/}wa oH%`KJVֳ0䔊}*fiMlWNM:~W+P3xBJyQv-Lq[?q[[+9'xA OO=&HgZI*_M{D:{VcPeJϓƎf~ffmqo+׺9a *QQ|5pyW&3bHJIf[.%(ĭ-xx'{nF1×-ߧ@`]ɦjjܟrWfL;&Sjζ2|ˇ~7raG ~ޜ3F%n[)^l$Lhc]EUP:4Qsٖp SEߥoS|'"˅"v NU|287S#-e)g6|mۇ{|Ƽ՛ׁ-q# ^Y |p7iGr+b>L{1͚mS\9V|3sςS>Rl:{(րtQhWqpx›p^mԖZ\}̷fAPo[ q߸]u.a3\c2;z+1ɥ'K-]rx"Gj*5n<-'T\&Oֵ{cQ(8:1O$ٻ͘NU7{ù+qs#5iC|QxFqrb׎W`mkUR>@t/}.?= V{ί Qӂ8cj|Q f%#ɻLlȳ+,7w`HOMeݪ#J,c_C=|*\WQ5 4o;} \+^ j‹fD9}vJf6lKͲ|}x89[-@W,j>7H{Nq2עOnzeI%l>ݛZx~R2h[RS[o&SotUxMR3 n;[KPm oo] d%ʭvô!=[RpGtQB-  d,wɮ#=d '~deij‹!҈J#Tԣo+D~v65IĘ-*]? @}I)[OSiԽZKJKzMeːkWn[1XG(SS_\ˤ$Aga;aGsgi%TH_[MsF ֦!i342r`_;3)woGydLQU WNU`y1]N搮Ah &Gf.8S{jm&a_fgmqPA't_#Hn^"dD\!TqX/}EO(IgB,ڼe)8%(GlRh\WGAWW00mvs2<\⨼~ ߘMC J/O % Y:IgUSDŽrIG.OJ&:N:= 8/Dk8ZE,yT s7 'LP/<"K/JGHrڵ<ԅ&ZUPC8?OZ/GVΕg@Agޤx(e<9Aп9.FwF54(BړxW5n͔ PȰ"52W,xZ>D~ k{la\td>VZ#8Wn'USIE"f!y?>{1\ C߅+r6F-UR ђ/2p$EsuGyH88t+HG)G\ q(.#($HL^Ash] Dwf.>0d(qE՛kYk~ dҮ#V% :jP-G虰j4݁򟀚1!J\hߟǃOJ]u.ghLh:"FCkx\VXA+c(V`/F-_hEE\DFmAE)2`}}-qVZZf)b[gtuz/M})cT gIJ!BC#^9p,_byI0o \lqEr_9ؼݺq S)?V %\i]>|n6rf |s6' _?#rx)y,b@Y=Jʬ =)\E0 Y!wp"!£i4vͽ}15uDH'˱wmdIWw~PER=e}H%:}O6w;B-v'ss(>Q}6.FWN[cb%;H4L1v҇muK]$-76LzoB ٷM,.tƻ[K>}lI; A{仰,3Q0la3,!6dX`)EOWYo$TBRFvT!Atx6‚d65k룫ܪ^9pO5/eh]HYz94騜GCBoB a3w-]0lX2Bw=ͬ ~\s,'ſ<|ɫ#cEsjJQR j0C۰}[Iu l% & r6EUXL0Jvhf\l/Be m`Jab==}IXvۤP2vD(A2D!Bdp2FdE7I0'E<5bϾ\C VuOBdS+7zkb8fi ?gr: L~ Yd/`iƿIS{} SBo;YogZ 4-e!llZ-5'8=OxW;h?nNd|ۢ2B;~Nҕrڵls8!!SC8AK's[8L?tlW%FP6d`DҒHW`#ΎZhZGRjRDi 89 ̴pUԂRb=2rQ 6!0'(&|7Vӣum1 WŮ$.bd2 lfah%Kӕ]SmXPm.?8-/ MpB-rZK.J wU޲TjvF\D-sQR 28j]s$M&W[rcm~ʦGcPp ,M ֞{f{t:UܜG}K "X\d$7`V>!=`$ϖ[߼&˱˫4> -c}nDݘp'nQC|+BBĭ3ТhLZP>Q-k t\fdS9(N2àCQ-"KQ[;3[@.)6r9fpGXHwu/1Wq.VC{XxbNwcx6ae`~y a;l,zuB^"{t ى>{&Zol#-T T݀zÆjK.`S|1MRKZƤ3$ve)go( FHdse[t(3@zs"YA0g`fpf7@.> vv+80n5Q Cʍ[Ɩ\a|)Fq噯6S :֎ѫľ<8P&Eٸޝ5( -sT((w4vߋbDCN3"ev0se@R:S3lP1ҒsZÄ|u`L#03Rmc%͔di_~@ZަGXOwlNra%P~OұCCRJ%?gXRsxo l Cz tٗ%%*d,+XYajTx98;D&UacrX:/>rkOe7&'oz/ML'Ǹ5J״# >\[V=pNRJe̍φI@Jݝlgs ma$1]&I{tS*\(dpE!sMG F)D)ŸCKH'gL%BAkhF{U!$T ?[y)^DbQɈ~#[yn)L%[˖JGy=,UuPju#gIYl#t;FLyɱ\ AQ]f#Jc=l7#Y*J BaX 0*책6DsNEуă Ŗ\QqI \h˃z߀5?igS] b{yNћ6V2`C[sۀA#&K2jqE2 lztMc84Eܱwj?v]08Xl["Ҿr4 IZ^E .D̾[qAŒ>Eܒ(,_%2bً C<,hs DN )137qP;ՔD;顪QN4 H|ٔiجQPpQ/>_ [YM."`rP 8#N=7s.52fь$X|?oH 0OU#-ɊJR7B RHjȝ_ʷ%u^Þf:oAewLԵ1ΤDú|o; .\1wݢy~]Kn2jD}MmHHfU/( +Ρ]G? CnNF)fS #qhESH"0xO+jXqftUa\LRL!2r_bIeKI8\4w 45CCԦYDǜA F#&*@v!RnK!Fy `PaC*Z%:c^+4FR/ n8f"zˎIM($Fvn]<˴V,uUk^ AcOj[?b M>\Yx#𨂢%?U]P6-' ׷':$Qbz4BkVnĈ(`V8{EhSzM[j<@iJ82B ̷V4@pHyꘒ8ׄSj%i"./ O7-CkȘOnI,ڃԈ*<^bHC "bYK~(*Vgt"Q5h1^yĻ '|2SؙeO ,e<&l Sm ߕ7.m GcöScpd̩Bw̽Eט%4FXd PZyó#P qc$ 7~ ~ elsӟ6Z n/0X#jMs#g| ,$ IE-c"~8!@b̔ ‚XVRdOzĐ(@'&d0-,0Fa~#)鼱.d<܋ jDՊ B65%$"Fj"s@S$ dk,8a"Lrdj5;=*&?@+VqDYsm`QvsF"@(F&YzJXЁ,$T # }5; i\D6e"֠lTĢGY? }ZP|hB@F1I@YbV 'c,6$DZTiK>a'k 1q?&U恑frg4H([/dmG ? B)PŃTAhˢrJgwT5x1bv%AE <> G:Oy"&W |ȏ #?FdBp80 1i#s|H|l5?Tfe_6 DL||gzb20^SNr2MժW Ί@𙙃phˮȍ*f4u02!6"P#%l qiDUi G]̾QH>e(g:="!VI'lF]Fa { t;x$Lhό1d,lFqa3,u3>ݧ-Cjҟ*lhG!"A W~}ؗ80SA(8>K@0J1M1F<9hu_P0\v E$8DfP+/7]T3B>h 1=8 9<1<0Y38"ԞL#?AQ2OH:uPX+,zTC@5w %apdX1ULG<4PMZQ<]ah$p 1 Y@PNp:E4=Pc 14{CQ |BjB4PP :je7@&XgN(̡`!pFAhb<!^&82L4=ScV3W_#A @qH>%"$0Ȁ~\NаA!8@t,`|.> v@+A|JP@`>V:A`)4dѱteeworlds-0.6.2+dfsg/data/audio/wp_shotty_fire-02.wv0000644000175000017500000006360612140200333021321 0ustar felixfelixwvpk~ghh {WWWGHJVIe3IsTJ8Ƣ_߿W߿/߷w[O< _ 0mT]p`͟b>r}vsshaXNςw+~~O woŸmBxx5zzPߠ38?!ؼxqa9w߀g)\%Y YmV SisNouAkUnpVC*&)#|a)8}e_*p_P$aBz{Kkc`n7v+ɟF8MNyּ}TwɃk@C,h9ɎOHD́49YGo=(|wOECa-ɩpFZxأLY1,dT G%:={>wmJF,an`fIF0GVxRNwQ2MH*do񾽺 Gzm'B=鶝]zV.]MԙɅKm0G;J&gpqXzX>3n4!˓K׫e}JAJ=g#AyꒅkUVUM1ra>qsĤ͑_xd~t/ oʹBuG:m7>g/F4ڄ3",C͸xsՊCToQئ㤜nB XC貛& Xʁ8ȋRzM |uPW~q]"duF[I _Ru:euD7v~'L_ц'flr*[p=c#R/?V=F8a2J=;S:TG`4qVTa1 Fm3J@:Η#w1XЗiBlyD_Ulk7>pu&ȩ-$LZ6_Ԇw[akGT.:E4| 7ܱIoIw[ S@&(['(%j*S ւ9=QHhc Qh㒁DڤR`w憋RUo!_9snkFh-" JmhhLB]K[jdjI!\"%;A)qI◅ï|}h)9Ԥ=#p/ S#?+ɳ?J܍&7kvZ*uj?5b1<PaHX;Λp$1b܍nCІ(б=O4 uff"KŭQ$>p,${ØgjBZ/u!D?j1s~;H8XN^R;/6x'RNao§ZM2^w뼑e3h?,N|" -]BOQW jQzkL-XҽӞ̷^Ab-"Xk8cS{6U΁hWln!t_ۻ JŬ:aGw2B~;BĿl-{G1!Vs9F2H`|~B]4|fy{$6ϗULd"MEG/eq0<=g6QJO\@r_ KN0N|֘2,KwkƼפEf^YO= 0RPȑz;7pbf-bRSB#֑~ ~7;I=Ctf뚬#T uD<%A+=MHA%HA޽oZO]w/ nB{t7՞3Va5yӍoo75 ^-YB {Z%%;U39 3mYc.>d3g= Iۙ%.p4 qٕN}{` ǡ7Ѯ鴁߾*cj0H{u 9ϰez 8>`-I"YՌuvRIztPG6UI(% uupoXד9nj>c^BU\ݚ}^f1"AN 5dgOsl;{%J/kѴIA3 ^D+R~s.d~ WO0&гÚ4M*.SHð^G,W@WC'hh<աq,v j8ĸFbFS/j5Ь8:S SoU}<^ӱ` .ٌ+|a((G\;+ձcl*\5;zQؖC`fLnltJ />[ɳOxaH/3mKsct-4gM c&\-`f XF_ > fnu)S]FȜ`,t-ӊ}3* GXY.&h bUVMxYw5leY&{F-"|/gO~Q@*ܪ p6Z*=t[Ӿ%lwk2&2_ۦRO!uEhr[i#ӹ58J݋}Om P_(=qt/fgÒ"mVD i;rU/=ϟbdRJAuQ,|.E Z^z nV>D@㯌pȯ%m%<G@F 菉 ?sI6_+mst0`inp%w}CкSy=(aX{۴ \.~gI˦0?D zIbjϭ]4zM5 O{EJD#%ly%% MS^7Ef(__;*~U{wӏZ =٬?oL Ki 1 3{s𧝯S݆0peL1wR~룯 m 1/11i b؉L?C4~*zbR8D>WҞ*A;7T@ {jp"™wr-u!~F`\=$Y IoSZӱɅY\]+YĎ㣉w;Bn.!}3kShMw&]pó"{0)c@@3|mqD<7D&T.>Qx_BTXi_G .eK2%Lǣ-| 9U2߉27 ,eH[BGb_> 5t3瑞Otenz,U`^d]6G$'Hcjoh u^zҭ-npK t Z{k7l bmoBqaݟ\ð Ā,ZZ-x L 卹Dhђr-<7| k=޾ēK(ذt0ݯU%ͫニJRϳUM1;5Z^#WIu ^? KeYe[e4S|A@ `])4݂-ϗp{1k`[)g(hJz1rbSHN6L"$_͗no^Ug9TW_Pg2t. O؛K%R-}]@+z(3&dĔzP6.Bˍx4h{kAu3JGB0&JM&{D;˕fot+;A 0wQ=^@3UԨbOKNWPCLWlQື0خ=_Gؼtu66|sJLתe+x~8+yZ9Jkz& rD/Q==P-rw7fgB"y+s3@1Mh{h7&#/lj8W6rg:6Ŭ ˩;Gv}[SLr57iP!uЫФZD mV_zڂ&$tb8H},Wb-1w )TBfE!*x͆?0*V)TeN_ f>ur٥YOwo:ݶnO;Up应y9 m y 7Xja9]4H;B_p;u 1xLkQ5>#-Q`͔s8bM[WQ_ _}e/VgvGlvvFl輆<%ji4d Ct.yO!LtƎ6K*:hc6V[M|7h7of,S 0?8(CuT5#lW]c@r0%/R Is[ZSfW'a.%caձwgݶ}<院5&AK82olV}Sv8 ጆ# G͗j1pXwM1×H':JlSTwk5w)UB#_y;a+UnrI+:7!^wU[o[vN 1'05?[7GS;ZضnqT!a6oč"z|DMޟzǟf+ h|MDX\I ?K#A9 ǯ1zپJ@gUVÂ,L:0[~N4/XOXH.ktOSoOZ9f`˱<+N*dA!ef a ɸ!huFG ̀uo%3o *^&Yrq#X;cx![oVaj\V us H ҾUB2  %9^_Fb! j5!Wď3RQ9VK%Fi 쬶Wuod? >ZB$I: #ߴ#:+)v(j~ƙ>H'83ZGX>~%->W dO>_UT׬:&sṱ`zl_b@FO".z2 A@S梄T&u,̒QF4oi5sxD[9(C [Dsv 1:r*OM99Ǔ֞׎EKAWrKq̈hd_߭%Ua:p%h#`6:A()eAI'RLb ^)iՐ=$pX+ 14]ZMm}0}GtUsTVt0`v۽u*,7hGVQ@3J!8Qؽy΍_l_6;I^\?FHu27V`S"lߝD˃^sA$9SJs_hHr'3893>TT1ρ)kk[J$~x]1/kUMS1/as-v#kY4åu-,MaFҠL TK<ⰈwhM`&=(S ܋,|$M9דCjOZq8q֖i&_:%$ѯ(A~VVޜ\C%۱ܳL]2#?s%[I]/hĪMk7f9#-ibF{7P1fNۋT+cUb%$g۪p tmY &Ҩ(C#*ðCΉ*=v7balC ⧠֢9bb#_oQ^y|Yr1_/^-> k&Nqx`0Rz< DL_=3aw>s_K}^H6xߘi2wDn]ǰMY97&8X7BT:NǢઠA[i' SKظ{P묑MkB1[Nx%yUm )ltcs_ /' }![vڂpFOP`*(ڶM.`ql9AB |!Y$!Ň9rrX:@ԁHE5J3+ck htෆqizQE7LvXb~oHx)-L>PkI'E۴Nsݔ4s0c@ݔ^lSca>юrS #H JZBvMͱc0Wlۋ/M+ڒk UB){W_kSv^HO;5@Q;i=yMT5W‹}i#g@(3z,Jbw QaG ;2WlN㬅dQk!9i 5UÍ\W6{yL ^T1Ǫ<:CRoxy. ϫ^}KeB Џ:tj=F܅%I#ϦA7 FLqSF&y^L /M<`<Ϗ;9sBcf!~9À2/{,WŨC,%qDt9h`ҐT6HcHf{4TsR+,ؘ ;Т\ tUҡFU Ŭf}qҷZ0`IxAT;%Eh8#r2[ZUr-:FXy^ 8n!D)mmҭ3xUH9#И|-;b9թ|7Q*X辢G;|ė28X}#(y&pPl-gn"9|Δd`fNY:A\UDH# 9y4EΰKaA50lL V&Ub:4O =]z=#ꢲ;18戧2z`# %G3q[K B~oc45h測~OP>~! iIqUP G bwGðQ陡0/'Q-(@8 HzڝN,N)c)CS4ESd9% #iD+j)=p^$ęj?A Ft '}#E@40_*dYIfN9k J">B_\X R S~X^bM$%nI(Tk6 QkQIRfÐ)XLVH0ia֓kFNEƍYD{G!19JT 0l'M\C0@Q1B9]S!ɵ%=i&e/ fH9DFA/-E0YsHSE^)/m[r˴O91TtDhm DZ$N gO|xAJ٘N^@߀s@-`:B\^R?Rhr(`7Xdt ٶ`WP;X(Kg̏ s*LA]_?G 6وpXyslf@ne}Fge+F`~e9dmqRu_?rl'LܢMTYtPah^?oDxn]:[QfeZ#Cu1tgp!\@geN%8&I4Rɲ]TǂCB/(`PN]ftsq^*Q2pWdn(G?^d4XI]4a~q%&1oԙWp4e: SHv 9zګg,q?r3ռ3Slv(/ Dɍk5&P$dNY V'j)̒ipn=,14XA%Bkw%Ok#zjBgPu}٫b+ךȪ 9<gi%56ijՃ;P qĿu$x}{L\=88g%dYqV VX;\y4\t>A'p:U&`9 c(Yd}J@Uj~hxaRx '"+t1}LaI@j-&zDީX1|cu>i/:xpO,6GJ]s{_eq8VQz@ s0j8dfEi?n+Iri k5k3^mG05946'CmK/6pͱ@$3bk|7n\i%Kh1XMNOq}Mjh!.:tЦ=ʺ N. _X ָlaY/NF [3'x|nf=4VҙU-F6X|V#樃/u;2!%3M?Ri2ŲȱaU@Vli̿dؗ*s]l5u;;X9?] !jöT[P֥M* +fOP֩T]9Ƽ !FSlCj|ikŵM CkԌӄ WgB.*)K$j3_• d%*\f=\˚%WA60/N]JOc=Qê qnu*ʶ{h?gJ!d! RЗo oLXK8ZsҋwIU>L<RY()jIe YCЀ]Qz-t.)1hbxڒѓe]uɰKfHR7ÞvdK .wW>,Ni>,*&b.AD]^ق)zבlںՏs!M--|韢mƐ}J’>J.4d2ycdr(I%4zZ'0d`^w sB{a:V<(S2ʳgJ,5L݃vwBMAV"+U=l?`Y J> ZМKKʻnU|^gE}g]O=yT_,S%־- DQ'fh^xO.{S $DYb9`I5ϟ$;y'A 3hXH% }&RE_}S%( }'';;ƴCl"H8Mem-NUg\I-c✻6[]YJÃYk @5×_7F~AJ=m1gǧ]U+aOvNܔ:&p oza5;x|1:q1M2X,TƸptz!r~ <^=YPkQĘ78LTr s+Z`n(b ӑzU5%UR%$균\_@t64BHF<}!Pp^]7#t3 Y385' SA{A!5;L/4R'̏݅o1$/L- ^%ud"5\9߄?0|CCp2p zs5rsg0b F{S #|ӜyA-r?ve@-{BǍIy6%o`=OMtAӱD79j沩\ !Dbm6ݤNTF?pgOnFxŽRPR(iזKDvLPI=w0.u$"&$(nKB/~HP Ю@rCѼW&Z,$-Teg)ƑM/gr}\ fT*gԿ Z'U׵"^rJ ijd|(=3RRu#8 W#bi(&;*l:e AFB2D`mC!2N+DC[ X^b'P/}|[T caW䲻!@nJy gR#]fPQ=Z,b>U1*k' RXYyAciN QU]$CQph}}ˆᵷX, Y%1,g81 G‚ظ&B;tȯ$QarV>LAard MoWxn8EΕ/ F=PX\.蚉*"B?"h}q=7͝,oE G׳06!Ԧ G"KV?paY" 7u ){~jrS Hmq8<([s;RetQI1CYiK6sWjO%TI؂heK"OGt?< 20ʑ]ѳC()ޘˑa4QޏQTuX;:j~'ܠoi''YHs@)up& ս(et D$ìW/~Fu2 OM (M'd3a -tQ?]W|yEyi3̦uDKnL\ z1a>Obv2S78\#gY@h4]~l^_g{W[qUS=Tn5*ϓӯe7g8d ϨK[CΦF:82G?}>D q@y<o V?@5,8 {ZWĜCJ`vFc/al:`Dg{HJQUM_#6K| 6E`))Pb'7 K:Jhc<2sV6h$ӂt~nn8_2%W7,PMS- 1VӋLbiڠ,D*MZHe1j8HQ9A#,<YU {G 9Nlx"-T o.P9o;~jKUn3 kF><#zљtGCʐ(f!YtsdF?gP^17^$ȿ;Ym$+>rAMElLLR.B`n# TQDk{0*q Aۤ(R?l޿=67k6OSV n#vyVG['MP!`Pp}K;.U%K$@,|׌!|ƻcUL@8 s|e|%|Ԍ+XzU=W;H >x{a2@C'' aw1aF7'C9tb́Tk%WqEq$$ʭf-= MzEЖ٘ &9:#w˝iyՒ%(]\jۯ3-8x" L>)J7R*%F^'Ў> ^8籲eKE<c/dʮF% -|R|k`CpH9`Ƭb|WgW:viױ 9\ a:\wKw9<^8?] z~3 "y&Z6~gA<,dxsIJXbj(<0C'tWDsW]rtw$\ 1CŬgTY]kȦ8z1?bf8$pnNp0gJȜH*!3F&M)@.nh5-"V'%[3jTTk8b&B*ⷱETlWI#aŜbLpyPUQ̌Ū`00**^N>^P  誜o@.Z.c?I4(lv>HW .*2@Hb#`77Ɩlk#LPڵ~A6/|ʖ~1Ϻmq:-eԼOf]@6}1.i}-cHz/lq%gJ52s@d[k`'ھ 凫H]RKvf"ιЩ7 h8SNۨC E 4S2fuѴ\V}5 Ӳ\v*Q @PVW[c,b죑rT>BN_ΎYmg ޢ&m,@2׾YyI)MtnӃfz~:&7+Ke :X!nt_W_Q>@ZnI_K042I!:e)Ή,=ߛUv=~ 5W" MaW.SQh`Y !H)0n5B{fJm O+󯉒\2Al/p6kB$wzkVP`C2i8 #jY@^ U)7G@<е#B6;wIE70%@%]t+9fW-W.07ۼ~aaDT6䪦'\)vuʤmoŊD7@ 2'SU9@a]QܭM r?//aځ; |J5؂k!s$a1se5N.y{HqG&I* C_,t J͍Kx\O3\j^7~'4ut hAW$rssm]jOo?kB|Z56.!_ |@C%l%W"ǞHlf n-Z7bn5Л5{KxT_)1?!U#,Ƿ;ARѻ$xUs qUn0=>9RT\mr9e0JW!wҤBm7RZcDؕ>3B@շ"P-LoQZ>w21l`Z5S8 ,_ Z$dup,wfAXov[GGY)?^ .NhʳQR {\\(ՉK Ljc•HN]gr!)iRy2nE6bBm>91Or5OHqg)2qc&۳cܴI/{!`cJyRߘGdFw5BkiCa$84ZFKqkSM[hY1~=_Yz+?DSCGmkXM7}K] g@ZݪCtN Lсj<È+f#3VU'B i1 [}:NSt GUfmDM 14.ŵy}8*/zoY|w 2uLwEѨl V; :WJ 1QzE;cPFǯWlW rdTQl!lHw214}Rh-b'$Qo)o܈gH1kIEx8jg${i֪k 0P!ޒec3:k Պrw(ն ` Ќ]my2rw]]nBA]0m&: d<~j[ES# k# ^GKY T,dEtpf(^yu)(H_tW"LzpO(DF1!>^$ҹϪ.s5&v`.z,e PV5B!'CRvP5zњDl7+:Z46޳ξ}-O5t`@o{v H Y,^< b8aNn\5>bGUn5`Z A4c0lب\{bjWQG8fOwʘX۵ LFW}ȴlYPU^"yTd%'@A2y땽%D&apb0ejkiĐmE} WYdFrى//{ަz:j>]I`5CxƺHPT‡)Sހq 5hxD38iۦ!0E*@>U& 5"N22xϵW x2bEb] _gg  #Dײ?Dl?TmT-SљJ[T1I0ٸu9L0khoF-ǃ|K|-^ /4Ԇ'(d}bI opqKBsYw$yoݝ u>+wZBrTzwx;_ȾfyT6K-ՅBx"r53w6KB%‚帚bb`"A/ P ٣!thFW(T$u2TbYjYxnf: ^εH>eJ!>[5o|P4UGNtIhjlhNUi$0] /^s5+ؿ } Zޅ"9/)ٓ2|w*eml#B|'Oq㺆طn85K SMi O1fK6g6{/=KCY?؛B'-@c1ڶz4LQ:<呉a Ťм',59i[I{ ;_$)3Z]p?ZeHĥ)bHmozJBMR1E6M)Eٗat@q$ #SJSI Zgc_ed%^cD0iQ:t"A Mwgy` s/‹"3jS@&"yCRW,eS$2%,N~u]d.:[ b"kہb NmR}!{dbEN?@'X L #[$f /a6&Ν0mzj:uz _ưeG Wi0\66L3gf 6 2i 1 r#iI\2)lN!F_ƚ)}[ihx-(!HFA0I|M%7BQ;U4S4pm)e8qw{ܝ\X`'Q~`šdZAvEzsq~QEEt9v0)Cܟȱ )ðtƿŕeA3=ӭHl&`_m⥹'BЌ5IFe*j*C$GU'ySD`[Q2瀳bw1j#U 0#'9}. #Ot)/<&!]=#j Gn ri=!xqabi֡']$~uʞȺ(UǍ %( ;y' I aa:ǝf ;u6^][gQ qkX 9rX-L[$z%eo 6LXG!9R#$yA4W5ܴ t2*mX); ~iM@9t-"boÚ{-×`~|زX| 6 Xb~*°՘[g0uT<ԾK~M'*#"wҌ o݋SkpAA0cG{/L&wʡyo*P^}S_S|1emռ F#75g&?ZUht=g䨈yCV` PQVr ͝5%Q/73o.9V3ER]2arB4Euep"r@Vpʏ JV%`0pJ`G_qr C>4 ts(wlА1l>8D>4dZPxր -//Mfa/}a)O\%HΆ VEHΞ`X"XPQ vTS6p"CjLmb1@FtU~b+& xs,% FAZ+Ya)ptlM'@s+p*n Ǡ۳mD2{O`5FDŽR ۡK|:m@wL8s `P lߌT^K2G&&(4s7UXOF 3S@S]HS  99Tr Q!F(tsD` Hdz4b$i󍦗.`zPŻCZ5 >?JsFE]kX1"c7\viӁ*$b[>P䰑*pӅB㼅: fOFk8;RN=1S'A/3 C¸X#2 K> a@.s 1 ?4RLF3HJqu׳#)+_RqV 2ӌ<la. 39VY쐣%( 8(bexJyEfBHf:gQj'y({0&' AY&# *|LV$:f~t䐄aa@uz %a#c8(TNB*й (MZBOG B@#L< %e€:x#ZrJ"LW"MF43@pl{R*@@JP(8fbIbO%# 1n$#4 b<JRU8dp  <1rvA94@j'z! H`>T(У>$t7(>.0>|,9l0Pa|JR@'ccA]teeworlds-0.6.2+dfsg/data/audio/wp_shotty_fire-03.wv0000644000175000017500000006116612140200333021321 0ustar felixfelixwvpknb__WWWGHJVIe1?~~M}W4ww̟MG/Y`> g~MjG߻5dWY?=)3Oƴ9PA<.翍'2gK]5IX= ^Dy^~`"x /#=5|3{ؼcF7PS@T5< WQׅB5/i:(1 H@!pH`+{\yC<O }ݦs('[&zsJ[*ҽvpp $)6tR[,Yf!fu}U'hX&%=Hu Otu7="6CIdAc,;Ü.ѓHF֩?үr>dmeq@c(]z}^d9`q_ ?i89ȼB~=p.UK&y{B=Z;b%Q~9,zo@k,'IA_bg@=;E\O;=8A~ėxEN ّ&M{AE)bhc*ו,fbZd}p6_^ 4ѾdE jmI CRVض6A$>¯Fpy(K3y*hm\'-cFiv9bkރHL!*MaDy b<&8X+Q~ayCt\'T5F$=Tg"+\kre:4_Q ~=㡊BNG !/zvUpF]i^!@ W?vZˆN.7,}'O0b&"ʡJM6z-_Oo$z&ɂ134Ȃ2ߡcb8Nt4{bftɹCѸ'Ll_XzI *U=LDMYri?=VV: H ;{k>xxIN\(R{1d[9E,d޾O(ڦ|pFyG;2tlp+U̇Y~{NsLvyękI%CʀE/)WB _m§ T߿ H<pSxQ؏=<0l#"K;"#oÙ?PQH/MsRiRY]⬚.5% Jx۽0p~x9UA{O Ih %f_IH%'BV/CB[59R࠼79荲 IMl|5!g%S)O܇| %6TOD'L_ث 4|> =9ikG}tZJbh2HkA(at^_)}c &=fgdu)kҪ| hf!u $ H/id H^UKCڧ9 Vqk]]jyyVq%Awfuc+BĒ,Дs"\b=@ n: ٲpXB=bs#|ƬΛiR2&ԉ=zK+LZUg"1G,EH$x5áû@w.Jɔ]^YtBq?afOV7fR6DhGϘV/C6._bGBN)7$`ticN>"yarwr{3,45RN iW}wU%Wu/&/IxJϱO)q; n&`,}  , 8VMA}qP݁1W+׬YH{q #˶wwUp&a)c|[Vy^7ŌR8g*59 Z!&33&](D3rH ya?ogf l\J5I-'rF1-6|R)R^"y_Pٵl Vg;Ә8N\n sJt䌝CSɭm;ר;9y:췦%8{sx/V*o~wҍ:-4%H{1 =` )>j `t(a.~/\Vt,/+|lZovIOt#1K˿{J,W5 <΄٬v:m&#q}wW?@ǒqۿU36#=?{\~aGoJ @"nµR[ܱ(V{| z30nFs1X䀌Y) .p!<1jAISxh¿prkmDdmC&nrv[w8\UB>gh|壮=V΁bi%"PzhCGk e- *^<5]tfG&S9؃v8!5HQ exX_),ű]G~m h=Ll2ТkL̒Mp#UCl{! zσJQ*0SiYحʍ|BPaMgMc"IpIʲXܗ *hȢxrO{%_k'Y J^tmud[:pgAA_ RGz5םWwMQĹ+zcnPط ;K $ijsGaT&G淀2,h ~zgڽNV:ӱHW[ 1H%P 7.SU:fϊmumB-"w%G#f?a$k\O9$_D&C|:31#SkT1i;k BM7n#Ґ@C R~dZUKs":b-`Cy gq&U|N#`s?D{M0q" u~p3Ol\5S;6-xz=kx4$MSz1˵6D"k<顄ZK\+ȹDe H(EośFcZ%\+ѧ}Ya^)<̽F+uT)`CLɸ&Ϧuv%6K7JSd\GK/A# 2,/ LjX63Bt}W,ߟG0~OS]ag)ص g}͂P8 7-wnjf{l6$PYrdURjbB_^y0a-Ce]!ў6|+k!}u CpmYoSlܡ 5) 9 |;Q: *tBOAﭹ$>޸;*Gy Q5K}YH)J"^DϞݩt1MijPi2`EXF WS$PunDzoRo7/1!uƲT (K0&g ?_(P ܺcƥ$ރ(yKY2`nQw`Բ;u:lĔ7k߾PU[RIWS/׌%0H(pwh_U;CW!KB_8=xiƕP=]ޟ>m\9́r7XYg3 ,] V-x&W[PQВy壩ˬշm@l #ܴ#OT@_P4RS///mrjosH!. A~ӣ҄!De `<(Y+pe{/8M(U߭xɌ.BTP=*Dqa={UyYyYG[nJT&MN^ o3DW6f9L]8Y#@scDH5sZmhT!*%fߏPчBsFtRyƼMH $Pp80+5R9@{q.?aRKtd0%`Ƞ#__\eH3oqU O3k钎IF=4d8q'@;EwnE@A-eʞ^*%͜ Z yBXZo@?# }SFFK6ǂjS ʰRm[h'\j' H7F퀡S׷@ї 5!]_*q~(v{\7s߀M@Ti$I,fC?âU(j<;nBi m(a(7 t5rL *wUB|uX4;|Vlœ=SKGb9HOWؼwS"V\8^|ؽ!2TL/`lI 0/"iz$qu\~rjn*6o>fNz +頰Y=V,Im_Xi0{:~.{djr?!t~H/KM)6K冐հyQ-p\S'jK7V:V(@4{A)'+ ߊ dE}Awtւc>bP4\9pHx-cW&@ĔIcJӣ &M36yn^ ynìIX%%%ǔi. sEnX]eqO]_}o|L)EZߣ){̏6C/|1(Z}GĨ|>Pq)&ibO|BG@gR ܧ@ot׋,) [uaZ>1 9.?ߏO@5W-@TY8ESƤK+̆ж698Ӝ3TBvFrӗڄ7>cb j4  uT5az4ID^a,fMMVIxNT :5r1?ׂC&UYIԛt ;e,d42;ŕ4Ħ]n1v+w3_T9s^*37ޯ+G\F /MC&@B,#/c5wDcU-00 X/d׍de}VLMQG<t®V|v̺a"ص4i*dPDOgHF95s{: 0#?(oJ l9Frmib=ſRw:,L*+%^qV4*}tNH3*~Ӣ[~a:܀Z#D*Cef\BN>|ݛ]nI6qhcz(_9f?{ٯg",/?J-h?Jp·csK <0BMFx_as]:q ԓWZ0W@}6mo{ գFɤK ,sM?~1$D-h)/H r>Cbߺߞ~ bwluh/,H>O'N .^k…1Pk`R=|=n.c96@%axQD#JVl*!?~},bHHlJEF*HBa-3jEh$ 1Jƕ;Wklw9q^p k,bZv@d8LQ;RjWg?ZMH4c$ЦIX˻"9 : |%?- C_VALSsG{S8XDøS[ҩD/)(w[?vT/t:NO_ 8QWDtFNEZ99Y?'tגar Rax[!ǵ]@7t;‡*:/AH}e<NX*wjLZE9 E&F*EF!vA?2er=<&(,F NjئEKl|60eZA*Lmaoϐ*\_/C4YץV$NBr aѢz*b-j2qni.qwIX&2N8V{QqmFmYn; -3gS~25M;i8cbLm?5ɒOxgr=C0E~$=i*/)[u8n~(6>q/|g?UߙL/jw"{:=,.F$g،n8)@p ?C8K\($ 8 d3ON'~t$Gs$T^'P(tG%nR3W(Y&*j],:$ӪHA, 'aI!V b ; Ĉ \RQK$VչeX!<`Y'1&%xP/o"eEKVP!]z G=lf/po;4jeNa7{IƑs5d8$y %tg6! 5cGa{]~WP"V(Ys}l>r0D?žd>s)a1ՄAyłY5ʌ{Lg-GjDw\LB $}B<^_+hMMv͜c8dC U:e*|Ce?!^N:p>fC&-π[6. ہ,#8w }7YΉ=Oo-xW|(0!$4@P.SISF ^h`ת BJX-_:[3#bc1n\Rc-;w){ 9%Ot`rb`Wd NoӨAjPuZxOT%kTkVs|Ls%8bOތV"_rħ#W"mj712W9`"lX9}G,mqG8bJ(n$C>u A6 ~b`taa#܎=& t}po ir>%ZGQӕ׊>\ZD%f춽i_ڷwf&L^HE}1 3)SͣHL}Is2L7]W“mۜ7JACni tT~%X ֧F. , ,BX?Emz\8&0#ؠd,>#g0OA"wl-wYgv|;TPf3YD )7i W3B_5وw9¿i-m 5/M3)"DgK82K~yFe4z #ԃ t1ߗnzm0g1eum@aHY×̕7BQ0Kݘ*G4f8"Ir.n e+ ~~RX{h=|Y׉h+ڷ ϫ "U2&ŏ pZWi(WҴMB;ca$=;TI*,Y U2+td c,O :I ^1IT{wy^VGwvycuO7; %c9ʔArqG$:WCaƔX0\0̙y (,Di!<>Ul_^бM-_: mmc2/8lL[8%/w-3"o<1kwȕ1k f d(:Մgge 4.DBD4T b ~=t٨wW%0nQ~LUڵx%yDZ6Y<7]f$椒s.=z@R.I[ɸ:U6)svl"_^n)[kB-#T 7!(yKt?t](2 $3_uQix)ֽ3m mA{E.Qsv@9nwuc"^jm@eFeڴbu-JUTO;jXb@HA.`+J.3ip߫>?cϚ7?[JWHt2wAQeVXHHO̵.r-ܮQ䤭cqr,Z,ӵ1C/x^BVžA{O慨4b-,da*,.g)DǺozS -+ymب>NpMY:t?L1Jh&ESdHCp%a[5סm˺.Kȣk; h~o٣Ed[lwٮ+v&^-9'xz]Na ^sYMj7.%qaPR _T: *#P~SFk!qOҠLlbY.B/Ofgb4{j\7\Sru>xx6P3ePh9«*۩P_q˫]}5 ~[&4ZoMֈTQvs'5 zd^}ElToXnf#ɤH=Tifsv$mj:b@6E^Lln<iŒ643ߕ(g?=NJ*;הfK9c!wOao(hCneͷ|T~+t&m<1s't Fc.'l=GsΔ!|% iԷu9`Ubv> H@ Zt,^M@2q/x$pyL C˒V]obz\bnm=m8< WiS9E=,J'6< 1Uե֗_/f7h$èp?bhM+9J36^&W㛇t=AzxO?m'Eώ Xk A7οndX*V+#>{Fj{jXC5# idu]uTwW\S>0Qa0l5ߕ_Z")ko1JȻcfm=vx0\R}y g-yT6 .&aBWJz[.8kHAA'( lHvO>h5jkAhC vc aΚ\0D.bw Y'21!yeYT^+Y Nn+2h: B$3HPg{$:tUL<z(aWc|3`kz7ikS]gqut|WN{a|9,39@V5쐠O.glyḽ"^PM l s9qޭ=)Nl}ĸؕ3!՝+@w9gjOs )5IziCqi~%{.0o=W%5t$z>B%O_M߉PD_GT5럂.&!ut+E6z)RFw 9EGcgTǡx !X\vPrP!jT' (N}cr|Mp`qBse RS[Qg $Jj^~%;;@i4O&IGaוw@Ѫ&Sm(k#ѝ>Jlp4 U~d׭ј[!!;&`N |$!6[ұc i tnSA Y4o"|cb..]OLx8V'xˌcL wbFXh~ooO7ص[:ecX i 4KD;s1 x?@Qi4>oNWJl V7 -]idК0vzJwޱr|,D޳BuƗ4 Y=L芎>X&D7" k2@<Ɂ`3P혤>ы,uxy0_kl! &1j} @֤פ BBw8 6]mNRVwר )a{R>yE6nK8@ .?ĀȶLE\n!m]oՈsc|:^<(Ci iZ!V\X:j)kN͊MG2elzFm&'쮹,nnUZvS/P&lR/qv?nD3/`};.%p2r3Ob% BZ[bF(pGHSqBPr07oTT:PѺ_o8:?z x""Uy}sӣF=V)u_54^bML+4a|}VH]9٤ ͽ6`Ŵћ|hmmw^_yRxKb )+EOܜazǎ_׈Vm]QOw|4I`k/hB(n,x?o$xa]}yrve3Ma6*w)fЩǷĕe BL_LqBh~ c'2sAA2-r jѯ.X=R 8rq5>h\slMw^Eh4>c(#C q7m Lg*f݊ˤS+ #$Džxdu1D !Hv$;"3{Jn`IP嬺KA9bҁaXK_+\@E1t }uɫNl{F=B(uo =[@*6쪅^w'M9E!R3w}oT O_"L:33̌}ުo.?U-e`nꦪ33#[4RW-DqnGl'=lNr_D&k+UO{Vg-"}&o Oh#W0X>v%{M7t)q"%cA CqFZz4}j@fdўCQfXH3<"%p)rѤy1;=냑`euOhk̏V>]U-} ^F~VeΨ`vTR]hVflvJ4u e +kSi\1`]*>7Ei7XY۱n0+-bMl]Vԧ gHta>Kt8fHτXZ4 Yˤ/gIˡ Q:>73EÉա/CQ湫WK.gӅ 4@EqϳE7=q.qg|< 1:=LٱibכJNCߓmqyIN[ Z9clRo e&R:iLMMEٽRо>W=ef5xkbX4`J~^*q,YtOFH/6 P6Q/ <>^c=s&9jzntŁ *$|zR/8]%)"%sdQ2-qT`Kn]2GB%T09+|u݅LR10 _5 `kIhVVll@ey WnXI(%~ss%L '&=1F113=g#H}?kwmrptk Dru'"|nj)F"﷨a肰ry2 IHm"8XV0ML J_RJdVfܚt#}7 Y6'yFqy_E nCBµRvU+Rԇ P<R=y_>A`|7p˓n/;7ս*;txBgte( vDjP*YؚgFdzʍƖZq7<6 Vg&5­dUm5dIv8M7;*c 1+ذ7]ͮa5Er׽\gCSQ( s18`6 ž᪏5֌6wѲQV߼}ݦM)cb+?O{EJ5NuiH'݂|;Eɨ._?t]VBN0.}Qj) O3X`߹}!]T/R)KlT<19U|2]\BH-MG>Q=v8e 42ObCI5Y҆9#d2u=/t~Gnyw#qz]GfRfg{7CMOvnDTb>~A\8թ`GrXfz ri!B3 x mi^%ꆮi;x<( q1±h(e2CV/nP~itK/\%J3Mz<șbdy9U52,S8Eϸ Q„/ܝ}?FझQ|FSgM2IKdeތCGFlM GS'$*"GM2G?!d竤{&䮩73=G57VMxjOH/#8)zr(==\(ح  Ch#p}Dvx,Q +R"dM'ҪgXyUQQm2?wBE3|ɂq!nlj.c&< '17ׁ QBzwFvN*XDa %9N;,Z#t#jtey[S p*m͡D. )H/ d-G1d6>pdZ9-bYt\J\ӹ3p'iJ @k)!WO,@P;g@5xdT+/]?J RcwoڭXԡ7\o3qu**g+(jffK#Wy` .O0DdȟPv2GnaLlɯn?" 6c8i!73,Y.m.1\Hk)b\"JҒg=S$?L%X/Rʱ#3J- I#U{qqD&]OGlonJ>Kae&h \"=^CmCj>mea @0؃r4~MIdX:eSYླྀS];GIc^߿1KHGo(Ɍgl|1-LR^+ܯJ[VVȒ@_LG#WF̤i5zj7nMݘ0fq NEw ,[b@dt3"$kO)+@%UP]mMmn8-Dt&J*9jUZ ;-]* H3ZrUN/qM'kTcG$Z"ؠ#)eDpi.1@% ihk-Sge؀h@{~W;yt9j+ tw2בNr#b,НTɫWݖAYre<z8k_DO~@ףEv)MO oq]t 4 i8nC $mq*GPL/+ӧU&Bnvрu1NmvFS$h C?tEө_ \za!=+@  g^xlό #Y!z#UŒZVPFl=C J9{ա;gi\P!(!hYjkmŊq##IeƚKż~/f8buew~޻=Ge)Hn*q=RcX~"7fPI~ *O8AkU5 O¯-xQR/lvivmuRbÌ| U<'Ke ,c[.0Ɯ P _jB'L:u8| CZ_:f_B͓,(į~=rYF6o)u2c`D ґ C{J1^=C&J׉q]?NFއ*`gVÉ5H7g:ʰ.Xd?M,\8ΆnOWCXc1*0ǵQ=՝-``P$(*2#ܤ]eю_+3X' <\zc??@qS)ku<#v~]{0r!.#'f, 7,Wy]-Z)3@EMh;8б\5'}x2Y Dz¸ ,~䠖&0^uƾRޤAe)VA6u l/u"x$)r1"iay_0yWbNB܅]`@xNNi  P&"ilBIJErmK\Suɜ؛ܦ?3lerz3 y* %l7hètc_…IZg%KI9${c3&}cv!cQfҗ9b,Mr_q `\zzj.;,Nݳg^|Qbץx~PXz =s EGPRWw64P@Vz]"RLZ,!uBo  X$/X~czfaRFtI:bb\DE<qQwCqcq6GJ|j2NN+ 3QME*CR)e O08_e-d4:Cg&蚼aL[PM<ԧФ̱Jر`"`.J@Omizk8razqgV8r- 'zG""1C4t۔{pP9:ZTXTo7adו(QzfӁ&Ÿ"({(Q~6t챎8I|AEgɐdzE 1uIy{%gl>.fhidvp ?0Bok 5 h: })z_ /A`S:(H v(ղA2L`4rS}BB6t\nCXE>.c&OH"~W:J'0&3h2E4JihE=i1P b6wm8Ą(fR&r~ß 0KZ+)y[aԃӪ5҇HuCLy}Vy$V*t!-dLZN@0 {aKGД2b7J^͗m5O Y!bX+ 6gJ嶦rczza1H*."Gc`@iYq`B\=6xX0 p5  0AƤg):ÓRS`$COLyr&I ht8rr8N%-B#,2Nj$ԃ&S$~{8a0zfP dP8d˄050QO`jQ z`dh2xI CAND ქMAf 2Ny L=teeworlds-0.6.2+dfsg/data/audio/wp_switch-01.wv0000644000175000017500000002572612140200333020263 0ustar felixfelixwvpk+3/3/1dlWWWGHJVIe/9N!l۹{rn_j^~0Z& Ʈ|$og?SkO-U( LZ$-^q8$2SH` N9KL>_w͡^CUn׳Cc*g[TG7H*] eCÅYRlJ}D=7e%Se|&/kߕYF!)<ǿ ^SwaUap9hzB\SReڅ-.=URIt?Xj$XzqdCzaŁj3AeںQ#*N)NrO1ּv*LWsU?o# |Yݛ$2sn'Sl""cǔS(\Ug$^F{FvB1Ox^B>im sn U ܲ^2'[/4L?fgqS(ŇpڰR|͞lJ7DG ;ƱU=[vtPeQmbnpHbH~+Hr!Sˆ 4H/Ʋd?kˁ+#ˎzއ> 2c5;}bgGDH0kBy,-eE-ϒt} ثBk-OU3BAh_QK&=q>ɮAohJKbC gtE#c!͆h%Eb/J9" wlV^VO{^:$&^h!C|'1 Pb0 BviEPIHO  pM`y!9>O} bZx]`rG#I|K.ȧPc/X˸EjLm-zU$I^[tK+`#P t_H8I;N_ϾfڔJq&b iMĒ!t 'S`̩M.>Z{O{xX=ԍCo8v2N:vI~"Hh93l`*|̮s}mSQb+E֗;v,a(@9XP*RXι"^M Jj@I||['xv֕K oe,C;D/zjH'%A+q}.3=j W߮ s{'?'~~ =W?1<9K`Kޖ9X;}Z)HlR19f1fCrͲss-Ѕ_K֨tV?#I.RL<?XۓׁCaaQ٤FfֹW}Q]ˀ#.Y34=_KRh ~JMb H K੕qDQwCs_Nx{ YdNJKz=qavsSf]<=AYEp @tF)~j8f>( no\at&Jj^~滦-0$ vR@oÞ[ ōVɼ,v?,K]`OS}̧ub(/@b/*ꤺ/S:vƒa&6 'ܒnxHڸs(-Y3 %mE]ӱ _Gi܋<\ÄB(O'M.DZOi%Y!>v MqJwtZ~s"GJ-|AM@"NA ;Ńm^m}\P!8:!]jY0_"V1 Od.!ND(xkiiäb2 _[>?p ;XV]\uesHm)]tt9w`)⋬@ԙ*Rs >VKmI7Ydp՚1*a)dtWmAubcPN!JzP.Jk.ArL]:oj ѫ.Ky"3Gmɰ1|C_-'nlN 6f8wA+Q^g+#͹׳Rס?.MW綍`'Y1y1_>/W^N^/s<:LT(عEѣL̖ɘrQ'g)6$|tz$1.ᇿ&4t#t'^;qh mL_^eL"8I‡I`ڛ05:yd>s䭔L H˭ SC˧dwA5ZyW] s]AdcR)B{;sr'&swV(~\Nߊ+z8}B#0b|Tō`C03\|R[x8x+5C*.C5HӴu]x9Ϊ4z<[9tj{غkBڽނRu+=iB?grBΪNg=ӡH Źp9Z"YWZ+g*r> b?/Z.,A WZP8O6dxXiv҄(-C*$Xp#KW$=H[ 3ULYgo8lcCl}jfXI\ `H!Hĉ&߭Xh1>x (6)"r&'IZe( YA;9znNnRH=vuۀ D 2*7 B|%XG&$1 oqA@Z,u!fH.^R2otqJ IG>OKt#>$[yԛ6K2T߅Q,O2(}jʏ V a^26<Щˣbdpo6(%i=-&A3#e(COPQ?Í0`'G[A >ⳟhnx;;蘫.[yj?֞׷4Q&7#[Z\R2[",w܁R\nӍeV ؇1|j@or3kWIBL\ 6Pdr{u+麫 ;&rnj^U?2ț!; kU{";]s#Yd lvof uJZ튏_MMX_imK{Al?G(g'9_MNr̰"^<d)<Σ?݄*??O#JHFug;un +.Z4IlZC>ƌpeM&&){Voz HzHLq5BSoV'vwO+{g=zTpǝiXn;!aMo rb/_v2} ΢.~#i/hZZ_;_N5'bd?%x,LsvA;rc2.[Bы}_:+L\hhxJ׿rLhAcx_o1x_5ҘgKRAhoԒfGÔy@žaQSl,R{ yP=@.'~$ |yfF+׃vѻiAnOk)}XS;kM)&TϽ]|ٌJF:gvc=~B߀1oxᖳ\g{%V)˵.J^qR=s aeP/7I !ԢWQ ;T< %rt3o%8H9Ԉ<[ÎC5m_r Beu]Ye?G֙u;|v0T-/)\*uTBXb.7Ak@|r0,%R&P~j|nS캕"rC[G. 8y#' h}I``,\49N`,sVT/+Ѥ8/~!Y-UC3Όl >T˗)vUb2g!=m\ޤ-!B+ZsTjo wۺ@E0[*lQOb{!Sn " _P\[Q SXP1Qдc*{" YVS1ȞF?qb68 {HN i\чUP,6^ӍuzQ<m>eT5U~d9j"N"-cA l>󓭿JH&#fu%aFs[jVD%flFT]&h8xǞЛ7PisOx?'08|>*y6%({y *k'jYiy|<'m: D3]ZHg^5= nG;clFӋo-2e6 oo6H{RJB4"P9~/x R/ޝQt?uNgBd5 Cj'K_\JΆ+L[ړ8¹=~75?QS|q{<{-r' N;LQV=WD\.یNi!oAq*O8~ڬ'x+1}z6R]BA 8ptȧtPߝ.⸔XU E]lYy!Xψ ͑QHdk? {u@.K |ԕп}K@WÏ"w)l|;_oKR%dA(U Ox\Ő̰eSA֫A|:-~ZXEYu+ZO5D/ǭ7 s!|C}(!ylZ @R1&8lTKCtb0v%&b@_TR(Y?A= P 1&Y\?NZ/f_RBƱ(>8_ IO"9.* \P;3ti])%5vGV%QxxB-j)pt؝/dLe+ޯ~F1 &%2CHT5osdOKȒQJR%l,Se7҇d3eUwjD2c!ˤNN]thL',l,/fAcE8Cbf+aѯ5 xr(K2=lk4l~QqqANQ!YB0Ŏ*~s ,T+6{mp_q Se{'^uzTWFgM-d8xd!rv Df7S͂wl0a4.(QAYdP=4Unj-2Y+TEJ DkRP׵{m"8&LՄ33@Ye&:fJRoUd[}D9ώe;vkw0WኃQ",|Fˆ+BWʛIPGКFC8,M|hVZHUD`ࣺH+χS,âOYhlXP7Xw¸8|bTT^„tLo2BQUQCs5۱1;aoOLE5Z/!^ez!.=]Z4>Z:LK@N1;b&x@s32}?SEׯU;>fx^Gi9kܥ3ñnvj9qŚ1d~ ŜlGr}yUM I)ww!96?3Ոy=f^;5c߯4<n/^;я+/]&s[g,+%}`)h[]4d8[}b\'Ʒ s$y^05BGJ88bHbE6Qc#oj:;-O]qR0KThPi/G}7c.n(! k *%`ڽSŎy2t]n<3 $}pif%ll+ψ~6#Њ`#R }4OƧ qcS,b-^7DX9,{zm*ɿİڕV_+d=ɦ>%[&l9Xv L|惲@&i"ge5olachFx_L3ARg_۽Q <~ Iڂ)'VI,_bys \`<b -0x׆7,6O?pwo:E/G;ܬqK E.L&\f e =x. Z7h勐CE-Zd{K,zrC$e\yRGPv[ʘҾEZ0<-8=!9hTH\CAlf%B$4ZF=}f_^h$bIpyT)Nuޯ$_+ğI|C]*jѮTqguL rtsC`Hp^10$+mNx|m3h Lfk~?eً,L_c_yd-eM)*a|-$ڷdᾐ,4\-Z3-<5HLyu{cP׋[$x:X$Esa:#{To I2 PGpazxތIa>#N4]]ҌLre( _ڹU>,W_a;mp{To2ɇD0'%eحn L%ŵQ  ,=1Lng,NUMb 4w QV(e\( ` #8wi UXY 7ԛ>{m)-c$mWTbT'#%w,Sﲒ>9߆!/6ONg+ ܟhft:*^)vM~m^g`G@O@5ZmԷ6ɗdk 671ddyZx_O)Be/HPU>е/\v Pw_&}b{)ܜ/A*G_Ѣ=ੑ U<a;|Ɔg \ӡ Α֙ 2(YI5{դbz,=ԏFP[s0KxUϕو$R2CF^?~{?4orJYP{oΉ\X WU^RA0P*vK[\^8bpDCҩhs@@<̐cF Һs: =4zs_m }RƝla "+xcĎ!cE 7t*_+GiG{ObO[ja4z ^EwCs:7 *V}yYu:`Y?R؀ws$|nU!eȞ"9 CKcUI3T A,q@#^gݍ#5tݘ 85ﷀp_f2lb {p'@d,C yBa5>1#[ rآPc#f꫟خlIfOV3@tD _$ "UZ]V6"_:0b;Y#d)t9 w6SZͥfexi11oY~}k#}I/b@aBh2)Dң]qy)I/u1@A^G;'-9_v.=N%w9OH8#@ No%;q3'`3X: #ƫ5jZF C #c7r?}v4rOާw-.i43'8针OmPd0sA?YUK)(:^`GQ/Ј_[JAjp@ήyAIC ȡsO \-B?,?+͋^S}lŀpR :K 0>.Î Ifσ"#Bt9\GUQ-~=9B[Vy _퉼ی:Y:YiG.Qb|$#Pj[{x)sc0&~ђ0\du b70ub}󵼐_>: T &Tk] YڙlؿB#f=L fA{F(ym]4Fuzvfh P-|txѐV I83 ]"i#B*yIn!BP `02G'TNLG#teeworlds-0.6.2+dfsg/data/audio/wp_switch-02.wv0000644000175000017500000002573612140200333020265 0ustar felixfelixwvpk+//NWWWGHJVIe]]?YkfҵJL8Zu8>n_ R{{~v۰n9Zծ{uڴ dv- 1(lg7]UbZ C,3)3B *T[#}mC#c%h"rLP?AWurp|GRC}L|Q0w q@m|+-?84b>7 <^%aD&pTstøBsrd٦H^MZ&r^t%J7^%Gߢd^'uzq_Y?,asLFh׳ D)Vn 槱x(,Ov!q ,gxzd{C^C2HE>Lg gWnTSI0)sl_IU/n^y cWPɐ|Ac"?F>yʮ/E> B(6`zA?V|&-sEc)fV1BWsK66S5~l*PŦǸ;*~UYcy(h 뇏N+Wse#t`WB9@6S3½ u8KQA{*-1,kTXOn ئY6}v17#eWՋ'e_hG;`/*kOŖ\Yd ^  I_4Ǹ|]ό?Y BpZNo˚lMp>el<9!օW_e:;syG!LJDFu+T^k.z^ A% JeP C2jL/=B&{hyCw:Q %-zI9g$ĩTɃHOhc%':-u/RcPyN(e%ԡi_r܎}M]PfcCyl&4XX/t|+gv^}b }CQ|oԯ-쎔/8NzM7 z2:z61 mi+ ]AZ;t&mDosvrg~3xfNQ^1*'/f6z݅~($znV)#hlyT `RWb>:71h;}GوV:O/0nj#-/'s(h>txGԦ\0Rx9b4-o~=LJ n%)O:$e _/[ ?d$'S)Fg"O}vo4P^ySVljOW߁,-"9m$]R&KZrseUYLK\hqu"aV5i&^M"IESJiw(\s|Mr(9ZD $0:}3")XQJ&20\ _!870k%bu1}`6gA? >?!07EhFxQp:)>{[؇a^$mHb"*z55㽆YYoStB[=-h_Of^0f~8mbH@lh=n e`]z͔M}bHp99 +k'ևۙZP>qE?DzW1ܭsDCi((6~tBgXQkcxEҎ{EaP,5wd+P0@7p( Y 0qO\=4,QSILz !?rr ]Z;p_Jq FT拊=a*5M;kd; uHaos^+)Ey"zu4&qXSv-1avQm$O`x#{YV>ga2flR.tk5\"̑uoMsR.90"&L>h 2zq r`!~3,o4H?'&cC,ldogni[IJ.es+03K &Y[dZ3hVݓP~/x-\S.WnyalƊPdH,bLm~%[?z3jyv{4)i3y(%k|po5Z,cQ h0b t5cw>e(S4Ԭcn)O$KqQA6bc8!Qhu) aE0Y\ELSfE"l@EVWVH*8kŮUhT%B98mpi)^kqMԑ޸.p% |=1 b^mf[ae)ٛA? )ZekW vpQQ|#Us[UofYFɨrvx}ne',a+g0ǦJDd}j$}1d{f$6 \T^| koֻibn{U9`H$> gl }DMlvE>;v?u\G5 RNlU%oH~X֭tU>n4Zée2DchTvœb<9l!ebU8S%|=J]{q0\Y1+2C_| O,tDP><($dza^h.}Fjα 8A(;' 1̝}mf驳1'U,{dcKmcq Q%}mHf_!^׬`}AtM?¹$e.;T56B)e4XoA+2:9W! ؜A>c93zcnc.^G_A)vF}2Z PHL @ϦUJ6ԛ?N_  h/. C/IEb TDANd}_8!򸷋oW RaLPS@3R)qg(o`<c5(ݜ&?1{]tjS"AZ1H@L@gvztG:3NȅR %Dq zfeK&mOlLʯ"nc{ XFsRL;(tfT"9|ueүȰ832/EO1z1BڞrǰDoBvHBpT? 2ijlWH]~d(5'D̛&mQ 7 mLνaffFm+`q;ӏ۪:E^jrho(̳? 8ֵD\^cHח3  u]1k*3kXe`g'~ p#{Ĺ 4)_ e ۳OA8kIRZ.͝sKЭ [2P_)0R\yzt_u 95 ͢p1_Ii֐WM'rGZ2ϟ\ b5anʸfylye쌫CH0`ĨqWUW vTP *kiU̲p+5?'c2Z璐$xXodؙ#FB="=I]u\G% "3eONK|KGWb> 7S`5w^ { FV~D?{~9`[pSLP0PT]BZ 3DYÖkkNi9Qgь 'f]ćMYҩy6.϶9?,L}ծ@@mIӧiju؋|ܘ.7\:\ 'PTeid H94ߩ,-"p)9{-FeBH(`^P`9H35pSwTWH;GY\>*%MS/u,рSLsxj|"Ԥp񯲽Bf6rms?:c8CXgQ$>oGfI|{~b]"lDuˤs523:`<0~ˌ{"ɑ93;HyI%V$Mc߾CMzr5۵+M{}Fe:rr~'нi׮+J)[ҥjh7LߧIP te!6P}GJb5 MFGB)D5}C`8=2*~l]v*O)-qRIOmn3 a@/$LyHdGo$3` pFdDA k5c{I,&rjy@E&l'E"U.9V苏CP4,mnjbk-ݢ$T, OŭU*.qFwsY_\wXQ"\`0-2w_*#77ejcۨ-F+(2&I+ZCTwqv_qr\y6ox_J[?=x℟QP7^Efί14_^Pm{ \7ҽ[!jBgst; e6{wO XD9vdcL^i3~· W:3 BxS׀Nj,pZ6LaۧѴޱPGqu yaOP)j1nJ܋7q}7S g^UVQ=a;, 2 K\xJs{qs=q|[CzN7Ԧ*jLa5rNC~6 ~E 3QJ 6hvz~0e9}e\gg܄@b m2bxa_$c&*ƃMg}?ȉ`)b'JJ}+ч*[7~(ڟ웂 ]vl/soeOjђ8u!yviFG+as}&w > qq}^bfloN (_ QՎD}bUd ݍ9l7۵ @l`UE{DؑD;ҳ ]<)0D:?'E\"ܔK2߈m1IJR K ;sZ Z( 2x)tN|⃯S#J%:ac2 C!d8vW%@4t:YŦ(XyQ z`b|T(k%a4oU{M[+|P)4NǤqY W394}(۷(n3d_Z׹ fFv7K鎮$ ڊfL_H5bL[] (ww;҆qcv=hw.=xq|vRk +/뼤{DjY-j_=u+Etۂt"\OLD6 e&яE9ɩehiQ ovob ϥWn" AL|qȺ%{b nniQI!I'$pBg 1\"df !6(NDdeUJ%azL8~¤Ɠͮ~::E \IݛzE?)bteiG׏,<ᯎ_p;lr]z&מ*TaT`y%%dDU+<^7]_"^gK;K?=ɮ2?ta4rzPWMK (ُ @؅ӆ)y$Xg~'a\6CNڐg!$t|nzIDC+.HI>ٮ^+Vu/opEXC0oySܚRC(>l*֔1zՐ>Af*rWio(l>)F4&Gd6T0XEE-} mE'fr1O0Ŷ4G!+%oi2[P|c\U/3uy@j.$s~zm[2|uE#[,BYԌV:zD}eEƉF?1'0tP2!&Zg 㜜L&W#sc7AtTؘjqt#zD- WeS'&Ob, ۝ 60 1v= !aH Q@ȭчRm%>X݄t$#T ӡ hJ4.f\;]ZX2{Tȓ!X6%rrn;"&Ax;Y/(m̪X_V !1I43FϜh:y>hi?3pW&y/u|#J} xhq ` y2R|ϊFArpX .dʵٙ$5N.t!`mǞ8` ޒjt@Vίh~hfTspA$f&(j}zV IX@F &T7Ӣ[b2"[f)Nݓ\ B¨섑q4_SFU0p->BpdUB\Ϡ`ۤZBuKVucو 3>'@[ "U v+wTI%H|lK'sy`.05ZVT欁Z|^rd-F\xp^O^;{h XUn`TyEUqO-vk@7f#hzڋOؗc W.ZT9gJrKU_7D4CPML%S>H"?]fxx^O* 歧PW1xiW!1g| ԻE{yarl+?f0yRfpKT%`OjVrauWnG8Wbqx&ug>:sYbHo>HD 21m R K]"CT궰"&H:0>B8fm]8^ڦ^Gn=Tm C%FVM%|? T" ޕ2b\nN:xjh7L+y)6˕3WQQy-&cKMX 6#B+3{W'98' 9a.hc o{wln?|}WͯDhy`UpEk&1o[aS&Fy a'GxU9<lxf5eSV] y 3`ŻSUB?[ߒ7gA~ "A^RT{ yмȀ}Bw7AO)8{. i%;?h#v_McdG$.E'D"t0d 9R1Ng rD0IKc2 nXm ,j~p7\7C` ɘo/ÍAY/9;丧CGI@0$];jS Ձ#M/#gqnu 7m$+N[BޱɥF4P)#Z+tH+yQSw@:D!B >?rl.V$R0XGh VGJephSg3 3cL{0d>dxTpID P 8  !<b  &hЁ\}@sttwteeworlds-0.6.2+dfsg/data/audio/wp_switch-03.wv0000644000175000017500000002514212140200333020255 0ustar felixfelixwvpkZ*--~'WWWGHJVIe o߿ww 7wn6=#??g#?#^ÿ}Kno㶭X~?1Tr +JpYT%Q鳣';;W iDB@Oy]>]_ Y<-\7P@bHF 5 Mh.H0!Md،#'32QDHY(2LXeؓ7r+>!*ۯ_|}9B7#vV}2Ұ kUiC4uըF5q] /95Cػ p l HW\]{ha`sr,͟#{2IY@[M s{>!N96*Qt x_N}A_4:BS&?@u7ބdx^~rz!Iu~众il0r7.hwhv5_b| @;԰Ble q,RxyXI跱+^,"Fzr36.ZO sC#+͂rx;4 |D`?wpŗ!F9 J-4g}Y 7=|jL\%xYЈbPG7Xu̬)9B`$$qf"ixՑ.,Y/3&An(UBG57JPxo ѹɸ^@lbz ׺Z@dvSk X7#;x9:}DV'=rEa g[K;'kUv wo$JmzZ VJI̟Gxо'~GS_虏kuRo>ΉYA"a9^Y~(q bP2+ AM)Uag}eN)+]v7[Z14wGLrhru*POmSf$fn>A'X焦V%@}!kaZ`=lZA<K5pysV&YO|JZxo "Fj*rF>kz&eڣ~Ep~Ajj#t4';BFO!bnjYdjXSz.QU')* HK[1qklDY%b^BHLV( %wɸq>"[oU?G D6)O>*Ȥaq ǯBKCZ6Аp ptdhuW nfiՉ?J5f۶ƅNWIm42>y$5d0UDT\Nuޱ+AN-um^=38bТ]˶No2Usd+ jKzE=ڔ!u܄ Z-Ua]n/fP hҢQ/=R{H*&zI.mAoPӀIT>:j̟$W3$ WLh{oNŋy-7T@W2v1(sG/,R)u)OB7ӭVOA>yA ?#/)ZgM Veۢ5BCGBjk-Ђ,.6=A͎ F?86q9# ֻo[}eHGo9n>jԭzo89") u<wS ;[NazBܘjʒ6]}% M&[%)c49`a:Ga L1A mG6%A]ZGeD*˜qZ goA5|գEv_:z5Y`BL1s{GY]Sħ:3ľ4ti//[>M|OE4nִo**F3$ m"l3((.s~ .1&[3f, Z?ӣC~c;:-[-2Zl-KPt0D`C7d0Hʹ-ߋ('qudmi9_E@q5%nxc%!7k{s4' H*FW>Yo2%g;ީ;~@8_̋ :B˭qںgOEǭv+'~ﵰy`v]8E?g<]jP]s@t>} UU<>AQ@[Yqyۺ"8W̞^ s煏D ADڣSKع׉e2&w>-3{5N2H   c %urkkYUn}mvaKRoNyQ{Ul`*@ vQH֍Ηg[*Ă{b GH GD70f#CQ}#j:&-o&W8RT"UzZ ].ʑj |(i6 71[[s.y&*O.{b%dԔABB*{*&:&{ #Б_7 9fGBD2*݀5dv8쫆.EjV4Uq?D;tau3/*=Yk槞\>pULtnՏb-I qoȂ>7/؝7'c6F9`W|3nQFѻ`M!6*Ryvʹv:ꖨE~.$enyS.NHEd-ȇ*52:4/K"9(ep$ F g ]37rs7JڙC료hHR+?M&Nx3KPS(}?Lɪ!! 8it= 迲HݓRnmq>Xj\~2UOm9:7aOQ fS.!e&5g|]!x>QY뺐z}xKua$)ƍ@ x=iPuࢻo5G̡^6=Gm瘜0P݊"[9Wm ?/``hR/M{,$=Lj^2>ka;rw!__ht Uuw oxmz~e(q,99B&yơ%'HF ">^w}񓟧 \\Feԓu8;][LK32Gu q'ӎ`֯Ƌ+l<%Xb؆]AC@擏 wK-W%IcߌcR TwIi='!?.T:E+z!BK;ү}q]Qʉ*Ӱ% 6vC XQj)V>sJzʭ膋в^f| ͏e9Ģv+Yz1X#6:jUCbD%xZk x3#7NJoZD5rv{g~k&J&('9GßIŒZߨ=Oq9ċ;.}g> t3s/Y c{FZU 9=}UV] _G|iKԖЊ{@QUܬ P-O SmcFKlAyZH'#>'E_},xS >'=<,ApHcA'FP{]ũ) !6\HC: R4jLk %xJN;PcڳoL-%oH[6<I"(…]n`:vN#Q(DM~ΚpUEP @stg@Uz4.ā WdgsȆ'.+t:@K 2z~=s #+\tCXUstӧl+ ŸŞ rJ#ϰZ|} D$ vtUzzPY;W8bV[ǬU(<-czLeh{jsuC᧐½Ao2Ȥ xuU,JFOr 9F@*8KңI/RX:^$`U7JuHUh6睅T:^T.k-?w1TW?P-'x:`1+Xq5$l&kֺ{! ;ܼ`h'Un>IO7Ň"lWF9pQe<ikX5Z oK)7y[{ٻ_?%PRso!R,L2F VLeT(TD@)Kkc|qk}EfFgBmǢTN>I<+ҋw(["ut!z$`5V9fX%j|gK{5zvL:bгCm6e j5ǖܩ&:ʡʡ̘@0Xm("c^"ܜ`tˣUj )j1& /PQь{g-,5~X{!pFu}=su9)IWmʊ@lv♛a@ޢ7qqTWQM[d6/$=\ l|"6U`W y`n^H0ݖQp0?4BbDrpSʰDI<.0H,cQT81S 蠣 =6ЊA+ڀ5 Zl( ҦDJٕrp'iETA'&%`D [Vf!_7 Ī h~y&AVRHzCX~CszAΒxv:IK+c[>-DG 3#):0>GaES_jMn9 hݥѻx/ӥiu|f4t®M|R2F lJcǃ<ڦnH1a;Z\d@r慨soG?D`1]ZЍǴO*h6#~)YU'cqߔ;5>NV-)qZLF:i/*`]ut~,Ld[?GnUc}brnkNi9hbgVL)n6rm_3AS1{[}Hf#kED}vD*rFo0\z61 ŸkG4{6*ّ: ' *2ra٦4 ,_/0DYSyw6R4?绡m:%vO"ڌ0giʼnm^~!}jkJXG#αl񐰚{4ks~:i|w#d[fTiBIcfOͽ5}Xe,B40D#K2yg76*ϋA"'b*kED^`j1lFSgQZG@ZΙk-owi&>FU"P$PugG+G^x~*uıG(HU?S |ZKO'#,AY>Ϲ" PvSOL1T-yT[lkS<)R`.Kcgi %!CMVpLcƒ5uDY1-M voR[3IU d[1rՓ7R["=hjqr`(>pTOZhqʥL붭\ryN6Rl0u*ha=DJ0}@OǭlSNr,aJi~l%)4/WSAQ\~bz"ySDpFc Io54GrT+X! ɜ !2ps6~nX 7[)un``GYꕣ'i*G"K<խ?WXϳ^YDOqH6:vy<Gԓ6A1 b DjʯMH@3fEll 0N۞D0I}i[9&523Ii@1vQ?I,b̚\\=9X=rG}} TY pg?ː)lTFZKlQmbJΨ'B} >HY!Bo;-jG:tp m~ViyaNpIF7_âT!R.`l`Y G6=K:,P92LVRmʶ4"(1޹Q !LJ +,.P,a尐\< DM6myvwUxrO t,J86wZzj1B6Mz֑(ɉ/P)cCV,p%dl}) TLsLItx =+Y:ժRl-BJ`KfajWliF1fMy4@b:#F5g0NZhsNV^=!PZYdp`T#N}f"63 O'Xs,%ʎ}.xQ%ҷH ]iMD3 wkUOw0!;mׇ,@M}ulEW"î_m:)ЇyaDfYM~ʈMZjk5Odh#x% =Q/FC3!47u1],wS7'rD(` KF֩rXҐX=wGE݃a+Ul}rxJy7ӵnv1h1e0*CO#%]*oX>fZLFuI+x(:ÝSz@ŶedI1Άmw^,(YW ro7@H3bɜZ^bf,k-U' y HSOzq'S1^ O76g"![4>qgjYg ul &ȎDe V:)c *wvJE*ճ0@x#>!]8ifzr)x)Gf-~Dw.M'"'s5Q+ 9UȋIǛ,o[\\y)-Q(cU.3W>Q0 tM=b0%&xz2}7ȸza3%ԎW3=pF5;-TՁ+*ifR6{GDCL!|j\n(\5dXNj9r~cٿjR ]fYHD&M \dw8u"ĝ[]ƵgHg"DF43t]%[N:2#d8FX^gObb?``4OAq2_ˬ *Iv+Bkubl:>6r!=K YPV£}55 ѫQ<v.NqPtM!aVc65C} rXx73t} 6MUW`dLTʾfΊ׼m`C^-?&Lf#3 OFjG(PL)BV=>dhnռ+N6FL *E#on D[HQ0B( %Z .9FZE6%l:0 ?"Fm8"(b29<.ViZu.e;L `d* ǣn#m/Cӯ|aa*_l* "J7DTA3zYB e$@I"#yqǰ+&3@C2iؑԁ"qW'H"\#!dƉX02T/(#gDwRM|a`A֊>D@<Ԍ-\,0(@?Cˡ1BCQ"TLB 'u@2ϝ:F ['` t1 >"#@OIG'?:.hԐhh``Cp\Z< c!Cx!PGAteeworlds-0.6.2+dfsg/data/blob.png0000644000175000017500000016372012140200333016000 0ustar felixfelixPNG  IHDRxsRGB IDATxFsTd7I )=c"R Hc9ulg;Su.vllg;vCvlg;!g;vlg;vvlg;lg;vKp1_c?_g;~m#ws?W ~7 i8vgɧag_EgA\I88@ E`b}@U8v}"R޿ U 0 @ZllW  w#{)8v&qӨ}ܾMU`X蟚Ut? {]) CY L|+q}lg;lg+A'@@|Ⱦ'8RGB黈M?ۺa)2ńg;lgD̍}$$!gpn+P|:] Z7@!g;lg̀Bީpdb! zuxD4Ǟ Vqdlg;lgQWU7cJ Τ@0fC'@ށDUJ|W/pv { J^4zwMC y uJ!|v<}aɁhAPC*O :pg;!g;[+Pw(DaOe)iJCFè1CvD] |g"@J$aБZ7 ~RGe}t"-G1l?"Ё9oZcFrW8HH~OyN4z*4!g;l$.wyS{R~w,!Ck Ƚ.uܩ֩˨ălg;lJ~xjD}A=}Z@H'߁J-Kԁ.MR NBdvCGtϟ/"zɓi! % '0a}P|FKywWÁàyv}-}WSz'5\!p XOP݁seD: v_9I\x*pD'9(gc"~"' I*(}ѯ־UOU]:g8;aCvhbr?QkZ }0##]A`ZP+81!eB q(88o)xXVפڱIvfz DݾSb ";y—zӈSp:|K+]{niq d.޹u=Q6 !'5pCW[RR>8Ǧ"4wE;`O"$C(p~"s]E6OCv~9HJPCUݟ$%:^!0 WO >*%vZAbLt8GOIG!4PqDp~Б*\]~߁_@'ֿddBpRg;l W}M|Ri6`p|7D tQNkH]$Lt v"SN@- =_(u!s O2H0hgOJ~v<R (g;lQ5 > u;בk0${Ӏ[3! ɀT% ߨBy^;łiaQvl>' UN'9Q2}^C\$վ@Gݼ?M${.BpwWկ>Kp?J t$%Q@W1: m~%;2>?P8l0QsVw;?_ur?! gwVѨDwfobj[ C&U辨qBLH8+')Y^C72@4? P&*Cl~]L5{J,. 5 Ӝ/.c_TEHɀ|it<蛂:~ X}f \ W?ZK;JHI94OIG4wTN D7Vx v5) ('R]gґ.Uj`}{GFFxlG8/IޮojDATRu0}G%Pj m}%DI nN_>htC7?/iWV^8R@H}oϑ:{GH~7R~ j.: 8 8NvR&S;ߴvP z_`?]Ovr,ޗN$$in?+'`ݍPTjC-A͗:U'na M*c2I Bw\&T x͑?Wp=@ԅepd`߁JT@UwHdU3ܡQԷIW1 J pH!g""Ia4tMiwN滋_V}ZV+KGJĻ&U;ふg3]ם7N  3 !#jH:$〓Ѿg Ia *itS\c ?8 U5pW W "fo_u/eձ_#{:BޘuFŝ:>wnƐȽ:>&؁ |1H~B %~[O*%p*KnG 8?}ގhp~:%`HW@KSĄӿ?_76ہ?)LVtWQz@ X' ;0'El'?3AB G7W{U:7xp°t's;) wg=XH@ @C 0S v~nVh'di^j ;w]hER&9V@]dT Vw-'"@^$xW`K # +p!]BP}V@7Ywr&Ma1&%t[oFJ| Fߑ:'osG'mXRt.:wn?j@tAw2L:@z쐇(FeHTPqX2Dh8!?S^YRSS5`辋ڿ]DN"~FU֫W@`/m"_ p;`MA6?;^'$a6gZ8cݹC0_n`6od{eH~l>߀lOm{؍WuԿ3W(;*R^:u$3aX깞TC hBayNM$J Oa! u]ۿT&bpOWfu >@{66B:>ƓJH^ _z0^v%<G~J0Q:{i`gNTA"ןj_ԝeJ \ǵ+>)_W ! %o2( Г!DׁC=pWWU￙  axi4F> A1t"Nq_>'juL"$w6)P'?&ㄏvȿw$OTͯr; }gT37?Iq y|W@uHܡ(rQ)#ʧ0[ڈQ2bzu,M4'? iq^&俌wi?=}Bn_2@;PjA X I^_ IFw2 &黟_)Spߖ$SVѡ+ແ@@lo yP ?@<õN>H=Fr;EdU:vkENVzxn籓kҥkFU_):iܵ>!+;PL{8@ j 3DBKwR N!@op  T`" VO7^S?gޟN?LCbVNѺ ͊ 8rC_{ dl= DvZ w@6 , D{-ULH:~PE VD}*4ԋC [W ;;T Fj;?p mw0kɧ} f8`O{8"ʪVf{bnr'L CaU%ߓtAwG 8~6V3| PVm igN?C {ʒIA : _ʯ\PU4F)׀ LJ]#$Z!M1d5]bEx*ex(IѠSVJUER5iHU8}PO$b]qu%"r s2,%_; ;Sg3|v-ɳu7ndOpj,0wxX$VÒOA: פru7g'|z{_Z !??3w%#~W=#Lt΀ϼc#.g; 'O#."Olb@2 &a -ۙ:ZRU4.O pv*:WI،wՌLEN\`u͇Qv젻Bqt)~24l| 2KOokwݐֽnkRaV9tVo{R|ަ'h%]>!CuE?3i!"QV RqC>\vS>)L@4)D\SeR}Z؁}𯀛0W.B{wzQƥ/xЁXjDFD;?WH C";fF(0N [{z:'gdhMWÎ0zאt5N.ʝr_*Wxj UdHO\f~3wy>#|Ow.q~g; T*eEko/YEӀUvUID]/ 7PC$Ց>;CqP0US#g} 99_R}Vw"?kvč8ugK5ʍRyt5 ٥wlWR7mAC]HmBr~G xKdQ>K XP|+;B+2Sp(uÔ*KRSZW^P3*Yuv;w> r_݀EB@V/U\MW@VR;%K8i"iH lm"&N)H2`vkȰ;?Uw] "J>V_2pCPDѤ7$d?8V:('o{mQgȳ1@:YsFK)Q!@zz"U{Z+_ӹ&($D wŜ;S C~-ovg$'&-K ϑEI o:*#͐DěsNtvU`r#(H LđR4xA7RL@XD 9̀CM&4:Ng֧nV;.7vP0Nk'sI}nr=wCToKkDFPG>>V}8O$L8˪.#tnP^yuH!.J"|')ֿY@ҔI7 *pQ}Z>MMqV7mDvwot? L0H3  LR:vd{gS/h~azU:?@;$vF )H$Qv"ȄS;8q P6VY4*x5X}'=&m/0 gH}VFP&@;^xw6hBF`4'\.tzUׁA02q0_~@EЍ\t[D IDAT_)Ѣ5콺VHz}+Q̽P:"Wg3:faW;!Qx iOI\7_y˟&ZI@UJ ry.=@=`0p ]qCͮS_%OZpE*P*BlH־)8n|Ȇ&Q{ {_pvoFp @ dQŀFE2Ĺ WVECiaw5תj[L`T y~??!yO+5cJ*ݾuYE'~ݱ$`KnBU#s ${^w=äb?)Fvq`:3@IPj'@+d2A24Jk!] ^>k_"ԍ.@9D^)N "'>Q, J K<V:}ّ~;{;$yw8:ջML-<+. ip)Y5[ ڵ*ɪ~K yϐ Hz@ߵU!bLM'$*2@kd@u(xh;o1DmU]߻~|ot= tn ! َ1`w3p yΕ oYRk ۜ pT) 7*@TH=(# @J-锾z8EA 8w1u[*\E]T#,r]jHϮJ䉲@I:Ȕ|gAGb+sDD5"_.܉n#1S'dZ] hR>::Uh:'0Sq澬jZ'~{w,h72̈L6Lht*Σ/e&;*CGcx>Cօi¿ H H"wI@|TgJ*:'& U|Vw vbu> Fup td"p\@OG* (KL'J@GRs< Ӫ`B@#(2-&jA@897MxCh D-Yȉo )+ ?#rTmП;!6Y$吼\(Ga$X&y_F7P-hK[WxCb@>v̀7p]d usS|(-}ߜc*ҼŽWjGNqt=Z,8EϿ퐚 .\VPB C?)K)1 Ֆ)CxF2I~^k7 #5N tr%nR"!쮖Znj\uH)Г;kn[ gIà$jN?c'D:d7mz!)_g!Ct #a'@2㊿SOs#:TE73z*MHJ7$4ʥtzBss`OM-l&O$PE<ޗD Vo4-,~ 1q>It3nQf~-%W{Q>%]r׵"Aw\]r\ zJd4m :T*2y,T 'ʀ 3t8\Ї1Qo* w|>$ߙtOrnhuil_D^}|*[ :"uǴp>>Djl=b?~s8'sVo41I7_c tn8&o::nJ8 94͑ TnO*WEs:S6\NR"LWAZ ""F8yR31w%0urox`N+ ҶD:3rㄉl'=p@z}>#i: $ u=̂ȍ#ČoȽ" G&#vcEz:gilWK$@HNf 7/!;4zP1R@wp+ag0רzOFT>-nݹRG:) 5w+a1 PvQk1tOZ-@]+JuS7~R? !J!`<%9zϥ); 1M$mݼL=_O@&Bt1+RwCVS^'TE9i>/ZS0vgL";"GE%I]_z6/:+(hJwגvw؁-(KC)Q0HK> z7O|mۭU4z5mn\$}1]:2JQD!#u OH]NZn K,!97};J>M"Nf?NABS!BSI׷߮\{ "i$;`R]V:RX<8`vDp5Ϊ*ST-H5FS>n)ivgުqѹvtfmɜ Tj $?4!ҵYbNvlvu{ !~r9 Dy\PE#. 颜8߭TwxCw4ARY('*Bv)Hy'ro@H}uߜm "CW KgBIJ:Fhg:s߹uJU1$'c"IhwSSё:;wŅIN i$\ORv3T>gH>7w׎?QTw&Tj\TLe),)=鉯lt,0%;aqMT'ʅ 9)|h(/hp7{݁0ʐF\ M[HQHA%Su Oj J! S@9;R"tBҿN rlL>_sՂt%A%3"~ V m+d^ݸܤpߧJk3uNpΫˆ j³.=VCo}S)=AtrlTO&IYQ|InNT7JB |OӖ"\ dIzXE$bn'ğѻNIa^H-uG>JT gNf_R&+'$:.5IL>Ժw:k #K%c)?Ǯß{MU{ p}sLFj\w&E2JB'r+ɘ*K({+"D؟QoBIQ_P&'o@KځX ltNA#@* E1!51Q5!B :1颼 ]})u:^b^::I/ yxńHgD 3=o:7ld7n] (ws s. ڥTO.9I| ΀Cw.cqSq8^B_YNċ@rwvɵ$Ct1ƗD=Ij}5ZG|\IIdޚ E$L% HHEZT/@L62>{d0QϜD]6oz 8 s#!"?SvUԀA8+Q؝3%^{EN<ɽrӪz6dwp0NLRIа}cv-T}@H"%XI}W(.++b"vdyDi5 p嫷ݴU?~W1[e|?BVH*2 ]k$)t&80%Ҡn38RH"90A7I H~NHÁw$(by}RK*2@ZVz&I/W&@j|JxX\kv `ttqn! ɭ(^0Y"TΓ"rn#QCyMBSR>ϫ8Ey~°Ri oTDwwf@ 'wd_Un*t=tlGPԲ={IhEPV8ϯ/Z%m o.))WX+[IPJ RfCSSIT[h,vAbur5 O+.x1]7 9w=g@((ێGMT9;2MeLiIԤT FL^'2]J!XGzOêr;cHD}.{@Ρ@s4"A:%'U<@z(S8@-\ڥo\DIB&)L$&6 y}!*9d~w( I2DCbńwZ$z\%!g.\S6oxeNn@r#\5ļ;`9dj\Q^bQJ1kLZL0&7PtNb7\TPVNL4pt3I_DĻ0@ZW? 3?QO]AJ:tpb& HG:|w`ڲJ{RJRj4uHE1 uU=[ 'C}wԨ4"d Ҏ|}W_E~J ))?HDFһW' ˓m{<0m w0 v"+.S@#~*Uc$TpUP_O q_:ֺw6ѮYv3Y.ɒbjjHP!$F=L $_a IDAT@:-mKAͭs[q 9$&+sYKըiaM2OM#퍮j@E5(fbFT%]J<$_,GН'SS ȿAB\H: NJT! ^s:DI>=iJ4f#vFs"R+XscG1ϡ4Qn~RԈD pnɢ=r Z:ѩ 1x?6_PkUaUS2hA #Kjd$v=\w 1TvRM:C͢ "9o:I;K{\[UDe5]#4n6r>RW`Gq2wG H\GAW.R?ޗ=(%uV|cPy ,KCjK"6⨐ (d N-M8 {]$$"- VR+YK)P亸wLѯkɬpN)UuI\mwCt^U%pȢ>7^~ HuݣCp qItNS ;C%%xNwIJ@"$ѧt' I]5qI !P]gGrvZ:%+2i.@RZdo1Dv2A 5W]j]<{"6I$(\~Dy+uW$% zcxˠ̾ʡX.75Nt|Bʔ.2OUpABi-LFpen:b2wxV@/ثV]UOj#TqU;I]ݺdQ'[ualx~6J#T?ETMSEa(K鑡39^HH;GB,ҁ<;I &\R~::aR H_H=w[5lտ7ժԿ6ǪFTe]5 #b'Y #{jYFDWh/wlttڴnv:BFdvz N >#+H$~JD|2;:,]&n.8ƟEWPٗ`Pp=3crQOGVd悻?Wp.i˥;ߊ|$zi?x+.ߩeSU9P]i?)fQ0J!8V~iU`Nzi*KҎ R_* .2 kF #W۲[X#]0Ur1΂JIr@NhrFɠ~6em+25,si$Vg@"W}T;_!'[+%@UJ@Tݝ^RWA&XIaDj7Yj@B#f1S(5;.WO"^(qQjr+ ɛIOH (PNld+~jEW$nl~f2t\#i^iņ39^1Uߍ%6)棲JA @駑Ww #!T'';5NN=lGH%-M'^# C8Z{9㹿HsC*3ڝlM@yg2٪KB1"񕁎ST'uw7]l%*4OzH.v{gNL!>ĈtJ9{t7`v %@Dg=,y̧S\ e9 `*I }7)bX'xv:Vaq)V@# @YtHJnU9n S>k @'w>NVb 38.}R>o]*q$5+݊DJm}Ӵ#5 {G(}q<񽗉GS|@ Ƃi~cQ~2q07|,)HH"8ob2 Iq= O,i'ty2%.4uIa`祰2 :fzҩ DRR5"c,槻V?WpH&&D H _uQ:'@I{IQ*dk" `d.pRPN"wKT bsؔ: }~v0nM#'6iyt':O ?A򶚘)0 ) j|m)s}H%fE$ @S(xJ8ۦ&n @|NjQ+ N9Ń\'{ 4ނ-!et#F;h6 影ଌa2BFds:x5 nO>,5!hHԚWԻO"e;ާ\OU/ZfK|]dI,A蓟 :@H)$FN%QN`H׻W}D&5>Wׅ"x? SߟZip6+PJNĉt 9J Pe|k-1}FIDDx ByI!S h.+!t_2{.u{&$jvshED⫶*^E* ޤeL19UOS5"OIj.$?')LԲ])4.VhVRJI7SgĤ>TSdDqzx]qo(/亸c `4u\ê ğihhȷ (*z5Zﭺg-S`Q!rCZO~UF8 )( 1is#T&ؾUyW7$*ↄKy p@dN = czcO;WTȢW)Ub\U 5 EN|ˣno59ſ H;%  ¯Z(uS湇TvrW$!fڲGDIH/E"@d֥:rfnn Ӵ۝{2vyjD: V`r= A"\3#(vwS_x'3ި :CHFa"JGhn6 yXx&JvY)Awޗ,((][TyP,i Y(H$~L ߵ#eRDGxgeW|(2B^܆&'Q=eX_'A6/!J F: 3W|/(7@(wyk],q>vJDZ' sA"H.u$-TINuĉo89M AULV$y:ҁAt'ZDG'Lhꞑ #Dx=Gc٩OIg%O)8wsTpEU <8AqGR Ol ix_3{BAU~j!~CP: @I>)T0 ,$wbTt7!vE eh- BER z&; ٩LOܕ] FJiҮ-])@"@5cFxw`wR;ʧ~@Gn\?z}Aަ&bW ͻB"sD};>S{ڐ3H27]Y}yftAuMhWSb\q[ 0v`i$5H}wZD>Aᔖnn I7ND]ř "Mߝ|Goo LwJn5W"\)p h Ԥ"=0-@ãi@ĮPrWHxv~z齻4%wY'nx0vwyTHn\TXI* S 29pu IIkw(; )7*b<JՂ,4*wnLdQ+ҿdF䄦iTHfx,q;b3Pc"_H9qW;0?z[OGp'Û4-ӁLI"I5ŗ:QAܳ1]A¨Y@w" w#orh!A܍ߵ.NuI׷Tw ݛ":Z,QD.mno @5z C}("{"Ʒ4%.MlnSKEj%LIEzt Fg<>PHseRRt2mg L#莜 oC`Qt_+H g',_:yotX H&kکBۯRv*g ȧ&P#wqꖻc#F#'$T-4ώj~GY|;@w Y}#IZ$ ɉ *|}n.LHZ0NLոħbSڸ>=KW<=@veUiWv{OfNW q#)Ă&a`H ~nG6Z剡퀍F<]^$O:zM"AZN(*­r&s<3BS})}=d*.ؙgNer6H#ք d] o6. $o"B7'(W!CNT#;3"#ZԐWM_ i]O$YUSIXbw226n'N80Ĭx!?]t.q[L"JD5ҽkѫ"].  ɾvZ8R9=!'յ/v/GPU & `UO; kms p,҉{˧Ͻq͍k[wUR$C?}:uWNbʿ?+sx3q'EE_5HPVTR;=,=dL!UneHZ CIS{Kp%.u$=a\I{[Rpx7>=չQK^g\ &Rj8'!;2vO큿F%g+]O>{o]Ojግσ.u*'z -@N8сPվ"gm_Uwxzx qm(' J wU!w. -E @JoI[h JwޑbSݭ=/t4& qv{w^@rOv5 NZu3:YہlP2S\\rZ|j-yF $Qi/4!^WIZ$cwnkֶ+[D6^Yv}bL<VFk#wusrn4@DHٴ"=6J !ii#SzRX<PVݿxOv_ZGN"mOݑU HDa)[,~;.~g69:qO Hu"S?V#]\I] \nd])pWp\ fZHoHܓ(W)Haw.z늄*膩H}~N9F<-qWw«OT}ٜU:hAKIZH.Rv%p)΄u-Ԉ4ɜN'J uL}9(q@]M$t7{%UybL@VuVRRx]-hO/ >~*};\t=KsX"?4%~UdTӕ鋔[D&Z/JteSW*KZiDwkaTΕQu(tJ|=kwZRCdHRogE%`Wt7@ #5"#n NGjGYI;TpwܴsJݟaHĢoC IDATCANS"3 jEr.=*W -x#Ĥ%6&ɬ2@ rě?!&zBIFJENxms:>#EiwKuW(j3JNz֩$/nڳ孊Asr$Wp^5z[65,)fg`4mWx`?_,PȢ9 [GqVy"t,OZ*TuBb%y4w"mN V L㕻}wwq.{G $^ܽQ iowT2w)22ݑ)8@T$ xb-nW TDKk#Qiध DZw߹;c !@_- !i#5i*۟Dc@}ÿ?TQ <Jč.we%Q{)!$h7H;KSVH-QN5>&xXVF%W OF&*ZNZ{v yJEDDIsx%&r7Sqg.L#ķ| )#jÊ8 iuU1.->;i/UE>uн׹&Ή|?4ﯚ;t1р#wo\bׁ. 'wŏ]n>}y:0"H'8 ((1ԋ3*,tQBV*%/{GII }"qRFU%] >X>b k3_>c]KqEnG%ΐ긳FQXQD00ladN=!)T}Kq lEJ,59ƓQY*W.Ҷ˝ ]tΗ"YH;dz"%~w{\kG|3O"7¾TyLp(!_;Q[HWT@_yMF#v $.dƤr)u^@ *x\T|G0~~5V*7k=t`1sX]A)PC) P*:7CaGβ{32KdjSw?'>Nݑ9 C8s)T#_kX+v]gw$S]0V3lne~];d,AިԴ&*pq)kqDdpaB5u$)툋S1@* ޞb8 p&͍ȏݗH4y+\DI7]DwȱI'_E;ġn)8T(*($`*0Gڽθ'J5KXjwt[`Qw|c_݇fqV[CL^vI: !ߴB*.Ol:ٞzH!kaft)]}EpR !BO֫U!E1Ue2dK??|y4EՍ_D+9&&w@Ul2>xXinL'\֡^WClY Աɐ_&Ji>qKmx$o?;J"φP+)u1[%$@rQ^]}3x;|]2>_բ B2. x%3c5 Jg|кzSIXξٍK;z" ʕɌޙ'>!"#[Iis;odFwWk]E*{(ɞ]1j-&rc eU5cyiOy]M$ +"O:)oTb1]cHP-m`$85u÷!/, TDPr!@Tb3LEE֕Re <ܵ$Cuk"!'` ([hh0*:;FʉMR.l dBԭDSv(N"NHSD)ʀS(ENR7D}CwiN*JɹQ XEJ x2b ׋J,kw"!f#$_Rw y9ojXJ@B56oȊ^~!y&OI[ +bеSCǝq̈́XuǚtオM#gaw%Uv^b[纛UaLM 0BFN$3gk&թ c^ ܽK"C7?au]1(QvZv4J'@7bxe FgK eȡ>ATE U;ohJB7(y>?2WjScP\T\A: t\p2 4]^-m-l1i4zJoVXH&?Q~pW@tϮk(;2Z㾷;=_;+ZBg P)~瓵5Fy UN+&EUS=\~x|-81Sb|Ha2' A[;U!i1L{%E3yȑUR&(Uߵ }[So S#V|+}nγ@"gUm5<վNjcrJB+| DS!a촵Fp:p?Ɖz\]~$ H &t"v;(_vc;;B/7]w\-tTI"NQ%Z6e٬;CFxc@*S q1/w; Wdf9ĉpb}4YG}Hu|a@4M% `_U2Z.kӀޑ=|=o Tk>;5Jδ"g|6L2"Xuo ;T1ɯWgL$$ص.ќ~OEVV38V&0j9SJIjRF[Hu ;uu6erLݽ @!:;>d]D\&x3JG0k x/bNµ>ga+*'Ғ!>rY7 O_nS~}.iOT(a *w߁H{ΑwT^:.߅냓J#:Bv v *{ii .[8M\G(SР rҷh; ,>}7a:u ji_Eٞ/ *\\n2u}{lJF@9?W_8K& 3݉ad^N/ܐUpϜVGbBZ4iPٓ_< w& &Ν]rwɗ#GC^WҷORa\Mc NJa!s&X?,ڸٮ~Wr:ҲV6HGZ405 )I|w`ilsb*H۝ eQb{]Sk_9E: B>֘ <~F/MW%7#C|baw:W_NF3/;;dqΣ0R]JIJb$SٜݞnFjJƇߥ][B+9M8 ݙ9p_l7̮V_TNq # }9Fw "wc)sځ]T@ w;@Kv@kF t\ZBUj#DmK0$hSN ’ M3/u+J Rhc#BNLM.N#όKTmEU|4sD,JVcQ(ZD,7##|>w~W4 H!GZ>7`R&Oo8"B|2eƕl:+a]L H v"3MF IsvgR@x]w~R6|X9ߦhY %! 7BB֙ޮU" ;iXU'@ku}j宗=Tө t%3|l]TjC#jMM̕wi0L{_lZv 3thVA<vD M 1 Q21YE?x]9+NbX}[u_{S2'#J{#>;lx|x]*BJڻ}Є`!tJ_]=z+NO_w`B|z 3nRoގ!q]7;@T*MҖ,fp(ho5b@w?S@<uD]m rCwScVEw @QLA]@3Zb$Ûn݈|qg.9ׁn%h|ygعqmѓNi;J~HW䋻Sfs3fs >b>7$R?F(_."FHթYL"IF#s;NvT6j_L1zl(=o7.kSrEthe7ʛ<҅w{06 Q Jrm:DNCۧ#juLE#TvԆީk޵Jve:s}{/Bxj[si۱S/fDd4lg'!̝bA~ t=Ǫ[LHASBz:YՐӡ>>R?4E:3?Nv/J#}4*W0u>_UwQ0 /H.2v7u=$:tSM𼻹B[tH o*Ӓ1%)d ɱjz=d"JfunӪ7eAiN?;kH!ȱ;wSԏMtL¦ܨk/jGڻݏ$!lWtd ύ\8tJ̻%$`g%U*J|Ԝ{Jff&#Sδj5U]5];ߟ[R_D/(ʵ Dh,>dR)uU!I5y'g4&ۙi!V!@YQUA?W>-LȥJZ,YHg0R<:DI{ߛ/˫wʣV;*嗺T+S%Yw.[PpWFNR۰"bҦrխuܥH15}vf3.e;>!7F y-##ߒxf/ůi.$_Z~HJ"pp=ۮulQ;5j5z^u ]ϽtƮ{v#Mτ νmJAf=/9IuΆx'("]fYC^N:/dľcHLLoΓ}.wgNz95@f]t { pE|O5BW.(NQ@!fd^R1{~l\o̾@_<ɐ:Ujk i-٭+"I /TD F5tq"E4$W=HUf'} 8ɽ5AN#nc!HW zs^_I40rק{1wZuZ`e,dzpsPյ*]FZ/5p48M U`D"4%KGg(}=d[4 E! wèMh$fbEcKSpNhvŶ @u ?DW.L>/7-_3*5 ם/ "'ϟ/ghH"ܗn= &tVJrnfMJTZAtjRytCLh"*JLl(]~ڒ~q\kX3r)z^Wo:b;Ύ(aMV2L#u$PRpcRDȘ뇠y6k&~h; 3zӱg~ų >u#;F-Ƿmdn!L8B@9PpQ]tvI>ɳA#p˥B걘nJq@ѹ{)@^<: vKu@/w:jcigݞΨj'dɮōx[u4?$-SJך)!>@j`723ĺ>g; qqC~[EI#Go>,,Ӡ#^{Z9O*%Vpd${w~Dw'f9YCH+bN5Ktn &wR#&wDeu4@7T:+ɋOJbST:m1 Je`,]î%.MWTRV;` aqѿ3r%+ʧv4mJI:f(K7HvudoeUHIyu[Q] IDAT܀75Dj䧷^cnjPTX@vO&;w%eMEȄW=;ERBR7Yhqu wκ;8pXhڲɨ@nߵWj~/p/0(g(_,"J2d#.2!?.Jr.A|ѿKu^u=\t U$;]ĺ"hKjQs<tKLx\+-bZ7@.7Du % ]F&U逢8ϿhRx㢅 [ՄTr莔ɹVF]up¡}Pm}5=x T)D%e+z%㓓yw^B29.~$z3TgBym`"!])a}F!hXĽ @wտwqw9QRb1Gil[H/Jq^E _7^عH gPE3XaS@%KJҿ |\Efw@ZE A:ٴqn;d@= *I ڛN"`kߏZiǗS9to:^@ Dc9N|WQt&~.Ͱ Fݩ ;H=zyR~'4͌$ԙu g_R^Jps:.Nb"|RT56Fַ1dڻ&hs곞!UsyVŠ@I8"ZȀj]PE YGW/xϾT$FfIª8Π[w~!\bdBlcx˻! v>l# w 3w^K::{yI7Ī a]{A^Gd6[u H6~]D<Dj!\שSd0\f;djKiԱen)"'w3IzF.Իu'gH4W=*3,"V=$Jɳ}jAx4@5BsI>Pb87AΗ;NHCW4wvKr0Ulթ'$M2cnIplSgtDDVp%V D}%"+A/K@=7ywfv$vLJ 3V}2:hHB p M&|V)]НaH*耘OA0n*%P"],w/iU%뇚 @RA#}W '@W]5NOf|JN%!sQDtF8;߅?z n@A~5*0K:J5u*"pIILIRE#2])cRg Ty~$*Xv}v?xdt=&u7KבZ="KRZ HWCs{C}Y=~յ.Z lv/x33HŚHsWZ݉~]VfT];STA \۵vQW ۩zk&Rz!V&Hp&LZ:<]o*I 2mqß.n#(H4Χt&lh\bu$~.CPػ4h λud~|V@¥l~47!on24,/CΞQ׿45ԅD`U:r;yRESjWd.EZ'AF)YSvC}FdB' cxguRec@ *PKr{+O:NM%60 1umgmP:2y̆zC}rLA/'C< ׂv P֚vo-ArD:kuݽkݣ+]msjx,p$Ua>8][z'?Np^;#tS"z@]vyYC͙?}KH:C4u3k$秛aH/9P11J'#$Se5 ߱Ml; =? Fq:ϵLveJ\!݄_\\TS7V@~fC\w 5q^IUBt$orED.OFJ &NVW @s0p|' [M1X ;yo@zs@N O W#Bok#GԂH]<d\obLerRQ"E\q@s6 hʦ:OfJ ;vZieh@@xۗ*Пn;䦺#5{w86T|8u\񺚅.ATWzb u5ץdZVA"b@[@"Q%QvǎuZ!sxw S׺:CER&gOKŁU5DZM~)+|)D?FH" ]׿}Ȏ8(+^Z@Թ &.stp|82O2djRfw/-6XB )z}|3MA[̗F)XW)rW5\$.xO(yc'(gu<]zj[|{|β |4"T;B R ݍIdt0whU?!?$M3}ul*j:5I- %`L/i2HR?z UEpۖe:oȾĝI0jo!6;%]($Fnbz7U;L* ݎAƩRw.uPCY?9J~FQjlȜcwVi㗧|;&݋Ǻ;h ^ Ix!\/CªNJ4\w$FX ;ySM*p|IH  ,hWRL: `$љ$:>pCukW/JXkKPtNLbXbtꆷs|dεi1_W_E.B#~*tdgTL!JD2gwEjRܝ B;brӥf@ َh~^ yF#8U_!x>G[)ћu%;QFOWU^Ew6K 1J{z4 ZS ]hx<%UD해N3 0E"y/Qx*"%11I$CKg5}naʻcHo';]U i˛<([<ʐE1P.Rc pvhKS$# ܑ]e`@9`@\G*AS1 \qZLB({@VW;{Yb+?7"f&G=ec2ׯ4]dK#@=lEV?g:U]J!pN1p~LFPr8mM Ĉ>BLE">${_^wMnI x}9X @MJݺF?Q \AcoHh#AEF2'm|D^iwK*&\E+ߥ,s׵U25jA'%st昻sH1,J/IJ *"{*uS ┋Ǎjry*E Z+%? T( IMwD̀:xN}|HBedNDN j5:R`b@7`7}H׾H& {w^뒒Hl̄.:I+8Wm} ɡ]դ ԀhW)Vݤ΃D M@H-NF(|9׻Umrgu;BH3w@WnFX۠v#.\\bck,@R3͍`2ļKɑ"R*>+"PEw / (Dw]+ !YnSr]:mrr+\Siqfە(ȧl4/mC,QAUrQhtvLP tU2P'P]v&Y)9 Je`U }Ǘ !󺈖 }@5IhT^)G;KJnDV}B*/yh@D^S'"cB @H \iL{<$*`&oLNf$dIG.#1鳖X{rl$Z&,ХMcD]yp t7_wSTU }A*GwMnT32PoF1 3>f'ϵS Yru=5 Qro)5pU7|q\INnt}גpҊ!Bx^ o(0Wx}] @iŬIk>ع"iL#dpNM8 D;mKk{)VI&S-RuYrwn?$7:zD$#˙jܽTMPuCNYWS hT$95euR7p=MyD20yX"FZ STҿLT-Uw iWŽ1@ԙH,3d~!f[iOR @ $Yr$r*L w$@ eD(j ZthL "WUp]Tu>Sժ!-??QPp7i:0:HZ")K͒HOk1QyBFPAe>/6!Vt9.v?p͸צD/M__߿W:+`(sBb#W{$lMzE4cH72x%\J"N[:a~w8cBkW_@dyB c݈nd"6> gHhXJ`E p"wLQD5 %IstJ\?仧D7jLIHUJ OĤ7]7A2`t"$auMn?e3%tHFP~ 8_e n 8t';"G-|zlJUY+Hj^딝qڎD 6My dAv/\u*?_@$p:r "qsIU #3'0h @A6'Q1*iZ=rۮ IdnxOGV-hԐX(5^z;o#wRqJu#OWpc';iL9ɱ*i~'5 ?t(ipnz*J@WR-VH@ZyC*#@wEWGly+,v|UzY$Mow_K~PSK)ҧe~U+&Ev*wxCXA@u yi^wy|&#xwj,z+;?~x3 *Գ qvj#_\.qYWS[i||NetbAM%yw4=#!;FwJ` "g?LլIܭ-)XLKϑk_#"s^"َT_]?(;otp(A "Sށ2Ii%`ZJt_IDtajHtP7HD(H-"}YUN>v$r! ?Q"w-TKH~wu [TO;p&,Ԏw;X*+CfxNW-KhK${Z]/ӄ4%+/O.cR$IeT⥄#U*uMwwAx>2$tT: !¿PL]ߤn"wAUfU0(x\Տ^w)a"8I1qlx,aco &„|q6$H$v̽8@9q wFغ,KY%+d_A9Lj0UdSeQf :u$,8:g|hՒȡR7J'Qܛ'rZ$B&.wn䝌@'Ďd(H+杚A "D)"$@SνёF-HSp{gݾuNP9I:yt$>NrbeHC)>J(IQ`R0Iߗ|ݱu tyoZS%$j_3 ؝~rDeDN؁,@;Bb3~Н z84NE>U;we[\h6QuENF =SpY7:g'Jw)qSABA[E;;rwU# 7+;HtϑxI$$]qNZ6`H))Ymkeln^JčJuJhm|h^}(NN8Wfh߾6^@D ;jLb:;()Qzf(S4HS&i))~NmN _zP!I BAn]'/. @t)B9G:H*$OMOA#ͫ'#scT=a7-bxl ~&= @bDO"#xѢ4TBg["U`ѼS*7ċ wHV45]"rVdi"<7u]! _Qձ;#`_ "W: 3sa=׮\gx82@ݾK)D]49vrcH36(qIO^甉nJ஼;l#/$-O4H#vmTSaO_G.m'4^Em0#&Iϧ'hg *EM^\\DD;Eq".|}E^981I*U̝9!T G"wHmR2;i7䕚b%h )&t7;P&H.:w#ӊXY)!φu7L)\$*ߝ8><;9kb NN kJQt&O9s%Z|:"2сιHd&@ d= v9.#3WAF7; ܪ`U-**ql> HBU V3 +C'd?QU9j+yi/hx|FWW:(QBy NnEϝ"1L|Nȹ ^.N #U+i#KTYٴHC~^].UHbBՃT:x j4vU@6_E;R>{K~$u:r@FaZ]C}_p7|YQ!Ivmr4OVM亂}7iZL$w{Ow:1/ҲY]c0.@,   @@Z((Hפ}0JGxI$HڡKu۝bWReE;=iKs+)GwĀ8ȏ{5Ey}`%R@H ~?=dQEH DyFs*ezFgJ@l/$2<{统}b2'(2wcKߩT ҪFD$Vj;@[0iZgS$K&=WjmZ/p ]! 䓼ݜ؝4]$bN#<2ȇ{ʐD-7Sv"bNhB?R Ѧ r̩ .IT@G_O}P75i%ܽ@&IJbϫFWp3yd5t|+$f'N5NBġ˟HoS;8W|;ZPWtS/էd89uoTԻUq^@vQ\GP\'N5X$ȟPQ p}z!+2F V$Րޔ>7S,ϙTI\8-s:!ѽp:E0M9/T!!M| p5/itRu勾d"dz+Ռx}ڰ*R r2vGDtE%;TV]$0w:!Փ#վr:Fxug5`$#hzwAn)6ܱN@5+LK6bJy:XR)$VI'> fA ЁKP$-B&t#Pޝ&ۓNIƮK_5ʖ;oޘWt(($wjJl(aX9,a@׫z:0!+`sc;UWZmlѝ΁97iÄJ*e*J]ݓpD"ʘ0*N@ǓDt2~ߙH;+v/G.qI GT7pw3&=ɝjIaG* |0RX玕+R0IF䘻> ~];7zUϑ~!0w')֛{j<C;ݔ`Q߸~PE@~JEHZd˥ *p qzUwFQ5rzzn0Q:?NomEľ4F5n2N'-ZLJCBOO;sVS YٟP]>Juz't5*R@H=!@ӵ9i[a7oז6(_#sLIc *Hght9!XFdSdӎ$;K>vE"@ [v wqvyGߌ+-h 'ws_|I[:vL-!?WxF6 b4#7+&N-ԁ0Q́j7I=izd"'WCwvI[j{\wIGW]e;GC'œϖ/|?  K؍HߝbҤ .Xc5!/|B v6چN Oq@=n G28F#|yP wT⍐D# >Ģ8c2PѾ$# O'hYMD$xזQ̅)dJ־B@ K~ՐJ(:Ժ$u T *v*x[j;S8GHbdŸk)>pH{ ;NK:o`v O"cҿn@:b1P{գLzRL;@寊Sk_ :S]3U{MA\4LK+NRp7퀐*4"OFb3'$}ǂ)gIEe.ҺUcEM;.d8e>7=9 up3I@&Lfm۩U  T)#Nz@HY1ÓC nF\_@ê3(qRmLGɣYRRT(1 9U IX iDǑː ڪeEdsCnĶv`g.%!)X:LHAs~4t@ V`IŏkW esTmSlcҪ)#'.N D$N /y ht?w8%n3;v]/w 8`WPHC% ?Ċ82k5TS׻Tԓ2 |!bNn_oR@Q|!b)aR5<8iadl)k$qsntFQӾvySs^NO>gAbEG0:.ntć~ H*j.dZSV*z_Tw JqypS#'i DcC^3ܗx)LQ9 R@U27VwEs=n* 7ePA~R#D$S/da4 ROZwӢa>c2Z߾w[N.)KddXJaT?*U2uޥ|\ u*QTp5<@1ON _+BnB%DU_ʹ@$M=!JDWL+6 hb C!JD\ H h}ƔPuIF:o"U.~B@f?|a! ˫dIրܤ ?U yzcLVI \[DةrDZ_x]EG1;QK^kHDguN&\=%uH0uĝʖ6N&Mxṷ>> Z[$_@jU:$]2qVŞ$J@8^=Nj"+TpL ݁~uަ;$=K#dѮz r0%)!ߨ] ?%)d|/΀t^47sJhۜ A U=JbP`&iѐ%t|5ЭԦ*Kaד?tsn0w %]h zTޝ"+I}? ϫQJO;y:s뜠sv Yg5(R\pDH vaB/sS{ZK>ÿ.*]K @~<^mI9@O@r-j\ݘ⎬T_7Ȧn*5]g1WlNAhĿ2 ҁ)K`ӞtIG~O$=)'uɵk5>O BzD=N &]x[* tNN'sQ3J*W"0~lkgր&'Y>;a5NwviGwO9s3qmI&aL"[qIg"F2FP"d*eGBai *n]"yi#Fd2QBv/ d\cUmm_]nS(vԵ VˍSu`*AFkPt߂NSIjiLXsʏNe~%h^`d4N=sRq_)$+P3Qjd:FպC1Ȑn +wCv"tݻHFԂy(U):jP qZ y8@;P IDATxaqMK;Ё<ݾ݀qF_:LhrDܴ`;J!b~(G&0XH:0r5UD` ȧ: }v9UU2E1~E8޹ T"#Z'57pEH#gMolwGB !U_V*IR@adwQ'ҼwڍPEw*t*!)*vs+"GVg) gmqvI H~;Y6z ldT"v+R@"n7[kBWG"hab9 lcLEUAQYETBV/l{mmbj"uBp%Ju BH~o'[mjU@}Rq.~m{tKI@3Jl;Vw3)gOjȱ$d*)N9t! p6qovchPWm%C|Lr6 9ɹL(>e. _l*#s)iplDW]z FO#hbꤗ%X"G! |{g;9i6I ppӀ|AGPH/>{3=4 dvpEc7iEѵw7wAߥ-(Nt\Gdh9f*Gjғ %N}GMEM|;P4:0bI-FU] 3zHը>_CL:t3vHlg2M.wUB;s_ŃdXQQ%WVid=oj}휋S_U?o/sQ*r'`AFH;nDbEcw)/im&H9q}; }3D_^ʻi?^2<7:A,k]k*2]@) P%R U?OpkuCkTҺRة4(׆Y(i, H ߴ%-HRv3 I>i<$wڞ)4eiM5fxު)T %QtWAUK})0G|ݹ$2eG'um?U1@2|)#! 7:w?>uw\mkűwu%Z5ۯ΁P}<:~-گѽt{Ms$su5( t#v*Ty7aqбv\ u #*_EN @pqw4HN)Կg஝n# ,IU95nsp"@@V{hEXwjB:$9Nޮ߸UuvĊM&EiExfAw @d8VqRCFE!.&Q3:u;} t@tH&Q*R8+a32$BwΫs]d2z?ʗܵi{wPDT8pGTd HةN>qA*g)YW<J3u͡z7ѻSy\I( W:GR"hJ #*_5!"j4]BO-l@2-}*y U8/N Hj sFPSᱭf{pړ N*y:ٯOd#JHvZsWu!)19kc:>YwO?{/=9տwx٫N|Qm*^!@TBWn?4 SmC&w. 5)JUst/ԂO?H<: @N6C=S=v7@@xK7?#1b.t`MD܍i[X;5 ..ʥA{C*ʮ"I:7Q1MeCuMwU\" \"C^NrVvy/<>WCi`[AMsLPFNyZywaGdnjНep )(7#$>>Zw'u8 'R CF_eUO%T%hՍu n61Jt\'r},@bͥ=%OϑJo'KcS $(&1Usp!'( xTjiLFt:29QH$68).:'L !$i=jI# 5)$+ҞAd.6kKt<#+"pz>γz )j)FulX)- ˨?J$c|+ #&*G/9>D8kHvS}E-La.'t:Dg% lX R_OjHDRn4.%?wk]?@meԇt Q8_N(uv!]Lno|(~"G̅ w꘩S ӑnaGRKls&$`3,;j t] YI+Wr Oh%^е%&?ȑ @U Q+rIUUgꔢsqR_"QԀUۡIj hBU Y "uoQx[ځaH a3TxTEwBݑ!z4adH,Ur+x qMJ( ^ti`3RGeBRp"OqȢ}99I=P{&ka7=տ9~^m]sۮRӤMTc̓+q F"a *b&;ll?Q.>GfH$低.^ qxF>581F٠ H\f*'.gD R@O?p`궕 I^? Ҩ<94u@H/pD`7M{1M"u묓WJn(>P ɻK;f:T)i-MAy<$:2 J:\`-@6೹hfAR('(+gzJ᫡@.NdNَuoۮ"m"wW%,2b4D;(c: uR߾W1O*wV W) )OPy>yin*.SyJ8տ?b'זP_ s6\r#"3 A?gW~hۛsnBS{:q E"/ӂ:S T .wU{_b8#}i]U2ئv9uR ^z7䥛"'3  QI }MS$tG tmzBFȘC~etzRGob“Og6f U #H{ŢRVg ` F%SPB@vHPI>sOb\entQ.µw\mU$IH/yjϪDnþgc%Yyָvt8d 5 /k^ SYDĆRSw;A\:Pk<}"wӮa5t&jI27nai$}!>#%p7g'q-T sR?~Tf:o+}mIyڠrKRun; B@:͈bw&B J@{M|hC&"@Ϣ8O2x H `XB";N;`2qDHI;5$E6<>gj$a矒csYY XN?N~tD41vY:p!S~wCw8&tϑh;%X@j5L N: NYhu] &J ťLu]k]P'$aGH|#:ua7 *_})1 @dz QB³8KR@ Q1dRFz_O-lYn nONx`Gʠ&8뇑 dwd$ ASvI {~PdB:h-X * 2  軯=C~b J! 8#3 _"lI7xg=O CJ$AwNII"wC$#I:%Q~(ȟF$ձ (9TuVWwЙu^ oE UvHud%;drܑOsJS(^JU+ (gC}WWxձ?N\o s T or;f?n+GGLNZ:AtяwZ?Avd_gpBwzsH?u ;>UsROUbI i7L!8#%V3D4O@!EO=Rv";0y;:vZc L);3tvdz8/ i5na|)m9PO}R?&nVtHnlV7S @gp_־?;Q>w;.q'PhI'9ͧi&m CZ>-:m)*$||/e2rd; 1p$ U$3)mZlsɯS2:> V7$+Sw?u$soW铜=֫ou#fA)1q ?wq!gD ?d_i>O}\j@탟VQxAvApӔ%ID]Ww]Cz=W!=)mK&j}4T7`ρ rNt ܑn_:xu<:ଘ Pt;|)8$LHQ tHUjcg$?{ C`ޟ =β} $~s4ҿ)i <]g4 `v\xת7a$;`!Q#u!g!%@{C:6IDATK$ 90贀)6Bǟ +$';o\]D>È#N$?>B邗ޛ8?*bśN xsWqP5u HuA2E5"vJ0?m}gpoQV<7Ap]ud| \f߫(! u5Qy73( 4r^vଳ8[)O C'J1.J QQ`w|v+orr?jX Kܠ謳8]/2P]]YZ(T۾ ѩ{v%FA(\/G{t40! ]AJp;guYG$ I}m.p'Kps@MO8 ^ŅguYgr2ATd(+xAtA!t t*=*.ʋ.ɇguYgA0u@ޗ;$Ɓn_6@_{,M&jpu!gR Da|wSv"]D2<vZi@ʦJgYu֏$ĜN#z m]@O{wF?/svYgpY)U$OZrAz8_] )9:b8}?ٍ\C0.z-.]R@]EjԊvdYgଳ@u2"&Ai{1ZEݳW;]$m;O"u@C:/%>@kDjd©$Q~ԓuYg@8N[-9f?4wEi;uYg2h F;! L <YuVD1|U:}.guYg!rpB?8묳8묳:묳~uYgu!guYgu!guYgu!guYgu!guYgu!guYgu!guYgu!guYgu֏Y ?HZ,\IENDB`teeworlds-0.6.2+dfsg/data/browse_icons.png0000644000175000017500000000154012140200333017545 0ustar felixfelixPNG  IHDR "p%'IDATx[ |\•@ )^ )!%PBJp WJH 0c@?3+H+NZrZ-[#fz{7=@nݓԳ)B g&'`kE4kEO*hZb- |fr>zIAgWܵZR(&]A1G=%(_|I _8Ka>0^^RW$E9C^]d#A/a BRP1cl&k~_ 8 klirK֨dܑHnir^-'L~/rԿb @@ewLN2'~1$qa!+W?H>e[8̕:(\e\HƎĺ$wP3WpqX%!3 -ZQhp{2n5 ("5a4j =ScƎf=(:"ڳ@xAy|RH +`IO8Q =0 $G5:HV 9⋨޲6`GӷPM ;jzn$ئwO9i6e3$jf!4Ǽ%X.le個C ZW2_N- ޠZp~G9̩Y 5oz[hܙ ;sﰼCS!ѕh 7LnF^ ۋV;rFs}]jVݽ' ?ǐػ?G7䚳uG.uJ ~_IENDB`teeworlds-0.6.2+dfsg/data/console.png0000644000175000017500000000244212140200333016515 0ustar felixfelixPNG  IHDR@sRGBIDATx][0K`EDl-6&k:7vf}p/f꺆x rAY,( eSIm.@Ao?HTᆖ0 m,BR0 BEeYBUUp\ ˲^-g6J) CJ)PJ=MSH݊G#;~˲`Xto1` ˥_ Lu]gf$Ix˲Юw1.XGvARD9v;tWX,@VYGmp:}tmI8PJ~ e8iRB@Ǩ׻̨h p}Pai8[Ͼ+MSHUǑK 1sa8oԳ4M-4 Cb r/Qʲ$}26YsYhB &2)Y4SEd@c1ނS)ɢ p5jh q1aʢ p&̱ʂ$C |tN6x|eAm|!S1(%a1X׽%I"|w{?"c7E!|wOYJp86koM3mw,u>BTxxSOXv-Au]~|~a/ Ҷm*G 4Kx,K|JeU1i1oCB#4>e7M)k3V=Z&8r\}\r0 [`ijC#s#H1*h,C'(!_0ȩs@%Y44 .@[m:? j:IENDB`teeworlds-0.6.2+dfsg/data/console_bar.png0000644000175000017500000001062412140200333017342 0ustar felixfelixPNG  IHDR@]sRGBbKGD pHYs  tIME9qIDATxsWY%˒N&i&@>hдwKi chy(3P)Ҕ44iP˱-={w%?++ws={d, OAdž;ѻ| E^>sjx?h:|~ f6{{àQ^IO]Jm'^i]eϻ~Eqcޟ fLH~N Ijg&̰3:~xL Wzb7Sk{>>X/(Ie H6"bg_}xp@le|@[ A-h&5Qr  \< $\'Wf3yV kƂ+8aO7qQf%n9e6je 7*V7L(u P&"YhYzݕ< =#a1 @!IM%dFw5yH1r'`|O!C#tyrhw|Yh˚+OceY1ٱ6!yB >I (]\|ݡN*/MCj!,NA!' JJC/6a)IR\R,@ Wy~(J,i`x'5[Ãurs=Qw\Sb8O .|]ŸNP\pV~NjOˌHϺU^؞#8.:/^wRW E}0WCjOֿSs>GWc|cU?Ďi14b(xxq+cdJ!˺rڸ7W>nbeG_$dsur| l [}]?G-W3~R$0oQu*C(2@G ]^b ΡnF]  \s7,uo[hYW^+a(I^Cy=GEU5Awd :ʫ o˞5y=1f~BҨK^F]k!=3FD?c.RTdL ` #ss:\``)\{K}GVvE]ٰo˞E)'ڎ  !y1arH#UӷĒ;T\f;{^?=}!XF_1Ç&]ʲT1o-^++g_8rH690kaZޛJ;|blKTy*Ç; a,n*%U-vvk^Rg^*@DD(Ѡt _c=Cd˥<'\ b6l"GNXh!t w즉KR8NLRcُ;Z}gr}/q$֛3i'Y~6upO\TbG$ ڎ/FG=<~,]{~P"rpN4͵u9?wdo paF4?y~dB~+ա+'Fu0=w`QW7_ ;OO~?_o Z_ `r;tyi]ĿަcĿc̞uϔR8P85U{evͽyqbAƿjk&]yteo"U~uzKFt`_>HW7-J0/2-(xvo Z_ [w\2st;7c7k"e?WPc7-ͳc'/>Lueo2*Do9-<6ο J/eu yQW7x%s#v}~ ˮnUܶNNWz$WՕ eWWә~tfo{Y LVtOM/?4X֕ eU߹zj˽O0L^_rZߞ*ڲEۿ+++,Җ~Pt\)::3gTlvRw_?7 ~ro /xb!ӧ/-m^oփ7j~EK3_?]|+~ {yύV@W> u)vWOVӺߌs휣3bළ mӹ @sۂw$$PXwj\:q<|tn"5;؎M?& 1|_37o͕Wa!v!}UbY :FC}NBDw7mXK+G;&c|bDzv^mXK5.(m'su}2؄ۧkUϻR[IL-b[v_PȾl7d x@i2 (@R~\E }.y@J#,z 4//}FK B,l'y PqE6j<4dz^Mۇ97dKrgy,ҕxC.D_-hnlyQ*zHjJ1رVjxczB$4-~DHUؾyޞ&|V8#*pBa_ьХZĖy{?K+AI@ Bv kfoKzRPq^I扢B0#:&Bֱ rb}[G }b G:V+pҚa 69oI b9&'-$-n$qN~[amZwu8z2M~߿O~mpn8WَurW7R3 H"!vk%C. ~Tv;1j7ϟ%-bH*d~YS}G<#"5 :` gLlA&hPu=?C7!_k$/oqfK.VIENDB`teeworlds-0.6.2+dfsg/data/countryflags/0000755000175000017500000000000012140200333017063 5ustar felixfelixteeworlds-0.6.2+dfsg/data/countryflags/AD.png0000644000175000017500000000526512140200333020065 0ustar felixfelixPNG  IHDR@ |IDATxwTW1jX9<s<D DTD "^QRT>^)\5H%qM6nLT: 07}7Q@t=CC mHʵ'9?ϟ9sH@ ]]]| iCo&И>o\tk=*^XԨLsPiBsdd)(@D|@TҒ|@%~@=U8ls XɟP0dߟ-!(~Ns : z;+֨k${|lxZ0z7X,.f# "2u$ v&Ex9v4d ZYD8(iHሻ0J`@-GMLhQRH87\$q QmpI; $9c%L7 dy`Y!y!67GA1EN`|Z C覍{@ҙ?Nڲrh\3ō;Р3 WT:~qm*nP­*m0jR:d`^keJrmOt8l.[\X?'nz%rm #?7VP@n|I_ ?[!5pNi~rM򻸸m4B4X CH BMLr5TE}[OĹ1-1q>3$vlH‡"4;>%Qdb׋[#[N*hZ.ďШ7 Q|כMOn?b"=s]y_'Uۉ%SH';=đ#6apà FpY0]g=ZT|N%ځM+rֈw`-@.ESg+㗺Fܯq$V#s(tD4d[WJvsPeM#dK ZsɃtus3Pis(:b|8k*hNu6ag`HyZ'Hq&z o N@lSp˅ݱ$aQ+q"RESv*%-7P!D~'(y dmc(UE|ԛyޛ! <쨇#q|UL؄&uT9>H!޻b @P@g= H<-$3*!kdG7~!e lG!w&' /lqHY< ;t|Ads@9_-gUCoF$۱!i]7@6}PWsDF@ WkI$_'qВ-ⵈ%{ ^ # "ɶ&4h l#X"${Z ӆ݋' B^Y Y)=Xr]aniaK!ΟW$ Y\ijaOR ).BY2]OOwÜ'0l0Vr ~ne"0!Jw}*f|?@^#L~GU5I7"` ɖo&B@H.hb"]# PWZ@}+tep] dR}s=@3Ǽ"ʜ|t(@O 4Bq;9Wz =z0@ۥU2RK Ƃ 6!x9kii͛?@8IENDB`teeworlds-0.6.2+dfsg/data/countryflags/AE.png0000644000175000017500000000146012140200333020057 0ustar felixfelixPNG  IHDR@IDATxKoagYWҒr߸01qkCa1h6rk"hх w( vZItaY ixoA+^bA|>Z__g4 E5F3:6LFhr~G#Qld2:kw\$| - SH>˓?#I#i<5eg| G`_~ g@ `?t")F/vM|{$m2 (6V˴| CJR@jRɒ|u"t(#mJ$gl>jg0PP8|`aJT#LۥsF›ͦ.m]0gٍFC?l6mcKb\.ux.kYh\c{b# V2zmm'UΫyBI/>~?ki;#2TUE"a B`l^XeBr8qs9yQ:tc1yQ6ώUz|H Fx|IfL>Gxg  @ | ${@>8VO̮zX0@<Wٲx *@ogaIENDB`teeworlds-0.6.2+dfsg/data/countryflags/AF.png0000644000175000017500000000510712140200333020062 0ustar felixfelixPNG  IHDR@ IDATx T)fkk.xMQ*M\QC!%(Xh]S( 3l]ܲBRpqttlI33D\}QGThn?IT*\|+++CMPHɾCQ~[iӮ_0:a__0*QR6 @1Kc&/*/_0&c@`v߸1 @n׮LHC4u߾ANNvrdZ ஻PP:ig);3gBBZZ(CawM~IE=FRɉ*ww.ZDyTS!p}ZW;0l Bj܆("Zou ?9]+W2EWӁrO W/y&͜WqqÉly/@nnܩX?"h&n2nhml(y /^F3~0U;Nl[6P~3rN8^8e8_#soy<.*8MFm޿ɔoqA룤,] Vm }(tJy ԿnM"gdKw!\By.u[ȾOO.Phi=ed%e)_D#]D ׏@G<&۽3XԤU|Ae~/_I{Mi0'>y)581hA/4@i5/Z{~*bδ.<1..&)c5arPlU;=XOJM=oЦW?MZGKXPrwj 'm'Ä h=pr}P["%ևr GʝBĆMj=^UTϓŏ_|Aν(;i)z]A {4׳;!Ҷ/|^M/WJ ]|oևEť7  -NM5o]kX ${(q4'_LB:fqnoA&fϙ$/wQt[޳]W97@~S_Ç9Қ~+l|SF؆]Լ^%q^©W¡HuEs4<ߟ31&Fݞe|/M->5lncZHKWɝNdt>΍Szh/*=Y<eEIn=r;3Dm>ʓBw~:R>o})])z  mT|vh,( TJy_J#DfMdYQ=I~r0ژ$0t!%P ɞjA8$'˟ޅ]. RDJ{f N)1Cr}CZҼ&}3;%/*dw%d{4Aj8! 8{]I${ /ِ‰V/4'i:M䬔9/xTBrsbmyA$~J^Lrt<#@e0$} 9JkLh-X@;cnBH[DJ=Җ05ĩɵ ޤ|,ѥz4;s{ߩ|I } G_3ML84GpϋM~@GpsgыJ`GRSZ6 $J9{A^&&$C9G]ڴdMZLC]8@k#tPtޭYJ붊%yTjtrR wy{ %ޡvIkW?Ryk!G'k߼H*~賲(ضAIAX &T3I&m+'vp_&~hJMYACi~ "Qc;pߎABNkny^jRmmIt2#n)!LJ 77yG`Hs'u@@@@@@@!6it ؈TkkkQ?(aS IENDB`teeworlds-0.6.2+dfsg/data/countryflags/AG.png0000644000175000017500000000416112140200333020062 0ustar felixfelixPNG  IHDR@8IDATx]kPTU,+v07icT3* "ʑ&|ԤfNL5jiNE KmL/~SM5Mw]g{s=w9"⬱pBg@AAA9 1E},XrssQ  ϙ3X[ϝ;Do GFa̋$Wu$K}KtN"MP0b WG&|HA>P4{ 2uvQ״'/ e^8{N $ jZ2ZQ n z{60}_Ę /WC>՚?mϸ4a`5AmLuj֊~P#4qf$[j3/zcע3l1&6HIiv},{H(VU4l Ui>8zi~`Q6F,`JrDj(GE1]`ClO^Q?:A P S]le%zxuv!.m*z`4 Q WlQpN3&Qvj0] 9"W)N WS2BdI}KMWO$`> >]y]|bDŽn~6p|Y ؕ=.sio484jeQCe5L*!&{q#7|藽 1r^rަ4%L I rγɩ_13(xksr@.9WOmfN@#}ix`1'U v|8+V)kd: ČMy`?7|I(: Ċ;^ޝ)_ޟsbbkփ+Z;*yݩm݀@_l=^\imĽ*mj nXP36hX8WgWRMY>s.lSAˍFBVW dx ;Er/X3H(Ljf@%T/}ISrB~@X`۳A͚| }w_to-`5@'^hl&ke/g a uhmaX.{y_KCnL>ke/GsW׹,eM"$7h/s|aM"EfǵÚh >wq1c 풏kp-ke/Gq9Y]9\Ú`Y нc=9Zxԓ+vMgF6_쑝8)~$ =F?\4cKQ/y440 Ǭ㑝poQ/UC6hi7A΀tNS7IENDB`teeworlds-0.6.2+dfsg/data/countryflags/AI.png0000644000175000017500000000476012140200333020071 0ustar felixfelixPNG  IHDR@ IDATx{lS#iUn#i[Ku ,JCS I`іkxv+e ZeRB$Y 8#1]`'vk+%ss ̙)<5k篼yC k٘>}:4D$*_ 9eYiFL{ =緒ӷe#dw=0:ʟm]0 E'jG3fH aȇкيko+v4nYN8:D[a74@'dx. [vKj |L~_Gq\(sOS\S Hc#~\}Rå /wᔿp͎-G9CeFsE'q&86:Nް귲?j&z*.5(6IOR^yU㯄WZY' NEiBwe UrNl(}Яw:z Oۓ볝˵bwOanwЀ46S6?"49m=^С1{ ŊYs)]`^(1'ZE^OψLOƊш٫f5uy0e\.vw?/x.StuA6&ky6rp@RB;U_bJ]|#Hmj bJcy9덊 A 2NoC.?/Oxs _oO,1}"b <B G[?qBuhsZ6=p֓h rrqDN2\/70尻Toei$tUo`LGR>gaz$Rƶx~0',7`0 os{La|F%8: pٮVu L6GGRF+Lf2#{#ExnP &#/b?,_ɷ~k?{WLN[ỲW="'^G2'yěizeU #ç\E,&'/֡P> 2ȐuHV1L5z`-m/iٸ0=Wdގ`fKYNRƘ@udcONq[7?ڇypNK{eVW\.< ]8E~~8xSF5gK4 -Zz0yPжiX,t:DqÝ7iܑÝ9ĝI3m<Z=M}дr-Iţ@"MK+pգS%aӉvT')̧ެ)`;gвQg,:-"KO? 4"EJ|,LoWqab_@?|ީYUJ%vҎ^ή:;W$%?ShA-tBW`4a0 ?K(z _mx /ISMc i=E> TlK y6u`52wؖFm6况y!Am  ˯1lAϺlC Quoiܓq}:L߱SG}5Wp"!๬lJ͗4ug9<7}jҷ=^~c<'T bE r%@q~GG('u, aAWWv%@ bKR5Qq%@dq%@ L-JJg PF%@oO[vCUTU>O6+y<ds).ޭkUޓz6Kz)U7,S cqU|nV+TmD2u< mABg[F6}/'*usgęՆjĥJ@Kh%C:PFy 2ئ } ] ~K.t"쒙q2Q^ȈsAZ"DnK: 2Ȣ6I;@_~'3o `8G0tCh|X~,MDqҝ#5ce]OB')\=>!^.ϐ|]ߦZ Uu5!GEz"9Gц Շ l!mp>d.JUsce:-^Ɛ;o6b7I3tMKX+o ` U~oyz289 ^9-lRGKX+o IX-(&s2DeƓЁ 6>C'-lb@ `к;$JSGBDsi*#cv ѦX2@"6}.߮%@<},ט| pn@76M_l~{y3^,v#P@76MlY7=':v Yu#_\vzYr~eHfP@&ئ=%G[(QZbII22vnl`k{xD.Nbo G\'p(VnS@?ظҼ!ϡ7d0R"/^dNfL2n2hv}-lb>uA>Y%wX?_U\X~}8'FN{9Y8IR t&Mpط=dh!2r}PcNZ:э laSeHt`؛j(?~!wOL=# !7㧌nl<7Dd|Kph͜,ɏV?+=剑=} 2Ȣ]D76MlC&/8=-펄xK,`K#Zgַ49שNX\=d mh @:M/'lZL_c$1k;9Cԍ%hMGGF t})bkmeZ(vrKQ۹5.~o$rqVm2sNHJ1uh @:GϽ S|K ߧZFOVfvrYT]Gm"dEnl k P`\ɴ;&!s6tvՌuswT(S3,Ȣëv6}"2ߓW۪>9!-V2JUKsbӼVב0 dѱӝ6M` ]Fv$iK/xSʠ%V&C9gÆib :WlS tM%@ u>-rۦ8wU7Gp(<)ts{-lb>~,BcY~ 6bK4$t8g/˿R,s",:uص laS=r-)C0bM(V'\6FhC[dӉ-lb8mmF lpW/ή5 ua,Fw_& ܒ$p?<L]P"9P`C&(OSKX^Oe/Z0{w\zN, f #Y)r[8EHv/]+R$MbŬ"%syE000zzzԢW/m?K ?lq4IENDB`teeworlds-0.6.2+dfsg/data/countryflags/AM.png0000644000175000017500000000134412140200333020070 0ustar felixfelixPNG  IHDR@IDATxkSAt$uD\_"n]TT|!(XtmRc7VmRA8H(1ss~&,|ν"25,j̤5lC?DT,I $ 3iA~ZR?|k`@O<Љ/@wn@G -!m>P-#E2ݿ (Z^#G:p?R 6_T6`LAJ̾T 0j*@ynDzu2 r7>utg#~z~K>=]@xćRK.e߳[Vzo崝YqCs:w9)^ |A.]`Sl4>ox_{sqx:u'߲`+f֦ cm|JpН®WuUm #|R%$IT.1H uUoIENDB`teeworlds-0.6.2+dfsg/data/countryflags/AO.png0000644000175000017500000000331312140200333020070 0ustar felixfelixPNG  IHDR@IDATxklSes-]n֭EFT6w& $ *e\""2 bD.Q& "8nc" Wn}u$iY{/i2|)-- @CQQASA )..\ v?'' ) Р! PvhQrGH wՏΫ=:@`ba}G,pnv:|<Wf=\D^vX(O>Nu4Ik ̈GڏȅE&\4B >~/:pfr\JS Tu](77mE)#hJ (O8,V Qݏx7rCB`OE~\{ VgI8?/J8; 'dSt7-t#p; tDN{Z3@W(i_Ps Jd$y//_2\)[4}C3)LRda`bش_6&?W0X~4c0*wD\%56-8 \zO6\b;5%ـ4Y|hDGB eqt5Y Py@J"WPbDg)g1i;ݹ@@ pP@8(AN @())BmKl@_PP>*d&~IENDB`teeworlds-0.6.2+dfsg/data/countryflags/AR.png0000644000175000017500000000275712140200333020106 0ustar felixfelixPNG  IHDR@IDATxOTg &ioIomҋ&@YI/\pA m[ZVvP$Reg@azޏP 2f8&O`{}aBHll"Wz,@i&!h^/ #B|;?|al> N֟Y?.> !: XI]t?Jg$"> +{Y5g$`EW? s 8K~@̿HFK&@_73ˤAYZ[>{&rݰZ>Fzۋ7 ܭؔ/ ibbY 3Vq *`^[-iWÓ> Z9t.Ɉ~+lWaO7pT;PZbH+ծe,Ƨ|:tph.ᐮsW>3[q,z. jSԤ%žCi¹A,$j@pJ,ʢmnS:,x4TlB3:xsP[@mڅhJXnMOOcpppEXz>`GҠGT' !XˉH1((n )qۺ,*m4euGQc@saeCɾa4 ;@P>ZUz< YSx^tww/xmZYq=+ µL؂(6WEu.4^<(aʋk* Ur|:iuE9 -LFq/ *? P6Q豁xI]4_{MJbśh#*HŃbt,"533ksMh| m՗e9XMSe)jm] ЁjF\EyS/:A+?^(IKO/yhgL?4lϻH!@َ`EPߏ˨ V4.L }_bS8Rv4)}H_~b `Cc$`G9'txXe{۟{r |x,Fc #JYx[Y|wO͛7#::z6eKp@GEEqZ@׫:8 pIENDB`teeworlds-0.6.2+dfsg/data/countryflags/AS.png0000644000175000017500000000764512140200333020110 0ustar felixfelixPNG  IHDR@lIDATxTg CO[CEDd)EDǏ*"NĂ"16(", PTTTD'uQV{%Ȕ\DŽN>",8::60vvvV}MZcooQFX1@ʊ/-n˝Lu1z tTғk a8҇.=#!Ś}ZPBQ^E1@GB52Js_Wp\ݗ891@{G=2`Fjm2nįgq cv" eS4AfWMX^B?+g ЎPaς6)ED G8pQ~w2h/Gj&!H$ME6CطxÝZEXϟ?&>c6Hw)WLFJG>¹q.Y !>\XʌZES%9~|z!'9̰Ɛ(3)ĚH* 'k uq$cB=ֲch8Skge,8Y%[&C0o)CXX_,zJp!)7PFP\cs7[2ɂ)tcY{|4J,}P((ɺ\t!ҔM^:J\ND&lD_3H#PZfRa˗.1h R3$g%J(u8<}ѢW]V5ד]M(UNWJRT$&5Sp^hq+Vϓ:ڽ f\&b#@d 5?y3 mG,J/\.--Eff&D"ݻ;)эdBuq'R<=֨4Ǐ!۪<KubGV7a+u\'$SH P/@vVAĎm9\ˌǗ ÐQeRtx{JٸQn'4O>c {6dhl:83+i˗Kwg"=&ӽKW<ə[ $'mCW==j*`ǎ ::6E4R31N(JLq#HqVِEvjh+((ح5T ȱK3b /`<̙3ؿ o߾U>r *KLqvp;"{6eN Bqqqȅ- ]׿IH̯Q KP^^N_B!]eڼzr\"9՝MpmB{h<g҂E*Baa!JJJ*Y$ JZ3k-遐A“L`9U a‚tܸ8z(WIӧX;e-T pț ?(f}nC}ZH @3\)W*cܺuh/xQj/&uߐʯV"={F^SX9X~[B +a}I%#ܻwoߦs @#~G2?|~.͛T?GRpb/Ə9sE;}*xh0SKi~*H±ܜa /Ђ/;n$Ur-I a Cyw3Av\,Е۲H k0hj+%:-xm)?%lʓޚ0}?16 /W\ NƮU՞6\ya4E.(.*jkhțAY*:Rz!gB%$պCo]2 Qؾۂ4~ݑa(vR:D:#G@'x+q5Ql<5utxTI]tֵ'd$(|L@.8u};9tR}:Nj"SY%LxkU)JikTxDa ܇jLkp031@}į'R(gD3$vprW69{cp&VB?Ez*= A9%B՛~쯊(OA}=# イЙ5  [qmTC ]$PbfP}v8҉3Hl]1^>Sp}qz"Bf q$oۈ ]?LJDvu>9qNHھ-_43,~M`%c o=K0aP{A&8~(c#'Bj Wv!7/!} m!D0N_@u5Y('\ ˸M!}9V4\YY)v~<YP #<}z@ll }j*lgHCKR8G(.Ł`]_jM.ȋL/r͟E%b \})Ȱ'@󹆈R# q)io佄m[' cq4SZ7k2rl1k0e fH593(!齤2C?\) #{lƣ\'zT48c0IN!낂K!;>aO[B3c;RH3N p1d\[]Ц*5WAB)dq8Jo6'HM*b੫:~f|\:ߙ кKӅK#4BI!t&Plg `ՕB6>(= `.Hk"GHs,#FR=H Q-l GuY0DsCYW C<󟌙춎k2pl1SuO̮o l m=ɛ od׷tЋg93|ط0fVӦ -K0Ɔ#!ښ2$аKIENDB`teeworlds-0.6.2+dfsg/data/countryflags/AT.png0000644000175000017500000000143612140200333020101 0ustar felixfelixPNG  IHDR@IDATxnQy)KOopxDhL|j[C8O"%kR A^J ofv7"N@8$ cMYo&p>d01 PMӌC1ND~j@?g] iν TOCyy@kQ@W+W@z H7uKCvt?7scCũ~0&|I+zJ%d2p84>P  !B,xLlHhD\n!˫<pqsuCn)$|L&h4n5! FVu!r*oR.6X,pH ?VT ժZf<m6j k~ÿÎ.j:R5M@.n>v ? h/l6;ؽ)y6U `v7y)qvl}ozK.>^:b{xۉ|8 s}_? s_<|8R:J c—+Ѐ2+ <M|Vd _<pX(]/J&JQ<_צ^! hfFޥ< +5IENDB`teeworlds-0.6.2+dfsg/data/countryflags/AU.png0000644000175000017500000000465012140200333020103 0ustar felixfelixPNG  IHDR@ oIDATx] lTU.KRѨ#QJBP@ (Ě`TH|n)vRPjR(am&4nnn[Ж3<~\>fw'2̝9?;=ϟa7_!1w\̜9l%?c "WX8zuK2}˕MKعۊJKjY7\x8PP!sW2hyіj盌iiȑrрۭ!Buu;|pu!JJsWUidCAe%@NNL*7}5@Wt+VTcذ- z7>oJ?{DwȐ`G'O+s3[d&o <׺?./A\X'* nh8%iSAp @lFa\lf0`2N#zY#M v~~w( =T]-P|KG?, ;MڥnDs722%{iYc`wf XiMC;Tb1 >^69dkٳ'mx@s|"K ?3zz6;: [^wTT˦Ǎ4$8z%?唼pig<9ih(MQvCEħqi'$?Z '&bM  ;Go~{tX+f٭75t/}@ K'F/_·6 *G?=Z61'%QHTTaW盛jgYz:~,q&@KY\X^0ǡCge;62tC  2?ᦛ֡@m$;2ԑѣY,L0H. 9T29:&H77o+IdDDѨH`x-AJ.@]g %0\CeṀ@ڛo(EEE5ҟ.Pz ;`8 ݝϤҥ?6 *pBe:TltP꺦#u8.N(Q+fw#gx I_cɒhB?;^x+~SIMy4瑍SMZj5яE_4F}"frY\Z o?䳼}`~obѬ~G TݪQ<ոTԂB{=TT+dSzU%;4|-rӦױcSMM{ c )xEg}n} ǎ]Tf\b y.$oi9F $MQ}iĉhj:_ux޹c;wn…ֽXZ6m $,?:3ȑxzl?eJC;kiޡP:5qR tx<⬟U!* $pujK&buؖ=V,'O8_ h&N4t"=|Z|]#PWwWWTon]p]FHp2+""VX_?e^J I.; ~TGU7U`Z< ]^\,c+#+=Ƚts$|emENzt3WT ̽ȢtWBW̙g:h IoL)'BHs—ZWxHϠR쪾 +s/(dn_u.Cu~|r,G> jjWހ!wy#Jy!08>tc1k6x?<Vpsd,4 %Fw ޓ-ù?c \ +喐gЫ_*)p^MN?8G[wVߊdIqØK+@ ݗٞgN V`x}.‹x{2`wm`X*z^^qw΋܋/GOqW~5~ /fJ ٝ~._S^! ޯ:NF= & ˗O0#oMhFV驈W> 1yטw OષnJ$$e]v{@M-F荐QcOrs쬒&XRTi9B;%'8ܧ𽸊1T,y: ?ǚyGOD#tp]̂!W4HW䔵;`)ZzaOUC[p|N^Wjat[L{=yw>a E_Oo[ ?8x1{ECX^Tmך%Vo:ýǫ2WSZT =7o?1{-J 5]+ oߑrp|K>'6~ѺYR {AeC"y.PDp PRW_B(&:MS>M.m] xik*Vn RRR)[ONNUl6 DK*ŘikIENDB`teeworlds-0.6.2+dfsg/data/countryflags/AX.png0000644000175000017500000000173112140200333020103 0ustar felixfelixPNG  IHDR@IDATxOHQw\q:DVֹúl!݄$ Tx*ՒBA.-3-)5gGAEѡ{ɮάg *~ȈO0L&'~_YQ׆/\Y HMӢ{<f5Y_Yz]E kl1g$5/cT%;J~ke@E@E0( t.|P >|P >O*1i ;Ef? dO<@f~ 5hn],Ie9=D9|t+7y,Ŷp,]F׬$wP||$ye)Wb󡱘c[f羫z ΰk#H|phrOxp`& 7)q^m׆OGLdT832x<]hr7=Sz7=y.rM/x^r+u>;<憉cm:5m uMvmdm*o^66,;E-2"m*E dPՕp@fǵL`A_@fՋ_@V5~dR20y>@>g")]@V*`, @tև3>`{z9]kS$Q|ee%iɄ***PCnNǎ%IENDB`teeworlds-0.6.2+dfsg/data/countryflags/AZ.png0000644000175000017500000000241012140200333020100 0ustar felixfelixPNG  IHDR@IDATx_L[UǏ̸M|0sPJM L5ٌ$>Ìdh3qͨ sqӘctRtتU\㺰:97p mmw=&44;݈b `2L+3e=$@4 `f~jji% kHOO Rl!@J>LHcJ$>OnZ$l='n wҲ'daʹ`_޷Os~QI3˹n{lD ۖX5gIwi߆p` /?N[;[  Va{^ \ƥuo,Qs$VWs؄6~B}'q1e{Soy?8R _ pB sɺ ЀGFUkoAyŘ,[v$5{~v>;W{]ߪM=GG> N&kn;aZaq\9PΨwD> jRikƍ k_Z'40F?Mg5M*@`WIݍ~[rb_b OD.m|֟ GDH^O'" Z@qN&P3zcz 8;N#`ppm4N @˂dQxR Y~a7W4n#O)Vo^&bXrgGw;WۗżYpI [Pjhk;TETVgvd9ǢhZ]ĺ80-)۟Vn%&Gj x!>T>uY:^1T%꾼PݗX PWu,}@n$Zj.[>i|#>:'f|Zz ++k6%bK| ̤ ldddPTTfmw$2IENDB`teeworlds-0.6.2+dfsg/data/countryflags/BA.png0000644000175000017500000000417712140200333020064 0ustar felixfelixPNG  IHDR@FIDATx PGנ9L❨hRF *M4^Gb. /P@QrDPQD'D/z첰;;Sͳע#JkA kРAR* DAwrrB) (swo.rק} |ޑ5җs **^Cѭ8dAXͷ<~X g.܃vvq)tw:EVT m (,lNM7;pƚ:Ә8mdk@X H5[>Bz0h3т5Y[]7K% k)^]Jj|IѴ)r[c/UBہN}j Y9z Z_$g"߼|}U^vĉih>Dr`+ f9y{ 8 Kn%\3_ rhkoV$Y&/ FraP2/]yL ),*!c eiPeC/kP8_I 9$VeNe F_M瘏@`XWA`O)׈^\Na @/{2nOl<ˉi~Yz"W_4W!TGhr<NmfU/[PoWVO/&M&xzhiF6TW%DƝyLnp8Y 4 mBde9f&f݆}Ϳ! Qrpʞ☿<,Bs_ ("~&MűAER6'"E"^va]CP|Tm>H']' 3>ldo󶅺$| e(8n-O'ck (*ǡaOrל'*OAX@D,ccs9|`;Ԃ xW7 \k^R5Bꋓ zŻW5u~ d{V B*$Em:u 5`r/SMZr>6 z+ϰpr{{;w`8r ŢB@ЗY/&K&D¹am)@aaA׊f>j7yƶH gʂ%D(B2Qg2N6  "%ޱ_Jf{bR6&7@O=KƎ?M-Uu:qOCWij9c\W '[lRCk*Q8#{7 [P3 ׹lEŤ =~iJ@PƝ $2S﷚!㾟vƥ}u!7^y jl+L|+FM"(ߵ ":mQ |ߡ-y~@{ Zv J O,髎Gɳ| uT39 ȩQ8vX@s6IKUyvܷGCVlq{.mJ! 3&gCO*{ SgxۂOᲮ컒7ZNMV ,$ijC mk [\s|$CGOל'!&GPl6J LfO98'ȁ.nIN ڔJ\hRã:WWWjmk,IENDB`teeworlds-0.6.2+dfsg/data/countryflags/BB.png0000644000175000017500000000251212140200333020054 0ustar felixfelixPNG  IHDR@IDATxKhw!> hDT b$zQ{ԋV+>W襠PJB-W|?zҋT~'&3q3̪DDRvuuu9)jooGIeJf$Z $L&𛚚Ph@j=,EE---z r @ķT9&T:u MZ F ~ 372Pw@@T@T@<VlfC`j<(i(6~!?LIVX+ S%U(E F,c3|`1zmUвJ:dz{:'uVm1˜ 9k*M+3Bx(zx\ƌ.ufnCoz\@&#ع# J?@2a5]?3PKW,ݟ7`٪ m0o K{JK$zpLv }Woc@Ijr#Mp }˗|pw!oXpp\[Zzs]m#qѷ ;+Y}vf ] v<p{T @[}@*> '\XcpR{C>p _9oHahk7 u]1?cW>U7a OBw0<+Uz~!NU2?u"Qi_Q:ztBۿf<93 =;WOˏO)I/hmϻ;pQm'=P=/'6L)q96Yk(CgVCnz *eAY4:PX)R?I#uX:l3E_()wBB]M':gAcY_6h>eC Uz_H*' M @mVS (@;O QXfA-Y7yQ .2p &7c=VeE @k -0bK [8 yg zg 1b%@P3@uvvR[[6' > ɤVH8;dIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BD.png0000644000175000017500000000217112140200333020057 0ustar felixfelixPNG  IHDR@@IDATxn@iSUH Ѧ&qN R$zw H<+ށ V,X"lr7IlsԦ/OZ FHPCVZXZeE XErha2mnR ha]m^/c_`ŦEݲ֯-"[M7|#E8?+;~k-;3X3EAٛ:/XuF,_5 ۨ>ϖ:l"@E&M`lJ֭_qǢW]Coދ}m'f}>յjE.w }>,>m~o#߾-?$v'i?|ߩ;HdLТ' _/[ iZ{:E\ Y B Ac)m}':U{q VD0dZCե#Y7\+sq{DRJ.?ߪ2l>[ _u8^-TO| 7Y#dY|~[0]nTEb ߖu:ʺ"@:cxHs3t7Oxy]\}#xpO,TNsoN+Gk;t? E{3?K Qu@#dQIɥi`>2GL[u<z+1US@=J,| TB|>(W|~Fi<ޛ_@:lQ:xO<pEB5Y]5^φ% Md+YU'@D%-q$;Hp }>S0' gdOiؔVJPשZ/)gA۶{*? B+lIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BE.png0000644000175000017500000000124612140200333020062 0ustar felixfelixPNG  IHDR@mIDATxIsQ/`JJ(5s4`n,I0JQ 鄄wUQL9['"^ojM"d<)/n|J"\N ٬Ƌ{_7idǒsHI>*-vKXpLCX-Alj'A{FN?8~Њ~kcN)ٌ(F|30tn8`hŘ~8 QQ`@?paƟ~8຋>p@._8p.x[O>Γ)N?Bz[WOxL0 O>Ӯu=~Wg"{t7#Ǜi9\{*Wu'7͵4M0[imgd}{tϾ=̊w_Wݳve ^&,2pZJTkSr Z|XxHP)p QTnIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BF.png0000644000175000017500000000206112140200333020057 0ustar felixfelixPNG  IHDR@IDATxOA;7QCh`iKIċgOF JD#'xRcPTM!Ҧ)[vڝ$w=3;-A)R`ԢN BxI-$Ién7"pml:f'D͞> kOHِ`ls'd}O"^r'cOOĒB'gO§_-> {? `r~,3&{? J~$9nO%+ro PcM=Ľ'* :Injo{OD S6v[! bzsVц$ ەu+~$@$HD9y%~ܧTgH;xag$v.^#!֮{O o];w$`z!l/|L#4JNt&/ZP*^U l^s= ȼ LC BpɇA-o}~CŸ^7J_Z!;nK.}˦{M1s6Eh^Guz}/ =^3 pdXД;|`y镠 pl,A =q×iH޹ |Z˞g3a +3sE a#@)\6yiÖ|[FlFg.}`3;}|D|>Ic>-A% @zxT (ML=?Jz~TJm EX,U@u'h4*O k6IENDB`teeworlds-0.6.2+dfsg/data/countryflags/BH.png0000644000175000017500000000272512140200333020070 0ustar felixfelixPNG  IHDR@IDATxOUhkԚ4ZI{r[#i 4iؤ(/(1ڨF~TXX@A`ar @YY@۽,dře̜7ys~glP(uE&@䓖BT*Aʏ'DIEq}c.MƑ\6X׋Z f-S/{טaةеaꥬ v8z; 0yL}[޽ RvR|&P<Yrߊc&͛[) $Fm}}ԋr $u:rP/Lgi Ӆз_G(X\n0ݣ1G~M 0_kT2_8ĕ,ꅬ'V& q;0͏09@kVxn̖Vš Mdk^,Z0^T~&O\80Y|zykElg Ú2"ElgHMGPgH}Q/3Nr؆Wsy{,Å̟ 2^D3˓OO 6Ջ ߘ~sCy>( akR,`ĻG0 v>ɂгiAC_,rcK$^brb#O*#W~i3fDS˭|&D@Vsx%2I\NJX Fn%X+T܏OJ;|VS: Pb3x"tDޡ +" tLFnj@s> jFl$IHn7lzC&: r066A־>D0?::Rj~GmV6JshJRȈ`\16x2WۃfzT~ d{huC&L}fI&v1х?CY jX\\kAHA8Π|j28wՄx<9 F]#x⨗A{|>f3~0@/TL.jf{PIt⴪U055%{ {(w?A&H4AX0Du N9]B#Zʲ=㞢Ǐ"VBzz:RRR)CY"CR|rr2+^ tP@RR+~ /+d!#GIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BI.png0000644000175000017500000000512312140200333020064 0ustar felixfelixPNG  IHDR@ IDATx] SDkM j[ZԈQGEP;14Z4kj[43-^17PDx\A'܊"xv%+;,3}|T(9sVTBDD1H.T%g̘A fB;*!#UkZٲn̜9L@ >n/[x= kdjkk-.-"JTւ5qX6TVVzhGpgF8J#֭[-+D@hq1`]544H.>L _ቐ]hؼE~81n+sk>D& `g g&K&.6kD@{ݜ']`nQRod`h4qҩpnD[lF4%GqX /0D/\={;; b"0Ygm=* \D5cNf 7 ^J8`̌]X#֊5 8>^+bLV$՜.JWs WT`YX\/}a%3^^:Ǎ_MW`[`lQX IJF'^JO1`4ށB3tS$f\T.x{)M0&&)wր]gJp+MEvTԬ\ 0vv؆mGoXD93wuI59SY5: BE4>D](QUrJиmN؇}ÚoɱE}3GʜmIk/Q -YcA_95 i/O_K?C{C h2IZtiܺSV]h3Aѧ41œ۟>/3&+f/uG>ĺޕs'3'…e;jҧwp$t !kw~13v\]{@=YBop\tްtYce"9 ƣQ:¡ 37k3#N֧G)V.dL͙ʟϽx Uy~MR9Rƅ˛Qc ŕ\vW +¤mD96cp%G>[52vW`tm86cp&v*H){1ϋ]b}UVaW %xO*7 Lyɕס^7\:ppI / 5H}Þ:k]0/TȀm廱X֨Wh1ubi󭒘]l$dm^ np(Lm얅R_Zm"ǨnF|3A_wH&m˯jk a_9m c J W6n8BD*u;ۗ~l*Fh|}eD4*HB VqREiU8 :@g:lkoTg|ᅭ}Tȅ!\t]l|||X"}7,Ba \ɑ,,Ee郾,}s,)ĵtLN 7z?ʕ=xYH:804c)%}ؗ>[w7H}8p(;<MEftF0%A_^atglö#7c`,*9C{~`kw-N:8HA}f`d7(N_=~O˜tzr@=3ELGG݂I_LtccGo͑ž/{Duvv$a$>P'MTBJ&SB^!L:3kML/oe""՜b%yrv]!?mS:(!qZ~*(8uD rE+ +%(?5&2;`"Slƪv?5M?`Q L}u N?Z> [<`' gl9C;4~@_}~@^> 9o <@;zW i!No?mȑ@dKg5:FK4S 6Gh}, `C>:KrLRTtouVt!,RIV:Vj}1%7'I]-ʓ:kсdžZȰ\Bt7&]]x?y@2jYW4il@:ˎ@ *$uu$W[@^{TZ }b޷ l|@Xy(`5`\ ! O> 8B@\_"M0plK8eY(>PvoπIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BL.png0000644000175000017500000001534112140200333020072 0ustar felixfelixPNG  IHDR@IDATx]wTUWΟS2f2Q`  " (Rl]T@D@DODz}"% "EPDX(5QRVI2~;4Q5 pw{s/gG٧&iۿ`+Qތ=EqmyϽ}뺼Qc{v-i.}222,_'OkꋻU"ӰiT?Zkbuc<'|4E]UoFlHLPe`߾} Exx8g87)~ +rrj?{JρX婃$m@]E,L$QQtVsx.l?|ީ>׈XɁ\ݸq:k|׾/Xhj*TWW??#"gj=|xP# 5{slzi!`Ңl-YFH B#&#9<@,FTA}5b%fb'r!aʐ޶[l 0|xzz7nDll,>ޫvЀ[ 4:a&`gB0IkP?{R!m(XiEBj&1DZ$i,R6bg gА}ݯ1+1;9 9șܩjqu*+99YǏ}̟aaarPyXf lllޯ Qk#x6Rwm7DA!T~:x@=G!imtCsx.ɉGyRGa'>Ԉȅȍ\əܩE***9B8j'CgHH6mڄ,_>+l9UkcKlZ31Bޞ!e=vVzpod }b O}XM-8F{7xP#6b$Vb&vr r"7r$Wr&wꀺ_k_w:Bvڅ(Ȝ,G//^͛7ѪS0 _C{O >1]ؓIsE~)HQY 1Ia#a?1| CNjs,% 뭐'ٕ;=VzɸwJ11+1;9 99+9;u@]Xc[J e؜7oNy^Fz2N~ lK}ijt}׿aꁍDh-zy8̴'^sN>`¸am"n3@ =gDC;1n9߽A BLFJNBNFJN/ ܾ}:@dd$/C !G5g9JyܹXr%"""ywAөb :yNO w}^$+pvGo?Zlcx[0 0NЯPp_G BLFJNBNFLZN;K:l߾]*En:̞=+Vaw*l۶mrb/;  8 G~uĈ*l"g5R=a$DP:.r:_s$_: 2=)x*W#7[0E ={a"߽þX؈XɁ\ȉȑəܩ:QWd?;vL s#?''G%K )`rRڜ'Po4B㑑hi.k? k!)PYxRO@8\7Ϸ/(\;^Tc riB]8t?(*+Ӳ@#д>Sϲ-wa2i7>وXOJNBNFJNPɎ;:pڔ*$"Gs%O-[&%*cr[^ڶ(yyƖKs<>KCt/ Y7a8b}J\w :0*8]Eh͸!0 Ϧ[}+Wȅxɕɝ:.XQrw6 Fe4/]&9b,N~AE ̧ f}ׅo T|mX,ܑ[`G8o:WJNr C`%hϸAQg 1.`EqNb$Vb&vr r"7$g%jP\+;G=k T K0*xSyJQ|N*nΝ8bDf|-Oߌ~a3lڮ*!`W¶Ag(|BVg7RlsbEМ6`JBLFclb'r>r#Gr>rq: g]8kT!%.p̰bB/X.A6B:OM ĢD$blȅȍɕɝ£S:+g* Z9+e>Ec]iTB0 eӀ[ a1;;̉# \ZPXxT7d-. 9Ta[(&@Ǯ6ugeJBLSȅȍɕ}ӧK:D"us*y am_mSnTdYY"j<7~0/  `^p5auE F"Rвo{.& h+E_JW0b%fb'r!'U)pa/H(l\ &)ŢReZ)Q`݈-`Y9~ o_պe4`:`=03X,%c@k.AKLL; M3m>KrbiXAIgF zohh"H)I)S%*y\2~ e#PkP?~2N1+{4:a;טXx"vcJ4@7{#^}]__| Ͽ^G^)O% K5 b%feK.Dn}\$jkke1JZ"f8Chyf8׿?.jk㊮.ncn;&' \G'i\@cϞh~-4_~'_|_x ;>p?'Yf&dʲ;9Ѐ|VVWW'%Ƒí2%+k~+-I#{#?;}؈*tjrssG0 '{{{,\W' Onq'NvDj2 \e\1B9vATq$׶ӱUTSoW^^ 1?lϾ$bJ#bR:>$"L"ȑ#о MeC æ9H10_8pE 3b?'>℁Zyq?;@+}d_l3ǬYdc򯓓pkΝ;JT ̬ihn-L tM ;`4ť&k4U왃8Z384Qw kp ACc0w}jq,l4ZH.2^^遴Dʋo בHzelEl籨p.^ 8X[}չ8Pns' P6j t4<n)))ʟ9~psskJeK 9qi7O_0}V||Y0ܾx=g!.[~X/Agzm-bU 4Ԡ>hLF_m^fiZʰ8H`mD{(+CYI8*$"jj1o,lmmaii)݃iEFN|9A>)(sq>6fne- w] v6ŔVCۺJ`>s u[ ;q[ 9k1>j=lsa>}L܄̆lW@*fj6-؍_= i]"<΂Pqn, ɋD455pbOCu? 3?ׯ_r`t5=n1m$f҅8x. Zb>KG/wۜ'i#4k Lm]e =SE{xy޵'L\fZسgOu6UH,#P.2D%b,sp"lX?%5 !f&.wZaӅ {D:W|,ޥS@GZscvʙa9s,riY!s:Q&}R*@IU;˴\%0r̒JmPV؅^OqlVӃKj[ղgQ>+e|J<|$#@iITz?\mfapsca8mƟ2'b!&bVb&nx7ߴnjjDz?Ƕ(MT+;(WDx/}̞= s#2P3˃:>0/Bb"6b$Vb~_M{;3̈́rݡ{ѕ~j]yU~2fz8w#ݛX٫%6b$֧eNzWG{4j5c>c$¼VAknBh"X]x鉴(!\tl.2CZjtt8{ܿ?׵w {w!h#~ ߚ:gff_vӕ߇𦦦݆ `aa( &t>DxIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BM.png0000644000175000017500000000640112140200333020070 0ustar felixfelixPNG  IHDR@ IDATx] XYi!ꖛB##,I" ,)eRd+1ci 31ƈ4ZX"0CϘ,{6_^rKK<޳9߁ (Ç'p*F7778yݝ'РAN^4ģG;Nyh~!i7D }^~j \keW0x` %j`e=*B`oTT7&O,Ɣ)(y/KфW.\f8b!?~KވABڶ)&EZd1$+2q_?pwjTvX( ځ"*zQ|9ZZ9>Je|{M8ː ťq?2B!,7Wf?+TT)붳ó/]÷(Xy^A BY> q+8EEDb͚4x-P~*ٕ|O(WE1.j$W Hе29svySS\“,)g?z QʛޕQ/SjM<8 VfލG7 _g@JK[Oh\ɴs q?* (+,|Ԏڧhr:UNtG`ad>ҥ5 >soRȴgb//uK,ꭩ]&6R%n ||pח?*U'Z^Ox'ɓ|=GׄUhT2)䚐j_CB2B ]Ig!_NS'>)('ڵ3T6q5P0!R={mKHǏkCeik S:t֭qٿ\>W94]3^m[D3k͓bk[+J-Nx N qlۦ llpE I I':ɓ o/$N餱Nk˗/ԩ07Dk`55!յ|EEED /@nc%b:@>$'TXX>&998ͦffH256cHfw Xm[/Ro y*SY#u$`>@DE2OGB67PZ/_PD3{R;ٴOqܽ;U q<{ bX N'=u&ɏO׊ߗ (P#4T< VV6 aa8>H?L4֖D&;b Y A_\GPO&)!#(H(H]G(nDЫ& )#uDB#D[Cl칧'{c'{ɾRDtvXȓ6c/ <ͣS^)[tPo(f1 /41d 2X,nŋ'Cg^ 'Ѥh>([l5OѸˏQh7LǕOI \2֯\`i<|aNJv}.0zL=OVcHH4^SH'A{҉)HFcxܾ{GR> |q*+&bWjҪ&]43cgϪ ݼtȡ9D7tfJK`rΞLɸsP9rW@2y-NFR Nt2WO<@;]R߾x ~i!O}_·77 ,L֓cD?"Fb`z>#J @.3i?fl̿47Dg6"D%x. v]ł̐w;BWcjj"bL[7T\NIAv568z8mb8we1b3fpOKY7_X5͖_b{ڵk$8vlc`֗no*l}0ݥ Q}8lrƮ7#i.X 8@C.Qe IɕQl~) @Z+@y):'T^l׮wNP#y!4ۙVţypal~g,Ǝ>tsmhZ .Q lx®.]pU ;VAbm4 "߉1Y5_ ? 墳m8 .Zh?gLFo ؋6g= /`ql>8^1Wfcwƽ @[Mt0s7 '.4h 'yFp8O n0뷇!@F| K}pkCir|pWg,&$pKbY;^cz-k`1Kv6.O\c3Ll X=Ʒć"DmR 45'h&v\Agc\;" - X>ކx6gBbN'cjoz &E0N6XF6!t0د#1 SknhuAˁ haʗ@5S%5ClYG}4sBȜ`Z~= K{?nFA(N~*zGLh d `)H^3~D`Bu SbODhu|D$4$ Oln٬6vEJYxI/7 zF1],dRN(ufȩm¯u%zư-kףE_j;E>.>6hj-e@tCmpR :W}I>}e8U4h,TO٠P__7QVOsDpkݦW Sf7!FWWWTƅr6lxu{]CjWQ?|ޭSfIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BN.png0000644000175000017500000000750612140200333020100 0ustar felixfelixPNG  IHDR@ IDATx] XTUfgu`a6L%7$%[\*OK??K?E+-s1dUEQ+SY\SK4eϹÌ(82<#{Ͻye MQ(ԅ2vx1zhQ V:@|___ =u( bh8Whה|V *\+O mUT^򋝴>iEv ϴjuU8[_@h}+n (ڿQs/U}+> g t@ 2jƢ T\zNVë_g V꿿AWp?+8خ#@Q-CQ?։n6_CzIÏ19#'Z.i; I7#QTT?V>JY&RJ>+fGQ}{c=i",>Q嫟@KjgC9ɻbDqQ&:鍸KSygaIBM 6H ;Oq []U1I7ף$H=DRlhuYZqMBl^O)>~R"hZow(9-N5jI j 5{~C:U:)ۍ圤&: aZ8V***Rz`gdρ5pDs/n IPVkwh }}=D'BOhU#q=3-/FяIL_ #kI9NJ"8"Bq(*'dԶ*ڕpu ['"v}#^7~C 1n~*j'~:)Em 1a\gl?sfڝ۷qOÑ*Lڧ =1MWLfPE=JCo_.; qp"}7i^B@dH{$%s `k6SQW}\sSI>}QvP}uZMah}xX83֡ړ_r'l b C< IVHveH=֔dۮh;=v O{ y? ~.]H7Z.BTCꖊ>V07,$1kž*#׿MמwF[WĹE[o$<77l'u#y-|Y_^WOu~n\S~4\;Y1QCp022[wz1qȏڎ/cld-]o /XÉe.1(ut\.3'qY9se%QrkSh 38|Y9@v/Œ_1/)SEGq G$ynҲf"{(-)l ~gY?0@mxs1+CYqJ~ p2O @K,&Ƕ fOowQSSٌJBb!=zJIV@uhst3q$.6[9!RE[Te(=0>8@ `6Y,Xi!A3M:NJ <+ tUox?C>r4ΚǜMVUUsg|:A#(WjFPzSIİm!`3CSxU}M+ &01n;A40qp` sI$P*|H%X`<{##e5*ɻ9d,Duu5ӟ5H~_EۛO7N 'ըE0RNķRT_'',;I$PgD"HO= {1.G~CEXY0Z!qe#r{wc#ρf,LNݻw/_ꤷK(e5&^dmĕA}|*8<=HP6 "4NH'LMQ(+ "Ӻ32lUPı >V|bQ0| "7|Im_#l.1Xl&R>3#MFHne\#k#w#|lBJN );6X0{3i> )K76(+M#d 7;N3z}Md^waAŧOh-\=!DfL1Rt14DL N$!9"@0c Hi[f =f@^rʹ^N(\,F$)zro"͸FAj&VR,BP)xz0{ կ7&R,_G>Gh}DbifHBC?"zl97Y%8='7 "t +Ha$)fk x "x[HAdl9H$Ahȋ>n%JKKX"D CX&2{bN9VaV!=wȟꀜJ=$GVpxHAϘ 3\@"4SSX[b/ZXVm3--s)mqMwLb7_ KĘD~?0dNEYEj7̹C ށRY!@)K5E|ʹCx!|BҶx\sЋ1VKG,!&KbaKIM+V<'6FXc\x2jV+ÁX_K<{fAg8>]Ev,>&l(f.2 }zP@ =aoM7V2.WO% ShIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BO.png0000644000175000017500000000321212140200333020067 0ustar felixfelixPNG  IHDR@QIDATxYPW3!F a,jT.컎 tuam,[ CQ*REq VTjծNE`BsOrw6.yxuE7DGG3pTeG#@Ahh(GUBll2M(cL?!,,qT&3~2|*8kovTVrpO`)§c2c*[9TSXqPT>BSXyRF N<,ϳ :]T9k?t@M-l:fsTU/IÌ 4DH^\ ϲU k|ܹKm5WxnZT9L2=!KQTc~,'bFM+cqdcklr7 պ֥hfev?3dmI0C])jC/62U" iX-f.CGعA=z?.jmm*fBKޏp~;r=:3hvT-np?g 6—c|mpEe9]Ő!nI(S1ʼ 6B,@M);Y$؉q5A AS2.q$ϐ/'I[]M{"\Vqm'" & d o%\jkcƎO-O6@KCYExeC;f`r@|UkQxU\q DЗ^_ =еʐغ`g!G+4(-3cEi/ o^|«BiRVmՊ/@ceq_h$O }VY)ʫP^O\j#*^;`Ի?sym>:FйbiQ^1jl%lSW 4U~7FO,6+t ])]ʓ ^MklLuōy+&͜P|(j 6' ǰ6Ң4(6Q_6̂Wo)*DF+ܗL|&-7F1]D_p3EoM% (VY粪Y,Ң~aF!}@lLb-Xj%m^EV`.Cָ TeVM6u751du ĦPYLT6N`&mqp% 6=S iv"csI!2*ʐ[}N"hVgcyL!›݊#dZ'5N*U٣HCvAJܮŗ7ʰvBVC12ϣٍǰ.,=W9l]A",>;3 f%3@ۊ&Tf"K0θSII:[TC*jnxE#^CKHsSKyjϸ W4 Tt4nFde&šmE;chX߸fY|1@]CPP7Pߓ&աŧqe <Pt! FXwcqT>lWGy|pCrzxH# zCbiKr^[` .G͝[-}:(m΄*Q] >3_y3kTDx*?k+]DHx.. 7 dB(>GhAϧY%+xP+WfAĹϞm( zoݬ9爩 H;__Ɩ;'S ,ÿW^R3,VdzϨu/:kH;w0}]:7re/9 0wX@Vl2}8{92\cuw+94 o]@G uSg`?#ex׸p^ELyA5 =5֞9-7 7<-pyvav3:O r]Ocsq< bRU4 A9m b?[+Dq?= S0tgHO_g-u.b)!wE[H+"EVYvP؞ftWďgnQ^zoP0Vф~ F+TTTkX0bk94myQ _r3F&8-{R}Sz7š`v^3$a$&z6j7*|?[ vTP}!75qouNe^#;h :E7!`Fb?OdAJZs(sti.S-=mi<SBawyc ʃ&sJo/)l~{`gWvrtrPѼ*/o@0^?W1:G Eyv0zK~EoTŜi~^ON~i#@,Pڔe;Ld:~ABcݐyyJ6m~3)}qJ2{7]|?0+4-G$GubΥk-4 ߠOWFz!<;Ectkla-?;HKħ}tJz|)P+ v^&hy y6 '2Λ\t @S=WdLw`O XZȘ.2&`"((L|7Ə/  0*f IENDB`teeworlds-0.6.2+dfsg/data/countryflags/BS.png0000644000175000017500000000230012140200333020070 0ustar felixfelixPNG  IHDR@IDATxYHTQǏ[FAփBH/3Z(TD`=bQDK+i-hѾ6fn eBEE5ߌ7iF}=@Fg;s=—`lD_~_dONN"B/,$8wvzt/3>'iLljXJV߀ Q@,ZM_,u5@$$Ĕ|UNɀ_l⚁-'$h}—G 4{/ۈl=HhWuĞ:ώ }(D_xX@(QUO%8%r b9 (;0|5@EXYAFsZ  ЇҕxiԸdOm_Mq 63 p4ӳO$,\? *ϗ9,](+"`t"nKC$h0NJ nooȃ Ű!Pwd y3;J^X`~|E|,AVyѧE E[$9_OKyO~yG| /Y>8zj BVVѦLb 0L^G0@FFoRYصIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BT.png0000644000175000017500000001014112140200333020073 0ustar felixfelixPNG  IHDR@(IDATx][So>W#x)ֶ\kֱZE+Z=R'D%!s @B 0(8"ۧ]wE%ju2Wz M]EOZfM3^otq2z>a_ A9G>/w3A3]F>/7܊B~EcG{wpmШ@wy*tIb/tn,{Я{~?nmҰ:~^/*8D>uh\WM}|_.>PX2J3rw ܅ZC  9dt(#F}ּP۳Ǎ O\&yxT~,Ygg$܁oP],xD4~T+h6}?{!.Lj~^^Ee(+p"-ߡUROPFjwZ[[? o߆ŋq-p)n2 wnB]('ù"rTwWAZѠE [@?}X2ܽ{ׯ_gdwvvΝ;HMIƝ+nTףQ4V5{U>Qr1ʖ^+aK C|1Ԃ0JP ? Β_~k믿W^E{{;ڐ 7n?@~wHNĢ^!S"BKMQ uK?z*\=|^9StTJPW[|Ը(QQQǃ[nY3.\tW9 WQG~^ *sQfR\ЮŐJXZ2f1KKKn7f'`3fRp8XzHIm _/Emm-#HB"r*;::qUUK .WIf1#hN ɀ1 љ?/oP`3;j2 nܻwo0I U(3žqߠb"Xϧ\@m6jAjbP *maEzcc# PRR"  V˜s]j)G -MpTb!?F ֍0}%pǾh4tLS?^^A|uu5pLjIa&̾w|2id8%Mdq5^G}k>CUd&+7=pt3^/4H#Td]pU L5Y \=f>'CC{Y:UG۽hD7VxDεd; "yߩv m ep, $(2E[`?us-CG <ӟj'|^cpKN0vgA'AS]9)%\r(j*bcP1ca ]@5lz4Λ4 tO}#rNVt9_nEo4lQ&VT4p Z@QjfB SPӔPup=(YݱVTsC^/N\Ԫ6IV?ۭ {wPSS: 6D@u 4)4Lkl~@˨gdW{.uvvmvz9b[$WȘF 0H㡕&]@z':8A{TF|vL]@ss3r* -4%W ' 1dGN lG;-OTϚx4Ib6.ĨpIY9E,E5Fĺ,Ha|%0o?K>OJ{b"PӠD9,Lwn'+|%psuBáʵO<˟|^#D65|*(dlǑ9`5JdNf4(d(t\S3m_.E1Q9̱|^c@l)J,rFsOOS^ʞ@"!wP';=9Hd<Ǯ-(v3'gx^ncV=*++P902*W$˞ZDA9r=vZ!W1*I4ӈ&.]@]|rrR4EiYZ-xhB zdzY2ZU./DW^we@s&gXU`L[VNDwԍPEA~ʍ_ASFTYT~=zGy8Q05O&A*B.C*J`(\@Ū(jgMf |l( 6ɉZ s]R^/WeќO{0OAF FJBaa!rP @ ,YDЈ7pD} '"H$Bjj*2a/,mLn'>  >0jmj@IH Da0ފ`7Wťsr" \Hp9W1PDt>i(2Yq~H8qYg~]qGui %)ENcyF !\1멒W$!/$V {sM\ qb1ς8f'sJ+B¤ppYA? ШgXȤ9aErDQO$I91+563o6ͦ5H߻ I'hH&. qYC3݇xOB  'r cT*q8F0-k?'wM{ClN;4K`Oe% xAeC<*X 酧anBx+cq6>B#H9UyáR@ T9<'Q yIL .EtLCi@ƥSÑpL(D ЫzgϞEFF9[qsXpEjvӨP+`* /fӦHfcX/xS(6@) 8spUz^ sTvs$S~'3+$f ҟUbc" g)1P0ݻ[!O`l:e2Y/~IfT|lBYyٍ)ܻ\7ϜaB o\0/VWĹHɢ*7+(ARcȔQAș7 G.޽M+P 8Gv,ҏ>(^[יܼ۠xh%p7ܾ=HKK:cG @}}:/@CL5`tlVXN@#[fBC7֮ np-rCyH+'0®fչ\ЬnjrKJu_9=\s090GdYP 310P}aĜWN"/Gȷ.~U$g#1"O;\GkD~w6KSL4ѯ+_5qCq5Mz8h-B{k+m#B?\_ōod˺4^ZLFO7Lw2pSq@m_Gj~z<:]5gyEp'ȇ yD<$6@77M򄌷x $څ?|LE!<<mûx=@ćĿ XpXE96RTIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BW.png0000644000175000017500000000131712140200333020103 0ustar felixfelixPNG  IHDR@IDATxnQp@ +EtN+jF[х[WU[?Y-+pŒ ;^LR-m4pgߦ.OL8GU*B(ԴYO#0_TL&8A1K?N+NPpٗl6{8|f~ewr ɕ{r&@-ҝwG_o0T _>S[yP-n|;6|jl|:|b{?x ~g;g;,x'z|Տ}7~9x~ K뻁c<Kדn Z7:T*Eb1mx1p 1p DL&Ex<~YclRg|rcfO?ztj#cFg_W_\U鋭xS@v'$8<%ۯ#?ᦁ !m">6xwxG>F~Mgm>pM>ya8i;4~`JpA!> , @mZmd3# P <:ߐ-xz_UR.P(L)ˌ<oC\.h0-GIENDB`teeworlds-0.6.2+dfsg/data/countryflags/BY.png0000644000175000017500000000351512140200333020107 0ustar felixfelixPNG  IHDR@IDATxklL[OB!| !HD)xETH.߈G׳ޏJ$"TGڪNiMN[m{̘V1әI3{{٣Vs"fϞ )ު=[{S BCC)00R 2Ll3gB9W}ZU9^ц 7Z,\ R뉪 o5RqDYN{%[PF/G˗L Uf|q^ ɔ9|85feQɓTq,eM RMb"5H4꾪k\JYcKdf=ihǪ*hSU!C&)>567[, Цxuʙ>>婾`bz5ns!3^PS^K=v3>@Ό zd eǎ/ИΠWKU/<vzw"0l+WRƍ-d'P]Ru\T_/Bqztn}􈷁9T~ PT,D_xP^NEjQ9l(aKi#3f)^ ɶj11R<_xoޤP8}>hYcu5]K Љ @DVhzz5~<ٖ/glWS5dJ< zce%0cH `7 -Htr ;_xZ޼x7vSX}=yBjk%kG_x`x{'N=CY;⸁pLm`r zwႫA01fCZ@FܻZEt@Ç֯gCGDܐvFb P~8v΍*ݵxm߿wxַ/W ImOB6JٓB.;zX lG/<5w۹aow젪kܫ5pQ"Q BT {xߏt0Cq,SP]J 5IC0<~h$CM@YT, WT (LF#FPS~>7y% Tt%0lZ<`7 |Ce! ,6l+VpCwnš|d+pM8@)JT#0DFd|Kg!:z:0o@LNT>Zeq-bsC%8 zסD{L(Tg p^u4Q=p2khΜ94k,6 7&I(88X^HB\IENDB`teeworlds-0.6.2+dfsg/data/countryflags/BZ.png0000644000175000017500000001210112140200333020077 0ustar felixfelixPNG  IHDR@IDATx]XT$>?{c4(J, %@P!`AQ₨ԥt ( Hw1ѠWc{Y@F ;>{=gfy3 ;-Z< ϟO+zJ^hkkC]]WH (jjjP*"h<+R $fŐZ @fJdCVY\)_9C*{ڞX'[ W:T Ǥ|G!RFw>%'k!kȵ?>H/@0F7IEM嗧%’%EȐm. 74Hwoųc}ԴGWGCSj?+}.D XXX'cD rF+雌_oz_*._Z+}ʳN ;g/Opz,l.IЈ#Ac=Yg$њOLGi{vMbC>mXb#{eX礉]ӱ.tt4!&>~sܵ3^ꪰctuud,/1?@0_︎#qˊ¹XHku0/B;sk ޻Lh7jhLu}YYugaI% ؑ7HCRBħxR ⣂Q1g~:+&a ZXdmrǢ_֍/䀜pX^_yauf9CeD+Z[ v#2çߧ*P0` _& l|&I-`qbdԤAi N#c|{O*_A^t_>} ajۑJY9c Z[[py/b xc (+Ru֌PW,[4 0`,eq= @O*n oHOԇ<4pޏ85n` Lfo 2_K"GCΌuxƫsF\n,|=4PR?[Aۆ#P#@uGFd=;%m%OաX׳ƏwnmvuG`,%#]8<?hB"P2dep(·۫ fc(f vʜQ-3 r`+;>zXٿa΢B*WR_ TF,!c}o)@6h𑰯8YXki!݋qrw$\-PCE2>GS!9 "Zkka={6ubؙzX2>ʲ3a2|0f,`*M1CtODȸ6 ߆} b?:2>o*T .̸ U~z?p3㗵Fg#j,408(ɖXK/W?ͻ7i=3x WzOXs3f=D@JNf |M>h8Qhxi ESA\x 5 8V~ M"5ɪR 9dj ۔iyYiߖB':OOɘN>Mx!ȦMR 3c2<4f).d)BgϞÇqzLL~0 8@zdoѢ$8*0u\+j׾.w\(Q1v6Si=s3æO>@7\ixk!PɱHD X.G6XzӾ:"&9~Z G{/@Xyg$ܧfn~+ 7INr>iE,..vGCqx;S7K5LJQi:6EzOH,đKJJpO,Mj%v̲'@p0Y&Fmp s^C%mtmk_-*BrO5/ `d$@f0 3ON/-@ @c2̣韁իaLj|ne! `wT 1M_@fw&͍ocԾ~# b}̄Y 0z"vQDzu}L7!$O2䯆r^m8K9 _탏ֆՁdu>e>!g|ۿerp5ܷ03 y1ol. e6S> 0F FkjgKx; cMrձfbcciT5#FZZl6a%0{dS)5u]XỂ֑1ItGJ͐τhBN'3N2N4 )\^"(^^^3>>Crr2XYY@Tt<=B HBqM1FtO DbQ" 'Oc!cz uo6s%o-=V ('I|Of\\p!44Nf=IF@z] B6oi*G+&acFę :gd}.?QN$$ο^E=Hd!]i"z!z?UT/,ߡlFg:2WI__}.HZ6 +3@e{ b(D?gg8Z!X1CXZ@|A`3nqt%A*%?sb24Wk$yQ{FA &d̯ttlRՕ]͖ɳǩƓ=%}j8g$ㄉBCcGn/wL))wN]Ő^^Zeeh36I p~ߎ $ #xdQwgPT]$낳1tP܄ti%yHۯ*XE$GR$/^ Duy*iUd{^2y=,\r _ lŽ( KlbRMI& Ǥ|GRV/x~{RX M/?Ck S @:jHg… 1o޼T!B,X IENDB`teeworlds-0.6.2+dfsg/data/countryflags/CA.png0000644000175000017500000000263412140200333020061 0ustar felixfelixPNG  IHDR@cIDATx=lZӂX #cVj$5 1"$6X`e1p4 I <^ $m'_ԩ?ґ~o;MQALh<44d핵D d2dtl-^8%kԚ3w)q˜ ,UN @le9ˮi) A @H4>i,$E(2ۄ4>SccuG nMOQ7>VH*mgtĉF[!(3 nϘS!Zd4Px<-:,l>{ zh|}?2(:a@ggT26 #E63u+xF PD0Rzw!:k jdheyڮ];p6@;~ 2чDkk߽A`yGta K~p7֣Gn zСFK/\e g:F }:[Euy@ǿ{$ |p'ϯnWѵkD~eM_^4ק1pwŏ`ih۶GC@7h߾@B=ht;0RaS1z=<)|?v:Mbbbc H+WHtu_hm,//7ǏIܩo-)<`U*Jr捾Z333^$!q IXϘy^u xK3p kӧIX'OHzEFPeQuц uifd|&ʹH[W8GY/2q(8y)FFH9 ^)r9Ǐ3q )(^|ۇ'Lp0c=Mߎ1$gm fB1~?t02t g:% ;qO2@yg ?¬ @s )۬O|'f8GuӐ<IENDB`teeworlds-0.6.2+dfsg/data/countryflags/CC.png0000644000175000017500000000401012140200333020051 0ustar felixfelixPNG  IHDR@IDATx]ylU8 " "W4(A bb Q@/nZB Z[(P rX i Z rP\Z?Q~~o7;;;;̼?~ffޛ}MA@A||<BkՃRfVH6QQQ Њ PcaKXIJ00Q M,`]LKXN$)"Ý|)Aa@9, p}5/; `F%`l`LO /W$ݎZrj?DWW'[ ?zu kR^C =J׿vB\`]go ?\!3JoF }^ph x鴧U?؂퀻6OywEDɓM,;?Cl| Sw"J{P<_@2Y޹x'OlxM"p1~p8t3?Ce_~̘.r^,,|MI ?%~l1>bВ?.yf} o'k;O\F]Q#7hZ!r;>pJi>}\\D)js *TRV8rp ڐ@ w%e 1 DeZԵ,Hd)9շȼ$+$TdmԐl;((L~Y} !s Wt> Oh);p ÖctqfSxC}8\ܢeaE_Je62W˖~|SSHګxC rA :y"~Ą?%B|5<+XJG.R~C Qwro5< =@BOR~s.i %ɞvOUo c:~pz,y $uywU5ϕip_d_HPftNbstAⰞ@(W)W'ϐ~|a-0!dCpE`a\ᆵV(pKfiRaM (ZstK,Ǻ_&\qTn,+>__*`Y^W o  M`aT>`y+j J{621x?q_ n&*L_9'iE^W- ,iKAHd@ xN,1ߢR$]>)@IQg 3@Z>|8ŹkS"2J 0&&FoP TNIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CD.png0000644000175000017500000000546412140200333020070 0ustar felixfelixPNG  IHDR@ IDATxyTT1{)0 jzXSciE UXD=5&AQ[TPŠ/qA% 2웂 ;h]qmƧ88̰ /~o}bJ[,Gnnn$Jkh1@׈#Bj,0𝝝IVMUj!,@^z"}q It{ eΎ:t$kFFQ7Hκ9dG'upЄo1)w`ߍ_jҭAa1E1-l.fIqc|g:;؛>6Koye6Tŀ(E,xx&g٘kP^/& ܷӤh|]c]>GAtᴦ^cG4],)*'smW+iݵ9#TNKJh[*=|Q moRXvзS> 9Y. \@KՊ&eS9uOE&7"-} )Pt쎺d oU {)G{4Tf#>uJEݚ^ֺh ]VRtirfߟZ[oGT',b (ixR?uzH[TR[UY \':lM]Uk I18>*1Iq) ҦA;_xT&}R 䭖'1]8#AI JjeT 9x`TcrZQbTδf9~(xAgI;l|Pk8}b`2\mEIWN{&U7Cd85XX<GdN8} ^V^E §Y-Lpāi߭=2"dum>ڪ_[o|g3Na@KX191UW|*oHIz j#iLgienf\ςOs{)tTv2w䢣>x%LAoҦpzZQ,H(G7RTb-2lq) ooVO+-[ GtiB'tpE<Хq(t3iV Rd1E mYI) umH>`Lb @ -0RqnǶ|gRHQ΂QM[ (J!Q 2רz $w|f@h) d'OӢ5 > BLL '8:92bGg2ѡ(?qg(`cHMAH.Cv1eW|z>^.Yb߱ߠ '8pr >; ^7 , @( y?G9ֱscgl 9NHHjƆ/~X*l ol 1n,x*0y2Fѧ@|J -`mGSG )@Fr1ctPNY| $к%H>_gcunpT !eCՖfQv_s^P, Yz}@L@iKWb >S}B\1`!X 4y ‡~aw~[ʡ)% dLbS!Z]&eT;G{ H0w?wÇkiSZWm~ذa`wwFj."­5٫JIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CF.png0000644000175000017500000000217412140200333020065 0ustar felixfelixPNG  IHDR@CIDATxOHQ1.eu(kQ.j[Ct.]"?aEdұNA?"ij$B=t5Vl*ZR5]gƷ=3~Jma(III F3ź^t'?ь&:rf i0 `kh5PPP0WZɼY+!ܟ^ 2W]PYU 0W#Z2*j; FXR=|^o@5r?~?OTϗ/5̖UJ_*>~Vd^R&ew-[U%:dx l7+_m/]Oc۸&늚6 =/`硊U`_k,'uQHdங'Gexl2x%CL ̀#lFFFbOLLOO/[>09d0<09D0>>nx`a  A XqBpK.p

r vїzlXS!5}6,ns.Х[:G~l;679Y! s.xm)xl"%&g>rKK,P @ ~`EuVo~XM_[-(`_@aQ 'H , !vx$@h4'Z<4]|'H`dI|`-XBu5>E$=~EGXg' `#1Ezy'[=OD?i}>@2z IYO ԧn KD(++Ӗx xI{ĩ"RIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CG.png0000644000175000017500000000305412140200333020064 0ustar felixfelixPNG  IHDR@IDATxYlTUcb⃉7JR ;{@/$yQb11FP@b"J(h;ݦtߦ,m)ݰ`)X >gui3yҤ<}߹ν&HPSQQ bZ"jB$B^D1f/++#$z Iq{Mkeԁe?"#[Ñ/_> ct%:Y>$Hn ^PF2|QW6wY0j܊>"Ex.:L5f? `(11*e= __@/e8{˿bHeV  !c$SS>%5I@d s_/a(#`_r+e9˟09=`{ 䝐11A2 oL[Vrw"0Pl> ނt~ zҀkC:޼ԠD̺˿yuk wq?x@in˿qr;<)CX"y{%dCtx? l}+Й? w8V_qx'<+/'\;ExB /"exw>gߤ[<tG x iN.C6eE*xiO^^JMBM=H8$Cy+`CwpۈL\qYǰˆM #\p"a\d6ρWwd?'gыB А! f>᧪M{sJҼch*ډKC7f%xp]x\?-.j쀣<Ho.&Fswq&nt:!MzFnGȖiX1fvԕq4'd6*A]q*wqzHsD~ߏ%=c2&]uP[]h\$><}Q]f\59` +?Ǜ@kHF}V׭X`h iΓ}EnQ֐&9VshH )fسbC~hHs@U~קP;2@Cu~O-Q@!Mr掦 Q_V\5IQ;>؈[Q֐ \:L8J59imQ H%Pi<=M77piէ}q"Xf_ &Il6[(h4 QSF@FtIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CH.png0000644000175000017500000000160012140200333020060 0ustar felixfelixPNG  IHDR@GIDATxnQyZjčѸJiŅq| UZW |`Cȑ3@?orL9ýs"P?:x k_Bgyy*H$„T \0ghqq,@kz$qn֯NAvٜR~s!@. >H'!0~ W}%!G~ޚ_;Jq/%!GJOHc}̀ϠC>  0l2Cbܪ~@n5 H$@ ŬzCicCsk]Y{| >MڃI0|`:~`;  a·}:?LÿY@˗x>L?ݦON7IQNCV&PZ#r|ޡP(8sbѡT*9eT*kkS^w9ïcdYں{3РC!mj4N03 P =݇S`Xcq |Ky*U0!|IZ.ߺ,i/ACU4`\?]A[X"g͍"xM `y&>0H ^Y;F؁aowH:} }6c~V$aþX,@ s\$$bA(! #H! R62pcoDBF~8?ĉIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CI.png0000644000175000017500000000146212140200333020067 0ustar felixfelixPNG  IHDR@IDATxnAy6r[ @xz%-  U@W.˄²{'YG/'W7eglE:t:=JYLGƯk'LR8(!,+? qnfצZH>\ޭQ$[>u|*'@$wWOXg@" ܍HiXGG?H3@ })@ `:!Lp <>g ?`v`"'@,!>`2W#]?0oxynA~ԶI?ã~)uo o8K.L@%qnS٤jJB٬\.%{׊ŢR\.SRVQ^FᅿwJ)N0F:Z-L۶)%,|R55`I]P@uwz|[ǔp6n@ 뾭 >1ºh?mS>ۍ(ܞ|0ݓ>0@^p@@|G)^Wd_MzXBT*Ex_"rc7eY((w=mVIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CK.png0000644000175000017500000000645412140200333020077 0ustar felixfelixPNG  IHDR@ IDATx] XTvj٪XfnXY*h]}򦷫7{ڦRh K[hi䒈";/elw#qiZd"Y-l!o#q7H\[J4U_[cV$7$r)jPZ]1pۤj!-'"_w2^#Mk獼XTY~g>.oG'=fCA 0xsR$>RܸCWC]5oT7Pm_vӰ|S"^hnk#w~w7ܻs_\KHQyРCj<$x '^xf${c3y&J ^X!mB>]sGspjX8qLW"߯\ƴwG^l<;Ĵ>ȋ9쓗Jظ= nَf1 O'q_5o@9$$tip~$6pC#-poJrQXK," `.g9#TիqDF xa<IP슿"wC\AEK:re'lG(>{%%ظ#MܷƍX%Q; y9 ܅N? /BE]+e&?d.y QWD\˽r44[ }]~S3 CwlĊs <8/Y=*kOpOQY.J`YpiT5Ma9myC5 M‚0E%8s/ьb"Q0[^ R3ޯi2QY1]Hɺ0\a+JOW^,q.}$^\}rZt@[9u1q[E^Heh;<>U&Rgw dlޕ!Ǖ|U1p)Gh'@b۞,i ^Wr T~=t Oj*XcWBw&m7)1 P^ Ei&.,s~H\2\+_TTTxcezu={}x +`>,ʸͬe*'S`hӎt\/2$99HDNIK١O~ۍBv*$ },N#;U5P7Fl E85ęIܥ~]rv{K{x=~+"g(78[15pCUf uv#Ф8O7_ :8(qzGqǩK'kr(m 2rȩ#BriA3>~c4{MSyi.ױ ;K2Yg1g͹t5zazxḿ1hL8Gvz]JK0GRGm H5{QgTVȬ+${ZEj91g{ic>b7○Ufp(>YDh9qBU: 5 j];fUUSuL轘dy ^ְ1r:}oBC0'csd^sptSO}>G\fopl^?{rBS `X4y}VPxwD ʁo!K\7t,}@|3d\TRr)z웯MV~Ckw`][;*Kw/~~38T38=x,2_Snxz}CK)l"&. 7E; P]`~rRw}U*7Eijܼ'>mÜ'OG D[npWYoW{)ذuIhȲYc n 0a#=$R 3QXN|+{s: o223EU yU< cFslfbʬMx'̂Kn6OĽ1x* 52v8`U$@9cK"pS}2&V?niXך<ZxkBVV6Nƭl/:s@7B*Hv Ì[ @yzfuD‘dAm{N5+а=; F|b !SP'(|aThvKHeM^U Dd=mTo X:F`>EЏܤm\wpW w7qJaMjX%X{=Jxnآ"ĬXs7㓀e_7ZQ .Q$]?^ c- JQIr@6l )-b>s@.w<;8W@'w l)FuRE Itm JX/ GHeͲMm!dҬ/R|ڇeI"$0Z;7pPld6hl%{!/Gdh8]w X[qУ5?D 0w%{]CWb޸s·44JR+}mrZH kn>XqIqCs.@IVQ{NvOg̯?hϑ8'j u 8nwO,^z[6u¾hݻ; _c Э[7Wi|RIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CL.png0000644000175000017500000000173012140200333020070 0ustar felixfelixPNG  IHDR@IDATxKOQpQ?0K&u@¥[4uAbTP/B*556q0L3眛2;3M3gvQ̏Á،" !6]ەS[T*0<<bZ&uxD""WEr F~{B8 p(#ե8mb.EV(''Ro KRkRI7| pQXZ +IXZU7h\~܎xGi u7r666 Wts H&OBgVwkQW?=Y=Yj?)~N pĆ\(džOBcP Jy+z~$xl<]muЛ'+NQPhlp"1jlnn\H$M/ N7@D|?nO *LT*uE PV}Ç. XQX 5 4%w- ]09XPBw_3@>csVOИ/x >LcS|ZmG,%^7,!@Xz~ >FFFkSC rIzNS#\뚣HIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CM.png0000644000175000017500000000212012140200333020063 0ustar felixfelixPNG  IHDR@IDATxKOQ@:-`B BV0QA{EK11w.HP DQX|Ciڡvz;[d.,x3̴&@IM1ք:Nb5v"5  \?sv$cgmͶ^> t\> A#L<&x@x0+*xL;E+ p`G$7: Gf]p` ޴O8O8V_G?`&s?fs?`oq|֏p ;$/(Tji@Grʨ >vj@G)H<+US`t~#5@lO睼@L^yѷo`sSN-,hP)6k`EfѬ;Oc ;<$<}o$L {O|{/)5,{L}SO\xD+|qU˚kڦ҅xo 0S,XX!#|{"'H{WOph-s#rU sw1<+ 4 -Gw !_8h,: -o.F, qMy ࢶy y yI5/@CMLâ@>"0^9Lp.|Gc~' QO2@G=HCJ(++ צ&=`񥥥T< v{4*>C"9-IENDB`teeworlds-0.6.2+dfsg/data/countryflags/CN.png0000644000175000017500000000246312140200333020076 0ustar felixfelixPNG  IHDR@IDATxoEI&iBQ~D'HHBzh qE9D[GTq!-%!M8iFUIBq6ڛ̼Gv:Y xp[bQgg'hB*[-LLPWWW1,i &JĹ6XõL NJ`Y?m6Qv.l[ٯyosp%K7;hЃ_Kn~s/D 5HPi+@)ȭ6sٴz3(H&˲_;߉]O ?hd,`DZ$tH[v {{˺k%n B[|?DVAGk#UXVJ S_Z{*yvɸ ~#;ߌEs/Sdw$蟓b/ f|C{]vV{ @"eJqڇi|瞱i _]}|y~.#G%g,}Ҧig BXlZ MF}_ J}6,o^8^E\79*@Vh'Xe(ͿpaO;P,{>BW^Y8z~I.";(˝j4篥owrM8kb' ;n)_V̀ʞMS8Džq9Q/g3}j[W^21mes [Ɍ]mމ&}X0ŋZ'} [? Pʱh~8m[1ݫ䑗pKŹϣb""OyY0TDez,>7x1FOsQn,`YC5 < Aݘi]W0ƭwTg1Vd5P#[XG[d1:^`8g=Ad9 1ζَ/Q P\:`" vXZe?{Pq o?+X Vt|Z~-WtCkdo$po^_0-@˪~ގ1s\7X7h( 0e\F p&$LD)0>gA~J&ڔ !ÁAT*+*cesʴIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CO.png0000644000175000017500000000142012140200333020067 0ustar felixfelixPNG  IHDR@IDATxKkQ?hJ٫+j$6_ nx)Jk"T\HB2ɤLC ,疁)^PT=߄SVe>'_ !ض?/ BfeB pce!ps#%_YjWs#+!CVS‡ YOB|j?`ƛIo{n ?|y7|0cտo?0M~~`8ߟl?0~ ^wݿAF|y0~>; cK`0M h dUm:xCf||͇1v1Fqfg;)že D`CW"3x7j^Tasq̔.2>3N)6+Og `]Qu t)7VG @!Mjn(|i@C<uh&Kƛ=@. n {!m8{!y8 V=S^`K]+@#|p】, n0NZ`>,"|, |4zc*D|LZKVrkS.z@J%om,>ӂUaTIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CR.png0000644000175000017500000000277312140200333020106 0ustar felixfelixPNG  IHDR@IDATxiLTGǟiLHڤh? \ ƊiDlr(JE""G RīJKJQ,VQ0Uy])]d73/ټ2߼w"] AЖp#quu=A.LP(RvvvA[.F$GFa\ >)lC .b*`,".bU&;4tn Tqp(`tvvrX-hllZ>@O\'\Iȸ[8S~\A+ VKNR4I3;g`R?U&Fpl3)@x IMtAL ԡTM\ϜwzxG&?.~qIGI]ځf:ϔ-`!PtJEBa1E~YT%mh-?gNΔVODPػ8PDŇ +/!܂DHuIjCgJ)Բ%l> h:l| %{ElC;ɸ _:K6G}d[-E#v O\P*p H߻VKڐC~禸gN\}\)BX4^!+ᕲ=Ӟe'RRҖvЏBVMu_1-Z݋/߁p ϣQ[, # _XH<"B#l:b]Ɛ(R)3)ٍRaW |FV vg<],rz̖ꐺ!L5斨McL @ =01E3V.ٻۑ"8I躜<rHw6xo7?XY99@lW]ܤm W-sqn;ړC,r])AN)Nj8ᴄhVh8B9\NقvX\!<!/ ±bbD-fWh4`FSp(Q mXoޙƈ<{k9QlwBD:z6B;MN|Գ% c)G$x'''P(GGG -ȴFx8IENDB`teeworlds-0.6.2+dfsg/data/countryflags/CU.png0000644000175000017500000000314012140200333020076 0ustar felixfelixPNG  IHDR@'IDATxOWઠ ""B&UI/MkD@Z۴M%MZM | ZU FqR-.s]ٕ=sI/;{sٙ33:IOOha퇚'55hpbOHH EvMHCqt_jȅIII%@866 ++O_1ָ~x¸l@8E Ѕʖ lW@Ɛ/Ϥ"/&k8gVEAȥ_T~@<fm4z?84S YpVEm*_la>w8(?&ZEWV @"jd+#fPVq 8sf:W@ͭn^a4|he@Eع0݌S:::<:DQ&}ieޯN4&rZ=iWA{2la0u8B++YZ[[&\=7oLU\ paeDG҃YV pd?_HhpyJtwۃ;jc{odJ {7L+K[?Z[[+@˂BSR #b_۫h,;`J) /X>=nC3~jpp#@MP zou>(NmJwCx*GԈMO@EFAl߰w]lŹL dSjfxnQC7EOy3& 4h@) G "g@E6`?o~û*hvZRNC)l6ԆB?8p4vՊۿn cO]Yf9%~(0$t iV`ZOe]Hyi8UOWXiFߏ<6Xb\& y^`tT(&7ҹCIJ  ?&T [XKյԃYC?dڽ*8-w/YTWOJ{ȢW{esQWRJJkȼ/ HJkQ T~*6<>EG4~6&eS\ @45uF"%,`ȣb.%`âM L xNdnP+u:lPҀA`D ?glR'u4E1+4kHJ'9\I wf;۷c"""u #hb*krliӦ!(( Aj4@F.V@3%cm&CpppG\pk\Jff.Mf.xsX;3|.'~\V1ᱝ ,S` {?& ]\ ~sXs'Yz8sXc?ёsdsd"ר91.LFnp0m 'B9}0&:l+r5̣I Ux>$.ϜwvB[N8czinV.^MFt|ĭDo0Qc0g}-Y9Q/$usξ|!9,UߣA M@E+muOLpG 嶛TQWWbłg@q_9--Wjj:9+Y`h}0iΆdj",6޺u MMM魭Eee%(Te8TWU7n@MM }-  L#TUU:ۥ[̝C'³h/5:\.)]z4 C8\H3ja g9HMpu,:;eƱn8civ dzjÆF07[k(Y-}uB:-/bq[~Y,ZWT@@˭-E(--NG2&@M4uyKP@4s`(/:cyg y|fW25Nj i pPp73hiċA!f].zv-ي,'Dج}wM3QycW:qA^psvsCC7qzl^chW-`'}cuAg:Ȝ, q\/wIEK:ХHru|M]h "ix{ 'bZoZ~oeVMN c I_C 'q#z&&@ "G 2—{"pd YzH\^}e`Nl8&hK<zH\Nd9t=/hدGkE7DrU# z #446X?uT#j!!! !{@TA`dh:AwI3/[;5B9g^_}~Ŀ[uq= >3'\x *kl`& ]p3V*ql @p~ d98(fx>d]-JϬ)KKj>`%gVG fg:ؔ /m6g{y?_ӵ}OL9&hI> .ֽo-Ի ]i@Dp3/5o?K8SJ?f{?,Z{z$W;?ӹO `I:b?t/0qL:N?$90^”P_]]|FHN0ːO3 )X#9^T/~axRmacR>LXxrnTJ1$'A;Pi3٫fЬ8٧}P~Hr1HGfhOT`t@._@D|A}-(h< 4V+}(WX,Bu0CX=. wݣl2V[IT\! Tbg޿; 0- ܇Az \<*+^0Y)yyQCeqQeDN<|~2V* 1a[2jYA#pB_—i '$DO'cwYU8}fIQKF#~ |A S= *CXlٖA `G<`6A;)"/0x0LZgT^k>uIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CX.png0000644000175000017500000000500012140200333020076 0ustar felixfelixPNG  IHDR@ IDATx PgG AA9L<"\rGBDP/4* HPQBȥ"oxDSqDUedw `s4UOQL@_"DEEaرWزf}Q GPPAA+!""HqtZ畑h\2ikc c7# ߼ߏvc\K @T |#$NY}Wi2 (sSkZ38M}I-K 2KW 'тqIRUg'%Fii][u/I$e#n)pY5w6T?w: ۍ^sf~Ue+.c{HdPbc{W @HqVA)wPw;ێQf1h2/eQ@$8yD T:^6! PX)P MIH{˼fL^W @XS?.mNx{RznjŮ E>GxZ0j'1d. Kqi(6.}׆bsn?PBf=f֎z6T{ /׻y)|ոvVK_A0@f:~a UƐ@L''KLP6aUz,[ު>38{ .۱IFO;쯘BM7~V/* _ \ Ϩ24* ݬiJr\'Ƭ*]_ţ5T+-=^75f.: 3 RY)MSH@># ] V90Q/MW!ዓR4ѹ`f'M0p|$VlC"ATFd_VOZw{mI#̉O,R6 Tۢ !B8Ko̵x#]l;?.4n Sm S~23VSaYϊ} @VIL>n^Y27DQ0U_X9/PGUPO9dn^%h<+Ŵm:Mت32OϏ~+ G bxT _m\@{O})aFy*dގpni4+%#2G q2?Ary*?z [GtOsn%~4S 0R]nf1%6(xVOCW}LHϿ!ŴIdOOa2g{$kvm1lTaoh|,ܲ-RPz?qGqUyG07o fUcG*^iO6ڢo!.کR? ~ⰿ[_8ާǃ'->b8!xtA3hB=yXWGuQjfVr%*#]UUrX IeXU 9,ݩyKOD r/b Ni:n_dnV#pC_9.+ ?';2(#| #[9ߠ{l/ipIY_s;֣ &Aon؟:p9WCOdD&WlIlK,LMhH#H=V}=trXRzoxg pć_Hy-c+haqbh) Ż Kŗp^ꢷgZjpP%+up{6%a}6a鈎^SkuB5f9yg7.s@fÄ[c+m*i |m:˗i~p -F;L8L0-jښN?inpH`S=\߈g{RA8G1#R0ACpy/L?0yާZ,[xū[kvA3gPSSeh MEϷ+XQ.ۛS~dUyv㚋.Agly{LG7& 48H}ǡx˔tV,ӂ 0I)i& 4\=>$IӻA6.{!Axf7mT >x>.![v9x6r6X6s59; ({fk.a}2pĮ@J ,yͺ;mAgB8- $*jhȀÔ0T$P!xk """oF4FIENDB`teeworlds-0.6.2+dfsg/data/countryflags/CY.png0000644000175000017500000000356112140200333020111 0ustar felixfelixPNG  IHDR@8IDATxyLWפ6M&mƤ5MQZӪ)UzxV@E ArTAFAPCnd]vv~π؅v7fwvggfyǾ7 ^`5m`P֐EP 8(ۭdr+h9()ڶ JJJ8#Q|K,(&ڮ$> `C鋣>9 iXh6s[&#k[y`MZ$]m?jh;7yAG9::: `ԧgeR Cu:LՕx|7zGvGIܨ`Rl&1PzJvih>:o ʏt"&Cdjn̟0D)^7XK>H3~S7ڔF8|@/+w?Б=:% mVJz& :nyD^\(J;P whhh*|Y`:bg BT{0E>je .#ꀏGlYw}MMM̴L: [RP4@eXvOÃ4\2#OƝt뺌=t+\m<}1swmODq?/w'8a.~فW)l{<2~IZf^,xV;\l$v `֔z0 .H+D̽$A5×"E.,*)?Ly1qAfj2ƯX-g ƙHj9.ߎc۠;7W~ǪG¶mlhkkP`B|F*{ƙU^SX3f5 U8ك^~Cfx_ǥ$pֆގe,ޟY곓C Om>'2زe2zRz!f G3@U|T đ+0s .ݰyز&^8Iׄ6m|؋Qz5܃#V r峦a_95#6x$,1=@[~/WxNjj<\@=:ZmweS#gtOh] VON,S,[8v 6_O=/G%tO`R/Sonn^Nϟ9sצzd@Ϟ=o899Yc̚5?JLW%1jbLLa[Q@,jF|lBEW8 -8ә4Ms~|m!"Q=== {))U."p( yJDBBRe9<ԯ߄nVVV(wGb]Gқ<B?sss4::推qw60offfrºm󙜜Ayd6/hgzzZ^[&mP|w68lR67D/`yyx RTQ ٿUY : {,--mk>{dnBO6(0j7~Qϗl> hbbpmd2Y@6-| II@,yW6H;6 VWWn TY6=뻪OZzS^w"C5ߤ'M-1~DU^388#u%P3_M+M*r|>5/}N5%~M5WA0tX_ŵϱ", Jug55TP-^`PtFVӾxS{ZAeO=Pyoe @9/Ez򹦞%H=W|>-^B "L_ Lد&g gy^/$bKqS 5qeJvI@~KG,W}Q$|VwH>C0P3 m}.W`GhA`xPQGGw)< vIENDB`teeworlds-0.6.2+dfsg/data/countryflags/DE.png0000644000175000017500000000123212140200333020057 0ustar felixfelixPNG  IHDR@aIDATxNSQbƤmz;+L|nH%P=j!1DD"`7!9}o zĆ;m8CgtFnjv<勞@}7/ Gnsh9}d_ >f&~ /HJwe钱G4_kb"ˁU\=YСJ:}Ct{8twqcddqc\ac\?_Ԙ$?Ip+2VQ=|[=o1x @kPN6ڔf+tFO!,ˊz4jyv HIENDB`teeworlds-0.6.2+dfsg/data/countryflags/DJ.png0000644000175000017500000000333612140200333020073 0ustar felixfelixPNG  IHDR@IDATxOSg8ѡ8ha2%lBfunfөqq-qK@q)ˀ"QDAiEh(PJKK/Y鸴'Aޞs hlN#""H') FFFbʕAV@ r_bi uڅ/ ڥ4Xj [&#vv>XBƔ'AaǿP9$t4}6?&S،;YHvSZ >o :(*y-ʧf?rtfRC7&W K:=VRc}ܭ- Jr_n=UzOб(t}@wkN8dGBE/υO:AT"em*$W]#J[L{Q|Nz/* XȪ3K,+oGuR:~~/aPgzWNւWy}kK l;7mga6\#vޚsKxJoů7,K _G*8pΞ%2V; ~m;5ۑTeجfBG?zN&2vAm4R`drHƎGBQ@YqkYע(|)`U;&Bnl;oP>1| @Y,P̘;$#N[V&WN ]I["gӂמrl##ޢg@P6.Z~+]!J@5sxĮfӖhCBKJ?6A2dy{cOV:iO>v!O^>19g3͚9:&1 N\<m>.@Qv$4#`sCp|3/eA9;̣3trU{. "8 =.׮9p8000tvv *UZj6˜B1p$gC]@ N.43w !6mT?p}O>m[lO^ԄF 15~s& 0Qv(CYs6gf52l8]eGKucb**X# `(yW.d_!8.u0 +xR?cz›F+[g e9 $$9777_\S̏Xv-9k4Q5~n^s@ӹ+8Rr&,f}йT `23`IZ8 R:_u2d_ެ7b| JT:K#@E=[y/@*ar2ʑx ,v ֟Cq`0X^ )pLΞ7@%z9KeCNg:ȴ ,=UuS߲q$XN `uא _b+g-[;Y/*H׮]5k֌M_z^DEE=I.Ѽ3A0IENDB`teeworlds-0.6.2+dfsg/data/countryflags/DK.png0000644000175000017500000000153712140200333020075 0ustar felixfelixPNG  IHDR@&IDATxnQ`֖@8 xQ7j@5j7 3H d;kf'EPַf3Ӏ"`L&q&dpZ~?TJD"Ji@?SN9ǞSa7h_!S^h4 zʹzp|vZ)C ^~` [C#9X|`Iy_*g  Zt?Hj~@AV 5`?`kQN+E_7˔.m~J쉸yp|sQ*DXtf\.oU|F[|2PUMD,C} 캭XӋIENDB`teeworlds-0.6.2+dfsg/data/countryflags/DM.png0000644000175000017500000000427512140200333020101 0ustar felixfelixPNG  IHDR@IDATx lS@&$8'v!N!*,a75UKKAR /um: U(+b`hҴIC#׎M=9w}A@DWR^K>|5660NEkjjHxrw3NmLNVM޹"L|"o]}]ڀ 2|tA%BWd 95k|XQ-w~d TK +`Mp׏d~5hc%GG.g1f?Ep7UV[%2 z5=0 (KPr;KM,0^v-/3ԔjOh£4d/,jCI%c91jLأ g~|RÌZao8民s8_. t۱( Hgסa<,s+o%4ҹ@^XgŔ*X C9l9HYNߘ2tP3O a``݈3y*<يa?f[#vmñ2 zѲ"Boނ=zN( sY-JڸOooOѩq !&EHtg664>x5,W" cƊJtX({ފնaR5p$CC!LRJƘIv3$DۻwRmB`WbˌM%-صc,jنX(65<}a׾\p]ҫ^ƋP_w?_%n~F߯N~!7s<9U.zŵPuTciJ%Ub!yݽ;}}JlrcX"?a-ч9cYE6Ћhj 1<$Pz 'z#\w.}x P›(=jDdQ f;𛠨3;F ]6\nB\@o:L p,; lǖX,隴K’YV:+vV+P1n,*b^B.PQcX|_ݳ;ҵ sWL @ntsв U*S 5BwC*P\YbLhʀU:Ҁe.\j U ~_åKpE?Ν51"n׮]× :p\eĞ\ ءJ+Qeh"LpCcb=| O6 (˗/… /' J/i[ӍxBf?iau!߭;r\E}m>H#W\2>Ϟ;Vy?jc"6:'>$l=Mj'з׾%zP@:DJwEU_'Tg[i `x|4lu<#R2>4%h^S=z Omxy0B؏ BH#dTߓFa?SfX+R#VpS!/PKS— k<ӕ_<<Qd'o PMԣ;f8!i]sT#̿y(g<}&f ' ya=k؆  |u0Jκ$qg57\3q~-0HrK|@&0_bgR325#`WVߖ:ЬO>`,ЙYH&ׇצLUf@|>fx'"1(qsIENDB`teeworlds-0.6.2+dfsg/data/countryflags/DO.png0000644000175000017500000000315612140200333020100 0ustar felixfelixPNG  IHDR@5IDATxyLg-c2dns:pZœNE&B rHAD`C2JVD3"Z9TsNed[l"S@Ë)|׷җI HyW {d212Lx{!H$&g34MT܄QUN.t|5Z1ϖOXup&\pYb]\8 tC 'p'pO8=1?2 G9< \c(c;O89ގ Gt֏p@O j˱{h+ΠG` 032OO(, .>XM9hmops*ۍfC1b%Į"sP_7;+BIyiP g=5 BX-k-m!VلpUbVf`qf)HG28 K۶\vͨ#ǎ&K< 4—]p(߯]<0|`¨zӐU6<~ׯ_7|`\\$H BA!O$lGjyX*">h>9*V޽{&OL M3`DJ%P%2\fV8'l@_]fێO\-൸dJC;~P^0:ZRc!^Gϟ 2v0߽{f)0RmS^B&ĉWаq8a쮛L Ծ~='Oگii2*Gb"oxD1)J["7A^^)F pQѡ/e?|Pҫ?R_I)!Y)P' M|3[=sPA<1$vm2];w[nfc#FWW߿^ >و7r,tsC4qȑ`+V++P``fyCC>akKKpHDΟyKy FBms sP9MC/\>~?UUUHVeSCzyL_Dk,[|x!VN`/1 `GS>q}M,8+'6€7I;p% `vT>1̺o=6ӺOlo v9?B0~PbGl`g;pe|`C=s#6X֎ Ԭ'A$=M):0 B*HRc@*F f"zIENDB`teeworlds-0.6.2+dfsg/data/countryflags/DZ.png0000644000175000017500000000310512140200333020105 0ustar felixfelixPNG  IHDR@ IDATx{lSU ?*F4,&t[/#F){wsLM d GBQq,J#6{st#س۾SS,۽moۻNgsMM$==] !%%1עTY ``6M&C)n :m">>!ZovOh)^444PZ (fOh0{) Bh5S bPZ `hhh| @C8)022"*HVj6 o>t9Ǻp<V\ ŐX\6-n#w?oWv~?T+­ ( 1Ġwl=gol%f9 8rxd,qjE85 jB8ȉo6 "'qb|[c8享U8l'ޙwpcz=vE%#qKP} |zk/رD:$ljxmm_WJUvɥ; P\م5܈KQVu `k &.rDJTu 7gD w_Bą 5s;AŪKvl|g\Ǽ9D&a\r7yݧ)} 7O{.^P=)QN(` SjO{8) `k)5`~ )@ @g=P4$'';צFL|RRf9 11iw$$SIENDB`teeworlds-0.6.2+dfsg/data/countryflags/EC.png0000644000175000017500000000503512140200333020063 0ustar felixfelixPNG  IHDR@ IDATxyPWF4(rr99ffn9D[Pը`UԨ[Dш1j4^يV 5dSWiwTA~OA52P]ݾHHRBJYLƆ/(esp"1ܦ 'p %:PsI~p|}^>'p!p\:|"xpYx6|"xrO?>|"GY{O!Wy`8;|w <{|8gU>@I~řӑ%DT %E)yr {ߏ_qވ B0+Cb+{̨U+h;b͛e:QxxQ 9ChԱ(W`'pY^ U0:++0/ GC}B2Fv ׳>GwYz{}-*E~QW;a{TTEj*rg0 ǾC̩ S)e:Nij[JPI)$!9 ^Q'3D9_}q헯/ىPЈA^U5""Pb$lW^y'( [(a'6&"vn b !.c:NP$c܉!6 !tGMc΄]#q[KTC'CvD'A|!ɇ 16B@b]xeWñ0,zz@SЉLw*t<;/AtuE>hSY:kAԹjdVt07 `<G `:J>ظ.v}qbU|7}t:탌X.zx~-h~_ժ V @O=R )Eˌ}m ÷p itW `IENDB`teeworlds-0.6.2+dfsg/data/countryflags/EG.png0000644000175000017500000000257612140200333020076 0ustar felixfelixPNG  IHDR@EIDATxOe{5[ <f&ƋnܕyN 031.vp2C'sg3բ&0XKa ratS)CB6_MFl<'y}.Э'777$LB-eA Bzz:`-߻w/p~јVAFFƝYհ=6|@%w=ҴGXi\R P]O(Y\~Qn Ѽ(u͕? -~@vmYhb Pgv8[Yp6ga~Jۆ~ATB|T۩zj>Dg6|[d F ZNZH7:| ZYYBVL6b~ʷek,O=íD4`&X_\qT0n_EO貾)V[@ƨzi599w,@u:*^A|}#>:ϙi9ew,@^ OYXo?V;D؃rz$( '$| r^ 0+W70;у@<&wC4~ugT=p^w +Cryv^KQHDc] E[.]eOOO˭>+?=!U@\-ڇ݌w)uy/>= {7F1yr +'do{kY҃fR\]֜A[|5nr{4WBK^Ҝd):gӻw2m ,V5ZOv 4ɒ'=WJ `45`0z>a?3_Ju"?[kRV8F{XaP@qXaP@qXaP@qXaP@qXa'e rrrpڔі?pΎ߿ߦr +IENDB`teeworlds-0.6.2+dfsg/data/countryflags/EH.png0000644000175000017500000000275412140200333020075 0ustar felixfelixPNG  IHDR@IDATx[LWǏ $B%Z4i҈i&<N&>>٢}EI6b P.FB[PQne)N ,_7 YEg/89̒H8 цdYN_OJJ !D-RAHMMUʏEZ]ctD/ϖMt $:v'@H"üH>ea  n@J -RLe 8QN<ŏDKe ) 3\ \0$p/r@<"H)%@yCrJ0P FJp w([D00+RMd dZYExP()Ѩ `0B /n ЍHsx847{5~VU>zFa+xݦU; 8nj0A:.P0m2-[pAA׭AA0Y_V欬X++W;w3om||u-b G\ zchQ:th֝;a?6;; R$UyS+?|-&;ͪf8r|){Xmܾ1t/ ޜ= K`ͅץ|vRG ZQ"kk)rǎ5}0ئZf~ziR/t۷jܺGGG+K<6Z).^uNW!f` knesru.en>I]y+pG.'&&^|^UwiwO3z~7t[hq~eV (b022?>|eU.pZatŲGhɴ}ͥL)< ƫf5ii{(Ԇ˚͋ |CcQ5D/<=q4/T ^XXʽt[C^ǏCt>x|Jh]?9צ "B-F&\zx {:`2_( B PB lg a #mW)f!N`K]U<׏Oٕ/~("CrCw( %SY{}A CD}=pKg/di,/p++~v(>TR_+pR P B'&<n(_|9 ;5|'ߓW=>y qhH0+"z= ARRm*Y_OLLŋ @jj+@BB,SihIENDB`teeworlds-0.6.2+dfsg/data/countryflags/ER.png0000644000175000017500000000640712140200333020106 0ustar felixfelixPNG  IHDR@ IDATx]ytU[VV@A ݲ4͗= EBA@@dE@Y*JQ+*uvQF ZAA@Uf-y&%KqO/9{C3ͪ#...Att4ǵ_zA߾} ͜WXN~DDhtjDp-—qWJ]JDFFw/\1Wx'^}Xj!{O&&} &!fv~ [,=q߄z ]F*odom /w9 6ٍQ([k30`l]w)*X{ 3R zLA&okn^&kLMY[Nbkr@Ni_/  0bcZWz׌~.F4L_1m^8; F{N!w؏[^Yq?7(;݀XgX(%f7"?V'(;+ fE`%33WG{ E;H(_p WS( ^#ʒ(Lg^݄-/ྭ%Mr{ћki2\}O  AfV ~:\KGB8!NQː١NPmezL%/yb>*%Pd%Q4K DRȧBq0YE{RON xCӋ/yId5lz+R(,J Vfn}P*&jxA v5cʀ94Pb% *s{@- lgB*.塸S^} jp=i!\jEi3bĂZV7άsl& ֩&XP8Nhfy.%"Y5 \%=WA;zBZ7#^E7F ~!"l!}(_4;]gmDj%?VF߶ZtTBNB`H9g58وWвVϣ@d_eDB*#*\W5E-mdjJ EK*^#i*eJ<ʜ p0+ؿ7jN/IpU[VI5*>/B>Z7ڐ)/~?MZ6T9mQY8ْ.X(l󃼾 H(||ȺsYq"#'FQ'~ `GXSw/+ dv6=ꈉ70WDb fI 醩J=؆BTKῲHGTjAB$@[<5?ƵE#[^*3&EٳZ z . )F +H:i) ?ZADYsX3>*zgqDDtI zR$-~Zr~# ruF $=z;C+ZYp3hi7rz6`+c~>x8 GG=tXuo~x<yPGpzS%`d@=𣓗%Ԯ8eˉ @7mj#ImK@Դ]@N`sH̍ND̏]j҈1:<ΐCXăs>sJzoL>wfJY($1nTR] !Ji{4o'mpPL٩,|tyV"**J_zѸp   п/sR .QIENDB`teeworlds-0.6.2+dfsg/data/countryflags/ES.png0000644000175000017500000000417612140200333020110 0ustar felixfelixPNG  IHDR@EIDATx{PT/,h b_ `E|P >a..F"i4Ni&}N;M=nM E";w8`"##m R( 2>p'j> g-]4cr/|&N?|& }-)L!B6&P9C~>@\=MLy_g~&!Z?@@3%  2a?]~o(e ~}ac~pLAC-y3w:V78Fށq]9tN: 8c#\乮"k->x 7Z9&*=͎&U =-Smy,utDy[5 Vf1gy8x{d,!?P{U=4 o "L@+Xhɑ7_ERq6HPDKW@Xxg=am JϚ_ߗ,&O}㜱w4Xg.{/?=|pT睱_ߞfrXDY"f qY.N"B!"@N߃V;'h>!4'C^\kl74놺v;>tU &-zxKQh9|m)#[ Ld?n̝yPfok h(DS )0Ta``Ze!'9~/((pQ>{d(G 8Jxᜡ GPSPW9Y۵W_j]8^´4,ky },Dj.2xMўUޟ 0W\gJ(ϵ',뭣`h[#yd4-BS(qȚ+ǫ/"d+RIw!-ץlR)*xJq2T s0BS{ 7'SFX ^#dON@yYN1 #R)89*4ff:Zq$/J9.tBWg'6B(lh%]phpDM( V7y/x"Z?oOgWƌ Ȟ6HWAq%#2VIPi3ۍEw:,!!9e&sJeӓ4;h9GgrJI PfHUrd.3LLW'cLW*PZ) ~0gHЧs9]U`TƅJ%Rǧm.0*Uarl#_LDE uiǖG|Xl6c(渢dXv5bq5r]@([@29qNFq @Dw7B_6q WFmQ]LbQ.io!Ĥ)doV 3e&Eiu~f$т<żcPR>720 Gpȗ;B~~f׆i!F&3/%9^^oMbJ@c"w5'I7BǑO;=|7Lc=7k[Oxf_H'Q\Mߕ1t8O>$ʳ㳮t٘La>9BiV'p`|É-:>(Gݱ"7.a!Rb.[@ 4|R, ܌SU.x~]8[] [(A||TVx`gnnl/+`914%KX!T M"jkLN{n<_$ ŝ8WvE^“cQ\쎌c#gm^,h=DK,M*\QX4Qm QEGbooRI­sv!x\ V=z)f>dE|v Z#~'6߿O9sLZ&1Z)՟o-% Ikiԓ~t]1P1aNƊE3IT̕A1 3,W:R7i޾m.[ 9#D}X>vzBNǦ͓LvmZW;823tNa| iO B^TpPEJ'|^cE#%D=\dY-z6Cn ̶WSQk[&aJZ5gU,k:MKWi}=x͐9 "c8EM2QKq|xStoRm 3,W GEm>~k~O|MOE.Kk>Ǭ~F$ @&Rc.pG:ES\ u#=$}?lt4 RlYŏIfL;wkީ]Q3X O^oM%^c8W=Ewq;G,wcy n͕Fg!4[h10Nw 6z'9niJ2@k4}F1ؕ>F4-M曮pS1^ce&EiEm0,Dx???&|G0B2_S@IENDB`teeworlds-0.6.2+dfsg/data/countryflags/FI.png0000644000175000017500000000150012140200333020063 0ustar felixfelixPNG  IHDR@IDATxn@`?DռE$7 ҅mJozӾ" E 6mpj$J8BM*qj̺6"x?DBB!jHTU2ո%PBM @V.8"G_(+f F!j x<~R>0P`{p0L)~`6LZ-0slpn-{@0NΠ LUY9K}N:Kpg9pL96-7-(V@)* XVgGsqxʻQ%)q{KJ.]?9}`)lV˵^i|1{z2;^,Tϭwfߛ>^neWWKst yưxp2o%W/dzrc ^;RO#JT*'F>"L rqNg0pxp@\s>\.c^+1anX z@|gN@@=x; |@^$|@&LX,Mw h4)PUND$A>`#KIENDB`teeworlds-0.6.2+dfsg/data/countryflags/FJ.png0000644000175000017500000000622612140200333020076 0ustar felixfelixPNG  IHDR@ ]IDATxTTƉQbhS l(ذg5b41y ET*JT,1J4A1nv]][pwޙ~3;UγrvvGJ1$YՔM@&rttd[[[tdUP3k%SBZ ޳Z em N(j(D˓O/G0 I5*%ċ\Ѝ-3wK@pC,+T<*_~5V?u4cy)Pyߟ'nrpkknE5 2 0@Pyu(3cu_Y Q'E*σ,P^vAe\仳~jݏƆ'cxFʗz5^纍įœDxWѦ*zۅd)7dG6 [2,]lD+.Im W\vuAQ>eV`kmr8PWzH.Gꯨi+> џ"#'? V@S>.԰uEC_ sT/ZE+5%P&eH@p_H|.뵬K򪙱9G>^6?<_u<)uWylB4v=pu#K}m4>J @[hˤh'ැ6UpPͶ&WjR)f[i- KB5x{3(#KG;뱟4 V[Myy-EǔxE͚@~whUt >6y=t5+}F}p`>SĀ g}5_ o1$V" {;H >rh·2븡!l]6tFΛ&e =7mdG(LtG>'BHqBƬ]#?@HrVhN<`%ViV)_Z}Uȶ\ |v"{ Z}~OqBQOVA2Rz(dl{[oM<'7۟*`/uP_\Ǝsǡ<%gKA@9G X;//1wK;U = aDch̡QiˈCiz TE kX]HڤjPm,E.&8ڌZkd@Um3Ysə~BkH{-m%#0.u4Hߟߙϙ" hM`3pi<䎞S&$7{Կub'F8# Lic&#ILskh p:t iZO#*: yyyl$_QQLd$&IPW#?#("9Gݞ?%ix SX!%%QQQYSC~> ?{y><@dilݽpQHԺ7n܈&(O^l#` R`=C5K2̵Oƒ_Ǿm۶Ϗkx7gtݱvq7xzNh-A)/Bo$''gΜAXXJKKtzS9-lޢ֯ .MVv3YYYigTHPNX:5,6{Yflwh}g> >3?bbb|;y S|!hLXx3Z\pKDs<q 4W}1zh$;Eh44hsegܽ^ @~J\=VӿMŔ)T=-ya`suD!7ZV=5x(iS'&x\f6QR[ RKǫv}%Uvf~M+ l}CUMjvį8hwRgPG| Sv4mSk$'''ۋצZ2Nk:(ƫ(y1JIENDB`teeworlds-0.6.2+dfsg/data/countryflags/FK.png0000644000175000017500000000776012140200333020103 0ustar felixfelixPNG  IHDR@IDATx TcQ6ii@jƦI*( 0 0YĀ20 `F@f@P*AqChD{Lfљ!sλ{wG@͟?_A+hΜ9D,E5@5w\̘1S㛘KsB!7̜9Sj|ߙrܼyN>tt<^)w}ph\ ē{dx ʡBI>wC}ƌAOt4>z$+G^~72r_#jҤ0ןW0'ZdgU0$w=Cv4+ԃG5QZCW MӧWdH%ˇ++燻~;d";y]='+ I$;8;@*:tt\B[d_@oo/G$p]?y??{O+u=~E|g AI -С (DSS.\@{2>dYȘ!^V&*x doZ `\1F-di{ּ߁e;=XL-˵`d?{)==s9 %9Eظ:L>7ӽM[6~) 6$Y'rkqݎI{G 9y#59CNd9?W"I'N|wG.w s`\wH%Ap4#4}] v*]N!""X &Sb+vB;MF&WoᜏwulI3(ol۠k'AѺX`xEQUr }ueah/VgNIp MF@F)+5\L?{tLY7sLu)VZ|!݅/pcg"~tg(NH =jq4Bֆ`⩰tbg1}>CkCBpfmvBRZ]yLE]I+ '6GAÑz#k?vmI!q9"ٖ \-M'۰el>l$~1~w^_CNF:bC #x҅3->(9x6~:fBuCe]+ƍckP~|񘹗 0ĉ-Ar؟#s)CXZ,a^ ~ 8aS,(3J 5 9عrLFU|-JVDs?SQh>L~47b%ؠ@ݍG$A_R2fh^&OsʬuS^9lB]qD)|Tb5/ ~b@%%PS-ARD(R"aRD>-8xn6ԣYgDp3乸U8(@Rz'D nC#RBl6lÉ(ۊԈ 9 ~/؃ƶo!jh=܈<ڞMѡ3Hnggw"((%# U!^F,LDj ӂj?!!t6I~();m8qzwW佄`8/oSR LH jDaBD nDy2 ޗ! ]/us2-L?* .pڣ c f}שp|!c0.NT+O #쐝hXӟV3;R!ڒYiG!#"[x_"c rHc }|GIKEƆ d$Ѹ?zknnjqL '|@ۼ<PM@f rcF4Q]>MnHж0իJm 7ofϞ6J= 733~$`nn`jj58!BIENDB`teeworlds-0.6.2+dfsg/data/countryflags/FM.png0000644000175000017500000000263212140200333020076 0ustar felixfelixPNG  IHDR@aIDATxySSWl>FHNk-vZiAZJBTBK R@لvJI IHr㽹y3#"g{rι9S %<1 HJD:$Ɂ4$%^H`0XHJ.EBfLf7'xq28|'ʺAo$ȯ%xOḢK!=:8oG, &I9.g@vDgL$?񩪇& 7u=ƨ ov+cpE.> W G'pu,!)^(hOHqX8Q}~*"OHëaM'|~6 ӷCSqun$l`wp}ymC[H xw`vcn*޾X~=$ ?ڽdal>'tΥ(3OpD :^( 3jGCPpE8l;.r=!:|z\ }в?% 5<(fO.4C /:dp2x{kѺ;]^W[I6 …$#v HŹSҎ?[jЧnx „8 87&>$=%C1IR`2nq]G$ W$A.K$ @@ÎRIZzqo]aU4X,( I$@ȸ>&ba[7TvMq͊9JK.Y<5z#x؟'?X\x O=I}$λXpy+6$Х}8'l64|?xє*Н&1b)kO;qV-SׯwXԬ“X\PO(nVa]ҁr+>1\).{ֺ $f_V.3qnՈJ6ҎYFj@rss!+++6%E`𙙙0 b ^gQĦIENDB`teeworlds-0.6.2+dfsg/data/countryflags/FO.png0000644000175000017500000000174212140200333020101 0ustar felixfelixPNG  IHDR@IDATx[Op~9%<&@8 GDP_+`< o0&ނ@Q6㲍M!oa66h4y.tYmE#"-;VBHq&W9 O{{;566r4E88]ʓoE}eU֨)Y>HIfggirr$] ѨQ>*B bF @$0+++9!b$*~I"x<|P;m8~Pr]!r] ?Oy8 u9:bpt\ w*Vx#ä~MZ3{k|P @;tF*}yxȣW,לW Py-N0,>qU?źL4pnwͺ2mmG_t/gcܰy:g7P Ao}\/>^R5Qr`Dxiն 'V6O?[z+q-'BI;(9q6~~Kw|.2U*Ao>Md WD`nnXY'~g@D" !{qX__`0se@+ >Av( ̽p@A|g1zV w ;[=([[=xZ[[)loiiA*|VB(ޣϸ+hGpFIENDB`teeworlds-0.6.2+dfsg/data/countryflags/FR.png0000644000175000017500000000145612140200333020106 0ustar felixfelixPNG  IHDR@IDATxYoQ%x mGj\1bV F.!sΉm36y/Z}>Ι3""kP>)l@(a.ƦL?cdԂaR>s):<.@`1 @;~ @|:P~k~`@ma~_xn>@33_Pu%ާ; @=Wp.뮜iWǺˮ pH~zu:j4T.P(ER^T*:jUVQ^ןm6jnk=}U2;zXAu]]f>\.ltp5YlpNO;1=)D8_Uc;w#=bfQX>p{9W @|nO< |.`Mp`xΗ^N ^/XPd2L&G)U|"@ض=O(xLLIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GA.png0000644000175000017500000000153112140200333020060 0ustar felixfelixPNG  IHDR@ IDATxoqnH6+s6mWSĜĸwq!HD!$V:q4d'l),qLӎou=ߋͶ~73x<^ 1R,?H@14!a `] ͑ ıwqa@k7,bi_ H_CX? CH CIi?EÇR(CipwH`C1H`{kHg29=3mzA [@pc;|xi i@3Fӥ4@#o{!|}O ׽7>?R4Ӌ\ħ+ v=pz1iǬxC2G.Yw챬I#WMNԟ3НCC/̂4܈`n1ZL;os=!\fTL-6;fxhP`bw} YI燯 3*8om;ԷfviYsL H,Yw񁫆Z:`ޖVSZU4YLJ2Z ޗ+`[bؖZ PCuZ kr|nCOu;>HrR 4t|x:*r_  KszY0X"H6E 8p8u B!R~_IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GB.png0000644000175000017500000000546612140200333020074 0ustar felixfelixPNG  IHDR@ IDATx] P&iҙd:*tPQm4Z|'MSZDkjL4U&=ذ wj`&j]vE R=bPvBH8!~3z ·>B]]堩æ'𣁁 3SPl􊞱e0D./O ! xb#25S ީ#;5H_+'7 vR-_eF. FM Wi_!kur"7v+9lް+z7dF'IZ;O>/mP/ƣ<6Itm0D7 rb#Gr zBor hv CmCVA0NYX&͒  oM9b &6r"7-ZzP *cc4Tuu~dy 6.{$nFnUܕ&<${}OF.$[Z' }x.oq"*nFby],Ù4Abs`KTn}xPyPQYmTuAG{dmaEܬpPK~PTsi?4O3lkP5Rk^rwzRU\Q6uRys'4Q+ mZںԮ{ѯ4S6vԔ>ꛬ]P 5~ /J.Yondh^U+K9u\ȝz.|]ˎƚ8y:T\t eAz[HJ9!993|70 Vnf)ޭR' W:喲1@͍6j]L6ժPZZ'-\iP[[v As 9s@ N,g 9!9[qEw0, W~C t{=7E rXn^ %/9fľ j^$V*yR!jMG:Z)>kŰd7uo$ HiÞQTXBe**k&k:G@NJZ6CWZBs/pEiȋf"O|ikXX>ؗl ~QzZ1T `@K%K>-9k3W;g:*Ś>d߲5{魟Z/,1sv<|@K/reOfyؔ(H>)LzώX=:2*5Al`l?ϑ+/1є=}Omȅd7 1o.<9"xbFO҅!o({@&nGNe6pe@@ 'bNr޷^QNfc-me r GrK<б 󑨔M7l5';+9!WrִvoE\b^L͜Ūڡ0a9} r$Wp׺z`,k>ڸGb)Š_qoWtr%grj&#}D,c}(Rb^EzQBSxPA:DmZ.fGaz+}aOĩ5A(X_P(Tí@PkPQ#ro%cbAcM&d!)Fgz j6֤Vj2s20 =#mK)'o,{oyT ytZ]; #vA>dVj HBl`8Gx;>Ss0uGnXV<7^A⛋`ɲm0ܟ[b7s xCLmb\PG5|%D&30v5HPAO荸Rg 1i$5Ӧ.5-]oq2IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GD.png0000644000175000017500000000515512140200333020071 0ustar felixfelixPNG  IHDR@ 4IDATxyPWDZ٣Da&x "HlJ%}DXFH׍.^Q FYZݘ 1J CLWwt_>|lEGG8ƼnG_111$qT<"@͏ qTnKZY@\ֱWukJ 6lp Uu+A;oX)BvJ LOUWj/ q='2 Bh)Z+dΕe[=I_MBT;'uf;g}u8Q}\,1~ZT[&wIJ9WVRVew[F2/{gk]6+ǣ2ꛗ~*c݁~,S04*-m$ׁ~$Ʀ} [PY= H#73%:\I; ͪqbz{q Y_ Fj+؟]R5 YAAµ1mcئcz n.uA[ųud~ cKzDl08k0+ ZIA VZңki$Lꨪ4e8:,qV<3a\a˵MF Lm];ghI$sJ 7NmO36y* s??,uxf3/dH?-N;Lj|'DXp<,6o`I$5{hq%D[jTkjxjtJn{?s;sV3&Xns"5Z3jX د&8ȦGvNp7╉Pj1q*묟{) :4w!BC0=7Y=ҋ&1v ~MAPJ{04z<>%Ɠs"&I{nA%i͛qk5]@f5<`W7m7fǵhFf @r@EXD_,*߂&ߟ2#UX7=;!=d6mdh{ݚM'j`vTb%߾YdV1$dž|쇛~]By>7 릀}WX@ug':<{[GX[Onvh_=8"w ^3us|=򴎬 GX8h~t {d%lb3ςQ8@P]9()Er;1p7Ea*1黃IslDސ]^YkӺDGC[  p-{Ȕq&^vA@DB5.krs7HƸ`5^>zzX n佢 Y}@(2̳9AQ{då(-GKJdU(4qak+1pud z/mycvZ(5o<IZm4׾C63VGDxs](E3_6kpꠔ3muR_o>f]ιM VB!` f|쨲HX;8Ќ{՜ZB)yy5,+SϹl)caK$ˡ q8Ʊ=kkI$Nm?fS#hp>qgowvA'b~,:ƴ+=>3}GUm``x-}&)3ބAdqQzOt5"/e8!@_FJ?麵_)_]Snh*KlfݚPDBвcڙ89'KY)dU}"pTNDn%])= Q|2H*]h9?r,c'5uO,@<ϟZ5*[g\=(ܾM{?gK`WY?(DK<v)mKI+A,y>tĥrT;f~യF)e|驳$g\ b"T|.U#@L #fxX kr%WhB0 4(,QElmyʺ! qW;hԨQ9rdڔ{|@ 3ˆ#x).JIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GE.png0000644000175000017500000000307312140200333020067 0ustar felixfelixPNG  IHDR@IDATx[H_72ꭔz "P=U * w12A3%%F"vnfGv׻gtv7uKw9gٝllV"pFT6V͗п233Lec$3'%%QXut]RH5999e0 ! 9̄o >Z[UMM5 mͅo N ŋ=`t4oV."kPPx{bXZ۳GH@ƍ0=c@b엓ʢ/@Qp˖@Eƹssh͛@a!P^y';~ W!Fa$8|s@Cg fuÇϞ i?77ޱ7ΡXƅ^n Zp^ޢV{ IlCmm@]1p:06ZPVA#> 䱅7s $R(`r,{&vu rHrJrI?D^XW?_AA~imTC<˗aܽk<|}@.Y̕è4T+W~֚(* \^mh0&6~s,ponnK`hY[ RQrȅ t^G]).)/ٻW;r+RB۷9so`Vo`W 4ƍQvatmՄ`>or}冢QOŋ g΀K@ y@Yݲ߁ %%O~'@,x4h0I`oCA$<"ssè2&ΝZeH99anW" νӈIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GF.png0000644000175000017500000000314512140200333020070 0ustar felixfelixPNG  IHDR@,IDATx{PTUkٻ @`$ !^-wBK{eW%KݧhKA1¹e)ր;k`ʎ×6ms ?@mHCp%O齳_ظܮs&d *HT6Bk =Hi+RµxsWS6#z\}ɔ$3`l@QNVσ)"l\@#B ]?&+-G50Tɦ/Ϲ'/%?83\)4^ǩ 5t7|ĵ-:C 1Dbo.,LJCjGW }u+ͩztj9ӣ㟷dX=7 5X&@]0dr4'!{V5 h0ww= m n?Ms8gQ4z/-K}>720*-pS>{CF;XV"h?g ^l'2S4'Rk&fb]SG>x4 .٣ĭf.6oG[SإZ=aZtzŕujhH*P"ϋFUaq5P7.rNu@~]#NIȼe{F]l )N14ڼEWxf $ Y`D~dTG?tbEY=Q9u͡=AH"n?R(YCk>_N IG#[gAg$K~@:dϖS ;;v'#H'Y/ux$F-[ڔ^! >33rrr%Ke*%^NIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GG.png0000644000175000017500000000216712140200333020074 0ustar felixfelixPNG  IHDR@>IDATxKoQp4$jZDui.ݸ1qabbbܻ1pe¨j`C 4h8f #3rgwa>5f||%@LFGG1>1B ```Z1>U8\ue=7OM"b1RnD"AX-|R50d2[z_ҋ`kkX c5CP4 >& vh(>inL!`{{nod'*RQ*݅xX>3"./1v9>8 oAW1-KکoDmAb"?!!hx/jcYm{~y(P(p!N@8onnv'D"022צ{#l05 0K`hh(bf±IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GH.png0000644000175000017500000000220012140200333020061 0ustar felixfelixPNG  IHDR@GIDATxILQǧT;c4Db$@)QDMC<@ E) (^Q|+PLSg;.>wn(2f'gY;! ~!--,=T' p3&36IlL'0Os $FB$RuI6~$RV? C@Dk̿O nΟ@F'P;~67O MAO ]'W~ nJMEX8q7BPTlS;uDADҴg W|Z'd ( |i7*6cV|2$Z9;*yw21wzCՋi{2B:m@ o7zیQ}$X5y뜭(1ﳰ{t^Z$H066䟠ei:m\oI|K^]1ya/\a?1ӈry.~܊7MFx|I}RSSrI(덾#Cz= 3l.\3R#4b:}[r.p~d SoZTmT{s0YJgw粰}ѓ2]3'zhI V]Cdğ`Xy] ō*0 ^E?bUّ21je BgC¤-Xfj0' KP |g FFkRX<[qLWwPN pwI4ľdT}FpSgVn \ <IR|&+>j%`}}WXG} !OT|R6} P@z>RQvH(M|}QգYYY)_! >33,7@FFE $IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GI.png0000644000175000017500000000464212140200333020076 0ustar felixfelixPNG  IHDR@ iIDATx PWǛsz8TcFhȺhº r$,I%jL5h!aBTt Q4)4 1z+.GWyTi}|}ϙvf`gUn}{=,pGG& JkٝWtt49$+#f~XXI0W6ݻ3R9)\GtĠ1@Gg29+K`ݴsl/(pG87]Rgׯ_כheLI~1}8,xAIx4Gű wK`Cq)@KQPmWΞ g*8ylxd?? z3CaۚR9 ?jjf~xV)\7nx|(A!qnlx,XX2]$%òaiwYB; иsKކرNݡZ2 RΜ90'8 AT?bOQݍJ$xrp%8zk=rCBy7o63`$Ο?uL|U}NP PwƟ+q&^qa"$sZT?X! " nz&<ܖ@]ܵ~xc"rmY9& z& s sq, s؇2`8z(ҐhWUς tH!Qa.\`| >n x;55p~S`"r5Ir1L,[!S}? վzúY>%^~6֭[-Dpx.]] r^S=HpO=@ɜy,gZHy >®G>[Kge ˗]^"^PkqLDlΞ{NT'rM6T5&u*[Dr6edCy`<ܜ? xuO̜'o?ڑ=|C:׹nJ]\.t g7ˡk`0#vP 9|JDCCIYjKg 3׊6?ǵk6`{̠`گW3eu S=!A͑S&9s3|͙'vU״}8q-Q}CvN`=-ȩ?)db鯒ZIJ|LT,Xt5|sd=@f8fF{^ԽBz &0@ <gpNl휁w7|8m )qL? IN=q_5p& ^k,^K/^Ǐ[|LHx  ( K:͑T:~\ui]-}=pdDR Lc:pNX%vk!dիWLr: 3Dh4IX=~R>3D>Al̶E+XYl rLL@c]PX" <ͣod{NK:cgف.?(S\P)?S MMM{@h'O-+ 7thMSu]a+zm{B QR:]mr{jBBt-@)˙ҩOݘ&* ^WAnG>3@2uwzWpT3i27`Va\03 2y&qtu&pZjXa&M y r-XbK?TKn!O* ahRZuWC:6 ҇`na=gij%`7Ȉ!7 =>*A-!Bt5䆈P鬆jP$!~Άb/453]0,;٠i*,LewC9T|XieC x)'jX8G[ ~8J8gZ4/`7~C/|U RQjx&M( @EѮ} 43xPR|r%¼a^(#DEEX(@[)͉NJͧm@zSZы )66)m񑑑GKv ԝPEY"IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GL.png0000644000175000017500000000215212140200333020073 0ustar felixfelixPNG  IHDR@1IDATxKHTQgq+ej z6E"*VmԦEADeGQS,cLM0|滌2ڝgsY]~9sU l.تV! Ɂ4.ز`0(SSS`377 YjPYP399 P,Tt:ʟ U, T3;; 6aYɃsHs? yg$ڮ @$j{,,> Y硻e||OH#@CܶjrWiN8uaQE-PjsD*G/7IgdK~+F>&8[:B^OVxih߇[bs-Mڑe_6lOOR{w߯j|.o{mRb+=!m :S`{oOgF,izǦGL&'vM*ǚ C&+uS.~;k;t\i{޵~]kt;+Rl˷(ِ!. g}2||3:-Pp,uq)۫ygWSfATPYOu .M29>µۅe[.˫k|P3O8H`1iMT@l ~j˽p,J-^~-\P{=x_Sv J+zpP9+8KwJ%@EV\T0|OW[%"@>Iӳ򔺢QOTݣ>/MPh 5M66@𙙙 ^ C( B nЛ=IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GM.png0000644000175000017500000000142512140200333020076 0ustar felixfelixPNG  IHDR@IDATxKkQY;BҝIh/v^Im]DP6MVDbqJDp)zk"*d/UǙT19sg)y/g2YTa)Ţ ]f=@||%Ibi|D y?&fc ]*>Su/).t P[ׇ M# QCD n? #BOM˓? fgGDlo? 1b#Hnُu#1_ .l|`/_"l_v5M[dW۵=|X{ 5rm-=xk>Rv]G$#Y><H.<:S#>:z5ro,GA{d~s# 1χFJc:Ο[[(Y,Z2~7M0|'Qo0w/yH dg0 f%F3 /C94~3-H[^IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GN.png0000644000175000017500000000146612140200333020104 0ustar felixfelixPNG  IHDR@IDATxRQ~ >HETDDr˥nPA-˅˲xoZS C'>_lXDd5\. !IPбLյ )Nu,8S+?JX:}ɟWɾĺ}L&|`Hc d9"~kph|`d|@m@*i. Xۧ$~)@ s?H0z@Khm~`rZ@;?ƈq >|@"~`b7Hpx@5NtWԟ-@xca uuZe~>MЏ}{dMs 6}Щx`GOn>|hӖʗM_lU_cebGz$jEC{^yؾ!$>D;/T*@C40 @9gsk*sm&Xo+oR>07}ӆ3zݟ7X)%uX3vQ>D@'>`T>D Zk>D>&aݚz9/wq tJƯ6Epr98~BlG_ ?SIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GP.png0000644000175000017500000000223412140200333020100 0ustar felixfelixPNG  IHDR@cIDATxOQ{@1n,KhL &zEQ >M ^ #@r/ _d} }[sIB --9wGr_˂e(bCPzg uVJߟƐ/|0O3_ltsV X=OC'_~ܲmW=p;z"ۺ$@|0|{6.*"ͻMR BBBWWu}mĐn+ХeaHZKg^#k~VA E} u]K0t5kBN -6,\'->qBߣv= |K7c` /g R%+l`Y jȿKrA>HC/֟Ha$&3j&F?L1;B }мors Rx4D萨dqêG&:&.k``j&VdBaQD|VA>^s2!>$@Q gzhv)`=s U=Nq mJKzE'TTTP&(q\dIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GQ.png0000644000175000017500000000307712140200333020107 0ustar felixfelixPNG  IHDR@IDATxkL[eƛE.&Km,&jq0D[>yKIhe%a ].K)JhZe y,Юo7끑}~xؙ<+c!<2y@8'y=^>'yP3%bgR>,;qԏy1\HStg+~srb52B_ͣWeucdWs,]===hmmMmƋi#z0(ס4BZ:'ДA#}n Y/$߄}zF %hCoj`}1W}}BhTr U,L&`uу&uXhXvs,]CCCϼb(a+ܰpHjz~H <(R:m$i+95i@aLMOhkk<0/Ռ'#bR<!!8[tܹ21nu6cm >8#ノ?B:2JmmQ!' {AߎK fff000u\/!؈e|) l6ӟCJ_U `ZpH\IDW]r$ehUJH--- @{X on%L6^zɃdffBV 43_"!(E__)555BUU tdd~pp9?qݻwaX޺yyy.//_8. !}pn4Br<}r݆UVV"77@B%`_'ddd+)>y&$xG p1ӠҠd> ǕJ% >55~)>o^Zբ[VVFz}mm-rrr!z6}*M󨮮{!+@B K XE0,L [6NشWY90#cբm.7qϮHt>qÓ~@ y;7}@H_~6x uy3+oϮz>:>}-gWwC}au>}|ps)aPY_\McM=G\\6K`@ T*T,,d^IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GR.png0000644000175000017500000000176312140200333020110 0ustar felixfelixPNG  IHDR@IDATxYOQI@ * h17DA0.! PYC" !lm] d;turNKH p=3bEJJJh 6$:(ANNf@v~vv6f p^;5-!HV,ǓV> Z*U6@֍((huF(m: HIJ<:`<^(BD"@Uvww PH5@UϵR㜎&q^XQlB_arpܼ"(%%Zy= Z GR %)Jd7b @ƥagFL,c#BPƏ0 Q8::@ $*X__ H-Q<\'Gc+MQyoP*>0LUheo> Ug.(8Z@]_Q!W6꡿3V;t!`mT㹗c06 N28ǿA)cs횇y>&^2߳/ L`P_Ͻls|8N4tnass0|>H' `@P,Y/b ppptJ()>6nRMUp~eJv S[/3: h`R9pPBN+ @i|z& }AH3K# oA@BU-\NCl,@4|PEB*b* @ fϹMsp+\^8`}xҴ@BUь]>U8^E*"dDJ x֫$ kS$! >??ANa ؅NIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GS.png0000644000175000017500000001133612140200333020106 0ustar felixfelixPNG  IHDR@IDATx] TTG~4hE&"l;4[QDԨq dN4eFI&1?:!$f2$$d"U6DmxU=սRw+RSSG`HCIIID ` 99/ )8uq00w.~s(/[HOj#:{!* !(=~4s zo|}T@,.{ ܳGEW~ga`Pu_@~} .)ڹX^fm=xBGeKW:;qd00"7<<~h_:lmtIgz%+-[N⻿>`/]>__vFFD]/a 3wqq (i <}аu83|cXX092ΞN w%您+b}?O}9Q)rI"37CQ!V|2^h)A4O4W_A h!zMMFjf 7#+.D ۈ]zO\QNv6r H ͒߄;]3x-X2 ^>aZ#TWDhpl@^D+p5VC+u11GAH~#tqZP̜XڱkPHL4b⻛1˱co"3M:$&d^"I &_G#=ٶXf6-9)_ W@khm%B^6NkIM˪}+XXYv' $4IEF?-Hl&K0OVK!J\?Dxt&P5b`m3s;WJEa*[Zmddj\ZF!i 38Ȫ%czy4U﷬BÒW@-]#)2_TPX;9)Rn;D #N[+vڲ/@EtǠxrttoD۪(,)EnXM(aQ g()AP(fG#\ALbDzB|2@;n9itGݙ wѝIʇrٸDXچǷaMfDDS%K6@sVqXE.%n8o0+lk47Bkk^z<k$Gu[tAcsq |=t/m "6!$!C㒥-,A,d5h܋vsl|qB| A!t"eKf,Nw~W Ew0ڠJ2& ,hj&\2 e^Ρu'0C@E 6y== B ^/lD'6'\!pA#bP\҆#(^dnX]9HK^!Md &l<兠WVajKrQ|'&a̬5@{755H7bݺXYXP%QɢVRT >1 Eȑ")- Du01zB.E`##ч ()v7 11c3˗|ns2ix9K!&dKd(ٲyFWfA+Az ,>s 0o1R( Eka {>, Z!KΣ!̫`^Xnx?Hq5,JDyREy^D޾E@_g1/qGR#2I<p-D]W|JaB‖cGe4dxR5 kk%H '`vhLbُ # Q+dB"'vk=HV^Szo+p}}`׮>llًeϧ>- [&!k|Ax!/u8ixyb1 f 0 YYL2_KZנvZ˺ >ŵ  aa9"%>nvaɘ:)XM'J0vU.Y00&'A9 tzS/xaE8 px8NU-O}D"xab:8U(˝&x7zOs-~0; Qcmuf$8K&O[8M-ᰵӋ9U譞h-ı|~Ca% l[C#BVdo<3-"D_Oԓ p1jRp{mdh)'. ;aW#F}Aܿ jݿ]kE5cy8kHxa:C\Fxbg%0Dg*Nhz_ QtĎǦZ=HNJG:e*1*GA: OBl'Ī}Y &"?s' Qch0L!fk6TO;Wt :* tLQ z_5h(RRR_qo HNN '^GDg%O_IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GT.png0000644000175000017500000000356612140200333020115 0ustar felixfelixPNG  IHDR@=IDATx LSWpnf`bSdNUH`8|cFI6F1sӍMENZL:1PG!Rrn{sOϽhL@20qpphu#h)@Cb[ZZRR4j྿r@2P?SL*} &pI;%"koSpc'5T^|8|\:`W pzpL\e LObES%'4s?܄ݏ F_!H$՜?" 8_pvapf꽃Ionu|ŏP)p vJ[ }L@>;E*0P): .&4Sܵ>`Pt@=}};CZE @M{0(Hdj{6 {{ڔDّkL`kkK ?D5|Q IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GU.png0000644000175000017500000000430212140200333020103 0ustar felixfelixPNG  IHDR@IDATxSWS׺[ݶ:u;\;!$PJ.eX E@.rM0Q 0V\mw.ڿ`$[9<}x|?971J Y8 eHXxxxՕPDB,sٸStkLTCevS8 DamM=h5n9Q n$|*!""*B0Xษ{+` `5S q;@vB0F^zoO2o.~%N${4x\芍~;F7W;*xG֩q? %6˺tFuu aSh 8l鷝fT-Uv-JA JFv[3.fsy?@{ !/~F?[aF# 2)xmu+@ 2H͏PT vXV6bOY%Ʊ$HTӯZ]g_$TCY+޲j{)[ [U!pdB6?2Z~JzR\+Dl=y \ߖ2!Ly; ] Gç,\ch"[TY7J;]Ir1aR8Ww%ZFc9 @앨56>c/IU$7̳0gRe5Wm%tV}ZUdފQ7Z9IM{j1>pj*_&?叠%$TL ' 7Q=*jCAr-ҳɾK(LFFGp_N$7<` Ļ%S>ga# ?d_N&3E05u~**8Mq'#]7"ɞ)b/ gOg]} =1-=^/l\rTE"q/fzm̜Z=ƞS==S\yB)N ۏq&ƿؾP؊kT-!0W1T#.U w\~Cm^ ^{xd+o?fBe]*.aܵLr8Y#(X| LNNdV-l7ٓ[#i3ZGkL7{5y=,zFOz9S% `2< -|*WH=Blz}<l8@:PԘ LX um2:c06\7~gXaaGGsOXq{EXNt%w`XbyЬa= A6Ds&hl%s\$؄=|*sunJrQ^>T[q`Z*@Ji9{ZdFp{oL__lt{T:/j^/C=oiz6KGflO!R!n l9OS47-QDžR 02TS L|4bFOk%=t*L¥?CU R< t{0ܻg`*dv[C,2 a9Lf|oﮙS0= Bwz 2W^ :|u?~ΰYV=l*G'r@AʁRCohWm5 QBAS4u_w˫%Nلg6KGZ}7z ڿ2I3g 0w`/G C|APY_eՕ@>e^Cbu ~ע)]:3`ҷY}Q FaZ VTOKW %|?p'l"(K$`6c";kOyuVFt<+ ww?mJ-C6xHD_ H$PH_}ˇ?IENDB`teeworlds-0.6.2+dfsg/data/countryflags/GW.png0000644000175000017500000000216212140200333020107 0ustar felixfelixPNG  IHDR@9IDATxݻOSQ[(UhH8ZP쀉NF01NNFESDA5q0&?ϯZrK97|4$Ϲw*Dk P2F6"0~vc!˯(jv% ;+YuY.`.,ۤ^,p2 +O#`@BSp@Bs +QH t'8 $~ϸM_l@~ īHhOd'Hz\u|s'-[ś_Zmǜ/I \a9d+&cd/9'S< :?/]n@[9l#V@k`u 뤶G,Ea6BD89 vGyEZ.sܱm<?-%L^QOkY,J9O/|`fX;VK9{j,r i?'|̲$-gGr13ʅ#%ELc;#;ݠSOnFc{@b^궚eXʢN rm 'jxĶQ6h4br SV0KYJW赎x@"\͔ ]l#M$䏀p>m-19ٷ]e‡h BZT~ 'pUO>\8S){?PQ<mvT1!NتTO8ePװ @R>R,p}5S>]Gң|!zu*p}-<@0#:C:3x޿ p_M`'p@>!:O `f|`Pxpt dj ~<d^omJIoohhExN3d jIENDB`teeworlds-0.6.2+dfsg/data/countryflags/GY.png0000644000175000017500000000566112140200333020120 0ustar felixfelixPNG  IHDR@ xIDATx tus =BeW]EW](PZ*(, ȊDnZ[(X hAM̤ wL|%N4gxxtp___^gѕ/r>ӧOɓxLS,`j/VŸb;_C)S7-xH$ ;nw r9Qs^ICgW9M3]^א@$!00PmvaD2R?ߩ}zi P<…/F\ihoL#Kell `ȔxIC+!,+@KKM8v!gB|pw)a}B;<0H`!c <@% ͊$].[[W 7`ȓ<[g$yX:WZ1TV7%C+@f}9مo?f4*;Fh0xߊP^&P,(Z-Vț7e0:+y| ^ÕL7 < ŕu(oHvDsY; ŷAJX2\}+v&`Oao`;}Y b#kkc.KB: @C>ap."TH[3rͺ7[$qԐƚoAI΋PynZnds07+8Dlo+ iHIPPK\ϒ `aN01o0l[1j<,'. 49Ե@ -V\%yb@k/@;~@E * (D.I$P+<^BÀ%sU `hÇ}E P 7\ * olRW(7zPΒي$eڸxT4 c$wmn]jZP cK XWvc/O:j:` H+Da<d )z<S$W P-,w`sq+$BA'Dl;Y1  't= Bdǚ%LA'i B!'*YTb}J(^B=V8z(@[az3;@hJrbl>@H|bQFqnC(BU{wS)6~Jf)$)RxW3)qOV0@*,TNAK%2y%{8jl?Z%X^`t5L|HROCNGݯ?>7~ @?UaERQ~ j˔kE&xco?=\աタ/'ڥ츚}Ha_c#X{#LI΁N3MX<{~"Fnͧf^jI %SGGkjB$uNx>fV;k5P#u(JR8 %T;Ckˊ 0qE3TWr]ϲ1SLT3̘X3~V.A:LxA<9 f׊ 偯C-U~ݖ`MLdwT(YCt u̚szcxr2FOL? 󁦛@[ZDCUff2 ӣ=4ߏ" L}y1gcݧXfgxs\YH2~&O0K;70KHm`bcV-eX\MiQ)1@fpI#[~蟳tXPo΅RcPAb |*hN';O=CSwWm$wpSOIOZ6&춌T29yPxp(B2/S8?d4tDhe:}@ }m]\>T2eT%f tV@1qSH®\:*s6yylY"aC`~L@a(xPᓬ_ GBBa IK}WEfF7 d1 4?3oj( 3-k Om s1ݘy ȏkD $\ri9-ky7]x y\[4IzFq<Čλ OˠgARH#^4bFr>?nl6w{agT-}LKqա-HlB`$*:Xt1B2@K EN@:m  Cњ/\rR8KBԠ7xE iPէQ/ P`_R9VOh?5D$5lFIENDB`teeworlds-0.6.2+dfsg/data/countryflags/HN.png0000644000175000017500000000231012140200333020072 0ustar felixfelixPNG  IHDR@IDATxOiǬd}qVdMDEQDQ&L5xK| ftQZ^PʑM#g|$+ML~NIm(..Fdu?A,$A0L Y QٖY|+&Kj߁PLpˁXINV[~I#oIn96kI^Xq'x}Fe~,3Fgu? Yv֔B& ~dnP;"9:CCC 森6_\ aơ_D{)l|?7}*109>՛`&5fffrR#euua_}20Z(˹0yso:V0T|`>> 0ţ09 "'Ѩ BCT7e#53p%>H0 7oYR+Cx;n;jF$]x`S?v7='>EsR)]qIUwcU ,88U)> Gbkoy;Nvctܯ]MMMA(ZXO$v6|>yɬm)w68Y >99Ɋ.e[vⱗ-6saf-g7Z^/mCn7s>8VZ,h81>o=Np ʯ.<\IE`˅$v#rRlgsBOGX_cZVM_3Y h.w ^sbn<ӥN@ kvP7-s)@2QѭJ.u'WZD2ett+"7J}{[D,  `aS;\o#@U杭GpW/vc;Z\ˢ_"xS;+;w-`LiSZ\?Ѽc `C#x Mv8@oBc>Rv8Zs)] 0;W'R(**צC,|aa!L&)@AA~ nXF IENDB`teeworlds-0.6.2+dfsg/data/countryflags/HR.png0000644000175000017500000000442012140200333020102 0ustar felixfelixPNG  IHDR@IDATx PWYkkIl(0B*Q@1"W4+T .M ̀F1 a^DV# r #GPumwNM#0{U_5{_L@k nnnrprrђE" ;;;-i! ...L4ZҢpuu FDaoo4|"Q#>@~-hk4z/'h(_@L D T"|"Q?AO^h8QZ~۔m56KHD)h<-FFNyY X3J32&m̆ t'L@/Ou" =f㏷FˤI#^Dp?#? &&hrt^ry 3|um<^+i ofC2̶0LwNEIX$ }#^Dz?5|{%Et4 q lQW_]8شGQ|䯰Yy83?FE+3ީ+83h|N' E`rx2ZQ^az^}6΃gxASG_wh KDXC4֔@T7`1yF作}N' LGOZ LŌՙLoÍ 8K>kؽ]xO2sW怈*̊7iK9k!s  0"wOG2AJ?my5HwxC&m nXP ezծ;ZH]ܹ荋Gm9U9g?]Q1D'ƼH.`92"m{OrrO5s #@bd3#G+l  ] c9 9NN8{?M1dV"aL c)xo[>YN63>I9ExnƏǹ5A ?~"ku]%yamKףD.YZ2˼ww.^Fg|"GH=Ӏ2:yB};" 䮋oa\6Cch +"_<- ?2)zJ P4؁-[#'%=b$kL]Fo+Y =pI *ܟq?kӆd{t&NVގ/J_(DΝ;ROa?~K.ݫF[Rt-[+ߜ15ڭ v[!ܤD5|"L/l?˗l Yk55e^:ܽ{rO7nܐ;x"Rx:;;_:|"^E/7!7H֮xZo|z-].VV0#CkOv~6UF 7},0컴@`u(jT"82`צ{l,Yb6 37 \[^wOzs{9sM} }L\>I6y>AHfrL"pOh3 ,ʇ,"B0?!J0OĿ~EN0hIxL'XOy? N$+>\I=`J~ѥoxw.r?ovw ߙ˫=^/_+}ϰT˰'\|CBiǮ4gXS>4RgW~GOsa_`'kճ%@+_ޥ{V) ^wT* 7VHIENDB`teeworlds-0.6.2+dfsg/data/countryflags/HU.png0000644000175000017500000000150612140200333020107 0ustar felixfelixPNG  IHDR@ IDATxnRQ9Th9p;X)1޵iL*ƱCMZc5&)[KKiPBYNlRsYJ`o PHK0W:eI`|~?9NF`TUw8+C`租#r \!4kH9: $ŜʂmB|iC|Ri~ Omm˜sԡ! v?.إ!~ nӾb著4~~/Yzf^ jd2%BUZ)|`j6J Z]]9|`*J},TZ8X[[[H$X666 vvvhee@C_,)L8|`ަg=0YqJE c]0\.W/dYIr|>- ßq]zNZh+rfCY>E<hU8+~~6*`|"M; ҕgxBr Z&-n$d pO}} xܗ+m}LbuXWsb- k'n >뾘fD0 [= `*Cpl_z9).x< vI '*}IENDB`teeworlds-0.6.2+dfsg/data/countryflags/ID.png0000644000175000017500000000142312140200333020065 0ustar felixfelixPNG  IHDR@IDATxَAyp^~M&q35zi¾ք8IˀiF'.X/NWQ] "L&wb˦7> O<`0x40 3@ xrP ~R( H>ĕOB|]q}r=3 f@(G@*yc~ O'w??+ w!l~ w[`mb}b}FCMm4ۊ6hȿ6} \paw4z‡}tG^>{A۵X,P6T*)5Md2{ 88``^*:ء;FAr IX4~RTUZFz,jnc~ßwCk6Q3LG CRͪCG`2 j>s xET#R?+|' N?)x Jr)vVś.i`8*l'"B&CLq; 7^TZh|tB{,P=nA;,v Tqу9_S|Bvڟ؅z`>^7$ Fֿ6pH a@pTߙUk5IENDB`teeworlds-0.6.2+dfsg/data/countryflags/IE.png0000644000175000017500000000151712140200333020072 0ustar felixfelixPNG  IHDR@IDATxnQ0lY@sh @ (,hvX@uG~`p&~ 9S?`3+4NfV>h@GM@c%O@_VO@C 7|@sx^|Ok]y?|@m.:Z-j6dYU*dT٬J.S bR*\.߭VTը^g{,{ګ<hh4TtRb&s) %әMx% .d\/ o:l > @g/c]}}td:.tݾ:nv 1/p |3o> I ND/Ox 90h&S4צldH4M/p8} /?+IENDB`teeworlds-0.6.2+dfsg/data/countryflags/IL.png0000644000175000017500000000303512140200333020076 0ustar felixfelixPNG  IHDR@IDATx{L[Uǻ,05&j&Ӹ{L"X9kY27Ipf>0qBldGq@h ~P9Wжܶ7&夗s8$u||34?B@TJ,akGP(h(ɀFFF **> 6. ___Qf4  V  }Dͨ7?UQ FFDE#bs~_al/hB[xϑjxR 0`n455mmmtז茓02>w5h4 Xk -j02LG8ԩ_kEx1 ]`9d7}ѥ̬Ʉ+0qk&'' H[I]?:uuu!ˡ2 |&Ԩ|i: XB}&Pu =Lyxj%-{tKu۽>bvvZ-fffacjVνGXQ3 wm.= a;+%]e|zU[0#G!;,s[ pBdOf[*X~90Baz <>M`9-'ua#$ > .  n__c=GGGilute6$$_,f3 ̆/N!wwwӧpҷUt'n У7@ $85B? <'9rIMOO dsρ g*dD\.Sne ,X%);-ߜ յe `!r^ƹ}6$] !@Vo᫬v]ȦaJwgҲq}B$ݿa ̂MTV3?x;"3MYf9sX`uEY#Vը~( ~\kGyC( ky![d+R*`GdœYQ{G/:xol!Zpy8@v_{@RPNxl5-{# پ @h ,t.8Y7g|777:4X>{z} ξ.~ס h.1 Ә|eB,ILb+gg!?F<23xOZ?G3x\? |&OhuL79=tLD}nL\ PpΟ?o/9ׯ_f{~]tLz Aq4SW~3]ھ=`m/QLf*~L/$pg[{;EU0qs]@ -Ӻ峒<^eR4%ȗ,EPS[08O7d*GϢWpȚZG8%C[^|&hƏ|[O ŋgZ y2|n |]>]t 5[l Y{ځuhDcc# W F8b`| %uO2YGpY7/C ڸ%c=t^˗& lMHdBYPsy,Rh&wm\kw%l2ڭCѠ mX8\{o%y=o2仛pjphg^EϠ Lٓ񜼮{[9CHwc°ΰ~oU*dCfD>g&{ Wrr:4?0v#}=cA #48[1 'noNJ՗?s;KP3r|o`--{a^&juH$D"%A !krv}$e99J Nħ&I[ddU?T}[Aԍaw'Vj5*T8<12A#Ma2}O3!);E3BTј!%@*}L0ald7UPf p{Trb'7Jq# k… n_2?||(  =iii,q*=^IENDB`teeworlds-0.6.2+dfsg/data/countryflags/IN.png0000644000175000017500000000275612140200333020111 0ustar felixfelixPNG  IHDR@IDATxKLWn TCq1 ʅ 5(&F6X6. AiZ)u( h5ZhU^3@V.àP;=46T:3p/y9^^eB9^b-kƍvZ3J%_f V\*'[UC uֽ  }21J<'ddD Z'dI)1} '$3şIOHH@V^d'|@2^I 1I= +h> ֻ>~@$eOHīo;wkU+p-! A188#L&Z[[pVE~նҥ'(UDJJ-bc+qP% t(+{f#nc_<O8P3[46߄~u"<ɘ5+5bP"a0 z,[vʉ2= ^ $$ԈVߛ$)F#ڦ> @Y|LLk]F@zg̤wx֓N*k@?&Csm}KOCCCb뭫a޼xvCSS+rsk]ӧ+80n[ x.ԢYY5X0"PWn, g,.w,]Ljp|9d P)>?qL[ pxwttشp;vda8=[(-˄h_766#5sb߾ol ~2i5Sٹ qq6l,_NIbWP:d`]ѣ&T *glmd7_JJLLQ|gә E˚H_HS'q6#ށ~(]T~ Q~ ij!_lwD hK,Ohh,@}yH=R z 3N:I,X/'$̗Wz'>Y/yR~f %uDdӦMذamJ~z ~&RAAA 7rg[MIENDB`teeworlds-0.6.2+dfsg/data/countryflags/IO.png0000644000175000017500000001602512140200333020104 0ustar felixfelixPNG  IHDR@IDATx]TT,1j5MLƆ}**إ4A04w* *^^P@P+g)3Yk/p{\2rȪ>ɿ#Ç'y'1$ #ϔC"+(l'O7#sK1 AG&F'i紊]['%3[zwd/%iU:]]/(+J:ǻ'O`"8žjH`:{dc&N'e?3^֮N~ۧϪyǯc-:dC!_wеZJIf=nQv_W|L|oӅ ˙ {Jq_*lFN~ Ia8Rt7*A Cޠ~F?G[0 CQur'*_{QE!n,DC/%DB;xy;ŵtdE-p#v(GNܾ~=h.J^߻/5F"o0VW^>Q~ѹf]x%:`:zh'W⽋\鉴=i_1?KC60qR*`I6??.GM^R% K<`1\+,)behqtjPڙ:kA0F!Xm7T|o_#nsLLP˰  [7o߈s)W3BC> Te<*{c sq(@[6{#9Ԇ`-%;qcsݾ}?a{W|T)O 9E+y)KLXAVhx'";{ɧ'C0I_~EZ^{=h6 "B0^17%NBC7";^zUIj Gk;)eU)+^OƟw$|z 0- -lB-3;~=h`niYXǸ`c7EbWsϟs1@.Ȏ[RԵ0Xz{XW˨:yWb,\6G,sp3s["rS,a('Mc55},0!V>!TbS_~K.I)iX 7 )!2{gl J#̽DbNB zH|6c ǠD'2 P˺ق/G 遖C06> v11_uFA0uJLo{Q4|/,Fsp/}jX`~QMhyvst2sf꿝-XF̾9W.o*gM_Z$%qlĢi?_V>_1~kv7oę?Q`SlI1ǐCPǼ&G:bJ4z0tܘtVuY*/z>؜Xl-O~H3c D߈ap:Z82' szr~fT$?VOΘ4OO`t.U߈Uąq%,ھp!6@LkS7N t;ا١L0S5Ƿr+x:~-XOV(?y3u_N7R_ Vv7U@o܁GϐyLXlAhh*#oh})S/̟7mT9?&jf@M@  1h8![6 rəv!9p[{X/;tr W+tH;u 9ۗ~3;m{X%R3Hs9O[Hv(WdEXy`8aȚ|퐰'\ZAcBmژQk~uA XRx7dgi)\ە $$^^2kN.CaYs?@^~,|3t Ch$Ԗ%u #woWO=l26B E-!H"؂+v@T<Oyt%KiѨ?>zLOEɥ<|P*۴km^5зP I j=5l@A]ҠS;36i'(!kmW4.\ &hPO_xA_b$GSd89LI]^GBD [P9b2ܻwѺ>v;)rna#ES[<8 #c+TWE:7AD6QF[ngsٺۼ:եpY& p1n޼[n1n\֓wM;'%SŊ vkXf?uw@vrAPLSp)Z4 gh; T Wg HļH_;1659%Q#4)+oZVym5 i3'7Oxm4pp󃑅 ̬1jzފsfyr> 7?aQxt"n+I;) g?o90< ;MFѺ2=nuQhi,0HSQ͌j :)}$e*,poS`x*sXr O 3R*ⶈqΟ`jio m Ch6 i3`]K|ݓpzݰe^D/¸)PӤ /"Ұ젇$N(U&WJDBAW?ps肨r8G5nln)qdvSZO{='Xia/'s}AW5)b2(|…ÔDS o [vU `kR:vUJ*bZSni/V8EtO@ݼBӞ t9x>@=`l2;<Þ'>ف0'VRಋ?.-MO .kUti3OH&~M<;g"t"yn=񙃲ߗ1#["VH' FY@w0sЪLIʱX6=CEB"ga'PʬPKT' jSr%%3\vw) /z Ѵ'3IB&:sSЗ<^B"P 2'Qʩi oL~v5;2ء 9Du_aUZH9C,EB\?Ԕ@(ZVe:Z(#3U)S/4榳U`udX_UeYRzF԰)J o{!W%/l6dO5}"s T5ܳrA<5(:3Pm0XǕԐt`B7CKP+/ =f]UG#Jč9H6̗dEVESmT!D;SRRvvb>ge'd :cѣJϼ 1l0QqEkT cШQvfUbJm8Y3%S| ʰQzI|ZoAY;Lγ37I C.v<=>ƎFjÆ M??+R'/@__*C~R|5xk_IENDB`teeworlds-0.6.2+dfsg/data/countryflags/IQ.png0000644000175000017500000000267512140200333020114 0ustar felixfelixPNG  IHDR@IDATx}Luohm9W˹YDe5ז9 HښZ.-BCM ,&X"" ( S4#Q4=wN)wn~?Ǘ{w v,Ϗ!M?<==2 rIŮ,g;S69xyyMOF4wI(uy鏺"Rc@$ *Jg7dbR')@Tg? ~@0*]o$`|''B2yPmfPlf`n'O~@ n`Y{+*&*7C$s ((TWkk+T*Ք444V}U{\t I Nu^ _FsUwOVaۀN=V@܅b{xȽZgs߮.֪D<'SܧC/e^7I> @h, [С`=X_fQ?E֕(G*,>?N&;<'RCB-U]rA4zzfFZ=  v0ڢjhnn8|@b-)oL3telϕpk[D7cG>cLJ*S$[U⚼ 7lY ~߉ckm6月߸ዉU(.ɫ8 Q1ttt> `XH}7Cڴ_?÷g`ڵEM;K437;Iك$;`c)Մlfׇ'/qVkQvo+cx0 L֔?h8oJÔzV$Qa'<{B]_ώ_9njaw K` kS 6KXح)coҒ8>C_]V%1ݍwN iQ{4c'kJȏEaoֆv[U ki[+1`f^fZ$b>O I ̸`%g[$mc)!<9Q,7anzr 쎄)C%lq.tqm%HjY{(i |#_Cػ7{>[Q^7N; *ËG73% q%Tz8$ktttһtzU N`H; 022bџMWV@DDD؅p"$$0;D 8$C 8$C 8$C 8$C 8+/2kS¾8,x ~@.[){T yIENDB`teeworlds-0.6.2+dfsg/data/countryflags/IR.png0000644000175000017500000000505412140200333020107 0ustar felixfelixPNG  IHDR@ IDATx]iPUGGRJRɏ0XN*&7"hܵ4 De@ Ѹ3 %A@=@@6eE, "74އ*n=}nGf̞ǤI:HlllfEkn1a7a^Hڊ;a^Ι-rJ4Kh {FKhFaaRZ]Cso |)bHhGG1cVa~.U<$R# 1L/ <pi76aIl؏e76;5(ф_ A[DU.&Qg[p8@ "alriOBAj*ĽRZ yAAHvwr)Z]]EN=lA xe$z{.%>M{aɔ(ϥE[G:050'N@GOψϜAZXX'X ƻhMqDbG| +V !$9;qq`)6[ h{#?WV{V c FnmJg<)׷* WAu9אL8Ǐ_J,!NL|mG+++>*n&IENDB`teeworlds-0.6.2+dfsg/data/countryflags/IS.png0000644000175000017500000000177112140200333020112 0ustar felixfelixPNG  IHDR@IDATxKq{`?XEP EÞAFJfEf tsLR_ §R9]MogqxםqZԤGPeI*(--ԆX$NS,GP]8\@(~KnV0K99?r_IeNAYY^4[| @a+5@k"h{PD,`L~@ @[ @ ~| `6 ȖO0`' &qg&q 6? @Q }[txT37eݶd6tÕoUkcd0mccB|]"V4oh5/Yݳ٩ 60m8~Ӕwpb1Άt$3̙og}FFf!ߨO-4sl??tB9+K,=ꏳ7%Lasb~z0 A1+߷3< y|>Xes1?FGa?c^ӹDci`*Oͳ7F8a'WÞJOɑ.-d.}a#> 3h^`1S XQ<Jb`looC4.#d`Q^L@$%ۡwX @]MP&5F`PЋ&X(|@`'t}M@rh >.Dk8rO OT^ X @#6W*G=cz`2{q\p8ڔo_QQA[(//M /c\IENDB`teeworlds-0.6.2+dfsg/data/countryflags/IT.png0000644000175000017500000000153512140200333020111 0ustar felixfelixPNG  IHDR@$IDATxKkQ ?6iՅVMbn,6VDk+[hKtlri!D&9Gi$35s.|sΜRDQ;!x D4u'Ѭ|#YDoFH{zN=EPg.kl;N>W9*-W{,5JO?0 V~`૜% `LxZY>0`fk?008S?`||q[~P#M?(ߡ(@k|P]{~PW Zjn>8=|p(XQ{pQ'N+v[<XjhP^jJb,R)t:-ddg2\N&S(XnTrLJEF|/>KȧwqO9l6V2$%W<>,p5ښN n<U< uN .$zAD" lf(>xn'QCo!IENDB`teeworlds-0.6.2+dfsg/data/countryflags/JE.png0000644000175000017500000000630512140200333020073 0ustar felixfelixPNG  IHDR@ IDATx]iTWP] QlV4QٍNtbI I\IQDcG*ᢃ 7ŀ&!ѢGf*_!e'MW+.QS8 Q)* TW֯k h)Mr֟Weȓ0tWa(9?]ZD"1}G+Rw_AK^Aڂ(JDpjeVP'y9MjK(2hӜL 0u4ed:r*U,#J `.ăo0ivǓM'@= Yݑ}m&;nUßv46jSx hJ`BXc#R5u h/Y N>3dsg1!Al9fJd4nXb N`9 UGGS3{lii@#RQI.G h-!fS;? \ŕEr~:9eX Ajz9Gu|SScxt07Uuk`p 4&e g Bme'"+  "YF![n;5+>t9[%tţd ; "!vǘCz1Q i v[g#'}ߕ5_ӫ^*ttȓYZhC0(b$-DSo qy%2f;%3p}529.FO5mݻwo -"vHkʷ m{@8 3&1fgÕMA#wcCqnՔlͻVVV==`с!'j=W;\\:1'@p֎8lL"xj9RQ^k59?`>"vf+**$t Hi{Sv خLv[i[@ip~;h?1qqwlERP_ghP;pL tE#xJg.[N'o1`C lp~9R]qv%"gڣPwEqVYhL}ߺbS'xC:h Ol/g=ĶNP9#׊.͞؉(e⿆mmz[M,\Mw=  /O:p+Zw?*ǓYFO/Mw̵Ǚj젙|AbL2.Y  av Kֱ`B/oBD MĉMp-\n뫃z/vv &EϚ?'hJFBcȏC|(!<;HOofgߑrC`Q\\ ->|:+ F0&˗;,Zz8?AW-zfjO]~z*9@Lz))'\ =/CֿC4 'AcNLQ샆>{h\*m17Pd ͳ0arj9}#>[Nf[M555z zGtXL?r a!/'!@%s!.EDCC&g?bGՃ" ^~Db= u0j_;|8! C&0f ˺d]`$^WWǒN[`ԜIڬqNHǃh Y#KD3XKyd9 ; E~\нPΣ#dnd1Cv5$8/ 2?*Z9 #rBo1% w*ʑ"pg<< `h_vPI@~oޗ0b!!0C%b}I hH/\@Gä, ~ aiSPR$tá. x;R9ĉ̔Jd}vk"TygsdJHQ˱=M/Dԣh+P$pdEg<2Xx-fC|仧W}"& /2{-㚊䵯\|Aq'Dn^^0:z~.'-ݐuK-]#q_#eA+3:5ei[v#!}EdcYF'pLz$, &8!:?0оnIߒTCH34;>.''{#Z7b@//NZo N$wDGe/}b`LV !OMZ4hw6C!c?@NM #h2FLH/~.$'0fkr~e@_${ȓM(Mk*H LKt x^(7翗hS70& ^zybۻPJLk*HMGʺG:-88ݿڔ3Úi?ח#~ 𘏻LCIENDB`teeworlds-0.6.2+dfsg/data/countryflags/JM.png0000644000175000017500000000454712140200333020111 0ustar felixfelixPNG  IHDR@ .IDATxiXT ,T@ŨI]RRGvYiI'>iOyKi5q (jBU\XŸ(ѶIkSM?{Lq`̽3e9?s f QiӦ1KK]'99 )EbL~LL CJqR&_g(FcI9C:8ެ7 ..Δ|1~pW{#Tpܸe5~*u5$ F7~WhTT/?&p ^+zbiI_|(VwZiXO,cj,RS.հR0%­1;TO#fVfbrOb<+ُPQ$&d$V=YfFA.&k'2= ޞgV'&[boQ;qmo>F,*12`B_ j}1}@Փ(ʋ#W+=,!tvL]J& 9%&;W q^F+rƍK+WzozrSֲ{3aaYI_}9 >'Wg.3ѫWB矯. p#e^mz-duSrd㒿ylK!~ 3cg<]. 1JFthPBD{C4$[p4(FNo܋|HsBq|vZ YMF:^~4#ފvh sr"/^:v4U.IxDŽ*~tdba~Wz7kp&$~|GaAF&:;J|-Bh.wWyX .]G<]_NPфbo&d`ԯ|Dav?ՠ8ONXT.NJ$r_Wn5HZ)N<0wcC:J$\2 sco|֯x́.Gj)`3A rj6/xsVR~n׀ `tշgl ǒ{Aaķf, !! ha^`[wd;L[e><.߁M"n' rMYN<%e677o 0Rl584E . eTCmNM~kf=݄WLBp`'חN`׍V ɞ=C%ޜQ_!V@$3S\^cGJk,\oYogj'ݜ JTjPE>:W玕>۰gRV(jۧ *tM\f4%t&$ᜍ.+#\i56ډPI"PKw·`W(8; 033V5d૦ABdA%^ga9lXг%E#E Kl<תsu@_\@;Nla˗m>35ޘn? t`||2;/Bm%#wݜ`b+?jMijݑo|dy6eRB )z4ɋs/,bZ4D8yttvG93&^‰ȧ;yӚW:Vzcҥ"=7Q&ѱT>( `'pZ)\)}*+AgL)"! $X_vKQH*%׏s0PH"eQ| .G=]צHdGDZFr@Ӆxʲ|kIENDB`teeworlds-0.6.2+dfsg/data/countryflags/JP.png0000644000175000017500000000256512140200333020112 0ustar felixfelixPNG  IHDR@ćM|aG`I0F 2P[Jm-ڻ !9w+ 0|ZZZehjj"0BIuZ uuuF((@hH*@kk+`sezz:|eYb1AhR? @a`|ϣ& .0 ( ),ܙ? PăaX%5Cpf w;+ s_ia-0쪆>fOZY> ?Cֲcv\(@ X0 φagLT(l6@lbL=hJ=w6r,gmz|~ G|C,zs >Cm49/IV>fz$نH$| CbAZs\o|Gs 0l]9fOXmgJvw럢mG? j^>䱓Eن@ |U ;|i sss(|B,|/ {C|y$x5~r֟mȑUӨslyL@x<0;;[p(@J@nbz GI )'KL 'BL%e* xř$ОBG[K|-[ّ~G9 0BE)LC2/2ң>"[(/G_&f9 שP hNƺ-_,ã(\/I_KwVLZ>g61vG[ 7Fp82ߓ]'e/JHv=NfWd+7`bE<-CN&ݿO; EʧNlHcTkl0*V>UAF+^^Zȼ_CA𫃶w?WlΧN2f {2tU<\]L)^:U4spSй@ֿ ]/vS!@>/HjmWFt`I Vr?]۪JY @)K߱B I_9SV҇ )SB @.|dJVNazJ s* **_"Ҳ= 766b FhhhKT4;[qlIENDB`teeworlds-0.6.2+dfsg/data/countryflags/KE.png0000644000175000017500000000414512140200333020074 0ustar felixfelixPNG  IHDR@,IDATxyLW<x4W#JF,ʥx!(RZuERS<*+V) .x^ii5M]vvg/f~H1aP-ZD'$$0P:JW*@dd$:E02 u37D[ɉ`l"Cq6c&Dbb" >N0,X aƌnnncE;;;x)@߾} u_w{aaЈX{ϹJJJs%'' ~_D驱':Q3t(OssᲽ=lr }_D=(,,W__߈*AxQVuFѱ(qhhx}={~?D=qwwv:xbcScZட;ɔ˶:$XCߥGKGu|'S6%%^x>>>߇E[T*5;$ Bel1!N$%;w貦֬,]{n2sT_ x$ujiSIKcϳgϠK~Qiq.&dC@cu5߾}mZ )"츅rGGY%۷~y<+hE:/BK$ۍ bJ(̰atɑ#1'5]jk<8#: 4WәmܲrrɬDEѱ+(=@O9ĕPh-iiP 8 8!%pNzYxWիpΎ?S.ׅ'} D= $rG7lׯWd\}rkx&%ճO8Ѿ?Q4z{kskR'XU|"t7t0C#.P%!=@64;׮< TFOY6^co$2R=q߾P~=4l 7m(TWrLRO3ms\1<2)JI&&&9JtDMKR) r98:,:6arzܮ! Dl&VAA*Im1{ƘA‰ZOd:V7Kf̙Ao_^\p0S8R77z{8 'p㻾koKy"dpl:^k+իdx(H`J5 p/ܝ7.RTIYAV\HPWWd#jjb6͞ \\-`/wAkkNLirP( MtsU+@cN?6h>3ǿgL0c a!VTPԋp{H7'EB@d[ѱ K2J2@,;@&o"5|c~V[5C((aW.~.4#c#ZMRDa;y Ʈ vh[<3IIUl|HU9ސ/ef: ]+gؿ>S QQsб/4O W<'@""ΰR.]4KǪ(G3}?x9Q TeTbh;y3Jet"t_}r7zJyÈ듡00$  Pl9IENDB`teeworlds-0.6.2+dfsg/data/countryflags/KG.png0000644000175000017500000000601512140200333020074 0ustar felixfelixPNG  IHDR@ IDATx]ytu{2KfML *p@-XM(Kx<i{тȦT8(""Y&:I.YgoM$Mf&Kf~}owͤ*"Rڵk]IVZD\OիWҥKX a,YŜ `ê:Y$18-[N!W9|)wufH#j)?,M ]QAR"|)7EIXKu|)7DHpC|95 _ `Dx?82AKM}byE?2~wcy+ԧGtOQo2eP#Ƕui25%fR_B)-#cKC "& _ `+Rcdu?NǐH C66ckyyI_ I4Ff3yH,,ZQYޗ4Sd9iJȤ:oj0V'Qka|֫1.sޣ_ `J8߲8:8v^|d8 |@=E D-!/jD}c[8YpwS=J W u$D=/hh0ϟ ,{1dUuضC'}wZjv D=w`_ I3{hNG<&= 7) 'P\{“:dvͿl_ IЁ+TAY7sM?YGÍH"o z fCA8}PUfLo1RYpc?S{Sr&JR j]L?cm*BB$ ͋fǮILa`n]@ԪNK'+}BMf?&vc5_`((0Pf;f 3š1Rӄm I$#7s]\h{73QO{#U ȶgɶ1-}8S(r2G0gE0M֫hދxW^o"UD8u"#)3]d=u2h[!ι. cK^'K|HL`3 }26jpzn8}>+vrgònh[p0xXLrD;&p a8n]`A9 rfAcui`AdJ!>wP*Ύuf05R_9#*jءAeCUb-T~e *h TS QT>mגeY_{Pj9zxzOJS U-N}ڬG Y?ȱ/ CφPv5U@TtA)OJcrw0E/ԼO |P: ǫ dy߇,Rgt)IPJ%Fb&*1,c>SHϹTʏK4T||~ߣpʏNHY>c*"S'$SUFq/5n6P^I l S1uH|C/PV\'~XgVȭx45_O78;8 ;QUOdgkDy1,yQD -UŸ^ 3$߫cB8HKKqY,s^Ĩ׉V~/*H1|߲[g=Z gpI\QdS_:{mcA:!ߊқ T;d,xPy/Ť[ (O?R<ٴAدw88z)%n{ #Β@yZHh`*H;D؈F:u^qA9Q"* eǥC,Ί0?/vaL>Z9D.~Bݡg+VsV@ɨ?G{Ŏ0ܓϩR?Ux(vr2(yUzS2n~ W=lE@fxDA g]aoL[ܷ M]*0 i;01=_"XvQ`QKo2P!+vq&{ Xv~#߭07Rc.۟i(' <|a߯.}o-NtO)9u**l1ųGt+L,L">^CgSp@:sN~qJz^tewC>.s Z|AbFp״k^GfZ R~;Ɲ ע%-T,(:X@oH,P5}Vo6|V3Ny*,% ˨w/رfZrTbnqnįXB hT8R:IENDB`teeworlds-0.6.2+dfsg/data/countryflags/KH.png0000644000175000017500000000457012140200333020101 0ustar felixfelixPNG  IHDR@ ?IDATx]ilTSQ05jJhȍ7*F#Q B@* -( .Ad+C;tС+eLWh{#tfzN;ɓ<ϻY!"M$,\Qh\G)Xh24J!0C)ȟ?>C* %&fmRjí '_ @]ȃVK;ϥԋ/JREzqT RE K_HG/*lP/vD%?dM;,O5DߚtZLIKN,I&NǺ_~y-P >l)D0{6!Ϗ?i)_OG/@ԥS-ԑGXQȗ]w);>EE;TloùƂR[mjy9E=DI?r?#ܺU(\R1`{)rI￯h|ëQ =Kӧ)p5"&7uI˗SWi)9ӫ{,XS[oQ8xeeԶnXA9sZ|srȇф9* ɗws6w閭W^զvFW._ v%KȻw/`ڵKEt@ `yY\O_ܱ\L~K'9RRșO t1#c?6yK/^G 5w_\ zW]MCx>Dn7U?LL;S'?N=z&Sc$_ ; OcJrCCu:%R}bq<8w.[讨:P_P7 ֏>"R{iiWjisU=C4Ŀ'fQes萨%"-ޥ(c1~n9kQ7<wUF5{M&./'?>5u䗌|)ap8qBrý̫“?$ 9Cf ` E}(yz XFpJG{%W[K}8v х֎{[{;W\,D]E$ap @bhn mcJ--b u\ RaDǤ88 g46[nboU5mda/l! $FI!T {}iȗCZ0nݘp~" Cco w L>r}.y>QH;.2yNAXy#o׌ГP˽?|"ƕ}GppDzXy_h?GHFzCȡGQʄ&`Inns/N'9jA[`gG>o6H ԁm].pckB丬QƲM-jVR @HuZ+ oFh7E&Νd kRɓdE7~QSTnF  s09XkQR/(т9Bnsγfx!̞ o O2x>/ ۷ XQn{}~>P6l }`>ݗ_ ɶ1,s6oY?3Wrmt'e U|)Aqx@x|8L{v-!]n.]OAfdms2ZKCV$vxSR& ko̙#<7ZVxex.$+vH 6,?@ `2/&_ng ep@Wj/j~(hpwюΛG+.t$B5?x,qcAH\cDHĩУJ$|;ҥ@"M&+Ɨ#Վrhb~W$')Ɍ.S~3X8ONvPNP94 @}*) 3HOb >U*n]> `3>_^bHWBʂkSErȐdff.?IENDB`teeworlds-0.6.2+dfsg/data/countryflags/KI.png0000644000175000017500000001025412140200333020076 0ustar felixfelixPNG  IHDR@sIDATx] TTWR#BdI'm(&NLw)Dm 8!CD0 2TQC!*Ȥ e2^E]޻gs9]cxzzhL![P cȐ!0`TÃ;SX 0i3=0p@564@Vx+H\4F3RCѫ \O"ݠiÝt"mI!=}FC}Wdޘ<M푹=DPK31Mvb3}:Car({vF92npE1bRgPOK][]pP @3DȽ6cF䬑.1.F!ɠgL=cVНs#Y;irEp<3m:-z_ prPOuDR9ILʓ2fԎH_,ĸ]mytK{C&(&1Nc^Rʟof5dﱇzW;j8ʱNPӄ###Kz=z@s %E: 2JP)=n+帑"Z()"$P#[Eek?ñ/ ($FP-F {CLH*#Kb}Ea%{@kI;UY; }=4L/ep3έ#b!D~-CMx@ tﻻܯ삔~oz4,1x'熦n3QH5JN\,G")pmSljr@ :sݺ!M"y?<9*b&+d>X'~M~Bڕ2,rH'HN{թr%A߫}%Ю!wR]_cxl`^o$0ÆP%> t\u EE _[S@b1ݻ={n`?kz7b\pR7JNRhcthCA l&8w㞿@ Gc,<yfƭVȡ9ЎCJεAi%bF#%8]fPtrvvz%/OnKx$3U)2N^c.PtvO"W/!ۏ01U,ߗ3C?-דd(8&499f A"ʑª=364çѕ᧾ 5'M"9 [G`#T/rrz%`jrCc"ߐzQxEGg|2ߑC# 9e[P5*Y^*7<0pV-q~ H\8$憧"s IYȌi#d߯',x*Z&r˅ ¾@cwv{LqD)մϏw)Piȷ'HE)`/ZB&oh/㆏ĽJRipa\YdԌW Pnu7o:SʟbP}((ݪ~pyMM \#//!j4PmGq4=XZ`TsZ{ t9 kPT5j]7MuwPU+}PkqVcí<\͉Aab 㷢<6Q_!WUUq=btcМ<νHXK ;Jm\t$?z[⨫C5 7n@EEP\\/rrRK.Z2hyy9^Awt]CcDž3,$w_n%1/$ǝ{1|,Xj;ޘ ~bʛw_[[Jnsgu3b@ >_ gSS-6P)%1sߔwZ u?Ic2}?6 _a`_ *0j*Ry}#c5Ư/G.RN:#Capv,_bS=9Zl= aM"mCfɱs8+Ѿ^3<=hWm¨6HpߧU?>DФ:Y̋?[{?٤ , Dr/˼x}dN0eUckFQi}`&9| SMw)b1êIa轑ĒmCp¨ E[c4m#7Fal տ=*~ w`pl8gZ1_6 ` /;x6fgYE8_8$ ʏ$ԖDIIon\?XIv 42Z#9bJ{m6;xN6=MV94CоXF-V3X$eV͕תnc|ϔV)&,#7;[~ÌU?+_m^GwZe&H"kb y<٪ 8Ov!2S0uI' U -UC`|}*Ze5p8!aH8xJuUHu4$E?{'B );pxb`ܛrcMP&W{x\@_=J0Ѓz[XMO=䱐@F6J];Yx{F&qIYuS +qT"y`DLWVC-|A޸b^Lyy-x}Y HADWq#S 'P," Y-B XChD<_2>@åbZçzkKj Tm*2<h- %W* w VāӼ$/-59\yűʡ7 J8c˾f а |Ya?⵽v4|ӊ ޾]}! 7ƮKGOXIPxup[޻PO0Mߊ.]Mi>D)"'v*O >?mM廸7w&zj!ILRM^@ԗ' Ѱ/pZqj~gF9&^IĒѰ)Ds"7- }&$Ygޚ D|*qily @:EӖtGr h+3]=VKBom@C= 77Tm ?x`xxx 4H0SJbuIENDB`teeworlds-0.6.2+dfsg/data/countryflags/KM.png0000644000175000017500000000341412140200333020102 0ustar felixfelixPNG  IHDR@IDATxSWN?KG*V $/@ `UTV8^ֶGQ"xaPǩZFThԖvbj2/b6g'&l=gwg$Kf ^%**@nL˚EQ* QBPTAAA7Tpؐm#{G@pp9|0w^L-L_8~j t_~H'p'FOKLJ!-CO4~ ?!{Ķ0PZ܍SĶ00ަ^-8GYwst~3Z @l EEOb[]XX8K Wg`ۂhg0|@>`Kk 9PsS xndZʒ)'E8dU~[(@3-z hhhzZݭ%C R*T6T@swށ*2#eVBwo7'!j f w^< }-:6gɉ5 Wzf oԵޱapC 2|x BIDr[} F?6`y^♕zJ}D dTYPȯ>m[tvVp;5zyp j~݂qc[hnn&ST;tZ]o S2VxqGc>NNFc)n˝tLA/_BSSl UDxoB[[F ~n,6Y|k 3h/R]͐v\ ?4 pfR-@~[w $Q[Re\>-tuuAccc%\ڋ_}j`P{H)Z *Ꞁ037۝ ;¼.mZ[[>Xp0y2ة7GarHQP8dcBqxl @ۺ9ײ% Pփ.NgJx FpI}XV4tz񐑬n-Թ 7]> -mOv<$ރ7FRA]0q% O(1yH29|lr"@8s#_}NSՀI|A՛ ZZbއ|wA K V0,GV舰c!s(W< RF+@8 >8 `:`?v'!‘/i5ȁ5}=1 ~%L/lK~/×k+D `ɻe5$d{@Zx`D tnHfW%] ? MJ'_@>Zc/@|\4+7w̋>O^-E"^h&-{/h_w ^(- }}=$Kq>|h慄 9l>Biƾ Ubjbr/DvF  ]ʔ%p>8AAq>+sAX rH0q>rfr[zAl,b$; ]aQM~8 @LrzDq G3fME\ ?@O6M j#@hh<I,hIENDB`teeworlds-0.6.2+dfsg/data/countryflags/KN.png0000644000175000017500000000473412140200333020111 0ustar felixfelixPNG  IHDR@ IDATx PTYV QQy&mPe FcL4!E 12@,EcR1NmjIck#={;`wg{s< Yl `233 cҚIҥKxbXYYY-"<(t{ӐPMk="55U+`G"b.69~CD eő%(k8v0^0bK7ɰ2ע p ]ZTΪ/`V` z&n|&s|&`;3,mm,)?o"&.`;ࣩmu_"OBGKxmx{Nx6dtuqza)bl.`~b.v:_iib"H%pn%R q== o~?>  ` =9Lb ~'ƾ}<`s̱3P[ Pu(` qt1*?=AKվrJܹs+V`nܹli[m U `!DW%?6P,?zC'((>=l٢,lذw#Yh. O 0ie)hs Koo8aNoo/Ztvv~.--5Yx:PSPxgg' 02jmco. 'o޽=LZМ L`O}2K;= xy|}qsss9ſz*oiwA j.]ksj" t72)БJ8x =zi^ڨϢ~@sQb# Rg$Kvȑb<:k֬[F=|ݻw~u=۝a5+ *T)p/$i:֮] b"򼽽QPP7oxQ&hooG``gyy0t?򸮟?arԨ 0,'+x ?|A^^8k2Cw jI [xc*IʼnxΪ_0doߒtFX?j֎r,{Fӳy/{AY'1M8_%X!%LF4F[ mh͛B{2 :#}yh.&LZ242ʙ_?;7YE/H~.OKbb"40 ZkMA4%q&H,_\=uϯ'6<-"9LjߦD~x>w9:=C`MM:aOxwk;>vsy<x#X~~k;G@]d r0eƍXnX(//7;~%_4zFbeuu5ݺu~;}]v-S.\J}ջ\j\PXX$:uJf%:}R*ǹTUKaaa:˗/뾯7Y01_<Un -j Pd {i?s1"9F]p6%-iqGql. Z-+ fWf*T/AKc;n4r5Zvx9hɪ?*PxUT3h9"oppp\TVVB"p~ᠥhq8sw:2h9̙3pB,_(V .0ۿ f}000 -~3~QpX2hi*`}kgqچm\6a.AKSHOOgĿtr9{--K)5z%%%/OE{9k8h8L4V=7I!Fנ3;hi.7nq?/,C vCgAKga `KE?6Rcn7hy?`젥3"@w5(^3h錸Dx5'2m;N0|?8:2u`#z\Njc]|v#wLl 0@w^%UH y.=pJhJq{`$1Jnt䆡ZU hp;#kS   ++HKKwR^EQ}IENDB`teeworlds-0.6.2+dfsg/data/countryflags/KP.png0000644000175000017500000000312212140200333020101 0ustar felixfelixPNG  IHDR@IDATxoUp1 Cݥ:4rK KtQ,h2$,\Peٔ(E7Ee[c:viwk^l޶ɒ4Q(|0HRLWزf @NN&+T8A&1D"LWf])3Ր;>8'çsR yǨ"9ɄO y+|*T=§h%l.Ş|Zhl^C 0Z"%B m[}Z,DdVqν'|*h~*@Sy`.+hjǟM+u` F+E邇 hpƿ|F &`ÿI{?<`b j ]~ ˳  8LkֳzW(x\ol~L W8s ,S,.c%ԕvN'7 ?9~ nLtշ] XݩLBݤ#ȳEh ? , *֊ӂ G'Bc p;{=C=p8_ٰEg҇Hw >Ӎk|7RەZ=O pL'k= ˇ%.LG< ?%"0ecPe 3?L-LOVUG"؎`j̴=¿¿bq/՞#=Zk3uؾ?x~AB~=E2IވbLv|?5~'>k nm-\c~ JmW ?x" kـpFB'F"80p8^ I)C׺D `r*'+F#Coo/ 0z( J5M4xVcPx_8T4;6YSX" ߟ wZ4/nbN߫`g{Gn4j^)] :NV@KrǍj/+V 9 @74ֈH|v=(jO3BĦ߼$b zrH$?mJ]CX,ǃ2OQ/%oIENDB`teeworlds-0.6.2+dfsg/data/countryflags/KR.png0000644000175000017500000000545412140200333020115 0ustar felixfelixPNG  IHDR@ IDATx]PYQqUDY E+NEŌz=C"rNZk3 ޭy v'˜zfEKg^w{'͋ƻv IucXFO߻uFpT o߾=\''fۻwC|j[n&{]tI# jw2UIWҍ7+_N̼̔<|ԪU+ruuk*r9Թsg}hΝ}M`ѢERӧOg`dǎP*Us֮]rsse)իW૊/^2eʰJoR.]͍6n(5ݻP֭Ye:;;ӧiBO:)( ޽{ΞQF,V_xF{Cׯ ,^Xș3gY?M6|˗uzosE7m$Aq?ԂԩSS:t(ٳ{ b5k]vCq]xqʒVxG(HLL;**}EN:lWA._>ߟMv@1+zĉV<~7Z=^==Hr3jBA޽RdddPjjF\6wXTRtYZrPSLaΥӓ%ߘJFRV:kԳ?}Fӽ [P0|pšaÆK>xۤIҟ;B,!!`HPPbEvݠA ƌC6l0fTC<}+Yc$~H9Ck|1 )o"ItRml_aìcz9d !ŔݹsGh<k)VpOpݺuYzyy150gWS;:LC C_P/Q# +MZ5ЉiӒd9V ;DŽk`^SIW"in-q7&Z3mlI4@B-'/m~M i4O$d%?wlJ<l5-d'`u u@70l'O F1HDk M`-{7{)>EUw,< X$o1B3e]5H_.T3pkz)5C;&Nh[@"6=ݚi]2_I&ݗIEdp /G|#E>V}7"b;tl%ZF+ k#V bQp& kC2o)|sRXT2dHc='8Zz}Msna68 bw8YpΟ?v 㹱-'FRCkd-b×/_^HV]jPP b=zDBe.\l"ԊBv]$LjJ)ٵkc+U^@6`g/ԭ~uM2o[DWwz wE.o<¿P8*/>o%qj5>*zp? _p+STz '3q~W;P_oD+Jָ#͏J[xQ@h+3PlLLL> ؘ6@W Ph> Șf@G&''eC OH,,l:|@ Akk떄OH2Sk= z0׺$ S.̩/Z:;;6CB𵮮.n\{{{b088h5|~#]N! anl-$.n -[u]|V OjGKlJN yr/(h#bkx -Hntb = -* `56מ}܋,2J g=c)&{EG92œ1W2"~Ǧ/W bQ74u_Rmvxkok?|i"@@]$XkSz FiCgIQn4meScG| 8dsASk(i~Ƥ-_)//mJ1)x|EEE?^ɾIENDB`teeworlds-0.6.2+dfsg/data/countryflags/KY.png0000644000175000017500000000762512140200333020126 0ustar felixfelixPNG  IHDR@\IDATx] TTGDQQ"FE5 .@aU *7悂CdWqI$qf4F*qin:TUUW',aee@)SXE\\ҏS‚%.$6m%,q0c޼ ᒙY=LKgmƎ9|ߤ-O{~>j h]U=zNFFń KȇĿwݻ' lw GڽsW==\;wh]OhK"Lt 1, **d "B8uH;ե{AH:Ж *^KG~^UDDǂ#ZuJJ>oD^R`kK+WTče矂~45=xR\[FmD]ϸc*u\:TT0 WYq bh?EڮI||ںy*)@4ǏW9PUM zģ>#FO=ߏhH:Ж`|CYNIA%+* ͭy׈pjrsƌ_Gx/soߕ8ywssQ߼wAc]YJ7JM 1-^ H]=nǓȎw۷sq9(?88#uȼLd5sp0}vj{=IճrWQ^^2$J3Z./$$ё?|^(ΝΘTL܄l/ [?IPD䷤ېzz'qzԜ<#pJiW HֈY ɗj%+VO9>{2P X:c(FEJb1vLhF\R(tq/ײq&y*MQ?ix>9X^׍~HsrO+xG ͆AH<ySpfGX?\ɝÉ n7dA[=]L AQw(Ģ/|M-գ_.)Շ~!gU?UX=Ԛ  huGK]֔^P Ok&X20V` :² ^?Z.ݵ ,۾`Ykm!XfPG0uL @\O {WēH< ilOO`tLBF)Rrp nvk-p˦/}_~Oď'>|B.?\L|H@DG54"% GO]`޷w-O3fn^Rhį $Q9AyFHOiM4P"2h#yDIR@w0X3P8YrM je'dJ|txD?sKɖi ӓx=!I۔pK o@;$#H2`sj55Q ʈ5轳(]#۹ {{|{mm 3H`?zD3tH%s8#Ɍ a/$H$\lmM3$J L3QEl'(˘]l{G TF`+!RyNvȜhN`GrqFr+o-0ҭŶkl:\]PƩɪȳVA"2}5MST2g( 뾱KH-Y F!'ٸ$+B[[Y$X0<~L)cGfhM t6vW@n62#Xu٨ UY"$q)ZP(gl%Bptui~~G .?i_ Z#j;GWFBf_ (WG{wAa~H`#wHW*Lb(3Ͷ_@Nܐ7|ȉr2#OIE8m5z]uVEuEc хZݐ[EwCV :C f!g^ϗ…a$g[#N14^(662kDT'$tzdԦr60ߣMڰaϬqn\hǔElڔ+=fƫܻٵ۷QjjjmwewH]5UU̶g\@N'{b_,9C@J=>ĥ71_\!r2|p,J_- S. y`{6Cۏȃqf Md33<QXA@=:' yx@Q*9I:9=spy)ܟ .1ϫC莵=`z5`a J 5Vh&kC{h 2 e 8lNm+ Z,y;ꠁWJ8~4\a{;"x`\m-f&~N!9oHK Yݑm3G=YgX: ilDʚ06^"@ī :<C?N t -SbH \l˵q0`؇ 9 |6";z], Nrg_3'it>Y%c~#x#ak Umsg_(%I{s.h v(9=}x5I`尛koEqjp%j[XJDr Z+U+QUU|| N2<6(0Gc p0cF8fzJJhQzx_8 e۱*?σO* zmC}|*S,tqvp"# w' ˉ!\S=Jxmt;7vL2&:swwShC  |G6}nyjK)R6]3FMS<[FPUu.G0e7O6<!-f4;!3u7LLbe8Ytk^Aۚ (Ja?2vPV~,QMOpP,.mf@2SL|18>ɨ,' b_±8f ) >;d8︅8q2I04{m?٧}"]\XQbm&aެ~3f"1Ҍ}FQAe6UeQ;lK.v_to Ⱦ=d8[ CÐ(:8"5{. n'@@AaVabbFXr8sn$C8lrHݗvtRHݗVtBW YF'9:do/ $Oo'wB@zfȨfw,1G[,2޽FӧOT7 !~r;M`ҤIreTEӆIENDB`teeworlds-0.6.2+dfsg/data/countryflags/KZ.png0000644000175000017500000000571512140200333020125 0ustar felixfelixPNG  IHDR@ IDATx]YpSvYH YR0 $l1f566{!P P@XLXl,۲lYW-%YW L4}hvڙNv=o_Evl#ڮotu9Gw9*b:c.] d("xb WD OOHHb|E S}?`.%&&J`![Q ()&* IL&̱1XGk뮄{c- t>w&%:f;I3V,pCh}F{XO*:X.w }G @+40ZO\!?Y(e /sεd'R Vj9 >rD~pձ5ta&Ecޠ;—%T^L6BF;グOP`'>o=T:> d'*'R iɠ=tS:n;Im S'1ք:@m/fh8k=AY?"*>I5 &+ͩ)uF5d9 K4\6F%k*)_Pq׆)\Ɩ +$]u/+]I'f_Pj"{"h̚B&2~+5A8"T}/4u/;8} k=˱WCh- 405h ˁOx[/}Ox`P]x(_qCh* Ũf[Ih>AN+~%P\Io Czzyy8T@.KM1}—>M.?ZeA,"*rb?veiQ܁K/_胾È(ܿ.c kT+T@Jg0 >>$G}'t)<<а9\%/Xpn/ ˾`Ó*Hj􊹚3}1B7\>=WdK,Rhp'Q+3`tt8ѥ}o}vl䒱o]&-UG 1alE+>7Z]Q{f\w/胾mc4JG~|&)APm=p'~Nx!ct K_7M6H%,MiaE"wLm|*2 \5Y~t~"BObM6 c$Wc=mt :bGZ\xZc eAPtc.=Y{|˺K,6h /̿4>ɿvFWe]x{Y TA Kyεl:sO;J"%BIB\tw'|\CaQR C(ud.w8u / 4 F|"eeC,h{AJ2būha4HeEB*WN"EjZ=Ikia%Z}*R6-%F[0AYzeQ> A{BP¦N=Ljg,+yf^kE`Ьr48~XQI' Цy|>?;,E˞ŋ ^6JXj)fڹ􈢌'(]nLأz:Ÿwt#*Zq[-yj-MSl!&d:%@Wv1h%9bPYKmIΦwh3H[?-Z l-HgWo ZwbsrONkVy~ Vg6—<"/r0R.AqǬC0VfRɄ, 7E5xIyJ ? yC7RyeSc((ţ,H!Kw- j@mHm^3LQHx:Iɏ' -axPBiz @Ma, (!\n<8G( +,\Q!ұlME+EgfmBs6(| 09BPs%@ gP bDպX^aC Ss:X"D -s`W;KI"PU R O]تHY@$ Cz[3F  l5 Rh1>Yi]'H>LO)xP>lQi4.⇢e8P˕>5NH@ogz=](J,:(ZWaT`t7C "4O *o/`z3/8@ Tg[Ȳ&@_O^$ !^V+"~&c2"!7Z2}{Qd7CB^fA Ae DD<|z]|Ba?$>_1l <ן7Ů<$1!/%AzmTe˖QJJ_F\D %%%E/S\XfIENDB`teeworlds-0.6.2+dfsg/data/countryflags/LA.png0000644000175000017500000000201112140200333020057 0ustar felixfelixPNG  IHDR@IDATxkA(ZmzR<EےI{ڇ"AŋO"P!L𻻻,ɔ !N| YБoeÇ2hC ÇR!f@#@#f*V@3@f{?ЀLim1 g|ɺxVUq2LhP-J?~.#k&n9JTg| J;C ^b_ i;M~`EtՅ:A8 Rm\1>0 ᲊ tȄqV ץla>0eSz[#cÇ&htgpRia,:͢^]*]=Uv! xkWU-mzJf?C xf um\A#7B 󴾾NRVWW)‚ ҒP(ieeE[,imm~1s\0$uxvol{uS ׹!C3[c}g2纸N=><#M!n7s[{48|!ۭ}m# \!+!ʚڰ"|Yl3>K >`S@8>wML 5vE[͎XNxVY7Gڢ4z :YdmT,$]# yY@C86`+} +@ Ŝ|]>Mx :_G5z S<צ@-b$I+P4EM*:IENDB`teeworlds-0.6.2+dfsg/data/countryflags/LB.png0000644000175000017500000000357612140200333020101 0ustar felixfelixPNG  IHDR@EIDATxyLTWjji{&Z04nֽVZڪEkc1"UZdQb. ./w2qf`x/0~syHHF8"I:+U^|emm sssIRfIY#'pXOf>@lJ6l>@L1Gs(J*t,3 B0 B% @j?9"HU~b2 V ?FHnzsDGSR~AEjcM\",My& iE0[l ^{Yn"JJJ41n`2f~ָ1C9:D7ԯ A\EQWTT0dG6 𘇃m 2Ϗ5Qǘ/x́ٵ$d A15X*}CFACL &ͯ.(^^=ra1 ڈ/(U NB]X_Ԧw!ͭ-Ȭ)ƣ&yyyCDй$t<s1>} mLw[XZZNFjU&_ ]qs`ҕ,Snz>§W(@z`m|@'{8] 0!`}a@9#ETwCdp^1"\\+q:T__."r0QH [TQ*kZ Z2?WM]6EPWePṏb7Kelw]Z!]nOKK u6A4(d_bϩ4wcx$AƗ#;;[/s4DIC%~ -ߝq_O|~=68掗*D%< %M#7/`^HۭsDuu5YN&fK%(dqXyi~3Ϛ4Ep 2]6Ić3wD$ˇ&8bh2s # ovnĤ$p@ssƵ<= "1ێo2c3N_DZz:aȑj8WC\# 9c 0eozs;l: m 'J~N5ђAI|p 1aչNTE;upw}g Q.3AjvV\j"vb~ɊcT4Ns@la"1m#[dP[[sGъ`wyk,=>qRm=:X Ɏn]z8kNߐF>W,^p}\}| E=qb a}M}2A |/n%2x'^x/b4z'Ypt^_PF=!4gQ/.H3g΄62zd3}T`aaˏrIENDB`teeworlds-0.6.2+dfsg/data/countryflags/LC.png0000644000175000017500000000356012140200333020073 0ustar felixfelixPNG  IHDR@7IDATx[leNjMŒ0\b̃5 @o[L#A F$Jco&Ҡ&DÖBҥe\" Ŷ\Z۩{tfv`{Lf3s)Dɚ5k@3:N6ϪUhҥ E/l$!??_ɒ% E/-16S9F˖-\(>`:QlHEk\gXȇ(8]eG,᪂uhQj*OݾmG])>>CP_>늤564(``uMu>!>$URwbz z▁Lz͕ǜ:Hg6QSdcN[o `gճ:ll9N֨l\WD̰}dE&x$b1uF^Ο `o/(`D,r'%007zΩgeee\X#cXH EP(Dq c53[|6Abڸ 0k |HM}lS/ٚ1[ `E̎MvVa¯.K0W İ6tZO&9zSqhhf͚5au]e+lxޣo` b UummH>6IW//6lSqr<>lC.8b ֔[%tez77;FOΕv9X+b_AS׳H-EA9sf =EW̡2ƾyX%x;xk>"NShxD~[SS-3L|x9/qpW|,rmd ޤŭ@lr6mm;]`0(%WgavLp,r>bx;%Nd6J?=o߾(1H+s"!b"v6N;FKoIk0|L{r`ĵ%"!$L|$?^/".J_X##b"6r0@t/hiEczl/nX"b"6r  @."~ Eg /Z19 NHsY9{ qvӧbxd38} -E[|,9it^Gӧb b"ȃl .z>)EC `Z|b!&b#r!'FWׇvm޼2gPcO Dl rl0X/L>K ̧ڭSo@l@.Dn6}_;AW gTb9 95,4@ɯ?WoAӧD^F kNh]ӧr!'r6okՍA ,sK _ȍP dycQ!׼FʍP _5JW_=&L*i5R}Rf0i I_$m] oaZPe_‰{>z_lGA 566=FLI2ȿsOװlF ,xWidzjZr)c/ +Xd0@~~wX'@CƈIENDB`teeworlds-0.6.2+dfsg/data/countryflags/LI.png0000644000175000017500000000307612140200333020103 0ustar felixfelixPNG  IHDR@IDATxmLSWod,:E *B[hK -B Fѡ0S@)d#*sL㜛:uqs1qS-K-Ke߷dK1`z=/Bh<6A '//o<#N""ͅ(apʢcz";;{ |.sh*`-\6~ ,*)|C[͗ϔ!밼EANď9'B^`<6Y1EW)r5$|f<@Z;B.4 @ a,A`B)&w[ppvtN#S#4i#K /Pl{*[iB:2`"˞ܥVl}1 V \,4$4"j2HK$#TЛ b~<gpV QSBuN-78\z >Gz`.3AJ(կ]"Z$ý\ -:\h!Zb`OÎ9$鋧Mt_1tl228_l, q~x`!=GuCho=LYJмV.Ӗz|zX+zWhHU6m5#sd8մV{ݮ|(6 wP]"p1 [!39`4FCZmPb ط# x*2I=T`q 4pBIϯ'a~w> ?]^WUX8?$xНy[wyM8Z^{NJFȢ%C?q\2x`wMy2S $]7#|X)x*p^gc*":=r3CUH-ayEQ) O݅5l?@}Rр~rDlΑ?8T@Q$ Pj6. G,(tºeag2 w&#̠_ R058L"Li3#ʐ?8o0~x]I%,ajs q99\/Zq>\%/E1( :|ś ;x.n;}Vo՜a|M (\ `zq΋si蝁 :`!f H}$K.H0:=typQ"=pC:;|Q\q$.W@FB K23 @{r 7L @ix @~p, nf#Lp~ @'}Li(ZYa^˼+ Ǫ @>cX<|v>;} gSۼ+]]>F, Qhʫ-(nc6oyJrl6|nP0IENDB`teeworlds-0.6.2+dfsg/data/countryflags/LK.png0000644000175000017500000000777112140200333020113 0ustar felixfelixPNG  IHDR@IDATx]y\T׽ ; 0 KZH".0(Î(PѨ{&m3MjҦM_k^%]9: >?f=g~9\w̟?/9sPp6Jx1w\$&&RpBCy1gΜI9~q7/ `%>?'% JP$OλS>3247\6_o|vhC?WD>~ k_ CcA8ƆY;r`N tj 5x!Ue"_@/j wbő՞V?#sC$8++{AX?"?lA@I 8 *tZ)3%8+c5Wr62"nI*b`I x3pd%F"FΕ Υ>XLggy\SiFJQ( p/0Yv8.x.#CKl}&D&yzL:xB%jG)іꃲΕG^Ip(En-Qv6Z-[0 2//rV. CŐR쁣LATc7yZ;_$g!1SDJ_ uji\f7~p'~ qV>;r%c~uÇ8tqxu6sX,GUd.ϼ^/6p*BҢ4.LL # <*7,ٗ@/ 78"OVknbHCBoG e:DwyD^kF TPND5("IdPA&e DAc%H(MJBm8 Ϯr]b (uqxJ~*40?O8Eubl;K OU8nx a\ /J{I֜piu!µr7lORCJb$$$ Z^AYu`ߨ3A-+q|yUN{:KpjFoYx.w^Jtñ/ D^@mt4,FEDsC$x>gsѱQ:ViG)ui3$*uxS%Z&0?$zZDNK-oZGsxsDV58{CqC$"Ôtv`ܘSfn I@, kT$W8z#,2[ƅ`gbS}DU\&$<9^! PfV-&ƻM!ؾښEk3{!ܲg#f9uJK/BPXV-C 6&3 Wɜ5[@K=kGRkXVtZsc`{xCl ]^'1^xF9j_,F5cD)X5v(ܰ:'SmإeȊG) X+`/.L_H L맻1Qmj9#Ĭ[YHwxdҍkyifOмq$0FaG  VA%~Du@(Os_{;!©xYDbʟwi.rux6i*i55d؞Ǽmn]xXϗaS I 2dYf% sZ_Y${(baq'XE6ԡQ?ck Æ %EJH n4Y{}92,yt=ݽ$Qm0hE( a` kcz%n?|rk}:H-R捞 YDrj)X OK I"")xĭd7 ^.s !ZlPPB̶;ՠ:C~$/(!A֕V7=cZ}CX8¢oLXWO p(MR`u/{x*[Q4[ܿz3oڭ}sv>c* k=c!d9=\IP-?hxJpJs&Q0uB}ϑ:??U|l5Iv$÷57%;8̝(6r[=YaSⳄON%En1YA}# H޵YQ3CzPNÊOP3%|c_e[I8^1 $XB*#X텕8KQF 4oi/l0/@$58 y ZҿFЙ f<ޱAauR`'7wKкg?1q ;"vY~9ԩ|W )ehTOw\=(0E*;柊M1*[I: Zu! )X*Ȋ Fd'ycH7" D_!;R50`?x7:x'~*OH'X:vl ŧhh }À7a{.͛?HV?@ٳg[צ(III͛`֬YTjsMIENDB`teeworlds-0.6.2+dfsg/data/countryflags/LR.png0000644000175000017500000000236412140200333020113 0ustar felixfelixPNG  IHDR@IDATx_LSWkEM_AA .DFcD\7^02G,E(:A)+`;JJF-{JSnkK9sK˹Isn{/*PKaaa$'1Tr uGVCff&A%.#h4) J.q@pjI6t$AI[RdeeMF>j,`U\4 )R iT‹[h[5Zq׷`x^u4f3 `F+][ Ș>S!7 d)@R߇-yd7/'JחU 3_z_}m+C]\;*˯ Þ= ' pKOeg9lD'/Y @|ʪZ`jj*`=4L._ŞPrb(g>B~$렇zY8q>x/^ujI:#hXYu?S}A&'=P\F!ާGx`ttP6Hccc088 6 FĉWBK߾poO t>;aqC$"EHAH+^^hrU"E@撫s$ߞzwdQsxr ^ Ajm YHhW< @ŏ'X,?]ZV=ѣX5n7 ǼTӕ-d&);\iRb-R" ^se`,'W#n7z  XaRLYV+{UT8`<# X, i)v{w(m0#1&W6Ϛn:' +FOGr(z/B- a51 @V=#|%)'(C|nn.4M$@NNRF4tIENDB`teeworlds-0.6.2+dfsg/data/countryflags/LS.png0000644000175000017500000000254212140200333020112 0ustar felixfelixPNG  IHDR@)IDATxI,lYo$yHѥ@ ASH!XYP^t?DĢ[ A6Չ^y ׾.ўJUu/%D\;LINNV !!!T塬$ $&&Btt4" `$d2~TT"ʫ xF: &&F> \oH>t$H~b<"m ;[> 7>W|> In`$/Yz[[$ 0v$د yV)m< auwwCxx89{j``@{:;;S)|@GGGPHOO.Jpyy)}aaaa1Q1DI +((u`` [tYװD>Ͽ011bhll2֖ZVii)455@kkNPI dP)axxXgsvvuMOOǿ)[899N^> +++6@,--u6'K'T _ klllh> a}j? ~oo> AIcP-sh'X}4|%l[VYlZ.|,=z1U\J"##a}}}- xssxzaF/'Ԩ àﯭ qlWW$¯=p^.S+???pwwg' ΐ)z$'&&1%<lDD+[555N a<!C^96[XX=\.z7aPmm-xyy1)`mmvEk05VOO沞:D"`HMMe8L`8_7Hz>`x\Aܿ!;;JJJ arrR V.?v$?Gk7߀P%q>hNW_(7b~%z#3-[}xO>|&B5OQ &} @;} PO}>@c>Rv8[X0,s,z@˘w)|\\o d2uX @R$IENDB`teeworlds-0.6.2+dfsg/data/countryflags/LT.png0000644000175000017500000000136612140200333020116 0ustar felixfelixPNG  IHDR@IDATx흻nAp @@I|[! C <E((!  *n FlŽjgOVΜ:J)o$CZeOVSBApB,Ữ+8Q]Y3?eUX §h  ye@s "[ ~/S@G@gS0-f(*ߞ~ ćO@\Ϫ!SzW?O,_O,gO,' _8pcvk< ,~SHPۘGȥI KV&NkOlẫ S?| vZ > v ~_ԻQs}o -H~2֍!x r-w֔?h@dڶMl.h@ =l $H  [(L4^ߥl ,|>U3?;NWOS=yqp\-R >Ç_l`cd,6dB 6|$6k`9> 2>< I>m|\)#[8*rf݁@,I ^Fk&#R^6 4'<^ɅU? \ns 9rx#[ r\l?"C%+ {k+ rޗ+̲暀J{sM>ƚ}Z ]axP >c!$^zvޕ@"|uHeo Ce!03q! S3 ÓyC!@dACYpp! e= ? ~ FZ揟@O˻ZV^u]JR@j8R:k0P&Y+|jk\Ʉ*ʙÇ+jQ6=!Cj4Q^?XTxW sX|YvSZFbr"+8$J%E\VX]V{9FAfS?1~&hxv8§pl)5 q7e §u~çhlEmW?@a_9[4(,W?Εh'aOP^Qb)tO4)FV髟hC ˗ QH|Soاu糗C4#?o)@k`W\H/ŝtKF\Ye[^_UuMyzPm\yF;ȃ:xøġ]@:gJg 2ԧJNd [-%/@78 yX>rxGN,.ۤ#O> J}[މ>OV=z,lf'IMITC ~<3x ;|M*ԒE.@P(,E ԙF+sXY>%~bF6,B$|.V\S0q/=P\Ƹ\VDs`{e k\gըױ "q4Xfp㰌lبs\ju.߈fy}=r~.@8 ؏7T롔ԉl @ȧ$ϯԞ?^E;g*5#t2'g r&wȒЫCU>?,m2b}= < |.TۓY },)"}Ȗ!2r }\yM%/Y+3h='^]C? C˘OʘKfdLdɐxa c LBH'9x[mp2lu:CBi]Hg%9ׇa}-.Dj >y𺡠+gFf; k#}ntLU [9MG ?|LûzmmW6x.@|*|:.ɢֱIQޔ$l;p6E5d{^ }*Z-p[3.:/eL,.b;vc$0gPf_Mpؖf0-x""d nF sr꽅*>׏d/ZODZh>R`ψY{.=b-t^B.pMסYm Ct%JGZQ࿓gTm].!β雴t-_H|bM B;f n&?z}D{$Ezr;i?wyr.S4wNʻVvLT/چE Q~ @rYqCPU@}R ~++2T>o`ehپ-@ρi:~ mC>}?|LF =y\gr]9$Ynĩ b{H[$ӯ[f8d1mY>.@C @ۦ󤲅vV|B8UQ+bO^=rΎ|Wa,\rEB{FSQ- [ei%y PKt&}(YøWM% C ZW? x9P{X{^Ό}hj N Fg }Njގa%Y>uUB9M"/HʖG8M$qkl ,W=cH$&&&צy @Ppx[TXE(IENDB`teeworlds-0.6.2+dfsg/data/countryflags/MC.png0000644000175000017500000000137412140200333020075 0ustar felixfelixPNG  IHDR@IDATxn1 A l[zQEJԦ;UbsXI@cw8wƶKaf Ra[֮'Nh4JX m~$!S]?W<8b!7>^8q~+>^Arv‡L C܇ 0䓳L~/{yCF|YCf< 7a x8ߎt?0cs?`Ρ n~ n{'~wW C~;|0 U?0;'4 @sh膏1`<F Q,E.; @\.EBlC |2kC'zs1壷z.*ZJ($^k4f)iZnR^O} L{3raV+1d|a<rfՁ@ X,X^z-^4"Nu;(rA~TR^ Fvz^tQ] BtAxh޿N-~cfʋF @ @ge,]P]T0J, >н:ՅLzc*p8dqc!\Ow 2H&K07A۶ 8TۮٙlpIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MD.png0000644000175000017500000000505112140200333020072 0ustar felixfelixPNG  IHDR@ IDATxiPT` *(-.,4t4 J0 6h( e\a5dTIURJ*R|ϻnS>{>NS2KĄ\.'hjC `G6()\b1 F08&b&$~l.xf>Sط1g1xŧ@7?+>`SF 4~)#O'l?ӧ_3tO= .2_Nn=C~ @b^P)*=Q_$>xʟTȁϵ!O CgTVB]O[xG~ @KAjKӴ70Am2Au u`d\+.xx: SpTT\=d}wxsW|dהd(l5{Oh9Bɋ d]M_f/Te-ʫ̝[Krx3דּ18S:(Z1p?IBi󠮿,i\M`א$ɵ!4F@9`mB! FnW #Xk+*5d-Ar%E9c-w?Lңuer\A$m B ЩF0>YT}2!kI+KbPO(=DrFc>}ݝMU z#m{XV=n[@%5G]12%k*^ J `J/TgС !pE&8≣n0\N55;z5<{:] ju)< -fh[m]|pf,H7>u2_Ə@g4B&~!)~v߰EO|B Tڡq7)f m T B?GY| ``)`_kTE<(GBd,zQW6 ~ooܮCANT38Q Gwۧv[`q\}аvX5TtfѵkCOtVܮy?,}e)M@~CAF yDo5[0oSJu\D0D'4ؐON>oA)-$ޔ`(NZl1IQs섘\zP!BxUl6i s6zV!o$K6 RkU1*Jt\||/@ER0⋰InAȔ 5>ܑ0I^f|q8VpsJ e,[ ^4y! AcC$NU,e)lJE~*<GO2)>=0A=fǏ652WG@A6)-<+-\0IE8R^)rc*>ETuI>X-uoX0}c׽Ѻ'kp=pc{H3~(c*;0iĿf9uLGlAg>.x|keدrQ_ žs3' NX\;0H'_q- e2[ky67;LV6_.]偯's .VQ 2[ @i4uK)뢧޿أ88P \7$C|` -%|u,3 `BP^dgw2UVjbsR͵."f<})س'{9HNWW5{4&Xw$GZx@<( nliN90DG,H|dliq `ܧpe׼1=;S;Q4}T> `*pO+z?)@|V{T ~oSy{ &5Y/n1خ&! 2?mJð19KRZ 11Q@BB-k ʶIENDB`teeworlds-0.6.2+dfsg/data/countryflags/ME.png0000644000175000017500000000625312140200333020100 0ustar felixfelixPNG  IHDR@ rIDATx][Sgyl;Dd_ uT,Hm3*تU#JYQQDeQԪZ%$,n]U$μ@! ?&wr=}~0W6@`͚5 3Ft(k"))aH! ` 55rJ#ń E2XjU/ ߟ)jtTO=M+ʩ/['3gGX$RQ|N('C(gE̿pVIh"E8)δG(²E0{Oy {= <ǩ~̾0020zM0Xq)Z*z2*9T '̈́:Qۂ>DX^T|a;- Xh&=x F WW ] aG%0&.pӃaJ H݇._`{ä^[avӵd([0g0Cpkư0ʼ&:^F| ,[zN6[ThPZ eEN5E&hHPJ>~6!~޷"㗡0}TiL}6V & |ʁi+~Vò/ -$ }MC/ 7"k$"E(t\Cx^ZF:-h%_VB<҃q#S%+b\w_ -_TrQ6*&W o _p7ڿ."r,jD,'f"o%,g0nH'#hqSSB75 h2n/2]T02#lG(`˥T'V2qȮUxOiʂ<ߟ!2?`=Et7 +k2D&IDy3]Y n;C6ͩ_p`5<@ EF3r9-rX4]c9u T}"U >T* 06&OcyG`u2?،(2  :o=ҽk.C*BgT!(/CΩdX> 1Ct : `Toa%h9+ky&ZWr< P]37v¼b?y[n)~%9X;uċxT X Tƅ4c8kn48g3Ԉ4~-N|I?QYY$NlDs][J%ɡN2~)l'F,1dn*)Q[g$Cf)-L_D~o&`dقL eBN5>FE =z9wN`)7s$B@(n̹GpgSlʗϖgguP {`3*q=XR :(;~Lr goEm2mW\P3? Y1.pOa I9,D.E2#Bd`Þ,e\@I&TNߠ27 Kbv)xg%=:f3YZA LxHd5F\x?v6|@s:9>yCb ԛ258m>MLXjH޶ǠV<W${i,~;*AŅGE3SD fx(0mN$tdj#q-[1|m4ql\)4Y {l(2Q;e0B>>ȾGI~hX[*Ů8d*a8+6R@c.ckܡ/ `2fY;'e`tjվ/COfي?-Ob>ۃY5S; jwjR|y^ꂺ~_!KrԟHV}J7 x* TGTUH X\$L{[0 ,MFunA rE{)]R|,$ݑ(4P?"2ݼ ם&(C;V(%7,4RJ h<Fr|M I )(+ pM_=Hhݡ'aJ3?BMn,7Ţކ#EӮnWF""vM"ԐyqA 2xUDeT4 I0ZRܿgI 02/C`8S:#"k4Dꉆ$=Y":?>çJݖ 4,AB!cuyS (o&=u9QԷS'|p FH"`@N^DKsΨ FkDQ# A3ch8eaB_)n^ &hQ=uU嵬#xH-E!/ʃ R~+0rl,qD8X0Ek?A=E;3w"8hpTwXG-* w ОjhQlZ}GACV4N%gczۤm˒΂i+GS h?00s}\c gŴqsVSF ˤxxFC8/}w]_@a,wɿa SV ֭CJJJm*bb15_zHt@jjhdwTiźIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MF.png0000644000175000017500000000312712140200333020076 0ustar felixfelixPNG  IHDR@IDATx[Lg!1AMx0D냼 jXxȋ/"n-ziՖh&$M4X[ickm*kZ)`sdYswٙݙ ߗlv}ʌRhڵWѲZnV^M)z%JJJ^j*J+@@BmҀ5k֌,e 5*?<|@mFG{^SE6o##d=[6@a A1?wUPןijg#vyAݘowTYK zE&<5ѫ v jc[zCD*(O c=7_oGzKo׎Dz7/O1ЋHWz*?ctt탽Ӄ.<'ve``=/=5{]Y|Wۓ7bIs#+ ^c{1Y9sӮl,=NCcrsk49N_Y>{bo@͞>^m&߁W-GrP99qrI"ixS{Sjƌp9I 5igNҀ~s^kcA_<Tv{8wh{UGA&5v}}%/iwqLKi w\&<ke{.}hhhN,ᄦbUo)=}/a }%KthӦ{OJJJEEE2x?_IEOB(IENDB`teeworlds-0.6.2+dfsg/data/countryflags/MG.png0000644000175000017500000000157612140200333020105 0ustar felixfelixPNG  IHDR@EIDATxioAX=ophlW< 5p4t; K7 {H3\]]$pȵ@IR,p MHSpc8EyT<8`ht!QKeZ_.`?Z:{6ߗ#!#%l9@0jI]<ӏC F-K`ͨeӏ&ڊӏGQKɪk?4Yqp`dQyGkF-Nw/~Ũy#zahR8C^F- ^ )wo" 3?p0jn_\|HP747>fR0XVv(pJ#`ŢP><.P(G0L! h4 :4 _<uR84 l4 빖4 `0#ǶyPV7IVr9@Pu@v#d2,H,צ@-Ct ,AX'@IENDB`teeworlds-0.6.2+dfsg/data/countryflags/MH.png0000644000175000017500000000643312140200333020103 0ustar felixfelixPNG  IHDR@ IDATx TG4ͬk歬cK)jfʼAIEYDEE.*`";oN|~30s8ksJ#h$x\1zzz$Wi "266fx\}QOkYW|h5PˑiQya>egH6cS{1rwzLAQҺjc gAzI8){p,`~y< /vD0BeѐUc*a ,1KP sY2[xFg/ +紿<;f6QxV$G?@S7q0 /><>S̄\/H$1 26"#0<,*~O='xz0^œ(**R^К^R[f?YǃG=5VS~2I@cO_ђA7lq0VCh7Pj1"ff0Y)hGk>}zL+jR~4j^C>jfL1`hqYEUp؟!0Kĕ,7mGhpBD| 4 >VQV}U6"J>܏]Dž LX4/n:ByWWZк~Nk>}]gGÃ1F,;ۄ}G>MÅ(?';].1 Q|ZiO>Zٰe4= K.ah)8t>[AgM(cކ~KfුCxywU]VJhOYW_.^{nz XԧCD=566rT;Tۧ.}JhFiu^\V~q0qLT)#{t)8k!$xp/+却a:C0 (hjPm9Q|Jh/KƯ@R*D&U%kÑ (r#RI>g o. E)ՓfWSpo${͑ :h?ԏq-05vO]̥T" > |bY sϘnoF|[Axp;3x/..:_'14LtdRZP$.uh (@] TOQ' TPf/sg6ݱ?ND~Pvl)~)x  LJ t0nي ;Tۧ.CR=ӆ| 4 >jW3͠f.~K_||Ө ;09߻S*aqQzvO]Q9JhSt5>|OKǟ=oy-dB8tL*4Ueee ;z3WG9WІSW;4K>)ϧef<| tM6 |)~pPnm3,4m䍫K8Q}˥^__@nN.Zwt x4{MM"5 HF z_&o& Cp͔ת8Y7nH "%Y#grHC@P]]͈slvG/!\l s8u+t4öt%=3GέNOֶ[?׃,P.UEN\Wi21*oqQW2vzۙ5FVc6 Cqkg=#;?a²=] @р2N_3[68|hF AA:}sI;{D-C'Vnn~!I T8nrv~mgӶ\D)X .bxw܁ v[&p?s6#  mH4 h(OO )ko";EBF$c}N\^Qe?6{upf~>d_p s3[F>вlf ;Cၜs$3VGni i ';MF NO^ᅩr1aE6' U' =&!n?ӀQ$mmo7]ŞzvN/G[4Bz̝tj.ޤ=g#?>SԀ9zn8=؀Q$NYSVFvE~NGƦaS(.w h;ecL"g zZV/B{i7`IJo;em鏌o??510Z(puNch,s[C\n8?<~؈،̍^k:8sjW[y;p$5@J8&AOtcjtE k?젙eҜ9s0{l?mQJ1 @g͚ 066F000ЀWRوV KIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MK.png0000644000175000017500000000532012140200333020100 0ustar felixfelixPNG  IHDR@ IDATx]kl mBHڤ)$4jiH`MTEAy(m* UPHU5kt KH̙3 >$G= - =F=ynnE84񳯘9vNAoo  Mb"-ÏK^`8խ[ 1D,Ѷ-S}>0%'&R"UoJ"v!'l4X8z/g}ﯩݨhprIG tG3d3@hO=Kn ¹שqz\'>]gK~B˝o H&1 3!Tdp-L]>hYKl"%v?_/)_µfbXȆ<ӟy/:)9諭h'6]L ?duP7[Ph[>΅!6>ɪH~VhxՁCܹ($w[6Υ+ȳCE>tz:sŹtd&U:I?2KP\?Lo\ {s%'#ZI@5v[Ιʁnؠ`zBALdLjoSo5{:%ǦesS+A|.S$‘޳wbS_4wT{.6֠~bW=# x۽̻ߣ//RmqM{.ut^bA5I_GZ :X d{^ؔ_ɏ `C_irK۶ܑjc_]K aS>x߫k1n5>tBwX~x0@l3S'm*@ƠF7~1o 8#[A*d$?&͠2Vm3;n ^^^fVQ@ؑ-ZN1-OdmR;qN&nb7u=9kCE(v&Y.P iQL䬘ǩJxl0&lIZx.5=yӂu{w}v܋6& APmޓ/>3^s^?)6DJod1w~[.g_MMy0tv_|𵿁*yU:~gW2~!(|{'h6@_Zуn[`l68I0VeN{4?6MfKS-_m! S{O~Lsy;A۰Je䩆 h>ϼڠmډ^4 x}k*zt {K%@ړ@R}}WG}xDŽ4_G%4x?g-,%V%n&ޯco}D .tz D:_5UPSNH`W6-EUőt-G`v]1H~$[(U- $%H$d9C'tucr{&_ĢSmpw?d:+ 1""vxM ?Gֻ#E=O bT;봁lp-)&@(w:O]u僔bwOXt@|6$&&J7FpR8,_U /.6֘i㾵Z0ȰLXQ3 b&[ɼ=tBlEq2a{LC`ܷOe]hyL8,3ݰAfl1 q^Xu׃Xs җUb'|uf Ppz L%PP&tFLy?&cAL`JeeramcbW4` }ޏn@drC8a߻mDܘ(fp׬^8ka耭Y@gm#=ӤfA$ÎIr]ج`KȗX46M` eZ`;|#AWId,?: f'Nr>_tHp3ܐeaĵnR}ϙu&{^\B'|O:$H {c|ה, /c:n\E$oƵ(u7]MYpiTLY&{6Z R.5/d^$oDxxqOvWj_HM-S`]h5,4 [k[HвUT*Ö ܹsm#Z  yyyqⳁ&s̉?j\IENDB`teeworlds-0.6.2+dfsg/data/countryflags/ML.png0000644000175000017500000000150012140200333020075 0ustar felixfelixPNG  IHDR@IDATxnP`A;3>SKI2 TA ڦ!T E,aPXApo UHn36NT0!d2T*:Fxu"D?j4$mwr:FЌ03~H6SǞ B|`1q|@+fڪ|g@4yлA7z1뮪[! &]X ׋,Xv,~`Vâ7n.yl{>|\uIo{͢M`>H|PzaO n#z:GOȦ"@VQ\צh R9m;LX,a!CIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MM.png0000644000175000017500000000301612140200333020102 0ustar felixfelixPNG  IHDR@IDATxS[U8G]dc/Tv8K[8Z/@g:SS(mle-ꈥ $ !ұCK̽6&0rsxJqq1<Oaa!deea$ ~ff&(  :ƃlOHayy`Dpk<э,#8ȝGpK?,mYH17`c%_tu`~ ( :2?|$@P>v`~-~!T دNj{c<0w!m} >go  ܿP%-5m`  :\=%|`Wku-#Bl~NJʡ"!7FHku}$k~+@¥c=Z4!s@P$'7榆? >6\¡oC iPQkMV9- 7mXλn&< BsZJam @`6!\Gxڛ-g=VVfTC_^}gz,ïYtm 90 {wCz>vg$H⬮2ETT-˽ۄ'CP0{{7¯>g|x}G#(?-}! ~͵MFHI xDR:c]$@^b}:rN+8NYłcZql6y΢@xN;`af>XH`[P {r[r@kЂlL+a  @T=l14  B.rz>1xta=p$V%&Sj=#67KhD[^ :wDF8OMumf'5؞N1vH oNdžmp3 gpOz xM|G{8v%<J4A(}I}@׍|9%dIuEU׺WwӬ1t0 3(sJ_cC`)6dBߟ1ѓ*|ϤB*yc^}߃t?hO*}`ל:=Ǵt><. K3y!peN)qLZkBl[/ٲɟMۉU$@ʒ1>x 03rY@󡏋ČtJL0AgFT @=`[=:|(; 0y@T V=GpU=0 ??_"%2Cǂ Rf}GIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MN.png0000644000175000017500000000326612140200333020112 0ustar felixfelixPNG  IHDR@}IDATxoE{m/"~!@B\r,$@*HHTH咊Rՠ D%ҋr**h)4I($N$NGc'y8c;]8Ɏ燯ڝ`?3ͼMdnOF9*..Fe(U<l}@^^*C8fQsssQJrnMQOmD!9@h4NK49D|@$l`KC? $H:1  |oK8{Eg.L[u-V\u0?qz?Sx51};=$zp=n,1Ng =&m0шOrPrN7 x/5X,g F%V`.>DS3)z?BBlTI LПgAl`0Rh ZeaKrǏYz\@1 ~&p?a:Av:5H{w }XEz5d9堚!1(LZ`*GH0u2}VwJ0 Gޕ $X`qLdj+'#R@0.pޭ,cd~0uBpL\.YHeA)Ck4_UL[^?ܿ{ ju>s'8i=XD'|8*҆DW\1 !ݺS5]t"5sN*p,DӓI%+nƭ Z Z F;S @J>v v}!dW. ꛿ u2ۜU{T5UIj&6`#x6& @fuiP 8b} CG%a92~b}@"0V1rTԙg'>5 I4t1?@ee =9#{2P;맦 /G22B8[3`2d?,Q# ,S"0A SF+ 0a"}1BP]2T&+wa $ WA""8c'%ph j>gBi-U8'B+hxg'4SC՝U`=i&C -<&/`Yu4R Q:?㏔s[}F.|{eQC%j^Ci]8 B06G9*MJM`.lAzR9[Tii)EkSjkrYf%#(((ƫ$}d0IENDB`teeworlds-0.6.2+dfsg/data/countryflags/MO.png0000644000175000017500000000402012140200333020100 0ustar felixfelixPNG  IHDR@IDATx PTU13gGmzh9cMM/k,|N 5"B<& %*(jF@Dy9 ޻e=,{N0 6663i&3[[[7`&f.B[XXbp04saii@vV|fY:f˧0n7s [fR3g+g0w{ 䄓g[?ūAL>^f?3l94kU&/3 Ųȱ%q?]x%`aiq!<D{}\{>K/Pf|3^^ EgIu{]l:8onQ!bBbpUҨ7:Lj<2̸c`3ln{/ȐIcB'WJnn0[:@  HxVᶼa@> Xa[&gZv9(潰q%.gd?QG_->3kTh}'{~*/dDwqZ`1#Xij3X+0o&& F|{hHq. 'F̂6tcЇ@"z_H8yLC|RHH uo\.u@" %,#WagЁ_bh;ްX.e*.(WI_ ;of!)G*o`]r::_:v4U,)uqa~qN 2[GEbXsi8WV_'9<H&}JŢHLۿ ]UDC!3(!8ISBFNxf-D_*<|5Z]Q!{ ^ɗ7:2HWP]&n666oFmm-*++QVVF)//TTTPH]UURSS7oҾuuuu);";3@'ma i(--Ւ\&$o_ }Vu>g ,##?bpQFnaV133wZf\]J=g 8<(SBj9l?i8|$2N#UP{*opĖ1yEOOkp霹v%5gt7O^r_6??B~Ϙ= eX܉+:x.].ƂoC1dr؅r{&kc"a~n_\xymn 0mg DܯDbVKyG 挠OVS3t$swkg\= ;L3< ~?/~q > tCKs&oў0ժt3@~ $&xsv}ePotc!P)<ǠX!y>3Qn8O;͢ZdI2_>A:uG @"C3q_M9p){wbId8z9w-f#}1{5U"%' EW2򵅼3I a0 `r"HyH*ijark@/q H;< bv_c` `87L8V6}qH `5Bc:4]w_ܾ\\7rtaڼ!]~2*JKP9h/Zz曅>ٟՋ|(LD ToDQh!ycg|QtCWW~t6Rގf~ [444_?ãGrql8Ua6*t& G=4ǣDȯiB݁_q&G^B](uށ۷g*+ql :eIu n߾:t<74^8}Km$ N~vBgc:tq @(|g[SD+իu* G_Nv?Gr`%EY-j/"|3%pf 2Wȿ靍IȬo? !-*IƗ&0Fxʱ;D! 9۽x ؈ppu>ăbo wBqNg{OD#^e5"*."b bT[GnA^Ϭ2:Wbm(5)5bḂsѸ[#K~+xFKqMDoxM;Ө43?#V ܽՎڼ2A(Snsg!ʌ,*CHh,OCHl#2!i.׎ķj۠˅*jTϺFP@Iem'1pٛ,duTtϟOݽZDg@+$ٟ4 #R S@|=Ж/E~vZvuf=w>Gco :/Cw)}<+K2l;yaSeD@[qx ѭ8%~s@aǸ^2)ܿ10 L,r-~D;tBhHh S*W 3[, *.GNy( nBi9LҎ~f%Jes^eΦD*{ p+r,V0 ]7D~†}˰GtdD$ ŭq)Ő}ω=DճZ MpDB"𚁈`?0I7w)ZcS5?z).S' o"&rks/?{ֶ+ YUP?-.R߾7.ރ^{? + u{Һ+Qǃi ܡ1]?DUu.]$8g'!ǘ#(<{!X2zp=@Ic 0ޱ$p2`6dտL$y|]-|0$Bc rrr L~z.ͤ߮n䝀Mp} PX`U|:`w qzZ_)YfYǍ6LkU1I_䱚 ߨK?@ϟ"*\2@D &d?:SA-͗)? 9.ԞGJ6KE6jAИxl^0ٲ㘢sgFb,T~I>XP(:';Tߡv81dQQ{8Q" xaO45o4BRv<qC< z!L{B|bi-CdLp8mz~3v%%%pRfT} "MMMqܿ݁ U0``5bx#P҄+h< 7㢽܂2X6G%6LMLOtsuqycӧC|rQPP}3EH.ׯ~s0C?p3"@?Ȇ#7Qɾ>z v$e`~A$\y hmmt]aCH.,~^%wnok~~zq .vBk+@E[j!-s'o˔ɦB]C@|lmha\5DG-ʧw{z&L&ZW"n6ʁνd+WM:g*{]1v>Y7+`gffΐLa(~jpy\|@&~WFKK ݋ɵPJܳfOՉyN>MKAC%߅GalLmIp6f6F8VvX{{ 5 c@H1ٳgLP_ `2 DƮ8ض nΦs!2. ?l#ӏ? @bB‿+8Xq<&$֌C1A%4 5$Oמc10(BZ# ^kY=Ý'N<=p%1h`cmSN ƩaIII`wmDvnG+𶚧XOa0ҐLW;ŔAEEbcc/ c/3@rl6ٰ?EFHq`70G !韵cxsbb"|x뙒?г[&v^Ǒ#G/O'Vm]i4\1W~3;UX}c `|ᨹ1(b ?v|dML,!x.Ah#yȴe-3Ec{, AUQK|'=&:{-ː_@~YE%>> /T`|GD xl\d0g*i`o ߯w5|Cj7;3 A+nxM%#stm7@WlxCN FrRL?ǾXUTUDNq e r][5AMP~ `~usU 7bz靽g|ؽ=UTb!|3aI 33 U&}||tEaQџ)bf2]7NJKIX^yRK/!o~(.9BHHOO.UHt ,#3l1ۂj:28*3..N`cl#$P~(9V|>ݴr Bl[ᡶ$<m-7\c80嚂IBϠ %RѾ.VQE@~mm~>+7qD()AZUդl? nc,Wr61IHW[WdhqHAྃEI]忏SƢTv͓ ?W5*~%2:EUZLM&)ɫ"$ lAohj>L>YW o(Uipn_vjpׇ} 񲹍nb=Y4;  7V%g.AwCgao nR{Z gXiAV^#>_@8PUqW'T>NZ. ŽvkݒyYsXBWN@'lˢW(+<I*$w.q<ʞ! ذ/Z CS"m a+\rO' {3^- @lpCZ=Q;"on}q GnnVɘ9!|Cy? zqv=u<l`"P yN&Uu=vd9GaQ[CF<+,z4|Ç2 MMMJ^Nh؀ѣGz4dӋ/hЀ[ZZUUUzpȲѳgϨӧ,0{9Kuu5 bumm-- Z__O ,k7?VF`5 b$,ټ4eC2^PQ[Tэ A[໩Ӈǧp`#OU N4ƍ~Nޭ@<i_D|`QY E%?"V*pM9Ŕq#_4gAQ HF;&S  &TxDPEGG'qPAjV:Vv4W?'^EWj-8C=8=s;/F:L?L GX~G!XOo#yi^K#] ]ז3 𤬜B~>z@.iIuh5G-G ^j 9OeQedSZVNqTYũ}IwG47r}['h@q%̾fԪn漖Okchؾ|e_m]#+/(2)NU [)ׯ3 O)S`D -A#*PU  i9[]zd <_Mp!TQHyw)d TK hٞ%=eqbuC[Q3O_5vXlg؀: ~}{c W); ÔoZ @o7H|hL͟SDJ\z)Dk`E"yᘋnB]8u3SgUtK+|:/+5%0߮t%&KwKLr;@VdKũR+tڲM^t2ufce %JHn~gFcgz7V?BepS^~AF_`op8w2C" 6M+y}L:K%^I =z3sٔ]@wJ/qb67`gӜarI%D]Uj['|pQ(VbpLؙ&wN+?fDal*8xb/BRnI~4E%f"pk]<CE0\Q@˝"t7Cҗ. ]:GB1)>THQ{C(A 뗜pc#KQ 64.d'@OO* 'd^SE`hIx>#M Rpt*6}pn%.lh#4KEl*8U7~]59jX' DڮXElOGWQ'|2^:-8raR {^B7MK$\'"(ϙSau^(a>$47 ?ɴ3Uer8a/Ȋ~SL:NTtMF_8IOt,%?S(LH ]l[[Ǒ/7!cՏM/J\dïX 3>W? J0|9kdJM.I]o](91 g4*AS7B_RcK6hMY'n/g99 ߎiaZ46A1np; ÎxNp@sRBh'TR: r>ŁEPAUi߰mAX> OiDϵ7RQ n <&/ߕstD¡j@`~a`]q\6N/CDX@fs+blW +#&8([- Eeeʱ{96/{xaIV-pǰcX apgTի,FhcoQRVV6E! F_LEs!ΛIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MS.png0000644000175000017500000000554712140200333020123 0ustar felixfelixPNG  IHDR@ .IDATxyPWA "(]#!* "*rCAEDcQ4֍IֲhYbTiga23@O~S^WK ӗ?LB( ?yd:ٳ˭[P-'NKB5iR {eDB }o}OO゛;y''=zԠ`ԩ M aN5{HR=j&\WjBZePCjiTTzY>>xب_y]CݩY}?9' 5DBM3xqۛ]hmiQ^'OdNKpYz++\_ O=RV_MW x6ś]U{{fףGaC;w:ƌ)2*ts DSk{( e2ǏF<ƍm @</_aS쉦uܬl矛Yj/_~;558Ȍ6"oM5^iBӆ lʡ.OWAofG!NHX7h.1-?fC^qt}p{vUyū/:4( ~zN…θ[WAS= }lJk5 ܸv.jQx \UVŽfNoBCق z>V'}#~E,›KϞESnCx)A& YbF6%G@d"NSU5/`j~15*]'擶@/  *:Gι0緀\]8 ng, 0\? {s7i]Li@'䆷iw_uD=z[}V Y.n] :B+yU=ZSViEa+^ ?p0Űi!vҼ߂ N9?A Z5|2W.5~}b3PT1x093%̒l å':f|Gٖ'h E唥E(zG)F: T-](#Ex>R=aX]* <o !|43'(~Oq|P>@m6(߀!P>‹Γ^s|W۴CC="#2peP3LJe3#22AA,CA!vբj[6+;к?1 X,~XN%Gyd"mr:%'uUF٫,@ƎTլT|l)V9 yƥ\6 YnWdS²)c,{ِ{Pp,fy׳cv_ WE@PrN,?_})(Fic,50pq:{+F{TCJ(7+h QF;rhg;hgjQM &l(GGQք6bY@ 2玽.ӧMjoj=$=bk[ .~$#W"r 1ElcX3iIDn@~3$Ī,=)NDeHr0' t/p!K\ß@ynފּiPY77> \40h%mѐ)>MNQ4)` 7豵b]10o/9\JT$X.C~W9N+1W/ݙ@ZEY41дXZ|R4tUSr7 cPH\£s1oV@ش{M.FpSbQ'cg6sSPs'b떽pt\ء q]!4n\*v_{Iˎ#*U p;~R2Ya}ED5׍?w QV^ѣ_ni>=o)?,]8Y>r{ɼo緦CxӟMAf x}e+&!x*3 Z *60my{A"^ķgj)1_8sF}7Fm ͜9Εi@Ϙ1C20D>}dH?!oIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MT.png0000644000175000017500000000235712140200333020120 0ustar felixfelixPNG  IHDR@IDATxkOU+ V_Br[047&ƈZ1Tk%KEn) Yw*W 3uw3tΜ9O !{93Oq\9zֈ/YUUUTٲ%R׫ïzV*揊gjsYǍlV,{2zFV$Zy_X JOj 0MR!^kldC5ߵelfn9ޭ_yv7cԹ"`0E6\3͛~?`O  mJ) ~ ?V_% 76|LJd"=N5 ]=ܸ^pm3,־WJd+_3sׁ`47ӧ?)[C-@ӯFY#N14840#m>ӯ>:X"vq[Y %"6!`F6LLdǃD&3Bl5:+9s5:glcl, ֞,C@pdOZ" ]? 02Ӧ/7 9NO[_Yq < 1_ĵ[|c(Z7=u;h;k㴳 bii 󘞞ĄISSSzϭ}{ GPjϑkz-bY ʊzddæ$8Д4[ PPl6Y[ @ llL|ڶc`aaA(| TZGGGY(tF|,..:pg\$֖c> 2c^@fffg\ ӛ>E8qT9Y A5(=9yHe_% p@Z[}7N= Hjcc#)Wl!e R0xE?xIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MU.png0000644000175000017500000000151312140200333020112 0ustar felixfelixPNG  IHDR@IDATxKOa:cՕk ŶtZC5qcSR$&&c!n$(P RhMmѐSl<ߦPi78Q+HCCCèz"X,FPHp$iZeèw:,3|͔׷s4ُ8Z=҇/z!j03!l?`IGLdl?`b#to# N@!7+8F]/.4d#Md忂 Ȩ2`zKG2 ly@C_ϥ] ]Ȯ7mC:_ejPS(I٧l`k]҂BK7x`a[E>(Uh&t1EW1|pa[}pc4: uX6mN5=0N @l(ezfxm e#/C0o~f IENDB`teeworlds-0.6.2+dfsg/data/countryflags/MV.png0000644000175000017500000000216412140200333020116 0ustar felixfelixPNG  IHDR@;IDATxYHTQ/Q3R=SFj2RZDe嚥BQaiF B5KZdf=X=WgL;ν3swřs9s(@ -@q(K<=JEć0#m> ]K(4kQV~1Z`n`q0FGM 羝w~d&FP޵N?vO] €;M=J~=Nq fG(/t(%8ƪ 0C̕L6۰iTQU[k(,:e0>1x0 Kl` ×_;Tm BFӤpa#<5(B7%5oKg>(Y],' Ň.[ي Fw6XŸq MQ}k`G/sQ񫈅,'W~]Q_, pB03 Ahm+C='Q smq$p|0V###0::*ɠM> b:f^]sw)J@[ʛ0<<,@sRs(; CnЭYZ[$ȬD|RHYUw"aY:g _?lM Aװz<_z包qPx܀ťI(W ͍݉tv ݺayzx Py+(l,:(T= `š;1ԱyL `mK5 dYZ˼@UGt/\1\:eUMJxM`ϰP,@? @5aϦOӾ&AH˹ BX @HMM$6E; '&&b4`0zQs4RIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MW.png0000644000175000017500000000446512140200333020125 0ustar felixfelixPNG  IHDR@IDATxST~E;RrY M @FTDDV0i̥նi/cR%&QT8~iסb=39g9a]EP(;S5~%''#663U QJJo0(;Sev>sT2.*..h@k:g|W|d@EWg{WhT/~|qoШ~IޯА.8WhHS+4ѧ~0겋E_/+n:|}E_wnƯy.^`k z`c\u :ǽm{q/_ĭ_Rq߀+._r` H4ʺ[~|mQ 4 ,1UGpyb |~uo>\[ p;}R<ar|c2KNi?M26W Q_&FT3o9-W .moVE"8Qa`&0J{we}|dd!+< !'&ɩؑ '2C"2[~-Wװ>jN>"mf#xY~8$9K+** eee;v,+V9s7r1B$lioo,Xmmm=z4c&i<>uܐ#FEfnn!U: @ڱG ~ 2Ȣ")СC̔;g8} &]9r^)Νݻw˼={ѠܻwOt}QwwxѣG\xQ~lS˜:fza"9yƍ2}˱ڵkr#.\;w۷o?eAfz?^ J0Eَ;$L!NDDo# .]No޼)}#Xiii2Q[[+OU ` ?!`g̙3Grx3:;;5ܹs2}cOYp1==]V@/=E 40*Mʒ r s;{7g9zਂK,&. Ӊ5ܣ`q8bAHxx'|ϥ45Q0]]7j(iiEGQn:&t_)izDDMS ||j3sUE'FdFm@xx<_5aݞ$ PWTH;^9ev]Am$-i4O;Û@`GciK4+ƖJGớe[,CůwcGtK ~/bl0I=|L72:3ԬN=3DBٯQ> LH4Q=ZikeGM$7|/H4|&Px-HkC~X0 $6\,y}a oom5MfgȏoKw/т3XhS?_knhYy`i5K}S[tm\3JXX0}[}-&0W޷E77ےlcNf )t,0*k*k=˧<[+Z7z|<md^Y4?R)))CLWb7_mYIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MX.png0000644000175000017500000000424312140200333020120 0ustar felixfelixPNG  IHDR@jIDATxSTWq͋J'Q'#$aܒ.`2 (F :Q]DeQ]@AM ,nEsgF@>Tn{y|s=)t3euț":ZwyRxcaa":FАXZZ*ohhw:MH>Ȥ?-m }6cgd6}pĝ(K!1ɗ'YZ'Mfz$GᬶI}UyUsz9őHmUTy${ S/Y ɣ)*<wFⰫ +Q@ԶlY>56,/sR{Y|@է/A3pBgR{:մ $Ɇ ^i|.׮4qA~lcLinl>pþ"vvu>׹"P)Y1(5rk ;ֿ*z @>@wn>BdREX2b=Hҙ 7M#w{fLFbG^j,#A=JS \#=ߣJѓ#u ZX4{CH9MLQ>ǎqk)]o+Ɉ #|6 rNpt^RC \Xō7v\rENQr@sm8<$$Ésk*8wlY 1' qٿ?Yu|䲆nn _KW /-,-ۗp=_@]*FtYښJS9LGQe YFe=%K8sȋ^^|ﺌB&$lo)'s"ʟj) E&u[|U<8H J #‘s)T^@})/ __x `J4 TM`VMƼ/h5}@,2qOts&>@S'h". 5|]xSsOb9_x(o|]Џ]/m*ҿy;( ojj* ,-- &&&(D|i IENDB`teeworlds-0.6.2+dfsg/data/countryflags/MY.png0000644000175000017500000000404012140200333020114 0ustar felixfelixPNG  IHDR@IDATx PGocZxFc" Arx!`xG%-Q#`DGbiiLQA"h$r)y]B]ޙ fw= ,l`ccT>}Q0333D*DBňHUnј ԑ G`>/(F|2@q!xk!}4.]d6heVTPAoq,*@:}$%;=(2ouj3 kλu]96'XQȃ?-_/@7@ff&gޮ0LX0bk+H]56BJ|j Mn4hUgCGPrS|[ԾcB̑128M8M: u8mO] 픍=Qaj߻l$߲O}C<ЗDPe! )<37/u;tT}=$ LΒ?v7r}B0Kl)79hj:2VsFan9;#1FNG^:|f!?i7S;`Sg_zI_v=tw4ݞIog7L8WFd$g`6J%Hؽ^10r!}?\ﱏ;]NЁ˜$˘hrUUUAJJ\O]0wb9lUfĤv lr_/%+ɚx<,'̇>.o= bW(>U^V X| Q_3k|C˂ekݕ\k ~ ppDN1NZ0nѭLn`>kjz_[: 8ZM.rdCT>hMj*0j:W52 X8{v;$L k:o)$P7!kgJRH Gb{Y"TؠcN?/ Jh qyjZ82uPX[,PrXaWQlgX#~vvSԯk5(ޢ6P4ҹo e^|_8y7+I=2p?ڎYLh;Zm7sj>c6H4*hۧc g :Kg И?^Ǥ > k-JIc75:5L}dPibN@ zsO@ں6P/0 oee% H$lKKKAxJ #vIENDB`teeworlds-0.6.2+dfsg/data/countryflags/MZ.png0000644000175000017500000000404712140200333020124 0ustar felixfelixPNG  IHDR@IDATx{LTW Oa: [#RѥAyj( ҭD@BѤٵi5AmTkPZ oJ)P]Hspx(ҡƜ"2s.ngذfg/e=탊'%% ^$Bjj* ?>>Cep/;rj*[s)> z ۶/TyirPϱ/s/=1)pe_8)w\&q @8am (vrE'q>"RBOSiP@A?6_^;U,̙ |e/lb_\1} ";!*2~`pDt//ɽKNO ŗ\Hܶ{׈eؘ' ;щм" Z < _5,GFzaF`_dsYF뗔 a??m%5ՂD2.q׫&9W(Mw6X<{ \Cͩ0o#\Tj <6՘<] rBMwډy0ӄSA''?Cztwz)"hW7cSN8Q_qK+σ)2hA?Jaz/-pƏkUopPF8h%KM T33%}P(--EXX~:tĖGpu@{ da,ca zwϣ|j/f //Dqq1Z[[i{E\\nݺe:ЫD(`@h[ňA`` VXA5y{__233a477rj?W @.#"a4vZ0LvFFF_FeAL$aqvGrr2V^"4557nbЯ`6tI{Y2PlvaxѠ'ODaa!ױcp\Ds4O ;xYT@;`&J{,h<cO>09O3_EnЫRRm8-~q(AtyPw_i-hf ׍u$Mԍk 7?Ҏsc/Xmt{(?U|yЛ.Cw 8/{O?˿}񤀠hY?_phzV/z2qU=>_oTZ wMצ a@OJJRS ^flOq4QIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NA.png0000644000175000017500000000641312140200333020073 0ustar felixfelixPNG  IHDR@ IDATxTSgQkkڪkʒ)g꧖ZQہ(2D`[DB}o?nBBBH=IsyAN}"h9884VXK}Sk/GGGX[[4VZhhVVVD: cZ+)h[#dp:#KoL:Zt9y­ G5{I_-Ulq8h~6Zntlohq?*g D]n(Z`vوd(䩤_'j|4|Zڎ‚(<-bW~fekAʣ& }Kj Nc'뤯Y`͗HwP_|:Om~Q9W7V*a "#|wa#V!ycEe yrd8u78Qb8*~ݲO~LK7dO-443^nxPs&bԤi8}Q]:` @2?-ǮgL?N#s;Ϡ?`. ?v^= @cJG+m`XmZg򞸲"{H;f.zX{6; KQT_]T= NπbfZ2U_1\Ħp>%=ԏ.I:4fn yQ_v9},>CS C>_?|@˘,fx fuk PWfp5fDJ|յ(pYژy~4,L8^m `6ePzKQj۠~]1[{c"gL)+7/jj`~d`t9XyB! |4@o*/[e<Ыw @А<pFAP$KFEoƒ-񼪚Çf?,Aܜy](@\.3ARD 0|lR)oJ!w #(+P#(QgdGk᫵4ZDV>LܦK]]a@ /9bP$&kj6_w3 C0ލUY :LAXCK)iE^"ᓍ02a} X C x2 I%e(>24aMxkM{Z4^{Oe@ dDZښMIQ^Tg}zxIl<** 0nɟW"&!Ȧu# '*bNzVnNkJ:EP$96(u/KjYu0 'jN9Oƪb05s.*jR1O!/9 0O_"4@'vc"#$T1ک$HҔ61+ bD؍ϭ ډwYBTX9;;^_j\ vvvZ`'''Y[[[-x55ϹIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NC.png0000644000175000017500000000476312140200333020103 0ustar felixfelixPNG  IHDR@ IDATxy{{{ΝfwXe=]9PBhX&r( * r$`4*)"cńDԔ r%c{oq=fS5}_%` .Q:Һ7M|0vX (tBss3% 7WFS aMg7 `(ʶ+hm2 `XJc0"/G7 `DJ0,14 mi({\:p˹܀E VVZ *^i'iWRh쒀`e8+N~:`͚lwo+?燙 ,[ K ~˱}>x<+C@W$.>ܸ} O+Ѽɡ:{V@5 L͹{|}@PH:x܏G|N ʻu-j8RP}Bwx#%bB{:HſA}T0ł%?VX6OR&x~7U E_#-w&>+Qc 0pZCZ'󝴆)<^\}Sp8ݯ;|Eگ䋷[EPOŧb(%dgj|rR3oF?Q, 4*HR("Liph˃^YPta pפj 1ľ=(%~醊x_w;/>|fcH뗛ͳ?݊[8 ii y򠏝!Pz{v'9$ OQ"4; -g0 aEt Y緼ÔY@Ƥ>*a % OeB%2ȑ0oa 2@Uy mP}xf]u7_Y%DGj i:p,I׷pO/1mz"=evi.iXAJvt%")ۚDv(:S؃"F;.#$%}=<=Jyv#V80:-|,M=H!DE5 gԩ2{;G"xh k[bek/xِ<ݣ`h-2Ijr"_< ޑ i _L8(:i"@"?+dps54@yvpZ/I \e&l^;,֐ Tz0ڬfTnEͤ{-Xnpp+W nI,jh-iD$7/6c&k}`if7hZEoJ|O.]拦'z]o,P&N3 @0a) ܜ ?~)|/5@l2`LIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NE.png0000644000175000017500000000204412140200333020073 0ustar felixfelixPNG  IHDR@IDATxkQI6+Q| n|TGiILb".Ep#]ࢨ ҇B+UEaR &iͣ6i!{؆43I&=E;;C d1 |DZ-Aƕ\Y% Pt:hll$ȸHaU*A;@aT@SSӿQ04>iP*![H+7|B~(G(Ĥb(eurVO(EXrt? @ 3y/LQ 0'|2@~@X(P@~5%>HBC/`'VZTO #/[z]bC)> Pd"=WpRaoֵ . ґ |s]ɠ"k G O[ZҞ+YqۢeяO[ 8@ -Z_*Aִ NQzh\緗} ,..< ɿԷs tY֒N> AΖ%|g5f= P!E\d%h4nsٯl &2!nm`@B!,gy6l!Qd[[Z[8}ff1T4Xg.wFq,)K&`i( lϢT*U]zna? [OyyM 1ET2{ B;h7uñd`ۛ3pHzls Z?j GDՊ sZ8)@كsZ}8>3 <,C%$%(Q, }:ęOkW=|GʗxϧROAz zhnnצT$xFKAajQSΧlYOIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NF.png0000644000175000017500000000534712140200333020105 0ustar felixfelixPNG  IHDR@ IDATx TTIlj%61iq]""* "El "*JԀĤ$&0lox9f޼û{@(c SZF@7KKK)jĬ󍌌5#m:U֠_{4LLL$pҗu>H/_a@nk%: 巭omXz @N+nĜ\c@h cQ{<p@kq1,\42(x|4݂3/&!O5&D{s4%ͧ՘fr<Z 8r@o5ȏ> ӲX"woc7g)p=ͬ: @M g2ӱ#GxyN2? PseXs3zq&[Y zx+PRrrT<9Jp] ;_f8`"~6m*pS3{t!n\_lXȎ%5U9bPihɱ#?`<%{$JAH(o>>t/EϹ(:mLd,fy@n5+ JTk  &"!'#(/0q(W5hgf]Qm 1ܣ rMdf4k˥ v1a~3RJC=0Y'ѝIt?:]@lG΂ӶP6UNİANcD+3w8:ʪUZGמ@3,cȹ(@@[<8J]Ʊ։F͈ޗAlWM~v>@I;dcJb,K_~Pz_2^'|axtvCn//ą \ 9_&+W @vUH=Nm{$5Oo= I1hGaj dJ 9s '8rsC>9k*o ykLA@UmTOVQp]^E>9Kv7dQXT]"MɹasO4o A<>UP}4jHq8bqNQ6OI Tm.#Yg<#,ߺUlt.*J9Ӿ}D6=IQH #t1+ŕ5H=@ @I^k09wCݝd~hljTeP jy@4x@'2il^R 8V}}e} r+sGt̀^@]x.)@ )HIpt S1K%K >>m@>.Pb@9@"zmb@ @8R/]>m@sXZ[}p]g4 Qp&4_d077צĵ9̌;aJ)w/P1mONIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NG.png0000644000175000017500000000140312140200333020073 0ustar felixfelixPNG  IHDR@IDATxr@`=P !wb; ^.QOb 32ݿ}4liBidzMRjJb$ CSBlsp䀘T'y.T*=h*?2]P [4@4~kj<\*>h6Qz]|`G귣@pg@:=q ~@š?hа~޾@"k?NF<귘D<{: |e|p@jh^|po~=wxZw``zjEł& }t:&nפkd8F#g)f3&9cvxy l6\.M16ZE%?Z\3 T<~1 xZ%y0=8-RyD $?( &hHwJ$DwJq[\k)I,2 @ ˕>k*Nj\}pSz8CZF)r؜.|RA%0M\.,^IENDB`teeworlds-0.6.2+dfsg/data/countryflags/NI.png0000644000175000017500000000266712140200333020112 0ustar felixfelixPNG  IHDR@~IDATxYOW^. vBTiZUҪIj $ T(I !l!,PPjY11 9v %fly<ȣ>sΜ *$%%2qT_$xDFFrTB #""8* ۉ@G;'F>(%uHaI} II"%O$h&%uO$H֐’7|@vIh;0|@֒򚱟׌$@}O!nDjZB$u XA t)vXSSS0 ~ALk'6\>@2lߖjeeIC ,6v/yWd]떻!-Ar's\D{| cpo=' [Yjvlg}Wlр> $o'o4 _;teWzrallh^'\W&:_/a9N*|@N1_pq².<( -W ^b賩g:CY+z6YO\ ȁ\6aBrAr4˱lnnbvvrj;ޏⷖ|\){Wk…췑v]!9_BݭeìW8!m6F㱄O(i/!($_>᳼S8}1I"uq_G^}.Eg{%~^__b9XOG1#(4J`?wٔJ:>y: 5w/--yBs[8].^\\d]գ| pC/-U- ILLDllmJC r@tt4qM֑JIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NL.png0000644000175000017500000000147112140200333020105 0ustar felixfelixPNG  IHDR@IDATxnRQy m!@)>5&ZR['/1h&N&J .Y;B+|8`:rN"{f\)oBF) 2nT@qux&PO@GZÇx5|: $·!PFT@ ãÇJ{Cah~ 1ס!@C Tܣ!^ppZ!0[Ct:JϠGKdzٮpkuudW@êRt>0heeHMKCT*YR{{{J ĪVN{ h^;;;=4}r'hV6-//%|Ij5'!FŁec][.wwwխZ٬:mc2Cbښb}}]sƆ.Z(hkkKÿ1.^SXTa pXv|&1x4uF<[}lj*_ן48V3G}?IZ4t2>dy%Ԭx *Ui8HVTқ@e ,8ĴO_|`nfV z?0Ѡ L,~`M B]@qf~`0`tȿK:\͟g;>:J{45[gŖNiqqb@ H*>!n= GEᶡ(>YMt綣x@b ϑHSzq&cߥ; ܵ# 8-z)W yޘvgϲE1쥖|qg7L}#Xϥ;2۶Sk] j2ZyF CtJM6.ez_?'YeG]hz ?~!nzER)td ۦ<_] Ӷnz5rq- `jC^;Q鷁^K3"g?F-q>0)Tn@qF>00"L}`l94`s>Pv! X1bT*(8n;Ps;Sr |@"_"d0 h4j'T[[_oIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NP.png0000644000175000017500000000404512140200333020111 0ustar felixfelixPNG  IHDR@IDATxiPSWuڪ,nbEeq([XV?ntTE֭"NmhVujǺ$5Hz#7HB{w\s{ι*Q{EGG[#dEDDDʘF)`R pDbY* ւP+V !!!s=8q{|t~PjvdT*ul^;qskx 7٫8S8KR% yφv 9eJv(BA̧@H\N̨aH+hmͧ VD*,,V_ }|MXzBTCCC seCJW:|s Vh;Ps%chXɟ:?0|}n>$6555;n&$OooH,--n0!qgB H csaHkH}~OH,//7i>o@s #W*$o V瘐8i8;H '2LWHTOҡ,/!R,-G4eX :u/^NCKxr$_iqk!o̬.2^eBxL>$ݗ!*Mz?[ % ݱvG >$k3Z555VO%(yh7dcԝȨn1]|dKu?N˧-5;_@y8읂tf`s<#zĄ#⡷}CRC({B: ^ON_Aܖ?`s= YPjUUU ɺ|Ne]dcۺ,s=4nͲwXIZzq6TAApURRBs5hhEETVVk|?ϰE/<2OqAg誫]IT V/YdLch )B{ \}GHN"^khr$0Wh</$ir@ӓ.Ց-c]v6,N>s/M@:< G<Ϻ:(0-whB N=zlw,Hh.PNU{M&I5dVI&f%5*X -ZƷ/<(#}}RI @@8N;>fj>+Cb*_>k?PnLncE䍝 Uj0/%e7 GP*mC  P|"rjdz_uj1bjǽT`6!!x# {32]̆@59.u5܆,, FS?)=G̢y_R ?m`-Ip35G8 _CIk}}!=aP @ bst>A P7vOqw ml>!=a1"WGv7

!LػlMA^|vp! Qj!pxDwDSpTmaaa\@,[# jvl1IENDB`teeworlds-0.6.2+dfsg/data/countryflags/NR.png0000644000175000017500000000241612140200333020113 0ustar felixfelixPNG  IHDR@IDATxLeo5g-5Vnpp9i͖w`nP: SLKVUj5˵J膎C~KL1m=n_sk~?xysIKK 0ꐒB)k,l6#>>0( EGv s2ƔG,t;HE̻0DfrRCT -"|@Fb  +=.ab{,|@&<~@~@,l@N@Z~@g􎏑? ^, xXgd nYوHE@όed$Qfشy5\mVD0~諘 O3 #`?=+Y>x@Co?wttx .+P= H3al/:S[w? kꛮYdsS>cCbe;s[ AUMKːf,ޭzH,@D $W= L{'*?Wci] 0"j@{{;*jE6xj.ar~A1 4[h qMuԆd; AZd64)N5QQ; U*+| ʨڨ Ol) c˻y TGmV/Ǣr|]WЗL= 0sq^P]8^PU(^g-2- Xrlf-dmʄ!AHLL5*OJIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NU.png0000644000175000017500000000536612140200333020125 0ustar felixfelixPNG  IHDR@ IDATx TTizri{MA@A$""IlTQ@Mhb\qKJjbK$hEEDQdPm}߹waȼ7390w~{~{ꉠf4e"uJ?~M:...DJÃĉD5oEPMlw,\#p -Ug1FHb^6 h]{cv89N^y׫ @k$U?Ejzć#iJ 3%@n޽EUk#3ԐηrٌQ ISˌίDz'{TP@-?7 3U`8v~8S[ k5[1r[!u`FkxN~=s 9sPł.#ɽI" 4$ ԜGaG#m,pӽ\EY;azшn!aJ-|CnwT~@T@s1Wk2=5NtBo-BܻvݶCGP9ϳ`tQ s9~xp6}0wD;g?0V;ml%qRߛmtY@oCWǎ]t[Fݎ~V ,(SK$/4bSAMɶ Pw@b2)O)-5k hRg }C㆗I$)+Ұ7c0 _Xl)pDYa)[U$CB毵IdC]_WN8 V~[.ӑ);HWcHFO>d,-Q,Q\96>)̭H<[z#0K;~Z_iv1Pu7~$蓕xk-U='`5}1c4bWL$?N@Ky%rWmF>5 f"C768qȹNJ ۀc+}y=Rm޼OIQs}bx4Kٮ&1Ju C"%]d ^D ^y%<佲"S.ɛQ<E07"F"w59OnDd_H2(&Fߕ8R&riU"z= RCWvψu'L5lN@Mh{:Ih(*etAZ :%i5F^P-Y~(M4N[Œ"ThC&@a.QP2ROQʢz|^ZV_?u"OOO+צz^bɓ' xxxDpss2yIENDB`teeworlds-0.6.2+dfsg/data/countryflags/NZ.png0000644000175000017500000000416612140200333020127 0ustar felixfelixPNG  IHDR@=IDATx] PTU̩qRSsdQ Θ@M|$'NUfo!c}#u摯|y ?lܘGibzq7*vHeStuG$RjV ="ɗ.ΊgƅR\q37Εj,wʞ ZU|P9{xG먡G]J]D;ZJ#>dewڝTHА&oD_&J5]_Dŝ=|&e_}.P C~SS˞kbE5/khT:JÃ{a׾Tp95 (R*`5E6ȑ fl=?0hQc,`s8L_XWLJX-X="y!%@DmTFD ϿY:S;p ?T!v\#z {׀==s/@ 3isk0O,ȢLv7P4#1fKv G2"{]H)va Dkiʓ;=ӢԦG H2f~5~ ~G/C>CgWP!m"v=w7M*Ӏu :zM)A N$3 % hؤ?h%lc|hɒy5˸bPL]Oy)hj2s4ݳ'^C/"<|gUgQ'p_LHn: :)m[WDZmO\ ?+Fp'p4[, 4/p'å:Z{Y+2^P?]J#N1&|y.)༂.c0GTL:1؟ʒ40{ۺFɟKZ 'n4y20N0 geN)3rhOY9n11&l*pqse_gHW ĺ m]/\rWi$ @"-klUSBzD RQp" b V1Og"m˹,}q6yrrћe@ @k Q4'$ @µ<Ľ޹7or88N.>;;30\h5QZ2rxȊV. >FСp4 By kw"[oDUyT4v zQ~7p<|{?wЎzю51 {BfQ~GwήP}{dRJtF@>/FMXkq8K8Px }}'\b?(LHp&C`S 8NtO.@M9l yď=4j(NB?R%̗)IENDB`teeworlds-0.6.2+dfsg/data/countryflags/OM.png0000644000175000017500000000273012140200333020106 0ustar felixfelixPNG  IHDR@IDATxYOWR(MJI`/@C$mJU.R'u# ijM`̀R0A!89#=2/73c7P ?3FY-UO pE @@ r1FI2?qxjkk/###C\!CQ[W{[q.VԱ.-$2)R!~?X[X~$*=CPOp;ºL)d~!~i[ZPcҹ0-bp{ҹ h`N!dr)|K 4asעP{v/>/,Թ8)zGHn!_}STyP[`={귃333+· )ARPۚW!7h>(V1::ʇ\ (ֺ| %u$CEŋEv6*UoI+u]NBنi 75@=yWCjoBqV"ᭁ䫳;K \SD jL{ @= P 2zDi ! eVE{Spퟯ 8ກOFop(n 8f.8ɍ!G#\Vp n 81 ,.٦OFv Y5|W7n!-coXDvn*l'?wSXB4 kSAjIX^Wσ@ x<"x  YxIENDB`teeworlds-0.6.2+dfsg/data/countryflags/PA.png0000644000175000017500000000255112140200333020074 0ustar felixfelixPNG  IHDR@0IDATxMLg X.\ T5.pͤ=n:GI٪Z]`u 3tQKGw]tQJ'wu_ Z]]UCNߕ<B$@G!:]!'˽$߱ <|@ѹ!u~v6 5o> o], P6,&O|Y _ MEtdA |Y=Mld`]Ge.eN:g6f36{ڶC}йoϋ^C8,@}} }y^@wi o < ,'Ҟ%@F`.T9ͳRݠHFzC)i+~kG|`sd9#U< BSƧ|,@6 =r,dgl $^omʑ3x'| ʤmIENDB`teeworlds-0.6.2+dfsg/data/countryflags/PE.png0000644000175000017500000000143212140200333020075 0ustar felixfelixPNG  IHDR@IDATxnP`?a6}@ oܤmzI[%4$`.Ă B#"!jc#d7K)emZD!ITXAVk/@S.U6XALb۶.~&XA97'ɩ>N>:r/i>^m$yvަ@"''WNP7׺ @[|~OAl@!n<9tμ~``׽5f@9`{e |~^S*d nC{]nK>$-Һ~؁$ @-}oRMuVZ,j>tát:lZ-vCu]^`0?;x{hψrf.fPz(9f%tɽvX_B#۞9kg;F_1? LL6J3t7^Fo|c0= zzeUH80c}7K@Ag!  $ R[ ":$1P #z!JRQbq_"&Bm|>'?oC>IENDB`teeworlds-0.6.2+dfsg/data/countryflags/PF.png0000644000175000017500000000365712140200333020111 0ustar felixfelixPNG  IHDR@vIDATxyPW+ᮨ-*G*#B(<:ul:*^(G "0 :rȡ߾Ldo3&dݰ+LJ(C& www0 ~~~\nnnEr 0+gToH4eB2 SNgL8|&9I~LҺ3xFZ¶ #Ng~&O8-<ޯ<}Q}1ɩȍKhCΦ(dkTPjPt3fc3Kqd*ܨ֡LnLTK psޘ'l=!8Ԫnl v @c4ֳ@])p܃ j-6C"3A}mp.D$%kPp$RVc&Zr8H- ϸ7r~ۑq8 *JS_|PLEU9 sW $ o\#J;"y_˛[RRP['hzrq{b52Zs!Б T(@CZW ~%X"GG2.d)*>.&C{sW¦7]9[$Qo=,Pyn-*֛3 -E#AW]@-**b$0.s|+S=h:0 KFO*>@^5zͰ^HDWyL+%.' \6J.ho#@j  5Yg.AkrmM` {(yJFJ4;:P. pt Zِ ?Sr%G{p[~H}&J3Tnf]] :>@^=܎ <& }ͱv0 9f ů5a8o!% "}G*53:ߐպYNM Q@~@N5*Wx:1^e *$|yy9>|rRa%Mnjק{Gi2Sbj Zٳg*L%kqd&Nc8 xmCxl ]q^,HEz ,r?mΔi\ʜe"݆NlC'5"P K'L )9L8FZ:BiaYij|NawE/g(Qĭ0pk8 Vr[b 75c ރ6za$AşEa3ԋ/P\\,sHFwXC0Lb.`)uʔ%q YOlR&m+zy@8xp)  97j<|^ ԤбUGU ^ OڇfO%k<צyy8lcβ+1Wٜ_;S |> z=Os%eԨQ~6et-! ˋSxzzQGV%U3IENDB`teeworlds-0.6.2+dfsg/data/countryflags/PG.png0000644000175000017500000000441312140200333020101 0ustar felixfelixPNG  IHDR@IDATx lSm_۱q#+1NEM,ȤEQmRhK[Rc-{@ut]KBBFh@XBA4[ZE-Yq|k{#d>};:*Pi3gpZݨ ;w.f̘AE1@PUU///'Tђpp +$c<3g \P35a]0AJ؝]( K'ڬ=M j5jyL=ËR23O71y+OIJ p$' L5޵OYqz8?i1y(ʒE|q܎'omia v?*\L|]{Ƹ/:Afx˚T _+a:3l5zCr_0/=؄\a :&qV}}OB1Z05x*Ӗt.[oq*d\EGkQH|Ik.Kbp" 廙w79H`)h~cZ @Tj,7沄^Zb~rmǍ=Nt5_v91v,Nz_" #\b @hxgXўI$\Zōל+?>})ĵѕ+weo Nt({ +YpmUz T@+Az pU?>|'O}ó&g\⟛9~r+/.W^/|>L۷o}&f}t&4Ÿ06|.(Rq茟b ڵkilldIL t$VGe!Wy(vS-]_8ȟ5;E'?lrh$p.?B8u^1000$ƍ=+Z#^4'C+ 4bi>,ֻFd&_v͛7qܹsQW=DVU7A7H'ퟝ'/9]/0^G֭[a0vt|1FKK˽,'`gtM g]l :g_񹠠@9!e7 qQBOSܿ>> b9)74W*=E,A D&#")&~mdQ>XywI|kݾb(͍z߉-SxmCP|폵GZ۷o|LhŢT 8u_m~O :uj\;NV-t݂V z q~Q 8V`84˥`,i&iZ_۶mCss3++}htxh* 7zG \U 0*vttѣLWȑ#hjjB <---1  =cirh)SW&~︹rʐx(**ޅ.Jlo {$;Z HƁJ-P<ϙի%U(ZoE, 47}tF: H1=j*0 v>XBBP._aTHn5h`ƅ!k?YԌ1O'7S)|/[|;Yv!ZnÂ7/cԯy8?+~X( 49]ۇʇ oSghڏxbt!|U+] )!)H_&w'3K{Sbƽ7QSb BX}P6 r ePVΗ?Q8 f{m6,Ysv{ί3UL'3s r  ,G_$J[F!~ht}yeοoXsup; tt!?0~c도4^.핍:O83 NRarmk:|HA`coАNj:5-tM`[[_q/fy蔱A (XGiČDIĐ逢$EɊ2rmTE)J:͓c0jO9Be!.%[@@x ٌCi8!5 R b^  B$NH1n Ʉd| p7͠k?uDf tnQP=NeXBbvplҜm֡)VC2Mq7~*f;9b)$yҕ!~R6'> n WTTMLF.nɡPj~yyžs7 $I&ʵH՟{ACPqC^jpmmm}Sڤ{lV+N,_x_:5u8BVt @kQ7Fl֬1 W >$Ea ~PojU@hvxL\KRS~7ȇ($ BZuw߫uȼu;Ms0_/}=*ZqsJ5zzâ[ⓐ=r|}pN+Lqa~pr~n)uϤGȴ7H *;Ƙ{(izoi_11jw@0mjhp񡡡z ""?BHHaFGB])VIENDB`teeworlds-0.6.2+dfsg/data/countryflags/PK.png0000644000175000017500000000314612140200333020107 0ustar felixfelixPNG  IHDR@-IDATxiLg+x5ho~Р]x$\]X j(hҴRƚF MZmM% K )R-ЄCB )]X GYegwمgߗe1@J``%aN,BY H~:>>>'AWT'H/N.#w98px$&O( $2@3> DN> DH`/NO(p@~@ILv9~G OƤQòer2܂̟2O0fn)àarKs>!l"g'Խ㿣"p:d͌~پO's$ҙ3lm`^0D} zAߛ>P}2z}ͅ5tqOrڵmLֿoaGؙk{\## k|ߕFKdRI]"$ nʄII<7v4l'&z6kBCca;] fV6P}>~#4cDe$%L>N]]/^AJ+KaIH@ˉnorۤȕ$ Zv|zĬHVQ=tW.a.$5GT#N!NpQZI>\#s#:P}b& .޺S Q 7~[4z]#\Aʫ篟gv[xϮ+1.lZ UUQ/$/p;:Z 'e~  fs9ws/"k셧|jmJAK___ ~  gƪ4IENDB`teeworlds-0.6.2+dfsg/data/countryflags/PL.png0000644000175000017500000000136112140200333020105 0ustar felixfelixPNG  IHDR@IDATxnQyKE^4ʞEmL5j \ .$`(v03ZwӦs1 iH)&"ސJSvuiFS(!X*?!.~b)Zf)~_J% + @M\O3OS(jFѭ)X@x<| ͝?t:Y>Iբf\.St:;˧GF?0<L&˧gשɮ3 '~(q,KUV)j^S.?tG ~śs Y,wcd39L9z^>z|(@/W*)KwGO^:pȵktU'=~Ѕu!z ^HIB¦Dm>k Ewr.MK]x(n~Z.k G){1yf0hr,W"7|\^hb a}Cx䁋7+U>X7}p,Os}Pdw5SO@ԛ=7$H(F @d2*LnkS.@O$,,Y|@߆7IENDB`teeworlds-0.6.2+dfsg/data/countryflags/PM.png0000644000175000017500000001725112140200333020113 0ustar felixfelixPNG  IHDR@pIDATx]Tg.UDĊEDzRD"b MEEAAb bEE4%kVMLvw=Iv&7#qysg)w}U^ۯcXW=/ӓ몽&+bXW'@P Xe'ua-Z/?y blݺGRb^"ZzUG<h ]SeɁ?m es`$Lxn11SG%.= ?Ͱe uB1Ip0aD' 9Ei s>/~=D>D9l\ 5:L͛⣟NOヌlYW,!p!9f !e>gwZ JsԱq"&{)CPV9_Gl(k"YZۻGC^\xRm"UQ;ʔx3fV2GrLbhV!ΠϪpvҀyoG&0e,P9ZHL5D|)}Þ!k/wN&`D ֺ76d?o3|Ppi4*-04PEشA0OH'Yaؒ}2&@wS>ذHeYJH5Ip>F&1`kp 4M7F/LrI}ybːP>{z0!z֜xC/!L5nY_HaM!Wc|Pbz`vn㓇=GS /\x6!uBȔ-c,[)6rQ3[a XC? Fi+b u|'22XKKa3`в͘1UXGfrCz&2:)' ж x,B=` ? XRi{+#ؓdF,.a `'H5Bk8Qe- uv2Fl&[TK8˕x2O >mǥaa pgDj$]A¼ n 9(c,,90b8Y`TX2OPC, ^ ,(D(\m%<06fb`}N2TeeHV :gG~!@ +rҦv3{#za(=3D9lx3\p {ǙPj 5Vz D~F#[I po 70\I+P& 2zo bUIsa\)ڎ|%f<;=ImT )?Aev6\=mݔ=$R\U<;%x#G͋.I~ 14)Jc'|r Rvb4q+}u 2_MEm(n#}z&ھ0x<3I`c.C?P.ˈ&Yw}MՔ5 -cV-$߿%6gNn2$`L"U!;ܹzJ0ϑ6/$[؅ 9K_0I=↕]!J.{ `>?YKzsֻ-ufccvh|<5 |[K(6Pk! Ce FH:F g1{a$@x)OGIYnvIq-낦ո[VjOؓU8"oܪKW,~JB-o;H}>#@6J[pJHTyMKUз}͵iGTaJ4u{nзo_|h|gPVVƛo)/iiiw}'7a[H3CPcB';ɡФl[^.m^p~g\X.|h7`gbJ1/F \899r >|زeK^s.9eSv(QI7Q]]+(qm<:GxnTN}>9gĉU!ȲS_z?姟~?|n{lYUWL#6eLg'ĄSF>3Lg`IJ]ۃc 6scc5;~p6Yi7\ba +UjVe&@Ν;hjjjRVV_rjUGOɈ&$l4#XZ`6Gk6RhtyuܼyC//,,p_Wlܸ[ 0,= [5`g!;LAfÀE0H!`=,aLo&qx8lg,s6B_lEQ S?;8N.ߣ)xx{555okw?W//.@B1MjEb&[C "1ѣc =8;Ck:Dt*J.Zj O2|qE;LRg 䤉YضTC8XȰo5Æ,p!i^-|Jŗ_~)}nUx5 <,|0bѪϖIӠS}waLYzq̝]g ;Ks5Yv0XL Fsbȁ`dDJ+f+N)'3 O~ü(EXu=| 杻_ ޶×?A \5x5*:8DFB2<E%ݩ"82nr}f#Clp5L57s~+\fF_.% rgIZ[30S^H Sw ` BxQIjPx~G^׼ a{իW>b|vRI2`i 5#:AWHtV4_ /?^` SG#j:F)%0㽆b\ ڈ s\.@mfX}SOGCmH/ ctU!s篏qDLWt۹s?F^բmK/3g&Ξ=+W:::Мa`9Gq~\-($ cشXzz[vQ!&jac![zoi;cE(' ىʘ2Tc5 H{ B;'z-+ 3gt>Œ'坂~J ,4=LHQrzB 4zдG,K˺ KϏNؘ-n{7W9b)rzX㎯+x(VXsKz nض`l ٳ?n\k˖!ba~zzxhѳvm`ޱd P_yYǴ&"lbӘWo~nIv,m =0`i[h'.%4 \88ԂX|+q)/%M @S|iDSGU|\ykS 9± 2>;:DΝ H\x>(^:ywXİ>S4?oKk4~8ap5 LH@)ny'Hcw]B>3LxS=tO]Ĥ43<(4g _#8y~1ޭP=R^MOv +( f+wQtm=-zSTPXR#cilMUu迺ZدNo%9}VA!@99nۂв0(3U%/vk26]Ō|yOFə&Ư5bQY6ߒ#tEDJn_V >"{AL gzU gS3Y( VCP%|A۾!h$ߑ2\yQe)K#D {kN)Ol8tBXzVU#x?}^I+:^=)V 3ppW #R@lX54d89s_=*P言.eS a8z^Ӷj*jqt(Cs SR+gnis๭uydV76ȋ 缥6 raGrί'@sߕfWdc~[{~\͗c! hc1 ёd)JM:nXKyXUϴ1qo|}$ h -(sM59LP~'˓WWP&]3}ĄЅ䟲 EIPn?$G8*JU'j\ \ȃ;rYİ} 0""Lm o5j6C`J&&fD.NNk=)x2JJ2< >K%"0#*(G]JMJ@b7`:_>P$)kkgHU$J.N!~3!{u;n0|RDe .OvRy\*)ٻʾ8JHPpJV}>4ۍqIs.$鸃WGg<}#puq[q;B~ѶKtB|"sn~EfJuRe渻IL^ç5aUZ^G@TALB@kY=/^q8X2O}ĚZp.\ꗜjwОMg<@o^$RF!`|PƋwmX{u p_(d!RIx~nm%QS$R0s"u8I70 ;&l9=t.ݑ{@ṷ1@Wlh <࿒N*6TFHlU=-).7 ֪hȧ\ }h{5orZ~=* Yx<%wVw-f#M @|9o ҳo JqnSwȘ.NQ F.m!'  A2&x\/<|<<`o N>rM(xN篸|W+N~ xEeKwpC7o ynI-7 7AnML"4x{gJ&k?&\Ʒ`t+*njfpy{8On|O\Z:ݹ{w -™ӗpz5~ "86mSZ/uݒcd߄./a?ә#^/np;x{Agr\ٺ]ȹY.0ol?a7n wzsW|ړgq2Le։<<~R 7ncэr}{ڍ?8QwV{YUjѭSJxZMAh`>0܄9{;O_, SPEuE-}&qD=fwoK8MnMJZ@ F%FkQ5A}` x^N]KGr?(ğ뷨O&~{ ;G*Z=l&!of\/>s'bO>QjSaZp\m;q-\9[Jp~b_q+^>Fk%zN2 |_dj_ q5nܸW~$]Ī{QwgTv*{4n;vͺ[N7]_uhmBl3}? SuJ`e?Qk4-?6㨀~'73 b!]U%3'4$:ŬLjDL".z< xc\D\j_A^f]$9p PWHc=aAHsv-yAYspanG0p׮ QGgcL7 B^̞Lp &d7C%8"{Ækd]V/R;'("jZ%;G,Sɺ|q-\xq9]{$S3࣡ uzu wmgI{Z^r @8X>~U;cpP,eaDnK$^vYHLiXn- - [7X]C |1ܻsGʹ6o!bݩCw;wS}Hߝ&i?|;;>ֵpz~D+`E`x':@`xabOĒ\$bX30.#i־]LddġO p| @+i34ܹnu!3"Ei(ݐY2 TN[ݻ58sZV3ꇻ9KҶs\bE" 8{HJ9qVf!9v( 2\xI"50Q]{#xg1@ pi?ҷqjXszC& Û[{qFMBv֝t<6 ׏c#!` &QLTxa-6 _Xyx,c"8TOGʂLU-(Ƙ.OnHL'L %EvXoy`@,_PouyC{Rٍo}OvߝDq7w >;B)zR^*04}4'"P#${6[Zq %hRs z]GW>~C&Uog/#bcҽt37A{?e}`ߗT}[fסy$ D(l^*红f)Dt\E"(030q bT]zZebaU feq QcXCݐ9jjϞnj?׺ſUQ_[֝tCFX>/ 9 0lPue;ߵ@/&z ]:|(|>5a$.ɋE_QX<|e s}x!ɔ5~SX8~T (ׯ?P>֝t".l}rlk>hWp)k:(IG\T$c`eL%Q\fNC:]{g$޹KR*ZJ27o6ТVꃦI-=}F [jN=E))!*qx +/ )t&L|$`I7_*JR2 s5}73?^PS?^Y6[=m$&xV?c>&GoJGcԱ?y,N8"`(K dWĂ3у3Bx#I2cZ~TAXY Wbqz^3I [WmT*7U$1q~LW Zk. | j+k eh>zF߉> L˝th!p !ω|CTS>j7rw@/{k]Q< _2GUuxsWaH F) TUadlԠrB TD%JqUڠmZa۠DCQ2\ eS}vesgMa,SI$DWck&0MWh ?~PR `*Rm`xE5(ꃥ5/zY5fH0ZIiHXnHKHE(Բxn2;E SOǘn ?r?~;v@LapCQfxKL#% G|j|K0!ľjzl0$7cB,=//0¨*cgQ^"W~ݝNJhb(r8SY&[jb|.v5C XyiSyZ$OzDT]Rlsw O'8 QTFvFcfcZlc)ăC3z:1uZg6#fF00<ƪyfXB}E򷤲 iqFj>RRm}ÄvaU%z)CwK5EB !%!9&pM3'Y+* -4ܽUp4rf>R E{3L8d(i2lXkųs͕*6Teɋ=V.zrcH7[fCv0LJ[7d;oe&Ȩ7%4 AQP{NL`82v)0wi?=<+R޼ $oXfyG7{~\s:đs{X%זF?LrTVث[f*]u((.~d%*DJoI̝>i 7; 1#^4,g^|^:pI,fT7z6(B8 + D T vnSƶUrRR3ƭe<(ʍ1fO0ˆL #R^L#?-]L@RjۋOe`ݛ jJnl,6 1h>z{ށHs!]-1/L54Mmxm!1AL !)jJܱEe5~ ?tZ7G^NOZTiҧt⾾KЍO)WdOpGw*.HC.N@Ю=m@K.C*6MuXi񡡡:2=BHHx-,xA%-D_NZ!xaBmp,xW*xLOU~+Q)[i#YoӋP$xB}cj5{L+x@\qBdž uz B" # Pt -^hllf l~qG8zVfN/ ˰#l=@gsx"~Fl;G]p5>+`ƻ8r^ eGw .Ab~ ^Tjy`LM  k]q[3m3U#fo0 Y7npȼ)K \S"'&mKfoG}k/6~oMckvok0+u2E ERډq|* DU]t9d ',o@m)/Q|  @ι#_s mu06l `f1>5ms} hdbc /OkRbenj?/ >>yo@ ('ApyŸ(Yg0xbiݚ`CiJYLB?< {(#zY p 'o?:|EMlص}AgY alWU"@d&@}^>@w"3%} ", }gt9J*#\53% |uލ {~n7H$-À}x4j™?+cp3T .kftkO^s[LH7f-‡KMQR|G. "MK8q~^G렃1 VQ['ern+@n]5[MxJ %߿~_36e,|#v@et sVk@2ʯ~$N*iZ  '->X71CZ0&M)儑XP%yPd84^Jj = *5$/h)E$+@+EPH"IF41 !W$%@+cȥ&PHBF{q#g}/( őM,7嬗^VjS"HF t:],@V+KT}ެբIENDB`teeworlds-0.6.2+dfsg/data/countryflags/PT.png0000644000175000017500000000513512140200333020120 0ustar felixfelixPNG  IHDR@ $IDATx Te6#GjeeXz"娍Kg%p4\ QQ n; i,#:b9ֶ^.6 JY ;(x}AJ݂ &=M;=G % rs~ m0=D09mC?׷3?P̷5߸MS(O7`j`jf Zq&ʪ`z`m5wO`7bcp'T7;a[2|(_dE:_!3a 1%D5{ 3s|s^U<_r2hS{>e/ew0"n`-X #(O`.|[ 2F7 t̔b7`O+}8c},煸-z|`4W?oywAM#I"MB%tjX2[վ ˽DǤuL-&huBpo- _+-]ࠏG$5lժUx^F??$N&4}T5p>ͷ;8 X 8{:̤%ga{Qkx̷;zN;&p-ȾEc.Wӈ=8~ZdY.8rQƹת)Qs۹ װ eլ3>}W( kksv6с~H` Ǵ4Zk_̽ 3}&0[h$LY$OgLfj>ZvRhRۅ'Kܞ|4 Aj_dGh|kۤ3CowT!' & ~O3VLqo61(O,DZWѸ{yDj?-G+(?x"EL*]&5Ldq5^k/K g_HD3DPmϮXAU\=䜼&H<͕~ {D{$]Wwb䀵YHܔ޽pIF^m0^ff%*̷+4-X٦d bY8yO5qkΚƛ]L<ߦ1"0-{VZ0 $.le70j&+hPw\3W] 'f*8UXt-Mw~zժōwYOJe-f綮Hp뇖ǼeaYL&߾}GD#0rqi8q)!!8chWXŮ"U B __ן˟+0u@{m]\PC7H;ustġ uDvr2=a.Z},srrND=W3_\!.%cgouc(EZ3A0p`Vҿ˪13;OAk I81, F}S۳9` HMӈn}Es4) \;a@n#,pnjz7}Lss=#1 - ]^}{#-fHN!k:Y`@Uao3X4 t ~x>q[0̻4 0o$#;%.gͨRÿ]0E}?aQQM|9%~Hwp(qY/i"6~!! /Y\@qb'}Ö1lb$mɂQӫb'D 0`+ڵC‹/b oIn"9VpG0m, ,jia}c0_ta7l kuU{Sᔺ;R ԧK Aj` ˸F7UP6?M ,Rʽ1f '.`mwz>-_ (I6Pl^9fp?_G?" ۀ 47/<>`Q786VOkC ӆy? LT|uY/ X%׮RwW<1+G4+X+* +|@e+~@e¾2зW"ZWNw Ggxī^`Kh)lMpss3צJ+@3U8`0GpqqQWRJvdvIENDB`teeworlds-0.6.2+dfsg/data/countryflags/PW.png0000644000175000017500000000253712140200333020126 0ustar felixfelixPNG  IHDR@&IDATx[lSe&ⓒ`Ԩ>fO>zY/k4H"dB(ᢉ bllckw+cl̕:XGukw6x@)%;|Ȓ}~|="LIII.ՊRI:Rb0  @#l6Q^G(@wPk[Fc\>*| 'Lx6 :W+| C̞)~X}NO3ai Odi87 iSp*Ջݓ1֎PRpr\ekϋw X[#ޙZ>o,' -ۢ#Ly'L92P)scxlcOdY \> ne2~9qϥ=Ch8|gem!B`}Րҹ 3/O ˄׃q GBqc,q~!~֔vGz8(%UN$m!e`I!ުSU4ptK#+Z) c.͠ ۸k\<vKYM#x/GU#G[˘K:|QBW1Cs׺o cwj1\8i*RUȽlHwZF聦NbkpV梹@AϣPg‡'1u/qlG{R`H=g솃0X^G|Op7-"WxGo7#w0JHsBi| a{W4Cv)۪ގ aI^TE++ {- RןGh$1E^ xrB+Dz `XkSBYVG(l6x-`rL&/û[IENDB`teeworlds-0.6.2+dfsg/data/countryflags/PY.png0000644000175000017500000000306012140200333020120 0ustar felixfelixPNG  IHDR@IDATx{LW?sح\&ʆTD.(Vn-N7'8a^Q"4*c\؜F ٦"EEp1ⅶ!%jo>Fr7yrr~sפILL4!>>C`,e/I'!!'O $r>hX]"dO'X,qt{|I9a> (Un~|$2xĿ ߰#O0FS`~!vQ'jp`^V? zY$['O89=IFϡhUAIuV[̯Vt: Pw;|rDEE!""iii(..˗m2۷o> Ї? lAuf6Vי+YDYY3ӣGBX1dTOƙWP?d2]̝;{> `Fz#ЪC[n!LIÙh>hZRo ֮7n> `bݻwAAAQ.N nx|F{Y m/Acb a8pu]zڥh0a4Q@7e/*–(ۻB!w,hƸp(.BAAUIdV$V~:M .i:nBEB{lB'~ ikB4VB}Ydttt< `FqڗmPhS3Gxaz:jGg V.CIe#@_D"8>|/9|z,@6ӽќ Bq\#?a]菦Pa!lIq P@h1g (Z jiqvx8;:;;qʕ>zdx.6rEPVwhɛ@.[nrKXG.˾y&.w`TFHGUw )!./GcqP$AU*b^z׮]~toUNPs{wgrxyy TxF3qtR([sP1t44/YJQ*?QlSf2< Јp 4 +3fPXX!44gw衸>okSgn(*%5t€ iy¿`~FCB0KO|6nW_|>PgX @}eFO|H7|R `W6PGy?H|"z>-/s>pg?pU?B 搼A@Cn)=I]~@PC?RYkbNd' u̡]?@P8McKnN'~$G"~E}PZ#=ߠDX9H%C Axd#4 g,u]ζ. <]6ضK/Wq spEBSX_͑X?G; 7ҍa*$bCӻP Yo1 055}}}ٹbwp+, PSdPH/ 033\V l!>www7}uhn׾7{$G /V$Ą$Ր~9@u(WFFFokiB=A* 099)yoi.m}8s $ LOOKZinl{y`[Ǐ`nnn6ttt@u*b+!7,9@n< PW )^QGK!c9 @ѣt'4.zv\1M,(v᷷Órbfa^SZ?66z ALLWRGGGx=`XF PU<7IENDB`teeworlds-0.6.2+dfsg/data/countryflags/RE.png0000644000175000017500000000343012140200333020077 0ustar felixfelixPNG  IHDR@IDATxyLWE+Fը4QkqoTDEAHږjZ[MMSI-#G=<(iAk= )*ZrVvݙK ˄{ (6cƌaJ(\9?bAPBQ 1bDϲ 11!'}2gd2c l ~]l}p<̴Y.Kn@W@Mt6\!Wj.K}`څ߰KrF>,;F>n|'x8'莰 ).[L+'6sx9'ϦRpKj\!;VBg lO|"H9"(2%MޫMilw~h>RL>X&|]WN~)_\QTS>q,$?VֿK!z`)MWV>b v.?VM|.OT.,xkN?ZL?Qt&)D0nXOSlNa;GzOLS?*)_];N+o̦׆pN٢D]Ĵm.hO)J0gpGS&;U-`WzQ8ѯЃvV~@=pw0.oo.`DlO0ݡHXsCh^$l1`̇! J 5pm[|:h~E}wf6uoU{cSur^xR|a4)(+n(l X3Ѧo4~a!hdիOuf hfݩ.V5nDH# ƶ.QJD^P3(Ⲍ^LܣJiuoavG>X?!'}b@w-'Q2G`K{v|>/(`ow/- bO2% -;F .*(lKzgFRJ_R@p*uwL}@Ǹ"55FH|RR*V`ԨQx? trlIENDB`teeworlds-0.6.2+dfsg/data/countryflags/RO.png0000644000175000017500000000144512140200333020115 0ustar felixfelixPNG  IHDR@IDATxrQ~Hٰw !@15PNKDb4K8DMԲ\,vk"Mӗo @""?F$'jU }_VQPбq|>cXo%^݅řgGX,/XM-$$OѝqJSB'@ a X~`{ =;ـ!ZIv~` h~``y?wA^7~``E` cxFLv @W|9}90ѳ~C>NNx0]c5t˺0a_v~tScCZ6]nu>贼6lig-TmAN7.{SORnod_x~f@Tn[3n@ .n?w| |`H@f^Z>p|=T^3g@,>pr } whVV}`@dU>;~>H0qO@dNx S+ `SSשRkSd]|\F8c*J(>, 1IENDB`teeworlds-0.6.2+dfsg/data/countryflags/RS.png0000644000175000017500000000575612140200333020132 0ustar felixfelixPNG  IHDR@ IDATxSTr[u°ȾI0HEp!.(1.ADP& 0̰ * q$=0a.8zNwY3}s`xvpBY~EEŅjD0Cwvv5QM:J+{N,<̟?|]`h9tI3E_@QZ39PvKP|P1 ln$~h2-A {49T~ Tȓa-;5ḒpUCPM|Zqvrc[q2v#,… j3(H߅ #|a` Dy92ȒO.lS7ٯ@)CTF1G4"_jsէ < dHlӺUkfN0(6権cN4zi\߾ =玱&/HJb:U'_gNp=ɫQne99k ۄk8_䏚^cg/ S-^Ȏۊg*ktݯP=FwްDҭ, D5-tg#a1䁁l\ # y-QҎOp>5M'_g8h~sЕ~1Wۡ:0n6A>]nLCٲ ͦHߡčpq?/ѺIhϳ_g:n1FDWVB!T^.\P!v 2w ~<T<,C\6dRxIxPT,5fcXlus'~-f*#֭F7skP1< XlA~>"} Ml~ ~`' N(0mK{LHS;m{j[Vm"x#:BHohOdD|5mFR2[e~QCod|޷menBI64Vb.t]. p ƥ&cH5K66h:S'lN ?y|K4/A\\:.&_/m!F?X'7г  --jjCx5*V7꾎C1z]z T@o^sh{9; ^IԦccFFf?F[M͔@~sDE3ܹGMjsrթ&t޽{?Q[sW(!JC;WVr@A/_ݻwىׯ3+ў CGG;>leb^^.;/gO>io)|b,D8ܘnh o 硽Ũ!4Ƶk ;>yQю=#"%:---,0hMIERYIws(R#!<FFh\$@&Y rANˇF$~t= D_Zf`uňs``4o$ܶC#YWRR43VZ$D"Ass7B3s\b%d2 (C*`1DZa9F͗GTSl(aH@IyG#\U~Z g l$M$A[. I:}sLܜ "my(ޮd~KAKȃ H_F>H2ϝcJ0F_#/,b"Djp֯DNn6;/!d,=}rAN@m0Nc{p}BQ\j(7bƖL.c;|W(]oHcspcP&rў={Wj|鲯W 3CdoGIlcg3(h}v "m(r(QLyC=u9htݿq+_lV.2`N|hE@G"YYNLo/byH!e_j<q}럾x Eή>z>*w\*-읁.nP!hƘ?&thO#ASc#*E"v--%YcL9) iȪi4q}u, PHDS^Ȣu?{FE}O 4ID=:#MܺuK7u:iF0Vi0I}otմnpk@KqO}fܬQZOzjX`ڔjj@wss㌟ ?M?Fm;IENDB`teeworlds-0.6.2+dfsg/data/countryflags/RU.png0000644000175000017500000000131712140200333020121 0ustar felixfelixPNG  IHDR@IDATxn@gsU+TCn Ii&$."-Il7;H .|뵗 Zt:oh4"TUu}Ex.;ҺHv)Hb8,HjҾCK@j8/zޗ&" 5Y=*rRl)?<Ϗ$I 5EQ  Ԥid繽8vb;JLeJ 4%2qS|ws ʇNv2Cd6ʇsոx`5C>|` !կ!UP?ҫBC\^K/,i1/JeE IY*$-ߋw~CZf6*y! ,>ճz? [fS+ST}Оz lhc/#a`#@`!/о24W9 ga0\pR\a+`m9. &7}I`BG= 0 X%VPhVX &m څT`0@.y^tG @c.mIENDB`teeworlds-0.6.2+dfsg/data/countryflags/RW.png0000644000175000017500000000302512140200333020121 0ustar felixfelixPNG  IHDR@IDATxkPTeYi*K:6/TPQ:ӽ,/S&!{aeq4HT fvjj&]`Dss>``k hl݃EU()1?sL4džs% 6l1ͣ;B)-0yÄϸ^<do^ P84囒MƳ@Liצe7R#(6j? pwC;ZmS(."| FꝄ"PI2JD DHjgn\'Bݘ7 +oO <lR^5|@k/@ <後בF99kq="(hYk?ι3v1ޞ%H-*?-^HMxC.ޑ,~G+ZnI,֠NlEbOSDRe zdѾveazG[Z-Ir>@#tix'> ZyӇ g+,+J{%$x;@uX/$YCv@eNw|,@;! K?- \·Dq %ϔ%tS? @9tn,UpD/t4X.;Z@X,a\ X,E}?KF\"/Н,+] p0[9fO/b+]A/RQ _!$ˆ!~P+@;>3!8n,s4-@dJGW hR~EpW hOu_9^&4%@!_Pױ}fqkNTsӥ|] w bbb0uK)ӹ(C >22ׂFZ@DDRkϚٌIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SA.png0000644000175000017500000000505512140200333020101 0ustar felixfelixPNG  IHDR@ IDATxtuƳZVwu[.&DVC ! !N ! %Xj轆!B .!!#A@@;/dCɚdsw2o?3o{MD # O___,ȍFe~~~ܜ@ ܜE mUF*RvmFC{AlJFW2-ܕ|#;e|lVFvCmѪm AG]к7 F%o:y}_j#^{WWf?h;{<[Rm@SH*}M!?:K{.{UWΔecgD{x% gK'iFlK9(X_7Kù޻t^0LQE#ukCZJMB{?},N.-ֳ(hns}wL'v<%sh+I۷Sj3{Glؿ[lY*,.I'VNھR"yѧ]MuL.!+273ޕ6˖vJ-m+'>v92c[,߻Q gFry%a=:[VdB.2NWNC.;s u'O9z>+\,KaLۺ\R,w/\o$ݕkWeؚٚ8/y_m-5%^1QrOVao:.W(%R#A׿[=3G5>w3iv #ܼyS_?uy.=Y1I3B4!pAl0}TX:&c_.}X \j8\ 4?oj~]7~C_{)-fD˵I ݴ֧ߧĝ8X":yᬤn'ii`a,:7V3>uC8>oׯ@q󆊬DYLo`ٴJNȌ!\D@C,cCci-A Ne܈bҷ0y1 ?=CC{59wJ'Gt;i=C s=o7(ĹS1s,uGkl:zjdRq(ZΌ4>u2`b7=x R6c Iơ6ExE k{,І|uU[2iN%VHu j C9bE(> 4!ۢo'( Q>N'uɔb"Uz/eC\GkmNT#pbr,N3Yj'b!LqXHw!Em;)1lv8SKIy#:# PЀ:Gm@iޜ R?$`1rs;cRXg?:d <\ɣD+‰hLʬ D8c)1d&Gp0cPDҌch%'lZB M3@xj !bJ靶!Dz0}$gmQqUkRo'2qbm) krwX8 -_#'0,>~u5htL@QHHzjihI H# x|$-P t q)ӵPZ0Hl""Dq{rXd+IBT3@;InlD'FF3^z%|>nQzA_ D$ 3}5qȷHLbވsw7Li?$T (i_Nϗ׶sGY\zEoE>egOayh-^,^Riʧ_{rJؕ|dZN('RyGw # g #j1xP: 9լ-$6U3(z d %8o'QoPc]ZQ .MmPkq=B[l[a@*7B`[B}^ď(*" 8^`, 7Kty=@q[ĐoO-C:W |v^xZhH y$<ܬ<TU@`e}M=,2Ʈk0yON|o<'+6}99#Yْ%Y'kg{eWFnۖSVmIiIu/Lwz[|[JhX :(ޏGA{ ņ^lbD9\B 11Urss@~aj?O !zHlx/1se̲YleJCsGܥowT\ b '6T<<61}6!p105ߦ0_갱um((a7@ݺuǧmjP(:u+]x{{˩VL#ЄIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SB.png0000644000175000017500000000453712140200333020106 0ustar felixfelixPNG  IHDR@ &IDATxiPw[IJ9D%fPk*HP[9`vQP^H.J<(ܠHT+JvE!PgGnfƦACoR@OOOm7H45}&MH4E @pww';;;H4 )aKq>a...*btuUH|~ r /dE"zwNRʿ]_ජ xiG8&63\D)JQn+ӧȨʅz?;xEylV9vmnh r \9f(PtPo4% |p{-e)2QF;C%P_3ig1o>fY_W^~'o Dp+DCgʿ+ofە0}(JDPl7V,ur F`-?R@,*Ovy~{-d_.X7:OK16W@ݾa/ xuJ\<1^/W뿩)S8oMV`Ugh5Z$K ^|wk @@|(|i\nw|-JsGj$^_H/o&½v ~v6[c!Z״0(~n 94VX1V}>9rJ"@H&A aˡ>V<7͚sbtK{ AğQ1K!踾K&e*o';M_tKƪOO1!6K:v_G⚉O HncP%g9ªRN|7`c8FRʹ 1ni<_k "HK(t8"-$D9,^ _6tP0**'C q"beh1Bιz ro%`17Z^?J-?k!Ɔ ծ_F˻Ug5![_F^ M^]WK_Z~gAb *aYLwiMC UYRf_`Ŕ-Xæ4tMDBAǔcY7:M+ʒxb5i7Z^S> ªS  A.r ~@R=ezm2FI3h7Z|[f3o$ƍīb`8.O E6Z6J1wt~O6'k}} S?Nxxx`ĉkSޥo?aQ puu4kwr7IENDB`teeworlds-0.6.2+dfsg/data/countryflags/SC.png0000644000175000017500000000421012140200333020073 0ustar felixfelixPNG  IHDR@OIDATx{PTeƱf?4yIQ41&wAFV DKM.xBG-P3MTXX@me":b$N=oem=,{vYf~3 yp<A;t 8 ko`ۛ/p |///=squTȆ8RiӦPq"򯭚BE>tu@`jʗ/'S_5l 0cĂw-'_qɿPȷ,'!'3<♁z;7#.TW0D%|i$.ϛ@U>Tmy(g~u4gҺT7}SB`8rh;w@f3~gСXcZJ *w1SO\:'`P&)Q*iҞ:TlyMHnKz)EKY/=ޟ%7j*B>mhojR6ǔ".xj)ig3};P""PZV$S.4t#$$@&RιY$3/<.sOSIw}3jϘ\kз^$|OKL*xj4=(>u7ndz<͉*xj4 9]\ NOڢeF䕟º╏M.Vd+iVv>bid;bLl<7"m: l%M}cbPP`V [<ܓl[I}Ak*- *nG!%s"lOkكfq%Z7Rx:,xj+i>ȵh8uh .Kl疅‹@^@੭~W4aRS l@X &b e J;}K%gz=ӢD$rpS[IIdʤx>ћ{@Ud+i*LAyFǚW4)piy=99US6k~ǕK^^sY'bOO&Q)xJr''\MJŸN\kk+U~ɄOf ^HVR$%&77tde\i!rJ [Gb'Pm XD҉pV{~v'`kS;:@s!AAAv6Ds=׵tIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SD.png0000644000175000017500000000176712140200333020112 0ustar felixfelixPNG  IHDR@IDATxMHTQ/D%HLlLݶQg"6Q$J6VMZTVuӍi"R7_3~2 zz06sAwf1D4ȡ+똿dOMM #"^XEp\zrxN2bRŷRo.ȩ-#%JU:2OdwS<(+Xv 2/@]o-%WB-'WBtJoI]] -/W1:vp%Rp%lN_YbӳWR+a+/@~9)"W =WBR Nd@24*&'P1ѕp-/mRtC[ -n 4wJ y\yuC2K >Y%| @ (T gP(>X 044YWg,\  '%|" u= Ed1%=t#uYdGn-6dttTCBĄ_o5,nq=.<ρ! Lc>Q_OZKHWMڎ68SPXtpK~=x1'= `k6Ybc-x^ï[_>b6%KGAf @;"kE74#OSZOSA;x j #?{E#< #< #< #< #/!#}?,?I4C@/'ߏ8N %K\(T&UF2JW?@-dX>h0z_7j~r| fcc- kS>h~h-ڬ@c @?`q"4$Ogw&Lxm7߾*`SB>c PAk7{+2ϋxpOW<d0[7Qvk0@Fsj;zHߖ_M t0|^fX ~?K.;Q^JAIS%o+~'$Y~e>Yc_܋ um@҇Q7m>֤@b'Oը{ 4G/\9@o9m ZG~4Gc7h:\0BIp@xw8ate7HKgtEIc%E,v5}Y`,pds>d, kjgv.Go%Cbjr_"M:HR Ż}pXDlOnT#IENDB`teeworlds-0.6.2+dfsg/data/countryflags/SG.png0000644000175000017500000000257712140200333020115 0ustar felixfelixPNG  IHDR@FIDATxۏUejqe/m7F׬5 b$Y蓉(1^b04 F^nomg+@B32'@<7̙`K5$tA,FunC?b1 f!t\Ȇ{$& qi"^mWAwTzІ^8f3_o@!Bp3zAP&k@ B^:Z|eԃs#@wOT3M+=ѧà?ʼnWO#qpOBP+yz(ݢ@6y"eܱu _sez0b }d@{ץN|N/S[T?hcON֜?"wU$9FkE[Qau?_Fޯ'U?.h, ֆ{!3u·.=pNL Teڕ6HZS" ǚ/ .ΐJ i/VN\sɃ[tm:fmMi Z!@׳5D_ >Ww8߳vO!ŕui<DU3-@9@ ozV 2dg^VoD>KfuۋoWS T?]P$c{ kOp7m1?" %ۢcA~%L.Os"wrӦޚ? ܼ /}Κfߢ^;ǭs|@?V#8 ޭ]o<.raFd;xբuO._(G]87/"o)`,vӕ/`7Í=<(077 LVVV`aamKL|`Xzd2 Go(Dl@ @L@0D"щ*fi s~~a@ p*jR)!^\.G^FHpI7 now\;L#@Pz'B͈qmVn/)õvnH$;q_P\X܄ASY+O`J:*L =rT|Փ| ;v˪Htpm*, X 088(gTes7IENDB`teeworlds-0.6.2+dfsg/data/countryflags/SH.png0000644000175000017500000000613712140200333020112 0ustar felixfelixPNG  IHDR@ &IDATx PW[+\1@@pC<aTPF.pk !" Q 7Q05 oœC9 aU}eUW};SRD`%Q#; 277%Xz,,, (q(煆 \ܩfMK,q8kg+GT>ǝ,v]}zgVՠjc>x#<)>,v=#O ̗/HÖ k%%?>/ϓq5W\r&SG]Y.*͗/#4| ul0H 7yh1tϤ8jIfq&ʕ?!/ƙcsdz.S]]._A&I{.Lq㫯{Ɂݑb ne ;&ŠqYOLKp=T 6ݫ wfH}ȑ<90Z(b\0`KyyZ1**fOOa8|s($\Z2M3$'R;"??#lα(cԨ-[3:5\ }rr+}mp K~w"wGm%aa{PW': YH$yeD*::X8//KN4k =_x޼<bf =y^#D$;O i_I9)/_zn'/'O(DFAVEڅ ^weG\@R 9.9'R;K a '¥3܊]RUm@O:Iځ r{{ S00zHzݦB \j09TQɠ 'dX!KAP'SG۰.1[&k{ת7򞬬h͗{ob]uC}Mdd}m:HNq^wZv@ItcH9)#0H-x%" ]8c@'̔(ݴ?p^4y @g*u fJTnHJyM'Q'1"\6 ֔n#0& ~3]<5|b7!.exv!x+V~«XwНI#ǜ( ??GpfnAX![N!&-%.@xzvW 1xA?@6)Sck+Ŋ,$<m{s|n81 hXJ)~7 Qq"tp[`"Brl kay\ D؎Kqߔ&@Ѥ?wQ8·)XQ Dx.7T+<x\ְ JW>n<ǡ7hRWòYCg.?p)8/0mpmB_/,\ߴh} Kb;3{n%ϙ+4xl ?BA3Zyp ]Bh{쀶6F`d`4qxdǿ,m/26 ʹ9"Vc2c8@k 90M{3_ KThmf"]a (nĐ:7@sa8VKJ/Ѭ$AgFdbpt$86Ag g<ND ؈q [P =껔ɳed}#&i02~#Qz6S5Do~%o]Jb,oY ,=gBGQpy*z_`}%R`RSR\epE J zvwOi MYYxSSS$ k$"faIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SI.png0000644000175000017500000000274312140200333020112 0ustar felixfelixPNG  IHDR@IDATx}LUeoZ03Z ob/0(b:0L3QCȫV)Ny7E%H^.· ]ϸp<ˆa|}} ~&HLXF>>>>pss#HL R6|WWWT.+FBLj``0|&M5>>&E>&544 @aMNNgPXJ @kMMM- @Y -*t)R ;{e3ԞspnD~?eVwTnjy>l–ȩvZ&}s(z|!̌E-̥+pN[teX=jxx>ͭk|EK < j5z{{@Ҫ>!~{bW%z|ȒZW,9˟џdP?jZ' yqn^LTYB=^R]_m* V' X]?_CUWo,JE/@A)}cW?6?4zp/yd0x&Yƞ-+YMRpnYO>3|W֢=SKm2>_iVIVKn)ߍ;#1Y8e4 X\`yß[HM^6"}ZCh^23 xB-ͷ: ).h?Xrq352+8ZqN|VنV/BFm=ߎPu/v4CTl@8 K\ՁȢ&n$hARe;vwN̷1;|* dqp/eVʅy +C  ;Hli3ޓ+ - ', χ ]*|-N?HK.xS'>GK")#3 %US+&,7OsK6 \/$ng,H!Eеum<H%dM@n:S7-@}hWN|~+6}@8`] 0S4 g-,Lcᓛ87 P^mRCwI`[^ ?݀5/1FQN>qx-Dq#Z^o B Q @~ >;nB.CS+/+@Z+XYt 0z>tR6CO ,+Ȭg)?٬KL&6ea@dATj`/S#hHIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SK.png0000644000175000017500000000345412140200333020114 0ustar felixfelixPNG  IHDR@IDATx{LSWwl˖tu/ G ηٜ)aq{5j¢M%2"`m­_ ri8tW@@)uʁymE `'D_YV //gSHj})$T*EYY`SEEԨ̧r\g> | aQSSC 5Je)~O ,jQ)D]]h4(///4 b~1][{[D#ThtQ8|\{vj?1hK$?͑~mw-*O@_ Օ9Ms|mfGKS o[.@s7܃됵eRܧbO:%f~kCP4CB! \F]+:@[X<ï|/W`4x /5_t=̕-:ԙ): ]:eU(foo㳠qj󮧲/ Zʕ}{GQ)TT<#e7ZʙyK-b.+O&rco £'V7|ߣ&op6x5uOvvx/m[t?l(9ex3i:{ri}NBlض- U އM2Ս$: G/ͷ{.Aghܴ=*fgMO`,*46` C/epFǬ E1L2v2vǗ4^6rFw; 橳4a*dk;K \v\ 4p\Ȭbpxcܱn<t۪5Ϙ߫OBk,&Q:jx䆊!(eTy 4DÍS/!QLԎS٨,(@N2am]9@ <.Aޔ}*;̪{J,W_RYVk5DB?m|O̢IENDB`teeworlds-0.6.2+dfsg/data/countryflags/SL.png0000644000175000017500000000150412140200333020107 0ustar felixfelixPNG  IHDR@ IDATxNQ9C(Dz zo| D!j ZH蹅SHZ`;k;u_wQro>p!0N311 Sea1::J4,'|Ow.^feD pÜj pbpxq~bv‡ -\>`m SNO?`9;[<;0oim fC,}L??hN?`y;s쭟R|51 꾒ɤb4zq@:>>;;;kyWCRhR"C/ (^R!utt$Ç_,vO‡TBBk=P(ZZKjCߡя).lrZ% Iє4gc8<$^S_7ګ/7IoW\{ݿ$^Fo3`檀LǺVGt_XUOқz p􆪆>`X* `o&W7Qezc*5?/y:zlb @D" [)/^,rG l'IENDB`teeworlds-0.6.2+dfsg/data/countryflags/SM.png0000644000175000017500000000503112140200333020107 0ustar felixfelixPNG  IHDR@ IDATx PTGtukw* Ũ͊\ 7r3܇Ǡ TdFQh7Z/R^UǷҕHLU_{]= mccZ>9s&cVwY֝Imii SSSƬ obb˜]:TgϞUeS[[ۛSICkk+@Lϟ(_. z)J+WPU>>@tU ѣGoOP"YSLO<4| ƍeӧOq9 @oV9y7-a!w\'ftkSdX&ftл~ u1HĆ-qwS^]Oy&*Q k=!^#5P=\)*/uGZZN!;hC˙H  q1CVl)2Tz¾S8Y8d#pa:*BvWtoQdGj:'lobf.nz2@qη_c;w|жݿSz(Z@eq\mz(ER)ڨ+Ox/_.ֆo]A'qQD h,&@!ڈ?v ^ثmd ӞO!9p jCU~Ϙhc?T; 7u2Ir3#3|[:a/Z+m{nçtCGDyls\s>GJmrq?ݮϟ> ӑJ^ puGx%,xdƑ9§c j1'#B 8{؁i07 Y 3M db @'V*Pz XOυ 쐗jxocqJn=tC 1=%I @Ja"/p%,'j&NjDIm=VxX˷,x F~>hz25;x:c@zD+lA MߥI71 t-F, u {Ԃ* PxpnC \P22NoMBlpB;K Ѽ]c}1j"_YBkB30u65!2F Yf`"k ^u-d|i&0RC+d˰j."kH;+]\58KL0i*j!4 j5PwAf p4g68>cY<--0e޿6YJT=W}Р)]9.b~1h"rz3yP[%ah$@s03BjqP_L-a7=%B68 f7΀,3>qt},3 j~g2#xhlO]"aV ;|, {~ MS1Zám5]v#տG TӠ+{ sI睝^BB ~=F̅TCLn-xƌF@ԯAŸq^ [ 3q6#pvsa@Jy0|# }C^g<| r43KLc HB^ш  z6b#udR(&c_4srtw 4.;H¶%Śz9X/F}C#r fIPT\ vo5~|r2DrVWf`O 5wRGC7A+L﹋O`"੿W (R hqY 02@0 *)* 5F?̔h~& N36 ?b_ n@WK10$+KAv٧s K@?@WD>6#~ZV]- g|?,ӎ}f2 %`0C7ߓp_k,cm{99) *}mg]~{eRk>c;F^WsO}2SEKQ/-{hvC:&dIewG%͌yiqK#^*:UEӱ|;.vou%ksJn S]i%ꟚlUFނ^(j9q<謊MES7h{TD5>s|p[#jLz~榲N=y݆qn vp:yK)^WHv܆p[ԋlP_Y|p:iD^T缺N}p2>8uuu˧y @ M8 |pڜ@  8둋s>3F= G=)bm ___;@(2Cl{k?|IENDB`teeworlds-0.6.2+dfsg/data/countryflags/SO.png0000644000175000017500000000223512140200333020114 0ustar felixfelixPNG  IHDR@dIDATxOPgccƒ&\D'[FwA䢈$D}(}2VF۵Զ;=DI! ^\8**--.!KJJG/ =c3$mFQY7P,STxPoP@X2|@Ac%Y6>cT%:> ,i(7J0:AGgrʂ@v=Rg,g@v=Rvg,f˺@v=6 d,mN]m|J ygldl{RˮO?FjmM2Y> `~ 'NEYdhv-C,Q}XTS=Vic## 법ž-+k1> Z4y>ouFX=3C3M|}[~Xo&Dro ˪zN 0K4Q>mal$f8| Y O%W&%&鸽;|lsm[^̲Yh[lk&pȰ. `1hrƗhz#@QW;y‚`qq˂<ihq0;s_T ѳV _ӰZ:)(&@gPs͠bZPFv,6` Mvu5edh\S׃?60NV˰.U6 ORQǦ濳gYB:l=+{d`xFFĶ(V^Qy2FUMˣ bWX^:ĭ\GeTF14ҹaq⺿ë^d`Z'y4\)u_U㦆yUu,qxF7\#),øQ_G4dG*W`%T#OwWHP]]M)c/WTTpn 9<uIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SR.png0000644000175000017500000000235412140200333020121 0ustar felixfelixPNG  IHDR@IDATx[LWDju\/}' xh`i1FնQLLjƤ,*b [/.jc0"{9pf|찜9g=(L@ Q+IS^^&|>-Dˤ |GL6uPTT4> RJP}HHIcr@ZjZ$掅OH Ogn@ZvGW? 5oij."8Q}T U'k3&$ͷa"dO|JX$ͷD}%L]{Z큖hn(;5I!8} @^]y}~v :_ ٖDEmjCZ`<7{LՎjIhU}<67> O <6mQ} IY߾gF ^^+q8{#˥8> |xuZ 9U^Q!4KZm?' ҳu1og|N`3,m5U\D7dͥLx*ӿݹno08#81 ;߹cS<{#8KoS6fǺ$gڝQ,,&o,|8쀧~E#1GTnתC1B{9}͌I<`ՇU0x\|P]Ik= rFpB佂τ/i~q=Tx|! eb@mD8Xxl~̯ Y _M%#؁]h<.1t;tX~zZҒ/5M\`rdëp}%x\t0p ~= 0N&u ~ ߇M,fwl@a= kqwڕ 2 JTBm*GLkL`cb1hF7G , } l_ڸ>{9߰1= `cl8 H,)jv\gkXx44 6nHތwokX$OnxsR9 fw2c, WbݩGxߑh9àv^G㹄"|<4 W!&~t/}ƽlz ;y ~QA4r÷2|*kCZ%V%~M/Xq_`H CJ&^'+d#*AKu쐅*ImCpc@̤\v >,kB6_@@8ǽPiO?~J{ ~[4)@' hQ bB-݄ɂ/⽘je%;n)DOG۸00e#}ܳ>_@#  AۖxR 8~;zY4iO ڔYC6l ^ f_^E*?IENDB`teeworlds-0.6.2+dfsg/data/countryflags/ST.png0000644000175000017500000000250412140200333020120 0ustar felixfelixPNG  IHDR@ IDATxklUbn@HTХPc$?6}m+4&F`RB@E#$C)RDyF^j%Q|pݽ3;|}t) "R__ 䇚"Zz>X^^N[XMbÏFEsgaqdF%IXQQ1~8%PLhM$9 #Z)&_@q7,An ` rC N?4+hX& `` ZG K6%pOh]zBگ,Af ذŪk'KNk)KCV\3h㣱+3D8ďH~śh-|0Vs TK@ͭP)vJ4gjX_8TIpG jN|!m,WQ8e8l(M9_M K tqC- {ԗ}F + %X*%X0<d#Aw3jD"Y.MO?ѰD; [WJ% D_<46XNSy q_#z Pmzs0F?[ peL ط{,wg3j{_FS+Dnw<jOle PY wڷ+ ?V2^(blhiG],gowZy;5~on|jRW[E0v^V$KtF4Qu,="hu3"v8޲0_OyO<':@郝5\`PV_ĵ(:NצZ!_UU @, Tڄ IENDB`teeworlds-0.6.2+dfsg/data/countryflags/SV.png0000644000175000017500000000326512140200333020127 0ustar felixfelixPNG  IHDR@|IDATx{PTUGq 5c3Ivay,EքQPIj *( >4S4 !3BƠ5WLNdW#'2||>xŔ`K^^xRw׍]]K wLxKq?~l6mnf\ODpP5[vFxp,͏-*kVss3*R2P&b ,8$,up%6fad&ެ&)|&bwL&cН@Ddڌo<`퇞yrS1bN$<Ӏ63VM xqг3!+= g y.8?4;~c)4t\}@с~Sd -du $`6zZXk9]v{}¦j|uu5 $|&jB,SEF"}a ,`|#-ˍ! AfSoX{[umU[_k=ō;ضw ͱx"CB!\U!\n6C __H0})Rϥz+.E|u\ܔeףZ^ i|`>zca1>3v켗b'xD1Rw 2rTUU).//W祥U1ʙpv@ < * k0zH$pssզ բpb6EIGmWYIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SX.png0000644000175000017500000000522412140200333020126 0ustar felixfelixPNG  IHDR@ [IDATx LgguԚlm׬q@u]b`=@"ekBWm5+uՠrC)%r ( 7rH˩}oDvtoy>,kktbG۶m⩪C/KKKSTʊ1̌&4XT R뒵P^hmlDP\U•W?h 'ږ~zqIM` qA!jvp\PZ~BՅg5]U W1k(G7&aɚ5 R)wgA5Me4QrF22hl x)9r9*gUMcd?3m7rTY!++l]]Լd-a>gsOJ; 8iQv'-+X7-"-;lHhh uuS% esQa;L^1sGJo}::P~MT~t55;I7?Q3!OfP͚U@GrލL]Ⱦ`vfȺ7XT1=ՐZ۲nXk`8P_o0s&`n݋ngie;=tD-Lбظرc[WMCͬ~ٯܻ'̆}}vH=tθs,⏞FH8ҿG/ GNAng&7&j#*XL:;1X`Ӡ/.g kV >8ɼW9D>gߗ3-K=}':k>!E;r9,Z 1D``N+T@q!D5H/Ý_@RYذn*  a08s+p:\X???$&&;% dJ'CW=O#JWeLLpw@tR2B%EEEIczuMK6(|m*ѢOy[{XQ8%(G L BP jb8d1@\=vd7|E sjTs ___tttpwwGaa!n߾ >= @*C$mPvUi? N fn'4ٔ)p1S2=D"!??YYYz6@&rt75X;x?NoEj@ss W]b؏ ?CeDd|"qdtE/>&ȿojrr> u͗6`U .55 F)y$碩Ick֬g =x{{#77H78u:sGP 0{6{t S*e< /]I5dH!J6C ?&=D9Sxt b\ }>1!Wn CtAU/)^by"Q:7JwJ]˰.U!C.ם6unۦTՐgȣw n'; px_ VXEs\`&.mZA^/`:=9ىDǥ`ɅI5dx T%=Hsn1H$ g_L5d $r![1l Spsll:}<fjk''#S=f/X|exүЌIE!q8F!S@297p9HC5ᥖ7bHxLE|"2[I ?O:Saхu#t2K9uqW "k7wӧ<LGZ=Sd`r]&@mmMdhH%&r$fQ8Qֵ1IeWPP˿Wi<\.gǜUi=t5n>$@:1).N@}/(X =g{.NPR&Xo\M][I 6X=@qlJ_7*fo*Np{^*GI5hTMP#yUޣtXz}ڻUtuuc}ucv{xtzLk!aQ Xo8Hhhl. ]k+T۷o֭[Gצ:Mj-[ts++6oެ3^CHGIENDB`teeworlds-0.6.2+dfsg/data/countryflags/SY.png0000644000175000017500000000222312140200333020123 0ustar felixfelixPNG  IHDR@ZIDATxKTQǧZA %%Hm4)"zQJJ,!zh{ltlL+vJ4tl%\f1q_ٚ;zq~|@9sAȬpUn# DDD@pp0C*$ y񃂂2W\ϛA͒uT i)> W~p|#ek*# H)[͋O y)H^$2^[~KlW? 7Id|tI$_$~NV? 8I8Is? {ofpmCr%{* ( \"11FOͰ䱾ell ZZZH^_ ^,>?1˝tvv*> 7[^_<֟< բ]|@Ho{+68孮dXH#Ahll$܉B]'}NVjXԔKޯX 5c###5 .PSro-(iR=;+e@vu)ZU0{/߃Ye0_Fx䲻~~e/Z6Fkk+iZN㰽Zs*K~ ˯%R+T5Q %IZ|{~jmsP=/bIxt MjSk4RxJk?Ru+[l5I4h&''M!*T$1Zja?WoP8nsL <XO1a/6eyL;$5 f{pT9XؿYk&6fcǔn1" r! "e[j^V RP,&z#9N_ҡ}x\lJpծAͬbD݇r@h.\S+4wi;GHᗴ' bwR%TE @11~$ ob_H#-E`^^ޠJ!S]Kń!羚%1kDDsD<9 4.3V{{>xE p 6㯐ƫWVzޠ3fcX<~8'N`ilnnfwEgg'nݺ]D|U[i;7B,&[${r2S jp!,sQg|Hҁt&hZZB455Ejjj8rH޽׮]޽{q%o>+D?vN >9?,C~7F-P:{` ӥ|JMoq~hmmeb?~ccnHGlH`_*D@y"BZ٪OA>nurF&3wΟ?ߓpOxF=|v78ZZPh=Wla_$]m888A"4_* (`_2Pz۔ŞpR1%Y pJSH2}:, @ X>ܯ/KK ėgq#Z uiBE{{A |oox. W|_SYP|h[lN@ebNO,//dTrT[{u@`aPY ͑?k3K9d<:|{P_u5k:k<.EJģ'h N"`NGc4T}  8NT0ΫG ϿN9< @}G/ 4^?ox8dR͐g= @gkSE7 @b:;kyz3rIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TC.png0000644000175000017500000000453612140200333020107 0ustar felixfelixPNG  IHDR@ %IDATx PW`8=QsYsKͮJ'nrxb<P"qW $ FQaC \X\u)8 sPtU_50ӯj Ag.\h\\\}є0WWW̞= ^~Y}u?^sQ = %GU_ ~- ^ ,-q78ϛ-—d[QQjk!իj"HŘ0aO @ߴ)#x__>0“ FDo >"<71 \]x+gZEXO]Se'`$͛p ϯ`{P‹:EHK+QAV >22e|gD<~ r twQjjςW>H{ϞL$'9!!x&I"I;xw/}|clZ/p-|tnzÛ4<3Y}Zң [{L֨tїawfy8# `%%GqQjbXQ_ŀ…*TW7jE&kϟ˕C7xVUՁLF&vO>mECCApu=̀tFmUދ6,, Cnk*5^ᅬdIX ›~@02DD(,"#ZN6~~z' &?UygX+ ~mlԂ Đ!߸Y0~@E"g7f]VYbOĩu @1 _= ޘpJF;yDTB?L Bݨ.p1 9g™faƋs.ɠY!>1fo?ŌQyT4gIpm{hOtlw *CQsIiKo@GߚT^Jс`U=jt0MB&H2L[-D jR8p,Yjzű5Gi"9 C{(@1>[`UoUĴb`+'A^F:IVR[c_lXGdjҭtaFwa;vO+Pl'̜TF-9"m8Lw88XM­K[a/!_j}{v>i ER@*C@^I2Jj*tUX Nxvb+Vbk07_P aPJl{T&'Ɓ˩& 0j2meoA- ӎiJf r{dK9I"?Q;HC.?`A P^ÈUA}!}1=%!Q\o̝ڣsqXҾ~f;v= s:iqbP5><'Hp-%?Faʔ-=>G /u1t7SA;|g~F9XÊ:Ҽ#qkD=AA _33c1c@Hq`؃\v߽/4S|av>} i^`g 6|} 7X,|`u_k=  Y_.?|> !`޼y|,oLPIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TD.png0000644000175000017500000000144512140200333020104 0ustar felixfelixPNG  IHDR@IDATxnP೮d@@(-Pf(oД6 2 `_T$v >_3?F#JMժ MPׁVqP0!m-?ϛPL5}I3ɳ٩:b }d @:ͷNF\XZ)|P`+tP>(pR۾ex"k};P`g ӿZL?3b@8ak?0:%@?Pqa:Y0 C `c-_P?K1y0Ao`oZ_ c]sw'Z ` ZKXĿz?o~Da͚&-w&mm&zxekɦ|9ڦ8;z8~Nc+*4Kd1V8 x:v ”tP<hsO_8T>h\>H0|od.,^U>H@->Hr" @uDX$x@ ̕X@)1|H*scI@Sq"0\T)2S|\Fض%\*P|BLBB_ʫ"IENDB`teeworlds-0.6.2+dfsg/data/countryflags/TF.png0000644000175000017500000000330112140200333020077 0ustar felixfelixPNG  IHDR@IDATx{PTUǷ̴1zgSS@ɤ(i}   BB4„QC  3*i 4T4kGwz>}ss2`@xB"AQ*B *vd!sEy?5]` <e;h!66> 9U ( dcIi 5 $+hw${I3^6:U0<4%C̨ ?*X>q=mIp`Aj 6.[djDn2z!8%rx5y;D]vOy\aC<~JXf; mx%&gc02T{}4PC[Epmu p;߄%u$9 Vl9չ߲8$o_hEHmc+Z8W5J]`+sO`MLI\jOȗ59 &Y@>c!/S >"V¬w#D9. #dG&qe!{xmj9tww qǟ OM HX`en3B =t{[h>wɯ*H~>PR ^f:uɀR n=w^ζV~@8ءejq-;aq>OLܞɀp(dD\g./뚡 xg0;^wY\Ɂ!PeWy0Qf֑v299\pxH^ Ssw[ RFڶ/C{Dz%9A9óS,s2,;#(6w-IEŴ3R <[# lűͥ\(Jazޕtk9ˢ:k)؃!wA|WIsʹ7RsA$`⳹8o1H2>oj/¶*fPT:~-1!r7pf7.!i^^gzŎ+lt,\󰤻XUPOOIcK)߷8/Tn) Z6-@Zgj.< $/|9 bq~_`ۊ̍.[jWbG $b>b/okِ^z^8p 6c={pr$߉6\]~[7 jM)^C >..T*=ٳ)x^kWIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TG.png0000644000175000017500000000227012140200333020104 0ustar felixfelixPNG  IHDR@IDATxOQ/p1h"cpE bE"Qv0M4FqЃ&Fq miLky&d7y HjAj0͈t@X,E$8j R.Q5 m_'%v(0/ %@B/EP Pp??ԌWBpE~z'z6,@G˷Džr [j,@j!t`/ o\A9LStz6J.^z7#1>ksi%h18 0z~Oy%Y,^ngk\Ở7 ^OL Ԏ_?_W큖rs s!@ƍ[Q M~E>=3nn2||&P;a2b =C ZQ@W~iްNԌ[Ľ{h;Q'=\ T>Wi!~c ]nUKtjؾ>{ tWJ}k2,gY{:Up!@Cgt|2l``Zw zcV5`B\XKOKQ%Ldk^CieJVE]#Y|{}~|!l XVK_"Gu^#/\Jҋa WFX8`A|<. B#Bň 3b6@fG, 2"8:'CUЬɚ@z$ӧAV3 ZZ;o|-@N\*x; H  2 #pHQSZ{*\ uC|: Ϣ(>|zUY?pkqY?bI*%@? }OT ;qbOO P(z=)&)_ 6FV`09,KRގIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TH.png0000644000175000017500000000143512140200333020107 0ustar felixfelixPNG  IHDR@IDATxnA 3)x%@[8ibL&FmVx&ށ1.jT4* B'] mw|<'N}21ƴy+0 LeU+?fY<hf4X,U2'$E1|@o{(§!Q>!Aϧ~@}C?t? Ɓ/(AK+jZ\./p8\> RvPh* ZN!(^@ f)Mn<|;L!.Ӯ=2P3C oC-T"g9| ‡*0ۂ$<<oÇQu}d$b~\@dx-lB)ͮ=vd4g-ؙSkxwWX=;O >ZGWwupK![KoeצRapsZÒT #xТ|ݯV(-_,2J v=`QV~ʀ`W@ǡ{oZy$8!C磔G_>M*X 3b@ّR}`T@*~xzZprKWwC|*B*X2D ftYIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TJ.png0000644000175000017500000000307512140200333020113 0ustar felixfelixPNG  IHDR@IDATxYL\Uh|i45&>&.OPK)EJ1q)jL]4QS㒨IM[RZJK;wffMֲ;:0 w3s/ù|ss;$XxXuJ2@}veXb !psrrXIZ1\ [lY U"q9ER3/>@@O*2,d&,@\W dqa_ĥnW)m5V\ EEHIp8B0(&N#$+PIdqX9mcff&&2(aOrC}Jcu;>2@2Bx'hC'/8V^m >ӽ.855dBAq7j[}ڎ+APtz{{.˺G?mI]; '$K1-x> !м TaKB>r5+d@f/m@[67 Ovw:ddDж{)o~WXY6"5;!1?*$pvcZU.r.f"<n`tt4aF6(RPzޛNGjY|2@⣇hG{!###cd(O=Ɩs1F05dxgf/oO͎]55b9YnV&$=׺dgZa&&&^x^x8}Teay=8a{?8 z;5ֆab'cEQ`ll vp:$.t I,`xl5`;ʧuv'8a9xNs[/dUr6МHy[V҅z:f2Uрo1o\ 0-Z$CD!Y ]ew1.YR;H)_ m/BKtۜ F;L^x 5t K 3!!z* ~0emvzAAj>^Cln;AcgKmᐁm'y@m-6H? JgZ\~7nem=+ ~ ֙.`\g~;tyY[( ^/[|~{`>oB e]I?lK >b)k~qCv|`@*or*xNu2/?@f} P2`Ӆ3^5,dc: lZ61I_G=z'L! @^`YOo1cǎm۶ڔH.a&|^^ (((غu+ J)=5bYO X/k@a;~zcEG ah[Nѯ8{/=x `V йعsoH? 0ڽ_~m 7 .\_ ICcpA̙۰^E|5{ۂ,6eKMĕqN(מeiLԣ1=*֏m%#Xoih+qxS˨*VX4 +>Sſmnŧ'$ǣѤ[ >1[RMfw (kۭw4]o]U4u-DM+Z P$zZkU&Vܼ#\ר]x2r?]2yF=6Š؆&m'? kV9h:h[x8_}t:W<ڋ\Wp}xrOo+]o6ecV%1M/Ix99ӌ`vQls _aKb*N^o.S0_ 0pJ?' )ϩ*^s tg] ʅqIˠ5H͈熪M|d^ǓUĩu[.Ȥd£O "<³qa'{I7@SE+ŁܬaX-QZxj%V;5.|GHء8?5 o TfZzʧ|j9>h*_facB ,i/T 94oVXRؔ$pn0~y?e=Š})w Rdro|wc?d5J!~pOPƓč;!{̨z% _on8u*(ZD 7Y,@x .*1S2:bhv|-![n-$찪kClrP^8Ep1e:sXPt1wֆ{?a}'jY6=W2:s(t6+m.VLo /*GD2غ/[Or[.x5\pT=h5@wIE1|:#+G .&z`őAv˱ .ټd 6v+KXXՒTf}X['b*klg+VĎU9|̱o:uqPe,7xt1xw)Nl1Gf$>i~?pq3h; A!V7 )rFg!n3Pl6Ɉ!y5+io`A(ʊ㍜^x)s3}5ܭSlC$")9 IAO FlBbf"*. pcD[X "" ? Oh Bc^΀K@7f?/lm ;dn63`2}6'K:99xL21!#b<'FgsQO뜉vƻdpƝ˄mG @a=n6&^NŚd 1H #F\6f tǀ,xD)y$rIHqE<|RR9~\Ƙfl/Λ=٬EX]Q(+pBiX"-7UJ+'rez5[fX`ZiÖR^M[ZN>)+gj%Z4y+'H뤥{Pp[4E `XT(/+Py}D @k| o T'rѨOp_@GHDڔ^Tx]0D"¨ZjMzS[IENDB`teeworlds-0.6.2+dfsg/data/countryflags/TL.png0000644000175000017500000000254312140200333020114 0ustar felixfelixPNG  IHDR@*IDATxKWר5Icؽή^*}*H 䡴BK$-mnfs}juٹι~?yxbf\GǨԼV}~uvvBss3cTJF%#cTpӰ)j8~˨E6]x2&ܿX4jYf>P'*z zm \4Z ؠ3 /g8yv+Oّp+6HA0/R'H ֲ W$pJS@H VOZ2~*ЋA@/XW9._ p'cY维#F)Hxv$V3  E huL`6Hᦁg@jkTP[[  $t: (~oQQ|>" <4QPRR;;;.= T ~&0QZYY[[[zྲྀ6H$cccF@c 6ACC `7 GϢ ޘ  :#iA<' `jjʲvF $,NPZZ R7;@n?>TP\\ k|H&z~ o-S S>m3 )V̔O`tgxfC?z_gx&,DF 71#b^- } ~@,< /3?CxVPSj5wGA*P>0Y,h(.P>2AZrizM,(7L8}kr-LgTWWg?ڔY4S@45#'n< snIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TM.png0000644000175000017500000000635712140200333020124 0ustar felixfelixPNG  IHDR@ IDATx]TW&ɦĄh3CoҤ94A"U bW,@[Fc 6RT5bU1Ĭ'nIvo>'!&;9yw }9@ 44,zGFaaa $h) xpF~@@AKYzuR酤QșTW?{r"đȞB-GB}8d$iO~O6r"TES4Zac2'~2Z Kcgh͛OCk%~,F P.@9iW9@f&iF۰&/dYS!Y*t\HiC?Er2ߐ~ALdzyᛍ(SS"'VOP#bx|`sIÙ푌iݷW4p@μZf0Gu-E\/Ir0C~fZdX<z2p9t]\`^h6xrbqyVnmخ2?!is%ύR=@Jy.8`䂃V&$(4EՔ.) oY f)(ص:dzk0DO=lA S~^ߒ6z)wKű*?l5_V㻫7piR\+_5jрsm2p2Zn\]zqīސOP6O\ahO3оwq}y1w[2߹}ugD7y!J^i+9}ȟ~G5?!^ߧOWen4?HFDC4;M|·iܢt~,^?6~? %WSz- F#.FׂzjLai.ZBΎu)QWY.Փg?/@k8.=2+ 5clfWqa|w,ʏl;{l ת/@\ѻ QocOt M1qg[֎Z5`~FRpLM9_Ҽ^}(:.`-i^}Sy!"Jhh6 7!1L7ŊVh 5xr_3RJԿKx{?!˗t%ǔ V_~f?Ѡz峿wx8 ~6vM3ŵBc3=l|E*(_oP{?|ȿWxpJS6nŸ`l%]sEerDzoz.Er}<쟹"ʉCՏf%pEg>֬M^<dQBDTԣ;>#.|~ŻSѝ^~.h0b5pdhਯk92?W hYS[BrJcgܞ<`e?'?q=UY^gɟN-L{fX VcNs4ƫ }x)Z7G!чHl %kbsf~y(L`)GN\)LC'EHK:.u0?\O?? +Y&HjQbyՏ9& dȟ~;0Q/Zdvtk[oGj/P}'#h \ @Θ^O@G4(f U@ <h#v6C :Փ}" ??p7B|/= ;'@BܓAב"a߀n j/*RXnwn/=06A?Bƒd6K0)Nr4 A+Xbh~(|6QPhRLNbA5"P9 p)vga}teXG QF|@ԳK#~(},{*N2}5;h@]k$3{Xo=M"z+ͱzs0qbCFD,Tdo챱]; F!#fc&R#}أ(w# z"TɈ' Ͱ[-m0.U$h@:h ?Xk!" &Z_`r4xHo"ڋQoEP}#A۬q6k@/1a釤p+g8[n,Bs )LA!د[ ñ[pm;hooDZjOeZ'Ui",H4I _@`.h߾ ߻ uQy297:4 .d)Bqae6]iI(:#ݒ9SD'h8=F0D@Bh{seaqe96ڡT#>#w!3Kb׽%hߗ|m|Fɶ۶2.~vf`id "A.cmE9ʢBL}GbFhq.yĽ,_z9cm#6. %n>ZZi=Gs]1># [̄] ?=̧pP[tJ#_4|4F*L\lj]N4H]|tV#@WSbc ǁ#&zh7$Lh. 񜾢~l0]hz!85 DDD@**kS X G 13IENDB`teeworlds-0.6.2+dfsg/data/countryflags/TN.png0000644000175000017500000000330512140200333020113 0ustar felixfelixPNG  IHDR@IDATx lSUK԰ _D4aj2b̢h\6&DMq`57Q$FCHpF!bP |{un=;ںvlvޮ]Gw_2=yӢ<-ZXZ3/>999Bz(~jj*SK Я3=3xè P%vB8+>C.x~2} 'pF,qdhdD?*8I!ЭS~2 *(ox E})@xp`z|<D[g~2[dGJ gls Matf UD?@V%D֓0 W! S߼|*~ <竘&pAETD>K| I)>o_ :4A8{֞?@+xOL2'u% x E{rq|+pX tp= Lp oA9G̼O%5ЛtՀuh~2`K"|qw?* /I0'u`]jw@'(~yD(YOR=;:Cxv϶CP/$sں)`Tm+mn-\䙄K=ywԠ)ha%&M0luugjd87n|y\+%ҕbw?{Cv`ۋ< $7yy;rz|Q~o:ik" M'3V7Co|{f޽/N-mپ 2|;w|Mq{«!3@7fAe5mW=mk] zU'(9|I 0GN]ӷ|\#ebّ;hD 7Ӂϡ~k5$CmPZObBYXf 2Jsg`NHkWjg 4@Gelõ;nX[[aq?\۫UVacbt7l%5iq7M#4VZ +Qi0F`.}:Z4I0@oQh>5.hSXB847DU 6\M0 gff`^ QHX5zIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TO.png0000644000175000017500000000150012140200333020107 0ustar felixfelixPNG  IHDR@IDATxN@C .IX¥VYT]MJ]Pj5 6dxm"Kẍl6`|jB0.IY'HO^7bQƅ(!  ! [dG]݈Rt>(@;">&?OOj"?z=gIy?B{V}|`߆Ox  Ц  Y_>?e!߶P'U qyYg СI S0> pӯJ[[-kktx͗M5 D O]@>P& 3a+gɃÇ`Vm? | S,_i}+zs _6ylV%Sx6Ack?mPyQdKO2SOlYʺ1ʕl9I+^)*N]K۲gX-6PrhkL)]4˩C,gk^  0cd|gϜv quOlOryJ_iFAFH!I::@>f]^ ȸ\>YHRs}p\mDAG9PP#>.H2cTg∇S?hx!Գ$h4LZkS2]!_T0̂) SsiIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TR.png0000644000175000017500000000312612140200333020120 0ustar felixfelixPNG  IHDR@IDATx{L[èSdPQ#(Ps*:7s^ga,&he*Etb21L6R2Z`LJ JR(yO(^@$.oa!JNN/E233oʚTOVV"!Br9~JJ - йh)EdaHKKsO eSH94*C#$C @(_I ESΩRT˥qq>x @W?``\ }6`=|V&H4~0D; G[$[<Ldr2N981ۼ~.co{aB#G/~~}W[#1&XM ?z5O[GD[/[}lq_6nKV>1L r0Ѩ6XeBgxHDhՓ)V=y ِ_Re~d2|0 }i T"5A`IENDB`teeworlds-0.6.2+dfsg/data/countryflags/TT.png0000644000175000017500000000362212140200333020123 0ustar felixfelixPNG  IHDR@YIDATxKLTW DM1I /,)T[M.*Oa4KyaaRm ta.miFa6"`)j/͂oaͲ%}ťKq1zRYfGj"=J'Zb셉I}=Ypb j&>f!@&OVD[H/Ҏr((]R"eggSH% wѐeZR"hD%<ܹ (]"FSB$vb@^"qGR_ b%^DnJ$UD𻞿QK~~+"V"sK&7"%㸞˕ %G?@%4<.3A %Rgx!V"m (>]"c =H_ &Z"7zڸY/H0K$\v|HXx3$dL 7;s >r߆#c0773330==ͿJD!p\p='x ];73Ϻm/^kwzUVɖ ::Z[[>.p>r}ݣ_~ F~LUWWGDB=` ne.WOׯ-AXXדc}_]L8+k눠p,+5kpl|Ӈ @y]ssψp\plX)u"섘 ٳcm6Jn:KO;>HHH-O±t@ރL@m N0$%%Q1`淲2Жsyt*C (1I6xf+GC rtL %r?"(]RRBED~y cWL7jan[4$7±Nbq#Hb\ݕډ***Hx#pl<2 %PD%! H}Y׼ p4k,|c-.\Pd(~Vq' KjK$_OWjD2R~Jk5K;H=)%n|i^Z"eddP 77wi;qZ9@Dϧ"AZZ)@e֋| (EK#b49wn jYÇáC)CY!!0‚ק↑t0IENDB`teeworlds-0.6.2+dfsg/data/countryflags/TV.png0000644000175000017500000000630212140200333020123 0ustar felixfelixPNG  IHDR@ IDATx] XTe&j۶krílktm3eU;rDD J{#:"M.hi`V\S?8f`g<#x5k*ځ)ǵ܃>f̘)S) ('O&0R_Vq9d0wN*a^_i'-Sq\x' q-~JGX 3uD011[$u,ί@[%xZ|-CK1O:CqO_0k,%BTN[B_pqMR5~sT8gL/zf<6Z3빜@I%Bwp Y9({;R.춻 hDĦ4/PDYwձ/($I:9- NP|W(Zy__oվb[`țX!%V\S5 7O]]vixZ]o,%_/@0N2.=;⷟Ow#5UJF_0}IJ/0&cP\ֽnFt. :$EJ@?\4נk>9vhm`s1XGpc2k&Ҿɴ{LᴣǍ_:dh)(FٲN :7])(!LNj{!/q<__ώ iJ.cA2 ]d8RK(ݟU?ĦHt%'sПmBS[v~c*KG#q`Q R'Kt4y'_? K;Ak>,eZNIіo,# '+ ,/cP7J*oam~M&Q@p "k~ |O ˃y6uYv,Q$}\xb6t0Dsp \_6P@o'_LG{v9EYXL_y_+r$HkS\ +Qbqa=^_븁yT\EeJÉ ֵHβކA66i)8ֽn¹.~/.mg6EXBD}o?CD*=V<2B|jmWߗ=#vw[kbRQ㰮 fds ԓ ukG] >ENxwp:cx0`&bF}  HߖˀDJd_ckE F!C /+7)}폔z% u7Rܻo6,5'Qj/H}_ji"#"M~<"F #_IqU'|=p8esfRtK |SW/IPfN]n2!\B\YP//< ?$ \Rd^&[){-xa 1\Z#`]3cM6&o/7@)fQs Jyq$p…V?wKxk3@LL^:1d93p]BCE\F5hЗjut9= wH}M=ӠUP' [v12&|$Ȩ}D/gXT]DQz+84RrIFPrI K@BF\?h_I $rM ,+%q}%"%kyȢKOu2o L#N7_S|r ɼ}!vo(8cx~~pxi;ڹ:QNA[f]xk`3@y?MeY'4p+X!=YK~ߞoP VKeڣM%~`PXR (H{zڛsT_3@ǜ>Yy\w pVABO1 @"-#ŗ~  ;7H@^ ,F@, ~p `̙>}65@ Mf ~ L`ԩTu{lIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TW.png0000644000175000017500000000214612140200333020126 0ustar felixfelixPNG  IHDR@-IDATx/[q1.\ \K$Pմ(ąč n] d -"^lY%C&Kfiz֧(ZU=/ܜ~~/NH $ )Te" | ??B _"RD]I2p{tx $// q%N@|-@z"q wMdp/ax 1NV;VR#*K`0<lSS6ޓ`XB `F 47@f#ta2|Y`2}Wzwq ǡj lކittAvYn났2uu%/>:ddt &Bg45M$7jtw._@J]py"<7?oz{C[h(CZ}!8#|!t~5IΚ !|:Vjp%`5ս;~$;ye' _h! Uy? \xs*G=PO#uΩJ.E6*uq_g -NYdpU6IC/Zl̪̊E\mnzِْ^ˁDV, \XEmSQ!'>b}UW  JxZ*9)`G7Z/W]^UB >"y6pU}>y kьl) aJax_X9U>\;q ^OT>W CAAA6e2 /F1@s*yIENDB`teeworlds-0.6.2+dfsg/data/countryflags/TZ.png0000644000175000017500000000437412140200333020136 0ustar felixfelixPNG  IHDR@IDATxiXTgaaQT6#hE Z[kXlSƦ44&5Q!*HؑdҨMim4X>9(p9w2s>=w}$''Op!!! /40~VXhd:QQQx1xV.f}C; 2[}.6R/111yE(#O-T"8r!.Kj<0R"kI]ǝ)<F[~7;xrH' EץU_>.Dyws km &@dVJuRp@D"~>Ku pR|炴f^>Bg2,^`p)t*Њxmvʝy M [7ڊ F '\p` jPE]yNz;Cm30< ^Tcv`'ti*wN ŅyU_u"wzLx3K0xUFWSJA N6|3r:;MVW>nEj$M<S%.s>u\l a}-qN8R~VW0kN0<į*-ת Smfݷ f%` o0 {vAV(QV*8+ #.s`ƅTjGđIoézL'Fo vnvM^VW no5aH/t4J,c_xUA0K<8Y|L)tnd o&FJp=7gm>ym<Seٹ8Щ?9l 9n2e8R…,$]H^|1xiz?>:rk{ZX+3ջ`ΐ0)tΤ̈́m%CKzjړUp~H<ۓe~U$2ppՓw1l +K ~}{a/R*' ${[x&;BCl_B-W^[p\-?o:혏)4Oɦ lxYs;ɥ9)7< Z DK$l$tZYtI(?}; IZ7ׄ7JnRy$Z $CtLt CYϠ%y"Z,Ż*-p|tEM*Qpd=mȠz-IBC Zދ5q.P f cg C5&P$u*UY.Ck 꾼G0F&2hv_=*,t(E& ~]6klUI`U]0$?[>CŢ7Ac󩃖d4RϮ+qY.dҰ3hIIR,Z\}տzj i6Ab}%JIuO Z_WCDl2ؤ,lf>hfƊRBFt&0)t`)^y:nψ.pNIq9zS;JKř|Ƞ_ DAz;5DfX¶БJJ)tJp*,哩ަUBy)sˈYQaJW/B 0۠M9aZ+ল@Kg"ᛑ+|l-zv䬔c[eNE=dM/tDcBE 2DVK+'g&@_Nf%89˜0ZK ;\:{DЍ !)) #)ǰG8.8I^lNIENDB`teeworlds-0.6.2+dfsg/data/countryflags/UA.png0000644000175000017500000000141112140200333020073 0ustar felixfelixPNG  IHDR@IDATxkOQ緵Moۆ^huJ╄BQ@zQ"(*8ASi{y?< >;{L\> P(ꖸc OXt:-P@O ?J -}N΀~SL&'|sCU4t $Pȅ(|ɿC9 2z!6CT>DÝ?FjiC TZv?Cߩ~;mf?蹿}CA-!&AM:|@tX@? 4w~>;TuM!Tk-Ox#?%gM;$^] H_"^}K!{᥷Nnxcx04ky=oxsvxs|Vx+ C _o.Y7pЁ'wM+ `rhہ@ 㑹 XKf6*9v~:$_n|@u@.DTB'?Kx-u}ȋN: s_;z[6m@a.Kx%V~A]S,]HWqZY`+@S*;+}# 8%@sN ~]KT*q>oצ$C >!x p6E 4UIENDB`teeworlds-0.6.2+dfsg/data/countryflags/UG.png0000644000175000017500000000252012140200333020103 0ustar felixfelixPNG  IHDR@IDATxmLE7Ħ%|H4Ji(PAy;ޒmIb"6bxѐlZS61m' P(&%@.pcvnfl2sI2dgg3oǃ$AZZC@#F1|'==}!|G'xsH!8sT+B!O ݳ [Cn_0hY vg$nvH{a:OVUVaq 7> eExQRͯ*:u_> y4Ц& p𕃨9^Z0όG=|Y'$2?}wY^?M7"]iCzg?('=|Q6YƄ/PzR& !!a ?8+ˮQ$aya8`O0t$[x>@Hwa;tZm,y$V,dG:[, U\mp#Z[x RՊ`p V4-]7Ѵ}7Ѭ +߸&`C~ wcd;IhpshK2iЌW)|~> јϯ`%'4"@`@@ p]/o| EVV6%:`gffRZh4J| ERIENDB`teeworlds-0.6.2+dfsg/data/countryflags/US.png0000644000175000017500000000454112140200333020124 0ustar felixfelixPNG  IHDR@ (IDATx]SUI[mR v(R[l˥rKM#+ *q!PQ}} {NBW97|<1w9{!"#r01|܅-IG#$$w& e|]'JߦS2N#n|90sz6b(|x*Ϛ=b9gEޮHh|C>TLEE),s?C'NTPH ?).*)F\GukqTUHqqhR{{@nyygBKK/RZ\#XBe&a[[{h,[zI!92p墹7s'&>8h|?9}BNdR%6(ݸNDE3H/lZCCVx}N27$)=t9PNiڼK4_Rm6lH  v^yPQQO.Zwl#I^qX--,yc'\|Y-`|`j+h~r"I!E׮]_zk&Sl!]DGwr^j#@FrE @(AXp _{Ȫshs:H-UM,#Qjۙ5"$ཛྷGoo3U IWTx}}CYb*i,7Bj ?B WE "/m?pdz,6F)RSb1l6RqE\:z{7=4z BO?*F۪ (_)@MM]ZۧC>opG;ĪQ00:uA> V[ H]{-XL0H,/3/#JioS8KH/4q/d|`yeFy[5>P 3~ʔ0 2AS3n7f~KsԴAtlpUpuרԴB0Ǚ(vkOJʦgwJBykf0ppPFp ܃CAp)$]~fм_0c3H*`(uUǞݹt@[#4RR~7ٶ툉jH[WBH^zkv]4vȣB,""~/&T@$V0qWkV]8k. c)"48*CuTcX @F c&JJΫRޱS KG̙ZO] `$ >&t#aZpB3* UdRő1_)0&⸑/.BCO< V0m3ej>/;@1u?'Rqt R/[8@AUyZ  M]!>001:P@@cxEc<^ IENDB`teeworlds-0.6.2+dfsg/data/countryflags/UY.png0000644000175000017500000000421412140200333020127 0ustar felixfelixPNG  IHDR@SIDATx{PSWt`hm;Cy]םAdQ[[]vmQYvQpDKD &0@BU˫":s(Y %&fý709ވ+::AcA$Vy=FWdd$/^L$V(**J$Vv@ǃ6j˗ǚ/JqM Gfւ;;;`qUj>Sܹsrnm3/w{}Ӭ66bhhl>S4JsŶMG/].*6)?օMLiDZG5:j ]4Z N8~`z~ώ̅h^x tI@O$*Ukr1LmhzmXm; (-H' 3izZ|(C]VsŨRą Q`LG$|:w0ygy7AJ^h"+ƫ%YxÐ7]6O )f lpl3zb[Kc)Nd b*l @ P~Jf'ʶ!cY)pTj22$6o T+a( oLUY'%C Y;!G}ZN(L%]{M]j‹1ל<< ;H wC_{PǙj:IlR=Ы3~fjEvw\,/zf8B=$q}tttXAQK/A]uCʋ˟.ᕹ?Aw>ؾ (ZyI\vmRy @_o70jXb*x7OҖ}]qN_ԓBAf?c"J-0sv>!O3H;V$#e[,q/VzaGMt7 ǽ"|oۊv{yb$oGx]|*< $yDيXҞ87tk,Q77e89Tkg*޽;i-Lw!X%FW!ّ`210Vxb:qh=WҌաPn5\"憂7_o^h-PYא%NL[H+hizD}\hxb?*ǥs&vQOv}? 9 $Ь9j@h(Ec¢̖uPe>]MJ&M>4d|K HQj~8{ >,1Cfe|70^jy h+␙s4q5r_T͂R=r_ &oG+~рܔ`HbtA]tT[L[}隑\g"MPv07<<XA6{j4 7 %-溁8ti8-XG'0@HtRyrE{YEyqPJ?g`}+dm9+6)a .ԙ}+bpKUaN񞎘 FGRf<=Jܸqc3Dcܴ;_Eutuu͈< r[1}~-jz__ߌ =ZAȚ2[w#pu!cۊ1R(VI? *@*"*VsѲVtRμMWN * A"(pߴ+|Lyt$@)kr](&}Zƕ]t+5]jE\-7zrZd|mq52===pg0#R*hg~7QX~rZfG*&}1 'AďOM{^|(4K0 RW(U[YurZl kޅ#gyk$z^|o )^{OvLT BwQH_O~Dh.Ѳe˰tұ?m*ȾrK,g([px?`Oi0IENDB`teeworlds-0.6.2+dfsg/data/countryflags/UZ.png0000644000175000017500000000255112140200333020132 0ustar felixfelixPNG  IHDR@0IDATx[L[uǫq^2ub(&hm [|l1`|>lqې`:p܆qn.Z -P.-?֮NK9s~p=;!AXyEtRY(Ic2 33IP fo0TR.&"7@VVV8|@s쨈1,iO/CViW{JNk3Ĵ=\ԴT*`S21x Gg^-/ď0+-g"m&H:ίo.{{ n,`ɦ/+K[v#x/7#<8sXl/_ֶsw|  ]l&#E$f %X=lm.klͦ_}wn6<~{w;]=/<8r>8`qDW _U?~q.%=? _(pTkTG+سw{nbۄRl#V'bM([0|=xģE6[YU>dއ"{x`W:@  Mx9}v \vOE)?>yP'ا|`lm띁5UmVp~X\ς.Uo CAxzgI |xh`mZKkF_r α9ؠ!{G)ZzjgWՒjf;!(0A,2^)wDlmƭPTJPYMOOKPYB!'Z###qO<O*)b@___BD, -;|@j&%|@r֓zy%\8.{rrOeppmCv;CB3q:\(q?{$@v0=[ pph;ߢi1x  vM fbH՟K]|m;t^'SjG?y>>C:x齵u+Ҙi߯%QhF}wф7JE?JEкa5e`ZҏlsE@Ѻ]𼿏׬it׬hӧY545+@ZMi׬xK|@mJ<5 4*@# 4$F1_E`9990Y 639IENDB`teeworlds-0.6.2+dfsg/data/countryflags/VA.png0000644000175000017500000000476312140200333020111 0ustar felixfelixPNG  IHDR@ IDATx{PS3VVfۥS>:#;O^ZZtVkK WyGG @(+h-NǷ\* 3rO=we༨e˖ F988q`rtt… 8`ɉ5Djw󓙵bѢE}S, gͧXw3g(Ϟ=KT\šO@ݻ| pE  ҥKK%)?| {M_]]]s.*26(ȓI*dqrEVʎD -5;ڊUh+ǡy{|/lmM+oT10Ʃ-gvw| @^ˊ@vV>> uFɖ{viqR'jup5__ &5Uz0ɢڔQ{&t4`VErr2JJJു3cAƒp5?cA`-b7AxD!7Kcߠ)h9@0u:ddd@R!??b6sP@.ZGkl]h^m5K @Eq:Ts 1?p8}cP]QH0ed2"##lՊD"H"8`#uuB*XǬ j?@%E|Dsd L3顳) @cc#rss"fVt( dc o4&ՅȖdKQ F[nJL'4+h6C1E1Cƛ`Fj@<dzAH␗`/&}G'N@v R>Ak; W[NssV6 lNW'8je !cB)'C2*Νcɓ') OQSbe>` }K577oo蟼H>$z Lom>x]ЦAm 3nz)d. IRFtt44RFIrpw8yry'@Eo8[]8˗/"˓7zHq+94wav0Q1:|> QXF]]a4\ѣՃ3?OnAh|]d$"]1q[@> ^Gscoer9xӦAŚ-~:x1ضm3G$!'O KZ#w4V- d䇂X;H=9\.ܭf {H$&Ai Y4I8\+f6N1Eܹ챇RRR;l!߯&@&0+ʋ7Y\ BTlkHi$v&kf@^-R{T JB%K F5,$yCtG扨*M~ڧML@ hؾ L/b<_&`f\6$jJ&)* .@i(2{ B7sق@>s ;>|옄nnnX=* +0d @sUA\(Be )H )ԩSOL9{c5g#LJ @CsM U2Evjt:$-^r&smmQ~TϘUO~{Z;6 }:cRW@=X\_?l޼I*j|em 9#z1 qpy"U|q(+,23)l0fܧ΍P`\n#)c140J`t}kSFRӘO;zOr`::27v))SOyH'SOaoo6YKRNNN,YB7S {|%uIENDB`teeworlds-0.6.2+dfsg/data/countryflags/VC.png0000644000175000017500000000272712140200333020111 0ustar felixfelixPNG  IHDR@IDATxkLUGnܥT41H6*P`YR/TTV?74) H)VR#V(BZƨF1j|Զ&ܻr9wݹBPH Wiii,"Vb Ūd_Ŕ)V~f~nn.Xt&YdT3p)W+)??| Y% sgURh e} $ѯEh\DBh}0h> @=1I`jBH/c-mp1{5p07kg\"G4~% g\"Dm' LpRCřΟ hفrrbܸ n Ο471Er@gbйtm`f f6C:;)uw:37sH`)3Lh9 K Tl>`Q÷}:0S?&O-ů="}F s _f$Њϣzv`<ڞ(@Sm|~̠++L7mx̉mZ%)1#pEqH<8KCO1}wCXЅ)JV ص! oT5CC^ͤȡG ??RQ)uf5 3`L,؏60~䞲IWt Fu]mq>@sEEX!׎ 3c}I껖i?feD}C b3ga׃۾ݫ 1 l~kxđzg]CbhSJ!e^\5H naܴsiq$i`י1 @P}W8\bL0N/o-1,,D0Z|wDQ'3[h2UEuxgxȾ/hu˝-z~ =!]e{ ]ZF @"oh,֕dXSQ͗ LM @9bK3)zg| U/-0_xzXl>vlz;Z JJJh6eUr T"*((`] Hc0IENDB`teeworlds-0.6.2+dfsg/data/countryflags/VE.png0000644000175000017500000000247612140200333020114 0ustar felixfelixPNG  IHDR@IDATx]lU7Bc J݄mwKЀ|h[mw`T@%F4 !RѶQPB-_-PZ[4 mQMKwNI~읹LܹRFRPP D<`PJZldO~~>eeeRXjJh.獌 u);;[.> gD$TY#u$ߜ(ےgZC" *,`5%rQ0x0aQF? [F,@3{1Ns? nO͟@_&ϯ̄ȳk W[ =STtLs>#c;GWhʢ~hñ\gBߑM~цc8FR?ey{iުFzhAZJ w"y[=sp./#V*TYt5p6C?q>ێ}Α1K4}tYqhο҈]7@/K]~,# >>bC,Tuj0WT|`c?Yh{RC }|c &b"T"@ ۴y_j8Î%FBN:<³@1z~Ȗ'?Xx Xo@.Dn%aqvʹT1[ސSYJϨOD#p<m/<r r.%; }g!_0nuh9|~5E"Ϻ,@{$77  X`..[f96yIENDB`teeworlds-0.6.2+dfsg/data/countryflags/VG.png0000644000175000017500000000621312140200333020107 0ustar felixfelixPNG  IHDR@ RIDATxTWFA"łHMl{44QPJBfHQ,$`ģl\EMZ7kCQ7mX 0==3>~985}tIVSqUK^! kڴi&+."jG\u8a|T[ AypsO֥K{^2'I}}zMž>>eR}u8Xn1$z&QlllwǕx<{W aFeQXgmm񨦆^'1q )|/[;vBn]K!߄Sa㏨25ŝѴn3%U #`Ѕر74lڄ_ zh<8tHw{-nWwE\fܮ>fs44p=3/?֭󿄲2_ D!}֎i38s-Y"r^~?/5_. RQ [PӬEfeț7#-'1ff)=QAg>| ( $`Cw7"&?~'fos\pE2``[-4vl:':+e_P_*}VW>AJv.UsD̗iȘf{qcjj2y}zOq~{~Ⱦ)g,+d\q#?gi *ziDt\GGzϧt_.1LƵG ~[4@ah(~O>xxxvBO]8j -yitJQ9ؐEdt^9o!fOPPuT)c?=phO. 1}'1~ao1 p _Ӝ*X#>?mكjssz)ٺ[TaР 1ZȻ h,VaRM{29c-$ߴ?| nKN W>{F#t58vΟI @i.4\bՐ49r^(pFM]DǾ  ~iIߙ'9Ř1bUp[#==SLdy)!`TQ^zzyGxCs˺[Ksŭ]H'iQ[v#z>afY /ZÇ(ZI}?cC C+$6_cyT֋0cjhhDJ\vvM^(o62G&DGgsmPR~acDD.@]]f+#0lIC{O _nBM@]g=S\zT~̄P{6@G-& ,d}L ObͺR444,k zK'e&#`  (83MX\褉Zp ֆ&$7 OIfQ]]yc q-pх`,,`mxMx HTUU^n dwm Q1<#E~DIV/i_'k~n&fm&)?D@m0,?Q~}9v؁sQڵ c0pF{pо"qNm\/LH_8ŪvӀtcؠ;wĶm`gYHOQŇv/\vV.>z[Ae6֬{/& ںz SfI81n;W=&Eq"*1ERC@w:ΉuQ}\|님[ #xum|O>ԕ([PA2 s:Bjj~ax-P Ds=kL zDH-%NX-88AcՕ|KXA {u?EniI(KGUa^|l\YQh,>*o˦0QR98}/\ O9N7fR{s4ō*.~ %I.?MSr`Ȟ ȊTÿˉsRQh.!16I7+8dOikzs!" %9J DxHcP45H-R$KT$)dܗ>aKq`}vW`:W*oB3~ʒcRSP7$Ȓ3VV) Do_X)Sw$XG; IENDB`teeworlds-0.6.2+dfsg/data/countryflags/VI.png0000644000175000017500000001174012140200333020112 0ustar felixfelixPNG  IHDR@IDATx] \TKsryӞ/5ɬfrKC%|.! .° ;> &*枙\g`1^|rϹ{o9߹({XG?GMF5Ua:}trMU=tDg̘8q")T}ӗ_~&MR'@K/_O$7oDyy-QWVV R'@ Q-P.\'@Kw嬨'S~~J7 p )ȗ{beNZS%?}N& FILw.ي?9r8~駟4t#FAQ{(BeYfͪ! \SQg N}JJe]ɉ(Z0~ "{܀=GM1Ξ.Uu*H腟85HPOQ w?4_>yP!Cn켸6RSUB- ?K@+&?Vuy{g9Bz&ǣX=\:D DxZ1$CE !ucDXNg!#f EmFE $$!.]mT*d #PtwsrZ[ōBQjkMRȉYꀜǵk5.uyxof `|tN< ? ***t$'yXtY-R(ᖂCvpN,JCIx$!?y2j9h.4WI"_$CH5GdϚ _?,IQV :EJ!TMeTTnB6Zw\ e'޽ȏY:dIZCBDW3aאUVy3UvCӄi;YG$K~#,(BZAQ*e|z/LyVmpKF(*mye|L凜᩾ע1Bޫ$iQKeߏ~%R rxWiȀ$)A"k:͡*s+aDŇk\Kk.uc5X]A^BY>X޽{_ @"ֈrȥ*O6Mz֖@)縑5H>'x4%4a M9e;P_#@bOiG[TD Q&=ރ'`٪ ("Fٱ2śf`z1BpLW\V] 3"/zHkk:yIuɦ$Rjk/!­pBDKI2bp}`i 3]f9{2= ] >{m)S ѡ~ 3`~G|gOP-Bu OaK*lMӳ}_U}ܼu ALf@|(+T5W"83KM X[8E|{ϕOR\}ṫ*p"nVxk'lȣ7Ν;M/GeaQT2ݓj/{Fũ'*STj]^Q*Kj/pKa\ohv<](RkS~BJ֮\9A+r4<]6-;E^Ex^jUjm񁈔IX鎜骒m .p5Y>Q{cޙhKh({$TO(CA8YtV\|(fɿLEu#6k^>E/XO%ao+-w~p$ (WV233a z@> $HJmqb;%U ¹ر[at\au,p|\G!/es))BQC;=ˆb!oCpE\Kb^LYNeǕquXY/O\=,㍳}kF=lk5ȗBZ:wӛ;Yb9o = yjc_1u!nWn+wo,G \)$۱Al>oV(,Xix|V`͐yǐ}q.mƤL סƶehT?< kh-EWgt{8g?,Ӡ> ^WbH3zn2fxus;taĚ\֟B[~ݼS's[?~8wRVmqTȲQ8;ۉ 4OVX}|\D6-`q!6`.۳>t ' h$e\Hw!7fgg?'u|BVU7w, 7anj kgK,:1ˮ_v4"3H2,Ld o~(JJG_0;ΰ=8q9=N8d-6_oxLvavS\U#Swؠ¥IZAk%tQrjo`Tpt}$NJ轸zY n _${@m>>M_2݃aE}"\@K]vx+lX$tS`nA@<*#f%U5{vcۆ67p%k1dIo#UCw๋CC;-wWEU+"7 l1`h־axx_.|'8q SC? }.zZX:-<5T1YVr*HN84>j Qg ."ybX-No0eeC+UQ2w; mE:$;D JtW$!pX6ÐH❵谈T'b$= Ip9 ne=MY!3I?O3boI^mqߤc`1ơ'HE_p:.*-tP;M`%v 4 olZ5{,^ɓ'Uפ$!w< ''!9~&>n.j }wO TB/_z k~@DG xp }ppyB9-xPo䵑`tԵo}꼳x*ǦdR1)yZ < aCbF^l ?0ڣ⍞M' Jm}$8,=^vT+O;W ݃9NX'ģHa:;aF%ᣗ ¢Gt8%/EǛo r:5 |E _~Iz)pkiwarD!JM#S $qd]n,N9oJin ăv\{Vz \ (e5J`oI(rx1?%n'|q\ o)߶ÇO)dNAx{;a~l 7b\+?%Ǐ,Q }0Xm3m~ LVGt"N@T=rO,'C ێp#/DtȿSUg#\8J.DUЇ{-gCw=@&i+}A"hSvEAy6X<ۃ.a[m'X= ^B\v\R"whrDB6X73pZ>053<Ll¡ 7թv~SL=tH*=ٶ{%[ |}qkvn ikh9@,lm?U|{ i_8ӃO5Bn&PKGN? 2u@q4<)m9`'. snjv|TÏ:H콳`wAVB81A꥖xam@6aφ<(됗o 2#I3A79M |G §GH>B'Nu~4O9>[ikGY?g3?kf55;L#&̔ࣆt1C}ǁwxqTςYOGҝ1-S(JCW7%=(QuITTfN)W(M!m 9xt#;婛sϮ ShRjQr)t\&Ls}[Wjr}M|U]_h%?T{|o:zv_)cr>4l "'ӎo4n".碗EMF;ٱt_xGAIixl?f/2  S;B_̐G?OFpM^~$9 c2~U)>}oI+N@Tz;0F }N4r-CM5ݝ7pBy.jǶ~|r0YC,ڻ^movҿ,vPeYF)o8FhO j4 -K @64 ʑSJ m\ W2ik٠C`l Zʇ-ÕA/S}uxYik/ 7  MزϏ7-ү">R.3Xi B^G=Wn}40 v*Z)%VZh'T3HI (hskWоG4{ps,֥a|k6uQCZh  л8{l$ k}t}p3,Cy8ezAS@+aNAEQA_qcѨ)"ť-V8gH˴&_2!}g;R\\lt6TTT VV! *++B.oZ +it(=zk6üeLxGKlark4|} 0-,O3qx_@hB&gap%F=;.'D7\" Y-YIQd ?cX$I O&@G\ AIx='"hVDo'S'3'q& U&d'L.'L,@C`b`A)qI=0k _8wH)@H =OdHokap . ձٶ7q$Zث_wz]A"3.$sqb;?Ex:%^E ^=9|@cI0M!q`h C &lnHx9S> 1"AxU PK=y(*kI}㵇$A Oޜ|-8ۆQGɗi'[\Ł.}vo{2gS}Gi *7RT;(m;].h]yc!{o܆ % VsG9Τ᧔P)qt2kz4*x ! 8>u!UQy14 ,Z S }q{ZM bIQ0>j:~H9xP bXR/KD‹,_<3`(in_@pǵT 8(//M0xFAQ/ IIENDB`teeworlds-0.6.2+dfsg/data/countryflags/WS.png0000644000175000017500000000230012140200333020115 0ustar felixfelixPNG  IHDR@IDATxYHTaǧV"6 ڰ,&Rs ^}{v(lqƭL#2D(l!HO߹\cgj8s8[͛t#> @'E󓚚 -PD"8N-8(a cRFm#-ŕAQ>}N'xpr( yM/(pt K6\UqsJq#b0 Y;fwtC!-ߡ9,kp>L l1y7^ ^f++b?:J,Y<QG$Ĵ[^KV|''+k^ޠC] o5Ϧ&xZ+v$%V?0jUVϺT;A=O_c{V)@_]t >|{=yxsZSXyDJJOJӿ *'5 c [W?)7c91vJ`V~R -f'iT?{2Vg~dą'H oF(';EGӭ:ˆ蹡`V{"EcnId5\T?"bvim^l4~[h#x~@M {d@`ΚE/lBՊo,&9Z<+]?X@NrC?;kFoih?%]w쟧{=0+ P¿DA "pV:m>53U"Ec]]Q"oJma\bD<H.<|ڹ<[Xǭ?#U.ЕXyfA\#}t {joD9Փ.S3qg(T=Sp/#@ iiiMb0$ N([T_ e7IENDB`teeworlds-0.6.2+dfsg/data/countryflags/XEN.png0000644000175000017500000000162212140200333020224 0ustar felixfelixPNG  IHDR@YIDATxnRApՕ[5;[jbnRH4|xji;3|7@ ̹4"LX,D I6Dd3S_%"$|~D"A&p&W cTh[Sk0d2y|-[loo7dRNq@Z@543 `kk W44+f ~G'''54#o౸zS .Y}QVn_|,.hlfqp+U?L0m|,Ld2p8zϻжa]St?c`O>n 56| N5QhsY֝|pFb/&67/ʱxSPÿ8#h!~bol:wRrf"KnJnGi;}޲7euf F9(d}fyXa/?ʈIwI`Vuy6 sFCgh[;=$ᢻertiS5ssNw0@W˨~\uX ϟ *e:N ; PA,@=gggy9w /}+} ̳pBƜzA{{{W>,0Q3@sLG= R(D&צH15>N6*T g 7&ݩIENDB`teeworlds-0.6.2+dfsg/data/countryflags/XNI.png0000644000175000017500000000424412140200333020233 0ustar felixfelixPNG  IHDR@kIDATx]STU_|fW>R3PQ-s3^cɬͱ1'33G%u]ED"".weucw~3β}&9g9$p`Tvu_j}FGGSdd$$:N?"" J {[^NL% 5Am/P>}M|3ﬡZ3@ P u;j/,4jVUrG lHv8x{RV^rErjtI`|iੱTw"U-]<!7\0C5El%ǀduL>oM9ݏҪ^܀ rRZo$lZoU%|UĎXj2T?}ޛTtl?DF97l!&Ċ;k&P6 t}\fèt'DT ĈXylYLWxTL2ɥ(W|BmR.bbvVYeeK{TV>-C'Sݱ *1ڠFUkkklhՓq+\FJ+fGDx䂚66TUU6ph4pS;Bu@'fB P Ć6*)) \l*!s\F9f ݷ2k}qY5pDMMS"0~9D1hܱ(UBh}0)䊜;gܨ>2^| LmM!G 6 uGbI?/X-r"\ŭo-[e];3.Ȏ`[1 ѐ|."B}7->;rfIw)ƻtcf1]it;.i_~,+bFRQ^^^%.#ZUm|wbp(XVV@4c!˃1)Auu,5tw蓼~cT}#Ģ k7x^}o^3~d}/ܻw^H|. /cm%W,f/sT-KuuuTZZE|.KK.>Z@ rNj`a ģTxtJ N ,DD>Y,Eg-6DX., @xIfxB@+bK\ {ԻUMxG"lhG|X(˅c\Ew$bBlh97W:1t;z} jcbbh֬YTgQQQ`N'4sLMx?5./VIENDB`teeworlds-0.6.2+dfsg/data/countryflags/XSC.png0000644000175000017500000000426112140200333020231 0ustar felixfelixPNG  IHDR@xIDATx] pMW~tcS ZZ-A*qmC]OOOٳ'` ]v(ߣG .)qQ jc͞>}Jnnn"hGP^xR޽{%׮`4l>IP 5j999g?-載wQrEr ];wS'4alUrDr-55U n ZHX"Jux9!7%|ș(;YO SJ /Չcr@.I%%% _خpOP"Eҩ IT ĎX@ ock7 ڶD R31%+.~F+6]7,PP@Zx<[!/B {1܇oR\k@n5%5%n6ҝ,.EFu;,R@LViR5)V>bg7wNĂX AP+ kV":~nĤ2 x*vYxjڼhi} ܋f-?)b.GiԜ@Ҵ >P5yeEB"Z EOVT8_< e8Ϧ1^QVfs66|rEf{-+g @{-çc N&Cբrv-C&!v )__%Pln gՓsh};+bFsm|·es[3/xqxw{FVhӃ"8OUL.0j;Kc mMfI`wo 6u k]ʁ7 yse `Dba)VfeeQzzݻ` :4، >eff j?@PQQegg d޾}ut1eUs 2 ,\Y[CK@E/ yLO~7bbciҼJy/vtH^FR_Z'w?3A+  !M 9/S!X,,oXE`2gނ @&RWZZo|/suv/Djӧ~׻=}nKϡw}>nǯJwoNejhWإl/ɓi'mٲN8AkQcx Ro }AUF {_vfeRo Kyyy+ҥ< ۳nO<SCC:uJ Le ڠOWtt:} 4/RqM"SEҊ[nw!C;|;驈GK%E?=7<{<@kbm;gTDjb]?jh*#ifP᫣L7TzA?1TGh]mp ָNC yc"5F&R |į>J@οa&^.yvM=VE˔fY~ ]$tj9/1 HPvdp_ӮM43{$ U ֨{6(-<Ջ߁YjS.C>c:q`gT/LD-ᇴ3op$8~I?`|W3Fg.(;"xW0 ,sS_ w8 d>h vIG=( ִ!4E%<+OD"Lh "0=Igm ]`5PW>}g67|?1樬f*ga+l9GsGAàJbEa ߏaq7]jS8ZH r*sSO9.KOG\+#iW]CU{䃹mFZ9J#`gcPͣAGCpW *ժUtKjB~Ӝ `` 4ﱂ`Ev`:GBCW@˸\~|{#Bx=3~Bhi3SܡhT%T of©XGpEGFN9Ca=j9siJZRY-E7&}6ݝ==sVLO<~p<; ,t9} rVsΡp&pRZU._,T;oq@]X -*Yu<PKm+WDZϻ;qt$.Wj2M$Վ.[8KEb#(5!{ɾ߶loϩ:=Xp@Zx饗\>㌟r`!"2'G=s1TF LNdlvv6 C~d:AE,g9)N3gؿ}8b Oqh]P O=}wYX? ʳ{&=t:>ݱhT  oa8kDS 4^D5J<{8V8Tr{TV0?aoYdت"KbH-{v4u8=@e\hBA؉~Ec|($ w87p28e}!i*Mk׮SPJ.]4$A  6Jd0qhXܽWЎ~%-S+Gb(vE]S 7uB|s R_?91Ξ=KǎeիWEisP҆팄 :/MXZRS+֒qu~㶪xMrI2Jw4Dftl!yYGcE 2àHD0(Ϝ#,L]h՜*Q.ɳ]&}wh<0Giwk-:vnphǜڻRVgxF.T.$H# Դ~#"Ώ9B# ~Tg܈=h%߯K./ҤŨá Z` [e#Y E7u)cm GtѴυxPc@^x\`u,(VL̲F:u,0/ۗAx<&CDqX1 J1I/t§@ЮI iPԚR3E&آ_nmz^, 4.zIϑcP{齳%4㤒pRI'YhDgtxDQ_O25&$14otﰪ9bPh8+hӷXv/΂5[~F >qU7 ըK$]]xx6){ϋSh̾7S/zp2"@(Zz|Gs9ӹBsh 3 nOb p.k.@YRKr{*z3_E[k-^ |G_(Fz;1~(,c?7k*ÿREzy5$ K$4ȇ@ҒbeB93Vkkb{, \#9]. 47P}|ClEվ{,Rwk{, CG!O+z:s ^ ED7b:ex-Tj])A:(/3`g]i>5k3D3~;aGvXG8@棡>:-a󎱘LQ6ʬ`$+4A+ ˴V魹 %X|:oA{PH MVGEV )KLT2ӟҵYB9`bb/z%4g2}T :# 4>Em\)p/FEc߭cm!#C^KZ@+E,N}j);ĆxU)&1ɧ ,>}]`@JYMl7a__Daq9SZϹ ³(ҢY0'dhw:$ ۝5d҈;$8M6C M(*\,_SojڜB!Ͻ4WmD`B(  &D F)0[R ʇZG҉(nj fQ LRD50PA8eH>1"xp#voVe&a8 )V'`Z3ҶkϠF{!~-RlHΏq} Ye;_? ەV" 413zHu{т렵*=@se] ]|D|)ovv5Ů37[klUP%L {N!e6aɘ_yNy[3E2S/Y/?`N~x7d=p߹"#Y kz/v^rK҉*QA\KIJꆹ\cD8=A66*כ誼n.KT4Np5䊈 rznЭ)Ch ^iY/lS:z/z0yQTk7HBT/n"s6Bis(#hxuc]woںYl3pkZOCsz*NySpdȿ|zg7=y;v,kSu{/**:'z .fDIENDB`teeworlds-0.6.2+dfsg/data/countryflags/YE.png0000644000175000017500000000127312140200333020111 0ustar felixfelixPNG  IHDR@IDATx흹P01( i*-ib4EI"J&H*@bJ"Dd30c#}Ӝ/F 0vIRvPqa}]}8D"B`Xx4u`P0rv~]$gvC8[>@v/ c| ʍ._? S0>L?OuO~Snp{`)L?8~ x)v\%@59ڛwזpT**Yx,rcYתT*QԴZ-[Se8.x$Ly t QS]<pqVj4.,R|Sb$Sd>v}(Rx<֥֥'\r.{4KlTU&e$ȱZYͦ>W t:j9r `#B ]nLLcBXEC,^rygi7)v6* ͞L&.//U:&+aPp(8 CPp(8 CPp+L&U,kSr^!FY0M*x 93ϋIENDB`teeworlds-0.6.2+dfsg/data/countryflags/ZA.png0000644000175000017500000000431712140200333020110 0ustar felixfelixPNG  IHDR@IDATxyTTG-EDh5$hFM!6.[PGqIEQL`@c7\(LAp j7{3sx}>~ofߟ___+4Z0}T*<== 2XjU\.'ȸvdK9m*jk@{5^bH mЌM+yp`|6--W;qQ'F9!pi51 5Ԅ0?@a t]6QStB]~TșK`sG(<?ǪJ4߸G2SC[K>UN߄;n8*R\OYgڙ,+5psf.!~ 6nE aƮ8\I nq!.>΢7J]psc' AU305Fn] Jx:Z)n0`_P#h3ʕV( nDn"GZ[F܊ƻF_/(9WÐ!s5[pm*T4hCV XYuXod  ];a4sϝ[=K'3ޖ @OKOj9`LdB 5&nD8 ]K"= RCN ոc-5R\y l_r45;P/xVY?",D\YX;"5g(!xlY!0z]|Zoy{J'Cqv ?Azu*An~s/{~˅ 9',Ĺܷ>ϨǺ!g3 VG@H}WɄ>`h2/@OsvFM{+ 9a͑&P!B%45I` G_ts=-pmd\˜D/b*9{ o%GK#5<0@}t o^쀪/ecҚ %X#Taxw3n?K)N: F-"0B"mB`od-\ed%0D'd!OM@Yy9sf7=al*8\Y-aDGپ<>K:O/L >/*.EPh*b :tAI+QTr*[j.KЁ|@͢/8s3 `xo\6}J'ݰXga>̼TGcfݔWN;g/"w~r@G":.C;Б\6UW{|ΣCNd~M kS i@+Jx)VBa/ bu;IENDB`teeworlds-0.6.2+dfsg/data/countryflags/ZM.png0000644000175000017500000000237012140200333020121 0ustar felixfelixPNG  IHDR@IDATxoe&r+ v1[Z4@1^ֶmA,(zZBХb$^Ʌ0Jp(\H_@Ox}fgmC|;\~3{ffg+%%%2WA?DQ qJI̧Z,) bT~B􊖗? >'= `A$gSX,Qtnâ3$Uc2{sa V`ﶉA+W~ :].ю}xݲWtODE?h?H>&( :[EVFW#=,Չ^,0E A эa{cv א"lwOC$߹Lt^gcyH4NBFGh Yw *bSџY9.@Q[4)D}#N"HгUI!뫘`z$a `zqvCahQ)"C}Wpy㭸-uYϬg)THi<1D#%}gP6EX>[.Dӏ==| మ:1e@5`Aȱ qTt ~)Zc;| |X}Y`sCq. Lb|E^w1T?8/ lO X O ]<o tj̭ѽΠ>3@OqDI*"y[tP @(P @(0S2 <oW8YFF6̘jĆxMR4|Ծ6t8}}=LәA&=`]Px=@o#ZE࣡^ЋӁ:(]0fCRwz:0HԵs~ t9 DzӋ8ç~`Pk:I?{gƻEX~ x&B\ľO<w'Lm;c Mbԙ> No6 0¢$g(p]!@2z> R?dY> ![9rO&R=60Lp8F2)q3dA  ZQQsTIENDB`teeworlds-0.6.2+dfsg/data/countryflags/ZW.png0000644000175000017500000000402612140200333020133 0ustar felixfelixPNG  IHDR@IDATxyLTWT2̌ZTkL4i"ImҦ vOcҴjkRѪT-+hZQ$ HPaqdqPpN}ٙqɛ| ax{~; w'R֊wGčOND*{^}R5c L2rUQ\\c~tt4;[lA`` F{cLo5Gİ{ޡ^ߛF-37 1{lxP EcV#[ N?ď_D<)TWt;Hxx]o2Hp" ?A@+BHpEֳG/x [eƮ=֑?Bq PK2W怭)6S({sE)6zёf>c1ϵo `Kn5!HqBAДDBbb" ?_$496_ hVSSSH)H lTԠ+jH0j& y=#Gb@ ~fAo\@R+٣rRzۡ}F@d(ʷ6&|(, @ M僃ql=:T徏<%J`M_Z •b^^83(sl>oڊ `gU%0^_odܴG \2@8bq-ub$8y@gg'j6vD zΌzP"̍{Hi'3 r\R0 4CJvb#!@W W/v~Zҷ{ߠq|4TDt7H <k*EsѲy#9ٸ_c x ~ f%_=vdvhUTu{*ڨ{y,nD Ȥ}=Z{# MhHuՠn~j2m' MSC#(`Uv52S2F_+.zzx`k&f66Jܯ;Ũ4dwaʐ&+iGb:#uV[ \&jf`0y 5&RBq.- 6Speg*l>[BYū+cpL (E4w Vg‘w.F >p~#dT ~0zخ MqxRRx)߯`%;d#Dzk3KF'*ə"CTff<1^5UsteO2Mma6w%=Z#Fpn"T4ZUt:[*KH|v1"&k0<`hiiu~>ؤ|M>*[3_I˘OH쑣z" IQm%%%HHH`? G[|o0ie&*ho(q_2Di+# FƉ=_co+6l>Hz͑pRT( rj`"1())i/b_D_΍tiq:v4.fKPeƣQީ<zpZQ[[//}UZڲ2q7QS]-ږ/Yk+ʡ)/m *_~566Z~'o4!˶)ҝ$xt:f͚_ >pi?I4$###D r@E1 ?Z`ON!3@L/=Ec{$5GŎ^gs$-ևEK{ś/I|`zZ YK_]?fUgH0eX|i֋ 3gbڴim*3 O:U2^Ź#JmAoIENDB`teeworlds-0.6.2+dfsg/data/countryflags/default.png0000644000175000017500000000426712140200333021226 0ustar felixfelixPNG  IHDR@sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<4IDATxS[ǿG#tCG,\eŦ5c'4n^&=n!LgڙNv:m:u;mH0Nff&k`a.! ˑEѹ>og~~ L&S"DB!^W E䉊I_ J-j&XTZ~Pv8Ep:fs) @PpDg @V܏Mt:`13Pue<뿃7 ˶@ӁGO@[R Vf m7nmA"{nGo#m'ꪽx[/-5FӡF4j(!J@ GcƄ󯾄fPQvtSn~  c+ zQ4-F{m5~֏a6 G>7{h m>_gt F8yl^Sal@-7.+h!h8KPTWY0B6( Ͽ,v[rNIMO[!4j/g{נzz1=y:ssvwNs;jBg8F)<tiloZO/}PQ~Xb_3'su"YV.Οp8>///\[|q|2 uNB# 45lt!J+Ƃ͜p8Qg A~IbY!q_? rDH^>[g qޮ,պPH^ 0kcYD"dgw 0dۼz~r^h$m&]$/3ٗfĵ奥;1u c&]$/!m(( v}:c~_=o3@(Do6h ѰLkh8T)$]R! e+Fg:gl~ ̚馣9 Z|Hd/OA68099gXNK?{eeس $V`+mZD[xL䧀`@wxo! :@ eLMez @*B]ț{.,+v["y@_^̔K̲\>M+iԒe|wG0r=4"u,]]@2;UCVoԉJ,X l<"Ehi Te7oct~Ab,t]}ǏƏHFsQ*0 X`fYd2+WxM(d%р1486i`C"dPP f&߿qlB"َ6Da~X,m=,qLT ~~BzY,kkp {ÜztN%oyoBm'OިǓnKKK+MjocGYfa6H`xh(9/u*k>$/R$/:XŐ۝kP#x"qS9d3>ߖm y'EQ((W$/ͭ&&&r`:B ͥj?cdx#%4p v4E;ȗp$9`"D%ܼ)mH$H$)h4KKV%t]}_H^pN _S e0L&119`1y_GտxưѠJ.ebQQMaiO&,(G,C,fz-ZX˲oN/_ YA"(NQ;Z .DhxJLGq /NIENDB`teeworlds-0.6.2+dfsg/data/countryflags/index.txt0000644000175000017500000000712112140200333020734 0ustar felixfelix ##### country codes ##### ##### custom ##### default == -1 XEN == 901 XNI == 902 XSC == 903 XWA == 904 #south sudan, non official code# SS == 737 ##### ISO 3166-1 based ##### AF == 4 AX == 248 AL == 8 DZ == 12 AS == 16 AD == 20 AO == 24 AI == 660 #AQ #== 10 AG == 28 AR == 32 AM == 51 AW == 533 AU == 36 AT == 40 AZ == 31 BS == 44 BH == 48 BD == 50 BB == 52 BY == 112 BE == 56 BZ == 84 BJ == 204 BM == 60 BT == 64 BO == 68 #BQ #== 535 BA == 70 BW == 72 #BV #== 74 BR == 76 IO == 86 BN == 96 BG == 100 BF == 854 BI == 108 KH == 116 CM == 120 CA == 124 CV == 132 KY == 136 CF == 140 TD == 148 CL == 152 CN == 156 CX == 162 CC == 166 CO == 170 KM == 174 CG == 178 CD == 180 CK == 184 CR == 188 CI == 384 HR == 191 CU == 192 CW == 531 CY == 196 CZ == 203 DK == 208 DJ == 262 DM == 212 DO == 214 EC == 218 EG == 818 SV == 222 GQ == 226 ER == 232 EE == 233 ET == 231 FK == 238 FO == 234 FJ == 242 FI == 246 FR == 250 GF == 254 PF == 258 TF == 260 GA == 266 GM == 270 GE == 268 DE == 276 GH == 288 GI == 292 GR == 300 GL == 304 GD == 308 GP == 312 GU == 316 GT == 320 GG == 831 GN == 324 GW == 624 GY == 328 HT == 332 #HM #== 334 VA == 336 HN == 340 HK == 344 HU == 348 IS == 352 IN == 356 ID == 360 IR == 364 IQ == 368 IE == 372 IM == 833 IL == 376 IT == 380 JM == 388 JP == 392 JE == 832 JO == 400 KZ == 398 KE == 404 KI == 296 KP == 408 KR == 410 KW == 414 KG == 417 LA == 418 LV == 428 LB == 422 LS == 426 LR == 430 LY == 434 LI == 438 LT == 440 LU == 442 MO == 446 MK == 807 MG == 450 MW == 454 MY == 458 MV == 462 ML == 466 MT == 470 MH == 584 MQ == 474 MR == 478 MU == 480 #YT #== 175 MX == 484 FM == 583 MD == 498 MC == 492 MN == 496 ME == 499 MS == 500 MA == 504 MZ == 508 MM == 104 NA == 516 NR == 520 NP == 524 NL == 528 NC == 540 NZ == 554 NI == 558 NE == 562 NG == 566 NU == 570 NF == 574 MP == 580 NO == 578 OM == 512 PK == 586 PW == 585 #PS #== 275 PA == 591 PG == 598 PY == 600 PE == 604 PH == 608 PN == 612 PL == 616 PT == 620 PR == 630 QA == 634 RE == 638 RO == 642 RU == 643 RW == 646 BL == 652 SH == 654 KN == 659 LC == 662 MF == 663 PM == 666 VC == 670 WS == 882 SM == 674 ST == 678 SA == 682 SN == 686 RS == 688 SC == 690 SL == 694 SG == 702 SX == 534 SK == 703 SI == 705 SB == 90 SO == 706 ZA == 710 GS == 239 ES == 724 LK == 144 SD == 736 SR == 740 #SJ #== 744 SZ == 748 SE == 752 CH == 756 SY == 760 TW == 158 TJ == 762 TZ == 834 TH == 764 TL == 626 TG == 768 TK == 772 TO == 776 TT == 780 TN == 788 TR == 792 TM == 795 TC == 796 TV == 798 UG == 800 UA == 804 AE == 784 GB == 826 US == 840 #UM #== 581 UY == 858 UZ == 860 VU == 548 VE == 862 VN == 704 VG == 92 VI == 850 WF == 876 EH == 732 YE == 887 ZM == 894 ZW == 716 teeworlds-0.6.2+dfsg/data/debug_font.png0000644000175000017500000001143412140200333017170 0ustar felixfelixPNG  IHDR\rf pHYsHHFk>bKGDIDATx۲:C?yIw ]d`:}x~j:w}z 9XF i h' %ZN4|hon%7k NqHC R霮{ :)MJtE¥1,pq hgwȞJ/ @Z@V~#LCo| IOC|w|_)Hp:oz{X!4lHh `?2hC']i{0|bA߼?r&X%䞮Jka졮tr(!;J1lD@V1e7<߈Cip!LfRB !9 p r0iXG@2rθT6y8~ m6Lʧ|Xb o-H_t{ ZPwN-n?E7?C4'*JO=?K;a.цW}_7nQߍߐ$p}q^I' `,gWA[]h\)y WWf߾A$zC(;k6 dNr[֚CݻP2'w5&-S2J ᜉƢWkT+z$D&▖ȢSH̒+F7 >e lw7D).:AX<Ἥ Ģ $MR:O(!\1 D*=Y6! xB.^}#l`FKk Mϡn3n'5+t׀lMf,\q@L١(Κ| ^u-pG]BUut̿ YPzoÎxw&ciIx1XiOB>n7+p$sQ#!|~!~?~C[uUtΚ)>_\91h&5SN'"E5 W7ڳ@[q*.P*|Lmn{0F|f %\ pD5o>5Z^hlB>>hГ/ VbEph'⦷j.txFo>pw*P Ԟq&VU'>x\'r]z|7$/Sn=Cked2$;y bwQ`38EMĐNGk`(Y=SХK7ͻ(6ZZ]^Xn23j)ln9h';kwUśs&: DƿLq"Ae;x=5ttUw$,0~V,οՉiO+-|`0pL)`!X, p0`@ $圀q<*5Z׉'G[}%~zp'h 6h0”Pҁ8Cw%?XBm"k"R$j<ߙjOU5 !]pkt6*2t(T=1 @!_͉PZ2Ub0M'Z#!V^aEs{ȣ!6:,Z%|9wS ckw4+Ie̩W'ټ̆|;L}Ȓ0@Yg9M0AЪ;?;k,zגW6nq ~Vw:{My∪;jPĻPGw][ng i_AOutg@nq Ж?[4^ =,pDO D!0~v25)%㈄+qLfj%&@9[1BIyh! 'w@@]\ `S'ܮ5&hw-wjڛ ;Qb&Ñh/&׿coHVty3xUڔ @2y үPƜzuzj24ֿ@!~򱟺߭LYox+8vG%VD۹" 6&t`1")?C~:G`zq gSEA*lt O{nMV8EJ'4(3wb P2$2@{-Olj(p2I ϗrJ$,= -o>#*Bه9>w K(o[0d(Gwf"t .cC;JIJJMr|*kq`#JE [Ae!y'0ëgf3E ֞|+bI'ړ;tSc }s%r5@(2@Iyo&8N) ,S|K UJ,1n2Ny0t[nQO.LlL۩cNז͇2LC`|l9 }knAzt @=Ry؎B6a% Á&sx`$) b"y+Xɚ~tP|t~wL&Pg5Ik@` o$I_H k: Qlǟ @}NPCoN]yѷ!R{{uw'#{қLՄW' \,M1sae#/-Ko *P"E#j뽻D_6TE)=X4 `!8jBY0Os?"{#iU_ &p:I^%F$UTǝˆ6T^zGE(-BgF'oHޣ#[zO^ @lS{cH5<|=wЎ|P:;m{PO )K8j}G•P's- ce/!7VD^{Zڣo*p9 a[30DftNf~D3Wf?+:>.@ *|^@.9-{l9y `XB!'<˻&'5 ѽ OwwGӝ$_g\2Bqr>jcpp><\-cWCdEp/l24E:_qM {*tk:;W,,_P\GM)p|{vU\ Jrm׃kZqGOOW`p4C%&! 0ƞ,j\xGzRz V3k2Ty#QwC lLB6RYX}~~>*oqj7||1ے q=z9@<%FQ)î8D^6Ss|*=a~!K;_%y磗O4_0Ck6fɆ3uE^'Pd@j1xui/8\ IN-3@ N($8:W:YWIVMU/e[Pe0']TS)鵡'[_U̻;~׀B$w'yXBt L!F P⭻IENDB`teeworlds-0.6.2+dfsg/data/demo_buttons.png0000644000175000017500000000115012140200333017550 0ustar felixfelixPNG  IHDR ssRGBbKGDC pHYs  tIME'HԺIDATx=NQ%JV@;q n҄Ί•NL܇J3y?{oΗL{|CB!B!Bt ~loRjHHkbV$'*`WȘ@ҺטԼ:0 XGsIN\{wU'<ý'9ut[#N!yGr$ 8rsk2]ωAoH.Kx\7D9a1 J }qf֥.~Go!+g9/_n|>Zv]&I$&'d^ B*4˥Rft,[d2N&|>\.ONN&fI&~>v]Vf~Xlb3L2Nv߯VD"Q(l*Z.n,(|E .D"x2n"m6El6[.>~bQx<~tt4NOOl6[Vz}٤xmx< jaXfv{ݖJJfrl6ozdv/>uEDvX,LrL&m6^6HݮT*ney!b xO&T*R~?}:>ժhF#}2DQh4&|>/ˉDb4xG4Q*T%"y>oT*QpbQtEQRAЗ%Q,x%f׫*cD&>áT*=;IjA> }n,ܑT*$jEvՄ%QMd2l2L\FBA3TɮV::Zm2,\<6l`0ET ~X ^Lf>/ယe2l6[*gīaR)ddv; +vłOFV6l6KӋb<t:bbo\.W(fHRxZ\.mZm6ziDQN-$:::/Qu"LbQa8z>::NN'Ljw:Nl.z|_f9өT*e2d2T*www6k±hiXľ*6`X͆T 裏#áJN;frdxMQX\DXl8l6\.u(1|kn'B,xB#v\pj|<#.'JE֒R,bH %( p9ldz,׏1#z-$F}9w #DNrxP'bnxͰXJd3ځ;qz;J dXp H%J22 zlX,>{ji.Bd2)BN: RN?VrYa#cy`ab.b '?L&zz~qq1cp*P؇ s≠ͦ@Fx/V+E ~)X^j5^3*ч`Qk\1gm0("K-k("w`0`jZ^n _Cv-tz8V*$"| uR!vq$6 PBNo2` :dT*a_P^osE*CqG`8UbT&3GQ$rr|>O܃%I"m#fA$Cr\.4#TrfdY"Xg@jEQl6 Єv ]b?ˑ6p+\mes5JI9,cCr)xE$SAfq ̳"|t:f\! hiXǜ AXsFKԂ:y9HEPNz.˝Ngݢop4zN{7Dměfj5Q ؏DQ4@ KrY()YT^~7bq@8Oq?kZ'|f!'C =ry2$IBZv^:>>F067 6:8\L/B" mv|< .q  @ѣGV2 mn.Nl6˛5ZZ> ¡FqbX**$ C: cҏ :"DJ6CP(\tRE2P* z&u6L&@NsZ Dފb^(6>8"#db8F߽\.Gtrn+@:{}EXyD¤&#KLS 45&tYfNP(`Ey%I/+GԼ| E$B& ..b26)x*(*ʿ/ p!cY.kCáo \r/;f"&^kaKHf bԈ풙^#8k $T drZ}d,!( ƍFƖL,ČS?999ϰjX>WU-wEmQV+elFc.k VJhXL&V<hA13J hY)>&$v s3ggg~4CED BXD :NX荢H$)&,sY!.Ih:OQv$?B #d8mHJ:N& j2f@. ²wlXEQNZ1LT*/|N8 dwh4fXtXA˜Rc!Uq`+OuBk)Np݂uIJ" D"/_ǸZjV,rxh\^^9l b)fh4R?/d|/ICt4 aøl=b8{Eٌ+ v8tOUT*Y|E!"{, f5 ct $6Voͳ4["C]<zGGGggg5M=OarB|>dPL v: DpX,mV$@iQ_8I> ́P]Ņj5STy<e/0h^VQz J^'ؔ RAS' d"/ ;Xwd;NZ% AfC)^zXGH?Wy*+FQHL mS|qu],pjASœn6D`( &sV!\"`jQT* k!d7$+ nP~nNv"xq'J%"Xz7L&O<1 FE3 uċrŋL&srrDp^xLXrN=`>p\Olj1Lʣ#1nGE.*£gWLSW赺n3K`Fs.6m,X(Q?maPK+>QJ%>[F 30/y(1dB(p,JzJo1qpel6' teאX L"OOOOIP8ʋÁl|>I~<xMeJǷ"L5\sXߖczN+|>πJX}ӲZQ*lje̫'Ni;T(zy0Y&NӧYHZx7yXh|f ēט,<WH"^O2 C$f$4t\b0K,dsDbqz=2Wit:w#R6(&!(M$ IH*zeEoz~~!1Р7D>@o6H kZ\d2QZ-n:z%0DDX .Qb@ .ZJ_OvA _*Iq<yh-P[9 cq`#. " gM?⫭V+3PB&.]1ʘsl%)dx:Z-cP.lKD刾NNN4[(T*w(e|>?χáLR0'K }+_-Mq%Ҁ[F5*l&kh%PAir2O dhulA!Q\.sx<~%91L *hNH +ty\±Q adsBH1($#a Ї~LT*[`8xTr<zBprr<-eRD`n!sAX+*'OBMZl6~_YhfPj%w{5>|>҃fdkYٖI"l 4dXVb#l+A="Z At:d2dnwP(p"&s> e (XP,p@Z$ I0ab /RT1;t6fE 8@kr^\6ʅƂWsA!#OkS_2!r[5e*aG͍l؂+XVlТs+(0ڈ˶hoϯ^`X,(V*L,;d|iBEKB"6>axxebCZQ@R,üXV wAr K=::39==M$d2I[:'-V"$6}pFb(zp‰D"hBʲG\)DMb8::J̀~C l) ێ{p i&Hb~s-4?1 ~yG4R$? F>5y$v ?0@n1x_.0Z-3jl+"%TpA2|43o[zD#\rl6T*b24?7 0"׽\ A (+b6$;NhVBF+VX-]LҹPnY$ -֏C3*˚U'ɽH521YsrgVpTE(8Fs il"]P :$@.?z`eZ3, |`]qR" uourz=,%hZIf_਑L~f^/zs:R$rXI2Nx!Zb|mVPtZ,>}T(GC 4ñeYƂMp | -JJЅNQJ Xw$= 萭kXT*| G|`UUX.Dqhi&j)YB=ZÍFÞFj VENlm&p<sb0UɤQxAYrL (6EO2+L&i14ȸbNB !{D/R@B#eQkoBՙ 65MFQ3""nKDC,zNjXٳgPyq):gNtXAZt+.rFHDlO‰Azb8ފlc=eP>qm4ly"\.cD0kFDe8kjAS"VY蝺 n8RiXP-1)CW&\.GܒL& \:!QkZ ~"pt: 3P, i>0"1X(~kPpXjzޗ'NSMo7l6/^t!L< ZrVKdպatf`ǗQ (RfhTypH"L,2g 퐽(:p4qi-YGa0x̱B G>,aUK_$ky+NIb $^yS~ rP)$gZPsEH5.jySRpx!0>fCɜ,&ord`JJox$rxE "rql!IQCS%/ @=0d.c>(ɞ@(a8)xل l6e,{ D4zr]<@DdfgO8z1nK^:υ:$ ;L̀"= ȁ_ī ʕNJƸ8VqWUɓ'rIEAZ 1ϟ?N0$L k_JBŨu6,Z*gSlD( $pj6Vm,s'?l2 \F{\?pq||< p Hx24MIi#𳭏Zkl=BxH^B d|eNis1t(XOB.$iDFpRC痗VVa.Rx#Bׯ_Si''(&OV][%RCQQ:%a$ԕu s-Cn= ,- ;m&Ă8ӚsG +N( W&wvZX1 98g(Za,`Ӱ kMBDP|p"tDFE%'''ͷʽQPɓ'x2L&qùht:lRs LOC= K2$Y51%LVU]SoyOnF{:l+XY` `u"!牕r!{+g Ŧ+NRT۽,x8HG;;4;ǒKc8vt(X8:y6 H% zCb׫>e_]]e2` 9u<9~3OOOmxahB]a MP(ڇIJ4SH:LxpE )\4w4FQVPfBS 9)#N!pOOOF6$stlv:x\T3#uHCsOrW9U>ve8+NZ|xH5Ƹ:׈ȐL<(})FT{+,a3 H}7jt@O>LjbV3cbw}!։D˗8jj/DmKT..t Ővk4"K(ؑ4:0 % p">j9@A!ɇ^bthءb ]ңpl6lG"pa{.@ە /V6kKytr ȜN}%5D,Gv#r:z!?gZq$vcA^|j5S 7#%p$nˀ!L+,E%P' xD-Q#H^CC@$l$ oGЂ򄲩v{Zs~g/Td~cjR&jR>cb OK ˗%f<F͖2\,͉k-2I$zjV_GJPڥ>-)OD %Îp ajџٟuό-[$`>Q.?~,BQVkqpj" i4 Go!x49:v~f(t yh'h JZ]NRѹlDu^Q2]`)P-1G>oa۔/:PAz- ;|8x< \mKPW4e]Xky(! kW `+Ej {t{{Ȁ>}t00ITI2\__?| SrhU^.zVр@>M6TqLƹ %DN#:yke"Or;#+p0&4,h4z!XT={V.)|sЩ4S7h6Rn<j`}d!'!;R(FUMoJ8@H&vU6-Or0D0v^h& GX "!r"׿RX/}=9JJˆá.Κh-t姹d*˖B^Ii*l0u2?NG.dO [Tg}SdXu/_Y ` +Fj DQniG8"F#$'o+vb t`2B^8԰xBs{`kPffW(%1A)ΜKsbx#W@t\/ȁ(锝G`VDg>#Gkm×Ish^aSAH"%*];s) {XmKF$U{W4YpiE΍F/azׯ_(J=zF5p8jl`53l"DVDRKL<D41$ps$3L-B P)q\d{,6z~vvz|IE?Z'X85tɕK * p0@ 9i>s:* ќ ״]aDq $*!;1RM6sD.+lp³xp!s~0*hv/_bul]u-CJT*tN/..6M݆/B|0qx$ l8(I[ɦI-| ,oE o-E=m^=P\._z\C9>>fj4AƩя~XA탉}ſۿ}!}9х"JEXm}0pQd[v!z!P(yc Bf0ڭV fd~v.t'.x<&-J-)4@190p:L.gs(-#7aa8[)C2oh$H$www[Hdd,FM3rIZ iDVbRx|zzK0zU.Vz+RlQ5踿npEa`whg8^>9s΁ ^j1tMd3́u|h4j<*K0Z$_Q(NńJt ^@ mxzj0EQfcC0K{%q.όti c()b,I㮮3"- www@:fV&K*-L!aaؙsRruvlg)QWYq{-B)AqC[oYRc7Y/[ШЂB)qIĆܼgƐ lv'2C R0"Lʊ$*( '̐H&rsSBCn3y*0&wHF@&? Bl~뭷u{{AtE+pYX"P1LҤl6[8(@IFN'8O@ T&jC9iBL@pw"{VC]X#F`>who~"(1mM+_ wk I6|3EC2}R7V>Q-{@QZ7$xp1͖N&\|acg@τ@52J5[\.t\ʡ)+zéxW{m݅|2#[twN^w]x#;͛.4B%|5X-F6:kR0˿iK"! x&Q\jπ [@O=pljxe]*[nAsl4@b~&Ϩ`䚔lC]LƦ-ωsI|;AkقTJi,׎:Հi" 4C&e<,, גؒ!i3wv59a^PbNC CF>}Ƿ )g$%k7Ff¹fbjpGtQ'\h\d /N7SH'IİÛrKPj". exd} }A )b][.]lY.NTBznnn&8d'3f38Jڶ{#ob ug$Ƀ<q,;nL&kL0"fV$ {Z:n-$bTN !xw!6†`c4޶r Kn|p2=rjzBC& ?Xwl(p5|葝B2"TEbpכN_Wwwwgu|| o?f=H0qe[H&ȁlk^Zŷ8FdvWѬ@&"$3B{3ϰ?1.n9eĄ3:G =L~m4FjNbS]PJĂt2df udR a ;ZN9="KrQ 8JbmѡȜ?cV>~dcq3h)Gnrl6jl6KKFd '68@(D{׍Zn{z/6TQ#\jА> ;tz$p#!7$ 6sGAJ˄!;Wa$rh4zzX,?^z-bTJلjp?P0b͡Xb^O>RX ;BֱŇ| <\FkbЎd{BtC^d̒(.܉ `xQ` [EۿMR|^anAHE!n6øVL /YR@5"PRWUs;iZ9qנsyW!&Nv{޳gI-yEلD$ n3#( »]5.f+l1cۊ.C!2 剡2b9AxF wY\-8ӧOI1c%F|:.HL> 7  vJ\N[MiɝS`R,)Cr@E s[H9O,~vnw:EG zFY]6ylR샊'0* O@514yQKP2pad Gd\^QB#sSP18T٬j~ӻ!q,N IJQE;]’I+[:u/B`L<w{F*+ dsG)j%W=:P'vnR/!3J.u(z^\.@yXf)M0ȃX>\8X̰5H҉0]`F54*±4a{}b a(c'a踝l6[V?ωe(9Cf p7p~ $O-p213k{O>4u8p)Il6 w_T1)z'@Fr*4PK|Ǧi[lp'MxsFhlBP>%,[d jJC 8y}WkXgc@p5'<>w"mV7ɽt{}/E1] 7BRRV[Xyξ3)2CιRSZzU:>??nᗾ%>څNӒMƂu]\KaSrV&;%2U* /?%__l0|x6c8x`0\ jEַ@4:,i|ڷi"y2Z*,٦ذX`Y'.wJuS6У#vlqu01 ts#C( [[AI.E\z%EⓓFA~zzJ\L&h4fׯFz)ٸxjFxh)Nlw"C\W N#BYGtmeG;8\(_v$bB)nNX'ys2B. C{qck–"BXss@.x <9 417tP Ʌ`O:L)GWF`dtl1CΠxaHiORcݻ ڑǁ:m3}..Z-bQK:F~ ՖeIV6#TuXb QO>u!Ts"0x3>]hXs0iV,EXLWޕ^n(W|1 glI0IK\ChAߝ HJGc"(!(1G0c)ZLA^Nj%B[5Bv2c7ݷԞam ;P e -bޛYmWCeIku4o=^: Gp7M|["͒*ttxfS˴W'(Շ\B Gis(^W˽~8\- n閮rY,+EaǓcFÕ'ੁD"dc"QSā" BB VѺ9t/hճl2cY^fZ?Cben 81pؔ~}}->(.WcGtp&)D"\"vYyr9$g>nCB"p]\x,J"BJvinTLS c#-`FL/"H\9;F I'Moza g\ųፑR;򚟧K a%rvdY#&O2cJ:ig ;HWC,k4L&t>9it҅ZXMv7ڄ7Hp_sZ]8i~"&{ǽ)6GU*ׯ_?\(S͇=UTȞ V"VEƑtQGj5jSy|r۝Y!9>%³F#/FxN!FtȜ3rbZ .!4Q)*JFϟ? ?vkH|]G%TIӁᨪ#(cO_S-x)t˷a'cX-&@S ={yT*޵p;Jp$& K|q^ I[j}[W! MhVjn k^^ffV {uuEQ^g&-]LmՐ\v])vhræsY؝V`(mB@p!~@*Lq?L= ӂ0 {d]7P@Ð:5 ˖h8SѫKfŵaR %,Xg!֖xyllVjWka9-n{hXI$@NР՟21qCѦu*yfxV":zKslf`}07to"BU?+q4l6+A)yx&K~PK[59CG\ bF!2i'tّ X6 "0s hNw㐛>pPrCe ,]eK@(l3Fvt^ 2@2nJC* ̄bѽIv~a&|P 4a[I!7M]p?>|x{{+$*N2S.X~ d')2Hko56CL s8I4] j J}kGHg;b XP؄@/eDIQxb4@0sZ]E:V l 1B&SˎȢS,)pvjR0bwfGRGC2+!\=ReJ!{#-HDsmtg^ӎl]ݟ;0 oI#+p*7Gsl oMtVj'8IR4LhN0ڲÓ@2@ dR!l1b4V$A2/ƅv\Y7zjn{sss~~sQAժBZ7r-2O@+ZIzȋ ["f,O~X:, "Y;==mMNC'q hachMfcɵ-h]u0T^Wa% ;j\AY `2xEp,l)&:x5u_mMlu5 F\jl\.-A#&!i׋0G 9=vpk҄uxWpަ`hFd, OCVSiB%dl$BP] kx!XKv36._2x̓p+l #mkgï< I P؊s8}ov0KѤh[,4r@ÇaPuX>UXq ۤM NWwYQ)tVj(Q+g1^ A k9`<M 7ca<B{|]҃"4dzH{,Ne7B#nX*5i-K"uXdضyv\$`xA)CMo!(%q(9{Nv{<Cnr|K_'"LG&X'srrMd2OONN3|cIv/k̠F\"σ=;LVvߛ= do|߆+KABxj%P$\EN4@Iw2vd)s,yJVȥ@;pI(rLXQDV#-; 7q岎sN"i<XJOm\P'zߧ[*h=MRW!#W]m,>h0:ɴZp?tpnchQ 0a>OAF.$ %qp$Ic}F)мp8 ĭIc}dnCn `6Mk;.b-ppo"aI6!FN#, r$T MH^8)d\'"vr ܁B6 !g~)R`О$~#$vdu_i  vBxn'IrNe !y5@ B،"ރ~կ~Ak`It:8`!햑on!Ay^ F&;1"uh^O:EIVI9[ cF,Ōa)<BN2W3 Hoo/Ȅhp om:v6*EꝹ~xAz!8 E#6[]o@L 2=q$RYd̐۵(6Le Tϟ??99G l^\Dxk)7oDM dHe,5 ذǮ:oy䈷 (KF!"t2+(QӲ L@@) ^gºqR DDC8UfϟR@VAw6 bX6[9*J'0)q!qH"E%GQ LB덒k|5[)VkirEI:ս YwzCь4l7rt.bJL+. }H#+lq\kLL uu(0+es:)W`^!L-k/ĠsGyS}WX;jyT̛4#} -T%m>YKKR{ tG&2HSʔJ,[V"[Q(L2И"_Z$ꅊVpZ-<OF[&!Rrmcv,Kvځ e%y #M`Da;qn{s^: 5$ d86'#_q(wׅHjl!?zwwwJ6ю<A7L )x#(Sj5 0"VQeF8>\Ǔ`2Dǥ鋋 2W|ikC*) d8X*#nhsU8Ə @]i%L욆'JNeq4L0PV?|>_(0\q6*zt:ApZqe'4J2x}WM`tyi6+b͞LBvēa_1(>gn93%hlv ZTv|e(7gs5cX^߃|aq/"ޞ7D"GGQ!Rޱ_DzroKnIDuqbֱ,w(]A9s\,O:P'J%R;VNHޟTVG]W,I\c8Y pG"X 27ltr-uJkjĉh0#J7K~ɘW rĊE\;pāHM33_"9nŤݛ@b8p/)J3&Z6Z+ay+q|<;99s's]RX GPjhCE4?lfEVU{T4!j qp*.-J67xK2p6V $R]4*2"BTlpGF7Dhݒ~Po+ۄoraÎ\$cjs4z&D5Tb0ƚp( z 8 'R,IH@0nn}Q?vy)PPV=]r8L vwNa ;JA2Zz غ54+5_~=$ D\[r0갆d.j˗, m~8}Ht0fK'] y? /湱ceR*$I2%Y"D;M0RLpEe?~O&P0{gdT.IOI$\}Ǔ[ r6\3(.tN)C+ % ZYm6ϟ?g|8/6!Jfqxd2Tĩ~Y#!(asȎb?:MǐJ09tQ(nHN>(yE*Vi!Wыhõ㛛˙-{|MH >]P'<,ˆWE*eG!j+p c؜`ojO`yqqX,(ԏX70#V&w$;V9XܐTrr|BܹH97󋋋~ %jh(ݬF׮mihÆQ{N"L&O~la2ӝH.a#( ``ѹ3.WtO )$()"$P*މ8 OsG9Q_eu@¬N9|/)CP(y)oO3e@6 D] BB{!Bv\y"쯟^-:{{xqTn7ۮ)ڠ@bw7x'O>)^r4::sP0֜X lI}7atT5[a1 LSWVV-lss+ ?n 4d%,*-//H0{"ƍTjrpɉ{dd) y;WR Yʕ{1ger…tp(i)P2ksF.(bTVղ:к>&~!?0?NŖ7lwmKaHl]d|3Cbeoe3$KXa\$L;VcC1D53*nKf!"Ee󛛛P%#ć, `?'W`5R}SD-N/^0[@n28IQTg95qUGAݜ1k&_299Ҍɇ~fw=9,"(S]D[+yTRWuC5Q:ˁGYf!ZDZ(v»S@9"%iX?NaF;Q +>[:=7~7ˍ &ƊbBM#vۓDWm';#L6 ^aTRtF>:ٲ&O­p㘢|ؾRiZ>"l񛅎4vr긟r c$* &;IE8:^ǏKKKK.O!"9b[ѣ٨wV9yѣGClvnnh$ %#Z}-] Yju:N֚PX+L*C0ӮJq]9qB:޿%1|Gv7=xВژuҙd#5=jr[c(jr䌽G.8vỄ "xNrDIPK~`L8 877gnT􊊣 [6[QۓlT.m%lj-NQwĿT’ƈTXIaʅGGGGYgDg5KT2X|qbZ8_pYqfnl2 VUxlS BK[2]N%q0#؉%<-hQmFޞ4N(XTmP_~ݼ:0~FH0wDwkqBH"SbWp$s>ޑ #}dF$:&D~g[[[ ?~A[;Rrs:B]]NrFsMOoxuׯ_$35QWSU`C PIwJ` US'[Xɨx p0 ШT(5_6A?ɉӣ\DTQCb y1qc!CcZFg3ǎRQєG5u%'|U UfxTI2I jpC!y׿Kp"v0W06k\ 2EhyƆ1b3O?4L&yqŗ2q6 E&ԑR/R5戳O[nݻw%x1ׯ'1NClg`3Z2Ap>D/S0Plwh C )g*kb 2ۋ{ w|| %L5,]ZZd1g:cDJ,F;1"_ &?;"Q,#f?~T-e*CpglL]?Tik;w3@ {q YsXVr8T<6XbgqU!4Nx$@jLg6ZA@v6֚hKN?y.ơ_|/a1T cOHP]zߘp˘Le6v!b/Ыj~㍬DĦ$;íeo~F.F[7%'OJF3 =lX%s,G6Jz$'6NH}6jH]\BF_PЕ4ם Q uB󌔘] [ ӱiGl[/'ëQf1 r8Nҍ;;;/D@. aDÅ6fsOA)Ilz}u)B%OvMg rJ: wlTyy-ڈisA%aM`&ʋZdR>JvmcQBfTx|GDsQ^m^׌(61U:AU5&8@T]b)֋P|ۉ~a l\Ft !`ћ7Ժ#ܜ&,{QKɓ'~,}SU[9x=ַ 8>@C3V*mD~Hǥ5WҌ=Zk׾T*K'.\W_s/߁1I9ٳ/_eG()mTKx8moo{bggL'rS L t:7|Z$1=Hc͛7X Dv]h}!e %ussf"ʥ @ \<77C;Ӱuo1̞?.6BAc[syrI;u ceP<1]nZ0h)U0|)ud-lx,"xΎAA\ W^+|Ll9>Gcz"GHLuǓ>qF;7u[:q9HՁsFNjk"E"0ړH)jBgmeY8! P3Zt!"Ng F:+*&6ZA6.>:K----}(ܜo9kllp=Riؗ~LWb7cZWbBh'5f)8{UEl5^q1ϟ?܇D:|\ 4Gkz(=rJ;TH*,v]qri]zpȝBbA +㐈]1+!94:p: 5ݞ9;t,VZiIM.GPDe}2S40j*di;[[si !cZV1âD"a.a%1pIq\d[w,x/_^[[#9I@y1"iol Y1~hLVs8RIL|}XiO "XB3u||L0&Il0.t;PMN"}MvΖz|A8GI5Ɣ>zzzoU&[Ԩ5X+c)PtsF,B!ɼp"_=;;}P@ Y$Y4:1ȴ\ޑĤ_fb *xF| T_28LN%NlE1=mPMuõ@DGLwLxw뗘 gݚ8l6/yjrQPY2Xq;[EnR@W}`X@ʧ=íd;46ŋo+k5fydCu{#"lr>NQLd}}d:ecZkgUjUˑ*ԥPD)jzj\>G! [XSȵ~7OX-N'NA.˄h7hT S;ij3TIawwd Y]]0ڒn '888X]]˙/}bDY. BZ"b1%Ru@-or5Ԓs %éץR5_f-d;F>&+>,hdooiv]2cUkA֪S&Qѥj0=lY#VZK5&CX%1Ie١Ī1j1Nt@ .2N?^__Rj.Ϟ=# _AiҞ,TuΖ57YGTJǏZ4$ O0A2HS.mVl㺵8atuぇzk"T,̥|Oֽ-cIڬEF!Oᄏ=~m|qOb_8cN КE"4d"ܫ+T;p:ӧO!!_Ռ|sc3lyɍ7QPƈ+16/^)NlP^f<@˿#xkלv*g~sPIs/_ߟF?+2@֦7:ak@rn +Ou+̤LHK瞙_KpGv+8ĥ;Ǒ2+_!dShss!fc{7͛,ݵ@rAFT,kXAI ͡OdG$ %=1YqF4_1d0taaٶsEVF鱍Dt_h S(m/)o&$}>(ZWj|P-nu0ՓW% R$f YJ @o_n)>_α.#ˈt?|g^C[v=XHB d:Mm?ۭU0VaQ82zBRfv4ESxj6m eHY嫱({gg}@H{C n`p᯼o(y`i_}yHٳ3R*Bj Npf 4W$yt:~w/K BEuɍ3J&8dLӄtu(MQʜݺ ìEĨ[q F \ Gx)gxQȶ$Vx{{͛'''=ZYY$1/Wfz:)OPXZZ%)08<<4EP']1 ^[`cA8ٖƩ;YQدKl;ΥWoUOX8X՛"7Z.Htd;|zM 1RJDEnEFQtjhOEWd9uD3Q\/cQԁ6mWl|d qAbB ?sngnݺu\=#$nPzcWJ2AI)08< NM%Nbkkkl:1a*=q|fԺ{- lԧVWWT1>!;(I+>Oa.ҦFLG?֚>aҤ.@ԑmޞiPn~im ϖ0TD!J .W^ގe0RaN)-K>vt:MFaY#vIP;RsBt:}A;;;kkk'''D3@%QXh8=R@bUk3NuG4`KZz9t1;%777JlЅ-'lk_'7O3yOvG~_L}ɥ0nT.|CHpETLu:`ARv>8===<< N) F? }Zkʞ-B+redDJڵky#cOVsK Dќ5q/sQ%fqqQې^螋Y&n9NGGG??+85Rl;2J5@ֲ80yɹ{J@gIz8?~ŁH㯾jiiIDT5{;==eGIZ$塓(S('G)qvEJVw+@ Z \PhԤyG``uĮ"&F@E>=uM> ΋LVK]~R b߇O ]ׄP-$ʫI+ī䖿"@ &@a݂ďjp֖}ysG~g-, o}\>wͧO~/_v30 7[r wNիW_kcl֋p3V&@7*,^`hL<(;I3xk-X`tEN"Qɔ7Ns)g%^I(7yPgD$cif2ʕ+{{{T%BIksnIHtօ=`O2)+8F(4z"^~@8rɯ0蛳hv/y5%b9CR2ax(k0ֶ7]rewwҥKׯ_^ q={Ldo7gϞmoo/..Vy>~Q0Q(Txve [[[Uhpȅ "c=r-I ֑"bDyꯒ0Q(ucoxFP,Rt#QW:>ܟ$]*A#j^<|se[1 _IBu8vԱrq+H*.4i2o޼:N56eZ+++KKK|K޽_z O*x`-Wbt#%DWɕ *R'^08**Xx#!ml^vjcc<%8k̨%R=SzwwwyyH5Q%İ0N);l^WCyS- TǶ&!Xq<99ߟv횺l cO&m>^ZZٱ iUXÇ+MPF?bQ~+^C +++=8iq\tiuuU5헿%nK;4C I*8% Ze$;:p o(S/c%ltnMX?byw` 5E2eӧ3_# -u⸢:H3T#lǣ,L>IN[r 2Fo˛7o"H*iȵ[=7$M͐ieiI򅲺u39t[,z||\݈¥ӽ]_|Ab- ޤOpE f4lP .5%zf<`jgڽEsҏZo*&3a>5ҥK_'8KgksդUHKe4SF_ <D#W^l`_68NE]rDQnCVHK*}\}"bm8GGGd1(L*w.W9b&1eAtc9!40=N7\rFD bzbA7=Qg2RP#VkPy?iruVWW++|_H_T],#R܍:B K0~"A G<8D+,A]Z!S5SQ)' Z$q|e={vtt3tշVW`|D}KXwǨl'x|rExii _ouu>k+4PW.G?HX>5CG2q,jO`Ӧnbksy?x>߳\i5-`2F[4%)&3U)B(.Ɲŋo^^^vZaa⤸`hAu(tjxs]YlYS b@ Er24[^9m1q0tFTEur.^8я~Z 3ƔBBhެ(uqT $J^``zmRe׀sjPIP:~;wn}}=5}iftT,wʯM/Vm+r THxb{{[bǏ~TZtgk4sέvG 8Z L-=JU,?i0V ʪ:LYV<5ØE B|ݻwWVVf?Pf X} ]B)+m('fUKo0[sZI2͓ 44[eY!_<ַ1vrܱE$>OA*a<ܢuJ7ʄ}ﱓM:Ui>8)y~X6%X^WF캠4mt{ecʹCXW=[?TzRtX FmuuUyrr2я~t߼ysaaaggǠ+ boB]{&77;#{i*֗}3QamJZڎʔ~>`i#7V24<}Dj@Wt S=9V3xenٳg䣏>hñ8wg#]QYL&Ouj҈UPs%F\/-(<_,{cܹ͛[nMS˗ICAƷ Uĥ,}֖p[u!Q5 `*POw}WM% ͇u&cFX|OAcr0V>aUr&CW'?ʕEo#Ip1HO\n^_/_N~*9^ڡ+4i $ovc#覍aY-F"2R؉zq9d]dy…cܼyw{Z(Iݹs)Vu{<*$*S|||/U:$Y&][ w MS ?frqGGG59*w]1_J||U_<,D<9bJꩭr¹U[|VȰmh H[wfXa >;ܧ0 Ϟ{TKxtklÏhtP\c,.yׯI{,$M;O, ۢjZN[DV|YG^Z hn V>#()ix%"i*֬eyA^t(fb\`0ӼGwGGrH`/iIs(zF(,_~VG0Ut(9QVG(v|AG͛7NsT0UhW\ 2ې9 7\ΙEqY+]+Woɉ2\ _ ?O>QYi c'O>y\tR"$q Aѩq Y__FIƫ5V쀾dky+yj DN>}pu),VƶcYf2gFhsgs>*֜NMibR-qΔ"dz4O0ks9\嵵5CT*úx* vvv~4|CZ9NFc>5&LiRkRM* zM^i}x=mScHWϟwGhn tnHҡoWhV5YiK&?a0ŭC驡#]4:tEUH6ԴCcbJ,ވBKzN Vpab13`V;(AY_RͰ GtW|9å|_ZUy"ow$0gn6`w@]`}/Rh(ԨP yf5t1OLnX'$ƈ#@,=F%Sc3;*{mxdƜjvvy^Ν;IX{lp+ETZL` '&2GWWW9Vh; q9TVlsd84N \zz]+PaNhUAW.N' 6*®GGGG @n8X ziiI8y3s&kgo+)]lV_&:6T0 8Ru1X&LlrnRQ΅1'3]ZzۦJ5SqATq<ի h&-œF CJ1F(YW P`ee~_ _~M*bii jZmLF߸!~9M17Cu ݉Rb.6qe,蚝 3Iu{sĨ6L?@%I=`}}}qqUxtӧOwvvdٰEwVP[d6FLt8 pϵ n A!d… >x"zgkHBloo_~9EPx\C_PcZay'MΪ ̈́!?==u\xqmm*+!|,bjA6g"$-Eq0 "ԣNW-tmPčM~]_OŘSyzwn߾=Zߓ)iyLQ,yJ0 :,%z+O 3ͱa7&p%}f\rw7nD8a-s4miӭeSucKK(+o`I%=S*RvttTKZ;c&41Vzyy׸I*'@.Uɩ[DUjntb֗_~iG}$;K~xx*~2mvvV9dT*~|NHG1st#ZIČ(P1R;C}KgO&o_}3Dŋ?AmpOHyG~?fvvV͘ђ>sHo#C3@ypyy8OJFZ<\ST+;אMm~Gq5z$rҚnN#h><,hu6FRnco-vMԊ % {z@@hh'C2=6O6.HRwaa@]ynnnyyu-If ܨ`$Vש~Чp޺gƢrq4:MP7W۱0??뗴D,o޼wK-+O/"Ut'Nw}t:E4W-[]]{nFTV2eE 5ԉ樍}9ǥMA&=C$ritBY}OZhyл e`7MBy0.zfd2R畴%ܐ8qaQҥKs1]( 5s$]Kgw*d3ߋJ l}ww*dQq, S"g jz8:dH떪_jmڽ+T ;Ѥ3jZ%o9>0^M~-usss>@;\v"ʝ]_L?-:,Z5 #$ZFXTt KUv w]6ΊDd 5%^o|Uꮓ??AW©Ryɻ+a7"sҥ5z*B`3;;XVWW+݊J @hB.LQV$b(&olQs3iP˕S˃,^hyS4,&y+caD3M)j$)lCư"c %V$B$qLF Kw#b+[S䠋jՈ_^__o1sCZyNU`^=ߎRddcIWVVvwwWWW%Zf'uZ5]y2axEUtyie-KcSߨ&wE^ )wlƆҀeۯrG8t{{GGGVWW/!VzSf;claRסG4rHK[o{$8ܧyqKaq!PZm0=J۪n=\GCETMZ'*e4fh3X lɞ%DIŧ80R*w\4Kheǹ|.]vd=( *zv]ǻ. .פ+i-x $0] yhơ# 7[*p"+>}I`$+0H;;;j+jISo>|裏؜f!y3N"ъA:[#>T=z )bHu+K*ш,ͯ]pauuUܑͅTk T壁?H-n$hrN9]K{ƆYa+@iI[P 5j 1Bׅ 0|EfR5"ShT)Ʈ,}s,nϞ=,,k"j] \ ˟}hp{ψey3O] 3X˗L{;;;wܡY {@DĤO&cTZh{8f2ꏅK#) *g pa ^i_t˭@Ҳl sPKyo8;ZoEfj8e!2gCWꐮ *6ʕ+͒ 1JvF)՞-6 wQsQLh.fj 'O"ɧ~긫wo*\˵5X9܎tYS?FޞHzf~FiMQD&" VBi^ZΫv[,ȇ.--Ijr9b0#Fk>?N5z̄`uJ~< N8L$:FRTDCFzçEN !!&q Qd2w֖_҆cElfffn?~h*l^۷nz/tc,NdUMu&]{M-y-Acآ7&6h!b)9ݙk.PVP >LAb.^AJ/&gmW4V'!4jRbTMĠ?&ZP8MuE匶^H?vk9X*9*Ν;88H=[W7= ' @,/dɝ;wh4}fff1:==]\\tGwww/qxMqAN!4C%zOI"͒Feo@E4$ FḚ]D@4P᠕] DVl3`,7mUt>}?\YYwcKgy7JRA[\{{)2خܨDX"^deevPIb6Y)󱝲7A-Mkvv͛M3r+WL*kS5Q͛7o) į{ T8#*(-l5pr ^Swƙ#AM2$΋mT6l͈1E#6 5gE>} `IY6etdݞn*-??GTV3\PL̹%cwD;^qQ)J8u.4'#%͙y@\]pIa;vLq<jdk/^Z5=/ 2sss^I7>A#3$ ykAsoffyo%I $Cgo5ٯ8X#6$? ׀}a2|U|Yn&"ƹ98^(~"Hb mvv[O'  zb^"&8 @FiB[gEDLȖ=_\8#:>6~mmhvG?O?EѠww f/cHҾkI઄իWK:t=ZdKeTMOfB/dZJ8aK3N69Z5P7հ }zѷ-]xc7-IWb~swtسZ SC;Q߇cA8[˸>,ƒ?~eeUGRIQFm0RV^壠0iBCC E8D6s"i0ʼn*mԥ$Uq*.1RnDEr Ujo+Hȣw.+7َqz_"H=%ߌax7ж:aʈ@nx{G}$rʕŽ_@}%>TAU5b\~u$,<"AE{C7A8M4 JW$cYb \p<3tuEj`8zJ({F9%f:~`$CHl_8_y,ĵpV&ږwZW&<[D%!Xq}~ee%l#G,!c@Ґ@T0*HOٳg&?gzR֖cPK`mm`qZ4(&  A$H(H< =R*h^6/903E"l9aMؐjWfES5s3?ֳ4_޲l.w9E.5iPEJъbKt1EYF̐SJ˥l3Sw%+W&t%"b u{{{}W\i_jZ{zgp:XZ1GUsXSNUj"hga i0GuOKd̤N (>иv$%clLxFqX}Yrg˚S`cQ9!hK?vww|d2_Ut㕕pרn5# ]0666۷' %U7oXz/?gn[8Q80:qˡ;uabsG1[F4NQ8::ZYYA[w$w}P]6h n"L=ID#ܞ) "7-&75Gb]9q(zIJ:+b'{Q9[Mɣ<:: .LZ8!Ay*/FH=13lM5~xB6 gYxb6gs8FؗrPZjEH5VyUdJun>jq@KyQ{H άhOǶqgXd%?Y!:)əq''''wEvښekkKk˗=zt޽e >IZ`[HS ݍ[ц9MUʸfMhOovWFiE\",1IF(S8΀pDC-š{gϞ7 VuϟonnGǩ5oYs #WE+/b]Qw ;MN*KJ tCjшeбcYƩ'іD%31O>%SĔ7I_W^q MDzy+!44 @udqWII:'wC`KUiMymu&q7w&&J쳳cFYtJ vBN33C=˙ R4$H)*3 iyܽD=Kuϐed-Joz4o&m.qr/W\\d>5ݿj+wTm0IgKQ+bĸ5d5+uU0ox{{[9Mt#Z.(LLq,f `*\rNF,.M:::鱃!qnxsV -q)Y<[cʫ_Kb3*NMOfIkleeI$C'x4www%ZȝN׮]SzfKCt );Ca۷I5+.C˱hl~6 &CiuHimo 8ž#=F>`-o¬-+ʓ,7K7 7͜&ojfw)Ơ0oDVZIq]#=I.tLi̾|NɤVy!: 8a.ųYOSY+NDĨTD b|)=녅#cżtju\<ʀaa u< e*uY 9"ƄئI%20ѲZĕ%j{nݺ(h g^V%fQ|DKFYtkG7NY~];2t7qݵьsLF$dl¢ErToa(8.3G4Kv?=|`kdg}ư'` ߍqeSOFX7vqqqiiݻ>l ӧOoܸqœ`Z'az)N {766/^x]c"hB4ΌGC0 4 Cal1@HEٳgg!$mVoר>'ҹ1=v%rTlJh$њ$eJ\ڧՁF;=-)(u @5'dž n3izݺu Gmff.](W2E h13*: 1qvB3}1j;YⒶ¡ U?$;kU7duuuLƅ P&G qq#xca- ޱHRձ\!8T*l_U|%Kp^ h)Y6ԬC3jOo6Y"dl{ rhVɅZ&˿GLNVt]ϟqg}&&ˍΓgKSS2J0獻JƵYn1qa:n8ө><<i#"ւ|ƃKdSIU )o߈?K!J (GӏkK!x ͉S(qxdZImp;a7n0ё5??H?ŋkkkXW(0rWG#uBW~9j KZ\-쫫(Ғ`!rjAg5QkY K i]pN9Q'/؉F>©㴿0.F-0u 8#8j31#xE70͖4bōIv;9S^+4(.\0eҡ^۷o# :%Psm L&d:FQ|B@QZcYe͎+UWe#,,,%]4%cĈ30Cۗ/_WPI y!qVS!)UX^G|`>̫R\)4uCt7lѹ5p%w݀aX]iC%nH,#"NR-[9V#blqT*}iꒁ*E>u-{o)t49^stV]Q񒣒T]Q5.V`SNɓR U͛ڵk$:_1 jsf2_j̛*ޓm!~֨y-Pa;5钃ߜ޹6TWt%NjKj1S*8uX\Ma.QnPnɆR@˽{]F&>N)P> o#ȦyG?h` 2 V@N:4t9F-kH(b%Dj&ֈwvvHgf"cgV"Bg,.xlA[X4%"|VZG?T"gUUE+!YyKgȡAFAI,cãtQMDf*k;"~ozӧO/_^__7]U aHXOLzDk)lt*"J,iq{6Z5,^cᳺ: "v7o$)DrA TSdqZk B8l^mԵL\.ċi[q͛7e Ҿ\TRv!A`Tq"SlBa#>AN c+T¯5b}}9zR4BAš?|vvv~~g:l߻[[[zWLcۄ;wn_RNM4V$̣6ڋ>d+y#8XtvΤ+fMI2<8˩P\k3$uVZ`@b\T `ߥ"yM333Tm?w1Je7?34Y:}%ІOQdPIJ́I I LT}#?%w61G$NH=9aY:B& 6#槖ӦCF9X\lT녩[/ `)*iz3be>nO&^6ӟH˕nS(2/܃?9w$@. [:I'X.ʠ\Vp*AÇqlMXI&Rʔe3 D7VռDPL֋K"HRk9jW X~J""ģI1/2f{]dRDiX*$sd\es^A쭊kٖ.t=F䰚{{{f|ؤx 6r*jT59i'գZK=H_\__?}Wlw`nB|4(ȶ;h]A ]]*NLI$G~<t]B[a1w .>%"w~o޼/j[܍`Z %`9isB`k\]G%)rgxL `Z{ .~ߛ(f5f*7/R PB<M{u$p(nk&N${:MxiEc{u{66ÆO%ɽxZ.'/5{sў/]aBY扔&oCLpIv@B@5)d$\;&Rc m6#bp۴o7o8*"tx")h`YwYN5N0S.*<.RaWȍ>MBb4qt">MK[8QnyVሚIh\.O|U~SW71ª?gB`}n);Le+dFoiy^'﫴"[wN[j[Ţ &q]\\P%I; *npOL(bR„oAZ%[S#,I̪cTqa\nv_%uե(*oYs*@3I9qLUnXªKQ6,5$U]IKat!z6nm$aȡݤoyʴ؃7U-T鷦 4ĉ9M.=֙Lj[-={f{0^dqSc;;;MLcUZT*5hqSqe6$g<+OђRRID9<<̰d㓭3}k4(NwD;Y +mFim)|`eS IDAT\+KiB{:v|=|+~O|*j2$ `kRJk !#DdQ0Q#>j-w 92U ri^<|*CIF\,r#eϙiF_w].;;;iW)6<"wVtS:()䀅j6ϔ?ζw=!ɫWr4ɫt(WWWB9Y?~e4x3ӧR+yX#c{wO?Ԏ#߃!N!*{֓x37 REZ ˗/79m/UuXF ߋ5ghP [ aFef1bAYYnRCG-f<q<;f]Qtл nVi@&e}ڥW co\zaMͻw_^<{L'^^^rj蓂As9>L+Bp[Jי1b9VIds?#E>8[ D.-w7*ZkHqBqIo:p0ҹWۙomm9v-%%*ɠ{Um9\946@; ʀ5bܹ_B ޽{^+&ȘT'|w|172t(<B|{J|}$b x7ͽ@ m,z-&9:,Gҽ{?~ 2)Vf\֝êϣ@%j#:u [iW2zB_ntJE& gPe^sOn,&!)e#%=n3zMg};p 陰$ z;8׿#؅}||EW쟣U*0l;d^S1Ѕ+5?+IV ̱/gN1~4ǡwmzN/1 JOumxqp;La3liUbBTSlmACLտ.>JM@ƺh#1J2Ux:Leg%IiOnfMp.ʯzooc!4hv[iw}wyyI"gM'?EG/^xa6}=SQeJٙsxxbF:d9~7hQhh! rU'ldgӖJXr\DjR7R#$!yK~&R͘bP]L)!Eum,іكhzN 3A"ܓ:aT_ݻwos1ptW`nyo3Zt'5Gh{mhgBeY5Rt8.pOΧcE[1.IȌ *< /(m)7z-αeBc5)#yD; S,rer:I3g|6Cƫ7D9gb׳rҕVńsი~!@mXXm)`%Kc˦˥F$Odƀ !?OߑD=RdO:L]|Sb%5S͉5NMU{{{2o5\zKٹJǟ[f%Qe f''uX%Ih QL8v: Uy.^xx㑖-*5޽c pjG^r-8[jG}W_<3#<<<<99vwwy!TR5:B'xJVDQ%@be`>zf7GEKL(ÃGɣ+g|`a͆F.slQ^S TMS`4fb 8]C`*['G7j#0ɾuxӧOR0Y'ٷ 奒7lq9uy"& RK_cٳ>Wtpw}*fmNG6%Me쵅3L`h=pp*V+Si~^Z5[.ȤU_^^ j$OrbXf'ypUvL].Xh<` gg2g0JiURX8N.i'70|iwvM@O:p+U{f%Yif\@qPddH̒dD;Z+޼yN^mUHvE~礀ܾfrrm4.VU뾀ܔ\1&ꁛf4 Rb駟]r]ۈv^hܿ|Zk_(ٜ`D fe6=~H͍z ~527E:."Z2ɁS!ӲMMQCɓ'1s|% &g)c/H[t"uIENDB`teeworlds-0.6.2+dfsg/data/editor/checker.png0000644000175000017500000000016412140200333017744 0ustar felixfelixPNG  IHDR ;IDATHc9s&)@QQ$L 4Z0jPZ߿4F-`ԂQ Gp\\IENDB`teeworlds-0.6.2+dfsg/data/editor/cursor.png0000644000175000017500000000252212140200333017655 0ustar felixfelixPNG  IHDR@@iqIDATx[lTޛM&M[vݵ0@ fxC<S@P&$/M*C 0e P 㲍K,"!@(cHr'dKU?;sb,*2.x=.x=j֏Qah)D1*Lk7 Pg4RparAȏ ~7r Թ.Pߍ;A}+ ]!P_ :˭ip K/4jxNgf~ac-~!w(t,|1wm"=/THVkߺ i%5Q~!umA|,RA]zM0d?qaA \AD}E BN4Ea'Tc+1i_?L,]{\Cn'IV =6`X|anLz:E^uA?H*VF;B==Abc1_W/!HOE;%V?ܥ5ʓ!Ek M+>e8IB@; A܈mQEKҁL~ Ų6/ -?Ecm0B|NH1*0&ɓg;: {bBn6gc4nFYҮ-ƉMT-_ L!vSM6 7Jj!}D5yqcb_뵌 Op<y2\%q}F5y$2{ڗN#,<qe,zz2B'L7bcG] niL;"NSB䎯Ra'c~xĭA at['ǢٲB?NaH G NĎZnwC@fas#ȏFƶagWV*4Ddк0g?2Ga-@ HWUH_FkVڮwt:]Lq?R~P`SLعsTƤq隚9s moG)ńRRWxGW'/NWV^+mMxg2ǘ= 5८RRWP^pJ{Ϧ+*x=gϡ! =0nu>!\+2Yܦ|0*=wte5-x9sfϩ|i? 0~Tՙ?MRHm>ql٤tխaUgϭ|iZUB.^'> <84iR`dʕي?6Ljz h.].akjGi¨9!88®߭[K/Ms9^+n}sljnjǎ(y+:膢z*u]k}O?}Nz NM/Z4%=}y3Ϝ0#/l[KL>v4}Ʒai؇ϛoN_?!=v셙c\Y<5jńRRWKυ0"ՙOYQ9w]nfiz>UWOnrZXR@*&жVssUe:ԩSӟ4I{,СC 6'wCX [٫vsOlLC*:w:3cnȐM> pp, |jypϪ9.~EER[[qOz^CxM-3gz@n>}W;v^n+/߱c}w1/hZW1f ܄v[.A[oZnbxm-TjI TjK ;sԷ,X̚5;0`@Mn\%;[b⿖ .?xChbBM2b!, q2o޼x)K~$3g6⵵H҇4_Y*u-GK/]\U,YRF@>}Ԝr)_W2U^ņ\kwu;5֘W1UZU1a&g7ڵk6| k+$]t65~ԩ3 }%ɺ+W%/6&MÇ|}lUs&OnZ4ULiVUhP~;QC&3Ye6֭[mk믏Nm{]}W_{jٲe?q…&k֮6bX2OFرg'qlݺuG;SoFW1# p^fh~e7U;o;@a7:nT 8pÌ3^_vdF 3_1cƊ7*&u6:94UL(@Br mEر#}-ڬ@\/Z7<<ׯOԬY[ ͛~5=z0o޼)6?`ōNg58P 5-˹ ˜T&Xk.y ]ӟjRYYk\t`ysEsڇI&%W]t@]#`k6Ν t>}ҁ o}?߶rQsi嫘P!g5ap^n֤gϞɔ)S5<.~zؐ5b;6@q|S0}ߘ'Yh V+`kK^zK~q.Ȼ}۶פw ńRRW!!{ 3Ú}u=dCy<W?&Sȱ6֯_?^sQ |g\#_~FǯjMl:U|] >1q^,?ֶmc;ϩP 5८BBre kP^b?Cw jjj궉?7ͻol2hbBMxB ԕM|q=}@nwsm'Uָ/55&Mˆg$/NWh U51TTl}?-c5"VN(_ńRRWSyscC|{&x X/qߦ8ck/e˘F _>{>[ xvU\` ?"?VܮU 6m]1T@-!M dWn4?#joS뭷hES]:gϾ~С51{ .  s D-/p[\uԢǺi jJK]MkBdڴiM|խ[F~T0Vc}:~a`W^̙\ 17N9Wz5nj>zܹs!  bBMx"!͆xʽYUS|{XUUU. awBn#vk :;oH]jѢEW~'İ[př<=VC*J=ˑOխɊXrļ5rWL)u/u!= / a ̙!MN>但ƪ5|x̵ZU#C8"'pn f_~B1coկ_[f͚\ڿNrU0p17\zO<}qVT< ?=u[@(_ńRRW YfBaۆpÊ]o at].]֜}@Ν sB1;!SҼ!.v<-[cY6>j3VT<@*塃LϞR[,zɳ~N.Ok官PS^!+!N\{ΝƪVh7xnTs?7yꩧ^iq8䐫_]xfjРAf̘TW_mT_4}To㏯VwZ{*E_*w&bBMx+/0%3lɄ zݺuɡG Mƍ~mηMܷy(Hƌ~Ɏ;W0жuyC4+ +W-dkt?:ڗZ}Р:wxA/{シ̈́m ?};f;SǾ˗/~3KW6l &%/[㎯ mOmww=jӘ7رޭ~y[|A(wńT1"%aKlH~W^y.4Y&;=ܳ>)OckzɫW09rdaÆw p Gq7ya=nʅXq]f}-iGQ/N6;nS͊k;vM4y[@(wń{IO4iY{,Y$ٴiSbn L[s!WwMܶĻm۶]g[ V˜8 pqސ||еSm#"6fWMҥKӣFoڰvݚjO?}u&7٩S0t5ӧO_] 7_ |bBM)P.. !!\_ !Opnk-Uӟ U>7 BzMO aޑ!,­!{3f W_=ck?Br銊⡇**=xP-nwUÆߴf_=z#F96fz̙xk:묚W_}u+̚5)w:tvZ(wń P1Ǻ#Ck!3& ኰk%n~|ޒج-k.pm!{W[ea 5k\w:ꊻN;[3AƆM!Ct!_m>lxfgJ\&a=3@+&Ԕ"tOT@?P5& .,8Dn ٳgg˖K޾Ǵc]7Gg4ڿ'k_޽-ÆK|IKMzg}vޚ[&4z7w^ |jJK] ͱ¹V@{D@ UB7ި5„~ƣSN?ֽ{{cNƏ7ҥ#Fd]>ꪥI~j6lpqf>lӠ 02rv<^@hM!?!yqҽpɿfz 8_l 'bЏ?z&gW\\ǶFH >/ qs ;.Y`ap >Yg@'_-mK.?N6q-'04Z%1CuH׆];֐!C3ǟd|>`ѡЊMWR!+CF5Uvnt.;GVCayL?cWw-[h_|+_SMU }ömuRYyM-x#?”!\kjjN֬Y[ ֶXNJ?m۶G?Q2s̤M6uSC5FEMk?駝^{ ֭[rypۯ~q2d$䬳Zȣz_ڗZ\޵OR]ܹS(_5b?8mBa=2k ኃBXs&O=T=gy&;`N߉ލ?ǧf͚k/6}' W;$~{r'Mgp޽!7!L:S0|y;wn~I?Wl4hЗF|jD{M_c{!0c̸,c@e']UpE#uAʗ@& aMhs'{+ʕ+ݻ0,џ a^zw!6mZrwd hn,noB͐>S!|"/>>gFؾ}{R]]t9U+'[0?а p1d͍7xI~j⤀qrWAN7iSh[YHRdiŊIO(_W ~\s3Ö̘1.?믿/]:tn;#O?{C0>K:f yx +oN!\9pncr׫ DŽpiX1/^8ỳM6%&M>0f̘=%^aLcs K ml޼y/On]8e\-C3ݭۢK(_52a}l]3޵D_BxC@Tݗ ړB !\yT&ª=uPf¬4V| >}1_<ݻwvl# }}~>%y_ӇBV4\g0+jJvfp (n#SEvrx< qgoR{w!T= -q4§]btI /m aۻV ĥ***-y6; z}[|D :~G;bj [C878'\¤ fS#.뮻rMկu5 ;^oMUxsٻ/|J;t=}Փ 8P4kĺ!sֻs'K^atG§B(`n!\ng5n\Kp¼ /n&I'tSO[i[멣v5:Ikӡ1c.(@( a_.u[ a!…ˆgsli,=}y?;㷃_@Eŏ7~]x#j7UV>qEoTVmzE[(_k|TקO=ƍMڹmI?-sk?aՓԽSk塶m {/Zgy |ihJ w:v\#l٤&f?39,mۧҟ9}.NkwMc!U~-'mI~fʗ@5b'ge'+f\m{m}G.J9?ݽtS27tAckj޿ |ihj 8*=uLY%M4 \ҩ}9_{%&ʗ>k*>?`~!ݿ܏p` \ESWT,ȡ?#k)c |ihP~*bŤIw|Y]`,ns?d9Gy_8jJK]८}>;wJҘƍ7tn/8:پ7bǹ2!c]|w ^ 2Ê?⇟&~ԡԵǼ eiRR>2kRJK]|˨PJ*u/u1/@Y+uԵǼ RJK]|!kRRJ*u/ui@P. (u/u:> ?{U~=${ IHB {PQ . 4Dzw ;NO2dZ]ϳ©{٧wn`0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0MY?}9X?g~Y?g/ Y?gX?gk2G$B?g6/g~Y?g[Az\XuX Y?g~Y??4Vl]>|}6BBBıg͚f퍬?b׮]ϭ~{w<~gϵ_~í[~Yy `GŋGGLrrH9y@^odϟ~]tADD$V^駟еkWcРAHLLD r:t~qơcǎϥݻwի(..FxD1vX||Y?g LccχÇɎrunwww*w/s :d,F??,(DUu->W)hꚾ%^xBSp; ]}3fݻo/d}Ŀ[nEBB`y/^,7FY?ѯ^H*[;w  >u s_Y|Vǒ'Ҳ^)\y 0g| 8eH= <MY?ѯ^H/*[5k= <7 G 2/iY#WdNϭ~SH e]g矋ɓ'q}=ǣ}t,:&aӧO#++ Đô?!K2xSni2\rE%nT<.^HK/$vѣo޼7mAnnZ~N0Obʕ2uPSORDFF!55k-AY?ѯ^HSK>ݻ'>dhGr^ YsIh{?kZvr\ʖ ke x Y3-Hyoa*KZG۴&ǎôiD뜸:(AcNǏ=mC>A%t.:'M|07n QQ bc__?au…NCжm[U˿.lڊGZAp+;=BG psq  ҥ?`U Gt+{%KϟƷ> / |yEef!֪Rd~bn^vMT"QUU>@dDYUCJqrox&Q+^O-VeaEU Yd/i+H/u>33SPsmCڻ~nڵk0IGt SHehJ7a_~n鳘&JOȐa|:tX=ښ?}/XNSAcAb8 qٲ;w+'}*z?pE-,]*Xa2e k0x`?izktɳ'Nq㑗j[~֯_gdhjq5Y  LBKF4V̮_2d#"J8RV+ ]ThgGG:~dꝜεl."\@=~am(ws;dh,"^}O2__h(++qCR%KtƺB!hUu։^-2MS+n̋&i>$Kǰ f]2Ξ*ߨZcx5۸苊4t<ڇ=exT6*\`풉TJ׽G> +W'Na :?T̕E[i~ŗwLK=@Tw _E1R_}#.Kubƌmh֠_i7o$ >jAã?z]*LaC;vQw$Q%Y?g: 5Ѿ}{q2x{~휨g140nP8E.zќ-) `6y]qFɊ LHOQ[~2:pj]3X1$'r$ۃ~􄣃|{H\e κo4zP"{1un6[ |Q+M~'=3U7J[oP9%&''㣏>3J:Fw?:m+4,X|ݿIoOi}DZFhSG2hHe7D/,-դn= z!Mz/P7MK1id_HH?xu柦}6LƑoAll,aW\3sif2! J7<}:uR$%3\͊W^A5QY?g: iȑ#b|#|<]lRԆѨ)LpC4*@KFG 7QjwrpA%[׮r''F-]7/ ѥ/F^o~+iGHnFݘeAŐ_5`s~k]7saԨQz&HsT"EC_Iچ}tCǦsй3Q,jVxS.wI9[]-8]#a loN0bhCZiJyV#غ}_YY@kO)x-0D v>x/J*Ss{OU5,vQ7{G+n8Z'ߐ/db\GoSYSo8_cr.@{ g] Mdrԯɭ)̀1՛sΝ;M6cб 2,T&KЏج[T6GTvK?Vr2i?~w 6lڂscd-Y7xC习/.Te˿2_cػ@3Vdo ʝ;v @oO>Wo"--M$ȳwME%R]AII)nbSٳg ~#k5t3D1rfGEY?g: {yyHFlg1 [!.O2b6*@;9axJŌ&VU!VzqRO{OSr[kjYxJfTnuySe췻{ W,/+{Au#_3I>0\k.kꗷ2N٫1%x~YU?5l2AnRIyd:&Md!}7D:6Υ{~*͜yD667HeTN,9:|J }aE3*XԒMs,FmͨoJif~tBt_WM'67?8Awř̿[kb63g ?;wiw eeevk_~J#G+L2>?S8^l\ED=5Y?g_Gz!uA4SNf *G[Ԋ !rM)Zel[\,zZh\tœEb!ѯ Ԫx1Hk~Y{Jtdi <^Qw+V͚)Pٰ~Y8@_H`/K{QKZ!PfN T~}ͽ*M,3~X$ơE}4{ KCTnZ[UyS&&1QxwqZ_i.m_<| 2Lh&,Ũѣ5VMʋ@SVWhnݺW^"di)2?~H9sZkn1`NjOH@޽q1od~1ƛ7nn4+j<~0^S@)&M/ciM$<'G@~_0zu=gGNri & s'qX:4%*4ӜP7 ԟHV8{>0Y=^gƇ~& ZEIIMW#[ Yż5t_Y_f[ձ=[ڤc-*7i -"GCNbGkK xVUKotgJoUK-a$Wmkv74ad)YQ^V&̿5⣯Bzz:t"pADϞȓLўoټQW_JXx!Dԙ Q~u18PA>lڑ蓗nb]6K3>5/.o3C]XkJٍUK$/,l!SջֺUUvAAx//.@e%OÒffAtF)B]Gbi!e΢Cp/>)B)%Q8.>*_!O@LwrI)e4_ui{PjҿtR>|M%PZQ*\^7#jW\/! O_9rӂ笞qq"QcD?ZwI\o}C6ZsyJ2o=1գG;@?w$.;[~_ie/:v=IYf#֭TĉO0w duSV.i]!PFߞY?g: i5^_5Q{[dmZ_]Zꌽo ƕmq惾XXDih_⾒9̽R#?-|* 4"=vCFRf.긥Qa5#k,_I)*#=zmKչH%KH]STP?uZw1SH捒27/_6h>}7>3C3iZmKoO}4UUWh[{ֿy&=}6yI_oܸUH3GP^xnY?g_Gz!XK/$6lkU>֔32O;pdh*HcEzx{ ݼi*;LY]$LκX\q:Bau7xYb];hͮD"@Tz[MCGagVc7nKs(<#h X"WG:wlhMӪ>]2?!zRgk%V4b,2 O㵕3*pA2YsT塲K"ecS-gW_Ʉ$Uq d8oUIsHIHH2?{$L5l) vÂmz“qo|fIu\e -37w)ǟV?MqG=xnS+^2U޽4*_U]2]r";;ad~l4/X`zǚY)abQ vLb9pX0E?%[LS5)@^O`X7;+Ko .ԨPl2ĺz\V5Iy\>?_ Rk駩̙ǰFU\2ؖ'M(_Ĝ`L(ƔxLAJTx˜ hJπ{~qtDvQM-LGhzAQ{4g@ Ȝm2r+m,fڵQ *Q1a@n4 _2XGʴ@;ʝkYzi*@Zu:G9f (o /]5kSfǘHS(𩋷oݤ{ȥ2ϝ3Ztw<Y >%iJuԭׯosリί9柸T塲SZf@EozXkr~8h &[48ʂ_x,e~2}m۶5hiH6J^| $?c,̛7ϬĚ׿1ٳ'bccBeWHzzVi"⋇Ь1dǎ#>i ]CCp od~bj4 Fw7k`z&oPiXu9m#qn@@^uFyƍj0V1Wz30~7bݺ|uUqqV/wrAv\ڕӘ3PNo]p\'@\*o -]*׹VMǫcҰ0&]}KZ5?M _IV)6 0\ߡ}7ro=64M` _@bb׸׭["mU6rT塲SQ#k YѱpvPOsy р'޺}G5!lh$&U!95[,QSNg^dwaŪ<nizaau'_UJzH%E#z mݺEeoܸn?r[!vکaC޽z QZ{v5~ukmӦN>eUޜFEFw>@a~Zp^ZعmXwF5K OI1kDE ~F]i NbNZ18*e2tn@PzQq;_W`vE-O hqM%c !~"YW_\lIS M0J~+gwȥmۼhl?pȪ@(d9{dewo%ƏRU=\re!_3fCe3;}J>.bZ/-ͬYwEVfM|ɰ7d=k?~4/`Da)f'-TH3z<5waeıÇͪ?C|p.Xy]gZ-6oAPPw=~EzOK)FTǏ)ѢEHIIƛo!==2d̿snZn~Y~BzA5ė_|QlS`qR*DYûi۵r|<UL-#auo\ڨc=#" +2S҇텅AEl,VVBg6= rgWѽ? uCV ͮ@弳zwo*('Wɧ(ϩ =@" U|4ڛ~Yp7/n*2ߌqYEqTsNK?APٌ5 2nT⯒__v&ױ턿zҺ|UKf5÷>q!U^͙$ƾ+[Ϝ=`FąQf-dI4U _?ybrz󟙕-~GskKKJDB/J<6;wLokOXj(n̨11x #O쿃Y?g: y~n`g7F\wyx|P8 MhDcm 7]'8>|/97zLDtN o+EM.^ՙSYqUrd0 -OrCKT_+ ?;BO,d?BVciI={ K7GgW5$KښحzSpҘRfUU[%~ Q{U\ӧx W$w>}ʱq^X7a}/ZJG;vHu&(>7 D?d +)aao٫~SY&Oٳ*~OK^}t\Sw߈)sWbӖobBžп?ݹ#xVY?g: _CVEfff^3[ 1Y$f_"=_h? ZmdDDi_dUg/4 M*F1ߗzJb(jfՆ"#53SЩ;F gj ōtܿdd2TV (8l5Uυ Dw?ʊ 15Ç_q&m)ԯ-6 -/p+<Y38GXz=@zEG-홬~֯_"z+vi]qvm˓D"&- `~l߽?6C'},*ZMsx9ADǏtI"3Aɘ.̸(wxG1Y,ci34`{]%jU~_5?y2[[=(F%٩mbK@F:voݲxybժUx ]cj]=4/JX2}::#/]O7Gd%x = %Ž,9hN-gԙXQ#jk")9E[J% *z޵Kk]Mu0Qk7>SN>vK%#IӒ%ѩ{^,{vS&`u[[~uGc9|8P[nC?M\]Wbz+ `~l[=pBS|}k}R}CSڠpyݺx;^Ċ ! -[Spܽ{OW-Ƶ~C8n3*2G_353l߹"xb od~{mGI`Ů# kŐАe'&>/VW[1D I~^b3ɔ}bH(9/L&xND(";V}CAo4; 0SKϛ|~{/-o$spz[Ę[OHHPWVޤ#Ϛ-0z @*%P,}jښ7)<.rl(E]-})!O\2z K"%%/O!X3#GSEØH<%qG7`/c6/+DXXΜ<*z8ѾGWGǓIX84H$c+W /"8ko*ihLnp埘 a'k> :=w.#Y?g_Gz7%}&%% 3wm?0Lyh?oWx)C<& eyIU $=e$e'&1]'[s_2Qt!`77duCvnz觌ؗLݏݶpqC nBtF EAob2ˬp.IÂ%V*lp*č[wL \>etne9LOL s&j̰ =r/_99Xz1 y -5U(#QIz:V̡m'h6K3{w4hhbdTy-tn=NnO'q1<}k//BM%,s׏!u.]1i„R=~uK)KےI?yl}Q9rǺMrB$S)m"u OTFaK%8Z uFd/_`RٍU&LfM={ O\EI? >>H-M= 4["<<0X2뤏EEVɤW=,s&Dѱ_?x'8Abwi H΃?b&솓ӧuIFSㅘ 7trt]u)<(Gi rSk=3kMxA_YA6uR?%RGW?-ݐ^bVOs+Ae~<'qNF@,/c*WN@O[o?:2OC^Qd_: vÇ34qTC\;SDU&'*cyNq} 77LHOo7aHWV)i ȩYn/_,y!=B1&xZ]{XCoQ(WछuXb*wɝ=S&On9Q7vK~wRp_UQ*nΩFJr2'Y.AkkMտs6$bobxo{CBž~:u)Sb-Qu9P2tOv!зOWU`b$&&Rh|u#0 :Bς^ G``xnO SyvF ̛;UY?g: !?{._~n0;eA^8^_[7W DSVb䖅HUDK i 'Noϔ^~0|ZZee8WU+/JDmEllͿS( 3`-=' Yg|P:S<$E/ЩEmlVEͿ?-/,qa1{GיdZ$\o}]Y?g: e׬^-;:Ȑ2_hDo.ުVe?_?7 -#Q'-6[H:4ݐc~z4ೳ]Sb>e#ee8.}J'.vspr~.}* XMܭ_6gGŜSwibFtpHf &Mg',3M$ <|ESYR{oF:\SlyyzOJ$l]M'UaQ5Aؾu=._&O1"w1 Dr@4thf^ld+.I'zRb"aUu O3gk4C>Ԣo*\vNqǡ%"06΢eϛ3 6S_!?]!--M=m OH?ݣD?od~R2-ɦC&|lYE!G\>z\+гChDThZC:U%R!N-E.|KAV /,L["@S*Oj7dE #N.٢K-ԁ%[ԅ2""n=4<Lp]u|o^:aPk1OVI綵~%){ueV[z֭ i16UZ%)ijE]O7Xeir <%%"ir(Z'*P^Vf}kk'!@LV;'%{(h4?g1cNjVNrPV^!?mG2hLGad Wo6h#gؾ{sbiSH?+PYUWnx7[獬~֯_߻W!"&I>~!+F'Mtte4C@R?^/ )i#/a l_siV6ΌŖ9 6?;㣥v*|oP `~P藐0zNN˜ax ii*"qdJ J˨4iiBceDbx휜]1ϩ~%S#STׯGJ'V/T+) ǎ:.( ?WQm}ox'.H?_b̿gVĝn~rk=ioۓP"$sBBbdP\?bW{}0Y2(&<6]´m탂3"B{t"^ w E|H:RdL|#3\z 8ʝꉨbA%Z66=UC;L:N^VoM~w/5 6bʩ[4鸭_?s℘NY}6ciElNYqPxxVrįq 1ʤdmM ΞǣL^U zxH.ݥQUL0!y(<5P~+n>pףXOAeyeǠ{25D:M,[{w-M (LuA N-MUc~'CީcG-ڮCG|{u?K<&rZ:v UUzgx21Q2U m)믾j:eL?hF~!Z=]\∨dge!>Q,/vAXH@56```|'ßQ Տ8"S"0kT'SO?v /*~viNԛ%GCd%-;W8hDOWЧBS [koY?g: ZcWWW5iOVoM1h|(?c7Vߡ~vc4 7t [뗵d[~ksBM˒ T2ѹL:뷜~2y;൷1Ӷqtןa%j2X.Gຼ]qp>ǘ~-)͠-qdY'9.Zd)ן~`OPm8>>' }dBkD'nݺSDUMXN-jkmcFW BzmQ|S{?beobs<~u^8s({nmumm҇\̟36*gFj=pgL3#`JE,W"%CLQV?R>W!ߴ6ѱt얖ן=w,23M_XP>if7ڮ ttAJRΟ>m{eː鎷'%bGngxF7=&퓼,hOo;A1S^rdi<[별~M|9ܼ\?PNL7ofsod~ROv5kDk1jh۽s0mڰq:ܔpd(rSJ4VX?GٵKx:aRE]b Q`X觠EQސIJڗA2Wly+1M+֥sgAwfzd~z6fz(L* u^&vcͻi_`R =8{={NuׯNƬI8LO:Yx}%;9{i ݫO0s@nj7<4o8]G'OfGd-z_ϧ߽6&ZC=ݞw㽵qn.7̶qޭ$W6چ!~.hJџ~Xz}w ?>ϻtϾn{K__~sg+yy~֭|ٲ89;>)V|"/+y|twm-UOэq ɦ\[ܚ(kdyw.?3>~$WCƷMώENjg_ȻT$B!79NݳTtyitSzZr?0)~?@A|7  (oAAQH4 (!D"aUvn#A7 7ʟ   D'C QН ʟ  tEyBwDd@# C H͙'.H~PН 2ƍ'CHd7 t'L   #@D(2DAyBwddG'CH7 tFY69d$>a)2QH,z"EϹ"lOF+@IA9o2|+#K@DU/PVrAF@U?R') 9orJq*sprZrpsqp^ 'O4/(oAm9d20~1{Ŏ;Pfs # mq)ĩƩy,!2#rr>fj~W-x<).sjЏc,\ZvhժƠ@NVE>lo푨Tfʒ8b;UJdW*^@vm ${Rݯ1,鴭2eҥK?w\/u0Z)rD!$G'2i4xJU =,2kV-(GH\8vςǎ;mY$IB%gD2~HՅik@#c"U<6"lDs%X{zZDߺ&Mıߩ}ƜJ6߻qߠ1K .J4 ]k% :_6(L h WԨQ`ǿ7u[^' p wS# }V r쇞+A)[*pR& }Kxqvʉ',X_C}I:}(axy3VA7_M֭3l=q3^M$ $#l,A'B)"@, A ; 7f̘~R.={W54<*8bdo,j _µMWp1|S_7 d j̩XڨAFgǍ_>LӦM5F=#jXVEP* ynl9q|ձnG@#d{UՠSu*.ҭ}7nt+Qe?ʿf͚4K?>@w3+9 Z>ql[lrfU" C>2ݜZtԊU>bhb`ZX>Œ%K>~awu(QhY/}[ ~ɣ/^}hB5~4K9 }4K|+~SQ,Q2(o< d@U^/,?zy6zh9XnA%e;xR> Dʕpx!d  (nQ xӺc79Xu=HY E4Dя~"#m4?8p>3v!~!ɲ @g (^Lr@m?:v[.i=P$¾4K] >9^?Ih%SGWj$j-4{Or2rʢ@@Bk :+i]d\|sknY> {キˋG5k ԾIcx4~IjJ3Y^ҍFU3#uςpʕEh׮ZmDB߆(hQ-I[ qv[ O ##2 k lj'n/3 ZXx4j$π-6j>3GWX }b ;Eȁp/O>-zl^z{o=;Q=V|wbŮ\prƍ ԩ>a-"¹szs$ R^,S)x4@^*PB}}5X(}@rSm C@/fPUV㽀s}ݺu;}N+WոqN͚5kqcNw 4i -w}]_/_|$L?!cCØ1cfT9w*4haʔ)yժU+t`JãOB>_E|ѻl6?\l;w+m+->N[}ޢb D܈[ \k.fNJvٲetI&M1sS cS|20`4lp>@*,='pcx·dŊ#UՆGV  jj03qԻ;vúqs=˖>tuX v|m:vys  ̪~Lu؇?iB6oݺuKꬅ}wsaZ)0Wٳ2ԨQ;wkD` Fv:: F2V^˹;I g4͹eP=c86`+\Fs} qi%i+ *@'NfL?4E#CQXRE)SwީW^n>~vm۶ >vX8^Y?781cq`\ϯ7892O`;RJ)ʕ+3oS\DѶ/i0<Pu[(|x65qrO&oh03p5fO7Ɇg޷ >g>q`6c VhĽOSø_BEs ͛ou-Zl~޾}6]36!8I{b).]8V/O,կ_?C5k5w֭[QISgϞK9Gng $c)x4i(&ok03ٽwq6z)%6yoco} # *@8W8sS{^25r5{۵k8zNyGg8)kN={xgDkZ_+;wdi&UV_ 2 gAXQ@4B !_4BSJx4^%B'}ʕ|ΠMٲC9~&#[t*x˓T߫ *CQv 9աؐߪO yK Y/^ gwzqyr4>9p@X f͚pʕ+G"lRJ*~ XAm>WH,3TNsc7_pi쭌) (U]3COs?i6CMFVR.mt`U|ˆSU߯ ټP@(l |РA_>}u/ nYϺ=u9HϋK/XIzP(}Tjmn .\Ks\ѕ 2ȫ E ǭ ڰaðX?G wPЪ,vqHk>fΜ9|SAc b„ S7 l~/55 <-HvAh&ipi@RhS# 8(ѩtqۋ?LƲ'Fn?uom'ټoΤO5m` 0C@<f6ڏ E BCMn3Rw6HcUFA͛7rAٛpa޼DG^sap2a巂d″0R& >kN׆*X1+{~|:9i$BHc5/_;+3%6~ljtNLQ d@]LyD@2 J?25PQ3̟+%~l 3V^=C\Ӭ 蠪>CRgnۮ]ڝR"n[ NXWf}AK%ߜ朱J NcNHtAB{5p+/g7gFm(tLk"[ESs4Xqx}<"Ckڶmެ̙;vH qSt9 s2(y|U 'N֭' 2z-dQ@ h45!:8?]LY+O:A $1 xSȍ@gK;?2PͳI:{u7pd@VG 'O׺?fA~0 켼[֬}޽Ro!PW܂0[BRdxw+y5PxzZ-žE6΀öDٜQӗ]rj'{O@xخq=\Q2M1.],w0VzW($>B0hMDo<,PnAɴ(`[ O>)I6 Ƃ4(%2)oyqμ8gCY }UT>t>(8w$1Ȁ Uݻ~'z0Ա6f6uIX7 59}x̃F{*EۦMK,yŞ79QzQDȼRbC 2 J0% +P@q ƁtPk>eO,˞;HǤ9-ΕxjaósRܢ/SIF%/ ^X7WoBT@+םX8[q"t7a# i鿹?g~&m EXR<)O A^"ȡA߸š Ƨ6z?J=\aisP |&[jԯ$Bɀ> tg9.̅5Ձl7g]s[X, p 0$w=zkGqA^XZ:A@ Ɉ_yTQG?0.%vN[TO;8zy̡Ա0aY݅teoQTw:}`QM=.zT|; D8c[ou ONfHK W@T6zrגtg.iOcɓO?Iq &y9{Fo@CCwYr2U0&o3WnFI[. *|* .h׮],'CU$$Y^·5iiiݐbN#cКr׎TD=t,9)nQ@xraw˩Ro5>I\cߏ>g̪![a&(+WY Ҁ+'QN"ɫ_ݰtϭ( d⨺mxYyk\yP+A?&5,X#;c7YNh#Ǫ"v,_q^xNPLUsr՞ٞM5@ VIzF]MړGE*N>>Ptkq`R2ve,0L~MtW XaKrKVX~IzV._ٳE(Ox=MuPLCb@'2%G#lcX$VO={Ss!ېY]qҞ {/l5?~_8Kf{aFՀ̐@+ίB~N4Z3Ƌ0=OYF l>ͭoص[l:2& [.*ĽLT4l(-`xzH?|q!#cNN~4~u'N`B8ͯTX;;]6/8V֠uӷSB+O:. ٟ}hQμyT-Ι* Р) g= U!5_r'D9AbYwv,&kTd-rJx H@ʂ\yrqE92EnG tBO};5`7]@ |,U"M'Yr;~BȚD!m5.`E 0+>mqySQya<.͕>nя) H0xE+."# xsb3 5jjs~<e>;EėH@zѠq))/PH@o@> l3U >{E<+ȦAf@y|4$'JeQKW([he' 1n^0 (d p3&&xwN~Ey: 78u<{пsKiЏIQj<Bg'Ō/@>J"F>'";4賘(o@H`?9*+A0HD+mY4׬Dv "'K@"V {T(TgLjР.8uFs$vKH/ P t_‡[0W`eeNbN@Es^ z yqpQЧ3'%vɂl^!$!3w*o&C5h7^'4ۗDj^x%PI'䤸!AX- `FEQ"FrFBy  /x8(__ |,$AJ4^nF=5GQA O>Cx+÷0M{h= m&Y›o]V#OyAKݢ 4@Fy4!#\=`䱠'C^O芮 r)l,gנxp!;РY OF@UrN?n(cо? w)74h+;ˑ#w|yN[T zyAPȅ1<< p%碜yF{Әv/~  Єq05h'!;T!ތ_38W?W s)_,K waIRMy4!cB`@m)obތ y2Zͪ@3 モ@4FBAbXFϾ(_߱HZXm! 0'#!l9y֠}E %'#<Ϲ">I]yB12 F?S> sYd5 % `xK, aB,mbJ҇(' By ķA "L7 "lJP 3T dA2CP  䣼AAGy A!  B>@F% "@NS|͔ + 1#Bc7 (XADb(xAD"bVn 2 Dêd@b@.(oA$ N߫@FA:R~ 2PS~ 2PθQA 2PU6^ 2PxQ<Ӝq~AnxT%6lxyڴirʌ+[ϊz&"kX%KdW\a.]bժU BW7 tvڱJ*eP}翛ODByB6/^Lٷog ofARAlbPBnxF" O(oA&\U9}7| l@W@u?Qi  ٸ5[L<@A x1@=AXQWx1̨W '7@q~%') 9orJqJr~T܇8?^C}c/{$ʻNN׀|iǩy$. _1TA<'}Y}ޔӖӂEtFUNN!9<Gܗ07 qrp21ދQPSEAb /՞X{#\Y@ ߁SEq}>xSE,7Y 0>+ )Ü?3 h,шc 3J,KĐ9ag*J0&]o3]898?֠o\.,"!,=%ՒƠ7"B4i(9s+ߩS5f4Xh"̕gB_2m?YIJj`>Fh@,xg"\{21 +י3gN5,YyoP>c[!A21X^i"+HhЇ(o[B"o0Zh5l ?O \$s$tbUG4 (oeZ`aSE^j;-x~ x_rk0qY2V݇0Kd $Р68t7 ,Iי;}TOd4hW~0g!<"Y !Ոͥ =U cQȔ͸EڅfhѢ׶m65|X"{ZBc*-5LR)Q)p</[ k f oVzڵkݽ\#`i ]A2(I/0NO_).R%t85T,tgV!p7g*T8i:tX }NdS$5#+3,OvOl|˹2988K9$ aI]!R!,2U B)JrsZcXpw}[ٔ)S&@Hsh d5,qfrN0G#%18 TӒ|:A r~KvUF aÆ;ݻwts &s%2לd`/'p01A*pM$SHaa%G6UlVڡ?7! K}be2OUf~"3\d_a >;_$H=B9b<8TrTu-^@ +ĕ̝ MC8WS P%xydN2@D~EE,`Сs+W|LumBLH'(qePl tPxv=Of;vdkf9X""z9J茬Jdՠ2/7nCuc+U;q1,I hc~(2=qhWeTXw}WuR $̓[5$?fj:2ǰa25jpNʕ3|>e"YCR-PvamsAFeEǨme$ܒ/(_%x8rH.]Y^b]r{F-$/+Ɖ5]0d?~k!իpڵrtשp2OnܯGE8%w+VXvm۶mY b]2fPPJ7NDx[D(-.^sҥ 6]v4ii cƌQhke&ҡv2˗{9svēyjn .U`|嗙>+^8yewIol40x`u ru}VNE /_Wu/$ ѣ:n@{f.* Jq#FvK*u7ꮾ{M62h۶m׍?~W]f͙9s 5 8z`8s| 3 oPpL&ĉ#3=ċ/UȧK.߳#GfG}R}"6Xen%2: ˖-u1O[7ۨQ  7oҥK=B۝WzC.\> i&י@b}C9*4Q2Ǚ3g>k֬sfp`i@FR )5@ќOHgÆ C ,7sLVD [ou*--׵l"[_ |v,?|*2ߵk@dkDf@~#0ۏ4klq!Cu:CK1tEinpΊVb4!g<o Z?CT@UIq.&BJY"39QgӋ\rg5|xzMH:wod#G>*T(S3e{кu ^'\ԩS8O;zn'55 o~ɒ%/-^X{whο%Q0 }?Yv]V#)3ޕ|Df ǠV^E,e˖ 尭R<$x>.\x[vǷ~Ν{kk Ρ=ЉERqK5(>v@M _N+]tYd_(RHԶ͛7u>5w~ΩQwwim7ˇ>J{Ϯ:uZewo}#vy _\n.aÆ;]|>/JT@uc߾}hx9T<*6n{e d`Iaۚ9"+V,=6PVsgn]TfF֮]d?Tcz^ժU=f]'8y(Qq7N؝Yٳg36T׮]G7+>`y>4;e p &/ޥd OBAtali2`f 0ԩN~ß]3@FL$N+fen:"< J8W^Λ2edX`\}7roo%ȩ9rwN$יDNE7-'OҾ}5Ō護:!$H BRZfqMsst9KH2)ʕ+ڴi-[3SYR8 _6:vժU;lQu?1GR" #n2b'D;2H7:d˳w bj(hܯ&3z A_ -2 `H7:eC,ٳQf}7ڼ`1 qO:֭[頴>oҤ6:5]jvJP N# vDNxmذagU87p'p J3үHRD7 p=D;ުQk:u̚=*U5ڌj `֎4h֭> s9 8VVPVvbm{ѵkeNOyn yQ ”T-[1fدG!!l;V@ڝk0iҤ)g3`7{XE0~i^O,ϷuʳDD^ύcgΜ뺱$2PPW2n 4+Wy1W`fO7+x/_~z;,R@°\m(Xp$!c?8]p3i96fcrvoܸ1S n' 8 r}.`ԨQMrdAs;bE *2T|Fy c*A }6+W)^-X: 3Vo{l ϼ=|b; ޸.=zȔJ*GqC)c!gc|&Wqƙ@3M%q3s0&/)2@76^$v{~VˆdD= _)m`j˖-CTߧ"sǀy6Phך(1AYgHLdDXvT3!xVpzcecܹ6!*eDǵ+_./j[ uvIΊa0РO!mEm5%ҚMA樄Yj#prgxd|P zP­AX)0m͛7ݻ/~Kv) {A}tևpoX-MȟJ;S4<2Ox8 Pj t e0OC Ќj aP|oP5J[ї[|NξN(ٌbC{eu0ʱto8`x8m@ ckbEzXW4 `pvZ }'#!kX,˞pBRfD4Fѐ̃.!ܣ/4O6TEw|f|PKV t@@<˗? #$ d> n~Һ.]y?WRZ;q/ <$? K!4k!L$UUS1jh kmd)SvB܉B/]9ϚϰHDRCC>N;}5kք].CJX$[A.B %G462OT d1&X ;1q> STL6{%*U=V%nj gMk%DzZܨQ(|`2w>JC1NSa| S؃,jYT< >3?ާ^zߝ8qlx5h [d,s'HZQ}D<2ԝ_`O0Z  $) 0 h ħ+V5h"Sܶ +hȹSj'$Fwኢ'<JwY+> Y N+%Sbgԯ_CZt埖Zh"TTK')"Xb5A@᪠//ל6;"+*B{y@ 鑲)/f@\IH<cc&hcs`K1hP=d[쐬|=,Y6ay pӦMCQ )Q!fI d̓Dy,#m~ĹgYd~.ggg,gTH 4k_^d!D @;&AmE @J<Mi/$"eX$)H@A_cS,RM#djQKD9(3=6!_}gT 9ŘF4}Db_qI-Ko2OE?NE,g8[YxiyE҆I\Q=/DNW e)L`c3@V #$ d LtPL(;糈Q* סּ\RIzze]awX'lP2l nH$dy_4>@0aryXbX2G۽{jժe3gNԪ:QEFU"!d$d5rA3LP-p'-"U-p}=zg3+wywJ싫sոyC2bb (UxF_f$9, -QƩb<[hԭ[wӧ?`,X!؟kǺW <0o%ܱ} f(SEt% 1^1DZ|۶mQϒ?SN+Һi0&/HO$ORd`ł3,8Z/|Ӡb!exLS /D:tg;v ]vFj~Qj0Ѱy@28O‰a:dz­*o@E;R8"Y琄@LP2$},̉X` RXP4(otKrx zaO@E\Xn{_2~EJ_ddN+xEudGʜ:,YC{5g(oFSoiv0-VdϦgEH_S(~Ni 4h; ᘉm!8E90  & 4WdNǯo4h/7@#{o&sMTHAu4ho7@#!<K[7@{I\H(Ahn(oFx](A Rf^נɜF!2H Oy<9߭A Tu!3 PܥJ>A 6 KC8m&HDpʺ?H  Ј]  JO, 9q*.*hV!(oFr!x$?iCfr'$s#{4h7@s<^`d m%¥A;PAX#g_`. J qJjiF(o t'Q !hB"% s>=@Ν17@^4 ~x!PIϬ;[2{%AAFɜ>_kжPQ"՜em"4W(J9߮6'?_k.)(obnzP!ά5v }r~ϲt,|A Eh7!Y  xEjǓWցdNdy7  (oAAQ  䣼AAGy A!  B>@A|7  (oAAQ  䣼AAGy A!  B>@A|7  (oAAQ  䣼AAGyBc< 6 C!  IN~NIN·&>4~g= 7@ 9Q]=%ΝAg7 ӈyWVZs")YNI᣼!,c?ⷂU_kp㜢H~n<"Ȫ^>󜜜_hP]L7<}&:ؚi"/bmm$&xtb?qРP\'lg"SԗM`VXPoYd\5{W- 9^ 3@QaDhc&~A&2'(',ү\Ղ262n+1"OdmO0P.9H._Ȍ)_)"`Lp/DVX=۷o=0^ 箍O31ci5 hGrCX~BW |gD^'OHV%BMQ&EXdE?/@1>}=5sZDx+Sg^VU ]rvrkϩsf[!$} ˴!h%ȑ#ݻwqijwvq.r` CwLZg30Qȅp+(`޿4w[Զo=^O4H0Ƽ^*3^nV~]v]&yz`Cp#/ӏm{&w>ᅌ| ZطNm߰Kxo+hǮPZ|5,tK[wv28tP%J\ԩӪX͟?x?TSڵkmF@^@eO?dяY_6f?-A Vܬ}p'AhA?By:/md2ĉS (>Nhb0I 䥒W:wʔ)m7wΠV Dr{_ՠ_> mYdo!]QbFɠ8n8=$^&IV%Y[pLWZy2(={ ,^/^0^j7C9vD:u,Yw}צ>b_F浟 OshhA_VqNq+,j-alKW{<XQRZ%/l`ܧAD:{0￿ƍ݌Ϡ۶mpEu;wqnm/-y21i$_.\C\"VhTKcÞd*QL LvFI %T=0 pXJ/hh#Tr05kP3f̘*T(mʕ#Ç6O:]/YXUV=">`4i(;7L2% yڵkvɳ^z{g͚5G29Ϧ{R?TLr e`H1U 0 D`r ̐ͮ|9ŬD*Tp{K˗/q ,x[FvXu^0"sZjQ⽼ccx\7 V_^}qKm1ѭjc%B^ P90K^~ Ş;p"=DbQHk7nk;v%K^23dȐM27x_OœM%.8pq"U $Do,4#@ՠx[)Qye=ź?~ h.׭[w/ϧN:o][v^jf#+oƒK~א/-k]*g;eXHFAp᳿K{@P"3QVnӧO2>4Wއ%|# ,Ǝ;k[-[6>mvH@E 8::g2Rڶm#޿;ɓC y\Q 5Yx3 ʒuv0x $qʼn+^ō\`0pt{6l֠A]Z/4KMf5R-k~v#ɘ'$,g*h a!:~mXm7#>^9vB6C)^DX4k.]s3x'h޼xmߵk@8+c!Ck X 9_zQU2eʜÿqp… .|<m2a#k snuN.k:KE d +^ ~K.}a`}]8s wt8YdtϭD{.\8Q JcG DA\kدQ C0~ݰaC]yiii],Yy`G@_F,8{XOl7E\#cx^| `o.~W޼@ѳ6Df' <"]7TgہpH cVˆ嗭Ϳt$]tYѲeMH`>>k#'TجY-ngNDPgϞK\ A5l% SYl {&cuƷ~{i׮u_e7.׸.YVaZ<1bėj_:ww͛7vC,~` YK7'f^a!e@ٲer% d!!,R,L#!d/%W}}߻vL/X_! }Q^a ,JK$=A^:+S_H+V)x,$C. $}9L4҂/"g'YBKjW24= J;/fv+닗=f|a#fj `'8o\7P YxknmѢEUc7od'Nt֞j ߩSU^q*UիW+W y[lI?g̙?B8((zu[AΩX 6@h 6l!'O{Q@H92!JVayrlq׵BOߝmРXXyuRP ժU;4Va_r>裕p6^rc;F@N^Sς!rᣦN3 彭nøYkX\9D* H{LˍǕI1J,_Gl@(+?YiӦm۶>8pݻpTM'99|Biϝ;w|@BU/t׮]|w晀B: 1@~-h߾jD 0`ĉYfʶP@YY5T>G8bկxj/4O T;zEHRyi_Kü k׮Lϟ? ÇpD93\93f ;^Za,x}d 1Qd ڟj xWjeO;vI>R>%?]LCP¶VQ|iyiç-a v @n1u5?p:8~3}xbO~m o{<,;6]tY}yY E _#P[jZ7nFX[:,?av߻vtolClZsWL<1{w ܲdLL2罼O<>SL|Ŋ>Y)F'fXD @>,#?72(Q"}_dt D3|'YnA&Mlsτ n|N:Qڵ[G>},xa+CA&3x7i(1Dž;n|V#pחz0ߛ ]?Xe#5_ٲ_rH//M0x韏5*7BE+P0yP gPqڵk?߿nݺ{D lf;{l叕( 釱GRMx={IF۶m<}-[܈J* 4OFհaÝ0rC+z_8qT'Rf }U4%E_8~}!U^C4Z)/K@8 zya]yx _ɀਆ ﻨRYNH ;v ;'T8xϾ"UV8~&ZA֭2;@"vѾiӦMrC t'"ϩ/L3fy:뙸vtozpS^ڢN[݉"E*yX>c F⟋/2O@F/ w[o候]Y@ i gdz{y, x*WY?F6HtA .lݺuH>HA*"DJ{)(YEd,fz8p|x8QsDsΝo5kĕ+W|Gz =5vm@1>q%Gꥌp;05SYV!u=6m-}|_ְ5o9qu/ ox#{E@,UXߗ~Ⱦ=Y?G/3&p*`*X(&6U"˥Gf?p=DI ҳ@}zz܀w Ws$Ƌ oY0|B`EĈlP|go\eS5rި(鞭# g B@0s…𰷛uc;@Z[Ap~˖vx=/^eC?˺g,aOͯb泊[a%m$1f1@]ێX$L)P9sÌ 3z}by 2vfڵ=+ ѹs2^jU,!g`Y!u_F9m`3p.\3 vr1ẘ\TTƝ2B#F =5\_}8g׆qY!A/ 5̊)yNo\c/ 'j]A6 ]CժU`FhM  ,U9wonS4Mɗ(b&jL?;JEP+ 6.(HQ,ш XQ#`%*{nٝݙs=3.?Tz?M ~Y\[񽂅8wMt ;s=s >ӗ=XrŽzzdi嵞>1!AOA]]R KΊY;iuk K{e,|ӧM} 1i]Q34*yǟjCN|o3[JLߓ+n$,2C{@7yގS(iF,0x,~<N:}|=Q2aW 2ڣ&* RYI&=>bs$'?Yp42mg .z!u;klU֭Yҕ?V"QDk^p uܹIˎN *W[ q߃Nk)Pu=,zԄi&:>*QfԀ,G-Z4WǏo(N_(YSXcbI?Sz`حyG^!#I)TƂF@2@5B RS~Qx?34I=ce6{xNƍ{wj5TQ_Dxʠd 9sR+8GXJ_&(|Pʙy0*&f(l$oԙ1 c^g+[yFޝ%c X g0~ EpW_}uCWIyK<^ WO/_:( 3S0l֣J`u]wmwAթ/c-u+pTwYfrةEJoy)ttڣk^zmU]0Ơ߭[&p pG G~O̙3o}'fx|RyI9HԘ9&nĈ+0X`S>+l^yY/Q?"5~$3ʛ ˷c_1cniK]qq:axٱ.IBMȘ~X/|;8\qOi.b!|VN={.=xp{lnی+VNX'N|^zx?pC{nIno?;fw[w@MdJ F rBay׽;T@^K%5Y̝KAjYlYQ3@&`|;>Q[ur ҃ /AŋҎ (}?&Yx`'..ϛKPAH?̈UjA'R|eZ/qmnÐ 26wおFB ],)9DoT;Wy _ >> si裏^4({soϋ̘1cs9<餓a ̜9_(#4azg7P @W΁(ϿhV4n:DAP=l|wϙ+܉G"W-m5ZRϞ<ßw 2n8HEw' Ĝd_|d+{U>;wܑ"2Jڟw YƉ{V ^k׮u] i T ?.d ?] Vu*ׯfQگx', bXP0' 4f,X:Sʟ8DCЀ`@i[L>}C׹&x=[ Ku?Y ~F`_mi#.miλJb;ߗ`pZsro$FZP$,]ߣH`( 3YS`3@`3\8 Ĕ:V?yi=2gώ|<䓗y+_8]2BkT ({x1J/?fR gY9$b(,~T.guAC"Ѹ~4P!iC=*ʟ C6k9TSYk)S<@<lClnk /^ %=d]?% uPGqG͹{yI'ww!a:|-XP(xVHz?5mw_ D( d) JBo'IIuqY O нReNQxn\˗/A6mڽx Hc\^9]6ō '?V.&o blq2'Dq䂁CXoTC|>6tTAKF@]1$.. Y O=!O ~?+OO֯_?mĉK7-[63wdbbIx_#`̘1K}.R Po_Q^I`yKoiG+w%1>B(\#4V3~ %"1•( *I@[!9Zܢ ӄgWJ:j/Ml8Rɇ7{lHʮ˄3 .>gRp%Gydp#4W MIycK>(e`}{XN=y_8{lisQҰϗ9A5⧑qQi~OY8NHrb%LQEˑn?ZLr8\QOCt|') ']s5 }oZ{yL8>g͛7,D0lf"yt^6:歛oP}?K-ө> J >XX0W͠ow";syne.[ GUZhHTt+sjL}إoJ6^z\ĉC1"42?}ccƌy_K*+7]זS#[N:ʬ+nk׌/f+X4ZRu[ޏ2οkr7@DKO)SQE) ~97E%P1w!0 囜kwO/bcC]z4,S 3'+/]Bߣ G {vICߢ#_Xzh>\fُzEǟe/:ja`"lhH0,vضqO&[u[Y oLG>m7w'sSZ*6t3]yI^9 lBikWy.ZvXߗ 4ϯ^t>;~(ha@J,L%.Y-a C%~p ņG>(.mh-[li--u 4>+Ϙvף{/0CXp=U%/ಲ|4~%?YTq>璘RߡqohP;{ `)-EI>Q|?5h3.SJYsDR%A#5ʯ,iq/?(QaGzW^0<®|JOP xUT\tbрO0-G1nc^#>Uk<3'ݟ;SuυGX0͠GL_$w2ʉG=ttH u}$L,; 7(I߱`j}YXO{g |[?>޳_YD_gVur+[$(BB? d[QQ&,*6+X`mo ZƯE`K|p8WȀmɬl(J6rZGyXQnf| X s'(]/EEA6`j<9-MKi<<_ۏ>>Fx2Hht9mJ,<9eʀjf'*Ꮶo9Z 4e<EAE.nMN\h *\0]wQ#1N(jڄ+kQ 6S?W6ʹ-y dFsU psJE/q5 {{I}Ν0A0[,+ATrMp GutJQ=囓h%ԔQ9Šse`ZU` ` +JYblPu'/: z>l=O9TgW%4{22$*15(4Ă ege=|GJqkȷ0v@InU#~%~e)kA{%*xh>L=ρ,>0e-K`wN/h1Et_WgԈJ1Ț'*1Se4R^ix@Qwa[J##ⴿޭbCF,"1׉8++*7LD%p"0Q|BaBC9 cfbH4"b.XY{#Y063j)(ML?>6|>m>}MUTx (BT+kaZO1 @VeWXB!кd٫fЩnENu铎`顽_@I>ٽWM|CTvJdñ7-hIcg'+(p@hiF [ #|MT\6 a.*lmgGZ0di#Y !x1I4g(~lo f?e@. 9Y=$h5 RZTrldB{oQBk^x\/+ r->{Xv; X@qPlTr<w@ @@e% 5Ay~ywzhDăzXI |asHΒ:ٛ:f7V3pV3jJ\(WO-S-?P  uOY/)/ʸd,E7 t|Kd 6Vk@ L箵6"ozbz~pϱTԃNl/4 4/;uv?oG[v sS/*ysn_m {v_1UCc|V5 xs?)rU]r#)(Qu60LYN~׈`^l#7@Dx)8)P\!23 ߲`a| 0,c`ђ2,#b8WBJK},ZobB2 s6eGk $ s8*)-#GȌhO݀o%9\u`^jM=5^."S+n߈5\d&:aYp#3*idQuvcHV&%Ȝf]9؂ye6_v\PˀRy1'Qo3 B (rqRU{8^ז C#N\ X6`܎ (:0? '6oޢ5f%JT6|@xDqMΚN2EZ kZ(A 6Fdx :Z0/-2EQ΂q;_ðESB-B=/9{9G&307,B݂1;ʇTS Sɦ9cM {9oLFEl'!dzq-:+ l''ux!H5ڂJc|!8ڄp82CDQ(B~s8ЂJc|FRY0VQ4)n(.w VMa $K1WhYl/*ŞLa:q_i|a|AK,^ a&+Ղq8̃-EtNV`|M PϹq;Q\.Xb/BtߦǣXB7)sMPy 뽁`{ O(r8Bc8<RDjXM:]PcTSp p8%2NĂqEb|<CaIpXŀpQ)lzL|}=F6>h9i׮]m۶mK. .PhtX{l|Ռ g8GcsE`jW*3a#`;(>W5p80>[k@p؄؈up8-m3a` a_pL6p8 Ҕ~Y3a (OI3vw?Ξ'yL߽޳3a3P6]{ zy>N;vlp+pp N;vl=eK@s/tA_jӦMõosp8DQ=fyc\+^`0!?pFp8tc|eEIǔ_O`"b8#p8:1>TCCy*?pLoCWp8$i`7wvWwY3Ñ0 Vm=vH)Qƍ{w)=(pFp8`|&PWk|JOz|{/ٸ3#_c{]ߘ=Q{}Wx\qGcokf*^ pb QW{{ldtL,AD`4# \q5!NW,Cvh|M)(8*f!োq(k@ pP?)l =,*dPD=c@EeG[nk.E֭9QuFPlL_e 3Q(j\H(PK V@Ner^kOw}Wy/G `Q9:8^6xEkB.Eh婭G7DERyC֭{5 (խb_oXPڷov*@t|_'=UT r? H=E#vy7n3:xOP8 $&AiqCN5QTw9cDjúNڸB|zBsuaλK9&Sl ^C_玖  d̍^ n޿U2 uRS aHȱTPf̿M? 䢃&?:tiꫯG0#␅|~N12cޮ'ر<$2K-7 Tӂ9 v@>ye;[l٬N:}RR #Pw*XI/Um@ƅ) X $ԙ \IJ<38؂ZeeoqA=[;v3}E[D|iB֪Rjɓcb *1~koZ ,l_\}'gq޽Æ [E{޹|?uuuKt,j2rNK $?4r#_\GSX ,y4ic:]v]{EAi`TO?=gϞ]Cy}]tJ"{[MSOz… Axw|9"gH+~eQp4(kXh.k,~w7s9N;/뮻ߗW T.k~pQ{~"s p ]딑A_ҍV5kΖ|@V,( XcnU ˌ&O~4o') L¸曯3g?]&D'{ ݻ">dJpΝxa K{cZ=xGAE\=ӧK?2#帲e=zcy8q%~ԥ1cm9P^GSc@O~Yπx'f^ڵgva^„ K uɨy2CTmg~A`xcf`1c,5Q=fI'! G|J_7$?Y682}~I欟gQE:t}yꩧ>\wKVe-v\ CW^y”a0YCZ\4@9]dԨQf6{[ ($ylhЧ5y܎ G<Ԋ'Zy\k:5qY=2Pm@' D{b綾^讻2+n^'8]2+cQ{{\:L=3)s/rGq+{#06lJ7 K|.S5ewRd7H>裳.\x-rHe.(0,6XE}HNLZh|r޿`{UW]'K)߯_ɲ4eɷ |ə٨ʐ=SXtɭEAһw﷉Λga CM.C2eeOM\e)Zv-PQ 5ڕk5 1Df˺~AF|\8IA`aY5G)ÐFKc[a_(oC9, GQ[*`PCQJ裏~.-,hsC3_D~pײԔe\*AA%[3qrFex^8U ׿k9BSE){_ lĈ+L#Sel$JJ2e@gO?}Y8ǜ!a?kfa/_~i!x7b_=D  ^^bJᄎdX vy=fVcL6/Hfysj"m8ϣ#$b IJ?Lkeܯ(̰YnR)0<Ǭrr>+Qu(8Λ`;wMq1*aI/įtɱY2W$d=Q=̀{8 -Kgq5}x>-2u!4<(e9.߈) ,^z"xfPC>x R [mtȌG2vsAǃŽ(k~CVΏX0 s뭷^Ql,.e+M.E$QJAR6Ez¿&DkgXm!'w W2X2ty8ו"%$#{딥 Q#^I`׎  JnT#bJR! Dբi*~%M&E}THVd`E@εG߾} g뺮.ꫯnqp7f 5DС`ő{od9oB ; w]Ep4>)K(mg&^AyaXaOj?& " D^{7O^1R#f׃jfQe;GbN`xwqOr^L] ӄ`@ R6zk,&^x$ր^Oxz#O *?'WÇӥJy8Vqw=n'Y'+^9Zwl5+f1v˴y zNG@`aXrz\ 'ӎ^ KQ2%wy6^e#A rESׅZ\vD-\%Š8ʔ:"诓!Wk^_ٛ&0*sbŊ>Xp~c-h䠂׿qP3IUTnK *^'/AgIȒm{!!јL}LL xJkA(g$&"i|5Lc=6['^eq1g5$ lk-hbKfye r4MhwC f AZD숷y&E2֨";.D)X劣+iT40BׂP4۹sH%M6~6 RfnT I2 f5(h-QZN%%sevqKŒٸUK+H:jԨexD1pHUZy/UkXxO81/!C'}W^y?ӄ:ijnvy݅HE뻺0wXKjlԋs#I&07n2 kh, Gew2F\i)Qyɢxgn:,HIgy/ v`!Hs1 NbŽB8sHZ\$)! Ak`|9ɀS б 2@b$yJmH?lV% ,<5qjʜIL# JSa2:GOhdɑ1cjR%*>gg!$P1,z%?tQil8Ybn v;sl<( 16bmAMv֤;v^Rqc 9ҠfkΤa9a};s!yJw"8nmsYI@ӣEXl٬8"84Hx ɤ77yeXڛ|( rNc W*30E.⏁=z4K#^>i#;7QܢPe9*c}pD 9&G5Wv4G9pxv#"**ul82ή@A1vԩS;{Cy͙3;6;&Nl5,:'wxيhtcjqnJŐ-E}G?8AfN8;L:?T1gAeebt! 4HOַ)5 2 Ku?MK˺a"ȗGGGSrd.ϧc7o{2H3Y4<4\rmPKE@E5:ji)s%e Vғ1,US1FS 6 U?CwTbXxnx*OݏNH[C@8Q 2Q!`\^9y6s\@TkC49; *W\^pԹXRT5%Q: U`wCa52n]mdyUgiyeJ}=DGoiX0M<Ա(wT}#y*f3eʔ:q-.r<̥x4] 9'<TޣEES63nUZBZ"@&*פrdDcu2!N a8v5:(Xc>CLA#|H*pݜW~yެ=|W_}B>*m)awb"3! ŔBnwP-"BEe?hРfpR@Vv nILw Fb^H3Jp:/ʯG/ 2Okh0]š%FK¶jAB礬+~ giEAloAG Cȧ@1%r+t+{J^8,b/W (̹{79b]"DmV&Tn4C$qq ıljNkbc5 d廥5ZQTT'١zƓWKK& ;u8Eem`9m.vox-x2n3U4 V0:?Sj4e/ K J~2Ja&C2˪*ݬ^6ĠR,('yWJ!@UӧO †6{G( 6ןr)aOju'Ɨ[ {Y~W<:Plb &@9> 7z=$SWXxdu>*3CVy/uUW]uDl6<S, 뿖 дs, IT~9$^/u/Kb P)ha,ߏ:I_iנK EeW#qeU zR EXzEBY8Jb!q$2N>(k,,iFj3  h-+ ٍ, ]~Ϥk\n1IUMT di<d-h!4})iP"eLtjO%Š fdp%#b3;F[Ap9>*]% {o 䝕G-2%sGTQj\< ]Uu-M#2Bh GOpUlIػ mnBJ#*DKN_0aVq|G{_kQ|N1o*ףR-_ؘP'== :|Jj@Wԍ;e:1FbLd@ \y啑5Iz==SNJdvwd3q4ŋ]:YK!3/R eZ8uZgZV|OzN-UW1(XzlCM R(ܻ m_or+FTrC`1bbyoK{\!>dhܸy)Cl̷ :uF"} ^'kvL"Ɔfw@|^B9`NLJḌT3vյznITnyPDQ(p5J=l/灾j6B8m'JQE{蘌UVMO* ae-` |vzU&Mz>9GM[zD*aM6-P(Wnᚤg3U^؍ ܈([<%\ ?sA2-6i E#/,u:H-2!̽.;'QY_vO<Re 1$ܽXuXwsKӋF8Ղj.[B 3l|rϹ } ̙3fPsƌp[ 3t@F.ĐoZ[lkzhpq t*2Ex󪩓*`mew S@ *Ma`8YJBn6MZRF -k S#;1ZUڤi 8#F@ KЕ .X˂2--#>ȥ2>2f͚U=)i3K}yJȹѢeQLBpL$p5}ɖ:+"gEr, 4P"3Aqy!CÎ4g_VGAXpAʬgj1yЂ93 :0́s0\x&/H6"Mb4US&xh|0]Q⧽s-@d? ķt,\i@)A8#->K@2_W=륚s:(DGAƲNT6;xŏacf@z!8!) H2yO F w;w}G&4,B`8@"wʎڴrFU(Z8EQ[|GR{'h Ƙ V8Bat.PFӂ1;w`|ςq*c||fkQHŘ,!0ThJq*Ϛr4G8ٷL@:UW 3FϻDRpܼۡ)ƽ66Dȝa{/ޢZׂ1Jc|*BIzvŞ=B l+ 8 U n|AkP`7 G(EsR4!ӥ9k,f.ʿu%\ג@SQPEđ{"va&ԧil;w8̓`EGAʂ:B)vި*`֖6>8&BpUp8R$ Sō8M\p8:"7` IENct8Gu!`}X]ݢ?̂9áEq:Ñ>yZ8p8 C׃<~#*-Mp8R0>p8c|p8p8(p8Q>p8|p8Gp8j/IENDB`teeworlds-0.6.2+dfsg/data/file_icons.png0000644000175000017500000000430612140200333017166 0ustar felixfelixPNG  IHDR  pHYs B(xxIDATxiE'"^ xI<5`QC@c4jψ55Fj[Ap#ފǫvzz{{gvK:U^U꽪p N_sp j *_ p8rd!o6xJJra ro9O:T{eu*;-mʗoRDJ7RKΫU.F)<˵L2~E)R7I:Z؎j#;o. w+05\5zD_` ž7r7pnp01/2p~4oOJА6  ,B| ~G2#i:I}jd>{Lgl>I(M&vp3ևE@ŚTƨc?62\SI&Ad ?=sbv 2EHœ"eqA]:󿈼 aH(r9j@V@Ӑ߆,_ȿi' [5m0 wK)&g\4z,~ߍXӁK&[ǬCXYNzuAv*$L2?dIu ۂ/77 IӋvޛo91iO˵q:% Nod7~ c`_@H[_FBːhzBw e XoL%foA).λP q%A_ STbϛfo Skĉp> p4?E7 `&k!qE$WϦFG|v!Pxe| Ñk"&Y)-d c8daRڀ,lIENDB`teeworlds-0.6.2+dfsg/data/fonts/0000755000175000017500000000000012141202226015500 5ustar felixfelixteeworlds-0.6.2+dfsg/data/fonts/VERSION0000644000175000017500000000000612140200333016540 0ustar felixfelix2.33 teeworlds-0.6.2+dfsg/data/game.png0000644000175000017500000040250512140200333015770 0ustar felixfelixPNG  IHDR IDATx]  w徂", t++7xֶQYkZmԪUVkzcALfydwd2d6;y");*yjWZU z*ӟ)oĈ#F yA_s#vvt# V+2V^ejYk#F3] k/b̺P"wCĿ&JG&@Ĉ`G_k}"F#gg`gZzyp/ߴq,c{p!F=m+3ΙlluJ™vY S43}2%"\y羜Qk/X-Ap!-mYN23)co-#D!Bp8u6cHuz1FW3ZԣUW#g hLwH#!s}Өxs W-9c cwŒYYGFČIcߍqDgfsuZq6& y*Ō,hf&/(ƌ4!=u궴^ C#8vb/_Y1zt}F0XC5mj\9]r/SN=98t=iС&|y2Cwjx!&@9IX6ALdD!BP${taԗ#i0 6 He0MKɓ؃ QK %D+у}rR)b `-NɹĂs9qޓbJhkͱfcMG&@ hPg/< v"oN@hf?7d-14ikqݤh!/_~?.RL]p~tq'hJsAcƌ̀/9\9q*#?=Iۍ^^AEdw(Pڏ*fT[ 2B@ƊlH7-y6 D"o>J8&DQӅ?ZhÆbE˙#TYclq5q;oǙ`X[8ݪ<ݾ#^ J\' 8~ٌf@HhfՏ9|>$-^/͟J8}vr.~GeQO5 :~|Q6 O?ce xwguXѢE}0y'+/r^j^?E3>9`h 3ļy aU pmJKDu!(G/&GJ]2&@^&E@.D ڱL@jSx9Ra2Sf:6X&Ow'!B[_|_3gmfV?&cJ&L9`awz<_ 'm5I'LƎ+`-̙|؏<}qt^BK@E\Fg{|tj5` ,ZPC@+άs.ĿyſnLĿ Ri×k!d;H&#!B(Q$e¯ekC˴VMbRxxF{D_|at:m6A9V+ ?2'38N<V(Z8}s}nj1+ p" 0n7tkk4)?C~~vhf7e8uTMc=j744pC#`;qB8"('#͌/Y#a @'x&+rtztq' 8@1cG1b|O9y g]P4ſ`q <" kJz?Ck$12B^#bⅸczmb]f߷'XcFQ~/[D.as ѹ]y%ѵDO>IDדP8Ί}9b+]+ˮz%_DfX'V23e! ) Bx&5pf^˱A<Ë(A7T_n)=9QFY]֊yСDٹͻ&Mbg<[NM_pNXfABgϦѣGu>缏XΆJ`PM.ſ` ʙ1ƙ^) @)AML{VF8fШ6-CW=؟ fAoD*_]OƎ%>h8~Ft-Dޫ^6"N3VB)E-Gh{}n"@eRpՌϼYL4`@ Du%J9Oiĺ_$1vM<Pn TZNɷ<#hXٳ>y>sOhNp(9N`;gJ a^"bAM#CBOnaAα9J"פmH31s>ľsZ !v0*k8OԶi4=nJ4|8̞MtpDW\A?3矓2hcr^> }s~U; 4k|͑nbxNpȹw;FVi DMQ#[j,<&@ckffVGνn⢢&|~ `7ÇӶ=餓K[ })f i뭷}q}Os87rPW)2_J I{`ʠxk/AaF?8ub21( /Q7r80̡9\;U'7h':`7Sz":; ߉{7>ƟNs?\M fzI9 ?9 M>Jq\R0@G2L!B[ d9^}N̂7<GmfM]x1ryͬ]\Xu?3KyA |6fz QokW}TJf n {ݤׯ~0. P4 _ /ƽ0\8g+g;'U`ض1&_?2v fqF,/H+sDazy߫KĿ+=HkHI-ۊ0lp]~8i? `smES/\VS \y9``|,0^r\Ρhxd8@;4ZU.W3D3>B! D~O$vt!yA@m>O3}AZcﱛAZ_==B `gd0։`N ja>~Dcm-ќ9z*QGy&enAx"oVŬp z(4ՠDāg֣D丕Pz2/ L iYs3VE3 11wZ@0i~ mߋTCXӇ+:c3<˷ssf|@cL8C)?>V1fP4-Dr E3V +#@)=kJG&@eT+C`Z/ߘ  a {Q\m.6?* s]{1l= &y `\7n-C}C+9wj\f ͐Cd*ZfXfBlI5|(Z}g?whʔԧOy,/r~nF>h4RhW@7ſ(I$ miCWlk0H%7p>(׺] ڛ An ^C^`E ,\ǟ.2~D _$oĭW^p>jE ^EVcB٥8BN+1i *(_. s!S[DfW9LĿ3(m!3JjyA?8c8.dDZ o1|ws.FkJ̏o>X^ a/78w2JlWbՉͯxo|_/2g(r1@LD `tw'ZCt8<xe`?/}N c3yX3E@OY贕YHA:6ʤUǣyVḱ`5r8u,aA x׸si߇No0}YDsv]&z# |MO>#o#FبAh⅕D? ;Ӵza5Ӽyi„-{X21̟5 ti8jhʡݨ(J੊1fEJT "\\Fj WBH P1J%2 ?k~6$`QXU5m_4SӞY;  w8spGCk X\\lmsulۺ?s / [7 ? ab\ Ю_9W/=[M\h?^7YB@c3t0P 2e;I/`[dS i1=OZMu\N?K/ U0^~86l[6Z/^V,쵐0C{N2vqgZ -AD!Z$!/Jtqݷ[?I'n`fͦ||]vY]K G WI[YẠ_O?gj0^_AYi,7?#Er_d!!d.?Ŵ~c|r&5Ws9B ](0ܖ?7a40'9͝ &G ][bBHgQ[@1@7T1w'4h͈نh M{F W?ƿMtY9Pgs"V!'{p0WhPV]:̽dgKq˜!ƳVJFݘiTM--Ю0z>78@31wG+ {j ڱz,aV,V.[]XxߑGAd\UsP8ZBgUE?kF)G<{97T &V3UUe/P8ی~ NL[Ǝ*{c>4&Cԅ ۞\$]@qe;V) t?CPF-6"1lٓ1Ӌ,sBqs弑+sB?3s70=**_M^s@P++M6 "%Sa\yem\OqM !s\[k'@[;}MΗb'wK8+Xž {0Bsߊ+1a ML+sQ}X#Xyc(SC!q.᱑N~) s Iѵ`j ] b~DžT`'oKtVkn*p=@ONd+d zO28k `҇F*%` 3V"{`+ &HjQ@O /W4B_r_%< 󉾌JԻ5phimCQIYDpq^++gGb ,XaQ0u8F@łZj;=~A6%d; pcЍϿP zFdyE|饙?O5a޼kЮgϞhׇh~a"5Eq LUGEe4FT>_#AVi_ˈ>>蓕'+ӷE$b=*Y&@I@ obW_Z@Զ3ѧs^y1j"zt>њq:1UE󾟅c/(|ؚQ|.0sQ֕?|Ykk>7d9 uU*Q7 gA xix-2 QXi鼦Q\Z\j?"*%EFBUa{0J)2~Ի&@Z|Y}6q(VsŹyKnŰ«Ŀ@ q4[܈V3a!ӝY׉ tA|}p/?{aΙDlWeD@VLo; %CKD,<&@Q(r\O|'7D_^O9JL=* 9/ǟMc\HD@$( ?1ǺQEN>m0K5W -@g(2iA@FLߌKr=?zs#qNZT` t;)vKR >_aJ Тr̟Idt 0v|ggD!B H@2ӜoTkEaXQ-T)lRZZ 湜!?p&Ur!j4?+`lV rDm߉دdd pC{aTJ)@UJ f0&@dD`o@Hyp"Ea wm(^+1 M1i*9Qؖm6D D Z_Ms'{|;(N}v9ǧpуnó9:+p@DBCi] H> }ȇ/@SD!Z~M7/飋UxPgk 1p.|/2 DD@ >wr=n~]'};vj\SǸP?t.0^9Hhi8 nhdr-9ޏ}c2*Q 50 n9@iUТE tF@0wzĿ_& j!+QFdزhgx)ke('aNb>̣$2DB_ݎ#ƅy.~WW+?"l=ZB𽭈^3 3=ɨ#J6LJ^2~Ճe~O ~4D|C7AVOx . -W @AEjb&/ۈ1|~0~G@`8a {mނt so,ſ /6.y y])v>7.6 y f͡K짖X䱉sqÖ!2L Xwb Ld8DgߨZW#q΄U*_+ eap!CaTi8D*,& I@wþ!y ׉ z.'!NDK~S 0[9# i 8 x}>_~BO@6uQO/0QㄢOYMԇ0쏖~|d=ӣSBS|+}1V" a6@^7N@m྆h-+C[W v="7:gzV愸)C3.BMQAe W[b(h"@@6:|@"kXol1V_3&5pRoB=ƙ$s PUNdd0Ga% ^ ZM\O%.?_ /o!=!JZ ݌RͶ=Xm>4}yVȁb]kw[e=<`Qȃs{LowV@p PqmLogcuIf CADf~t }TY/^=/E*]KEwH Px2Y|Hhgſnd+稨/ <:nU9A5Ёl@@ @.5@S ,#: h]$gc_LERv̨*,<4 m^' (>+{ ů~{\_E u @glZ3yXm_|BNC# Famu3D}}5 p! (0?hk `>Y?L;?7Vohϯ| D7nIe#>s^hp]ȷJr=ע(`Fx-U'@h47ڛvi:cǞ dtj{71+hje bQ &d`43=I8S\c +þy5Gv73@Hm(Z(JHpDbt8蓳>Lhh f` Ą"!cd|w30jڎQJ@Qg9OCoJs+Ws8S}3TG܇1,GA _w%zj>5nApq9?| 55XB]pF/ya@Eu5bZ.=oλ]qTanM4^37L #xw/'AX䟥P@^f\[o5^y!z7 wTM{ dPy /ſ'&7e@A$%B``mFKc2b( o{+O{&`WLm>nѣ>9G7+^!fU_`QA<% V\Ot1 ݦDo6Un0Vr^4,X:5h) F9_&/ 3rAmW@~I8vP$诋xE_%T2M0(ϧſ\@ `.FP:wp@iH*XbvymٷHhf&/(_K 2t-Cj!2܈AE RiXV<0|iX+Pz{4|{!'LoDqqND"f^8$p.7ϯo!|7C.~7ɂ(GY>+Dm>?-2~ V(uEửM )۰uWys(m(D1 jyo~RI=!C5eFh6z.2TMx/nuK`EV4ELcL8#"*:*gş;~c ryGF~5(p3gCk Z+ 2:`9s>9[5߅ Q 6zl$4RnETc]Pi:e<^Y]kCE|TGK7݈nCB#'}zADoO xjo>NYHL2 H H0p.~oky[ l=\d(u༆HASC'YcY G{^ۍ-BDyėM>-ܤ@_仴w*` ` U Ux:_ۖW&@g7aJ̄H@2oBйZ{͵T+ ( &+En@q?Vw_fz8 1=vC`?c5JH}O}m =" EDˉG}LiK}r6 i!0 fԴv̵dB] wFmZҩsCr_0E樮T W5;3ongToCA\_ VEstBǍ2@Ij?e VV 73_N*/Rg; -N_0BFQq' GW1H) L& Q-{ q^ Z~1̇Gkqx0xBJFqfVuFD좯ߣ~5S"cz;;(va8B!R:0AS k KDJ| !kU0/Pa^hO$?k+ۤc!oO";LDSmZZU""x$2B}wZ'1Lp&9S39{[%c|4jhk%0C@򃞈9E!nw}*c!* }2B[>fZzkO9h \\!*Div|>1\]R^h("z?B@mL:c kzޞ6 'ǔչ {Z(@J@f71$,Yfp>T0 b*w`@pqVΜ۴9=u"#}"YG"ϫ~ }6v!@}ƨw>ԳgO]v͓{h>&Aa =2j%kf8056>`?핐Sv*J)%a2?TQDBzϣfc hZ؎pV]+*k/!~ x;CWׅC0Dǒ?&rmEu3r  ukqkэlˬP$uF\o7G?CR[*;~EAB|{5LUI%dcn)w"m7hwXMbu UbXB¼[n&؊>=6/cl^D3SIq1v3saR|nrϤ6y׊ ̍u#P0v@KUYL6&1j˛z4~yjsk0JRz&~snLFц4iĿ9x\oO6c.QN؊ *6: EGODjgfV;1; ?B[.Vg6__2MW%號 /öҎ нd,n]3D9dA T?n3.ML@©p{AJ̈́"NQ7Vc(u m\Cb%uHS̈h"'XM.|'0\(fjX BmZȅB[/Bg1I@Im/!u,,&ͽR>B?",Xpk̈́giC?K/׮ ʵL7Z BǃT`:!{^[I[@("`Y P,8!"W^i׍Ay_ȿKv.wa$bǮmi SIE%0#`M7]:5R6@ avuxog*[lܪP<Q&@9OoW*!Dn0 pN+{3!|0jeR]uYbsD{?M.fd_3P2wc `p.ޑ/oݦlH&~=AV"MZ{JDV@!=w3_Y󅶺nJXM=+xӵT̂aC]Abr>錥[7y!94:什qloq~4g;s8=cX~E@o^cGҞ &hm}mE_Zpm?;M@Lއs t͇mJKvO{RC 2\4`)v/DhԺ&@Q&i .`WN.g]Ϙվ#QL0swWAWf/ yZW9$x?+=u oSn#/˙(Tľq >d8-ļbak)1 BJHz`ds_i""OV`JLpf^ hy0:dpZPZcD'D7Vwk@,ތRNˎwSn=gy\CC:yf 3c~ȏcgI =Fv[c n]EHi:OHmOٰɍV xdghQ2cTRr,|u\6FdZ=a!"8 u o[G^C ,/UI-oҞbhS\Ā`#}h W<_%+~*,|;c %T 8&h$b&Ap#H}wN&h{yQ.{9+c=DGעv0-?l `v@` 0ə3x`]@^Ŀ&@θT*z^ݙ5()BA\?.aN (+n +{ َhghl6&ۉm/쓅_CD5>״(h BG!bq;>tNƂeJC3 B7!܇F-h"yaԴÄ~^!g0.`hQecPQ'a||?>6ړF JGwP$(,d@Pm&WmSſ@Т/(ؓ/w-v=@{eWu B9#GP34 `ʿ _NJى `"}v-ʵ+2>CfCsyA~Ԃ 挠&-" k-Kh<@ݜmS\j/[PFQ)ſ@GUP\*!BGF>W>{3ؖu lo/wh"DoD ? !kB I\G/?Ŀ@3``nL ?2flٯ?jC -z|a[;57Z0hA @FU!jd0#4Oc_FGA ZNyT\C"t2 [5V*AcVu 0xή` !C`37?:)uDO׋ ϔANDM܃tQ~e}- 04AgW)d7Í з 2:l_g۟z"Dd $Y7Iuʈ2a @3F[BA/"DV>Z\@BF>OVț7E 43c܈+XpalG?0~ bF)^FŚpay$QW_FG2:p""m۫ٷ0_G"t"@<:U]P!2bD*D`'N_m*Q_N"} BALM>vPF(\?sO E`0.L-:&x| P2Z)) hN9nBGfU+fE@0`3ёZg՘9)c%4 h7o5ע:Xn8e|G&,-e* zBC!Ux)1g  *-9` ll{;'i;Z-Y͚=Rl=9قvb̚vߓ:g'`I쐹3YlnX-.e5y102[h @M . ^ pIl-1[q@={n;0/E޿h'2d^N#AD};/(5}̹6@B|u5a3F2V3S+@pnCO_ZX ~+Z oarK$@͆cF>L'8[ &V)%\ᥰu$UW?"D=j': {_ a/V;wJ`qՕ 1SXEg&}_pVfogح;1k2N*jDW%-]Nka~$#D;'5-WV}Aj{Om*=?;{"ȁ݋:~EjpK -a=A#A_{^CЂ?" :{ @- a!/]jmrU0BePp$~0S'lQiX9%` !v!vUg:mƜ~NQ D9jP( A HGzę$~rY(?+>2A{_UUἎ$eqy㺸?jط\pOt Cj YoWnźX+VBl`! ;bpId8:e-je! 'ⷍ_p~ՇMmGCYavAE)x*Cp qa@=D^hч1m(pA lvc4b\n>m_7w3+9*FyF6*"oE}LVnΑ! I&o?)v 8 p^hTM?h@!)W*wa^\!^{]KQ/0!P/sS.-* h& emJX7ogT 2P_ĵtV/R-lĝ\D?BN䴧$l?ⷉk `}h DkRW[M4 A^|(?+fPlk }rqXyQD?Evb`(TA@ +p#>7dXٮ]/ :X] @+[R\@g/ hA LBF$#Dv᷇q~#Z.ohLju3 zL (?+].f(㵞s]mZ,C$84?yN zm5Q (6T/j[)$cot*4]&zynwA{e0L7y0-'L8|}g7}skN{[K5{֌-n8`\r#ϙ=vN; aM99;5,mRCߴ~vׯy}O[n߻ ]|~E@nthl">O/EfAV}8W^Dsq'.ڼD 8r1`P8m6F9R Ƃf.tFMrM{Pݩس{CxGOգß۫/}bԧOw_ED9g6~VTw5s0a``>2:p)4p.6*k.Esu{,1,gMŌ:|1;a\` !B;@"4}(~ '_s)E @.Vv+o+Wv\'!цReq 3}>alT䋼s={/s4X3$``BR(P-dz@{%AY,E4D|#9Qx=/!PA݋Pw+Ja#L+n;_X`Ɓ, ˫r.U?"")" H @ "]ҿ-ʧGEJ7^k(p7;k?׺񷨍I._|;#L=Gynw71Q6~ awgz!@tsί6%Z;o{m~ş8ok7R"m;Oe!c-9bҶ☾?hP \x`-/h(f(ry |s((bVךg?٠C`bx!%m_o@FX` VD?}y\@DR6 .ȃzZ#Hwa{5/x҈#ۘ!B$|Ce~p>'4S`ߤ|g_nDUD_o߮x|N3kX`gn.+/c6Ʊ|%[H7(d +^a5 dǸ̃j(i$p]FČI}Ђ> X; ЈO'B۵D@n-/.I7@3 'ҵgswոzZM>Eb%VA5G6-V*LzA|"_`bߊ=p Vj`~c" BNsγ$:O|wsC17RS~-˷/ۜs~)Mv4ф~ yAΧ1%k++28C+.%@HeAk A ^YEM !TEAy/Ep-nاy{s1@Sxis)!EPD&!A pl p<ƪca`ej+VX7U# P@z-L7;sG Ǘ̥\rIY>Ӵ4jE9FgV~7f. &࢚~B"9 !!ĿLD,ZR U"IXIԴ̅Vv?s]o.D"p?| i_v%j0-ĹJ.(_sIͳS&s555skfͫVXƬB@ Q οA RH ~d,MѮ2?V*U(Œ wMdxK Q_1Za/aT~aps*@4lc7vD z,__7m3zMϞQv|p,mL8`BJYs̡ǮD]jRrˢ @USo>BAucΨe2yr+m/9漎q._g==_oӜϱB;@D4s1||>B}oSk<#t:M---H$wTNYctΐan/r,Jc5DDdV&g/2#kZo^ܘE`tl'Ƅ&* /h/nH2:`d/8c~j?ľXG@!ܣT 9xmc) m 9Պ \^0& `@μgd3DMe&v_%*Qf3H  oz7~v O>E} 6dOp÷;?X" _B\ 0Z8'[u}{Dn-6HRv f@`"nZ @fo,16(GZStI7l% -N/0*tSI UYQnNA+C.H 2]A_P6U$|;t9tnЊh;8s[jXhO8OQ?pQbP>"ޜ G^\']H* `Gb ^Q}̪źkj;MˏWN a +~rfLV0ڢ oj{& ' [Gìrx/}pAwxIG<4DdY(c9ù/9O%Z'N 浊 6@F:'4 مJQ)ӌ9`{9s pх K/pSkc.WD[w*`r/:_xCҿ˨_UwBDDʁB`B #{ (#BX(Bț䂀x+> s@(@֠Gb B  hĺ_\0|,>f2#!Pl9UY|¾o'9+ӻӣD-ts5Rs'~D_y ~ ~QihL/gU 2_1c vV]ef NZضR_.-o.$hǹ E oh={ꅹߏLZ"'S"ؙK1]-] 1W9l֫/E9_G9 EĶrd\PNp]h̸w^A ]dDi?"% [ )Fkv7p{V ^ f j RFpNDWy&"XD~3%L+Jiu_n38Gy cʍ}r @5Zt"& (D́>]*[ bu\RJXP`|Mm 7r*74 mJ5VfqLL9`ZT}wi?a~u!Eh,ec@]c2]vA{knZ+eU_O>"D@u M f _61?q߲B7DiP * @t/SgT؈諘Q`k50_3!ƭR>RLh+Y}AJvXźTu̜n- zyvĿ\9C:D/VͅCR~aXVs`EF;O?>Z;}4{gwn$U N8!Pzo>B*ScӅw[eXq7Dy+D*G#+LxY#Z;Z29O\I"#`5Wsy^'[i9B3hG ̭$D'€RV%@>jfĹܾOr5z$s+olB]Y7@XВϡ>0Ċ?ϗź,ؗsEuSo,vܞl>lCsm9`:,= |)f /} 9G\ Qm> @@Gg8_` ؚs.Σ9O΋ #伆u\sCV3pJ?gqN%g~ 3,4wu: kn]jX>9BF#tEM,q%oiaBzf8h؇ED[6{p>\C[ϛC~ud@7" C8.ד3-&h0#i ?2"DkaB+6q3(Yi`qTc[WE6l qȸR-7lZXŀ BHHW$(Pe)kl܋04+Bwgٝ7;u2ʌs޽IJ*6KJpk '< ɄǪFejؿ3яg=oM6t~3ؚװz#RܐAA6!v@ϣPǔL?{ F T0){JNwDń7I(,Fw )$T+ e-F5%f.T ^LD?YϡG7ճw8.i6hz8rlŽB5PFM%1uA٘=!1b:2b}od#+|bV ;oppj VſJ\O: 8HYg&e_G!4 R($% )IxVVLM:@//kSOx(~8tՈSGD?:<+ߥJZO;Vvm2׌/~,e); 0_!0 *B+=2:ll---d0&n`~(cU"Nj4ԟ5m *[?r"@#yH|I`㖭۰V>F&{Ͱe$/ У]R^`BR1M hQ@5S7~ );YRT䂀 E&M|$iS0@c`D@?Pp"Ikc"FC-VCߚCb]R yVBAFcY?ׯ'7@\4 SsoO<YΆP ߩe VXa`6c۱A6PMS @@ =᡾LREcQj[$% I[ @SzLZ|})@`Ԁbeǀ}hM|l$̗":Lil?}Jo!GQNù*5a91Zւ70ׯ#h4"~уFhSOn `_72R7Bd\6E08\ns}p(((ppB@TRfǷd / ltW+& 45k|(n 2=Y?)qLg9`[S_ [ϥ!a*ZuB>E(AŽACӉW^\7@A e 1PuΟU70Mۧ"-~I ) l08j,0`DCG̚؟3Ii%0Zv176 *%l&gl@N#!)OLk1(K$ >@+[ &%& @wxMRL@X#FBh|K?Ͳ)=U$C6 G}m\I?зy:I0|zM6?:+__fb[}߉쁔MվKN1hOwxlWb gw@Z,Po:mZ0D@?ޘcDSF )FҬ ;i a;n`57#v[S@@@ P#!)+$}e p4w`l$- H|EҦtIh @Q=~%=o>E,it]M;l>jnpQ絃u 9 #Oy-k $RU; ^`E96ܟVgYn @3cl? "aOLLQLt"? %g qG <֐¾sJU}ܚ4zf~Mse!yZYYnSN~/ۧH_ٚx5*HS~#%v0`dtw]bк4X#̀/UhQTbk| u /V/ ` tVHOn&)-`b?v|B@,Se[?+#0JK|1cO0trjIO8 p! .%43%m]6FM k}耏$UOR>؝awljV`x/ ` N}-Z  ] 3Wl}~냤p+B=rET·}˃0[ gM7vMW:p~ꏩl=?-~ @v @J @g>ቐ}Jľ& w7O7Gǭh?ڝ"ZqРAx|ZG )az@@ hRĈ#yc€$.)t@#F&Y{HVKA ۖ S5 \"|<_/1? ?~S X_%5+0t@ʏb_oKlGB\`;hn(,A 33|a ,\E5U~O,R+T+mvL} vpC|8^ jfI@4 :I[FkFS/GDk_TI)BTl;[JL^Eong&_c 1;s v 65h4wv{?*QSq2!j @TWRWB %00T֖.xrAF"UVu/ܨ7C(z/ 궟K zWNaP8Z)QOI @FM 5>nM&C){l)j>I n~Q4@FA'F@ !Fzϯ#lE81b.A?BPφV4 @?=jbFVEDٷoaZ $A/ƴ'pW 9-`[;_pm衻Do7PIUkGf8 7@_3:Cjv!%J+0වw@pl=S&}yjjGv`=+_)ؾsgJt?!}dbx#* IZ @`SbR"5hj~k]! t=P,K(vOO[b3鿀@J ` ]=_gXC#XߺM+;*Ps^;%4YoPZznngYd8u>rrx? L  B.Qhr=HD2*ѾlK`WsR4Xc>B?acn6w% M`k w]JI 𐤭 F2hݺ6T/GDgiԔI%ZLL 꿝 %=6zI+YT=c~ϳUS[?:3q@.l?ViȾ_-Y_è`_teWl1{&@nr$ n 0cg`4 x~5a0 > #RAx7ὄK)l4c1zv92QpR" @՞i ?I4pI6G- }X>nG0$-,h&:7: p>cEqu8Ai s^mjFߧe ]Gw"Eb"R #32 {)jJ(/xյ?ϫnǽ끀@Q/_TA3jNo`aK u)4F͉v|Eڴ5"G4j;ߴ̱fJWϭ/Lhfk0 U{\էBWy52ȟOp>طWVVɹbN & Lk gK2pG35N,EQ h%\c Z]U3[f+9G&}bW@Z͂F9U*C˅cTr7(@yv`A_9W߉|<$itCw p ×TA?{T_*Ŀ@VERehUQn%rH 6@Y{rd@w5-nKR5^C2@W?'b7΅[DBLX} llge}~3[ ߄⿚YG yjar`o`̈ @qbpDMZw< v 8iM4&\o]s8:|N6#  "s3I |"*xmoRv v6 WW/ڮ/ Tqٹ@JNvz8@oЈ'9 xE A#;?a>]Uinr;r:&c`,Y+~ɬҿaځv~of#80dUY>XYp#>_&PWU;N@ȷʡ1v}<ΟgӐ2`ㄦ>91DzHmWͨWQMJV)^$%uEغsHeᏟc1NU3a #h{0XGF  l*;P^KGI xy( h1쿔:Mq>߭ d9uI6Щ9[0y@ǹlz((**!_ɢ!PR'pʔ}d›k'?Z ǎ'1H O/?1?`THiaV?( iw2k]3fz؞E= t(Ya4@$nG^j1tQ܁si@JuF%1iXɆ3Us<7}o6?OWu;/ Ԫ NUQS8c ϗ##n"ܬ{.*GtXSKwzv!00`#@!C#@>cF'IU߈-6Lw76 je2^,@. Ss@qVڦBܚKF % YDV7]}ScA9|g?Ϭ󁀀@D=3TᾲU4L}Flԥlzn$ssQ<dOA@2nQH-vpFl1:oJzQٗ_Wc+5}&f+VVvhUwL}Pĕx~2€3=z FS!SEFچSH >Aa+Ox?8psmkյk=i_FYIF(Hc! ;U盇2YM0:v/ Ֆ._RViQVǖsQ~_ @EAYEy(Q|/,}.vÅ .flRF Uagg̱B4d Eekf&}CsCN/BÏ 4P3f_چ@ gt; *z1hGzIk,%woeob)yg1%)Y¦VV-Y6Itq@ G֭STMN͍yCԃD׮oB 3t/  ҘT"()e5#?UcI )~5mW+F()"Por _ $pSsf&0.0G})SiQQ?39aig{( r@@O) !h!_cwVڽ+T>nwĊDN n r_.H w]n6< m 2~pA@lv݊X.X/LW;Hiwrya@RQ7^!™Xk@%WjcF;#A ׮[q Hg_VB}"[Gk{ϫcȻaa@׳Io]^{mFfXD*0$ee/!Oy a HwnQ`Ca[) L.6PRBcxm,s^q?~NRјt'F,w6Jkk,--'ϮKKέKΩZù{CQ_mʐ#ϗ L`!>BS!TAׂ)\)bnSw0(b0^xNij?s Y|J(.."B'kuH~L|Ny~9L^{l|%ϒgӟxDD?G͎dUUUƱ4N?t83Z`%C˒Ű-K΃;>{-0fyLsBIOD:@!FNF8n q-x ?I̭u swixm ,03jkHD0w;/$\8?a!̙;F EEr?Ѐ a-(( >#w߇w}w믿3f̐W^2?b-}­p<7脀~.#hׂV=ls+ 8E8УW=_|}8o/ E4fY%{D¤#&9`V8gϕy ՟Ab34vE`X/cEAA_x<\߹s'z $|K7|''\y1=ی?U@!u# āע_\ s}%luN+/zXu#>{iXJp;adpCsۇ Ϛ1dO^;l1b9r$4667r( O\;EL/뮻ߖEoa^{ >SXr% 2%x,ù1+cy|@|ncsW'&{+zu| z^3pp^~4}P]]0c?y$?GEgڵkX,&g~O>$lݺ:th8W_.S? ,gaTk8mTVVŷ+ԓ36s}~u 8uvse;xnDs}pM4~w!\c> vT4(pp^2PYIxx&g' s/|g;,yO>/U +VO%|7 .8# $9Z@. ?F@Eq`CH:_MRm#-*.9? z{`#xP % ) @?zALG4gͫ34uIw n7C,s:]0m 3v,^{=ػw}OMsϕcoȩ,?Xn7N6*+6JV) xK7+i@ۂ͆ !݉#i[]I]HĊyk?Hz0( Lcdt6{i$, @ !T8Pߏi?]:mL6_Z(Tl!q_uL>rG+W# 6䳯ļ {7̝'PIA'(!<`@MME|JvNF%q9.-ڂd5RH28*!uy3b9(pPS6)ojh Xɮ1`wԥA`'(&5^ ===](_|%"oCӦ#_s\՟V_[w aNػ n0aL:]tCFbB- DyaP Mݸ@tk8֌A0zj״-R w9_M){<6(3PiAd )z%Ow03XQ9_ Az0z;<yeigŒ3`׮]VD"z{ U+`s`ݳyDGQ=f 7{lڸ1^M]`mY[/s-`q'2z z4K CoS^D)orU&p1>0PaJ}jHԞkHĿ6Q=ݜ\ā3<[^ɳ;M,h؈u<&@EEp{5 f͆'o~y﫯ݻ_;wma:~5"6ng^E7or̷rXMzNyXl-W_!~Sѿ 2ѐؼu;\qTc9.Qqc=,{iiߌ~U `ߪ$o>p]zczj]\@ Aaczg_4(S 1~40~Z~o9sw$Bw#{u ! ǐ|'(p[^Ttyo/!`xo|Wo_]I裏{^<{l8U"^2u*1y2?a>hyRC۫ ;&@M;3Њ8; B0pWI8[Zӛn_un{ٱqظH8J2{ʵX=- `~|/Mfyg) )l )l&|x1n^&6]u׋___9Egh(oɫ;wuϭ?/=;a6+l;vxޝ;x|x>րĨyg7¼y ,9e*cM۵Ja1xL(mi}wGjE hltv;g͚tx19.#G ei "ǽ, ^bQ,SIJ v!u': / )ςGThYYpͰe˶5,W_M)S*NsDec}-yŗ^M:<@V=Gi&a;0z1Sn0h>'㍡oEb|M<֭:@T{k */ yh|\; Y8ɹM#`kK>5bKxzA[<;?_PF G=v&@@g=UUV$"ʷUbjf"{9Moz"y$W^}5^, <>[X,㫟y˹_l_?Eo?l@*lB0UT+(,!PL.^ 'R8D\,ɴ5P'm_9nk\cQ:@k7k$Q=~߃ s-zjg 7dto!( c0t0xfW7nJDVLMU1r௽,r+(vE:=gY$ ŸS A?aL1SBuѪ&~yHͫ$z/&|P v;FVz64FaUD!\ap3f-yD(k  OZAi51>p>0L] ,>HSЖ `Z=;Im{E~}R6w`8:+$l1MwyN?{pEvE8XMi(ߺu~'Y8oyp0o~3A7Ch-v jos`ٷo!k6Vk5Z̋oOX(xKlhuNM0^H {3 ZΜ#AV|.a[{Me]n7PzS4kW\sLJJ4FJΆ'~l?,4܄?D*L0}l*9O>Z^ ߍHxhQpÊGWk46l[퀝;w){"b <_?\wʅP#^i…'GNN殔V+ V?ŽpfvN}ι pm#盕mDD\2-9=AqC0yX|LyM$qӛ[o<Њ;F-{Vp <r1UTvneY}k+0ʪ?3އ+&@J+41bK̷ex$ѯd) pz Q^^ůL ʫ~^4V?5Ǎǿ뎅 VMF[Ac?h_O4Gz8)uUUTTVQoΪj"jKh^2%N z3`GjpNmݬ3 յ!$;JLe{)D3~?!8o͹N7-{ݜ7a:\wY:SHojMXH 5! !QwL~Lnmxn&Q )R5,jyul>]3wۀvaR_JcKۈ ?x778i }_}nt$\zُeax`HŽրg֮U< syPXX^TT5' o|-򪫮P#2"ӭ kW 5 ps1fG:fvؖ4?7lR͛l3*a#*D9T 8 %go(EZc5Ap m`?Dt0^R h22tUvXm0 -_XYY!~Ȑ!o[iV)Q?J8-]/F὏6Y~9.xy1zyK@kd>lj/w ~ q5V'Xn+evX0k8ѿ{ }|y E4)& `4h66 \X1zxϔƺ1~Zo':ekӖ pP5bMǽÌ {~4hg$+bxXFf%%)#wcyEU #|bcG[-叮+\*𣫮 /<l ;_Xwpfx+Wi˯<|1~oX~#+y=;nnpmI"~;;~W󡦦v= bp A3Vky_44~|OiHA6Q͉|?M;^ޤuuɆT^B iԝA=bD0_Ʃx5^}\k/)~^@@ 8%K:M1s4mQ"ƭg ;šm_<Ԯ`(xxL&jjD"_wo?/w77Y_p]4;: 6l̀'cGWN>8]=Qw7wC:[2 +Z+KJ#c#حN `]=}#+˿u|LN.?/OTL@>;-ı 7zC!ZcP%(8Er/+Xc&utGV^]\xߧ;aF9"sDrHuZCcO p狉TzXD/6>^#j_SS1/@αg< w}/q/X WhQرdy2|} "?w/|wdX+7#o/~r!e\V{q@CF]^[ yi8m|ʩ^u_ W)W?gw6 7a]i3 dN8.0Ԡ݉ }?!g{[C. {A0A_@R(otzAzʰZWdiѠ0AK~#ה;tap}<,;T}}zup&ظy6߅_ .:.Zv\l{tX|YpoO눯{΍?QJ! ?g[=2|x9riaRPP@kD 7'(rLh.}WZ*_R+Ȍle(m%}(lL4ǹ.9hcMp% Q@zIΉ!Vġ t*1 ر[}ٗqf:lT0JHQ4 MA!oüy'`V8g0s,8a#ͮaΓ߅/4C޻OpC` }:|{g¢Eg(pƙgéߍ2 x~c=̙/i O:<LNO@-)0翂AA/TTT "{T[Dv}+%]GVUiKՂ(&E⓮L/Hf,(;u ]53\/p@1ݮ}ק`C}XV@@@ ҉C4-!v+f7 ^sqqhhXH;?7аUwi@T$@6oXVVnD]>n[ׯ_>“= ``ݦcGNkCSa܅0kf1j7m3< ժh`[,LO_R\^fgp~#xaŝؕt}+=3f6_Y @2MrDD_ZF ? KH6Mv~#m8aPᏫn2F=+}К 3ͱVJҢz%tp PL̇2M=v lB( xbn&Q@S`۟j\F":ΒM (9m )v0~v \DXе7R=SخE$3%R~#၄ӈ[[f]1^zbˎDτcMftxnJ^۶s!2 V=}flIT*F*.V)a݆WG`#d/@8^儸G#'}+ .cL/>|8 'οZZ¹Â ? 6m?s̑GF"g}!1py}"UUU_]0Z0ɾ} H5?jeL|m >d_O8_k%lsFаbIcdc̵E٤Җ8^>?pp (>cQ yZ: iᶀ~Bg :k-lHYW[)-VCNJ=i ux)rYA•kc /8ovzyfbUnu>>֮]~y={؞޽ FQ Ȣ""B߂OCuu C" ;20;Tl';6(K'[ϓmq`gQ<* ,h'N*ۻ;!#|Ry@$g[i@^:/ \'+S̱)k8Yw fJty]A3/4"5RSHkI )[n /]صTߡrݦc"l=>h89/wlXD2e ?pBǍ3f΄s@CC\5i g/! $"Х}.+ cem?habB(/RnWc-FΘr>&{m\gIl@la@SnRw:/]mo3Wӥy )\/H~ p)q{`~c[0]'T̕ph]@]OW` 3 ]jێBmh[dt^"`))[4"o|pu9nl. 8bCW1ܷ0x1_ ±JWKJJۤcb<&1@ /8xfb8 M h7oq>8h7Uw8`$s:Ӈz{eu^]q_/6(M:)%&@s9p.{^FAW(+cE~i3i.o"Ƃڃb4Ce1?%E6ј4aYD`קO>-K?vtz.sܝPw' #Z0B3+~-d^ h&bx tlhhͷkx-QI1v gͫc]8 :WUUI^ȃ+9lj"_ l4aQ5̌ ؊` ξc`$j>-n36R{-(f಺B&@4.  tSBv 4"ngGlmpp{[@u@^,hx { 4rWo NC1tqQ1鱰!зO?jjj'{0 A7U@wHw3VkĀ#<7i xN(̹ΖT>Ĩv2=IQZz^@ :&Q`v m[`@^ky402AN,hV:I2IilD~^UB^p5[&].? hxqlh,1o9/"} D@njd#j*ÌĊ /8E^%`;Q.lÙ%u=ީ1M!p!T0sb&-(ETvE*SE>ng5=h=d`:^f4PPPC( ~fc9 l ~V~k6O'6?r4KdCஇGόk~y /^RTVV!}S] ~+As|b;" 8nEEraC= ։y=`."s1C&c:lbzl0|_ߙB_/F{8a`Z{UotMPHsi\9hHK @YTzþ.Vëj8bZ-L?u|-LZ _ s[X' \0h?`N5xqspdn4 1BmsdžwY^,;w\ػU`/[Hy)i.eZw=Vui=n4ƪ Ҡ! 'V Ty¢a {A^^o9"⢒?G8m&G <>?-8dP÷"Q-F2 ᧰n*䱢=|SbN;D#QTRN  wA2<Ӿ3,RAb)O{o*Qϻ^ed `Է0A78AvԜ9eX'܃^kx@0|d Rأ"3VJλ]^P9E4&lVd% @ѧO) T#g$`p BVm9kX(&0@osǂ /ǂmN TDM;'OnUU; =c73^͙U@:ܾܺ\c1\z{\wSgB\ӯff̖8V^'2}bRHaG.(2b 7p"b](XЉ9wnK^ 10!l(yA1M̖f 5\ AS%4 .5+HPye0CT;i͇ HI*]co{pz^^>j %Bz*nP$xO|^Vzn Owl4I0-QNHcĀ3-U(>V! 02h sp<7BpP{ϗIFt g&ul.b$R6ad_~n58 ?! @! 3yD+P.g<90]L̝pt8&Dޭ~\ceL,` ؝]@Sp5]u><~>d`L ل=#7&=Ik Ǚd ψ |3 8nEE@ ^A@<!Л]ѭp .c#3w.γŸ^/"b$Kމ;dDB@4)>m4n-ӕurT.>F %\2*&T?|@4Ni Kgoy~_J]+2mmb ,^'(F?//?x@ >xP~@EHpQ< PT̝Opq^BmC0h cwaT萍.rCZS[iȿbd @6Wk#0㐁pq~3qxx\)pd"d MB1$ׯ2[@C,Iİ|>|ˆGȜ|`\"|# A \uz/GpΝ=?k%ފ1gj]b$p:߈``ۆC8h`h,1|!~34Fj@.O>BWW\x̪wo9,QB_I`_>DžN0Q@D)!l : E((/(p6CHr;lg/t9ż՚h(Ҙg Lsˋ1]z":$hl4LLpDQkYo o\tEETϙ;`o jk=D(!Q @ Sp>2yP7Y(dࢸK%}ۯ].]VH":5 ?D?`d`A#x"oC p?>`u.wVX<. Dl?C2V?ߧO/#wH{vmz<` t7y#d?{μNp‚a's!4&@$RTk @ 3p>74<>Ήoh?aas_ SMAR!`!=&PchC VG _nb#jqFHYo%Lhwח #8H=}X^ :Cu&W*S$( Zٹ"OQl۩[aUdiqQii,H0JI5(V%ƒAlJ}@r>oA" 4^"=Mw^xW/6[0tcaАL|n+a ϙ܆ao+d4:QjBII r ˑOk&~|մ#·{MqКt(}-pjąVu\Adٷ3Ov"+ fav?+(͈}|mfļ{i}&W$?ez,~DZj0l֑} /y(q*Დȓ߳OK#aJ: K`9] MLG  /? ;Ê+r˗/xQ>Cڂ?pž4pjKHrm+a 0ܕ⡽Sd$cxT4Rvwo+Z&fuKagZycXx/34v Ϭ0#TbL- U>nsV؟+WGn|Sֳs`[cuѬRv.%lxx<+F # `*9 ?`XvbpI%sq*c"SH003Xo.߹@'X l;>c~e); ŋç~*'}]Xv \kLE+!lqެ"8眊TKrՌb ,gX.Q>{C=alDsĕ.`ٗ_bD ܾw&H,PjC1 Vs1A l'.tlLx'VUfnn?^ǽ2oN0' 79Mq7LoͥXgAg_{Z1?k}FY`(@ jYʶPuZ@;%ј0scNPb@qtmoχ[+k#C-UHrt;`{նtAm{0R`h2KDxeMM@HK/ ;v[¶;_]eeeu>}ʵ#x 'X 񍎫'`A|Uf nI7vh^>`l6ݸOz#-fPOuELi#ouq]g{\ 8lf c՟WFD x?-lhO4`s{o!ElA  /odk+VqT#mQ6b5˽a˽ݖܻ-S CL &Z@Ÿ$ m X65 0"B~ofV3vg9w;o޼7k9?\zwy'|⒪p}׺^?xȎ__ >< ^; ]s# d33sl3w̃{x'3g Srhh+(l[tީ7H`TPT7tܺ:8oܕف_ D8=W7dz5ݪ{\=@X':i]hGoq&W;>DmPF)Wˤms :AEOM[3RQA%څ¹=--, ͂ %@' ] />r$.fm+I/_C i}f̜% q0m p=7| \{HK5,O0-LsPpj߿_ w׈g" *4 vw HQ y#DȧC :~ z?Q1+r/'*֮XT`FQ%A)%x +H4"GIiga 8?HPU d+ov&ì? W$d 0We<*=V3MW^}m,`90o~[ 199t03}H 2~5㏛Jep>6~8'7E46ȄlDx 0s@X`T'^;?BIT9֤{z}m>&^#`1 bZ.<س:* vd={CAo A&麔$'cͷކW^ Ng֐ZԐu׽sp=xHLḘ*9'žEj+|04JL^("І/ذ78Ǭ#El4i6{rλ C<1A"mWZ'x FB mCPVZ,\dAc>`;3,h6A@FfXX>,7,btX][ݴ25HZ=T!=# u ʭ**xEQ#2|˭hb=̙ʺ:7>\re,5COazdr'EfCmp>^'6 iqA.xkm9תz{`H>&u&"#HsL>slvJ6et)?&Ltu)U60Ns *G&ϊ6(H)IOB+R×u4'q߁d$nƶh)G"kap> <7q |8{>.< Br,lG/[`t7!W׷oew x HHfʓ8=/IZ(IǑ6έã؎6_^w+/IRveaʔLϚU8;Ι'ւ@⿃VI 's0v2͝nj} =#CQ!p69Tw)ŢA=&@wyX+E_bxÿCixҽvt5c:=,g|S9n4e`jA$pž݄ ^! )~$U %0U`⟊Q!@ٻԞZ(5V`Ukkn';t[LOȂWwz_x- ]k9R ͖?϶W-+aj3h/食5uU 4.ʃUSu\5 0fh!kv{/⧟WΟ|olnˇnǟ3O0݃|/yU+^H]^(_-Cqğ<7 ۯ=B8gUW_w}/oxw@}x̙`0{4lw!R?NިʕkCfh2|ͧ5䭺Z (8;sH_?# FޢH[䫑kUh]":{ gny5`kuOw.B&Ltup F OƠŸVy ɼ] 7 @9hx -tO-C{*m >Gt=j`uImP<8ݞ;Uu 0k.\^`+é\HIu8}ml@: 33aZ\Yk`ܰ{'>קᗷ8 f-&BeUe0h@4d?FX3O+Ê`axz#l9{+<]XX|-,Z/ZKVɳ`XxƾA> 8/**aБlƛXT@M9sn 4ſW=:{ H&@Y$&mC:$țN3]p_Vj] el- S5V  D$ۦ%I Oz֖|jf : 7~ R8?+V'8gQt"@oa) _قܘ-U ˡeS ? h\?cQ.[<ʸ 03 6H[z=MԷ|fgQCJoB?<|E0o>s 0 \ `DfȀ1Y?*& L* 8 Cz%A/%NŎΟK]y(3(K'X'{,\ꯕa|?: siY0oT 6z$&IdO꼯9W{;̯?8cϘD R;j __6!շ얦 "|T?^ O EZ{>-A%P,>fDlΝ w·O.Q턟X^$ \)plh\>p&w,X>1E20{-_?wur)\;B=*_ '񟚖 a4 n9y*[: * }y p֒bؼ6ׇù+JYmWX{YؗFOύ{םN_PK,7RyP[;Yaܸ}՟W+>_M.f&@>}QJy@>y7O>R^uk]>n_+-M&"EyC_~BCp'<>OiCzj (RТwѪe(oq/Q>OJ}`t<#OshUxpv\#v|$ nd6 }uP7@wÊI".Wg;YYzJXS\=5H?` &=#S*Vܽg/<J=\r5@|)Uܼfc\{joM^:Ey$At3'Vrd;s`%ek}Ǫ{n -cp.⯘U@UgTQPeT .뽼+W^cfmi'#^5^yݏW\Ϋ.h8aQ4jjKMglaf)O-gÙgY(j׭o"voE(5dn|]w @ v'(H0<$=o-2*w`\Sb x*/w0y_Q.j#ľ?wj۰>&L8 2IE[!6p o_r ŧ z@mvsBk#997}4_Ovn`])lYkqBKri;1/U޲%%%P\\A`6SELyY|X'U~jjFAi^>}gII1=q0 ̟u`HؠafA1bC% CvjMy:1sIp37gn !3v ILgC zh5# xn遟ҿL ija@,lL'T=b:w] >&;@i 3mt ~Jx ưo@ip\jaq.턟)-Xqh9ߍ 7 Q\uSv)" JSy90Naaa~s `ĩA8} aìe?~-PXvpkwW=̳ ?L6ϝٸƏsA& i쐿ʹzgY+kH[F( x U[%, Py :+p;W%i*-=+b뇱X檿 "?)M:&Ԫ?i8?gs]xy1@]d 3Y?8]QoWaغ25LMe hA纒T0Lޯ_X`aʽwn.̛˅({%aՌV ǟȄsu)))>Rh2OLE `}`0 = R*%%Pk,7,wc;|ϰß zt} $A׿=SǟxGto;#> = {߯X _?L2 n>}/4wVP_MNQ "YA @o*ïu IcSHX: p3 $Re&ݻf_{5ѧnT&bI [o %iuB#1@+$i ^sSB|j245芿2Z '[h , ߯:;:8:i^dlEENc?\ _ (uӣk$և, ~ Yom5j4]+W+V7eÆ|HB_'(9S`пDڧƊV)n{؇#ya؟6?Yi'q?ӏ5I&d0ot+G[ǒtDHCz'²+a-LW/uH+B_ŻDq=F%L'=@~3ujT\\_b^!op]XNzrΘq> KxYQ3Sd;xj$P`ĭ(Dj'OA1*x‰'{t 9j4xrr@j.S\f{8/y&ȏ].dDq-hQ沉6X3LjܰgȤ€W\ f.\ UEPY"tHA]ջ\zvf){=`ƌY/)d̘qRX@4Zd8n!Íc O[z-[G;{,O6|s%Xe?ss{y'@p̌ 9ؚUE\7a"&![S8>$IS> 0B̯e S.(OiE m:G4Ǹkͧ?{kj+TR|~2 X\ K4>Az}^>t`OuIm?P!ځ"vy度4=>7ܼ8Vz`̨XQkmcTp6Bl^`cPVi2v-~$x<c"!"oDG~N[1Bن## 0 RDUJcq pٸzZnm,Q3NΊ@yրK23( i*Y0~dEVUYV10Q<FQU,uxpň+wWpCϸnLv?"E*&L=7t9Ȅƒ6h,bo=^K LJu[A¿v (.)~oJp>7( Qm?@ QELp$Kb?.ZJa4+'a$!Oc0wTW˯?@dqf  zʛ$P7%µppβHǞ%WڿÈ 'wR6 !Yxm؇ISWEᆛ~yDBߐ^&8M"r4;*ECCw" qBM!bb?bBo;e9~2qvDQ&LЇEtN }"E?wP?cףw~H 7(:W@ˢH" д ~(,{yIlσ3Uyx"v;X./WϐMz1u\qdkh-j}ӂ\?0,vիU/..^YZ˛Nbjj*zh4ʤhF2$=aA5;bHT U~fIXFM[p;>\ߜ_ [] a Z Я }ivгoݣ&) D?B[83Zhuj+&y9c)8Y[W\'uk$H"|@j+:o.]`4VSN(sHcAze"SssEbCڲRC Nm|B%9I(-(mvX5Y,V\!*XK*livЯTO$_O5hV[JK0v@&dY(g-.`lЏTGADzEpt)eFIo]Y̎ n|8}AN0Ux]0]Y4dVYN{38ݒ0n_)k)Mp;fdIު: ]e3T!ƟvNsMѵZ"ZBh4B7uV蠞U|~?4>) m{iKHP+ڍ@!"f[ pJ8vyܳ US0й }p#oÑkP?OQAVVNxviILdǂ^ڿvjJV~TLbB2T 8R|7\\SXёZNf%/r .X܄߃n} 秂}v{*$'[}?~#aL?+eck Z_< ZaH WI) Fsb$\Z!%%U9~~O wfh  $1"NVYF+>N 's`- US=K&`фέUSܰaV絝T pLh,h\Y^^٪΂T}v^~xObat$'p V@쩯&IF-\op׷d<"@E`G;gFO7Q4Hi;OF*(Nܩ&L,HL !>'_^*GWM4G2vw0lB*ݲh3t^FŶPzFAt:B mU?*X$inD& I:(gF6!w r\y$m6|I+Iwe&A+ Ź)lRO _,K͒_'`LU +\OdSMx^\cKl܆??HF0.RO:ㄱ3aT SvMVڡWɐLO4oFoRIP䱱c2DŽbNJa ߭)#''!^!}Րp"=?~QuL@8绬]2\^jΐo&LNIaFT܏%$NUP~JQ_i|Ni+֋ - A?Aǃw{)Νi;W( ŕ~d Jft2(,˞"(o^)` P C*,0a捲š)R*? ~93D?P@. AU$+[exw:=ȍ85d0o+(!U%e$?i7c8ye, D28@w6L= r ~/L4p;dī(`K9Db\0YJh%+PT& CuY !jPXU-R^?  0Q"P`;[a'-`̜PD(U@7v;X[xUiieU+*UAbS)I {]N y}X0x{W+ft$'p ͇n-@)" Vh0JNJ0`p0H)H6I!DL@¼)Ye̵m5׾zhSyMZD"&L8v#H+͡8-G~¯ `K5z୲"/@&CSjO g8p<ӮO(ń,^Z <0 GZv~FkhEi>ߘ+_ gsbPj}*oC*YpqxW(,BWt|@0r|[h2@q^)]n!/7W(-JKKJR,- 8].WCp!;)d˿K8qm!Q??Jڶ]$wp @(xj}YcxoC*w0EDpkH (f6qXho„qxT7A2h^-VEu|+[@_5r~V;'LRPdy,vXԾN!pF"p>FyI kj Z]Tj\(f J~(m $˂d;V?m7B< @2V~N6ȇ1/̨ysw_it="?jO }Q\dwu7̇\6Λ}8'ݦ{/gx kD m!k@'ʿRӖhB?[L㨨^(t|/ lZwJo>ώvPTxUG*b2􂣗V/O EvT (Cb|eͧ~&}H+I_ )+t`3X WJۿ`i@$@wGſ0pMY:HcB PX s<:o#-FbVl-#4tBw>Ni&L!A+s̃ΐX 1Xh+/6R@TOOZoP}tyC$> r upެ&T޳{:7cA,VJb>EA Qp~1@gž(sIB?i_+'[PkR2K}ȓ@o`So/#gݪxVh"f ƽ[0xFxmd9aE@pytOg&"Eůp ܡ84#n_9` * @+c0~OPaja0L#$:o gMv{h/dl(U5P^  $|"䣐cX^ OF1/Sn?{x6}u('j*YvVU~9t8P`pU~0 ԞX~'k{mpSx\~@8Ǯ](`m\BQM8RN?H}{@ K~0aDdNTF{>=ֳU{Z_4IUl&pnN` Nm7G,.O(]^̀)ۖAT(C>qX3d?~}Lier& ihW3NA؟ddU'/y!ӨI_!Ӽgt9q ]UѝoU*W;(_w5y::Wۄp9 &w=+%%kʮ'93g $[%dK-͞Դ=;=\ONmqNn>)Gpg 4QX,nX虈[m@Z[ZSDT2;!8d&NDaN2 Ŝ7&z-λW"Z,HQ2)|(WWR~OR;ak!k`tQl3dk@jNߓdK`&߭͞& ll-b( >B$LI4GH #!2 53z< xWܷ(Zy7TŚ&DDalբ{sd„X#ޢ;@"_qMwzL M4z6 ox̃),7aD-aӌ h\QL+++ 6izS 0xS4$.aLaX0ſ &2zbT@"$q1^^Q4ġ$Q/SKȩv}]_[=0Mx7ECb!S0a!?QxLZ8zGiN2}wM)8L ߄ ]6ixGz:cLP+M 8$:g4Hۏǜ=:}0ſ &6ex=pHX b/hD`}׿?/\ s· WA:sz^D{L ߄ Nq@nF@< M/@}6 4l=xS^? 0Bp )Qf,a(h;ύĂ- 99Fdv̈́0ſ &Dt )ХMX! _tgMQNLOOgy蒰#3QSȇ%@AR.S0a"e6b10tX((ZC{}F"!"Fy^ȫQ<9s@cGN3 !C⟗*@1--g_JCiϿ=]`BH9"Wy~?|yrZkx|M=Hg{mp߄ 2껒 + ng @.?$p< yEg($`-ˏylgv'~¿c|9C^<yr r-r r8 0oA=̝G\S GPD8z{R^^6dĕ7T.I16! #CތR Vy+šPj2k1a„ qѫ@÷?hV@B4xĿSb\Ld$(r^*862lQ3ῂq xG{Cwnȃ ݰga' epXĮ; cqP6/^ 1oV~?p ѣll_~ ]t3sldɝ^xR]4hPضh$⿙/(L;{Ҡ(S‚1,:@^ 1R KQ0fV9XGIndg Ů`q&L0AЧ_<m_5d# (h8mq186kL4Kc(-؁28' V XH4Z,@+ >(<>u 33~_1ssCep><<=팬l. .Bx 8iY,8u~%V '0~EfAin:[N'{ !{%a""Ж~M nן>;m\y@pѺ5+YK9epl>ԍ̅C=PYn7#d„ &b8A>o?:XD:0K# pſz{W-Eq4 (!eܝ YɝT's^Ro@&wi^[Sg%t>GwNxI`a6)\e _jqP(8>e\q@pp>qN/8qV)Z:oY,/DĠKAc |4pV'd8 _d;]#&,hE وlF ېPO[ EOԿD5jǂt_D,"PU(/Z^T~oΛOK \=?,,>)C+~tL0ag iZkC?~-  tLTĿTo$7nieY/qpl*bn|QS ,Qv$[`itic*؞Z99{?aZIhS]V!%%l6*( J S?23X$S`D1({(r 60GK+!_?͎0 "!(sU=P, 2 id FX8 &LhOΟh֣)(v ( ``5SD~p8bjߔ÷bτ?r`9+/cp@b)ާR  (V|R>Z=ٰt]=@6 U}Pm. Na\& s# v70 `B~Fu3z\%n]+YZ ʲAsA!hGLT^M'K{{ jPͿl{RXxO煗q{@*8;B^y94R"'#T,HKTM-M0mmj2 h  Z_FTLȯh[4:G- *zܪlcE!|YxW8fT? sE# s" ñep_^_|Pj0 ^S g,]  w ӦM1c `!pm^W2:\nv=6e< NO!,S[:>惡Xz&3qԆdhR>ϸd[vtnj2[gP7 X#?%6-b)-S&^sUً4|M :K@?>G>|Dw&yr;r3r-ZWeR$C5J^xLz$6o8<ȷ4{`i%{9oEopfoq ( A`xOȿ![O x CJ<N'2& @+^ҫè6a„ #`D/ @om/p@qǓ{#[|Np4.ɏ *ci$2赢D_$O?F߻T(pm<@ȼ|8Vk0|v\8>$.cx 8a%|rùt2Xl9<D U9JnOλ}U 0? D6 P\`%ŧE4@CMg$EN_Ϋ`?_ӗ*7gԗeиP\dDd.|)<"+i3h0/6Aۤ!qX+&Jt bH{D{dS70fcO{2Xӭ^fnn*΀R{;`Pe6 @ʆ]`%c r4!ۑǤ׏Ѱ"@Sh4Qu3`„ Q97:1y38?CXc$Jˈ v{ZRRn쾰 8g\Tjbd@'a&E^]J)}J)pQ4vZQŶ|{P l1S޻]NJo&~ Qg>cff"!9cP1@#0{dRg Ip=[+ -9z 9-:$`hL A m)jUЙ*@^4d<T`L0Ik!@H쩑LF@?&[a5 NA 0IB-r ZHH,dtؑi^:&קdL8ۖ'J89biHzH@% 9HzNJTlNTL2a„ B4Et_! Zpkl9@Ǡk};ygyk/P@ǃpH,P*ӫ܆rhLW _\0ٹbȾ ,kdF@vKtX9l nvN8ElP&'~;p8x кu8p:|Ȑ12>`iUp]f"))#+++IuF$ƩC7(UA7ڶ#ģ&cr?H fF\ ?Y} +AXBn-1 8ǂ= V,b?KA;AœA-cos ˜@ C.*mz͟saj@pdz1)xA8̽}N@ơF8W\9#C PrSͽS{ p|'F /Cplh9Y%?SSZ+L/ ]p9ǎY̿BH?֛L:t7xP~a8m \*d׿ /3-< >k7gdlGrçN Nr< 5@ 㹣>kAXO:_3Io##GNFN 迁0~?_j3~BNكm>@4w_0F y|l|A([Br8@H+X l|{Ěq`ߥ댘#Kk3k  u]ϘH>I܏5U,?}{G2>^TbWP4D O$}; .}wX"Gx }ɞ 7""{4,fk,Rk 'Vs2M0}aH6 31oٰL>}[ȥJyI|9@,u/0I&"ZF\¨@P)VE:!q@_ALg`pkJ[sKbVCQ7*:; })OKl6|E o2DH -q-M2Rs2M0=)cb+@+Dc5hE\'p~}&@)\uB͹# -$_Aw}E:: A0bV l ;N '.)UAXV)6 B`_P G" }OLb'gaa} ~Z; W^y _=/N>Dm0o/y}}XxZ:̮]pջjؼơU.V$an74v(C~W7cCaIk>G{ŗhIc!Ā^cWII6^~E3a˛Hx2R y6?\$)=%@DQmvCLVQWj?r~Wdgg. ӼZ4wrÏaCJQr=RC# +}Ax#vc7ɹ{4σCJ Ndw՗E7EP`o^J/y (A<٩t5'3CI!||d_ 6@C$")`{DZ@l0s}B8Q&'&0fwϗ-wd\EXVI &Y鷃+޳Rh/]̓`4 B2*~/wslW VwT6kqF0Fı"6o~&P5G6J[y'X~+kӇ|J/N9&boiIr?$5fE8̓Nōo34~k4w~YzBhcod0@1h#7r\8kȺ]__FrQlZC4Ao5 czIt!vbH T3sk`3kwf\ש[  f+ HXix ( `%B`,>",_6{RhrE]oMTQ#ZÅ۷\Pjk;vq,Ǔq<s#N~o=sDx3?*}kf8l~" i1@Bd*)0!nKX "w7СqW-[ v/="oPT<,?qϓAE,2@Ҫ)=QҕWBs\}2= t2PDW{|MpkDT~M1@?,GýR?ij7h?/ ZnzuΛoI "8f lb)k&VDۖXfb9v'׃X1Jk5XJbV\Keĺ\J߉$6-sfh 171b-V*σV ӭ,x)0r =E_YSH7*FMIRo>d3o( R*PxQS)s%|]s͵LG7?Olb@06D?ok$ǽl.?p\PXb[zF& ˫hјV'_fq"!s'BZȓ& Zsr(-S ;Db]8or =SI)`7kyX3?qX"Y C~?^[o#O=f$H 5`@}LGrRtxG?(RViԩ4Z1jÿo zy92RixT4+M*>?Q_ (!UL hCk:ЊG8vT[; >&ђ&q<,d:ǥ703‡x\?ex6ۉ t5<"`'Z XC#7d^ Ko+`|`.I`v@kUtʐVEӄ_ VЧT$֛O=9PoLm v7Gx> @% hqw$ :, "M@+6I"!k= tĹqo?ʑQPTT8'33Sl[TTDW]}.-{rJA_ VYD"$kML=NԾVMj$@ ODq֐`3tR<ݢ K@A-?M,#?oU33/ǧL]ɵ%U4v v#}+sڳ|aSsoUt4g''v\s͵ݬȷQWփ=B8e+@Bz(kX DE-V]"@i\m>%[ i*sőٯ-**)+++H֮=Q<h -OLLF\1#<޳ϿhKrUO"$HC1`!>錙Uܟ8$pRԒ"ا4>g V>z(6X}6rX'aC/z>#mA-Fgu;әt3DQENS"BA 8 ->KV{;~O}/8P\8&3kƬ`  $/=%il#"A*!ă'/N}JtOQ|~~7J>7/ɿ?Š k\Ӹ2/O++ Ї%#l{n)%QP+UܐB*w?ͯustDp 'ّN^)}h1;dؗ5pj qt6_@ggCuc߁v@S (žrO5`$w?XE-c`zG&LaE=x8-S3MrxB.**/77/x9dPDDEb=3 vZdL =9U oHo.h)WŶgJdV<9 v$pP =A8~cxܹ]Et.jNʚ7lV G0_;0!Ipz28ѺE k@D:5uA7R=g9/O}ϊ,9qtI茹ki$#M PyZzϏ`,1!LGRy룑u#zGK50&0J}iuXD`xLQ@ϨD_Khizv0WQ? sϿ>7gC9鱜6X u*I^Zݍज|;Y҆J'RŎDU!JΪkL_պc&l `2#8!V}3D>͆2<9-!&d*@e\~7c3Z`t_@4\$z\s5״fUH{_^@,b@0CAѿHyVDDD7pE4*Bx7` E]o":ݒkq&k!׿Z苩^N=/@E zaArћiRR顇|INmb.hi&4㽁VZ!F@)9yIüeQߚY_v"9z,˩ VcS?q vMrڎp&1gjUm%[-@MU(J>SH4#<uaN_@3 SaN'5\sMorC`E ( ȱ"@r}`c`VDh) 0kA0k"\SJЯY5T[z}߽2^?' -cn,~'%&7heQ^Q۶C Q^^}kpw I".d4|L_Li?%FL\94oVj"z'S J|"V۾zgbwEtf8 m!S?+CLHFZ((f q)ݸy,w3' GT\/rd&v\s5B[,"D`T SiV "iFE3b`fEL!v`=âςHiG_W  8)~ՙ7Uީ2+ xcrjNNxf3f-r݊K/]OG#GG1f8h|# 9_S5w@FW7k 乨 q%xǐISDH)(8W|ǽ{nA*(+-` |FP9wosm5"3Q AiG9Y7Vݸ.,3oj- FQZ6<_kZ,"s)9Et8'oly>Ѳm\ d ~ε؂Py)t-b]ra >"&<{5XJ3Y(Aﱣڒ+FݸU k E#땔I7*W_h8)M0xD8% ׸5/<|:ͦ)k@qT)y7|n$#~ R= UbW6 FCh@s|fAϗk!U@4;$#BAaŀFF =GU R:A8h" )%8AI𬣝^j%`J75"To57 f 7x>_""?#@Q]Q >JZHK%/UTTl `6')bB#U\O>(=DI& ) LcǎM~Go|yQ'y{[FO?,=h ZWxdL yz5frLGH, ks ECްo $>_exZ9ѽCPF g=/|#h:R/"(>'6YbAQvNCv?kC.][T`U dM2w,WQ zXa`UeQzwªNkqU:ZPA!h- bю#¥"V Z]xݬD/~hal,"l!`e~N~i%-цtc.}[G> V0ءBT:V@+91OkKgmO1pnRߠ9./t} A%t(wWX"zfP]]-xK̇/ "8@1ǟG}xoI7W6u>Gk&<˓.Q&^pkDSğ׈hv')$@Eb`5vOH m^e۵/9sЪJSypP`{>ǛHK^P-J3?2sA=c:ck+s/~P^xl(6A0Z@{\FkJ= =.%ąF^y+%tJ]-\H7 4To ?BWkO_<+3tNZ.,ͥɃJt4fPZF&nǘpH]TT|=w)vX_/ͷfy\JI2]4ͯ_J[UH>Mb>#=I}ϻ~'vѿ7N7B>=}vljp=/soZ@ ob:=/?:ckq$^R N^@$`WN,ЧhO:x 0Dd @˂·4ZUF\#֒V闲~_C>{Uܧ>  NJϦ4}L+Z._D`c7=gF[NZK_0TE".">wm«@-Lw!r9phYP҆N'11!,Y\ʯi3lVk>Y O Ŀa7< >13W%2ܿ.`9SŰK"n ׵@uc0|5dwӿ&YxMNCu L95]8ЍxL@!nBx\Kk Z%oA\ (-DGU8.=(ȔzkD?LaY/ T|D `_ 6!lM<X"@?1MYZ4e4S.e􌿸 7 E)4 QDӎZّ- /ŰRMqqɪ<((Ћ=d Z8A>`)~hIO+_E+O8NXux'c6z~z`ISjHEPMic.]itDaQ}v @>#Z,Ba?`jL9.t>q<]sL +E1}LX[0QC#3'xYq JGS݈2Z(p̎JE'-#G7mmRRq~"gĹL˔kk_/|k$ Ephr#UG6@GDj x 0"@\?ͱPm2:k>yB/YZA@v*?f}fDx>pwz!-̦Յ4k." Dpu"RHM-P0" B<S `K"Y f~NQvf*ޒ>#]xlD9T۽ z4Yy,3@3NKsi֐yUŲ*Z65Uf)otrssA4_H ԩ+?I5j1~o4i*4h {B;vm;M lMHaj?dFdYHh[;wdyD/3?+[9ۘ1<#`gj?'V6E~pNDюfg S*ogxQ je)/~ҍtSm{npm?O >}đj'M p5ZM(Ώ#8cpY[/lWD$RWš~KȌwpSWpB.[ZEr~'k淧qhfI+|%!qffgCh6tJdq%]?*7 Ĝɱa5s$ ר ȑc(h_1|qO8&O)5<9uރ5?So#Y %5#3@dSRiŤ4or ߈t㢻},ظ|<7TpNbGNDMV$Cg pJe L@Kƶ4-q$|Ia94\$ywa7פè|2"s_3&D`H5Hpǂ:k/!"@ɿ47˩=^t*xQPhV4G˙nK-TZe(#Z_>oMA_z|bk&<5E8B$VnM q̸N7 b8&O8E}xkNa"ĿKjjߡZjE쇊Xgq!P &~y>sTqTWQhvm}&H@MoF*4*Wi*܁-#Wܫg&my( X~>$Vt\&b_3kDy]iuMH9چRub!׏d/ͨY) =`;ߦ,%U'\$qwaKq $HRrZVhu9 \ZC4M%UHqdp>!oz*MX"R-"<.C[4Cq i?FhZ}t;y*by]NzQ W9ߴt U_,x {_8iֈ p?N &Nz?mL:j`ܹ_T\,R!B}ge8e~\7s:cP Pܑ?W‘ M@~6}:{NtwrB ,Վ<{n\{[eYocC{%󘸍XAO5kmIk\@P+y-Vmɱw'STwG7>%Z@$0+@ =f.vȻsz% }ȱ9Bf7oT0R' QHWCG%_BEDhωs (ƇG)].VHQ9 | &רdNcґALeVTPXH4A9}'1\1C+J7ōp9,8`1P~#_-qTݸ~&B<7BG&ωBVߘ*J kҏ|G;B #uhaB8t&+Q_BExixsrKtD=+3RH/F@ R(pJR XxxOmKț^oUgBe5В]߯FӦ >>Gq"_o|yy!c¯zчCNzw楚M@@+Bd]q_D/?WC LR~,ҍ[5k7o#vQ7b3; n]XkϜ^3I[~A/_^/n:Νמ#Ǔ&F|54=#!RGRn= pkvJ~Pv>is(!Pd5uo? 2P~ğ߈_+<8EOB\K^szm$ l# (Lt|xRG Hx4S0I7_BaED@a9iMWs\SgE6-[,lXҞ-@G.F8+ܩ_͑/ɓYkrUG?#3 OOG,:ld|1 T 9 j*D8R cn CpǏL6WэC}'I~(ooF !6@:&$b:sǡNi)B hKJ2 9s\ d`v% ##2o^f/f4MLGTLpVٍUʡ!Mg;r/ =?^!x=S1V}n͠0cp-KܴjP21rdkbyOZ_Cu!3$*5 ԇ(c1ƼӛK?R$顄m* Q?u1sᓀ<gNua 5&d´$˞G9'I7m'|Vxz!FcHᢹV\\bUsHMM4?őRD@Zj9ymE^o'7*e6 L%9p@G6a(\sY'LG(Tw'.Թ(SrV+=R̈́x8=U{s@V>SAKhTT; ֎ӞVNSwSU D,U>ØzGjhHz8a qX2_Ledk3> H p~szN"G8YH'H>F#?\>[-g/%QM 9Da8wI- ,mXJ=驩sFT c-}^''= IvU(= | پg:QE4VEUdӀvp M9f iKY[Ӓ1h2*+oSzkmۉ1' Po RG m\V;)Y;uJP4j7u!ʑB,C>y}iTȤV%^ Q}'is8pq[*foț7J?S=vv;cΏ  Hkz- [ Zl% ?7q% ǒ#,_׃Ȼ$w6Ƌ7f %`CsfoQ`J+"ɿ@F?=̓|^?xY,@F &k5K;g&]!ÉJ,X6! ui`<-c70(OBQߪ> &>{I3|+ZV? ݙKȦ9]9R V}%9))bX`{I@# hiֆ9 $ąfݜ;ГVnk яw=-\Dy%@/4 ^7;~v `k0gp2dž>FlFlƿKlkIĆ~$E}Ip ppcULNܑo#'#\gVG.7| u9?t}f]Mggt-$8J>MR?X =\$ '.,5kZ/b v|\ziIA%wp?ezDk vk\y6A%$k,b_$sEcwx*59 _+8SbGKXء*5"ON#oI&c(OFI:oU<&[Y ҇ߨQ,r%/Q >hm'iqa7F"vѓzKb/I}2x%*2ȵB@" \֌6iN_l~ibow:kqbF;@s3' \sQslfR3`l1`Hc2^`g-z67C> 3Ee{#di@͈ o'ɏ)@@E \nOE Jm@^Hm϶}X?QGm ZsМ-^FWp5G.&꓉MҸ0ޘ0,X)?(Nvb=%{$IbqSf3.l7 lxogDR'wSR̅wĺ"[桌DKvh YO X2\e?(85]"P6q;}͞w\5r_\P Cv4YroDf`d]&G,eo Ǔ|Wl'![Rj7"vf/zm]k-;x E2N}k/]^ߛ@A~g<׌ F(@ն~y1Vyx` D|Ə>mYBo}Wp5G0&?p GIslW=;!#6bC8 ޣtSUwFo"+^GgҺboaIqLA =^Z8?Ogwd҃ywfUͣǼ(T&5;{#WL/y (5p 4ua$+9֓BE<45NX`ǚ@PEv}2P 2-Ad(:xPP[5Uc FETA, "E `h}3_D"^!9v4G Whf&rĵ+X7O >N@M(chٸ2Z0-™Z 28?'Gcs8rlc~b#_.4A8޽Ć͝k鹡Т p a(fxx׎ FzD1RX0ڱE/Xc(OĚWHp]c \ 9jגֆrO!9;aR{Z5=8$d3WRvx!qjEljAZoNjty.Iج2MH?D'sGNSz(7*]S=NBj(>R 9J-h \p7w.E6'@@(t/ 6Nhز&CDŽҿG3} [UnѮYf.x;עs PFME}[RSQ2eDxDQn_$ ZDJ@Zΐ"'GӄKhz%@|$}y diWEbVPQTTw@^e;ПWӚY錣;iӫ蔩tuh@-+i+YAO@8uy?cx}|E)Ͳ7 f/CLHutky]ܹ]鬺.t1!H gt"1L!i6'Uֈ IZ"]C\p7w.3D R 615c/[ -g :ċ8Hׅi"Z44:o& ?," XAa +/dy,? 4*H_P- pvv [zUSLizbo0 !}ג2jK 'N?3]xl kBA m傴,Q4/R@#@$5>.j, 5s,׌s"*@`˯:R/awPtTUHsQ}F_DH1a>/F9723!Ժ$.:֖'OWHj[ϬSu6&z"h Kɿ~x #-)siU3gui"h!H 1gX"@I8,§}rO9sz\6蛟c[#~ٞP+D+_8N@Ds3C x%0 혁'`A?'W X'3cz8WC77 Ǘb/"vY FhS$z.-}t6 ¬D @F@=5e ,ݸ8}N_hpd]k7,'~>Ǧe)ݰ%pa7E#a6H`e!5H{4 AﵓcG?DX߆h/"jHϳ$1Iߊ8 wW8 mg/*{ﯾ^wXEjD'9  0ZFp%V}V8$Sf!zCK9BC H6yRSպq( 'Y]&ɿV(*,jvf.x5sz\`ĐY/?H5|(R ! )b?ZZDXHl5(EX8 6" D@;%U*8MN "@ٍL%1~:o^5] WKo*߳u Gc#?Q_o/a\bsm;e~8^ytS@8sV`k@tDKy-э=ߚK# _U9P 3`?4ha'paY7zbhrm/[CAIFB"V0^PO!rh?E3QmyLQ't 7=?IiR\ Lzeǚ[*vypQ;R?#Qv U ,{PeKt?X7(֍? (UlB +! ysI@\Xkwm'ɷ;d|}DRB'c㘍G#-!Zv~?:#/,B4>wB-?h\ ) JzWӥK"3uorW}x Ħ}e[O`t}l_;ޞ(4h;Q9i6[ǧL]{(kmX.S+hZԍ}r:qo>;J V 6;Ā/m H/^`VL6~,4sѓb7BԐ[j z!L-< UAM<7:"4= `K(A0 G3F&I)q Xñ^+4~ک.3m.{x =>vM/+Dnb- 3I29byh tIg4.bn3O{Ћvx1.->fujg*ڻ$" qp齿N -iK;VCy$rl6TG8J针5U5u!+(d) bxHA|\Or w'v`(JBA!:%3ډyC&4J%ՏQq]']F3~`s$.av2"@J%hQwz"9iiiďykaأ5G-iD7x>fR5.2o*To0fڨΚ֕'Cŋ¯i  A锏~E7u)4MVUAȔT ͽ kZ@Kk?-0j a)XCJBLn?9"'4Y`Zo.ƛ pD;YaMhhk Z>݅q΢$^^| u `;b]s*ZsX3i݄aF'Ի wqcOaA˂}y;/7w-yg^K},JH4~ӄޓjѲeKի9-^LG6 ê9~d{FUJl&Nw;GJzvPXv$13DxRh ha6R`dCB@HS=Sӄ[;(L\p7|. /&HGfxb DZ_G wMj)@AC߃˂9D`{:hQ:N~uZ~["0 Б9!=v$">ud ##Kp C}UyȓΑb[9sptu7&zmǟv7Mj֓ fE7m/hpL{ZgA8iJ]0Dl{rV@QA;?#6=Lzj9J'TхFZ]餚 QR `;Gf\?Ǜ 7 ]m?4\p7|. RHd,g1HJ ēA;a7{fx[@))r \d[sS1$9BwRͥAcMGCch!Mph&L:*]>bH vs5Sѽ{OC>} bW LRR@8\`[AACӀAv4`>__@usӼ ik+LW_s5p{|ڸyzqӫwu=v};,qZ͙׹ٚҪ##-N17:Ǭ+>XĦ| WB"R*1o,lHj'3u ivv`A53wVN(xfݸy2Wo_ 7,(a[qvDp5;Os!(η[E)AԶ!D~~x>Ɏ 6D#+"EgdR@Ѯ36)7(߱`q #|8f A8SMN^q*Zx3gȑ`mf-Yt F\yy.?lS43=2-6EYx۬q4e-3a ☴eU6[bV/D?k b qK9~?6=~uZ]_/<ͧL3܆j52 o Eo6RC@?+ kBT߆>&2!ּE0w"D?5!cѵ˽I8bI,7fX:Agfs% r۱c7vm;aN>U'" zl~u  EKyںVMf-ao7شOhTCzȿ&M̓e%kmOq$9] Ǖ vݸ( 8 Z;8Gu8Iߦvȿ (+;3pϲ&EkvU"PG! @>^X!# m}ԂhAe*B(B3sC2Y N &Ā9qi1$ U_oqMxC O n9l?wBuMQ_b,fvFk7M( i{ /ж?^ԈK_YY)"2`- x93_N%ݸ*U|?1c8aM{ϙv7S@uyHk`΢`VݸGa2>{Uҿ}-./3s)ǘqvgZfr$>S|~>JEF!6KPm Cט֌0]՞&AЧ <禞o2Di HXu "|=cW$ԇ|lB h1qҔM)M(G"K߭-}QÿϪ UJޡu]:-%6F@! D_ IQ@\}'1W&9ۂ@yQ5Ft`sABoD0O͸85b1 z o|}+@zM,_6oM! ijāo0s=#Ilfc!DАsq&~򕍼8C 8trm۸ Vt<5E#HvnlOC\_ٝL>Wzmqq{%6u}<~8/v7j^bdJ,DosWkGwjE hm.Ƽ͛K?(|H(% / Z(0sAwa\sͪ\kU.0u P/߈Wҫo+ `(`zF[;̭DfV@5A:mF#B1n O֓pۊSj hk+Aɮ?%BG*ǘ۳".03 +>ƈq{_h @}bt.sg-xc#ǿz.{:4m@)yRSBEB,ƘIPcyw̙yF猂 i&AfN^fMq~ϝ"u^osKǵ%+eap!ʺohTB7=u\bl\z LPR`A_&zZF@B"#7 KثFܥ^0ar $nh;o[&Z?ӸA;@~70(@YY݊1:Deܴ7?~LtL6_gxbqd`アz"gυsÙg|F;)' 'LQ0~L4U{ Ɨ ̝7/;ڥKnבfa)'p~ؼ| \uP8uǞ+W09;8~e0\*2nPL^'tauуgpzszp*8T+0fQmn Ni8#? ^,rD A"+m< C_ӓc@08Y_{] ڑ)".׏jv2F 8 4K*AOoym˲6Ť``zI״._V%Ns|d/^9Q,ןQ[J Syi=|6ܲ@D(aPǠAMArA= )OjLD0;W%8_93 J௥p Tw؞Ws a g"ˇ1,z ֏or蚓 XО ܐvl|;Aap轝j?nIxn^  OD_D\i4S;JK?V`4[lO25yF^n<3Z|'O2u_Xy-#+T ,kl7뮇um1z[0xM*c: }`6N`6|` n}6J˭p6Wl؇ l{.CwkLN~M6nۿ`G{]pMn|̿y | *(-! "WS |X>\X8-ԋ\4 ɐHnIv[NB?P w@;Yi[o׽?h?',RrVHd\2@ӎ{*71Ǟ|݌c/3fΊ{=$hvL靭]yP]SP^^,V]]RYY _c~=ٳ`! 땟Ny޽#0s(hjjVF2``SNݻ3eԔ=coqי)/T쪡mA՜VF^.jЀ|4qqHe{*>|_s XQ=- nĥ|N rЇCs "}h=7%E7̿~w$n^yzT4!ܖ6cpA4؊=Jf GEӵW{$O {bbA¸ w L"`[扠4c|ƙn@ܓ 1ש"7iI$%yRr뾖},E5>]`&)[Z^V5Bvd@71 `/G5f;"AӃm`oG_TW N>ȸ؟MbWdG(\3P; ^Mε%`xRI>lS2tRHȳ/1maz8 au?+s0C H .nq@3`iu !rjOE*_#AOA M{],0Y3VǔNSiN{^Ils"tBH';q3YOr27l, ~lџx9~3`0ObU` itd@0.90<7\133l38ss aUnšk9 J\SRV;PHqx̼bwTG  m_/oRq bJ8 TR@$ },N.r9UQr*wV:Xp2eIVƙ]"?I0Gpf׽u-ښ"Z5EPҥ '$X!/y"C-/l0U/Tn@Anܪ056.ف ύ;2 =TR$Ꚅ@\ }>5VSW*YƺוEЯ&uB*aVn8 x;??ށĄ# Af*&0 z1 UH$W>|̴=`@gK[VPlN-Zp'ۜ^h*ln NC?뙓p.TG 0 so{S 3L0 o`%,:BCAAA\( ٽf0V T{&2@ +՝ fǺϱ1ýpapŚApʁp25 `Q4Xe: OBpoQ -R $lu K="ct:\;X 8b1+L~tnu'%X ً猂Oן6[ߨ=xy4JYfӱw͏pSZzacX"R $>g LL4=EJ4L8. 8N tēN>-` #U# hӱQַ,{\f9o5RȍÕ6qlQ:%gدN+P̷wJj\ ^#6X,R $l [_&LL4i|=yHƈ3gI0{o;;j"&`8jY7gbc5W~0/^vwߩi6 jeyn [mW Dqv=?>A.I". BB<I_=ڷ)H wl4ZĘ?sxKqV6V[f)4yce9= 9xJ~1|"9>Iw1ki-\](tAQk /~o{v6|s"ə|v? }ì\`  ;3]./+QցHt)g q8/O}0M掠paAH)% "ìv yq}݃]k}cF+HbkBze%/n~m;z}L;"vzZ©4ϷZ\2`B\&G T>畗Be,K_H$"O"ٓwf 5C$ Õ1]z1 8NvH^ =Y!PBӐzTէj)6{?Jb `S46pH~x$.7c} };#BJ"eLdIRE$'O9U*揍 l{Ns`gUL 3@CR%t6 ~eݰ .Yl"]ob =7\7,myEz3Xe?<AdnSTnu-s*/HRպ-#dzo5tU˜. 7|X<"i _`߉.4Y :' 5-믴U~Sh8SЎrܮG. gF֓0 jaexoJhpWe?<Aٛ|,O*q'Ih3x.͟,GN .0a;73쭜au|\ EڿS˵׺mcn_p>ӏ9"cb6..[#½EIGMI`_ƍ7HxCvhpŮR "J"HMy&/CA}i毿j"*ǝx[/sumE 0h1gXaͿ^65ǀYÜ.4YzimApy`l_R5j鸛s1/$X:ևק~6?%P8oiQ$ .?pWLo'}ѩ7nw;WY(J"H$ML@P{+)ks@Ⱥw;+6i`mkgދ`~~oz`*KW U'"qm_s{uLC.D8:7_?  2DQSt_nhm6^`w,%_EK+DޘCTlRRɦp!bzg5`E]A4zwuL^9{mg+gm᡹y} {F>ps6KJHAvyukjß |?'q,J"DT@!w?Ӈ'[=/7{`]-{eyWEQWP#M}RՃb@V{f#-f{LrD ". 6?p1L_ Og_;p%DY8-/2Xv_tBA|ݖ)"ÿfy4V>D?roR4l\VϨ .[9MVqK9N-P38a  $qu0{aDGtXH"jgC?tX#.OQ" dt)pj35+ p1߲Q-zܟpiRLkg-l), ۅ!os?#x./T.r". 6.̷Kj*3 ~幋 .(TI$kS4 `%)o~ͼ F!͙0=e ( "]f8n2: تq K0xXY!Z>R3Ks'+6.c{řg8n 狓᯦NTߖTAIN!R `19Jjqv`91ەDf0,cǍe ***ez'ON+/$)p̅ͺMN.4gƥ Bm 0 )g]91a .`x,T ϖTA)AI5m̫]7Cu>|Q$ V7kZ?hXVxPf|#=l~ Wch{_ /1`glUlz|q9Vpk`]=ъڙvrC3p;!K(`N]". 6gprݔogQco~\Q?k~</gzli3NnԽbBuN1)sRm\Sf1%⽿ST_, 7.9O/կViwsÖ"mPǭ;ώҘ9WK; O9=YrH~p$ psj?nGw(=VUG tX|fx|{!kkl)0= jQ@ =ڙ2aՃ{ 6b%#SYhsW#ʴ6PT N \G.^ꔑ:_οo., pPpG`?G+E*]#AlDK1?ov#k Xy7^ϭ:LUEǝ sÕ1 gn%9㟄nCmG HA@`H~p$ =0?~{4~Q>/Y"0HͣȶLnaH =?yg=> 0S*+OV{q׭oͭ.Zh# Nz3#ӆOwLm 0 0.cUAcC9 7PX5'Y<*e=8yF1A0]e[+R `cG;Y$;_d}49,rmKr@Bqz )lNa_L8^0O 흀^0[.4h ]gLQE'w@Z8 9+.>P$螓 }s@9 TUcXv?0d:01^MIr82N8-Xd4  #u~:sJwQە%HvN'Rwhȉ&5 ( ð7&N2@pGC[p(p JA?cgz$~Rs28} 砇L\` ]NʗHAD [Χo~FJg>\< z݂ta;GS`@ОFټp+//}ԯڵK޽{R,xE5~84_&}2x~' oz<^\zYB:\4ccP4]`]"H:\ q0D@k9qGd2xG EC"/ 6 _Dwp*/̿]i+?_Ï>?:=*C2Y띿QޏǑmf̍7z0\Bx3Up%FMd {߳%c^`TfVY@$eH.~9 ֚Gi-f1n)7iq?9T jyGnǍ?[R@'SS3Z$f4  VjRi3Ht`Ir&^ۙq@v¥PuEoV(;˺Bqq1 ~Xl-e=hE A9G?> etJ 5kOc;usPgT)17emZ-oJ cǍ7zJLw)Eܸckyk0(f/Ϡ[=[Q~79ӌЩ.KoP#a h]G :Lfs꠱_60#Lodh n~maw "X#\hO5z_vՄs:!`=nW섲2e5w\lʹ:3:LGqo4^Th3ih L Yh]n..p?lw\~l8@4օGT’Ianjz/8efosKqazpYho@akܜ|S0XqX0|)>^ff߶f \rl]RbAqw02;o pm "XY`^p/:*@0]9„p{0q en-5&@+:?phxg?Y2w/:yU=ڽ@f&dS~u`ͳymnj//'bj͞n.Yr~Q:`-oxXJ D/+f4R酭mmY],5f3ˉy'R `c%/_QLn̝֘/( fqQ UQV5mn4[w}(zХ:U vtG@ `E`LKj~Wl095Oۏ!@D_IԛSfV dž[U> \2e#?׀@}f]\8kQaC#\{P攡pC`pm }\!.5 L-P *@)o=mAhpH~h$ /%D.;Bh oNUa,fh-m7 ҕ#aZꡲ /4?R*d/WAMN{F "XIR;O{w0[rt0\j9wl =۠~R `_)"* ☄6398DkfiL _-`6cmgrw錑.5@(Yod`_꥟D+GZʹkVV 71nm 1`i=ŵ6\f e&W#/ŕPFA!D + LѿorXX.Nzzųu*+ۺ(vui@J f ˠHYa ~ڒzي racK ikVƷZv7@8,#-y9⇷Vt.3W8'Ǽ(7TF "$Ҏ;s|wjʭ])_Čh==)z[v 2} 19JaҤpg÷stK=_=}MÝEj$`^6}?gfg2=~~a`3_͢# )7 -m8 (~Xy". >Ԯ|1YƂt-LLw@zt{Ǐ|a.7$>uWMIgbykhKKl9 dԭ J pÍH7N2lP8鄸`vYa zyzٺ[ZlԵpӾߝ gfXe`i|z7F)!V{-Ow=<_58"iW+fh,m1?pvu F F $`j]f 3n92\:ypn,{/ d&xg;nu'3v gQdG|0n-gH~h$ O25)_PSK6 3}{,z4< N=U+Ai 3@=c~S >p3pRɱE pʀl38 pgYxWO+jnYijnL n?NBAEvF*+k s4۳@[GkeY;3Ecs3Oe?4A'JՃ)Ahc7&i,;Eak\5O NugXR 烊ý_Y ygnyWsgsc_7^e\4P!3.8[t](ؽ{lKZN3wW71ܜ -83<6 BAEWxOK< lM̍v*Iw0+uoP|2|YZ 7DpTF "R;{k=v#j}D!EttAc 78Z7Y/@.]Hng[a Fo5'|#&/`-`m ֳjގxvDJ8 w0. K5:sX rsl:S ؘ{V_Lf{2xgCpnA~qTF "΄ow}xtHP|n"YS5ŵp8c]]] 3fΆi'NW#555$7)h0Ӱn5;Պg'?<?iJ&P3Jc37adz}M`ޝ"fmc. K+Gso7V\20(bnY ś?vz0({}GvuI> pD'". >vuC~8bv{ǰT_ݮP4THxPWͪ}1:}3> ;aK` n5<@1=->{pΖ8 ;9XûUJldW@d @rwnӸN6`? :;B}ǘv͆u7XR1^Us=!R cWc8@; o<ݞmQ>'E4S\;laju0=:y`!$j7p[Oa#)bLRFT\ /-mVV֐32J$~S*j#_jַ׹S&3=\(RҼ"8Bpg^^,¼B\TF "hK5thJ@xӞǾ[љˡ&%tv8 Ժ7Y,V\w1cn4s1ùE̿xL p:I9 8Y t#O85xnm7")AV$#?{)?c<3}?4^1KQ`?}\?ԊV ֥j#Sz[m`Bn>Ǎ45|w%xif^~0  #"4{\_"GlfA@GiY9VtIF"%˕ͲI cv;nz̫{ vggC7n8 Z -*Hޏ"|Řy+uaW@dÿ] tp vw>55G?#LL` GEie8_O | G&@Ía»99m>;ܘ:jk{ yEhwkXCڨsH~`$ :RWO载 `;]qc2|v<^ό/LH;3 wj'm8[78 G$+j&Q!٬ivu)u#>:?da X!u8 9vnrZuk| :e@O40Dm` BhXs}'Z>]i­g 5)=,9pMa)\˹sOQWT;+iί9(RzjF]-Ѓ 2 =_CQ? =LPا oq aPGDvxBe?0A?bS{usx-4u>|AUUcfʰD<dD=lTd#d vE62Hs2@`kLzp2g~ 4 <ʂ~İ='gjr Ei{0AchR E+G‘ /0 L,h7Kq00(7͇Qq(Z9K8k`sA lҸVXwr.)C9!3U𿭙y jzxXQ _N!^n|#R AĤhy38M&O:w|ݡjG4柟.iP@V9n]NۗGF 7tJ)@pŶkuLע#ߪ% 8:7pY XiN11Xb}XV`V\ `S6y}w6]! PCZ^VX>J0x(¢BϜ\Ƀy0&7Fsf"hl/K Bpea*n{-Xq-__3X-$~؈KMA`[=zE+G 'Il4rfj4ssN1pZ9wr~S8c\e8_p>'2y܆pBeN ̓-tAD PpuL!Qs\;!(՜-ʆFe@%L}hi-(3w{qp6t}oUz]߼;qae5#.Pb՞YLFZwp*~WNOnL10s*287r<1SmϜ}L~a d^]; 0<^(Z>Y.{ke}ilW#9Ù4,,aT 8qncj0;U#N]pnt99AD ΄Cw*_j8Qѭw2Ck1p7la=@EͿy?RݦM[MثL״>e30kYcs|=? glhg 0p6|'~]D )/19QӍS9'8KXB,]L'*8b{dG-Syz)/sdMaBNo c:s)z3ހL`AD!驝G5~<O}HkXϵC|>ջ*9Fyc5t\ [ [DwK甪'mᨌ[)L"Oe" 5c\L)ST3_P G1` 3$\os6j 9`ZX8ܖ@ %oHAt.q9wY_~ 6Q8=| 𼓛eŇʿqe=5VC(#b{S&S`ݾ3@@Lkr#dz0uFNEGHAt>Ե3u:2@)\j\wFe օ]3a|/N%e}aVʰd=gc>vDLPȑMvU J@L-wkp;\)NLd? Ax& T50М{b=ƅb1?1UmmqXiYA@J"L,0kݭ)Q\fo))AD ()0}V+'S}pXa8u)Ϳƒd~?Ws}5H@Ln1Y)* <C s#Ƀ{ě,:2a`L?,HgῦP ;CM+gB@ )F~ "#6:'>Qd?A7@KA*o\=vtayC5} 2v8dgdE &Kl[K;(@ ٛ|,#x.\aIvɌiӋ};]di+,XXhSk-Pd}I8 D@HAdCyX& 0`{s4?˼^)( k75τSI'DVvAE & H1m`d ܐB ";H>PČ&)dtf\/]$FzNWONI#l|?.h16s1bL&OH/1Q@˴nn?mU B ";p ff4I^4Ϙ-V&3o HX>W 4Ӊ$ 2>^f^半s{ RT_gpMPKfԱ_f͞=C_H!AH/^0V}vwnҧ~ ?ݩO@gW\5C Hx EADv N\{9#ݝΜԠIO[11`}Ok~~4?渱d|p?$ [V 6B @zkop? Won`J>CO` 0q8S555?;)aLt2Y(6 RIsAH/ӃLHUq~Cqk>PRF5?{[QH$φ~Э{w(**{mIY$cSf' <" ";^i'.vc53oO{aLp| Px DADv RO^LEt{ vʾAh:IJ?R߿A_\R4 v1&'I|p/ u6Qd?AفƁڙjS&:4Ј7iRSl&W\0j8hQє"K> d:(@ @z$`(?0$AH$Y /H6%j)FW\(@ @zdC}OL> rHK(n}#\6RL @zBVC 'eH>˦J;n-<HAH/!/0[z$b)=p7(@ADv ~\]^sGAcns(@ADv ~$.,[z#\ VL y9Sc9g* ";^䇀[6A".f}v(ϥ Qd @z@Xf?ɮ# ( g?s78[ AADv A!_A)dѹ6~^?7 d$>@Ad 4:×_GdH9ه( mi3] AADv w衏 8 M }   @xDgFP1)J`8ufo(6AH/Az#:+(fn<}8|}\,z6@d @z"HT>9%] nubH$|eu@!Pd @z <߉­_sKUO^F}    "`GXw^J8/1 Rd @z *~Ƽ:(*]R$o3 dnnY? D}  0xܴJtS[ń@SF$"lzF>AH/A!Aqa6YpAi`ݬ>gɾAفAL3' d"(@4d @z *49RW,2 D<@ڀ. ";^ B>&n|_3mHU&nؖ{AH/A!A=_4xIQ K P{AH/A!A}ljPnԽI̍F}    #ۘfzՔg?^5ź# h@'WI{AH/A!AqZ^D@vBm@ҥ$2 d7XI{AH/A!A4W[A@N@Nڀm   #Yd@?4]@EpɾAفA9L3]Bp!pLCr[mdZ./ @@AH/A!A k^S岟"yʝ`'$$K=  1U-'2`D}}(3C < D{ﮑN3, ";^ B>4W -m[-K d f2 V~.7;hCmsm@=  3cĕe?EVs 4H{AH/A!A50 ᶳFOrO\8{q7^R=  f3-m 0ih~/9\uS$Տɳۀ)g- ";^ B>94zFawi[Li2ܵS$U+K3?B ]ADv A|2->'l?wTDWkr3 Nw icelɾAفATU{$ .o37|[[m]1NQBY鮝"y, b[4|5q[[=nmU8ᲕZ33I ɖ{AH/A!AqioZQBrO4~3nFpۚA*k)C f5ܵS$U-Ӯ_變F|ؼ| lZ6ϫSgi`n0g\78 & +ڀ& ";^ B><46vP%\b6lVL KRFLQS.0O U j7vqɮ 2 @AKvd ~z! #AdK7ɮ  H/A?&E  : @AHv=d;% 3a*0&ֱd"(ȈhǐR!jiNj E)Cf,?NtFahvdP*IL00TLZmjNm{Yk%wZɛoFCh{FCh{F"j(5 ށGhf#C3t WǏo?,Bo, CaZ: XߔrQʻRL:eGu)7Iٗi> 3;+5kzGhTU,(6==)Hّ;)SnJ9r[Lk]_-dڑ7ybiʹ UW]s\reu&H\{ikq=$:)I|9|LZM"Ӫ zlO6-OKer~_L<& tAhUUllqԈ^W-S 76)< p~lwԷ`WGGGߝy6DۮalrԘO࿜m ME:)t,[ɓ'?~}r16c,_?,XݜrsU!I(矟8ɿk׮_]rrs }CfF4$i>K)B؛!^_k֬RK[3f;fCS)|@SіfMC!@GEAu}hf)\OAb fJ;.җ87W^BRv|̌~Çߺg1akfѢEOwvvs=믿߇z Ŀ7>HSvue澀,4%]N%GO]sRޗrqhb .m mQz~-O?Sz)FS,ֻT;@4Uf r΍݊V{m<$VmZί'Fs|髯}5pz՟j'>)qE-?4̑ɱ\ۺo.׉v;rӆccS?]g&Sw\ǕT;tQǮZ Ke>nuU)sl5Gw& 06W;Fas؞.4 3(---O^umzџ[SnLۍʹm+{v[-X;;;MLL|Y@[h /Wӹ\'OEl*HrJU1؞#+;w|t &.T=Kk\  ,@9UE'!9MEX]>E?pBjWe$T=lK[\ 97ȫ.udz &ēl مMɋL'@lbџ*>h)rq%u軔xeqh"z11xy mJ Z-r? p,S,[u5T_PN=G I4=5D}@ʨ?UN(|RJZWCO 5<<29Y:Oǭ]Z0#ZE> 'T9lK閛*i] Mѣ0Xlk ,Dccw2Z0䔅Z\}+TXABT"t̙?_Ϟ=Aqq3nw Xf#`hGIm)Qin+>[Js3MLL|J9qȑJ%-m1y-c  ~xl+ae֍<ƍw e#x]oBavЄJFߣ9W$UDCOs>P)zWipp0O/~u'$c-0Z{P)zWBÇSN8q(Aو$tq['4ay81o{E}.47S@zWB&cǎrBv|!w|.CF[`zW42O 8g3X%dN]?~"= NC>Az"$2 .hPFHVn )LP\) edME0їЗqA_+#$%pt] ]t2BF(э`Ѝ`QA7)c$k#XG֍ 2 믥 jCKA(dXu#i1Lh18k1bpJY,h9rqAA+#%t$z LE0@QFLց0 葐GB=R1YGBF}(xρ Pxed dn~`Y, 7X0v68fϧpѮoeӟ& V j$5xrr ʉӧOKZ+'80wrp S,[u5qnw)'\rKLo_}ao1f=6xֿe`bb"ܹ+/S `%XJ\YIjXȹFFF^%,qC,^9CمMɻvh?S,[.u-d>.X``jj^m۶mԉ9j/nJ l mJiDΝ;_H):G/e֟*'.B-ns-<¹O<9 #%'nI,?llBЦMMRtõtV͵w7^yJ`|'0?1FWZ4c whf'FzhKty cMskkV/?oMMM?qdgnL/|ga.lv)qE-ԩS~g}Cգ<<;V`L[3Ox2'38LgY (|Sq* AX^tQ"x.\8f͚ax1w3!r~1ŕ]`cؚپx^ԍ8 G5^~С@INvLiG堙{G"tRN(c .m R6T:֟ Ȕv\/nڵϹ <Nٵö1luש@=&|sc%r{$Oh}ufCSQqG[ snm.]$ӏ!މ>~ `Sُؖ"eyPP%5%=\]%h:Ç'`-ubވ>\??-"eyEUw?P䱅ݜ/Ο?wQ69W;<+ ʇ_g?>)kWKN_(eYE Ѷ^–~-ʇ_g,Az\da4'3pWsoFVtU'PV-&B.Jl'hÆȪO$e[bz}T,8b gĵц6NDX2u?RR`Fy#gz+Ξ=ɑ#G~qƝN什ـ̈́xMw_Hm>)odDk~opkY 8o޼;Jkŋ_;wL8qh8p7wo?|wBο>3B$8zi>.P%=pn/A`+'ª_!'YO:EKpn{o7)*$65v~?cl[QFI&;mv? x>ɇƄYqiίA'Y1ip,рמ G>("8̣ O~~ԓ$%A<<[% JS}++^ J|2)xWwz՟(|-+`bADp6^>>A }\1 NO$5Y^r[ص(*P[ɓ'?P5m blF^vxNOTџdIVlD6W$ xd,X0022軓_d9m^ 6Ѷq {_W-eZEt.IX؍r' 2|m)J~Q}bbx~Y. ڙU߆ˇ"\>/qa>Z 4\#4Y1}[nXWQRHٕr{A~60}u2nY 0hMHʾ$>&+:j! :L35e{ʵ) [LM,q kR$ǴfN.! \OM[r]MgIsu-Qw~Yg` JZ2^sݑr] ɴ#i> 3;+5%BhGUUf)Sޓ42&cvA~n5n':1kXAt휪X֥(J A vJ?,Bn, ꇡoFGhf#C3t ށki0wll4wl -EPKIENDB`teeworlds-0.6.2+dfsg/data/gui_cursor.png0000644000175000017500000000252212140200333017233 0ustar felixfelixPNG  IHDR@@iqIDATx[lTޛM&M[vݵ0@ fxC<S@P&$/M*C 0e P 㲍K,"!@(cHr'dKU?;sb,*2.x=.x=j֏Qah)D1*Lk7 Pg4RparAȏ ~7r Թ.Pߍ;A}+ ]!P_ :˭ip K/4jxNgf~ac-~!w(t,|1wm"=/THVkߺ i%5Q~!umA|,RA]zM0d?qaA \AD}E BN4Ea'Tc+1i_?L,]{\Cn'IV =6`X|anLz:E^uA?H*VF;B==Abc1_W/!HOE;%V?ܥ5ʓ!Ek M+>e8IB@; A܈mQEKҁL~ Ų6/ -?Ecm0B|NH1*0&ɓg;: {bBn6gc4nFYҮ-ƉMT-_ L!vSM6 7Jj!}D5yqcb_뵌 Op<y2\%q}F5y$2{ڗN#,<qe,zz2B'L7bcG] niL;"NSB䎯Ra'c~xĭA at['ǢٲB?NaH G NĎZnwC@fas#ȏFƶagWV*4Ddк0g?2Ga-@ HWUH_F2g0(,H TF #PT(LQI)ҐVhF P%TuҧOw 2UVK( h:hpb+(/'̾ZsYS}(F?臞@_Z(j9xTAfUਔwÍ)kʔdHH?y zeĈnٲeՕ+W%$$Ȱ8( l%ݻ-sΝ]rR}_ Fy ]x )ZQTxB+z0=)0@#AYks鯞SiG񮢢Q 7zW z>[pTӤ] X_ٹs珘5NWx?vBsސ?ЂiL@U(zp[ScV/ÅF*Wgn"˺u4SQ֕+2l.YV'VPP~_rhr]8/_'|2oǎk=G.ө[nMOJ~oR[szؐ_B&k"-9`2I]۾}+=I4"+R|rBةCCߢl+_@3:'#ڵk^j>eSLIIIX[O8q\/P[gk.<|3v72h0ߋӠvW\K?_pi\ Љ%pL)h PI9 صkO)?ݻwIE|Ueԩӛ G%RAunf~$zeې-?g\rDs*f"^aj4PIb+F"E]vYZZZgիbbbƲ7%8 Z[FްX,|NK (k/WĨ\@%YQ2Rjjtڶm;GsnRg8 y[A?eo$D'.Zc,g`W=zxO?ܒ#GN_P{l `XH/d7D[n{잴aݰTS@vtڵi dɒ1VgGъWϜ9MM6!g0xD:{‡B0ٶmZY8 4[o޽V5_]^PǟԪ'֝dO<˿@_Ο?""&8 mٰ֬Kj;{ަM!l_~>EK(%dZv=sذavʕ+I k`W,ꛬV<-WfJ?Aە%D-*TÔX30"?s#.{5jrYNn\%ɣ~?Nr)4 G;8{}Xb;v؎$YW/F~򔘘x!,og_zBf-[;wn+V|ޮ];Mky^ѲJ35aCCC_1cƬ9sR}c#-^b/(@\)L{9(I()3YAG' 8LOǏAd{v˴$qHmFdT"fzZYŋhsYcX/w 66K7͔]ۿ5mz/LS7oɔZVRzL}5(:tDG0!aI"3ͧRH5ݕl?1n\zC U)B&/3C@PGJf&~?C!$>}%vAj'3??q}~J di+N`?2qr} ;$iP'WΓdd,sۀkC0t#BBB$coܸq ׌;=7mڴR3%inLLH+njĺqSr… wIlA)_Ƶknݺo5 Qhbpꟲ`**/OYo4vhO3}v\ԡ*9Ln߾}auOp qMϞ=H/-ϔ+ B\Ş;cСLX| ”WGr2߳WqV8xE2rz `?αcr8\Ԥ<)$5DsIc@ _U̾0 :thvArh\3z)RoذagʑϽ{W|SN(:^,=st[i~/9=b,)bcc/ $ZUb~!H58]AO1"݄QPHZx N>->`拡MC908Ii0[5Y  ~(oWb,s$Dܵm傹QZz^H <j 'Ç' J@+VoNG)vEGϼn{=q$$xҼۄlA)OLuq=2ϝߥk^ж94sZ._0tCzBC U}x*U1ȵJw%E+m=ޗ$Spaꯪb @i$ @ g\`9ho8AOxP#}GC@ըyFVfA7Inlu6R &ۀ #=7 ǺۮryD('6Uz2Bs m<-X HZĉkHHtA[W8(98"IzPp@-K==RĖEǟf bC6@$/ǂ}Bz#xyŚfhHȫ'ʇ af(KLtA/ip떼(H‰ХBރɃn@PQixDblM.Pi< E/q*%CBb3$-T"2ɟ( p $E0f\  :goȐ!"Rt>[1<~PN%""EUqPĸPuܹ/ )rH&LG9,Є!8mڴԶz?_( lO?55`xkj|$¼ TI|X{P$HDujgO͝sVTrHhv.oH0`8flP# h"d{~f.I[( pU H*>Osx(Ν;Y'؎SWs(r~E)|RB0aD!=b&bd] ̵o:^p! mH~kV-s뻪 Q{|Tw^ o/ qͨVo]1_gC!kDm܋,OI2q[q/'5$2+]1oo*U8sYn^HWZ:j^*zArLni>Rba AmYoJ02}y8IxÆ +P~jΜ9%BtxJ d@_Y( Yi))y,P=u $shik΋yz `N`?E1h};ZcQ^ 1bOe.` |ɕ 1ii> Gj* }_xO?/\ycjZ:Jl'ibaƗ{Z~fr _nʕ= @q}q(ԀT]ˑ8pxkzzѱI ϊ@DyPNiǀ |-P? ՝pGi5@آí1SArϓ01$'@ٕdFHԙccEϗ)o0兝(QD B`^:vpDQZ[ov-8ukZL % f (#(UjIx[\ 9Ak=[\cHͳvԡd眕t %?Lxȯ`zoko8.J73#!t%BByPلr뭘߲ ?~aYΑ5TfdNdJw)m+=W]+Wn^Y`ymL`RuW^ U¼+2O{]If/^P&.џ+'{U Ђ}lWu#T?ڻLfz.ohK?/YέZj:Q:?EE:W_*sQŽ~+zcm9\]X׀6euYc2+qz]+xD#iz wѽU*W畧|+_ozUm䏽*uaiT@7o} (tT!pYƪ- 3UkIEshzW.E"{ oXB+72J:ƆY{sq@|a.ҟ"lCtݎCu>kp@H12U~]0ެc R .'.ʷ+wpǻT_͕`ꄛQcvԅR *^ |V^V> XrY6N\]YU;NTl=hGvWq<Wߡ M%*<,q.MxƧoa⺓;qV^@}Yl`~+gT:Y}8N QQG Ri'@QU1>S؏tZ&Lu t_WeB 'In_k,WK&9G@{׶:ok%tT=uCJr];nԟuM{@jr/7M^`E;iJJ:tUIX#ookU&zO9OȂھ*3+SEeͮu]7!cpSgw[ܩʚ*=Bj`N BSکd/I΀=_^QKEV~ ZXH+ӫ(i%8d5s鳖*ԷS׽:oJzH˿VťR>74gCp}]Cgr"`m%?#BaV *C}.^'"Ρ-UJ CU5f`׽J]Fx/UP_'Ats!A 7OhpՙXEyU'TuM4xW"` pǸ)675*06 e5+{P[?Nv'XɠKx3R‡D)FC1,DYj҅Uv8ZЖnAe=z*xC?0dqk*Ω"ޠr%I "&\4a05>Tc ]l3wdAF*cA<-{<֥dռwܑntit1k:d ^w!͍'ȋX!O=ύJNVaMN%O%:OEqlCf-N"g{^jSnN{VE) `?52} bX|KF߇o[ϬNtWR#1w:e&fR|₟x岊AV"k,]GR9A '_sö}/~S*`ݞVqa>ʚ{IeՠmLK.GZip "m% "oG34vWa%/iN3V\{|-,͙$WPX/G<ޱV'y5{32z)yXl]cGVgk23@ੴ1xC$]ߜ#ErDԽ:]Pe_R}o7{x~=QkTdԘNC{e!vݙw=ΠUYe(ZAVٵwb 05N049\lvdC*.S#ol ][8ܨm3~%XNӐ  /HQX'c@9ɀD%08vv*y*py[;n"'h;j-? )[ y}<,U ڢJgtxMdW0mxbKJpC [ S6c}'b(F |On#R*d N<6si%6E bf@@x{\\ƹc\@<pprXjp!'@RkOg=60֑'Ck\V ;7͹жoW ̚zpwG  #GK~:7wa Α|3"k6a(H$/s1~*nJcsRh 5k}G;տ{${DG^Cj@qf Ns2 ^@gI6q@{EO_)c rE(Zk pc^=*-.7q:nWMp+~fȮsW"!)pROA>-g0&p4TWzp\^rίR| .?jsuD_H.+_Z8N=hjB(!輫 skNXnh7DW.0uHSX`U61{9msAA!7>į ?w}+df#r9R5l._yWR|gW&:nvmjBvș`1bbIy|s}lA]w;z©Dvq3*HpXqsFJc^A }xFޤpKl)6P&slS6o >/w\N}۠ 31/׶5:t/9od?dؙoPUzV F `|WOU?!c  $2ngl| -|?r*|?nbd) kFb3% N# ag\,-9J_i-A䡭еԅlqD8 I㸚bX}JoheFLSoscxP0K6 \RnZ>Yؠ{/è*%{HcmGҳr2U#]m/&KG %=## (4 ^e.5nV 䳺)<􀲿K>\Ms5-P _#7>T%דb$+15k-, -P@Qo@q\cMvUO։ZOa6Y ɏgΧHuz?3|.kǧ8~9P2ƒXw}p+ x/Q 5w#q!D&}+TJ,TVj!X@ǍB* 48a Է}H2@}2ƨB.QY`=.̸D;).wɜW:/JoD̂+!IB϶PPI([Z+y !y-D¹.]20X4K0Z/JxV(BVi={eXP`ؼ9/7H *cg8SrO{[MI'+|]QgL Z ڱ[I/nR9闡ӓm+Hܕu2ث^oB (`R!r00XEeriEֈfPYVWۈ0|9srߙ\5/WH@(Ao/b$_2͋gU}RMa*O]*Yf=~2Ƶ]6<_$^wI/)]5ppLZtADK68\iv^NݸQCb༊yAVpW!7ԥs-I:$1^/-೬"ī{gZÃJyu^>̱~+-yy7Tk0\&6M-b$B7s}|G9d֌7Z,jō S)ȹ{VV1.خQH5}$i*B&Vb״ͮ1WWoOސs-"D|w(}k-C߃y5س#\wᾼcN㏫nybWgY?cWn<|UgT]?p8GPcwލ<$nzzpjH I1BP/+{deI#ZppBax`|>_;s'' Jps(-0VGFx<n2( [=z܂*9|_RT.QyBaĽ*s-Sc~C=O5vFիM3i fzU2& %/mTaSOpB{bdY,{12YL~Lo"RX4F ᓶiYU23 9Q8-5Re~9|-IIPJH*FBBƗ %Z iz+P?`֚1ޏp== ~ݽr:jevqY/+e J$AjE^ac%0c9'U0bڣ\HKI6vn[z^̣0K}\6ZhBgy ^B1ӈ'{dD_w 7</.kyK_⩴ o8'Vsش$(7a\K]*+Ikso8^\5Op0ºL1cvdycsr Aߒ ! "B F wfF+@]GC5ݲ _?[ʉCI8f5802|F*X,5}Tp[z!@^+=,Ay̫NΏއ >(d{Q^L ݍ<'䑷F+V; E|W/JW-PC0 4zONA_=I Z[p{7$$,,q욕s\CN|]^OKx|5դR:u+GX. ZU.c2'_`s̙ƞ nQg5kǥ{zN_z3}3g K5"G(Hwien'^sB9M򝗡t#~}7֠Fޱ*5-ƨܳIAu8,;n%yBg%ƬanO' F$ITyP](X|*sLt?}3&+dx?]|7^2o5tf>5AU!^9g0n|AqKuoryؼ.U1NZ^ 9NUo aE!5z @ >OWLwbs6Ǣ }9D.ȡՐ)6ro4^Dɧs2;Gz )p%G3TPtiwbJ A[ oD6TQ Y1Va n /nY s mX(w3q% 0 ;?s;s7 /hDx{M|#ۃ }.ʿ9W|#uؓ .t {0X:vf ˶ ԣ3YuY_/K%x8O= " ~&e$j,CŵxכhpF|חF, J⌆iv>_dV6߯!n`p,RD%H .g]J|}6l:ج|1b]ZHIg]7rTAs:",nC:|ӝde8C-'/I+Br؊DD9-]NbDkM\qFk zAoƵGkH utu0FIB[[ZF`hj\N'#kƒ:}_ jkPBGY4CUYÈ# z5ۊ;Hb 7lbq0X. u$d#>*(s*ʔeߋYXזqb@Q)5g:?Uw~I>@}ԐNr%,8e9WVv=ljW%Y2)cSJp*^ ncNkyK^}S3y*$5#u7L}*w=/Զ$wu[R`r@V;Ijn>usz4BD?~SuEs 33@ގrgh9 B*xLz.V#)Yo|BA$% qu 8T)dP.j0Z+aPd{_NX?'"i/ǍiΈ8֮3d>~G}!^ wrsf #^ǡ_aֽ5eqB"1~Ug3@A-\]Q.?I'< vAh1\F,7f~I/ttǕB wWn"i)B UMeF'7W' bk!0rPX#f$ɔD{&ٛ*̎6&8i<:{zR kU7#uDx.s CؓnWMCUqŀ_ % *Zj*&rɗ@k`9,@`5xrd|a@ #ƸVFNqX&Eem1^Rf؉Mhwb&# B26{k Fx㺦 ?d\͍pqZ+O׿BD >h06Y"3MdȈ;+qm۱qy!8C2&k0c|Fĭi}`Ahc'[҈XKƭ)]ÌNґ8|-2Cx# 66oZF|úBB9Fkvw}Ij7MW}Cr{lpTC=`F轍8Y:z&$8OsME$-,BWĖ(*pi׈yOnglebw4TLc䪬P%ikX$no۪m$͛fs5x1T/s<b}dH6;CĞnx-I#u0DdcugWb8eܚXw*axm~^+84RgxS^y48_bh-\rtjs> M f | ˭O6dels;ۂ7NםYw5Tx$k em eOOYW륃p  >M6c%)]eAp=F2M6Hl#)V1oD+)c? OqUޭ25څgU*TB{uzJeutUVw,=8k6:yvu'@~ ;>#ˁeϪEޑPO^rr`ͅق/E:?${DZ:B|yX~zڼ͌ƕAXSccfa%I};6IQD'N4VL {˽r rUwj  Nқ ׯt Ý<J:8x;@P}>CτlQ x Nw`=/6OK H7b>G- Y3E;y+p/{#a.*V]'- &Ux9'Cw]c~9 WXxD(:8Ẕ ҙeI ky}A"ΐ"`0s.=! Mľ%.?;4֕.Ėgn#`yۑ~5ֽy \/9s&@2 k?Gl'  TqH9m0s.7r̶f}Hĵ|_:e<ndI("zV/:+25aݱrU-bsHyN.5. 8L]Uهv$?v0Ex95- {y-WF ܺO|c ~/ BfŲ&rxn9`8ݐT}`Y: ://TRXXz+؂(m0Us(:H)8|:!@ۈԂ ߈:1&kQm99PVs s#α>ʉ^k`.5dLo142".|LuC aql\ˎ\Ne\P5czӢ%PZ& =#~7ol |+׈cOWٗr0xzŅI6tV=V"Iv|z9Z1jQCo2TlrŠ}m?OJ㫇sul:H]m!d YlNc&r?[ə;=VI;Ec}/&<V7CUuA >ƨ[<bP1ì9-Z JG=UmkR@O)H| + ,h:us+?Lg;|:Kx"G o]_ehwcK2e[Fp102#2rad 8F l^꟞#csBu17X_XK,R [zW9p~+h%}9ptu =-p('Ƣn$ .pz;@8+ sG&9e}OԱ$J;e!ʘٓsaɑ6x) RNl@涘# #o/~`k [`5Gl6s2X,zvx!ʹOR$H]"iXBVʷ#wi1I> Np˛ 6;zhFkZR,m@*!82z~  O[K̎{=1ZXYAbM{]7([x:)*0Pu>|nm#Bp0:zx6:-Β(Hr@ZZ ,Ûc?Ua@8E۪a")r5Kp8J%E@GZ,i62XF LʦE5r4.#uhAh? H ihP!c=ག=0uˤkms_YH7 cgJ~rNe o:F'~Dz-Vq+_'0Z H¥e+1%,}bwGZ57[?ϹZW~}.:=N!k3w \%# QJQa/bw/ 9cr*ĭ 9+P粢\e [ܑsFR,-zXwټµs˩ pP)Src\B}^,Z0!l)Ȑr ҥ cK>o#nc[;3Iw [M4FR{eB+w[}6 -4jX],+Zw[Sb8h#Et0>Lr!yX_@ar>w#7nn ;K1D|#K˱`CWJ>pq{sBQL ޔl9?]rΟrWFxV2gVi Юŏ  @)x1?#Wnc&1Za=AC%_ykqF=ɂ[rkoo+WYC+ya0ron. +?_4Z߉ol EtmeI*NTf堃]fJEyW fM:6P.^QauheR5 55&|n?Vh=]Ų Z(@p^?qƹ *N>a}rMјFAp2b|U4ҶmTy)ՂxORau\lNn%KKh+A{טC֮/Wm[:T\+h_ F ءu'k Ή ]nThSo$G8l?WBdhnOqϤu}U.ԾGV.$kFozy9K ʹ1 [%y:Gg8\q~u W(X/~_a<(tX0jY˲ ϵ l@|$\Gcq AB/OD:$F'{2dq忤,uOn%XkXG<)qx]l&NBG%x1}X\{!Ī_ 1:6(#k=wEw'B֙Jq*jV8ZN6N$xs5ֶp;? M O$\bˎ9Krz [.ZW*bZ{<-f3Ċ 0TW`|$#7m~⎝.4u2}e\{tdbr\zs>om~dS))m+W<:Cp 9C]K^H|rK>"'ي e jzqp ߄2uC> 5Va(tRr}ҙ] pŻqশQ?mm54b'PĆ CA2Sрƍ|'<bfXl79Q{m~íR+ 6a:N> V $'<&G"EU7uLi밚،AcS1R扔6ooh;i| VEՂR nk's=Frߕ0Xg4ёD?ʃiW$&qk }:'uF]<)qsJGTx/npx6rh0bJu^š' Ciq_@v9z OlaxZ%d 걱d (P]A_Os0/~(~8 P 9ջ8}^"P$6.\Cel`%J14!s*g 'ĨqŽDNc.!so΍?jgܞK喱<;M py>XewRn:Gz>(Fo$^\ ~6U8t=D{5=@߇O (պN2om75O1=( '$ %_э0_nqhC1y+0خ۩%k*(T2!ހ5] $~ 4d`j a;+ ȟԗPS' #)JnPȜ5e0Z6aD|o$^.$NֽX70/mA6kVBv\Wr.W'Ȭ|L#+8UkoZ.J@ixGF/IO`]x%g01ԆauAlYBgz :P{+O HA{&8 q 6?K x眧{W땋,My' LHI>2>g 2܇)%X?އ멮UAzF h)7jj3un >?;Ļ,?U%0zQ%~DCn‹.Uq~Ve񞗆|Ɵ*WOӅFk =bk^o蓯`=%eqr1@ BFyU&̵'E9w}C0+xaz#cZ (~z,>U+$ZX!{S!bU4AGz nx.AFK0F,}Į{ri2Hru [qZ geX +6k ΥZ@wTpk/Ex߇2pkNFW ?k?,X ?ʿ]""υ1*si OΜSonZ!틓_x=N,dlXyibڙ/  jK1q-u*>땯IXZk%?.hCK vO *k?C]>'o#|zظuk< iD;*1Gں[@ n[eۥ`}5B$eG -7l?4O͜IN ,g:X]xqjuBuN)no^]ɆIxB  o5!{奘>l`BNb|;xi4ʚ`W m |_׀m@]Q*~KHX1YIx! ƍssFcؽz ,d!_3K JTK}⇣iEQCk)ބ5%oCeeNҺԍAbbGoE?'@'qhgY&!̂"ub W'YZW +X4묬Kh\}6$"gDw۳:wRLsu1<$`?a߾I:n8=}z=E.9 ^y3 7 ]aRБq cwJ kX 6Dl#6,uxhQ+Ut-X@C]&\9ƱsAp?-c 1j0BQ-/X#Q8"ɝZGoRؿڊ?|5 fDVwc^p; &&~f`\t1ۮ{+_Eu4RˌE;iH$y0 FM '؄'N"q$φrz9359y(I]و`mIm)OQ^i f $kJvu|6W𹟉]/z'DŸ6pAHX"o$6OCkDQ_D \a5S.X={'lUVsT_zWr`NW.O:;ao;Nkّ ?=~ US.[^SNǓ:#wduU1n Z7F{>SR2Y4䬾(Ic@䭠[+fDKbSrz(y6jx;'[=k9j$Y/-x>@^K:Ls-6-c׊Me,5sǫ&%/w=Vu {D-.qz[q`̽3̆b$H]O8L@,Z9knb]{AIDZؔEekn,v\\U5:a rGPCAVh /{ Fe0_ֵIM 'V2<[^!eAqTD+vГņ\~_kk6^$]B(7s46-waZ%ɤ֭PAqsI@JvJ ShxѾ]+wK2!V8xNl% fxgH(~8Q 9j|Y *sbho8+nlɐPUi"8mC 5 лEZxIƦfu%z#{t]gdp5^tIސӦMq}뒋Di.=W_pݐ9ng'ɢ  CY1hg`afCΪ(t~;qsŢոylRasAL7$b*Jj8+L 'aVp'9˸ >MV8QJQXfu>n~xD1e< &1Es͂,̇5EO-b`]G%:OAdي@b.O`Z9م@)wG\B_aO>;'J 8 kЄy'97f[,k)Efp??ϑ'+O ']o`Mb U)>Pd .c X\~dC ݾ#?pWV ƾn.yN2RNbIa 5ϐ]\</M7F2j2HNXP1녎[^qp1+^vABUعIxK,4d4@lsf}n` ϒ๐8uZ>[s$U[b Y؋~%PUa bt/ߙS6RIaJP"x!QE.'~,޵f <,~"=TйG|+`X9ӌ3E| qj a@@_Z~WxTf+<lj`0ZH. N3t"yE]z#@`+4P}`z&g F7)R,pXKƉ32Z(SSVF֍ N~&{CL%"׵8ݳa/r"M Ӥx(c][ g[i~6B7dK|İd`c+nޯH (H%~ t\?W}RK6fZ'&6 /xqe%u|Sp kn^FM;ܺʁ+.2/H:2{NHt6OQ$OJp_n`W9pJSr A*%M_5֨ ,. \Gk5ºpǂpW B9:}@<0(=Nslܞg58v^׍w# %Is1vקYb' 0foϿΐO7ئIaudU.9j{(H0 O[$&=~j%y{WZFŽ*s2) c9ެ/ӷ"wd@YXG cѼ>}8nQtC7A! pR^īGˁ҉S(?q$]"۾@%BeiVUzlUO$Ry ޽b>z4Enc>|:wo3]/ד&^Ya8A9HyJ]0ֿ'"Ȓ'Y\'Y9,qb$E\|RϬ杁' Q/x7@2ϕ ؿ _'y {i?5N\]Ç+A;o9!A󼲻W%\l |*8ɺLtSxI ۋӒg\|cT 1"J2Y,׫c[9ƂpLT Rq0ᶑߋ8_Z؛qߐlV$(zF_\hᖑe:pD?-{L T4>a밠v5wp%hZGyrX d$"Wfrffsɝ#3T!\.˲Dl ?v K*dp L S࿨u!~n*ݩZ6(M}T JSl wk?(Wn'F^RK̥oT(K4= (0m&ھQ@ 2VzZKuwO˔Ş֬P%g62]2ẗ́i(18eAZ'P`$\e ` Cl.Hk*=ch]/KFީ+h[l/-ZyJc}vH0طUeʑ tX

~?vX׶zOP+?rdJ{ T6ڽ\: *F=!(guxGmLMZB2ol& t,T.вqmu[&-]4E&KiEt*IROY*%#-'$]9>TfȁQfJēSj.X$Ky@*mq ޭm AP7f]W9@K?-:-$nfU6[ u!@D$#a .3uފӿ&U>(U|GVS^QA'/bYz:J7cT>B`q8!Uy;<}ֿQ"bտ}J[ֽQ&]@9ís3z)3nTFs[,xw-{H}g/}“Α`k6$%#ħV4\y^\H(-uזZAfXoV % PZ,7 {.t5<++[V`ӕ7{ _BNqʺ(>mU 6,Tr?i)ePRJuc%'Yw;h;VygVC<MTQ ѮĚ0UlU|[C)tfH{JK%WCnqTZ*u\LJ^ps$DU!$ȭPb B!s} >s} >s} >s} >s} >s} >s} >s} >s} >s} >s} >BZQ^PoVSǫSwuzP=YjzJ=Uw?Gͯ%B}uzzZ^ ('UTI!g%Rv`/g>)᠄~gWۨ$~_ J9~+,jU W@.S[S/%H5VTVoQQpjX-Q{Ԇ7LIp_۞T-o ]q:b>nޛMRI8C( 5n;5[ȳy:` .+ 0MI&lA/В`u8-?6qF>&aBEܢ>Vpњvop_z*gv _=PA{_A/6T*bu[&# 'Jvzp+A9p@Im.p7x=+JvVzD3q@ ,U Q6{[o%>8=$s%>K)DtZK }Zo:\? }@ oWIx?z&zj+jNԇ@У6lTӄwL?/ }=oBTԲCWϩ~!*^psGGB%D^+'=}ΖW_PBT+>G۩ Q9^],?gz/%(̮GT8s@ޮ Q9. G24D%|? UUBDKR"M9s@D[ݭ6( 7BD^.U9q@'a!zFm,Y9p@VR"jZ2b;0"ꤿ@D:^!nQ(gK2D>.l"ʲg@1!*qs@6QO 8ȐڴQwg@FІ-3BDy5>  %$DwS%m{KHaMW׈z@0MBD}X>q=ɉȿyeN!X!^t}-죆zϋ@jQ/6v6 auQ/z/}5녈9QQZ0& "*NO5  BDE|_H}PI w:@QK3p? ׉@@(DT~' aQZqQ:_;jT²A!*5W,*(!*vr(ԓBDU&_>Pz"jF q& U]@8Q{XE HdG_>PZ Q N*}~,DDT@) QhX!&JBDT;T@)!DDDM@˅I~*}t"m-(Je5U>_O>P*"֝+)JR!"j=T@i,Q%\*佾*}4^%DD㷋Jr(O }LW@%BD4~ $RXQ"AY@%녈(]: $RkP-'-rJN!"Jf*}VWBDT@"DD_w>Px_"yC]@ޯuP9w*} Q{]-.r mC!"j[T@#DDgyq( Q=)/r l!"j*}Ю"}",/r ky5(DDÀq(M&: zuc*}v"zHa@kuP9uT@a,DDuÀq(w QgDa@QBDYg: u։*}>%DD>_>PX' QgQa@BDY;: :]:*}N"*/ H!"jT@a$DDwJr(݄/ k !"jT@a,DDJr(eb!"JJr(BD5KԎMCuYݤWרߪ_%' uzXRp(G(}gzk)1N.PQzDAPvp5@ŸڝBDCo}fuE͋Tm] t@]'DD[W]Gޡ~i 쒃 s% Bqg:B5 syfqZ( Bw}kro8Q`cg=Tܲ KaE@BD%uMwwϠ@M",MjvXl揄=}"tYݖ ]pLУ !"Cŭ"5Y4~;LZgLH_,>'?%۹Ppi`K9ag#p>Px6P w QNJg4*7o@)H{@ҭCޢf9 U9r(׫D!" .?N0a埭%!ȉ@)ٌ;wտ |*fZO~742 %>PK8[jQٻCZ6p`zEބ( JY_.Pʘ8󿳚8.S+"ppDP ]QVg//ϩX!uH_ks /TQw ~4~!;{c=BZ^N,uzV1nW.wkI_" i|+a@ ǐ!̬SV?S[7$ﹼ^0N"ʦJgM#k\ߐ٩Q#[;%-+2~1$*VS g;#w2>Жuo;vjW%9o"UDT򟥟HG;]r׶d /r6(~௕֯M48kD*[GLgnl6aw">՟zݦ毉qЈhY]Yy,}C`~DuG{davVs8GguֽvGKt}`Ī&Y*d~; ՞jЈ(BћvN}T܋,V)gJAB=74"f_=%^GPQvc_QJi|- m"")jW)I(}wo5g z nNtEsqUSރ Ww+RpD쒀JtqUK)y\۸z"P0ie׷$\J|OuS-TTKqFnپԹEicp%gV(VWJxu?sP)_Ža=7s%̃@3àhBw1PbBZ[_zEvj?#-an$߿h}ݮw>˜MQ?Tqz{/=@loxJpF;KW`lrC%LNP/ooz!ADw1p%z5CȳۤqNԯt4ةU]@zCDZ 8Q-[2@I_ B6s"_,P'Ʋa;41vDDf(Ϩ> ή3Puڿ:jB811;.*-|8ADԪs{5@dzݻ].MnQ5'ۯ_%Fog,x|d?.8> jg^;Pƿ>ޛX|x?ƃ{d "nzR5`pdZ"Tƿ'rXei9Jc>"NnhG"e3%G\棉eD\:ⲈmpW> &pP&8C#-giI`2yDDtW(uBEvmڿ2de%?72X9,*> &YB (3o/zYGbezLKD6;jgyW(oKCo[gbW\"$>z;$Tƿ72|- {7\^Q5Q„>z]P[vM$%wJ,9->)>z]{2Z[k3x󖃵=X9-8 Q' UR&NɉnrxЃ^98Ǽ:x7wxiXZ9-& g}BUHi|/|zB=7}9q!g/<:""t$>z B؉^Uzw~(uKW}8[YM}GH{ 58fXwq~uDDDopfjP $tJ_ٹMPzѪtSo4O"^9x;Ԏ-#""jS(]SՖF;XǴzuDDD*6(5d55Kz4>ti4"n>|R ת)9._Y'15ĜADUwA'"Mv#練J8@G3ի꜖OD#\u}F(-B]RJ{n+yEe/;4YKDGr.{Lm.ei6T[5Yj(⿝PZ gI;Q=vﵝ3Zΰ:C-d9-ȻG[@>/Df>#f7;|WsZ؉z-;{ju^(%'(Nת{o[E*q8 QRr9^z>`)euz ^;H8vCuC^O!{@N|/پ_p @"2wo3ѽBoK]t}:EMyDD^=" >rbk#ʮDV߫˪%k ,p/g6jP: '0Aݡ~%a;O~5mdDDJ{ۡt@Nn"""*JvC t@"""*Rq9NH}[J}D"""*RmqKhQ!J}DK!""uoClQzV!J}DQ >":X=,>":U[#J}DtQoG!"""gߎ(ɺBDDDEFߖ(ɁBDDMUSPQp j㸼F%J}Dy!""աj{}M}@%axRc ߖ(m8y6[ޮ֐UI8c`(goDH"""nUS+IgcFaqi~+lqU-QJ HDTlg&;JD|6.dg "bL1sG'%JpF/6Q#J}D0U4ԋ]%L )uH~:W͍GZ>FdsvDiٯDCDDg_z'َ]zJ:~:BmbJ,onS/L,[#,+v6k؁=բwDi-DDnv|wKl)* AOW,y3=GvGW9- ]XXmr{Q;*a&VUF|y/pOVc_2y],g,v6]8{;@l6i""j5|k 6憹6c]v#r^D;gi&ގ(515ג* 3=|Gi?j`&uIiD.0Mj_mbf -JvGH[1Xጜ Qz c/""ZMg'ו+K$ٯ[=&g_A=H}=jnc]@"" kv]*u.k8Z_57%ryp:^m)I8=+uT EX͛PIv>2f&"z6q5|sR:_@_ԭ i9JIݶi1lX-1^v$<>2f׸vrg"4_%ozKeb47Ş~etgs6p,I<3|}I:{-Af&"joi\/9A˟gلKeY}ϝxS2zܴ]֓_d}D0KٻqX_'aV!EZݍe0# OpePR;2yDF_Hvd}DU q} n"2Oo%aXc4Gft=(""*Rh]~uD=R}&Ҳ|bYR Ng0kypH6hBDTz~=[ovY$'۳=cLp]3\F(1<8H8@"1_$w\ .P52Ku'EXN'ل|N˽SהƳ$1',?=z-{82.K,cm5;r:R?ݯ濳$NQmZ /aRKx p\Cv%'Qu {Y_k_9qbbNGy4 `ji@ QZ}A+#vGtHWN_v[ crJ,H˙P'$y}}D`qBDTl59O=T^ xub?Nԏky4~_ߟrJ6>"y@ʛ;vvQ1X_vgONeaV鑗gg$oe<gB*!"*oH:)lɝnEone\a6A­ku_e~'<~226S@Ϫ)YBDTlf+$\@wԿDXHeۻ~LD^ 191qiQGH!>"9F~}KHknbEXF;YYcArHbyv"/ۦI&M너lKu+Io:uyRqPe$04 $bA,K4^"6]s.LEDR{p @_z)qvs |82 ic=VI,Јˋu6N@D1&s""$_w8vצǸfĿ)l[GM"{/':eb|w,R/K,ǮaYͺNouqɹ*̕wOK8⽭~BDT&:n/&vc\i[.Ζpv/R?e<2-N"zf@4lA7j~#yM]>=ߟ]Q=iY6\rrnv_v:6-&;yPܖy_eb?Mv"b3$L涥˒ެ.Ki%'cP^.aegإ%FٯoQ?Wp:2;H`x,ch&u&Bersl#|\ҟֿ_LߠWǪϫoJK$nKT~ %gǭrK2|nzU(MvIEt[eޮ6kfVW[_AOIEmH~cjvp&yW W =;m2vZJvg8k2؄i_Yo^^/˜+`RJZvnU,Oi~Bm^/-MA@ln"*_6a]󼋌xQyGk롍/afR|hQW{ 9-) g~rz8in2&kًg/^%7BDenVxl5&S+aGm_rS߯[ϐ+1RyQq sXN{%-vI} C9~?ɘ=h/g,IZ0KK"lyoAuS} U'Un*5yBٯɳ5}5sP.'%12e,k`h3q vU}iICc&#b d7B2vZlkviuC2٤;޽X[&ߟ63 fC%nyo13Nn6&+C6eR?+;JAnw(A,;a4teg5q\=ECu +T_ZyQѲ_\w~Crp[i>ohJԩ%\@-`ߊRB=]3kw9N-^$/Ӆ_vԿ~(fexb2 {# @n2;uGR -wi?fsf\G/6{NeOg\kf,^MN%-7K1>-@2S5(ϞT_S{I; >"G4 gyz?0Dn/ӻ}CDmN `Vxo`(p?Jf Ծ~>ui̘ydu>zvFX v)@눈2n8/5k/-iT?Nl~﫵}Q$vkIÇ4m@]e;6b4WOk {\oh1mNc0ɡ!"ʶx/5m^C/-i+a_NOPˋ{>Xv~Ukמng+/;` g<0^XǽUȨ}=;"l}4{KK|zot(&mQok/&uKNg%ϢӕHSk'z &9 ˵Jkqpً0,L%" /65]H٩ɛ{5EϠ7nk]synﳵ:]dE&CKis gTuw8DD?8ο>/-I|yox(J][mJO;ZScf?ho^fC¯wH2;$MXQvM۟i/f/`G ikܫ)^7wvfS۪g)/OOk?nrN(}Y]:o<"?_sQ}iI{ @Z(TW$bדxlg&a_{ۙ[3ڬWHxO!:i| T罯pkZ09`Pے%ﵼ/Zlqʚ@x~~e~S6~A3RQ6q뿤$=7NBU~IV]^:B\;IҝMPn0]_W˥ͅ`Ծ6sQ>M|pi|_jU_ZR[lfܮL{V&؎uR_:/^RVb+;`T/&}έADT<~_j悁f!wT¯yTnNfu{Vm+<~/fۯJ;I^]M3&vQ}P|;">o.s/-Y{o P(dgwk{3+;JN=^bYoSOf,lBOH~[M>2byl^#]<"Zm79+HCS>)a>Kns+LqQ֓c!"sioT}iI5CBY6y/D]T_:Vc;m(m9 #a4 +~ };-?O;1w8DD7wѠ;9`<˄(%uy_P?%_k֐09ٌ`;W7J`qƒ:S¯EޣOInC Rx'Ksw8DD54DoO%5_5J/Dq_tbMhgܬ.Ö^ǣ$܉.;~Z==Le˚?$Ce%/E=#aGt'm;my<.3lg~*wn؊ y"^ԏ}̅m-lK"jҼEC;s@,دy4ٞ+ouw-;` E#%D 4<:Bk/I;&f=qFQmI$&P~xJ*Xivz93 ~ &Rf>_0/$\n*ܵvhp" g؎[%\Ra +B5>"agN)u͠kJ?^Ǚg?H8(ꬁ~C%pR\ϊ ;Zlr}%ֵ+O%Da|DTMfI%56ٱr7fl;öSl3j lD;K6I]}LyGCc*كR\7$a.O쌜]=qM#4xIn_NNqYK뷣v-]z:56"?; TiwHޮ֧yNhwvNK/:Ƕ3ik@™.%pDTG=4T_ZR^i=xTer E?/vڂafe8$vnwt[Xon/M,霗gWJs/gcAåD~hޞˌQ}iI:{@^vtik/e6g24̡*|%jׁIvs|9HwIx}bqyggrl*sq6dtDTl{.S9Tm>.%vXm۫]fpPo-H#R\WA O, L,_9.#apF{zqoޜx܁h^N4sT_ZR>މ)RYmB^JASR(aW.q園XƾѪl첵 R:vsM$Ԣafؐ3T5'hĒ޺٥vgP_-cz"#,U& 9o#_X1x:ceu`HQb,m4ޕODFnLhb7;{%RMsMndyڤ{lS$Lֹ``POA -fʤ#,vWJ,giVrrZn/g9,4XrX.EnV:}T_Zd_{G~lW$﹵>Kݪ+ BfYLn+=|r"2<v=A21MIJi{r9;oVGT Ų~z悁U_Zd]CuΕpo^nHݯ.p mm"_VQQר,_ "OM˼~P-HvQ-q}rF?^ܒ?Ӳ1ɿLu˺ZdYf"9f-<wow$~_o]i }B^fYBn1zvZwQo1e Tcv v{iF}4p:J,{眖[nU[J%9tvnM|%D;OT_Zb_{G qmBOI(a"B|j'2%l3Fۯ>_mg. bZ08%M"v{XF{uqԺ\KniEkfv& }]> :`~yQ**P/Y엣GT ؙU[V4D(XWjaN'>srbGg#=Ovֻ?Wp۷Tӻs\~QK&W4^'aWdmFCDͶl[{&vS}iIu*eIJC!~XEwHk WjwĞEC0c9ϼϾӒz::]Ɤ`tWKOK8o8BDYg6Lhf;{ٰhuقan釞cwpPu4f޳KrQguvzs9uDSdiE g|U?cZ3Ғ1;mDulFn7GMQ.ow;*DoHwRT¤NU笽lOJ8`ޫJ8HE}F]82̧l,``m՗pt6BeEgs)6C\.PMg5k7}Ooigף_9WuQOd/p@w>.꛽`ptiGn[0Y -%v{ 74-PNv `0@nMsPDDE}l8-s MhxTo>CuحؒK T4~G)a2^N14N?q\DDNtmܶaf-r_b^2s@G5WQ %Ɯ-π~Ȭ#,[%/_"ةv+ )~C#"*n_Xu:NK<ȭl]Rm:vm36rJ UAa=KC= nkӸl\vKEDTl~ilUݗzyv.]\]$}=#C;R d,L;wM uwԮ-b6Rw0"d߼s*|7ߐοdqvm]_2~,.%KFfմScװY FMH&dZF6˼fedhȲl]VaVT O^u3z"vUIv{_ߪVc٫K,[ݞ۲#/|#% /^2/@m}*2mCf̶|ma_ޖ0l%04ieWye Y5\Mnpx߹+/K8; WPm|k1mnvv"vpH`Wvr[`n8[`MEZ'x6Ο &`a:@*v6>rٜCN~ȥ>{&6Uwtzf}WEݮ<6uV t]jzWY5vZN@͞>i6;tg ؙKU{ ot=;wޙ9=3S!3=ݧsNg<ÙH P( e? f+On=@/. u1c90$iT|S:Ln"f'P( e87f]n|갂n ^\ {b{(wil$(le 2q{*9?ݝ'+P>Fۍ 5"L#'>Vu9( etܴܿ͞@{@w gV7Z/<<c]'OD$>H0!!BBq3ynXn!Sj2oZhnlFyw=eV@P()`q9sqŅn+<*uA[gSg5-9sV>B{s*뭋 ?);coAyg ?H\J=~L ]}`h܏ml'9@P(27Ya֚V¸Mmn}#$Fݦ`Dl؞P(vinj󆥵T vM6굱7d2$2<֮' 2V꿇dW}tR P4?NxC Vka P(Q.٣ k~1]Yop gx1y`gHAc35@bB8y^Nq|Ow?\ߦ<G_(kkR(akՍhpy0J| %H8 P(A+O$.A$'5BoSW7/!L>0d B饸pO#!<|W3f%RoS:Iz 0\^O%`BqALy Z=T v Ox{ 0I|'d[Bğ'СZ#z,5oY^!>؅7,˞FM:x8(-;u[Zk^>=@;B6[k8Q~nz[Rdž'Ou#LWn`-.SI#O?IOgvI1SK8ȞF@ c̏ ~j}Sm~b^? v࿝%}$%{`[klzN]o$ra#dg0]mӕz27G!ֵv Cpʒd \ `N}5 ӻM7 |Yo]Tzz>ICA3 ?&@8 Ӏ{Su35O, U?,6ɗ:ר+wzeyZ;˔.:;'ɫeS߳fn?\9]9PGs3u}IלP_mv9AD۬0 T=b@H'8OvDzd5pn[Ǥ e1dwݏ`,\zV]Z=xpnNG`;-F>};~L$zm PV!HMguWE͌r]}S:_R{wڵ{txI'$B'Kv AɂQ;+M׫ڟu@Q 6; |@;w^RI?$ ItN;T:˷mz =z!:u't腰6KU/5Bu#nO v@_h`$@ oZsFL$0r{ڇe[GB jg>.jߪv/ ڕ'/Ƚ{f=Dg{>P7#CX>ChgD]e>ŽFE)u~}$bCI8@mEX=(?#xt|Am:/:/Lo>Q ?= !'N{s r }Kz6oqO߅zPt:΂$bCMt'Hb-h䤀wE`0l(Ȃ0ݴ^xx 5 j# ,w Nx I(is!Qɯ;w6)ZST}yJ GN oT{7';' N$g,eY?ȋ8tя ұw6H|cn=c}wQGIɛLsgdw} [S$HxS$tג[o{p~{$ J^0l~<ΡY@=z KDJy0{FY=H`A{AÅǺ{k;zR?޳},L,x A@1x` #u.t3uPtI?R1viN:w=U>$;p/M SFBi0sor?#|5y5:Ml|{x,\ݓUΧANupyޗQr􎠽g~BK~ $KPZMu'3z ?5#LdXIzՕ=dtj:5A&bM؈'//к.f/_~|;gP_-uE]I%U7awB }}.Is?N6oq>cde6 ojy)~e]wgp>$H P@g<'1c':ݦ ܣ9 X׹uN?@` %.ڲ;zB4NFg鿏poy/~FI޺8ӽ޺Dsriu>3nIb5w3W]nQʾ#m=-$ֲNfՓu5.3nQX O^Hdroc_ƥ=G#XqWwoh.0O{n! $H @`g:ϙzZU>8=>`+"`߇sנKdH+lnvJ3m]cd׿4wZv i>p&@@ '0 O3븧^zr'xNl0@t^<*_@~ L##@ INn J3<ɐ֥=hNxx<Xu~xF:fX$H P@GT ~=,7i+=,<`9`gZNJ.T ȰE"@ w*CMX~wH?!Z쭡鼲vjy&-":"#@d&b=@H %pUZpA(jnJľ.)zN Nn#qCq}}MV=R[ǗA  I> &NZZZZkeQW[{݇e"eE_ 0 B@ S-{}^L^>ڰeb_d@YoQe~5}-( $N`/$lw ˞eNL[ZvN߷K r(8 :_\67/ 2^QF`1(N&6K_;Mޗj_C]ghQySޢ6bq[݉V rDv"pb o85}'Iσ %Kۏ5dbB2WkTF]inBvq Q`;p e_e?eozggjC IӖ:QVOga'bFU 80ZڻZU?g;v`P;sڣ?(#|5WTH8NO>ctU;zEZe곿z/@$O5ww)$b &E  nhb.y~;7st xOmPྚ ˔OU$J$$nz^ߩ?+LRlrot}}@ǥ9eNngN$رuuǵSPS; yɓ^zKqo^} ׾DQMn7ћ@H ,ЩOd ulbyf洃; HL?RϿ{xUR+/>2 ̷FC v{E;>;{F:Gjh%5nSjiAK];W?]@O5D@ _f1WMsOu9/izD]>%ԁesh8$goVO?w_$A{{wOR v^ h lZ:^N;ۏrxC-v-!Zs%r-Zϭ~b~{"ȼ$5: `uؑjB]wh9n9񺃖'Spݒ;͛ӻ݃B#C/{WO9Ov%g:=e0,ςzw+@t =K͖_ rau^_V{̆{;nGTn}\|b'3N s<  _ `< @ m^?$H 7G9E@ 'b+ IO>1W$$F9x^`H} `2EPV$H7{v8 09 _+L2Ha^#{ Y E(^ E(^ E(^ E(^ E(^ E(^ E(^ E(^ E(^ E(^ E(^ E(^ E( gIENDB`teeworlds-0.6.2+dfsg/data/mapres/bg_cloud2.png0000644000175000017500000004456212140200333020213 0ustar felixfelixPNG  IHDRI9IDATx]d'뻦WmB{%,xUk0, ZYa {1XaE.ņ0kelb^h5eګG#i[!tJ]]կϓ:2x#g*ddV㥗) hX Zw.|`n\0X}7\ЫC,D В\% %}7J@n\0ݠnY:^kETt{V|݌h,KL5IÂ& `sʧ'f:M:g`ggzn4I>4y0`zj&Og[ˇ!f&*~B+AkyhʠKM,N Fkۢ9t>~FlѐL:i`| !н&1kIt)p4g d6h,m$`#͆ڵՒ e6$m$Rfsnſ$vXLzN:NB`[ Ťnt5 \Ĥ$ Me6'6&^O(iH)BZN曎5+rrESqUl-  ͧ}v!$r-@b!6+@pr4B INlF glJ.g_Ԥ~U`?Y@&g_QIiw0B9N:l: ?0Ų  # `r`.BKI3xOl !A=i ڋ]?$ `ri>VIÓ3P/`#gl"f %! C+L%SiG4ݴU|UKM`{9Ee{X XOR3`Tօ:9E igvWlA>. 7zE0N@*+մ~IPN T^z" r Ҽ9t6ă&i1Ww"؂ Q@q>ael$ f aI@\cO{&I@%1,, 1Vc] G)1)`rO[~mu{hÖ3XJG4qźm. \WZzMד^`)i9LӴٔ4pQpׁ}`? RDsq5mo&F_&u4a(%njAi2Ɵ$&||m?|4i DRE/2N )9b .I>)kZԚU9M\Z|m&IE94o:4o2!ˋ uЄ&i7M%(}Ŀ?ARV4+i7'+u}`M*g $i(g4?AR?6K6b@5hlP'gli r4U94C3HJ0l:94?GHP'gTԕqCP'gSO4,5n\$g\h.3XJ047@o2. `4@2,nmD ꎃ75K#Stoe_-eHNfE]Ofzo.FdB<-qrj{NVj3v99@6|6k._4#s?mm^yr -s?mݛx ?72Kk;NB/ OhÍ]|י66X+sqQ'f8pM==.sp1k}(pyP4˳^]PP)sPqe_5K _9S5_4K;/d$;pHδ i3I'IUcLzSy2p0Xzެ[2!88]Ng9&i4:p&|Y:/,\j$'qq"@2 Ά0IohGs&)sIp rɴLҎM!>30Hq}=3((Ά,@b]` ͧ#C3(jwaB8d9d;!@K3!?!~Q׻Bw97 /7[;"@&I+FZ~ʹz6}sOC0K6scOaY974_+I!禞;#Y 熞b)]<0'!W΍|q, `rnEt7(Bx `rnY0N97.G%!G΍;$ `8MM1;]'i[wgk(e,Z};84:ilpipH"g4(ezcvU@'6<41t}iZT|~.`/~^h0N'TmhS]SsU @Wپͫz~Ջa{4ꦀ|*S4iU_\UPzE-hdE.(7t2^u=^צ"{4ndu`h !*xjOόڡ[%0 Md3K5I8h4mwn'C'?{|x#`<.:}$u!yQ A\ pxi3ЃZWuDŽKfjowM4Upb>4ȓ?KY]+f\X6Q~a!#3޺M!E_561 SKumɟA!gPoqnY5C~ f4p<(MSO'>`q0iuԼMaŔM䗡jo5iiQUԽoB/3R?sfFn:lǯsUҺwlVm;>6̙mUB/3֏߹9`Tbc.j^n4Fdשzoa20~,4gsfST=e:|SOҦ5=k~\67zݦ,N1K47},_;'KɎm'55cy}ɬ׫ 5TxMm[ `9 w=읪|Q3_z . + ЭY,Ϩ}cXٹKx<n$)`x2,>6`b~ei=!l5f͵HOk^SBY˯ݥIs~k);6 R]þӱduѓ5 ӆ_h4U{ϧ.v{vW>1S$ n?)'zI}1Ь akؗ'=Vv r,4.3. )Mo1IM4ukjl^yYï.{iц&)#صQF;6<{.YSmӊf_jeӳGlnЬk XwBc5 e_g@{wO>}ɝJMuOn4sO[ `_!jځ䤧kiBWaXϲ,ZfrQH@!4 T5kL*^㥴;[>a=u|qu+jbz ls$`S3!@ :'\cáψf"|ӵnoC}_  _߳zY7k΋h[@S7:UK м/UrjרI4u A,!@/LT|Y| fU}t-kH]MXo6E0|CۇO[cB%׬43qk1 qkF&u7io4ZZ1$4`#Cu3lu1Ej6W*^ f !4(Җi@_W֐fD棏ӳBjͮٓU6':WSQ] fFfW0t}/kUi m3 NFPVU=vYu;8j_അQ'Qc[_^里s'!?Z: ]f~uݶBjZYx\U9 RDu8^]=ytM^!Ȧԯ$$ύP+3R??j39`k>g`4TMIm+`#@gWnJ{uIZ;Z§Y;P+3FoͶC怍l Ġjup\5nkPe4s椣.?4>?6U6ѱaІIڬo4mv'3x%spu_' Рlǯ?8>Ɠm]O*^W0lU!]q6.ߧY!Jlӛ}{?^}t}uK-^URK4Y4tdhC4Gޮl~ X g*KQ7IG[`fia搬{= RwR@W&}3ޘnW@$O{i xM/Sδ0|U͚i_E 㤷+If)8޾ Qf;{?2:}l=T}]m>ּ&0lTo)I_60MwYk͘1,(+N Sni7q`G-500'}XNzШ=jsYS&I.Y թUe xb@ںY _wZMRC>`OtmC4KXLRp6K|{}fl-6uOϺ> IUOô流qkvOLō6Ϥkƺ\,3}l{d;i^流q&O:_E?okIݩ6 ^-[?zw~u>CO'0I  Xȫ*bМ%M{cxw.xM$! рuu6wS6NR򃮟T}>ЌLfG5OCbB ~zκ E_c.n'Up1Kq,_^p}nSmBh}d[A@ 6}6MlNuj3uu z}æl'3x%`v;ekL\ST,Օ!3`{4:-1- gK?zUX7cS@6>|*X INmŀ)ki_gx>4Ss>#3DU'^Q;6Y."ڶΣ}786B1PѾ=CɹG<ϙ MuqcS^Y]l)_Y|Oa X랢a6)?*I6yк56uLS{:Zd_Š8o3Pkp}]Vui3^_|ܧfMa6`7۞ F D9-7[t_6Em}鴢^_-ζj]MڼpȦf{k~69ݵ"F~ú9l ayO[ m@7^@UbrxS_Wkb eVO^!Iqo-![[nMRuZb0>-oWUzepnI&G5;p ,+qT&',ϖ!@yT)mNVêYulw23$3`%hTl{lr_ZЯB8%Qo6NLk;!126-Є܇o [A/>þ=|5K_r_UˁE]t]0M7~UL/io}V, l='ʙ\K;:w]@v boCYoc'Ϟ,]ŀ-+GHd!,0,;/N ;w#k_/`9濮P f O`m┚IDVZ0i1rp]ql4M'bϙ?7GO?=koM#xY0,-P@;ul20N߻>_ aMq{q`f㲀F{? bsO^OKԿ|v2c2K`3:6mX26I71yqY4 RP}7fjޜ~ɧI?}՝w}\{a[ N f mb@>|S/ɧ/-+Y݊?6?ۗN ݊϶ , ޻y Ϭ V~>?rbؐ up4tl(fi ɴY{9(;Q[UXR[:5bF$ O~}\n@ѤlT ^`ӹǏ>|z΃'g?`y[?l,r)]nb+I@ۢbZ5ߌ >;լ9_}/-g;7|pO@(>?O=K%?mflU3+KE}\ӛ}w''{{)~Ϋ@4Q{/f^Y>\೏Ua(8+e=Y4e48{ZZ:_-g1ݘ`ʚ3)>Ϲ _6E[o5* :}劙X GI@hcIM^NVo\.ɝONƍ}i,,HÀY^&{}GgWtʟ"w?}jj9(g ,y[&:_,LeU opWo2ڍ5Mey s͑_Yl 4Q;=qbo{w{9dyI߇:*`5 .">; ۦ[@.h~?}|RܤNQnr#pRuc#3|{d`H@<= ~{ß^lx9@PKǯ(UU@9s&px"SZ<$?MZ/7WUEO H%a{LPc@1[ G86]я]oV1~q|\7ñU^8f ,O^2]$H3ߍ {aUyrXc#CRE8U6>u׊g͒]hBn}3Z!AN#=QQJVٱ,/EP.O;}s=}TWP)#*꿖$TehpSʙb7Z}voa7BRQ岨Uf8 6H<߼/{Kc{"I%}vnC;O)xkyYE͒*u abӿFd_RJ)Tէ?ЌK??fRJ)>4.wQzփ!*RJsrM RJ)Tq+RJ k_Ш+?~}STJ)*7Y`#GƨRJ)Fe6mRJ)g~vl7 `##樔RJ)ouӢϛMXfu+RJ5[>$%wRJ)>{wO;oe~R)Rj=zOk7 `+RJn'O=/URJ)nu蓘r6G RJ)gSO}r%?*RJn2{q4Ј1J)RU'ɢ Q[fRJ)5*7xи1 WwRJ)5Ċ^o@+2DRJ){?}E@k9 ٝ}UJ)Jwo>=g.3Fo}UJ)|.t"3rowo*xփ/*{T(hkw k5e{ݻO~y-5q WWK߇sU4/_ߛ߷N5U碾\D}.l4C_\,QJaU@2#aW>F'h2ݻ'dшMWϿhzo{?v֏޺U~RMpp6+ bL!RJuVXYKļ\>͌fd7惩NǔwM?YY?sUyi:=?wA,x1\Gu Rjzqlw\F~%[|h4rûhGSttxyl_ "XWr&Ae@:J)U[Ӣ;76 m|[[E3Om{ۢяM|4uͶu X<" X=4ԁִ'QM0xE4g3,X_T4hECvEрW5@˵<{܃@8:P@Z6 6<_07Y7EsјG>  .*Rjo_ϰJRf98۵Pxo>wx翹wGsY_a jÁM 9Rg/o?o|TU}6m|e4o_|p+-Wfբk*7%\srCcTU4|փϗ~yYSd{c 6Z9߷ f7˿(hj4<(..rC Ύ-?X]ROJ~ꗷ7/>WΚ&K; c\Ә/W٠lIP_\TUK =]YR"sA)5܊Ž;ƿˢ{v,,P5 )ɋc_)9ۥlontU.)Y9YmDaW*>^s#ql#`>鯕I<T龋8ı|ow_.~q{_/}5zթYJl-[ޏ1+ǽ7AjxluI`k,}Qxͳf8>o%`dPjOlԿmpZ/.7 +ӥ{gl_٢jYJʦ?6ߍ77m>Ṷ;c `hRULY5TUtl} 1> CŬg }LY ڮM̼)-ſW/]=1@=`y8b@}ϕYRTu-ݻg8q'{L4C8tF咂w3TU6~?gOfu;jp=1rSګ}2bYL{OO_41+n~u4`4c{+8nտ6]ҿ-ksw4kjuYA9pèht~}vyϛcm  S6|r@pvbA9<`y@r_4'o߫xJ]?m [<<$(gF`0]M<`yV _,7$۷eN=uH0` d1F{j9,F } Es20((*.ftG??_{kϛ!x[_w9Fl6뽬EsRŚN8Ŧӕ V(}/Qy5X׮֘@VMkޖօBYg{L+u24Yu=^s<_>^,W/!x{к1Ԏε2`k9荖IENDB`teeworlds-0.6.2+dfsg/data/mapres/bg_cloud3.png0000644000175000017500000002063412140200333020206 0ustar felixfelixPNG  IHDRŐg!cIDATx dU}1 oQD F0Er 4%\!\.7|%jUcF@A(8g~Nwcz]u~avs9g`@̌*#YPZ'~ ɥ 9Dz#4ROvmەT>|Zrrr=וkP>|L>bsDe^@ROnsGyR弹 z~elYʛSZFP 'Uʛ,PVWV+ LXX]-JILv(*PR5@Ě,T~4[-mmh= )*gXn<ɴ~\k4pÔRn hҲ]&P"&呖-eѝ,kh+bBQS.36me/Cw@졼RV1sXoɍr;0rEthkLh5I((l4ۦ\l4[v"'3t?ң&d`>L:}!/F#o١|o7KTFǢe q\i4PozdN>z +el@t[-_|yr@}t[-;7{MT[7ܲE~WƘmPJ5FMW^l)e&&ך*܂ we? -֖&TOMWhVNRDHP]~s&'8+D@PPv5(R.6enV4H+[vE[M,B`)|C& )o_(O4#*+Go|@B e-T~5m @-M/*W ʑF )H0 ޅS%XXƽ-> nQbmV(4R<#_Ū@nUa4йi7{usW t.h*|Q*M$X*gF,@7MR$*#8нʯMBrc ;ʞFRsm 7W RPl Wo0"?ƫ@QF߅Bxu(_z7 ЯB r2D:h⧬RW±+@ )|2 g d .v!Opb Ʈ!|WJBx5HFB reWR:eo PG!sf|GSm4$)ū@g@=4qƷ햝&@3j-PJ )dƷ`FB(ۍ@U0.1^}Jo⥜Upe\XjreU:4URǫ@05UR3\b4 X)+[Rr&@م*(PY )T(PU?3eRU` Ts&@Y(G,@}hUHlu3 ){M2 )NʗNN3eRMiP.!IDzs܌r(fFP&!EI93bP&!EIyOĂ QF,B Ո7 )Hڈ 2)F %PGSʾF B<;^j@j!HE B E@j!Hy{" F "7b<RHle(kO(S>n١Z)醆hRX mk˕/Xv,e4R )@]<^N%QO2 Sc^n L#F |4bqլw.?K-;rJHR8bP9Ŋ8!g4R )@;#n%W}/Z\V9Y9g @_H!XI|SʯcYeel?DzCNH!(3bacoi8lxeGM4 )>]Ŭ>c+7/9<Ϩ&e6ushR|c#?Rs~WyT<²3 f4R)>.+/yUmgܨ?tI4R|jcG|XW[v>"ݯ<{|DqH!(ߎX;[Hc b )#tH!Xv2穑n1őǂj B򆈅.cyabA5\f4R)>,lT,;\/zW ƃjH!X6ūm̄cju2B:4)@ʍc;?wJ1@ȵMF #bql'{RDxqAvXۊ&@|!Gy^ݶrP]3`qN9(F c:2>n%}o+@lw8iu4  +Ϫ3,[ܸnN9(ˌ@*!.[̯NO9(9ǖ%)jyPd٢xn&U-un1i4R )BMrŀZ]D㺶Ř=h-('Xv|qIJhOHQQ4.j时fc!mv[v\^@ lѤk~uۣV>vN!}luTH>⓿g1]xϫ4@ jRȅgdŭO"ƧB򚵃;'φJ f%; )'fO>B@ LP2!y&hcj`AC9J0w%x&ϯ;J0??+-eDF3!S':ind@Cw\Y;8b@ d%9\]eq&Uʣ'+<~{"4C!|&850-Oom6mL njPfFs, NY9޼ߨ{H~tĴməYj-i}OO~ (n4@ZW|||/-ϑ0>5cjO쾫$94,x|scdBrmt|neKvʳ&H#p9d3z>O5_woeO/v%jl K•@4-EL*kY/)7-UCol?bͩ0ʷ2i O:u%04a5mLi'e{elZeh#'!uI0H37F znXKm 8blIHlM5OAg8We0tAx{f+i?RJB!'m3XHmL7gW }O4 5uq$ߒ7N6}Aax͋71Kw?߂j@Ё+>itHv}IOUO3;B^??椞ßWD}7WV& !MjR7iߚ|ޔ^}FuLt!NԅnYl}mӷmc?Vַ5)o*77*ʷ6e~ޫ?l0<1Iz Y)qlrf2it)ФJY ^M#CS?m|1_8^/Syflgx6-} hLpk$y&wh"?AKP0`a`<td!~?uWcG3LX?ߡ1 =G14>1i?"އIMNLoM$퓤OyR g_?m1s^t߯=D?9Y4Uק.EҤ6 N'ʼn `P|}^O=4IZE{h|RM. yŏk{P{|OjK&xm1[w}Win]>mD@МS77Rfj}V]S3j2;dxѤN{{>g]z XOф~1?P2 @s~O7uQi֩o>'>MM4Q){_Y(k_/T`~&5.0G4|AY N0qh>E9IsO8g}.,ꟇN .?wrnN­M}&wj=ǿtҧ(}м?ǦXgx8ҠѿMT@ ¤'$on(`ˀs7kr _j9^M&>Ԧh?mqvnL=>y$n[Ybǎ__3ƕf'Y cݯ~C1M)'9|r/,Uibi|K~Jcvn7'~Op2?P94:`ph!s}肈'Lt()zO!*,ܦ*g7s2zs2w?dhN%׏ :W9g'90ztwwPuo7Ϳonu9SOU޷1M/2v:5 ~osWޭցniǧ|HªJ,mmzukEϽi^iDU_ ]5 ӏ붟 4ߟFC5TP`6Mrﯚ:P+cįڨ|&'n} E+Ymbv2k|Uޟz}5DmOd Þ_zw7gm*iZF?0%lh-q??㥞/ߤ_[ QX] |5빧j|7]'lH z=՚lVN5/unqMzGsϿ1P:%mۦ~o~Ʊl,g*P^x $0ށ*5q/??F@UXY: E]@mP{4L>ׯ X @У4@ej?} qIENDB`teeworlds-0.6.2+dfsg/data/mapres/desert_doodads.png0000644000175000017500000045262012140200333021334 0ustar felixfelixPNG  IHDR+UWIDATx \Wu[ x\./&yސ$@%[eyjI-ɒmɲԒn[h16!!L!$H)`ٌ[YU묳T}rp=^{>Y3 0 0·߾0(Swک6 0 0 S(jaaaTH/ һB¨m{aaaF=h'껼|}`aa{O"w9{wўaaa ~˧,ۣ 0 0 W9}]viw 0 0 0=ȮR~w5aaaU{]8}x `p,`)\ SKWo ׀oRFSM?oGm Q8M!jwGm֨ _5Q83;QyBԗՎ2 0 0 *1`6rtw{5=jYx 0 0 èv 8zzW8|M߰.k5gruW %쳃7pY/ ;o]W/ܷ8xw^tݢ'űg/?|i҉K[^07808'y. ܸ 8i!R+6kt2m-lcְa;uaMb6m,]lؖMc6m<}O`>} CؗOaaƴƷ0N^qF(-T]3' #$ާ=q7ާ}pzV e)l[ưQ;n^IN,ǶOapq}2 0 0 J %/2`6$W|nC3Cf2"E-vN3 -&Ɍ6YfaaBAp0f8")|,`ڹ Q53Tض-vGQ&9 20 0 0ǯ(2cqpK>3cp7]}ğ /7e[=;N\4ppJƅf5mvG3Z;e)n`n}eTwWaaaBhƏa0q~p`&(CI=:ki+2}{0bfh31@1e=ϙ`Th<'d ɢ}_y`aaNY.<#kf7 ^~Yv. ^lsj.X2-/ 0 0 0VX ” 춼>e{/rgԂfhyxs0ja<3xNmڮ%1FψFɓHR'6`aa > 1@sZ,[I Mh\hz0 0zF41w=ʄ,>g k^aa ` V=8Y, #)5.ܤ 9]U\0zF4 hw=-+e=ihһ>4baaTm 2O3 ++2V @ 'QDXӺ?C8_31),z9j3~GKXxNkϱ ٞzƴd10 0 cMQfD8}}r֓isjK(`90MiEh-<_q)e0faarmYǷgQ0F+0dfl_ fHl5fd0;2)ĕ3|gC"B@"P50 0 g73x|/hЬ6v`m"8pN55Ď$Ek%.ih{S@)K3~GWBwўyD!ɈM`9 ~L3 0 0 64[ r[1d c>H עxh3|lR"0zFXfGȤig-!kw 0 0 PE p,@K6q}zU'sĎ gwsb}_nk);Q]; D30 0 +X0VUeIn2EK41EǦ%rFψX ;ʹ?}?cd0 0 0 N2֗34\zG Ido(QfA,OL "FψXvCliVxK P|u`aaF8XH^X4r6?[3g }5T2SfU=#b"QhmǗ(FU`ϋ2@" 0 0 0N@ܷbdm5mH xfU=#b; 0=%c ${eaaF+2נf>w8cm0{ ڹytBZhi̲2rfU=#bv̓vw}M|faaF[ ճ"K^MuYXAM$f9Zi.&b(`T;.ة+>Vg+0faaϴ2h*2+[/XӯT@ɺ 6"~_['%\ iX@(ۮʴ ޯy D~S72v%^aa 48TP…4B%h~6phBSPV@>P(@ԊLې|2kXV"1aɈS0maaWTmpA468 .^U h/iȭ Ly$dѢ%BkFMR<ΠnFg(6W~`aaF࢚`S2]O.@& ,j$Ҫ bcFP|s͚ARе[5~vf,rMWĶ΅zi8>VY` 0 0 hpV m4xȼkq^ m,K}\`TL#2/w@F ^+Ph]׽>ˍ@ږ~@:`Ca aaF?{@B$7+5ׄI! %v PŽ+:+@泪I:%"}oQkhm*m>e{˴Yxŕ i .ֿ2aaF?N` 5d.TFsyTD:acitidD=n'BFh[dgj_M1,aaWTm1pT`<3m2x&RyDj@E[ zbѽl<-! xe?QZ5y0 0 0ktsVT:fχײ?*"}XwɓcmGgkJHu׳!Xfģo? 0 0 *7tp<m/-כUYk|VGO3 ѷ}b%}( 03u% 9 0 0 *`0k U:i0\qEVn3JvOO"f`ۣl|6]/vmY@`aaeopH1!huZt̫00 :d| E3]3?ia,%9H"Hfaa=O Z^PইK,k׶VCh"b͞vxf(_4 ;h},O00 0 06x8jq  Ҋ@;bg9CK2KT>ȑRŏksn"h_?;[wf@ Z2)2iͲeUa!3 0 0z`*i@0V ;sĻkM~ gL26Cʅ_#G gпH@v3JyPDȈ``aaWXl@4לeb"J{4 #W4Z6xKrQpam5MK7gF3 0 0> 30 3 0 0i@tD@[E+x!`Uk=.ash q Ǚп1HoDDn3aaaW`f`aa1 h?أ]5^}j $y@A]}&3c c-hYA  0 0 pmE p"3mWD }voI |KDW1AY]omG4XFDޘy )0 0 0Z@$i;n,h0?p"2<Ѵ=e:G{q{5*o3)l[|J6G[vkaaWtå La+͌knfwpfH '2Ryhk4-7xYvS3i4M ">m=ﳮ|'XNv|3 0 0EQf gaed$sgv|{?rl'1 _^r @;zS塓'%0tnP;(V煖S#OT  O2][q 5maa068(Z,Aw7֗7@V>,г1F;t$4ӢgZ:h%= 7زf5v#00 0 F-sn [B@4N`$2\=<%VE([ o@{ 5qSk*5Sej 5r`aa n E/g8ߚ/`ϣ 9/[Z!)N?':tc3g5.fBy e7faa} j:|-W@$@m;vYViK8x|~vC|*3 lcZ[vk*]`aa\e\tW`~ '^@[]&4~-#/'a] %5dc+`bnD PXm ۚ0 {Oٮe2S?3ז]3 0 0 A#!]"e>%4>M7@~8PaEkK HײKqBM0ڱ2fRPy xHdc[K\K%}ÕصV1? 0 0 =2Y^& PLzyH6vIΜ"ȯ]shA,a>1*@ eoȦvV6Ľ4غt<<σ"aaF_Pp _$  nı\]Q (Z"?yt|ױW<[㼉`(NǷed>M.S,kD+GgWaaaBY`# <߆jQ@I~ ~Z/e%֓닳D<rBz_ދ0hb)w-{WM(կb/sϖ0 `aaY32ܞ~Q`Eo6W  D|~\)>k/g0-Wh'ܧ?\Pf_.M@[\w3~4> r0 }Uǟg³w, uoDjfgkk{4 0 0VhвvksC 8D mfE0Ѡ%XL]A|͜a}% Ҙ[hw+qsˀ,u{-{l{:̇ψd'?8f"Zy7F0 0 hV m&r<p"_|F2%1ym# ^a0x?mf<2LR\ߪ໽ŷF Af<]_`xXxQe_#knb}haaߢt) |  Ͱ 5Ůrr8xȝ_5\ 0;r/ 4=^~!#໭WoMtXߑPK]}OdOb&ihϙ ծ[,9vv5F?cn8c`/?˞ O] /J,cne kιPgNd~<gWD&T2'D 74Sw*O/l ۷> "}O}O\א=kK4at;(@ʈ}ѫ{;"X0?ˮH_Təq9Y32!JWJ΁\ L id (ם(STA&.y>' ^=չ9P"{7Ah+Q 3 8>&&R.2}E&y|fe4`E?-_}}p\ kbju 4V nhdQſG)1/P+vnt41\/Ǖ{aFH"LȏϾC G??ˮXa A6 }T`eyGxr Bc?(K $ڵRԋ$t8ED͵ʤ€) ⽭C1,ωE x6Mm݈ U3 #}O V TY]v%Uż$D0l/ߗ3kPO3,=ws!h(ӬckҢdX$!;1F!p}j /^Ȇmh*b&a4Q`±3?ˮʾ3R'O Nf "b~ǢkjЖd.[`A5:3*|gÑ1)s^MH"LHGU RY]vUżfyr;%|?@6kzْ盂]Zx0SFx Q7F!L$ˉ/pe,ץ.UXn`TO ϴ>}{,z^- EWKU&Cgu5/5x蹶~ m0Aj nᔤO 1Nm' ؉Ԩ~ZE<R>kQ iC[_`  !fu0X-ԟeWξx4jg(aD(~8% ă@ D0) _.Uu@(ۿy#  ڳrȾ4 !0|0L8Vosj_cLY[ԥ-c( r/Y_ 3<_ޟ+zr".}i"l?Jx" 5xkci}^("¿"Lc: }ϗ`±u*fD=vp͜v@"`m_˴/7ZGO3G[b+wˌح,WhGn^~~["F̥ˣWYő5s82k6(dy8s^5e"SNď2xg?7 \.p1#seJJߧ~w@ 0:ڹe~$@  ]2#kwk.h72ѹs\:=#_=f⿽h;dGjGE |}Q q=z_3 Hx1軭LAKDҽߧD qQϣ dnje쿼n<'ے07Cg虣ug0NR(!|{Ù|.h72F#BL{?[L^;8aL*2r<*Z&Ѣ3-)<^3:a5ph 8p/D3V ѰaH"1=(6SL9}l&u0NRx_Ǯe9ga4馾q=7@胫"| ~!~\/ %3ށ~S}Q@+?LKNBXy %|$)P s 9ǸA>?_5hN8f]GYegUwe}{F')im rWB0@}/{n%HZ7:"X2vƧ&5Yt`Nv3bp*@x4#r.ܓ$  | (9 x`g̏a1)iuǰHxO D)^veu3GeXaUlKdV*ƞ0-% |`Y6@-%iLo0h8;[>x;E ճs]QE=&Rj1F*0Hk|Ox^~qe0cR!|g4 <յM`ܓe-V]swy/ $% |`/@-O?:t_LwE]VYzMqGyZO5ִnйm x2>^?%$q1./,ˑsahB9 {ifAOl']1gcߕ ;O6t"e3jP.{7׾D{M7#tO#0fE<1jO怶@ Zj p4(\ই 5C>#K'ڳ3\gm0jÏm_|`ž+#vy! 0:IID "3 nໝ{{ѹlAtĿtoΥ3~7e}Q j.i&-.Zg'\jh@J"@3-{ Qd{d%ÓS ,&ʭ@#qS+e;)"Ӹ%=y)-?&y/YzгGKw0% 4~Dg{A]g6{/v-?IRlM?9[eH=xFgz/oqt\k|曯K6MDx| CM遦^/ͼ-&l"[.Q`k9Hh <ٵ?25jE[mtU<@GܲFmW2=֝g}z~칄x/`SD? ,l(8@0h|].*]F%m+4pݼ`6 7/ Nm0gA IRڶs2֤=m&mm὚_ !=O9@9-HtOQ|osi5Mw7.9 ߏܵb_Ƒ N}?罐 SL$OLzq({.LD9>#s ^؆ ʉ6D> .  H^Qk/Nѷ01 gfKR8&Wlv,Pq"RA $uc^Ӎ| BP\|ZQ| Ks@ضM6^8@<'3u0ny/tSDˋ= P +y=6ORO۷01 cN(eÁ֒<6PP@~j;P9Hm$ ?:!QW/wלzӁ<}/&-\^ t`ũ)Π\z/ ;S gV0ڏ*76_OY[~z} Z}h$— [\; -?pE` =70ft@| ]di깱vקs9P㸞,?_4ا&``I3E' n /FgQ^{.oK#'K<}1׹o"։ /-fPQZ=.%abh\dYh0%ѭe0_+ܚO'~UiUQethf CS3[kbɟѧk';P$;GY44X+/@ЎGID`_%i`7x k#w bmxαJ`( #s' *'\/ "yDAQ 8,݈G,D φY述.|OXqfKS۪}_;wE?;wG5\R x-SF?^'d]brQpzSW^ܢR0@$fZP<~;d*eWmldZ)}v/UdP}G3\f*箹 #O-/ 3tEׯ "O<|54  `Hy~eہeȾJzD2 LIW >n::r08Ve]v^zD>U_KD^6Ui wl"/ˁ?"[R}䖄p$whi[hpM}둫 MH \HxBJ\]Ot 9>MjM@v"%s͠SB?)i_$] 5s$>mFd#A5K1wei ~H+T]O\w_򔌯(F(Vg=. mZC (k;7>8st,s|5s]7B^4ؿ҃uF+B[2 " ۊk3 eT/!V= r׊TpL2<1mF1!"Qw(p+jC0=) ScLWcpLFGc4`TD@|挱7Lh'27''qpMmǓ Fa5pKh!SN .i&oQkdIЕ  0MÄoXH B^}:ԡ3x@ɤdiS_o60)ˀ#k+/i }{U!Onk(܋} 遵s+fFw@K0D0qMq Hr8IPh׾Kkm+aWŵyE t2 m 8ǻbWGY5o\Hib{o J`{ĵKσ &V38 pNQ7@_kngعt滀utrDD&  kl92Pg.q~\ݳV65OP}%1vh 6ܔ$n~WxD(2k/5$F@$pbפ]7>4 bymcO QEQ9]s$nj{ѽoC2ƵHcҟ~qF'00 30 30@[@:fFQر SO'dg C6_tfj_d[@oabF4~A=]Kpb[74d[3 xN@w%, Hc]5jGRS]+_*6_k+cM0:f`11 3 3|2$E Kfkѡ7޸ `~rpݼ]vl9Z6""q{Mշo0 mrz_8}?I]}ayMuYy۸oˇyS༇ålZ28cft&8$20si_O۴;d(:B2hdy ߠ=LXmCH9m/8 |z[3e": װ|}=smI&k$LO.އ/jkKHԶ6gydi{ ~k٬ڥ3a@܄kwts t> @4='Φjyeǁ. ?ֿ̍jDYt.mПٯbk=׏ -x1h׿<#ü#.ء{ &IgspM/ܿfv@`Fՙذ+5kox#f-[x'.{;24~> OG> | 8/ {">Gy?/_e+F|k_1YoG|ߏA#G&cOkKxH~":>}~S9PP9}7:+AWz:cTYS;v񩰭`ǣѨ}$j{EmV6 +jqlo7Qx]W^C^%~#,rhwG}\ǝ6`2$l@ǤY{!\MAOɌx(`N܀<4ϳ0͂R9e$ضmW< H֔Y{ ڵ1lঅw1ff=Ʒc:>P~)s⬣0jG:0 ve0sg4Gڰ;rF@h (^̤ 3Vd[5* -|%f۠ ?'` b8 F<!P՞[ŘatWDjUW1_Ow?.KJhcKơ?`J}/ s7 4ЉGab@ vpb8pjrQA"@<@1`0  &@3ž>;bi} 7M2\I>}ŻW>'V8P_X0āx&`ʂ `˲oaXƾٓl>uh~nc,oǡ?\%$( .'86ăBt7:~%uJ2>Kwo.?hw2s$ܘ@9chݝE~DZ~F ꋻ_fGx}j4A7 E9yE .{[u@o̭n+{9P˃ 7h I0?xQbUN - P2Dz]4>5p>&<:hC\@/E~x0m9:ZN L.'hge7~4(ZlTP3!߿Bߎ`Retqrf[y3f8EDZե5w0DZ?fQ,U'. nk[1i.iLk ,b W3znPm އV8i ^4Jg2_.h#/ x, [8WX?M %K:xFЯK4= h叒A>[Ar+CB /ϓPy+`|/{pPRw/_vhξf`\˨<R$e G:~A0sao#kfL f8f{rodhLM@}-:c"|ra(^ 6|8f&@pٛ AL4.!\OڞxPo.l[R_u0Oe'7-zjCon6|νgeyǒj.ȨdErqZ1Z}e`H\\ku aI@"gмpPNd$>2K<^|9RzxzZ0 <&}%%7>^sߟ):VH1㡴!OdYuq}q< 5C~mb_HJ8~n?[0>0 m'F%`nE54>ώœ >؁%Ck=fĒ|׽\PX@ԙvSƒ+]>xU`.pp+SD)?ԛq@Z(d=Lhw )@@>BuA*30~uaqkxi.~$Uw{~<0dcYNlwA7 9X0^s& X;c4*-y9 >nj׽\ 4(YV_*:H 8z$#^|xxMњ6uipp~Gw/oDx hc}4ܻϒ'&ܐUwMwM}4S p ϒy'8 z@< W4%r@N`dL(xrp38Tb_/ք(q;´|~w`A=@N<NգRn6LգU~1?}6_FFQ#08vW屌΃b?-V{0pϭ/& O)Z[ BY qCy81#M Pz}r@S ůM>@w@b`6 aeeeߊ(!d͎*\ i WE]_TGp@brP}a~!YyUo_xj˴4p ^ .~kJ7J=?0a}G|ئm^$8f |; <~-nQcmں|a u"}/2>ga X>Ne6˦c?)rI5BN@g¢0L6| 3% NHR4 ߉0;MaG&cb0I %*,|̰(`^N2ʯ?D~&A0sPn- n?i;zqbgԏ t'Kah?U^Bp07cq fxh z!p xR89gOpvm]ȓN#S0W>PXS` ;c)du2Q&1@ɸ9@\E xN`R7FX5N ߂Lj퇢vx_%')jh⯀r9FA:Ђn\m׶ ,si``1mL~yV߂X h&Dvײ}O Ogk WOX|@=zbQ<ױMmJɓt ?;6Z6}=Q 2,>+f.H|q/.FR0hOBG6Tjgwl-ѨImfTv4 dM ˛&2 ?ybg4яz_}q8c? aveeνHxvM Y&T9ᏉX2x4X U9JWFw Qn\z|YSv$=ׇ5*\`}# +4 ]}<by,RGJډ<'Ԓ›ϴ(5X]kHqJ.@.[(o43ST!.7&E#DDu0}k2$gd".`FݎebB$d:ú:,jTiL˻ͱ?0zIfSCd|?qE8M C1av<]kȿx$\*ܫ἟5-PڄhHS`Lշ40U6OSB繈l=&K|Ú4h% ߙ --hvI}W.c%X#)0~Bi5cH#벨P 0U|Q^g+M-Ĥ{nA(AT@ sxƹ6/ đgye]F4ؚޜuQ46 <h.Dxu avbfRܺϕDx y9*覫`&@)iDPU׈|0Yڀg]bO㤙bR7̥ͅ+ak y?Ъ[̛ yۉ m6okr($($6(b tKv `puFK>“ e?]@ 2%xR>8;@c?NQn@Pεoc|1  A/3uǙ;o ~ Cn{3 x>`]RM _ܖ ڟ&๐ItQ@&$,w*H,@5hx u[ěPÕcCk{E }1 ޶GZ0uHǏ?6C^熳ZN?:F:D(A6{uu]}@{}/:q]pgt|ie6Μ\OYg|  'z32c~aᲊ(p{TJ884S-a{;s<deB8~T/!x=4jy ٶUh$m3?8:s+* gԼ?#Qvݳ5 X|&랷<@`pn<Fz NM$t[m˷%+O<1 r8o 6?7~1 s/.@s( :`,UuT{ϧ=Kqkx޻n%etpDA. jn0!pn9qb⻛8:z<7H=婫>V|F2\PF"$Ж 7K \04Fg(6;zv$,e̎=Z1mވ5׈ϋY}F`Yn`6@!P(is-cb495YuCT.8&{(Ji/LEcQиV2=\5_w^8e$6XO> \^T$v$,[gs#3Gs">g\nXGG WWљ,YHfk+`Meeeeeee*yMKS59 "@8ܴK%IzA]s gslGI*Lv  W>75?,s_cmE\ xOMeeeeeeeeeA[_2A _m"59o|u/Y=r> 8+ؿ5*ns<1_ !6pa2>x;'?"pX'q.#YăU \:8=G_Kk.!, ?+:ǧ1ZcS2 A&ЄX"s=b8[ j@`RmlsM`u .av 3=>69gZ?a~pUxfk(ZkU-«4y@ X{= ga4TcvlF{9]3PU%SDŽ|$IHOY8= 2 \JJ2iK\RF,˂UsP~<.f h;L_+3ЩyfNP//bZ~Z6Q@K) CUu"vhPrb7*5\,dd- Hw?Φ^tf(A֪6/$«0}@x X߳7ΰ l $`[I4^9܂z.i@ ZJO7HǢa$c9J3n& p /N<} 0O ˄SX@u<\>5!KlICK@9ؗbL]D3 }Lւb}^.o6D.C*mM*1R?p .q=3\2gk$i"kh&-:Q-{&hzl+fxjoYTt/y>{$R=O L1/N3 9߿Qwp %,o0RFxH<8ljo|a|qOo;Aۿ0zח_8Fާ:}vǡh&T]Ǘhtd L|Ə DEVfUPfJ1 #V ȝ~Ҫ 6mc#^G<K4 ʬ?EY@DxS2wm=`g l#d`ۡvͥYZ+^QW8#38Cț@?ÿۙ@>>8?c ?gEZq<[9E[v΋^“tl04P֟[*Z{>[1r0Ds!4`*Cv}6]~ bDc u{:QF<7De.`TwNuCVQlZjok牶[wb$Ī6p|9O'@Y9IT+6h`/gb0_X m&a7 ͒ 2Pi2m1ޯD gO=iq1o8.٬sQH1x"<qnطjvr:ºIPk(6J@o:Ke⼇4|?tW"Jg^QԍucOw3C cl1}Fku8sZ2f\k h[._E4gb R WK&@,ja(f*e r!imaQF2)(w4)lb>.] Mki!\]f 4 DkB׹ܱ]q+3mI@VhI!lKQzX(۱' 'h=h~Pk8e^&3 cyKs/7 εKg|=uv/Yi_tcbp/gL?%rQ+GZ:m^^37-pX]V1Þf"M Gri6)!m)i3i9-JD  ю}/pL G7-NJ2z0\"Qpf7#AT8Э`)+\<77^+ 0$ mow8Jm Zv)s:͡ƒ%3jn4|? t0zd>q^>+n#fMV |xq C` /\ۢp^;UE&@" B1VIT+6@3~R) } |p 2BvdX3oʴFό6X E;)ֿ e k_L`A4þ g_$gvzEqy]fhֿ L·\#>]bwEa`aab]Jc'.؆mMżt ]f;μI|Fop_ֿ% msmtv 3ے[޺37]?A<h@.NyöLwmο2ᨣb̈¤d [:^Noe$Uъ!9xpҸ!(Zo!5]PoVV5QϺ[FBѾ(/5rPOp%w@v-@M[P;;/- }N(/5\/%8f Ͼӵ105e2ʡ@&4,)'P+F3i&h xf@(ey뜢jX;٭0\& ~@ s{lbm )$ְ=o%3 >Dd@)< έ=v-zoOdd_Z;:+AZD틮4vuz] 8YIqNW4 <FǹkݳX}@("3Y1E3iئh5jwN`e1@Fp\Koain~}Q {oBoƶz,Y]Vs/ܻ$wW۸N` ^ЌƆBIͽ- !}4h4{c,K;3~s-}[Q Os*b){@Ɵmc#JcM;]^VG+( |="Px(/ Ł,|?-Ǿ~ x.ڝN⒦,+}sXwSƛܓ1i+E aϩJ0ۡ0` r.FPgwNZW-%ut@M7xH;lk& yFw*b1{@to 8Lǘhw,x@Bȓ(ù'=ZfEUh&. G|b?b?<CsѼf} ,ԋvǛ s/ zU6*2|]8lͷ)"D m2n^6r,.Bd96p=y\pqhW2oh躶e;|jgﭭ=<  @c>+cP?qz3+ 6L_sO ܴMpo܎}$`?}vӹ8:٪s]) 0!9-(4X4Z|`~@C)gEzwDcøEZұ s<ލ З=~$sϯ-6/#4|i)&B{$p<Csfy/{*hvةIҧXpO` $E 1KIbec3ZG?̥02slVUn\Wޘ_Q@ tw ! @c!XulKn!-}|=<湅y@,:I9M$I=x.ڝbn1yl|U(B)(wg1+?? ?t9#Pb?<Cs1P`7z/ʞ9L+] Í`l 5:mӕLzz`ϸ&K0ڤcX0 ctp9\2摃D eO8 e s̺x>D:(ù'ozn(속7??Z(|vӹ{QپH3S>׃&.Cf@e &vAu/sRkm 4k\ NZh^*yn:ZF,y< 3'Hu&zO(q,Dc)#  SDZh`r\x@@"m?|`(0-?{aY`:PvG0{\;d?1c^ɶWJ`WC)f{PXo06O0jFD&K0z>  DZa p$ͱ7}!3Hc(0?{=r oofwEK}vӹ?[Y|?]hU!Ы C` {]zQ"@k4 37dž85sty쾣Yx@p{x@">|p >=A!Fa?~  4Cy!s}t_ʾT^DpNO `6hq֦|׿6xy>7e|11uc.Gf;ͯ^_yXy{O7^ݾB'+tAo\csL@I%5uF Կ63f0LX\(P 8Q}Ἇn^?(?@dc@G2|q1^^} 5@>D^8C(!> HO?oCh9 _;j=!}j C(A gm-]A@ 瞪@{kT_{A  O#|F6돆. us/8V(TX@8 7 2|F6q6~}~y"Y~ pk(|‹ǝ us}tD5 (,T]PD(3!__; D @k7^T 1D'>/Xچx~~!튫oǝhPJ幇>yY~-.1\8~-* -?튫OǝHPN幇>yQ~ |_*= k`}OUW-~(+ pG@)?| o S~7O@)?| o S~7O@)?| o S~7O@)?|MIA6(G1D@P¿  o>/oWpS N7 Y% ev?XA*/R)߀X((K7   MB|bLGL'2J sD5 McN(|pS@@W۲p(կI[}-K겈޶x|bLQ^{iay&Jk0)*P|bAq~_dD~F' Nu@X5.[[96[[>:S[ڔe (߀Xû RR}-R / j(߀X q 41`ِ&JkE?\JS@bA _F 9qtw혮[j^UG]%@d)߀X Q+ 2*-H&흽/7sw ro@,'"@|DpSCu;kD 2o@,(⼌ _ι @%@)߀X q Cţ8k;=+n_N?JRtpq ++J(G@ >7 h >(߀X 2Yɏy?OWFg[EiV*Pď`Ec%k/բQj)߀X |bL CF/$zc8 O$)yп{?s'[ҘEX[},6ߟX|b<sp_U\3@h,ʽ|?J%M+f,Ҧҿv %@*kO/4QߧX|bEgP1਑CqK] F>RJ#K3>꾌RO5iT_B`D~ Fo3 2-'H(b˦2.r_`&JRnzn(+aueúB~a^`_ψx֫;_ztw+oi؞?)sjڮ1/ @ ;$ 1lIS%eE~b %#dp?fdOЧ2<@͐L>ݺ|]ygpsGS#(bdPlqC%8M-)߀X#S(i 2sv1{j};";97v5nRJ'Y\B0%@/Sp[StpF@sv*fGzxܽ2p I4 yP/K 5|ϩhc/louxcUkOC $K? 9ޗi(K" ؞'ה~|C79Mܑ,6X5.`ԓm cUQMuw,Qu7m P~Fm^]V4ue!SkG5S{(uܖjZvtw.vձhY@rJ mC /_8MITV~@}u$N}3-^E 7w7u[͉g糶6b`/5gy(u.bwٽ3,WC9솑~*{YUe9 -n=99M]x zQ rg{&B>$ aܚdO ސޟD~_J`/ W4&ۆWo5qІ2v|]]yRџtnfx ~ tkyEC4;&Y\%[,KhOi"T~|"9{PƮpJ?e,fUg؜ (`d~)eOɞYW/cn0+cO.a,ZQ̎t$`ې޷jTpd=`qcg͜&BW7 RQp;[s8~s X{mh¾)hC#[٫j;k%ƎZhvVeA$ÿY EC5QML|LgQ)p_)߀H0P vU}c,窳XC%lT6VB< e[57 xis~e¢S4Q8ELz|g䣜&B{W7 ^{~onx,X8^?.]8Z IY쩵#ً[د6Cӕk+Y>w)_`T^Wxm'uy~+:2ysD~OJ{ y}Wu!i> ϧO#T߻F_lbїOW]m~>ZJnC0pg{$"H*?4SR^3ilrlOg2z*:&i~+B^ t6W a{^@>|kJyx^T^RzdK5{l'Z_ ?Fh؆{ڇ(7_ʊcYW԰ 2ۀ2*xu"0^)J\`csgDM׏o,TS7ς]jA )S@ӕgח\,a._=B뺆?\,И4Ȗ*Zv|ϩY(9@/,{,+y s?+WE@ ,/]i<)fT$hT~|d onx4PȥM5gfOo!1iyUlN@}i>*=<[zF tn ~BfLvLq,xj"`rEn{RfrR~/wH(z 1.fU%zR7iT~|D jx|o-MwӜʁ:=-,6|ʺe`=4\*v|o){}]c=ݷu܆qEg eÅW)g'd=_KKw*edQv%gu06ٓ!-D~F ]؞Ol'}}YJ[NgQ^:g7w mGsEvda>;et=ETr֯9eW_\gV$ < 4O 89Moo@0; O9VάR}4yqK ?aH!`Lh7g3YnjWd% &'z7=iٜ&Kq*&j\>`n7K7_iv߉ zì.,PzZo GT+ {ٍpwuօemSkG fۧ٬qx2&Qi~}LǠҠatB^ڠ/䤍4Y}P,xZΏ)֥zR5qh@qSlmg `e8t'dNnZi@&4;k=ێו;X:w0[71&#|2:y*׌$v:̨鉝&KS?2ͯMqU,nLf)Եf&Pv^(ꨰ՟sY[m{|uNuGE5 lXb[heW_\]uŶlhvV:yKd>W77eNNiTn,Ɗ&]X>&ӓ`8 Z(;lv|oF`}t.IK?-7q)ۭ>ԻAK|A![јV bJs,kHoxu^h4kІe5$'CI~FEY)f$=ܡ?/=DAFEi+ 2.DxK4/\g{R̯My$[ |ojm^PƎѐNXΞ]_m(''<eFKҐ} aO\2J3ӵEy2ZdP|0=O!/g|pvJKQfBd(;M+.@2Q4#w4|/ܷPSN$= a[d8MBH ƶ~f̓kJBu7^ǡk + <_}6p.ȸ.Mq[~-9[^],. ۆնW>ybFϕO~*T^s})g[ WQ)3*E#)l4@{ug{jIvMa yg `c /~UY?[!KhH.pm$}Ѱ}WޥًMe6w77 TqppY  ׭i 4Ip>JSoqLΦ nx{eG{w+s$B0c5î`+>=o0Wapע!M;[C peY$ 8@,vvo ִ"`LO 누ơ8Ex^٤ݠ)7So'{f{i< fW_zُYgb<5YqEIY~ckG^Yǎ4o5"K*"P>ehh_Xje{RH%yL>yLn={wcGw3Ӓ|& sS.1xUEg}]_~le\}WvR&ۿx({hu~U7f90} ]a_ć!h@ N.BX;1כU0QĒ-s z)|S-պK-ضilT&ͯW b*9lTr4/7&%z7Of-Ć:uWj,*ҶMVM$jii*is\n~MZmZ^>@M?[3f64ïF]g] N8W؏;GndZ78ӟ)+ cfe<P`#Pg&G܉nWWW:E0*IvP`#PWx6@lH9I <Г?bࣩ.P|@q$ dC1AC5- P.@brTɹTk/)߀@PvV! -2~4qS%P|A ZIibKѭnfeBm#ۦJz{I@[ I d{{sk= `҈2,~)7 \ R=)Z@΋@Mof KGg*%J@fTE%Y 鶆4W*"fu 9dpl0!2AV pSI0<7HErn u)N 8b$$P+[*ЗQS6o( 4aJ@fAb| 8:|^mfb ͥp IiaM+*ān ZA`z``7(VȆPf[no9i| 8H^uSR| 0}k0>*u{k'ʯ:`[T.03IղAf%MqJ~XF`g7(n fgV&*ۉ{?b8SDlu9 Y!z`\DMe܆Y]~ݤ?yy!drP8(%Q̖ k\NG7?:-Oedk&䰎ʿ׋`ZyBAJIK2t Aѧ 0m"ynAH3sk[goOcN|q}~nWyR`O-()l伐WX=o@|DpT6|Vo&3?]{ Qj|/Sl0{ ?;43oCnp /}Icd:3*l;{\O&"tBW1@`7(-hB?k[hb@Ǚ`<2 wM@o4_e 8ܟ  3*0@07z(e{G7Z$[M/$F,w4*yzSЛDX&LzfR&^t8<9E0ھ<(M8,iuȽ|"DCu {RTHos_v ֙& jq:ŋ@fU|`hX0%_gx7N13@5:I6A84\19 S$ EºT5̚Ā`TL8w4Ծy$ݽT6uvvz!zO~D@&x"{e>j̮ \5yRL+  f`¿AwT(*9<$ Ѡ6PYAJb>豖NH;Ї9>˱VDhP_@VSܚd+H]/J?QjOTkR_T9!9_)ҽn e3yB1w V"JuTXz2W&Qj>M 4L PT v 1w F%CKfL|lG YJI} F)Ȍ DD?JocTw/Ity?X]16u06ˌ4md%x@DA ^FoOs+`֢瘼pqrGWCܓ#An?n7vm6rp˹6n7jn$7+RE3t|_8IM&ӄx-W#~G\3!Ǔ`vX(?@r犒8MM3ϺNnw-:빻';1su;uܴH{A^₆m&uv\8;m\0p7pXd@h.cJ2tm03f+lj3+B.fT_g(?06>]two4Q_1PѰ ܛc_ݍm |wZG0ήux:$ a"!z|L!W 50Wb^'-h0DqP bs,8CDr( Dʁ[]s}Xz {ۏnΏcH[EB4]m n?d :׀҂4*&p #Am+~$  5nO4ή)1wL$yW$D/ TH5 v ^.~c H~r/yOG̃%#X exTa8v:,ZJ;] Dߜ~\th>}\ E'\6&ӓ`J% j0BKC RP@'n 5ו_iTH5J.7{㗿%{gّ#GTxA/~žT}ztp%ٵGTSfL x ɳ*]2 u d^% xP PD(" !R~bEC?4Q_oddquvMT_|`O>${TxAK-욄ۡWnή UXvAS!sH^::C8$ϩNr]^&o"V j VP~%}=0o+e~iTprDѽ_;@%Geҽ:Xb9ʎ_x@eNS O$& y5ɮ AF :+,$zW `䩧G IJnyٵ<  r7ǕcLH lpH^0*u@r6Ǧ%B-fV2 P)XAe#Ns`+f '9Mn?q6@& >|ضzŨ{/}|&p}g =T[V ,{ºTs<6 V6HyoJg_r,ZV%~w@{Grwv]Ev(܋Ĩqߓ9|x. ],^ m iR!>ujx@a\idBPyzS* 8`|Hٻ`UNRoKg;4+qQo4/M(Z؍ AIGp(?RRI 閳EDޘQo3\-2`|"I4(ҭW@[96?ӬD h.|8k&yOO? 4M(K/71nmܸqCm!8z>x YTfe_6 /ip],)<3*[f%@fVm% o.L%S{[}:2K3Dn>h\u hXOxJY7%׍N۟X_g&ϯöL/*tPeTlѱb6'f[nՏA@2E$,ϭNr&Nf^ǧ L!Wp# (E ?6U{Nq:s_n3C9-5 8zyHq徰茅9$BS>H l(SСatE R` D(j *{YPqA;\͡&z(*nRlPCrh*Qh> z\կ͍8a) E|R.ӽn }a]zɏxPD8 у-ºIn|qCSKKY?h׻Ft]>sIs󎦿߶s{G}i)~]5pD[  <y "vAB5 齠ޯp+ sjʕ"៌t q]}:BEnWpBgJ~Mo*>`HPe<_uP#^P}|UQy̔o@$;G =4K)Bz'O_h6~ˇur{&K+JN<ûktD۠WQ% mgG[ |:(P\-%b Y|GsAϬdոewO&hl+צXC얥C|詜@",%r'T4$+l_K\џg~&7?ɹ҇95I'o^~_xw17Bp2_WH7 p*.`)@UИT%jG]{4^a?wRu8'cA*(0gh5k?YnLW?%n9DoOimm=OH"xuY {ysd6Z)Jǎyo@("/Vpp_ "h ͟w޿o.y]NUmlM4c'jLtgÃC}>tlhOnfQ xn8+н4??Zнt뭷 $D' }^lP/ Gc6mu ZR\apLu(&u[*72EKy^aZbqFB\+yt S?xLe@تU@,iʐg?SY@X3o`0"_& c^mG NU" >4^uxTBPP n)5K"Qt UxGcHtu&+Jos 4}(ekxpY6$fd_ؽ{sNmǎڶm"I7Ya rGiPJEKmw S|O]=ԟf4.HWD_p\*fr8H}HnwܡCOUu鶂={kF~SX$޽{twKtӈ: we_oMgtM78Z|hGAH"nO 5^ 8q`8d׮]=_ g'D!_n"tSد޻ogxQן͑O<T\cse<2~z]Yo㔼%qîa1LV A߂}h߼yN3F GP2Cnݪ@k L&{;d%XCiP%:,Umݦ(vc>P|<ך9_y[  jwPV= ǿ?0ΕpNvSG޹s<>)C/  $';)[SP2޷,S?C | X4* K\Pr{,It՚ nb]w鳝Z*hȡn{B3-h$oe$ 1O@cck׮5>V^-Z*gWׂc/&s;1Y.Y@/nCrGx=l@{g+foSe 90Q/~r B- ?1Sz_Z5![Tjk}Ih?`3J>]0 _ɥݥ@2CC=~ D"m%ZѕnG?ѕpաktkKp Cעé^5)D &g}1Q/c#V-'t{ܢc_8]J9(. +Bn-wo>M5r> {(3?0yEÿ HVtv~P=b&޻ٍ7ިo Ar¿kv6DQuxftr-zt,M<)XLd`,ʻ.d[?9oZ0*œ;iD0[oz/ PJ OA`?<:?8e YLtv|ZFoIc罆7:+d* mw `.3['"̪ϫMU'H4=u4A]- ~끜&4& jBOYN!r_ !CG$ ׬μt; JN(CuD/ٹ, *¿d EܚdOjyS[>W[s9i)KEzpnKGRO}GޯG~{Ϥx@ ~nl70f;a t%߸T ?o?fzeY_?N(YĽFn1y(t3y^[B} it"]Hf#^ gW}{=ku},ˮ(!X, w,)N.-c?{gEu|MM}llDc .m²7c좀XDcIL|MbƂ-jd32{s_>Lj3gνwߜ9w0s[3iteY?@7g%J^ ` pts'GRw"TX?_λqwNG]tsgT!rKYh㻻;Ew1u<\E4%Gf) ?Jp0m}~ /xIǫgQ/*'KSm}_i':w?ښͳ RB#ߚuސJ5 ID.ܬ_[j@s;=خZG/ȓwDb񬻝bTZk +a<~Q/1G:ܾ5kVsÍ(ˊ]l zGAM*Gӿe *HY/J  H LNe3(/{ wN<&޺x ZH앻o9zu!{+['/5xHvl)24S8 z%B9"GSN8tp뎿*&w~?w)C&zo(^ .n\Q Nxʷ0M*D'xBH/ty. tgQ ~Dj*UC{&^o[tr!\6x߽g^AOsALb5%UMo.1g /\xom6?ItǭX~_O@kwrAh{QKP2H|"lQݭs~benWk1ϟo^tE]ſ>:Yp6_jK/6~E#z\\DN߷K?Sc=`|B6#\<yS:LX[eb^3ݯLO@s,;m+VwqG |x֭[9+qPI.Y|;BM[Yyr]3$?2/k.;O4ʬ  ޢK.1'Mw*sM@KlRa .ȯ LjkMOS}73,߸*Ufs8?K[抟7ןXP /NR X}z\X4D}asgVW4u]ew3ʅÇT?6[W<龮vm$WNԟq֭3_.y=^d5En\jl^nvrH%>_xq)1t;ת^ϮǓ狷p`ʕ9䂮mE҉| M S.gjKk.:\z(w_ ›k׮5-Zd^| ~YcO TX6gB`ä1TET)#H̙H5ٽsD;`vDN!kXſm0 w.9`;1.OV(}**mN} q^:qxGX r5`߬{nì4gGY!eV4%[2ī3|T*]gn^Ho;TyɡVN=_.ӽn… CW1SQQ5;Hl9?Q4ދloXs̫kgl0&GcGu #E1+BJw;vM%N_x91G"r\'L0*JER-`ߙUSG^(5=Sc)0]KXb?{eGzY\jjϩ2< Yu~9 ]8k=gҬ|)]VQ(-Ȳe1@.٘A@NiOI CW1T_1Oo^ʩ'lgyxsCoU{ߘwnƬ[4,}t׼*Nt5+|'N.`muцE /5/? 2ltq-tBgoɎfB@*vw(ǽs^3SߧO_~x\ C EEXcN+<3@մrP}@}փ1?(Ddٰ>D7,qqv^.5[ﶿy1liKCWBU+SN\=猾߶s07tVz?y5k̦ yc|pewg*UcndPYYaNf}5j"1TEe mq6C f1fr@Vml=^l R!?C`٬l_[v΅"6Wg=.<[~yQJ#z\,8ȇiۿh4$хY/N|ԂT(~|3,vBuL{/䒳+8Fys&(-p_5=/Y?fnJeLsֺ3ѱ.[<_)7oc TX0m5VUlii6=k9yDs1=~ѣ;"dzԅyMB8Qfy&-` ํEjt1Ev2ŞV{as=gO@:m}iN>af["ACEp1 ^1d_mv:j`>o(Ddg#3Luxf+y&I/\,,-\xX|^˕6!K'odNq7/_#SmۿҽiI2y1@w=.j;qm\lx4 f&Tp "hcDc沙]ɮ + 2l&i[R>#Bs1NjNܙxT~ _C7yޑT MBH'_]w ƍ;"s2. dt vwjkX3n)gGtS G5 ^{n{Yk&Hf`FD*SWܸK3]M*yR~mK{fSsvQ3h*+`7̴~嵠}GHsZ[J̝\ztEWi.2,>Hk*cw#osL>a6b~OcO*0/:u@s4< z~؏6 .^ZQ  O@slo'ω 74ḵW Z\s-kk̭77ܶ|p&-7woyMۯ0]]ko.5eGk ׬Yc|wiVO$,gۭG1Νk?QP =P U 쾙e^?NL2Se@E^o;Pgnw梦^g/76m* @47qo\":OTNa7Ըzټľ&n- G_W(cyZ+_\UȬYpyEg VUW]ewƍ]%%%ǎvLtT.Rv3uSǚ5e%˦e^2n#ڏ_R>pyq7']Ԃn) E y ޸wnP,z~v!u_Inu߼vSr߷κfR?7;Ǧ]g~w3g3޾*O3`|nϷ]{I]=9ME w?ymD}?1vLg2=}ҳc ",ڮ3CxA~\`bF -;g3HC>IeqL{͖iC~])NC̯-wn8< d冩ŧ69 NX<.<.bt p~yϜC h "ER7r~ӣ᩻*+4GN1-=]oCݵF^f{gū+ָ6onns裏*MO_oъ ω: /ӦMs5SG*'O XZppnZ='m1ʋN?ep*x0tqZ@N̚y|^?wKG;̼^Cgqϼu{J[ Mdﻂ&=b=wR?@5 i7{<~5)<}ώE<W7^C]HP[f<ڜ΅: ?g=Zݿjډf̹#O=cyѩix6?1oigk=rDske瘥Z2꨾ʴ:;|dz{ݧ:fGEk}N!-==;[c(ח .L][Eis[[5~ݺusktM-bM۬b2mfnذ b=% {ں(*~lw2e1@KG}T^ -߽)4=>-=Sy/qJܾ=Crb!U~܅456 3fpLlGV T3Fm)5D1'?0k…lG.; Q*IK.!f3^cVRwkTNgL'nd׽xُc)v㶢=b`أNJNRv: fp0"ij쐎wعehQMJѼ!-Ck}Xʧ ??l5¼yܦb/M$OS:(^hF^4uЙt.Z5~4ƇX8DvcSXdao_1 vcLf-sLv!{qC/H+c#~zlbmksq~{{=P6&Fk'GgP3.$ b%D<όX8$q:W ͒H@@ֹЌ2=_XyN  hn8RclcM!WI!5)yGnޫLw뽢q3=,OgOn 'w pW莆ѧ_X4dѶVlO lmN'-Q+HT7t 3,C}??obs&^ жImz^O޾* v}'JpsfOSu}FVohsʄ XoeL؂ͯ6{ɷ5Ɔ8iQw.=RIMMQ gCO=hf ͜9S>S5s%p$O[p7waGX?"糓?9&U @{َvc}<J}2uN0j^*ڶQ7\+nź֢TM`XKDz%$N:bX^զb^KxNxaӌD+sLj1!tKQDhBK/MNp>ǓH_ā7|ܹ*G wl,~  uK=+ @Y^{k K]}J50Q0p{ R4#ՋM>huT3ŪEcB|0WLX/ngD]\UVV&.7ſ;s}!St:]E{~}vcO@TiEEE#YI *?*/,, ƎiϤ/=yیEsdm|,d[ME&]$rt/ r/&p-},ng\t/ "X#*t7}N<]xҥ0bkT/6UJs{!ko%]p>;?҅}|J?E[2i.¡AGEY;c5ž^`yْE_yݣGUȞvPϯAx NR*yBՂsϰ{3OYwyQΧ^Kdka+yyrqr'Gٽ{s*[ǟm^Sھ-xg F8/]MǮjv+T'A`ک-3L"*@k\ 0i1O9NSܦhlx.&x[eZ P-[vr>E껎;2o5m}$_߯St_8BN N>pOBGt8a%9 `ܹZqn9|cxy'u9zI@C ]!H )Q!L ͽرM4-/7/\ X+!b(@c4U:@\#@@q-~BF@z$T`/.dV =6Si# ܞk)P0, '@bA cؤ CHTx=C:q6@b~ =I>AF2/8$7|#@XE^C^>ԋ|?'@c0U9~oR1=@@!Dy~HN2#HTu H8ſ ,x:[7 cfEN#HT>Bv:9~*:>ǝdO =a#6HF@22vG .?>+9u#}D X*@ $\#@ xA.Q@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO<@oO_?6@oGш7zZ#H .o쓌!@vo$G}r?B!l']# fE?B!l%]#. F >8r9o@qQOFuČ#~B$lLv(cy F6d ⛧o,#%wcxf?҆!2 t6/D]4A*#utj ݟx2fFuOJ3Q֩ut; D[ &LYHM < !@o@ @o{ 37 h@Ђ2x2f! hdd wۥh%#, @I  AY)4Sȏg"LE~L*Ԉ7 h ΁c׉B@x2f0=Vj`yEY/ d?$ 5 U ւ`ŪB@x2fXw,Ct;`7g#+3Ct; ?Q-@ǚAT*Ԉ7 iᒻ붴*m7 iE+O KY@N. A ",#t@ ˈ7 iS7H^blTя 7 !? o@,~#]ӱv7?M ͒Y#H HwE~<+ׄƼGBD 7 iOE~<Mm̺[Bd#!@zo@:,.i`6#5x 5IҗxҙfttHx?cBd!@zo@:,&IZ.ll-8*A6.73bTȏ#`Em_.?3BgE~<^blc'dZ@ s7 iIIX5 ʪ!$yN1Mr>YGv%{ɟH9)7 iHJu7V9CA+~S||Hyӟ-'$q2xҙfqty ʺ"R_ c@ci%<7+E~<>b$ %tY.Yi1TWY]\jx$Gho@,ZHmʻ*觬4X1TI't'tY..i PZǬk_M >QV}vgh~`-B$tY.]Dzz]+z C§ @X-=^xPa{GJH}Jpcm|+hl-8*|藬4S|X!{W#bg@ftK{g# 1hn09R5G@hXqtg;#mt ͊ڜe_ t?bO}Iz]cc͠P%NHp;Uh^>P/yldד'>XG~d$#X }7 inXVlh)gE?O&y]:,Vv 0Zͺ|\=fJϳxґfHЏY̭syV@ 1T~yAP%=V|CEys˱n Bk 1TI{6o@:,ޚ Xx!7.⪨hⱮ9zbp~yEJz4j"GL{D@$*~f HG҅~4˪Zc}K~)1TWhwmS/뼶xa ]* Uf$#hYٿ=7 ioHѬZ/ džBۯvW6OΚ Y: &4w{& HG~_+mV ޯhll-61Th9~AYU^`ZzF +{F47+[x5+y7{*7\ZT-]A_^fMcDb/>P޹!@NGpdqc!tY@iV5:B;5~oiePkY@mc,^XYe ւJ߳xҍf ҈Eߪܯ]EdYuPv< !*18OZW voηB [GD@=7 hnGUx5wCjݾkB;T*4~`aP%=f|G]+k<<n4 3}+ gMy;qVvy*4\7矐w5?VPߒo6&*V H7_uւ~Pq#l?/XӐ(1Txn=ncUe*pod6!-eoc+V ؅P gW~jn"Ϋ@^%=v"<~!&>F ̥S#tQHJk ~]wUf :?@]S^1T|N} 4g؉5kˈJ}M {]~yQZ~QZыXmGhtf#WowPYx P5}c)2EV172!@?ZRF6TPudqm5k~F <+hםfc5]? jlmf۪\OyC872?Ba4s*thm9C>+t)m>8XzyH9,dx2?^RFVTѦ+r?k};P*4tnbh jl;l*$:Hʱ@f,/Ct.dtj4>J*tRagqmK{w~5 yUq}5}߼w<%qc[7盫v6晥}CU ?Q&o7h11ҟ/XAϻMAl"g -du?' s4WH #ג"S>,=lmadCk[z8Y7қfp[g/?T h|Z5e1[PߒXzX3ڝ{1T:.?7YeZk3>,Glyi޼^91TioxEXI弟][GcQRW_7JWMiyT !*ϺJil ~RUË~5^/*jKf'=l@И*~" Ho( 5p1]U]Z6dYyW?L }Entxjz6ݢMXG>Ҿ&*{!xiSmՀR(L꽗|!B4?$D G]w9`ȾLJE!e2nq1TH#dϺ4־MygPQ#bRx^?g2wCA9~[.*>؊(-tB ཇ @z( >#$ ZJD 6[tIwhbWE,kZ}T<ߏcPCP;ҏvVÏ]!’uuvj}KI3l#(vnPt^G @z(' VO!w/\LX+Uwiu"Wb[KiFi},1;cil+MW_EN~Z0>R:w1x)w{wFF yK4 Nߓ#V1XFEt1d&@l.:"t>DEV iVԅ kջ.ڼُv:af?)[s_#*o<>n&_V}m$ sǞlW _eR :Che0/j޹o@ާޫ=̫}(j>pGhg[Qj+ :lU}‹J|xzC}>[U__3Ix i HIT%/%"rV&~ @z(JnOvQY7[T0x,#]Qq{ `*1TH.o7 UC_#8!t19Jb@ i&Qc_qVӐkXI(m8좺P^{QÈJW,Z`/.kCY`mT弩;*@zCO0A@A4CHwS-^XGzK0w"-0e?Za>\KA @j)v :3t[HX%rr;M!͋";/^uMCCP/ޚVyJK(@e%ꂍ{1q4M' & ́?5kT|-}U‹L;LQ|&yr͠nYw br> 1> @(.4tՆu]XUZP| }n'* X#@&"9,b|V4 |`ϮN7HVBOKdEm{ h O.}a֗ ?  i|D3gru3똚1O<.{APК_fS<@mS^Y<#}^yGKvC CєWz?T72YZ~kYhb/mwK~FlX۳Eoɗ<>i Vݹ@cKVK U.c<֎vp (cYY/]g[% X蹉( :J8#3uk`.kп2dp@VgZB[VH Um]!91 XJZp1Tif4O!VpTԶj?e s:<^Ld]ѭ0b,V.lV y.y1=_ x l;kx킏BD5Zp<1Ti>v;ȟM ҟO*\\ =/?2 [?״tbJ9U'+D;vGֱ(k^{ @kA;W%'W}W pGvg#ThxVgy,]t]S^Vz.ΕK~|^@GD #ƼUBF|\VL*x ~f0_ +GKTŰχJOK!I}6y΢.'f񿴼xoK}6FfT JgrEM܅8WN-~Ͼш.-|܄M U?jKmlR%Fb ɋUpBsA)w(owɛuMyxQ=nK^Q?!۷>:w=ur 31vbpyyy8\ss=(6֨\:S<)8>9>blR%pOBAtEjqLOsP_4~E_J邼]?6W ħy_R\; ƶ(C%{s{@~plNk âNUҏt [ 5C+nE &Z&J?䅂"U! ŸqNji 1`oAFs!@t9R*;KT%}Z gX4v{Ƽ-gxΜ^ʱ{B:0S՝D4E Z Cb~=c@ o*ue'`,Dt҉Fyeq'vtмx/}7^䊧Vy0E_| O\99@ГgbE/dWMyu^ ֎gvspvfs9s9$f'XK79%]Rc)@@K%P~l y-cv(`O1*ؔSO1.0\M6n#?KYbAf v? ք˳88pNUF>L Hy34?rה5X3kοN. ڢV3@EnT x @:ҸB]  [Ua*On]х]̙C=xOl?lkm9eRc"((@McoB~l|> o$Wm !-^n4.dH_$/28[b<lk\lA3g=piE{W*a4i/\Gd\ ϥ}.g6>kCX`~ԯӶ7:/<Bb<M5}*MŏNBIx yb^! AiP%tW#.yw9#P%=i߫$>y}b#59ZL>zduS6V,Y2>{赿uY{.E Z{ʺUU<7~tL[7#^@d; @и["!liRhuVW~HWf.1TI{INE^/ޞ45f`7gUTg f,/сF4W{.Ec4>SYGqo0⟉7HgR (o^7ZjT]4CNVaź^ZkJzHx,mʋ[\k֟T,Q^UӐ+s~w1oWyޜJץhg+%F"WUӘǡے I,B׏ !@;@LfB t;pPݐ11T #,ˈJzCfxuYnP:.ƶ{n !X}~߄К[Y/b-Gw*AН$cP x b$x^ wx 8E_@2BxDRR م-)1T ?H?EɦމИNv?(,x+x>_D.crڮG?)~O!!=w' 8殓8"V3Kzs>̳lY=E=$3H^޺,T|@hR5H;| t:Uis ݙZ3\&[2/8S|7~#cHt?q'~a7BHG.G~ZU0b8"""'dx hyG[S[-s߈lsB&T9}X} IWqP3˪'&^?"Co47\umňww˪zז!1Tq4u8X{a*ǯ ^H"*@!FK{< YؑRh|ym^d]{8Wy#wK>% m9uպAuBcRށ ;?b&*cmN RxOO3ۚџϏYYTwN 3>_`-}+Ӌ&^\ۤ) s.~W--5:GoI%[gжj [ } 61McxNGqlT$G?ӎ+Gw*?J nmc^yMC[c쫮ϵַ-YEM߽\絙 ʣ/vk;lU(B b!φ f2 8_LƗ"~|XZ\j48.x> m80#lOs |\Ov{Ti^)<4Y!1va=Ýֈ-yQ8+P%=֤0fVU]dTs+N>ſjǎڦN*9tz28VeJ;CżgGNPQ۔oq|B h Z!@CwNb|Q*OAM%ўc啬  {E}{^muf$B B* (Лlx<ǓW|ƶ~GCGzJ/}{ޫ!Ϳ7^44sDBHwV /9ϟ\ܳyQ\I y<.ޛ\* `ƶdKW!IK =/!%G9{H{W3{wgJl͙ٙ3[o7W=ƖugnL\ 6o:`p}$kWe bf*@ d2p4<9E9UD ]p&B"W@D^VS7n{e,g,S%g'l8 bZ0)3 9\+-кe zWy5>p%! e d` Ma76 0d z7y[|x)ة7H+hُv}Mll5+߬`7,qwTPN>Yp `;VA{ts&/-J& "?ݼ@@v@F@Xc(3q=4tHKGO0Ur\E ݷY5*}gIyG<ڀ+_Faٓ7nsF CQ j&@l0VoW1(d ᚯRyDvNE"9U;u -9'Z:{] !sb?eʸs=ƁI@ᩑ" ~ (=}d$&Te = p?q*<МsMAmmm(s`"N|a}{S95N'W%ӎ#'ht:!TuG-GJNԯB>8{~θ!\wvx>Xpo9EwܩD/oj|(Y\ckґY-;~|}qwTwk#n!L Ё]5`Xbm#dAP?] LlI?AПsh‚CuV?{& ??U g2{  ,#q5p@Xc,j5 ^0d?iĭyDP`l`>£24֗$1,"sv׽C=n7 N_MbR`4œ bSJyqq8N5(h6<є"t:n0 ?S)&a,owzqaUwSHaeXv?L2kN[w psIa`U3wzWmNr̭6b8d8[@&@JU9 X[9޲gzK\{kXxQbCj8gU܋Ó/T̓LC_-L PT^[ /{*Gr umBhʭl8L++(O [q/"o@՘K-:ީ &13`jTՏ 0D}>HSlH\odc usQcs".[N79{zp-Ɉzd|IU ܳ@ ۘ򜀹[d6_$ho ܄j#ymeAHS+GWT 0lb > ;Bu{^rboYc|c"*'G 8 ӝ_  aPa}D2l("gߨyHyIEwX2jUPcf۰iEG!wnu!1pKUENc&1p"6t.{ ou_[T~x8a>JPm@@[K5(| {o\/D@e,r\ڡ;Ŷ21,Ց2YϨy]lV@tޗd> @̽8*N}KNhluܒOTEwNc@#{W$< !-9?. Qt "1:^zĉfJUh7ws)0&fJ &﷒Hpw3_>qw Vl( ?{Lg X"}8wRz[6&.B0 5%>PvoU6$#NJ@0&9+N~zȋC VJ]SKH Y }  WMQ?'gY S?~gO՘C"1Q/f;M6SC7f Iq1ND39ߝ*!whc @/:b|7/v dwAWkX;q^_b^vؤfT`掼8D ܏wҟz'+!&b}SiEϹ臇ü`; $#R @"洜~a٩nn_Wr[O$1DoAAC)h6(1d/a>va[KgsdgOQnoUT ʔg߿l٧v&EGɭ-p^޸CƲD~W?+H&agP 0کӈ]sn=%%ԾD6oE #'ƾD@;}+hⳢO0Jy}8<[$(ィfը瓳\UϏ;sƟ.8Q_8qIFD{Fd>Eף`'@?S9}Lٷ[?jL{T(7FX5A!6 8&c/D)Nrx93tNHL֐3|K┚ OI ;]x9Wm!qiH_ؾgi|n +`{-{ YeDZ`3(\$"#?@GUsNYfN@H8d+8gq*В[DF7ho@Ш4Sp21l\:=7@@45*jL!:@hؑϜ]9v"`QKX5U/cY0uƟ WxK"`A܇%֮KV}?x!1aC = '<t6 QT'>) i˜X1# x*!KiU3@O$(#{=Y1q^942iSAɭ/ko}_7 hT[Kg} D٢_ Y k bW3;&"}LK?tM8sO^(<_i@?{a/[?*jD!W=n x>M)L9OظX&s঑(l/<>WP,GT]7Y}SCՑD=sfrn̉Ԧe {k8eI5<#+G7 hT~Ӫ9Yx~L$g lj ?&ѡbGlQQ9peϾ1!Bl;F L>0~@VLFqHp8כ(~#~Q@= ؞۾L&m&q33]SIEYſPZѽ̡c(}pH\T8gfzYKX5$NUMx{{hn\ކ@b~q8ma# 7 h&/n+a " e i5nߤrL걌 _I8 k>3,i#P^>t{a771~N(E $&ol@ҥVgy8Aɬ-Eſp&Bք7aeE?`Wt<Vj0Hp@us T :9;1=]/%A7 h4[Yev c4jܒxadS[ >]?xs '= tM||v \WvEV#$bAbz9p c 1?4wW(*ƌ'= o~9 J/2>4f,ʊ!j)G"nq9gpwKg~K-T(ñC{&(X5;0#tַ@_ p`@&7A_ @^b}+/. $֭3/蛒Ɵ8} 'Xױ3SEb,K迷 f ੆stw1}={4.lKN, '٧C:U3DH2WCDup*]p=yk3OtZ {B|g=T7 h0*Z2 ~Vl5vlo[Kg. Q ʫ]j[ a_~8_ XosCtMtNz$V5,c~.d 9d/ٱ;p$eqo'|)xĒXnu,ҹ,ux,g%et&8-spka[$dDx]s0,o]Xܑ!xE(]AӁ*4(?2EEعy>Ȕ׷* Q@ ^o5vn^`^ 0ʃ@>ʫFUW~K5 ܞg_7y~ow4119db${&X?+XBQ0,*K;,s\˂}{u?РI]S)%{xk )ضU~4$MUx#i ގؚkxWNC?%kwho@А@@dd 2  2FRho@0 &W-1@ xQi<]0[#efĿ >kJrynID 5Ћ P9:T >vX@Se x DSm`$ĄY'b~$s4oD[&/oycƐ[2~Ic,M#LZ<ۺ ׆5% hu퇎M2Yp(*d Ufj`V/qǓD'!ktw<47`v<%gԞ?߫bO}2qWd d@@HL @ 2 ` kd E&A_`VE1Pw2, ,Eb~v:EO~MT l$ &a&XoH6)~_2bĎCg&/wL4c&x/A|ߞ< R0ATs +@>t7a7MI@\WCsGO9te725ĿpSM Lpx.6D]jyp^@R eIdz!j>5`Xi]ӘF`Ϊ,y>W=ުހ:k͋L4EHM}'f@}_|h'EcG{OC Lpé]k -7mfOɤ ޣȅƜci`6NCΑD}Ddz |⭽pU;>94t.7@Q0¾7M8;OTsNl-(% @ep+x/\Lۻ)/bI;U`yǔ= g0_ 8 5[REA~r3.;}Sw#wP^K}'>iuk܋ Ȟn,WxܣVN~]Bl CϑD=OGVC9]ՍDz />o xd($ @:cT7}[5U ;[\YƔ 14򁟨}500Jxv qJo,8 j9~I?ֱ>G7 <7U|tW Ɯ$"1rЕvJ<:z "~$9o)rN 7@5: U3DVUG~Y@&iv^V B`=.yJDWK`e_Qn/5]@w,I 4+L)GG@bh?+t@pd?H}(f+XOx;ĝB:`J@2>xĐCxR k_xEt$ c笋"'[ 7T5JhoT*ŇWj8l 8tV2 ˚{{_V55{NxQE*pD`:\OH*LDL{8+_N[N׺;6N^_=3ʚ}To\G#BٳJiV:olґHN1 k!۷~EidhBt%^:ݓ]::Xxqvnw.[4;EY&mI;Pa{ysqGµkYl9@ȹ~Kϧ7[D 'Vt?SG1v{m[`" CmqLQ * 6K\ YdW5ֳ~qU../HK)Z=D=7@ |&hg$MP1>}~б|݅CwNV:Vk8;&;d>-珷w[&]&]"~TS16Mmy Qt?WG1֣DN:3{,"+h ֟bQ)&SJg% "$^V=[aC2U\Q@͠ cnu @M6&jl9 }&E ෿[s EDxq2uVtcBw`=S =E"C *86Q%e\uEu$ c;m;ޟNt e7Uo%Sck$Bb20xZɮ.Li^2xkUݸz'o882B+`L_V+Lo?YRGUcu[SỾXig2X"㱇V%*KЭ@- {0Ǟ cqd"r]X_:mȬHkҰO\#8vO,fd~Dw_#Y8vg[u_pXj~sݶwl'>@j a l@A?TFГ̌E!ċʥ'Q`Tv6d<@Aj ,Z0Ǿ1+޵e!J:6zHZ^ CG'[}XSc!KHiOvKG7vd{a ¼k9 f=10'팀[ʆ9|W Dj}A<1ӂaڣ|wdh+{|Eaf 4 b^r[uq:`0n}g5wYُg>t_TdkqCsΫ!KHŰA()+Hַs"fSck?p{(~$DD0:1Ѿ="L!ċSA<͕0UfZߜ 6O}^c7sͱGYx%`q`|Hw ۉ8Y: V*-gycA=<Wۺ Ǜ]ǛF&jWXG@H #:x:v?XBLYj Qt?c3А&&v:~Iho,3˶~>-CN (I xZ j4ZʗwГXk+Fz!):xFZ4#oDp,Ota~x=`30QڮaKgLFxv?8)(SОYJ7i@'Nu/@\ dK?`I +c[/P\=cf~3Ԟ;5CwLD .=1_sh$z$  Q"47uCcۢoNM"URJD{`e$2 m>lN?% +X/ѣb]_bOZ<Ž't`S8gFu: Dhy ]p?՘ݟψޛ )\˵luon%v?9Lg|^);w48HG %% B+n(b7pm^;cl1ܑof4Co{79``,邓t޽-@_D8_iT!ۑ[n EZ [q._xj.0D# ǯLV6SolA?c=0]L䋕Ln/~ DC18O:nQo D$9O_Xb9 Fn~;u$gIm,+HJ:0+@$HcG𢽧pH?5C!*/V;7΢"E{HGe rܜj#oK fݶ&^sRaL䋕1A 6&[1v@x-ӯͮ–qـ 9_ ݭE{vigPa/y<9Ś "'bʈXbV"{9h̗2dO~'$Ue-nS$鑎HdHUlClZ0R0}]c?xid O$_^/S\ pǺ/vO H)10 0$ǃ96/R]ۗ.N@]cvJu G@F|!qui&ڻڝhSH g^U]ģo0s9<H}??Ef%i=2@`- 5t䋕Y 6n5 1Խt4NWf/ Q4ݿ~赜ύ[0x6" ZPc Ɋw^.%clfftWhhl{0DNH>>ѡDsGwH6@#0x*m[٬Ǭ8' `x!bedAb_0:AEX}2ԖUgH Wk:|ќ#  N=u׃ۍH{co3GZHpuwQt?{Ϫoz_118uHD{yu+Sرnr ]3ʀv2hV5xE| { 0<|2zfbc'dacQ"}ėMApdqpȳb|Qw`_9't|XfBd83~yMcv?`Ȣ q1!0DNH>d6}?Ba| ` l@X@f7Poϸcs} A+cIm&HRЀ◌%?C'<-'BH KXk6[\M! pU]9dg٧{Dl4~qi2&<5Q@9NU拈Hd"@OTWkXſVW㝄[ ͩ6@& mAT;w(cCC|]{,r4Pt[ 1&GOÃX8qo.<#O*C&!{>U D[wA9nGR~sd;T0ho!F? co)Nq)+._$| |?S D8Eex{LiGlݡ{<[ Ru~O.^0nܲ꺱?T׏W{MBOi܋sN(wnz> *D?zlHsD-O!gpA">/bw%U7,d$}۶9: t ]_LAĿ PQ9ʨvDu&bx#MmCSrC1)O3Dx6f`T{ Cࠅg3BxN@kg}!D<*?[J485!+O+R3J: @w G*7{ f96:y*7 -"z"o])Ŀp - @42t/YF `iӆb^ ~ѱFRXUu0c={yqk{0Dv?b~4dmѧSre/G:T[F+D$saW I9H *7)n*ho1H_piVFm+cn q;Jndd 1LX]]Kqnt⊽0=pth&Ox4 ³d"Q`9es.$>uoyvp/9ƃ9>#;\BJw[2#/Bhl}0Dt$c[s+ *ϊ7HdۺY2lU['t٪ l+E ߋֵIhx R~0G%n95?"SaNQedعw0Dн~Nw{[:MGKߞɀ ׶zEQ-t2x݀?=ҎsՅd ݫ~M9'_# D.}>K[mesN |zcvڊ9/o+e\{zC0MI$0MH apӍE?R"w9Nbmyύ?u<~k?~nnioi۟ 0D c|$' %8_Õ7k9]x`C9ԟ.Nf2Hn$s{HΥM[S-!~hoH'/xֲOXo{?|o*@Z oQ(cdx} MGUv uދر?&@U}Z9֚=. C?"9fĽ眂~btܕްɀr^  0gI[);\$y?7/便&;A*?g=ضn&x[gUuY7ΰnCkb)L6A:'D(%ñP[;@Jap$)L)ܭb%DykuDž(N'ADDrbm`"dW#bpLA쿻j]!./)D d:~m#ۼvp*AnGJ2x5%Y&m_H5THZ:+el-4gH0Qas^tfջ.20X?XM7cM=Ue8\^9:V?( ]n`IoXt#@l co~~i0&;.p; W96kƯtoq8yfD}*>ggr2m]g_ ΡLJp";e/ fDDt ʦ 84^{+1n~ `Y0⍀=FЙ4NW 0S.t=B#c kG?22ҙ]5IĕVχFݙZr{VɩİaT֏6j!w7?t:{gB%q\3ZtS{go}7P)42 '_7N1["10dQg׆ONFWƄ2D T$ca?6CN(6p7"2Bv~|y.2$ oT+ܜ4L݈L?&1dL^>8o%9L$q =W\q"2@r2g|аkʉ5iz~g#Qdډ+o.5pk9uK{OAgHǜM(^U{AVaɚ GҶ.HΓa?H+MCv|TűDp("Q?\M-EsП=/o+y1 * 2.fX }? 5S G12&@۪ƽ~s8QW% t8vw<.KAsapk\SDCCrr͘~;蒶G,z3#{(z#_iGt! 82z3xaY' o߶ , mcnY_^8(&@ mV6$E ^5fd@D#c=F1IQom8cFž}S&"i Oց١ oCrb%zS %ݪ7:٦E ;>1r+h}ɣϥggS[E ,# Zg E #o"gmkٌe[#l {@T3jS_os0g} eȚ/`dW/a]$zE=Ȣ~6B2ޫ{@QZZxSyq;~`ѱ` _8=ݗO_[ Bz&?)Bu>t8^Id|/{ q+HjW02?PRo' Ŀ_o֣Wθpk Cp@ d$@O0MQF@mQuD @Fou92􅴏ZÜ ߊ-[r_O>G>nz#mZ_ǣ#1C2HcR.Pghct0D$$cFj,N[S ޡSӘOs$[x o{5Q`il ޲9'߾f(/,o/7 ^^9es@ a}a LE,Vdk`#9 5/ ?:N[@kw'CwȪ?K2؜'90D KBN'$DjUon}FS[Tn Hʘ" 0`ˀ!~' V͙(O͌G~ \&o~?߼nB$ k1;&"c$,RQ9 G!fe6mKG(?ZrOiNֵ.M D|,R(D*icM5M Ax|F:܋|^$Kׂ3Cc7 0D$ceUds{To!!ZW4]Ƌ&fůPL~`F&Qu-,7f=tEoy C  1(W}j KXPA/c< t/P_~VeOVdL<9 F}SKԞ(O{jfMmB%aWǨ[8u4,bHHa,x;`)HaD*9{0D }dM9&Ә<0 mdj&@E(n-B~p*rX9~uRD }!o5*}z:s X0}xd8gfJ=.?⿱5sc(@ck5-5ON$yEh.Q"ї=r߀f~^X{̶ʸa8mg!1"R  2&dA2X@@F d@K( `$_nX "jĞO=?bʫƮ4@jYX۶چ׼cdÏ`cko®!7@cK3$ 6 !#8r|"Ѐ+ lOH' =%7uAl7"#wN6d?3}`,^ g.&j+ ~Vm23HuBye@w_9&bdz̆iD1DD_r&퍚 {|wBu %fY,7eD+~Veؿ7*D R Up&~81`8lX@T*HtAO(+o{diBP?\X6y4V pjW t9l{u:c; [K9,TڱWk0$ 0 (Ud$an{be1Bu gȰe\rؕIjWT 9,{u VR ݱ{u> kLlD"h@w# dL3/+AcnmKt?m~j@w<[uz)EdԌ@w_9&Q5?A;T* tK)"66t_A™2laY/fg2dۥ4d[;yDPqݪz8"0@w, }Dv1 jAGǽHDqЂZEW "Q%2&A` ^.d ,oTaqnDPy:E|z" (؇k;cb6@w7Db>/Iڂ:6m. (@DCɗ.)ʢ,MKY3@h06T_ "Dqݺż?;}x>S5&: }2f5t~C6ҽfA \# 8g?Skj @}DGɘ+LįߴT   F>r wmA DQEef0elX2ǚp  >IL[DuY؂ZW{ TdLUs' ٸ'2  "/5/A "m'^&>=^@闕-%CIYh-i8AA]޻T]|+tƍ !fE-&^[ZdB_(c̛h" +~݆8 L"   6ݸ{wr<kwv6ﮣ:-xŎ`~Pmga[M6l#یmkkkkk$ ZTX=oW׮_eK&AAADE3dyu g7ύ_(~ե+LggK(`f6˴Uot#1|ϖSrN፳fTAA)Y$g^:ebKC6|~OʴUot#1|2&ů)]i5 @AAѠRMM7^}i|5E+f]_25Egg(^m,nlL{ZeF8m_,pL'(;j|  -m1^nj5]SK!We> [^LGbeL gi4W[n5 2  "<)Âx!(y44T8Y3;eڈׄ׆׈׊,GǓhr, 'Z 3   ))ÇvRoO|_Uyzou 5&5uU}=2T񻱝lkیmk__Pm&tPkOA.P4e\f)3%   D߱ d9ſo89Ӹaa77l`ٽk|=|?v~ c-n,^J&3!   "WT7WߗtٰzI/Ϩٓ6dA13uE3D`Y,f&dAA^dngw2{ u.H!mVݻ=w߯@&@(0(| 73 L  ]>GL'O{ce MAd֙3MB"w2҅3Dy/GAAA裫Mj?bO{cepALi ,LnĿ c,u_:fp @FAAAGWW qzDfQD:&Um  V$ X4Shl^BAAACNP^\Hf?&]a v&4' tǷLeLIŭ_<[/s :;~u,I7 `)_-8.~U [F&AAA'<@nܰvd"v$[;ھ "iw0FJ7>knS[G _dcJgȘMyÀZMM&n4dAAD1V/]]ۮX_B8p /n.)0|vvmw50W А4 nji l ?(`;Lx[_ݟ~~߮__iEsWq{g@Ŗ}/t]bL-%hrH92eԼ汀 OoJX5gsOɵ7x(    ei\N2aYrv1/ EKd#.Y-i yf?lS44 Z V,xn?*? ʕ=rw37)e3ۊ' S}@vڻtuCXW4X>1zYnl,WJN~ ?sl @AA!P\\,-e=#kktX2b byn&m()Yi Wtbv4;6wm=ROVVVNᏀ~&m ][4Խk߼‰vyv8/Qhwgyq9s&>$dAADHHg,]I//]8d&mƶ5|,'t[X`LNwj(VΎ8fHYW7K7l^g.N>)}L*{cՒ\4RW@dLgYͷkO~& ׮_rPL  A "1GjیmW)KdGP]tqC $^Y~xm>)㫻vz[&x<. O[ ﰩ?/[0omk蟖؀A&oqzMX<%lXD/sDGL=(01n4ədAAD8g0;ˊU9/Yr< m޽;r]veg ߳=\9{Bb{EĄ*ScOtʤq{zՒwx7ot v#, `V^W[n7    x^A_X| _nНg._HFWOHHƖ-[ Q@wy;pp9߽f;MzVBNoX%+7Z5 4Xc״`,Q+%?0\:+gOH&AAAH7W?&%E,k{4 gZ|aEs8uBn}_+_orq.L-g=)epKV|zU9r;å\H$쬤HX:YfT0c&6  jS U K/e 0 酨 p]wkZsÒ9tYQ_]ohmo4]QiGɘL1eXXW4X>sI    pi>u5\@ )+˘zbf{w q) u5e+Ļk6I)2PbW?nkF֢٧Kr݆&ҟu gq3ˆXL^2  "|FO= ׿`N|f?ka҅3W.)22tǣ(7GoZ3_}';wv.;;;`,8;xa% q}fXw:l#to. 0.~eL`zޔNAd)AAAd*Q5tK`r&u% ?.bW}YdAAA A$Q2oX-&i$\0h2\Sj\NAAALI sp|apu(F翢(2WQ4Xk % Cm~.FSbGRַο(3_e(JU0s~Z%p?WGڲ1OwǍW5Y'};玝-a@#Ey&EQLVƪLUʂ ;;Y\Sp G5 +ۗi{e]efQ T冢(DT*2IH^WwH\ aJP:ږ_}ۗ;y6]ef0ƿEQf*7EQޣ.i w5}9vF]³J-:[pߍ-G)JW(J=rRQeYu7QoO0kwYc6N)JW(JZ.|TE)L(EJ@`X7wY$6w*Aq&EHQJ*eCEQR- (_ i ΦcK4 D'>+?}V-HQJ*NJT#eT/So@arB( -ʄ c֍/;O?EQB0z5 0<1yY" ^ ^6U2W9ۼp-CpoC3>*P(3~ײ}+cVQH WbcDQ!FHELdK&s\;nTn"*Dm{me0  EQP^;<c:ј 8XH8(I*JSdUӅ#kY^?|U~7gخŝE$ o:-I2UBρ@<59MZ*)c6esucNmo&=&EQ/0Y:DAxhl;:)UvĒVeUQI:LR -%mZ=s@QE-&zDA;mΉlȆ߆6z<)EJ*&rV~FbYx˳En>udAVz(T_`dp4~[l( "eNDnUTQ 9? ]MSEi,7&jѾJ4Gb1О%J( b mLTǜc !h4 J,<=ȨcD.(I'S%rHQ  =Ĺ\,p.,J(CFlb{".d)ߙWʳ9oI7 ]8AX*WFGUz<*z}ʒ|.-z'?q9.fӿ{xm_DǨ@(>IC:>J m;n-^GVk1)]$  S?_1( E}waD,R6c&;o'o))=2K8 x) 1D-@(Q;;Le$?PE> |ZS=.ǍKT I(ld{3OI@!X+t*R)vEWEɫd!3U4C&:@-lS8jj;mr @V%?_U)d#I趯s $|Ru#1ydL_|Ȝ,Пj@豬(>L:t*$@׀\^/lߌ (J&Bv_e~f\KkHF?ibQ耑Mc= 9y1yc'g-DpZdeͭL_ D.|6IIN?&7'ȣ$kYll:EI|J@%a13@-bG7[`W4Q1>" E)4;}͗R l~2-9&Px?y`hrsv{մEcUSJA$՗6 ϭHQU;G꧅~3dIj"][ 낢䛳:~& TNQpyP|]|ؑ@I@b-_̲n?EQ`mz81_!g'4{D)k  6~c*N"}% 4DpNߎzuؐ)MgJQ Ȳ!E)49t+I 2: pX9y'rzy* hXAn6ʺ)/2:?:zBQES99/0D@jK+A«7 -“R'E"33e'D6 )7e{"N="snYAm(d,8BSlr@Wf_`("~[de<1DMTXб|$༭^$<(Ӊ?O2}%=[y Z9NTg\@(+4-ݫNUKX01R`^s0DNѴPG«-"a*0(7W^$YC=!S>6v7} G5P5JFR^v2F|lЇp튒R?BR"Ki@z[@Wo<7$ME(^xwdQBLɱT~7Gr3{ID \l;m}Pg^3 -08 (Qc!Y w(ЊJ57 OȎY"^2]M 99AvCfw2-&b'܌" ":UCB9BqEIKِGqN7 SI9NY|b5cҗ曤  ]w-veQ"BL5ƽsԃ(Շzj B`@T߄// w?|(_ڊ|}F?gSI03X1V6ala w8D86>hDe&Pgαϑpʼ58#K3?؀ Ț %cȏ_ȋ OA +Q!嵢d%ߥL߸qvt=;O5e8Pw*^q/F|^zn΀Rp s|3WCwК/ER(@h(Edu@Sg 0`Aw_9:_@,?tgaLؘO: "2*kgE~Ⱦ6gsǶt's}BDO]9bX4/R)rvI101Pۄ+F5շE6A3px( c %?Y:Oa@Cn~8])=2KF`3e'_24imy#Z+d(qC*rmT~$O;o obJ)h{l,;;.Ͻ&ײ-׉TJ|zv8`1^sG5UKd3)p".l^QQ1xypF~T:7tR^RF?5"Gwmvt+3c`&9URb`tȿ_,ȵ۝l3;R&/,!o/ Kd>"(yy~Wr3Xvd'VG]\ѷo}%A[BWvo~+ ? )!")5FHQ+%"PY֙<`;ml%":ploWd)uc# ʟ#|=Hg)jӽ z"BK Y'y/u1cX.&c͝o;n 1I YVHn?Q<ۼvy dD"s妢Ln.'ֵ4^|Jm!T97tS]8e+HgZzr@OԉRpTXNھʾg:m $^cks@ޏ]HuD PP oGQr1҆ږ878@Η)8r0Y½q%^{2 ſU+R!< }ptY;V۫}~qAyKYۇ@2Ncs 7dygad'ʽK#ϽY2O1}@o"3Ojs2dp0G7@[őuO- '@F A| ṻT'{ JeG)3 R/Ƚɽ7=C/jg̑ycd;nZ*JHؓv@}oK9*0(By[YĽ |DDF:rY'RdێuSsoIxpZ}xmW-iC[0î:ԯٳ#3K;`ctwmb$=D/ua|;.o]g]+="!ar ]7w2Nzך819~Hq"XqIt%*8)/ߵyH7hy>!sVewGL]y?!D*pߓ܎ɲ^ {l$x$6>Q~N iC}@_'ñ1cgƼR8W:p;pj/| ;d1QPrMQָ <&rÓ%?2rod vy¾uܘvHp)ddΔ:t)J12 g d.K9Q\@yMCovjd5?O0WgwLgt 808O8/lI: $9v Chv 9vGP}_$l(1Ʈc׺f(DGwˠ3%{o9pqBy=do]cWFy?~X[8B=7ʷ8Mڗ6GZg֘_lơ3cLӮD$H>6}l-(d+rȜY!s՗/RȨdYN'@F28P:֡dEߛNvlЀ5$BZ_@2 ?zpbgx;]ZKԐ wsH0(?,e;^˽Ĩ28['d)K{"Urdd3cvv]n 6I.a-1m= 6Ƙdڟ5YW#іm1!;[6wƵ܃vޑv,ctÃ!|Џ _jޝ1bƖ5`ͷº')d!ªȞ9'NSEȈ GdN}FpזOfܵV哢lx&89 /YK 2#F4hƄ%_1:Wi& s'?3 fspջ+U(NFG0cD}E:@ybDk"Ͽf|M#=γ$XS=vv.L`|1٨[NcwUc)Ra(%>٣Wo5b p0ws8|ǥ7ַ|m{uC-8BEJ MpZ:kWr0& Cva|i+L`Ԟ(s T(JFV0;?Y~~SbDy K?Җ[d޷$8U ֍ ~,|]ddKRW4ȖmQ BV59VWG6k͘O QqHC(zDtرtȸzV-^7ER9{1cao]C:B EWRo "d 89DO]RZ<$7 NSbѪ T{oى{ĹMXQR!.')sY>iH:rײ b=Sdqrudz,8dzmLa)p\dKEsdsNp(\$\ْW Crwd3zJY@.G$ߕb}n Lu+>)}1ȗ&zA Ra8=@h(3LDž=lEZ,wr*A<'-KFsns_EɾwV$$ᑛ̢Dn @B@2 =vX'-s,s/w+Z/3mR?ޗqb+;:siΏ'㕚aԒGA%KsΞ{JUA"Ghp澧yAPdxyHor/?#|eq=cʔH zq2Ƞ H;@-&avsѭi"_Y w^L݃7^5a&3ݖ'sĉsL2/ש PB `{bu_ԩh㿳כ͇;L~!{0]gA\ u`2SP.qpPzM;1'0}i җױ/cKҿ?Iľq?ӗzsߊ2Ik G4>pPG"8poJ9-\/_bB&Sd=xU;!oR jL@2 H}TRdz$"1|!Tc1__@L7ZZv2(K-v`۲+-.o 9UNsSOvhSc x[p&9BKEQJVGa'39=j ]O%׷$~(w;Q`I`'י$<Su& :5@P L6߶C5g&9r%FgI>so1Ζ_4y,a =a ʰ~k ͧ /. ur}3kgɽag+Yo0%i7CR.AcJ erLQj 5Qm>>~9 zw=l$7dmxic&XKt|u(刼?8< 18kXRudPn4{Yh>"w+S:v997aRNclotsͻ=Ei$%odkH{*~Awz?_~.?d=PŤt09VKzo ;PDy&ɒw7"/z@ B­7xĄ7Gy5@=OEZ2DR?9)h >])#s:ސHJ ŗN1 wʄUT8B1Vץq@Q:B;BEQN+_s:w$xߓ5O_d}]AN2@*VPblAS3]t^sqk5R4/7.W֐m/]@豣(J} y*@Ȳ`.aWߓ\ճ/X%gw_fRQ OtuIEI'FQMx(=ɤ;U8(Ao:G 7Eɿvd]QνυJ"qWuw\2|_طqvw:~x2ODo}+Zdb]΁([I7xPu(ި@\P@)H>$3ݾQ;8h{z_8@1zsF(xfs< 3+I[!IU'Rq2f^zs/>f r/ĵ PL 7*Tit:}Gr׊yxȠ_r-_X?#o2ރ<-[odpl=e@H7_ 3eB~P*F4'CO8w?'#j9fEQEdq -Hl8]H_paȠru_=Gy7p=@AdI_G}@&-tmYbSA$8" TpaM&iۏOhq֯*s]j+(JqT.F-81tnvI[|~KP(|յbeD.Ucvןy7r@! _~Pe#hb[Lc(NG. 7WpK1Gx9-{_ dREQ 㪛,N>%6B^ۼ~Mu%|'txZp6_wȺR;-\dp~bD ?@2I7A S:Th(f?;IׅkՊ-]ŸX%-$iv ^(J:\퐵"wǙ͆z{#rztL=19\VL.厁ml]uLY7z٥^鴱6O,?09n;7Pqp,Ɯ;Z7wjyJyU`K:EQbQdqlh"Q\n" w =ݾMԓqou, Yh]?= }5xc28L' _vSvn n1(J0߅ź((S*pc{K5wmʅˢw;㸞Bs\N祢(J}2uA׊$=lC&DG10do_obϽ8a%ɓ5j=\@e*5xc2:wNz~Pva 8'Bsp. J>&``&ʅ3u䲙o~ypf`)jeҊ*{(3]f bJ7ғ߽b"c`8^%Yږ_3]u >oم_z1CBF2ۼ.wd& D]@I( r,9kL wk-1(2C-u w :>~wmVcQx>qѬb/؁|b9CՠoFF@'v,Mgƥv5{8N> 娌*@I*2Vϳc:׽]s`.e$r^Fۭ=EQ\}u v˼Yqѩ|}'㼢菭6h7vlUqߋLwoHFj[VFt8GȺdew1"A/3c@s$[/<eO{qnNBUEQj"LVy^dp`]*1(#sz{Z! r6:Ζ?Hx=aC׷'i3{s&֯G^ ^d D9#i֍u/8$)o2p5BeEQ"|U]d, x`]Mt@&ʘKǹ~8Hd}+:s$~MZG=%5xd2:a}fo;raBkB, /cPŁ'? fB:2/tIR/BwEQB 3,ƞ\ o]:WoFʜCM½)GmZ1%k'ߋj0!xGt2:6>I ΠJ$C27ܝtD 7n?_t38讣_O~"L34_ AO;]]f{~_?U<ʜkGڟ ^6B?asӀ_&5ƦKTEP,&꥜ ʳ5M׹SZ%)^|P!bKd+LaK-9@)[# T>Y-Uca/:o>]YEeXB˜*o93uА};Z%vz6}߬khzʜ{$PkszfZ^m^֐nSqc~^D6u vcT)Q*hpDdw'sYhm"{67d1޵OU{v:\IELOZZU04VΈeAq7GQ9(FhQ#8QqTg:6KmZVfmEbwR_#rKwB5$seo8o6/ ޖEc6BⱣߙslI."Y'GvR*L!7&N:bΜ14Qv&go[KY8jIxRɶc}qydkOJ\{<,\ҝoNZCQ9(UI^97?wE~9Զl,.'!-LJ F/q'ݵya򥮝 X>;B nw{'W Z&,b=ϭ7‚ (L (c.1KV9ݷkH,wI[rk(])Z0!˹,;vu#:Wj[kE6iBpXƁLQRz~8 .>Zᩌ~?`۲B^eo28>{n/`/;rO%׋!e2̇gD28WGϊ G6N/f-c+YEn3~(l!-V;K)NFU{V.{܈[bnCp†^5H5R!dng[ߺogG<tC3cs\z@C_"9=ưOT 3 G&L-mc v3߉#g™]K ԥz,+3c~AN">(\;R_CߦT@qƸXJvyyD\=&C(΃ET)% fCNSJϟ8jen0Clg8q jB9EeƻP,ky4!/(3^:Bo9аg!2>ۼ?kOYQH۵y衣z<( nqOXP AA_Fy}]@?e1=%q: z+G18DX' rM$}D|F;|53 8V z=nXP9~Ld#*LtEO/5rY%(v p+j)tdt4Ȁmz3"8\| 2Te/U!RMTXy 3bȟ8J:ܓ7pmkȁ_r}Z@v.:9m^7o[1?d("FS m_2-I!@0$3QEBٰs7D6ҜUIy'P24aMd"'yWejLٌFV@g$X9sycI'Jͅ풆 E$lϿ9.%1бАj ^1@Lz"D' sכ!) _.MI@.T0Q~v̿\7۔,A?=EpcG6{e]!2Gp~ u4XT!bf}q4:LsZʔ.*M1PR(<.;ѓ;74lN۽c_SE,sI)M} ]=>nײ8Ho FI*MyWi;6P|_ٍ4u^bV;RF~~ߏ3%,c;i.Žz );?Ⱥ&qڦӟt/ jvGԓ̿ Hs?F;|뻳qNƇunuO3~Kg%i4i` pHdn~ -6Ȟ +Rҩ=!z3=v[4 'DH@YN=o%a.EW&VL0 '$}~9jsDs&ٜO_۩B1/ڌ|KFަ_(yupW|Yxmi ޡJvp4` iO$7'I"D)RqPRd&s<` #so<w[Ѻ2g3gt>RKW!;0$9jA ʽyϟ-u+>1ԶҾ7K?=bT8[` ,3+JC]fq,U*N\!/#gi)E)}h.(RTl^'|JpK4覽 }7Ty9Z~^LF&rd&+yNk"6_)@RF°[]9ITj 7sѫݱ\Dl39w?q[|+S3D=b(ܖ/l3%תJpn1ƈ.CVK/Ƽٕ/Mޗ`K!DA쓾gE]" .Q ~%BF!N-]{V k#{ޖY +"{%(J(G>%(qJo ʐ3H,I8(a@$WoᵍAdYF?ERY+ҏ)@ o|.7 J'r!ptaB~Q~jdn9's,-=zer0= cD k>Mю]趜 Zp"8r(q&bx7y>icT`.ƹa$g1BdEJ^(Tx_Fy= h}:ݟ%cXwRvpҫoI90h"M1wڟ'5uz"[b昢(H#"lP3",Geޣh*T(_Gqݻ^K=k`n-׵"?ϒFZht8BJ02>ƛOp3|zA yeH3t'wo,#zABCZ{䘄ڦ#@皅$r҆n0b22&c`P#\U' 9 <#cH_`uJ1Ex9@FQV_&j׏) |c@؏9IXށȁMf ;yN| pp}-Ĩh(E#DOk"O g6i! H'A;us Գqfni#1؄C?z*پѽ.t:Bݖ'ŀlzcĽO0˝8 hTȷ!-k@=>3I׽b~/^ ӛHdWx^v1694S0Ak9avDvHH{#S^2b'xtMH;8B;Z{(ߐo&r"F1xeU1]1s'ˊR+PcVd˂nlѧ #cRs.TkȚ11QH" a".m֝&sX + [9a ;d*!@ٌܷC2^c71߄*#KI$+AtOE잁rk͉jJ娀O~98LL2è;S~پU `?ᅑb]#lC1@govo9O)@y1ULI!^*WYJ[;e:Ư[h%9J{\qqށ{RE4&W*z F6⛑@1wpPE4+VGVNPޓ6+\Y929Ʈ䉣aM,eQ1p_Z*TQ@rTK, +-$% kӿ ~)1b#ꉬ>^t*'C9BJe1zTzq8vCTe'tt9(5smwK].e:>E>sURY*0?˿4~,Hϳ#XL0$3'$ZE߈9zxF2g?v0G~zmֱkG.=tbX@rbmx}dksm;Gfާ 25H7,|KdKt~'!pKLNO;1IGFiT7ϊlgOȒ;9k m'UqZ4Gy>CzRȺGΛ_yddݐk2udqPo|%ؕS!ȺPN^9, !B"=o;Ullݖj(/obTb; hߐX. ]-|+SKL 4k[ICë@@d"E `cDrdEBOFUo`+{̑~D_ʯ4h3weJt^ΘbQrj, ae&fw]Gx; ( ciaA$Q8B9SF0D婄OBo~-(G<> &*#T2 ?LqXPD6-Z9p%wyqȎ^%Sy7_B -%<p\Sޛ85_(c5ˑ 糳^zW;}@d)n/a 'l{~qZB]z*0ڦ7DHD9a]ja+;?{#ER~;nsq@gyRdtם1| !2 JF&Ƀ؉~rc~~C7ܟ:yU؄@ϓ}ȹō"3R9 >~0(WHc|qy$9~0őiA^sdPGHD$0.1v(|6I8{n›#B Ή\@"Em 3n_o;GG6%=+D,¿c|s/D6<;@Id b~~<1;$c'C>s,㳐a/ob~ =suagrDUƸnK.898֓"#/]fG /b9BOJ Ę'7? 2aMk <dztYvk(Nd4ȦqHZ& Żо&{Ȅ?׊_@>*`(鯾a(bDpYg.撖D9o ]CxWȳsIL{4bv6=ΏEU?~ovd|`۲H 'ttO&bL!R;Uo={2$l]$*+CeG_E%Sd&J*715h70wn7PҰ+O nHLEi._C֚R$ct,3V]! Ęȃ;D?Or.XX߰ {/7K9uv@| ?mCrcfևFyw=CFR[kRd0$uG"v7<Y?q2\Dؤ1"s̊l_B>OWun6E6 @""<]VB/L/t=Vܝ yc]4gDvQ HI!߆ wxy|l~#iv`@jGs}nV YbCZ |KTBMxhkihWœ5(HSAh[vGjH8ֽr?- .I -@pNH,rF#v8 rSp%!$3pg'(RL',p*غ+d,] =81ѺJܡ=tל7 ar֐(G)D06 vMa釕|kθûH`-aN#2'Lt:|QpȖǭ~̮:yR0s8Wq}cκMrޕh2:dCPPA X$k粃DR;#Ig53d+ٺ{ h Dw~] f;P$i%އO+3*_?f t 0{wJQIc; "sqf+_MQ*w#fs|lik;K;H;?#AG8n <|G:&Ǹ3YirfdٖQc`_rc29G@'mlàV@uEm2/sktbqA"QrYFQJK͉BRS6GX6)@EMdˑ/!-{}$ic  =@c{7E2b1-%,p̈CJzƋWD !G L0 Hřق;ı{L̂(?4Qjfi)ދlJ&MΦd@p=Q列aGswP{x)Po('.p{ (V*>`݈_jޗuϰVlnF48ү?)s # 8z%6wFDiH;8cH$!m.Ʒtg.99CD2n?8Ɓ3̧PƜ{QyިH`D+A_WHqf_|2?Œ Prr)ޏ(/|p.u Z[_y&yau6}42!;;MDKE/|9%Ѧl~ֹ w}N|yFӯwo,t.3΄m2.N !" CMDv\8d&$F0Ix!lRL8!(IE*J+n!Q$B({ҙ{-BR%ܾ'bua]+dwh_i Ӵ%ch/qذ<"P_2o%M(H9B4FgS>e~c>G؍h q&ju^'1SOD&tSr>p9#n6p5FU@ˆϗ&:(,Ugݎ`.VA.bJ+Ni =_@.&p\,Jc;׎b8E±#!?AJ!k"%Q0G`W*҆BDeqxg`^ _Bfxtg3>R:BיB8}('WGޡGxw1qWGK<6br픘Ci'gH<#3䙌0$ۍ&sN{`5iCm9qa]5;LT7}#v &@8)Q71zKbQAÐwNxڂ>tw;B !@ߘc޼$HOvfJuS? }aD G?, "DIGĜV!)IJ*q/_<#ɋ7QN%@ !Ȗ̝c"/sǥb".~~2VwGxwrN.n'l+r(9ZAy2*Ti@Y46qx`ykHHD_]=(}wg-K8Ϯ>;|)R~)s#qmIS#-O/&řS(Bτ! .P&'a^9~Sq0$θ.EJϏD|Kiy޷YXńA!ČBere]QGi#37aZ=֔*qXmy†֞'Nl 69F@NHs̷cHvF$ m)Jl;e g,3M qDql;{)Q uTry:+X_.sCj~'V@hY(SEڄ2.eczrUiS;]r76$ J_# (McS #)$L*v"(6$&c`pŎDȦ:h)p_Q Ii~W̆w:L!c,޷ae QPȚt9KZ`ǼYSH?{2`\JDl^m"NJL4 >o.>(, 5D_yD]'cdqdWf#?wY+q'(bȺϜ>$(~ -GepQM)6ɐ"\jPʔotmGo'WE?:U(E1S/>e:2ɿ璄#E:p+,'f1v5T`X J]?9w8B+eb'_ەD+i(6;p(eB<$T ! F^>Q$S?yIX 'Q.K= 9{;_k^!st7sf᱒ -+%i2ΏCՓi1%e\-9Y{]q41ް֍J3 2IZP^b!ƘG)bg[=8aւ&_/7(~H|+uR RSn܃la{>sE2Qmcue)A,˗ l.JnZ"{qR{Ȇ˒X2p~dASdib}Y ݗg˼x̗̉f9|Slp׃ 79en~UKl/\$.d:aĴ$%,pږ8z!c_z23F;5YCRoNQN^U1%h5:ҶUN5K*qE=b~5)/j](taR9?` WΏ7aǹo&+H;GFGj`VL455p暳t;:I@XIp}d_lU 9;ۅ)OBSYGɂG™{"~YPp[4]R?"~?Ӽ>"d~@cen=ۼȌwkk9B2EER: טkkOڴr8 k<5UL;!םҽZ-$ ($λ7sƓ}#)Op2t_XSJd!XEH3/z(K9r_sTϚgu;Β]@%1;8]Msܵ8,2=B%]kΝS8'N7/9O䝑r@S11Nv)H=Yӄ'G; 8[vhd r2c/VD8'OIW v7Gցl #&{_͈kd#Sَ{qa#Q ijWw<&c78}m}D1c%G@hY(Bڝha['~HsL`2m|ʵ ɵ~~h7GJwTnd|tgqt0w^]k HQ dŹ.h</͢w @ڧL]| mrl.2^J}Sζs4/R9";c/SL5Fv7,߇ocGOEYiol=Q(z\(3:sAy8yFtyOH%u zȕb*M6Os_<|(F` T5̓F6̓%{ y3J|rt6Mǜ$ۣe}З8e .뒱to!Ls52p8%Q1F\Hػ#谡eε kJGkE=CP 9bdܻ#Q )Ȟ%5U spdaP #$\֕A|dmֆrǃ2Cys; r?vDID*3eߝ!~'꥿ZFf%řiжlLm1;L&1 4@Cj Ql -;Gߝe-p-}syD:`N d;T#HޖEF#_,+~:c~*S֟ -}:iWɞqqL?0N37g ,QN'ȉ A/2f'@:{][9ԛ_@9T`J^ pWB㞘 c)lMonlh?Y+>d& 5(Q*(z (JU60PIJڿoPyn|w!~.X7ǐHT|WG(m%mwve \Icȯm:(~o*i'Ѿ =L8٫3Ku-+Eٛ NpzkP*m6}(BOoBPfv%zWRaD kSIg@?"[Le‰°:IHl1l) JԈf YढKg!;t{EI v~~JV5嚗5{#-i_3!Y[uM[{[a .UscV8q2`psa<~O&/r\=31gP]A{_n似yKNȨ~7MJ 5J==winΘg` s-cCvU@6@h(Jz3p82?NKQ^o?nopm^"%dն(EPf&td# 79y1QL)Y _[KxkVh@h}(E1^k163uTz^+R8D 8sswBtCj-7~Rd! (3)p͜+hba19/\k :gb9JoQ~ &h[ZD JB}(S:TQ!U.Pɒ_wĺiC;:! (9u(J쨋2vѹ}Y[# 8 Į=٥&\d&aD'aWQO6! J:BL'PLw%cUȧ~:ex:j8bxmlCPuwar "EY2Ld=K2dPE܋l BDABDzŅ]6].Y"`IH:=sNOwߓ'ԩ:ToU} L1s(= .i4"Q91vep)ۅ; ٜcl1@W((_%z&z\v; BP@ \4l?W $L?ME{xלh Pd ?Vs#Ac\zE 1!  bh2dDl &q0[H4iNih0ḷo6U'෋(qx~efin;A  ω IsܭFfZ}h$!੘maȤk;Z AEPW75j<;堖xV9^LKr1Ȕ`^!7I{q`c3a &龾$hbnM >!^ mv 3wf$ ׹ByQWs.XqP \5"Q:_SdOX/ L|0lױ0 # u-BH?i$ kwS-k6`k]0Fck;jnTc*r]S Xl'&& O fWd"refݦEQ /*FrږڥzOv{d AItD`7lv `wRO]h.K \NC+vȅ叚?,PvΦ}"}}!X/ BPՃH^?D}OJYAyݫ' I?| =^S><,7Gi C"⿽`3 t ~ؽevvtKB e"~M|`  B4߉Y] 8\ V̮Cѷx}t|{Ͼnά;"B8Qɏn;36e&LցKwqۛ[tRX\,_v}zA}n'2PwJTávPR= _ ֲ ZQ NPf *yW !u­eSNn-w?}{&a)=쎉q/^:*9tPC n'cخcX/ BP`vLBs"ۣ;hK1Я6 d22p&8[v9P``]짌i(3׭׭EcWm׮WO> Pմs+y,49SW^ۖAh^> /i o 6ꎸslZ4lkP^A `Z6С`>q=:nj-+1XFUw~IQW)`- `0g} }Rf GYa ?.vꙺo+ʋwՔqw+4 aHF0 + f5odD ?p<<(n~  40tÎTwG//Ϸi TM]ptt:Mt^'x(Ȝ,uL{1 Xat19` < ee8EUyЦ۷Ar6nFmŧѯ]?fAGݵ%?\]0^_0= L9a[-0um}<vִ7s" " Ta8OzٴсB|et\c"b J9@^Jej^bT`9CJi~p;xIqwsBKihKh`7訚oWrV"BEk : Riؾsa)/۔mcR]oAzAL* =-.aBiY9 B Fw1{'?Ϗ5\sE9S`01si 9s tl?CBbv;Q`<|׋c0V ,=~FjwoA=Xv#5tTM#ۈK`U]WAzAD !tJQ < 6gK'#-S(]4[5m6 GI7{+`9Qfy$A!ؾ 2+Wfq>2SL"3H N>Yls!~ wW7{7R5:bN9T\' ut@!Hϫq2pPg#.d 2K8<S>8hbkx5Rl *Ud@Nbulv|o:N?f{K зF'k w~|M& Κ/AbmD>(s[" `rw1l?BP -X/ BB@-4 wG' uTM5vYe[T-;9s S&Js;0 k8A|s n$ؒhg9P2`dLgȀS7WfS v \B>+ {b '7eޣ:ھ`bHS7~固}K o*_HD~b͈ ^e2TƼv}~$c#A3lG6a D ݉I?6BWcn߽>Q0;oO-}G$2Ƹ)p2d$`{&:W  `A6lhAvJ8:Hc(]V;)\ʘU9Ppڪݱi 7ԖHQƂ/1DT@0)t,eҩޭ2>m JO5;[BUD}e/9}2'obE^tUU"`:G')eǾk vm 2l kV@!ɠ;;v<:AjL;`\^pS&X89UV 8@-]o,:qmiAv/$&@!Wɀ\;Lċ0Oh׃3{9'N|H8($;vP \ê9U7_AFn=]/ 81yŀ&2O[צX>/8וAa# g깭+yU&0컧@D}gIw!_V3 GS,ⷾ`Y{Wg=2@S Hz9&vv߼lg:GOHj@o}- :2LG603,E29UCb p9-dRf&ԧU]_8Z9Ơ`QwP?_6[ wg ޏG@[8( mRf?rp2qVe҅=A1%A}H{ PwjdƞIz!+44?6U:UZUhw!F R-|#﭂>,P|2+!63:Io+cg6ͨ_?SxW}+k Ra!W^A|+{$Z.ĀwN`Β{oYon!V>f48zAO ‚S>][x@܄w;{xwb5r!F ml2$XKnb c(:}=[:J?`nO`\zAsc@ƁYhP Yq< 9έ.i:|Ge1gK0u `랃E|"</g-t늢Cg7/ĠKYw:PoƃY-GP&&pA29CA%rI\bOèi3ߠĕ*+cF lܝgJA>.)B+}4+CûSáݍ;|Z0k*ޕ;~oSp>t(/ڊw3g{|gm!װ^A|#^j( QS D^:#rA(㈋d)6[dbY ܧxP[]]"b m(Kkκ>P6Ѵd\q~e"3W&s9LILeR5*c2Gl}~nV&7ߢ.ES ,d [ yY|u%&8F` nYqPg<'ƒ޶}!Py96Qw/1x9QK'NH(\KQX9d:ǔ1Gpf" >j m^-% Gh2H e|iA%xkQuIokA: $D Vo)~ڃ{ Vh`Yx=kb$#{NA[YrAF`o2`eL˷BR4SUe0+Zk"ۀmĺc+vMZj(C.G;@7wՖly`KcfGq5(Ԇ6u#\aغ*(VƐxa[w(kFpӁ2#8bpfJgyqv>1z>dfxNe{j^uu@|ȍF#[MܙTL1Tw\ #xW=o8AT}m=#.tya]` :^4ikws"סQ=+RoH'A4lX/ ,0ߣ\XsTs/)q>{yLS’|D-I_CHi1\,ykG[y_e`@:mA93!M\Fpp{Pǘq (ꀂb"bycIs&g-)PD\6NSB{i,,i.sb◫gC)9ͭ4 {͍Ōt <C:WZ9Ge`*9&kB4D(ǁJṋv,;δ~XOpb*qm6gqWp=2<܍2¥Oǽ~2Og(7y/"# Ǒ\s}w \ϸ ܲ{E _nƽg#T5-n3Գ=v1 }   $GlUA&NL(`28cήr(s (΄9%ۨSE 8v[۶ŽzqC&3qϘ8\D9c,O2"i.0;!E;E[i8@lg@Efs 7ʹ^k Lv"%<k_Ĺu*9{e eE_C{80{{˯s=9w~5}(.w»Dew>bdXܻp>3,ǁ)Vm^rWz!^2~C>؟mĶa=.so Bb BR gQ+L.f vRk.Ş`ʼ-1S[ƀKK{ v4@2a;x:ˡ3z(Xx\g<6끄~((P(B(2B-2 D=¨]>б/Y1pfbB}5/Ĺu*uy4N(GZPS9¸'"i#Pt] $]ww8B(3>-!KzZ\޾1VDvf6@PG1 ۣI--' 0 % Dى ( 1Sq`c'9@M1|zkY*@eag!;I{*Bq"'M7V mR';!W ^A!?%9cpz51f4 F[|p0}| ,u䥷- %81.p'։|,;!!2@#2&:(_M/F+fm. Y=SQc$nFg$?LBer "b`> ep&$G dD~"v?Bݮj9pЯ)Uv_%BX/ =dR)!΄G܏}?}ܯOP(0M3g {ռ'܄g"_Yi@e^ aB f*~5we=9MhϚ3f}{3KUtV|ه!{ۛ tJAmP CQ ~vAҋ K#c ?ʈ\e\!U^M8 `/Ip68L (rI0cOoJ[rtf,}k.-VWMsxwŔxc]I^1 _ } zA! =pKc``~#,27`YAR^Ѩ p23(Oro;0'O=L@t e/plV0ǃ:e |?1 4Øc~[a<w>UMgwmSLg|S-`HW8OY!ӎlpo=,u7Y{f}v {1ܥ!~C}e?vX e tGD|5lA@A?=q2^m<|K ( @Yl)@Eg2XӢ 5hUWY ~NQf{QsceVT e[KbzK)c\ksw_YxSwYq2W&D5#:p ψ^Tx E;6wWo὎8x)r7"Gw ً CDď}y `p.o1>Ė3Y3S/fv-\͕w va *w&p2ef׃){h2Ù,g eR42e_tw9?-W9\ er>w8e^v 4tJO(4Ǟ3Vs֞QXKڷm|s򀞵sZCɘ!י!Att2B] /B^AAHDڢUOu׸y*gWG61`i!j[wh@m)W xU:Kzx_ζaqf@^YL^1{_L{qKuŸק1"SYsE;jnĵ \ArA?1F}kuR\d(!5z3ŀ0h!/"I:\:yq4F*:-N9o4V3k甑k;$Y5ԫSҫ-uG y3(\Wȣ.9IZ]P/q='x/p^T΋8qX&"6rwZ0Tr{^.k5I34.- e; D yG`A  AB 1iZFʭ!:rP$צQ2p0{FEp-AEZ Z5\q)@C zA!@ 1r>A B"b^A2  b-X/  *b  Ak2IENDB`teeworlds-0.6.2+dfsg/data/mapres/desert_main.png0000644000175000017500000026271712140200333020651 0ustar felixfelixPNG  IHDR+eIDATxwxTם?v|}4qıױ]Ƙ.:BHB9轛bID IY۱;igl|ݙwJgfcF3wysD%A f} 2'ܹ3'+3󇺥d; g(rU,?sz@L6y|)O,`{?-Nt}f;OXl  @`_(lFXl S+ nXss, 'p ١P@`2Uj ,h }~¡eXqe1H? 4d-(п^{r,;<:?dV@!~V3h" T CaA\~vlL5О^Afѕ #t{(2wCX'G P6#f6D@F #W̄•YTykn?/`(Ђ9MZHXl K@졧̄+{ WP6#f6D@ɢQ QFC%tcH(fuPI%(lFXl @O _e=h$ )ۤ*ףdV@!~V3h" $Dt%}c$6#f6D@)@?NpbPLYQSCo '+.tJztk ( jfM0(XS`;ss* ESO\Nef*ݜEo͡Ƿ;BmݜMeLzpy:=4Mٰw'?€遏qv>>%ӕ}̟Wa 8(c+enF7,hv}ye ?W(mgd ~V3h" d0 }Q%27GYe8TG@x+5pGX%?6#f6D@KܾF|O}>?&>3?(Z ~^r f`.{nOkMVJA`rq3T-?hp/`53ƉBpAu;zon{Ņ&ҏ) ~ON, "'kK?0XӁ5LϗCH;[U| ~V3h( Dwf$ڪș;2@/mN_6yi?$zt Cd @Hx>(lFXHq0\«4c C}_yU| =!@ϽU|UP،@Da(ԘOlsI?0`#LeӤ<2R *~N(lFX-X!;A*Ҙ6~a =E>%-L`?D/'Uj_ H? 4:d0Og;?ey7` H? 4:d08ß_Wo̐)~V hd_N_= 74}?6P <jL~7 'gЧ'Ƈ;Ce I? 4~`2hfz36 ݘ-=iJ)~%<6#/ ;Ȥ{qn\_,ov7]JocNefy֮|P،@ Eނ _5YU~3徼2OsA`3jMLFv]EYOR\bc- |? ~V 4A`2U?{zfhcKУ8bK٭ao?#y`5@ S k%Y=O%fML:+ҵ.|#/4f6J< ~V 4A`2 z_:"hxe`Pex_S{|If|L?O-ɠ/NN ?׽ՕE$&@`3j,\єJ'3mGH%ѹ/K?6CxO ߃ :P ~V 4`QyuqpeҏL^ C_N޹ f|X+ ǯ Z"` i>OW='wF w-eP،6 k[H?n0NW d_N8LAC`3jN9x=l"[)AC`3jN0ҏ .`M|Y_çQ H?9QXdl {DloP~X# @hP،eBZq.D gn_=EP،eޝVpy$. \f6z9YvС`5' ܞ:BVD#~ Bf՜(,sm|{=X8]->xtsC`3jNiFapl0?4]vx`5' K]lBa.恲 S~ ʡ`5' ]gT߾HECK?f0̵ ;oyNoH/6#DP)G4]O!QF->׆•Y?_>0`n%G6#=G@ =E t>  }Y@gF>,‡f(0YN,| ? |Ƿ.>6#=G@ =Ȓ`<  #d9i?wa@`3zC,"y k\#P،p% Kނb!LZ(lFz0@zE;n =<J! @?vw \\);5P،@% Kނw{G,JQ6#=G@ ="n d QȃP a3J燾B7'vT\g9qtDžL?Ku\y#- ?xtsb/%C`3("MUP 2cנd(l@ J@@O/P<=Gvh M"5( q؄,ހ[&X~ܑ@ ϻl_l*ހ[HSH?H @NA IK'љxs//tgg:rsEB@pˠ?\+";D}p*SKe|Wljl!(P( @Tف% Ͻ/;[]h _߀[@ȉPp +YsDn-/Lά H 5( Ao­ $(L.MXbt2ADN/=GJAP aVAf e(vv|rzTV 3~ #UBf!A`(:Sv``O"4١2\EYCP+5( A!*(BLP:Kv``imAr/(;W&犬=Cj%C`3(" Y@HP(ݜ-;DpKٓt=l9.g+n]vT5{ϊk^Y4㙩q$tg8{,]{{4]:.nA UYtzYfpE_K!8Tߠ@`c1@HP(ߞ#;DۋJp_m/{Ts4/_^  -6CP;(kR 5ο $}aetn?   A!(BL ?XJָRYCəV!{adnlUpoPP ` A(ܶ?W czUvv~N6= :dq?PC`31@HP- QX!G5%o4+Z'U},ǿ2;kaP ` A eUxQjMP/S*L|eߕ'ӟFp0P ` A( ʯ x:_W[Tx}sldw^3U3da!!A`ppS+ojT0=*l xuˈK>l_*_^I.t( 0 3-fmЉϹ<<3+6 +8,̡{?G`c1@HP(ݜ%=X`^$=ߗlwLʆ>Xw~c 0S\G`NUKryV ,aqpW}UkK :TjЊu>v! H. ğ DXӫ׍>=1 oek, G.xlN;ك}bd7Z5;C0C` A7Pk撀m~g{;8ڠUj~MZ+.hkEu ߖֻp XΩ`ެNU*#N]kc6溱=iø^iBo $(B(ʮϒ|  Optz`yP܀v}ֶrIu-9>ACƮik.[D@ڽmpyG]ϟ|&g \.p :VP,?;-<> yĶLЩ\h";җož^WuA;z+8TV/>96ݝӓig;+E0C` A!ׁ/,9޿%ǰՠ}}~!_APRES^ }r-v6 x%:Ej}ZЉR>t}t}C [ԋfv=Ú23^oWʖѱNsR)i*߰@c !=D{9+Oв ^mI p+a hr#1#q)\$|z^^ W0bYڴG#+ F UNE?4w~c1X0C` AWK>\HW!ԯF1u~WhrU6?䲁:A.'R(-_o^)]-xeniܫx^gU_`aUwIz'[}ӶƞIj8Jpbxt#xLGor! 0  I>Z~[y_pzZK岁ao8*p;85"z;|M!p̽:W^iO]/ؤY8PYsr|Yn$Xݹ6m߄v xF U \N/lCU3da!!ABp2Vhڴ?Y07 ?ۋt{5:ҁ}߀: ׵?W i*`{U.ԍ r!,lVؔr5C^hP\p{NO&r?߰@c e%F؈I[sTA *@^}m?`+ +e9_or_pG;9OoALJwp@p; '\; t8̐‡CP@H0?AwB`pVS}  PO]W ^VqW/[x%~ jM' U oX |1@HP `[?Amyc:W-t HxUj-U 'R¨T<-/7%~PbphJz(0 P CO8z+_uKi~L~Y1wyGjet޾ګ O{ՂeZ2=]߿,.?0 $(B)a@c\%M1uLHj_@kNHԠU zkOwˣڬ A!F }-9@`(+ plhӠO)/בV ?f 0草_߰@i (C $UPिi3JhJc m$էԭwUt{Xou~Nv̅~adk\qa#-6 ԟܯx J'+GP H*(P@pߴ)q(9q/Y'pIEua&\;mYviHӡԗ{|-cccccV ?'ob z3gnr6<ߗ!yZ e֑U'J Jfic98~YA٧X_D_ح6ۈrLCҙtnx+4:o of}}}}ccc=q||ϓsUse.j S͔Xץ&i? +N/Ph ? \ܿ8MvhA` g4P+5( 5VBʧxZ[{ҿs ѧMDC{U>B9>&ݕ9s[x +4Pd\*yzWM/O Cҙ1SeֱMSH Jf4j]NВѯ}ZN8:k$z|k" 73ٯf,GS>keyyρ+c0[~NzʕQ!K_~ J3δA  hݎd" S ٻPV:2h̪~nϙǀ"P`- Ηbkc=㽳Oe|wiW*s$K_~ Jƴ苓iwae(lʂЀxV]^t}BAs^y,xLxl&MzJ!r<|5<ˏ!yZpaP+6SvxA&\6ٯf,=NRsHk"oSϙv#;j`r+jL74&)!K_~ ~,*Eˇ~ô3\ @&;&PLwĨ[{\oKT< .Ee·|#=Xd5T@RG#DVho~,*ɴHP{ޘmk_̈́ù F.yߗ_iOh,.V9_dt2]ђ. oAYbf3 Ƿ}}}}W1wPD{JΉӦ̦,3o VS~,*E\" ĠPL?بk;"Ԃfg^}Y" mRuI<?&?m-{><6'G^HclS[m1i/ݨ}\Nm |_||ǖ-*cțZndD8]P%΢볔p;hn|Ƿspj+_RTz"fnJQ]0^ӆ jV1 4v7(X󘋱oh^6(nL,_9qitbIqX̧cxVǎ2KyZ^/&J(FШ(+3/ o0Fզ]BhcoyyywyqڠЎf+$R lUu=,_jsU#hJ Ps% lSXdZU^TpO\C6׸ H\2f <^ڒCw?Q^E+2.xt`jD@؞(lN51t;z7V/h)Mn7<Hy͑3 % /WWFUoߧE{=aR^gYH(FQt7\=G ďn̢7E0Yy`!Q@*|!sG%kcv<*ĘuwhP81]לrR\%*Prya\傏ExA[*6Jz0GP5G".Ǘ750wsPq*=4]Y:WqP[S᱑}( ^9،dhጯs/ n1goC)"\9c=Eg-:2Kb/}c9 Oq`S/8DKIˢSdU]]LJvGWg#3%r%3]J<0\zGPndU|)3Q$9u @Ar=B w)8 xp|`3:ls?.g5S@|9c(ߙҳpJ>QIÏ +jWx^ SM:4m`(+U?}y*r2/T0_XJg(4gWtIWǶ Bƶ%`olcS[|9c>57)N ]kپq?G+ 10.jWjo2k]N鬜& ;4FK%{e<]),}{}?(DZx};J{zuύysHp1jщ^>p`(&x(/Q/7z=]_5ex+;נ}iS ,Xelaj ڼH ײBFHqUJp<0N;ܮT {|z%Ւvg5 I ߟ|,1m"_*#R?T|% ^ 3S37z6._.~ѭ9< 0/mfF,^-* 90rp¿}e0^$5TRKM;]qSPjʎ5h]倫po?/[Rעix71%*-QƯJy^g;Y(vq=xU@ƫU*w7wPԞ^OkGKz+uiy_cٲ< 0u_Z۹Oc}.|Zs7(,\ هRZ5NFe0sCk?W6(u35+$vo{ DK]K3S@%üB{@읕3s1vNOO *MQi|ayy`/t mb|SIj@ρcfA KҵMNƗ> *w| 7+Z |,|Ljaat?Iy:_iE:ѿo^jVHxNHv9.s%;|&kNI.yy-:>瀾Dgrﺒ@V`7ѡ K .OQi}z}zۜLX9 ϝ|:#*ݘ!`p.TrPS]9/2X ]r ?W~βp45^WƴYѐ&lZB괛o!;PwGu/;>R+Zՠ | |,ڲ8mm ~OP_.f -JǒȞo/vܘzG[<@|W|%vousk4e> >hY7x7r/..7T<:SvxG9۞O]GucρvNxOgEC^с?WΏm'лpл tÈpA>#+sϝ@k(hP" 唟tn+tV4oB@ sw2sRtu6&~P8mk 0J|47ቊ+Z>MRrPA+kNSS%g/ƐZ R/AhU?DE_W*ݘ%;гxVeٮHqUy<OgzhE7'g=%WU_eXC"Tp~+0R48Fƈ_?U}_A`S}CN-y)sϡvN/d4Ebf3咂#Z,yz^YP*B>|}Bx×ۗ9f+75a};D+d,\wy~\ac^+3;CKS[cku}_PD2v?>_e.vTz Hewǁ@>R?Ԇt9ΑI:ϡvN|UJ5xTң'oYyiMz0R2X89sS'?g~ ]i2=#sHM]yF~P oPؐc|/Ǥ^v\E <'74*)69i; s O'QaapV<,9ϗ;+TJ#ڜ Fʒ~5cFag>^uPؐco

P; ^Λjį>4 @c#3ϑ:1PX/wf`Wg_,= B)NQ@4 viP-W99ΩƄt*g =x#3~  ?g~ڱ1ar(Xҏ-\n\ 9vȷqpeTko@ύ:O uCJ\ LJpT١V(Lj( RܨsZV^;VVpm|{e;h}W Zm߿~z gw+)<&<6/_JN8_0"ru+ԫBcccc7<MV(>`Sbߴ>ux\KkvNIщtnx+:т4eݷmVSj9|#Eu0ˡ֡W8# Pƌǎǐwsssssssg` C; Wӷֿ.X4ϙ:<ڹ=7uCk;8u?QƯ?%ExuޑO\ǔǖǘ\\Z@_>dЎBUS/d4 xI̙:<η [m&>ҘêC-PƖǘǚpJ>M>W0Z7(NB*͒Q@Dˬ.n["ύ:O:ȳf&$/lZ~STpix oV!#`.?@]q@w>lV~CpO`.F -H=^e^ 7#P5 ?z\6 @\l?vb~:{-oaԥ%@,߈@1T\\T0ʪ . gg8 ө`qdKTV(C]"q{g9>ЖT~UBȗmlǟb*XëеqmB(CvMGO/z:aFO [{&S gݫ*5 T?V+<-cvjsf6@_!\zcdpdi쩓3> fҵGӇy/{,OV$@.O ?+ |.{PE@C ,9MϵJpvy&{W7bS`[(lhPzݘMϢRWgRtzxe=,Aef*y|k6}s[zLZOz~ÿW'}ě%&ʀ)ʥݘ [A`cf_NMe{7Sd]]ӟnFNm:^GZo?]]^:j / xpiΊKp!B`c tgK9w[ k-Zڹ!{֥}Zй=IV` ,Z?P]S; ǩʕxt\7O*xGg.-X}>9ʮT1haa NU>ךVvc8+r\,;?WlhS:Pk@)NfdċU-RM{TSyB)Ebm}휬ܟE>9/U@vo-OV;~}ZJ=9%R;8aw7>/U  ֗:֠Sv{V ;VŝB/vfTɤѶA/+B>I=??\ ^; GA. R̜DG͍T*MD|u6@v*N!Ͷ/Ѽ/Ҽ6/ћDno۽E߶R,1Y U t? 4}yz"v`e*35mL5=ѲV= {҇WA`c֕OU|E_Ԯ-__e5{|;}9.0x],5QjFNW@y8mbAweC'ŗWtom:ѿmkspJXIZ _˿Kw qzA& ,U?}y*r@v8%c Z)ynku]jz ]]Կv|{9.BS,5LƕC($NY%pהA:Q-iw֫_'O[XzQN?;"{jo= O'i( 8įMզ[juܶpQ7v*_.T`~ۗ w4WcQʩ i J?>MVtI{7_NW[f6@Pfwҭ<ݣ.Yv zգž.{{_j)e:M Ρ<;UFƄ|ZÛSU UB8_hG_?~uϽWV/4׻G7f6@PNwԧ}@ۡ$=>q{YP mV p XءrՁB{U0}c) ܧ3Ӭp`߾~EkW m*KsUlYOk.RuK PW͋s[;M5&^5 {͠ΘT:BpQn\W/xN3s̛ꎭ`93΁slfI("%$e`[%9ɲ-{ƶ,Y{뽹_PHU@P~3 w[  Y`aX녾&lH5O?L<@ƿ f f\.< a]޹W?ߧ',A&]~|$8$;׎<<k =``\:wGLg醩tʡ[q=Zb7PbWEd=^"r<5X1bKA D6d= o]/5|?/,k 643 pd o>&X@?3MP S ~-C;pW1ˁ(r /ǸIB;@piƆcsx>oZfE;UNUkG# @jy4C`wqQ+ o!"dS<({7FS@o\ю ؁3w53@;&08*Jگ3$9 iGE80eK0 !eUX-E/R?fbhy$";k*č"2`ԙfs@ ,00#}jq|3TB>䠱>7~hCHCĐs~e|0]KLX/˦G m(W]|#$<;af H" oI?mS}!7Guy#l\' `A/9/Eh"ya (_Țw>. LI%>B +'k +o5OG]`.P3ؤ2xTKD_ۑBg7ld)$h,lާZA=KJ"?@@Z>ZAּs@- D3+JQpo忦/!F3YS@//U[`ѬK0tk`MƣZ!KF#ۛBg7ld'z8f>fKKjq].7F9Ȝ{ keS /R2^ѕAB0`c@CaGd߰vbƼz3 ZU#v07F9Ȝo,Ƃ KU_Ke?B L/o(6 ^2=$oƵ(I U!%"f1IvPYA  Y`RU3 DTJ" 5v!B_dM,B쿡3bzck٥3’DF \U!3 o6"̀h%#MU.'hTY1Y8Ecf|gS1LaslLAF33 o x coeN8?DۋΗ#]t_ j8zbDA\%قLh UrC $# *>+Ⱦa$ Ry@v_S>MVx}s wb0uDg7ld<˦ +fߓ/$2@3  ,0ky~4\z}c!VFoo/ #3][~ G|x:ෞ< J6Ghb,X@H'䀀OW&-c)@ +lp|m\ ㏇6@)6po,J-{| 0xkki ~lf`\;6dL0!`W2@0!`tZP^<?p O-IB)@2?\ ^X>#F_ 520`C>a|gZ B򭞘kZvOqDTdYA  Y`x  lj$>sul5N7c x2kC~d p^7lj$ xژbꏯvJ7׺b{Vx3B}}Jl.`S8Dᇗ6S! /^m@__ 5ؿ\6q"l)b~P>vGl*Oyb{p`1ldOD?֖bϵI7cw/v 5dOߌl.`S8{zOz(xaG5]kmsm1ߌl.`S8ӯ^JJxgSMBw)k>g OOZl.`S8+mkGgOo/? / ww  ฟ9cd p^7g/ =_[Gz! (q$,]k|o]I"U4P ٶkmĩt|4³W? Eβ.a`SH7k}u#W-0* ?z r\2D?e.،7GV /?  x 'n6e0|!vsup8776c2fv=4]zYp_mGDz.Ut@Bf /E2@G'߸c%Ooc]davܷ G+!<t0Oe5]t@Bo;pu7Zk@/_<Ғ%|&@uscCZk@wL[FA<7+F@ Bzkk]EWrme@ʯmf|rI/{LDWBv ^_gzr_w]ry/4gsaxadL:DcMcB?s_ ?  x ouO":_&'NWcTf׆ߛ\ώx1 -聚JM`tkt{ӱz.gzb޶V~CDG#*;7Wt4+g^ O8Dy}LM(|D@h>~ ?.L{;~ј]dlF0XսkHz@st֣ j#&k|b yڳ"Dߌ Uoߨ E*%'rt@@)?HDb2̟B6)2b,H9ot @7{˷z}bnD'6QB/ag_c:^n&5R|jGyx-"Z[2(,/BX0|`S~Fg$+!Մ GUq tq=0` ɷkҋh4^q: 䎫aJ9*8'ܹqc8_5)5Z~%ٯk< 74>yvsB7 ta[LzyXk ohpt'>Lz V9^)䩃+S>}\E-k/邿 02=X7RE}]uXŭts?&SF+9kkwp-*ߠ{Nj5.|D#,WgH$9!5;DS5E\`r Ʊ0@zD5~zgB A\ aU$>8Y?TDT5/hxl$J[xVfv̩[銺L &|j}@$"dkp~^?CDkbmBcC \`S oI15!O(cci<8[άϮo."e󝣍j3^LˡKmMiD͓⊙zk6=Z&IϮ Fhi)]'v;5v_EI9d2~ȖU|Msϣ3?J>p yajҚ=@x yqtGtX'( 鞍s鑝yLv"2]:!Nt0?V`sMo_Ly\TGokkkЅڱ"aC2a()<$V IV@_)DwO-QOF[gNzr$rO C❞K,9 C9d\8]y+"`OkO $%cqke=9XA[L?g%}eKԹ]@ohW4QGw,ϏX^W 9#;,*=smk gfWUM7hAʟSgƿw+1a0<&.Ԍ*nsCsosG7I 3莅@vkKӭw-֫k;ߜ~y^xxuK$e<_s(w{?fa~q0)`xMjQ\$(9UP0ܾp*=_!Be xn@ß XI}O u>4NB#x= ቺtw.}t華.a, ~-I7ҮXHJnDUA?c'` ! aUP?QN_A3X]cbاa6/Ruԟ }8gO\XOO\߻oU|L rC]E-aD< ƣ6!|jGN""ݜ 4C.,%8~PO|MkB*ԏS1GCr*m~g,w0.l&h('̃hMR_^uX{"@q_a71E8 rcs}w>m~4Ku*# 6D)1X.;?5e`S8Ah(rpbKhwT"X@ [,ZJoVEyCEjT{/g׬Ukۊh;bwuG{w@ ~g; ͐8BBcq7Q. pjw~@_9ׅ#1~xjD6zedߺΗ.yt,Zx"@L`S8!;L@NN&PH{Gj .Ŧ0cp6O VXg]R@7=ri^ݠs< n6>.}bg|Ѿ;EO -J@82 | :| ?sNg͊^k"_顏ns*BC! ˆBN0\e #teFF: P> q„K$rW:#]o`֢ 3ϼd9w@"6vAϢ=,yJo16l. D1`4 [QÆ3}^7mq_aݏL@տ{=rG$~}u =c4qO#I> q"^. O h,/"naLQ3@"*Z3n>??l]u^kb_,8GCyHww Rs0)E h?Mku ?hB_ Sp!4A᠙@l$̀ M pq,qD<f/@/ Պh#r*>t1W^o^N?f}tu-:WZ7;эDL-U]@ڎ~( # Y0D?qCѵ~Mk 翤<&ۃ: n<0 h р)P`4C@% DH8հIG[]ַ+}u]uBL -a$90N:887]exPujHm ut{(1yRS3A_7 ` x GE?~b=1M廽&bHŒVx֢̀10H w 0v2u ?ͳ0e?}D~& ᭉo=߻f0Nsf0Ph?ף 1k6"5и`if@TDF f8\~+J 'WiFch?zo&CH}Dz3@QZ$HD'NT@XAϛFw̠{ LZӀ@ x /l5-B!OIFx,iKiga^(n,C 8wbED7#5" &#"h\Q1̟7}rR@D]pݿhV2Z :`SH3~zg_q*1bw ;A3@1c>e}?y;O81FXdA_O,sltC,HѢ" W89n@@wMG+ܠkT|0`O!֤ſ@f4v;"9B_eחJEK৅kaBc),GD!~VcrQcsl!sNgt_$*^S@O·`ٯ?<wa8E"0@fu4"~Sh~ 3I͟tC5Z=XV@=cLg 蹵AS֨4DO!Z!PI 0]^+9'Rh J9Hxkn1"B?`*^TB/n(`ٯ?/Aom+ d8R _ C-@, +HZ(9/,Ioo-`ٯ?<{Ǔ?~b7l@$);g^` ٯ?<+mIU>KnjG.^`ٯ?<4I&g/m  ~q p ߀ c̃ךTw{2>}a+}7@.`XGGQ ^i:&d ud8B?Z.R x&Ā\#>&(?>yf}r+}^~ `ٯ?ߐ* !5ހ~?n}q9v:_?:d)n !6ހ  ~qdWڞx$"[`0#@oNHADuKsoDd ud8 *!l~)~8 l]@ dI*v5ހ ؅>  @dQ,v7뙲ހ E<@Yٯ?~ @< !SdkJ+x$"[`0#߬@j5%ϕQ 760+ |c^_۟/lpH70+ nR?_d p_C  ŦD`8^R?_d q XlJ 1dLE `^_۟/Ÿd^X,6ń T2Y&͇۱dق\Xz0@b)D0fvN܊&{}m? Ls mΕ< XhJPDQ@:/nR?_d sHTP/H'0@a)IC%ӄa-ѹq "[K0@"-*WmJ db@T2I&ВLR?_d tHdGmG2 MQ$*"hvQb^_۟/Ed>d}% 2!_g`BSl 1hvQ&bɾl? `9tlsZO#j*ڽh~9yo˗ޏo>/ll΋(U9P(.bPPjkԏ ~XhQt@s~2KMu`Ev MMLexU%R/Ŀ*WTHS+H%u5ysNm"I=X Gt+R7V]2~~I2Z^0dYp4b8b3+97&Z"vc&f@&yE7w\t}%B@sioUyV/  V? B~c U ̤鴪f.-S@ p,b0bS/9/&z"vc&@kl:űMu3THtnan`&VC x׿VUa#`qjʢAkU4`Gb)6B3(f;9ӚsXj ۟/;`7VohodC`D0zty`#WAd82RB!8NVOɡ⿶Wͦs h<+ 8 MYZA1IΛ윏LR}]|zC}S ^]e@.{SqafE)S=⎩ۜeĊM)@w]usGgoȧbڙؙvP@Ksӊʲ_4ٴXl+ 8 .!(َ:p|6E&bɾ6lXɾdr:FZz_ "FQ/nKent$ay2Z֚l20>|xq?+F?J:>^52:k9j8d_LKI.X2`G`)6 @;PtAsi&"vc&2Z^.O9B$F7Wк3hm vՖtM?!&zyަlzxu)3&OG߽s,ݾeg|*U;NϞs'G ,qT@vߝDos J&ұğ(Vy4LR}|zC}S 5nP`НlZ?j&}'~MP3k$om= 0ߒEoG?yb<ٛyy>y81td ΢s"at ]pVpz`gS8CusCvٴl:GYXlM/(V‹4LR}|zC}c Z}J:%\E9 V8w7???:3^_<~nQPQ'5>~tyr u6s| ɦ!;%3!@=uԗ5BkySm MIʀ$ϧϦ1g2؍;< ^F.#BFH^[M͑ޯt^/w~ Yk)T П=Z3P*ܯ_Ek٦|pzxpr D~t$83r.>A?uY#*|J4Ds C7RCBI0a)XlM/(%sN}67d_3_;`7Voho -D?s73' !@9?gȜu\m{M.S׼"_t2s¿w?aE]`cc UW0p`Y0 ɖ0fn"aMID4>ƚXjۯC747y@f=%c}k͢lI>COM?;S7q?IщG*O W?<1ShŞ7\X7;LJ*6ab)6 =(&lg83KMc(vc&Fl4hJ\`Y;oA1 [7^;9>V̌+5~j9@}H>:$lڹ*/G6{6:掆"ZW[.T?;/4"zg@%0aa)6<(q<>ƘXjۯG747|@fύYT7冨v qnx :=F?fp,z=c'OL_cZ\M=`yphz*Ro^fmouT̹ͤ.o*B^[D Am%-_]RE``)6 <'gXKl_&cɾl&ewndd.]3K-uZU<%`V1%Z;j=Uq"gؾc `&S`r0e9@ӥciZ^19A|^ 6⾐S_}J.uġk iSm) 7_&ROM'>V XlMI(Qi}6-d_G_;`7Voh2A|3g7QYcDX;m̀^=^?1~pq *0u_+X?>87?!++xY1ێ!Qr0e]6ww3%=+5_u6uW BR[2P;֊b?4俒SSIv_KU4T5 MI9%x4̵Ϧqe2kkSv Mj@f~p)?dXEQJ9NcGOO0%fЌ&[?y_6UU1Xc ytppWz_ewwο*;f 5 2,6&Qd4LR}=~}X~S |9yW`l2z%TRBn{ԩ$vmtؠ@wfG?{yc~ikDRפT2&BK v2W9Tв2Z8;#fl/{9b5 ,6&A (> -si<&zCE`aڟYͻ vMb\/fmB=4/%3C?'D~,>0ה0.鷼j%9E(WMk?'ٳ0XlMb.P|ZgX2KMueu*vc&5]t5ft7oPznz9d>2GkQhŸa.v/>*FNT7rMGX:bzrIUz;LGWY,(ˡshGUr=ף؂Ŧ$܀l\Md,5ט׬؍7p,MUttC-\GGJZVNΖXp6xKEuHt 8>p WϞ`!QՌɌS;۷Oz__XK+T<:kJ`Ic)677,4gS3KMufu+vc&6`]?Nl͖z^U)ppI?3 :c"^xy:⥩Ϟd>@'ŭГF;ӱ{) MŁ3%ϛ`-/ %sh|Z]G*T_K۫r]}gߒġ0@RXlM͍(> ͆LR}~X~ oi9\_سx~.ShLG$O,;[b.&3X" D,j;n[MG Ⱦ]4;GLJщCt~:rg]9S~~NߐogxIa)677,$Bkv9d_k_;`7Voh`g hE^[-Bw/rv86p>|"5oKJᅴ1xd|,mO=鿫1; lfR{4ڵv0qhK=U5دɢ>iOBSlnnFlIw&bɾl~ewnd$uE>cϢ9"?9NSV: BDSgxٞ(=0Zm5?spy$&[z4”c (*y}ϳD2x'~m*s>W+BTE`sq`w1AaEP|&[k5;Xj9ۯa74܀Ϯnu4X`UP8>?ťt+ Vu>cIE,b@OذQ`ƥԡ40@Xh͂K(>-uњD,5םױ؍n簙ll8 22H - [U^윸/'ƄΌ\B?S,= ytbsdž1p` 97ˡ9!^,ּ3,k&bɾlewnpv4oUlAH60э %lP i!Q?6.{džwόsϸ^ʙCt.ڜt&20i,4fe_ꚝD,5ן׳؍nŬMv߁YPpV\FKx&K?}|ҿ^ KG8'}>@b 4"/:}󊨫jfp1!=wn;r0s60 1Gg'cɾmewnpv,XHX`+7-`}M%^<c*}>/vzοv3 ^yCCLF,K0  MY(>Z:D,5ף׷؍n%[b#WcEk -EXmȥ^U˞ <P@0o7`@Z"b)62gOw'aɾ&mewnpv,N;Fz$[K2 $Lڦ2mչ1>x @`)6 0kMvecɾnm-`Ⱦg. *v-m.zQRvA(,GрLK7 `SX (>Mv_ecɾvm--`Ⱦ ^8GD #E"명߷'KGB7 `SW@\OXj__d uo? `SV@>/~GXja_dtoH) *_&d_Ƕ.0d߀ `STy(Mvdcɾmm-`Ⱦ.&$(sQ|~R}= [;}H70\JMIPH›>R}M![;}H70\HMIPDA6&uB w  n`m"KMmkl1@  p 4E֝d_߶^0 @S|^DaKMm*8lΡUu1v7qSoD3mx.y9v@FO,Z]WBSqV; < @S|^D.fh피^q 6`N`E$ /`Xj피^q 6b*0L⹂`p 0\FM }B}M쵢nbHd" -o*z`$|q d_)}ЄWq 6L ͻ位R @`/RĿ#k8lp ɿDJ]:z:p1 6'_M\6 p=hE~?REg}#\0rlOhRk6m lp ɿ,X@ݏTPc}M%Qu `S|+Ok}uAn 7@0&wy^_ yKe.5 @`x/bZk4 0@s)mu}hxoS mS)uRCy]o 6'_6צ܀MHLSlx kt6sac$|Q Sd_^ p6 !`8>U-Bvy@KX-Xp 0._<'l+6<xl9 0*5F At0C` Fo3ǼÐ]2++QӢD:ll.ʼnG`kMQnWy@ ղ{)0=b[DT ywZU:t{t:>mImuٖMs ŁH܂(>M8@ !`86]BFgN%2g<k`:} g'/^N|5>}yOMG'Ӂe3>=h.7%b@"`$ 56!uv;enzQ[ [hbqw: Bv~N!I`??c}M5` 曒B @ @2\Mpkr'pBmգh >B|tUO(уcy\=Bc h.Q"$z4'0@|`))^Gl/ 3t0d^,;,{UՌsC7{sxLwbo 1k9@ |wSgM+ׁ>Ɇ}Py]9̉MI*d<0@[ͨXtN>ߪK'5$$M$ = y͢ Z>z 9ss(twcxli1go_"=F{29e[5YtN>@{6.ms <葜Fc{Ti.{`uH4P{g~^EHw^qsC"<#\>\ف>C0A8?~Jx¿wׯҧL?' [~@V?8(q[ukw+g5fRwLU7_e8`OwP_/Hm3 5ԣYPg~>EHKKO*M"Xy KS闯΢O_I?qJDѯOm v+2ƁɢNU.UuVg]59{o+Fs5ϙBpu֪S#.Tk.G 9ݩ!?h[ CoFutlh0lNSN$P$g~EH1(G̥eckvd$vyxpr(q}`:_V~^G{/#]鶽}tnꢃtx M Ctd.:vp6:E; Ki@}EԻzS>8_wy[Uva{ɣttz`&G4r$"j!B)ۏ*A3EN0@XhJ ŲP|& 0$͈ Ъ[4"oɢ]gJxؠвJ0R4igp]p6&brh?3dd{|Ϯy!W6;2#Xm;Mo9|̡P_C>Rom6p|M,LW5`ԾR:>3\o, 8Zԁ!sp %Cm^%'p`Дf,4k2@ !`H!\<jfBlVI5]l̍(D?4~X?2>sLP39#ҿ 7 tq X `ךf&}spN⿫6/(OvytLW~j͡D*~kri[mm)ush]\Z[[Nk*hH /'}kCZN=K}>}Tp~8JB>'Ml4I͚Ia)6e,42@ !`HCģ%\VNQfἭ*W젷*] X bǗ~M:h1cs_މ :1{ۍ3 'G#sec IsȇЧNrf{}; ]1]:&d>sv4Φ5vO PFX6k˺ص #a<"1^9$Ŧ(݂d7p.@BDG]AϢ^L@]Nǥn(y7o. &G8Vh)*tdz؈yXm㴘#4?b@pNBԩpP@ B mGBY>?^^D{!WM<tC[8@Ú*٦`è ڷi Լ`)6LGYh@ !`HzX)Rn,8S@&|3 \vϐ0ݍYtn7@NovLfm1z$$!'{m8Oq(54(ayQON跣rurl`? τCԺ|t,k@hO a|.ݰ:gPoC~*_`۰Et,4 0@K bC9"{+a7 T: Mw;Ncvlj#b[\x{EgNȉX\Eĝh*JPx;ư' Ѷ i|_GK4KrM%aeeӬ4]YWNvC#́س~!ULy ׀lbSlәt}@  t&(7w9g;nvCF*;]9Nz vyp#n pxLQ|:uЩ#ǘN~~taoEtx`q@$>Iג5lbSlՙd'p'.@BH9wn onn8>AhtC*]OwÍ;O5Əٷ` EsiQ#jGSI] "~POx1*bx/.z㎋&6j!; : ,6Fqt&{{t0@n, n,_ ¸;Uu\\>G Mw"`$ Ӫ+y;,,}+Avy`')"P "zcsQ[TA UQ>zqu+%-TK`;o[K{hwaU3@z;hg6ݹn[M;Χޅԩ R)v\xi~ʧ{\pRBX[\3$vӆ2PM+*zgI*65ssw*aXE\QIMQl; %x60R1?8}r"2ƊnK F&AB'wUwTe 0ԥY~^lx7f7OvUsIZ3 ,^7P:ʺ:?IUv&y_=tx#_60"7}I9{_}Z0@ZxQL/d .@BH:SOXf\}5y[ϧmE!_K Cyv ѭө)YMI MJ\qâ_Y' mcҎŦ(Ӆbrl^M ] Xwq]Ɲ*8^]. /;[KkJB\#ݢ~yF0::Ӄ먭bHqpꨚI{[K} H 87[hYeY/;(\Ŧ(Sba\x@ !` fk9)3Jɤ>< Ʀ,Z[:6̙nʭYjlzki}ݜP$;4 b^gKΪۏ Oꨵ|0R}?WxhAE'3'DOa&ޝtdml{KhQB[4a)6TXEH60z8_ަK~ j uo*y#`ﳝphڹ1ǿzn6- f'c}Y]gOg;O,Ez Ek`ؠ(> Dg}qyqO_9@@*bX@d;.@B_ F0l@ߋ`QQLE9b)7H7 C@h.jٽ+jmTߓDy1Q9]4p׊z°? H,4%"?ɞG"`$ $gϥ4vauQ<㖈+)r]J)d,1~ɢ^99HO}(.DC0-2dab))F=EHIE3ݰTP[fJ Soߠ9ha__2o gSA@uJ* 6?0gye1 ?Ss?T]u4X5bš8 MIPvF@ !`$Igސgu& f@L,\6NvP' O|ͱA1C8 MOɼɞ@  zeNS6'Wlp<&hpC[M~HD+O8Tb? Xh߮DҞ?{Hv"b#vC6b7F(!-WF6e 򮫪}wuy i3O(Wš 9!F3)iwx=@& L܈_tu&=\7E: 2gVi`0wGim|90ss>&ԆXc^Jy(l*~2 P"_hVT=.R7E:Z扢A=z8E ހ6uybԌ~wzF ڡg{ @je QwHwYdO7E:  t)Qi1 ahM˥0/@3M O8;\$Eq*9!HXdc3ۻ g|jw Y\MP n-d׃( @je wHS(DZ"af 鎃Z1/6n?,p"Pdg7E:  {bSH@)R"{\rȾ)AA @je ,,p@Eע+7l}jyk%P˟-^Xi|}!yY=8Y ۫to|-ߋc1YkdvLxhſ?YŹ΄P9M }͡To{~FV=ҕg\ B2~I}Yq3d *V%zM OhE *NyL}Q)k"z(6>sPN1L6W`"AqF=} & & c3rև5f L}l#ntTV .|/0gn'AT"A!TR+dE(&dAGP=/7X7sb&?sSg<~fn.k2l4.X'b-ئT@Š>fdy#Km 3bdf~ TR+dC(Ci0oߔ BEZ~DЊY#`-ӧjuY1 κN6`[M6bkH5D#?YŮf>~f_<<+1 |uGf}nXi8ӏ@n'e׽Y 7IoG>TR+dB(DI0Rh8"{|-?_Dof0Ȭ/.¿_*ؿs~?3\y1rk vA*"}`SH@8X(mDƉNK=3\yz3ۿ1K+hO/\ 6pɋq%$1|gkeׅ( uk>;aʦgWu}b#agc_˾:X7"}=v2"Pa6q~q"BE`WZ80%q&e /8d.F>þ3금ee ~$ 0\y8xLYD6[1e\OJOCф|t"\߁ԟsz mGMLP bΨ_VxE:66+p(.P',xA ta l@Q,fPVΦ}+ĉׄK>oZ 7aUc!SA8? [7Êm¶Z}}}hqlDo*0ڇ} `uʓQ8x ЊP#Xտ{s+G!xW{O ˯Ͻ֜YdTÔKڌ=n.wrut)!}׭K;aɼ@Ɵ vbA(b67XNDȾ.,?_D SiO-eo9 Lc蕷D -nhâl5گmOa+UB0_a߹, '"Td_/f_bU4Yu𸝞`d}Y[3c xS5Ԯ1?1\Ov5rRv`=ac26ܯ=/%t<pb  Ce.U0l>{fx_ V]G:t뮅eAXNIq}<]xG],yxRPWùc܈`| =z|&\hܿy ,{a _eBm\o3 W:]=-DB!X$DiMeQ۝P}X~zf3Et2s0sVFRBؗاط׹C.s+joK2`q@WNFtKo] 0`ב wjiO2"#Da`G>f"/O M /gٿki><,iD2dcEL8v4d?kG_Љ<`BT?qa=XP#?-NLuKmYq,]G3~2@( b4}鲨NFȾV,?_r`1`7y:HݡdX}z5ߟгB R#*x&>h@\;6!nhgU"Lh4%`=膅pHZrB4*Ŀj^\X}vE7-Uƅ B EHE]2eQ{P}X~ f׉y NvIpgF}97Í}ł<Z[u d1}\|_=fl(P`a]{|Y~wӯj!yo*GWCpNtm]=L 6(&>H}|uHcv]ބS!oӍp[]b챯J2#X^)QLI겨NFȾn,3a6 _Y &3#6.&oYPidžړCM0\zܘfǁ wn=CGQx;? Ac.#_2Wmӟ1uf nl64 u?_Sfu&ۆdbglK (صT ͈`[p#i`_-d%E( =(&ڗ(eQ;P}X~-R0Iqaԑ&V)QZh%n6]1qSBib)eb[,42enj,Дb Кlz` if.8/̊B@,VXdm4L30|'<<Ҏ ߇dl5Y#N K3L&fߚ쁥r3!vN t+AQ2bȓRuYF'#Td_?_t3>wH=Q.jUyH:lcd.}@"2b[StϢBTW x'Ú[:zK+R uUI3VoI?4_?|+Խ=#Yb L筂67 w6s9Erbm&{I+ \_=/0ۮ2N/Xe}} C2 XP3]אd/Y2KaoF sNkBb.mg, Wznte]o54p뤯S'C]e2kE*wadU\=&OK|?m>|g?h?hz.kVml VxW\s=|Ѱ܄ZB 7pBlT6x{=,wn4jJ62#XĝP2հ]בץ?kL0p=:;5T~3z2Xbnlc.myYXj{'e1TE2n> rO00X0PDWI6-9`9 l.e{y ~ pt;+F2>WMs w3G` X: '&\?%$wVᨧNu¼W_X,;pu+"lܸ `{V2 BQTb#A{3ˢv9"Zg>6LQҿb} w_`cmrԥ+_/~8ѩD">Tb 8󏠸B)yҳ o1jNx?Sn}ul;Fe`Q,uvFq "ˢ69"zTС&E[ hB}4c &14^9n۔/DH&)bӳ WxVJ5@!!DT3ǚ1d6WLXn> 4'K>^h5P 2v6urnV Hfϙ6gbb^ҘdEA( :'JeQ{P}MY~?,D;5zwbomTѾEZjX:IqSަ|Pg@(*?#uѐEv s76*c]zT Y 9/A`<:nP?zS^qɰ^AEzU/fG6Ʒы [ltQ/h 02Bn^܁ϲkL%LXӊ rbsK]וi4.J*:BɵI wwL.= %9{KQs3Qg'AL_6hjN36NHp~燛Xa\ym=1<QHoK.p,_z%}_+п/O~i/^yʹ篤o/afE dp]+Xm[a 0Ά f&o2#M0i _Oķ]ど@&|F1no8ľ0ɉ ܸk.yH< b2bMKA_ss@X`Q,rNn]ז*{lL.=cX`9i9_^-,&{>lD@z{ |Uտ]F/L'-HMpWNcF@ǬO;?֏Ͼ-^ǿ ӟiß<2"s[J191`7wӓq`;Hʰr#w<Ю׉7orM~/@X`Q,qNFq eQP}}Y~R3 rS-{i LnpFLw}Vw#)&i/{j!/] v0\ۑ LL+7~Oֈ3 7l F<3}Y҃;P ^LV]G܀Gބ(|S0fm%u=Lx-뗓;t27 @a EHKX8.dkk9$xYn!B>IH( bx&(p&:t&lEPhET_tW=mwwn$dܺNc}}Y(!2,E­Q\łpYTo'#Td_k_S ^i҉P{b pL԰t+1pSl u9d9ۻj`̒b9~z= *@>.<vJ7BhK4NuV*ENU(ٷCVDoX2DDz!R j=LK\আ<cy {uPDkU܈1QKF`t$G\_8kL!⯁X_rW@@Q,o(Z*5˯&fL5hr&vWF%0aؘ$2 7um0ÅI~}`*"ƺ"X]e#`":„> bgE{Y'6QΌoTvs ~&)73h4Z53ޯk!zXהT&Lgyt Y_aَxF{9Vdy#P[9LC-Vۉכ,C;19=bJ%)<|lpp0M]zr&S, {{2\fuA ?TW/.#c<&nN0ԵodF3@Ϡ.= E]O<'GuY? :_DwiIgsF%n ;_p:7 ^LuWpo/1 A/B-Sf:bljDm~h+ܼ!%0|׳=z "/bhɒ瘨:;"^i6/Iϖ4|? O] ,u3ԥ!SfבPG"J"r̕pXs_}>ݘUtǓ5@gOuho)`5&RW9<@v[rcf֛./-om.fI+?wx_J;{g4}] d}5׵skL@IS*b<g[X aX `I (łP\&K+Dd#i֝ΎF h<%;]iH9Y-U L_#J\gWbᆄd6& 4O.gWz5uͣn g3G2|koր}!=/oFJE3@+<}dg_ieƍm=eLn˫3KW2!bXD"86jNDȾ, f~bUEK :N8f. F(:!pA0{\߁A13pYULt{ߕP묂(a`gdJ2-~xY#M?+J_{8SYI@R 8<s?,w OQxM @aX,*Ube=P}Y~=$3<.*l(.\ے ,u3ԥ?u{TZr鏋%U hh6W' wXxqN6wB@Eڥיgg?٦+׬Ki5B.~m'~<߬s_ÿ}35-ym`f;YqG)̿ )bH#gNBȾ-Wm̶fV3ya'IPevo .u< negX7.W1i`ś y] Mq2rMc`tog3ali~-E謯6&5AÇ>F@zҿqD Ţ=\TX`B<i?sbg}EaC (ŢȍⲦȨ*I˯iOm.->Z˾i)ccc:7u)8C v1u46f1/d?rh͐Gu#;Bjv$A awe?a˿2%q)#- lD*1F /2o|5Fͷ)df1ԎM$n*2‰sk܋ n~2Juј0\Xgj`mڎ}}}%|*l}99,[ \-x?`+ޑfzo|}Adjc$3 !H XD?"*O˯l|D[Iyێs<8VDl cjpS/n;`PGtNW'gZ9 R_8& A5mF3}{Nye8;aB~s;. cgs<|3 =dJ L(P/"@2`Q,`D(FȾF-旂xQ i siO̮X%1ԎM hWI:訂;L<. ۂmRۇm͔(w+Z U;wz1h j2p&E`['t"H_)ju"@2QX$P\P}Z~uuR+lp" ЊJu&ǰTZv>۟#?5S"}=kq}4\&lNls%)o/gL/GFM.{z5{G J_ˍU4 w4m8~46[yrl3zn,Q:m †PQQ<x]g׫b1o%v&5 vL n}&@!knF[;jc!+IJˬA4\6l^l;H$vŁ3Yo5.H߹z }!Γ=wiu/XTȣMz`IImF+h<lh?u`n݇1ZFl&Q lHESdCqP}Z=0P񶺝Y2kO :N8f|+@615>PltP cׅ3Ā6$I&Q$"-mdm=^_䢠FX<յtg!/õin,u;x^nKMvHhKA |kc) H_BaC0,J(=|]W׮s~w6ʬϭKNfa:N8f8v81=7ҙ O ךy8q/\,jY_G(v1DXJImƶk(c%٘Sx{o̭N9kk`s,zkҩ4o÷3gq)M,yZ X8NkghXƜ †PAY<!eȮl@ .P +Ed@m P;o,6;8Yjn~`î\胊lL.l;`}}+4@=o^-s-sž>Gʮ!:ҽ7 |N"rƕ1 h(ER,H d6 2&Ϣ)zFȾ-~P xGU*\p;a{ cvLE i>-v\6.:qnYjl|LĺEQ22D@ʍ 3w/s7#+3\V=zfڬ?_Θ#0ܡ#I$ †PY<aWz]'״Zj8T 7-€m8ᘩc>`3lcma٘^#.׿cū}2.KS[ck1ű1ƱVs.ks\ģ契<.?K&h\E5ʅ †PY|ԺD pm{V` _ _b md6 2"HV"+TRk(ddv CaC(#( JDq Td_E5e߰ ؐ@؅xe.~ܽn^=ſR ]!$]d6 2#ϢRt⟊@}ME^g߰LQ J3QLzNn\6%o_kpqyG,u* 6N!Pk~[(C,K8%H۪Ⱦ= Fsd߬@ uqs!lN_ޅLk[G0fBȏŠ1{ Pa_ gd)y%_$mQd_EH0#2D'!rNZn^9~:ܻqn]8KzpvnM(h_ 鮃f28ƑRB@gQ\*A_j}AD,^Kq1"k?2i)[wgSBkf;C{ Y}uHgDݰTLg|nn,8wH2ͯ55(q (5 2'ϢVĿ"-wXHy1">Ğ HgSBLgӾ&adTy%_$KRd_%NHϸAϹ14[uב(:a3ސ&n:znC/e?s`~_>^g JE~Ϗz9/g|iT?E_nS "ϢYQkS!AfP#] I w_n]͜ p,DF]h+@goPǗe@`Ӂ6v1pg6pSq0,K%HȾ&}H!h2Z8ѐ+ؙ9'uݽ&/.Eou|s X 5rQk[ &^e? G.ذ9jztHs-ef+l5Ίh"s< w#.kziwj!ɳ(. oY}ʆ t(9?Z&[jᔷ= gl7h\`b2c[ [fVx8x`*_izor s~)MOu4(Ӊx ~fl=044K=*wLEqE_GHe$ p6G5cxPA%o^Gw_,,?0uk>;Q%Bpx;+@k.)Rԓ BT7*UB} B3-uic'EC`=;1}i6z\>fsB+= E`3<6>6 ?6>\ _2A@s@ 8:6%1 b@(W?!2(>ߝ>Y{24X WT|7Pȿͱ.,;ON+gNÏ26/ ¢7}KTlE`kE|xMo A}dLE`` G6K ")Ċb%H% "S4HH%ǵvYog2֛VsS-</2>3ܟ˶]P@+a-@=\zO_Z}'P vX&ρ B/ Ċb%1]dW  2X:VpclpVsW(1޼Ͼ%#`-_f \|exCC0# ge#k䭆ظ?VZ6'C]wφ@@E)%2La_  &i#h9h0\e/ -j ӍD0>mާ''*;39{P_V`WohV5 o_'z'M5VYq[ (J.A(dQғYu5+&(͆E9B=/q$|sb<4ą˃𭩩t4pBЕھL|Cwro!t dND(Eb  OЮѸq_g*{}9-@ @Q(~+e>_g@AadEeDMp*"*3zE)..N3jۃެa>v ^ E}iÿrWߗ "pNjeNM;y3Z#ZclY1 ;׵W{~J VBdRD\(.EyB82(I_GڃP;{S&Ia7>7N!Cg3$ä' gsѣc|sr2=B? /ywm_j IgΗXe~5h* ơnP@IEa^0/JpL,  A/>N:za_ 6DiO-ncDx{UNavuF* fDy u".,~k9NFΌu@O}G'݂b?}McwnΉQ2 l@Q(+e>/AA1oفz\}+}N bc<ڲz{fX %㬿g {rH'ӎ}g:7i]/I Rkf4yIqmu19ĥ wIGkֺrk*XUA7=fk@!@Q(e>gBA w="h >Ά쓝]3"DAK*Cc(Lq6%ʄ̌N wFn)HMńu:HGb8h]'C{aU]fm0}Ȕpw' Lo?:/o`Ŋ[bk?wiuc{~,q—OcaGI  Q$+d}΅  >v6mn\{ҡy0Y_oe*Z Xg8,,y0S#i6/cF{/ e=w82СFR㞤lL$/v[˦ Gn\d# 6'C9C A91£6Z˛ 7.[Wv]v~ .oE|d.•*\X>N;vdawAdXqC–@@Q( eِ@D`y72Z`ߩ@$`فKR+uQ ??2&ڿ6:jz?B;ǏÃ=#lb M$3Ү9/kރ9r >q*<ܺƄ_ǝ:aBo#c—3&3|Zc㡔 rmo&qa;kH"d!P"rAq cO82(;f?u&DݭiaC]>3GFޕ9KTṟ4 b##i["5[2Z~=>0*7Kt~֩l.f0m^}mc&XKlĎqPgܼS Y  %DAB\n(."{ CA>D"|F]r@N$- y9 Y_=O&{D+Y NN<‚adf 7gg׾oF3+&yOvF,yk@΋RSg:Ɣu72Zj.{eQo2 ֵک`cNj"'3wMl](~jv(jX;GYn uQТ}qi};\W5xaZ2|?4¤=ѷǼR(n!:PއH2ͱn0=61^]!"h`=6.X 7²}5*X> /gdEE(m7c=nDCA=GI;\cp?Spq A%1K(G $ggR x LT6i׎7 4}xGfsi̚ +YRk^&^=a n#lr`O=Ɗw&DdQ1&5\ ~V+s{깐ږXfb176!vDz,9W `Q,vAV"{ʀ JFQ'p3{P}$f/v;T!}39fQ j'##}!`3FTd;`/ ;'N=j⿜Q x &͐9<=A?&L=-KT$(2.,Ů}8H=μ ~cPM z)]..|lc9 owÂ@X(edigZ=ND@ARgm4bh#uFjߥ%n/&ph5.0ڍJ_,F*/p~`*_?ݥA4F>c] 5񶫑hhĥ3O`Nx~!Kep1h8wjτ LWw` w͔-\%D,"\J6!* 2J<7@ imLfX=%bFlF{[R6*R4 gȰl}&2< = oDր_1|.F,~`G za)А0< <6Vm[yR;lqI07@l2Cd0wcf׸TBAT h_  [)Ԣ:qP[f##04qەbJB=4d)2-8h?ꃗR'Ol!6gJ#%9hIzhT&veg1l:]6;7ۍx`5P %K' 6b. 8EP dx=DeBA!ۢ{NTr`[ FZ`416뫇؀Fn|_ u6l@kN1PM/ v,BYZ|=pŸ ֧ MYs Z~|gn\II y4mƦ8& C_2m 2"`Q,Fhq *2Mc"ɫ7F[aEuhG#58U>덛"B6fS)4>M|ixȴ%ދ7 'Z VÍ|?IhSUp N{8ݟKPJXWr9[B f_ g o$~>쁵`pF Og0Zw "F96 =EP EAl ¦g5Ӟ:{ֽ58^g5NMg'ˡ85+dz쵞YeE@.[/L騀&Y.Ug|2f0Rn-J/! IN'h VU:;7{pÝ +jHݪAf dD:EP["NdakD0peLsηܲÀ38Lvw]ɷ3ՆPms1'|?/=sg70:Dà}0ٝO]jo\Eu.hDٹ[޾rAgh"`2g U$g20 n-iQH+  ,*o@ ֬6ez>F0hMp{[ n0O5LJOb<9-$lD)7F#tU+k+B#h\EB }n_MD LW4XlS`b6Z^AAdF(BQD*. B l kEތnz7:T0!bP&lqf{SbC Fߑxi`>?Ep v^FYp0"ĿM v.\:"X n 2!P"z3(f+)? 2p$(reס4F[ xt@1w|iCz݇jە$]pNya[ QDp7io ULo 2["P"L(f+' "dAEŶ3jB=uمcmo( Omn8ҕ|?߆P^Ŵ5sŞ{!@Q(SQVJvD6  (|fgyn9_\Q0d9ؐaqHy/U+<oI9rаk6LdPԯ2-e2[#P"~ledA Np (-]_c,Mh7gu&@W-mU6 ׿GL{j _=o1(LǼ-p8ɹ RY /Je! (:jF}@D[{)ᶏH؟쬁U\ ~6D{|B. ^/*dDEߪ"{<oQXpEjۺ9$ HCN ǡM'h.P-xlxi /9U%{{҅ƽ\tէT[jv@I9V׬<ڴjkWnؼzN8ڼf^kW73On:s{(0l$,LeolC~2e3NzpT.^EuGŧO;j gW֟^pފu6=o9X],VWmZylu͊k-/ HOl$-LeolC2euk޶^ݟdEsXґ'J{޻w辻nvq[um7WmWT/=NЂkiA"$Z6T/#?^&Xw}֟9]4E% W/ߧpڕզlֳNqb?}T?|]:h`C+߽o[uB~-Hvl$/LeolC>3>8q^]rnu7U_WeE.oYvb.YMygT]Q/c]ue[V IʐӂDqZ&ѲSZvy?6aSkN[wժV̭._qBuyK{0z OwF6y8T<]wTx[{&p7\/l^= L/CN iSDFنj}g}pȭOH'zչK&,`xu%_@YFpն 8d"@$E][~zͧ3-ǐӂqZ&ѲOZvyEyP\ $pujl3~e kTw^[{޷\1`;ʍ{}޵z yn؂aiAr8h&P-O",IU_D_u/Ɲta#7ٿP \vꚳWׯ[V|AL-ͫ޳ǧO﹣ڴ5s.mSbJ|c׍q+0 :-H e`-{deQ%7U/(:E}[֞X]WUskVͫ:&>#`% O_.5.|]{n _ZI%\{+\Q].=ceuzܯڕ;[uie*6CN i[D&نj}i}sW>moWk [VͩnX}BߦUs /ΙGwx.S.|=KO[\eOkO⊕ /ꆁ7>IO??tU+>@ |\?[ė{Y^/6% pS,?z˲7/=z9Kg*kCyo_Yp޲xS^,( R|5? @6d EImݯFOrCXXx-oxC4p%>|o:gI1 sŀd+ duZf c-نj}k}5sW7uRuis+T 13ukFRعu%^0z Y= p㙧(0l$:lolC5=#XwJu.W>U,]EgI` R {֯Zx5K p'& 4aiAa6X {ZvyN 8ںvAui.3`K7k3V岋F'S8e|Yp;(8(]g2nX1@ :-Hڦ3~k6Tg#{uRum (WW]b~uY_ﮝյ\ppޒBD W..XnՁ7S˧!k,YpȢkVV>q"bWW^FaiAVa6X sZv_yMOT/XTtՍ?h27U_Uuoޱk{];w=K\Pk3Wϫ.ܘUw:vUO^w8ɊW ղpvބLo L_ poYP,9pkmǭ=▾] Ϫ?ܘNզ0pղEs2D ɛ:ȓ/-=fed3T6ٿ{z}vk^vauc>MFfE'UW*?nX:k匓8lCN 3э=o/P-/g'YR]_\r^?~U?x!{xz}޼v~i.,6G~ժ+V,>KVR;ե u8,CN 3̆elC77sW[̫_ީ#ł̯Yql愒öEյ/>E q(潺ly=͟Th$v3Mg?L~_نj}p}:;Yo¶~`n {%O` ?x]u`jөon^ݴnqu.Y܅o^t\4ZWf4D : o)P-_g'M(w\2'ڴjө.M(5 Y=$s漲dP :-HfD[6T#z#U[Vϭ]y\uݚu/nՍo^^MwƳjo;zWۯX_rcu՗TwlzűS`"ʽ p濺Z75չP{9s_Y]1P0h$sEgB{db-deǑd)ׯ]X]SYy\u"TZlYu|ߦx5M+9ibI:zTOz]i@GoxZ@ӂDnL`LelC>9>7gq-r'g~Y'W7u'8P>5 _;rz1.kO`{z֢rV̭8uA?9' @a$nL`elC~9~sh#?G[{RSJb۹K nS l$p]P-;lC92{Z5?a0K :-HިutO=yˎ=P-g' Wt҆}ymYhiAƾ:OeǝmOG[&,8M6)qp옳 ղvbˡ5_f+l)N^ `-;lC~;@vrŇɟ,7֙ČpeǚmwG~.N`I0Mu8)uԲ6T#? ELu8!ct:[vنj}x$(0bl)Nؓ ղ -H@Q`&:Sќ[vlنj}y$(0"l)Nh^g-;lC=sD P8Ll)Nz}[v<نjz$(p&:Sx3eǒmݷG~hA4F{mݿG~hA4F{mݿG~6d>X$ZgL"8wm-o7rN*>V7S6ݷ9_d'L*7OJ_eى%}phlZv_n<\n(7ORe &}p0IX~?e)9?d'S MuV$)-Nٹ!;Ѥ}J$[g,?yE?-Ny!;٤]HFg3"Gp#7Of7ڲf ;D3Oj7Ҳdڹ ;D@&:c-~-=`Lu\Fg$7d 0vH1d EaH3d :GvI5d &ܲ+'=h$³Mg߲#+==h$ųEgB{dL~ǓKh!ZLיH?nhuZ$T!=h$3Mg?8aHh!ZILљF>>^miA`F+ w:- 鑽:Y-mIlKR(kp~ lKpmnpW'Ç¿  ?~rυ_~=F{×—ß .?oj|3 _ ß ?l;؎8ضe.φ ϧOÃ[{Ã}_;M[%x{k> ^}.ŗRyM.P>Ka߄ 4Tpt>`hJrJ[p^}5^,+a]NKbpe4p-agW'N%q.IGWIJr\_ ի⯄ӫ’ΔǿP߆֫#0R "R/G/|W:J|W7Japgѫnǥ(vYx[XՅO KɽzH9W Y#eȋz,2;T)r>1Ų'Of6"Y#}bWO.ru^}zaXV\:\߫rqWWWOꫝe?PrIW_yTYիg~(E?ӫgtW(2̸)35 R(Rl,r,Rثg^e Tf]ҫeEYRYss9Og(OfE?Jc;zrũ\.W^ޫAeIaYb(^ԫثbewz]2E\E+S˕2͸ RU/ |uLa.2Y 0}ieQ eJaQ&Zf-DYNR|l@[f>"efͽzQYQfMo)իEoRT3eM/ճ'=5,1s"{dFP3yLȔ+-KRk{ز&-ȯh˴r}JOZ+ܿЫ i? ʀ[tSɥ\_?}17W{+>ԫeQaQ ۷zǏezZWN+7-RD/RT/a)9SfI&gQf(4L>hA D4ݲRhA D(ĥ. C>%{p08A!'>!{P0 8/{@0J8+{0?/}4IJxS/{0U$G: D=$ʁAz@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@q~>3m=rc3ٱ> ݾqwdžchSw{l&T'0j}}g:~l{$%YG#X<%.d%A?sC?y^ޣls̕p pu7 ~^|}m}wq?z[xO`]7;v66%z<7=|?H`+`$~RX$޾>a{+m}?/b(]0]ggF 0e'"~t~OKsS'܏''%WPE{;X\?c0}0'ɒ`)(LT@ ˡNɕ@ Dwb0 `*RPL-I@ t*(>u#Ma^NdžׇWWC>/<7<;|_]-xr *<.|v$Ϗ^΋mv7wdž#Yc93#@3E@۳wg^,ǀ“pfxs \. WMᆰ-l{#3ï hYw7÷C ~7bzAk+?φ^d7p`{n-pIuᴰ4,Dž#ËzuQJzO3GbHTO۱;cXFR3t1H1__ҫϗۨ֫9m?ޫwv+[#ws.|t=z7|j/{l?Sgc@xvˌ'tI_ޫr$+zub~~W'%ի$?0~W'O//fꔤ}^R(/D#x)RqՅaIoOU=gFbI+m_,^͑^ӣ;/r<쟃~%J8Fg x E"-ذ_^N"2]zwBo w^`D$ qI˕ ̀Ĝ`PSxT Qπ(3ʌ{L^]t8WN),(3t/sIu]w2$ϞT2C$oFe?/\̴m0gdqM%W$YzJ:YW'%)S:?~WO: ^,(SUՒ1WTY eJYR vpWf, o DŽY8ӹx͍H..{%&2?}$iK&J!3Y"71/2#u@(FmoӋ$z:zRzȖd$7[0r$M_ճ~W)r@n% k0'W/)3Ja$<}gvv^ҿݎ+#[ #6Ɵo`1Z(Em_P|[o+˲KcS(FhY#e 0bQ5S1@@h@(#(d2vq>('EZ0 ك 8-QVd {`W فN D {P[ ɡN =/0ņ9I*f@`8Sh2'JRL=4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yL]vԴHd'}`4h7`:I@emx05@0u@0 Ky"Ix#Ht$@0 |gxjxz}G+ëñ0/,|^7x쏄W _^e|Ixax~x^9xVx gĞ)=(>`F+ ww:- :Y-mIlKR(kp~ lKpmnpW'Ç¿  ?~rυ_~=F{×—ß .?oj|3 _ ß ?l;؎8ضe.φ ϧOÃ[{Ã}_v;M[%x{k> n}.ŗRyM.P>Ka߄ МC+WUڒh$GWu't$eqXNu2]+æn ;:q*sI>CNJ2V㒨Zn%Enw$p8[/6n])R)Őҟ~9|[>zݺQݺQ ;ÎnwK?.Ep^.jXNֳG̑j)3F^ԭg!eJ)sNy)=8>hխDppLxmj0, [ur]P_ uڸ+߭w+ g2OUse$ ЭJ,3?g}W3:lԭgpa]SfܔeF)`sb)6sd9Wsf)^l3/J*.NE2,s)R,YʹVX`ѭG+Nv n\.SnO ˺ @n=n=\+Sl)*Z]\ieZ}ie sؖmH,R(P ,7)2k%rc(2,)3+nK̊2kxKn$-*ߦ,kzI=QQfi͈ك`ƺ{n dʕrť\y)W`TzMlY]ɖiuuexn}L[-S_W4ruOŸ je `)RT.woazDYQsQfYb((nGn= F[حgy)bz)O*PZ%}z!Nك`@;eRJ\=@F/}KhF h МكY _h^ȕ=Fȓ=Nz`@=D=r4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKv.;jJe_`xZ]K^1kcݕG^r=K/=+^?ScՑc,=v$=6dF-Ѽ96vGIcƾ?.=r|ZIGrxL_'S(;S~=syunj)1{bݥ6\Ҳ"}&*;}^J2/뮨͒p^ZђW]+W@xoA:fůu ҏ3q#O^vG:y=NTxb>+@s{}mۦOq^Si2'ʇN} =AXn_@`58&:lf$#}00Ն9IK@E`YuO^P&"}@'ǽ+PP%} {T)(L"dmQNJS@87 / / G o pB86>:r𸗅~*Dh '7؞wíaK*\:a]8-, qn](bb3HL_ EZo|$S'+ݺ_K|說u᷻ˏ؆ѯPi?~<<zw{0^[}ˏ|î%xY$?Sgc@xvˌ'tI_ޭr$+ub~~['%խw$?~;|['O7/fꔤ}^+`Q /<URx[/ Q 8C9:ݺ:,)<̮HLS"IreG,Ǽ9uoEr]J$[~䏖Ae݋_H]P5?[_A/SZ/gu)wdnxLtn=ßvDZ0WW,Ln=#ʒ2,_)KYJʌn= g:u򣎈nG eZ}O쮗[>?[ qYY-ŶG)}8;G]P2x@Q20/pE<\*W@$%(WDق0%i*rz&O9spc^.p^X95z)O9T \&qYzK "[ H62seG{kyV _) }\a\Cm}eңtO}ŋʱLF f @#,Ѳ pCPFP=| 0Z-1@@h pC8@ h pC8@h pڡh@;`o0@h pr@ ك Z0q+d(k`j sT ك `zh`LD@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yKh^z@м4/=yB#hYIENDB`teeworlds-0.6.2+dfsg/data/mapres/desert_mountains.png0000644000175000017500000005424712140200333021737 0ustar felixfelixPNG  IHDRXnIDATx]y.lCXGC!x_)ǟ-QXd!Hvd;8}]$[j-^*wˆMt@޷~{X+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~0+~p_}￞uG ko~Bc{i%IdWp;TX1! _,CXD齿z]c5+3wUp2 ` S1%6ԯ>o6X$w&}-b-~,WET@\֦vwb?V0ۍ) !H~7` @i}`N.9Uz1^c}R?.|@͋ۮ)ۉ+C G~"irIOQvPh>Qnvmf]Qz^R4HJ-֫t8+},}ym@*~GS~7KҼr}e J/X K JUI^1)}9-sջǻTݜ@[HsSw K J&:J]AsXǎU1'a-mzGbH"7d+}쇊]aY4\kq Nc6 <-Y9kuBҿ@Lqw+> +}~Xc,$cmzM߿$X_~|@?'>g?9BDž oqLL\kWݟ?}V7nwsٷ&`=&oo2s]a9~1~a~3cxw|cS@7c٥SÅ Ϗ 0Zrl#i;O &-[ɷ_E}_w?ݶ{ۋB/{9j`&m-5,,?֓A`1ҋd }`}~s @\2Zϑ_j#O}yU110` NH{ =ޕTzS&Qĕ sqX;;Owg9q9_> <$`t>%8muޘjQzwST&A gݥEeZ`^1G#??upӾܷx"-؟VHt >+b9ɏad'8 "՝jY~\NӭMd?sS:|@sQ3c*c U5(fl W8mh5A@>wx:gS[,=#}H?>isS9)竂 22`?j*&3FtM^kBWxizֿ鎧?:8~xυ4W@W*UǠw=V{¿F9UF dk֧tWjvw`?3܎x QEs[xM[#k(]Kű7?{xY|s0[m(KC;tS+LLYS?YF=z4#Քʺǧ>`p`[wi fsWw3ұoo]ǗƅGƲe=/n?lDAw ,=`P w~|sҹZ}>ew"ng#1gEMZ@ Ν~ Gi/68:Q͉39?x\\Q6W|f'o[#n< <@v:o*Ys]@mcu~4ؓ-8iSS!4'rUm2uGR2kuT'#L/NK ,_pږG}M CyU"\tx\:gF>=ڿv1(x.UΛ dz'o=ўſ9Va/8f]Vͥ]>@)4Pu&G}M7St\heY4?x|_}l| >L~뼩Oj@a YcOyM:ˇFeb `siBM߶s/yu\Pv -2Y7;d݂uT' 祿%0xtilo,"I)Djhbtۛͯ~ԭ68K@8w\>>`۳>*wQ^^3}n#A0*DjhAIY|Hkb\Ϟb59$:o*ߓZ{a 5^JǙt"g 7;T3X-כOމh-~n:8vFd=5鮥wk I0n kpq|зҷ|`TQ[HE\ux@kQ_4kW"s`A=6w_Ƴ}dpg8\g wߌ4Amڿ/[syLs& lH6Zj+ZN%9D{ޔN,R][[4X+JWXS+m)ePyLޓ+Nԗ#<{?˕ ۶Crw_ T #>3v:L^ފx>A^VѝOdtqd oӷMck$`]u-໸>W?%{!fzj]mD{>{"}F`@}teXuut?Tc*RO &t<^ch7 /Brm_|, SN w[OIb{c*ROte<="{/g`իU8JY/>1ᦖC29eH <:I qMұZ0 Np(RO6ƫ6q#* HYK{hI՜],#H>i| Huqs{OiF".,H;j>ztvH}\h.mQ+ 7{w MkrJ^oTF:"og3Q`|%`7l¶pptdjw=,mQ+krm=ퟔ/s!OXŚ ~]&fEllI `7l҆SgBЅ@0_85 Zj-ˇ &1OXŚ ~7"uw}H-_>;W?ר"&0]Λ tV#쌿 *?J-e.s,24."֦iMPEt &R6Ǯϯ͵/I?0G:o*Y3D0~pVBv_I=', 4[5A%ON|6wNi.S nݘ{;sW3nl~8%XM}:/~q XT fsR0Muh)ODpk gݶ&dpurvAXˡ[_٤[_}& ]`sdoi3a- J])'s"p *@U'[^W>Rξ)rGM׾藗jʳ6@Ie8~zSA_Exsոs~V{!.pW*ڻG D*H;/#XR^Z-w[kZ@ OW\֛ (M7/t2(pW*ڻG?.GF0RG?.~r 0Q`+XJ&OFϴ՗s.svpUF2G7!`#kOVWo2ó؇+<;mZi?w7tp\~JY%XM}B.J/*'79¦@̛ҵC6'rMjy'b :.Ξo)B}94_te~^RX͋JU>ww٫"ۻgoJrIpv'H.YjGHϿd"z~)Dte~_RX͋JHh /a޶te V;a$hﵳIwSt E/7k`Sktߥ0E}zynb![uH|˷w6|ͅ$6OqwLWiD-m(IR 8r+.M}\zPI6[d{lǥ\,x+aC^f ,#-˫uݞʽ(Hk6F5 z.J%˫}ڗyL{C+8*R_ ;_$LP  S齛ҵ~7"q**'Chf#EdYu.Yl?P6U69DJO5,}tM҉G4Kn]D_vb5uX5wlrq 6i1W}; -:€= fH3p)ۯC*V"!c7PSoUxe\0$@ գ%wm$*@(iܯC*6fhV05\uX#8b@`{Û%w{Qh忭b@O,#-^z ۶ !Rc [N?@um^ec\*j,ih^uH008Zl{GΦsSAc.Rc oWPYC7_=cTcǿjlSCe V;q |td~AV;2HU'(tqtW ]7Zs`Y%xtBUQ_>hs띸 ;N~яK8f(ӉX}Ҧ8 ,j:[ɹ,?M-[ĵo0`E>xءRGN*tna۟몂Z>e;y-@=(7#=~Z#&>(H ohcN\6[t{ mcX8t"5VAw o/o۔>gs.<Υ}PpZL>v7ExءRGN*L,m':pZ,Nv;.cAѭ}~M>"v@]F #KstA" aBՔn.UM l4Eśv׾@6_t{rToP._S^*d4`_͂!XM6"T@+<.=.}ӥ5W"pEwΚv>@ ]z{G&_f(8Դ הUKs u[I:֦AS+XӮt'ȴ ݢ;v#FTiޯ)+R_`:^T@ Ku탦Vj]ĵOVޑ}>TiWЯ)'R_`:n%@0yd>4@HӮtڧ>{Q6_|{~#}vvP]AH}YKwyimLwպh硋g- MOK9HW;mm탦RΉkŷgsxǾ}-ډkݻY6|6;XyNӔVZ) q ` iq>\]]e + mYz'}REiʊW+X@&@nUU"ȴ]omeXx.>hG>}vo>ӔVj.VP+t^>g <ҳ}`4^+t_|GoG\2ӔVP ^W` "By-~j|Ȧƺ!! o'N'D_jX|Hmj:B^PX:Io *k*ˇhus5Qdxm kҳR'H߯)'R[Z Ȥc{ dž"},\ n)M _OD5^_wo UkʈV+Zw2ދ AUPmMeb2FZ++}5IS_QEg9XBa"zOfVQUkʈV+Zw2׵.֌KuH`ZSY>$@;7[$/7ߚ)k#WPGM UXEHm&;u/Ֆw߹4+=.hݵf(5Lo:lt!(pŚq= |Hukڷt'󰊅T@z O} kʈVk+'g3pG5ڤ+=-uCr.EӚ*ݏgvlJ+cDj53 .8wu$YsmC ߹jMNjsv?WX7V[:(@nKZ )ˇhG^z\E?8EtSOae4j+XMs6L^OY>$H2(;#@2`m <9+Vzg՚v}:Dj}Y@NV6%tqǹI iSM)-,\Udxg|_בYzZ r>QD3y'5/Vgmy)-@N^ 2x[wt\jJj#jCLsEI锥Z00IAΘ".uV+F0Rmgқ#~Tגv|UxD .@ZĥECJj*ſH,=04HF J91(PE[Vo@oJǥllv߾ZwQ_RҔ.l#QJ S e J)Vf}:Ej^Y]ۢ]Ђ199,{-k,24HILxn#t#Hos78(ݦ|O" RWAdf_WZ7gC~*ȣfNϑxAmC+"x KII9t'qPP] vj!UV`+#uanR+9  k'ˇ͊r  A@=<?jigW[Z7g_S'Ȥ;Us5$ˇx1,-;a sJqw1P3U+Tlô{Ms9@:+ˇ  Hߚpwvaފ|˷KIm?njFnî+ Nl 9jP!354t>Qk̛2B-RWmù/2'^ 9ZPC "t;`3^[Gtׄ~ T}U+;ɯݤG%,2K@ٵK,lAn v8{xf|;I҅P\7Se nCS 8eE]dj\:~^ Ƥn{E&ˇ  H&L.`i ]ElK*0~J"uծ`e5.JX7P`L*G^s5N.=6+]Ll0g-RW &\V㢴]_ſ1u]#|Ȋw>sok }S\ݴ3-RW &ۜwb1"d;OJB}~1?VPCe!;6{T&}W6sȱ}NvzEޅJЍ`9rlsck)ˇ &~G{7[[ɱK0@?3,SθRH]ջ[3[4 s.Knin;eP|J_w*GtW9ׄhSVz<zeZ{oίM^rݾ=j3j*ˇ Yx1tl*=Ym\VigOWZ}˷ kk: 4M[Γ}`\WY>dmن;cF _8"+RW`.,FyQms9|΋5AHn!'^-XK]e/"WG?^f[#{͈/Ke؛m?^j+X8Q`vtWOXXB σDŽ1\al9L?azEji,\ @0 w.-fpKp<; dalE̶RH]X3 עvfWu۟qscxo>~G`<;tZ̵fHѮ}yT+X tEwzvy uU%Y>duK+H? Ռum?^zUyxN@5AVzSϣ(H 4It_\@5S}̠+RS պxhg쥍o*r},҃œ .va1v0]pl)T1B.GsӡW[[? 8lAZȍRڔ@;Rgdkm?nj+A~WJOsS{?>gXY$NrJ,SQc6q;Asִ3/R[U+ `V ZgcSO0><@pq&i_@@3`u &8x"y*1>~A6/Cϛ^0wU \8T<&B؝SئK6PFӤ>/R[;U:<{z|- PQV9kiơ6} \ G5)+m}K4cL.,mU1m?nyPA_X9o7j7fs!6l tEv~wXLR-]2`D.12HmUVin@[ȫoCgokՎߦZs/̺J`1]ǐM>\AV\E)v^O;~7fQU/yu47W ]-qkRs=S 0Hmau"V$؛GVyThS[8KTAppI`Ԥ fPMZ@];Z}€UxNs΢ }€g]͎-qJ57/OP8tĄxsu1Vٹׯ|ߖV7#,6'NXzPJ08[k)o<4L)V[mKu*{o=Koɟ>ަuZl#>@!@~c,ֺ|M0`0tTE53!7?{cw0M;~Xҵ1T X{r5?}ͽW]G R5UY˩$ܶ3/R[=9ƉH[\ޕyo|. [H\uZ-l'&ҁJ S MN/Ǿ|5󙎣DBfGHm"&jPeOyqN/yVVZ} &zTTzRV:/Js{#p3yxV7;ڙQ'R[tY,&#os. q3\CEXp@ TzRV‹tXJ3Yg70Uݶ/7Z',@'Xcڟ;Ko;s=Ju&)k4=}/x u MJZ ٶ~:pS|9Z#;\A纯I7}0 zt҃ԂuM%#]Ohpی1iu%5@c~8~G;Gg?']O t\A8kMxIpUzZVz/J3ۚ1&M`4 '1=-Xo:>/QwywQk<]] N=tԂ"vwz>dp۾o15'X`?U 0yIm/kj҂I> K o ?x};pԋ#/]yj3/*~Ǫvor ڻ&sq+45h~}y*-7Wzp(i` ] 25}5waѿWz|cYTV%'qPkYX}/kju~\:t* ~]K 5TOY~Zr~5C5'XMmHsrv=tB  fACWǧLKhU0>0I6̡H=-JE5]&5Ujr#էB^ptbīOO,*(  k0}}`ۗM ^'/ bM;QK16E΋ǥLb߿^HvS5hC"_ӗAa"?n{;DvluБ6LG.n/*=.\QJT;-Fe:77s(0]<Վxo[/BN <]}|R߿kC"_#J&X N.]u~PFz eS_tJOxFUQ JL[-BڜLXk9m<9OBtC!v}ϟ292\s'}t`4EwL7Lt&.UIwe5Rzԋݚ=XdS{ۻ joy.S^q[7y6} 5IlTݮ #\n?f_XO tGp4EqH'ַ_}v{(kiRՇIߏ(}؎OV[nOdԺMs4z5/j>ѓݜ`1} ydxvsY?zJ6c6|vꝩaͥ&d;~r|itWZPJ; JOҹ<2BJO.W[=QtT{ ݌}^':'8Vu6˾n_͔Fƫog[O1Nd_赆K_DJaBw) "oc!kv_oi!& #vٴ/FI?`}#±`! ]_wpP`*jt! 7pzax]ZUNH3@5p?N(@ZlD.zv_K^9 {JA*nQJlN*G EaB"?c_dJK8 v_sݾ '{UF{N 6coU.W3f3c5BgSIoyoR؀ PBҵ?KnO~~g?{U m8i&i)Hs?x m Ux FSUϫ6[d2>3%S+Q]5у [ !vi[KDWn+S=Nfg;&/NQS)8Q#OZ:Hrn u^|X}({igo 9ܴ3q*~J<4c2av-j#l Hu7^3X\-jˏ/U}>,HAdc /^v]ҖshAܱ&7+#'om_e'9_fۧC}ە~ZW;isky5,Y νsRMRO#&@s۾>ڿO}֦|xO@λ҆ysP[~l[6,?gݛi_~2w>Cǜ f7jm€y7owKLQ),*?8}я''mEX!JRGҾq w 7w^0ITw!:pZ& l }[ia`*@^IwMW ;|;KiFuq+6a uJ/K]?$`g=6,SPr;uyéMUCҴ/7MAU`;q]K-4;w!`*$x;DTt2=PAGEvA|Ej6Ko(}Ohkݻo~/.XXײW{+G0E׽7K}'`R6_恥97€h@E!V@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `XV@+  `X@ +~0+~0+~0{~-p?XIENDB`teeworlds-0.6.2+dfsg/data/mapres/desert_mountains2.png0000644000175000017500000002443212140200333022012 0ustar felixfelixPNG  IHDR(IDATx ܵ\qX2K#NI"1DWBޔJ2TR1ӡ1(29A]g{}>߷Oouֺs{Z׹"\v+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`|x+0^W>`| 5o|s1Ǖk.|us|Ksmjks͏7?TsjW7On=t>nμ#tS}qۛ75n^|"9ُ|N$'ϸB˲y}eԯG7KX{NXT_[|sru/Ա[w2 se.KX|CkwqW_ &0!(?ż#gWg?6C>cwٜf++~S}].I/5Qr`g/^G.:^ם?o.`YyckT}+[3$\1tvz(j%,kwuT5@7@98 X+ן5\YoQy/u8{yE~-c;)t;7 se3KXB;5@L{8'cgsƚawGu zth'*ּF~_=08邱h*_e[}]I;}qi~W^ B?qU%,OC;)_c5@*fOgި_OخZ;qU};ח se].M؍OƚתBI^1( q7qU&ƃC)ֵܶPW2u[j%\(8ۆ±hJQmn<.>k^ %=~%S]4X-\zfWE _:Rk=b8\zupy"g$ûM_0W4X:T_egR_W~=n.M-=8Ջ,o>d_OSB:;D 됏7q?-9k pNQm:]yF󅘷{zۖOΌQH}Qm@6X\W/"RSnNtxwk*]yLƀzTYY@wnQm^?(GzauoxGsvtythk 4j!zAw+;N%yz}gvk6G_k[7N|thk6eb3_#Xt_OhHQ]ج>kYCOTQ@y]+,c|q~g~I^]7t%l G6͏DLϳ6ǚz:Τã~M!|ܭJ_\zsJs_bD)ˢ?؞qIFC:g%Z~}Rs^??yI6yMGpsSۍse~ mju| Ԝ %O>Y?'D:|Gq]L&훫45]M-ޮ~`;wy!8ońoSoASܥysy~uhS˷W4_\(z1 XCڷD@sc3dyh6Vʮk,šm-R}}ח;psWD^bش=M_ Nf =/5M0.kkB?X}^\\uѿи^nܹ<#oslߍ¯h^՜76MW+gDwD}8tdUwc?7o޽o9|U웢v}|yxl*%ϑɹ8yFz1ѿ ="+psEN_9FFn|FHu;lBZzaq{4NSPx"lYsgG?G _}F͵`e ![vǨ`:?ޡKܼu5[CEoA_mj\󇣯g;fnNע_ymܷlcD4%X޲]}ۄMkٍ-wБ3C{&Bu"}tBMܼoC֍G7?Z=ߞF9?:?K<<-ϼYoD!ׅ ymgsTW8F~yx^TIc3?3ZT/̲.}g1o.&\+7 _Nݵ}k_k |fφ|C#?xyc^\=]ϻ M뫛A)76MyUZgE$7|,T旛b{ۢ :a)y^Uݣ+R離~a/~;!oB(3,u?6淎]>SѿU=$?xuiM|6G[gFߜǢ9Cz{|lfmR(o[E?&ow>%GMqhdNo<6U;M}w~[~?އD`s#C&<:C+Gѿ;y}9}>£Ɩ:yF>n4i<5awN>ǷB{[s?o\?6 K?NjD.-{r,ou˓G EA}iy[d^y`԰A^%`n\:-;ݣzjzyO~yzfϏ;MVS~ɻ|t!7:Qߌ?2s+Di?|Gs39 <4>!w,|S3yJl9{x'ogm6\Sf/\Pfi_onr|7<}?o΍|Or}k#y¾uCֹܱk%uX8`|xNƲLIENDB`teeworlds-0.6.2+dfsg/data/mapres/desert_sun.png0000644000175000017500000015502712140200333020525 0ustar felixfelixPNG  IHDRxIDATxyfmUIjsBvđ@AqBEOAID1a@e(AY#*Ñ(F1F &Fqw>>g]g?{gx׹_UC^{o76a._y0q0}`qQo0N&cž Աo0N&̋}?Ʃ`߀aMal{ бob3, c7`}aQ`煽o월  ycc&^yc߀a&80vЏ#zMmKϱwo1?$vmyc߿&1sϾ`C웠8Z1o1?_&̷8P\hagb7A?~};gS$` 8n~a>]"{ĮD]?&1sNϾ vA @ Qfb`b7A?~vpN&/%!}xsƜi`XG(ֳo1?;x}2_JsI~.x,wa8ؕ({gb7A?~ݔ!)C5~ݖ05 )0&6/}M qcgg&?z&PVFbߪ}CBaH,sEA %Ͼ 8n~ HFCޡ?;ؿQ~ P 8# D6A }qܘY/!}IC$_{3AS;xLKMD )qP Z`Apb`7ǍЏ9"9d?F-FKB/I޽?- 9vu`B 0# -*M qcg9pSҟ!!K$_|&Eԗ:6nW?[ڿF~J!Q ,@CUZ` S!8X1}qܘx8|!9?t/oeF%g/$sHwx?_K__ߏ, `B8 ZPV s }qܘ)s:薐.}.ٗ$_Ef.bτ.I`j>Ç&>\Aˢ" ,rYVB )A]pPb`$b/A?~m~Y&1/o5}IKrg"YDQ>Ew@S_G_WGĪȢAB Y & 戂!AP ʖVM&as`Kku FSD/].BCÝ|Lmq.w)erǦNhXPH aa0&  W6i/oR1 8$7~y7^D_#gbEܵ:|bOjpON >@C'uq{)1!łBM \1(YUVؤ2`!`$A?_7{uۼ^xȯ$y|&L"q|z{4:3+Wڟ]}}{Ӣ  HKw^jPj#R0% 10Uش*``;A?с or_J*}[}&zn5grEܧ}|N5yJ3:뾗ы ό^,H(H$dPU 0(C@U ]VU h?B<8|&uMUW?s9_R>dmT%|3Sm>nnF"r7_ :<4a =N_Aы P@(Ł*-H[W AB Cb`IeB8~Na3q!m_#}e-?Q/Eݫ/続>mf,׭]R!7hji%K 6Ac{T>}o^@H4<8  U$gAdQ *w*A>2Pu@;D F -?$].#ْ~?uӗV-~d[}IzEC3E"/k_ +<;< ^]}'u_[*1EãbU(H$Ł 3DMZ%e@ՁU #1[V,bsrmm?n"}U}|d֣o57{*粽^%zn1uKE"sW5_k|]vÿNxL俣Gu_[WwߛDDC O^ qXŠBn'p+C W2w@bw# 4r(10T9U&!c̳d䠪춟"|/{{*g§-Q _7{*ss7yO7xHQ7vb!7xFg6j|s·$'*Ahw Tȭ(=2isgA v}M,헤 Q=|">o"|Ϸz{v׹:PjP H=~g3ESe}k_髴^>湏> 7|zs,^{z*gW^$$x{&L"pH{|_o~u?љ(=z?ᄋ^PHɜT?e'_#f0fqH_e}H2Hs9?~yr>n܈EK3J7tï%_~}!ʿm}=}7tׯĪpX"&6zaW(ȭ!A*An<+ S7?ŀ xgd$]Re@s2.*ffln X\=P/Y^qsۗO}5'gΜG{*떏M{Ȥ2>>ֈ>n"w=9~o%ouu,$j"&jXdQ#An|C #T2UW@Cu@n vsyA&i}W5'S>N%!xq2Q ouǤMZ.do3&_K3CĿw;KOLnKg   5 A?ՂRg%Ȃ@ށ\P@FB! J1iEIA qBrP5 ?X76+OR2nQnV/KjgKO8H7:eqM}LfOi;E5ϷKr/ ]$0xC/k(C Y$ WJaE/E_-x]V qBP@\Pww-*,n۹=]CB`݊8g &!c_UcmgK=盾z8u禨[JHy۽z>KgrϤ^HO4lڿf^JQ  ,$JqAZ+{ r`Lej.LX d19Md@ fv=8:!p }6|89s$1RQ:Uo?qdkV?@̥>7쌑/g2F۩n5"ɗ^_ n{+C Y$ 0\)(5A.wwA ʀ<s{EYUWw\AM|0[YkɂCB"D |6p.O9lKcƈ_{c}esnyӗ[?"})3Ff?DCD?D5b w˯?$JPC & r&'Ȃ@-U1}.PewI2/[)䝕])!ɁZk s`j?'lap/%ZrX+GƾuL_zOW}º,"|kd_kD_$!=%}PA) JAMm0$T!TPe@bwmH *;)eyjM0u:Η3e˥~E^iN~g~[|F'[,gϜsi#{,NWor}~9_5ʇ+:吤/'dc, g|/߭ѓ~˸'lj^v"!\R3wbט+ja0(EAY%ꀦ .swL*;ɻ;ʻWwwwYA yM@SJ!<:T,8gwɭܿs?Uab:QqWF%髼M_Ҿn*v#)#%${0&ObZ A;#߀\nNn!UxeTFO ր P( )i #},Vs|X_.gg?Иe?MrsQ_i}/t!I C3;n/#A1k7)WV/"|"1_:"a0R A\1P Nn@eU@BwY,) |F2+3s Y2 NjsXk~/OxEr|Wh R8o2fɢ/ }g3d#}JrϹgϷ9d?D{`D(5Q0T%(Av xjb@my4^i=1)Y.=;..+#r,g4 mW8gSC9u*ggN|e??h91I#WJTn~r_}n\rSf>ʶ"}H?? ׎ (LUKV@ `UiP d!g#J?`-056j>G|k?T]#}i?eE܊jOIUN~ч)ת|r_n?E!>\Q0B̩h@B"('ȆA d@6 g9|it0೛iՀ cpϺʇo[i\h!>wJU<ʇ_2>f/k}ʵc?tϳCU L VXRE@ dӠOwAUl"g&%F<1e[kt5 T>tKoC&?JrH?ʟJ~7o_>k}J2 K~햿+yO8oQ U@9Q a"Xa*qBPk G us5>s೨k 7XcpϺʇm\-g,9lc5*ODƟcįm_FHd/r?$0WB @8V^!!rE@BDn Q kL3gϜ&,*^P[V yjKr,XcrinO 1s/_&#7\'I 4lS_#|̟{_~.o/*K lKb rU {r{@' >|6T3+|lI=Hm>C&Wl8gDC5wo֏1H~ CQ8r?}~JOʙ3tW 2ys{5l51NelU jB4 Z|fsϒ)Y03|,iYPj{x,YP0cLL~ܟ?7$Mr_#},EQr\j~9?s zsnS_6HDz*ا dr{`hjϒ1 Y3g0!>|&lR mZ5 g,5Z8gsxP^S>!Vj~ƕ47EC~929!$/6Cu@ dL˼ӥO O I(PS4ybbn < Z@Ԣ$T8&;cp:/|C3_ӭ_i~n|FP+? Q)'Z)hs!!-k7L7,/)MljK|Yd`"gD%&G@ɂ|41TA>j U[ (D4 'j ΋^->e_ןo7EHٱZ *V9?_k7~/M}sncMgl_md10U(MO@"0೤@l>|6s~|eTvW7 O , rK`Ϗu^ʇdӒNl7L?#D2r.s-Hr~%m(-ᐫؗ}Ŧu - R%% f|s[@ˆ*VX!B|Ƶdhّ,ӳƋ]~0J_ʹ~sÿn8r8ՒLL,GyM9BbU<_+gc׹%%B4 Z,g!L>s| mM  m>I(s8CJ)EXY2W> S>sf)ۡe# Ϸ~Ef5֗G)P_עO<-M|̏UPv AC-~,YW>KsJen dFk0"s-9jmg$:O~RmVnoI늁%>7E_о>K|le|s[*Y>|FֶAyi 83K18_/o__ǼB}0(r3W~?ng7nrn*k;7Gs}bB`#|f,gI|/g`gn&I:y1)uÜ=38;Tk hJ`/?Ï9=K_KtO>?#_CP$dWOY$~ ~S澹2IXk`"೨ <-4A)?Zw07nG^&?rJg鯙LơcBf9J-gX-p=iIP>j533" [yJ```җnou__s璿B}x7eeӖ<ϭ?5W,Ʈ@('ʶд]-ೢI"U )Θڔ_   > _%N1_߯`syON |/S9+4.B)'YÙF9ʘѳ䅌`S_N|K}( <ןpKwܟc#}njmTFj (?dY e>|@ ;8+%[yJ(=\(鄀+k<;x:~>Zs󥜧PL?O'?ùύCL~*s#/%7}Qæ)ܶLZ28a΂lTxZ%j hJ@+Ǵ;cg Xyy71~?]u˟f| c/Ox+?g_moܟ}S( YgM-|U - ,єg Q }^^́ūŏGO.zJ F c3l-0 j Д2838;/@59Z(Y rVqfqv "8Z,|,xHphO-ݯ/pV|2}򧬧<ۯP(f7~auj@9) 9<3!gpf)˿,s3(KsoK>h 㐱j@92g:$`9%@xL/ _ggQ#'Q0rLP"-= %/NKȿX_>Hr_O.p>4~ksK{,e-<%PHphP6jB9>pE)?3/:et?>y.G뛓ej^1C[w_y,oæ& b! M (8H ̑93IAUYL<&U@6x,f>K^ͿLB˛DqO9O'\Konj@и`9%ࠚ/@9B8988QP" rig*s<[c0Yvȿo7EO+֗\m_+| Qo6T?[_0N xZ) ,shggS9&sE*<ϒ$6#\9O?y_c~Dp rO6ѻ˩~hu/1-a2j@%b8 f_́ b('j gWTVvgdn' gɋ_7U[%v'1FO2]TZjoqxt\(},9BX@"$ ^^m7Dp g Qy6->5ώ~̏.ܹ$pl+C>}q7`%0 @pp\Qr`9&ș٥Jggg*S /,*ϒmOFJA!\C }W/)]rIyy\oqؤP r䭂2"Lp-3* ,LlSj`MpFnR dm,7oar`P3ވ -҄@"!0βJvX%"x,ҳ?=DOoscetEO c~|rPT߷~8^;%P伀l2Q0 0β,T j UT,.XRxH qvjP_K}믛EO?3k̯t/! tnK`X(+Q950W<hwX]%̙Y\^@ ltC{C~Z&fvs,3N1~0NKZḰyB3( rFqVQ ,Ll㌛j\>6"h0`pCL8zXkOF\烣t?>P6_c~J3(́yPY (mTj gYnMs.G{v[/E{JpKx<{.X[y)I^ ~rCeG7>@9bk}}p,B*A%BArlp"Y+A ݘʈwAngx_gXٟV3yof}Xal0 EBUYwpJpr.z\ xMV,?)olpwhf&>'V} Ces_&eoC0a<&(PJW srrrrrrrncwiIѓhլ+'-QϟunS }7 c śCYrb gq6rAz|g&g K'NV\?,3 95S{EOihwf?7>9/nm}q8u; )13Zg"g#g$g%g#=C9K9Ssd PF'B%Q1ISaH~ E~r^D;;oSo-g]0%؅ȉ 8Y%̙hJLNPvp  x&j@t8O:)8k2նq??)lσ}JBb?{y?zb2gˀabn; ͭ(,(/ ,,EF{vrJAA`x4ZoS?;6FT4ϸs$[) 67 ^}JsKo6́K9,HyЫ= 999#9+93TV<84'.ج?My܏U,rį = ~$Zm-k3 5c`@(o Dp&r6rF(7r*#3339}!'+87dj_\d X ft/w//bz>qئh<>@2(3e`f<0OpskqLٜCN`0_N#2R,VSϢݽ=oyb 88888nDr<3[bu2S`^ęٜR~riɵNJ,-9O{4o ~x1e {S#?V% 8T 9[988$,E@ ,ぜ2r&s6sF}R g8gy8V%X_7W?zQZO}_~]/Yg0NK988T +  +9s9{9999kIS~ < ]rN? (5j*,k9o_1MN3 071&@E@&8;-̽Y@89SGxܾ;t/e<7a,!p"')旾6(ڌ9_~ Qįoa2T8$289#x g(+9S9[9c9k338'f?@^8Op`/8J9_}T<#Z =*YnZpcr 8ds285YʙAYX &rmԾVh]-K}2>?T!QJѦT_^Prt?4g7 X  S gLy2 P\0~b͜pv+33> 38 ųk#dHS'SY< ﯰ)mߟZ έVg倠rW@-`hcg/*4_fS!mˢO+~;#mOjI&0. L, juR9YYA0+ pU 5AS!2P"n1JpRFRqk#7by 8ulKnD/ 89kA' ymRCg/(C2QQ/sֿ() S8IUD_ST9S&0.戀Ay4lVg5g6gh `8A@΀;3X󤼣p"AHI8Ls1O9ac?@0 V+33V%m+Ѯo |t\p%Zn#rB "C! &n/o7tcԧrP21/*e<_ҿavt* Үrm 9&X@ZX #^~,ÁJ,c?"Ӫ_5GRL C5J?S6bTk~[YW0 аN+ P@P^ltm ̆@8\5X UNILgTC0AR0{l#BR3F?Od^K)Oo1rWT6 / eB h,kpXض?#+Ϗ6ьpWK_# R3*ƿZ 0c,%pP[,C g6eAT85' 7G_;TSr` *П|ϡ??R*=%qr-Ԩo̿Kaci+`,&* T8(!n# 슁C)sÁ^8ϑؠۿ}b?C]>S2Oƿ3val9c@zE'jܠ@8C8E^f ׉SKzeOE6G;"#'ՌggdCeq,;P 2R笧 ٯ@8 яpy[ wF0tm_&G}WryEP9fsa07 KC g:ghGpk,N-Gy[ U8%Gpx],ӗɑ9'؁Out'oV2"Ԫ_Laah*`, s3= WN CU8%Gg/ Wn1?6x9 y`.o/VPV.Z?a&@9ÕYϙ7 Q8#(HU8ij]UY̹~˅?E}QѶ24Ϸ0c*`!P^Z8Dp`- D@D(oc޿nkPloPp}VzAh۟BP  Ra?֭pv Yϙ_ W("X^8n-0PD uepio<|P "doD/Ccq*2_g@p" CU8n)'#ƿ2tko^C#}=ͽrd97tw0 c7cl挮md/ /@m"NGUMM<}:?J wnlc*SHj&MsGOo/RϜ 0v9UP3=qsEAZ %y"@Tr:6j"@U sp\IjsrX??(@b"Q(Co(?0CP8- Dp2NjU\.1n+GPROEL6N(!#{6aK C^z|y&(ᚼ)KW,U}$Owh+o˙(6\(!G"=gqX:8V`DySppFU,cORBݜ7R߈?$azjU(' M!9PU8M*8KU#R15?|lJ(ohS(eW:;0 c?0 06w).S8s8., کP/ ot>NGeoqXLM '#C#nQ΁{ NR<̀%A;oX _|)E]Ub4N*oVɽ,ף? RK{0a\4,(0{r:h938DUF_sf.#;13W)q ! _ G_0u1 AMj4Tn҆Z(ViV/$nK?Lv7ۈc ї뤤3T7a.DX&Ap iFjIyC wBຩ8??\^c%/?L)$V0mMshAI P M+/E+qVW%J!ZIII -+_ ɛ0 0 (  ) k )H*8 ô"n6\6>J+W**?9G& s7 8m3 w2N`]=4Vmp!@807ȇGFɧ_J+X> -P! vaX.&"4 ༜ '< żT$'Q2hRPZ2WS?^cq0 <4 @pE`8 ipi9P*/?J&P^Rʣ-|MY˘WRDC~a>CnqvE0G"eph9NZq}HN{rah4GiQ 8ވg 0.֙Њr Ê`8"8 WYpq `N*N}N>.E;AODe(h%HdCwn0 15 0[ktp@D?xs>(B8Q>rP|*ym=e=J+ZCEGۓZka6L+kѧIਜ r |mC{޵3:AGGSaKc Cyϫ 06@^6@ AyPˁ, 4x9Z(-F?z'BO $.?-)(? 0 0 Њ`NgS5'Mp\g=6Z>;Zn:mT, 0W/j=F$O/neTX@J.Y@2Xy0 bcN΀;r* >Pˁ"Qpwapp퀗DZ@Y؍XǼ?@y_|\=z%wB T&F/wGۓQn0ˁkv@z\'Mp3gs-).܋`BSh#?F/g$ ߍW߾_J0 |0gEp)p q@ ^X`^8 0g/f%\z/^dދD4a5,K5e,0T< ?=gҌlYa\\,K4퀊 <|-mr@R^]eJP$ \<8Lyp;nPx{Pfg\*oD??o7 øXȱ}pK*8K> P{Tvnu03HXD;0 X`5e9,28^Gn,p 9@ v#+@7G3H? z+/2 01@9<8Eyp #{0N-u 7p.@6NQ PgyYJz)*Ŝa!, h/F@8 R @ p\a~_g1A )m)@`B/S+1Qoa a P[pA 7Β.6pݒ@ X`;`?yʄ*`BOE,oa,{$@G@b plD<<6@@HH& ' HE@ 0!(hGF@8ij1pcWf]  0 0N$pP$0WYLaiqLy-'\It'?Lw0;DGkN0VA0-7fa֝`NbPpu-p1 xh9.N< Ii# XIkE$_Yy&JP0 jౝp%N8웣 i'( K(&vH GC 5.J;40 0Ŕ@;$@m'h4 inv DKrCRsGy FxDcd|@ܔUu#a&Xw'\'q9*8 ȳ4 ypFD+@`o`(\- A0AH$` @@ 0 0ź;"8IK*-R rnHppGkYY= @ znT2- \O2FJܕr P 0 c&JhNR F,FY 1 qp‰+̝ouD=rA($Y QPsD1VcuavpM-'MV@8L[|) rYYeֶBhP@ksMц182'ɼ-+团 0 c,Y h.BMV@8ˬqp^@NT\;Y K@2k= B`NyI&^%+80 %.8 .6p!7"ʜd-2/xa5 (`E;'I3G5d0f-} aR 8E["8IZ`8ZqZ`.PPHB(@kk!@=#0yK M(9J2HdRr G 0M07 `l-0\g]p\p_> K€Z` dlS!@e) "H17.eB$YJIx a-i-,i <.\B8n#ֲRxDR D Hm J)0Oy= T3 0M07 a@pza@peDJ)z/ѱ*eE/^r%v| 0 c[+7SO~4/ w4~5a`alKNjEYpipW6x|G}pFˉp# W™p'U'!e~h w~9Ooh'oK|MKJ`~)Va`&@8.*8G0 N۲B8n}a`al)\ , 4 + -ޥH΄;5@85/:X7k nhi%v# q?+/ [aK1'p`J{krFF c|7ۼo8o^ ʕw~xmk# i?8 0 XKbUpVeHV %H̕; \R\0{B D-zUKU 7E/< 0 Ĝ,`)#N8N1p \'E@;+># }n`9WD_wvD€VVÀ 0u07p#ZNR \@8` )8pXphS`{%7〙[,8u?@ NxyK0ߊU$P}aj, G!@pBW 1pb8N)DÅGf*W0@@a@Dp8`@T Ȅ) DH\$asG@NR\ 8 .S y7$*  G` rpM@rE| >(} $() h+(€pc: 0 Xd(NR\ 8 qpB@P)p$\ 8ZCa@4@4@#$ J)0Oy=J1v0 0 c 9@ gI:p\ 898.T 9[؅x|ÀP@HFbh|QsS|%cdva@(I 0 cs@T\'i eaiW2@1CPJGC, @PG@`cעQ@gaĺLI$΂Eedmp\;#p \ Fs@[ ڵHnY @`yH (,F`I4 ȼ%7(`9 *a1 1y$UØjSG `@C gh`GFxsK26ASxc[⺼'Ias0e,&nDEpF p2vT\ &J2n- rPqv?{`Q#0( M0?Q@*5 XV@0 c],`2'ibØ`n 2HR#p(2hp`(p=2Q@"qG2'( dI*GdPk5 h`a#5I`P3@8<27‘e( ߼Z $2 Q@\OK7%`P[˵c6a%MZ g]Z@&:8B8n Z<$oC,ʣZ WuG2&q5ZפZ~ٛNXaKm#,-eW_|%Z΃@&Fتp`h-t?&wV@M䭀LV@ܔ R[xSO ``a+ϙ'Mp\y@8 n:MpF%k7;Zw~-0;h+ qC2I%IܔUeɸE^ qv)}ar@K0k &0 M[Y-P@ޥZ R Mh+ .I6&i).JZ tkKp_haź;4%@pYy &0u<-CF@ ܌ IEӣ0 Ø ! # \'MPp": 'f`@H` \q?H,"$>"Z(h{./0aD@aSX'H@2E)R0\&`-OPpm`+] !#vA!aWF@&(Z& $bA/F0 èan_@ p@p\gh9 .I]^ FZ"aF%@ZeWYpeປb2p'cp;%H{`#`^ L/Fx3a1 ( D@,$x7*DN$AZ>y50r5p7*>0 CX@Z pWYp28 n?G4¡^Wp)ڞ1C`Z L/T%z+,((0̀@ W 0.6,K6AIcT/ \x)wߥ(sW+H>`mC@yaF K)Z9p6M(K@pp \'V$p`aP ̀*lA! t1P~! 0T_SgA mi < % }r5p")eۓ0K@X[r=z9y `qqnmhi$ zfE#Nm ڏB"`-hf@n6< BPh1m6aĜs?5_.F]x28M:8oh \[]kt3| bKa L@,[}gx0 ߈~sIpSSn#JLm=xVK Y`DCyy/_w4 ø;7N( ΂hS?ȋr}]@cyI3y/>J3s}a\,,Sp \8Hk?\Z?84`j10 <` >Cs @ƱaF_8Dp =SXdn9r^F)0[Ɉv.3X`|fѸb- 0Nscp C΁{ N( zHmyLJ`2Zh0zX`z2cna\\,-5ף8.Ӻ./G>^f#kmz'PB,0X`J1d6a”+_Fp\Ĉ:GUp-l8 .2hgC{q@z"FGBDWb<$QD7z0 b`_i-( κ-ekOpjCy <}HndB$ b^`q@"kca.j?C8E<_͉:ÅSG%(ydX`$bQ /vR #j(P6ٞ0 8}/?mk'kmUDQv(r1KTB)(-h=\ZtZEi(tJ`M#RB0@E_\?z2ukv?g?  ē-Aj>ihD7jAѻғf ###ƔW~SѻA${0`VD〔BL4H)E〔X퀔b4XsHqh--E5r?`;XdF(h Hi Kr  6@zdddd\w ,X``Xm`-o[ R '퀌J\) FW %654@FFF͎C/?݉V?k*0g҈5W@J+X^]Ʌi`9%(9Qti]n?1` /It8nT:~lP)])PJyVt($ir J4sL q}1T؂s,5?`_`OAqds%όn%4ˁ(` Ģ7AmYȸh[?Z2[P5xL 0[v;ib{pW@U|~t7B F@(31hTZ+ 0f $ ###rb? y|t"f6If]`?^_V?yoD|9(GYXJS 4 @R ڊ`j닩0@W/A`VY`S9'4(M4 p' F FWGJ:n L'7fddd\_2i/XBտ` X谧fV`[K94 aev<EJ0n( @IGzR q}?6hP0{ ՃI(ߎ?R'8B5 S Me% &6FƑ{ĀI2222./F6ݏ^v!T[WE`Rij0Vϑm܊ k5 +> gTü&5Ofddd\_To0,S1` HtտYKr[q9`(`FWjn %li @C! +ŀYȸ̘Ǧ6ƀ5`~4`X&Mc?:84i7b@~ZtĀd'b@ob@J=dddd_LKZFfe ܉{ LRZ{pΑLi` R b@FHAIщ k`(O\q}⟖^t`rX&.`YmQ@150%*XPj)=(ɰLJ5lkBQ}A̯H`FFFۿw??Vp;$S0F쿬*YR˦ p6%J%n Pt1ۢĦQb@v7*@) J Nddddg̹}O?`X-`̝0Ggwgo?gPk @ID<ds 3%ĵI 8g$0fddd;& rv!GsZUJeUi% s,YE_݂ ٌ&'g@֚` ###clLf8nXI,go%}<jt J-["x :!Ew7D'@ǢzH`k?@n 86k݋v]!PgVQLĀO""g . * 3!Ԡ p759#0??` 1`V22227Kr~k谄?*-Q?$jD*΀H ;B o5`H`edddgL5)G0_0,a̜ 3G9dDZm@΀TةB;>+z17E'@g3c̣%86$ ###cO/D?02Hvt$? r`QFZ cZP3 U@#x7itVo t{V .7!&܋# !Cѯe,]?I?. 0$T \&A @0*@' X&\O#| s'$n']*J *%P TE166Z[U$(I@FFF?fKL?*` ?ۿ|FZ⿃:]2hU\ Hʭ ,PYUrK c!{D@V2222]nK' ?XA?<|}-n-BT& d*#2ˣ3a  O0?Zqhm޿lu030,StkFG_"e$؅c@ 70s(U~lOd ###PDZgddd6պzo)u?X% c#0,6,y>[CäƦ*kj`PUvG cc+_+Wߗ5`㟓/  {`||UF$HUVPwޑ~O;:]olܮۿz`z5n0,t_dlH*kH C@3}m I ME+w Q́od ###ѺׄnC&grnvG4z?y޿V_Q/~Ъ inEׇ@k P3|otLVc(w5J1=E\M&wtr<`<[kZEngA@Vʉ|{IZU #lt}"Wjc|x^V@FFF1_nv~0 ?mDD@*v|*!*[ް1[DMlf ###c8Octzr> D `{!Fv$`D}"7YZEF8"6EA)8^#vr`@0 TIt Pm$ ȸɱk_?]v u`X!_YoF`dX L4X @ >7zA+ލ~[ C 3ɔ{\O'`62S0s.rp*v݊u9܎n@ 5@FGpҞZLZCSYb?bJ^ `?- OHjU@0:F:Z_aC{+/4)787@&8[۱O\+9Khr5r79Lj?` R"Uu9""`C @CoQ 0w* I@FFM_+cɵG3Zpr99ҿ`c 0eZ{QK%*nT Dӓ з" <=rd~V@ 0&5z-/T*_߷G'ms¿!ߋ/FX@ dFWn C OA^]yw( l,U+s2j ##ǔۿ/ß~n9\/?0]Y1A;>#:1WFW oFZrOP3J=@FFM9}ᏗɽeҿeN'דO .j9 qEy; ˂ T hlmpC?W^??*ײr6[3tr;9Ƅ`Xr?gGT*t@>2Hв HSA^]ȸ1ҿ'ͮ'w<6h柜O/S0u,)! `t̉R6h(; (Ag+ ##kZEU'GO&Y`lߎ6H'ǿ8 (́ZCZwV蔤1r>Ӕ]dddܴا#Ԗ?Xjr6rxmOYKc¿_ +T+,z7 AQbVe$Mx+ O|mpHZdUlrTtr;9^~ZS*Kp$0*2 SR6R+@1P+wh>z$c?﯑?ri^^rTtr;9v3fNwm`)L!hAe$L$(+iWۢs dd9XL Nq1E?e޿'ǒkɹ^r0;h7Ѧ?Jv/:#{9;e+m1LeDY ?iLjd@FFƥw'jE?\5G&WET'O'Y1rYe>)ZA xStNSyc{4=FSqqȾ?#X{E_x~n oo@ xBl 7Zk5z>DO}oI222!vromޟJnբr.L.9\]z* ʙ% P V (a]Z ;ѕ|45=vzNI222.%]W3[}r-}DjWQ/fy׋  Cv]6]|Gt=G[}IPNddd\ḇOnϿ\?r0Ln5|wrTb\ҿ&1APmW%_$^; WDI222.9U\ɵ\r/9k#\J)~P r>Ѭ91\+a1*(L&dddSL!ُɥ'גsɽ`E?nF9d$%s[p+  v<&AN>$ ##ch.rDH?S+~5OZ5?U]h "<ϋM`zQ:oj+xU#`aq/ŶS`9pd% ##c/? ӟ3ɝ_r-9WVbr2-e_#tr@DZA d%2>I*vp=*+A ,$ 3P#ALq̨OUKK~0!wC˾K_r39\#ZKn5G5=KE|4\/c?wEO4$~lN;z$ 8F-ſ_r&S/rV{=#SFoŶƐOj*- b2@Nɀ$K\RyR Q99T?r{nQߟO? 9#oLS?&zN:;ћ $@NV.>#I@FFy!_~dDS'-'88 V v=|uDXQ0 w ,'xHo4$C?9@xMIëxIt́ɀr<P3 Jq -? QЮ4 ȘSKr9\q?\HN$7#_r\W3/G`OU*I"S&D^3I-J_2x H}bߔ,~}~4Otq?Fώm?r/9\LNG%H$`js u*֔P ZwsG_ŦQJ@]_臜r"YKӟgOpDp$Pv 9"4`8}2j6Ȉˣ{Qt * LQe)eih֟#wC'JNE? I@$ȝa  }jl~fyŝ4  ?>0cfdd1&Uetվ;Hr%9n_O%ߊoy$IKdT!@`__|_!J$V 8f; I@F͊CPٿv'H.$'ɑq?r*Oͯو 4 `>P,)}<3\!́xg v-I22nnoͿrվ2!7r*+.Ӓr_#d@9| f}`h}@D~:zM L! ȸY1/[o+k7rn>r` G%وH@m2`{ s*[@mH[JcZ;@$;FRq3co/oڟEo/'叜Hn$G+}{cɵ,I @$hd@?66FAω-Pހx;n$`_ m,ASI@눩%~'bu9\Ui6r?H.qsɥڸTb}AxV>1>r#oG3ɝ_34R/Z׳4(3:Ke%` @+z@_ U¿wW{X l dd\O ~r ѭV?r}5~oeٟiV\8,76 t _! W%. Ԉ;!dLLqql'ǐk95I_+͟]*ˑ!Ygi|M`@7 r@'C U x4:B"v}0al dd\v)61?r~l>Z죛?o2rZY'[3kF?1zIx|PVD>$+Al'@ ]kO W+4 *w&8ߘr/)r/⽫x,J_m#Ga>G_7rəNrhڷe3In2T>)*|J@`,F>r  @& 88k̯\Cn!ǔ[4W7r7ϳ4h3C|DS<dTZOmx%@vUAD5Pcc@o . [s84_:~r/1V/= r9ßH7Vٟk=K'4 Uj'm} ;߼>po_W=&ؚȖ@Fe>~)#wC4'w?r 9C"MO2)KԛE?`0 Bx ^ @ MlE^WFO= D~3zPrJ #c2~)G3rD."'Qxseٿv'w9HNZ퀲>-dG7ex}Gt&k{ Ԅ4h% dd,[%-~!>W^o.7U,-qo۱9___4,Ig·!C퀒hCz*YEOc.EB5]Tm@b^_ !?]N!G~ r9D"WOiVe5 @Xɀ-ApL$W s`/\4k[_h@M0uJ Ǎ9*Zm}\EQJ_6.=Kk3烉5^ p_ UU|*V4!6Q S8unTk d5 #xq[X_#~nSC%r 9R"MgD]0VV?|o, k Ԫ 8\J' m#wLb?sk_r9KQ36\VOQ7=KkgTJ(+>@FG>h850`я i}`kR>*)8h0$،CTq:g^%Wb?rCSJ" ~th}_Eߟ5 3C|s+ .~*>feOYœKpt;).@va~Д6 @FƼ]on*8~|}G!'Q䪿]"i>W}׳4&*.*aG xVl "ȑ8 9h(j]I22 sn.si_OBI1?'7O#>,6FY_L||XA- u06SJ.w' zz( =~tb!ʇ-πZ5`W`k}\ۺ~~m\G#~!Gn!ǐk1?r ~>.E#msnWQgi|M0U>)r`Ik 4>pm>7: Mh :9/{Z&D^l\ X6`lR ]_*^*ξhO>m~h1I3G"JN w7=KkϜi&>@ Uc1ApqV k΁ xt}%/M h`K@Հr\е$Հ$k~ms;_}\8^~w!.#9\TJgƟGwuϳ4&U>!W>h}0dā "Aq 75]: :^kG@S8|ic0iUIV[ @MC9_S—3*r3܇6cO."'|_c~r_71brLmFћѻŒr^8Œ yP5l ̙H"qi1[~L}sf9TG[8w;RDɏA K)nK!J[=~${>s>&SHИ`KhTO `D{ $@j"V[`L$X:͡Vo֯-~y>~ #gh\>w_2{9̏d1?mڄ@) 9wG-],PHA^ &jk] i [H"q c7־ZE~s}_B?*''ɏA9"golO~[,I0c%0+@?>pmj PKAZ(/A,e5`N[@n8+r?gGkQn s9Ӛ؇@.ʟA?D%i/JDž?܏#,u2 bT)[>% U j}Car/zH(s+s@Cw6~sq\ٔ[~ Gn G`7NΠn3T\,IX+.${s` g' aO q _8HT5@V8"MhM L &X2 5_~eδ5/cr9A%r9C|Z~&O|$Gx~~@M@Mo }GoG?% 6xiW4.Հ( e3ƈ@"PU'd c,~*n%3^I r9M׭_WB?'W۱YM~*QGW?H܏2!P˄)*8T 6 9)8H-"5XED @bʷ2?~*sv|_~ΚD~G~n9ۜO.ʟA𒿏>wKos?!h8pLj h0e>-bmbn`^ Jخhd崀L[51Ȫ@?R˻W~/oo[?g[6Q{Ntg]*-g?%܏r&Z>*-7@Ы|0̃4)S@"A kZ@D@c[@p"P N $8%Ke~S3澻ѝE$gSVguO>-b%pY_îC|J`͂||X"Ao hO Rs*sI' So sf8;!쭕98MΨsk؇ܠ[%Ox$'zv+d p D=p;60$m@Y )=Ri?0KKZ>h$kssQ Iݯ=^֯^p9uU]+I+M}sR{6Y>Β1/Ӛ,jgUsahOy/g_FJsY_僯}F}W8c x 6E)mJ$eћPQ+" I.J/o p8痙gę_sn>.IL0j  ).z"=I$TEVbA7`=8T I`_79?Tw]Ǚy46-g3 ~Ϊs)M}4G._.Rggi|MA إij0`-r (5w\ 7A r"p?z" !@}@LF[=~y}s6~Ί\|>erV3\?ĭ?4&X@T]@9%PԪ jd(Q ߉v#H(U Z-" gAX=cUR/0 :`7z}WOK F[7Ϸm}cqf 2LIݯr?~ ~tblKSμ?³4&8gWUjo@M$m/@>1". pCoʪU@U+!X\B?/Зϕ.|/E?ߪ_s~o+!ϜlqJuPʭ&;I?n,IT.Հڤ@"P-@>@D@ ϋhtր<5#:(VFVƪ-@I v%L} K[V>ke~M ?46xYW_#}93g3>95_9?gʭ?5 >8\5 j hZ@{PD}6 >&^}E[-"x{Vp@"(cVu`B0D S]kZ[h+_?{_7~Wki~)Hn˙uX?o'x$gz*rθ`Bmp}I^Sb016#"𵱩 `~r7:4&d*5=PVj-  p*SH.`_pc@?>T_~Y۾Uy|2ᛖm/:<߾9J )듅/gpn~so7 ?$+' 5 <a[ h[mIJQУPPx" R!ʪزEĚ"JJ@I4sHAI Z`*I8v OZ%8zovۓO~{L~΀_~2D3u?e+uP嘆H}[SI"ĀFvXfBXPBZ8Ht F)W4= F kd`2@5BSc)"NJP# 5Њ!୨[g?s 炽/Ki^,YO ݭ{|||||it2ߴ |Q?;3 ky~Θ/qw'(GƳ4&g8% J}*d'D>=5"_=x:i2BH%zU*s!Oe!2(p@Y!)B JrPI" +߫|o3 } oI_Kȧ~ ?ߒ$۾z藰o5'R+~rKgi|Mp>q[ڀ1`mZ@&B6>1gG5u.V%~15uU_>eim0-}R+%q_5 ?̘ |Pp"@`qWHܬ4FOk҇ UhPu0*pDavAm9p$Fja;:ȏ} r~ |R- u=Ϸ7Ƿ1>IM/K'^-qwq.7~־#Y_\!mmPh5>-3A'Po%(]An` +a'PeO_Wc(jP"1BmS’Pv-W D AID_1j?}.z?!/^b=}^7!-_">{&@oJJ~]/>1q֍or$Oz$W{XDCDqIG@΂B}r@ZUh2bi" K5 >8ȍq"P|03ԤT͉^" xeR4niEdn2 r 'Ǯ$(,8aiP֞?~C^_M׭z/W_<^c/Wic WOooח}n}h=?O_Y_\sCHSJ"A UTI+@Uc1Yy(zݫ* c˪m@ F jdE +]#%AIQY( C11b~C_E߯{{ Foo[c>ߔ2_{߅}c?Ɵ |$WቀFLj Y`ҩ4=̅4AAJ/ "PvUn@y e J@JbVU$_;  UK۽Mx6~~JD/䫁v$n|{|Rk~oՅ}|S5ҷG<:d2FL ˪+֪-2@b^UKI-\c12`.$@)=,W DF p I0E,8aiPN9/P~GwUWAo߿;|[߸Tw/\o7yi)7J5Яv~W*'_4&Aϡ#p"DBM˵"8aY67F2Qsވ.P 7Mi(9Sz\#^-P 79+" NDDD<~fb~~~]Yw&ЫoX]nw>n*~׬@_}ifoG{e_}&}o?w'4&aϡ@YFU$$hU\@HEظ20NT!IN '@@mn܄ P Ip@IG,~tb?K?{Myo_Uw͛c_;yWI|??z>_@%c||-Wl?,InsȤ0xL=P hETp $ DՁ!B@@bB{@L' L9PAUIPb,#ȃ❕ oߺ3uW^ Kߥ'zoXo* M~ ߺ;*^~?Eѿo?5 $ѾD`=UVxe`  .pQСJJ8=) ap-Ɂ'd' " ߻FODo8 ܿ3zSlߏ:пjwʨ7NuO _7RYяyi_$I ~W_oU>e,I94 ؕi UZ-P+zpMln/[8ߡW?}I_}Ϗ||{y|[%/Q_y۟S_ sx lP>'{@URpF }$^6- 1Mȁ~GzŘx@UR^89j]@pkYa+ Xv$j}ߺ~w~$z?XO7%E૗}IT~J~n ۥ_`9s2Ij-tx\52V/R!*=g)G;)`@ՂV`\nNDDXW4,z@~%у{ _6z,YKnàϷR k%_`Y9tra"pJ2rPjh$̌{$/`W-T" " ܞ48<@x_?O?]dIg.t/KO6 _-Wi>W/HX/B,#ٌ$9D  U\;Pe 0V&Rj0 SAUn"DTEQpѓWM ss{k9D;ȫ|yыt?%zD{eI[~Y/Bs3> ˪.dlՁ!B AJI[*17_@ 8Qp H~~;9뽟6ou;^Wo|u/*B)ߺO%gE,[/Y=HFU`E0V4!P+jHCm Ԉt"^5`\^?5zB@y/cb{b_e}]AN lP>g3Y$]S\B  U Z@m'8AI ȂHIxr#j,|>~nuwz`s guW,3.'c'92Pk U ʶAI } bPJP' " " OJ<^t @[}f|P?%;M??bz|.9vBq20ȀOԪeEdOܪ 9$ND((0x||#kQt] _ի՗SnS@,Ksv/B\s$ ZC`ePZ$C B$(' 9`]9]w1wK/K~ +x sϩ߄\&]c6pRPZĠFJP/ό/x1/-[-_:cz|.9U"ÐՁ`"%9pPŇ6a(C->;]Jp _zA?~o|qٱ lP>W2942!#SAIZ$ ,8a(C-wqP|y/S~4_:cz|9uŒÒ!BPk1bP#N$8Q2>xb ; ?c`?v_~=Kˎ_`g$`J0TGΌUc^?5/1,3.;F7Y:[!B0ԈI# njs~._tθX^(,+1dƈ9# S )cʻyv7X9Y:_g\v,[/O>, M%S.d1=]8 tθX^(||B^s!Hþ{hEAߟue/B3,wCޡ±ƥ,3.;'I8h^b,pQ:cz|Y K8g|qٱ lP>Y$$,3.;cqwqX22NKKyeFƩcX:%b8X232N@FƹҠ`qX22.-C/q-4ޔX9#ZbȸX0/5wȸX22nj, K;ddX222ciN`ȸqIENDB`teeworlds-0.6.2+dfsg/data/mapres/generic_deathtiles.png0000644000175000017500000022271712140200333022175 0ustar felixfelixPNG  IHDR+%IDATx tu?iNMnin'(+$E}WDQFKD},iܦufqfOzNq1oHo^9Iy7 / X,&fx|fr"+QQ t&fxBFt33BpFG0c_ 6b &f 33BAp{4@ s4ADpo@FS>A}D8j?TG FS>A}D) ԈJϡ >,*CAA*{-:Mq+~G)OXM&B_)+TšfVAL2";NA!6H5`S~?NX֠{X 0Q~m6?NXi m7 %9"TN 83_ s⌙";Noj+ &:i'E`w~Q =ҵoM3Ǫ1xǩ@GLzc?j^,E`wZjX9";N_  t,n ;NoIP^N8ә`q'zkq*^λ Tc3E`wZy&;*8?1#լ}ɂLX}ʻ] HDFI ' ";V%Ԉxj446FxǪ$x; ֛0OXdT?XbSWT~̼ >Q50Q~81G(+',WxA 7 P P P(3H8j(3H(w9?7_ -7aO92 jky`z3 jemEAV|B(ݔU? {LdE`wJ\cy"k0婩;V9f5'%&&~";`re[cd?}"»O9 ~S@AހpbWg& y3E`wq|Y $P.LJNgެxXSMj|[,qRVx,f*mYO:?KX/A;36T.<=KX/bMA.XӌjHO5QBܳ∉TC{n$i1eEe)5D^&wtN^62L `5^#7Cy `+5SN|npz:ԷA AD;po@=eLK<)ϒЯYt$9K擊XI ;f9:Y 5-KJCUҷzok!$`WCR&ʱeNoxjy}s @M[0UVs|Tp Υ? 77 \P,#;i LXI$uY $+8)+cr$g- Kg %,+!]t%A˃@`X ioZFJ-!uT i%i6is}@ ? 77 \Pnb)t)";f9*ATAUN< EX mm UuBYX0#=%ҵ~^RV䐮?(+c'6fd4Gv jk4Xe(+̟ZXY"u{%Yi?MAd2/%cp Y%> oM3USKw%_Q_J"`צ~VKrbt\KXĒ%)jK) ~aE]wŒkDFFq%\vT<9I6148~EH5I ~MXF +$7P ꓡ LGAQ )&5$sjٰ t5 %K"ԠM+IYI\uR{ ҳ$%IPLTCpW哗^O+d";ii{ cC0KLY!b -~vyΛ:C09sIii's1E`w^ruſ ?7 , t(n(/5;Y)+IE,&_Q^B1Sq~W_%m͵$6^Жj9j:2)?w|缡byosK˝$O\(觻_P>sތs#߀ym|WVY*h ŹO-~IpA!q^*&A!5S)+c1ߐԗNZ,;v'Peߐ55{HaQD8s*E`w*g+_ Uݤ.]z?E`wIQ~'&jDG|ڎzRe1Hc?lO?y WT|h-&vi OD:2P# ހp 11D=Hܷo$&AGFHKc@Fi%E`w@3Gh"$;֯?v`(&%gWڳj&bAq`!U▀7TqG{T3+UX/u,)+cg:?s!ᯉC**ʟ{什d/E evN8 5bJUOV܉:/RVx- ~s!+Apo@8sR~Q1 ;y4Vgv+7/d9)y;r@(B3RR{wRsR6::G'$1)ՕԙQVxǮbnˊbMIc]lIX?w(?OA82STڱwm}I[-h'P~(Ҥ(RHnyϓ* -+kb]OKe}~lk [){ ?C~EW{ٴf[y ':>9vl~e^*Qvj,'wo"[V/#e1VPm|in;rdb >[FT$doni#w' +Ad6po@ʟфoya; w( HOR 7*? !ݾfDw"8[,&&QZg4!#$pkM?< IpYyX k<6w5J$^AJ/^Unqy  )oI i%Gkd(H98b"X)+Z ~}v[f-gN5vm~I`Zӌ}*VBxMiNȵgI[s-)ȵ'ki^`}LuwUG9vm>*8O#Ew|S##di%E'ki^T!tV[986?\۠t> ]g)ߔ&@={&3gIeUX_v?9.  ڇ{B۠ \EIAL,2"3~EV+E@Mib)_8E`g*A26$wg6?NXbaQz=iO7\ȵ.c~vZO4ׯ]%퍤@.kI: c?\(2?zge GS$u`MW.Uޞ$$?~ slaQ+IiwY(zʟ)|UF[ |NAЂ{BCHndjRQVc E`g*T")'u"ፉ,_ UWOb_PNzc E`GܙiV ]ӣy}%K5TBN#8'Vql{S>% 'ˬ|AG{zy8&*3 `,B(4=CqNFªRV}ǵtN +_=K< Z p! |$&!1a˿Rߧ| A_po@(ib;H7m\;UEPsCts#E`!⧉ ֓_Q*YFB(OA2׷fj/]֭TQ˅3f! [v,s_I'( y^ʻRm-SK/Dz{ߤ%8b<;ݒP6/x" )V<Q&-@HwH ʕn̓'( YRz)J1VUN90;v#5c ? O7 XL|QJr֬^Bd)?2ًE)ݻkJ:B ?))=w2&V(%sOe]݉9>ٕRxĮP丯S$]5@9"xg!#)!J%{vr.uSvE iqPX>jJ7^v<DG$?wO}7)SvE iq#`>KM:^ Je;) w?Rl Ϫީ"MC(Aý5J߸q}n!T0q -&rQH kWĿ~Y[NzCUsڵ߽|;N?+n\3%t,H=l)H7uS (6֟xc]_m[XK9໔jqP!ox^Z׮}GI6q.*MXXr>@v> F0=uVArcKKA&gS^yE1Kg Pu_5aÀ{XgL|Q-@AB eTH?kPYSJp?LX?kNp+ƿ-F)CSxįbNWlIXKaU>zL֭28SkVD ?$d} >R90V+aO/`/5`ſ/`>[;u߸qSfTĤTi;;C+* Xյu+sjl  ʨV+&׮v ʢ槵\@Ew,ou'Δ1Oke;@JYNdšf]e>k}S[@Q^k+@۬hd|K?Hq}u-=rHe?3IcSbsPDokA@Î?Hq}uߣXM @Is޽S[< 5Sւ);P[CaD:mZ8 Hx½ʻU\zhc%E`A;# I-<+^)3"+) Z?Vo%$uV)'PZVNc JB0cYHSr4}[,ORz/6N=#B|k1TZ_N2-ߢ|X#&4_8%~x/7j3IB@bT/~BkS?yj,uHNRߢ|X4]2uC{`w>IB@bT/PjɜD^ؼ2M=zTTֈ˗a4A@JVZ<+D{<q@yE`!/`RR<{P1z:<$Ϯn祤p_#Q7.-BC{q;ݽqU kZcClSSCov+z .;<dXXP*ߋKmqߜ.i,mR}pr@ACp?}XA8a|b{vwJ.yd5( |x,Ps|s a|1Q*㾣8 k,pn3Wcj(Nʇx5:0&E +mMd|X?<A }7 TXYcsmm9d!w,) _6`k-lTYdkt퟼% L jUԟu "]\?TS~*&/M]>E9EZ&x)7) #'07v0 1<ok,q/!'0X<'R>ii~'a57br?vX/~@y!4A@ý{F.\%}{‰; `Ưbeu{GHB0W]ֹAyYr$87}G`H,#n%He ׵o>g)7l@^y3#\{{"g̗Y4ܪx>`d,9Ft|rCo{ C /.nbדy.cbY4 RL~np}"?K!ŷnO>C۸a:8lʯILȝY_PS4y3~)@=,h6WRl9lsS(A`HF'LZ!xx|i+E`!X-^R{`]/L:KS@+:[) _׳.ؐrL㟜pЁ)=,ƌb|A6mEĊ/ ǯ u{P[&_B`5(]0~ OyѽCS}SN\?rEĊ[{W9vtUyٚo%9KKq'P0Tl}9߷y/Xf~\/'V_f8'Nz8K HހPC.4w$1sK7oLAMkK$9U3:IR2o]:Eȫb;DPj 5$%+7 TwU藼%ԅx>lC/N`LW!Ts-EP’P$[Csgg9 |T0H=M< ?;Kxc0~ҽ,pVDC$FN0 lRd~V< ]x/;UX}oyr\K!SӬr~qN$%I)OGA  k" *m=9PRho,ˣJE߂/2$E k"[NT4*R5~o vyxjε'Ϝ9hddإQM=~׬^5Akߞ,]^A6u`:/Q|B{x=O5)Ҥhi].~s"xjIoSbl-VX:Z7|= 5߽|ܗf ~]^/**PV_rv(Vu@A  4EDLȅѣHKKߡ|?  :, p%.7{ 4& 1X @_"{_ܹKl' \rĆL6&9rlӦ^jДnh20/7t3-\ފ#M5}MeH3-?@:'pr@4-0naz+u:}3ED~Bhbe `i8sܢsV$WHEe⼗_6?zB0PFCo>u.dlKQ# -ÚydlV=J@0k _0"WGd0-VJ@mwL ٘c%6 dkhlVJHNg1^S@0g.Q*+H7¼ E rm$ۚȸeɿ~!PM?i!gO{wLdӊx ·kNx~-e+hchǏy>-m*H-v[?j_s36y5oFL j$JJ+m OHo)AEPXcU#N+cۨ[pLbn+k*9dՓ{ȭ]kƍcC b1<{2Hػo:=l1]kA_wݳ=0^~D<ʎbxuZw {W[ӣ ?@Ŵ` x|^rjMBgxytP ၊_r*ߦ<0Yc {j-i;v|9`HNgL+ gˤ4tl<|O{_*JG@Ah/) i:iNl?Hz9iw %U$L\5d 6&( s@0IEPl IcS6&(AEdl#RDq5 uVқ'hv¢J1@b}W6`Gt"S/3 obttj(AEblʅ\2vUwb.MK;j:T `MGF eud @+|.Ġ}qdgV 2m-@UuS J@  Exi+pU\1?$ϓP3 ijsmZXq{lb 5?H|کLj6r):p܁r1Sh۩JJIm]+ik_!1\*!VT6Sж&(AP{H mTԯ]EV6YȊ4˗0\g%[˒3YoZ sm {Ɖg5i|ir|_oG88yڸPz$xpL KNmh7vidxJ$L2 l@vS}۶XM͝&# wP# h**0RJ"$.V10Ryul؝8S*NoTHJU&%O^'*kŃA_w;ƯιpbߎsCT H|[ g0;a :5hcS{Ierd_Zc(0jL2Pi~v4zdtKk3woXP0A$-bMXd -ՙMdǦǒoPC2$9Id6(_M[YSdH@ KIϪ5dǀcIĞ@ OkkYZ ޙ4n/^OYoHWsެ{ld ħ#y :-2."2;F&=:J_ ,Om]hm|#| sл ^3h&ĿLV[ɜD**kg;vQ4Z| H(ZbQIpjE& 6_ k?驷,/|{s9cjLgCƾusQ15&`:eәh[>H_߹[ U+X My;XǴ|o&m8fn6w-}; p()`0(O7BS2eRqmu4v-SDc="(_JQ9q,FRR Ŵʦ9e8Ɨ]Lk+0)@D74Y~>Ŵ@iY- HZm6* 3\˫;œCghKHZl_If~R+}i 61\_G.\K.Zpl ΘH߷\`NR+.56'3A-dxAoH[G{_<4Ħ+.5*@A "*EHAz( .~yj)Kx:6,&wme_GŲ FRRbB Xpĕ75khEnk>i խhLThW-gs10P4l9(sP\Rj?۹t\LkTT El0Xi+wN G73#Gc1Dž {[YW) nru[wB'y0C<ӕ=Mj/.]{ةs+v2$ڽSdtWg@wx>?{̋{acJ+Dkӽ契z+= {|~q+^ P26ƣI;߰5?qZ? L 4X ဍ}T+Y0gb}W2@eXA ?7@h֛'V#A2 uV7$shiQCB@p Κd 9jr 4PPXN::W EdlE$H:&wB> b*%h-F`d4ֵ Ebl{fXꑈ5#9tp&2W0. ˃=+z[ 82Ws@(T J4A{O`h]ٴ),p)J# 㧈`t.]E:IyE? ud\בAd2vpphg861UV+l]Kvұxa pl.IݴL8[/ Ƣx<쩵: .RY$}w)o_XT!ΛKKa0'  EmX[H-@,MJMRopq\ÖZv$_IC;HEe*KJNzoZ -=ƻRIYo$k;ed!Ȋtkߗ0Κ${0#Cݤ#ۃͫ]n`47Q*yp9>B3(Nֲ$2HE;H!ɺǣ?/`*{&Sk c} dSYCYLo{ntt:.zaqb123bRWJkj 5SC_T頻i"6 27l!3rZۺ {԰> ("gz`^.G ˳o0a4,#L,_XֵR|ko Efc;^?[?T 5-~O~Cغ:O>U0[OF'7.`5Ğ|s6`\uA#G7v01w pYܭ ļ@ f#[H`b`Vb4%w  Efjr$ݽR$4krb79$&;5k9{& ة 4;;+Oﺻ Wn7GtN6R\x]nl&wWNuwҼfu8z;:0Ξ$6NҼٳjd Ņו CA %7@d$]9h8ćoI U/)p,8&$jNoTpBb*U/)p,8xVUp >-h+#$7 v~@zRM"4J:`l)&=I4a gd;)6=Gw7Zg.:(ߛ|eŌ3#j\eMJ校]{6;~$&ɱܼ"v~@zbL3YXD[Apo&.TC4/8K j?$*D*%b8KJմ5~hH-,! $p 8i+K* )"?T&g<xv̟uZmv!QbJ#OS>!a >g 㞒م~A _7@넺0CFkm܅dYY֜'NЖ6@< ~A /31q[OëYBVV[%gW[<ڗ@0Oe.f4 dV3OL~&n98O,GdmӜĺ| A f;P3Z4?w?u| Cɋk Ȯ^pt#cC NʪVvfPH3kmXH4dY^^Hzz œ(P@Țذq iXA.[핡@$+d#@_ b*P1Z3ĿphgYӑ`eS:ZWaXi[70#@_8[O6$Xo"#MV314$= 7ꦠes骐7@po@u kZ2F&yU0εyx=*C9nK3wXLT: Fʩv? 5yFrq (ߡwDEvDCPkhDO1 ˧]ttЛޣ|xܡřt(h M7 Ѫj_}ݲɠ`d*`M3n:kM5HOj a@V07@ I7~!JQ^qnb 4A eA{5VXjtե*~@Wȕ˗d^XMrLw(_vҌT?( LE`ca_ 1yry2klZF:J89_;9#vc"+s# ` zEŕߧP/]" U$9%ݗ)k4ݱc%@A$A@h,M!-@27_#GMגzRxrКjlL1P Pϟ@^ o2ݻlYtU撲_y *v٢U4X? ޸vٿ[TԓtK/S * *c_  0&XѤ\X0Po"ǎ&[7o$qJ T3M9nlTj@0M5 ĝ[7ȉC{ڕdEmәߦGG;cL `0 lx),(@[ndddډ`^o:zO@A$<A@i(q=2vYF*JsIFҍߧg/Ѫ E` {=DV5x3z1g/Ѫ ET?zini#vG.Mgy+AAA Jre x߿ܼq;N>HAƺ U`05nEPK? ,~Azݼv>zݷ۶l\Jڊ2Iq\O3{I@(eҥ{ׯcǏdRZZA->  {AP6VRGzwo$V?zdD8}(O8FN?J%GG!#}{w]; kIߪn,mo$5cU哒;ɵ[Hub Z,j tP%U䐾Jߎ s'9~DpArrd?9~p/eIBl@vn%[{k; ,-sUH*(~1v茎cMm5~J_/t>n| TT&  {AεE~3weh$5EIslĞHlbߚfzH7u$e$QBޚf/@p1odmEYBFRM P/k>oSqngtDRO8B@es ںVe$/de;mLży|ߦMݱS^(uF 87A07`{_ _]QHJ mI.{oRF)4b1~2B0 /`Ge }ޞL*-q$y_q(ߤ¾ I{x Goڶ|F@Ii+$j%&s}y:ߤ"~Xh4~rBăW A$po /`egbtէ*%:^!oɻw_lZ*6~-@ܛ7 < ^/`²kr_(0>C* XV_1zu>GLd-}}>۸Xay͓_@i,_5kRQ+ wNck0R!<K"~Y?x  {AڥY6;3 i>#*;li2C6 SDž~vQЂe[˒gml.Mb6=WaW戞вhчqPƅ /mP]lL)R#Vo,B~E(Ÿ, yZ0x @A 4&? 0`˪\W./PgKrqdD8o"h4&? 0`OE+*1y_.?ž E-ߟ(@c .W^o|C 7A K!c ۦJ) }D /7hg6FWVM+ hS(Z@R1mv1}ӊ%JFA½ L &xwpcW~QC_wpawOL N%3-xήޣun@V }<35.M WjcmHh 6AH @߹2,_qԕII~0[OĶLn ;dv.h3Ytt'i2II~,9m> S-`ecO1S3`\Loz@~;5F\mh h @l Ր=3iR00Oa>89hRh;WI s'I3[0U_TDcg-Jm A$톸xє8q_gsx36w Hh  Y%<%d$>mK\4D¢^KT Q~;˼kl w n Q E{Xgi-KwSA<}o/𹨨d)B|uS>m Hx½ rTT/b#a|a@| my * f2dάX}޵J`8z9}/yGA 2p7x_u}~A  (.<*b> 2 @F_ꄺ!  2j>oB[  A_|f>_F L *<+b>O  @aEh}~  jЪj>/s ½ jњ|5f>s  {AfL o5S9]35xL o5S9@Apo    {AAA <    HAAA;8CͲȱ<ĉ?,(JĂBt;J{H޻XD؎Eb+.qݻ={k{x<vwvf y    #AAAAx    /AAAAGx %!y?CB_s;:ͤ.0Esͱy.~I" r !6υ=:  ^ 8I|;c QQ?wنL|;c_Lv@-Bڟ  @&Z3Hh o-A^ Gm-$3Z3  ALjbk^k' A$[/F j﴿V j B/A=l$6=Z6 -#A\ ׸@׺@OAh P^bD__?AE b*3%z2P?CL0B]1.痲d.9/nBuSH```t…AX B# nF엜,޵c1.fr ׻Vpl x=P3/8  @!h0ڙrLϱc8z>6+ߺ@1Ed3^&1w=^w@{e4Wx{h@;CD;;w@X7 d ABx ! Cs=IJx@ sFBdvJ3>3x-&??s\ YJXKw/e< #GOsbiHM2 ׭`;csY1((o>k{ĝ"]0ұAX}?A= 1D>(Qvs.5M62}E ejP 6Ctӵ- $A8ohG!vwl>9*e\,o )MJ^8h ?u]Μ(}kEͧ;GſLuMHeR> tle  ,/A J#mVIݶŦW-wWvN7תDDDok55V cMҗF#6 ~PW MwWWf@2_{mU!3&9Űiv=6 ~o`ZZ{gAu @&j Z {/A < 6fk6.i@{{ m@Oj쪈K6v5fHI,^B6W  +add@{GT4srbACx w͌ +%ktTȠ[qq%ВpQf@F0Vb -0jZ%k嗲5Zl2dh) !A Ext oF[Lcb=ð+! ܗy? "&؝5VN;©`A/HHv&SEs/.ۗK PU;kǎ 7AcS gp@P/ }nL Ex w-eQn5:'N@ӧ`aʲ|HIg ͸2Ņ|%pГV`03ģj߻g'ka j3b!3y;H]2o [U&; le5ԸSu0u@vv>E,`یA!CA@&Ao"A[ rjkp9س{' tCMe1%3~r%!&4Y&?-@xk1'C^7K{)n1.tγL[&{ "s}Nf*{3~ϸtٲg3AA dnZ iꂃO)-29snTȏ\$%Ŷ).4Oi ]vCoo?Ctrek6 !A^ 0vH+:y\ wuKSoݼ ׮^ S'Ò߲y=Z }=X[9l@\\s ?^VܗP[UP9I}qaB?zؗK ~>$QKS_VV]iphM8(O h .}B}F6~Lof=|$>ʄ} i'ž a㟋@eu[ %!%5ⓤ]/@/ d39r$)@+Ag^=#Z6D&h/Xv6v`eK<(KDHM)>xS7CLŅ|iѢE'D`g➉}7 Ŀ*H 5i1P QK!+E0.?؟67RJY<75RO 9ϒ @PM]n7J6PgfArJ:%BxD4M< یA!CLاZO !zEmMѢ_ >`k~W (ԛaw-ǫL7_ؐ~Clhay="vqq!,_'QO3l-Нv |W?s'/E9L'.(SOa|E0l-]Ȅ~] _"L',]jIě)E b_ _ Z6֧9 dQ?˦?? 9ڙ<):L }$ϰ<hYO36Fyܣ]0Pxbd~yҒg&QRkiU{lhi৬B;–/ ?$Ɨ.5ſ A!Eh@P@mxO;h4EV@wWl5!?d5Ą6, a"S(cQ21U@oetڞ} jCG51qOĺIԣOZ, ͎Q!m y%ܥfߔ`S@jbad0Dz e׃2E2Ij1)I>}ѳ~z0t19`2rhn6Le1 @(ʮa@tNEAAxhQ/@/-E=Hݧ4 Sf`td@[ cv@r ݍv k6}N@jr/@t>EAExp#@/ 6Dc&{ 87jW9l\9 K }Gb;n6^ֶՃukva? 3c-r)) B< u&}&W N%aCkm$TxWz(& Cgn,9w竌sYĽ EV|&D\Q=@tEAh 2Ŏh@IP@IP@tIE{aFt5:Dy^kLw=^[:b*?qk Be1K(!j+P"q|xm<b._e ΌB톄(+vcji?J; mZh.載 > U8EI & /q|'=ep&)FTXop|'=ep&)7M5 ^b/> 6oB[%, O O8㿁1%?~hc: &ɟsᧆ O? O? 1~J3'X6DIA>^)n1J75b88ozY-'c~Hr'D.(2?}~1XbK{b,㖓~1?߸h^*wcERlOhαUwqcĿbLX1Q}}~!0DEAo ZS/{׏q?,x-Y8\VGS/vp?,x-9w?g< 'O~YZxMs2pY=KN䵾XWqMUa|L %3vg:ľcd_xXꑸGp=.4M9d _k 1 2sv PW~ ) 4Fg:6@t6l s!8$1BA'@bl_+F&blj$R,nHPQ в ]o`޽& j_I0F.YC9aН^CMܯ$g#|  +nzJy6w  hwJ dPz(jf20\#޴ ivݩc(ij^UPT\9E,1VСY[a8zYWEK3z ߔ+`Uk2 }謎qd ;C_S{r& 7΍J]Y+~M"l+aЗ zSAOjgêP y R2 GÖ67B@t pbe͌j`mr+F*do{ﮮc *^7rrW(uy%P>񰤴ꠢ(.i!P(֮2?t}Cǥ7JA'@ax0vBwTj=<1рf_1xhnaIsM3Up\؝xQ3h2têdؓ.Œ|8l wRvyb 3`"N2 M[kr`srY'%y.mjwSǝr]O t3ť5hY^YuumX*kdd@Ggߴqʲ{ B/i(YnJl3TV5N{}`6J6fU G–,ǻbU,)#;( [V6wžJ]1pؔ `vؾs0}44v=g/L=A^-Yߕfl2Ҵh 5VSag\?;j\>ec]1[ -30j0OjXW z2 Bx 'NoF@~SL25<zk0; 4_qAW2 _Bx dKWJ[iYi 8"@Wmnkv>2f B/qx1Ihxc+Ε5.%ڞܺfdЪpy)[㧵i>7{"L^9). G `ԣۨj3{cGS022.Z P5pEݳS@aQ%A!ZSe%['w^S#XAK`|{mgk55b-!,x- Ɗ+}5pN2lcЛfF[h2  2  2 _Bx dV?a0 20_{#q/3mJʜYe8Fӫ.#026ĮIUDUopsӌoWb@[V@A U  2  2  | "_%O_P`26뜶 -Yb s2Tf94`26뜶 N2 Bxm6t/,j8˔}?;{JKVҹ6{3gO3 ^[q)c?;{fsЕgp'6v*g9=x/<"JJ+%*Ǿx!PT\ҹ T5:  | ""h,+):! okj+ J 7k55b-g.H 7k55`k(p>ޞPe3a]c'c&p^إ4NfA]c0:YjkHpq}g^Te3`nT}&dAzBx.`:ضczt-F c vl(]ҵ132sdԩs۷ ;z<'k55` a4 ptwwO}_z?5x?wk̲~o/c ,QDqn!AI3Nnmҵi9w=o']bsY{Wa|Lαo Y8߸clش OOcXrK6m }m 3a|L B//q@22 k:^m%"ŕ;5k;%lj82hwq}vCeu#X%bam=ߑzlf" n6FLL Q;2.[{f4z҂z~69 Mg ).8t|F ;ȭq܁mX  thW IWC_cV о`Jj`{Y,ϋ>7&7&Ě()b2McJ;Q@6>g@+ VOE;5d3z6b.-z^P[ ! : EcL=$XQ 騎hh/`bLߣX Y0K{Ӗ0I7׷ĵ !lye,-feU R`KU10aUk2 ua]WnO>[Q'V-\eUNVw @@г XƆͅQS1җ8+i{i,l-Z.C%;Hwqڻj@^Sw'Э (r(lPrkIi WCUudVT6JVHHdeZdw qSw'  4 Em I&ޘG]}bRw-(WHfqc6?2[MJ #m& LHo)\.m:QzEq 7_$ު_3qJ4>F}p_ LVz-+$3q(*\onƦ.s9Wi$%ºu  th4h.u >dn6N{2'M,W3n3ԙ8txO4sxOKbz]G l_0iwߝ#?A^^-ԛaZl2V&@ nZ S <+umi 1xV3$`MT~wM] ddAGx %WJSeR]nk=`tH`݌=w8Ԙ*a^L Bi8/a A^-5qh jEfH |~cP1n0Ճ Z56> pLW "k@2Z7 @Ah"n'x޵#5 w{#pȰf S/Hص{ NLզp{ScՃ3gS%LdR̃7y 2mY1PfwZ78Ǿ&N؇g(C`P(>22C1fgLw#  E8Eb!y0Q"=$x YiX nŰ"Cz"Ix-œ5bLⓠIz"Ix-œ%˒`϶ط(~! vmJd0|X3Ц*s@R|laB;S}|'=HrfT!=o;$c/A&ck݇<>d5n-ccd2~2HϋXGP#y95nfⷌ ?:vُ 'yXt.DA e851!A5E\JQndƫ.S D*U:{PxȮO3 x%PXT*w?w<6dA^G>!;olٴ""o1VKqAxBNwmyë{-ITH1cſ reZΒDNeYXMR7: L$U6#d9CtC6!W،SΟ;cWLE_'L$'PGz:qhXB9\![ifTpznOEc_] R$+Q \(+d+M4R\Rg؏);@ABxtL vڮ*( B!XE/B6Uڼ6&Y d9Eq!LZ[mvՄ27М(o~,tqZ޴)1>dm-up ;Ur֤ǪAP!c|Hd]pu_|>jHcW@de穎oWێP~!AcTU?#`/ @A@xd,fRpAU1QR|ZVq2d6#ۭLW&G* %eL '0ζTM&ҳOQwLEy{t;~mg/7&@_ί{t"$DM>h|Lݲ0޽e:.4 f`Ukο{|xMc6mj;kqſ  9MvE}A^=)LS"%_-!8s攪NEo j+{Q8iQD;hǾ0L`:a&%zl' f 78?)'ϟUM]*"2qʭæ_3q gN+TW ue,$Ȝc9W\UM"[Gi"A4Ʊ&Ũ'T;&r˃4DÇI ]3>hcgߧVo;w u|Yk@^m9o5iA=xFKcƾq::A䱯\_j1f0."hwhe' f GӲ{A}m_#Y}Z6nۨ~As߹5Qk1Gl=vEHr_mi!0U|Eʧ8`Lx_!,[6ԕŋm+/1q|am$3~-x[[֭[6}Jc p9զyj\J{րJ2XF0s 6ġvݸF9 . y)󯾪7nE1 k@O%kPۚPSS7oڎ͛*͎2 o!z#Y ~uEDw P Ңl0EQ^!;6WZ%U(eb˸*_q2h1losQ np{0cjVVf;Zq5 mYU6gࢀ⿨L   D  Z0zJ4[}@#Q7;W_b48Us$jһ6Jʭ>qNfUFo+!V_4l 0J E:8@o׮^h_7j0杈cFX7|a&ͿCxQj4-R Y/\pUK._{~ȹ~X!j|Co! }{<( 0-*lk9ʕ+ұ{~=sCOA+IA~Rx xPD#?C>d̿ЯX@Cz߻ʱ_7Pj,;M=[+g< pǽȨXY=q='yy| TUvoQ" 4 W fUXP]Byl_*Ymlj"Lsz[%!}k1؏[b*pOh Ռ'ˎ;YoE&>xYqEs!u387q\)xb_ P\v|_?h(۷n{[qr탗:q}8;4DU O P=z |9g47\RZ Ax 8ocrzW?U+{ (֪HqۘܮlT0`n5ONs$8UmLŊKh c2XD'fzعcXi|\d4`ܗw?(Mftw­E =%V3b?NuKkEƾ&?0J !L2u{q2䄾$c_,蕂A=nV99a\ea6hjj*5i3Tc?A/70G0PVA/hU  Ll1V5:- rujR$Ho`b w) e@~9/dZxg)70c42(wZr TZ]MLL_~ߤ:p1?'rEr%{ UJ7N1LG6+ǾMZ58ƽcYjZeSNy{S &cFV&@}Cܸ1=ة7i Dx 0z!8(ISHV {YWZؚ} p$^'D-Wo"PNSS ~_~nVhPʲ|YNh;a _b|MaPg=]:Zjk{E1 @2؟J;a _b|MKCYB SSׯ\VeWRJ8=8R,c\mzgwB+&%d1, Sg7ի㿢F*V -@p4Y \zeU, % q _|q KbXNW GB&'/Oo*JN cb r]-'}g.iu;$-k_k;i}DS%) Z('*|"$%u{LoKRnIi9?J;.? c|˼ bQ^.pSVň3Wc8>,f8}jonZ\0>`ὀ =`r}}_SS-A_@p7WLK~p[4%ʤ֒~58`il|5q[0ieһDkIIBtim0U&}Kq/}0{j tpׁ~#(teJwqƴ_^//xĵY`4) o\ErQ- ǸEyLKKϖƹ-{nLdA.`L X^bcy'jN !z#߂|Vzw[$ OJmnd jw1.3* M%H`2;XLq(鄏>m]|WYUre cȧtx(eӆ!T'S{T'q+oqlE}k,7I Z68]2VMf٦[-폳- Ǹ+ǴDENҸwA罫Aƪ"=/"^V{)?أ:! ?ONoL b򟝞X;?Ro7ONfoLYg`[DNvd_]f`\PG߿+ ]xW -%F}Z78_a|9<ؼU"n z^p@ zЕ ;o[NWӺy {=/5$VC p)>zk&@c+ ]1קum[J\b2뛔&@  w8gD1Kn,IrTK=8gDQEAV r{TK=8gDn~h9;DoBlux/_Rx=NԁXxo^$035j*_o2O_jn8bXWnwyȍ׃D')Hn\oTK ؇{CHheSnw%ȍ׃D'ҖGǘf46k֭[;i 'cz B/Hq꯴%؆u-& GS_-6wZUZ\2_NtGS?-VN?&x 6!9,ŋ,u0 zb?cBIa6sg9YࣸxKnJz28oklH,ˁ ']9rdWP,wO]{dpփ-3e!U5p;z B//3&-Ֆ+ (Ht؎,_|Q鱚^?cWQYx}EJ/@G>sr.-ʑ3,u0_o3ћYxM1@VjJ葃, |9˥x?;q뻛 κSmc G.fVW@CS$7+Y1$popy0SZH#(&rΝ6-Lp?Q8QL y)!ƽiO!O2*,uPW.zNԇ=opm!73IS'EG?xc$>XGXڿ0MzNԇ=ok<)Qc E+wJzdc[bR4=:%%w]߉GMYD@ZF6lܸ)z' B< p$erb-)9}$r2,[zAm,o߼!L .$oMp$werbw'8.> M{KOI0G_FAM @vwCz.։-`6 epzwkBǵPO wvM?ݐb:şfL~XQ)KɟB=qUq7HWlw7 ub?02{LMM5z' B p$/ # JM~Zo"#}INh~Id('&8!S>|Ĵ*اsؿSnq;M[wC#`2A u;03mί^VI[컡^n4Rln Hv%wv_ڞMb!l J"  =ך1I%ƆI}DGB>u۪qGKK `uMp$tCL w8hYu) %Pi!]#pL)h_0+Ȅi_/X-1yИ{Qbߍc`Wԑy_/S()O!hc` T0+_/ ;//&8{vBeY9FNyLh &<j3m褖΄0yx;vsB'MSRW_kyq. o(udQ{zn#{0~n00 8bE9ƫSaRon#{0~>1V( ׌\X+Wi@#&AyL`^*%@#Û8?St3z^8߹~'+ ψNjyL`▔lj\ɘL>}C44Xvt#[`]#"#V)C$;ރue3gd7Kc_$+q=ו->82z# ܏I|JV(뽬Gęđ0١/O.Qp&qr+aXQ:/1TvcrX nT \=}/ԙ-p sݽ@ʞl!ՕH *lc uf )e\w/fyRqBw0+ ^_3qKYl۲A;1.\A+(8׿k"鳕z_IIJ=&r}`~ե =4cRC #f_2K2J=ƾBg cV5s}yy  g2>§ JOA8qL+¡2%Ri|A 3p&cS3 -=[i|A GE ҡFkPGe Y-7PSBSҡFqOP' \Fx|΄n,0JR gBڊP 0JR gB֊/noH0cR!/GX'8c P(^ĵ熱 b`F=-"^> 7^_3)7 HEm-%p&Em-%p&eC"o5ǰ$DABlK*nh0ag-%/-$Z.7}p 0EDVEA +p&6Xm公ZbgbibZKlyL>h^goV_ѳ D #8cY%"ZkQlkT[W: ~K&ܹrPnWS.v3M [G{J#{*HSS'AaFxxŖ&znِr0X7Mo˄+`mg*l$@pT4M48.]dN @}cԶBUu7@A."<(V&6':Y_9GGvŠXh.H+:b`kX'{KĚ& Xa ?#T0:Y8xT7nr.̬+J)dAs/LYZ&+ߗBNEYvgLĿLkral%@@l;ȋbi/&ezӖJM2 ,Z$a}EY9MCCc@3@A2 jKQHP*&ק LD24 B|&`}^T!> PRZCAA8̄-qH"_t-,^0oݩA@^-_p2 BFxaOXEvH?&&&A j+$$gt_kX֯ ~I1a~Gt{ . jQ!5026t`k2 $PQcpN &Xg 5,6.Q$Zmd8 xQӯ4tCm]+W3_/D9 BxuLq>jʮh"u/*8 ^Y/ w(w;/@JT*I3#y&3$ 7InݲkͲ$۲e#񂍍06+c8?&?3 T&P2I"wVw{u7UK>|bx0$ NHȋ\^WOTݭŶԖe/Pmޟ<~\gT9L/eI>붥ӧOȟgɘ5kK×%WWW^nݺ.^8*gϰ]w,*V̵ '@<rRW^}ٚΞV."mU:GP '˗ܹ֟y-jG@lh~,ruE;WO[/uZ>;?%_mޟpoGz^)s#ǞXΎэ18 e{^W uX?w6Όa/ x%@Z7P]q~I @y 0\>ux"Ol_3\MunZND xs&sjweȚso-,jHozͨ X)6GqGZROaLk1_J6> /_8Aa98_J[`m#>"v  M}eS'@Bĭ@֊\iP1+˒E}|vUi4u/sgTg{㠓9u c3Օry%@8ߡ]]9y:wꙸIpnm#- Ԃ,rq՜3?P8whW%xgO{.3QeG7*>PesSGV'=mˁGԬb?P҉0׵?^PV;:fRx @$QN Y31^#uznqoIm[7}koIZݮ:K;'ܻn}K_.l8L kŝ/VըgnaX `礀6ϟY\yd )n}kj~gҮjK;'_ܮ7S҉0?h39`h(; Z!`#a'pO2̉̍[ܟ{j`]ר^:;P$[8O֠n޼o֬Zn '%@h߿?t0>$ a}*ṧ2?߸6, 4\0>$ a}*Ṧ&qmtr+9)B [BC|D5 @:1hhCB`6 KJ]-VQx$@@N :\\taΆ|_IYy{L_R^:Sq۹}KX\ľ<\@h81>¿Ek^B߽aEXwR m[{ܦǴ_JpΝ6SRiӖ" dmMiD ZM{CxtZѤ֯]B,hUȉܖwV!摗pO51>H k'# Y6eZ5yYۊ rr~_.)=@x/>u0j8褀c[ C[L/8,'J<tI3=O^qX ={F A5u1/g¿q'<uK~1x,_uwMVP/zw^<ҷV{m`Bme%(d*!;5*kV֮aY˲emQ #z=?~r %y+I.S{bT՜U-%%@{Bp^0ĝ3?{j3 BOVͰWϴOgOuEb~uUpw0pRl^Vjvq1(d,d %RDe˚/{`R@?dOuL[8 3Tkވ<]}Z8_45jvQ^U2sOoeuqkb¿oh 4cjE{mY8[OM0oSo߭= C+WTgTT֨|oAq2uտb ( _2گ? 2sKՒŝj3O=t`JX`y, QYr5kOސ="{eRρ=Y9:ՋN Esթ/vE勣D߇/<|U2s{CK8 >i:}pWMQo}j11ǪJ;w #E Yٹc˗/QSs/,a]7@ \;{P;z[gVoq5pL`r9r5u;d/ɞw]^\nJ%8΍W儀˗DkSse/ʞ){t#~1{v״ ~[{OxzŋQ Ϫ :#OV6qFG^s#?7~uIs)H')VB'Z@OA;/gp!?sjX0(74D'F/8 9N.TkW-W[6Uv>9hSW^>͛777o^z 깓'S=w* ( Y6eZ5+kWpd/ɞ%{L'=nAً'eoo/2'c}|gԟQ~ޅƹ4Xf[qUnI`xֳղAΰt4>4_վk:܏/}{)6P/N WHb:Wۧ\È P UN]u˻{5kkgh`ģ[6m[7ZjˀTS@\ȚVe Z5\߲փ^ #W#xkSCΈJ s SX?Iovu)2"xςU]Qs|jw|)L O\oiuܱC.[7[5֫a:͛6R]꯱E/ j=0R{6Vvjoj\oeL4VFBL+ -:(Jn k( Yd/ɞ%{,ajNwm2׆#ߣ} [^h]oЋrR\R?@`z a ?.9;]jnx ߣ} ~B~Aϭ>*7 ɋp?I.pVw}'(WusKռ*5RnߕjG)7 > YCUސ="{EC{ s.m*)]wo܁0># l~8Ǐ ~`ߠ[ʍRcE[DrOCCSotyS"/ݷGpw|`?|x߻wߠ찳Ѿ8-kJ͠w' CGUgZnT(nOn/ oQ+ YC^e {b ̠}d܋zΜ:˥t]ߟV67Tǻze_ 9 x]aCg{=+gm3ZO7qE0į_6ho-R5S[-wS@\ K;wں&5-o? jycw*"}Sіji%̄KgZ!:X> LkmuX(Lؾcn2WnBR2eYӲvɏU`轓`j B 3fxU͋}=2+ȋݏm {^ >R ~uni0Vnfݼ&,t;E XOꭷٜ֭J%}*OҺKIJo(AYtU]QuhWϳ]lXZjfQ1*d,d--dZ5+kWpxC?c: wϞTV{}T+W6'sg®cۦ9:7@G%- k<8wj%WM.<ڵ࿸:7@Hu'; Xߩ] /g 6 yֹ2oGOo8 h=jK ~Ǽ@Yqq T_ GnB̭@֒xIYlZ^iA^VRp??g̞(+ #[ {/ܾyom] od?#8 p~ڶb@3CUMߺ]iO6 \ƍoUʪZ5՗iO6t8Nۥ$uժ/r};WW / oY;7 kJVd;֚.tJm} uX Aa>}&?&7ru+'kUsKC9ac`'KwEEݛj˲nTI%7jw>]Bg͛#+ܪ KC\"pv[tطK/VmծidwCm؉-2cp@ `hOPXSY\[^TwZk7Kt.H`\8۟P_Q6K]~˭/W6(/s0ZB}A˗U U:ǡ_.8ѫ s-^N+5okjTNC:@|}B}UWAH'N@ `ht_Zksu T/b΅h^_ZտT6\Kma;+jmOZ0Gf r{p0n'^S/.''̔r{0蝅ʙ]jUOa8Ƹe7(]ԍ@Z59Tĝgq} ^|A-[ҭ7ʲ/WHv^@>StZ^Ք`:@W=L ]] [74:Tx?/ƃyzzu۽b@ƕKSnqEK-dNοSO 8ۏ>[jSw|Tm] 9#>[G3'7>{\-WϞ*'(]:a QaQuɓT[|U^Ym] \{RCoQNIk޹z bvܺ~V-jm? |M'{؍>%c[\'=U9ySyS;܏cKO?wR=rH-j_rb@:0.I?s:ZR?[5N0+'IO}풄g=<[T~Aqrb@:R \B[UDZlKmY: ~]nc(*'aϿ l{S-xzh>7&G=ܶAuURs3}_N =wxLU+_/'|wH=܉~p!_s7C/%c3ALOzr{];ܗI~ksj8 /Ӈ`wڟ$wΙZ3'06i_"?IЯU%s%?iȃWu⼟ZALpk'-eLOH}%.՜|UZqoK|K]U/?$η>#_e |8>> nFS{/)ڟKn/H>0> S?W?z|` ?}$ҧhμ}r 8?"sFb`9laHd?%ҿ}/ `HaHd?g|CIhKw̿ ÿu$| `P?'XG@O/ S:@>?Hhy)$֫#I0WGaf x4d|v[4|4̿; SP*qJ0O>@ MM?O#@ Pͻ-~:PTzK0ռ@3>R=~~F:?yɄxK&_2!@3>Dj4t#0z@R-~>Fэ?} YI&~F3э?=@j nэ`|Rt#nF>Zt#0C0Qn\ Pn#H=Fe|RF0Q0rIG7N8q@F6: eG7.g|RC2 %)_2a|*wu}f |Onc+'`4cFH_nJF =@| _h 2hO~ O@z0>DHJ!002S>/?%@2Sڌ`Jn!01O+S &p"4hjL%OkhՔ-Z@Ho Z5% YS=# w *J`xNi_HO w *Jҗ-`zLn$ܫC 6O:jS-(I0WCm G`(U:T w_TD gmJ`h?,*E%@zI0(mѾ@ @z1>xt WHH``??@""WHHh/ US16ͨ0.7>%ο%@6 }$֧u,jP;:熖Jð?#-RgLV?鯍͘ & s@XRRೂ՜|5dz} $ַ}΃:` pI%@zI oY|;=X\ҾE @Γy1 ҷ?cˤ!o{wF w6vO[aJ 04'e:Ϳ@Xłݜc3z\ $Կ8_NS 6~7gU9iZTz$Gd~S TKk{i3H-Ῐ<$P./:}?Uy4I |]nc䱭z,q9IOUNt$S |MP(<."\ߦr<z{0:IU74 e@p=gܶA9qT5ϜZZ{2 }8 ccgO¢2[7h ͛{)[n9V@ =n5QuQT9LԆEs?8~1UGK:z䐺~Z޷0LH}/gU1K߿Gy r~}h &ڝa88_Uԫk׮%gZv'%#惾#&/2`AɽqOϏ<u<7mV6I6떃o$kn7]_Q5i't3OW ZԙO[nTeB8 9܃f>Vg=n;Uнu]^M?7p.ȗ3]55'}OiyB80)WlP,,czfEwT=Ǻ5.Ite.dN͙̩b8'k.OH@>j*Uҋ/X!򫯨M% JpgU j*҅%(t^H}|_EWT]}Sh {La)hWԹVjN[@D_Bĭ@֊@A0T0[!Z-[ҭ\y {SܾY.ZHmϞVת/7j}vB 9 V/VkSƍUiE J1u-! {jkӼ22'pZȚckq\_O V0 5Y_j@B8j+->&zu4@1ӑý('SՔ=-W'U[Qv^snLLvnLGC j3tvyh 6ѫ( tw adhQVWdVie@Dƭ@O֎ ԇ:Z]Q9q @%_N* Ԣ6vr[o 7RWk*"?%*'Su9 su7o[oBFdawt *oFjצ%}%FnJ?H(ZA{Y8VPpPlj6#̠@@N@4WL5=v%e[ǤZd WRDc]Zݮ6[~ >~D-/ -Ӿl /S ˞.Yfj˲na>Uнdawt ef*!kiWT7nÇ3 C'[3BVm+^ZX]6/]?MͶ]v8=ۺ/ o8\G !sV kn kR֦QYf銉b}oTNrت9a,quU`˦wBׯXG ZH=)״m]U`V,V7߉. Z?t ˥OPjj`Ꝉr劚7-֒G(\ݯ5j{ڟ:߃:LGY>KyX5Vpx Qk+õ9r&CרYYe-˚ 4Z4{*'k3y:pIr?9ۿ*/vZ%m[U{ߩ!EE^Kԟ*ԗY%u }Ws3]ox$gqRr;C55Z% yJ.!R\ԾA |aWϴOυ0aK/h0  -n(t?=U>alGq?.(*vnUݏmRR/xQ6U,(<ݛ4skgUgٴ[- 8@_PXjb…:G wyU-S[X? #-sckgTT"wXW5Cn2GncW   'do2D)I֞{|LED p"jU"`E hE19؛'ksΌ`M=J5.G}q87c$sRJ>PYU;P}yBWRYٹEYP&F /r]WfvFx ӺVRo~%pTPj Q #W .=#{G%S\`Oqy:ۍ pPSԟ]; 3:* -~p齓b TՔҁǷǜB/^n0=7A('?5՗ {O?/( -~hBF7ZVGQ9iZI=e:sz! у >[dɞk/ U G`4j\}`J%r@?z8xM}]%ZvG*L_:so ƧZvuG%Ds9 @,ġCowvjC>%`}uUgYZӢoߨΝzƺ`tpNEٓ7eQ b_2 Γ`cI?7W'}:uptfhpUn*l b_X Gěû쟄۫wM|~;*6|ٜʰϞ'TEUC>%`$}a2f>g3*Cm[٫lZ?̳ gOW/]>k͛ |^U/{^~)uԾ\ ( Y6eZ5+k7hֿ;d/ɞ%{L칃;X{PIٛGeF{yرZSyrPܭ'0Wu7 {O_yer!%'ZY*pG޳ݤjܢ\k9zSv?LA [{O|ihN_zeUSZ|t%Wۧ\Rܟ8VINlQmXܮ6-]`ٲGm}duh 1;VkY6-P[/_ #P:&UYòeM׷uYe^ #WdSY{Pb?t߾ %XRSg]m%@C ۶nTBcڗi;Lm %ѽ}폲kT-i35W2g*Ïl9}9c>v %kiyT󼶁m:svnF=uZhpLr|Hۡejc(E]XZ۩ . T)c4pna؋=7QL#H!Kdo Cs}r};'wƏQ9I0.hsHx. ( ԥ_hgN9%{ +J%>OTtᜭD}ǹ"xmp@ EeahX.^z?iU\2'x_{8q qW8Jns,9 svY*&WUI$WuWR -6V\-TfQxȍ@@p7d^=#{GP8#e7UN[6w{3UN/|?7h0Ԝ9(.{{K]X ' oZHoh vW %={bvU [r?9~M$w۟PxA 6.e?Es;JnsNzEX8US4cj/Qݕ̓@ Vpg}QxᚋZ+ YC^e {BFcd+&C}D 3{ڍΜ9(V{Ytճ%XG]ys#=rHUJfNͫ:k/Qm^YO `l~Cc9GEo^+ǭ#a{ Σ]ʑ-%G{ao%rƦ`AW|?pʛ 4_h_ܻL+8==Օ+R" `GV/:`-DAh I%[4NPl-V PkKm;ZlF1)f sf kn kT֪YYg^8V>ilwŤq :WX?ysP=C[*-Vl|&\ u9ֿS۷{ktڠ`E{zsSa{i =^r(%|dm0owyyA%@gg:{‹z7% _Z8}Nu0~p^UΞ5=VҠje`\@hH1^8ܷ_~>^-)Tȕ32_.Yiibk;^ 0. tl6=7; _~)a\_<K8;w>ca'ղk{*"nq@4w^iPY_vd he7@dhO5%k+VemO^*0|qEE?~g2]$3wKڧRT]0[o'?3 QD?_pwx=İ7Po߸P >{Kڧ%ć^0ԦM[ԍ4D XǡG85J@:1SVmծ_@GJNlpXR&Px;~@Ƣح:`ϙ|PzgT-ܘ?%@oҀQ fruk h%~= / w-Y1ϟaqz+ h%s#Dÿ8%@o0@G-ҥ˯%=z@_>PرaKW&Px#Uv7 eeEk9a(# 7apv>\5!f з[?wfPC V yj^:_]y-OQerprW{ouEX%uA? V }yZP^>U~1[.ݠ~&~;.ЮZ:;WU4,wv?3(|_n+ADx<@ͩROyZx-Nf(d?R ';C55,UNΌA'ņM;b-_v;:wN>x>uGz^gPz4wNn%οP%sj{Zj=ɚ6Px=KUjJF50'@>_=G/K(e4cb3PUNQ԰n';-^߿A]#R( ’ῶQeN[#'Ԧ;zi @ڊQ uM^<}5RKf_}c͚c9LOzrb0s8&()_/|t|~@ܽw`,˳;i2.JXfV>UQYc;˻v¿ظ~G#GOPҖ V ''Tފ<[t__6v>yTKdzS0d`zr<5o :[aeLҀyqo ¹r'^6 bn@PZgT9L0=g8,>jNb0+Uu9z \ f8, oUb>q;@&g1ywVU(|Onc+'evtD s%]ڭC+ K+K?Q0a pv+V0mG>h*LOtMkJ|:-XۨV/,H3K_E|_Wu  {QS$4 it9 ڽob3,;WWQ ^7 .ù M8 jkj-= QJ@_cӗk/ ԓ)R{@}i($vP #]m`ӓh~I 5jۊ D/Wt ?9` =/,(Q{[<ڧWMUks?` xyXjkvTXdZеTu6UЪ[޽g? m]M?_# ^!|+XͳjGsW/*R+ g+*T{6:.kw> 8!|[w?9vFA몲0vTϝTf[a}Gt-_*u\<źx}j 8!|q2+X_|(FoQ]S56uXn֥ SKW:.oxԺxeN @2>'%~F*?}8,vC՗[ȞqR `n+XX7;!SK뇼O ;!YzӦmqR tw/]Xn3p*gcӃ 3wmYa+ !7;oN7tx'Fp"4hj$2tg:2 fHg|vET@Ly¿Y<,aɌh+ !7;ӡoPO7t'F*Jp~ %#*TS$:7Z9Ȝ!~.v?W7 %}vthZnƔ)9&L0}eJHɓg;֍L_f'S욄./j^VuMA{r']T\DcT'=U9yaX~x +&M3>RKG o$]:sb\Aq G!.\TYcN>ba<;/'ԲkX֭bvڍ1|On#qoijmn붋Q$@B$ޜɜڝY+fݟ%0: KT-[wR,@Bĭ@ʂ E0}]a#@Cck\[72'pZȚ]d|4eJn_O"=L|GiF TMmk@^(ܗL s"sV 'kfCkfVLΙwҡF>?hZA{Y8VPsRwZ45ϧH̍ (|[k:;g%V1VP#*m_TN UWפ/_}B56,֨V 9\")d:`d kR֦QYfikmYYUSP0]P#a/FmvSS`7= S+VVO>y@‹wUnսVxq@0t^J!7 # !kN k2tʚ+kXֲiY{##{'Oz9%02J֡I,^9HkiWk֬SV/@ fҺCn2Gn.0TmYeڗ=0D)/韹#;;g:%0$ej _kd KU{{Za:r䨺|!S@snu-r9rhq^D Xd/Ȟ!{D_OyFLE@ ,v[dɞ+S9T)پK^-MFs@=uV/U;v>{z뭷<>se/ʞ){4na e8ez}HNh/gur:ީ-WWU<8h|)uyu饗5;7oL8ܼ;׮/g9|rڶ}S^E0s kR֦QYfeNtޑ=${I-cde/ʞ){Tj#2s:|Y\msEs"ԌVkhhK{ݳH-YL~ZˣFBڵԺ-5S@\ȚVe Z5\߲eڗ= {A/{C3칊k^We/O<3;g4?0:;]XZ۩w}țQTyEkT↘D--jQxȍ@@P2@d^=%{KW3swN{73g_6NN/wvVm.kʍx':A`|UPTj"]SJ)`hhlH#X@+gd${*=w9+˷I{ _zƏh`zMp |mvQMw'U4y3UAauzIP_Zзl}QxÍ@\U5/k_7,ko^ڔSNkY:O}^Fe-LrM-G[=k@3%̜ܙV]VVשƦ E =}sr)d-˚-|Jg|nJV̩9rri,L͘:ujW}^ܣMҺcڿhg?2~XEf>3H.WUskUC<@[{N U\YZ[*kV3xp[{_t0?~rss u5r} 7KڃZ_{O4;SszY\y 7*̙[%YS Y6oZdZr?þ S5; hiu.?,/gAE 7 !sN?XmkT)3s겳ڶBl2R0=e:u\۪]с`Ua'KX8z@ +/wPؠ@bY}?Ǜ=>q!PҾժ-jpK]R((v de.(lZD}90|xw᧞VM mN ={-(E 2nB֚O\~a0x܋'zmW36g^Μ}ѺEK)\h s1|]=V?Ys? 0 uMB f^VuMA{r']T\-.ӓ< nFS`0:@X~NH,L?F/J@_c`G@H@t M?O#3>R=~~F:c|Hhy-pj10$+y?@h=g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{g|{sH@Azл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл=w{@zл+,`BoIENDB`teeworlds-0.6.2+dfsg/data/mapres/generic_unhookable.png0000644000175000017500000040025512140200333022171 0ustar felixfelixPNG  IHDR+tIDATxŞ0O]#;Ό**Q$A@ " *" A$ Ir>3$H$$ zq5kYw:ӽ;wuK=wJUB'_hFOT濗$Rn4أ UwYүMts/DϖtߺiRߢr??aU5<ծC7YPuh$вImO^(Z6Q`6ܡӿj/k^-L,Q;z7_VXձEѱSԿ5~~ªx]uaߠgFH{` :`dP2# 45U4?,д߮fI I4R}\?1UR_+2/jfnR' k7ii[_h~.ʪWZ69f n\RT$x5˔rkRZQI%ӿ{@|wz8U16ݳ\l\:R|4(_+O&5W>Y9VI?ZZR}5}kYbidXKO3*~SbZ6Q)G4kg]BAƞQ|ھvY1.6-Xj‡E72QU,[MˡmāGčwŽ{ݻCϿ. eԹsIpkf&7#x嗿JauM￿^PΞ uyY8us ꏉs*d/PW;kbUb臣+vQV3PعW9z\:}V>KӸǨjv$@"2V z~ۭB߼T_mQ2_wG_?tQޯ_ݖHOW%X8b8ujQ2?-{4ߡϿ$ſۗ޼PP~tLţq4?&Ω7Y>|r8v g@}+ebb=DZ=)>yq.qB|qQ#o?S<>|8W3Gz1DQ^4s@w;j=f3jMmĆ_r0V]95a`c\(;Ί~?a;=0Ntl CG{ݲmҬҺ[3@w]/WQ6Cըlt{7s@ҾxblٟiY݈llߚ:m3wD9M O ͻ4nWK3jMƱ+_r0Vܶ 5a`c\(;ΊJ)V(jAh̻n]Vr}*6iYrDXA_};@fu۽ b} lׄOO'ΐ8if&M˔|6Kcԟ-~ aØ@fUxhEber2fz;;!sI9~V>S<ןJvo/.~g>Od ϵ!0U@cB0B& 'ㆶٮsUsߕZ=oc/qmXOϣdmo7z7〈OUD36ڿ_"تy{ސ`є^zS{K-V*b9g &ywzP?(Bi?'M0yc>0u+H '6Fը;6\;cb錾˸lz=&_=@˳xQvwZ҈xD|}瘜Yq+* \K!&3r:G\p0&~J kDSHF+\V*tץŞ|ͿA'(@A̿ՐL/k0Or2Q;p x?[!c0!@Pi_g5%$KaO^P@X/X $Sy T@tW{ʽ߈`ATTؓOAmQG @l @zV QjHy|v5'9ڏZE1{ (ϴFvi/@܊_|.oyZjU)+ pwޗ*C=Up ~JGB6q_%!ש`L:T:m7`e )fc3#/k0/rkg*@Y޹+ { V?[d]k&eQG932cdX T>_9*Nctס+m7`eۚ )fc3خv53avjd,\@@9I{V`9dbDնM2vRΊ:#dV`0e2 2Q =6G,Ltgo ;W`,F (,@v+9π Z#xrC; %K&}>Wo /rV Uq&& ׬)q6O'_9fa8|{@WQsLy00i.3]ާov (5/1M _,^!'2$بer[n+LMIq-fI,.x|½IbTGOߺ R5o =)rA/5k%ˡf]VY^l᫭zV pNIBM`Dl>29OwW(`${Gv/Z$X Z9 KVJKB=VY9 h,V@]LAnsT͊J sۉ\$ %W9#NVvqm歵C˾O;~8."1:G8 0 ` |QOd3ܱn4$cU( `bK6Gլ(q4a0lpZ Y(2q!yrmH<ǵ0벯IȻHZ>N8 0#[q&v@F}سObUx;Ywб8hhnG hO;~!'g{ DTtރA\=!`e3]mS>o֜L)lhۮ`@<ɩQ#XNrzQ|q΋ܟvұ=CǎY~dN`+@n|ĭG#|YQ}6uv=PR;:k~*k@s<ggߩ^ytC hc޷~)z]KϸG#|YQ[a=PR;:z*k@s4ggߩ^ytC hc޷޻z >yג3ni/@܊ ^XmL2E] 3 9'xw'vt2=y-ڝ]*#F8{+W`cyB7-Ը \*.@'h1Z?)q3lR 1q[;hB7-Ը \H{V\ou&L,?7Iݤ,ɉ{Xp^%3 >%i =sϿTyw [Lp2t2LX'vB$'aۗs h{@+3 =σ5( n\0iIcV1'7fg&LBGS9ªQXpʵiw 4 {+_;@E9#N P${+v* u <0iIcV1'7fg&LBGS9ªQXpiw 4 {+_;@E9#N P${+v* Faq+.lmڋ?9d0 $Im%xagm`Xau;2l*i7`穇`( h,lUkMtʢ_1D7NoXxN S0LRVIpvƊV# Ȧ6q+8z89]`@c9E}(`:֏U\+hA2*~Q`W 7nj03lf[7Pmk Oe&N$'a2uՕ< JK9'>L2ԏ-Z"XB)VZv"Ч RV=>blgL|׺^l!kb mM$isMv;72 xpJygI&gS_g#%<:VlUW$(aƗ&9dOa?.Yg,bމ0]нk'1]Η[ m':' ,ܳϳS_Y&MEǗ(eDb[4L/wAF^^:1er&u* +UU&r?={!u@#4`|N1<Vyw*?8=~ hG7h޳vohޢ|:H?۳kݛub)L"+JTaTbʡ$QXåcLaKSL<2} xwx_ ک~JID `ٞE?X 0ĭ8΄>9eU*%LUV1 u~ߘZIM$'l)N&Pxԣ\焨cy@5`+~;ψ w&)L&R)aj(zi`HoLH$iަ n@'Im<@1zu?fuԣl~'V? [ 0ĭ82 X'  &Hd_MUȯI^!I@4WVT+n`jU7S:9U 1QE,%&j¯B~uM[Tq+ j7ω^I\c5*gP^PS'ՙR4&V  0UI@! Pn;P*j7O/$u=ϊ59u9IMӘcJXa' H&T%i Ȇ"+Pzv((g@`'gluƞg#/i/@܊(kN"ljJcbm %0 o@TGٟk7f]A VR7'n5v1֒`Y޵T (H stB+H߹J T n dX[ 4&YpT@(U}^YP}o@:I@co_N$i Ȏ P%%mĭ8NokI:F-k׮`@9 `M$8ookI:F-73\s( 0ʚ n, TRpMِխ$N0L*) s| i`@6d@u+S> 0"[i,l0…KmE.D#͞IT#C",l0ƕmE.D#͞IT#CX jf2L>AD&29NNn{NJrexڱ(@a&Äs8Jd'cx4䶺gI$W Ȏ΁7hP^]9Q$!03 R}8\,:PȬ Ah@j}j@xE-H0 f~a{* zp ȨTD$W SL"(ﴖ?nP@J!)cX4@Wqm!IBI"8o0պDiE`%[@\ofacdط#0| ﹙R NcP4o!L*%D<{y2 / 37ob&>,ܳH{n x[i+(JI6^ U,[QD@=]&&@'L17+u"'K 8IwY+)(? |FD@aZ&&@'L17+ 0ENn]JJ# (Ͼ,'` nXW1!z9@=]_ `t l DA@]JbzF `@wPLi@~u?fbWAmF ݥ!+vo8PwȂ1(>ZI_ψ4S@? 0+[EVSҶ::vZ'0eKQi;ͥ!y?^Z'0eKQi;+ʁGCGd_D`§s^4PoeRa@@ /b+~~pC&ԟ2Kn g@^@{Z)|c~d? St"Hqp'3N?wx^ѷjl~?] {TT@'`.~2W;@=ZE~._e$<(-u3giQ^UT!qa_dDxStɜL%p`6ur&o@nI/ {!QN]%s @0UʗA)ʙtF~qZeSi&I0o6Vw5AS$M@ -3sOYO:M0$ü۬:Z݃N} ^t7NWDxa?ed?H{V5FN 7VwF>J6p&V1ϋR_ Yųy>-c@uS{>Tov"|Pm&L+PI!c; X$гgos}Z^U$)V0~´F_ w 0i%e oޗA;x_$7 S`쁍}5sw 0i%e oޗA;x_$7q(ڹ9z\Qr*6c|nѪuHPmUjHw_i20CjV Ss&tVKGC=1T'`F;W*ĭ".u*^|\eMZj ѥ+cс` V>r3k xOsND6+:Qjf]0t-P`@ 0q5Yۯ G`@ xK޵ mG|f_C1$N]ȒpCbsgo>kعk:m9зs}ɤkTEu~O`Ma@Il0Iԅ,jO,1xlMF։u`@ dB<"mcJ"8F*  tOy$+W\M h,urIR*%+ `F|8?𳩳c! vUF 1%?eyT~?{,x?Е+.&4:Aw$) @Q#>nчU3IF>SvV1L[j =(g'aԧ 4& a}V T}`k$ 7kajduɝڍ`Fj}2Fㆶ+@oЄ20U>Ax7`~1G $YuMb1  ,Vp[W柣1s-l'O6ض}RF[@WxA!閚{ճ|Eyތ d0F#&- a`1**2Y1NٽL\= Ul_;IF[@WxA!= V~g0UA b`4D,XL|2vJYֺ8 S OΚH^Q;8\'6kY1!l7,B~ cGIKR?rg4H2`S_ 0Q[WM?,k])څLv7/-5W_|\?pm 䵬AY!S^ڃc*oɱۤ%)3|@ $ey 02 b<"I3 ;2Kb xJY~V9qZj94 Bh'Ear(/}bzi# = (.P?:~\ =UA(9'ǫ +,- $rҎuSdY|W+{DЀ( Cɡ-?~`4$J4@@z14-o \\/YJ,j㦭Ҥ;030IvUW^ a"`{ `5":tͿ*"8@yCyj|LfQH$ $Q}[=Ry/2oa8/"ʏV CYK" 7Y d2@b1D%@eϒv9 =^ʯtqYif133fw4q!"_Mx_*|&:ref=)h'Z?ub*x]ǹ ?0=jVOd8ÐW ޏ&tE>9M2? 1yWRL)צУZaE x% 2gQ>,⺍zRjԲIm{l,.)M<G  `U 'J? $d|$A'8FOطTٌU5MmETy3Y$@HGb42$h$t1(lu= VBU gM[$D!E?hT$@HGb42$h$t1 ("i}CQo5ֱ^@Ĉ(.C#] xi2h$J؈P i os.[A%# c:3AX W-F````F^B `IMwYЯM@0ԔǸ 5@^w `Uig?!Ydxu{^g;8Z,Ͳ-l27`V)'}N\Wm Pp/;`  tkYX`E` [2  $݆(9PXoW;a'PTf @CE  GQO?J$@]-oWiϪ (E  GQO?J$_lEw9"ߚ6ΑP Q^U(~+.FϾÆ"Pw?e eC/T":h/O ?jG@[q OzC~ +3?'>3(+z]4f櫝bCj=b]R7Ԉ6e׈󖈙/S>ZCT8g5{KY%f̜/Hw1r ⤙<Ԧ={:7mb\\NuhۮS!!,`e#0\XQf,85! JtFnauǿ5ZͩRv,-7N5+ƉM>5 ޗZP.^ִNP_{+~qHyFc\@yCdyz8s&('Z"8W3۷l)ۀ:ShAf.(X3wN `d`j3aQ?ʪ1ib|#/,͛?J]v]\rM.Ks_;!jõ_K3yvd*ѡc7IU7&]ܿxX}Toݺ]/_Au͉Ӳ֬dY 0aן҇aD_)zYFtYYV'T`=ucOJ3 (Sҷ`F.' !)sP,* >>Ɛl2H %l^  0J`޽/VYM%LsZl4Lm&v==9d?U̚H8V #MOAiL.Q 拗Ӧ͌0llJ8%\k DU-}%c§ӥOVQ\3Y,\\ڀr3vda`_~Ua31 Ȋ92Xu:h0 O7`4ic0[6Lrb׮;I/&YGK*8aC4[?< jcF @YY 84=gXP m ?}ԋX9gԊ+k.*a϶5% " -IOV F ǘY6S!,)#cUc(L_x 0JX 0!.\a" M%#[/ `~ cT]w?c̿Xd;|?4r cŇszɵ| HR r &;n{F=iwU2u? q`q`Bo\9!'Ø=>=EJF$ 4/ޗ+lQbz1@u#0| <8 ݿ'?PFO-EprO1obnsV/2V7-%! $ L  lB8Agԓ pW%Nr\#+<v`4aW Wh|MJ"*2Fdv~󨻮a4jDٗ0^(@ ?CGɨS'*#;H ڢPTtkm֘[/ k( ' EݪT'0M? wI9\d#G2;?Ky]0Z:KBD/L DAXZ?~΄2I|5 (xݚ@5f ĽJɫ}$iDQjn$% ZA6aK*M;V b15~ `( Z~lK#@֭w=_w%;|{@ ƾ+Cqډs~}5sOnÚpQb@qNa!"S( & `iheFTu`P2wa «1dAwɫXz8`EUdggDUfE=6' a@r;V#kH;&% ?oA~FZW W{%^jJu[k]d9(H`芼Ou{yd[zg_ڲ4cL✨TҬfU ! HnNJqbdi٤'- y^oH?jx؀V+'98~@k!vω`lq$0tE':=<- H,kF󣻏 0;m~$U~'Qio80OQmo2 ~I,jeiM Ą'N~+<"wпls/HC a!E^x7}Y2E^6Ae`x\T}aTF$ZoU4?2G}ɀ V$Qkg#7'4P6^9wԯ_/=ڶxJFD  1tl(*JƳIϘ,꧰ * bUdkNdSԹґZieWS?v I0 +rKS2BqP6&D+( dQmV lY^6O9QM''I@&^N0 8 J+Vx0A`dBn];-d8%#9k ˟o2h$,**-˫&saW+MP2Gw4ۤ 8 "#Z 'D sjcpbzMUd3'P5x͘Op]Ṡd.x jT@&(B.X* pPQ a T?y('RpğSs]-6CUd3'P5x͘7(QqLL& 7- <*5_\wvK<8HWdg^mG<qMRP 8>dRaƻEDaV>+3} h̃ӊt%@V;0vʳhj.[`QVUa_֬e@0q(9G݃ MNV[(f^T5 )%yNh?k'uyg f-z8E?Dy`=VmE Ura0^`URǹi6v{}` zX Jr r[=Y`]:V1a&(+Zoc &$y5SQc1(-m* 8U1߻ucLP\W~}qzw|`@4y%̱4x$`7( Z+ `Pe7sl۾;@A Yj N ={%o@]VJhob 3:>IY^iF Uv3'Qrm Ȱ(d>rPi\TQi勨$?/03@+!0c!C5H34;ʙ=@) ~CMnFA:XGRR'CVo: ތJ mµiEe~ 6c[Eƥ޵W34;ʙ=@) phǢ2aIuNkuFҙ}@̩Z݌j&QGX4P `EO8lskw-:=+'aZPנ{ɣprht Y?h[ 0J|}D00nİ޽Nf",ص{F0^ 1V|0t M{Ѷ]'1qLi4}'2p:!!yIgl8=*'Pi-,y&A@N`C([0&VϬ#̿Z'@fmx@g-W<J200øڞ%'Pi-,xpjnuB B'FPfu!f-gV_`B@g!{)ye.1 ;ˬW  0 X 4Y _ W 㐟0@^/; cjoY*1L)I(161rA eR@Es+u Yw#*`\p׾CFԯh7hym,Xp3? %$ ]^&ɡXA\NNf1uHv,ٯ;|c^_fo (غjB#f~L. m' Am&ɡXA\3k'TwzHv`Q ,{p[ѭt2B  ] 3 Jr|8lnsud_h׾Tv>Z;r_Iaڍۊn0@Vf~L=Ui@8YPZ?.` '{rJxdnNts[AKYY83 Jcw`ސ13DH? &gT3_ě],zw~Q|5 (`6Sw~Pwݢt@Mm$u\0Rzu,m) `?n̢/f0֝L;>S^۽[U c1[͚(Z:@OTwݢt@Mm$u\0RGwI@0M7fїDs3NVmi.6UUC/c7z ~*^o/5\ 0B@V%< XնVۊ^m$ @۳_Ƌ^:gVګqư_/5k% ًiw_m@j~VU?FCO;~Y 1{[hM@V%< Xն]x#gW'IH'Ya1WW$ iґw& ׫ӳrPδa޴lX:|t|2wFZ!'Dk'q_Ϙ'|6KMIC(j1yI1Xd`=YqyjĪ)l[cJYT@5yL=,$\&Ěd[oܴU,[Fw@XNd"V5븯UkӾeixhAPM63<=Ir^0ˀ L'޻&n];-}h"fk;`9We 芈Ho7?ND$yB$Kiɱ˘>}W;~uQ_P%+""i8 - ,yfW N,.cvjan32(iP(_?u n;s!۶lvCmg; p' 8p=rLf=}8U2l|Frc+^ 1s|V/+~l&3=ϖGc}&ߟdO 'ln]8 `ۑ+ݧ"{.Dm |_w.Uܓn~Ⱥl$bg}%Ο)3IiDLzNv@ ч\X/1qH0^;V@8قMfz-񏾜5@?: +rPwwS(+mGvĻ )FZ=ޕs@;~RN; 8y :~Nr&$ d4kZ 0 ^T@Jʗqw_ wDϮONgc\T>qDayF:5'2lܴU~Vkw%'o쓓"?,+N{qӄ:;'(p{QyVqw_ wDϮ埿-ϦǸ* } 5HtjkNdݵDF%+0Y0stV+ (lBt ^lX'OPຢ{'?[brqCK-zV@?^l!uQGNKV`Ia3V@3ꏁQ@&لk491OD?tuEAdAqڏOf&?S?J D 0~5_:VI|F;~2()Uެ~I` 2Ɍ7cp,"Zns <yA<禮3"`OπDA0*VE@88~{È- lM  Q :Jb.Q@@W%͝.1ޢ!mh`<Ԫ]U],/ h?x}`gVxq FlI`kBX0uTguC^He7?L1@Wx\tĈ*mtiDD< QguZʝ [! Lt*V? Fߊ;H0a_cz~[{=Š=fXpY(0׷Ù/l fZ>}ɶF`dxVY&f;A = s pqآ\9wH?Z<N ez+n錾b c˜S_? M>Gv/ fZpggv-zƶ=Uք|g1!8ϸniw]lQ37`D"<&';돟#Iyp G. ~L~)K]tQi'@e(U^zZGw#AtgP͜N"`HJ@vt\W.RPۥ>GCaUhLH$-㧎#Iyp G. ~T~)K]tVi'@e(U^zZGw#AtgP͜N"`HJ@vt\W.RPۥ>GCah` 0? u変0z 1i̬ priQuW& "bvcڌH/>i~4T õ_6i~qh?@?bl5 ޗm _ob OWfK?YQ0fsa{;[i̛J%vS2` @&gL4FCQV+K]0L 0d`.L/ _NTH3&īL,`0U&u ˆ)H0`c0t^Y+y<+߯;m+Tb 8 ` ݷ^R _?x-@@cc1! eDY1uƯF$_ONf|F A4cB\ L ZܤA4EiQLΫ_< `ڀc1֯hwLP5{<&<Η/1n3y2`VNX e2DAX&0^%L|#'Qfebu[ f? U G ?DV ; 0 ~QY0}= >bQ#%L"7F3v.leK2`VNX e2DAX&0^%L|#'QfebY. j? U G ?DV ; 0 aV<g龎 {5R7~K()qvg/H^jZV{HHc~m-'yL=eDA`&:obj =ur'I VAG#'AY T^f]+kkP# D@1w~S}O?9ICMCDs*9 Γ`Ba~/o-% Ƚ0yT`詓c+#+!WA⩽@w?RF0\a^]~EC;I3b@MB׽Vo ʃԻE'$.XORQPF}Ja5J1KZu'u rR:U+g(M.ê7|jnjN[9n|v"etmhBƭ%).Qr?SYjܫ翪"aLVpWÔUm(Pmg_gǔ(IW,_]0դ:?mV " 0`@5jFv -QңҤHMz+Cxb=߿[ҦunJo1@K|+#T~&5USvG (J:W_:[A@q 0`::-iip{7%۷Kz{RK|c&Qj)߁7:h2C篨z6F]`T2 0*eF랬0T*KBCj)~sMigǿQiM>~B 8gg{Dd~.R`pa]GIPƔ~J (mw]b,ǿQuӼkMQwӔ'{R.S}r@oPt[w;)}bdJ`Y ".߼}rJS4(Wjie۷N?Dw;U-'FF)c&z5 tTs/r(l٫z9@;v=Zܮ$D$#)3N{jػPںmW֮\/W˖ 1Lv;I3Ca}rرn8gвIooh*,+o?IaUqR[~W_뗿?\:&uXŽiKgsl ش)gݩge_ZrR9vMBֿui.~WޓT9{|k`FFatW/eTF`)7QJd~ pn#{\ 2ܹ' /fsvit# { Mm! .`B.]* oNI÷oamn g]OKPYi&\V[}Shu뷈_m6rg80mB7Ԉ'}5c՞Gc8.!f5}<^I<ݺYid֬+ݺ(޻&/oJd4]٭k!<+\ Hg;p XPL(؁1uҭkJx~iz8~`\%e(zV HFVud߹q\`mzhB{ӌFW3[v8c飻d ڱH\9wH`o]yQDCY6nr;a^I<C4mJRM7Qcw2c0F0atO(c a|g)?{P&k6J7R1igSgg-R pHBڽOWߩT 5^|4rBc1~$SjKրwC?-, }(< 5lϙ]?o~JI*4a%c KĹ,b59"c=)?CdC}rX=hݢŦe$ B}2ݫKUNUG*څC,͇ꋣ{gm>Рn0"YhX1{,.ڻ^|Mֱ?ㆶ#i)%kGO{1 ?- @1mHUVӄc1}I՞a?ig2#LAP~/DZE5>,|:qvGFOF6`vVν0pB [0~0YmuDoƷZ^6uƟ1dϹn@aMYMuFO)z~[;dݥT0迤,BOc 'U{O;&+t_78 Nܸqv (2H1(h3 2#3%L <<<(Jwܸ#nGܼUde3s5eq=N9f}a0E : 2Z uVDr`!N뫌0m@t"A0pRIˏ{ `ρgչoOz8kŜʈiOnboel`@!ʧQ$ ШoYtW|w,RIב+WWQ%B RM"wҕcH2D͈BkBM `7avS80BƓ1N0{"VlK& A2<ƞ þT0YnaY@柾ASy~ԫ ,jRn ?O꾎S=GE 2H5=xvh?*# <5_P?qMi8 ` #]5?x2&8?Q\6/ڊm$?hSؓ!3V&M|6k\O#D^rMi6dpl @6w`ڈrwMjG]K!h7" H~XcJ,a6?`'q=9 ^Z{5ޘk4>>cN%5c_W 8!4 `0.A_A^bv! (A6L0L;أ2# V`M0\2 QX= {!ʏ3G?$iNQԓR}tr̿/a\:D{ۅBIwk3@O\j;?0]0r`c0W.g-V.Xl  @x`0^#; V}4~(HK1@LMQ X֎h@^0jD/+hxk"&t!62'x4V/Ue0uDnz3""E@' ~P SM]n 0V"_v @2=6qfP#~YA XXQm0r O:+ Ġz[2i:"7i`gD3zE N2>b߲q*@Zo"Q3eqTo"7L;, -H:zYI؎m `0sY~0jӶZ[O>Lasei 3eqTo"7;$ -H{]_Vu%-a 9z{t߃;Utۏ}4-ـ>7N lܴ54`0jz B 6Žu d\#g-@%;(>SGX,ܳI3T?{sUi w. Hp|ꂍ(inEq,@d, "<6}4Y y d }0!}k( D >̏遴 kmNĈ:P$P` YRmxDQ}^٥,۷j{^iR, % F/"kPfRbF4i~AS/0g;o7LXXvL?cJ&)~N(t:-%mI, 8׬ 1+g? L9g`y 8E?3AP7`{/9 `&&qsx}gࡣ*O!HDӆQE=F?Z{BQAGQ1zBqavN/ >4% L(xFH8O'‰m*O!HDӆQE=Fn柫sGz:{`SVP-Io4D" Бqt8@A`Dˆc™O#0ӈT4t0@9Y]n;"2(-F^ c'(#q. fׅDŽ3'Gah5!h&}Ȭ#̼~o<[ʕEsko,qV&TAMD1:tV{V /hM}~?DPﺛD?<[T>9w.eHOm_ܢ;k1njcU3[ع#-#(J]w[bY@HRW^ko8]QHGIN$ ؍t,H0xW|7un8wE"Q%9GHT\ŋ $pi1+ԙ3`·ZS^ LJܾzJr &2!ۼo/Z_RyS^RDl 0GP[J~ uƿ7lF Lb^#DJ_ﺟ53箓QVR #.@KE2`?hSFB HW*ЅAa_`K̀_9m [QvbYH"Q~ 9*:^h]D('5t4WvR|H3stWs e.ڑ*:^h]D('5t4W/3g&l?Lwu7wnu"\KE 32SU/ (o-U7L{3 s RYOdZ@A0_/B}AdGyn;)o7ܕ_֐`TDJ "^^?0./DGd,Z ykx͎I3{{-[wXkn&Oiu% 0q 0|(]f_STqғ { z1 |ؾP&6kT|}:OU NK'joo?߳E5};?.{}pJU\(r5vEOd6% s!4ߞ}eCo͵_e=yOOKnݱ^ ;wکcp%Zա&!s ȿqghO HIIcVEq= Fa.d&SzϠl nߞ>/ޭsp˵N[WNnvn::n2?܋7p/&Q)@$ʁ\8 -;9+g N"?Tݻ@knZW\Wr/۶֮۬ͩ+׫֚b0h7y &- =bYf(i,jFP8|2GͳJ\ցޜS=[ [/FFw `r-3?(6e[EH;؎ >>*[ʏFGo߾ ?e*C:i@Mf5skjgAej7Wo `0E22}QUlGs& #+ ~nё*{q־k eHW5 [F]d5?st2Gv}x&ȹZaed:*,"0X;N ][ւ2`v>|X_j1Gh}3uMk%t&ĹWd҄(,@S)qikvZp[ߧO*K-Ri}gRhx#[I;ز DMAH7sI=Ll!&ZA58*J$J^u W)qڦ[Q @9_S[`"{靁o[@nb~Kf%Dl$ &*lV<,ص{^ %yF&ĹW Y h@PaC aCT$L)?3 0q F- *u"9(d%^/`ܸqK-_f(_:r©@!+z0Kj0F(59ܪ@ %( ;-c^2V-]O;58k,  (~9vK%3kՂ 3 L^s ȭJʢ[bQ 2>chrkeX/wELiӿSiC{Y]tPa-Q6 `K0_ ')Qp ws* K3;ci ܿgz`PwdB_&l&L;ذq2]LG, Uj:5I~^qe@1 00{ +g?/0{1AnL[@y3_@<`)IAGtVU6}ڱDʛk`7Ƒ{' e5$e?/z2VSν۳pڠ{7y F-Tv/@$+cc0! $`k߳2;9wVZ?pD 19Q*㊁G?158Z{B`K\i}3Qp3Da6`@DrgnV Ou9j*c[3i9Kv2X{~_ÏV)A59R)p"=iP㠰uE;e0PWeӘ!?bl;yL5hZL0$}=OMLB אcڨmf%۠g)߽yV,3(wƌ- Fa~X2`aj|lfOJbR0`8?50 a2 L^CPVb*iF|F3/@$su%v5cH:j=o̞cf mnw8sUs uLo ZOT1@CLmXFԴYOw[@:WU/)9C>hemsc$x^Uwu&59jzRZXSGuU5Ѐ>7;'VcULa2{ 2s m^mXFԴYOz(N b^9^ƿNAj`[wDKHAzp/kxZ#K]@+:9HE{90l]5hks6Z"CڲuUڴZtuϳUu7 Y JVӦ4ifztkwMڽ[ͯ ]/JV?1=dOF=:dM:{֥;ETwut:ھn5NVN2/v~֧ʰlUZxҪyCiVՌwۿoꞇi+zB鋒! D(X>($MӉ?yuֹscOEE1eoǽYw Ԏ{k~ XjVΞ-^_Pe]~zg_~>K.&s&uuftYK֩yL4Yۿƍ^g\#N0|X)*[=U IStb]8hݺrܺyֺ|vo$]9OSv<[[m86P'kԩC' `Oo?ygye_~gCs.&z|Z=wźw\3ݹ~Jt̺v8qj<9ϼIH?(-&O F%v9`mܴZf*jƮhO" 4nFMv5gbke*O>s1757 I CJt33r<7Hn_V`ۢ ,"}Iߋr,H MߏVlڐ,}[ HX~Qu }cjҽ2@Qj>>JE+ͥݐ2%C~Lu@pϳ-2epS}CmXsg2c|eD?9/^VqM˱`%hdd.Ȓ~r! 8o_ s&RJDs)f7 d.ݛNNv@[cy%P n֯!693XgeD?9PT`T}(D BM(H ҳ?,?S֮۬,@VJ RfjC% r|vl~_0HmbAV D'TjBD@їgJ* *~a iZ0K 0{Ei>c:8ձSW룏t$ `٣f3ĿٮS`;zZK 83xf;*+ԁטq^.p/\!:@[^@PRyޛmL12l{&ӑr4adc1Ϭ^ח۹ߪRAg&όcGnUS>}m02u{ /A$4ߚ6'E/Hc:WTb>8nܸ01*ն(Ҍ 1YIٯ ܡf <_S>M{ HW~E-hW޳x4U@?hDnqTʻ^Qtq1ub{شaȓ!G,y߲rj[ciF ,E\PS Q3wѯʩp=++YD-xƏ(>G%X9`16;[KO(Eښ4z/ΛTA$@}g־C;|N%4Zdڷuś ^uTZ@6r[ 쓨:,`JQ0~D1?,)t3F#^~׸$ \_9ikyl׾lÊ' ' (i~=^QpXء@NQGWV $2N9 ` ;l6( @5vtnai-QJ=d&X^}md} ~L@ i7ilˑ,8_vi hNFcec NvۚA;ςh:w0uq*RI[k `2_6@Xގ>t?` ?S\鴛4ى#Y$qL o'' s_\9{!@gZ pLP8؇LV(>=aI%G܋sN9fǦK*m@Ϳ9P/=ƐgqNW3-d{}`(eC&HQ}{ԓJr~'kͤ (nяM}/їD (槍&yNnKH F/{ 1hNВ609b. ǴwJPO?L̝*Б@^ǥ=hCګ~ ڽ 0 nk|NدKb/t1mĻ.@$2܌_TZ\؜b[ t^?yg; X ba Zý˞`s;x:>^+`OMe+UhB;z;9m{P3\^g])ibU^K + ?!>¸Q,z*k-i8u?t~{+D`HKZhy hP`=J[y,f*c܌bs,00rh/В&xZ!<ݮ+qQJ7 B4h黤ŊߣBaV +*,;eF(g@S^Գ8}漵`-[6UX~xX)LB jR1y0"k_ H2$I/p\ejhNwd8x:`>z/ޭѮM3RYgݮX $ґۨ&@#6j)$ATD"yǴaDԿվPlۥ! h=`e\aN]"^ M[5ig-[_j3 {I\~s&ѵ+'iԢQ ?,8@c=!{ǴaD'5m%wTN*\r Й d7mQYKl&0= WLmMKp\e$3AT]?+W>Wdr,Dن`4SC"؎dpBO76:,U* `DVf!X ici?,אd&H (X3Dg`04zptƟG~ U?mPa,ڑh;H u? pekoxz6 N:0{)6iSGviiÁb1a (aƘ,F.1n38 G6@;m'Iw'n_=_RN N:0{)6iSGviiÁb1a  P=` Qg (;lg4`cL .c1ݘKGqs \#ӧ 1m IR yp^uRk߮sq#$`A9e`؞߼?RCL4|L= )p|L6si7(.y Й 5r^?q,?} 4^)5y0wQ{/uȼF ;_H,_0{"eִd c9_m׋cz@f̸3K`2l~ӆ3 ~YOHN68 0n,IofQ\;P D5D* AFM:vdP؊h'Gq B1 PՄ 8_H@!`4+ӗIg^ov8`M@ߴJ*\Pg 6nj%}?Ӧ.& zɾq_~ m<g?(&T:Q1D"ZvCV\d[pf /־@-$_(zQ Hh }X6ryboq7qjY$DqԋROHM0[rRl ? Q!QQa ; I]q(~ BDp\r h(bZ= 5M~y h(bZ= 5D` XYXRϡ˵QDIQ"ݟ=2QYXRϡ˵QDIQ"ݟ=2D` XI1Fqٳb ̱I#r}UK &8"\Y"jFseO&W䮸4|+5(X 4slA}\uRI=#Hsޭ5M]q+  s=f{s`6'N|7uJժV7gJ#/@@^ s=f{s`Y Or u}95oWa}UWLiDD$ cab.QX@$>5quGm7!|~/蠗,d#Ly.-w%Q_@s ȷ0IE(?, 8Gv㺣J`>tKMX^< o`/@$*LE0DxbWrq#8sa:k"IƛfX;X[֬dM2бKsH'YO3:%i^VNDya+묉$_./[b>)NXk]a:Z=տgff52BDx**tFCmڢsVf# HVIU7%?ԷZׯ߲<קӧQ匿WoX/^Νޞ|}Ԕ8j7Sg[ -6mQlD?ƞ!P-횉َo @X#6| B$c otPkv7G@Kf`{t|:oZf9^c/ # ڽ+T?'yX@H>>}]$c w+ @$a#Ŵ R it05D?@}_r'|0qLETP Z _p{}/4L0}Qܞ-U\L(XEPPTM_cx<.vy lظՄi KT}Z@ *L/=m4W)sV ڳ0(K`G(K\M6$ ¤{[_HT/>Y6-m4 &@!2 ]  r})_T`7Tb(eҦ1Kb"S SSMKA ZD1iF9(X甎lcvAFLHTyb\d-P!MbP4DnDX`N@s2"QL3A:tdctc:1!QBwlq㓵@=4vBa aXٷ;"Qa*J*cT%a`HPJskNfl#3P#Y!7Sן'zG, VdS?5xE}fL?}Osk6'iKmkXGv} P7 `.4c1b+WQU KlŽ~ʰ9@ywD۷w] 20==D*[̛MC|*l4DkLN _OKSд : KuEfsc{{_kp 7&U(&iy'=ט.+ LSд : K"7mN2d̞Gg`s ׷`7\@ CGn32؞֪P""nڜdehGiq#6gY7.#č12X`x"+(6`1M|F۳=O9Wlaȡ6(YY汓ڽ_-/Fϲ0u])kPҎ xFL7Hs".+P IIov֚uP) JFymPˋQ./sl;Ls[bm\G6I #@;v9 ֖L#0}O&PO0Kzm';mp1eַq^>:JO( 30mxY@GvDI>IA("3%`:F%M\wRul ˺-no~/ n e#] Lvuʴ/Z\-<~L\X=aE#M,E1>_1?V O Tiq?.`;): H6eݖZ#|4a1_h?@ʹc[TXsKiY3Y-<~L\X=aruxMNMƜR7CM^V"!~E?O r_8Me\pPw ?k/SQE&bjG♖p?D?stoi-  5zZQ< 3NtW2mܓe!ice"DkwQh3cNpR3CF6z@=x^jFT<' ѿE8aKU+ xal)i.c2 ىE{nD^?doF8'0KI|o &P#?(C@v2\g=wޯypP틣}}7,RXՅDh7"t5VAe!I!R[3!:DeZ3'yL Ź6AU#fmFE"]oPQM@4aPƟy0)JU=fmFE"}zJIV:HxG})S`ڜD:Mӿ424$@WD"<DrAeѹ*fWLCje.^y)NUT9h#( W__h(9@,74vw}^WEʁiHRbe_Nm_SaB /unHھϺ]]s'&%-Ȍ`VD" 5?\d~nDC#۱~z5D(a]b a2HD)ǀ"s|\qIz\z6Mov&Nas@iCsn߱Gf.k-Zr}h-_Ϊ~*@nF+*{֚Sf*rr~޵;XGkO4"Qڹkc팙޽#?XA2|S+EL> m{ti&ϠOU N٤t:Sq*۷:cITݛgY;7LS'|͈lߝwTqݵ{WXηVL|s})i#| K~<Ƀ.{^}@LDI*@{mf?q#_q@)]nLm]~zg_~>/u%{us.6ٳ7/ϜΟd7紟q' j yV DY #~k~ࡣ PY8 * `P^)_v1n #.3`-څY\=oOZןϿ=}[]Q?A_AMW *2/_k=TyџeVw,GGo߾ ?&hk!4yf|3˚9khrV{T&! u׾x uOOUψLz F2-Ot?##;}λ}MN2Yy`~*G9&]Oi" ?d{SS?Q3M":~ *bGaSfpy}tc‰4CUj͂ƪQV͚ɪݬMB@4#})ꞖD=#2=Oz;~;"ʷt? ;;]x2dЧ=V% p2:Ϳ`61c1~tFK@s CMd}ɮƛÇ'zsQ' -k<7mdlG-g=}>Wlönu?0pxz]qb*YJ+nA@d 8!t'l֧?T9`>MoT90D֫fw5d-`>?Kws/WMY3ܴeNg Wq!9.=M+a[ d7}. }q& C&S  =SLw1zB r>胾<"DIcD1˦۶qDu$~߹2-BdZAe@e^Ҫ1Sc U|6:5[ Ovog|wPOݺkuG na (I c| a<"*2Q̲-D\?{_y}_S_ȹٟL?U 0UcHU|6:5[ Ovog|wPOCP @C[tq9$@$ja"Q0` 0J {Rýz6 c@$͔;*`³8ة*&?JG9.+7 ()IbِO&$ 87Ss :'1}LwU'ȃخ `h @&/د+jI?7هZbN@^/@$ja `I.z&Vij7*_Lq* >I;.`#QYmʈ-&&ڜmھAA rLz|OmӺM=3}`DoW܂'OXa٬U*/%U@}:w\,Gڔue[LM9ۼ[0_C)g_3B_?ڦGǗt!c U2 9jV״ "lݡw7FeiϏ>t 58yF4@C#Y A^Sfx&rF ξF?{~FFYؗ"t8uV Pѿ6BV0"Vx ;1*K{NYm5RjzZib~ꁐO & @$ VILyg\4B"o`~FDlڏxF|<j1oRu<"?;U?4c{ق hP9Lyg\4B"o~FDlڏxF|<jÊxD~]wnT)3Vpۏg[WO P-]t-UO|WU`Nkv @$ A㇪u'OugU@K]Kx~,U5{Ef,48mak5FmIFL 2L3@ݵ ]5(J$-moߵ6kfi0,`D ~دG4V4WѠ?7{cUO̹=} 2 @@Z/ Ukݢ_3'8OmQf)#RT~8 (-1zH{UO̹=} 2 @$&8}|" majX<)Z0`&nZW >.ԉag>?@qk3/N-L-둇0"E sSo7fzv+yI[İ|߸5Dє+`1s_Iw(S& g iD 1T 2 f+Z eR~1Lx!H7/@$2F@2D ًyA-F,4(ח`yb~JL4CUlw3e5 ɹtڻ W?OR_C@`Ġ#T{ W?f V}7DUlw3e5 ɹ ze@@~F(r)bv^,v@s@R埿1q㧪e1fDv#nVV]T?~W?]Y@x R*YN)2?cSf}Ę eKl3p@"Q Ø17.g.m`^KE &@Եe|mظE+5 [WSjȯ24`;z GRY{z@@BaӘk3Z6`^nϢj3uֿ+uhewoL|3wʐ^-2W&LG_*aY6/a*?n+@$ !@'4p,eG?5pLfV"q sw -7uR.pզ =s ̿k-}t_uśA 8NOBiL XHrT8`͂\)ϵcy7c[u}Y.ޒMV2L10S#iNзG!W?}M_R} "Q8 L&m`/$+/-LMÇ`s6k\Yrpu4^}&oJfqXASY@2wTSg;uUؗc7``5iC}!YD|1maj$ >[DGv}omuq=ճU]zv!J@L K}*u}ȊWASY@2xEM p}ث(CH,c 0@ -;SqMuwܛUbN, /Ya?I%KWBisχ+g\?)|7۰6:_@y* Pĸci#w _L.5!?? po&WE9~$,ضvJ>uSU}!TH?J狧v: 6LL ້؆mSaȆ,< Izm?{'@T2RaMNpO%G&aoX'NN9LU;0b~a@x8y~QE?ljAT0iL.ڼ?G5Qb[Qj#a@?{' cEX\4:nJAEa)NlSY.Tb/H"Mn5 27T6h'Qb#mf~DٍNleH\zU0,@\  QE&wH]K\eQeڄO op9#sVðq-@&?FCZ]K\eQeڄ +shӦ;Or БiρiK`Zu1c'7iBHGQsM< 8 Бi7fD67,G 'Uߤ "Q @6`n fg=(u]~k~Ybfr{7H-! ABB @! Kxv030}a_{;dWgeeVeUdU=EwV&;x7+ $] PYVr ֦NރHvכS y^ Q.TT.wApse~ }}  *A&œeh߁;k]kŢH_oʆ.6:$i( De1 u੧)`˾w|{T9\ÚRd캓1 u]e_Ƃ~z{RJM7-  *EƮ; QTTEb pKj2FF@TJ/Ȗ(|-SIk&~կí-wngujw7%D' !Papȉ _ c,8Z>N@TJ_*/,.^Vc%G+˯Osh$&(e3ec-C*&M9PϭTG ]Pg*oˬq^|~`~@ױ,8BDK><&J7:fP?pM(k/b+B1~]NPYz٫Xf$Ym]z_SR*@: q|\e?a3(rkY%vhJFh^p.@xd?ΰJHT X嶮dk=߯))P@h kXjoPp|w. ݏ-\ !S^\(|z1}7?ǿ?5|pü{ڵ[]5ozƩ yت6 P> `'o[5n#Њa38'%\g-\ !S^\(|z1էo~/ߘ_3|+-c÷.6}/ٯoz~q*$cq6MTDM$3q3緁sx$I3, >Ӱ fG‡W0__| ~yB/S3?aϙ#G4Oi^>\8͞3'6wkϘuJTB+lu&R;qHMشy{Kg`Z~fݸ%p9q<#>{ A0+͆BQM ^lCv< z&q6c^+>Ѽƛ$%o߯5.%J['سY7nb }~q$g |oFgƸf<(; 8m9{9ypoe³ITqK߾_k\*u-JM^˯5 F;O2ug`R^ǎj moW 4d"9(/{7w\p66?Rѽ.Za֬lc?q $VP >o7LvWR C7eLloW۱d"9(/{7w\ٽ6g6_r^֍5gN\i.mErjDCN !̢2ύ#3} Pz} 6m5`א 32Ck6_BA0ϚO?܎)B|)!3iȲ@d߯7 Ռ\wysȌw[(S6]tkHi1w2s'uk6_BA0ϚoЎ)B|)!3iȲ@d߯7 Ռ\wn '?]6v3>z);únC--n\tx{wICK/3f=gWCԱqS) 8{m\ |P*=( :TbM~F; ƋO7l_,awhw}rA}`lQq:\xO=G\6x. ozB(uA*&?ם[ B.o!6٧}磏ې{nqcfij Avmo+R;!f(wXtƃ.sTjM~F; ӿ\B7*!}OZmC~k_zQu ς ے'X 7Cɿʥ3D$DpRk3zI L:@5nfkpv9 Dq.ϝ&ٶ\~%{WT"K0k9]w@ L:@5nfzTŹF}-2S_{ްՀZaם{. / Ff] n;u5 ~q9/w=o@ťW$$D5Qعf+$H HS~9?MkbU '$XJأ!p0}_X#$yI4e/@8]ìOܶA$x|T )%qzuR'_& DyOng`=?xp8ޅYQZ)Q+ k68p0|_58E$J$@[; z~= q >f7RL']%I%q `*kpH"l eM?3Ixn* Nタsg쿐 +Q<n1{?KVh(F<;bΝ, j> 5$54w';w >?ϝղB'ڰR vc'6J8+OJ)O@h>7.6.[kg?j@ }R@H~%7}K zPveNsԳ|$|ݵw  2ޥs-;H|K6>:Om46_;g,J7.S@hn}'̘Da=f6HB'U|g[2[s6}șjE J7mnK/-"gZyy7mhyكu4 8OX. P}J%XosMa>m>oٳ--@[4ЊL5z[d[[Dn\:84|~?xei^vxU7Jj% >G Gv`QkWmp'ēB"Y_]b P |J phK.a#T!1$ >aKeG#l%Ffy##;G06 IAb!, ]b P |J ! *`l-!PF u p[-0SNp>i ^7?;io!@$ RӄVaNQk 1rݵeR0˰{73ϝ~!u!쿃FJ~1PIzYJ*߁=M;"[h Ƚ1C{L5HB\9visȉ2Ϟy|O.UaP @&7l="0^,NZ-^tң`&O=;KpϭIvi}c8o2e7n qY]©Ue74sGtnwR,/?` jD 'M0[ V77`V/=;"@7 bGv7DNB?wn}iзߐ|c t1j앋|/OvU)s#_Q Xttl?KVCz.sSFޝol!.Is<@Se]U\`T@h/AL- ӯ7}} `v8'Ӵ37MD0Rx b^M ~կí}.6:?is?M;skeQ;HMPP CQw+&ܸCjzMu{W_S> CZARlwYH:HT"%PB7j;$Ѳ (vכq~ #P! r),$$HH   *@ n6e $ *MabKiu@}Rub)@៭$)R0(DtjIl8Kiu@}Rub)@៭$( QH QH kC@-SHzwP4w?%X 0rϗ2v<hK_v/_4Hc)c?_D@ p&D}ΐR@XxQm_APy)ygBT~n /Eu q@. D6`6foI3c1dV7$h_@ZN8{ɡ3̖(#};Km"6yW^o08LʩϙǞg+.< w1}FCaǒY=%fZn =.i駿Ï12.\ _iG>g;o.]b<{Ίek*WT+i'M$>G}ϝ涃Q,BB ?/ ʸp!|dMCxzGb^tԼ"`Ϧe+4&{^+'>G}ϝ涃BN&h팱 W_}㝨0˯s/Gp\/j{Vhli@x%+[6 B ɔ'9Ҡ0NHp`A$>誝1v6Kß?NT~'#F8.@;2'.G \rJT6 B ɔ'9Ҡ0NHp`ABN%߅?ߟ|vm;+[(d38visf磏Gwk! w~`eIqSmYȶVxt* zI2]`查!i pJX]'S޻bge lf\2Nn36m! w~ٹveьQ^6>}}o!aV* ڦl=9o]ӆ/К44d-?Y-ˇdl x" 7.hb 2G7ݕ)#6FcE(("m ݵ?mBO/ص{ e.%jHn9Å$ ^=z3w98ةkH*?a@>bϛ*ƺ@k}} g4w챳̴M:dž}olÏիoW^}OW5;7,S)dbVqpъV̍7|ǎ5SƟ۵[o[ b)@mHB}} ->9ypgmmڷ_~hv{/?yxٳiVyp|T gZ78sc_cgp@P@~`6Ty ;!`k>34Vk/w?0A?%8Rnn>o. gGG}b9a|X[Ao;۹K# Ң[["# l͇`&j#n~vusm{xv?O%q3c_pj cm)-vwX߷ /  !#Xz-ffͬC Y&1Gza0n`=Ƙel"̨H aD Gfٲlff;ݵ2A8*0N IJ Ȍ?&ckY&~̌JFT0[P I&'N ^zo#a<8TS:u"  u"Кr. ̟XwL#׷% 'rSƃA5Jpk]}\ 50  { *\E3f:@Лk+&B_ @7B ,p#* p% W̾ﰙf't{=J=d `C ! S 2pIg'B P@a<0X׌`+?mጛq֊ZήVpKIdwؖ'៝etwg+@ 8,5d?B8&l&"rjY]0%( 746o7a"0(q3vh9 m_{؁6 &={ٱ.j1r1@Ő1U?0dK$`]9"{ؿ-%zJV#`Ɉ÷/3G׵i0@ <{|xmk9#T >[s A& D''e%Pq5̱Op}ص{9xڱSW+獽ʬH"dAݝ̢+mx gdz|ޞוuY-+p=Y9ߦ,̲89]6>yМup۬27"{ (F E~]cvgK8$͈~$|2nY9P6eYĝ0'u̴G;g.N;`CC:Ev@0. ktާ  ]8cfZWc7w#BK@A.  Qvp& E\ˌ_@$7(u3g̶: g៛XrK }#x c'J298sU&nq>gQ0;Tꠘ/pUȺ3fX{ qM,k%D> UNdrqLX|tϢ`wA1_@I*" DXW*E.A[d@!ܱYW|0K+ΞbT8@E@iT(\ɀBc(r߯_@ B2 e-"{bBTdQd}_LHO-N8d@8p6E AɀB' kͅb-AASddQTf|Kmh)v_<I4E6A+HeMlwنbg%Ob D9(Wʚ?TϢ/P> D9(Wʚ?TϢ/ D< ;z!#TeIAT/iK$mp*P>r, rV:%r !SPmP*J ! )>3 |p߯1 i `&X¨ѓO8]B# +$27K|r$%aJ @XDᎃE3T/?e/L>B$#R\@ ߯i/UX!'7y KmI}sG1;fw^D tG]q֐S!ua9͵% f mFؒV c8)Cw@? CawY& 3w\PH *"n:Ke}R ]i ¿ >~3رnacb{okֽO^zg J Z$n:KeR ]i ¿ >~ÒA39lw e.¿ ie?e;A  D<$aĻ'9  6S=`'oIVOڭԹةk$D@% ߯3 Z3`Y-ˇ@O91Bw ƿ%B[?Ԁ޿3{ 8+$F9jbAיQ R+ {2 06ooEWڙwwykf?'61rH,+EH# c̞MC 2TeBC Xbw _i n,m\r,D_} >-ce&aj] 24ÿ_lJK(է4Im^+R\K? wmS`2XfvM0Fyȃ-$RQpcR,xm 3Z"K/Γ VQ~=4Gw P03N<)'l X.[ fD_'4CQv=0;}xE" bLS [8YP'h'P.?a wIF@"n @0q NO>w]>@8x$DPրiBkksN:Uo=ZTI& HZ(3h \sV_\hR&$( Q5jF)mt6| @X_/qf$c1wIF@* Qxjr+59|>%y1g$c1wIQ<$DHt>~@rN_cC@ 3=r;O%.N,[`^4AvI$DHzӶz`vJ$O~/PX8qs8y(vp`)y@H5+`ēCAYV{U ,l;5}pݣ` 6Fs'E6*QvkSs'mu\3rfP_<7Te8~ *a`C= I]$<|A\m Uv<17.aCɑU\&%<;}܆|be#VTyW~3b.4d_7w8l0nLH Q%`aY_#Xpjً='XQѻs;~hh`u}l1¸E2! $J&-Xݕzt?pG9d+,|WJe]Ծ g*Dm&-8h@xwބn5;[ 6 sW6.PYK)ϯ»[@ g*DUٲ`g0¿+,qc5bqȬ>|4w1'  jM,?zCZoW@t0!%*kX a2@?4 $g`IH@i Epg U73۝*$@Gi;ԗ"=c2 ~1邏 0j$3a@"K'e6,dwhh@|)W~OC})@ 3&gN:f0V"."̹oQ"$FR @w2 weKj~>\ |,y`z+r% K,aO,<ۯ-ڭ@d@8;̗*$| X&ot+r%hJV Ǟ ;n='aɀ(q :kH .yƎe Q$ y :*qN/{Ά@? |z:kH ."sC/گS'$$Dxft@_d>(|SVo]hޡ_=_s|K@-yg}! 2Ik6>%&7f)Tl9|hb#6/\xU3篮KL}kv%&[B A16 &Ξbucm__5#  s-?3wt)_HZ?l(~˽= $ Y  |6ynsKB uaE #!K_i" JN#GM 4$#Ax>$C爙R!jܒ*$t_8{h!a!tGvv3BMnI &(OKMy1B'c83M_w6}߾CioK%C_ Qx6C7bϙO6D p pK.MCv;o!Mok(+ZE@ՅH ! !Z! CO Y?_sw5qv"@Z_-J2CO MC MpkHlׄ(JDHQ}H" ! D" D+1IҁX~1P0ff Qz"n %Dlt/C  L~_<BE&DP@Ģ?m$I(P@Ģ?m$hgBn C~  Z`+?a"H"Uj=C7Kw/ HBeBn C[o+ ,O}?+7U@1K7_'J.Epc( "0{" pc( 2u\!^@ҩEJ]8{""o n %D^]ϖT4_ff;v寬  Dp@iSčK2wkFMClWJ SI! 7"/ISyK"ωd_ !:lRčKdVOD Tn %DV0T" 3HJIVN7k$D"@g?yi ׸Bґ$8T$$D$8T@{%BA@DWPT `B "M JjrW̓B$`6BB@I\l~9/ "M$D$q\@He r._@!D"UL8B"M6.\V>eB~  D}! ҄~  "yW$i;p' nuA 2J@:"-֫%پzdt2{|' !.  ,q7Utsι} !ꋴ/*:9+} !!ا)*%?$DӔB!IUឦ,?iǠ#%#$D$ݪpOS@C_5_كc8 !HL2b=M! D! f i2slG !H0;K! ! ҆|a^@!DHL=À%#$Dڬ_<{/c:H!E@|buHa꨻%B" $$ $BhB  $$*?BE@Ԥ KQ_H 6K!ȇ(Y z !D!$Dl\:{B& ո HjP@!D &2dh ! 6='e΄B!" 2rD>)ΐipzw>)wB IFa^@ &W%B #%3$DTc@5N@!D~$D$&aB"MV=̱%B%T|2zda^@4~" ,g%BM/%;o / K໯oHރBr  2ylAXB"-V/= _@!D>$D^_@D@EK!(@iv߸0uܲ=wv~viӈo}۰vဲ=wvB B'܏5`y/ D!P w/t9Aaj'K!B c aڙG h%In0#Jy %B @h3vJ*HhߘuTs ! оdVT0}urP͝%BE ԋ/DWQI% D"P}ԋ/DWQIf$ "P駟KT,7omw߀(%%*D3Q$gBHxds1dh ! ၹ}Zc΄B! "m>N`I@!DA${XO;yK HyšIQHTV0I_*S-B6`M }Ϝ (+I!Q8m@|n}4J}g! (JGX06>N8NA/V> E$i#P9(y_8{88y[B "Ib3CҒB\$3WJ*j@*$BRH̎<_*T:?M67B"P^_}Rҁ.am=BRHH[Eu/<>+ IX@k^ BR(/ila-$aIqz%H! ? fȁ|j@@@y? fȁ|j@@!D)H$$Jw4k C^ Οf|]B@jGHcA# C|դ2|ϑZG@!DH$i=G-# C| e$BJq@@?CBTg$ <L, $KVIDF7% 3x( !DJ7 nQ[JfNB!JB !t+끁FH! P^J lW3vBQEPV}f/P" BAUߦ!%2m=B!JB0fuYύ b ! C/%z&+xne4B IuAN=dg$ %/$)Ype4B3lg& s-{B5H_@B `_x -ŞP`g ,/BBٚŜV*p!Iw |쬒_@B <|/Rs8 Ia;dgB!QY30w2IfΨs#^*|,d? !QԬ(QQLՀUO_@C_L>U!;0B(jRS_\hB=t@A9>zͅ)3IK!&@ڍJuϠ# B7+?@\??%/BE rїKhy¿E rїKhy¿B|Ԕ\- HGJaK B,(ׯD(uKpX?cL¿B|Ԍ`Acb_3 m?i' D}SYJi}T( t/BԄH_P$DhŁﰝ5 ZGVӿb"H8mv֘3sj_@!D5!ѧWM`-ISTdBzB7(ѧWM`S FYe^JB!Rp;ܿ$ԛ \8(/v{? !X_h!p%?-vU4ZC_}u B!-A57i,%|Y yu} iEanp`n+xi :"^? o7C{2$?<&($B#p.S}O.6d q>JΑ@&"^?R~f7ww88$p:luB9wRkC!? #!id`+8k)g6qC7Vg< 9N"  S?qL{ܣ|O?7z-sWͥW,vҐ7,+Y;{ܙJ 6|5鞽LN]-<6X  DeN^k~+wo|z5s{WϚ^=myȃXB"=܊??%yg68ϟᄒa>jXc>{|6 VH!#`&ڵm_ڸ_awH;.Za>~،?txڭ pUBSO8#}lԊ]ٯz؆@3 W%/(ٍ_3gOl;Rkƚd fԀmBFl@ ?;J]fSN2u <wa?I W~##zQl}Q;6Y @@\~ w^3{pۜ6p6xBXZ V$?(\?k?gIx`ыF;6Y @@!DE ^fg`?`4+2ttIY|',w@{{eB} 5iƂí(̜ K;Xgc-(F]  "뭂YnOSWd /r,DuHP@@޿vU0 i _,yL,DuHP@@!D>R4nO1I0wI!| PxfVħq;$B$!X׭rDMB ,#DZ[G?'$B$! Nk{ hzA#Q= J4I!|_Hp>vS@3 MfXtQI@!DJXgfYX1BѓW߁UK ^5Vo(l]@QTRc95,5?d;{!;" ' ҹfC3 0?/ S3a amsdgyB!Zh#(W{yK6}3v[ Sju?-Xz®O[>kZ FO>-WOWW`ݢfɬoLՙ` V,BVhI!pдivhJ+`[ ps9Q'YQZA;:|yp֢@#JC(FP϶kB]Y ߬~`9VhF+Y{7O ;I!@VJ 1 ,Yږh6~d 9kwJb #JG>I*VJc7{6MylD[.ٳi]l!sf+$B@`C'Ϙ^h1Gm!72 lH %`1/gTK5?r 0Fu !On} D:k *?&̊xe#ff=$H ov9 +~@Yl¬XΞb98 [ !-rGΝ!O8N;9 Y DбS|O(0_[ y‘t?,j6.,@!/; !#;w^ ( Q34ᮜO$(+"]$Ġ~D@JBlIeV!"US ̄(7ޭkA C@8`%=򫾝fB~ۙޭk!/oXBCPM" jٕ3[A C@p{" jNMí]I¿Bn_$k$B4+\?{2M7ĥۄ5n?iz |Ӛk-` 7M\l _H7{&jwmu*f !{$$$$j !  !Խ 0Xnk59 ~v"W8_'4l#%DS}*"}R Mf|*/5A]q{ |QYmJ BPw w槉v k/~|Ϋm͏}﮿eh: _>k>zSS㵣3̲ۼ*Ȇѝ͋{4o>`}pE๮=r.-{Ml.Zm.x}nT4sGwȄnv A'sszLQomg9@35KBT!D+{wy#5O_(}ZOy, JV, se|AMw1Xw|wm˷\m(~&]3M>}|O { g67?QyBۑ׎yy{-1N0ҼD yM֚C7  jBR7 F67og;/_ܰIn4 oi^9Ζ!t M0ο B{Џ@yWA`{1{ϦҾƟ0@#}=`+c P=rH< f>\7^xI9dǓ_t\<\UMFLS̳~*AqÚiS)BQ~BD6`{l>?| Є>}3#:@`ţc9dl O6/;VMe< 1*Jsy[vpX P]ضh?lslL n ?K"@ʆ B b{0Cpfsv;No }v8ϙ=~u5X _ΓUO@B/ mHpfRSn0i"vx OoYW(`&{~±Inb ZWTsZs,3qeNE X@ xc¤ο)x~[f_]YS UN%߄B!J H4 !9?#(r GڀKC=fj=XR5鼖x<@5G?/%Ҕ3<)l~˶WBAψ_zrq숻ͻ>|Έ~4qoI,]bW>/pͧYY u%4p,kg0"{~~?~a]8lZz %B!&-@yi`)W]%ٵ XVpه$_.Gk78o@)5umH=BB!D|IK0c\Xܼ 0M(mOR^Rf@#$ބ[# s')DsDT (($DED@A@&E@$ "oͻ>YͳRo_>ԩS5tUk] 9kf{7 *,!<_X<^qvlEl^ؾwTfH!B&/@ b^`͗4J! 8 lq9 8~o+ZUsc[p-sTs%B!&/@ VSg&Fi00Y =-+v9 (2waV :m!&8C+ B7y s1{<Mؤ,PTaAj*r2r{0JT&+[4BaJVh{\czG W; B!D2@%6̙Kаe?#d@ދO#Fm#PxYkm Xd@5):-o?cy#L0ZO $VavY?ˮ͵K&3UY B!D4 o= ӋO#^|z/2Ϊma"Y וy,o!:Ճ{XtKy T]03w<yfC{7_t@ tާ{Wtzm_8⣡ךJ ݻ1WUm% B7y/?# SN5聶SEPK=Q,Ȏ ;k(PL<|N |}`~~Ä:Up ka<|߆AYB!D_@!wĺBCPU ?d-S5&\Z)wvo$17D)Q']'S@RaJi?wT ?I!BM?+S+*%,4mdɯFJ ՠ<_&#/LڞNdŇ8ÿJx%BQ8?)Jil~B =l &A,S Հ!2$t{o `_P5!ɜq5 Mp !B8?CaP;)a/e59P`ܿ@STGzK Xuܻ(ڈ_@!țL k&dE8TPd0-wM^@!"7yO6H,߮֔3%TE|u  B!q~yJY;KE j ʇB!D:@ޔ-0YݛS B5'% C3? }%BQ8?iVlt*YÔ8f1PDx4`|yXmM+y$PT0l7M\5=,O 񥡬* !B8?q-x sF_gʾ(CPJ@q Mͷ店MYU"M |ZI}U/ BMFk`AykBY`pׄ`]}&zp}( ]@qU>aQ  B7.=ܛK_Me@P¨kM Lm3p`aVBT!Hs}\k#^Xi;S@!"7 O+y7_t74jw?`N}Ue fɻ<@Tj*&lv !B8?i05z7]pj-уߎ޶z,2AT Peyn ]kid@ H!BM|6W`&ݥL3jJl ӭ&&>I]kE6qH!Bțvёu@?F43O3C3U@cMQ41&A IK[i(z"H !B8?iW@Xg?ZjdN PǖW^$%\KǙYJ!Bțv`g?P"̪ *h4_KYn%gѥB!8?AIo^G?&tΧY]H'kG|>9Fz.B!hțw\9 u4ARm4P@5y{xG R#i_V᳜t|پ,# Bțv''[hozQf7^2+*H$~E˯`l9P|_Q_@!țvg뗛%_uVNmzһYM-(Йa;Zprx%BQ8?i'0{w_s O3=ҌP60ݔr3nH7%$% ^rjG^h !Bt< oELtw LI+~ ۠~ܐ/:HݼI`x@_)bՅ*{VVL%Pu۽|⑻$Bˍf[EY P)3S 2Z~ff'3{#& @_ O (m;NkGG1eB!D_Xxg_ 0.g|7eOca떥)-:6ѡM P$<M0;N {kz;@@!$@  HfwՈ%[X-C?C[$T\kgN2-dpgKcg^}_B!4w Ty> Yp0 ΁y=fz?%U{ -=H$"\*C/e/׃'[H AqҊ @a?c !BHD ͟/}6N Q`0z?ټʰ @P!\0PE9/秙k&3Q@ S>G/ B@H`|L"^iBz,}E1v.4Cgw]~7 мU as\@EVtP0K!B1r8 F! I$L5CU7[޶քYicBO~Ϲ5ؽE癅?@\Ў_ v@LB!ts!S 0ޟC}e>,Ua&$:aa>s%B!(@ibS;߹u1 #Lzt ]J' 0'q? L4şEVF B!HhGs#!Jv\;~]WET` AȤME:Ip<E !BHٯE qנ]/ApN&FܑׄPH`HP'7F?K!B#        B lBCڴ o >ڹ=sf. [YZ^uȳ<."x0؋Nys=1첪 !Bt>$$$$pB!DgovtJRa"-ߨ!i `d?yKC+ BuﹿB!8%j6vǞw"S&Hh{v?T@/p33#+\`/ \o3d?l' BSeKX4۳r~Zs\O{ao㽕&f#L6"z5ߏi}]=-\6Ƭ  n3Ѫ׼o/(|4ցL'fܩpvx*d 40?kISشW5h:C@!5QDF{}yǛ _;og>ٸxݲDg ~WkF4oP]޷_|}}Nk`oxi9cͫux}Bp _as{={l55Mo>i sȐ$Y %+Aѧbg{MLpGZ?ai( mA~i2?֘gBOxalX2yx0v4!*W1f=識:2*!8Vz 4aA挼s<G(gϽgy_-܏%O!lwٳFp + V!E Ozy` B"I0u$@W*6#i,"N~5;ѠB!DLݛMc\7r@(HhIJT0-.?q|3D H% \{w7GpshуUc{ez<g6j+AU j&B` uB8^%AxfWQh群hfFz`7B!F@h"!iz|Bʔ葤 dvI3/fa=OAB@CBw'ؿ0ZSAu4 ~6c;#;J$Ю t?i`ƾ+kHFM3I#4;Tfd@Q]@!"ou޸zvTЋD~SN9    B0Uy  O'@*D~3n̈^ 9?$`߮ @=.ח(D|sB!D5h(FS U\4e5}"fLnGqK7JddV4~GF Ƀ.n4C0>ث1-d$)Ny.V $U nF K!BKCQLR۬`f;-y`2'37Ɉ۟H+n&17+4plf-_{ sY{5P̤y7*.SY VhvQʈ۟y8.V`k6F\43L`o.#8vs P^` ؕ3g/Ҍz%B!P} ӤIeU]Ќ<+IAl;5׭#-ş^v\7;FsL'(fWB! @ a%jf3V̜Mһǹ9X1uT6Ctt_PPlG1(\qH{Ƅ. BHp|\ 9zJew&Pgr ; Q$#n ⒀B!D8 q6SN;<J o)7VReш$E`eVaC<< e-F@B!D ր3*uK`[Vl*4Х``IJ',Ц|sY#1"8oF3s.\-Z@йyOymeOs\  BHppB n6-QfKʵ@m{D=~% ??,' LtQK5{Q(Gjs 53Pƽ1?$B!‰l\ H*=v%@X*>x%gcF]kJwOW>p a|90A\+f 1dU Tz9og!"UC@!"H@y ol9@5EX"#qHc텧y@@ YQ^st&W3D$B! ZlШ-4)Y. cKF@0}GyfZUX|uo[A43"xvx.6ߒTH!B*oШU8'V^,]Idzo>$}n%;~!IOC| J<4AcBuЋs,]QH*w@%! BM W]|E߷#Q@3q4!-] ɀ^2'ߤz෡=TQݻ>ύpmtPaUt$B!* /}=/=,E|u'jQiUE#iU@B/ BN !h~y@8Bw .m(*e s+EPQE* Vq Tv UUUd?B!ф z؄* CU@o[EU4{%B!I-Aь㮗"~(CοhPVOh@UV됵緪J׵K!B*)ʨﺷXEP ϴB[eZMH,c%B!*l8, [qYE K m,\$4_4y|W]Hw%B!#h$5IDWYHP\U_WIhfVe?B޽B!#h6+\[(^,་e* -֗/,$UMH%B!)DnXZl^Up1 XZ ˠ"ܛʾ3"{/ BN辛U\5"'r*@='!U]\n+ӛ$\$B!#w$ZGgG\p{~_5H+<}_?/{&M?aI/\T@TEo9OWNd҄97A  Bї@ٳ7"W F+# A;\b~p! 2)f(+'z?]{qވ5c>sU?+ñg۠B!KEwE Rޔ5=4'F@f._/(>**,YXmi>C߳݌[/3%7?G]3Fe? ߱VH!BShUgno䣪\6:O# vloRT@U`?o^Rj1m'%@ /^|zC؆m~ 5B!M!*%3︲w)80הN3sr_noD^ߖ \ga;|t& !Bh np*6v74[;\ێg4U$f ')r"ggAϽ9۳ռO{^|Ԭ},oFL9[ЉwyB=UYS~~{/0z۫3 sxy  BN!lav4ᇆ5== r;l<1oKדfU*( *8qRe TTy >;MD=譛 tu!6 C:U$/(뷢eE qo^@!"BntBD-U ~zhqB> g%g 8O$Mjgy El\N`%v?ݯ|-gp{zs $B!)LT! ) h{չ&y ݆x-=vsj5VMyT8Iꏠg{GQT ?H!B$0Pϊ@@}Uy 3' Dki'Btl I<π?`|B&x}/B!&0Z )` o~(b̳MhX&T3MGR|$, BB_ PpUQ' ӌ`*T"]Yg|>@t'aFB!]P"jiF\;(Ax K3Yʞh ?Y -33~{¤q{X9m۾pVj@L+? HKPVgѺWLOkxm #Ȁ0?ם.I!BDx4 NJ ~vI1$3ᏹϔ~˹$=о5L`F̪WA$ ?vVj3;CWl#+A\ϴp]9*`2` Va{%,zb_1q/, w~Gpa쇌ЖB!]轗0& C1ӃK Ig&`=G[$Ru m%&o+CW=AIwkZ"*oRZ7xO< ͽL"x |ƒ30 -J}]Y߁V#N4.sݑ?ًFe%B@;!F0M"P+Z\4m0řO0 TB/ _s%̈́n]sB -Qm ^&#׀z8B.o4<=\^Op$LI:WDŽ{/0qRgt}o +矞'Gq}$B 2`zN 1L$DX;By=AmlsNIϟu?4 a\ZcPbz 9w^k)fٱG!0b ) i%ϙFp+a :=?cliz3{[ 1k@?3mn%#uI{ UqExt>Z [?m≷D=`Hƈ0;$0@;O?B!(NAT@&8Y*lÿv!lC݊iӣ CN6m+I0 ,s`*(ѾXKB!߸!p0+zܐ#CCڔG4|;F_K+uB S|B!DЫqSkp;_?(~PЎAFomWPž!AprqBG>G+翣*a:z}̿ B!hk$$$$: E@!; ہZk7jA 9gC 5~$q; .}_?{yR<\{ikW~lj!BmB!6nI_?Xv-}ƾ%?k? ?Ӫ2"~Lp}(ߐ2YB!Zci: ŮLn ,U>_5wsN:׮vD=HzdB!z>Q=_!do.|iyM3Y j~.v,Y9Tv.{/?ƹS sbCw@{n|9e='qG:xw`r7(o/0AYLoތ[/ {-wЫ&\,BQ <猧 ,Oˏwy=7o>O}}xዏ7ݽ;}!yf==5r_*j ث>}9<?+_8sٱͫrżwܴۿvQ2$Ȋ=縿?q,9vtK߹ںl׻OBjt9#1듍+{r-[(5\!wZ&>|ݍ" 33jz&zi Gw1=S 5 Ip 7 OzCڶT+͜|6] 9)gi?!+Ȁ0 J?H5 ?B!e*EoT4{ EW׋2xnp$ ^Ð+0Gndv@W"l8_x,aAX 0i@!BG ,'lӨWYZJл 3c} DڹxM~zgeC qϻ8@³h⏼lo?3,Ǻ}PX僞G*B!"H@XJ*(n3ַ  Fr&zny&ۻza"P澓 0<VBc<۶@3K ;KΌO# B!ˆ LQ9 \8Q$\iYzzf)/ny'ǛJ+F`< \o++ T ex6x>л_@ gIEB!"H@K*6)@H*bi Y?K"Pv: kՓج`C[VLp~ϓ̈́vZ$y|Kדf >TipRtxaԵ&!;Wa4LzDL[B!"H 4-\Eȁ!4pg{Ybzi L"q)Ҿ;=2 ?Dm B `e@#v/ B!=Y @@L3X NgL>r=@39T}'"ʀ0qnI%[o| !B'T|-%ck]ՁJ ڽ_8=qtV>^{/Ixiu20%çpOџ0$B!Ppl֖ *PRxUsz}(H!B?G?K$af%@Z@|Z@BҪJ<>pgL^>۹xOx፾_P1ԞRph.{ye Ώ)-B!pEص~_j'LH@rqqQޗc?>n?x0ٱؙ]??^0gJqP%#a /-OvB!pBEE3Ui7%&K ==h/|'wN7r9^t=i-Ȧ%ϙKf^Y#=bՆY#h5 PfB!߬Q&* i߿o==ޣ7s@;bY;{ϓMUPٱ\[$4*#Ǚ$B!46qV X~=v؄_b$>y/gƔ/eB-q\[PI;ժB!E mW lR8@O7c޿>Bl3!yclx#]}KT43thYDk  B!B 0l7_12(icpo  B!LZB4@Q(aD|u|]Ӝ\[Hs~B!"ZB@FvQ1a%TDZ'XI\ bե2&B!~$2 t^8~ymX} %6$?{\. \a?B!(, ,`ߚEK"uBe ݐB!~ZF@ai˹KHH'ilu`%B!:YL%  Оnr(Ɣy  Bٴ-<<Xxg K&%,xKfP1ط@g e~mzaB!F\@bL7_>p[\U} .-YTMhAj`$B! Ɗ}{{̸GwޘR`I4| q[>^,صy=rM)l8,sz\Cꅩcpo ΢芞0i~}ޒB!P@Cq;KL)§%nB@+doY&Ա_\}e?# 8*!h3nk@!!O^7A]~CfB3aׯ~r9a<,:a B!"H |qT0)'W_nvՙ&Pٱ!j>9wk `Nd@>mYm(yƱsIa{^GEfp.?6]}Kt^B!"H ' CL̆ T)aG^3o pg{^| طf{Mp\szm]c+6A㓍+L}py .-Y/ B! NQ8gEb2<02"a¸T,Xp9S_ `N[ GF%yB&3?)_ςӁ1o ΂|go[kcSs+a>qxH\/  B &~a A%ソYwf~!lgGDB׎IO5?=oI.$|PgZ< ݢce5ˮyъ^YJqf$+9+co)'h};YR0>B!8%,K\qToQ!S|hۼ>=Xa_3{ 3NA/2}hoW1~D{/?]*yOO|۳jڲ^_n D[?mxϓ{X9m3 p7^i U4@1k&K23f&D 4z{%B!DZ1Qш7 mX եqw鑟8P&՘<"/܍$pFG{};}s`wa}k{Qξx-6ž2B5א* \ gӼW!=j(fHH!BA¨kMo%2?Ґw5-ÕHI&s/He68d&R'clˉ(w3@bC#l$%.X]v% |T{;K!B,D LH *ۆ- ߳.Iz "^kBث FKX2y_ `? aN4Ȋ %{xIS@@$Y/}f', !BH8UrBgؼA\{ju'`2N Ϭ~{oT\߽םo$@{{_}3t{WD_.p.S%yS[^@@!"o f=҄q%0HP|`&˟xH9i/'{%\v<%lk/1U)c?7_tZ8%%#>ˊguB!ȓP`ןGzfvscwfyQ.dq  x}`:tb?= fgsm+0K3K0ؐ @b;G !B$T]GC~y?6?Vd?4Ny/zf.,_ )NNs`;+~f;UW%l%ȸ2Ug?=+xZE6gpp yVI$B!D =[@#4m?E k Ho;@Oz <ݛ`?%T'ӌ@88Fj!_סp  b/ B!ˆ u{ :QNC9m=.åhzDC lB@?dGvl%l%XY7GeHrA+K^Y&՗M%B!D20\Up1[! og,"+H4!\%B!#͐t@d'CjFH,4/ B!(V_|~ &0K40g|B!" );P- z\=ihs2ܟ= B!" s$dG$B3 :r,Ǽ v!,7]\N%B!DZ$J&I)KxY:A 5f?ue?-,zثqxIB!QH !6$d'ħ9&qiJ`<tKMR\ By:v:y/ B!r0K/=J-e.EF*ǜ{z]5'q ,oy{V󼝋z+هp ?ω$B!DRZJ@@sYa (Or@SGy_~ˣ'yF߷;{wddžkvkx2oÜ)}t*I8w_sn$J!BF+3|1r0 ʒǽo%0I[v[GR@7G|wfU _۽EoKד=ؠss&#_qcgsUH6~!  B!h ǜpX>fI+ e}U$IXPɃ.2Z`+|m_5Mܩ8s/X;{ϓMhkާ>[1qoC?7lݨ+~#@@!Bi 4&-+ eܪ oUto{ kaFm#`uI#{ {^`dy3{cHoI@<Im'س:5 Lð_߳# x8B!XP fo&=y=a8_~ TϘ3yx==f pO%ܑߖ,LtOfO$ϫ @@!Bi X<,!T20{niN>kB~{=},?62cpm;G7_1lq}p˽םH~/>v䀙y nZiU",2 @% @@!Bi  ɸQt(CӔǭiVJ 暰̞q Z7_t zv(@Z>XdzH'iYZ?a31 Lz@B :=(B!"&ih/QD$Ye[qkf=GɏƘF/,H#v.k&h?I=#癉sjb ;$B!D -!0*fn%D  3AqQ~u@0>!|OG&ԇ/О-%x^|~y>p;B!% ϭ4Pc: k]a`۫3CC <9S$ڐ$Qg!ٳ_@!Bem 4=ˮB4!l6I0x&K+_@!BebvLXlއxDwlKpS| E W _@IR@?wB!"--)V&`rjQD]W(@8t-&pW"y&vGMO4'4p c&@ !BFt x˞")CᝐfT@c`v ½ [x{^Qu2kU~jb(sO B!eeM[C}զ2#$\[b{eM&SȺ @qT9 y_rLp069GP9@B!cCu8)+zl3~h\k.E B: 6^[9mLOoKb j`sT+ӛ?y ^@!BѱYZ6|S*BV's=ُׄ.[oljgK&gnNC>@*zXa g;[B!ёq᤬@;7 Q5W a{;a=xGO-\sާS@+@O;*؞{H%{=& B!:SP:dN pᛯŘ*c˼vxº)~|=M;K<Y `Iy<={W/(Њ?(ɖaa{cHo-]OJ!Bt8m V|n #p}N.`e@vml\F9> g?dzmyy'{2wy+`{vSڳrPB!MG sT }3g,{dVГMu}~e_K]= vā\7"eߚE溲MX]ޡ-O_gB;lwc?!.)lRdoŽlG3ߩp?VϾB!He?`Vq#CFN7@C^YP:׋f{p0X,1U1PDfKnxưz \ U!B!M ouh/2''^m$VЋ͒wNӴ:uڭHz9)4[x.OYL o/0ψ_vn䇘nG^3c{iqT3gB!Dgӱ`W\ uիM'ڊ,p̀'қX_[qF@F6{V_{Rq>E-,e?2`=͊I@!X@v2V=vѬ |]9m Nd'zqy}+B2}2f;ܑ |I!Bt+,33SY!ɹqè|jO꜒` !Bx yVhTu*O+tP:! 5:B! $$6 SB!`:^X@N"ǸZhg6? yrUTO5 77wZ6+pȝڳ3 CB! B!B a0O%IİBЋOwJOt0JZRj_+p](D@4B!D{ f@:8@3gEF:=۱~zs6I/L%&k:A` !BEx4Xdu 1K37ֳ ^xZ{0YnoRa3Zՙ=lzazb}~a3[/ ";σ{{/?-{x !6?{+]}qEgB2.7^Jܮ>6WH] ,!BfaۯpUdpuoL}./>s_7~̜8~#;6f˧>whu*aaϊqrߟ8}1v|<٧߈B  D<{wpJ#( Lj>|o;K T\B!@nCFܑט^vrP}@:;/fO b:ioM5êeBY2yKu<+{{=@E`$B!D{@8Ӽ!iH^ڸb=zd=kW'Ǜ0ػz GUp}l_5NoƹSM Z,[Z}5o*J޼vf=hiC=xNa XDT=Pn׾&S 3Q  BAh4~?I?!~` ¦)ms ~Cwt@%"s΍@M7o;l?,^p`3bI=Zƅq2cW Dϼ5m|2@@4d;L4A|>Tb(UB!MBw\0OLh# z L%,so{y=3̾y==f*q>qgj” )zfyDƖfKƜ &lĄ+na ! !B6 I}h0gI 'Rž\\J $cy! O>w^m@2X  ~.+~f ߍL4(xWB!%'넀 fϣ* ٔ[@ȉ_L kwV,Gh{em(וm Y<apg @ϙ]!s6_aXk`=%B!m)0h gye foD H;B+Do&xWI,Ja,| B!a`;fǿU!h7{-&v/{Q1c,v#~"j $DcN ;6%ٰױ=g&J!BDt-k4廚=ye +mmk oC$D< 5?krw3Nz d(=@kZI # Ohq64vj`f!pKPz.?PVg ]m娤x|>zj - 1fl 쭖pkօ28}Z6CК49@cKHcH+jٍaǮVP @oL5@7ؚfUf|ҜI{pDCqeI'֙?sK.\>_ n+j|2WNfnc*b @KKT @%V̺% lcU ct2 7a!oVB[?R|ފ=qeI`;ojuKj>/}NHsZ;?T[>L>Lc]YOЊ WWud=-p:dѩtuD@Kˮ _%V(3vA`]ߛ6,\= ʀ$x).:zKpPE% pcVZI <~.N[Q@;tIyp꽃u)̴D:O(U{W0^v>ȎEP5@}q(5fRn@-Եоh߁hvԼRmu CC)P+u-|̂]xk熚`Adg*C_?zח^P^ sGЂZTz|3g@Z N^+h(PDru+X\||uM _0DgJdI?@2_}lngW`M_DJ!' <߅T8( 8Gq ~\+:`ڣԴ#J ;<xGv *ff࿅qly-ՕZU=@@OW(5rJ&2@;p 뗦.}UPb-/N ޔA͏_a~)~e9>~|uH9yoj=oަY@P<;acJzAr t_o"5>~_*rY2B@Ӱ fc? 2_R?N捎s;i9A֮6pSfm),R4+En@`^w,kMob8zSc_i5*Q3>aL[t3вW6,Q]2sM^?(Y||6pmW_3u;r`s`r0~[}W]"58ם8c ?:am,m7O/a^\ȼ}-].hq 'E8jF^)^}a hvx5Q¶ CZHsB5B~Q; Yxam #LV|PZ; Z(k)o_w՞C[g0۞;L2.<J< 4w}\#>ŞޟGRwKXF+P; S1{V̵{u6;v}Bv+Tswmh l%@ҬW<[|_*O%hy(W10|jsGB _^XW/3uڿ\x@_! ;Qu`#o`~ 8q^EP8+/4+C(-X_iu/zAh:B4UԪB59fo )z׬,z :!iSYGWO̿{[5SG>n=g:5 "8Z=ºV(;*{RTѪr?w-$x;77NsG.tG; ]XqZP҄u}ks>G@/ig (u@#QPz/@ Sh?NwBBN{Æ kՁ*q ǚ/Bu%#/W"%ףĮp3"S=h!} IWh5f5=_Q~ah@(=agۏ.E a o7ʾaO[4 b3;s Z(,F͘U G*tgFnWv?@(M@*'?6Zl|b]Eb wx+_{u.@ǻ>C *ym_-H`ɹ=HIGC=S,D!ۙ{Wh?}{ wPޢ@1_W{,QIo6S]s |z 8{p"Ndp6jOfRޕQc\E]T=64R1̲GNU(@<SV$ zlN_~݁]=;φv^YvKK)q-TtwR8`!a7zè>hSRB]e >J^v\%s]hA3:4TnhsZlpWWJ%J}/?zŀd)sO7RpslBB;t{6 ͔]Ȏ6D7}_C쿣[B~Jh%(k5Jw`ϓZwBr 8 ?^o 'o(k@*mnZ^\u~טvm^T\lǍƏV| ֫P+O07_rVbh ky'( [1 "YuUa#<~a^)D-O/O {] Wm  U~D0Jr*/A -JT>mu}mkvHQù,-sYw ~칧"5%K~VƝJ'¶I4?*ޠPu+kL*(Qth! c@ƝD)//i_hz=@:鵴 (Z((Z]?_c?%)ZK[MO(ERw;6Ra'1ھJB}Q /ƝDF o_rY*J(h^)EҘB*}{Ni&7W^4PZ*7 Ty?oͿ~/*oOKogNw"¸aVlm]cϽ7O2G;̢2릏8}Q-?|SO;*+P I)`f>߷k-v,T@J!{ csFg~JW&>wR}A/?lg]񛿚~u㯟x?>gcpZ lxbsj?^m~]~)d-<* * ZW8hAD@o,]W9ye;+5y~of%()S([3̲շȎVP4ʨtJ֐:{T,=#PP ^[7x>ĕ HKKKZp]M'sFm)( dY耻|_j .kfVo&&y}c('k(}iO(" X- jY),|-7 d_|=P{4i,^٨gz}+(s\IcG^A+5sG4F EBQ* 4[Uyڟ7| d[|wC[_w e.+dM?j*fں5sgiǚJE)ZA \yTyi%;d^\km6poO5?|coo7񼽟W1;nhƞK{ʃ^EVdҬٶ[gn}v| _ٕ PsQϫ;S / ]ͧ@3:Xmڰဧ;h^6mo`v-lc[o>(W3]c]s6ȗ o0637_rVw@^jq_)Q`l̺59!oLV h+P AxѸxԌLjijly@^t&.S Lvhf`{(˺(}#: 㬓VǙL@P E< P ] .)Q ^g6+4Y~gRO*G/]6ǔs'j7"IWR Lb Tgc˃s@@a=8 g\{9tyӕf/5@@'a?XވR \gWf-܊YhՁ͠yNc=@O0U"fux*&2ag )fǑ5U~@]q6!Rg:f 4R9PĿE)S L x g7aL`7+& 3Whˈġ9`Q1ʆvly z `3JZ1kLC} H,\YV*=l%e4?vƋΰ@0|c"jˬU$RY ?aifm>Ζؒfji‘JF*s{_ḿZ\Ĥ@]>؎;ڵ @욁fi+pE_z>8=>{8D"rG(fEE*R^Z Dh0 ʫo; U@f(Z,@ wܪ.U{/*p)&P' m yk"'k'˯{iNp˕ >Ib G^(4{ȵBY q>%? ֥4 и6 GFٿ@T"P @̸R5W֪ } D?K)Zγ:OhC?Ҡ@QUVhWQ 2`;l]l^iT0S@E a 6f?o]1m *TP IZ< nBZ۹\3ߺ]}/PWkZE][7|@60l3Z1H@ 4$,;7eY \@fmڻ@/wpc#ЊC@(:4P?8 9 :aEW# wN3g\ioPpWR @"=F8-jV(ЫPAtx]l:^CnN1@mL[;7d.4:~miW 2 {῾-I_=6]"BuP5 n^oe׹ G}?M ~ZqJ_KgvmchHYػw C۟wbsLtlPmeL(aYi,wV؟ F޿}-JVnoP^w>i[JƐ*+z=[Ƙ3׳X:a(p~x@/1@}Ťa9cS@=z ?zcZ|^ d*5ӟyUԫȻC @,@p8_` )P A@K>V z(@(+mZ>?T.ӯ6-Naƕ5-<Љt_Z@=" vSl{M * Y{q'[t|l@=(H>z@W)P@m>.ywL](4Ѕ4;S@u(h|%)z?a< B - R@@S Ѓ6̸{P Q#^HQ }{Y-j(hل}V ) 2aGXx,3(kM{?| -c XwO{ߝ9y "=xsc. AH( U7\Ӯk7Mt;*ϡg)7 I(k^B5ú#x @A(4,AE–d< FP 'ɲ=@QO .2'RI3q=@my ]TP;Wޢ-͂1) G~^Q}>HK}ftۨAPU7\=,7#)@SY2B A@T)/ <{`n6WR@ 0 ) G\#> :2-0{hn )go{pnt|?FT#?l-cF)@7y ] wOĬRk^#.S@ X7}' 5>6g-|C( @PP@Q²Оq_k^(' APPkb0ZZkP S@o lyUݾ4z)KP1;[֏!y|O5v?S-z<4; Ȏ p_ hf]`)" ]@)OiqWR$[HQdTm@x|V0@o̫(tۨA@tI27E/wTEd|)@J}AO{.,R@)Mif9J7)kҲj,)GK Ij>7̸Җ zGEC0* fΨ[^J!Ȳ\G5mPA}V 99kՀ]Tr?֔@r|-眴MeO5eAz՜G[0fpEz4]Pe*_O=rzR5 3XN{+\O}5MYzisj+95EסҊm=P 5*|Ycޚ(R֌ С~qUY%ϢXOP`Q-z? Ȧ o&XP@Tw_K'oCB~?=JȩP;"]O?_K5q?aiHg_>N%=C((쿖?02떘pQw0'o>>߷ڿNX4T^4{ErO;_>?k_oj?w5W6,77^t N k™B#/ېlZ׆@y`cX0fpf_{WGV)ڶ[ǛW۬R3oʮ p(S@K_NK5]CBzY3u x @lLYp_Q{W.bLٳ(ݎMmK)@*.Nzm3ϣ`A/,+4c-XLv@UT'- f@uQ|i+t/?h`#`}y uwO{Ezg-4˥ 3=NYx* Y R@ϧ{xLfʿ,g UUZ ҧ0 Щ"=C}O}Z d!X8c쿞O# H(~@E+q.SG[kY(;Q[M\w? S#d  HB_3A.܇){}:^clޞ)>v,2mK_1iT4^DVR{uKlE)d_׮Phڻj~۵uGC1nnuۢJE΅7Z_mY>@SB_-VY1X0 =1zv>6ԣЪB ~[6/^ kc,)k߿ӿ ZEq@4O@@vn 6~+5twjZF0000 ``Ds)͟y'*iL%#N),%/,]O.\~ @0QgrZiFN6^˂\|n2lBV `1Z"LbyF~M۰{lX&:Y0#bFxxnYhOpw2c0a#DesltL 4"g=36,tU`@ʋp+9 eR ^-9fX.E _PgXYY&X6a VXGF?%`<#Zlh` ^ jŏմ\ޚ;f 3P/o34]n_%uP;Ռ w)a\wI~i' `F>| *`cxN. `U!eBknscm(\KqWDV_$Bok 7~E +rrp6L? oնj;]uSpX>$TTmMe)s}ψ zR˃eIuۇ_oICx"xX~g\{z\.bL cMǷGK# ;^߼^ꎏ[sZ;JB% H&,X;ELh*_{Oģx=*GC90}٢e=~$3mwiN,9s;A/zsmrn0W˫Z3h5o):1?H Gӂ%|Y?cPTMCY=Si}r2>+S d 3OM&F^nF:$Ÿ6 m[rg &e7|,^z*Q}y,=z_q)Fѝ+S@@X 54  yF7lf֫-A"!ez%B@MLJ@\l_2 ̌{?1s]?.׬t)4Nx8SO |V[`Z 玢!"!&/^D~V56 PUkTTZ<;"ݺugrt8#f`$c8Έ8 9Vnw0 I,#Ghk3'Jy'*0^eQ$*dyVt쑇5CWe#дL n4 PE$:9]H0eFPhJ5aMBԴURCzXR例y$Bu|4cVG#Rg6r8L#wmߏauIz[,iD,CCCj:pet;&ۈ^2Z?0"!;|XFM;} '~;0_  ,P;ɤx݅ТCAm']ap)~ׯ &<@7g)dv;#hv4 j'4&2-`xA 4P~}`,K 5!0;XF IJʥ2Zj/\b8`ǾU^EgA~7oݢ{tΊFݺ}gRmWWR,[Z%+z }p 7@`~ ' ߟ(lMIj-L&9kdT2H+"!K r|0r ~4n~0 ,j[v cǤUx5d2i~9zDzUkTTX,RVRJRwp*%rh8JF(52+J+jg؂0BEXKhR4nbG?A$ TYa5RĢT]Pm[1ߡ%_oo{3ۜEwKϾ;} "#[: pxr6sN` K~Kw jBvN}*AhD2G)LضF8/㱜S q wz5ϻy4]ܧOBkvvv\.SՒ" J"xq|C?BǤ JXnj)t{V7`a Ň"~55` <55JhޜgL -1 sk_ؚ@rCˊ zҟ\ ΅D\;2r^wi'Žov^wQ^jN[[x~}.VMV,KZ=C^ WBlTT d-_t`Vo7Np5[U ^ @ooK9:Mmw`pV_ 4FS@(TdC /ƀM1A7Nn0귺^7;?MVkhEu+bQݧ ^`gNDe"Qhij vo7NnU͉.9'T 4LO %4vfFJ E)P(D2% S-2`<8);뷻^7;?p3:hNPPC!-FC4%'0܁vŠevMnInCpUχnR@шr--ߤo};onݾ-`&@+XLu/imb9EAq/!I_cN,O>4Fn2_380烜0QTԪTԤ(b6 `#SD00(EjO8}ph~$r䑌)'46kpĿ9ҐQ಑ښd}%EmY7<|F@o667$@(FR>Q˫h0qA,Svڂs4}gr',y# " 099Ic#́)8%rZH<>6FHD2l``9-y=|g-TzXHZ9hh:{jތ(o,|B4~֧,ȣUQLP}~,PlmnQ* 5MNvsKS jxLU!jo-&y0L֏ЏFI1sJ~hl+&e;G7V zZſ &cf>. Y]‘_ (̚iܾ}[d2e$oݺ%EG`7Kl*EM?e5M0~翵v3˸zKSњ&1_SwOJƮ l`9&-Fշ e91=GwQj&6o~{]-⟹+@3YYL,fG`?gn7:`!͑ϋR\'h4*% uu5 .T絊n p'z0gQd]} ##ӼfpK\Uvyp.p~{JyyjFآC+K%.ޤ(k_7Fn 9QuG+ё t1gE3(GK%wm&|OqGx&FL_`?FC&&$v Ǐ/i Z],\u* /D7Z6Ըsb0|dA' i/Cdb-j M ެ%{eoG"RGඏFDH蚓Q=r `W< ɦ|;v>^UjUz^Kѹea|ɋ&(eTߋ8fMJYJMF,셦 ձ]^9t}MlF8_:&@y*O+=gG8&xNe@A)21[N*W,lɄ(UJ h$D"I&&0-.Uۙ "}$K^2Տ(d| B)k5)A_MwWF~Nl9,!&?<׿VVm7ʨ|ZBQςSǓPol2^[?5pK&(s92=@y%8q i>ld_-Mhb3C`eycM 3hLE)Jբ: 3r3MO _;Q;&Qowey608 hD_RA0uO~0͋˪~@Bˬyi</fFam2!<7^PfϋQh{7}RphץΈXxͶ08gfr;Wر)&A.ÇYj(! \AZ:;_,x€Un:My9lގ?p#4 HCǾ݆ ͉Ȃ귇J9iw׀Ho[nNݡ4OZ̬yNKC&K/B\b,mo_Y#DQVF%^Kb#gDx,J!c(mv^oG3@:Vk$4\|6&RCI GsxDVOFX~. &ٗ x\JO蒓_#M<ΫXP#:/N b[ B(-lݫMUkDfz_2nQrxbov^w/機x^o,B.GXWe/ y-Yڕ{{ Y"= oP,^UY6=81 E Nx_/'UIukL}hmGZRe$Y;m>8Uu;)oU^w&2}, f];YB<_%7&vG{ј`ƝU)B@K hn֖J_GGEA^ -~2߽NA[]w [fqșIq֏_'g.봳vG/4C\;h*n֤v${~E{Ƣ^ `v|pV]q"u, 'GOBx( J֪Nȅſ̟8@ QXeѰLa[@o? SvF3);뷻^7 a:@=_02Ax>PQmRԴ4VBH+J;QUkVIQ4 6XQLb |4XVwLTW9u\8V\TSYG|KC}\޶i>U>_trBs\9qQ[?)4x-wFĿh?gv6%=m4`kxD~ڢV)#\sD*B0~0 a@Qڦ0q4?SbTl+ &Ŀe~O^W_?X2: &_OZ%P]&0}.v6x7.oUCyrNE|*85 ©}{|߉zݰ^f4 $:-[/_7{DHf,s#}j֍OYG5p2So5<f)p?5ɥƢϪ_dJ,Yov̓>/G?-i\QϺl!eGK4߿Qk'G"ɧYp{5:W0"jGސ,Ӏ>#_1 ft^б"%?GѢʯUO!</܁h4../LK -0]:)ޜl&̑&<^"(nhm$e,'%Xh*rl֭;TVnA0 ir(kzM(xIgIpn3^ @HrcG?3H*gShЭߗ~H$&Bj ?L?C?fpD@ڦ}GMeLGsHRVi^/hLr$p'c ;H<RZ ׿A ~0EqXs9df=5`9 ЋyD4@ؐ~n-鿐sHx*Z??"+?La<%?S.ޥH7L~&f!i^6VM_/ABXt0P j/  r\*O-= DM`=,4^ȜͻC4H):Đ7jJ-T+ ا(]#*)4{hB0Q$D-"Pn${t$q~Z]ARikC$]bXc"0`LKNh,BTXTQc,H^odcMjnWEb= _PN!a8;:G,yqxRqs. Z~}GhP"^P(zۜ\=jJe!4M!5& ,ϮE3Ǐ_ֽ=8؜U,P8#TH/픤hoڨ)ѐﷂ nN;|gl㞪(KbyW 1#/5HЇ0ik\$d^լ77z#4pn?õ&k *ԇ kjR a DFuլc)hxo^0 Q+D^6liTzAΘRj)Q?\mRb,Z, ]j4Z/ Oj?@cxZ.~ 2L &̂wdY?W- ]z(L s;jk{͌mo}*L.DȿrF~}g#_]X'ooO_{Y-uE|E3hdܗSFEBB0 G8Mq&0Bu!9X+ 3MP"ЍX"Gk?k4O=Dw[zMZdrMlj|~oথ=#xn-j5]ŜOگ[*N@<)7KVUv"4y<} Q,hM9D%W몂JyJZ+7K6:"g'5-f3?c?c9g> @T-JssG/znWF)E ~Y `0SƢl db %kdt15]\!JLFH##!T HDێ_̭$i)|Z[aDc"Y n嶝j/}]wGTܪKC /4L37gtPi?a^(%U˩tl91%M?[7xbL2S,ڢҞ=(;wph9wh6ePPM)VZo;Ym;rNCp_| `1^++KO*´d)?-=Į²"~-A|f/g"QEm̪md?Qk&gwDQX,je An ^0.UT*O VFZ7{~Tg? xS[%\e>+m# }[Oi}ͩmGD>5}QOc_[;pVIP67GÓ L b0!n;3Lf#V~o\~f{fh7nsC y TZ3g嶍ad /8?-F|o[Kg+lv4W(r+ŭl'AC(os[[9F"I[/L87Ϲ[p fZ+=u| A4 ` ,ġ J _Oaߎkt;zѷ3FV*<]4r_.z?cNz0b4j4-*TܬQРVwSS8K ps#?[1&o~븚h1ةWʵ/yw~!.FCݨNCP-:AkHjvonZYZ u߯rI +=W./ó\N|um[t%u%WVm?}w:LmmdǴHTJh5Z|GGҩ0.Hǜ4P6-T:YY}]Mb(BpV2zp|)V7|F3CXjud}*x,Ծ?Rk4[\n2l68 ӘD`Y|Y ;+* gHBJ'އǎ81N-Ů$nE!uہ;t^90-[s__T D">+7ZҵH^XdF{ M_~(  ޶:9%I`X"U uDDQX<ѩP kbYK'NK{MXn:mX-y2'-nj6iϚ?$o'cǾa% >j :AZ8h5g,,=X~ƢmwA9+?I?0@?ŨXfrE7Uv@sJ~[u0sZazͷT}'բ-Q>|B/5TGTZEbC#%R)g< $C!f+3yTׄ- L8 kȂy _ GIp>"۶ n?ݱ,}`Hḧ́KdW ',nըQk-01HayE混$%h4B4rڠy($h4*KjLzȊe*JZro6 ZJCҧ{<רX/!G]DTm?-1}Bm;H(pq, =%[bhgJB;2R~6,~ Q3v}5ֺd߹SU`,W߯нwK_ I@js3}41f;{߻պ}%Bm9<27<4䩋\8hҺO[ϲ U{F>,­7PD3&{Z3LZIF[\JPj҆EmG4_͵:o !zXL(}"_j""fG"ݿv<7IjK,<>Il&&mzV7#ʀ~o:y1ZZٿ_<=b?;c;6ImM8m8- nݒ&/nT66D OTlIKG֪ՓTwͿu+; S,, ˹=?ńSeiAM^.emrydĖlClRY,F3rYic$ͧ粷">OrT"91d*JT{&gWowΫ}3F 5Gt>7Tޱѫ,\+D/Dž`D|n}kso.zJ2CD_{RA="w}}c{(IDݹ{gNxt`O<18u2xUܗ}e}}bD{:oޤ HK 9SJʮ!}닯oT J%ȇj]1}.)>[[-oWK/6Nn̾-) f,js3s4/_z?y5]uyzHtvVU;%~>A5KNpm[;V^o~e9AP0J3w^XmMۅ Yػ_?W.=F)5Ÿ_^AkE4'N:m8 /A|_Zy'tݾ8%|"b?`3 @w 5DA&:0|,nn2 a~ Qp $Ldf7n0p8~_Uɱ&DgRu7'"L hu@'ZſY+вQ4nA?_%\Бh`n ('EW"n 1 pv`:VDh'HF|N3fx0_ZҞ[ySב~7" ~qnБh`6NG@#FE/՗_f-۶?HKP ?`@Hv ` Qp\. "-&S &?D@@WgX: ;:U1```E@oISgИM. |" #}f>#|(a;2| n? ?H&r ˔Xb9^,ȯbsf7-Z:u gqL7e xU~5 qu40sb5̚,XfrEo7iYsY5Ym܍iz`:\ ,/Ȃb8K!$_NL} 0Y, lxpF,gX{5`@>j^2\!LZ4UeaAW@p2/eC?7uMڅ[v%\~&MS {?;q]㺅XD9PLp]څ w0Ϥ}]H0{{5[g=- HpߙQwyҰL'G>r.S,uHh(2֟赿0 o8uyH4_{9C:5C33YBΏwc4EmS\}?\ks`ß=Xc76fҤH,8IyQqnX.=,vT4QI[Ao' 9x Nx |p95ib1&]%V~;Ph ?g2`` ׀osl^G¹|yRD9C#w3$"ƣCNfj -id}\~C~€mvv9pPIL0"} `{N6BއlL\oC@-ZUpɆ6 3כaXgep-;(Fe:8%-glZ.S];GS3GDxk aO  }E1#x]S8d2 nȢڢX^#$ryMnEm a4o\^Ŀ^)GWF*BNR3H |yL@p|+#3r_CNjQj:7fFo^4EA7o?.wKGee*<3=Oo3ijSrK1C224pٍDCw|xBrN¯ ̵涇DFO~{դd\`Vf.9lt'xjȺ[P֫+bfߟO~Tk!gTX<^UG̏b&A˘2BzjL*Zw}|Mpd(C||z1ë_8FLjPu`.|HnBFȥ Bp9(]nGuY`EsN_V޿/Ega~nMot^~{iDf(Ϧ3N`W=H1q;X YE?.lq/' yȢ~e1߫Ҥ|XrN{ax܄^o'kTH ?gtd9XA(X&>NX%.{{L1>c1) S;*R :JAhl C ]iA1?>a bxޡ( E?wU ʨmzhZ18z±)ظ(Ճ > 5&L7;P/s朢>~Wk7z크dJ1#nN=|ϣQ$:g!9gϞE7(ؚ0y&uPs S{86`lqZx}u##JZ{3#;p;yvM5z5y3%9iD̽݁uJ |eC sdӍuy55nu8m ye{N>,V2[y9_?nfR4ǟqq_N=ҌtnHcs+se%ٔxK$N-QſU_(\~\.?#Y mtoWCȍ0@Ƕ"hF>=_%Imx/\7dkz Wp]9˼υ츠>D"?  /yp#*,A'& %7?1I {c? '!.qS>SwO)OOs)*L<'#[^mW A?X|Mf봿%^sɸ74'tQSJen5&6Sy5]SQ!MST5 ;ь(1^s] 6Ǖ'8!bJxH@aoS9JesIϦ /wrSi O֣x/U֣1"#15.#x4}QS4O^{!f[,?h^ cl_:fqs Or c8 ͉B-*m}n1cNF"LWTGiaXq:IPHQsg4_jmv(2F@w 1˘ }M*}UD8@)g!$61n斲PUpK5s*NHgG,-}y]+;D1s#n?{OtSDG^|zɨmݟ},(:]h9 2 R}L\tPCNm5z?4?~d'qU]{ ]FFO϶[{MA+_~)}#ʒyh5e\NDi3d>J1iw ;%BdX(Mձ'M1m|nT[8@PŒ]m#<ǒlE Ǜ,D;[mȒdYkTlus%2".qų &񧡵DqKͯ`c+`$:gϞ?|Ʃ\f}{zI~w^(Ϸ '"^Wv;8BCqulq8<2kVYͽ%9W}W;24vh=+џdh3>g֝&-3 f!sm0bkcOz,}|,{!{ ȫ`w{E} Y7V֭[ ./X4'8'(mJiҎQzzv5WIk*㉹&j#,3.,S}$ۊ>?h‹#.}C燷)TF@Ԁfc՞Zwx|zj) q~~RѮ3Ѧ|R\r>BRkWͿQkRJ}|Xd0#c/w{3rs=Ydsssp9\vaƃ-D2?LSVimsGBU}uIJfp|oʀfcmUkB@^~B!d3L֞ɒJ$e5%%'mC 栶IssB{J(`x: %U_}q{@7% G .RZY=g8ee9Ko7ﭗ斠)v{w3*+*l\J߰rM_?CٱĢoFZN{^W'3sil<oW--9@OO oHFԊ# @\5Gӛ7`h-MNW+?nҮtq7~F5J1;`N?>0c!o6Xs[9 ^ pn {_8z?R^}qN['ljV<~ܭל<]ѽ*&#g~܎ku;ǽbwY9Fw!;ANn0aĞ l? YaW q3 J5AxN~ͯ`3^Qf, Ί&8eݲ]`\N Nr[=l~?'?Z/!?XwFWېR\Pr:6vVr^|tM5}:wUޭޫ(K:i>s̟##w} r Զ ~6 ;{[H=ACy^a7i0 YDCWtM/ۑ/Cǁqh~TԣDDv RSp~AK;w(uhͦy??&v)XeRy@'@i72՟ѣDʑ4NIq4"TMgۦ->y3Bz Mvգs| N~v ?@ C_E KQkoG?v)7s{_ڔ)ە+\s^i: gT^N}jla~2KjA\ ^\ q?V^Uk3 r4n4,M``DD_Z1Jbmֿ~.T[6Ldz?r.X/leGTܐ< 99hkp[r&\D@~k:}g@1Ikv-ʓX^1v3|qK,SlRE֗~Wd6Z!|Ǯg%Hc]0"bv  ⟷4U^E-eͽd4Wbd/>kz&Crd6 N`{E={`"j!Kd/~1W1Ӣ#W6C^M1xw_9#`0?փ pR&jQM_U񧍽k;(5~T+`籜k)BMo|q ?HE83fn6p劔.\ `NL^-yęzE0qmPjǧwV^[M'8}PqQvHt<6qݲQ E6C4`T?dfggZISBW6&}&k|CCI*>FsW%E8 FuA2Fd/lTl?I4YP8m@d%m{XUlp 2AYE8E]aq&ORuE)Sjʑau>UY|)ʯ[>Q_ߝE%OR~&N9|&A|rIZ,UC2l\#+/`-HxnʔP@s`&C/%ΟJ6:)qG,&@Wpt3}ĵҡ#9}KثNَ`C'u}kT>4 ! }x՟p^>1VO9>ëqD|Y"<lܭIu 5` @t@?:oI)_Z+ >ϼ;@ L0#/pl*w0c!8̂W i:Ɉ}EB?}|c#NrГ;U2v-`Ro5w>1lp5?)wU}ŭֶv>&D OSw.(0t:Tn^wp<G5c? Z4ۺ.Q0tNv'`SG6}UTFBgDX?(9^ }#R$#%!7ܪl=F9,;0 RǵPcG]GT6d} AI[d'%*Lauޥڋ4600ئs Db"DGDXjSњhk[ʹ\mQҊc:ϓ" {4۠CۥIYD?x.GX:8 4*WUf&_g(OQഊg~xmo&#`& y͍'G&礼znxU²weɔ-f@&DdDpZ8ge2O÷]%#C51j=@ Op|ݾ?g?Ra.΅)ؽ"a $$e{f8l+j[DMٝ'iǍ%.Pd66& ^f }4'R$UY+LWu}`LMktG(d ͽoְ@h7ALD8E`q9o|7̯׈ Oew;句(5!URU v:;Ï 8)g~Qاzæoً 8}}zH[RE9oȆo]+D6W>Q~g.}d~}4Gh 6ֵy_3{  /;b =!')5RP \wQma[? O_saoʎN20"e3J_}ѮnԔ$p?@IciJe$ei(Mj;*<[ *L`@R`+ݮ ޿l/͡=_pAuud%DtJdn?gͺJēe'@_! ϘQ~c;nx3{.r(o-'6RQSB²+jC]6)N<[ Q_RaU 4`FTӹr8.e)G zfH%ӌ$T6ɚW[McĿ+u ~0~}NH Hq I_XzlI_UhR6V+R~D +yķ44Y8r{bUP{?"1_~l~sUQawYR|qQ#l.d H}PHN^+ςXbXT BM@{=^QkȈSEL%#~F,7kdD' M'&H͟׃!^D W7UںثŜg܃GWy@yh@D\M޺io~<+!:dE=pbl(Jsـ]+Qnf̀0hZ3M۟[`\F@ ǎT8E:=Ssk[ͽVh+vyL?L}Pt=a/Bofi6VnKL<6ᚃ07o~ %':m~*Ire @N*-ڭ՜UF 5c)*GGWo`.K@@$ ,yNݗUo V/GFc1ghrظ ?SgUϔh?:ȿrO!:~GR" Bحw3=kގ|R$IX [R66Bۢz^_!cżl~RoE|E$ BXPRcG"H190=RQx)gL.X4? "th3A LP BxXnj~1lg @o՛XWXFX}ܵFUJndGm#Q62Ve5?-7%\(ְ{Qb BɅ\7ǸMC`us&88q~'"}`lxۑi~APmRuSv-.ySϠB ώ|6OMvc`Gm׳ +fU91pl6}>I [onm+c`_<A}]~*N"N 10next6QFW tAZw(+ME5@DJ;28 < hlvR81+4444[(J(Q:6$رzo  ` @N+kbX>%2V EiKJ0aۣW7яj=SzY s/@hP?dU:mg+^|qdw(&?{u:Yt}y7B.g]RaZTFKdNG VE2 ۾ƼV l=Cb+O{:\}G[;CRs+rK_:{ &ľ*ug4(2^ǿB)Qp"p읾@/4pAj"(6&lrLw'6:` DhDa6K^)l0$/^oF /Z@?Q ^";!YJ$ }p [ni \+y gϢDL[p"jpFI$RB F {P)͂æx%C̟Msϛ rxDŽ āZ\,#Q%S#fjml}~A0weY[1uG@G.Bow /ZAD 890s"o3 GB6FU  ~FpGĭ9PǠ/BQÅA}E+nW]2Q90\g$a5/BWC"0J?Cn]@?`9/~l~DZG@4c_:=dg˨k^fg~ ΰpC$'(9kQsjW2ܼC l \81uS|@F21W͹hL|氕07L3}Bs,3lހ];0` sB<@B_ 9p,R8ôhae CˍN.0>1 ^9-sy&(mʴRM$i3hT(9(HGx .y*GU/7` \hnS6o7=" ^2?#YDh9Heb\9ö3Z?J3¡#(g(gNQ"A\{ G.seEݓ;5AA/$qsc|;%㜮jMT&IH$1]Ths^Ev .ap O֩^VIU^UiSC1]AQjƝ:U6dnXks1๮I=.BDP(C! ku zcݫA|nEPJqX?^xFNTQ3Nx2Ď @Q4ۺs}H>yrNw|`^ok~M`>/ܡInv(H 4϶[ q6Ẻ0B/KI"O>gޮ #Ă)K.>'yU!!ӽ9B"TR*RB^9*S.}_! *Cσ  ,浛{_zS) ua{,bcWn~whL&i\"䝈R;*YR.e$<ы6L *9Hw{Op ,E@8Õa^39>tB:[}N7wb} ZU΢ٖv|%ю-$o VPV5vWS |3'"m\ġLTX<K c<% 8^s"zd@wRƹ܀L\gs ?M_ Hb8yr0uF۰ ?L0{!췍ʪ䚢W]Gt?p3y>Ջ Qӧs#_`avAA^sYd\Vlap, iVt~z{!|=[?J3X āЯ=18 p.meenP/+qqn&"`` Ez#"+q*N˟s4va@xZ@SVC *o!J84!5Bg\i@^mO7kߨl~\U7 nݺ igϞ u^$²>iwc q%8SN$$/ &$a@MHoz;|p_$ĿGi:!?rh  \H^UWTjFSՖELNP*'-SH-;}e??p.ǫ[u}0V#=g19o i:ZXڇ`Y'--{Y4ut^nGMN"|u:LW[\DJ,%<C YHdsV Ŀ3_aAד'HiꖷLP*k2vU2l D: H0"k.c[.s0giwW|d'vQF2 '֊6ϣw#b8DM{'6}&@GX&JYYӹJ[^)mF;d!s2d}/ZbW>WurPсb?c3GW RC&aZ=#V:*^#j"9غ=DXs ikQBg:&d~-mA|K %]ug;K)n8sz+ERip;ۡ ň2p8Q'/9,[4SxMJgB#D5~,=yDIzxsgoφ Ha^㢪+A?'FFaX !58+2W Dq{D6r,mߗL b-yp3\a#Kר/,aÅ &0S!sYz 鲪7Z: `Qys*Y5tN\ih4n ¡䠨׾N_\wͯk_gW$ l+7BJkʁ^k>qWi*exvSC /*f &5N}Q _0EzTgb_jRup=5}җ(6/z 5t}q\al`;,mF2ܟY'( #_dZ  0 T )J7z1t1?"zIǡ`#'yT} pg 1) oYQ"0 ݻNI=VQ⯓hO?*nz=B@@sbO82,D fWy@Qk<,C׬q`X[)T*?AlQ z6jk@dD{F3DFvD _3ytp6mu9(EmC ofu€>am0π <e{ojMܡVKѾ5e=8"Q?6Dh<8 `K;"DW7nϘ"  ebR:}G" {1CW~ oJRVGJMR.h3?Hs? B &cȃ:# +f1V%2Bp:Tns/xkU 7+ jϵ[c,y2 ?C7, GfL" Gpd򒯫szEmiNv3#p8շ[{+VR]x֘*\y G)d~D ^aǸ xHH Ϥ #yυdWsd!g=%JgS41-޳B6mRرn'JqS y=ס&(e&[[6'f+vTH DǟYZSqfޛQoDx(dD-1Z63% n@Fl!E?+䒶!fT$I#ATm(hw$yлD 'c1pD#W9 ؛:.:eXA R,[bNRZEz ̽?Σ"msBpnEX2Xuѡ@]ܳ N?/zlpjaVG FU~{+`ۿPCt+f][V݋,M;{m#`$V??GLmHH9|@cG[(׿iY7dSϛ$4 \rbi@Pޚfͪ5[,A& <8 _]EślZOɬE9wG[U@yKP(pğSnC#(`̷{oo D1 SϽgrW3햞J߁F޸Hiš0ET:|PDW9 *^uo5~E-c2q Q P^w&^$)CDUf6J=t>/K!|r9kCغN0fCJJerEW\put{Cu?ޗJ36[ywf:gM'uz͍k8g'n\1?; >!` lM4]HJT&P WyP׃mC iAŏ|)KYQO2gv!q],\CJP&|Wܤ}oug{h :/zOe )t&*!} *"4\Zڏti\;Ȫ\G'Y?="<Q20c )pX_&-}@FH78pODp긱DRˠĜ( n D>_zՍȭ?sܣxy2;9D\I0  Bprr:+? Emt8JsJPBkmj%%Xɝ)g'G~YgTջ97ͽ+I_y>ZVas_͕}qPQ>`Is+쪛7vT}pH! lW.ꥀ" j[$ݣdz-~}o_ :籠conRd2 G1脮s˼a Np0a䄙E3="I^y8sv~~50o 0lqIkoRAtd,*-ڭ#W۔xLOv C(?=$ (!PvȞzV~DO?=pvTZ?o -DSьvG9P~"_.V6`2=k#0}*rJ߆|`T:L.N5$-6PbAʃ*%-(m;}}%Dӧ32M>"@}Kj Sy4_2熜l;}BѬݴT?bޔ x2wFh=Яi.iܺimn/ƟQp!=K/jSgI'ϴcՠ7OMcm*{7ndC߯R|_-7Lw#S9;6[1>I͵=7aZc;Wl_vxÊqXkdEN-cI$%)OR"]=@y!U˪&[BMM-1dEDv>j+N''#CtyvUl]6f6Dt_?J'FeP8q,_H(?^L}4rTz&Zf!:@epzoZf=֝V_~]^a"] G#ͱ ~ԩp^w\oGK5kKc7{*Kx1ӡ 7Fkb8 h9*l䠿D"!G+ay\tJdc J1 w P>@xkuv+w 0Ҟ'SojJN ?ΝJνlH֐U|ܩ[qdX󽋚NpYҡЈfCjŢяjzz 뭺G<&xU,<ّ9ڏ֧p䷃P#+?(M_ILұɤۇғ(sC 5ˊ߷@MqVH-hB&VfE%? OJYs A[+ϹFEmutL<?u3UzN~+$0v,?Pj]y3]O%l맣 pFyNw}o~}#iR9gq!U=BNI$G( 0LAu}{UaG-DD #I)C9'%5fܐ*EoNw\/;[M=bp} *! t7bYC֝\w~ .&k ڦ# `Lՠy}%pJ?ύBj;&3Hg_eI}<(p@݇ZM#Y2"k8L=O|9x?N"!lƎx55y {^E qXV#RI7r^\/ſHDB>\o;G{XN_W.\C֥!gCBu-k}NbQk#{7p^OcokFqEj*F*:U)?w谋iil |0▔P4xJI wo["O*M5'[uhv2YE"*1\+Ulj6аXfC4e º^V szU_} A>xM7x3L1b.y61 q{S\1F! Lm8*z,K'q5 +}^;VBw$k S|Ë́O&ۭ2bd8+St~^i۝?jT~1u<^ ዕg_^NJ4u"9us;^-9Jebj"{3`v17)Q[jHrKM©ME\_|zTrn??|I9~$k@gC # 8n‡w4 Pcl}_GL\FXXK4-_#P($0 `eo20"+D' YE8ӷ ,yE=5A vh ^>5YS0|gx6^Nt~^V!!X=x@f@n5,Q<)Xc|cGݝPlݽBD" ha?F\ݺ8;Z}['?Ɇb_=pTĨpqƏijġ-JSR$ Si!M1"xvjUZ爀ھhr$vnM'Vk;K|rp 2ohhc?BۋԠOW@^l>I).ޚL:UPPsW Ss+=𣚣%S ᓼE'A /ŽUSyw3[QEM([gv!Lk<7sE>ª9~di[nP rsd"{}CGN%%!H\'qm!QTa9'LM/)!zzB6^Ak8" HxѫHV*؂(68{; ;_im{%_7zjLl)NSP8\bp$]gF;=uz83$EJkq;k8dwl=1u:9$!!`aa[ ar%#*/?α ָd"ޖ(>WOuLOOTu{}?!Şz{~#k\=$d5ˇwixnrJ.; p?s LSjg P/Bju1'e*+ SAMm4ʫ?XDVyp>&"X<_26ewAqЮc!W>W Ta6Ɍ&b0+W ~AgrܩEj£mmR)KmF7=xoO=%vUw[x}6 iryjgEI#4IMpV:+2zn7HvT7v+8VF{19:ub}q:=YʇQ FKuN2ΌciZ1s'vC攓twjIDy6W-[5L&|t~ _A$^Wpω^M^>:6"i>7}j$Kg*Mnj n8T.O`-LMI`mwdww췛F$ۿ _p^WϪ΀LpZ&ǻKVoO8c=sQw0=g K L H?{ {{?v?S,K-zr~k^>AU5T~.rjړ @}ɢ`7G,.Kz{5+[vzDz, U'?$Ao6ߚQ=XDJSЫ&sn*FT?{S˺2!3 ~nܭL<2Y!S HJwvMH uot{gV V oY[رgK1,q:dG{U[hʔ.**VOtOU90Vv>eky0 |yt$$Ǹ8.!r|Q^oR/Vq[ݏbue4嗖CU˺v-'v;Q$NQjr\,:K@IQ7Q@TVyN\*z7Tm6: v?3]~oU^x/DpvqlcAa?ON\w@V7aF8=\ ҚLJtbkZVGd߁݋gxkI 2΃tOđZyT%},ꈏ:rA{ mG\20) Xz yk_u5Oϱk ;ͪRöq' 5)`RWI^ܯS9uq:@Uk[TRQ'ZZ5Ϩv祜i`*rOj TK) G/K٬rܐN%P9=a1~ݥsU&VzN|iA Vmy3~.G|s/)M^?0g,frR^tLJ|q4X]~zMy؃ DPrR}%VB+5)BV<uv; 6%oԫbw +/R]Sow7%Ɂ0&7ZjG ]p?M4/pT#%M>fB,?%) ,=g|S*m%t]NHp߬U87V+-ը6]]!@>NekT ;*] jM^a'61nOI_wz_K?fA%r}J_y}:u!Ϳ8QvaKFGU:K*A7>y]mܛ=H@`Fɜd.J4-)`V@tw39zm{Z?[oy,y8tHˤT <{ίQkg>|J,ڙvVGshW}+ܲ;J /tX*dmX_Koe$”h99 P4?J>3OdM+O=/Ln㿜3զ**!Ϥ#o?ȟ;p+K4ٔ#MG?$8G 6g[6IHpQIվdCwTY4JqT(/ _tZEZod5' p.2Z,NfTD6;Y>S5"vժ%D% 4)>j-1o`Fu\0D@otRpӺ__usMuJιXX8t͓u~j_?=lmr<\n[ۡ^IjhQXg}k_z?'جnܻьMݭΔ5>8.F'mB1B 7xRhs\p$@F%\)4e5[[o-dMdsYJ?}M wB=7'QA+|`6[*NٙYN[9foT#.ڹ_wB''LZo|ge~Hg׸|vO+_77tɋטYFҭlKFsVtenCds=V͆+z5Dz@sNú2I|vnoݪjb7YmQkKϑ4N$xí@Z׎, Xk/fon܏GFW~?$HL釿m=}cK(гV`zCZw>T){=Fٟ\?k)][|FN 7:)% /MO Z;yuw:p.H$-wu?JE%;t.'#iFI=?jqhPi2HVrag|Nu e%V̢?W,3=I5Rm?+ꎖstqnE+-nNaIn" 2njHJx(=, RRi'p)*%{0O V#CHe%+(AU"zgI;7'o=Px/l㞕H@? +T/%^MfuU< צCR $:+4T~&$x3*d%&sKX/y5#`ܹK2R? MhJRÂIyys$fι 9GZ&ō[f҈{{CHV?IOa0wnF:|{T @N%444 ߛmqU+_;<v_۾_=D7ط˶2!g;~ITvzп3U;I[WL!.r.8 WYЕR+UMr-ۈI$W~kAD1;HJJWZM{M6+['ΕIXfdް !y!73)^MCC -W;8\9 s9?%X2*I͹&V@rڡ`֐ S*XQVa? ɀom=C*IY3T,{;ocoPȓjFvw6R)E;uRNy~I2ɸDfrC05pѭ'_2 QNJq? O_ya`t:IIȼQr4s%quKWOT`jՂޓNGG%zRa r HԫLEk59V~LO3'|s{+K wmC f"}~`6g1Y~3Aa%b?uuS6'7sDB8^`2V&!}Q>*BOċ(8W=_׏}[3wU[Fh6MI4<+$ ډgOc n X5zЮ;m>bٿU' T T}g'z7J'wѾt>\^Jun) I97ժ`wolv5 'QW:Mk6n#S;ba JW\N5/cƜfyRj5POkմU)%l2e:|{`??G{c۶J\<|a|.lW81?:} 'qi/[t$4ZV}uSmu c;glgmQu,ru (ףOzk$>^j4%xܯyu2&+9c{=LFWZR B&.9E?ͪrPV轿n9}v<'@?6( /cμ՘82o|sۚW9rrz:u~9A"|@Vs>\2)U (j̒G)g!z9=.*?-7kF5>$/r$_1ԲIrwY NG d n7$cCH"[>0_ٔzssh$)JŢoAzct`gwh8~F2 ^Y{4jᶝ_2;-K6L M0Z*Sz0>/̥TH3۱/$b#_z\t ҵeҖI#sZsz ?b_nAv܄d2@?I&s+29)58yD.+M~畃fkK\{HkI|4nK#'jKmh܄>gW $M8LFG4N|cJb|W  _ p1 1/0+GoC˃!KvO"K ^6gm-i'D&Ihjǣy'7oK~0(=``nE? $jy\Rh(-d˪3 KHKN(7s EPWF+? ?>&_7'' `6XIrb!O}Ƨ`ңe--ۈ{ , :/B_n z'A?I1U/li0xq;57.OzNF6jYOîd2MW6iפH |akl氹3$&bĿd%F$M3sno>l\/XkO>g9U7lXjmncއ F).Y^Y5X?R/^vwJټ1WN{vtI6m`|ziHhRQˌ;^uv_^Ő9$/fCUKa7[oHV@uᾤr#lDvQ/5ΒH@`3]LUR Y lIy#?n%ە~_;\{R5hތ~Ip $0F]o|F e+~^ŀ}Q>rޖ!*VUgHq o7l1 e^$s^Tίͺ;| )yF[mvVHnNW BhL 8o}];]| ? D8C3Bsֶj?%}윓/-_sr_Qg$0ovGÌF{<={v.T߾}垾ө9O8gjٺ#2ʽymz{M?^ 4u+x"c1aÐ,89)/yUT杻 y.xO(NSyOJfӎHz {#dmOX_n4]Mjf~Dъ?WmAe߰:N@=:M? $:Af;ͫu漛 0v;Po NNp? w]n7`|N~@Sl쟫&K[i-הU5e?DGn֭@ς]a"pftyw .x\ZWTsɈ׍myהcêO~Zwy?tEE 뭷b'~~>i׃YB<:?ZUP{' s 'ذk]n?@PΟ;`+NP~*ߠ[F>2F5~V=@ܵG@>Oԟ=y"/yFV%q8Rn}|{GmܫNC|_uhG{Jkh*qh6~B zZ[M9h4K|P0$ ů͆T GX6mkZXJÿ ^4m>) ?B/n^4)>D&ZFDo|];K_O_fTvYA]<@⽇Jc]׵ kSv7CKv:F9՜_1$\O@ɜTJ[cNekSv7 0ggrn;ݗ2v_Ts~J6 $X.pg!ZMu>oh 0&lls]Ug`yu0ʁSsL [g&1Ag MRښl;G'oVo7؟ȯfʵllt'q;w_*w74xV/)A-:@gy]V SI@Qr 3ev-)וw٨jup@O˖;J?=9a0H %_꽌׌v?9~ͱ.ePO-{ \V 1mX\૯z#lW /|S۪j1 2{-y^jy)ݜoH &?9$O^K;{oj^, KE/|"ѤvpEqNųU?j?ePlFy"؝ mG$e6NmYMثˎZcop@ʐnH{02%o_e辞T&W]L YBn@?a$`,i6M2 @?0773im`&C?ơ >,dlkY`%}o4ǗkqoX߉Ld \Sfyݷjm}z.K?c @I: :;A ֵv=2IkLŸ]넱g  ~{d]{9=yT/MӺv;ΆdFO*A/,qqPFZ7}{)O6F]A0+ړ qXֵK26',x|tm@GFu {GZ>Vv:??sDa=@$嵵'_oZdU5/j#FQlT`Fe8u>ZU1Y1BWLCxEI3' n;VwZ^oPVsgˊ?'8$3 8Ѭ'}O qε^(&@ O0?@wMe *{ZwV:/IB޿}{Y9h`Yn<$9 )͟\,K$KHW.w{_g>WF$~@ ٤ʇBWP$kgy.Qe3r( Jvv|o1,I\8TdG5vJ'QBv[F4'fu]$Pf7!@8/)1_:V FAvK!'2۪5G?$$R_{K~F 8)Q|3n?ڵa q (r8:X[OI_ 3[c7 W|qK -Tơ4h $QZ׆"{@- S>7ݫ/T~ۻ-vHT5"E $K:njF@]1 aN٧eDť"@x/fn=+xS)^ȥn$n= fK'v&}^c˺[7Rjq ĸ J3_fkF#|%*YvG; {suCQdD ޶uZ?H Txj@@OUG")vdqEb tZ[Q4[ʥK)d:׃xvFRS{$lWTdo?OUKqH`ƈn|wt4'`mms?;i*Gnc GCbHq~RO"`ꀾђNK߶1̑A d}kK[ie<~bo?k6_hkn=Qjt3jDH*4i;{i$kݭ'J>-YvDwq*Ֆ%-3/}/Q.0zz mIY&M^KSRo;-sZʬ=OP3G()H ]]OZoTZh~TJ{Uhk 3<fLN?Ev3"wu?)ڪ7hUvzJj\v7@d>`w)Kj?T>7>2L-A v~ָ֦AWL`?WJ/]حUaJFn *ƝT PϕH~NIJnx = ȢPVxmm |纣7sKժ{|YLN[HkT`cQ2qĹ 9+H~1]u-Sym'ODK{=Ɠ{sYMuJ- @f'gCb.pp8эsx_glT&o̧m)Svd;)@ERn{,9bR:r*Xud,[@XIϓ9%n R+q PO**Ƀ286 a`>!T<]g9% Je^O!o/Tk2;> Kiees@M֭M> ];qc W{BɕQ|-Vv7` v6|10U,g~O6/hpOv!.\\/.١.MP?.׿|6f@H ll/{wKπv1CG \&߶Fo4۪Zs1'SǧJ%1.o8Su1ro{ʪX 4H$ml5U6r/ͮ_u>S`FQ\4!T RS ?L!o/d E1Ĺ & ]2UA.U4 H ]JeLZS{j "{|*Fs4ܫ˓R"QJz1D {(6YUy  'Di9Am|"IU;'}X@<._jat'躻tni Zb,xy }udԺXOХ=i2^3`_SA# Aj ql s%7@V^E _2(G >gt;o Yb'ʅͶj6&O<$Zm49FhrllCFSsAp.#_Z0uP_e?bamH 6p^UY7% MIi>}??k~`C JH~Nyw?K aÔ$nm:y%;@\P$]nEhvqe38H Q h$+e+:#T_,}`̥m O, IX_C*RJl&z KwV3"I[Ȝvƹ_bnP/F,Oۯ[T=$ifFfąKuv0kU*ډGV@:hмǟј߰>Zrr}a ӢGw>`/ {w&V-?orKFSl-*+hVVKFoƗ_Č!1 *HMx H H@f nܸecdl^x r@]uv {qQmiȿ-Z[u5;$pI]klU7H ~؞џeJx[u)uPq@rdtSb 8-&g&ҀjOr` Ma DV9n8{n%ްEҘ[e ;/;&`s% so)0C P{Gn.Z[ouMEy Q#U+"qbD>ju)a'gC;Lzr=D7Jn":$*EcS@0 B!YylmeՙpM<0{f?nll\i4ǫl FP_$EXݶ2P9Ourźw,q/\]H)+/K"\h^kwܑw v>Pԧ{n>#q:z?eas$Pb{μq㆓K@? ?ggg$kN2M0k xKNB^b4I@vmn  d V|NafFVib6{GhX9c# 9qF=@ݶ433g]ןF&Oj)$1hm4M /?\>2/wJ 3_9yQS6$ Hb^HH-"P(oloHl.3$I/Uo/a(GdsY A¿f2bJI@ĝ6[3 { ׍MR%فI0{k~SSN{?$@.Sl@ n7X)_#8()/v[/H\^qI@Ur{@,wO[_Yg2f@R8]{L{;b񷫪j; ◿jkk;v@ ߴL?bI%z3=o76[H]\\vMmnnھ6>u0?#Glul G.,̽4 d: "ZVw:%H\ٜEI 8??=MGR a"HD3!GdI;S)|m~~7Ibdߓ46yJ`IU(&WO:y$ &+@Sa _P#'0 $ HaF$ t]g' @DK.Q$3N!N "nrc$ 8V@\2?pT!9H$K 3$s% 0H0B6sy/&I@5Ms vBڔ}U)|R5ϞDIYgRN/j-*>*<~GS 0x_@Uv.[VkhtL&N@ $T ؖIgTEU]{b(pSbqc٬$DAfGgrҍݥ4M; 4 qet] wx67esYss$Ҏ/MӾ Ml? 7no 0!\fbkO7#8ݔ4T mt 0A 57lqjR}ؔM@QGU*NI=l6hbxMd`ed3TL6 sj! N?I|?S"sɕP$%0%7|3?6# ?IP[$gO޳@*"!Ğx`1!+@#H5e;"2~_=lrn}Z@\ԭ|TRplnWZϴiH2F\3΋ 4p_4<6;jqcSv6[O HuVC&9 $ E>7sJSY@&(u$0M|$0_T48!>>I Uaxcff%=- i`*)/om4e0V-M_Xɸɰ)V bCEE? P7#Zu:YM[FsJRV2xfgpB?~fa @ d|M)F?Ow3oowƦl!R@oEؾ[[[5_?s!/*q+F);U@pգW'1MD崏2U7g(mnn6"}l.ӹ|16ew ϲ7|1h {KI0Otf%7N~, U@?8O7*V E3=n0b iDp WZԐQe  ^$g4 ?ކI؜xW$CK8_V,Dtx4v78g{9vBxxIqN8ɿO C" PP @DuƸ!\3Ss& ’Ys%pgg}}?LpԩsU"#z']WFI~1DK @vxFuypcb/Os4b<\WhF; a0fHGՍ' D)jra<DZ% Vr.G@TaӀ\:`\gXM])K1.JpÏ5FLl8KL7ԃ},$tQM8=BO:E-'e+I7V_+;L^sÀ1F7npp@pۣįoוD=N@Ωf?ˤ߃q?U(g7.srX%Khf_3(Pd~pI_;;p,œ翤X@ slS~$Ɠpe}ڒ" ֒ ! ]RPV6L8ʟlpaos`k cG]q`^Y.}|,5V3W?.K{Gv2ow*bDJ {Q'F4+\BFkpc CnOje al9oOᏀ/E1 XUkм]ןs?m$1/www9*3I $blwGB>/ rmll^W.E E;]W"FCݿQ^e?2B>]}Jql.SƗr>>dZqbۣvZv}@Gal2pt]{Lǜ'5B0s0?Y@FIݑIJO´C|;c78ZzX,bbfff hKZӿ!~`%&\C|1R Q^i2 f&fNwC^|@ ILXXVdş_7P2 TNUUGC%/s .8y4%#nG*zb?ٝ2!Fuf8] kLgMo!N6R(2?I7np]{OZ5qO? _y@$>)M6?^Jۿ|z:: 03.%SBiT#.$'7%쏱0p0w Xxd2WRSG3QO+ݷ Ntnpk˒8NR ׍ 氁G);J$(cik%'eH%a[gҕq=ͭ FȻ޽iu0oύKՆ#L>P4@z$) `UlMrY [/xcf?Q7v?֝gH #-l=6\]/J8v8ƍʿ찣BF]*c9IJp|ݐ~nƙbd|yOR=MNǺiW_c]"?iCV?j!{۔K H X @H;|ҚJC~6$& ~vtv l)VЍsƎ 1XWHZP8$ѿ6B]irB`ntCYB* %E#@><5d ATH"-)@~{JEBG>Ս fD_̩%s9r+ ߭E=&yMWƓ4"ڔO6~A7R$8^f)p# h2Rs$'M $u'яNFW8j€Fs1vd3=$mWiRqLuRΤ3+/}GcP{'_LRC~ژ@?I>ЌVgt: Jʣ%I,?RpID3 5fu%Ǒh1Io77 ᵐmWCNOQKP1ЈVcW,F〵\'<@v' 7qr0+69DњJb& d2A="{Fp'XЕNX~ gun*d1jT`G ZD|dl@:377 7n8yxYHlm^>=}՟ۮ.V皦1zuwT*7M{Ej&@?@-J@ILxj><|vvNUw'x~:omQ ZǑY;r$(blF@{լOwff<ڻ #a'] 6; mT|)$*5;[4侚;&92i1*)s#+-׮]sQw7yi8 ITW&GVpNT|?Pw~GtuGYi[[>kU'W/Ep^($??Ӗo)76(<3ۆ_NURmG<'3iZ ut@t87~ US8k'`,: ڼG (YuxG}4'jTޔW^ M f`,Y|/y(RFTT'O7{4qH­ed0ow~7 iq/w앺w8NI02:jz&IViSWL3W1# )=33F2ZC&:)zӅqc3O>aVɒR ТRh@Kn cȽ>/qR^.wN8ȔQ߹sʜfՆZ  ;N$ r=s>O9Z.|J8/Q%d5]s:@d-)Z4َ f"8TߵcE/]Նq8>۔uR<ݻ$!H-UF4oy'lnn'HpIrA?8dΧde8g9bw[n`(mQ}&MSU~Ϗ 9}{>u?HDG mit H￾ϹvV+ c c-`% T ^"!qH"1l-9Eqac zeغ=~wm̾~MAhm\&}GxPAGw0c4" Vl.er(YqLP%:'VKF"~6׃q5 &-7.ǭFtɑ]z|pxȫd4{z˳ ƵF143v@#)EG?51 > iƪ76sJ c]^.9?=P MAK\ `@7X$c @jT(YFD,*=<l(i8._AϞ=k@xhPE{fw0BW^yEK0tK9rA-J#G.N5dm@*EmN=Fd߯t^~2 Eڸ`5sk_;1Fi4`8.Fxſ @kK9=5Za@%J Þ2jXtJ2֔b/w9/gڽ(z{Lഏ0 9LozӑIڿWſ GD\x!`6@@sa4_fƈ-Z"2.٦ub(5e'L&H8a HE. GL([4?fggă*.C(K *ᅪuliC=fԤ7P\;s #0:Do=0q]Ө{!A{!cr-vަB5&[TzW`ϦnllI\/ԓ/.iBJ8fP:͒{gx :}4b3(cY/ 2unݡTv0]ԚxҕqumQ'Vv<=^ ߝ*C^ ,WvBzi*JgFj  .}Q:o|T(ewgK>ѦiF=(qlT!8̙7 \.ڭp=dWěsb666Zx3^Io9>p [E"u"#!&# "W nS#3JƂEDuŦi%6$|ĿBn>??oW+V؜kĕW^)m, c}02AVV),nX_WGL8xVWVR8s   btƒs†qAVԢ-兢L!r)*IAꁴժw9g:L=;'C!_s3iIRw3[M,wWVM\ƆIў>vp 70S$}8kl\wxU*(J'IJGLM!hM='=qԤbZ Je†WڷPw[M .fj#ԉd@\NXÑ0z&pwuS+x 5 h 9݊YAm@!Q9QpT`gHu9eTKFQ$}㻀&&ߢT״Q]qcyc.sekp1h6^D# h>."yX@9cVFg&Ad|[$ }OA%o~ÿ V3 Nj- ,@[?_cIv zP,ymbZ{I\;@3DW\ :h5㴄*`\ 5m#qn/:..&U/-~S68Nt# ܸrO YתUzc  /TƔx@)/N,n>~e]6kTo6(:>ϿGe%24`UWF~fW 0FTSwJ|E<3zDpHDm9RR>O2.$߷_fo2}w  7EN0fN33֫/B{D嬆ps:`Ǖ Q|i Rf6`$M#fJF2 4Zd-_[[yϵ7UU[}JWggռG4UQκs'Vsn)"vAhTdn[pd|8AUuT'd2>2r/BO| j4vNH<[?o;9jӷCG^CDOɩ)? VWחu㑋X>X{6z"#_WntZboS[ 6FEL-aJm7*Jfocn6Eojd1oҀ8R-J{y4 (E7-`ME%s/n?K"/}'5gW^1ck 0Q@_^P`x\*D,8ŘyP0Zo(vzJZF.wr >GXQZe.m{=9futcZՕ;qX@(Dn @#꭮oon.ߴGf왳t KܬϱJAqJR>[tLEJ%j`.-DSl#gA}>n@kl Bqufn&G>$T@ H[nq&V] L*|w?L>&.p x=$#N.ToH@/<{OP!"T>~so/BDUCSژmo{[SS̞v[ʤ->3OY_{Rdpr @= 0zGp& hO9sfG`׸+ںǽM7gX\*1 xx@fFUդFnK;OZw4,Kqg-I.}cA`hwwb{vpyۿZ]YqH,jضK:Q pM\3@\~cy7==eauhn"L>b*8j!ZlXtf\*[S蓟D;yoj|zv-'ےQeBhϞq8=8!zWvc.Te*]\O\Bn^hkT鿟C*^u͉@(LV.:|H$|O'0*<}*:x>,{#>,i!dMYA=wzy3d19xvcPhƢ/@sMtDcCP%F#ucR^Ͽ_xϏ|J[8I6^΄[oyѿ__q[iʔ𠎃ozwE`}ue7*}` "O/+EE=:_<. [CRǼN?Ew-ͻ0:zۋ/_|ɑW>+Ͽn@Dw.ڿo 0;R 1 :yJw3 {tС=ſIN~iK3sbkW+'?Wm8J`[S("Z9Fe\(쬽'wxMгpnD8K FcO;D{ٳQj"1]Lw{je3'8i J %=(\p$qK;t1=X-!.Կ܈Jݵ5Ā%غ\gw;#CZibqr ;;(w;OO]]gd ~Ag۝j* }ٰ0և Miqp9/ YĐFj M s9|zz[Jj)KK- q3 ʐR'Yl%øs ,T"nży衇<1U s?O{ge<.RzPkd<_NkFUWiV< G-̘ :.qQ<պȑÒ9a5d³/ t(<_ #PA-_R(ZDVWt>=B3̼ܗH$^f IT.JDѸ 0pq^#s+`h.{ۿommYy qECh*&Uށz]{<w-v{䋣V$hXSſ†J΁Kc0J'M0# È< 4}^~etǘ›l1U*ūZa P^|XH:a7Ufwu0ol㫁-$Q_W2"4J&onn=̂ mƾ^fWWT,8ċj0x n@Y\A HYsù<*15 ~s/>5d(o1&Gg oQTtWc!K;m QgBǦDq[}qƦ%xhG+ Q guB]: W /(Acm%u\Lz5ϱC@# 귁Ў4  xfdiI&8EY$Uu=rŇl}8և3.*=oo8lPD'yvG\>GB^.DZuߍ3:ƌWi"4Fc"3GNۿ1e};`p hilHoSTƕj=Y>2`wx oܹsW+ 0aٔ.(' #u(; ; (6vU7tp{R۩kpjU^)PNZ8`$*CR\E_@-'2nWuHq?ą^h(vx$azɠBt6*0 cBBmepA=ۿs*^}IE|KX7gT)ʏl"`có&z`S**e?ņJ---a'gXh}ڌ7Wk:;)V;i/ZS,vse tuNWJX,#G(ў u vY#vP/Ol<}md&yw߽orgy 2=_Dꗔi'Npg&fI-Rwҕ"}j2?KM3G^bzv;R 'X*T猧0bP `-*8MuEO4hTmY+!L['GT:%\Voܘ;"R̙UʑݰONH '?AxV=M0 cPPY5\ 84ucQ_A9L:zn|z}z|h4*^J$tBxf_~;CpŮp䙮QoP6_RUB?6P=bT)uz{z:)l+Nc (,r@$?2 M s4Xբdk: L0L/xYi2}/ !p U0.ӟZ~sw3Yn+nkӍCa收bT4C[4+/c'uDa.hQR@1LHHPl|3JVZ__~Zlk> L++: VπY; lllJ\ -7 Н{z! \ C<Pip0 N8eCB!)g}8` z<O*ruOYX.h`-ļ(!,aЀcv!`'^6R,E_aP~/---CWםTk]?!@n'.]D"hvmGh~Uo Ck Wf9pkTR*y;3#&aa!};F. %4m `NlX͟~`0 ;uz40"ͪ Y6} Uei\F."ࢋ>?yZ-9tF<^-J`0`sT>43i^75̿K ؾ\ _όЙIW98}<[uZ[ߠb{g ݄FC2[`(da3#!@p 62 }_p:4Fb@eXNph4*ݳDS0pO$C3"b|O7Zfoi_o$;yi; Z֪5^}SG0C l]ps.yu3Nzi Q}M m ogzf*Uk \nFNU`ݟP,}˿Ch:olJƱ-Bb6@բJ>_W>x-R `Ќ}dA^LPiKIe]쾏m Q,m 0LH,wIw@#VZoLŷ"(ZR֘YJJ~QBAkRY3c+_k6b$:`1Mdsj݉`Ĝ(D``K"kٜTiN1sX٩Q' {;_&Y>8G(}ҧ;vieum;`<\xؔR0o\\.s}SuJWD7 Z^OT#Q8Ϥu^Ƒ`db񸔳ÕYlw=;1,=@? S( /] 3 LRKlnDyp޿xP? 3;gy;UMz[f4MH%& &xLڀ,ȸz&9 fBZ=UGcpb'SGa/jGQFdS6x~(g.V{+/w3JP.!}l`&N ^a i 062T_pN8[/u3d\*XIQpM1 2{^% 6pX*~5X,} yS= :T3Ms'<0,0p G-@ QX<~?F?Ŀ̛@HaO!45 &"ws(7fGNws8rQ$hXCrsOO}D44QTDT0hz\K9榞.(]u|rLjN- '!7G0B4;;#4W8=: V>׿'>BT63'?M/*_c:'wƿZᨶ^f@@:[@pߑL$Fkr4f 4f}c] 4Tn a#'n+8#nl/Ԩ nF# N7U'x̤/:K:5 7Ɖ31 {#CƋe2 Fc.rB>oXD"!婯oJ<oR\Y~i.Q[DDQ2~* #ogʕN-92L%GzT܂9j+jA$tM%/ng--g@'@gNvZ(6ܔaYJd,p7\6+E-_wt@ϵVL#I4v3/-ye/?wic95=%P vvhd?G J%)˨osӹ\S[(}fvPM̚>K:>a3ˈv74w%E|FSĢШʕLĥuV:%C>T &QsZA m]IR/<F$3AKJ\{Thkc)g \͟fC#* Rs+ה>uSt@qQo}gԺgyvqڙe pT)_sRTRa.0H,9Y'1y1w`xv,;rH?!\;AIJq_ʼnaPo?2 3i7N$OB"lXD';AW}r8W^%;s gFsMؑ XD}w򿉑X(Fx0 _08j[khԽƀQp'PGèV*_X)g:+ i1 mAZ\y8zUYD<fo>S(Ir;8쎢Q?`@&Me-۱C`Cz۠Dg՜V*M{V+issk;>v@q "rb<`@J>3X4aXha LƥB\9?S Hkmll(m x%!ό0<ԩL'K7 <D!NRIɪ0&߶L}'TC@x@+Duffu 2&ol&=iD L$L- -TV)_( oM)B??,lw{ (2 Ge.~Gb2ܘX@ po2#5o4ne RȠףwJ+(.B ~.gEQ> HNR' 4`8!.FL)377+x E)x+T?n$m?rP±lmlllp Ŕw6%)(2씾T~LiH&7',/_@(`Shy2X,I3&EE\\.:3Jj `jQ9D!"=[<(YG`v6 pPw 5Xcy1b;;;E-qY"ֽ^zME Vg?*|^̃"?))3? g}؜x衇or‡1judne*LCċ ,+R*}(` ^%Z1/h3sV(\L¸Os&]ih4lwynfڰSSIIfr3lz* :TЉU߼tj0ߋ##2$]g0W]I~Q8`z =sew?n5ru ϩ} 0TseVK>`6\a7Ex 5Jr&yd2y}"ӽ@ SDg?_DԊp PߪׁȝZT/fr7I>fuG%@_P w ( Kt  +H"٭ 8CYs9W\4@FJj5 8#Fz# xC;P{MhHuf   /Tl fQ]7M:9IB@F1'ff&Wg=a`0EuK dj %׍pf!R FuKf)yF t&V~/d҉DRnЩpr*!XEjknWś_,Ks!vfd~BnfE!p O _5KH)@VAm5g7+Q(rZf^}umu?#;;3lollP65}@c 9%%En,-Y9."݆}݂w٧=ϊskl6O\f=ـ‘fMY:on:%_׾NGu->X8 VÂgaFX&Z'ȅovnRۋ[ܯn@ |d>;9=NMs(yڂ3c=nRj8 -qS @6-P(eX?Jd~ $ EmeǎL Lys "0N~Z<Е5 a7ϊ 62~CR;$ =y8I_JV|n EYsdԬ`0@%_155MX)? x19hof o_Qu969`di^v&Egqz^ K0-/Yv}{Rhcc1fRLaQ*Fhm&l7>~lo'͒8E(^܀?Pz }1zENeXy7`Qpz& \l~ p9 `U9ߠﻠte5\ J 4xf+QL<)z)UE0s lLQ-oy=&`*;!yέV2q#_5i:>]z]{!@t6f(` COOOK7p R`go.FjwokTJDXH~ /p'y#nNBA86ſI-Tc1j`l^! Q_ Uzimd6UBq(RN6JW@DNpES7az !"xdgQaF tϒ7 #_FsԂ&@]$B@#?&Q/&`wS(r:pA4r&Gg!>H-Ѝ/E.뎝0ik=fũI4 JbsU&糤p6ӊYETvp}#)Sf1mz0,\L AfH3 QR1+`f0R= 9J6lOw> 6-ʦ'ж5ɤ#:`v fa98wuv` p`O=3w]3ď؏Q6E/}*e7 6r70Yq2a[bC_*m젙}f`|ZJ>Fc1IC67&U*X@bjzf @g@ex? j,//}kBT XiplqAu&|vWX'ZVgߡ^xQd2|(0x%t9 zj k0MXpgkFsv.l L" @=U(,\y8'u?op5LNnb1Tv(`$D``-F™5t)+;# 6L!`h?j,6@(.3ڡPhg3¶cf{Teb[@nŦD{"B{ myƢ:q5QFn91;{,N lBm\(R9=p=|3teHTGoHYKa\1ͦŀbS(h#cp5p)}E`?93}}{JWk3a^ &#^gpu`v{K+Y=a62UeCu7~손E%+9sk nUj8|o ~!}^t1 @1@Ito6xKh *[]vXa܉!=z,|;`B͘h\-2 WXD1>;7ZZ]wF"( b'1 E Xm?p?_5d&IENDB`teeworlds-0.6.2+dfsg/data/mapres/grass_main.png0000644000175000017500000023175612140200333020501 0ustar felixfelixPNG  IHDR+tEXtSoftwareAdobe ImageReadyqe<3IDATx y&Gu648Ho(elcڳ%ykk7~x5k?=Λej<#[ֲh?Sh &%IA&ntݨ#23#U]gY}l׮]'΁@Xō?{ 'ˉrk/>i.Lsj6sY߻vˊ&;!x jS&t=l=xyWsf10f:xys?Dau"J`+ 5@%EM @ h1F@ ƁJ_̽Scz/M9n Ts@_sǵźvG&BY@]I40ؽL|kU~_f`\CgV} V:A-:{۽G}q0Ł}l`Sﳣ~@ ڵk]п%BEw?4n0:ٷN\$3Ft4Lfeb/m}kKE  tQ}\~3![۾psb9(};錸WĹ<*"sqEnaPnK/c5s䆳IhrNJj.:#L'Mzƴs~e^ 6'OJHę1c}=!8i> ^B4N ~~A7_+PvJ#AS!`nm5sA͸bU>?*mO r쏁f_f2U 02'j0 ˉGݪys B9רl.T`xI,ߏ _LPsY^kkk.ڠc[Ό?[)׃ׂD% aUwkq/}ʽKW`pQӷ&[ kkkkkk6H aֿ+ĵk"ȿ$>ǬQ+gK8 jY]`[6mө@"aܑe WiVʼnkkk$Kªƒlˡ\ua.[bŦ4+KW$իyAzAg߃v+Fzt@"a\kk(O؋׆׈J' UAmDžJՁ3JPJ[?3pW*$T_= V9KGhdۑ@XswV*Y? 92f LC9xNTVfv@aE.s g?'aޛS?yZ[:dJы,\!cͰdb[@Xa(JdY#UOci$@D< Dkkk6;@ $V&p\OÝi;aJ&ݫgUJ Uw# 27Q|۵ڜi?WV$H}[}5c`[7@ H ⏙96|с3>S޹k۽)ٙcr++2mmm)mI )ҟVHLv/v_"@+(``[``B A& ,O湜T?Lp]*9fWInOӟ5Skֿ1w^_};J83/ԭsxJD{Ijy[*C&~RӢY?+|F$|na_v8F/Ls rƩv7?8*Tfh1ϥPB ]j3]~Zng1A]8:Smt:s:@ t,ݵk׊DD4Ìb UsȖM&wS`]ƁukbM2@(`f^~ \ĦTrۧv ؼ>~}@Z_bʵ,oGR:Il?mywnmH ϲk) T^XHJrqӨU*=%U$+n7S@j6_s*LݰnjU8ܑul =D21` I##^$ALCʚ"/>v;*S:ZQ000@,CTe kBQˡj/[ $. C.>Q\ \z ?uʥ2v$lyiLLAfrJnV(;-yt[=_˟ Ph2ӟK6z?_ցSM:u '@7q5n`zW d(WjwR:6T*  @kC:\Mųa׾ۗܮ $x8毂e8bɁlف3o ;nwԷkU8aϴN?*>u\lCz!y%-B&`t !@32 5LAEJϹP4-J=ݕ@ ݸ"8s0r}P,3Skmlw¹Kg aT!`bJCWc{؆萜(h&OM *.ݑ+fb3冡u̱m'N2 @dZ1R(Uz&E]o-~[t+^LfKta)hȢqSC:aBl!pJY; 3 VLsrє'p={(J_hڽu3[59uq1v@mFaC/gwt" )A5k ^QDIϣ>Fh+ ($yq^zHw%6:K5?s&'U9@?2bZw*0K#޹Jۗ$&X 3=%mco?^a죽0i c$A^P% 6l%Td+ݵ@XK&@Fb U7Fm?9.&R㨿Ֆ9]]Y6W$ߩC5r{*>qx <s m#lD^eD]mOP6!&U JIq.}|zR|εOhK/U\mvv-;`HL n? ?wo}e9߱;fʡVVrH9rQBOrD9\XIo^7Q 836_چ} ط[&13>&Kܜ Gkr@ @9) f(Is+eUmlڻY.7?O7N{rQ/Mg8^S3JQ-mxz$0GT,Lcن*d/&x0[M}rU&tB/) r^9<ࢡ91!کs[3oBsn_cqI{3Bs ;[ {yVLLy~D/ A&o" UzR@tR%%DžYv2lܺicA\>H^+}txG^*ڭRZp@#6l]+ٟXU\3_G-5? ĩU"V@  J1J4玽Ö`MKEr0[3c7Ù+0Փ# }VWgjmue]bc?}g{@xĵadEXIzBA ~#zeJ=~ۊ@ qB?VP x N4~/B1k1o ZW?Hevcw_xS>,qAuEOp诔wg6-ay߽^3^;Aj€_/[dڪJiZag/5JO`T oΞb.w 'OO[q.a"biSoM^Z]};pѩ"-wyV`nBOҝvpew^>T=MfWn:$}@X9DM@ ~Lhjt`88A8pk6z@WY퓽>ޓ?C J7X>N! y;\mWۂy 65v\j!ol.u`֥MZVJ[E1+j[@XLM@ Wrf`^OXBfj v6N]<:&YRf :no.'loc0^S-5 x ܾrWM%nW \sQb,rto{ !-HN?B"nrmLoݝTgOiVYN[ELXE_/K$Ԍ s;}~@hzLPK<&1b1A*p`~vl} 6-BčeC~K=/p 7Ɩ6nwX Qh+ڮ՞K-z]$6=dY0&"bm$C- ypzt(Yo#[>~f|ő7s'ި1$&ĹO0%5HNh#g̝>z \ YSd4΃X`].}o2pO^l';_ONڹZt̠jkvźO$ nL4cOxZ,6 Cf'Z=ٷڴ1" r*/fby,HM !u4 o {y.SZ6]u> qw%Ei@6[0Uw /U]F ge~_c*k@!@d"- eUۂWpX@kxk+3-egCߞˊB+1mb..y !4x} yE ]b>Wf;g~ ̍w€^/<`plzm*'':u/`#1+  n1Anľ1Խ/s4Vh3]@Ѐ<]c REvX|$ !4r&߶$2PR)mf$Dȧ!_5̰ 1@ﰉC堉)?V ]fWh"Lk[_xߵ8֚<WsssFfh;φS01: /UTW 3 `tv)* 8Ob_}GbɁsc@κ.Vd6N6_Jgy ob6 ?g-q q'^n\|SexՓəw$l Pğyo|De65֩ B<&:mmmm xh+Nm>CfKR%!$&heݐ&# (wAwv$Et ? r %H弿JSlغU~_؅,2crN<>v .@T0"tRLj_m Ǐ)qVjFq(4{.wzfBcK`-l.& Q࠹*+qƵ] w0.pŖװT!?*@Q_sطx7mkܘw ljB5C<ז_74 @"m$"Vx>9U}Q f+~ َAa¢ 0'8'WCPI:GzC/9r9f2bfNAK/7 'H[eUAVs3wxH@^jj0 ͔/hZ/ߣ 7b9CvP3xxx x-kk6ȶ\?YT>Fh+m :{B@nCF]_vcTm{ݯx]8lv保A @  U;.6:d<Nfc|7uޭ3ϣ8 3C_Kj5Jr` ?q!OŅӽ&76@-w,ëfϨ2~%tؠ[pթm>l9ߦ{P/_EhMz%pָ3Ea@+WskDA P.*^Dl vy6IOlyjm{M:)8T-&m:KJZ_g a`-4 k(xl$Qf3A Q&lǥȿoO*$,B @ 38rՅJdM "k_ gk'>%^11N̜tzeپp[^3/3*Nڑ"( ѽ̫~0i:ݔo2,l2yg+ qAX eG11_K~!7}x&WZ.r.zޝ?1?Ƕ`kPi׮=(:hڌ/4!m ytKus듍 NYm mL # ^j$HJ"v,ͮӕ6eJ"@bȿů9+`m O~_ak\Tv o?bݛ~BA63I-1ͽYvd.8ۍeA\%4!- =&p:R5qVH^ ݲI" t thx}7tLCcf,H qjz}6k-7q[&`RRܓd@Y~)c;qfvwVxԬ]%?0T(-~ϳ{mOK}*$b47,t}pF C .\@!d806 r_K (k@UجS{no4$anĚIޘ).٫+x >>*Xow. 0i 77 һ2yp>t4Z=;n LDv]+!@=.s$8$`ze+r$lTux551 kź/0lMv d !, Wuǘ'MX.fl:ʰ|Ð3B6B>:4vuש ݊KaYG@0fL s+9tQx2 {$gΞ7_z.8 ei0KZs} rf#dtH%Ad_83_cZc ƽktsH&tٿ- p0#?Py/_S]6|gz㺴m* Ѓ"v5VzZ6(׼Y6X' ]~lzc ~bbFS0a8.hCsZ"@?A@Cן߽sdYBO*&HcVjmݏ? 7n}%Ⱦlu0 Ҵzmx9X9\$v\`?ÌoߴUXz'~K;:֤*u+5&H =Jd5gd9`8DA6ZCL{eO0ōeA2eb޿EF܆-˿y_jlŮWkw7ftZI 1*b+j pJ(W2@qR6Cn,Y p?]: S3&~8u/t\1N U/X ۭݵY'h B4$uA W2įy҈_,BH+!@^o{ z3b-hz m/Zmѯ[?};_]?x~eM(H6&C'+6E [v kؗJ/9 HpvVU{7~P5Iߝf&{-qq3C wN+o x` m8zPUAަ=@{r=:mMf`ՓI,Om3}CMm%rW6&`=/G@)x]%ezNI_~H*2d~!9d#An]¬gh֠N\2]W\_Du$lۖmӷz5?JeEs{<,LEowj!aQaR8w$M=4C78{30 #cs7_bfx/Etۗ.6'^5Lmc5`M CKmyj3׫02/e܅R Iˢeq2.Μi;)>9c @qcU!OBhc&[Ƅ52X2߸8\]>_HG@@XJm>$>Nm/&`a[BkWj5QF hMǐr#/2{w>&@'^( =+ yzYId[m•lL;mBBGVojD66 +h#) 䞚€_ [e{w&3rr,p4w^0M`XD H 2r5Ό6Q7RsEXI.Cb />9BM"@XyJ!i\Bϝo'[D[۬0nxwt1-pEFjX8 a|@薐KڐT%$ hE/g[Eb|޿XUqpA=|#W9`ov[Ųuu{BBеʩ?7(HT]_1Y]Zcf\R$C@ljpEnW6f ZLJ G7U  ,Oͪ˲O~^,AD"@{B0e/ a%2@  `t30 bL\\<7 g_HLLDLq`r͠Ffڀ5y# nYf yո 4 8<Ǿ$_jG8CB2ftowhd8v޵\ 6IܝQ⢭Am8a<.=ogs# xpaψǽMU4w16c=ķ :')Q\C/t2jǦa!'cn#yc_tf;04`J7= +q8q` !)x0buBsV1:,|`o<% ɝ [{-0rNDL$`@aRֱ+TrBVj5ȕ+ wCj'23l]{v]6!> HBn { ~!a`^ %{E" EL<J@3JGq(1pd `3(`bZIN}JL2̔RH±]?fepka 1>\7$h`Gtݱߟ (ǞWaP-1~R+ӻfG5,K(6(8Upy ?ϭdܔ!5<[UY0pnB~q;Žm3\ؽVsv<<'~H ^ck= -V= 0sZo鰺C= ր;{,TZi$\$ln7tjwE=6FS⿦\GǵuF0GlPd==l b 5C~Xz`_\n8"zĀ6A, acik7vٽ6c6ޒ]oQE<f?cŁ6 EIcLG|=G^xoLݥFy j]aQ)P;#.`G, pw<\Ţ7>IuDqVUS"0*?x{_؉?׸bbvGޣ4̆%)$rɿzJO%T4R` YLG^cNG%QR@a@vb]IH)8PA [#>sң3Dģ-}EV'f_~9vH8Z8\Bѡ!4$?4 QjCڠ1, m۝Z|x<CڀXλwuv< -g$~P!o)[źbkH{-![ȇS\$SRm֍KqmÄ p;o_8psZ=Y}4e&N02QuO~֚gQlV̀j!r9U OBvՃ{[$wlηFߣ*7 D\,(xrfkI20Uvc v[Ht]|cq >N5 ϜE1x@ ˑN`a4CߓɦEC4k2ONݣl[mc$;;?79̿ p0q=1[R56H% [(uewA3ɸ +h%| t&%ؗ"tsTX'>b~uD 1Ax`] p F x'#+# 1+уrа CJJo$|\ Έ{=W,8@rnqE9YX! ?3N7MTf AX.ފg"읂X *86Otq*QJ&uytBs͗X zC{e7"xc{/\~É̞|$geqsG#5(yy`7nᑸ* wYU#~ؠa\ S^YCejn". ?Q3#M%cҿIr:0FϹrycD~P ㆱES~]wp**`XPa^-s @.JKemXz';ܽ;Y5c,O ¯ڐN\$Us"i_#~{Cu$7Nda@-._˃)LOvH6탓DG_9x>Pf2/k6?'^nu1J}|bV(U3%l8~ηb:ǜL9;%Rq+fN[XK ï8к ^58^>LFCev61&by}Â{7\mOQ,qL| Okaخhz#nWn )gmv{ gfPtl2:F~$<0)c[%XjC|W:8*1@ ׼RoJAk7~ш]qDG2`q@7DTXϛŎ^tcW@{p8 .L۰m"zH6`0}T_<97Yş RٙQCDX b[DBkD aV2fQ/16lJ|~ri,>i& gΉ`mE ֯_wP[~>"^y:)x҉JQzz^{NP)Ųp+m36~AozBܩ)o\]#(TJ^Gh Iȕ++m I"t@ `TsZO Tx~[bHLt1xp G &W$턀nG{V`' .Ŀ.CbDqǕl'EmAd5Ʊ_˕="b q#s9Rx' :4Ͳ6J^ 梹b]/ sm9/op$aL#s4KKO LL=Np٘@ Ct4Ryp8%~DfysfZ#`aV`TE"c$ҝlImĀŞf +p x[اا$< gӼ#7IQ^QGCƆcٹ5I=GhХ{Tc'ě49ace1-–\i@`%:]X~gHsPYmY^k7lGSPq(LOr1oQ>+ F'^vMɉ l=.eVD]l^(nvhy7f=.V;3_Lq< ^mlc_x{|UOR/~dmdb^F<M*8j*lۓp=ͫ9Tp1ѥj?-fMP=J-F S`n&$ Q0Ѥ+,gJ'Bhoq & <Wg-7 L&Җƙ~qW<gtqyżC ǰǤqZ w fT<] l%T.'Ex*8B*He<Խ8MD^EIzKX|uf}'8z⁷O\.VJP7wy9NPp: D=[>7LD9.5%YYmmT,Ā~Nxz&2҈C#-@ V ?1>In5 aўҫ |C0@;H&6Ge]g,y"sՒ \]Ab/*rDIaTॲs3*/[:˦?)^NBn5ݹCA)&'**&}M_8/_ w f%%BxEGqL}< T>Ugr#U_z<9.&Ry{ZDiqON ܷ^cK{4Ј(]sy"+ ٳʌפAm$m'P} 0`'l>2f+A]]'fO%aY<^j%@ (#H_Jz>S'CNV(՞`|,I'z@Qa/Od^l2- ZJ̘q}r. Z?>H$rZ}V,OrB!Ѧ"gR#zW+I;Ys6ty=exu{F *key*opxߵ Ԭ?ӚŲA$?v߳+`P8HCl&=zkM␙w̜x+{Ӡ:ZHVTm0=%c I/lK U"|"j%{D jqM%,V8$Z Ijzd{3$Lb{nt&h!]Gq~(wsc1pwcapvN/|(`R"^* N.xy9uWQ(h ;hc#={X,qgm[pXtRYOлuXvX4¸ l_J$#b@ZVstͧ9;v\ [Ѝc$ɬ-/1{nZ )W`z`Dqz+dX$+5b7lU?$-8#f|͏8vNg3V | -h +@aHϫ$ ՌK\.InD3v \n#* o%J0⽽9ur6d?^Z; l7: a\:&}bg@3DIg@aWzŞ> \ra.Դ4Mפ1??}kc&w9/]-O態葠wwL +bZ){TT2J#1j(T`oynŒL$[ܛBo?Bq ?l#(zA5T;U R.zQ|F &)Vl@kߵ6P67Z7:0sx'=+Vt>g0DLOBDDwGӒ(`l) @h$1Yzz6X?r04$,"C@.H5U bo]}fL} ij "Ln ((-O>ax%ꋮf4]mXߧP۫mirF ɐ1Tz+VVă#TCR,v9?(zHQ9A:(7콟N\2O@ǩ %̡P-dg]!9@A8L_Iv\b(yJCÁ}Q~N9=>ݸssY)|>w^dۡ"k`\.ȳ2W= (9Sm\, PWsY5 j˔νP \xX6dך8n2)gR@ yGR PksVq#3 +9WN*+Ca?]H9X>؁`X_9S]Ewot)0īcj`pWa(g哑iビ06p}#ac1"ODv3ԐP,p1x[&N1Bzn+nV_b3 Tµܧr2Yh tKc{:^{` <_Rp0,v0U8us[op _h_#yK&B b ]N3) 0Nt mm JJ>R JKB@&q5KCCC2;@[3^$ᐭjȃ@>sנZ.B:VMKY{=Ș*^wRշ\ 񓡵.kߋm|r_*C޿ kwBDKqUvȱ m22 ^,gx=ۑ9?Lt"tb륀}Q0ȾNyaH>2":`8abpi=&=@:7f.5dD # {_.5fA 4H5gCڀ0}d':cA!# ^ _#BOY 0~Uϼ/ S?C̠H,€J{L;Ez%D)֘^ޅ>L6Cx!C:qEE|pJ7gp|sd(thaa$۰þuH'a@DnH`I~_kn Lfc lO v%,7bUr W2fSHRm6L}ma_sgMRYHZ1(tqa Fr &7lvgN Μ$ x`Ŏ[+ /emk&G) W 't gab!OOĆ-╲T"V|.{xicUA%$&?+njU7F.xm+ oj ا!>reY$G A4um)U(0J^|fj{PV`m; F\ >p`|w\g ̞^DSL&7 Яw1B9@ztSz6e2.`R gF d*`, 9@T1/G طZ Ga%3Oa|I# P[~8ښ@ +ছvBU>O:v9d@^xދՋz;P޸[/3ݻ[pY PʺP!??MbǚM]Dg~C-8T1_ge _7YK H,3(j<] S=;`_v۶&Y&{ytKu35/gie?C Y{ow؂lCUFXJlNV`X́j';>r<{íNL$e $LŒ'hT` gE{O/#+!(lcTw/U ۚZ@/Rq]8ycNrb ~֯SHX?0@<^7"ɿ%HߧnЛ`r3.o!T\UTbAنB{?!"k: `KbrFbme0=mZ$ 6,yì&ӪR:@#jE1@[%a"@:JՆ x cUN +Zgn7Uގ{C,ďiw*3:V}6mXT]6AY<Ԩ"p6={X;>aJ6)EF0 I}'3Q[åCzd-"ۚ@ T,1N`y@¢1a4@OPW[r,vXL)$8Z2Z$ڠzQ7+Is6{㰯>>t[}*URF3C`&݋D $ >EN|Z/OMt!;?})]S:{%g ?fF`sEJ 8L hcvh}ya(K~B@җb ahpyeQ R<p`xG0K6ֈ'aQ8qP$AYI4d^ 6ef|;QB6n`P7r/Ijl׷GJ,wF=ƶD~S @@ 2oFNUj^zXkhس*]_0~ @ѵD>Kjtld@¶}$%!(ҀzNQu7 $ ,cJ2r@ c\eKW:b]sD;JOgW?].JK@33bF&W0AK2۶Q> O@ܴ/筨Pm8nmK J<#:>`p \EAjIgE>kWeWKZYH^km~+?ӲҮ$ (Hq œ}wWיwluduWu7]WVVfDdDKԿJ<+6 e@zyVODqpsN^dlklAcÿs$jwn¹@'It՜n1JlvmW0 pi4"tz}+%$$$$`X0;pfFnn% Gȴc>kЄM}BGltc-z5طW竉W's΁8✈s#DW&d2o:$Š6Q.1Q;!X^b{m݉XTl3ZB7$+㭅`1Q뎳@G'ܞÕO# pS I/[`w1u' ^M8\87J$>|!VR ʇB f'vIy[w[ckْR kh-Gka9P)h 0 U=%]a<%׎2Zw{8vg@sW7G: ktƢII(Bqܦ@Qo7e.ޣ6}lI aF%y7CQࡌl1#ƻ}#˺~6r pk`.]gu/XA{01ӝ[Dz$۬6.t '$sQ'9psxsP bZ'2.7@߅?eoۼbw P|lI ,KJHHHHHHHHHHHHHHz yUxmwT \J4T͚l (ymRAn;R<=3ۇ(C"՝gU㟸=ĶÝǜ&0_rVɓwU݆^ܨA=ѕ;Dg6?0kŮ8 w|.l;bٜ2XB̩é?h*L qH;¶۬ͳ)JU5 =8VaǹyHHH\/‘%XG@ gX5n i~ǀ܂.^Kqj6]EG4=EE.<Hӎ)>_s`ZBIFI[j&oRw[τtM<,v8ZeS; "3xJZ1x2 fv9 *l6˟-Md٩hA4E8`t }I2}}1_,/ۼg)grtI< C/#CBBBB~y\!U fUk}mB/ḽ2wx_@@ T>BZāDO;A!V೶YCm}\?ǾTa-$&W I'Ū箽5! w4 7Mo8&q};hsk?h$j_ש=L(u ߪWZ:ePJz9h?+Wʀ"4!/l9ovW<<#9A.n5W ?@qq]e1%>ӖHa8məπ}\'ޏ@]UX[Z9es~ؓ~ DH+iEJlo2w-hT`K"f$/ ~G7;Fʀ rr~$>| v %]V{ basHc6HUU8'7,%7 e&(y矋Π^odQzг5g_w!4Ѩ]DE67h_CwsM%J/>עw-'!!!!NCtwҮOdUGAJP૿J}ݛyU~BߑUNC@*3ph{y;cU@f~ڪbMenY+PRBߣ!D?O@U3[ @&{B}*)?:H6Ց@o7ӿ&i?}ܨrR18+5?NO/es?-%!!!ѵ[5?ΈEۏTERN$z{)5^+^s2 3տŕ#-a_7Įa_'!Wڷ (˸%}qFFF'"gFʕϳZt#rsR $7ľ>nQ[Q v3^LKgt|A% mO~z#n5Dbہ}yI@JDKXy>;bH{CX! R5',*-RFm~ylj ;L \KbL5׆\s=KF}J\rHZ6A"$pNJœbz ˎќ ',U1:z-nÇT}T1aȾ#|[ݵcO1/V` R 'ؽ/>QAzx=W.].BڒIu%$$Y+k &>;u*Ӿ ]mgyW'p abgAV*'J;M኶I5ۆ >&80@~Q;>FOCۼ呤 ͸;1FD|xɳ.&GR\0P)Z@@E/p%YQDL'(T?[[[B}t[龞 h*' kK(5 ھ1s`ۼO$hӠ;wy.2%{ ~o{v3Qb4[ '?f~vt+ d 7MMޢkpNS?0riFl|L?#%&yHU˰\ő; 샽X.gUw}8: p#M$;YoBaفc7\'1Pێ&Ĵs}ʕ=l ^`C#I]=8^S@L;\0 b㓈2H<)#$:Nblfnx9k/̰&MjUx2![j1SPF^=H(@f{TX^bg}>w|+*7\ F}de 4Π֦cm%@ŦppZN *!!hingSb: 5Zm5A b'~]XcJ"`B3`X)wvɛTP/b=7LMޥ5I7zB^3>|\R󒉴b\ hYʳ~eX7aIq?{9H8v.wh{l\WNa-},<]mW4|_G+ ~X%$$[*%O/\?pd w 1yX}Prnڐm="70+";;ڝ?B+P)·eh):Iz"m0wګ*ޑՄD d(zR8&ǶCD$~`kjZUj̓$oN=F0,W(OϊſG7iC0totn;u ɑJ@/buv`C_L9F[̛1?0zX\K@@!ğԠ?ٳE gT.4ZgGQ߰?%Fx=m{~Jx3`lg1Qe*fnmHPEM5_$zi~;a`)FlEmc| hyC"2~+ R\b;lv+iKZ,w X1 ^^E`'Kqw|ȥ PV Q*~zf4Cgs$>4"\ mJ KX.,\&Bnh ˲J1l[WU9dZ_"Tb7(ڵw!̞̩m\T 7 K0>1lP\.r_\ZϮ:jmU(,MCfhCC+2T5JKoA q*=/P%VЁ'!WOSP*@ R2'`*M3GW!,l x `hH\z7JєuM)"uO!R4jECQ={| 0rmIYP90<3ES ^x \%DӲ0gwnvcE?1~RV$\ [6}<,9( Wwph"+=$u5~;տj:/b?"";6ʜ<ӣMJdEߴ?L6yyY`D(T^|a2Au]7%߇^јcoaWHg$qb3*˕.7&Tµ\)8uhkUTP+?4XϽ Jː2 WHc#E}/&JٽC[bULH3_]7྇3h}]O7Ӿxy~&+P]<91}{bzY9dب*@؊;*e8;={DkE4;doҹ,MiSjF*nvem`5&,T݊gg @3׽gKyO] oi '~f™LsR2򿴰\6dJ2zĄݹqEָ5hW@*o$o'D+f-kv!ãE&+^Wc{IJq|U'Vv7nh}x\~az{]0rEHooo^-6Ьip㍛C15l1yz(J [y8?OАC91K,~C .Rs #`&`^j  >٭Xr=iFu[֓T^1X`%蓱Dhy^֎)<::+ :HίD?]FW[C [&{ᢱh{+:^X2Rl24y=Rmi FrN?іh e7>h,P+2B]Ł>x ,Jq"*փҤge{3F fpwsMC@ /ѹ+:{^ |xlHV 1I2Q?5򑐆?aIyZX6{*^P`DJ|!\Ml̅D]}+01iJѨ-Xľ؝s ;[5p+nM9\[JlnJ[c/ISE$unAfh=xÉ5|W䍈cu&-]⒅!0[LgdF`t P-̲0{c|'ul# ; ڋ߄,-0zNPa_Utgf&Bovw?o-KI}pk -xbUXQjObzf UNK%V\c\ Pθ)6I\4ks犼$ BoӸn** Tl}qz,?]6`-~a@\.'Hjuӄ~07uA%qR@Bxva_l7ٽ"e8z-u=$«AdR:L] r izؠ{axdνv"{Ӄ|6>MS5/x^ 1p]\ PEPadtdUI݀ͭ,?n%9$V(BI-埿$;o3~`Hک77Qȏy0v,䁶 FJ7o,P&ei<ѭVtE fDPٛ1M4P>ewI.2*,^>=[eĈ+lͩD\`<1MȕW.a/kBഴ:#am@ L\w]C- Pq2Tfm]]Ol _5_};fˠg&7ϲrCB5` kK!*N5ɕkc9ַR *xH3S9!Y17@fNÇ/a4g"1)`c4o0rUTːw$. Јř>{UpP+!W2L_cA辱U1S~h˛T(yPXgmQj=}d1,^baR0:+{%Zk^Һ>wAՓ1R4ot;H:gM{G9:E~VYuAf:EoZGjnhs @on=]4+FY?a^!?,k-F#*؂fce\o%zשg? ~#AE rU$\5`C_BY?@P2](66k)zz_A{ \+;R{dsϕk#rl?}-QycT?AhF)$k،MȓPm3lʂ~7ȐKp9frP`z G(,Lם8cϑ䇇၇E8{U˰/jED%m(pykhhWOܮBiqRbU Гݟ\<{2,tj]H=$t[qvf{ 5do )*\("JhGgs8#F|/<0wA7Tp& CUaC M"rKl  p=)nQyQSd][Gq7_pHF`x@M'd=5t"2rIY ~fFnxP(^`ry+Jx$HLR/俰UlUj/a~n3lkl-S/>:6ܗnOWӏh#RC@-*Fd T#߈Ua(;%BuQůL0I:tdh&hC{OS!g!=s.; 3u &2}o|#v(9-0rXvPf3?!lPW/ڕ+8v( ǿɖ{ep0<4|a*1v瀋իim`甲,V$$ZŦ6X?OL@-wmE`78'~4B3 v[\n}B`-ASQiB47(['gl ЊvI?g|ٶϓoG{`ו혚08cV|൧wX). S1Vy- -Ɖ lCi-O B[a'x> Uf֟R; }vgen8vs%L2^P \%\_f *Lg:\`bOay*XW&eӌHH <{+q aeIQXX`|r \jl׶hl\IoA㘵eKS2\8p  0t! +,&}ll8y_3W~|j*ߏ[x6(!!nΝc c2&N"!Q-I ^ߧ7DgEGxp-y&֗=eUQUgZ=̬ ׆ā1I6&֊SF(^o]i"o{!plVUxu HLb? CC' s2$xmS;s㰮aWx|wZU@7li##3IP phNB ~Fնkƪ:&cp c0t.N}sB F$&lEWuZ1JJAkmLë244ܕEѺ ,6p033 yw6?cic06Uj ^C>8v>N+`n"&/\d #Ш$Heu!qNLfVlj]*%(<1f\LTq@H!D~-(߾(`dHHHĪ%fwaϲIv5'Tojqbp_~6x0k5}FZ `@L8X)ߥ "Ÿ[~Һ Z5U; a֎5U YMo8@~k]xmS/,9Ԃj"Ɨj0|-X.$WWuCq7,2Rs6n[i;%X񰇕H}gaUU倡aa5&RLk+,.d&g]g׳t㽻RcD;om$H#nѰJ& ˽>?ec:׵@*h9b]V{N);Y_"3EWcWۘ|=魯 ^O]NZcω?-rf$jܒjoΐ.%^TTm'%M$8T@`3W/yY<8x0O8a꠱5+<׀+╠1aι+NyQ0^qLM 0+W`a~r)MأibpBBB.]z#!7@,/GkE˓HHlcӾDro.a>LA% XB0H@"eA}'ꜘMvÂJhÅހqyߊT&@n[[pZ2+# cED@?$J)#'2]/\ ϯ* = *wJwXⳁH9{~*jiqPapvA~ryص3 ^s ]<@g?[g^&evku;쫍>.HbE)PZE nхEr#R -y*E@Ajqfghz< }ʎk85cri,Ca~GҠ+ׁI2i0Y5K[:Jue( k'zex]Ħp¥ cՄ3MDJU^so1H|3T +'tLL-rcPF$b2_ ^>6vͭKژ ݏ ro$&=H#$Ml2+^dn:v w77*snz(و|sTS4g`/Da,뤑Tr&]~8U8B`#;*-\{6p}M[ƞhF$5SwU7׭z+ZJp'1B0ڒ{e.WG \3y0J90a,t}k-| 33N߄u7$\H o Rq%>  p8M0Izb V\^<vs  LľZo_f/ߟ1S9A֦V~+n:Ht'R&Zo $~is$Uqz#iDTBh %*KɎ.D4`_. {a  */ ֯}" CDڕC) J)MSׁ vvWR}1?|LJŅ'W"Xw2!9`P,#B Ni֒~8otWGxrn H= MP,.aYkWatl rϛq9ۡ,(ѝ@QÛmS+&hc%@&*ȺBVȿf#zzH\N&輻ܸ>! 6)%%Ewwz tO΂ ,c(v}b՞m{y<gO61cB@A6-ošPayz'$49&de x˥aS%黾)q %&F\Zl]HA1aeJ~qw0ΆMsěBĀkHa5*_-y( XN AT}^~ -*Kczߑ]KA]i?I]SsMnu8vߞO[`چc reU=&6ow_ll:Z!D ZRWby>$ʐnHl{Oҿ^kFJ!V;t6۰MdbwiW1f?w+piX2ncPΦYcpAό%䖄lxr@=N6a~v ]W«//Mɛ/ѝ_CܶǜCz65fdD9%_lx d?nXP#bI>-V (eEP䆌:ooꍥSw¥UdQ@)wC'#%(*rdŊ#o?'F'U8z#ֆ^*=-V`7Q&6Fֵ6ca_qlDB [Ij@:5JW>fzD'?}Zr?&nAH^um5\yk~(V0ar$ R$30ZFb=z~ S* GC7o7=gnT` Pa =kOQ?&.`e7Z{fpeƓ"^}RP#RMPC|T/*#ğDOzjBɆCsE@k@+ؓ{!e#%i3_r$oyLB޹~^,n[ASϸi;Ҁkߎ]?{]FJ[52 ]mTT]$sD ׀5Va[z]y QO .{o,@^solK#c R`{.U5gkb-;' ohdfW{!jx0Tj^4b x \X!ݓm+=FQD"9ĪWKYq4Vy,#~o f,7F6~ Yqq>H^it]/'!*$0uUx@hvU '؞oCJnst+G@LP좌Ne,Y[M^$<Τ,>CjʳA%*㆕ߩ~(_sLxQT^a| Yblcf˳㝊s'"A$ZOd?el&돆G%vP ~R@Hԟ^ok,4z$ȿG3oHN/RN~m04$^L(Dc.O_p%YVV)[+rW|WS(ޑHD›- aj*[t 3tYnjd}G/XZ-_hhJ-Yjl݊`uf>0)F\kLoN>h_%Ř$;4*5e'3=`^Cj0?cnmfd>kݍ$TaPYvn?FKap-lݜķ+ l;o[!Y_`ȑ)яnDo:GL?.G<V P-L3_ezU-]VH:ÊE7Lfl|qc?]A'sH|umhobdͫHY? >?g}1|?o0'my*5(;'RNy`a!,^ 8w,H_d|o6Ef$Q)C 6~B x=Tԭ- l6Y_uaqO_(2V* enühUu`]$>^$ӣL&9"%DtC_n^Ͽ',-X2c̸  ODvB^Li6[S㡞OߕB•I[I֎OQF$ҿO1ع|r6^ÌCHs;*@l[H =kBK88K30PmpGJѪSzJRY$*![_(X,GJg*Cly-će;0D$+34ZfJm!,hѷ u2q>co\;?v +8w_B|!v'Vmw_׼0?H2gsȟM76؈!.oPBS4-[|A  ix@ RE\j0u}N^Iͽg$m1%Vvk;f({/,ny̝2ᕥb#dĺ̕@[P,Pv(5 m!^+Gwف[ZpxQW0!1B$!Yk< TZ.n6wm{E|V5v{]S!B"xyS|wy rJs!w7s0222}%gL;7/wꞺ} ū~d_Bbx"֝+S "1&OLx-M'*7$vtJ&Xu\Ex;\{DĦL1CB(vQFXҳ1GM@N"[c[[ "7ʹeȜL q[Sթe|UU.Z;#!'[) )"ݐNP*£jApχ#Z.cp@0 0Mke2e/! GLx`YAԬZ@:_O8Qx!,р{2T ޘU&υf*!^6Vϴ!<0ҙf@]Sp~$VE:to]fAٞw !v}cbYQ2ѢXؤS7IVݓmр'ѐF#؎> Hdc-֍sE.@B] Hy+%@RU%@ 3a~:)&#oѽ`6dvkA ,/-B{ ۲JAkטƖFՓm+^eȪKF?_KE8~T{M4`\㚗-\b3e Px"3NY^Ɋ("c򧟠k)SԱ$ɱû HlyꭣCyL8%Jz9Qv\{f0Cu?u#F"wZ@h%@WebL:tRq(@7*ѕ?e<[IoDR˥}P,KߨpS:vGcdqǐqsS{AȈ{fU8pzp/זg9GcP~"pdcv"Tۮj(ztLlVs|#\}mh ?8>sQ+6 /( VD $ٱEJo7quߨDf4 <_g`ھ ;Nۊv]Xq#TRFgqK#QRkKɵ5|}?z? mm Ttl`n} BxX/*?ɤb/bJϺzɿ[+;ƞDD<قvc Ttl! 7LS&oH6E=wb ' 證BTExʽ*>#JŻH뿄B-?賵7Gu_ʊ@!D(q4`Zՠ˸ +F1⧮vR8N@u도| ݻک7#sXo& 88rɎG HqmζZ<,I@eQ?F+(_6R:5إr ]{Z和7HD 0aVSy) W\qD콻8~H/!жǐf|~CezDy-8O$u_'k sHC^= Kn;Q4FoN{vT8xKr+TvA)י kP Ԋ TK2B/!1 ?m5AqEpExͯvW`p"\[B/`Xbү0B+U9TwY-yjϲG4,+.v\Tgi;v1KןN$-#V]yD& Ț:Z7ŧ]Gi͕½寕JşDݡIĠ\g@^^ KHH ט< P&V&JSMW"o[gw@SMNM$q;O9YL *]I[Q(σ@=@MMFAeԸs:e@~EPJ=ԫo൬}$ސŜ^ÄmKp<Xv6p(UR51>#!^f ~OG" iq'zl~K,ovu kA3bd? a8 72azG=f^#O4@ϣzٮ6+OmZƀǬ\e<[7?~Dq.`sT "ӅahC o7')G6| l"{4Gw6zsSC٣\f[nY`㾋%v V>m򞄄@06~'//w|/zmeh*Uޞ2R("a6Q*pW!z2rH0GŠb}VW {x?r f;x_V#ZHW{TXQS XhP(]SLvr}N%ڰZL"_wFT 25 =6 !;Mb"d/1!i$R"1w]n YuՈn{v[ {U{MX^7Srtգ+?s{a2}{߱E~(aKOd Fɯ׮w՜wW,.gsϙ0?LA5F}jTL:wQ9,RP+췞gu#|>&#-y}n9"!!'&i>wF6TGaʃK}Q  XGyf 񌼫x-_eƇ`6ne\EbxkP(y~[|6#{Ūӊ>ƶGثw M*$_)g6(Y%@on;xP;xERYF2ingxxCc^TZpu傢2dhycc=SE=پ폀d2j6fB`y = M6D7DڸUA͈Vʁ~:W ~A"x53z#ڀZ - Cnp =~Vȝ쿑@v{ ${=)A9xl'_~Ɩ;!3)IHHHHHH?}FVI/K@7Wg0=\J(fo?3EٰpJÃ\x˭]^.!!!!!v_$$$$RAS]diLs̷A".EXu1N)x[Jq ר*A"`ã)WD@ψV<j2t_BBBBB*d[m[R_' [,#NE$;8)&GRLY &J"-Xс;)`XpIaV%$$\!ч wtj[Dyn%"+a+K]Qp_`YBBBBB\6RsD_**;eߎx8?NI[cԽ`uBW+`fʁ)!!!!!l)KHHȹAvq,ۢR0M=;8qYGA)!!!!fD?ۍʃ~&)KHH9A"@> h~)@c# ^ CJvb(GD_Ͳ7]QY!~ 9H ?.{Q / }˸m/4FTD׍G#،ogM.uW@4vt pI&[Hŋ$;d*Jl+vF)3;8J2<838E4־HQ W" kwЍj˜{ RUEUWݺUxO?YXi+s?LiN0P=zod\d xS*@=g 4@?aD~&]bVmM\L;BȲ^=g<Ȇ#BHrޜv=;󧋞7a#nzMOyTC$A7Li~i_L!B!d 1iB{IVm/oDqFiUD7z-C%=!s&B!#K\bL@0.&~ܖ̐K܋ !B!\c> +;i^KEe'Bo7n˺:ZI(0#/th_{Wª.lM!B!d~ `h?0:` -w3b֭)jh6ء 'B] _ ypd:6q>d^,tܫ !B!kLU>u&Frg7"h456m*E$[( 2A[ Z?kU.خV=Ď0_G}:ta@mv`JJ@Hf&!05 ?frx B!B0Z{nh,߲MOܶ=VG h@d}*&zG"~+bZn `@B!BYb|I,ȷL~$u?Lx<ek#@kcX~D6t-Ճ.@!B!Q a!7ʡF:Q,Mjo5 GX1@0@8}S/~hچ,Y`DB!B +&Y wơ W;4@G:BCvEʨ b2\HWWd!B!#R_&_p3M @.@;%u]J#fIm@Gw⹊0uD!B!48nVWri< 0iRaE2k}a~Jї=2BZPmٖ !B!(Lf &bE"Y b3rNL@PIkahxXz>>Crs4A,Te iB!BBB؟V* 厅=˦I(UW8U6$,{+j,?-F]ϧ>&- 'Z%#0FČ g U !B! o)-6_yv$joۑPĴEu822(a*$5 )"w}"l!w^/kԴ2֢51=B(*+}!Yhae9 (ը#74 iB!Bj8lE{ hVM~0p*ZcrE#ٳS UsSL=h Io_6&pZmme!0:0k0{k}F*#!,;%@?m uCdf.JpƘnB!BH /_}R0^|Xݫ^_[.|+6"*.rA3FpLz(@.1O02zԶg≼aЩ:_{y_w7i PB=0FBlT XЉx8r N#ʮ3tFB!Bj>dyوw&; -_rWJ2u1q:%Bu/e۶sN,lY1UH#{8VI flqܪ;VG|as3J:`¨8 tte7B疔N;߯t^,o8_*_K 6 _ wSGjej0jG/i4QA}S "`!B! B0 N$ ҴZ p:L7JN*iEkQU.Gt9FDn]S;TO(Smtz;y2r@F_/~Z005J8*z  0VQҏGT iֵ$/uV>Buo6 @!BQ`Go)&<.DTďLp{ ,pbjL+ں@] fKhD绛RZ,*`GމXwI \P?C!xEjݶ$}%aI@ٰR_R[~91X~o{yI!oe3Ձa?2 B!RM}x zTPq?M?&@ݼEhם=tm֯jۛjTaQyQN 5|NM+5b3a4,\;e AFMx0TqPv#~} Wj3a[R@=8!B!d rU5_UaX)V#8ǟ fl T |gW& `z @h$uʡ~όRj3$v0 ֹ2TuNZ/s"I{6L|>蔋[ͼ]Ԥ[^~/'գ"B!%4X(Z&|\zdi.VV9X^nc'0x[!~ ## -`foruؿ*c2&*W^rXSj"?1ws{$G%Rw&>LW-gGeqmӮ?ڊL}lŽL B!,`E*hbv^_^-aAHOX `96evM”YPk3^!TVbeU!TֈtdXS0=,Xln_\uwBRcõIU_k #CB8@`Fp$>C)ܟ !B!Kd8Q/r?*LjjsBb_I ʨ7UxD f J?/yqu%~/"gCBe$(Nݽ9 8.Q&HԀ oL V`0$& !B!KbXr4AopdX8/oQ"#e;RfT4Wϫ 0`(;FG:?0E%:a'O1$?+rnRĠ+2Yt-B!E4ʵz+њE至SJ3̶v1唇[r]=_-k7Kޥ&QA`KҤ/&U 3 xB!B2~|ktY|[:6;=cP6#I϶$ߗ]!5dԁLUDRdQ_^s-T:?$"!B! r%S׎0׭aUK g_fTOrBA)'&kg{fcHe ztk Pd㓺8&B!ԣ03l~-#?Ta/26^VK13 E(E e@ֹ*@2:wԨM ~E$RΖ&nB!:" Y /_PW¿jxxXzC QG+L]Pn~-.FimjL]% @2(vANn1 !BHdQ,SO=-}RhF hOd}ߞNwtC<∵&Xp:2֨ߋaTjB!ԑ& iĂ\7yj" *i`a$3?'(A(aT @3M+]BW¼E,Ԓ)gB!a/Y _V&?%R?/Αnrc~JJt2-7w34젩a"S!>c@n\wC ᄖ ԣcѵ*#` G6D^J=ٖeɍT`6x!/Ŀ!BhHKo"7R:c" \WZW*jIeAخ>kϯ1{p)"cUAn|+J"$2#ԁa}ϧxM$7 p!_ݎC'Ֆe / B@~\?(?aį^SLRD].WMD:aa&`dɁ&GK;`W¦TVhÕfrmd Y1.&ae{jDoLmqfƶliF6n"Nu }2eSIB!4rvFC5F0_*ҿ&! ߙiplҝfxɅؘ4FmR9~9Q p"c&Mk?B! u^$\$ fh@~`k-.,Q#IemM瀵 x#g;y}䊥=P\IK&\ yi犗- B!B,3,->̿o.!Btwoq81< xK2ܥ2_ةKeq{‰ń[mX&@KS+ZFR JM s1os`YB!$d1ۈy?jrJ2Y%0rȪuL$eI}*ynbCB!da?*R.I½I=@s. lK@GBh#$2CP52Ek\HB!tP0 },Gv?~<ر`6#vr{,tw%ҺW\zdžht՟%n|"6>mh@B.fJ$?!zISdO<;\*y"Q#YKejUI鶬@ E.XjĄ'Rw9cBԎ!Pu>jwLfa҈ Yof '`)XBHFYTB=ɳ˃a x2oq[4u\x;:c*7BUP(,زPqu y$R0BH Fd6IFWE~h3@n# p+qہ ]|S;ޕyFٶ^qZ@ kqJ=휵ljCwgL i-E) !45J8B,h+@Wޢx՝s[jvNj& 7~yyV;i'bL3BB( v C=B͟¥vfhqT+淞mQxeْYX'iȦX@BH F0( 4ҿ 5M͛ljLm٥bT :?!̡7d!IPOKl(Ao9ճL}M}w)qٛ"r)˝ {~qr9& %%s}]bVeS !4g K%Q/vG'Ԓz| oKYT#-7-j=zI+=:u~pyBUlvHT8$\^ p 7gu d3 BG8_P,à4mV/خs,&s3~gyK}пB \o=!YH1GLKsB!nPK_9!dY _VX֜\ u{,7b/cH~Wt0Se}TLOKgć>Iuty~!xw}xBbfCP0DPjhJL*A@Hj@xc>pi/6pKY =+1>靳>@Ȳ2!/_3&# 3+x+ea.Jct?z`˸a)uAN@X^LZ r8|<|B2u/=˹L]ڀiO4$u Ls2/=(vlJ"" $\ '7ݢ[S~83;<$~N\sCR~ZOF7>_aCrHTħޭ`|IuAj@`:\&&}iޘ#>GlK–@R [ jN Ք޾1}W68 qf[\d\BJO 2 IyhNh.&"𗙤at+vqWYKgx_Fks%J92y!隓Ng DzMa/A  i_Փ&A'c]f2Ŋ(2j9'F$ 餽,mX:#kF޷F9ͤaۗ-cy?abh&g\ ۰=zn9wj[<׿&"GYH?@?N݉v* pX5G] G<W ;{"epʷqo\C=C,_>2}?4ҙNQiP@93JAaSv]F]Q [_dx'صE9f8 s!ՉOz"C J$cl B40"#]DtɃ"eλ˳J%L<ꀲDtr^b8NW --boG#!:0nr|7 'T1(+|/>Sw]j0 uꀤ%pzdm]`wK̀oE_w#>?ڻTҷZԓkֵ4BFFn&>ڲ6DD#ҠHzb4p @(iRgtV7%U/O;RB|ڴ7OD\ :ZNF],sv5yځm/T.זš )FHp?}fp(fHpݦqdŢNCg[P*pmc ϢSm8_/K>NJwhN8[L1,6 @(iRvbb({_?מ16v'Lh?+.fk!fV˴8Ѣ 9Po$-]"DOлrBzƐ2M/pbejkQܸ*z00ZbB oO`Zw ?>Gu\- 4/CՑDMS&!5f&o*c2ae{t酏B}u`R:VXǽӯ{g.<DHX&Y@I}XQAl4x>yrŐY12^b8RRN kZ[{t}WqAmc$6ƫ]ȶN}1n۹RN!NSxZרz6MBO hWB ~fVnt+[Q!>۱uqJC?x`sO{]1 7U٭!:-cXH ) bXL ;ɿb}l u"(!?1]r9!JGĨjº[~Խd?xv8S`nBȂb n(B_&jBPy;H ܃_}Nt9-tņ\5M=i-uZEWO~ &ˮ6lW&2ƞVx;_.po~쟨{ 5IK"a))S`GJ_lЩ6tΤlH6x ;nױ U9>Êqwc>&#wc"\ɂWxBT24V^md*[1)kr{y:$B_(k@ P?TlB!P dI LxA#W\"?ʲIf^۞.k+ t i^{o_jLLzuӃ+QK wKr7\WS1m|} &t$UQO2 =k?o;?:L},b_ Т["gݏ7O7vhBO @ED'L!N}uÃ8z`?Vv$kX˧ߗbC-j>յJbJh'_| ;6t4,.)(q:Q?v^UU0 u5ˏ߯׻4!f;ϛ@F_(:Fjd;U@Oa;ĻݫHgH0

jQv2lێ_o@{j^޵ ۯ}' !BOY/|tx,!̣Jy+;$^ wu<BoJu$nzJorK!O+{o<,Vԓ6u鉜3;UDu8s[3((q,yՂ;We XĩpWq8{øj]Nm* 'x04R@G*Nnn zf inO08y4N yzXݽJ;Iv‚+ѳu EajJa^1'V5t2s\gyE?x9]E1&=6XLH'swl2煒 =h\bի[jG/h@u?/0N}(sxg?Ƶ)NTD;U磧[Ѻ;Qw2Vh,k鷾D^TNĭ/*1ғ?uWT[AGs-W XUs:"12Y=\zZQk6cm<0pUCtd1=Ԙ)Gy$IcHFCcڵظ*AV)I4"ktd:ɳcȴdc//ri_gY_IWRQGPBbNR @ Yfr%2zT7}{+_BW[L*{mQ#ȗsLadt}?4ҙL\#}E-c HBetmiT .fN6cOWoĶעsuI Pڇ߹j;GNaMab gO`ӪZ5M%:E 1/@SGz6o7zUMLR픟v%^pU[g[+a]KҤF9o@ @h́OLyS=v`?-~ijZdb?FF>;6՜8Py5ee|Kجx.g)nxwgtT,T>1Թ뿅|/R;+JPOCEʤ:][&ejjǏah)%WDgJخt n* MhimS7qEMv׿8*ЮǣɓS_5"!t* slJ!~O?_Z f5Wn5DD++"wg&\?v DMn] u}ޯoZьl+|Qc,Y3(*vwۇ;w`oA*օM􍇡cXUn|1 >Ogǎ_H934!BO`~ !{>O rW*KwwG_|XAZDu sQ޾_0x2'dށ#Y蟚>h5Y~侲(#soxi$a"ēX֌ Q;n\@Q8v`?\lC|گ6V4xq$gq籱&SDKjBSʄwلM:_"GtĄX#mnjԢ虓]L>826ROf/vb&@!P/W`;,+q'(qEJ$gelJe#1G!3(ԙ>|D ymaʗ/ocSYO|ϴʰmoRy +m*09z9܄%bAz ?旱;B"r;81rdS6lH:E[~zhhӉ?/C[ƑiI \ڒz7b|?pNER:G?f0) !r,q'A~Sb{x)@;K'z^$#F-'+ksChmv g]/k`./"o? mK;OAd)SE,Kt~1CUڛIJC:DgŪKva$@ 9'TU[fLD=EL1"02`l w;q㭷"W,a=MB? 0,j _B("v23?z}=)#]~?4Zܯ6HLV< h q@}=`/T9/#(ݫbdltSxџᚵܨNۖP_4H2o:^׺~m8% @Ү2{*eia>gG\ 8xm0RF@{Ag<~-ۇC`hGN0qZGBjD!5bK!_2䊸mY:7 m4gB$O} :g}Y$ԌƼAeTQg+( ֵ|_~ #ÇcF݀>Yl[6ԣ'8$3<1mHqAEpv§@ ՞gȕBtێwn|bF3R[0/!ٶL|׆ 0\"':J[Hh!k!`,/»Z9r/md[ǾiENe9vi˸`S@mm iI BoGߚ,F׾wȔMl BjƄLF3DJXێ cwgPH.i2m>g^&/Ӿ=znHLI->W{~!']˶.sc8RkfAcITgB[so̠F_O,5q]6&MS 4lA2cDW*ZۃI_^Y 2zkHzIůF'.Zh:hϾy~zsI׾uMᅫ601:/ߤ^1V 6&4`^p4"RUФr QFK}aE~9sx[֥ i vφȮI!rt>^fn9R0&!BN_V}@`Mx?vRNRGXƠH8FClXBO辧LXض>&闐|[,oYJ1<`G}k,&T)WPp?X~ܣGTؿ82z5!"_,ǒ1eJNVI\ 0üDH K"Z#gzqb1ٰ٘^"䈍{>|6NT iߒB.Þ`nLH'hJ'Ҕ֏;dj ?2d X Nm"#ْVSCTC󀑱]wVN 詚[{1@!Cz% D\'͙J9ſǩ7#0Y4( M2O ~̟?knyGث뮛o~e_(_(h_{b{{K G!yQ}f $e#PbVFY`P`B67\@0'^ :Z[{~}fJ^}锍ilQOs|LNgN#i7? H'mve=_B! a i}K n1֓tT)`G&c/ȅL1wj7o<V_^&̋ [&uH'dG]j*՛^1ԣJF1TFKj_kš 3BA5B!\ "fo>YFL`if<<զ@ht1!FD_-ALnoNdB!B!d9p93,=Ӷ./9&0۵{~ 2`T-2@¶8Ȯw`#pe:w<˶ !c6i8WpЀr8Wޫ.SEˊ{P,QA2J\Gt*{'{I=sl #!B!,mi'lXJX Rӣ%|_~\;z`[~w_#^+RH$,ScA"qO?!WpYUӹQ~.SK(,p}P(y傄[% af'%#^d=/ER#i+aV:L] oD[P + C3Ek86GR*:RքI[[`>!\>Ʉ'>^DI9%ǧ걄|3 A/l>ŒnCeMbLȠ'w^&J!{d,*ESM wI_םF{F#⟐+&MzyY`9%7X$@Z_~W=93#1 @Oh\t!u~N{_w>,VBHlST ڭّ3p]wWS%d,@?!WF,$$r1 ӟiĈ`n|^H MBO.Ƃ*ɖ tO~m 8ϖ?4IzR3]~imw`tlBO|!cM܅MM8m@RQ}1.P4t.bۿ=q&x^@!JLb[w6?Wzݝ 6!+˸O|JB MBOyDuWxJ8JȨ|:_{?s2_!Nz}ۻDcsgbӊ$,D?!_elc`:?!3+~< "& _׫)n$ݹ M+7bt[QbjnGW~]c t)8iBH(=6D#ۘ  @Oh\bȐu2| ѯu8g܇Ã9 , /eĄ"^nSH1Tŵ8!#la4hP"{BUe/l} ӝ3?~;n]a4Jƽql֑R,|}L*opW]X"R,d[_0qwPv ˏ 5u =cFvdc) 0 h|GzsEZ:""gimFLHDR8iBl`{ N p9  @OhKOJ;"M/8xgCǶ0ڄs i +?_qx |z%&& '!2O@dFnwL4D_' Ƃ S=2#V yż~W{a?c`M#PK)wwKѿ7imZa?!v'wsO `:@Bh3@D=Ch} dGECjҿзk7:{t?126ĿEO!B @Oh+V$sHY<ֽ'UtLw1i=IχZd|Rз!ſoSB!dV(IЦNgR-2]p`+xMu+~Cuo=`UOR-H:ߴ!7(pnwBM{h}qI$:hkvL(z>wލR PZ#y6;>ib) !,uv'2" R:d"̿b,0w %B>r[}/9WߊhivNyra3gKHtn>o/;p oAлBȒ2\>ۚFPfQ '0#XYç9w1FKeQ]7?b2;5vt3t65c,ڳBYLtKzyZ67}p̗ 25.HO w(Y:lQ_=~<_%lq#~_ ʗ0l]F&XVm 2ܟ' 4%$)$]KEXB&dHB`^LR]$rg. 7Ӈ^#q 㩇BQl\B:T !c/] 02|]a]ONuHxafB|pnkBhP | ur 6[:@vvxχ>}8v`6F{E9Bg *dgi q.6zM&SD'Dвtϰ@##f? @Oh,Vt% 멛&i_<|>mH { {2:@GtO)V>?:Ղ_zo<A~?cUk{p]wS j ) !,)rs84pl,M&ݶ@г<o'>*-~ph0̪m >}Y=異\>E lEa23(%roG6zYh8H_;Rhθۘa?B!!mLMB`kX'z.b۶zGk:=xL = {_-aUk/pj;㷧Kmgn+O=֌g~whiF@Ia?!Ƅ'4!$0 m6 @On+E2T,(FHi6_F,7ɤ|]k{0Ad-օ8_/OgtT/|ûp{A3?=rohwtTd??!zxmKMB`Ŀw1e'/a8߁[{{зA\#`Za_-×M4vcS'1vlJ\6EU:W_H.pΜKi+m#BBEhP$&6Ę@ b4јȭr 01x Ol@-DҢ`Ch궳3s<3;lgw^d>tgv|gOks.$\Mib_gk8D8>}_z骺uQ;_D0ZQjqJpc=ߛ:+m՝X^̑d+۱!U0g㟫늟0?}oƱ1LOom8Wj\Q2=1X]7/;M;|@5zgU} '{q'Y/_rU]rN/7ہ+ `Sx}ՙ n|DZگ/4ww/gcZ໳q&)( }%غ <VHK]7jGS5s8^y zmmu~rB#.>>{8ܨ^A `X`#tf?}f'>+u&z)t?ץ<^I`v;~:5m3O>U_컹Oh1{?I赛ql诟ǿǻq|:_uq,f3=25?U3{^1Է&gl=f_ʘ%O7Ց뻗K/]çֶI ^|C;}]>vg&' E|W.LS1. '4wGz*;q'gb޷*$X4; 8 5g#e,#/y.}Ϟp35%^~hRk 1x +&fϕKKskXpO0rM={Yªo[hu5뎏@M8^zЗSUӸ@c "PzHNH_,?hI^*zeVOlӯgÑ_ D_mG4GqL~`u ۟K*_ tg;GmteA5?3=C#m?DB@:+/@VD@~;7KunzCD hmGw5Gs^/A8+{_@(d5hw(uk y{ݿ6669p9MwxcS;魩nzd8cq:%# yX:/1_@(j(612E ;1"wTc0E;qCd*[;B&wmÑ#C!d2 E^/ɂp0&plgp&ѝS# (xxxM/*"`@޺ THUIy "v0=-ƿn0E_@0E MSG׺!2oh /@Wz3cM/[]S{ }Jq- ƣ+cGg w'ȠߝrI,;_سtM^Qe8` w8V`@ )q00X{n ξ_@_@ʻӏc-_@QSWZmv@.B]Ǒ?t/3f:,WWnMcc m82M:&؀/hfu ұ01E+"j~tu5Y:N@읇GnCi+s?Ժ  ǎ ٳ1O WAt`s#Sn ઎4H71QMGp v;dMmdGLO&;ޥN668' wE .d ܶf G#7H^UauQ}}"GGz?K.Ogx(6c;<iv6@G`Qn0gJ6㟫v3 -]ϒL`# $?͟'Y<p;&K?ỳ@\X(M]DZ#b8_{篭o @]Uҏx G㋼?좆7 "g~~NfߗFl|b<đtWM?wit4m7ﱱ9C?"ҍ^< y(H٣vduA{?K>/2P8T+|9`@U9Llp (GPE g@!7?9p&"``?`#? ? ? ? ?  " " "D2? d@<G `#d#y0 ?Ku]Ԝz؇:G<G `.,]*3ej}&y02?@G<G `#dӺ e}?Ys3 g%1sowwu^e\3][?v%~O`/ 2EBƿP "@!_@(d/ 2E<ƿp.- \"@_@(d/ 2EBƿ0 "`2E/d_㿐/ aDD@@0__0E_@_@_@ra@? {j"ȿ,M yr`/op&` ƿ\H&EpMP.g@eyo{nxNw)3p`#"? `#"? `#"? `#"Ӻ D.7E^2 R?pd>OH 'q `#"?? yox:ar9 LpGDǿ7@@@GD@0@0AD@0D@0@0`#"o#"  " " %E `#d#y02?K NZwNe ,ٙ#2?@G<G `#d#y02?@G<Gn`#@UU{>㟬9 PY?g    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@M                        ek&{~i IENDB`teeworlds-0.6.2+dfsg/data/mapres/jungle_background.png0000644000175000017500000011636112140200333022033 0ustar felixfelixPNG  IHDR) DIDATxlUy񡊀QƂ= QSƎ-v[lb5+*Vb;`E&~ʺr=sΙךy~S;$"&$IK I$I+kI$IZYH$Iʚ/@$IV|$I $I5_$I$$I$ie I$I+kI$IZYH$Iʚ/@$IV|$I $I5_$I$$I$ie I$I+kI$IZYH$Iʚ/@$IV|$I $I5_$I$$I$ie I$I+kI$IZYH$Iʚ/@$IV|$I $I5_$I$4vͮ7{z]òe_ώ̎ɎNN͎ˎΎʾ}!T?d-'LK-I.9{Nϣ_D~^=2iW$I45_ڎUG$1?ʧ2Ȟu`M%I45_UGE==X~=1;_$IqE_ZPKÊ$I|sܭO=0H$-P0]3;4aE$ij9i] +v7$IZc0=;\?i$I/0$IB|3 95i$IZ/`F=#`|e{GIf})7iP9$IZ/`wO hlh I5_:g><9LH$-Dʃe7?$Is_;yχ$I\|bٯh3"I45_.X@?+$Is[1f;H$ezgF$i.k5Quhs#I4w5_])}|tZH$U0e O:??$IsUL̯f?G:gvllߨ8owzЦ衛zئGlwnA .-IB|TN9"`?K Wn̓g˞&3b>}%Iv,^u:q}<{w쟳=/Uv3eFً~jS^ .~H45_*}"`1tm%VU>]xop)Zd)ݣ~ shO%IZ/`]7`q|;!9*IQOw*?<./goz MDߣ$e3`-9WOHޟ7ƆU={lkyCi[n$/`+]6Cb9lof_N 8god$IrזEQO^s`>tro?zCg_N r C"%Iw0S7gW%I+1.{FvHvll/`l4d %ITs75)M_E.xJf[5M>SLN%\"In~3ODݾ.`7$mE}F֧^w8Y`~=aIҙ퟽=AL *{BSZaemQ?-1lPQ $-z^ LZ|QXgv%i*w ؤ`b%i!y^le%in[^logG?kW̞}7`F>]3HR/;{D3 :-) {DIjճWg95iO;GIe0iFIeό/_INʞd&$im6z™^<[B[]Ƃ^Qx`Cmlo,I@Ge׏ȾKfz'@Jsf~KjzGDI-{Lvt,I@~&HZ' MZ/:RVVŒF^tKٟFIݥw[4iEI׹gg'[5id{FI_>ςUMZ/:wdvh#i~Z`j 9Ph#i*Ojvj& 9On}#>ˤ`|4;O?gӓ'e6iCGdC6iSf׍EڷCp[ᙙ^̱;F$I:_vh0S 9wz@I]+A0s ʨ̶>h4Ni*^,CsE'IõS/& Ew`p JN` u|_?2;1ͤ`G,I6'^,D-Ik<`t %p\gK=;-hbz$~]=xIZf^,gW`ރӃ&KgW>A %RLҙ.Ƥ`I],It %BMZȾtez侑ԤelAw&ė* gWȮ:kvQS6 l=${PԧeI^1@s?0zA&gozCٹ4d 5i[BeȞ[fF*w]ЭIss;G}vS]^0id%wvp |oҹI ٳeDT-o 7i`b'f׉z ZM" owe4jq]07&O>,UEbNLZ/`+~>ES?V^~:/\ǢcvT0W&F-nmwwΤ6eܙ^ !{OW^}+{Dd`.MZ/` g/ˮ5~!Xn._-C Le`nReN"EQo2ˬܞaXY5C @Dkͦ7s͐pnʧbGoc/xvh+\vQew=0{D3ޭ #ezZ7ow-O!`~0uyQo\Wd>}?Kʐm?z'@O'~vyg wbF )ySZcwQflRwrk#v];{xټl6+6-]vncvXv,_$X/C 6-kiQ?)_8C ]=[<7Ϣipq;sqZ\ʮ 0{EbQ7dHMcd+94;}Rf\ln8VpG.!`8Lnv )^vpr#0 c%fǍdhǐ0r;tEWeoRh̐0rr 'i哓Z-z`H+d[. zaHh~rQY61sZ@ )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W )@W ) ;"cH\ 4^ d )澔'ҎcZ. X`g{ř.eaHBeeΎlD`R⨨6ѮٳS[,Xl1+e}B3rBvX߀{f?y2@ ot@9ds#cHl݀r7G`R`<+N6oNQ05C ,?dq+-,C ,e76>:sΐbOou7g'2:%; .%[ Oώ5G==flӛ R`1r`zYK,8){Wvl=Nv!Y;lbHXV&;8_f|blGv~?g~:C ,dwC,cԻїSfg{8 "_CcN1btvh?T̪eEbCʧZI9r]ӾCnZakogF}{YuYH[}EtJmFީQc_ӓryYvp|KӇgϋL];](Aki},>h̐],+/T~Ӆgd/rg7)ĊoObgHqB nSr2׉+|-4˩OEo׌z:C>Q?,o$:՞`&\wrPvh`6ʻ'"rzrk➶s唲gWjӾ("{gﶼY2[/3wף~kIT6fݹuZg>̞3n޷Z{2zrg/si? Geߌz9ãLKD=BViw\+w;,g|/zo9CauϢ<|d&lёٝ?G앚#&QVRvy*%cN*Д! 5yB哚dVozQ9,F|j9['GDa<|Ny.5.N(l^n ͋E=Pٷ'6e)o9-MR=R>+oX\So}1oe۟i˳ʐu vR$&EOm}04v?wQ"~"D=|S@-EDrXNC+?{/+{XYKFߓ}4\vDwbdr;e}唪r+ã̗O%'哫rmQt}nSeyӠMW:4&i1_r5cVQZy\ɸ6nSW7 tᦼ+{ISPD*#tOyWQOc-(0I;O9;oxM)E.w8˦֛卐r[]*70T,^F7iXrI9߶/-U^d˅zQOqGbqS;;ˇd=)።jH 4^)?PBr B[PֿKZ{eώzrm?|BS.-硗 U$_6i%sPUNwa9ݘ9~S1ʹtraχhF}\P\Sr7b^rIS`5i%RͿ`4!/QA}Ź|r?E=M븁0ᨨqNŬ\T)kZH5w,I,rK~˽?hN8)Sʶq~Q7}ԃr/Jr:QQ/~;+ J&iq,I,r;),kMv)Քۇ[f~>u>K#T[IȤ@w|9a?t:yWQ5*&r祏ᘨ? r иKTqÂ^(_9H-*c̍,^;Űp}9*:~R73~HzZsez [c sAQ?[TnK|+n1ЋOf=\0_ ƤHecp7rN\;2,ޕ<paG塏h XI׉?|zCD9W>('.[ ̳r{E[ݛ^(J/vSFyIpZ>tWdwOEnMZ/`Ε [jxKc͝q_TeˀePNE)oxZ:^(-rW]^;-;^VAx~|F4]!;<ƤP_D-ig*z˭]p\ϣ#i+?; r:?MZ/`͟KcQOqG}uiNc #?8cg=$>ܦϥҗoQ/@}R)().ϵ9wL01٫[G߱&'WQO?eokޓ/{>oJCه7uhM濢)rr-SGG}pr}_3yӾCĤdŰ? 坮  Qa.;$P>I`ޒ({bvg`vNz'|DݼpFw\hͨӜ{9܎ٻyy@v7N(MZ/`_zwsŨf="/҃^}XQ? xxO[ n2\4'Ϟ38~grZ_ys|rS>*=[ʧ*嚯eդ:VNzXsQ?2N~}!;0AnKE=|rPnDTz,&Avo.3Cʖ%}M/28yvdw-"܄n^1/d-c嚙r§/k63kcʺ@ԧwyGhFK[wPvX߃$o9{aԇ0YDVW[FS[=v§}17ٝoNO Hxܥf+>r}bob7͞#Nuoe?ʔkZ=Unzpc3Tz;rgr.`ʩ͇En֡<#Gۢ><@\XzXh]yQ9+CJQo Ce0-km񭇆1+w+Qo𝍽fTVrF|壞-SS)k.ד4ʳM a9˦<ȻPQY-#8C C*rJ5~ܼ ͢>)QrfߋzھD!1<7`(1;]&꭯_(<e҆!̎ |!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!pbaAًd~lu#2uz쿳7f/#uvsD=6_ޝ:&ϐKgdg0rv1ݠ1Λ=(`[ވ!1.=>Lv Ĉ )e2l{e~;We8rz9vn!ם!|CI3zfΐU@~h?H%o⅛5C ˮ\h<~pdŋ7C ˬܾ~p+E}~K ),odwCX=#IkWy{90V7ɾ=o,ٛGaΗ4oh'fREգ[i-E3gD=Xo=0=o%ԉفQOE+k#TvmC >ퟝ3|vٳE=8b1}-{Rvh?(rه7*Qo0"?!"NwPY~HhU.Yh{c1bϘA^9d1ٛfiXrZ_y'<~@h]6Eٮ16Rys5d/|_DGgul*Sa<4򶱆m3C 0o[\p#G`7ċ1~}:{uת\ph_%UuB;:ѐ̛U/rMb=6-]gRuٝkgb-P׻/E=-o:Rn%`q-/%{xk&{Gπ)ϲDSw)'ڿ\k}GvJԨ(nh{'c`n{\_VWvѨ B[k6MvQop_Q*1힌xM?p\[XIOt]0{z^Oi; }2&lܚne5i+y4zZ̷2V@sVE ~Zv:STI91OOV6o[f@r{Zv:CWzꞕ]-~-&ml)L.b'a?׃m_.y׫5EQ?QRrQ{z}[GGg_803wZM˗n}U>x_ˡ7;LF4)Ojo}pȽw]nOm}T?r@rRyNd {DEuV롽cבٟGh2& s+cڝi}+#=~P+MN7`4zoKn_Sŋ7ӲEӻ6o2}oc;19{l^Aw_?6v{fAiwUe' G,Md{`tp}pgj^y8cfMj<(:8Zivo}CW>%:nv/LS_6n j z;d96UnYH3Tn|hm`0EQK-!iʝN+4;g{Dh&CyDtp;d'i3~mf MF' /pD-Ax_a<.:8Z2>g Cwhvh3?Eپ>3WNi~$=y}2 8tn.q#vφ}?'EQKͦ'r}^4 &el̤mz*7fS%{q?zFtpDg2?p;[Cn:},h Ҭ~wu jtefgsuySsmk/rw +z`cD-Q哄Lgf'?pm]EeZ}ݳkdVioȎnKAԒlkXKֵ(wYhRljp= 0EceSa-o?ﳻEe/ `//-3q1M.O8)M ~v4{`0yb^=6mr1 i΍_ܹʣD-a_f@՝>Mu~oR/if^D-a/fȕ܎Ql:y1WY~-xytp4;gF>vlEGƂ>E~-gY}l+%lwSYxHT-;bZ7F}ݼ_S yUtpg46amZ糽>_#*׵6?Z: gXGTMc+6 jIgV7v0l]#WMvPtpčum܆gi;햻n/*D-q/Y}MXak^gX͛%VE3s^q[O~?vݘ_\z`-:8Z>S3\#{ka.0f܎xI׼%en.]r[{ `JoVKtIl|th1嶱 jɻª{iʠx`+\5;VwD-|"~@ԇN`};:zWs_[ۃS*wgj~xj;j@Ge6˞½ܨ qᗭ\6Vv"D)nڎZb_.6?bzOtp-;e}>zg ^s`z}h}l]z}-藶CU JףWWMَ~,D-ξO JוWWv~,L-hyɛY)SDpۻkᕻ W/>FQcݵ_XFQcZHY,/ J\٩cu_Z~O֪#Dʳq54ѬGHQ/ιOsgoޱ-W{^v`緕{D6i;l/$x-_[/B7؈'z1F/f3~;e./h|*m}?ϕuuͯ:L$sީ\ e7d?NM؎>ux)A*wo&Xʃ>X]|>fQ!esigL[Vw @j@Wr׮bC = )+D+; \"*nY@'ԅJC#=)+s>?;w{+Z+筷>🗮t}/3Q2V&X^?PPNXk MӐɭ4S>h=U_uH~KSs`^+_Z!7@h+tÐ̛rEa<`RySVz 譝mERys| znzE3`. C 0oNCAO]4\‚1h?ҹlRyh?Nd^}4<fHM90dg͎:R1 1ʧ$ޜp/+C 0z+kQY0 )}"Pvp58;=;(`Կjth;7[ Kʐ,|8y~`Km9e׍oۡ-mrWw} )e׎=1;fU_9/ctf[>{{8XvQoуrkPrڵb)r8.(e!.&wva[#m֜WvX߶&<#c )^0*C [3`!;c2P _u7"^v_96R8C\`oԋL%fO:8}1ݨw+="'{(`yk\#ӻXWN;}m61,_ddOnzgWܴ 7zq~Qfvht%b}X'$%Y%On-{o]}NߝG, )Q,; {PvCG& {Ghxٵ޻ef.K) ))ʟFlmCB n7ަ^go?ld0r!S`s ln5> 1{xlnzMfWkw)&<-\k6ypoSMZ/yM?la0kİAm Ip6ךMCV mK^ghpt\0?aF,&d0?hptr0?CF,&Dʅ/#`k㝾ef]_A&~m߹OshuUf18gvON_v>#Qk>}g?k3R>ߚsx˳gddngz|qm=ζWdwu8,;3̷r:ѯFlޛ9{qv`vn}k뻍xe!C©uP )ˡ\<%@~4;3,rL9%_Ek9m"t5V0d +20^PN=5J`H`NzCa0c޳`R؈2o퇃֕;N6ȐQ r'K@aH`*ޕ]+[klϨO!Οvf ) 1q=!-3tʚ~4e}|Ӷ={%`5phvX CvQFYn17qR~K~*Vٛ/f'5X/R[9j8s(-YQO3#C C C C C C ?** (E@AAE@EQ^(қ4HWH_=>f$3s=>M2$"@R(R$"@R(R$"0/K"@ M|Za&;H~HV+br/7E ~2BeH 'XJabW61E 2w,&n3^7q7"@R(R$"@R(R$"@R(R.onD.OXI5Vn݈"#&5UDz2Ŀ6H-WE$)c&&VkMl-9C?p)35 +_.x%\{q3?Ln&v6qxkLa;&21 /JS:n sa0Mmb7${Do:N]Vb_1 UgRSIJ&3dKjRxē]Iɒ=ЮW60ʈk(c>n.R\C`41M* ;,֨7E`|μ!^\!o#1+k'*`P2ky%BqvX\*R>QaG^oBF+ )Uؑ"KU@FX*R4ܙ" ]?-dtݱN_ܙYz [P'JH%HbZoz@`)9u=)^7 ML()xӑ՘l\rww=wHjl30c&>$ޱN칃ݞ9c&XEʙ;D|W48\=XEʉ;x|/+tja=o^U**R~Eu\{e&~lb& tHsI]󖉫$[cYH ొ]==s]Ivd_+H,G᱊=ꡆ3O u" ɞ&]!Y,]+b)7,d@궓HEHYx=ρ|W<R$PEW̑Qe+JI^x9ρhXs m(?] 6$PEȻoqX(H"V3zo?6xQ(FE?9w5]mT)R&;mV$P 177=:6= @12,bv`@^? 4^ĩ&ތ,_w$P ?j9ni ?{_&65KKȰٹٛyf)1%;wƂ}$o%bdXFwS9Mh^Ysd\aA׼o{2yr%t'-ߍ5紲GN@#|H*3&hXùU2gyA6f>S3yt#Rx/GI6=;Q20V,R~p@gI6]gy%v&FC53d1.CX\{u D}Ƴ0V,R>cfBmZN>Y#)zJj&~hhW S}N_yppNtZᅥsh+jǖq<5I,ʖ!榔ǁLloW&mdU"EgE]h&>"v}-۬{m,ߕ5M|aGJ3L E4KZ&t1Nq cŎ61;r]Qc>[z -l ɞoA䩣HX Gt#s-?ɣF#fk[bk̇5Rj^l/{f]M֨H1nG&&³"f>_Zc>y >?XY~Ry^QyDfb6]Nc1; [`8&>&6l:qPwduuYg6 _m,%5sG>=c?ǚO@ 4QhL#ٝ@hcRǼ^Ld˾W gms_GRc>yN-x&ϧc$d7M)XP _wI\v]O[U}=bvsN<Ng.q|OLM|ĩw ].κWUx.#s vĊ.-bv>@\Tc>{޾}^%/hL XEJ/>%ُ\-E\ELoӛ R9bvS\XC|@ 4dzE Ivg$ٯtQrugԌ]b1~="BKs,s{#f>EsXmy#dx?\7SR)Rzdxbl{Ėlqҋ}-s%Bns"@}#-P'Uwe\G8 WQsl[;sb'82׿F:bvSSL)Lg _؉jҋ$[ɸV X{jF}+W<_+XNx CEJ/ta@Y؟3 IfI ҈ٹOrG?6{x.v@GHE%B x-,iF}?:10xތam,Rz1u${֖UO?s۰]Ncr-)g8SHޒTĺ&N[lZ9uXlY3rVs"K{ +e])RCgg~mpC+q?;;t\"f>E.h.)1dU' j,\s)G}B2lBBCbBCUܧH9%T+b2*&0q*(X~ֳSOaM҈ٹO!m}Z X$p"`Lib1HV](7xoM\$Yn&N4qdd$eOF:bvSӎ>dvG[NZәoL񔄙!8L*ٲevML< ,q},Le҈ٹOrbN;[xMOHu4&7)dI斲)qE_nQy^9OٹOr@Zۣn{I'Rc0e|E1թ>#o=T1%sdɞ;RB#XMzHOlQJ}h_޷N%g91id~y?!FXȧ_oT{&zN5Hчrnt#^0q#$;i*~2e/+"egPN=L,%Eד,z䋔 L!#w[nTL6/&~kbvXn$Px͋ηyxOgWll, .a-w@zV yѤ&9J$Px  9J3$Px g3tЌ$%\^* &^ 5bjAF/:\ge%M/0t[Œ#KŇmTxB?0RPGML'  6iLlךD(B"dcZf $",hTo_0iCI)&:&/b駕atX&n} Zh6r.@U'HȰdUFoK6?Lnb?X2*yļ@Am+RfdgL ٚ-w=&n߯4qLi@VDYP]{wE7q{Q3EN h[Iƪw%2ɊL| [4dCDۊo0Oy t&& L\#Y`E.}~"% 3&/(PD/JmEF9]dL#m_>t&l%{LgĻd>&Ѷ"%3x l+I0鏶)D0~ @d8 h[^|u`@^+xp>7gS^sRrE#/ ?sS?_t〫kO.禮m//wHYq) uG^@s:n"eW7ץy!QFK1kJ˝.R|P? d9/]ceN)_qs9 ɍ<_P?_tU1jiZPT~c%"jkc.֜b9'?諩$"j|m1?՜=rBxć$;/q[1;yhpбGNķm%^Rudxc%#D|#a~fҢ2}$#D|3a @34Cv!cbzɾ׎lI1;yE9=rP]J'XYﱽ%V w&lD\WsNOz MhbV۽*NZB'YF_ߋ G?JlvXSEʶÞ]+IM|p2d ^#Yɻ 2x1L q|FR8^}v{;Cx(I{c$ iߖDW7qz{R?Wh뗒@"bv^c>K{nͰ)ٯ&PHR~;M%埗kc%a^51}dQ檋o$ߥIEql-AbbyޢCM|W2Wa"K" mz-;v-;uz1vm{y٢/vqS%zN%&~m}Hײq`-?c%m)ٝ՗&Ơ$;ܢ92bv ay|.E+:7d:!v.wM,,#= lf9ZƽN+wו,mwmkryŅ[ks֘M~.~//y~=:Κɮ,l&ڒ.."فLg9Dz`\y9F|̖;/i㒜mt&&jy_z4Ҿ StIieg@|VEw~y#>yy=Xq?^Зm}b/K8 @Yʏ_-iIV_s1r?$}JK}6Q.LoZ1;?u䍗ke^\>dIC&5قvlfɋ,r2J*:dC/[ }6W.iʏM 6@En⣑rkG+B飕\G^أ~7zA;?rh?faE]Bor:SL!ǎl?c61dWǴ29F+Q:aD+qH:M9WG.L_>{WTx"*~ѢA_o_kY^pfcsI=COuG`{^:z}o4eOlt:SG.;z䂸vvl9϶5>o*7'{JN0@,.Ǎ }d3mg"vWkfjLyWNS>飵 \G^_J \mBӔ|/޵qQ϶5|fB'葃dhbqXWl:8}\Nk-=es{݋,W'I6A<8OWvVmӱ~|~N5pC~6ze嶰%4X&A7u<>҇l߯e;1eheYBBu]_^C@-nwW3UvEs)[߾5[bDi9$!%%g4X^~c!<Fb_Ҏω 9v/|:.GmjSW5 :ovl+Vqje;\~SSmLeˋ=U~M.bv~|2p_q,oe;1e{݋i-3 @Q/>ȣuTׯ{{@Z#EǍdžlwmv1vF+v2urM9<>K;([Glv>`{gyl%(-i99-sr?-į{P9G{tCѬ 洂mbǗ5汅CՔCk7%1To >&`gySt,/voك}+Yv/\/*uLd&C5 aǍ7lsh6)D.B/ۋMrhddVs gEq~Unɋ<@\WI;>SL.hccYخ/)wG^6qdhcbP6&[g%Zniuȡ t&66u gE}W PIy .]EI;XZX|b>BÈzU&v?@lPemSlsmR5Mi C#rRG?0 ǟ<@\3gMOe;ehE jG-b-p}7H6U񅒭rL/كzkVnߒc]%uM:pgjerH}߁Chs˔͞y .۫'c{X|2Ǽ]u}P'>d4i1;9n`HHuאmR${چrvE%ߪiq!eƟrouep[wL{d we~դ5\9Joyۿ HyF:opghJI?,/[8GUF؟|}@~'ǻ e6)ޢ\+8X㓎9b9ۂvZ1;waQ^osX\ZҖBW}ܣxŲa_.Qv{_$xW`ߨ5C[X2| &/6nlFDž~.Ϥw$ ~[8#&fkaǾ֪it#H۬]^"Vv~+c y G=~-UዾMvq3}5nTk~}ɱ::q}5`.!e\zT[=Y=-؏ak5 A~Ӝ׷%l=*Yaloh}e=o:=CۭXO8Y@\ߒC. ߷̱YXr?؏ }z| goNi O39]״u|6ps#V3:| y yi*v <;-G9aϖe3h[zS~|t[ޯ~׷)q^2EvYaFDKx?&:a0*䁸Ķ왏OX3N9V|jOˬgȱ[;䰜d_ytqyɮ0/qPز9!5b MSD'6٥[Oz]Vu}šDtAuB JDNI琻K\gsY<2vph5~аu\c 9 z{S]XԢ v>3mzKfL _i 21/_5me܇*~LF7cYWVrZjv[:^am(Xh^/l{cl?gmVzm/!X}~nj/缾qh Wf׮ -ȱXH 'ڽDE8}d{m.ض( ϶o u(K[_W.]3kQt+ 9oktoXD/MZ|]嶨ؖryNvh5~ցrؤBHG}klzEqE^yE" 1v vk/ݠ'nj ^96?5UwxU9yb)ڲVEu~a 9 -sH{av/ٮ,~kS}dI_h֖%}u^!~nj ^s+@{qBIٷ6ٮ7c{Y۪ rWc(!ە19vgϠY U\LX} WG)x8Vg`]R~ɝv%VE;@9BH͒dglW'X[Y LA{yg]",6Ib?fVڢIYxqBMDE}ZͱM-mUu(6]D?)ɜml|l?\r6Nol=&c@m'ES,,qcuc 6>ckZ۪񚎃/BqVW3y=ڲu>׸2rKcY1ˀ'U%or'*Ii'vlU~ 9 =k=w=.+i܆cyqE?iGgzڣ-[k#qު;^L]8Y3$Zi?6~%>B*bu3PTi\|mŤbٱ&eY)#=ڱMU7q?>;^Xڹ$ޱa̚>Wd Xet1h}y̖*bu+Z6>^t>bb,E;eqcj6<*q?_R)ylXVw,0f1":~-ߐ,H1N^9,mUx3Oo|BHs\??XKWţ [pKb@wć$;^,\ڙ$1x~ؒ3g"WH;)LhsCCdsݩqE $\{9Mo*[ <-i&lV?{U%1d,PK_(y]J?w3sؽ?:bɃ$#VsA :G%#}3翗RxEa> `dipas%Ɏ_.ytVga^y^th!6[:am*-/|}n4qM[៟v ,ԻtǶ.`1w{ xQVg,g?dH5){oVڼŢVFwtAl [6;J^ɞqʳ lÃƾ ҿ_CI-({ /6(yG%1ΘRNƥR|±T* :mG92@>&=n}ՀU^-)+~ƞ KeQ461c:w@'';%+{6 q!]}˱s,lexWiiײaS"-wȶ.3~=뱍JΝ xQvdVw|NeI6)TxBhWL^eۇ%SvF=d[Ţ`c,6RT3؜f XWY?\t_$< [V/߿hoOuӇML57nxBCbϚ-QPj|#B)kC6ff+#V(V[yB莋%Lݛ3Ewl;PtR^0:Гc=^5KYU c+9V0_I6>WR]H|1#ɖX\;lI)_uls[6[:YB=gbł.h\@U7B~*Oַ:d&FȌ}s2g9s]wFzmWQ4mtXyr󌱏gMTnĮhtyKy56[: S-6l/<9Y9ck D?`&̂׉WbϚ ﳐ {/lt@dP^k#VG([t|s|.+EFlMsY%6sܟUj @t xTLR3QUy9K\|%6bu\!ξq@-hZegjS]w&eE|)3HN0HYS1l 0^T723ڈn?JoX8BesqZqTj7$p)kݢX630u%.RwCEe-b(+*\n]im脰LՓ++n9VF>E{Dm_">8Mx΂2>\0}`icϚ3ދ݃yҡwJjuoP?XotQ2Y{dmY}N5rڛdؾ7ƶIMdzj/aM[@-:}kbqx0X]Yz] ^B9XiozħjLRHKYSQHuB\#czGm>bu|[0ZY/2ة䵓{Ԗm+F4Vߕ(+հջ=h$񬩨Z.xm ӊдd֍m>bu'`+P~=S!)vsڋ&})zXE)-gMm.7mv'!rؾ,V_X-JޫUݣ>W,Nc^7/"ϛ5wHcYSqȍOr*a >o:l_sl(u'#VE󓗹B[Uݣ #g러aV˶Oj#kHX 7 gQTE˚Gn|zf=ma~Tab@95NohU~طBG$[Q͂/8e'gtBm7Y"ǔfMc?]}lZW;Rۦ =:RُMIcYSqȍtɮx}ؾ>İ ߗI|RV#VE֔2ƥص|ljsfF ն`qEK^w{>5YtLY(X|p Nbu\e6+{o~16=+Xr#33R+kJZ)z'K^s?5\L݄a 2|_rlkZ:- Z_M'ВF?zq$p0 EkE].w]>5Un1IJMxWabDZGsz F{̳ϲ<'.v-mb$]6Dct6uK^s?5-asx1-:%g j}`4YOm>̦갍^-z?IL5%9_˚Gn4 ?-܁utFaǶ/h*'ly }"U…nCg7fB㩐s6ϑDzlf,JqU?algG1$NI j}T/zyb>}L;괅 9H:gU;F^},k*.lh2^tJ2&9ĤSy,Ɛv::r}VYzD]%@5DH>CgktDzFq̳֒R}#ۏVt&bu\ePʑ_XǒHKdbISS<nt,&*y)XT\0x^ZxP2yz2~=9mt*bu\eUhJҲXߌKb%Sc<jt҇M^=<Гg-[]ZU( 5`:Ɏg(,k2-d,|/pm<[Tߏ S1:-:.D6fqi%!E?%;N\X%w`-d,0p_!/}6iSIނ|;y|>uˣfg%}%'̰?KvuJcY1 uNX2yv 9Ķ?slc6:1: }^Oap}@ #~'q⺒R˚vww'k8Mec;ѩGނ|w}" )SA#^q{Dz&CozoWt Orlc6:1:-7Cz/~T eC%'Iq[M?8@:MNɬ۾V2 jmF"Ftz }ҡ}QgA͒=!n 0~isɎe{KcYq}%"&tv:uo n)ƱrTtF ߌ}#@H׫=l֛LAhQ 0~iuɎ/. m)A O:T.F"F:fuCl^wȹĖw+qCMKJv({bW,k:6 羂c)8Kcނӡ_;N.l֞{>v@f)sMXdܾ#c/ &ǛmLF"F8vm X6U׀ƪ)nЋ !i}m~F]>;ԺismRzf<dLj-^?ňv8/:d>|qW$&1:]R"oټ`aEyJ\Y}Z ,1kDzS^T{iSއLŽa%\ޅ!lf4 6z5!%R\`ڎ΀~[IcYğ,v x{3tżc཮c). 0~m^K1Ɏ[6JޓH,>謷dbqm}UMcy;edt ;IFNCG%m\`@^Nlo!u=N+پ;@m.X?vzfGNwtx#~.hxٟ7;tc4H՛o]'B6uw)ƺ@/Dmke>kzWJ\ϟ`,zwu]HհN$K[g?_lkxDߧ2csbZtܦJ磎Fuak^1qd=~]=+%}ڠqgh0 WtlUw_cb&ݳo i1xDso52|lg0qGCyXMfttQ6Ng"D#V&wd#t} -Wz]x#2z.jsx|i(V6UXč `|.淠dc;{3fb?tjN:ҿ_7R<4 PEaDB'yn#I)0agd>MmKr ɞiRb?Og#BiЀ$Lx4Ŷ_6bqh9y^ ?M|];;\^k*#&0r2~.㭜~ CD~_IsI͋;E h_HHхSVqx{qO @7qd?>s+QF.lM;@0o65-PW58]uE$[׭&?!]"Nz_jb!V`b6 5NU X.1qdZYH6%[FHml*(vUML*񋆦>o4C8bS&Ϋ#Y@r^4qIVmbf%[IJ-WsK:]XW^1GJMľAF.=d澿Yq][t}`ztNLd7 ғſZ_,KSH#? >?)ؤWO7E"8Ţ ۿ_s5 Hl[}cШ>ϋj[{(E`^e%Ғ̼R!iR{K Q>z+pbƠIWH>./5Gqd nhb1I6jJvUhש5q@(R2hrdϸC׺l&&fikKP+Mѫ/lq'ǒeKX-. ;M ~E$ME nI6N|MnX `ZZ"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R$"@R(R:o=eH ")+H ")+H ")+H ")+H ")+H ")+W\#IENDB`teeworlds-0.6.2+dfsg/data/mapres/jungle_deathtiles.png0000644000175000017500000100317512140200333022041 0ustar felixfelixPNG  IHDR+DIDATx}%UU.uuŰU@뢮JEE Wp% 3ӹ'Sw {:Ng̀cY" HN3?^+Su ު{9wO—Iggg.t_*Q0Q|(>/OTOp'|v?]HoF$/&^9NkS I_fP4)Yg!Ns+nI =F>T.|l~NB=tx bʮn|ӞУXಎP ~Z2LɟcL ̜+'|a8'3{|e Ǩ> ⬣:8nx+8^\|KPzJ8V{͇@HM\ 18ܫAiy1?Qo؋eςcNDwt%{/SPvOs&VοL\֖W AUVqp\ x)L^ Z_fRI*2 _̥QObD9/H.E} GDc\,(%&.CdGub>Sƭdz9q*EK'|Qeho477Bqȷ SE''|Lb!R+~n'bJKk+AA)|26Wtҙ|—B)E@L%+^D^LذNYfJ`D˗K$=z;-PJ`hK8w8t:,[L'`9qcz]imm} (ZοI_,R[VpTnb*O!|ɐ>2P1b1H*0ό_^szf ((TB/C`q@W5R3A/R'\k`: "6mo,rh" @rhC Jt?PsUgJ` Ҁ=cٴ!ORtue o$|`PtFd`G)҅S 2<H@Fbi R|(#@PTR _|)0ݘO NjD3ƏRovqX<"ɮ188HA_K AE1$ g% XbT=K JFzh@9c Ľޫ@ E)^Z=[#.^oF$ M޲Aj^ ,ZdfT:'|)6sx@D*h4* 6*RKJh?UÈՂbsvEbWοY ba4tZ[[_I$p_0HH?_tU-N~ p+ rBYѓ61O]zAxE0}D|{sT2L}‘>1b3#|` rAD"> TTp?'|$שihtwwP񆡑H&^H)r}%;OG,Ci8(@P1y:)ýZRxbW,[%UΨ>oG=G 7sB݊Z-ea57H IH4;pW,(6MX#:r2 @_=urE9.b}L?䂖 TT$QF#G _|)0n5tn: BȋW J)r}҅q<,(T*/3UœA`hoHy"~P #YYu*aoηv+.(7+u7IYvq=bm@1$3PzhFY/4‘Яy?[o:6n)a\ȌN$j (S{UZ^ޱ~ÚWp`\HTp[~r0aq%#0 pb9nSJ/.ܚ>y`E3QN˅+VvNWwwLP1<g:z=KzBLAܛZam\hy=p+ShrO+PF7*MuI}mc/S"$@lk&r0} ӓU^ftWBE# PSe 3!76 GVo1##b^IgҢ/TI2JO} cL@S1Y G &iHPFJ/. '-t9x lbF]I bI"-8?@tݻaMY^ ɀwK)y-jރ!X(,%X!ܐBN{UC?/'a=lUܝ0E IZl^G2ehh @Up5;b655)3YIMbe J%)7D#\W,ENO2Uh1 oiVRl$o:xȭw/뿭,&Q_x^/×BN/w@{" *܊G ej|lذޔߚE@<߅[K0ڕJ p^nS9y ~!`rrC88u dž{ %4gŽ08Q pWƶ ): tJMeSaY2sZLeFI&;`V+Qw3y8~ @LjݒUu:Tpd c38N*|񥒅锾{t~m>W5ڗT~+KLTG-WLYYv_ `( hi;;MT2 Г7FC;S7nޮ8>E\̀$L hmm}5IpEpHԠܷo:O<Ì-1E%4wߙ- ǵ  u<TPxO¼5S*r`AKg8IT0k tp*0gyӈ*z#H$JX? &Rrb!|ή۔C+`tg.VDTP7`X@P/,>_926 c0}0 (LKL`Br% ?D!Z%Pܐ`\wX F4bjθ}@ 'S6N`+:N| 7ù2 -kSQHY!pO:of ;sCC3'd.Kqzya|w[^>[ ˗)"CCCT+ޣd3ذAD~5ܹae~2o`N4TeF$Iv!Їb.Ju/;9 il|`JIÜTPd0862 ŗJ^!­;F ne[%F$3T$@h?gtPF@ S#Ftt ijz' Xlinz{W㱭C]9l, !`^!v"px. .IdR+^:A/rDžL#_tvw^T A/LV2w3v`<@d 80;<1< VF嗞kcX,p#eޠok8Bv~W`RX=\&NJYf!bS86 ~;}dG`Vv$A5[th0 YtjYӧ] n JP7reρ]kEs*G.p/fݲc$G۱fD#D#o6*Dx@}@wإOĶRwgHi5_+ˆXv| Pa fuif7d4<+8>\ [sDV#gǕJ1a7_IF$*zw&:3};۴Ac8&[^|̈́t"1:Fg1H9$cQV6<F#?$.[`2IA*(4,;90qCdU]9cD µk8. 70mp$[jl@>B FI%LEg?7|‹ᐚLa4١ 0Cpw7[86sSĢ?U5醖3mV! cuZ3@X9-*Ѡ8" y=1Xl0$/^4s~g<_Nt:D| J8?(`۪v|XxO%5AQud-?g(w [oj׀HapOJC^͹? $cAa֬]5PV«:˰H=A$WI@˝FbM#4ܧs7ḱksv`Ԍ>{{a辀Ol'0N$k7N..u/&vPS9V( y*tJH< ê^L -.>ɵ+ <اک0Cjpm1=3ЀPtvJUF>>eTtޫN+w83}1C1r?SdN0,@Pp{ 4؋r 08ꍰvuHh$̀鞨#F=!{s"z8E}'1 @S sB:Y@LL7x>ZP3۩{U/."#0I?H#F2ƴ{\[BMu 0 gX:o~ T2ed>ϳ1'+ (,q+YwddD"1҄ih}`c>G5V?8<mLf~#Ѡӟx$%@p0}Z.㑡3J4VNw'x2i@JCUc h#Y?2'lx3W޲bQbf͑?B'x]c󇩟_!&9=6X@ٽHww|_]$&j,jd*q7BHqAYC>`.ל}|ndUxPU?cZ2sAh݇QƎ$LQa} :Ҙ) 1,i5yT\+v J@-Lr!^ poŅܞD;8cvÃ9olf֬.#[/3CTDϘE0ŃبSʠ0nnPO0_23RdN:KaqDc]VW d$8w\5Q8$hp2';Mo)NH :X(nP|9x<.d9B߈؟͑}j `+`#‌·g~A9px֝l[,i_0fKH;+qG*×%@2@A/[]),  f\A]قFȢAQ-3 ёp`0׼UL_yZ%jR=Fp x `Cdap؞j cS~kVv̑bkkkg }2kapv*A]!6N!->ПaҪ+}1@P!ŭ;]>77Ӳ>B'k$ @ !hsqGR8@P c:&7l<ȵY,> C ]c;@. YN`/ DBW㱽P.9`ܡӿ &;;;e+jЎ׈sH fsGB 058FKrL'Fl.lImo:g&+yHR,LOL`⟏jZ gP[[ۋn[JOx$CC=T\sE6,hcET n  - CIltdɥS&A B_ "? H23MHg8IF CY- ZPmf b$~C&I%j=;<ӏG$c bߩO0: F%pf3=Rp{a% w]n12]Lw. aE7n3u䄣mRHnk.m_bL]L&+`h$8$6Bȅ[ +q?' BKHI%u%'JGYo)J}VM"џAx' @ɰp!2g00¨牎j,ݿv3#?\naZBdT**|)N\dAo恐u-b0®͌>lD{Ksh p،g$j1'WTug'[EFC*+ IUS;|D[I7pLeyxl3ޖs1a |oLj-:$PoAc'wh  QJvA7*sˠ. |`VWn95%!ibѐ+xi;t9Zʆc;[>OKƂYKCOrӉJ:,#J k׬j˧AE)7>P0Pv0lbgWS.%[ s$>@LaP3Uo0#,*=/dGntfT0δ/LJ(kQ33ۓt+AG6qp܋fY >hFZ+. E\,dI#`w:LprL24XEna8\3f8w&'"r dB2۬ BLu>+cc=R[90K{~cLe䦥%3)ך[kύBZ&IcFzmdA` 'Դ 3Zb'>EF2$ @P'J(?UL1Xȼ^8}o3p>}8Yn.nC)L#DHJVU:K]ݙJ5oEB!6UQل3D APȍjFᠠQZC`yv%@P@?ǁ1R:T1_)wȽ{*ܻuP=zI879g]VViLrA9.,ܪ4 dDȋIf}MT|,̙s0 Ol!d/0X/M˛@wf>wϟo #cPm+W +)Z/Hq3ɞ?_dN K[(0*/\garS`[ipQu>̬Hb"1L0/+ނ&S 5ܒrK m򻡱7RFڊO_zXMR1+'kAh4z `a,P( Z3F#gޒRLJ1_)r/ZZ9SpDT/9  8:h,hdzE2.̄JPw0¬pM Oɼvb޴,cd{3:6]W ^<$s=ˎUw_~‰Г.}12{/ Ʈ֐ ("dt:~qΏ_WD?굳3r4~[(ʂ#0l6Cޚq@`(M($ d gP9U_'{SY\Yhf$Gvf+A\Gvm-3<6~6 ʼkF͕FpͿѡCvxiZtI:(|D/y<-8YH<>\X p6?€h J;s5@PP 1!'ecA[ĺuSFx$*#tնm칷W}3uWH$\tX'lP`> ^XfV8:+@F@&SN*aILN;ѵzE9ZJ1;?}DP`MmǬ!1PaԊEVt`5^NfL&gpVk`GicINɈ" qߠ. |+ =bNL@a {|i8a/!*̳cͿR$;G({ʱ`<SL:˹#Qʂv:4#W 'q7)ܭ-I2 (,a[qc[vB@xxFc$ ~@v@<׌BbdGɊ؂~bU`xo$$|Z5z7I%N6ܘ$a~{){Ԯһsus;48k# ": Ռ& +aFzX݂KB>?ʦmx~Ve +wʤAB&rEIVw9E/Xm}rp@[Yw 8 >6F@"80r%EbCWWlIiIFv(0ZF|C4#G9GY0 s ~0j[p1`alVvٖ'Z`lC-⋋9A #J! s"+A!h۟*7Qi :=V2wmmN{JyḇTqnLW0){.@tJj*:Sd%(~vPւ&~.>Ѭ˼pc!Y7rϠ%ŋQȞ*@nk---Ga=M.@F@&Vps1ɬ8+tpx 8'@^XH]vM)Q`d.0.;oI[! C(Û <:2 | J}lGU'B°FکgƪuhW6<~#眒Rsy"@Pn8;+AdtCZK.ms=UJ-Ң]{Tv>)  .H%`BW)niQ,lD}} P*;-Is`kЉdbEu:r竭m/.]TW3;z4̯W#j<N`tڸ[slWOvV>#E|#ֲЏ Tpy֟J%~q"ҷSχϤ';7Ȃ26AA-C!rPcN0a*K:.Sb%cnn>#XXҰF>ˎ.v T0>5 ~Lfme{N;<?n;&K)&瞩+Em$}n`)~.5uIK#+ZMY"ql8Nu 8!&Sa!Ar踿"3ySmW|;ϋ/ʧ4o0u%UQnu &Ņ0_c}:9Fk&)?<kX=[ #Egʴ톶vKww "sv;(d|#@ Cl_.hO{FcÓSnGH6/J$r c#v|wian4y$d:( 2#k?& #d5^0ķP vBslϥPCUv;;-i[xħ+E2KGց"qkSr%fk& @g3NBvF#Pe,5_= R R<}X= 3cHq!m3])Ce޴re^ /^dc;nV./=kaF"8ksCƯF @Q̙;쟏υ~'gѭi-;%J- NdY/L$)0C(gA[6n(POOcbefÌ$pwAA9/#;md31>'wt@9r>rK2l1m$  u{}9`ͤc SJi!|tU8`1-_)"uڝ*)i>z/rK񭥼 @^1"D9xѿ@iVź:vɌuNΝ1s+!bc:B/ozL&qQ8"#4@~ףe]ަ\S_g\ v W`OeIi)NiL&-MbMFh)ovJ7"ݍpiV]"AG)E+rE'3/0Ħ,h0TV!5f(0nJQnGț/ ]7ڿ{dKvB1-N.R7&\!ƨxz?GBG493%9^MmX%Ѓ&Tt"d S* `T bK_V.Z=qvLO0s^5jlYKIf\OqN2KiKߟ(؊8YOQq 1=N"oY~ik ճex V~/7 QO%qL%f#D@//oR$  .]vr4(_̙ٳp/:N]6%xF$Ǟt ZCFA;Wor:K cxalc t _{=GؐPCBɈt&ZdaqgAH`j*(rgSæq`\iuR-}xQ3VL1*3${g:v F0r Qx aӘ6X5!(m2! 8W`c~IPV:F'+ALsNr"T sM Nz@&;JscU$@v+DcMō -ȇ5sc7&$QS:,BYZ! 0X;7>ayI(J27b9kb7D$~hScIDDS~;|ͻxfR"6ƹAQ#j0ULa|,gA;󈶶6vO?/,0CV 6z8.hha;9w\n#w*oEfnpW!C<5bY= NfbJ{1Bo'a}1HپC Z^ ^*Hί fr .\NݟVf-=NMqJscr^ڽoҾz6LYN]\PH;YE‘rF?ͿY|ƺd:^cM)3Z="hu]]ʷ?yP|8 `73#s±@(^NǍ&J0heq?#:E x")!1YCF|=Jh vtw!A,ausVlEF<)NS$5@PPapGratUDE_ *Y;kQ]Ȓc`42օ=3N,ǂS/p;2 6g,R!xz#@uugTp+WqvLWLrmw!#^*&̅Hꤼ^Y4 d|!T|#@pA 7Pއ&=k~j_y?*?e߿ :pxmtrtS9L CRG|ع{ʥg:WsrE|SHaG85iMpU+oľskkQ;%bڅ3'8ϵ#VğV`S[U^ʘ|h,S"gYC IZxl7@ QzzzxgA#rZ3)l/84/:q|ȖiToh;^zb2e֮  NNF}iS 9BeLv wd#,!HmCg+`pڮc{R i9J \F, DA"0q., :)Wݺ4z9P߱], ߟ8NgJ | ^TP/l v;,Y2?V_>vٳn*Coʊun/[<p%^gNU8EAs%$%+5mU/qF`nͅ+Lm: q' z\/sҦm8x t-妘0P] eg_ ͒ ) `W 7|Cu/=kֱ/:)ET©&gH@PQ K,eg:!zߌ% nj'4ZBYKuә$FϨS=ܭJS=ZW7-_wL6 xgJ(ܡ>?E$S UFRF7ޱ~^z[㬭=8ZkX($G4+`޵TÁǩX282E# `xx's{J$9N>_A<ؕ-]ȴӭd ^܀R5ZlChro V#>93 іd1<Npe\v E>afwZw1ރw\ <;0:ߝ#B{`/شPX,7`9:Fa|}$uR0}$^cX\ȱ,; Ŀ:lٜ9Az@Y;_B_)Y<ީ0 '"|W,6l_~7v[0%ɐ |`Z ϵ]w/UjL TUl,X"HKK RֿR98V&|j:Zcs `ChiiV#@G b6,WݽXm6R ئ4.WiRdB8F'y+Vv1+M]vgtT/8}ט} Cx10c3 mmx)K8},F[Z:ƢөobTR_ "nD)aps9c$c(zl2p%qpBGRX\ m` ^FօAI_[Ytν Egq͆á?+|.J%wVh *X$N_f3C=/Z?`^j:8ԽTPm&6d܊u瘮G!XaL 5rv;'?QJQCCv2V8֖e^3c-@#%8)o NAFa~}$u^)j%rn=c|9FPqY _n#@,^O^ Sn+9ʥr#T+lPVۭ^dnӦMovءxHk'tEhHLk2ЍߠfnAgysXEyfa; Nq38@̭@ 9&9俠nvO!Un;g3FGd:S'|q! @N;Z^dyj뫔) WjǙy z5?B@dh}9n)ao= Bx)4EF1׼J KY@%hqWlhSԩ u:bs5S]#\ A Db8RCx>,u R83O;󢪯 IFU߉`zcԽK7퐱7߼o\{l ֪C7Gg/.ٕ9)Zzn#JYHIp4g4ދ뺺v>_{ Usdqhbnl"s90U>:z1>r Sđ sI<(F<$j~ 젳qNCgevl:c3 +،"@(xXF%K.?tO&`{JQUI'C&z? 8 ?=r*D܏a[ضۉ߸Fp>\+m?2fŒR !U3dp$jX7;vER`m)ƤbG(óp̋~P/0J'wߝD.Q,`+o-^KNGh+`nհ%"DaQE8wvvF K(@^? znn2 9P@IId'qAg޼۲N?ZN%`] YYٗgۇ Z QeC{&S,62]ͼ950L::BG¡ *pjUyv:D"ɻ^*S?Ҋ{즠W94x-; -`0 >rkX/9=9gQװlMhte!aX# CM|,өFj]=\q,XA]_ p$ݭNS"8A&V@b 0AJqUݧq GB?*x`e7B(ʤnT@IwxLHE pd6W{9GYSWø-3jK7'LanI\w&8|[TϹEW*W^n岳fv =Ty'0G:' 5ة3 5% Sel:4:ޱ#rεJ.z P$HeAc5 i\d!_I9TU%/^Pm·O<5V9ed`nEIftL0jʂ0_Y؋j!-\@IcVa^ g@apВ`9=ClX< ooզ(L!}s<ssd9UwN@ܺ|c`+LRYn7c"{"adR-~ wc\oMѭk){Ȋiws1uHu7k>d*=AT/IoF"5yg ; `;ʯZ+[[oOyv>+q9)_?+ߺI_X)߻5y6vW#yf_I&+ Zbh$  r%*`qtZHIƚ!Naw-1vڮq"% 1yvC<-A9ۆ@: (V8a|i7.hXO10clxa4Y qh{3Q aKp8D">X'cb|hr&u g! Y-D{- .& aߞ7W$3\Gn񔠺y ;)>%BWzB,Y@1|vPsco'A"LH+(qlMMө0$F/:߾S\1_qNʖVo hiit⋰nhxΦÁ[[[bw}WB y8 Ƣ?K&ݙOsp}m̥F'x.vο@In~4Q/ZP/?U`8?zJv9!|$%"/f=SSWMvR#7zIn@B@kYE;La,HxM0#imm.RF庫>\ziR^Ti^b:H)II0H/ ^F`n̬n ,W\KV-+O&3;zAL0 /K17T0 so?LadH%[LsKUߤzʍW]\+W΂6w.jHcڿj Ph?3n YWw+=3|ȽmkA/x< L3N\XG%pKجMMM X3މX&wNRɛ7a?@SvMQ~}I'I$ɹ8{vCm/H I D@YmEB0GF"Al7ṯww1Q#JBPh 5rdwQSWłrs6o1o,k)^4 '|'|LOK'*R|' C8`)8PWP / ((0 ܳ|3٩N~|^:q2{sJ`ATN+XV-`?Y,X暿`+0Y"r Xx" 9mu|O-yɤ:t&u.3LB?R J|Blqcdf 󬩦 s+$u$@@s&#CR-cҐ9^?dI$- H$@MifF`AY4W Η 09ݜvYe ήߖ5' pZ'|^||`:3}>P^g>>0}bOx&88_eM0s6>)(@PPa8_p#H4U9r@iғxٞ5Y#ԙUVcCS ky;>]:wpw~LV"G+g@xvDxN`ANC ςJ&14z^b55Ng u 5_.0Ҥ̽Q;߫4Մ>KEowa w'3%!\:oq:dJ䜪;^= gYٯhjοOx$8@ξJ; 7g 5ܹ+Eg{gCБHD調U]9a7w#syG*C7M]]]Jc>d7N78W :>2>oq-c+<9k'e/3}aOsҊ+rBR AE ς }D+Q%$`tzBYs\p-_`;U)s0^녱x$Y$Yll&9^(Y u\3oG%9'Nx͙lיED| D|UY'+_仕>^咳O)(R{B 4+hXZQo\0Ժٕ+WExf lT,(; Rqt`%N%ys'Do\z)`7rՅѷ^?0Ԥ4NB7{0ީ+[$"&oG%8<X[_)鱕nL,ċB|~gW~@z\q}dT8AE$IRp$Uy(u2Fe&eyr0`^>2C{"=^ Ca<ڝ߷=2cɈv`*iAP^qR4jps~ FVSrKK:Lgby{[w`ɂX~bx̛ΤnqyqgH9o9Bt!-;د}4jN@/t^/6p3OkbsN gb{j* 2HS)$MfFI~D,O}E:dL +Wuu}8>0L~vIR_: x2vﱎPH{{֖23РB=xH$p*5+_*03CGӰmmXS"9/]/^S9TMaKdG!!:d* kyaj+:IţBby|ȝJ'Bt!-;ٻǁCMI,x2<|g2g]UPjaI!csfcJ 1y;#^L\L' D%:HX Zu<0TXln-^S9M @ S~`}v-j\̟_TWVw7o; 0Y#rqp8+k~;Ǔᄾ^:޳')WC۟>#}A&`RJ4t'􂪗B"*R^b30ߧ$I$sb~'za[I8w1&$ Gw-߿Jz$p&.hU.]4U)Uh#d}CFz ؇g-^eb2VJ=< />)Op 9 p  iTY (0iokA0 &MhpR0Ӵ"P8ҏW}rg:F߂x5k9իv 9r-o߽3Z >#݈?<6n*}:Ґ*Ib)Eh Ǩz ;pr ޯONHxE0wX> 1}|oH8 /\+mdMdgrR j}|H=VFG g28d_ҍ0J쎿 />iAP !߸gU[_3OQ r 8Y0iX|1 a*iG|S8X Rz`˦;auF|RLߦ.VÕZXCp8u||!Ѓbx8L|k93}wݮ>W5e^dI#P8¦Aꥺ%" /z"$e8 1{nH:d|ob׹[Kl\g<ldRo vfeͺUzޮկ^8@PyOʼn0bwFou4jꪶ[9Z6yamziAH+s^ 0Ӵ#n珆ngU0"Ζm 8)ʪJOzKXMw*RA5\Lʊ;N XmL6=#}QCSIs@,TB^KK qg$EyXg33Z^(.߷[%;5 6.T2;l<8,PygB`G% _28ok,SA4?3#-hBPZzb:4NW=)0pз #uAAT>0i~/D{{FZYR;FMaptmpBb_g{lP.3 @%g(MѯGT3i}ok 7z~}).u 8'O* l ~*0 vKL4Qb<)S@X-Жnmu1oZ 0RvҜ />iG0 g eZQ4w1r G:Q xiC SX2ScH JW?4="Z[[۟5x,3})8jrć_'UpڏL6ހk϶|v A#;v`*RtA/)^% R8)$n,]*.w ` i;\eK.5mm jdF9G_a$OL"(B3y[~oW akp~ SK9`ʒÞxŋ{ZYz"eFv MX%8c:x\}LsOjiD 2F %SvςI'?YRM]G߯O:ER&ΰz眬oo..߻3 p8 `7%IWobc&g2 lxl]taAdF`-nS\ K />JM5S`AA9 `G&]3Q |w5 ÐPU3XLj:XO"4GXP;HlZ7j$Cӥ =t?3{хiI/I|4wz 7ZvF&﷖WƝ { . KW캏dx֣.! eI?uS,]YeLWr2/WVU&) Jrp`(H iMCQq_HI ]μپ(KO%; 3,i~%Ҏ`(;;t^~s8ϵNϹ[VUU6]f/d_!Kޣ\!eeet8EH?v[guZe |w-ފdo{>F0/JE@ҫjե˖ܳg%>OL@`ߎ4.r@ D^^{_6Lpԉ7|Gu9^"ci4'wav2K}{F=^")"4x6xu@ρ9k(q]{:ε60')2/;Ix=z.$2mkA=FsF3f?W,$uL5=DDZPO.7=˗.]5f͚UTT-s1c.'7G)..nn @8xC9 (P/:L"P& pi m2L&{hb2<,͟.ImiFoKJO?op:s߁f\uⅸAp̠=1@Yy&\ B_5 b[u(/RRR.Mij:jQ;MZYvPꢺlnVZZZ,փz0iH/YXtՂ&  PG%μHn& R~<Qއ5t#!.`'K_ 6'}VPs<,&:FRD$im1- #)z y*]QW RP`ʳϥ 3@o@%<Vs-uVM=q }_?{u4v@!@0Y )Nwo׹:>MA* fϥ 3h #tFlۉԱ@}/ƻ)=@NgWTg?6wm %/Jp`TO/Y^8켆blJ%EMCK.aVYM}3˖y#D;ɂcYhi0j@RםQkgt\EA/h(y:@2y2b@y5f-`╮q}zEO #@˜\!P"_R-שK-0|{]ke@*ݧL2ԗ /K'* V2?56P~ 0L4@ͭ~MC^^kT]ORDd%I>ONٔ4quA#PRRPUHf&{ỵ 7: \Im}͢s-/`QO~G5|bׁCpPeKYVS&D@0+ܧzoyyzwk3~m8eOqhegEMQj}P~ p hjo:NJʊb""+Iop@ٰ)^.Nszǵx~7ҳ5 vT_vIVC.  >aǮ\@Rd@_ɼKV bc !!p\{tbD \ϩacZ,W=iGWSzy1oZgR՝kf{ͻpٙoFc5t@`_i(_4<%D"|c`_RZIߙE1L2 w9~s2FD-vcXkٍvnF(V@lzԻ/QwT`&ky/c К@|Iu<6o8p`9%1uJ 12JEe%E[ 9''C_]+LV,+/k!{!`wʨA/x=g UUW>MRde/0`[>m ?[nVg@;[ծmvuWOwڳooSonw?~M>.%şWU?`Tlp1'ߦbM?H1bDx^lT' 2Q &?ägxw ,pnF(VLsf>95lCg 5cu }B|W 5K?F NCW:Q,3pٺuǾF7|0I$8O#HV+d1hNBL_/JU\J-JM#1kju8~ UZVrb_`د;|(k׮Nvv1@.,iAF#i|J+:u_J&3 e:$Hܴ 6d\jzB2t¨u4 $`sUw?p&_7]J^Cz>Տ zdA7lh8] Eu$++S%YWn۾n8pAv^]]coNNsJ  1hI)ƚUjFj5#3óvXo€u YI}?O2ISmS[)/7yvxb_`د;|ں $PJJ4zVijܫmʂ6nk @VvIjP FEa]󏀊iCk9+Fz uv =Ioй_'LVv6=4" . Qꈯ}}@1 D0vkfB0ٿLiؗIlOnP;/#(ׯ^`k@K{QJYq@_&}?ΚgҸHCe VfcGڱEv;Qןnؼ92Yƌ`oܷ\bTר[OFw|K6N}!6Kl)pWXͿBhI~0Gh{ju7=,O 64ka(e.'ΟO.YP]|1 Hx0(EJeeqzE$)4«E  Յ,";紴I/ JDY!e;I,l˧X.--5mLe򒟟'>߫2fw p)0uyzl{CG\8^8>8 Ҏʼ?-c2_8J7ҭkγ=5d<~w_m  ћPwˍ1wS,uv&tҜ2߻Jݽel4Kt͈剤(I4 D6JCL˗/Z4eI$!`ۗJ|-Yak]kSҒI/ 2`<y(,*|B_ɼKvEb6Į񷓍Q@n3k%EӁ{4d7H̻~X=DuxI^^')EEEM-@Fq8+vhGh} K*O^uo@ GYTo7=7/p֕G+"*̇(˝>t&?f37fd9U7C/"#$рXbE4-RI $ H ]gm99%q=IX~ y y>FRde/pd%4(55cְ]ul SZo Y[^dOǓ5io!nG$n .7.|Q>|6KP0޶jMc=t`9զͷR{w Z啮%N۷oInM~o2ok#؏3+0o ʩۚЉ[ɿSO;yc[{Vz س\M !#$р#Xj­gJKO &uc?T.$0p3ՖH/ Am>Mb o̟,̻d,@ "ڲegvM{5c itx@sH˟?x{U|TUăͪ0ϭ۶0fđQiY ӪU.? @uM~/>l`9@i|W#.|H`Ͼq.IUP5gP:x=xfp0C]A͟l#0r /01 }|0K,V,JW -`3!qH^4H}?VIB> 04rR7H/ >A0L/c`+\n%=jد;| Y ů`3TQQ! Z^|88\f撅}?OsK, lOe<|6⊘ՙVUT\\Jm?x[ՎƌWw^~8G1**+I$QH]2!HfMĜܜVw cXkY0PnV̗}oˇ5BtM&]`X`;QY0˃PJJ|6vY|A-l)Ll`6@=-B{Lk ) z M~"(ToJ-w^3]W<^'^.&c8b# K.xRZHJ}bXh˘&~&i5kpa4KC3K.NR|i+;޺uOTXXTZVrJud%RPrrsZlk6XPP8J pl/<;xb`h 3)mYhOh@o}Gǘ~~@!Ou\G}[QRRw'xMq[\m0OxIN єѮ8 h qv)]["p!|m:^(P֧x͒a77O̯<^(m46\CĐi_b](Q-'eWCI+/=:Osw+GzlؔL\ 3ƶj+%/Jud%r /(*.c>ƍmoy9qtRM sL#kt?QL˴|hϽl>&~L:B{K52/ -/ɑ x@׶}Ugzڳ`gT4VWF6KݳVӵ" Y(ŏ߻{ӷz-0x`F$nz͝kfhx&)Zٝo_k2< K ,[-?MAS~򗕗u~Vv'ԖW6U&鯬doV>Wƨ2Jud%6S}zMCkm :ߠt/Ylg?au5ڝV@v;UB׵]dTG"hd_۟{ 9i2m< o xk.`y0(@b4/ /TSg{ȵgGdun"=f=$Ip_@!ܿk <>vFj2L|}h|Ȋ-aH6f2+ʗdggG;J ں.`lb4amK}KloL#10j;Aky2>ܖY[P;Y,ZV&7'5VG˟q_OA2 |@ng9 t }o}B~˲ߍicNRDdB L.zi 0]W[r=ʞ 2Aq?2/i4pꝣCs8 ! P/ PU[ZV[T\Л_jn^;YY'W^e8ȅ"3u"/?¢·ɔ,2Z̿_wm @6 嘉՜Ȭ2㙘<hs5=O6& 2sݢHג X/3o!.,|999Ǭ֣0c 7Y]/HIAi܈W\҈[O>_'ϷKpu}1e>O n`GBL%e| `@)d.AM$|L;d_p`!S_.K.e;W?D]t2,51/?O),*t* /0`[># ۷hAP?ı10EEEHNNJJZҶNj.ZkҥK~}s&_7k TOzoKo)`weچU h=|~RhGnG}ss 뾄qq @ )@F״|yJ\G|B>M8e잠q/ܠNRDd}3IP\C8p|J}Bg05L0Cw۬9{ɷy̿ @裹ϹiؑO v0kj8cAcGy@ 40#<~\1#ohd0@kN0C;h`) sާb~3bMU ca߂i|M 'JOsn㟣6>Oe/٪#"u L7eR^^ |4PH ,)xh0sO F´|lC;-0eދtGFu{ȁs}@4fȁov6H7D_C8p?Lx `*,d(uA-$E+__smhd#P uj.%G>#@+H& 2?u$.J?ɩ?PDE^[2=^̗ jC9i'))?&NEF5k~Bm-(\f.Zm,pvfϘgfq/L3".FMgi4מ J%4 7ⳇom"N$P/ NT~`'xmN] yK$ET6lg}0`D1byaQ[Y黭Y/P$* їIx sTaquFqm7f > TV >+g~ƣc S_3.^yJڂ%O|h u}o}!0F1n\{%I%)Λrל>m̹ߠpo}Amxh#0њ] @@iYoӁmHAw w@{yu NT~`meKXZ`AIM}aZ}RE}sf; 9+$,O+e3J6%//z/'݁OgVkͿv02G ɴq#f@VF|l|A<1uLƎ(3/YOOpP10v$>p7pB:ƁS~a*?w S~[j/'lJ񘚞Giuo9Cm47&*466*!ʴ\}}꘸x2?^o^OH@ W@yk\3F |Ab x&*HTlh8wr@u<qt/-o ']1*}a!:4ԗ{lu&T}c2\*R e*y6&ؘϏP_/\T|x0>Ft.?`0ЗevL[/=+ 04j Qq)98 S~Hc~.}a'@腵XOzU_ۨpXp`wlذ=v cHg\ׇ t H+9%#3n7X.-r1 fvlខ1^lSp@Nb:/0`[>0-Fr}vjJ4Ԟ2m4r}v#g lCLzvcl'~sq#7|/B?4 F9 iT;̂acAiFTghρMEa]-p5P@ w NT1fk-!0Z70lOQH:"ПL ab$n)d**q??zMڸZIFa_G3 #GT} oCڿ${zf@#l Q`h59反˜71gk-!rEcЮB\ɲp{6=)FE&)߭twwK]@6#o ;ƴqqJ c_E?w;>n y%"4H϶ Hb?L c!.,&pDFeΛ3Nv 5ؖϐpwmg555Vڦ0j+cvrKjht"dfeXFgg6?}L7vLJi{AAKC~rp Yxn9jr9ob:/0`u@'k=uFA7`{>XeVhi@H.;S) Pai\Ծk߾iϞ LC 칎>72|sYCy}!c1¾FhOpp}@hyy@ *d蕾~f@&Y1O6C+T> ]T]{B&Z1ۄˇfw Ƕ krX1VS) p@R~/Kp+C" { 1Yꘃ<Er;Z<Ӏ2P@bM(^Y n;< g>/&)L /Zdfu$b  ??CDmioT*K")Z3@ĦP/80>ހHR& @Dck)jπO ]o222NW*zĮr`@4YghjF]/L5\s4[m^0WZ62 ;^YE6 65hiohjBfM+xۚI̒Hժ\Dca|0ռNӷK=L}}zzvAI }ᠺ첲25(*.+IQz}y\=v1(F;ƟwTz7_A#p"wapBipc\L,; 5b!Y5G~8L8h>2RAahhq[dmT},Uw;0*3MKkF׹Frk%mK&$xx퉗 eQ: OTKE=3mH k[Ts"t{2 BQ q 0ZM$kc-EBk4Fϔ]RL46UXTAI$(iT]4N׫SNtSm2nrj2Fm4vZ4UĶA0 `붭lx3|F@ (6+,\77ID,OFkoٲYmjԯۙAr;/f;Y[jANN ""z)[3/լ,OrssÏV[>:MC~Uo̵hs'ݟW_lYGRyʦkuó ݧoꈰ1v?Ctz(^FRu1d.VER[|`ULƶdpjkWÏ[:w%5-*~V;@^fnҀeZÇ}{'};$=Ib;[6̼eee}@RDe5Ymd]i@G;i7}dߡ2L |v̢S;o{({ #SAa^"*$cI? \|ⶵ=9fHǔ{ml{{nB=+@X1 cʊ X:Ì5$)"2J}e]|aURROFFg$ET"TFoPT%z#wnZzu!\G^oU/;G:&\1L͞Ϲ^XukKS|u׫_tOWn>^:}~"#QZˇPVƒe'BL*!?4-9ÿsg+#@zaP{wx QffqZtJ45>Vo JjLۧh V[]zUUӺɷDXI؎{kk&lηZln}"9$D#ï߭-774;wJ?("yNp0x I*izcH*g;>-3u>zvAY`=r/[俹 zzZu8IRDd^66u 'ЀIII9îZlD$ETDj c]<3uixgXˏ6>uyd{zezמg}d C:ki@zv>܎  vѰں\ ?\ZhѠSP0Dg$d̿8Mh\jӣ oSAavvwx`v kI)93fiOkHQD moD26i(*JmZUznwϵ> =c sڊg 8(JXFO} mƦ::d OݕnD~CT'@<6s.IdX}r dvo OwF"@`CAh~xYK:Io-+/9j VWry0a4_T\:"$s{G_< 7 9 m.CsRGI=Aj{ٱzQ?:␠,6`@Eژ8Y}0eژ8G2!6wW=Su>6M(T5o|[oV9%<,JefkⅦ*X?ȘLA6WѠvQm *mo-PWVΆ;F[N 1olfaq]s?{T@3Ǯ+B2ϋJ )z"&LHs.:5SUI (*O{w0ڶIcOd4ӟ>浨hnxÎr+2qE?@KV!>K `/hST1IO'ho3[`;sY$ })גKSK+PdUJ"I2%ު>j-?T3\:}M9p0ce>8 !ӛ=ϰlxPm9=O<d1`&\f~֬Y#3c[iiJןQp?ml;l`}v0Cg7FyaKLU4SpL8[aQauS۪Q;%rm5T\܊ǵ_fK*9BuaIł3uLv=1.Rdz@@D0;Otxq;v6hbYn &W p]ZiYRRRhכ\TSSaE2[h2=;~kζHA{euW<[PF}VdI$󴷿0O؝A_GvʨzΡ ORD1 e4au5g{q s_N?:xspa/) /{,i뾡'gZ="f˲;uP}eee_,--9Ly $"6Iӊ633[ma0;> XlH[@jC`%mO;ڪH;R Km5=|E~ ߾6O4k$o)YkJ5] ][%@%;'Ͷ)D{!@vG~G /zA͡@[|2$+ ''{ /&=v`k#zVék6ǛL]lvUR\kdbY˗3rc6DX"Fvn^+1xVh|"{D qXL{UJ"hEqsf 0hLd#cU : £s`\e$ED{D{MRy} fV@v[FMvQT\.b{͹ːemNT?yl:8sڪ',s>`P/pSfED)mhJlmol6wSVV&ud;I^hCR֮];.??}&ӾeD~hE )iXcP~,sӦMa|mիPRYUY]ߴ7% ftMfKV.A&\Mv]I6.S 4?i{:1#-/A@ Ν-yA^ܱ@Fh\k$ ((*hG`9Y0NO;6 3 > lqAU"" *,qyѶ$N}2zԒ5?VV$ETd:Go_+,,| ްY* jZhB1p<oNq>-XD0r늝vbɜoVx;i`xy2 kO.3[{Tn !HM|fh ~wlaDBݻc?t~Yx4]g)"4yiLmx>=bѼpuwwÃoWw IUDicGNQNZꑺώVoIWLas}z}W nz#su ")ħSMǼjA AYy ug5!g1Va~&(U ZYq…" ,6 סjM>"Z9:` 穩oLI_:?%I?כ,93?ٰ)w]ucgWR`P,-+5jAY$UVn*UUU >p?<[gRlq qp]S${UXdWaҥQzfV8bR|@[٧U/  l*1 2V=y(5صCT?^cɃr֒_Jj6{:**.'Ʋ: qHcIvo"̿H`vYvv"}e5K w-~?KD$:!s5ژyz MԏtO\3G}\'{fAm#=7+3N\,;3kmoQH{~x5Iw@! hioX@mHm7;.p)C EuE<򂢂wxATlۂ@c_>*LBJ!S]~~jb_R7 2TgvCMN6Ҩji0*_7mUZ)߲֭n`ox8 ^"@IWlk)ᎷJlAƯ>fl>!0`Vkq8$ԾM hx47kUcj #>z0ˏ`) g_*" `9o˽}Y~YwBtF wpN]6H{L9ӛx9MW]A­$tFqph{W.Sm9585~uoj\ܟ1^*@"8񊶎CF T Av62iaM|}ٲewJIe/9~`3ZkGD[ ?uqgw{b -[7>P} Vj7g~Gy#}X 0Mui2m~ :6Mt1@fbENAAmڽ# ׈],kODwyrA[̛yr 2a[' g䭗+O}{> oV!ސz"`D[/ TBo_QIV72[.B}gVzfM7ڰl| GR ɳ_8 h K"IUONݤ=l0róCTLku-ǮlL{:ϖ2QY̔?1jGӞu.f ')\mU(tq|JqIK| zp̜5 R!==W)iUS6/i1 )o,eXI>nZW-&Yhݝ3% 2觙kpk̳2%)"#If* [!к Ss"k8+Y=oo=tbcQ_A-}=2ڊokgD Ȯ!\H//`@\~^_n){*eךYG[˟*9}?:ӣR[ܘ?`mp@Oi+jf>/CkZ'~]O\3ӷ7!!@Moo6 fd˗/cSJS|ۣ7"c+dܳ *n҂q ivPEvEZ #jFq$ K:}ˮ]*`ة=Yz:=cҒ)yt]w秤E[>?%iԤ|z|M8& lGb;4;/DۻSTwq b4[ ($jݺl金`\}-Y1#i.m:pdAۦ^O<Ҿ=b?T&t $Oq,8x\!+KDv'`)eךYJkSmpߵz `&.S~]=']53G {.Qg׷W>\3S騜4<Jp:u\?#ÖA۩ 0Q[x'-,ܒ"_ޘ#$:yAPtud4jWK,6lW^vR(S+2o%c{oزTd.RuQ$hUkkƙgO hoo`vl J0jb?@kS =˰4MQvBL5#-xͦCN]**J%)" 47=G`ZM68M 8OǚDb} $>Hdi2ڭY~Cf:pt/y+Uhw$[HzRh@ϊ}Ɏ5A cZٵ4y`4pW^\|.`z NƖ>˨-^tQGӰҗKm| yb?UtxcMW{ hS퍘e p6 ZGPXQ?U̅ϊ\S W#m4yvu vIm5Ɓ ee}X2c%h *:<Gs@OYp@ @eUDRD`Ƴ8El͜ý&"; %fh Mٶ^֖#!;-[נfmlb.zhv//ˡC?.zI3 YkIUIo4_ p?13Bݺm3R߰M9ARy#' ]K{}"Imي%Fma)sE-@bk3kMW& 4~labn۪naەZWԴA Ȥo/X8&A9Cܥ+{tvu6lOu7gFs&h`6B|z枫n#UNhP@>*+s}ǡwu},^)#Tfm`j/( j08q4Hޜj{z9fh ־te(g="?bc,ڱlR~H(ػ[V f 5`43=;4/SCߋTGR_cg~ O=^g vF?` -)c@jDsF:nH5q0PS1q.sLišQ1`IC -eoj.6 =u.EFHokj*oA 0B]zFę0U_vv4J/sBp*sɔ]@'70-,HWc$m-:6S_ךo1*z(_odTcV76RD!+g?#1ܧg,,@RDwGTi702fNe5 ` "";ڵ{1z, zͶ7Eg-B0fQE̷,;ILŖ/,5E]Yb_ iEt]$ETVڞ@ѵ*Ϻ+( e)(Ҕԗ BI.ֵϹݗyy3/ s>'+3g=սܼm88_Z*t*ĀˀoQDpk N $#23M)III'XǏ+8PHELkjb~mGΜ$\l 7$YG0..TFBW@"fU*|.1S#]z *L[0+n'45{qEk#Ow4y[AFj?Z6O_(EpLii;haJE͟aH _֫dH<$]CK| [f|׀'mD@t'1H"E!`55yX5v~{TPhhPBg7(݊pU 'S1MU-?HCB<YYY7;\M(P;U9 ai#a|S)p&:!YY1[?1,tfh{`{z~XI),x8{'`(~" `᠜"#.>LOߤ|/-.\XgJEh?c9FwmCq6٘QZFW2 βr-_|YR} n?EGGwót)/P!+kC}sR|`S۰Ǯ@_~% 3 !ĕ(@(1@B-|tkUٵ^wX݅]<'YPB @@I#e@BWM}d;w=&Jꖁ@܎񉛫HyAY؁h6\g {x&ؚ..6IpP䌖 dVn٣0<:V;;)] ɓbFSX RWBnr23XiQ%0emك2Ĵ>p'okt {Bcnoݱs;3q|)~۞=kJg N,=r[e α9%” _صB]lܺnΧ$?C'6#X`i{cnsk#d#$%%H*!+x/U~"PƯ"_bؿ 1^")IƬlOj#+d̏"Lo _5Dg 5q\Se>8þcOSRX[1'k_Os~~c8%H\eN!XDIP-08rߥ"6 3Zl᱉fLoa>O4gqMR*{&ٹ@3N$#" `Y=S xR)9S o~2ưykIMOMp xy3)s r)>5:7o5@a{(-|2#U2#ay+A51/p"/gN&֖'X /a}aZRhK?," tgf0Σ3Q/8!J !Z#j'ܲ8/VV7^ec +LD K졽} #vn|)SIV3oaO/_u _4%h#=+)Ԧfܥ  pyjr24) 'աdѿn|0RaiشyP3ثuo)}ObROI0dad߀_dma?p08wi7bB v뉐2a?3RRS>g:>kppa/Kb6@-9n2^;%wTcC2WN5c|_~A._3Ot)NI$yZW$;|(Jg{ׁvVRb!Vfs}LIKpJ)Da8yU:Ԇ,Xp keP?{pϠ30^XLTj.ۮ׼!/'Q/D+ xN~"Fm]Pj/zfh՘G)  &xo2LvCUįoKN${ &ېI唘e zes_Dsb2oguĒe;؆t\g#=?9d};ɤ}?%o~CfȝkӚ(9W6@ǭ?/QCf*ߤ>;))f҆LvΗ@;0\m- !"9$ 438]pg}g>c~N20dCT@_dǁs#.Arvte uĽl:ځ=ҁN Bpk\hIM"|:iؠ@^T7^p`o?|,Aw[^cR"= ,׋9VTTQ*h)(L8Fȭ. K|?0S(gERHEvŜJQad÷Y-[8<@JSWnzrJ=+'!{#Dp=THP-X';<. ,`Qn R:v\+`yLe8U(k$|XJW! 3/|Vr}{]J^I^=D\L*LwS:wH|~.BɤmΞȼ' 3$` )LڰDRFn@2{Q;Xy1 O\aSuuY? 1ȭ]+ncf~ gPhK=}|. gz$eE{2+Zlu͊*}ؤA*'SG^ċ%?p<ל:}nkJE gClK(w^ohz3.o8r>FnuU(r\im}mq eh^m*,zjM=}i/I 9`QX lCWg=B܁Bu[g"رC|P.i/Q9SI 9T{kml 5伐+<|8l1*|ְJR *¬} Z~KoɝkʽSa"?r'Ƒ9`?(*^',qHN4p\$cx{nEyKX s9~(LBrK gϕUgAp08{UX J85&D#&g^]Ce@'"иOP,JYz|-D+7~kLsSle =|KB ɜ;U∈[*ں⸒2 YRE Ji$|kа-G^|~t@C(4 /ҺR9mQ}Y皙Y %{JC8d/ Sz+Cs[c*͢o -5Jo ٵ64א]T1/ƞpBpJ&SF%-l~F@?1CDp7[8اl18Zjܺ"ëɋ j& P "''+ ==m?L r#P &x,>t@@~]s]MYT8!-F p{  && " gW>.1C Pi"ܓ,2ƀ!O#%F"́oɗ;@~A) ?|_svvzts) Aqr@ _ڛ/!BV,浊:*v4):RfX-9b 8g㳄Lsl7[8?p3[`pbi{ o Ħ͛b$a se~ڸqt~k+Ta1DR?pNr8~W%H`ב%S f*};ЖIJOrAdָH%Da rb_ 9G|ӺZLJpwVvV.h-υ`G7R @ހ]` 0Nr  ($f¸Jf{}+FHfh7!Xbzsi#ߔSDTX(vp.?ߪpӣ' 1?bT%8"t4(Ň|rRY]*H%y,Ҿ`|H ~ry/~7q`w¼ o~Dya->3`*k]E;HCHbƔmܸ$BHLJ8 #l p(*.>> օ Y@űWgr+(4U~ec6HԴHV#fāCQz:mJ[ٖ;74l2g/XH^{q0kɎ9) |Qd90ʡ~ ։7,,NL\ q5n0۶*¢]49QQ.:.HV/adܣVicn\QA帏 } Qk |_svvZva gsKU0NL !!!wo|>c08!3-JfuNrdYpE)a t؁!RGo~iy/7@"[77ܼl :BczyYcO~{#JKLmݺkhl$&%Pq b4RI2-MKe7W܄I JŏQ; ̥s~Bopː a6}5zOj>w%I4q^Y8.אY՝?ПHU|}g,urB2?m).x7tm|_*Xi[@ྸ;,%(+ʧ䎡JdO Y.&\RIFk^?BDŽ~WSkl"&7%+S; 6-+:S!p9OI\}ɖD3 L3G,҅`+n8EP*4W=j*TD( Wf 8o%o$QOE2'& O$/O5m!9S9{pO00/E1̘tr͚d:>>LƓItjkMbAF3_߁f`|<}^ׇ[Wœ;vn" MUJǶ|t&RsL}PJ~<}8~ r^S]R)aȇ{z|(Z12Ss x0uc=~y@f#B4]p+7FlQs60^_ XjU ?BμDŽ7<4kw2{dߞM@I"|@X }W,>k/8"(b bjœ 09flwi,؈+9xiSdҺݏlY2ym1k;LNIܮ]|";7/++}.nWíGp}hJ]%((h F:\C2ݛcddHF$.>ƭ#kcp#E[qΌsgMmJP|9"0OՕ@!8r$pb |ֶ `+OP"&52oC=L~>`\XnZG=[:בWG$Гg 3ToJ;98)l &a@""i}a\EyNqBs>I\gZ0Rok# FЅL# 9o,xe1sfX5M_ JC_Đ Kmb,_ bVYS)rTTOб >;+O0 *Uھ'k/k"5+StfBOKX!#pypS|h ߇GDN ^ߓE.H>8=@A?]{vJ'З족2k#|~ع7^ 1tR@{ן:cW$ߙwmEy {-*Pc?V"T8T =s fLͳ͕7Y{*'/bb~'gW7|J^{)>bP>қi1 g%ṕS5W*"zP A[z~[WXb_/#ywqo?NLGS*E$=Q<oi1b5kaA!AoTp |S)pK'G qo?4+|MJ^~[ AȽ@B~ %W+}8Nώ;V'MR'ą/`g"Ƀю 7Ď&͵FtؔC;@yz|ώ]&Yʃ"s1ݳǪ؝5ۅe%xi,s[mL6&Ic1C-fu)3q@p21 he3y>GV_vBʺCCRM5Z#>fIBϜc|_ۅkm&jLC 3 *̍IXKQoȏ_96ոyِ\e_F^ ĠT JE.Ld>..[f#0G B#@&&=*G…MQ3G'#oi[TOF}MM H z/D P{qeU^Qup9bFX"`A!7=7(*>f{ SVj'9l~> ?.>ae J)(ο Ngl02:$gDSYq_&'<DM@EIsK ح8Mk#bC=-g ], ^rOnRR߃zdJ*g"BČQ\2[|8,)/]rP e2w' >5Q._/oүF' 4=q՗6 O¼7m$?gY*;NI!w9BAE0ݒE\|-!16x=EkVˮZ^pw;y ^ _h8V|)_,WUjsd4 $[;Ͳ `f)Er" "y=Z`@E iDEEJg>oFf$I"Wrr!'F)s{uWqQq/wSqu/~YBs"a;"oLj{Z-|>8 e2O!NcB_7o5g+Ib}rj)4/B_eOxiGZ7|TK_Ds`oZc,+(>&t '/rewt@7ݜk('|ii@xqNNL5y9]E"rHd:>b歾E;߶# -k_ UWSD|gdWN$˙G;[Ї΢d j=槕1(4G6{=<ԦI„{%>Q z I>a!w"2adⰁȿ v*b2ڥ= ?TB ,Fonb~:sWsrrl DJ/ {sArhܴ+|GGҌ+qz{+Eg Zֳv5 8bɂ Z &:axх*nYUq7H?nх3i,Ey '"1ER"0"_o>QO26"q$?.^=`bdGV?ȳ! Ss n X?B=_' ~?˜jTf±)+lޚG v]dw.$џ[WqK]rr23Luj!w<7( 89Hr3/~ !g9n馛 p 9 )%dQg@y!wr?@ K%YXw=%ո q!ș|qƯ1!.o1騿rlΗ"9 E&HP 2'Q`HN >L vɿJƽMT+|!m#}]ǾRQUH@!%3#RP, "覛nM.g?#.~x "B(3Chy-5y {`0i*.6tf,>}_Bb8n} Yu?)/SddfTa%'ϧqL 9;3|{8n1>Қ ^]DZ1PE'~x^aW8@S"ՖJ(4 '{G60"\$PtM. a 6]] hD}hӿ5 bʃC_7ts?sG1na)TT}zIe6*KICs iL$ #C{Wְ=}n{褿'EjDď۲\[GZUM^MZ@30I$x=y: 0>Waywh7L`#=OcwEN̛G~=S8ݒ+OocT<8G$ǟ~\,a &X^{W:`8PDM!g1,'{4 |"S 4!|l"* _E 4l91`W:!r^m, LtM7ݴ1]٦ 3]2]] h*覛n lYɞ+9kl̕TMY{{;(3b5-Ú5k( J6! $"[9Kpzɑ; 'y{jhX?~L"IEUM֭][J^=ٞx<!EE_\G N%5Q?-|R!`@=X[=gI2rOQnZJF@Ďyx9qϒ7׿ ,^L5~#bm4R 1Ck%!RWa:玤-cnF_CnX^E]N)$'FDFP`߲];{ "&&R/)ynV\e&LHH#G Gx>-|}G]{=/" -3I8-'>RTE H_mk,d4b(ked %ɋkj=gCʬbz|3~p"@X[aD=&nZJ7@u>8|f~Ԩcwy hs frP§ny(cNpHܰEj?m+}Ɓ뛪{Ftuk~GON:B֜-0snLgLc?V*lH6VOa?g^zsI _]&Wf-ٞ$s'")$? "ӗdT@րɡI"n- m9v@X[ߓ[ŦjOk7M7v8^rG#$㇓5o; ?u;9,>sFHQ6P%5VFܷ1A_J_崯4< x@CrncvQ ''z윬qN)8s9KM7tsUUUQr.x&<{0ܵ, JʊN㌰+pFHZᑡ6qN}PGI.8` ijS9"r"mɓ/m_Q1V߁S`b~SN+S鿊DK V`=~?;lf15"|Qމ>&uyp?9}8'œeOaEe24J/|7e3۔P,/VnVC f'V2tM7gZ%]xt@}S򴴴#J-մqF mddd'y*I'}Eh.RT\@P\VhbBn P`Kc1x>'ﱒi[]?4lZAڶQe/9ֱޒHzR9(LG1)yRb|!s2.]Hz*/0L4i+?11 ,ݪ*Li%覛n96mʡ!@ + H[]"V$@3"&a͚b&IdӦM+:x`"`y/Ef ?LbWHf_@&Z ߳y_|eA̵u=x;Q"F.g+\1 6""`J] y)Ǯ\O!k^%59oa?p*\%|&#"&)wb0,@%dŲd9?b_ p)z33RbPEqXYYN T:YW@7tYMup*,ϻn])+A%!6o)HC>yykȿN瑏k"Q$pJ6kG0+QrRO|}}V8>!Iɉ#֑7EŻdjVJmL਩.$J-0+]IYM@nҬE>'` ׽F .w$f6<.x S 8왃id6|&ԣqqq؄~ 6aN_~J(\/%+HB9PETSe#s<V\ֳ.B`/bnޗ^V%h+\ XXs, ͛<1yvpc=w Э#O=l~pq N)揽<$+SyLJ%%'r  gHLL 0D㘢82TfINJ+ ɕ= ni%>*$`N5LV#ضc3 `p $8D~AO={@ ~.'7R*Oa'g0 ?/炃sɿPyBGM(֋mC"VYQbeKsuԆZ[0XL3/$ :@1ñ%F 2j?Z B'p XK?f$۷Kg7Uݻi&岊b:sT$gG$$ FReu)mC[kh%U}&`t1)Jp0 >{,8|ې0WÛ}U>I'gNL.55!97ef'_ X 0 n7i@jZ1^ Z_vSLp"SGo`@mZN"s[9xUbOyj1 *ɤW}T a4'M۽pO*JH]Sil"utރ}&_kI\|,f X6o!/xÉ\S$l'^ H?wA&8A \ [~}1UllИ? %%&DRT'iR@,< Hi$Eܛ $Uع*)ܦ}5b@," nٰ6Y\;ھßLd4d/-0A RéO6W$LvFN%O d&ҸsOI|'(x9Yp VAbݭ77 R%V 'B Zb>*ߴGdHpG砐)+[E@ih$tE+&f(r$|)W^Ʈݞ)&d+-QH4b\ LǾ1\01feeZ55rM \s[-?;z?ъfk̵u5q-\;ԖXU|֥V X@ľWae(ĊKoϰ7^0'џ fXDoy-E TB$^];L$S:P7QR%$ZLYM}%{g%N1,de7~"/%48@XsV@?W"RxxohvNV'$ğJ~X?_@vv6MUy3*{bUV\eXq=%w]t˯Q( |9GxJbZ }ao4]o,|(v [=UYKHJ\芥?OH H܇j?ZGв͗tApq9ZJSS( "{wZhش{# aaa 6"2VTߣ0ƤN]i=IQiU!E9 $X* veŧ|N63_)`=rC)k J kHXP&lU(t }|'S߅,'$sƍIYDll,=^' Ağ_h7?V?q_ͥseIB@91ݴV3co2@V#GOa`YNp#>%N)TG0U%UsH~ qrsY]0=Erædߎ_;j|!xaK w) Ń㳸t:nC#@7 kd]x RaÆ Jqu\\9 p;;w;H>bNPO EH].)5^K Iiy{)т{N 鵰dQk#z !+)if&ao~Yϕ>/ @D_nA1G'Dχ% {"r~qnm\54Tq5\mk-WZGۻ~oh6~؂~lvoj:gGGjM5e\Im k=X`7@ixB6c`ұW՗S-#UGsG DŽ8@a#Pד*pK!tl7|Ţ"覑Ud0/'_:!bDz/nFR"i!s|0b'|ucYoH Bl F^o8y!85p\n{~E=\@!! \!/u><92ˢ({%Rq6r@kj41+^V@[XaybqϽ*ĴsGP%c^#I!/] sHMRҵ+?}'#8h*7 mzm.KV_pbC!|R$hp i`Ho+33J Z@_z=a!dseOSn{nM@@"@^VxCL$[tt@T"Kf]O`2A# ߑG{ǷbmC> L-S!K $Ky/ pE#C\4130?SF,]0DDږ?ϠDM' lj0ip9iH7hJRc%>*q!S6g)9{4򕚚JLPP8CP@z]gRghڥo4l%T1se+o1"BqP][j x" +n0d᱄"M"&yDF]k)/8@Ԓ4GY"@d@h뵟8\vEL{yk$0ȏ 8/?)Fi`bXc: WӁ\%rX ;wm3MMBA N/(R@hD8 a0x=k`ff)9%LƔ_~6֊|9񓒓|q@8 _w `p 4m k1HM~(y#ۜ{|sz﹋Ҿo1U 5" !0W^xEx، jm8Bv& 7+ZYScA#RX1ë ]@GV gxkn!'VaȒy3KBB 8)H i`bXbGZ~-ɔXi͚$٘x`C) W'[0E/U nBo1 2q/%~777{NZZᄄY27FƌF#]u4f{abNE Tq@8 `@8w#as1sz ir HPn!e< - ,Z3q67ˀjnBѐ/a ]@J=3C{gsSGWKc檶-@3; s뫦-br],%ɴ.ڊ&qP`ko;7 .n@ ^?=WD!\X|^<~ῆ:1'nUx<24O~,X">twi@$tȿU@{0|'@{IM}%΂u6m[ t}&X8KLLj?R(a`.w 7z2tp@34''k IFX6yiR5%\L CМ,=ӐؕTX=GD_o1vl[,׀nɁw$(>Q{w;ɾqx_َ}'*Jb?Dǜr<&kr#"!69]~"8UI{ 6y#bRV路aG'qi`r_p'}6{+KICs iL;rN>+ŞI!@bS]p{Q*]|}v=G?/z\FpҞ1d2a4?dsĝ1RBǍ+111Ϛ6 tȟnܸѮ90jy|*J57Y~~#5欀gl߱.) Ft쪨*$\tls '{jHCKgj l W8@a? S&\C!p'EC̡.t# @XHrR^$St-Bcb1:xEEEU=g.4ٻ~{,S/9d >|&=ek|d>+I{{HtC'K܃5 NAw=g|1׊gO3GD̍wl߾I (on+8N=NuA <~سqEXĿco rc3;NRr"bɁH s{Ug:#-ưjk!###5{~Tڝ%cAb"w.sⵤ6 SK5ڸnp 40_h A|%t'>]P=5VʚRMX$ &R6 p[@KMQ4ktbPΌOH >66:_Q-y(ϛOpB`2]blv౛AX+>{~[#9}\A3f*J a#Ō%EbB8yb#8*&wLܹRwB{ `id8A͚,1.`!$\0zk.pjn>*痎vG&& Y@R`ޛXx# x]Yt3߳gxHw@?/#6>aU.?ߜ<b΂m*ς4~c*1J@m+hO>bVMvE$ɺX;Mղ0b~Vh`[Dmed5k 8>X *vX;$l4DEdZgO_!?rȋ ϯoϲ@"*ئ}Q'_PPP`%_\* @40K0N+*vd,XIAYE);Uc $, o-%Ik\\쩌 ]No<]E>薾'f[7" f&q6Fб`iL, P\SeЎ/$S|]vM\4"dy^jU:dٙ1 .OwPhIZwaL /fpPA_k#aK ’ qiw7wN-GJ.'O?i@ncN`"e!yyyCo+LNN&0"[lwr>CCtև eV)G7]៎(M֑zb 6T–H!B! k*8hAx?'7 $I3Fgg_K $$&| Jh ]P'(M- M.҂&4,xއ,\s0wǤ 0k\=R'p99v;#vQAQKBJ HH?XjU*DRm2fwpX?"%E<`yCnpJ[?X dz>w4..0w7 W<[`!p/`EϊFt;ߔK M柮QNO }^Oj>Gf _/9Le{>Nrep|x-"yApp[YEk{vkݫ8lL:u" +,,]||bn0G?Ǥe"u>( 6I:iwB+`끴"vfYOn +htTJqc4mڬdJF.>)`+/k_AFI`.^~B{{y?j"\5f^Fz' +OP!mX_c'*֒\`zHDD@>.ӬI: H R#<NP{N=W䌇'|tL)G/z!x a.HN݇P.Gq^_Dt (+-~{m'{oZ%Nl[e~  j GqEQGI%, c՜߱q5^Y-7ߢ틝%<6vcfM$C;R俩Z'Y^tJF'.lfQ h.+߁%)m*8ɠ(xjy<\ ss #Q7 -@\~@Vf7KhyU k ['YE *tci?%OA}x)>:`dDYe1+ 5z\#kLr`޺56_xV;{| &BycF{,YPn|u.;@nҁV*Lpy*d^W)q ކ<6S:0]`-e $)h%E~?m+%hH[Ik*;7w>4`T ~211nb#_M#o8{@BcccOd'kظ؏J\G\in>?U{M Z^aN2\_JiEQpƒl4VՖXvEm6oL׮]*M/ KJeKo$zͼ`y:dZ#@0Wie4LM'heM&b֭ac_qټyMG{b jE0ҧ+7FJ"K@o&E6@TeC`iHp$%` d9hfA8rׯ_^o),(!\I^Ojp{^j%&b՜v b 7ZN?#_Gftɿ7/KE''c~(6 _^!կB/6d>C>^SJD$쑼ٱRſ riEM[…DU3r,/- ի̻L_kBDߓk]9;ô췉%lٲ &x,p'x &,/^/>552&&PH1#p00rN$b^$K ;oi,֧ R"&\@6}~ URԁ=ɤo_"sxJ !![1Fd`DqԪ2oikD/48N(Q_VlUP㒵xqA[Ҥ镀Ɖy)K$I{~2ﮤsk{o.3tP0"@s`1Cd]5P'~C>b^SC0H Xgm!w uU,h!PaQdCƅN|Ϫy:$Y\%\$܂Mɼϙ %7n`,v KrYahH@y R86v6~iӦkƻjJKal:H17ó5XpD{ܼlo1CMus.ȍi%ȭ=Θ`[<؎I$/I[Nw!8}mw _g-}ߚpTgBfJ-R4?c@"^]qy"@[7MYkA5Ç@Jݼt}M3b`0M"!1ڽUF`b:bHLE}&ZSFφ0Z  "JRC?{5:wo-xi|~%n^h>L\;j,& v PE?H o39> D _|.-\tE?8ߐXh%ijAfKtq7O?~;_P@%'T]bo\8;(1STdL+bb_ǎD¿;͋ aX#'rh|v4m(#I7}:[5 wIFgpqB0O^'p|?n!||-ii7Q =|&Jځr1]p aH111_1W-|a& [z΃=}ɾf}ocgu!{hf^Ig}$[ X r k}=Q4 &@^!VZ+ F'j.53 ""#Vm$x.,p)4iU/[Ų@3'p^狀k~ gplX!F~zcK.]@2ahzcd;k->flښ˃+mɵ9;]K誩O4vzR|:W^FZBxs }lF=6vg}&&f?01%IiOL 3!uC0)s^C_y{e2d}aDȹ񑁴?w+MRckz" `rYrƇV k(Ds$H].J[;6OЬ ])M!YYY$1)DFE8\ X0b|NH.-fc~znZxC}{ 3m$aR㈾Vr]LEnspw@`,{쁿$e[}F^9V|>bL_@ E.+ pi?.[LWZD<,9>oOC=o,A=y0xi x:dچ`K4!8ZUV 6AYIvy0oIIKbN&? w6>Aco<ҍKE `9 CwqZɛƢl -s F׾ xVJs*<:c%¹p>]pxGڌ^ ᛢX4-ڟN4;v.q߸pMnj3?T~b "=6xYBp Α:M9[M7G@{4$fddnDcK xcN%v(" #@pqsEЊW->4`\0֕+FFt"u$SMVt8!"`.ɿ-0hig\mἩ?7cKbSG y#Nmdn -۾L1v?jN|}vLJ2= LW4/r>Q&.(D)tӭi)覛3LK={mcZZwe1TGSlH,j a\L@ a,qŊ=$x9Ipsظx|EacUV$wN8xx!$wirɸK[+O_@{0 v'<d.YLJI;;<]V]|LPۉAX-pE @)8ک@ ޿g/}:WiYHu",]q$"m} G D Lc8>_EJJ"P $- p_]ANgW= {bs@Š%&'1|mM,A'Ɨ_h B"oۘ9xԮ`w~H7YwxDri~ ,;7;Z{n}H &gcoH0Rh#L~Sy/|=/.> =-uM7- lG$p n=9$&۰ ՋL[|b\wL,p`Ll|:L]gx[ ij7wrWkU:ݩNc㘣<Y+#r5"0U1` 81/>{)t@żn馭)%>ogr6]=("xux\ڐ]./4[Vdv} s[ "ї#Q^6r Jg ?CXdR尘M77俽w(5]hds 6̤wv^γ]gcL$@De }d*CϿx& )YVHY@HAp7t@]yt\L^ ]Љ= Z.x?tn( s۶1Ba$j9ޅ;v 0`ɕ{7k) p7M‚JH&F 6L_[5-WG{78 nϼEpA7KĠ^uR~ NdNsgFKBu@ʼHCE^۶4OInS7 |~tjؤts<@??i@OU_Hw&ԇJ73!4$1qc)#)LXw2o71rϞ3a(|l7ˑA<va`ӭ.t@7O6]n` GkOoZEEEj.Ғ%vS{]!覛5sj@7af,@nnP[[d!S_O3 Pk-phm~~_@qAoZpn^{!M5OH a%f8k-覛ZJhL@7\iGIem)#R߈äDyM dQ]_Fb"R^ulR\VYByG HYQRVYLqpbG@Blu[]pp"g%޽ D>Izh>Nm5?: v_2r_'Gv6l))hΌWM7Lp9n*ꀐחɿCY H۫ G.G@){ 0[ #""%([3Ԗ?Aƒt,Ja19.LHn9tߓ6n9jkkIQqiw5EPCU)kԿX| YjS)\hzzzWQ o3w-uM+Zga dѸ8yf[Y7tk_&'覛,? # 8mȚk+sq1gnqFUr›L_()炂55p/L΢۶mciR 㬛n馛nڎ=;@` @A[m)A`;l9 ]g\%8J ]!Q!EI'T㸘K1 p+M+R*JhU`K}s5-(ʥwfC!![Rx98릛n馛= iI[$HuMU@5"$$511v))~h:3wD $ JJGηOSu %% ~@eҤ$<(MQXd}pMIIasLW 'Z[TS9(>ֺ馛nfqgUՖk:t21yfEö B 1_@ #&Mӑ˸a)`rO9I)W|Ke%4TAuM}5ʤpb>""SQ O6wżn6mݺ"׊/UY|'csӨ(6g XQ gYZzݯUqر8(ny,:HJKHfW$ Ob zvԤ*2;Ih$su.[Ccf뼓N@fY;TTeVNj*)ߍ!RRiiI]s;OŸh1fF>]Y"RHSܯ|KXZ5niV;66͛7``Tsn.J+Q0 ٨Ɨ+jKbpR9tnݺG0$)w_poM7 åhX앵Kr6;59RcgЯp y@*G9DPxc@,b^fbl!@X4uyc]*$R::$ Un5ITSv |oU+^(: U-"%@Ln^DdĹ䄱lGR%nX@'_p " h췧$'s$B7ϱj,ѴGdr6)̍o$s&"vԷ'&di k k$^Ha87\1:&@6+An:&YFqnSsuG̪Lw5ݞF$j}JO)-9>L `;(荋x.Da[4v*0On+LeAOsOJJzQ8c +Y |HL{@BK"@~~7MEC\ ڋ9mTi)x 9 ?Af%Og_<ϜeRnkky)2VQsŔ`$p<o.Γ%bրŁ#"m1M-;:97PЄ & }?qwOWZr@xz:OFVc+pc]jJ?bzu'R,& RrOY/jS&`R@ S1M- ӣݽ;;*5T]Seb>$$䜚]DO2GvRSSD)tY'` 'Ž{PL@X Ne47p"s'22}Q L!yj Ȣqqq2EM EvsDhWG*L6T2llN1 @ځҏ_ @eWV@Ԓ`yCsMjܥE(!cMtkxد@a} kX8>9Z&m>죢`Q Y['~1.}6˯Jo-tRMtbMth5td&80S|ʆ)%YK؀t_ܱv۳cŐ2DӪ]K)Izpk2q*-'- zq]H{ٳS PL7pVЏ33]y$剉w-TԖ*A"/&C٬ e˖Z-򯄠s~asFvݶmD)lə;C/qe ֌Kr<;4xޜ$ ;SE&_~ǤCΝ!P6%~7U1UP5k v A۲!b56s+w#v~z54;ʏ.ۏF63}0$|Б]w 7| 7}ʚY-OM{6zi+ Wt:nOu!Sy+ia\f:}5<*j"ТC!V;==Ƣxz5UۃxϳJ5 Y{qttt-؂Ž!`%Va+CcAJwQ GL)ER+aq[ꛫQSQl B[MH ݜg@5Ͻ3)ğ   @HnIUr̚TNeʝIծE! TtPQI>^5 fqk9Z#ڸ|E\B-O.gSX0rt1RE&0O GG$L6u3ûA̘nXs#@_{={4SG}-rOY/k%ы0?:IOOg"VNB'wX<#G ybwnNxQR< /z']/=0J&\U[FeCVHzEM->NIxϞ=CBRcj5V[, :ôZڛVVd׮ \e p$h& F?͂{PH4k1$b1O3 W[b)B̓k{_]Xk໳W1rƱjJ"oc-h\WzxGzT861{1Mz$}NtI~+7箤0wi}ׇ4OB[vPC?Ƚ|ʚY-SS^:YF2_h>D !nsοf@L ".`˪,[+`>/ed< J "x2X߿:Q o4}﹦2?c15TוB0]H8o`/9_*Z z|Dg"K{4WV$\sMڵj@osU5\;.Z;xŴ?Cd s1u$c {gaj~#A[i|EM`Ԡڀ`iL֛n6pO:f25빞ȵҮw_4>Og5 4cM^)hSJ>eY-Ol?oxmﺉE]lVb!>-\xb7/:: qtQ o3}VTgyuU<j[0WF5X81B(R):&ZZ< "?FZV\[sr̈́K."Z_ կ1H0GdM=)` % Rci"V\n[כ7Fϝ ?#v`(ɘO6_MCoD n *?ZY@+a@KYUt]ws625k/k>jR[r%[bc>ѯ3_b-ߪܵn]6Q=ꊱw\PQG\x~).zK'Jpݼܼln8wEg݊2}óPbz[~+pB _2>YhmHEK r @ꀜɋ[g'40'1HĿ|KS_|熭lB'd;A^*zd4عy<}_L84ה(&+-pnUjx7Wcb%iSE4sxbtD,)ڷ?Kr΀BOQ )Q2cZ\#(VyAq''gnI8mVK郱q,6Afausа^WmZL >:m;}9 m]dP+Qr@P[r>ek~^k" Yc|/? o#QKk[k@-;b +V-L-0]3J\ju"#hw^CϟTh=u)`[N-9Nާ֯SJK[R>N+v.Quթ3cXpS w΀C{M}R/A\Ћ/h9¶ JN+BCx9aX0%**CQO7}'O)M[R# rUy;DDDKIM~@יHxHZ8暳1pFs"}[*ɗg%6<2;>/ YEj9{'$ZZ n߲c8Z$ȉ6VSR1*#P뿵wu #ڰy^!h<|PPAK[XctM{D8/L5bg4x3/ǫId_||ؙ_y_Է*~zWq5Jk_|KSH-q7>o`<8? ۀ5҉c?¡ &Th/oƄe+~)@"PLLXr`/\ E|ˋڰnN34.%@Hpp݁K.l'k׮dCKOxK5|z'߯رA/ rbhxq9^u dGW rzr?>)>-5> P;@rO/)ߒ)x{%KFK1z:S9^9lRVg $ z!222,z Wkp6T(Gvs┖v;('XKߩ*}? rc*8L \+m29Z ۞p,ZrJBzbs.^?*jJ`0ZHy+BR8bZ*]xRR}=! @י5p%Wyy@~"B[7UӢB5`&-ɘW#l N?$=俟HwNB *%rxmU!y"Ŀ[B۸qU?1Nƌ' b]u< Q&Nc3fp Ď>!s HF1I3 (=~}@TrbG`Gɦkz^*/H8+?7'̯)eͿ|K֧h 9Ldr@>.YO<^Ɯ+e؎ ,J٫?=o_M_>;=GIoD%0}v>7>_ WIҞ[TX'GiAĤ5 @3&1?ܭM1_؁ߍ?ՇۣQeH~ciYyOLO tj'Lpo.5roqc Lc9o2_:Σ G=@Bg>{b+540nd߶w@1"*:քsIwpkmw B\ [?7Z50DyVJ jwa*Uys4 iiivy\S늜^MkҤU֔Ep,a*c}9o%S^[DԘo\{,~{/}hJ:}ef:n,߲_& Lc1"@@Z<O5c}-X@^7mhꐞtڄttZ@w:&&:n-t& .E秦&=U{6RT+|{LA)W|K]v@mmR NXEwpocJjiZ̋  m$~bZ&ME jzWe9C"[ `hچl jV^]< ‹DzFZGHSڔ=Nj:kgZx؂ 1%?xaaNB+U9op%\.(ىkr;ruWZׯ_/[r9#Y޺n0b_sIC¿dC .,x?t=-ӓs9u_d}t֖RVo|Hyiu7Tpoa~wWIdRgǰEߓiѡ?M2h}wit/ڧed^ttntnS:وy7c:җ㯦\OGF]O/Dwgޟo7 mH b?77 O|o9ߒ˝#aUՕ*Ep2 <*Km+@) VZ v2R{nSek‘mh MZYnn=w`y*0DL%Z ϒ[e@]aO^cqqb 6R 2vjSosHOQ |Xu-xKSVuQsrTA9;\ 7ri:^׆Iմq%`eA֬Y-) aҧݸ62RvtBb*z2o`zy{44ktaJܒ͠g&qsn *ߒ[3T QgP؋X֝ܕVe(@$TJz$u{_S/vu5~!^K'iBgwfbbh5tƛm#H{ORSIOO:===n) Cy`[xRrex.- |l="b7߾};z`* \i5“M]SE{00o$c^N*,Dr5@5@BA^g^9~,~6OY5:RQxv7CN5B5AmמJ~E8'Us)-PjEtؘXQ G9Su ՙ\8x=sYFGL ,يUeF9G3@B<1#ƙ]ă_G}:ʞd=/% h$!uH&ԓ dv m`Nhx F]G.8 H%%)5~eOq-ȿ-8K0T,akdd""lSaHb_"2ѷJ+-<s۝E2-]j+A9/Ky0PȃBPMԖ'wX~a$P\8$.}JI;>1* ~ZZYa[[5<fSOԳj9l(b9~)x~o"zF-,a$K5H=}3]0nXmA̖ 5.젞 .~Y/G~Ϙ]m!0cxiEB[NPz}0/WGhvپeZT }lK$|h9̧DŴ$}}~tjqg:Qsill %CGsDk~/)P4Țo {Ill,@ dȼ3$Dȿ5>%ľep/-[\DSw[w%Zk>^B mYĻB8I \aMF"!B"ɜ]61ĤWDxa[s"7m jPnUP+DC)6oHsf$c5]Ԉ<$61z #.%A}U`Ell}=O 4e2ҳ5=7z }3.X-Kp z@G:.mA@ʜ[6\ {+-4\Jڽ McԿ3nsl03Z~ bkl,\$. i ;9QEPl盃o<ܳ XpE"?=Po/[HBPu=9}j:@YUR,zF8V@'&LJª*b4.ZNBf97gS8&_UTwK"{I~vؓs ZjjKjh‡?Cx [ FFE r?V#oy"35" /Tj6W"02wPpΡW9HWuACŏ&%%*E9P|r1bߢ-Vi+1b& E_~)CUe4ץWя*\RLmEDIؾqE@EzR&dЗgBǤ1Ko"k ݀ d-XX5!E0_ӽUp%J!Oq[J@Q *څa$hH֯_o^_x3; u)#"0M"~e˷kym"148 `'[NOHHE*uw=Xd@eׅ' sD4QbSIswuă0 r gqV8Qc!(`\\\9VUM 6G~Swl R 9PL|'N4a+=_xTW|<"(l[uW|˚9˷>fd̚儾IӢTx80;78pk^7o7z':'>ޝ> )RtxuvRB7l~x_kMpbR<q/kg'6|" !hv+%e˿ tDP)y@l|F,f-wyď 6Uك/gq'S؎xUC)ь >G)œ.jο~!6HAFhI"3ǖ !@vU\[j ɟ,{ߎěEФ%w\ h,:BI{[ n8^X'## wY6WppҀ ҥb*&jAk0Y 毫` oj']/7Ҳ>ѯY<+N|y\|= x!bNh=Z2j(1} x_[ Z>v`*v.~rUpdX.dw PZsI!ndnc<==ddNS׾sΜ{s_BNt́?gՐ5+D,h5m0Mf!rúkjqcW))6 @A$(7gnBt섆Q_Bxl섦&4< ܗ B6czL-0@8IՒDhN~OImJrp ;5RJ=AM%J1Tx + --bOH JL<O*Z%3Bpva*[üy>/W9%.*WZl<^khj`d Z"aQb #av9k--jv=asBCaE)\LǐrxF !UHLq^ñ[#PT 3rPNh-S+S]$cpml|!<|[^BcOvČ1#@3  HXpdĦj'з`PbC# +=ZO #.M%4l3|Kc>̚.H*v.&]H?צ`@"u& joqNs9@+~~@q`by'%Ip tL?{/x`qc,6ȘF"pĆGُo}) >4%>h_) MEbǧ|K@uk% #<ʀ*Dp@l886.@1Uhmɥ<18!QFn$lF+q3 3'@@!'ΰi ZVĽwX]m=NXMg5%+ioD$8L5>%/+-}J[_׭NοojBh%(/'?/y#Od-nlI˶/8O/_7>vu__y3o~f~W5 Y 5/2qN^gpq(*V= .b6Gy3229)nSc.UeTmCT9R.ް@Bxp7VxLĿUTDUjؚ3x> jPs`pb 5`V`h5BhILX j e ]\,1NJJgll[|)c¸ B<hXȵJ!@ soFX3oT@&`4R}sYAGW-bN0E?O1|KdE?NџE@itNlSD'3i!^WV>;+0ӽaѓ|b/b HO`蹓QcA4?q*p=jOvekZ#oQ='rP0GIO=)[ YVVV#A6DżpG.R \i@Z[/+ 7b]Q_ .v2>uUї%xg8,) !0@kmnbD -'cW)xX:F=fD Z)7gh;o7+Y1KoܴAF`qȟe""#5+k xR7 H{ёQc[&bO"1.Rfo9 -%DdV k[e\Kk8O۪ߣPټe3kŸ,ȟ._(;~˗-1f4 3̉c>?McY2aM}^:cL$X9fjK頹{hIioJPR?^1v_ }k5ִ=领^+Ҭ t^0 $}>-+ 9{SzއN~O%Uœ#BycX[cޖp1=QgXiUR,vt7rG/<^M)Op1qj Jn.T=0C@[9W50jD H9MHk%(.y&`)Vqk!2m@3?s۶m#D TԱH5l%&' r{şFb`Rl“ x@ i9)ǧGFFTD~3 `RjE%"x;wԷ4/>cϼEPH|+NBŸ*Iw $xv`Xn$A[z#i_ =ӆ=JĔa"V3Vg9 0gؿǺ[FkK_[U 2⏷g~~yHS;ȿSb6JK[36uA߼ӷ[GGֲi g@]QBJN-pOٻ𨪴}(P@ص`@" HPBOﴈNB'@BzHŵ"?ߙÝ[ΝLf&8Od2sw=--: x^^LhZu&ͼ6I)IaEpb!Jj%=[9Ju$ਟWΚ=vZmP<1Dgp]7:Kif%)J+P"re $L^Lqq #;ss7.Μ6Y3g*tR\B7qíQ'כeL z!-{ 8%gdFȜ0d?-b_NC|E>I?vLk):9 AN@{=`%JQڏ`$m+F~o>P>}gBnPjIоy>^& (+^k=xs{qY0`{=ӣOI}+0ğ˿|뵎0aI{?(=9!ĵqP. nqwAı6]Mk*}cHV5}&^s󳕀aKjZ ƒưRنFA2OS=oט+&$5HK,9-ߓ]>ripJt4K:GA􀳜Nz=rx ZT tz+q lXIJnW!RBl:A0liNv~6C~`L\G}fW $-XH"fP"'+ ?j$i6 [3,ڎawHF԰yC~83FlQ|qީWd0tA>ύʄw<ۛ[$h_5Rypط wӷc/õcq̏NĤY>@< b^f 3g5͡+=cA]ƭy1Zρ'@7K$ X`m۲e /`!<^BB|)<ŋ.br##/D8H̏ŞT N!4!6.$ATtlbߣ0b$,5 gX%XזDb-zz%z^<1RMe˅@OT<3XE-kNA䠒-4 b[i s||/M<h:XNA3pc 4`W!#c@~]ŵ(c#jao;o]}p_#q= 8͂9:O ]_|-J{6w\IbV{8sst^8#j+fBnPl! k: ?AcfgH%o /o~=7=9dgTX[I\İww2!`RE;.&xn534poϽH'/MEoi)jrشeFVY$8~뢥|Y:FL ֶ]{h^hpLğ#la:o7f DDמT W[ky跚 QI)=?HH ѱQqHJN"ŊX#+6e[|?ҍEYH*ӳ?.yo?T%KZ bHHo)pKrRRq&XȋOHA䠒 __tĵ(Q@*=8ǜ!89,+)--et\|i>"LG-,%[~\%>~##$3eʺc1|Pxҳ PVY̋z!Ғ蘨cD#AyC|&!!f)N-J"T D/tL4J #6Al9&'X`?տkD4ss4M*5P&>Z .̌t}L%0`!} ,k & cyX6o)~F9U6 q~[v|d?yRʼ[u(N 8%/p 4H0l,O@_}+aMn0\{cpa `ؒ }Bp&)``ԝV9-4:`Ų=];3^~3 84"ρ`;tr6 322ИV^Y Ӭp̫OOSR&Ac1dF Uy%yqJ/] 6H<;6AWD`zt|bqG82gR?5"#\EʗqUfNwj{փXde0md:DDai*gZtjT "BPO+fRQg(^Rp&4{6'Spx3 hV@c؇(pDdn&4>?7S=zݦϹ29\^rE aoT[qm #ps-a),U߸˕A@lSJ~P@M<%8=5ܚynk jaL~7cZg}Jn#w $uXoW0.#y,n1MB3!|^#ߡ$ `eĶx|ԉPgSfd;R{,vّp _Uϗ=bD%AW%/%܎JHH+koVWȱao  e7 >2w+9w2;pۓ=Ȅ%kX~)/RFm>Y{GJcS.D hpPH Ghl۷o'/dѼhZh$w7ט骃助r89.>փ֔ nںRtbUtO "LV8 &KXKpq <9(> & #f "X6tB) ~fL3) R(8)JNJ?3c3 A\V#PgH\TXr&6k Mɜl$ㄏ񍊊qܔ1o<)JÚ,V6sgӋc8V+GGHo*xcA e "GTqCH)9 Y[Q)*JQt _D8<@p&6KhNo[p#X# 5fحDA$7Y{zMq %s~ 4B ! >SDqIER RDK}ˊ.Sj_$)nkۇ'W%j`L!gJˋt4Ҍӟ^@_-LӂhV4p*xXAJ)&K"J>li*x)=5"y@,RR|)9 ~O|1Xl_⅙.膫#$b!SK,^`Z.<"`_y%9"cS, 1/#t]̥ ܽۥx\NPpٶKX˕bzYB!kR@|HIInw@C&4i39!+Hf#;.B %b 2 xi?F(ޠ(l[ĕ7ɷA`W )|ǿY?ӯ:ͫ5Nni R[]  2Q;%hF=c0f]yٜ<KKK]@AxX#rg&$]lS,gvOH_S ]t/(Mnjgɴm b83MJAx`KEbccNjEP GbNJJNMOmӖڝhxY+ޣk3559%)ZaM} BC ϋ_b`$ M@Z/G`PlȂ  J`UyHx "@I017jS`&%,z1Ƌ1))^nyq/Fz^ȩf^\}vLA#[ ސ|+S@&t5sˆ~S=!$ Nͅٳ{ ~x?BǸ7i1!۹[2N~4%@iyF!:o&p\tVq%@bbt "`yw$zz )NLJ, u#MA@8iN tmg Os#.):oO5|J+-r *CЌI#z6qs>R+g=-,h7/Z+]ha -F&dt5ۘ5D]\]G~T;sп ل7y_^]LQe~,K!.:77122c=w)j~ !%@:FAH5ӓ5%G7 p [@@8Ӝ49 f(NEZ8OP5Rr MD1.#V)Ef @oک_0^@Њ"zle:FM, ƶq Wl`lމVXx̚n@ajsQgW z? <ݳ]XXKr Bɇ&3_GA9ΚS$0? -xMD J|MzH{ HZ.\eQPWQ!n) %hSNsӜ&6`5PtEy@Hh>+Mh޳LѼOE‚ %DD+gh!CI//6WZK/A]n):DLj1vTC_ @ ؁-x  J聩B џjS/o^C8kNN1MM 9DAx9^7~t=5A7o;bNB+y ł=m iNsԬ) ;v0+ck]6m]πَ6B`r= H4%dMAS0 A81_wc>h#sѳ MѼp)EAx`+1l 畫MH/ o "Țc)o"⤙a{7V}Xݻ]u3a2y&G_ -^ha @hMp 8~G5b.VOEP>vǏ '>&/Epz(bHNM҃) .TXvlV%Hf X3G1 DA]fV%봎36; wiJI< ,:ƞYYYKouxF?x# c(1 b1+h<)W6%L"a^8iNs5@YY.)ٿឌDN s$ _`W;%gϖ/KX=_WBU$|{:ၽLqҌI#zA~7kuP` Ө7SG*;z#͎OzFڛȩÊJy?? ޖNCOzO`32 ~3`&i㫃C:P%V;lb [3j \/WF‰pnr xGg=`+/oz EPH`N11UKWRR)"5-%/GEG%UY1g"V` =KiqrGDTdؐ-"sӜ4G2RXNI9KȜ#Hek|I@]{ MEP󛿊P(gaʜx"f]]"3'xzF mū=?҄ѼUѼp#zBŃwF=YMo|a k K7W7!!1\t`]ܐ|~DO}Q@Ƅ&3M BGvIOAq~[Ȍt=\ʇ7@ ,1Y N; y簯( <A)#9%%@89wSg&< <NS5vu,≍9IAF𔧢cO L 0&%K\[45Zs\ˍQ^U,wSTYS(e[deLAiNsӬaHr`_ g/'p*:$FsEpDocz$8*.I>u(8|,\:1~.+õuuw¡7SxEG:y/>`"zBt_]-/=Sӛͬn1:eBCϠ!n0 w |}^x\=N+@\5 SAp(_DZ< vEC ω_ (Ʃ)F!/FmckcFY#/{ /^'A6oizGRrBL|BlQLlQQa 6FD_^i"^T; =b NsӜ۾=DޜE B:wfE7NMA8skzXJsɝ֠AϷ~$V"z"z2c.tnQU=SӋS"=h0]< _vwi^? t?N+A-4{egÑptϼqvDb^ xN)}SH))y nӃIzX<) FH@bIL,˴x gsB/[蕲):&5Bh Q H49i؊5+s@JX%pSą#(i҄GsR(yU%X"Sol(e ٓ9lY-/͘%|v& <8f<7\ mݰ5ҽ0eyF ֮eiK_KMKG \8E|ʝ̓3ᷲEqfP8.M(Y{ENA\a6 0WWopf #youO-xxYaHjXx̚c<9?NAԠf, &w=s|@M`DNk$O&P"4MLO~N :A~Lu9.h Q 4vӜgGI \bqپc5Bٖg81/P1~ ;n >ʺ+!"@C@ot %LřqQ0b 0,mxmi?D`M0 &Akϕ.Cph8d 7*Oᧂ:XjJ[4E@V=/IMIItCbj7GYN_6Ō_ss:jawH(.L #Je7tT^R6B̬~>0ol1~PͶ |WEIpv ES\49M8$F@[JƗU 8E\&R&[Zz<+#;`gvc)jnx/fd bXJ}[oiX3701z@bU8 ]s(m,FHj}.TEm!StzNz9y?mVk͑ e72VNi]`R'aȎ7X5lc'f_ji*l͈/2[/fMmgvPSK^D *Dّ-!ښ!rgñ-/R-lp^@HfGⴔа`PSf=ijBG`)McfWvWnq4'IsӿLJIhCTJ *^#gVc0 zf@[ T ?{1CˆXr`M"!>PAgn+s`6G1n0ၽw"=ӯ4E+LHl IS+}~c(s|@=WS|n<6;yfMs.ү.zxe"?>e;w!!+iggwX30G`kn+^EADz^CMﴺfB*/vNA8^+\1Ďp}~.^حbO'y z%Ə +H?EFS\"6Yߢ ɂm7x᣻ôaL}GWj ld fJS,0D1"DTJvttnR xjg쿀D SWTBRZQȈ5'QkOYK+5ŝ͠_]Z#G Kؘ <~מm.rZDt-e;?ek|)M,M@L=t)o-ZNrJIY,i 'd}n"X7}FՇ5,P{<~0'K u6Veҟ!wtH`JR/5OfZ}&ѹ)#5׎Fs ?8aKҧug\P#ߩ9BM{ Qϋ $sHSZdu̱'k!BEyػl4քUA* `xJ*7Qh 1 jǨx4\;W΁C鐟2JM|‘Eph,\;gN@SƷ2"#\@/Z1P@ߍ~G|B䭔?(7A#k9I ~k(tdش 8VRRUVQĈZc M9ǑMOYShP{ԲեujE"P#"/}]sEG*aЯ(4GVX\s|{8M[4^j*݆IIqPfygv9c݋ y0: Ƚ z-mSn0gu/k l*%~coA,\|gSv;=wy}9r>l'cZnCxM׍#{,oM4dNuNL5',{6 ċ!0<ғ^|U$`/FOo AAx`/A4yϦ , [ٍ>A@>7nb<9͠ӮЫ눪 K?ٚD9|0E# q! af>F}o̤9m|uphP s/RPqͨ9kZ/0#),Xn|cbXdox!$Ʋ(.oO%_~=x=Ȅ7=ȖPJ⦂`K #_060J; m,~6z"56k%~coAX3}O|c@$E@ڠn1q{2Aή05Ϲ :^ɕH_ JMl 7B>{3i1LsI͘%|v&rQ:Hf=Pkz|Qn)_&mtc7tqF "֬#? -p}n&*fSz"@9( dCG@rDv]:{5!/ n(Xe6Ȯ`桗Rr V)Zw;[K1bO 5-(j}M=(}ʰ D7a2&0E1oɸ}&DAab;L/ ܚ5>Y{;IF|nmhg,{ z}WgW߰3FX,e]vG?LLtq+}Rnw`߻atΉ_6sшpVHwJ |\HϹO~aXMA4y#Sz"az bS &?Pش Д-'&&,&35]GZ5D%KE9}ye֎1lg|/V{+=`@wo=ПAT^_]`Kd 6 \^ASPd΂ҭǔP䣧]GEG7=bLPHWN%Vo(VTX)%]v2S$ ]MQƈ5USB/uv5 2b+?$˶ɑ=;C(,bY}{nGiDrfǰόۻ!CܑOB!K؝5>? D92. t9|9\ua.Uwj\;E¾-qk.0g+ѳg߰p>@$_P(ng(L |73ȫ &U3=ɺYHVARKb;aGE'TɱehE>=)u/r:qfLgNȓDAx`o!hFHRznV&=W0wfƦ"6iuU *؂LJivkQ%6I3ߋm A]CLƋwP>']ݡoP"G69D *VkY.Ѭ-@x0T z:FxY!Ea+,< fG2}q ]=i܁nͲ+LYϸS^X(@kK Za&aHnQD3r 6RR/ŋM?1֭uײL)ĺk`MqؘQْ ndMUn[wXaf|m_,B{Kҵ\{NL˻Ww;sF֧ ?&K'M32OƟk# eVpol3J# -:}`19q/BLDBL/B*3+A!`O;S*xFUW -sm g('xA&֩Sϝ: < @iZe14C "Fc4A⮵M7olavnͺcQ%gL~迀P(c<#^n5E<쐷)T B,LLw7[Tm zSHԺ|2_,PWcyh!bSfFh6)OŒ@X 5n1zpd})T@-k%%؛RQXȚ¾H8h5P]f!^DYn {!jJ(l+U{wCب.dez+!2^tM &Nq˘Ġtd?(D?9qwo=\{zM`mQhDdh ]o>c`dS@gX3| Fl Wx|5N }ۘο57qeo.{YMAvͅ6ܭ d07ڃȻ a5b#9lԏۯ8/ Ph&bHFLL Z:%h(ArJЎSVE/fNEUj5D<'9:/66\1["d 6 L4+0de΀`ط0*{]@T{ؘ PʛAf)%C7H<>#p,SOYØ= b`OZB0XtBѼ(bf~P:f ?]qmͺLKG :Qx6E3`}Aut&@gDcjİĦP2on|g颂krWoHA"{ƗBuгۓL$~C*~/6aƴ?!rg1) ieoP!|E?з('Jׯ  C0aI{&T乳a6ƱaoQ^H1z x͸FA ǹQ Z2AS֓,JNU}kJ\x'+Ru 4}ʶ@=/o5U"JHJJʃj2l 1Q&''I*I0ʌ,QJ ?馞?X'x;u(mO&$}"7 ggpJ1#Mp{?1ӠWg7e@է|KI} DP"G(cjJZJ ,b6KOOgӰJpd+>Nnؿ?ߌfWȏ~n >?a>_Ss("ޫJ`"w#uᙽ; ږzK:|3)M7jyzq EΛr9gk@=g|!~c3'0Ogu>⓮Cd~_E¿7sڵocb:vgLSFt/<_>83τ6*p=9ҵFnY|]veE'+kޕPR/*׽Yoyoh"w~O?ù{h(/,!&fF=t͋Wқ-M 4QCSPFD#/$ G6(TWr<7: >|s3Կ) l #L~Phu^ ?)Tcj7_δa;@iaS[⡃?>s@l)*=wqnu Jȷ:M5eVBolұ8n0}9 !h:)l=פDPAڡʃe5jW{d/# Kdg>`h 5A.l3:Ll%X[S >%oWso%"DMVd=..vŋ/PaMhac|c8VLlAFK԰t Pŵ?ȷ(j;gΜɇ|q6Ş?ue~(;YK~7[GFg@ef=NM,85.xDёm   {DR76WKRNCg}sl(\_zKjRW7f tƠҵ~s>|ʕz# @&,u'6WKZLv{kW̲D#,:*w)1,z\0ͤXn`{,7NCAx`/^Nj'gCH._!v  <tOA / xќvvF{/v1M^>?e\y= J pWJn9!g:OA5e)Z&GԬ 4d}6JGcpg9r@7)LNFhd>}LwM]TQ|(>i|;4nߤJFqF?hKZ"n+}J+%/R)N+Rp˵c ) ^̱%''O$;Jj\$z1b]eC҇a||i PZ^dTC+@Ɠ;f =zßgH$Ñ%i`41mQي/*]K~TFw*g'WP RtL0NAU7( 5aaA4G[nXnR&TغEиt9֒kkTZQ?5Z_ƶ|lƕn1Z? I1vB;NvyH 2'} z=]?2 nܴ yoZ7K<'qnju0DҡV큀烍"(5 *(8ZqR$6p7#V{b|/`?[:;HGGG@b֖J>_K(.QMd/H0np3FQ}`>篿˛˽O)) ЀT;uW/.|qP"+[)Ol :D:_R \d5_ôSRtbJ1t쭵xb{QX]P;,Ʃ*>>~! |! Ga!C\=[o37f>0HbEeyNjǦyQϠۦ :'Q'F7'_wCnpQE@pG7SxEͱc"a2 >_>g?c/nKpȎ{(m"ݱF5aaAB,L_/' iMI1Vh0S_hw(Q2,)~1S`Hm@N|~kwOE1oAm`Knl/nHP/E Z%%LFrGxv\bTk+tE#ScjhqhW2*~\CvMʡ=`Es jKx~vFtSµWbӬ3k2)X%Q9DQ 1~aNsWw1P5wxG&DNW@%=hhv۵R=y|ٽ >W)-Om^4ȌO2 o=BiWfÖxOw^- =33X `qdo#P2|9muo9j-[ƀ?#" ,Kyh"1vtDo-g(~##^i!ݼ #3aHt$-z}3;<\]ỎE7^ O6M'vyYC WT?ZSuZi7Qv{y}`tzo3tJF$76!Nٚҕz-JTCc^Ƀ7nS/M؜_~;@q0om]_[@A09[{j ${cLқ`{$0zצHU%Dwl}ػ|,y]_CƇR^HM0|8G聀5xWTbG,~{uo [~>|1EHw/TGMAx!gZDMDm%jJ] uԥՄ4bݫ?t 6ieC57yAuj`\>cMo@뗽-E]hOq}Jοx|KSѓ^5e4UeB0瓰=f)Dw ~/_hj8~{D:?3>zwq^_J ^We0sCq.\Qɿ5B;)k@4Y 09&ǔu,z$4pxsۯ(Hq#:.z_*7w-PwQtiϋx3.Ƨ)0tP_h8Ao`:Uz^{LA0CIU@8#];]Fg+࿞Q1x`ׄVԊ;boj):YI =;鿠 gzr's~qO=5 l wvkZQ^v~mͧa&7Hۃ J=S;.ob-pU9wBtӮ9&Ѯߡ?731+zQ_ERתnr$CS=ɐ攬A 5쬎lAȤ@r2sh %t Oȥnj8j3ĵ+.ꎸJ]7@w-U>7Q?xWP 5a?5Jm=SZ)fb|,u>{~7G(\ &FH~ϸ=e,0w a[=aoƴr6yw=XY7Aw \=p@Њy 3pm<&_O(Vxמٻ^&!kmە3ٷ#iXo#wڢlF7`f$mY ,oxWo2Fҵ1?] jE}#˹M+gK˄3y7Y7Prdo}JHߠ Őń3Qm cec}zq:"ϗA(a!r?{nn.),Ky!{  K\^a$B$B {=|2Lg@9{ 24GoI8u}ttM;cm?";\.ov=ZWg=¢p= @Do>qZ#GnlUv_c(3D(xǶ V5*m5bPao;;X&c ծ{)/8ȞiUikB6ƌGAԠ!iPXH M7%Xv¨]mOh|솒4eyg@0khƠw{V_<rŽ䉰\3I~Hذdď7&7u\ٺ6Slٶnd l;!h7kc ڎXd$h煛4ϠUٹ -n)c5okP1 d@zGz5{nWKo|m-p19 be'\'Ə7YkSW2[b2ICɦL;-xN'>tmW=fcRTK()/`ÿ"F%fYE!b@n7o'yyHm&[֒-G(#&)K-Im-ľ$'~> H9s1E$Aqܴ93C1[oEnz*w4܄Xo6mXkGjGa4 #)905i } V-6^Y Ez{,@?gטb Zp#܌}7s7#:7f_mהsсSp׎qw.Y^I5l 0tB S\y0U ヮo4}+.0wA+A}*{1"x aR߸F}Ԟ 2JbJ?Qi˃-GwLWm5 A:P5|W-Y\!p ;>o {``OJ`r+|KDIjh9l鼱'œ[{䕇anԳNw 9110=/ZY3$a$Rzz:뢌3Quka~:ؐ76Ɯ is6l6>ja@%Go5] mN,3п#\ӻ /4 GK1y빯~]xU׾ H,]OQ?;:!Ћ^ B!!{ *%?ev3;;œyؒݽ3gгOmtOmޜe^ި w3z. R}?ozύk" T&v)9~eOI-"2)1kJ`,Sb/toG<(ߪ7C2asUCM@Xq-|w|I?KR>%Wr&`"O"?> y UM(vo#;{V ;J.^&n{7m~A$*ĸtM>㍄ n,,[¶ulA Qq}w8F${.Ԇ4;逧WH Jzf'Yt79pYpjȾ]0 4b;c9e~7׉:^`m@_DXÜ!%E-CDDnFWƹ[۬>)-ωga^X0QA7__8G立l+ϧ,!VN]hZA.ݵ ~RWꅛXj''m `_zԩ @Bʦrl7%wL4| Kj?Y#(RILL5fmRT^-GWvI ND/"=P:އmW^7gy_#Nz4g77F%:ނ~ rVB1UԿOғfGN4n>&fS,&ɧBtDzD(:.(4v= $Nczj8ܫA)y7t$JJ$\@p\5~Lu4"@?^;7{4y7XW6JM? Q4?Uw~nGധTZT2x17qO!O*cڴt\.whҪp)Gs.ֈޕ^Cv$Ұ=w 'M;hv_@LU.n=4=Nx^ 2k"*] #-xqD퓂\vKusW?n$<Q\XyUꚴ̧n%[ 2%D\t~ClD.LA$bO"0炵D,Z~r =^C?I?毦j ^IDIAx7A}|`)K2PbOoe3 D7ed B,HsdMr49۾};~$i|g4n7/ XT;W  E{+ y4[hM$SЁvՈL"MЪiн$;Ũ JJ̿O8ڨ`Ǣ'h}_;:_7qWDÈʽYt^D}>is @ kQ𾪚u#FxD6w{?.$t2?5k0Mh2ڼN?/- |A=MH\D^HjKw-vr\{Bۦ .t7~wLHY] X!;H[[HiM_c>y}3OTp6F?u/L@`R~;P#vkӄ82pT9Ύ}H 3:~~ ^8ډ ^nvlR܂ןUBmy|;`^F ̥ϦN(4kZ:zcCv#F|{%ׯDh9{}Y@v OpMB)~qKZӬD =ȁM Ɩ69p^QWCzexБvȀ"` &UwAB weI&9Ј3Mt'$[>"C@>t{;yן+6gX CYcêR03WK@ۦ@Fް;3 ֒,(SN'y9[U3nߧoF:{ij@L}X$d=)|6s9 C7 >>"Dk5>7qsT/ "2ޣ4lq o>܁s|mxOϔm":UlI6Iq`-66º ^080:72̝3][Eh t'K2=Nz<02]oUM2 SՖO~H/)2SFRLD11g ٵ<;/k DNenmZ& $,ĞPWT*=?: u$4H gW֖^D"&Ekvq1l B`g]Ab_֯\Xx=g =\S nL'AX uQx[Vj,z:{l/@fDz /Ozt>}{Fw= Gx9;Fx !蘬zB@s)f 2;2GNxpTO*9dG/EGs1'ș3Wļm~+ݽ0gc}x+FۿS'yCڬipEmv-FƎˢDi; 9XЏR1m `(յn?Xk`<_o5DSo'f_(*VW.$tƝ~xjz?&3Of$L&&i z}?nD8ڄonO؏+?4ʁ#`ʠ[_X z!Y>ހOf,"[}TMԅݢ ۃvGv>c:@El=Pۼo% ->ʚ%"#Rs>)GL竃|= $oeɯZ 4E!J`$3-Z6Oj@ 2( ،LS@.[|uQgCK㞴y3weKv0'"ؽ{G5W\'P^ p'./hGߎ.< vt%ɵ\O=oţKCx?(X3l;X{L}Gg\Ot9bx[ܚ HlA5#$S"2w3g'+Uiha޼8l(u_ S:o%)͘Cu0Ǟ޵i =.A}Yׂk6m\ϵƖpX ~# c}!9 󢢣N j ز I@Nf,!^ 5IeB""̳)sѣ Sgm_wl @ڧ_IrK̷, &He(] !l7a ))ٮihvrWtfn(<7a_ LOn< X&(& Ns{ȕOEሽpHm&bqWCɿ"Q'{9_ey`mn?Xk`ڟw]]8Y2 U2-[ ULbਛRS _ܥ/g_TZբe~?ܪ {w~E 8Ҕ ])޳|n%!࿘;YuA$\{$C@izMf^D gP*]LWlȮg:@S]gaσ7]׻; ބщ sp<Ι_ޘ 3*w4wR(*R6lonl#$YGM V~/l7 l^^GDE  ظi1L-W֍@. ?3p~ާ {pCɿAPS|K54@)i3!la+,F*#!F0ۑ,m֭!!¿9Β4}\ sXضWj+Z}~Pֹ`7tI}oP֨nNcL`[!'{~%KƮAv0rjUz|~/EUݝM{>9A)vhܸnznw2kE|$*|mj4W5i7fs\04i] yaOK@ @_S H מ B=[#zƴNo3_f6R ȿ @?ӗL*0(P_IҔxk&뺁`/@FY ,uN,,FG\] b.8Ӻ^XwGr IRL8qX`"GS*L,-D`KSwf7Sa͜aSqxw~:15R݈U藸`xT8[܄z`X`1-:CC9wmD)10ѳ=tRn:%#rW:wסb$s"!pD}VRRg\\\xhXy-xGEG}a<..3ݻ-w PxW{o9I0+k|K̿Ҷd1yH0 3$j(̬߰Ze\x!]pdCF~O_َ+_T/$y7?Yź8 ݗ L+kJ/[ tY`(ZA*@yA7KeUE_('{~%K7KL} `_GdE dZ)&AT8P,8H?Myn#9~? 0W.x7Z›,jYbH@FuJ>dBsF c*7KFPB" ̕:0@k<"dgw*5?僮ԧ$il/#ͅa*–9$IcI ?x/J`` `S]ddď,VN#i.$[7?ԿYIi땙?s*F֊FLq]9FV^eVXb960.I/k̆}˙awS_f",k' P#a}簵YYO?2Tl2+l)+9ď~1?:_Y^tЩ/wIiH?W_@ReW@עX5P$ B2xʮt蠭- \^LOMh`J/9gX+(Ljzu*J:б7j>D_W\ [`_,|kǯDНP4^REERD@9BΫdLyV5,j.&߄ hM" rQ@ 5J D贐a5YCVsUZͷ89g$Q[R@{N) ouI^oG{V 0 ډF`+'E󂿼|'K~%חtt+#,"|t,UA ?֛ w\w7ߌcؖ%=`Q?.?Pٻi=d_LSJǶ4EUp\^@L, 6@] >y^f_Bs>1u<8+&^bk- eR "V}GnrovY@ w4|\Q Kp 8>ظkNw_*ݗ؟Jh4~P4z~z0q + 'j׮2"jKXWOں)#ik:ө#QEM{Maͥ#TXݑCc~$'`n_ۏ)_g_Z}`!Ӈ9Zn,@KxЍf<~'\J+ȢGt['Gg{we~Fc%mZѵPeV@ J@!MLo- 6xPLK:htt4ݶmƺ(`Dx/k(lLI)){hj*`oˈ:ȱ=HK)y\mW.Q$^zvv"c^BgIGOMKRΡdc1݅nݞmnM ~֝DW4+ӯ\Նg D L`Η6oެ̟l%14WZL}iғCѝ^$GG͇;~~OwK?k׎coՂ!2QۺwgM`])%C7ajjq{UQ״M*D\4=Vf|쌪_.[!vNU{ٗx[w  LckkD~5s ~ķ$sC܀Ė?kc2ID M:!Xt`j>;&8U @q#"#-5) ɓk.]4ψ-[Ԭr2C6Qw=L=IZח^XW;;!Ca]!u3EcA×Ob~Eԗᅢݯ> Ѭt oSX;wMр$" E- iY *%RE#ft"7^i_n"3+,O aJ WL5fQ@C1v{7wJut7b=+y ҥX _s! mu cis&msV❾o#?,k9M9I+b$"7Z}?u/ܑp/Im_WBK&?h+U"s".XgxJTl]̻;o-BWPmw@.g&HӫB?_#VjYYz$\wѹ˯;'dnKZ?0eX-@ ; t"bS:_`jj `l7{ TX!G<^k7$$8u)R;j;۷o%jXTNG#~s'jXD: @ pb@ڈ(iƧ,.}fBsH x..WsZO-~zC4VދG?Kܟ,%E_ !'r[ptSǪ}~,t)Xxb nH[K?h&>T@E&sNt@/}55V"X"_\ם6h f VV[&=A^ƺ$KB  )@"%`_^ (/I05kw31@3&+Π3֭"mH萘mٲP]-$ip wUnA`F,ԁɿ^ 'H\N/2`Χs0[W`[n3 kc@&j/(K}T(W&y_ 䇣@ #Zxbn^ց KnBX@ȁ;_kkFmlIK<Ӂ~PHWԎ"@cM0#TT׌@5cI ,5U fi&GhfgC mH 0"""Cذ8ܮ.w\?~-֥OG!`R~;:h[K,xe_/Y)K&\Z-x˜Nݨf5<Du_,]3 R5x9uH0+k) O𮮣؂λssLtTr睆W4L3{i#@ڐ\5NH~ HEs-889Is@|`~RܜO$j<9"  ]ɿ_RIڗ+M >~[ =h'A6!v rAN5"io]K׌& 9 [ʼna1ӓiIVvfi9I @tm۶!!!g9|.aK\(D^Zu~{`w h bC[{͸02-۵vN)i,Vd\-ZЪ&MXѿ;ub俼U :WWML3͜j3k;N7L)j@%ɠ vZC!ZCHNM ([Z"bY}7#iyF]ƍ\W_34Liu(i|%* vZC!ZCHNMv /ȢooNkwU8 @LqGS?s=@okO`kfb`l%i&Xu]o(Zk(㷅I ׈ێ4E! N-g:u]u'ZZS۲{ukfe( ך f4[N7l5J4@e?`p{:dc/9?#O@L!!ڵ#'Z"-[:tif2g R&̙P`,hF"EՃqmżk} [k ej MM4L3i&i"f" o]+Y{-fmc @l@m&&ꏙ׋2l~4[{ǯbܞ ؆jNok BL34Sې&Ey GIiE)+a('$''XA)(>q(w?&%GI /X/9FrdTQfJ҄c$bvb?9"` r ʬ4jS\>S\| rK9z:XuAZC"XCH4@4@34ӌ&h=L\lX[M]lY86;5B)MBCCMLLPW#G+ ifCePH3w]`Jؐs B`Ȝ2 q;Lf$ H9s43+[}ʜo)/13ݾbo"/ ף#f͑!Zd/ 3+cvl\ bu44U(@W4L3mEEHQY#i( F4sbKT%^ M+wO=Ӊxю}X/ȿ@@]&T7K_xA!ZB>))ypVѬ9 JW6G`W4~kt"FwIa7M9n%>oo+W4L3e@* t$Ml`2Y~ Au˄EFEҰ"nJO̞!_cۡCJ+3;ݗJaRcV9~!g~ o/fi!A͒M4WW}JPY&b[)@o՜rr*p0/3 -n^||lȅ+/i`<~>Q?U)|2ޟn޼06sph-V8+:joj 6[sfiq WE**X}2S -<"!wlUȏrSn@Lho{`SܯkJ()/Pbzp<|CP{7JpC2wp.äj 49Yq'cgaaaLPÔ`KvJАFmj_ʔ 2k9f-='| ͬ($E%ȡtr s wϳ&@ b19eǐh\fz4 k˪:^V XYe廱(,43-l]@8,W9?uGG5ߣ"ȿ)r}J%Oq- `5J+’c4m^*x U^y AK33"?00V)²r1F8)gLAAAl΀\e81i(uҕ`vl\ lnR&;ڔ ֚CXX7Hr6#S@kR%l51_eY@ *kKK0$gG#yYg:#rؽg[DD ;XhW11U's&gr}KiR~6 RVYx\#B%E#a9y V  u im$w-wu>;K1%>5a+}c~nW#jJ}JO-)-c/ Ŀ[ xb`9?,7}/ ȅY %(2*L3{LvJ@aӓ5"5r!tE猸"j)W*:tSS1]FDF| rPZE3[e%BF\M >AU0TDZRcg2s~Vmͅ*~Qc}K+ pn$3,  F_qI?z@?ۄhv/v-\CExNWcpwLLV_GL )OOb/$wM!XSrQ>eο$|ا JvfP(\9XwT$_v p|O*5yׯ rJ098m۷]\hO2'={)9((ȕG{n~6=q @B-"Jjf~%emRitt4k_Ȃ-Bf̢LRd4{ &g1@聴Dzތ!h",k9M zRmޡ96kassSwW5GS~e/_|cg:,}œW:&͡~>yюsѷ.~Nw-&6{ACIkՉdaEhTTA @`V FgJݛ11QD.4^ B?NIv呔 PX'q| N6l rY"rjVV?t8m۶pg5B3>沝$g C/qe͚5 ~Eg4?Hr|`>x SD&_~&Č~A=AZRlrQ˫. $cnJ1b]چtӦFb媕>:OyR Gt'nGv 6.zi \JXR5 qqtx=Nvm)XRW)seη>5[_Ȧ>^AsgUS^_|#{T2CGx_X1 <9p^\.8?hay"dg(A.7!u gUEJ%RФ$.p&`%Va+YL@`ԁ.`sg [L.DR`qf X7ǎbƍ\iϩuBr&FАsp!>XɿM f˙3s>Gy0ݿOw3z ɿPpӏ)Yk?vsbkga}\ذa7.Y._@Φs̲(, cd C^tF @F:h~ .S'ODK23~O{MloWV9dɯS˜oT7O"XBsg?g'A^޿bxŏ!ҿk:w5iyʍcr$<Ȝ S9~sEQix׶%$-LCL-P9`ᜁ7 cb|ބdȿп -.#5?KHd끜¥ ׎@oikp[UWq#n#^tBBѦ0OHH@1{$M5".[b^xfFֆ=݉3p<^e8ODi:v(:mZṇ^^u脐":"SDקaNdo%dJ^| #->%׷KʷioM_|u(V4h0:wsz:.+0&',`~ ׹K' <mv+c BVC1=Vc/~)/03pB7BB%d |Vѥ #5?K# ݀r g_9+r)j7ψ~;*HC"Kַ tc WcZ[n?”?S[쁝;w~X| eq zOM?0Je5GȪo t{n"@i&;(S ()g%-SV9˙V:^RJfzF{w}׾I]I˻euppd}8o\\KH rL Z6m/n4NBVi#h.&[{/1x\V ]b gAD[}@oI؆ 믘"$[b_i&K)0_j4$XLTdl?UpG,[a%te_ñ+G?a ᓩߨmS26_O<ΈR'] ÷zE SR`>)+{2-1=WiZD:ٛЧ;ђ-kXpS=\p=`^TV yFXyp^plظȁ3Mk(mN8R5u؏dH$%bj.bdE|30$d!"##vR`%Kd@t6Ժn&!!!nޒ0@fמ)wHZ0smEMŹ,*N{"iAdW\33*\NQQbq"3"@ڷ,ί! R"ź>ڇ(܎;xÈ-[0 5o]\e~1~_8 `y xsFO~)+/?;+Sz`䴙 Vx-JZ-kc3jÏ}Uz;N.Vb476)8@@(XWj%2[Sp`4\[k}fT/t|c9;Wٞ4dk l+0t1yDirqPDW!#3[\"ʦ+$O .0E8Qrb p'x3EaY&Ԝ`y\`0‰>22}_PPQ SS*o`iK% (?N$^1\jj^ ظ]9<)E UXrl-U.#_:k{#ŵ b}SG 7ψx A>qfU~#;7oN"$V@-߲_/K>Ƅe3~1@"PDDxnrq`l$gB򢨮4A#@Ј/Fz,]oo bpZˀ';x]QCC|<|m QOE-WNE}}tWȜkzwuYnI\XWlAwU`FcbDeBw0mYh :5urS \$&jSaUJ~=g YIYD {#ì[ȱ,Q/L9@u;pABSHH(z묜ԝңr0/b6)o.\bj^ u#]ux6oI Qj_'͑뀠 eS d ;y 'uK[4ZkϤ|Lߓw%TA`z7bccgk]Ydn f|c'}cd@ iH47'[WùBN~ED@fGVh!LE͎W6+[UX/R(\z(䟛W\2_b%)|q(HʩH5,"˰ dy8P!_8rs3.a?p<>f 8ԯ0Ա)5271TԖJWsKo Jp!%vR0uw%XBpjq=©|̎j6)U(@߄IPԾ~)Z"6+J* >-, ˋxd Bd*l)Ehh$c-7]C1.8ukW[C ||*̈Vҏ +emzNv̛N'|j,-@gKe/9] }L/Y񉢝..}x KGВdlT'g1@Ew###7o|azɰn$e~80EbF &o"5axR[#fG*~%[X]]@yU\T!"ba]"~A12%M|Z|YJpA ~Ĥ\jCAa#\|EAA$9bCsD/`*Ј %RjM\CK0-?%~D*ËPb X~Tcb\mj_jCW'U(I$dj11^?3w]?枝C:_Hׄ~zGE {?5]<ɀj F{=}g>i$KhΖYt):;/kY/"T}t@1"*><'$$wEq7t)F;v\@ ml)uM erzXc+<⮣×UiCQ''W4s%S(2* y9LmҤ)Ep <) P(,C_益eRQWHrL#Ji+҃uLxlacvDZKxIxLB`r4(W _Oe7d&zbB&4_QQIk$m.J\iLoh?]^U,YC-lܨ[Y._,\-յd-y?'៾p6 [E'MҩSQ )$ت:5xȪôn΢ ={vw6WMoY/{ ~fc3^d$E}4'z} Ϟ?[HnCg;GzN 2zWX@L!o8mV%&nȅڤImS `qVMN/P K m11c@0/6lpYnN"%G`,ߝG@xHښx=ba@_8դ=lPxhiid SBD.2_.6I듕d5)a@Q5kֈ.V,[H?Ièןb?#iHߖi#_՘8|+3zǔW-NA?ؐ }1ϰ7q6WUo8r3c"nK#SМٿx2ъ]/Ӓݾt_D OȔ[ReFF`>Qw5P=X\\LdxDM6mݺBO9Y0D}(j1˙gOtc²cr-%k70hg+4$ȁ#XQ\:{ἘC,wXxqW0 `]tLq w0{&֠HtHȱ'^#3k裆[Q@))ERR?::* @BjOBV@|MǏy]D)Taŵ<Z|C~Q*L$LN[ׯySa_@< ;oR}A\kg3Xp+W H>щyQ-DّDFʎmKZNOfOQvGƽr7;!zEX?i i/x'Ӟ[c=l "ߒP`F~} EXiSc{}< *s=eVw0Q{ݩ׊XvasXie}vR?qv;."b4M7'm~5)i󐤤-SzMp#鑵+\ЙF'pUPP-5ouUuȁ#@.jyy`'Kg…lȤ0o$nj-JB?q`qMQY[j Ch^EC¯F/PݛjpS9kn!a(5bMddN,ە].1]NښRԃG ZpQh>CETTDȅ-fWᜩ Bul\lIKXg,j#kx]b포#N&gY:`Fl%iWMc@HYti4o| u. 9:c`ҧ?'WoWg'W|3vwчGF^_;t;*4X& ϸMxA52m$:3Vb>dE<:t錠LQ?fS>,'w`i'$wZ:[T?eGٺ #հ]-v<} 2l닝}xLC~ p3o3"뙙$1la|%8 a޿PkS4L?OOt$;CW;I IvXv1[,@2`h{9fw gؽ# , uyR}gt_;>1&^cc6;[G =6 L0t@Mi]Dv༹|L0za!CBJț>ݝ(ӷm.*31'͎hH(޽ M&јEtI*R`1 YL xejj@c iI Hړ@DACٵ5%H5E<<ܯ|KxFÏ_( .#^Y mybi~kdTx.ȁ#LA2 [U"Hbx+௔T1wW_y1D4Y3~e,X# AaT)͋(~b@xxY" bxĨ~J~6 EGJ~&eB r5JF irkxxX֦M6B=ޯPBcFً׻eKի둳k-w+ =umyU$lԨX`T@:V0CG5ͦlɦh9-0>) s}9;oniglxqbCLxa m% "@ A@ɜ[Zla~&tIÔ# &/og*̙=.kaފBXLV{sVZ?Yk#PEoniaH0 A5pRRu}L{(k\ӗG'y"p.Bq`^婕8(ݘNU`.7 |svxez1t]`%k:q~VU#hrsrvifsq‚ڏE_ rζ bKG4v`O1--r2|:Ǡ0$v@ "y#ӑ_͙,hrQpA/· wp9s-Nw> R"c2PêjO%qaH$riJ-<-At nP}|.e9?.ӯ`;aw̐vgNzulTưthِAAh)Tb@D//֮{\'C&-j֥6ŽBiaQC.:BIxnrcq7^X'd# MzDIHz$&&*,":DXD7ݖLY]b-@e}V Nn ѝ&{?O BNI&>]:'XSxkgzɸc-J;i3|KcϤ>UOz'R;Tl y+xlG*~mͫYd(g!1Z)_~Oú@dnp,ʚN\[h+DXY C\Z!k*DXk`Z8F>~PH{ظĒdʤ t %sA ͧ~ ̵c נ?}3kԛ6䄛jp(0:9IUS|JP/JéO~>33^ hSؗ08bLځy FWOPX<ٜ]BAxL;U}Abm9o6D&#";LBշ,9 mGAx)\ hS₞J5,;EbEYD0[3rڵk 鳕VlҥF%ױdR #dm5,QCF Qz<E b?R-ώYJBL`O wtAp \Oz~c1R8 z@ǞTL3d@bF(1#J\TLTJZ@\bx3;"ި6ЅѹûRHѿt(nG_xc@?s7xvÓcVԷ ۉ~S4%15?S" %BD~ڙ1<G {awy!%K տG"J h |vΙ&!j[%Y_8-K5]ؘcC" MYs{;]S+M0P%pGh/nGPZ;:P+{|JɷxOST?3+HO|B G؉ü c.eBޙ̏yv4ի#Hw2DAx+8Ƌ.f:'t:ўɖbͥ A_? q6ia>w`wC,8-xD)OVjAӂU\J/ce~9ũz/y'k/*.)zP++lٲzX?( -rP3DPFOޓ_?VZE"YP4DA;|t4e>#f$<&\ḧ́AE Ē3;"E gwG$cw{|f[2=c:mk'G4m$>NA&v/-$5ŷiigj>!kg4cn WQba[܍d-o*~Հ%Ӑ#cֆ4_8b5}m?( W 1Wm / ֞]ӚO4aC6cBυ[WR6 ǯSRߢ %6%-b\Y%@u#G%®;=/klױc&|b^ ?{pwEI oO9] ǾDzsa|J;jk.]*ۃlF>Sx\x< {[q -;V"u ‹r:~i`mEc*<"k;hobLdr5ق.Q;I)۶oM[6(8>4;>w\U..p>Y8.yr 2 @3[C}Zg͙8$p^5/H;x.(:H/a1}"~ЫN?Kb^ZLGajEQTTԃզ#_?+vN1D\\Rto5mw[sPQ}\-CGkXhb'+++(Z|wbH *gߡ hx7V|NʐO "Lx<~ZKIo)5,7]pխl?F\m[mAh5Q=3W@..8//yɰ;5-q75`} LQOW(eZ@?\L=ApPho)FYst)Yhg$m8(椤p]E p.C(9+?^̆N0:1 jO;Jo!o(d, v66»3`Lְd LsaO>zLZAQw"Hu, 7zq۔|Z~BGO s 'Hh2 Egn>̢9 <)+o%$/[SʅN->O~X)Ȓa1b?qp/5< *y\L999ΰGxQa,TEUPiXRRˆZ;j 4i!/DR&e:=mͥ s(Th ̇-gm' p{1l>[8Y!Ra8&`6Z/S{JN^i4BVy@gmv#)4>xQ -*Vqe 'uAPF(I>SRRˋ32aI L|h\Nl&}w o116M$kP}]fvJaLt֭kd Zx!fR3gx7*kD]./1$g}}QE"L~!ȁic5&ł5⏏g@Y%6)@}aFv v OI} ط|GL~ JO\ I~L 笂Q90c!2MԵ'`ʣ0|Z?N`臻y'+rmޢ^lc4R8tvǚ"bz4i!Y%y[,_L b=xm3邠#ZCHmЈvbޭW0w#/:c}𠪶\ e(*- dbDZRJKwJ\(I-eHIT{ :B?ð t}JdclXQqAk \YS x 2"' 9&9>K6j+xoo@ǚg݋xy)l#qӪlHXN.N6~LO ,'B ~Fw۴*O =Ԉ<Oj qWAiq@JB{ "v[۶6M.o{Ts)oEFpo 5 ",{ˆaܐ~0{5=ltOm;炍b[w\Qx+rGg.ˋlqŽ^y/ၣMG}5g*n2iV5>'Cwg7y[jӚKr8$jR^)y9B/VlǢE~@qI_1NiaaJ ƒUZ$aYY$@jjH'1R. NϘ! уCG&$$P<:t_VܾK +k xjf^%ҼH?#ĺMU_;3;U :$H"fP"'-Qhg!iar<|{8b.5,޶zn8;Gx;(Lڸ~bθRXY؝ŝn0 0&no}\|JͷV'pط &, KS h & ݟ#w ֨=싓r+-b #c;aH^ 0O,7s?k^ sqTca8qtnDS <5͋X7F}pfW0ISqekD!'}Բ~;کܺM>u9#pdOAv0"&Q; `2)fˁ s3xeU*R 9#F5*aR yoDw5n*/9ד\E 8" [Q9'3/|+Py6=/t?pH O g^i^ tc (Q` pc.Q#6 F2‡4oh  ;߃vyUZ<-1)Fuk#)= Sz< `k4m ݡj†%tbթ%L{aY7f@`vqvY"#=q:L DxE^ǧ_)V|B}k5S\>*XIK'KàeFXE&0):s!݈d0-_xOwן{Eg:(L|3y=ܳ]n wą,aq(mNEx1UO?',==3LEn+⎫t 7 8kX ܎X42bĈBCC[FGG\=MŦ"GUzdz^-3ҬOJMp;wWօׯ)9{ǿdrnw4jVEdqZK>O_nДQ~+Ã'7$l ,裢~? BMtGd2jA'S8 XDOiH\RJőL\)2\(W S)p?ph O+nWhX`N%j|{Io6)/OF(A#:"HR_D?k} t/EX v#R#(_ɷ(+>[<$@{?I8&f 7:{/DBbPL!V͋vpwEDFQ¼mBxBǸ /ʅ T#,IE>#(9&N V JͷxgJ_:fYE7AMٵSbm~mxtGpqK^U\ !:02223AkHDH?>KߍLCwt}s .X5^`5V/0' e.\$(\-ZbaspPѓ R,bPEEŅĕ% ssLs+ ~E,E4Q%]?iuA (1HLJz ;f 88uA׼27 5K_~og+8|p~cp`!mv/J#Ggs|)&M%br`OJxgd\9A&{h!-dIh w@.^~!P5ů5;;`Q[kP?(3_i5eAAI Q94wrS̯|Iɿ e<.-nQt6ݼLݼHZ+`iD8pToDWD,TrB\MGY4-.z{nHy] 5@ECȼ!6r)$,3N$%Š 4m/!),Om Y6vҐp!}iyQ :oX^Kn}Gyġ٦%` I5`$HpvNvᅫk < k^/J˷yKo+XA c΁ qI JmYϊiA邠&>VXUv7X;OӇt30 h>G߳ 'y_sR/nYw}U1 ׊fۏ8QTtGOoS=tL b :"X>o]+A^?R1CZ;./\]I]^׼&ɼǿ`^,"@GR5 ^ Db2d%!.* )y *2T ^ELLLצ; ZeTO4 29"d& ,|ZO{+gA?GႾLoOA0k+5Lө ib!a+-qAzІpe%ִXȜ6Q)%N#tNaQ1n (@@?\nϬ6&r2gi3 ;?uA@xk^ؼ@z&~Ok?>ƻȢH{G`\v06a>-111rN6%@f1 ŏ aKT qzRJMuj*npa3-w OS3n삠S֊a"%aZTcM3z"ZÔ kyʣz`{'} Rݱ "y:(X^-#/AJ Iv`wC,8)5ykj 8Yy\k#`׾0e|M$t(М5@?^b>ċ`F0S[?c ٰŻnA ;iLjStLdၫuzN$9-=$Hw̹BZrpݍ]t )%B ^`n|`JdHVbc舽w RA+ /C<jgC,ES-#!yeρ)ݷ^@DTV@M ceyʺ.SO.533c g(fAt4J-CPI1xk$<%|]!i1-B&P\R4FZ^<:ϬfJh:xTזC)VSt=s61$G3eߡ ㇯+W?¹}&ظ!m\5S+si?~;Mq* 0"[ W]b@+W8HnpZ+=^QT 0=#NZcvNSȊƌ2}.PY8ÞMipr_6/V?=x{ݺ YPPnv0>}d hnHئu5`Hb舖D :y"êZ,cÖ{SD~Z\q>CA.GBq\ܘ! N׼59-TW'. {9#s^ ,tpbS{Q%Q3!g@Sf^!/~wio\gbl . ;W/o9x.Ax\ 9aKna+jV7b6|^.8bS8tM;^K@")%N?t~De1 !sE?LAuA G{̰g%愥\ QkP]#''FD_ $?v˽99|\\ +DX|oc#ZZF?=]`E^`J_5MW.L|'Ү)7y[5yk4-_/+;l%kHʪIv 6 ߡg{jDž9k|zgʫN3>g~1k+kT3eΉj-^r(NnMKlc+ixb]Ntr@TyOH/ن7'bg+Bzw=sNၣM&4X UdA+BIF@P #NZ:w70#6m=P#Jnj"1CxS =L9mYFC]ff?R!_ FffwFSsy.m-^Ntsjk׳9ѱ\ߎT~V* 2晍Wx<%54ZlTBm,[,s_RnQ(:()m5y͓tY9{Ȝ'H[ٝQ$7di)FĀQ}`q"`Yh,!10u99Ix]{EAbri;*2BC/cz Gj8ʝϻyr8/[觤ʔm[Ѧ#l%$l1_z\= @IQYBAx`ᠤFwjӆ#Fui5AC ⲯΊ5 cR?;w9BI0x؄EbB B z=`hHZ p|OIyoJLd %@S5ug6m`| ,%22?A*&  5D[ 䐚z+??/CsyN9S-;5ucB1&ڢu ^׼CVz u3|dB*n(WpPċ._1Çf {'BP{< եYW6^.#mv:="͢~O stlǐ4߯~v&ݽ<^{GQ౞53un%n|>Gk̸y?^̆/}QPi1ȝU…,q7/S^4EG-ATLDV3z"ZÔε"V-XN͏l5))?RH12&Cy!t 9Hgdf\2f}]WXT0u~ο@6O5VP^%s7Qבz+ISwu 9?Krz1|Ԥ}qphc؋]EnlsܳH{z"JN )っn%L^1,,H,y"a|ׇ`T hp;X1 6>HA2f9f;^0Db5Kv A*M9+0v ׃6Hzjֳ$l"FdHXj!">!£B+#3C()5< ^׼fmܲQ q(n.VRAI\<ǯ0|]  67Wzx-q?X(hەÊGq­mݼ^ y=mq3ut1yfxgzعgf;N8w g .,, sh|vr ,M/BBNo̩0bf4 Cc:ʮ,?=ܹ `0{t/=^@}3Ҿ]-ϻ#z0?]npB^*ߴG IYj:Zjʵ$ iCAdUB_.1cư.6c҉] `s֛qɀ"d{4 w$uY2ghS5h @f}!_ _Ӂ8iCUπ-EѾU*z|dt6}=oO)]׼5=H՗Wj*n-9g7%5^sFhmBAh wTipS7}̥<ɟ椟0`b۳;0.^=χS(m"B%XG.eu°/ga2 Y[W x>1NݛB/b\O <"~zxI)̯,j⒢1:LHJ\!W1QD %k N(%'1L)R^y~wV.5{mwnqĹH%ssT|Nln-5)" - n6}A`G/GLApw35'0i3w\Nj%b ;۹0kV]-7ɠ ES/yn#> |y<-,>@wi59ܱ9|9^~.Nr4/I׿LJ$/%s(+=WuMXZXt _CVm޼uc*Ǹ "\-ǿПG)>k!kCl;HlQ~i3wSˋ b>紐*^iؾ#RxEGzk+XndcbTw".a43MǮiPq^構Oы&Y{X7@Е h{ltbC-Z|N}73 m4fTV;9WD : MIm sC'v1ca& 222EP_]\R^ s}sLC(<; x2/,8dKҼLS\``9I7)V]{kq'$crJe܄QKby S:Q a)ZE=%_k~Qip&w 3tLSQ*gxt]n1?e:6y?)<8263=#`y0X`$BZ-Z= /kND #hi?ind!70BskO ?Nm >^ " H,̝;OV (njSܝ )AC ޟcE &X^s@8/o w0Mo~rM|l kvZ*w322~(*..% @y x"B Z俶T֜"UHK~S~ɾH"G{JkEu8Uu\(\u0>{ͥ8KQ`:oaL;dq=FqY[ )%/o~Z"% W?C/MɅ WGJ>cqT>Tg%8-<ܾ̎(8"3:^/g[2;x -y4>6=o]6c/Ϙ\۴Di^wW΁kgRz:`SӔ?b6$l`)X㼋 =m)'o)-n?>ܳgvD* `xʩicyěN~1n^RCϗ᧋&w >g67¹w3Fyq?FYA:хo]&R!w`@!#VnP?h2~j5Ŀ\Xu,B×ܠ Z ~rr9[hD~xxa\̭% L5Vkz|ʑ@&\J*>=[u[-wq:*5(j]-WZZ*!8pꇔ kSn\=OAo'/w>{d#!Y=kvlFwy0ύς$xeצiMKE5o3Դ;>3-vMڊ^;x}rXLhzm|QJ y+-vNz{#ѤQKTb~AI=# :Zy]1=y{t.6 ĄX8!EDDQ.:2Ֆ;~F/.ay `O3;!+6%}()@QTBXasDx0B=0QZ sb˜A' 13iu0"Θ(7G3-JOܥf4:6wff&%F9f6*"ie GA5\]C!O:* Qs %j,$weg"ĐFBtrvG.F^Cn D^=Nx>(,0Ylc߸gN-mÏ:/MHQg0ԧwoknE.B:qt1?/q=:-G&P="^[Z=-]9?䯵GD[DDQ˝Õv7wA/z~~ɏGV| hD?h-H9O* zETqq G70#C iF5{sGJQ ?DMAxrpsiTLDT6E(nGEG ZLOoﱽ'V I  Y :5<hgw z}me+ `\|_"&w޻-|k0%@Pxcx 6yߖ[̏?ұ9sbxq[J9Sjmi6Ֆ003f3g

L}^kA(|R+BD`ȗa2]MLMxvfnx)҆ l^6L "~Vf09E"L{C8ԃ ) ၻMP#ၻW-X1(V޶=S&I1Ulg'R%!#~L,7vKY5_ǜ? C.`t$H 7/O$(!PyK8c;m{H'1D/tLj =+ıTe6KX-ZR`ALөFSDWX/^i c;NAxa`aSOhj Ë 28|8+6>\&h]^[bbd-mVض})ض} s;ع]Q{; Tvk-~'kͥ zT76/O2=ӓ!}<0< ޫ Xϯ!ey X <` :|nq($>V0`tkm9`tgP5N+~\"  ?"~^v͝*xz= khx>SOA0N o иj. :l\Q1aENd=[Ô_j(hk8hB Ë 24zpd}+Tp@o:J6 0RQXܘEMa$pQ nٲņ2lC9{n"`Zq\6Ft?XWN iQa\xf`}& p<1tW`}|5 bǰ?Tl:TnEo.l|(aAi%,`\Y@>k :CZĔ{֢nQch>+|GL׆137 8HAx!6=HU7J { Rޱ3--M j&L }@ Z %hW)A;Cؽ^EUr=՜GxM'%r /`F.UJ IН ¾ ^c6Y$F1TA5`i Cxf2*OL'Zmm 0اlc:~Nt3b\a%cq-Yf;5 ^ȑu6J׺낢-Hcs64/06m7sn%;;ۣ670f$NѤ A?BAx`7]~h7~,]I%;)Trh7n"h <"'3~|C_NjXG-a8 Bܴ.j nћD/tj17ԳT+%T0쫪uyr}3an0ͻdyCeƸrhY? 9Bhx- 'hgAאy? $m>ϵj$d8s/hkF/o5W"JHnnn[Js72, fee Q5B'g9eQqSoxkLc? !ʯ;`oeB}μz>aˋ"„ ߸g3%K|>?h%Sz?զq!acLEyy"]Mā{oK _ՙj_ Sl~I3_bg`^a976sK^M10CY6i}G-ЙrOۃr2D *>=D)~iYm}DATC:nl~Y C'oN u66k((nj1F7{+(5]i)\*< `򽰬 vGϤ Hw D 6/ qK!AHLJcQѱAQsЊE|m [ )k׮h i*WpS>Ƿxn"(9 <٦oĭHaط|N#rH i,."31 mcV8c_Ĵ?GQ sחk27a@ୡQcO^.KGؠ.TƝ>  ulO76EaOKW0  GL86%4X0$[ɊP{1a'qu0)0^ۧ#o/o5w^J%r[;233ڵkoi  ðJe+~>vnX%"*jhx sώi0_XL?|~zGƮm֍ qKk7xA#^}&>eJڹW?mb\+G4(?DjM=>NSg"?5!:L%kC M$NJ xWnhth!Z${z?5aK]lăާsCW!~Bu0P ¤UǠۜ ~t]Vr.Sl_П*Pc.{S&X5G>  `65f}'Yлt]]Bߢ F@ @A.&%jNdm%%kWP}_* %ԩ=Pɘu 5C(}߅F?]%8ZS >JɷjTpo ="DNBm,Δ/qcVZvX\SB1l?+Ӑ]E(5L(.rq,'$$q96y52%:H|H>ѯaDǀwi9߯@nDɡkN%&j>c3biL}yqoao>AfU[th!lݣ"C&}.&H:M5Qw(|N$K#® d?NiPê,޻z\ҳ{XhJAx.7?9JXwzp 2Jaրg`fI3)i:H.!aKnяy^{?'$}T=Qqk΃_[DxfTP! ^qI Y>bPɟA%b0c ޢE, zH0:[Ih׿7!tK1][d?H''V #;=t2ݎ*/x#k ɟAc CԔ hQsp%k#{Srx7 y#iTB5Z"FP }m$h{b̔1YEx8\Ӊϣ%Q"J(S7ʫ|9|/F-6yds"nL?JO ۧnb~׷[>)bhJn@DJɜl^DI?)Is1bVRR"TWrIC1S DkX5^dFG%~E1@X4s:(ȿ4Qg?ol|&Rg5F,@ ߡ'Ǔ| A ۚ:A]@'4: Ij@g ܻN/v ./vzpU1%r<+{ߴ-lLXkb"v^ VD AE{&&1fsyos~λ3gw='?ЋH5 ; ЪrmݬQv }J|xGEQa~hVtKCPc-Vo$ZM ~c ]?dh_Lj?&³OOmce[Mdu~fŐԯV򏃿t׀S7@{D=pгGsW0\0n07}d|Ѡzr'˩Q#2`5w'6 F ^Dmۅڊk^/[^yN3v9PSZ3HGGG}EEq/PܮGkG'q"Mp2Fq嫊7,*cyjkSҋ>I[r{)XUc;JP 4OI+KO -xǔ{,R 뽛q6~jbk-Y`S)=J}={v ~#adpBa8 8$yGO. eׅ>CQM5]# 5oJ1?hq {ܝ % myehk[&8-#z,cCLڢ@ODxb׍GÙqRp{7eu~fE{0~!<K7ŲcB=d rnR;8d$[keE^=5ԓWWo7TI?.WBQv=NEd=EA3Pp 0iCECނ~M-"j2ap\J+Y5$f d` "QNPJК:}9ivm8KF6kc$DCg~LX< I`W)[>U6}#kuc|lֲONos D,Bd %s,"** ~ ޿?>Fԋ4?9`'ˑcs>C jw o] wM"B1G_=dSouqZ͝vB[Hh;E$ [dFCO)*y{ʵ_;gsWbcV6iWu8/?ڑ=`V7Soܗ*,ա+ao4Z̿GIa0֯z/ s-6w5j; Gj?R ޾xpfPe}o2VK`߈Վb %]ۿ,LR sBβ"N 2P9YE ވ}pr$VO&g-f|5CWnU1w2q u_:͂%7S69"@HHXˁ{p\ԅNŸ ]l |'߄QS@OtVqw!Y7 "B kDm %jW/6wX[ XZ ӾTwJ :P$-8x)@$ozU)L͸=1lڞ?^MR #J.8/9(fF$O Ms$&E1 ԑ8 _>I_mY@ߛ:JwEE>S=S2+o81Q2}neW:h=0G(u4k=jd(gQ 7COJhDR:kZ6+RMS؄LH1&h D l k*2rVQ훸)0acxTKJ?י{>ևW\"@1;3b}\[P5@&t{%(O2dqhztVK+D0M\bAG{&_ƽێ;̮w$?KA$?k1%[/G;R1< A>ߵhz|#Ғvy^0 ql` |ݛq7)T @3B7`ˁzVd]xꗫQERw=Jᷛ_\/ xgRY{ᔀP\LHpeN421m٤dѯ=Ә_JQ n`'x.+|YNS #.lj1>U\RpVJۿO!NŸr܈eM5*XVM&7j+ƏDe#w~zLظ.RG xKod >t.p; lÿ\PױՓDbJmI1Ƈڃ:iuQR#6sn-C _ 7ITmȏyJMmVA `*퓸FDNɄ%z%6f\sL,]w&o.R]Hi/Viwn9>γH?9C^Ce:n^NA cDm m1HE1),8g lpyOSmp&ߺ?C:)s/H\vT$>~$WpE_$xUrP24r r!H́o"k/Ŗʂ)|]u(.ue{ sQTe>lKD4- J@"Tz\vI%'GB$N4Ht H&tWmgY4m W*2.ۿ6]p^-/jlRH?F,>a`تU&]7`Oٲ_iAsA"Eń5Q?8m/[؎E rUTV%RrPyȕUsjJL-P$Js7<7}޽.*dxA2W%m=#7$ŽIU-ZI8,i(\䅁 :!U@ilEh=a_aULmq[@RFV2H?aK󓧽WQpR8?^Ba7-Uo eH5*Azh殂24>XO^~?n{tNH)A cWe_SHPL m&N; %ǤyVd3_~{^m=.V_I> ӝ΍=:(]_0`2v 7[2ʩ Q /\ H@I;E/.]=).4/<\֧S1ųסϜP4=3=X&s2&/ȁPG{{xϺp7ȏd/(\HzRCN8\$x.9%B# <(,:"l姠 KV|8 $ 3ܿ9jQ](l/U^*A`6$VCބe9`ʖ"XYr"s)P/1zi7mj)|)+[|?Q=࣎AaF°/BŤ9IK#5 'TV1򏨼PNאַ$'T:C?sT/cCWN_;y28J8B ٫FF= CER,ڱNT U a9TAU?1kߗא'|BGK(p8_ | 9#7|#p|XwnLr[&ɞw3 $OisDcP'h{AlLK E3#lM06ڴao8 MxATs!ØÃsaȎ^m|˲H5*:da?``xYJsGa^w|K\qu'(>cBCEpƂJ6IWpM\'LG孼v(t,"^Vq;Ąm`Ni(T8u}I N- +ՓW\.<n0`. Y<{VX+y;im&I:Q3c0e`'Y>J҅G{ 3zetŒA`q%()֦ %&&簰0HLLdɐH,2\DIGBvQ9 r!7/cp O>jg@%D3y.N~<ѣGo U4Hڦ-z# lͮ傁ǘpk <=ƾzf_%.`yC*qτwfK@we9x/fDT>%ů)| )%ŷ}JHXAFڤ0fS hN$r6_:s@̗$Sb~%Eh} p[8?U x37 {WJYX;oA阰j#|ziF~ya^B=bPh96wyۇ6)HHcr3\Q6N\Ԑ@[y9 "{7㥢:Uo$ a|&0|D {l,s7U(X h8m2լU3;S\axTPV~o~u{:7n\XP@@)IHŜ~Lx=׏.F¡uғ~It:{ǜU牓N]TGAB̖{Cps5%Ct>1p}9 Bz43vȁ\56!!!_\䘘umZ nY\fg: iXQa{4*0\8AMTuNQ^T1u/x'5QR=$V&/=.I>0oK71H5c} [+m[B>5+p*~z FDt8b1$n 3Ag[l۠$%j)QkIZJZh )ַZ`ٸ Wbn/@ .e9~qq"ФOت˲/pҸNW9Ks57DcUAUXM=+RjGS)Y/Iu$&tR_o 58;DZ'd;uyD mP;װ9 j%; tܒl W1@C N.@ yÖm*H .\0eUb:dL "}P~/w;.TѠ7*N!3RyAY!EԔx]d+dirvv|$ikׯ i]oAk?J+>%sSӿ aIa;0`y=f.c9c%mѯKo ԱйI@l a`aXm"mP6+7jr%1#<" ‡`f4 怹6$4KuW3Xh2b1YSWnOLlmBʟls!=j TS¨ԆP)I&w{iC}vl*sjoyT90SȓK2 qo5B BEVRДYcއNKBa5 ]d ==%2&'L$fm>bб]h*.jsNuZ0=:ΈS nB zppN\q T NhU.Q?DZoP]Xf.淿}oQPx+|_h !'V&R8|B! 6;9p8CaZT7/!sy_+8?&k5\y3668,,Bab+{"""NB0l#|io;v`"kWrU~mԄc|_wexRxFU3i%{P3ȁ\3ԧbbb$%}Jqϧbl|G+r #j믏QhOIVJ.~V )dQё2>Y6 f[S/O4!p܊/q$SRNg.ҏS?h`fr$6!&?};u @}_$snB}>!E M|F9!eW "Gd Xea>^|C[ mFxa.-OwoP7I:W Ww'y.٪CA'MvdF܆"@5~`C?~#B'4tU=@ t~kWF(h}`QQ`26cD$&'DFF~/$D8` Zrr2G[ׂz5{

cA_բd`z@_YҧK̯tTA,j+cZA?3lT-||z;sK/t-$Cw[ZsU#|_4$ӂN}7T@R@ O1yKAGW?nPa?$BmF`Dsfa Ϗ?/#ߺhL ;>vcdlхźpLIaZs-L@܆6?9k[pdk}`@6w!fx܇¤> }Q}ۘ%ۀ0Wa74.^աwu6L*-- CcCFEEo h_z[=G;g_%gx~p;ƹLet_Abbc*/_.Q71 ʒ>%_"ӧ>.ժͪ?vܚiXye#{ +FU\w ?ҫծf,%m )i;]s1Z)+ʋeDMd֡}$%'P!;vMc7'պ.OV_w&Ŝ?l۟*/[h"DSL!h3 FKue ~X磝$-mPѦOLd )5M*6оȵl=0SUpb:[]ZDz",:'^ly8v+*K'9V`j1jI*3BJpE >C0C:?Ms~gD\: 7=J6e.4rI-v~l̎-ى >ꖅfQ;e5o0Ӌ=3DSNwa,V%ô|.,! pޣ2Dž\G7å"%T }q{닀9thֲߐ>ӄsVV###niG`7o pa쳱qS@(I#J? GIڞz>Y:olJ?M>u%cJm_z@N1T%>M]"-mP U۠{nɿ!>%A`~eOq~eȖ >x3 `^!hݱuAtwMA b:UYwz1fi9n7ygv$/Q`eqmVW1k56)eWTBs^<-#K݅]r:`\{sq5o]9JEb)ɞZ[L:1L.Jk}iikaa"ƒpFc~>9 %$&|J!$0Pƀ%qȍMr?ȕ6ǏyPR}9zsul_{/O[Z髽%6wRẇ}% ,MMif )ί| )%[|J@n_$H%!m:۟(a[E [M͕ wI}jf_~ ʫŀ&&6c 51'd(Ys=)BGM_Pu~=BA}xQZGqX/m4A+SX*#Q2/I+O5%P/W>Z RXbǽ_@]W׌^ݑX%'1 S1H$|.Ӆn~L縧w|&8Io Xt'K\c|/qsdhVAX85Bygni*s@@8gS͟[^ (y/h$ڙP%CsʔvfiPmp~D*6!]pd ] BAte85 bz r!G+I_[U{5 ds_.A^vh5U`VF{]yCB&TFƽ l@`YWjMo}\Jqs,8?z0v^Ο(K@sY>ϷWc6-օbs(9[\#y;S^ 4_EHHDEEHb_|36^g>~*1f㷛 pf:J6 ѽ]0 H's~DMaNŸb~H4|~0/ދ?gn=7}:+ Ӭ6oz{ 5;I:tKW.u K@lph1]bG>vǁ_u:TjMtzovs93 __j1@ F.,*|H#a9B+F@UM)6Do{>`/RF.K~cQYNS#8mn\_4 >m+t50b^ NWp{‹GtT@ޛ ukbv@/XL ǩ$$GDFܒ%gR{l"lL ^BHG׍W|o)fA@ԧ8[R)asl͕w8BF ["k5W.0rf b r$]S>V '\>n]I`](. L_o$Ou$K"JayY0E"P!Ī!'s4& ,2/iUxD$%+儻Aj? 0nӎ38s%1Ig.Á 'GoFx3> CcܪAG>Fx {_tw~ƛNlF >k̘*|wߚUdU9d"0cA\temEՄzR˴/D\3GQm`]_KSa֍JпmB}ĔMp6s~}SX0598:̡1j@Z3'fOr>6D2kO5+ j $m/PҶʍB$U#q=֘x|9Fp9 3솠,ㆍ~oi:uFnLtň絙lA VŁU_<=w=>Va8'ȶi@ KuU's~%K1YY0y=Ղ4jIH?K4K͕ZIWws㍭:p/̞1Sqw&Rk\k^ug0J;-kD0Vo-߂< "4dhkڝ+WuHN[szhJo1/ 5k!T3Y#6I¼m& GAZxˆ!57pM 3G~G}~4%i4}QxN0>>k:|B[@؁@|>QkH)XlHh[+׿YHڞmSǓNBdbL{T!~5*1Sڶ_E_]2xǖ1烪 F0y:a@ YiSgE A`26Xy&_/Y۟ K|J/qwb[GXA( Orֳ2dWj=v+ֱ7I'.ÁDImT&Wp΅1\ [M;k[]\>)_WtކO7 P)0 d@1@qL*ts˔B!UDzlSGgUKpO?eZ!"`mߖXbŸ9{~9I?|)&8ӠS0;""@2%g^DcGI07S6&DJ(%h "xjlW@i{dq*J>"oI֐]Q238.kHX& 2}Qz0.Jc[1\f,+ `|t- 0', >.^s3cY_|r9rȿ._:>Kd~IK2WC P%DqNwfC 'U.N~>7I-Á&U q``+&Rk<u&~`8ThRI: <0 *X9|^]UVr$Tdk(d&.&~6cOe{0؅YGn"EV`_cۯO. +L=~:nΌxvqH螑ޭdT~x)=C|lQL` }=%$XnQρcp  P<(,:Ŗ#gxz\-Q۱3HmW6M=i{ N1L6? B%q50o3bɴ<$X |??DŽK"X_4#$4_W!A/^4-5\CYHI*Aj7ٻ FlnRXJ:LXo Ӗ@J@(Y[c!%؂ɍX+^l1ep2k$SO%. ,7pH^3{^P$(NzIsD Le2fA v*:ٶS#Yaܖo:.s;.A` ־⯊J~%I?0i-d4>4{FC ^s npĖ[4E#4fFDDCbC$&&YUVE'2GG@vQɡ8&~yǏ1LJrm|cِMnp6έ7v1lނs#X?(pqf뢁pajK0+l<ĀpXX| , ^'al-OI$L !]1#tyd/ ~N ڬWكCY; Q0x8 c:ȶp`_p67γح0zI$ hF~^QKP)*tcl.v?>$h7_9 `f&h2'v'ЙDO,C k5ږu ۷mQ0b5 Ԅszl=ܽ0|ا-ЋmN=P??v0 &A@×OB~Ww'fȅp;pQ7LԊ=l'/ai]q^e  T=p)!c4J_:ځ=P /H-snd7=J("!;b1j_vdؠ?5O۩]ci3)п1;Qh;%A'-R( K_X3bx/:1X_IBn=ǐI<=b.qE0i#$pL3pfO? tTq77يK2mlM@_ m6Ƥ$zNs@_]9+<>c`6>IC`Ma+%g3`c4o *8tNܺڮ]vcN[+_cFv` 컛 .ca5ۗ~/ǟK~>ϗv/zQ}uޯ!sT 07LypFI<ӠaIH5 J麃>woĪEBQ?6J$/vPwpE | "2"vS#G@UQB'u bTuީuB LZ O̝lc*ww׻ߜP@rHbu goYCJPLܬ)ػ!𜥤$N={׷W~ûVCDn{l;aWkׯzMڴW5Kǧz%gըnqf3=c I8>8{taCQǽ.eg8sw5V$]-AxATl+Qo yš gOK[DATfZl `#;O h|PeID 7>z/G0-'vHgR1GI%N"Lyml g@`6WE{5,[cn_q` -Zysܒ/ Ծ$կ>K/4^n~Q.*|Vdw`p:;1 &1lqo!5硪uz""p2$ִK_FÕ(\)S`bϿàv }&;W R`*3-6ʄyD~Lh75 guZEP'Nϯ>Kza/dg!_+H ~I6Rj^[ k'Hkپտ,.v ,L2K6=DCUkr) !@ 2a^,C~~oA42c_@xjȰip̀Y#:Ikejoh;9NM[OAĠcwb_η0)yM4LR%qLMM}Ã߇<#mH萘eddþ$^CkXuo#0PF[ z\ $)YO㴏 |NU>z;3DS1_)KPϯ/ 䫳a'*B")~opd{cA&,Mg`\훕JBA&U xiJ?QMvb-M !@ 2aG~At@=tbbo/" ɀYdh3ͤ0{wS1ԏo)&EhffCJ%m(՞P޺Vu1[3e  *- lW3vՠomǠgFLA8+K &%CJQǽ 9ӧAwL#l R~: &x]z5a$ʹ+X.H Li@ iaݠXߒVvwh[h%cmD ]y bpp`Hiy)XWSL1sBIP҆ɴ5PRxWqduI@espM{[bKPB ‡9d"`_2į@%~op>,ګ1 @%lQ/\~[2;F'&&]ITCȿݷ_wE&twRid=70 8A`w+RW]#&F{o-\"Hl"CLc}g^ͤ})D!…GGbbYlD bߏ%&Jrreڇi;I āf̠ϟg~>MA`_/YPPO__)42WH"&j5Cd_Lx\/mq;uPp@AEJC#]~SL1]f=(Qk@lP ]3TO렽=+ "{%|FY~hP{o.lM@iN+V%QWvИôվб[}h EPL1Ŭj`2OK2>3;q"{&b`wqoc!ZciC!JSڙEp) 'NedRXm0wXG_1SL)2 ާkZ[}"(ǽj2;*W_c\Yo9~7+ +<s6$?| ~WL13(>NXJuS$&6M ǽj2;*WC3j=#cd&I2iC@ k3%<]c~kگb)f*G@lUx!'إɘ|427l5Kw_iw@1+h5~ׯ'ghCD mJ,~SL1s51 /V#VRoR|85&@B ~Sǝ*ۯ)b M6bN("t2`Lf Jm1_vPh=  v,S/{h?Bimػ}H1+IK-%tb(Demb) IXEiRu8qYrTW0\9G_:GJJJ*JH2YDQqRzp\+.+&.sUt9^#HдI߲ rzqErs{ ~] @G> OqS)N-N_B˧t#ƞ˚9["@D ~c "<qo"(bi"(9Ll 4aȖ̘cch5-Ycj1Ȝ~btttoi3)rl|B,(bYʊ(*W,k  ޹s'G6aC $ӓ|z5XpۛܡZ}|H9%i>˷o TrzRsa@FF/ Kr-GC-% -Zcj\dq>U)IqkŚ|Z!*LmUPL13UUrFQ@X&DB`V31@SSɜ~Mpw\w]}B>{S<1d(ڲY۲5B@4X8y*Ch!==e[m!A!|QPL13U^BE(@ $(TWWK+E~(11)Tغɝ8!`$`R}#x@Ί `Sp,7h qq_bV)0w9(ϵThb~[SL1LmHJJ%5EmDO) Igd<|HɼThOflO֘/ŇGvq9HF 7/atl Ra%:K_.FhSL1LiEEj&Z"O) rcl"pH=ɼ.hfJl֘/ՇS E ~fؿ?B%n!fB~!(bʲd1fRJvR#x~ b`I@OوL)5TId@Λ qqq^Ld^hBof l/g倳*+ÇCHH!RaKuMen#2S BfJ@1STD'(IHIJNQ_Y 3\0%%a=ц}|? B` @OYPxB̷ܨ %@ z23 /j^jjr  [7[[Ҍ!2|%\]W%sc ڹޒ¡؄Yֹ6rیt)SL1SGԬ ^ 111LO Ra K)OGGG6H{1l)3TbKIyy 95B):ON%qyOmڐ)ğоck_| h㼙)Y[JZa_]~*VcqRMl^:p%983G4+Z\"T2ӧ8-.]9/œ[y dvRQ)jZk "TTT ur|T;<`}{HLf$sqJNIv߳tu_L0qM`Ba(p./"eUgd\$gZb_[PDoI1{3cMH7<%k+)YzCrvL!)/>( gGؼ !)> 0?ugŊTJ?~!p MMM,J̷UJ^8w).FFFHNN RakVXX(ĉ޽i)T(똥;FJ( "عKY~_ QQQ6#"Ci'у'წ)(4&{M+1j4Der%d}$E0I-9>f~fJ3RxᔬeWV~υ\#B%F5l@0rɛSGAzYD%Mx(ID %G,ƌ:v=lkߔDQOLSR|K̿D|OI^YVBpcH@dtgD*lN.] sHbhg'@;zRLAEݪb(8p}FJJ "4m/W(**ĩ9] 㾤 RXPE1[m-n$k+A3`+[Joݚ@="f\?3gJj~WU^,c}/T2>-ӥ'E.`rSp%yӿ(>ǽzD?מ5( 7c?:弍ؿz#ʬw<~{fB_~Aߧk}sEC|J_Yʧto5z(|yA<|^?Շ}_X9](Tjp?/΋ؽ{ "d2>K*fff{D*S\u vGsHAEEtwNyLp(Tȿzq9Hfer 11OH1BbU'I%%SյU[49Cr |=BPDieocUЗG@Zju/k\|k5"Q3ic M~t~pg_yLqJֲ)9ڟji$dA~Ƭ}Tr"ܾrr}7˖ܖJ3~vqVnewY f%~e._|jݤGވ}3APw5$Os59y97cue:|}߳yMq a^}X;D.$$$h6D l )X6'%%\ Rb2e`*qvQ*<%%9чr)H :8KUسg} "0}_ A-..N9~$"lFZ(f~RRa%32(\+$uyɵJn~h׎y$ I1!o7[Mydd:7Jk._Os,6YǸJf!h{vCXX]^^MaZ 1aÜ1p7|\4W7dߟ%k`DZ2XʧpaI_ۧt.ԒȯqjfAoÏB|`ր7arW~My/ YRVyq2I) R`KVx@ TٴqT@c$b]|w^N"dM>LR,L@`ԁjAD*1_IS؃9SPƼ)v[BCW3Eb J= qO΄ F)8{BYSLx)\=T%x ?_ ҏ6Y{VK,Lvi6cm ٳ6ouv*Xn^`K?#k)"`wԂ$(rv۔ {Aɜw'''F;~2†67`O]ϯ,SKoiTh~L*~̏=ne mk!ȨN1;'Wlo+ԞY` AgD6 îdETc,\H>S>~/$Y}Xu;#G<^xx/D* 1_-gKe-eZYUUx]\)z%h& iAmY@ȝk.߲G1$bR_[@Xz!\_#Dp<3VM[72ra-zE}`7rVpJ|_"fz2{,}ާ ^vmᖃܪg_|~m5!Pp}n|.[O-taJF8 za '%iT],8ŏIKLLMAL)(ݔI회r.1_vNޗ [ BY ? _p3c,o%m "Kc4K WASF-XZ[`-UMǎ~YqFsZRCxy{pF!c8-\R `@mUdmk۽ܫ ?F0lw-ee^]ZBmpkݚ=o˖#.=.=$\s۩] ))~e2ĿtߧHFU^뿂K/;*.IE7p I?+ueRAn$޶9ˮ4bJ_ԙQ 8P>)iAH91LŦ rȔeHdj뉒j¥` @o)mR;qm\E(Li, #hu60P-t;`rY޻ ~ ?\RE( civv}V| " 7:$/|~MfwZASOE >f}&g˧0Q_SR}K̿|Kۧ/ 9|MRuhDlf=_ĵ7^D|*VՉ ̝8zK% 4S&mr+1gB˯!U/*4 еȯ(3>QѦ j#S~"<2K3224Rr6 JήSr1%g(9v,@I#\ %lE0`oY@h*ǞlT!=sU,~[W0< [eK #j~UE/Ҍס:'@y7PR W?"RL ˧WK̷}j7%[}w1ҿVT-o0μםN]Nɻk4yԇ󦤤hD iJDL͖)SJfax_c4=e G@yMXFБR%m "goiDfsM$m%iVUE\%Dxx'm{–f߷kKz5u7_xU "kBS1eBoq%JuYcZdj?W1^$ota[^:d%"UZ>Gl۾U'[Hфn/~S*d/Xء> N(^~7F`ξ["R@çsw%|JO]|8w`  uaVF,8{>|g :Rp`j!bbcQ))eu26[kguy9c!ߘ)$ ~*7X*y&378FABq*|-H6[3Sݷ2nn'Gά$4$m%O_$'}@Bb<&}Z; c6gv\xMqMxD"-#پ%c{~K!kl 1nUzQ8~!)d/%c~A@?زu3歛`m}6 &?Q7F;3pTo]6S\2OI/m[3r$T􅼘0_Sֻ \X^Ä%{b: (X*?>SW8 sH5M)(nJZ;/W.>z\IdwI#"ܨy(_ B rm2? .)X& rfV~:**􌴙D ,aOj }(I|_냟;_ʢH /~N$_Vu?iO+k'&k;ÚD")|K`o1_uYcD=Ky}pkF㿮wqÈ $q8Bи4ow7n??`~kj Xj_qѧ\;gowS)^>=^$^|bUgeh|VW:cvh}m>O?{T-4T r ׌ +S>[>u?I:.KfyuAlkQ?Uգwk6u1w6|^*~a՞sD i/UHE:UyJ$lٔp^avV\(5ړ%dw1pnJ1,rmXdzEDOAB ض` 999R'BLD*5S޷2$:Gܣ R`n3k~RAhYyl'%iUE,.FL,s,@ o7Sƒ!مY{3ʅ eUfrFI1^uݣ9ߥҩ5ckWېkKy);F1q]cRl '//,+KC̈́@O/!)xg}:.|xd>}:z4{m6yMIRxScЄX#ē)X2>^'Ad%Ԟ͔ؔf픙KN¼aRh< "\iV-Xp@uw< \M&!}fEу^lݩxV VqسNk%NUM_(Tcoe'(>=t𪊭[*zPzV߫~v䂡$$!*%F' =t^ @&%̿ΙÜ]f=y'9%'g̼P'-=OpqR;@hExV UHA+u5`&GX6d@'^ڻ)8 h0loNp2.Xυ_M.꫿DoH/gc~P|LPxnX y F鵤$ Qc+F%2#}qG0O& iH&H@ֈL yy-ȫk7µJ'V-j[>ȱ;CL}6p{K"9$?3'_S_JS4|LTR(`xb6Y|[Yˋ,82*;,?(n K^'YN38b> f7e4PRǢzweDžܼuC#n qWB 5vn'x(5쵒eJZʭb=T[ VXN]k.ʎUMJ ?P&a[R<e);95kT\TۅeESsHw?Dx_NX vFkGkZ _tv#"} MϿ[ 8cf}+} .C< ~q|vyyXW_g%T ]|Ȓ%Uúk0`[EN~FN Eā@C, 2u_x';֡M3s`O1R-,._KTH|ȿDsEO_\KrwL:'U/dd= h;1~Y[H1ͣyJhEq b D uk-5L`*~P\gg7n># RjpHb>HDhs(EȿA(ʺcˊbGB" v~Mx󈮍! vGIs p[{uHu=W\a ݩE0kG-ro1HELcM/7͢y>t+CC;ӏRP*Վtsx^7}( koY"*`u`»!EgkeɷCq|~Fd>eԿ@͞JQH= ` |GupʚQ|m/+:5k+LFZy\oGtJ0145s4irVE6cut,OCJ %Jx|X&XxEEGA}U҃uLXlaWcWIσu(8n1Qs)-*7`8)9 Y=`1!G_PQCI$rk?mBjTkx8 K6,,OC̦UsA~ -^4Wqps_D=_"5>7ͺ]?7=x mnNƼ'=:dM>OIփ! xmѰhR64t..`^?==Ix>49Fhigx߄BG"en}oNEg~ ߞ߸Ȋ0b\iUU5Д[1< +'-ϒjÌpNb/P~YJURҵ:0p|XtE!N"F۝G$22ZtQ s©8¢Y;K$07,̉(e !ضM+xQS]XhYU^^`BnYZvŦ!z6wEy}l< {h/zL޽i]V7KO_;p7wL8r1lјhm޹*;Vg7? > b;huW "|.F ֶ%]tK;:n>~6 ɉq1_gKYYiD~%EQ+(_~:q%׹r(&j kC.v\iJE.u֚y1?ؘ"O0 ٱ`]Bb>ES0g&G͛mAG܁QKg鐐cOV+O 9kP()-dEX @Z𓥐_c"%%|p-__ʯ$`958n N9{뎍 \V5"hkNr> .+b6wE ۳C@6[SI%Rk4۵~Y=醛:-h!WjI7voO}oZ٬eΛ~?u6ݙC?|j$:i䣈b$4#ԩ-ৎ" 43JL{<33񙙙ȿW+Do'SjṶee"WZie( v5,ɼ`dfp!dK$5ֺIn5uP\Q` |JtF8 r쩐ZXSuQ&XH虤ibyyW>OZֺ=S_ʗHRԻ@y;?+Z(]{\hL@ҵmG׾@ZKH5lWkh-K_\m}i~(؏af>&GB~a.))%ɚ>x}JF2%K|]%P Z$_#g $瑬$8Am۶meP)#~eO1R- _ƝV-XiRTfyH5Z';fHcc!0pi'GQvQ f!72fw𥳐r1S8f!8 EX%11@D~$y;O{",Ϡ0J3 tAP4:!}?'Tt)U >0z /r@ ?7n^o&z $;Xv,%ǿAc9Vl`WFm gzH_N[Ґ]l& ]-]Ѭ1A]ՀRu.E%!} 7Gbc,Mx{oe>Q kKSGs7oSrR{mٷ-kٜNZdV2k5!I[y-1L)} Ǒp!B$`den&;[0Sr@[ {7 Ǻ]E?4t1Hxa#{Z 'K`@O0lZyZ-Yn8"WX~y(ndD*-qrĉ;`2idJ " O4 ʛ(.SZX$  mYB8HV_O`yyHD N^>Kt&i x"S^5Z1SVx0v\ӏ%X(_+~@$Y_wbE?%Ŝc<'6)ϚLeU0G0`OUEC!xBη@> jS_Y"0I]QǖԴR-N![K:3U]l`/ڦ$A;DP|r1cbt)V +}ϐ1S,?AA"+@IV"Ҁ:#P2gk.Q}M" dtZOrޣS;^AZ5wqJYsڋ@Lڪڲ1{?32BaT,ӛJ(]}ot|(0\X |1#++Ԟʩ -E-Z%x.zz;FБEDKbRd'A ̴'DXyu-WKgQ(hIѺ_4@`WNS~ Cwlm}RRR$E,X R@K>_- @>fX#я[pYL=!nmBvQp`Rџ+uP9+ H4$ wCnvVKzpGgcF9;Oʤٳ3_?`5C=9XDOF$;./qc 3IKUB#P3g9[`s},Jp5JϷDm@Y_o:B9v ,XEv 6aW=8FI4TV1wEXћ3 c!..`qtHj<{ `_7[XM ' b*-?Pk v XEE0 <|T`h+~+u%ĥg jgwdTQѨ![%gv呔$*Rã&t$[T6tO];K~~:ѧO/.(/hfb~%[z P oִhA'îUueYk&χ iuuu;-/Dd "pUT&D"OSkiQJfP؀?`7Xe]-e%?^'a;"<3Csk,cZ5Eˆԥ %]cE_>^,Y X{R'+&-11"K+jJD\(MH plS WwAp 0J9ʍi^xNGc[ ='32o^ ~A~'] ف˖` _*cmU0G?E+wd=]H-H^ۖ@>|nԮ"Q2j} 0=ro>fKLc_nOJ+},[5i !L>~VrpwVFKW؎򰮪Ɍ{E;&۵&U _~fS4DZ!kD ,h5m0lwm^-kV2GbփnZ9xno  ep?<5\4jG^ABb"^{FJq.Dwm5Rqc1<вQMhQl.N 砭)qBc/@ǖT0{Č1#@3-%f@1cYu}vo JY? He| 8/*| ԯ 5n]J9X/gc9Z~c_n%UӉL?x.ﷅ^E=`R%v&$x~LɈҟ<}Պ$t\c87ln(4ŕ$2 Lh'w$} ˁ\P"ם;;v͛ӃQT[;:P+[|JͷDu>s_zв9pxGAQZ !yoؘDv4իsm;aaK z?( b3?D[" d. kɘϊc56 Ĉ16Q8+\?]Wߏ]I{HX%sk~dLWʥ0͇Mϡğ^,@ufwt&,>/+Gܷ _ ;_o}cKi4/{ԧчcn|yߺZFӢ.>;C=oz;{~ﴈ` W:5tyKb^^@|شVQ3%@.~ddd |^^wDB)uA(,*kJ5,c^+aEas6k!/8@D!8˟2DGG}Q}(Z=AH$aaqAmZ!ΰ6 n-5+`Q1g$%9@@\U XR㔔;L؍'oZXX >Ń*)ɿ'0 va5eYk dmF]a$q=DаcZGŜp^`{Jt1='Z*} z.QPtˀ>۾}#T5k𰳫[ 5&襏S2[[GyX*yjw-^K?z<=9A47nӿ;]տ'a~vww3| y.|>-&,_CO%@~|+  ̀7911ah5mw]]YwAH:#fKN8v-;U/GK`iF + bus.Uqטwr7vrwlC,QlWp_S–اVrn#`tG`v qYE--Av<5JQMTH9]cc] 6 R6( WGHgMM;·t}KĿӗZ~d: kK J sqs ,iq֫(xb :5s5##>#npl@ 緄c%Ÿ?^zpEy}Mu]vo/oٱ}5 ۱>}w=zЯ:w:tR*_MǏiZ]@DGSxWo͛7WȿoMޕV^}cSDgit]- }~U1n>۳C"KzZݪ%Ȇ/<Tֈ,j,q1/,DΰH^)hAbގ+]BN$؆ dQ[$$°9ҥ ߁aymޜP!>Mǁ%0uvD yebK =g&=ֻ1#z "b5^%⏏vm|OyQn!6 O} Ȋ[ =u;3Hky'"%An?U n WT/zv%V\гN||f3@lw3u [eyl'tQ.ih 31LN1k`$:cp@DPQSbAPVJSG2wD"-e yy9<򅒴Ry;@8bcg0~ 6a.a}jx!Y~_!@+k xj$1SfXDC!0g{|M>N?[mc8&FxWـHD_ma=$y}˜L݀%V|: }]5">զ4@+% ۶-k-m۪۴Y:J&Ք|J[7^M؉kChUv͏@w@Q״*z}{Zy5u5Q4pD mFN6%`n@Dh3ߢsnf5@^>w;@l 7p^ԴǛB;@[ `7bycbKAYKS˗_xA;<"ϨH(bv,za5#,apNSjVH#H\/*3CNI'Al߹E큔_BE8G~_H)urbW@.̼Kpy :p璒+%qWPLw\`uH0 \EEI*2~vqIID -(-L'=[^ٸ~z6J=@qww-Nh]ʟhuS)-Zh#L;@я>G1w-}gT)d?gFawqajEvFo/#7, LvN:\MFt 99kDO#w@?C )do]ЛTrv k% ,bx]+̇11{=;Hy7Ez  8_;BkSy]cbY Ƀc~ILJY88#Pw%q15=9ZWzvOW H9(äވ4n*/ G` ^,b+#3+(A>yηZ _7s||ދ@@.J;+U_p,A!EuLd"6 8atpe/8:k`$ #|8NGcX߰;~Ϋ?l!ḩ/K"ioߝ_7ߺF~XDԊWL!&7DdM3=4 }X8&zH/Zrgo~..\ iӚtjOI_3bDП)~eO1Ry!Be[nChX& KШOKڵW;hшWn3 0LhLzmՊv`SRD1 1Q4%5\nشNn ;z|!-sX88N$p(|vzu,9佽~I@<|wqw>w@DN3?-*]V^ @D j[2\kh1ە`ޭJH)^ ֩n-tF݄ ~(A>"dDES0 F©C4"R]D+5O4@JJKK .>Gk4]gOu :wlK6OJT!N>g} 5}r}}A7oH_zsٙ?m`'?O)s?wSEJsɧ0?7e2]=/j[tWX4J:wv7<8IiI$*:Sca1uTt0G0//=SbrB c=ğ e3BޕO=v1cNH0` ÜX7GA,*e , *TTw]{XԵgdXdtf}Xj`挣iOzV:*kD^-u2@^0:&0xbĂzxLI,"8DG'։!O,hy$h/H9@˜)x"G) C0a)O+Hsns5}s4@9KNNx(p*mqdn6/CXSC3sC::˺L wGc?_ߪiAؼ- e%f_ƪIZ9;67rf#P2W_SJ53?GĿxߊ8fPQ`zpCD]iCizm/4򪔖LlG}-֯Z)=BV&{\dXcm#!%ܞeOL"~(R򭙁DĿxߊ8>=>y'yuDkhQ0>6wu$ƫ+[BzLlD 7K Iv52QL;I\bOA 6oDkS!SijCI`kF3)T+Ecb:@Ζu T*]C1OL <D^p+lłX"ppH`@( r/=#IA[ zLDtY%!E1[/Y\ r6f`cF?6#^,Bwa;Vӊ )4%sДItyȣ$VW|nq14Iǹ764 /@rxל^ef@/%pa#<6s9;(:ڧ.~eO)" =@ƓH@ X B+riUVMM[ZÉ='wTM@Z? e3~Ω}3%'z!8^`X"!;j"ڈӬ<' "BeGG1FοRBy-PZK r\P?J)'|ؘCZEM@@ԐU \# `h7g91Qd.sE(0\p}\\\gY:[+Bcq` R]=モBD*Xn(ʯ)WZ%_N$+'Fx|iKp {DMaN -AA;D0of Wv X ge!q/ ['Ufs]].I sD"f@aHmJώSHDH?> |Ll0`%yY8K#X AYvl6AukvW$Z6aam8 h:)UL"`>";W(:% PqaZӺ xk^{[yjjҴC8V60E 9!<.Vwo? DW#n(b&f-=rykiBB,d"!w"W ޖ[#Q<p S?%&'T9F ɿi|I*+*8"Wʖ., Y]V~=1/0 bjXd=2+W.a Љ]i 8 ɷz;O4D?~wx:k :oNqb|:wl[ mߩ.lvؘ/w߰nʽh^}DD0xyPвEHH0M`IZL@ND."uD5u:NjSs\{}S̯|+hTD`9o3*A0c΁q:ɨ +.+E.v>$+gk!11a*VUvY;O  Na=+їeyޓ]nX4Ev'7ٹΟ湆1)%`ae_'1QA^Rq=#cv,N \]I]^׼&`Ǐǀ"@==dɿ>` İ0u" <\O焆Ҏ4?9Dn1u: N2$* N;آ|>m@GAl!0" yIyn-.@k#jፗuLy!{Ww] "5^˥ھEʠp{SJ9%X"0B[uA@y"z5Џ"K.=Ǫl#dW KɯZ Oi]^׼ƛW[~̀ȍ2GP7/7DYixv}uL?ȞVvN v̗s ր aS53q#'J&CsX^`j;fz32ӴL368iV3($E0 !0@A߼4V_[%「F;e˶M)uy~J#բHH Sӓ&Sf0/*i/&-&LdܫZ][;7̋y lAD3mH;zyD>@@NV@M2;SD*Y3D "pAZwTDA+ z+"Ď80׫͇çw{#bzL.h1 3+eyzH<)S ԰`8TYSj)G$''K&V;U]b"6 )!~%5k^׌< w H %7w z72[W ^+x׼浿y A`eE Zغ9@-"~3}"pz-y$nse5 <63H-SZ~ ﻙߟ4FrW'NYf?3PQ@(jE3sFCF9^~}a4z6niЪ>-A̞ȳ(v N"PZL@D*+.7`k谼 VD=EDVVV##f:KH39gbz~K(=ŸLwƿGX=a DNjD#d%bbhZz ]vݸe#C WL&lhEB֥̬)z[N@$϶̇'G~oZ[i\qLLL= NXPpxZ)Cjc}#**N׼59-TV:12h"oZ>yf+b> ߨ ?6݁!DCp@,=7o w酭9D.3@E\K9~S/b+ʪw[ȖW.賳yϊU;akUMpA`ud:;8wgtxm CWƪMc-! 9/""x-/,Y,ꇅ-FD_$g22G)^+]3̜A |̧ș3Y3W# '0fuߘ( 4:.HH0WW 1\Xpĉk fh^^׼LdTTJD$sg,:U"D6U+-%uɭ̅k\h3 ϙ߸C@6%*' xotE@s"EEuiS/(P|:-]5N g([5#?T*"pE.f"!glJ qv sCzjyY"GBhV9F" Gz?ewLHCysR?9hVHO!hxQ-*]F=-åseJ0m~,l;&Cz0aIJ=vX$V,<ҽ]# ZH]o2H32?.( yo`~v$"J]&z5nBEr?Tː$5@<(4:ϒrO@D` h:le!/))ʏcccY<8:&$:&t\|ω iBr!5< "yk^rs7ZțWh@iz$;Rx7 Fj ?VQې{NӋsz Mk1Rj@ pKDMnu6H1,iJj]jݰin;#szqw_8c8pzz$@M ¾F<;^(YLT(;//%(Ak>n[a3 }h* iɪ򊂙3\s5v@FBG'}1h#ws"`i}WiRLg?[0( s!GULߣQˆ)5zH95yͨ!A@f HU]E&f*Say)9 rx^ @OOH9Q;D{ ưe4A{ˀ>4{ :PׇK9OMq ]vsg:û&k`+̗F9L| h"@jQё?.rg##.9 F8 ²Y=D"vj_Qt-]5yУŋ0 /?,ovΣp"5ֿz8f'=>?A3F!'3J4Pf qkIجQ[$2A U.pzf0o%xO37z'@.rxk^c$ @KPVYt<_I [G8xpɓIpW鉻 :@䰇ZoZ?f13=Eqőo_׍‰>ͰHt}wTpM8i~no/KOkg_>GMӚ>-A̞ȳ}4ADEGb$SJ\|lyLlבQTۥ!9]Ȉ11ѧ~JLJL{("2Bj.o B'gvAHJJ\ "0bFD AomלinDtݞ< F_?ct3^օ>qutݝhIG0* zPC8-||n_seKsU"s"=;^]l/_U()em̟4hYO5k M HiV]$vR\zkƼ^4ĹH܄ʺa\h§ɡɖҐ2@,==iG@^6Ns7pw13eUE[o?7_F_?Q<lJ, xZּn"w64ǜf[$$*7>l42Ӝ;L\<-( .&%4"*8 tAxh5F w2Lߊo y:_B3>u; x}8]6}{C\ [6D̈́2v z{@ԠAԛ?7pLѣCW"4[O}e!?۶Zo"O0APYiZ4-Z2=9 tchFCywh_sw-wαimlQx&~$S5J4LK<;g22Gɿ0^([$r@k5ջ++]RԊ#K 868-Hg([X(.kҁ? M)/)t?v'MKo.~9gWGj>c>l^0rLSҡ uq@3PKb>yżCaMXr`|= кUSߥSٝ pz`\= :=-p ր7US0 .9$QvY]L #fDػ9u$NvOh~8 - =Fuq 3v8ӐYB@-DӳүӺ cFtg~Z ^:YAq4·6&ȈSH. (`>zddy?MGU G,;̝|=qi WwAt6T"j"Qo is%?w-5#>H) "7\JemّqD_ (jGFEcօVj63_}W ?87AS.M~V%N5=XG~8_KqtO;%JO=رĐ!GPl KE-o3>`|ܐ_TyلGoZϘR#nEl K t .N/b߃7:-oy`ޜ`ݞ}ey g!R~/W7ul!C҇Lo;9` 䁾txm Cjxr6fDIcLVcɺHu0"c߆D6RT#Fڙ OJu$JOܥf4hGbbb$A .p у'@pew ,,ɗvnC52 ,dsٻ)n0?'0U) =K_FH{qW >jWh0{|[">fD<>o{O"?ErP9Zf軨DwVוvLh+9Ǹ+ZSf`biM/Wm ?ޓ kwlC=MR^|st`)=?~D-<а8?|OHve;z>c߸g =΋6=3U+?s }vhgΨuA ;ВʹlODEuS.41Rj O'hH;zyDЬ@;];Õ&(hi1+,]삀brz]`wGxXv7]B)VG3Vk2/Zr`$, Nm8:@xaՇ@sCEurp~B W$3_'^ "G0!{Ubq ]Pt\  zLosfR ĉBd59aC ^8G"YG` /' g+OxRj[g|?/ j?I0%f{3o,Rʗa> ``kDүv﫮Wۭ+ȕRܱBlE;$r'@c5811[mAy$R+g@N AsKK3#=;8oo҆ɑq/[^fC=9?D?OO?Mazt4&.D|q pngR_J{dM8'4wOswwoZ5Zݦ5-x5ͼ#v_7 p(%7]h !MA({eQqx݇ҩ4{.މ~ѧ<iCT `I;LPv8pqEgAL'"=Ɗ _I &Sa+977o(-"jT݃:4 hAsJ/ѯ1ĉ '/@BKP2[yVa@=^Ty|1KbyŘY3u S ^VZQ"`@JK($ WGtO.," sC:[ȿx.@2,_.!b$0|MEJd)p;kH+kKk.*`;X0RUm}aM0'B@CM讌4瞤A;PE mZCZݪYXVEt@f3B}eD>dFC̚A\؟|/(> ">Qynonsw5?-Z-R _Pf (;')ߌ{Wٻ(MThT{K1/%^ bCA.RTT{{7]EQ:lc{|˲3sgg563o:窖0a8=w԰'L z >؎1kjZ^vDQ/U?LC_O@bpre m/5՘oc֟ xլ- 9+򌗖L04s2-v (Ů@GnX, odz`¼O{ Ę0g@DW׮x o1b LEe!`ĮEwd 7mRM !qlLܒ j!a7ö*vHڱ۵b 4{g!qV1];4(龼j1l!~>p"?ޕ@'o>ʵЎpnO^05+ W*:6Q`vj9qάPv +1\>٢4\J%R_dcƅ7v]/kX U JcGdz ,V N;8Hꯥ^~9'S5YK~*YR8g6jg1jH}|Vł?8ӏiK7"Q<.\^Q#|WAT( sr24p.'LZԭdZL^c}N K~tޯՊ "nNr1m~L~~3ɐn)(̛7O5/3p \}i.npvdx Siop$ҳ  B-TJΨ(ݝ-w$bVwƂR&fIs1Abr, *K&h[b :I˘Ǎ8@OymkEx<7R`op|y 9 3g~:;kW\k%+RDO [3i\u|}s+ Zq냅M>Nkm^ mV'qŎIȶsv7G}V; 037?lEze/6VHdj0:(ߟ"x)W. /d'd 9s`bQߜ7kB`0-o az  QoűT ŎYb6䇥%ƯJHoq}τ8^5BB?@RQN@@.Zs[ג9glYm 7Ɣg T%7_J&c\ȱŋ"_kNEQ?)ETcccE'w 9eYq\Ҧ}CCYj?֨~޽ `o.F\bx-3lq 6 4WVtp7i3R83%K~~=<", 1>.|LLCT"W5KȒE+w{|SnA05@J~l7z,ZyhkzFs2=Lk|zL#\/Ķr25jj0iDB*Uiet3aBz[`_7O[]8ש nh0zl \|b1T}g\,Y*Q 5m҉رc9!=ׇGɲAŔS`p po̸sGHB- "\ BmsN=U {`E-X3gx A2S1,1%ŕ_ϋ "(O.\`ܹV(0[~&P@J&aVxo?qh`,3u ÅCŽ3~2-^ 3kNFl9p=vMpЌ)nјikSхyߥI)O a0Q)1 W lSv, 竕*UDz _yEh9 :t eu/g?Rw;B[Sl>`oӜOrp2=LKkV\/-Az^p'EEb7 RpZI #p2=t\$8֮x[ENF ^F@ o5QEpZ`\iͿW8_m~ be ~"/N3ײ"ٓ3s~T:)Țcd81@ QL>]@.<`p6 g.|d$8{d*aObM+V-!666IDF@ښc5fLً-#e!r1c̙]Wq[lxÖعbQ7BB5b hc,?.?|4ȇx{wgMpbcK8iS˷˞;wI9\<5'2gJ㑧zQdۇ﯃jXY8iGbF)v=&fiG}z~P[_Sv[j(grOG?Eh!?ӻg+1INyF+U*ѿWw*4lY'Hx˕ky,Qd.cu10 ( dzV*dLfw^ˎڶ$лUYXE[:>#ѰW3{B1jN.LYS1~Qh8_(hr|ya~V/,ֿm0_3T#5!o?NAgq7N\O/th^I@*'3B?|C؝2Yq .nٍ?'SzⰄ"O~CE sC:# H5GdZtjn0q6.Wkg 9q@–PGOT`*0z?'CK@&^k2\m) 1%ŕZl>\w|)`8b8 Dg.DGG%Ι3<;@"!ܤ}̳X,ΙoL?l5\Y\hl~/YCp#k1 _4mwz6)!upb,ԋlSl[lwl,)Gv$kfv"s&d;X >y&?ێqp#uD2*-bѸq4fL`Xh1墠t}߲c+==~TdV߬8ɍ?z6-y^vF9vJMd[h>nJ[Vt&6믥K[v_J0Fo6 Jmڨl:V?Ҵ,TU8= 5** >osqwh;PلL7x cLAlxC#m즴o{+UR?*p25jgK\nR7.ݩYuɵ8Tpl[`_,kD]ˑɔq^*oL&b>p@kK_ڠtl^/a-Nk%V/d7(fw['[:/thȸh[(t 8[TA@ ~dZAʚre{Pj.0p֖v'W峱(ϳH;s;p/|`xr BH.lbTml,M@K[^<PQPP=.?> /b!ՠ^|JPPS.+ka-_7>q%s$cb5Dx׸c2@t> {z-q-s`8>K?0V.x u_-f4gGm?fT .?~3Ccևǿ߻ 2E>pP^f@)t,03ձq  |\?kΚ>v mߕq㊘q4~ fc0.5eJM L5'yR006hX;7Zle7'~~z-%;b_Y_2um )gf[Q۱pdzk|XpR B. 7.-atfM, s˹rYoT*UJp2%j#Ήd3%Vmeuc7gב[\`|yQH)/V?X*ô?+Q|`8RUXb;4|`wSKMxpv(Fu #ޙ9oo\ˠ H[U3z|y0cJG\y:TnlcjyLG42 #vtxh89, ~e?D16+&h5-ޗF~R)VooO]^M793\̉l=QJV" {ժUi6i`e9tb؅qpW T10)v)nL6 e;hKpE (.O61k[MOS/ܓ6k.XP7g5DthW^Y64}4Œ΋t8rl)t~"@=]:/Q8XҵעhyB.jŊoӈTF?G`ɯ!=ԻQQ[%26׿7S!(@uزp-EfgCީ ڵ17-E(S#V?X d2VvO|*\~*Y7V-xh0"ŒM!"C4kȵL/ma>}f l#@5xW#\<{#{Lտ1LR B>[]]ރ}A\ /q2T=!^Bm8jg^͊eo)ySwA((V7swMjloInb>?/. 5`-m$/|0'Mא']d6??˵lB| V?j,頸\9 +s"|`psTb' H|k^NiS72[׻Vdj|r}ouiX>tKCSߗ`/ޠDEl諜L/`ݭLWPjZ͚6Zb7rіB}y8J#Z.ZqB +cq5O2[8Ù>ԲT&n3)o+[̴bGTJOZ1?i^PpՅuC,hviUJRL/Sˑw_>Ddaaf=cGO`#G:6m$x;xtEș\mp.b\簰r܊7Wko&Wrie16݁TVBNǍ7bry8 nV ]8hM,] Mh`Xd87YWx aM>ťo`oxڵ#7}b({ ;b 1zeY-׌%o`3n'֣ z.R3{GXepR%HU 6#?.sbg dF3.>S@ sCLv\vA]q Vb$xlBK3 k5lfp}x5iPQF]4 `o\CbdoٮzNE;A*]KÍr`hӒB`͙E="o6Ԡfg?`xtq'*kUvZa`oG̀s`wl E'fD^9l 氏)8D|†Hmw&Ž][L8tl({ [aY}1uH {ɔlTpchlM-4+co Aҭt7jք:i:Ow_^\m+bj;)+xpL5~-_O?(&m xxJԢ%c@c&֌-+,:wfNe8}D$ G2N=&?C8SgCxl?-Ivס;sfyF`{qVXL`pO25:" _lf9P. %y<1 <R, )<Q ?Kԩ8f20PYobW)d7KrYJ7!@}Q]ɘeIru@yo3 E~ bŔ^]h#} q"pm/ƿRK[dzT߱#t$;DhW:?+SFQQB1NfK]swEXSqܫHv,ױI3ApbW#U\i?̶z[B޼hÈ$jFpp%N(ۿs!ǬСa P'5|ﺊ7__W煥_g~8^vE_[ܐ LXhKk> S7: IE&7iS{%p` \ٳg… E1$%ҲeDe칌6oMaSB<$l͉ qK$nM-6͂$5 Ra?^Y7ni,@[]LfzlLqe_zbK)VMj/+&-1`.jдKXNTN 6eG֌{{Jl=G,.4Gk7F􇅓B7Kb \UBjuH{pt(bKKcP+5 d*dH^?U9yk|]z!{ؖF̞Ɓ|`"wV3@2v3& MQ26\77c3?PO#]؊}q7 Z5Ofz7{x.1l'ôFzrqĠ񖹈b&V #&{Rr-C͚3{7u(_^P+XY,oJB"D0n5tyaV^;y!0T r\ۧF.-3;'e7+:^dqjV\ (8x#ӳLLj>&YI]tdZݠ=ZD<7G'WۜL/F.{|-)f~dz8W k[Sхy({r-:(0)X%k-X86'B9E?2'3B ,K,R$OիWG6bP+۵SuhL'h)ڷDT}W+ʩX0cռyE6f\ɓf gs点T2#4gbWJ'lcj"u3ި-+VE. ë `.иB~xnNVE. ~τ̿.pk6EXksy*| 9s|⚜LN#\tE@ۘ:}==q%ԩSB.d.<8kR|61滝(:S3>X@˖U8LezM6 6W-hX/gJN ,KrcӋG;oQG.dzh&Mܯ]; Y(lO1tpdYQ%%8O iHE~ޱ=ϯXt[XG]F K Ym;4YC|  -ح=o{3=g!SATKwW8w.`NYJs2p,|;950I*%g9Lpl}ӻggt>%j }t]aw@8x(*>Of|mcZ9"p@1.pVTTTٳgO9::Z1+fܹPnh6. E@')S*QC.b6IJrb(Ȇ z{T,j&^bzoo&2#4 Gc*22RW\y2ė[Z15[Tmw S1%\pQ t5X;7 HppjRy߇knJdzhOm"m's).JU8-QŚ\6/02&%(jN[Nb> (iĿ Q[$gay&o$$bZll$ Qa# ,|aĹծ޳̲O[WUp>@xc fJUun2vʓ1_jqSko C\5Ro`[t89\~6u ð}!cNy=?Nt z m@Z@ V_ʗ.7[i(?|_ϔ 5{v5 q%ö~Bvp#1; 8cUe4˅?Hn%]Ѣڋ/˹rs@3 D\t^|%EQ#ElF%؞( 0U'Χ|k*,j'{>I ^7NSQ, z7RL2( kg|&𩍡݁LVŋm2[>0`-ܤ4~v -[Maśu[rХI)٪\ 2@UM94z5)]-ǿ8?X%X .EEE5kֿZ Zt) ǎ4{dp6yrxcG =4*,$foc¾g.,~]-gxr-;\qx͈W~ 9GϧΚw0orQ:ʓ1_*S҉ N]#mlFZ>w ,z=W\*i|M {ߗ=c3ڐ&M}غ u|6#?+h*  քa kQhsE[o.xOLVc'* 5vk֭eQHN&Qd6K?cx~}=vX3REdmn2%7W^d3G)гX"zs2ӰgD H=@Z€Rf n]8ר{4mTgE*V1c1jJ鶢)T@+Z{m8UJC'^ЯuM0wAp[XAV7͞=>S\-W6$cձ Jxz=% Y5 R6Gܾϟ3}OkVˀg}cH6ߵ…5k^XhA̼ysm30ӷܜ9s uu E"q=+2tlhedOHi&Ǜڕm\ nԻubef@\T],|ȿ8?c^u1gۜV;S: WĔW,ǗRliw'1.ѵ!⧍ _K~4^3_7Xc6K>76i*;_sl];a$1\[X9~905*]hpܱP]|FSYDޤ#mĭ! q2$ 3mf뎿C.sa<^Y!aP̌ıY@Ip8xS yd@6?&3Tr"c*Q  7RHK1B/ (g94ZElp!GJm?+_ 'CO`Ky!GIWbaq BED7*1=þ`K{g1l}*{"p*u1cN׵̙R85 yNVHBȮfkт%׫V5hRz%u h.Yi2MOJXv?ɛW= `,_eIL`\uZljp1qHkY]G n `0.-]5ٳgD@Zk-<E +K`[J jز ED]6ue rlN2׾iO;Yә2=ׯx CGo4 ǔWj恞R-a0~=a_t}=0km-/lC`;s‰mE^ڦf|;jT#Ȩ_sZYbӑ̌ϯd'p]>.lBtNjdإצN?g[!q\LwPNXWҊ%G#9f#>6n?Xk?  ;{0x`>X!zuKLiNt L2UHt``tPTj^(͞oYpϯ.'CO¨0^E\@9|P/ c 14- vKK3+`P jY3< MddJm>%1m8)Íf9gl]MIx$Coҹ9W.+|}nlZL( gӴD{NEIlk; WpB8c=҈ p&>lV ZoCa!On %x`1Жn lq&G/n73fz$P)ӺQI[t NKK[ʙ"3o]+X0/'ſr0SbKo|=oQf#تs٣?bKw`Wrmݐthk>}:DD̏Q_U?3B\Q-^\u+9…,o@l h]0.R_f.WzRKP3T zE!`}W9ϼ?{ 7)f.ln)=U<c'h퓚ҍ_M䱗~g BRc=R$e.R%d{Ufl!D6J}[A i[{ր%59#z)ݷCŸڻ+|T  e~dɒ* Dm;ono8$pf#4DznZJd_sRS;A@5[zy1mY`ہ3N>lbVVIpB3W3[3{l]T!X׾lT9>SdwfexTV 𓿯K *xo_-A]~M'uɝdWsWj4ctnk.c_k??GOHi?iYbn @o;-pa:wlՅ1H˸S:Tۏe͊Q#zK\X:o8r[X/vA{~M].dzJþaq dU~>rTv{ڰF}FM֞6WMYO<DcBKi@thQLyˏEINf7ոCWʕWC׋CϦ;p2-2=[AS42{G1.{XŋGc{) .Z.Ӂ *cf?s|y_NfKw#ĔWĖR|=AVy$q]5 '\c׎:,vPCcf0y-102t9nHKFSU!9I,]M_G]A̓9Úum #3{ľ k?C..ZtܱēcѸR%.TF}Rb?|%_LNn-YIՁK zY":t>+W7ni@b~㜇m+N_#mſj@6@N9K]Eܦ%{./im# @"r J$A}|:?l}SĿ̮Kz@xHc\,Zhp>3g11ѿf&[ Lz?%N" Ul\h|g@hE[{ڻ-g_ڱS<&l9kLSv0N SL4&O(_>:+)ѺP!԰uᛝc-vd#Jf*\X,?,)?>ƮI*V濋k^o4:l [|JO,I;Ê"̮@Ҿ8xh@%߾Vqkڲlzn `I,rooi BJt9WeK\1} n {7+`H0WcX23p3'CW@T3t|K mR]\{~|ݢ0,%(f(۷jXgT~#{')0Ff|UȸX"MX.sxR58e6gF׃/3DH.8g3.R 2~JіuC%EHp匨tZ^qaVBme>W\ä,M4?oVNB0p~0Q ?/b&K/`i뫯ZY/e1?K-5Pœn:5zP0qŤ uZV]3,bfp1a{T-s&[pDJзkбnqU-| PЭj0jW!v XJFܯ&ףawlV^<4]DU/)8f77t]ra6py.pF~`l}/daZϓ%]p2=t ӝנ h ڵ58[9rRG+9*GՖ]^Q{PIߌ7˖?^{ ߿-\ؔ+lI۰̘7(-krVnEd |_]qtt4]Bmҥ3`\!jca"gX9uTA,l\u qtɄ?Ч+w!RZe?XzpJ9oZ5jZ޼fh辧ٳs'wƒr\JWK34zpn/wOkڃz.pF~reB0)͘_f,;'ô:yt|\:V q1_HGVxr~Ө L]7bkf̈́G@IȑEZճ;zwq45Zsp:sf!)TH쿯 pdX@1Eh{+Z4uJƿ(~R6H  -*4;0p-^-7gΜz{Mf[j(y2:3, w+# ?0fV.ɕ*oV|gz%\H<#+X O1Oco鏟wɅ}1f+ xU/VWkTδį. aǂNOK}|11<N\;c ) `,gN3W?1P(p(\SrlYa_ɂP\a2F g+5+v MJtdjzf矋?O/-mx1)y `㯍+`|=͕Wzok.q8??Pc\vsǏG^r;d԰2t̘q:?L.V񵣎,{z-f'N\ y:!ЫװXVK KNy&F'XR0tǓcIo\c^,ӱ5!OmnƔߏߥmcZ}:*}17+2lQ1]+Pu Tֵ|qjAx7?Y|ޡ~ѥ=* -K d YE TcQ$Vł?Omӣ` W p(| Om̫.^ZQaQ9Y1.Xь5Q56mdA梍)6Gf}bd/<ın-`z++.x]=R%\0T,1Rœ3$œWK"}y~90йab)٭}3pd˗adCѷ Zi)C@m:itKFr2=t%@Zu|`ULVC>T̄E%[45yr];sx,c/ȁױ؈w4^ΣjQ.Qcj.ǂ?Z۟ [8j7( k`"K,)ڹsܙ>}S5цٲe,UirƏoIݎ Ec'2f]Nn-O\k9~֐\82+n4%xb(W6v, QCfLgdSѷQ U 'س€'k1?2zD3 \Y-ƶ=1>TL p d?7aMϑ_Qe?pJݜLO۟aOB<؇\1.Ѐ)p^ļ_fβ^5L..=l80n3Z= awmO?V}>LbzFcA%h\pF~G dߗHZ.5=@k^dء;X5O@5m=)8= SJ ):>dwƒ㢍qƸhCqyQQQ׹(WK͛7OK"- 5𹿂_140nb'3#"Xr$8o3rREGHxf  {p<ǙC?od @˖MW_h$+'S!CXMqh֦uݲ`42m_jU HDIsK-LC 6?ǖ{l&@1xS .3;kDg3gcK.3'=$ 0 yp&KlVƶoJA( IkD`vK?2%bGx|nᢘ\]xƲeKي4/22O8XCrZ|8Ӆ(t08#\ʓ+ƀvNfK{mܨӰG@ ܅4 7 746+ [% MϥOJ/d@@  W /|.0. 7 o~']m c.vp9a\ruۯGfwtYoį?¯哏̑]ʓݮX17hxt nx X# ӻOJН|^pF~2  d*pf&dO f@?7n' OĿ7pi ؇' 89"}=ix#GI{z󟓱_4[@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @   2IENDB`teeworlds-0.6.2+dfsg/data/mapres/jungle_doodads.png0000644000175000017500000072013312140200333021327 0ustar felixfelixPNG  IHDR+"IDATxx\W7DSehFڸȒ,Ml˞ɒfr,rKBP ,@}Yʆkh =@ !ҫܙ+_ݹ=3Ιzߓf͜;3S#B!BH}>B!B!O!B!> B!BB!B!>B!B!O!B!> B!BB!B!>B!B!O!B!΋yXl^ J!D> B!8K @Ůg c$TB!B3m *Y|B!QP @"}dqZ6 B7EYP @!}d_- Bqa(jg,>kONc"HY- B)i,jߨ{@6I,B! %^߬"k@Q* BA2 j,߮c@Y+ BeT?b@UTB!(@~}|; R j(?- B)ap|<=PRA՗f_L) BHIYb@EZ &/}'q% V_+/ZP @H ׎B|/ Bblu~]%]/"*D?h)(Ȋ׎B.J7)%@lGk=*KL/",f@H φ/nmLeWPš׎B.ߢ|'W +#31O!R @= C`mm}Lk0SP5 eBYln/.xD80q%sBH%I/fC[c]P]-ӦL@!R9EQFrUS$h0MgL !"}, T-#BgQ ׸#+#K+Zw5OgJ>R ˄FD"%e῔JB!=_ЗA& 9?8 0r^q~nIZDR @@ba^L{}+b~!X@- $s^D@+>T1{Y H燐J>R _?a'*' *!g؆ w‡p,w} Ckmpw9@H->RߴAX6^KK5V/;F@%!dJ^Rڅ %\uoNHlܳ0 q{o)'](ٟ%B&}}.8' ˄Jh;P@%!cFiɠ<m Z6"P@0^!gدإnŕcn(c̿BΜX@gIY< φfb\<|0d_''FBv`d_7!:e2%j # Z>Ry;č6{w.;0{c~9#0Q?[I 1h47 Đ}}N1Юf|#E oTJH. VіaXCEP-6&V/|s1a_dPy|]{_ (ٟ-B$}*c T,0X6@|`\f'sn S'8A f@d/PȾFmd KO5J= ՈLW8X<;YZ e?pU{W)ϖwG@ٗ §̮X7^֑ Ii`҆*2|)@4qdtYaȾRYhRυ9 mU+}݄ Vl4 }@%@uyBp{uz]~y{ {$;0 z xƒ(+^$&a_U@%),FFJ/4/?3+]#-9x]͵^˅h !K j+, @%/yy`>Tc}6Xlw[ ػ邻qr .bHe_gϊ:kB>*/{"V@}(?yaȾF)q kƲ-%T7) %>nnoIоFވ8A[U¿SD,&O%h&<Ȇs~0d_#vMheZ? c&ZȾ^BHu3 @v en^1`w*?.0/*|sCF pi_3)M*~QP @` T|J_&-g!lS(5%T7/R*ӆl@%@YMiHD0#<<( 3bK = cS.DC\]P @0`1(%/ U@B /aȾF3;2/x3l@B]-V 3R& wN^>TTWZ?jd~8Ņ<]^XR?'<ԫWJbG]9Jb\_0k,L\  /R0῔R%`?P23`C^Rk3 QLRswf;(Dwg>, V9C m/ p$cXS< @\%|F@ z ! 5Lco"֤gbiY/}ؽء`z&|Pl!3 \/*LsbkJbFꕓJ p7|.ieXQLVƻ <RDB\SS35"`yp+*ZP 8~ Auw?.52fɱqj#@WT#PiṮlH8-aɼ(zp}.ӆ,dꖂ@)<0\l xyk(ev῜Jw !mp8>ް0-]Pat*8c7yeJ'}DkI<Ӻ#6 IM|j|I֍aUkz*[o|E =$TMWKs~g%+=X3_bk U<]3?ku458$sbd =Bx}zx|TQ8߳<ō}P/5 j@ry~V`MaSг;fKb݀2GGzH@=Qh]~GK0,W "%@<_J V%''Rcc)doڐ :D`~hp kJ oV#8Wd~oċ%}5`Dž`r|]0Ν0,/ } -$+ iS7&Ro  0,?bw0G D$00R;Qg[wͱwU"g_(3`f$YOQ^ʰdj&Ҟr5N>2~~,ꪂп@l7=01K1C@[ }7מCkÒP"`5A.HJ;  uwe"M a_G&4Lc)̏3m(_G_xpiq<ѯtaNlh E]7dC_{†C n7.= <γ%;[|_%'RIJ!EK([۔;M; g~{"?g` !v!`s axNfHNDc-46}dhP\Rt]wKwc즾V[8ϞU=cťWk F@86{+<޹Y?%RE!#]!|: /wS3x`H3_mܾwǒBj|;37`6v3 kØhV? +@do9eJ"%aOvb񳰞U`dTu}0ʼnc>"{\}R(qGṎ:5\{8R ec1nII}mKpD;v2/kT4M;; دa ~_~ȝl@zx4I*R l `Wp ˻nu+W2ĪkF&Ѹr7õ/7\$ M$61{76i|caTUHTx'^4aHdg& .=E.|u4F v7; V{\JW4ނǕKESʝUj6*Y+P?J>T g>kF}C|/,`V5ޮ =ÒgPVW"Se__5~swku<gc%{l_ra-d'Kc5 wMPGtaiǞ0N9[I322k҂'.c%;X/Rp"K~;H'sAV]í08?r$&S9oW$>|ͱF-ÿ?cZ˵bmw4 ¿xkǂ =Yy%}Z΅=C~O!Qk OwwWmr0<t=tk<ǽ.F5Ztb\֍ϘvЗ_JR7y3 VBRecnPm|Ox_#{ؘP3(΋nr{;s<OJ%}=َeCeZ90,X-^^[D3YDǘUN@.cB{FOp9!K_S-?ՀUHU! α. ϴvG 0 Nf%@b‡)AvwխmqMцf8O=>_M'>Z#z9a_7~p  ëu?ǒ^BJaߪpwqzqQ~S DW?|`VfQ\0/Y0_su}SFMޫLC􇤇Zg#1=`\,8![]ÞMa3T%6y/D˾j#][[fG@n׌Xt[(N័(\`y'XRڕgDo6p p]q8&p cn\ZN|kz+`SΏ[ ?j0F&|o-`z :V}c^h>_SP'%>Z!2%1 _h<]0>3.gN){#-D័E5(HA* Ӂ]*Xoo'od/\p1/օ2lt/S؄Pz frN$/W`^Ǡt) *>2* PP*Ȣ'}"iDN K5V+l ] ka˄nэMa~ !Z.Rp|ZC] я'gWfX cɫ=)rON d/W6F)e~el7g߅&,xD q{ $G XׄĄc +|~d/z?Ea3dYH *@{@GTP&*Q@(}+cߔi޹փPt.l? e9\+_(Rv/)DΆ8Amv%.-\j:0#6*Tָ~Ւq`0Mލ7̌IG -NoR|#@?ֵ"153c_wD ڄns?RS7Ld_c5{x%N( [x~PBkO9®[ qASM+2AT:+<j4{q.yE>Y%:磖%T`wYG~ ͙vdؘo$6qԌ ߧ q{æ2ֳ~nP+Ð!NPb#aX迹h&B Ήokle6hEcɅ)RߐחU`J&k¾T oj>.PnxwwǕ 0,o\_ X $6INE: ɠ%a;^cjڄjƫ`#ŵ)Iv`L$Ix+E˾jL`#&J?Hk<Ӻq?!u (J #:aÚ[nQR|_NW [Ɣ2 iOPO.(f7<#r s3ўͮ;ٝĄ!//bSc3U00{cgwWvj?)Tx.5 zBy^qbR+C" /:gR #5q*g7;qy_)oXU@{t`pjj:t %R DFqDj%r AXw6t>`XVralDi_`#K!h?ԋ%& @h Bϱ(p_j6ZmF%Yq]c& s W}V׻뜛6 8Qh?( Rǿy_@Y3`F|NaظPfUAxHH:"6?q‚δdHn| fXS3?,8Way-M័ EšQ:n|/ZKBBJjxW oݿ,T_KR3/W< P>c ַZ.o~A>ha^|7;K 63$;8j_c %nu y C j  \+~ډ;m%:kr~(A~X+~Ȍٯ5!lWx΁٥1 T%s;z%Xڻ0$IS L.1@7`"(kcv1܁/lضs!hljfSHR|si\_jx1vQh%FR惿t ]%EfB"=ӽ\!?(`-Xx \F BEk ԟ.Rpߓ@VY NM52^9cQFpN~Cǽvq:NaạLz$5m}c~ )@JF,2K gO΅^NA*AR Xe_EO :RFen0,o|-~Apx#7X\:?!k GVK!Xz&gb 3 [b>>8*MA_B } +%yR n$ bۣcujk"IDnuynO.(¿@&4g)O`-' ?,?<1UF#Ua~} 'E<?V̰t2ZILnn|9_T963$nyh@_@7\Tp>sf$6Q!Ę  26/msk+k C6N_@`7w:LdJ(5 䉑P'`""؊Dž=QA,qiA;0#b kq=' &;H7KM.e]^>:G<c8whN ȝY*@$Wɕg%MUl M &,0t0-R(~m iKM5/T}\]mU bAL@*2| Sa=l)^HX0+L \sl̻p3-V8?~0!9aԜ!~my [l`kS } yX^* II@9%@)%en6Q Y;Oh}`X7L4<da~m FK,zu+Ne?ע[^~;ؙ4AޥFZcR|8mSB&Bx7 , ]3'!=;X\v$α_v*Rp; |R "fU4^7,ox-dX@6X=J2s ?yÒRvOYpVhx AWx3c3+W%JXG!Gg(* :j)ft62LFE@$; 0#ETGdظ$-qGWq)^?`foAZl#8ȫ6Elho1  .kI,.}X,+S6`wQ'20_WtxDDz V^Z >kM+^\c㹁L+,UZPqƊ+'\LlU!VbS!?Y̓ TT?@9O=k}U!7v-?̶QE+(nKrwS(|.~f fL7J#';z%_KBj6r5ہr3/П((/ fl?pCkmjDzӺF?51n,h#ػ|`fb|@3G%xap>JfW%䡉N6z" { |O`FKh10dB`}M b co`[[`X_KBj@>529WbZ *7}6Tc`*?bj٫z7gq,00|vV5wBV?24s!?KLD߫wwgUA$!76-6kw>۬-TT/Ʈu2]p`'=Dlfqc1x NL0#KaR#f~if3ehV!@Ԑ8Jn`6K*Lco;8١tUnRxSTp.bp$']arZ>C<'JBo | ?מn8;ڰ0odpPY;3 eٮaE3 Suf/nx {^H;3q:a h6XO\k0 CV;k{%+^S<;ᥖgs1yOFo AaD N%[81`V!=֢Wm?UNߧ3?>qG d.~_>hL$U BPWU?!tyu{^έ=yf֦x_7-<:F Yj@%@}4z!< m\*sx 0dD=IPhsc o0 oq+,G!D1䄯/}quUu]my Pd`6p0?%0_ 0]A<> M0-)n~9h9%韲ߠ玮c٩#!!x߶nT!rTH5<>SV;/RP P]D |us ē }-==.wDRޑ0dD`φ/Ѷ}& Ky,2%u$V9_  09v4>‰oʓ\3f)s-C8?~6 Mcs}R;,NWJ^7#eRtl| }+G`)Jf{_eaX],vւK_.|'9޷[ x.[B= B N័PC« W3o 6] lWHbH+)ndC⠩!Puj?ݫ>%כcG# (,dmJ~ =yrg5`X s'@cB]a-E$ᝒ8~8 Ŗ85a~Ms/.ȄffY0z<b!blBK3OiL,M[l "a,{= y}]yf"I-<Ы/n+6TlQAtN@J*'6I2 0,?GY`L[wL= |t<"%@ {^;9 Bm|;/w( |v0dFYguXH$bX&7BaTHIٯ!!L` +k+-q*;){?(?∡+tfcQ%ݝpg'`*`yN ?";ۉl_G<}>[z*_Y7๏L%2W ~{w~)@uaaw/'!F0.ĻEא C\ot@.6&rf~GK0,ٯ!!L ᰋNR#kdB=N| ~'1h? u}W ? @!v7z-\k)R&QZxha~HE/b=YMw7zwf.1۴Ϩondp]. L=%;+zQ{uwh:s d A,#ok ts-Àa`K!v2 0 :D6)xai7 Og, ? LÒ_-p  =|5>__N}Nv8#MɩtQQu5W we+zF94d \քGB]a {N!O:Ð֛6H[vE"cC_}_65k *78kPBYrՀAwhI RU+{Bn<Ǎvײ Bu-PQ`= H]p`va}sl3`K2 {O~sVW~w6w'BjI~[__P P~9RHjq0fVKd4Bܲ:Ի#|5q8kmuB_-"pɚWyv_K Y)ObOfB8`B?/OdkUhg6۷`&ȳƗ_?ٴ4_T *J79ɰNNKm`:'TvcBB*me]0^i ߑ8֦麁esrs TO6_пYү+)+~0 xv`"'|$;m\[^?4}2z|\x"_?4_oVP P:l 2CQj&*\F㦃qTp|sJ=g{ 5 U }]$ĺ2CىuVtCa~cQ9Rz~~:&=?]Z"h/,Y*(Mxw}3R3l3O1oOOw_zEvIi^ Ygs\/F<6Avvzni`@ Ĝ/F=ímGGB8/gYЭWbf-v=foL;Cmh%{={d)IM(;q3% ڗ R;?b\\ wDZ|>w*z%A573dh>Qdg@peo҅&SlOA'Yl2~XY`I 8ro7 |0 ol=U6[?Nm4#ĜI DүgXWj'429NZ2)vx.)#RA\Ĥ. /ᐯ/w c@2@pyš$`Z4<7)oZ.L{;/P a1quwV:w_q6b{X|_k;6_[>/׮j?8*ݿ_aC3~,5gS6?ȶN5-@Jj ?n>RJ < 3빍-rYic !\}5Ne6STt:r,7L^M@! 8ɶ$? CɍgN4׊"v؋\mf=˕oT, aΦx(wKW' M!$)jL)}?UXÿH) Pρt쐦70=c aEMOL%} ߮ {,gmTh(0L gS7%-Xg@P.8shy`fl1,'g6 |Kgr%c Z`ۃwOm!.ǘfC[ÐU &c j|P`p:-IW{G` )N[yZ.ܖ̋eY_I`t6DVDF} c-mX̴S)vuvw{;4؞P_w{} cR Xsaڅwߕ{7/,͝0 ٯ]%`ÿHPeXSTF[)n]~Hp (dp tY6,(*R pM^eBÏ]x_oW)UcRT 7X0+;N7v7e%L E!4 1ړ0dvn uN=vi%*V Jf=C!nˋM|"QxͭM"K ީ0L g"@i+ Q603}`q`|[FE;:_TJR ҕ#6xdnjcUkÒ}}\4j?}#<d}>鯃9YX';]8J&Հ'$g * HI:=weU R kŊ ]4 z٦|V ?Z(d̀A"tJnHv53ȴz# $AkWI"%k#v*`X2 ~/A:6N1/`X7[E~)b^ 뮇?La7%+!NwR>KcF-[=32'?ˑ>h~w\>Ϭ: ~]wM Ծ"FP% D{hAKN,$5"·p"pd^[,zm .7'O\Yp^eix́}^ !n띤Y>* J ߱'*\ C;zP):}l툇49cC #=+d4:i)n*6y }0 kc*s)װ@lyB닰~*MozMKaɸ& 6̰;JM#[(ߓYp\/;6;\O}񈲃wIS9`1'dz6ps0@ ^?f, gRb̑(xt_[}m[y=Eiq\)&W N`uM?ed7Drs_K ns2ZQ 6b## <_InHKOG!/\jZጐJ軈6,9;f֦ YB,&x_C^%\Rue|F~] { iEMoflf2a0Ca 9"Β``J)dbÂPO)nF {fքguC^S.?Tjd #|wSf_ʭ ?Yˏ `)wң:xĞ%k.!u-Y7KרgM}}1Qt@_er[*?3 g3pƙ?-ˌf -E(,Gx4ugCf)_(߳{k;.og?Hn͝s>?l݈!vFN6`urxNcKZ^(z(=вH*=\Wd3[_`+^_~'A[!B 4Lwey?H ͆?o {?|+Y.w18"aw7w”eߌL?C=aٿb75`ro%/8;g=3K%P6|=[YDVV iw6\l}s.^lM@q c^#}\gpUj}~̟Bv&x1aGC 9䛅f@%s@gBz$xjB`QX|n ,*e.OB+$p*KA0/V]z fR{YNA|91NXix Yٕ}+䅀IzXM<%9D?nr@+>Uvbܯ)/yle |ff|XxTNxovy^piTP@*M) 5Õ) P$he[LKAp kL+=~j!l3IzG ؾq?4⿖ Q"^'rߔKv&4ua1 nr0X k5>SWdN``qZv#D&)Hԭ*5کk߫l>4xls7tAῦ=vl~ssA(TP@!5 C=*NeھcIrQpz`K7( }XVϗ!o@W4:"l}5[);{Ĕv l]@Tai˾3ϲ_Cx??] "K<Gvhj5zVȶP`v*jh۰LDk[Ϛa"?aoDŽN.[eNدlc;gd1Bd06^sl/q|C??zP- `װE *yΕSnmװy!}QͶj=?ŀo䝚?an*?" c]~OG)q# nYX[NfE|B-X`vxxGxas.[\K9[!+5 |F,/-/x󻽩DZ2%vw8@e"k`깫+{|d~ŲY۵ Qea-t?8x+6 >6v'0h'=mY?ĉW\T@4g/ Cd<]W2Q@?Z(~ quoIl{wJ3S3bȐg;7b.;c1 g ӚxR֦t ynpJFGYx7[Xƨd=g3B5 tbE80,jcV@03ZGF/hTцqT.H]!2^eJ\I-*>bKl0#;" DH.1&r^4%ԹH׈Eaָ\au<2>0-S馋߉k=hy]Z_ƇNq{zlr Y_ ZT ,E3) {l/_J?!|Tp!cORY~[d?~iԣTX6pr,: `s`Vcafvua>o,\fC_z/%@rAAفJ^|p7 i7&^FWeTJǠ.0d[+\}pe潖wGJf|#5&6UP LO߇߳dB52ZzaUM3eOo/}faF3wE,dES"#`uhf|Y"Ŝyv3k/\ۍ_B,5A9.;RI} ߼X/PUF}s zt4Y,zn CDgٖ@.|݂i lZh ֋ӊ\zB _@|eV>~Osp]?cϲ{?vĞe-|>៏s%+EPUH8 @yw#K 9x_;J^9`{ʁIn(Xz&RفԎT\noivcK Gdo 0 ? W<-$&x}!f`ipfkE 0Н9 _ ';%N$ e\_$M_ޢ0km}39硞#Ժ:35a@8'lK0UEweCE H8d7kTS>C\HM?~] 9Nυ=&k!}+ O9ς[DJ͟^X41 uH_DgY6_KV/f] 8)=J]޷ `bo[$kӥT(!/7s퀦Rl݀mk2**'-EfZjjaOBE_t[[0[N'-Wjh`G̵"(o \;+t@\Ǘ8]< {_hO6aq/ ?b[ldNk>BNK4~Iv%ȏzQwy)*q€QAu5LS 1Lc݀e)dlS\ j7j`=ȸX)7.FY8ÍSa~Ӊl{,|&w? ˹|nl? 0;꽐ypv WC7!S_Dx ?+hu\MMvadO(7ށBc,6am%. }:S>k}א?A߶ Daiv`/,xU ^D3/ XM yO :5؎7݊vʹSh;9{>4' C~b32)V^̭eWb¿Z~H P7=`5c%b  on<0,Q9 tPJ*'zai!Uz\g9@z(%Fڻg1@2'HBp v!lS `\0X8ľ7B,RoчBPw[c~w7j Cl [xvtr_%&67x;MWbfgU9/(X3ҳ}R)Ɯ*`ĭK-:H)/ZTIDJY#aoUafLT lu%xkl@{Ш_ 7s"N{e.qglE,zEh!,g. _{]0};f S 036ys-~ʕrh| *qW߮6!ߍAN^F;k!쮿H gzT'ѮG6eWfE6\jQ6p.B'^lg7\y S#wW6'BZ yȅݽl#\1ޙGQLBͱ $dwIlrl4ժUz@k끈jxֳVm=QEa;fgx}7ɛfgwޙK# D+0Pgz]3h^tÇm8g7_1@uvzmxXh;EXؒ,$K-l6R]]q%x_Vk8ًGάʼni'e*وK6g +jrHWm^l5c z ?v|E-xE~h+c[i3??7H~ ~"^ 3QB~} Ha=64.} jM zRO?ъQŝqKYf29Xv=;iʔ&rr9BOs%8 zo$X_ u"86ǣvWMC]uOD ZXy0ɏlBBYT5@ХK?@hSB\ΨH 0=@+[0#<=?"PuoJ; m98M`s1 [EXIGΫ_vѐ(Jka꓄ً̪Cs9˒Yzf8X-Ǘ0eF8t6iɺ3Z^ X64GB(%†|a|_馱GÿoS"~AÿX`a2TF{z]]+4Рk=@"+=Y*A臟ؘ mw4j|w#)6 a^xp>?6)>cx @Ȭ`}M3\F )wBwڝw3>Hֳl!J'93v^ǝ3v* i9D u94TݪIA.:)-)hF@GL -z *B-6=lھS6-*dB!a;9l I4+JTNYb֑_N`iAPKUlDvadZeBAFD 5AuЎVJ\톏wЭ~G^gٺ4s6+'ٍgu$s'3ݼwgpϩ8/`}]3܈F 4xY7 o羢|+ZfH`9f?0ّw=sRa4pel?&ez@?Ȕ oP ;@$>47K -MeZcMA2dzLH_aWyS.xS^gn} ^aepyaoO=P{7%3OLD}p($|?gi}EģPkJD6ઝ6@>I&Kv ]+jC˜ X o9;E1Nq&*霄t*mtgޫGO R(j?f'8;'bQMi[jH`}0!z~7##RѫOH] RXɑ%obIm3OX.ǍVpY,^WruIk+$}MΠ?qYA>e=̪jmPE6`}]3FRPP<>5h /V4@$d3iGB3q3â3Dki Sƭ/&p7y@e+0,zh$iRC?LxPOUiQy;Cڎ>Ctu&kq@skxV-#|,^̧ p"y5 'sǣeCi8Xj73m/雯-%"(4bzݞ #5Y$wu9Y0p ג' L* H T:V` bPX!;֡y(G<'aVnkťU=ܞ3pCY|'^ܥI$V5HX*r.(C D~`n #UC:UcOt ?6&,PI]%*A?Y`":)2pD*_6EH|<ԣ<1F,a`k^Yf*U)Q$+'BHYDЦ |/kRC-9Dd#a97r4Xl&uփ,'B@Z=y0yLs겂3R. `H @} i,د F&/Uw )(FT{SV@u@Dt܀tJ@c8Hī pf-uvM$,0E5IT'`ઍ+9Dd#q7~4_]8\<9@$d%#3  =ܐtY͡d]FpGoܗR")t$2q`=ރrHE,} 4cV>2|bÿI0 B^ @<Y${iaϠaG8pr^ 3<"@U`P$Glry _0B@TSO!:XÿD<~b}Z?q 4<ʐ`БwaP@i[d0|(O#J EnMn _# Nx]^ADz+?ں<=o*wiN */':0r&ǿF`pEJN OۄAߢ82"j}kq$`#,)z$c>WHߋ?6G5TXo=D|֐@y/vRhm<@rt_%\iQkו @DrB0'hOO?Y_N8uKUU '\".g/MP .lE7s )~|~%Z pm&}[?!p>zI /^E! -t_j_=A]t%Dj1W$֏ X`eVe*)S@~E|:w2e_#p% Ո  BݿY^N <,p䵹7o @>f/r^7Z%@ HM0a;(V#@kus^;3L겓0uT#^KGuc[H`ͤ3D1̐JkH XIx@?ZSXL-)1lrH > `Ǜ>dv9FYDaaKPm>ΰ75`}h --KhTp P=BGG8OgJ hH b@L͓RӢ'O(8خLQs*@iMIzt19Wq`~p X`Fgy=%wiu|_љ?}h $_MT|mp=PsE %4A&wxgW:(=:^"qs1.'F R hܧR+F5Yj[Ӵ*>e`WH.@$LtR@4@E܈;u+Իޔ~'H > wo*f>WYhD,k`l@נw9ax=N:nX4. wp8i $g3kDKp ¿Г%uhXF̗g+8f$h<:q1Azph^}:jrܭʽqZ={$gIpftYKc3_NJ"C$/? M Y.h&o5(.椨ï.F|QZp\ : y Id]QJr zI(  5+j|5~F+43̀- Z$NKTa=6yN=|.э0U#ARCu<:Ez { ~<|3ϫw"9J)p8٘<,r&$<;Bp 9(˦T59$#6h3vуkT%@@'ԫ3j7N}%z44+xz*f) 4?\@ybQd(NL)V쿪3:|Gg聗^/:$r>'XןC6Kse)\f el Xl$/g{.5Pܖ|!1kU <^{Ga\5YO(> ^+R0F`-*X~ќ'V;f:|Gx >Vp8\4{IP^̪N1"P&CXqx @q( gx7H`= j7,mH]Ck\p5ؐ$5OȎB(zl;\'ŏ7 n43 4%hnҩ>x}hBnxOO~!5\p8Wûs <:S Y_FTj7}g{Ng[Ƶd-WxdDiM3X]Nn /pRj"Akg;6]]@%3!;:' _5^$![`EnH`=.c") l֝Pno׋V 6 %T% í^@ nE#==`|upq}t{N-DUAzI43MIއ_\8V\-=іy@hk_ =˳auY=$M| S AWQ#\vi5N`6%Z~ x+dP]Gq J {Щ4%+u@eU*M5 ~4!dž{YNǏYqfظp8Q jM]NN\KS'+Hpze-86" }?(X =pXN 74dxmO{Dž;\i`KJp^),qnM@2 JXP|>F{/jrʃpK>m-5ӓz|@~<3p8㏃ `0Kg{& :@(L9ˬ(iM;VP6D-YK$eRxw+hV51Ԡ_(<ŀ T 'NM8<3lZ >pg<V5P1x.I?$~ b2]etˮ6 V&6 CT-Ub{Y jH!5izіq6cby$!!<%bkkM|pRuلd&,X,oN⻞Op8lp/(Bꄏq9!;C+PZ)$vW'vђV 5d!L!._З:`R&`}׫pR;ic|s0 ;tXo^HnwFM/ϨN 3r#؆ kCU67\3 =76@A߱<Ǐ)i!]Tp8%yyD1<s$\7sEʔY b؟[h3V*,f"jrkrՈqtz׹ ʿ&jٞ6dη`IܽznN]Е#F~ g]C \Y1 )Z)0d@drЋ6_iߏ@nijHa5Tݛ*Jjo x=|..zPi*qOB_ &1~ \3|? ̪'9wY3Yh+R`uL8PTm3\@JJ g&4tK+J78ђo?D0$@q{& g ҾX-'U̻é@~w:DP4{HN|m"M?*Twn0 >0}!BA|'l=.I(wJewyp8 GCo2~] =f-Nǜ w3 /,\P(p&gUȌgm%BXMV S cFPV,@|l0h[/v Y&w4M!YK((%$@Akx w Wx@B^0o@E]6T֜6q~sO{UxOM@ywIɨdUr'"p8aser6@0Z q8LJ<8ϫp+W(?g+p3$\X \pCh .f&E;lOP59J7J-wBʹhltG-IEZQ#\5E},VM4 G[V lFS X ВI s xor ?(0\p8NxMDRXuB)vQu Hu*$p8'2oP r.`)")b$mvjTC\Q,;59~YPf6$!"pn7FKчh@ }~#LTqXИV@/5`=&4H P$^P9X11 v X CG}R;FCz>İ~}FDBXuMBS A0UA?#dUU `5 7-EHY߼ksI)[] -X/U_3Rg{`'/C- "4'ۿ #=,\bHW,L 4X3!؏3H ⅵ`P?'F # qXVHpp8\ 6|i=^__(nۻ @z~A/=mR|dмp%Ճ-(kZ,0;?6}&u 2b0kHaJLs=EP= N Wܑ'͕̆/ܑ!δ8zvB4f&cR/{oh$P VPܑA*"<hO!/E+.:2K ,YN Dž4</EP~E?Fm;?0 /= {A\Dmڀu0V;D1pH0'R_,/ZL -E4g $cgh<(+ z(jˤD8Z]DcފFe'Kxd_/Ljq@x2C="{ޅ+9kaiaL(VLH%7]z1.wfaa6|ͯ:?ϻϴ8vնgWS:3A{Nkc 4 Vd,)yzSzzmC%]/!\p#)~OGyg.I@슫ݻױk^#y߀Q~,? gOn0 WyQM} ~( @bxGH?Ik5Z4L';)^?apKClt,P6W3*ti?cH5T2cHa=zx)Y"{p*%DRxnj"/pW^vD*XoZX`b,`*0N @M1? s5O+ɝJr! ᝵ٗIK xmg a}Zr2HsXA0O@ܠP\ 5UX,W o䖦&Hr9u (Fs$(]N+Ϙ RX`-PtRX_g(h@#-|A]`Krpm5O*XoZ ea<Z8 gpI s˳C _OVz 婢pٞ;yɰOpAQ)(i@3?Se-`Z?ƤOL%@+PPii鹊6P4D,ӓF ^jFU)o E'ҨVGU_5{8^"zڳO"XoPu ^~4zBy)n!V JZt@$Ўv tk'Z6!@s&նɩ>T6g @7\P 7H5`䏰h M `HI<?vvy2))W6 @jSz/A$h2$ta=SIs7p"I'\p"^'O]hogwv&+ ρD+y%gO= .v[o ,82hI&aio7BDՔ!H?S_[3u]k7/G}^_<Xo+ɩq6;D 8\83ixXt%1N%hbpC藀  ퟤ.î5b_fNxI(>Qy, [uo"%R1y6^p0}7U j@~pM\pIW~~.n?gc x//<{e"P|˂}8tٯmG!p"V&UIڱ35`Ly8/ Ym*Ucj T8:BĨplp@#=ǎ 2 ,fTh {hAlķ8Ŕ(EHOiOED 뱪İ,B]6q P6\phApo73Hizqp욍Mv(tr jYw]U\8Է CTvnP}Ha}Jp C.p|;o w}Skx'Sݛrtnߟ.;qrH`8яhXpǜT ?\_*\wRp ]!<++]ºBau h(F [$?n=_q Ït]/|nD*XP|_)6E cdV=gO *`4;x^3! uTKI¿QdnEJ2A*%, %k؋n^ϥ &7Fo D%F1B2N FTx 0SP>zS~rRdNCk{ƇI@$gFs;IY㧮 ^-ݺV `)$07Fl&_?FV n9kp{.¿7BX owHݪ[!0cʚ MNzIixTz<ʴDx 3=@>q n~GZ?UJI>ǎR!P_WdOQ)"܌Fcj4"vͥ:$GseNW>@\P)Sh[^Xb7#$;|}@s Np)  @ sV. ':Q5Ͻ$Lۿ\m+sŽMDpB'[֏ySWcRP^gQ?肋.B P)*DlR?WX;@z\UguW(^l6!|oX ϱ!#@PoZ:"\e3@ D {פ G8KX-@ \jՇƚԈ .8@YM99ڝZ XGNzv{! =S]O vbpVG8k;iz1vο"1/>9~(%Xh/WJ=N PT@" > %ؑdyA n`?*<- MS^Io$Jkmwj4_3*O ןuџQd앦)˖L$|C#?\f"H/X .8D- pùLhTޗ@/k vi4KE pۏ}Kڅ77 gvh20l?=i:!?&Hr5٫ "/Z L<p(O@F80 Ӈx#T__+,P ƾw6N&RPm#*sǶ@$ǜBśXf-.18^= ;\)X)"M 8k O>_عz1_}6a=Ug9|yR u @)ܬC-ewW& m6^ԥԟ󛓎 !m<).b@> U82Zg}xʭ3?Q  ~K*\=c ?^iך@X X Q>X1(oef$@EU'NS0gu^@Qc!&Z?ߐޔw[ݛ 5.`|7x/MT Q쎅"/]%foU W]uNn?%h-?Zu_Mp USpRLH`ox9I_w;'F*pi5Y0z@ǣ%ڥ:E{@~ph5!㴧Э:w_pt!t QWRppo+-Tiاy:Aܚ P*'iΚX]#܎yzq@$ՏsMoY2)fƸyg︐ܙiw|X?x{JV{SCPN5IxS~nպSzlFtXtN!xTt П`-4" g x9p8a|&{Y/w6;W^-)i2'ⲁx*An3A-JW'n# 6 y)K< dGp@{fvcq# .(O(=vsP|j՝FOo92F y*y-0!؏~R~_ s?t~2dk$xEKݗ\\DQ}4Lc[c{OɟVޔ->_#6 W0`?O"0ślj?[)r<@XBl\|> @V(%/̓? _<d$I֠&̂uMBlF,;z.A d;k KoqU +N5+{@yF~cI#/WAWTڷHbn90TϻR5@Bʸ`} 1K:w FCڛҦq,w8 !i8s]bD%(/U@if$w]~!KS .QZP,xR. =vJb/4 _+\wrpk{/w @Kf$0E[/MP3ZoMBɪkBbEl-ミVUzM'6<nJT2 $ 'N9"3-jbGD h7RJ%*CWSi@"B|!u4p9_X|e%l RXtE6 Vs=@wRb#Rri1$E-[-0EsǽhHC3psS ' H_sUVƭAчP"^߃/1I^¹ͪԾ*(a}qyW/o/*m$l8wod;{[p IЇI6"Gl*:?WnpN" MKN_ _=̆es>\:mII ]-uV @X燒 WcgH|1[#$@ȃ촓RD%ڍohI鋥*(Ha}† WM /gf\qcki&dS@Ǖt ?2]Bwt'0GH(\OQ G?!^N&4vF8dXҝNDv#q߅Züøes6=%0K֘8_1P&g(mÃ9}>\ fX}5͒ؿcDn43Zb. : 峞@qp`6 Cak?,`ߜ-U8'Y.$@dP wX' o)OpA9zcN|l61~qe‘spU ) z?,r )3?*{FH<I:HIFkx0>VCl~J4Y!qf$?tzmxz'l 3]ГBSDzzI@$HN p4ߌ(;MJ=k py =•57T5ӤmYOR*" B|('F>r+5'/X2В!4enRIVknw-n`?1L@>qÅ6* ! cUdPd߂W xbu@ׅ{W]`o?/zj_L0enij01φ"f'ywߔܻ.J? ոgB:@|'z$?t}'#=Z_Os1p\~fx/a5=Rg- f(6'hq $ ?ͺ@Wh 9ss4v7#XKD`%//#ԥC+]/j&,9HmVh/s˧lC@@.e'Id)ph )D $@B~Cl7!~t5y<\% o B0!7p 篌}'wUd_D_ě0~LP 4>8 zcЬ$@'S[=M 7 `&6 l¿Nkq?s]ęo.j~yZpktYnMīOmW:,XIO+ cp͡ɂlO9~# п0Whtn"|'H(J0Ƕ k`?؊R$B?T{ś·'7g;O^]|N^b ևNȵE]_,\sb}zilyLL@DRМ_~5JaM&lBE %Ƥ!2#$,90͓HyVaMe5gm%W:ߚxx5P.l&nj6=[?ADS ޚiq#DvB cǹ{Ohɀ_富! $N(s~逸,J}L01(@z(XuN TD yHΘOqH s-:w#{ᜪzG)k Mh%7_uM7 8T/'S9oCo^LM|w/ټL q5_CE[*iIĄء9Q&NpS*CD^B \횜 Ө *jJjh4PM(9fqM |>X`Bv/HO9P~v>"YΘʝ;o8H%$DIIbUH4E$[2I)")˕."%۹$NvK$ι%N8=Un*_4.m~އ ;3K{w柊ޜ]ɥu[R$z,}( =$J66AAۊo wZCӮh+ f De,8{@qfܕ XV_6 ?(% kmI]6u?sZzCN6O m(Sy;LnF#ohB{¿3m_J*Y^LH4qw?Jݎ+p0x( pa yΈ_@^ޛ{Ec `"$BXΪ-Dk&f.?3Xv87c֊`GID ySo(}s)]xtLrZN"u_* O,64, -ߒOY9$ZT{yE(S_ wbziDubZ:X{ [ކy}BDJ-K\Ц6h_&"#X)-#?(IUpm`I$MU|؈lp0" eW^RZ8!tS h 1ĝ#0j[ *(#f&5=<{Z 0 4ѹqv , ofVo*_{y Bͥ)w2?.%}mH-L-#yUopC7Uo}Ǻz~4`C>qy/S2D_/XvO}KD0*Fę -OϨX Byqk,힐XLCsڲkp?ZXnqa;}@H~ąT왤&$jG›[_p&z wݵ'X?nIiuH.oDJ=YjxBm5~~}{yn?65* Kzt4?p˄e~wáAWvhN[VLj !I%\ڽ\v}c옟ݙڶW>|C ћbNvz~8Hm˖MВP&!ޜc=yxo7%{6sdY »9,,M9~4,#Jf 5m'@ Wo/X}.g?%9=5VoBMg0-c܇tz%%l&T,`e &cAޜ=O0W߭{7M>+YX㏟m7X:%@WϗC*Ԋ%R|N˷3yMQ0]d%=>,Ρ<7M&e f1ټf|ӎes&lwDXMmy-^7 ̳ Ty BBD CAB` B+ 1O( yK~']\;zx!?V <ٙ;ڋiQ;E]`| C+1gD{|>`q$5;\WG&5&0dyڞ vZ,]; (d%>WFGۖG%gܙb>1!/ 씸 LBds\4ubZ2d,5 н^M4|ME@z 82IHWi( J[> : ݗ#&S-X8L @/ǚ ̭ϥ:b#wة^{ns~Т݄H w!4\ 8/-;+1e%' __LŮIX??F!,Txlmjg1l @ J!,#XMS{i >Gr@~,ͱ}e B ?Z6ꨠL^';>6wȨDZxUUN:U[/39˚mEm y{lbbO-ROz PSʡ+I$'khɻx״g?: ;,']YqR4ukc:uw[cBio[Eon(i+bW ʴB%|0omw_ZSl`ʼܫt5g歲O-jM>DGJg!xHBkjDk,k㙾(?\yrD, ͩJ(]#jepK/fB,M lBL_@?:OI_syS ?dKB`Z)4u41Yti_im,av?ZP[b٦ O#d >%i řpwyV}^_+;>Rec/, a^u>Ek*!2UO+0Mh'M?m(e &ka蛠=6| _c)-+r3]zyq꿆 P k'S#_-*l?,CeuBv\ {Zw"k=lW yg% QFCM ǭՀ7!Ojѳ#QW$o;~n^#'~wh}M 1RCv#g$.amBJ8O} -݊wiQxvhI^lE5j|+Uмf&ymsmw יGrq[baXWvZV\qJ1)~}Pzصؾ8?YЮ%̅;%fUv:ޥ}*.=ź>)Xf ]nka% }:qF^5`f\+y0S u * Y 5[=},b+@07e) -٬Xj[.ZZԶBUzDl5G@p=RWzTϕ`M~L ,>wǟ&FXx'_X ! 5pQm#b;8ûa0ݬOeX&n)@ c(+E[3xLSz؝m !puLT=gh TyP'Vj'72)p6cbٔEm `Eʐ WmwjS…)8V_B˳.~cTopʼYc7 -)Mҫ._emB4p,/~a 7Udg1CxKoQ2HO})c P%jiYL^`&B>Wk+B6*tq/ BG uJ) QzƓ(k1`6tAz{x nc% 4V@ M?0iUӾ _c{N k(h,[db+@u0 eB\ۖ '-j̪++V[a]-5i a=Aa1WBzմ5פb|fY]Zas^1.h7&A;끿Sz ٘PD[= V80-G wC#@0a a)C1Z1=%7vSBz S Rx *Тͬ(0D'̍Ӂӎ^v#O|pN-F"C/Pˡa^? М)ldoQ<-7H\x_@M?~uG>P8wiwY.zlX2f@»O -t^J#>EmYQ`N転XE `DhҍNIA&`X[2Xmm@1fB +%dh; xK~1Vԓy5 8nݧ pފ m3+ T{|Glum4i^j`.w9KwSLeP9͖߀F@S ȓ1zHPE]2',tgxΥ5+PZlQFipov<]3-\ajք @db'_>#`^dn+R,<|\()腆6&Bۮ!ukzoܷ~t CMU AY՚塷)şW 3@LG.֩P%-ϕj&M:J"¿@ $Twǵ`dcZ,<%B  |@l1cQdkJB ~MeوHRpQf+@<]mf5g;*hz?v5o4-z%M귁2f _C_j~#ɶJL!*,I7p/2 ?/TQtOW<;s-&.SP9{0i,D Ou7wPyGl+ U# 6#*v cdiB CMmf5h뼔wۺP#iXC֖$[OL@5]Lf!dni(p@f 3%ݧFz;פFn%6%n6pn$M'V1euY5ou/AP:,%ٸt#.vc.Ϊ<_$AA . wT ??ZhPXu fwJI2$x`7B H V ŴUl)Zg%%WeN vi2@V4r1 ,_1/0HR_@hQ^V&ٰ7y݂T?(}45( PVFhTnKqʿ#!R HwiUCxD)aH $@ &UO%X$,sv63߽x!о.-[ dA)3 R@hQ^Vv]l _/g%[xu#ܝ*t`Fgh6>GQnr) 1w9%M@2Tߥ, Յ6k @QbP.{R Ǹ:2@V3K-7 1`4p Kp.*|pZha(E8y, P"82q@'KMf =yf@#,L9p MOhP݅\؆6  `=U\ePݑXʴ߮Zl @>[R xS_2 c0查/3 T4a4ZSn؍BZKt1(_x @>w $@06a 4/!Tkޞ&lv$=y`- @`ڭ5%5w!40oXe<x6]NƐofC5ԅ3̏;V鵪zKՄ;xv1 ֹ=2.g~V VBc;X|?ݳgOBCV}К@J;xp Y,9Y @{ڭid@hǼaO%;`YB*F|+}L\o%|V8MA->7Tޘ+D [װߕrd/̭>pZP鼿 %v_XP3.g2 ~CzO@)}>S%Z8V69BcFp7P 4$zmd)|{/1Ad źYLi6-  [ LAF2=%I):H*06t(:Jw\kAms3@hz\В[YC}wyp\ʫrBsklf :tn^>kw< H:Kl-;xxZ6 |~t@H a @'deS_BK`8Ãwp,i- pחRP,1A VJɴbFneK%tx `hri4h/&bLJ.ǵudKt  $@0{@OoyАT<þF4:nH.bh33RZN *^X% = v*/ZԴ@8@Y;*1.8ТfLaWlrd\Zfbv>xڤ  m~Y!4$:n(O0S=ك`wKރS:at^V KW,g^TZ>ZL*EM{i UKQ\"ki`OH'b (d2Z̭ԍ_۠o@ _ БCP}\KuކL*n(%QͰاn+@0DJ,jf5ETu9w)KxNo Mv\NhaK?(GOzh PHe 3!, c@?x:"npBұ> w}1-{uۜ& SgRs7Ҳ.X@uU g0@EM{ij =@,0،*kQ̄`zn_ {0 Mp 1`cQ}^w&Kk&(@a{0`;V,wMb»y2&S m|S<EM{ie75ݱ@/3!<4XY܌*J\q+w$;ѳRզHv䅖oq;;b; t| [,m{JGxJi٧(nJĭU " yiّPtO?& \Cdm&-1yi+BR#ֻ1@lhX2(}ٿCŽ^L|x7`f~cƻ(0D55@hX hQ1`}Q}" w&v#ǫ͗' oq{&a; -춱{#wȠ x EM{˶8C7`C 7G\.GieP"`;?5qMIwC8*3ѳp @O?.Q9F|A" c _/z{{c@~B1>`&{ڝmPW :+E}@h=`n,9Afkۭy- =kE})»y2=%I) %pTqj/5f3h|S+" nWu93?_ɺoQ%*U˹ /-탷DŽYCDTz ,sJLkMwRllmkZH R_ K%('kF V!D[O$_@37錻6NʻHu6~f`|' i J\:qz1_0?(rZ@ _\7XyzVgo5g9@Fא c> X?7W cR ?JZO1Le*@|B c=>׺߇2Z u0k}PM<»y1=%/&s.tkmvТT VIK6Aks@XC!XƈJkށ^ l#Rb Io[Z@ Fp0QW*ZOhY; T.K>)`ilZ(vۜbMi@h׼`fh6U,2~hʎpH! l?m oniq P۝Kc>a^-卹Lߞ'/y=w95N+x'HcT*\M%R AF9d.S 12Q$ ta k0<a`t8׌)X @hQfjNSՁw! Ӿ= a?:%Rf'V=9j üZt X4S(יO'x($˭( ТtOοɊ.I <Tg3E g\m3Oa1I)i-.W-|'w$˦S6K KT*da&Uzk 8iʟ;^.}q*._`o+;=)^[j$@ a0CU?S5kיGh￳@d|UP' L `f't{ śB ~UvZa@.^sYfXҠo*;}1{!xCP7U܃djBx ח @JmP˖ib;?A"|O|D򯃀O)x(Oǎ* CM-ǩ$=*u`&m7"vH@=/2 `K@{L{o$g~Ğ{c»y0?˜Vq`kȋ3ZSX~lUܭҫ붒,TM:c3ԯjS-Sm:5MU S ( ct !M3,{s/WZgxL2ON{GחZx3M,Frr'^v-5ZT,Gxy:ޠUmӧX"Z_ x1E}1wrԯjWk 1 Q_\oa-o@ 0FTK$xnX[i^xYIßom`֩4zh^̏%%̃y˦Ӳ(F\P A2rlZԴƁ?x#̼x;Ыar[nSE@>6` ` e4wO:h? 8ZWɺJi(QXN"(i-:^Zx3N#VK DC®KG E_4ƃ"C x#ZAߤ+J\fdpI˲{cP߬z16Zo@ 0Fp ;O n:,L.J2g: w:7\9_יq|X#SD, 6A~w~%~@B'0O"_"x_xh?rdd:͞3׺˒N:*L5#H).`&P+dfB~ @"Z")M\P1 *j=@o3"Ay{VKh#{M, f1 @;*az7)<>UǙ+vZ23e ż|ZG96.`ɖ_1'V-m&?k8Y@:H @/&9Zyb^@FgzCp9'z/m@}vFv90 ҆;H ; @k;jb3guXB3YL5#^4B 65Si#`q_w-F\l|fB W KJ_"%U;k!W.2\ LI2n+!jkV c/f-7%?Z]Ӊ  BB#B Hc YP@~qNc?@03 o$c4 gH#4qgW1 DO ?F |b~p"nKkm1fdGN`BtZSސK*;$yFU3SN }:S#ZW]+SZZ(>@cK%@n Q@^#@ Hwƴ@_L/awf, m%?EXZ@C=D B,9s 2 |.[a @ 0DW0vz@pxɳ ${!@b"m\Cg_ oGBmDl90{f ڴyǫR.YPOOO*a@{0!tj&$q Ѥz!r3Bj_2W;[;'<뮻rv*Q !b& ؿ~6EG@T$̓5!9}t4ELPjO:bxM!^|Blq >JsE;zA4w}7kɐs? UWAu[1ן@ CdYJ B Y@oB& =E!=cVcM@h}ͥ"@`W ok]|; N_ 2xhH X@M?ydV|@3Ie kA-@L 4k=u =t-Y&Cys&6 * oK} x=.a|.V?r=~[To 0ߍ7H5l AHP4^~Ok!qŝb@!Wb:ZxLQl3#Bz(0G?pAx pcpG|`6Ǧ&]=*Kx^;t /xRB/(V.:Y -8C)Nzw kc1"&ip*o'NhR ހV6 ; eS^?,|&?oK᠟xF}hAf8 @"x z(2BS^!&wu-9Cw [o z@4J7` }"? ܁!gi]-E>o[fO[ѣ7Œ~9wж*v3IE"{,RqgG;$g*оB M͍7(¿PsJxgp@?rl`g 9+Smۊ'82o[qs_zZ f,ǏFxmj_^8@&.0@0NE жؾB4 ~V,_H2wX9lӳ+VW|Gn1V06r0yj_@r"n7xz0]PۿAqqo` gdg8+? o"d|]_@ʛgxxVUS=x?+lR iR/},8 nv*U]~GECbݿ1Ǎ@`CL}05Rp #Gǎ Fq,a"z +@k~=d)\0 Hȷ@D}A:!= v% <6p߱@@tP/d>iRj\<~~4h=h*#sEp5Dcyx/fgE+ !B-#Cx{-Rz{ U- H  ХoT]]ؿ F47tv<[aЏQO{Ƹ gRo5 $ Z`$;Ӳbs9@"!x ƺ<#O?'=܏qpp Dxu!tǔcÇ Z8h4U0KC8V(xߨ./{ fR@`u쬴!=-'w 1D?ݼVN:%~rOSO=ԧ>.>=TBW7@o_o8zLТypoHQs0﷒kY: UO/'0]VfYaŴI*XMLC 6zA(ݗ~Ίܮ[=| +Bw1_N9oJ4?_H!@%OVp}4΃aq";p[b@U7tcLpoH#K Rl*@RATAH[ h;R"|ϊR$`& xx'Պ=9/? ۧ箅P $cȏzWs~QyZ$j>Xڵaz}C~|;4|kq->N?}ng>Ey睗cK }c~NI<|0F~?w[AMGs$'UmiSfi0o(ulyaB*/qA>; @`E0zA$"ƒv,w:u5PE ѯG%~ =c)6ޥY|=GT,{l .Cu:»t˿* }1#gB^aZaѻH+k F8:wwhx9_멹 <\LTl@h`=l QԱsv]X1bІd|۫*C\W V $jԬIok?_A,:@ Z+Vg 8;=yß:?{LNZ& M`ۀ 0޲&`?f`9J>Т׹HXHcF .Wm-ej4+@QQ"W{<` ToAH?"+zq)§mcަԎvKL;##7ށTS |4Ǡ[/Eٸm ,S llrȌ܁fwxAX1So4~WO 񡊞>@EviEwOΝ=?e~ګ* $jvI8_cI7x 4AzqiVVwQo  |Ntˡ}4CU]yW$sxt\됾RPy 4AzxQ5Aq&km` _~S \@WU+a`V&R~ y.ڟQq7a?{+_jh,YX\8&Y:603p<|}8cUޜ\S!’Za|O_\2ïy6h 4 <oxcy_{<ב1{1܆zR1w-ῦ]D J@|1T %P^C夯k%8($Op18_74<ݞw \>)"*CwĄޞOc @D<ミeu  _J^h?HU zTl /ǿ-)pku<29$Y*xoV1@hL-1(}_@Rh!=(!x `UNqK?v s`;v0@X=鋎 |`n$R !sb^?@|p  8BC6 : 9Fڎcc1kUu(˺|I d궒,x{qA pqF y#N5S˦$F -H?#wR#Co)3gL@X=:zl^ ZQsp8tзBV-hs_B[]'Z$Vok"<_=˨T6>.ֵ6@~^yD;)~xq2 Y|$s\.K]vw:ߓ*%x v'0v \߮FȵROojaj h?L]ڥCP_7s>ߘ}Ybۙ3 ( l9(P>\j=rD@HzHOu H?wI丄oWC1̋,aӦ|p䵿/q\p;kǏVxMQ'-Ӊ' #2 $CF|>#:ňs v_Og? 4wU\^z}kᓮւ~X@]:oz(bM;VBeel+ւ]O9 AQTkcaG/"2"g! &8sᇴ;o $ٹVfc"x =TI0O~Ԡ裏uh1sÇ7;@X=6FEʬwDw E!Jҷ/F9zň(q`ؓ݉clg!P`r9T'{@ւ[BCK0=?kW4 oWT+Qv&ͬd0 k$ Ɉ KdB@}EyU,hK-J_D |$U L! +(dF\q_Pf&8 (^eޙA@,., ``ȾFjN0\%<&y?:" ]w״/?p8z6܁ ?ng(g?h,kغnQ#T֗T %?9hh#&2\LamM'v& ZIUy9]/VV  ޛ&۝?܊#N XDƤ^{to֮jbqj-{085 g$X2328>84X!c^OxIb< F?ikogдU[v@1!C 9mKVc;:\HvBф] }*"^@oh0P*@D.ZBÈ>!t's%VPG߷("u 'E p_)BS[_a0ݏ3+y%\"Eh;*@ww ;8T$CuP;p׀XM508Ufm@*um'Ϝ65ͻw*3-k||pҦG]jLgf(%K`0; v0(Xu.gŊz` &Ǵ4Iq/" .1_ :lf&r^eɇq; *l8@AI( cb})v?͌-#W\Q'0@`8#b,Ă?.X|%j9"7xy^.SYg;/5pk_R@{[:0Йx.es_^ۖ6eF ׁྤui7, rE1?uokoʶa&|Lb8?żyӄmnεؿMoz\*i8eQzϪeM xx*Pn.7Ǎ`e(o!d?KMVs54:̖rA xm<h[`Q/>_q Ec)BGvUXV*z2H ;` jp\pY[#Hbs5>?8ֿVN7)DŽ}A6+  E*Yߋ&EpJzфy$U綜uj8gߌ9Yߎ[ۖ)OLh  I 'fxU.1Ltn>fT ϙ&ReG$n_ p oo[`o䂶pF1do@FIl.Ml=@@@;eŨ0;}j@ 8 48q4RLD"u^N߻2? ?զQwa(9}y٫chU~yz>^Ih @xL8KKP fCqxh]0±yAS `bQ[XeEÛf cy-h0ٴSG }z E(xܵV(l >"@"G,{%t=yH&6ԂG* J`@`  @$0 00c wLqI\g~3&kU@g C7+̫꽵> `{5b(9x9v4M%Ŀ,ث(5xLPy523bQ>w;o5^g{Bц+CX/9rXjڽB.c4L~U08|+`#iZF`T@Yf=tM TkVF23 1l|ؐJq=o־d:Y6+tĀFA}LF+DעG'Nr-?OLLN%  G֭[7quM?+}7d%" .V74Q**y<ߚe_S^ϩ2`YheiB`T"W%_/QW(ei&De$XV,joXFXQt4k3>ަZ\t{iuJE@b ?.&βzSgӯ7VkA,O[tq8D/}bA5>̌jT ?,V8KF*Ǧ7-: ]G8u{V`d,f^# EoXv}\|\Aqo#h Q4n 0^d_Uz>3o@)/oO$/.Efm[=6yT*0*~^I/Ap6˚WmKA4ʳ*k%%Dû -:a0:Ǽ_m&[O:L;doCj"@,#(B|8Z_:c^yc6.J=ůdYf*#uphb2,8DOl D!{1pkn@"8>"+|?!i;8{ ?<5x q np 4`lPI25fŶEƋ#m֮VV<:;;wԊGʂ3Z-:U IK޴uQR".mؘS,mH< 0OkQ{#͸4`O`Ĩ -hC`FL EСGZ:omǾYolki!u3 G7/{098h؛u[Fq4d6fvX1>>.‡D(uB0y睎Zf<`{G8.rO2Y@.M @Cy5l0޾ފ=6fverv34?ibYGO EKf>]KB[; h$˚.)G9`/pǪ1C5`\TMb_ 0=!n(p u}8Fe|  5_`4Nd"8wB{l&O0Qhl8 `Tdn֮xg҈<?k컊fhƟx^|UьmqǼkh". ;Ԍw1fT ȡ !!m'6$Ĥ&3J{ u0NcR5Hí{W;J肓E P656o? o߿d}=)@lAǍu+ӟQV۹]髮3kf`&" Al`i}*oyڪM nnV5Zڏ=. @ݒ/* 5^M3F8EeT!{J(p טHo FC3HyUv2U0s1"J]>6PGWZ;oq*Qh yG*eżC&CDdBf @v\?&7"m<& }`7ǁWկJ3|x} xslqЀ}Τ/ >>k֞vb}$r;HLp ag_% ˚@1Z67'o@փPfjoQh,& r' ^3jsH'P L[ 0jBSgVͯ!il$?p6@6NQ̂:^ o؂p[U6`?uQ̠Y߼ &*"3;@v\f"TD\{Mź{bY@ellzI!N?0^d_!&Ɛ{-'J./k hTYQ=QNGyH޵#G,r5?i#w6J`]Gܞ \1 85۰ {3J)T!c NXC8dR"PY>Q'{c&afn[VZ0824w3~ A`[!#(+k$lſ7p{BH%[2H$r"x ^'5kK"h1~ *ո/x" @@|,M`dj@^ \ %A(Bʚr%7&U2;SaQ/V?<hԭzRp:Le??Uzx -yuj)@~#&,Mr(I ^+ 0f E[!E ko{}#PQDgd~)H7)X?sx}fm1&%, J5IqN`.I7&fm.eM/:ͻ1O8\^.ydxe~0X<_w~Yd+fџϬkve#pV0(-ئ׋岈 # W߃3ҁ&|SL.^[03 v}\2mmׂ֝KF8}oT3`v hI9FaPѲ?m 䉗Mjs>B~Dt{u[02 ^db&)@`\ !3^G}T]v2+zjevmr˴Ǚ|h=Xm"C=U |4 p3X`l 33pLkC*g&y`TuB$cX <J7ہ ˔QdpTi0od{O 1F3ADCAl_kǶPǼe" n RY#{qEX3X9^Q/~6߮, ~vmƲX:v;+FGGmdi"Z d b1:{z9lXi!?0*պG@6SIܡ=f"7` >5Bm|WdžHmK7 JA6wcPL !+B5 vq3&A_:xO n .@n}S(FoD/E  ("e< <@`< 빐>eIL~ ַn&eF6Zs+x}-pbk7d<#^E@lj' ^#")X1 @-}g%ǾsD(Ϝw)GNJcͭK? 03a1R֭Yh"<7 Aߺ0u3 =ڶN0=xtg1Yῡ ooYQ`?q0`j`Rh9 p"@`,KAj'ĽshnwygU?@b E@AY-Z2zL ƾFGDw x;> >0+l ceG<9ykݫ|BWjoL(u3>ngXDVSӼ ZE#a&Wvk N dkP߫yn[]!>lX38vϟdyHXH]qH|\#Oo_0^d @@` #6y)Hʢ.7ɐ|^d$ɳefő*/cubhd} w4dhl@=0+lgsv.`Ty13~8Chbh[ڨq p{c(֬maMd StEK̈p ^nf78Ό#Sx [<;oa]Oufo0-=ގR~H5u G[,0:YQA}LFQ^ +*"[o65VALfx}M8)KT V@0څ+.htںT*bU9l j/[ذp/fg0hbWIN"?*g"Ey)`c5M m6"6.Z1? pcx&v0K54oe nOٕs0pvvW`b_E;h8LҲʛlaؘA t6`#h(5~l\fiZ\/f?aSk3T VH4210cܧqA4W @1ܡX# f]WEv;G8DNh߇?~ bݧQp8B7Hf󳋿T64 e99ڲ-Z +f8簿CSk=c 0=-+qm9$Q~!zhf M ^sӋ)@(,g.WRU`ddb<N`XEPoUIbt6ʤUC 3mܸO\"Q N%0*վg*A7PڔyaqG@$g h*h0-A ±$߿l99bciQ{gږ6-"x @i GI4g=~ݿzp2ʑuF MU[ 03HKg;PC_QnΣyǥ Xq!Q! ~?}}<-60`b#Lt8`dSR6A/av4WUS d2 S/uhX;I1='{zyQHfI4<k>DJA7V&CyM{7 1Ie@{nwnOC| @ӆ֥gL`i-3qqpQy7@7 -* MțJ ٔ;HKh*1ަPG0,{K~ljx% ϫI-DC=; !Zghtv~ŝ~SI{t4)3p_3Qk_6I3H$/~5@N8uK' ZhLv*HR@cB;3pA<H\&SI(x<`zL!4}VX2T1O%l7e~)ٍG mxFho|;j,N=Vm6U[ALAfYn dQlW֖s1S3; EzmX! lbN GWL6>INIWvsZJOd`]/1M U>`H$2Q.6J_ e:mY[6^c(_[ۛ>n?X\?n?%K%͋UE%Ǽ `Td?`g37X˽8a2߅:*g7yz:а93p0XKgQ?e 'Y_D:[VԵ*3цP.x8xD뷞1 `Ⱦ؛|('(h8gLmw^~=i@>k5VrYkf"0lQLg+i3\泎k4 5O´(d" 0=h$M,_ r2<,I0'0M"XFy _^(cq$#nH">:M^}Uq C#}}~^vX/[ũq_Se̍'K2ۘpq_ݽL6`Td;-4WDMp|1787oR?#}7=0Y.K/?0QM!|:d0 e9a7q-i] hx~-;Ku"x=%W(я/ԙe~%RpG/r>0^cpS(F\2~*8h%FAv_F\8 4UKu]{P{.KHooc?H 0^d '^`';S&| OFƜsXDQ?0OxŸ/#"}J-`D jANǟ~ UhW* e?O/o]ҴI wgQM`}~m"?sBeqbK^<@q640 }tB8D `PG*Q!J. p*'w>14So~.6cu!" ^T G.~.4(ن]YZǪ)VoV|\B)ZGy7cM\xR bT,NȾi-HbƀWf y(hH .΄E)}2>v,RE6/Fln[rI=VS+g`Ke ?9hoڊK ԥ$d?pg Yx#geԵvAa|l:񏴀VRC5XJ%|岍|9,w0-֎oRȾ.kؚ1e }oo6ig2ckXiOzx/bh&x+ fJ4[f`VgpuIH@JN)ق-v1 q?vQ쿓ѐjNK7C0ng|W>'ĀIg*\>w*BB_7nȱm{Kmc hY~fD` 4/xcNݙ@??CV 19_@L8x #  nÙoyiࣖK"0?צlm R%2p*0;!F1J[e X3FGG>ME8b ?я?V4?zR)`凨0d#Sp?e Q/47ǪAR<VI/$s.ghc 0*!/5D `*%3r9' 0 ð-5@ֳ? 0*30znH dĪEԝ[ܲs6Oa@9/CI[" [tȾ6eb& &hiAK f]˥|3L1j=D&Le X XBPWUb *A 0M613yD9R.+XՠP$17<SK>ihw辙 W_56j&4E֒Ʒſf腿,Zr; ;s 3؄lz(pH m҃p׷ЦN}@=/ ?cSp%Id_jS9g\^cM`+dX1d֭ሑ'pL'xVw@N\tErb<ׯIp7O\ve q @@F\So*;sZ0DJ3TĒxgv-]j~@-ChP0's0k`&G8 ,O?oo[ԙo4#uK1ڥ52Q j_ya𜛖:΅}n2d 0gT@ 7G&7QYQv? ^@ 1Gn\pnllk`U XE_#0 xf.[z$͈SI>#\v?v!GnTR{fR7Ck&5SȲP-3Cap J5m*cE dY膞zbJ#SpmWt'In׭#fI$-J Fr $zꕰm_^..4l Y&YV-K=xL+&#WwBg5ܶ8"vh ~U{ v3\ nϹ^@X8gkק^ @ffPq5xHgeqϾ0 >7^5n jyF;'mö9 v׌ct._ ;`fad Pzfs*';H4詍}6Ͷ\"ج ~2L7j=|[{n 9Dw۔1M;<yE벦˳_8}y<}iD'dLG0Kunkix݇fm='ц+JDĿЋ+фG ̉1*wvpqYmN#̐(;d P0 G2~y<& ϐQT:u9lnS@؞հ$Pm@,"D>țJ7X ~}~g/RN56.{mY.uYVL0uN(P|j>ӔaY "f> A_ѡA/"&QD^`(P *c_.-y`=d/&Õ`TG@uXPUos(Ƒ)lF Gr]U+;\]UU @?aUC*Fy jod/mA5!zU3A5 }Y ߬nogA50z&-Wym;!$Op2G)c& tA {0N*o/^^0sc0ftv*Y [Ep{*"FDEs<@}>K8oX>%4* &&ߓ_ȪU΁~ʾsD1~aof8"Nk[ָɥmi3D_Y~4 (2hqi(ȩ8 @v_ >c[ @9cϛEڒ'g% +v;xLƪhO "0n:ݻǁG8xLS?F2`P`+XSX'[:AtO[AqLb2Y4YH7,[|zoX>ҽv^ęw`xȳ|okl|L1 ,̄0&{I,BK'MM0?8&DOߍKw-ˏaT@v_&`x&5Y<l4,za=]+ 0 VN0oenZe VBbؙ8db+xz_3ôKZUsn@^ubllrkR$`eJ}̓^v!ƨ1'0a`x@x]=K(qĮF{I, ")!"6-mz1cBB7&1dlŲsC6E` b.sUq}DE%>(w mNb q2bNYf&WA&/_~xq{-^FhVqgBW9 OYacMmj Wp{-wc͙b-d)c;>k4 ̅rl5 T.9lYn+'j>AVLQ^~3‘n L֥ǜ0+6dl_ 9$ KZfb_/hQcOEvxM.~%1Er T_}@μY"1nk 0^\ K<柘6+E(6::JT٢zw3\c pF=}nhh3L`~l5f<ߩhYnP+m+9a2Z~3b߄2`gxI :[ C͓Tq 9` KBLg pх _me8O}gsS5ŷ `.A'Q2oDKbUx7aof3}w,cN\pT-zxYjS{GiRzj|z)ϑ?~9N_agFk' O1VܧYiI%7(Kش~s6a"NW)0&XWOcKhD"q*%S>amzoX\bV΢ Kn_50`F,fKmek)|wH&D`h^W]u/+-Y68l2(eNd _ |4{NNHD13_(As<@w -ŧBQ͜{drFq;sNr<~KofQQMj/Mz{D }9\[Pn{z1*w8/;`|AC;<dn߳G C:0cZ9^ P,|`FL mi6ȅ#N7f|3FTr+tpL聠cNp$D~![RM4pZ~cN^#$,1"9<jDtjr>ް|hZG=N` 0*~OohQP@ D~ݏ<3:F@'y/:=0+~4^r5 [=L-6 z+/$DfLL6s> }DJpbL>_֭heĆUi*9Q'D'[R윞L(ͼMcN>HR\Jt^t.=12nŎ'͆B7}ҠZ`18U8 зR5ТPE9p<Tۜ }x\NQG~wK뛝 e6Gv?x Dz6{ fQ;cm}=ޕ_U P0VL0y%59dϋBҙ}<4;z"CRsY-`\R(8' 9~-a{q<__g.%*o٩D:a+0Βc lT&ã1E(8U~;!@};PDyUCȝ 쾨u8 K3,Ϙu& _R#c~صd=p[g7ђu&:9`~j_3n[5]]]-v a[(m fi{ͭYB{=Q\٢ ɣ \.'"Xk x o6 #Ȕ>ќ2|WU{L̆Z[ԷZvZmi]׉ 4Z;D85F0 C /jN_03l%kSF,#1js~pmɹ(| Ge^* OX:Pv{E0P#V\I>~03g z2 q*ks#/p_MU};z}@EMTwe,m $`:h_FI0#_}Qp̡:5}5LJ2s1fkn}Ъ >-v c LOimIzK Z%DVY  f 9֋ 귴-k"> ,y /j7GNq)}"&@"ؠ|9zz{wufbf}k)0D> &v?]R"e{: a%-fh]̐߻Wx 8 UNJ|O.fk]$3"lz+@IY|3OnVc 804/KfU^~3a STRsc|qXk/Dֽ 0qd@fךret6#i y=Ћ}gLٞ>YgsXDFR.`\h6{qZ 1 XD4![RZ1" Qe? : lMq_M՚) ǽ$fx΅R[q}PI(Z/‡Cs*?Wypn6,ϘK5=EbF]u,ًj24>>~& pV\`ӸK\;4JMb-%m/P ~ε6FXFsGf-V0Q6!NJ|Jtj øTkfgX2Ï{I, f'M@xIFAvT60q{8((\;hƋe'PD0x)kΓI%10J@Kr7m1 lr~ .ܼĄ~Vp|$fdڵFK>3__'>y_ٲ/LBAzWWZݰC;xڢ3v0FajyT*`T̢pDqal>}ys(JZ""/+70qEm21Fq[75 J>/aBIhTXꠠbvn3+z\)O*g0pk((TFFF,fxxXz:6 ƋvYC7~RMP;߷.ƾK, bU)`HE8 "~ `gu _`L w ],(Ze<N/' E>)"/B$ _Vݽݖ/ZnSgqPD&gq&Zi~17/r}*0 ](24KHf"_1f|O_^vPi֞kǃ QT"9i| }C742v΃V6I* /7UٷS$%[#ofږH]{?3Y S% 0q6䁐~E8~0oC3,9s;Ǐw@6}l.{V/weJK(<~ Ź٧E$x|"zy8w)>Ȥ./cccT0/(e-}}vvPܹSffQpը`\?G15"@0 :p`@tJ@`А~3B6L EEz4U~#bC$T0n/ٹKb[?E:8<^!DvgRg h֡ fᇹ\~&?vNx0s@*L^0 ylL'X+/Du|2ذv*f1s$h ~KofQ Y 80 &0@ l@4dA<|i$^1*A;?Y ~h[\vĠ)f,q@5czyleГw=x S*H%RFȗd `*ccc&/0[ J:S$ unNv;j,Il`D'r%׽$fvl@8#}3c?sbN<dVąTtos"kEۉU* |v'N2 ܙ0nIAgy i^kD_yfvN,-yЌ,(-^d2n"yy36(^󅼒Fv[j,El@܏}:E) Fů{IcSm@te>N`(FK1kmo?4n:dh;q6{+5NX|: 0 9fa1 0^ג1 _\e@:y(p&<D."Jwwٰ?e+̌3Q`[o/&%`g # |{O,/<(@}`x @1S-@q4dL2^// s\[z~_'OݖQs9PSk06qK9NXA@ET܃郐t:1,[Jc 4RF\- *xu<]׫%>dżӳeϣxg|g-D4dk8~o jDpu7Ϝ 0D8-`=Y{xa([mC4%$\}<}Qfɇ]s   {nJ9Md&he>يcPlTzAІFYW <ۚfd3wiyFsm a / )kqPJ":f@Lgn?Y/ CԂ"׉ߣ%$Hl!|:?TAEn4W[z؈As71q!z_WFّU 7i>}</ P L7W0$s xrnIC<1y [xۆbJc!8Lr_2IfmZ Z)&5|qQS &[NJtjPZ 3$g&ExI}ywd?!7a>}  n m*7,E=g1`ZoQ(>?؏%?:4]DK  l7 ݯd.r}&TK/ FÞ$ND>J~U> n<|G"vJaϢD"V?"& / ?031dqH43ya+r>m\gَ_(G~6 3n3JJM<ۋŧ(o\R"6Wcv&@>ALv0 G >\^x<=gЧ~g5坉eJ&S?+p?cn=e5l>{_xE~c"6Z f80P\:`k`<}i`:7]Rrm#7= {1}@rof/_~IݖY4vĢh?dfW^M6L ƨI0+ih9LܩD@^ >#d=ΔdS{B_XNv(h;,9akW8 ,K9&<%( )L8 S<0sK]ƺXſ*̳-Rvx|&$3 {d39^hg8 WF$+}w/kI#oﱭqN00?w@?ݮ!GQoN_hky .ci_3tl K86<M a CWI3C"0~&r]9 L)[( sZ؟0^d?h@ \F׬u29f$ӋVجGϡp^Z)a ո>Dz4?h  /{WQDNhlj`mÂ}bq*Xrkyۅk (>϶"2̣Lq(O‘E=eVюt:{f ^fb?) 3e>یLXo1ϫB(m^zqD ux.2z";ַiqTD>Ot6ÁB>/O"ήm3J# V.| E%zs/sӭ *3>x@,ڥj bUClm;9uj|GkPWDfY2/D%޾CFx&b&# @TQ2ETh ]#$B ]+<0sApnƬC6@ͤ`P,]PjnǪ.q3 l<(}=V?WevׇDW<0`뢘#]P;uǛHSP^qgyǨh}QO\.[ |OD4ݾb Ƌx?%>j`o%c>e 9XZϫmsb68W؞|! |*.ڄF<ߝdsbA-  7L" _زގGT^/i/7f& T*/[KdRflY~)eƞD!&H4p~Th,jyUVwvF`x .kfSW eLg,wVnzLɋx F&&=Xd*z`\' / hJb-q% 㸜uHyg<&Lſf&@/'F׎ 0D/@,ۋ\YQ¹O0m4JkKQo7Ͽ@mo ؚavy4@]'!(ЧIs`_C,ar$=ͩTJIW! ܈h-q8սv-32229ǿSbb"9PO P=Pw-3~h7Ƈ.; zmȼo߸3裡jABVttn`98p2xVFG-((qf+P -cMa/7Q=0@x<28(V( #Sb\x:'T91%灾&8c1~L$x=#b@-kީ]]]v1F,J| [gW6YGɇ2[@, Fg兟ݾ0o; ?%}Ho&B݈?D۞j}nы Xv\ʃXe8]%@ " W9dEs+᪉Ϥ~ת0k0t권3_)keg$cXR O P!Rh SKׯwo!ܟar|/_D: 1`}fSr<Dl]o>Q^,1ϢgR].v;^)`n=+Ub]4&0*Qw?DV5d/5:B/΃6yQ6P s@ķ$/L\.w:t36p%z ~= v/}^sJDř \h'j(of=<XAe1=o}d*r8%Ay(/_r M"."1 ",gyWٛ%>*49:,rzہ]7Kf:-aw."+d7 jd^5d+Dx<"`;r_}4V@LM P;p2kPT !~h,ф8m* P#ox;Mpϡ@Y(t&M\p62(>[<3Mjm); x_T xTDObԆUT\.Wy!D {檫e \ڵ=4~hgUcd)(nFaMJyY 긜gq*4pjp_׌q"4SV(G@CA0MgQj_=~cGKu&;Hp9D,ap]U6vpsO [tN6D_@Dx%m8o2;(0˯c<ʃ=ʃ 0;}?^z>0'Wȍ(:gb\ά0_ј}ȱx|XRn3 `MfĨh rGcAiWLJec#r3 <9+4r)A^;&w-022^ f6?`=-b.{%hTVc޸V^di]-vsbe=vmwtQ}@`E-2ύȫr[h@FS\;cjj ೲŷ*~H6N`F`NY=ѼZQt+үULöxQpoťd_">TMQr|@=8\poTgL4).hԨDcIfegeq`kcYf#zA_D㍊rJ̿~=o[SU]U3vWwW[_=Ax~?}z"m .ۘuG6㒽/eeyqx: 2A8G7֭{a}υ{0}4iTpNwEP,vIeۖI&X3'.iK_%\b eׯUM6ωv S87,d!t!B$@t0\k,A}pm78,y _3ƲUU1sGoO`D66z2Vej+}v%"\xQwoO ΎI6ad Y傩 km.]]d'ƀN6T.,̠dGrM&?.&={-.3Ȯ{Rs xǦ OAFBqf,ʖ}*NyO-2/r&pGKssKsz'g|qU \94£1a{V<&lmB{x0o vCCCe Y/؅?wa6u}p]ݝtuu%I辙eڙh9t L*/o|o7o^OoϷ /PsNk wO:ػ-rO3~߬6 ߁@~R8s5״1Yt|ό?Xs6JnS(yD{U?D qoę?Y&ThDRB@(\W%ulݺՇ8##?B}f/`p6~LK_/fQ>Ke;}cGvEw/0rш- Pb01Тس ^Ggg$ [\P5{v%XOC6͋屬vvl1asoeD6׾G!4] ǼLY$sUwHZE߼]f߬TI]qo}x D}|Kpv;@S{ U\VGr5mh}Z [" N#pr;ۈGw_ $lg K_a690 }@wog92[+_8<:2,˫x`\*=3"[j7K@KhaoK_0!d0e1p`Żwy"L4q2񶳆"o6au]稤 6nx!#!t/PFqXOUĽp_. Go{KfqW;|pg(.w^#CfEy6 F=Ϗ>_[J9 pfqNX#K'f+ceO;ِ#p1ZG#3 nbD࢑2x&{gú !ֻ$Aس"wp7 YWw# VG.) TV6GnE ~b8i֭[ Utvv>O&#M~~ *3r GdMY $} Qwtvܻsʋ =?1_pIt#!mG6E@@&>&@gWM?.!כ 6~x?EuOvt YMbE{,]٢Aoذᕌ^!%r6oFdKE(I 6r΃FHFU wqx{[sa-<5,Bɑ]FG%@Fx[SFdC8 Wى ty5b{/~.o̴g0~Sщe)d >~sSQ2a(<9w=ϙUFKl욵ǎY˒M|s5eƸHc `H\֍6:@8{GGx1ˏY/ҿr}G&)3,2+ے~ `Lr{{C"s 7/cU@df?CEy)ⲭa/ohtE4ֺi۵XbZStVT{R$jm:8 Uq RrV|w[>ׄkd6VÈd4ߗ3|7`,GKS $`;΁yo4ebr==?!۶eZ{#D  0w 1`:vwẅ\-WWί~}#GK`Ϟ=׆:tYMmC @u`hzc&?럾hlީs0H wyBz]f!{}8/Ȇ< XgVلW*܋cJ#JʸMss-3rR8檄. @7-Gٰ"XRrl"~G1kuDMsmJxU'l,bYv&m6 ?-5@&@eJWҕ0 tG0aL;y`G"v`i"Rbdhx7f̖MY`ܩ*E"9|eWw3,yeDYmȼ#;|/u$ 7AˢsgG? .rFp0ˏʌHmbi|݁Ӥ- \U1Wɋx炎z o`@;F~Mc~+o+[1N/+c \hE\} 4sTe:xU:G4,ș2P %/{`H5۠ȵ`ډ*߫hMFYH/`8F/aDj&#) ުмagjȆНhQ0G⏣i)f0zݬ| ~!!c̷w .B֎ ΈYPcO|oIÞ-+Tuڌ֭{?!C ~45#iO u/`}> 6}p|ח274db=!TZU|{BJ8iv"|tL8VuJ8 c$~/m6O9t*O9\sQ³Ž%-߶ šyg߀E|` =%<a|j~3K:] ;Xl ]Ӑhno4U1ً{^?H8/v8HrPw*PEQfv\EfbC m¹ 'M2"_6B@9Z6]שKy0yiLTrtDm' ;ҢcOauoߨ6j7rd-l_"`l`W|wq)fDЈ%g9 ?avpro=jժyȆ}.Q?."W{.sOھKmvhÒr-A]mٺ%K005ǪXs7lp#%tOC`$( /_`\-הI-ydz^l@h |S;=QŵVx:yD6|7qGr7zA^,g"&mMH< pq+K`2Z~la]M6 lHL9gƍGȄ3/(ݠJU*l`fGBޞ6BIJy@3欄?pؖTA^3<ׁ.umN!L?J6=>s':ɥKNvi˗/||l+}}nT9ILMz幙K՘s\͈l ]bGc׭c<`fD|zk =pU:E*{mgGF̺-g9nwy]w u6ZE2o5mQP:V$3A(mhmcM۬ yx@0]C3ǚo 0Cv\ʡwXZ C,q=}=,K|;}#rTo ս˹:;;H,Z(Z`Ax_ery,Y$ ZZZ&>lH8-ByE otkǎ-A2igDi1#${%govÎBS})U{z:gQCٶ^<潩ͳx?K/-2ck\5 87LeE@y2?1iHNHt(#!tZ$ ~=C[3F8?aa=;Αv6&7U#3kRsgw\o6⌋N FJ%F%eۄ~ϋ/,8Ƶn`fUs9眚sl'|rbT.$?S^wwNۭMSTw&O q.P__D-_dQgƨGŁ2"[B  B)a/~~dEl1Ja# ,iL=O I&L17]x9&k0~*f +lWC-EG0"W$(o2 Bw#>OΈ_ڍr`&?gӖMz;,FJuWu_b}á]bY4 D17rX#a󝝝Z3`ݓLjE5΃.ux>tBԫߐt0)G6(ȷ1(>#nX%HvȚ*BuK7lڰlLQSH&&U{s#p~P[*짒ek,;hx,}s&{bY^2c5m Zv IIw͂򍪭u\Csb clCP yփ5kW}Uq\_(FdKVAL |trX?$QP~:a3[LL`y/:| 2CRp ٿ#]"XX>{:K6 2"[B33+ k6Oe-g5ub;D} !83h[ji,zaXgϟ#Nx:^~: 5*cMz^J$D Tx@;FcxM7CYNUZL Fq}T \Q՝/r^}}{-YQ{21뤓NQc---2y87: f9z;OO O+yYq>ID8Gs֑ 8O*x>E#?S=k,VƿIcDiI25 KkG&rpo,~oHL]gK߁ \sӈ o9h`=~表6Vp±] ݹ6"%-xVuf -p_~11<*n1ypIg#}I {ndv t_.]`T95yh rEy~7?1r-X d~Ȝ潁"wc-[ -pÇd?7YY^B ;wj3أbD3boDU^9a__zo*;Y\2qSgE>$s_Wo6ٞO ^. 2 U_7cX& K/IճE\.?.FdK躞6O6#WnZʒXxMhXB$\rPvļBw ]O]N!<{ww~P*o\ցo9I ܋d|Q~qc5"ifeR j!e~%< 2R%N ޗ ,{=}MuhЌcWYDzF@530|Uz{FK_BslMx7}`Bwutu`rwwjDu5c֭} ֭{%?TouX"Ϻ=9F Q"W6@V9@hA &?oLa }9;؀~5o_,ΏP8Qa`n2b?`}sM?Z t K1Gv!K>uOi}u\Ի䱦m]GQ gg=u|!#!t'h0nzzz|,i.0iuEfqO#$K\cAqV`>l<"W] 2K"ԑF ݟs`ϷRx9)2e˖xЏuCU0Q*d` eg]޺u+$m۶Lʰcǎ͛7DMz^۷o,WrGO<1N*vg>91"[B.Q Y'2 @s2  .m\ Нk di$ՕzuQ  M<޽;xy"HLDշ<(_h N'aA]7?a\~^ib…ؗ8Oj eDY1 B3 N#;֢A@1'2\VuGAl`6kxUw˘5"Ϟ1?Ӕ,_3"[BD-+Wt0V9dW oDԫ0@5Hhb'# Hnt egE_B 0\2vP<>$oL6mrЃ׼̘,!*[O`j@M)b/>&jpᇡ뭉s=Fxoذe2s9g N~62|7@hF!.YuhPH[O2|3csAk`V3Ϭ1+O 0xI')V ,Yd)#%t?MX&6rP@fDm(+ j6J-Ėu>+ZDPld݁43-P| Io9nye˖M1_QX3`f%h @1ټy WI W+7*(m0`hڷ}gŒ $a(yu"`HgdW z .<zК7ψl '0o# DL4n&@ChFYH:OaSNdfhhp_+8Ljad͛3k2i ŋOoOUz,3DEӚ5k2vDO; P(-l9?NM?\@FdK$( n uMܹ350 A Zfhy'~F @EhkFL/bDG 0[ D{#X>?zO Zms0EPeb¤[/\`\! `eo>ӰѴ 2Ȃhtvvi'{%c/(fO2@s`.C-xfˢ2"[B߫IAe6]]](wn"< /nd>f{X7mݺ5{m 5 sdh-)F/fDOW1 " hoow.d%fEq#H^C"k&(EL3Ľ%MO^mſ@&AP d%f.]0@s  , `,e` 2ꏭ 6Z:M`7!&!L | 2K&6jժ /@*2f *Lj8QX ) 1HzN  BBSl00V*3``qr2O(BuK>v& F5+fD.?777 hB؈g[UDzoc4`+VbDdYv_ṷxAxLo& -[Xu&Li F9l=Dp1xŧ dxq}}}%ZƬ {?gʧ .E?F_<hBplſb­M@&5nXp@e w$#%m0lMY x bx/%{2"[B[ z"% ",C@qP4kb2"/aYI9QE M3FK_W.H2T`<<, | !=-A A@- Zpochy٠ aTs][bNl'r/Y>bP4t&N9c >ʈ8@&A:2ht 2l ^p0&~kmgYm L +,0㔶'FgD~~eh`uQh҉ &扼ϭ5XdQ;.Ap@d] 2l ^a[./(U7p.@Z cSaK fHm%'}Q,Jyһu\PaQk$ЎMdP]Ŀ&@#8->?QVQd!C@~@@C@-d`D|4p^"f4 VvWLtBؚioi| ,L]pGp~ /mcE' .1r,wgK>(Aq1z+Xвf'H9 Q X O%*3L0]ʈl ]߉Z\L?6 Aom$tF @?fuQ@gA*cԙGKa6 W3Mݢa Y&ݳ+g:V`2i ^hη!iW 5qn daLx7q}֭[ Z ^W^@ho=˱cǎxprT*`۶myrYI„5sq la.l(m:~цUa HO:餫-{V$, l3gF0"."XT67L(eC uςK%n K@eo= 7oo&)Xkw ocŁ@yhۄ%6ZAq l)(l/h$tGJDX\LkoBsv8!_=apY.-[6]Yqx13cf(tk٠̹(f.&5ko> B :asDpDlD3 q3q0g)&$@d_`DYa$#ZGlTB )3bj{6qal{lM&`9!z>ڢ 0-0;`d/0$7nbg<=w3"[B~$aQ) {-#5lX|_=u3EmHkM™it' ۈ lI&oZ|6sr:12:u( :x;33VF$&V?fguټ.Tƕ܂m@m ݡ@CBx# az=?KgOLױӇҜlm'Eb` _/ON8Ds%~deYav 82<8SG-:{NIuRշvSbU(+KCwq-yS3±Wߵ51)@:4_oG-TfO@ [~\eVL}_ 0}?2NYpR P&~k0psXp͌>c$;&Hgҷȸok >Vo:dߜSp%<*/Vné<I* k5vgН+A# a߸ X'0pۿ)sX?/vEqy|@O>9Ώ3,Yr;8xt0`&qpOe< 3wg/`Df]?f$2^>/Pc0TKhFĩg%aUB2AhyΉ؆zB*DՈ{1X>@"$*g|ޣf^P!W0&Ne*x9L@`-M^iy󒮅H!E,A!gŒ@Fs 118㌻-:;mBm֋ՠH&jX2` 0yRS$ TEpU mf3Vz 1$^~tXSkV9.i`(Ebř&y%yVy܄g7VA0^upIbs0lU@zs+3G}5|*|ety?l|h#JF,7pm*W "S<ch{+{4Ob7Vpbn#ќWyuo+ S7/R[`I WG4Ȣl+z1A mۨb]o0- cQ*^;W0jQQP%"_֮]‡NЃe˗o2KLlԛ9guVs%<l`bnD jGK ŀx:;l- j$+qMM緕FOgD* qy_JQخ K/*z3!ĢRa$$C4|RNDVT&3qz;hzF$woxvEkA+gDV3TVy(A~Ӆ@A2..!>YgYEȖ%+ G,'׾C5;L;+&@6Mo??cD}/lbmHbZPq9GQgs&@xy]$ M[a̓'H_֞wty,)-<wƈfozFKQ,4qE/<lByxxw˖-q,$XQk``wa=3<<|s-, Hʑ n=]@ϟL$@ Ң],XGn냲5*㥛dodpxsɆMZwvGPeŷ؏zIYD8M ͳ¶['}ۙ}ې}>8;[ ar^ H1E/fkf;/.##ky,&^A1_73L Es^`A<ǵpM@8K+.FdK:OԒH#JEq/YϑC&4o ^DEdpg~s^q[A\A|&u[tKN !PXx^0=/izY{+}vN*z[LK`$raBKBwAC>/ω3ẤUYApwwwb[q `' `Zܺ+k`P`pUH4 '`28q2!VtbŮ)r"r.M󁠯Q#XD0og+*RGK=9;gcr3@1"Yol"uw&Ӵ3Z>ִ#HMD1ZٳQpa۟v| -fB1q3jm۶_Ӏ7K[0z y8bj ?{Pla2Wƃ{>|ɀe2KGG iL4Q])l>G\Tp/9_EZbǵQD^w`K0@d@Ad0! 2p \a!O?}&@r >*&o0 )E\M$ h ?6`]?Ae1X޹sg%Ec!Kof!`ĦMRo} '2d>`ގ;i?ꚫ>'x.*< E.Jc ڿe~ f&GH 2PdQw  KE5x`dWC  ]m@N pEV~ 61;u27n0\NHĘwٰ/8 lw5(' [lhb'2<[=E$MS,gy0a ,͒w_T5`I ,1o /d!13gZ|d%e[Yif#05pjL@1qzҴdm~4&#1_{v~::3{p(@ | P "/瞋 l\ ȟW^b⬓eʄ_X7 ߅`&N@qq.LS #[nܵkuփ0`@h}6"0Y~@d6խ'4z)10QdmKU]64X@3z0- }m>> (6}u"?&0ߟjɌp?dU{vCAgQ@-Q z<, 3 8Ys el;Aj3oz>fBz:Ч A[À b"KBD4h @kh/HA#|YӸg0dsge\fx u 8Om``3g9 LO GBm Dp2K?= m@4n6(cn&Ϭ —47D@f!!Xe_ ?!i5lA?`8=yss5dAA@@pXЃLi5J —@hXw=)!.q5>[ -CK!5|  0R@`YmxO \"% |XFle۶m۲DK}l ,?v\?3/&  (#4y )lj@MVi֩fr^:;;eme!I`@z:2Vx,5   @h~Z2\ l "O4Қ0lazn& ѾIfGh$2Vw5{G  1R0YM [87``l HK@ZI2?'m<>hXmLm^ H*o ?M2  H ñ^n]\wf˜C5 |hhg't30%|6їpR]F?s DQmMޑ@L|@AQ F bYd2% y "J2vk@2_0 }?Uqnf8&o#i1`Z:V9DtK"  1R ؽ{v@_aL aƍ "6҈.gG#wpIEXпS9> H>dAAyX%LZ@KV@ІG"@-x^[6t} U#\> ׇx߲eKjhmmlkk5Us&NAADA)vL֚["MwBDD0 ӈ \cZG|;v6fnўLo]cT 0m %KL |$?Cw  (P@z*0g˃m$5+'.=;2_Y 7exG:u0TVN'' ~1#[M ߃ /n MY~.q$?  (P.)_0vYˏ~[ Mn@' |Ic@iX"2$g% cTqiwɏ#.fmjy ^GAADA1Үס@{H5oTKDMH @=H#F sbڌʈ)k(Ke"on2i` [ߑ ݃  (# n%IcVxu:TICK@ kg.]α @`-$5}l<}[epA47Uw`   eB<+0OԋMI+6Da "KXqي498?O2mlۻϖ'oS,M|&@xgf2  B7&A+x$-LIEdh\c/~@^KWl!jfO8ϳۻ6?xo  8e; yp9"rAp]#$i'2:kҶ=WR ]4?)2 nO$s1Ҙmmm5u31  85fL{#HJ(+V #M%ij꼪 GmC|(O$!bI'AAq?+rf4BmĿ껶 w ܾ]Ox>m @{   ,"l*vDif* @4@,B]DE_TmWn?ojvkB۷H#Qg)= @AY el96҄Eh @V= ]O ~l]T҄N8o˷} n./AA.+KTd5` r['ڢ@dźu\% O+]"0cUǹe;Pu}(;> s$L+r %pAAa * ,c0I`  >+F &@ 5suʷ޻Dlٲ%$|rp{*@p󶝴3BQwӑ`I*_nhO&&m zj\D#%Kbp  (# nLEbǎl(  $lgLؘY&lv./_Gxd5m|1?  (#0pl{ d`/ ]02_< O;_@DnYs,IZޓ[4g ~>AAafv|5"X+ <2,X~@.-!u;؂_6cIytT0Au2  H ly| ҐL}CQ98.͵e6g"Ta4VX0A52 ȅoI"X4F `jA|$uY'HC@ZbYw P t_׾ѷ[$ŵFu_ePeN2' ==EF!H >Oi$,nE/YiM"]ۮ-0+l{Ti"T__@gu|@XE%Ɔ#QT2)Hz@%I! & 6.q2 ~@ޒ$/)6WV:}>  D]zDZ`f V1/rpur.De O2 |; mS td }I H ]zD'kR1zp%!Mdc ]}Or DM趬 ўM@0 ĿHZ p`H4&6UC( !?)`V [Ay? !Dtc@zCu[^bIP#njӾ3ku=i=!"t1lq ¹!AX'z_ ?dL1R Y}2@!i|km-/yDYg#{zzj64ڵo E @$aRDqwG42=jF f L1!:^[ &vlb`yNi0˟TQFYl ڛ׵廊Κ5kRw5?%o@8w.$J蝅ѨiᏮ de1#`f2)ӿ( xd4%#pe\`ky!Rh'!F^Fx0n_^փ~}{O >ˏ \>?onn ¹s!Q2{BB , l\,Ke1"0%g\dd-jBĢtuuM)Dޤszz/I יYG >Ï<b؞d$( DYa{"M΂ Ʒ_fe2a0[Mz@k18\h$`BALOa@g@i?lr r} DLLwwm'葷 %ڵ<K~JDZSy:`% b ;"/re`ɘLbf<;K`660c{ d/9> i \ ه8iC_zMͧΉd!U&fu>)(Z~%=d<xBxqc%YbŊL 5 aFM *@W@ 8?a﬎Ҷ#̎g%oKY {YUȿ뒞M o||3sQ;$Hm"1p|;1zgDZ K ׊na31Tm&#Bm3|ۂ,+<Ῐ5:s`O+*`P Q% .s_!fk` q/\R/8" MY>{ Pisc'?߲0 u֭qLPmxB޹hv}# QuDoOsW`{d!Xw|2MKW !oD___& فØaHP+=== 62hy DAmԫ !/ q @`L2>B*B粈Iÿ$d݁+Cz_+usT2L1O/}3_1qPd˜aׯO+KP*Ѕ bk hl c pa3M\(`I_"4CylnO3:/i_C,>Og`W$ `i|CXH4{ξ8Lo`aKfƄIk'?XŽY=]kE5BD` pnRYBݺ`7MR0 B6mL@T2qÉҸJI,9^]6 !J >'%N6`q_6 )@M4xG"rԩ?'AL@`>5UwEؐ? 7&knݗO||qwY 0^kp4^҄ b㡞 p-\S'}S xD3._mr+0nxb8>mLum@ u*M?yVoF#' btl~AGԡ<<qxwKsd|L5-9 g2wۊnq,<3^cp4 cO=7# F1I!=Zi ~(nCFdk=n3EaLaT0رL{LhCiII}vHH2e (; ];a*ءLb0һCW!W?7lMg=?"gv2ς}_e(2jSV&sd`UB0|q>l*8ͽaiCwyz_o[ʅy'<郿M[Aں  D$aahX ˞iX˿jIAom۶!}Yf簨m@;^#İ'3b 1b@3hTD~1#fD?1<P-^O旷F̓f;F.jLSOdt갥 c2ſ0j?P-QOo#ڍa/?V vٻll۱k$u͋ע` Saa/0=A8B;,9H:C!=\ Lڵ#EG `-#\2B52` cz$Ċj˅qi*ȧIA9@ q'-  7 L?#FR[M1@qe2tL4 |ʺ deeZ_M>7QO> m( bcǧ>,`]~y `|X( !ФI9'E{m1/vhDL>&8ߘr, &d˷D 0g!ABo 4hpVD2̼Oh%y [~qд1"x '.{nn\ӨKMY6@&3 .1g 34WA0Iߊb>ZGBū@sc$uK޽EX X( "`? Vx.4Ajm03#҈j\1&w.ϢQi(rGaXjʙe![| 1V5̺O0%E 9< s5b&F]yŜQ SAY ˢP"#y @\5ǣ@($odcn([D/\FϞC'NFE;lE[GvΣK=AsI/" 36lc  'S|IoC11@XvvK3#;(6 6`%?M"!/,=,?--j Z~0H*jqP7jXi4ԶβĿ3T  pT\Y3B5Ԍ^ G~(ظ P0AߌjAe䩳رhCh}>mزX-\:Y7XM]oZ^<+4zs0(V^dbDF_i"@|;f @Y u#el^3(.5bzWj+##rA`)KUMX|a$^Z 3 _,u/HFqex&#/4ż>,Q/0  ؿp2:q4T[@>B~2bShテr&}H>dZZ-fWB:МMѺ}s{wѤ G/HX.x ~l&@#ݛRo0=Xl#B 9;4~1F#P~X1Ex -@Oӳ?b~ 2Q3`9"*Sgm3 &?ɹv"ᵝKeb[w`j'>Qrn\FjzſAA\s7c$'嫃I嫧g8 )h}@N@6vꓶId%9wc:TP3?fX 09{c'О}d%%hhņyhEhauh>ySQ~S8x訪_j)Zqr F@vok(މ0b?#Bڜ+5,Kv'NHXݧ-+ b'=Vz-$-,, OW& !-vTPO)2{>_I  ܉Dl1i4u}X!ei/YrbM5:777}%)8L9C ROws@h4hvHc%=8}:OG_6 K%Af1 3g/w߆6*F[,2]fɖIh1hh|4yuwadhѶhca4.^F%kT(.FtBfc$Qn#etB+]v ii _#@۶m;b$^YlX#buF$ @FM Q,S^"~1F@D+J~߲e,'P@At@v/x=KXq`u5?7hL#W0 0wE룹S[}St}0Ⲛ? Ir0|o czx= 0~3ٱsE^4tA}p'Fv‹R1c̘1e2lHb Df8yy =ASш@|V)@\^OӥKyI[<̜\ xȑ"ވ'4 cA>߾|4n4E}pb- 4Rc+-HQSB͎Ӕvbh00h0b>PH"o^gtJؾPkr;QXv&WW0E&9 {\nyԜ{ 2+KCMX_Nڪ0 =|ȵ  1 ([`X>wsd܆v)A:=<;spxp 8w98>>G{B3hhe76HkXa9QF ڣaH )VOP7$ЇnDr+-KNK } ܍05u0*pʾj> 1#@ihڴǾ546ˠ4nǩ{I!o?R (pT:  3MbdOk#M/DQ^N 66&Ƌ,UlCY7E -95~45PzH)"Wգ.B5I~6rmGފ51 >B1 2XqKb,YHXVD@01V08 I&$=YIp7o~ч Lcuҫ'c$^Oь@|v&\2x 欶_^>-@TC% %h,hW]y `@F 3LA12'.v 괨#7Ju#%ěvLxk㹌 eʳ+ն r}`ڊ1૫8 q -4`>OEli 2[ F~m/, 1j7pNVhdA Ѡ)5"DҠGfvj0h3lE\@ ! *$k}yhҤ/8L_ߝAL?sdVfU|@|[eWL(`D|q7%Ww8-s#K>.cP:` `h#FF#ԥky1F HX$" !B^Ƭkx0hO 0_*RLTB4:[ip3ATwHƙZ!O%ԢU@;ϖ )C+߯0 @'6Do{eߎkȎV_oeq 9R7ZkR-$mAAd5Ad~~-$v  f:`L@D땓^5 dهr=ff|?,1bWVyC^Xo 놕2ì|H<ƻ7R.} @ {i<׼ ˃~~2+83봴 HJNONK8I.aHmݙ]?b 7̷It `8#_OM?|q4e>8e1pu$P!Fň4Hy@* 'V`߈?1|BA_}r'0x?^f_CDL/VN0/[Ho-%(O=`w%j#z)~D|`Z@b}0d5G3mWz ّ@((<ʘNZuYHH= {K߭>G>|@˲}r,mc0/6b}F{"\>FN@{8X[&Z `P|#H0NEH@!"bDeKGfrmrR+_CNbp"SNZb;=` u3K5R 5tʯN]b}V{9@2"A_s,|[8ߍ֮'"2K桅hVqY2ڃ&d;]GףsZ>>s.@/Y &čoFEyDmL@߰GիVZxZtXf((䳺|h !#em %ߓ0:rU3 &YI_ &@L4H#6Jf.H'I!1oÒ-GDXb{<%͸75rg87sˍ0A1 sCjTDeF= •'I!z2p6IsP[1krE22}UED w yvEſl88>2‚)bz h@s)CD nbP:Đ sh=hhhмuhhhj/P _Gv~Sšya|tNtuY\6Za3eAtc$QD[p$ޔ6&}7a&@,\)t#GZr`:x&.5 ),r -1Yϰf&y @ oLEWhZ|X"`9'˖ZZM61/t;{#<1oW*n@}PT;8V &Arn: 1xM@{ax?8r{Dwr` [Yy@ Z]&Z@-$`z@vVk%#1XJ^a\ϧ4e3` 9wũ`ә]Np:I;䴄lr #+u kk5@28!]9 E0U@8E6ʪ `@ZLEv߈T ?/s )Dѫp@8C7",@ HoݺuL0خe<ԟ]q:G(&fߒW^lT}OJMx 3)4H#ę]15AK:``cc mPDZxDMpg#b8_0偫1@  @z&1VO F8 gx3J41ndAVr_ͪ l1P+vNq*v @rzqp}#*)3r. G8*lKYK9źztAV,Bz&%}u ]CrZu= 1q w{H7[ D/jКyOa?^<Q^λ ?##~ rT3O5* 95I|ia2 @}oZ+6fQھs7ڰib} ZQ -.OEskGkk]mc#ܥ@eKyOA1m#d To+`B"%jn <6 9rfY=zwm۶}{ca/c07>ehޱY@ͬ#8 s^B5 iF?~9eFZ}s"_׀Mɫ+&Hk }Ҵ5`}rNd-Qy\O`Ĉ\X@P/] yzh?Ԅyſj4ȬjPΪrQvu#^+N$B=G5C9 #oڴǀkn1/쏦$(! .-8>):=q=L 9*oO O2DktwCF /ӡ g9O__Mĥ$`apwqYl]z?S;q|.Lm2S5e#)aY53@YY:'c^Ƚ$=U2 Cp?.**2X y5k ?z6}gx]ZxgZ|Ԉ|b a-tOZj5D:@,0 4n?`LLн_C XQA6vȁof+ PUW]75I]2{,ҭ[?A}j&?Kd)mh7Qh6ƌc5 S @ @wf^ ~? u ~hgZ&do 2<[>BxSkx@mDԡXe JTܶ,"BX/_0UݰYg&A`6z~/*i?m?l2Sާ#&3׾.$}lNf{l+Q)l1/`h{X0 F0?v0Zg6Z8M[Eů]䫯 :yXX?\?hQ `s YD1.jsL Bk %` QC Z  4|>$nh<,ܡG$eCSU:Tz6*X-E k9ԠG*kX#(b˂@BVVVT^r/II ?Qcܳw >m0Aa| o]K{vg<|8k6^0n'%2#B^A3|C7Pʮ6DA.F{oD(:|z+}u Ym4Zm9HXEhXOmD1>z-̷:"àKm(+12^Te 1S v @k$<7W8WwI}# 0r~}ɫw0A's6Dtx8~4pO ǵ1 S!2c_?N̆m0!u0 7T)_"C (3Ѓ7к{/{=(9#sU"je#B7hLY) o*p3'}ia$QA#!蒀 4z M(+?<~]L c1X@ Aˈ;OԱ~1VyCCU?2vVʙTZY0`i$b=_y @?1=HG;+5Q5"E?Ԏ_UX4s$qɰM^n:FMm |,^.[^4TW$k'@x'Ogyە^AzM끩a0צwރOʫFQ)7dJ @%e`e{Y2AhcY\f+V;v>-L¾FL yau?0va@`n 4fe;OFR0=c1_9f@.N[yDEI3Ď2ȨaV /bmƈgnS噜?F~"jأfߣz]#TeAF}+\}?È3hxNwCț?"C+x7vN3 =~]Hjd,1]N0*)bz d/0_o+@O`]8E>C8:YE?LFbyߊNS4fgS@v?ZU-^{]pr'疕2ju¨ p^[f̜ uц u39]|rQL߱sa,zs~Ѕmo>#bF0!hl487;@M5b^ܳgϨ2X4`1@s %F%LqvD8Cgz(-PcWnO&@]0૿?1F>֯G @<1H@eS.-q^~#By -F2r_Kr_pT* לK7RK!7q'߸g%g@Z{&z'swA;y;ߵr'pKwNnUx-GQuU/2Զw]9szyp3~*w7hܬ r P1W+Nː PLŋ EKSgC-?M]*'f美GBE `E;-6:F.8MF.qu\H8fcg< GUo=vbG*bWj9s? "&@ì*96 q/Ve(=)TX4HVa@4wul(ͺ:n9)8kHH}t_@|2`2W9|}\bc"`rB[JGJʳ ADapXqgxsO1bP[M4e9&OK3C SW) 0R5WZbة(AuGhS,@~ i\- R?za>Áŋ26q'`;Ѱxe:`+ %!=ZoNk7n/$,h6VAi4L_eM5?MF$Scfo ޽{ED@=' eH8LA+-]';3jn 2׳lqN(|}.|O&bo}'?FLD`G 'Xe{q|$*SCGNT|ϯ޲a_XQW&cr%x$o\&\K֙SS@SַywpTV9wv+:mFFg 9o]yVJW5#~$F⁧minPY1 >S|} |,o >:a ,ཷR@mUc-o5;FCbɒLTd tqEy$x-k>S?`,4pnK y[.H"#4001D !B@:è?K2`ph32 y܉ _VwYU{uu=]"@`.j(z`sҨO#f@5SQ~E?;sFZLiH9q-`D3^ uܯ\3_Mq}jCQMUWql ~y RofTYupk~=PW+g;'W=QԵC]ݰ m|cG)yxSUb7:e7׳ʞ&yR`B0 9srWyq}wDI?xJ^ 7ޘv܍.G˅z88|) V-GC=q$B8 A N+15Msu8.4М,كZG|РAh3Ed$&г~Ͽ4> ĿvuY8MEcƏ&b?~8,  9$~o%%v 3Qc/r v;=qk_.- ,0JC=Yʷ#pdIHX"1{yÈ/Qk/yW}W;Þti@=*!WV_o%/wu͠\{=DP8κ?*wv7]p?䐸Ms}/~3Y6]h <a䩨 CZ.hӖm `y 4r~GUO|jO#hoLx?[.QZ8g{O'ܯ﹠A)qơ~.]I?Vh %d^0 tA9\MtJ_[r|ڣO / V6^]78 FF;Rkb$^s?ih8<^H2Wݛ\h :L_: !a)Dg;8F?tфuRSx :Kʱq|=?rG$p fjIϘ-_֮݀l݁=Μ=o9piiy+!ܚ0}OD'K1a* :?iϺ4w95YYY"; 2mP0X+1\6X$< ̓'~lRgVH? Q;FvmuÆ70brQbr/P3M6P``pR}-k@H-8h=˶iT^8o |י]F"j>8*9{tjʺ^lNjeWUW c>Tv?3$D׵U2, &.Pk[Ö'u pܸu =z[#f OCVYe"o$w`gY&4fߣ U `L%e\H`ʔ)eh1v\8i*> 4oBtJTzڴy+ڹ{/:p0:vl@v~&:|̴mYM^2PS Vd tHD24`mc" 2CHP F1cd뤁eČ Ih$dDϨ#?or=a$^ ^v@araT?쓃/ӧO&cǎuBssʇ|r#}LJ'4mٿi} 0 <&@>!?iʗU#0+I9 ȑ÷#7n4ٚ5E@c\F`&{W@cr^B.5ގ6y4ױ`7'#ͬ}9uOh+YK,xgvy#N hV=A}g+UMb W!$O2XnTP=RF_80Ŕi"if./Dp s[1++vMx"4l/E=@ IH,'QXLL@4JHr{7(xZ4k|\֨Ղ!4̬ 4}(?\FM ݋y0`WpP DPQ3X\w]6Z#bu#r@r=:E~  bSJVfmע³ NG-!<_7 ԓFkI4 b9aF׏5rޮQ`f:ƴ#)$ rePiDSnyo30AQX4of2a+DySgD' 3D;9S ¢hlhyB0/ cA"eR. |DċՂ!^}{EN lA֞cf8n!')0@@9c;n6(X[ELͬxm57e+EA%~l'A^8[(mFRŝoͫ36.)Nx9'|%<Kai_/[`G@r?3`"&@R)r ڕۈ)f ^[ڰ]}7^Ϝ;<| @`c {Uc#3EmؾljrT#ŏ"趑0$T{TAMt:3TR <݉r Cs},YtP,m_eZ] WKNWF록c(M28L0D\R?PPP#Vv3yc\4}4xnCмVyo^f? h.3LeiM(BCFFCZZ#F;$bєwھi$eS #buUR4H0yBXhYWK D hWLai1 6)bt,(3Oϗ $܇M)e[ʥB7~*bbjv"$raf25"p?@\5s6^hl 8Iܮ2O >Fj+}竉|%0ۗb^/8!m<j`kKrU }f|`]c$r>="e@_~qm2|C>^`iZŬ9C ߜFdHF/oKMmjb$ AVe! GCۣ}E4B z@̓{/jW:ID?UV8 ^j,Ё63PЇap5͂l7H <2RZ~o/_yMp5rs0`½#= wkx)116He+*p>r" mխ5Ъ']om)v:qzl4+qր_RTnjTgVEy8>^ğ <~}{QI]1/653X kŝ)Yf>';k/8m=l~} A|k{C>ef1gM\7$ ]/ K:E}& &pfBQ?zw](ΰ|,1V{,؟[@j 5k,(!%6N܄xnOf l򼿨 kӦ܇C/` R8.sіs5| kRi ۭ,@ O%$yl_dowuJP(FqFtp^ڐR%U)k2e^rހR}'3dWZwbenBSJs:^"&i#FLG;e@yUr q|h/p@?'{NxA߈Lĥp(,,1c,f0w"CEhw>s&h lT(g\c +LKo6?ʟ LzAMQWqBcǡY_Q{y&5@މs3 |0d|O4z(CU%Cѐi 9wۜ̓$jjn0`^0F@߬YCe0B#w݈ΌIU +M5it&@e5<>`V{=e`A?!#p0NCrp`(> )0;?Rz&@Xo"&r.,Fˑk{M0^%Cxȩ *f~$Sz1 6kI{Hh q|nd;ƀ:3 sZ`$%uSڗ395~Mʄ! խEx.o%m=mj<:O kdIe^[46WPߑ5:ܸPD{Ov;὏;8q"/ƍp_ )hHacuq{c!Y\+Єh& =h両h|0?o ,s[*VdƆǦ˽ #`Ci)`0dQ0 `zpA W9ӗi'#j2#)iiXaĿP?"Զ/Y04_p#vRTvh%֨M]Vp|.PH͘6t@%~ $Kk Y#2X/zJ;M5:T-0HfZ%#IhG2 '|O5^{}y"u5$s'zNlGCAXwg < ^Y飇"!#VtÈ@x o>Z4XZY+3B~ޔ V5$fG(OԌ^A_eDV 4լ! e,PffbUwk&ϸqu]t 0!H"Q0V}r3`#rrV~ToHuRa$U}`a 8)SpCp-9s>$wTtvlH8+=ԄvnaX+ IIrAeS<0vv3d y*my˝0#hKD5 B-ǀ>N#S{bf{(@M*y_syn#-(-` Fڶm(S~nٲ~wd궹?Mн#B@$L=o4p:q •nC pgOCyoX{w\4P :5Y35{NdڽV3| RV^@M9x3p~% d ߓߨi9yk.#Uȝ֬y`Zq>} c$rt{: !(G"T$*}G.8`fN3/Rn̙6p/$b#W_5f. Ji-jAK0 j" Z`>}M I2@]w o #6̼ٖ!iZв kշ$1U(|V}Y_l\LFblAmu1&@D"&Od-.``)>Btumȃ <x8tlu _4izTdq}0QW0C]w3X8ILmuvb`Eyߌ]mܢj~I湔e"mءDG+(5{JlM872| 0yz2pj&f˖-}];KMV!֏I!ڇoM3b@1 f % 3b@e1In0GBſ(}o&qSq,S-Hw$a*W(߿9ۛfew}I .FMFC'" g*`Z U3,Y!8 iB`X ~>P9XK7 ɸ}M\kW m^G+R¢_A?dR(ZEK 2-<4wZGM%6]vZj%a ITkHV~Nʳ Os:TS⾒&s aX",. d(X@K=zo1` 1 f Qby PְZdG31 f 0f( 3>/b߇bqQ|?sV+ kʦ!>5~߽;Z556'c*x]GX?#-o kX)L2$mH|ktw?p{Kg_|lxL#V h%fo4?k:7| Oֻ߀A ~V bSaZĘ,o3wzV VхZ~#Jo8iqv]|_  + {EPQ9sw|NQiV Mm1~z6a1X}3f=jb4OxN( OJ<5$OϵLqx IH@V׻YX-`x£`'Q{G 35_x/ăY}p” "'OR,{!??!Xi?:Ѫ=,y u1r,p;d|86 #B=YP9erXڹ])x#OIY72T w#Y^ߌ1@ H[$0oV;!#UCgtkbD:7w31 fCHK5i+w>}h^o0qDQ¢EO@z#e`mN[i3>}HKǢ=MevKIO/}c~{Q@o 6kj`(\ @JS\3p8NoEÍ;Z ƫ\sF XDR" ޽keCuHcSL1]LjCE^{WPPpFRe!Z7@F mpq@l,ob  k)ፗ ,"[ Râ>Cڂ=ɏs^[tit%0Cb@tV߳5`p L?3zrawpE >+νGPkmD Kokػug߹> /='~cmoԿ}MGՎ5u\_cd(dLT@}@Xh7[:lM '`}PcDއ<`}?5 FD]~o!. إ2'Ɍma$/<a`W0/##g&+uyr@T|[3o4iSz(?հau`&C!,sxP(f0t|C8"̃#VzMDBjF~[v{}ǚQo{G|Vټ BCDf 9Y5ūal/7D$-NC渾Gp)48>b b\Gy5{ĿzUC;pH,m]))Sbe0?{@) v' gC@Пcx$J컟p(1QW@P5@{6oڹ.⎵uضH{Zv} 4n7N ^xI>B+]D Q[zk/ 8,c@ho 0 [0-. # ̿vG}Q<!'+1ۭo1#ƴtEԩS ?1`)7xGfң";}p+-  O253iy_(!aX9['7]+A䧠ЗA/adXk]W|yyѮZ\W[f@v#a2оc^o 1 4@(h-KscsiKF#uVh-bQ dĉGONbRo B0Dq SC7:=]p>_q0Ad${CmD)@XW/06;w}ﱕՇx }=v 4n3) .d{ ZR\f6{o,ɜx[ Hs\ 4?ip_Q53ޢ.fϒ{77MI c̞;ꅷ-~FL4T&R+ h?|WcAO,m[ G$00n$cmFkQr^>T廥)W_9 @/0VFͧA\iMFL(*]ZīVVVKĀ`z3̋ȾʍS—T651mrp2^hLi*Qhϝ?{,?|y-$QGЛ /nām,u1BgCs\Q&S d;AJ1ߛFƒt#&-+? ۖf*tnz}ߺVoׯ T35g9]vSnl:a/[=>F :5@p*^[ ? n__n[U}m#% cnĀ˗ȇ룔/Wd_|@Л__r,851Q=hĹLyuY2N*m~7T :@ NZ0f8 E2[o"an~|exMGRovQfޏ% x _A8O$ "߈_>h (JK-_k73Ku 4Q2,=fFp yFfhx2pჽߑ\A6G KҖ?> a &8ޓ -Tep>"A ~>&*޽bĄI8gm q3B aT0BbSY=Y[^ifDmJv'OZ0mfl=-޾x+7t#Syϙ?'"eHD/wʟMN?zs9|{[ ']G45/A @B@ 0:% Gf--vY?66w _vЮ5jr]*s-twGZ4Ytf̜a>[[=Z& P5opK fsYsӠ)#gxE/@֕E{GD@ٻ1@k]@Pl;x"?D T_}_6 XYZx[ / m/ii )r`UBK$ڍ %/1c mm6C1{x1i~|‚[Mo,o[=;/GS'0?ߚpϮꀿ/<:1j"(%HXhsq~?(BCXCr\qS>_9GoA-x\ j*],\m u;&ͥF4s WK#yq>=Ah[oӬ55@Wb$`y fg[>SMzǺ;nFo7zw_`34'|?(^߮ LhMxepToDޱ&gթf&OLzo+am%6ϛl(R͸gFmss%lFZF3td0[ #Xi{#͘&-hWH]Yzs v|ޢR[yr]/IF.c*qd{6nU@+PLYeʳ@*sNT_&f_wqC" bI?dI>v"Hi&ys Eٍ!&372V=jFJ>7x1I{D(qNٱΛK%4d1F7@-4yIg.q'֏6ٺu/϶b@E\/⟰^*d"t&pu)nk&LH; @m 7giَf#?=C`t ϯ<\?M lfpYo3w,. h4t^=Fj,m5ΜVtЎ6]jp>0?x N_^|͒ )_0&Zƒ8J*zVᶸPh.\j28 ߛOrVr;N0K0g4fg֮k x9&~%zy- x-fΙix,Ok49P$e`Kc -<zvD}0фYVqT1<sGl]v@ho ZTd;XЎb@#TNJ3?f`jXHk70n?1 >sϘn\@d ^z`4^2Yat2@. f% D+E 6xg7y#BS& TI/_Z1ʳkʥ;S7E>nB3wH09i/.}/ɠ!X!1!7. 0Q_%Ss]Kh(iMos- hӀ2o<YGܲSi Qs l`üE Շn ,-?y,N!CF qu 2 T>RwHXOme9(t z,*.6Ħ7q]Qt Ȉ^hǶ5 3g 3O#py6%F$2FCy-8^a/MӘ5ұ&@b0*òrs0Z_  ~9&z.EŤ9UhFї-c.D _2rt7Kq1kcӎг1V?Қ,q\}xlҒKoOjhYpa ќɓFws 0[` M#jB { >*uxODbj PZSnĀ^4&^J1";A$(О>o[ʽN]4R}c~庤cV>+ČGZ0[,!m(4uF x-zk@^yKeyΨ?K>x}p*bmD !fu*@ys:@hrhHp&@cI;]vx~7bGlYmK6B@U1nM`'w,39ګYp1C/)z+? rMs ɒ,Qs(0NHaoa)~Џر-!bӗx͢ }Eߤl Rs]uf'\;U|YNi ,fm=x̚|XHk^@ڤlȜs 1wp}wύEKE@u"$,&L,$4*h2=|Cp5EqwaF:B { 5^GϢ ʜFmynuu(B x VȾ }:՛#5VqSZ疎9)iuk8 _shtzQ6y% Zύۖ1Lv,9h6ڄws80"e m6/~tte%_ku*l܇ TaĶ4B x @{`a;K&9?ŰBӑW:(XHk|5:ޜ)7я2@Fuy-z܊`6Cjʒ8wʟAq*@--OG&.LgcüOA`xr> jFNQumj =4S>S/vMͥFF(ڧdU8=oĤGZ5"v?Nn*5yz t5/khXH4e03x?F--oG'[%Lh{C=~#3'cO j&@mAryͧ4el-c.0dh/1ɝzuiF8}´}bNШC5E1oMp`ނp13q[b6Za~MFBϯ̜ys@00 cY1p q3* 5& xI-+j%xDa׺7>#HXL_VRh<s2$c$@hs ơO2ŏKH Z|h,xFC^iMp`zY3Ξ;ۖĥxJFoUx3nKZk"`Y2q3* -ni%oA)?01pyX*&޵/ă@qYsS~^аaYSYf@hs@ro2 ?Ŀɴ㲞x7V&OlXlpٿ&Mb2*7,k@~[[6eOr&۷iĸR(=m$h dw۵=ā{$XGxOP.ߡ<`xHח\x[ PNfn\O$[@+ J H=q nb({5i-^- )@akIÌ aٝ] -"ͮ x᱕8f0 qr %.pK 8b@/K-sA_j76\CK7N3 m P뒓  ㏴vŋ< :'_= l&)5Ȭٱۖsecjx3f+z/%&p7o(H]\ Km7q?>Ytx+(y#D oF Py @ho4B/+n{_p@_ThOE)ǎYW23?M @1fuI>N9( 0J̒eK:McXryXF٣Ͳ4V盠=^,d)n7bbQxyrp۪::^O ]@H`r 09-JQE{)ȡ|t_*X8m/y7ɓq781߬+L[`UղhFb3ܮ]x!<[=j& rHL@sFϚkmâ1q؉Yw"B¿W'x EA£[Vp滫011  R<@#!@j S;?F {0 z7oAq|/۩)+ԈbhCGicIFphCs\ה$P̛?`hf 3G*r0p*SMeJG汦OeJ+hʿKgomY;Q֕8=X2P`_=|َ}974 a 4{R✒QSl+. -Tqwi{ =LJxJ#V {ޥ{|#=SG8yJx/@ux/7N3:_XpZޱb2+.{H"ų^/ q-WwQC1?U@;X*u6k>q@ ;CazGqr4}Ic{IRc2M4T  @<1@-d1t<#=X2 ‹QrW=Y F_Jad  C`@3+M2h+Su[B>(r#h; * A 'ziY`2L cuEG@׿d^|lU-w!l_]/Ă@YKZIj~0nSuL4`iƢH V(KI3m^}2@0XfhĀ^YS(r4hu0! %8' h,k5xX,CBoiy"}p4# aĽzF*)5{q4ln-HLԡo }})F@ 7kCc6T>CTV4 3USn&gϝU8;/tcm ϳb@`+&@qxaS/c 0HM{ ҀPq>@hoAb1<|Z3&ҔrVſ~ҿ\@K v߮a7-+KSy8 @00s eq' 1@x<pN@`EsyyFn a2 DOx>(p>v]%*T{iЋx 1Z'xZ+Jdl_'YW72u6pĨ4rG00]%5 NkX6^vuE~c UPmG.ಕFcDz5 +qxBnF~6@8_ [ .kLk@``蕮swF/7 %&%' \+bhXPV\ 6e'/):XffEBd=:@u,2xjf(;_hӼMwFQԡW:UF |?V E\&3'v?m` g&@ vX?-Hz$`غоM u12 @|}WkFGo"2H]aZvyl4I\#;ƂZ.g'*^sO'W\ӨmHE8Hq-; m=*Ra_"LDUvҴӿӪxDFbPe>ý,嶼7Jm 5i)oiyPL.ˇݻ1  L R`=َW+sNk *f|W1>B5POe|Ɓo*0bQvpz"#6$yh܀^.cQsQns "5.hԝӀocu.ԡ\e};X34bseB3z{ex6sH \ " "M &ErsWep L |f?^^g*x!~USv@hcA2fQGN V]YVR='_jDFmǫ-Li(S\ӫZsr;\PF@x DGTӴ=!QpHm(O,:iW|=BAyތ7Zu_9Ŋ`m}.ö4= uܘ x 3+xùk>6BeZ|@ 2*þgqx_cq³[8 b Fk @o#Nn*xŨ xuSpOc$gd=OYϺ߭+k jx%[P|Fo1bdi _9 40#P^sz[U"y"zB3"8$C1WS١7_M1]1}6aϚ{ nX-oq'˫,M߾!khiU" gvCAPdHJ?aj_n0νB\sh܎}hEFTQ8-X:ސ޴߂ПWoJتA"E"zRu;UTKzF r2=66cbP~" ݓog3;]b~ByyѽFABiy#) p؟2E@@hD'- ,g1SzlDL@dNϚ $|)awŪq:k.J&#DטF*N Uy2Jәz}w蓬u7!,P0g7e^Veh]aS& b敷 %VX?Q,&@P,PFkqj|S1$b7}mMgͰtaqV|_<4Ay 5xF~Nfx 8FyVr\+'4dž$W.-MI-w;uAJ]S, ƜT =Zʌ}u)(?)o=Yb`ڕ`,ZA(SoT~sW<)_}ĶgͰ|qfH)Ş@F  J 7}a4w\C{d95Q\dV8iL&@i8Z!?PPπP'T4KZ@cYH)Idiǎ[;\FËT|ٍ/;K7p)osh]GP>~:_i :1xMO߅uH@ԟ5* *3y=@m ^Agz[yM_ a4gGcأaLI^y8WIWZ~L22JB 8w'K @ z@]HS+\]tzW 1DQs*n at CY Z-Iʘv?1Q=孓io'khbW͎5~-p"@h}d [1? NYVrVua/RSr}Ne1_zw (thIF% q:x w#Nu]ԥaxy?!pP"-M7at meO 7?%v;^bNWi#HD`灸x^0ٵU/(a4/ǑRp APu\SSwǞŝ)`d;ƉLw0gA]RTxJ=RAE3UZ@/ӌM:k !^@QZȫS 3O`'NH =(tbsI$: iLB\W+] /4&}v?10$ Ub?#Ēwc|/(a4o}oax1XU\LN*sLq`Sv@hD?IR3K@Y}y,^^EiV^{ݸ]}Qʑ:s~j]EZʲ9$fj:{{yʼn <qAOD%5L+[ DϖoGP@ @$eq >]X߆sJ/&@cY3$1x8Q/j&<`(, ŽѻflRy"4@˂%?c|Js]_(ЉzaD9#j~n/_<$-ߔ!}$"( C@T-_]] y|U" a05(,|(uS7%  $;N @$oy|?dFd_ſ`2*,?oկqz- *1{BOw?{o  &YAY BVrm,km'@L"bTFx=%oiyXٽq w+0g׺q?x?-S0$nhkʰ\Wpiz$@iB+(m{ħ>Y=Ž/8{qFSY+fjy_J&~ $?[[ =8 | t#l zeJ܆PJ@ wrPpL  @;q=|e!!^!9ʿ4ZE*˳;ꝑ0k4JCs\WOYRc)Gruy>i, VcO_QJ=@h?q|2G &1" Gx7.pJ @h@+r&l%FPbl HrrrHcʇ],u!XL @'7e짩; ?<( .J#dxO[Cz-L.+C%~)X$X[U_x2exv?1PIQM H_ V2p*q \9 z( j{;$AϛE?G &1T YInA$E;B @`0$q~Nn4,fh6 "ޗ ȟ)g7y=O@4fl+5?PZ\_!rUbuTq[]RvJP!jNz.KKZ6XKODP ݓgOx6 RៅJ+&@YdJAY8E-W 嘜1_ߎEGb,LXY@!<ϊ:o/chiH)Cw  evYG&o305$^ſe0( 2'޾y6 R<B @` }MDB,s,(a5 e%I;z:/Q2{i{t)r뾬$,/xLשaʺt6 /iK[J[R |MZB%1j.hK]I9vc`3& uRIv:闷p-o&DuEաm   @\vN#Ә ]D)\'X.@EŤ<%d\@G8:W[`X %{j SǛN`0VVJRB6F{@[),v>}쇴1o0?y 6 $bV`~ x?$R^C1˯&N̗] @ǔoT0\HL6f$@iYxD舅S>nR,͗'N;DOǪ pd;2BKqhu|3uWBnBkns,0䗛)8;A'  ed$C!o7(\ q~B|obvc`3& L[ -܅xxpߦ:au QMa bڑBves` l.X p1 Ng.3Ajx⑂bP04?aV*_\ 팹]3*? x8(mqO@hĸ~v9~yfLl0{tXUŬSm= F,#x0`7va&!%2M?Q2B5YǕ\yP{C'Lin_$ۋ&I JӋraDldz`h{W*b~^QR[YsCli;6cbh`L["M [WrP/@XU?^ D6,79> ˆM IŽa8\A|9q|@oY|Z@y* {j ܄ݮ+O@1@7hLglǶU|VI){3y q͘6+K5R[ E:^ jO@" PnGcx+WU=jҌ7I 1 c+}}.:ݗ 4H45^(ÏYռ:Lu:w{/ԫpT~&cy\ |^׵ 󨄕u_.-jVw lĶ[4ex3 l_;cʚXAKǣF@ZI4JPJ t_ qp厖/X%3')13 Z(Cf^{**"Q`nn?|2/-֝ cAmU^^9@@Co/،m yg`8`o} O;>#7ڧ0 ~pHǫ&@ I,wR;i6@IC[MM w}Y H0~yW0Ң?D!RYRL#Jӑ4.;5_X=%&)5xhׯaJe&1ſg+xWC+s]$K ~VDSqk[k/1,+?Sb Q p'J) YkK);ɬ NVԂ5xQܮ,weJl. ?VX#"K\ܗ*j)7?] "ǎ5uV'&@ u)81uujK@U^e)98eb*etP-`BqQU5xQ*0U15ճ4?^DSx;k|8A?EOj7o'Pџیm@渤>x =@ #O!po*0wIQڰ'w*A|9炰?Hd# ս[FPY^܀# t!w:|N)K>ɔ  ~qz?+Ћ]Q9C`J{IM%iHaHЌP 1wZ_ ũ?г,c^SG,zKC+Lˮ+ofn,S)cu1 g@CKAy H+"2/GO3K D: ǐ~Ne f$w@?dIQ47mS$`vzz*wmDq]Yx6i${& س! ~D W=9z3WAX$ @(1^C8 @9L$0ĸAi2'(g9/.* -$Eѿ3O]c FA0V=tAgTMhlj Qe:N+08C_0EguEwTFSxaP+hK^:وs@h--.,k*t& Ɯ+.saw(lg/˱/piW^gFQ`Y_Oo$+@cIpJSYj`9u3pƱ}w]EEAŰ~CvU^ 8OxX:3m_;okr2m" uex6\ yb> [WT+"&V _ޟ|-'ؾ|aevgX 7& "JIX\?<Xi?Dq X\HǸW`7ƕ\*ad4 ʔl. XN*X]يh ;auƅ M\Ą!s#v.p־URTjK}82u5ew7eiړgx64F6~[ ZwOͩ!Bk%ЌQxi`^5%8aCiClce{»XV2ubK1t\  VTFcb /-S7q~^xh_ۨ~{7gcÌ=ˀ{78F{M#?ojs]=y VNo;sm}"\!g/o~zn9awc$8G \胢cq$ ig0l*Xޤ LƈV[xnrRu~*5xxsYYFzS8T$h'Ͷ&uzb S ASi/#QP.Ww löL @FC V0= aGo~\:@$6p~<;=A=ƑwHI[5x?<L|}#Γݷ%%?՗38߃7_FvO?JDrU~3K;ElH~iy/1^>Ek| $]`Be?\1Oڸ* (Fp]aJ 5xxeU(Sl1 Z0pz7ſ`+r)/؈aXg H<н@@a@G0 ct qyq_# (.8+4Hudh?K Cӥ$|َ9%,J=f{|Ұgo˳p !(¸ջ"-_|؇k&B?X_r]i$-Ʃ$SR2%iuPNVu3pfoc~"%oo{)Bc`4h7֤<>릥0kX0ٮ1^:YF ʮ O[1 {$  $;@ ËRFs:qy$cbϩ>C d'$K+v;:_HK#2&/y9ib-׈.QSކ@Aԃg4xxehih](Zxr:0:|(d¨Vcq;USs~Z@>Y[#A6/.>&$ X!Q qM4"`HȽ@.i'ptWcIhd X1J2-S6 s3Kaz@ 渾Ҁ'wK LVceK;˯a,Jo [ ^]t bߠc~Xfg"T:%G`6Ϧ)S*NA@f|e]npoE8Y|I̧0_^ V u.`18*S2[2JEL4sNFhkbъzu (kXʘw} cy  R"ӯaf@ fc ٺ655,D,(8vl-{jg>l.h4299ǐ_ޖ ~BrϽMi{5c)EĎ%P^,<,Wz`s?`B/ďoڿ%7̄~ﺃGV2}e7#8@$.>xw)=Pkaf~8 n_wĆ@j)_h*r |yfTIzq@ebp+h޽7z5{66}ބ ~Vf)5wU`EF+WY8Q ƾ3QE]J@s[@՝K 89kkY w'Vi#Ƌd4 ݁A}@ܟ _ |d=f…n{o6k,VWTi-7a>_B 跎q9ӹm>qp+mVZX*rJ0EUbEQ2d O  A(E`غ៪O!\kP 3#z3w$< re5O\l Jr{1YV_Y}Yy 6}~*,⁡s~d!Iҥ'x[;oD.dY33[(bdJ?T^M0(N^]0 ?PgZ(a1(iH7 rvOw((FϋP%kky0엋@ʫ,7GvxK^ZxF+j}[oʏ 4F]J>3k)b|Je?[ɫ.镵?dD [&N5& 0\ύ39~X]޽ x 6jahq9*9?bN .gxQ􊿃j[eO?"pfe_L/V ^o\cy O..^jQ@ < a}i8]!-+{~"' +(^ k1@"F.n[c!&(Xވ?ul!0ʾ]40, pKAѾ}B 2?FU冿[B%GAE>%E@%8fLjܿݐY]m{ڰȣ7뽟_۟P g 2׀w 'o ǓWF0\k pI͏I<ǯk%Y^IiVK> zMU@@G܄J)зÊ>{]8lOG6j:ŻV_Xq}X%?*e-s`(+l|C-cˤ xbYE@ &}ӯi u!^![þQ?UugoBB) 'FSC1sg$mUT\_ܶ5M@?kM}[oT>"A5y[ئo-q&5}]kQ}+{sIA`>@i 6jx៺o8㺼:Eqñ52=~ІUsG/q!q3(b@ eiRoxe0ijMznM?خq^}ƾ-#K pٳ@ p | xO|_uG]~Rq{3S*'op| #͋/`:̆Np&L= ?(?Pp'(}So>|DER*.=Sy-[ my\P_ۏJpI퍺>k g=sHA`{ywa @>Aliߏ) Q6ѯ2=. <, \e'B>)@+^"QD CU`XݔOvN[FK;TqHA1a`Ž,rn;Jεxp<vdr-=`p-,avb&>yoB^xy}ZPmDVp7oIþ VKw_w-.`}?, 'wzCV.fo;x;M9=eDUX(jn;8oQ -ލC 2wKmK wE0@DZ3%`H7; LOS|_p;I\߆xʾ-ѝcgW癹U}lSu`۝ ܅Q\NE @ D{|PT.5w@>s ~aҬˢUj k1* 4>F^Ge_U- >-J2JKYf/0Wן+XJ@CSYWg%Eg J |GBޯu;_F^M}ZPZq PMQ7C[oqU+X:j@x`0_.՞g8/!7Sj͠X' jpkBs/>W 4^kZ[C=j|rx_\{#}l6HYY/E % 8 w? /20nGx(q\d_ 8w}fOǨIBWq5e_\T gw%8xfy:O;zewQ5_?,` DC_o :?֎5y~!Έ>?V^` -ǡxϯ?Bȿ xybY%EN=!@w mP\v P1`+휴^O|)]FIѝ=oj)9X@{b*iײZC}+X? @X[)Bv9`}QW\0감uDuY`a[&eIr wtHg+_JcӤ}#綷 2-8 |D%@ j#wʥ& @ ?ƎfvH}kDu^P`N;_6GS~e(E_ OpyN!:v-pV%Rzw}~~oG?,/\ ;xp< " ,t !`_ӄ Зk# .EiIhO~xqdG ?<@̯[`?/Ϸywvħ9>v.Km0 /Mv/%/ܪwYC 1۞:xo*\d.Nj{Lap\ i6Mں7vڧ;V~ s@txqMC+MT!fuY޲lĚ,Bm_qVFZ.u2E}~^:XxW+ʾIi'OL(=P_CWc˒ cҁmԛ͚Yy+,ҾÝ<2:@ fc[x}D~-4V=rWs <~` k~jEUxiUPʿfQttyt`eW{lRˬa0[ Rԙ 3@h5}S+l_xvU}kiu+?,5tbutxI[^ |rx;tHs @)ĝ>{F^Ge_Q-ϻa ]t6?xuz ߐm?|[oR.{ UiҼU=U!SXmiaRˢ,N<^^Gv-&{ }hɿ?gfK7ZdJGe8M$Oe6Nn{@Cz\M,t$ǟ:ܫ0nD#(>{B7"?2(-ƈa] KX下-m\li 4}Q_?.}_z,SتX~IZv-m:Q_ f0W6}AI|@0BuNygk{ڣVĪ,tC3Sw;奐{ z4k Q?="? (joP?rV)3. Q 2bz=>6Z',ߍ ={^>lu|u,Kd0صY(Hi|G(1#_$,r:p%6?"xq>+/αHfIi K %Ya\PQ=bmxn"j%Yvπ}qD-kڸ12Xiu*t}{&q/W:bnQ;PˬilOcydfk.C%{eI%B6x`hşu),O"혡}a  2QJ0灛@x?R ^) xe}ZPW`p4gj1>K>oTWCMqSitiٕXVP[r9Nޯ6_M3 `zbLcrhH j?ˣc~zO"mfk'3?y;e^qx}s&ٻ `lES@ȾFRp{ 6m =zʾxV-7#@ 21u.2gpŻgkZ̪4%X22[#+Uq"opB_.ra>OBDZmAaׁ[y5|]q]z)3S뭶/L/!=#u;a xV B@ !/<;s@`U|+?d4# RiVXkQ]uxwRf@}bRPV:N~~0]sI?2j374D7U |'(mJ,`~O׵@џRSaɤ> X+=a*]9|_"u 6=}T-`jU2 a B]v_4j}J : Lʝ}Gwc;xfsMW>i=9w7|=20c //a%Ώ6R04sЂ!w?o-VtbMtlEۖj>Y{D@.'qn[MyK?m @@c@@ICaTRk%P`|O# -8FQJB[H8;"?R,@i_TOh$|.%{5.LՐuYOL7QLhyiOb%ZYk4?{Z\Rm{_UgercMJp4cТvOro|jcVf`#HVZ K3lSW{,Ҧ)mU@ vt^eְRGHvI `ZX |NĿ:y?6p?K{x+(bZo-&Gpes}fC'jOǧ$ۓ`L֔;<,`lw۬w}Q_]fCMQ6Wt7@=:?w+Y{ q+*@A"8Ou*7֊*^/ F=@N'Gm籒SqgQ_I)4Z8WP/](/矴kQQoo+ƷwHb1^ܒIqi)_6S8a߮Wfwr]tˊ/6{$"m!(fK6nʚ{f2նTqb?.˹_@h}sT'_~dQ^߼ y驻-Ҷii;윑޹^Iufo#%ȑIؚ$r|]29.}8o%Yɜ9d2O.WG LEd  rtYH#CɡI} G΍qhnz,{"=}*`|=yksjR°$p?nEhӏ ]S5ί sX.R}7 ȹmY5: b-6bv[߯FQp+zC'CXHO.(((⾖,KS١:/b kO:We_Ԩp QP!Ӯw/KyRμ9^{1,M_dޝ. KgkY\c5Ɔ2:V maTU5_SnAS_.ߡ3 Tۖ3$ ,L ` SN eN@xűXσxk{ME2@} 6?kNhuRwp~䃻Qm@c3 shK1' DUb^M0z[jZ<=}7wǪ$ap6(|FXOunVZo3kTWZyӘ{*׆kCƒ=X0#8ג[l.t*P~%];܏ñh/W};V0Wj3x WTF,r*Ayvm=ƅ(98_UJX؟\{ EO*Wq/[0M)So0"(ArI°^+;]N -nR 9+g&MKgU97F:{XVc xsPZx܃ sװsi~,j>Nc%4mOɿr_ro*ȿS( -83^g۫* i>.%Yض7qꯤ*7|F;? |8Kj^/I8ӜQڍu,G+cR?A5ڶUkSօ/S;oSj;;X{[r)Kf -/BYZ+B {0mpιO%̟\g<)xs=s!:Р5("%!;ʿ7@GAl`pb_nVϽG  _o`v8ʾH/V pIk9sXP^=X+@+,8#Zwց-69ƚ|=X-UvN#8E<4geD/Xk$5VsGvl bD4~)?sbo@bNJ'VgIdHm`\}|u8c%4(v@Oeù߷oϓ 8{,X$^ְ{0C/U܉C|%Yc`EXJIwh*ENעKހa}ѧKEL]ƲB {?spv[ۓӛ)(L Bx^R7X:-v}BBDІw%pp= 3p QlR@*sm_p/>W郫k}~lM@ C`~@{PNSD"[D ""Dz@M C Qj2MӶq!Nm@tˊQݞUɃ uNS4FE ]z% 𾱇:RM@ H5z& T{,9T:WqӒlǪG n- N:vlM_Kغ>֯VO^3@b{Ckއ{sL0;>q^cA<x*}IlZVB `cib @`#>;Zґ ZҾВg=ϋ)O.t ҥ'KmE7ߗR(R v~9av-eEe3g@G>XkbNO%eYښ1} V|G({}twx jS;`fBx˼^̪KTa {f4&d0>T,+!|xYaR,OnX2>oeͱ[P&{g'JO4'I'KFHJҤ҈tib]toT)6֎M}j,]3 %Qޣu k;ƆuPe#^[ V8? [~m-T}pr@s+>lV6=y_^e?T0r0@az'UlKsbT^0{wujTAҤB ="M@#[g\ؖR,z0S7o eA?dd4,]/xEiTi4_ߗbPkOC?Ѿ'G?8/l;LY,-sW-ׁ@Ok,e>xu{Sl,MZ$f"07HbhI;K|Px v~^_*\Dݼ~-pã=PFw!R"`};FN?Ae{wvqܱNmP}@E1@Xa{P<{}ts5=hdN/V%Q""S϶i, ->,% 9[iH~s{ʿb$kuNMRqVip/ЧE'նLc1O}U,MJH ?=/O+e8*' Si]Wgl!}ϴ]0 ";Liy0VVc)ˍY1I _"cZiH}%.A]|(J%KHxX0/ٗ, _] x ©Ww{Ve m~8~ʉ_C9Ѿ'GNylY{uo`TIj穯=,Ma؎2n`^ XtVLs~k&- B5Bq̾_xC}R^xjB kh5Jȷ f)N?e+=^[ա pj?U+hk};;չ+>l/mBw]. WG;|o`HvY#}:W #ɋujL ]K-o9ӒOKo/>F7MHtZYCS}s݆/55g$pR:"`cD>@XO){.Q,H T@5<ڹ%+>j(YHw/(et@U6;qF¡t32,}v7tRx3ZH9(}e?)ρjEPSKtĤnn7^ Iy@-&28v0bW,h06Ȗ4%$_ P策jhIESz4O^B(({/j pj'y`]k+@S%j?|?Su{EG)΁q:%V,N nHRhȗ #zFhq<RgB @+| ?VmaBr^_[iv6^ Qg?,v)v"`jpj)c`[$Ajph?UPVl̇2⣶Σk$}y_>kH9Pr#;|xK8O2_`gXR D̎5xݿ`{/)PLh}|-,+rJ4 gf>?(zIu#JJپMϞ{ &QvR @o(DWN,+`PNa_D]b(~xrzrOud+e ]gD*vK6oŝ%i킊i]@(e]䢊=l#oύ ό-K Zx_pfg> 7ђ/ʏi~²9vWA;bO .$`(e©lMŗx5˰Tw@Xs``טm=ʲK7q_ `%eɞ2kطqO;dzlfq^tkQXe +)Gä "U1M\ 0׳pŅ=J\l.<tfE/lK=-wF08]zav[N Zx_za0.o{ "{N'e% Q,b4S5t5[K=TறUPq hB9Β]C%O'-./ ҬVçr׀N,s`,iTǺzi(S8?2609גH\}8C'/,P}|cKLkHs Fpu"ȏV8EUO=m *-kOk#+> `B3(dw Pu5@yy8@0`Pdaf|n~ZSEzy`+X_T fTn\,_bfSSU n!/ޓ$ ] v?33@h}QfR :w rȉaSF[ߣ |'jU!Pkobˆ,qbB(h쓵s30 ~4g0`**'ɶC)xKֱUB @`6omObU\]|yש緦IЮ?wLWƋn<;=r@h}((e^W9'v?)P[Qj Vh۪S`U,ϻTDx ;ʲ¾ @j)d_~.4Q2&|[D\tˌV-Vc% 6%Ž,rn;JεpŽLoǰ卖4+ȓvWrSG%ͽg?<WB FȧYOSAP!eo  CWFR4!EfowV+ٻEV|8KP@;3Eٹ~ rz\:%hh-^">vIlNt{Px7@h}@onOaa`_A4otv (wOm<ނ ֹY 5J)_`K2hlE;@`yv M;@z tV<ӡwAd%@X8?E9ΟnrTvwֹtԪx˗N 6b &=O*J-p!J3 yz MTZ)3'0C@h}ݲ(WPJ/ JS; /eZYJ)VܵA^x~yWv?"?uvy}M~+т[簄SS0r;@VHssa|(4Ђ+}c5?7p˅˗J<-]j]~y;>=,vLIx ~Y`P?A`|@pEp4sl#@XQk1&(?{wW2ee.L@X8r!.ܿ|꼈т[L*e!.;b.TnT')kk`~5|rA&wI{ffwŒK"^Q6QJ/#T E+eoR5A 7 !($>uNߓwy}AB_q}ʍL z~Fvƺ*7=hXBi\+i+ɲ} ~ 2"e @h-B뻰p-?s+ȓ6渌MiO Jcb_-cZ%^J X OU aSA/Peۯ]"V%C0Vi? 3 @}:K}sܯ9D \BEr.TP)\˒|?XY/Bsq'SdFK2=K3\R{g'Jzqև}sogF i`<ߨ¾w v_AVk kK: VVx`FiVޝ"{( ;O)s@~^ UR].wK0GF*g7rlJ{K򶴇 }yѷN ^βs<)Sl'YDuRBނn6w iinf:Щ*aTwckO!"rA7|1{BZiVwI[]3n?%XA1 B & ?n~'g*WV ]0-89R|~Kt*or{7⮝ ??̽("G8 eTi./*;K\yIcyz^Z@gK$wt*A+e;|Ěo_8=s-ْ?:tpE:8i+@XU?_+.l?Jp\glI\>/g4_-40JRܶ^NP!/9+ phs.uk)t~#5f⩭ !@:e p(&?҆%ZK#‚08)S+E@A8LIcoI7v!"0 XwX]؍X7c'ϼW'm;e|NU$o,^+OZE-_oWıemkTD)>G(}Av^rk'řo#  ѓ.<ڥ_ʲÎ5}!{uKZuӤ:]H@V)]^y6=k0٤`R?2j"*~\]"\@Y hߣ!쟧<ɋ85w`ZMe,]ޛi",X*z5(us'1@2w pß[uV#ґeNS݉wYm%mx ήQ卖4->P cTo~HXƎucO=${J(WkYV|aⳅo icT8O. @XXrׇh@;VЧ֗87x0-f1[rb+@o)ɉ."}F /fɽ ZPHu2UEĈ8|}i>JkZlS-Кw!rlh?;FK-i\].wIݣgXndJYmv`2?r7M"u 0pp~V|0֟S )Zr+Py!@AjE,p-CJ{dEk.-ЁN1<T#cKx))[nAo|uL-K2lRpE:}8"$IiqZ0Fy}M,%՞s+hcW5ZLҨoNB {^dRE #_ XD)> iHO`R4/ߩ6 T 6 `/Q!tOAE. /@Aj4gR3>޲n#zK) ̡m/Y0Ȥ LicKLq_Qe=i '@Y :oCO7'ɹK-xzA&wqxkY-ֲ%#S#]!ܪ:Eڂȝa풱R|&W(?ePXPf {Wu6"B4hyb'Lہr -9x˺)KkRܦN2@e /W\6@ 7/S)"0ˣY ?8秵--ii?ltzC,W pjkpxz@|[=ے)%A^ xxT) AbfTO)==kcLUxC`l6(嬏U9a+&F`r:΅)(B-@J- k;GN x ьKi]xM o=]/FGxXBcןZ7ൕ^8mǩM9䆜~y/`liP-{!"0YH޲/ztxq҂c6{}u \;3 ?:muk?N.W_澡-qRvvψcWĵPo`J.E@ ?+޶u{reSK4,Y_+"ŠIbjC8AGZE0n;jhys}GHviU @:y6 pc1Meɿ4\X۬qm VLjN,I<VhbS 2= 綸žI^]")T?sP/aک៱J2261)~f@YvbbR[;38}4sșQ½sh VŸxQ4Uiuaj],8y*@M 'ɏH!r4D`ۖǬ6?6&8sX-S-S3 VhfW=*}p$Ǣ'8@}{0ST0?W+" U?Rx22e9> `k1@'%Y+&HV `>z-X: (D ΡerY-u_w#X.;'E q6YieI(? !sൕ~qKF 'Li;쒞 M[K&m/ݛMڪ"D;6q¨aiRxf2V.Of /eM8npY@ίʍ3@pVƕ'5xoS.uH*qTŪ1jk?TS$HVypzeUy9"m~ _47jY[Ox.x>}b\ƓxTF8sŠYS" )dl;mK'  ޒ%Ya?+w&e[XtN\|OOp7r?,qi $&VYDqe+?ȸi,Ok"G!a&"0smYϷdo,ط5[:<^`NlFZY[_WҜ^J9474G-@b==S058!+E Z&Pn2ޏs3=)djuJ5 *r{e[[cmy} {=JV %;F/[eToSu [f gZˤH ?~m#R-%7pϙmL՟Vdj ]r(ynv4eNn6\C=ZB<pi\>RoNl!"`@}sPZpORNJ H!cۛ(~X}.uN C[PK>}Mt^AWpwT;D -OyEflE ؐ\|WIBoU|*dUUcاj#mt$w5|84~ -py/z23S/K۔X.5y*{Gm|Fv~R)E<yW%@X1(KM:/^jUCB{@yvQ½caRU*-76|mr}Ѣʉ!vs B!qF7@u,@RI{mml!6WeIЪ@o}lcei'>qKP <{w<X r"_YC_uv*/aSZܶ \ⶭ==!dlJ; >O@q$)0R,}{M:/Phޣ}2kj=po &'ou؊t8[Yu4'ֆ<#pw'Iyu?uI7 Gi` =)'Y#gJā əҶ(c B/xu8ȩP#Hd^0m.1w/m$deX]`]ǿݔr{}*O}мٸA-"_+r?+. =(>EGw9oTFN4C%e[7|^L5p@0kkq[@(1F 'Ƕ<_U+]TrcE/oC`so,MUM+d|X<:` nk{z6u[)Y!\hqZϊLU&0/}X"ٜn8]o<ҽ?7"۲mɦ{Enc X`0^ k)$!@* IH ٻ{wmwMMYmtF:GЌ}gdmjh[!~#vh4Q^>7w$1_?-pys"xugK6fD[49/ ֨+FVqjrBܺٱn̝˚Q?QKӣybjΊU# Lahc,)uP-dt: d@n+Ju{dW٨&sC&\)##!3'&tEBz@bt;Tol m@8Zŷ (Ig8 WDQR( `77hȀn00*OwknB>p@ s)wa(p2G5vr $ zV6Kh@oT|b -NSmVA=wYQ>[r''\ {F5#Rb fFS TB*E2S"09 AkM!;ACs*_ Mu^wY`kdŹrZdqF `IA(Ka].#mOpD27 gocD]I7ސYΛW zI'^Yo_o5 p1vuEh^W:sSYڛ_Kt ޖbxlo!v6!r;BWp}[Nkf0s8\!m)ak ( =?.a)~$:dbqOUJgFӜ8R1| y) `6m%ݞ˛7Y?Zb߽&@chcq N .u5Y`Mv޿-9!Epj{{K0CGݻe@2Z͇)jD5|4c{rek8* 8. R/ IX8m ewAsu/N>!e Q\=^@xWPCG)ﷀƝE&7 O1`ģV pT P D1@1@1 bɏ/DjozH@oq>e7 #{(SӲOfAc\ϼ=Y17W払D{c?g.W3/L;Cc@ KDsYR1٥s5#Z׼ܟ(J^o04wڀ psnLSKcӜFH@}' SNw<*2|WE??K~ϗCsȏ" rYC1~ =!eِ_A}<8-"2~3S'\b68!yRb(b(bСA1@1P P 4K{a"KΫ @Sqfq ed: } =Sb i,(VL/r7F yqgZlM^96}>q' 3ߞv_41?mM{Zc`{c "[@?h{>ȷ ܯ3&C ~R~/#0H@K)? 2$@xEohr(]Sœ!߱=" Yio)ց%@B&Z>>Q>=hH.daa"tXr(7"_Bn &@0b: c}Fф˻D8 G] k sZ ڏt^9Jŵ|lΩkO.x35Y{رAjHsAB&_@_ QH4E b)|&R~>w 2" U,k* Ě"yK G&"er3첻X(v]| c#Ò PobF77ѵ} _PW(&@bp8fa\Bm3X>{^Hv5>:.{t})xjy ҙ^@ElzoSV3tW,y? K_PHj ~EׂARE|9 8WPϻBœ!7DI 4|f,M`Vh<&m @T_msg(L@DH-C \ۀ"E;#M>^Q Aꟃ2 Hbp?b!'I2;~ižкv8٥-/hZ\?>qa:yϔ9F;QySI,͍?0x29 . at?y|1d%D!eo; A(Lɡԟwdœamx\tu '{2d HakD酹8?^E '%.U)\c穖AZGHm AꟅ`RѓtQhBwW{i\H:w5G:4&]]NW❛G fA.]3Ji&H/΅eQd-跑2_s;ŐK, ~.=+R< nH?8`q8 %fqW{IIw5u7gt8~oފohg#h_oxP.DJ^wjR= ߏ3s ̈́ #1d/ 1I}Ez>0E|J ROj V ~Q Mgj VPnXTcl9O#@;Y)Q#n"5nG5d{h4X]iMF_6 8񀞐b 6@|""piC辳1 $f8oŗ<秈j4!=c>DNn(';4^g@"}cC`>[H=[S uP+Op6Bܶ"B7)OY$nf)pߐ"@K4jg,괠r\@ (wJ?sUct],lտTo#X ~>^zVON:&EӀ$7nv5.77GZ$D8ť wswh%*k%dS^_?aH3 $}?&c9N UN\@7$NbNt7qF25)O6͵I#48U:ۊ߉%P@Ж)МȊ٢1URn9Q6-ֱ!H֢x0|WA>b,KS$jn"x~vl6L &3;8>~H7r7Ώ'( C8`px.V{oD`)Mcϵ$4&k Op w`]ITpi?-`vڋ;Y vw4i|g5fߔpQr4%x=M U/ )RrO`E9 mh Œ㳕Ljp=֩O بêDPa`}O497\j塳gA)d"g/&G(> b9Q@@i g SKm8L$ocIi[:.omv5P5u]4Q nw}l Ļy6j^[toWmw>/a˂0(Q{0 #<IC(7S<r"(b+ɛϸ<գW4 SMmryV;܏//5vG#fiF+nw5>>wٕI '|t_~KINK Tb "@MI{B?wr"0^gMܺiam i `v&R_?$Gˆ2EbGIK%}(?|y#lg/ 1XbjʧD< aHo,.Ґr>jR@]F0736zw>X,)uZt D,*Ա+6VwA*5evocenX\60ʿ6KE1 gHMnjumxwacԯveAɌD$+Wv$rF 'k%1t'])$W@k ŃF4U {* @q}-293+86,U*bJ+m&ykBQ0 #|J ėS*UtP*M~%|F&93kί3O0\$O76VIЂg[ 4f&Dmz“t-E?) Qc;ЭR)h8 Ήt]ez7_uUw }_1H1x1pGě&͵ݮDD+-ei`DАΑ_j|x8ӭ0}GT>AQ4ݳ ?U Uă=P#,ad pٷ0Xăs\#љQv z>WH L/S(`G9!='R.vx>&WR??'!bDULH0\$O'֔'rEho,ϊ@lS3B{b CnXTebAVr;ZPPvƉk kRFK.}ŐZ@I#Rq g|tR<.kBe1^E`~dwPf3LOXR.$t=(ՠtf[1$g{$7?dC:"B$MVqD-9sB"N)b)X^ɓϳ \IF'|w^ɓ(]"4+7x,7k3bLfoWǜQh)Z,9,@̂y DP9"PK/hM˅o N &?M/Pԇ( D;\? -M8%ϭp#ֳ_]I9\zgs5!}$G +< 7 et wFG\ª{ 7miP~ @u0#ʜG!Q}qSĂ%|h$,d<.#(1K3h'__꽋[{ Yyl|eA6ͭY`CKU`e;}VVxu3:CzQ\Kk'Z#hM-s&TTG |?e9 Jfiu+M~ E+R5PL gZlMY5v%I6Kul+ɪ>jj!"'ݗ*I _x"xfBp*Gh L/)޳.((rc{n(c+aK7e{n(c a?2nʘl &wOJoxm@ ( !a _Jq4G^ސbRC~bpB@7sCE¸?:nʸg%k85DN08$O4^m^.h[?~д@i\4ڋ>֦ϻlM{oh2ÿb!ſb(N2d ?:.X3.o{y2qiI$OolptoK'y4[S/V.[~ ?ZqyÑR|n]\@ڛ@}&"( 9Gq{qS4sP;+Mv_h%1Z2Z{J5P9a?^жEpyH13'pG@s}k3F# y3WĿ ɝ*f !N A@&x9eI|0)3.î[_Ff\VֹlʍoY]8bDC0|8~B=<\1Es( ) ]>+b{PP9-=h ,Ȏ>8++}v>_WLOLb\ :t~Mo1=>é?FF,H-\ՠ"&f CPj& $4/pl_WRs'ql'#ZĽRq\6ފotg#(@m?–c~Z([0(._R/!Gu9_92 g%nZAOϭ9:[_l50fX]6@}?* @H$J.Ŧ)˿U,>[`9|D1uXŽ7t9\E+ b SLECę~^  W9[Ҡw1<swhVF5+DH3 P. :5dDDB_$m"ȅM}Bb8 %JqsE'ʸ)bΕS̴^.-'(S͙>O=|p(Fؠ1RUp-D&⥝D|puS:R֫A{{d6o@eB i XPv|K 9y3 Zc`QAWsyA^F$ط/?sz  |v7?:U1{oڂ K-%a HЀ>L i06gnv\tj4CgBSDpNvyc|9 X}̓&( PA=5'!HmoآT(-jU%G]? Cg{?'&@j JC9HPO1"!px~v%ӽ.ՉV^/@MXqXo?<&vxyVgl7[V\oD ^ٳo{MǘB! _q&GPN 9@C)0w?k(0r6R_\Q\`.ID5j.,ޮb>y%ŚoJ-9`\07$*.$?G.۽p4?X )Mpt<'%7Y\?*8is"5 J`+YAgp?oy%h> &+DwWV^|[T(haW-M%X#?Y(WB E*`88LT&qCC7q3$7V5`uq~| _>$WwooUn7hY"U,] 881OWDucM!6c@Rh>" 9WZoXO-Nߠ?+2b\"3 fp+ 53rsO"(Q/e"@`ABYj.&kޯ.}"tvߴ٪(Aa^ kA ``31R,aCàPK|<%7:͓nuŵ=v .>< Wvz6#b_y'>2,0{8?-}O MGl%BBnt/HūPP{92 Iũ@1nbkN5AcRA`eǾpS:l 4dQj=hy -cb^4 >O m I H xOn#mxglxHrAQ/@ Wdl}]W 9jls5}X8Oʎ܊5> q|ӻ+`QQ 1?&Xa+<(1B̅A.{r?WUH(E BQ-0P/ c?RVxP'*Ko*@ou;U!tWВ?|v|?L,e>(Pm ]MCP_ Mo?X .y > %1sx$Xw, 緻Nxm@Wd6Es$] KѾʽaX񏘷8Zi;U2CzX`Vws?a&FBqz@ oBС[/8o}XP /r'e[G.)Fߠ@?k$O›4UT ]@Wj1 *.s*ץ ]גkfӃi??J-uuVNI\ f=4*Ʌ$Dc?E `2H0$F`$1Qp65,X3*V% T0op7xPu6юA=pnW#5 #}a$lܜܣKѢL)kG"0!k!C!y^)! )H!nͳlswM 0$_-qn#M@r8`QX]&Z~: `IGFG.$bړ/?x;0 OjWN`B-O  .#t0aH KJQIq>WrʊWpR[hƻo#MV\82~5&Jo+]h+\49 çz]kT9V Z@]A=PԫďjIw~+gM)ր׶0Q8/wD5VaFfx$|zVǞ_ h4 JN}l\݇;kD1"Ez LkdUM`)ְP;Ck&`>ewMHOgna -}0h!~n*"Nm%4Pc[oE+ؠ43WT XQia[;[+7 y|]IhP=lҗg%FQ uA+2¿娮@a?&Lgodǽ[r~.ovbC9G㫌 |Ts NN>~^5f",L%פ` Kߏv7 0bXg{ev݃$;'2_R?~+DNhr~SȻƐu39$@rI ?߆"= @B̜+_R||1@\X°X"vi>9o~wW<5#<3 ׎#&`={4spnUȷ?P<`Y(ch!Aȟ%oDhLyWȆ[/<[_@B@T|ύU0HQE9w2Zs@H$j%Hqs9ύ\h|aHg'5nh a턑-d$vwM*8^\6)Sbaak>HU$q/3?f8k76f<1Ͽ(pCH1ΫGTo#Z>VԹoԻ-@^i+LuNY0㱅f=fˣ &skÜ_Dݝ blU9/{O3zI?cGQSLuqPh> [2BҚ\V!QsKk Jb.df}s1"_3xL* O[Gnj#w&w$7zn8 SA'0kcfr{(s6&Kd> N\R!0X:\y \ jNdnW|t'g&XJ_El Px/^_cX R,Kj ѓC=L+ b~UDz # J0PlrWL|!Wma:*[(Z (WbK)1kJxԤK/qtfr[JCfb@xEjq.׆|r@* }jg@ 9 }X*Kg<&ߓ;w ы;Q@[dk<- {bܮc޻]v++Hк15To }a,fmsS@qkcg&N @F<5]7kƷkD0p@$sWC@tj C_[<`LA~c( <[0wfs^6gkhqOj*F!Ph̲v:vrc$RIk/'D_ H-mh wv$d \ٗҐ-`1AV:b?ǩ5 =]&zcŵ͊~0 >}ͫf,l[GWX =7 ϖ~P-r91T✄WM`czq}&7H,DDy+ /Ы r즌&| 5 rs2 K-qi;-J {ZG(5f$zԦ'S]x_HL im1O$ARF#hyF ^ 0|{>¡(7Z)ox฀%޹iY=;  ' U'Ƃ&:@~DeƵEz0OW9Osŧ>OG 5+ǁk@V +G%Hq20H"2YU-_h]jydfz'mK.WUb^? ?4b|T֏VIFo|pĺUͭsab -'џ:1R8|[A1|}9}z" jSu{0ɇce5ƀN]qWL!A/ ah!@Aa¾4[ {ʓi!8x2,U^i$sg~N&Rw0+>E=ѪFw<mUb##+ଵ ãPHaٙ :8NC>>m:ϳ<6+\0`r+"IaCe#rV-6@/}!#CzHJ/ߘ[/){HwvUk睟=|[䣻GE&/Wޣ+n9. cŘ%2_#mYҰ3[z#qyӌ+iė}pX7?xOGھv/YMa~.s9Ey1Ҋg881)FqNx6Q#o}aNDȋDzS^JJ~VƂźX'/Hh$tse]1w\/skpk)͕}^)^?IiXk@l 0&@`'P /ac@TgSo! ( 0&@`'A E<|u5ߜyp9-3œ+?{khQ3 ;#|xyxb%щ|PK>&F M_~_=taEF?[TPn4P5ai\D ؇0/laXՍ3˽CV覸94ۯ5 !}"bKjҥ̓-h@K&ڳ5|v! ?Mw%î.D7dBs%34 ~y ɻWe)|t0y{d[×WNՓWO7ηϰ+{bmyc{6wFwpv.>WOa׏{ZIQ!.x`yQ~_v$I_T@E ;L_<_|W;0pO@|L3ydl om#oݫY`%{ .wr߳CFS_ϗ]]AERĿ?y;#/fEqS sb3~;x) `! ( 0fDJ6Ѝtwm65px_hɘ6̾KEgd ?bK6yp 򝾵,RDKh$#77[= GT-B9E |c`3e2E pkw+!@ edttC0hGQ`6`4{\NN\^7\٘C:1ڵ<߱޻Cˬxkt?> u(ލ]?&^YJN֧RJ$I psq*WSo~h1UK xL9Grxoi_{"aϯ؇QEiH ԵU]WbgbNܸ߳5QEu!vlO xO3c.{=+]4n^w|#7xXiߨSrP?@E~JG)N@j"[&*pظ>HTW MNSω6)+ƌc^^JzG0?@H\9/TN .m R7@T@nL2bl4c`o76mRsI\@uzfX=M5@ 4Yi\ٔyO>~YǓE6ԝ)L@/c@Ph{C*0/ʟ4('f#7vʿskC ! Z63-|_y](3k1 xt @ @c0Ʃpqbp$nXi%aK'kɫB..րh+|Uyk ~ Y=6l+L"[Ȗq pn,$dӍcF :fs`:O^*h S{һ]nC3}OJsHxv_1k2g`8 \x,N5)-@} FKЌz1,l|V;6Vr'VN%EUDGyr2wζ01_ob)(0sp<'&^@z+wTc|H%iRG6 l2(Q^gD_ͱO#h}H¯TPlȍdk\5B]n0j=-@} FKЌzυd8iY,yt'VۧͥHFQ>?y_ aXW~"87N/kϵ'R wuSȯf)&DOпyxMD ؇0/l .^dnVlҚ sStUBރS%T3ɃcPqb-#Fh/F~$Wwf\_ pnCٰ,\ UD`06mE2 >;/e#hY(oZ%qAɚ55~A?_*S$za0/l .LrcoQX" %†ޑ2EB5d>JtF-UIBe3~H3Gݼp/ ai+ttHF}}_a׉ l46"aŌIzHJ@˧Җxs@:Q6x$ ɑ[L ~f]T'7ȹ{0ppk]28RfVZF  pwlٜYj$(B_xj̋8+HXEF&Z+\2#)?QʮE%2pp%ܬJdfD1<]hEkzpZ6p{!* @+eL:YD.Saόxx!.U l]NNM!=\/X`b f?jV0F&'F? k#-@px{`=6|:f3@Hc@???1If N Z4P$P/ @ 0_x½pd [6[f &L=-i,Dٵkh[c⒟.s16(qVd&;MCt+Fu}{Dy*W%!wB ܃ҵ2)p3ιLV@Ik24"gpFXg=68g7)(~{Ĩ{?Ym_HcAŠ^@}lzJ _kC]hSGn)@ @TcͯݢzpgH۴p<M 2t; "A`ؽ1z |Qb_ǘ3ͅbAtfS 8/V'-1( ;!3 BN E @  & z]ޥa? <YTHAdLȶEn 糱`LaWS &t8)@ S!U7Tn6/$ 󛗐󛖒ss!-3ҵr 9Yj5{E H.uKs#CF2}6gX @&4>+C|Covb;X P z\ + JrNTBH6x(7PAQ/ @ 0#a6. =Ti4 TWBuzT2mu΁Y mMzWOm\&G ʩ s,\k Z+Ttl7,]2'0da g?q19a۰^OKfL&&UIHM 骝BNԧU~a8E0Sޓ:hPoԙe`>3Fڲ]5 ܏ƼeArba0BIcŘ1F޼24S/?׃Iccf?t-0&9vSdճddy"9TDǚL)F@]*X33KECg7g]ß7s v/Ou cSƉ1 @R4 8SPWS?+@VK"uOO9^# @ h ( 0c_a#sm移6d&XZDԘSu G2Wv,tVJyj~+<g^7vK=4s-gSۼ n]@ UyoXLi_@|r9lKIU IdՌI!wL:Dr*N&GkYZrv % Dxw}&@F pQz1{j?Wpp;0ZˑA~ ƀ`L-\sq]uysZo7 8'%?Q>Pm"`#;atm_Hj 8bl1gk;]̾pC n.HChZho@i? |qmRfJ: m#JDS-kcI $#9Id {"YCiI 3@|?gH nFwqdgq<]O%} @8X 3 !B:k1 zVV)UE0zx熗nx+07ؾc #HkYlY(78/0/ffaN-Vu %yaD1_]\ >oY]Rx&w:Ue}kyVT[F vr̢$a k^kކb<'餷!,{HJ]'Jӌ$&'3&ղ؇Я}6ڹdKaZ(x$)L*DT&yD8Q7u HW=`S A}v^q scz0Ɠr42ͰFGYKT'ưy1RaNT ?ٿT >AL bl bSkt݁wĽZ CQe %0k#ʹck&sȐ;; :zu4ʿ?F"HZPA(_ca/~fĦv("yHzȋ/f?PP'U0.JNbtT22 9TƊɝU8~xC* aKEΩ4ky Y7'#gIKTO6,clZGE$aaY?/8gE6'Yu@GfǓ yAiYLڗ-#=E6Q6/쯘DqUƓ t]NUbS@ACD2  ȝ5)d׊s65\;ƀtFo`au><IF 1R!Y!깉L؊07ߏ@ &\h&Oݔo]*>=/ [u@#g-jYX#l,UEJd0/\\® p~ ٹ,p7oOKyTP}.N7޸<_KOb(E T0ѯf#6(mnHej]"iPLr*z*;RPW%TL5zoYJt/ul*jaSj5I$7Eq]Z &hak~cgK`; ThZ!`QxeC06B/-C1X_{|gن_QB,xϛ2w<>2"2S`U[3YCMwNswO%iD0E1s观!<+& )l(^5/C,o-Ģ'?Xdg<4YHqa@4 +IKb~A~r'XKG 0գ>ja?"el ֛lhD m`lmNJa ~fMm{ ww#qV!wHaj4Y)AnQEhԘ@}qy7́N^TPq@9TUm**Oa6$r^py=q.T¯KΚ)`&@E"g {mOi?J |rl)7a5<L X}0 ad)}x6&51c0FE\(?T`=᧕&WlTI{3Ǜ@ @ n~fMm0$P ⽁ X{`8Ӻ8T>my, a235De~BwWZQA W;Js:XNlMSL ?V=SR45y.*FOz 鬫R荝Lfw;TXxqvJUދ9Թc׏+.t7/L 70zZ&Ȧz^>0_?>oUF"=Ǣ*F0pf~?H$WpvԚ@c0/l nhW.c3(P!Lt6(4}VX?'B!v@.Rluf.6pmqrؼ"yD%*/%츐-(VOA){5Yp!,섥4Ha1/Q5dREP1{25sP7{~2{-9zA * aD1_ @n)NCuV)7^mQ ˳b jC@URK0v-K!g.ҿiG6Y~G)n]p7Ea\XOs܀8Ee*%\(h[alе:y&Hzr3F) 8NU*Ikc}\s{L]l`={=Eҋ AܶBH8rGju\{ e3Iɮ+%u۽VHp)e,K#'rkG8YH)jP-l ե{ ('Z@GYQY$Y9_F ٮJvX(0dL-=ImBRk?$q8I`vc(w88p{m"+*rlxE1э0/l nh0cIXmh/Ѩ 1V B^]5TH˭ YD=.qa29*ի```MۆD]Fxw֝B/i9d0/Jvr祟mP'ldI/vV0>u`Vδv17hЋpD\k?Sbz tQ>0j!^}bl1M ?VaG@^#<!&tmeUyoԨ&@AzxlZQQ?#b3CvQGNIӭ@φpqLdY*/`4DWglYa/41{a;]uaǪPm.j[{n()^tC*9Q;J&F* ydDr*I'<5sT P;%]<{Ln_?k->+1ٳ(^ r?h$*hW>k23D8*FUij[> hzM= #A! ( 0ZՁ"scB:ϲpchD!\pimYQ] @{lx$d$ z bߙDg'mnG"IL[9Cz3NF{B+-0lQ@a|X="ŀX #"V "~48sٽcQkpNyq?9\xA'bl1Z {uP)*~LG۬T׺ m[rݵrEsӚϱ{y 3ά($gf{ugW7צṫ*IGI"ټ(I"ΙI%OV:EY\KHO$ dBɖ% d}y"YH)J$ dwI[@:@"(O$(?*N&ة*Ocϱɿ*w> 6H X`[h1ښiQ!k0XO#J-=OeCFȉz  ( 0ZՁbл4?(>{Id<'N% =ϰ@90P>l7q&[ ԇ,WzQ]tGkY8}8O?+PѾB J~rG(X @^9HMZ6Iלɺ 93]Ox{b=KH X`G0ah]VEҋUbQ (691A 8/Aw+Ή{W_(.o(${}"`ŌI&ε0&6b?yOץ?xuPi[ˤ;籶CC8QlbNa9&푝҇K?zxVѣsЊMA־-"'hɇh%Dz[皦ʧvƕS"[k`(nG8r!Ώȸ~ႝvY18?VE i'jy ̱AkwNq=0'k5ZU-S-0]b~@amLHzJ, : WXO wOP`HysPܘVlQ^jIl#/Gz9(ߣ|۽c5QV{P p@&HG &xn4ϸUU`b}C*)Lzi?P}0D|j*)SG,>Sg\~,p ~l?|OhW />5 @.gS$X%9icRYnTHWzE{G~W9:#TNߍSLnw,1؜"R'>b&`}6^z~ nCf|23vH %ΙdDzdZVjf{ZOY*lb8w&^-yY#Lg-외ou }Yn*eF M}FV=yx0̈Hz r3n8ZdH|ĸlkAaȢ50# (fL7lglQ֦3Ay!w"^}gfog ו+&ݎ}E"ټ0l,H"$MT@*<ϝ!vlMu`Ee3`Kwvt r~,ٜ*Ͱg9M.60^dM k-.EҋK]Bw!oJؾƁ@b&}(]'ӈkHgaO%'"y 9P:D(] b7J MvWp̃b('J  \0pȅ|"yX^^ ?r/êV~.ڂj|¦}F[VX.MOOm!"'ߛdx7#aD1aؿapWߪkx||vVN΅GdS-<0ش`daYq{OV t0"EȆ d#~*-##jl_@@`1b`ؾa/(&~VL^O.R'Żcy>V1*2w irO{Oe'_WE> ?¿j;al( (sگQ$8pq`5o  aD1Qe1l߰'&+@UzW`hqnj roLgȂK;-b|v`3Z|-vB1v @`=3~"EȦĘ0, _vDaؾaO䣫 ۵f+mjv)Z1υ>쿕VxJT>WE)-jpКNّE!"|Cua@# (&* / xmdyD *[TeS@i~~IRO)<߂bxъ{#_/DN(f  @CEҋMi$#~Oſ0 Z@eؾa`B @`b1^ .'0?ɾ1&@Q0@1 jl_@@`1b ܉i^$<8M>ILwV;;Q6g+M푝ɏ%T0-wL(${0XO4Oe {զc~~={ C,@ @eB2 :xmǃ9Қ;U'{$7Ŀ6ax%Ÿ =N*B*-}D000@0'xG;b`&La`@1 :b`}}!  1ßwWO"m ǩB8*᏿{|ti? ;a{NS֡raLB5v9pM^`:" ELC[0dؾbń4^ ]?Dnu,utdF?T鿽޿2  {ս%j+3]0oȲk=̑0BaL(f`}}!  Lw.!W$0Z3~wheṔ-UվmM]z];H>N؄EEhC߿/,_bl-ੵf൭JA>y!"  `B@#2կ_Hi߻L{ݸeQ^k6,?yxe,L^g[;ֽ>:_aLB1WÑ }:Hz 1h0 o  aD1!fpk2rq-zg2303 ۇ*L76  + !5ſ0-)@ KƵy0amZ#EҋAF@d7ٓ! D]AQ-aD1M\T#wNNwbk& ھR{  ʌ9-"& AG,i s& `:6  `ED $/G^O2(#/^s\@PۢvaD1/_I7ptה6rg)FO{%׷bf0:ߡ$ OGl7eίv ` R4 5ObiI/AߤJqGm83JcǁDaN̳ŹqkszGw _ eؾ!/_aektNRgE;b7(&q*9Cb %P?׶bf2u. O=w9LP 841aC~"1#MGvW57 o 86 ~AW9RG/k0OZz߫_]ȋiT!@eؾ&0ſi熭 gu9 HϪTpݫYGw=D5̮:ax-`dbv8DŽ@p "-60\1+T.};)sCLȠ ȆS`AqiTWHq^샢ܘ _ן|).z?״{]Mh,d)))&i[#DQdҽ:q~W~-3>=׷bfpmPᷫăӦ# b, s% _p5~-5TI Y0f1+8=w3<Π#Ex0C `ׄy#7M%5kڽ&OB=`BLτ0a@cX 9YJ)Y- Jo6]`16x{d)4aL B1LHyc\1:{?b" [ €C 2dL_d.9lEĉ*cߡ^%H' [@cDN!j_oF,77;BK#S1Z `ŢV-9iW @7G BTTM{#$3 H d㎜د:PlO RB]%*1_1KC%j0d~ȏ?@Q夫6nt owYVl4?ln -͡m=[ `a4Vi5}L-W2`1h8f@5mfR2$ HR r{{ O`ݒ8P=q'c6Oݲ1}@j%cכ^at" (&C>"xaޅ"xkh;pk5"w@-e?m@X03@%? f\72̾n,s[oP8@'}|g4tv9<O;MHz9d~MM Fk0UnH"E2BqN(`@n^?Bb9s ٓOfc12: Go爠 a؊0S :C2iHX!* pk#r l .SE`\cD ȧxZ+ϋ`5L3{q#یru~A:Q[Zuh|n-VE,L&560W>ϻE }zZr,3079\Eɤs޳:͝? -/=U>kRZyzsTqhc(>'Y` Q} :{Z~nƼDR##@y=zvU`B}_jҙ@ G:=B/} ]5D֝# r)VpfTkD~3@Sq1Gn.ss_٨"a9%@;.c.Bυs5ZxPRm?F7w{ݹ-W7[(Ř)p+p.N<(3' PU?ZÈtLF3MY^]i9њ+̡zN1ǘk c\}h{lObI7¼t6Z=DGR>3  .П rcO@ŲLDCWM(`5 z+5 7̖2 h+btL>1 7u"Uu q˪h|Y@B3@ ]pֱ ;SV՚9/ x.,tKǽkE+U7[(gWz OϢ3Ry<8"%xl `eRA`b$^8z8\k`#U)\jчSp8 SNqMf#"`zT \"l;~3??'Gx<~?xYaY2}V>h̢_ff 0 ,UJ%RN6{jRDa@To_{׷/'ƑMc :w7M,32I/_cvϚlv-5;17VߖdO L}Tꊨ F}bY  x7RcE t!#`Lы0[ Dl. b6dSn+Cj+<p <5xbⴖ||o ms|3TJHw@D6ƭuzwŸ+3AVȧkx Z]fmi\Gk=}srʄlpN.CZ0XJ 7zX L),DpBPžeƐEs$I_$}"!З?#턚>׍znލz<ϡ<"Z#G5EׂktN;N HEwGNw(~6O ؆0[ cuHEE?3IqkhT U-|۬4vl j_ۻ& 0=0n] NS{Uyx,B*sgQHsōKe3 \_D PDD]Wm ;BI.nX:. Jbik4n/&<:GFmV+ 50=$Q,eE5sV5.fZ 8Nf)_&Puhqw(|NT;uP]~ \MBHW'@`Qnp"igSom nuΥ{.v;ڑ֦XӪS]jK<( = <6oTѿXq2ԧ="%ǰhq *k S$ 1XuE@ Љ0ՅpY-wsOgӍt2u}7*k/@'Nv\u8+qmp[&?5Mg"E;|[&Zih67o"y+: h'\)<#=pɹ5`m b=gRv.~"VߓuO'P$ )7f0NHv@<*Oe?%8T H FUB0^=EAY)85ϓj3No[FmOۦ6?8Bʢ s90[Y!xh5E0`r&3RPL\*m̐z8벗S$ Au/:@c\COV6r$F1l%'6<)ngYPE%ȣ`XS&tfynte>+Uw-w?x"ݭzûU 0j/-+Z#'w-~*=ŐA;\5F P`"tHs.oovhgVaD> @0+H&s0z'Jh9 X|NJM"ѭ8切n}]*3yr0VA?' pq/EBɿJ'})_GƯG3K wGo=D%@*ʍYI𳩷}|AR e3'H%T'hqџ̄)>-ԡ0rv\x.<'Fhi@hJt-QxBĿ3@ OpG*ynvrJ @G G~  I9Y9gsQU QGQDt\_Fn /"Uj"ٴ, @}@$޳,C;'h}e=P$-<'~eyO,WϬE08F g_/΍9PwnT} ޔ l&\`OyI촐Lj Iƌ a6Q3/ѯW>+l0)Q:R'Og(T+yZ^TVZz{^ހ1Nm6+lZ"\EuV19'iGt;'ۗWZ|W@V=)" x 2 sc?o8T‡wTk B:̃:2Wa0o7rQZ} p[[Dh)V!98C/4+6ʚY `A_\1׶Xu07'Vx쪞+I ?_}  a7O}rNj8?>˂dm0YaXqAKoR$1rcK& G^;Z^Pݾj0 Lxy}AQ3׿Wk@#; SjL<7O&rԧ-!sM+?}bV:y҃/g0"J}9(N!NU}.гݣU+wN2>KwVjZ!C'䁸A *? TPɓW ] ,Be0G+ܽ95@d5Vk$E6x$ %'c 0HE:>prx-s8-7d<2"i!ivr:o:O7[~g)^1ze$@/{Cn' Y9?8Ҩ  `hjyc.%@Q/o3XXj%3%!~=0y^,O Kr+m5{7_mY>y02Vנַ K52N՛NՓ _Ȯ٬ }\pwM_{ mٝI/5kѫV'.AD#/l  Jgq*z>+遒n?D\ca#3O \%WxCBOؿkcJOV\ݷGwB}jpa~UCn,w @$<`NR0㵮sGJ`ͱ7VIu n20)kCQRoplU #iqdyόwtt#bȻpG1 @vP#8 Du'X0^0_%͆}4o㙷R7SaW +FF) fo07p+3R gmк5q c$s@pݳ.) `~1A~0VG뱟?X3 A-t7:>V+/~ .0i99NLo%'TgS`6I5`v {Z/,ub-kfv:~g2wf2xd~˭9z:Rg{|l1򹀹993Q-ڠeah ʏ? K#U#4j@m \V_vw/D#GPj .б.{kvj0 q@CɵV)l-PxQ,vZ/XB0[Ysy6yի_hO>M p9Anpߊassssh6_@*CJQ(4<!% 5zT "뱟O)M}BP] t@ JsRՑ<χPu E}%v-g`ejRF?Nɣn\"|qtЛ!]GKϳF#+RΩ ! P)x"s%؝oOd[_\yߨ%; hm{Z@CC= W5v< Z E-vRDK\U/hLl@ #OvXD_*g4Kt< ̑~w0D3|PE&`stkUżG`oz:&8Ou /5JꄙPp:N C䟑rI;}2"NY6N]4.9YDyZ3}={NCE PX  }Q1&eubDIJ@j߻pd^#1d2]#`9>9YB5P%$t]p$yEy._A˲w)ؚZ$x>EO :t,l˃Qc.0Eưd$UfgK 7ןGopy ЩY"@3;C?pWh͝?%vܖ_|W(pB!)rV\qEk"|]3 C2z+\Fq㱂.0Eư%(_R}Q ^Jƪy=HϻeDzuo;)vpVxpCe g翯~9'JdLQpt(wAR$`LʢacQkCA^chp=~|h# x2Q~ ?:Sϻ֑;1g v=WwxgyFh\ 5RRVVt5=u7FKJ_tС]`zYZ.˟q ?Uz>q]g#ֶg/N0VsFg.x)pB3n /=u`4 ΐ]С#  }Q1P/5}u¯\ɚ8rVwvV: iy @{,?E%vN);Z(Yc`5,X,geH_5vv>?7:t C+vYt1O:I"\. ]je"7OhYz"@{*ݪ ),oII!.7pU^Ou@N@^ch%\?9~dzryo,C'IH>w2.0EJp=`g_mǓ)z6rɏ/qHPd#UveH,Pl܏xzK;u? CpQO^X^8LQ?Ct'Bkc jG7`VXGu`Uehi;<J7@Z-CZ { 5SYw׎W\yu="W@f&3M7&GixaW*q7țM g5 ^K~t`U-x Z@\hJLBk.:t.0EJ۫ʱ9|Â_^z[bD٦DxLPߡ t[#}tz (2Ju@*  }Q11`V{C8.~x#%]\gx|%X xbS\(h]@n] 7&>I!./ʜt@*  }Q1P/a͉vR7\ڽ̊Y7'>NWGP"-GdiU뱟/3q A-t]tСC+-^ṿ_nc;T{9frJYʮ\8}9yx yg f?BҿM_{s]pGؓ}PO%.xZ _BN^C p ]СC  g*<M u3 -Ӎ{χ.^1ޥ֟xs&Cemq{\QpwLm@:  XSsڝ,}qQk#Zޮ :tP ]`]yJ^;#0NEAmSNt`Bt@t:txIE=qɝ !(ɵ#,5ar7j #?kaN\g}Oii6Ze"/ ΂q—O $uS($$z 9N`Y4%J9K b|%kI:4>oO-~xK8o%4(2\` -'KsEݖ}XC1@ۣtny-͒XH! j vyV'MBcpȨ!?w9pDN]t}Yo p:TBbm;;wg?/O\ٻjImdM ޻x՟Ac[>we;}5N@| \nY.SKNőDU,-6w/fkJ_.7͋?ޘlHs%b:,$}pT08F80+d<gA3=!z˹@M7cDX0D _| k; myڷAJP6zjN+ԸDoYŹV/9 cJ3.СC%t AiZO'?o E;7x&Ȝw{ x $_@ߙG޿vA-C Gț'_ngx;/ (5ύcy5D-\V[7% Mq عqEpw,Q X_MfX '4#oL6~r 4TZ w-.{$ TĒ1J0O-%gu'%J_r0+ b>A6[e[P$P떀][D'fxw ;ޭJ@sZw}[+-ν"ۂ.7:TB{Xc[;OuD;DޚC 6JkϒXӮ?/ZI>;(nq6ZɀsӻU|8}ny{z?^C2T&5l~) _QrS!HP+hVEN5p4,*мLz[ev{" ^ߏoӟKm\^/BtR hN+- 2|02Y> ofQLj6Os{4o4@dIW.?s1iՠb)iHsM"@[9m w !5O[;J"l^0?pQtС>)w(iz'MJVF֌25%:իyd\8E{NN̻+ֲs\3kJ|ty|K*iK@YlC ;E ,DJ#Y.v WrvÕq{%_eoxVZG8g-7tSb"f)#S~`!'fdAA3kg,C1KelnWpq# ܞnW u6|:t%7&;%w-+8b7٩N 7t@*  v9Bv⥁bSJ( jˈad$[g{*іHѴ {)_lO{DeBEyzX2PMz(d)ޱY\n&{^$ov~'nW=GU~׆CPҚA: "YMPI ᝜,(O5I?ۧDTo"j\DX#J6 ̊vlWB␄?\erP̶$U`?vwNۂu:+N@ۂ.7rRC/:TB׺kgٮxqL6n utAWđo 9^t{ޗםGɉ o5'LSg Z/Uڍ޳*Gƫc `GÙҘj&½%+q}ltD4s /ԾK%j{sVHҸ:"  cU&"Ȍd?9A`c]t.1HrL3U E/c.xe<\‚QОE6adr9BJYʾ[yMη$CKcۻ uVNu,PeJ?-;[o Y.AGCǷD߻,a5JHKIĻiҫ(K2Pd {7F:$,TH[ThESJ_kI;%@i $܁ PY4*$/-Xk`;Ƒdf_pؚ@s-;wsɍ-5-tZ4'n!l^8XFce>Qv&Wo&;sXy"rXx$[ xFk}s&9T'ʤPR[@NƁ JK5s٪#BW l~.(!U@q5pt@ @Hq 5*da>?> ]`=K?Il* hdI< d4'8Ss- 6"9DX2ĝ^Jz:"H{~X[PAgG6J@E'R1'@Q4U qFcn9D8-I&daǁRx<-QRoݟI(e`|b @0e΁ֈs83%A1? bvűɡ clF(! C<2F*0`RtL.7"CLI- 1 7c(z[r.CHʣ问qQ8Y„ cnOYa^$) s M8fk!pW5'-?U t+qv)PCDYljUN ?@ٺ(R|G|W@/H0{dɚrgĭAXcA}VZڲn:\b rDb(;9dpҐbh?CɤhFkA9#`X,3$kzsV䟍sC9FW%Q5/(C pO t@AzA0U9p@g 54 MꖚZ^UIvqbc%0t|)-r#L63QT2$"Vh7ࠆu*EL ְOHU&Y"?-,Q E쫈)wv?.XJ%6P&׋'dW|o|}:Z F= Ur>=k1f)#gd;z'/=@?#v`c9NIvE"r0r$iK$*໦%|٣+bdqbI1 ;y_qp}w.Jbmr|x{||wy0ybx y:.śRr+'W[p3ؼ/XIgD$OTI 4[58Cu'bۣ$Ȋ"M-Ѷ4.I,9J/8&$;sMsW8%Noa?ۭprf^9 `Ԕp.}`hi*ԺTؗ]ݻJ`D| V*a%dkt=z˗쿇#m d&9BcjrRΦ1#˪W}nj#B~_O"Ek"k0%@.0ф/6%Epc^';RYq*S&P`i O7qF](B@E01e.lD[MI'H1ҼsZ,r4 1.:ؚn|C:q9wy8N>Oqo =anqAk䥑jV`W?9d.׸X"- :^z,tNS?34ZK +E(2J P-V]I&2v6>ĄI1p Œ ~X_3|"l2[xY?) qZ%4$Zլ+'Zm|}&P+@;Ηk!f*,5:gӢ\?2Xe[z]`FA8c1Ύ"X-!5yz&n]vlW\tt !/H0Э|VhAtOzg@)`<Por[8$%n(Dzzgpr4'M C׭Snwz4 "G2cHoa4d -$1۸v-'W&wvs/YD3&w/ww&?O8>D^&Lx3Pr\$ u`"n>Qvm5훃-bRap 9&@vs#1Lr>H0ݏ!Cޟ]?`(G{tUl`"@?km G.083 HCJ99P ɧe{[^K&` o Bru,/D#- n6zrځ@ٞFڳ%8'NLP1 ltL(J!7gD~|gR ʄ LL@1yQ~ўKWF󯓮 .aΈ`c8zy?d!c#5Jd5IlI3pr,@d#X>C>1;)reTDw!$?s cQ<憒Ydb_t ,&'Ѣ:Qlci'zYfliS O(CQ-PyUe}1` = 8]gI8 W'<U[n5ر9a +غuIzp,?x펿 )WR]Ý! D$)z>ӊQ#  !5uG}AhZCR:&°Dd^}) ,f86s9Yd@1*bGr#skgd**%%vӧwn&ϒ< b,y'YŦA%n5>{:ZE }K8ռqεK$Si.(냂&;_vN|Jb)70B+'$lzX p$;y1]j)AlϋׄEBLdOF06K#(2'%Rhn(q⏫my|{aцq@pς!eQ?Ph `JmCE;];Y2dnhFA*OR)b')̊i ^&Yr-zNV'Y[8_ :Vh m142w[kW׫~<{;fpZOvjr\&`E$k d`0Qǭ:B'rCw|.9xHlӟh ؼ@׆5"HP }bV&M@'IƧHÆŤn]\ W^fHN(iˍfnZs)tmŅ` W)`!Y3sLCv\hه|Q 0?K L4RF&:f b_hY0;"H}. uq3l-__u^0bǸ.QE3Qql`i?X{ɂanWw[H j]:dd! ߁>s ]³?VDv_\Dž G/ZHı{\rܣ%/AvX]0bԴFtzC۷#9a@V8iZE΂vZ H7E&ǷɃ1'[k#) Dꂇ+(jAPvk7F)D Qϵ"ghmf6mD[6PAF;6f"')y\D"bpC$-Z*tD`9b6xM Z/ Vxf5/[/0b/vZJB䒨O`׏c(|_QqtTtFaw E{䡜p;@ Ā¢h~p [pBEU:--HƢ׋|Ȃ@ ^(!v6~>99v6uB7:CXgph0t 3^_֑G.1;W>%跻 cyrk9(ɥlv|7:sݧǀ{<th6 @-|K ~D+uh`-ܰ=[ #@fٱ>4F8ɵaSx}˃"玈$/b Cj8Z#"byY'öM `9~4l)8"@gAX0w@ܧRI*KIpuR,Y1{hP}Y +0#(_<'vĠbo(O*HXk}m$;gXDQyD$7eD8e)33 7bzߘrFP)8}.%k @w&϶С9*2@_~90']<]`\[^M*U>'έeC >JK]AgV%;6_mrzfrᐑ$;I: Smϓ9nϵn3rN 9#~;@|4[L "Y 8Á-d7vQv^Inh c΃@I`vc`ۦ N!HH7KJ5D=(惼 (P?w.\6@@t5P:6dZY|ߛk(9@IR)L< .oB(@(˲0T| ̅?BG*F $KVQm,_l  `dK  R,RGfq;pD!dϜ=-ͰaLECym)9ҸPVJZY#;5_) I3J @ j0BuhP_VMNB!tq:9$3r2k5pN8=땃fd5 ěvxHa67XZq8 b ϐȋ.;vO嗛J!JyH́uRsRQq(@R z xO\2|4;& y u&~J[κx|f֧̎t^g~jIw:fLDCt@)w4mD.x]lRXE!́"9PjSyJl{7Ɉ:O?K)2V ,BA(*Giam{P{3Bh UÔ?,:x%oxaj}MxyD"7g#mP97#9:vcT @H!J'pۙilgʕB!n V:RLd :m lbބPu!ӓ+(r=?A>PdpR< t\8t^G綖:+r.$~U'Vp4bstWLͰ.߀c1q }ޱbXgĝ+f_m maF:͛_ܿtƘH'K}m?2^.]D!HPޚ5ݗ,dpoZ <:ҐYya0trsC{+1ćh 5gMk`Q" %bƓLر%b&p0F+JQk#58sI-𸗁K}OJN% "-L=w1{8P+ԙU pDI(@IWɮô$vQ]d sww/vnϷ9\+ ے $&l$Ym9lй(!OA8R,,59?GoZBCP9OT:F5 wGp5  @v|G[Fvu<#ja`񲮁Ժ(N[5Ft s-А+ S$#ICel`+ƂM5X`z,rX!O .FWݽũ#)svW>9 ,8ű[)dr&b_l[mŽ A^(9/޲Ƽ #G{˗B.tl΂JE__kڙ=U/[ >Y !1k` @*ȷt q1k0Yg SgwK%( <].$Nb(FEHݿUM#FV[zr Ϗ7}25uѣqq—) \OH\&@-?%p%8J ?%l3 Y+ [ zm`[qEK-8Xk~؍d4H(P;A* \+7G>@ AS#IkV$=(JHx_8NvjM5؉ %Z0ЅݶZO6'K։|e'4Ez3\ޝBo{ )@N~W:63d!.Zޑ捱 ±=oHf@ok<.nvoA+%y,ٱX5]uppzo.?W!l.DH %w}vWa_2` o <O`|=;HtGq[㥁ٙ>(`O`# Мh!yeVK Gߑ/=M!=gcm.khw:r;z T:/̏xʀ&OsʘJ{O(#sLm"mVE? cl^e `z$.bHCk)JL¶?Kj`X9Ұ jGyCLgfĎ9i"޳&?J^n&{Xɐƅ b]4%: B ΢pX5/jS!1;pTwݛ4YXrJ0ɑd5ag#Dׂr s14#9a}~AH7` 9̝HjNQtRM(qSp{ u ) x>r0nkFW(ZX-YJ2m!\ _CT)%Y{,i2͍s~5s"'Vq  XȡBJHoQ$/R{;He\=(ڥŞVUJl.)IxH^h!7:ɝrX>x$euq9WPVP R;_B^y" d.T$kKBcܐ(ilk m[^{,ZuOSĜ(5q&鴸Ϝ( f4NH ,D)0 `%FNgs$'LUkO!X+D3{_1ʂE\ܚo5C$ϊyO{1:`t]@KL_hg j-)vtU(]- rfrР v^9 bdG_Gx{Qp@`!+y'ĺR3g%x.&D el{.OH#7)3;H~! Gvc~Tk4 _F-1[]^_sg{^Su diCdUL`$%rG'W7GHg%VdB& Bc|oұ֑K} B`%J!80_ WJ-ztMwy TĦS" K6)H9DX`:$v(#:Gп)ܥ;VFh ޽!/t` o B,A m^i&莢cyZ}k=VP."+eEQ@bݿ1i/  @0>t.l<^L@W!~Nw "*|nLz{l,zh!gB9hCK@ &@猢bgs'd\0"B n.0|"vpP':^ Az袩62"jDub(;ބt,xbَ?!_ Zb w[rr3_F;guVrB x`fV}bs}nbrXCD)[˾%B!{@FRHLNS!jU [Zk\H 2S`cQ+! ym XzDT.";J^S"_ͲG^ - }ık%B;%>D3 \,ᮅHw|qk0l+HZZtZ)iuZ҂HO峦S;78 %sV oO{J& Xʮ  \;GCX89TVxJ;#?냄nKtc HOq @hA-q,/d)b.zݪlJX=sBǂ^%k#L XԾV&n/,ÞlgL 塏QJp2$%/@1(.JUY.xp(rmǶ-᪉OWY8VD" $XSm5ǰcNK&jy8x*c |hV$;Gigu5͓䇧dycuvM~؏hMnKv]훃-AdfosKi1nQ|O1eWp+茾֖[ &' F 0 ř?[MJ`;ͼ,cbrkxuX@@Xa?Bv+dΠQ$UƔ/*US, aqD[Zph] P3<gR6K.&)  4]tV( !{X9yMu\< \8HP#8N@vk|jL]]'ɿS8ABז PsdSbw#T)[q(lTs|Z//`;u5DqԈ {/gSj4ޞv5^*#8(|rwkCO 3.vP#=.yK@wĥW[1O\ G%av=$0J;)º 9Q8'FkX[^k5 _r ]h`eQ2")s}k?PPW?{W0j-E r6Z9v 1O1_MGY bK8L۾؝ xWt ]`Xj@j ''w E!C1d..2b  K} N1 tq.X#_:G=nv~VF#ήEK%z  EAVq CV.a^'Ŭ@:Z8EX!}a/]7<k-o 4pJ؛Af0ٗBJ:ȿx L7(.ƟS"=iqO(=q/ F\`p_ dys-^#^$E51'GʣyƉH᧤t-'gLm+[ Xw ]3 ,_-j`AAޘl"2/N0xdBh3)?@q0+a%[.{8w$ۛJm2&f( /l2\2҄N$OG EJ_9]dҟ{ppUfc+44/ZsCl.=_n W;ev'kb\Z@D/AsW8Bx)t a%o9"gj^'9.+ .P»x]B[9@lJs( g8AFkuvH0h -||  )T$y{>^V!8d8\o|-7SB&Zf+gSM-'3|_i?AZ tNOG+ǜK"X?$ƨr,(,ط5XAJ0XMdRi/a}%'P[KzbKf-m`a{ne)&ky΂pv !a-'ŶvoC Փ3rȃMAg8~G%&gBPAO,P.:f,rV嵰v?4r'!aV9kyK(dvڗd;;%7t!9&#DԵ5KG>?{z_ jRl>.0,q7<'ߟڷwJ_" -geGsj_A&Z61DHg,K0%x:Zi"4hniϧ,?EPWI5/!S;s=J'wFBPRƗ@}YpŽDU 3evrܘ`"3Mv̟R(6 (p i9_*#\A0>ЍG9Dձsƈ&S/:Mf'L8ZiA v}I+? GF+ @ArW,sTzss2|}N ]`Jbt%=d&rd~o:۹r z!ڡDt\#8%Ŷh7;Ի":+N/lU$ xz.@;\ &'J О?49wp'U =RLR-9%Dq%H\e¹*ɿ_ \p«ss@i_ #aS5Yњu AZs 9:m!ipX9k/(6SSnԾ>sJ ޔE}D,o5F jV%.g(~޽ cJKgiz  ayKK}o~x)!`5̦w*aWF2ː^^%^*w޷FÙ χm`=3j7;˾PSIuAhe,kcIh')Ms^'{gɃ: a -4PbH\;&~AXC EZxX.lK_ܠiJbs$ИՉ"/ 8҈ɚ !(<"#rokޣKx+Ňc R3_crPQZt.giw²|~:,  hCM֟U/ZUd` 5IbDJ鑢b2LK@?#gf_{O Z-xᣛ>D\k@uK㣖_e>]F>=L>1Z_yء&Dpy{z/s9¨`>X"q["#7HC_xCc0T0X(W =%QBwa[.F5qpyh^8~8W{3UI4?:Ӟ UtbhÅJ5syIw}p:NP!# ͥb)@WaʑJ !؂!wy(T|/:7 DvNnPx>_Ȟc X޻^#;3P`:E~߃ݠ+,Hdw?HüfBo #xMP,Oc)=UϏ=zgwh~Cg@j,xrNQ% h~OQ;_wǽzJhy.x伐. `AlSNxEf"0#5"cXb.K2L>:BpBicZz*yvΒ#I b\>?p阨amB[P]i7Rdl6^7vW"U* p94. 0T`)gz{q6@;??>oU9eXٽ!2s.?^̡\̅ MJm`}ggop1Ǘ6{_0Wim~j_|qW&sp@`&dpVHf>dRwEΊ>_dd A `oz\NTɉ57v# Cnωl*]% f0kד2N{!:~v}n;^rG wx_˾(?򗣧ܯ}6V`/M|:c{7kzkK4 w\1!>P&3p(EG_81|=r p9F*(`+ʾ=ǯ6Ǻ|& @7tvo= @PO| p}6v(ùV].oF @[(TEc?yZkl_|2U+q_.^m_z[Zoƛ?HEY\7F/&BZ[(v|6V nX?7~v^7E /EBPg Ve1g[N6* /׌ǸfڗYE7?~xCMŌް@DzF4U T4x>58R`.[ne#y'-3R_Kv@@z Tn{@261_|7}5s ~߄v#D&_r1_4|\s{|{|0{3!̺ .W@Ok/>qsHon bat0} >Kh#/Ӎr''0i4Txl tj@D3pKKG6G/_}:'P=g!exsy y&!wӿ??uOl/fsElBg [Caؕ>G"*!W7NIy2]?ƚgroJ&' EAG>b ={B f\=AY_^4ZB{D#*@hjD+@4^kCŵR/µ\vr';[Td_a~X3fۊR5b9_N6ǃ D \91L 0QHuAN7.thsة!2@.wuf&9\x5n믛ʸU_7N\wrͻ9ĵ2HO Hp~ o*`7"q/A@€E&4bdAHE3* C*'c$9MZy?JL"&@2&tK#U16` Xң3,v|)X\xN<7^C^*V}8u퉰}EnC0ݬu`f%A~Ŀap.  ` ˦zasHAA &Pg%pō,8 Ysծ3,b Į(p)vv4yl1_|1VMp"JawEjVn\=1xox.<'VjU}ML"fVjjqZ@{!KQ[w x0^;7֚AAl*\1жY@ lpl|z I8RD Aў7wLh&9 ,fљ(]!?[(ax,s93/L%na5ܐ99+pb.y%]8Q&:+l'J€Le\#Ĝ?|vP6AAD8j|>5 jHJY~)L}ed].-9/l=`e4b̕CyzM~0=D8E?:& ֭qVSż/Gެ͋:Ng|``#le0"V|è[@A1'dl;+ZB2\Po'V(MS+zvFfD{ju&4ĎH p,OKcؿUlT0ڵu<^Se-l^:/DpwPftדOljxpis( TMA*F 20LsM7OnOEs=|\Ι;[Vm7UM9A>  b6f߸i/?ifh ;N{2Ls-0]Eѓ^oQakGǚ#hD3I@<8u)z-\89FVƑmk;X]ՠ0 ѧE>mڊQb<x.<[΍Su*rQCA:l!ϚydkofXtp7 nd@)EAIx=J_4/9Hfs[7˜rc$pф]7bҫuKZK3"!G3* 5 7p +BvgZD?,uk\T%a^=׹FXg ';ª ` 8 cEMݜZ:k_r+;S1TY "aPa^O8+i\ϳ4{Pud$@mh$YlB=y,"a!?l  T{N'?qJK|&@s 70NXk,eLVÊ0b!59ӪTv2X{9awWΦN{EqjDmcW!M"?wҏtHQFXB+5wbN`kwvyll7r?n`IK`Y6ʯMMKzwxie"]G!  M/\@B"BȾqF0;-u]XC7UpBo`0N/DGç`ZbM-M[J* 黡z>v4X<6ژ/@F4<O޹u K!Cqw3x\αvWrq sJKa;ĸYGb,8CU3t33 Ʈ&:vQ}JhѠp*z?!RBи]oiq䮘&8 %.sEσE0@A&#"#M-E/ aEp.9Z;DZ3GܯUBBzwhyy,/yo>4~VXEtLK`pV_+Z}~-(@)2R&Q Z*$^J@L + (w$cq?   M' 3r_Gز z{Q"$4\qΪ}C\B-ZhyN;9tOfjX\<'d @@9ENT>[k)J:wdk,vOH2 T(5 p)[mࢢ_/Wx%]HQnmWzVoG'M{t2ghBEɏ]0ٷjsڔp\[r_hUU7pD ]2@h&tד ZL)Uhbes!9$  MgwO(!3͞ĀE%GUh q!mZi߯C'F ]0 &yLu6`nUs;\l} \ed.j3m㑺^j*Z * hmHhm4 #% a7zn#jD!fWxK  bS"_-hϘ~N8ڴaJs,CĿ.B`7="ZuyQ}ެ>k:a9Knނ:PxؿOvDjLwj}ݪ)-HC*{N3lUʖQ/FoJAA5I.BmӜS v_@T?ceDz迾&w3e-~rsĹqrs"&Eg}=lᔎ9KhN_[GS-wz\3Bv/Ŀ0ѴkF4k_7S ?/B݉ϫ@1`0Ob@ߨ%뷻E}ez+V[bdAͶAhAc0cC#ܿC;Kz?nd /v;: uRqsnD \E4~mM95T=g-zBUT΃'b]?)BG>jH~ GWw\1?B .RcDdL$ ڜbt=ILD|k6R`UrQ]S$ZJlo/ p.6\+>;tk#  "*>0 |CY,dP qL5h;@f!TWD+(Jǃ\7F_N6OFoְGWO}0T+c㿘kHwp!-RWVChGD@ P_vI b<\BGCqVQY| -%\V6Xfzfl6&n6T+ң=h#  "6E].bI+;ZQ!, 5['Cq t9Jzs* +nWd1,wz_|_=!ɉ Q $N.>w\ _l6FQrm06@ ǶA뵨^c}aMllKAA n҃zG4x'w7C]UM@2B"( Ƙ4JD ޻]|wg*C}?TGK8 #a򙄿LAo= u5s0FDm#9TiHbu N AA%+ΖywbgIg !;..STIl!-@&H<'R@ R֟ %8 `OsdZaG#+ FҞEܔ(^Qx]kS`PqxAD.-t (Ij8AAq? L8m>@- wU+[4#D{"OmT \-O߽E0at? `FPOC*vvc1TMHU=*aoB_|""dAA$A 놰\Ad;E%!z4!R=ZF恒]6BZpu[@ϊ0s'hpD 7䰑6Z&TlkB A(3=_cm%lZު碭yݵB{\[ظflP |Ŀ,]2{56>9'[%S i7tTvdAA؁ 5mhL&JE1EKʹO/Wk5 Z>&#My?"?Ph";;ۗ'r}>~7V:؀ 9Q*RN Hv0m瑦|qb 5RW1UMvVRޠ1 oMif @5||f8ˉF "aXMzpr!G MB/{_44'̓^m_oҊ٪9wB8F =Ւ,osml~}ڠĚ#D@r0ѣ  p21PkBܴܹb )Q6pU}㱝칎*3\|:V>g1o|Ezf ƛ DK? K^ubɝ:u jפ3cG[.rq^1̹Цo1~-w'D3v `aWD RFrt,\ ="E-zmz dAA8ㄊjpZ%(j';©!zow[יӋ }2zJ" pi &O(#q7xkz6{fӕYmCF`MOv7保}Ujp()9!':#̖`{Qm!BG!FŽ26`.W`gΐ /F|-t5j.!K> GrIM=ۉMjLylW Ha*ԷctI/ " >Z$ LXc^P rgZĮw:>eb&H12Zfbw6wftey><3XS(Mw=}1ڝ.-FpC *;Ux0u,q9-wus8_r2r1BDP-D zU sY:P. Ћ5],՟b}]ggMsýRv'p]b jhuF!?7o@gMk<2kݟSyZo x~CƙeeD,'  pb W0P.JbxwLpLG4vog}hy.b~,D?\TezO]2l< 6[%; }ײ0c\7S sVg$jl 7q Q#  H ŊlCr8,& 22 [ @C$2b Wya6z]]VAXQSf{ l}{lSvlԏu3E+磧_bOZB: muqLyɑ-! k&֮\_'brݸb_z Љ?& ;bsaLGVB&q:T׋p ML    I#ǾMC:~'ν 6G=s}ϲ9a hNk[3EEii-`3fsn6B,9XK)6|ݸVaEPMEPFCd6jg _Z^S.| 2c<,`FIٰu^_2"+}MuBUĖJF/>a_ubk~-zCGnfvisne{^X;!kjn\S1۠FN !2O! `]kgE"? x0A fml };@T:w0ٿ>- )^0^N8%Ԓ#ˆ(TQđlTlח L D{o+eBg(h68iT}\xgLHD8wEQm =%[ \X `޻rBk5b-jiKz(RnTF4iH޻~}:Ԉ"!X 7 z0`GYx@jH摕0Daaw^6KAd\~=l< 7沱".tcfel0Cun;5bLS-P=X$"9xD>-( 'R/7 ky鑭!6JeR P PhR`\x-7'dǃQFRZ>r0dnZM vxb=؍GCȫX`\d&2yd 2M&q$;7[% 2ŮbMpj7o*V~`ڦn'=bwVHD8}6Rs!AagN؉}C0,`1GOfv+ эl$y7h] Hܬg}A`it3\KHu&eBn٪"qӇA#D DF6,bV& $T'ӱu^_2"M\b`.w.`\<߭l.ltm W^4tƜ_n/V;X3e 4K%lHm-dMjU>;jx.r)[;WGW[j%8>+]x #z_INO&cP- 2|XQ-]Ro[ъ|l I6zb=_}>#Z!L~ȧ㿛yR<:Ɯ j.ls0Tud+R4PNJ&U"Qμ* 1sjB[oJt]]dZ&fhĒ^|[m+dZkswsmEsykD^7~infsځd&2yd9$d@̓ϡdl;'@wz[.e3\C=#i+v0 z"9P]v Ů~2Υ.o*D"vpeIHQZ3NsƜkCUUV] P E,i0|U~o;=χi_yD 3n z`W]߻q^H/SĿ? 6,Yvssh^2[jN&ؙ{~us#E~no6F]H&ۅpr( hBGk$* Pe|RVEiٱ-lT -0ceB/ia~r  i ˺"-fRv (o53σjQ*5y 4fM*3y+xyd9$ ceg@/Cs:T v25pAyݪŦP.1,{lG_tA|J}@0ٔgD?-bʯD"D%vY!io8[LMS[`n1ǘk92(W\ wWZ]i[D=E~c}A/TjH`cߌ9]-‹6,a"d|d2Ղ "H.Q~Ble{ziWORmr]?təʭ pqϴ+(* _nD`&0Փ;">՜lDTZGaßˈήvvX;[X{[[O_mc6= 9\`N07# s9\bNwZHX#Ú67.;/wWaDR2ܴ S"}`rH&Czp|C&cP-p&GAv{DU{cwuhglQ[QsXބ:_# yFz_NgQ5&DSԱGWO"QxmT^[K/Jna-n.b;Vc75V@d+l_m87#ε'\ sc.1[/k5B5}N`1t#@"za _&{JPg1Vδ mn T!@+B228Reg4֡ZɮOz)#SYMBGAZE,rl-fs0xq;gR' Ďzwɖ|QM>۲uf&vLuy1 sh8n2 ufڐ#NMmcCJ,Z#aB8Dx? #!&YvN :T Mkh 6֪}>c{0n0z_m~C=ЖpDD D&p 5Bgy y$DTDGk4Bqo6TKnd% ?o0ģ$Q@l=ѳ,fw xs>ۯhis0p~~m`n; \-9߷C-}_?i&s֢x h3LMoc^F<ݪE ֡z|r6,_:Ȳq^d@@8hz$-H%M{\@yHB! `hYN4 BfZ_3PGRN(kLV5Iu!kׄ "6ޒ:x9E??;|nvœadh5$ٴWZ`\7Ea^C<;&hOq\`rH쥓Md ~bcp{ޛY`vC@o5֘vN3ْtE\0Ĝiƛ?_^[t 5uvmLh0Gh!e!!p:s껸6 s9T> #/sj؉59_|`OxwsrjQB8 5FKP=6B9i7lY =d%p~AM",tsQOU}iᔕWJy#/i+9onW4r+J +8P#pԮaw )?h`UyD " ;^Ȟk&z[D~{\#MQ{+D#chӰQ$wJM&Su[D] sipj<y*Ɋs!dlhSy"w{S모DUٗŜTG#ʍie[*,MlEŸT862mvDZ jL5^1N1TFԕN UY;_pkC5gxBL¸3Ajp {q k[Q'گ%s`.VL]+@m\Pu=rU'B~p͠vh$!-1noÁdayd9$@V8 `ig y7 wz nE0@q:;Fzh^ޯ=m u4ZpCM@? Κ e|= n8u9!3("B!*(S(.nea=UHx&gOlaxMO˝+.wy2], LV{"DF` Z^?|a }'4[P=&B9i1lY;/\-20B^og6nȇW-U0؝]E8_>Onܕ\ 4pQP4\ 7.j C## hu @n[/ Q)RKEmD ˜׽#t9֨cQڹXϙW6DF\R`W28qi?x>͵i]zAkX\32(¸0;@Z"r@.6糁7.q\אמcX0Fq8W3}]O2MBKF|c-e0<5({z9=_HhS??rV}; W GCdldbWG͔/| Շ û=؉ʃF ;a+zhs}\QG  U@jED*] {޺t{!;pl|OZՄtsN=˙k\;V4x.)x-3|M1 c&Qm;s9p='p(kZo2j:!)°޻0Z`Di 9mz{@)- B吘$|62B52s_"2B't0?Rv3nY^{/#60%b' Rej>ivE6^4T /+Tp%J"%E?g\{ <_d<6i@y{P}c'p{׷p]6Ӭ|v|vǷcւ;Grx<.ύk 0 ck kUs~n2tbZ`M6X#DS_ 5b >w͕V+R8$\yV{۸_\?};Ys٬{"Xd:6,\&sO  0fۂ3=_3dBX7n\DO<]0p/#Āq!'hÎ(ҦWi6"#ŸBPQD@p @ *Jua\>E Vpᘵ4^@ƍ|$M-WQZ4;Ŧl ;m\jS]oq(Ci-ʏ?=ύk5w5`Lr|+ƌp.Z`@EM̭5kvD~U^?XB G%lzgQB(z.𱋌/功? $M/G'qyd9$2, 2ͅ9 { 6^&F sE-6od ` Q7f2 !7jm]-P\n bTǛGvD֦nliT + u5\z(ߗǮMV ٥.^ H#dt;6w{x̲H%]c og 9mdOVvN `?ۣ8Kx<ύka06Rn9UdDv0ZaͰvXC% @Zc '/gvſĿ DB t1lYDAc:T vTEu`=ϰG pujvh1֘+T QaN/[b4@bphp>J6Rcۣ }(BĜb4B n1e/L=[f30̿ksȝx-ut c*Zb-X[1Z{O!%(U5WI4 B'%hdldC`R-3Z\,̅0ZiVQk;삣 !kCE6?[kj3Hd窶 SC -#fdCClvBuX@+v=h;M]MHuCAs[GGUΚBaƺq,@/kudy]ߡ~_`s]b|K_XG$|L]Z= kH|bMXc\t]g:Y,`n; >);oUbTS?Ob' B'i` dldC` o&۬LXVG^l-.)U!]<ۺw}*N=~Ax|5wHd1QN[U"WښaD:^FƦ\wsyIBŢE+ǷҏLh!Y@$e<k, u5MXrhCص]0˂T l z;K-9vi mFK5(!ӃvÍ Y.d d*0 遞5ZuwulO0DF./5 DzߞO6?UՂ#2[#!{81L֡Z{p=v@uEzQ8(2k!2`6'vUrVvBc-b7N[AXܨ2<,($^52EcD uYtv.wWts?35ܞ|?Ve善>,A9_( }e!kxifVVkp=.'PG԰Ju0/ދZ1^\sat&3ϻ[ؿN^S ơdB?9ws^֡Z{h"ߘԙF:ii;f2d'̴z.%/E#Vvǵs{<bjr;)ؓY1EQy/Hp'ѿ9HZD0 3~;g͹lZ7jv2t'?UBi|)d&0\iD$Y>gcՂ3Q8?(9Ұ[$FPͪ{smENWIh@ ~;Z(A$BxDDȖ`t&ll_Яwx8m TMO* L88#bKP9~/`P-=e9(W*ĬjQi [rSм" ΆnDKeCz6e.s p~=}8yѕ9-Ι*asΥ\laCu"B UCvS5J:nQ+A LĜ Hpٙ#;IԉwKު HՐQ&|Dؑ " a`1[(b frYcdֶbm j4C5< N+dHJH#KP=~:T vO2g\T.ai"O`5%b||Sl1_?{oG'=';x~ 9 o 1OH$ 98YݝcwfeK)lv^?ZJՍ Шj+Hˤrt./ӯ]\-O5L2bχTQnT5 Zp w & ĺ]`M% Izd `nD6|@X̡ oT{L?S)2UZ-60rP Mmf:t x1ʕ=FSdB:J'?NGCА-e0wB!BGj3db/ `S;Dh=UV: TR;B8Z7n^Qˊ!2F_3~ J !DdPEKy +y0'-ynp7F ` ̵A3yCTDBhmGcCq) Cs^YВCfOxLRXrKwWc@("PB #b8,q:bn/@K(D!V}tQL fn-`oz+7=(~Em}p F'@od9Xvws1BgTL\E>0_4"v»6_[`F _@ B0YK% t@CS'YGrAWǤPĂ[!KɃvK5ga柦kP4d\SOy6V;=)a|>f S;p;3&EuBstu Z._;h \3ۥG!v]|L;`,w%D~͚ya{`dof2##FMn:)}2:aSȅ.r: R3h\:C}pdQ(bA;t.T@?yvu@[wP@j#EQ}neb7;I7PmZ]Cys1D"zcCА-meho|>B(`etQLnW`[>Lx5 Y4ϹpBB| NVoUs/BQY7F6Y􂈊F;԰tepC9DSL,GVJ)YHaD..}ʑhSMǣPE/7OI/E]nD6:U"gv B HcQ<'5O=c![;°s;HY7u0RV v|a~%@8!B&ڻ9E~h;bLЭ NlwmD _&0`C}o@Kh (:Dh ^^s$i]k$V?FE(fy)(ĿtTe/*FG Eh eDA4SHSn>N A-ʼn;҅uy }aݫnv\yG=^g^oѳ. 4&aFB.B=(f8tZ5L"N6Is=EFjbR>k!w PXA 5bgIE&@(X41ﻕE`z@ +n8 Q Ou<@<lxu@8A$QAK?,0MJD?&@%cj2!Q2p@)?dl ق^e:6 }4"؁Bh5\.|UZR"qt%<;PAw`‹.wB f":#);&uT8vpP ECp~p.C0 H*/7mLOdF7iZ!S"8P1N38㒍![v?V QCtK^TC`.K_0P [P! f  1m@-!A\UP(:x{Y gX0vfC2R=P!:8c![`9AsPLץ㩝 0X{Ƕ݁>U 9VQ;6X3P3Vtmkk[/b}B`%((הM]V]yh7 @6y06d kq:㑍![( N^@W0WfA@!AC!YO42RMfQ:?b h؟5PPDFtN` jp լ@mĢqQ|(@i1H No>= B2;-V_8HE_o~Ηl,JH.- 78EAMun1t&AW)Pؖ5^wR} [xw\dE86[wP@"UPNURp01贁S$C]wА-ؕ`3t(@:(@! e(%*N![@e, R!{@{٢ _onR _k@wsUaC#TbqBPl&q+i{+X䓷)YPXFtB9UQ"p:·T#`P( (@ Pت804du[Nо :̴Mx N& $H E<ggnL P aG@\NoB++8ݰ`*0 e(:}tĉ5 Bݖ>*Nu& a">V`7ߨ>_INjn2V:( E$x/GcU4 b{>`ܮw] "*3It:/NJja*؜_\w4r̆}mP/ 1+X?y_oBI7wV:,$b[oE4~ EPʕ`:ܤtkkRel5 = "] !7Be hշpw2)@] BPkgwX( x& 8|}ſ2Rrotj`kk CXU(/uIcGaFuFP Edp@ ̐1u bGB/̏"[h xݐe?>k |f`o%sdC.ְHjڔRȾ(U&@tahIc ݛ tM3@# myR" ^`+Dh&&` Pl9>& -5zYqN p2m`q`ثkQqiC2`P CxU(![',j'f:Vw˥n2ZvX퀧0 x t>15 z}u1WB/-1غPkx_h&uYd#_<@sŊ"eb9 "HU5 ق<) pu@BղuPY_amD]=?(I@q_$P DSo&tn Eg ## 1"[nD2FkcPՎ(`b`IcxЖG tVTm~@<5}nR'ڡr4kV֯~6TN5%ѰM*Rdp:Yb<  u@ G(/8{8c PD<y8IPB~͟L4</Z#/jJ[2d 78KB >j}%O ÈHUϋdgxNSJ*ɽ9|\wPa,RS 7dρYf(`K12`%i玱zuE6zBE(wֿ;Lp_C0 qEr0 ̨SM~F;I5`8ŭBӆl. @_I]rS(K/LCA?pwBE jFlGj/"^ȷ}d̴#eEtbPD+ b:s Ќef)Q0lXwG5a$19"]i7L6PDq{dO5+v"0k>!q/}Txd* Yq: T"@4u. ]@c;P/@{||;~jLZ E{+8X0O+(D*v&GA]?HvPptm[DI C2 j* p: ٢SaL{iLnNΗSQ(.hL4f\2ךGD>(pER$xuF%d"w[ ٓyv^k>vjx`vf,uֺ}p,* E0E/ 3& ~~Y [X?kc˺u]rA`sa/Pݑ9`S}bI֕ɿ{Zγ };Jw9XۣK:@KQ&@kgEmPDq$@z{^o\2גC6ywiwJ?Wm XaP a Re-22@ÂGiP x PB颯<ܬB;'1Jva]l3Y  yE u 1_@&;wŠWo7&\.Tf=: XXyyރx.`޸,j(ckU;)>O .Kw_@=R\2F0p8 CT `uG{0ѝH^'G !="+?o9;xwyN->W׹_sB|"AoܨJ[׏"vXef@b0eH=/\ag. @)R3gF_Nq6ipa,F5_xt),H9@=P$PLtťXbWx#0ז7ى,%;~{Ѕ!CUEk]' h@@1\Yi@wW? .P *T2q: ٢R%XS[blŵnu$*ܑZ4yEZ% vnGJIH4^-d:,+.4,FN,3zߋ= @6/0H@2dt"6vJv81 =|cydt=E.P"\j2+7z|aP™ĵ=3wtѲٴ%(/zK`Mڂ5&8l ?>}%nV xϔ}̸Ήh- z6k`#A)XXv6rr͘ 0ױj4u;I7Mؔ=;0!E4Q o5CT$<\^EQv"Lr~f "x?phQw_T绀U5: D/`dpN XQ̟I:_d Cx*JfEVC/Pw]kF~XK`m gIt$dD.P uQg'I[;kvFWz C=ob!-X!`};FZ77ĘEe( b@`l8M[-$ɉu@].hobrT;ѣzOBAj?\&#Tւ` ,wB'gQ|ÐND3ʭM 4DMV_Df)c7M+ڹ]V#02;YPX1,Eځ5k qNu r/Nw4rlpl;~h `LEW aG,'C` xی_SZt%;J77Ӌ)F =O#P,u?ՒCt5bMP@P &Ń4Q:N![D*K \ {Ժ>xȇqwL$K|Z &TN?x?~ [|a]p"vnx† =?XBA?͇w7_7%]4mEwuA{DZ5kg}XS`A49G'˥;"*\+߁@$\_)c39x@Nd P$h߸ѶfLdMnTkQw?q=:u@sj^* d0Z7S;] #l06&T00d HErcmd=ݾ6_C,ľto_'P۸;a|  汪ڮ?_ՅE[GAn zԃFV yL `) Ni߫7oT&?j$?t{ -0(g;F`L%XSf@ADؿHE^:~qppo @`JG` ^s3Ӻt!cutٜ oT/;^P? P-!`%DwݤK.L:ALp~WF.nD62/~hEY'{Z/5AJXv26?,;#Udۚr _3T(yto z$k֎  u&O` Y3Y _ %vQ ͅ\6U4-B `vGtHG/n :s'-9G7У A6PHNEst"5C!G :Tx M vKدԇ3DZo\d&h'3|iU-*B|W;ZbVVZ`]:j)29~EsAޝ$.."\ץ-I(/H4- \_UBn[8.Dj( ,ts6FQ p+ 0õd-k j}AvK0›V СA b06&d00dFE`y$}Yѯ\-LTxw!&/2싖|/5_os;A?V׋~/b7K[\uD>&Bd y©>0zp[* uP44QD'+N![0*RAAQ,`q3_E."gș.rb>p,>Pgia+b_uBuX>?.)_q+]!+s#Cki+ %n>һ'WY]^7_f;خi%mJ/  k^`k5 x|{R8.Z~kz:r=Ni8 l+DgI.n'ˠvnP " c6D {X&ALa2Re( bp( 8lH=BFqT!y @ 1%`,DяUbgWp1\$ ؏ï"U/+? , )u5Q_9y{@r<ז=ϣ :1~;^XB N`ͼl෋;əm}-Yi~CJ 2ˍm?" HC! @S5з?0@_@ m䚿ve(P(, :Yp: BQ$Uǝ@|GZEp&EZ@ɇ{7@苯QHÝ&b??KydHh/@S,=®oZBXyDڿ &`m(/60PthY2ɹ#7NTxp&_j8QPM&wUp'(W cXb06&ktE"uI~iWf9,*ƃ A78a{_uBdU }` ,F- 8/%xExһǃauC9](BH#~ޔ6Fpa Z5kHſl koxWM:!@s Eדi,M.,o{ me=*@糔0e ciȶ+N![ *R>i8EAG+/"ƋGLrSGoG1? ~y:~$9&$@z=\M>g"{|x7V_}aOFy୛:%'jp{x'yP% A&=F %?k _Ӻ#XG8[ ٤G߱e{s?[!kv e]Ɔ =Qr+^"]::Ѷ0C$0l `o r4Qtgs :d C@jd#w%ݞsC¿kžN IwDX!}]:4o]!tX; QJۓ`\{k#V5c]B iKN4fmY{fl\0&N^+qc}^~{\Qi2_p+04ua2Hbp(e slQ:H3ZuZ+$"?h@$ 2 '9ξ dz,78ʃ=۴6Eo"_9.')! |@ѤhrE4"Mem.אlXKoX*DeA GiB,2R:Kfd G06ll+ s}:߇IS5H[K~6CXQDR|2ђ04QlAZآF4j~g]>!a"t~ȁ0?PV$1ĺv^yi7y|Wwo|7y췥ϣ"8F M&åm1 -`±Cb=o pl%s8RB/hذ_<hk&}HmPANU!(: b<88?m }4끆.t_ Dig @hhk?O}h OgZqW)AC7oVkTDLrv2VMK̴(~Q3!7kv7(8V!/?dn38`l$Ͻx"绶v(@ e($ ci(O( l!ؚ( `a]ż33xAA<[Ebg@cr ;O|a?i jla'X 5kvbUsjVXHG 0p)khz} nO P3 F )ci8.[=m̀ lPXQJ@yfv D2Wʶd2̷bӺ^Npozݑڝй@qRf~ ?e {Br6 Mmzr;2 e(Dp(ҭid @@D{w@FS?4PXI4;RcN *Q`wY^Zv6ZPV0OHo1$%,%6Ry{;"M[e(D"p(iDd?"H " TOmܤ\؁a` V ]a~D+T)3g`EfWB?#w 2؊(@% "ƆDnN#' [)@>)Aī>30' o7`6\2 42B񆬨~ϭLS @2D>, m#{{ Gl'cI͝N691P@J E@1bl8M4rEB!P'bkO}ϕ > H0$m**@4;N?m90߿n `vd3NK].&W[rʝ@:0HM(H ">BG[Dr3 }rBG\m p-i@<`.6f['xK!l}L?M;KPB3(PA`u&+ogӵy8N_54݈0z=`|os[`]W6XknN8뺢paKXQD2Qb+E4Yi@e="elq)fsXLE>˼<X2 #>@8YDnPA/D|+ͬPUQ bD0z=5Xía\tβAVh2H鲅"4e(v ci-`(`Hud. h} kRz0k p-Hekts6 B8`Op ӏߎwk_%nAT">/˒{u0l8hqIдM-\A(ߕF_R"Zli816&H8lPB[&W(W؏@@ [ɥ0?‡vfrMoGP۾#=|;Z  0Rb 6- u1 _D8V#¿,RF D"2ј1j>ntlk@16&P8lPC[D-/W&?ROBkWPGy2EIܡ_|ϔP~ˑ~ R&n_D dw2[ք@X~h\+77|[ `zI?<< {lgqXĿms&hǭ )ƆDȁwm /elqU;E~ɝ& T D]J]6n`Wȃւu=塢6z*/(FFȃBD=Z5!*`%1q;kA߱SsXzpͧs%O``:/|Q]9b'r+m0ϋׂe_ (oךW:ј6[*("uIyVw{wFO46X4E5&(.n\bXLU1C^Ϳ;КOo _!}tzy{u 뗎R@k佱ڠkñJ` y^- › QA:J1[fȾ.Rւ@!89#2{OW7Մ ~}P/^SLcla{<_񨁹 nY`0`L* ZO)U XF{)E/[۽*n/2ƛ׋pr,=OgZ[UHuMIf b%c-;d_ +Ƀޙ(c/|2a]CaAհ@_f_woֺ ݅'8"郕~k>8_=+f}ߤoA@`IZ ^*;vAyh -_׆а}Է[;V%S e( t@ bP_ CJغH._$ʗoOg[ f1@1Ni,Q% +Z-3uU!=}܈aUomHz-Dh7ǫNR1ZC5 -!kÊ E`#^?A  P$0٧ζ;㫷'xA_6 " 3`M8 OWoڜI0݌-P@1k_O]7nT)2n BZ }w MwLF`E&0?PnPW_`j?'9ꅣ!(sB[ݪFXL-jTTa6bNjkĊ E`tr+Po' @1 505kX+ԼdN@hOV΃dZMn}ޠ '{2+\j~,+]EZ?manCȿ0Xźjbj AA:Ja`Ⱦ+Ƀi<{S>zsН}5te b=@1H:v~mS d×L6,}<^XEBxЄ =gxuoWNi4"'=_sy <8>8V}u* X hΑ`A *ƕsjM:fbd+[b݋Oб2; |Iru9 M}"ւ!Y3 F5VV K{tfsَz~?ʻ5S T#J,5f(sCBx+"[,|a lq ,@uP@$a e(l2 P)2 exSE08kz '~yn`Z/"`1w&ɏO-~% sA_0o՗!?Yz o>K~|yu_\>bc]g;&?]H8*_Sjݐp . B~2vϗ: aþX^,g"bVa$WA\w~5H0Љe0}tmWdE7&a!^~x H! \'iT@vW};ù.>_>GL4K/7;#Oqךjowv9|&0 s \&±~0V#]=G zNN(|bұCZgNa8_:'"#ϻVhh{=іO|h /?#\+lfp(k} bu^C1o.p|9?huS@=[ 9|m065 jNeGж#ɂ & aDTА}}M_/V~||GWxE}O7cHxK.31] z)b>j?HhcՆgQn<);W^ڽ) h/_hE7CϹKGggZ!=O?/G8yk9DrzA+,۱e_7={2mafL9̀vf0@D֠-Dno>b%t*ts3MΉ2 ~PEUDXnU&Q[+0-|>(PM}|\s0FD Eǹ% v5e0"Gضʼn/&(aD;'!J3Gd_nXAuh>=8U8QOuDb09QBç'x]ʍ0B uu?͇ ͻULp 59,,co*:cTgfLHG}>щ\ο^; y(fP hUMFk=dc nF||X]  s'BkFQ˜G_T&vQiBw)L4do5wۍ:o{y,}Q ߮?3:#@:M}h[cs?XK`"),:^el W@ ,q n;![Ho2 yI5 W` YEqAgq/&˧@`ǂp a˸&;0dG"+COVΓ_2@޸7vN:cĬ`0|w~?B_"F"J1FߞE].%sнz,twGJwA8BL (rkO@x 0 d]*nq9}Mz(g(}\fS &\0< 1/ h0A@Џ9&õp.2TEWeY,rE^\.u[uE~Y Ɗ 0_)Fned#]t٢_M6qÈunRCCj|8ZES~;,уӔ^Å|'Or+/HcYV"~f uV'#(/zmYʹ>in `5>ג v];|FXvDjЋtۅ9P0\!מIY;jN7 zG=F !MʥR7 5 Bk$]#G]ECG!^3X#c nkY,{ЅfO~<N~fGA+ Ũܝ cr o; [,p&Do2 FTBA5x [HQZXaME鿟? $pO'~M?w~1|tᯟӅG.ӏ?e#B*@_)FWYH߲-FL^#L׋Q^z|{.:N+Np˒߿CE;a w?oƱ|8R旛"#?/W!xU|׋@vEZ8?B~_ݼۋ^5 j9 wt4ҽ?+h*Yp`$a4dcyDO#x}%'}߽:#V}6]ZhH6 T7 ]iŚ"0:Gl!b$x@̓äIf Ũ`ܥHo\;ƫ焮9e_jQ"kNЂ.RXxڣ Oog-@ ƌ\_6drQi]Z:,X>7RؕDڹ#;'v*AtكƃHzzIod|}ES>qr3waByރ8 ˻w! ~_]20u |kL:]-й r}|~܍ `.LծqDKF`@2j˔-()"\k0 ȁ$\9LdА}/^ &ibǴ6b-u`.]6Jn Y]lz,ExLpl#00LFa 0 c 8B1W `tlB,T RB5`= Б:PPL8mzؿEx;|b6~p/®p^;D5ݹL˥n^ ?GCE+%1t*LMD"q Z±@|.z [#B*vbFKߐ4scy7Ew) 9)%Sk( |&I2chȾL_/FN~[X|1,.!z͇/^%ogZn =>Bݡc @៨N7v~ B9Uu"Л3vuc'pn대t\_Dǥ B墷08`,'hG_?_D0?en}*DE=OCuqωkqB}a"?,3{"SYꠜbod~ngd]{YL^-dRj,6n )(/s`3 I0Fs0i>CC=az1* N<KǰR8&lbDjCQ/ Dixl_9F)Pgz1b' OҘ!P;3 B8‚f[}6ߝmw7V>2s"w+|gxE mƲ:bV+k;͹#pfE?ԅi; }^i!bRT5bTAu8^-Kzw`yl;yX+[xf8 "FK+ U d@x `pxM5r6;I ׋Qa-OK/EF'ˉmA@sx膇EY\G탱*,vlNݐXIz#fv'h:kܨDn6eV!oE nl9do&`3 N*/rV7;BtC8s*{}7 2WA`Xh~Zp>n+#"cɵ42PFw+TVuŀhqTi~ܰ^څq0?XXi@ " *081x`x?ahȾ?L_/Fhk q" ! ]W.xxLbQ'߲%j1BJ6F ƨмUS(XzerX@vNX) (s&LYߛ\8Q@EeP,|n xn;{Tµ:_b]$9^ \7^YqZ1b-w gxmI\_õCc!TO@QDm>*y=.y&saWn]0?XXiԿ ;P;1V 2 BTG18& @39p͡äOf ňXz>ffy)2 o,vR;7ȅ`|v6>Ug@zG"U]'oAw(VtڱMrƛ<2}v@3¹F ԝWt3d* ͞&6f`;}7<.w<!`\҇瓅V&aRZ5k ׸_os-^t.2TtzggӇH=nǺ_8dRJl˛eH$kl2=14d'h*"OI`Yxj ѵaWoݒ^hn^rzLPxxC}A39jEED\gls.b5Gk,bE:W.D<Y^, k`o & |`Ub?8.4we9R!NIZ)LH1,5*@6+ ,os k\:L:dА}^IՒd>&>9 6o "%_0.,&^7?cMS@Úp̅!__±̸ G3uZ*@+ } l'Q IJFNH|:L:dА}^‰wGkȫQ pChCo>W}4@wI.f|tEP/ ! @,_ O׹,MA6}{(Z4-ܜ"y`@$;0A;ZGNXo  /pd:$s>U" @1`(d]46ogKv>oԸPIAUHft̉B=V|/^瀇̜()7Yx{k@T}8#ȈӇN郼+@3w+`m Y?(|u??F8wx_<`+Aax]SaPQ.ϙ'G $7s!i^&k2chȾoLb8v3nVȇ Ǽ8u `r+kՃ҅B~@Q*<䝑j:?u XSP;Ff'>}h'cYZel-QN  1q{p%^,߁y] d.ӿmlG`eFJD2Gq@1 ^)8ߵrj~"GQ9Vet`;] gm EpԿRQ@08& =x8?mH[IE!>Ur_r 80,޸Qj7T<_;пrO?VE /u|,iF(;)cuLD^*!WW1>T zN ;۵V6p]R /@Y` DH فCTdlr/D^D@+@8DY" sLKN-R @FP"Zqhm#w Q:=/L]7W(" IΎxoȑvt^Ɍ!^2ތV(7!=]{?T"kx<?޸>7"u #KPq7ˣg)ݻ `7Zl'yFލm kẠX |:\z0}``Q bp= A¹zk=,T" "fsQW(860.D@-D`a'sy L͂XVV=]@&{kE  4caVt6m[0^סѤteQ^D: a9%33x0k1EnR4!9`׺ȹ}.<6+?!z.r}_ؙ0quZB VesX\)Z9Eɒ9V@ aPG2(۵#h2e5I%^aѼ;L:dА}_~n GݎI/o/tyF MM @+388YZEvLۓkE!0ϋ5޾YEzyߨbhjp`.L洌_:F.wo6E%?A~1w'ɏϐǷ߶؃"̵/ n h qmL 8w岮h01t"2ݜcmXM,d*ZJ-n'j5&e1zׇr%2R g3d 62?($ IB.szX0#14d[߫B@G8Tdt` z7LvG&`pxMqɌa`<!14d_߯ш Tt3 4^tAxyo&Y# Awx\ػ+c Y!! oެaU?+b14^>h#9E{Wa%YeYZWD92Ü3A" 9gDs%w]rwp;sx^9ȒUALL4v 1LuUuu}ߟҗ4v\X62JX@YD`0>RIPҞ&͑+4gD:~W[H60w`L ' /%xEXl8A̾ gݑ"|7r7]<\۞& [H5%@rBX_&E v-|.LJU;$e&qǣ[#1!oV gnJ.}c[#7.v+4G < cpA47gOȎ.K}2hM l9HKf iJt,`@%LJe t6Am:&h̓`Pߧ2t53[%_KZec*/+,f@vS,=/Ro}Fq ^AoAϨ?^ҧ>^3wNs 9_^~te\A J{#Hv$%g@A݌7c ]M@)YP/ "P mHD_+`M `rH8 Iyv`p%<7\?@JxuR @M RO"i&"IGz$O`;,`$ mi- +f3MG̀ Tff[LF"[QZeNp)kv$\M un<~p-&~mA~)@.)^(JygKIpP&Hb;)]+ת\dEQE\?;Hj#͔2SXQ!U=4 I^ Vn%X86-T0{@d!"P."@ Pm>X4f6 ./ "m6AGq><}~J}@rǒwb9Q ТHW7mV$syG_gV ,_t]<|Q)ߵ(Ơ5t~*{hWUJޝܻA&Wp?J.;AȋnƧil|ڸ"GF 4g˶޷RLz7W߯1.5DZ[!yX(@!JF2KV=^0@[-Z"* 87!x tBgD؞͇9 Tf=g=.c(QD8H#)$Y,μS:+ L˷3 aS]GY" ~Mqb"qs1Zv}Tb%^qX,($pe!J) O1w<T(ǻ==U$8]ʧ]ͮt=/&Ww҉,<8nr@CMJKh1@=@BrbICn5BvO`O$]tm -`! kUٽLX.| t@gD֞'y Tf}g}H!#eG_Qx_7.fEpl; Ģϰx{3믔 f׷_c Ý=XPr }kJa}w~r:=sle@%2WRJt`y`~5Geh=\1xX3__Ȯn[ U Q2<3d5w!I l~1 ad_ :r@tLRLzOg΂Ť%36 @!y/-`!ei<fyKfQ{at4/F0Sr\ţHf1>%< Ñpi}1y\\E=O |3wg׀ka}֗#&VxYQ,y}rerKv@-{+!JM$Ą r2%bFadp\nHa4#e#Wc $i$yY=߁V\ɮ!9}b>wA#&4*ɻj7G:lǐ\G@ 7'6ulǏIO^@(ex=Q nFZDM`l RWZI'#8o DXl6H fD2t5?F "s#g2n ݢ,P~X@/$K}j~>Yw $wDWtUÕ˒Qr }%uhp~ԭpz dVߞΓ܏D DlDŖ=#x'߬Kb^gy)P\>Abaނ Q> c7?*egO D v$`!<-@t &r?Z$(ѬOs:.-i]9<ńq<O:oHE"YO,`@Ҳf6 xc|$@gD,aש]ZͭƱ,caaȏdX&ߙYZAϸn(*HL$KH*Ek9dyJ17|}UhY83n hA b.HJ!@m|FEWma \XБ]&>4`d[2`ǠduŋR|eFDz J'bD/_N`!WO'bOI"aw`R nH bX|;@׌]meQo__k% | r1\O"WkYCɈ`V@y @u6>䂤B[\&Ae۞3F&kɿH%O!V4`?%vs&=<,$߿Ɔ6 $ގP>u;)#r+X~o 7-창j6a{tω,-^4_I`|of2@W34^" } ]3g".tvrxM,@0JܕA"$W~vjCH-X&Kɽ Bm? E {)=_xqq^߁UQ3AzŸ09tH3K$FElVdp6mi,>sL<_%Uԃ3{cXI("H&țK7ޯTڄ/fE _*ZKm? &u e^Xqlh9C~hΞ՞>tбt#ȹ-d P=91~_漑~5eE) 4GKr1!C$~=O`v~Zd6q4~[*~"t6d˂`ofljfߣE\HV Iژej{g p 2PR̳+E>t筑?dޅV1x0*%i< yh2r`86{\HCp-pp-RQZ;={NWƽNS _`B@Vԗڲ<IrxQ9.{(6tAҳn)/ 0V+fc}$G⟷?sc.y(*'C W,]Ϗ/!(]_f?;--qM:|V8}X(JUx&O,8&x̾O =$DAET `F+?S4Z*Ɣp&B%wǍgwAth#ͻCH}J09ArtEkcݥI!%ZO25a ̅? {"$7d G3G{|"~p2.qbyJ.@hJ._s#I* H?ǾK8?S{їӔDtAp}%<|#%3`ф~So-Y/tRwnpx6s/}a|:] ]߳~)pR", ?xpC5XND!%/$;>H %i !.9o rط:H/,L{DC8X' bEbKiܵ٪[whm4B#Ad}6Yl9۲P&ٱ;@Ŀ,.܌f<}|Wkf4iɈE㮐IQ19Xj!~\ R"1~ hb wq%+Ma4άk~8J+++E8: d m~%svq[ܡ!:hz-p"qy^Ƌ*~w$?*r(zp~tP~lё3_/d'^lC8GV,iΈY--d1A!yb+  &*?Rx@I.gA#͸hNnϝϮ%+FhJRgόm'TV: '=WhΌZ2"sB(ac~0#GBM_(5К+4gD BƔYB[ZГ&5,#v=5%P} [zrhwG58MyDgŸ%$ fD<7&O,hM̾w ƶ g$pD85۳sRl8-]k'B[z8sՇp">XĒ9x`[XYIwjVEAࠨ!&I]b0NfP). 8CɱH]Tށ!kOXN(,`2 9GDm [@Px0?IJmDߊ`R1yퟹK|"O_KĄY[(qG`RD7-YOnjs̈`H7AbG:BhJub|j(N$"ggҍȁ5A RFǮ!%Z@*KR,wNSо7٩fљGNpoP)hL',Di-xl͂o 3GBHFňp]C9=BϬ'QFCt19tP2 qV|sx?Ze2.1~X,q~`&&ls]!/DRC$:EMx<"B ׊lD0O"ut0nÎ=aL,p,-0M@0E^nX#`\DL[f'gMp̾ 9)D{8 ##n@wWG A@fσBhﴓ%DV~-^h##䐀NJ\! , Atc)D* ܒ_7s`;(8Oֲ.! '<(/+@zq@ @P/0[‡||^xzoDe hc d _',X\Ĵl6|bfXfv̆fl+=pJDTN4\C cV>߽"W/;9KXa g??&`+D)'\!{?XX@+<`E4 eami%"'M E/!9Br|K.'sIJ\'A%n*>CA?nsp9A V.Iwg'w7 ``O6mF@ tK` NI&LlfljfӆzID%!`aJ^s} <"}H"!. ,!v ڼ(F2I;ЈPfӸŻSsp!rw9nrn0vIwQ-<~v9&HG-G@YRwl"^b0`KJ &86c6t5kS5",;WA E;3+4פV"(!V1KlfeG$^CǬH8RN"v ϳ W@d Ə U 7Sd/8E$Aw3Ȼ9N 6&O,6̾M<;?l8Hşz~/Ezn*с̎?to)CwSKn7',$JGw9zb6B5 $́QX9#&%@IQrx|JessR/YQQ}Q9. J` z3^P]CS-s-g ɕFJ`sљI{?׺k^7S~%}iA &AA-~kb.!}1!&7gz&XDyMp_jN{/_0<E 8 㥸 Qi  X%rMUtk;̿VmfM6t5m~%,j8MNU8hy٧:~n S%fS0C ?~sU䵶4P}%ţ;g*ܤDr"k2s<)aY>L^Ikui}p+/+qs\u6qyW-s_0JPb*;sճ>CCyx(y[^oO]N!fj{-+0G ѹM>k>{b:)8o5{o{_0 6*SJE W^z|I23kBPX+AʁR=XK><{|||ztVffmvcJ?ʬY—E/ __ kA6&a? /V/Hd!7F;mNmF?$ 9WJ7D|}ocoJb߿ߚJBB;ɭv|B1ל IakHZcb.1 x ;B>?DB|-:. 'p^kaan/r=s}^L|X_w9{h96W7D _[O̿'bS26Hݖ7SvkM9~!1 C$r6fU%_N^kO'o'jM6KM/1K;__뿶9[Q;9߃ΠQMpdZsniI|9{okI}vcKu! ŜHkyaϐ5^scyn{1Yv$~ vczWp=]UCQEZNttptpb9xg ɿ0hOF}Hp]#IOf==ˆ'~PO^k]D]]Jɖj-V=y:p@pIB9!x%B`UU7`-yd1|r|zSó;;!;J%?-gKwfI͜wd0t^/U5Xk^^ ;H_F(zͥj}$C3DŽ=#ߟ\m`Ua)QHȡ8LQCE1FqmO(o)~:(—v~Uydهs5`Q`ӛl#n>p E+} \h\k}XԌ<P1p[bݟnXp85⠫pP)q;)J]ٸxy=%3_ ؄̾(D?>-ӼHbb/;%,N>[Xy .mK7~񥺿5H܆kjf2 C @0)ϼh2Ez#~kOqMgT\ia??B0_E4Re }g)nSO{?]<\?CtChlN(OInz|a'zJq"`}D&5!@7-wި2xbk.^,]~ܡoٿ9+\$"@ ]S &7] W h3^ `ă-;}ɚ@ n=~ļDN MvIłAnmz}jݼ?r>OD}VL 7 Ag"?:_uv5Ayt(wm$ oteE<~qq_v?>(|v -wQȩ\NbDהh͊ ݙL~+$ q$Rq$̾yZ\ZB hoVn" j0Wv2"<\?RNد{n~19t>r("]e@'KmE)w.,8zj5a[yZ2FI=$x{9M-o߻f',fi~I"}7²AI Zprr,YCE|PQ̦X6;yl!qn8?<ߣց_92Zpš֟jSr1)"m?yyzq!>#fC"F:2'7P05ה탱w>Sy=C HoV$ˎ+=͌ {}KuڛI%p>W>̟GfOgpжJ#_"zQ^~lxdDGK^:ZŊ '+=;7Q:W ̿_<N^? ?W;ڷv lbn5`>`4I&g/ፎ,WMCK V٘rYNu07)N00R8 EC5?9>\eMGR1u: p+/!"\7~i  n7CH"IkZ(iK@~F2ܭb]E)EE/[\s.,%ݹ<{YyAu;3+3Yӟ&ᢏ O@ΌpJ,I/H&% =]5;dSm1/[ F#(>;M][{Y_nL$]t.:3#nJfE Y/osϹw#|s Jt!.Ԥg[YLTt" .{"כq2w%@ ""k6|rk"5C] ڔ񏈍u@ِtr lbi7ߤ{$c!EPyQ/'N0*ƣ2z#3g82#3:babtiCY` Z]iBwM$ R3C2%(a¯$o(jH`]ag8iO%$n"uڑ>F2K3(F4):2"\S'O+ksw(B)^rmlKn'#G&rz}0:2BI;'@3E#Lzv^4 K';=Tg_ =?~p)Tg{|{^w" .( |()B*vF-R8q0怱`.h6|k o`ݑS5CpdGFxW*ćK<n(&Fyl-\jH.fnR'^NIƿOW? IZmTO$ofW0tQ;Q0pҾQ\:*0]@vN9Q}l丝.]ͼQ?/g?\/7g"WPp0apx,\IdBkɳmg 2bגBF 9WzH^Ra ldׂfar@Afltb=Ad̈ݡuc1c>`RwĀoP)0@.7՜ϥfC2;_ISI}rg!d aמ;̭+`L &|Qʈω98]&ԥ)?J#_n0wNI?,q{'ךY~":Ĭ׸l]k!y4r|x|| v@ArAw3qeW#.f?߹nIH OƦmm S|o\]@GWg?hwx<퉢BRȑn?ޛ"=aa? (ͿǾ~\:yV;[ Ghs`Af';lf0M?Cއ60xXȇ$|,?BtGX|0]Pω̥'!p`Z&''vڤ`R4mSn%xAq=@;~VZ$sI}JO!/7(Is mI̱8ҀQb٘Lڲ W* Q .n!H(|C`BNy{~^=XHޠYׄ\ثcHJ%{-ׁq5?J =xz#`?YI ueaF!ZyӜ6 ٰe^0$z̽b{@t6&G|(#G\rzI "5AS~/~- ;'2yZH̞c-@u2ՓG{er6wss\ݹ:i9Aֿo-)Bn$s\ wz\;7j{\7,q_Ua#k>5#7Cxr`smWor9F))ǚ/pѯK6sƅkY`G _I-l6|"&hf' .ߠ^>Qٗ%zaQ"T* OC^LABw<)$×+vDXfϑ*@v{A=r먯fhˊ%ՉȻgjKMx?\W$T"eۢ8,[ʍ$`/̅o TI,L^RZo?5ܕTD ߕ8cPtf}͏VCZI=I+c=;çϑĕzB2 Ը&ΖAmV 7}5h5^M$7)aʹqwy@x\JW m+I?%J7U;>F 9T{W#dYV@z@H*ٿk_v=Qkyg W\qf=/r ) uVO=Nc'Yx>ry(x4뺭_ . $,oϘ #]}uSruB$S='Ryd~vޙkN >`và yDurE$ _B \ToϿKP(1'yO 2aymZJCެOd.ˁ@]N1*^ m3'\s'X0rYK&Ȼw’}0|~O% |T#_D!}tND6ВjX>Dbľ]×Ѱ}Ooc6KV-C!">v|O=Gvxa"vXN"Ű0/H8aVD`V^?ȿ;kHhL>\>o!o'kvz%ʮXzTH-Z,kmHxTrPcZFFTn%~[#גagmB76q}$w%peowqX)+q` >U[ ` ? R5$a4~%Xf }at4׉CK]'\' P3S;\IJMx8s#r$J{#=ᤗ>?|N A $+lf0`8|Q7p>m %Pك1ʔvwO%/Ԓ4& 1O,^ij!jM"9ۊmd遏Fz}IDqUP>yzpaQW _wnbH@\6rF3\La҉xf}g0֗@ͿTy-]99Ր]9f\tTYKIwj&ʷ Ƚ0XwS׺{RA@ȪΩٍ6V7zyصȝ^_̓W@iYN:0S7dr/p'@:AjK. 7x~Az6-|C`_XJ2IoV9 ݳ Džha tAgH7uaaA1HsG뤱lIc vCrtsKs2' D3#~"Kփ+MKj/K CnV2Z"щ"dqub"f\H G'k ED1zAץ悉p 28D;g}>;+߿H b%F8ŸL5 .߁;Y|z%F'0?g*MH'\#6Pp_:މ^,)&q FK= ~Lrrjr`8LǦmy0ZF>I\k'.ML`_ƴ| _Hl>7 >\1}@J@(UVY*k^ΠG6_7< 1o P #=3=(=0jar@gH`ajBxoR I?s:PI@z('2qGcb>#u,+??K-L`o : N57  !dqh݄~*9B ȻreC מ.x~W#L0"ƶ"dɰfioݳ"{ג7<Qr`=B\8TgՕ0.tcɓ^{yp<YX}#L%4^Bڱ!猉`!>,~^qy~>>ۿfpܨg8{1zkx! RUK},:@rmK<m2XZo^?"y{nG^=jvNՎ]<ޥa\,8AgH+lf[ޫ/~~\v>BjBR )!ځ G\g~0̕}dtf"@),pvw΀ 7)k;C!jB0;yttd%'mq@Cy[ hMk81^oiN[>Dߝup}o^}f5S@(*XJm"](oA˶?z\XȞ`YDz x TXXy(QәG;S%t_M@@N {xC:אDxJbиKC&}0{{E%+ ̸E Gz { CH9~%}`0 $ 6AG3{-L}h_?P*Ce|s03/hY.p s <2V?':HAW ?h'AfW H=Y|k$0ǜAx,RDj)b;E쩱y99݃RVS<-~ka$z9ƎplJ70O ?k3cpz]DZp ;s(7G+Yxzm1' s:0x`35C7#54~*]"|s){^P1+&*9WMY"@xQTB@P6KΣ%X:@<]`t4*O8~0V+wUphm0i!3x6Mp@Z 6_fɃݓBv_y'%zsKZ;G61C֜r-9FQ7BeY(xq #ՒgtnyqɃrmj _W).'AOYpȿk<d`f j3ωNP`MT\ XB8OaIkڙl%0W. u}jڧyuruw|x 4 J`*]X.XFrX")y}QVc}^5O*PcK Е^ Y9vDqdl2ppa%Xf y :la@ O4"gWo#? &=yț{޽B#] F[3H>L,s{o4R-?IIeZMyw/9{ Ќi ~t\fZDIҔBjH-X^Iw2RE"H],]WXq؎ #u9b}X{5\1$+;T@kV#;t宖!!{(y+XBڲV_`:zuXc&9`&[Cnѳ&1<p[p:\k cXǕmyNX(K"`ɧk=CXUGP]B/ĕ%|N!k\`k-]?WKO 9dH qP*߫skbg|$Bm(ܹYNmECqK:@=Uat4@Dpȝ<%w 3D'ȏ7˞GQ‰9Ē#;2:w QsQVZ& E@콝;T`$F>CY<)5%/%>Zl\fZ~xB;"yY*3$-݄S Xβd"@+w=- 4K/0ZēCpxmOM#I``Ҹ;Vci+]>{A]Lz\i"onݤۛrA;vcwu}A6&4)L*g}kgrnuE_%H]J0K&,YdJ='gYVg*<HkɅFGۙm*@~X}+"n b1_CA<3j{3*fbۍJ'wAiO(6n !SS*;f * :iazBK{U;#.j5?'qض@o !Ϯ{$$x3G6ؽ dkzK%P!zytdR L5.I"KýY`ߞJa#=6B)9 &E6{( ̘y'ۧd:ҐN&\B {Y/Iy`t4)?kϘ@깲e/&vz$NO_КTrĄ\>JC&R<\~}%9}M`I`%ݻ,%Mw%!: kX{ZiMCH@(9%UC(^J?'@ A$J#y|ݗFKɻXb7:3FC"KV0UFϟo}|o=37Zs]G 6 `yM &G6"Dd@+xd?y#}wiD)&v0$,4/I5ǵj46n5t6\:GJn~dp6j na{cm"uIl h]JArA CZuXB*62ǽ|?(DN X9r.yFCҒ<$@^N0v,_9 @ݞ=z{9>[a &O =7/|t  .R-1>8]tRA pb3A*v`.,$͢>^FNw@NXBFLFfr54ef;r~N8ϓNf2J՟z<$yAq(ЙOٺ`=[|kG\ở7sUg\e \K ǑdY0&|!ddߴ=闈[ !J6ʭJ I[o,|muX]{@XzG@ _8;_O٦.*k#*\;\i&w]hgb7x6HXCC61o"J. &[ln5$yq"?b$$D>a'sbeVij >{rb} uJ 8D9)`<PH!)J"X>%W`s9muz&Olfϛ- -Y}9@\<]ߒȿ˜dQz'8"L!ӔL,R0zvf@:dAeϋ'"5-7;ȓjAJ fhPH2駯E VPדų;#ʃ};<,G=S ]yJ\- DJv%dX=#VUn};)夿闰UJf !!i|1˜H+n>nX_XgXo=(%g0\пW҉}#1a1`P Om<%w:}\>pڷAr~ sOdq s3]Ci!,p5 }Y"bYDt˾?" m]At6dD)?! x ؿرړ[WЎkH !&;L`@! t\B^43]?ÞLgA>Z@+l.U=_hi/TV /YK{F}fc$xJA%wԧN*ohΈ"IAEV(FAxC KbYC&\Cav!yEך NƓzmI uHq}K֩ѹVk>>:;.ձDO.qe;)rƎkUse0ool:؜V\_uj>28~v $o<[*XHא̅3Hɦh?Isv_CV}F8QC0ҙ.Z3#pFuPQ$lD2WbXO㓹*y6@ID`q`{C#bH^Pzo_da[N\3>_m`-)9|"+3qp"*G']BQG}9_9p_-Z9~~<l =3!I*zZψDvl⼇{T %O y.D/QYD\uy3=0jaBg v`ssdbVUغJĥ$.A>s8wFK'% HGtAp{_rezM㱛yR9@gɛ=dqC;b h$K _$דĦ4pZl"tgEN %{HPtza XxsĘ];{kw5@ tb9{|ؐN1\9ZE<U;k"\Il7QO“CYr3\Ǽ' 2Y=) tث=As°wCmԝU_E 8cE̷ҵX4ﴧЄ]#U֧,w\BRR, lvr:Agr7N.&=ma@Ӟ#Eo~ַ ڟbnd% ؔ> 2 ҌL2+7.-˅:B#ӂP 6\~] )逸:K+b P|r؃cXa&N]qI_y:/h]{{$D~/ hT.łC:LV?jZ@':Ldn"]س\G Smdb` -ͱ x(G#^v;݅OcC'=&?_8b!7|LVsWzd6G.S77)% !L$(ZB쫩( =S^l~7=_I" k_yBsqĻ |c+\:G7zL5V6 -"G$ADdDF9d| Iɍ<ȮTocl=ڒ_7"Gn= 1%Ѷ/A o>gx1 e\@(a`sba!-!APv[痙"-⨅+H?pcH)ʽP/S'h$SA1*i1 9UGy-,u3F (A{x M:W\jZ;nU6 rc퇵ٽa@2TC_a( ?ްx`HqCwn(/ T" ?YR#iѠP';J&#Bo?nRP>!=&L t> O!sMot(IQKyYoB~7b ө` Q`}<1fY"*6!`y" !H n"+(]ƅ;Uɽn/3f^' Skf"~Ƭ.}[ƀTKs#qz\ekp?22ǓT3oڞCԲ)[Ő{XWE#IErOxAWt^ijھq<ϡPA0)+,'u%@3ﷳPc.IZqy~耱dj{Ytc3 cNoX]}y8O!qpA@l6Qve4n"??{~xH bITC8Gdk4C@갺A뛱`f|rGOQ'8\N.ӅS0I_4_]_x?q3G" kŸ2^~Qր \V1\B*l~8l!ra#Nfkv[ٕ܈ͣ#"5[dxMeH[9ؙЌ|ny=Jte&|V! IcB s@X)ї<-أef3(#No#Sǩ̀炟MVe,#uƈcUhR9L䆐EU~毟C14shҗo5yɚm$~V?{8Ry 툎;Jm4O$-6}l˂f ]vP0X cNoX]y8OH.\?rJc@Lhkw%V{_)!rrdker}m΢nB"1=i7;cY8QQ~}Icj9SDРZ- _`NLY$2^#>11ېFΕJ֊RxM&ǘl)E66%qme:auvUq zca|L)Pz۩A#:g͉r!KwYu"BކIg p&_cw,C3{c @I=iXƣ)If. ?!Da9%K%U:~.! NBH*5x爯ZvJRD# ~,$҈c|{1Z^M\PgsDɾ;˾ ͓A#tUad[Tn"/*K@~c D u_4vzwr[s2)슨7cRITmˎ'2_8vDR,Ԇ~?t~_5:BQ8J<,r-ׅ$N~ʵl̈'ohQ=]߱x5~a|v3K8L捼 ї!_\Dla&vnD.\a͇>D*E7T},^%:/>) f͕0{ -;F"`H#t;'t 0 r_"E}\f,J= 1 s;<(+yĀG V5SׇtK5oF+tI0iOQQ/(#syV(<Oեc+$Xt΃n[6RF틱*1" +6tǎ)%M+7$R@xr"hp&2|9sY8֘#hʼnAShs?pd5{v}_G~a>(`ήuE  @!b} 8( I0CGx6+y_uڧdn*;pRqW' p2w-y_W+?zzR$Z&][a kɉ_+0+$$Ruxwp,\ETRovN…? s_s9 JŲs{Ü#Do}NR^7 ,]-J x4&yrPh">jC#;sz]FvsVzgI(lƊ5¦RFlDn9r S w12{E&sykEePw4#ĘO)JtD µ_f+}O= yI @ 5xm$N&#ŃEIn) ?+N@77.g8M"@Zc\HӜ{?v}M͜+7RƩd*ٗpEk I|,HNg?}Kj:O*+sMPF  w'1?l"_;3b E᝾ WpyCrp?l>[rP*:$Q:^s6sH_eUg,gmS=/RBIljmJ5w4usI%a{YF  VVYٺ,vd;k?ZG#cՑ+#- e!I;ĆKw~n&sصt>KVgŸVPV\+'#H`% /QA~ C<ˉZ"j%iDm^ X!Pþ۩[쫙:hxflex&v\d "f]&X 8"}p#; =՜Cb\.{ 5 _qp^SBAP:Or벞UB髞Z8D+wg @ M!,Mm\D5la nDnow?l>=̥6}xM <ҠGvHɢ}W7 &> $#}Z~D^`_>]<N$6>ivno0xgl[ߨg{Ej @/7nz'ќtGT\#ƌS)1f'rd'>+I(% qd"~ kE?,HV=*X1Q3 !/Mb>/r~.a?> {ӎNCfy@N\{Bs\9X`gwQYU]? bN(KS#ӂȻ;k.+ R" AfIPHJ/tW#|=0.A¯'/'Mӷi6\D=l1.|ñy aA|ZDyI@H;YDq:N`*ъ ˷^@$Re: u{#~/cF3"2}?lXfd ;F2tD6uOmU.Ocr2̀M#}_#6m< ͭeе-3GRѧOjg&8Wp$`Hq8;s8=.lKJcg\U!ʖ8 ՜`JKl$;THփ~!b.k;HG]5 7tkʂY<ϒuҊh8Sr uk(Jt\t/WӋӞdj'eeZiQ0Г=R ]e ?R$%jM}@} $FJW< `j!ÿ@{~L{l~yi "0nR@&q 2wwh>M]fdgo ?\(JRZ I9f8&y՛囖uu}[ s:O* (25xL-1*{[+X2yǸ!;E6vxউZIk$V QHT҉OץOdEXC>6E˚ǒ\~N_WE3Nֈ3ngecA[ {wzmo'C$IǦgq(oA(H!-R~y/mo&#*&` z( n;v|?Mx3p}l}t]irERC4D&W8G+6zxVH-"KΩ*9Dk6٪M"nMdr0W#jKm\,)B y77.?ů~|ͺA Z170n_8vQhQi"@ZHl14\$X/zxPrvG'Ta3%Iijtt\8FȚ{Cp߇q#o%4eœ'J8v ,V)T1fH.3 .w^Ϝ>bIq8=n27?l>n{ Zo/on4xmz;6TQJ @z `8rgġyl2.Zrְ6 :^ƬXqX!q<¯c$>l$5z O( b|c6"}^ÿ]R ?}ׁG |6f+T7s$K\{/$323 {|P gV`E@׆'Gl*_G ؕ;2W\p4Fކ$H/i S G.*-9UhF )^UoɅR**nhZjLwɿ > .4l1.w9"aA j>fcU6r'k=7Q!0#!@\׭3x kzʧ3Z6Tp%P]p/M0B!e H4D= 8/t8)0oFs`ωg{urDMdGƏ?sE\y֐AFd+pWp+ +x+`Hqq8=+j&)0 /7l۲ N2ߛ{gԁ)'Xo^<ܳJQzpz37k_Mk?} :?&i*8OQIt2\,/Z^r!c5?'le*cipO&qq~ ۏj h(cF8&=i9.ZMpk#WE孺txy)}1Y~~~~A^/\xC歾w ?m=ٓ}Aju* ] 0*W{ [˞\tI?w3pBAos-kS)77OOi=afA~s.⭀c[AC8|apz|>_ K4 .\6O+p; [|Ud[WٯK)>%@G St+U'Q0%JQBޕrV+ݚˉ~?#C??&UA)Mpf  @ R'y17[(ף~ʀM l|ւJn'\Ů+s @qk)Q \%b̈F ZZ9! D \va 8OOOW-:4u\\"ꉿ۵GW*d?=le9kCZe% ',u24w7{KC!Í} %EڼgdOh"GIN_/'v}Hi:¯Kn2 R4_ QFnS1jI\-fCBduFh<~{l壉NlD25e!iu5UĘHP h[(Ͻ|Ch$D0Xg'?"~Uu aJ'QEzvǗUy3Y$xO}jm*9U\`APS+EyȒC-+_&RȪyN5eK Z!ť]0+Xyx,BR&!Npapz|>_~zz SK (7KRNgDtoV@ڣ+ehs$oĵDJRy\oߟjw;C;AА;c9+[J)j?WEQ"?pj+ޖBטO!/ W^ nx "3%b,[4yo1vLY )ڞJ}']g1/\ATmUp}6#* @@ .+}_Ϟ!Y _Ա/8FE(.)2[ >o&gsRF;csCn]C5\Y?7*\ .$lгTIai:߰ m=Pˆm9qI 6!2`H"@eh$sB+)DO1Jd?R ?ߜҿ#X>6,6)0 2VUmeBl)2=O8 GƄ`AH"e ȿT"Z-l}k^cQK1#ySPLDPtXǒX׼ՒCXO7< K؛d|2T>bA$|Gӆ~(xм:]+3a!#I;cÝs݆͗m=ߵ<ރyk͍/DDvzb z"1 p; [ݭ`"OɭӫLMm-Ag ܈̪=uKyz>RAǨ FK3 Ri /}e=f  ~hb"=@SBXN Xjw/EO+HB391#e'؅ @ݮ4֝Nftn@W^`tY\=֩xZ/嬡_ޘԅcF g }p0{}߹~K A)wd= q/&S ])@wEJv\:{ش=n˞vd9Q^_Rt}1!ER m ȾV~2B~Eaz 0ϔ:ـO$-H?B" "h^B/gγ;5묜+X2yx@=K p8M |fc0wQ'66(@-?'E=F9]TdNMOOU~d(|O_VOGmY&H%*cFr#P.cpΎG.7;ENm5fd&p_x5F0mDGX֑Z.c sXV3].*?G;PH7"l%e|`A %]q, |~1ßP+#>cyC#zXؾTl> ee63Fk nہ`9ߜCDȯf'{;-l^d Vԣݡ)LIS<ɾo~ÁkRW' {Zzcs@lbS^!3d4" |:Šf)AcPb3'fjK+pz݅FY*$1i4lN @_\#TeRO'O1lʍmDi&rVFiIB@Dj{>A')=86O`a4sfp(ƃz@=d@+2:+7 q~:===FOb90 cq0lD4( <˺X֭|?;Ȇ 9Mk~p,)P̳0Ϩ'ij[XylhHDXax*kkG pAb6Zr,~\胯׀Y$o5簧z_qMe=Ya~5s>^`}b|"[\bUI>"~g&j?0}j>B]@ 1.L#=~ںӏ?Rl(s Daʚ@Hi~ex#g>1& &+Pd(v]ả (fj)_txsrwK6Og) Ӱu8>_,?˚5'BxyF]TL_F"f+ oFP3JVЦCjg `?ïɠ&0*@W,BĖ+PM>F@} mNMZ!@0Hza2E@? HsG 1aEf5h0NB@ǸЕZs˚(n2y04hQ_Zgٱ-kr^Xe(L \\#|xhjs1 r;ihh8B!53٭ƎwZRBs[uOݹl>6~n/9= !u{)blȶB Z)3fH @ װ]yg*L"E!D.#=~u*sFWsmآ<ߍsQr\cs+LDݮ\f=it|Nx}JQ_ʅWH̳smX B[~ۡ^?3] .$lEO Ӱu8>_ͨpzز2IhyWrNe~LolhwABxH%ߺ-%5~y$ rV`'Ү^/^;5־J@4TۡT;k"nqcljR]Xryg$+M FF$h} ?KD99BkRb%4XJS 7T@dHbΖߣn~kt\C`{X_wFSr3 f*D>VEہ~D`\ ޡ-fWswFo7\*]n^2Rʲ;ߤX{ |M cz}Sbt3˩j݋$8\,<g_|<^v #e;ٕYGZv~ghxܙK Pt@tLClFy}>uC4.J鲜{wNܙ5BgcWAw`, ![Ѓ2 /z (#T@f CbagD*sG@Wpuyx@  i4lNϗ+{[Xcjcdx_QQ3?]ْ,92$ $lFBM ̢t #Z!+ d%/uHU?c8=)#_=98{ D޸ɞ1K9LW |(֑4jd Y1<&8sYO!O1cr3r-3|.G%} 2g S|3W)vgφXInd)6\Ciw{u(uH4cSul\=L wr)J2rpCR!pNGuwQ̏~3OmVֳ!(Ӛ{çxzψ;:ϲP 8ZgAҏח!]d=:3"a8H=FC8&N|Hr5\j$gĩ45+ J` 52K"K dxu{?Vd&m'5͞tG=^xO9zT)Z!#㛛a{ў d^9f0 3fu'ZGͻ\D B8&h"K9 [#M*{[KO(Q gd0I$ÿlixȣn0PPbT@|5U,},\@-OujxJ)p f!Q`p^vͨKbarep`Z}u_*_|;D1dMC>+X*VnWIQ3cpH~06@|YvfK2+Y @T˂}.d@W:S ;&:r`(WOCU9Ԙhg.c#ũX2Kzsc"RxPs0v>ȿCM=;@d x#;_x-Q0<b/zS[)܊X8WgiY4W1~3x8 .:;pz1*EӰu8N>_,.:}o=ht"Tnfʵ(Ty .0NG# JDdJu/ʤr>,@9-)rC,7ϺRDw1{8sGg zٛn۠u.# ]#R1 $ʍIlz/q_l&>w՟dCؙI~8vXIMjBӟ.d9,R@߇`|S%摾fj!o)jlT}sZ |3ߢ|*2N,a .6OƨB8fNZ | J{ ۑnABУ:8Kae"͕sdl2R~֕Kq!\=Oy~W B&[Q/8$ /.Ш[" 1F(bd{ [j%Jan>rg]R4)j3zЖG2NtZ:/gmg ٿdccYY>5fNnf[XUoxд"A OZqn- Ɲԉ~5,H<U/YN@_`KЙP yW?E'8Cymmf4`m ?:E^ sQA\8 ' cT!N_/apz}!m =أ eo)5np:অp]W?\N3gkT#@Sϗ0 12}[n_" ؟ z' A]B#vT[D-TP󖦩bZsF{tV\pS?3`@Ǒxrpk>=vvryd#ɻ"\ p >( pψhg cКҗhB=\~֔ =?% NW; 6GQ@ $Ds;s}^*3V3 NoX]=yx,FrL`?9+|PpGШQu<֓2LWHC4eB\ؙ 7F <DdeSBz`dR{od 3 Ti6.aU(Pm V,럓4lp#kx'xV#ĿbOcn i\*,Y>S[X{n,xd9PОg.g.$e {cL i i! f+7ُ:ϴP̟Ά N 2+[ZY?@7҈c'edt=Ggt2%>O{t6 FptTgsƹ+P>KӁX<5vǹy!'"!%}k=eqg.ݒCƃot{y'G햃Zg0ׇv:sqO_:WYw(o ਏnvy?(nr:[eSa(ZᾍtHWlerg(p1 {G9_0GfbqaDA\R"@i:^?a_~6PgRU1 *ADtQ-'ET@AP6߽ʆP&WED8o$A3  "mś5xؗ^JG|wY-2X9QcOkY(]5D""B+ĀDAMhhĹ]1s~ ?0Z\s, =RHzml^'T )baC/0qvJn5z'#7ge4Sa^yO-zkn=hp7?e@H`Z%jܙt:uPxn:W_=/ M =cr)Ss-盽q|Wif hB~K7Ɯ4SMe9Xsv`?84/mKI05HDwP:2p@` 5>ux.tvߑId}I?V bt^(@B4TY;t* ,x_!L$Pӽ)蓴!h:BAo'vA2Yoη$E \nw]@GhŽLQ;Lm}T[Q{NM@\z.Z+˴x͊s4RLsz[\H˟_e5d]>f7( -qN:3|nBR 0pzbib$EӰu8¾.觼Jck! ]*ޮ) 4vYAFdҭE|ؒA/ʵl8AxJT`;=>,ɀ`XSS|Ө &_Dzi hqp~F?@D siQrAsds$HlT*dQ E5ې(zqn*hz%` T´"Ts!8.#0`j;10%2r@Lxy׬ݑB+y @HnY4v[ b%6týn6RMeSul>6g9^( dw}ic,fʸ\+l( KVp8 [k)kM}E}"հ!i*N5GoEzg-+;%fQ/LNf+ //@k?%u]M N"nֿвFi8G1;Zoρ+"-^ N ">^3kPD!$"UkGr`-jD<ʍL*'E0(YDn x0lT,3-ln6d$< ? 'SI 9zm]>Um:,Lwe].ެYw|^Cg.^YwV1oFlfgt6pSٍ 64ŀpI!N_apz=}}g# s .v/^=Q:@= Gݰ1(QَoBT5! ZT2 qDi#)x +^l>VDH*v7G1־D^)Ȭh5%jٱ'aAkW}@ Ho (|9UxȺ[MiNNh]lE FQ I !R)^Kyo0Wʔvz Hs/Z<$\E`D\"@i:^Sa_>n 2uàJOk5v4E{q3D犠 `9&\G*u";rakRHlN@JBkN E(el:y/ҿS(fo$کsb cqVw漮KBT*#5_uoE&ڡmr!sݥ]fD ilٸ{|,` GLJf~ $Wg`>muoXP9ie::݋4@Touz/~~6J3ة5ﱢY6Ӱ<Hh$@ܟtYLA8""yx"@i:^Wa_?U juia@"EpƃCSO+7H1>RtNdΥlz 8a'"-4bb gHNXdnZ!0O?eId:\kڤ7J஌wA,i|9uwbuH7ԒD]kvFuJ@E 7ok$2tRp8gƝۙ~<<)RyV^K: :<| =y 3)l ![s&cT'{&YS7g6'ev׎>#I*R;.Eɹة5XњxM,١EN B uF>£ZǺRp٭ܐhsx׉#b:uN1=yb wwv>h1YqXad PAZ_NͥcP#R>͉ )C5[ 3c>V4.[ږiTAB˾1݋n {&cuz4Ǝ&H | ElTda>Of|mb,vv]ƊP\KݚL=)e`6'JAi",yxE Ӱu8¾fu7V"Z +<0Aז72d2JEngk*6&8% ^Ȗq5 1EG0ӵ5^@F9cSKE-^%Ӱu8¾nu72[?]@W$;?ڛHFHc9"l^hG4.,rE Ӭ{F*홈 jˍ@F(l!@0u`ibK߯og55_w0_FѶf[DvPd7.]:@05޵PP1BF>Gm "?-\Gˊٯ' fC ż%yoD+Ṇޣ<jwy$6tU5!eGaA+ url *3Z.J`YZd9Xe{)=V=vf2Z M-#db$YIGbyxE+Ӱu8¾vu7,o+Do@tLikvilD ]<.,`cB[]{}"?(﷧s(^j ʴ.Nϵb({i^$pCXKyXX2VUm$H9a{` TjW\,6Oh]xDu[ׯrS;?^y!UQ}rZቈ!w2@;G̓yoҌϏZx1y~;Ed'65nt[ fE-1E,nQ#7h^Kk\"gl8p B>HpRqd9k?5g/g;4Bhu~v~J2k}B 34tdoc.`Lb: [k.kX Ћ2 A/V˪=+wk,z`^30]Bgj=h5$4.L"T\-TBi94$9 DdzCs/f`Qn Dަ%yCDbNEKNAҮD $yC;ţ=+EbJ>Z==H0}{OcDֹfO7f:OY$o%#h00$ƋUBs2BkQYVjҋ '_{".\p5uy'=PaBFYꂌzV@<0SD 2mZ-c 3ۖae%;Ȧ:W+#MJ !Wp l( zK ;8q4lNc? ۤRomRx.&Y+i̔iQvf&}ܧlљehb->{(?:>} QP=[|Z Ȕ>G%6փXjs喚Cɂ+ 6O Dgt^rsC@*0݋@mdo@<)7Љ䀎qx-^K쑏V @~[y_ NK6m F0ċ τ'!Oy@P'_<ø߃udHQ9A20A^`j7BgE6JCԛsB#pO@_h9'p)AD}mAhSD{R٥Pb:_&;M{CKRo0AH?Zk)KQ8E pRƻIDx\?8)ИOH;3p'ųFfƭ[@ܧO$o3w=۷bعC;I4vp,E\7K4Y(XƚG%Mչ8*逈3i\D( xKs_BQN? zy4/: GD:iϑ$ncQ!c0i el9vA_! rM*ngj;'Tjegv뢑Txq/Y}4qѷ >\ 7%YI*I"1?/E ??rץ˚qKC'̈Tv}o{,SKzzjE 9',uٳT`4Ͳ` o:O4\A~z"^.LJ>z!e|o]`Ah ڙNy[~~yS-]Pks [ѽ?׹/`GsyDs+2-_%9e0oX:a?oo>ujwt\{SCT<9u>sPr̖" 5k$}.([BtlN讁.-+e9۳Uoegs~O,u܀Ÿ hZutqms8uuMT?]j𝾿it9?ZQԬ4UZHjSt"Д6V{ז PR${$Q5Dm).\HMUY :OϭDA.6EFt)XM*Kb v *0wD4ʚڤ:6ɿ?}_8Ik|V_סB>%3<Hk;t,qDIJÆs;S-h۹ 9Ӹ~*oq߄ʢx-3\ۊ^Ҝ*KRk0v>=}Cho,"R v9Q@ћjupFd. ݩAb$ rsoK7 Zn}ε7+L( uo+s}to޷}ϰvE|'dDsxZã*`89LE]IfI Rtrz7%pi6o8V66L NA 7ךi& Х< sS=}O."yts: >'lˣwccjk+OV^rͩ遀^aqtV/ۥMsϹyoZj0[Lro= mzFk JN>-ǚnk]`G&4Fݰot0&/&S76' ̐lD6%}G mR Fm<^ǐ\gYR_{\W _ӋPOi{ڗWb4gO@G߸gt{_'i0/%'*M>->q{'/?tXZdFzn+_YOI{GߵgtfYSH6gnѻ__WkJ/iEjzv'7|[}ʀn@oe@Z Yc 7?LgpYoܵLOcK{7g=0zo z85/lgu"k\g߸<:>`W mt^BJ@ sR{D~[Dbp%y:NwܲoxF]`YK]3:}/S/=0Zmig77m$ ľ|k6=35ӳ'gPڷf?4K{tLBme辘*GZgIGֵ\+z^m_] g}?040gܝ~]K 'kN?Hkh'7:3oN"<ȸ?3tR0Nvj\բͅ_zuWT"OMѸB,zvKq?/ϴ}bAg{ҭF޵k0k=rS_/V_εKϷP_̘O'9|P/.c 3RoW !|>9L1ҀS"na;.2.:ֽ(=?nNJ$ҵ~w>i[G].w{=l5JŻGI5_ Ӏd1ݰwF?ϫt/x?P >[wI~D$B9qmLlhj;bw-{#zv-x>(h7G%փU;`Vܟ4orzTq/+ HUe}O0$!UHv2}tZ}ʣVI,K+5{G`5d7'N'dLo* ) )|" M%'XX.txуFou`G~o_͑#6?O~6?4{(Tiݣ3w]unen|_37ZGjiAEgob}a__c-'W/]8Z3JH#\в9 bh[9^ct1y];wNߞ˻߭^ќ{@ 0]Tnr(%o;RY^A{F$c~Uj|75Y9E[x6oM {!y>:<ۢS-xi=w'?׭ H1M偁?0Pۜڝi %|KNK+^޺G) ߜ@FdO]Em}._VU3Y.$cuf/cWl;sfܾ9v=ݣ~kͻݣWnf'7v7{곓NHYor3_J/^ (pTId蕻vw$lmgW;wNW =m-4dOLf>kٍzśoseq?._SVt3g@@5W8-O'$\nniݎ_gޔoI`*\a{voY~ݞ}NȦ̗ĵ_[iv'9}Z=,ozF?Ua|zˬ8d?VWȰ?{JwxmWSz`9޷hNV @|9f jܗj4[=҉/߼<:s6+P7֟t+71D]Em}.?t~o/~j 7{~%/fnw .ofc÷wߪ ʛ8U?T'!T>ɞzI@@#'g;zkǮy֑Ǯ/nuUz9.٪5gSv=+ۖleiqO??AsE\_GjuUv,䁀ɊSgmL)QH~P}L[Zҟ~_S1Th|h_J&ѫw5b_w`|6r1+Ky?y HϚ*}dBix0Zov?yTvv9Z3ԟ?˯}ۭm;Bu5t[ V k>n'hkd {NAҟ -_Ӻ;XWOZ_Wk>Ҭx}iFm8{8sW]S^4`{Boi^z>mU~qwc44f{PJ^9{;gZ&/rմ5kSW~=,O\Ǜ,:6y\Fu}vs"u5\?<J߃ٗ/ܴ^yꋼ&^zpԶ8yO-8ٚt*}ˣ\{GˣWnS9g=kIO^G=jY;{};s遁㓁<(EHv@3(z`@7@Rk |MPI ̮]o | @l&'g̯ZkFE_ tIafI/9-{@Kev뗪yi];ےLה,2WoF7/d^\;g~oNيO)_zY-[SQgWUmf ZW}7Am:m i}޾\Վ}< \դ:#{8CeX/ߗrFo}vq;|'^>'GW3<~9N7k}w:D?\㉃"ZuR P秄o'=ͻj?ωu\OL{[d l ՉΓDgxO3@sYfJ[=fLJFo?0О?ηZ oOZk``ZY5pO|o:P29ݯӻny0lUq՚=v5\-]{zw^;^ÿ{O}a]?ueTӓ7gjͩ ?j}/r#8?z`4$'9{跺fTO}/Ucn |}6$r<{_O6e lV(4+P3 DrB_-/3mV4R{pԲҺc-yq2˸ؙƒ7X37Yfn]sUs }'KzZޝmW(s۽>jWl],G:DZtl9;pN=zyw*ǦOY9˟3 L j uVG'[?^0d䤌+Wяk8բ߅ /w/WcK}ܾ|K3fG߾Yb$%hWy/t;KUϳ[<Qfއ@[1-})of|I/Yn~mR^fWA;C899iVk~յ8Оf/(6ŸO5޸so+ZR?=>{9 " uK7祐oKק%vקKD}u%fE^ߟK*VX]) lZ%Q^Vϳ9衵gUe_UsL_-j+czW|љ$h>2mW^TߛR ;[ S-:hskxC.>3Ӌ|e?{UUxٹoL{Ӌ[:BWTEnVnS[<֏'7A/5/oN}VNIa jghzgJ?zUwJ#>ydv|vc,Y|[~^"y$s KIg푐i'H3o[RafE"|6˻"8Sz65*>xܻg;+ MNY=8 ϺR ;[W-]Em}/3'.߽\oT= \lώ^]'lC77^~ٮIE-<2+7;~;?b~R;m99ϕ'LǛD>fÇsfŤ@^WOժNɬm3Ew7,ٚgK'Iv^==% j1ʩoѱEE_ 7?%?cyxucw,vS.`~~N.{qWU I$PhcoKgJ!Y'/N JlLWwˎ Zv*:=OAM ~Y ˳x9<ڜϞg,Jo@R7׽WU~wLyb[a``69 jiWZ~|t3==W:f||솩Yox*_{nч onlo ]l$#vF0|b)Pzy˜K/EReo  Zz9G5Ǵj</uonw![Fϒ,{̭}XmjS-n1EE_ Go^%o=:s;L~ᖩˣwO',ΐ?<HS^'%y|@~}ʯc6L+C91 g| &n=>dF0.6Vmr櫖[twGi G<,ggMHvfcj_mfċ8ҤEm}m/^O{ǿ>xj7>< <ˀWv[0[X!{_ l#hՒ'Zg/8Z$܉{c}}/~1~o8X'K`i,_8Xi?e,[['K`i,q0׃ _ F*3ߪ%N]E_ECL l!P~Ye[d`'آ"!&6_?0D2KZyɿ6G+IE?} G 10y@Dj)>YEڢM? 10y@bDj)>iEҢM7 10y@6_K)^7֪kuS CL l!PBJj)>E)-{g/`D /kR|2h6CCL l!P"&oUKI-"-  10y@ʊ~%cZOn/E_6Z䲠?Gl] 1 1l^$\8sjNW]Za 5gd3oV ik')<`l❢G=bcV 9n-<`Xlv\^x٪$M5}ak9[5yࣿ'l5g[Wx1g\]5lm[˜@=T<dtl=sjT|5٪$CQE3Gx5g|G%<`kUH%H[ߜ@2.g lr?;Jx1gK19[5$]ώ٪$iV il_sjɻm+<`{UH%lKߜ@2/g lz?Jx1gK6v9[5$_϶٪$i Hْv-: gK ٶ @%g+ ` HH< g[  m#< HVXi8 g[ `=.e$lk\& HEA?;Bx*0 g` 0 Hq؈ Iq06t`(0fE `$MPP&(IJ (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< (/< V>$MIENDB`teeworlds-0.6.2+dfsg/data/mapres/jungle_midground.png0000644000175000017500000014337212140200333021706 0ustar felixfelixPNG  IHDR+IDATx$Uըːs%$IA ("DAE=* $AQ` $cD CVH̺kY9ӡ޵vU}|:ݫTuWW?DDԹVO`""""!ޠ=%۴">\ڭ2">">ֶ߳ HDDDDrjiVvlBsQ "ZAQ "-=&\DDDD!(zߒbvN`f"""" DDWkK1>ENWA NDDDDsh@DDDDruTs|@DDDDrT>oO >o{ grDDDDDswuRDDDDDs7Y[U׻NDDDD5>Uj!וf'"""s*XDDDD@QiwsHDDDD>nG3U[\DDDD`Qn_'c@DDDD9sJ-)}""*o$ GcADDDD9r dOxQ ".  }""*Y1!"""!@DDY{\r?.DDDD4$PJz^dž>PIр "B,i?6DDDD4 (wK:%DD6.HDDDpQRX\( 7.6Έ#vlj>5Ug]#<״$h7hվm~A}"jlKJvѶp?J<kkgji{hjKzG|-cXQ F6v~ R=/hwhk'ji;jk7]`Nh$iɞji{&0Q Fvz?evc?)_o\igh Xe(HQN0}~:}z]6׶$ax9Y%͒?k!"""r}"jTjpE%ֽ 줃K-sOcr9@~/<퉒˲~ADDD$Q#%}YSa2ە$ٹ쒉E r iӮ , :. Q ƴ6E }*]f'Kv)¹%r7c}9Y%;y|xe """DԈ[htQ8 ]#O4הUѾ+OW5,Qm@Dh)'QKhO%eS%;oga2_7V%cc]\Fs qeC"-KQSR^x^hk[hkS s>d(JUk\"""" @ }|<=@vՆ9G}˜( JWIv ~n; #Q 4*s #͎~}ZNo6Wsy7 }l]fCx= Q r.'1 g{<.Ux]χΒϣ}c<4c/vR5HDDD4-F ]=٩g߇yB87Q?;hwx 7]5HDDD< Om(ƙl osifq[OPC&A"""@Ԓd=jd]{.|=sg'8t"""jq95ASws>6el[ ;Mcߦ tN7ҽ<u$z{32䂏OQe]ݺm _DDDDQrwK1v|#xrǦ3Jeڰ:l#C"""(@Tsvr%0{V^,a;ҌC|hJo*>QKR ,C*ؔq`ΙXvQch-QiLnr8f#VԊOva;Ei/8 -PvpDDDDrsUNk[Eǧ g{aUʿ~l]j&""" D5'tzl:<;H="F;XvȢhm"""@TC'J88O cfyRuvY\8%D[QJEYN^]ccm)fYʟ)\˒(xE'޹\F{b}kF77{Tʙ(av' >=C{z&"""D{PQm1=>8nF&{zZG^5 u """D;O9$jeߺSNᯗM*χsQ :=D!e'[%}MkJKk~<"wAd͞,DDDI>Q[3!¿roZUXn-p?.{>n\DDDI>Q6zYr}O;Y3mt~"8B(LvRm={5[DDD}]-/SqU?k dׇEa{_:9s(pv:}¬ԃ%s:}mcڰ3!Zsj_|h(y4dGΝDۉNTdca9hHvЉ_6=%SU&,E>r%]J`V""jH!mV7m~O x@MlgNo~lJKҔ{RS;MΎlONo#}ڂsv 4G%= +Gѣ+zI-%;ѴoDsik{INB<313>t@SطgXS3SΎhPH/| W "@Q fd {[_Yֺ,g4>όx@=dl{gb ,c6-N`v""J<(JJ~Ok?J+$0{L/X:|Rl', qB~\e}Y4ʈڈ.'zmWm6 kGV.)v>>d""@QAd"l"2=+,g,gC]oe?P}n#ڏ?js,׻Jޟ}`g矒訒3ݛ+.؅Q(ٷ2!ܭ}MfF9~h9Cs/ 5QyvM `0;}sZ Hvn1Xɕ5/]]>:Č]`YrQ@Q:D»N raK3u}h1Us<ء1r ?3(E?N{<фǯhY^Q@Q*z"l<ɾ9q?q|9 )L読H;9`_./92Y}/|-猞4^Q@QKmf'7׼|jXN3o0Kkȯodlo~=Y2]sU?4S/+'}KEDD>EU;OKJ='*==Ύ ^d?\r!3Z+˃:(2_rQb@Ѳ8{ߞ_;`*[”dAs%\9wvEih<{/^ ROy]?#-{X6""J((Zvfov9 vu9v@K9;%<gH{oo֒`dTv5xn""jhPԶ4o:e)C`9, y>,lҾme#OmߔW=n\mկ.iŀ3Qsf,y;ry1 ;cyOJŲ̸,vӺ.?X} Q]ͮk7\yY,DDNvl$c\& bGeM{?[^;JD 3?yNR7vń;r(q[#݊jdl#JlDD}^S=o' Vf%}F,U=.MDQݴ{5%"jmP-(c.-|Su?a8[<ZTY l;% Gg"vD֯iV">>\vb,Fr62<ߔ哤;K>KS}f B]@.qV"N>".o$Y{a߬>VzĢgx>^} 7kIvg$*܏n>pEWٮ@DNW#"@e5uU!V^Zk}j#R|[b`;|DD4$ffn}X}vrXxWNqGUDR|>H!"@vP̟۽`7rɾ{? x!" y撝i3*>՚]N"=@E+Io};/IBg\A;Bs(uo32zQ{&yX/We6]n[%"V>nCm|]PV~>tU==(v~P "@_:3%Όxmro+6ȥ+@]<.?&F8LZ]6&.4#fo'6ȥgJM R9]9f$">omfp1 }DD !׻%Ï{ l#GDD}rkf_@n|Oc<*GDD}rp}.iFLX.8mum{%:ڣ@,ΫMq[[f',sH]MI`f"x{e77^b:Pj~=Up9K`@nce73^b:Pl%oH`y@I^&8͈WO0m-)!.^ O`و@t|K}w;͈W\"@2~m:/XN"xP2+eh2;![{z *~>g K=@kռ|DD3>%ՙPymU/Hvy:`v"ʹ@I6Y;MپYMvK=wzEDT{Pr)m.g*G{iն4m,xDD|@3s6No̢Uߢ eWDDsl_ b;ns!r:I툈dv? ImY{o7(+$շSfҶZEM:">%U԰{?>u9u]逈(WPҭM0^r%nJ9">%ߙƱR|[d Za+zZS刈|Ki=@ oծt4vt@IvTɷvӌ!m rDD>%2xc N׆Y刈f}Je@8;KmLާ'ݦ ooߦ#"!(zvl;ڭ~EaR @Iv̸vL1/vDD=s\=##o{̡}I{sVm<"@n-N$l{l:Q|W6Q v @<ߖlcew<"@fhS ǵʹg#2RDD@vwu֗="@/NiZ>EZ>EkQb@lm?"@QHsOj3ͤ}N8.6 Q`-JP%;(WP6io}E@ Qͭ\d$"*T9KۄDDr 7v˞MHDT8P xN0yo},ڹ/S5TPi'=.$"*44;TېtNxU *> ;oWv!Q}CEm56$"ԳR-6$" 4Cm^>$" 4] Ro}_>$" vצ R>I[@[A[KB#vֶ" gq$JvvYp7N[^z;گ۵Grj)/DԢx+J4ܣ%ն%g/Hgڭ3Tq^"Ht Rߞ[BHu35|uùЯ_ Rr~onԞt-5 :Q&3?dG oS4ExoQr&Hپݷm5;.I[~.["jHt $ agGDwumjY!@J>a_H >@GUl)۹DԠH +h9PsaЁd2@(m\"j`EaۖkHSQڛ*54ZS)m_/γڻ+50:yIK&]Xs=-^С^}J@m΢]6+yDp)웵]t:1>Ra@I=):Rn[: l=5ɮjN6}e&v1Rn;n)퉂QD-}e/®:QVCP|`[>$(s(WqBB?iJsJG<p~eW~?.e]*Ҩvܻ*'G85Rgkީ-ae@?vhm{*/G8ߓ]T@ {YImi) wT(>@ò7⩒I}  aj\SRnm QD-}vqVRMgȍR|PEOX=%g s,`g?E"Ŗ<[f޿Imnx}f;fyT;YB}Ϙ-)z}y60% \hߗS♥m6@7ٙ eM4%!DsQIه'io? L].)]H3M)9% C.kޠ< @-Icz`و(hp?8 @=Жrۣvn#gۻ3}7^reiηU}g!@qۡk4g(QBЂv*q%*KD >@  ;r# Q"В>(pjsJm/>ݒ]r{*>@JQJmIusHD>@Z]3c="շ9{Q.05 Zd-R}[sqg;Z\DԐhYvHV'd@j;Imcj67}%6沒IɮMD%r%]tInؚgd;&Ѧ;@m"*-d@WCmWnV]6}F$vuV⿽MDs}\e#Rm{~FHSwokQhy{? lDoOn0oWv}@;H6-|@JvWt׈ۖLRigjoH?t݈ۆ\&gή%;rق! ,u<!hmom]mې[9͘g;;vkI'~'<؜ 2+}ڿǜɷx|y](ء.e Pj ,u<* gJW{frKy~#2x~_?m| 3>AҶg~rd'^VxTMR}p)0`u3Fv*OPRe\Y}-&هÀky;ȌHm<*Oe%edNT(HT9u2&jk4 vg@t'`g߿)}?DSº^U7ޘsxn4׈,E-c9rq?&D}ڑ~D\RG3"qocYZ ,[] !oc],KjGaל{lsήAr @o&I8]hg?.v{E,_"_Ⱦ\e;I{c٧eQh"}j{HsŰ// sdoDU5 `?]@o&eg*/R9?s P%;yM}j%޶]ڽ-M$r PJ:zecNF)P~߮4O>@S$/hGhsIeydGMq۶/yM&~Q[J}7啕[{_u%4Av9?;g~D4C;JڲRly2)P΢R~[~S/D4ClKI]:RjL V) vǰ}YDܹ0;[He+3&Pw}nɾj^}#3욠?d'gL d}4Lr''%>iG=${#\k7;;Mvt}ͣM ^6;ZV!] cש~b}\ɮzdl&: 3J:Q}~)BDs BKݭm$ܦ{d۬sjsn[Klva,2-!=gWXVz>@.vA[YeIv} }= uO{ٮD44", ?Dr b|k 7Q\.=Ds b ^!ʝ@xj3>QܡN]97>@,⿿CT(jn0?pw8AqJ>@ !PݿT?L;UvdD( 1~}S;DWMN[KMپQ%ǵ ڞ۴$u59 @i+I;pDU*l./jwhKv$g$Fss2$ U?TvvNmN<>chhI;oDU+f[=\),-3ξhȾuq# Qx4ßCqQ$Fpqi%{{ɳ/* ?>NkI`(dU@\-ٹw؈BV"SK;kDzJzh#$5}o6$F72v@sى7v҈b/\ߐvЈb 7 4M쾃F7@<" . ^,{J;fDu퓳w$SFTW1nsiCvʈ*ƍ΢Q ]vӶ6ި-+ . $L?vv[mvd ' \Ryݱ]"Tq6$sIyj@wjI;ԌKN@jH;ԜVl g'{Qrמ ֖}8j`j%r6QCs`L{ `ӵY=:T$jӏmq?>@f~#MvmߌZGY[}2jY iqnnX[TŨ0ٵ'~%mQKsG#~6}1jyi9zn\[BŨ0ov6QGr@0^vh[u,.膫%A^wɮo mgG<SEnuvyqݒ up~|n-' ygkhwtwY%?";C{Nm% .̩Pk$=ż? ۣNQb{'ik|Ѱbxm I`(o!o~r@;MΒ;sDE uCsh ښNQBȂs6I`獨jUo`oO}LQ7h ǃ,QÍIpIm.I`G(Fe6dCogvЈbVl='.泵$6=*~vﵣ$; znI`Jy;;4ȎQUQ?,3UI$cG˽3m);.Юc o"ӵϳ0$GdKih7JvBȒG g0KҒQCZ;AOΓvw`İ`\)o`+&JvĴUٕ>.nVv=Vڈkqfs/ }1$٧djk^huߊh\Fځ9t!m@:nV}(PٵEwd&HD}s p BɎ\";Z>'j3܎}--{l}']l3!* ڒCT*"@8SÅQs B !],P52⿏C$"u@yGi QMҶ}A[^g>@Xm6ߗ!O`'(zDl@wIvq}Zr b 7Q;KO[_Cg>@ީ]M(N]m{m~![UO.vvv}M{ڝ{@;E8:9[~jLȾvdg~ ٥9:}-·R8:Fotp$3HNWrt|dGBRwޤ$z!:ds~`'CIQvgvn@^hY%FjWopNڝ(>m^I`ǑQZXB-. @RzihO rIʒ$5pEtEevZI`Umx/cv,& (@*fv0)v), dR /~/N@٤TM5A};NJ^ڳh:۷}<OJi|Yh׳}>PVg~;ih_I;ΐބ5[MX&J ~v#u??B 0=k .$04:N-iZ]O{zg~.j,?\e`ۍ?KXil]bO]xm5fqvh %#]xSzo,?ͯz,L /7 :mI͆3xӠڎv<O$V{&׆iixk$&C֡(ixm5QXixm5Q_7(oY˵ù/kOy mvI ZKNٺ" ?mEN|[~\+~M`v$B-[l]CZxSڂK^޳VB:}wZI j~dnY_[S{jm)mamnmi뚭s|?UXJM7l#&݉Ҏh-|U7h?^ov$FB6vg<ݫ]}[;PO7쌹6lݳuprP  QSS*P8hmnViڼns{e%ۨ$pmqI \?u#j0?Nİ[H|NNi.O!k YYU;BQ}6[̳kopAڿ<O;@}2JyIǓڟ%~qZ?Ũ)X)FMQf?>_f疻}Yv,ZCv{'@8^ã0(.tOnxSRO1K]ߎ q%5;,%o7{ž;A 9R{dxs?8vx]4niP럺QXRUu?',甜aXvR? ]Kv^\ު:t|m=ZOM7Uv7IڳF{3GqM.:Ԟ3q{mգOq/찫 +. O O,T_) o' y)dƹ9]d?)N5>]}63}U-5JB(O0IfH^mY~5;_Vd"]eߦuf2mop5)dhGHv$uY&j cCS:@n{ o[ ֖_hj~&ͼ\\hp;~6͎zv.Q~#wW:8[CĴ>@ڍmEZd/%^r( ; ] A[H⿮.eC.:".$vN9h#|`Rf?@;ag,[= $EC<-·ԌRfiLj[h@뀒ّWU#rG^\s`hh G)רE:5׳[SoY? Dӊaa9EZ{wJ8. Mi+{D =Aeͤ]q~ nޏXFj^egxty%o{s}M;:~w}>ϓVQޚ,}4R2ߜ["/hHsvngwG^\s bvBI3Ϟ4_!bT9$;T~ih^/| @i$eLԯFjXwհc+\2H^\s r{ Q7Ӣ0YB&Hv}~IcF#ʚc+sikD̮/PD.Df3-\%kWV%ӎP]J[E[&Z]F"Ϳ^0֠/{"q~}]~5"UP;kkRӞl!kއ6Ůbޏݰfl߮e~}_J`U[׺;LI"A.OuF_J{ ~;%Pwj}v#fɮSćXUnUɮHe3Gsa kDTPs5O3AOd;7vA_.~}A=y)8cN{l3m_} {s}u PHflIOwW7K=Nډ?#-kjZ_G5,>gd3,fz<^-X@}>*y?uhg}vtWKe!wki9(D}ü,vtI^\s p[ 'y@4ʳv hRoTavj?"~c>l}j5fg\] ˚"]> ;ɾ{56h*nޮ}CAzNZ^X F̫9P ?G({s}5mD#uW[|Z-A`^1{ggubD9{s}u3 ;N;דVC"fS[LW.+_|u׃7^z O+;~qߌO)Zľ6o~mb'lv ϡrXY׃@Npe'yYS_T]a0N9Jsbx?u˥jDzϡZ{s}s@`:iɎ@wܤm.<&ûȌt6^\s @?9S6֦m>_(;wԍ+x^\sbvR&4vv6׋`DY?؞=Pa ޯs_]􂶎|\#=5Lj5&^\sbWxB)nK ?GnS?Ы{=8S_TO+'}#P'tl6m^S}N{T?f|CN:ۼ?I5lޯoOiSmfkF׃{y'P|*Ta1E_To k?zoN~?2k=JU5S +Ok+¶v.^+^\sD<0m]aMΞ=~Ɏ^(P;t&{s}&vɸ7oE'?R8ܟ؇sNxPŴ{?jfj9̒O#Zr.轾QsBR65 w'/;2AӷvÀ w~_רy~{s}q* m uLٴHvH8v?*53b"CyP ۠}ϓ -otKvF;*9Fn^\s@{9 86U+}P{&3aǟB_:mk~ϠKvCwNikk'~6$;vڶJ3Pkd^{s}tHdÛY {J[ZAȓF[{vds1כjvY%]b65rLߧ^jJKڎ8irxi{ߎb;@dH[MsQk$;ϕеmklϾO_|v3$v?5 `1Mދ.y&uϣm#OF.1G"Gt,CBys>}qF|9gK{98[[Nk.zyIc߳KaElqN7žH^'Ύ|XMYUhځ*>@$DO}Em96m);fk?PE:.vx;vȖI eHR!-vE)ɫz#{?j_~M+i dęmޯ &}0'huȳ]pdg~Ii—}m?'s_b'oо=a87cjIrmյOi?(هe:?u9\箴$v2f8a^p׋{P NCN8xD;EZ˾#/#.deuHw Xm:Y5>Ne{?^:yQߧ}E"]g~GGzsjv?6'Pqת$jcW9V{ >qlkB~m(vK'FgM{ ӤO vDwV `8Vd7O ݥ!$;J¯#j_?wrg!m#^4Cx?%89uޮ:1*9wHk=L#-&ycf|V_!;-gp ٲS88PPMK?O{֑;dzo"_ju.ǿ;|iZ] {<]8 OgnFiK&0 O =Έ:W>=BKo _}Cm0vʓ̓*Ա6 5k*NTUI}׿+xmQɷ%K9oj;[0R~rd+3HQ% e F?HvN7LT(ƾ1˃tK׮b_T=1lv D5)vܧqn?loKyIv_Hz,^}&؇Ƚaw)$oޯ {vaGn*~˙=?xgĝ$ВJ Z(<}@/} @<61h;{dp~ =vɣ{8x{$[!0oy7( ؎d3)9)ssss{}qFuB6l9s,BԶށfeO/X/᧨C{i$EgV ǵ쫃 dLt2 :Qdbk<x/c uO}Mx<' R7z߶9Ͻ7j;*6kW۶ܫvΛR rL{@>yJMs[JÆ?!߹y< sGxw>~7 QE{bߞ⎹ayTFV/L[DBk5IsC(\o+vQH߾Czx<-j1=-wS{ͅYlV wnf*6qvAI?Wtt{ǮHg'I t1/Q}JOm߮Ha;:h9y.6r/Iނzv]w,YQ?_t6rYݽ.NIlKW 2kW\}_iiZ]Ha;h[ZZ}z>IVn]r!!u "Hs9[tJ[_2㶓b@: ݏ-wS'mEO$@ñkGs{xv>e9W;VYn?6cl:i_U0]W7m! LaOPd9Z1xv$J._PtY]JI{7::p V9=m"0mz*׮rִY_^2mʶs~m!yen|uզ_ԕ;R?#@p:q6ʦo[v:=v] 7W߼|O-@KYI~@<,\ heVL.~ȭľz6Ӥby|^U=8lލ nZԜ'$Yh>ok8Oc.u)vfwSkNmC{adՉsL /MԻ5-x]L~"nb7ሼ"A4d.`_%cX7w(gZ]"mO }oK*|W\SqP z7&jsȮ)r6U) gc ƾS7U.DwKaKm`k͵2<!wkvC5S? 2 wF_=};/_Tn >n&l(B%aSxaNo]rLlv_[Y)kg^♹ I>\-L_ױbazhJ¢\YT}6h+-G=M-aF|G]@i%.?Twtm_run󰺶ߦh/7䫬}d^Ao;I]ZcUƻig? p=Ŀ QɁ \Dc ſ a6MA:O]C\+.?TwdX|h~.wϕ:Ÿ_vu^|DJ]הn*Ļi0o`WvӅʟBZ${YHԙ;餛 |mer_ }yQvH=C WGK thM1)*m ]/?TwD)t /yv:Uubבd}VN˘kŽꥒ hfzޝOS< Vbir~@i.T 0mmYu_IvwΧ V@Qސd^mҾ('["Oi.Lc}1]62QtOn2Ʌ.aIm͵ovV)'@Wx^]Wo,@N]K[^~H󩳶orb+d|{\J:P>H?Ms{Ŀlt$١xw>uc[T{6N-|P#47@[Q2kߍ 6-ignza ޝO]ݣIÂ=&}dJ $[zݘOq:tw0wSG c ]~Zz ?@[izoE4'ſtsxHM{+@3 cyH=T]\A{xG/'V@x\}XLrwΜ;0DXIC~yBxT nˊ9tF.P$Y?Ii{c.g|cY=3buIxۈSjt B~ lsnFpI^dkk%ͧ၈5=u,S=J]Oջ#>̆cG% Su., $[c.%ۛ N Wr=QKO%uYqHlSխ$*&T{_%b9Qԋc tٝrok1 SiԣrlNjĿFDD@}|ZHXbC@ӱ}gg /^0חK# 4CDDl8 lx;B}%z(3$ 4kۉ da:oc_ߕU]!@V#3"""V{ %{;'Ll#>םoK=_ܩ."3"""V{Dɳ#A@g9K UO 0#kǾ_y)[u618xJxz$'c8L+!p_hy_a딪 %yq&18x{iqH1s` ;9zgPΦkаOTZbt%m#?dKR~^kSCiݦ^)VꆒD %ɍ76 e=R7ߦ5+מί^Te`Vt&N-͸ ..C]Q]UJĆ^߳Fkiu)us,yT5E}bm9vV?.!?Adoi.!Ɏ t{B~Z _qnI`pc5JgQ/>%^UZ8S @l8BkWh.6^rI-;P}i3nG<_os}]Q5 ndapV c\d|XoWbC5eabee֦}CeBln+5l@^~-?p!ŹBz⡍d8DY\Como4"=|@@Avb__ذ^ D<`/~RY\ wY㴅0=뇽{?# |^$1 kT{nc ~|7%N ~$.fc}񯓘_G=FTQ:j@<*X?Ffc\)<,&u"^2 "訫 [IE RBA{62gI߻ܢ-2'z0IcػqR:ˍJꪒ<ԬG]G}$Co7T7V?*ɋ:`9W;~etY$y!:$Hjk+uR?׽NW}ۤ c/WcS]#ʆ}5w~ ~b񯓘]ެ\[{w$:s, Qmu{݋=qU?&J8$;Jsk#~uNjlh3:]TmF2:\#o&KmXжm+d\5jOW囒5$ <"ϫ ~34e : b>4l@71t[=pu$  ]_w}P y廽1Vu=e{1:ˣ}\d/)ˉs%>_綗i*?l?ڱ_cd[Ɔ+n^`kmSAm3o$l kq&͙7~p+}7V:lh{a#TwF-ɵ('נ =Ej=M#h[kӒ̻Ֆ>ZnlCA.~AP}>g 5(CmJ/Jr2Erö>_M6Jʦ]!?-wL߮>܌iuA'g/\tPO bُ5)\F=Loפ-NKC!혏Y~,PdWJ|it zks%%@/KJ2 +0<>`~[req>GiRMJTX}Q_m>5CH!?it,sb -MEZ S_0h7և<D~$6"oInf臏v._Q_K)þ)]hڲOz:$SqX 㮋K\ Kk1m(L0 h'OzTZa6 ʚǀ2ؗ~ O_@[JO[#R퇲rt$k6)2uў7n v5v1=4PDl?W?@Sm+zzgqLY,99Ba;m].+dGoeQLox8G8d\v~}\uc>[kf׾eyWvr=iVYrϙw 2FUz%M}XM>EsO( |c9@:Nφ~ˣ']"-,5,uَkHJ-p>wtϕt̼B8hВ:$g^]†Ԙ/,0DzEӰ8OrVjn;|䘴.Jg/?/񺰘d}iڐ$5 8^\ zuj{3~Iyv͘@\бvW\?zĹï$YzVtQHiA{Ȳ^n(,>^ZkFoΘ#J:$?roݘ[Xjq܎:-ҷΦ~K# I2i.8a%ӂv`jsBK^em;-ǓC|EXgJu}҈y~j{V-aC }{鵨 @S/Y9c8pWmk{, i;w7(tyP, ~Um㤺C|y@iU?|dEnZ:-qttm}iep=x#Zޯn$B܋ۥ}C?&J+i4]곞AeuV~ ].R-D8r[ج^LLIs .G Ke.tr n+H-<9\;o4ϰZ|j4l+SVW'.|m(ԎKPǠm ¦:\HU K7ƞ}+@ʍҿ0H9YI?a_SKd[ ]h6d_cɋm 4`6m9d) eFf׮A#B\uKi? DfNkg ^@P.m|fit6E= ~\0];UpzNBs1#ƕ[ɶrc\u3kۇ*+p؀RF[p/ d7~I˻fs`&חz ?6yRh'ߖbms.`$YkWL84%6l{8Ѕ' ٶMzGt`]a9)6^Qg|ꋎ1akQ8;WTm #/H'[]-6=_7I?Ϸ}Io~qx'S}Cca1i,.a-8Cc3IAwT8g&3p^h3om/_bE_@z?u (G_VXrms!#zCG`_pEjKfrmN/ڊ(mX0_Z7JFWgrm{8`< (y<@[u1ʶyG=\uJ0del &/U^&9Zw@XUm- }oISl ²ig?W7[r뿑@8"&/U>'3H5%\ۜ/r]UFno FTwa6j~s=|өm_t%?3Y]R¶x?t)W ['{{ (ϱmz\us;$oS?#K?ST/P/QVoVNTSM%ԗs (+m>Xx?Ϲh{** K+kdbSŐ^@WN'QK=\uk6|HIF T%!zyUv$38^~C]GmyGyUV~V}%^>^$ɚ^y[tU6$ :bWPgVpx?wB[^l#q~'Ag/WZ/lݩ$nU\uݝ_Eu$~U\uOU\uoOU\u=Z}]V`U U\uk|6[Jx?{yM%pz@~+I=@W~r=lӨ k[H(dy$y_}Y /65D-R]U\u[lr6֯N'l{ WSF*NvIa?@ ~.%ap {HUdIߙC]YUQbD?V_qu'uj)֧tg*WF8@E}`:QΜ.$w|{X[Rh /3~x?gEճVt-WZ$_\$|{X gd ۲Du>tg/W@wmg=$ tՍd7>اT-vcɒ6qskJ2鍡!_!_ :O @DDDDD\|:IvA<Sl*5 2@tS2+k"""""be7 >DDDDDJt1_ܣN_bDdk4Au1ߓ^ VDDDDDĠɹ% ^DDDDDĠ$;ik3"""""b0@cčL#yϭ51 VԒlW j?"""""b@ͥ8 ~DDDDD X7H9VAKb+9@DDDDD,{zu VTMkPDDDDDRX+I8NAyKbE~M` ʃXJ+j ;jP&DDDDDºwQuZ][z$ }_=XS:WE1[IX(VDDDDD(vI!9{Rzzz$/ĽUryX8::A|úH)LTx'_H@?g(LVgC)$SFV/Ptk/er)ycol Q7TO/Vy """""=Hol!F(&?T7Rg*y?+GJCHv("""""@9zk\JyZ=A}$ V=6}bwy"""""V{ [-7ktl]Ҫ+N]^`kV@PK76XlA1M346]d"""""b& HwIW1&qL)uTEDDDDĎ@=KƳS,6#Q}#GzM9ӵ]n[: %ŭ3 >㢔vv>/TĿN"""""bu6y?GK?lim}$od/6/ """""=z{%ǷƤ_۹ mgMEDDDDD{tI{bH!~?Suc"ΘeCA&G<K?n|h[*~L}*嘳%M|!͏95Ir FM/,^\HC """"vN:互'kg7:@L%{(c3s<-Kw@DDDDD@LεtJI*|/SI9vǂ@8noaB}΢d:IƏh~ί^6mNwQ҆{o=+d*cDL6q>Kzv}b|W2շ\ """"B: C1|/P-%Ӱ/mjXv_]Q^-U󄈈{]Oz IӇޞl>ya1ix{a/;&Hغjm3Iֈ8w?Ϛr _n.ɋ~ب_!""""Z" ƾʞ~T/2䙕ǤMbťxu)VUQ K~~_["2m䋈ߒ̽_DokҰE^@XZe/IU?둖@pJGXCADDDDlD||{̻^`^x^v(<bX{IzH|N=@\"=lny7""""bct  ˊ /YP2^:v>%?Fo|>8" ҿzRϑMiX(g=Ȯ-axU=Vi#P^#H/_ BI} 2enȷ9T}V17#Z4cڈ=g$-6Ø| @/VVgTwj^66=rw\D/vد^c@y5l EDDDD {%ᙤ~J|-=<FrD"E}~kZ{` ;Hw%2zAJX8Tml5}q$ PAڛJ>??P2ui Փ%}9GQu'z}EiOƷ%dHs+Hf֗z;dHEaЛ*L/8ƆdmG22am> """"bPpr5~*dVrPzVoe<<$6DDDDľ]cym(ضhvla,b#9Ik}ubsokLİa]CDDDD{.$~׈$&x_ɪ2]KgxAVƷ{= vRj)u!W""""LbpoFY%i*Iz<""""v@jbpoFS%̵h:IOwDDDD@M\+PƷ#_Kkm yDQo@>V|כY-39DDDDDm/@טcKi6rs@\Hߘ@X^_[Spחfq 7Kd^I? g䋈Sjl0udn[R|~Ju{5szIq:~ؼg+6""""b tF)LvLn/qFm,~HDDDDl#`0WȔ_";Qo9?pv-ꪒ?N8_`pt/IiDDDDs @>^RT_qLv""""bu I2 /9潞_?]@lA'""""@"8z4:-=]QWɣ""""b tBml#RDDDDlT;'\.RDDDDlT2nLV)""""H4#z-=.>(!uV""""bt @\B[ @&Φ.,z(3H[{%QA+R~͛^]VD[=IROI5.=EDDD@I)2f_T^O",(>hDDDDn5|zzO5""""@ 4_OVFDDD@QSFDDD@FDDDĚ@NgVģ\3]OSUN """"H z@?$C;"w"(7_IG%;/r%ɮf}~-=Πί.#˂ OWVPg)v-wM^cTJ9[{}PP(ֺn/ @9Y_VT_s)!"""b tYۗm$`g[Qou).@DDDlq&uǾpݭ~Vyxi} dz"""bu ū$PwTIـym]}2C7 =?*`/$_,\Q~U$ #SADDDojK2P_yruJJZ`# ?39SCDDDĆmEj[󠺀]yrJPȠJ EK! """"bu c뗬/Ň~WH{]V,`ؖ y """bt G|K_/S_/-:o!YՇ!⨃+BDDDĆ@N?) |( 2䅈 =^& \=`>OJU:P\9.DDD#Թgs[ˬl ȣ\|rNukx-"Džxcd$*ש{JyA2h_ Rzŷ^,v|y6BL3F&6׫{ Hs&>tdʵq F$}9c[mL# Ս$\G  Ҿ_ wi1!"""v\%ٹOQdLݒU uVUQ6DL?`ˉųXx;iL%ğeH@vbJƂ """vl(尛O y@|}Cf^9cADDD!cdb{8)KhT] ?KkEw6""""f4VFj8[EF浦|EtOkmGmc}% sn2zxB I;俛ԠDDDDl13TCyMUq~]LuvmT3i""""6٘}X習|Ah3Ny/50nf yCja""""6Rh9{ԠDDDDl3@y)ͤ%"""b+0ˤ>iӯߧ{DDzdzc/j#c^IGDDn?N.n~n?o%ɢLs=7Nx]]%B^uԣ 9g1ixdiflpt}Ҿ4c=Ug;aW(2?""btqK)e˔:F@?%rNp$]\l0v7x}oHXl ԝ?Nϯ$^'8{#]C4u~(~T}{};8.h2*rc7ucQ/󏈈,?:VZf`?;~$ 5r.Hm͘o=ykZ1Y8$/ VuvhecʖwP skc_Ĵ?""bt$~zz$ڗۍUN0{WQ1?vA?[8t@[ac6qP1y8Y$zKu! V͢4.ikr{.qLZEGDDnْᆭ:v+e?qز ?nG-K1E\I$ Ad\1Oq$S0^Y{-1t1o-K1E#u=ݗU}M`SIb=ϿN-˵iƴ?""btl_Vw?Vɯn6{XӶ)ℌi{DD9x* 3*TXU˯n6%YqАKdK3}[6/񲺱ê`RJ~u)d]|'Z!G1!CԇIzU_gl gM9~}*K!wU2I]V]y]q{FBU1![N/.^bqY憌ŦzEzDDN̹Yl m;I;u3u1ŴxDDLl^[!KߊO7]#""F7TBO @\WWb}7Emluoc[6i# >Q}XݸMĹ :7a-se늕Ϧ-t0DD= .%ܚ;[H7]& 1yZT%@/^R%::k&߄!""6Ϗm[ ' JN%.߄!""6ff @:ǪK~)Hw_7aЛg%n'l.*oc3ԗ`47KN <"IWM""blcgxLPucu'50DDV%y$[:$u3u6;OK߄!""ƶDd? C8սwH..ո߄!""6D"ǩTOP7)5?47a-sJ+{ZYcMM""blbH-tEq CDDmNn$VukuZַ?/7a]$Y LRwUg>tYq CDDm_Tf򤺇:N?0DD?-Fm&& 1#$|+UdJ5^߄!""v?줾.:w Nt#q CDD}[|;gkp[? @7`F,݅m~뜿w #"S]?wl[^WwŻ!""FwYS`a*C ]~clqk|XF[?n'6X8͆ oȿNj^o^1;E,wCDDn^S}R=$ I^L]@KQ*3v7s؅Ի{)=1~0h]% I6^IR$Sl8C?mcIv]y0z^im;ܪn-Iuo`^R\6/^\ =>FwO Hc>ǖW""bt`Æ?^%P7;$ V.l u_dUj c/vݽ -LB9o[/UNyTdJc:b@:EW~2Hz/7+9etI`OםҬ6zz&kxS;6{uџzܒ$+wCDDnDlQ1SIuaI-VU=NjhszX%g'jM߆O]#{<,h[ٿo]:A"$ *Fļfӽx1\l;Ŀ>ͦpokI_S9epu{.1Ug0 $aoqh66polEjIvaYJP[mI2/< L+n};o]; '4؂N@DVOSwIM W |,ǤJ9W~,RZR['x@=E}׭&D)Ʋآ}ʓoشÙ%{""btcfNY=Ԡdf$˶[t9JƗǶ̲z1134&.$j,l#)yl2Iz 4ȲY~]߻!""F7VF+A# }$AVIrݵY\m:Ir8UeJY)[e^~X$lRFZ;MPsVd!HzWGA2\FTzeW dэ ,^P5ir]æ~Cwݫm ]| 5O[؜T&ԠqVr–]ĶIk򖖡mɔr=K.(q#][uӨ @s8]j0#ws@um;][u @sҶx{Ì m3MD޶h1Ug`4wJ edgR pYN-t*]*&ԠA:h QBC6Wx?DDV lt ԠaFr%%WݻE61U&ΰbh*U)bZgTd,ĿM61U%0껥5kK!tCՙſQ61U%..Qۻr[`ymF{v)E), 3t27*L:OQHjӤu:P5ybZ?'D\ X~]"מU/Z:z u;ڹ y%|u3V{R>$G23yo}}%~M\!l}s=@{_wMH uPwcՒ}K*6tI~Ycfds>kn7J;;Q׊z~ !j7moorU$ 1Ո@V|R,Km,%vךҀSyokK}S [H=b`wxZcq)ⲩ][Qd {oNK,;u;n/kμp5YjIiv=&Z.5gx .AvPG Q:KL{$) D{oyou8@ }"TOHdOO uw끺MN }lGuՓp:Dm@ |3=$(]]ۙ}ᲝvǽTM9s84!Dto=m Xb ѱznWvQL$ܩfX'\͙ճk|#`P Q=ݩS PWˉv녺]|u>%n#kg\q<_ޯ=^@ `W+_b?14}^YOƶ^wf?q7[c}C^µDufCzʰ4zO$jf=Qc˺ӑ}quoxܷDZ9ַo"p/UQGm_{ꍺ]صC;T]W >%|hPv}6 b=# 䰼A|oXR%QV7K8e{[F.egFuTݯ+a2"  E{_6?>(sI *hPK}msb%*zPlumRp]vf:"s]H.j}#es9e>-'i"@NuzY锨ۥ޾/1F,sA~˽5b=J=P'FP3!jnWdm:K=S[-bݲIۥܶ^TrLv+a`Xg Y ~yW76`x=Ȼ}Rl^OlwUf%DSDNXۥܶTa\}Ħ7vua8c=b[V/ҀHȰd6:IN ܈ {B]wlvy#bnr`űA˳o﮸fʜc3.sl#`7%BԮ[dmZ>g~+k(Wy')k v)#ay=#k<y~ybxX ~2b(VWHZ]ni￯T('ߖ={n_T7e,{fVu^Ǽ|Y ghd^`L`ݻR!j~v-%ܥ¶mRl${'ywǼPaiY[+k{_Iǿe yNtXr,ˎa#%2u}Lk#距2}۵oFLSyfH}Roe.3{&Nt~.wnWRЬtցR[ARavie۝01cvxx> 9m'5-K< vmb{K.e߆XU\{˸b7|.x^יe?j{~CS${2Q;`kg.NuUٺ9esH`a+>'}2xGJTw6M3CXo6wuLoG~Xq]DyoB]}3iz?Ma=_9q;yC~+>uD{?[ħKo˵H*Xl[t/&d ԯ#dwSS_In.{ԕT;4=e~KY[d>w"-Nd}0)ߌ?5c,&-sdەxz~prd8|5v !:79QlB-}TqϾ]oE%纉z19s; `?7MĽst?lN"ߕcm _"o#g,{sc|] # ˰6k3%\d4z?M֛}9~nܳp)@lA59%jȊ\oyvviLq۶[ϕHwveSw:ZoVg[.T-FNS wFN-4t3Y-Y~v%ٙ(xXqeLH/[|*TT\dx|w},CY]ΕpJ &?ѝog R~8e9F&ȲwFN%zK>ۦ?dbY?{R˱c7Y#eGXdv׀AwAb@gvݵ" Y$1zoޡRnQY1CvK">Dه]=U|\??c}{sOfz-+%1ӿDi ןy`_gd{'HBl{_]=qtZHNk7L)lA͔[TpZ.Xa-+wgG\֠Rag2ض<3z8q@d7ƪ!9K4]xۢ}#Y ߲6掸Xƭs&Y~+!?G9~-oI|쒀7e!"5aMŲ:CSom]>)[}EV7N-|:!ٯq6f;CDd&9!jZvl6SpnM^(mMv]u29;}Q0٭ e&YmN6WɰrHi۷ٜE;s刟~p>vgyQzNv r3ޥ֔QGM]R66ik)v)%ʸf󌤸bUvuC{ #?ۿrQ5*xg ɯFDtu/;HGZ@N[*DGFϖy4}^=7JɞЊQDzvfܰג/> ͧmUtz/,;F}/Y'\fj7υ~w7 wz(vt~-s]{~p>H|I4NElB%=s.˫˸7 H8U xmۀ߃jqZ.5}=BBi;&|&ԅG,N]hw7TߑٰL&ޑ|{-`~p>UYl6!cá1m鷫 .o!˫[W·mUoA1CŒ6/EN s"8DWmufTA{ۤ[/=,KWJj9 yz=u;@'a2'B!^':%J%2__} TO٤Ozey8q@Evuk""".2 ˹P|vJOT>'h]!":O­v1u{?^"'h!":FO71Wk׎ןZ?NPѩBDDuDl&"=u_;^jy8q@E NwZH_;^jy8q@K |%"*#\[5SE\I+Zy'*T`@SCDԶTE jeZC_߾xx}|FwzTe17r2w/yQƺFzD~p> L:D-0$uK~Llr7!]SQひT`EԲ˰N)"qߑIk'Z lBwԃ6R,g6T^VpJO式8q@vБ7v&Bh.0A`jM%\X]O%>q s|B.CR[pD]8f^)E>@ "x$~) ČQb`R_AT3Q~]pD]X ɀK}cmA-}k\e_eo}ƲixY;,VoQG?J7냞,D]Xd _vQ})YH?eZYewRgڇ2TV7K@式8q@'Ϩ$۝I{HSGRd&[_ovW=ETSYm~y]X\3N]TYK$|h29 Q>}5Y(u 2}{3;{n6ֵdhU*,&y_slo~!> A式8q@boPفv=ڭ͞wQ//l<3F9U-#X?L¥wU~&1:'HNA|DݪҾ_Bt Qib̗i&y9² &,s@式8q@"=uQM=V:;`ؾV-(y9y,ER+u9cuN!".gj_Pjz^N D]xD6:O"&}L='v{ҶCrT;f r ]bg ;BU3u9cvN?-ZQN|wl:V7u9vNݳ!!""\;}X!q\EF;u9cwN uG;Mgg='Z8D]D`$FDDDJG%99oh^?u9wNY!"wt_Jsrt;~ r %ܤ""ZI}GA?'WxjDQHc.}ZTRV{}gԡNuK}CvtZH7'hԣBDDm OHZW7'hAR?Yxy~7'h8ڗ};!5O ,|u9oNTG_;SBDDmO^"y{p>[VmSI8fH&"ff*xuE+D>} f `7kO'6'hԝBDDe2=u#ۧ۾ןh*mN K-[vO'?} D""pJ|~S}yy{p>Qz ȵý@7'>@z>@z>@z>@z>@z>@z>@z>@z>@z>@z>@z>@z>@z>@z>@z>@z(S{IENDB`teeworlds-0.6.2+dfsg/data/mapres/jungle_unhookables.png0000644000175000017500000075143212140200333022232 0ustar felixfelixPNG  IHDR+IDATxxU7t$BBK TzM){tPHһ^^ ( ذ+-offdvwf rϙ={Ƙ    AAAaHx ABNp ^@"As"v"+P@q$$'/EChg$x7/Oٗ?NZ2QF|M%^ JyOx*Qڟwa/? @"AdeO#%o? ^Ð}4"@Ox FgF  V}H DmCx P'$xN@}F0J&w uO)@VC^#-oByO( t!@_xz<'@_H B $@]=H0 $ A@AN>n Մms;T: GQ' %$Eg I!Y.gyO=D l8'mMf lX Sɿ@y4|;Ǔ|_|nm >ӈy19b@g7jB綹*tvW qW#(J-3BleB{TC!,[`6so mo6 _ KaySɿ@y4|{xsw*bX@"A /$\'}.'ƓJ/Bc\ q I~/ #ϥDv{a$p]\R@[@Q~ 2!!iV|bet m9BH=O4k xF&h@.>n((XỢ26/41S@N R,&l IyB2eD0͚ 0P? ='ᆪ_`_&hCЖ3C=H YljP5Bٛ%4s<-$[ gIB)ٽ5kzׇ&O!>ٶضVFܕ/\f.tvi<|1큘؈!h<j:sc,+_- e[&4`'ֵd/fW>y{H=ٳ{;k[3Qltd+0?$h^%fkG3kZ֓ص7so{qy#;9!|aLBIWp޻!$7+|EG D,DLDlDtacA ?Ae| /uZᄃ5;n۾c;wivgB8y<[z=4xkɨ`!vWpdIhy[9$wN֬dq } yUmw0߅×Ӽ@DDDt"|;)h O~:eyvpI ;_wSkgG'7bS8< $ D2F&%&yz߹4!QvLo&:z> s0߅×Ӽ@DDDt"|)] ?p4) $;2t{xvS; h$:g8J~:gZaGQddvc=m h[+]f9ز3j"K*| Xd&KZl( DԱٻ{?~ɽS 1\bZ~bYVQC~/K{wm 2CVXվ@OlY XjgỼ̟X@xI  AA>A I˪x'%q''q<\J֪u;E$.~>n$͓qo|S[i^+0F 9| >؊|D,v'p;OX˃dUG6.-Ke?;{9SH^8HԱXǍ1H`:yT)J`YlfY! mdF?ITVXl)QYG eS;X{AS`?!wm}t7{G٪՛rcdlGM;رs>(L 5{bp&M  k/X^1y ٺ[|NÄo?NgiX+,$bM  k~DUx_nυWZͽ͆&hs Xb`d] es5IK_|:_}111U EEUB,v;wA, z.={\Oh`-:MQDL>Iӄ[M4"`!Q*mv`vph w[;hC%єozj}L5 0||A;P 페n<R.BUysݝvXy*zmg&|杮;MQDL>``]˭M,U,r|4$g>4>e@:ϥroKmDm}vBmUU@O1zEgI?| ݖb%b&b;u%_Elv7N@{LAټ!t鰃ziiNw"s4+ѓįQ㸯=^HX">ڼG(UYE},3ZxNz:9?> f b'b(b{io FGԷCѼ!/SaׯGozFH1u~ZwOP$~,_ Hh$Wm^a￘haso@m6VB}>=+\-<'P[@K-zGؿgỼ̟AD E,ucr7݌" |%..U+'*|:}mydsfvq$`hEvddd )$I"?? G&1ʻz&mTT@[KCU'z#| %??|O Q*6 4S[?b? VkÅ$@#'*|dv @㋗a?klDt nbT [GA2uu>nؒ{hs [#GI->OSWyQ*XF\;!·h)գ~:HS} f`Lw?EPNKjJۻOgwUP+@=Gp7@$|J~^|y ɻMVX;X5mB%c#wfP)|}nEй$MrHv`wmRT^R|e[=0JNFHʣ$|J~^b'᛼$AlE;';b!fk x'$A-bq yۍ>߱av+*wUDE9eɫ[hX' bH)n/g쾍{{e`M8ڵ$ tP$-|"|w[k36BF. С `>2i 5Z+zkp1ֶEsw tX"fۣ(^'ד؜U:x(_O|A5NE$(* "페. vkvNJ X#X5AA;E5k7+?phJ3  ::Ht.AsT+'6PW߳kR^wP__ȻV"@ʚ{ak;{'MC;E[/#$S6Mn~|gR̢);9_΅~he'Ml[ml|Jy2xmzZ?|$oߍWY%, B"%>r{g [lڼMԮ]5BCXFσ󪧚c 7O[ˇ7la )rQ|>h /VPpW1~X+;^iƊb_.|Z-."XDESύU0F~WYo'@l"ѻ{c{Y! *;!׾@K@x.A w;1!x,)))ΰ ;RGӊ1X]韪E=ӸDVӨ(KEt7 |8,P*+VR]Mv|sJvBrvPx')A%>!IR1;k6q3Ke3f.*dmRtjVV?zL@FM+ [:7 jbFq:߽/*VJ_جq%Qe#hݿAlV/@ /%b2@0>x][/g>}*]9U/Ɠyy7CaO-`rq K*Qi]RY8wy~f}0ٝoF%?~җ{ԣr_oz>_o+|fh%;";;I!kBSG=L|N?pJ6qLݒ87c;V؛]>;*Z^4R HĤ>ұBߗ ?ƚGN${[AR-`!`# |E>_ 1Zo^11\9 @-rR#FW_Z};'KYg$ϧ):4]1m% K8XHǎO.-~_.Z_nKޏF}lTViW|A5H81Z11^5;Q!B,q r6H]2UE̝LHاKp q k6heFZi paX|O~Nx~*ZLnAӶQQe|!+|>UD,b<|n:BĢ_'wwV5@@\/)lȄ24qcKnPq_nyPb =h?`3 Nj(O|" Rcpb甆2oZAKV$Jo9 ;qܺÆ ٮ=đhgT>c!V\bbK@!c5íc;Uء _8@/\^.|/ٽC\h9oG[/%nxbf2X/E,%޷RGV]s_ٞI#DwWiH/sطb/Vl ($w,t1_8 [ܾ݇ݞ{frzZaoG[oY7 VmX. AbKL("?A Wl`vtZ1ϟOe{o}aރ _hѲ]@|>"?>T|Lq{oT 16 @Rܗ̰Mmn6N։>g [-`zBY!:WSo<. 5v\x%>cX3aևӦ(1A 'NSBbb\] | ,qC/11]a)k`M_3(J9;ZqՉw捾l~zkuW\ZI (F@~b?|O\ZߴwcHyRӚ|!)!^ Z>!.|D:»=F  2a^)Rʊ7։FMT2jjZoY6o@ƕl_ا3Q1Y&܎9?8X}t"wj |aOC-o^^L[`;/M,%ORO7#1u7Rp'ng-V .v DN`-l9Z;8v[!1մ5;nfZQE U !>;69zڧ67AMϊAط ڰܖmu* >/>߀Hw߇onO;q=k!o'e)) ;g#ycF #=|LϦ;f?Me][WZYb݁t̴{*(>ӱVy\a@r =Nnl [/^'ݞz#w{b|'ty;"@. 41%HÖwN||}Kl۾>k&BtM wL׌<3-]VYּ}l;a;-u%Kg ߀Hw HqmEA~nEDNn^N?~ڑ|}K|~7w'R6ct*!>ߧO%lm\qv~>l'ʾKbfZ>߀Hw Hq-b{dbx',A%>>yH~ǰG}pȺә)̜k~kשS_EYe%W6_ c$?0}0[w;wٵa;-X6_RuoGc;?;W?b{A/t%Ďݑu3SH|z{u;U+u$ѱn?/osdWJ^>>l'冑l0N: fKOoGc; _YRܧ bIHH~H1c'*:Qݑ %kjGlm7nAhٗlܸ]HO>wQzo]CHڢ( ^ /1<$Eݹwds N )K {f߹⫷:̟>>a}W`@(-bM~ػ '$}G^pNqjg@OFy<`KVzpgV\ ]9ɠvЭEQmb~Bbݶ*v^pO50!ٳ5,'oꉺ=øYq%\ROE@"жr!˖HqD" vTN6f;|y}]ղnN ibco'.Yߙ@lgANjHi+`l ?xa$r!㽼24me0lcƻ#7Osٙp' B)[n9 x Od㼔W0n( X+ߍ;yɿf 2|Gvjp $o,1䞖,]-$x'Y#Hm8}3pYlqH X+ߍ{y{UhV-wtܩu O6XvBS gʗaWdyqHH +nE+ ;Ҭ3'z)S種1-3!@-`n{dŽBQ|nV-Atĥ=ύ'*A 8Rm_ӊ@iK4B~[;>8nŽ A(4_P?:lwVzhk`}n$zekIg#0]״Rpd5@nTn=㌙ =%f n@vfT.ef?9X{TYU,[OӧٕÑ3x] @A @',\=wCؓ<-x]B:״RH @򃺵{lT̙{;$O5!⿐<=ēFr/W:󟢃Z*ܣXSrD=@+H L[#dftkAļe +==C@aK1w3$xNo#>7q/%7S5ȏz!VYU8_6gH  ;vc()wp){3w <z{'1GYصe-K$?[˺uPAO_6cQ=/_IPs w\ `+?}9v-u@ AZ{Pe ݆ ABw?ZV`_g_ Qֽi..p 0s>s.;~ S}MEOp.h+maFxHm֗5@ʥm ]uyv,^z7p|>Ȯ+C xWG͍jW-^x>-‰e! W.=Dmݛռz' $O^K'0o.1{RL|HϘ.ҧME~gxx  @z KGM4b|k f \:+j"^Ѵ +y&`w{@+`s?E@U}#zӬً1%ݙ ӫm,\ g` AﵿB5| :`Yk3qO((</;[ՠ>w6m69X{@+H3*dW x H"zv= aWO2[H3~LunPS |?pG^|iӢ El-||nώt2p_WE{B$4Bl=}\ƅ8AS |?pG^e A1zD cHjFLw$zx#-}H'#b| Q ncGDy yCĵHj'Hyɱ.>#~G]]q ( \A`z {Ez7LYۦ8'[<|zkߣKE{ ?/QWbrՍ5F)zF|Oc! W3&co ˺[FY<>zwmظs{@LNĤوd Wjsgzu= b ^ 7#O`_@+HN|-w@nlקm^d^b{fOc^߂WIK=n/$F*m^n ?߾g$ ty'}Q],]00q,t*v&OY(m0ذi&B:Pވ6FpOq3 \ct'`~a/տ< @A @G&L /ӭPΨvm{3 s.aU$7~nn#GO8I-vKt:3p?Ľ惙e?}>DCR MA @'0=wK@A:w˨^ho{U2e6;qI-~>Cg4}ͬZe=IX ;% F%jns0 $/_s '}׃[/p;G{|~p_s~ᢕllbyT7h F}Uތpwi mIgjs"o[YXz,\׃?Ď?㲝<Eo>9ې}|X}2xBSΪ>^pw m{B 9|,|ur{\m׃ϥ;ߍqN?I .[+b=wa6hHxT 4ٸKUDO&hM3,( #[s>v0-<nYq&zWE۠!)͑h==N$x ii/_K0coaGay7eb{\,⟷I_9 \aJ#nxLƞ9)_xӶ@u5KxY <µ]%7("ʕ#'8*~*`]F':f~y'zrx So wX:6wFՖ$>OvV:FĵS14vqBX/N+7Ӛ5$(r= x?U]zoĿ y^,oeWG+j@R Db6f\=^G|`k`ffn{kH ̲C=-o)0@P`f1kF%E oyꗘbo#f,/P`f1 \aGX `tUaBg`Ǭ 7u? 8jFH!w`F ۅ̺̐ \aExwQ'KVlۇ)Z|1o!{|-Yj$\9T{Gy}sEvT }H"F1={ >=Ɠ @A0@3.9B: _p+@bH ǎ1>ߑ-LHlyw$[cjB Fcw&H}u(B ! xߧ;UͣY&$ A F@ Iם!o&+|ebЬ2sPev `NI B ,]#ͻ3KƎ z+Noߡkɾ#I;p¶55&$qwQɳK9(|fD,j(Eev.Z=wƓEn)?;88}ϠB}G|鰂Q6T$Spo V=!ۇp7Ur0/.6 x Jߎ\fs'$S `w}F{z GTɿZ 4io;n>h mDhc [lР .{`;M&Z5>΁T9&6zqt μHcÜOʺA_l+lvEd/$+q?P.S\cmDh 1؉ p8fAuDl@- *ܟѬ\C?V3f.ީ7#ƳNNAFfwUͮu[mEc؎w?y>{;#<#;>qFovzrgh=1Xۖ,_1 Y@֭_q&MJsAa9΍QEEWީ7W`:Td~2Z[OR^m-u.eso@5!9zi9vlZkDIqƍc{u-lRܲˋB-ؑ).ot nZTG`* gb-q^?UM\WOc7' 0ul~c,]RnQ˒F6 !ֺ4yN aX m;69;y꼢@Q[(8hHֳW?1wמ氡]^c)Br?a^ *7l~c]* XܧΣ"@tZ|W 1w޲"#|L7{(I)۷ f=ledpoմ8)"$C{rD-Ww}mةYeC%#X>lMeJۺ5$?;RIH‡>ud=jJDӧwH] ,OA`j@jQ`0b2Yֽ`:uM&d \^qyqo/3:geTQ =zu8`ɬSg{ z]acK >! x\._ǽ s .M/.'YR<2Ba}#mv\@hW-g {h?xt2;UtdxK*ӳ˲rKFv&r8͕&҉y ,wJ ֩4A+!>}6{+jz>>PrE[@7^:Ǽ;zDQ`tVnlX+&tN &/*:~~3AAs8x;a}=gsr!Yn -%6hИYCnKvSbXoIϵimF.Zq|77eBE@1޼?xrvBj]1/ v_5 `Ćs|s8ɻȓK9C jD(<<;]!v b||aKɮ"D]BzK|6|H~Յ{{oyRV3I$1~!sp}=I|l~ݰr$~,,,췌f@@QQul'&={*|a"1cDv(qBfVOqg77*Z{B ?Dm+?Q1vbgo?Z=9 .U+wXo4½ÆXoTfZRSa/f#ٵ}e K,^aO |E;%||9{ i\pੰVجp`y;zKİ|Śq.2deRGvd@5\ ͘9fO.%uIݚuifKR d6Z~q7[ȩk'3 l}1q+G~eMM`ktjRϺZ+)5fZ=2Cf0Q( k-wLYlfO.%uвNUY~q} |bL|I;QlGn)oQgϸJ赁ltӂm`KA׫4-W;9Sk|x${d0"`JAn%w=Lg^YY6{֫Rb3wI n:U(r58exdT0q?H&UvS;~3{\9y&('–iTM -H ߐ |G:|J~ q̀;T@iZ%t*= /^a9V=3C@ .]%0[UdR&|;V{\dMPoj6%lRߪfr_HOɯ՛GfyC|v/$ B4\O`c)Yf-q!Ukz .P{ZՈ. ìaZj+΅g>i75x'Ev)Sf)pkFf!l)ΉzW[Kv>߀Hߑ %]칧بڝ(5^Mϴg`f~Y: Ԓr%~q^7UسeY𿮍U& Ƿ ,S,GxA"?LcKY6 v"iK#woIiM%ޠxF fܸД 4Fx'uz%;nlb?"<죌j[gMCˁ-+UT=,yHzӤԩ[_ˎ8YffIqQ!}l˖ &={Q ײ΄macZ{v3)3#e [Zj?PTk;oOI N<ܲ%'UWT-V',)7XjՔvH4vdۇ軫mʱP.z[3(Ja+N`SM>"z-5x a퇢¥5Ǫ'KH ~-I' +ܰqbTEV6bCgwJ;'z"QV$JnCC7jmv=YExЮ}gw!ڳ,f9=NgKZ{lIal ¶1l-]|>"tNڨ5СS'|]TZ xž%_(e.-;UU *C%b[WF*~}_{lD)O;GcoWlky`ӡFd?6#rIoɯ=('^`G-1 K}\$Q($y֬ݠeXXBHo:1#5cVrpU2 E I1 [jCXCYYMNo~7{xHW :t4;dCGk7)*KhkRa 6/`ްimkT%wM !X>"1{ĆY&(4>aJݺbD*=2/՛O17RJ(+jwdSL ,쾚J?Z{r~>~-;9NM}K #؇̴k﷟O.My6/=wiKҹcZ=<Vh|”Kq>UDс \)'0x~?V=z1AcEv;35$krhf額A纖@%%5%&YwQ~$&)Sg%v&6}<6rֿp} b{`GM~Cو ٣v;m[p9IÆݚ6L msZU [Kv|d >!ؽ|"t~ٺSG0dhNHYC٘}xl鲵.,.\>{C'_])X0g2O(vORzݿ eVWF4 b'ֵ+WGsʲmCJG6bۇf{ƔcgTeb/Nf7v )l`MP/ÆwKc{ >"E}:24;1 ;7,{kk%]_H?}:E'$չ D.@S^=g sz& ߀W/ _|}.>/ٱS&4daNUܒ lQGpOaZlӕW(xoyZG?|td7-0+eUhWYesv<%kŨA9O.p1|vWtK _[@3^(^++1CM\qD$Xd6 ܲKJH|zU+K йsҭZAI@"!bMXV#/t qKFy5kF) v-mş:˳uݻ7 7#@ތ _K?̘lĈ>{-^H.\Д{R$&z%^͂upؿ]I\<ɥ?'?=,lp=aw~=AT~~*ǡlFJ-Kio_Q|J|M-݃.FGV黁x!'~"]9=$ lwꜭ0v0 [[TmEf3+-8/9SzGd'tJ nrmx q9FNMk\n};%&}`)v \z-T= vXhG{"y@#),{{bY#eMfVO'ۓ&g|Y`Ssb ϮC迴mū5jۤV$gI(6a/+N￘(&FǕ{_3B,,jRބͼ9[B~(rŲ#G1Y4;y}iO08CAZ Ÿ\uQkɲUl";~XW߹Kb[ISo'&oײf4 :3ӫf$EEK1  źk֔m#Q.HJNl@͞f͞/ ع`G 6>"*6s|6z`M}cb:TfZ64Fz¶d̤H' |F}n9:.HQG6B.Ec&qOI0#X<ϾCJ/~qFؚr^jmS?>wZIٖvnKkQx } hd mԊ_6eK{uop{[UTvJ5?|,}6=ԫn2E( 0!$ኀ Kc4Z~|`7`=>=Ea(8}u43#5$.+=nj5GYJI@!f4@NzhhVU8׬4hTA6h"""vo GrvTY># ߐg~ߓ; :ttosOI0g M8EGkIykS>)lQn?J98Y a?ПBaaͫ-g~ߒ |O×v6Q(DSʰwaȠwp0+~/`maai6ѝaNJɐ^Vv/7_/MCf7 m'& t=[-KX(KF<8>YH LooQ_ [a8F5A[4djE3i{?r k/19MvzHs 6zm -aSVl-]|>_wggt_32{#'x' ;ԣG_I8 r|B;W l;\[vx;Rgv*.GױQe]'Q_+XTqLgL\0 k%mb1{' tY~n=!%+*z-aiʁ'$aV^1sIdނfoVGn;u!8qԶYջf51ւb^ Ba`a0EGB:_;R_H(q׀ucX}!(&6P6A`&EbEGlZavw ;6!:蠋6lIS?aK4)GnsŪтg;v6|LsSRԢp4J߾CW0#"}9{N wWfgu{~ m.'^!cS˕ ; OֵZGvH}BڤoTL Uym.Ŷ~v/ySjzN V͡c <?9^TʦŸ'$aV /C]Nt}ӕtu?9k6?ncA߻BF}RCQ:WOz*h vAu8BZ4NpwTe n |FlIS?EO:*Wđ>w <5S)|R@NN}l䨉!ѳ.KŸ/t$7)BKGK0]yNnu仅9H…}L%C'8KN C[H |MMK(|%kx{[evp|)ߙWn?siR@l%R' (G]Ai\I3[#w1c۝ }xUEI[roB H#РUzwi(Hq]k]׎mXsνfι=M2ysg7lPGY]灣\MZ;m[<6¶̞fX@56yPPy):U*jIh(m_?H4:RjaI^J ́+̙s6~V̽|3(NhpH\9d(^v[ո~Wm(%խҝm!;kpMNE^ۀ]t}gn̸xXf^\@}YP^4(] ܾ_xcMdluɳHAw\=܂K,<[%Ɛd](?=V5jV nlt4UBA`AjHG\1KNςܔC'v0j5r[mÍ⢌31s4kb5ΉasVszO^8n# [p\ҿ8\y7)q%; 藙Q`D\.* `}ԩ`Gk/^/<M>ۖn:FZ,Fo'f5`[m$ӱO?+yIϐz{|`/^O XJ_Z۳[!pIN?p7}zdSCj=89xtf^\@}YP=᜹m$kB-X]½3f"ϮCR>{bk `YEY/Yz/Y^XKXCҕUie?+*8iVpE3'v\ױSIcdќ٩ƌOSS@f( 0:d pTrp,k,EA0M[1Bx 7`,E?dc8.|f>ΞDȸw|(v3tUi/-) f   HiԾ +7-?$"HM1 ݹAsS?!7PB$LK ?7:B C McF.5xD^j5u?5taN j?f'uUVؙPpM7)G3zf乺oQүfzL2G55o 'D+ j`x`a6%H_=\xP+ {G>6h{2|,2F@̮M9*K#M<'M:l}Qw5"4oW}C} NX$$$<%>>i98WO%/̊:iAt}6|iX @7,Ϧ'MLPc9j ,PH 6s$C[vpz$Ss(|9E# 6:iA诏Ngg`,0&llaar#sV)c=X1Gg: sP jM YЦl%ppӃEpS`EF CD`P{ &0!ΕA#o ̊uןvY%5]m̦6%Q5VpS~ 'V!"+ٚP{S(@t"!!9( Igxՠ,g},Y35?OaX~ᮜCjV3;?g5pgBY ?IxcV b씟nLbZ܁w`+ +Ci4I .D`CԠ٩!y|f|v"cBcD-c<ұ˜ұ-[:Dbsפ ;5|rsq|W#4a)pV$8}7 _ȣk2yR}*,]z%hYl`V$Nr~ٓ@NhW㫒4?>p)pV$8Ko!ƫ_/qx:+ j %&&@ᆍkЊ#.Y*Zh&dƣ؊Vc҂{˺2CQa `Ɉ۷5NkgٖP4J 8P%ݎ 3R cjP&VjU1!9ύ1XVx`Xf%d<ӌɬ6Ӭh;1`tw4c?ERBCf.lq p՚˅Ǝ@U=KDx:7GV}J@)Юm'<\G˳X-}dæpç5-ߟQܲUynZxjmHӹ9;HHHx(0Р S n-<&,IGzUj:Mչs,18΀y J Veh`-쳠T 4Ca/T ;vM;l(;oڭEB "?%$13 MRe8`U33 iѱ`t7Vpc@ +2Xc^d΋9Ŝ8@]G8މr ǬvP.[o-C_&U?! (QԴ/]r?`Pw{yE36@$44o3cɬyHR`ǹ!]c@! j5+؆BT p=Q쪢$c ";,#W~nӕK.l%+h4xaPgұGc7~yOW|:y/8wyB'M,CDž4АQ=ۀWó1-x=|`Yӓ꒟_` nۿu}P|x˅S%xN!I5m^m&+ *c$w|dZBۆV#x"m9Eh.'rDՄH qmDAၭpyE1|Xr鑫VҚ{7h eV6Ѹխl&Y4hP}R3Pl UWwaA ѝljpdCX-b+F4VvXkذ1Bc':f3C%Ɣmcö|?95JmZ(p2պ~8! EpXsWCŀ|2rt1)D'yy([^aAjc5G؊^OL,hB~vUlu Imܿ[FxI+kU&Zఞ?ܘIN=p5+1<1h$>sz]dEBB³ J\\?blMGG/̚XxpKw; X'$5K$Zyc[%D ߫nD6~J /X 퇦%iaa!VYTFd@@+lŨg6*33㳳<XaX-:K)V=뙨n~Ou] enSoqټr\tmq|\daE[ElϰcwcEcJF@F#_O})8yhfY̼9^n)P=wT+rɯ?.,@|`/ʾ&~6V dBDzdj\Bzfz:+s(e=<*TXvANLMNϮCͯK.-\^v+<>IIpey=zF+DQerK2p 95w㋧x-@cLfY9OUU{VYc!dɘ N>As>35XM`KFP5(FlE Ш`qW0=ƌ>:ޥ_7e=\h (={E~'N{J}d[@0/01b,4Y܎xvz1SxK<{WΧLm9O=?~q+{ck{Ӷ~hZ$@O%ȣKn#HgyKHHHx>z[mM/]Nxb+J{Jpqt< 9Ɇ;q]z[q=SG_9A |`j0)SP<T'?:.,أcŮ܊QjAgŶ{4^8.m8 y/Yp2 [8^n;8h8K7 ss PO^,<1MdWo%{t#VvH*X;M[g]6874{ [ rrFm3~o  KHHPbcXx& Oν <}k\ =|T'L]ƑP[g-n1O^Rp8t ƙ=l% g  Լ^[FdHİ <6ܚR뭞ޚDz{3M]Y/yPp \;CF' u[wf#A_0$_-XBwgzI#peW/7N Oν?o|B|mcw\ dـid;Բ'H߯s l-- va G'"nojv~ V@O:IidK쬩${Tv%Vkm")D)s,M[rt\#6}B`'l#}z/D +;%8;>_)e΃s)Š"U2mpt>cǛ7|Ad؉^+x 5φw{q[^o+q5pWXJ)쬩$[x&;Gx#jLz#Sjkzn( 2mp_~X@W{o5S_zfnn܏_BBҵk-AOQg.O=)SgF-qMluWO(IQj77C~N~!ayӚGM5=t .(׏  _?%.6 \'5qZsp'ϒ{Lv k8wRrEu[(ڌV~|6uc2yxdݓxqwcraa]֜Aɟw7fCi# ߨ|-IR.vw89 WL$g "[ V!X׏$?~1Q3vj~?rv!D'(ރz(]b%VL3 K'NId|T2v$֭]ǒCF3l7:#Q1{"[)Ní]b\m6?5h|~ᮼt|pGprƔ]$0O~L PL(kڼ#N#ພaO7u4RhOtIMF=m߃[,xvz>`7 @ū K 36``?6raQ]rv^]:ȤZdAO*pȳ{$e\[dhD;WTj(_>xpuap\6/DN+<$ {hJtvfxzxL%$$pVPtP:jɇϓi[8 KçM^S/ۖkId(+@xːWo1 wӃP?41u`,w!*T`.-])pqL$ quq#hZqs S@ac.y߲ZÓ͚z7<O|@yvhO[g4G 'XNO'/Ud29&@ +@ځi*_>n?p\uX 0q~|m@#Њ#-}0riUKkdpy~Gcϵdx.<DBB7fP7neYVчNxuGcAdeleQiN1]I˖; e _sx!bS@FT꧂hٚ[* wY$ ,x7@8Ӏ^ 4㬨̟e O+r .Y>>v >NNJJwgMjKOQ΂ Cz]@+ H[<׳CȐ>lF>ߞ|(1Ó1gûUw%WDBB7ptҥiL/{ }^A9V=T͚c?;aq`d-G&&G$Sδ6m"%u(゜ྐྵIA޼4CtxvV~BA$tMe+A8 .䔛hUpZ&l!həp[w2Mkrr)3g-bsËu Dg^2tD`NG^{v͠ >{/~)Hǒl !ĺO;ۓׯ"?|<1rle7 qϒ/_>n?.84a AKw4zfickC=Wxai'?/^&|o<^9ND{L%$$p4R=rK98xm{-;Ȃ٪6$>}GHn@dFMEv ƐΒ#ŒO4$;p䧴Hn]y7keޔ?\dOx0Pj Es(pqrWYpi& [ǏOH?B6mF._U^+;'x4R4(Q;F; v6/^$ן{wa 'YsywҤvm9O&/FG/I&K~l"{og퓷&Z<^ v  w Jxxxv::'OAΜV`^adbn&$,^Rq^^ZpwmuAqY! mӚĝUO ,_?^CA N( ΂0 NAkМ:n)7ã^((M3[(o>"t[yU) guگ&%$V{KOpv@V1h Yµ/Zx΁^"fx4L%$/v "b.q3%;P2vU v>@[Dr m&*qʉh;194a;'ndݞ{I mQԻi㌘g>]&|Y e "8 n઺%Y2mp\wP:ᑐ4-VρcᵺfL<N@I]#iiuȡq'szU [F[z{wUH%ߧ7#_>z*+hNL"4)9SXx'ÛѮd/!Qa7 44tF۶JQǓ6"g9n珸| d㦭ddqٖ~Gl\"DZj4g!_E ٓj蝗3?͘'K e[>š]߮Z*L }̟kQ"8iJ9 A4 n?upwE#4m4 mB*4 BÿڸτwC_<^7ZxHHHGٿKpgHH*%^w!yI~ [>$$>!g;6mWVYc" [ZK17s 9-r1)A"41pގśY'1Qɭ௢b*Gw$<~\a#(PpTτ, 468΃f-h ZssT@4W9Q g@CGI]kw6! #ǶKݖkFfF&t p(L!+$~vZש_P_1֏sehZpI3&Akx hJW<' ׇR % mHҩS򪀘,7csptGg:SRYn+ur m2S>6F[>b[g>z*JщmT 4Dc̫A଺.68n )h6\9@5תUӠktf)? I5o6UȐp뻽2EWO_ WfKFehpx\z& JokqG_BBzPJ (e4p_GҟCBZ6HtvyU6t'iݾC4[ k~10q+r[d+RrRzRrӂ u7~:p.?ITٕ;uJZ5oyU xX"n-1.8 .6 ))h@; &MhZf<^ O 15^ V=w羔] :ܭBjA-m_U1:R![)$'شٽ+4Qm5X7V *C+ hڄFUh[~KCTx+<^ KHHTX?@5mC[si T硡ao눶8ʚ{#nHxxDK  yCPrǐA \vrpZnrH7mqNg5~vϲU}fZ /XuVWme`32S @ @+  AKM-Cж<^SX]"(p4pUWRj)m ՐYeͽXYBnv.[/6}WD*Z /x!h " C4׏W⽹E[ M[Ԇ0qƈVƩ!!!Wi;#cȍV!oD<ưkdȽ)1ƩY-p θ3A_N1U ]rBqg.,~OmzFTDt2+Q9l5(t6Tm S Ch 5jZfh5G1h k:<סEhR/xLx'<^6~Szq맻^j3u#Np5.@ƝF?׍ځo$խLz:{ݛѦQɬD,x1h KnP<"4)<1;R_D_pKA)` ۣm|c" C#[iʸb{V] ۅ_dk@p& 0.tURaƝa쪦ԠLe?+9;ˉ-li-Jֶ耋n˚$$Aƥ e&M4_O&~]Pl@h6haݣ%h ڂƠ5@"4 mB*4++4^E By>x oG+mw}73;]=MkMmRgNRڞ\֮vSMmXk_JZ(q(Մé kH3ު^ fiZ_t+Q 6QhO1Ϫu(0^σDx#<^)%$$>B9_5Dsr,XaJ0 ѣ}v1a`ؔ,2McAKg=Ӄ†6Ly)N8ƪzg5o1Ȍ7܋6VzyN^%*e!, 6hځ%h ڂvJx_;޹h9,^<]*JUR,~H/!!Qaa2RUBd( G=Hx%<Yr9/qm?9(;G>c‘[ 78x oG2 ,cE'<b?  G\,2涼9\9G,TFWܖWN4$$$6+ɿ3]'$$I%~XU]빌ߍ/[#Ež-B =ABn4uTXRT lE1*P\DZQP4J -hij{T"4 mB*4 UKTxB hϯ]kW{s9\I;>ZD~XUO t=WB{\eBs՚xWt*H4[QL#o ?W)&Qw~C"4ɴI5 BЮ]Eqy)TxkɆ]Of 6.tؙiI!-qUBBB] ]pn(yDS@ץ@PT$!ʙ\PMLw)kM3,x^T`5噫\r@"4 mB~0Gs;ȳE'qqq@,xMNI'wO ȰE4xҶ]{ E5 ah[Һ ]GWNSr5z⟊< %Ew{cڝ FO", +Jא-?H;L8*aCdml0V'28S{V}[=}q,1h `q>cFx9g`m=۾monI1 ujBmoS~x86_bVdqdJ\- L!n.'Y$Ѵ:d6ܦɣɋ/!bPym i@+ M֠9~ IhVEϕOcOOVOw'hmAujq'Wǯ皂.54A o R9W~ V !qDž窪|>b(CKД/h 6QhU\yTx+<^vx1tپcG=JWE@=ڝ#nmV߄ KEn}1|X݇+ieEߓ;/g_~OT\@~dAϏ7 %ߣxHx++1s=g1P2ܵa@-)UGEss@Ƨ&I7&= =5km JGr&(^?wem%G:ٵzm 0K5H3z'Ư+EwRʏM@͔ e?#4w}l}֮BF)a:>c|;ᡎ A`ԫٮx4<ӓ<5aDn^Wc?7 ^=Ԝpy|]( I(+$թTfBsr&(^?㢻Vs</eNW` 1S"F$ymVU?4FhϧsF^\XL^o l55NxB<^)RgNH$$$|WV铿}#GOZg=J8oE:]3I^~7 9|=I{i:;HА2ibH<r*˙׌3u|AًV$7l4WU`l1bԩHNn]-O  @ LTkZ?uOBߧo,mf< ";Gi{6#Ybr*%~]j`_PlWȁ uȵG(2GM^J!e;H59Ŧn϶vX+rS8 A? O*0c}2ɽE" v<]C+4IKg֠9o=_f  `v,[ /'kz6[nRl ,q56u ez=:m. S!`07UF~ N>|dei5E6B.fK N6嶰v%Hm NLcǕXD;~l佝Z`1Uo4%{JVhkz59 ;ϴong&k4='k?{vk~WIl1*v|-UT0g$)uɧZ㎏RHz;Z3XD~J[x"\9pĿbӍ}+z hC 4IoXi8K+_UP^Btr"!!](]&B8,D13Z.*]s7ę򬒍B$\]cHHHKzA ۜ&Mv5WσVd+h9G}=2ǵ~UguU@9?Op\mp\g74ZfgFc|mW/5`ëu!(gA$ᜱfg~D7d@dcVIGo^!5"@`3ǹw^|d='̅L1 C ЄhQZÍVzuw U_Ex1Om{CNP$$${ 5x5cNX 9c[+^+ڷ 7>jַ4씠)rC[ଜi+hLt|{$~Smwhw9ೊ,HX'z;?IX>3s68θN9o mȅ4ۗg=Gw"4k_x ]y O#_Wt#}@s@OYĽ`vG:~ kGuLp"?I_Gtv_?k#; AKUɑi?>x닐l'Q JBBq%KK|ö <l%!`ۃ$5{%K$a|࿷w fM1O3&g:g%\Fԭe[A^rtg Pc>c9Ә.]P(zxaT{V~4 < @ .Xn?4aLM/=d}x7ޮ{A_"}|ö7n@85( gpfC(@r-OFBd{hH;F[w[xC60'y3'OAiBmKav?4->-$細lnW/=dx3?Vn(e@BBI<+km.:-^)$W1rTdy鋎p~OlX\p;tJpܴHz(4V56A`w4ym>J8F~Y<~sw=V'im3pPmZwܯ Y%|p~L`G~/My\t }@_z6g"?~>Q3fWޥiʕ^W;4c:X!-]Zhuۃ΁w?*߯c0 ܇, 2jA;g?hR'D?Ώ)<^.At"!!y跄^SY%?\3f.On@\a6M+c4GZ y)/5hHv!Uӛ'; Hi3sEMRʽ/p~Jjwr!bӦdsv%6\8[)lTؕO.8 .68>hC}OhnGpZ&Ez(@j[%!7?,"z,/>KO_o'z*I#~ξl&K. y-@{B3upZՕO^SWZļkrǫo_{ƒ[WW90f22|Xrki\[Va|NJ~h3r*PQZ i_P߳dTk[?p>su㺴u ?_s݄|ciD ΂4{yp1ff?4zK>;x9^(EE(?iw n_] ܢF=t2q& t k]9U;GOo:tsí&o!T+`;8Oyp_41wԛ?xB{s5cG? |eNV$$$< &ika%nm[X/:['$U4pҝf [n`na =[6*YP:tmB7غCDl7lN~%G36o;0Wچ;4v >]p\p섡PZ;CKCv_WwO-׫?vfLRuيey? l?|"A 8㸭Fdo=ڍBxs.[g4=pNiB7_q?=ȏ[=~|;/&z\+5M@3@7D? |eNV$$$< %* O$G:-<DchۻF=<|J{m#-xTT'MMZNJBϾYiyi.hcqS\l3@x'$S׮wgߏ8k7W}~9<̕_ Hz~+ʥRIpWY]aeip<hB}?h- nمDʎyU5@?za]7&?~lkI{KAM_Q]_cK_*|Xɿy1% }  s_KIZ ^;o>5JXW7gcO@zV1  G 7m֞cp~5Z%}e[%%[cO~B!r[\\nrsR[$$萙, tԎО^5zO/|ƫN_Q }}?gu@[4aoav =l~ G}y @BB6PC}鑫~p -f318iEl [j)$w4nM f W4c͠oЗ-|ۺ5{aGr/7Yx3~oOoz8ogM͟uipyC .T# n[XTweL_`"won-<kLL o~:t =iwjPwT}k+|F\#sܥ|>:}hA}7hZ}v o *O[8>V݀EBBsP㓖j`8p \mן;w)`YcZo1%6Μ}D39MHMsXnj|s3<6МdClh҄]/n9|T p|H6NrKsx up{<`wWYp6q9 #0T {ek{v-`՛s@ ^V0hA 7Wc[gڐ׏7Ow.g~x,ǁ{[xbGFnݘC,x&@B]J-gw{mO.9\wkD\9&__oDWs4H@<=Uqp1ቌD! :K_s@qaEih \-4epvЂ^%W9n~,"i0g7{tthwe`^nrdX+VШoXKwTR-1pKof Od':\.(#}}Ͽ Fw"\44/m]) K돁۹";HHHx+JהY ,qKyD`ecΚ@밐7rS %)w礙΁rBnm"{h5Qj%{~ǝw>} @pjs V*\ᓳGUY]pqruЂ^θQÞ}Gw}#@x;> T# _rO{|;7O ^r0m23i Iuk qс^noy[_L: _O%^W;~.mmp>4¿Aµ.Tߗ j \hor.MWW[r럝2u+ c Gh V5Gc'+Z%0w\^v :`! uЂ^GQvD0//   wHA+ֹ,;-ʃh3.W/h<wf'e:# EMWtO45n5D:vZx"*mGNhcwrQePy6P{WYps qGWB#; &jX۹>iPן ?v{c\ _;jp9ŝڢxg 4cC5WIE"V{!IG Od]/!nLNLn,*K_s嶉-.` +tWB#;WxXTߗ j o ?pTw}k5Zjs, 1sF} PP8D3w)[.J$M *wM 6]v+Z;wT~6}~r1rqc9\@|P9 YrQp .68܏ Ј持sǴA[o vg] 6?|"͇]D G DW(Oמ^AW"U?d;3UW58*9p>4¿1٬,x}OYTdd•p Y>QE~ 4_Ͽ@E0381H/ UD' (͓|> !!~Y9kF4)p ݽffF)j@ՅSp+ 0MGz+k5&HG/ UN O" O#eEa9fO A; + UNz<x;}Q&M`4_e-z^Ә/&WYz-F6E=|= !!& RB-Pk߁]}k>zRPyP )d@@=_e)%X_5Gd+mi") =L(_J@\3&#б@ʑ`?t;(k6حh F+(sυ#* pv!t>age-O }~]Pn#ۥ?2߻C޹Оs>H4yJe~|*@Шh Y3e_wt9 $g~\7wRܚ1sY\[FE-_ t9Oݒ:5p15+NGcX Q>as~e@BBsqn%"^LiIc,O]8f-Z-!P]TT =[s~Vkz\Y^ϭD i nnK,ooi:H;R,'/xX9*  WyL<- <>rErqvV+~յN2KoX|*:ZxE /#?~QBx 6?cW k`+;! !!~YX^;¡n'!P]`߲k=?PHpP] @a}<pb;cSk@GO%wz+$#j ]sn#e`媍v'(W" ؾ?k"rql%գչL4S X5" O@d㏉G?H+ߛ + {@e-I3s+ t^Bٜuӆչ#m_U*l{p/K8 ]ќgҫ 0>X?Qh7սЯp9kWxtpb}MJ_K^=Ԝb=kNW3/8BmC{?  Xd@BBdbW[w9s;E'M,_ʊ((]ǎ9zZhX`>D2eFN>Jӿeslw؋N>oby)yDKV ~)w9uCYp-5{}1`CVj&s΢ū9K1YsV8  [Y а5b9] O _\|[cnVѭc'VBcFϾv$y*8ቻGs'zUEb`;ed@BBt y9cu4)oBWK=YWulo$@H  n AZ\K^{~/Z*P T)p+~o쓽}^y~O)fYY띙5[ /IȥwA;@^Hp f*.-L;\||d3ێ=gM "\-|H0s|1@AѽfR@ 87\!`eWZϚP|]y`P/I "/Bʪ~&Cf3g=t .> OZU0 ýQ;'@1$1Wyj /IWxj5P" g !7I,4Qsq /Is3I= V&|qE7Ik:h*U@qM%/ $%Z@VIZo{ }Nq&c$xk E$癹4$ጀ/Xy!DE+Z{]` D#'}Q<4qZRXI$@KJ^\Q0> bboo(1FG =QUxOc{cn# w H`ܧ4/&@#As{OEc>D|4S?DF|q9l-{wT  <% EOԼvVSH3Ӧ>ϹU|[E$8S~39O [ag>=ZY |R {g}rL \$  uH#gy[`Ӆ$!:S3F?{}|J!]zs\= eE:*'|N@{.F'`=쉜_ d3g- @Ԯ~IgD`> twb/Z|,z0 # 2wn3DJȋ2RT=@G (=)9F ĜXpG@ɑB33&@+!`߅'v356 DbDEE7Ҝ\}ᱏ | nB  $@O $@A lacǎae+WmIrs"c&HАq30mz.bE;b/\wGa62.̙X{O-hE='#PiQΣ>(?7[=7={f^am$JӖ@?p܄܁H H  _k6'ϩ8~ [r-9Qi~CH }J.5>b_h@~fSFO/7`a4c,pq] $ } (wLwZSHW88!v Wȹ{gϛ ] A81_{d>q@˕]h*96 bn69qҶW5>]}@$Oeܙxɻ⦴`gY/o;>w뷠wr!;vGlCT~P0t:t`U0,&z1n'KW@k[,Ss߁,Tg^)yGZH*Yqќ;Vz>q|Kq6=$x]vpC'=+p[z/&[sz|p+;1Gj]($Zzw#H BW0sB=Y *Tly ٩T}u+}}~BFm|w?/b+. Z3gT6X S#>t@ *9˞Z'c WOT^#&FNj΁{OXW9%EٺyB+b UZ-zwJn#&[ۼ52]yť:<pR A膀/X.EHkV L80tjջϞmuIܹK6tq8 蝰KC6 4Ty'X-˘<Hp&8y ;u׼WBdv`7.={l[vU.3GF}'۝Aq6lܑ$xp_B?9Ćnt-;6z_n bym=w6gv?耳 Cn%Tðlr| 1 &|<;# ]{ɳA!HY3Sv;'- FETBey׀1bE0su3f._-Zw烇Rl,AŮ+WceNvFw{!`_c^$=Тx<V'x:^T[̇=ċdomdX5. ʫlvl,vmU & ~/z $ ]  ‹9R!\Sc Pg<¯UoOHףFq e)go@EJ _9,T>jlwyj󲖸6mś)mڴSX tX]`>?.Vϝ OzwFw7 @?:ۍ"lK֤Iu-m%'. 4JqNRr*og9g#IAЭ@$+DžUUæ;T!s֕798. p7 := [۵ϊ;d_ՎXl\ŖUV\kvdm4M{nŮ+6HV@8╥uI|~7:OxXHoR139\~cûǛlC,lSϵk]LhZǫn҄}ra? A.Y_ :=: BI8L٨"eXGc,٩s7gRanvOMqGs\(zh/ֲy9E+ CMGDF>;Uo].8qC 1~Ur^-EXl?8!vdbAoTcp~^.le;9!㿯i8$' _`o8\5O zX||r%͵樟>uֳ+Gfi /|'ΩlyN~l?65GFmQZ<ȞS$%A+?wxvd*eNO/(@mRcBL?}zUʝb ̋_n`?$5:{gS7r-< 1mU+j.$ لӅ;읭vQPvVݮ9,S+UZ Hޛw8W~U7ƀbбSwav `nTd;J6<%  NAoE} ɑ‹woyiYQs^Qp%7|){++3*wԫ_܆mp^cې"[]U6b@%`;َMuQ.' _z;o Õkyj:r΁ `z|EFtiU1-\LTݢkQ͑ڱ>۹ϳ3xq*@V:u.ZZ9{lVe#Ll ¶qg<=PQ5{J"d t 5Wu*# "[292M)vpg^&{k_,5CN>Z97>f.l&M})Mý‹z E`+e> 5T5+_& @;'Ո]{|ڏIrl6P._0%p$4\4;x^5LnMur.ٲ'lm۲akXbG /=k /M~-poZ{ .ebZ\u/' \is[SK$Y;?;9r=4~bw6AAmg,)KĔB 5$ g]+1h[WYU3wpsJBdɑ֬l.;֨QK5W٤lR Xz=9 17_B+Qcӧ 6lX6}u*/,RNEfP*PjRd e^Tk X=E&Xt%;sYr. -W2*(_j>fV`KK֑EO?%wL,&.Q /}ka;hN^TcELl`u۾|galyB&AKMFϦϘÅuOocAM,cӦa#G_@it}ot˛O&=m&ٮSCs%~W)l9+7j9K1 `H ZK ]kO@O?-tW3H*`SPX^7=^m[Xol΅/cA1yh4Flla(gv._8 u!]h AO3/޽}yW@&jfWCriISrd͛K\"U.o=㚵r*Xժb^AlvYY(ae {_Mwh-|zpg\f}R{M,n ƸkYkTȦQ!]h A/=aIl!f/ #{(N"+$YP+~]y"0Xac6G=^}s+U+=XFGf+Vf~Vs^\y&l19lvM%l*w}<2K1g 洿 N\m'8ļK@i"s}`jb͋eLgT_l4pƿS56.v?64ceL.@A` 6n|b~\o@b,;&O<;$F `N&K uBa`FQSKDGԤ&I[BԳֻPPZ4!NO`lFt->f+WcW;2U+Dktn#VMsVLn&~<ܔabbc.FDȚ]Z מaw^̻óY9OFߦnE ? ƤwacפZ?8%B <')2xh rtZR9 -9ChIl,/tܰtxWvָyW*g~ 6-xb.%lvOnӜw@Q>Ws@246?w^>:PFxA*/(ƶex@ 5JsT~d. }zW=fG@"#axwv9[.PNM9g T6[Xz #[J_쩉"*5_6GFOqP#˙kX'r4WʏV?Bg7LiYCss'C"-.]-5)17X4A|cBLAa܄L(' OEtOA6|,kY 5)bE90-9<]-)Dz }?*7 j!OH윖ֳmBİ5̛*7%}D4T0m^.1bcĪCbD2KV96+ >'_aU^,Hssssss@Ԯ$h$\{>/^_/ſ'@ÚFޔX8[! /i,$z2Ew o;|H  @;nݶ[4.[\4Yʷk]˅r,qu0bdZ\Oh/Fuq*;!M&x3 #p&+A?J_/Ç$4[|0R[\ԕren㳚"D8<4Fc1P@b-241㜱nla4_W~,%6$x"1111ǣH*FG>#^ v+]Q/%u2J(Ģ^4vW, cLU9*FG>5ó[9<}@V%b> aPL1 eZNW0}RtC5O-^nIMY+c-}9@$ +%W̵|-}h0g)@$^zI;K_[U͹02 I *)/O $дF`% gWC_a݇dOtlCNcͻ='MTM:'S%O]$1W I*,.pN.9s{rd(}kޠ#53S3 /حO+/%u2<1|tUx̫:쇅2GR+R- 8)B) u܇/~Q̾ўKKjg./طbr,I bk>''1H4>~2kR)*wVEG>c%GG|eTl IISjrD'~o#s'}6/*<$P %EDvI*UkBdQP<9i١SbDs7>[v>Cy $AF9)RƂal#{w c*aZbXJJbvTJcݞ%mr>Y'YO, &ibbvH6',i^Hss]9 _G>ӷ`|o!Ś㦲V /AV%bEȉRR'mJ} uv^;pdr1Xܒ#jP(?a/#J99G̼šŚR~1Vxo br,I <''18)S4nڼ&\*6~tE#2`-[. Q[p\,?OFujhn))*^BƗʷIf?bUcaw!$X v3yk!+FcHFtI1e'Oa`LmXKM5$Y&ʆO$x#T.\剩4w11ss]9 _G>3|8|WƜ /AV%bBqhMGN OPo48pE#^\\"g煫KޔES7Fʹ_>y{ghD v+]g9KAtB0o$j&ĖWE# '̿5cMQe, 8yWA8'W_M;5 =6ɏj]/|/ d' D1YB]\,-hQ]V4J HfVf$E#~GDZ9(ݾ^h1BmDuFj^1(26-6$Órw\ŜŻ9 cNcnKss]9 _G>35sGׯv; <*7l;v=>էbr,s?#';2멒?II,*/wvߚK몪rؚ<%L-$?Cu܇/~Qjy{n I~?)k}O_a߼ʧbr,q㾄D,A${ƃN3 /37]ˬXŒWRM%ԩu*9r;?ǒS lCDRpe (9<+7Š.HA#FAYY\%~Z |$!_jkv=d>?Wۭ{8Fŝ˩>cخ8 }:@۠'äsYsg 匙 uP;g‹~6m ->A%/_JhPӼgpn['j{bp9Y a"k(lĻ#  :!2 sc x/ I3VOx/drm1bōwZ9-^Γe'h, 7*Ussʹ_>_unQ 9m՛lpYxZln8",L91_zw%i~&b"O(ԴB‹~{?Oo'uC- xj(#u܇/~~X6=oo+G*\~M0x)1[9#9q_  |)&&'7i8k"3 s2d8&~Ȟh3_>jO=,I V.h-jPK)9IiR b%X@RJ$ Vsi,5N1>?Ywvc1E4|gv[d0`9w (02s\ !n^N݅ w`=8yU"+ScL))SN{^uڱ /b›)9>2Xl cF?'pjvi|oBb;ߞnk1[9?/ar A@6 ^!C}6m%w1YN‹~%YRa- xtMuo񻓓"?2)=lVJIIrH`; "!@w`$4`e5ͅos B'9ぱ]+o%!cz[>ՉO?%ρb3䞯reo͙1U=0j6(}gunޠoYpK5[ KZػj  rܗ;))|`Z}Ux? |g`~J}"I5GE[eԫ So91[{\kwm- ?f7kRLW/[SOO5cqUGϜ}M4Cx.Ol3~I, xJUT@M)͒x߆QllsjW exX~Oy>' V+x,b #"H J cWr>9Oy|ży(,__iNg_c9S ?+1${"2aEGmmz]/]b<i NH.~Sl_Iý }G]bS{o<-`IS M 3P7jǜW|B |Rd=m_h,T ׋?|&K'w ZS@NLud+VؚT+H"зja2s|-Y27gfsv àIMyߜ럼٥*'r2mH^N P #aqɞ4Vʭ:r=}4'Bm90W\W|GtŜܗ>ߐ>3\=\)2M͜95lێlӖ]^`CC,Wvz9g5ɔWCt }{ty{j^?)76PR( &S.cc~o~Q[b]Xö4w246J_o~QSӜ7 }R{UGbBx[ -' FH4rXʠVl\@5ndڔ$ԫ R78FJ_o~MޖQmOx<:@_q&\!M?AT?.QIgJeTqS'JD,^yYToWT :&GtNMh+xg`?ڝ?I%!Y!F^ry}j@E3(ymiccc+}֪uC?`x4nTcSxe̷YRi*W()bjN>ܒ|׬YGUW*g~wvH o.S]դc/qDApgL|h0,͠0gU ,(68:<>|@_;!O?ծA@3PhLaͻUc؍^։$&'3Zd^M|]IYZN5V&5.bIjp~ J߁)} n!坥]NSb7bBx d wG}}F2^lM>vj֮-w5UQϢ!Ndž-! ^W紋5!21 Gù`b.cNcncc܇_>_RgQ~vZEF1&LCMwGub]lTvjs'V;Ē|E")ӣ٣_P|E|I[˶V?v)PmYώ.]?L5G,&'Oh-mVlwKx>FM-78*rE=hQ?oZRD+lKKMM.]*9?3׬D ~SkT|AOP<σmҜ\ƜWkic/|>!|>#| >#GO}l՞=Qx/ej&v3AFVn/<;DKor8E ?c,4>8V9B567 g YMA>e㿐m떤O&?|>a鋑/gd/>˭p Ņ2Zh~yjl+!;N]? =gG;ufs>{"av6?D5&KTPIWly+njð8\F9^rAWy3K'A@uGИۘj(is|>ߐ>!|˺&|0c_f⤙ FrLFVb8(ZSyvtq׻SՍMaWOG KצrVi՘ܽ3Q+(M-LM@ '):LΡbSHMc2b4bչTa3@"a24̦4pIB &NIӻV%ߕTSmY)r3To|$wL*U;51rZ2hIƕ@[?$|p{ss;Yy}J W;J_oYvO/ً4)Zuhu4i26pNS%R'm.._͙ەUw% RO W;J_oY$yswm|W)z&ُWW"6#F+ 1 3K eBٳW_vyUy6R6v\fn<`0vq18mVF-U_|._)]KNR˄>qpkL?w& =xtbKWhTyPu9 > |Q |z'|M X %\],f&HI eBfh5vIfwߎd_\GCnoYy9_8z~N$>?WG %8bߋ"H1Y9V&„ S^"R2oeb٦mv1B:a;F}W{`[we͚T%ߵj?*˕zCBI ;5 98?a[?=0}tf;$}B |E;%os~xq~$I%k ;|c<&+1ԯȐhӿGwkz7i+ŽM+n]ax?Mm*^gs 3{+2}I[5rc?$bGWwm>7b1bb6bA GJ"Mu$ML07i&%[mQTl l@{֮}'pRJUwt:l.c)`*566Ej#sBZRDΉa54%>,JɿU+o{SW Mݲsss\N1|>_6,}JcKVG߼e˚M8C?s<˖>nvI2V/!f#v{HIipS))L0'6*>|M2ʷd-=c'gfi~;gb .eL,NQ7()Gv(W3SJϽz"ͮ?7wtW~'B#}^|9ؽ3~V`bK<Z# ē#5k?&6a*o8ڮsl#ll-l>ajl6e,05s5{![t5OimUP]|v(ۼsj`4IO.W*?&=~}NP > ,WgJey)gص ۰q;[vOYn3o `q*lkŚیb4b5bSV3S!LMatMƀǰ'%Z7 ^zP!~ړ}^{v>[-k#?bOیb4b5bD8|IJ.M1q FKI爑cm3{d P%cYŊUW^JNhhZhlw\lF)MLkV7Ql 2pU(o܇ -Z |>_ >_S|>):.hb-bn|$8/;6'X$%`hOtos.70{P k^Ly՟uǽ G{{:C%ٯc5ᓢV "\+;V+CA%ǎ`p^U&I aG5k78.`GeYY\|S+W/u%zd/5NI1T;,=d:Eݞ|i]. hm7y^[@;4' |/,4$_)}> ߄{'@LElEEQ_19I4$p^U&c ݳbٿ_as]`0&[o6͆Q%ެW%kT( ҤÚ Aх1aq/d>oGC+WyLΉZ G/<#1U2&7+َ+[Z :|m۾eه5HhhgmVKezEԔuqMNpέ]9J7YƭczțE"+X<7lT>>" |FN/I>߂YvTb'Y.| ADDD E,ELYl<~$`p ()c dٗW~ >vOc]>w -[=*Q/v[~U!_'/YQ.r "s*÷c=Q|> ߅×s}^ADDD E,ELYUA~Qlj`OSttt1)}`79Z{'XJNst]Ү}*kҴKpY@qHsf6GT|vjwjQSCs.IAV&~/-=HD[Bv' A|*S-| >ǯ֔|hqq; &Ab0b;/;$%3>ZX1-]AK`aCk8,``{yO /AY.n >_A4|>.:81zsylvCYplqA߉ pQO׀gk֪*UrZ&*uR/*ٹQdɉ_f=ƓU=Z"j"\ >" |FNK)1Z1|ryd |> ߴd ^DE̕;@_V _USDn$8{ܵ(m|׸!ϵ]ʯ_E袖<3}04' ֋rpG]pqQ 􊉋?[JXAqhV#P2?Rrse㜖ٮ9 ܦce?ϓb$zB[fGI O'!,M), צI|oGYn *RS*wUpKA(Xl٩韷%AMLl/W/@b[+Ie_އ>_Orߔ| ‡ xbX UWAYV}Z.bിD0K->#o /xA2ԬD |> ߄W]0|> ߆kO,+')cbbb b!b"b#b$bev4p3by6̨k*?)iH|] ۯz^CuKˆ8/өl+тmC4/>HSqC'$#DW."PtKY.| oǵ'qL #+ytDAH4I` $`۟?rwA))+-D L鄊%ZJԖ(!aG'ݴ?bGk@9_"qݎRWZQ6 S%K-QBtBO'iaN⿍`" }=IP񷇧W?O'{oo$Co OZd?K;~?A?2ᏗX$qYʹ$ޑ-Q;1ol˄?^be?o&l:؄0M%HA|&T"џE_&0|\b $gK%Yu hb oxJ1֦m ڭ'KޛPХkֺM{0?bWZ}ZdMWqܔp%22`Ylv066?d Ƶ?AA/$8z^ںM 8)߰?p9, > ۻ0[f6vD֢eGEU}U؈?ΪΑ_n6=y dv=١'،V%KTU@dc#A /L" JlKtĦϘÓWIts~6e ^XYJ,M@7dcoD(2!]olΓWItq`vzc*X.ߛ"o'xxcUvlʵ“d#pE c{bS@76GQCj[}$`:{xޢu!nؔ /!B& $n)Ϧ5g?g-Ocb8J89N<'sysϱ9sX_x-O'n& $n)IO3q$G{_ `w'HccoLs<%=u/d_t!Bɾʒpf N`7A=q<۹ [v {jS 7av>N:H˺/O'H{ ɾʒpnT~ƲdjG n\Jd߼ՒY/i,9,Vl]ܗHCG' ŝߒd%3ms/u `cʍl| z̟gL.D??ٟdw#$CkؙunO֛4@^}Ej+V_.L.D??ٟ]$ + l56ǤD9Yr;p/zr)kz%:ol|mʕQ1؛g;$z&`M/72l_G:Yb;8_G] y%huKoٺ&\fh`{Ϩq6"D_G2_շ$xBxbl4nق>~/Y/&EG)dco.L?Β\emV=-<6*K=mcKVXoD?!_I,ݾo OjdcWOYoD!?_xqBqVlT&{| fᆪ6v8)ӺXAH[;I7*I{g~/5kmrbEc"`? ?_xqBqזKN ^/:%5bJ۠QX~Jndol䯶_rnv$D~ۃlØJn$dol`8*# ~iO?GQW5j8FH ;H#o?݀+;Be_&4|XYt#'dc@^o9۪u;~5 Lic-ZU/Pv>˹YmKkW`{ÕL6uIe I??@!ٟD0dXVP/I.ᜃNl|MdolܵU"Ydo_J(q՗$p/_Rs]7q$.ȉbJNDtwbF~Xi' ?!wo譑]s3k?WmvRk$dol? a r8}Uk!-{Qny;JnȉUIOT{fD' 2WnݻV Υֱm={[wKAHVޤݾ)!뇛/7b߾Ӛ~bOAmrarT+GO3\n+;xwϲ6 OMرg0rI|vwȉazVuog?.`[β _,VorX{ &̨.H2wS%߾Vm]eXna~or ATN mu^N^bYtS`߳C@>H7og;+dXgSO&w];Lj=> _<[aꊕ)w+gP|8+dx~Ao7肅 aY@@H_l_5ݳ0ۼu7?c-L?.܌b}Mv]ʘ8T dՈ|O 6"p6פy^or As #9%zmnTujK\~v}>ynͮuRRǡ ȣxN폆oTujKK Ǐtǁ E@ & @J-L0ٟ^ĪԢK ٟ0($1T9v۟^Ľ$OA`*Qɝٟ % 7HFwүE! gĈ.}ɚ[tR?#Xw;ۯD -l;0Z{c}كG*:ޏ俇?=&F A@L5[l**(dM[v{?=.FcL7[\vfKhm4]{?=.F A@Lm 5k/=7mD?P @o@@/z߼R{-45$$A! &`]6K>-V_bӕ{;8>(  6ɸc]{զW? aPHbIXdg-{{ؿ z|M0 7^Jbwo9Shtz` A@L =4=> &6C V8t;.OA`_o@+ d E+[+u0N A8 cC!ؐ`lH06$  06$ 06$  546$ 546$ >c>;n*3viآ'W ?_dEKoڼӖ]> WWn~*Arw #@A @OJf^$}] ?|~_?H(|?ɶQT$A!@ĉ3 'L.XoyL ヽNv G?d Eoޏ3=11$ r~{[Ypwe@^D]ӿO`6_gt*kWd E/%.?5ӳI kEOYdYg@H}D s"p~1}~&zt G.,\Q {q|_=U}l=?@Ek"?qL Sq*L2KxR@&=eNϲOS3JO^ ތo"g~|SQ“z?PB;S3{Pȧ'9?=ZO? aPt%8*IP+mfO `|Z]4DI?!z)>=^# D'z @}pƒrsI4$OA&;y%“m=B~*ًXf\6Eb֬~['_/G<E=СPG>;U]9\}|zߛK A8CeJd[Phl&`[IEd[PhlƆ A@C! ƆolH e-:?{ulm Ft ({E :!QD@%Q%ыhޛvl5qK$N;3̶ݙqvgﻣ<{p\j.Y,_d˲HY1x+ /L?ǏO_kM>9Ә|x3?>H^nEaz,"p8@9,@t<7L<1ULpeAr7+V/ U3 :MpeBr6r>T|r17?78?' ek=6RV5|]r|?fy_kn")K25'gwlby(TC;ܾ @/3t/kG>.;.xq-+p8' wO = nlS2f'l3̎mYjpPǪ5oS2&yt;Lذӣc[qO)G/Ma._EzfPofkr2 ¿/XF,]!x8f WVot>Pȯ''}(Mg%7oC˄v0ebtf3 G7;1>$c`녑fnT\}q[cE /y0!>a,\0X[VXLFYy| +r)z< guZ3è@tc?ϲaZ% fv0\`}zCkqgQ =D(d;@m _h}i`T3.pzb#&B_ar3hgc` PFŵ1f+;W{1r٦tnW`$S^{\>Q&E,WŒl`@() ^iҞLu~nu^0 ^itn`XL\‘~ި `vV F,W Spyv֋)\s'UQNq@ '3ؕ5ՌX{2 Zƀru5Kbqpq ltRWulx^Y(@XrՌxpqEU'趌ې^ K;Ձ4oŢ8^[ ,#uNKgfL3Г{wr cJqի a 8^[0Me u(N5{x9 _͊1;.l~e2[p8åPӣ5z -h35t:BoSFvgc39l\_ } _z>;'8@Gڝ@?8TwAE{|{"P =?eΨ>9XS;>v(7836;=HKxcZ0uZ6eXٱc-l)0qU[ XPC\Xο{#gz[&Oi#H{cZ063Yp8\ @l1wS#ɂqp AjfyϿ{#gz[bšvsm:p8(d+=Tan<:fO@Yz`Y9yo-]t8{m {0 S| Fl wuF؜͓=07R`snEL @NL0̠j A-XWȜa==6T`330cp0ngڕ!p]oO#ʳ`ޝ6c9G- oM? º0:#D- 1<Ns9\of<^7};p8veknp8~;:#eyZ}Y @}9Z% (L;JHV_P>~)?Eu W %4wѦwd9cdDnYYy/ϒw j)'/㼽0Bvd_/3'ȝ kͿE f uǁaVscg󘚶5G=Isr",f8}2qtA 6 2R0(02t(=r,3 ͎9I|:9IdldZC&16vY,3K;^ ZØ- r#,0#edn=z?׎/%S'Хr%:3]Vh(F!N]~G\]ςQpyYeL;(fy+TF@gTb&vtW;f9`,T|0b^?-#sǒ|>wИnp8~ m&v.u"sve 0}Tx]Fgw)vӯ^^;9F%y8΍)fm9U 9FqϘbfQxV}3)&fnt^TZKi'ןSG/U'/mJxRE&/mJ^ ykG5 ![ \O+\Jer(Uȿ~I/!r#v:Oq`ƅ֥Sm|`]x-3ՀظARJ!۴;} $Wݒu(!|1N#գ#cI$Mƴg>8L4M+Wo}lݦ-:$J*cN48 1NBX15nY/I⽞lfiv~|g=N0p'^(kTY,dʗk ^iN?].^.F|صR03_p"%@_&EKr'Mo+U&P,{h3 ̂qU=ohRkDA~p {*A}eGxnp8~RS\/(Xn] :?|:\IإەPtaLuep:_I qL'y]'?~$=eZC'|Umo\anURp%>8.3e0;` dbf`yfN {&n{u?0B*vuM.\&XןC`t tClac,Lӏlʎ!C !5I_`IH++ >#a^;:f %;vrtҹKw1m&'PsF JHGE}ia`9I-؏`/o1&f"LilS;EGoFbK;]"bYĵ*@ys lr3LD*>o"G/o*ta\{U*nӼ z6J_Dt,qt}qo0:  +;6BKK6@ݨ9w 6G<> a%f[5a6f_V|io /Q$6hD¬b1vDa0i3-}t|9$ 6?a4 D1xOEq I.ӛ9]|H2!;1{zr+ք 1e褣_ot?78?žxŖeLxqOO֭˵ɲܵh:?2ϿitGGqxTQNV>=-JʉnXmKEg .9?RcɆ` g&wV#+{,g _Foȿ 2\rfMg~we'rB‹;AE翌np8~#D?t4h,L!eʎm+ . >hoIST(U?߿;:}AèQߪC1664S\W}ݎv ϿsD@nI4iL6S҄N( XČȧ1HV&+bvMYdk<>ϿcTtrK:wUH ׍?REHѼ*|jΪJ޻ؓX6UNŚOF߇oLȿ3E։lLEt$LO.^n3:NfY t\ EwQ+q뽌 H7b# J%7 ??9ϿcY'WUH =?ChGMѤ')֘k-pkG;>c 싍):7(<<< 1W"&K֙tveήz #: IU”aN12אUk֑]T8.ی)r9mۅIO(<<<~/YgӁEO)a?YD7|\/ֱ#8[#Ȼg!}8_8/[J|Oi. >Ts7[p8Q#B)?Ne HP`&y\@LzoWzur+x}F R~fʎl7[6"9v$w5;eÊr+x}7[p8VD-EsI;8&L9%xx(|5):~ryӀ.# 9nu<>ϿcTUv Êw:!DŽI 1ɍ}}w1\xt/\ޓZf/ :Go ZD0H  lHCBm66 ۵{?9~0eNtYXicgY0?nr/9& nhAX569ە|$9”U;e|`6rj]'l@ 1Q)lOO7[p8U`:#EpGtScN &q$ČOJ:w*۰acek~UOW=9ʿtG͔`G,"ܸ$?GMȊȂ*b9tlǚ_~?<7r_?*@-+JШQҲU&a&_-ZЎeǟz7{?k / YEyE)?i!u-$.Hh| m!ݪtnߪ7r]ȿ?>z~>\tlNGTºжl sԃ؅mOZv`oG9A 6bݛ3)r;_EqfʿtDI*R'7]'Q M-dHź$8[Q_jm![,_!VJcZ6fkAʹ_x}?Zf =vfY] TtV9rE^4Js:@Kl<#gȝ ~Ͽol-9ww!^RY-Jy4 (͹s8Ϳ'-5o(p8-,]:)(_@縼򐲉Iܚ̹8SeTgy}<rI?}"d7?xVmНt+)(A_g9wW7ȿ^ 1?xho_1%"<™Rr(:X'QRޡ[xGRw~9wD thgFJZ[G4rc`DsK?k3 7mdIh]Rr()PVn7މ!jU;?Ҝ;{O lѦ"ϿWT+K ]ʟnmDzF[Gթe@1[p8cq+3,1jRQQ)i TJ? Yg1eqfLV<ͿTeh!oXf$.NIiGDQ282R)q6gŔ] Z\߾~ՎFG6y_xT֏^bt=??S` AXA]ket!ܺ~'L>.[4Ta8fM %b"ƈ5bSQI&jsWuUTdUbk ];MEؗb?R^kmDSQQ8;O(?~1%N#ֈ9bOy`bD-&Q_QiWj|h +HhmMEޗ&#/Q1>.[_"PT3%tfe;-dqaSnQ2q\SC+w1_'XQIԦw_WOEVU*RѵT}I!&#zEZ'2HGb ^=P~2V*U;72:Ğ~ j5ocHp8`ǯ 4XHY!˄{W|07>Po- c*D0M0UdYo-_ gVSj )= {Ns?v郰SXh|*1Y:QbW{Pj5T?D qzRf]ՆX {Yέb")b@ j:yGU,/I*d댇Mݪ_2d-gF;">FG|E]TnBV>]ߘ,x0.q߉@BDsŮjC !bE}5Zջ{[7B+oNy;*翽 ԽbW!=*XVjEoCAVݬ?f ?.ZV3[-(ܥQs.;#ґbDL[h~B͢v=᝛V*#ݪ/zwZIQ@n }?b">.5Ezh~+G_?|6胰sDTLoOd ESHκcsWY00VEKD衑덎jP3Zuƴ.GpaS=z+`)Bw,0%9ȼIlb!㯴 Sm͕?1B31D,mc0D}κMoAQQèe+8͚S1=7Y8^Jl g%kO%D_`m?oˢ`V%ddL_=!+eMZ1D,Fj]D-:0G [qS1=S\F^=;|~)|Drj]'|PQkOڙ{qixadV$I=!kBkTlZ!b6bؿrƼTQQͩzϞȚӗ]6$o7Ȋ3H̰n6=՟F5\=EvЮs`ZFv.#)d;J0?bXĀߕ̴>+ jс>jEsSD@֕ 壟cdghRr4y]Bw6VV+pHx?hg Fn"2vDꈽX;Fu-؏B+ S#ƈmUDmFͺRTP TN#wo#_9S@3WJA9'v Z:$qt_{BxP[r1Fn$j5he?c]^*?FnL}0>xZ6TR]X;/aRPOoF3:ě&53C,kgbG씣1bmv[&QQEG-k-RTPJV%7_S~Fn6ҩs7y:DcC#i? 1C@lc!?j6E*L_P?mpE*OJ?îmc[[v.ǛXLvlU_UKL5N[g ({LMG7e!](ppUb'b۴Gͽ}ͽFQV[S[?ޖ _BjIv?M$?}3ë$i)0r&{\U3L)¨*ݛcy>y^l?b|ke'J6tUb'b+?vQsb{AV&/i߫cP[*~ G_w.&w.*/^;@x>^y,7I9֐@UG3SzH, )LMv!zW!83Nz 1V~r^}^PU jAsS5P,DXom\5,T@-Y!YO'd~6wrA!JnE:w.hh{ҬQUxG[kac*A8/W"Jcjc'mG%۶&}>r1sqҫw?wxxx-iB+ČDLe9buG fjVnXDmQ?ڰ*LoJƔzaڱ-ΞUEb,sșM^I~{@v'W ׶MHH/]1VVk:!iZn_>{zDoK搗n92!(?AHP*|o+k'v YIvydpֲ58 bf)IԦ]i;Pۮ?uRtp|Mv(É228?>K:k?\9䣋Y=zOV>Cȼ'dk]=#J;IJHbf)IԦ]i;PۮgTRᔟ"~7Q5!Oo=[` >YGdґg>{CmV{}"y~ٽ^:N!V!욈1bf)IԦ]i;Pv_'S,G?,mձC 'QwŞ=rm!2ג˗KO:]4naFtSg`%Ir;/o'?s"}~H{߮:"Y‘ 6b^k!1bmv[DJۏ΂@wlE:=w`٨דKٳM{5IL>_:E}єhR Ҩg#ڭ N*6/%?TέI$sd|lrrX bX#Z-bXV{6QUvϨa,ԸoXք  ={|u'<8${^H OU,ZnhmqR~`3y3'c`z7Epa#6b^k!1bmv[DJۏ΂@;>[t~Ϝ-~j0nسǁ$wTٴ 1ҥ$QQ@T0*G sgyd\r:rzsݙ{>kR;}#F{=bȮ"ƈmj5Ze΂@+ߢ KlhODT /IN( ].𜑚_ZN62ֽ(CBIc:4t] qP~&Xlڼ0n#q'I _YS b F쵈bȮ"ƈmtjUAk,1Y3[נ>Kú%/#[3Lx8<M2֟* =ڋ02i٠6i >93!:[@<\^?F@~?|Ak;Đ]Ek *3PèeI֕?}T ݗ~CLxt#ϒWZO0&B:V[[`2LH~|wgB?2|yKlbHٽ-_M`GCv1Fn3PQèe pԠ>KzWL36,O/Ie%kɐ6q._VkgBr0yǀql*ٽ'N.Ak;Đ]Ek *3PèeI%oтقezU@DDDtx|QD=ztQ猌ekaؾsxk֮lA Рzq `ڵJHɝiE ض}q``9WqҶwdkX1bC5SifYveRtVґ{&ECf#aʸ%C=m֜4[š״;-t92_=+-K͏E 'VL'9O\ [om&`kdb!v4'3Ngfٽe h+?utHKE߾lsƧ ”{hئV^j=iSB,Vi`xq!yp%sboKa'z?wrcD?b Fu4Ɵ_kcz;eZV,Qҥ#V3:g䭜$S)6mֱ O,{(${ϰ[ 8/80v'/=W*mܦ1bC5SiwL3@Ͳ{G-+fAHߢ qp=&&O)oR SpQ9ZxB"Qkܸ)iP!0<<2fav?{ǮfAɲkem4xt:l#l|TE2b'@ۈJcd ԬtsHԴdC{M0'N<\ۥZ-X0FN\vzgm!FuHPE4Xk&,A?VҩK^+J.@,ψa.\j4 b^!v>1ⱦY搨i `STci`fo[&vO6 Sp0@%_X"2MQ|B"`OhmfY9| 㻃azU!kêᵥ" 65bN9@L1"6:5+5-iMSatO=cl7_[-e}80+&/>W1 ^[/I]kFoJg,⿐ܽ8(ٲ6Aֆ=%"M#& { b %b*qY搨i ,G?,:=t;dɻ;k3gۈƖG<%W"[_eYZ 9vi/uۑ& 5a# bذ f콈2FWvQhjZZD6ߙSQr=/t1gkɱI6qyQŏ%}P}ҤN_Z^eYt9+޾fw.X8^*Y;41Alk3^R߽sGFWv+Y 8v HGHVEt%]ٞɩswX`aC2^0mz(Z !u'-՛ nw-[pk]kw4xWl LAcY ffj}Lw1޹N|rs[PQ{j4rp()]2m(";mӀ8weyI뿱َ߮Yt 65{/b |5mqCI' QZT4 |7SWAý'N@Pa C5 %/Y,ӳOL.*=Nq^gx£wǗNm ?bذ f콈p_ b3+Cm2{E`hĠNhz]مëWw\c׺F9 w4Q.+ !hӚSG?=K]hX, b^"JmWjYmqCIS,Z0[p8[&.E 136ReYt&,۱pQd#6Фaj<{@|oκ.1n"cWj-Y!=AL/ctbxg^kU"D8(FTX'HN?\6[E5f58} o'_?R: mb8 &%"f콈m|.Հf@mK {D*Xe,.Ηrtb)g۹PWMF~)YKljX 6M 6V#KO?8UT8{ᶵS齎E5S;ݟڗNoMrym;k$\/`)1cE,m:tq0kj[ վE f * Ym٢Ns>LOY\ %鲓 v5WzH9zB|#% g]aFbw)zh=,@ Yfj@ v%1꞊! J6~X7!r&/X}8n1t֎ 3l 5j>oRz*cÈ?;@ 5ٽRK6+g@mY6h (P{r?GŽPì{%Bb!oz&d@pq[ Yg$]k劅`F f\ mw'ٽwk訽>b];@m Z8 &3^vf{5Y;PےuOCF7nvbwnB| aDZKlI%B0}tzӻ`0ň?;@ 58kF#k=w&g0[l$m#;1b?GŽPìmI X[``p8aO9x N۸iyQP# 83ֿPztS 89C{/5N<02`qpf[n,L_v.rmtb' 1Cy*E87׸[i nI 7/ {&$9w֎[  s`#Т~]egѴɦ{ hm+]* O6QW!˝#' @k"j85"xĆV |q7@|p6|x`9wI 3wv[|v!tq2ځVֻT Ƿ be}7;m.si(o=XU3DT?ԥagvݳQ+&jÚ%1EIƑ=g'.ՂZF;Pz81~[k1Jnpe\AS;0QML ׏m5fD6?\ݼHk1J˕pDwmP x8X a]5-Z ˦.ՂZj1;V_=ս87D3 ϯԎ: U`qj<lW jYpq!bdRRKݴzhѽko;m;_0psg@tϺV`{V^pq78 ^78v@C*zAd۠F@vNXt[3:,Z UYQ ̏1hQ?6۶N# v'ܖ ǒk h5ٵQ |t!^02Fa^aMmwLg@tPffFY4v 7ȀFFWٙNXK5u X،@n.wwՆ]Û50 ݝѰhqͺ]Úw d0[؛a\ݸܖ5V2(^ 0ȚE,LO-{&gVf Z'3LfظxLcC 40>>lvCC `7}2'jZ }/q9@J ٳ!^7`@h0 f {np8Ol`MwxMa|# 탛 i] [1+0p4$Ql`+zM-jpmנ0(J(c`&xjc-kGR'c !qD$v.^o%H :z3`^ igZb kW 5>=\HH #"qT/؅y^o%%6FOq[K۴uT] jYKVN-0p4$Qp8h]3yE0Xٮvlf 3GQ]Kݛ@ T##}6Zk5zFN gVͰ+e vh2j`);(7CH55Z !m# /o+壣uߵm P- k;\ `FtٙmͼVo:AH`vE۳ԡfpRw%(82h|1|F#ZGF!Hvwҝpg@ ;w 'QJ@ bZ1ݠ%5~aZGe޹~cE.: Й00~'A9N)8 Ryua҉mY uO H pz_pZnp8y"H[f@kfei ; xj00KbFfoF?y<ٸI=&ʲpܸ=z 5 qW xj̉&{69<2^0#gL%WL'ֺ2f #LV\^ 0H`p3@zFwG݀8hy 5MO _ܙ%`@ܷ)AoX6P ܻMt ,K1s[Ul@^7]9pQ߹6p|pw]41K  W2+c޲dCj,5E j p`q>tߕ?nwвA+#@E. ` {SEz~!5T GnO6Pu53U2;2\R2߽ޓ|V_Cj,Z31q;w$Sſ+݁^\`b']`gBѮdRCjYٹH0ttw7swHڀO6[oJ.JxE_2έAP[dpv4~WㄛF쾋=h`pdW=sGj>Ұnu?8D ƔtLwa=^qs@"}c*ߕ0Z;M`S^~h0c 近}9-k֚|u;>ֆ+ Iew)]0l!NG(O '<'-V0\SwL'+/<4p_6.6-}`1ܻa78if3ZuX'VDEF:zlѤ5b{_+ W3[5E2'+Ph=v?N ;f 'Gte҉a7 %=8ysG5%ʋf ^F悑$aBo^@\l6wp8桛rz/5 8L/F1cE, NM%8g[ú>ᢀY8 Č'_cK(ʃ/x{wurdd = 74{/bmlr'i]˛gL7[ydd|tgQJ bދXљ,Jl{p8u@3g`ziX:l(`MOײUb 7NHf-,Y)1NaG{KĎ9 -[hXX SzEd(}( I nJ =ߏ4`Q؎@w aG{KϽ͏`,P_ʨBR7BL$ ؂mJ#7{&dbTj|pBm5ہ6ɎaG{KM˽a7Ŀ a0B_;1DpVؾ8~fHo&wNow4@$mc&q@L{ČDL}1'qvu5{12 4\Qljv}͛#6¬k= 7#3ƍJ -Lş4yI2׊@Xցֺ@lk3^RۄĹ G%!ϜD  G=?ڙL! Ta]E?ؾ+ Ak.{ 3 g $st&!fSރqb;&>uPZ@lk3^R qa|yW۪3#U**]7ؾ5@v՛1RTkSEowW#T&* Sxn-mbC[ZkvRaA{Kil_ɭq?&}8' M4LI&" TF%S׶EI=Sn^5T>/ZSۃ̛6,꽛WOہ6b^".5vD= k6qhFW8; POM-c8QGl_& $@ak6nߛS`<%A0& "D|Jw$ ^uAfloqF;yD7M@dہ6 65{/b)Ŵ-1=Rl l9O SӕŸq:(`S=-wb 054o\%i`nS1c|EJkbER4 rcSWscpeٓ)[hO7V%ہ6L8 & { bދXJ?+x?(?:$"M7"% &;FҴ*/i=KD 5V=#]`?}`LLE0'&JfLE~:` RO9l͙'mbC[K % { bދXJ?m4QtWn&/=wn  by2#!Ih+7dkРqP 6,N.=B*g149 Ægη3Ȑ#]^d#SK2Hۇ@IHcὈsf_0,"wB,o;oMfw_ڸaB;~{P־ jft m"fݢ}U>gp~?{PӋl&I1 IZLOٴ{N+fP4{.NjC[E 0 6X!vx/b\ٓx~_5'fܵ*[lu,B;~q}]*U0qkm*ߟ4׵S\|=1OD.U!?c#_\\XZ\uX{/lJxL0GsC[E$ b#b"mp[/Ɛ?3'fy3IV;g̏&F؎KY4RhǫעAmfj\|͚Y}ACE=Աݝcd~dlH:Dʬ!dd.#` ?č!ۿ}@lڇJ !Di;n'͞WN'gG3n4 gW8-}ЎeW/P05l_h"X|A '#sAF;\F i՟,kà`q@Li;T~. Or"zj0{H w%w-)ƁlܿaZCʺ)'ϙNz<p;N /-ޖM{$oR[!j3$H4/gv`v߇ qԕI~t̀wy@? =Wծް|0[|k?9R= ?stDHo{];♕1<^2'̑_j#aC\6u82F5䨇>;r4kVL-_X2 &DΞ{T"5mvڀ@cvHzybeI"=2L=x!C{.@;>E+ ;Sܲ{[+/H_8ܔ`P`?JSD;W"70BN+Hm8M8m[eԆlީ x"֣#}ۭ}ص?.߼?]"߸MROE޾'?o {0G}=E3;𶁭2jC\ 6m(pǧ?=&E>y6;_>Zy?u-ߖ 04h;EtyDP2_Ao\(KȰq>|gvm[l:(pǧUkƑcۻ& JD'oO|>ez˒t]4bt=3g/I5=g)As ;Qdμ%2xȰ c̢M`2ؐ]ueL8#=gPo < qv纉%-VL4Ð0F+P Qo&Ϟ#q(1M!&qyhan96@yn0(우+cG^NN.'=x>';zQ7Uys~/KMh?3 [NkM\¾(rlݝnYv/y`/K; d~<0>0se!&lʘw@PoRQjjS5KkYRc?6LKr-*$7>M.K&<:OHу*#)\KlR&~6dׄm]S=SG|znP||=ty`G?k^a]8߱so!A%phKAgC#-3?pX" 7nI6l֭شyW{Jv s3+j3lVl¶Q3!lHY9GMv:o^<$̶Жh̠d?D$-H.Y' o0NNIί@k??GoTo~|sx^=oṞC~1/D~dv❛y+gGJva?᧸&m.l ; \]tO|}ܟ{)|dGyX@7{c*l:i_OE|0/=Y"~Erx"݊#W*  ɱea2ׅmǸS :Us+ɖ ɱ >%cXνSܣ 3!@YJͺp*]pf&k넴z%}'3vB+ӿ%!>Z¦ͬf؄lƾ[ Y`|mG>pbJdd]vU%xO]E^>\:-aDQ> CνSK<W)C(捷 iJN|7{LI+d?$GH_a؀pI,>l eGXǁij$I.H]3Y//8߾YLM=ggծ(_Y )R\Z 4$YBZֿO4-sTV\aF>l 5}<tn8VivtN ԍY^2nrRtjSi">ĤK2 ߍJ0KVNs/{ ؝_p)),*U+ O3* Y0;&%!MiKVot;ˍBj7Ń䇗'-v,mWtN/#?pS@4]X|Yei5W'o%ϟ5`w~dL8 JO7j6. l ưu{NP=YE/%WN!?"O陸q\wX]_8;U(S=msO1Bه_7~kI &kJ5Ɖ/ksM`-TPx- 83;6pdk۲[E^qt$9u`K"praW=9qDy9GM %s5&`L`7Il"WyOI=X-;-2a~/k¶1lݞ/= h\8mഉ/>(OvZ7JEZu[Ȟpmo3g-$ꦓ&IeHiE ¸("Ga|9z `7UYbuSy!A&*;hf~|[V\n l c׃Ma[GJCpHz9$ήBXJZO㆑#ŕ9dvi9=QbIc~j~ q_nDrcSx"|d l C*Pe0Rۼ c׃Ma[nc[]Q>TN-m಻~P7>D~|VѾM .MNOwv߿7d~fq>A*]uL5rB8>:p rs m۱-l [WtK*!ew/[MЙiIg% Xtx=w~ 1#; *Oyg{;]aI]҆-3l֩=X>9u{f3J=5 b=idWx{ẠMFGm+)?3% ?ʭb)Eqm%Au0.Xa?\/TbHbT?؆lköbjs^''{TJ5M2 nsb|*} s"omnpj?{:}6DP}SYZlkA@`fDc# G)r ^?]fՌteV}^90;& l$!l +W7)G5W'%UG'"~FCGO  nh=A 0Z7VyVNV_ı޲\g@ {NT/4% n?0"(?/SrD^3%J>3QLڨJK`P N6ݏ.8JfPBX+4jLhxPns~01npj[~XdP1:!yAkӭ(?SebZ@S^BՌfɃ~1l-xѤx9192';OlxnvA&@@B+-ykѪEEwg;;Q+6c ulaob_~O p|ư5Φ}'?<[<:lY3USXmqͼPo |sP6L+ WM#sJCWiv_d}@M~Q2[@pMa(ƞ-0?w9N>-JԾUejm|[rlF NG_XSn?#6pM^/58뿜l% pP[¦̾5lx_{|!]+NoY5dPo |sPYӒ>|#PAW##lI$?$$ /G(Dm!чE+3MH[5%fQAß-cLѝ[[(CܬŜXվ1;& l[ (P9lA`Iz'O^y NgO?ywnՔn @ *g 'OlZJ %?lB^RvdJTHb 1:_PJQn _!.l 2;=|_'<PNoj#-AG~Bbo|O_ݒp{ ]'&'*C)Z}Gn--pqc?{[;ߟvjׅMa[fg *GՒ?}rt#8-)h`s>\n ̣bUX7*ܼhvxj2$k$?FU\;?-&SׅMr Є|q&<y3S܁>9 m!jh4}Q|꧗,]ejbeqYalOãDv> ʼ~ u&Eg>Pey Qf]Tin`Mov̞%A!6B+4Aҕ.z!AO"ڭvv}hO[tcn TFb'⸟@C D lFl&l  |n%Ӧ4П{\(ib÷7&,եY\?`M >S _㞲[ [6$܊1?/[_"/|_?5 pky-WZs`hL~/ؖ5lMGPcrqytdpQܵPk Nsco*>`hb÷\L޽ޥ9?0}1I({^}twOz}Dw{}Aۃ[f{a{@ l>r7ҏ¢XҒ8) k7[q0u;B>L1Wӵ:ο eS`CtN5jUwcGqehqd j iڊ }]U@>]T] K.чC1Ijސf88}. ځ (6픂|&_\3%BAgI'ן|Z̍[pa)joHZ6F=ўM:# v$*6O$?lJ\=N捷Kv6Ew_Mu(-pQQzb;YL<15H`; _+̝ d p$ Vk̍[p] wUSa-I' Om?|Oyf{c%;J!}t/MU/*I_ /K6픂|&_\>3wpCg>8 oe8&pຜyj*e"i̱KO"{>hz)1qr; ^~Y_-W+_LPHMu~om1 !ӂ)h2A:' *g1x9܁>9&(tO3=-ûkA2gRvu]=| wpgMk7rxtZr76MKvt$$$\iE_x^^`?P\ӻ9 ԰ sPh%0V&dYƃqPPliۭ)`k½pOf01jaa˜3f<@RqMc`v`/,6`ef|ߡB;e>rq 8s>b?$-/.\#&׶-"ϨtY/!+_Efe MfM5[TG^TG~paq}dbɎnnJpnH_@^bUoߝM>xKIVl [r= |Nt30eX]n4 nvC;{4|:q 8so;yh(~Rv~˂ 3&1yq~h~9vٶ|qo3>t70*̘V+GS{f'%Y 2܁>9XBRS~/I۲a ǯ ;wNXxyr`g~7I XzX#B"%mL~|ǃUO#@ f ÃCH41Z}=CW̖g.Ѝ1zq/ܳ"S3Bxa,˜BڞYY,}""xRK ^ԡ!l٪}Gr#ck?G!Sf*r Xj=ٵaA_.8,rjy,D~RIf xAlk[+'csG L/o# ġ|{ ґCrrlYps{HmiDe&EhYçf|; LD#|RJ} f 7/Qs?6y_7oB )| 3~),yb"ǀK'WO opo5a.Kx[`8XmGv?!~uD!?9 W+nsh|Orj=~`ƥtƒ*DЍPK/EmwN!l٪B/y_7o%| 5|h y~(r o^L|B}]pXx[/ 6A)ՋO=말 KGk9?nl!H0,50xG1U%.#5D:Zas؞|_§-| _ (r رv"9}` _y.8e_-X|AŚ/[Zb_ D\JupuMx^v_3)Y}]iTz`Q`)LCE:l]T5 qqD!W+ E ZKyʬ:{W1-!h#<-ܣM)pƯRK@o- aKشuyEKh >&gYٸqLaU|)0wrp+a}GW<>BxK/>]am%l:VMBZz țNw\(q>sEpR;0,o$?=07s`+DN$M']7WG63̯?kƼIXOkM#UyOT&YI$!\=!='>߳=?;. K^/݂OĒe1| mbϝ.SϷfJ"p\v WuG#ɥMV |gpyYH6 %=ئg"}l7k,ApT8 .S|܌(EQ7~D>3^\/t ,i#ɄQ>ҦgF8f*+ P| _}gwap܁>9X$8F՛ObjXݍ4?G* t}4:D޲lx`,B]]@8SAhC4V}De6g@OB~}nEb  |ݜ@hnSӛ^ pN(l)Pְ/# >*g(g]pvSu^yֻ0J_^ZksAQ"tЪI8@D3"uXdƔq>N 5jEO-W z5'ItCLc\8 忥O5k_u5bUʠ"y+ O{{n(K.^ac6W|_z3, w|X?]߻Y$m@8W߼`tѰ5l ϼp_-X|A7aMP`R>?,4nu^qHXXd[ubؓ(t5kxH!j|ͳ_k S(<؃¹z 6T3< $j)j c|GqKlvp?6:WA war7,J$,?Xm4ARZt`~|}s| [ -nWIKSo\z/sD8CKP}y))x *76-/A0jsr/RJp66d4Z Qpw;,]>~WuQ_>>A+  ^{}79l;` ΂XBWe0rD`$Q #X.*wm>xF&(!),f}tX~NzGE' ;[Ex8c>$$ m ~~X~?"BD 5[!G|}gC= RȨ C0qܗj6`,tLxM\dň5lF©O[XOlGPR.8~5Ajef]t`*%?XZDg =!d7#mc$EjIBh &B28ed3b ƅg-duΏV5\_ab:G:h~pDڲԐjM&|WS?(VC}L_ c L}.,B~X7Ü;w"8 n*8)M{zH.R]"UAYTP8c>1l[tLF™S>sOp\G*8?Ro)tN/VgF gH[_L?/?{_8)| 'd,r{Wo |sP\ B7h}QpC3ՙ|d0o2r cZ,X}S_W?` 45w /ǎAxRD?l o ֟2ܢ6vH`0 2_o 4'9Ω "F7|Wg:Al10dDgñ;rOGۤktj*Nm>* gr>3>/SSOV? B@İ^Ax)9"(Y %֖i 39MfMa7,ڤb6$ Ë }QDE+r?I|lZOqIFWKE`LYRSۨL[R/h(w(>[X|psoŅH\'aƀ p{&:ݵbDZ(n㶩Hc2|=wZ8} "?|w!| <<̓z< dW<]PK"ڠWߎ6S;[1A;DǛc M/ >C>xD~߭>9Z} .|gK >o |s| 4.*x""Y &l#M.3Y-oJ KKH3礄X҂CR2RMAC 9!~IhSӴ/i AVnth F[> }RR̉)FӪTcR|n槍F2O+yn~${X`aa.7,L8vTtI8# $ N}HA}#rbh2,SrR$SQ. N 3[Sb ,BS_0 N3cw?ԤSB3tQCfMz~2h-LguEfmvA6fʐS` 2i_QEŻ_x⤃N 1E/OШ<E R)R9џ7 M54E9,`-6i,F(UZXjGڭA*~Q+S+>g!`q? k 5(2N0ξ *LPǵw* u5]x;?`Ue[DN0!_|h TZFczjjԴWROcǷHRr*DbbHhh?zADO˭ڬLª˰XXB&$^cSA?*Ǧw) @Zy6r)oB['4q8 gZ /$f{Zaf34ƸРS|_§-| _{p\')7Fw_y0 6ENH+P|)!s㳓# ]cHl:ϣ ?Uʈ rq?yY컂wҢGb9VSp*J |_§-| _{p4s]q W O YzmR"T4Pczr_SyA}ӹ|bߥ@}ʫn>wC>ocS.RN6v,QTpnOSBb%9$džP?"*s-c3w- @U[Js>occqp'c7{o ||8`}zPA9[B,FDFsGa-C͚K`:րDcQ-j]q])J ݄ ђN\~x(Jil!B[ Un O#; z;RΪj1AͣcD*>n1 80BȀvK ox t|';#/>?gݎ_AD[B,=2սl8wwo8G$_|vUpV_\KD*>n1 8 jY JZwodY)T< |^଻om>t $(-5--oā)$44\  bu-eR64#T,6@i1OUrVDfY@6lF?L9~+8i~V2s<2xȰVvK1MPϩJ7A2݅24GnvkP|V}||_g y'--f"H\F|jU{ ~Ba4[6o]pXkw>(>CA4׶Q$~ KȖ;ÇSS\$ 5qmܣDFg_BXVVb" )YeXD:pvkqLov6.hE>cc[ݑ8t8QQטꅇ̋jnClnj>JUH\papY |:%;F6ͫ#'6-%@nE$p \ ĵq}p#IzKP{oazMyV3w$?L$9 t |_uov7S8LSD]S!Wgמ$xu< w:\5qmܣծn 0TQvvN$>-#kdذVkWk@wN`~R738>8%)ߚ\Ҹl*9g5xb~΁^5qmC~_:$]#=Ǖ+gwx;N Gu*P8 8 .+q|Z0a\H5Vq.1{=HU3nV4Ev[Jނ m՘8u jfhi!;wos=~\}nԍgdz}a͒Ep@Vx]qFp@m Vm"ؼ̪|v7o <Bꡑ*~=cTQ+Ag̿z{d&sW9>zP70yS9u) ۮN4 (o0_7rewW `Pur!kr3%+ӴO9{G9ֿ,V_ux~T5e-]7D_hZ .ހj{ALʰN./#W61]J\h9XRɉMmś'(f =Qq<7a9J]SOF/6PA܁>uPJ{兓%#عkڻv V[DvnlU[mjWFL@tEӖ[Z r<{(L>\h53g.={Mv^}Gȹs[sdPPN8~yx:<*667>:SoïҪ/lmэM6s>;ow1!QT "k9mvXJ)Q_|l&O얍4yv%zQ;ow%Y$rOoF-/f'GڮCɰ3R#<\*g> Guܺ?t T&qg ɳյɡ#'Ɇ ;ͤq6jF2vp |:zzrVC=44iNm8,VfLhRT|B*\LLoo?wO(˥O9oWšɣ^8'jꓟ6+1,7raks~ l~oc>w p=n NAGOicD BӸ`ylG+qc'ȍ٦rnm8b9<{x[CY<[1|@!]qϣzӖa=(~?#Oήo gWOc෸xOGo۳w p=n N˂ _5F5KG8LI},$zcy` uKd3A'gBO.%?zz!]qGyNKOEz;~W*Lǽ#OI D|W܏-| _x-I0YkycDYtԍ3ą}+Ϟ#Om!w#6O#oi{HbdId'%58'?X??wd,]?BnUѯx"K3[ϝi[8.a J]>y?tgb )E?I\G6l0]j#5{K< +(%5#Ǒʂ$R, o)mJgUش8[YA|5Cۼ#<HwwOou ;wl.0QI7h- 8QDb l_;?>o'Mws'MpT !-0pbGݽbT?x9<0]^KO ㇑ T-%i|&̱݇h?忦C&;vʶEpq }Ip~N~(asf|L×)|~0 A9 nLY\D &B]d^P}9gӄgWbO~{97Ҕ{{h2gdM{?9A~gGJEӼ.GM/ ;wz?>$iԗ)|\N6 3!d?Ho;9.2/$ٵ /&JȜec8(-Lѝj&UXu胰pYP>P EԑB̡5:E鶕c\|@lRSAFRظxT -j)H^#v2i)^.4ak~}Kt\u[\z\Psw+>g220NR{btK}'M"C;ArIFh?g視gh#M2S[(8kF-t)(݇T/IIi&^$?Rpwd{" GceEͣ[2.&Wy]ػ#p4疗a0;`g5flox_w!CU<Bv:;ScU**w@B'y^@aWCb9D߳"JEnleߴ͝ ӯSx=Y_~7w1?7wf +>d[\@ !;\gUX: ؕ]3-7P gVJ2}R(pƼdӢMH||K 7N7MwG;h-)v]|rv][\8؁<Bz:+pU-V|"("c uH-[f[R"7n!g$bڭ:D3ՙrXe WY^45 K%qŪ^}Gs?Kl"䈼-§Eg>0ڨ\Bmf́-RD˨mIڭCB7~";9k[[wЙr pN˲S$8NNZ n >cȡ=E}=OGoI,/DF=>A]suI4|i_>@p.9Ȏ?8ͳi|>?y{\乎[|Op =7xpB]9R;"cW%\(s{%bV"D]_͈[Ϯ9ž#.KG!m$|GvIV.|>Sa#+fŃGvt{"Ӓ H3 ,>2M/;ϰhƌ$( +,*U En[u hRgꆰ4ܠPDZ.'5wX$evy[J]u@_}IO xvo7+5TP0;4 ؈[0CW!45Ƽcbk'^+`Q3-̛6wy.$b1фh.QȼG ǩ'q,2ZO2ƹ{^pwGM<oӼ:^RcSˣ6Ew_ɿ/ƼScA7WÅ9nqN OGI2S1 6pkvTh. nkzE̖j6^$^f׼-Syׅ?fq?7GM<L~ؘyi |>|t^o8N OGI2c ܘhBgy4۸tdMȗG -b t@RD`m{]gʳ{Y [KO ~~S 1 6m"\ Wa`8nN OGI2S܁>9FF3gZaG?0ux["k¥ 't^aNqKΊc\.}gup|-֯5lv9,+NlS8^LwɸbG[I!6`C!-S[[Fm 6OLL uWr,^#vH[S 3Ƶtm?zr`Zy%9k8'+b.d3;F`;ZbCD|D>xc8̉6m>&qM 7޽ G$6 bъu`rށ6:ؘ%%J&|w8y( f90ޫ܁>9`^+Vp@8^@VURlϋ U3ܦ(*j28|VG_KcgZ߰k>|x ;Vl4.\*8qDĥ#Ļؤ&?oY"+l$YSTQnO,>6G\>i*Ќnva6.p[zhH–t]o|wfD@ζg)v_F"N׿ Y{S ]{mq1q$rv8rf8rzXry+ N#8Dnq9آ~Ȋ{2# CEj$6%R&|"i}WK{J[!qM ^{ mae3nHH mYw_ o |sPv!k`NiUCug=:έaw *H P!z Q$&!;!Q;Mcljĉ{8o%Igm}zFH{;b537i^TŜ4T]8]]KVd*4exVFn=|8{+^{oo*% kl::[m`]a :@Tх.o:8wS:p4%.J<\5HL17kzpSk]wߙ9Б *l8>ik 7[l3%N@Ll#|2zTy ?I~DNw!W#vZǏvLp"'~8CR^V;eH@.7oO6i^z{H{>.ߌ$R%y96+B";1!'BF+6w'WnKn3}!0:upޑ6-aS@mXD+M5ʟj3i`l%g߳uW$~hnZ^iÙ\sm36O7\Hcbc,} #!'+6wvV"8,dA{y SGc ]Uae9~׷:%IV7mn8p" wA%puKIb Wqx:NWR`Ǿq ۩ Yl˄/n0Ή >AߠiЇ\_oپFCNH7Ҟ/_e}˦ Hr5/ąфBn?xqyf_\3)alSG1N U> 0I(۳b 7Q>`?9ess`89.sံq &6q~=?Vth\ړ__ sY಩+ Bn9fU\1ܹ78%y5yFݽzPho€`2)MKl7Crံ 5{9 '֌wY಩z S5\mjAn;; i!@`V@PR ֶNZ̀de^[h$ LM\_>%k GҼ{+Wp~`Uaum % <8תP 0YEJf oK@q2ІJ%K[QZ[ Hu3\o0mVᶤ #! @q]G{~s%"g(;[ H{Z.o*\mIw -mU?:mP%{oIf` 2d)`&a{.=`00/NTttqK1@ H 9KVH >Aߠ pu?]QSŽke4wfS[ < ~dA_n;Y2mH/`Dl@jdLNJ 7@N:( RG i,ѷ*~T-߼3^~1☿S9d 'W>Mϡ?<v@7/gG:b^ͱ cmF?uYܥGl5 95 } yCр=G:b̞<]P_6dȐa 2,ݝ1pni N'~+ Zǯ_H LMׇ/1UMwpvD k2(P ,^J? +/ppfE5LVMv0"AFizJӛ[HQTIR忣ldoD:e aW\ހ[Qn5 {ח=4,ݝ1%9d~+ 4{d#q=w9i׶ 2m1>HD:lXqb#CW+V69%+֋:jd0*N9n ܎V:l0;ʲ: bm`@@uU3_X ]N5Q$EP"#0"=((QZR<ӎS@9"~a$"6Ȟ __ wJx|y_6(pyvl1mYd$"6HR2V"Gȍ 0ꫳm{fn 2d[ U=) MX|K?g³ddxS1ަxWoS>.@TUi 2 `F 8hK?S˪g$%}2ߨiʰDA%i3e/xjMVx{C0z(3pѥ~.< ϒP<$fzPZ{nb9xFOip Bhkt*ĶyTП7/n~2(J @P'+"x(Y=iRWra0x!jeS3~Q ?G$`@A?jx'8\fwr- vY0vs@Io: xy C[Y?u0ÇD J 67yWr?.n`2,/ĿlȐ![?5[6dȐxzs"pzXdmJ;:02|k7;\v~5YǛ?JZ5*o SNM5ʢwm2& O zjx N< ` TNm~3;t r4cQn#`UpmfYlC~xʵ%g<@6 cpF!C^kWaltM|8m Ӿ0߲ž:8bU^㶊@4̶7DXݝ'rƦÝV+cltM,upC%c>WߠrD)Iy; /l[r xr^DbW3p gZD{eԌИm[\o6VĮfx\}+K4g-qͶ- MokqY\}\5ҙ;,l[r  2L#ekmus=\0h 6 RBK/+Wg6\y2u:T Q,^1z !ںV,Z[j3WCc *(v?(Lל ~iBy+8Y' `{Mɶ_=f`GWȍ10WR {8$!O=YA63/m|=f`!$P㛡`@?jd[?}.-+,ZfyyA+-xa uH|CO;TR̂in12Ey,eسqlȐ!ãpvfU32Ua8} yJJ# 'M#EeEq;nYV\/ākF xZ3d[W% '-\{hÄg^ݽA·&.udݸ.wElruL 0iV,Wb|( }epV=s${Ǜ_pb˛vX?ك\$D!LJXe6|p4pm"4R"gعFGۗ K Ɨ-MaJeSfYsBzo&+ 2< ֮jcg.X KWnXlY Hn^K\3yB wQL+L-B|[u&;n[2.qxzIyG ~37Ο"g; :J8tTwDwq5`,) zb6qfǦSh2FcRrk݋uX^ZG } }p5M,|{_O|BgC O4wv irq ct7fq\ٚ&ćXe8~q̏|y_ӥ -5 5bÄg6.˷Xl:26g0<06{ 00\0!R q &>>-`^M8,(#G 2<+V69l@Jop """g ¹C-ZA]ضvFwW{F|RC/Z3?y0Fh/աO7ҕ M˝?MR o~v]w.!&p\enNQ++ ٓGe C PSZULlܱE+Kmao+oj3Z9t@su WL D+{]m<:{ qAko-gc#]pfҦ=fw.B~%K푢f3b͡%*c#]pfm20u'D++Ux]ۊƆjQ {?'4 2dxn5֮kqV{vA@:pQ_/ғ&{][CY6# 1 yY"rb2ί{wt߾@jQ_\(kDo |+h\,jmkD1 Q@ߟe$ `tV@' ֩s~tzp?;ԋ;NvNOq_q"!}}$j/TbAcLxC+ \h)翺b2p3[ay{PX/N$ t^0LE1!0ys\)2dj9czv⦢Π>/\?_{GHA !ĆN2҂D@k -:rK_@~q)yx= X$of;W2H{]%ԊudDžxbLzg -sʗϟud2L*朻; .<;x((UV"D}Ev9 < 7nε͓شhw;Vĉv%)de,PQ01W4}%fq}tNYٔsiްKW3K6j?4)Y~Uɡ*]M 񌘰@Q&v l\?A4I|D6۾VĄ;>|XȤtiA@Y2"KBNmUkY;cL!m9v`HW0]6Tg:!TOm7%;DnDB Wo+MUbk`ITU->\8jX`Np(NjEyJ $A}VI[/ uܶzS3[Uh V(MWJ҃3R`[G c-3S&t ͵ ^{G {g]?D%(w@n[)ܵOobwx/}pwL X5G}E<̮m7%;SJr:$2![G KBۺj!C[au],sq |XIQ],LV"FӨOQjT1g7@Qq)iXlok'-l۾,Zl+~YYJ&`'@l*/O%iq\ ¢r`r8n2nlM-!`W>wܸ Td@)7EC1*τK<&eK魫ɭ[x ZW kHU~Q;?W,OR1@qVe)~2e) 4z@}nm?ȵ&N਻ ^K%_dc"쾆l\3D.@}#{֓3H.Ӹ84GY?/EQvq Ge@ ¬ps~[sztk`5 'Q(YUCdE.Y(1iCz`AZ4A}Sbs?o28&Τ@1C3`?%%Cuh4PP)g\ߥ a4M=}k@st$km[$ ҿ7ȏ/ o<ך{lk`5 whI%("*{s\@~"WOy$#6ĤЙ=,?87(b|_n~l&59rmt&8 6_sGy6_搿|rv[gvϣz>?!a&@g e>eĤS?֚I v(d[$ ҟ7 ¡e䵻M.$[3r-| ?G4:3RÅ3<)oȑu~6pk:IpW  C #5 N ,Dj=vPK&*'8^E0lu ˓z]/?D}&_ &6p"mTP)@PV۫W }-Y9!K]bJF}ڄX7+p&*p^'UzVN`f,fٹ j xzDICMIЈRbP%J?N! &CB.m̬3[?s"?b՟[Oݻ@[\п0IW@?/([3#VOrc \d vPo_NXzYVk] 5_.14~ g}f|I0)܇_wz/[,2+O}<*8s&*P?| XrW;|{&uD}]zϷW"4U&Uʼnũꤢ(88L'gy^B6´~puD8B~'R`%&]tdqb.UUL$I~g~ ybX }Nԥ)JH.IQաwMOyV7ag 7QpU|4Pf?{*xppLK֓7sgO6K6V$*{$f_OM9^|G|<CI?LIBނ}7$ψE4ƒ,u(P j\z@.KZ}̾#Ko '|~+>o-6"aW$ ߁|mFs zRSȟ5W|'ؿn|)yLheiBn.S|?D]DLJW|. crY8 n*w0.p[zSQÃD{Δ=cY晍+>}༚.l+UGB]1AN#,^l+pGUa]6#y SxQN͝HLN:{;Qvoߛ2ܧr[;pʓz(NNwIz@ ZG /lB]27~zm LΆ>A?$FZ7^,ٷ4slq0Wa|T}ZAAE42/YaC{*xp¨iDA0~|baT $ͬڅ ?axW4mkk;}:$KR} )QĀHSBpp?.  94<;!]po '9,Mv^ xyゐĵ{|pޔy%iYΎÂZHNGAic=U!y@N WYnvóANqn33p%`{l,pzu $q.7e1O6\Ѝaj?D?}O0.  9ԥ8% *8̷ yx[Ȑ!uY (gdBJrn^1o2Ik"2:ya|p{_+| ( y,9@_((LTT S 51ӺiX mcKTd[p?pG\L:**}:}̾/$r!w3g-pG9\y"'*G&1Okj]"qYvY) G B>S@t?KW߃;$a %%*+ UmWa)ʒzsІӷXP lc}< '|~+ 1)`J|mx_ÁF+s |p5׺Ba;6QNHWv'BPϔc&?:Qmao tkIc}E CaD>?rܽ϶W:9pnyɁF Ә\"q #&WdrBr\i*yI](g6?LB>f߇r!wg2,(ss.8̷ yx[Ȑ!u2$1`E=/.\[ɢ+\ߴYhcʊѤ %ɪqp [ٰ0>_.s4o n8g ˜0TRIe)Rr4&(`m ~} QKVn%)0RqۙѸ\E~mL$p 68l,MQ#~N~B.+3n ppo8=A<qhznd;n7ȉTD];Khc~IRX俖~ˍU?]@=TՄ( X oE{[4=~D @$_)r^!wM+iNprZr} hTv|5|swv7|xZmUq+B{p VVj=_ X oxD+t;m˗6}\W$"gd srNy8{.ytAr;o! cݲPhcʎE)VW?b%\޻㿊_?#:OJ!r7,oB.p { {m"C @~ċ*m^_!7}|N@N\/jKĩwwI4IYӻ{ϰKy &F:".qwNQ%s)H3˹uʉj3agjKpE0rr'Nr3)f-h6yöTE~11w [!v85spv@ďҝ|>6W]q.0=pm 8mX{*x|ċ/.qHǒ3}j 5,։ 1Wt3OX+/ыܽzb'SGVjc pe ˌOu?-=^$Kz"!?#o&pQDŽN&iݿh:&}a㿇0"rbs %r?d Mp}78gYI")wXuqHH1&!vd[=Y=!~IsY.'y8z?(S!Wl\.ns&8ʾ ?~y[Ȑ!õ}%$$PpGzH*΋p]q*̶r+뷘p[hU>dҕF;M䈜|*n߾!*䇁w|G%-m7a98ٯ UÖ:\qT#4~٤"8@qJN;7 $U6ptRP8\3v_ocupq[Fmƪ EpR>pf-8r1oy4:[C^W4Msȩu:8;*ϫ &K-3zHENhw`_.]>>7G0!6$ [?:+rBΤyDnc9'VL6/I]pi۷z0|EP-/e"_Jl?$В&o&/NY{GO^AYFof .zZX߳FSE-Ž\!g<"1r 6/I]pY7'pғRHK)֥}"Airfr`gs=2$L*yXҺv29ھ|\9@ʙn@d_0'G0F?rBΤyDnc9;O5/I]pi۷]_m"C CEőO|ZVat=FSh߽ ̰ul z&qquqyEdҲe;ٷ0wۉYYx&wH+-G}wbK& 7l{N~7>A_M^w3p1r4\5Y:0X:9pw+!}>ީKR h &h b@|eJ7nD'r92;-\0:8qrl2rugx6!}ED>I~2;\yA+Op\0|2Աxe5V귛: < ij{3#`0)p'Dy} 7 >l ֠-M\۸k:&>61Yv@pKМ G|; Spq898 nj9J݆Ņik›ߠ|#BF2XLG"Ȁ>o*Tv =q~2#Wr")r#.N6gs—3c}4Q>gޠBZGEMdXׇ'|U#x=iH\!gr\"-r\c∀sspyjpuC' ᚬ挤7<#HŤ0;~oG`9D.S9F]f&㿞>$2dD_V ab'L鑑=j$Ύ&GdŅO jB) XjfGV*T |vlov Ö7'?D ' wy`r p5&&F'>|qv@RpRUAs $> hW:YҜgܳRnhI 6I\ʊFGD(RzqKO!=rzdVWˎ:2!0|D:"{F HP+$1"_!i>-G@i觋Z6gxIQ/ bz ?"~/'g؞2u4E4 d@ GE5_a(Q\1Ͻ{)fQ ЇN>tho ϡ MQOFq5}x g)SPZCܮFwٶ[5`HN7b? PB|=7PM*̇?K5,.Ov|ٚ 5aSD@`x9a!]!з_vB,(ޤ'zNQKsfo Qc s<})~Ls/*^Yn;zSSQxMY5n;{lۭȄط9b>?qb/, 󟾣7E=Ey}-NQCvwٶ[#2d,lItjo'@&N-v6v|n ]E$IЩ ;ۉ];~|Nnt5;Z?l;o2dx1qJ@.E)vk_6_L6v;oc<[biNp% e>v_kX/<{zx"F}G@^0鍿~Y"ZNo RmecoSo'x@oO6C%!PxJ@.E)vk_6_L6v;oc<o 2dx$ @ًSlГD'^a)6|}㏳ ĝ8Ekˆ{R؋C=,}m?ŅN )^ A Iqc/Q m?ŅN )^ A=)Ntx!b񛃷E 2<k++RW?,iXAo"ZaZ 5,۔ky>73k8ZSO,l ׬'7x h)Hz0SI-PJ'5<$[O#- /ІcHٰ8S"kBD9QNܒ!a(qҾjٳfװa2ˈ1rXIT\-ޓ_Gn"/'/$G !Kz_S r!w.J^<\nM#/I^:5\nM%FOKl9~ I*Jɒ9ȆճΖd^Cd*RhJ~MQ#wА3ƒdۆd%^úeud OdI-/2d0%W*KGɝ;"ٷ0)(ԙ;;/&x }~W([[6JĢ rm&򳛧:ޥ{.L7%w8 ~wH3>?\D޽qJmӅd\^4vlo+TMj'_;/ߪ&%*SBpw9kתcߴMxeY] [[6JUUpr6W.v: V2l)!C,rp .o+ŃΓS61رeE_6dȐ!9WɊMYx' ^sܪ0,v_/X=۔vx׮=gԞ9sDie?o.aTɊCE'Gx?ߨ=?mMTV!~g5ϝD~z $o'$829~ JVDGw'2ȿ{R?mԞ4R?TV!~g]ܜBL˸vx\K I82gſ1͈JVD K"M+gp"Hx|Wڝ#Fy9nem ;ğQkNmx@;3jϛ/%Ԑe@ ^8e%Sg.m Svx h̙ˢ6SD"|>|zdKCɗ^ϧpmSEmO&eٽX6_Q gɯ$Zś7_rRi[7MF@ۙP[5PI/p*O!wVdݽ@oAl'G{$6{WEmDImůM"o=}h3?mÙ}ɋڈh;7 9~!CFL /+o޾G6leg[ 9I4CYx,AÑoشq8~ WٕVs(9~W%oM޹vLh/ڞCc`D-!~My/4zfm{Y " qUߪp]g}1vW%v),;SYxlP7я&gN4,%"DU:ˊ7_1@>IՌXb6reE5m|N݈!S|' goܺK?50 cPƍ k*~WRc9~PB?O%ϚNĀX1s(xǟy)Vx=.[qnm PaBArf Oym1;E NĀX1s(xǟyߖ_?J8j"+Q,oJ(ǟd/X|q8O,C;/~(/}TuPTTc9~!CeWJ=%65o G,UA&o 3{h8$GJs ggx]ًg G,UA&o 3>N|4%odIJ+FXE}VExV~"YdBư?p+؋qCˮ^;KXE:^:[h?b2!b؟xr1IQr C\ $\Ƌ'Mwz]ق [%í0!?"'_'ϻK62~O\\ $\&l>"Wu o <[q!n D^96~྾|6!#:aοHJͰ{X\؁N ϟH[aB~E]߾?5oX)wkm8xxtvNMwVxk//Lcoskp_ *J5/2d| +@=g Z[Aպu7p:x:ٺm5nm@LbB_~i̮n]3 og.3Wx8ZNW6ͳɃv[-.r!+&e͚`&Ov]8|^O^?ҲP1u=[g^ kN2{i z=u'{3>yybb2g <+/ fןg}9-Oc,{%fg^ Z&[w^?EG0`=7lx黆?/s8^x;#11 a ZG0zݵG-~}(oCy tհj_ug h;bb-C L*ܻCGmwv9<ˬ̿HeU7r4~#Ѣ?txETԶ^-i9n.gn!od r7O$:>hhAD~u\meEvLh s =uI Gr5Do/>-Ù /Ӻ4UZŅ~OߟjeE~0]?{#_غ4Ah?1ETvi9[<{`͉M¨}NO<D}*m_?}:X+2u,ڬp8} 2tD[ &LQgmD tũA@Z% _ZVkŠޟwU[J8?yXDԐ_0MO17q"7&q  M>h6TݢdG9gm=+FH" חOY7 &u}-$[KRߝoO_o_{VƑ A4HU'Zs'r,A0.;>hhAD[n]^ڬp8} 2dJx2s.`eVncͿp_37SOKsZ]AiUP(Zgm>l'@s627p J݆F[/f_L fj#|437p J݆R`eߺQ}̨ߤfK`j@h6\Baw}cVCo&Vnc)[YZf5\7Qw1*m~,OW ~$o%~dn. q.ˬS%lόM~oYizoMnYtd3ޤ ~Uڟ@vqy~?/p8~ ࡌ\&sz7<pi9`clvg7\V[Grs8?Ô0pٓBmCvL$~3 W 'E IC*nJ6̯ߌgTD[ӑ77ަA0sZV#{ Ijb 7paJ/n@?49{=w^GM oF\8MIsj``+Y[ɻ { ɕoF ;U/[CcI?]Gz_'^ pnj9@Ϳ1^f́RrjG65~^p S] cW[67,)1~3mKJxX YN6Sthɪ#g9 ~yoF|0>̪,^0VdjSI?/p8~) }}n@fV>j$2z?]@Βs$X!qF i=~Arx q۵Qmg78C /χoF>` q,oc?7MYs3jo"WN!g+ju_<ܺO 2gк@`= -Gou*.\0Eo1r䟙 Hf,|rg8uPlO9r䟙 Hf,`#IHX-g,Gb$!1U]5ot fדe2u{V]H]Jr>=e֜K.S.Dy2?<ߋl70n%A0Oߟj* @U$kra$<;eV)57KHSYY 0/Wj1MKoߑ@RR3Mk~= c~(@7_O[C{VDJ@7_OXF {Jb䝋HaF7@78?CW;~}2Li~= `5 4n]XqKS@7_OjH@78?C7x1_Kf~ _B3n]^?nkE~t kE%4wy3t30 IJjIN9ԾFjW8,`&d'R֒QԾf+p^2nB?n &~u aoXrRV6*JIZRM E9/p8{bQrcOĤ4k82ph"@qE_0Jw/[k## P\ZpcW4~G?\w[b{h## UήhU?fݿڈ%8=t1)ͿHdqwNCF8R `]V/R34qB?`rȵQ?N~_N6.pG+AͿǧ_6 18YEя\;/9# `]V/c8! NV@_(IG t1{8]OB1m=EkȉHi]YG `-\k/39H(x^3'̮_ɉ6G%Oe&/p8{h2+_/P@H?x̣]YJ= †x 5~O\lݧGFRp0Ra/>op4UhS? 80jRE10U=xXwn J{#kt5x8B <i8=T `EeɂqM F\Rb>T?AOw/-:+g&e1)F1SXn!Y(hm5x䠵޾j]]#1flj*W SlmCFR̊lb{3`)`OžnB{O{-Rr_(h1ݙ{$!>?r/C~rB;LY(>T~}p{^uB@mGf/gZ,Ҋ&SֱIk`|`*E ]6[!B!Y<3e2 fB`|I^1 >[YX&BgdEw4m {Θ^gW`Ls+F{R?>Sq/ZC{9]1jl@X#gS?†"; Y!)o#%[쯙~h>=@ 6ic 4m-WΘ^W6Ll%aLs+Y jk=#&SGHվlw` ?khSΘ^W6Lf\Je#…{z4 0j̨y32ހ' ֙X`tʂf838ϝ5f,x4"Z=6>5҂>,hLf#5WGnO`#Xqޢ_V80Gm3s=Zo7I,u&\41B .p(P蟳p8@m#BU`LWۈuʻu^ 0mDuݿ73y%%*j] /p8{O0lߜAx|Rgl:zjF{%/b_+~  uʣZfz߬ñ@cm;vOMc}Fc pE}M)~ նDSJ.~lk۱”Œ(r(Mc7\w~7\yGr r@q`Uk%+ȂŸ7mʪF7 0{Ydx\v#Y",\N—E1\,G ĺdPsxuXch~C.`3wO/~ϸfFt6lmgq99år_~}rWȩ_&5$4?s@xRVH]="XQ&W+Weǒycd߶tnT ZbVn߾lN"&Z90mu rx6#~6+G_*W e lwMM;Km@)0jdM>h6L?f3߰]`}w=a&578/*z]ahRv lYhq͍MkJu!D}*m7ɱ5`6_?ףQo3U&5F O_9L7ǐ^dczU4Hf | ձ_i`X:ZɢD}*mo@=uN>*>%C]qQ_Tm-ϒ;ϓʵsyRʶWxR Z -W όLvF֤-~[&P Fծ{E4U0g\sɾmKIY??rD6IY>숝E91b#fYe+Z"URq,h hn#{Wja/i޺fE4UcaR1a-5Ķcɺ$~]! \nmԀv-j߶LKxͫd`뚙wkp%{^"i`t`\-NLZmb3zF#ou8<0W4@ 4w)%@3g[4~qJ̞ХbFñN^\BOk6wNнgAJyH0NߺXCJ.V5?$,!"#G;k:B@{QËhڦ SJ@vr#OkmXa݌Q$+bFñN>zp?1-]F|&ȯ~U0Ncbn=ڬp8} ί^7b@\Z~\93E_i0Jz[E>'ԧO ens m4s. &4bޚyU} 8_Y>h1Q1 sߜ4QSZG]ϠEZ&3Iixlc${Jꊩb6XVP_g j*%o#6~[_8i(y\S<{݆_^fiosL==5J䍵}d1_6hZ0V'~gqLcYAU̗Z{d4+t{brn6 }gォTpzhNEިc̢( }/7y3pt]6b4|%xT:uDDƚb6}ްgk½[ )hFhئUQޯ[@!BB%# O+-~m>ٿb!Z)=fy_r0wQG(}em ޯW~~@! A&07'ïwYLկK.{,3)z;o'ܻ )m` 7#xG+}?$}4&byVTh)!cf[fł$i[yV>ި]1j6GOEF; !5_ ir4RPXb1WWY#.4j&oܕۉb2iT}336 ]S$E^mׯ//rXTšsպ9\-\x'#GbN$or.|t^voMyd5R C[(oWiC^oS~K/˧'L΃s /%<5f<ǺEA|{edϤ4h1Qa;EGZGm}O?c4i(ϴ+&r&LXʀpr0q5y__Ȍ *3|@z߇Z_*$N $bRu8wQ~M0l]$l~|qy<ŽAIf>|I>Ԣ F_tO+~d5y|wUZֿ9y(۴\ L1rl)gFS1RNf ߡAuN?G[+}Xq6 aE1ֽ'C 86DB@z[AįXi_ |~G?{g2nD+cevpwr;q~Og$IAsS~HG}Evi0\C/A܁ iedҪ.'~'qߎ L'2 dQN ^G|Af. W}dݙ: ]~n9?R E^}uҫW2` aTx谑aa=[G}SnwTЇ$KG2W2!H@f^ zo]~=v <7FZG~jF+e_H;>_lw=~͐Y?on9FFeF> R3~JE~{o0w5#QTFeF> R3~JE~{ ~s8meΒMvn^_C!nK~o){H621ۣu¥~MLIO߮~[h4_&֑ku5I)O^Nw*ۂ)p8|RKy ?SR) )_ui,x~:ŔZ_P)O)Ք_^.)))9)UWLbnIN?on9m|Skpw;v ^Cx~WN5yQSFъiw:)ch:re?} 㝴OgCG^M:eDЁfTxE J:rmʯ)l ~IrMi,^J;unema[ϞoˁW '܈\iTx,ʀIOC;!AW?=N '3ʇF]8:,dLTQm )+( uʷ)?<{X%#ʵTRwˈi6boٳm09/p8Q8}d`T Mh`-P F/)֣Ѧ1+.a^rf@!zGz15 Ʀ,|` PTH[`:bu B.݀*DXFBH^9>jXpFF~ ?XxByS[`:b5ulS[7U,pQL:)*}'s&]]1H"Rz\+?@{cN2)N)$Q]qksSղllPCxVI1aB,;bf~;i )1i^ЃG#߿ȁxȉȍsXqy˝3ВCeѯQ3z4DeoAddۺ0rh&Rz"47'- h.>DNd!m$[WUsȔj[BWJLw3B؈d>) O0f$n baj+mشwiAGD.DNDnDTiϑcA"zb:H$~jӺpP%B0}]i 8 դ>̡?8m s^"[l F2rIyoi&F[k?Ko烖xI #siF,4Qz9~68قƟSl#vÈe4g G"W"g"w)|:"0g$NikɅ|Y9n$idp2sPGfDkwHQ.))#W[A޽Yz;&Eɮ+Ȭabs7 9bcF,#Y?Ko99f!68(ǿ'~MPvP;$]BΞH'^gީfuN0fa/%A藋{?9ۃ|Hcs'*cA0W/{q5uDʸD"f7r(r)rxw)Nl?2vb2nrPI޻yڛ\p-#EjwqYz/¦#=- ++*cR\iKGW%b1 @7r(r͙ cޥ8Ycq3SfN=}T_rpk$yzyCdɔ2240r0P2F6k/O`SæTF/ {ґ&b#^TVXy 0ؙms ";t@| yVγ}d20~D8mÍa|4"̟?XoUJkk#s=?b1gr*r+rOp %z;ډB%yTy*+N%7!Wn#W'T]V~[BgGN?XK'm8hHkO&ooT/Ցw]svwB<>RE #)_p9ĜE*K>ӈmY,y,Pȁȅȉx>ȑj99VP p6O,bsŪw4{K9bAr<n'tI<9Wԥ+QtL ?CVx>nfyJͱ?nFrR tnnsX-<'*3*0ncd<.<?Dl/Zb[  T;r r!r"rZEE9r!8+Tmo&C.flhN~>Ϯ&bD UK"l;9v^r&3ij3ųU>9VBڪew:O充Zu2]Ť"7șRdr&bFD ؁6EV޽j?9v ,LlBY!mmA2c5!Èe4g- W"g"w˫ȹ fYÎБ=?vcM=e}; F RecZ;M27ap_8k-/Mim^ϔYbrW3VyD`͂"CʳBI?'*by3ȝȡȥr69ڹϤ3mvP\+9M;`䩍iȌߘ]LBZwkV#Ŭ+*xx"VӕEg-(?bL9XE"vY?3o9f^l!G;Xc<ӆjߔ}~'pboo]"wN`y5Im6$SnvBi83̕KC_4eGlbau, F`Eډnp80}d^I;8Z>\OުS}=tle20k??>@Uzݭ+f[m~&ݢ j7.,ĹSh,bJz]Ĝg&g "*Ŋ6rܮ)ӎ古Mv&O02dSe&`HNUz 6xC~&JK]|Us0ΝS"d'>и@l~& r+rrr] 1|v(oI;G[ɍxd։D`q r@wcR.^st;61c<M;WA-5t b)T_"bk펜(Bv5Pޒv0s2vm$M|aKޕC7z91S)`Y=%lby3hiI_@EΕ;rp [[bmJ81LҎeVPf`)70Z:%~}!2Dr2@/ҳsNݎ su?>h8)r~ @(wSs?Pj2~:~1XbM!%Ϥݿ\.kfiFv'\i2qji 'w2f-|̞:}S}4,^ mz&m2sPIĒZ,)l5v@njn ֦C T!Jڡk~>ɼ3`$P 3d`H`g[u79-E=NGwh,qbH5.1`SHK@UrԈv(1=Ů1 +M{dmq*[fyMsW-MnsZA[MdEL2iLi'-֓QnJRs))޼mZ wҜ#{ΉWie~I7w #h R:I>lJr&Ur2wO3ƾm$m-R3RbG!F+ĎX@!Xklr1r}%Ot[~|Mюe/3e;DUzRMrRVI$ubsI[$9#!O$eٱx{GiGE(i >oՒG _.a}r9kf/FJ ?bG|/bJybfNwN99[DNUamP875-6upĘsy[0GRcHm 8_eіk+N3ed7,`p૤g痎nlhh=#C#ݢdzZ+Y[?o_m$XVeԇbcE, Xks[19[-[>$8oXeң1؁/&v,0Rtx-uejɌ!ҥt?|ZǣYm̟6ҹ.B캈9Z9(g g#wK6}NWAp8# tdo%kHk2䆢8ή/_sfo H,7hօ[pGw`Kݥ6{lX.gK5”p{YfX<;|AC V3{~kӁ,m'ni.GnW,!-Ou,\<ɼ IZXh!؞m,m=N`q }9x:6:%ʵ|?#f6^$5W,S?{| &ĊX@Ʊr4r͐-m/鞅bGq 4H$;3Rq >Ym_5j9'^bPwh3i.5b/M r;MA% 2BCCED;;nu"b޹u['[YӅ3ջyK9j3##w絎[gC<$_nq 8LچuY{OlC;? Ĉ?Đ?mg6C.o%yߒi7bG1Y'#;pbq.W8& 7g[/rJO$ˎT5Pn YQ*-!ucy w@r6+G_BGk"܇}D։rt0=,|>-m[qJ-&Wnٍ\ߞ_"tk;N `o< 6\|ݍup]qe,ܮ9!Y_*1@H_X0Spji!# 8OG>E?sEYR_yV s9v75F q/ 5ҎBߞ;X_|`m ei紃6-9W,铻~U*w1$Ly]ꅶ?۾q+閣Ai}Ͱ6+G_BYo\:C1yV+jxigq.uSG>Sϖ\:_WF0eTnIXٔj2aτ …}Xǘ d0ed>@b1"}bu,Y^ gKs8r]ωy 9iWJwj։v=}Y1NYɃu23ȘnIXcIZaD%9. { (1oA oj?w`_1$,yC/99tN5ڬp8} :XA8~cN^멩ٟ$ߺP%k,@z1;#zMF%I~8_ix;'RY3\XZ:޴#CIcͱ7k2X0Sg@l F vGl~z#g{ւTtI^BX+wT]GxSS{?_ b-~:Y}&a4GH; oǼU8>2g=xB}6rt&G$x|N &B输2#F vGl~z#g{ւTtIa^Z @'?,z]y}0FMWRuyzFt#lHKѣ%c:tS^"ELmxzjMZwyEQm,WLCI2|zp {1@Ac187X߳ $ KsiN}uvZ=`=K 7E'/|s]b'-k!}ka(MZr_u!_w-vҶ\9nCFJkV.*{' kutZYǜX/;WNTp-Wj/ (?bD| b ̎Y+CnoobpֆG}16]i|.yG֙<@m \͓)|?wk`P{L+Id8YcN佦{Xam}K, y,~Hc_ؑLLŗ GnoКCFocvlY|Yg:, djkU?O_(k Ƶn*9u6Z䵦}>Nږ,l8PĈĎRhg/\@r{,1pֆmCmu3js1Ϳn/e 0G!0CM; V~yVb.jzT:v.Cn,~ȘV:w$ߘ#KJ07Z ?fX`!0C ՅM; \>Ĉ| o_]޾ dap8mò]N ;Za 6cmz % ƽ2 ؽ.KYSV3;G\Hf0s ͛v,n.)y?dt6Z;ǒdƳI;Za `N, U?#/Mcj׃qڷg_Pi ";[Yxw[@GpֹRhNA_ݞ6ca3pާ׳ul@n7>pko`,8K f)'rO9+m^F]s,d8=GxԠFg 'Gٟ#2.cVx :b{y6`]K;F2w5h-)`_lSElO=tǾ0ΌDg[>P-q62 _83eUױcWH]|lcbfr zVf j\'^8)ae9yH_~o폝d L; {xb|kQtBTxT{jx^u{V꪿!񘲮w⚮lpw"2oTy0"r=WN*]祱9nS, (vaC -1͗/p85x@g|p5/`&ϫJ,׌7&Exm[Ov?R\ m~Ρ=acjWK(<>aiH -j} _4`<0iThSOvt잳:yL^`>cX),wpbXrO_<p8ucgSldW^δq9g|y%ݢd> G ^6}FJ.ry368僳.el$ꎑˬxPqȭk`6kgt m' κ|q@|VWOgum^p8jij 6\~^9w(,if(lYLNg/~iM/r3?kd}~]>/OSpϺa@桚{wWS\j/{CU9Jz9䦬x}/ɽ˥6M-4XU޺Qy96e 9MD cWp63jx3+w.s(ݶأm~@46s|f>{y=txy\szxJggv7?y8Z}a"Y(;jf,3;9E`@UUcwUrD޾Y].rp0mB:ad"Fg'L˶YoX,uX'S׶wUN0K]ޮ9|mo.T['ZjRcP bp^8aU8N2jD<fXsֶwUWJbƹ\t) w8=W\*~CP k'e`M 'ҽqXp)'Q+EY[{M'm瑋]0qz4a)ѓ²&$Ӿ9]O%n>75BF źP__+Erœ 0z t![͠΀g]a9SP)jl l2w|VŅ3oc,$OLoǿՇ"@Ag^Jޮ&k>3ȥݺ7`4AnX2[͠΀g]¬ N|ɕYw G S`0XZW zr{W1K,qي=`} ̝kzi,޼Y)XywῚíQo. a %de]],zŧي=`} @x"K#9)t/d[pbLK@\`&0[a*p6 Dqqo+9XnG|}[.koЊp0R{0 TgPj߶(u6fX:<6_.{i4T OcKctf" fLEXaB'N\-.o5Jx@(, 7=VX@V|3h[HYD(s}F!q#Qq3QS<0c%/-BX:<6>R؋P4tKi \6L/Xr0m#"f(*(P`b7r bm#"f(*(Pk LS;/Xa c'YJ ^0vgݩxaF{ ܳ@ox*r̹8)`8yoxRlc0\K,bSY߳1`cXߛ 4uGI:em`3Hz- x稿^0lliep0MX u3FQֈ7N%EH lj1>'2˄Z:[yo?bTt~O&## Q);1O=@lQ|^/'^` /hx6LSh2@_%GN  `,[17Z)c݉VD>o /p,`)k G+`, ,-xXxx)tYw ^03-HYeYx`y#$<xa@Cb7QHY;uXY]0ҶCz[FuD/{͂d:9q~Y[.jQVbGk2;8ΔHxocqm_閶5?e '2Fk4U2z,K,6P,AHT\q?/p8-pzـdD g?hH.kFYv`Va}_k Aes@I2|z%}(;oly bG;k2;8Δ6c \oyb9L,fo]k;?:\i&,um_ IV_$Y~CX6G'?E@|$#޻W+UX:a%~(,AHLsMf6p`رyG X7Y=$-D69n(ΰ-5e`PW2uo*nKu̟y0BNs,t(;}^Y:Đx u0Yo.É;f`ddi$jDlm/|QK={Zֶ}Z/}ݝ3̟yRZXߣS^q.s<=SΧ jId );-n(hpRֶ_`z8:uW˲e1Pm q26-᭪HݵDֆb^եu"B s]fƟ8LYfޙ7 omZVB.Ybq]C)=iO׭r0qH/kKd1p:93h#7f69<9j +[w^oQ@|\r=ߣCҭ~_(CQ;F eǒ7Yl]n{q#X^4Q3Fm$nGbVL{6,]TUnUBcɀ1,0dc&`'<َϳc;q؉qU'zWwֻv]T;ߑ~$Bho1X{{=Do7=y]~:dyyl3:-_1~0f@ONqyiKu, ׌PpN?HnW<"fiWgh ` UaNb(y?ͅdst95gڭ8ni[$F0|CP Af\*??㱈Qi]Mhp@vWl\5_vp{f ǥ;(~^:KHWSiZe-ح@NgYAC?tE}^EvdDf+%z&!KQ=0ƒp tIZH 0>:2w#챭VfLw1!^wZ*$݋Ю~JhCjFv[!y\MrȲ<`@+|vnۛxUlY^k-umh8}We遦rC`PhQsk\$>HQ^윧ca?+hLrsc09@Zyz,M߼HםKv-gI`pl~ogC N=?=3KZMr6-dVG r:@q;tt gq>0Q-!}=U;& XM9M,e5N`>eid,cݰЫ Y_gnlbcui5)_R@VXx]`?9Za*\FRe**,!S2 znR tHxNIZr'pvs o.Z|=(7yaUV_}tQ{d'krcIt${_nVs}muvr4*N2sCn_}Ei{R N&kR'888Ox;JIcJŲqp`7E$9KTXX(J$FcOPZ JRׅ\>&iS%zRKB 4@o-L@{AxG[~*XB%~y>fJd92)QY!kA%)%}@熎_ÂgqvN/+Pܫ Ɇ{Zx` W2/Lv+ƅIr{m^l-aM9o -Ueu]mIM%%ṡc_THzڋ+%}M|7 H:P s+F] hLJ\ PEIXQ+k Y@Q 8UT ?꿑RQ!]Ii Jį6km˩6tgv: :y,+6YdcM>M6ngˆ0>Dr 2I}Vkgt0ȶ {t"6s0''w֞ӺJznօ9X4v,&P\txk'v[x 0t/q@$IJj,OV#3JteN ssMP:'~\9L6OV\.xF٤~.YIhӪjruó>}vdc$2 }t C燎I6\Gj*=uP\4,o'8`rr6ɉe<>pmCAH5ZgL "1SLmiiZD\?HV@9 )OUO)7c$0E{zڿؾ'888b'*l奸-p`ޣ{~U[^LJRNP]O[2&(I37b߯e%7.ǐ l2AxwαE]1)_r{M>% d١ R )2Pt:#~NJH.ȵ%z%T,+{=>Rqh J;nKl멵ΐUyÂIBTv,~q9MW:h+,_\Nr3fk|?tJR@uNx˚扂4Ŀz*UxӾqۏJ Oppp8 H`אpg})yyq?;+/O%_?eyT`DYSp6n* ڹqs~'q0C4lP0&݌)ԩa'J,79!;P,䎟 rneA'5ܘ@6ΟCNɆi)gd[%`wJ<Y\bC?{vE G|ekۂ9Gv??%ą(*{3NJh-{ zokM< ԖFd')XŸOv8GP i'|S!yA"!o)7;0S3&ZܑZ$G,; 8 :2]@IY&}GzA:< U铦D 0O ΎbX`u"Y*hpHg™TS%6dDe %dl\a7Mu:ݱ'~:ͪ賫︹VmZ0e{ixp֒Ռr( zfD>b)Xa0;*$09Hp " qf8;{2U~:k2.޻-=hq61e{HW<  $ds9_ؿB (8{n-N4Idq#bA Ojy)lP  4;ڲ8ͪWyJ7OeYAfPdj)8!Ah7t ݱC˧NX'Ov7:%rɾdMymP5vQx:uCxQiJŃ#+/rWYؾD":94蚠w9ܷul˹j+I[q6a5HvQ/>OppLP -`C[%N{(;s<R6l!kiঃcWI"o\ )'e'[`u'eձ~PKa0rz&%H @`id?}14B~6cfrfd d S!KaG[xh']x|+\v~C=ld|ƾmvՖsp~\} `֙N9iEtA;o%r3]Zo^I'C-Env5QŢ'5,Iu~U P:W 6,.JH޾Z4>{W@_m:vmhJ?hh3'[dq#wvk/C*#p3Ph uQK[ s?h$B N`eڤX1K[Y-Jt$O8Kigh L/{pXg3ǰ&v[CeQBe"8Ef? Co.@@' -tIsAźȲbðzݘH: "X^i;=w:\} `}$N㽋8VOxVr ^ A#t6۬ۻ}ՙG8X蜠En~Sx~&YRC:rHlRWڒ;`\<1A2&?pߚVmvrks#\X5]QIrrVY^Aέ".^@.YH.԰߿\m 7z)6-fu{Klmfmo!Z)ߢwmC={w[Z_3eɪ3/R=&+R8#CEXG?||4`eqptGD&vާPJ,*YÍmҲяb?4WکU K u^^RGIҘhuÃlK?C%6ts'Sn0 v-`N @8.T>iZ^32];<:(̠D8)ezm-}Eei2}{Yn'2;]zrYLԩ^b>3zvi iu!ΚM{F&6ȤRs'$)C[ 3 ]a^PtJgн0U9IL7źٽE)l/Q?ݾyE3u cvyi|>_Ă}ZJo/(~rD/߻JL:#n{^=NB7%GHm{JG+L8}K"pSFA\p^?F.uW+* vn_QW,m/3?+T}:Ř[bc,/ 2C~P(*e>PSlpy8sN ?X 0)RƠC!86qi?kaAJ6όώ3YL3Y3ٙb"s~Oz18o?;v?Vkŏ_ s/@K){M.B75`G\9D bD g̰8+;<:EnQܙUX,\=ݦisd7 _lzt)pV}k0]B9D !03A}}j$P:`pT9IUf N[V.S.4|IUqu\^VUXkAi*C9BO(s*oQn!A3+R5 T?hn, 7C̤VP)M4M[SNa18gg,Jq&lpFg&ήrgY3g[[zD2Hx )4'L',,;!:fg7 I\o/nlgJt)!8G2PN٩1 ϟ_wyXCٵL{%?Vq%$tTvwy}nQCm$s SFAe} N $u ;JȼߔH.Ѐf߆@QiQnc D@y8p0?)ԥAd%eR5ٸ3rf=ipntA% >>7ga ѳ44YcS陖cV$v<+ӵdaݭc?'/W +>3sNӍZTn8+ܦgG 72g^m)L!A!?=n#t:)t֑"tRYٻNAZ9 ]H9* u ⪥ƹ-;JʼWfг N( "78C': ͤNAĚ,VOg7K.ӑ<=Cpc7ZoPdX@l(K 䓫l6ɑV=+>ৰ 77Nv38^pd~hsύ2Dn%PBTqh(5(pnTk&m^c8ܠQ.gYHg78~B3%<~BGܐ%t"'8y1蚽PYl3Y\_8@M%7l%';JO\ \N%h@>Ă9$X7йxW9NMN['H>_覠Y\߾}L*yVP.SW< lcg g.[R;[V888 15T@u HWVܱU]EiL6.K~8`,]ܵκN"l>!m/OvR@aP"袣`u[8 ( nZAAL'ƭ+C iJ2-b7Fp4&nvY5Nla=36ٙ!gJn㬛Yɧc8n٩WXX ݁YDm]`!t :'C&tԚ Iwwk^Jr3(3 p(\?s$![c<h'q>YgP{Cߧ&tTWI"$ W001(3ĕM\t=^NC`ý'P(o߾68rvEέ7LT eη 㛗\QI11Dh}?^B ^0 75۟\sJtCsICF!n`XT/pbL84(/pn}ψόdyl™A[ q8S,|JQSb,RP>95ݩTGBr7* Q#k2Ⱥ,*l^0laIsɎ<_7%}϶Q1PsUob;x9BpgK&zzq]sMl^YNzoy[OMM1vQ$jJ qQua\_}|T, Ǣ H:rH\q.YޜoN# 6;`~V@6,+![VWݑl_PQg]S7I+zk;<@N_e7߱i:#q??/?t:+a=]?cWlz 54Ҳpj'˕(G.8^NA@'("?*~ġM[XmJH"<=&ªu͕=;>LS)HXaisGD !5'Z0kY ^΋y)C1L$?p.٣gVnŪ~,8}>ѕ{:%G :]be~Pt9IW:- @+F_`T,]KsH[d䞸]Ķ%dצ&YO:G,* #m8^~x5Lm8 }[[  p RνpT] %TC?;]5/\8_8N.kj[%.'h`͓gɎH%eT8}7>~j@CE&Yx= ֞O?Q::b:&sI&t:.!}-6`#ɪxdy+J%NqߍM+٭?8,!)8| !1SCپD>}v]x~@[{5߰t.Vn8߻x|+7@msE)cy`Pa%wya6c;[GH n i@頄;p~wA^ k'lv/"66z"Pk*+$lr|yЁ3& 9߂fMQ/[#&чW>iS?cr:*]E$t: ]Bwm>l@n lg(Nt/f7C)M&;/+#W{O9p18Y=>o 4 C;զ,6{$G['*zkGȁmK< {Zl@>?c,?t6 l3meM}3;B]^RhuW}6g.-'wJ888g̸~q v0MYɃ:ɻG7+픯, [ ֮5w|pپn‚s0Ң7el-7h0ה<xn~oTNUIc=8xP"@Nu퉦 Bsl^"6[޾yk<:h |]R]lT> -)a|be .8[H23 v0rȭK:埾<Jw[~o+O'Fꘗ֓^60yr ٴn2Fs=`!p7ȵۘj+f8 2I}E# T'v;ȗ/n`pd(jpy! Ullk!;uο~q-ɑсtOu.llgon#//!_?t;S&-F`F"c7t'ѓ/ 55\ ک$2b<[=8K W{ :%D>zw[q_Ņ}dUGcT_1l7:\ax?mLc¡s /ņjΜ&q̋(mZRMnNytEq'ٓU^ͱXpQ|S_s;RO69+`)98:ucfޞO?K eE$t: ]JBe66t#ہ 9ɑa8qc>NcR #d*M :H@~43lۆHc5[QOM|q[q'ٓ{0ٹ,Zg7P "q's?|a;!G5'mADp+8\+dHcb$AIʶsS @^DX÷o_#_l(~`39v Y ߼aL g;ϣ ;I狒+Ӵy:MV!H'T$FjC}w?3=?z7jE ϪkŠ("tҲLJBBw 4t:]Cl `M(l6 ۅ kguX8 ʃ~`pE&*gr=A^sVd2m{wᠮl_@J>A^wUqzx.}W;wOK']dŒlؖM(4s?<[Ml faaز|2R3Pp<$<888\о?rS򞟛LZˍ`L&_GJ3fa?ğ~~̩lY0&|)cp6͔dJ -kOV\A.ޢ?ONVHiDh'gvCg>ksCy e!꧘:aSW:&6Hn}^G%ձ*{=#zVi9cd0s<AU?nAg 2t :TalÙP j͕v*Xp-87TFp%?`0"LJ3'|ҁ0}L4GeAVp,1`#sJ)1+zf݌)^{xDv|s&Ȩ7\5z)}&]@)[15iZ}AX /tOWȨ;Eޑh-e^wp9<pArBi6s3-m"6[v M6aUجҼ .Zz\ G*~'3-t#H # 1S )N{"h[?l6 ۄV}{Rp*1q`#'75,P643JT2$:3iѳʆ{EņjI@P};E 6#`M eI) 1eql3sVO(q8ktP16 ,tT3G>lf`;!l 5[†a˰iXpd{D7[@PjX HugYpܬ D 385o"A-ǘO=2sl6 ۆ+3g2Hp%w58#$P& I }#42yX߳iZ1d򏑓%*3 Ic,/` z*҂%ϔ2ml^?<^[Ѯy(r$ 4 C#h4;}MmM6[v`Cl8)l 1E(r[M* nLp'8\* ~J=X9RsiW:I988&`oqTؼSkgNSLQj3͘;U}yiSWb͸;_1̚&1"`gzulUS~Y+^NK~YB (w4\6 G 3%OŀKn7$_ѐ9t@e,:y>lmF`+6=l 6ۂ6-&aQ*lVI0s 8qpq>p nG+O}zP}b9_@?\ ~-_kqJ?9D JJ D_ja8 Ȟk2Ce`A_WxK=k}Q†6x|r}L6੥8 Ƚ:uӉwCc\&|FM5 M6`#+Jm6[M`c\tr/޷h6#{sE}^9e*988|sЧ@W Oe2+r  2H"Q 0cRDd~b蜜zcbxoV|Y.͜z_3nFGVĄT !ϒDž L 5ٿ1&T]ojt (_\%S,\Q ZrNLOE7*J***yb!|{-C?QŷRN0 a2t C3W.81lNlPG&l †a˰i6l\Irݔg@p!8W32wAܭoIE"".Ć>Ki/B)'ߟI?tb7(j)).PGkR|5&1(xv?I+ԖaӰmظ#:p8\N7#L% N:E'xJx@9O8pqHeV q<>>pgd>;"07)%')VzpLJԘ)l=WV}V ØK3&Uk4”Ɏơo?*J;8JqG._@y"(捇$@ER@H.'KuZSi2SHJ\Yw1ZiLzj^ⷿ0^;?S^>iZe[nP`Kď(`(u&* U-ms9Dx~rVrj*vV|R3T2xH6>ɖRObh8XQm`k9K W4lm  +HsPUs^fƑtT[H:$j IEfHNfENw%ptFYI[C #;6-%#"n#odNvF;ȚZZ_f=|9[6[^aӰmظ<(7#p]1`HIG9Or0m Wm$/#xp _$.!vey%]{x0/" TS{MA(Lv-OUOAZp]EA#rB MX qdcr6ͣ+q뇗ɍ[ȆD?^6E8I zR6ہ 1[6ۂ kU,l6 [VZ#8 S&(GѫO6_v}F?>yy)r&;J "}]$)c^NY\9|r[dfY-)4&a$ V6a†aJqg;Rp vsppL<4r#&E<ߴ>'_5r%qgM#'X _DՖhgDjel6ٰy|c$To1āhSq6s5e,x^< ;c@kk't L-PmF`+f;Ԇ`K)`k9 &aQتҲr7Vp<.flgyP@Ͽ[QO퓁go0g|eb/2=D3.[ 7ϟKCUlX4Qjk9&aQتҲr7Vp,V&' `d p;G@{^q'[ Pg[4 i~{kKҵŮH Ş[ n t1.-=D·o_'6s,2x"_ [l6[v`C%`c5kKmTZ.+KD~nG{*d}{Z(${ ?j?wqu\;\;C z&8 g{5DEn?'J?lK| 4S[Kۇ  Wr'!'SvF888 %`g6&E|,v4ccC~d_IKMedO{oH<_6+0J⊚~YkJJ-7h.N4MZh&ȭ7@sգ+=Dg3$"UYI$o,2H``Gplf{̦6k]{dsv!摓*ȩ2)ك;C%bـp ԙŎfxr!?2i`3p#8lYUl_SIv&+˻ts&9vژ5oğ诖W/ng6:=&!g2o,2H@ M?#lvs.%k(7oOuWx'O *\ v%P: TOs#v08{lll"ؒض`k9#d+ rv=LA[ .'K*(g㬇w'n~- ɓglO^"z-;٣=йx..Փ9dߖ&ٳ6޵#dn O sbgYiXS@>zWC; -g->OHÂp2Y&_P‡BءĔ_)E}[Ro*$-@|:_rI0>+,HƇ(O敥f`ȍ 0 {q~PryuM+_xSۤ6V˓Ha4;m ` vGؘ3l"͹IVdI7(_c#p o(E >CޔG)>ڷ+ڥXhғ5D7Ik b\Y:lZ!pt@Rۂ?ImAblܠD{{I p0oJ&*'1S{l.nجXtkN,I. On#H N忩L/8&C0+ ̩~FkFcO:,CT,u1ϥHnr'2(LruwMOП@qsgp` m)؎H^yo $;J&gբ$|>V{D1nmVTwcלrm%uFr8q9nfj4(RQe6վ&s~Dd0e7v6 mvρdSyM`JY;C(pppx;I"ݖ~E59w{|;Jɒ`cpbI<?k't nCǡL-l6!ڣlFs̑Wwϑ96؞l՛ pRg&N:2gN$X^ZKɶ՞%Z*3l 2m'N\rl֬AOV< ۬QPa3-Fm6 [f\re!NwCBsP$Gmy6f^[{ 8{M#َr3Şssost:t꼹Z[[O $7.5F6/?XgRNY({-8X3&_W&:@OGǁ+ln⮜-Y=EG1D%.#uM凒 P/[ʑ%"o|ؒ}:l  ))p< Ζ!t9s(G6=c{`B; V |hlݫ%NqMmi>(+I*IՆGj4ytķ@C=2cC4G!p\]g:`}@&r9[\)NSVl*9`){J?i6t` %!9_g7_W'?8Y>-i0s31r$K e7zrlL6FmD1H{9}(﮶*ϥd}@&r9^P'C7(Tr1z6[7lH?wɊbGwK?8Y-nat ax 6ޕvtq @uVWon 劚,qϜRnD)]fD 08SN`p9i/BиfۃR9d# N~N\xJ 7=l?''T-:]HlE||r_2_ ؤpm}!ҡĜ-#%*B%؆V`;r^ɤ1`Jr o/|t~붾ܼ]o{zY {Zɣ+Hqu3d&}[)MӚXVC +uwݎby/ۭ]b~$Geqix+GOeԱ$13i]q3='ώ6pOl/-A~{_ <]%+wP*Т ]h![2$[;rBmYPw%̜T Ż+o68M[̅%8ϩ+ECS. b>O]0l6V`y'W3 R^m@F̖@L77Vb=U:$L]@W̫o&muҕ6މ>.pFl+KƟ0S?'{չ|䒹G3nuoj`Zaŵ ;HT]dk?{` 6i`b5b|b.@@=SC,AUFy{R xhcނt1l,ZmNEMP$3&~BJ !yү+2BBiпtUygϟZd7K77N,K̕V%oi-%mFaYj S[lmRؼ||E;O^|w^ʛ[e+;5K* ;'K6W"1XmNΚ,2oO~A* ;{?s]!_K)͵?|=|E!`\l?C+c.]Z@0sH ɽsGjHW{/+ %W6soJ?jp.iH N-̍ N@# . Y$[<}YWys&%9]yr:?fm7( may'lmWeS8!{X{c.}KvP$!9|K %rwc\k_zj*no;,nj9 Ps>ak\&1@Nx?b| e/@0J HX XrR7_s 'j5Do1$)1ܸvǫWג+[ב%!>_M'8XlN-$݋,קS@Fe.156mDžNVԏ>wō?Άe`t9-p"-`xv2af&?wfaA[Y ۆ_`~QxW݇mZ xۀ.v.SOEbJ W{stûɱR?s5O\m@MQ*eb,,5'೧DΆg{roo^N _JpKg53>߭nْ  칊ҕ7O8iת֜C.K1 XAl"Yp@ 8c&-|ȥ&[٪ӔGJdn]=EGe\7' " Ɂ બl]4;aK{hYq(wϮs/d͍3N >ywF?<Gr%hϒm3l marۇ/0}{g 1#vDzEqQtUw%D'6+[\K ywYz[ϲZn y|^MdԉYq(׈.d:]N yB~Wo(dݴ_`Lǁ:bGVhD+.XH_JSf7)Ԙrl&gm'gm69)Cv|h>!HU3tysO{y: å K3{!\Um\g;Z4,,7e `vĊtl5t6 [Mln |ḊrR]<b&SO41[7¡rIk\+xd{ 6㍊ܽܜGϜ-7׹2x.: j۟| xj%@  >~).oy }Hbq?2x,{`Lİ}"i|}W]ZmyG*NU+޵ќf) ՠ `Ѕρb gddH AUiySaxŽuEc+U ̝|.bv̝V 8cO@&lJmV]0eɦa۰qغ /#gn-~-@9Dlq?96jSbyl"i߷ә+N%ĞB#l6(k^c S4Sb{eg~{!\嫫:@n]ys'ՉC7F-{.3lW!#v, @= ?&ohS$LN%}[:j%jmh+RS;Ü' W$RRrP].lX#6=KwӚ(°,Cygn?`sYcH7 fN%FP{*ll 6vl]ZűdFnMRl 4K c;iYtQc8VOs[0M?9.i*8ٓ Ygxx͡ϩ&;\ #g]ow v!nMRlaq?x,{@LKI'J6ﶕ;49NmI#l;(^QvrH/z4Bܬ99aṉ!1c~a'h&%2g! CgZBY^w"ox?`sT,$?8 T[;@FaY.l75p/#g_@ 5݊X.v@㾔1hbExpG+JXt;y'Yi8+]l{Ԝ'Z GO8sH?Ggrw7mhYcw{?`sYW=d #-D3WK[rqǓ7n]&/` K)/.T&69l>:PK.8ѩXHo/Y4cA8/Y0UlW%V;At!xˮ aH9< xv/z/HE= q>6`QHK6 [w-æa۰qغ /#g[k1վ'[>^LsJ\Sf_GSq9z8s7m Scyq8'-D-z\;xq8yqR! 4 S?|=|DekZ@ s@Vsbe@0zOt3׭ɻ34e&,NP"d7ITJ/u$e:/36t* j j߸e@IHC98s^W@- 6 ۅ ÖaӰmظ+F?bWSGZ&T8w@ɻ3T^D# F ž;woO(s ^ @ ëդN#N]=wGtdhF7BUPz]⬸9!ӔwAϱz .r =@׀AN%;a]P (o Aqe<_mdU".;qwD&=Y]!cfO~0',35BD@,1B7.o䞴;îʼn!!Q*۔f'0/&hF!&nq^!<KaHaUfMöa3 =j jrb'@{s9kt~JI3l,I[*R`aOBD΀ @ 㡱SJW'.Ѳ{4O/˸l噓&Ƀ yf(k5&By8#0;)W@jSM&&]0eɦaEij?!2u3g%vG"^ԎR`aW3BDyG =B W㞰;AwrO.PJh:?R+3؄Z'i_;8⊓O O.;QwrO5F.BDEijϿ=4)\ܔ=aeD)LMB8f $ Ö})$`4_'hkJ_#{=Ԟ!{hR3pOmqnC^H  TByhA !'᛼-Ԟ3wn=MRFW@#M 3|;>1M@ \e"~ Au||va/yrx#ف ;>s4,ԕ.u Ѻ^X'GHܟgvh!{CMmBCd'+W9lis\SwB:ȯP>ԟytm 7[Jhc{ȽJFmFN%7᣼-ԶO4[cg}!xV`zx`St rf 9vwQ3{Kl=NX$ԶO!{hR !l>9d.7;}îǔ]MJ?Wgm;G;\(F0qaovycٷ%[D.36Gy  4&MyvK ]*D.dENU6\0 _vdk%v8#0;)W=^Xһy6k'4V.wѺ^*?Bpfŝ6%[w(%} pFB+Wpޕ @ C@ 3իIyB!>B>ܹ@~3rj<pFP!ꙚLqC]Ūۧ 'qOnғC "gO.6[W9X5>VDzOָ|U(|>;n9o)@`M ZK'r.!B<=dߝe^?\F 9mp@)]NU!5p+!BB_kBh@uQ*!JmS➰3NUeU`t~6z bfwyǏyb*枰3v5dU`t~my^-9ԾN lޮpA!{hRpOd!h7nZӂG5 Klh໼my> YI3 O{GG.cӻy ÞwEIJ9:pvĨ@c^vftLwջ7.:6j;yZBUwiYGw@8:RAѼzpfT @=c^v(@` Fvk pvсZzwsP7B&Y?/KcǨ<+|wpn5ܒee#Xnt||%hl?{`z냣?/hkݭ^{)#@` *PiBpBseK>3yVI.mʱ+"]½GRU!8ui;lQ!8G nTcr @uҜ x߳"ك xO@DŽ - T\q-; @ u\ Eѷ%߼+.9n|~!(1-U}-n#Ewp)kV E-lW5;:%]Иw/%V>- @ 8/j8VRn sveKWOݱQ- `C%U󛒽ő&TM0g(ۜ?ޜCz4z겍vg] @ɖU,!{n^@ud ]noru]*BωU7`Ñ($jPB@p#-UQcG]j}row;@ p@OcETC+O7g{/ OWdÑ,;oX~"hےCoo΂}! Gkq䅷 @ _ oI#@! 4Qs |u3I\[GFrjQ4hJ!Xp*㌛,:jۡ+ncBP4mk΀ yBξtUYWX4QO6$Ep}!B_i\8_>+, wURXIzt5jݶ z;B_Áhwz jnI@8 )$ @=$ފ%G*~v`>%o;@ p@5RRA!ܔq}g1_ٚkʿ"ûU-vg @qpZ6s/`T/ +ۢ;p{OԶBP 1[`woZŽsop(?Tz1US&:E]J ;}@)w{@ pUv4zu(n_뻊oޅӔ0jt4hv1ղIO ts/kHVۚsBOi6TYR<^KϦ7=-KҦ\h 땭hyTK҅Cp^]+qWP =`ۆ mRSV lm&[\wZ!7v'@MkAHp؆@ B1{<_◅h.ڹ/T @ 8om\=BPMXs!>w~WV[Fe>Oăڼo 'r)ʗ @%Ⰿ>Us6j-F\g 9+ \E."! B`/ @ 77N]$\;E^tlJrsGxjA;E W !@B@ >^Jzȯep"yqb-9^) 7!lq~C+jZw*'14ӊp򵌯^]%7=NnQ*HQ @` D5hZLv5d9FCAe\' :?˫N>9 f5B朾[ ŧWWY(Vν愇vVϏ }ztsgsz5[x#2⽺݋ [3,  z*/$gk}׼֩fEaN'ǛF~U% ϻefOsf5?Y4dR';2*R>E]gtBܗ󸏵VdCHWس rsBxl+BPMԬ {1-v27>=<~r(yץs-OuxҺɻG', bͮOvbOoum@ >͝o"'ųË[}Z1$'+W#+ȁ⥴d*nvlߞ?ۭؽv i/Y2g >! h!DzŤ7;Q)x ˹}rp۟F]>wV1EA>^z%-Ԯ";2} yg{lm4(n<DzŤ7;3BM~-̚2v `.*7]F9F#7twTWǐ$rp2>s3Vt ԙyh+cO$3'] z"@-Xoɇ]nڹ{'Y`?z$Ֆp 4Hkvztͯ.J%5͹7;Z޾qKф=Wog+ΚQ`m}n@ ~%ص{o  3' #O|v+minߖtTz =[`'B"7q!n (O[H~|o_?JVDw֤P 2h>BƜ;K:!x% ~kɡgKKM~s~g.bk|r-fP—ſ\wC|sh\ΜƜ;K_9(1OIgf*،w?RCR/Af` ?-;\$^;ڪx?zyXޜHNx5u=&p3amm;80l^aJh_'fB ؋Mt(|s1s$ =ǫu\"XeX9g^8vW*XBvx5q_ag.(,c.ټCx>Px녫O _rvOCȉBq[Iٿ5kW`n'z}Gz4f&^ٞ 8p ,45zZ1wK6I$8eyK@ Gj4@~j/KfL[&=ϊͅp[]*˩dGn[E|@ks4W* c7ygvv;w*ƪoegڈFQltgX_x/h>֊ j3{z|bΚln:G :R0VKM=~kvّL7dhaƻm+ 9yL=E1D/1lޙ&`<@w+ToA]̏&@)ih?)F$DG`;wTR>/Ov}Z,\1aalL]W8Ļ@ 6eWuOm3zCL_'LO`Y̘_.$tYR<3'Ǖ13ȋ]|w4^v榒zsYp?%1;un\5wf&mʕ+ @y:G3貍+ڷO*.!rv'RϷ1@Gʖ/_ (*G6K-wCj~1!@`e&oɹ Yvע -:#9,Xx zB2j)+7Өr=Ya#yIŃøT,^ TŎtc~7[#̙OF7QxJ»@ WNڼ wopz5|LA@AjjCR/1ヰ 47.(rQd`QxȘ7=1IQ`&(WxS">cɾ,rD N>7K17ItL}QB~<s+?lJ+/EU?"\>Q- Y3) ;Y!ލUhA*N^Mk2G8$!\N~xox\:LW ʟ'ƒtU4@ -u=,ϟψ[^ޫc2cCf'Ν>Uz 1AQh.]A5W +Jy2@l![KlpْLq(0_Oi-XFUUUacK0>BG(dᴏvanb}\mNGaټk!DMj%{aO@ѕ~ZRQe?9t 9Ia+Kg{ F 7!3Hmq:)ƥT`Q.Ԯ_J1ڽ9t#n97HnbN̘w'Z7 hk^Tgkl_omv Ύ hH ̜xEsHmö |sHVܡns&)l sZhX9b-~z+ ']Uq/A8{-JzU?{xc;mK+'n!ҢelYtTf ר@_F+Ap/X3( ׅOYgL!KLH q?yGWe6P1)\Dzb`0wX\?_JP&%g.}e"n6Өq*=a}zζo^ TBG+1)>)f:S@/v@ j<ېEZ֤8\4lhQPoGg, ^:mܘ˟wjX Y+ EY3=n-׭&+bcͶO TRĸ1apl~.ɪƇ~ QK\˽p=Mӿ )acɂʳ~.Kr{igzE-7Vd9u~D `z @.mC%I|)d'';H}i$PRYPdž'ゖFM|)dc찢,z:\B:* <@=(}w;6}IsN}lotyOgt:gćsҜbnw>?^VCZxG[K*R\?_ VTPRfkƚ5d϶ rDX{tCo"MMM|hr}I; g6q cg^X YlAH̉-W'dY n X0u<-`K iV8-hI3$ c˜a,Y2kRe!!As$m\bNcL?.&~ҟqMal -ӢFm_ |vTr/y OT}[rTR@f0R? D@0/r5_0!1Ic1u3es%ppL wZ/_IVT^ ,Sd%_$DhԴm0/t͍;3SL8B )s7KP>/Q`.hb.%# sǶ~95mtn\IaVM m}) Oû^;I>)=DM@]w/@^x΀۲R{"HTュXpi<\C_ |$a:j:C8E.p[Xzeҋ]038"}?i 1ф)% +Z[a sƺ>c.Y|:YM3NPga۾TUc Bwt)NSD_07PL»@ p@s +bU-EYaHΗX|.fu!,V>o~̫@A#yP%f!<ӥ_s Œ 1Ӄ.͘ORGHaJ?̘aQdP긐5UV\H"SaLsC]՟ubA]l6 ۆZ!#`?;3II^ſ;-],!@ >97M2{7^XyR9N7ć˩/9ʇ%N>H'Ó@<b_v|gB$FzI/A3wr3&6.]C`LWi+jnx+in' :R2-4+ )׍9A%c}@dJ<ݬĐ2l b@,E&G>STw ~6 v]VӸ/%u >٩7M2i|檕~Rf!;yc7">"271*V)v]V/`S튤eV ֯k[ƥgl')uݓdcSHmTU,l6ljPg:غ"||D3[#+T3W^[[>2})cİ!Ex6 ھoSr.?0U1O5'h'⿈">"t|okmjqBž5c.X@0J H_8%I-V{핤o ,5İXOzS/*_|AIl;J4҅' J$lEЬsm0 .<XI*\4w65EXЕ? ,i0vzi qAq=S)5st{s23>3'M faY aqԖ%du_G>p[0]XUg p/-A얏%b;gfL ;P$v[M./$m|[`g˖+ɜۻ"? g6Wg{CX֜Cz;j v}H`qF+.X&hbxtK"i|>,||\ڔýȷ4϶ERJ1֛EQ ID)>Ԑ#PK~j/cWE΄m~sOFtX0bjNl$lhBВOW, ! J \G;^X1=;c 0YtdHH3`$c*m.Jc-$Y4Ü>yctx*ML%ۅ Ö?6[W$/0}hu[{Uc΍] v+R4KIs׌˾ZbܖǽȷV u^1{Uh X1Y5<޼MMF Ż[>2~!&hbRV4~qа[^yvߒSZj0' "+@+/z$Y+1pż`O$H0*R>QyJL Plp V/ЭXH^&F` C\X&%qc{nX ,!am aq6ǏElĘ&`0wwx%?g ųRæaے_`~QZo-q-U5\ܔF|5p|:ӫb|,eɺm Edž%vp/m>ۙKo/Vecs{E_1_G>slo{;osHH;ɧN{[* v, {]0XbXB4~w"{oλg?K1%|0E=-TBJ|;}sAv.)؆gCq0(zPBp4VI!m  ],dG& #;;-NK 4 bIlEYܸHV|hb%5]45Cⵁn `[=Jh`pF^%=3Mm (~$_`~Qܜq-;VRsgoKW_?Qم6 ݊Rl:0SfPXbX>S4}ڭH*Os/ F=\v9=mq"?d\nsoXzpܥ{M@얏%b;g%\w"G@jBÌY7OI^#Oфƛ]½gT-!{v<%M7'3&(@tL9I(xCgJ'އ%Vع?lCDRg͋ -xv$Xv@z56l6#1@r+ 14їƄ VФ'4P +1bōvZ6֖OgNдY6 [67x.} | bQEBLM[S[w v3ɺALy:Pj_}RE?('|x<_NRg5)TE/0W f'jp YO@g?b6b|ۇvD @=R'[79Jnp/q|%)M_3Zm{e/1l 'Ag? t?$+ x4PLJN2j KU |` )HŅN\:Et[]G{ӕi,5N1 ; w=]j2ؼ?+r߹lKwL+-yکV$mXfC1[&vɺq&eӔM%q/?Y1 U|"/?+r߹zaKmzWZrDSwH\;1DLE/>c/Y_.r,v7si2Y?%fpcN:?P&XKj/XR-2 YΘ_ a0ftU͔y6zy0 +allzPl6/ |F~ ^*Xt"}#کa~dheW6"曋ύ,A\|/>9c-B ˸rJ+~6Y*?ߙ_Fm_ ⿈[0$`_ȏ!U,q&sEg:Yo$o&|rsb9bF|g q@02 HƘ([!"wW <½з~FؗV][2%4P)#6hqY Mv5]NŶPd ^_5PфgB=i[%}s>%L 6L0466g~o0?}*|e\ѕ\: yݭھ+cX.o-z ҭ }kଯV3NP^sMܰ`--.aɖaӰmzBؾO3e.ux~jy B,7 RI,I,^TD~xWJn q/( oyI{)"/⿕`~B';y=ݺ{ܸjy B, 6(ȕ S63pO.-}x}͊շ 0qF섐\.de??i qGU߃0=Ox|mbe k~}ʒFiEbO{5qprE?ψ'^RѽN#YaNF~HfL |8! s2ÂGg6 QmaX[MöauZ}|AZ7!ܷ~w4?)oZc-[fm)Kqw{]7ɱEܓlWctQ$~9^0cO>_im`iV!f#vˊtEQ@ iX#JJȒǵKoXI"V6sbl%goq>UiJ?,RbЅ,ǖ8CBp>a \Gk2L>qψl~%†a˰izl6Om_||>wlm&⟡fV> V#fVHcX$%yV?1{U>h!Az/r„@tЕ40';P^a ۆPS|>Z! #o R6>iuFB} e)Bk$tKU)ԑw[rhE?p)_ X0KIcyB0rN7^C:*3eѤ}JՍ1nϰ sƼI]J;ҕ3Y}T5@?WE|BӭMuR|>߀(BI>dH^$Vq>/v*wC  ;Fb?[|,O(75z\8AU!`g}&>lݠ'o^v?l-z$GF+>d f!m|yh`߰mɈ?ϻ0gży3?U v|Iy}J] Z-%/_\>I*ٓHE1nb.BsnphligoGI | |I[5~sIR#X]o#u. ވňɊ_وݞ,O, )ǗK >Ow5dZf'UэasD"N|ΝB&/>~46|I[5~M$nſyyxаd c'RF.nI}GJ%jǒF'V+XHcgL$CM"?Ūh)K 5BE%4m/ƌ~SS ӆ#>~4:歠i6l%}|>߀W3f@%sW HnUKy ^??Dvnv֟Xl1فRR^`f/$p\MN+my>Iq嗯yI&tJ{{wIsw"λ?|JcKmV&5'yqD~8`'Gm_8@٦cfKFH/Ih/%d@ӏ̹$0 >A}cG3z(ɷ,|Б^*qL}16.rzz$ZG|{ no׊%r<(/%-MPg0_9r\n ڪQ/:{<~|uکa)}/>>{-÷,|Бx~|r۷ܸǫܔa'yG|ynkŒ/ hjlW?[p Rr0bhIt ;;yI6gZtڞJfMu{AйEAQ0АſcH %m#iGspv\58Eȶ|n|>߁_kr߃/'y@E]h|Dc3b4>pt.rIg˖arG2wyH23'A$|>j٤t$؊X+ňɈ*)qQ< _ ߄Z6) """&+W1U@-c?l|lGb6EOiP"?B^vi v>NM o! m% JB9\:gXsnaPmżHݸƓE "WW\ [ O7Ha %ɧ[1nk> _w:^+ V"f"v""+5 Ә0E`cCqlda)i2s<}X9U+|.Yr.R['im% ?"w++X{.~gN U,|> _z-X؉Xj"#bsZ@ .acGπ_J&+t9F/+kĐ ߆3@lDad?.jD F,vE2mRK`-9MXZKIyJM.{ H!)v HNLzY.n|Egm?|h韖qq;lqF`bW@ J@H7-DEO}+%?9%K0N &m~l𢢝CC%~=ƝU-ZͿ|5+—Scc5܌E$|sEO4J1 W/+߁@?VRb#J?ɫ_xQ$NfQW"wQ+W3'd b,bewV]p`7-@'s@O]QERz_$-R @fN jOm1gN[bޯ=]HhFrX0 f[LoXNe oG.Z[I MAm&mk$_au>_O7U,|>X&S[xbnK~)X'\.qI"g'Fgٽ?6$, 3'CQ)-EkN Z6 3XNwF]lma%N n4mWĄN[=)eCIs&=Z OfLx!R+93'|13&<w}F|%rb`%ѧ"]ۙ'Y&6 W\)_1XjȻeB3lk(| >E *|.'E$|> _we4|>V &L$h1N<^n??s<[=Icx?p ?j6g"/w(?YL!& 'S #J <ѳ ԟ?!D, G|-[Z(-v)$ zR<8$.5U5 E޸Lh ,U0^:[ *su6Ճs.4ΕVq>QY^$On ҟ/lѢs@hqpKƽQWT7VQ&4hS&&6^o3cz*;7.tceK?ebjp訒߹ۥ*MbF=֝hJ6nowHQ% ҃dӋq`h#وiN4YWm@!9[7S?\;)*9{X|ՠqXh UyKپ& SOf8@os⛇R_?8#=)>"_=,>DL|M}>?9/n66"iԟSmD!c'ݳ-U$,_2CWRxԾW=X&nԮw/'69X.u|<(?O$ٖ*p/#&nNqB8߶It6'.'6l,6;JhL6ԟXf/vH9F@ԛ]za:tظ]^|~rvX}Z]m[cS2m A=;Vǖ> \gKƙRqR^l>X}^Vm[cSreB0h[c~@9\}sOԔDQNWO#(`^3u~dWLGI׎Ĝ憭b~+nSAeB? 1of˾NF遱jOW-:\;Z+k w'30?PqK ~_>|k-JmBg} w'30?PZƄ=ɂlx+ߞ;*=V[Vqrr/4ف' Wd7~=Mz0*]z2 v`j ![s :̗買0;0? jIs %ѥzhPP,K7'oI@bw_vK. ^f 6"d௯?Ӿ_b&0O/3gl?jL F}B/W|Ub7& H6 wV_(_pa>nGMy?"x?(@?;w })oYntq&Qg)_m'Κ2LfnO΋M4~꟥PqI&Q)X[Jl%;%!fuۢ'1?ˡjcW`o)XՖ[}rIr\oh~*xx`g9_m2ԟIB"4⢩#}7wp~uZ @SH6v @1k_ ; 8\ii2MI}PP&Qh(Rb "uܒޢݡfSHCW;Gz? ΅z-I{-U7?P@&Qs\*T%n]€a[N:]?s? _mo KE\ig' 8'HU\KռiZF;֟ 6g0Z#@l x-icm>{XܳRz 2n0cOWt7xF8;w%^gҀѝvG"|rUjZ)=V/w[4458cIj@&Q Z& 6`~d~cOWt7x?bUrKxB]`l nK  'w? _m!a6?#-݃eIx /91\&mhMM8б$xPIWS 먳6% 6%_p\<ź}'w? _m! DćG,Ix HU-f iTQ8֟6v6Kٸ"i/ar9uhEChjؤ{AƆL(HHpkk'SK-f9Q_#":B(F'[V6 IMG-3_=8 ~p&em?{Rа]Mrk7GtQ(O zD8ײQt63$5M DQyNeK){6΁ qv=1:R-DXL].>=^!KaΨ-+G43*D郛aag Wv);'Fjg|Kiښ @N'˧quvEeH Aџ B L84´tT CuOOߞ;lxa.O'H}sYN)uz`5-6N 9X">!}{ZK&F$HP8;ngOSM?(J~ -A][ukc/}FН/=hZ擖]U#0,?4޿a~N9}t]L#׏ZΆ?P x ptMeنB0Ò Q@:KpoUAН/B%2:~e#0,.b ?$=f>d /wll0k m ݩxr9R{/;6,5_N@ =Ǭ?$Cw^\n]4Z 7`j=Ǭ?$Cw^\V'M:'lBq^>dН/OkSmwJIGC>Cw^|^:~8s۝RԿdB{s @Hf ݳIV뫦xвSﱖ}LA&lg#@/~xk ߯ @Hf ݳIlU{!SV¦6*Gozc{PeنH4#o&ڿV|{לPYMr };@h:kA @Ha G׉GQ;*`;5d¤6/k^m+4gEa Ąb?^) 2aҟx? @x ĪRjd¤?L&Q&BL 盙PX4%L33 DQ1a2_j ܁8*ڄ~|Y܁ a &BLwNR}\AF׋/NՋ.2_{xM9Q &&L 7NR{Rq=VCݎNkωJ0@I!&T e1 ҏ+ }tI=^ge`@m”8߶)fs-WW;h{>7*!$L0%u1˥WSD?$vP0%\:c(Q _ӌ}"MO@ ;LB@ SAsej}WK5c;@0H<3Y]1]WK? gK5=:N@;F&Q&BL7Ԏ᱁<&>9S1T-Oa@m”8մRܿzq~Z1w1moOa &BL֭ӓ#Ko/ߢ1ic g$Lz= 8tv;@ gEa Ą1@]o-e0ڄ1@]o-e0!$L&Ԇ a@mP&Ԇ BH21L [Ԇ a@m6LB@a@m8PmP&ԆCՆ BH2Ty8Z+ҹq^#6?c;6YFρEuVo':?UsLBs3g,~n^n쿻Ԓ_{~nT {Yc*~Rn?w2k=sLB53&ZVM~n^d~^ޏs?d`e&vn!=0?R=~|>'*!$LM LB{ rо$Gs 0@IF 8IUT3^>Y!#pyWގѽyn4m^o|i}lq+,V/vtHALvN]607ڬH8X Lcfh_,#жX7w.;5cvxԍ\-yu4+,V{8:$ vN]6|y BHB8WAGi̅%ImkfJU'WLE8n+ MY@xW3HʵNo:)0ݘg \g.s-YY:c"Xm0L0ln{~%U-7e 9`o$o$ zu8H?viX]>K2GZB{m!$!X w {f.,r8L<6w;yA VNizKFusl$X^?U6w8!)J@"=s7{yFŅϙ ] gvHР?{Wne+"¼B6$i dc6V6Hi&&hc87G'$=U}v}V3hWB® T[0@Iu3hE@fY}0πi ζmndC"I?^SѮqm*ϗzQQ%Vf>vi2M*`n<=m K,/r )e^% 0׫k@|*N3n1`ĚY!$i%Jo@޲u(l܍ }$.;l p+n"[[?Y (X&1nVe_Sj\ wne􏻱aς6n%p>\M#8_%BĪLw0=dp HBk` ~K s#FOۆ̖jdY: b Jn"T zvD,١J&6S=0E7Wj{cx4zb6~a*t[}ڽǓ!nN*,!d* hm">p3` `kZ` DA74b fO2_$8Sİ@\{hy sE9Rң7̅y܋~酖/>ɍsm}IHdtgZ"ÚɊ]Tq$8Z-İ@\{hy &:OT-h(w2"'Oy.9!$$@u Oi?ʂh̫c|0 ol;#:9ҍ{ ӕJ2KlPFf*uGB )7î4X C3j@@R(20 .@+_^~ʣc|0T {cr~϶cyֽ'Qq$qTّ`Z"0V30P{zP ̰|{9vhq: .$&!(Wd0>Zhx0[tӓv֎ 2ZU3-X5*?߻G_;`j/g:XdU{Ra(9iD4Ym1Am'j̉T~j@uA~oa h31z'q0@IFF = ɔl{2ʸW:{͉u˷.}<2y&%2?]FNLVaSL^^L@&`1+ͼ$)Nޭs}SQxxUa2!$'Ӏ x.7yJ$iSt9 Jn5_{,c`\>y;wէQT2&^UGSr&AL($dk> c +N @ Z+'r7sT?tw8Ȇ!}~gczaߡDӭ$bI%mxП Bŕʰn͆` bdkD Wn/ I_ aݚPB_a۩l1[Pb(EV`6m4@ML($VC޼@7j wbad/( ?yn쐬2t8F>HP9$n; L='`Ֆ|}0g^lM`z^pDeؽi6q/6sHW; d0k Ke' `4N+MH0@52@( `jP vmBU{+p- L(& :6KfsY}6AHt͵UB"(M= V`wdiOmAHlmϷUB"&!$`}19I745SBno$AKU-yz/=zZ$ v=ޛ̋rO?( |@Ӻf*`7 ΤD4[+` QCՆ BH2140x%!LOO^h|>`0QK<UP DQ14s|LqzqygQ1q;MPa@mhflѸ@/J &Σ5!@f`ԟ? @xf`v;JIՆ BH214jCՆ T6LB@T6L Pa &B Pa@mhՆ d pY,Amh mM>ڤzaa$KxV,qƹ;,ZB[CgCw^ڤ/;6,ng.#034~tt@8AnН]Y>U4."&sĞE͂qbwxQ_8I^6u~9#0=u%hY#=%θ~fEKhklN 2NsSE)bIb}q(]:IlҾU{{Aa!G7_z,A㣓c⌯h m ݩxiWFCŊĢodɘwEfГ+ᄑoY;#hh m ݩx&~]Qp(;J&N,JɼknX`ؖ$) ۰BܣM#0CՓ񻋭҃fb\YcCwN08a(7@/q^4jlkfbAj}GpVsXi\:Yl>\,o?>xߖgNX{GV̓PC3[VOhM }lq&Uie(9\̟>T/qelr3yQb±z_Tm@Vÿ,t57MW^vmX!zzHXf%xRVz`0kߢ+9w6g>g_21߿sD^!45ֆ^~p*eb!h\WLNLDqx(Ƶa0= q-i:-?@,Ӿj v͠Wȑ¿C2N-":3>Lo`WAo +ˋ,c{c:,ldhX[8A^2^Z3z['EֿlpWuFIlHD{Aoy6 N4<޿,=VP¾pާN0LQ^ųGD~GZ,BSC_h0Xك ,{m)/"o?_6:s]qNV$ `C&QԿ>G^{%;kz& χߺ>$Wf0S1u4M~,yOw+ r%<\&=20(sG!bYIgr#YmQ=W 6OA-r6솥Y C刟#shyhs},`8ԟ0?3@1?g).ѶfA4z, *cf8W^`Ѥ`xkF}ϋx GN48nC_nvGtC8x[#ၞgr6</`uuOfF&{gr= lN8v?-a| 6@b䐇=1 2\ I{wSM1[˜ YTȸ Z8|=?s4n$kt% aXYg Ս6J7Lˁ1FFNvoxffY4} }n$F}gگ C3fGhSz{<cGʞ g04~GcntY}Zjiz_| 4V gxJ9Y6)oE?]3d9xZG?ҿtp3J)D60b76\8_;Lq5?P?؆ϋvʄD7_L,%ܬ @O{c{/{-@R@Bv5-Z}ȝ^DρoB9S{Mljzڢ4^G5  }mm\LxA3@bD^<}%(?@7yOeKT3H_qyr8z26[:yE_MO[ٟ751m}6A%uiGZk2;oW=l$ڌRǺk(2MARg[Zh *o]lg7t2*(Fs+ƚqZ4{:xRVG;A^knhoZ_OG4MQʤunyYx<- fm~\e @Sv uYB"Fӳ= sG)tX^_UqIb z~fR0]F,sلb͔ 3JOXcidiA?z|*^khbҐK򠷭6a\H[xZ憭1f-҃`UAzG+, e_m<ҟ B!MQ#y)P*Á ';V i/܏?k3J (-^nYڢЇUcycE˦b}+Q=ԟ޿3ţNǬFgfQ`0̛6D)$jJc`eE? jBzK\=]/nu%DcRPB޻Vt77OoY]b~)W/ۘB'A?4*/!z[ϼqEwݶ&dʮwߍ{zl_| ޛ/YU)Mc Db}QCeB?P3ETephqb@9lkoueKE~~_6_3ʅ?? P & K3LjΕVrظqᨨ\%f玈c6~/ېBaJoS&bk ®-vKVeWOĥjQfz".ԟS8?)3 ijUrqNܽڦ/?>3'"1}ҐDR@F!_>$PQ1e1X1{(ɛ@L,5N,&ֹy';J |QG?i_x"rFEqb0=u07^>k_!?Oj|GZ1 `}^z'05??P }xb+zQj !D/l>8Y^8"=@}畧Ű7^&3ꝗ{=qV yK@Wl+SoY1cI zeةZPSBzX#^w⭗"qx{x\EMtMH漒ma@!XX kS=ea@!XXJeݐBˆem ,erȠB6ho|`YYtB ]-b,-A@!XXe]`} Xt> +_&G€@{KCe´6 Z  [:u&L!@!X__/|*i:Xt>kKA\Mk·`nMxY!HKCk·`f~-𲆠Q@KICFx9C,%!X]_V/#o?t>pki4ut|a v%YMV@":ұ~ZP$00`m8ZKf&-Kŝ-(@ֈ/# t>k5a2 xe Aڌbom\Q `"`X~٭h;,R `5 aJvs_,Vu)_f+>~?0 X٥/4}{ uX-eea0=e  `Xƃ3+ӷ6@YmL0hz)=/MFhYw e'_/ƿ[aX?3/Cki\ fE 5wNz^4V#G,Vùe`V&8} xg PpV,'YKdwifFB@-Wσ5#>~08 X?C~Y4Y fAKwz^3N_Ъ3# `8x_ =ƿnٯ`e =@jTV,8ؒ>P V7,,р3 F p%}xG6`t P[,郳/1k6} 6d FX|IՌVxG.` )# `lý0f/53A 0,l$*?:/6z 6f Њ̌  `%y(x5n.я6҂@0F Ӓ< o4p! 5(Je8.i6~mo{~@R X#-MiЬ kBdgaNQ )H`@* zg2 `87bepsMsM^G #@*Ff%-8&/Mh [{Z߻1 @Jz`N)@@3x0V2ѻ}svo:D?z)7203*0 ,Ź ߻G?k}Sw\1X?I3@@ fE8 Г6[ s<!]_j>g/K _b?y@AOthE X!Xl/Mf6]?/t/K _j?D+I@Z00"*p@`F4 \ƟY_31._9&5Q,p(. hg ` Z_9a9?u Sw1yy? M`h=)jz`& %pr XiM>W,4~njR×|ͨDI=@@ H BHn<,΍4R{Lçl $P@!ЀnT@ V[Ź&+Ʈ6~J_j=O5͈R@hAAHa$pdsLGŮ(/1|SM)F/5 )$P@ REf40.0isL)W2]0ɮR5ZosO猞ko/*\Pȁ$B@-=@գE8?(_ovZSFA=@V \T@z 'qq~I7a ̿'߯?5O 1猞k?[u\Xȁ8@PjTZ' h̔@.`'݀?eOns\o9dSKz`H7:@ 1pZVqcOV3ސ)~jG1~jkOMd\S~C z [h̀\J#OV0|]~m/S;frP'*PJhV4`@Tǝt4b?_4n?W>cӯ=sfRJɅ!A RT@4hvVq `T燝pj]o_i/1%Ɵ++k|}9&R(E (@P"Js(  Q;u v&R;} kQJAgSa\ @&@!IZ 1'XvЯw_?n[aneRï}$ P  @ =HЊH W ,Ώ8:SCڻ~mUBӗ~9Όޥs@!=@RA0FE3@8?({=E%ӧ~KO1' -8H%Ԩ@/p=)@Dҿ *K}s c1;ѯ TQ!! Ђ6SZ#@F4S@YmͳsGj'1\ _K9}s fs~p =@P\({F4R=Bfq~7*OK? ks}\_KMkS >g}ZP@ZHhG$)Q8m͟OsB ҮVri⧚>k;׌=rK`"H rрZ$%ޕ:=p~7vWk7T'vi!k;ٷfe(P VT@Z#* 8рVJ T@fY_9{C]-ܟܧenj᧦>kFތ~ߩrj`PZʠ@@k$-PFB@& }wU AjkݿpZPPU zsRۯk/1ٗ̽f'K@.`Hk<ԊKj}@H7 t݆zuZ(ok?gpir_m94O1̾eaP3A j@@fu@2Chu @@.%il5,KC\$O&P3Zj>K2Sj`PZA (]=NJRc 1r?)m~KU?5ܟVJU~._9\hd%Kf>XS>=hAA TAfj5cr]@^G|3jb?jȿUsvO'N_b|δ?կ^}w[Ha R)Q P"h@@hFZ3-N@kS_6n? sw%/c_{)^B| ,|)H"4A+* hS88_cK-G>i?[\>5ٿ|$/?7ܕt W_AA  ԢTHg FGrP XfN/}`8SwsE|Ow__ăwYe`pe . : Z-F$( - , D=@k2Z],㯵rOI޵6ɺ{)4Ap6P;FB@})eW0*5͟a0)4h w"T P  QЊB`PCE̟S/1ή?gZ/?f׻{/}-`MtҨRm@-02PFKCkUſFVZ_ sw92n?k>}eb_67#{'(Q)hFJ Z]@/` 8_?W3pn[ki;N?\HPRhE89ZN ]/w|&-C=~w:573ʧ ZiZ )P#E!RTb*??5/5x([JiJ4%Ci5|izͿW sv5/6~ח}@@h *ZP!Q ߾/sz[oe?v%YFŧLVwˤ @M PP&(̵@VgRK÷/s?gq_+w@JрRD . ̆SE$>`_4ΐ v9Ow0si4 xV4 77'%0z kEzP|% V s̟4V' n@ 5%-I Zwja (p! K пSʿOs]jwZ}'u୮́\}@ Hk½Z]") <[*p`KE#}{ͿUO̟o҃Ͻ GK HZc)NG K5 BҼkoi|k>-)A*H; ΐ J=ng67m̿UWw׽C4kGj*03@:$t?͢?k;%]|C&/ E[8pA?ݿF?EVN(cvoT }.{ F 8Lb5o?SA>._p:J4T v 9ZӁZ=@+`f* OK5NlF0C3 ֆ\=CD.S[jiJ_W#M^g>)NRKgM3XYSC{OͿ|A?4WwzJ`~uPFN[x8_Ơâovfs~XtvxקܿfTs @+P+ H8P4g9 0.Od篝e?gOjC(}x3<( H!:4(ZzN$@Zx(e7| ~ (E=yn_?,{}/Cknfp 88 i=@ZQ kЛKfدP'xCPVBJwܣV.SzF.-wS4Ci޿V1vO]rŁ#! 7#[*`(yw?_JOhǕhv_ u3! <8T kj1Dh^@ YZcó @(pt*/ s(/Q/LA]H@nb` z:pzT: p8/{_2wF迖Q柛JH  ghBV8 |(0e=gT_/SNRvCݨC 7> Sk$Fh~>oυs{CEw )~"Gtd@@  Q¥!"P:+ > p~kE-/`~ =)TP?P Ш @0,v^~f)yUm?:N L@H WK`ݿ叒TS"Zt@kl3Si ) p4-a镁)1$Tֱ ?n;s.s-a?i_04_C _7 C(逴3]6tT@N$Q ta?BC~Z^RC~ ,ΰđ\{ gHP:`T䜀CG.oL ׆ҰaJJ! PR=@Z (=2Txm[qO퀟Zz?rP* Bf*`>LK04OSr?mO-?qu|D~ zPKTe@ r؇kK0{\ P)p/(0@@nZ 3ZK) lK j8)o;ZX!hŵ;r! B5HSԂQS^w\)COA|Tu^@)S8; 0j<(#< N_._*P頟e A;ޫ} qRmtB0$cGi9yk@?un(PR R{G x! qFjMkUS tr* hXKJ)#^ /p.^K;G) saO_g_t=~z` MN Q\[(!AfQ @FI ܿ$_a?^{_t43\ j* IPO !ĉ`DpvZ?A?i?S<)0n !X:5 L% }0 k9 ?eO0N~ h!AT@+* j \) p.Z˚/caOO -y ^]Pk SirV@x p4} i/os >Q#EysT@+ >+5vN(@` bç[r*ϵv߰ AYFT@) R-@x-*I;ӵwOSWʇ$_t2URj EZ@ie_w¿x?-*f* n S@QR1`F1 `[NJJ!hRR`Ĉ`IbD YvdDž?!h!Sn+lE҂@n@R08Pg{('m? e$),jEZ'j02 pnzZ('Iw!Oi#=^|] x kmQRND}8폺'3ʭ_xݖ.]0!pd ]HX┿J_sw?O߳G"YA`+ qF@) i j9b_/3[P''/|EAPVtT$ (@錀-@0$UiC{KOFA(v8$0%Z1WaBV-@:0\G@+ )lM  K[ZJkA-N# Nl X8EhV$[WO`AI) \w& ŀD!V`?e_?vNQI@j1 w&V1`OD+)ϵaA'QI! @ r5Pp0%jk?[(@#X (INUk@+ {i#+K5vՀ(@n.@Pz>̙8Mݿ=Ӿ=͛@8)7wr;i Fs'q uoq/mb4 X+LQi@FֻQ1hsi'aEWϱ}Fd<0:0(@  T#hc97͖3=5'_k?׿EN:&JC(i:CVmOw)Z^gufy #+ou__ڿ?bg?-q1`x=0`F?"hW[ܿWh_.z&\z1`hHm<<3@pFOw)v1@ҖbL4  @3 P:8U!`fro/)QO3t EK)i8 0|V47EuK՜K>nyKop=+W (MH:r`F i?@ooUK}31APB^jtn"'-`I9wɀi\7@8GVѩ?ˇ{ 4f' NcIyGN;,z Ѩ?&+z?wZ4z4Q1vvDp- 0s,06iv_jN&Oy=u ت1@ Q `<:0kЈ/U>,hR:4wAiS`&J퀥4pB] JĻJ_K_)k8i.4@<XJ : ?z?Oa4k\y*~zGe `d`Oߋ?T/*ֿF9in;`n,0p <3.Set6N! 0Qif  h* j@+O?̗v*ߛ?zKB7<iN;`Z  \<X tj4`?f/!Q A8$hgHHЩQRi-OV;]#A}_~HGH@Z8r" (;J9=D̈́=YVgQRj(: ?fэ2љ2dÓVy.@\y&WB@AG` @oЬk@s %I6;0+| 68Dg `nrF@9X07?_ ͪ 8W7Tk'!@I@ K/Xt(`E @-ةPhN,&=(tΨ`f0_`; ZgH;bz@ g^;`2ruP)a=;`f ` {=qY|P[ڝR^ ; `a@*-=<߿ҧ_6g&Cm hl h&}*L(  !@iE8|x!` NV֡@T.{!@$-[XY.N3zZ5@k]V _wO%sfhҗ:@ q`7X~Q`XxޫK̚i`v'VfHbfHh\L;44@2gϕ[f Zi,5 n|tZM% =YVgT0{ݜY#À*;bfLվ{^^ К %48`1\;!VsO\,a[QCF1 C Cj3<`"aft1XmP =À`9XH3LT{ `Ќ1PwHy1;I_0UD7ra@WizZ@m hտn`ĵϨaߏotfG7 0$@  o'\$cS it5?CG\Z{9c}0x}6@_y/^Qzt0`r@cȉC#S!W88w`1}=@gЍLa]@hD`t?hD5x 0`Ap;b1h9ˇ}^@GWא1I)< 4g5a:-^ZQٻ (vk I҈XQ ֿPMTOGҗ\|_OMZ/= 0`3@X@%uC sd jꯇ - 8 !Ҥ=oh:_v_P2wzov`?g7\;VIW@u4@`qJW s?g?\y_>dr hm{w</ܼ~=FumnP<xW[ _y/ Rx+@0 Rqt4a<AMG{t4x@<(8 j4X8;u9xW_0-{]xq+@ ?RCH0 8`.` hI @xWJJQ 0 >n  %q#?j%$ i+` <f\{/}%AКw-x@x%H =0u@ UAK HHkv8 (Z0Hk~@'g@nh$ )p~0&*-B@ zs y%AК2L9R(H @A#; p:!".A@? #BiyC Ac?51`@FcXaPmߘp_6-%^psfdtuYʴPP8 `ya@\3f {1-N@jG<`\CJÀZ〵@ eAZz}v@,0 |ZNrP]_ {cӇ HN A-zU VV@ ZwyA704/ NFJ`Nֱ~K59RRH8&j+< 𤣝 B@*3X j h@ q!B/u 7 34@0L Z %hjlJJ!`:0xiA- ;vju:b 420/lwH'rڥ`ȮM I'@uR-^7&_*Xs` 3 Ъht<: yt^EnҵO: +vhP<6sX jGKN*px< pK4A4U7K!O_p9H:Z#yTXt>E@3#W8:B@*1PB: M_~!A4IWϻQ?Rx<  KQ^Mx`:)[ f5 Hε" A'S!I%W|XpF@\ ?J eK 5J@@- =tRM0r P uv@X`rC * S,P \<Nș @t`;W#/m'#PcKi A'Qcv0 :pu- @i? #]_+V[wprjP`4@ /+k/)gI; :-P @@ wPԳ0FnTx8~ u4lb1/ z@9G#?2_{:I+MxB1 AY ,K6*uЩ /'4@80H:Lc??\c r\Ou{T(@/>m K~§Qw3?(ȥ8uZiPMxv(lNDK m6/-C=pv@ H(LAD_?"zgq? HV sTlRtDpLjK ZIwiklUJCF>(\?# 퀹4@bŀ@9Zѿ-FL D-LQ&" A'R?e_)/)=U"9f3BM%0;QF8- : z`h`jK$ w@&RKZ?KұQVK< rݿij1 u&@tnfx3V?g?? B;b|\ gb (sn.j\?\փbP2R P ){ %\kk'GrL @-DjszIש@@|Bv[J 9OkϹNRpĩbCs8/?tj*F3/@:d0?c?@Qi-(@Z WFB5 BI?wsۡ?G .BrDp 4u N 1!0ZGSF)⿣˾Q u6vR a6/+3N?r/{}efiҳZQ\PrF A8{[r3T@@J[` J[Xq\֋*,* ( Hr*ssF=|rPM\9 P:.SXM$  )5 V\77 wP)\WxYBС+_j rmVig?@* C@ Z[` ;T@8+&EyrOCkf_5/Źx/mF(9]h QQK\?e?MN?,p(p\W9]! @I S)П݋b@͎Iq@2" Q8j /3xBЖOx\OZ/[NӪ#iޖ@(@R -LJ пTrjk_vSt/ -Nw¿8$55(rmZ+ \k`~>;ZP!h=nw/kkm,m Ԍ)T@ !@n tA4.kKo0s2v @@R ) Z w]E :觔OrB¿\_kKp?@?n H )lI=5`R VZ8yʬR5 'ki 0* Pn`t[ 5TH!TO bυ]/54smI(\! *ZiQAT0O/?6Ni{E(GHSAi=@(0ho{]_3Z޿'9d8yXf LD) z@%j-k Z#SNBE* T:68WP:/ Mĝׅ茺1Z_[2𬇝?eUQZ=@+ 3!EZyi:FO@gRͿC~ԁ?O|;/x`(@O* - |R:Z Oi?T_u?]@; 0 0 B@hPڌH@W!쟛k{iOlqkZqV@C*wHPrŝ@ t(UvTPV3 B@. 02Pj  Vȅ0':\kE9oiiߌϙ?vhwP*LP Ҁ ҄Rο9~fGcvv ( 356$ qQ B4!\uuFK}).7ɰZ˟tόv=qA`T@UXX H @H? G C[~=;P*k'?*4vNPJEzXazpγ/vjߧQ7syRȼ?'/?> 0b8ЈTTX0 B+/>柎mC~F5p(v*H) ^!ޫ}@h-mmmԢ?j˟VȻ0 EFz V]%T.+IͿ6觧VCtzQZ=6ZKg‹-W0?5?bvG˺  ` (ׇ <_ ]?okU?v(E* @Zm~0P!37O $W[ݯwO 5V^0395pTQ 8-^?9Sq5p`@Swq.aOjEԪ GXԦ( Ԇuh/(@4P @}twp./ggd Vv!z֨ !Rj]@Z X(gpiןQ5͟:7?`:p " -z+ErBd?W̟{X8_qTZ ԱjJ( Ok~nȟ[';9EVo [0, 0 ͭ!C\80@ Ԕ@+I ?Cł{"?O!ý^*{[W5bMq́?U*gHPoa`\J \4Rw PjR0fA 5pOR՟j񱽩sz)w?.k>?nBRqЁ?*,3!@#Л @ @(dlKR_#oeܜ !Η:]9Nw  Ph@> H@! %&x>]} Ǧc־tr]]?s`!PZQ?>j j-{oUZj!i?On4Q8 , jE Ќ G)Bݾr R_iFf?t?[  |h(=22wX )n4Q bn;b~niBҮ*?[8_] Л XFh@e$Q, u'0]Ogsv߻/iW2Y @@+ Pk3[]Q >w~I_|f!G7}ns 8bY_j. ЊZz 5<yI=vvv0l{[(:W#e} fET0 ak>u)X:w^dӧC=gԮ_b%Qb2E^-Η?&Lhtp 66XC %jj ( ԢU(^}ڛ5 ]o7G?#S̾e~Ka~v\UkWde@H jT OA R09{*1X7 ?gӧG]O?p\X vڜj@OJ@Z@R5* it90B Z*}VNeܝ>%r\KBJ06^`N@+%@J4 4R %*@) p WOSɨ%*u䮳f9ӏ'v>KKJV p^Ji4ԺZJ  Ԣ% Z ΂\ \RX]>WK駻})~?g-ߟ;7kW+(]eqt_"Łܔ'-P@8"@Ij0Q`"gv5o>sV?C)y~J_0M]0P@IJ)P )łܨ@ @ЂR ThS%2}nZG)I !se#˅PM`4pzҴ6P9Er@Pak}l%ï))E5~i_{6JJ# Y8pdh4@P( R-(]>BC rPr[ї>WSLV j]oH]06ð9u5M pAg\F A YZ5[O1}n?~[~i?f@.pSN\Zj\$@!UθK}Nҝ}쩆/5BTQvr3TDPf 7% F€JPA(УJt%1v>0"Dr-jJ @P00  `P Qߜ̞jOg Ͻ`87 J7]? A 8@Ђr^CzS~Kx?[~鮿7_ @L P;Fk@PA j /1|v^_#B0#F{viJ@ pkaBz @ Tc|lK k?efkyѻ~J7bCB@.%  RA T0Gd9>}Iq_o_cO a @ Z..xR=0 ),Lf%/_ od K{W1@ BH@ 34hEiMH@  `Ђ ,PKf~);teڮ{/7?z;XS5  h4@ [-=Fr( Jpj^3̞o~fOMυv=`}0.`v4h@.*P. H 5 TqkFaӧG/ swԩ~0@IBd0'@M H@>0VGjjPA 2>6Rd-/Lf=5~j}XfjRR킔@hit:h鵖v=|N'̯iptߨ|nƣ@@)@iDj H`YA R0(ƞ3f_*ދ cݾ=Vo?13Ź &ݔ+AȔdn>B5EPJt)A zEk.9^ӧs|5C0%3Ź&ݜ0+ PЀ.ԠVS Jg-g/ 9ƿ毰=PYbMzЊ\`+=@MP- AA jPSk^K7>S2sB0caFg*scLQWNJwfj- T 1W]Gz+?)VoohxÎ.hfD@4A 9 AA JЂjOo}l]>Gkǯkae$o\+J  H fDbhA-BJp`r K ?6}~l~>3C0ƲLqqn7J]@.*paEjPP$RZמ5򥦿sw9.k0禙x#zfhP@@  @A (p$_k5}KBp|/k0xC f'-%M %0jwMkj|SRӷ2~iCK_֞ ,M4^n P h@/䠠T@5c=_0>&2wi4@u0\z jp@MծvYbZk]?Lpqn&}$  Ԩ@.E@ hA @]~!~n_w_L@Tov) PADZ (A 4kv=\cO\֞ \o6hEz& j@/ @ԩ&_2z ç%iI~ڻ!=870ze8NA (p@ռ\w>[!~N_j\C˛_֞ PZABU4@HQ |A 8,]so>w5w=?oF_X֞ P\# RFZ`M`km9;}nw,k(/g`Q)K ` 0SkTO j3w?+o,k XY)0[`vTpRk/RçggTi׿eAs3=,V Fr@Ђ`$,Puï%g.MiJ Xu@pfc%1|SwBۚ_֞ 87óZ4F4U.hCM1zKCZoegom~Y{&`ܤ,4*9 聂^c2sv-ӗ{]?LŹY-H(`^HH\/)&3Yfa -l~Y{&`޸j@'B50șXH^{Me1836~z `5  A-ZЂ^(5}nNb?`Y{&`qod㇎ 3 (p ";Kߙ[E|3#!/k- 8;`Z) ̂PֵjH?.k.F+- #a@Z` ]Gn63=`$7*рX( +X^kvnd]LKr/R@@;M 􂀴^% BA 4`Gk~h(>Oc~Y{&`%xP)0zQ)@(hJ}_?"?:̯e0e_B*  Ԁ`ZALU-k,$X@ $@Ђ ԿHoO2~w3.Ca kB @@|\m#eX^ $Q. H@QaF2|]~Gh7=<$ ЄYP #4LӇ+;e YA_f`$&m!#??Y֞ dIx #`@ {j_|Y{&`%}xG%   k~7 >3.`Ѐ kig0~cY{&`%} 0+=0 ZצQ~Qa;eWC b̈ p``S nE3g6_=;̌ GOj~Y{& ~qh0蹆j]e41  $;a0LV h00 Vn0eއsH @6,w3;{قOZ֞ 8}PxьU"ZP$h~gzXJQ`,o3'Y/  z=p0@V+`۴lb\֞ 8Rz_P;@pdng2}5Ǣ-ktiֈen.te͔Qֿen.>HL?^fho_"n@ c_en. +_ =@ - -Yt|Y) 6 8!h/fD}d}B,_͖@ _ k`4[A+ڤ >@.62fA2]֦wFYt_Q :/AǕ@4^0nR_AAe~A͗@A4_AA|_AAe~A͗@A4_gIENDB`teeworlds-0.6.2+dfsg/data/mapres/mountains.png0000644000175000017500000020543612140200333020367 0ustar felixfelixPNG  IHDRtEXtSoftwareAdobe ImageReadyqe< IDATx -]ޙg~[ݭBV%Z HBXa0p 3E#a<=c! !&36d_w{ϾL~YU{9dU}Vw*+++_^g"!B!mB!B!!B!B2@]@!BHr=R}bp[P`[| @!B!4d{lCϦۂvxm࿺?_#َWG~(P B!/s~vldvώ+ <.Ue{"@!B!f'z򙟠J+@qM!B!cK]8"ڛ SanQ@!B!$wG{=&3"@`@B!B/HTllV!{!B!?U5 p* |mT'B!B! 1<<+=O)=H %0B!BEۏg4EypP{dll%7`8B!B ^SOB!BD?<!B!dw ' @!B!$d:vB!B!*gB!B!b7P B!b&I O~cIYev!B!dpGW{\S4ORB!BHTna_L B!Bc[k?O!B!VQlӄ"@0!B!8o߇a< B!bpA-գzP B!bYTB7zO!B!~^U*E B!Bb4'9iƿ[d.~]oA!B!'|Nxܖ1/7e"B!B!)g`eeY~DGd{E B!BM]>)(K%P@B!BHڌ̢N~*?0C!B!edwlwR@!B!$"+/ 'D"B!B!S(zrANX}(B!B DLBHf~X-5(P B!xP*13!e{pR@!B!_koK}/ B!B!-;V! `1ev!B!\-(Ff>Eپ[61_W'?͓AB!BhE4 ~"@8@!BO? ݮP B!1ǽ}@f@B!Bh@T#-i B!B\DULB!Bb7rwsx۴`B!B| ' MM( ?LB!Bb5Ev6`NY{7 <ޓ@B!B_j)Igx^ pB!Byl[= xRL"ϲ)B!BH6^-=m*mh4."b8ѻzZ(H&(n)'# S4B!Bɹ}(.]ի_)B!BhFu:O'@tS!B!!5Adg&Ppxnh'as5 B!"wyr!E h8J3KDM͒lo@!B!:=ȓk*{.^.@!B!c0:@B!Bm)ۭOk B!T@A>]@B!#e{YϨVTF B!v>ʥҙCym7a!B!y^5' ̗Y8)B!B< ZrcN`P,ć>!MB!B0/T=6ڙ?UxsHS B!䀀 wX`2D%ǣqݨ@!B+7ȶH8[ gaH&5پC!B!L/zV=kli sYu!B!dEyq|``Ҽ1Fm B!2fWgv}퇣\ ܟ<!B!y(/.`4=.S1,!¼Û!B!xōz)vkAܞ۷V}r^(B!Bz`t6@׷r㥲!NB!B-Q^<UtM!B!$fYx/:q B!QߠլT=N:v vIy@B! }ߒj(ΚU+ ?h2(B!Bm&ޤT,*`^/+NheV;9)B!B]&.FV`ljr!B!X͵uUBz\^vB!BLRٔX\WV ?yb!B!a}qc'wUeQ. P,bfm B!b9aD W8iwE7P1>)B!B!PJ1uDMЂ6r tDHLƙ B!BqnkC%KPtU~4`Uo )R@B!B /V*3{bTP;=q|m}3@r6d{a&B!B1 s[<c( n`0EoNP"B!BE'ۗɚC>I{Te1Oh4^thwz%F1gE@!BY0[t߷vۗ۵j%cL`Y#AIHbBqy'w _F tpPV`B!BJxӣ;{O/\8 n(BA{H@% 9^ ޸JHTʏ6G>, tErP B!w^j?yAL}F])a(@O6c+pL6%1ZPNڢ\*٨=TT~MBlM"C!B!i ;]{O z*n颸)֚؁>mzM=v~kCx9q͗ĥ D FzwNt@ Op8CM%Ŗp B!4 /}5rj"n8-6_Uy j5qܦֆ|jKaُkB! `@FӟA<IU+Ə< \ُ,0s8iwz--C!B!+!`M+ܪa{}eЉ5 ^>LB!cX^:IcSGwa1S B!$NKvq~kC\^ol3L$pa{Sa Uz1gb| '`뻩L _ B!B"`ɻ}͍(Jg6'@\`=~ &_k5N$:7O\?pyL'/{R B!$ʛ{x .!;F] _JS! p~ăӟ=_./Bd_IB!b3T+/^_kFU+;0򑩾닁Nxs0^ewdB!BHfk/p֙w1=kw-N]%GcDQ012 kZVxUT!B!$Qa5T@L`hN/ TyB?; +ۓ3B!BH4 O'N-^y@֒¸G? N/w#7Fp!7}?!B!D8AWUqǓH$0@nwտWa_]/>Cj\?㇭8B!B,K ~"CQe_{4{<)kuf@F+(B!BpJ^}|)ѳtoGFpsR)[al8 d9V1bڦd`(Nڢը+C?7 @B!^{c6w_0 vWEiQ,U" m`: ֚e @\"B!B( W?¥ ^s`s(XRY*j.LrJY61Ƀbz^'*E B!P](T.oJYOiWelDu(t0 ˃ $T?+zp<iL%@!B-|yJl͐?׈,@.vgyVyc̡#m?(}} 0-xXB!- }HM2 X dbZ \4o4Kp`OOD1&:nC^_7e3!x9nw)B!Bh7Zz!n: {k3dypx^w@(' #{D4: x*'d8!w {Q?W?Q;w=;/xԎxDF(oǒX;#3xگ .eԦ$\k6V ÿYɒ(D}W%j3nl?))B!ٸbNnklA(P1op1/w{!B2jyܟpAK8;7'Ef dҖ'lM8;VtŶS ͏1nYoNF)`7)O|A2~Y0}bِgd9 B!4{Cd&0/NƔo žw}1_~?]lWd{Rs@#[onυѯ\ '!T'L5 Ī1 $fr)Sĝl/M^!Bhcg&݁V*a[i?H 2rVdlbs%5=4XTYpb3ZnH,R]yi $RD}lEB!F8'y!N ^)=WԪ>y0hB})m8t0Q5mړiާB$Sk\HJLW1Dml[n̔eV0 4I~z^yJNSE#Z0Qwg6!ۇdMxt\Rg Y-<ךKNHa(BџJw׮hKj7fW8NA|ؿN#I*[qbuHCm/Jce*8*l Q CW^{6A 2l`˚@*EBY#WsB3Q6ܚ?.9Wr۴N5<' bJAX>lb7 r 08iwc0NRP 'f,s.vl[pFݣ_6dt)Ӳu̷|h%p2iM/~N:gv^Oa!qg{MbJ!Brecz |?ܗ_htpXn[+ _.eJ#> ϹiTPF4bg5qb[ oãq~kc?I f R1>IR(@CT{jm5 Q;o++}MT=‰#$~$(nL(р 2c>^< lk~opXok5m;_ $wnw?*W1(Bo o^wI\fĠ`Zog/{=skw[+,#!}̺OqEWǗݟW nO>MU )qǁ۱`2~lwUb=S?$N?WL|G95`]>0rIy<59c{OLpxaϹ?4:V6,I8Yy%n#}sp۹sGVe{v?8<ǝ7 (O'- rwmo7費~iL۝[-8ջE拥11>>䒿-pyt;d\ %k]MN"Gd;>N̯(h֛.2/ C5W+JG҅sD_X"0 ZzB<Fi?o3qq'\`_* ĵRШS2F{b<>xv_DD,T㲹AvQNSr yP^ oL&_!];tNO(s;Hh/ ppj}EBIя,HD]PTk Ŝi1g ffn]%s~0.o. x#[;=pQ&3_7$zUGz j]|KOA1p2/ohRN88:YC=\y ֬ 9)=(o':H8 W!4Cqk䣽]!qU]of acT%ܠLbz|aS Xx `!KmyRm03mZ$uq1+w~C?iwך\.{hM.wK'K6Ccg7LB_^wQ8兿F\s_C- RЬcQk%@"GrhSL`˫R϶_ͥCC@&!#X%Dz!+vĵ̧eZ6oNnSwGd0ͣ %a]Nư?o񂐁(/WKq-f?(Bh]Vu $q}P%`Zp {_Qn]j, aLR ͇G'ka CN=rg`_-OĸPN,p 6k=)vTe '#bek0dM6 cܹ^+RO>~B֌="e tY꼁伀O mMlu0PӽQ'aaM -۴ 88]g J ]{}ܟ[{,,O C1(PoƓ\A(sE~T *z /ř_y?fm?ٞ5P5hBcG[Fy"8nL(W)˒rl??UP oq$Bu_wEBPaxJ˭<f[;/ij# i5]qx]; AG%N׿ ք% 4uhx4~VMpNA `váE%kS?/$u!|IJWgR1() VByBH V/1 @ɸO6t_Q,^կw!|YԸbFylԌ#igP+o]6E7^.&RU)r) mק@ѳILz Ӣqj m.U_"S}N8EBHϳ m7 ' Jz0nW߷!,E^kfd:ʑ FӛXb- #~Pt}-7Xsxhy<@oc"y횑`5 @tiVaؔSIKW̊zOS&[dMZ+hO@I_rB 6/ye{`nJpa.͐Aw$QCxL^W1~t7ߊdu}>.nщV;>U+$^6WEZ͆^ă1 Ols9NLz>nZc5iܼ%; "iz H"{d3H`o=>vN5SWseXk516nόPDb3αvm_,~Pz=}<>Һ| X䦩.[`bDՆwkpM%k]Cߕd{p<eS.ɸY; c;Q) wP_wp YA~lׯJ1 wrG2I caQoca0NZI@I[<<& WKP3ԈEWYґ]-SúKM/T{?_@GœwNZyƦaWs}w)Ls"2c k{(oNOZ/[3^KH4@({Wf7=Bܭj\LB:)dc2zC4ݠX;n:j5Y%!hIb^.(BR`<ߝuT/oQ zթȂdPc7p4`?54\O71練y_q~+M,K7q>1 "<8.%`a2/Kc10P$LS@mtW*p$ ԉ ;Gy/ۏ@!! |Qle?b8acQ<]mQDL9ʃ`r-ҐHRu/*<HtCXfF)7y2wS^rnx?.?o즵A gg EYO áċ+xaK͹v}l![y;_Z77֔R a~T)12j+=h7n5*hx N\nnJ٤ 1y$6 l\g _$!z2]hbjH8Q\v׃GFXӗg#U `^k~(w񉓜UҺS6[gX*x]EiV*\tvQewPYC5HHa1½J貝8< %yCt{PGe"!u`,2CB4QPn};8WwT;?rP4Q^4܋Ёƒ^.MIi^+¸A!1sD A0Y;vq1^@eo#ᢓPfBDd[@#loY4kTq$e3ebpǚ^gU^eU+ATHA3밹޺Vi,D4$\,9`28ݽm+wZDyܥX0 \OvGN~9"! o7۱Y(H_MS:vO 5o`8I,,v!ִ+wCeA`{uvX/Y&ǚ .bRF?A$B)}D/'d{IÍe hpxlr0aKfiJS!eʮpT{p6mC-™ Z\| (ަ$6  yfE@I^̟*`(OTMН݃ȊZ(]/ς;ݸGQ.Ѣ~.ab:U&(_8%Q aSPH-ߚDũ`z0D% g%~F:|SYsWו}0M92uq5 @#chմ-CPqG3~YZt"% Jf Ԉ"YO ռ)[kHVr_+e`+)Pf;o} Ĉ*2Sk*!ٺlй~lB 訬A b/_OQ- [$XدLO+H,˥llaR *`LۘT㟖j*BO[9 K XC8+"_ mlb\*9BU! eX-՘ 7">mƿ-PfjNY'utcWp/^l۸N1&髳Qʜϰ!@Fńy\N LM0a|]ĭ해X^5&} ^ˌWL98rqk5 K@>%=*Wȶ9Ϻqٞwe "? {x(K3k$$ʚ\P|luq[<ܮ5Jt?1 Ql-xj=f*8գX+QŢ?~7z Qmi .ڇ-,yw(.3.Ptxte( (JZ͆ p@7]d99aE!G#`㼒ri, p7(^~DW |'1X!r:s#`g")6)O5}]/=x8J<uQy2.CQ6# +*ӿ ǦLMe\pyL֥3h-S+\WR1B,"?2g`Lȣu`Pu סBWzvMSS10t=y5uc /Wq^t=: 5*KeI"Oo?Ď{Oٍ 4f˞1T.vOۍaJ@w~+\_.!ν)T .\K(+zd ީO>sE?*(t}7SӊvM a|^Q􌶵f#~O={U =Bu}Yn"`WrlcC<dNۨdY3f\ )G%1'Ҁ9.TV!؈+ohDŽc۔ T7E/OիLeGyCUatX?u\՗M"8J4kNRQ[vr4>1;-z ȢO&)KSp~{#xt]sCzŽsRT?+͊0 )b 3''mdWU\KTC;6g,2g9ˌQLjVLu\,,YB&M}|csDm^t <PAЃY-h-l c1  Μ\3(BlP8; ˿-ƿw:E8FAT*I$L0%Q'e x vLHDc6N_|>eipJEHZǕI/ezԄINa صA_I]=0ĹJcs-󶕀mqf5 ueg_m]_(*FMe쇰Z.il5D¢tݘX/&1ߧ{?)^{1eP:]s;JwzAl5Se0IWr,`%8.iv./䷽:%2kSHZ\\fb]V nNjzD^ ?-B h6*97BÖ&KsXe¿c=]D)rNcՃ'4l;A@4v5GKP\и55ObT##?pDCUSzVbҩf`[fcj<q1?6z6x3=Nؤfˢ9.a-xJ[zg(gأ2|!bt{-( *7>WL}?8I ^c򿠋N m ycX,ćK1+ٵE;bY/ ]vmoxӵױkS.%Шe)̯@#FӋtinf2.l [Pn┛WO1/Yۼ,J>H<].>薰2l0/Dbibü=|'p]@Ƽ_B+CǸUgolAiRBXkZ#alwOZ{ҙ_PPdBZ&{GZeO\c_M'v ~p= ? ,"x$G˔l;[ET}\"oR.v5=o tX'lPt$+i{Vk{wP;F$cX:^wSft̖0I 7rZm?"2 bURD^|jҐ#bZU.C+;N(A/pƤRnLՍO2T`-EUZ36%xƚʔ;2sD#پ41̣PHs]UQ+gʫװ3{ew_\rpab9o4|z}I1`a[ bS?ll梿ʾ=ϐ']jc@`bMqQjr+:,K$LVG@XA$Y!s RX+#ƚ88<'m/ y!DsD8y0J!< YRIQdy0?s_#=zbT6 43p6nY(!b#1H(+xwc=9}cz`sw$儳|߫{V!J4c qԹxl-O=}ƅڷ|Ҋgcm*xsB5˥ |N*Ѓ8\Or.^Æ7Fre|yGJYk*_c2Vnrd#9ଠs̽%U`ܞgۉ$m<L\PuZ(jr jDi7a>LH,.H/>l?jC) z"/`Ip W֠?hȱ$A8^k6Nx<y)>G^Sn=o{#-zOZya[5@civajOݽǮIL0a&S{no@=影{ >oNJi_VD^eX4~ Gx0}e"e|gX_&JLfm;wr(P嫬0MhYO裩!)O<8?O@:M:cay*޼uT~e ^{xVa!>\W L]vyȋtH(zۛ빾4?QУ7O׋vj0~&)X?3GR-1;y\h8)-zh}PfϐZ׼yskct7>u69\f7pyLO'@,>7V ~&B-JON _|<~fٷv^}@V + &db(kZty,CZUTy UW$Vuă=/fs@ξּБܱ[&n{{jN7QDS7-\SNM{pW& 5MdŞ-#>5γ 'φl_^0_6jcz @ N_Wz1q(~PIX\=4@L;}ïs)SX){Va͝hj@1Xo̞L#`5}ӉvC%bEjna;V u"κ 4aZ F[^IދVöM=V2i==QwN@'>w\8[&b[c¦![Yu"hD!yW_yZtg(u0bVbMZ^u= RMpNZi]sЛ OD B$Y#Cc¹Me 7n&ʊCMxK2Y?ijG ̮㾨XC Ow1h1.a@Olyj\0+P8T gZTڱc@aGɿf=%6^>j9jN1I4x!];ޢ+0輅'C& O7J Q;sK6˥+ BqnN<,cx.+! ! 46 YMG\r *Xc=m窼x4/ |qa s֨Մ8˙< zZŸbtg$ &J"jK}2\6nwőr!Ma w]W dҹϾe ^ 0{ĂghG'*a ^]OX$ qq)3HFcp EE@C/^'%.L pjл[ݼxXݾZϪ&㍁Il})3j+xwK1 M|?{yt6?TnƶE"\qayvde\؜I`AB[B7" J(ДiT+6*6Oqʮ-Fk11^%  T7O6 r=zUNؓ19BT%mg" dUJ M c@\Ii3GEX0i0eX0\'aFb;Jʇ0ݳ*L{cםt)8btZi7Te{{XqG?:!lEڠo5,*kB vxMCL'қ+=C1HUN <v)S ξXkZm$e6 yСM\-it"~\ddiZ`6 Efn`5stoF̃ oǜ7=9H|U3o'8Q=nPfXk֕`EJ lcsMjbg~ ICaDwӝ'6e΁X>=& _/kHP3D~&?\3L]_ N'H ʅx~[^4R~L-{XsR\VntϞܘI3~@Xw@ >^*\o(!%=zdtk3?l,ty6O 89ue:hAB;l]STX\d//R%d#B#d]^$ۛkY'ӃOwđiŚJ1qocvvμ"qt !bAh{r-Q{,Bl7#kJ>r$$H oifͮ581֛jUUP= s\RLUe#VVI@eO ,}``GNřhl]jyW$1_/ ރeh~^Fy%d r Ĺ{ l&5= !Ft㱊$(~:&TF{ijr^-6v1Q/kNnF0r,8R%1,$}'8ъ -щP~hu.,lT#_yEE| d'i&~I(D zMRӍ2LO݇a_=0_'qH>BN@axL %=^Nu @I:X^"۲ !i c9.4^nU%@lr/$w}qm#B'8 f%P|vت1(/eqxv筍5f1a^L2%VgH2f%ce"1MR`I[.l/&[uꍆ9iw }p%*N'(\ I>IVJ*AjW*'`,SJ }HcG}l.gdBIl^'9c4M/=o8q7CXnʐ%\ Bܞ'vǮ6 Fy@.Z:x=x D0Ssgs?M/d^ B+\P>F*TD& GP7;?LuJ_!>BƄH~(}m7U?+ۣ r)G)+MB`={eύ#W.<`,;l|pnKyed{b?5<ak0a4:cGDša4D<}ֽP}*[(T/EC*u5%rL1Ak-*MTHet=dr1KkؽA'oG_DqB b+rLޢspE;d{l;_ĕ !丽e;95vL?Nz$IMDYi)Ģ(F%CVdI N'L$$ #$a;Y)|ýyӷ {=qx]]5|ko9{YQ()cpyCG蘊Ų{Eh0uf쿾0lOσ( Sy^3|gtԙudC1K D)/_Lȹ"4@2rYp?*sոфFMeUּPPH9 28E+P!Qr %9^Hrx') X*Sí$ue(a̟h,A,g Y 4 7}_;Ϋ Pp}3;|wRR*Ll)4@Iuw$|yUbj<$ VỲP, " A!@I"vafq-ߋB@2:xE.r'wU Lf$O$^G p-ky/DCyҫy&dD3^ێ}qp ͭ:+fqhKH/"y R-<@Y8 M)$wW[-oOP<眗cc:C2»=@@}FYL ,~rW(\\:~Ȕԯ-^lտpJ8L@ie͕+p_\) i߁$cL: <@k;1?*C>w" d()&d$( Cg2X۬`FmlرЇhQqј459-1sY@dCg@_#^:8a"Ο# D4$Z0!+tl.,If\,7oM"h5E$:y[Lx@/΃+~baL? R ~w7Ri=h;jX y0D3l> < > R׃tWdRc~DlE^ϼ~x>[U"@FlZaq%]TgLb'g$:1mJE$m8,2{.cq Zvys[h]jYߋWqϤl{ dtClp62*JAut ^Tk #P+'RMݔ2doAv&lߍIZ@-Ω8GĶ䑚yJP* ⱴ= AcZލOp,%H˒W*^T}'v]W(-) v1Wwmo 2,$Tx`y ސf G_t9qy5|~ 6"vA ҒÿȀwT,+R_<ےTxbs.${χ=iJ2֘+FJ ]˟a9uEWӔ4Aa.oo@#났" Bq;ݺ!CY.s1F6pd&yʺ+CԂ |"2`*]}k̊6M.MPN zۂsEQtc }ǯ{v8z{P|V!z[H^zNcqA% @`Z=ŗm`RHd]UrHxȇ#|_r,Po DS9TQ3~,/}H݅DN835Y"0?F @Grt5-FZ{[1 d 64`}4kRQrOCl@H@0> "A-3w"۹oxpt]B@$Z3kDw/49. >>2fa1_C>x "YDɄ rPonG T\> MD%tύyb@f/zf`\@@ms pE7̄cr$|_ &$wF-ArS wޓ輏7<H&|;+ڢGDrw0pp e\F6"H; `(7t};NYC+Txxa}~Wl?|G^ m~7Sy{hT͂`=kRR? TpϙQd&  EFF"T- lhf/q7 0N^K8nu%A7,%v!_ >୷87 0ObV_@d:_-@"'3mʙY8PR+Bg痄XK(2~ `? 0y?X_T@N\8*'FV |ᇟTDdfĝ$yžs'ZXIa ֱץq PkNrʁ D@R $/.l89> hAu+L_ @0)3`f%E+E\ |nL*&N螮*^ya,G=b&F _&Þ>:96QEEqa>+QD*b^ے(FoUU:XUK} Qg'w;R\L+N Li) @_RBԳA>}Ie!$2FB,}DxL^̀{jA*31%Ӵ}3p¿//[,F#mkl F䢣`Bl \uH?+-˺ {J; `̕jJM< !{0E \lq-S$ֽȧjl@j>wQ8fs&7Q5hIs&|bD8b*yIG pHZ:QY-.92@XQq?ZxuNt>V$$LA6zlŖrEzfp O; 0 P尖./a2_y+*P@Ԣ'Ϭd.~=^H#PmDÞIae71`ɞ{ O.X}!EB%ܙ5O[jJU-,fRfT-,\8VH0 v^{dZ=Pe&񝳄108e80Ie8#!h5)&DV{+d OKQgqRʕ (*|Ȩ饒lm_vگ,-Lb!#\doJgDx–bOOU!_|V Fe ƭI!-@@Q{mm%]mE\B8{gwU _}h%AXp)%M(lƋ!Č.ee I[=>9ruu)eARbl܇Mvpafhq,{T'MY1J̇ >=>pƞŜ<9xe+czw#UhTsтf-tW ᬢ]`wG}aʶ>SkfU{@Tἣietw k׾fk̂T݇<}@@9ѭSZm FciA#˒qZ^zmSd>0X~'x+m}`#Z Uqy%OR4(xHz2hvRY_ :l:h ԕ U(Y몬g$1{F5H$3S ңcnaDv8"M%n,_)i!d2Z9SJtm [0'-)] HړcM̖t\_ Y|L,3凪3DIq}`sKQeϥ*|* p%3_T'nPT)N -Ag ^T߇='@_q>>=",Uh@% ɠBm8?8EHeaX8swy}K}I3j耔ɪ ʌJc{@|0XHqءzw* ygT'lU\{AqdV'l l^eτqt.' |U*ك$H2k613Gĝx| *:{4P/(rex@u`X*'\\zH"gڛ I1Z67}w'JdvB <h*\޴Xϙ/J&* 0&,:äY;Fߌ?==ͭ BS `yIkO`O`UY :ٌd]yxޑvʷUh(`24цQFʓS4Un@u+]V4%~.@i'IkZs\AO7=(zisj6+"_(s\v4WXUjޚ_QpL`fW -Dv^&wsQ%-**,64|g6qoaQA/Jv(D_$q`mA\'iT w{=N&`(w\-4A\GϿ=AwGϯEhj >z=:8?)#n6A2 ҵtg٨uGz T|cٵg/(ϡmxe%o7p{Z_c( |=ۛ~+z aw5d²Tm+,.z{/pb,x }P:N`M_MљNzs,C)Q_A҆* E̓Mg3_/K7xOz`ɏ7 rٜ!9MbER6Ucx$K#NHPv(3у1\?zlonx==j\m[;AL::=pz@D;nӬRﯧ\{Ew68|+y\_B%5?$%"4$ )q8 {L2nLh:@bu!AE@.#ѱ ][NΗ7 Jtt5[Zpr,E`qV0fLrDEB~H?peoT|f'y) #(}cTdIRu^]Yf_SXr`ƞ)Uaxw"RdA`/~T Y8R'o/;hxAuV1Ga#D42A?.:߅j9xq;@hDyj[AY{Rs<ӱ? gZ?۟i c^_t:`8s& MXRV [ViH z3 Fy\`}!¯5YˌOF\O:"VޔX?S^jveAVGÆ^5=?C oV|>cղ1E-~4C[XY'UQkK 2JQ%j h c-v0%_=$Am a;u' aON%$չZ;TglD_&pNsJ09ayp"}ۏ_ـNj ?dl_ 2I@,n\?](ڠR GrKg^vA*d`kQs9`$*MeM3|ETbF<ǖ7e#29/8* lu- Ɲ2ȷ>U[] !Y'ś9#zh#х#'ZMXVQR&8Lz2>JWcrY*];rb)Ê+Yr֤%``4?1D$Y_ac12ֱ+hfgw2g#t- cHH֤ 8ʤ `1nY8 4c2v]&u%01.ɭ7y"QTj$*7ڞ wb=O<}{>Cd8ys1Q@; ts8['U$8*X7 fk-5'm+kw=`wR^Uf`Ӓ;FTu Ob'l/K.(#%Ij Z8;DZRI2qz@^( 1j`gkvOb&  2Lv"/0Ư&}:idXB蹨 =b j3?Z?|xE*[ԃnT-Kv,Ȓ=+d;1]R0 s3[%(1o.E@>ImV,֕-Sk SѿOrN(28Td;eHi]JNrS@I$}s\Gk[hy|gAZO$jMcџ ЂwY36F^#IA@eW)!ПM _ҵ``5|‹NΕŌ_Vde׬Jb<vF&4*.nUP,u} Fߧ+DFHHp Jqev+,- Ǡa8M@wī<2?˖i:=uzɲU78[^xO6١-|ĉ.po_aTݒuHNY|\(,+g#mXs/W$+A!L2?WL/-hHs~<=W_|KTw KC mF ª+Io9lՄ`Év•@0O`:i]W7ŕoUaS8F1TvުE&q$T%]Z&w42GZp0yn:~ 〴r'q: |dMi6UV4g ~~.6z@ׄ5)gswK],+N8/8H&d2 @֗; I=3T-%`m JQV(v!],|VUDl*dz+f2>8e kQOJ;+eDY8]$e ڱs۾*c>u*4{g O"f PȘ&`٥OlS};'jRL蔰piF^8o$˷hxSFU-ueT7#','@3X/Ŋ͞ #bPY=<;N @A樸?c2:VqZdшE6[_oYД4PuXX,wZd-/upqycnkY]$iKq%6Ƞ}(p#M]x0iURJY-3|9b%q}kRCg-e?O>V^g~δM)K2OƫD2U`$jKSI6:i=݋Nrj5`_")8zpKFy L)2Xպlsv~  VWvb`"]ˮ[-\I;:yd6ipNWpY\߳`?1ݦP}fyƎ+͊ZΓn#W',zWJL#kw}JeiA;;}ʗ5w@J@';J ͑~#pPJWBjP/|ɸr6c%t;ycE {kCG|Nvyϙ ˬ,<&HbD&9.L@ Aғa|3K(Kk@TeNQDvM}2f2#<NXUh?ȃaq^'ͧF*˦5*ZNS.WV"F#tb' /R*={˒u]p%0ؓ|}a{fS1,aVH E4z Hydߕ5͍no#$S^"+Q +R*|K, i+=?R%Yj)n:>uϴi]a(8_]eoJUVH+&htLmjB^ \~%+CWVL=s h&ت j~JF/Z ف*:X҉Uf1LSgTV (;49(Whls;:-Hl%d۞Ț7 m{:Õ)gQчb{޲h =3C[D~zUjLJ{5\ &]fU'TߋӤB^ 2r oD>WEI.6%v0#n_-r#W ')t J1#j (`@D=UF~fW=}ed&o6nGFSP=pyD4;촩+!] W |ty>u o^ @I[(;(:Gєsb\!\9؞ģ'P- *|i*> U+qkYaOaVP,&b>P&%1 P_"3_s. Nh2OMKB3 @+}|myFG%@Y w {Ff&P ȪQ9 J>q.eUP:tJliLf(As1ߏ>c}'[|Òe?x09B%c#~]sQ͵o7^_-th\ljm6zvcbBKʼ׶R*kwe7Z,XVQ ^Cu1Jg 0ϕؒ^+κGR/x tx﹃zfSVm19:P+j*BR2 ֤+WOx|䞼$ P$o~ֱSEI]69~u"бQeM{icZ#µPxi{>LW%({w|Ӣu?)s|;߻ZtMUrz?D`U꼳ak< %l9T/<&,B\Dk~}@߮|.)fߵhL;Mkm*Q!TV8LzxpEԨ>LnK3 ~Lt^iWT("z&M@ soH$16[%yV~ۢul܉3ye%J*m#xc-aj6Xn'&hDWU#e7E[gךp]rۤɢd!PT V842̓>eŀLAR.+_ђs.+Sޮ蒼LmW|ݢuHjĦK4/`cn#U'Dr ֧5a.jTNxrϷV-yˢC( DŽhS\o5o2v"/RVz 9QQ#3 xS)`&g_WvޘlTC N ~1=0J_6"n`Bf2 }*׹HUM# Ѩ% hC f4d"b4ƽJ#Űhp0Pn ̨jAίՈOP)`=#li|\ndHa󎉋s\Y׃}u2fk dWIXO/%)`0$o}#j6 WQUWyAP7NQ-Z봃[:dπV=}^l7KDv& =,YǏ$R{^bQd_#f9)^쿬l\XV|40 @n ]j)-&%b%2ݒ7=<זdzЖTb5*Wp.Glv"M8q\5$)3*WT@~Y<+O77Ɍ @l4Z ^kY6 CA;r–eX/ĵP'$|'#[2THS"=MGeQ O,"2fz7-EzQ)DL($xf$#~ s"k@@&$/)gv0ڢ?lڱbJ>  W!dq^I=(͉D|1ǕVzI{p0hJy/<"HEB^zp=OhD=ABpyܷ/LU<M{\VVa r7)pAdu Esk\| + 0/n r8W0T-& WRo  *hׄ<'W/ۙ*a',4߈J:qǏ h &h+<H-n }!Bw[nK\y@Dd&A 4d1~>)kh`Dk~)Jj8њn;EGݖm8)bKqڠyZ:Zpx=?] >^&t:!R8IM0sf{TL|?yE~ z~ z~+z'P )`yT;FuÄ1VȉSrRBĚ&F]hyuc!qދ{mS2kLMˏ+j,cpS⑇x7zߟEn{77'7@x8x)z-[胚^#Ͽ=4wB9ګ0Su%PܨY*I2Px_o=Ͱ Zp4-TT%*8(㿹eA5& @|'S%N5,p.,|X~8z|~-L/c~>c:3*DŽqMWc{PHhn"AE~CU HI8QA3>x< _\V+lJ0'Ter7 =$\3~#M V@{gGq6EVPe埇#B:c<%z p8;';qlKTLȦg f(&$mw 4yOpHi`R_}6zg? \4ٌ{!DZUfT,&? MgЭD 8x!wJȸ[c HL`8ہcoY, ;O{]?I孷U-q ~md"-뵒[ez!VәnP:ȔD@[AB4juU#'@U T`-=RJbd1% ը$|qK06ʃJ!??(~ z2Cf 4En"ʧFï|12*g>Q-Y5ZFqibWT% H0Kk.҄L vJ@\Yxr<)4)3Qir7Ʋ@y=6P@B>>gI[ ) 6N!>o.naŋ(ϋ9~. 2ί 2?P¾{:n]NEpdeFnSM @wss 99b,mU } :.拠m at#\ Rkfhl]="`OdC2@F%T~% `( v&Mha(S`}7K t` TM@@j '}%Eñz5z~;9yLjGfY{jjy,<Z$Qx~yClƧ+BwX/Jʥt FGsK)Eߵy2ͬ`uN[CTRoO ȴA㳠zX3~ lm6\@Q${=de(5l]F^T&&٭p[$_lSd@e},1U\ee@w:m%!9@݈H"_z{ʈ7T V _9`U2#;OϺ#e炪dM* B$Kɕz:N}}3T6ƮsZDAl'3AS]Tu^i7fғ).o(M$ mk*bxO;J ?>B:1|F?A% lzvv_,i 070۸ ۱\ ;-h;{==5ǖ*rh ",HQ2+Cw9(;ް "TWp$MDqH-/?Z0GsG*pvSo_ N" 'ɑ Kٗʡ[FeNz l<>y*`v"?hA5H)!f_fQ^bxt}\.s< ^n}3aGA }0'еEUQI"59=  lF ʽ`XldWOd0(?m2Cз6 K6s mk7we=Y {Y 'W,蹰#`|qGGii3yDI#hvOmۧAHo5UpF^ k f[dEUȹvroP˷l#ykj[JpBe/tw3]Us~w7{a(eM<@iyĦ*N<.ʰrH|3DFWg%xLi C)= RuO~AmlE}0KMKNm O'F-tFP|Ϳ!0EyyF͟ȻG??=w&yMfp 4+ddpL*F;G6EwzGuN/]\R /`ztnO|Ã~JX< `'GiW}.x56R4 ңnD i 'k1ُ7Ϸm/#菌-l/wl f.0_vD^{y舄@yk2Gl^ӳgN/.# l*(d'I`P"NTzl@쪸R3e+E{\^ Ӵnңe>MѲvmxL_—ZgJ,w}Ay~ݶ~oEY R( CD5gf9UU<gtNH} ENxlW.0I<]f2Phh Y6 +ğT:p<3fOUB3R*lQs0Q,yʁ esʱ T2YPlr&0[Ec IU'f,}'8-U-CelIU7ZN;&Z(^?Ã=fĉ,.RCf 2 ; _F]¨0&8L&vd]쪎Zq腼育|mJVƙfp4CB#9W;A*>PnR5|EBF'S$hhQs|.Li7ͳt2x$1 +0CsR0 bp|O *Ó%}<&@P፸ /S㉞R_=Tp&w)ᘊ^"!hxf2!`P.9ۿMd"ZL=C3ZWӶ @(;ХSzр!&;NX֟6F {(ʓS3dVHGeW_%2eF;>!LEvJ뵑A.f F)UTKzE|vN-S-rО@lZEizRBTBV%ic߶m~Kd>>ܷ~K=z `-qGϠy}ʭLMS "el"da $c/x%TRP 2o/Byqj 8emߴYd^^/ilx_xOZֵl%gpiLNqqkPoKt껇}ʋ t:BA~G1`E6Պucm<`5^ (Zv}6p@HFF=k9?fu5GC&=:9Ƃ^KVjgL̜S`'._hqfbx݆x[3ޖ=$֑fmyNj}dJY[Q_&sg "`\K \}BI=劀) |whF,{6[9?xH^UP]A{Q5":4dSF|*Fa\JܖVhQ d4 'TaM/p /k%LmsZDsϏi"Jv+T߁ml^5]v{(>No(Ox;XXTlW.~|rHbwq^񬀇6@B,>p(3:b*[C<@1Q 5 ) @"K-WQIGMϿ ^M;,gd赪>^ͤ13AeTgOm#t`4yoFF{@#ޡ?˂IϹmB[P`oOǏt3xpoU}].-P &fO 3y7Xlqe!PV +-YbL!@ /6,.o b*}!}V˭цU$zAI}G[dJ;F%Lk tZfj2gbipyfP&;YD*^J]L8? >mʐJ2"[d6JeMӐFc+"*GN֮.h:='|kCSJQ@R+#_[/R+v^Sh'7Oek^] +8a~;d7;Od^)qMs+jȢO>w)Uf(ÑE`&F%WC8 "kk" sO3&ݕ77>_&USd"x5t.dD~78:1V[lmHxYwM< C[t6$}ҿrK2~5gYF.R\Y٠($I{CCGZI%X,l8= tyN\[IouHpsDK[~}7ej[;d1 )H[٤5$e/(f_^V \D`:33Kq"YUe^+?{4cPMq*ɨ^Ô%{OHeY%Qe -lSQŏR&l3 {OI: +Us}TjE`.|Nls^}6aOiMV2d^`nBB Wj.yt'&e 4U?=`G"-3;> SL:kx+ dU/ Gc#+Ѿ*igs$IyॣSud'[Tu^.=Q_ZMN?̯(* gJ/hG{g:<=,! oO(xa<{%z`n -HR:zw= cw;Jax=0 z80ʊ3WOzT@_nq~۬Ռ)()L @/Jb?>LJnpt}zN}5ezf3SLY2?CC'Y\U;R@QڦP$LJt7iQhEǹ8 }R|w*զw_𑯃?:^I쯀@z\ߎ*`Yd0?= ]5ǰ4 e4, jND)[ـ/2USf* sG {^þXb@.,G@. N k`9xB2 (+4mHp ^s~ xeyv~L&3wdQG 7jwÃ~1ח8}0YDeqѯΎl p@Z5ajF=+R RPs`YV ϪNN>F "u>/nV`o^6咫W] A|tMdL\y4ʇ\U]ܐnn0v:$v^Mr=2w11<187l4y@@ڱxs0#l^e@L7a6ኃAb+# bX E0Ԇ1=@R Mvi^$Xw+2(4qHhWoSƩ'A]VTpLD%@بK$%؇gCTfF8Ka^$~}6܂*[-gr^ȯ[/—A`2g`jX2V1?l +jc)?a2#^%8(.܁D.hb6=%<jT>ABq*=ɫCt'lcTR~h2-l)6"$Q/ww➴[ ߹6(pW;gڡr6ؠ貸 puEBOLGKy3C"ǫ HԟUoXQ].v$=MfKT{]9"2 7x1F⯮?9½ ɶ:=摂3^ SKGU *=_.YQM&>VmQ\r~&C?^SCzߗJ,#"1S Ke?]!2*$^FQ 'A3 sAP]y 7%&֤*N}Ohsg~i-xnep~y #.rb}5٢+Բvom% R}nq{h4Ip҉"Ih֩S✹{j4AY.]l''Ayt<9="Τi M-L*S}5gI딟  հqd8 ~y0to}םi9 u~%CtEIVd0 vUL%mzQv0rmR+@Ld9 I1-u@Qe_{nyfB4haO͘N@i5cu~;*(}X@{=сEPkvlmñRtբ+۠CdcÀ.;`՗N1NdlJ, XD/"qUCt8B"x1ɪ:8I&-.#H*ߏ/q$?nZ~%cj(?==>WP1#CU@e2uz>.jC[ Jj2T2!0xtrhLFm.gtdpYJ*L{akKoS7sO*R.IN I&T!W:N Jv_e31^zkPEB6&.$A]87C FL[ٖ)&7$5f(7 ՋKQ%R7y-HP.Nf$Yu}IEi=8N;x'D'}^6N &Mp0|U];ױK?*:_h76p}yhPTyi&?>=2rN{_VvZA\;8W7ZQiiwS mvPg ٌ3 J^azIpxת3$؟dFeL .>!YxZ:9g3TNJ0w\IxV:24+-MEmXZ:@>f$*ng1c"$Ѩ^ӣܣ^g$C#^;ٌ1|@äZh  +Wi+k><h"Ԅ:x0=TG3KSQP^WPK"&TpW-htF!hVM*n(Nb:Zh%k`Auȼ0rPN1(4 FddB!֢X2O5'hj{-Զ4v<ο2 UpusKnuW:^u>9CFXGc{*bpę.wLAҶOy~@FZUSNBfӭ6ч4dK`w67` 8u}MaB}c)s?ClM3u/FV eTl*C9jل2y9Z.F̨ofsJ7^}TdyS4'FN4J>γ='%ۦw>TkuY GۚıD$}UY (w6O=$@-r fQ@33gJQc]ٚQۉ&>wWPd rC06Uo c"W7oPgЃã԰ 3gQxq2p3hXMȴ:VJ|8%bTt6v0)`#k/jeYynd+idd4MG'Vi6qH 3윭> T9IAGXcdKOېGdSG㽣: g_u ȈY =Tq&b?DCEXؤ0ͪ WyWNY8#jCdw =T@YD[A)Ӯ.Kf==: *+IZI J2}9kfj70=QQ?ʄxW7^`yX)xk؋Vӓj]dT_SNgiM=K0Kb0KfuP)7$bBGb)Ye֊G`񿸼~liG}rRomPMrW&\ "t)? "}2 h".yKv}7 ' ƈmG٤uO-{S6{ Rj+#ܰz82lCh'|Vds:<ԽteU-%`yf`+0;OJ-v  ݍ.Y_C~N}Gh2jrqp+&d}) ǹ3 w9v5ܣu&uMjQBN- 4g瑳3rxhub` Ћ.KTd]m(iг^ޝ`*{w"m.OJ.Jb6l <2 RIt{3+/5zN~@e׷aHX' 6!+7#2@4:6jKiGJ=k.3eZ]V`#s:`80l1 Ӟ9Zp\e9Hl]UQ@HT9-0STgd2_  ܳ͘ro:}7Z0 O֓q[~U pGAmVQ@=$}s!g^  Jn oepO#W:!b q/_pD0X, et YL*N>tS # gǦJ>Vn:EL"ҭKl-|~IoP'< rb{jQ?J_6@u(Pl6l?2$؊\kmU$^<`ٗ$A=D?r13L߾`8hM/e67 QvIo͚uAEr z gu;h Ш9uN3m#bAqN@m+)^ %6.l;<9ږ /* r:0Z ;$'e}  `Ox盠 0xDIo?^>"2V7~#d0{q/L9@ \tk룳ͦ wfq< ='XŒvLTfaZVGD=@5D1ZMzKՔp#KǂKH*95U7 ҁ)n~G{ %}s@6lxMTUSM,l?,XJWh0"MIXWHv8nءZi^NG gVޱR]Dp})Ɠp3=sT+(a[,Hj OFѮ;ts'$J}:a̎7oIߓFm``%xB(g?_gY>^fݽStʞOkS+QɢЙJ6|(>􇄌sg'S7Șq oX+Oyvve XQCde /{Q`HX3eB2nj+mu;x\R.VtO?#AtJ2IoSuh>8_< (dN{.4hBܕkC,0unbgV'/|#;LmpM. X.ټ!r$:a:r$<L wq - ?V7?3k|xe 7e63YD`П]^ة 2@l-f`o9tCO^NAna^ۧ;; ݆?1aLqp(:F$Vp$Li@2 Md=j:?~C5t:h6\m t> ?MCŤ%8+HάQQQC jľ9}!4$U88/'퉋"rZF]+/Yv-ۂAϻQ~[덌M+7z'K hO*;&S}o [+ ge0vkiJGvi4_昻^fY7dd,67I{omRwy^ȲaX]?woozwz-YJ4.0=_8. TpzV 2OOպ;ڄh 7jT#w÷+e(\x}8͢zM`^0NeAYb7E;0YW \`ݙnЈ|8XWe_mcz~"?YiQ'he8e1@7:׸;cG޵~yTe _y $,_eCˤi('M2a4:<2c ,D,t;m+/Q%jag&l9JZ! %F0P,I*>&!vYBkDyԉS4\V~Qjq_+Ȼ.=T84SW%;4 CV>7z*"%f*bJHa/rJ.PQvZvL̬z7,pنjxO;NpYm.Ϝ1\ɜЪ.E<۾~@>K|.|p2h'}y|yUx>67ے+t#a4!JhϷ m~u2_ +cI`z\ /e1(ktP>{f6Ky8qِm\Iж# 32A{sU48-PՂ̈́>Fy;6s8nwҿe2/3>&95ZGz4xOe[C~Y֢`BE,^RN9 ߵ`Kv 2 (YpႈŲ\2<i?b;A-בqޡ@de`Z]燀~׌'~;B㓲WE̬ 荛t5 t6!d2N6O]1| _`c`T)~4$'YBvt' Q'mYNl/'"5A:YmYզ\\Pς1'w6 y kT6sޱɐV]RUkF@GQ> $Q˳7w,~D ع;l{2Tg8ҟ  <ζR_1w=}`D6nMKnApDxxaj HTfZ٨{"@3+hBU@dc dXW(m ݯ6k 0RoeҚQ<5̝ CXo]}ptۭ6^Ǘp$SPTvmTi hIh=<gV7X:΅j"KamVJ$7(Q.ϙJE*ÀOq]B(N+\ @lwrûk6O(Nu曖sB+{vN f-fat+F +^UguLvb!Yݜr FzCg5@tُ 2ҐZu. Z }2d T[T) W1e4N:EE{LZnT8 RVܝ6Tufamz8Y\$lμE`2g 2$4Z FQ`0N:Ap4~@&&Ev  dH@1{98ԍxH^v)l@ێ[Jk|[{J-v[}QTus|hAηE^ ^8s7kq&KaQP5V3^R;զ!M12YN"j."gg;]*8klo_.IVe5_j)W_69E <8y~{>yJr]x00/[gc 1Ԓ2=hW徱r{ox Fp&s(% j[>6(WR8@sg\U7!mohm$'*ٴv2 -<cjVz({=&?*q]@(7ftA0=۾n29y*K11!ڧ5N).'lr5lzz6h?r!v>hbz^ʪ(l鉶oڄ^ٺv*?u@-nCh\WgfU{r앯Om4hĞs#ZFbՄt;O< RQ+cӦ2^mDWN(3i%ϬclAr.KϼYE?  (sG2Q2l TulP@, N&Sc`PaY@`R񬽳G5p FЩ$qQ$l38>99Љ:>]H,[Xl4*ttI>[ i KhIhYelfEZ*mK C1^mge$VLJ{OJ1*ũCr2ν'Kk]? &e kNgrHeLܑffezKZ_t;\`H>oOݖ<]) ) AD{#"/hv [&̤敹?xϼ~Q*†^R .)U<g~Nnfh?ݮt!`mx䭆R!Ez*!tO7r+QUVihl2"s-y;6ThA @UZr"HV0J}j3x^#Dh{#p vi0Q,VW}3 lig%naƞP-+ xò{{F JU9BUV>[[JkwAhג<#vC m%yN4YAYdÑ˹'c˥q- ~`4Źs":W@>d~ VHDe%Po+sY?}-dwʺ=4"E(^RSꈭW?)aZ"~f@/4o:*3X&ǃ#\h __ zW@;+F2g7ٻ嶑*>l٩&->| [ed}P@*Ɍ-nb_s%whjS|> ՄT-9A}*GMd=ʾc4Itahi˓UQ[z~lqjS&XF!p0pa[·+x> a^/0r+}'#F  `QSm#)̕[1X>觋rPY`yZ$2•nws^3m0!C֓Leye$.>Wh`;?UѷJVa+_5#X_ G 6#<D.=W7窪#KmȎ,28*D >g>k7UREP0,V[%V3[]uQVKl4*2^X,ٹ]WBȻjИ&Jy5n,|V:Luy|TR(pHmm!2xD?2@RvY@js)0s?lZBPRXuоTIeR%c8Mh{{nJ2V5Q2h}Vf=AT9yՙAHif< s;ղ2W'Uy!D[N;a?U|R54Ŧa9'b jȧ:*(bntkSbCSpV>J2 Z}A uaQU,6r d+BT b22U:?nrD`ܪVGk2 rȷE ).αE4 AcK&DimN ]i"e{Y)1F5N"+nco q'_`zy?Sdu%w@96UD9:I g̀Rb L%#ݨ1#`\CI[[kjÇq%ͤb9ϕU;{lLY6h2X#r|APmw)]E\qq&ebyx)1l4 9esetN{9ϬWD =Uʉ z]ᄬYέlS-'Wdwo)XJ`p\UY"EƥCr:fXm[_@@>FڢzE/wM)@!]ӀD8ñ<5 saYAOb4%Hk-\84tRbk_ &%b=CяhK}HRfJib0گ;PL3I&}~10`'(IİG sj2kbPA v& T-GuLr6C{<ƾBdR pTV~_rAI>7R}WlND;÷gUueU;mLO@ `^I#pW59lHʏf"h^OXu g"8HEt5ówՖ˶G1rUNg:QI9pX2_;K:Tit=&^3_@וL`dcD_m CiN9NcITX1*&4dF1Y:Nmp{U[rȌe{i* D*$-cppr6hǡ9r&4he? v?3<p@ucۼE~ 5[c |9~.23 x-Faj.k"A]/mYQCs$ 4dk}l?wgc\ő1}jC FTz&:)0@M:ZmSGG1X'O^׻]1rqg3rwSN*s4+^k0Bzdq0Jjdc={ÞPn iҜpS]߉=h.uPؖ'R0_D_'5 E)tgmYP< !ݎ|xX+66 ~"߁=r:hBvMTlwyVsᤴ]ӡ>u0H??^Z&>Hd gPC]0 ?:o 7x!(&Lxq$ҌSQ0{q{@,1sw @KJ'"nHLlοV:h[GYrT78d:Z-UN{ƫPfYi6&%KgQ*XvVoF HG=rUm+1g$ FpP|qz Ի}NyFV% ey@ucx7ýG˜&>BRr9 FL^đĠM뭪$C$D;;xtSr"zrijS7=E#ڎpq0Ϧ8 TlFԒ=e97Hਮ#f|q!18jT̊ܝ.7cgzNDx2$ D(G,:g|P: g%`eTƴɍp=2c!"cPfƣx[FNa4F5Q/xᔽv@}߱2'p;x|?giWnsP@<m$>Z<ދIP ?ժ?z/V+cygֈvrL}=p`7P-d) gQϙҐK|3"uf錜Nax}EM# NZjCLYGr±q if]^ &x9 @+bogi6KQm$Ұ _5!`('C`w EWt>כ]#ߙOZ A,kA+ߜT"$*_)PVa^"6YOK[~66%g2/VP|M@mjr=%6{YWTjAWplK @ˆf3M4-*(J5@SFF[Te 7QĀ+ 8ˢь̉)c۳ ==ohwK(Wwu},][5j+nD8c ̄{\Z9s` vGUނw6Ȅq 4-#|.:Y6*ȋ88GWU3s}2:\Cﻬ v*3f6aUtnSZ@%Q`He}d#cw-"1W,έ>ߌHƷ^03;K) }@x t. 08%\곎rڬķȱ=N\@V45ԂUtcs!lObGL6އKN&1Zc`#_T hؠ#S)^8 i51rF>)orK!*[11Ft3Q0} "^dU({֠k*4d ySt2,hC .à^ThP@ xĥB G}%ES6tA9ߛ@zGc~q-N:> ռ?\]p< 5hqӆD{Ă=qXp` ![~=3MW)NY7Oy:ws* |q4^gVht\Bk8\!`1ף ({@ʀ][־W:,0-e:G@d{'<RGgRMo}`sLVuFf*j㚮BﰧW&7ɭW^VfT0"&@Y.es'4-dLIɷ9_>n.@75jS8S3M#I%#û]5P+qSGfG^ŀ@ȵ  DLl^=>p&I:j`p_ER ǻľW|@@MAɹD5dlTCRl: ?2 LhX'cmIP[- GzXnc,6-Um}> . iJa<}egNGm$qܐ6Ё]NLs;Z*aꌆU\=7N>?Z$t+sN>:y 3L1yk֮N;ϙSeFVg@H3uE̾JP^P&g]]%H+@?M(8sll{e) r@Wرgp* Kg-HE """"""""""""""""""""""""""""""8 0_'WIENDB`teeworlds-0.6.2+dfsg/data/mapres/snow.png0000644000175000017500000000023312140200333017324 0ustar felixfelixPNG  IHDR szzbIDATx1@@F At #itCN+z^O9H 0 t@#4JXcÂd7.~>A 0 M#IENDB`teeworlds-0.6.2+dfsg/data/mapres/stars.png0000644000175000017500000000427512140200333017504 0ustar felixfelixPNG  IHDR@IDATxwVUŁvaY."M bCEbb]#hEF=vbIXc7 - AEAɜ]7ٷ[̙r]ژY%()PR @I)R%#wCN$rJA, |ٜ!hi[isߚD_  v8#OؚDP sh`kAqϩEA]EP$@=DkWLDNLEv*:"sWбx"hBP?mB~6BJPvlQh /u$hա4#n`?g^ U R%@>}U"H@3`׋^y3cB0  FJUZYB7L`50n^诚E:8PMN(07S歠~WG2cey 6 DQ;@~ '8̏ǀ`xW&PgkvHC23~Y? -7;J$N0$zDS|Xf?2,p ZA<^/Mp8 '#"Hs.硑AM*8 m-8p ioO`>Oa`s2ɹS)W'q7um38ڼ2)$Jl l$ :ipK ny_`!Ƽ&1k,J5 JYb|j8ݼBN8.!%8VV<>aOX*K_#d/a>)D~tτ`{$^6Oƛ'PJؔi|8R,a+'YXA>Jc`*8 .'RnV~0<ĠRm-k 5jp'']Iw{p IϬ$J8|&(Ǧ%lvZn9up0[`*@Z- 4900 x*.5Hu0JȉC_(} ՔGkӜ"9J3[w@Q7]Ӱ)K)-n\msg`Uc5J. $V;*juquOE`>EF`^)e< B4>n4_q.AF.Kz~VIUGa00?hVQ.0qH?2T9{"1Kpcȕ1aO HUFxy T>xԼ}'1x\kPs-Uq s g'Y S. {_QAae@<͜h~ԛisg槀7CKCwUᇊ#C`9 <9yexW`] L F՗ }|ϧ\WÊ&f*C7*~ L( 83y\^;q>{~R.zK{ag%ݼ߳]#処'\ }{?pLw]1yaʗ"!sx'>aRpgɈ&qs|ķ<2%D柸Z͏ATP}( B8\̈;IS@#Apּ:2÷39B2?{I^pύ/DpK;_QbD~,IQ#Í("[) ݬ~8<[B-2:l]~ff|NJ2cdgKܛMZ l%?'EU!)E@#{*SvՈj Q&OSZeAeB}'D ۑEpH{K[DiIlD@7e^+ gXË-b /}֊5"9+ g,Y1~Hr>WNc9ȅ g<2R%JJ()P2ý2DIENDB`teeworlds-0.6.2+dfsg/data/mapres/sun.png0000644000175000017500000000773512140200333017161 0ustar felixfelixPNG  IHDR\rf pHYsHHFk>bKGD}IDATxk\$ } m7 Ѧo KB)bJ)4iRdaY,10FRꐠj"a:7Oh}w{м{~ʏ~Sf%*ODYovc'OSdo)_~K8׮^Y֞TRO{ҽu(QzS%Y7.T+"{=1xjggAj+AfxAGFjCd7.~/^H^Dؾev8m22y~(Gш< $CiÎ =wy;Vz)혔~lMW \ĵ_` 6Um׮]~qDǜ@XgI\_>W0UjLrT W;Ae 'C'$ Q{$!],v. 1U8&Ӹ+G.G CJww]bkډG]7utfg7ty?8,ܤB0poIVG!k &0QQ~H'#ʿґ\J{ɬ# 01!Ap@k-.,CFTPLO?*AF vL_Pcd#Хc0Rm{$Hj qv 2tHA#0ZaD>sGC)ʃ5/ʃcxQ~ē3^,P4 2Ŏw4Z:?%BQP什F\1{?P Fvŏ]Bd#.+T@߄3Y4Y2 Cq?<CP._R⯕77c#^:limgl|PGVgHHAh7i pl'?!0ϢFVjB@e?Hɭ”Cg_e1#/ ݟOt#E2!Pu/?Z]E/Y0}Uʂ/?q\zE i %O#Ay,i?$AJQG XF?$@y6XH9gx`CBg`)!5k& C"H3[TVho-O_YY$RgrWPeG" qȪ|?`y~DV `\2hH\a@r   ?FaF@t! -xy#"$<#e&#,rHCB8T w""LA"DG`vdF+g萘+#y;Q|;pC0-Ԣ%R `f Aoa@`0pl _|oofL8`wUwTdN1'r)Ds`03DFu:`0>CTǒ Lo[5KuU5)1 ix\]x``^c f2EB3ThPD\65u*jZ5ix7`s}a'4XK{4X^Kqy2ЦI@dyG ./2`N@JE+MN1 \i <<+p @釁,j9>C@L%Ւ\mp ׮^F(vPQ#jiDܯ%BpmfRx @wl&IҎ pmV:]v ^AZt[o! \Eyz߶qZ㰄=1@7Pֹ{΢Y2Bu[Zp]`0]g=]Oj68>0 ;)8ەR VZ_Xp~: >/YmMo Bow!!H?pm€㣽<Հـ-)eq˨45 Yh7wpǖCB( "u1g A/'/ d'WU2/ `'K2-$_IKk* /O_%A!\w\GVKP~~4xn R$wݿ.^ AOlfDJJ1/ܾf"]e&@_6x P@g-}2*lN 2?qˉʂCg0|`V@& #8 󶼀 H@Z{y(0K bHG @hm@&D~cqP~>]#lmzXb8@}ܗ_&wQ`}.r_]˃<8*l q>! X(Gh.ά_*AD{(Ì lY@So&YڮХoj-Tx#]l?Eu}E!t n9;0?, I?1x?8C N @^vY;sO~N|׋CP'~[N83oTd~ȅ/q ]5!qVhШ|3QSIb ]~>BU^~GoaY~\~Q% 5z~,?oocn`qPpV$QX] qɋtTCU$ᤊϸ} b}R0u9[.80n50}說G?`}ٓJi]'P0 @f?0~gL7[<*>q>DeL Q\==!LAadgӳ"ƇZWaݾggD-jdnCsnC#M13HwzYn13H ں'Ju͔ӼAϸ·&uɵ8(A&$Sx }ٻtmFy\Sxpo'5 qHo)_FQv@C*RVXeIENDB`teeworlds-0.6.2+dfsg/data/mapres/winter_doodads.png0000644000175000017500000055154012140200333021357 0ustar felixfelixPNG  IHDR+'IDATxwǕ8Vwp>ss8ˊN',ew]3 H!$Hef7K%Y,^ Ugߏl鮮!0c1c1 c1c11c1c#/c1c1G^c1c1c1syc1c1>0c~g?8cC^c9AcT#/c1%ԁ='c10cuN0c, c: c1Z`1@l}b1X1s u0w1c"/c1fuМ)cy,ݐ1A$g cnn_e ce"{c:Nnsא1Kz &3k'j;p3 P0L#A.~~ \ăSƘQ2!/c1@+woP>M] \pZV %0YY\\51X4՗-vj۵F߃ 1O'_ cx/ n3Coٽj7CI.<eD}?1C..יif'`mAJnಁKyۭtD}Ϙ1Xfsq9ց973;19. 2o"/c€K`z}ƤTI1Fͅ~!QS-`1`zhS~uL3C"1RN;SWej/ #^ :V3)O1gC^c 5tIL \ƒNƘT]~ha`>x =U\V6x|\M}-0` w10|19'$r +;Uwf(n:$f12C߂r 2 8\aQAƘw8ăSrz UxwZqۜ c,90@cx`P:@)cLm0fhN0[ c,l/nso%c,1`61Љ7`Z c,}|T?y)c}C߁gI{^w0tx:C^cGs;z`0ԝм1v!}Cr8ל4F^cEcq)كnkH]oci "p}9M1X\&vp&ciJ 脧po౎fh[I*ĜC^cAcP1䵜 7o\>s4w½D0yWF4$@ /c1SL{<0(b oMӧwcfq~)E&8 `1_V#q `,m>fڧ0dQ? e:S?9u{T>C9 ~ ' 'ciEݻO=x2xE n0dQ?e*S?ɧSj< >IA^Ph8 K+ M@[Lq,^x]쯭>mk0dP?e"S?5>l8HƎ}TSXp(M_WM^/jdl{+;L@vQ_\>jfߡƆ$NxBCǝc,(m)^qXȁ95-M] ܷR=ӾC}mӝ½Jݞ0g3}Wq" U wRЦ ݓ1[mS#ρ+~?ehDցft9M|Q Xk&$ ? g'lƢO~p}Q]󖵽&$K4lѮQGᎊ1ԵGֆt-g 4 ϭ)8gY['YbuA'!Iq}5a]ORP~ N`zOÙVHçtOK$q =PE}mcO]kRu-ׯb-j6.Q3ϔY)c/GS U~F-'xBC>^M`s6 C%pj9&8 KB @=@a'2-OCs vcYtz]@sAx,i>Gm$x\I#/ r'8N8_989 @k:6w]ƛxcvTR N0lkrP8`T Ƃ=hmPiV?I:0xƣ)|& ^>P09P'Np!pNr&Npy(z ?8Mlj N0blQLX抱9! Fh7>Wi {B]R\/V겄U47XIvG^T30i~n_ >IƘ*be3c|3>⥺ETGy Iٖa 3`7F`mqr?3b$iw UGtMko6,0dP_oƘh[?Mi~_)Op{&]S_ {J;\O!ڷ^M}e2Gv} \Io"/@*(6na?qę!w3thńO|j8tp\a6o93%t>]rj܃o1mYa' yWِ@7-$8Mp] )2 qja3t$hz@ļKSP%8H U۷AeJ*Y\*8Dkw@tWh}Ä@`XȊܤ0lGE,dJv|d2 AJ:tO։L _1]z@xgv@]dGF_}S&,ߛ ަL)S@ C:%8R7?Pk0L^^`<;}LB^(1*{Ļ3 1h?мԺ VqTJ\TQMtK0$H(Kن5~TS**^Nt=T3{0¯ g8Q蟻\,^#Eg~|=e i*0dQ YVq:ѵ@2hc9S llcJU!yp~ *tfqux8AUīMk=(Mś K?qK7yN 8RCv[įY`=eΪoo}l Y}Ces@ՕɮCYcu=4pF@v U刵ʧ YE /: r~?B[7K)rzG񗖍pG]?7n1fK=a6Jx~*64՞ϙ_ڂLeSp0dQ Pd > !!\T-͈$a͖ E=fpZ? VlE׽ Ƙ]^) Jdu< YݽMՀdKi]md"ԈwTJE=vp~ v{ CN02?G"p=ͱzbopJ&~zk> oM鼲Drj*skP_t8zتid !+#s "σm`?-]~E=vp$3h"L< Ƙ]^N?v$|+|ۯó0I7.%`@g`a-uK7u[=e7eaӞ\zϴ#=lk_8z`Ȣ;e~R0F8IƘ^ Oӷm `|kSw~~knqoNU'!+%{ p?77=xCK /~} ,8 1;L\N?`ćoe6@'Лŷ.>_icp.M̼zO/MgDcI}Gkũ˕H`98Kn?G՟TAÑ6vޕK E/}a's& ֥06,'cLz:@w\#hd?;2(ïDAXx@$^\CgZpzíX`C-y5cf70d?l-٩+סY9δ=ؖ%ߙ.|F8-H 4EIi`2Uaoz@>p y9~za#>J8A'P Ǵ @{> R_+ ~ %0?!mat՜kC/$$stCMkS5voI4=Vp[ 2&;)H >IƘS}jU;\/ 4(Z7uٽ>&X $VQ_'*x6ۋ椁ەM,zt$4B][L.יCj )P ƘD,~ux8-zpIdA6&3S"౎ǀJ?k6\ pJ8p  -Ia+=ķ >ޖ/BP -$: QvY֣d >[G?B]g"/@9H26p 'cL+:|7~RY~q871A*S'2u$(5S#R}`v`r8Xv&~HI28s 5JZm"ΈfX7}2G3 S@9Se% `2`P$8%447_FԲ {LgIkD,xKaN/lvs3B`;z?}5*^\"$*guB^r R󻦗1p#4h>a98zŶwG; ĝc"i?o0uZoMZUSPT֙Sk+8ӗ-΍L$Ӄxg$Q`ROXà; g!b*;u]0af.` M'=po3>)Ʋ8  ] ԁ3I9 ,^0O85@ܴ 8(4aX:ӝ%G;B3s p 3`%:"K"7j\ bA_pau`Κr8Y!~x\jA?Ū p; )j AJ|y{-v7$~6N0?K$L`N-^5nlj`L Ss S!F^3{p6 Ι?N uqsWp,0d9_$Z*um-q2 7$ &lexZVOb@!X Z$d N8K|΍q=?hm5ַCŚ-T÷ה%oBo@I+97u[ߝ>'N֋/E]~ W N8K-%c֛{|#.z`,o \Fr3 [x hSOC9 x1H`S!ɾB%0q-Q}\VStbɔK> /%> 7"l@\qtS3_RIp^00) C9y07ii}-MWCJp̮mu^f*<{;q; 9j;1ࣝ^'JsϞ. 0YSMp>S/PB=a̩562ȗ#UeUN6=8]p0_7,S$8 `xzv|l{2< d'jԴ6?*/M%ϕ~p&@kZG$'t Q^zŘ t.--,&8 K<@=a 7rz AI`0?S_#O#7D`pPI<9@ LTt p; 9jӝ8[.`%.F4Y$S/0z2fi J >dN  5#_J8xZix0AipEM/aoUNȯH/u1tz: u!:8L=Xƣ_v8Aimvfw G8!34?Q_'?t%2:W7`pXQYx>'5On$Z&-Y!6U쫮n{ Y*[NҜ x]!:1L)F tj50dyszXE=h 1h@x|[_.;6[!|c|.?ka$^ȢNnUiCckNRqtٺ '&ܶq]\nzl'gwms 2эOe 'R&(/tm?F-v  ׈ez ׾W? L@6 @cp# g {B E?|&x&R_+kv~pG܆Lm[ǁ!éc͖ x`2ضaۊjZ6`:t='W+f,],_xTxOdS'(4[.p>aoWLj 2FEEˠlKA{RavC5S/u[puwoqPc\8`4H{J@rKl@05XuNLP.7᳈8HV65ޛl&8b{$z˨d Nk[_d+hRئ .Y[?B·(I*7 2ȯtvB.kl 2zI)pu|TlH#p`APv8G- >G:$db\T߯D |C;?E M`pL sCO?nmPf88sKϟSkČ Yrx|Sbg'~,MޖpOP6Xg!?#8$!0d_#BpqAygyuuhsP+}Ru7;*: !DYWV *WW1UNsep6S[*XK+HֿDͲf\* uk߇2\L} ҁN' WZwP*77F}~.@h?zƊ``zŨ2 >;ILrPnF}3S3U"9eʃJ#vOܰns8:+kٵM̼k6yDϼ<[8ntc!B^;D$ΖK%bMѫ0ż+:xDe;* ZdQS)nQa6ecdGei d;(SdBvPe q@JM=8C{*Ď}bXPq^#|rX!Gg׊'ov]~,@, `9 u 8;T+¬8$ N?DPgYߪ!1k:qDV/CdRadG7=iMT_XliepY^T۴aƹyJj8l-IuL v\R&Zp?7(|\ =TەM!#}bktltoɬw a#6YgC%@=ar U|xtγ./5odARu\B/޶{Le| zyjYX]u)ӁcxUl>>(^k܇7 M֟TIŵdj݆RIςn-],]}xtb]8 7]vuRu_̔E-ԠCn_&@=~a UIѴ}TUsJm(A*>N`C^0bJpo^L։.OxA?̖;=[v{*/\Fgr=9֧.&temcEޖX??dFA2 C^J20 K q6a?p0dP_GI,yI=qv`pUn:]j'K;e:+xǤnLS%"T9eKiiO^z+ٷu*7n~f% ;^D_ݮ+8dqn@v H5,VO\ 3r:' Q¬) |0{ EN (x*88Nx'8' yFr`KpVѷe`Ƞ?':T uxqt2hw">kZXpi*aPbof'<\tvy@*׫;PcǛn/~v3!xbx$ I< '| u>>R}Irvٯ&Ο" @i1Ϡ1#* 1 ^#90KK`He Nx '<H6p /H .v 2-󾊊 &`Ƞ~0X?9bӋϻNo~ڑz`k-o g@U nKa8u_n 10=i@]~q({P }IAQN3lj졹 w`nQ_EJzlœA^/Q v}hm = זy_ӱ#*@ `Ƞ~0P3>\Ͼq1%Tml3{ qb@+1pKou$M>&)s=OџD]8n}<ܰ?Y S->vv>j YטyyCgiC!쿋vnV)[R qs}7.M=Í u%^[Ч$#p6^ۉG 2BZ/gnoH(;HM* æ#G ufnġ=} 7c0w.4& sy?$ o9PWs9)`Ȣ^[[O'6Âduu!€uМnX5k:Hws%Ū ;[̽?'&ngc]⁵7+%YgdP, Pc!ѯ$o`!x5Q<շ^:eh-2&̝d8'=b%t0?r\ݥ0 ?9ֲ ]yB_Xf97vbE+{1ϩCp!@_Irm]vO7sz0,wWф!?m 2ºN%sy(zo*J`ȢN#:\gcWE}Ha0:`NGw>|d~91ҟsqYEM;+% U"Kov~Ё%) q_*wPt^w~ 5& 1NP >7pM`AMPA}?X_M 3HQcCy)+\*v2p{Pcza{fq?0wtε}z}q 'oC `,`*0ϏxoaIxlV0ЇN^]JX.hD ߯*n5]S7[7OB dਂcgv^Flc ? {RbumHT2~3=/#%߉0ϫPE}DaP6:XNWGG{d:2~$-C W@:9@'s@`Umǘ8oEOA#F6xҰ?N]4c g@Y3"@}-I96Flj UTOzuvŒYPE}Da`uEXg{kXQT* 8(u҇3*ϒE_q2APkM=#(趜؞:螿#{]#FW3so;([ ' 3.n2@}?w LN[ U'8zVpLeS'ƀ1 56`nn!0TQ/P] ^mnw UW֬*c)wDHVg5Q,='gR@q:A?z6X6&1${M {ȼ`u; l{9x%ق;tتrV ?_|R@(NckKPE}B! :`NG3JX>2O?U5Yc$d+;:`E=`đϑ2qg?N=Q%& s;0 tkB@Nd&QJ}\T~״}_($%`uМ}|xPJm9..nק_5z8U&S_G+0;qxSk#NCun "dF&JB #R*yѦc?uYPE}?Cӊ(&.wR Op{ogwm3-U) & gn03N@0G+_θү56 !U@N1{_}HP?p[m[Rw6P_0Զ6됪u[IAΜyW6D= _ڶ3vXGbp &{1}qZ4ifuX $~um׼ x$-? gb[i:x =vv;'֏up19ʃA@-V=AۡF&SߓL4x:XNW~u۞Uw_cXN߅4>YNŷX9 uU5 m[k)3poqXycHMzm粻KJYAfb>+G3s/<0ڔ~׼Dd׏Ig; ,57x Ux gC)y@|s sTA@ah{[ Uя4h:`Ngxb0b˂XX*|qף].\&ܷz;ad1`h]#): rJz1>(to* ȱp;g\/%xMɃ upD#G_[|#Y2׋?Is߯,v~v߉N8#N,MW e*v_ Uѯ4?ԁ2ڿ{[v쯁?_\&o+e u$ \. \f/\p&+Q*Oy0p_gf$_ Y׈eI'BڍF (w.Љ]Z_L3@6Խi&u7utQ4a[YAK @*ↀLb7SWe linֽ _f'v,k2 yܦx uco`#*apU9=`nm U"h& p:eXM*z|?p%" U*IF"u5^xӯ n|Buq?3uyN3p%ӳ Y׈eKn:ٸF ֦Γڬ)x韓;Ȯ~jtGz]Gϐ$(|yS#ĠEAX=$(0T 6J5ALZ0N0o5?. ?$ h TѪfS?GĠo?|kc /3̈́^C)u ?Ip&`ȢF,m 8lo@*+v<'l|Z\Xt]b|qs.>]OCcKdpPPxmg֋_m1í `wfbRΝ,NA@7a</kpo%M)Fg%-A'#y 2?$:vK'@UGUtNybI?7l%_C7iNf3A{fjN0"/n3=rzYK6=jG(º6ܡ~]t+*hOzf/](ھ9y}vCy[t-*nl&EϠԭwI"t!~eCi#YIfX+k?:suUH[XR߭c _l`Nx i!;[=@m97,,k2 yԭ[7$ 'FM'f-+_<~غwaǑ3YvK.&0TQC߯Sb1[p oAޅ 6uD*> 3\GnjE ^©G30N`f !B^A0@9;P+U$߿LlرU쫮t3ws)^yR] G?sœ.3?Tr#|ӏI58[>OA?+k>.;%n|F]yQ8ȷT8-["x֨;4ǟM2AP?} l%ro,k2 yN85@ZpbosSMkSc :!=d3/X߾ԔXz`}LF}9]oх7an"0TڰMJk1ǯ$NY?@9= %vro ,pۭYuiCmtm[sӠ{w*{_O%6ڡD7#\V~e9 {L _aӬ9k` A7`C@o7@]L{ڵj+Ǥn615> @=GeSAxfA; n0dQ_#Y ථ}[G/% : (?V=PfZ6P߶YiP\L}4B"x u Cp?zkDɒLYz)}/qof`m@T`^E^T na7Vǟ}J쫮HT{V?h}nuƭQ?~?kPXi*Q{ZDү c_&q# 0 F_J&Z…{ s Q^~E!AMb]KLd_[u/uCY q̳ :Jy*\ %|n-o(;伯5vt}p0TQ?oAlXYB\L@@Zhš/6ep xS{-̺_Q+ uݲC2`*?p?O_;mYo12iQ~!H[eONLmz2{oUyms=IO1uuJ;clkV[:} O g/45 }~}<H%ȸk/5k1 `HyzK.C=c+fϟ UOh$@ݬlfcmcA gmSz==z= AܑB`_sYg[Aoq3@]&򳧞H_:vڏ*]D׬[^ϩ[鷳D9Z3~y `s}\?|`lFiKD+nn<A娆i(\({W(>fYvLP7I&ЏZGS Osǽ^8(?OlڳC 58cZ|[мŠ9SFţA~?(#p1JPבTLz^/bmbUbYRA/{'}nhLY̮mR`ڒڐQK^ϪNf=Ԭkh3sofy$}{ŲU] |UO. c ktPMP枦Gt<ND*C|̛_PMP#& GےjVލ7A0Q8T9Ƴ,iA߀n[a.cGt썕۸k6uKw%Tj05^L,*}ج97 v.{c."$ūKy*޴y\N,wngd>'1Kt"u}#$_WH NT /@iсOvQ Xö="gH#)cƝ;:&Lֻ7̳D:X't f^] a@@nbƀ뭳$f0  )4-vt<7h KR2AJ1R?`a$syRI3$N:/Yb72rZA&sIw-% =Q)P@i @dV!+&F;p[ #*@}F!.ld{= ˁ=UbżHD~t7 ͻ?`g'fN|b2 :g IpΥ`' *%`{gl:w^_qZStR5'!8`@(]5W].G"~ TWW_@ @~sR3k3``5#( e  $>xx|zkvn‡̔y|ÿ~kJ׉Yw%yz@?5{~c־a,; FO4)U$xBP([SlZD#$@z2w蘪@խ0sc_Eyc}%0E^d N' L4}r`zu} q{P*ʧ=mn'ڲw'yث 7+;3)n&t:L&Q={`m97, >ϯOMͺ(8 ( 4aKUWu[7w!͛)&.nD<5Υ G0g#jG9xV9:}l}bƢ9P+]͍#RuIp (pC$PML]0zg0'Q+\ uhT.3bm uS@{Hktw__ Nd& uXgK&yQL 'pxrFw߱)iϙ$sg3q uM7 D'roéסX_3՘H/ (-@SO6+11 'Al c N#:ֳ4o J,;wr`R_d0NL.SALsav={-+zD̸sV? "{hN%mYt+.&0Ϡl;D7꒨`+38g)G^7hуʃ NfB@꺎lIp) h&R`BCub!I` ue /C }Ķ/{-0ٸN,_J,x`]L. ? 'g @30'Q]}]¶zV:;n<ΕFnLLtdjW6ԾU&8 O\ u5Va%׾]n]v ) ,z$ЛH[Q`;SLYX,Mond۵wA?u 'NL{۱8:<@6@}X"/4u:I丙xtKGuG¥Ngg?Mp) Ju2~c3 10Ei#E+:6c@^'@]3faiYvR^ϼNR Љ<ȑO4}zqz'k'}>vpt|vw{`_km}e1tp1rkN`iV?fx+ـ LBtLwh@w`loL3p0Q=Qr> ͳƐMP_/&WeytP2vzh oW5yl`29 OO]=P׾}%=`=c)0|5 { rnx7A}Xb$>Frs1nZ'iq;-G'oޭ~< ƭ=rMZX-cni z4DmWؚAlZ1C]>; J GTeSxb bk!n'cDs`Ƞ,G "F90cqi׉%@];3d$x&_ʦlM67I3H3# $SDH;ۀ n`7`:;I܀sр$9m3/{hz{yE̿ /5w;4pdA0iy#L/p޵{|v@\7˥X8p`F3=*ϝKM[i79F|[~D?}VG/ Ǜp@٢WDTDz0ljPǢ m_\Ц/%E~հ #n8@3flM1wNt.$CX{~FAf/ 6/Vb@"7շ : I< 0 Ǜp@qPWDL,`*`â ׄ/+vr'Idd~D@ppX3&`fl1uyZЎĈ^__Y*lb5 gOn40@\Y#bK`:hD`w9~`ܴ_ D2Bk1?e@a%l󍅜/A.aDzl1hwݾot'M œ! 0Lp ۴؁Hik -o' RΜ} gF&{AT'81m&ϛ#UP'_sAmAȈc7H BƠu{;L1"Lių! 0 _+8mXPcwAW]PSi zt-Ch>֑e-MLl (KFL u@T'<sapGh|DQݍ(ÛnF?GȈ| nW">/\e?S{k̿B`@0۬Igmm&9P_aݩ HE;Ɩ7]_Fq"_ǘpb`^!yh;I=N5hH3;pT!M=GFya|ߔwѱ}< \PM\u{ш@NK :V//(P@\ p ( AaF(`^Qӡ[ H5~k}ؚ5GM-MLl=(+$%M:3 {_KLlđQƷA4?&{=~l6;" Yv-?/0Fژ9`HA7Xﺽp-x;B` ( BP@`@ A&algNnjh0J8q4yelZűO ؚ P+$e4 Bl3l{6h̐i{놌{pxGy0PQ.2$A>xh<:xM;JDfk(,) ?V} u )zD[!˴hg4t! 0$ixԝ5ځ !br]`kJdT t>韈(#@UaX@k''sUAoCv. [cN1hӻfڗbP$X$h)X-Hz ul㶙c'[mOH81h]It(``Q`P 7 N{9@plsa9[TJ*z Ug2-!S[@~4S{ :h}A*"v 3>y ]z9$ .P> j㱗{r1׺@ Tb8~w;rqdUh]SNG0A x(;RNJp "<|05gu8a5]i|B  8i|O}x䎡! P-oUe FQi?*`*`k@0"Q01 =Vv1~ ӣU( xGbg}{0h~wN4E\?0U(U0XsgnF-! P`%E6=b{OƗLl$+oUe,F`CXKN{IH< `*`@Ly_)(Y2>64| .]s_ <P\A/):D@۔80؎(G[<Y5;MASݩ6tw}}NHs2S[+D0<׳x`tK llّM5`?, ͉ ) v$ӿPHc1$`{e6Ξ5m&{'ZQ0(_6nmEz*-&fH>M?ρꖖ^^{I MM=V{ 4= @HV%c]+R>~0B@C0.>adcP廟/G:ΟS%$trjY-2" x-Q19@09XD Xjz; mёT\v ǎp _D&o`G;d@g c!KswEN9/_0uL4yV |1Qӯb1U9?' ؚ!PkL2T/N k6Į@@d07 ?cx=lUIh>V6CVz4ɟwNo'Ys|b9KYaߝvͪ/%in'(_N%Av{?5[LbBNX3}  lr)k=>;1hF miwbk =!޷tC㪼+'2 gOkwZ~+ lCqbkGw>+*A_wrQPb4[n,g㻐̺ETaDIh`mz?U!|&@y^S{|wbMOtNo ġ Faj6~@WWʥ!w81AnWwDܵV`PZXZ_ܷ?qw^:L``P ||OT֐Ub͸<};f 9o%}=S[C=$*&m(| zKF&Ġ[蚝hV{} JJl`G~@Ȗ|v3>/xpW>)MCd} s3"L*nL)5NSoؾ& g,`*`눰@Dt@Ua[ x\9' `*`N g]'$1!R{{ίLџj<H,iӫ[nl]G;+)QJxЁ|ٝk3`w8ZftKD PFP¯(VςL-̱_!зؚ"P<ܐQP0=?}=^~=C;^s4˅0AwBOˊL LqJ䗼ݷ8,0DxuO61{k=;Ck*&rz{wi?+@-9sXwSo-/g6V Q`f‹q<~ x&Q0sЭht zuhNjàL@N  8 K ̶ D? ];7pߺ``|i e-@, 3w<|b`q#Q<2@b]GpTAG/ԉa}rV@" cEx'i2?}.\ ' l%eþUfZi~@:4?y]mrYs;_⏮_g-LJf'j{˽TLώ_:r72*s3~: oI Q3U5FXxG]P S{op=C;^PEŠa`TQ 46DC^xU̿4QӠ [,``k͍dggCE䲕x-9/~ߑH 9Sz cExCzZvVQ {U]0U*Upq`u$ 0Xmc1w"K=њ쫫m|!3 RFnS[on×S3c @bk47ܖ#oż ETa@qRPPbJnگL" @wieYnR+@Dlw:L@"`}=FM,U2L.5-G@7U;PWdECI88vɤ@Q{Gi`rL" @=x11CjF[(Pٴw:L@"cD5Kyо6{qkڒx;+3 Z.``-'xH_zߺUˌ|k!3V}Ui?P@+(+)Ť`L" @?:tZ+ Šے(^xKiN X  $?(fxm 3WEM;WM>.'4`*etdyXUl|gkl~iƖW^[^ޡ=fcjwGN(x#+P̿_v X JMe+OzZW>aFŠ٫Kld)L% ܇䗼ݷ8,0t 07BQPu 8Kc6|(߇vT*& @py7LjbW?+S[qr H9"ndLq"܃AD@y^VW%C 6߰Y^˖hM\_zZ PFW"``+g3^ve +0UGP@t45!ж"#(  W{o{[<Y29O`Q T4;>=^B'I Zlf2 PF7 ^&W<do:$ZVgsLl e4фYz%P AB$ ^x->%Xmr KY *غs /l 3K~?) ks|@AВ߉~ g;8R\^l<S{oxZ_jpˌ7f*D~)p'IH.)(~P=H|@2!2Ɓwp0OD%ewPRU;CT'F1uz=,_=^B /yoAqX@⃇ @0?( s#3C22(NTX7TDz2UNj6?Oˋ]ӫh BF/Ӑ.U7*c Lp]3 na L'_!Ϳb/`km8?+ 0[_5 ;KǢ<'S{oZ.Qto.:͉ђCB|Cu -]q6H>[P\% $>Xp^{Lan `~cǏ| e1[Wu DJkXGiYzm{i$*<&`*`v*>3 {XTT|9r`K>+ߑh;?[O^@n&+L&γ^-a-"n(T/T72uߐ uڑ*A]u ڻr-{xf @G|@Mil3e>B/{an6 g>,#ԟ:*}JbwuK`2e Ϳj#zĝ I!cjtNVk]8iGJU =H{ lXm@36#б#yid^pUh<~-6;g?P_aM[M `&4K<2_ ni 9e]7L5a"=Qa99P0)ԃ=^}p˶j3 {_K uڑUO#LqKR PZ<̲GWH`43/<pS}`k'Y̗'>~cMˍ;r(u~WW uCS$ӝ=^}֧Һ0?Pۺ#Sz*2?\TT  ・0w "O/}ˍEl^R6/X,v|J^8z0sqכ684[$ lq'\H&lڊ}od}ӄѿA$ a/?eac4S{o0LT;Cn*aN;rZ%\_HH>%%&{Y`#/<C!2a_=7;sw3>-|n;` LcY3>1~F@~&~ZMN{DOc0I",hOsA%_!ê+}k`㝹%_SPդI;ܡ y(^n|lLߕ-|y<^>?y+ZS[GɈ@(~FIVn/W6Fb/;])/o 23>gߴ1OOu)`*`zFn; ͿЮU|"ߙ+L~2ihƏ>2rjdi|ӎySJ?fT^|}d|HV>,7ݛ~x] f}M[ w;Ղ͌4SO0 `@ɔfNӄC=*Ր%3 { ,hI,q;HSz6.Ye+vpI1]Hc'M=J]3 `ˆ`H@ %/k*bl5 L޽ fiY^`o@[=M&hpQOs5LO"`*`Z}Jiv&PݖZTT#r[D@@? @QtCoHWZ`?n :\@- $n/E9=Wۿ3:N/i}P(QEԧk(%E}`@; @m@=@oat;nmF7Ft΁tZHI@Ѣ<󨀩=^whzZ_06DEV(н+&z'``_*tۡSc=26v#[by@Pggq:q4T}("jt?xkVZgJ8@qX8#Sr~%`*`ZmJQ* 0үO~1xMC@Ϳ#ln7Ϣy@R8yy Ԗ@bW 4m5mm"PD-. 輡jfOh/ B=ާ;ImJfĪM=~N-F@)5֣y@Pg460$.$'"U=.LNoi}H@ivKXզd];Լ4VsVsT@~Fr$۔;H[RD#*t .Z!pC @UOF{{KMNxZ_: O+\$LhSr`rH5* -(M-)w/KjO|NT(`{ vm!`G09 xxZ_6NS@UA@S{WjSn;`wV'z|6t@0yH`x8~l3AF GSW``{#x\O3j Chp LKL"\Kɗ ?n` UնԺu:"xOaKt7_%z<?@cqیcQ{e_]-ik6Lp.2 Pze0~6"ݺfD F$`*`:]J~ 5ˋZ#S{Uu:pt7 Hs#7ʡL 5tB[lco6ź@6"mzz/5p75Լ-0KIh`t ao=8fvzxnll x87JukSm<3ئުBo("f~vQC&m4E8 @>z(e EN`֕TВ5f#ñ_`o1t3ou;)Say'A#46Vx@1UOs $3 {VuWt0@k>)d<{=^t)Y  h0`Wӿ[;wñ_4;h8{Z[WmPTE$@KPME8oP@8@ORnRג l5L=<Y0lx8K؆ۍ?}P *UD@P=E=5X`?pޟ+h PZaQ`S0Ñ_4 PtP@D*AF( l V4 [Ͷ[jkީdϓQU 9vUo0Unj.?UL1#\KɯLmZY\I{#*WFp䗴P` x mP@nP`p3G[ M GL싄4?#ӿxGLlsPS@ z2?}!mF5)4^nH{=-``ecgE5 9ܮ?s]תrpK F*A;MNxZ_6NdFao FBgyjR{3UhBӟ= 6ئšg7̐}s 韸Jݩ6tmg>7 aT2^x/^Nӄ"֗4NwA$f(4o5:1CS{, :c˓;W ~l 9>%s,t inD׷3 }Et#:NK,w*|AoksiN X&;tƖ'mEBλclM '٠!@EXԴR@D0ULPD^iԼ3 >}=n%\fa`gC@glyҗjp'66`c+&^ Cd ^޿c!;AmiBסp~!37{ /&=fwxZ3%@yꯞܷ_2oh_A&X_<WMdsyV1?P_5kw0<wF'Sx:*/NJχs%}Ll]7KMC=,``]zO볊n$vګ6@#H`6^#S{L :cU zNXEQű1 QeKbKߕ !/샠"uR{9s %emq^w( O("n+2mjh) z- z3 w@@g,{"Wp}}^rYQ7'M&AWEOg|}t2[ONa?yF# zWfqJs]'-+- &t(`*`GI\`%L}XD`4?cc˻≊kyبPT5sny{wq&%2PaojPQ _V6N#ڶJeХ;B~u 2ROS[@("Wd.+6}FakU{S_t(*+"=- uOOaFnR>UTdX$@FD韟W<(_f-MOūeQyw_C77*u*pS}nmV6![wǕ_6"<2;:AlVƌEs]Wy?iV۷g_yoye_9 |՚GV9s1#V1 ז`{ѵB%#``띸 ^\`E/"huv[aY@wVSn$( Ҩ0O&X$zf~A78lN&<n]yry\k}*}[-Uyi>yF%Y!$|IuE MS@Aﰀ=nhot>!eh &"%S{L :cɓV {~'tTbw]ڣ|ư! VT>4bck<ro l/?9E~w5^eE$*4Ǜ:v?4ehN a`ЬO_JL ;hyWd`I;PoviVFIX$?aЯF7d\0UNtPH9HWh:4a'[K&3UǏ@AͿd;@A;3=0(.mXK{v%W5<;?S|f BLu8F;ּzOdY1jg7g^Ʒ٥i}omu4d=٭b\D/($.19Zyg53%N3 {Z.M~Hd/MktbG &3tƲ'a{v(͹;wkCV{2}^4Q9  gO^āig*ܡ]L_ zDMOy֙vxbMu\igFE#n7Q煀= ɀ!d!#~tz&u/<_ܷ9~yk}eP7.06,׍ 5`8pJ"5xӎkiP׋=5G9[duV"3?e/UćvSr~ML ;|C`zAH~4y`p@LoL|(Oh ׎`E_r1zbz߿$+䙻2[nv?GV~{viA@ݩ, 3 eP0lܨVпTT7@!^9)p99㏴Δo֑EФ?6kfGTdBBE+` ȏ>a֏l5vi 8`+``k ^9D0)S{x_fq@_6M4ת*4S :c,*]NNdv9dt]̠4 @y\;gf,@AD}>5OTHeߓD t`BN k ,h֑y=[h #}fC@gl}r!?ZiΝ{dݓ |y]Z}`*볾@xVh@nmN)״5kf~2|@~M$0 ;v[{rd=^YN3\` }=. fjL^0U5Y3!,)ӌ6rGnF7;1ISa3( @<*-6KYA>zG̿[0UuLPHk<(}3d)lPU`ZF z *㚬PG~˂#V0.55mzh#(+쮻5 KD|VANĬ ;YN7_ J2>eO 6?;PmFޖT\ߢ.-P~ೂ-VcN<K9fObG1YūװOo}F;6/̰AlNTlNij46My~`z&]2T[ɡ *㚬PGZbL+ d۵Dh/8j0 :3"U@$.}VoXcjyN-lw? V}ʗc[>" v NE8.O =Lv ``kB@gB4^60VhBۿyWˆ(H +2kS'y|oyeGx2ufgC}䲨Al_NTlG0yR ` :u:^>Z&]H`e*La%wx V@?.y΍"D;ZGa EX ^ F W,^|ګZ0Ⱥ•x٬i|P`tc6 VwKV(?> 5E?%*6+"6*4.[2?}XKMڌۚR&etMF( /m7/ Yb |בC~0y翸 o-0 _9Za~>Pwkеm` >#fڋإ3w}F5.gy 5I("5a`rԼ'!=ѩ/:@Hq;Q?N^R.3Y2=?}:-f(&O[fLIthI3 ٨uA|Kj=mi:^ws2W,+?L{W]7e}lEqbzӲpw @^/S˿3L N^hvg4C hvᥣ[L?ȅYզw ?AJ; d;l8NM[ I5-weŬ5HAzS_tBG'2HZS{< uuFZ)iV V4_z{1 љrV@WC1ijN}_sa+(dO0c!O5m-_0uR/\0l=y K+Y[`k0Hxwl)hOtNܴ x_9,)u8Kñ=i / Vǟyi;n49]n6j ىEMnR{B*|)lMy )#??--}̊[wqEDFbs=g.d)pH@5@Y8 xFkU\kGeOh+k[kD ǖO3VmzO?r_C4hr˸uמhWKD. <[S^t+l߱`O2ھ Vz#(" 8 .bB=0Uǔp\=wYUq/ V $pd(*v,R=kuk /5so \9^bV:#PD$*87_`w =NŮ`BN k.#ZkmX P`ǎUk9KX ڔA?ʡ3_pwv?d[ BnRqrO]'c`+{r|3sidV"PDHTp(4d-%F#{:ӴŹs-MN-L8*KGaV䦝= 4|t3|ޝ|sVEsR7l p#Vyf.]`G9ܸQ:B:e@X|M/ ?o D?)W߿SsRFN~a{0a-"b@E~=;{V0r- R 6 :vjd@MODuk#~|DžYVL#L0)iE6]NN&̿ drYρOP#'> ,[`k@1Չ`j^{  z=/R >KFnWX \ 4[mc8vUN=]ɋj6}njgas@dX_³-/Դc? n?_}. {G^77S򬰿؟'ޥ~|GN΍i5?JnU~El'pw 8ퟩ*hs)F#ЮUk#vԝljWXq>؆p?>hP5., }SX >^~\@|{ZnάH\*_yp?}ekœ0VZ!PD,q"N1D<T0UǖpTs 6,gqf(4oǴ#jhJw9,_ mr@Dcx2^>Z/Xq_)|3e ҇Whf$c@ f( b(ryDORiK+'{=&|*/x8ܰ[OSu_pe@V^x}Y g`_^Zp<5 3w=\E&9д. @V6Uv呞L%z#} ڻV|YWkU?Ǣ̩tsyQPtߑaFOF7vq[[T>=i[v ~;8.HD0K>4V^2 keA2kl k4-jz*C0  6F2!Ss/[h~62oܱݠ;.cr1N\Kw17Ǟp"S(PC֘ZS+^ i0UǗpT X,I'jP x!A`,䆁 fqa03}~7)G Il_7{'C3z4Dm[{-N呞!ӡiZ4:UC@5:g=1 p1^v*=;!ʮi]K/RF g&iҪk5C@"fثҬ-u[%eLq=;c,M8nᦆCe70Q0V$*ŦU` xXqC0rm RF JQKU3h#@j=?`{5m7cw뾦#  T6 0O.#=Vm$J@5ѻd`aOPCeg [!Ÿ r6 &oRlԥŵ@Am4qV3lR7xOY5y^'ͷ8xe lSo6 P)6+- FMKJ]]Uo)@Ynmz-MZ] 0 Ο凛M]GUk€aF^>oP `9^6X,+.Ajaס3koax+w녙4lXr-f^G3 {_T>x9XԴy;  t M{L OY2m!{ GAڦve5( f?4qmiRNk)tA~lIQ|}2z9,ϛP@LP zYVXGz/u(uaPL@_s5O_H3\ b0ٚO =*wם:ךLC.KۄcSd !%@9=[ *f Sr 1%\ew*R R^/aTDz0UPLP o@,P@x 5C@,&`.IOVdm94^T>\|\#܊\R;#c+x`r!;LNӄ;Ч-O=a٦W iFzK?B:PP@ dkP@8^?vT5؆!9l+A2P00O_![Wn爅m9pS}GPP4lv:AS3l=Ƅw{ `x t,aHV^ 5mB7߀ [W^kWW{PsL? Db.^Pמ ǖ^`oaP $X$h)X-HSyЃ9ZadEPy?z rMl B9H xs:w91S{z50'c~_s/ :A۱`CS'l!?hl8yrCZG[u@}{ "1JPaqPU;,`PǕp`%Mb㙌AEǿ 9AD4W0_o4 *ŸrbxcD$ N֦U}_ M8#/Q$Uw0U8 (k3 !1$W{:Wek3ΪC@(J:;^-=kZэDp[[})3ub5yDlx /.w%S@7*ߎ`^kPǖp^ǎ^1Kf lǿ]mF-!@GdX>_qVKÊm$ kA|1 X'V[ ֎9Pk߱&`` b(4z]`->`}:`[D$p@x~`FpR%2Xռmh55mf]g42C1np97cv[3^@}&zJS&@@Լ' KXx-T`aAo&y*r4b7@)Gm:HFdZgv.sCހpVfH^>rfx@pVPNA[½x!#=x%TVL!@o̿OF\^$HV875T-_ouR ։b+(k\-``$> x & `Pǖp7ndžpn'#_(']a0DƩ `6QTB7ɎZIT7A1;Ug89 `1˰ENk԰k]TItP>Jϳxz,N>3g1>~Tw>r\/Y{E{}yKgL?Dg2@2kЭ7 % +3Nۇg6"v ^3jtC miϾo!  { olf ҟ?^nLRiacGcx^Ɯ! x[m3Nc l)flMk-pCfܪۚkoF7ayG؈yGͽ?5BuNȐc*Lͥ*HKpHfC=Aan46'``sl3'[zŚ@ y]^, #'<A;XwP3"|19;tyTRKGXc6-E&P'Q;$`PǙ  #u>_|1m*~ukrntt9=Z ACWC /T s|om&k鋜}md۞]``41P8=l W q& R%h&6_+0_>Ҥ!7S'Ļ'b1t/N^jts}h'?q:92\y%FHs:Aѽ <40U:F @Ȟ2?}Ag  Q1<+,0t >1@zw52c\[ bo^?wן>ɏhC7a FpZs䣛.dsACJ>iF9bzm=)d29 YK^y 7 >Bm *+`Pǚ  @;cs!US3gB ߅wkk}Eg] A˜-7(T}?_ZV_2ȌKgFM,s-OC|wwq{׏{'+te`]go~ S (ݖoa M|M~[X,_}Mw:߱of8@UkG7\~:3*3tş׏3OVLNGOGN(Ѿ.[ D/g . 'Z ROo\))WNSL3 /{t^skgBa[8s_=Vo(z@ 9Sr~'`Pǚ ~LqQ$L L i5>4S&\|Zm35mXVÞuŰGzWt ?Ǚp'wYZDbv{8aGi6h;bT_(L4jS5_'Ь[$I`d\͟a9Xy}sw};6l{4'zbe7O̗"JK3/er3?d59L7if}Dcy*hrmfV䖍|%|Aj73$E@hP͖`R{ k?U H*$Yr0_<GU FZnjaL;|+;u=5G4CoĜp0浶HrW0P_;O u:.mZgZVK|\>tHm6ĤSyY/K~xr5l:g߻ИtF27A+**0Uxdt$`Pǚ0OR =OR IPd yoa nԪ+׾w5ԦrǬm&*7u6y7WTsnts̠k;+ /F ul*[ BY3 V;m!{@$4m2og<(?Xx;E,wb#^w7KJUPP)읢b/ X²-n6wwzrzz $lv2y(2 !eOF $@KTo>`@$%?5w/6,Ԇ?aa {J.y`1aܹfaAe]HѼ5%#,xH=+?G_xכν^uVJC^RP* I+@?YIxOV $@sY9<A Nh5Ʒ!{`ӌ8~;BV./a 3"9Sr +'%Ͼ+%|{@ QCHh3ȲW{of[fryi9kVlb)hCK; $Vxo;j?ɅZOf $I@s@$< ~Eg9$ܷqtZ LJnvhVxrCUu*ɬE󹇤!*} fKcWoXK^}CRrݚfrOɘX/KAs e fX1 c.`#ROv $@r)' @ _@$$ZC;. ;KK m\ODY3Tv]~{dCk- -Ə!zJorm:0gxc5&̙Bnu~Q;m׃p>-+sJN"xQ Z`U WBmL _vqZc|$ոƒ{.WO@W届I˶G7i_~:m<0kwEոudC^zâroO%7q}?I1̀0&_u CYsL;H\!Hd!@Q ! #1݁ *Ju2oM;XX3\PKuGj\=>Kw ;18e>`ﭔ~ɀ5*ʝ E[Ad 졦 e}J\/ M@H$@`c&9_NRUg\e&{ޡjgL o|~ㆷW5'+(#N@";G$ZQHic5|û+@~5Xzh`xU1 x%ث1~O'P mEІ@_,n~e՘1)p?AeЄyK*L8|g<{S G dI$I?77\ ˜SU+8Iį!p Ex ^<rCDc&f5=O 7~Z23kyw}%"i P[ ȟɔX:D0k X}0ޜr֎inr)kR{B#q4SOO͂D賶H]{iköOCH MvlW?kF'v!5 <ۃlW4VߟBޞ:1eyu`u@~>ܞ䉜ɣY7@݅HhOV:#KS&ܕ+Y 8WܳN{ɷ^ gdy=!L ? D9 A/kL4 s;g{#rDޤ殮uX dIy2&CM''%cɨL2vl=Be 2=ԴndFj2gdv_A*M$hZ0 gMV S4*gO&X`1V@qbl^6a x ,tVPO">v՝?r(O,Z0 g r4bìy6':0*xקU7Yܙ ycR*-ߜZ:;-ȡ`h`Tg9G B _FCpme wڵduz;r_fGnS#@H]Z&v̜Z;ov](xJ(chwȡ}L0 _gc>ܿJ3S:d&9FƎI s Y$@" 3Uۡ0wiC%K)E7rGe|ly7?N>(,'U~E^}-{i ;mx1aўc[_Wz[ r]r؇D+xTh!0<6='s#dvLڄGK= c`Ls^_+@7&Ғ ͉-{;<[Wۻ rȾ udY5 wТ׏*?'^&ya\_Y(X^N٬@+` #$@s}dZrϘ<&Nj@h?ʐCt$o`2.?Bj{g2+=W!#Jx)s1ЦM99X? 7Y(0~% *}0=uޫneg2#ށ șO5s-򒋴grh`w )S 't)¤#˻dUiY+;E]z gYlJăA dMz'=eшepw5dU(xh dce:q ym9̯"=*r7A||Բ X aCy+(ft ӺʢJƤ ؅?-7̛(i]">.rz&[#oU LMlڻS3>5$<1ܼ0J~m10aNdY+8&$I͊^/515E*xנB=A+@F#NY7 \C6Cxe 9#_OXE1pHn8\NO;ԟߝSF~c6qرW=!ޜ?臗|vd#OKӇ<6A~ = h5ؘidT($5wЇA_oy#F{ v&=ܜow=XS4zҿo5n;95tC:K: K @b{j& &N͐ $<1  Ɍ?+ ޡ!O&z)c" =/}l:37tu9W:6}$ajC+xמ@ z*= ah&V7-4޴Δ# w@p'KyɊ4!=,b!0L)!gGJ?S{Ϊg %~yHܙwt+k54f鑙O&Z]M  X$ J𿵕@%@9k?A~h KzI `q z8Pd;pP]s04,n# a N2!dnDp#{uPAdssg;4zݛ<6.NQ;Hl&LOK۵˘|)<QIq#tI%Gf){갞qSĿHP+BÔ] ݁gcCC`<Y_  '0@=py@EWΖ10d;!VXxJfXg@bqh z)}SZ 9oߍ S;D`X)@b z0 :F`+hN A zxvHw@>wxHt^& Q#[-|E+x@ NZvڹ;w/Z+M++HZ}$=;=+''w:1bd]cah,|G:Th] N'nPSFĆAtW,Yj1^9q(NCZg0Ns!H3=| W}Ұ TL)=7p_J~YkyJcKxm5> s ^8E|0qý\t(P8 YX3e+@p}sY&<A )mұ&Ly_C7bPsg^ + zI $VxAd94{Vۆ]fkO00sh PG a-%–A="@ V>9=G`5\.K0!O .Ny<@':R p~}#O헊>˹׮ěO%ʏ. ›zUH,@'5pPbxHa(`l.zȴ7 # U[Fx%tX7A؏\=  yv@2+?L!Sy$ne/wz' >.>~6];;  }1 >l+Ү׵ă:@ _`= Z '@b ~\t !kU!#vV fxAy8dd0Q\fnV,KVPGog3@d`@ ㇞'J׹Q(?='@x ﵀ _+'+ns3?`+C=N{;/9c3<DA c Q9j %j/0^|lf%vpTAA;?0xpC"; 8"U!{@.x|@^wyW__` O%n9 Vנּ? kdń EY=~$Vx6 9O >`@ Vx B@ND# F ?p <FO!>ߐh1U`Ќ$@[7r,DP QCj- ^04F"7Wܞ@bjl3 {; 8%VxA@83 N 27h42-b,Jv+ ̟O=_`; $طo_9'@5ᵕWs >dIN_ ZR&V;T@|yV r!(v)P qhSP#۹- f?0xpC;S@M`. AYjoo!vѺ=%x{AHx-ި0+_]eZ -@8n^!(`9ȫ32n^߮ox,7y1{.յߘ}^Mw\gFX#P< J)?&&&|  Ӱ3U& xpCF!0!B!Hf h7 SQ C7Zr@ohZ 餺b|_ N/0 M ]vxG<Ă!< U0 #H"C0U'GA"&BK)5@G@ϱEa}_<7B @l Gn @2#V!@s!v%n'cT؏ .۞"m:k>ps!{?{{x4j؇"BqmI?rϧ'@1]z} C<z 6 xgɂY'&]&j(jT LvI< ;aE+@U40iDG5Pcpc8Qa)B ޟ=;@NPO@,o!t} jojē@q+K #ڵks2(xwɂ'LBT-˳%?5a$y&N&%w]GnOmK6rr yrpxրA;zȬ [ VPFGth!M,A؉1sɜLJ楶#S%,~E̙Hn=tI͉Y@I$$\?b2ʏ@= X;ڷao,=n|k^ =>7GK, ?37]0oNv3x'mBget*HAYI/! ]O>z|dǛ/H4y䍍6$?r/yu7mmS+v;IIqZLCf9~Ә?|ƏFqUGNy d{OJp½䭝;+;>$/y7ƭ/l"+{,ݰ,c#dO5O?Gֿ<6QaX-z]8w Q4WX)~  ˸:vy vH [ k e(Z?/$_o ; a6!_Jπ㡆@]{2/?;?YѾmf߶n9mdoeySW"60t E*0ܷޚX dgc}JrdfZUFXooyͷQ^߱w 0=c@o3d  n'F ـ=*q.)*k؇P0IDCAiP hoAu yk("0yGȮ=;!TZ/q5֑C9|@p;Q6]s耳+ »VE [I3@̖ m-'%9w 0#f7EǼo={INjuـ]!ccy L8vuKTPZJ@w͊oNQM5j}P, D@޵KֿQP c߽}0O*nX Y8ؠcc3&`I\τo G?5[M>$.QiP2@Y=SkI7ִ qkҼÏ yǬOJ}k޵+%oCn8yS׿ K^_/xc$NCۻiyΙ{VWy,m%]> *`lj_^B=Y ??䪫"w޷[HZX%xw m"@Y^82_ hݺq\Evy$Zxװ_BbF-rz: &?-r6APg \}($~ LJhg),_^(ÿIl~v'.eJ sΑM)IXQO`Q/S$Zxױ o  !ʄ3I\s bʏyiO68? xo=a 5Ex7@d(0g JڷoO.f_!rhYDA!,~j7Ĩ18 |yr:'k.zsHgQB?Z@@M([,VAe 8>!Ldzlf;,#Q :UGA~Tŵ^K.ҦM_! c@1P;${#QC NVY z**μdm(PIG{ »E Q|jUAT"й]S4O Ohf{0 P ῿@HA")S :uz~%諁]#00_COrqV xM[2vpa+<ј[XBZ T Kcðl]cK³W= ϐ@ .wqy_ »"@bp<_p HJ|bew$#0 l;0i q6qL>yRG\am>RqS㱵CoWn"e3%HԿe ]M_J#Eb7\Q`F'B,<uz>)#ឆH U @Kzշʁ}ڱ8xEW]%þX<8v-p22 jΐr~J +@Y%?IA^ !}V!/ro-5p&q<4O@:$ڰܺu h q`h<+Ia#6ʜY߁ՇHU]Qz\G.;p+ȋ#%0'O/$׎_"C+U7}(fî8=J'DO6&G˛VҦMZ2mѐ,`˒f3`h<~VO/5Ha'M "bC^]W&nzxyST?<<'XibQ \^ B;`GfP|yhB?,'"89"n2noѾju !vߩ;ku2@M(Un$/Z㹸:ַVl Ur04U?"if؉veԂ ?1{89P 2gԂ6؍T[GǦ'r}V Y. $nkݺT|-nb=+"Jn7aͅSc<},,'{w}D>}9\fyfǧ飴 ?={V=%"ț ]O2dZ_}Np*"+j}v; $%@H袋h AЏ3Ǟh?$CȜar}ԍdMW[-54Q9xr@a !,@H[wעM61kBI04 @-oNvz\KzqR\U7C#Owu51O̝D|=!<$!6y'K'&wnOu<櫖-݌yi7ltGfGBVqPo&]O:>)1S$oޝ0A>l|UdF2vG)-VdQ\ a듈!̍iWyd&@BCX?!h;kB$`h<.U @w&3q"v\?i =bg]M8+}[:5|B<8ڇrz%v$ t k]w>DMk;"W⪲E{O?x{{?['/[mSk\C~ZOD:6,w$Zx׻,:ut%צOnM+*?/ UP\\ol$8+EMOKt)cs -rW^ ?xa3^Au{kV5_ @􃷥\z 3T~7tlXop/@()6}n6iwEe_謒>(.~ R>Ю}镸2e^ciݦmҸh '"xƺ "Z=\E ?A`?d|2-)"4^ :ly_@bQ @`A_C,L$Kw xF;r@n x H`κN~22oM~_u~oM1͛pu<?24OTB`Y8F5߿׿: 8U unUkKFDqQ@OO2nHF@I/E", v rx b¨ YR_+ xYmW_ H< ÿS l#9 ?$'jWAe70  | Hz@0 ="K=ѿ+|/U7]"x$ ?T V ߬g4@W-m_MPP*xƚ  nU~)Xa)? 1[(1Xuޯ] ?xۊSN ޟG ?w q< #~"I B*3H!&JDPʈuf㸱ޗHbC-b H!&? "H[E5+@2&΄%R°W++ܸvN;pێbN߰ ?A>6A1?^%CFaGnTw ) ?@CF|TW<Օ:ⱁ$ ,Jxf׿][&J៱fHF ]7CX:)DazQC/>'JndC;tL+q1 N ?Z ЦMm. cCXLT Ѐ<^-6f]-T ĩ0ze:>$!pkS?o^T d` )t{y}5~˻cljp< &v/<+W?֭[2g} ܎sWSXC##tA ~Y0R8@$($k`,._thU56@yU?_%0 = WWz$XB$!;=G I+(]DpBx|&& vn!uQcl@w ^= *X*jWAFa ğ@ (0@ NU$B7ssUZROGGgW!r=Qp+v8geyxY H!xp&\;p9B?DΝM?_X@< `hDv>cX!&XE-X$@"#> ?f`,GgW!}լ@)S Dފ 90Z9Yw^_;.Z@Bxp;V?A84WЃ;ӺuqZ( `R8߭7%")ݞ݃o: EÞH%2'Y5T@=_%2Z ^(XVpnfO^%ASy h}$聋y~~>+ORV" W!.#s=  'fÏMJ[ԿB %NkNjlu^:J["U|p8 Vnݺ?Qj))L w26&O|BІYCȢD9_0Nڵӊ"\j?b?ZpC?adOEٵ_RRPQ! NT@9A0XlK١Cf*t_mZ "c2;RB>±7h?6~[-b4"@ztE  (rhyV+vKOY ׋`/~[Y~R)(/ ]}u^o8 H|>lZ.A$\P`:vgE?elE`lP 4h5STMv i<4CZ("@F6N! N-#Bod !X9L,rH$=|PU {+']uy ćV@v 7sHX*7`ƶPl $3+>Ek 4Ex!2`+VS _!ӌ.wag7rd^73 8WIZGUg+ A%@!H# kÏг(%@r?vXA_=a6 }ޚ0!e^,4"U'+bA`8B^cqCE SQ*J=f!D s qԩ*<>;iFײ\@VccW"/V?Eq~KU,Ż#\5\KF| KIJ_j(D=nf<׿_Կ׹BP ),+c{**Ierr+cMT6ODk$U%@eOvysA) `y.k׎:C#moq (EPoZ?LqK ]7Żmhq}g !!< CF,,b',7n?_/s)`:xE*lVUC ,WWuC&4|ﱇUX/Wx_h;bTq{6~>/Z_C]0}[򗿐j? ?oZP`vk}ǶD,P W_@;ƻ.ih||sVNWȜa!?z3aALA@׿_ֿ׹B)VP -wCWX1.?Zt&.Xg7DU [2xv-)$ZW /4=WÇ5h"U !**BL;h<v*(xק  ;yKz} c [Z AGWHt r辩[ mpsFԿ;<BX òoB\GaHh>{I-ծ=*.D  B}W/Rr50&89V{B#}! #[Zv[y}#<ƹ] ii^/iInǖCY7A`('CFj.AZ(%@_k|sM0os)B~8_ a3pB?htfga_KUZlCX*E?Іojn* .@;YCwo6wWBJ {$]]4]ݯEN3Jī {w^4VLKK-::S tR41 *`sD@SRe_!u!B^ZRmp\U_/_W[@lK=* JXB5'/$Zx_Sr;,A\c ~̏){NgIE0Oc3/"\oxT[CۤUh |5t~捿B 3*`8p ppJ9EF?/kJD ! @a?(u!B~Z^Ag\a>$h'veq.j**M$Zx_&4cO>ddGw2N)$Ngp QW*,_wSآ=Q`H ]5/ B1 -r#1Ͷ#'}"f 10:y,5b h{ ،MV @!\}mUoPs`sZAw{66\uAY=h ^U,eI< 9زj9D bs\gށd?Gv/1|#JɛY{ ؝[E@ך&3v{MP Ҳ>g=NyAH`'.{s »~JЬC=ؿ7  ;^Ck9^SQ*B\`yphKIeO]U#{\܏y"1ڵkGY:у3m{$@<֞:CVE@_eQclT܎~/:--{ĵ`Ow#Y;mݣ F}E!}`+y`Qi,w"VqK+* pB!VpyH{UW"*]D sJ:\⦛o" 2sb=䩗^ ~)\^Y@xh3\g(zȫHB.PKqKq{_~w#5e;޵Fo; {h蛾FlO7 @ve~QpoB4h J:xYm8_ 7%b}ђ8_U}C\u""ԆnooX~J жm_uN: f6jlN6ɟ8A?;nYnUkא@zq0>]ED΀-r΀,I~83xZt[*c$@b}04u=ǎ[Fϙi]ww#YB g +!ЬJԿw@ *]#5"-lhS Y+C1pD*(v\Q;)cemox_9}A| .]Km8 'r9<<{s ?HSXO(@3 3;`vg}߯ذ;7Ў^ ]V'D,pm"w[I$jykZ7@ۻ[Y L yX$\U'ո/$t AޣO+n O(Us uC(促FHh8? yݏ!$Pֿ@!p-2Ri4Y.ۂuyOcu4 +WPV @9F_ #|wIVnIuw-22g|2`@2iTnaN _oĖ/>KrN^ ?I@}a6 < wTߑs=?\գwۘs| =<g;iАHpMm} %B'@!DJT8YB$BX 3Z:/hk:rkG]1/%K[-pw~Ku-3# !3"ҭ{U.r𼅫k۶-ݯoLύ+}(%@h)&)Bwmm?Tl;.x[mNeR<bpF"% y; $`bZN(PmpzW-52GFMk-[fuЁ\tE u\z? ѠS8߽5mg*nÉ(}> &K!P ¿dƪZ EH+ H1k 3]-ls@"We&j Ȁ$g bs }PYGڷoO͞lWLпŶ^z)v㍸WZ %ѢS< خNq;J87w7:5R9"UߏHG]:y`2տF ;3Z]e__}@Tr=[@{Sq.0M!PQa H> ?7wת-B=ҹkWR"ޠ{sv.2r]e0+P dZE0"a;voKEx[M"@]|(=,?@o(wM&C%x^}T5|Bw?@]2F4 U1PGWefbOXV m$Zxs>_m/ ]^w߳Zu+\xd͆ua~~.hWq5a(&xJ@O;-$0&9; *lߑ#}^ k??#GEi@3wm&z-xFh!܇GWáO;Sӕ~Fفcb­)v\j Tp7Jz& ,s+AK5c`o t=vW^y[`}g ? тQxH/|F6oS.bNXB0@;sxי]c+(%\$]F ޟ Z@, HeAP7Es;aVRYS &">+ 'L6]H>?(1s=B}HfJML#{*dK9ݡ8DeHskџ}.MG@tG9p۴ y[=纹HN p{KU,pXX:1Wݿ_!@|;;&R?"C{`LԿΓF|0^>W Ew 'ZG/=qu,wOYՂIA Bp셂BE>9hMd~f}m|Y@ߧP۵v:t \r-jСHfy~Wc*oYWP1 #|(`~Tܖ)¿@ 3ǨP,˒va~,kԺ#<PϨMn/5(n6IU(,$ZxO/^43W$:ujW_ MMuӶ̌#CG opu5PR:h:ΌA|y0\aޞs}hxw t[H rn\Ll1 셟^0s?aܝ?U-?8D E_L^j`~O5snHhg0~I0SzW0PޫP $' AvqI_k$<6Y"z{'1?{Pĥ[u?;U/QQ+bID0ޏۡD)N o|j¦!7?|A冮M!3i.×<@_(j>N_" Dx-͗@ !ùGys~#F z| GYX_n *Hi[ gS 9P[NȠӪɐ<)vUq8pDL( ?Xogd# :XDk9I]yxG *"Y> xXD@@T>߉@_ޟS4_pf裴3C+gf JA]}pVN K+8gcD[' ?ߗ<^coZ,yX>y>`(pƻ٤Y~_RU_Bs"C= n$Zx$ yn$RC銐f? тRgRl^8CpK14 NJߏgI l ?U'|z' f6o:,yX#K AVW1b7m== %Ց ?g+:8ciXDѸ楎[厴-KOn#mTH f=z4{=|lF)~LZXMBOPp;͡#wPn̮: 4^G9W"WXt3P!gaxH^>=7qu ;J쾏٥>oT7}]$Zx,| ~UZ]: A8/ffD~Q: 5) 8|ppnq~ǥ_{?hZq 0J~8K Z\L}/` WWQáFZ (Xy8#KƀcnXsxٷx׊Ӯv򲓟G-O0HGYeX8mR[Cy-KӤMKRf 띊~w7-ye%~[hL0["?_txץ@ H,hCHo hrغ+`{e xG!ܷ1S~~d:3iC8vêZӲ{ro2,&n3A=by9Re" !~fko7 S)zh X_sЇh?ӘzIj{SX_BR:{Ediud~].yIZ֥[MKGJ[ 6'D)bVrø?~5]^]=wk^?eD H4L{`gƩ`kWtyRBg}pk=jOTc==+ /Ov骒{n`/Ma(\'*_ H>i ⧗, hf ܔllܗ0!soLudn}ST-˖-;ekplK%? 8A=W̍CIϽ&l Hbp{]q7.ؘblؐB $PB ӉeݶK.Vi8@Hfsќt<gw$s=ۓhzhq+ 㣖`WM/P8kT35OA}ϩQƸGÀiw" @@Lo4i$!ݱ_r+Tiô]>q9~žCӆs2F . ?~͚5 [hxhzxq H4a~AݡDEB-N<~ h=Fj/QF(D^U3E.4L}z633d(SXв{gsj%EkE-)Csr]%N=5@#&& Q 8c0rt0k?J!,. jX; B@S 0hqS m-J-P7Ɠ,@$eN]Y&tZL:ZU&x+h Ĕgh=q Bkgbh=vf~f-cOYJK\tnZaZDBÞ4<0c89}PrҤ!Y3x)brꔡ"~R!-$ ?=%mBX%/C$ZxZ7ƒ,ҋ@ORFb{~Z Z;ϸ1wS"Yzs-eG#iI Nx92J' x)g7[:;g@wޓIHһA% (JXkiyB(0ːLVY`@x}ҥ9W/>@h(G&8 ÇSM<*p!r P`GN g_QûH&=-^!F yZls$#E=}|l{Y,&IXdGa~ 3g(/ +Lb49frpojIA6 m4)j8d8.!1RJ M>l'ol?YI=ԉ7"2z`^-+&(}|Д,@߅Z쾋#AAk8/gN͆οvD+ Q~~af! ! ځE 3`N3"0o2{MDw s|C3ȩF{gYV| خd6Ѷ҆y,7Gf$6eT(y)e]E6T|aM Bߌ^:|C! Oz 35/|_mψ3vgwE'-qa½/A떏#k'g#M Lck8 c7blX,7`~?~@bnNnPF@ \ cv2c</pAJ[2pMفzǴ?:ڸO o_ή^eW${#&}lrS߻W.9Ac7 _oaȊ$k9\Xyk U0h$pkkſ/2= x?hNPi֠{Lz/j۹KN vnDo9~aQŸ5 #wtDBwF;˯n]GN8T{m࿏\ H42xz73 `/`q9*xyIRm}? $3X@Q~{Jv#U f79mWvx ƨ$gc#hka ^HYg(v4sKm34&C#Z+j]4G~iS%GLkl$|wҥabA c^- <!ĀH1Ü ϵd_ uVj Kư7ES)!lưW`2M"dl@E@SXBJ3+`Y@kKޥ(;"!Cܙ H*߿y9o3mi$-im.Leo$ T*$n`\;y#o_M.j|ڶۀD] A2spQ攣jh84<;` ` }0Br$N. F #.ۅ`➆@HP?loϔQ[̎;4tXg_}/޼䈑IC`YÞ;5;ȟkh=&k 6#OBg`0*#OBg` @D] s 4oQKµ/ѥdo ]o~XD`F](v͋$ݩڎPE>@;\Z:wZ9TTnzwC}IrFo{r[.-H49.ŗHr~?L*~ᯜwHFe'ߪLʳ#PҲ-XGҦ{0WHWހDsT-hwZfUTL ׈#@Xְ玕SF͵Q#3Bۀ+X ) 4( _7{; G g @9ag]cd^Ѭ&@t[O)D.\Vwamyz=]J > jDX[8|2 TP~v} 0b׸4&_ )4Ղ3 ^TP _?v DCݢɖr\ܵQwnK ׂmR|/== og?Tƥ<^Z2J[c-u+O-Ɵn[=n킇gaKggfH4^x 8O5 ` ¿| aب+ UjĀj}/f ? p]DO3́O@F@y_@kϏXBm 0eZ1b6|+o"GsS@B[{_5߷3kgV.WKh$-' H4RZde1a4yGl(t:XR3] a:d6s]`]d ǐ ;2;pB)SvJ:`S d5C# XoGĿ /0a&KW7>Z8 hs+[ˬBfw,"D9 HfRB|K(Kl`QN˃Fx~t$KsFp\`Qt?7gF!tDbj53E5Afy? V%5dF!qf4@`8_yhş-Ý**U~x> h/N-Ý**U0_X4 eE*Vk#pRDܿP`D{ qX He7*kgZ?VN.Aaۻ|6%'t:-j$x/ő x?υh{]G~zϷ ʽM* Hf1O'Mz !k?࿀)og-'] 5Vn8WDɧcϸ v(V3 +[+VE%<o}N$0 1X3+}%M:D%Dqbly+pPle3n&Æ #\I%by f!dpj3k/E#'N"!,B_k`K @-YRrQ3-3H(J|H^|}#א)s@ cRIZk|dj6mX*B 槟}"U}dS.8\5 J0~;oz66YԳM;J .8tΑf-^(  ̓j Yuv_K-%SەgRB[{zC*TQgp )iv߉N(IDN'g\W)@[ȗ&0{%(MWLgf4N6{;ŭD!o_bE/ksʩ$!%m ?~۾; }~E@nX~bNrDEO!2Y9bE@pS=<[o^}\}ӟɢNQ:{9lb|?,QYPM# wq:jK;Q~圫חSi ?'!=0H_g%y񀸧ž[E! 0;Ђ Ux rPދ3A>2[p!#`ȑdk( &3H**/;"|r igww~lDSib}ɿog1 – O\I{<ozrËdo ^fq~P@seϭ(^QĖ^5Ֆcğ $Dܿ9 U(v?ÐH/\SD /Ux%s\rPl3\^|P~G6^1mhiˠd%8W5Ξ9?yZ@"Ŀ}DRIZn'!<d*E~m0 T,J6?$qXdUy[wL!i0,ֿ4:oL\N< sd0#@MfacGkVkAygwyPxG ɠ݇};j01{S}[{(qX в㻥\a T&x$tr IȋAz˖5\1w2kz/&xUr=__rǟLf,9˘(pрd PZ"RvPQ:(~C~¹_?hD!7҃=m.6)fz3YoJ?SC]?ΔB2̎V>,FBhGTK`?^u`-aKGK-T'2p痖9pA{2z8r#Of?pn#&g.pxb\,]>G0nW_`?E?go/dBJ`M \xBA#DAI*"۷o'׿AKz>C%}=7NoH\@ZS3'8~p7I=-Md+6H_4D5(@ 'iE~W@KȔR+cξGƃF(ϖڮHoW357, /|qN-/2Kc _;(0:vSMlh$x/l+%'> xZ[5uȘq㔺L/`x>Ck/F Q"F͵}='`@ 3C~iW=H,OKUi 3@`q0;ҊpTFBR,\#̧ on;y% lAd6_A>: ! GO+ou8|]૮u6lϷPg/NנOݰ;k%j ?5|ܬ`V@`q0H2Fkx=]2 us_(GB@u8o?&W hp y?|pOډsAS ;u/nD`\w^DK.VƑ7&+)[Ef75@τyKrMY HhB ;nZ`]|(tO8$n"ϕn72n g*2㩑D f$y?\Wo ^$xj'KK}:UÊk_~BW,WF; *((ps0Nzjpr&}ɴG/ ~Z;h’F8QĄgy/'?#ZܲP-r *j)@O"5hp d8,ғDWķi!N7We<;%gK*~D KX697֢ ߸y1p0 zz6U?.٤K)YGv4_1DĪǝQmޢJ\r"cH4^ lSaA.h$DW}LD&˘1c [xj'PbxOKdE#/ Vj_j .3qܿDh z>"jp'˯aXc4t% eb*UCx/8B,nZΫ0:=rHegW X ?ߒwOӬY]LkG^kko[.@J)W)U7qܿX}`|V( . mɵ*01"Š ]gͰ֏`znI^Jx oZ6Rĕ+ݯ|k,aK6<;!Uj rm9?"͘5 \c{Ku|0{uk:v4g|_"f\ )Z& ?abg T56RV#>: ]tApf wcuXUFL)Q;;*.㳂Q)aSd5)/j$xO420NçO'ϼ"ʊ6t^QQ΃OͰ=ztM7B0vK#ϊEf45Gk|\X0:.в(v0 "{KH"G12ei0Xv(=81Jۄy0RfUWؖN:ixO42p 9na«gd}%mߏ&yP)HL0DW0T1䓔pnU![<3ݷ}r>Cyʵgv9yVn. »Es `ܬ$Vx@`7T de Ϡ_kP U.j('6E@SCfsE@[x&t"C[$+H#>=Wbc{ ;v;d]h⯐ ^pq kqK㯚axnWr\ּ5 D:};N{uY矗g;K؅R#kyf- Hcn.rwҲPN<(e,9L䇠`4<EIRKĝlA-ٰtE_oQߣYٽr+E1U1ϔcrGG,29Nj<4EI 3HG$Зzp\rDW0<3zqddμyAՉp rgIS&kn1;npaL7Y4Co4ԱPw?yѺD }, E;mTqcRIPL㤄 % F)vkʲ}xQ(u@D+HðEQ ˭3$w_5Oc)[ڄ~w02BR5 v\>7> { "^oZ^Ljĩm.DoO-~3h=jx8j EFulU?kFCu'X`Dä$s3c:҈wp/7Wun6 h=  q̲pLɱԝ|캗7+5_1B %D\!%O˾ +)32.5@q?FeCuSy(Bg9K'hQN9.( z'ECԝ{4Հ>+'HH4hlo!:&R,٫)w!Ouq+m!@+a<~.8׮125@1#ašKrVFa(xObv#>)C@( '(1DI?#5$X_:  { "xϩ8ח&L$#GC8 2k|-YߊFxsp:" )ΎhpPyMNDh3aYl,fL#/hg_@P@[Qv_'jC5p'~yFiBW͸QcBD4АAc;3;~.~VN[6l#U!A>R gM0,͎]M1LZsD+Ef3\ӓToюp*8Wo x |m }9WO'O6D|~r YƐ ]eh cVqGtCF bņclo jj.S06;'-.ZD= @`(Q W8RF o^yG_К'ZA.2?%g(IґIg#P_1.9b;AOB'Yְ+bqU˸\.Zc}CZ&SN J5P]D[o`$0t>4g1@Ds#x Dj1 {#~F&~b_U_0g"DU_=Z]{|omh\>{+dF!t(?M WJNJ.]dee>= &Mx@9t5DV&y?[N|XX% h KU{e 'h=ꁮ^Z%7^13k8UYȖr @`%TUC@ '5f;xw۪-T H4h:ϖpafiq~h >HxM5VN5N2t {\ "Vc\5LcK63^/W;YOsŗ+UP]Đ^eďՃ@-q ̧[W%w {لn}q8C}=ܟ7beG'̳%@@+çpBÞOO:lw@تhi=fi5̥)=x*"PAibWʘn\:k% `)ω"P̘bIX+/XE-@ĦriS X$'P:xgG6:sK( {wd6ؘo%9U ^c Ղ Vs]j1}x8iޠGq]FJpOAe&\kb pPP Y`唡ccpmf:@F8)xliZگľc*@b eJ(?BsH]X!oH`?Tu&=[ /⽐cd`v9ʖNunL#3%£0l jL(CaZND| ' s?aww&f1~^d ,A4*"KĔ1cS#&jbW8r EyKv51+b73 "6Z~0Jr_ & iz<6 {Wd6;Rƿvq5qd8+w?CFe ?r Y=QH)Oq1DGQ@#D x.9OlΏс޳:bdbҊkjՋ H2DyK$C`Q»QгH[$} jhKm{I[QFe0*N@OcG3VPח[n@$[lr4;7Vr>Y@kQ>,k:qDV/:Es xb%E*o3 3$_ .Y:aX1iHW?}֡T^}Ӭ$lz}` =A&n͂gX?U׃ߩ1N׊/&RP]H 5ҋQCz0I:s)` ޢNuni3r (q w*`;Vv*hƝ:V9G#?s(彡uD_$xZV߆]2p 8Nu43C|z7lxϞ wz #_8nz@oVT iMXp5M0iłJ΂Xw0DKhU|Ov[MK -/ ylJ<8'bHj"40byX16u_g^qjی⿔ӏܚg=spy~N{8H4{Hx[7-$UB -X7n9 ݵ@[ew~c?#oPNZe@`5.x[|sy(\,"R]$ ŰW<Wsq7 TAja[Mk +Dq@$[/~> ΰb@Q]<8eǜ숄$xZ"nZ~I'm3p5Im$#E0VB}7OKkz8(PJa%w4,怚63x0eB6Ylv>+hڵhZ1GG`]y'#M9|i$xZ  uצJ=7I'nNn`;|B@j@OѲVkS, F+P 5 O`#6eog 4nx rqqe^S 'z@fzfpNfU #ǬLyˋ99#d%.gkз`E[A% aرcѣG+r!Yxzb)Z19D'`WRCdgc24:`&W;wAn7]}0[@fՙK+߮1Μ1\A5n\aԾH qDR}~v (8aݲcϷ A#EJ`cܸq73ЗHr>}X@S<U(9L %H`7N `h:p_Wx0\?$m!P 1 9}mhTroh)>w/@$[lZώ.(V+ b]Nx)CT+]sɡCɔqegi*<677 p_{3v/̱ǂYAw;@=}7? (}_\Ȳkc', Q'R=o[r~X@)jc4.I[[- :uKg:|sҮ'OA^O찀% - %Q_8i+ TjU \(tOqe {*?Y#¬, {\V]}}, gĉ[@bEu}hx ^Kk8g1Pߦ?@q [= m[GѰ_)OCw/ C:vp!zV_;@ĉ?sJ)|/Ћ!ώ8%W_Z?o ?9k1"l/$xj![,|({<9ܴQǪK_Mg"K5ES}A>cϼ;A_@=LӚ@fw)@+Bqwi1Cy bĒ4p1(7+Ne4uQKOі%=:2p gyKWwrEf߃yG$M:In=cNY1 "zdwmehK[)G-~E 0n0]Lt ؘ[ R>%i^4 &_ q}d5{9(Y}mtq"qsJ,u {edzzN'M5s=|1 ">0Oy%w [ ]ĊRCЎr!+w ? {.s FTM i _žJ(ѵ AA\Lc}QLOvsVBS+mteF FYW+p*9%< h=22p#g ufEFGN{`kpN.p\+X~_㍙/Ubo5=ʮ9-+E@F5~ t=m"SО<+ -%@[GzgÓd sf핳ܥyѯgթ0!_KՂe&dYw{igEokHZB\M}_ D]d v>w0m ,S 0K)`ToΓ:{SZY6e d! o4o4|1&@itR,=%q z֮,k9x= {lM1oPkF.B}݉1 L$G#P1o$wE,3p2ư&3r@Qz̄Zޓk"y?;>ڱ9+/;"gE(Fڳ&s]cIIyj7r Ph ":\cU1 H4Vk ?6Èz4_@kbKkzlHlrHc-*S= ŶX*#MԑP胉hoΛ% ?y?;>䃷d fH(Ŏ[^ͩȩ yj 爨 EWW˩>Z^r#@f,K1!L'xHƘ(l*ƹjH?0@89x$#}y@xf o\r"3$$xOLozYr ebhϦT-$ OCh{]G~zϷ ʽM*]T $VDwt{]rN|"`.j(?S@W@k0/A9066p>@$U5`SIO '4ݩ^R,GԲFgC_ 9 Fsw@ZP.y??CdՒ O(s29( Hüb,|Cvx y %GM; iE/+C ߳$ۮDh( {4t- cBgMQFH4; <== s("((ZC.žO,Tf3m`oo2o3Ϗlܸ!+ϟwv(fDchDEBі%M0*cE79JA莆s7|OH:iL-+ڌF~ | Uz%IEE"ZvE`zBށ1 MD/ \N5Q Gk-"~~jjIB㪬pYPANMb_x ߽-1o@$p;fFm 6r T!|X y2H,Lm#6$xqvpVI(EpJr3ٿ% g.͝ᇋR_rqsNV ӄh:PiUsd zpOj9\T9BRǚwyԨQAm9iF'a`Zg_aU pm_$xqf̘1oMQRҋ|8%n{@aTɢ%};Ăy IÂښWj+iv kѣICC¸qg0FJ0ZqȵVRlɘ% NaקۄLo, ٍۖ[_(lysg##3ZH/i<#Hg/U2Ҁ4ɯ}-;ڣ?ULh`{yI8)f 'ojlio;u {LMt6~{lӰhb%1w}*/1Y_~zvkxP*c1@r a9L2va?k,rQGٳg+`4;vd_R  eVF0."WwBd׳Ց3<>DI֐޼#;Q`͂}Y{w=?/fW , 6@^=iњ|ZPz_g֠ \P3wF%~vG$DnaU D$xD9?7;w.YtԣG0@& ~w/+%0eh&_Zyb8ma~!%??%`T$рjq=+MLoY^Yq񨢟+Ոߕ5ΙWv 1cVf78h=&Gߴu̱RD#FcǑy2+ws1YnPrǬJ@E4ÜX꺷5?M sSLQľ*ŋ+@ԼH T&@Y/5 x%ʭ^5[ .䷘8@(Om L:ت:wLn*k5c /Pv9-h$Zxo^X=PB2 /vΞ=W}XPk h`LyPКX^}\da;h P, -h,!qEBJJ&Ɲ7,[d;w4N$xOBiZ'cwlgz d S> ΫXsX-7Ot/ W(A:ӊ|-4 >S07i7B}ɂA?.zt<\b/ޥjl; .QwQ2-^|?OǖNu߀DɴaXdQh.e`?Q:ظCs87 F.;Y_1e/뱨~ H߼йPZ6x[=`)SȂ Ŀf3@0f̘#vwjYŅ$@hV 1࿽hO)v8lxi!°\^(e/c{8h;4#Y콳;ȧ%pK t/ U(A#1,wG,<6QcB@3Q= 3üQTbwRE{܅n)tX`mnSBٍQJ{:_ };vxb}G&=* 'xK*F@ݎ|p+pY5 B;쎆$Zxq' sRiun7&1{"UYqALן5/kA:po*f@`^ٕ k Fiה^- &TK<^_P  1… -Tw"ƌ1QbXF,&7ܪ?`fzm'To>zx~ r̗3Чo".9o%HðzWv@u|.]bb8qҐRgs7AR~QO6M9_ 񏠱b7C=59 m~}aIh/2"1"߈Hw"XGLſ~k$+ı VWT#E0Y(eN_f8pC?fEFdY FǺ@! 6Z #~(A/>>}% Qȣ~G ި-a[Dt܅ဲlcQTy`c$c[D@U0I(CRQ_h1oq\xbQ%Ϭk8{^Yڋ/3J67-Ǹ@ AO&@Rj֬YĪlj8?(a%LrXLO"jwL !B~=WgZxm;:v 6Lɋ_j&oq\tv$ߍӆe kY:--Ǹ@ A?} =JF;7sεE̞=[ G-PHLro:>-틛7Q ο+%rT'>n(w_l K+r?9WrTX>1}IC/*X"]D 1.n[W0F:&[`(Q/@=2߅s `b,_<žJ<գK[6+\osWo) `( XU4y}iH}GXx q=Qk=f3̲> ?98؛H aMa"SLNjɚ~V3zgi}dnYQxƹ w Iި1/7H&oQ+ɛw q=얋f Sf 6+0 ܋e7Ǹ@ A3F0j2xK/q)bر-'K߬a]xh:gWV\46oU0PBlQUVW M ^`rǵgvPOlY?q`ν~/vq} z H0&@u8bۉ3ODK7s0_x?gzl]G"ռ'W1 P&j-nq Sw L܍r3^{剬?oOe:;j<&&b  h-fر+j.`Sڅ.6zpHW 5*O$_[/ /&36x $-$\,Y2{o*a0զbS 6M%KVX:bb[yuڽٽ;}y1V{{wfs("44썲67坆?C@s{_NvaS۵iIVY O0Hj!ٗ()<v}I} }$ʊVx0V 0cɲًj>X@ttDoI_ب$sCC_jFsp}94܃;^lLM_* {9 bbHu;"qlԂ5y+u(G2Pw<=9s8 Hɱ>ϫ>Z}#k0Oxd_.Gi9`l`˫uNi}$2K0HG@-5Amзv@EXK4I ?Y$򗓆ñH1+{b @~)Sp]. % {#Inu 5PJ@=ZS6r,/Ha?Zn;pJd8sJ 4'JZj~#k0RxJWW( a!HHfA1? ?6-@S >%o((Y(͋)P4O꧓3i*QYLҘ5L<3$0IDt >RX8:4*X_-)9VN}:::L`{}Q}HN;^xT{8sBD.(%%%of ПwPUz=eȇO'n3J m()FD? `V@vEAJFM(*I QTYsl|er1{eҧ tJ1F&z^68o'S6rmiyShOYOlu9tZy :҂wE(bj6/]OoOp r\%ї~͢AX3w2X޿#HA<"$ 0~aB%B7:W~LQy81~"r!c9|w9 d_}4M?V]Б6,?Wwlal; e'<#ܳ{w($@&kZRs?nPQt}Gャ3] >я}nPUYGf$,z(8eVWuߝZ( 7T9u׊|\N:qξ9ݔ4f. )T%X&P&u <'  h)I N < taW~{4 y ,,e!H"etU;mRlURvU"'Ht΂>P^=_0Dށt~~Qm [)^(gedA`hyЎr]QRhVpa4 sAchSYeddj|1X$@ddiʹS0 L !/ *U?I៲)qeD${iL,袀Z@-OqFn{坆BZx=>=ke:ݳ js҈}3INiv9PsN<T@AySQ&^oh`wv3,Ny bq}́!έ,1z,-* i%E 09._nT/ >=ʚ W34 r v@ O*4dֵiJӟՔ=OC:.rA>Rd  p(5L\߶LiK0[7mP:jr9O&2ge[HS+)z8}(%@G4Ѣ:դA? \iemAm1WQ)4>Yyy[d\,H= :ğ.WAi仺3 @~v/xrwCWW{NK9|!?nTJ :58AZ' `Q%̋6#!Q vB IݳpR~O:r!Euᛤf;iR`Yͦ\Zܤ,l6 `4t}?::7p,/W+; Qrw۷szH3^ z\qu~Zb:k g ]|ϛa+xrO4U9^>駁_^7i!nw"IʲVx8Ĉ@ hw[!fu䄯Yȅmb4T+ yߵ[)0ߥNzppp, hq0pY")8? 7i3WЊo:WUɿ4|tXaRAiN KW6Gi@n/'n^^"Tf `ƤQ-TƎk7!bv5>r;F7pL{ NCaU[CDiWxp9<@kaCLyT?w0>)Y 0HyqO4;Z/ܒ\ke.8._vD_PS)h sawWk!(3twHf*Sq%ʶ0fĐo$еkM/MKIc"#ڶm+7 ¿x 9--M+vp Sݵ{7BQE1sk'dq$9;Tp.Ɂtۭ;K9%T]~4@'AH/6^vVXEtj"B/Ye% (5F%q-q*wXp$zqp4UO`Ѐ؋|i*`tKzZy 9-?_+8TԹw.rZm=!3?PКJEjs3'S!(sN$$@1 :_u/KK[W7(~n<`AZ/`Q0!~4t]DDD|ӡ@p/?>{^B|>. }(|R67zsZaV8`rt9oFڿ?Wln`:kj~;{4ClJ% a!!,->AZ7`Q0u`ӀmaMxglkLYDFF$!_@V c(Eyо}o CoNJG΃%QK6t A8+a~|mw Jk,1 n*xpO2$> 3XH)}Z|]U Ɂe h k` +ִZfH^FLpWⷬಊҹs$ƍ((y@BX Zޜ޶(;C¡4nӛ+H|tP5P8Y jz,gLM1ݝ0HACzNE)():}ZO;µR=*&v3_7dWWz^\%A&#` -yq]p Z;I &&ƂMTСCgO?_mW<3G>o r2ҶpSM>=㽟jJ;zX~;`GxnogAV0y^GG dZ Eĵ0J*-HPK%0 _|:%E}x)/?+p0Wd2#2[yH+s{(H+x>=]j" ahɑ Rh2Aw©S_]h\RS _Vt}(>Q%wJdbGDQ|dTLJ\$>X$IrtR_T _>O]P5_*nWg\lg%[/CoV5k (c]Z OKHP}?m:c V@\t(#Oô7`Bм0#"Q0*fZT 0  bbbX%J[ŀY.l!r\}kʷڙOYJS[»)ޜ N}bpcOt=oO]S(SPLgOO8s ʵܐUVlw Jɜ!dGvL+̻VPSVq}N"^%`BbJ? 1ӫW/DFFfJ w_Z\x)o3IcbcǎVx7{"9r{7}y&I2Iae!5Rk:srgٓΞ*!xXaE4dzq!)Q^1o;֧S¯?"mҗ j*1#8bTL]ܶ1?F@`w۵v 5$E[o -k睗 /E1e}s냂Vx7jew )QvBw4=< `j^6*.Tz|\39 ~s'w#ZP`1t;IЕ(M q]n<\;Ӌ f ZsA>0 Fe d]:]%p9kiT'_e'r_" ^# E$k&[Y>? XnlY !=@`w!la*TΡZ\T^DA}__/AU,"&Oh׮]7)|,7W+mm;nߜ± `rn6yyv!,H;CQ8ʊIM=V_?S 赱 ("zhvyV޶*&w?qb?_3s+^ȭ, C-+$+!tq?۳hCP\)?@l ҹӏ g iLb c-ZCoʝUnp o>oB}Jj*w ԼR\U).pLV@a>i.Ӆ==ijRb:!Nq,-R r6-jc:o[_evyhcA}!H&| n7y!K)k_&~e\\_/".:2;IDuXf^/u5ӧu Zr o@8sQ(Ύ93go={@NB.WQ[;|"g'@ A2^UVLUbmuNfrHܓOX?$/P]+3KʳK_a-=PnMnZ,%IcJUp)gݺ\@\KIcҘ2A 48zؗ[Xw;10hP+/u{pVp?PW{ӧ?wEOĹ#ԝ>ZA9e+<w%@C\ j6 t?<*$1}G>l}?ˮn_Aݢu? A$lg Q-9 »6 3: `A4_ &3HcNi*4 q]|{$J 1m6 𨦶m^ 8]FVI;I<;eúڻ{8,+_/@l  ΐ}O#(TƒTy?T/t;Z ".e? z`\!',n[t2,,DGFb9hf=T #՟'{f܏="56Ja?I?x< Z5x»@j^V65l份⎥#0]$2?+dCν X"Iݙ X +Zxk QYŅU%? `wH,D}<,8oZH)TNSr-]<+TZԞb?N=҉7ZN//q{JuPww0J+{:d^GiKaӎ9%Eg(ͫ  8eD[T ,}p?7P·KRq}|{g㽟jg#ND  *JI-Gu@Ac 5W%> kAN~fiQZsAυQ5"&/n!'+ۭ@vvV~ f+N }mR 1r܃ޱV/N4Θ>k ( y_C +'D9=Nw}*6.bxۙ)yskA<FڈxR)8e#Z%,yG$b?rz{xwhx){u7 g h0 9^TpuG2R믬#qQ&zwd zsAχQ 0"f,[T *>PlvP APlA ຕbݼP~K=<ؖٙ|d Ep~ԝ6D5|m pHF+ĉqQ>v#x+x mdFU+KXz+ »Z;,%t{ lvP7 A^Pm6P7> x#x yk7( +.xyon cP7@ " g0v~X{5=pQAx3.(()xx' n5"&/n!%$Vxr_.( uP7@Kx  B L2",^BLK(Vxo.0 eP7Z@sx :A.8ia톴[vӂK7%( ěiM:= &`ʵ-̏kVx  p?(o 39 BUή01~m vCXpˇ fZp}-JQX t}Xq0@*((\#xWA|Fٕ /G{x.zp뇡@7Ӛs ø(#`Jwc)@ @AA7pg%KW*,R@AA7`w3Wi    ;0VJzDF   B k7*p »pAAA|Fi$3+ A@AAw`\ *|D;   (5"-YT + 2wAAA߁Q AɕJ @AAķ`PJX A   ~Ju%wAAA߂Ql6JJ;  HI qBg`0!~؈AZ}Ai (ķ`\KNO8n7q5wAA߆5@Q٥%T+ A\ @A71Q wX RW+K"HK  3?JN+TJ6a)@i @AķpEG ةW'@`w!+  (Ļ`KR pV@pAAw]0.8؈HI<A}AnQ w(*c)@D%f  ߚ;nM0 _AW<[/,J!D./߮   (;`,xZP)=l}蹗K;'_ o wP`6p JE@`w!pFw$|Mp-턵 \ crP~_5`J>F%JoE0  \ cg߿/P w(n ^R Є}gW$:aCA waHͳugsP wX \P)xK,$Pٝ0_! ;-a@jINEɫ e'-]0.xPP)x KK;:aCAwZ_\Wc8^T@jkm=JkzZ)YVxAn wXN7wATm?E觤$%'Sv b# *L n79:M,;{ P_]?d r  <𞣌zGd*dJ?0;E^?G ley)viD|Kz7n@1-Aet޵A Ew@BGGN'.wr A17 Xm,RS|GoYYIrf5P (J%VxbzkyDB>CMـ 0vnWbnA آ3xhP,n/8TR ^Yg ;>@"ڒe=ɴ6$%xa#@`-NX!+ޣr+A ۉ; 7PZ pNȟ;Y̮ {wiЇߍ >I3f@Q AIP)=>zzq}xQA~ Z^Zጝ :`4߶ߍAu3$+W XUo|Qv(#dD{OW"K,uv RRW`yP w`^0oJqqVx[k~3%A M+>#_]-?}] `d_)f+'otʟ+)Pewr3ɄGLV%t:R`Ռl?{0 \P `VrKzRenԦsly:ͧ(AZ/:sdy(? T~uj*O @0KL5I9'ax`] `FB3 vkm0\{ E ,K r`Ǝyl~x"c(AZ':?]{v^`xo֔kXQޜԂ\tbo1 ,9SVHF Jˁ?yZ`ӍJ+ۭ5p~ƨN{A \>#vM;Owt:X^#:; m!UƓ5:?-tPK'Ѽ͋'DdQtSHG\T؏r(a\0urJ vk-0^3/QRxȭ,SwC,l^629E@^(3?>(J7_^cl+KOz%u),0 6Fr%oZ`n #$Jz+=W*}0cgGtM@ %.$EIC1^cZ4>Jz3أWUY7}~  !S< ](`wWk!͏kVx[kz}5d~P 3v-X@:S@ 4 ʪ~=qW*(dyG/Sy*Q(;{g!dd=Wvٺ^aV@τE@W  a^, SQ&}0cG^4t0Ҏhc*vNF}A}CAߍ`6< K)PɑdD{?ߜ%"ۛ礝/ZVy0.XndqJ{[Ru:Y្_],Es*J o ;c:Yuh`Z=%{% 4YЪ2Ev' :]yΓR(%'W1Oս;;]PScTjfF@σQ4"JLH\aA`w*[%t Pm:gAwDϼ`?"ADRwn z1tyqRZ/5?V ^\)Qkf fP (^5"K& |e  , "(c@N@~% *p/77/`0Ae/% #@>:WOY#"I]l;eQ g(*K,`)@6O9; 'Bm$N-ZBw54ʧ"P 6XDv"@Р;ZvvrO)i0e+ssyY`֩BHrKzY0VaDX0K.pVC)9e"FÿDzqx€O N'𮟹SO䯹J?[.P XQ Nӂ{u/z-e NM[/U~‡@]n0_S+}xR ,πKL'3, 8~"!@.TyrD^AD5;I]; [_:6) ujIzqb77$Dorgՙ% eٔo,) ,Fb)ff-Ղm0^|h4ӧjUdxt' OP TP^PPEpTq@ H+^wxxg^GƩ!wc+uN(/R %t$,~Y[ 7Ao2"̏k)Y ]-Zv u6 H/;YG XZp,ϿS% P8(SA:A!.@ZU`!N(i8 aNg* O()Cqxyn/0M$uy^ ƈ0QQLH hwy+W@_]A4_z~Rb pCHj^x-% -_A hwy#=ϭ,'Nj_{~b@j "%% >~j 2Ai@5Bf$g] ;>1៲W'2:H8%xC#``j|BA+`  OTٝ d`'I'#$$h?XgpLphpIC"$ {\/6נ@5c{eD( ʁAd^$05Sx QRT3A&] t~cs;aɄN] QA%Ҙ 2z(s`V) [»ݼ _bC?z*+>Zq~h]gHO0t:uFe:<,I; 7T7Aփ8>z{܃tHcW:>~0HXHjW,'ǪCɦ$82V~;n{ c[Yn;2YdJcbOt{x^n2]i;P`ɸ@`~ x0 FkqW,Zncܼ`j/Z\%t.w1~h7 G888'<:96'SCֲ5@I2 l>@9(iu`5y8(;MzwG$tIB,-ޭځ&3{//c~g2c$ߓ>mCMPoƌCJ-*G a}yk7( 1D̟s hwy:Fs{Ὸƥ"HvH+̿ fOO8HJw MMARF&e X;'-%9SGvJw?ٕ_@y-6BwP\ߎ^k5MyҐ J*'ȂίX٢CPl;.)Ye$FP%~d]g(揤4 1[EW-od,yW@ @xB Rr,BFRr۱sm~djY/LP\EQ«c~[wNH6mHpp8"wdsϒϏ$`@q5zҳs`'RSSJMҗ#2#ZH5Hp+Us$ђfސ_7+ƞX$*^[w1kA ds6Ȟa=hWV0'`wܦ%zH)yh >fo) 4j-q@-X5H ~Ym"!!! -Q者3/>Ov|0pfO{px#@;I<8(L씮E ǙkY $(IN}?ěP*N`OF~%nՏT/]||ݧ-a~fݿX},934y=CJn~l?iO!x/_ IFpP+h)xKQ*JZh:DaC ~9={C>(`>Iֱ M۩d׊+j 2neT[`$5ڈg H37a +A<z-P n7aMGƐiIȾvd.+#vk+vv,hɿ^mi6Q4P]0ߥ#x*t ԙ3>W3''9tZrhpDގ1~v;.gA'lo ʫ"F: N(z$Y?G3A: )K =qݸ޽Zp ~yծCOLkI\ 3k컽:ZW">'\w5fqQZ'/wh.hYȿ,m{Z"x{I1Yÿ wya&MFDRVxw(=ztm/Jg@ KB۶mZq1~xIδF^wvi1]h3՟,AŰQ*`i/B' l¿^`TP'?He)}8 {v&i odRPD2/NYҾ,ophhðKZmQAͮtoqQhM ]H&[kLm{wpO" ߊego*gwCÿ c@ ޔ 䤩)7߽Y!qg OOJNK>< FKm|?:{bxv't!@g %ڷo?c$;Gcڝl1]ץMNh?ᰝ ?HE-U8{"[#w@T{%"F^ +(Fw~gBRb9ZHrUN6Et Z 0v_,@x#&n: ]5 1!1gH>WBGYWcJ:Zoo+x7Hߠ=9w4]:7Z xy6"%dJN\4JkY/?oKL'ZK-%O ΋vmq?i<  w@Je;ܦY%:;@5oc(,Yv&RE]Z%Πpg(dXtˆ6ZEHw[#ޏ<?Tai)E#w!Mp`Jb%c/*`aDZa>] Ϝ7{Pwa8 ۢ IZpSV$+>'m"qb^> {6"߃8402~w &VRwpt&@9 !5˖*^RGWFVõnXdvMZC~kBߐ]h{=mq}/zw=E ÕgC#>?>_b_#D{n*(nl?M4䤩ޅ_| `0wzf=Z}.zY#ФP-Zw nщ(Db-Dv HTzJ0 W~t:_tlv]۰#pY>@Њ#a޲sk9%]|.|'՝ڐ> PwHCn0oOYӹ- ] tnA|v=ؿҤAF݀bW3uuhSvdC7&?4߰6GFmܽ}u:U6מ 刀cpBf@U>y,W8w5L[Nwso|:@:UR0 Fn)a磧"ʊT Ye%JM^]3"xi*^߂q`/!/iHF~LONlǴi1c HOɞ_m8؟4 ;: nO9)OE^K+J=ӭݥ7b{n/ ZOFOb['/c[* L  H~f#amst ,`ˎS۱QL<LM۳P%z ʚ4LRDxgTjT{{FFx~rDZtG>y enMI8 GoGG3ےk2m@s %mT[*f$$>Z}Nz" v2 i JR@9wvSe1C&?4OC)V.rN?4EDQ8@p~x49tr>׽}֦ХUOl 7GD⍘@V$ e]:\ߢ;mjż v2\@p͡a!=d.E9!dAC! p.גvi&Esɇ};#4V`>.4dkucgBЂ_;W96XD}UII-a~fݿ$ASQv3@Њ3ۗQΨhR5'(I@4I ?Y$򗓆ñH1+{b @~)Sp]. % {#Inu 5PJ@=Z+pHɶ#}xH$ɞ2R|]0k"I3[J #lsxK7)ccf~{ݻw3NU|">~9^ %"}*=qBcm>xM):<8|-;g o;< .xoN~fmbF'J#Gzʟ9WFO~^wqF%[P >O<`(\+.̇^(7"-Ya`E@ 1 (Y(͋)P4O꧓3i*QYLҘ5L<3$0IDt >RX8:4*X_-LJ 5L)mn2-ol g X~:ɘ0z%>i5K( ٓI^׹m[-ؖ=T" i91,;]wphPkra2yt gDPW% a1ح@\YPowgVlEV֌܈|7? X,SVI``lBuȚkG N'g/S٫(>o@lLS_6@6[[D.d"珯.Ga kRx4ƴǪK:f=ÃJ:(aFtF6vmgxCg9!V\K08g"L[>l;7c>D;}yX |o Ԉ-]8yU;\w< N/#qI~qe>ʣ_}!"࿀`I&~ z#Ϲ>_@@ڠ+/SLLlǵ?}`R@[NrUMHp,t [:ŀndmeP_ Zt5*; ~FAx);oI5)+~6gیyk78*K:G 66֖[!_Hwj\g'R倯3A_+mr9A39RxO>tSRҘ4LPb@)4?,,ww'Wp¡ f_#0%{=ebYTu{tJB羽J.DvxX L,ҰgjV`Ԉ_[$~Q8Gǻ qX,nWGLAjdSPU->IН΁64Oy=Hv~7C?eAÙkIXi[5?#BI魧~vfbJB -oYMԘ(8'jᑧ.pvxTQtpW>nhRdQ͟9Q{=uK}OEߜ:ZyQC@6Ef9vluu蕈OuV~R- P& wCxu&:xr?N4[ 8^RT ZpF3 F"ʥVxކoK$b(k*\R[,S˹..e_,N.Z?Y,74NQY 8 ySS.hǂv5z-n#u?ʆ.^l{@,ORz)XD}՝ k;%$Trwi+98lwK{pж_:tzUǾ{@#lEڹgcYB(}.]Bm8ǖu9G`:磢67Lzuh*CC#N2t:00lL?b*# Wx mO.|  8|A8Z /$ H+-Z0Q0!~J)r,:~[e4}Bĵl?b C]}wyb/ Q,"At%WJ  Zq, ގ Fti jwjL,yg"qԞ~NcGPP`KX֯O%K>Mo1+4k9 @?p2-,+cd\(W"^ص]#l3DIlgqW"[:՘ut5{ʹl}:-g{+(|.W%R^M+/kQdgW^,;D`M!7;Ҷ=Ax(o =gys%*P@L TCeSy}ImT$.Te$y@,[w{_ /x[&zwS&m HQmK H=a9OAn-OE C]myJU`7{Gq{''q77on&1 u cޛzCBb:Tѫa'`юffٕ|>߀j씳9繍{目0:*RMHרO]MO Bj[`5Di V@11rd˱}eD5Y!Q`>^/GT*\s*32t#l  }% h# ~ZѾru_::Š] {HwdeTu+9.F$S3r$*D'%>,>ݻa,f}En)?g _lIj޵b EӚLzuѰ(`Q}wi 8p?Z3T٪4ބ }(ÉQ1lšX޸80 Lv -M "|S7fR!޺!@E++>Z] α18 ;`zv ,>IĈ|eRG^U)>flQS)~Ν+c@+wBGW֮_^3dHWW<AЅ[^xȊ]u3~ھ Pj#?X ?+ ,gĈ>rpXqajp{J6Cw o?;.(^1IOY# ޿pc6u q=cs]^q"pJ e@p 8>/SW%(, E7-J= k,VעE 8UA wAW(%&' k,-ވsiEcG.{#~:Hj" Uh۶m=lF> D %  I^a6()(})7F.ρaꞝTFFt8~rV'+Gr8ҳԦ gPok(R@c{e_B; >80؇ a9] g _:;Hab.?΁O] m! ϸpOy>*`@@Tq4x۝v)F=, xS.A[OOw 7@0gv'Ք` {\_橚:?xtOPSwSxy  PqP@PÝcdP 2".QBV*Yzy/Q]@y+k;`ī>@n,{G*|6mHۡC[c$ 8rQ2̄yJ0$ȸ!0T]U~1Dʱ:>S[#a^׮3)Tݩض^]z㵇YvQ_/G|s;<οO5S ,pਭa/6;bsAQ>׭U/F}` k X\UF1w@X07{' l0gfm^U=:<-x'Pc% )f ӇɃA]+ {DZv3n=ř* T\?^] 8q2(&Y!F'H8 I_1Xp,z~}E6(6W ۗ}! Q_\&W0Yz*]ݎ;Vx'O l剿4AF*uk{8"Ǹ70?ܖ,9(VFXPÿ6^]za, {=qhϞL,Oӓx nt>@0T #BaBaYT$@PBq?c6+Gew2Mia훔[a1 I%2#,$}A&?W/鞠&JSߩ:5A;ʠc&,'$},>7$Ri JxO_Kz8- z)I@4S@ن B-H, Wd=B+#dAp;Ρ?!l} C%VFXٰzܟV]zcֻGi8ڠ2fRm"-{b`9 WApg:゗jvA2O?+_MTH6r(q@pTz (2.KeK":lg Wz@#[.%}@&QewP5n*2/V 3fJ8 1w?cD@`]RpiM-A! ڥt$:AvKGoZ&޳Ggia?P)(S ?Q@ IGYqʨ6 $>JI>h^Xm9aE^f޳,Hҽk`{:i.>]̰NFqnC, 4﫺w||`(@ [ݣ56?9s(;Gu) !#~K&{vh/pPr|MºwJx Kޟ=^xuO@ :'_BMLKIy X}+apnUpqWM}HU|Y&ֈ6M|zܸ)#&@XY`-@(i'9@oqd}r࿅[8<(T߹+O 󨄁\814/&m,<qw:Ă; &#Џp3\`>sG(<:`Eu̐7VOxH/}%_*ǴBwIxO0FxvwuSpxĩʊ8]U)v,Bp<9^w@\^2X} 3F$jY,~U @9cgŕO9Y>¿n)E۷Ikl@ƨp-@ 8TȆG\#߹6 {1)V5_JI). >gRyjS!wC,0 ns8/{.蘷Gnj=aXDvl3'=G'(5=.2h}\o4gC!s B(R|FM; x!Wތdwpw|I>]]%VKsq@bbm =ʯ]](X- & VӠXf:ȸf`RR>@`u,X,:r]P=1UVW:X;/ATsYP1ܟ#7`EXՖ76xL׫Mn#C{f >)pwB j!y4GGam vvb;7"cNO5gW1C骞h)>_E+ B6څfF7Ja B,W.ׯU7I6lK=UɊrDU;*ՠHJILm&&$&_x_L=[1 .-JP8NgJ{̏/.ՙng}6 X@.lUXr4Zy&5;(ۍOwFB ē@y 8Clҟx I`M=@XYC,a%$o y &d{=0 }`%\X1(2 I wDFF%K(qo,JP)n.|S{GF_uE`o `v#X_+X!hi:i U`Id@㶭9aj$h%j7_!ZQ$u_oMEqk~5wV )3U( :g VjLy'4˓3@ix(;vxX὿eoX). eY:nei:YGO= 2"l#" 0'i@O ݶ=(x'D˂ 0c7*S-zA5SUg9rk@`!`6+Z%e )׋?cpnli( O[$~\B{u,2'6 mۊe.OO~1?߆#7.V`@tVC pEw? JF+k࠰eFa0rxB0!Z$ xL:S7X%U &@KL"y~6 #Ofw N5rHBZ(7eСCz ZD#ŐNiF j wGMCX@*K4C^iyK1 {yŠNkƿ6LtwsJ`ܶJ? u f#DWj?q%@ek1" Ht2ߥ]^ !|?x_绚,Uwl@۶m۷o?{Q@Xna|eiy@ ~w`觬¿a\[[۴ ¿Gy;)xk !@\ݤxM:+a p<_қA_ +7 +v-4?cK>$Wy7 ~{}#Jx[퀠Z+G ɩי?Cpw-=$xW \CC-3 *Skߵ;M`Z)F'7RN 50+me;'Al z Uujޡ5uPy.(ˬcf4Sכ?Cph @$ $ `eF*8 B #~(ww %Ojhd+f`LBWk1"n_uDK hm @ @ph O `f;A @8*; ݪyP5uOߴH/rf`RZf302.X}ݵZ_AX0+x? CPO.ܲxw%sn jV 9G X}Z?AX0"x3 Ca 5uP7OTRLWRӟx_-"xG=oAbVxj{}D5 #Q-FaMIjG ߳J %s 3 (SUuC&QΨ\=+GKl&&&nx_-  7  @Fe1?=׾kw$|7j T8eLLHJ=,["&x/VoAA ֍V6!p} 8"6Z)&5cx_-oAA KM;+xJ ~]}[A/3NJ0aU⓾x_-_QoAA ։?"3 skœ pB,X#IIN߰#$&Z)&g5# x_-_oAA և9.ҰC~ Ρ_ע,ݞݞ 8-J053Wx_-_YoAA vV]׼C?QuVI3XIe, 8$b^ 05@`5J,p  ^;@\49]]ْF;{ (qOX)b @ʌ"@`uJ,p   v;+| <8C_ɹ6+8syjuRKl&&& ,N @ABu``@ޡ_8\,8o/gRNHi&'V U`A័hng?jߵ;4:7FTٯ3N``lrZ3061#@`J,p  -J+ ~-NT\N߰G(l((gG-AA័h` }!u_ =C7,Z?U 8{>BCZ'+ %Wp  -X]g#ݔBpz|C_,~wmCEAjQ/81e@`:}@ABeb`g8"ہKY[".˝+M8 Y)J.4Z 0yłFz'Z7  @ ;3z;SkE.\R:Ceg=Ǐ;nׯpZTܲ%N#Jd-? @x@ABe{; l>?[[-yӧĥh~5o">Wjvx!L/1\m h*&= 4vkIȸI卫ܷp  ϡkv#wO>\t[= |KKXyuxy_JP:V u:<Is@*_ނA័•s<}?}'O׾-fIH<(cx [  .HKT$1>ioAA /kߵ㉠ Ypws}=^߱K#,8[Yg Q ?R ⓛ I)A[$k̆-%  ?!࿜ۍ牠ϋm=pP̜{7%p52b{<Ѫj_C`J0&iF30>1 X " >=В%  ?!8]V-[[`;{N~{v~for`8*. i9m5V q)i/I/`? ';Єwዸ] *oAA ēd!n- ;&f[,٬KHO>%9_fhȻV! =ɪJUn?T"Or =@P!X)&e4#R{;+0$!V2R+_Š"ZAA'$7fx!Wwiyq6g2qĆ{p+:rDy; oyWp<(\Zsx3q7s֬i'9Z``jf869M 0aLILNϺ?޳,m» I`[ . eB;!_Sg ʠ!Ҋip-Ԣ={ţw`k@}>26.1l"U> MpВ$ 0 ݐAw!?j7c5uz8[qx?pqġҳbχ~syqPy} ̛!1 F@K77af чp BrVsí9bѲGij5 cĭJ6{On'F&~=4.s~?/'!0oy$ر:-ApVބ֛1 {5$jf^un-[;{_Bŋq턌y̿;ufQR >{̖GqyEw} [Nl?^8H>*ʨw }X0{o 6Ho0_~%ʷr5$n <$?8 ԳSU7ᴖA@Gp&݌AA;f8N?e7V}| l"@(1_8QqA&K=N/TkI??JؼBa'I/z±!ob P*7X:]]Y[~#}d7af 0}V;zLG;ցnN܏͟O̵OHϾ1&9֨ԚY+o`p;_*??ƺ Qo k 7cAq{$|:q2gj, %gψ)sVze|qjF!.f8:!E؄\ M1_*#XB^lmU) {8雰~3FAwC9pn}tu%ǹTsLo1PfLNǧK F%2T~tLғ > ]+rK h(MXK!# \C9C19'f'+- P ς04HAOJ'̘)=zo}`0s< DŅ{.XY2&n~9ݔAzr=3ͅ[v3dQ_Vζb_ka 0ef||vMxDLBO@`wI '¿LŚLMU5 {?}7Oy@tg  1|27S2wkR{LȓZ~>&15 I="&qֈQ# M;sߌG<, .xOo?*7`T;^K 0.3|jm7$|7CڿfAKfÑs">Q{VgtNnEs xH°?MO>ROFDßqФhݗX?(r&'+?xS6n&l M`8Pw hݘ GTWP#9*?_ߚoH.^5pW7.׺ӹRė'L܌fyQqɚmѶ=yy!=&믦/O *! <* RW2"6Q+LOOb"%9OUU|,޿ְ*7Yk)^#ǿ9?I ֋I0B|Fl-7$|/!Kf_o=|iq[ i9=tj,[ַ)p1@ \iJ~bjj.Nj_<)xDfGpS>ڗ[‚6x# $ Z/&w{8mkH.'jk00.gJ6ݵxT۞f\~6 +V*kgrjP#wILW/2NK΋ 6x#՟~<vz$ Z'&?.wu^[ DMT޸ݺi1\fĩb|,aY֔s$ 8崀)y coxq`-/AYVv}A@.Ӎ綦O;turF;5yA1wȻ.^};Ik!໘T5-Xeb܃Yb 4ݻB!rw̟3@l[* Jމɩow>Ó .ڪ=F-s/2Y" 5c 0ְ )]Kwa{$|0&>qǧfNNJ Z%&$ܞ43[PÌ_xeʯ]nֿp#,5lfLo L4 D[%BBcGI׸׫MpV9LXjpk^NQ{t"O{7ap#tc.wDz NᏄn#/ .W9^GeI$jkѡΜz{X؜BCx0O󍴍sykLHiJD~a4\ P)!@`AOc0?TZT\]X}<ڸ*7Y7,37k..8A/ *S}5QYy]XkU;CY΂eC'`]} vy6W۾N0ǥYeg7_ i=m =x|WA՛ֿ>&J6n_]|W  בÿPG7 _К2qcm;s╉ӘBְg,ܶưggb~3Ib2S}1(VDz \` W/ ͅWE1Ppj4U 7 @(ÿ_^o  l࿿? Ș?zo1r5^Y[`o ?A-`uG 8{f?5{Z '>x?^?tj,+3Ҷsy=U,sO ۖI)+OaPdyMV~ \;/\y WN+>3I5 tz5T@/K'?r"9л!<  ',_E<$K· N;p1恧!xSfǓ )3--dlr~MNw6`q.eP^}iYy\t9#1, »_qS~Ab~$z-ѥKm۶f (P&U. (m٥HyMy$zxX 7@?g ?A'5+@_WDuJNe Чwx¿xCBL<3x2:.#' mK3[0##S3r\q &M »='פFAWA~+:FOWxI`ci5xX! {_#-h(lkk[Jq$A~׀e֒ rЏZ!M.YKZ}x<{_“g'ba=Ǔע]bMp zmWu,~/ :ϧ$%/Ġ%\k*.=#^4Łģ,($,xY|,[W"x1bˁM!'RRG(o$8 mƑ8D{ȶ܏AOqr܈Yx}y)1쒘QyCy|@ )쳿:w cOޟɟVי9|)eF »߰W+M' s='vI((y9UU˵Bu'Q8I: FNn2]V)}`.S$AVUjRac,'\ro pGvd o^8M)k fͶi{zf>k̦s{\^W$VxV`P;]7p&g4Jy\Hc&.ά.qD[],AE ཭L|3w\Mmn~ ZmcyAO=qԴ?+w1( Օ̋-Zp𗉊*z@+CN4,. [XJib87nJfd~0 (R -F$x~IZ>o OCec*̀>V?W$yE`ǂ b_ApU Hl<|WUm;.G{B_f%S+w1(:S>uz=Nl 8fH^^λ, ۘäƲ^ZjܱrӮii G@+@KŠǂU (Vxo3A2/ 0`KXϹ89q*i]ҫ]F F}L(qM;c<fkZtn޷V v0>1=@`w.-PvS˗e+y m۶5$d Q#{' o.Ѣ&sSbvZvH;?Nȟ O wd`8=ki`Mjp*@ūoQx;0Ipw%i'Lq+Om{L =&!Jp im}Y Uut~,K?.vIQ I`񝣇utu?d08;7ҍ%7FNVV%?paVhY x.xfQ7?1|o9${}{A<9UUkJw7GB-F}QLV; L4C퉩mOtIiYrrFְA9ܺ! ;_2C (:t`J XR%[&cD6;[\66ޔfd;ao5&%96*0X"HC0ܳUVm|nÿLؖQ(_'V]IB8{O*9ih>`d{,z>6d>Vz?{v[Z(u0ɧC7K{Ov\NäLִH)yK.h0w>SU.=#Z0O <K*p]|6m܇?+nhHb`f΃әYE 7m*a,"K{N񥗤WXk E|8k WO2#JyYsyKC< mH^{JL(~r89 pwؾ_ ~- /X$dśru[b`FVS:# R'Z ̐;Cx ֳw1Y&l:>=˯7HM KX0_:/w1}ؽgOp޴mv c5H^R+S:$u:k&7!sf)oxRxc1={QF8(;fC- v@p -ZaΪCz}^t`§pPd .,[UU̶qMKM1[ f%Է} @mjrzp ڵk7F 1 BO`f7AY$8 F %OnnIXP^:ojwG( s2$ܗb!NNe>1 `u ӨIrtee\X,sҿV^n F oy> âL? ,mc{^m*XAyp1E^Go+ ˯]i oufفwtU``*;w_/^p7t3K۶m{8Z>oO;'/" }'SK֊/tz/I6{y<k=TP,8sY@7-P@!m9Ph.NpGwQi: $<+B6F}w^+)YiaOnu34gQa`N~5=~PnAEsY< c!tj}y<_c!|XSW&NSmi?GpTK KX0 bWPrUHnn_ƪU-[EQQNj2k^?`j)}N5jTYt |%'"0u 1=1pfOpIn rSK̊\iA h>)¶#eiK)V fif)M LRX!_Cw샆8y|쇺͏2=ʾV! =/ti5=C-B,{KE戀DL C!S-m*1 Ʃʇ)1oΟBS3rLq } Q J:wr90}LK[X/ϝ;wRn{?]͆#F'>)ce@ )xaL`n3 ʹX0zp-!'W.@ܸ;1Cy=dqxuxО+xфxXV 5̆<|^vF gtE@9*Λ8 I R縯!GW! |, 9 \?ZSz8-.nEXܷ`R|iy!Gxz>ֽն7[sJcS#bńG+03rE76YbM: ݻwGgϞ_ٳGUlڴi^_hlܮzh}YjV 0>;wĈƱ~: @*^( ٹB`F#h0{eҍUء㰘tr4V"Up 2RKYq𓰭BP+ b%! N{l?lL:Q( bPna lH3*'SPض` 5xV]ρф~FOh Ёf?|SǤ $ I*AWk%b4wEԦ 8pyFV୶}B0# 1 (~ߒ V>y٪EcOzY[nضmb@L0^iii{^CCCaVDFFQ;v Ȱo;'? ؝o#JJ'cwнs4%95j`B`΢)[bؽ=t-m>g/DjO$=3'9~PAq K`Е O?V9o{5Q^sMd<#6$o=cG?km oڭ7twIT[ܴCx~h ~״93kn'>&@狌IHu{5~3nqNm8By+_&.%)Xݟ€þ<_deWʑ@ffF5k׮ĉ@JJa% [f@Ν8 ,ǎ/+0,pen&o5XwkG"}Ab`|m%;-K <`i?V;'9pf~?p $|Xa8S4sMh!Rx>Jk ϿQ! en7Pr>|Fd<$B[i}nr[eڂPv4}e']R20I)ΒXK۞}IiN7"#RR+TrAeVȖaJ޽{W'ODIII^ۥK;ٳe3^/G@@I/O*#4?2ߝU,103[qh.vs-APY(xvJ8y02ys]>Ym>"bx<}1][1 a=F=qh?dm~(xfÿ5+xWdIaR|, OYLN˲M֛`u<.` ӳ-YS_f\Bǀ V$Y+Uj`֭`ԩk.//oRˇaÆ5رq̸4 )OÏfM7Ks I7#ny+~2Cp)5`'Hi5p !ibMKoz$pf$l uϑ>`0 tG/ q9Z@k-{}f=x:r9/;Z4 f}+0*$|`;ks`E5*xGdx1)jx=`zF|W>5#mlzNH15 &@_fRrZ@`w_bwJGdн{]v5LOhTׯLg}v$ xq?a )4 Mwp8{nӔߨ޼_?q &mW_5-gyr0̕`h;(FA $ETc?,q$9 Kos󹗻=ȇ;h{o;F0sވwlWo |mw+ /X$dś5t[Pk52oYU_E^h $1){K(Sc.yR1b+ʾw%0cU3SRgXݗڵBBK,YR `HMM=$ , 3U`RjF@hhaL8VONX}/xmji 5 8=x 6+7v|.7"yltahcPkyF In &+)CH*j@0Y%I{]c2"'NP`\@6CJ됕[g3`\]Bk̏ a}!+6T.6u s7HD/+x(x_Pv.-bץR?hUEG#_<޹YhMӁ@KcR|B==3_*ךȟ=69ٰiYy~[zP(e@zzY:w(# v}p?QZ @~ wϜo />M`FDl>ƫj߷t򾴍sSUpqYr`'pƀᥑÿb_u+x0T+MAmzM5LVwūe'XŔԍ"jj˱mk4E~m%b HJ(Q08ϧIrR>}>֤ GHI<Aߺꇂ fW^K|V @= j  k0){$.\NI㈀3hmk?kjk[U YBG9Mr)\BPPQzնVZQ<0;}}v߾^B̳̳\Oܜ )GB#RRRX! I&$vѬ+++K٩k… Ky3FEEGpFoPB/u^WچmOg]\Bǝ Fz݅H z%^E08q)v| t8-dE2J6R1IQo ]v ڝRڪhYN=yVׇ P8[]j=^X޶&޿ͽ޸szCv-.'yxpztO?X#uN͈TK_,ގ?o@ }#&x"eZ0@ʢ][ w|.g;d#,&1,Ĺ}Ah :\Ea]羞j\K˞Mw_`-k7#Hmh~OWk eexm?ӽ{+D [ St| fx҂5of\&w @{{NjqT444(0eʔ3b[ 1~СCϣ2_J6o@]xg{cCd޽ .nÎ ]xt3 vIsA[؂xN'ٛ>F6༥oJ^Ga+1aEog#N!vޛ7'+\x:xo\?cg QXZzUè >~{ ]!jfn[K%uw^ "I"O (ϥ_.I{^>xilg2(UM"X* 'ժp֡DVf8~I9LQx݁EϮ,.aYqG#XoHLL$Wuv=`͛7+. DPVV뒒>C|\\4`ԨQH[a? x+ = ܱ ryGFϡ׳}C< 8{S kE?:欭kƛ& ڛ~FLf6xA/xaʼn㴯]7^T6:C]LVվT-xQʞ!xV'yW ` F4Gpr99~{%8Gϻay;' _r(BZ!?^y?+ oGG\";K6J.~YTXw,/0::0goeq)G#XgBQ@cc]r}v՝-[vVW5(")~_xx` bP:ٚ;qtlzùa!x,׿y[7 b¿IoC_h^޺q* Ί,_J@/=w -}C#fX0"}pLyYueq|lI116Qwڭ"?tGmcؿ^QgN \v)-| c2N WX| 3w5uECSBZ3U_xM gc=3O";oHub^#]-~W䳡8cDVKx^7KQ5J ,.D D&Q,ZN˗/X'^(RRRޤ&.:#u3/Yy(gu5o--`2\,z_^q޺XpJf[7rΆ.lV`4|m}FR‰DFqoo57G^0C~?$S'ߟ 0^zfT@ HZ/w5FN] V׸QJXQT2 %^3EGСC`Ϟ=ʕ+@~~JZFzTL:1}QQQϼ:F͹(7!Vz_mν\Ķw݈B-7@žn% "ݛ޺A_}ݣM՘82^kkUWyL\4Kߎxt-}[o kaT&еZ]wJSHj GpWsۼSqJaL%\B![uy@\aĄ(< ң Kmŧ?Qʀs{=w_X)9(0OoHz]z>޿Jh5 p:4\']`Νd;t wDk, /c>C*h`zsQΆ@\0yzoCcv7@GոVm@p߃i7c`'V(ARTNL6q)?T}WG׽jP1I6[Z? ЊTӶBh§Y+*j A87B5޶ H?z(u<9=j/e;U%?G: $:6=fƗ\u5Kx=#wkh$ /zT<ê;dgg* lC~ p<֟H$@)He]zHcƗ)AI3^@k@p` VQ̝;|M6)wFVMMMmR0eʔIÇ  f˟L,@ŕxX؛<=G/@_u >)Bmhy̆Cg0k*Fi:YP0@mo sǷv}k]{C ylu@G[o݊6ߕ~( y(=?B~#'z0>_ܷsk.H3@Hz6Jbqn(X$#wkRSSi% Iw(((8% ˗$}eeeTddd *G z0/R)9kҭ锶M& ݶqIQad$R|)ןBǷsV}ehkH*s:+Xe$ /ƹIp_$f~9;)^$+hE`:uB%Ee/r|)Ha=5'E j >* K~-UJ9sو#8RX׷/2"H/]t$҉!vk:iϴk0K`}Qwk(Cet!B(JT0S^ |-}i^1g?1L5HK'EMX5'U%.`$SH*t0uB<_i=3u]j{" JM< VVV/ Lggg3Fŋ y;GFF@po3'mctPRZ[(_̆m7 8%FB=|DPmDL:/Y 8 -E_|M1e5xH$d},Í zdV?7O+3|Wc@MX+ {"\! n f%P[[{TÈGAq1Ǐ=u 0/!|Q.Rs[:$Fet%{kUj_E7L0S$x 0C*3"BםMKEl)i} /[4?~F] pQ,%/z$@uB %?^}AnG @ ==6m  wJ@SSӢ8O* NU4F.<,?E`&8^jkܚnk:B%ٯw=QVtgkN%t#@=`E @`3z@ "xdzϑ r նu(B>WG!KQʍ.B\]k/Gph$ XOضm[\tI#~ĉ ::KRea>/uB`]f3 (u\ܚyeck:0]$yߣG\ nkh=5v _N0*f=xu`O'??~8 4CQdww"0xB-xO U"?¬,*^Y^T|¢}uN8ss .c}(S'W,-i@r(W9N~ԨQ_kii&9 .|oΜ9g1˖-{#.22(ߚ6m)-ƏJ|=W,y X :/-+9g-¿ 4@,?k N4H׮o1Ol sIOY|cϝV=Fs>:(U-(Gp@_`9znQA5kW)L*.ZVZK{ý[dc,BAvEQ #X"~; $5L@u^F@^& W1gD\5eO¿HlX~jOϷfN"@+/JBQuPyM~a#dzM!cVp{-2 y 1C9Z9|)X_[ bp~gqG̏KH4XSF?$@]LE T`J( p}~]9ց\,)*[܂៵`=Ȁ? Q`Ze`}]`SlexKѶ[Gq$'#~>wg}T_}Tl E#r\mYF`U[,νIa%X@a^ F@R ~˗~,Q?'aqmϓl| ծv=b^_a2;N ?  P `Fy^_ r%X_Gl>螿÷{Ik\ey.E yySQ緎 8ZX_?3X԰Qw|:<ϲ _H)[n ^#FC}TTPü0X @,xa^( _@O9 #ܣWOtZϳ "i !Cs̳´,N3ϗ-Y#dW5f!8%%X`LBnüH9 >;گ?OY[4g@ӯE]˯k9:D 0د`aN+3/Q K3fw7$̒S <fF3 C%b?u&cn$cO=A)^ : j:Hrc3[`F$F%zԂy0WQByî–j8&v{ km>&ecb!1).J)YYVXI XUQBNjW# ]FY7E o I97;17S,?䧣ceX~O O!vDˍ|lbn 0"mPƥ)=W#8ZX_G_GںYJ xȩi]&`F(`]o$0/3qV #~0^*`0f5|a{kkqCc>3/~C%/Ư"mju UHJ7UJE `:NIHeDڸ ͟sf2q~ńT~ZďxQ}R?/\j=:\yF?h o&X ysP g@>vGOZ_7?FΏzk,z$@\>±w=bW^~Z j:\ʲ&^Nºd( /'@MZ)DLE5&î~Sf~ˏ=$ۯᓇ\ǤQixkc5flleOu/Bpu-/@`b?%9?R@}&uy0" bon@ݟFXP|ujOoqã#?CblqwrzƂvkU{@q 钝vG,QLIWnhLO-K A#r\mC(F~A^S0km 0a^Gn/?k~k{N'Q*uX eU̒ʠ[_ aGvY 0a^=>C`p6p}_@L >(A[ %(/,(v t,3xC0 F)` ü}8 48p6p}_:nST@`]7fEVW6)PxQ pW +]~<Y[#u;qgKiXߴ8ϗͶk[iD@d0kr]MgUUu~ 8bp,^S' j!9 |nM!Y>Y.x{CqϾV_JW"8RX78 üp i=p6p}_9ZK`X` "_x?ցU 8UiPPXX;.3fwP_7G qBA {k0{+A[囹5/@QI8u8 _>U *0AFZ&:KYYQ=A??&3 Gq@ =U * VtS0U _5L⏖y"8X?@? üj!-NWEN \"ss .pr)u;`P -ep7a 0p_IhA݂Ux 踯D~=v+f ? ? I-w(_`)DVWhs5(*]haz@yP>B|p&>5#.|Er+_'h/+h>[:Kɭko!8T Yxu{`P>ᇭ/d`!{_+<%A-t>_Jq;\J+\'h/+h:VUs5ya X~5k%Ee`9̃ Epgnv xqC+Y5C7C\! ta^!eϯ"%8KNus$[i 0//^k L: {E\5ނ:U " (XsyC)Hqlq﮲~Sod_ 4?D!`+}}]'{Oʧ ? ڿ@.%%<5`a~1,#ߑ>Ӓ_xi$@8 @({8+w|yxog^@h3Tos%! p_:A|q_A7ÿ7]Q#@6x:ާuTpEhYU߉Hqp o0!ze_Ş~N_W  P $@DM@@OʊA܂I@܃!s )AHqMiw-}+4ˇnGo08D?ox+ !~N_W  P 4< Nց]yyau8u/0aQNF7 `|@S[l¿=2ҟaAFDg뙚uOM产$ J[9~-!FH9p {{Ľ\ž; p @e$@"@ETae<]`ڍ~a R2 FpRhÿ7 p`P>)m=KjZm {lfx|r >3 h-'zLS$xڿx z@@O Pw  /e~v9k Fp"z? 0`(~oC*K_$=Zj͞) }iIܮtu:@ڢ xe`rHA箇B޾%wb^?% CLI$ C=-Fh ܫ vQA\PbU~F? a^ʇUjl(\%0u!>PDY[x ^!k Llo/zlHۿJ@4Rjeik','r 9@P,K~aF` 0/!Kl!<>So&q C} ;h?(  物u9 V!^܉~ a@ a^9xXӵ8=xP~7@ozH(`GAm  SUUu=~|100/e.bo5epDƃ[WЏÿ )D$onj5  M 54C+/).gaa  0/z%\bܣYN = j 2^d^F#$=Zߠo ؑSYM_zT 0j_@> @p8 I!@k(0ō_Hr ob7*@M;@|)"## 8X׃@@ &? 8`. a^o0v,3Hx{7 <h ;$_o2 @p8 @I! D\uHuHu B\R7KP}vs0bR(!EL` 3Y?Lu뒈@if inSAt-^Oӳ߹=7Wq5ȩr+B+fzw`qB@YdyG\|?&'fv&ڿ$Eh? +P'~h>DI:- 8 @I! jĥ)=Sv=9wZR ߢApp=+ GNzg$pF 7>C;GgiIs|2?*i5~w?aeĽ(hFt9tOh` v}=i 8c:ƧTK-I^ $ `. üz0)XܼFJlTg _K`';U)O/RFJ ɑؤ*<`ò z}=gzP,$ZD??qa㿸=W'_Gx\U؛@ #2 @&Hÿ ` üz1)`~I2FALKe";-I;Ӣ)땆 p Lgc%:)\O/E^/.T&8:G8?&65 7#^y|j|9ob|X5x+)Ë)$fuz&kkfy̑δh:;=ha]f[CW\ueY6%O[kg#%ڿX:52-^ܽO@P))D{UxLZG2$2ͲR)&Fס%.CG Ї?,e}'^P_W Z#[ =B ¿_U1i&?¯:R?ѓZCu݇qo h' !-K F`^7HE"O-(]1_5x>41Nϣ*yC<'& _.0Sorݩ_Tәs'OH {pCDpm " R{V5x:y/xGyC!8^çci0)AHh!ooakэha}* )c{ 8_f!"P+{IX}EBBB#u=j0 : &;ym<C56}(D>^  DE3%?މ_coM XV#3GykYys96}74`O)1~6k`o8 T@]QE+2$ 3'%% Q '$V+QWlL>3P` 5}pb\3 Wk!jYdcƌ#chBh zeš5 +to3Qc w>،@R׿s{A7>V+)v!!=>>c?/ HH_ 1 D=zq6Yd!: tНOş5ەe%U:Q?CH҃ IIڄa862G 0=` [#K   ϙk| o%Ͻ!WW"M9;nI|\$uuշxԿem ZB~  Y w{C8F| :O!#u=j{Zl߿ J豑oJC/:ty!cz$ I}c@g&'k=~X!H/7g}Pq[ē q_>׭E59ې<|n-쫖p~{Z49 ` BEFFrÆ XXWC"""E0/ 6mi>8Qx~}2qɃvD R@:Y"6"~%-[p5q?n/.w;>1ιs55S7ķn v|H>0T-sIƹcyS?1 N}Q>b6WSc[mJ%z<4M`} 1CCC)"Ha^V[R퍎LwL,x;19ǽ5L8>9ڌE،)>K5=zoJXQR&AwZVEx&sؔ)$D.Je-­M9.mt]>}o]#>1;Oq[6o[;yv%S HϽK?c<2-}TXJgvq֪jZQomu=aG' 1(w glw q)iaXQݲ.@@!vC!6Ga̵ą)k7E~wKJ'" -}[i>G rƎ?pxJc@σOJ̑e5(NFZ_ ! ["m X+?GAS{c>צ|юDW_;wǒ'y|`vi2O(n`9 `$RH#nAp$7 BlD96DqߜmDaSCH1 7ߙoطޱ;g-_d-Pߏn[DQXH1k׺ߋqW;Ŝs+{b}( !?-5rjb7oQ{c>P@?blޱ~=t_ry>v{cTz_kwċǟ*)5ߗ I 3 2iV3W2+c$&&2LH@TTF:H@ "<0&iۿUQ%DM-F1)x+Dm&;I9- B@b7ot oI;ڷ yڡSۗUkh#/7mx+DE{D@]0`W ܑ]< P0wf3W_0 L+0n H`^@&$w|$#Tqތ=(t;_g cƙ c`}Bq'B׀h֭84'?—>b{x!>Q{yki91Js}jlk Ebhj;DX`9 g'_ObxZI]ɮ'HxNZO]hw|, A1ވX,^ß&0Xv`^@^܏?1v{O̝>,19f{X@TJ lX ^̍~(4Ozv{~B9l>*Lm1J [+I`} &@!SA@0 '7+KO^^Od( S—},jS=*&?rB}}% eszyN ,N _ `9,&$ bϩ'Ȍٚ@⏲OZZ)7 h҅e!@t%z$9$392=U5pw8 A;3c%Qg[Nkݿ+rvo>Hq3ic9th}ܟQ ' @Y!18=ptLkg.eK~ 'P- JI˲{VV2k񟳳/0]8^ςܸ~*ʊe ˔3ˍ?4yngw/c*x0 84*bcc@dd^G( +4@?| Ymm°-=8a$'%5#e3* N>_ P}FQooh5 ao?ü#*h yC rMAh<=j{u?eɊS xiw꒕H(L[ʼ:A垺tb'rsy iju!C'(NY\9Yrk5Ii*{!>I3syNώBy*e~#_}5@B2*l66lG ݓR~rQja.fy穅SV_:EwgZL=G(૕~ !esJ/ A+X?@pcHݭϕt'ܧ_μ>*?).7<0Spv߭Z%G9$_J׃V3 4{w10= T@ASIܡ`tl E/ 8ʧ&H)AZ,5' A\P;ƀ*cFƣz j]z $LOMruyY[ QH0Jׇ0@EK ..H:GzԂy 3  ?3> nT'p9:MmH;cd gߗn' ǽ>ȒͨIkMg!~fd}!|߹hl{aLcc6>~}9xyko-8oo[_hH1ޮ7 @h@ QZåC{g(Ai{~Fsʃ0Kcͤ]V ˭$/A/^>`(;J_wlBfZiM%Ou!!Ϯv,ܣ?kUg8mv(zg "ڂH`]Z0/@A+Ђ7%w!8NyW9QܒW'5ȡRShqtnYiBpV<+aw5K{zT  .&{K={q<ɇ!^`)9mܼ@-aACT礝!/VX( u>[:ާI''$el>_{Q7C6E))' oKKC^`kl^^qA} 8kmg-#$.C!&kygC& oh @x(tِo{% Uҹc=xf㠬pГ@:Y !/,\vbjRBXO"bS$g3tؽI5Q*x=t\~1( u&$P:Q CJJ 1(`6l:t!Gp ҆]cb=ޣ~p5| 85_Qn@aS6~c 9"po.F*zw=Ґ,- %p=\(Axڕ=9g\\_|^t|~k%F pvEpqE C2mA/ xοk?A! PP[{i3|pbX,1#ua^PFtOM\@Z&H? X_54 qoN>{յ)@ l#Eǿ8q4yWq4I«" sH1 @*. _s-N]!MA>@>B\x#%<˯_:B-_3}i*TJu?-@K"k# AAf ::J`Αº~0/@ы2=yV?81owZ ,,#ua^PF{ks϶F [ᰏC)Nv+iG?)%r6AOh$@ڪ>stls|/>oۛz -:6@8KW\WմA[+V ^iE iWzKCpB#eB'Fe40{ԡT~SxE##5SA<=p $QJ5S1s I~ !FC@jR<::hU<^@x'Ogߏe EMz'l?+ĉ)n*@O_õmRh'lubg5t};$P^'ȉʮ勨sRRZS+ 6A1fr쵐4?fEk~A_H\IiDEH@ +0͚Gt)R+>ҥHw^g=}TlIW ._WH?)]W v%>ZyK7Pܒ 湱!dX#?: l_txՅ|8F~POw*崡(hk?I} `^GKLt!ڈ[#Ӆh#n^[z&tg.$독Y|~`Q_ O|ߕXknp!]uT,]v?xIkqל@t?x7ﴨt0AF@+'A%RZEzz}}!shCX/z&N]n:/L%/ J_YNoٿ{/>pvyk+`?Zy&lyro{}!dV~eLTc\ {M")AyQm'Ror i^i^_@:@3R@O帳vY[.~篋 nSTK;״ʻܻÞEL9o问Yc\Um"GH) L&Zl"cl&:v0 ]ݹ.At*=Jax;ΥDEPA羒{^gХܥ+]|F@ۿS!w#d~yGɦRDv|| .֐驚IP @=Mu441gfQS+5~!W\oڻ穨,WQ :OŤEyuW]"u._t6\~Oׅh@Dikٙ8Zi^W  =BAEg mѿY3ܿ u#c^F(|ƹo7ɻׯV,h?K$B@q~~&8<<G9u0# x3Th@-)t:m">;0G< = 80;0vy&z qX l-&ɻLJaq6)|>[[[iz}}0Г1t)? d0eSA:Ąvvp8HUB[Uۍa̺\t_EEEJU瘎6eS? qkvS& .&Lt[qp3L5DKfsMHQRbK? q'?khlh ؕO砻J&vBiGuw*؜OE6gqn*Igmvvp(>L`0sݎn%Sڒa}ڭ[+-=Y3Cǩ킝 0Vm.g2%p.8'&AͻwuߚJg0SCF`g@;l8% Bt m ΉE e %o@nd\PT? q?}>fhlh :sF9N%ϲ޺6l%w23,&3*VR%SZJss%[7;a!(-߬Ήw͸6'G.qjFIG֋S;dgA^YY{ %Ihlh і|c”΍Ew3?!J{UxCwǨ4'ݳGf >va?3 G`g@;lhF۶Qx`ejp,L3gU'tU G"K`-2LƁY?釬 wk?N]64ъ[W_,pn8Gg24_qCf9tW,LGENe޿8LPôM.1.߼<{L *jjRlqp=<7#笻@h+Udnm H ]]ˆ q9v v6FpFZ Ѩ :w籥ܙ.]V Fp8W QUՖS6 yݿJ~j@:D93FPoWY_)F`g@;lhD۲@fg Si3R0!;Z|<@Uj;`{"\A?~Dp1?C sĹu/ԎaliyZ\KnPԺn^%#WqkM¿XmɆ_Z.1 kYsqk_T[cγ :u%q{L!ЯoJP?ovpn8Gic 3Vץm mi`OdžO{LA_6Z.A yxҥ疝hޖAjyxDy+kF=q3gYh|VM~odsXk٦_No|X*æ{Ĺq3n˺um-Ͱs/~Nl ~V킝 pYp ;fը-^蚹v] gyh_%,B;~3Ys¹-55^xg'ϸ=G춆dO@ ~LjZ=v v6FBjZwCo~9 >^Kt--=@9˖Y<;] gs 8f;s¹6pYW_9o|HŹ37a.ԭm mʸdfz[k3|ums.(Za\# A6mBjҩ'~4nQ6:STU>{)B@3-,!\I_^-?iب7 o,|&>p8V3s9q8gm"A.4nKs;p3իMۋ: WV&Znu=vvy/E,läC7?jN]GMeRwk牳4g.}OzCOw s `i;] g.|~ džcıq89n{''4e?_~f"sgN}4߭b*޻}$] 0gLG_omvvЈA 6oʀ 0rtjի?QKUoݕi>nݾ`l?C5DR`;] gݭ:&#\pNΕ=n"/>7j!?12ukDmB}GnTmG0\=cKo5 ;JJ!6~+. @0#\@bO_P£0[#֝-9+LVyCԤs1e_t-Y"Һ1YW)+l!7[|> wnDŽc1XqYfR_G[NR=mScyGD&87uz#u?LVlP\B/#`Xf sMw]64ca+pKXTl0*Y}<4gcg̐j]nM.|֊/ Ĩyu.|'Xǀcıq _uN!EO 3YV)H-6 [e,`m?o^ v6h0 kJŖl*)*b[@UxLm@tEY*1*gcPߏcƱq8fzf~90ٳ5zJ#|Rx,~R9g"V~.G`g@;l8YXӚ%J Pb `vVVw?7x_q($F1ǂc2Ӛ<ϸ ᚚ=<Ǟq >!u5.D? *Xރ /3."ҚlU XYY^R-YI.5*Ň~}B!4\w:qn}HT!Ww%ر$#,D<̻;iYhlh NX)6m W DW$13 ?`B>Oy+PSR{B<럙-JKyl.%lvC)Ah\]!#?0RvnmW^X^\}l^ v60 ܸsG6OKXyrkA}dw/[b?ыvv`a}_z[%1cCNw٢v{(`?͙hlh a9^.O[Dzg畕qKql?s@Gܻ<6g]6aσjݺ`saAp-J0C3z. 09O5yZ#L=u=?Il߽ c'G3z. 0ynML`Ffb:Z%C4Ǧ]6aO9?_O{ns&~YM hka!r#=@c76|P v60 i<[=t9cw`8cg%%{*K;< dbilh a\qCO{nsB_"3!Fw6xg ,E7ǵ0;aa,tOo/b;=Z:F0 y7sA"!ڍg%~c4KDRy<1uUU _EK+"9l  [ f@B,@~g6*ƚq,Nx5t&A>0Bwj31 Hvlx{h Iqn3(~@š6 TEf,[_)S$D/o,ߋcU*'^*qc5,3A(}ML)`ڳb7 B  `n؂sޙ߫SvbΗo,|e(Ǭ2qyWCwgV3d&ٖ41 ^]" ?`XS & F3l0CAQ4R3KJhȴR :q$gn*u_,],jn7[1a{z{qq\j4 ELf/Ͱ0ET}J/!|6@,8΅uc4~vMn$e[]S0Yc~A_.'c 6h;6&w9{*<mp0ֳ2?sxg5۷%^ &ʘ[dz 1MΞ=q-̓NN? nhD 6& =Հ)S >/@>߁p.mp;K $*3}apE9 ?vpⒸ? lhD 6&=e`3k!f`5%}f@t[O  ]mG+~yYJۊ#F<}T^#]:?  nxIUNO-2_zT%UUUWTzϞ?3z)ݺwܸA._3ɳgSTvc?+ 7{ dMLȨ`s@x}g={Q?V uQ!F]~ V G<񋠻&jS^ͻw駟OS= ﮽{]=gK}26B{wqGFʪXm]kA#H2. /287r)D]>g DemΗ#][O: i=`?Q†'t..}L?6p23* |f /Ua{\%*P•+r/*\wak>>{N?~rpppuo; Ǒwo?99-G*j`10Bqpp0PE;p>3[l888821PDSP888RU lC6zL{w?9|U5f~qppp20KH}!*.]J99 13ĮY1Uּ4Sʨ|WZg͇Pjv>dIv%*jjp?GFc>@i>,Nj \o k@2 ä;sqͨ5tY]~~v|H>kٓjg#L\TuGjga >dI,Shex\QEgn>}^?C<|FϪjt  |@\S\][888RguS1@]]:} 0 c,ӃEeb7B,hn>yN/ku LZ֔UZnk/7?[O^Z#Sc,G_r}v5z]/wy'ϑT =uQS0 0aw=iœ1PYS:rw3/*+ikaA%0Xŷ`bX,#uX3DwW^9ǀTc6 8U< f1+yRrWf20CoWܑ"6ǵsm;5+1R⼿ \;Xp>]xFK\fn}A\0^xCSCT8/?0ә!▸.ދ0 _jh cve!=qS*=|H;wj\2 ØCTT R0`?^ wL>qLE SizZ ̌cVkaޤkTjݙ_ ax$ ut/!0WJyZp[|A+8Z $x[| 6 ,<#|ў5IH_n Bഫ..M5,<CW+#zkBcCIs_{tq9KaߙzNh焁(zM`OT#<*f@ʫ^F`<}!ײ!3TX 1st-/alVeFYE f1{H,389(jX8/d8%f?koF1l{8~wI}oGY*LGVSHs=N ĥ$gK拉yeaߗT5K܃?\0`ជXg kd%~VtM4i]kuS(9|Xa٘Xv梶SƬz ̆𷫊Ѥhijܥݴ䷍[I>hם>5:HΣ6Ӯ?Ef@$A0@82B &T3s$A|vQnL̢6Fzoi mL]FL',YK[d2s0SuSdfL1hNff37y4>ԇ~߸u:Ck鰟uH%lq^7s61W6w\*3X2 `Z.`dr<ѲG+ ?ؠI 4f/Vc0~Xuj`` uc%Lf$DO:!YFv<9Dekkb *is~A&0ނ;0|mEtӴ^J|=(v&%~7WbQ#,>s8j}h ]4:93Ym_/4ob-:~|C,~>x-'z҈hӁUr.ZC󟣸qmrkM[ qǚAoÊrYp w$7K(>GOa 21`A|}w}'ͦ?4k+ey_O>?}֖>iۅ>[Ң[I֝>mLσw?k/?sb}? zdn 2` Io²vG1s\R8(z,aFd2 Xﰹ+ &^3UA3fNp1}t9ǟӛv6}R!# 4bt8gnϠ&Scbp؇~׸_A{(fk0t $T &ǫ`{!u=n&H߲#5ڋ?x8=MBcfΔgؤoX6d8;>ҋФU Թǃ&fu7Q5p|inaQx>eM='Sʶ"ڨU~O xӖ4r&Į:Lv=}AK |MXfA+|o$~cйWxvdZ?H961뿪b w}A%y?&a~gܬYxy/4x0q?mGc:b*Q#ltkIdC$3#'{Y-T{@?qB@a̅;}uX'Td $0#uHRL/? h4kR^,,%KhƢE4m4Q CM;u0BɉfV mH5`54zr_&FS#i,: ?=s/ؙ3iqԪG hLk܊ž%N-mޖH'Os} q݌7|?>[)ПZtsC[L1kЮY?<ʫk$P. ~8 Iϡxw9 L &f^ĵŖ|j}4j1N6i5m'ϛ'p\ 3A>ߩ)gi@vXo.(80;)~R4Ǒw#xZY-3 ]gn<#%O2}#sNfdB~a>:H9Qnv97Wà2h<~cĵm߂{|fDkw̴Q߯2IkF;B|*0Wr/˃aǾe?pRqo7>Їfoڕ~,y:N[O>r 3e  03*Y*`zW #݌rQo6Գ`NusS|&dc0}^IE`j{*f>:~y q)Ma2;fY%tu@pw~ q)tO1i|؂r˼{}Ӷ֧m4]%!]K֯%6ٸ1o҆o+:&\~ށɍ'e- ,c+H N_awZt(w ſXOlgHe|k*JPu9}d4jߍ SJHyO,4=BY9(c #9@9uXm?G4yxQQAksr8q7,3pg. T1 {ۺD+ǁXOFQ3f%_i-ۼ-[$+n ;40A7j l] @%v",.S@,^s5g-`iʐYd~,xveЈ|UR7 &(VMF4KMJÅ8N > 킙[\#筐&'i3_B} 0_h %̈a`v1F-@KbB1lhb]0a&/Hlٙ{P~C%!` >'/@E6=lfg`֏w.=M̡>\Po~ lx }> ρP@|>KeǨeqm,8 KSEνh̬y =c '0n/6^-tܑYzj} =H ?mc`6ɪۃP.1RAB%2O7o ~:.>`l'HǵvBk.u'L4vQ6Ӭ]`GQKS.3$7|.J62a $Dg=<0a~+A&R^u#!>>d]\" x[a:12xL#ӰOEHE2R3EN? LqB4kў:&*b 2WW5ҵ.9f+תw(}(93@?tNZs%1臸P `nDL 'e^k`y>jo,vLkri_a$zL̄x 4v^w ajQmm ?cZqm/tÆ7XX׭g-\D ioDCޫ$ BDHs4RGzT|Ծ;&,YKNhw.߽OnÊ6F{ 񍟕%gq?4 gA@ )x&a0GL&.v-Mt<70tIkc{&nJ\hRWss^3C7[ųQa?6]6xc*:{U1 ӥ|7)2if =BDD j!rQ_MA4a`eL7jgCM9$60u)/f?НL" &J`nbdD%1{-ec)!VB NЬrf!2y{jw0{UJ0 1Ǭ))]ee/^^ QLnn,r6)|/&73z )F? n"}!X|S˃z]gX>CalOC&L1', u!>֛~ۨe9{/m9t6$K7{>lݙbgSq5*hy { \vRN2Ű9Tܣ+bm^xE4`<]f"8&GwG}&f5dB:T2Kmv}҈h޲2fj٢?֋ڔ+M@d喕ge Äܶ8KX~CC5ݱқ#!Y!;w!ӿ5C $ D fy+1PÐr 7f*9hgwu!Z~98LO`)ȘMgk/jܡܢ]1Hzfr@0Ā^e2LUEin ȭm,wQEFMuY&]H쎖=Ĺ󂄿>;oh&0$;c4j7h4M\n%a:A cs̰ٔ':j _C7܋O4-mɋ]m {5и4AoE悘rm`yr s*^,[֊sT|`?o-^>S>,,Ŏmlx0?f'qJ ckF6z${ZYC5Rcg|Bng.+^{\ꀌ"xi>exΨb{S@>P!>i۵AvKkԒ>Гt/-?Ko<~b~?j0? 0T`✹Ԧ B[`: YZ>甊wv-(nqx,sIki1LD#0z 4~5K 67⻑I] `H.U&` ej7C7m1r[0ݔg22b@f=dF?,5j}޲p)XS=8 D1Da ! .Xș1J zh N18QC'L}-;Yfy OynF4k#_W }Ā3raCm{bT[^C-&LIŠz^ @!R@f ^ @B_\[wGf n>64?^G h:wv΃ј^ q)᯲ eD3T&2šk,9v\⅘ G !0ĆZDMl?~֎: &uNЖn<`3;`_ !*_>޳'`2@``0!0h ha ΐi6osl?x ޘknf0-Jab4[)iwL0'e5}l陃]70nB`,'8׾bEJnQ!]߁r&ϰb Lc愘^KL>S)cFv0ƨ-D̘!X)?oM-!oiPx mU(A'e)0`eJ s 6]yA҄2rriR 'y,=8=M'#r!Ns~TO!  1O]:aҍɊ~ wQ[UFy 6[ (/xbsA*QǞ4zfV)!3lX"P4A1y u2@-&B}Ԧ?4i%~ԺlwzֽQ!0'vAq`mnn1'E @+w}^ F[LM/BhoD@7ڇ̚vkMooHX07?9䔩].=S!ײ?6VW#&[GF t@esS F8&Q; bY"]jY7 x8Mb&gnA!1_bÇ6b+L |o Ce 8A(8Ÿ'O='7a>k,Ƚ$THmT3 DCdR(gqm6НZ?{YBVze`eKcf̔&&f1ĭA"MF`{"P4T` m+|o,cLhֹ'msQ4hD m'| ߡ9Oགs2Ɯu-׆,xRG,E;K{TX^qx,xeqsdr jhWTXP < x |f Aų9G;E11Lcg݋>Y\yN2fear`IڸK9m@` ]_@{ØĬ8U1T̂0H"P2InC`YC wd!0A5Ŝ)03i h*Uˉ.HFc!F͘ =O&"/+Cڻƿˁ]5؅`R}̐?L -m`2r)PƓ2:$|ܶ3ۼFӛwM;zNfдv1+`}'YXlwA`{  l@ kEq!~F1JfHn-DEHC_LL%lgBgwB2@ۜC,_g=yh[m ߙ<(߫2ɐùzigFa(cl ת+u1I.o^id~,hѣ4̵̦4D{n7 bsر2޼;ix6w`m x X}m{EѝBL3O9L`#moԩ75"]嬃JVŞ_|R lQh4Ib'2nzPa؏4nh+,i0cQO2+ Y; & L!CnquX{Bݬ] =i1ߨ?+$:0V>7[ x؊$uzM ? d(dvM@1+qĹk"W 1o07 EXlc| (0'+ı`%׆'ڥ簑i_7 iw]X}#,xrQi~(䌲1,Sq b?F_YxߖmgBӳ\cwg\KEqT 5!bA}`2x瘞6\|be3oCb3f ] Ç)I.;06nچu#l=(#z% > ˜@hEEA_s Yp |f /^hgŖyD3aR oMmlͽ4Ww WK/ꑓRCd3'[o|G>w{Qg1hiyS#4{jktX5 %6@8k_CSq,jglF1~-PuK̓EP/3wC!cA61/f%Mmn~ p,g 7XffPAbyKC}ALaD_mY0#~6,*uٛWVfY>^ & -ʢW /PZ퇍yT18UַY@o}k"(t+hV4 ]?:587 I R>5 ]JVd rv.d7P~ئ,qP3z<nIIA~ |\kL#xn0"Yk CgMf0 ]3o&Z6̔Ь̸ւ73p3CϥpN/"s9,>&Q;Beӻ"r%n[\KG3-={_"{NQZJ%q0$"5|7wP @k B =Tg<{+ "i /;\@Р/D23/Rjo'k b{!&ncX#7; 9FY˩0Q<#݋aSCQ{^'khe8Bf#=Oy.&ڮBDnzWXp;!1{o1-33g]feSlx6'%drmEETtPB`0$={rSs5 ^2, ~XlQcH3u%AW?"g25zшż,측ih}@D2A^ϔ 9b My}^^kCQͼl'LߋB#e`$k>og$%-3]CR'r=>sFH]If&g>2ɠW=af@v|Z*׷[ȉK;3  PhAżb/NyczDuBHGGg; P fD dRC %+u_7^)}Ȼ!쒷(ݒY@8sD}(.HBL%<&Jwv?ƦW\\Zm%1JKi֭׷0b2g⻶\xA'ND/c5bQhi,Tbk[K @\+^hٳJւcŲ@gDS>&~:d#>Fjon V ^y\ʤb^~, aKgϿDLh=}F'McL*b nݒ辞;JJ5QD } cgbOl$8hUkȇl=X&_[>3 Jx s < q#>6QH0۟#~׵gcPK6AWl veWU(P@Qp\"am.<fƑb H]<uZTJy- Ꮼ$,=[ aI* Q H]TVUIRƀ8ۣ(JDq3۸M+`ƑmP-10) E˗}`>v1T/"!axa&۸Q+`ƑiEOM~1L a uQ[W'Ǚn/.b5[|mcZg^_0$M Q BH]KtYc~A_./AX{L 6q$vJPSl Bt{2^z%n={,~<;!w',M&  8d%)) ?I!i=M@ˢ~umZ 6(l0 Hd&?&tc7(G9B{uCdW0#IT›cߓQDw;vQLNY x`Ƒ$"(E_?Ii=U}(v+΢~f)./O0q%p6q$ JWaROOF]}Dwb`~<1g> ּ(0 .l.:^  ⋂ *D=$zQGTJK#5!:tG_ODJ 9u$kssx4tA/"D޷/)k^9Z`C` ]402  v7N#> *._#I M V `TJ%sr3gZ;2O?v-=l$i*omIthу 7;f'V~IǓ*I:DV3ݧx m-,-D@  @TfD?Dg98888888BOym2lpw>R\ˣ W>UEEU܊  b6 [l;_ny888888882+^ ?'(`#cIvUxR^4]uuq 4Ş7 'Bb#8w$ ˗O+Y9 +=kX`;q1ķoJTߝ;2."{NB9S(=g'D988888888O 8bs;/>a:b9m\ d Yq@rL[bBտMOJR@My:s# MDҘ+sppppppphuD?{OHQ_~SLGxRKtm!lpzV$+r}:s/kb׾}t#Zy n<7#^0Y-NWhl~I2 3>}JE >M\Vm.a e@^,Qk#fl; qE5=wIOO}:W^ivͻw%}M [ M/ I JNy_0lx9y$ ;K$ -%o;sr w; dѕ71r۶T^7E # Fm}=pCs7$*ݺt8D'. ÅKqZuk pϜXM{ ^H].ID4|S0 yW%!Qvu>oL+Rkx&5_IŃzI Z=i$^=kkkuGHkB>Y {No3_r8u1n$Md2gcS ٛ C'HLJp Ɛj)/>t(p>%#Ӓi@J }xspppppppp>?lx)khA@C$5Tgpf,-u 0?c*9cZaH2wC)x spppppppp[|~J8Hu'G,mϗ[q83p=Ǐ7cxZ~=-ݸo@j ]fAa{(}g=M#Ծ;ݧ%e1@ yyA0h$-ZN.` ey34]v98888>?lx!z7HGIx՛7uGwD*Ku+9y2<ZL ׮(@* *3\#J@ pE`kR ?>v(G=xH)9&jꜹM7\e@cv;AQjs-ΖuHC?hf98\uEKz.Ǽ.62<0IqͰYA˳B|UVU>-G~W>}aǩ)3b1tᯨeA4Z~}*Ppm5|rppppp83mGa?h9` 59XbS:u5/_r<[ſJDTzZ@ ӊcWGZi<lppppp8)Nq̎bIDE- Xi۶|ݧx*PT gfD`FYW_op+J]X@ 4\`IE4f@Z888884G9Mtҭh?hĊLi _$hGWu;`_m68ysÀaX@* U (*Mf3^78}98882/]Q+Y_ QI)Jq+(ҶdN\߮>!imA #Gžäe4o*6RkSHu#/gUFkCʫ^J/n':əzCʚZi(Yq ˾v/'ϕ@% !v=S(XJ]ypZ*;T5_f,]rc(bAjS˥2:`Cem"?J?fP($|\!Q?f},gŨ/{n=y!a(և>K_+mw f{fm[PuMCىW Ymh6RoXd B`돟WC&62)D*=SY [`f@';hxl'~1ccKLpNq>)GL]J~"`S<9 DgCk @Cb  8N_Q8003oen ^n LaDr8/po`WXRYa/ wrBK"F! c&cn5plt$PkU]/|,q=oН1|gN`_e UTV=Ǣw@&L 6R WN)[|9*TMd'g `6eԒZcف*^5?;{iPF#s`gD8#9.Xpq/ .`\ԧ#ߧ0D>*rx_ǪofN}iڵXB kŴ xsNWX2c<Ԓ2g)5O҄C"꘽ߦ :Cnj|\6^<8˔CnXaPe,AԆ*m[ t^@ f"E2kzKzOu7Gs߾ǂ DB1/H da;^9Uh3`\W bX{=b\} cIgO@̦3`g)\7ܸMѸ9lXWX)שR̢x8qԍQoKf@-q |{p:Q[[!F5띶; p+l=?^ В $V !SfҀd^*-v/ jR#sFh;IZ~)i+<>_F^)gm@<L]E]jA:gm/"*c;;)n xAU, iNW0 SLY}1g)}+xg!>͝OK6nkNnnYc!U|RS6[:@g)aM-F_Ϝ9ӧ0sR6` 6rIEpԠ uA]ZC$lRs}u@cr}ʩk730pg D`IZyk &E^,W)_yWKqbEZ>ؗ\oE2ml~#|5.1/)+2Tu3:ݴ-e-5 H ,/WrAr4'K\9X-@q=/Ȍ57}AZ0G"{qLGv YBJ߀x3Ntol;ǹay7גhsp`_u`@;UŇlbT\d ȾB90_OE1w N2;/%g;]|> 6LQt|Y`UH檍ahq_fn tz@&kNn$;Je x-w8t/'摭=X'X ^0Ɇ&Wt8)퉺0g4byY(89Fӂ=I^} uõ%dyN{N_ mg~1'=cj'gS|5=A *h0l N$3m{`i$;,o\MWf[Ka[g) D?W%DO:W䱎9Ў:^!+vFK̟Pp4rfȲ` G׷|=+CorzY?0V>H Xǁ:N+)s 4@A(@wԈ9P|ww@wɇ0J|UXb,?cͯ7}qݱ ϋFIXX0S H*ԕ}G.-ZuA>&xp'qoQGȗӓs%wG=5:7h#y^!}ks(TpUxu@ l1rIW4l[-;Do~M=^eOInMt k#W:KbJM8S:{ >RcQdpLoqY{îȋ"t MY6$ 96D :0XW }.:yu=~!TmpLNΡRN_MB lZ TWڡ.|s,pcN6bu'IUdrBi SF=0R淨ܞ nB7j|O#cRɴ,ORJHFI).r>bO$g/B:ת?!-ͻ%ȷ[(I؛'Y /t)PeM%3rO*(dB\eV}[~|doɴl>'LK&1Y͒4,2N3Ԛvjt"Q\< Ap&lA>FhLnAнpTMPdfzI+$eT}TӊK#Ӆ}2IofOi!Nito99ņ_Sy!R&duuT};6\ -7JѦq1)$m ۸*> wns`ksԮwgk}$XT1H}^:3oatkؚ!)P~Bʯ$դPТa;LAUɫ q9W3=ڀh#`{{xM깨uO 6p9gLMO!zAD*_|a&RKEK no'55 Yy Ss2bjm1|Zg)6 ]¹9d:Q+!|9d|@8khw? mY ucqH)&y}CNy=rqytݢ/Xˡ[8(IG0FZ鯚an9s$Qxj)mjpHxwF˫m I"SܵH 6[ |,j2KmQR~U].f!߅w(Ɏc1֟K9گ$sUC|Bs+IJq݋FV< |默 Ma6-r {01]rER C=`@ 4l&QS~!D=~ ('.'ӗNOhk1g2&85WCyu /}VІϦĒ _m{H&L#6Zw;m(%^yNp.Zܿ;&wO"d&h1b1`.."Z6"7 ӲJ[Am%`A{=@ T#C #6*B8J'_t;p`#!TU3Y=$gVJ wC`7g%RF'DWRyu3Vz@}W'~0{_0 /:!FA<|Yhˊ-|ENݦ6:Nf`1 '@[O_4#i:gQiV1/`yg@@tRPSGX^`95# e#5k쮸ppq ,@ᰯd菇ϝYi|Ukғ萧oE _d#o`q_{NѽϿͬR(;ȷsYWJ{ ڂifC<yU!sL3sUIY)PXMzm'뎆W?v$yM~$||έvoV=5"_hD#Cͨm' VqlWd~j2J& wEK+!λH~nD[&N>1X`L06#.L1k9ַqgi[)yIC0w|FѵB]  7'T%o/Ƚ̫F%6wI KШ5dnz5_pP-;p*U^)=P P2=9B==$l%fV~_[G /3hu.P'̓/Se `]03ZÇA~[.1Kfn>yI킀yTh=g=p(}Ȧ#F˴F899P)4`2: H/OV,YNZ#v$]Y}?ڶ߲ lE:Vn"hNYA꧛M HN2+PaJ&1U$) RM5SHچ^wf;jw#ڂ6mhV7}Ew˜bl1[6N,akDS+IyK87-myçO-3rOaj2#|)>+@-&ؼ\!ERD̹RN[HqB:S2KH|Y#)ZH eO00{ {8RGa+#p>oW@I_zyҷk#0 "m^:9,?o=txk1Կ:X [!e=|FzKKEF`6>cTk{tBr>?7Ӵ3_%_rG'lAe_ql1]p#i4MJJ gaM cNO'U2{V<D*gxffn @J j{EwX$[2q6m5XbL1J ҿr%(f%*qCY{Bx+}|\<k^9(]lKo;}Of=z^>LQ 3 yG< F-Z^3b+CK4V>k|6{{_#r ,_PX9W{ףݡ\k\-mC9B"F7ղ%賒#6#.r?H/KS70?c %3sý@ka"yV ghQ3ylB0^UDiz/ILp `ݸ[{ƀ%L b!\z䶇 bbl>mH:1&iM-y9 JeX4 HlN$8)" ~}B~12@#mrlDKJZZi B$_TGÄ _BP_ ~dQlR>iq`,0&JYG+~:+ƻ‹Bt PK 8f\DGX;{Oh%P` m싀8*-#ȍD|b׀@kϴl_@{ϻ\ڪCDpȰsQҽHǔd ^E:vv25*Y$WjR\[KDd v1V|5s`ch7会zSUK Gm0nO_YU /s)/3Gmgq`u=ePFv.t)FtKJ}s4(0RTzFR@(G0xvŒZsI|^t K 8^_hEP#l«5ex]@a2FpHY5 9i{߮ }w0bY+6^Y2GNP&"K9bh;u!*ο.I?mC' ]R%3*jv^*\88nV.N;w <8H0@YP~9(G-^~WRup/1X!_V'XosB}=~fQx?gz ^AسE5_ m V/q ,^ vEN 8xFͿCQ_UMJEQb|?kj/x&gngϨ̌|Gr;}*)b59r5bP;  T1{/Œzpjx1duj\Sp ! XGY=.!.{ o/[PsG[൪yp01I?~N?{B. ,Djp 8_NT*9AJZ;7櫦W|(p+]2 =tz3 H*eCC5s&Rj\Y'4#q_  k gE dʜ q-.Y\иh{vaԒ~q  SxJj&p,*Aec8>65г~ 훬 slxSYM?l<;jz<{+Z_0o~Wui xmV iBPokpǖc@i>[sw{erZ #h;~EB<ZC95)_NK8-Qr*Fm9!Fs{ǃQKB\xp8vߵK.,,8E<Ԏw#焄lb]8Z){v2bJ(i(蔠:jy kL0ἳ9\fFA@\ viH}WX['J"2VpY=rB#,cs[н/Γ<[FyZs|qitӜ\)o j2 R*d3b` H~" um<ryR`5YfUuh!P*t4t8Y䓃ľZrqYw<sJCg^&Q,$:ծQ߈{(l;vDY%9x6wXx?x$uR;ģ:{pPPQ+/ƥ-ԯ&КM&OM3 nvX xyCPJXڹ~.ˇ)Z/)8^@FnE|>^bKOjk}a4N} =v@cjIXzK"bKC^5J?G~**$gz BP?Oî;?66nWR IqBһi>}Y%=ܢZXxU cx0jCy3fUy$uBrJ?>|HuQG(RuC<M'̅ /D61)+hпd^]ӋWP¬|P.)歛BWoVj{"?,>Q8T~N(el]A4o^Y^'$gr:|=uWE ;d @*j.y{E|9z=t0Vl eWʯn`y/{9;h1&<5] lm{UaQ@8S&g޼`ZY;h%Ƒֆ:XԠo)u/M3U)@c3Ԭ2PDr[hd-m6Ҵl8Q5%-XԹ@XS$ /' 9 sH%kGAa1 ϫmuzU/Z ?~(1hoDOG|~Or<.`UzuՐ0p ϩ.D 駤kBPRmzN_u5-ixY%=U-mDg ()4HQ~'ӫ[uR\ߨZO=TU- 3PN~; P zOzI75 ?+:+l?Bp6EmfgQCLDO|~)}ܰ`}H_y`bRR%D%BDu#8n7BícK]sSI`{x@X`-߰޲ݾ_ëQAuz5T?ڣqto|(1JE.vG[#>=fBd<`#f6|p,.k03!-)^q1$?7/6eY%UӌDC@? 뛩1œYm|TpSƞe&k#PQ8_ q`}?G@P4t=1&ѵb >.|LJ+m9mabL7"95t>(OI)@ U(=hxe½GjQ nZ#D̊:~D$SRINyI/"Ss~N2#z;k0`.[y34_]U1jAfSN $PSϱ7ӿhjjw՟9` vٲgٲw:W 6[ o޺; ՕwͽcX4b!bx72@ +iZf1;ЫK6  .;w03!-q$h .ʖRR_O*i~LN!Od1$yU5+?pm^\vk .yÔg\40E2$؂M某Ity0PbC%Fof%;o`p8 d#`;^v{76o{ `1*![VnnN_m85"~Gf 3]J|h("fd1Z8mH-{OYduAґej::2@߅6hME]LrM摟ⳜސVR/{R .vG[#;̩ƧK'{m "\0h6o\F+6nh</*ZZTp 9.@\~2+`A@[f|peZ(\))$KJ._^VšGRXue>NXboJ~ϕ9O^JRFmSpS*!gjZ.)jD`A^+n:U@3RerJɬ#n k`Pc?; 'sWKN?{ߠAE1jAU0KjڐHeO(mPߧ:%$@,\{3sS!aosQblD.ysPHfH7""]J0%J 6e"jלLNq-9#4LJΣdP{ u~yˆ4kHSAUo6=z}{8w7/2e%qQCбFL]4 $斐ҞŚp:W{ǁ~D@V{v`s+ͥso4&E/ -.Q 6&Yr @ɗ3߳#}dZm'-禊|KX"BG;rːKF D.Nl;Лajec|WnpzhuZtل<ڇ3T[b @vX< {@-c'LYWIe[ؠF1Rh=\6h@tr7?Sn`y] X:`Ņ2Sna }AC>&"FRZJє*2'dRI^_O_Z+NAS0撞EP^e-biEQ %+\l<).~R? ^Ru;g0\P!F85\=fcctuO=m{ P\FwA1iS-)UXE; 0N[9|p`djZZvw<q? >$:Ly, P9ϝ:Faj^+7Gv}LQ3UۤF)~k-BuUB5{rv|I$a OXjȆ{m{OvwHyQgݬȄH }y@tf*V今u7J,׼|9wck0Kk>Wo˺en,2.!'wzF$vR:$IGr1BHǓva "e0hj}aSi'}ܖ> 0:F|#M[GC~w05,'EIH*C*8MWN|pSy bMԿN5&dAWh"Br7oBb(کsIEr%C@F9h֫`vvvR~.B/󀨅&G%ޡl>JOb}* ȭyjl~NQ\'^kqc#]2*)92 : ݟO# N!Qӈ@a'cZy\D媭Εux{=,@>9׊6sD{vCDp즇`D~.?pJ]RKuOM+Yf*0-5<`k˜sYKe/:>~4~9Lr]]KhKF 57DrffhCS*TGҍ;#fJsTDZ`Ct=7>nZP f2NMt:,wz8 *45kb!zdw_h"<γʍ0u#/>p`rɋ Z-iF{]??gM91:xS>aAXli}ÜRZG޽.'-P}=+%,X (=߉%\j]{_|x/)9O^|, wP 60ArK&1+m8J{ mu4b$ _0'%eqvty:$kK}ٶ4$Z{UYAz>yor!z0eݦ.3ن4bpQ h )G5QÖQ;](nG~;;N8>$e )W雿 9Uz8\<]@Hr߃CdeNݗnY *jj1By8%?yah[H G95LRMkŽ^ץ;M&,m4CjzIl E1"?ĤӲ8 d׈ɳN!A)[=ٿep9ހxܜrfQ(04^YWn[ U_rL ` n.<'}xĥU`.75xNJΡn^p+FɭLrCKėq0ϯ&%56ʊ? _\WGJOqi3hC~!s*}:A\UiȷF :T;Vyoi&QFPVk(m;jRmXX!IT cZLHȌw`/+ܼ>=r_QqHCѱ.UF5~jӫP֟HZ[ML `[Mw9HB qNAYdhQXnoߒ/%CZC5snH;}aؙ떶Heε;+?OL 5'8ͤTv?W_Sr*T#*VlNfqFFh'$2*MRĢ2R-׶G~^.a'5 g+ JU;?ˡ W6ƾk'iVY!ly"Ll/`\Ox{=lg/nh5}jwVzS7-b~웷%~3;LKpQ8TЁ1Vw9RW*xӖ^z\89qyԡs':ZxmmΛ'WP#F KXáj s/WB`KF11&͵b|M%cg1i#Ǧӵ]Y+xJ;pt"HL&B;Ǐtn1fzGO 7=YܵЏ;tFaL_g{m: TUa$r;H87o~;+:A` _Ҡ4^yu>y邡a^O^T9k=;SgRLĂRc ZU3gD A]WKrV05,SBBq4̆n:w=5ɽp2k2xkX2vvɛu;iKHIc?.7ڃg~߁v0r6`b1{=0VK~]}I7:IdRrChXEu%%Sax{=|@.N~;aͣ+:'&f[BroyZy49C 2*uT1?3H~uhu^?˷5t=mr?|nN!}ǫ*s<XX_B">ԁbd%U+/;P.M7(CˤH'd+ 6'xFVLn1萁u;BΧU'$юf8G9+UķE8C@Ìq J\ChX+~;- Qe^aMwJ<`inH쑔r5n"I;-2nN Yvd:)% rT44 vzjB|,XsK:bK2+\{' NsMQ ;s*˛o?93d) ܼk#mIMs"ځP!@;(!.wUBržg@d|lwX鈄 +yKkPp$3& oCq dff>Y ":K.up"mz5ع$D|6vXM+nn:5]>R-*[9|'FCKMWYnq@{)xmC Jn kF$ />J V.]DVmZK :%DPg뷜a.PĒZoZU$;+=Xū5!>E)*239 X!zz{HVUXd5f^TN.tIyAXؙ$L^SjC)^O^~4Y4f2`!##7PGO$ :76 .uz K(C&SLegψ15F:r.sE+"M<3 s,]xN8033 : j_qՖƕ9C,ɳ玵WK6~?o~vˣWĚL,D(< )D+J>qzm3'F) I"uz RS(`GAgW7e#HCu#wCJ6?xl٭mIF !=[p/[csZdwS3Oz6zۿG1AT)o;~KcD;kqSDwH9f J[J HD협[AZT=( \ĺug D;9LyM9/uDZ/s,@+p'}5#rknًtK* :WԉD%5Na  zmrJ.U955[p~!ԉBD]F~v8$cDvX< !zX-}t|i x82n(k.<7 `^)pS u呾;Rl/T %qYYE޿wݑZ&W*Zۨ3mo H @$>q{98?B0-^D_kr#X#5HViWH(L.9U8'Ŗm8n?1Uhs H*m913,O^Z{TIiKGT? 1Fib.ns39]յھt0/_ٲ?B0#4!eˠS,4hrJNP§h\)ɥU~F K棃L_c@M3B4Q0hԊD^iEY;U^H7>` M{h{d5Sl-`5/k.d-*#_M#T8D{$:ߒHZij;C2EP#y8\'VrzbćJD9Xǘ4|k{(Ϝ*5e 0z5^7H]*e_{Lun`LZzy#o~sSsR6ez dzF\[7I9g>|p`!CՌ$1gҏdɃ5R:@YKͫӠEsƓWԉb9o~7 \o-Ze:ZNKmrjV>bxA`>lɪl&N{:ۯg=Mr9DoJL㴂ŊuNwOv֣H^=`h P#,jh"-} lYZ~qsj!%UsR Z\>y1[#j^ledw W! " άmX.k6ѨJ&`c0;D.17G'BnH3ɸ @vT9in ~.ov,[3|ߙL = ф+. ,(8xAYvTp }5=Q& R8Q 1wB.(ĥawN N.$cB1f#Y@j^FyI((%2d9˝e}UdHb;P@ hϊ-m5;/i1$;4qTQH}˾Î}ZxLCuD85%8w=u/q01);  ŐS/ٶ!xԴ\S?Ʀ @Je~@'%g{ /ŋ7×&zO1(bW o)"H!Bf$^iEC#a| @i酶݂ȚP-b*V:) Xeo??[#/:!@)Õ߯ߦSUg) @&vS(}15 mOn@5Pՠ<S- uJogđk7m/Ш{mh z{@de"/l[xNK26мJ@kt+C'F6 Y GOkSV~Q+3)3{K$;&Vw>1{a,Wu;6vĦ/^GSr=F4 {D8a>x\lxM](Gl!Bu /˦NN/`;nޔ+p^*0_c/^ݸʱo#PCucD:a:-h֥kHl!`@Љ;K-uiL0g)4$6X{-hx }.cEڇEt6([ZݽGR 2%5v"@#bnX%z8.HψĂRJ;548RK7c3>DrH:a* mHSӿsw5( 4R1%_O# @YTJU;~[φ4*擗M#HC@hӿ0zm/`ExQA"S? `p FqCܜbGsa|" ̺m$@4JC(3%mgHR-) >Թ`Q%(BͿ$:6z\oO9FD431oo|zEZy`h0"Bfu LBJ)QNyuMZ>~M?RS֙$AC*~wߕ yY*X(]vnDQOkn @)'p&;5 YjLu9Xn=N:κ2C0ZC (\:hIpF+}ڐQW&UuزFuؙN,p$#16BpNN\ <ڲv2>x]Wuka>+T?2!A|@!Mz^r>NZpW\GH^UQtDD9sDx=iQͬz!z["arUZfci=7,Y\+;qL?\vRÿv05^7gUfy%!ӑ MkݗJ i?ayG +w:`贳F8/XH(T;OތRB Wn /Ƹa^AʢyKX4ZFv8aNSɉC*^7 9_a]Td_N*I}w7i@@ys G#NV)ml$r+;w($YODGtʎ.]QN N/kt=[ ޵V)Sj{ZjD..yD3)ds>YQ!dbjA$  uȤtG7n"bƒ0u 8FhZܵuZ ? Zt]p%_)!F!jf8Z`1N6*2ʫ-}gFM`G~yS붽FGp\/ CZ@nU IK(11254Wj \Ћ=&_$Y"8X?{7[Z͔J:|!?Wwrz8ٚfdP f`#t@B@ҋKHvYHnyWVR-&E55#ip j`br ɸI[ӳ*R`&DkMݎ-:%T% U]C85= \BȬBK(>kzF!yܝ+]"GR w~cKKXY }?LK!? Td291#%a^K|24_8s2短,I䧳~$JrȔ"0pѳ)}%[Nd27ǝULbjI),&y_UE}h֒bAKIpltua4a3r)1O y9/0u@YXg !tl9-?>+#0\V(}25M4j{z20_6ZVl6BW^`cٸ4˸*9EMmZ\iʭ"2ZWn-Wm3cJw\Z> D%0}?" ^@?g(;@Cw) H䈳>2>iU~suCW{s)'GTwu˼_NO"9>`a}3v2TH$kv˱W7pezYl1,ٛo-ƥX7Y!uNOP_Q8TtR pBGKm""v'QF8UG `Tg8y,.sk9cg&ѱ+#MYPrB=#c8Uȟl/_Z_ZK56eVpT@)P;i b8)x)rH vlD8cDcDvX< !zP?p`cL?ٺϕEțVZEK=[؂QA@jY%=;`nYWij&NZ\H cr֣ NHa>5L4N7Sɏi~=.bwzP&f% Cg8şggk9I?ĤҾ:Rm$.E@cQ}okfj9ùf<}79pNg|_p iJ/⊀rKד3/[#֨DbW&W$Rm_[gԀJH̀_p$WD9.!|řvUJҙQZt1RNJOeTHHV<tq7 }f9LWvZ&C>{19e@D Bzf䖓Ү!ұr3Y0 s3c&^A>snN?rAt:4B|jsEXtR&Fwë4׿^/]bsZDOBe5K_ۏְd1=I&h&Zg8sg?z ;w19$Nq0J)fx 5pƊ5]=iA#]D󎃡n!RfVRzraL#Gw_E/DӸJ6~y$W%uHEy|}x\{zctR5e011Kޣ:FSL ( _ZCR*r29|-URU*!,-+{xT;@#MgK(W虺G uA 7zT?ȩ/ȇ8؜AJ_(uJf kå`5K8TwpGˋ-/nܒd8S ef ]A&1tNa (QI5JDF 5-_Wkl'%W#ˆxw-ݢ<jǣgh__3*7Pcsu]]j~|Kv3u~}i*9Mjt˩<Q@ ]$./5 l BIEkXt޼j#w+_ãijt>U׷0Έw4-Us$,4Q4>L̷~Ƽ|h)Ž!8zAXu hLx~[".X@/NG-^k?.>,XC ꎎؚJPFڅbJrI=M%?'8=tW5?(wi[1B }FZD$`qV159Xmt-ް6'>\|*4 ҃^ mLJg^ÔWSO x Eǟ#c40vFO<*b OS{JJ~VB)Уz @lXbۿ[hnP'}1˫  ӊ6y=/)r`]Y#_s/Y;DRK( cc.\Z8fTEnD[V< q>RZйBB [J5Ey:ez:J+hC%dn+ vC9*vNYsQMSfVԈ)h m!V CNNO'cȗ4ŤY$Khg^Fg7FS<45'9S9G?,'Xhxa5hA3G;yj4O>{1ir-)$I)Kh9~ paQBHcDH< w)>>q,[P%[W ,7Mj3;7mv[BgUoњ~w2?@M9/\AT{ʶvW]Gr-o$ۏ~;~q_Mvjh<ϹRe6O_#K;ά`=s70p`z}f Bm\xsjsSEc B('jkaS%] !E@J@nKY󰡱AJ9pg Qd&9ߣoRGD1ЬRѢ Plʙ(⠸a j@I/e~\Ju-\^oIe8<7yD   =?(pN{Kqytw6f7b'bcgbwNLll<'uO{u\p \ B{z$pO婛7**3OVEB*c|?(h(ݰ۞2, æfz bSEySl*Z·y'K:eaeװ`;Pd \b5@Jy~/hL8XM)*zopF1Xm8ngY=DX]< :9!+2vRŒJJN'@E{}P|aVc$Hر2$~HF ^C7*Y{;aվ"d({h?)xm3ϜxTvE>ݘ{8=w‘8r% .+# ;~~]r%v peJ~ {`σDzW??jeeVkD6#>ghkch ۾gڸzx.(Rn nog}'tթ?-;l/i/ya-AWGsb@X0F~h(ݰ۞}8 %,=y}C#XAy|Ah'`<}+BP*q5Q!N,vv^;><bᗵI"@eK+](/Tߦ]|@I2i~!U;x^RŒ:6<<`fE(w杪/ h6jݰ3-P}P`Qx>[%'Έĸ~ǽ {@k8l!zAmW**x1.|v `WR9u,g#օny?=Þ77#>A@5L3}vaN̄P[,0\`MfЋ8恰YiᅽTP-cEu lDF *ܿ[55;)Ľ7u;kYRŒZ7Ԓ*=EzI64fVN1Zz e:Gv'Oqf-@22Ȓ@)K;9/=qA&;wtz)P5.;Fv3|n(uƋJCf䋱wYWc$/Iijٔ2y#>#?F  m$7$@yig@4ڌ1?%>|9ΈD٩eF!¥pNɒje--,̏ZX 6&b'mc kȶ'p%]b Byt6ƽzG {B?[*Ơ 2dt82,; PzzZ`w#rp6eǟqz, 1R(_ֶlYe<&4%1QqMVPI]sRcD)z d_y_Ca8o{?=w'DEDƿu$H@@F@j $D3H [$Ю9 T 2LNuA׾ȶw>.vuU/ݐ+ߩ~q{!'}|Fg*E"#LĤ !6VJجj6)d#2e:[nیiGOulִfSj"@]'JOfjũbKE N*DȩnosT?:#Q$^2'h!X0fhhXq>)'3ROC0`r=xf!k]m^hl}#6lDySYq} 1#~?+ m5>h kD)_==M. Kvj#G xa˛ c'@[Kq@z1ׯ|ёdeW%lxfA8ӋPc{*b3j~>@#i)d߉Y,0 ?IZD$`Uf+շ>2ؤp"8/w}Q?Ihcݘ㼢yp˧_umnCuÀbd1ZDt(  ~>g/v?Y2֋// ;/{+ְS{^Nj#;}7!'Q0N `|tB6dF۴dNslYqܡt @>ZPg/'S+0vAvvX_:﭅]g'eJX0jy03EOb;=ɢnݽz_r뎈:sm0I# ~ m( |W47lTf>#=g沙%U߁߇ߋ3sZؿtvTT;&Db$q",Y"!gcM*#c a2tA ~wаA3,II6/~UPѹ& FGlV8I@4C(zfY%]OaXwB2}WrgWV$v!2Ǯ?~/~?c̿u i:_ 6=xy X?ޣ& B$$ . /lqL7JZY 0ߑJx~0{>q&|WY}F! vsW{Tߪ%1 ''|~CgJ-s,=?>alj4cަ19c|pNږ?__7 I欞R@  UX܎~^ Aȍd"W0&}'￲uT }&iepEuŋ [bZSQŲ*YFiYRfJVXSJN??ߡ:#~ؿ  yqO*`\4Pвy=VN ">A8uVęrWTLȴذПB{ .sl@I3Bm;ͪyfEkշjɒ6sLf3˫fnhÂ-suՏ&%V"+xF0>cׄqq+ՏQ`- ^\@w v'fo~ N]]q[$g <_?~%]"CZ2gȝq>1c@(OS+CF甸uɡ1zn{ysaEXخIeJ8q;yNq.YΌ]hi[~m.tjHx !@Kv++y#.?~ Ͽ'wh ! @QWFTf9P +6z>=ED!@@ºZ'cgOBݶ[3_Ó!ؽڐG:m'{;(̪i%?fɆAH<"u+^N_Ph{?Rg׸R3ڸҰjoj?=j`.Ԏ!'>n\󅢗?ȝ!wdVa4T"]lW+D!hpB%! y; |WO`ZPΒ@&E@Cd' d os$GDIBO 'CsmK?Ks֗ ޯCբJp0,$ڌ-qeW;~e5QI "TJ|Pɶ}ӯYilZ!Mʄ"]6؏dqsj{!Nݸs/!ffm{8R#C2:L=NȊtQO^3"7q.~QFW < |#st~DK/ @vqr@Cd;ƳoYy5zJH׽ E<d1z?9E482a͉s`ápJ/v~˕n;!0 q!2Y$/H'o$^v]EqS1=;5|Azrj]wM6<0;}F P . ^>굡52/y8F@nR̯Z4-tu N~Y_Yw,tRPP.*fv<kuv<-e~CKm1I(vYNKD|R#\#DY#2}yFBmElWcF8w~mcroe V E62 4߾iZE0yγ5bAp D٣Κ>Ǚlb/9EK˪mYgwM*+/,H8]u`¸X\>23Ss9l'gg+#3V !RMg$a~:HT~F|.8o%ͬn"4}aU?~.ޭzqN2lF&ĊCMp_B' 99]!s (/T*8b@ֲ 6%M-_Ħq',*a%54 p𯾣C>K|AvR-h@ruȤ ʝN&ɨ'p}SrvD&d A.(1_M/ 'sRȮn󆹪mw?w@<0xzxv8bFwDII'Ysp29yÆ{FEMzz gPŨp0T!%C' 9yĀ|M?!@1M8W67 a {󟇐qs-v+>IBIfG'Ž+^g|1_dB2af:*JN>hiS w`t;#ebD.;~,Y/JYyߓjF)sijhY< C9s>8`Dy c=gk;T 9-+zZ*2ֻDo~v ;]ߍ2s0hGeE:c kD(U, f5/xȼ^8GL<6Z.L҉}i]ӖBlيsmn}?E[x }*/1] ѐ)=iq p D8^^(|t]5Jn gDT~hv$;>Y:׃ !8lfm8#s+ِbjooSsXFynm ŵ:O@v^^ 8 0wFǚk%JT r97|qR_8o]:"+'kO3ԡ>y ƂYXEs@]Q}OfC9{:Ӷav)[J~Wf]e6^ժ_% ,yE}O?1=dzx,Cq۪c7C߹6n}S_Xtx'"l!lnmeYlTfAxM5O9:!Lp}NjTr7*i'/^7 HGIp8ˡY9-me#\z,زM*o09[dFuN)սf%,yFIvMkz'K`qCsWM[Cr7Ư1]67B("^PO.ݼ#v]s@֥tQ}4:;B T6~V{vylZQ9+kl g?6-`eWRClD*}:3Q!2L(4'*@v^"юP'3O>~Q8_/=ôHHոh Rc  %Te /e 6 N;$=]#(ihyNd|NKT`QZ潸v_~/[}^8eM(Wyh_5h^ɞuvɳL%N!ݹMrKkj!wgN `8NG@ ɣ8M ÎRMͬN$QZ2*Yve55WײzVRʚwԖ~|(5euZ.,J$xB"۟kV~T h8`tP3-%/߼#{TZY,<~'ÆX (88iu( QɛpxBIʫ,g9f dN9>'mg ;¯}~AiciTmYˡZ\\@F@d*~I'>7:1}_c['NUPY-^O_dgrxd?y-]B!>9'$ht%B%uIYZʬ?#XfJdFi=Ƭz#$xB"۟}0T~Yu 7"o=?= q8$/нцQD쪔7 ;MN圖>]i @w:3_\B|LxcA MV-ĴJ6P4>@ ȓdkD7+{R3bnwB<~*.Ͽs^;3TcFy5;`(-%IȀ6Rfd)c)|on?T.; R˟\lMj`C-o=r9A O_!^;vx&Y\ sȤNp§TAr\uQodf>˭eՆ rq+s~>!| Yo'? 2Kc2幢EͲ泎خ9!їlq3_↦ϝqߏў~t݌yH?#*J@8q8:'/]矯 !ӗQJY"oдY;wE5dERKɿ|,3Q tTn3 hH/g?zG|?PZXBW>?/t7PO[u?>R<7cyҲ;˄N B8>:!j? ;TFg~լbvqSK$wŹNmNj*2c87.8urq׮jA}s8wE/N-^CB6;$(4M,k/\-شm8n‘p~WU-Y&Gu%0^1%}w}PK8/a8FLD{B =UFaM^&t5 Ki~2SQ~ژO@vƟj=#>A0~.tĬ Kn'a;_\uǓӱ\ױ@IԶNm[l HT)V$qʩf9C g\TN"l-SY2']gq_[w7g\ni7m쁏# ݋;8yDBJn8,nؽ/[,{5e7[%QfFVұe7.`fDVq}($M;yyV bv[{m}Sy6!$:WC0sx"eT+ hH/g?zG|P-ngNBc~D99  d6vb#jgqf?PU;zO>EJH,S@Љ;@-ڹx O/:9epɜ<\tBWEK#5,,~}I_Tm=>,ҊxetJ4oktM+`tԪ㏲eD-qp>+`{"1|-~ο1)gvo?_khz7a R~=$xB"۟}0T/\h^,gU`gv}w xߛ;3%$5bQf2O80K-9Nɜ5T-".{]m}SRoo}u1D{.oibdI} D drA45'%R7H88% G(#,L)alS$CbT""S=$xB"۟}0TW4wIPy;)_(d#1^,Ʊ# 6ՇlFfMNK$kɜ%sIg1-EnMW2@SGrGH.)Y5Cdwu9YG]a O_ %c&8"esCg>Gىltv2;QYmEK:eI7b;3ɪH#+_z Y^TFj O@vƟj=#>AzH_ژU/UPhi*YmWS1@N%uZcBN;%tR)ֳ0X:HvǍՑT˫7Ȓ/ZQvW&2餈.ѪOc&pTb;!sO ā5lFIRX&数q9ElTV')7Uհ&Fw5k;c(Z4W '2϶%"%/*-h\E|hTA/n" @~@(ܒ GǬ9m3N:%IGܱj'2˶E9ccI^᷾0{;1,YpJc?vD1sON l}uxF:8/]yc(2ūn_)Ӫ@otvs0<ӌ5dc ]3bFYi%.B' O5&wHe),2r~'ԋ^"I\Tؕҟ6GNv:x}\F&{ޖJfG8!MkOse<;uzR}xg&v7Dm7c48b1@9!NsOȼBX҈\-a_-(׾i0A (d7g_y_<`vdҦ_4 hH/g?zG|;za/2/_vwBs67.Ve6jcHj*.LIޔ QjwFH­Lg^aWn+ܶo%Շ|[ٕc,|˄j&v$∉F8:) >kN>PO~}4p͞  DC 91*0ΟVm, ;"hL-yb9Ў?!@~φL /Pzj7;nO⺈E٨Ѧ-iYdԙGrX}ɳĥT xHBxxr8q~DF^7XGL"hNz8/a ?'4K8(~dߍH]UDO/UJ9T4y/&ﹽ5dj4pu]3^C' O5&QY2 L7<9C$R; ^C\;C"ɆNj&rVGF{ cC |x ;͝&/I7Ggu_,ê-+19!IjE8>L8v ZeYU gU$U4g5"߼b{>lѶtJq1'.T׉D1Ȋ 34^A' O5(nG&Mm17myc{NzŢ5f D.NS9?Dw'dfYU҆l%$| 7ؙspB;g'/]gsY Ne$;c&g #w]v9%ɤ\gWԒ/Ѣ`M+a=-:" &V4w-gs:ٴJ13>CQp}\#%J? g biM\6pjN%) 6KNҦ99"UK|ATr~ߗU .v[+[=sw}IUa@ sj-6ݤ,6t6jmȊ(Į.2+6 hH/g?zG|X(R9TqPѠ *e TDIe# Y#w•+ +U?{~B@=nuы ^":Y>M.(9_e,UհzV1gNvӏPܦ9/ U vnSMćT~aO ' I̩ w𥻏Zn:G}.][ЇWi OW/wN}0v ya/#fU)oU8M>&ked Ok%V4p|6 `0˳p_;\߃C܉h"t/H?H@;Dza?`&?C@.9S^*NkX" L!cfml*Nl{' ](k5=3!+5 5gvX ;~2d:kJb[;ң Mϰ2ּv+qOAhXɴcp?rE%tbv3p1 a@ǀ9")~|ߋ$CehU?3 @$H"Na1iDx)_,bgEs氌J6tz;v]Te)*,;bԡjzc Q^ 0y(iOB4OCd-s뎼Z7`mKE;2zE X5% 6Q.Ja`Æ.q-E HC/?kHs;]}|~g?VFτ vnSMćTL%ve-j)ȄS"TS`jQyNgB/~'2`qN_Wq6ne^J8ղOWD}'ZvH@Y YقUtJV<9VؾL[˚ꭆjԏ cߎ%DkN$bW~"!@(S,;uΒd*Y Γ^hkٌJ6> 'HXRCXS(vjKEb+ 䎿񗥨x &Ƅjc/RB_Ӎ~5kv^FHb4X<%Es%C4G(xߡ $xB"۟}0T!UI4!@ԢS2L<;2Z&aсqzja[&I%ljQ^\fTJ:J pҤӏnUsO!Yߖ.2MWVM (l)tV#,Ę3=N?axμTA$ hH/g?z`Iu@b,Ɉ}itJ/ !#%J[&j=QRÉ$Up;t֟Qj2"@!*wv _ʆLz!KHU?ՐVN"PȖf-CDKhM8%qߧbR*h{_C'zE"p*- opR(OŤO) ܫH Y @'@}*&h"I[$xrǟjHHP   aLp%{Q~H  p>6*8vU?Ր@AA? H)AVݷ 4Ȃe5hϝT䝄_r~͙i,ssOC?rrnsnrsr.qspNs|p sb3n4xQ'oι'#eK=2U ݿ/ s׹&;N10";cƟ "xlڗ|rG7^9{Y@fqҰ9g7KiGٶ٦{;٪[M"kmc%G}ǎ)vIhxTߣU\ qOZW&{@2Lv⛫Sg  { ƿQU78KRٽ{~Ɲ]>Xau0KbvvbB߱sDHgH{K"% NJYT;oZđ)G>!_ ߷SI0Fgr_~yw"=G+?{ؽΰm.@`ϱcwJ9ʎܱ`YVa`K7 uۮ^a?8&kkofmJ"MdwrU/`w;vŽ{f:v9"zN{rEYQpp\G!Vm٢ɳ1qgon:'Ўy{up6+n_r op _ҾD@8<2$1lߘ&ο. cΝʯ rPqHb0v$! $! Ȭm{>9)o ߂Vch2G|ivs;>X)NI;DQlڷ/,I^AlU > $V! xf)Z%f=B-{眯`gb]uG݃t^<71,?1jȴY2ǜ_;Y}kN$e>XL8˯ | 9Ec[gI B@X@}^>qOzݯ/]e.]g|{]%PAΟAV;Y@O/{S`Y@z,|YOAmf@a#$.@@؇gYۧ/zɳ9<C6J0|U` gf Ȓv,X #@)`|6;V~] ~DHQ  MAdk=xhG8˧)wpWN5BopO~#[(3C~B?fi,)dd3Ldc$(IIT_W!!<" K`z 0'ރo͘=G8_*wNO\J]GEYv];[ɞ;LC2t<7!*f3YӪMM)K=Schz :[QQ񧠪' eh d ;9zɬE_1gDlPE<d#a  @-bKC4tv1!wY׈ Mgyf[p@ݼGdSחEy}Լ=vś7n a2~ǻ__9=ڗ/0,dFqol9sVe%ic Yy3vxNvP~= @ hda0nnrPd9>Bq~5Q4wDt1L7!=+^@F{+;d ʍ[8}:8ym˖ gsυX2k_J[;PYUli7<3+mf5v^.=>x_sz~oq2 =wO#XyƸdT] c6!r;$.A@1z`ſwHPi vUqC:J ?5|+m~#%Ϩmps3OJ;zӋgg8QO#?F</۝̒S UH昽H+$ Aą%H0OaÿN`>=u˟g"v\]&x6, ]$%&@H \ch ;pb"Z}t wv| F9zv;FgPa$Kqu1{?v(`O)gbD<' Zh@WSwid.XH B $.A@'ܑ\P yXJv9O%' a JaHhK"[6:5X9"D\#ds.4;p9q8U‰McOGl%vpe3@ fCf#k-Dv6ljw8#e׀둡zq,3?s42 -/@A*#}8=,' Ɗ㉾{V}'ØT?6"-Ds4#ۘ܊n&wlĊ-^,]_?3Lwa\O\2#XZ Bp/Xio\1M35]{a=,8=l.poFH2k_@礿n@"sz3@ {ad9 DwH0׃ #31 :9+j[v:eUF&{Ӳ;zA\.-٧iv?a:Y=G$tk۰-u-ܼƪa#KDh3οm6#2gn_̆O@IAj? sm6;z(EujǓÇx T`GuF@tc5oT_5kXl,O&0ϳE[b;;iz$pmdAֲv+m`Ovf!aT+,ƳުREZx#جՒEhǟ,#!"F@ɰ3_^7YTGʋ"s6C T`G\e6-' m۬rnݖ-l5wCKجjrGQyVk9z209[8y(ftbdb#gYUbgvJbOUGPfo5{͝A8r9|<3#'3gC[MV߇6B[aAڍ"@洶+v'*Um>']쩡cXQ٠Id2:bBv4BB.E}b  A EH0=6is/6ln,M8PmrVX]FMaNʓ9wz=H82=eϏɘ k(™iV]K'όx/J-[+,A!Ϥ?bh meֆQ5WƎ êf6XG EݻG۠VfmeP[UW^ εYw[ w9|8:fE2^ A  KV9QaKu>nܹS8pL)N@?'3!E83xshĥvx&{.gEmFh+62-_kXܹ^Yw!D($R KC摍p\X߅ ҇|mM$[c^`}p:ETC @'wL±Ξ`R:}L9~F0!8`-&{5̮S}nZvhL|wJQ?s!X}Vdݜj/#p\zV AmH0=i ф}TR8Qݿ- CS'gF4gp7wm2k(:kΪ.*`Q_ <'ϊ!4H  pI @@1[DcMxq btN! l$V&meP'uvۖ_E8~^ U\0}zz$c$! z?zoDrN$0md@!p6(2lU^>ǞAnspiG` =r@cs򿈶b jI,sMyg4#l^~f? D H0!@c6mc&PYU_LDMWAMpiG`">z}l =H Bv2OuDz*6S"$H $b-\^ېQ@? T@?H0$znCv>R}!dG$;hGx C/mO52O AZ@@! p2s `$;hGx C/mسd$;hGx- ڱ' 6d,_,XvQ | ? >^ې: `u #< $znChnk@X  p2F,Xv_ | '@D W}Zv `/d>>GXy,P 9>B ^N/E =҈KG$6-9> 6A} cib:ˣ#5YYT#r} %٠$A> vH6Gk$3iq7I( 8-> u+dEzgb9.O!Hv_;8dY쮆ey@?"eXy3۰s'[mk!awl8iG ?  @  5@@A$$ؙc:t?pkDK?h\&Ư8X8nq8Sq<_K |eq:XL\ [E.R .[J\u|1i[q>cp"?Xn~Ã<#3< ϯ8r^Lל?a)"@/! $0H H "8ؙc L-4{}{n>+Xr 9k89T  _bBKE};E;E:CBN?_2$Kqtοe`/>pޭbc3?PhWNJ<5{@?p)H —$!cʟ#A"ɌgPά=|b 2%yL Ҋd'Ea ɎKW:ӿN(2E%:NQ"!q9X(s5Y U:9;@  _`ǚ@NqqXL|,T*LJ4610D%N9 "N;p#g;BȬؗǙK" A';"@GH pz/wWa]]]p,?0E%N;VD ;"@ _㏅Y5#_" A7m2[?pHs/z?%vX'=[p)@A$ ,8 ggK?2222$@A۴ogAgK>22222.gI$KA#a; )|ǻuY7# sA;X  l`g97[ߑ&,@/\p a7; &s٫U{H —x-l?x$KL3Vsdddddd6ϙw Atv@P*,{FA$;%Yi}Vpdddddd Z # T&>wk722222 bc$ʤpHOLnddddddڇ?g$@a7+ "{mddddddNX# Tk`ǡCv  \@5222222g Rܱ P,犧5222222 H "Zq( \B06@D]@qZ2',sBFFFFF9 U! ԁ& ^ܰ>aj$G|.<$>9DPثhFFFFFFh@I "6͹hFFFFFu>~go" A"8)X1Hrx"##### !{ <=zN't$Gvrt \bw@xQI<[>8sv9Ȼ_{ʕ+  Av$S~ѣޭȂd_^!o5}[=yNbx Zsr:U-Z xYȪ^R%o/JJXNe%+1#3/g 3g)SXfY9K-RYrQ1 <3 '-[A!08S=_g pewʰbTՍ7ԝ\TXAWbO7O& {Jw_ozBk*oR @c u[xۀ}/pNE#x+٫V@-Y*94oNN2"zj"^7e*xe/7.{W9sM}N&w[s6{W~&ac6T~lƲ7!]3\@k 0uZ \ꮄThpƱҒ"^xBP48֑u๑!YGKCCxN gxk suaϏ/}s0;:fǞ*z*CH-D WיeLS0m:q'^9^^P{L1sg){2N{~ʉkO @j?ĬUU6+=aʢE] NVv]sK[VS[1ϝ ;l@ࡕRT8!ɛ!!?8(X.ܴWlgm/@WX) ͞3= Ԯz}t ߀֘aQ;j=Y';piH4i' OHė[1H29Gr2's];" ^]} /NBp3K|lL-yg4v-Q~ "L#]DkYh<٦?GEkl<td~S6gyy &esz?c K ¼{_ Zsol7qs#Sp# _F@`YD6<:g${t<#:%d |>u]<~^5\Rt^S;`v͟:$N`v1+x@rQk>~mx6HIqw6$DNooQF5pcw}HX"Mo8 l>c9 #B>Bc_[:+--|^u\wq&gϸWx=mޔ) g98O_%s N zk-ܵrAb#B35 ğgY+V:OKp?ɊX^qG?]}Xs?XkG[{k);P\E֕qloW(x؄zHB (+3D৙ ukA1wK>k}_ϯ4/砿 VJq/v-|.yG $%_ɚR{z#B~ +Ŋjx.uOvN7o:s`ݝ0`ZKx`B@xn䮰$Θ5pp?VG,,OCb"]8~wǿqDqxG֝}sk?(N!YZ99p?QLx$=3(':[1!!K3gE31::i^eue"2KdvvG,=]n.kȒwR_P*=x*%P͹lϩlgC٪/ؼjzVP%U_pJz,(*XfV9Ķ;IzBEOkM= >ywM{ .֮׽FG_싽:k[ZZ &f7"q(] \I,UKK.H-H{.'k xqH@k}8!q5#L?Wxo1&4iew;枿,yV`-C^0gy{=i< u:Gå55l$9<f!DZQ"sINQ9nbxoE4Ǟ~ Ukv'N~$tH=|7b, %k1|~ʀѦau=z[e+N&tˤeoVNlpr`A1{'4oh\, ^;$7__@>#[YqByU8! l_`UKױ9a;& \6~qHoOG=p&[)@7׿.zG5/0&k}C|C꼃cD{+g۸yaiG.l,En~.0% %ܩCoO?u?`UBWE>`!_|A8ٿ@VhN@?Cp ^w̃Ax 5 VH3N7zqs@G5x"*E*+y>šVzxz*6r'4VO1pTY(s1cB^z."Bz^̦>_rɟ]H{9x χ|7yUXtq|*n{I [-a^9`pjxf٢Xmp,L0,|[S8C:[k{_4=ٰPz kHhfCkRqkH8#q3[ kqC߰)sq wV2rV7 eWزBK9q2Df`HN}B|nOAtOC"SCR%mot ~-\< 7 vчXÿMmqxxltȎKžY)Lxю56-}5|!$ >0k[YuL1=*4;f@bO[[dy@S9Jm='U7M k'nIrzBț駣@<ޗb"ӽ G^zN>_ '5fu~C|0kI'HgK?s?w[6'GD Kq^۵<ZybqlpV <[so;,#96p&ƄK{fYa zD$| D y5q)39y1b2rN\wGs Dm6Lwvɋ5`L|E1{ ඣȄqV)r?|?a?Ȼ"o^3(2m5kߓ k&p?A{o i w;??-AiyYC0vL1`tw0',!@=N2AǤ+ȸ6"6ڈ&wmTBщWA}-OP{S< M`@xz=okם{˄z~] /0>S` dwSq`@h81OzeH▼'}aFб= Xx?(19/l )6ɿzͿT-DA:lVu"f iA~j[q @0}d $bÇg}v}́l-HQs* ˼srF>Q+ω{+rS9H7W4=RG.mX$D b@t)_Wg'jHc5y1+M?Po?M\ qp!4U%7,9zX"1*!'\ H5 %j`JBj4 ɘ`ox-އkZ.>&a@"O+x+ WS M^.ot(ى AIOHGjm_;` 飭Ob+/B3 \^)ZKN{AXXϸ_DJ= 0݁=]N?RTISM(1w$#NY T?!?ز{ֳW,uK,)>@wߓUk@㏄)'*8(y  }џkV)T`>MX H̻ āc58d+ $X`/.<φ$ <hHpQ xZaCBC+st$_sgi߸0_mdW=L܎rMte1r*bJ nʡ{WXTsEȢ%>Y2osd|ʘG_T*y\C'/&bAFԫ<̢@bMUbBv1e˭#L}ޏມcPP`"Pp `/o@p}1yVNx 2{'B*Ձ "C<#|Bo ~[)achF[׽YPx,hp[}3kUd2Ej%b=,~Aq'_ٟ9;/`[ CXLL!^z>] ;%[2s:'FP>8,(YߛW"k#v!5X|>#⎒D%ʠ >h]! HÑG1RYzUBлo[شҿn _ 8&S¸SVn${!_N@,Hj0TYB,~[>o+.ewE{sF͘Hzz&DzRU$1 ǟ9s 2&[)ed7A^I]qϸ&OX-!ssnʆ =!JzFGsBz8wdexo@sA*.`l'+bQ̿? BoyGN;RT^ʋ&Tb \0W4 E k>ǯ0~oq$䖲+w{VȊ^k{=nnc?!T8YDb廏uOw|O@t 7%3G!fPȮɻ#pW b5B"?ߏPYj@p} *׊[Xg~"r= b}z{FrHxamTkALVl}OJ' {yzY@QdG !ݛ`ܷI12TW%dIt_ t8E  ;*%?V'ä+3@!$ŕӄ` IN0%kXk+ʾ\$*9`g_*1ٮKXxuF?zaxUZ-\QUwT~ayPX"b_Í|T MO6%p}GlOhMDWY-XU$đ|* UD O5"4 1ERz-&V_H(q!dy t e'Qbuxޏk =H~+{ʪ£kRH,<K֡$?81ƁDC6SJ({!<~[P #)QΏ=B<|S?{@Zd^&^=/`e/> k>rT{Bcz*3{ R鈰^^^BpX+1,8\g  }Q]nE(8L'J~X*T1й_T@8KW#1k0 'X^{ULAz3;*}F\',.=46Q,R -jyDA7y<F߃_XW=DW~ke XIVsL'_;nb pBv,qA_AbT#YU#=2IsϥNw.b ΥW.4j!cʢS[x_u)0@'[ ^ e&UHkstQ4c֪|…,5_|êVnbI%؈l7(r88R.we‹=MDW{hdV]rLa,"E,4 ^BĽ vYj@BD“n_|]gLYd^\:gAcpʥ؇ {` :,> 0fMv8bn2 C.iVGu`j.ܽIj9ğ&K/ޡ__΍>"ދk= $ 3YQQG?'0Y3LW*|_Ee+qP<v$\G4@ =D0j9!RÉ 0f^C`T!*i0vҳ/3z9!kƊ3@+Cyx/k=$;H5.;5{BC>j c9Ջy %Oqȗ`,1.KVMq[@XAwaiu b  g_dwa4# QI%2Yg6aΚ@*3ǼFǯ /9 r< m/3H*JX9}$śpi/25 $gkH}^P}6/%p`ɶ}'hn9דN.sR;8ʇ~:+TFL=J1թV:';( [С":|J :\"@Bh$8 !h"1\pNs!>SP3'g*?*lFK=B5 nńEzxB=1}|a Nh>F} _<{gbt"j ?)Y-7Y}NrڷDlp ݽbm a$4o`S9G@7!c1jX#g1}ϲ%n`08~0 @ @_=C!8빁*!懃/p`F3ަfF3ڷ!!!gϭ7/ o4k[_=ye 6GY}5ьv#wZ| Yqo pXF={%4 Q3oA91_y./\;5f._dS>{J))ȐB1dJxHB&i\8aIHoxNpYDld1@ E ЖbDM x-%;|o@~A1 K=$"Tⴣ()/H{2V{Ak]pOR,Qw_4xKN{ ?#X]RhF3斃^z`_rl]hFsB?/?{[\ɲ+g jpDr#8h lğ:Wθ.,`8dQͯ8\HigٰLyl:1@y1|2D9ac 8[CN*c |\@7 IΛnκmTY;TIa7@Da#>d!1.a_ mC~z]Ed KDϕ%ɹ0Fn]o|`q˗m4# +?nTwL O:rC׊>V DBD{/d_2GZBS# / ?)Iب>,_ygХ+nzkBW] ,  tWywKPwGrZs>N `Iˋ6 hFsQ{5LohF3Ca4*٨1dbrroh ꯱x Kzא]5њbSRXTqu?8*՞c/6q8;L#ׁ$M+`1Y}Ks)9(Eat㳅'wh}aь*Z^c ',Q@!|+ȟS%!2zn2bE0̮! LcْyCĩbRQ4kc̒qTRW˾b&H]O;QγR-'J:y{W}lXY PJډj Jhv3 gN@\gh;{B p'k_~g-~/. X&/3E]1nc00$ O}uفpi"\/ e;r>Mwܺ{f4yKK! ֙G'hF3ufHdh;zNsL7 uhtz*n8d,WX9Z8gK"xŶ>S<_Gp%;8&, O % @cSk̲ 2Ѓd@Hi&_\~9v3~*i2⏚ "Z%\%oEV:L*R'EY1)?QQ-m$Yϸ)FXM"ޯzGɝH~wAEFUu󇷏Bx42ᵋ}]Ɣ0GP5@#P@IǞ ľ4B!Ad|9 !bSf_8=u=B>>[W?qCd/<<wGHzR)$yHdmX5p}?!X㶝c4hnj^nnnS/fN?ff*na9c˖-ylCmkɵ$aLƒH-m~o"ZNI `م>c 0 DQD""c񗉿 >\!rYZMc*+@,J>:X sf!CؾA Iͯ;tbmhF3۳^\HhFsaC"?b:?^80bs9 D%zoqj*Y:q­{Ygn,)-dvn`#A_ z.va #U0_8#L',.<82xޡ)_C҃cJZC&;6 {]51@07JV@k4-S4k{yxB]9|Ǭb/²\fWH6]"8aA ^Dp(Jx7v:&+P/HRl 'ӳT ^\ƒc$WD!q{&RBuwDlEDち-%D4P#nW?&h YWf4mlm/Z9 WF3P@wӑcf1_{& 䇸Dd Ituzml,TqzS3Diy,#ƙAw-,DdC IXnbsKY̢pcP!co 7>-Ri }c{4(<6^\ON')[ wRsw\$eW<8`:D/<^ƎDvpY_?'3e|o~Dz- CjBS}CyY#S(v,   ]qwjH"=z~xy */JwfQ>{ ]3 ϔJ꯺>~S' C"L$ teit惧tb)CB^fQG⎽lTڭ>]+˜^RF9oF'1@}%HI ~~|*w$^^WJ.`^?›(`WEr ^?049B^Ŵ&kȭvtѺVm۾yw|'Nȟ) G?$0whF39Wߖьf4W_o?TFEp[?2G唨G&AAKOǺ'Jͼ89혜򫸿Qc2Oe/=- $e m?(xޞ|-Ʌ>cO[_xf 罇u6bN* jAjxNL"ٟNsBkI>CY 1) `*y{0:p'K급a%U٪I$7M$A"%>C3%z\d9'HjK%bFKkU+Tf: Kc C]LwdbvyV=67:y ZhCdy?*XЈrH=3z>3Aa?tܚ/_`pFaGC7l[ݺ{lX/bPaWd*~5{q$Euw)L! (]6~qI3-W :N4> L5Q wܒZ4M|?`,?rk٭GHz _gоryA(X=xBkhFְתVo! ?Ugh}6hwp̝| `7=̂rMbuLJ?̛N¿?YjҰқTp|3T52Yqe*cv7Б c"[ 2s vnƻRlFz8ָ넪`<Pm}r67-y& Lͻ*pΌKk(`|8t\k$K|Xyמ=__'8O^#?\Oխ<{qŻ_}hٍ'OdLhxXCvI`wP7 ar B|?k{Ahy_6abGd^3CZ*@ k_K]ozNc/7󛔗e,w/ aѳD*]{){1coP:A<?Ue;v.0n|g/C~;||C ;yCZq6<+Q?j'ޅ˿I,eԶ&Wﰮ%W P酷qu<5>~NcV2/"H DF_ k yg": J6lLj7Zmup#<#|%ϠZȯEk7(fIZ&ΧEBϛQ`ᱱ  lZ +//% E @CMX\g { @ .$ 1pFl,>IdŅ;67Z*p?hA-6$sV"A7(UjbKOA *n!{˗|쬆 r_ka> |[[}Grx BT8ySZ@,Xϫ{t}!޲uX~5`wH qH2KYy?D,dի6[ͻYelx\&_7qE K6,T,RuWc/o1ٟbܕèY9@% iptg.KwyȤ, WjXptw:@kj%BBV]4Q93Vxf?< }o,ߴn@j~̸ yun]'H_H9Us o3,_{x -Kn-bqza+j@nOršJ0Z|a!d H ZO']zzz@x`iVfAp'|qLj,_G,Baax~9v޾Pm975U#Hxw?rШco#[_fJ.M=gw|NiBbe!< O=<&:?%ʽ!,,H$vWE?H,$YԧDkgj/8%1,%BӅ^o6͒T]w_HGvzkWTR(C<1k݀׶`A@rv}=}։w_.?L#/eatknXz"`!3+ ,WPdRPLҦ-n%o2^"OZLq`ۓ>HoOixlyyWV_ JcDRTshc|^:Urr'.ZêdkGΰgoؼ?uOw0kEuգ HOTO|nZmbK ~O_ cxLFȔF$YZ_{J-A'wM5{w{r&w:<-bg矈9;,::?:1*9Vz^`Dm"ֺC I$,ȴONԄP"xLMMf-̩ٛS6 Wـu ?)gN]u;4vl?R?3517ml6}WTDm/xd3᠃+lf.fE,(u<e$={t8̂rY\dVȿx6=Aa>pGêo?Jfc+gR62> dNxoPB|XHz?~|1+&=n,gGDW7'"̠d͗d/_1ǵ9T:Hf or3WK9?3J'ZhcC0`Z!:uy 2DH7Ѧ+P;zx /$>/~WR`z;@A>؈ "[O\!+ ߞLΆOqw߷ƪ`1fh ;A`;^^@ DI3=G<>`߰wh|-cmwhֿ_d20w.>xVA 9: >!5@ҌXs<ϥ=ҵ Uv_$<=66%BUB@+cE{5_cbG!aQapgDQCM{@zϟ%[!>x#Fi> $;ΎG2s/!LuE19t?A 6*1ֈȰ,D 'ҍ /xT/Zsi ʙ/72W.8g+SIоE1ю1y 'o(9 4Y$؇d-ln݊P{VA_M"{I( bM׆5ЕF*>³Ȫ~CدeF ,49fgE,|2Y|łR0}=D!׈6f~Npuw\6dvW?wΪVmfac G>#͈nalph$?)ŌfylĉbRY,c_H$g*#2;y $nf#x &efH+( c4<"}ɓ0eLe ܙy VwxPh =Gwx3 !Cb3غ#g3 mK9's%/q7^Ǘ^Ɵ,O 7.Dw!Z@0w9d?ůbXZ}@{sZ27y'1(SO%슏)Cx8C aђuYrAD;PsYN4',~sc-V,|IA#YP|2˜PD{9dZzw@><(@wſ 6w;}<$/;GtT ΰ5-gC~$ZD$r!FMއִ)C¶|08dk`J^DVB%Yڣ !fލkwڴz\hAaGo⯺kj-p QpX|v$ifdMx-ʪ!HU7VI5O toM ȸ;Xѹe=,3g/<^+/9֠ג~͡wK2TAaQU  8e{Q)]N3$8Е͜&͚&ϙ*e汪̀ ufϦ0HB?"K<}so ].5G"3p@Dyxk?cR<ʪҍy `QY>^>$,2 0 8WqEE, &w0gYHF>zi7C~!itc 3[|,~\QѼ6,&`MA8__#WT;ӚQ"+Q?rqw@4+[%>[l~@xk`#| ac ax (JTbyH5"L?2-S%%wy'ߗE\{D(BD1O&]0 5&=͙o 8[!hUmNݬ_Ps3gI@X#GI @xkW1%_1/,~"߬ Y- 5{'S.yܶ|*S2&DTR'RD 8q]X<(|uȸ#^Qi͆+aocolDÓYpCda'2,@9.dZ(ހlTL+E~) d> rEEd0&Ãٲ}G=~8w[:Ɨ!#XviqhBt%)$!H0o)Rss@Cb7h,d_Xߦ(c8(É|3UԾBA¿yl:~Mgg Ɨvv |#9"≝.S>]O! /Ӗ'L A"w"'@9O˷iAld}ojN}4tf Ai Z˧V@@hĀ}ǿY?ߴs,} ?{5UwAms!yӸg!gϛ]Md9}'/_AXw* M5&L56xO9<ʝ蔼Fh w؄S=en`E|22gJ~N쫗.e3-c3 VP!~ux=އ "@l8~?fxSД䒩!f!O[h$` 0vC&Zgt˘P1S} ?c !Q\bA!1^ag.a룟6$"!_8$?s1Dg6xKiomYlA9{~ϏsYXE<> yzkZ;FxQژiB3(u188+_1 Pc.޽B8~*A `-,Sufn]#9@bf89eH;o "Bd|lŸ́5ezGPΑǙ9Q`* !+fU>uj %Ibb lDT"?U6(d6r%aΪUf'H!~h"H'V3}3c6c,k|ɠjGTf=LIK H+i"@tz&{ WuLkd?ĎDAZXt^i,>1D~ oDR6uw/Ax@|2x4K/bK֭cfggq'ǔC?)eMKbύe"h!OW x?**+*u64ς}(&<5)TLn!t0iUoaq!I_D2>_y?XO^2lxXf!EPcƓK <28SXM_)! X^q1"*n$99eOCbξ/P K| /$ZLYVe/O ؿ&IiLPUw6x9;PkJ^9&@G A3oc}]^CUA*CGt&~-x ? '@6'iyCYpZnc b¼C!cxJ&|=k lFC?ȅg+"@RvȜ.O6sc-Yb &'IE>Rh c@|XZyK 0YFDEiCx@|?&ud)[a[y3p{L:)SY@l2}#D漣cPKi \wD@_1lxL?}pyQfRV1 /Xbk=:=xh@3A0^0J(-<|ۀR )CJyGuʦW|~Zn?rxɰ%|2,bD̢zQk鳥B2!3_*~Ye z% ĔXD:et]]v 2% 8/)lRt!yjWʶB } } o[sagPSn@WYHF?l9ᙻzMt:BA:K5(0|c w~W/$ tDZWx-'D?ɉn)!9;DϧlVL",+6:u<`횲z+HQ,ȸ b'{+B!F!=|7R͉;`c"/Jʻ%sB~K֮e+jjؚ-[u 5_mbUbH #35lin? VOGP>هQ /$1sR|X]yB@&gIɠ, "^/f_xlUx<1qI䙃qUs"_3xdO,ec3(ݻ= &T0gW(ikzɿkJ 64:oa#2%ϣ%$!/Đ(ajhzb-mkKͿI3"ŠO/6}V (^rңzpAU`ɼ¨D}G :?PL"e(se+g0nڃ+Oh<xw g&{,|Κw-֊rbH*.&}F8V/dm$a]G9dta1|zNHUOp$K+(2Y=!B^5DD{( FPb.{˗'+' L~i w.}Veaf.ine^8Ś͛maMHlP<{S܌P̆idu歰, #kT^Qsknk'2>DDά E(BŃj3"^R^OH/:?*wK9|(G&#H\N˒sXzA!sƳ!$6R]@v<5pOK$"}QBsMxpƍ&/D={K : @W gN]*~3a/u pO&֍%ѐAG"U#E9@{<}7`}=j#ǓJf\આ ˞Hk50cBCBx蕭|@tDx⇾_I4"> ѻ )IaaՔ$gǕ$В CpP,(!M}AD[a_u+߼gۺoƱ5;vJ 3GgJ׃G9Gql:V/JBˬb(Oɰ4rGzM_&Ka,>{oO8/P^2y&!tLY {W!H7 nܸl_NWDu+SS5FW\Lcg,CeQ,0.%ģO,^Ka) ci> 8܃3kd(<&D3I7+gC?ڏ>&LFUK"gH??,ؿ9KPLB!=Q}V3¯C=}t* ^RwJmmfV~nJpU3dv&lldefwf{A^ X@{`WTDRwP콗{|T)9ym}4DKfUSZ_{#kD?vj{@?2u)45]w7TV'E̽3SEdJNP#83uuR9 =dCS>UW8}H m G4Ah L+M!M  Fb4xq&HGҋ8SQ^S/)!]l8ۀ(\Bhs⌎#{B[l+06xBG{J.2[u}7GYcHsC5;O!?i!V !F H#ɽ,ϜM~Otg9Bs!2cɹ$ ^> mRbfD/8c:6'^fQ~mDAi_vw쓉?efK|+y @8Fx&1_#p?'8-{i={ӕRV~H05j.}wj1Q&|q~wO8Y,Y}:y< 3>:uLf'&QkDeL5cS-\$Zz&\_:w4?\q>\!0z%w"fIb{D}Mp=q]Ne{9\stJ|_L!' ^,]2A7fe8hEBygx>KD~ ;k8}#F~>ҿ{0XR}j"0ʘ` E-~wrM kk@^x3s-39)! *tw_܉bz-u:O- M̤k#,VbS+6f8rt[OӈAC҆e4gΡEZ0jBsiӓ2hS@DOGJ8O]" 獒p>BoJ->(L ?4F"r gEر2;10|0jҗ{S2o4țJ\#wo=!؈dW]N} 5Cz#.4!ʤ OL FKUL,fx:FxHEŒuF=;wg)|_g(8qB*(->kq1K؂cb9^ ` + -Za#3Y4uh7GGE7:0ש<{ *M2=H_ @[J :O@~õŵak)edրE˄@] 0̌M  Q,~DQo ^{ P@ kFS0' 30,[ cLcT x}^-}>+F|w RAm1ZO(.px KɡkubX5@@o `* FV5*`Z ۶-iHCzkBJmʃn|J9sۇ{Hc7:hw!wvRxLu3s$uxB:,q\xgW]/dߔGnpAœOL0+dYc&)D"=WsG}{dף'*Y&Iݞ[r7pvUЊ͜|=7zkbkE ꟱,&pb/z(rėqh~?]~@Nx1`C~>}2Fbu yx+̻SGsF*_ /G ">aH%k`TQ4k~ս`=, ON%ܻ/&1YgiBz,O 'p嚐=o)`dk?~/1aW*/ dm͚MEH$/`mzxi@ZBK{|H#A} 2R P!/|y/,. ǚ Wi(ZE@'|vY3l%Vbd+_v[)-!1ejJu <-k*8YX&yj!"^e!JCȄy4Y?J _u};H4K5_ ҟP\s<[Ep]˜.5Z#I*p4pc1|2H@~u7A>9H FX_"<QƼvqyt/G|)},ϝo㨵o/-_sh%"[rsV;ku],r^ҟ^q:/b{/-KKwR kZP ",_>/Ȗߏp /dsk /XjQk.b<7lc11@y/&y뺷goP "lXj& /כ~ ƎX`L@Qf& $q(o </uRg=~J`c(.JL[ >S_|zﴅY.'0o~Ʀ4 @7TuVѦW{.@k6y1LvTRMy76\k' RG 2㥮U;–?N1gP19~RE&'9~{ AFnaR`T GyE)o&"g[x⏋V. D/a.k@F uH &yFpl)!u&5ƃK7鷴}/r3kֽ-υQAD~/w,]579n0UTzpͤ_L,Z53cm5 ~ڥ1 KWu 3k`WWTu߸e5'b:WEqBZ .ػW4&=l6t<`91X};d\nܘea[?KηLOEX T_:`M3/kx=v ~Ȗ_$LjbR xE5LH_׆yuَ 4%kh1"ʦ'y/׵ & :WX{]c`l2" +33ȌYS6YcS]z44mjng-EE %;KW7-zݼp{``L=N `#BH儰 1y ]&{,*ijФ uzj.@ A$ij2BrZp'ϲ `XN=;2CdNp|5|+Bql}{L{p ne{mk˚5f\#Sip&,S$A@&lPťĄOsPu,Z0%VK68iɼZrO=_Im%KEScppkvfsF`y¬gWj%=ugJһ?{9d_@KX-R`O0HJlk(AGN1jۥ>YdXHE(u@Pü=}^HsBo+Bgz4Y*v@k`lWFLA8}h; @ !V?G= /2+4L~Q 7>1KGVN }O`+Yu{&QLM{YL`EZl(:ú"KE0֝8oj2 ``?!8v YI9MIB0S"a4v7ɞzi@rnݦQ~ٖ#vUOYQc/) eD-X=?1Ҧ5' 2V*#<) u6))*b X ii!.#Ppv&č+)6~5si~.kJ󲲥YR:wg]קzsM[zꈤ/xB Ή +6=CJ]OW_t_տD0ZlVq"9!@@_GBe"@XO=^T:pwtvcFKWҪ ĪX)ߋfQ耙O&e89}T!gw2hNGMkT.$d.͗ lR`YtRV$,]*Ed %ᩫV"VZay#cY7#kAvNWTJ}rn{Cy,^FsX>^D7nhɺuZ&dfR"k2%RڪTL7m枛vzMxM{%dm\ x%&ky7Y&xnbymf.L'?œe-=G%'k}-akwzK.D&81g_%]33o%XikORgi=: b`n"Z@4}܏XWX ZrQM0drsψDAiڿ2BT"!d%Vby8)+Wxge,/H\#XN;kQJbw*>ڑ"VJZ+iVeg̰FphsZ; G+qb?<Ĥ7YMEx^-ݻ;i ֬-995#J@ m}?⾃ = bE< w{ #\N19g{#H:=Do5YPNe͹BXHvIJ{ww1zX#02Jgm#iW;H7<>{A<}R).$ 263sKuWXH?VFGd23H$-X]r?=rJZ'}9-Fb0/oLrlmnYh?#lPTDU_dȭ\/V".ppW:r>,91p!Z8g|jc݈;qkχ%*E\F J#Hv,%y abz]C:!pa:!  V!3B}r)+lAAXyzDtGŷ~͞hCJ/Io)+Lyz@p AN$3_@(+mwuX?θ_L!Hoۃ0Dm 4 &ctׄx](K=;,T#_;<2̥ bշ`!%P50#eeQ?`@11 <5 XUPBE=k(7Ew"m(:#e.m%H# ~/)Sf%[4)dmb" >'B.l:L@|BLFnsgΓ?cّEPGɸ)X~ߒcȵ0?;ψssɚDitj?@ysI9Ed- >$x}7! 1< (QG̥4#/amc .gmFLX >!3$| i8X~ }@⸌%{&97qɳ>\tz"gPfs`'ANOŦk Bh%j,r>r>`d+k!|SiDoE!`N`D9; t7e|-)'k#3-32ЫP5@:} FL`%. <R 9O>{<;- 32yрԴ Z, <'5ܹ5 ̷w.[8 ӓ?a-:jt#sd֢EC؅ a CԄH_ٙL0ʙ:=wd}ug7>{8'd_YP*DbvLƧ =G\s{z C &iu͊5|,12witS('0M_.-mv+#lT-E%;*ug`-`M0!X/A2''`'C 2) e/z랍 {D/Miab2Q.iZgğ+M)Y_ A ֈ08OR ΦߋNM~lKuր8W/ @}8SR;x:#: N<>fpHr]ϯ>/,1WB&H#E?tB([\giks;/+ xoٝG<;*X) "=;3D.@ċ ~`FR c yv24`N֛O3Uʅ g.>N @[Y?LAE F?&a#$c\6;fQ1B53yTX^GG?~YTP,򝡐/Bfߛ(+:;VjA-,;lZjX;XCˇҎ.)>h^f GD_7g]l]3X?E=^@`@2}B~CnC| tZT\I(Zr3<17>8էuvh ߒ%:HL'pٙ&ɟ5O7 !飉Hi3Jgpz'6=<1xNq}<`[@H@ĺ܆iDA!Z!V < D$ؤGzMr)q=AMc Ty ?S_qBgEo06UHG9J4-鳊]UW@MngG>(YJl}$xfcKXSB@DYXCAB@%+H_o= 'KB>K7/֨@/`Np@{JD%gofrcX p`X! CM9$A{XBffBcW,N@H)BBV'-DZ&"f!ub>DI%DM4HKFСieݟLS7T0%8X_7]O "qB\M `d=nBAb4 AIj@ ( dqJ6} }v)4#Yx^@\O;_jn\Zƺ3ms @C%ߎE?tz(B=d8< ʚ*t 'ת螽4>:}=fZszinI(%,mucm QL _Q2Ӫ%[cBA@Nbb>3TkLI*FYZ"/`h.((_ ?Lj@(kL@ssAМ8%hu/}9x! (D>da*:==lmsu ]p.h ~:}i[G !8f{!ejbșre.*:8z0&{KM>" c$x'/ nǮ5vp} u0EȌ2q(a?AkB_MGm^pg ̹XGӃ̃ %Bp-5 4IʸRdTqKu֜%[֤X΀Ip,7!X{Bp+ v: NA`;YI0a„ ,{Mp`?zX'=ɉ€-_ {lݏZ>ބ;*U߶@0a„ f @Z$\v_#L0a„ 륽!h#8H0g_,K _Pugѹ|es-á`Nsi0a„ &YH a!9XBh}ts`/0=Jߢ\"عODD0a„ Zk$KɁb+]g?t!;7qFa''ܬ` a„ &L[& l&"?^qQO!Ȟ(2uY A^By[w~.0a„ &0M`'I 8X#g俷5\y:mGQ" ` 7سƧ`/hBy{ߡ~D+8„ &Li[r Ceۏ_hǺçkW8Aic[և7aJl-=ϕo&L0a„+"$*U!ud*{eW>}'n>q`Ϲ#k ϝLyPug{ѹ|cs-a Y&L0a„/[I y"4zB/^[Rul>z٪ Q>Th,x|wb[Nh}t{s`0=Jۢ"زH?„ &L0aZ#O%!#9|u>]ŕE;w\jX;n\אw={Ѧǰ (m޽xe1&L0a„oC9_+@Xx|MMZK_cV7\{质w2=ښX؀gًn[}lL6W5-.t &L0aoIBu ͷVau^b%c}N{Oh9 &L0a„m6Yr `sZn,BʺӗI [:[՞'FoȰqϡ Ȟk /]]5, n„ &Lv$75W+"͏/ZyCk},o ic8TP`5Om>фM Uw2] &L0a„QEC~@GHOJeJH^`ޒ]mw.ǕVvR8k#/L0a„ JBp(Xz:?:ӧ"`牋͈W4SZޢ1m@Gz[BI}^ϧ/Y# 6P&L0a„ ڞ|, @@#d9QUrFAVwtBWQKu-9#k}':|hR0q] &L0a„0dd ^#Ŧr92N(*uRsECʆW>Yq Ļ29Ш`l4xc&L0a„ 3gM\+u6.PJtZW_eU49wcq(n9BqHsqw8s`@QZWzG&L0a„ /Y'@f8z) ?pLeZ[_۞[7j}\z|2R] &L0a„Yio޼YJ0SMo):'FىJOW5`QͷV͛H`Ą ` PTy F1.ZW_8]Ѧz\ol3=_4 tV:}ڮh; FklHEyO6)<~Z|K &L0a֞|%]&dhM;%@ICtvΰ/_V  cXWD+ʆYO163kM^uwn8r>[J.y3ًa[PǞY!g{a0봼 5)XiyfSvda„ &LX1DEnHtq߾{3 S5g Rn@jclúçkU7[ێ?o_YEk!¸ rrN";@X_tĞ=hM ;!i?ΫW~]X0a\켅bE0IyնKW=rر~Z+Y0 +*UQ;[cl@V{J[GpwUٳE.5KW(ikR}a; vsl7tòkRIU-lyOztAa„ 3f %r3"L0gٙ.' |~^BߓB*קFE-Xtf%_z%ٷwO˵׶B@š{_M< iۛ0VW[(%J|+S0ao]Ditp$$ao=|¡>nzkI٫_x!@o706$I!f[%ZE;m f4b\b5޹~o޼q TyWN&Lб;O0\)5mR:J@x8DvbӵHuSzEKtl=j?YQߵMrRZQR%Bx `o jU *К/_z;W0iPO7;Щko$L0awzb]mdRl;~d}+eUשsL( J;pYށR4*t tz s=}RqW:^gd" lKp\`/bL\*`uFm'ɺ~W:zC:&]?Aºֿ͖~=4=9[,}2_Y󥼲m>{ ڇc!)oЏ6N{&ۈckJ.5cBo~{N^nAJ!H;v`[Qi!!eZ鯾Zvg/_nuv"-X]9Wl\-i sWCLt?z`$D'=x_98q7uqPߦ|P2dX#V!k÷7#mGh iФC= :MssS׷;cC@P"BmZj>־DhhstE[c_qtU  (識 З&[6az\,[#yzGyqwZBk "]4I" G ;B7he0hZHJ ؁wt=xLaDuQFH">P2vKN Կf}(苆_Q X`X7}cXu4l?pЗ<+O;?rJ'3bmųU-} |Om=` ]1?soT!#";/h񇠰B( 5*Uz};/ψk/G:s-{MlfK&}}OA"A*kFi]%'3:Di{78]'$篬%GJGK@vw(@Ќ3]v44 I9% Á_xu2QL{Ѩ] bλ&BplKg;b3VZ>C6z3t}H v:&!R=A\/`[* "Җ+{ ~OzaOP]ӺYLk!fG@ȏjeH3_gۏ_hX?߈t9b. ެ= ]/^^* ; 5%G?w!NȦ#j?aF,۴ ?Χtt-9 ?N-m=yWu$>#ljS9bc #f"PPy64;c>yN&+>g' xhi8QqVmmҽ'n [+2Y t}u bI RlzeO4Pv`$  =5}v3#|Kye=~E_= C~ ?{@:e`.<.Gy]+j^7Cz?J*S3w27`Zbf&EXoO6Ů{ h|߰'.DL2ѷ9 C< ߇ 5l4B!D@YZ4 0v'cNg]ڹf!(Z1w' ó5[G ˑ ۅ8gY=Lal-G:d{Y+ {5.q53m䠶Fyʀ{OLH8W:'6~#M뷥\#F)(9WtS?2.ň?CU#ZS=lP~`JxA:v !֒=9qvGHw ̱%fJ, !ʁUgOWar[ܑBrBοJ,_ix|:IwRŸbf)!SV6L'(mtM Ȗ=iC-4Ϟ!nc;s_|!_tbf|BP ucx윾 x&=*? -"HI7EE~,[R.;K.59 s"=XyvvU7 /%76',֒9>~b# !G8UHELDԔ01>Z^CꂓNqVW9+;}LUgko ?{GϪijL>Jk#u(JK/+?!*4=wbIZe=v˲,5ug{7Qt41!͑OM8GMm?ӓg=&~nz,!yQ+D-Hb-;$se ͰR3i}g+,6&`iYoJxacKɶG]q=Tn! J?9 _D<т5uZ秓s O#_iu1<R?ԙ+̲Uj| oMGo9jHJZ>Oy=3&H?DFuoh]2jQ~]mhxP,k?k9ДmH/bDsTUS&}\ ^dy]OU6cپ+h^ };W>[_^ߊ3]Gs!cC/ _LsxO_iGoFD}TGcqMJ0726MM8&c48J FI#AOcdO_n9qAZqQxŬkvHKK돞vhݻQ&$ pB1sruDEB{ v 4{i1=Ƌ$Da{Cڙ8.h&%,,R |~ ?)".h ۽\ 3$|iβ }Z~TquV#slR'_f?]Sxo{E$4zG-h^oNJ\*BSrr&f,9Fg}0B?<d|OƟP !tF4B/#mGQWr8dbu7p\UG>zVT].U"SW_7؜oF%fy?h 7X9J0OqrA@ 8p?o69Χ/xFI +6K+L'Yk5ƌ8GeΝ20@7촊bfmS,gcR)h^Κ x~qwJiϴt5}A,RjMWz?x{wh{8E/<6M g>gc|V =ü)X@SVLey[ %ƚ/LYdI?pnz]Y o|= .߇O^xZ4X@ 7|-hb}/' Bp B]ZQğ;>mp|uŗjBX"*Uh`3ψUwͯ *6$6y84::1rm RxsR͠78 ,Zg>>rJa^A7 89;ϙsMF+4nYܲ3T|:=L{H>G*$$p?u/w7G5 pRrTDYO'c![~8iXs@YxyHG 6{ EZ90tR@ XƑ1#ks}Yw??S<3σ{bKG#t=x3IcCgw_ ~/1q ]=8}< x.!c+=_tEB'{16(%ؿA-\V3#eEM:{=?bK97N^U9-ݷσgQ=2_ɿG?O2 7Fꎣw\FZdg/6:UY}2Q! 6v .;*U&w#IV`^k6kҌtLm+TH8 B,Uūgf#}m5 a5l9( V.L4?fkexZkT4M$~7096P&(vYC~wBn )UD:SBLgEƄםV{3&t/.j?ץ^zý;{Cj]s#4dr;C<+.z~Vח!ϢO%E3oq .vôbYyAtsZ[s? ý MBh |DՇROj8YB+pf-pDx*!;>V&Jb 8QSuWمŽQ]X,T,y3% Q4)!6zwj|k我hh{Lzk=~ Q0&a̖ 3]L3E{OE1 %]:B6 u#Z+œZϱn[W22~N {U1dǞx7}`ն6Q!`G2V* -sϛ6_1~a.o]=~[t/rrH/)H:"o8 S瀁: rĀ: hVu8=H5dk"8lJ텣ˎ Ǵ2KB,apv6.QOzY201GD^鞰Gywh'!4"8oVrWHwEuk@z;}3ߵ&K)Qo5Uqd~"h?, 4gNj;6Ƅ>'cZ\k=lř瞻0tR`6 Nd㠞BePsC2?aSdD_>u<[ c៻fW張{*]z㱿cގ#Gn޷ޱ-[ xЗ7r5?>r6Lȿ_Ʒ~`%N"&Zql):א1zQ[ KT}/&fPa-T&<&Zk DSQHGt?Z&)sЍ]J1`aN8}: ̀3;O趥+5΄]eάBL%r/i6So`!uX}V:%YpkXh@x1k09C^-#,ԓØ&V6HhimS4) ;])M d> |h?9FgY A2񵱡whȧ]c7aqmS}+U gQrwdg/x3oGd*?m(Oa` T&toxl:|"ODuD}<[ دw*l_@9_W}?Y,=k=8o}tmg}4?yOo~L|}GƷe|!hUO bm "MDc8Ӯ'uƓ#@E ߙβϻGB<t17hvl£{3Fy\g~ɘeAeClJXWT~tE;{K[ّ^w`(vFf[+|௾?_Nm;:: i86tKM5+gT8` G^]B(#: ߆Ny`r.CL qE~歅5`pɳH12Bߌ^x!76YZULbzQ7fL(' wz)+񹦎 :OJ#\p+À} >ܳ,CMVQ7Re"+ ޱhK~؜ϠMd٘9YPkbL:¹:[K X1GDU5}{6# 2߱,/;ʎyG_bӧ);룱S/t`3 + Z̕ƛTtrf\{F^}bO(xNuևDQ[hm;ؽdȈ1ROsMﶡ L]s;+A>"d&1o3`"gjlUs#;"ڎSggrȋ%kS cϽreP@Suc}칧V C52XY6f ?FB#L~! ՑSfS0Vr| q&S, 3%: [梹?k'o=Lhʾ. *شl]NVV8Q^j)^\C/t/w@?2YpBM2J. ` ѨmS [+=aſ1 ~GΐҤI lfg%aވ)!׍E')pҔgQFY,3EX]!`6jdgG%2 Wnf[vi䟛LO^TҚ)0= ZDbTSX_:8 8CgYCрh|I A?R3",ݝe)UEvM'd %MۆMǞ;-8TҫkFzF6^O~8[l󤟕ᝃw/$BDgN071•6i}̏W3i*,CsB'(?BE4 KT[-̚[J'̴oLq5gؙ5`J+w][xJj>wơ{%}4!,?U_1j7&lL JGbnVoӜ;'| EgӀ)G|eZ=k bhp9R&k>њ[O =#%;n]>EꂓD?k7dď??[_nB֣W2dJ s\%^I3d l]Fj! -C&c|tv]^5&ߘx 3w3׬9^pe|pD)!wNqƺ3ƻG42YtڔpLe( sB3skyOgZ5q.1o|z\8,o%%=K%cpd;G AVw-K oXuD-{ =;"4tz?G|SuO`2MRH~??YCIWՋ-#n"["B6ÊŴ)#wo'NfY/3o?[MYjX1]Un89Ѡ/]c{.gAY@̚۵~&7JSaAJ c xwXI%kY̓f&hu6^%rؗy"?yL7Eڛ4߻M P@8؜1#Wy X/_{ p_Z@_%G>lO Yޓg|S?O??:h_)/=+n+Y0иˈ>3٬y6vv`N.@".1!úBY gz_8āb)!^y ⴜ88v ~YPG:y'+cL MSg/ld4jfZuG κg>;oΠ!,s@} {hIgr˽3hFY =D3"O{<3ƆΖtIRԒUtoM^Cd" |?4svy+3"{׃ -\D FYq}&ߔ})7]z@3ؕ^&T " k55k=60uwH܍V4\` Q+3hS zZgTd ;*Kԗ'|:)%֪3{5 ^)bw٬sK'>>xHQw'vzEmSs|3]V')?kJtXrg?Yr01NΔ.ȡ?46g19qﴮ8tx}ypն )l8?zv rIS]ͥ[haPWH>N" QЙ˚8PufQ3n5 6&Į>ʓ){2@3 Mke/iƫIJ/78UH^z VϢ|"pϕBzegj al̦i34qHkC'<Ƭ)wɹD|?u+waol+,~ݠ4 }߸Ŵ1jhbgw$M=c]&p@_jz 8O \9#'9ςDǰ< <`D9 Hb+{rF} _ 5?S9ц\}|=>QSf-p߁{8[%Yϲ{l+lKZy.%̙#H90$s r9H$`5l4zzs~g$0S]]un:/sH  C G)5>[!_JE!S=[Y5m"Rӂo?&&'2*lrBq EĶc95N:ScN>aρ7e@uMYF` )sxRE%ǘ4H@^ Ϝ~Pm!^/LK4O+[p1!y|jsl7JS←y E2S :>8eT W{s~0oE'V;3)y QƻH4ZH~RЋZ!2Ce7hS/뤗0:b{ABxJ17QP$PL "?$?qj\3k҆/żYOB"s\? 5N=ES*7S"H}=x'|ok,]߃1 t7k/g?[sfGsg}h{{xj7yQ͏!uI  ƇO-ݏ^6uRq,EJE߼ŦNUj;u?)1 6;'0*=#(<9%F7Z,%m$ aI:$ȉ ' }nۺ`܈JrJ C"T^ababO²7옓:! d^/aڝB[#>Nx=)׹>k+/)hi ~*Dctb|廏 b׀pCu/vnƒGyT^wt-={q_L9N1P)a%'p=CU$n. D늩z"&օϖoŽ9t#T>X3Bc4kþNsj(R oC)pyQ>"Xx}<xhnjzQ{pO|O !a٨) SޛpQTzRҚWk U3D:\ac|| )mnw].-ePp / glXZBL ryTН4oUo{znzYkb/m꼷~67Еm cՅy5O_C8pޓgF #= ,<F*0sKj D9|Bk=WS[e鋟}0oe>]_ҩФA eƢi̽ƺk!abz4*N< =54'A~7ByOADFp|cG b >烅.(R%;+T߆q喻&C3 *ۨ4>`Kp!@ū[<{ީG YBBr+ Kxw: !!d-D9&Yx ߘdd3Df^7aƒgRBl%nw.H;@6ܽAR^֏6EKF^ADAtնX'a/nw#H%H `w&_$Am[P~;ighUWmi{ZvqsˍZaK(N?=?.cv/"n@J%}0߭B U ֌H !OtzXbNQ {$IHt,x|QT݀xkڢIsWt9w<Ɣg{ǖ {!/)A'@*)DC<:"Ͼ7ryؿ!tQO Sۜ5YK?Dq^3rʄM,zeϾ=7ɋ I=(ҽ c?s5)oN2J\kjsCzYB1L\;}bln%w(>i9Ѳu9@Qh=Ji P$ Fu DAYI@ecD $@ H  ۰_J"W^`sVd\u뉋U]گn19|);p/m5wPؿZ ˉ!7ʘAr ݧKv"${-lqbǍcc8xâۻi]ks#~R{%pBs\(F'۳jz4=z[3>*B+My?v/{v+?1azpΒb<[Lw( JV$9DPщ07BdZʼn᾿ M \S4v~H3`UPVOX`=;€>B<;]^ X#p 32f󏵏 8J)OÈ\@գϋ+v>z*)Yމܛ0ӵeM^_%RXll#s5hq֮ E btal30Y 1@)_`+}:?lIw=pkuwk{!`. :0):v Vcr}Bu^7[MY'k`h$2uoxIc~2ʅwf-{wR rU=ŚiD .L^ bB.nhs)i{ٯ6}h ?4Eg/SoNt`R{_l٭Wk% w:,>>Cd> *8`g#~cLP:?P◔W_li @ʅ93g9֙^*쫷|ȻC]I[Ha31M&I`ɝ'{S"5 \xFqM>Z ɫT]ckHxt ׼N{H͞5jEhXGuU4<dpLyG˹vg=~WuZAɳkGðaO !">:?i=v,Yզ5 )`p~sZ~Л@yC L02ASo,fЕaylwT 9nNK[=8ampD(<ǜ /Cm.97$ Ctl(4|钵'/]4uzN ΍ IuIye'Mc*5`ب.0B7(:~r] \ 9G;` 1yvCFzͭ0i{/U;:t+,9,Z tBVSF8ByjpRpnCC Hrٹ SNIu{sh_^^pl*x;>!pr +K-mUz7gGgH鄘$b w`J#bR4ܲV[U .>tJ8\Lw8NsL oVf0<9ԈB'cOZ`TH `mT1x)Kwll:xҡc}p 3<78Bqp8bs;gc gC^쒷ˋ@0D 1ذIN qe5=Z0, FH. "#_b^mJaeRUX쒇~u09לi[jI k)iV vFݟ^S72Yuw~AuקX^QjbӔ Wgain*{IUV] *ʞ! Fi EIeU!˰{vKY3Zrg8i1_K_ʰ3.m?#fc3Pɔx6({N^t񗹧`M|ԅ;\{i: \b\v `Bw1 "wğ:9ʳKO:s%ﳮQo"x2$4VNia"DXtPPoFsHazpn)!@!>u9<BaH17.g?T26<Cjjl P_QPYVοgM&E%NW޹VuJq9>-yLgo79*۝og/Vo|1'cPڇ;oi,6iӔ ԊE8(yǮz^`+ yM: (؅6\=DŽ9D;IEj5ANSb~`J-cR#p ^ay^o Mrus@}'ۃ36E0 ^u]tg\nz-YTblxn,&N֘[Bhv_ʋ S]hz ; U۬@{tÔu٢3 ;GىsV &^(Bg#AIyZAhPRnG֓aOY##~/\fl|6R7;s8opNqՈj,o*}.;N[XN_H_DJHAᶥWV^0P*0M v/;XVXYXЛYRu:$l:f?ä K-((n<upPrƽιO<{׶RqTVsó#>! ,c@D" k='KtדrUz4-:8^;vQ'?xkԨ>kS3윿Ͼ9}i4~wv:k /[ZJALIfr1o&\v0>HAIIZ5 'Xc=q sLA݌g|^ؼBoeG mwd@ fJ>G}.o E C{*q [7*ȊE*IoDQuc//)!_|QHjaCQMcoauM=MsGkw ;p*w8r^_3dVGwa111#;(P@y+!u9媋E-wu/ő{'uX_5JFO6iavJɋ˜S3l/3M^߅𱷵INfkfA# _vA~4_VX.Y@@N|yCf Å~hC4#6Gx3ЃȝYtE&Ha0F:%s.c#UXd  F8Na"7ZCH7 y>ATq;Bwsa)%՝p zDz΅gv6⿧CSjgZ 9%tla]vCCc 9i0V4yf>7Fj]F~Jߴ˞uYG?{KzCtG*Zf1C#QXh}z[9GeVu/z$ Fm{rZa/s5{ܒ[N\.~XUZ-(lK+l]5oj:nDUXО KH{+`Ff Nu;TKkj.҉N[ry>bLZICE(7bTzXuA"qy-ngZ`L \u|%{sW ;Я^pOtx;_/G˛ 8k[YZ8Xj{HB@wֽ=cI>z@(~S3go:%f-zZz?\?sAƹr)>g"ZE 9K\Ccm1@LI݈-LA8q9;7R㰇a/A[8o`OJ?xHJg-J en!9VWUGEgՕ ,KW2:FFޞXjc#Y9!ꅺ TTj2>3s!2" ?H-8T%HίsZ$=zu.mv6j|f QI:H WZM~ JǼFfшV'O_2uw܊CyeBdLCFr$O(P2|6X">$>J❔ZJA87uZK>ðD[po4}vd$W jOYY9̐É:םDž_l]׃6O/^3;i`dXQ cdDe}NTSuzqµ0 ' 5"9%QY%{ 8 ? MY4 / ]ft,^/nZJ#ZȠ" +YynH޵ļt+9N8!~oJ!'R a ڮOe_e^zjcnQ}uE:{WnE}bSm@%[;^EBm\׬;]pAv:eDg@Bqtvi>]gu O-Y 6&E>wQ߬ynB DXU[NzYٻD Rjdu3kY6JAHHdȺ(Ɲ*~!BjHIkT͗'t>x,n# Kݰa'U12&'עŨrqo|dH>6|YnwRA҉ )G[_OJpZ{nW,~}"iF;>.h z |^:/4*[_GBn?–.m1P`5}f8l) 3&y|`JZKYZT, 'TsY[Q; 6Z~ʭʜ;Gj+ۼM1lm|lﵛw[}R׹MDEimdFIEEWOv_tu" ~}_jCJM\= VgCZ⹑GV[_!a`JA=DA1p++]yPx5+f>[^xk=o 9_<]}35o8eb|I߰!f[ FU51x(g[u{G' y Pp !u]gSfpȢc]˜}t}o 5NxT`JSg78A빯ЏI9BS4nجwZ:'!]'r`ю홮7Y&IPiX! E}W4_W_ kt;4]ŜC?J? ydUWU"xGD[YQq oLs{_5EZ[ B;%&#P}kH]i}j f* .zA~)5-Z5qWΜo cY8ʝ!fX4FW<1bqԫ9h8ŭw&&:9ZUG t jمhT۸( Y;\ͪʫ|_PЍoV\4ܑ:qyNH`B4Ǎ!O fnYW#/'xfݡZS)Bu4K@]='‟zu` +|VVfp(=蟑} !S PcSnwħ ܶl{e+lVx !@li] ІVZ ȋ=clfc*KݶU|k$v0j`ҡ#>F{+;F\W|Cg=x=Ts#uN^l(%mI&Rj8&é|ܛ^Rq"$.}8걹Nqzx9:Xz)8}g@7_DJõ5cɀQ \4Z@,7vpY먔*aeOɝ$7q]KCS"JR ڱ9c|*<-KAM"# W {44 ۾U@jMK:h=w W~w!S _*`戍5yn /"6Jc9høbj1\^_$?~1gnC;\܉:,`$H$t׊!,P=w/i-NVI S@‰9Tp=.:[.m>d>̵niuoK[kΩH!@y;]JXRЀb~~Cr*bF~m"ll7yQOBgupi5 i)sLdzs ?j#M{/شOH2L_03wFQ1Z]CaRH?]^=7 ?]K8sR_ȎVQ/#it#W*P ׻+PCdM:qǐ/9pj'8Nȯ-wjz|rkZ1"!^:EՍ=M=gY~{+Pm"b u*;z"./"jpB?`"@&k9'D-oM_\".mpZ[yGٲSsW<~o D.9 2_Ce6)5_Jq{8&XBV# GeKS% GPvY=߄tW!GMq `"pmƦcK.&3p&k\xwg0bPxڞE[Wp2{#I+.v3=v'-pD;h]$/ط`jy[*ɿS;"LT7NkzkK ,fu`HeKw\y>/b;o9Ӆ A=1" I `|`jǑ v?lxuPD3\Ak1Z2_ˮIdkrAe;ļC~GA]J8?ZóτY+Dw*?{?u {M5=nSt"tP:# '瞉Hϼ[#?$zRA؜Գ#v%¹U\YaHUӧN% )%Q1~PqeY*Z4H30}ЎPY[pm> h<~z%**6L3neMZS[dƚ5s5<9n°Ykw 逈!=h}wfjQw$q2,5FJabLi]DQ[?zV5wȬo (18༖{مB*Yb_-X!r7G-ݔFra=ofOJwf.&#އ96|C`x~K,#wݒ1g* $Kvy0,?elJPI.*4 }:ME `N;Z}$GѶu<8VYZ^%h ̫wf/廏9h>w+E,d8Js^:sfbLQ%ۋ?}6~]Gu 6U.\-԰]e8{Y'螂u{D^~=Q|xJetfqKR~E;?G$5?*#CɾE>Z{/T縸H.r!֐##фWECj~a 4'j=A8/@h5iÑ l^5WҚu 7Ls 5fPӚ{Լ \[n@ݙxwb~9B~<,!d  d#1t`y%Y)8p;R;F|llʿϚCgoN{a7b<藕йjKɐRS8hs\v4뇱q9ն (Q܈4G@yq[MZ`t\"\/:qHE.0c[ yI4@5[ֽ;{:5̛bhG|fgz aA??cnqdpbyXj~sb^y;wJ%$vܮwl?|=Ryl%_a\|}ʢ``]Kr +>7E9,@*bQ{єvFD]NC_oLj Zb~gWcoE_- Dy盺H7"62`0c6PngO]`|A $y?d|ƆB5 [Z KpF1GHzoFiM1!ۖ?p!2"3aK*\V G! `C|# ڮ?5<79⠼>_+4!K&ShB"}E4 5b y@{flz[O]L[m_jzpw;8}ͯk C8N?|=ו- Li⎿@Aer0NG+;rKg߱Tts&?Y.p#8hx4(iL6;v`+XZ#6A_ukζSW7aAws!"7F. ,#/jMl s+ÝpG?Yd5;>YqwUQ '8yk(J\NN8gx4iۃϗmbY#8t0¸/0Kpbgs-p1n[tw@G!B5 c;Y9h"@qēAf)戦U86;#!)h%Ti (n!C`j>W^~a@`\cM:|MnH-m:EͨJnU%n/^ >A@K@SDr;`t{5ߴ#8v#7Ee}+q9(: F9ӲZ:/V^q8o=J(,pOxׇ{n \Je DK 3C&3c^8ɇc/0Ŀ :uaƜ`1`⹖BKZRjOխ=wu]~R!`ƽ-g aß"i{UAPaoFT4+fj q|8U75z$B>KO'\RTFENy]{^qh V\w}|^Kw:4&?0LMg{$.˖Wd$h\PP`=12; AAr<t#,jpT >ǝ}acNg l.a=sjb:8翠ZLV]|KɎ{3@5eg۰XcGbŘ[ŵvA[ٍAYeq'F#g`b>>uzmj1j(X!⃿pZ w'לxq 4):B޻ 5 3qQν?6E4/cdW@]ͳEyϗol?,8[o! *Pg?(*RҊ;ŵM8zjPaLюϚ~r</qͫls12Bh&@i:8멫t"G"8I++ ,o<"{eҜO]ut^ho)ƾH4!rd^I斒S.`MÜ Apza~I;F7m9S(:#u1Ega рA%MjS޾d?yoN_->oprEa3wYy 6Vd;s&GC[Y0Go 1+k@jA "=uhjWd|""I؛g`167FY Sdv&6h95\& "I(%s H'.zCMo SC:756BZ\IZG,ݭ-v*JbѪ]ӥl>Xp4bB[r/0(iH?_f_|Q'1rZ= RPj[9uwFRX~DS"4h"}p1a>Ss ݔs7%)1 0$5@R ;vq~ѵqimamë?/AH~qNa.V[ƝD 90bK<8tSyLF~zw* Z:wLz[?~-:VBpHNyH)Mcsљ=~ZЧ=IX%10.Te;5>xd$86gW 2!d98]7 - 'F3j>>Z\+jVF:U<mlqľ[Ẑ2^O.HJh k|G"G+®'$y&R+Hp2PD5Bw  7oܶVze[A )o0Tަ(bFHΜS!Ș79.\V1J15@ZTO %;N gf6*;EbWY mA-O]SG Z Vh^kyBd571VB85D?tV[g˜88yJjH+y̋mru-B=Q=b"v)E 9`8VeqP Un|BXQ{?vն$T4Wz*<-mi~I!b 8_U" n b ߑ:(ׇ9q%EMa8mSn K{ k+f|ch^C=!  JYÊ RzlF:Q폵N *8: {F5'>-{"qo~6`&).M(%z߄AioRLv3Fu˜Ҡ<?'>[ņ}DdHߛYl?K/jEa3ۂs;P 4~`.~kF{s/~?C($3[%8ppT |OjQRtop&Ae}pm6廎S &&KiZMQ2L a6wR(iQ+i X5&:/Q+=ǩ4#B"3,`X^X$Cr*b@,+ I-l@;>|AWYOj 0l>l@6H w?Iw==j{<~>0frq#u$0I?V֦{#>Q8pZ%QAyf ! YƼ(Q`cwd&J}RK*z)a89BҚ!*# wO((jc~+m8-qM+ǃJcrZ\KQvmɉӫҩ΄-1k?|$R4~Tq+;Z Dx!N N?M}uE';).AX券$5sޚ,?l%+:lبyM.\$Qd90QJ(f!K:8+8݂ GI^P< B!&М/8˿jFm[ᜣ6993* *os?8=O}S%0%zy¬qIm s` i NU#ڑ 60c~ٺN&G<O$F={~aW[qo|5kNjSWGb+b*Zm8j9怐@ ,^s#lN`0'Ϯv=|/>}f8璳ᡘ㖴"I̭-jFk6W G#Dr¸D H쒈&QB46H )^1YɅUmp>SER~-ws1xS@azg6 ?SR0?=ϕ<~:":\ #L. A {SP>fxVO{\uλcU+c Nnks8)3p #?E6sւa֖.&HQ68\_yǏ+ʞho$(tC9 !J~O$&VOBn5u6pOQP(ZZ#x]͌019sH /楣pRP/8EUm7rk8GN?,i?>9&n6?Dǟ-{9V+p],YE'/hGn`Fn=cld+"XL&6xBY1{U2⢑0cWK>#G1ߘXYP$^%PawTEN8GJQX*qVV1xi>qMϳx#bLG ѹ奅5MEu;]  @ <(B\.E綅E!ׁzLȓdмS֬/k>ds e'b: Ωc ÉT(|Z _Z6n0y͞ο)]$]x$@t2IIP[ %F=f&^IEQnc)eǂ}D.F(Nn(Qdgj쁎 q skYtR5:ӆ2"0\N3qѣާR h=F>wA9<_@Gn8/r.;a=gbJV0ҟg &||tZ_3PWN$N+ BajQ1FFG 8瑙'mn ?8@h[ 08bGE}Dg#+lo0Y0 Afq5*!q! aLTst?eޙ2a.!`ŭBPU袚 yɨJ>00G Ug-d~㪻Ow? ?}֗u8)͏ =bՉQ'09=ah0HaDK&;- bV؈Zޱ٪N*A@ i#N%`0g o=( N_)e- m=: pfS BgW^%zꛣ7GRoN_=cE 6poap EY mA(Rp0 iOJPO7b|P^4 Z p2$46%2ISp)*w/ Z(؅P_szLr )+6KW3H+ ;B|\{V'hGeܦ) 0PЙ 3w/{Zlo]€P\/D}d fbWk t]ɿA.DW椕4mxZjt 0sљwN Ul$2sΙArϱ`A=_E_{ qW{Zo]}xC脙+fQŀ>JP9bUͯ *<}j%H)E̱d5&΄!GV'V4N,#nF O,#hc/V"24AC|>u#6%nɶC #z7_ #!8:B(]Gk3b0`Z4B{^܀j}-A3¿Y_a)HBš(ߴԘI+*i>js@N22Ͻ|b#k<(8oɈxck4zl:v$)@9IA؏+ڏ{dQl.p?T: EN w*"¼0pT՟  jh0T z>pbBO_gʺfFUT߿R"b NtkAaP'~)͡h{ٹx/OWIBS_ οB!wgJ _v~S+%Ed6>=XHNmsY>(( $y+ ʏ03Ԑ  pU+Bwο(6<|r]}Ͻ_{:S.1|jߟ?($ Z 6v .Z)M @m+LAMlAYؖkȭ7- ݎ4l.BZ°ZGj/$k}s b8P@9>jghAi{ϙԥ;<m$c`pX$=v5HS<]y 5A4?~r X۱c?D#ϵ}b}x`Shm4"`śyQE>AzN{ ޻jN]))6ߣQÅk3O c㯭 vUql6V3  6ouλ $=7ƥ x |PD!֯XegA(Z;{e|k~1=w(" 30> !'uxMf8X[};8ৌ.b#$XD:023cAcജ}|ry?^k7pI[D)A_}ܨxli@C Fa_@.  F*>g#Sqҿdۡz?uR>eqG[m |E)!i۶ sFxthHH ;ntm~8h>p7m\1hՒ0GgFo[ /\#axL] |D ;!p$Mb|Ŏ뻽&7Glow sq^M2Bmf񎋾F})D  Xo k G(B=-E`?\FƨIA-BvA܏4i$ ֶ8A%َ_QڙCH_"7C blA6Ac RƼ@$AA9!b, s m/(osp 1@=HM6F hmsCXZ  F7Z΀ Bfx8~hh~AAAk1z1ï5CB뽆IAm х#b"G  F/Z #A#? &F{^b /6I ]hm&AZjAAAaOU/  b1~$;1: K  5}$` _AA( l,A  pvI H 4  -'1 [ K  < A $X@Aa/vI ސ@%h~AAjSNBA,A  P pg@{@c!K  lEkH 4  kjA%F0#QhfT21 YDw_% 5 K  ,> _F=Cg#R~ƫ@5@%h~AA/0wUpqU̿ ! s!K  N?0}pώe,e3 A,A  0;:fx1jD&NbArH 4  Sb'pͥV~ K  PG)#y[H $X@A!GE;ox<o-blC AApTtd u{2c'16!K  J1֍wL>g#-blA A1QYEeN'pĵx5bl@ A1vQA*c. ogB"A~H 4  *8Ę̨qg[wuۺ߾ tf 1z!K [䌖hX8Qʯ+}w@D\_ 8z6Е$,A  bl /-߿?^}Uwe?o-0~)B"AH 4  F?*9r?tu?OmvD x!rFI $X@AFHG:?^wWA5D`~WRDd Z_ #g:[o~_?pӯ o(!ebAq%V{t /YWm4  F*8?bd9ǚ;B'"w$ȂHn8$#  Q:cߞ.ZT7"_%O"AHxɥ촼/  с Urn_}MmڡEɯ~eoE2J"A8?$^M-l'` AA_Wa?4wEk cY8VbO8 0fm?Csg^|G?,oH"A8)cU@EƇO-tI =&L?};Iw?/Q$ڟkDnqA%VBMaA>"\ǞXrE]tߌP A[, DPo@<[@n @M'l񕠂[;;C+sdEI.xq*Œ2@斳am]tÿMAs{Bje,PaX j=,P- }6@M%AP?Ϛ?_=Rml_@OP(hހ=A2i/{grSٙ_}{PE[ a@=5 }6@Mg?L|8@[=R}hQ~֭A@ ]=7 hnOC@@jh>xP R,ȯ9@Ha}@= }6@ G=d $ 6-lܹ֚>-f/hWހ=A2ay ݱ#W=>֭ `cY  Q7 hnOC@@j8?矟xzpY*߱ ,Fz>D X1*2AoIda`r@=Ѣހ=A2ax }WAsrISX  }6@ c[֭yKQ{!"ZPo@ܞЇ hcZ jA*WXUt @T#A*l4'! XVzpZῧ?&oG-oر#Y "FAs{Bje,P(y AWp$5yS{&"  }6@1_#:6,Zyȯ߾=@Dz>D Xa6T s/ί߶a@Dz>D X u?>Џ+ " n6!twODEAs{Bje,ޠγv(rA"_{ "7 }6@*|cߺu8ܟ,*So@ܞЇ hcZ Tw>|B?}}Om1E"7 hnOC@@.mf-@;9 /4Po@ܞЇ hcZ T>A]_i5Q9:w"4'! XV՜{g͙"@ E"4'! XVՌ ?:"7,^lݖY "HAs{Bje,PM 1zn{z#b,<#^"A m,P+c#fC(`7E" }6@yTa^?Iȟc AE""dYg_)~DGHZdz`# nY[1E"ju m,P+c|qkA-[ӴQoWxE"jI m,P+c|O ?ܰ!?sD X_-7 hnOC@@`$! .wXBaΜr, [X fހ=A2"ptW'm]D!r֜9;{\,fz>D X) 7o^@=l̹s~)ܦE"jJ m,P+cgAށ*v" Y??8E"jF m,P+c&qt 2cž`E(f/\_ukP_gz>D Xq>?{$2ɟ=z"j4s/ί߾=kY fހ=A2OO7\pAsrEutXKMb:7 hnOC@@3ÙA5g]OD`ҥAmIt@DBAs{Bje,?\ ~T_f # XOPE_SY fހ=A2ZH@pqKP -VJDjAG@DNAs{Bje,,ݠ $f6s͛*|"jt m,P+cb B__z0"jg/X_"52 }6 ـC~ƍs-RDDfn{{~ÎA?.az>D Mw` ՙoh hNXh2~x߰KW!k ":'߽r%B?@DHAs{B& Qu'i" M$y[?_u:[W{ԏ,_G""z>D M8_ܹŋbx ?sGk_,4 sݶm=ȵZؾ0W-k|A7wCX5/ᶛz&?g@DFAs{B&ճrx_K*!M~ ~f=G>cO O˻c[P޽e+?z=ijX Fހ=A@Zn]?./ mU\Y>*ڟZ/e^p*\/v?^Y{=ps~sdz_4VGY Fހy8y XhB]KT{{{D2}@^cVmiO h֛bm-[,Q0\vRw\}&|e7wG\E"j g&dUHLy(Y6d[ئqՈzpoG8wkvp5wN?eȟ=/)"o})W^vz46xvŴQGp Dv e&ѽl;_-{_(6}S뵢Y$yboWyk?d΂yTU }muJkj^?{ X 0So@<(km,4ekZs%BLށ}`_ ^KڟA7 v~4K/^_Uw\oUnz4ύ;Y 0So@<$km,4˟jbQXKڰKxkM3X27YP=PcuU7-򾎄}a@G7oSƬmE" + v@[]`㽝x}R얏>`ˏp׿Ӿ,p7n9 q DF c&d7K9Ǿ7@^?#Z<ΫW;_떹ߝ~}qo0'Y 0Ro@<km,4ek֜#j"KxIy:q@ jL=;FnWzمk=kz?59s7z\yZt@Daހy8) Xh,xIy:,Pb@DMFPiBDh"}!gs?>xV>~j~jT,>qD& 7'>h9X`X fހZqsB ?a >)/!OAxE|Hk}=/{nVYʕ^W@DaހZrsR ?! > ňOA- O>{'=oS#;kΜ-[@DaހZssb ? >nOoۖoUԜ>w/]x[_5>_tw{p' D 7'.h91c3nO{SԼbvm Vg"( P/nN}ODh=^ys~nGz` LG?kxv?5Lp^ Q( POnN}ODhD'\܏k)`;S#w6^O͢(Hz͉4O/x X=I7'[,~5u Z$jToJ~j>"Ҧ nN+>'"r!+ns{r|̹s RvǧmLx)<-f@D O-xŏݞXw._=21_"_x(gX "M Ĺ" P}y}GQʕ^ :aNa$:'DD\D v r=onG=tn_suӌf/X`47 LܜDo''DNn4ϰ_,Q7 LܜDȡ^pWGu[: 8-Ygz&nNCpODP+ Y~OTelp|7۟5on^ lϛUw`(CX zRo@9 ? *ͼnxMU+_W`cV>>X zRo@9 ?CU@Â~߽Pq]U MeبbAWϲY zRo@9 ?'牧,Pح\ٓiCe9l4nmVs#,Q=7 LܜDQ+Wc3QDԺ涷,;E"9Rpqn`Ea$:'DD0lر#rÆ|G_u.D,^pA|F}"9Tvد-W/aaϏ>nfEa$:'DD0M;uU6Y {uX_ti~~gUT"|&s DT/ 7'!8'"r#hZZ}{~" ڵ5kKVFt{{nQ( ̚7EvUՋzItN5/Wi0üanݚ_syV1ae$bMGXvm~iQA/h_pVE,BLULD[=|&dEa$:'DDIrA\PtXmwIf@O\qc_E1E [*N,:E`bE X*Z`DSƂ|1QT8^l(ldaH >++ՄzItNu+/571u5b1^ش`B.v9ㅍN!.`X; #/PpF^pGCB + \=u"#9Z7'[|S<*NE(@X#-Q %`(S?Ƨ}8#$fqdDE(ʠ0*w=&aHa$:'DDItqv0#jfS><ƒS|1UžQ:Y{B{=ڄ 8,Љ,k]_>a':So@9 ?CnN^`+n@j)۷[S2PXo;Lph8P8#96,7[7,6Yb|xA"39PH*~s"ZXa'" 7'!8'"rIl'6oBpNDE_ៈ7 LܜDȡZ7' W$g*OD&nNCpODP/ڀDDI$v" ? "Rހ0qs~""G( NpbXE|qx"Aą]DԼ&nNCpODMܞbN0T"HHa!Q9gG(D&nNCpODUܞ6#I,X%X\):7_7H*N[ jdO!2qT05?InhS-[.߻fM~U%+W{/w/[Z7חYzβkLM!trK#EO8/:#D ŅRqR]\+> >,>)>-(E)Lu_߉G 5R5(̾+)߾y077O)_oy|{Gk%K~ 1 ]hD k+v/39B]t^2R(XnEU\"^)^#^),xFK?3RXOŧė7.qgPׄ”E E_~m{$RX~dnKρu7 L$ȹ}_w큁R U\nc1~gw_ua@‚hKW8c9,v 9 jB]pqLTcϊ (n HaM ,([;G w5R(N0֎?RmM0҂ O hPx_/7O.ý}}VECЛ.y؎qy8~}ϣh㷎A! 6\M_A85C"XTqfp,RIQ#X[CΝiFH`tWŷ"[bbʇ)\w6LhiOT0}I~?7 L: rNB} *^.?*E Y䎮6 m]mx<>9/?{<~e˶ Aj}Z 1hύ} VNOiQRo@aa=o<*LW?H]'ƃc`g6mC<7-PPFi{U k@9'DDA<%֦ހ0*ۉh+v}m W:,yHB!?sF9R]]Eűww?)9_q~_BoL}NNw=B;԰Px|s_(}<-k@w_g|z%˶+[|1Em-_K^H }BF3 2mÀǖ]_H+>'"rKsHaa\ŽHNH@kJ(UOZv kߔ^.mX&fc@v} ԂE# (?se/OUQ\40Iߖ-~`|Oθ5rܫ0\m"\~vF u ?-Ϲem.se gk\[ wL1 (`wkôޏBW kС|.igZ5WKd?  IxqG*<:KPWq8*>"!$b> NhՊJ|k_ߤ)m!9ƣƃM8)LR@.6+s;,c;FEivk􆴿߁wS y+EPöYdLa<@DE3zU@N=^^(`a(8\ɶGX~>Ӎ@88!a!= >fj^pB^# 4]XFB hgaD@cp!n%zU*H_Ym@3i " '&"rV. m^n+$T%AU9Gc}!)~ "M&ܦOgkݪΙPƏ0 ,Խ|iO]Ң)2{v knԡp~W;Sp~.4#0FV׹4QT|F<{Ň;g)dW>w_Qi~MGaVm@,+I_ߋ{ gnv6kʀ}wga C>.CԢ8R}BQpe{L+߇c^W Xt^RϬ~q8{fsF-h//x(މPo@UY#BzJsV3o(@ ރ MO>GeۛYv[MP(ny8evկ`O =>aMl1b}UҮ ڟO촃$5U""jP^gs&~Kן5!, Uƃ{1'+mWb@|y-o(+1:}{]h:xZUh{{VߣkU$=ZA;>]SC_( qu+X !E#NS(}.( }oݲCdov o5U߃gaM),4)2*]mQBx ݸb_qdq u*hf(6=Q}7 * @USgeu{ɶ>脐kbU& q/f0~(U*h+($i'Etei&rSFX$=*@DDVӆN`.̻>i<@F A Pn(kg&+DDDMaTU02v# @b@+?3IO5_AX ""j\  D4JG?3IO_(@DDԘ6,5Xhe,[ W<鑀jj>I\Re7 LX j,,n-I5n<~ZUFD[|@akB߹s硻v:+~^QsRo@ Za+hN>/A?Jطo߳zeCQz?1Xo<#Ğ={ڳoD~ݏvQ&,5zA?1<osd{G2yb1<9x.^"QsRo@@X]px)hQr wRbr/e2Ŭgxx#zeQC J3j>n ~3rܳRFGόrs%:<9x.^-QPo@@X D҆UǺjEX6{r24 øPBS~x ^mX T~"""&. ?DjncA?,9{HӋ##wgxG5 Djno'}ؕHgaa9F<k l$""j  ^Osω6lvC,x@DD|&. ?Djvnc~gԾoBw\g=:k8w(""Ƨހ0a@m #S|"xQ<̏!STYϕ؆-g1@zeᇨձ@={LfޡtU\eMmqQPo@@XXfk׮S1ߐiαǫ-x ^m`[& DDDAav!ju,PsS\[X?j ##1v/6gñtz-^kR DDDMaQca __%gs{ٟ۫}GfgHӛz<7n} l Ķ1 ߦc""Vހ0qYx\;:^Jæ@+qof`ݦX,vtzi.@=d,s=##}q}8sSps~ ,MOaQca4׺Ps>owNp(Y#aQM_<^ctzQ:>oQGT,@DDTz„ZW |WM3rܳLd&sNltW1| Lf F`1x<lt*@ֳ/""Ro@,I;: SR;S[ a`6;  _.''0̷͂+솽MN288x,}V; @"Qy  T+S}3?t߾};ё!øVOcy lvTcht=IXh부X ""Laһv,)cjW= |186v,rܷX3By_4/N0`W"qyp@ }""" Qc6WF[>c0e_,u.W ga|=ubA4n :@ ,ހ0a@A+Lga<ŁBaܚmւ F*K( &,5((~TccIFGF%3Z_[U7xM]Iߓbw~/0|iiSo@,E;:(n!mW·5!l<|i>C̚x&-_(x6{[B48}ڵ:))KHz„kRF[IA -ʣ N~[WP\jdY۞Pa@TL~oIaL ?DrOGU*>#8~ &('뒀=7iaG]`RtNG>F:.(C(DDDSPo@@XX 7;ncv%|w$'8B2VGPIpc*].W<|0hS.Wboaۉtz{= %+%nj>(w\n p VA^'=h$S &{G;v߿U0<~|]v8Ew҇Kiqg{ƞ6pX㢀\Zze CXj?W1!5NoNd2 ƫ##L%TI@=,!W6`0a?:h!1xwRgc{ }>@_ϬC/OѷVK_Ǐ-nGMހ0a@;W9f%^")'q_4ߐ0H,]E@lһKH.as%W1$xF@>̫??Uud;X_ ˏ0M+Np-68&WQXw_zc*˧hxOޠM@DDTz„UwࡇPsZ*iiw_f% <&y~w?'yg(5kQ?HNłw꾿,ɱIf F4yl!EEV-0dQ0l]pbHRc3mL&XGF6vo>*||b{WWY}V)2)^ #*So@,M;:ZAp ֕}|E(*~]0. Sf/N$㪹5= : ,~!X35pWISǪ^0~/Z^J0A>Y4:v;1pll\1XbY}헟]/m}|BC xGUGaQcaw@/P!?Rz邭{%!62r.[| v@AsS\ FFZ.^lPLG4AVaߎc@:\k7 Uvܞ*\H^si4Wev?*=XBxP#U2o-'> {skB&3so:h8[.P1T{5%}|U kM DDD7 LX j,,~XspWv%>Q*~q/>yF] .#Ȁ=MAb!{t*Rsn! ODGF{` ""7 L\?Dr!pz wǪ¼{7 ccu忰f@Y}>VFF%f+[x^DDDSPo@@XX |9WwR30=Jm'/FF6!s9o˄!Z^=Wף=X'@~~t۩8U:?A[w??&֭s"e, kVs>N_,4!!y-* /"0m5o$M%wȿ_,_€ik$L~By}ix^=qb'""z„ykT={ Yb-N]4!GK5M\]li^.6+ Liw 0qFjKѷc5 !={ހ0qYxJ;:_sNq8#Vtã]f/i ]x>q vyXya|gv]eG?@Jߢs #""Ҡހ0p C$ԧX \&Rf$w$25 xMyeUL&+e;?gPh:!iJqI{;fot)n>F_q8FDDIaҳb?D#((. {ld&33!A EMelNWK3~+\׸_X> }P<62rn"Dߢv? DDDSo@wt1l:ƒ+흝yi:{zKVRokU˒~Y%Fw_WE[?c(|9hD"b$~cUTWBC0'>Èݨi^/1]s9{َgqJzϴ@a%v6v-]* "<6Z,t|\Bxoz StwCVz{ԩ"uB nO2>U/a_5N^{540o ŊXO^m`[۞.ǧ>0~\ZS,Eed'""rIa&LHZ_ȯ#{^Ẇ8l[q:z׬}ekV|Nϊ,PM.Zwطd2yÆ%qxZiܺ=_:}l obv5x-mYL;N?},aDDD7 l܄ q?L ho]Zĺ2iH<@`^)Wp+1vmJ|^`o@^sslGKśE\<9i.]t^w{bX|C|TMT1.ۧo9e@9E 9Ǝi*8f;?@YZpS\޿ x}B Nw n ^ȶ.GMsZ@oddl=p5x¶~7(D$FGaľ}I\w3_(lF.J;Gk}|q(Yۛ͞ҹHa28dȹ3ZW< bQPq`@|GLSpI8ŝmA<*젋 QqI|H\+[Eo{at`F_/Ŏx;x0ea$^+pyBŗLw܉3vr;v{;az4aU{ k8$W޿YB%4RȎn+Lc.ك쬻مm򚿕os\!6K)EygFqe k(0}>Z7E(f.EA°y*s_&Sӄj揤.8pR[\5Q (^="pǭ>| ^X {7]8Ʊ٫B̨{R#ŏ\ W1# k/kp8cVsuڙ z#q:oIccfKaDwjT ?@}o?`_!?+M0"~̚"\Et.776:+,awB<9x.^bm?}nKV;J\f7H }CG_ g'""Ia2, =-^XKǼ/xy0,)z(|.XZ;z֐b/{RCtV%K{7>=mPe`B [b{[CeCZb-w'0Q&kQCiu [j c}ݡ>kjW*u }X? h 4A*o?FqZ=XP ](nm/\eqzu `Mizi.ЏC"%>)ϪG?7TY/`:c\.l\Ѿ#<n&s1,'A+'PpFw@˰P2Xqp@&ӋLeؚ#6-l ~"FS<ތo 7.igO7={>C9?Qp(vq]{!H^X0UUUebQnST,qc?Mv+ԇ]hؒ7X SOni/b Te(b_188x­|?awo*uj,>}w*u^4Y-\)oWtݺN_\Eh.gm_-skZl6S g2a-d6Z!;m)>*s՟HD;@1\Cg nn_Dg}N{ϔiϿքPTTh[ֳb?̦޾bڟܪ,CG8kƎ-p{na|PkP3a]{Zs@k]]nja*l%n_*ߚ^`Vxݵxk 6-k2~ q ǘ=s0WΒN_So@#9aPX#?(LZWw=(̹+$4?)y69\dG늿ƾSMO0Z_@ǎ>(7ܿLMY= ""j4 hTaG %jM. v}afO4SS]]`uk܁M_fY ~k+h=Gkevc+vS /<'cıq""FހFxZX zveXnXhq90?uyY?&*L?++`Lc?-k?fm>/L7iZ@xX`Ѩ7izm5RYWu*^.h"1:?#VL!y~J#{w-`*E""" CVH>Z{Xۥ;A.*ijn˸ hP_<7Zmֆm1>6,Նzא,H;ڮz*y?Z+Gٳ(~䉆a<0p7u/åܐJ C_V2P щ{:\n]"rgc/(c8*pS ""j h&~IL_cֲ}|D*] S 'ʷv; ?j d Ip\C+d?Na0Yh&>jKqSc{SSQA1)H@aADD@5KjıhA },Dn Jfw?®fψӳ޻@5hˆ25q܌[7Jxal'r\oe/Md%FFnyla29}>Aߠrܳgi,CTYF~A߃f"܆+:LɱSvrs1A?j }'Lb%c=SvNS9_?Lǐ\%.CaC!øI~Q9Ƶtz. }=,j=] %/xԾ}' m]f7HZ0~ /*o5d+nW,my@^s׵r,WK1nj _2͕gV=Б,CDj!bɸc L2 ) \=Zd_z5K ur 5/:ޢ߆|u#w/ѧt. HDDz[߿z{W29Sn{47%TeR..a) ^jLB¬o0 "*}4ŷ Hr "" #7 SuZ-9d1_w<2#@ٖaFa;<|F2<}Z2"""@DD6^#'FG3K$~?]X7Y8p &L^X0c:~ "" z¤|P\޳oQo _ǭLp%>}MS8eA^;a E \ /XW|5EaE bn&/ c㜽ԩZ;Qm.d ?a?Pq'bl+K+SPz d1)  ߈f2뱈b"xQ4=}.^ E"""w@DD3k=GݙJL朡D6Mw CIׁkW4րS-}] `G"""M._Ϲ~+fȀK}k4 Jd;/y4]h Ҿ  -D&&Qk9 E#^ QSoRǐtOgv鵉lB =] %%h:Q\uPfULMC%Sy}N`/ѧҷc5<=ʗqX~tŐhI/n5'##W={M""z3߹FG-(] !'[\B^ gR~!~K۱Z0^!BsP:}MN ?(:l yRlۚvMs%=GYQ\"@|dd8T* {I(SoQU杹ɱSp+:\FR[!FB㸅_ns(w7iup=Iݸ nᑑȀͲ]ulU\wrl i^fϓ}>[m%yhsld\97XR'=o' 'Z#Qe ""5őj+ ÈH(}I#epL~tz3*{zllipŕnnW*uLj߾Оd29*f5R/|lvF D&)iۤo\w/(\ǾMVq{Nr p 8h xG 1FPH?6e/ #N ""LDDDCGsN@r?g_OIދ f&|ǐ}yo%>*?ӫ޾7:Wح"Į]c;ЍIH>CZ(0ޚ^'یK;WM.<#ݐf;i?}a[9mh5M.JIJU(q𹡑] IuLt{n DDD7ւ.M=) I~5R@B5,>UaJ W% Žq. ֕{9W֭+ qߙh8gg$ c54#JPn~i>.߿7 zCokm(pF'` }[]qޅ/DZ }&}P'R^D9hz ""5?;wr'l/`!xutdR /py*:Ajx6ہP?BH?Kp=Ǟf1C_iC!\Yp\uY A^n/)LF:t&pGﭾBc8 k>}/91Rg?ܺ/}f})}X}hn{ 6@DDTBDDDw@.{滓Shr+_Np?scHu=Q Jm_aڔ߃h0p+9B;kdk"ڊ6(Ǝ1;NjcFXr> }'}D1{ {:$""@DDDx-m,~0:l_k>tR9C%񘧎yxa8by\n]cv[|1/A-̷Tj.V߽{s V,HSv!d3F9f<3u b}u")ODDTz4C#x[kD'j>X/!;4ԏp9%C_)`{=W1?NkU%ZȰaۘˏPcj{ٶF@Za)Ϝb}ZpG(7'""*CDDD`1 \vdc;wV+yqʴ WMsA,^3<(7mcNv XxKX1x ?Qu@DDTO~Aug}N;OV?i ]jVXcqu'هPx^ J%""" n [)OWQcy~t)GT<&>f'"V"""M^y[Kè\w$ c~kd~'WXXZ ]@4Nuiw7"""M ""0w[ܽ9XO.77iw V@f2t; w)ul_{?""0hjam+^/)Xlt3p >n{EDD "" F)`u`"q\<A"0͋%ĭe;b1,bرG`<)R}""" MvU':iht̽T7$ES~:dFGFcc1d/hz(T*5cp#b4{ g2ߎOʿ3͗݃X6{28}9WmS""0RoQXiB[kܙJC9rq}xho29C풹-kJ@(@DDfa. < S0<Ӌ93Jϖ_sxP&&.Lm}촇Y}!"" 3]= _ ;wvs0\?N,p{ŭcئ#_4/XU=!"" ;5?Ж/ +ã]q,~E #O7XϹ/?)W~m@7U{E~Dn J|T괤a,{ʅJD3kN;l 8W<2{ DDD7 ('DaHL5 S1##qӌU;kZl۲\HDDԘ>$"?7i~C;f, OsωLfoΣ*8#[Q@Q Aqp\Q\A#((;!($&N2LD kɢ(_tN|9ү;ݯ_ݺufxĎqwk?tEA'mݕ}tX9P `hŊkKeFF~|us\k_JȐwIO0? xڜ9/^_.^w89~_ï׬$ ;;</lE͘tyû_d##?x~X? lٝ;ΏUޱeMl3=0<|2_ec>G9~_cl /]yuG*,X݅Ãl7|s?\Ny u `hh9^s~0wpp >sM1s?BG,=dwk;R*Z7Ӆ˗o9l^ۿdխ(Pwf>ZMdKJ-;egy '7'ʫ"9T%O'fM"rkY6X[}m${R9ZNm}o}7gInUcEcySj&W@y9c;7 Vzq0ܫ@A5/1`}A;rq5q9ruOkHZ/gHV|F>*1:`"'%ScP.MNUNq=[^W5k҉R{}5~'kD:3_C+VL_zETRccx>FzX13\vz+-e3g֘5q\/+ըp3,ru'j\QqL3xFk3{֘Vff" ߏ:FE=9W߁o~ϾX#jWNXĿ a H6|Fu'< @տ;'ΞTKR\p_{dC>3o>?DtyMEq{S~) kTANvMQ_16_؃gK ݃ϼ{G[kO=.:&)rppNe᪆r|Fe^K(^^cjoJ/qL1skTy Ü\:($3kT8i! 0N6֨Nf?}ρʹ7&r|E&ߔYm9_Ʌn,i,B.r\)k7Nn[ E?6Ͽy_e|_'4Y( =\ [r|]*_ji&)y_|l>9܏(9n. r<]ylk#eOٽu`k޲̐-e3T6,:З]&̓;CA!*1z: '8X"I{X%%;Ƒ*&ȥ^"pYb3g.#߯D9g\2ԥ.Mvgޟ/1m.v˪=Kߗɾqs#;~ʡ*/qbПUU^ĆUp|D%6>X"J)Qjɋy%cOlKN*w)wmWHЦHmE"IENDB`teeworlds-0.6.2+dfsg/data/mapres/winter_mountains.png0000644000175000017500000016152612140200333021760 0ustar felixfelixPNG  IHDRIDATxw%Y&+ I`00,<ðh<3Vu4U]7齭,]Fr-k0J ![jWu|q32###nsD||=sofW9I-u (l /Ǿ z /Ǿ z /Ǿ z /Ǿ z /Ǿ z /Ǿ z /Ǿ z /Ǿ I\Gb'{O[v}oλTϲrLK<2 w/|?l@Ʒ&Ǿ8D?l}@,3d?G@v|ֻ@<pҹYgן`_I 2~'1s |(q󝿓o}'_χ .HmILmߵLJOfv32~ZgZIx6oz7} Nl@ 3k~w&xwb{k /pwEo!yCK"4I.Ē~]}}_c\ľD& <_ , .]?V}ŽSnf៬xI ._-]yзpvztLpb_Io#%tvkf<'7dx2:s"nwsKsWy߃ S 8/툠ʍ†[tv_Qd R6}*>I\Tu)Hj&c(D`_@!R|6=?bqOc%[Og߻}}"I-m/l?nYߗ\K^YO>~={;ޟ{C|/NƾBʍ @=W_\񥱍;oW_ !G?τ?|<{{O?/\Yc7z;ψ.O)SP((|*x_#z+B,mx)k뛿jY?pd'6obf_yמvl~ݧvgE P(P/m]Cs tA'ՉK{Ogλ:EW ?}߸id=ݞ Kڦ}ThΉ۟]{귦6ozSiXg|kSO|-S ȍv-ƑtUW{f*OY? g WRo^q+] SޙW7~[_0U|¾|z*6C[e`/`VZ [EoA& 2| kKg 3E\JW;=q]7Q͛ߛ~ovWů-_;NZX?/ .\ )P@b_@>Ck7eе{܁?Oڧ6= [Yt+g"L]g~pb_@U!_s{ Wsv߲Z 7.D@e +ןQq;+ۧwX?!<Xتf_^u& \'<Sͫˍt @>\'.H2\ uW|^Ox=IБڵ [ߊ& }L{pσ"=v?m` b_@.[{Za="gJsfWkN@gj7+~2AA[EO垙k".l@`>}jλTt07@2"7CK [wX@%ā}ʽU-2RZW?&τ-.>.䚽߯'6owyt>/? [/ _yRsZPv﵁ /NB{(, %So.>q*lLb_@|*A,FZdn \|O S:Ǿ\T[ax9V?š+PJ}ܮ=~|,<[Aa %@~b_Ϫ^Fo)!Tt/Qqfp 18it"|^)hdyi{*~W冶 \o-PvY:~32?rs5A +Q;4^3s^8T?O]SvLߦt }aUs9T?w]ӛ?%$j@aԱ/ U+܁ITޝzonwZ.PU݃K{xFI:Q]@ _CwoUsA$jA L` Б\Sr_"{>.vM?V@ *xUEyrqU GV0d\^*$j@zfwo P1|]\wڧ6ك/*?v㎠]M 5r]ŷ -_{p RtG={'7^-H"p}2fvTnbG-LW&\T?֝ A@ ; cS*nqZ>ek*3"n 7/ wwn7\jce]a7 :@;f} g˺#XT!w/ ZiXc$c_@6KמQҵWCr_?n^6qGWw=ztX[]rZg60ڭ+>. T:w(~0AF@ }~VoC[};$~qe3{q/]?8r=m=UVnW'^%̄ѕ]!AT R1g Iþ/k7UoWn|;$‘(œKG ᶌ S2O0O)}ly,rg=GF,_@c_? ]NW?+hW.{Q tCB,\>"n Z מ~7^$h]|{ТV 2d94Kn 1R?k%@t_r㓢&9/fO蛧9b|{n*(p t? Bt Re а/`Ƴ*'̖u >3w#{ +4ѝ_fB N X Z0}p)N'=ImkVg \7dr/ !Twu^ /Nޫb; 4t_6m;qx)sMH.^!qv^T f叉=:9g@c_L{OOE5@|/\wo4.n8Bͣ+汕ߙ8̾c6nTp}1pN*Pþ8y?e+siq/}A,y~@LlxrMG8¿%ྠ `߃ևDZ%>ɢ8x=`eK;& ǚF;`RyߓV00^H3|þ89ͯpBb;~IA@J:&_UEx( M֏ʀ]\G*dT-]Y j'Õ{ϫ[_>G^v88yZ__.t/6g_ûlS-Bw(/ Q?|!&9η)Hq4|DW~yn` Rþ(l WR橭;zPВV9 0i=yN5Gg[Ƭ (@Jc'DPQpBGYwA5A@ }PfvTazp^8ylM tikQRq$}i4 @fMZVRoU-]?r0kRO|;qVϋR kGTwPP_lj;kB(/ *ns]?E8m"0::Y _ e](;gﻪԫ][r8@Y{Z4wȅPh.)W'ĝnӠ@tL PIńsgǬb=g{z7sl ?se,ZV?"BT G/ SSQ9twj gPUd;ϞvuL)qWQ cZ߫GA3Vk[oN pұ/b͍g>_,_b9+dE 1{QZFkǭE1v`CKW!a *PIƾoO=T .]cyte8){U:A \+{УVN *}&h@e+k7)PIž_ЇU<:v#\7om q]vLӈ<0@:)nO mM!>փk%D _?*~tfAPuvc+gvҗ>ͥ>%+UЎ8 S5r࡚䑙2O9¶q(c \!&?>v,?S¾?WzsB5nNw^&RJӱ;Ye@ofk[(tcEm鋝֖rqlOU1j2GL|K#˟]BBq`_[ ^~@篤[V=R!@O)ؑ*" cp82vZsFOT.D=ls}TH* ,|eb YD}?C*>z=;@EcƑ%#7-4ϫ9['+/` @WQa'Hcs/OxXHs J 09??q>w0>)osvaP.g:|{䑆9TtLZ: YHrSفfȪ蝹?qVH * 7uOO.x;]+k[KwLmTzZF} η2\4rd!EV](I_.$dq @nS ?=wP|t93K&‘3M#@*Ȁ{9nP}*E,*%0u /  Yƾ]T/^|+JaE*6:" [= w @Sv*d4sk U [߷j @uB#"T /84 ܢɝ7mO[eQs]NH0n\*" 8̖\vj#s(u3@% 2V|bBvy$kZ,^^BB|F7wo0~֞ wY,{η9Au#xĽn_V84el/n+NTZrD P?P׵ߟXv:4ϯ {= ӻ z(mQ:Kqt\){=KWJͿ}zB[Qi\a?]zU^zh[կ\žݼ'_oM~=0[@G֎뛿wr e B[E3n@Tӭv &<,JeCd@Vo}~!G [tlDH@ zvw#we_W=Oឮ+_>?}/Gz Fa=ᦫd 詸Ak0af7Ue >/Qx{T <(o77.$dq9 }-wWC-S_vg^י}to@]k_oN[Fǔ!S'tݞR ]$UB'_>>OO%$m9 {ՠ:2"Tz*dw:xQpzg^BBA ;~Pd -&~^m ؿ;B~<{wlB# ~@)v Γ/~JA= !#8@BkjEEKK(޷Ȇ} /1_ʄ>e~ebK[p[bq/>ɰ?-" k4u,T p3-SOZ蟝l Uy%juf#d$S3TJ5ɾ^< Ydþ0/[?<y՟tw2PcV9+U4oZ=䂧vah?{( pQ~`G]e<*6+/h}u [@W'Rabx,:2;Ti!#_Z,^Ȅ߯Idt|*$UɅ鶉4ǐ?]eSǞd T=lԙxl%9 ێGBpzP_"#{ Y?/̐ i/ gN.U;"]4ߓ9s_:ZP P*3Pl [di@; 36wޓ?#$dq\pc_= P4nS~dU;T8+C5 0@/d-hǂ9 </뷞[Ԏ [&s a pᓨ+]H =~6s=s? ^l`,E (q]f9 0|mAH9ľУt|vF¿P'tͦK_ƇVcg/=5(j-ᓨ~p!B iEڿ. ߻]Jv654vH |u=`Y5ʻS Y?/l uO߰|w!wJ؆O?*hŝ3R:*I\n^&uڦMAo6ZV"HS 7E3 PSJ`DZ0xK!o T"?ӯV?&$dq 5^/oI<ΐFgMU+OL4^Kv ~w >:SVyj]Ŗo@EmV@صZzfwϟ$vzKO>ɍn:0s]a0)]( c:9HW2M(P@`_ȑ8wʺfv fEr3x*\g(.g-J:gq YLp D(r@m7vj z.:  kVPg] @mU !$dq<}L.clОk颎)tk=- .\=|0[ :O::<&<=!7tnp~ʬUuk{.ƾwvq A PٿkBB8:fʓl{}X~[uӭA@΅ ts@j*x$#+Av\Y &t26 :mُ% [_W oþ'w۾wfC\W7][F_eυީѣx̃n՟Hy[!&cM@w:W)Ep x7#5z BGd^sEq t/=Y~isߥcxU?7G'A,ys㲁P=z_Tewz!3Tڻb$C"JN Ʌ)\~@a`_Ia%NɮT%@~@aak( K@Gd_kjS(0dKD9k V*Q<ÿP8_vh~lshL< ^9u*jq%λo Sn hfDJy?똽!!?Χ8@rpil:w(d:iV@~ DX]4 l ssdx=|OA8yFW}ŀcg `ku$5KX~  [Zm,^۳p}~tS)`w s-z ϫNAAVz;`ivB,,ff/"e]ˇ]uAsTqQMa«ȟnT?[~}^cd(2\ HJK!c B' S,~Px  5`hqokVPַs` \yza@CPvilH@T^3">2γ7UɥcJ%vT9 &:rItڄ|;lrvh3V @|v)$ :Gd ! i!!/"``7OnL:sp{1tzNP٧jG;շQ ;/v&-ȳ/C Eʅzp{37o )U<pXpoWb p5ځ'ea5Q1!{ l_8Y+ץs# 6k&s {Lпlimxv1sN\u\Es d..(܆9zZ<'uCֹ{bTFbw~:JB}"{TwY_eTBUVsPUұz.·uw:{k~$CVqc^[..t _Py}EmҡYEn@&ʈt&$3Six{V*>{hm&@c_@>]q,Koꜽl Rx}7ucǚ)lʬJ B"9I+>w SРh5Q;(Σ4^S)@ 7x > .r3M#m+YH}¿f-S;W =G[e> EY?m@ew]]f=a>킃3d },@ .M ¿}aWʑ.w ,!&v;ucg,OR$Wn7HuBUGj`p?!n6N[C`xIo=٧!ugqܰA]uJkXq@ǩ̔-ia!!%& gW(^ӳp}~tN(Un p Iz^wG>k F_2ZȖ=4H1c9g-@<ΫlS ΀uGOM<>x=I4_fø 6Lw#&JOoBBM= uɕ¿_0z[g|8L(dWȔG|yGhNWHe+ B|ZGЫBBCLڳqTſe>əf( V @."m _: T n~z}aJbbCio^g/ c?mE ^_bjvc~ L?'~ŌP9+;.tK^zQ8x:hktK _;56 suÚl{ӍKBB"6pR/ W_p4%.l},ںOO71O-%z̝}8?](^R"U8Ǿy+{fwʠE-n ?Hpd|" 3$(g P42;'$* b_@.p`PƫQbR?)W^*C ړ bt_@6*yd>ԙ0<^nx:R@O~al%@\k5riTL|@ 0gfNHV8Y{ڱ/Y|]FǏUk<φ?3 h"n@eu䂎=(%}6Dȃ-1 G$1(Bh|%@ܬLT@X4.W /A5`hg2D}\GHMPy  #_Bj-*>$U 0nܔ~jCvv {XwTO*dî]G:@)o:9_-$d R?þݎ2@rü;JH=ѕ @Pq7L/]{fCKby#+O[N#?cSW+b:2 DM+@ʆv8Em/ ,<*$T 0"/ nݮd d~t>wWv-:;.Jؑ5^Ph،=_]P>RXx캨ݿҏ&[!Me'q={|u:P6nߠY2gO՛ؓJyۙ"̮2 mE[M Wn9 Krֱ/Y3W~;RGwО|I5 ̮WJ lP9oEYwqn*]?NΧ+fs:ῤ}!t<'HiPnup;J@^Cca R}qR йkwEO ;7hOm){WBu/^(Y=] o>oz UL7}%zџ~pLEy}0=r)HIDQ 5D*@MR0"wCA{.hĮzjR#sJT1#Y/jes6!y֕1RQ0kP;~$" 2@g風md`ľ(9ÿBZߨaT$B[Zgݰ:g q`N hUt "y]1+ ڤm>ίcM&vdOC}5Ʌml 3?@~w. wx 3FiA{REE^QabWB]ݳ :XaG/jB)!>,`.@U*Qn{J˅خxk@kiQt-d(% "JL0X@s]/lߧ_:g;BLe̓([ѯwEa] t%QT?$>B{W5:wV|fJ@[eCCN{/ؿrѥR{NWI1 4U`"&Kr+qϛ,8}2zZv?M*}Yu[ԉ!¼J  @0Je} %XYn.@GO+zfpq|K܁$ :G^5Ѥzq7@6wkػ9hhcǃ+][7kׇ0?8('3%2W/jx/2W f+q}6]{ngEh& }aIg:]M/U{~tw+\4p&)f-[Vh=Vа?({Pg?+zKh .{x7AC5ۺHEU\ @DȣጔQ .8Qyuys( mAeLV0w}a:fwPUzA|ګNzMGh(3S Gq? "+ ^mgs&PkP(ys%]`:8zGƍ8e] ap}uy4=a_.͓۟QbA؎j͛ L^gs!'cZ߉η =ZZǕYƯ(/*[l{]4;\Я+i;kp`Yĸ,jxY|<)w,ȥ t-TQqilA= u֤ZlΧ*L^g/'6?zk_f_]|Ȭ+k! *amaӍvPa*a@t_ʎ8@' v<iŚžh 5^bUA=*:W<jݺ[MLwgs{.];b{{FJO;1<!~ ٜ)*98C[3Owy27ETZ@=2tT>G`+|v`qY3Y9k*'k;GIw_tv"\앸*O dnH&hXw;>@ {Y?& G1׉;GBf\t@Ouq't_ULA)Rip/#'x .ʠ#Zϒ0mAE܇E z2_QhqBa2~9`r- L@߃8Ӣ~=]L=6u-`Qҫ :\K z (rew@QAGM(Ա/M1kx;G^34 Y+ Ev0Lϸ( 2@27 )w#en 9x!GTDzQDŁ<`X QHRտ"l@ +T<"ej `^.q@AޥpyV@qWj7En@bKc/r8N?;g%2@MOe>GVuj;\+@B@}QG# .S7-g\08tб SPM}npiF|^@ }"+K_q14ω=lL a;鞹+R@E>k=;ELM(f 8u8@֮:"@!{ES}${sC}"F@ dS 8w0C}^n Žt h=;l"2{96mQoQaY@$R@{T µ\>BWS Ϋe 'm?8%`ZCC@j\O|>.+遥=6å -zL(DBΩtEL$Ny":1S!vDYrHbw"U)Pxc_L''Pg 0tk;g\ _KUTzO_f? Wq N@h%w'ڪ&PG >W@阾&R/QN=DgGl=C_C }p(i,w0 on"9w.}@G¾]XÑx/SX,4Tu R>X zo=}WF @|l|kԻ֪(٥-6k.@ nhiGH{@.a_,'?R򬼭,{{Hep+Ħzp(șȷ̸¿ V.Հ Ձse-\-ldTDaxyf@`_kwT|q\1̼|[?}6*[tTd[ON(!t03.aňw(p `6: a_. (jxpid \8WΖOr5yvszzjbM0׾nb W¿fvX v}U()LnBy%"OG F:~`8͕{g8;[\h6=&$dq})n"-w(tnV?>nfvɀ }#zU** %ⵖ.ZWL·m5?0׹+4K0]3M<TwkV}ED!v6GO< Y/ľ(lCkݏq8&u*k:Ĵ}z](ÿVPI ?z}*lI\@(+8KҎ(w\t·- ʕK;^Qc_-Dq*7%2٨TP{/*6S;¿?i>;!8/ C~r1LF֤-3 0]:&قjic@ :rHϷLl|$ ԷtSR;T -xKU!_[ЊgwN?0$[*:e 3s&(ȹhC)Yjr r@ @ZUom0>̭G2 \8p;ɍ*$dq} n 3r[׵\C@CCh~kL.[U=ʍO\Oe0NP)= ԵUQǚF# =Bwޫl>2_\|(aFj@rH@ylx#vxc_'܁J[ QP1; \ܓYOop0[<4Pg2x9ͭ, #}s4:ppnU٫ V 8T>U[twg^V.LZ`M =:&mqvsi\hhU]fwd+1GH{eLy]^܉Y @sT'[H;@\A1syLCmܯOEr)kk +`؃猵B&,.J QOT2U@1!G>ynTXmѾ .l9_99nKxAm+<ʇ}$v`I!!Rq`_=q+[0 I0kF5p:Uй,}];̫"SW!st@X31hQn8h&؄ƍf麟.Xgf `l;2;!S@UyLM _?)\ - Y ux;ƭt Q_FذM>& #!*C.UZ2;tr_p`ʺĭ~u{ uuOiv@ص^ChǍH@ă!!UQb_k*qBbp|u):ґ:>4av$D~))wsdmfaZ0>tUۺ`(@ysOK'b ~hhe`I+l\G!!WQa_䯞*jܪ \gPA=ˁ@O6o.Av #AWZ[}/E??LT)\q %eq,ˎ Y}˷T4;MNPT9<j` t>=={_@_t DcOkEs+  Pra DGMOs@`e4VH{@ ܖ\atDb2Pˁ$xyP')vXh}/3~{cPE KCVqq5CSq{"kpsW8re}TO[59 :~!!fa/rWr嶊R_q xɛs6݀iJ4ylMQo΢?'ۚ_l:Gj?CtDQuLg 9ƟNvN{2P!@J?cV(#|b[>Bsdn_Y^9 vp񶐐w4] 4 BD;s'_ zC4mYS)M5aG/ %Q 3 zLijW K{w_?r0\H]C2 _N/t"/j? Ah`C#yaf$`C8P gfy_ӉPI ^NQ~r4|?؜߾q7W>`?G$ͧg'(p-Ν pa~?'KƩE^K# M@'a+@xf$\*)Nة$AkOn>/ p( /)wo=#.щ}8NS`C]Ǿ9ҔGLm'Q!'ƌy^gLXϧ8N#p jїsIT1(=# s_KS,YLZN" SOP io~z*I)J#/@Q>V8 :ҧ}Teo;-:CIvmOPOl=M%'&enNMo =Tw64r<DYyy Iդ ءh@cgogb.6ߚ~5JRxR P[&_5sb pX;o>`yNڿ80SAQn^ ZW235y޲"j6 k" HzoJ{)FT#\- ȊP p5݆JRz(➵'I7OlINi ˆ!Pnc@;#{ `t>ЕSW%@m<(╿M!#k[7{Q`H²tb id+{(]jˋw~PI ~OQ`EQܒ?yXſf Mirhqo0xbm]-"iM[f/dt!hC(I"/== 9kJ#ރfvl ZÆJR}R (⎔/Nۼ~yHi2O,֞ n_-"je,#mK?sM0-N[M&:|=o~ʒJC&MEq5 p P kO>o}9@?9x idt%L(J`d,L*I,'6gĨ%bĀ4#R 8gLpm[v p%ET|WM?Ѩ:߁(rqP }JץKS%$?h< L4hB_a-k+@5lxZ:k?/i'1(OJ1魷=2T½'T~#x̭WU;8 RyOL.'lR3ORHI3ל`:NjP& 0 @s FJ= p EC_O{f^e$sKjK9@f?#w vh! l^oPab}/Z(kBe;Y4 ﴀ/aP|Ed?k)0xJ a-ܩs0p<IHހiPd۴86bAar>ÌxN|nya O>@g'67JRJyaEQh+o"bnܢĆI&χ[Ws\ϨY `<(@y4UraW 87BA-s+ xs)&tfl 0ɭ'b${Ϩ PF nӜv;)ȿ)qOT7'bI ׽ ;̉fZO~rޝ B"k+i>J,#0lN?GJRJ`EQ4ܯNSXܻbp){94WzFT+܂JRJ`EQ$GjkSb$क[SBVJH3 ϪY rzmh#|0.l,(sھdH 0x/oK_(I:og)*qSB {oz>wd#@+kP|N},}f~'k~/| Z^U8|khrӊq_"lt=R/@Q$K?19䋜RkIz=fa b9,7{m6NԶ5ёQ"x pI8 QNӒK8t' p/r~#}veWPB,\ > 6N;qq`mY`3Zo35dwĽYiMˑ~>eIQ(?7,?+! $\/[ p7b~$#c6ʯso/DIAbd"YȖd1=(w)~u)(Y,QE}M>w !G֣5= KVFP1&HXܑ~l[_芡}R\/@QlϲgȽI{n/UpZsN:XͥgbX@ 6kAp^ā9pFli%.|ut98Mz:)os)'ؚh@ /M/o<n/@Q@1n>|3Ս'_ޜS:E8ARNN> fdMbH˱ [r*/!}rUuQvnnk!qҟ&1ouAcl>$^UK^⽚*Iދ*ŃE'i 'Wͽ)خwΏZϥE冲c$8HswI2Wd&­3P\~ 僷"6}{3~)7: iÞ\ ЪR pn $ m`nk+*qlz qs>&^'\ xr߳{հKc\kS[O?(Jc_qΕ'_ވq "Ғqi0+zҍךa`@ iH$*0{tMac,5 %졀xa7q8xNP\~Rf>T1;ބ7^,/(My6}>A%K6P}ЛaEԶO e9Kx-q( t`Ůl4&Kw7C%)Wo/@Q Rۦv_mMv%.NJm:%0?Ҿ.mY+|2|XKsa*m/it",t2@#Oh_o: h ' 0|#JR_H'5Vފ|Y x-Kx]_Z50pTy6sb|]LfH1'B NzMe.=?DX4Vf(+1:-Lhn2f'jإxeCC%)YO/@QFOj?]6mqJJ`T>/3*2;Nn?l I&i3>O:-E Np#ӈ0j[iqhdxۣko*I*~Rj kn/7q=3i+J7_'(6`E):|VD?x;9}ԭyܯ)"K^ц# ƻm562ý|pqIԎn p ҾrU2W۟|*I*~~Rd8#-RQtf'#kFNj>-v`XX5P76WvRm;<7(y4v(C( g5+ OAWµxan'7" P"%1~7܍H Mm mY* \^#A0뿞tB;#JjӏF|N19 spwf1o8Ny2d`jX9x ^aCl%8-xYs?C pr - e6(yKAb#5c%]O4YҔ[3 * nƠ`PI Y(oD% veOB|I }!K7JW26 {20p X BV \g宕\I%Ԭ6L^3^u.Xbȓߑf2@W*IC+2`Ef@M_7i ᔖ5k8l{SD3KK׶H-r!'XHPT4pbKi1PbP>.d/?`${/~kO?Z+U3'7I l__37}ݎOn1G뭙 lZsq(om't[C$OL [Pj {iZUzf0qOt2 P@g1Gn><:)ë'Sh}p90K afªhMvfZrFRAX>{JmNRxRYl-y 4۟|݆JR (ܸx,{E,0MdDXQ=uk 4 4mps $) QvM%Vi--Z(`j) X[&y H xan'75C%)l P=)Xo{roB'}:7_ʇ,08gjԮ!r׶o &XZ,U  Iՠ5-PrK- kN o}rjl${ϭE`| m=,9-Jy__RpJK! y:I4:NeO H )`Mᄓ\@-v PGeӄk{1k p_HXg3|ԧ\rYQD7Epܘr4=iyd 'dI÷جSsŋeu$Z')Pzq)^sڪKγw*Iއ+`EJ[:F9vʞ7UVi .%+̥9ސ0Lrm_m, Dx )Nm @ڋ ( 0(^sWP@py*Iދ+`E$q?-0:sܛ,L1~ؗrop=#CI32'6B[LR\3T3 E D#Zj @Q6. -!C%)r (\lW_{c]e?5N%{QO}l<ǽN*(+TO A>`Jŗ '>M :H-('OPW,PI \(kk}R`G"+ý!u)a0ʴyk;B#~&]ӻ1A>VH×FKB(mNcn<`QBhmY!5RJR]/@Q\g1n>|]xyp>e/3Z@^oxzmHSM=kffU טŢXM+bIzp+(QNmOZ!k=T<)+X޾hPI ]( n~{^g( z9K/qm* xjI#MvD ?NKwA)\/N8_P@doAgPtl}ilPI ](mjR`G"˿ϽPQqI@6k u9U 3?҈) 1WA.&Ac;&%?R}JpKw$ZD(~TRDUYzf??q pz/@Ql'>VG7|{ӛ|j>n";o~?`cJE&̺(0S2$x,MA-9!_HyJbN(B( yo- KŅٝLl> pZ/@QlH'4a?ý٥0Lu_;y[88OA$w뵺lρv!^3/l':jhP൏?Ar2@BBn1(a"L֓PI ^7 Go>ͽɥFy{56{]o%:QőR3-is3@UAh{d\`(J`tjf0(O["prKuO SyET׃@˴yOm? p/@Q(z0v~: >iy.B,Uhicf5mU) JMu @x.h2@B}3j&eUOj֓6T½W~*X>x ~SܛZJPڎh[6ܻAb"uq ,'vV9)k[* 93ĉڶ*|<%Έ䯍򞺟P dTprϳԦ^<0x/oK(JV|> w+Rb;ߖuM/q0SܧXiŔ֖(9C:ҪP5)!CI_\v)*.BP@]5=n %-?|Zg0N?ɽ'c¶lv_g^lQ A2tSWn`K`:޵*XMb\6T­_cm1V[@(TD}&s PERu +g6VD2>Ѻ- c_7Ʈ@z\00[4%M,bdhhV,A֗?2T­t_TUuҗX1?LܛTNALCXfO, 63, [jAH [gC&mzm.%ǝۨ6E(c}_i] /odb~JHi ?}YO/ ⤟$SaRkPEHٜ`Rtkz\d ?h(P5@V;*ІLZ:Mdڶ ݳI30= LMl]C%)ܺBI({*K4|bye[ ujOܛRvq]Qf6N)r3z c/-Q63icvC%)ܺCi(b ,y_ev@;6/j-6".yL]}]KH8()/ZMjA() { g5@8-n H'E9INf+6&} w?5 p1g3F7|{# '!I<6$Tl\8F> ʂ h k)D8Vͪ %tNd7| hKs ֯ #5ϧ1^f)J<GoΈx;\zGPضljpf8gKKnHkD^ vKK#qi69pX gd7InMEj(dΆe5ngʮ_Ӱ_"C~=R C+ŽNE_q!F.k#KXہ fD)G dI'k 5Xcm)&8/+G߾PI `f0^b뮍[GT5=x7ޙd*@&,/@C06/I4\/po89֯ˣ~Gф>Nۃ0kH8q3j &g,Px\Z`жOl8WajD"d*fJ ܉b`=Fr9|MC$_▕D;Dx$=0W7~{ɉ-GK!Ep)ۤ !A,D z`cR Ȳz%.K)_&@-vsXZ[t qe]CА@>/@ <79Ŀg_5>ͽ["T=u8@CVY5 jYV3TP59.W LGP&'AuuJL(HFz%K S(5/b?N]&rRNb֓fwMmE!0,Ȼ KJkXBH2R)Z$Zh#̷_H pZh_r#^-dy71'`ihDJui`߰oa.5ҔvLl (N ܸye'x{&4qj2RLh(h5VáwHe`hE@C!joK+"ts%"a4p^jP-] %x(MH1Ħp ,ZdLAu v`,kdt080/,{p uEv" ?PF !!!̅cgcb|YJqrNp: ^#}f8gv7m B Ei1!A%HHDOb< jY[&ZL,@q GI&@RF+JQ5h%.[/wk:_a".xk~ponE )s52aayK1;}KXf3s:^%pϪAuDmȽ ҊX]G Y]q-(}:%eVU Z%]9b'ŝYH:ܰV}E'5i;?d72C |!EH+?g~S':O0{Qj=R_`Z 0 _j)bAF$^E`^xpZM޵2Y`Yr4ED>)ZgY. %sS#Hw}%ԆnxQ5t 5jG:J,:B9)2Ӂb"!00>AVq+k\6ꤽgfK7ݦFWT_aסj8d@ll|[4s 9JqRکq(-y_nwE/l_D6Z oa Y4>-C mSגH@-800瞙/,q#Ͷ7UO {C 6E?>poZ\1eO(D (zRAQQkܢ\fh~q-47'sĉ4x=N 5"TW@[{"}y+~ʈtal֮j$Gx{j|٭ߘApc +(جrℱY-ĂMP<ɕ9CqCP#t_k=M iMΖӕpT]Z$ը4y 'J\M~ʃ3o2յG_e׶j 7Q},0{~0}_]"0gx,D `$HINH)m @hJ{o[=(>€r=gfpg~Y#ek>kkD7D45Ŀ'י?Llf36\qC\Lw# s)ﻫS:. 殻ztMV{AՎH1&X'i+U+@8@TmhH},>W8m ⵽ύom-N #?}^y ^|vsy4\ǢlJg.8M_d #WFNĖX6 0l4V["F>PG‰^c"C#kh`X@Uͻ>oܮ\1~rIecLHG<27w_'_x+nAn=Jj\鑕?hg|w]cHofL GS hIqEʗ,?32^֐H)},2Hi wv_\F`g|sK+E`ĘSF>ؿ`ʂ`ֲ 0 PVPRdwE5*< Klr%0_bimqtl}>#ߣ@6]g}ﵻ5^|G`E&"X;Ge ye" B #D.ߣ]3v 7Ig7M8<U!@×$%oESNRf|I?[\I"%Yc)ʈqanKF߯].5 n݋߽>/?ё|J] Z!\ Ţ"M- ]V:*{e 챎!2QM-ӐkȵFeH3W)Uo({VS '@p``Umd}#V wߍ[Ս½U3p~j$ $kױ N f.+Ғ6hMh 20\ aT P׏HJksbQIi]V@eN*0#O#?P$~ys}lz_1b_OĠ7=sˈ6#kqmܹ FF) ;*` wjm"oεFU8q2&Z'M.ɛC䜀и-3O /{/S#僷.Ɠso`{ *!rM&np=ؿP.U-'B (*S\B>8u-:mW=Jj=gTF@wa[@3zf>#e;K?4d̽;_'_ެ*EIpgL 6F8T `g3hws @cB_plI30g);.1z^&yײ~VH@5n H۽8po^Y}0zekW5b~C#q?iDiBK~8EHeFi9ؿPWw“L:7EYh_?<9 gd Q+LfuZ8'.AfbI*Y#F@QR3 s;xm\^ ݼƕOo?0n ^K/ql{2 8)80,\/1W c=/l4)˩k7Dܛ* m adx%Ap:e68,F-U4BZ$܍##@R=u7>;/ᓧLOQ":<-(5AB(^N\Thp\ ::Z[;r| otA:>)&w~Ϛ k5NϼA2\ 62OpE,"`m pwnpKYNBh\/4.l6]Q܌Ch~R*蝳3,b@DXJzaF//u= v ВZ@iD#my Z¶}mPfBUZ}׊$%6TX^#=:!39?d-JkL~Bcr+Z n2@~Z j?+thlW#dܔR$L@-m^ypDJ&ET֏__KMuLxcsˆNj$mz[5{ 02SOwi6uN7TITy q}g7TPC΄O3-U},BY4`(h ѱL-g::ن'Ur6u {)ěߤq]PjD? ({;qK\*bquF59җc)ą̆@2@ *j@1iLӾ @]RO.4(NȓiPem(K` 3( JVPKX%P=us %A='qI;@C kāED컜 xxd3v %#1'1DT)|͑Ɉ7C8f=6am}՞7UIl8G U _W̻/[YzR׋*仮H!2A2Pët,Al ,q\ [E]̲1blլ\kͷ045l|?wNm[\_gL\mqF)\eD'@`Ot߸K׏ ֚!%(!5jCy.V~TH,f5렞s E/I/]- RNF7Gd_sy٪𲹾Dͯp|#::@捔|T)@z;F:DS05?L `+r)VEj HA7%!ЙFuT-&16ֿlb&lk#4@ߋel9!QF̀B@zf!M *~׋A_qēK1~%y R [q=(}( 67aJ26F{ 80F`D]Wl&v^fu<$ǭ"Rs>WfNѻ4v[yĔ?97oҬi@ANv 8T1ims'Ԓ$fWۘ j!S|mnx RHg Sّ ljH)$P  3(Dy ׄ9ƗoS)ɥ4*闤y^y{'mW ,Qxk3CNtQ;#eW6#')} \%$P "0biO-Fiɢ`P\_ [>II "u[3T# !Y֣/9{6zϷsFG@+I׈ZNٕsIR.̇Ű)o NϱF/ܾYvv_&"z`cF5>8VTxN71^Q@` >]̴&} l{W-qfV5\gV(ߐ ɣV!jd0þN YѾ~ņZq|ѓ4s}oN} is5 nhK.} ij4 wV^xPsϸ iMfHR>&0$P W5P_NZ{Zp] S?.Z5a B ^MNЄO.^]-#nk)g( h@UH6`"0a^{s@ "` Nu}, >׮N\?GVfW6~o8q,drnD0VK }3ӬQoIkquZ֊]<[M!y%{)hP h߮ZvD}=vM6J7KefKg`Cˑ[ȨڸGROn3͑Pl#2H PӬUfMpyVjN5˒`^H62H 4.-G-.J3Ńu2s@0]M#ѽ}"k!ėʢ14(cSm)#If%w|A N! ^3N^/{ТV:$uRe {+gr>ݤ@#4}RG90tl{fwQv'͟鮢wV\|-mqܖC`q?qtrAqc(bH@p3{+E Rw=RXk\a+\ղ(^^((BK@Jj$%9P J ƪ7Z+m }.w צS5&C8@81\n}@-$r->Ŷj޺k𾫦EDRW'T9J ^VC'+hs?k_@>'05TE;(8G/Qli`1p=Y(aFץS۬k;ܮ` @{.~ S!l]|GJ)3P>5 Kĥ%;uEY)> ^' Vjnh;3n! vpB+U ުSRZ; 0Ӳ`rG1r3M*8ח?rhnr2`6s_(p kd.'XB 5U.ى" 6knDb[p]^x?6P 3M[p&{5 7YCA^&u8ɶ!VJN36~u7SKo  t>>"B[?= E VBadR3MqK >8m /rT!?ZMU/"'][0P/wXM2#@7فxJfݒƻG x{Vs"h w"5D9ז&ymr)G6 0D`ɆN H dRc-R_@L{B3E@ tTyη˲G@>w]dDSy$yi7`D#<#7ޫ>FH4QgCh Uyޓ=J}׏&lv 'F0 ( 6K8D@X$CO3:Z)??̋n ӂ~e7W6`D{Z&/!%纴:zr ncDYN!k7h8=g`2 6 Uq`o*0 lVpă"_NdzɛC d PY!!p84Ÿ;ZJ5 ϏON9dhAQ3=;.S~v8mg_@P$|m"pHѸ*11 6.(F~p!(,h_DFw k.pކb>k<dyR ǹ?| s(sI Loxγ5gIq zC$/ΩFnᢜADް.j;ZG8ϡ ܩ@Ц 2{ vbb _g_`UΧNo1*/41ᘿ|U)6FrR5=wc4 6JƗ8[UE)GٳXXwz|rJ!}*66FrZ5n82 KBDŽHܟe>1I2|:m&|K!'@{_V֗&xὐ?\@GY:G E =O8-3F+NʹMƩdL˕1{RaN B$7$0"q=r8=g6#m_½?/V5"C Z5@((<6{ГC=/C聁a㤘߿f wS9HnnPj/- }AK@~cgTO/E&@DdH; HO 2U lgw/ F ,V0(~&'Z"lOCuT5vn<q`V@T;tN:#^qI*7r٬`2~8U sܑ)Pj5[5_[f}GEr r_ u>i1~&5ԧ!V)B&4&y)Rl x3|hQU > uEt/vBF#0S{u.-  ./?2`DP@ @*UFA;ӻ@ 0Ƀ{mq4_fܢNPj )5Oov(9?Sc7UXX>w>;A~o ϙf,AT0F8Pvn{K.AʽnܠL_dfsU)p`۽ֵ`#6!*h/5:5rlүc}& ov90Fz{PB|tbߢVIJY_-(j ֙mPP.Nι;%O8]9?$s}crAf5q1LJ?p *Tp\5\pE"KahA=N;䑀ʛ Nq"{Gn)t E*k⾷Y\O~?$2z + }BAP@ͫp>ecN[Mt<");.DH&7a[4k:2k<Y2X{1U!,gz' JrP5c j)7HAsR xR@W@jRየ(!]@$0ҚiFqS"5lUNj.8Y'b#?vpڏ>AG>zoFQ%0,~v@avˆz<Dg3{:*޿k u⚃X LZ*> ) `.=|w-@*,)4ւL,EqgPI/S5Q U95LҕA[F`$@y4yϳ K7 u X_ϧEti[j%j] }o @!w\[gZfzu#-~&.{#ȏ irJ.)k*4g;'W J5}Q'N@NZF0Ph7 hX._hm' S-IE`3o (IVF g>h}uELn T3m:r_ tt>^CQ~7XLuv׽ 3 zj@@F#!Rj=e,oD 4P)k"o` f6;+%!y儳eXe`_䴏'n(X?jG̀)YNޤM#1ReaxUN{V Z|h{hF`/]E( VWcD+>D%#0LOS6nAKQU+͸,,0w屢р> TYc@snp)pblu5S 6jP}mDH4[8``yP@~ߘ. áGGC8Ə%G4G)wnƽf7rf`)fsVkP-67Leo^=Ȅ9e+ IgCυPe EnpMSֶ_] k[C`BqZ{xE^`A { [R`_b` [(y4(.ANXT.GV=@)Z:ǡU<@0:&U"E'7=he0#mV xcad3#yT };׎׈`N8UN@"H k,779 ، (PpWׂ0I q,U@8 |&2qTm3VȍNqrL^n^6`*ؗO i5dٰʧa4`/f|ajP`Q5)e?*pH -yZJۣ|&>X>8c$42⌁d @;?N~/sTD[*V?@r`}X=*:~#&l1 B@i4^lpݻ' [ڄʋj@{Np-ˆ bynJ@E&*4]#O[>ܭ.AP<}qh(O"Q-8 [RQI}|Z6yG6# $;*6Ozl͸ u} AVB83Ņ?q Რ_[Raߗz}[7HhfhP`s$eo|_-)BmGPbTIZo3DI.NU#4[R`Уz \ =[3 Rulk\-*0]N.Kn*b JKit$˯egUgW0,pjHM5&@BhH X;ˠ'`=R-*`|*?ж%Šfn38 %w\*)jm=s>Ғ\>VB_ eek7NQq q 'vO -@`tLl h8 ?גƠZG;eń[ǁ:lع:1nl!!\p>m,qp8 jP 4 m (7@YL\ ~ # (i6{g)5l`Hٍ"nz%.ƓiS0 3k'oeVrSm (%@ƥ%=WB@n(.ܯ6  Ap>a6a  fh˳L AzZq"_b[0J)j9Z/WX?k_lY[H@OBPRϽ&kaZSUuSw%-Аq'G"?HSкTj">l A_h[H{)"t|{-لs_V(%h[X3>,+eȂuhm[c>ibz-m%O)!EjŬ lh[X5"6*Q8Hz9^"h`p3_fT[pᩪ "Ҋ6ҧz *iZմf(@,hBNY>k?c`̨F[p>*f{-RR֖ϢTU[Js$FEd SJL^!&5pa&r~Jwؿ([p!E3PBA&\{}PZ*ma5 zC"¿v@SC@)XϲG>=,R;5A 6/_)bvQE+X\\FafaMJ1@yTaF6Jl:()p@ܞ\t&p߻U(P,B'm6}`= oJp2ZԤ@X9U>Fi1mԣedZsjkf'(I0 jj[ V wC`vr0L4<0.^]J?g%5e6b5TC[KHcOgH ΍,GWϛ/̬n<1wH 0බ(b(=n1)=|ox ܢv9NMY ?MO0 W:BG2# (l``! X j (< }"І}? Ā3%5;QQ^}ܥ/Ah4- 芰_ Jj(.@R}V'q-aAQRQP+uhhA+͑Z:*$A ba=J1@V}'$+JyA 4{*7uy;PvJH(QkNM'%j8h! wم? qߣZж}_ -.lIa v-?CR[=XutT`nDI <7b>쮮MH}j`D+r//a_M-dht,Zʋ LOMJH#)֖,R \L\Ið;w3&e0.e=k^ױ&V'FGgb5<!Q Jp &ڤ iNʚFUTqc=ĔajB\];l@#`/x|!Џ`c9h)nN]gZYkL^trEGij0^5B/LܳK kF7\]S4 >L6|ƨdA qU˱3c<N 1s;A;}fsߓ$ T^5Cj?(FS$tz/MwWGG6(@AAn@a״3YG! Q6t&AbQ2 #):_@ȯDžO6E4|K@[$hk[%tT`}t 5J@`ӘʨQVs` gfxe@r߳]n?d,s6SܢT y&ւSuu?w%QP2 @>JE`` =2Ee Tlpߋ4jҒܷb3/jđ4I)Zo9>qmEGL()QD]Ӎ @h4[ ř@}HKߵ;-ɥ{v4m8H Z}BH@u}YX:*^RҢP `8;e=``Mg^gܟQ((DО{ 'Ň @eT)t!0&6$MzP-$6|}0-p-K&Bˣ\k<)>wF]:*P%%-j(9o>l.9IܢQ\@wDvߌ޹[۰y\M'es<>EKPQE %3h4BNP NH3`\E$sKnqqθƧ_z,__T\u])l=UeɃ,K<ȱ9C¥KmKRZ^ -2HҖ9Z{ﵟ}@[^>Ygֳ| }@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~c>Џ}@?~ Ju}SKþˉcm9ga}44=#Z g&~; /<@&.=T (k"d1pW( dCA@d 7#g4 XxpzUJ2F }8Ҏ~oS7ü2HNF<!!{k}t"5L$'ޱ4yW Y?S¿{?15yɩ+D_"@vcc{v_p[r̎sMEM'+P7fW(}m5SuR7Ŀo"Oc=@ |.Oe b(ls;GiP;ݓMH2v ħ?1xSˡ oksk=W_ <րΉܺ @(IN_G!Ad (> > ou7溴]Nbk{/Dم}̀@MǞoē-HP]f+lٯyw"=̓'{l\@ {\(;v ! ;]?b} nQs]>b6G[N`U/2ÿd>:eȎo9|HH>Pz?IvxrpNݴR8r]+ym{y֦?uiA"@|؅z#?5·g={QN߶9] h!v.LN&/~^|vܥZ@ r->@.{;춾Q_A [̼JAty7Ԯ_8pkI"@^ bg㢡㿊#羆"@n 6;M]խO s^t80}c駧-G>p6~q8 Y@G홾r3 d?}?O8AC y>XhAQ~1zy'?S _G 7Ȇ2v=c3~"g&kT (c #;lM}_v5q񛓗]Ht*_xșg󶑙Pjm:'.+$L2xfu t.#3/q81:\gI?YݓEH[N=ao~⟢7~P}+BP> A 'g:[?S $dqD'U/?Ej7'/}HP*}pw䥏n:w؎ztU蝾BB<@>k?bY{0~^;T (D}h)k3qC[볼ٟO|JHG⽧`@Rj~ 昷f9 >o(P>-g5tUMOn?ɏ Y|2Q0# Ԥzm/xBB{ {\'c?ӖA^󑘓[4PЏ}gmɩ+総{7[Nrzz'o~zPH~S*޴mOT7}}.}VP* A ~ im܁;nyf~%+T%Uyw9ȹ,CH*?@மKk܋i\a79i^Wa/;Fg^%BB{ ۘ_P;*P8h!vЉ_&$dqr 5)tN\$G{aG;DgCg~2qoWɊ>/+?79nh=Z؛*LN1=yi}fv_r3㪡=<状#?vw Y/ ^7Ecu:Skx ԇ%9z+[,7@.`@r W9XL㈺'/~EH~ę](Uu` 5]5S/F{1~]uQ,M:u5)$dq[w+{m9/!;j{'r꙾BB{ ?Y.¾ªB *[iOU;l~ɘMkK'pm)@4Mn/ .7:x'op8ÓO<+BB N¿Qh4 l`;':Y:l}JGW-v-N=&$dq8ɄPc$BͰ? s~OYCסW+h+;hKwo4c'>;k-縃u6t;xDcSOߏd?)Op1w,00{".E׏BB@6a@e#g:n+Z c[O4w YO((;}Tvwzk-l/<"~h<42  9uTH8,%v);?Aҽw ܁:`xw߫:|/ K\Rqk@Ae Tx3B"#1zrEgO.cVO>U0:J-T({ <2?.$dqgdnWo.O%ص;=Y0VwmGL[Fӊ+E2)hcV-`}q!ɡs2U;C w6vpwQu"B S7Ssk= DfC?𿲨?DyJsly׶HM#;vO7?=_qcG˪; "[ sᶖCg?Iɜ΂ʶS?2r^î^7EaTtKϱK_;s"ȋ;n ߹{a/#8mP,0}&Oūwvx}#TdiNWڢ &[m;+ s[ +RG ~X={(lo"B" Ή_GaT} rmVu#mxpbW@+zD[js@](0ȟahsGYTR1A"#Di*~v/p\@Mjt2.Ngu6X잼CHq*'?}"IY}79?)gHPГZsC5[RU]1 n.l5oS-}QyWTȹqgSu l|z+ GZ++O_ӷ L^l'I~Ot͇?˺  [V~B"GtǮqgBۺsctBGs.NcRw~DW9z$$j,z_2,wWy?[XX ֳ ^ VaekjQH; Ke5]KK *~;<5 mh''Ю󿮶J@:"9O ~}O"A?~"Q]OP!0WH"ߡZ 4>T8zrhhao>qZ=/ݽReRN{r : K*ҎY8] Hݓ/i® ]<,Bþa\H, ߧk MHd (@c@n/Z(i3!j߄cc']bYݳu}Vv6i:[1 uڞQA`S7xE"o<+oNWhuR+\_?PMv@Z0v054Q?ܿEH vw_0w$œӖ擟qOn3m}IE[jSap 64$T nW0n0)+M+dx?)N?Y.¾ªXH)l[ ! EۮwEP.vT f)l{U4g^+HPZt }n(Mj{_f՝uyC=\KמI1L 6nWfA_;ʿK3N\`@O5n(4fwwB;dl;q. O q4hNؖZg"m5>d* 4*tmw 5ݎߴGMjM;;JOlL=u7ݾîll.(;q+ݷ~ەuoz2z晿AgPg =VS"nd $1@v,txBiM׷>x * @ 2 ="\ܬh 4\9"B0#;5|Aܾ&Q?õ"qa_O0>v:O@@ !Is.&wwS@Ƿ?io-BR\}OE)K^ݻmбzX?-ZO;w''srO{Apt߶n*bņvG"ɣ澴__p;}ۇngg)d?g żJsSUnE_@m Kv?{ TSQIr[5j{;U-⪰&+4zu:9*ox:n:4;<2B;;@l =N-rE,YA#~|6 Yr板>7~*_ḾcKPb84t@7/=mI"dɄܵOm">/~7v H=_',Qop_X2*]AI'SC#=T (h$ȡ BU)? ҳ =6qG=N` 0:nkD"dȆ|susQS=/̆ŝt]= NqUSt`AI}_zw#F}~`PQgnd`j?C)W?>_Ax߱_]bj6b\.84"HU ˂yx({ >7*diXX}m]sqΞO(S'Ji;dvߩC\r"M@Cc?Cc ]( >;~ÿpX[,Tb}߳S_ƸES\CC* Mevӣƀ*_QXj\lh?b@\Qmg 7~4R@yzgEe{jQbp- ; `9pmUC}V~BX~yiuA?u-N8{6yCy!_dIA7B}!W:]#~z ȮmGg@beS٬O`uYC2Sֵn7O@bq@}ٰ #8ѴD_@~i>/&[b>H\Б"lyE+VoS.=^53Czv}?,oq#qn?;) mq28aљD({v ; sN⍫U5X;@l,AԻX]nTwv"D}$ȖzJ,Jq?sؼnOM(44$=69]WnA؝7n?sjf{~F5toxRHǍN=҉>-h)#{O"b(f%*l2JeTC[i1Q,<;ЫRYhrm\? IImWdfo@@Y>R}V ^,>(uz-?Z=Ulы=-D^Zh"ʹf yZ̑7=ߤ"{4+r@]t-`vZSj:_^m5 R  'Z@>UMbM0-2㾠)8ÿy~}sx$AκvCk!CLUyZ:s3>n#vX_+_1W0Y|^X/dP?Wfn waY]DK |i?">fQ}Ie%;~䃐m>e:N-.ᗶ~ 9=_ :@rߊ#l*_˸!rMwEכ!LC'n8{E`>`4||Y]J(;fn@vħ!j,`V=ߖn!plH 2r{ }DM 2_|x"!wx\q뤅Ӷw$SWE;5[# ֯;+O[eCL<*qnʫbEg0Wk2X/vX#3Й"@#e2r~qй;R9 ^kc3-(Xw0P!wEm *@@0w_X`;wpuO\jz9~oثA;0@|ctl L|U[}.XƂIN E%CQ^Z9l~0j4Izmwtp{:ЮL8OOU D)ʾL듾_GZoKN2xDh")wZUkK:EA E!ݦ䊾H >F b D;{(h-` ]fS@>-5fs[\k *@OeAEvQӯYcH{wx A߉߻7:Ɣk=aօdoVst}"o.#N܍L),o%":.8wn\@bl0?n"goU -{wvoE wPS ,(Q.Dœ vȂ' \Bhf?3l7tj{Tdp 㛻5.7fOWT.lH6vw+IU1QS)Bo,#fI%{梠h~b*gۍE~c.h%: d=sG>r A (@ > bw(l=*WfD:K/iU|صJ)v 5Ν58@摊[zNR@pc?ڶ}wqb3l7 kJsl|vģ^(i(a; RXT咪*RV;^n?h`w>nM 2%;Lo dSDӧ0x"-3VGk7w+}Mcÿ)vf\(׼?/wة|q?}L7pv.h_4ϰ]Mjb }wI.\#W">^D%;s!T'k;E흼_}ۇo<2amAmaN3'VyxρpwR;n} @5;#"4[ v^v Zx\v~~O:駩bS0?pNW"%3 w y'Ej?}pwϊ ' ɨ'SbZ-Ÿ繜kg@ugJ),[V618zNBb/{qM9^-v|鑐7,3"]F0sȯme0 5yRlh0X[/l", HC6O]w/ !Ad ށ*@vYs$-DX5v\yTTMoL_bV=gΩӿl(~G*ƍc%"hMK!׭|c;Fg~EJzC=࿼ ~0 QM!n\ai(y]~}}a?S[TuuȝךH% c[a24{ܲg"5<J@ {PS!*q.TA܋MT p9Oŀpښ xB? mw~'g zC!>vg(1cQ_UoA8d{¢=7:>#{{ݙ-z?bEˡߴk\759q;"Q"bd3(B,?" 79)قX$7@r0Q>5z(k.7U3Й_]#B .O~XuP Lc7@I7d/]`8],oIUQvPlͭ6=]''Ӯ]/WT dmu@Z)+YZO\a:[BN},V5΂s|/a=4jҹ? L,^j:񙖃Ml/m{a5ay ࣘu!VQX&Sw Y]aܱ_A\i׋7n]˅(OڳmdN8p<3q`9%$ ^@|QS(7 l$[A>/nl }:s{atڷg-9q}/~QYXX%B{ @Oqu~ `)*@X5Te OSWdmW7QC@gw W+p>ẇWE'^8 ytn{7s{D`0KeM(ߧ3Q$sz |5N w*\_\oli! de}}:?'gE)IS.Cr"3}BP'xZ> ZZUV @Bc?5s Aÿi_sz%du) k^/mq(mYZ:0 QRQXrS .5 +SE`oEM}/Qv&. ]@ ;f :ʽ%~zzΝli*wĽIE= ^G½QU{{iL"T./΂h[nM!2 6M K: q{?_w`GAj:?!YRi/V7Qxo7v 1~KMi_|.\z-`aO+fmȮ'\HNؾfK*45Lt?i9t𯋠@߯k q\+*:zd 3gch"oERxO =Ή _G/ ;֭hfZٌ:Ys?b)x]0TSqV5)v|0t-5ɉkC'zN0 s;-n^X.E v o 隿8o_Pp9 RR/GD-YQ}m&O:'.f`FL{[z~=!|ZXm̔'_6 \H܂xKU!nw8@Wo]~w/twp^FC+h4xw8+D0,׼Z npº1ƮPXSМKGweWky]wU mg_m  +j< U m6U-onB"-*nl CBX?{hGɡkQ/}S1r>M;2 s;Vw}{#aIwv-,Θ 6 g?OVm,4 A $ \uP:[ #桓RοJH~ :PRX\ZVOYMB@ק.g@MxL!zu/lw:>~M}%>=יº*/? PTOBb]_Wg,Ȣ.qn~ $)+8zӺ¿4xw Yܯ9`GOx^&H+EYF* ;<{K-^יrRsKK֓\ Ax r;@|R1ۜmn|z\اc 4ٿC Dk Pm_JL S7οv^N>E,B~u}'xӞkߵ_m(вv{ݷ}}3;¿1GT}}~XR>QJ/}$@na߾([ՁA q*nO d^^w/F\ Xйw^-͝ G,nЇS\YPEp$k\Gڽ?D69Wds#Ki sMO3(nþ !*{ ]o[y[[(l3iyg25| Y>U s")4B)W>_9fvg)xP%a5[4M { {~#a\ dia?_@6 )̠CT nmKk:o Z(ܻmh>O]uRDgP O[H0 @OU +{IXX5r/rXGPY/Hc:ԅ}C!~X3>? ,څa-m7TXm0Z1#"'}'q<.SQeOJk%]A dIyK$d ^mpցU=mgsp\7,o@@0n zɘX$O>-Oz"~G1\|p~r+{6yQoO/*Fn`S0`b¿qk p">H "-r_,:uW,z W^.{ 5'(H{m 1@JD܍ޭ1mhោY(Qٲ,VW,/ 85  2z  گ-.ҪV5$[ T-)l¦qON5>"@~c ӷ>U>p/rYՋOeB5wN\U߅w 7σ;;>?=Q &]Ŋ"@pkS:K5-PF j:J~ ~^]Z=CR;ƌP7~`DŽ,bIr^ka/> [G8]gp(EbX,jM3ڰ`26v!b==ÿ //3B~xc7U.1~-~T]1nEm/va6?RZ!N6ÿJ^ 3ŧpo4KN6uIkMߛpZq;r&64g, MN OCmV8W$(/]C8w+wvM b W|T/n94^Gwy}Z*W10? 2-D|^eҢ`tƽx a`’JmOxz> bQQ ig[O?glX3ϟe>­χt/~nQ0_,,]$U(kt,+a!lo6{\7N.j6u¾"',*p&P>BS(>q1 )W38Y1f+#X)B0Fٱe.( ;B;8wS.Vm=`8$_0wmxjfB ]}"Vk4]r?)8F:/@Һn\3ԇcAYl-ZXiw̢w#>yhs.zt년O`n\%~?Wxo'[NX[_aݣ_\$$d6WT }B꒿wsao]~qKsWSp@0t_HSE lL6}YYC}8oTo#G඲Qz:r=bADQ ȶ'۰+S#?>SX}+Diݓ|kI/y- 33w{HEkjn5n(9ȩ3yIȟ?[sT餟 *~ UF`zi݌%U`0vdc}ȭ[\krznb.XQ7m 9 ~ cc:aܿ}=-t cyC2ҹ.^1v^>6s+Lدj/J?قwc1 *j:?%+ s:QOH!}ՖS鼣qyCa]cf^Z@\@ OI$>P*}]Oq wg0(Qn\3 >{ p+=X!&wt3T&Pg?;詻P)zPY,5O#GIUV5& SFUu>Q60x53Z''Ě#kxk8 p2` ܺ婤w1>|߽0Wl,>4-BVJ n [3N s]G%Tç >kULGf՜;-#B$_veNH< zަeq=(惺>!ve/k][sLa@>pϫpGi}ćPg*0(* Y@O0'v  ^eHZw;ōq]l?zU UTBYm6!Q:X߼kCQߦ# CZܷ}HA࿱B}܊z!AT (r{/X[PZ7 a? h(wڂNN;ü@^փg[sXk-Ƨ:^e@+eVu%5~i{~ZQetHqj{P|j{8xhHjUS:ZY}IA"@< WɅ卽$YT|^+k1 fMTon@X^ B|}W6^ecHB]#`M:v8]jBXȲ"h ֟WiA\;eLx}: kgRs=v ɇW'?^r?an!/g+?j}-aSЍC6QsQuDu: (!c=ql >M :9)}uM ٵNqcUG˖Vw}Iʄ~}F-Y#&8|dzXPav/rٱ}B:@[C/TROg/9鷣$"c `l*}BTOǜo-w2eP^@m;o}VM}B(qg|>\'/o%GŇaOF:8b XЉ@q'"@n.\5[C/ܲ~?h۩`y 뿛L2 q?>y[sZkONJ듎rmt_WP#Fg)רPrϧo5E}C+{%b0+bI_zza}C q(xr0GjOB۟:#?zՐoރiKE4{J@tڲo-f>l'~ЕBybۺ&"\h'`Zq>?k|_[q_<{(F{΋XEIX?mk 8_}&Ͼ:SmT ^gHN,x, `DAkMFwPAN7P@YC(>\pഅhqH^gUO ]z׍Q8=mًj# Gl'3՝qp! C|0h^E3BoE3 hE^>~ɻ> y`~9X;%`cX$͚oUgd (D} 7 '!Uz]acQFMq a/2@O /=,;#^q/۪_Á4F<9/Wy=1R:g7vs#/s7#]f:2 qyiyc]qZ@@/d#k*?s '!$r~c"8< b‘L>2UeSm<ύ[:؃/Yg{گrog U01;>jn"{ӵ{ Z:_nX;{uf1U}(ג_a6 d@i}y{ .E[\-.:{mS~Ys ASGhs~λǡgq|-%d3`A8 ȇl|O蹕5$;!W6  \F?Mӹ_.b@6{?j"V&mrָ+qk|kO9oר0o]VX|dheS{#*vU?A~dP#3WdG7v0dΫ"bR}꿕5" @olϛس`.a@6VtzX@|) a1H)Mv~2__ 1_(gy}u4[^ʮ#U+U'qϚCh3ÿ{7ӽ&(>7۞C"+a0[`S veys]k`bMt 0D5掛=c }qf n VćQM@Q=pIXw5ǵUw.61%P+m]/o;Zc(uﶁS6B48?ɇ-18YQؘśp @&/ɢO\g+D՝i"y%ae׸z"sgDc@\e@Y}i\|]rB0~'vJ5p'w~ P齐.LUuTD(1mL=l78‰`Or/.QZL)\"1oH"`q_Rk vj{&g?lڑ1V@||S{gϋي}qd s%+ƭѝ\z= @UXSeB犆ƎAqݟC8nIĽ\lj>ŕ~vr3T?ݝn8 F :@Jφtmr,,Wv6w(yL/@?> .Ds IJf!'ٺ]1SŒo3fk{?dnw҇wEt,9μ @ 8 Ws3$PmU/D H'̝iXƎ1@qY2 @?SN"@C՚oG>DVa\El~ll.>/o?up{,8BSP-Q ͥOdwҩ[A_| 4I朑^ȗQD\`Έ/Nede t]Ŝ'().V,x-'ThTO՚ʿF|Y|+=_ثb1vGnu^K7jqΟʱ9'2kտTۋ=>ss^,],zExF)Ѷ`}{+U (xc'k+$ɸxcFF;K,nʆE  *e0wQ!uq(P=?-Osp7QJ!;{e}w\-dZ\z$ ,n}W&q\ΩSTwO{f&(vU:U==6]}j2f)@H%")PH@@B %GR\l 8k>g_~u^3]{~w]~cmW&Yh&~'t`?ҧ<SBXX1tA_0:CZU5pX1W]&QJ2$|S~sXj*D2-}x|t}*C'Kgl%j cj]w˾hTDq}\pStϛ|~fWB{?;W``TOtn;~p/ZW#%_S_%{KebQAUR_Sxɿ. ^?/,B:~D\5<)t~u?-liA@kxLy־FUE?/uA\ IwXDͯ>Z h1> ~XPA>;LT+?WǧIC?=QG-{DLa­6 BT gE@j9꿷S׸=ߠ1U#WY\/.\t D  W=| Y gH gKy/KpHH$Tx*C/)]~f| OoAjYj /UcXB2 ~pnjJTyPR?zo '1`3w-&HCOL'{v Ĝ?g&+|ke?}u: ݧ,gqm$i.@ ~OB~Bz֜?z;&uvEm_@PgZc4nS+#Yr^_֔,Z1 [2/k8 ;e䏯d @bNx+s e)n`mߪwn)^kujgRϰP2NA\N6R_r}zY|wu7Jo5pkMqpbitԻ>TֆҪ/j;Ds:DkK|O?pݟg6֝SqM.5#˘ %WJО@V k9]{Ds"ͪ ?z?? Uؒ`U96[࿭ϵʳL=i:F  j2,$yN_ƿgYvXQ\߲ϖ93ܹs2Q;ږ5l??x[s׺@|[wqH8|$۷vݮ$³$S-q pja{{R*Fg. =.RЪ`bf9=Ʃ{Kn@;N/ Fuj] isL9ֿ%NlvVҁLؚH#ԄJI (*/9*'Fµo\46]w$ sL>|^%=zOxo1# ?~<ݴֻ|4;!$&wX*x I/E]Ͳ@ R+eP3L18h*-h־g}˙0X?*g\gwृ99rXOTr z)$Uh% 5ϞK]=%@K" tW 3i4BDP-B gk9 IMpo"@ ymTJ$Rl߸MiiYԴ <~7x;Õ9@+" Sv<6?68D-BLseh4hLhrε+<٣V`{@fwB_" E8p8zOr@ Eea5E wV|RjG?7r+?m7/)oHF6|ΤZ0GQ2ɊWuy|R}5[ lU0}-/^$+!Ng$oyxqjX)j|{/ ^EՏg[+Z x mY="eOJk P9gLQjjYOL6W,Ѷ9Zo\(_*Oa%y}etN˗\KtgXH$?+9#?ٽS'?;zY/ +f1&c,KJ-Wpږ8B?)΃bf[UzdWb[3DVܦŨ~~H$'|4t[7\Zs5"~K!e z-тN.h 22^I™TUZK3pM۲&4Oٍ557tqݭ/WyF@meR*w#a}&P[sp#Nh5Ǿs"t_[g(*5_ήשE{pmkcsct"|_CRK90|J9<$^R?PzsFn+CgxHW]g9K-UDάŸ)f./KdY?q5/tkC3>5Y!9NRY EC)2H mx_"onz6^lP5wNdf|O]@K#|۵jhi\O].l@y %l Ffeֽk~j'g`45Uy~^ir-mcRƵ?@$ȱ7bwY[/18z>_h?+#e=8- EϢd1g+UN>'0x8,1s"g^4&ڙּڹCs=WRŲa~ )3gDN],bIw y'G#Ŷa,vqyEřly`z[_ Gi~*'wӷ^[RYTd'Hؗ sӋ o!݆ {`p#6z8HS9usU[90`Y\oz$3 {mWa%zvo/ANE)JO,.ٿ5+[_g: C)аިSfdPIY4b(?Q`V0X<ZW^R1H);q0I#}N 3pޒz'|}W o`!-`֛t˨E/'RE?Oi!U,7Sh]H(k[j=g8^EPwr ~\rehUEs"ِoh _?H u/ N JY=o<4vI+)$-_7TqwlV^< #ku ̡[wlaA7Gw-Wsɢ6הbq{W?.L%9ްц](),'g/8 #mgcUdյkm9% rRX W{mI'!rhsmyH w?C W\)>ޘS\g45$ZFn D%5JAyY(+[[w^'*I:$Q*@/v-VP@tSHlAKbF9Ur.so|kߺ($E??CnU 9G1T%8fOw v=꽔jA*@Disx=96/0 U\u YV#"F|귞$uI<$Pɛo𗻠{K)!-/pwf=wR R^S`ђqX=acqۃE<׽7[8-!XcMrE7ĽT;Sq9f#]sz?z n-O>Տ~Yo9"/fԀٔJng$Bxok`{$pn陋[0 Gm47&g!㊩T4Lߢx_0G|u B@-։~]7C7YҞ(Td=Dn)p7dq^zR3$ |js!ZcwƱH{SnؚÅ_z_8DP]}_Xo<.%&kuHH{ ke# 8UCQh\dއ IBy+\B;8!L͜ SF(CkwvWxͯu B@q"[o%ZqRᘆRB"p0Θ|6{#x?Ϳs UpBbaw[rbvGNӇŋ"@?H~"y;uM!z?ߟ73.dTRcfQ@`Elu Y:MqT-}ҕ{ (MC(x0s=E m~|/u _\?$naz-!; fkp9I']|lØ@B0;\^3|\\3Bbq =KH^z|SscΟ*RmqoorD33`֐[uhYmj ʝv5ֲcy77q˵l\,1$P%1ʥ̿'SK~h[:pksxU.^/?Q,ouqx@WVwF[߈?ʨW#UX?Ks6+kGCBw-WY5CmkoC{- ARsjbiϽ93lgI0i4|Nk`|~ݏwė \w>$^vYo5r(oI/S1VytkI"UHZ*g'\Z%@)F`{*ϡ/gwD&GX7eK~u_|V؟_(|na~bm֐]_W #sP0IQxɠX;5Ԕ[:آ^av— ze~Ϥ Uzwo\>B/e[ =Nߚv' H 5*h:-UYh]x"8A~HBՉfUYIOx9scMTf;p髿#?jQ`o7}*?0dGd|]uO5cam rl [?ڽw"UN k陑Ɛ|j׾ !RRkUtm6kWL[]vp5nF6 eR8&襮 CRg AzhWC*@ę2mp2gn}VY/tJ$RGT9"w'/z#wjɋ ò1H#9"gȨև%Ox$c[$5wMkNQ: ^F"0VuM;&+w?}W, ?*C>%H*nmPҴwX89h֮6p γ~g?$8WJ3-a(p$;|VS;g|mRZUBha myoo+]="7w R?줶[?&4@k $h}8Xc9`O"MhsRVkz4Aн vJ]H͍=ܳ'j 4<<ڦ>SDTNq"`ҷZs6_H6*!3 m~]׽Wϕ>w|>("M 1][>_в14(h ?g߲(ŗ*GdP[&U bvNU-pB`/r\*h-q ~LKca罬&{2w΅q?TQ !@X?[˔פي}gd rw`u Je)im㺂R խLκzф;G'%CH?WwUf&p*Mnm.gvZpKpDd$ =9`2\Wj% A(UYQD)=8#$Myzy ۖ2&L GH*" 5\6i}=]_c@c9¥^"M*l;:"ҳP(iZtK}*%Ī=+yu%>TΙPfE3Q4|41z$Vn ı҂ݓMY_ō`}ǔc`g,@18<`dBVM6r@Zyl K3_:ȹ&uVmRs+yKrR\U*XC\܊)ѫ~lUj}mb+sEg#־nK&9}/*omXP2HVJC˔w\"ϰ'njR1zCn?mjfչU2H\=J׆vBn6RC%i_a'P!aB1$TK 1@+,f xUϲ%FD Tr51CL5f9$Ub@4*ewƮ6Qx` WЬ0p" S4"=ogd@ٗg׷=w- ;Uj~t;>M[XMu`q aB/)0џ[h:4w^O;ޣv`lyXZ (m @ˈk-/ȔwK\Î-s\JCğ]kOkZs,ZS*Z?5Hɥ!j1 TOHWF QrGl[Bmhji }dx/q[2q!u@v Qc/%[r>GKI QܚS}mGUq$xI2<Y| A` `][@-A! z*m)H`hU,qkmHh>$NHPK%UeP;`F(>n[t.i2p+Ԁ;J/}0= 5[Ox g*۰kok+B$b !p[Tűv뤅+,ݹZ) V@D8 EZ w.? 5-QS~-PG:>V\R"w+9g?k6ԭC}rJ ZkQiIX}ӗ+oҖ8) u,׬,ZsJ-AST J*ڗ"ڹ5NpO.%C΋vyǮU3ku4 Z}UξUu@89 Vw ={$ #4\S@%JhOjY,{g걁 ~\ F+1= ȱz;Ä46'.-.-TmR]e?gJҠ  J6M~$wA5C8*ʼi4[Qډ5nn?~?3' JI$! n[*ީ!#Bv̙)I,MUk=d%i4jH%t|޷m*QEZ>dFqY87xGG`e@9zS:)3S ퟉˘Z " i{귄Di0bZO sʒ6`^C45A5AF-Aխ~R*ZC@ RIT8Rs,`740gˮ)oiSTI[OB9<99-w MEϬ',c*ITp컚jkVWGs@?d4ZZ3ԺFp!33xJ %3qa6d-I#kHY[XuȢ- @Yj43 aXA'ڽZ-3J߯9kiJ蹺)`=9'ZɲXN͚3S$tGKP?4w,bnhP~5e'|kdkǸuJ`*w~m-Y[W v'\1W `D+,KY[D1(}wi$lDj+渾 )93k'AEMH L~ukcpH@J5b%Ty;@CLJc hؠWT 6kd) }Rm6Y=Զ"p%)_TZlSֽf;Bsa|uGxfv,mj$ǃ6?w12.Xnm?(f:ۭAՁQsmm;Zw҂} #5jHmgAΜdu<R-P\Mڒ M=3Zw j;q!1!P{vأ圌t+?a/f/ [ `fe-lLH=SؕO7{KB/0lO{?s o,Y[~uecc;j$C#T^:|K~65pdWI!%I+m&@#3jPRm`!S&LᵙT(g$%A(?jԊXk-S*CL=Hlz4h\jvQJef WQs[ǙHl- UwHWރ}S7Dw #fU~ym*{ށSCп\-2 \^BLBxm܁C;" g0T3oԦyz =;Yډ.Nz3@q=mZf<Br^-\Y:a׆N!,5E PmWuU lHi (ڟ@IRmv{~se@}>ggRZCks,䙲0B@Y;d( zt/15KH]{@D,- ѳ`݂%4~7*!>ڋ7WT]+]:ϥv`HWr|˛1kϴ{4r`)[dkhX{A}+nbD,d_XaZ-1Pӫ$08j\Vs\i]US ׷30W6zZQr=.Ճk Vc[ RXޫY ]L3.{7kzq@L+e[tW݀hīHZ&νӋbrlog > X2Gk ^gZTL|o*)c>օ U(zW=o8&/ FDӚ͑'e>m A6X=WK׸\V }g8bbOk Y@3 .e'pՃ'#afY4uGm&4@HfghC`@9C< 2u߼~!X9,Pp$*yJ ڐ5Ai_@؊Y|7܉k?;J>{U5Z2=\ rI0JҒm x;oXsΌXPFJ 6,i}{KY \{ ,GqUkTAZNֳHRJޖRϖn"~\7 TszW7`DP7n?k@jp+6 iHy~T8sޏGn&Ċ1AQ^<|.GXV}FEo>zGmp1F.ac6G꽫4S"(K:TSJR@qo!Fj M% O Y~ >P0jm Qx7߲z D^GC[,(m%o-v%EQi76P{3@| Hh?Jvcg|-zA\u-ӊ3>;NfM{+),کxkv iP"@^,0chT; `)Xg?.P 2/~(@],NU YK)uޛ wf7}y" Q,Ny vC D:⨩j (]-ˤijd@Nl=;39{`+Ghy%xƬEUHoK1%}x/vnAnu sKb%sҠ Z kgmc{cIlb=(S4Sr=~#I m!blfF+h v~ /qQ/ӫD hyȹEhQ^Eȃp3ŷeR6 kK$xkC-m#޳sL{g-ZBd-/] ڊup>:6@k(tɓu{ܟ%fdϽ-2T2Q:i|`HgX[iD)G߯Ҟޓcuj&ޕE EAɆypQ6l!0nki5?U[@$GoLI?Cx9*j ;F)qk<[<5>b29ɇAӷ =8d|4^XRKpOOC0 67jdjJJqPan0tj?@Ϩ=nঔ-E֧&\Iː嚊Eu@SYɝ6\{·'=/zc= KZg+כm%Hh4Mp7o_BuzK pϘyY`%kpLXcRؓf)*Q8cڄR< [[ؕ穢C0?pKܜ^L[=DښܟׄmG;1hliI ߔ}vK h0qk;CvKv~w*1,YɵSU5"Y5[HA7)\^&)q(^ۂƐa[CAٳ[aPnZhK?0AsX]ʖq}E{Z_׿ϩV1.޽Z,F2DRiKW0isH[ %!$"|ދaiEhsĸr &ۯiLb̔AzoX0}` @zuIpxJ&$â?6exkARa=j"`G*vWڽh h6**6lh 7pVHIZ@c`\gjN ՞vdUq?Սx׻ϵ W[ym6[[4z/guDpaS,cPCӠZ08{S#ZL![D ns_ Wk~;vNjp~] ]z)]vgC8 |mf$ D 8Q@{hB+W%C&G_l=go,}w'"hF6OA9}p:D'ʵshE]Cj@oQ #iz5 mh6ard)YuT!X^8 q^e6(`WZ 3Hп}Cs%-GA0e![L#@^=PeD0/D8tX.@@j6b>6Uu>;l@6?[@-7smfRCg,q)ӛ[!5;[1hGhUW:D$ZsȞNgк"`SmT8肦TWܭx\WSh"XMA܂3/@gɠzD^`%͸%[Բ@t(H Q@=3p@! {is\#^- V_|.< ȭ I@}?HE* ukyFaϭ\;El8k m-eZ;ҿkm|_WZt䨀/“D\2 ;0X -$qu{ R{%+hi<1+=!vOh `{Gttq/L7e I!C=ZPV6^$Xgz%) OgւB^?C'%tm 2+ᠶ|{KsgB0rW99xaMZmdDifjY<+<,baп}xWesܿs8(QpLqI JeGŪx>v=ϭS{0;o] :@|wZb)Z?neDݫIlei_eNq`mrrSi2Z-VmoN8?}gh:Ýտwiז.8o֎犫-\$cas˾07_nX l~cna_J$1:?̇XxeXjEPr5{R:hoy @RSgRzoz~7>$RҮqcsUvl 6i{͢#j3"?{E+5HѾR8&?[ >?aZ}tId<fODU6{m"V]!5g, k ]%ou>Mlz`+X{ў =ͅ븠d9z2dvm(O\\Ѵ&pMJf{Cgӆ1*%ik 읨 haUrI<>L([Uւn?Ko :eWZ~_úA!û- 9?Ҡ0@1R  R%x:-gW?9íe݆"gݢB[#ڠ"A.,WpƱI= OP!o}?hfw׳_xRvB^:Q c~ v.^YiĀq{7~s#P[$/iRcen+>sX QM@dW7€znaJ|(y2jKC*˨:˥1^2 lPc cP|~5{!kE64xD;? 0,OO{"4}de1Hf M"‹1 d<:=do3B'_OkвJM@Qh0F˛ ~q!x)8D,45rA(هH?kgNh(n/Y! ׭I.5UoX.PyQ xz?4}!P6^GX*`*<{Z=%o[SxqS@]׳ZP}"ϠTX⵷bCd(p(|ଓ2ХXODttm=8ZkA0 {w{8a~JYjQB]g#h94YZXODKh#:̞Y]m<;Qu t~qWXPVQ26= :޿wdӝ(^\:& AD$bv.*XWl-K!C0К3`uJG(Ж- Pv<l*bfCfvX-rtbǾijHP-! ޠ54/}'.sd,h>H'W^{R7q8#{": +xV=H\O_k7ρ432Y kBߡSf9!A!Q*٪( 91W @Z*<Բ5<'*Hg`4>Qcm&- hS&i ;l[?oko-´úl?,::ܡ.ţ2Z Riqix<'c%/q5a@xǺ#XǷ}dz/ .[ PfFvwk[?@JgogiŀMS`(dz|wyxRxF[G~hfu)V @ANa$T4/OҎd:J1Cn-j{WV%f--A Vmj-EVz6~u +n?kbo#vhBekXU"ڳ"-EZ"p:t=sn @lKաc3QobܰB@`(F&T o-P-p]UkHxc='Zdk.㠅tȂC@[Z(, L]Gw9i8PΊn1;UqOCAQn[Y f>[DDd -H;^>R]R;,gOsd͟wKКCuzw=Ն{7k7[[[ֺ3yƑ * #*!v~|Bhp@RCXՑml`;`>B!M8 F!ȶJ6B_{!l&BaAud[%B!دCm!Q?p: !l^G! `(8uPV Ck/#@ۄCr0l:l`C!vmB!96J`TGUB! `;6! #*!v~|Bhp@uxIENDB`teeworlds-0.6.2+dfsg/data/mapres/winter_mountains3.png0000644000175000017500000002205512140200333022034 0ustar felixfelixPNG  IHDR#IDATxy|'p9HmhVjѱEԌ=wL4Ch)Ee2jWժVmSbOBIfq"_~{{y}=B - K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// K// V>Z M&sd0UzPIP@-'`M %eLKȞ ֥sdOZSdOڤ;=Yk^쉹 X`w'ٲ?= ]Ip 0%8 c1]p|xwxu8:\:;S8i& '7ÿco[ 5H/& /ΜΙ( Z^}0KxGI|10- Z^}0dxLt 2@^+i8 UU ^^}Ypb{2ܟ=2pϰ ؄Â٫3yΞ/ph[Ԓ^oÑeyϗ4 ZhWxPJM9~^,%Bӛ40!a?A0Gzl&W h`ݒ3A` L>60nՙev`' `p޻eOpx7H^s8oLwڂ`yf2 `fN(Ni`My J/Y` v96>xb҃seC`j=<` `]x=Kֳ'Ƚ6T|v&vzx43YW WZϖMʾP[zoAa[ Lap:VҒ 5@f.^< />=TY^9`g8iY@5 k}O`he« ={f龿L^m9 k8qv AE[mݳ{ ;^1?x7J {p ax>o_JA#J88.<nY a1KJ߬*|gg' `f |vl~Se܅)]e79ϳ_)c!`+@}3#Nk` ƺ 'A1R}4|pM]v J/zf >^u|w1(dXb]|Z&Iv[`@37)ك,߅b:T_аa߰;krvxS2Gu^TƳ Rm}AÞ. o l๰--p0M~arl(wo6op~h /Z?@vCrdYx#XXƌe<9{D_>T K g?$Nih8NpGmuI/f 㜾`~9\BKۅ K{2~ݯqc}+@Xz3c0,> *4n6aikrb8"\~d0p6 y}-z(m ; EYd]7)8 88|FS1&o.'#콋/`q33)g]^Y860ϲ.sL.~B}\xltPYz/NChubKEK-SsՊ J `L|zmmO3\$-~xw_XXz\/‡R y;ۇo7Пh߰~޸XHzI ^a@<(M%n_m^o(fJ/]tAjj=Cp2nW.AOv~Yؤ\5 p4]˸DK/7E=l H ð>`ksD?]Bq5԰DŽ ^?4<!j̽ #ߕqvO} H/mݤGY ۉ.Z#ڲ9ʰe,POH/ڇ3l@f~.sraIxi i؉yEH/w^Æ?h`p`޻@Q)/]"H3e;,{u XVeν2~w3˸ ch F_[ p5s; Q؄熫A@ ėg8Z 6SL @{, +d6[ `[ f ,Y9~ )' B+ ).Ћ/;C-/ ۖs]5<5|->yrDlz0e9e'6<BwN +Wƍ1[(m79ЋSʸmso 7 nM}%fطJzjKq؜ G> 3oG6~`}.<$\Bzh g'*ws rxUlʧʸy` 6_ lܿ.cᮥB~6؝ėE/.? ~5cņ~ВC RL^etOm%׮n_S~nj $ѿž &tW4.p>Jg/)wP]?=vfчG+5y5 O([f6Nk>6\tYlJucjbxA +wv/@l)!0}YZ1tȖ}=&5I~)|30•_;çOo+!>u Lx^^'쩥~˲5{.)+ΫmrbŲzp"^ .SL8rK5ʾ\dbGx_ ރ ^SjR ' é-j mydv- Txma؋q,`8Ve M'a,n{}I>,s{/I`^cR_;r2`S`'TnUL6Xi!?^@&4kO%'˸_;70xs8}e_{`]L6h1*῅#xΣ]˸AKrͶв xKg^;7rs~g$>?\ld鶷!Û_ O  }/%V0/'VMh+N/Q 7˄*=0e>/N.ZL6؀%YE{'? 'U_:mWhB~RӐߩ,"g!òaCP [MUpp2nt7В v湉hװ2%B.~=0,e}1 g ەa) ]Lx\lk>z^@+&4}± tF]Cj?|S= ' /-m<~L8=mbXTO8S'ÑPeЂ be|ew@`Y5| \ 2,E+ 3m<%aIhmBSX́^No԰S˸tdZ~:<"6|)þv 4S@'ig|hXg/7p pbxx7M3В}a?/|m_d@zY&4/4бujG6j>cbэ%Dçw+ʾ-4, ܰɅSo{8.ؔ 7.&:Uo7qmqip t `Kx!$Iz pAEzK ϕq4жnd'}Yz4q gxNlO<kwd ˸Tdceg\K:5z^(MРn˞? o)<;`YL6=ڡac;q) ^*\y~&&6g61~ tjXwA@S;43_eܿHܠjp_@ϣo6>|Nd1X|)7G/5OC{ h_:Я! Pxw @ _-svMXǼkԵ`8{O޾7.u| h!s>cOPYl=mђwOm3P=J hAsЛe s,ˇ @b¯;^@3 4rr|g{Aplf 7'lkQnHe/aI/ r$=|n@-DŽ*K>xTnφ[ HxpZ6)IIƝkW6Aۯ_:s˸Kv}/K>2|O=@ܺKH/`o>/r[,wa} kkʖɥS G7@X'-<|3^eܗe{ _e<}kdMT~@^@`;|6ܽ,4^ɘzI#ι1y>)T|P GEykfYلcz'VM?3c{ \O yP:򋕆%jf4pýJ}R}lCYhIx/5epzlIz ?~6|@^^p%݉ Z~}s 'ܣ&ܘ_,ٍ ~ ˏP\7<\?Nj.Smn© 4,#\To0LlNZ: XvpZ ~p…K}hq30¥KA@z3')3m7)i85d_CXҗÝK!@z3& g5x,td`EWO7p͠? ,L?*@8,xdBP2[le>=^M0^X Nnz@K-6f ى5Кϕ񄹭] Pi ؑ0{ya!&{qiRv#Z#_;2Фpe!@}k )ӏ 4e}?< 'i/~M tؤʞh.S hu@n4d9!ZLq*+Z_* -xE? 0\g{uluËq2~}cC80hip|7v^ee!@+4p`OنM-L] o' B a0ap9YV7 j XW! cn pvxVا4lr?/npjMNl|7ܯ4ljx@d_xplb.4dPjI jOV|;ܽ$|PsDZGeçԚAZp岡4p` N \6,=?krVWҗR1XrG \4Xw˕J!R4p`~TN G7p`[_9bA0.] L_mvBiY 2v%|Izpz8 L˰w8 P8T PmK @`4;e`aOzeX 7c]XZ.775P< *{@4 / okP`k .@2R~$ xw:;<%5i 7^"t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@@t@`˥ԗ^P_z@}ԗ^P_z@}R^yBIENDB`teeworlds-0.6.2+dfsg/data/maps/0000755000175000017500000000000012140200333015303 5ustar felixfelixteeworlds-0.6.2+dfsg/data/maps/ctf1.map0000644000175000017500000001107012140200333016636 0ustar felixfelixDATA(\ 0    ,Ll4lL<` P);G:pl   6666600000 0 00u0((v0``v0dd<F2<F2 <F2 <F2 <F2 PD#'m%#''pD#'m%#''pxK/J,.OOIL)f+^xK/J,.Mc%x/+I+fNx+.c Wxcx?֗ ׹408 H π[pƆ@u!xŔ]HaNK֜(*A""˾"IPA 20Cݜ 4L>(BKtS MH̊&9 z缼7?O.q`vIWȸgWJ79{DƂP[%5ssnƅXnF^;K'e+[U`B鱮uBRtp%1!\+gl=M8\v#ڌ8uހU &ؚ qj.FOx'^tyNBEmcT,oJJ J^v "R,NB=F_ʋ/T;!M3p`EO‡UE6ˆOp1L [zG}G>buJ^8$QJX.gz F!H_B1D3&6W\5دJ|5%x%lddJc6B>ۼ-x,?k%Cl :̕L aY307 $'~xa # " z˟o 2aѢ@y& af b6V(`a`%HF+=xM a]/(8A$ll'_8SgBeYryv@.nkIMx5ȳ<<ߞse=ss7rsOX٭c6}|\\7η\{2j|\:>YOm⸮M{%3jE>\Rό5t uxNAZFز-q NHADV EX1ʰrBP@IBϟ|Hݓt\$I$IVqL`S:;GR9r~,b ˖QnW,yZ:2MKsx(Γ+tR$Ix)88󸀈}DƲ-y(织\".Სpȵ=$INIH=zA?+&XÅzVܻ^&e(G{3W!sq|ǚk]ćn/ؗh2LE;ޡM6/x b={_׼ѹz}^bXMX n j{ P}4N!? ǙтVFq-siHWЍ/I-|(_BT$I$̫px] On]w?A%kDBBM0^CZ3J|uQeHeDp&vZRѸe?/\qKoy(6c-T\^y}9J%YMf.٤iq fje9h r/zR3W.[v^T+.zdMp΂h\,S=H֓\`E"m_rIףbŨr}YRH*͍޿Yd\r^dq~pAHe3)Vo=O.B4M4mR$xN0 3biΚ\hHՁSB>u,n\>XzݱrsjPךo)|Oz B.Ly>YZ蹢1ZNc5p}-;RV ߐh`"_w0shpKfSEͥq8;i1IBM3]ǵY:W ׏%kRSZ^ǐ+(}[K޵Jw ]@x PEݹtػhjjN8TSNzlpx>8H 9 TMRm!(ꩼ"|4諁 DM3\-bVj6jk&;WuT'98I#PGjqq"r#TPE|J${teeworlds-0.6.2+dfsg/data/maps/ctf2.map0000644000175000017500000006203212140200333016643 0ustar felixfelixDATA d #Z   " ,Ll D|$\<t<`0t@ (?Sl+#m =?BSHKLW 0v0$0$0$0$0$0$ @0000 0o 0o0((o0%o0 o09''o0ddo0dd     w<U<U <U <U <U <UcDH8Ct>rh>)[B,U%- ,,X,rB9$, esuz%,-;oY+,Wr<2,?#t8,>xc x+/g7x+.I,*f.x++I-OOIL)f2;x++I-Mc x++I-/+I+fA$x++I-/+I+6bH_ x++I-/+I+6fHa xukr3 _!f'4kgd``b_ |bi<|0`AcC h8x[Ha3;ŵ0 c,2^ *А /х "(̤z.R*Ո(j$h{qw· ́;^p 6\`pG*Nd%-ۓji|[N]$XDtHW#?9 ۤ 4"%_EYۮXeE|*~j*TUQeϕ~.jĨ tb\ *u 6++БnMÉ*Rk𥉉.俔=YPpBF7N>BUO&W#Xv!l/׿}e돰S⬮?*=!XJ,vݠS=b1,]N".-9t_A rׄˬ5Q(R 'C'(n<% r 'Vb:I>}C2vq9`аN ϨWpI{"L'5( r瘟dۯcJNt rw '=rLFL'&V,uߋe$fa/!L<,c-z/^[{g2`r' [ٌu:3Pw}uT\t/4\K_t? ͋Wxӿ]0[dcAAmi a8`AcC ͪ@7]-@gZZ !.Px+z }> \ `ea}, J30P-30p,P> VA,x . ɓj{063g`q20o|.) H@44ox3?' 2 /x3_ [%30P~ Haf`Y| 491xŝwpU7-PB {BIzjB;6D,EĆ <xo{ϳ?%3gs͜fuV_/, _̯@t J;PoZjxVHt^@\C.vtawEҍsaEVu{5⹽U i\BxUA5G<}FU$k:-\hU=jxU k:!\ @:n|Ʒ1'x'UPW¯U4`6x]&?+@yU @tp5\(2"qU qr 2^&JF:7*xM!k:x.Wbfuj|VyҸ]Aii/4rdY[O-ʉUWԾjx*4pz8=ׂ=TQՂ=75l !wDj&^ lV4d͑NeS79W9}6nˑemй4YSD/62 tYҸUAy|UE"eEʒe콄sp}#%UCH?-=Tʞ*M b"q|]F>[,i`R"됉k{H~ֲ_kMߡsbFv?x`4YE&Z%h{nt>-v/w6>2V-J Z4pC۲-$mE_bcH\e*nŲ_ u98ؽ7"qPҞgL(EY%Eε&#qx ZA^x$i\P~>mm*}[ [22FT{Ѥ+`hz}quB%H S&.q}x/JFqr&#q[T%!}5.ukɢv]~YԮqǺّ?Wyb;f-wb+`bbH\FD}}E(w߭VqyLqsprq#q5y⤛?eьnJ}x(e9KwR, ?)]4+2q7ҁospd{&=} rgWnUҸaP~=< w*i\^uWY:+W5\Y8\4`4(n՗UU]1N/Ft?P+/sC*qM9h_qM ͣr%x]Ltp1(to'ҐW5oSI8S4pq$*cl}csa%:a>}k$] Ww%T&k:8\{4,cD%71"Lf|cUIX i\<}{W%sWe}s&V[#R'ʟqy_L%spLޛbl?^csp[H7#>XO5 >X4` gڵUcij6i\]plW7n]"q]@5DYώspt}2WW4PϠDҸ7Bq}G%CH?w~[O_x.YS`Ϻ"uuYկJB<%5.TF棺ꛏH+W{l^4p:;lk7}6'u9 ZYƳke]9xX\WM >)i\bPޑ) G#k:h_G@<5|.{:^jxҋ&5ʯ oEuxf]Ctp(TGzzd{<gs06^j_ioϯ4Msx}*"q=p8ޮMu98筑ϵquH עm\ok,P[-20"8[Olj{ǁk:uH6ԇ"q*׶u^9x_moDCTx:Dœ5/vL=:Osspry}o_-/e`r:쫭۫Iְߡsp }W;t }&Yj }ZִB-k59bM{95o$sB5o4$k:Ufs9 Dr(2y@8 ڛHt(4^~ɊnW\mHyt.G_jjDOjqM hVAmGt0 !pt;U <ݞ4f@\f>qZp{ҍsV{c۫h؁4.xvp@;UО4Ax;:UeώH+ױs7N>@qr 6^~"vUpIxR-yR[Ҹ@Olk7ۑm89^AoR>UƤ+`y(/7"}sӆ"U1WQǒHWIb[ioO$͟sYy }s#}pl$ddq2v&;{"9tagU4]؅4pyڽY}M׻5 s~[{[]콪sTWNaNv&k: W!cޤ+i\ߝ:MNꩵ7;5|^H&{;0ow!k:.4>QC<\'ҸA{ry.&jϮqM߇'vT1N'v"k:\h{`Cu$;QN1V먞wشZ'ҸcwԀG Hv8Ds}soN>;5 ޑG-NdGIOGz֣I2y_Xv$;:H>zg_U`n(H&߿Zf?Uٟ4Cp߼n-_"Ntux'S''k:x.OU1N5.0^{ 8]8NqrNJ/p?u`~(T?i\\%+R)ޏ4`\(.P_;Nm#qr'2^կW!秓5.߿:r#%k: {߽m=m4i"u5xJNSOTrҸB?w+MD^i\@~WkxjKtp/\N玃ivs0f7p>'ؿt~oOidosbq-+[V%k:x .w`ލ4uԻч4`(8[IJ#k: \NuoUiqMB埇.K0Mtp.(#i;Sɞ:oJNRS^d?;HGW?LbT.:z{횬^*l>:7i\#pk.J獣z*rn=Sɞ:)RW;z'sGoҸ&{i3t{/!]~"؏7t:i\Ơ<] .d}r6 }_2H2yv mw>.R2J  hҸmVϨcH +؏k7NMCqr#6^~1j94~,i\Sp1o![ǐ5, =J FeD<ç$k:x.Ts˧Gx˧G5 W3{HUdEt8\N玺$GsH}Nsݽm<A8+?w}dx>24`(cy*,=4psGbp5 $f k:\(.Axč$k:\(Pjpƌ k:x\Ͻ2^J9fH] cw?w9G1:ԮFsp0=|@ /jAaP{r*v1&ˮ?}3̲spu(؏id'39~?fp &3~9;Xd_`{n_9؞ CGST]!qM? :s]"u9X'Kl}סAE28`2Ӯbr~?{g{!y9Xvȹ6؏j!ti\P~۟sG`b\ v\Dr?;'죃}C OM$k:w˗&ȫ˗&5\  NTWs'5 Su0NOt:(4^~uWcm}8rDDo q" Ɠ5<}C獵Ƒc9X|>:7UϼKtp(4rgwU~<9E&}Cq:{9yƊ`؏Ծ؏5~,7yҸ_ mٍ֟n3_xx:.^Ht2\hWɈ HƂB㵡Tٟ?4` P `Ю 8\h9B]*.$k:|оnTeij|ҸoÅqo9yxٽ@C<^Ht!(7T< ^|ҸBy;._msٶ:s;ވesIB?wԼ:GUB^ռ:4RP }C͛ #k:;\N[̱[%s\}No®6 搳m<9bq玌ē<Ҹ@?#Z#k:2\(.ܱell24YP\~Н->ΖsIʯ#q=`xk047TVh&9S`"u573Ccf39xb>:7t,.(8eEYb7YrlҸe@}f=o,r=o8f;}Crgz+w&9S`xH] w;6KuA<&k:8GoSY^S,{/|7bxrZ$k:\hsZ 39nYL{r5S< m]6n"Pohꢩ;h9~KS9~#7MGnNNADscqi<9M^?"SF k:x .y(u4.NNst_^<ծUFNsbr~P+rcrȕ:[3`ZxvXMt \h~^˵̵'~rVՈܮҸx=9'?̱ `\ߏmJlCsJu(؏/ߡ>\fCberl\n+D~̯\nύ_\nύ!+Б+X+I?MZaţI+v]t>Bl}סۖu12.:,1߮Ҟg߮CY+Eε~̋WqMBcWIW/_~̭]^mmty|U&j/#k:8o\e-leR[o/7/ϛۗK]&$GRwY<{>sV9~jDsn(rN 5A7ǣ65.4{ޏ?.dǝ'7?C}9Il}߇bmu>FrAE}/o"Po(ҸoCu5ra\.Btp1(W0zx~zi\@\ws(Ҹaxjx!k:x ._;ߜPxNL!Ҹ˿e.c2v"k:/UBiտ0i\p>ZHBQ4@\ө͍Smt˿EayٍY¤qMCpy llv#C¤qM/+=kfl8|43{DKn נo5 }~84z{sh ҸBqi_vuw`"y|=Vzy7H >?`vNt#<3fi\ɯ^6U7V½mFt(tH\hj ݑHt0YGZ@Uy.i\@\fnkq67_'lFQ1+5<xGm1'z!k:\`53k5<qj"j֚qMBu_TU-Et~P:U*2>U3i\&  m M"k:L]fP$[0N&k: cN=֞4p{}[N8iOt (_yoke ;mCt(t/wл_|_i\p4WوqMq@$vPKcm;5T[ 5ڑ5 ̻ɯmUi|25 .=4W k: ŵrt$zqBz5L??o5X"k:33gB k:8]~}Mx/2s0ߝǽSW{_Nt(_l( Mt;ޙC/gaqM \? ?Ot(__gw)=-mFuCC-mƐ5|4)Ʃ>qMO_WdpU2~{D`\MS^74`apʼnjPH.ɯ/Pρ I> +>>7A}0!~6o"i\㲾SU~Z(4Ҹ?_OVb'+'k:x\ {Gt{ǐ5\ 嗿>9V C<}w#k:X+>'OVWSH 嗿>.2G C5.Wp}H!ԩqM? 4ua`(I?i-XMt(ncVy*Hn :TN}v(\N.i\pVm \Gt ;Z4py CVnVVLt:\(}csvMqMs@vnRݱ0ބ|w4N_S1Nq{ד5l Oq-Ml(xF2i\)2~]ݲzlYߕ4`P(CTPxdҸȼ+tÖ*tҍ4`yP .3^W6Eƫ)+p5Lu]b'5\ ]ލK]TBb5+_9#q-knn/]EˌWlâRd[Sĥ~ i\pyϵxϝqI>+eA}Ȭу4p:ql׷}1K ߼84P~5>^=¾^=aќFc۲P ҸBo⯏>n`i\TPhjj6j~qMw);z/Sv5aЁ]A@.jPp}L=@ G$k:x.;5xf nI._|nwXqM3@w+}<5S݁xtLt-PPanu?fsab_K?zK?4`]߫חpW/'k: Y+TqY+I^~2{rҸEwCE5\?,"y|ej(Ҹ o-Q0N/4`WPh]Yo:pI qM? ˝櫢CY@t7w%GU %4lP?w9qXseqM_?w¸07*ҸW?#n&k:X+xh{zeA(UqMu /RI^LtpSsGϗcC᚟/4:C[ w Z'µF k:x.a*nz>i\P.U2Ce5#jj=#KtG'_nիz i\_?w/9xAj#Q<0YƋ2!W( y[*m#tGI.~F莒\%poqo;Jr6Bw½ǽm(Ʌ{ۏ{Q $M~ $o$3;J2F2$o$3;J2F2$o$3;J2F2$o$3;J2>2$#3;J2>2$#3;J2>24S#3;Rݑ&Խ5Aw #uoM{kH[tGޚ;Rݑ&Խ5Aw #uoM{kH[tGkux9lAB @ I\IJN 4i&-gs}$N @Ddl$73I"[w^}dR(O|S+?k]u0ך|qtlk_:>g^\\{~* =P\,}~ %խ(օ I~.Ij X obf&fabf&fabf&fbfYzC`U *zV]١*~۫S[FDy{7: b5C--Oo+̏Y7<=CpGQr{&1e\P&)eZQf ;Oc,{E?}]i+gb7HGspH!i si TkLJ;,UjeU9:v\C(W7)[l㗔6GU)sޮ!IBXk[Ǻϊz޾ &7, o!rĠ6KλzzolxWTeo@.hDBڀ p p5.=]nb& n]!2gNyO'ٙw03gDDDDDDDDDDDDDDDDDDDDGqŸLD1N;O3<"}O?ЏtK=H4d J;h'FnLЯ1(""d=HNOX!hOI4Tf8d!ԃzG;9"/6G#(gFKKil9\_<q4&Ρs [DD4zwݴP+- }"wݬ56DuҶ'.>qH-:[SoFtzV/șSY """UpCV!iDJܷS>û?d}!Q$3\veP.:dQRuSiu>]d)F.펢?ΤBnt uDuoยn!wH'+sSo_zɔ>ޝ9Fz4Y"2u6hBCLZ&""""""""(?O^Sѕ~ƾ0[K٫~~tydHy|gCЅ V:o i;O~ ]w2<sFH!|H%e?FFhO"!sHi?V?ϵz5]Cut*=V(m5OyACn;Nפiմ=<s}qz"yzR3,=ɹ|xQpWYy﷚<|-za{:I%nwǎzQezﯖ9ylɗ}zo >c~|?/z ɉF!DrbB$'D&=zOٟ+K ]$\YfEuN$kzX qk<8֢ @]ޏK.Ϯ ?%'u_T]r|Fr\.ͻƆ9/q`u__GUWϗkfWy+\&$LSh*Mqo9)1~*F;/?f.kV}|X@ i[%ۭbt7Xk͍14o.iX-e崂Vr}L^C s~yë1ӄ24fҬn;z08XGYgh#m?{+m1\oFUc6͡q %"""""""""""~h@xn@ Tn <xwF$קE6H)} """"""""".+]3[K7'y+K!oy79o?3f]3yOțwFﺑ]y";Gl;*;Ks#޻Al;*;{G{YK}z<~9״}g-iyyg} דԧ>݃a:w#o9~5os9h%o#{?_W^߹#sz9x \o2`{١^Xe(C}ʀE :3hsfwya,h̀uk h;v.睈5swu,9^Ee V/p.Kz>|Fan8%(yYb}Έτ_KbPB qDoc"uۘHG6&RAqt#!T|DH[ySv~e77MA 涍k\̯z.nu.bߦ˹oyƷ\j˒o G73ۀ 6 2p|33|=#ٷb|s,[r?7˘#߆Ao1ط)6.yž}/oo|9[{Ȼ;TMcTyKȡ5whD<OS8-h{|xo- ߄B%w|ӳUo;&c ZxDE&/rzH䱊6 z1a-)18ryR|KD=A@G*k|}k X~.[r'r-~b;ܷoɝo*_r];ɉwt|||||||^|e|}=0!tͺb<s )o75KtEY:kSvؿ}܃&Kbݤ|3Aշ[ 5?n\O /c?ȷ\}cqz꽀 {\l8"^G)6=ހylٸss4۱K^.<_S|D]ۛƽ6Ϣ(GuP=D})iмkS Nngg' oӡ+h;8o~?bI~㾝\OW5з-=hC-F\ ][!ozT绘g'I\ŷv&oj_ה#M$w| t9݅96BlSbv|ӵ4Ķ~a@ͲY_ۜ0oO"yc|~ 匉Yt_]w^s|}+a}ieڏ]ƯKbǂg!ǖsӍu:B^xq:[LTuZ w MJP8k3e=mݷE"46BR|3W!*vO q<2㾤Q~ 8IU:t7ftpE5?YLyh95s&ļ(~빬}׶&MsTx$y̕v9S)|ɁMctu؎dK0?51Kmߛ6 ە>aL 5gljz.rSkOAqN#s Tc5=Shl=ɩC<]/8>c0 ) ԷYmIGm(:Bn3(| b_[L!l4V}1q`L6:'L\};&e*u9%tQt&hb9oShGZ*j|kL+ˈ37;mm%ۙ⼪y$kcY1|B"bȏ7 ׷>r' n\6qr%3/_"B7?AB>c] nXy똺5r=rr#MMA1"V<O=vEA\+!;[Vm JmPǝ*G#?m[%ߒUnfJX9 m=!mAohƯñ":Ԛ !$ %AoH- zCjocލ[nޒw6-iIҽfuޗӟ}CX>dQsGӝ墜U/u>z<Ʋ|)WܔKrSUR.OMiGeR{Kސ[ޒ7!$ %AoH- zCjoIR{Kސ[ޒ7!$ YzPNteeworlds-0.6.2+dfsg/data/maps/ctf3.map0000644000175000017500000001341712140200333016647 0ustar felixfelixDATAX[   ,LlT4l$Hl\(+D^k$ssM  0lalalalalala0000Eagle0 `0 00 `0 ]]V0dd <+ <+ <+ <+ <+ <+(D#'m%#''p,5,5,,,!,{,',( ,4_,>,?,yN,N,L_xKI-N-*OOIL)f1xKI-N-*McxKI-N-*/+I+f?xKI-N-*/+I+6bGxc x^ssI2hn bvD9qX @οK?X4w@ ?at>LDA4W,Ƃ TwR*x;3IMl`,g33x22g` HF'x j }?+;B!S?nb`X |4 q,x+/o0`1m1xgO0x`d FOV ^_H `> i!9Ex[V3ym 7IAA ëMl @T>?`4PxN0~P W qVqGX8kNJgO6ɮU&'tY})|8&_8T4RCŃC %Cs*Hr X}hC,)8RB2/+;b8t>C̋?8Ǻ7;jyJ}&,ZeP4:Trꛟ =7ruw<Mj~"5]?.CZglX0ׇ[3w5QLs$gm\b:Rrȼ;k(1rC[Ցƚs/fՇrtwMP^$ҌOp(?wʏ)>!¡aCٙv6u.s\5 ej?8CRp4!C8$pH xO.ak \i-6VXIX`I,\pjRyOݴ5yI-يG;@.6||n!T)zAuP5zPS GtTbRPEA18C?tD-_JPSL*.?Ϩ5mZ3l4ͷx]c!Z-i%Z֢-tG_L;$"OxM@9 (|Xr,(-JF*NHYY^y-/1ز1]Pl-D3unuхTWZݨUlՋzUo]m>՗V?5Ɩt ?'clC*5ԩTw`TCjNݫNNkGw Vk0fy2dBV!dBVQkhK ]V+Ǫg~5s[C;!|֤C-Ժ1"x{5#P͓U-Ϩj& 6sSϭ!@^pI+&V}/wBExkn@ J[ꩪVXڻ34?P| ﺮ/~ѹ'RXini|[qU13V ݗ!3dd`!xd9^;J })ۊ!:bh9ړj C%Mi\]ƏާrC0dln0 ̷Ж,|u&iwJbm_e1$"`n_ܐ18Xc$ľ>, Pϳ`M 24֓?CG 1C3˛ELՀMnCP0dәR xJ| e){ũ_fg<w|WX!gTal3EP0߽Ų? /׵Cs3C1d3(C/y77L,JfC8`(ZlPxcLѹx2:+VsdtVFXœY'b5:OFgjt.hC=xM 0ںKy~cAjӔ`.-jR:uj6}Gt@6:'[o2,}i߿Kg%Xhmy]}Ryo_s0C2{3?j;,^O WxMs0v4k)LR8B;oײdʶ$'0livWN,IIM哌 fm:5d5stcbh\O?5\$"0ea~L u\ b ׿x=͖i;CKPyRܘ?w! [_ `ȗ$SC=2ׁeߎȎ!ʹO u6l k0Cs71d5XC=S&7B/;ӕ!TIU"$4CP^y+]/كV q| j5r}vL~Cyy/;m@45m$9*sa0/'y͢C10Οˀ4p'Fg9s\lkah?d{5Dk=wcs\t_s.g ʥ \HWNB>z4}W<qkj+*ok]T9C؏.8Κg34w`-~/g \1T?vrncTHhˉܼV9"ĕ13d{yoؽ!ǽK9ӑ20!3u>4ώ!Z'(e0Â1@_瞓yड़^I=CP#CjMsr1ԟ, #0}/i|˳܃ڷ5.>C/߆k8LB> }*0o϶v/ q^?8(f|2abbShc!0M~o"s_&S,~3l>nc(;tIxzkai(t,*Wg85R]h'Me֑'j=pĐL7Qk;[k˚!zC ދ!|Կb̩T jME9o<1D=EEVH͇*sy`H/b0jv|lU;>+=2DMsG}S]( on)gu:Kk3\;l5x[m733v_9*![^|-d0d5̙mO2T<5#0q5pamZ+_z#{cz t'cQd/qoLmY+qu7̞ƹuwx,eve|f>?%~Noq="rKA?k|رwm; 4[Ϳជ;ךϋj7ogu;Şs8ٷo 8ͅƮemKፆz;nW{k դc>;nׁe^h_1n5U}e6~ ;n[8&ЭXz:M3Tg&;':]NǿơC[MGTg=4Gՙ{Ti3:UgQu9ܣLsTGՙ:s3QuUg=4Gՙ{Ti3:UgQu9ܣLsTGՙ:s3QuUg=4Gՙ{Ti3:UgQu9ܣLsTGՙ:s3QuUg=4Gՙ{Ti3:UgQu9ܣLsTGՙ:s3QuUg=4Gՙ{Ti3:UgQu9ܣLsTC?DaD!2x܇oIq! DHDHAp)BG@ $wzk{GI{gwdTJ˪*QiUyp]%hUyp]%hUyp]%hUyp]%hUypAJQa{ýjL,35% ,%3!^G s*WʹwY!ԐjTk-ʂ %]%hUyp]%hUyp]%hUyp]%hUyp]%hL[̟zG 7aJFtND5c11 AeMgg#rgr3|!9L?iYy\Ł1QfWkܚ<7.K^<Jq[vlNSP~k[ַcb EXCl'ׇG)z|>|~a>^8xri7p}ْLool&~bh~i4c\w=>{xRa>N jom˴a8؇Cw蟻fL2Ԯ4foroƥfxy<ÌL帾sYagymI\cb$#wcj*jݧ9n2__JG7>-R+s ~B3],-9f&#mB_U~ӁNօǾ?aI6f׵]bzGE[щ<3݃^1}!/Ωv{ѓcZr܂~sJ9O!/s7d͕<^}1t\sD GІ:t,qy͂S/cމV3xbܡLylcAΊvŌ=}.Q:ZJ} JzM~1}GUpoNxQ*_Iϴחx7_p}}~w4ӑݡ?>5}K>}tQ4qF4h#k?M?I3]?‚ 8> HFx PEѿ3K3K3 ЋW䋜-w\5j#=kZ:ziXo >2J4I4KH˴YMmڥ}:c:sAx|xQr0p'hP b+YV~3L#Y֋Ruc!?z0X8]| k=M?ߊӐR6Jp:V ߔ sqܭ:tfVFa-!9瞆o~6J94]Z|lg>6|k45m[y6_}z=GE\UilϬ|XRc롹u)=HmveݗVz]t]^v.S+,%լYLTAf~ZruD/ e_ǾԺ-=5Ol(領ΚnnϕjVX=(qڤ2s?=2?B8]\m>sъ܃}I4j4}3*g?`{.qZT=|]M'Z#7bz`;굯7LyĉXNof9><9{坿w;9TpL%=OR[`V3Hl"_{.I!Ӷ 3)ND+h1\.is.Z/; 4txIg]틑6nz>i6{89tپi8=6瑳L]_Xz 4#}>#xo@ǯ!bT$Hт*0$xeCMKݖ3[ {#6b=bOk#wN$cegGB!D 3t0֌m)V<5?Uu' i$<O3m(pބt!BRNBmxm(@YLmz;^[t!Jl[8VsB):.+y̆sW s֋_]fO*, VZrn,^3%Y k*:?MN|O"fu׸*%`{#ҜI&55p2'PG,c+7 k"{y4u,<ǐď/Wg}<{˕;}pF~>OӽbDwRT,SCbjQ'ĉmg^GOB!BH\,-L#e= R)BŋbLY9fe_B|#d%q?;bM;%:C!B!$o/AOxn0 tK6'ix'Ε/A˶5Sb}25\y893Q|zZ4C1-|K OX`>,jT$3)Cg(źy}Y `qVY9{Yfu1-8+|sm6[Kb77Yfw[> ,=Ί=dy`+ikr5;18+|s rlbIf'x'eٳN?w^.i Kb+SE6dQXՙyD3 09i3;׏R`gxy%erƄky.<|zMكcQCcꬒ]pdSwOC+2ǂ@{ciOC=1IӖs2dZ v8z=̴A ] c5\>t)Ӟ$,occH`~Qchxt+& G-ˁB sdD{QRL{F8F2+9<_LW_ F̴^COnBIڰd:#"^x["Ӈy#RCE-Jfm>&)(δڿAk6L5w֍Ї֜r)qF=}mt0 q&&4mi`24~{DƇ^1?ȂPn1lryuQ?ʹ0e^Lj#z\+_陾lL?f֌.R&1MYNF$IC wKN9gR~]b> gI0a a9΂9Uv{2MGDqS {e0{@ J_DpbF6SV1[ߟ΁yH,nQ%1gc}hߛfA/eD|=&zf 70̨pרa+sܕ|JLY ]*1-ߧ,+Mb(;Lo?f9t>ߘ63+.yZ{kV,e;Y/3~4;wt1'Qw$zGb:k$}53_l_V3jyPl+ǡDEm]=Wr$.mfm7={H5LW|g6YVb$fDڀiS{ zfω/>"?#Iq)ӖD^76cO!~0%7_HY:4-qjO `Z$LaxF=>&0-%J:kXW 0 0۱LJ.-ӗ}ܷ"~:v- ~1Nn"ׇk4z1*r>eYeNu5`EdDӎ|/Tv^2EubZd^cwcJ7">Ƃ/z1¾f\qio7ago cv-Ic]zbv^(2] ox̴hN3˧~>*LG^"ߴ71|B1eLoti->w(żDzzǿ0jS1akW+L{ɏV d'9E^6}<)'o(qXEdXSP[fmjp[`z? YU4APܲU'CVN ceVdzcoE?jӐc:c|_ifu!"SgLO ޒ] nj1퇁cLˌuJcbSds^z4/lxmaہ0 )K5>@cݾB&EQy۾+4't-Le9CTKv%J{sOALc$Kk$붩>m3h`~ ޝA, C|  ˻yaR&4n%{>=u# Ȕ[w?-sU]#yB!i Te5,vyiL,EoE?i _d}H 1=LrRRchSI2 i{¨x6޿|T]s=^Euv6E[sL Eiƴv{k0 3rZ44'--eZfLLE(ܣKI<8 +eK.6ok]0Mޏ%ZޫfZ-1=P {L n̳!;\dZXfڧ=S׶ GL %pO7O#\vLukncy#JSdLE3R-fzz}'g6i_517l;|~cu`<Xh [ɉi;(އ_"뱼N9)ӍPImꢏf+mL?>jnjt훪igxܱ 07tQw oJf$h8~! IӲqnYM-Wm4o3tvs`4ki@kk.~M%1=teeworlds-0.6.2+dfsg/data/maps/ctf5.map0000644000175000017500000002751412140200333016654 0ustar felixfelixDATAc30?`t i_V "-B~Oow92dfL|𲇏uJaJ!O&`_Wz E'WmΊh;wV0 xûtwW{C;Yi߫//5c5A+J`.Goexi>AbC3 Yo81/|: 9@44?v0tlᦻ˨3piggeX" 6kx6gvALW{n ztU (pƆ@y , ۅ4^X 1]&MwwQe8ϰq>' ZCK׬TM, 4 '5bIwwYK:2w10$yita0DgTz1\֢x10LdgAc x|B4cK3Lq;q`_R. 3md.tgxN@@!?XGqǞFP<ǁr?<%@ ?K_ znArylyC=xn9۟zEƟd=ȎP`7X {myW!3,>T/Cg=Ѓ6s{/s9&Rky+S>7dyv9P^z`P=)D 翹dn}sO>L^z!K={#S ;7|aNJmArv,bޛyX Ѓyh}3"  LAEAg5,?PQ`=hpG.$]t:p =o]Awv_ZomW[ `ԉ>c="Ioq/Rb|FcnB5{W$ nPdzpngv=ЃLҬ!nzH.J.jDTSz' g)׃Y^:kr9A~ف W#z?[?c`ڄzP{y>0Az*BD.^=`REkzGzhd$xYuVMܠh+ JU1*ZܪBhʢFڲƅ^T^BipvPznc29=g?3yOf8'g:f}ߪ)fhgnenenen֥6`=c]43Ձ:4v礹ۆ^3::ȶN-Ӻݩo4:zBU|xۯhNjmz5(ܙJwߥeCNw;wU8ǠHW҆訍fN5kZwgA:qc>u=7p:}swLmYmɌI\\cnLԇUܔӪ73 lbgn,̸Sn\g}%ge#Kz2Sۋ\z})/Bd^^ޟ>j@޷r~>ƢC)>o1X:k}qk7 c|,E0V#ǂ@f^W椹c욏{b͟lx흍r8 ?Tzӧs/veNز@p[mۨxC $(`2 0bnMa 0ˆA`87TnLx87spo 87N`Xhs$.`2?O!qqo #F Á)S17 0bnMa 0ˆA`87rX =#׋u-^c>87r<~v :>u?/YKaK5J \}U(MA>87bú>>,HCV!}po KvϺ>MV6 aqoʡ)aOʧ)aOʧ)aOj7ރp PKn-hD{f07biuhw')2Sgn}_ݐZˍ_8X#,ԎȍB9FH}gϯm%qJ%F4ǧLOy Ik07䥙'7 yȍ91;s43vi)rosSnU#6zFzܗ#Sp:OȍchF^N7 c9J  3vS[<3_OR۞ZqWHOEՒRUܐBj-AջvPC|=r%Y x)o>{~> !&bZZc+>7tlrccnF~օʆs#Z)@אR>rc$#3̉m]%7r+|="GjR>R ΍wɆSy(?誹&ˍcv :rǛx]U<鿿?xq҄88D=Un}zo^ (O.]#4F,9Ξ\c(=2t 0zX()͵iui4ԁFcn@L6Hҹ0}۶#FZiH--m 'q &$ܰX?̍~5X\mq"7 뛹Z17j Jܐ~=enro07*c~=]57}Un8t07Z`n(Tg`cr}cn!0̍BEW{]A*{OY{]W5xOWO%/37cȍB@p{kͺƙH'7rJKƁャFJrʴyixs@qqJ^=&mN$0~񻀇LӞxn;Sº󐧔uoɤK)kagp=m]a39rfLeͿv2g.i ]g;ďܽ a!Oc4cwOkBdd6čqXб5n)y=7+m;ȍ 7̲΍˸fR7rn\BT À%@q鳇r%L=k)sKr pkq#'8b߼)?'b>s{^=ns n7r5M)`:!9)ɍɾ(ș۠HM$7(cAAn .}ܨl7ֽ&7.՞س^>s.~+K#>)uY.KP>QV[F*7M9A-sc[J n.zɀx7| F~cGܸ6E2N{f,FKq#Ēċ7ta(R$F8ȵ?w3ָ!6dq'ܸoai3|ه$AR;ᆅ>&kX!gC(t6IPpcɲN-1)nX`)c(sI1$U1ntY穽rcbǷy;% o QcֹqU3n>6Y֚&#nߕkHt:Sܠ#n$F18F1ޓ )>Q˻D?C{b Ay볞u=[4{WxͩUE.7G q|-{kp_9kg|@l\8u>YqABsnb|範wȲBy"fߤpRgy -yWVߋ7=J~?~1(k9EH r׍\Y>r47{$}}W{ 'Bq]yv"o}Ds0yU[xkדU+? yS43IܗO򔗰5i][F{mG K+rzZ͙JW1-S7bb 7Dlg<3ڲgnhhp+gp,( / nT ~72T\ܘΏy]TMwh>ݼ, <"ᙳWrJUk unݗXE4.%dWHrc{gHluU 'u~ipajʍ|rZ5k>b{8,;ٿ{TI<'h .mޗHrCK*7jӟ,p#u>(Tn\| 5PA=2R༟oy ?H9aR# n\u_kҸgF싍Dnp! X|پ䍍BZ'k~ܘ~K7.2js#;4/u 73, nYK#ܘ?{zBFkeYkVs&R87;T!~q푻.Zc/?DKen̿Wɍz=pK3\_1nP!B]ϻ [-p>%1 7ԧ$C;d|h0\PSp}C}J2>coOIƇv )Ўa>%1 SR>% SR>% SR>% SR>% SR>% SR>% SR>% 밠TmIvrTmIvrTmIvrTmIvrTmIvrTmIvrTmIvrTmIvrTm?}jxˎ$3d#,h07 sYu 70-k׽m`m?Ύ̊8q">Ee]"*8U]= lE]&G]HeDnRQ0`TF.`!sXHeDnRQ0`TF.`!sXHeDnRQ0`TF.`!sXHeDnRQ0`TF.`!sXHeDHc.!F[. Mʈ95\Bvduc5kL()^6x%\׽ǞMgnl;4/ɾկ:q׍+\=nlAݰqKꅫ n:muc:;ݶ#nuj|I㟇 upp}m1]gnL_G'zۨg_W3K/ʱnpQ(L؅ܾM}2`Nfr6YDl^]8 g`Nfr} ևd6Zu|_t|Df^T 9ɾ`3ݜw5$.جfN~F)axf~Ij?:S cnZG]>)ٷgȧm~v N?S"Ս}P5?]/H[7bS? 2Ս7g?{ a>>5$Z>#/Y7HV{\o3fDk[\{dD㿯Whm1oBdprWdž~pk|h8Nƾ8#5#}ufn^4[kLfEK%N7^4[kLfEns4W|n^r[ܦq]ߘ͊oܥwn&oU~*%)ܬQKN__쿆8Q7:s%7/9}%;j~_F9j߰V9p;1zZkH5ԍ߰[sχF_Rah8uei!]7޻s(G/7ܚõϓq]|oN>AdcaMzNoP]x}s5^ya5S.>_w׷W%,q~V1g8xߘjߜnAľ>RO_t[8ܼ(sϨ69t HN^}.(絆Ikj9ܼ(絆267+9291~~Cnfr6 739}Ap3ܾ]܌>H͋D_P<ԼHXb> ru,1NK}I!(On9}:ۖjm,=CP ruK,Ka=ݗT, q:.GK_P JۙJs/(d eκXM.DLr1M/s_!GH[F_gOߣƥ>汜yT+_yp/9YK-j@jßvQqm>Kyf d_y[~AQ̘pv1@cmy }T7G~7f\Yc>;p@=0ós4Ϟ_~euÝ :#+:fx׫kEOX77?2^'ߠy&ϋ.',Rn KN^v !ɼT;;SfN}A Ћd^J 5T^j`5"Rz !X8FHԾ^CHUy)/qՊcDN^j mKju|:5GN6j wnbIyD@]rsUc_ҠFuJ׊}Grߠ5sz.@7Iͱm= o|k#1}fBp0 q6AXŴ}u?MP7V-ƪu덹o̺يaP7``}Hfu~a:F6u"mD* uyѝbԍGq̵ön0C0I0Q 0Z0b0j0m0o0u0z0|0~0 0 0!0"0#0$0%00$[ 0HFF$^ 0SS$^ 0|P]]$^ 0J'aa0dd< d< <6T<i  <'; <'K <'K<'K <'K <'A <'K <'K <'K<'KD#'m%#''pd6y!ٓO?n ,>,b;WI,Nl$C,~"B7Tm|,w]P,ބ,hBC,Us, DH&_,X*~,R"m,3#s%3D#'r#'q #' V)#' !<#'Du%"Fo f# 2pqH&O6*H&;N,sN,#/,6D /#KD Sb43$[ .e&+7* @/) o d[ ӧ%.*"ֽ8{_&@** !;`p)"%,mկ9+7"H'lO].  XE[^"G1,lD7\@NA#QIU v3h]Z=! ^w,%}* N] NVl) n9X58S#^e%DFP4u֦8 m(P # ~hP shD#'m%#''pD#'m%#''pxK/J,.Mc%x*KIOJLN//KaFx*KIOIM,(I-fFZ x*KIOOIL)f1Ox*KIMc x*KILI//Ka?mx*KI/NLI-fOxc8ÍoLy4@ `H]b π? w HFl#xk_3CC6n Ci\ q bRwQkd(.Y%v:noZU=d4Dࠟa3BǗ= kyrӝKm9c=wY GbLygSIDm3mxgXŌs /8]\OyOϑS\J5<7~siz|>wC5͝W݃q'OxG5J3cc Gm{l[@6ݰcCABu1KEOx,6X©=r=-ȶsրn Dn߷܏yV1Ë쟮gbE}1tk rk{Q˲ y9KK< gzSs"v|аdq;ޮ~zi=S^oDE^GYCjbg{?\lϠe7}U#k@.q1^tNܮh߮_`kL]/zo4Y5PöbwOǮu۬P#E_C:˾ז1N-MN>P#E_C>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJdϞz>(볧|)JC>{LJb"a@tQww(x݇seMb b 3 3 3j QS@ QS}I籛{ww~g!{}~^!TAUER_},5wY(T*e"RUHT-#*Uuzԁ*"u H* Rm~_S&zcb^6gGU!@;ȧ(ɢr ̩?qe=4D b@&i* Iǡn ªH|7N2';7mv݆-n/?;>¶5~v ̭=e|xjML- ^z2^Q+)|,_M-+gm |_]+O;ni[mȵ<2v}wn[ /@uV}~7/9*\yhv[]9sY1-qyb\o>k9Wk~eYH.N^0s(\y˘Jw4%ߧVMr-阖h/8ySY?i9-\Y{ۼ?igZ1-q1>Dgiwmc[ɹ5d 8{z[ VoqǝQ빲<{?Z1-q1Ì4Z&oVjM5y]g^Lqg<>w`m6N㔇9? $גiYyb|NǤ!gQ|4^Ʈ=e&`pٓMk#X6r;p!~clgur-kOrp=& =upӶǸQ`J>4%}cl W.&´L("3@PdLs{SD^bncz3qov 3Z0k؟Q2m Xf1ݝǂ/23df1Οs0|dOssyd<0Cڞ^ .&N8eR\[wy+4e5<=IV.a1m,10:N9^P%њ@br0fbL2^ʵ͞2-YLV\\u[iAʼ  }ܐk+-~+S׃uבk}ܐk&׿ I׃V:rM roLwEp~kn\Ϲ1LKW5>.ȩկy3i߯8ӽVk}\1WV0yč[*jVk}\g>Um/ύ[+LhM`}\ϵq `:6`i|o1\KhM`}\4>Xb-c/gxVXf/aqHk fƕ9Ffɲ9< ̵ly<ْr-q\{.SњȢ &1ᱛ&Ϧ0 ;6@dQgm7sdF1V`Op\9WT!-hM 0dUݬֺ?72p=||>Gk jIA\`ZLM|uT|+xZLK|u.T|+xZLK|u.T|+zZKK|u.T|ޯNd&purMhM<>ԓ՚cǢ\z\cQfǢ\ͺE&urM7>嚈o},5߬Xk"Y(D|cQfǢ\ͺE&urM7>嚈o},5߬Xk"Y(D|cQfǢ\ͺE&urMij`WNx{!Ɛw~ dA )" C,hl( ! xKRPP AXe*uRl@KzH8/9UwL$^ d[u.\ۡ.}ɾ Hd6움Df=(@g^ 7 XyFwO(7Fm)抿Yh챑)IQ_Jki{4:6rR2jKrcg1#[VՐ[6($j\^)\6銋Q㾶.x -?6 (i>MQ"/~Cuwc6gG 6OS|Q#)Ck \索-77#fsH]!>qJIƩ{n׭$v}ށMursH;9&AI:tzni\X+A9>5rrs`8.]0Mߦv|/[>ة\kcSn\z`'}7p&A?Z3|q?%ECA[&^6Ħ7IE/3 FMC*.^Ը'3syMߠE3ӟgZ#~Oc lS4}RZ&qiɲ待I=1Fm[&\y#׉}?|K;nܣq5InDsvcʘrpl{ɞNSy$L[^>R}Mƞ9u⚉LJY*O>7q͞O|)[>FDU͟RF\n$6YYFYeMA> 6M\rwޗZR8N.קskeC'sm686qq)fq 1s~R r=+b~םNF֒QfM:WIJڥQ޽Mm`:SE̘MLF=Z융%f veIUl*llbqMMX7~yҸ+` 4wrͅVzpEl*ݯyM7#\ggSE):˸>ҖO=Vo*aDWpc9Vcgڦ^rl>I~Svmb\RbT,]9wӂqKQb%3/~ տz{ $??Dy䟫P~{4#}oɿme|]{[(n,; H lj5߄XfrMorb>yuuyT *#L`S#q[~OlJ}|W3? U.T/O|$FIfi'bln>o>lL2I2F<{ﳗr8(f~}&7N-ı|{]*6R('{^(}e,l˛Pd'cX%O2Q'iVDn<P]͚eehY 'N`;, S(l.>m@yi35\~əqߣ_"n0I\ iͦj&Zo@76CzbS/&a[)sOj3ljTFX3F6Ce}`D}~Y&bF6CedGQ YzK   6MݴI𺣛v@5uP<=v;@5uP<=v;@˴n>MnYM0z+cR` 5 p#(wxnG v ٳ ;$Mb,skb5y% @"k1#7tOOb<Hں&Z\yn\%2{ű %E庡Tn)32{p+~ʿizVէgs|co@6Kӳ\clKCcqW> {W(G㚵7X{\Pq``'ӱºx/p|S{cX F"v?{|Tc]PT.`] U'﬋7>d] d׹OM&c&Ig.:gYw#l;{z·^G=Z5> =b==Q/W~h5P}~rP9}=g>lE=Ϊ_qO:G>gV#g^Qt5K:G>pKߑ3p(w|2w/Uظ+!|~89h⎕YKƦ< sP6EcV4›/U̪KW:eo7 Gqz?6. ]T.)+s] 'uYpnRh/nyDo7<ڢW٪lS+;.e7c+5R:.[QV+k)Mq{gq?*](I}RnӶ,)](!Gʈ2j<6ilcl%pT9f]8LXQbq:qf^9m]D(sFGܽNY*9#>S ?ȨxGOq5Į$v%+z^?M߁ ^Dx](}fv{<ٝf`\P/c_0 DF;5Y`*_fh]5ZAC)<j~ju N`޲<ًj[mWSum`|3{5>kVgkioQ}Ro$!X}ɾ~_}p t T&+>{I}ˏ霯i)hWVNS,o5ZN@bC 7n[ (:γlQ[g%uY]q:TϝP'< DΪs܉M\Ȱ?KzpxO`9 kwH\ą`]/,^U@.zt_~#L2,vv'shӷoiӺ{n]d {oZS֕&/m)N7-ٺu@uX!JurT9f]t+=E9H9h],WsA @: @q_U)IeJ..w<`$PyeAYTKzJr:w2 +#1,w*;*}42 +#1L<-jKM:n^Jr.F_Hr.)  ~[aο\.Hs-uUƬ0Ԫ1)[綕1iqeºC͎IךzҺM;1iބ֨<:bxބj}k"/].l]>Z+{ҍb˦UߪCv0|XU(Og1By폄kI$Ȣ1O|< s@fBFr R*Fv׎tV4w4%}&~4ZKGxcYY.5qݔo1\7Ȣޗ)ǯ6hT`[\Q˔.z|yu@%|7IIz>/ky4H[_8MqyeE}~F˳3H[[ fۛW+G@F}g 5?ǕEai~C#2,(ͅ;XdzW?UW&)eބ\X8H^uҩtY+߁9KjG*c- @t+= ?T?b\p15.)Ul0O|M֐M&o5(50 Of$eS;% Z/#WMc ׿r6=,ZzukY֏zlMuʐM',zgNZG f>U=9>kyjzo8Ϛ[u ւ|jϦ5M8_!cMۯOAkęglmX,H(R6Ǚ,W9*R6Ko֪ *p5(r`RKk;eGdȅ 51Jj@l:[Yn ې[{>\*@zϦՠlg}'B͇+h){&jmM|3^־>l\s+1]_ùG-K6EY7b߈z^:׭Q/kyr/_zĽaՃ/{Φ,ӂ9X){. =[6y\(eRuٔU_(ϿS6\ǖe>,)Շ}PٴIo{l~r6ƾhsyʦ}Xӕ5OWjlAƚdS?&ɧy"B;W’MOu5@՞W\^ipWz Yw R=?*ӯ_wc;eS)^T jkt^D͋IV+(!U|Qc1_6.?Gg+((!U^{fw5t7Gg+(cQK6mdT6)qҋKfӜw~/(pҋAm 3Fd/=d Ng 3Fkih0'y<Ǿw7gh0 /z}=o`${. ߑtG3=oh4{⿍V@χ$ Q]U ,c+l8\M9XJ ?sU6`5%&+la sU6s1lZ.-kl;=WeӷeŜi5_} җ`gus{6ݭ.:#5֥lnu?2Y3 k]wɦNVW #R6)R?2Y3 k]-ai,IC{~?̤!nM;.RZF}u?-c& #vT!E+㽑$I$I$IISxԻJA,Lhbx]?p,aCy%C %=XeoYϣr$4K"]n9wZ{[uYʽ梾tn<]tl^zGwxoNosQwM6:v7W/Z}ZMLi hu.ۇis\bVIx[N@zo{o{oi++U_`n 8\SC "" Bb'>m 3=NQV+; {kF&kYy`\d}2|3W 4)\fa0nVnUnWTVUWT6W4l^ZTY31|eaǜZ~Ty\yRyZyVy^yQyYy5wWXFIs6re3RYA1|ˆdku͍wOϝ2zǹÑa]p>¹d[~\[܆?KU-WVmKk?Werp?bx{6AIcgkm=;^69I{{mo$P!<6D 07WNz+sv -wY7{.1Xx,Eo]>}l;/sϠqsK>k>!~5%-u v;A^XyeqMőZF+!JTB|Sz}t8Uٖ&GFZTDR3cVk9) |6"Mw+D]ӆ[k;X6si괥V~e^77&l‚8llQt2ޡl]ؤSQ(1-M򿋵&8(?4qO#֣glFuLJOn'01z1k+8-#;ԘciŔ&\]ŀӦc^lJ68:0eN3霎u\xoycRaz6D`XHyZg\oz#;mb\i]?x0>S/țU>6ٸdbm`q m?{OWq~la&6=5M]Dk^)_[kmD1Jo6=AQTe'y7Igվ4el/v4m˟ǽ8- x>RGUcx܏ӳ]YBmejmaH\h|ߞ4!x6|)r#,nd4ɣeyg[mSoYڷM>b!Qe$*NlЕm긧zuxԘ ̓uQrŐ]u}Xb96NMB]O OsϦ#9v(!O)_&¦5E_oZC{̝M2L*-PrKov3(ݘ9qm[;;6.!6E,/l|W_} MqΦZP;?ƆeǤ:c Esbyt-ʧGr 3dH&E堓ljun]{S)fӅا_E_h(15J&/|?wlv7~\&NT|k\y. Qly2ۦ&qCAwwm&]_|qlh9"QMy6;y#=ؤpĵK&-U8eF6> BشE5e)õk>Q6R>iBx~Ҥ&Z a|͎=4lʲg+?Hv%7d5lҩk_q }qvUs\;0Υwg6#MlW8!ݝhOVo' nP aliSyledãl=jl{}}Nl-c(pc\O5R`S^Cl!D4YR{.reM|W)A;R}m ӁmMBz-k,b/Ե:ǰM[C&?wӝc6qئgY6|}!#w:=C e(dC+m}kvi~w |Xdz3T;`S[jҾ&xvl:Aҗo-M{ӣL{^qmcC}Ex>0\ ΅׸SqSr2M _6blg9 _@69eۅM͇;OӼB{/޻//5uD9x~lb՛4Ux׭p٤kә#=dغk8l12;GOl҉)ly:@&e`S1G;7s7l2 e/N9$NH qmNga&WهYJxe&w6I=\?BO&S~|I,։+m+p\WlBҭ1I.R_ƴ%N?7l}9 g &o690ævW5S]K}FF&5`OeOj۩8)(_WjT!lJ'.|}#"6cuB>S{/Oʛў6\6 \"Vo2G65Z-]yz|s(] }cK6%8Cտ)]Bs`cyA(}pjJK;2եsQ}fF~t ^C; K+aҒ\edq:]vY S5?=uI/ÞC9R؂(%xN"C`-H>7$ʝIbEќ(ߖ[ ImHlZg'kn7I=/ZlV(LGѥW:lϫ]l$o߲g)Al2݃>C?6F?}X01X^p^l$PqqoȦFL˟&,y'nH2\9BG<شu}Ɛo&*j/ 6$4)al"[L&pεGhr~  } Nxԛ|zAF}p7bk׉7JXN 6m׈ Ka)F}2K$ROͽ JG*Ih_UgC56q]q73ǵnWD!6{hfطvcY`kO&Pp|ΟՇlI&ؗQ,&mb+Ol4Pi[>v G}w &.xHKW_tK-sSjӨcHj6^[ ;KbCݪ}¹'%8 g!j| =~Iڟb?S bf16{nvcD4xgT%¸;$O%\14ocJj e|lZ2)Mj5zbӭ {"Gb ˔t>8neK`&ۃEh˖SCdH/DóT&vg\>X'+S1J t?8UF9Nso-W=?ϩZ^n;i<_{^}2/&0b3 R͟՛z.wLjq7؛,Dl/BRs,Wlu/k8au79qIƭ۫_^c`r)p.axșCfSFuP}lݺi}°haFƦPylbeB6aXSؔME߃cb⌯UGhD).W߯ MisG~D;K<&&C6v|*lTlmcο :VeC1t~iwc[aM6wGj,#}I[dPoպ}M6i{L zo&:z8~ 6kKi:6clæ9T2i?&tD|>^ؔM <2i78/2Y:&&8w_8'!qzWԦ+lB~M="՛=dil r$wSg*lƦƞ1rOPqzpD_aSfMĦ^X\j[ ]x%k^M6Qa5|v?sG%ӭxdljWC^܁6eP&=jKl0ޣT롾E5 1wȦQK}xڮ;r¦dSV`l퐖UֶCg&=(Ox}alrXyMeT4o69JjN66=d6MW +MMMi /wW +MMMi4_7_)l*l*lhNlfgMMM M9TTTTK="66)Ʀ9kn𪰩?r3a.;+MI@xr0FB]dXi`2P7F%sfiL@1nJ 䃴/pnҾM`B LH7 i_&0! &}/pt'On/./M ]7_ָ){p> M|x?j&Ȝt"Ҵ)zcA3?Wz{ @,e H1ܴ H )p )p )p@ilGn/j4*G@qS^~詳\u2D=O0GswRMZ2,%T}!7-}7L=7my>9yCףTn%C7}{o& w]{4'o7]ESwӔntCm(Tc=n?4NMS*5S:/mM|wt PW7Y^KLƎk8kHzΛб0ۑ5Co1?7;MǺzc=%^[< v9ϱjdG[vnҗ\ܔn}psRIpsb/45<&?~{ uS,JG&y҆/nҗfksLhw]$uԘ2dF{-To94 \dQ%bj?d8Y+\oP\’UgZQ}NwksMl3WpӉno!ZP)MMM+h[Qg7oo}3ͱ&"x@Qײ)M WUF׋N?7F G},YU\k 7$ճ6KsSVu ,LW}M0y}Qs\C 0=L\w}ǔn&H`7ҾM`B LH"Bt{oL-Pn WP}D1vK=]`Rw3~5(55>kRXs_S CbI PON>ox(YRD(JEn)v,(ҾM`B LH7 i_&0! &}/pnҾM`/Zteeworlds-0.6.2+dfsg/data/maps/ctf7.map0000644000175000017500000001260712140200333016653 0ustar felixfelixDATAwL+    ,Ll4lL<` P`);G VZT@ @   6666666600000 0 00^u0((v0``0dd<F2<F2 <F2 <F2y <F2 <F2 <F2 <F2PD#'m%#''pD#'m%#''pxK/J,.OOIL)f+^xK/J,.Mc%x/+I+fNx+.c Wx3_@)8XHqg?@q@D A4c(QxŔkHaNK֜.TDI"nM22R]P7g&,eJ1]i&YX AH̊ݜKyyyxyr]nv˓_1#_-$0.vnsuyس8fK(o">1j+ڳVsumƅXV F^;KG2•_*0&X4&QI:,IPƦӄm7وS X^ky;̨=? r/+vQF |[*?NIXʇשB5.s|7\ !aEHPyl'h~J,`D 2"Ns=ԣ&#;:!/UNb\ap˕!sRz`P=_zsC 'O1B # ń"+㘍PdHx_x#@&r k2 g@C1:.{ ÿ`>3P T FU#xS٬ .GDv2_ ?^@  ĩ@X'f] 3P T F\2xI0 E(g:@0mJ BÎk wK=N7xсɾ[E/:;%j!HIwѾb ^im/_c3 yz>6@Iӆ {}NR! YKQ:IP-oK,̼|q`³hZje4WpUt"7MZ6wpWv$'C?0,96l6PAL^~[*PU;$p q'QS8c>Zԡ>-3+qqU./%o\M2֤д^i^iY*}siݥ\w* ؑs|X%|Ǐ$7zɴdEnXJI'b%/KUh&カY׶d6iiiZbxػ @Ea"$5U:& @&0!<ԪVG8ԫuBWZ,U"|>9w{u(5ʁFg9wu-ȇ:}C='M%N{ŗJx 00v2Ud WkdM[ګG:s'#/4z3G:U=>xk0 XD-N-I1YCb!nPvF)Z\Rie' ̆WHݥp*c7!_-+ZXY?;L\e7WN9Y?I4%8[jP!jǎvMΪS} `5 F_-O׆gg>F.{k'kDž27sKʻHX܂ ڕ#?Rl m\FOH?='#I\H-0( 컻}v9w9$BmT:rV$\,LNxQ7h\i?Bܼ4Z\B'Szs$G'lr⯖Z.Zmm)pe Ώϋ!?Ċ6JkߴΏ\|bl꼋Ma&agHX=w\\Ӓ~׳3|Xu|k/H8\sstOIֱep o\u~-\\+{n \ J\ |' f3<_2.v]>Q.B&I|]WٳRV:vOR{ W&g> \$59COC{Y.8CZ&ЇTċt ƚf-.9) `ޒne uE-K 9ɣ\hW9{B[KiFEdWΗR/s֩e`T|N8 \ĄArhn]2ʉ5q3g͚%_ teeworlds-0.6.2+dfsg/data/maps/dm1.map0000644000175000017500000001325512140200333016471 0ustar felixfelixDATAp $- # ,Ll$\<tT 0TxHX$6L_q}:K#% o   0.......00000 0 0@0@0@088@0<<@0`b@0dd     <<2<<2 <<2 <<2 <<2 <<2 <<28D#'m%#''pd6y!ٓO?xKJO/M1d?qxKJO/M1bArxKJO/M1fCsxK/J,.OOIL)f+^xK/J,.Mc%x/+I+fNx+.c Wxcx?֗ ׹40R-@q<?/l>ďpƆ@=!xŔkHaNK֜.TDI"nM22R]P7g&,eJ1]i&YX AH̊ݜKTy^~<眧\[zu0h7WH[K2 - /gztW4sPPZ%75 JY}\+VAG-BʯFsazl$m'xØJ cI状Qlĉ,5@S4fTZ KkG~8}җKWo!$86FE6_6$#N#jsG߷o} .0`AWr|'Ug9fBi=T>IqKkeYz : 1T?V12>iGsM˄Qp)dRH%ƪ2Se*I\-_M;:!As`q0+T^|b$ )pE;$| Q/Ƚn}ŗX)'iS.F,an qׂ6Ffx+Afű_2d}Rv4aa@f@€, 1u2Հ,x* +U  @<  ll (0pAa h#zxk_ 3w0gj zv, (L@L,@ @,)@0xI0 E`с; Y(@Ǯ(~; HpqxNFe_|b\b Wg,s_һ~l<:3؂D}zGv޾Է| <m>݂oĂoMg ߴ-so5tJzS5 έ窵5L-sr|ˮYś/ xNA˥7;^&F=j@A^(+},`{,`{X|3{4?e% ;1imXUXh6b6cиO ϱK ˱1K88B6Ec^^|]*:V:y. owxn^:VA т\'|O4,jt_ ߹lnVu#i wom00C1 1$ٴۖ I)A6m,Ɯy6?; 1F฿zn[L{{}M4Lwx׺״$13)s^sڤ.s6 |qk=B` E|&6ek8lPn9m/n\oۿ[ wj8LN:<.h<#O{,\Ku5ki_'wLZvt_\*_L?EXx?E D}ۤ>kziI `̍x PEG"hZZڃSN8TS1/9 sSSTzU=s䨯jFjlƿZXlVj6jkƿګ:ꢮF;*0*gi(RqRU2 W']?/>_ex mo5jK!QgllK)m(GK<2Tˡu~v(YBָ}}Ŭ/z"g/ȚQTܞx0r"zvNN,޻l khoE3GkUOa=>yQ/T)LCjl-K}$df=c%h!uOf©|KO~U*IZ_f}|dmFNX|h^~ZqnٰT\^)Oo״BF_[dވ_|Dx CAVXx+$zѿzoͣYoZJo;nzDxZn! %<']rLA- cك1f <36Θ¢||1mwf[,AıV.{}, y8 }'7> mg8[ X޺^0WpuQ8~0ӚPvMCU0wka91xA3;Ԙz9{TN:ĘT_HヰGF8Cޔ~;9íFno'S=\+͸&H'oZnu,z[T=\~rN\y/LDmC~ynml5FrM!RhMoIhg;g.B3KT;NqTQ&K!|]cA~tکuˡ=XN}>οϒ\Y3>C· QVz N5oz7BYkc2^ {KSޡrJڱoym ;-)Qϵ9… ?aUxA 0PP]`wnjXFX eI IU5OaWt ?W|X֨\B{j?` {]t,+|]RԦܣK6 @;teeworlds-0.6.2+dfsg/data/maps/dm2.map0000644000175000017500000002073712140200333016475 0ustar felixfelixDATA! $ G # ,Ll4lL,d 0TxHX$);GN &  ȯȯжжжжжжж00000 0 0000x0x0((x0KM@0^^@?0dd0dd <}Z <}Z <Z <Z <Z <Z <Z <Z <ZD#'m%#''pD#'m%#''pd 9ٓO?xK/J,.OOIL)f+^xK/J,.Mc%x/+I+fNx+.c WxK`N|%vq< b ՗oc``Xπ?O @|ğlpƆ@0(xŔkHaNK֜.TDI"nM22R]P7g&,eJ1]i&YX AH̊ݜKTy^~<眧\[zu0h7WH[K2 - /gztW4sPPZ%75 JY}\+VAG-BʯFsazl$m'xØJ cI状Qlĉ,5@S4fTZ KkG~8}җKWo!$86FE6_6$#N#jsG߷o} .0`AWr|'Ug9fBi=T>IqKkeYz : 1T?V12>iGsM˄Qp)dRH%ƪ2Se*I\-_M;:!As`q0+T^|b$ )pE;$| Q/Ƚn3 AҴ/xAPQFX+ATsofw4U׏ѳ.Q9t*I,z]J2繶vM,ɜ:\;7$ճo{dzHR=.%ETϢKIgѥ$<)`)%[>B O8 1XWb8c(0$2(``_ςƆ@x[j@^ޕ[ה2b&qρy1iUӸvvIx4GxͿ5a:935& S͋s͗y<dzvusk5|5dsIּ뽽Krw׵nK^%ΑRHCxk[C5ۋK2rզ4z9L>s\[iG7;{yn=SB:RdF<^yuRS_8>wsǘgb4k6s7Ƈ>s3h=mq^}ۯVͻ湕ޜJnq4g ǣy\Z9cǣy<ǣyLǣy<^{R2YhhhO%~& x[Tu)VCVPiMaeYRKE+iaYVKݤ{*^+{0{ʇ23kC71dmvfv4ag9Þٔ$I$6gIg(:"E84.BG$Ij4o[6mwb ~KJЇ%z@ >ig5x:i7[9;נ/_LЩ4it:mq Rh Mйtq6)ku1]BRe4.+m$eH$Iҿv #꯻C1)5[*ݪ9MiPvȮtm@&DD0p i@+%ñ}8t\H/J펤ͮwW]oD:WezP*+*:9,n4ff͢tcEuM4xsiIweͧ鞖b&KBr~n =DS{v#(=;G~zWqׂgYz.{yz^LV')zUqׂVe5zڐ=v|r jJ봜ި$5$I*>qq A_79b_%z7q?I$IRssV]Ji˭/p;*I~quqTe\R|AlOp_WуPio O밟}OWlA(Gq n}=_ߊ?~=уo$I$ITe՛x[n@ EoJ?N*Їa9䐗{ -rc9mZkY/aH4}f5Y 2kPcPA]EzPաx+zpMTٻT HzԞ}<ၤ&2dJoO}g ޞ{Էgѻo@{FהuH:bu,#vHy.}<@؈sQ=DZ  =Rx0KS=:% xx -<߻gK<ʃJx{zf<=35O9o 0 0 0 0 0[=zx[N@EQOFsGV8Ku'o?"o7YDtp[^B *gGکm V>=Gw :8J jcZm.-(}צsO-do8{> Voxˎ0 @;gY "DyK\6sb;a֭[+zW&דS/'?fP埍5K3L̶q.u븺FqwxJHb"ВX 'mKzjf앗r8Y558/o%5ʲ2#ձ?0~acsrS9sl4kqjW̳/T'] 'oʦptVE {Wd8ۗT?`%pe~~3W~+VX;"ut??5'ОCKIUclE_JKr󐗅fV|prCX<s̲kl'Hb7Vk(5-vyVÎM ˦ZHֻ-__x}S Z0H^xSV! "ud /_ʸddzYZA VN(@H]eY4D=Oin!k&Otъ5\Zgf"sq>J;ifp5<%-%e9Ж(вrgۻkjc{0^f{c+^}[~pAc(O(t8q@}GKRF,kr9];p0Zpϲ+suQ>Zyg,9r |ފg81'*Q%_dY}op953.!3s3 p"$9! WIl?g/!/HRZlIrcjsЪf :eUW{ X.c%9(Y 0uR.LEqxY嵑c961jr`ݮ2NP8!F̂|[&z83NYfTx 1 ?ܾ'9vcЋQ9Vc#\R-^kZT/Fmv 6ɟ'Fvk??!I8ȟ'^]آJ♋x~J9$ʨ?X`5{=XZ^a#sVi~J{[nݺu֭[nݺu֭[1ՠxJArBPTD+,~ ;^HIZ_U<VwUūJys7Ոx+@Dp>vxp *ZҖښjs:#^׎.uYteeworlds-0.6.2+dfsg/data/maps/dm6.map0000644000175000017500000001722512140200333016477 0ustar felixfelixDATA $  # ,Ll$\<tT@ P`+D^y!YIH w L  0@80`xpbmpbp0000Eagle0 `0 00 `0lZZ0lZZD 0^^,@ 0dd   <H2 <QL <Z[<ZV <ZF <ZN <ZF <ZP <Z_<Z_(D#'m%#''p,5,5,,,!,{,',( ,4_,>,?,yN,N,L_xKI-N-*OOIL)f1xKI-N-*McxKI-N-*/+I+f?xKI-N-*/+I+6bGxKOK-LOIM,(I-fMdxKOK-L/NLIeMexc x^ssI2hn bvD9qX @οK?X4w@ ?at>LDA4W,Ƃ TwR*x\`?0 s*ufg`` [e*~x j }?+;B!S?nb`X |4 q,x+/o0`1m1xgO0x`d FOV ^_H `> i!9Ex[V3ym 7IAA ëMl @T>?`4Px[ 0@Q?ܠU Jqu]"a2ѱ!elUkNM>{iϿIy~mE{~r}H:Sq^>ΑY82O9scg}8̏ٙ>[:'.k)}["O\#@Y&x=@Q 8ѨW[X ?㼗L1%_f:~yXDVMÏV 5ݫ[Gpk ];s<6ysw8R6_:&za5\Urggz;t̵ja i؆fh؎~uޕJxn06vޒKn5%5 $~-)R0fݦ a8r3;T+:FǘM)Ess9sYkrgkw eq}aLs/g6sjT(zTYb{y8sk=7G\+scT󎹆o<>!?y߻]ZoKu\m,y$w_,5"%ϛb.am:bc/^ӌO&gECC<[?\m7^5MI.Qx~휽Ryvk&kS,*ŜW!9ręZ"*߱1UY>6JbUskVOkK?WPpLVӌ3lv?^ue۪JSC:tsYs|1ƹ * uY֋)&>x]KYok圚ߧ{=\eWi՚~;eqeW-_sχY~Fk%s%=7^rЧ9̜04JApi,ai5wN=w`bRd9r]p_s5ZG6Zkuh7bxIJQguL] lA(vr2KS>^~* @H#ԽzPI=9[m: iˇZx,e=$qjo4Q^+#Qj=Ni$k^- VA7u;S%i>>ԧRꧯqn7𜔍sy9Qcj\MxY=I5K, u*9ijKm{u{dZ6!z[Wjk^7t3T3axkN0Sz;Op*T%R{=fF; -riZ3yjPDf+rY2˛U8?ɃKsfφeF8k{}f9pYu?3ZT.v{!kym)4 Wﵕj׬ F1"{-8GΒsmMZ5,'~+BYZGHԳ(3bDju.sZ4ښV}uf5gk3q]"qAr}/QB»g\%5K3r K;uWܣ25+oYQ#dŹ|2lZw=54BS/Β3]HYF{dc3ɛ1zElpЖ7-rx/_p~/fmiGα|ѿy}i]RGkFKHzh(y8;JL<9[ʛ 9kr&LSZδf;csΒə9ə39ə39َgtf =\1x۹N@E)P#_2{KX۰AwxR*:ϑn,8)6={Hf/êֵS!.}CAc:Mg<]tZ}mgW8gZIt}9eECc[s(e;7ǵ0YKcvo\]?1xñ GBW%$?MX*xKs)Ǒd\R:'|NcwrW_k-@B%~ t3if4O=MZ=*a*7*nwgzz&T{0cr$ޯ35SuޯGͳ^փZxGì>ξ`H j] k'K3GTܗ]΍6 l=G8_^ހނށރ>~Vf~aLp]Pm5t!o?A@A5ú_?Ju:a8-rS)kOzS':=Eٞc3zyF,z9SzLUgs~,\;9x[>獵.b1^O~sb_/ZWG>>>:$k5~~vWk-Z=q^۹To_3=Ñڹg׷Gz}zay쏳k8fx$=)Kr?SF_nbGkX,s%\rr:oYqgFo|b?<'v2l;c~&%??s^˝Vz;7[c bٸ9Iɭ8?T4OElU(7l?m¹3#\ni dqdP1lxq~<7P’9W4jbؾ5kK-zl, ۾qb˽ŧ{3[_*{QyJΜkڭ_hFkJ9_.T) g7bR{7.yD۵ڜK^7|J',2ͧ=pN7n;P9Zq8 c>a:s^&?RkL 9cIN^t1hCh=%OX7u>}nyq]ry{4ʌ>s :-՟_}C7l׻ͣ¹峆Seg"gw.0t>Rͩ*un| ]>ku\̰uvgq[[Wkz}v6c3wk~RrH>i33tNK?oByF#{ ?Mu\9u s9|t<]ksFΙZg]L 'c vC78>v\"r{3mܙ 6&ۘpncB<8qC ˎ_{mmuop=go0 ',MVgy=ǻKYr(߱rd]%g0հ\ku`8`ݨϭ(jteeworlds-0.6.2+dfsg/data/maps/dm7.map0000644000175000017500000002345212140200333016477 0ustar felixfelixDATA&.!  ,LlP@d0t@)6DT  @@0dd= 00#$0bb$ 0dd <x<x<x <x <x <x <x x~|xK/J,.Mc%xK/J,.OOIL)f+^xc x+.I,*f.xr gppbAj@ 񕁘*1/XPj4x-X wfaA? ,hl(l+xO(aǿ};;}*EZʉ(8"ILhNErkZʚrY=A98W>}rhSZdH|1xN@aKBއ}! V{xҨu6?k'0͛: ë+t SW'BcW@W͓/bz_i\=Pr )r8F'-b>z=_c)aS9]?^ ]-YkJ99[0v Ujk ~ޕIіUJ[-+ Ϗtv˥{^[K=;}{Ps-U/-܎k1u-ZFWn}k7]mhfؘ;*F]M{#]5.]StUF{]芮HW_n,J???/tlSUk-*Y<Ө'7Wgұ֟w[kcs,^c0t˜ ]1"5>@WLkcGMMNN?4f39|y=~k2^jf4|Ӫ2[/2uZWl쨫ҵǾ#;ULNJ;^鐹ͮhX6 ]1pH+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+H+j]I#vGt'OzSu+xWEwA</'JD{)RiJ T@ RA(=ݽI$w&%RD&K^;;Oc_{vvgֲB!y Xi""܏MWD!B!BFvc;lm5ªڕ.q ףTMVzaOݱv8v>銖p 2]x· NVл,kA=`U|[p3n!>S#? :yى;v܆[(,jdҎ_A+ƒ}wogU [cl=vpv162X p_]49'x,vnc쉽w^ 16lOJq|xW ebwƽ9ʃ{c(} !( cq7Y2LI8v#%,3tӔ#¯/fY p>ùʑpbV Y9*kŬ'3p-ոJ92ʓ+ BQ/eD& Gg$#q18gL3d\8'I,'㔠++Jw=>~:ʼ,L8ufQaQ|~(0|\ qQu˷~}2ԉs/ |lVY}q7),W/+>Z&$,a:ynj\kqB0f3 Vnc_ U9Llw=֝ۼ}ci‡-1HU.-zm^! >B!"{6F܄q\sL؊ZXv܁;]e9HIr*~s!Wyĭ̏-$Ӯ(i)t^EKxP~5W?1~94SMW@D9+ "b@9BQѬB!"{ ؞Tۼ3Qbsx^y"N=6(G"N-)G¦GF9JIٵ*\$v,|rܮIH#{.Exd۱\pr}2 ɶcI9_a'[ǟ ɶcI9O¸O iLdE!p銘 ]nO1/[}%\gv |pa@JbMvy2t.y]&ؘㄒ49F D_N.޷ 瘣 Xmk9OA1J2UGj+u T4cst} ͦ/((!CՕVq*19{>Q(Q>'_/-vљdN=Fn5`7Bqri.M<9Ha?GVnrIR1Nz%IjZb֒5_Il!UztnZbw yօ$IUJZs\,T[=Tts%\{I%zl$sXl# ~)ۚcx?9@Cav}:MfrK5ZQ,w;]Up5ܵܚzZ:Ns!CuhQy'$y*H* Ez_&I6yK#N"|D>&Oɩ"_oȷ;}ԉ$IZ #ݡZGiG$I7Zks]NIU_$I$I;{I{< ]M7{!%;yDΖB8J СN둯b;Сa{4e!Ma;NСq{4O:=J8CѼ_/Hͨo#!=jt$IIC53 L| H ~ݹ}FNM|޺CvdO08W-L q2ij9M٣,aarn1s-oGcjMh̴|چx#\f_7+ 0KGl՞+cIO!*Cgkl(9`C(< 3(G<kP NU˲Gth)A:4dR/GJ4GJI$Iq|>:kGJi#4E&$I$IX{I$I$IpXx[nZA7uWY%D2>3uRGe'XãǨ{\|`呇-Q+"xGQ}x<z#xדgQ[=GL)+嫧BdjQ{3xDxt Gj,a&jf=ʄw2."CO-ɼ7=;l&#;oE_Y ]=IԻDDլIE"SfNV;YkNVdhM޵NF;vzg QֈzxF{ţ5.Vkz+zU13ug2uxc&QZafFxwQWQ<шKmk\|V;xG؇ځU=x6h Xځݞ5ogwXl뙫]䑅Kx{5jUm{mMD=?ZjWTQ#>^e'ãG>s^̜݇z0<^|y<}1u͐ו5C>ZGzg-@;gQu86YԵA΢ pumP|=Y]@\x]Na ,%htCE @]`ĄN_NfҼo&d-`2~zQ{`*LGJ̳N)i'm7F7JO[{DGٛ)fo$#8ޜ=}G@D~JY]wpLi ôXJAi#=ޣrwGw>֓_Vz^K뵇)#=w~ֻLWh`_i}M!0jڡ @bix j0@Q]A2=DaILdͯWtDAGDt׉i@۳_[V)#{\ Ǧ'Puf)FaQ:Ca4tu FKG0w賭y숆zwNg[+w<_~j%G5XVh]i>rK:jw]Gt-RGs- ݴ,Js5{uOh4DH:"QtD}8v)rZG=Q#'Mq3MG\GG6#^:"!jitDAGDQ{ @(xn:)_m]v dy_戲R!5 uXiHoNZ>ʧłz{ykMQ94v519G6z<]*c:S\^}aҩs+swWb:cԣ| k-(9ov1Gyv1GyMY8V_gI)gjz7%>)C_D߯}9cNgz7ؕNIOZ{̑)s7>% k%2;#stײ;FfOq{aYT =Ʉ80+QCk|2G3 8RiUvG^'T3#vMB~\vAn<^{BjG/;Cɔ߽>Li؏"o\!X]s &J$Vn6"V̑*+54W9! #jMg_Kc{[9Ã#im"DƵn$GnSJ|?Oi#}ǜ0XT>*GDGz{rp 7MpO?"G6Z1GS+Α4)Mf1FwZ:3p]!ЬmDL|e|M#(Pק?)J H_1Y}^?tb֗=ES}iwCQKvH7"GXss4MdUrZ閫(ǴRq:բ?GCY`0֖Vlh99Y"r?kY&l1jND^磴)?8;Jw__rQeZ28g3a"?!Id(sW*SRGYHw.>/CU 5(HwQAuEwOJQ\ҽ#*V  P1sd<5깓3 9||bӢj c yL6L]/h?W56rP1^v~kcsrJ+#/+~Uƙe}i,iv7gΈHt\pөJ)c" B8'n3%9sI\޽a21GYT1G-#ǖk9oy&u|m#vNmRkcQ2n={ ntrm >|RG2pXF^wu+{ib5peՃ ה> (c,#*:g\L9A]Q3p4?P̑Uw^g;Gg[(}}ΰn(by %v0x\K4 G=C3sg^|hG(~iW)GEMGD BUn(!1?T[;G/e[m g+IG'aA{_n:!+Gkrskɘ%ƀ>;pdG8t\"K'[6;[9l$[JJK|8; | Gp>ف9:oD7[Zol5~.;w\}[-Uh/D}j֍}<9& 8*؞6(䬺bz$|$[#q.^]W#G9q?wg5͑WkWƑ1|'e|%G8GsPusD9ƤXBI$\WnٶD~ne9!+FO[̃#}6nY#xDHl;BLqǹa6rmQ>{m],spTs%)e?rDkr|zuE!aYvvѡ]$#!nu:K.m'WS;GG7Cr9 r)=m<1IRV|&I5kenV)`?"}G)acvȏJ;^Ϋ HӠviv ?JTC*Q,\S-,sZXobĚ4/>ߪSy]zfs>(?\?@VBDE FFFI 0X fp0p0/P4p0p0p0p0'h1p0bb @   00000 0000  0% 0( 0+ 0- 0/ 090>0C0I0Q 0Z0b0j0m0o0u0z000000 0!0"0#0$0%0&0 '0(0)0*0+0,0-0.0/0001020 30405060 70̀􀀀80 90 :0;0<0=0>0?0@0 A0&B0+C00D04E09F0>G0AH0DI0FJ0H K0RL0WM0\N0bO0j P0sQ0{R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0 d0e0f0g0h0i0j0k0l0m0n0o00<0;0:0?0 <0''<0dd50*aa$0dd     )<>2 <>2 <=2  <>6 <>2 <>2<>2<>2<22<>3<>2`0cD6xCX]'I(,p$H,Y,B", r,#tT',n ,>,b;WI,Nl$C,~"B7Tm|,w]P,ބ,hBC,Us, DH&_,X*~,R"m,3#s%3D#'r#'q #' V)#' !<#'Du%"Fo f# 2pqH&O6*H&;N,sN,#/,6D /#KD Sb43$[ .e&+7* @/) o d[ ӧ%.*"ֽ8{_&@** !;`p)"%,mկ9+7"H'lO].  XE[^"G1,lD7\@NA#QIU v3h]Z=!n ,>,b;WI,Nl$C,~"B7Tm|,w]P,ބ,hBC,Us, DH&_,X*~,R"m,3#s%3D#'rqH&O6*H&;N,sN,#/,6D /#KD Sb43$[ .e&+7* @/) o d[ ӧ%.*"ֽ8{_&@** !;`p)"%,mկ9+7"H'lO].  XE[^"G1,lD7\@NA#QIU v3h]Z=!^_8ang]mI ;L]H4tq0rogfoq R\rhuLF[L'UPq;$m?Yr cDH8Ct>rh>)[B,U%- ,,X,rB9$, esuz%,-;oY+,Wr<2,?#t8,>S~ cD6xCX]'I(,p$H,Y,B", r,#tT', . A &cD6xCX]'I(,p$H,Y,B", r,#tT',n ,>,b;WI,Nl$C,~"B7Tm|,w]P,ބ,hBC,Us, DH&_,X*~,R"m,3#s%3D#'r#'q #' V)#' !<#'Du%"Fo f# 2pqH&O6*H&;N,sN,#/,6D /#KD Sb43$[ .e&+7* @/) o d[ ӧ%.*"ֽ8{_&@** !;`p)"%,mկ9+7"H'lO].  XE[^"G1,lD7\@NA#QIU v3h]Z=!n ,>,b;WI,Nl$C,~"B7Tm|,w]P,ބ,hBC,Us, DH&_,X*~,R"m,3#s%3D#'rqH&O6*H&;N,sN,#/,6D /#KD Sb43$[ .e&+7* @/) o d[ ӧ%.*"ֽ8{_&@** !;`p)"%,mկ9+7"H'lO].  XE[^"G1,lD7\@NA#QIU v3h]Z=!^_8ang]mI ;L]H4tq0rogfoq R\rOF xKOK-LOIM,(I-fMdxKOK-L/NLIeMexL(aWx]͆YYaæ"HdPb%"KEpePQ $hb&=wt|?m}λzܗ\UnR{K>R0wM)Q.W.Y"]y ӥ=U,[6qSJh0}4ɪG#h%;w=^iIib48yWG|qmo5XI#Ol4a1`Žr-;x/hAvM41bH S]EQ/{^yWoT0Pp}l fQ]TGRlѢVEV?oWޕAf`b}|02.I=4EGhxtx7 Z?#>>Oɀ=zsm~lXFZQ 1?`7%h&(iec89|= ذ>V")M,@cc3ܷ #pynQmZ&8~ȫE1Wև4ct$;8 $O0Y0п'$otͱ&Tq(-QXN5>1φW1ޞHNTiLB61c9Ta}*L ?wgZłM4@>DÓ/5['iw``кH|WQbrL]xпf, 81sjl BBQzHOYt a5 'W|U<{-%z``)b-a1r61sN&qMcBݗ抰Z Q~?mr:5p9Շاur\$ÿ́mֱjc.8ljq1k5aTmL}?&G=ZdDe>]*^N&xෂmg{la c l8#\Ì-Fp|-6W?E1V4#˨Q&A>n8+<~x 8^*xFEA`%K|mgc\9qF \(} ' gQ>D>^d59-gY#ԏ]7ٛOc?7? ,8&8NcGc?ͱ;8fνkY5OkИ<=Ojt a=yk 8</@ޭq~*~sܾKUpBq6aqc9&IQQcb'lמMa9"N,uR'u  MpŹ F-< %ow}}ܾOO N N{8>`{cدs8e9׶1aD+_[KMirD^xz\K9>g8p [\ְ& GaYsu=q9`^s7{'g`x[x=|.gl{}Os,9jozk~sP:Jq9֫x~g&F݈Z^= ga?- *{]5 qcqco:\%s~I5S{5Vl5!ήNB!I8 ph]817Z7iXιZwFpK=<´f;%Z~|B ֫ ~8#Oκ#c. Gh81qs7נa>Ek& ׻"jעt5)a3Z+k78OiVlnԓOU4GXֺ5C| 5ڵԡԡR뗧˺1׸^~=_}{Ƹ.>visu9~N o(?7SDP~#+?WYUFsƵqֺ}q/CIMQ^Vm'&)=,1Q~o 4 Y5sF IzXMt>I.Y{oZ-5 &a}ߨTG&a$>ltw#N$Z?itɢOiyVFdASj75UPxc x+/g7x+.I,*f.x++I-OOIL)f2;x++I-Mc x++I-/+I+fA$x++I-/+I+6bH_ x++I-/+I+6fHa x[50@ >6;ȠY?#> F/K HF8D"x]HQ3;ZIAQ/ahHQIAjAQAXYidE/ERZFDeHF\= ̅Ïa91v_NHg {%`"Fψ^z 0\ r}umϘ\p#ʿ 1'ʮ‚Dž[E-/~M~;Sk‰5S'B+  *i(`[e)\/g7X3u vwG*4ƪR ?MXWjXWé r j \c?Tp9)y*n1놊 \QT+gpPq3P[10J"*vs%'yvbT{pbnyF ":[NDI cvk𥉉2z$|P;WB7dhr#.dr5Qe$X^Ʋ wg!e;ߡ #P5| rO'n'ZnRU D rˉKeK|Xar5^kC8^eW qD?yD2sÍGƉDŽˈ1KsՓ|v\ 02oê*B5iY'[|گKDY,B'~ӋtSS8E-5j:ԟ6b wE8qB`` NIGnnK=$Xva:J1LGak=?flofy<Eǥ^]#yѱ|% Kxӿ]0[dcAAmi a8`AcC 7'w8 茷;3]cSx#>N Z] 9L ڇ30P $dh6T >k0=cp=JwE/~aۿ`ğ) Ӌ>wwp'C$&β`߹o6 2_zxf{y@59930P $'oAA/.cfXvg ښKbwXtxŝ{tŹ' IHBn\r{U#X@ ᚐ""U,iOJŪr h)=}~3==d-Vo7޽x޽5Q$AB__3ǿ?}Gu+Z#OLdrI3B$z'խfnmC4d܆m>~Γ^mRrIgg7yr ZtGKr,iNj7<톴&*!8C@dO{g8;A4d6^{r{h~VrIVwyWOV9Dx&*3p\\Oní8f/5Byr}WFx!w%DΔ]sO[n"* ӼHw!t=+qG8K]Uz Wdp(DnIT.wL>ēkvcǼؒ\ R㕵ʓg=٭Q$ o{r] U-zcβQmE\Jt~%08][f\=gVDi{oJ.z"O͖Dru95LE˩Dga;OKDt=\APy}FT.b*_ibACdvɕzS0^C*WPz] "E@ܙ`Ogg[qZkUyh yH rIWu YV@b[Pr=ɕ̫AD3>Alc<:;\rs'`?x]gDΔk__7'u8ߜm}CG6ubs]獃,^}ZW+^iN48ئ}9}O?O덃XV.yR+`a[uc_>DyjV9O9wL\OC%9"6O.s#gtșhb/sYLzP-CrIL˾`krI_=%~ct8Ֆ﫞} gy8,&*`ʮoLj'0No%**}_u.wfhrI9}D <>]b%9soF ?{3\ S~tyt[rI߇oTDQDg/5Bׇ譑]#Yꄚv?!5R|aCjQ$>9_ɍ$FqLKI=Gwo-7#%92=xmn"F{(V̼ou)hqgޫ\sm#t?6qp}KW~xؑ\.N(Di%9gW:86^~N3FT.pQt@3:KrG8x%:gɄD< gOdƩ4'4Aĝ.wjPQ$W[׺w:)d]OSXܱhx<KrS8Sg&̫3S%98d_{O!O%9!N玡SfTbRY9{ u)d8x7-}u<@T. ӼRE'Ё\KLsǨɢBT.wL{#SDWJT._}*oJ)SޔLT. S՞Od}"1AS`l"K]uޫ=QtO"&qpg">yvÉD.n8DLq0#m}#7'4iO&*pyoGL>o}&A$s=]O}G't=5K`G$%9 {$ݗpE%t_8Z[¾W/A#ODrI>g/vR>]HL `a"yȾWѾx|/`uy6ep{9LGl?9ډċqz?h,c:F8}n4c!%^1ErIn3{PX.V_iOq=[_ξW{2^gT&y8x3\W{!N'B2:UKr8x}kXym/ >&* 9}ϺD g/&>K D6%9[8x紽b>98hy~&S?"f8Ų9s ՟Cc9v7=Vız?h`:ggs }n4~r~t}O )eKrc8ӼC6guLb^əl룽1ız]4.˲>:ϳEY`X˹%3D<ܒDac yl8Eqp}WMYsuTrI>2}7oL0nޘJT. h>8Ug,`9:/qq8\ SѷN9} %9W8,9^[1\ sT<9S%9x IE4&M!*L n(ZRW@T.A7>/n&Kr4^~5<]r'`R':&_\D<g<:/<~wi>1O,hE<>ItPKrp y_^|21_/YVfgL48g;/T Ot7wKw~_4L1h˝wxQ$_@,1yd&*p\ތg8f_}rl<"*` Ȑ}цs85K8qx-N-ZtKr77SD!Ͼ~%9)4KӍYzgЫ[gpyurIvrf~^%9 i玛קzzzq,uy_S!B53%93{wBDb^ݙAT.ja~9 }5sEf$*Op:a;^lg+8>e7tas8]1Uޚ! ϨfKr4s?!D<<\oÙrEY]TAT.p\{VrD g_yhG ѩ\gåF.#zjZRW\5Xe,h罡z]<=XEl}oD }oh2}XX.,罡u+#zjtUq ?=\9 s b`KbtbK'{C {>ȳGQ$w>.研2}2,&e|megV[$~|4rIJ8S.s+ D_鸢\ S.N XD,qBu>w,8TCEB]OCXN=Y' z3 ˹=aQ>U-%99kȓHQ${^'1~x\-^tĎ"4bG%Q$Le[(&Ls#*o+N./+NKr0߿U]'V"ϬEDg]$#1g%9ΐٿ:ywQ$ oX ADLˮ,|Kr0d<: 1N Kri쾯R#!RKT.Rh}{.KD ]V<_~>\Y x}ߓGQ5Q$}~唏^zǛ_X!gd6[6lP$6p쿜}8E^ŋ("SX~|Q:o\,]Wr?w͋\`ym|"*)8s|E?rI=T[,w\ ~NsnퟭB"h3^Ѥ!Z^ Ѻh<[/rs2v#=' 5;8SrG>bSaVH0Yx)/3Zof~}ڸ43kvp-\;~ckK^V ѹu0T v>|5S?GT>Ӹf/OܞO}3 |~(ukMy)GupO:dr4뇖>K?K 0s:>[zaf/ 2 ͼwo PMAfF`"(v.CsR9k5;X {uJu::tfv.gf.Z;Ck 1ZkMN?40##7F}qf 1~}Wjj?ƘuX։Cw]C?eϡuKQ}ZfGEwGo<:Z+v.Cvת4uL {z5RK⫑:f-b룻M_CQf 5br}R?:f-:|GJ!:q_[Gu(/WΫL;kb/]j'j5;x(8׮7+:fӸfrWWTYEupJlrܦjM5j "u~hxC5up{5;dۓagZ-{v:NV3xYgTUtn?UUb;i?n4B됻q)AZ wYM*c&0kv\hsߩfF3w^w{yJ0kv&P;G',Rwi\C ii\År3 if18Y./}͋oLlr+3ox$uei\i]ڻ/U>}i\P.1ٯӘ0kv}@.}m~{̫Kq.vҼ:< 0kv]Pp'W~ e5;8ڶiӶ<~\cWFgǮq{_{ "ϭ5;.O7'J9L<^ۯ Ӹfw…旻)JU6%5; .Tԑ#{E}V*8cxҺ8jE`Ol}tM<\f`孽*y.ocux&{{neP=꿯<էTi\3A׮Og-iq/{ՇG޸i\;.R$>:Wrk;f7?="$b&:x1)qk?*L~nfDڍS7nLQh|#%?kV|_?i\B6 h]4LѺh->P!a d1> >|HxϡPD/b LH gΙ~5P=.Z9=֖!>iM~.N霶IE}==PYrx; @ @{wokJ AXgAHDpelllzB["/yuM xA 0 ο rΣύoύU|ux[ E Ҡ ܓ#ZBKr܏vPړzқyS5>~CsQ*WASk]RAq߹PnTy ޥNwYk.[+*pm+| [9q՜+.o٪diWȦ8&lQgm%Wy}`S~ xc~שWEQEQx,xIOAċ ^ԃ(fP8Fa .Q]EvG?@A<\8zV@~=SfKt潞pT*UY#muU8i{#&$>'muoӷ61㤭x[|k_k8i(v1o3Nօ-+׭?:jUcR}+h4pVbuǤcu8@4`5MbuGSlZ[l,:}gW/s̢}[~ncfхJ3.o뒷g]t`' SuyfqqCCu 6ۉf?6ao3B9bg8j;xv"0ӇJ/ ,x/%ir~TCuWwץ=u=>*弳g>{{׋}GnGyg?ӇAgC8#ߖl&pug Wwpug Ww6(ґ.մ杵ՊUOx F|wfN8$M4kJ" .DKdž-;3'[=~'1GgLޚwx-1w%i#7޽v{xe],ޙmm୏^L+xs2zK!j?Oi{ǼlE/K28owO[ΌwUoC~ox{ݷoxw+V-ո/KnL98>gGptrf[_[z" Ugx РOktiBIoST4Wxgg^{|o{zOxA Pჹ6P+Ƞy+u^ #>s@:܉urU7$vX8i᝽_U8jOjhﵓF]vS|wę:U}?u`0 xS{-y)0}ѳX%*N03g` H(*ߨ xr0֙{9v//@ ͌ta@{aW 뙝+Q9y-ٲ]'f~#WJ,lZRfScMaeM-0;w ~F强-@y+^Zw}|_YygQ9`awO>.:pmɣ>lFg[6Cһ/8̪шo;~_7*|?#?ac+\7X}!+X >&w}cXMƯo[дToBc!Hxfeފ~3XL)0 &8#`,ỹ2Ie+`5*Wes$,婮 :` lTVvU#.wlMɿjdyYޞP4,99αw]yWqz-~ϿOgǮ4.+tRxع 0DQ /> ;T.|ӧzDoG}˷JI۴KE}1yhw5==3J̃nxteeworlds-0.6.2+dfsg/data/maps/dm9.map0000644000175000017500000002002112140200333016466 0ustar felixfelixDATA + a * ,Ll<tT4lL,dL\(l-DXq~IN x ^  `"!(#(#(#(#(#(#(#(#) 0000 0 0000 0 0 0 0 0!00 0FF0ZSS0|]]0aa0dd0dd <2, <2+  <2- <2- <2-}d <2- <2- <2- <2- <2-HT9 D[? EGBODeu "$#'m%#''pD#'m%#''pDJnG8WD#'m%#''pD#'m%#''pxK/J,.Mc%x*KIOJLN//KaFx*KIOOIL)f1Ox*KIMc x*KILI//Ka?mxc xc8ÍoLy4@  r@ XP@B0cxK6?hf 11 ܔ! `8`AcC`+4~'Oxs Kub\Y{yg| !{_ @I $KA g ``@&QxKk@Fj+gu[Ĭ-vBp &)'yD"H$Dwױ]q\+ЯGn<\p aN<IR0B#lgAʠukp7qkCϪA :̇j<b7>7֎g^zѧ&7㥒{.>ё)RS ’sX/9RcW1x}@txǁvBv1#X@Uf;ycRd Ğk1YCra?>_lDž@,ڌ8̃ؓz\ E\BЉ.tC?3A=cG8zT5%kрF4-ߊ6;dN*?{eLЀ4!i4Ε<.g1JP26=ȢC&W=?}D ttHU0>Rtd Ld9̇'=>{2'у&!MC̿iN~9^#zьR:kzs9!(oc߳UjC ːqFdߠ2doE9g#h 氎 l^Z,ކ dQLrV %ZAϱG:KL^LtαGJDLbY:=cT:ݘ|;:<9:]wa]W}KQ) -x)YIDdG'ƌqΉ{(C9*P)(@CE=Ј&4[ц$!d!B7zЋ>s &y% (ILa3\{xȞj\=cq +X֓xAA.21dwdTNo|5M:#f'Uc/=9n.╦ےØ=lc~XS/5JŰEM:l$ʹ}NڣS;}b|%f|d7bh1EVlhnkj, $C> PhU'XC[# OIQZƭC"oI8J}rq SW'|n{c? <>x162g#dj $,nKեY@|!9.{\''|oC;_%􇷇xn0 @M4.=W,BIc#Ev/$|Ɨvn-=n^"GMԣ5AIy ;k0"=}v$yz&w֎F]]vT|sh%vRyϤK"g%q'k=;!qq0F=.|+VRe] c85Ŝ[zp?˽g<%,cEo_1G@R,C0a„)<15OF&X/ q(r}w!.c1mV~.Cd/ndzܡ|qCZQ9 NZ7.q%R{/(>8jE>T5hCxaF~e(TOQj0QEJqb-u-P4Ќ 5Iqlb+u;:"B+t AR&1qLcFWQD>ǙGv47?,"Sh󳜻{_÷HpE;КY @3HΗ f4e{R\T~׃::quU7ATIxc\H*uLgJ@;DML߼(6j=DME\/xM /ޢj&j0N>9BۤZ3;v!YR<=Ϲ$y89{84ҵo8y;pDܒ~lkQÐW-~֥/GʁXk"Kr~8r}:"|r ޓ1U84xV@E8r%="Y9{p\vOn7ox ]:\:\x$RI?2D\*i 3yµIKx߅\=m~NG5pDŽLXZ5+y3DJWL} }YpSvxYKs0^%!8@{mzK&$mmZVfƏȒ}i@Ex3wcRI]&yGytN/> #N1򻸣o>x|h;fﳋg/'}x)Ǖ=8_q-92VWYyI`Fmy\͸w;q碳GnJ}4yQ8\<8>5 !8\ڿ\w?ل-#.=*i;s!_5saB}[j  )4.Yv8o='e@AC Ͻ/Ng.ggC~C9Ga@sf>(<6$&<8v֤oMzxA 0aKS5]y=@eBѕ!Dtun:^#^krWԱɡW*9TJ hΕ44Z ͇N"-<;=3s{ s|8sn-teeworlds-0.6.2+dfsg/data/particles.png0000644000175000017500000013716112140200333017050 0ustar felixfelixPNG  IHDRx8IDATx|v$}i8_b'N$&9$1`l MHB; t!zGқMQ}v۹۽~NvgvW<3;oHB+D/^]СCm!<;vEEE*~׸_%ż'Qyp+<+ysk:F2^j}J$:mSċkěD]״=}D0<[RR ~|gϞ=^zxaog"=&He"^P^Hb(&.V\n^w@CiRѣKL ++`WN;v}7{X"W V Slo&Є{boU>i|B;F0-$2f> c6L-ˑ#GÇ_;Ρ|bB4NF%8on&^H G q] P­8gΜQwO:Q<&H  U+ vGkV:?XTWcYs^[uS97C" 4  )fp)7[mjeyJ88vĉ-^p ErW5PD578;i=<+nX@=  v P"d=ʀL1mK4&G'XU=+_B gNZMch__7@;~CO jD-n[ MDPcxc󇻡,(S&^ۉ$C,qu H .t'.i^爿uҥ P-G[b7^_) 4Ih ܊#&,8>KxCٸF,H̃1n7g2⯁ހʹ'_'i&!t.FäQ,fjxdI x+N&GHXu=;mC@PF߿8mZ+bY(3^s uESz4 v?'NO?}[\W`A9zR?gY!~9H$[aXn7ճ<ū>V><0VM?n ^<he-Zנ}^Lb07"$-u/LZkAȠ\I? y/OD?$XExM`} exv'O⨉K,,q!!D-Wd#tz`'_Ҧ=G7Øp?[zo(} 7sXK@DkJb9oV09gL*[ѴQ NNpkEE7961&_I"Z9 ba_VP0][G(ұ~LH=<4P9EEc,^3 ) ~߃>ީNêo2זjMߍxX ^L^_-PD" "Np }^Tc`CZw^T$z~[J%:<ߣr֧JF+u AJZ7pb xlp`Q'i9 zD ZC3@m8s"I,bȑI/%¥|k%.1cngV0S{wGw3&5Zw;"K%^K饌8GT&ƣj3+MC߁)I9Dfޓ6uF2$a]8&lȱ.s@T8sܳ̃|O/sog-禈x(VGĿ^'71IQיZ LC,Hb 7!: Xqϋe160S~ u K0\oϭpk?1~C}`TmY[DNvy po 738z.o_sM"jaX0IgaOU?Z3|`48ZK5\HEs !I$~i>C"0>o,l/P`1=y+;7 Cj b_3K-MDY?>ILcCR?I"WDr?m7@(YC$~ \Ip<|+u׿V@]@/~8X^{_X"W^}U7b4 @83l~V7P'-"#/DHb P`>̭aZ`(yV=<. rXu1Mqtw~K$&t ۘYb[^D\s/ah¦n<j41#:՚l qL#Jv'J} E@}x8Q{=׿D[Fsoj4T`]ݙ;~@/E]T&@"Mnv:j\ xɜoS<uyC\?( v%~7G`ԩ%8XY$EL"fSc؂^LHe `[Ѐ@OJd.]).D $nٓ,씕.& :^Ҋ_Eq{C]P'W⯭s8hzS"1[3csBwtz}x afQ6U)`H C:P 3I4pǀ5`]~aLG4Lkq!H|?Ԫ#G<]f%ipҨ6ֺGo :bUo3ܯ03bwuJK|ne$3Y oFK& Dr<b[a0NZHGCը-&8ǃ]8-eF-ecTV녩{,ϿmKzE)vʁXNH"Z$A;}M'^E^{?vfڐ }o `Ӗp,L*ivL;r?:E2j` 8یD 8 |mlHiiy:̃j E%xX zPg9L|Cҟ i62yc*7UF?[s#|h=}A`YW*ãz$%g@0mM~=Gn2_-@Au7Ew.l'aZnB=9v}he$Z\5 tP1|| z 1 nH eEmPmSL}ϘE t dcw+F ރ0a* @|̤'xah ~MpJwwX}piCDuqaB](|~ >rA :DDY o6Ik- USjk xqb0rw"+YdfJ mO0~p 2}mc8 )\be^? E'J>K{u~el?~@^y ߯Hb ǃi[oL< w/{5~.~7Ol/hr\=Rw)>5Ü< YSoCbkxS/ #O@8P"b! N \WS"Kp! '(`6{FIt!~~MSgo^NІ']wϜ95;pyɓ 0. N lsDbzQP=%^''`#I]!/Ţ$yds\Jipុ(f2VWW+/_:5rx _!1ǍN +7a}Iiԇ}Dy,?pz[ "J ^hЏogP'kŔcwE Q ǻx֕zH/V! xaoDh7g5pz 7_/o,6n?^ųCR7ĊKƸm{FΝ;rY .(|rʕkx?c|ψ7Ply V<WM3w Gz$5V Y̌nD7-Dvz@eϠ:M:p7|O5ᘀP܌vndf]ti%!L.}a7{ý0 @[&uGCRwE" D7]Tl*HD\0pLaxLi7JeN5+kP*pL{$7p)BxO3DCXVLcTvc(OC &rVcuűQ2"8!cYD~i$Ѡ,i4$pl߼ncvyDz7K( #.C D$ /n^~2&؍'>68.hp!tl cmha;1 NJTBǏeh@0^=c)2wPKn7eUD=;S8fH^B=phBoWjsj @i$"Ix SPPA.ƼGn7x.p.;e{VCtAKKFRSSټ飯{Hl@"fȩox iu6،1a;Ԇ:Y49. .4:ZHE3~,P &V?*0oHD-k_Eݫ uCpE۫ ugVҗ!Y:;us;o3w'8~zz8j;cy Z\BRHx fn7. n;mPD9+SPCgN-lh$-xl@^Owr~0c^HD`22{NVu-**)zC49DrG6:W:ulo4eDg@pza݈mߪw۸|fPH^Xqzb,>lZ1S}-z~ aCP7 'oNE#VNa=k4:H1۪PΆV ɮ? @i$HxȊvnR2ekCM /09 x񾈿%WDXL{ J E cnj$oذ:uJtQ=P' u4muohw"Nx4-%jo*q4$=z/>ccE|CP7Xgrֿ>X8'UZǢ:RgI A H|ElC]P' u4t_]V7A!FrWևNwJ 6 %/,,|PtgdDܹStq=P^Φ|]E u49l! PX BK|˪…9hS . $(۶m3ҵR3ʗ :|0[zuWB1ŕB'D; u[)5̙3F.hs <{3Hs-ad-f^δŢCϥV!tC}P/[d\B1˺P?OD? eGLul)k2:' oq D0% ^D(ޥKVRRªE?"P~Ahƍ߿@e7u4… F*++Ξ={EDvUQQP#:zԿ/  D Dy](׬Y8SPnqXgE#eeeýƮl0 LٳgXmz:tPtVXa-[H I(?^7o>O(YXNQ\&zyϧh/fPiKi&u<^QN6EXP=;]5ʊ2[`6˖-SM֭[1c9rӧOc=Us(/ʍECʕ f(`.\(ʉ(?XV,O5=̇- I|a`Tq@ABPNFk8CP ʈ`5dqk׮U Ş={TQ9z*'OTFT+QBPNF1׭[Ƕo߮qcǎŋp\@yP.Dym/'i%edn"2cP}(K ɹ-, Ѧ[]z&ʁ\n%vl3{P6sП,ATVXƍUA+ mt5rUG&/_̮^^;tC xy|~?qp<G9P+{`ժUKaaz<`osΩ@P*=>{>a?8>ʁ򄪻oGz3.n6nx߰ѩ Wk5-4؄[tջH@H_Mm.SOK( `jv9Vj^z5[~*Lh#wݫ^;t39|ͭzNog P>aJ`PH@:l~`/Fy @0د ?E2,& hghhF.RT JhS Hos<-qL(5 SQnߌ9 // K11;V.Wrܵ&@--!5ZhŠe[>>xB Zn@4q86_ Z-2(_Auqj FGZ l.}[Wv{cXjjI/ j5@b`zY4gIX8f~+b^ pݺuFnsT%HhsȽZK.l-\*\L㕥s'3pNs xn]̹ .赀(#h͏1p,^P7s}Mb:foa|/\w2qH(U3/pˇk/P7s}7<1l*1?ڿd|жMkֿw~tYٰ=ֺUK'`Ci$DÇy<5 "9꘢DbzWa~֧|3,bnB\߅ gilWn&oz#ZQح@4֗-38_@&U{W 3*J $WPP9R5)\{}θ>_^ۮgY|2N[=j)Έ)fl"'ڲU u_ח^)\ R""=Z\BH3.@9pXuF)ˇeex( L<Ȯ?dY:0v4H @B @iiSPh{/Di&+n5O5CRLv.x4Λ>Ѧ#hOIh`c$篢+Pz\e}ݼugҺ汝˅6YPv!L ~ @Z_8Ih#ɬkwxh $n @qc@ NJ0Zc\%n՟KADgvb{W 8=FGN $0ʑ#GٲeѢevS77Aq ,H&1(+8;\\t"'eON77~)C K@eE=4h)cژ(GNJOKS3ӉZ:C&X(g.oHuId0 aÆ\;1qln;t]:W;VWep*#ϵOS0:10tÄEWbSDNhv_!qƲ~`28ޗ)85ZO89 pLSD9E ۼP(& OER%`f" PAW<@be˖[n=w ľc\;[{cp^$Q[ŋ-zZz^wWb_')Pϵ=N14zpaL.V/JD/Yt0+cޡC۷o߫$]0E]ڣlܸFz;|w]>1a\Vjժ3^PZ7/&.j׸Za<{^wO=N:$-V-u֭ZIx/Yt4 B⭐+ǎK֦轂=7o w >}c"A¼ ]3=nݺ۴0fM5z}^{j?} [8?Һ')&K Es1?Z +B~ @pBgw"5^$\kwZ_{5_[|'E{ ʺʬqKՇYtx}vs-3h۱Ѧ~`=rwE6l z-cǎJnݮvCʺx1~,r{)2 )ӊw.uR%^xy+b}r{QWN"qLY8\jBoOp!gX4ѺibGRTĺ4`fO!\4F[K /Ţ@iڵk4m4f @oXѬ_}#ЉUiV꠾YEB4? Fae@ $o%I3 f8 0;)\8 >/_@X s,&MDytDNj7Rr'dgd8 @=<pp du묏?/ /DHܕڃFI)9K?uG9{i)4'@5 +K&3 OFM!'O#|FrZo>ʁ黎twA^o[Dח i3rMdn{d*O8 ag.u4? m۶jM ?뼨H-~h}uFxR>.U jzɩ+Z2̤ej;RrA(nq>8)T7Z+f]b2$*%ndƧ]GG`މk?A=/_+pZD1E ˞.p1Oq>{5nį0vkjJEy4S6npkZ0U# Oo9"犕!9pژmeO@div9 I9/6J!so+v%`4d)Xж%qhbK !opZc<,YZw[0,UV&@7k#[D`B@s۽-nй7q-`GC->?SjF .uj6ږi]cǎU0eN @l ΏM΀=ZOݲ'=G/w6b2zAըE\h'P)shbʚh̞:BX- /\}SHXE?ܯc| 1qlLv5=s[DhQ4Qe]'`;yo<#_oϪPF(n4e7pZhZ4?Nĩ9 +aQ$}~$BH e3Mp.Bq-*74Errj޻ְSVVMn/wiɍz)-Zmd<-fg8Π>a P8S$afZ}jBp~ppꠅ " Bq/ 9 M|@nwy{\G}I!k<eҚӄ i{|6k6zhݕ!YR麠_G[jgv~馮vQ>+߻.c?K 4߄VرcDŽk<5w\uq!u4cEM%w6Q?GNOXo XÔKh7N+LM {پTmͮ?-5N=cǪvz,ݎGf'ޛ4-=_2X?-\*\d W.F1PM (- (j `ڶaGSMYHM'HfitPa>@OI!)p\%i/U0~3鞓v&R%L0 G uj555ժUkZgU͛>8_ul4"1.~E,#… l߾}yjl&~ݤI -^L\d3%[IjSiДi.q^iSa,};׺0w6h!_:&oOt5z8E [@vg":׈!h"]X:wXh[I LPg %7&&/K 9^ЂG~{g߻w۷ Yddd /o${+Sdj6N4nGajΟr(kUc\Y Rr*ca@7'q"g%z?"o vdaFǝ9y8Kh(^Gxu4T !Mf ,rJt1}Z]m7xZ=`>iT[co/ $nNCGu#lq1w= #Z\$ϵ8vt?,rsIYjȥ`0z)3y8#Άi9X?/72N[ AJG -~9&8ptlFm0gͶmVi "|HDD)uC-u `VK _&D+KYchSAvvEod ȩ߼w -~ы'?E˫F`ӊY?tzK.6s _1?oIda :bUDd]C+Pn2BS? To6 %aIW7s_˾W+-RqG✖' 7z6'׸ZMHdjV^hE#u:rP^^z-d'1bn+tM9?~3|Zb!$ Խwf,D@pdu/ ޱHpfabhzaݻwBuVu5B+nٲE߳g:Ig,k۶mo߾VG/ 6Kd~U=?.\X&F iԥ)9-z-QLԼѦ[ᔈټI_ < $*'q)6 ΀T1V4]v>-\Pͦ7yduCN7x`6dÇ1cƨs{=;֭SW+**Rc "7@%]!J{k<;V&.H{=']V}X-^ !N"5s~^zIxDe?QVVWZ8 B(k ߿?5j1c[ljJJJbfE]5{ګ7%p#:$\xeQj -"1 ^̀QN[`?2%g)huXZIТ7o.Bn~,6n}-3שּׁ,u]j݃?@dEKd& p3</?5)Cj;wpWޫ5-g춸\$\CqKi}>"z jh>zv{W 韭8n΋h  7|aDtCE9VXmVʫ%0,Q`U>L־y7^<>s0PQQ&NhUۈdz)9<{HN[Y@F O2M @*7UI#o֫OC}̀Ofl! L[Ue66hwK5tP" :H.[kزH_)c*׸GBF\4 *Z肎Ah1Ώqyt;5iӦ-RV&?#FXX*dz7SD"b=6A(nѺ]r37HɹìIW5nqG.`/ ~=`8Ӝ~sΟL=B~~.vପe$ۘ KOYYq鋎⏔ X@E'-" ` a 8j?-_"W$"3MY | !7nҸ*覇#ba4]:qxѢŋ]N 0 c8pjteL"1jԜOfz/RXl>taK Y{,rWfg>>̐gR #7e J:x}wVf-֭[ߓ@Rq$"‚h@cJ!="ǼǏQ?tu3N@801`aRN?%8 =T?%g/G``_h*#$X%Bt+ u?s_-_(N ߛ Dm:Z׷j=~!GT=9zvءaÆ2A@R$8D_ު\W!uX, VM^&\EdƸ+ zP"D`'A챢n 룷[H I;рcAs a#kDJ1}${j>14] 0HXO>VZa{ø7JRj˟oh`Xm^< tBqC 7ľMVj_p\I"j.L-*E"4/j~@(8  sﻐaACd+ ⯃U VHY 5 PMײi8x-)%g~k/4-LjͷZ_JxzvqWRr[D? N0`J I,; d5s~!ުE=rHUbEu @Jbxh'BJNzԛ4d6)gYΖ` >7ރl1k@@4wr$p'H8snb !]ܱ [`xĪGC0gXbv²;K(n u ⟃IkWxuTRz'F\Y9/.d Sr>dBqDi~BTI Ij@g#ǀ+G@tn/Y2vC%!&,z =e1)Mnp quPΚ$F8!˺ӢOefYcAC"4$ N E n@$ATUV+ _@}?PbFfGX#Qkp=xh=E}x30u02븫 - ' $QpZ+nj"U^-ds‰hEG L %Y `"`O`no"pwZG,b4^+hN jC8妺4 *ML(ng8MI ߊ[H Y0/D~XK0@F efke2E j'F{ -8uTV~k+Ig?A(nwK$[ f0h {/ф(Zeq(B^t!+2 5k ~M{ꫝF^D<:xK26"i;+7;LNJ(n HHGʲk4 kׯ帹~1G\A~ c =} Y}1ͳx=-\#q*Xs⯃<(k4Lݩ49BqE]@D[oeE#Ef<Dټ.UU?DwڵTϪU^ #рj~,Y2 :DI<:; k r{+zn`}/zO -u)Dv)`f2d/k+,((Xe g I,Κ5˳釈c0e. &2uT y3=D@-Vt?_ȝN'BqG]D$Ѱ{N4,"Ɯy ͛ke΃0c_Y쇤"?j zj%R5èYq0v^մ'>cI4S SW5L cD?<$I|cgւbc8xA8^{QEr L2Vݼήs=J; DCo;jrD8w#;wL $HSsGW8"`{Q=Гaer}Y-;5~ uܕڃFICikJ'Z 3PgR^SN3$Ip2?&͂8w\X^V }f0Wf1g {4!E:RAR^<+Gm:Pb`J N4@#YKw/~Jo- $~qf1A_ɀr#s`>,ELc{Q$ :ҥY4L]ʰy/1 ɘ0Az [AJφD(={aFF@ V, ,|`e@?c`-ZT^u`6CNNY![P!A{[wވ2{Kl\iW0 ~H$D6l7m۶fo CvuEP@a`"Db)`1)V ^(M( ^j_2 HEiw0@4aJj?*{$8mH8A\0he3XY,0WGv s`jKKKsc_xA-!Ou_3C$Zbd @FdFn9ƞ:ajJ-&$p2㏘Eʓo'hy[`(&$A\s`{ y O^dx]&50$vq#,q,2hu{6&GBΜ)R_>\8Wu,X`DGcǎ,G-f\X̸~ ϧڹ=ns@^xr#8fU^ ߤ#R#_q ;_PWs/!p' ƥo~R7c[ǁ& Bd.?$ٙ{:O=/˧ydO#|.=j _7/RNs!y>{DOnoՎ^WvCjzWo/䖊g9pl!95Oxl/:Ԏs/dT@&g.gb >"x.aŝ_|R E)bܵ$sS3^WK[[/\ȪW-|igm<|ԝ^i>Zn_zG?@8ٞ[x]X' „GDs=90k֬B}/Æ ץ{Tquu8i_}n;OE\CTw7k)GS'y:n+:dNovclҶvu68skS}gǁcg4xlqy߽G6񣮹k1Ogi_G}M1!M;#n)"|ę.0qūԉn*_}ƍGɛ<Ύ?_xᇛ % 'O.TH+}mvd7`nuwoڔz+;Ou~AC&,(~uZ;PHܖ@zu!PG}xpyիW@=dgx9s+)tߊG=H@sJ(B%WclGW3{cfnj׿~ EmEImԨQ(Ĩh=GQ8q=VT҄A܇~ꩧֹ~nF?Q~{L4i?~}r7.v0^3?'/ۉ u9g<ŹJ| ?RZC7*dv|<̓Q<||do?Xn]?^ΗHH߇6r< ^m w} ZnO] Yf!ϭGl@E}Gl>1:>%s_{5zF phIy<1h>ύ=#z|E+<_zi\EN+f> ~^(rg;w OUYX99/H.ZQAN"p֬ߣqA^";Q6WyF ?y>=ď蠗0a}IWB>AH~n L@ӣ^jutToL*!hmd6^@R'mB:gPKP@8K?LuGPqѾGG\$.\hwK|L\<ϧ/_n_q ?k|?pW?ȧyŋ tɷgO@Hkz0`yvg9ů69ۨ@϶إE<58~O JE`>|x^ ܃BgHQ2&;wn駟 |f,XsS_`ss}*||`ժU᠉ߘ跘\@N]ԾnK@pՑܵg-<y 3?P;v2مՇ5ȧ_ yraϛE6b<x)])'^|ŗsS\9 d|t#DjÆ =wgxb*~ ($@ATNp+# Ln,gƌvv<.Ox~~.<X"dɒԂ |.#x>=L~?Or~.@a؅gNY3=p3;;6t8j^qVnPNJZz!R19YLU򯦂@\u9O4x>}.\|tgxm>:wQ/~NI_翇3=èPUe O|[^{Wn?Orw; ssA/'~JǏ}E}3; 63j|IC{rq?$5y}>YTo4~~eMM tΞhg /ӑo^_K _/xzg%mKwF8d: :3\yUďr2Ou\JP{K?&5p~1{}3l͓ T6^7\t7G8 x܎.g{ | W</ݛ]K 76ʺ:{wz ^߽dG_P;4*gdPx͗;-3d_+FN_WQ1=~v:9\s3~|>#69N<;7S֥qr % S"t4[GԹz;9*T~=v̄t1SP %^}>_K&+"%xgv83 oy7wқzֹP{wWʸ) w職>{W_z5>pT~= U*ʄ}*.yHx!ҏFnsѦ S<YM9v A/'3~Nˏ9x2E?CP{?C&m2n;eC3 ڹso 망\~=o?O`iV8;}Ơ}ӧ@9"mObkzSo~ xPsJX,Wv}/}v 9p!5w|͎]zn (rQQ)|bVGW+)?Fu} G_yiu0 3@}Ws_)! KK^+G]{pwT?_)yP=W_ !]hwwìOf|q`H@sT?W=0|MeC@cd?bHgx`UV (B5Mmh8kb?LűDsKkPހBZm[F.`cHC hy7 7KqVf/5lUg8].͖Q_DsKSހ\nת/50v{/,?ffzLA/7$;2"{p=1ЃXʣ\SmOw[فakv=`/*tW? ]\@4To+P Ȑ)d.^fQf>6ԺTsߧ'vt{.~iMC\d51oޡX#ePހ “:%k c},:~R@i7 Lh#;<>4p@2. : W?X(ePހlkSњd{xim+9ZO[D o$k"[dBsGP߯P͝?GA]!@![JH͊!Ty!>je)Guj]o6z-er`cx?Av PI7 KQ|=]mb!MFQ-j>Wn[BP+aDkw)&;gv*"9W\XT2hDI@+ G؝nm]|E XW_>˓]SހB>yy-O_3G uVϮ4TRR`0gy MSހbdB@B\]}īz/|DKRЊ@I8c-z ^K*Ưwy'>ڥ3*G"}yoGrToLc>_P97q֊EgϹ4E&H2 \#-Ta¢wV,^RW|/pӈʝ28!`OД y.U89Kw`=YPB7 @EΌSXxR!FfKR^[#҃ +! 87ݣ2:QQb;=`UA0!= pK&z^EiDqq0 $l۳+Q-3jGd\ T3<1Z'ȉ<2Rv"z{PMyJsՅSq҇Ԓ!2r%F!גφBSYfٖplf%/QVMa㙤!Cn},{ֿoYś d<y,'O^LG^r'$Is}NȣTL],T^܋H8G9Ƀb֫@ac*A8<uc^ ٞQ1Ν6& 1ң7[F&9t'|>bXm ,7@ŋw"\Gb! &}Bz5z掀٣z % .spӿ_ !x<4 X*/Rَ{ud] [sVrp.Y~=X[_0Qc.}4Ŀ(~EiwBPW\N81'?@7@LBNũp0J:wcp$^",XVGRȲQVx(~J_" h (QY2Ĉ(H g\蠬%~ ."[Y0RYv }/F|ʟ{ AQVq6x\hPS}4RȒ婢<.w X~U gjb?ۺQ-,@)o,*2fR]-iu+WxVQQ\JN]0QY`E8.a LL]A4xz eRaĽ'CPlÊ/!u|Ds+P0@(o,gŇg^a7,&tW e8V]p1j K2I1D'kpFxx9OS )ohEӲ O,Z0r񙀩Îѷu%S[kT4]t!( .\t7!Z* #2N, "KBPD+'`NJ: @K20bs!\<X4${u,9 @K21Bӛ-0ɏxXg@Dyr;m?*K*25dy#YO"-?" @Kn񈌟RQR)~_ Alx%Fȷ#&+)g=Ru7 Eyܒ\薒 Y_"RCK qѓhqQ0lp@~Nįe }5͢1 vnX{:yvoKNwN?u%[;X6?o1=[voޮ7xM@)yP.%]s^%,j cKF*[z䜺:5XnJ⑫w5 zulK4wCMNK?`2;"PxZsǿBP[x| oN$;L#ҋt퓆+S6Dž 4o6C}*͌#_!eR@f_*e+z2[H?STߣ5:kg͍9O`a (xgGԊ%?BR4=Sl݇FH58bB+W giGG}]&pZ}mZ1ɚ PP/'1O\v.q27{V>9P>mk6 P*_X(엌 i'0P8թ.-zrcم>?]l/t B·;n{ J;+i'Ô?p<.Z2x #2hћW@Yܩ_FhE;Si羹K8U>pIjK|/CCyR+ Ё {kwNDӈ\B;dgYaֿpTYVKi'},cъE_֊!;) xL'δ<'vgo*h'LYGf!==xo0iD/y o|D?~.2/zYK |5$+{F&%u}=z3MPr+vu npd'$mWӓ>ԣsħЊWKh qBg%9}6m>.]_Cf\9Gi?F/[<51 Y@.,>`BpT@rr@KzXNQ VLp X%|&T<vǒ@lTF;}߉K^ A.nLP7qo(k7AqXIv$|ͿKM&i@H})iE?cBP࠸}|c^]˅^&a@ȃH͌V3#[NR oU&T,y A234Ļ|AqYdpf#A LP' D@~_Ax|Iwz77I@mq4(|38Y:]}`۟T V؛vx0E p&'|[ISzd8&';h}0@;̙kCP{yd$i7hn9@胙zTFwCBP?tXMhE;ϯ= AAA^<hԻDsKNZP&X퐱P+@M`!G0 5@t<(IxEp! .-;h9}d2z3"jq\=ᯪwr`ϓ 2hn!@YFT= AXL ?<3F=м&c/yN>O =g2cb/;CPp \S0OEc RS!JB`NZ9ŸqQG476ryT(NsoO ApIxaw2%ήC@Df4慠@,% bj aȃX;|+<(T z2Zdt ,A_׫T.2"2'/N&k@aϑ _!C#DUj@Rz+Ndmxy@R T)(]lObL"@e+' @)|s3V%$Int{pzwdǿ(\aC:-S=i.tGS>b,S0 [6!/ ;LdvT.Nbl'c@G`S'; X@+f f\p89*5 @!E.vF;"-aTTJnZW*;;CP4xPodN҈ 5(̝feB7xADHohdόw,~kB:ң1}goh@^9 `[҈f4yXnwb^;,)G$ qiD1N}pSzGG3윫uU_+M;adeDO7BKP>Wt:Fj4/T|@QШ۳mPS}4wLKqq'YN;ʋ}!!QtR]H2M]䡲:5"q@s4 UihUm$PTjy+* +E`\U(hr4/F@3{t;8C\INkŸJ XfYM]{824O^wpG/ЅgΔ32 j*'>>4uuZk1z͛@;Zq)ş@Ax_L2.}g[2hn(Ɨ;MBEʊ?U²x+dI.|ŴxeKTqb@ZFt0:R7P^"q™m1hN~['uq4wܒ&\87yDsK5 ;o"hb%4כx5zYiD_J5U=_XV!xFR'k{-Mzu֌G~j^THa͸8N8WIէr^ˬR(fчig~Sܨl?9E6xў2O6]4n9hnhJoˈ{i(8áP F@`waqMY v/8Ξy>6lx(E88Т# 4' (h4(!أ("Q>7cICJ4"Si';QSY/XQC40{t$o~$sh6mG8Sݪ.a#W_],4y[tI6@SAHF@Z'bՇ%?g|k d]oDsK7@1n@8Vݑ s^M C!(!V^|`꣉?nb\0>՚ձm¨:;N_" /4(/>y5ORϊxd "[e//]\H8@H;e63b8WI]؍æ4rS҈\bs5% 8A6WgaF4F?wv09bgIźQ-HBF;{XzR+nOX8XFn3 t$ڷ--K!ڊE;r+LVrxfD> aKȡ<v K@+!hs;CAWڌUD{93@(RPHɿ`љ Pq+@{E˜52A Ŵx`oO>nhUًW#KNh˙%$Y9(+ u}sr)D\6%2OI#:mQuɅpp)^=u.mgi幌D 6?r|ʾ * Q.>e!`:y5E9h ΄!PaR;-ntgSK>L SgWnqOY|,*E9hs1̧Td00hnŭ qo'm-Wٔ7 iK w I(\^~n G}?ѳp^z;w.u -Gٔ7@G@k9+BGגY-Ouqʼ0E!Z-ţK'"=iG4T d(o@ T8_6eK/ xvPq}{KSdz6"(<#3;![v%`*wZ% ^*W㡂/HOs9 .V&~Nۃ@ߣ R#~Ucr D4^3Br3K^A\@;\LM }x=+LyVBb_No~d /[z'IC\r1(2 mׅDyPB .x3'~Sx50׿Yb!  )x·L=2?@>=aN8s)tBA_㎙gnL*[ȥ~v@:\SQ9%kHp&339S< !(j}}x'yy_* ~(o@$>*oxIpp\FC•dX ~x]bm"An nGaPA$jtMԑtxI#>!Ar Ldt?Q^s AXs7u1aj WۏlP4Ey{rx?J^ d@*vԾDs˫mmP>YMߡb۔QBwtXP?agBy6X;鶨{- PHnPmPހe0B<3!Ϥۢ t kYLt1]y6WXק۠up\S}4R`De쀥* KmP:q٣shn@yTԻLC톧~CA#ت6]l'6!M4To)o*2! tC!EI?9!x{bEOgrtIEeCEo\DS. i6!DsK6“Hkx̀3cPoFP)7@%@eR ܞ{ɛ>7=$ i %R *Yު \A|j}`!iF#"Hŭ?*JG]>U?/y_7Tz;PAyTYZtaGM f\Yq1 pDkbXRy~!_HcmXUz[fūeg2n'xNJG"~,"OYF-Uu1(&}~]?%ȉ<"OJb0:ԣj0?xXI=r6}rme+L}cg Jֈl9;Q(PqG&=3_;y ~Mn7~Q3ym2:X,|:A^67&9 hna@N9bTp6m?Qq.5y\~h)7@`듆ۯP/d'P(;O}@ Pͤb&x*3h@G(}ƫdt3ݯƘ8 lP1?$ PmKψCGnm po1qM&~*~ASոIhGnWmpxnB@Ԋ_ԅ{;)7n? 2!m}|.a/K)| ɃJ Ʉ@qln?C&n+J&^s H8|sGH=))o@ؔ|mWecro'4Q,n@(o@iDHbGї>m}BnPPހ A)wn@oi?#T L7  cw -qwKkRހ+TG*betȦ _PɥG->hn~P)vѼLCgS-կ5Oy*I#*(Ky@ CO4T??<KsT?7@i$?h5tIENDB`teeworlds-0.6.2+dfsg/data/skins/0000755000175000017500000000000012140200333015472 5ustar felixfelixteeworlds-0.6.2+dfsg/data/skins/bluekitty.png0000644000175000017500000001326212140200333020220 0ustar felixfelixPNG  IHDR䵷 yIDATx]mY>P _ݡ-40MڪGUQPmjd)٦R MIXhҴЖ6!47i?In? is=;;3w3{%{9y9sJDua#lWU`';4Mi*AFwu3Lrb*N.i&TH&%'>JikH#t#}8TR ԺHMqg1'$ԣR"^E+HJ[E4ےuY)`&!~7y+@anX蒑܂6Dž'&.K/IqW$;xG&+'?78j<̄7蒑Ÿ6Džc"5lْ$Jμz);t,mw&?i6Y?TQa)]2E'~Yሻj81;[)<&0 M5-']2G ďQ$bfw]j;VHs@ܭ@{'<[ߦ(*3щY7,D%^S˯-J2w0亙e ^`S"jF ) T/(wf z]R FggC^u*7NJعCBF!I1@Q|DK"Tͮg,~\Ra̪VT r1PAkY @m>Pٹmn홈k+ T ic ]<{DW_Jr͍7&۷\TTIIW*HFz>ޓ|t"|[?.@E4~ilUd=A\E|W4s|C o­Va-Xh<#FdK#70hH2sVl_zf1G  #͛t uI=L%zn>O.&>~r?1!bD59jf($X1 kl*0잚} 4[HvY(4D|%\zF|2qy6{mF=m:|X-}:m}' @k~rp AcqefK.OJgL7(OYJ<`s$d+ K\<Pe{'?}A:x֒Ӱ_ 9L^}-o> 0#kuˎ{Tylrxߏզ,&GK$"Wm޼9ޝ|\:Cy݂_T΅ɓKuKҨ~DfoB 1b/}*~)+Ε(B/9P4H(Qh* -8RAxN#3¥Ip+R9JЧcȞ Xdڄ0h}LDH -?/ ? kϞ0!=J \ipb-4{_5G"pC9N<˼H]lp̵`7czt>yp953n泡 ^=v25ܱϙ'<1cmuDJz-j{"=G?;x:FuU30 &0jDnգt@0~Tg2Q;DO}PhXy:("{7~8Yfb6a:(@~';{ITHP^+6D`vwPX*4ȂTu-k1;ݳr`E @$)S@t_PfKЈ*B |cJ瓃RTf"8H5Զŏ-vnxm|i!ylL,V q̹WVR<}QWƖ9bΰN!bI p}SS9^ |"R}[03[kÑK7AZ?>j 4u_e"?Jo$}\D 1/ nd忙|S7'7~grˮoSxO&w'6nx2Q,KpRm Wb@H!@_E{m7#c-);D˅Q],:m{hV5O6kDLAchd9ECm\\Wչ?$ 7v\sخNAj@`E~ _1K!ȦH6r;4Yjp({bOۙlgH568hht׽g;#< Pq!~i&`\Ѷ?X[X@b `/^Tԯz91p0-b\hTwG ae|WNJ?7:)?F@!ŵp@z;ld_՜`~vaz#҃'^Kop !k(? XjiN -:pI71 x)?BFFV_Ɉ;&\?rnyRGs 9[RLj]}%#eA6pj_DcF6GwIvhd; ;Y[Zoyt$&W~ ,Q竱n)k`Oʨ_,Ps)У4|o>NL;>n[6?!r/N5 "~[m qp =G|vc#^ _B@ i!bƑ1[z=>g:g;yl‰4། (~`@hM#/n5 2"`5RBY쪏  '7+SMKGʽx*@?#@[`@D7zޱޕ@sHCz߄da 9za@7be/s+p"uga}wna&Fd)㖸n@'S!P9p8%&f7c7;0$ DT[8{6&t¹#@-l !f.$+kdNd7:`-n^w`4!s9g+i`f:S*hU` pLc'΃!ggȴ¹ sg$X7` Zbf.IɄxs s"h wk@#꥓ܢFˢEʿrbXhg ɝpyYpse)L5I ɝhyUpsdU@INJOU͋ʯMe'+1* K|Ksl_v}'&wۤ;HDi۸mh|w{*okƟbvbmvw&.myp Ρ_}Eb v i|&C4Aj 7:Rn";th+QIl+U3Q>7@G&D&NQtW (!c`\= >Bj#Ln=&#]\фx (!>0[u8`d&e4U$o ;좓 n (KKR?>-(\s bϾuuat@d0,&F!\>[ˆF _Tߣ٦em-I6nc]“jb %WbBrWb=TL64t9}9#}$J0xE]5@A&@,s{0X~ЄC@b(~[|@Und\>_ G~<57@#@}[ sP'UqEe5rm7,Y}7 X|nImQ >L@O#gg,8<`/{{^>$H|-µ Prb?X)t k"7¶ Q2 k5۾[`܋k"S^l :ȣЁok;`kE“n*P^h>06玾` ]|R@Ȕ@mkQvA 詵e@?m-<) vBxJl@ h >ke74ef, م' Nȏ$P~/W~dR倳lX&f?h4e$;Ap;S"D:m88vYeq`& !Z#29: N"u$$7~qM*8fm|5'NB N۬~wʼnȤS6 !lm"-˛ N7~S/g4pߤ|惴[ eIENDB`teeworlds-0.6.2+dfsg/data/skins/bluestripe.png0000644000175000017500000001255212140200333020363 0ustar felixfelixPNG  IHDR䵷 1IDATx]ED!XR۾-EK 44h)j+"R|ɳ$%TCM ,B1AֆR/?;3=ɗ@ݝ9, Ð5h`ڢ-@EσZh=f  đaN&/;տT'~uC0A7(ZȆ9wGPFh uD=\]t#B tq[QCQjAea~ЮHe qeV-jl1#aeU7}is /dYtu=~?.WVgwq)Ӓ sn\l qpұG ߒW~9'6Tr YG߶ZpAxP}盙[Om.[4K6j+|-4`;jfhM>@Kvp#Sf`7l;a]Z㉂HW._kW2Vw>07lt:įSʘ q3&]ݳ?[.15&H1={Ɖ?Fb#6CA/9t(tV!|qt} 0/1"󧄛UXy1wrf3q|L—"0"+PPFኜ<'<fE<tDW "޻BAc 󖡗ˮ#<@ H#ښeL3nBp_<WYj/©37dV`^6N * r1D˺ &~(6?R r~.[& [g6%`3HrXwc[R :<^$ۙ_&pxD &腪>Ƹ4т%2-ށ(z{E7oRnȖ ##`" m+&(oze Yp=Gӄ1jg\Dr]~6"Ŗ h"3/MDWYQ&7x*_y Z^&Ɛ-jhH:z1WEU,($F*ui .&P%c(<(<9bsW$_5B CN/_A]}W(Z Vc {W5BCNMMaQY9%"!9h4 ]e[h1dP؏d2EKN(e? Cѣ:O1<; g`tu6 #1$ Ǽf ^ |Qbo ji }F/F 'Nps7ύcho𛩓؂ DXI<0syhDF&9@F8͎gƶD(w8; o WuCH0z1Rt&Ļ('FWIOuz o1t4h/ˈ?0hF=HAà VUx\sKUލ$JAϜӯ3O>7l1V|T  Ϋ2o @1YXa(OtZ;;@Q h8@r`WU4ГCqLDg6 24+|b88+=cW_UZ:"5`!2Ol|2z!RȪLIΤ g,qvL ϚϹ2g-q骻+g~1\nnd 2|F/F z, wsuU:i+zX3N ы>$Yhx8NXT: C*6˗;1ы.$ iFPy*Xso=Aޫ @UyhH6y%XvKo,:1$y ML@( FS[f P4mF/T] \C[Ci]5'h2 27{h~ @R^:ЋW$=sѷD M {o|L} Ъ&2zmPO"~չJ;ma{<o'>>'|;]tfu8dBnYed3jZ__F+t<\Ѧ0ї%~޽pD腫$Yr5;`p nXLGN>yyz\+}- L 3Yvߚ[&`F7}Նgwa%_[|>Ȉb֋_Xufy D6؀u Ĥ8}w(ZC; `ӦmV# ΛwF3Ow=yW_y- f̭l54^o͑99WX^2?@}]8m4`ȏz/Be9X \16u5" S>#x׏.V@0DŽv2;D,(m $X.]8֍dF0dp̙IBAHEwۖB]lsiHZ[K#p\ ;ؚ٥mݝ梎hŭwѽ;fTbN=͜TdqiW)p=X H "%zԢ6Ļo t[+e&`e:I3`n `ǖ&F j"X djюG84=g+A-^ ywXgtw`7 LE|M ̈́h{VT77@GI5b+YQ!|@;$Hy^T/]k6uHVG΋'> $SwJwQPs#U5G[r:%u԰19Q_Թy"r&DΣ 5WS"Si 9~U 7.,25; .*5 섎V^tD| mP Uʅ [5 TP$V*@lT *T5l<4 WEleSs@]>U]esh*Cu*:WLLEªt69%e9%2sʦ@uA-0atMA@W+ZdT.*ÓSl0Q65U⟚dx+B!m@0)([u O l2Zl-K#+I"TLNh-[x u!-@ҷm XLIWc`O"YnRe ;?-yp+SG #y #ߜ}3E& ȵ7BG(yٸaػgh W@FW`,sX\"$M 8|qS@ DKoZ\^  0Xf+4 $(~R& P9 D'J5mu2\o>:y2][7q}|/@٨g2{ f0a+|.g @6T C `k9U#٨g2 @aH"n|HA wQ&n-@5O @b,D|u\Ye5 y&0%M@ +>ԕ@A^|Ԅa> EъH74W/6 c _(eS꣡P|'BrAY>Ue롻>ln)ʷ󩨏oM^Zȅf3to|;l}d~kl{Yu"Em|2Q[D.*@ʷGoUb[+q1U7QO>:~^zit/B%˯B2L穋At 5LIENDB`teeworlds-0.6.2+dfsg/data/skins/brownbear.png0000644000175000017500000001265212140200333020167 0ustar felixfelixPNG  IHDR䵷 qIDATx]mdEޟ6]r;˛Y(E@fq(0"F1f1D> y꩹s_z9uÓ,Swl6ۗxb(+6@޶v9A,ti_"v:AW}]ĥ"qc'e>ֆɯ n~:,i M$͟"!m$9-ƇxE1186h))z6m)Das=vߐ3db;(cl)nSb Dl|/\d#86E:^\RNFVo([+3]o||#P]lԒml@F l*MvPA*CsB$Pl<):);lM." @&H\}ar8Q$AZ@0e@uMR6ʅ3m̰fT"@8Ҝƈvޏ+z{ݻ&xTۆz AkuJ秥Lҥ.ږr@ߑh%-O9$Zȫ&א!%PFr d-WHˁ|6IC~}߱]Ny^e+mmv>#'ڑAe\Hq|:0/Y S^a^]lɏgM'@s_=TEjۨ㏏^_;m~aDy"P1hw%{ @pjg$b(kS=:'mhPuRכ=$)m\f@ e%BFw:NI@SBU{U)@Fbp@s'4b (1[g&DB-M|ؿm w\x)wI ?8XOUJ2OFx=q_z֢ B!YV1//@aU$Z;Kx#= @7 #8o-Uu1 񛋞D=,(;e?윒&yUN D kXd9\f6Ĉwgn>: vYZHQ6Pbu?^G( T 'ˠ#mLsE]60MN!ס#iq2j[x1,xS%j. Y&;ձ DZ{B#rUT] @J_}RG M1.MX`D'0D`e}F^7K30 :-Fx%vӇ̳>>T@d0$vD@ &*F cGUO AG{ $loNTcD-/^@gL# ^ `/&?|6,2 /fu3, @y+0:S`2p.z-mfd%#O*n::yP9h36_fQb& }P1Wvjӟ?<7p'gNdT1'+& VP Ah(o?X-ҿw}#ێD2EO,v&$-l߽"2u K@fP+ CwV% 1 @>ru`Pf罓⭧?% 1 ȯ·FǜN`D`6I[C @'QW =P X$S]NM# fEV"jO`qMv +K'G3 q"@ich,|9"XI~,5$h- cjP[ák Bf H)׶H"Bp&!C8 k2ZW7u";A 0`:WW_>CQ89 )v9TCw(γDW";Co͘?*> o0?!q[0c߰gE>.1y?g~mG{ oucHC=xH~;:KCA2qKCXį?tkCt&Fsչ0^>WN@:q W )|}%{c!?` :Z2CpHtu`L^nO_v?z3m>c$9Mz 'o?T`v?1@"c* `j5|>yz#T:D|f X,:ȦCo !@_x[f)ذ3`҂l*k;'H Gz6 -IC,$$849› !!NͺxtD6H$tmHK!&H$.b$/DOLBLi$x0jǢ6$uXTæE @s1= _mOg1=)$_} |ItDvlu" $ꗶC| eb8j$p\0:a^H(iO:/ye65&8p@fyME!&wME#==6{f[T N($t@ `` }wϡ 5N'֭>20cjzIWs7ـXW^R_y )e%`: spOtdIH_eb;iuk)E gp`L)/  ?Kv"@z;9s=` F N~Pn\^ֲf IoI~+`ԥz~9 95gJYZІ%`(p.CVsu%g2]6Tog19uZ&O@'  7!la1@z:7o ן`gP[eefS _@yC{#\f g0`ͱ-4<ei HO7DWLO{d"Y GZì~B}C&|>P` m CF 5TE@mXTP}q]'NjR֕Bk0|yM1|:NH0/1b0 ^W9 $u" (`H@$|'e!&k>!/0 l Yvx"E/*|tޛbjY&1_MℋR 1y>b6-VHGb>y6)$N!I~m!\}$kk8b$]!s>wi⯫]gHߦ 1 &E$9m!}2b?v^(4KIENDB`teeworlds-0.6.2+dfsg/data/skins/cammo.png0000644000175000017500000001334712140200333017304 0ustar felixfelixPNG  IHDR䵷 IDATx]kՙ>kXcۅ=1\ 63ml3V@Kl6$*ciZh)VZJ '{nzG\y:s.u㜳%JBwPVrKp6gܤz]k%>Ճ%\MQY%T# jKpė(AjK~ncj 7@5/@ `2sSs5Eʚ"xZQM)+ _dw`3 +hEuw᭛l?aoU;LN&VcePFp{ّa4$n~xໞ5 ~CTcKn| :OWR8Z=?Mݘ?oU=wbKn :A<-zuûQ\j|gfp8 !^#H'E )Y|ѱޠQ6fP s9O ^_Nj?Y?A-A<-92?KL p=:% `%;E n*us5pZ%BCSp_N *0Lȹǚ f =OR9cE@}yQm< S 2>ӿ% *ȋ cyP1*-"Ҟzz7-puUe*kF<N6swhzY @2<6ȩ|'k;0wkϬf gqn$u q3$Fk8BQ @ ?NS{9a fK 9=|;=bd^mgn3XcF@-p͜LoSEMW]HD~hjtd`+7[(kOo7^-ő(ݼN^~҈:jq\tA"?H? m{$o&KxDt={ob11 ;B?>CݸVo$:ba_S 횠!aa~nֹ`D 07*&I&@s !4!d>,7DpF1=e# w)~a*o|$tBg& ,4_~w_">_ N!e3z!IH&@n>Ȫ2k,?FMjGüu P˘ȯRPOO% 3Kw 埜64ypuu^QL2DiAOeEe6*oO 8uy,:DqD&)!4hi`ɾmbsig.4 b j֦l9$ć`w_ @+S.АGUF/Tb(M3z3H 1=v WIzE^&QǐA^vկ+ό9_[ޯl2wܚk`$=$F/о $eg{: =+:'@V;PFb 0ޜ > 1R1X޾Xo^D N~7 ۽ga|7ϟJX}hM8YoZ~)1 A°/s ?@@֣=Boo˯?kR^>-|ͼEi.~Hu8ϯ|}`?) 3m\~y*lt,7,o-Hf] bGxW}%¬a̪lJ{v!F/H xUa`bzǵ_MpLz25+GFƋ"H+gh?Ϛm(Bix|F >X|}n)`H"?ՙi֔ )~B첛{ S@;aH"³6 O_:*[gvnm`*Fw5zfNWf"`wEPH @xn=ќtl!^x.[ /nt 8#Ylt)U L8 L}rҜ8 `gJދ2Yqh9tdT)`, 5Aќ8xZcnsʜ^1qI[k=F/F zr10[ ܚS >XFYP d@pk/ AF &R@a #<*lĂeua謾$k^6AB*V.fGs ŰnсAe0Obd{j(>(G\ M@OBmO B:ЛaN<c"v:SzY({Qg´k&TwCIP m1<~쁰.*gN6zJPݼ{'~fsZ6aHa&Φ{G&GȅXמ>+Rٟ"sQ} $0dmV_AoTx\I4?9K੫Ry%X 3zTopr>ԗ|*_-, 9#~5$CB?_w^6C҇GvGwo*/0m SM7Hjcwp-d6"$>/"'^8=wS {>&~m%~j6@16 em&|9!,ot8*~'{dTpu $=ו #^=4_xg/|4W#[|KQ,-x=6uثy/]-? 241y6,ޯL5Ͽ?×]1 g+O|0#~0 s[N_5F/d8;sEa<17 {=⟞߼hlhN_$ iMac4`(#C~ΐd;b*~mD?O! @xZwo.0FG{:x+yw}MLrܑ12|@<F<6ooF6V㖨Ůw0=opcoM'IU!St0<唰Pu|7= R\3W@qt=;@rvo]6*<`1/.@"z g6!j55r 80PU t<Pq`2zʢEy(5FtG-6`|[SPk@2whJՇ\p.A5x&|e+[)ޕe˖ot K@Fuز%_CP~3M"~jE__~.sȨc|,?zw#ÐTv8 OБzb=0Ǖ)QC<?T$+@FҫrzL8+BGҏ߆zIM$",Eoa_ΐƇ1 $ P^ XSQS@χ%Cė8_y6_A2|nh!h*u Hb>d9yxD :tk,!l@vlOsO `rQ #5jd,Ћr˯bPC0ϢdyBgQ>ܿF->;2&旧w i@# ͕^C*?Gk9;[;Poϕ5ZR`|"T9"(PxzVOcIdֽ &YA2&5x uR~΀|}I"$oIµW= 5T(?œ:  j0 ?nE-o-XH/R*A}l^!,nIENDB`teeworlds-0.6.2+dfsg/data/skins/cammostripes.png0000644000175000017500000001230212140200333020704 0ustar felixfelixPNG  IHDR䵷 IDATx]k^*=x19D1 &1;mGjkA^p,VVj_ -*@0=Ygy}gϼzYϳ.fHDhb5lUe 'E !>Ճ-|Wr[(wlEZh*GԤh j[F1mfqh zKX\BR۝%DcAaSK,aA D ?XL ,*kew3j++^{Iox(-=*Ȁ&(~Bl9qe P ?m tjԀ suhyr`3̹_&,>#51߂% žwrKn :&r>.λFpi;lx,c1!s4# X5R _!ZM,.x/~ l\ZM,9XU}<@i?Bm"eACbbzxCkukԂm"eQ7RPH-\fK%S=Q|?;̟w!;eP sm$Ba&̉"˽hO쇎JvFBy(݂kV#/PGmW,k:6Dΐ7TR ӥT7^aอRĚP4HEF0Hp2޳ŏ$Wrqgv,9=lؾ)KȀZ؎8a.`zb+#脒-=P:e{~S; 9߄4D)V S?PUq.$kȒ6j[(7`;j扫tO>@/0ׇ^_ *#a[0hLD =}Y/o?~*;*#.1{,{mJ{"␰c휸!d%! 2" ZC @c 1Iy.3ȧb8Woz4Ӂ bJ%DŽag tbL7&0y"{*ju~$"__x$h зue4$Ҋ&@김y MGTa8%ν{"Yy6&@S-~mm[{<2 R0h%Y^Pt> KocoڏEɶ9Q6UpDR CPN<\SɅ7H_{lxk.~K &rS"A=(ÂXtr+ӝ0Z(Q,G-JGF!&eECgk+rt }.ЉOL`ǞGdËt &(1Vƪх`k/u9S- zk1)?wk{5{Ihi!goTw (fZaYo P:7} 9*~ ]m}zlx {@F㼨ElNvH6닢{SV0$1?C1g Q6HeFw=b$"A2b%Hj򤠓aj DCC1$W緦<^'rrs[Uۧ[*GHb!U G0 lAWT& ƘI[`z V[ge][y19ԗBFo~>@P9<@iٕn Z'l_]"k2g[*$ V&5aqO|3Pt-ãV "d;H7;Ta.P+N7sۓ8uZH'w_fo>Mu{6 ]y[Pc[y;ie}֛.M`iɹS$zp(GY!" ^+Szǰ;ؒ87y[5W;|ѝj]9;i=[ib /&pMɹǧR\ٕ\ё #8?\CN:rsW8yw؇L;X!~7'_߯ !#b@!4\',!B`Y.U/%ޚkcF<:dL z1R Đd MKrqpp^Cq2, t>:9p65GO6:oϠ#A%~&A:ѹ◛v|ί43{F]^ CcA/H: h ph??0ߵˏ `e92A/J00N&]Gѓ7 :6W<'{ŔE-L^[7$huw^Qy?Ǽ3>/M84(LJ&Rfg_O #u _m8AX/͊ 8Jǀ+qrIՃB|^Y_>Exz@C$v^>]y●:ePjI;(\o;7_ɂsOz\{}!c^j0:f>NQܺc[~|+n]ާ6,pm o+W_~=ʫZlů-A/`02NLL`ㆵJH0\rÜ/VW~sDrO&]A/d@[a5 &~dii65 bAfpK+C~ml 4I  L~4w ],){aȏϯC2}MkD(Gpc@Hu@4-+0S_~2(㖨nPEca1g0ЇS@ H0JQ8۱{X_P R27BClqd}/\8A̰^yy.VZyݳ`Ns9k'NRz 4ePgRNO%2~VLUMXE3``0y:- 8&EL;430z`E[p{a50+A-^b0:`aHh,E |}`:gBɂZM(j[$@ϔGzj6gh ZM,j)L5N 5qA͓W q<r%uM{\PscU_5[r%uԜX4 -9'un!9Q$j"47jr}4N<?`{7%l2 ˇ֐kBPׯyz& ;q`Q> MUr&OꜸ"*CMhze#*j2[#:j"[+V$6.I XWغeSТ&@N^a(ꢖ-*@q V4z`+*..Ͳ9dCcl.B#\]eSs0caRWWQELpœ/99eP 3|\eSsPg9pʡW˦栎Ss:VE-4y|MAX~dX>bd=; e;y]+rԠ̻֭8]ĖX 1>֧\}jPf ?¥}l=l]EEMh(ӐyUh|tcaXQ.NO?oW@F7 #{ޜs K& ȵ/7Z#eh|+ ~+]4({ l?2e.kAdw įr/_'VM= mHl`y1FwBd{L?2‚r4/4ʒ"2 Cs029~h(\db,G5zCeXrԨBdOU \ˆT5jq2Bw[ &󓟍-r޵2zӏ1Q *b6L~K, /Z|P6#@" 18Dw-k538(`埲 !{SĖYe煑h;=2UMre%dP엔o{ jǭ8Uim/oV ~C-<.@ -k#PQ>n}MT\^g0l{mB ЙR |F##((?0r MLr{O  VX(?ʔZ]Q=|b;(3 Coߖ;E Ȉǁ5TW_q(> 8uPOszE;u"W&|nF}t>pj{yu"g$wi}L>:pj{Eu"w"g\I}l|%'^YV Wn}l~6/޸zyS]axso|:qY[pk{UғĻ.+BׂIENDB`teeworlds-0.6.2+dfsg/data/skins/coala.png0000644000175000017500000001305212140200333017260 0ustar felixfelixPNG  IHDR䵷 IDATx]eE}?p~6EbiʞhIUXKRF=PF1MhNjk˶"-DErՍK Җ y=_3̹|'ywgf/g\UU0-RWjT}'y<нɉkHەq'¥KܜTm'{|ϽjH; ..vHۚTA$Tb(_In.bstSSn>2toL =6Q;}bJ|iaYcԮUىKYҜw5s|GJ 1T#G$,tԮڪ`kn]׽:_S]u A3& 4 !-@g`JuF` 8PyhT=8'ڷ6̡X?+~5D(bďP6-K,E ΎEoWM>#ҡHsZo5m5=D25%gƆ3{%x3#?\z!&@\_j$Gk$~zfとZ|wpPj`;1L1@/19:r:A~jG3yK>#@j C=Pny.WĽ : L6Lr0}˨ؑ8B޸|W"9z챡p!2ǀGcP̉ij'=7\}G;;㌘vR0b`H6׉A6;` K$p/=[7a<-&SiRvxF>I\&Q:>M%^Bn+iprnBE AԹp][Ee+&@mH Қ!jѮ?ϩW3oYk޿l+Ct5^hpiH}x5>h xQ7ݯG=={wE/Ųc!TϞ=[=c?Ã5O=D>@/ʿ#_zKnGp=(D"Sƈ C{E>/VNwWtݳ!US؊'N%c{kMj33g/ TbKs O[B2)N3Fܼ'\^lu; ޴ y%O+L.: aztmBvg:x.UmI [A5{U)gOY90Fk.ODI!czGCclaM`gN=okۑx/RƌB+7ſQI6į]\>c͔Rt,fHo&j›sQ_>Pu]-W  :cFuY} )s s.`Wr#Tɻ P υ `L`YNnzg"tFﭦ$ {26f&|f{z0:mx/[XT16 )d:@g< Y굀WtT97k>L[ǣpR^ `<0uWZ&(f>RˋY.H5Yiƌn@[)Vq569%u{坡7G-c}hПG@FGLɋ-58jy04, ό1-"ů WK)h *~\ /8?,~YvR6P,>:@ B W`F@ Ȩ1݈QE5WLeRןTJoPWPB& BIYp]7UW;[Onc7[,cAMXJr*pJh{ ',8>WbBRdj!|Ώ~z[uo\]_]0iG"#u5/Z#%aORz/VU+/^{~饗k_xk/?~N/j2`ORDj~pl>D܇_~'?qm}QP}i0IؓvSs GsrsT ^{HmW_409($E4m$xp?|Gu˭U@Qt{p=p޹|,h%W ^ =@mFW]bor}8Xl_\WU5y'p7_Q]~yfyϑ뛁C_kM吏J`}S_ *)$ g8bϹ`/`=|)1*y1JkbFvLA 5m` Cjo,:^`F!6;6UB=1fJ^Q ._.^`j`i*z^uP\-*"|p*nr>r(~.| 07)ɽ=}{ɋߑmGئ2:@s'YLv'7pO Qp T3xh SL%ԅ>J2#D )܇4s}cώ"1]HNAJ^}((IkDv DR#RNR!iKCT\S[c2YHrn)XBħ`yॠ&.j&T-[CG?z{=gz|u$| #1n*S*)1D[ O7^Er^w[h ݜ9-sUjuEvDа 1ECZԑ8U<#p>"q.H@$&b0Ψ7%ݖC;o̸[t̽3Vj7s=gH< _ׁӤx^ߌW_yEO3p]gHiR{A&@ϙp gA úLl2fnƜ>=ů=?Z1!?}+[ 2 F Ϙ~8e']n@Ɯ&&B>fV0ӗ_ n)&G窟w6@9zӗ_ F@J1Bex[*@l՞^b5 j Ym; ؄eL-$f]kG5 XpoC#>p ګfiw?kЁ7ɽdZW'=qL?J^QC, ?q7R1"S65!s)Qm9Mhi.ib]+(Z&L!<ǖ x QC^J F&9/Cۍ %#Ҏ41 @R1c! mM!)"O[|6iG4aTpz8 C:ʃK^\Rj< .E&]*)4>\Rjmy[IDRh|>4')< -e"=vRh|>')<,u =fRh|q='/|EҘMz<8z^Rk6 u'1B㓮!g+;!7IENDB`teeworlds-0.6.2+dfsg/data/skins/default.png0000644000175000017500000001317712140200333017635 0ustar felixfelixPNG  IHDR䵷 sRGBbKGD pHYs  tIME + yIDATxp\u?OZFưKuL;L  -iK%ۦi !FP$h&Sh=@&$@km#㽷Zw=3;;{sShҤDjmm3N&Ma5KyhФG#~)/C4ovW&MA4iRzMc5~M^^fȌ? 6W1 Mq Ud UJi l.4k6-P'*7ugàFq[Y΀|ÓoS`d IggcuBPʨA=781o sy%嵫k+ 'Av`',O * DF]2 >'u\?wA lj7b7c6Z>/wB?<崳9vtdY<۞̉reE}* U!l4@xR" ۷o֊X )i'Ù 5NDj ]N~E[cz ˷5 ;.<2rOߟZ錸\#+ё6hC1ϚBKM e`EgC2ؗڟeP`d kƱgL"8y X&cm$c}m@=CV4~CcP<th rŧe]0Sl(!?Xg3>ˑC{{=;&y Gd<w@RPk~YF.]SN?F&FG*[ݼxoE1'2Q '>e0d @ 7.C7U Fű'|W"42 !O@e8uEn/y']}09u0:E b;Y?H6YAN1: ̗X#G0>:Bn`Řm;xŒZ-Tqq|:-{ t_ 9 ?bF~)n{e_2~z O t_n\#"uKN\Ĝ }@jn ~xǸ\7r^+9|!>A?f̴b <M#M'~̚VZq I8P&k @|E~pw; 'C?G-&9 B>=q8,W2֤Et] / W+ N~N  ;G?JZ "n@T\0Ql}8Y p딐v 'A@uBIhF@؉a??_ Ec7eA@bͲRA FAWhjr"ؚ>)bʞU4~E^#w^AcJg b="LX %}rAnRM5p:a@M%с[}qoF7da _?:uJkYl<_vEfPY%>jC`+XBHu+ 5.xtI8 xqCx X tKV UDIau|6+_ u-@F5 |0W@ k k 7hWKPމ 0y߸zQh54 Xb sōgh(y<OE]zq365€@TJmK==z+ ~'1^4Ycq3!28v@Z/{d& a)O/}bu+y&ImxV`_3y1 /[Imkl1%-QTS ÀsO% 2k.<^{—wfap?#1>Y8Ŭ. pߦjUztr  gsX[`w>щ};>+b^(+;ʫc#3~n BN6)# ŇK*%i[ M6y[>-;yd%n1FS-u<<dG_#?7+NG`' \#ߋʸc$8]^@ёY~~|%!\ (*,@'9Z㿻0^_ziU=0i?Q՗f z|̐ :Un &Oހ]fO1:rj:*v7UCe$cc]t'@&ƎqAcw<>vf:3P#f9Ձ/wO o=+vl8W>i?^!6v (gg~910 W4{~ųct0džs^"XBS"PL?Da-&59ZO@Gw:VXRwax^ =/ hP\ýxmAPaH>^H5 T: %wNx|#^:I{l=̳;Z~/U2^~k):yfs U9f;2(><.+ `l<&~o # TG yuLHjQ!`V}IY}+LJ2s|s*O-bɢo } 0]9,鉤<BJ'G9.<ZP5)4 +2:UdD]k1visW LUiH(#G7dO|g?HJ"}s" x g?HJja/kk>eAև"XY?.E]P DBøFghC4r6PfWہUBgkP^W71IENDB`teeworlds-0.6.2+dfsg/data/skins/limekitty.png0000644000175000017500000001317212140200333020217 0ustar felixfelixPNG  IHDR䵷 AIDATx]WuJT h)V ""P )TkJԤ@xeCL4v6kq:!?PV*}ϼs{μ7+}s9w̝;AEA-NG+NC<-ܡn!β>no[j/PiRL iV|rm{| j&oZ x+=bw-ڒ sMh$h 5MB;Fh/i%??f4vV[`+ -[zͦc>}E)؝L&!~9*Uawb[tmuh' VI?&k^;;[K?pq,] ÷)W鉻5;gE F[%| ~7EW_h/J!xl_t5_^g-uo͵kɯ#Iom['>_E  ,ڄ9<zi} ty)7Ŀngb ޽D~`ю};̚6I~39VKzP.  ,Tp$1KOZ 6ߑ<||) .cDfT`8a+`C/[ ?$;1Sl ;DoC |c->y 6qjeQ Apm: zF'7pwo+?:twpA~1{$}  JVx YƺŠu%gC!&tbF, &ՏD|Ѧl>?]N5ݼb}c!~>C(.s vapjzr yX1pt?u`sD ȕ‹}:D{yD ;g)_nW Fy z `S9 6$޵ ~CzV08ۤ ?{Y.>_⣋#k Gc8lGŰe@4ٶ^ck Q!oXwq-74~6I4|<?r`DwCЃQT ]p7?3蝹b;7 a~Z%}?yOvP< {MF=87xJ5'o펣zx!6oH>3O0X6!;s\7OcCc1$-ZE1F\"okE`ƒQz6akJ֝لgG>! r8ht$5Y)(-]j @b \4UJvиDIjGz!:#$B&-廃OG`4?}#|ȃIM_ΘM:v[;pxIVR/ŽѴTw#HNE&`Nl$)^w4d3MD\vO#}Cn@hKQ~`,Ig"8M߇&]RCͼNY/~._7ߌ^ET!$U9[3wrn:-P^+VLD jw+9@>vͦVtA 1"׷D @8,V~x𚲀qD+E8݅Fy+ .’}p0%fjUC,&?[#vs7|mGOXG{`"űgt+G ;Oڃ<4/-[A8σe>@ܗ^9?yz|@)9|HmTnC 7.HH9*<'0atv#P3@b>/ _=\}s/m1/E_Wsq#E ޚns 2> L!5XSpg~xCM_E{1:w9z|?O|t^ԫ{&5ad׶F *IN %z/ģ#{{FC;OGLyy9d􍦼;Hmq=,9C!}cG&v8h,Q߄q3*Vmp$i=7l迹EG{W)}a3Mk]F_dB&-q{̢ ǁR/!ӀY93E1ɪ2 ޲s%i;8PJL/W@N%rQj(=Z 0}[}_moP9]/"vLNʎ ;hoi"l(F'pX׃;O=dD:EG4"*Fʂ 7pj_E>Xvi#?w|4c^U%CStCMEG@i9>_Hbb&>9;`\`a0=S7 x-$>?"e; [FaZVߍp9vw*z*\Wm~/Az6Ka,qA>CD88xK/ 3ߚ|ޖ}ÕYLE̛)FmT0kyq˭.mzķ7C">҄犁dP:Aj¹ '3ʇL1* w0V>z) k\*Ə;޻?uiHKs/TBlAJO9a ML4iiXkb~Ǐ[&;S@>\ԭiKɷ{;)L po$F^6:$rHo'Mr1Gz4|{::(p@)hi F+a1IA:$rA[H 擆WRGC j^b&1s="ėȅE }'h "E: SsA 墖d.>cVGRI$杤0U,ABj^2D}̲KRs@[9  5gH`>^{P[H5kT Ʋ ՘kV^71ל 05W4tb̛}\xR؆gB$ S M&oiqW< Sm=Fݦ?ntp}tokƟ~br&DڧiAK| SC`0ui(j ݘuһTnt@[4@tk-lѢ&9EB#0 6._ 1hDjԡx,}ɇքx𚆢")~+!?5"Tuj+|я&!O )1Z8MFՠ*@ E_Ǵ̏w Ow"56,@ E_ՏiAU?(!K;5=Տiˁm _% wi_:Ӓpqi໶/@*._84W}ؗCSs Gl3Kǡi9g`~tm'&X$5pZHW6-r?\AlL qiuNW,/L㋀Z_Ol֢˿qm8&9m>D`GZY"}m`785C{]kyW~!Jm~Zj| i:`Q,"D;7!&V lƽ~ŗn}6 (CٷՈAY\^JQxXZjĠ}}k[L۫_O|@L|P,b`OR7%LaIlCs ,vl4ɧq\΃/Xi}0 qOc߼.WRKO D@i\E!f%|v~$5@z.ۗ&PF@R3µP&F=rV\7nXNPf9ȃh ok<"`~EJM'j YԊe= #HB|@L Oci?OױK"PzwO I0LY݆IEieSڨKxZ@LB/'`9;5l6-(= @`Qb0Iy36}j $m&FNI00*nC)+m~8 HOEQE@C!4xUc@.bsDSe}'FHk4g|W4_nܤɦw჆l?]DS$N4͐$?wM7'qi$9|P|wyθh2ɐ$4g]~#.ꯊ_Μ6H '3keX0IENDB`teeworlds-0.6.2+dfsg/data/skins/pinky.png0000644000175000017500000001211712140200333017334 0ustar felixfelixPNG  IHDR䵷 IDATx]ݯ$Evy2m4&vV / C Db6!11 E5 aaYD|, *|z#C|]^9=]skz{95'%wfίjeѣՃ=|[Ur{(waEz*GԤ j{F},ptcd5,E.:7<{1HT pX|&@(ʬ+k֊zWu# >#\A@\uٶ=_ȱ+_ͮ5_l}CL hrW&P 3R@(sǎn^}Xvcp4{}# j@k\FD(:"u\) sjo}+O&pYgC+wlZY u'ywE,|}x!NQYnn<^YR9ߋI Th+p7@7:q"M |ޢ0Xf"MA:kip!~=EΛNq7P;"`ySgG@Z8#&SCQzTi]h ckr@A-`BA T3'z/3hONŤa @gFBy,݂6Jt+#67Y0Wm0L;"7TR 籘ӥˀvMt*/ p_)bCdٱ4HOEI_:˯쵻gyov=>WƝm7PQ@=~T #&2Q)\雮&G:#zhe̞8KL:;ҟݵ]6L~wġ$\aBUFF9Сl>bYcLRr&<_ b/oz4Ӂ ;bN>|C0M8 &9OBOR u70X"uG } XgPFL";k Xe҄`οxA%~S_OVpboȈD@-uomԹ[@c(qaJ'bQ4(GN{&?‰ j?'VD&@m>spDR$!(a `~8 !{pm›!w%\=48,-4MGO?]!ƐЛ@}LtLL e>jq2G9n*: aHy01,:45/{x.P]"Őћl琌[{E3 mFPЋ%ŲDen{_{V8O#l v`ys_jpW@l]y w^>0B8c8Hzrx: PJxCMAr mZ3T_M|w 9,~;H0E-ʳtxFrU28@G-bK);^a4x_tpbȈpm";uhޕ2 I XLb%${  vb\6&#V0$ <9 Y'4vC IEqh*zn' 3;w(A-A Q=ѵ@ {3)‡`0"ŖXw^}PPvC0ގux"~0@ I_A-`cc`Ho"~`$hF=_6_|;džw7 {ugã A/7y`+oȟgNdg{-xf@Jq[w 5ZGt_-2aqÏſyw `5ԕE&r7&{Hoau,ۋR5Cb Uϫ{D+ ZG<P"d;7;]]«4=r zl,L=\r<@ ہc[ R@ =\eGN=~|1><[TtcUsWͧuRӫgcØ)o<rH @9" y_B]1}l㾫n̷Q;|Oy0M7 Ŀh!`j m>%½l>AF*HΏglzkl;_I'Pn9m9N?p$;sh>߸9+'ytȈ)bH25vQ#vBXN o3CDzSͯ׼yt&HC 04/A#CHǁ&PÖ:GaVxJ)H xgt0= L@+S`4݄."1mq0.2-A^?GF$E (|8Zu7 vn+*`S _:0(wd/jfFuwdjhͰެ\oX#r 0? a#rPZ3&~>Әa x@aV0D6k P`gn2rga!?|f?K 1doV_ Bc~AhBCDza?`K/(ǀ+qr( ?NEx- (~yH2:S+&(_n"c %}E;Wz{w=yH0pXZ= 3dg#O;3~-?˹&2bA/\ ygg3H<Ч>эDfzZ^ي_=^&beNLMVڥs3r \~?e^u}4e ؀}&6?#&ЋdIth GmW}es&AoɏC&1pŝ>CqF }^̬Cr_`m P#R>8rz @]0 \gE[%caM1 ޡN8@NLQ2 T( Gqɨ0la}At*H-r˼\6 A' 06qđ\"psaUc\4ҭ gSJ34q&O JF!$` FA-jO'ŸH;=HZY3n 4q MZẚj0q*6xH"11 DL6+jȔ?Dx -0JDh,5EA>0~T3dA-ڮ^04;ރZ].,!EEΛ"0(Na 8uHE5O\/ sIԹwEA͍!W#"Sn RcPsb'ӀԹq2GDyny?`{7%l2ˇ֐k!:|udNZİUNԤ AW^\D| \v=PP٣G<#Tp I 6l{o [ `Z65=6rBQ65SE-[΁BU65]࿩Vy8E,eM=t:B!lM2򏩇I]]Ec> .E,pڜU,؎2>e?5bjqp]65!Ó)Zh|MAHSsDl=2Urq2xϝ.ڕm}(s ~rt ' c fOlYÒoX>>E@)w}Yqغ clh(ӐyUl|HĄt"c(ۨLrwX^+Cl\.嫿(欜TX2!d@#Q?њi,EË6c~}9hW@F[`#Q.s]\"[& ʽ\+j fh@e㭊]!rq2f7d5j-i_ h%EeFAad_* @*u #bX>_/HhԗsF-|*\>rb`רȈ_o)|PO~6X~,y•~ĭZ|X6Tõ `{R nkdĂDe@,m".X,*(ukpg]jq2",?e-B^MuZ Y.* @(ۚl%dP5o{ kǭ8Ui}/spg?P C*TW[_Km }/ ]^C:S@jq2bQ-D{dD5R QvX#Prq2VĬPW 'Q ^TXe;"aȿ{@0rq2aq`c<8W}2Dh=A.8pSܶC8r([Q^Uȅ.]>gZhN}N"W,k3ϺSkB }Ϲgm­-w1 ({ө[kS/g^F$u!t;OWpS#IENDB`teeworlds-0.6.2+dfsg/data/skins/redbopp.png0000644000175000017500000001246212140200333017640 0ustar felixfelixPNG  IHDR䵷 IDATx]m\U>ƪH܂-|Vh HR!aA",?&SD~11#n!8jETQ!?~]3g;3=_{f.KHṕӤ&e 9 j}A]6iPTA]n5@]VNs4ɧ2s9:H;hv v$Cq!u}Bt4wFsԅf@`6{t)ID~o7z>A .48HUtpޟォM[wPdkߺFr`+(_4ʈŲhT !wq dmf?;Hf~ύCMTtů!)M%F^1܂Dž?F7MZ yo׍.$~ 쉙HMXt;:[KSaW @ g9pÞ@nSLy| P 6wd6< BOC>uƜ$N-ZBޛ­RrKSrkp}IJaقm_Sсl]'ǘLP w(zdu@<6d4 [: /EJRc7 @yg@F[#k$zS~y%(j{%@9>N]V&1d l@BL2(SN]j{]`ź zGo`xrpvgמ;ЦYGq;w}c˅JH >tЈX5j7@G^m@81_M_nZ6`q",qy;gS3?#g@ 7L?!{XzVW&_|^itg .{5'BЛ*0=8mw:sQ4d@s@168|+ۯ^K֟ʏhAa<=("`dLô,70Sy9$Ww_):_ @MTt0yc=& 1==Nt+t@ˣ2۝!S*5eҍ 4,z=q>w)2#(,(2kx{~rʔ v{sC(Bvn N%"aFv"R|gk-(kصZcg2[TqM1 la7@p ۄj+@5 @S blqf0,ɹ?uQ|[9 06D nہs6B T 1sWh zaaQQ.m*\7%M44X4qEly7: @F~嘡!h/%E"m_Ai @(EXsZ@? D pᅧnLJb@!P]P@3?(p3q= Y/+._ݿ?>u?o.{G X;Q4T86|Z(H(8_DH/뮻6x2~ӟ俧%\b_dB`\ 4P$c_Gen!-Uʱ`X741Dy4ᚈ_IV W|r7l6m/ڶmUKLMOCf^mwܕ~7to?gy46vj+]^٭ۺ^Qy}~De-{*:E@vhH<pa-B#ݐ dK{&b:/l:mHguۯfϾُǡ ?ߕۂۉ^Dk*2#)Ġm؂M {D/>%̎r[vgn>}p-V+1۸cZ26t(0m Y- Q`1$F@AaW/(mҹc_q.~ H + "]cpPX6ǁ}_FU{CB-F8!Ȇ-@ʇ&Tn]`._?9u]`CB.ȯr'@'|( ; e; iBo_ `0GO_ -Ɋ(]*^wMv|撡P_ l.A @O{L)~Ecr1;2(*B6Ck4|c>4&QF޿~540? XɳC9ul^<5֨" > X/&f[w2痘߲G5U$Fw-mձE=P[&H4U*j`jd׀sriTa#egC?Ce :'si"`>w)|{v2ͬopF[v)f9~Yg=EwPm D~K -5dX)4L!M I5TЋXVoePN4L`A |~BUza7%(ců^:"Q R0D[؆P.D)?&P_#H @`w%рK}ʐ=|ȇ5b*= -1o "/ 5 P@>9BfL݁XtG_-$@'NH 7hFs8o*z^(=~yn*~͆ 9[8nZy;GēG%@pW@Ӄz{㣇ů@!RA?{:&x~)iB މL]Dg{$Hoh70H,Bϖd9syk9y&\^'zKMA{'dRc~ L"݋6\`f9.ef^H!B*Pٳ Fw Bo梵%#S Cj;oDR yoԈ{ !M|",lmA¡ȔCdR zo"+_`,F7>0~5wR=N`# b\K-q~&g \nl 4iPsUuCcܨI#M"ߏ@N2>-y> 2嗜`Y7nAͅ%bP2gup@ğaEϲuy 7WwZ+:GM,8YEs%οn>(chY\U)9UMAC-\Oo[&jqq p>%?%4 jq p>%OɁXȸWHPuHZh|OAhSrD,?2rq2E6\Tan^ j~H&7= *SõPM| '4SK zA\t\~om`+@3F8k^# ](E'/ Dx$ڵk35nzb7Q i5d,Lt4`VzI):b_ȅDd IנC4rGb xHEUN[@hr0S};>d z t?2҅<8TcbhBO?F-<.@ k>¥ `r`T0XNڨ !%U4Iף!)F5ob1*D Ith|Ǐ2iZx\DC(oahð+cVvՑ#+ m`mdX? iHMChZ@f>xǗ D5G C= +^>SqZiSO JG>,m/;K-:n@F,qh W%OHE$u\ ul ^<^%aIENDB`teeworlds-0.6.2+dfsg/data/skins/redstripe.png0000644000175000017500000001233712140200333020207 0ustar felixfelixPNG  IHDR䵷 IDATx]{EJ"ЮZ۔W VZBPb-RZXI0T`DNH @(EE pHxZ-8oϙ۽{w7|/%{ݝRJQf͉Wܢv\ta>q.t͚ѕ\j5kD۳!5k* nk nk@[X0{QF92JCQF=jG0I\>c¶6`@2эw']b"qԝ4i<1?_sY/Yz\.r2`d ,.;'_ɉ =ի]w\>3|˟Ӹ iŅ{q D<}O4g8玏`"ӧ-"ߤ z I;TnΌ=9"wރy/xw|}-|dCR2n\x9 ޽I4OSO2 MA_P9ŷ-n(mWpt5/#c~}ʤ0wpu5/Ҥ{/PՁmAԼU+.LpkEgq%OF{w!G[]*j~n3j]h@(P@F9DkǷ^3 :C7DcZ`MȎ5KPGnmD]| >O"`yWj|*J{*mhcLO5i#m`]nUߌ3CQ !R;4$׬^-ܸQ>}+;vğ+䲥KԩS@Aњpے恠NBli!9cƌSǟ|l‘_qijaA]'Qi+06䚽,޲Er. +8+e~y$_|$|]Dzxg 8\qsaI@ty4?:??P*s-wHN>jEZo\J:+ȃ8W Vւ_߻j\/V?LmV|Iy }ޟ#B]1ea .5"%xɑCjеte.2O- rZt&~`ȯx Qm.1!?b4!7v |􏿢ӀS[h ~ڤdfI}SwnOI`;V'Or~>20w˒ѿn*(W#^SQ0 IǏ1¹VY@D%-9]1ĈCYTzBr\"ՃAPHl\Hd_MS|qFm`| J=gB =}\&p_ͯSL[8cjE.:FCA+ޤ$Bh#ftf>^ N}PVӌ0"y`~=sb$ޣ] $)n*@t6;DSH𛑃1"1 <^xRJgf` #Cݴc}G3G.ZXy1/3 :#C[ߌ\, wA2~P8$%!:q9 p7N#N @uX @LM̟$lf=U^Y@M@expXZ`V*+.?ts*o 6ae3nW]j49mto1^z {&7.Y^bOHav=# Eγ.筈7Pgw|ͷ?hu#}7 [d= +0jcXiWbƆ~G㌾gϞaz;w>ɗn-w/q5uo ~#ƊWa_hx@p}Ґ>X)Cc -p/1HMAƦltW|Ǝ)?V̽lXػG#Aoɏ 0p{eErm 90G]ٳX6BԌTGd{6ʪ(SLI nDK l"k mha( $ ]y(ӟQa3g: 69/7  xmdI#{!|,K <4gN|4 U4m- g7te͚:$\(Uni!D  ܦv{$e|;2h7VdE7MCE"pAw(N g\Ǧ%ݲؠGuFS Lj-aD4t竐63;ht"W h4?QueiUƪmvܜ;mwP#3|[*ϭ-Lm2_l֠sk`bqG5  kl %4sGmmObONuñ_N/BA:H"ۀH9C5,15ி, x>bPGQ*>jtypq3#7oؠc7oD"k\W08bzp>68s\1|{6W#o=:u9|{Ymb7ϴ)>>|E?4n2iKx}|&MM|{Emb7XhCxW}|,.^rnZx}|:Y*]|{eeHJmǯ2]iKC|IENDB`teeworlds-0.6.2+dfsg/data/skins/saddo.png0000644000175000017500000001265712140200333017305 0ustar felixfelixPNG  IHDR䵷 vIDATx]$E M2*($ŰE`]vaA@Ы"G]߫AucbČB{OԽuV?z}%'3SsZy. ܺz<`@!VՃbC(.WWv !QncE +ܤz^7"k0Y o֐6"|wny5B/3#yUe5ļ>$wѱ\!Pn;5 y^U;|/?t)Ԃ&{L l!#wN3:o">|mܟG*L#j ^F8"w 4g=_'2~ z(tŀ|ǕcR!gCλ7Edy#O|$~D' xcU[9MI)=U,T cu,G"ɷ߾UE6X[}.9XŬ'aPy]0~w06Dn< -8Oְ,fSQ|z:;{իd0_9hSfÀl*Iu?Й]I 4 \-'#( \ԴyAI_# lH"biN܂y"f)2p]SeJ?59ILe'` =%џ}[_{<Gg]oEQπ[؞8 w|S`xP+#܄מڡ=/qvG ׆7Hn+x>T)H7Ү5'/A6n;|Y) }'qUGO<+cgM~erhmZ@;~DS(D;}]WůxKH 9gpഓ.׿R\037ĉ;/ͯ#Yŏ~C sgPƔD8C=Pg҄0o}pqU7>|V<~!:38;~X߹{o<11i'&.Bw[O>RkenB՝^I8rm8""7b>V0'"+ ZhBn+bS ]ٷ=w4l?'j &m>[*ቤwA~^)PFU{9_so.=, /Q ʒ~M 0k=dLwPHL:LLȮ1qX7Wơ=T[o>pltb `QeL)$3)Gw!t)+0;$zDžMfi,}0W]~{jJ0/T(d &9瑌1^3| W=NĿ)[4C%Ę~Dk(ݿ؍zT- j+>-ȅ?Mȟ6 xk3[4>Ɩ`Ee^>MU@,r)P*TSq&s ~qB co,C6FMqz+}. &%chR_2%PW3$=˜B"ߪ,A W޵f&LxrU2b2bTUԭ% =dKC\`][x1b$1Su >2]_K6b{_fH)$E ~1{ Q6$bmT$# Fw1=b $&C$F&% Fq8پ /On[{/6ys n@:ȋ.h?_ sJ~#7_F$׉/02^h8gZG@(b@F*`$z=#WyGe'Љ0h:bu%~ϼW `0@vF:tC`, 0B@L-Oݜ_q(>r\! Yg#( C0';}E AVe\1dKs/;/x%׽q ; VsKC]D whʡ]_p 8~4OqA#b@۳MWauk:_I(9?x#p]o@o!B?@A1/Fdl ຨ1D8NI6N~ӷCr)@ kXõsf肜GG9PHra&$HxHx:T@v!x݂! 'L`F{rw끻k~X`{hJ9-rүiW_aCcC ~ʯ}&ǃ.,~3PŰ= .Q-н wndv`"-t|>Bk}M@yKP ~QDJ!LJdhUb:P #8p%6$SKNڊp5WJ,]N{16z{LrC&\@?\)L@'!/}8tD!$p:{L8匳_m%~węCL '&2B? 8q^Zen ?K/q\ ާ_zx &മyЪ:6=S "J/ ~B"u^!LQgwwpơ6|꠼ 0&1PW"~׹J] I;{C+ POEd PavY.s t]}+L]|]\|s~z'ʱ&1/\`yHwkH0s1{G+~Cޗm0$l`kiCfU/;Vو^N)coX h+Q b 604Abbml2?OL`?1 )0cmc ,Gb㠏L͏# q7+0ѧ,E߄dsQA$bfS13RԄBQ??_qKbw{"|DQcwc J̄0!X}=wv _Ȥ"w;eyBM bnSO9_  a:4Ncu.:2=0̤szl쒧Rp=,HBX^pF [.G"ʙ F`@I*`4iRbfkh!gՈDZ't\#yHS13DXhCOlHoĬw1`eTLEC!XoUPm_y01vRX{UtL ->r^@L ɀ8a}N;܍;Xr5a `d-;\;_nܜ8)0 s-;'wn!1Gܸ 8;oO`>jJ,2 LJְBpׯy&;Y 0I)KᢪV9q: NbG·݀F5\05yp9`@W[Mbؔ͝;] `[67mu./9..jE8.^*>_WJBEuoOrZ4~섰4b@*rwba06ƫ˓oB‹hzb$M_ %E2Gπ{i䮹AX@t]z%ZP HDdTOjR۩3:Q(^s>{9We2p׸x 3Q0hlDn1ֿ-@Dmo՗@~F ikHD0/(C54sd^aT>z&T9onjq](w֑uaeXy $`[\܏5~CxgUE8҇=‹@R'P k <`@0r /#zcTQ~BBNʵ42 ʝ`՟ 0聲 /&cElNT>i‹KtU]퀣bE$~XțE ہ O~p.5#T}<2{"@ .Frn[h1r+|Q~lE}L>tubZI|cl|lS۫b/Ck㳩$WW'vu>U~̍ϴ>.?뚗^SpM|co|&YW[.]~_:O_) IENDB`teeworlds-0.6.2+dfsg/data/skins/toptri.png0000644000175000017500000001204012140200333017516 0ustar felixfelixPNG  IHDR䵷 IDATx]U@"ގ *y8%`f#(\, -T ՠ)81BKi \5xל3Ν;3gk̬KٳgfXua9+oU;IA"\e޲vݡ4E`'CIp)>#ҡC[=&C hmpߡ7Zwqc #<#Alwmu$S>/!!ߍ:-BWR)?~9b/?^.O]C,51.S<sޘXREByߝWrV(gq+&̅}]) _ &B HF]xTmx_%~Կ4TadD_6/% kD=yR }6,eTMx4sXɅ{CS >KD-%⢴.K$GUQ%2יg5*<Ƅ[x=/NcHꋦAe=Ncsۛ;/[*m >Jh1l;_pM&#lޙ٥Y (~&6xozrYFmP`r cA^,xu2 8[EcW!? A7_l \tm`IKZX1dЎ][aW( `뽷gS4xo$٣W1EnBV2 Y{ȁ ILA1Oe@ QgQ?4Sf't$ji;&8/?3O7C eCe/'2ڶHsا[kcw%߃E# wEQ/5*8ʩ3|ꎠ0ޖv8rO]נA^ ׬uHMuJ@ I ً&d8YGUwc &XXğbKӚ{Tuwww0r*rLz4l3v,v c ~r(; @,jCå<0D(v-b]اBHA7웎<}m|xGǯN>聯3Gn+1`.TMs[O"ܕ cx笉~v]K|Ʃٚ{5[7}6v1c<>Tm|Pֹ sZ}z >(`g '#B I/Ԡz8v=C[s-s2V(~1rǐDa&$PX(mh:w&Mj & FՍ?)j06;ÐP %7jPh9EݷqO1dsdx_.`ȱaL@ Mү=WSLyo ^"n%y1yneʩ{ ÐbS&`nEY@]ˎ1 zB\ bɎ(0zAFj Wwmd\ t@?bPs x+~VLpJjk:|+( xRBq?u].  [|y&2mPWK?umNf^tcw⼿ 8dBI7l)ktYtr٣x6atG&2|/\ DjuY3`p G]MDfz_5yV6A)Vx_X 605XiOfsv4{m0|&O2ů{O Y0VDIliɀ 6>{ (W KL?2 @)ln>3S~l-4q73H3q6$ TܶB_^,l@J_m᫁Dj` Ap >` 08g;؉xK!x#N8@VLQQi@ L,l}exc2mǞB?+|O"'r r[`nK !" N3ѼmWf"t-n0Pт9 ,s֣IqEG)p=$B HiprgxܜZ4 Z&U-fpmg!Ǟ%ފR&D1-bfAQ-R+hV=SȻp3ÿJcQ*RG%ܢm+e"Sq !jbF9_4<ܱ}8zHz:nHz:##sN7*C@?}G)χ5C/oQ}b c`#/ɫ)4L@#W*r|O =5#H~@4׀6?a~Ԡ7L P*˾ujT#f< (]Gf1ЫkdJP' & w1# kdJmէU@}j kdJPWσsnT;\8ș&BvIUsvn84mbT&#GϺ^Q؅&6w_3mg]􃤱W&vI-]:LCYH{UmbX`xW%>P~icoT&E~O=6>KŋW]=$v& &u?ݿݑIENDB`teeworlds-0.6.2+dfsg/data/skins/twinbop.png0000644000175000017500000001300212140200333017656 0ustar felixfelixPNG  IHDR䵷 IDATx]$E@2Qk `l(FbLƬ F_YUPԘ8*&oPqDBPr}A>|5SskvO:UzOe;UNUUUjĈmRˇ8#wL5_TJ-"Jcy @Cgy-CliJ8H3!!ˤ̈C%wy &nc&R q(b{ B9󹵖Z%E,ҢC#G>R䡈e?4ϝc:U 9'4*z:CsZp8]~&c(ZےVvn12? !AZ'=PusӸTo/zEuWg=FGqr~=4<6?cn-)gVW-?n]W}Y`P ߵoBј|6??NuMX:B4瘪PhM)HK/bܭ{;"Zq >4uih9B. ~+nV>5(1N 3ήxɫk_Nݕ¿?&TԾȜxNѽ/cr_bѵ&X{[Iq`B[%= =1Y(=5`rDl՝ֻ-/ᔉP@]5=Wcqǵͮ*~8~VAsNWxN_-[OLă#!z7)̌SN&`oUwSbˤρL0-J zN f/ۑ{lY3SWZRHafEfse;$L]}RZ8ZJ+V(y1Fcٛnr$d5A%G} *E cðM1CgTn?G8oz8P@D A70wCrD̕@C#"PZc.IþΩ%;M@CcJ!Dr"@!/`Q@nM kzs?c߸}uC?|w~U=v/}w9|<~dsPȤ 0ЙCxoQo9Դ?Qht05W-{G+)X9r%/)m Dˑ?tэ_w{6(OJ^QRdK!ȇzk [`$5'sM ccJ!(Ce ]qR z{o f{ ܓmmzInf2T1e; y(B1\ԚxҡC+_근4ϜuvT_JW繒r Q|k^{m=B:_/~Ɖ?~^M~J|E(;(o" g[" 'u0 {z\*y!J1ɲ7!+[V"}A,@{r F)vĔ{UDwCA@G/t i1]xy78|9 ۆd$0Y<|m$BTP X%Xw^wILnQ6e9.Ba@7]\ mCN!*b(ZkTNwGꁛă_[wͲ%]d]r=!=ʘu~z̎߸ mˆfrО[hE66`pμѸ"wWǯ[[{/9b2s\Ӽ5`sA-b} t80 3VКR'CunnV] ]^ )AOacl(q `,S St8wy ?$ǁ'J^1<@#%@.FuۂTVhdl8@A\PQ;Bǿ[W YgJ^Q)2(h T`m?mDl ZpΐkrNGB 3 1!@ A+!1⯵EJq\AU =%TwRtuw_ P!~ U~w?`^o&Z f`oNW;s[G\yE VaRy \L-ǥCug;I7sIԅAW[|/DsM'._ɩO?=\8gOӎ?o)Q!Oh > KIJ S {v7QՑԁ# 6;jSNկw$7v.y>`OE}9$ AlLB,=Zp@#hGI#H CP d6` o1SRP \B(~a `ZwOBGD'+Ryͼ(-e>r@F ϶3ߩ $ 偟>zA L_m-Ų^Uq$W>\:"!!"TH_Mo>|֖GZXC@ $ƿXkŕ:BW@%9%942bT@%9:H,UĪKr0T%9m%-b/h?2q m\fyetKE}34gq0'RюolTGj^l" җW[nqѥe=p%ӷ_C&VE4蔊UDCM!Yg=W^i!6h`ϕ{Mj2q> uoCN=1s#?l^R9`?f`,@TO4yJhwkzqOsn4 7vM]r!X-m^AhF)j?@ÎL.<` hv-SvkҎ9P.[\10)-t&߇%5~Rr>Zh`M^H.m#佟&-@\J-d0y*0T佟&-@LZ3{Ev^ |ሼDG49iV8% 0@aw S`l9 HZ^* ZϘ>y3L!1!I6:_U{pϢ{ \*6?>hJ\1M=O" (0 ,-T@4l[/` iNT9 m#Vt##'iKZLK7F>;"WXPҢK DwK#,_tC#@z{2b&\AlKo>BERzŖ*B/~*ɁgcBJה'qN?1"%k˓RG(crrِ{$.! O99lNRt8t|o<6KmIENDB`teeworlds-0.6.2+dfsg/data/skins/twintri.png0000644000175000017500000001216112140200333017701 0ustar felixfelixPNG  IHDR䵷 8IDATx]UHH"ҩ - T})(*HqlPA0X P->@ Byn @I$\`w9tܙ9k93+=콾Y7{0d5j An^?IQFvANtLrk԰ &Gn׎ԨQUPi4IQT6Qjk؏^Ť!C080uC"atunyBV,]A3Xͬa>: e(Y uGM𵣏-\'3c: Г ]Ą4>&:'[A%emsP|pw?|&6jJ;X uR"uU[Xwtn@{ZGxc09’= \c7yOD7>ԅ jaV hmㆍdl@y^s0"k (I*a]#Oy>nnlH:#Bo!񧢄Ԃ6Z)$z"5 G&ȶ]Vv g 5pYDŽ=%o.NŽO->ܙ{B_x s.\l q'p„ O?Ԉ3?!u ՆnB"~i+ŗ{Qp;I,rӀQ!50+g}&:õ[4l/e=֏mG L+S[=(ygyQH15@!μ! ƒ=0Wg>Egb\0:'.Āw0!4# 9PP*1(V!i!$su倗넅yq0݄`:1|L—$0"+PPFxNx ?!>ȺHP дyhIeM27!>? éqEr5VPg[qͦo_rY(~ë6βal?;ۦDL|FtBIkAmm' ?gNͥFW2z᪄1CJD (l^=5\%k3>e=CBmS31>]^_`b WI41$41,Gg!ӵOn}yn&N>'J0]F/T1d&0ck9Qx]3zq!G [Cr[~Y}[ 6~5Au^!40!~p+ {VBCNMMQX̜ 3q`xtmB?`;/j6=]CA*Ix,?]ֺ'1Q6Hy`y@y)CA xSM:ш%Hj3ؓZV$񻬽i^{Mw ψpyw|afc28 e}kOdTm dD[>cF$ xQa,Y"|1u:O8NpU[Qdx~``|:%-/ͩ <( ڋ2=Q*R&E0hU9Osnʻ6޹6rp4`̸qes ๿^nk^a a,x.upFUħN=*ݻ€wG[}߮5-W|+kà4Vh"v-v~@"mݯN >CspOD{K>{I`]x}cg_UZ ݷmF w)2V3z!RȪLyþ~>?~B8K}SG=7nϹ2g-xǭQj>z@ˎFY| ы6?-8 \]NڃvW,YTKO 5Ztp)cH5BGqd8mj_ 1ы.$ iFɧ)8h^tƞAGF(¡J: FG ۻ?}w|\Sg4 e04$mNq,1XG ;</:ϟ#a4 C)h8np~;c^6껦$=藊@59\'&H"W ):Om֘d)0^`ݿg䁑 :BL (QdaQ$ϰ⌃ T' oWsp>ˈF  V UHUsrkI7?rxz/ĉxPu!ů:/IzgXG]$P+,~;/j^(_un0& Aȃ;N ovBַo2 PaY*s4tt 䝈?bSϻ{[~ +52z @l\M&yF n>EEݵgg +e`Xh 25Or$8s7(wõ=ߟ'86vi_z `BԊUa@T01xх#ՅDŻbMVWj# Ma;g[^:YQcC~̘[[l4^l͑q2$θXN;+sO㧗~?"$[V XmᲖ6e 6Eٹe5}%kS&UkgE{0v8pP-Q].MbAN8@ZLx@>&v漾pgWm=ȼ  |۲X&`1&4G'y䃣y EQ[#.{vŜz9k&Rz$@ "%zԢ6Ļo tK+e&`ÈФI^Pw0\]`0xXcCoiUf#yze2gIhǣXudH;5:R7 LE |M ̈́h{V77@GI5b*YQ"|V@ ZUswvrd,}&{T)UѾ@xetHcum67nlKzp;SE #y #ߜ}3E& ȵ7BGQU{/2XGd$mWAdLs_L7`@e Mo3'!rdt{L?d M Em:)A!e_7mT]:Pu ecW>%Ô xlh'/@]cG' t l2\fPW&L `|ޅk[רg2 վmJg@U@~>+-kpzX$7j>K Q$v @5w @bl@|}YmߺI&9U2o6sW=saVt*4^xaqDel2`h&>S 7q뫧B@UE?u`S%D.6[xm+>:D.4xX|`Se\dC&۷d:9D.2@ڷDy˸ ěh鏎ϪŶ+/mE$^we(2t?琖tIENDB`teeworlds-0.6.2+dfsg/data/skins/warpaint.png0000644000175000017500000001207512140200333020032 0ustar felixfelixPNG  IHDR䵷 IDATx]mh5k 1&k4#i՚"!~+!Ji D+ii=?Rhi@`Ti{K'mԟRwϙs=gz=/<眙yRJQFŰT95jp,7Dר ܬz]'E+RFUA=Ҡ&F lP_5*ac%sh̡59! P\unyaEGm-V3D̼a[ne(Y H]x\V\.?ve+G >#ܳBOis (A du@>\_B j@3\QtDl;=Y DA0M[ҳom=b0@'"x"p+=OGbU1~N[0Jޅ 1#h ZC @g 1Iy.3ȗD?)~۠0r#D]*~zL'ARM8/ "Lr8H 4Q:?'"_x$舑 зӀulIeM2f2!<?Léů[U+// #j"&`/|F[''`{@c(qaJ'BmP~z\r j?O͈2,#ѝrg፧&Órd%EtA/\fU8W, ~qڷ''O?]!ĐP@~tLLʂ[}.cSC, ?6Ϝ&zE?W;\=ڸZuH`^.QXC2Ple@ƥٖadH]{[ Kdpk zi2p۶u$#&.Γ[rEn^.GyH#1;^SЋRgc,o>ck u, E+8}!Đcd  ݼq|rnܣSO_Z܃K_,O=2)}yR>q{߯I +&aQ$߂qõ==tg0 l]@_[ޤiusnʻ6v߲6rpx4uv.v8ОLcsOj#7ʭǮEߵă5b}{7Er^^~{SG_oܿs[mQ8tA=p+υtot+g|N۶C4ۣ=}_:&{q\{j\` y|WL [y;?Hn~i ۮ[Cƴ"h{n(oB>EH>vxд3Dc?O_Bl>AFCЋn|m'AE?[p}oq۽g-2aqaL@3"}oZٛ>ŔE-L^C[ώwG2hbHq)~j0$ۂ,Sa x@aV0Dnoƈvp #2^.KMZ}'#ԋA1- Gs0uu\ SRӣL/w щxt8/>A/ThbHFGԙ]tUQg tvP(+ڹvn:7 ?u:2eV,m3㑿:6?B,5fsZ m3Hu6MDfrĄ|S#?[k~D -LI J o?_OCQ9dg"zg/~Mޛ^:2U rd%1# (%EL?2 @tjjyplFĔ+l;[M`X>  L~4 L],%”u_dfk3ֈPt%:ƀ 蔽[V`S6 %j[=0~T3dA-ڪ%- e#wRX{^ ZU_/Sk:$uG"烂' x9 $SwJܫƐk)SuJ|19ˀ n 9sÁe"QǹQsRQPuގۻ)aQSX>X A]WP鑛Pt64RhlsTU('jRkΉ+/.p>Ԅ(\v²{r&F2k&F[h@MbaLʦοFMVMCr9yeQ65S%Y&(EVT~Wg);\4Ͳ9fCc`.B*#\59F10 ljSDnN ljjlGf  lj?5bQ9" _ lj?5cAYB lj?5Ȉ#Z!7 o Y(] ֧eOC}\pXxb |xO)@.Tـ{ 3u! #6E,?Q!ثF 'O ?bXnFej;vCW@Fz7 #}ޜsLk[dn.4B @S"U262gu5 ah'W/0'M}=xV D.<@Ơ70\E M02ȡ 32\# _/l%_΁4*}mGK-#5jq2Bw[ &SmX,?yhH?¿F->@F(x|01F`+ ( ,kd؞"i$ Z][~bYA[;P S_ h`FrYadlz"`Q\XԷ}ʷ= 5Vqh4׀Zx\ ZfF}0h^g0{mB й #tGFS~!a @+q`_rBcJ.H`(U>jJty]xG$Lt@?F.:n@F$,>Q~(4ݠz~@Qfg |u}(ظ5s|6YS˪8%LcYՉ\dxs|&Yp{D.2tcy˻ ({ө[+R/gF$ue|e<]`6f'nIENDB`teeworlds-0.6.2+dfsg/data/skins/x_ninja.png0000644000175000017500000001100712140200333017625 0ustar felixfelixPNG  IHDR䵷 IDATx]KEPC`& {O` _ms< Q#d5ľ%KRH&O{2?r;vw߮:uO˭sԣyxx< FUn${xYnD{x[]nd{x(w#}Ht[&Ã6j=GXl~xc1H]Q0Ι1ǸǶD8b& 4Pƒ2ʚ|s| RW}MkYЀzݝ=/p!Ғ=ss>`Ԁ& ?qulZϷa-/a?3_Z~?8~<@(V' /}E`[W{LR$hıżꪒ[G._xA H<[c;gBc}8{W0W:{ C[mÁ۟oAF kF->1{?pmeE$CGI&o/tըE A<֫.\usm V .ŨEMPklkqjȊO1xQ{ J}3jq6bzvHH A,sRkO>oku )YK~o}7רEn@@Eu |Tz ;b`6 7J塋Aw"}*j>goߔZ-a~Qg-q6]ӶJ/߼S盉@=]/}7s|ͣw;s]_x晩 g姧4sH,U:!>sgeՂzb;B?;!^^$@€{ PFӯ_x~MGLm`ﻕīh1H࣋y嗓>F,p20mYP@>~rKDb 6 $TTlVjc,ɉ{YJJI&'`@1/]F EE}XzLK,s'b/dΟnCMLT;~SWZ ~]-D*Y(P7//oi@@ǂ)~i J_bm8Y K V]ُM:*~Ӏ #O>`+'Ϟ_:?oO9a 1wyVM61CPSwwE[k"V4`+0zQD RhߴpήnF1zQچ3_h!>zjNYh#? h(~C5M3Xfޣ@HkWdm/1P!H *2G" h2&bB1E,?_ݽ˿} wnW/]ss{ R-*Bl*uY)hыV-~B?=~UGU8v"о;Ͷ/}#+#]:oOQ,_셁x{PIYC@a O"Žv).mb N.3OOK yT6 b0EHFW|׈$8s\x?Y!D$h$P'N<,\)hoߗ1tL%_<@}‚;rѶAW#O/ ]luRq&Dl[X˛^}pb<<"tv 6;ԝH>y>d"u*0U>t2(ag1{}@ zXWFbcHXPu:˴Ųfu7}6yΝ;oE+pr% _{t1\0$x:U.DR)"+7&;v ĻxC UHjj&y1 eWw5}hDž@ h!#b&6<KD{ApUQpk'Z yiGMׁm@e1yS36d􂴍l͔0Xhˑ಍?9GG&+!}[S&Z1T >i 5MWHF/J $PCO_ Rt>F4'pwCAFQ@y?t|Q6877bRI1GGUşCӔ#T!FHZ|6v`8ux0*d$_xC0Tğy1h@Q9 x( T!vj8%(N=K]6Ty_21)pudۯ͠3j +C&KA8y腫 ~] |rFIlom2Y:=~Nk1z73m44 `] *o}ނ_jk>`B+~a_YDv7p VG%IW4P%Wj!?sg[@W/ DlKkxG@MbN@Icđދ!s:$; #fGu1d?8ȏ*ƿp3i>\ %GV`N^HoJz$7̐j s 5pK' =~|}}E{>uO#᫐ڒ$],F0!p$>=`Acpuwr{o~U2]@ [fgbVc0atqy&V Qi%#f7N::%1Җ\#zeF-f#fnjݎ80[bH3F-bb jaq#1E嘺Dx6f[`=\B;kKL(QYKxaؔGInb+E"b@$Hy/?hknh}|QT+BP9\pQR757 1 h-9T:^jhԜh4q/&vä5b$EM`AX6ƽ#mC^ PAr<<<@t wÃxxxЁ:;Aօ8IENDB`teeworlds-0.6.2+dfsg/datasrc/0000755000175000017500000000000012140200333015053 5ustar felixfelixteeworlds-0.6.2+dfsg/datasrc/compile.py0000644000175000017500000002172212140200333017061 0ustar felixfeliximport os, imp, sys from datatypes import * import content import network def create_enum_table(names, num): lines = [] lines += ["enum", "{"] lines += ["\t%s=0,"%names[0]] for name in names[1:]: lines += ["\t%s,"%name] lines += ["\t%s" % num, "};"] return lines def create_flags_table(names): lines = [] lines += ["enum", "{"] i = 0 for name in names: lines += ["\t%s = 1<<%d," % (name,i)] i += 1 lines += ["};"] return lines def EmitEnum(names, num): print("enum") print("{") print("\t%s=0," % names[0]) for name in names[1:]: print("\t%s," % name) print("\t%s" % num) print("};") def EmitFlags(names, num): print("enum") print("{") i = 0 for name in names: print("\t%s = 1<<%d," % (name,i)) i += 1 print("};") gen_network_header = False gen_network_source = False gen_client_content_header = False gen_client_content_source = False gen_server_content_header = False gen_server_content_source = False if "network_header" in sys.argv: gen_network_header = True if "network_source" in sys.argv: gen_network_source = True if "client_content_header" in sys.argv: gen_client_content_header = True if "client_content_source" in sys.argv: gen_client_content_source = True if "server_content_header" in sys.argv: gen_server_content_header = True if "server_content_source" in sys.argv: gen_server_content_source = True if gen_client_content_header: print("#ifndef CLIENT_CONTENT_HEADER") print("#define CLIENT_CONTENT_HEADER") if gen_server_content_header: print("#ifndef SERVER_CONTENT_HEADER") print("#define SERVER_CONTENT_HEADER") if gen_client_content_header or gen_server_content_header: # emit the type declarations contentlines = open("datasrc/content.py", "rb").readlines() order = [] for line in contentlines: line = line.strip() if line[:6] == "class ".encode() and "(Struct)".encode() in line: order += [line.split()[1].split("(".encode())[0].decode("ascii")] for name in order: EmitTypeDeclaration(content.__dict__[name]) # the container pointer print('extern CDataContainer *g_pData;') # enums EmitEnum(["IMAGE_%s"%i.name.value.upper() for i in content.container.images.items], "NUM_IMAGES") EmitEnum(["ANIM_%s"%i.name.value.upper() for i in content.container.animations.items], "NUM_ANIMS") EmitEnum(["SPRITE_%s"%i.name.value.upper() for i in content.container.sprites.items], "NUM_SPRITES") if gen_client_content_source or gen_server_content_source: if gen_client_content_source: print('#include "client_data.h"') if gen_server_content_source: print('#include "server_data.h"') EmitDefinition(content.container, "datacontainer") print('CDataContainer *g_pData = &datacontainer;') # NETWORK if gen_network_header: print("#ifndef GAME_GENERATED_PROTOCOL_H") print("#define GAME_GENERATED_PROTOCOL_H") print(network.RawHeader) for e in network.Enums: for l in create_enum_table(["%s_%s"%(e.name, v) for v in e.values], 'NUM_%sS'%e.name): print(l) print("") for e in network.Flags: for l in create_flags_table(["%s_%s" % (e.name, v) for v in e.values]): print(l) print("") for l in create_enum_table(["NETOBJ_INVALID"]+[o.enum_name for o in network.Objects], "NUM_NETOBJTYPES"): print(l) print("") for l in create_enum_table(["NETMSG_INVALID"]+[o.enum_name for o in network.Messages], "NUM_NETMSGTYPES"): print(l) print("") for item in network.Objects + network.Messages: for line in item.emit_declaration(): print(line) print("") EmitEnum(["SOUND_%s"%i.name.value.upper() for i in content.container.sounds.items], "NUM_SOUNDS") EmitEnum(["WEAPON_%s"%i.name.value.upper() for i in content.container.weapons.id.items], "NUM_WEAPONS") print(""" class CNetObjHandler { const char *m_pMsgFailedOn; const char *m_pObjCorrectedOn; char m_aMsgData[1024]; int m_NumObjCorrections; int ClampInt(const char *pErrorMsg, int Value, int Min, int Max); static const char *ms_apObjNames[]; static int ms_aObjSizes[]; static const char *ms_apMsgNames[]; public: CNetObjHandler(); int ValidateObj(int Type, void *pData, int Size); const char *GetObjName(int Type); int GetObjSize(int Type); int NumObjCorrections(); const char *CorrectedObjOn(); const char *GetMsgName(int Type); void *SecureUnpackMsg(int Type, CUnpacker *pUnpacker); const char *FailedMsgOn(); }; """) print("#endif // GAME_GENERATED_PROTOCOL_H") if gen_network_source: # create names lines = [] lines += ['#include '] lines += ['#include '] lines += ['#include "protocol.h"'] lines += ['CNetObjHandler::CNetObjHandler()'] lines += ['{'] lines += ['\tm_pMsgFailedOn = "";'] lines += ['\tm_pObjCorrectedOn = "";'] lines += ['\tm_NumObjCorrections = 0;'] lines += ['}'] lines += [''] lines += ['int CNetObjHandler::NumObjCorrections() { return m_NumObjCorrections; }'] lines += ['const char *CNetObjHandler::CorrectedObjOn() { return m_pObjCorrectedOn; }'] lines += ['const char *CNetObjHandler::FailedMsgOn() { return m_pMsgFailedOn; }'] lines += [''] lines += [''] lines += [''] lines += [''] lines += [''] lines += ['static const int max_int = 0x7fffffff;'] lines += ['int CNetObjHandler::ClampInt(const char *pErrorMsg, int Value, int Min, int Max)'] lines += ['{'] lines += ['\tif(Value < Min) { m_pObjCorrectedOn = pErrorMsg; m_NumObjCorrections++; return Min; }'] lines += ['\tif(Value > Max) { m_pObjCorrectedOn = pErrorMsg; m_NumObjCorrections++; return Max; }'] lines += ['\treturn Value;'] lines += ['}'] lines += ["const char *CNetObjHandler::ms_apObjNames[] = {"] lines += ['\t"invalid",'] lines += ['\t"%s",' % o.name for o in network.Objects] lines += ['\t""', "};", ""] lines += ["int CNetObjHandler::ms_aObjSizes[] = {"] lines += ['\t0,'] lines += ['\tsizeof(%s),' % o.struct_name for o in network.Objects] lines += ['\t0', "};", ""] lines += ['const char *CNetObjHandler::ms_apMsgNames[] = {'] lines += ['\t"invalid",'] for msg in network.Messages: lines += ['\t"%s",' % msg.name] lines += ['\t""'] lines += ['};'] lines += [''] lines += ['const char *CNetObjHandler::GetObjName(int Type)'] lines += ['{'] lines += ['\tif(Type < 0 || Type >= NUM_NETOBJTYPES) return "(out of range)";'] lines += ['\treturn ms_apObjNames[Type];'] lines += ['};'] lines += [''] lines += ['int CNetObjHandler::GetObjSize(int Type)'] lines += ['{'] lines += ['\tif(Type < 0 || Type >= NUM_NETOBJTYPES) return 0;'] lines += ['\treturn ms_aObjSizes[Type];'] lines += ['};'] lines += [''] lines += ['const char *CNetObjHandler::GetMsgName(int Type)'] lines += ['{'] lines += ['\tif(Type < 0 || Type >= NUM_NETMSGTYPES) return "(out of range)";'] lines += ['\treturn ms_apMsgNames[Type];'] lines += ['};'] lines += [''] for l in lines: print(l) if 0: for item in network.Objects: for line in item.emit_validate(): print(line) print("") # create validate tables lines = [] lines += ['static int validate_invalid(void *data, int size) { return -1; }'] lines += ["typedef int(*VALIDATEFUNC)(void *data, int size);"] lines += ["static VALIDATEFUNC validate_funcs[] = {"] lines += ['\tvalidate_invalid,'] lines += ['\tvalidate_%s,' % o.name for o in network.Objects] lines += ["\t0x0", "};", ""] lines += ["int netobj_validate(int type, void *data, int size)"] lines += ["{"] lines += ["\tif(type < 0 || type >= NUM_NETOBJTYPES) return -1;"] lines += ["\treturn validate_funcs[type](data, size);"] lines += ["};", ""] lines = [] lines += ['int CNetObjHandler::ValidateObj(int Type, void *pData, int Size)'] lines += ['{'] lines += ['\tswitch(Type)'] lines += ['\t{'] for item in network.Objects: for line in item.emit_validate(): lines += ["\t" + line] lines += ['\t'] lines += ['\t}'] lines += ['\treturn -1;'] lines += ['};'] lines += [''] #int Validate(int Type, void *pData, int Size); if 0: for item in network.Messages: for line in item.emit_unpack(): print(line) print("") lines += ['static void *secure_unpack_invalid(CUnpacker *pUnpacker) { return 0; }'] lines += ['typedef void *(*SECUREUNPACKFUNC)(CUnpacker *pUnpacker);'] lines += ['static SECUREUNPACKFUNC secure_unpack_funcs[] = {'] lines += ['\tsecure_unpack_invalid,'] for msg in network.Messages: lines += ['\tsecure_unpack_%s,' % msg.name] lines += ['\t0x0'] lines += ['};'] # lines += ['void *CNetObjHandler::SecureUnpackMsg(int Type, CUnpacker *pUnpacker)'] lines += ['{'] lines += ['\tm_pMsgFailedOn = 0;'] lines += ['\tswitch(Type)'] lines += ['\t{'] for item in network.Messages: for line in item.emit_unpack(): lines += ["\t" + line] lines += ['\t'] lines += ['\tdefault:'] lines += ['\t\tm_pMsgFailedOn = "(type out of range)";'] lines += ['\t\tbreak;'] lines += ['\t}'] lines += ['\t'] lines += ['\tif(pUnpacker->Error())'] lines += ['\t\tm_pMsgFailedOn = "(unpack error)";'] lines += ['\t'] lines += ['\tif(m_pMsgFailedOn)'] lines += ['\t\treturn 0;'] lines += ['\tm_pMsgFailedOn = "";'] lines += ['\treturn m_aMsgData;'] lines += ['};'] lines += [''] for l in lines: print(l) if gen_client_content_header or gen_server_content_header: print("#endif") teeworlds-0.6.2+dfsg/datasrc/content.py0000644000175000017500000005271412140200333017110 0ustar felixfeliximport copy from datatypes import * class Sound(Struct): def __init__(self, filename=""): Struct.__init__(self, "CDataSound") self.id = Int(0) self.filename = String(filename) class SoundSet(Struct): def __init__(self, name="", files=[]): Struct.__init__(self, "CDataSoundset") self.name = String(name) self.sounds = Array(Sound()) self.last = Int(-1) for name in files: self.sounds.Add(Sound(name)) class Image(Struct): def __init__(self, name="", filename=""): Struct.__init__(self, "CDataImage") self.name = String(name) self.filename = String(filename) self.id = Int(-1) class SpriteSet(Struct): def __init__(self, name="", image=None, gridx=0, gridy=0): Struct.__init__(self, "CDataSpriteset") self.image = Pointer(Image, image) # TODO self.gridx = Int(gridx) self.gridy = Int(gridy) class Sprite(Struct): def __init__(self, name="", Set=None, x=0, y=0, w=0, h=0): Struct.__init__(self, "CDataSprite") self.name = String(name) self.set = Pointer(SpriteSet, Set) # TODO self.x = Int(x) self.y = Int(y) self.w = Int(w) self.h = Int(h) class Pickup(Struct): def __init__(self, name="", respawntime=15, spawndelay=0): Struct.__init__(self, "CDataPickupspec") self.name = String(name) self.respawntime = Int(respawntime) self.spawndelay = Int(spawndelay) class AnimKeyframe(Struct): def __init__(self, time=0, x=0, y=0, angle=0): Struct.__init__(self, "CAnimKeyframe") self.time = Float(time) self.x = Float(x) self.y = Float(y) self.angle = Float(angle) class AnimSequence(Struct): def __init__(self): Struct.__init__(self, "CAnimSequence") self.frames = Array(AnimKeyframe()) class Animation(Struct): def __init__(self, name=""): Struct.__init__(self, "CAnimation") self.name = String(name) self.body = AnimSequence() self.back_foot = AnimSequence() self.front_foot = AnimSequence() self.attach = AnimSequence() class WeaponSpec(Struct): def __init__(self, container=None, name=""): Struct.__init__(self, "CDataWeaponspec") self.name = String(name) self.sprite_body = Pointer(Sprite, Sprite()) self.sprite_cursor = Pointer(Sprite, Sprite()) self.sprite_proj = Pointer(Sprite, Sprite()) self.sprite_muzzles = Array(Pointer(Sprite, Sprite())) self.visual_size = Int(96) self.firedelay = Int(500) self.maxammo = Int(10) self.ammoregentime = Int(0) self.damage = Int(1) self.offsetx = Float(0) self.offsety = Float(0) self.muzzleoffsetx = Float(0) self.muzzleoffsety = Float(0) self.muzzleduration = Float(5) # dig out sprites if we have a container if container: for sprite in container.sprites.items: if sprite.name.value == "weapon_"+name+"_body": self.sprite_body.Set(sprite) elif sprite.name.value == "weapon_"+name+"_cursor": self.sprite_cursor.Set(sprite) elif sprite.name.value == "weapon_"+name+"_proj": self.sprite_proj.Set(sprite) elif "weapon_"+name+"_muzzle" in sprite.name.value: self.sprite_muzzles.Add(Pointer(Sprite, sprite)) class Weapon_Hammer(Struct): def __init__(self): Struct.__init__(self, "CDataWeaponspecHammer") self.base = Pointer(WeaponSpec, WeaponSpec()) class Weapon_Gun(Struct): def __init__(self): Struct.__init__(self, "CDataWeaponspecGun") self.base = Pointer(WeaponSpec, WeaponSpec()) self.curvature = Float(1.25) self.speed = Float(2200) self.lifetime = Float(2.0) class Weapon_Shotgun(Struct): def __init__(self): Struct.__init__(self, "CDataWeaponspecShotgun") self.base = Pointer(WeaponSpec, WeaponSpec()) self.curvature = Float(1.25) self.speed = Float(2200) self.speeddiff = Float(0.8) self.lifetime = Float(0.25) class Weapon_Grenade(Struct): def __init__(self): Struct.__init__(self, "CDataWeaponspecGrenade") self.base = Pointer(WeaponSpec, WeaponSpec()) self.curvature = Float(7.0) self.speed = Float(1000) self.lifetime = Float(2.0) class Weapon_Rifle(Struct): def __init__(self): Struct.__init__(self, "CDataWeaponspecRifle") self.base = Pointer(WeaponSpec, WeaponSpec()) self.reach = Float(800.0) self.bounce_delay = Int(150) self.bounce_num = Int(1) self.bounce_cost = Float(0) class Weapon_Ninja(Struct): def __init__(self): Struct.__init__(self, "CDataWeaponspecNinja") self.base = Pointer(WeaponSpec, WeaponSpec()) self.duration = Int(15000) self.movetime = Int(200) self.velocity = Int(50) class Weapons(Struct): def __init__(self): Struct.__init__(self, "CDataWeaponspecs") self.hammer = Weapon_Hammer() self.gun = Weapon_Gun() self.shotgun = Weapon_Shotgun() self.grenade = Weapon_Grenade() self.rifle = Weapon_Rifle() self.ninja = Weapon_Ninja() self.id = Array(WeaponSpec()) class DataContainer(Struct): def __init__(self): Struct.__init__(self, "CDataContainer") self.sounds = Array(SoundSet()) self.images = Array(Image()) self.pickups = Array(Pickup()) self.spritesets = Array(SpriteSet()) self.sprites = Array(Sprite()) self.animations = Array(Animation()) self.weapons = Weapons() def FileList(format, num): return [format%(x+1) for x in range(0,num)] container = DataContainer() container.sounds.Add(SoundSet("gun_fire", FileList("audio/wp_gun_fire-%02d.wv", 3))) container.sounds.Add(SoundSet("shotgun_fire", FileList("audio/wp_shotty_fire-%02d.wv", 3))) container.sounds.Add(SoundSet("grenade_fire", FileList("audio/wp_flump_launch-%02d.wv", 3))) container.sounds.Add(SoundSet("hammer_fire", FileList("audio/wp_hammer_swing-%02d.wv", 3))) container.sounds.Add(SoundSet("hammer_hit", FileList("audio/wp_hammer_hit-%02d.wv", 3))) container.sounds.Add(SoundSet("ninja_fire", FileList("audio/wp_ninja_attack-%02d.wv", 3))) container.sounds.Add(SoundSet("grenade_explode", FileList("audio/wp_flump_explo-%02d.wv", 3))) container.sounds.Add(SoundSet("ninja_hit", FileList("audio/wp_ninja_hit-%02d.wv", 3))) container.sounds.Add(SoundSet("rifle_fire", FileList("audio/wp_rifle_fire-%02d.wv", 3))) container.sounds.Add(SoundSet("rifle_bounce", FileList("audio/wp_rifle_bnce-%02d.wv", 3))) container.sounds.Add(SoundSet("weapon_switch", FileList("audio/wp_switch-%02d.wv", 3))) container.sounds.Add(SoundSet("player_pain_short", FileList("audio/vo_teefault_pain_short-%02d.wv", 12))) container.sounds.Add(SoundSet("player_pain_long", FileList("audio/vo_teefault_pain_long-%02d.wv", 2))) container.sounds.Add(SoundSet("body_land", FileList("audio/foley_land-%02d.wv", 4))) container.sounds.Add(SoundSet("player_airjump", FileList("audio/foley_dbljump-%02d.wv", 3))) container.sounds.Add(SoundSet("player_jump", FileList("audio/foley_foot_left-%02d.wv", 4) + FileList("audio/foley_foot_right-%02d.wv", 4))) container.sounds.Add(SoundSet("player_die", FileList("audio/foley_body_splat-%02d.wv", 3))) container.sounds.Add(SoundSet("player_spawn", FileList("audio/vo_teefault_spawn-%02d.wv", 7))) container.sounds.Add(SoundSet("player_skid", FileList("audio/sfx_skid-%02d.wv", 4))) container.sounds.Add(SoundSet("tee_cry", FileList("audio/vo_teefault_cry-%02d.wv", 2))) container.sounds.Add(SoundSet("hook_loop", FileList("audio/hook_loop-%02d.wv", 2))) container.sounds.Add(SoundSet("hook_attach_ground", FileList("audio/hook_attach-%02d.wv", 3))) container.sounds.Add(SoundSet("hook_attach_player", FileList("audio/foley_body_impact-%02d.wv", 3))) container.sounds.Add(SoundSet("hook_noattach", FileList("audio/hook_noattach-%02d.wv", 2))) container.sounds.Add(SoundSet("pickup_health", FileList("audio/sfx_pickup_hrt-%02d.wv", 2))) container.sounds.Add(SoundSet("pickup_armor", FileList("audio/sfx_pickup_arm-%02d.wv", 4))) container.sounds.Add(SoundSet("pickup_grenade", ["audio/sfx_pickup_launcher.wv"])) container.sounds.Add(SoundSet("pickup_shotgun", ["audio/sfx_pickup_sg.wv"])) container.sounds.Add(SoundSet("pickup_ninja", ["audio/sfx_pickup_ninja.wv"])) container.sounds.Add(SoundSet("weapon_spawn", FileList("audio/sfx_spawn_wpn-%02d.wv", 3))) container.sounds.Add(SoundSet("weapon_noammo", FileList("audio/wp_noammo-%02d.wv", 5))) container.sounds.Add(SoundSet("hit", FileList("audio/sfx_hit_weak-%02d.wv", 2))) container.sounds.Add(SoundSet("chat_server", ["audio/sfx_msg-server.wv"])) container.sounds.Add(SoundSet("chat_client", ["audio/sfx_msg-client.wv"])) container.sounds.Add(SoundSet("chat_highlight", ["audio/sfx_msg-highlight.wv"])) container.sounds.Add(SoundSet("ctf_drop", ["audio/sfx_ctf_drop.wv"])) container.sounds.Add(SoundSet("ctf_return", ["audio/sfx_ctf_rtn.wv"])) container.sounds.Add(SoundSet("ctf_grab_pl", ["audio/sfx_ctf_grab_pl.wv"])) container.sounds.Add(SoundSet("ctf_grab_en", ["audio/sfx_ctf_grab_en.wv"])) container.sounds.Add(SoundSet("ctf_capture", ["audio/sfx_ctf_cap_pl.wv"])) container.sounds.Add(SoundSet("menu", ["audio/music_menu.wv"])) image_null = Image("null", "") image_particles = Image("particles", "particles.png") image_game = Image("game", "game.png") image_browseicons = Image("browseicons", "browse_icons.png") image_emoticons = Image("emoticons", "emoticons.png") image_demobuttons = Image("demobuttons", "demo_buttons.png") image_fileicons = Image("fileicons", "file_icons.png") image_guibuttons = Image("guibuttons", "gui_buttons.png") image_guiicons = Image("guiicons", "gui_icons.png") container.images.Add(image_null) container.images.Add(image_game) container.images.Add(image_particles) container.images.Add(Image("cursor", "gui_cursor.png")) container.images.Add(Image("banner", "gui_logo.png")) container.images.Add(image_emoticons) container.images.Add(image_browseicons) container.images.Add(Image("console_bg", "console.png")) container.images.Add(Image("console_bar", "console_bar.png")) container.images.Add(image_demobuttons) container.images.Add(image_fileicons) container.images.Add(image_guibuttons) container.images.Add(image_guiicons) container.pickups.Add(Pickup("health")) container.pickups.Add(Pickup("armor")) container.pickups.Add(Pickup("weapon")) container.pickups.Add(Pickup("ninja", 90, 90)) set_particles = SpriteSet("particles", image_particles, 8, 8) set_game = SpriteSet("game", image_game, 32, 16) set_tee = SpriteSet("tee", image_null, 8, 4) set_browseicons = SpriteSet("browseicons", image_browseicons, 4, 1) set_emoticons = SpriteSet("emoticons", image_emoticons, 4, 4) set_demobuttons = SpriteSet("demobuttons", image_demobuttons, 5, 1) set_fileicons = SpriteSet("fileicons", image_fileicons, 8, 1) set_guibuttons = SpriteSet("guibuttons", image_guibuttons, 12, 4) set_guiicons = SpriteSet("guiicons", image_guiicons, 8, 2) container.spritesets.Add(set_particles) container.spritesets.Add(set_game) container.spritesets.Add(set_tee) container.spritesets.Add(set_browseicons) container.spritesets.Add(set_emoticons) container.spritesets.Add(set_demobuttons) container.spritesets.Add(set_fileicons) container.spritesets.Add(set_guibuttons) container.spritesets.Add(set_guiicons) container.sprites.Add(Sprite("part_slice", set_particles, 0,0,1,1)) container.sprites.Add(Sprite("part_ball", set_particles, 1,0,1,1)) container.sprites.Add(Sprite("part_splat01", set_particles, 2,0,1,1)) container.sprites.Add(Sprite("part_splat02", set_particles, 3,0,1,1)) container.sprites.Add(Sprite("part_splat03", set_particles, 4,0,1,1)) container.sprites.Add(Sprite("part_smoke", set_particles, 0,1,1,1)) container.sprites.Add(Sprite("part_shell", set_particles, 0,2,2,2)) container.sprites.Add(Sprite("part_expl01", set_particles, 0,4,4,4)) container.sprites.Add(Sprite("part_airjump", set_particles, 2,2,2,2)) container.sprites.Add(Sprite("part_hit01", set_particles, 4,1,2,2)) container.sprites.Add(Sprite("health_full", set_game, 21,0,2,2)) container.sprites.Add(Sprite("health_empty", set_game, 23,0,2,2)) container.sprites.Add(Sprite("armor_full", set_game, 21,2,2,2)) container.sprites.Add(Sprite("armor_empty", set_game, 23,2,2,2)) container.sprites.Add(Sprite("star1", set_game, 15,0,2,2)) container.sprites.Add(Sprite("star2", set_game, 17,0,2,2)) container.sprites.Add(Sprite("star3", set_game, 19,0,2,2)) container.sprites.Add(Sprite("part1", set_game, 6,0,1,1)) container.sprites.Add(Sprite("part2", set_game, 6,1,1,1)) container.sprites.Add(Sprite("part3", set_game, 7,0,1,1)) container.sprites.Add(Sprite("part4", set_game, 7,1,1,1)) container.sprites.Add(Sprite("part5", set_game, 8,0,1,1)) container.sprites.Add(Sprite("part6", set_game, 8,1,1,1)) container.sprites.Add(Sprite("part7", set_game, 9,0,2,2)) container.sprites.Add(Sprite("part8", set_game, 11,0,2,2)) container.sprites.Add(Sprite("part9", set_game, 13,0,2,2)) container.sprites.Add(Sprite("weapon_gun_body", set_game, 2,4,4,2)) container.sprites.Add(Sprite("weapon_gun_cursor", set_game, 0,4,2,2)) container.sprites.Add(Sprite("weapon_gun_proj", set_game, 6,4,2,2)) container.sprites.Add(Sprite("weapon_gun_muzzle1", set_game, 8,4,3,2)) container.sprites.Add(Sprite("weapon_gun_muzzle2", set_game, 12,4,3,2)) container.sprites.Add(Sprite("weapon_gun_muzzle3", set_game, 16,4,3,2)) container.sprites.Add(Sprite("weapon_shotgun_body", set_game, 2,6,8,2)) container.sprites.Add(Sprite("weapon_shotgun_cursor", set_game, 0,6,2,2)) container.sprites.Add(Sprite("weapon_shotgun_proj", set_game, 10,6,2,2)) container.sprites.Add(Sprite("weapon_shotgun_muzzle1", set_game, 12,6,3,2)) container.sprites.Add(Sprite("weapon_shotgun_muzzle2", set_game, 16,6,3,2)) container.sprites.Add(Sprite("weapon_shotgun_muzzle3", set_game, 20,6,3,2)) container.sprites.Add(Sprite("weapon_grenade_body", set_game, 2,8,7,2)) container.sprites.Add(Sprite("weapon_grenade_cursor", set_game, 0,8,2,2)) container.sprites.Add(Sprite("weapon_grenade_proj", set_game, 10,8,2,2)) container.sprites.Add(Sprite("weapon_hammer_body", set_game, 2,1,4,3)) container.sprites.Add(Sprite("weapon_hammer_cursor", set_game, 0,0,2,2)) container.sprites.Add(Sprite("weapon_hammer_proj", set_game, 0,0,0,0)) container.sprites.Add(Sprite("weapon_ninja_body", set_game, 2,10,8,2)) container.sprites.Add(Sprite("weapon_ninja_cursor", set_game, 0,10,2,2)) container.sprites.Add(Sprite("weapon_ninja_proj", set_game, 0,0,0,0)) container.sprites.Add(Sprite("weapon_rifle_body", set_game, 2,12,7,3)) container.sprites.Add(Sprite("weapon_rifle_cursor", set_game, 0,12,2,2)) container.sprites.Add(Sprite("weapon_rifle_proj", set_game, 10,12,2,2)) container.sprites.Add(Sprite("hook_chain", set_game, 2,0,1,1)) container.sprites.Add(Sprite("hook_head", set_game, 3,0,2,1)) container.sprites.Add(Sprite("weapon_ninja_muzzle1", set_game, 25,0,7,4)) container.sprites.Add(Sprite("weapon_ninja_muzzle2", set_game, 25,4,7,4)) container.sprites.Add(Sprite("weapon_ninja_muzzle3", set_game, 25,8,7,4)) container.sprites.Add(Sprite("pickup_health", set_game, 10,2,2,2)) container.sprites.Add(Sprite("pickup_armor", set_game, 12,2,2,2)) container.sprites.Add(Sprite("pickup_weapon", set_game, 3,0,6,2)) container.sprites.Add(Sprite("pickup_ninja", set_game, 2,10,8,2)) container.sprites.Add(Sprite("flag_blue", set_game, 12,8,4,8)) container.sprites.Add(Sprite("flag_red", set_game, 16,8,4,8)) container.sprites.Add(Sprite("tee_body", set_tee, 0,0,3,3)) container.sprites.Add(Sprite("tee_body_outline", set_tee, 3,0,3,3)) container.sprites.Add(Sprite("tee_foot", set_tee, 6,1,2,1)) container.sprites.Add(Sprite("tee_foot_outline", set_tee, 6,2,2,1)) container.sprites.Add(Sprite("tee_hand", set_tee, 6,0,1,1)) container.sprites.Add(Sprite("tee_hand_outline", set_tee, 7,0,1,1)) container.sprites.Add(Sprite("tee_eye_normal", set_tee, 2,3,1,1)) container.sprites.Add(Sprite("tee_eye_angry", set_tee, 3,3,1,1)) container.sprites.Add(Sprite("tee_eye_pain", set_tee, 4,3,1,1)) container.sprites.Add(Sprite("tee_eye_happy", set_tee, 5,3,1,1)) container.sprites.Add(Sprite("tee_eye_dead", set_tee, 6,3,1,1)) container.sprites.Add(Sprite("tee_eye_surprise", set_tee, 7,3,1,1)) container.sprites.Add(Sprite("oop", set_emoticons, 0, 0, 1, 1)) container.sprites.Add(Sprite("exclamation", set_emoticons, 1, 0, 1, 1)) container.sprites.Add(Sprite("hearts", set_emoticons, 2, 0, 1, 1)) container.sprites.Add(Sprite("drop", set_emoticons, 3, 0, 1, 1)) container.sprites.Add(Sprite("dotdot", set_emoticons, 0, 1, 1, 1)) container.sprites.Add(Sprite("music", set_emoticons, 1, 1, 1, 1)) container.sprites.Add(Sprite("sorry", set_emoticons, 2, 1, 1, 1)) container.sprites.Add(Sprite("ghost", set_emoticons, 3, 1, 1, 1)) container.sprites.Add(Sprite("sushi", set_emoticons, 0, 2, 1, 1)) container.sprites.Add(Sprite("splattee", set_emoticons, 1, 2, 1, 1)) container.sprites.Add(Sprite("deviltee", set_emoticons, 2, 2, 1, 1)) container.sprites.Add(Sprite("zomg", set_emoticons, 3, 2, 1, 1)) container.sprites.Add(Sprite("zzz", set_emoticons, 0, 3, 1, 1)) container.sprites.Add(Sprite("wtf", set_emoticons, 1, 3, 1, 1)) container.sprites.Add(Sprite("eyes", set_emoticons, 2, 3, 1, 1)) container.sprites.Add(Sprite("question", set_emoticons, 3, 3, 1, 1)) container.sprites.Add(Sprite("browse_lock", set_browseicons, 0,0,1,1)) container.sprites.Add(Sprite("browse_heart", set_browseicons, 1,0,1,1)) container.sprites.Add(Sprite("browse_unpure", set_browseicons, 3,0,1,1)) container.sprites.Add(Sprite("demobutton_play", set_demobuttons, 0,0,1,1)) container.sprites.Add(Sprite("demobutton_pause", set_demobuttons, 1,0,1,1)) container.sprites.Add(Sprite("demobutton_stop", set_demobuttons, 2,0,1,1)) container.sprites.Add(Sprite("demobutton_slower", set_demobuttons, 3,0,1,1)) container.sprites.Add(Sprite("demobutton_faster", set_demobuttons, 4,0,1,1)) container.sprites.Add(Sprite("file_demo1", set_fileicons, 0,0,1,1)) container.sprites.Add(Sprite("file_demo2", set_fileicons, 1,0,1,1)) container.sprites.Add(Sprite("file_folder", set_fileicons, 2,0,1,1)) container.sprites.Add(Sprite("file_map1", set_fileicons, 5,0,1,1)) container.sprites.Add(Sprite("file_map2", set_fileicons, 6,0,1,1)) container.sprites.Add(Sprite("guibutton_off", set_guibuttons, 0,0,4,4)) container.sprites.Add(Sprite("guibutton_on", set_guibuttons, 4,0,4,4)) container.sprites.Add(Sprite("guibutton_hover", set_guibuttons, 8,0,4,4)) container.sprites.Add(Sprite("guiicon_mute", set_guiicons, 0,0,4,2)) container.sprites.Add(Sprite("guiicon_friend", set_guiicons, 4,0,4,2)) anim = Animation("base") anim.body.frames.Add(AnimKeyframe(0, 0, -4, 0)) anim.back_foot.frames.Add(AnimKeyframe(0, 0, 10, 0)) anim.front_foot.frames.Add(AnimKeyframe(0, 0, 10, 0)) container.animations.Add(anim) anim = Animation("idle") anim.back_foot.frames.Add(AnimKeyframe(0, -7, 0, 0)) anim.front_foot.frames.Add(AnimKeyframe(0, 7, 0, 0)) container.animations.Add(anim) anim = Animation("inair") anim.back_foot.frames.Add(AnimKeyframe(0, -3, 0, -0.1)) anim.front_foot.frames.Add(AnimKeyframe(0, 3, 0, -0.1)) container.animations.Add(anim) anim = Animation("walk") anim.body.frames.Add(AnimKeyframe(0.0, 0, 0, 0)) anim.body.frames.Add(AnimKeyframe(0.2, 0,-1, 0)) anim.body.frames.Add(AnimKeyframe(0.4, 0, 0, 0)) anim.body.frames.Add(AnimKeyframe(0.6, 0, 0, 0)) anim.body.frames.Add(AnimKeyframe(0.8, 0,-1, 0)) anim.body.frames.Add(AnimKeyframe(1.0, 0, 0, 0)) anim.back_foot.frames.Add(AnimKeyframe(0.0, 8, 0, 0)) anim.back_foot.frames.Add(AnimKeyframe(0.2, -8, 0, 0)) anim.back_foot.frames.Add(AnimKeyframe(0.4,-10,-4, 0.2)) anim.back_foot.frames.Add(AnimKeyframe(0.6, -8,-8, 0.3)) anim.back_foot.frames.Add(AnimKeyframe(0.8, 4,-4,-0.2)) anim.back_foot.frames.Add(AnimKeyframe(1.0, 8, 0, 0)) anim.front_foot.frames.Add(AnimKeyframe(0.0,-10,-4, 0.2)) anim.front_foot.frames.Add(AnimKeyframe(0.2, -8,-8, 0.3)) anim.front_foot.frames.Add(AnimKeyframe(0.4, 4,-4,-0.2)) anim.front_foot.frames.Add(AnimKeyframe(0.6, 8, 0, 0)) anim.front_foot.frames.Add(AnimKeyframe(0.8, 8, 0, 0)) anim.front_foot.frames.Add(AnimKeyframe(1.0,-10,-4, 0.2)) container.animations.Add(anim) anim = Animation("hammer_swing") anim.attach.frames.Add(AnimKeyframe(0.0, 0, 0, -0.10)) anim.attach.frames.Add(AnimKeyframe(0.3, 0, 0, 0.25)) anim.attach.frames.Add(AnimKeyframe(0.4, 0, 0, 0.30)) anim.attach.frames.Add(AnimKeyframe(0.5, 0, 0, 0.25)) anim.attach.frames.Add(AnimKeyframe(1.0, 0, 0, -0.10)) container.animations.Add(anim) anim = Animation("ninja_swing") anim.attach.frames.Add(AnimKeyframe(0.00, 0, 0, -0.25)) anim.attach.frames.Add(AnimKeyframe(0.10, 0, 0, -0.05)) anim.attach.frames.Add(AnimKeyframe(0.15, 0, 0, 0.35)) anim.attach.frames.Add(AnimKeyframe(0.42, 0, 0, 0.40)) anim.attach.frames.Add(AnimKeyframe(0.50, 0, 0, 0.35)) anim.attach.frames.Add(AnimKeyframe(1.00, 0, 0, -0.25)) container.animations.Add(anim) weapon = WeaponSpec(container, "hammer") weapon.firedelay.Set(125) weapon.damage.Set(3) weapon.visual_size.Set(96) weapon.offsetx.Set(4) weapon.offsety.Set(-20) container.weapons.hammer.base.Set(weapon) container.weapons.id.Add(weapon) weapon = WeaponSpec(container, "gun") weapon.firedelay.Set(125) weapon.ammoregentime.Set(500) weapon.visual_size.Set(64) weapon.offsetx.Set(32) weapon.offsety.Set(4) weapon.muzzleoffsetx.Set(50) weapon.muzzleoffsety.Set(6) container.weapons.gun.base.Set(weapon) container.weapons.id.Add(weapon) weapon = WeaponSpec(container, "shotgun") weapon.firedelay.Set(500) weapon.visual_size.Set(96) weapon.offsetx.Set(24) weapon.offsety.Set(-2) weapon.muzzleoffsetx.Set(70) weapon.muzzleoffsety.Set(6) container.weapons.shotgun.base.Set(weapon) container.weapons.id.Add(weapon) weapon = WeaponSpec(container, "grenade") weapon.firedelay.Set(500) # TODO: fix this weapon.visual_size.Set(96) weapon.offsetx.Set(24) weapon.offsety.Set(-2) container.weapons.grenade.base.Set(weapon) container.weapons.id.Add(weapon) weapon = WeaponSpec(container, "rifle") weapon.firedelay.Set(800) weapon.visual_size.Set(92) weapon.damage.Set(5) weapon.offsetx.Set(24) weapon.offsety.Set(-2) container.weapons.rifle.base.Set(weapon) container.weapons.id.Add(weapon) weapon = WeaponSpec(container, "ninja") weapon.firedelay.Set(800) weapon.damage.Set(9) weapon.visual_size.Set(96) weapon.offsetx.Set(0) weapon.offsety.Set(0) weapon.muzzleoffsetx.Set(40) weapon.muzzleoffsety.Set(-4) container.weapons.ninja.base.Set(weapon) container.weapons.id.Add(weapon) teeworlds-0.6.2+dfsg/datasrc/datatypes.py0000644000175000017500000002151412140200333017426 0ustar felixfeliximport sys GlobalIdCounter = 0 def GetID(): global GlobalIdCounter GlobalIdCounter += 1 return GlobalIdCounter def GetUID(): return "x%d"%GetID() def FixCasing(Str): NewStr = "" NextUpperCase = True for c in Str: if NextUpperCase: NextUpperCase = False NewStr += c.upper() else: if c == "_": NextUpperCase = True else: NewStr += c.lower() return NewStr def FormatName(type, name): if "*" in type: return "m_p" + FixCasing(name) if "[]" in type: return "m_a" + FixCasing(name) return "m_" + FixCasing(name) class BaseType: def __init__(self, type_name): self._type_name = type_name self._target_name = "INVALID" self._id = GetID() # this is used to remember what order the members have in structures etc def Identifyer(self): return "x"+str(self._id) def TargetName(self): return self._target_name def TypeName(self): return self._type_name def ID(self): return self._id; def EmitDeclaration(self, name): return ["%s %s;"%(self.TypeName(), FormatName(self.TypeName(), name))] def EmitPreDefinition(self, target_name): self._target_name = target_name return [] def EmitDefinition(self, name): return [] class MemberType: def __init__(self, name, var): self.name = name self.var = var class Struct(BaseType): def __init__(self, type_name): BaseType.__init__(self, type_name) def Members(self): def sorter(a): return a.var.ID() m = [] for name in self.__dict__: if name[0] == "_": continue m += [MemberType(name, self.__dict__[name])] try: m.sort(key = sorter) except: for v in m: print(v.name, v.var) sys.exit(-1) return m def EmitTypeDeclaration(self, name): lines = [] lines += ["struct " + self.TypeName()] lines += ["{"] for member in self.Members(): lines += ["\t"+l for l in member.var.EmitDeclaration(member.name)] lines += ["};"] return lines def EmitPreDefinition(self, target_name): BaseType.EmitPreDefinition(self, target_name) lines = [] for member in self.Members(): lines += member.var.EmitPreDefinition(target_name+"."+member.name) return lines def EmitDefinition(self, name): lines = ["/* %s */ {" % self.TargetName()] for member in self.Members(): lines += ["\t" + " ".join(member.var.EmitDefinition("")) + ","] lines += ["}"] return lines class Array(BaseType): def __init__(self, type): BaseType.__init__(self, type.TypeName()) self.type = type self.items = [] def Add(self, instance): if instance.TypeName() != self.type.TypeName(): error("bah") self.items += [instance] def EmitDeclaration(self, name): return ["int m_Num%s;"%(FixCasing(name)), "%s *%s;"%(self.TypeName(), FormatName("[]", name))] def EmitPreDefinition(self, target_name): BaseType.EmitPreDefinition(self, target_name) lines = [] i = 0 for item in self.items: lines += item.EmitPreDefinition("%s[%d]"%(self.Identifyer(), i)) i += 1 if len(self.items): lines += ["static %s %s[] = {"%(self.TypeName(), self.Identifyer())] for item in self.items: itemlines = item.EmitDefinition("") lines += ["\t" + " ".join(itemlines).replace("\t", " ") + ","] lines += ["};"] else: lines += ["static %s *%s = 0;"%(self.TypeName(), self.Identifyer())] return lines def EmitDefinition(self, name): return [str(len(self.items))+","+self.Identifyer()] # Basic Types class Int(BaseType): def __init__(self, value): BaseType.__init__(self, "int") self.value = value def Set(self, value): self.value = value def EmitDefinition(self, name): return ["%d"%self.value] #return ["%d /* %s */"%(self.value, self._target_name)] class Float(BaseType): def __init__(self, value): BaseType.__init__(self, "float") self.value = value def Set(self, value): self.value = value def EmitDefinition(self, name): return ["%f"%self.value] #return ["%d /* %s */"%(self.value, self._target_name)] class String(BaseType): def __init__(self, value): BaseType.__init__(self, "const char*") self.value = value def Set(self, value): self.value = value def EmitDefinition(self, name): return ['"'+self.value+'"'] class Pointer(BaseType): def __init__(self, type, target): BaseType.__init__(self, "%s*"%type().TypeName()) self.target = target def Set(self, target): self.target = target def EmitDefinition(self, name): return ["&"+self.target.TargetName()] # helper functions def EmitTypeDeclaration(root): for l in root().EmitTypeDeclaration(""): print(l) def EmitDefinition(root, name): for l in root.EmitPreDefinition(name): print(l) print("%s %s = " % (root.TypeName(), name)) for l in root.EmitDefinition(name): print(l) print(";") # Network stuff after this class Object: pass class Enum: def __init__(self, name, values): self.name = name self.values = values class Flags: def __init__(self, name, values): self.name = name self.values = values class NetObject: def __init__(self, name, variables): l = name.split(":") self.name = l[0] self.base = "" if len(l) > 1: self.base = l[1] self.base_struct_name = "CNetObj_%s" % self.base self.struct_name = "CNetObj_%s" % self.name self.enum_name = "NETOBJTYPE_%s" % self.name.upper() self.variables = variables def emit_declaration(self): if self.base: lines = ["struct %s : public %s"%(self.struct_name,self.base_struct_name), "{"] else: lines = ["struct %s"%self.struct_name, "{"] for v in self.variables: lines += ["\t"+line for line in v.emit_declaration()] lines += ["};"] return lines def emit_validate(self): lines = ["case %s:" % self.enum_name] lines += ["{"] lines += ["\t%s *pObj = (%s *)pData;"%(self.struct_name, self.struct_name)] lines += ["\tif(sizeof(*pObj) != Size) return -1;"] for v in self.variables: lines += ["\t"+line for line in v.emit_validate()] lines += ["\treturn 0;"] lines += ["}"] return lines class NetEvent(NetObject): def __init__(self, name, variables): NetObject.__init__(self, name, variables) self.base_struct_name = "CNetEvent_%s" % self.base self.struct_name = "CNetEvent_%s" % self.name self.enum_name = "NETEVENTTYPE_%s" % self.name.upper() class NetMessage(NetObject): def __init__(self, name, variables): NetObject.__init__(self, name, variables) self.base_struct_name = "CNetMsg_%s" % self.base self.struct_name = "CNetMsg_%s" % self.name self.enum_name = "NETMSGTYPE_%s" % self.name.upper() def emit_unpack(self): lines = [] lines += ["case %s:" % self.enum_name] lines += ["{"] lines += ["\t%s *pMsg = (%s *)m_aMsgData;" % (self.struct_name, self.struct_name)] lines += ["\t(void)pMsg;"] for v in self.variables: lines += ["\t"+line for line in v.emit_unpack()] for v in self.variables: lines += ["\t"+line for line in v.emit_unpack_check()] lines += ["} break;"] return lines def emit_declaration(self): extra = [] extra += ["\tint MsgID() const { return %s; }" % self.enum_name] extra += ["\t"] extra += ["\tbool Pack(CMsgPacker *pPacker)"] extra += ["\t{"] #extra += ["\t\tmsg_pack_start(%s, flags);"%self.enum_name] for v in self.variables: extra += ["\t\t"+line for line in v.emit_pack()] extra += ["\t\treturn pPacker->Error() != 0;"] extra += ["\t}"] lines = NetObject.emit_declaration(self) lines = lines[:-1] + extra + lines[-1:] return lines class NetVariable: def __init__(self, name): self.name = name def emit_declaration(self): return [] def emit_validate(self): return [] def emit_pack(self): return [] def emit_unpack(self): return [] def emit_unpack_check(self): return [] class NetString(NetVariable): def emit_declaration(self): return ["const char *%s;"%self.name] def emit_unpack(self): return ["pMsg->%s = pUnpacker->GetString();" % self.name] def emit_pack(self): return ["pPacker->AddString(%s, -1);" % self.name] class NetStringStrict(NetVariable): def emit_declaration(self): return ["const char *%s;"%self.name] def emit_unpack(self): return ["pMsg->%s = pUnpacker->GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);" % self.name] def emit_pack(self): return ["pPacker->AddString(%s, -1);" % self.name] class NetIntAny(NetVariable): def emit_declaration(self): return ["int %s;"%self.name] def emit_unpack(self): return ["pMsg->%s = pUnpacker->GetInt();" % self.name] def emit_pack(self): return ["pPacker->AddInt(%s);" % self.name] class NetIntRange(NetIntAny): def __init__(self, name, min, max): NetIntAny.__init__(self,name) self.min = str(min) self.max = str(max) def emit_validate(self): return ["ClampInt(\"%s\", pObj->%s, %s, %s);"%(self.name,self.name, self.min, self.max)] def emit_unpack_check(self): return ["if(pMsg->%s < %s || pMsg->%s > %s) { m_pMsgFailedOn = \"%s\"; break; }" % (self.name, self.min, self.name, self.max, self.name)] class NetBool(NetIntRange): def __init__(self, name): NetIntRange.__init__(self,name,0,1) class NetTick(NetIntRange): def __init__(self, name): NetIntRange.__init__(self,name,0,'max_int') teeworlds-0.6.2+dfsg/datasrc/network.py0000644000175000017500000001733312140200333017125 0ustar felixfelixfrom datatypes import * Emotes = ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"] PlayerFlags = ["PLAYING", "IN_MENU", "CHATTING", "SCOREBOARD"] GameFlags = ["TEAMS", "FLAGS"] GameStateFlags = ["GAMEOVER", "SUDDENDEATH", "PAUSED"] Emoticons = ["OOP", "EXCLAMATION", "HEARTS", "DROP", "DOTDOT", "MUSIC", "SORRY", "GHOST", "SUSHI", "SPLATTEE", "DEVILTEE", "ZOMG", "ZZZ", "WTF", "EYES", "QUESTION"] Powerups = ["HEALTH", "ARMOR", "WEAPON", "NINJA"] RawHeader = ''' #include enum { INPUT_STATE_MASK=0x3f }; enum { TEAM_SPECTATORS=-1, TEAM_RED, TEAM_BLUE, FLAG_MISSING=-3, FLAG_ATSTAND, FLAG_TAKEN, SPEC_FREEVIEW=-1, }; ''' RawSource = ''' #include #include "protocol.h" ''' Enums = [ Enum("EMOTE", Emotes), Enum("POWERUP", Powerups), Enum("EMOTICON", Emoticons) ] Flags = [ Flags("PLAYERFLAG", PlayerFlags), Flags("GAMEFLAG", GameFlags), Flags("GAMESTATEFLAG", GameStateFlags) ] Objects = [ NetObject("PlayerInput", [ NetIntAny("m_Direction"), NetIntAny("m_TargetX"), NetIntAny("m_TargetY"), NetIntAny("m_Jump"), NetIntAny("m_Fire"), NetIntAny("m_Hook"), NetIntRange("m_PlayerFlags", 0, 256), NetIntAny("m_WantedWeapon"), NetIntAny("m_NextWeapon"), NetIntAny("m_PrevWeapon"), ]), NetObject("Projectile", [ NetIntAny("m_X"), NetIntAny("m_Y"), NetIntAny("m_VelX"), NetIntAny("m_VelY"), NetIntRange("m_Type", 0, 'NUM_WEAPONS-1'), NetTick("m_StartTick"), ]), NetObject("Laser", [ NetIntAny("m_X"), NetIntAny("m_Y"), NetIntAny("m_FromX"), NetIntAny("m_FromY"), NetTick("m_StartTick"), ]), NetObject("Pickup", [ NetIntAny("m_X"), NetIntAny("m_Y"), NetIntRange("m_Type", 0, 'max_int'), NetIntRange("m_Subtype", 0, 'max_int'), ]), NetObject("Flag", [ NetIntAny("m_X"), NetIntAny("m_Y"), NetIntRange("m_Team", 'TEAM_RED', 'TEAM_BLUE') ]), NetObject("GameInfo", [ NetIntRange("m_GameFlags", 0, 256), NetIntRange("m_GameStateFlags", 0, 256), NetTick("m_RoundStartTick"), NetIntRange("m_WarmupTimer", 0, 'max_int'), NetIntRange("m_ScoreLimit", 0, 'max_int'), NetIntRange("m_TimeLimit", 0, 'max_int'), NetIntRange("m_RoundNum", 0, 'max_int'), NetIntRange("m_RoundCurrent", 0, 'max_int'), ]), NetObject("GameData", [ NetIntAny("m_TeamscoreRed"), NetIntAny("m_TeamscoreBlue"), NetIntRange("m_FlagCarrierRed", 'FLAG_MISSING', 'MAX_CLIENTS-1'), NetIntRange("m_FlagCarrierBlue", 'FLAG_MISSING', 'MAX_CLIENTS-1'), ]), NetObject("CharacterCore", [ NetIntAny("m_Tick"), NetIntAny("m_X"), NetIntAny("m_Y"), NetIntAny("m_VelX"), NetIntAny("m_VelY"), NetIntAny("m_Angle"), NetIntRange("m_Direction", -1, 1), NetIntRange("m_Jumped", 0, 3), NetIntRange("m_HookedPlayer", 0, 'MAX_CLIENTS-1'), NetIntRange("m_HookState", -1, 5), NetTick("m_HookTick"), NetIntAny("m_HookX"), NetIntAny("m_HookY"), NetIntAny("m_HookDx"), NetIntAny("m_HookDy"), ]), NetObject("Character:CharacterCore", [ NetIntRange("m_PlayerFlags", 0, 256), NetIntRange("m_Health", 0, 10), NetIntRange("m_Armor", 0, 10), NetIntRange("m_AmmoCount", 0, 10), NetIntRange("m_Weapon", 0, 'NUM_WEAPONS-1'), NetIntRange("m_Emote", 0, len(Emotes)), NetIntRange("m_AttackTick", 0, 'max_int'), ]), NetObject("PlayerInfo", [ NetIntRange("m_Local", 0, 1), NetIntRange("m_ClientID", 0, 'MAX_CLIENTS-1'), NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'), NetIntAny("m_Score"), NetIntAny("m_Latency"), ]), NetObject("ClientInfo", [ # 4*4 = 16 charachters NetIntAny("m_Name0"), NetIntAny("m_Name1"), NetIntAny("m_Name2"), NetIntAny("m_Name3"), # 4*3 = 12 charachters NetIntAny("m_Clan0"), NetIntAny("m_Clan1"), NetIntAny("m_Clan2"), NetIntAny("m_Country"), # 4*6 = 24 charachters NetIntAny("m_Skin0"), NetIntAny("m_Skin1"), NetIntAny("m_Skin2"), NetIntAny("m_Skin3"), NetIntAny("m_Skin4"), NetIntAny("m_Skin5"), NetIntRange("m_UseCustomColor", 0, 1), NetIntAny("m_ColorBody"), NetIntAny("m_ColorFeet"), ]), NetObject("SpectatorInfo", [ NetIntRange("m_SpectatorID", 'SPEC_FREEVIEW', 'MAX_CLIENTS-1'), NetIntAny("m_X"), NetIntAny("m_Y"), ]), ## Events NetEvent("Common", [ NetIntAny("m_X"), NetIntAny("m_Y"), ]), NetEvent("Explosion:Common", []), NetEvent("Spawn:Common", []), NetEvent("HammerHit:Common", []), NetEvent("Death:Common", [ NetIntRange("m_ClientID", 0, 'MAX_CLIENTS-1'), ]), NetEvent("SoundGlobal:Common", [ #TODO 0.7: remove me NetIntRange("m_SoundID", 0, 'NUM_SOUNDS-1'), ]), NetEvent("SoundWorld:Common", [ NetIntRange("m_SoundID", 0, 'NUM_SOUNDS-1'), ]), NetEvent("DamageInd:Common", [ NetIntAny("m_Angle"), ]), ] Messages = [ ### Server messages NetMessage("Sv_Motd", [ NetString("m_pMessage"), ]), NetMessage("Sv_Broadcast", [ NetString("m_pMessage"), ]), NetMessage("Sv_Chat", [ NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'), NetIntRange("m_ClientID", -1, 'MAX_CLIENTS-1'), NetStringStrict("m_pMessage"), ]), NetMessage("Sv_KillMsg", [ NetIntRange("m_Killer", 0, 'MAX_CLIENTS-1'), NetIntRange("m_Victim", 0, 'MAX_CLIENTS-1'), NetIntRange("m_Weapon", -3, 'NUM_WEAPONS-1'), NetIntAny("m_ModeSpecial"), ]), NetMessage("Sv_SoundGlobal", [ NetIntRange("m_SoundID", 0, 'NUM_SOUNDS-1'), ]), NetMessage("Sv_TuneParams", []), NetMessage("Sv_ExtraProjectile", []), NetMessage("Sv_ReadyToEnter", []), NetMessage("Sv_WeaponPickup", [ NetIntRange("m_Weapon", 0, 'NUM_WEAPONS-1'), ]), NetMessage("Sv_Emoticon", [ NetIntRange("m_ClientID", 0, 'MAX_CLIENTS-1'), NetIntRange("m_Emoticon", 0, 'NUM_EMOTICONS-1'), ]), NetMessage("Sv_VoteClearOptions", [ ]), NetMessage("Sv_VoteOptionListAdd", [ NetIntRange("m_NumOptions", 1, 15), NetStringStrict("m_pDescription0"), NetStringStrict("m_pDescription1"), NetStringStrict("m_pDescription2"), NetStringStrict("m_pDescription3"), NetStringStrict("m_pDescription4"), NetStringStrict("m_pDescription5"), NetStringStrict("m_pDescription6"), NetStringStrict("m_pDescription7"), NetStringStrict("m_pDescription8"), NetStringStrict("m_pDescription9"), NetStringStrict("m_pDescription10"), NetStringStrict("m_pDescription11"), NetStringStrict("m_pDescription12"), NetStringStrict("m_pDescription13"), NetStringStrict("m_pDescription14"), ]), NetMessage("Sv_VoteOptionAdd", [ NetStringStrict("m_pDescription"), ]), NetMessage("Sv_VoteOptionRemove", [ NetStringStrict("m_pDescription"), ]), NetMessage("Sv_VoteSet", [ NetIntRange("m_Timeout", 0, 60), NetStringStrict("m_pDescription"), NetStringStrict("m_pReason"), ]), NetMessage("Sv_VoteStatus", [ NetIntRange("m_Yes", 0, 'MAX_CLIENTS'), NetIntRange("m_No", 0, 'MAX_CLIENTS'), NetIntRange("m_Pass", 0, 'MAX_CLIENTS'), NetIntRange("m_Total", 0, 'MAX_CLIENTS'), ]), ### Client messages NetMessage("Cl_Say", [ NetBool("m_Team"), NetStringStrict("m_pMessage"), ]), NetMessage("Cl_SetTeam", [ NetIntRange("m_Team", 'TEAM_SPECTATORS', 'TEAM_BLUE'), ]), NetMessage("Cl_SetSpectatorMode", [ NetIntRange("m_SpectatorID", 'SPEC_FREEVIEW', 'MAX_CLIENTS-1'), ]), NetMessage("Cl_StartInfo", [ NetStringStrict("m_pName"), NetStringStrict("m_pClan"), NetIntAny("m_Country"), NetStringStrict("m_pSkin"), NetBool("m_UseCustomColor"), NetIntAny("m_ColorBody"), NetIntAny("m_ColorFeet"), ]), NetMessage("Cl_ChangeInfo", [ NetStringStrict("m_pName"), NetStringStrict("m_pClan"), NetIntAny("m_Country"), NetStringStrict("m_pSkin"), NetBool("m_UseCustomColor"), NetIntAny("m_ColorBody"), NetIntAny("m_ColorFeet"), ]), NetMessage("Cl_Kill", []), NetMessage("Cl_Emoticon", [ NetIntRange("m_Emoticon", 0, 'NUM_EMOTICONS-1'), ]), NetMessage("Cl_Vote", [ NetIntRange("m_Vote", -1, 1), ]), NetMessage("Cl_CallVote", [ NetStringStrict("m_Type"), NetStringStrict("m_Value"), NetStringStrict("m_Reason"), ]), ] teeworlds-0.6.2+dfsg/docs/0000755000175000017500000000000012141202053014364 5ustar felixfelixteeworlds-0.6.2+dfsg/docs/conf/0000755000175000017500000000000012140200333015307 5ustar felixfelixteeworlds-0.6.2+dfsg/docs/conf/Data/0000755000175000017500000000000012140200333016160 5ustar felixfelixteeworlds-0.6.2+dfsg/docs/conf/Data/ClassHierarchy.nd0000644000175000017500000000140612140200333021410 0ustar felixfelix( INPUT_EVENT4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.h SNAP_ITEM6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.h SERVER_INFO7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hGame ControllerA/home/kma/code/teeworlds/trunk/src/game/server/gamecontroller.hpp VIDEO_MODE4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hEntity9/home/kma/code/teeworlds/trunk/src/game/server/entity.hpp Game World/home/kma/code/teeworlds/trunk/src/engine/docs/client_time.txt Prediction=/home/kma/code/teeworlds/trunk/src/engine/docs/prediction.txt SnapshotsFinds entities close to a position and returns them in a list. SnapshotsThe client has connected to a server and is loading resources.snd_play4/home/kma/code/teeworlds/trunk/src/engine/e_if_snd.hfunction)int snd_play(int cid, int sid, int flags)Plays a sound.Server Browser Sorting7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstantclient_latestversion7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hfunction"const char *client_latestversion()*Returns 0 if there's no version difference Functions 7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hsection7/home/kma/code/teeworlds/trunk/src/engine/e_if_server.hgroup4/home/kma/code/teeworlds/trunk/src/engine/e_if_msg.hgroup4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hsection5/home/kma/code/teeworlds/trunk/src/engine/e_huffman.hgroup6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hgroup5/home/kma/code/teeworlds/trunk/src/engine/e_if_modc.hgroup4/home/kma/code/teeworlds/trunk/src/engine/e_if_snd.hgroup5/home/kma/code/teeworlds/trunk/src/engine/e_if_mods.hgroupgfx_blend_additive4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionvoid gfx_blend_additive()4Set the active blending mode to additive (src, one).client_mapdownload_amount7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hfunctionint client_mapdownload_amount()TODO Inspection is called when a new snapshot has arrived for processing.  map_num_items6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunctionint map_num_items()-Checks the number of items in the loaded map. Client Hooks5/home/kma/code/teeworlds/trunk/src/engine/e_if_modc.hsection mods_presnap5/home/kma/code/teeworlds/trunk/src/engine/e_if_mods.hfunctionvoid mods_presnap()GCalled before the server starts to construct snapshots for the clients.Client Interface7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hsectionShutdown when reprediction is required.  Game Worldsnap is called using the function to insert an item to the snapshot.  client_tick7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hfunctionint client_tick())Returns the tick of the current snapshot.BROWSESORT_GAMETYPE7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstantSort by game type.  Client States7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstanthuffman_decompress5/home/kma/code/teeworlds/trunk/src/engine/e_huffman.hfunctionmint huffman_decompress(HUFFMAN_STATE *huff, const void *input, int input_size, void *output, int output_size)Decompresses a bufferRunningHere is an graph over how the server operates on each refresh. snd_play_at4/home/kma/code/teeworlds/trunk/src/engine/e_if_snd.hfunction>int snd_play_at(int cid, int sid, int flags, float x, float y)'Plays a sound at a specified postition.mods_console_init5/home/kma/code/teeworlds/trunk/src/engine/e_if_mods.hfunctionvoid mods_console_init()TODOmodc_console_init5/home/kma/code/teeworlds/trunk/src/engine/e_if_modc.hfunctionvoid modc_console_init()TODOIMG_RGB7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstant8-Bit uncompressed RGBEntitysnap9/home/kma/code/teeworlds/trunk/src/game/server/entity.hppfunction&virtual void snap(int snapping_client)DCalled when a new snapshot is being generated for a specific client. gfx_minimize4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionvoid gfx_minimize()Minimizes the window. INPUT_EVENT inp_key_down4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.hfunctionint inp_key_down(int key)TODOsnd_stop4/home/kma/code/teeworlds/trunk/src/engine/e_if_snd.hfunctionvoid snd_stop(int id)Stops a currenly playing sound.BROWSESORT_PING7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstant Sort by ping.IMG_RGBA7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstant8-Bit uncompressed RGBA msg_pack_raw4/home/kma/code/teeworlds/trunk/src/engine/e_if_msg.hfunction-void msg_pack_raw(const void *data, int size)TODOmodc_newsnapshot5/home/kma/code/teeworlds/trunk/src/engine/e_if_modc.hfunctionvoid modc_newsnapshot()4Called when the client progressed to a new snapshot. huffman_init5/home/kma/code/teeworlds/trunk/src/engine/e_huffman.hfunctionCvoid huffman_init(HUFFMAN_STATE *huff, const unsigned *frequencies)"Inits the compressor/decompressor. Game World insert_entityCalled when the map is loaded to process an entity in the map.Engine Interface6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hsectiongfx_lines_draw4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunction;void gfx_lines_draw(float x0, float y0, float x1, float y1)TODOclient_send_msg6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunctionint client_send_msg()TODO INPUT_EVENT inp_get_event4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.hfunction$INPUT_EVENT inp_get_event(int index)TODOmsg_pack_start4/home/kma/code/teeworlds/trunk/src/engine/e_if_msg.hfunction'void msg_pack_start(int msg, int flags)TODOTEXLOAD_NORESAMPLE7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstant(Prevents the texture from any resampling IMAGE_INFOformat4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hvariable int format"Contains the format of the image. snap_num_items6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunctionint snap_num_items(int snapid)(Check the number of items in a snapshot.gfx_load_texture_raw4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionaint gfx_load_texture_raw(int w, int h, int format, const void *data, int store_format, int flags)Loads a texture from memory. IMG_ALPHA7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstant8-Bit uncompressed alphaserver_send_msg6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunction"int server_send_msg(int client_id)TODO map_get_item6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunction1void *map_get_item(int index, int *type, int *id),Gets an item from the loaded map from index.server_tickspeed7/home/kma/code/teeworlds/trunk/src/engine/e_if_server.hfunctionint server_tickspeed()TODOserver_setbrowseinfo7/home/kma/code/teeworlds/trunk/src/engine/e_if_server.hfunctionAvoid server_setbrowseinfo(const char *game_type, int progression)TODO INPUT_EVENTinp_key_pressed4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.hfunctionint inp_key_pressed(int key)Checks if a key is pressed.client_disconnect7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hfunctionvoid client_disconnect()$Disconnects from the current server. client_serverbrowse_num_requests7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hfunction&int client_serverbrowse_num_requests()TODOsnap_find_item6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunction2void *snap_find_item(int snapid, int type, int id) Searches a snapshot for an item.gfx_unload_texture4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionint gfx_unload_texture(int id)Unloads a texture. mods_postsnap5/home/kma/code/teeworlds/trunk/src/engine/e_if_mods.hfunctionvoid mods_postsnap()6Called after the server is done sending the snapshots.msg_unpack_raw4/home/kma/code/teeworlds/trunk/src/engine/e_if_msg.hfunction-const unsigned char *msg_unpack_raw(int size)TODOEntity9/home/kma/code/teeworlds/trunk/src/game/server/entity.hppclassBasic entity class.client_serverbrowse_addfavorite7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hfunction2void client_serverbrowse_addfavorite(NETADDR addr)"Adds a server to the favorite list IMAGE_INFOdata4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hvariable void *dataPointer to the image data.gfx_quads_text4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionCvoid gfx_quads_text(float x, float y, float size, const char *text)TODOmsg_pack_string4/home/kma/code/teeworlds/trunk/src/engine/e_if_msg.hfunction.void msg_pack_string(const char *p, int limit)TODOEntitydestroy9/home/kma/code/teeworlds/trunk/src/game/server/entity.hppfunctionvirtual void destroy()Destorys the entity.gfx_lines_begin4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionvoid gfx_lines_begin()TODOIn depth/home/kma/code/teeworlds/trunk/src/engine/docs/client_time.txtsection'tick, intratick predtick, predintratickgfx_text_set_default_font4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunction*void gfx_text_set_default_font(void *font)TODO snap_new_item6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunction/void *snap_new_item(int type, int id, int size)'Creates a new item that should be sent. INPUT_EVENT inp_key_code4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.hfunction&int inp_key_code(const char *key_name)TODOBROWSESORT_MAP7/home/kma/code/teeworlds/trunk/src/engine/e_if_client.hconstant Sort by mapmap_unload_data6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunctionvoid map_unload_data(int index)TODO msg_pack_int4/home/kma/code/teeworlds/trunk/src/engine/e_if_msg.hfunctionvoid msg_pack_int(int i)TODO INPUT_EVENTinp_num_events4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.hfunctionint inp_num_events()TODOsnap_invalidate_item6/home/kma/code/teeworlds/trunk/src/engine/e_if_other.hfunction0void snap_invalidate_item(int snapid, int index)?Marks an item as invalid byt setting type and id to 0xffffffff. INPUT_EVENTinp_key_was_pressed4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.hfunction int inp_key_was_pressed(int key)TODOgfx_setcolorvertex4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionBvoid gfx_setcolorvertex(int i, float r, float g, float b, float a)Sets the color of a vertex.gfx_memory_usage4/home/kma/code/teeworlds/trunk/src/engine/e_if_gfx.hfunctionint gfx_memory_usage()TODO INPUT_EVENT inp_key_name4/home/kma/code/teeworlds/trunk/src/engine/e_if_inp.hfunctionconst char *inp_key_name(int k)TODOReinit 0 and ExecuteSilent("freetype-config --cflags") == 0 then option.value = true option.use_ftconfig = true end if platform == "win32" then option.value = true option.use_winlib = 32 elseif platform == "win64" then option.value = true option.use_winlib = 64 end end local apply = function(option, settings) -- include path settings.cc.includes:Add(FreeType.basepath .. "/include") if option.use_ftconfig == true then settings.cc.flags:Add("`freetype-config --cflags`") settings.link.flags:Add("`freetype-config --libs`") elseif option.use_winlib > 0 then if option.use_winlib == 32 then settings.link.libpath:Add(FreeType.basepath .. "/lib32") else settings.link.libpath:Add(FreeType.basepath .. "/lib64") end settings.link.libs:Add("freetype") end end local save = function(option, output) output:option(option, "value") output:option(option, "use_ftconfig") output:option(option, "use_winlib") end local display = function(option) if option.value == true then if option.use_ftconfig == true then return "using freetype-config" end if option.use_winlib == 32 then return "using supplied win32 libraries" end if option.use_winlib == 64 then return "using supplied win64 libraries" end return "using unknown method" else if option.required then return "not found (required)" else return "not found (optional)" end end end local o = MakeOption(name, 0, check, save, display) o.Apply = apply o.include_path = nil o.lib_path = nil o.required = required return o end } teeworlds-0.6.2+dfsg/other/icons/0000755000175000017500000000000012140200333015666 5ustar felixfelixteeworlds-0.6.2+dfsg/other/icons/Teeworlds.icns0000644000175000017500000022777312140200333020536 0ustar felixfelixicns/ic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefGjp2cOQ2R \@@HHPHHPHHPHHPHHP S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPzP9 #H\@%uPlW}lggІD .nWĝf$w]*zRߺߗz82x |yt~ RCW$*F_qɽN|)!}0^ ܈1/z S'-w| Ngl{ Bn;)D0b'zjn0z0<=GhXJ"H>R,~"1/r]f7kdCJT_Ͻ'$w#`Ybq) !}s6Tظe'oІmIzvCR.d>:[s4^H#G)_uP(1# e 똺]hI\,G7FH%ߺ|`Gz|!71s'b,̓~3Bݟ V[4Y7mu+Ͻ}$JTB8WG]f#.O#"TiIO62/Eq tC F&n hjCĿ54A is[x dM?[朖}r"UϧJ|E0ޢ <*A4eZ5XL a8BC%& @C,$Viϼ>(@)@(o&/kf^nUWx$+ ` {!q r'V Zu3P4V{vbLsϾ*~UlG/W@J߇O +Zڶ.4Y ]}g ضi{gCO%=b2brost3CX*_T}N ٸE<IqjOF@IDIj >FF$PgH4ˁ[yqog %CB2AQ/H*Iq2G֤zHyZ3ŴyDutO(+rlɠU,дeCY'Bd}1lcOS{4j>` I:E!d"V`|vb2 !e>B QUtP(G^-"? vl9i@0nkؕTRD!J'%(OD֧x`tNd{iM܅McvfT(h'Lrz"-(Mx ({XAk1k̢H,}ȋNV(o:\@A1/Wxք!U5CFC)=11Ss2YZ^<8#ñE#.xߕSMIKcԒ9)*d+l 7l!#͕v M܈Ѹ,7 lˇS~"g_ eܯϠ(vfʠ4cE}# HxD9m%3Qk#XUL1@:嵾MݬQ':QCDwD״rƾ CY˾n]O[pzvxA-sRˊ[_eGWJGbqvjzCz7m,(mE0=:LX…}?*gjjP`߭ٲIE6˱@Er6k$ Kf3>}06a-e`eZcqw;6Sz{" }5Mv = ϑ3 $"֍ZFkQ"1*+;+ ,%!Fcʤ*]XQ 'x!Ԗ[g#xtJ?[vmV}Bp!*=ZwIg%r=uhieF(9"䐳U̥5$>k)8#@fQJ87wŰRCX^)QCMqCo9E  lg_U*iBi /?rM/lH0aC XUB\$;h6Q(c/6?\eE$x4nxGkՎGx7yJv!t,^J3e"41vD$ ;`<"Eő|CF6:,]CFt>%;d/9Z JccG#.Iduu7WEB# fF6NRcb| 6ia25)J:#2,“W>:C |m9LchG \NDbk~D@TM_W" y3n; |{:3QSPKw=dX递oQUv!QB}{nC),䵬{H:9.7zˡ(dń, D:Oڥ{f^yȌK_k @6olv2"PVB5+tx~T|ag6'> t,gZ.Ɉ ˼M7Lq5P߃)3^-Ʒ[8TEH Ǟ7SZ:vgַ(Fn76\DC}nf%$=r'뛘)Vk\@|lJf~Sw H4a1jc,[1Yǡ}T_?=IplDIDO W'u4s^]pjZ9iA%Gum%>y慇mt|0avA1% =g%f?-P.3>]sZuј7 W f:@Xhwpf0J1/Svxd'g&i/ϲo4KK`V[׹FѢVּh6u=벹ξ\bN|bBs7e~753 #U// A9k@H7\>r$% /[#h%"?Q?Cvqʐ+% QX91\sɉeE9lYWJN9uUS(WcbӚک睶/,'oѷdn+B1R|bfoV4ŭjY"dW aJx!p*dY}Z5r3Ob0i~?3:]w#!2!)ruiQFl_/*{'/ A!e3s"]gE$DD+_q/dΰ 0s}OSu6HTPSm\Ksc#s>6b\#鏓}#ۨ>WUmVeP u{iB+iR&@V~,IlNubW"J(#'*{q$u4O`hII̶stBvHF5r{>[!ǶLO~p-]s ,̭ѾMkn<4oyf6W l% CX6'YDC1kT I *B}4tO͂gykB0FdV"&`{m 04Jꓘop$bbVG6Noj,烢ނ?M(! c cݧi #. j0̟=..E]u}ZEzDg ֜ |n루iTbj#|;^0Z~.;R`-zF]3zCO3HK$v'r1no S SOMB'ߥ30M7`.ԇwҩo}'SWFEP?Q糯M̯ 0$zCQ^ZiT#X~!>Z3/^8V"#_J2(UsLzx(܍#ce0p X$2+`&ٚl\w.,EaVE$F;le3gB[DLpZmGr[\D{hYM!ퟠ6 Dyt2)̆A e(Vnݮn6u]DI7p\-l0sƁڜKX=`&$x-OXQRAD_y ~' U!WF[Ggx&jL@REn"0(aH?riоCG{}.NWf={9ʂE|er7^.:E}9vwV a4jVRzQ<'1DeBc:gZ3J__w #rQ?qv WO/w(Zbqgb>Դ\f&Y0G𫽸L̐ `3.]_W^}Dk@G =3_WWwWCu]э[Z`/r83 6_t\}!0^aYSwr1SXr{R6Twac_e MD Z3oF+VV $p3<+ywT3% ar}(n&_c{. JMμ@Y\(2?ʳp% Z0DS Dej/zGrVOY+|\q [dw |Gt~v!' V"Y/&_İJu! `iZ=ddWpwa/NULz]7g8XoTy ,M}v/Yϔ=aʔNGis2c3M~-O^Sz$*v! SeQL/Mixԏ.z}$e;j,-s`tJ.;nPpȃsgnq0_`IOdZCx>l}fsČ̓6J |!΃`7ͼvE6C RNAk1@:Z؃ތvSoǖrIqj?*5c$3944D'sKv?/KQQL2rc܉2`'YxHAV᧯a@ʴo&v~ɘH43mj(/A棁F1gRWV⏙hdW,LX#|I3"uuReأ yBo~iU -tw8.A%:B ^=+f7u~ad,L2:͈43/sM{r.ֈǹ]|!Twl= CnH8_ѻd'I:q\?m\gSzr>Ł߳hV oc/g:=޲XwQg WDJuX u7;v_ !foD 6'8(_f{JO=h)~fNwӔf?瞊Qx/`oT(z玽K>U*l6ٿ,uIYyD*CPsٌ ݸ@ C4uda i c\#6o xV&1)tTY4 '5ikP*TMtGC&v{ \ gJw]ݍd|lip!;$nwW\h֡{fwl (G?"'MM5tS÷l/eV CV=)+ߒ^s\SL|l%nս9&@dQcl~6B|tZ , M{ɱsP|˜b+q5<9u mow;-o:JhJWxU/P<7l9= l (Y'r P\iBQیRלԴ;Iq'i1#5w͆X ZQo yZKSgc1D;t,址viN|+ATSp[XQWeAP.w36ݦ4j:!XH_[#SV"i7U)A r0o̅{$+z}%9t;2"_d%0W?b KK0zH~E4-eQ XȈ5~Ea4`? 9yo)·>Ut 8}wBIo3c/U'i֙U!D@Gr8'SC[Cjfy)kMShĸj%#_75`ܚm|e{\1o{^ 퇖6-TդƾJMoo]]]M1ݝIW[F<f ;AQz0taF ~'rdo{ѲQ S (#C!X0rSn7ʳFr1NEңN5 RZ ~C?8N_`-p屗ڑː ]`OsNz%*"amPs ޚl!$sP$8YqŘrnje.1izwdR3͌[z/jtrFIoQ +;E8D$ wHg(Q*9AQOՁ7ra(K3S,=!Kq%]/c+ވ詞:Z'(-UmDIgxs)nQT3U~%2@A}Pb%Z+S YNsLeDEŷ ˣXS ZZ[-O#xa!bE87u? gKT ;5IHUDW˛=Wq OG('K:Jn5T[8#pOEXJy(#-9X: ;p_"z }?r l9"r\uBSvuaB,7;IA#ͻ0+8aIOZ$+3Qڭifܧ)}VuӪY_GeͩVa튼^JAwJgSl ,I w7ɕW;*NSI1ÎS%v~Ԅspژ0dDSCV>MC 0FQ)rG'RX9F>8YyO j4qmU+cݖԌXf &FR1K0.THizk_)~C վF80vZ2fD.:v)U=qIk~rс!}:hj[XqOԷ ]7k*%mG xxl7XXRzQ8t,}C(O20w>^ r"G-E|$}k·ܴD;oW$:T{2[՞CL9 6Կʼnc ywof"bذ7%_!v]Zta/Va4v }/NRz%to8PъQK$)-Fَ}¡(C닾Ђ2Ý>X}sܳQhH1)5ۖXB:6NfǦKk}Q,´HU];1 mj<v̥2[D.SwAfh2ȖMRFiO; s+LȠe{s[{wѹHꥄAb}ᘾ y9U 4_ 'A+(ݻE$vuLinOJT9[Ko͜TBi&Ҟ]O9"WإCmC>Oj{!?&]P @T lxK䳒 BǽpvJaӻ# XN]dӓCMxnD}iˏc(ip`F$:8^EFQ(n&@\igjWn39ַ,?.җ8BLf'! +8:޽kg3uzp}l2Po rrU#Ko]\(\aDf,fsʫz( ~9"M q \M ~bBKFsIEb]sʉ=}zpOJO3B^i˳7[yE^{*dJOwXl 8*-i)%gm$\XRQO^j JL4KN u^AgF[ؾX|+[{{Sv fچm֙>ajV=|1=os[~j6U!iwmۺ8;u'١I7in݀~ƊMWVAAPc#>?JW- zaKh2Ŕ 6(e3Wv<&(i5i'rdbKzpwCEj1WG:چڂCeW-"M+m:P]Ku^#B a̧T˴^f.7TIbMhP3-g,h 0ٓz2gc I6sFR[ɨNGעRfbUWXȸ'-K1F~M?Mmy؉|SQ,| Kƻ<8oUi{^F> |QS|;W~Asjr0B-p+DO0gQ1+C:Y"gp!C)+]s{wcJ}-ɽYۺ_GW/}\ ۣJ@toиԁ ޯ7 ֢_ ~,5Z ~.uZ 0ZWH=Mv]wޖ&5tdۦEC^}G+9>wrEێ^C7RcN_QrGH4;n6n}qњ̩iTrM^%^ujo@Ay5 l릊Odqz'EM5@ ̄bCRzRpq Ds9釰nWugpN+*eUk\lLSůSByh%XɆEP1M.ʶgfCN) Io\'6㶶{~ͣdpF&N}<Ζ_΂ Dkީi^5ja~8wT*?7NXx*Wy"B_.&6༨0ǪwZ'C#4o6Λr аf V(23?6s)SStFW]!}gLunV_&_ߗD0B1nȊ@vD}&09b,r}-2k.[gNo$Fǹ)"V7?KpT!׆H)6|5~}>òGcг%9 X+@dE!XbM܈p~&Yzyde+3  hd_IO C{(6옞gwPSOǃήRbɇ)>gafJT|D"RGL6Pu|xIp̦'pG_jM=2[cWuXt|^ Ǔaĝ]J!gKV<qhRцɉD'yOշi^?T{{G>_.7(Sa&_d'EbWNDɟΜE0.8r Kyt8o(6!UYYFe$d(Ag ?j<7bj|زMman²ۑ72~7Il~lAPC^:S,TB<ƕTXF7i[.\\Uajxc.,~I*eZlIqԒӹ']$|BSb~'̞SNz% 2J&~^ҁ2ݗ1%ĥMӨ JշH'*%rwQā瀟N}Z'EAς8ѰWу+]3v'3~l⃄K1TZh^*JLn/ko6$7'wApJ]*q6ljPu[ƕ؜ $\zB!2 uj՟FCRvUriKcUUި=/r+oT͢Յkj%az]L_sEkOoGeu8I֢(!u.xOiT+sn՗cɤFyt001&tLWw ;ɊKl([&Xr LEsLˠ ) ͱBMC[n`'!"B=iq,w Em{"^0BcyP8VVYlSwӖc#d>)nLzZfb=pβkw❩m L$lM2E㺬ʼnvݱJG ƂS>luRt & Zzc8l9׌G0ދpM_ ;j)ÛwhfVdsA,f2<1<:ojI*Tasw|Փ) $L0wNVX'O۾_~u{wmzpڏ۾um8K u}d#ot=].@OG:*sY1q3Ȇ JT |\FRJ2ؙV]:lLZ&SkITA3p\~Ձ 0E\PIv?RFxyc ٠oDm7J׳i$hZc̳ 8w3Ū᳹WsB̼=Sh\0Zִ7Fb4tqj,qpg}`}^`҅(}Pm޹r,`8dw; g7Ga޶!CiAS4_Ť$ ߃CY(MrCOf4!\.RR;ahoBJxQl2o+e36%C .>, -IۯB}vZ8ᡂ\<`D 1+w}lKbPW Gf%10Y:\G-E ʶ9@x8i);(=sM s|))ý%RJ d7qL=Ђ)Q "r]~RqݷxqZˀF4v{1y ?-U `cFw.J!(A&q{D>]urQ&~# ~ NQ8x jL0HAtHUY;S۞9_LTƋvxW~;"聕U3Cs d7+!Fsx,e]n}I 뼪T ^1&r>7wŎ>kGS\g-].޲[_-#Im^lb,4"KQ]2|&Ͼ 0.οDsr@ZD_~'ɪ'!0hG8 Nu}We?_g=puJ^cn@/_Q'9.ZU4W?"$xx+ީyҜ.2@;ǁmVkWD(U~kw!2|yʠb.cpK[ëa 6`}9(މ }2#uO9-޴[ faD^+|$Lj @^@Z9X%~NS>k LDYdH V#Q듟V'YkO'BU z*MNcgݿ0fW-yD/v-W3&t< HF&J}ܺfcQaG8yG CW~{_G8L9B{q?ϛqw;mR>̖;V'D1w5RAB&ij$F"U\] !ƅ$Pm~H¬ Xn[6bv>wȍָDOh_z3^zLΤoK۸hAUY/@ʋɽ`= ,lξOϝ3Q;5xENl=<Τg7TWVGY{go32@D"r{B,r 'ڭ3Pd?$zfcǦfIe Sh4.~Wl88ZUê,  (z[cFgz [m*变L⤅{)_wMyi"^h4Gy| F]$Mo__yLj1MX3BD@αR+tE/F9ۊmRD ؤTޚcY\=qDQ\3M~;DyKr $(w%.n Ab<<"ofӥ$,0,8Mn~o}iSx8#Cu/8zYHUHC; 9*~&Bryv% oĮpESa#PwxS(C$]750|szE4,;j[Z&0pP-D%\4|U0ʝSh^*GHa岩?ꤜ{" @=I4!,3dc\<~$Fܧu*bdc4މW%<ѭmTD8];6ʡ4-,5 zޑ&t( B19:ȦwoJ] `w:8 ɣȥy Sɱ)R+'4SbyuU#I1*vwl`&_ IH=61 G;ՔQokLT&f5_wjW{ G.Lr9CkT lH;FO9xPY᲋%Xh1{Lto[.rb,'lZ)wjd$=G?ұ4wlW]0>鋊p"Lj35"]$Lc9$ĤF{27%HD7pz~`pאiҐ\[[A)6ȄA\;ZiwAnH9#Q9U|prs/ѳtig~C'd)vqF:( + -Uǃ{z_k,bĈӝKg& fIZ1(.*AF#"lN$2,w]Μ=n7HjÓD^<!KM jKE{Q`,0H-_@n8>5"Hm֊)9fdrȋvmLOjք%,Lk+3rm\;HKA:%&f eqXo*9f8HU%KV:!foTnJHu~=5a?BI~> JnZ;$ۡ Gi|Ů휸ǿ}!?l.[i"W#4d¤P8K\ NmAcɝg}{P>@+O%Ld7Ӝ r|,miuN->XB4g ٕ_p:8 S!7QHZRT $\fgѢ24%nn֫tLtL\MN7(2wI3|dT \PõvQU2x%A?}ڟN7Uۈ~w@MKh]ƦzP͙2<[bY B/݄D,'a?;+3SDJ̗'/$=0iG>kMܟZTo?>گY\Te90i|QjO/EAJ w8&lJziFJRrFS!CC}&|ƒZX^6|o>L{?wP?^զ u x80#E.bw:EJ6,S $yҰ[C8lg AvlR1Y XA YC(O>3GD~CC#\*}Bַp0̫'"ld~Ys JMq>F|l"uW0cáh.oK+[kd]*ܨ'O݁ƊZ#E۝%3& .G2ddĭiR)փϿxiYz>=B5W![i@({l2멳xCKL%{KW*k+(|q8e=Iʧ|a)b.;@iLyyz2ZGd")γ\;0+6RJy_[ވTNtpUs+,z+?.+EDkoP )J3v>QٝAW:v3xnT];g`AP%u<\%EʔM( Q /`C#s{ Ko95ȹC΂4!W;(7ѥn\onC(yK%8>'I@W]e=g6F>BKrʝ#+]J֭VsK/4Dk ׃PH=&ТKCdMyIJɈ qjHڣDЖIbWoB{mc1He*Y~EGYN 0%{L!,.Ә,-jOHd.F=n,vZ]VDd)Z^<0 H{X͘d ]k|"^"o_K?=41PȇFucT&{OX9B(@e|a8ܵb. K?/̼&zU;^vKb8AfHyV24GoZXaPr܌;׶ 'H-Hv8[?l,,rf iB5_&m`𝪂8&I: S}2כG;{+gRJ3Wddj}XmR˨bJ7xu Ist!lc瀑YGg7O5eQӯ2Y:g\aY|NЛoYh%νqȐj'8 kNBF])4 c )ġ\Hg}, I.F:1 2u{С{bk=j,xb67iHUbG NMHaDJ(< ;?Ytj./hNNp9MVV1T19")4N-]_XoE}!Zq 8W1U^~7^ ǑLjέ(L[c| `8;>G#ki6:dZp{x5$aZ-MI^oĴ^`0D<92=]SU YO0L^㋁lRӣ1.[A2vf,5@IJVh#8gy,3FG;u V(IìrsA j6&ZfٞnnWRFMY/-RDֻ&ܶ$›a/LKN3 _z(ly*-/y!А P\|쩰P?]bV.OMg !~;-`u}U"tn0im&Ob-? |k }3JC(2Z.p 5 ~uԯ784hEp{_G8L9BbAKu.Zg{|'쀧 #:{F ?&T1I@ '@EfO;]NTey{V@O*kYd҅iC8Bۦ 7_X$,+$R껯 nj̼ybhMj4>&E~tQfI]`~V&g0@D?nvT_6DX|}  ΩpmqogяӞ,]KC|8NMi + PV;&fU؃Jm>:8TL)}H@uP;y5![Eze0\sC$|4'*V<KZJL(/4.7 eφ|^DY]Of$cՀK6MʰiUM',3 eA.O[9z8VexJcWzGSk3E}"q6,yA͐ LPw7;?/]ʧ",M}Jő.} fE[@vR,2M5,BFSVX]sŭ]UdL^l,'㏚Lf9\jQsz,"]ph2  T)5 k^PEMsk7]YwQD %ˣ>P?Vs'Iussux_Nq݅{/+o=7HiPՓIiփ鶄5R9x {Ib+|78 kP tBq9\04y0Y=q}yQy6.#'-,.qG~3iÙ=g(V.^ {`L8k{kI;1MM+m2l}r#PGV 2Ѝka{FBZ%)/Sޓ#LO`(F#2kg:jlX lg6mAC%nKe?zГ]imP C2.;Y{mZ 1NĢ!55mt 3 L_֝7#"|aÆb&9!̩Xo/OoR2\߹=DIt+w t ae@X*4JٟWOUN4Le׆ S8{&847meO8Kz졫w_"YcH]#!SY5sI=bhR l\1]M Z3}6(["" %SɷT+-!𨾞%T%!+;t}KH/dV*{ UDs ~=RV7r> iHHF3)t֨xRWNBcpA؀ژ "hUӆ3["A©>L/4c~`SV-/[߄vK7,fb? TBNa); ;{T=I@ΑU _N u*Ʋk_EG"\ iپa^¯L5`I>/L*Úblj#KIN yA#OKѴYݰe~!paP$N | Obd+2* YM3DwvW)( yDTd|ae$Sbdm @\`^yyjhvpO.~;oӞjJffጮ;| 8 Jii)~/Z[b[rpꔓ,z!\ɖ 3fi.@lteY\PouX L ̿" =Q0^d_ Ȋ?<,ǝVR*] $ɐ8ʶ"ƛ\}8c>9~+qE jUvb.XӶ44𗧑lC2YסOM;!M/9mz_\6KA[\T'NqϞ,mȆ50_׍^Z*G clpO/ٜoC* i96ps%]GIQځ8ELCFiwy%F@}o@ſMS͹3Ɔ-%sSUYzmtB[1^xM0, ſ  U/zBڌ1GINb='#&r4y;4B{m^!}OU i*J". |XLdn#=h{9sZ\qHa[#<7k㍼\9XlrtfA|i#0ђFޯP3TeL@̅+߷}e M-FLx֭ޚDnE#4~w?Ž6.I&?XA,(K[v2ESpw@+YbE欴"'a*EgmθFuLoj}umq|dF/*ѯv ?~v(bF~-ݞzX9 bjZ̗cꞹ)4}ÖMU-TM/,3%' w DE浾}',H*&^vZTNIſݷmZ^Wc>e DV SVkŜ}{V%]F+)Yx|ۃb^S;е[(̀1Llp-g- u ܆8\ ,48ogQؓ1_Q|8h:cgdNgR~F~BţLL ?TxKV%n_+TbH ^Q ž 6*=H3n@j~]~yȯe (Jqd*t&Ka ?RQMVڅR8ҲbI8)nMJ2m)z§9fXb6-̩qϮհF0iCՠs+@(}kx{/q!Z46N;GŞ> :ұ?eډEi1-GC/1xρR,( PhZ\ %V'h\*!}urʧzC%y6\7~}Ǵp:X󈟑vߠ34DjUT"' X ӑ5ӍE7Aa$5QP_Z[m& ",k?mgk/s۰%Z:FKi)lp1V+7I)u햬SFW:ě7 C), VŤvM"̔v\rBITSѫH_PVTzqe.8$-I?:?Ϲ L J1NΕȋ;94lejQq{e'k$̼wf|^0&`!z[[=զ;җ yC4 kkE_L@u -%+ka-Ld'd/Aa\CG"[ &cّ |tI DAzOEWG^vKW?וڧ  !"1~-A]fԂ XZԮR|( iSV+py~i?V/O_ɔk%9?暹S0O ۶ߙugYr?TE=[$# ȳkl G O/JhXC"!_jω)w\J]SܱGzm!B5~HGҞtipR 1^]aL"D +OVyp%N3_eڟ4O/G߰zITS-GҎd nfWc`schutE KӺ;ZCK@ ~mCcy3ͧ9مXۀ0 GqzG8 &gg ZQcAC4dhrxi-YeEݡK.Wn1D敊M˿8WpPjf~1y.-Q%zi,8EAnqK-LUGthl-0 O@ gۡZ~dA~w[*ނ&.CmO[f,VS"ؿ ȯ3˹xX"TG*a4h-(vZX\P `x-Us]YF|0[=#~%|Ob|"S΃}ULaػ[v06IP9kmF@)mX,6ߺE 4/[1'܊aT6f*4s\5Nv^i ٟmo&,-Pa"fmaiCiA} NdZj+oѾ]>1QW8IE^dX%l\9E%68RήVBOQ5x4Ny,}DI$2BBuFbg RvoL63(d4[\-w*~Nџ3ϱc*1‚oUmF2{g0N/f?V[T\0sj!WšՑV5k?st)β CW򎸕^sbc$sfq"Pp6h+KXg{q8' M)wv5.9_Q'>p'RP)$ȷB+3G[dѲuuI/7);M$wCM ?D5'Gy%!++XTףkH.<ܴ (Ft:6.Z b4J4͗9GS/O 2:!(}+LdPO)yd_xZ5X0fg_v}'OvxZRgssqǵҕkNNOkn[ɷuLQut!R参eykؽC|Y TVdqgts6ۿQ9fȭ4[-~-*}?5RShB^ UQ4WK)F]~CE+3v5!M  ,\)m?*rY2it32=!"2[ҫ_6 MU bit}s ^kJѫW6B%ַ2FWq ^v9L+ l瓣ڕ*M l5ݔ)Nx)=t AƤ;ESž}I D|7n aӠsډC#YU%q7g6fET$]rىB`؝Ayޗ)9zFQ]Bunn<}Iq%Ed -ښዛҜ}o^v:R+ڝIaŸ[s$ԡn7D\.D.o "1AUiгpZRW\aioq< Gu:  5bҪV+CXk?fܐ=gc#>%| CN,[̖ +1߸. R KM ΐgs91f{ -]NTb !ʈی QUՐHy* oك+x*e[֥eoF RC߀ѐ^߀z{ނЙ*hނҥ`ۀ܂݀ωOۀ܂݀ Ы)ڃۀYـڂۀ Ϛ׀؄ ׀؄ـ cPՀք׀OeՀք׀ ԅՀkӀԄՀ Lр̻҆Bр҆Ӏ XMπІр̥NπІр}&;}Έͺ0nΈ˻S (;>?@?:! %;<=>?@?>.)KkӁǰoP-?рҀӁԁՂȉG PȀрҀӀԁՃցқY ^ЀрҀӀԀՂև֬i]ЀрҀӀԀՁփ׆l LπрҀԁՀւ׋Z;΀ЀҀӀՁցׂ؅قI+πрӀՁրׁ؋ف8g΀рӀԀց׀؃كڃف |πҀԀՀׁ؁يځـ̀рӀՀ׀؁كڂۂځـ*.΀ҀՀր؁فڈہڀـI JЀӀր׀فڃۀ܃ۀڀـpìрՀ׀ـځۇ܁ۀڀו v΀Ӏր؀ځۊ܀ۀـצ[πԀ؀ـہ܅݁܀ۀ؀> рրـۀ܉݀܀ڀc& Ҁ׀ڀ܁݄ހ݀ۀ@̀ Ԁـۀ݇ހ܀؀$̀Հڀ݁ނ߀ހڀֹq΀ ր ܀ޅ߀ۀ ՠG π ׀ ݀߁݀n π؀ ހ߂ހW Ѐـ߀ր Ѐ}ـݠy߀ր#e πA\ހ.ހ րԔ π Af݀ߕ$݀ Հ2t΀ a܀ޱ9ۀ ӥ'̀ռՀ<ڀ Dˀ Ӏhۀ?܀؀ ӳ Ҁ:ڀkۀ׀-HрԚہu܀ـՀn| πyTۀ؀Ԁү ΀ `ځ:ۀـ׀Ӏ;̀рGqـۢ ۀڀ؀Հ]oʀ Ѐ.Xفۉڀـ׀Ԁѝ ΀-Wـڀـ׀Հ-̀ЀFp؀ڡـ؀րԀL`ˀπ^؁8ـ؀׀ՀӀЊ΀Ѐw؀Rف؀׀րԀб̀πҗׁr؀׀րԀҀ ʀ΀Ѐ7ׁf؁׀րՀӀр!&̀πdւغ;؁ׁրՀԀҀB=ˀ΀ЀҸЀփ8ׁրՀԀҀр_Hɀ̀΀Ѐ[~Ղց3ׂցՀԀӀрkRˀ̀πЀ<^Ճ׊ƂցՁԀӀҀЀu\ɀˀ΀πЀ 9SԁՄt &ւՁԀӀҀЀ΀eʀ̀΀πЀҺsӁԃՂϑmփՁԁӀҀрπmɀˀ̀΀πЀрҁӂԐՂԀӁҀрЀ͒eʀˀ̀΀πЀр҂ӃԊՃԁӁҀрЀ͊\ʀ̀̀΀πЀс҂ӒԁӁҁрЀπRɀˀ̀̀΀πЁс҃ӋԄӁҁрЀπuIʀˀ̀̀΀πЁтғӂҁсЀπ΀j>ŀʀˀ̀̀΀ρЁуҍӃ҂рЁπ΀^&ɀʀˀ̀̀΁ρЂчҀӇ҂сЁπ΀̀A Àɀʀˀ̀̀΁ςЃю҃сЁπ΁̀"Ȁɀʀˀ̀́΁ςІу҇тЁπ΁̀Ȁɀʀˀ́̀΂σАуЁρ΀́ˮbȀɀʀˀ́́΂φЅцЂρ΁̀́0Ȁɀʀˁ́́΃ϑЃς΁̀́MȀɀʁˀ̂͂΅χІς΁́̀qȀɀʁˁ̂̓Βσ΁́́ˀ<ȀɁʁˁ̂ͅΉυ΃́́ˀ[ ȁɀʁ˂͓̃΃͂́ˁ}ȁɁʁ˃͉̅Ά͂̂ˁɨHÁȀɂʁ˄̔̓̂ˁʁiǀȁɁʃ˅̋͆̂ˁʁ+ǁȁɂʃ˖̃˂ʁȮ-ǁȂɂʅˍ̅˃ʁɁHyǁȂɃʗ˄ʁɂǁȃɅʎ˅ʂɂ5iǂȄɘʃɂȀƀǃȅɐʅɂȁ$ZÂǃȚɃȂ| łDžȑɅȃIŃNjȀɊȄǁgvƅǓȅǂč ƈDžȉǃĸāƔDž +ÄƈLj¸8EwgYJ;69=@E^|“ľUJJ(/Mkˆq&` $D^m|x[=,g}  \5e| s<i gr  B4~4C \~Gz 2]~|,e :2sn4TS&Qcr|kU H~}i7 ')*'&'()*  +>Rds{~zlYE2$Inyz{|}}~~V- ,Ppwxyz{|}~b83Xrtuvwyz{|}~nC 2hqrtuvwxy{{}~E (aoqrstuwxyz{|}: Ynopqstuvwyz{|}~x/$Olmnoqrsuvwxy{|}~n$$"jklnopqstuvxyz{|~ U' hjkmnoqrsuvwxz{|}~ k &Fiklmopqrtuvxyz{}~ {&hjklnoprstuwxy{|}~ /(Cijkmnoqrsuvwyz{|~G(dijlmopqrtuvxyz|}~^*(hiklnopqstuwxz{|}i)Mhjklnoprsuvwyz{|~U. gijkmnoqrtuvxyz{}~>+1hijlmnpqrtuvxy{|}(*Thijlmopqstuwxy{|}~-ehiklmopqstuwxz{|~s ,ghiklmoprstvwxz{}~cI0ghiklnoprstvwyz{}~CJFghiklnoprsuvwyz{}~}J\ghiklnoprsuvwyz{}~NL eghiklnoprsuvwyz{}~}QZuY~/eghiklnoprsuvwyz{}~)=] !Y%eghiklnoprstvwyz{}~)Dk,eghiklmoprstvwxz{}~= Y~(b3efhijlmopqstuwxz{|~t +i~}(9efhijlmopqstuwxy{|}@ a,~}i@efgijlmnpqrtuvxy{|} 'K~}{Gdfgijkmnoqrtuvwyz{}~^ Q~|{@Ldfghjklnoprsuvwyz{|~In9}|{eGdeghiklmopqstuwxz{|}:\'~}{zyAdefhijlmopqrtuvxyz|}~+Kn~|{zx5wz< bT   .Scsyk]6  (Zux{~n7tw{~x*lorvy|bYmptw{~u jnqux|Nkorvy}vgkosvz~c!hloswz~5hloswz~}2+|{*Iw+hkosvz~/ P@ 8gkorvy}j "t=gjnqux|gYE ~{3fimptw{O>) w}zD)ehlorvydVB {xf cgjnqtwzva }zvr beilorux+F}zwtqLdgjmpsvq-&nf#=}{xuro-behknqtvy{} ~|zxuspm _cfilnqsvxz{}~ ~~|{ywuspnk  :adfilnpsuvxyz{ zywvtrpmkh [adfiknoqsuvwwx wvutsqomkh` /_adfhjlnpqrst srqonljheE C^acegiklnoop onmljigeb# N^`bdfhijkllm llkjigedb_ O]_abdeghhi hgfedb`^BD\^_abcdeddcb`_][  4Y\]^_`aab aa`_^][Z8?Z[\]]^]\\[YX;7QYZYYXU6,6@II=0#  !%# #'+/2541  #'+/3541-)-$ "&),/00.+($  !.,(%  #&)+*(%" *+*(%"  "$& %#! #&%$"  !  !       il32u   *hk, #D׉7!wrM> <ޏ! V_<f~݂8 '? 'օ'?2e}܂$>NW2B44'0 PK(đ;, ljGNNMQj- kׂIu: ߃dE*/vj[޹/@ֵ)QI  {}. %Vu12q-      !SѽY# l׀t /ـٹ- Pۀ_42)ؽdIS*Um-\!6s 6ҷ$Tj,лAI}&-($ Ҁ!Ѐ̽ k΂˃7̂:ʂș(Ȅǿ" IƃƼI04557G{w  H[2kN(  e[C/yo Py~I@ )z8Y1|RS8_rtuwwqN !ipstvpK      +[n}vf4 7rx|HVpuzy-mrw}9[nsy~intyuintyx/b=cJ#hnsy~4M'gmrw|g%\}?fkpuzd$Z{g dinsx1Ex}xt Zgkpul&S}.O}yuq:dhmqux{~|yuqm ^eimqtwy{|{ywtqmi (aeilortvwvtrpmi_ Fadhjmopqpomkhe> X`cehiklkjhfc`H^`bdefedca^F+Y]_`a`_]\V ?WZ[ZW9 &..!  $*/4. $*/43.'!-"&*-,)%  *,($!$%%#  $%$"      is32v--2{{.UăGE˅2>qƀ OG >q8T<#· L؅A ei gðڤQ ojy .UefdFJdggY- !! $`Ȗd! =ۢ7 1ڦ% gѱ5cfF}Dա1ί4_*9.͢iʀj 4Ģ/ EdmkzK Duq}8 IGuR 8BDC.0BDE;  -Px~[7 .t~e  Tvd jvl"G`5= itKy.[]od=T}p>iqx}~{ulZhnrttqlO Zdhiifb,  @[^^R1   &/.$ !  !  t8mk@+SxxS+<}ݶ}<&yy&kk33## kk77]]&&GGpp__;; [[33SSjj %%EE FFOOzz55AAMMYYeennZdBX*L?3zx6J TCr'?o"nm lh_P 4-bdX'weOUC6Z'Xy;c$^XI4iO.Ca  p3  *3:H3* /@NSWZ^oޞ_ZWSN@/ ;S\bcccddd⯤dddcccb\S; 8PZ`bcccddddfпzdddh±kddddcccb`ZP8(:IPSWZ^abccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddccccba^ZWSPI:( #*3:BJNRUY\_abbbbcccccccddddddddddddddddddddddddddddddddddddddddddddddddddcccccccbbbba_\YURNJB:3*#  '/7?FILNOQRTVWYZ\]_abbbbbbbbbbbccccccccccccccccccccccbbbbbbbbbbba_]\ZYWVTRQONLIF?7/'  !%(,/37:>AEHLMMNNOOPPQQRRSSTTTUVVVVVVUTTTSSRRQQPPOONNMMLHEA>:73/,(%!   !"$%%'()*+,-./0110/.-,+*)('%%$"!   h8mk ?ss?OOMM--TT``::qq~~""rr9?#3!jsm$ 0WkBVj3ddh἞tdd3"8HXddddddddddddddddddddddddddddddXH8" !%*-26:>CC>:62-*%! l8mk %% \\ II==XY44PPJV:%.n/d~i9`yDjqD(8FLPUY]bddddddb]YUPLF8( s8mk``!!,+,-8 &*.2662.*&teeworlds-0.6.2+dfsg/other/icons/Teeworlds.ico0000644000175000017500000032157612140200333020350 0ustar felixfelix Vf (W00 %>_    hPNG  IHDR\rfVwIDATx]/G QPD@ET@ ALP1 D1+(QE1C `FAA "9g.nv{{QLOOlOTuUuJAI$q"%H"$⇤H"CID0 $a$@IH*Yr a //H*TFu5ftXQϿ?F2Zb;dT IBIP2@݁QsNt8x,PD ͂0H`$@b2 ': F^ALʀhc D$ 1P)0(|"F `(mwulYIa`ԝQ Fi.PQF1zѪxPDRuѕ#Y&:e=:TG:3`ԍQx(F}(?:T^.eT5ޅ)Xh0܅$|FR ' Je#7'Qq,2,c}qqܵglY͉wA&$8Q ]-G̨֯`DUr v?S(d^a6ƒ62ڀ XV|)}>T@w>z=64`^ |X eXk^LUSkH)D* t2Xv;tU~a|# $;P`2F3jԏT,'AVuq& *,pZ}UO2џЪ0s2̚ƿB2`u=è& 1GTE]$|p_SSkFd`S_܉]~Wa9at#&P  ?n6ĕ]ᬶ:U!Ul"| L3ޙ[w: 31 9 @Ҍ`t'L?HrծE-\٥).>+c^pNe /%PscۯH*g\hiѸn&MB_fYVޫ+qNDyjشu7ޞ6?s ~ F0}})c#qZ5JWP]<|b#N{yxr a d?x43Sqe#q-Ѹ^( Tto;{r¹2vsYWخ =7P"n]1rwx~WXq$c 3Y+e0ST*oNshf;9~wo>Fyqw*~jmP^Gz|NAbѲun d/8yэnn..lGonre 8uҫ(RkЖyy2n񅗩/3*LJ%@ oJ3UxSqܑU8;1j,@>'u>_Ļ^^f n<|.AMĂu1:Zt[Zˏ7&h nRg;d#h"| gV/1"aW Ȥ3C%f@ڛ֜ѹ)+xps'vRi B?)js$x~w*&5_/UNr@{7|Ë%V@nWg&@z$4PrVC#x EI@^~X3?q;W?jIWhTPw$\s0_Sr'*\{%wj6o:Y|%PPP/f|у 6F˯^^v Ec4nQ[Z.DZ EyvMrk󕀑gxZȐunJD Ҧ[Sy.f*_TBԅݣEO(ܛ_|]zykXfFCSiT %]c-7Tc#<v1U (Zu5U({0EymY׾ߗjM(Zè AC%%YІd5Ra5Ƒ*LtUM\\QjuX; ; pkrW[9}_V(hArAܔ(( 4jŜATpr*e.Qq ZI8+8I9w;cbe:-ߥEp Ag?b8(i^ʃgX`IQE.zޜ~"mbW2AY .j+mDbO[ԻV?O * +wKѵ8S6٨7 %E 6 c|=/@> MUa4We:/T#E6d8 J,/R-y}B F%0S7OO2^yFCお'km"pCbHNZN_$R pı>|uc1ۥ #R<` F+[| K[\"lPC֫]B"+Re <4|{Ug7Hl7Ov ju) uV{ 8㚱((P]h*s, vY .[W*|{TJ Wn@h zy&8SBAFj B*`,$E*/gYKg6h;bBtv,fet1A"*c`l(8<:/U==MxA /c湨I &mQₗnN(FUcDSTo3Wwvk]dVT-+w>6>k>}^[|o ABpuUQ[hWUOhl u #(,ЄN M\+_澊cX⫸~z\/Pu0vN$hIZ6kj5M!N JU?)n,Gw{P={6nޅ#m{MDR_ k<WUq5"X"?(M+~):ΏqBd\$EPT) ,TpΩ_\ k@˻ow<4G ( F0yX c p @|wd{ yTns9^Z]ꄡɌtDPM-dvGlH\`؋ҥI 6nځJ̌+[|@龃b[J 0BZ栐 `<24cO|E2w`%XZٰW*ׯ{o8iT]0lt|<',\/؍YhڨhwC3LLo۹GvuV*Ơo@Sw ~*Wْv~+by VV _uwr$d)x(Λ\$Z#|W,{n3|!@3RN7^B45gUģ2k1.Mֺ+MjnDei}7V9g1h06xkJAA+Ol@aAv?W(Q3Șՙ2ktaZ&<(G"_}FZVq7NMݏDJBTvC&></M_[xEsXTc? 1k f_71+co`U_ .-anb7 ʟZt>G7cnZ|K1oЛD <͢uRnV7zn")Dñr6e-nu]Y/@+,g-ct`C&h0 v4!`4@M>BsBt[_WsMx8dUA}z>>Mu2c"^ Q(8"K^0 ౘdMȷ^ )r98\<* qDGQli8Xt'Qa=̓+MPYʓ74E=ZQh?nECtVqĩǬ|ߡ]uynxsg=(!l?oR_Fuh_Ҫ-|hR_/XM~p(>+ 2QƜI+@ Qg=E[*+sBnNV8GzZ]P0lپWuipJLWPD`r~= +_wܳv.4r*>)p;Q Oq&G z e4rʫ|`Pu@ҩo-sȌ*{@ԫUS(} }/_ZWOp8|}Yp<{m܉ڧE| h)|%@@OFceL[:,66 G?q/z0dg{[YxvE)p\:J?iUxez$|:gʫb4.J dLu* tMmo#~Z Pxf붣nUF֍xsH,whzZ #)ϋoíPsr`l+`.yجQM,[KFضsU X*˘Xco 4 qP y P#y.}"Y|~=m T F w`VnX3RH2A\S$:\?p*FFZaRFҰދTv XYO@nAðt+\n9=<빑^n+k{_#Nosg$=s~^S{MTyUZ+S"_2s,Ic A]+q`מAi,qBo)m~ 4e%8 4RNk{/\QXCIt~n4U"6 nFO˘ &:P3rq8?ӥR:q^ *;q\ڶrp6k9O``F)ZA+Y8$|"( 7B^x9Kq-塚= Nc>cticvAVeV7h*}ӻ* 9 A+Q4i:ĊL(^߶=?~.z&uQrYpU|yPyiO(mY-^uDߥxhut̍X&.kA%y%Ѯvt4Z+Џ R(']$ Z$r7j­(u5xԩQg ?xǹ'`W  { '^S@Z㧮|jZYЭϫ{]tߒ$ȿ=OGum][ÌAi~"1߭Rа 2x覎ط ɳ-aP#| Ԯqb uhu` 4H0 =_MK P~%׀dz ofh7xg|(fPZ͹V?0w|j0P-o(nʫ uih ܷN3S̑G.8BC&|; ]yU*ey7)3_uOR7%_NK7]X .BN P$RX'XJ%paGó_oD᫉} Wc?XョKL1JE{8~dAoD蹤J;1|$0{`@%@"A[WซGWRWxθɈ~kQF}۶̎޾'c =f[x]4 |W:z7CA)K1]w:0UQ%P9~_~V,C%D-kBEs$f[{jU+ZD.,ᣒ;:ϸ*@C|_)8(@N ӂXX>ߞjy1-t8sm s護?Pjkz'Щշ[o潑y3F*HKJP vFCdL?= P TP\ 3R/>A$_Һ;%7yP(Ģ8eKHry!.pug[rl`KZ]f.={sҊ4*6-/+@*t"P @߁>'W 7{ ?^ɟ>WԺxKd޾8»P|i,zTĒe/q+|̖Ñ/bo%# T/P TPP4u)γg;Rt+l8 C3`]/ah{f" p ^w^ɮƕڏĖ-hi{tX(ߝ;po`R隊o0R2%J|Ĩu*? ->/OVvl%Gẇ,.B*bPVLW賉' cS$MCz$&p/ 0'0}qVE`U)T}T[d[/t2{jl&ֿ3jTng7@;NF|\d!Z+`Эn~r+rdoIjK) H0i2&]hydryŧtc?erŠFSc 5Uђ>ǖ>k[wӣgY 2$$J:t89 (s[rsy?2j)cEP @xˆ.4Cvs'eas~Wنr٨P6s,4$@\ /A7!S b ;?%F(<;-ÃRY-'Ӛ_<Я&U?Ny[_-AW"!. @Iww/kx~4XJז1"Mr\uZ`p@Zj+G>>u{RO#2ߚVP ?w݃xNh"kgȞi@ۀv` rM)$ q+G>wE:Z v^'_WE~)ulO~}.jA)P$ P+@W˷#oB5|+nP&Xd~EeG5٠]00pDܗ ") ;?k8Qx x$~HG,@ܣ,1|nm]Az0/c?JGPˬs8k׭E!몾CҦFu;QJʽsQJЀdLC+=+xEN}FuOֲe :? Rb޿t'*r 9>nŔtUț:/b ( @/y2u}=@T\b#&ORV jF e* x1eJ>Dow8*NhrAH? PV)7|hr+'}9xLۈ/vX΅Ph{xiO۟!;Y0!KQ$%[@$SL"@RH%lRxZۈ94T>+ p:8|<޽>B:.-Pu &uOwΛXV=8{WR82&ZeKj dU7_Q 832k ~p]򘐙N<:}ܱ 6]{cTCgFe*#H@sސ1KhFJ1yj(k|G9 D|*t1PiL@\kPֵ"kZ\JetgĨ iX PN.-ٯb^^Gدy8" !~;33U* = z4~~/.B-fYhso~7=U{"\N,J HW7V* ȫ?H#L#J' AoF'2U* $Rm<@3x xӧ% ,Jc#x8f% ~'%Oxrl(k~A!yLܱՇ+zvQp_ {ʘ"ՌK2Sk0Ut}?ꧣ§s\ti&Y^}4M~J6ɘJLDcÂSOt]s'U$Rx`Ky8A6Nt?xM'~74 M'2h 'x`Wa@] @kZw7Y"Q/4y í x65^?s~]'LOpXt}@O֋AiH(<ۭo.w䑜KxhkI˯,scBIX=q"Iu 6 +ڀdL҇UO xA$DDVyv~ýAL-Ab%ѩ*" VB&eL]Z ZF @53ףxx *r<Պm# x'<17 lXqkag&m,4'& "Dυ"8p [2x|k;暩p(@RIN8Ota0fqٯι@t ~veBo?W #PwQX(}締;X)鲶}cT"A*4%A@?M~Q@^%k;`7O2ӿKῄQGL+JPP)~Yke<~A "k<׍;ya?[U^>>V  *-@S%hAQ]~^(;\k/'j Aٗ!?i&쩴h`+Kp)2_'PcOaI 8^?A@G>~Hչ?3[&x`1_HsPAE d]˓h~kPX+s~w` q(]X@Ca(q0UAij8DyB,*"^?ߒ<ᮡ?H(Ȇ_(Fҁi_C:R[ hjO!Zp ~~N 1z>x7eLwv2 4N)ы^t[y_A>]R-<^SyAa}OГXSk0h,vPӞ9Gn+z_O?^1S|yh~T,^]%iۯםTtA.]ǒDžw2NwçSi] Fݙ+qUj7_@@w-y,\i A2 "8p  `E\5D 㮚_R0Ex+ 0V Α1V Uiǎesp@2{SX+_J\v_tt{o@xtW cxpI# K 32lG+)xOQ:e248 h|UvmwSDP-d ciǻ1H ># {sVPW<5Qio>~ A!Sa|q^*ō%H3ˆ3*~5s E d۹?g˗O(EP"(JC1UQ:KKpjLš};|z9?2}x%oUh 0Q WwqR5[p)I~'oGbmE3Bk)`.6 /3$ԩt_ROO zP \&@9PfH||ZrQ$-dRԟ" WQn1DR 2 rd]uS r-T|c4/0B**LFUC܂2 Ef^I_cL@,"i5m >hu^:B*B=K)M~p.r\2 {peECT>:Px7@wI0߁+C ءL/y)=TJ`Hd@R)x@.riM"ьKdIAnf{v-Z,VCߝ`yB+mEF< 3]CVC.Ʃfmx`&o2~*090G4ǟ6l?Jm2R,/ӵC{Ż rhBRԕ8kZ_w,LbB |,QZ_e5(c]/ً4?S-{hㄒoHA};cP},Xa;~qt DݑezUUK 2rYk]N!A@f:#߽8W|`hHi0%IP86M$L A>C31=3ZXo3wJ hAJD *q ŰIU3v6Z ސ{h]nܷq+zq!`V["*FUTiଇ Ӎ4LXhuc-OjÍ&dV [eˢ`UXP}ot5'gZ p%MNa#%6Zj_\@Ñ52h&ԊjN7rDCXnLMs"E+ZSwzdv`f/˵n{QhKPJ23-S2:RKc" @(1tL<5`B]T&{,77 kz][QEHrSk"+rp .AV :((`ҡ{nƞ 1_%d"gZ^!rBTl*榇R~:*tFZjH SǾ|r/@ۿqBXÊuy?kcw~] E[JC``bQ1DTd ^nnK Vt )qٚ}!E0혷dԖ 6i~NL"4.'@30* HH4@1ڻRIҸ\I\! UUbkҩG3yG>ޙgm_Ys/usH=5W0,)~7$GtojsD&9,Vp)ެprtQ_DC|L|{m^`t(V;Fkb1( > >)^Se+:BoD ~`D[ӑ ¼}w~#m]PhR;z v0s.FS|:o݀&PVqW|Fi~A!F} C>ܨgv^n ?9ܗ^=O-ۺh@̅B0kon 7}Z;-$. b8b?K7 qp"d3`x+Oa̟&xgpo=/kp^۵ c&tl=`=@mbSI+_so y_BO~8wG]LT]}ذZT9٩wVYX|V+q˨u<曳@ղq2\V{UJzh4RzJw| ~gzH<$x*˕N[ʢV4%V `μBg~\:Չf>- c5pk9.}~=lh%C:1Z{vc"2XG֭*S1ԭ_~ܪ{mĔ Q@3>(dk@QJ ZenZ{5>YZwz߄j^2ӓ݅'EA^1l 0+_p{a5ԭ*W~}ڏ^B^~!n_-͔܀7a>b6~uilh{}O(#rVyz,hZbRC'} lV##=+VAjj֕j)q]qϾB\z,]=ނ@BVBc*QPn vWSGn5. -F_3Q*3Wv(>gW-^#넗\ju9Ͻbt#T*vDԼkXVSjYTZ/K;L~P|mHSa/~n#lgH?:j1S  WqĄ aձT)gYF_Fϣ[Go— ! `2E8NF^[@5T>TkZRUS~؃oFG(|Xc&qryzy:ʔJTաZׯ^ܩs4 =.V39+9y:8;5xYӫ$чjM?)h~0a4%k,`y9uBTtjmʢm+oF%^<5_*9z]# Lc.9)KDߋ [-:І.Mi!$Y 矔3[ ?"]: qܶ>7!{! vQ9ɉq9Y>[_7h5/:]T|\eV[1aIA1ߺ e~o|FVkGlƏˤIی5+|vk4 /1v*yJ Wi޹#?଀,ʌ]xs+D k[Gd3TT@ԫ~_b*u¥dBkz;1[//Myͧw4ӼsYu|ƹ Rٵvㅩ xi gyLۊN:t ܽKT݋'( m F[ZB:1ԯ 7g+;)g88;Wn/(i/U;tNڸkVLC8nZcgȺucN\[' @.@LvѳN rR0.,wVN1ۣg/ݚRmKFץ(mO=j?a#Pjbph˘nǧ+Yjyל*D|louil-GѪR<^׭VR}xsn~]zձ`?~o'ޛ'L|1׈ HGܝ4u @ϻ杻bs8wg[_݁FBcխ)u6(+H,yr nzQw/x({=%cz th>'h/طR&Pyyud6s29RE`i޹Ri]+`qk[1m._NPJK(7gQcTJF <J uS^)ji:uO+`3yoygl(2A2_W \ٿ?Wsw(:؎nnRc,ނcꦡa^- ر\+J ?ȼR|G~:V/dLV|FlV;[&i!7K^g^])?*՞oW}ZQf]T)HR)9U(,ҙl JeD8hڈ0.^LPnjCm݅ر;tQh |C8R*jWLaT/zJA^}[IҞ~+g;{mZR]ct}Tvr, ;+ᣙN8"D#lxF;?|^&3S H`mMa'!ϰPHaYI$ @́17v̳[B` (` ٲg)FVE`n`4%D0ȷ)l?L& |E IBLF SL7tD9쨘-D>F}cB P[ ^ 0@ 4ra"5,S ZE(5$ `tqo 4V =-"-LZ~+z4̷:Jr` SP+% XoKOwa2PK>.✛d H 4Hh-f   `|O T>`Hb3GLP\H"d/dKB1]VE~F( 6 L@yV??v[bP8I VwƓkޗ`XoI8s oýi^dK[$Et6",(vQx)}̵Tk @Z.#ޠ`wtFVc35ˆPȔ'Fm'͋=ۦ @mϫHc)&SXVE` BeN" PgY[{S@Sl^T7 6Vn@QW]cNI$aH;rv]~vKd?G hpxS)dZ:N(t\H *nhvЛ]&žg-Dc1ZBۇ []{loe B.#+E=.֖yM 8O m;b5?fѦY1X`%`U=PN(^w[AZ!M"] O쭺]E@8يVhW<DqQWnGwŢÄtv{WԺt:BP.BIRnC%߫R%gaX^~ާt]7 %Bȝp(?/7>3AAEHLMMNNOOPPQQRRSSTTTUVVVVVVUTTTSSRRQQPPOONNMMLHEA>:73/,(%!  '/7?FILNOQRTVWYZ\]_abbbbbbbbbbbccccccccccccccccccccccbbbbbbbbbbba_]\ZYWVTRQONLIF?7/'  #*3:BJNRUY\_abbbbcccccccddddddddddddddddddddddddddddddddddddddddddddddddddcccccccbbbba_\YURNJB:3*# (:IPSWZ^abccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddccccba^ZWSPI:(8PZ`bcccddddfzdddhkddddcccb`ZP8 ;S\bcccddddddcccb\S; /@NSWZ^o_ZWSN@/ *3:H3*  p (';)>)>)>)>*?*?*?*?*?*?*@*@*@*@*@*@*@*@*@*@*@*?':! %&;'<(=(=(=)>)>)>)>)>*?*?*?*?*?*?*@*@*@*@*@*@*@*@*@*@*@*?*>.3 a&;Q}c r  | k U 0Hn~  } i7S 2Ms  n4NT  S}&]~  |,B e :XC.\~  Gk z2L4P~ 4OCe r    BcO)   `  !!""""""""!!!  \5Oe| !!"""""""""!! sIP{  !""##$$$$$$$##""! g* Ghu !""##$$$$$$$##""! o^[  !"##$%%&&&&&&&%%$##"! a A^q "##$%%&&&&&&&%%$##"!  RzXc\  "##$%&&''(((((''&&%$#"!  DebbIo.F   9Rj$&&''(((((''&&%$#"! -C$;Ox !"#$%&''())*****))(''&%$#! *vCe@[$))*****))(''&%$#" p 8U "#$%&'()*+++,,,++**)('&%$#! b/HPy* No)+,,,++**)('&%$#" +  !#$%&')*++,--...--,+*)('&%$"! !]  ]-..--,+**('&%$#!  8Q f !"$%&')*+,-.///0//..-,+*('&%#"! 6N7T_ k///.-,+*('&%#"!Db yX 1 !#$&'(*+,-./0111110/.-,+)('%$#! FfQ{ -$|0/.-,+)('%$"@] W!"#%&()*,-.0123333220/.-+*)'&$#! 5M DgRs1/.-,*)'&" (9Zp!"$%'()+,./02345554310/-,+)(&% . x6R5K./.,+)(f'y !"$%'(*+-./12456765321/.,+)(#@[r +).,+ | "16C j !"$%'(*+-./12456765321/.,+(W| ,C#~&7NU Cc!"$%'()+,./02345554310/-(Y#s)>eY "#%&()*,-./122333210,f += [DgOw  ^T_`bcdefghijklmnopqrrstuvvwxxyzz{{{|||}}}}}}}}}}||||{{zzyyxwwvuutsrqpoonmlkii0^v3Io._`abcefghijklmnopqrsttuvwxxyzz{{||}}}~~~~~~~~~~}}|||{{zyyxwvvutsrqpoonmkji6j?*R}W`abcdeghijklmnopqrstuuvwxyyz{{|}}~~~~~}}||{{zyxxwvutsrqpoomlkj^ gijkmnoqrtuvxyz{}~>cv[Mhjklnoprsuvwyz{|~U v(hiklnopqstuwxz{|}i idijlmopqrtuvxyz|}~^ ;JqCijkmnoqrsuvwyz{|~Gp;_.Fhjklnoprstuwxy{|}~/IW_p%Fiklmopqrtuvxyz{}~{*2pG  |hjkmnoqrsuvwxz{|}~k G&"gjklnopqstuvxyz{|~U&+6Olmnoqrsuvwxy{|}~n$8B;JYnopqstuvwyz{|}~x/IW](L^aoqrstuwxyz{|}:Zk]72]shqrtuvwxy{{}~El 7k 3^tXrtuvwyz{|}~nCi} k ,PbPpwxyz{|}~b8Yi  $?MInyz{|}}~~V-GU #)2+K[>kRds{~zlYEo2P_-6#3 !" 3kk&yy&<}}<+SxxS+??????????????(0`  !%*-26:>CC>:62-*%! "8HXddddddddddddddddddddddddddddddXH8"3ddhtdd3V #+++,,,,,(  *+++,,,,,,*j>_ w z^o)=Gw}zDx r"(:=gjnqux|gYEdt~{1=" 8gkorvy} j"18t~ T~+hkosvz~/LZ%+ Pr@m ~ hloswz~}2N]+AM|{*:BIetw q Eghloswz~5Zlq zgkosvz~c :Nkorvy}v :`% jnqux|$` Ymptw{~u {lorvy|b T 7F[qtw{~x*DQ T- (L_Zux{~n7Xi -M .TfScsyk]6Xi  MO      O?ss???????( @  (8FLPUY]bddddddb]YUPLF8(Dj                   qD %8V _rtuwwq Nu 1!2 i pstvvvp Kq- ` | R{ S}.y)@!$%%# z) 8QY$%$"1I i/"&*-,)% Pvy~Ij @[*,($ /9 e$*/43.'[Cd/E!y-o* d  Hk$*/4.[2IkNu(:  ~n0G4N5N5M7QGj{&..!w-/ Il?WZ[[[[ZW9 Ij(;+Y]_`aaa`_]\V ",%(H^`bdefffedca^F.7P X`cehiklllkjhfc`:K kFadhjmopqqqpomkhe> !0(aeilortvwwwvtrpmi_ $4 ^eimqtwy{|||{ywtqmi ':J-B:dhmqux{~|yuqm(4VP,>Zgkpul&ANS}.IWO}}yuq&2P4$2dinsx1TeEj}x}xt $4'fkpuz 'd$6?Z{g  \'gmrw|!'g%6?\}?s *<#hnsy~4UfMm~-8 dintyx/IVb=S_cJX)<intyu!Y4M[nsy~2> !Pw-mrw}9_r=/DVpuzy-7 = #7lrx|HtI !*+Sh[n}vf4Yk#, I \      \ %% ??(0    Cq    ~E)>?` Pz R{ T} T} Fi+B#6Ox Qz S| T} T} Im-C&%8Bc5O kj6R &)($ MrLq TzW|%(% =ZV)%,21+rS{Rxw)Nq . z( Cb!!ud Jlqy 9Q  $2|n{&8IM?1+> Z6\^_``_]Z#c -;TQ`cegggfda]3C. Y Ycgjlnonmkhd,f {EdimqsuvvtrnjM)<$cinswz|}}{xupg )5MHhnskkmzzup+7,?^krx }-5zl %&tgnujlb~S  nU|ipwxw 3`w o 6LjqxCk<\l;R]\y*4Kojqx*N_ !1qPpw~V &6Y|ku|:aw !"/L'0;IJAAAAAAAAAAAAAAAAAAAAAAAA(  &*.2662.*& .8UBeDfCd.F0JBd Dg Eg;Y-  -Io!  Gju! Ry8Dg&/.uq}$ 8Q EedmkzKi ,4L @[^^R1/A , iZdhiifb,j+#ZhnrttqlO 9T>iqx}~{ul.<1G]od4>=_qT}p*8 itK}y.DO[!gjvl"5>Gcq`5f!1E Tvd%2=U.t~e7G $2-`{Px~[7d{ !. ` !- !- `AAAAAAAAAAAAAAAAteeworlds-0.6.2+dfsg/other/icons/Teeworlds_srv.icns0000644000175000017500000022157212140200333021417 0ustar felixfelixicns#zic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \@@HHPHHPHHPHHPHHP S ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPS ]@@HHPHHPHHPHHPHHPz09 #UL[ Bc P?, +qu\-]n7 z(2x rښI+W#_M(tZzob3~wVфeq.oHȸxXTb5\VNʱbZ\)Pan# zVp{bp&5H 7DNNRPa)ޛ1D(o_ٗ6c $T<+-{3ϼ}$JTE>H68reA# =%ց\tṫ.ae/Ѽ cEN!*R9 ˾=M0}5vfiHK{Y&>tip(`bRr3g)B_rʹ0Ԓ1_g3$FRL& }ϼ>()@(U~aOK{Cci/4XpL`ij&]p_!q rU(q֌X?2nt@A+廤[X|8<_/];h H>C;F(KHht*ߙ#49cvdi".^nJ*:beDAt$SyYԬuOKTvAqz ޝQxW`"Lⷝ(3L€_ѳ#7mőC__H ٦S-L Qvelt!BxO(6ћ,"ɳnM]'!+jD@ܢ-Ñ0b^}@3/rYg­}oV&R֑Tv0jߩ hUkDYJ Ew"s9ۭ|gCeںqa⌳?%*K#C&!34ZLiG C'WҜ tmr~áx_D)=ܠIHpDF×Li/mt46?*dVQU,0})4drL6qTHa%pu^]Zbr(k.LZIʙ SN.u&n?A^m5!QV6S*$9lXʿ%H23g)Kb`ͮ@j}8O* -ʬc;F,mU Ck*VX\P:C. d WV"=x\O`Ӿx鼯?It#t"KvίJ2HDfWa%~ ?ODfk w./g;m0h5opvJԪNx{ufFrȈxX=нY}QsuU]ZwAwΌn)c(6N3E#bK /P*z>qO*d+l /D[>{"ό)'\$ d=XYz8<:j@@[>^:JkSuhn j}sOFj[7=Yi8s~h-f C'F.UQL18[ءj{mƙ+}M-H?i՚_/ 5 ;lcJRUFJg7wɾpz_,x}}0e QX1bjjD亢T(+ƭ#T&ļ }sgj1(zI7).`z?[bQP&g@yUb-SaM?.{" H9՜0Py̰F.:H>wZp4 mSyÆE<ϩ_˒'M&&>h}!9M|+;+FxIÈӠ5#.r)==~P0&07m}b74k UuؐOZecկTQ !6~)~koSX7Ji3oQCMq`H>j : 9ɮ{" kv-OLNL_VOMЊ`a<6g66 )%tN^`3O4oʍQFsP|B6 e'F6J/P6 %P)e#'f.KmD"V48qP*RBR졲  zŃY IҋЈqY~þ )+{-TdVG9k2#l@>Jڕ+8pF<^+| 5kAv1yo}wCpnm@cBkC |m9Lca1c;\/OG+Kǡm'fle3A5Ll]&Q—ԡuҭPQ%ܥuYEV B&dzM|ԷlM)ᗁGoM j"D|ړ~;RWřсbh|r+־mgRF.BS'X*yбKt^3ᾂ>a;3;POk"ʉV1ֈ)^m央;p+ @wg4AyHڵluWPI ب([258 z TTpT*=: j1k3ct(rcehCdO$zz危d8ȻC fjc\44Ӧ!.;EmdtC T tmGB:O߭@v;2MңA ܪš 1/n H˯/T,O/ tLmIT!*l†=qw>1G RC 4r_? x^b0@`FrEhm iUq7K/e܌ED%U*@9~sN7]G#n;Oai5=رVj~ONNqH )pLeUX)Q;KHBܐz0DL JǷ&K1Y_)Maq R8x/Vk`50 K2KzoaW-7 b@-YPBnxD;xD|T"'WbRn Yj@t<(q ZjOM cԘ@+&)Rv4EYwpi !a0 W?7 s$\ܶ789I[ntp!J=BuL~mv#}mB.*Y&'*G:&`dİ.-Jɹ\UM {)rx fb AI76۔K^E׌Dw:2$q .͂O'=[?כ-_+,Lח-cڇ79ptQWDחugpu4WPX!{9Pώv!ԇs,}S7,n{NJ7|"pPԘc~y<.xa }^Oz-0J Z#dx$M [7G~Vds$>Vb j1o'Q3ZUVak@Fz#tFpQ1>z.þN&GDo[DcAbF2 QhOVf۪|>BUmVeP u,+Т)9O Go 2/*+ nOiaYoM9#JB[>W9N'J-EzmV#j,zlgU! +0 9̝`[eJJu6r|D։@h[ssK9, '.mMGBv]xثIցM/K&.,6H'Vl΅e/ZSC FTa0ލ<Qʣ-%PY@qc*|5`+׊#&ŵMFV E; tH-IhD{)?B4kS8p@Z~kiڇB0ےf,"/,1%*h+(Xv1˟Z>%hD5T%}IDfedYހt,TV08q%ZMu lX7]vK+_2`B_

Vs(o{nW>;v5C ں> a.T F< 7?-pOwxɪaL)U<ߝ> 4xӯ\P@oR]&V\-uV gOFˠ 篇T[be_C . dWű:S cYn9L)꠮or3]c8ZX09jQASŪ8rO}I=Qޚ ݁HvMm*2A e(VvspC o.7%(WGR~Xen$#8y|ά/K !3hPͣ]=j-Q !"Fc!fD}OGjSrn/m u#b}.k o?* :Y"P?ESTM&s2'Mi_j]VntLsn[DDV)dS)'!~ָ(њñvU8l~'eDq6mF|+9>DQTo]. B8qԾ7{lJLu"`.,Lp:E˽ߝ IPwZdztC6CSִdq񶤥r7%c& D֭d}+x+C",%8n!U+rW C=OCiv*?.<|XkUS 3ߛO [YlED氀( tQh36[9E{tuNoFnU\ },R.1F+wm}=M 7(C*keXy $)d6;bsOXSswH$㳟Fu:>h]ͮ3fu;ĥ %r n"1%aQTnyGH* R iD@l0YٺZSR=(R~X>N}ՔslQj}k"5\˽4 W<%"I3RQ!d^,0Aj jWd9Y (EOf&(/N--FMjuda%m91F/}:*ͫ+ANT˺}x&M!dؓO鉄EVT@;qվ\!j {4O*a3ڊ<ˢU<&Da . J )ΟXXYd 7 A՟bI Ҧn&haw-cv{%]viZdW knZ'!TE}ZlWT6Io:)љ}Qe{ 9npdbw 5ԛpUxW3?½f㡋 u~2{A޷.XFfemwi)v?iGPL@Y#URgZOy^!f3 zVMҟtV2 M-7.I/YVY3_xWwWldrًtg5?4۵m@p*TU?1*+hi څB 5 vdrڣkt\}!0^aYSwr1SY&hQnjI!$yqV#a 3+q;  ԗe2r|{G>b< XU 1Ū+Vs;<7n+ [̝7~tkf9FFPdO;>S֦7 hk01 ˩1`Fi{h>5kYrQKSS&H1Bu*)|qu*YwŅiΊ|M\QMBx&oykEi樐vgzoP-9|S?ё=|"Y4Hf e/Ĺz}T*\vܠwYL*>2-PG@]9_6!xxԋ<1azrhpvS0cx2 DwZ&9oVǹ#NѸ ' |!v{xBܩ_fEQ%*قe?|!aruE&ϼ'*{c#\gט+-'`nqoJ@{&&ٍ( `)lv긿ʴF9 enA18j^M/0 fJ;g/[g/[a=X3YSTzwZBOBJ`Εr2`?úwg嵛ՉŐD Zi `,b% r *;qv^352dO)7f]?4" nYh&Fl8DiD@YE8|uv-gEp>UJ`:V8_ 9/>Bn6]Fy*ޕ0o)Ƨ֍lʡˬizEΩ)U9[ Qaq~1w僯F$RW xg!mZ(\j㑰m( &ܗ_#:{-^QH5)?PikBn?`]OfV aAE{ ny3!+) fǍ)RtճthK)yh-1.n֖Co)߹Rv M8mMAH7eZ$O10FfjPy944D'sKv?/KQQL2rFCr0oJkʟƑnB_fPMПLƭyud"#aE/``eIE+g:u8˵%&^ 1P:-IBV#U_ ֢QII肌?>"Hѻq-}̠c%I7u;K{vJ]|GhFx%V: ;XG S}ODg)9Ixy=u2Uu&'K_.?[rLp# q%ӿ#1)lT:$h^#%Џ,)dFzu{ىYlFOwh\^> J`,HfF*ˣٟRxآPy4Ko %y2pu>\XϏ @8>`O;< .Ц/GtJmV׭["?U8#V(G]뚍7k}Fo~~4D{uŁ{ɭ+֒VRM2w *IH{mqkٞ=W$R5vTb9hӉS~+4= YΞ0G:̻A!0H%=U [Y  `P7 u zQϣx L[9ҭPGs]ۍ38i9{b/#B>k$vMM!9orH\xr+ -Sz_,͝?Ka/9J`nɯ4S%F m|e{\1o{^ 퇖6-TդƾJMocיycٱOz2U ?\#!Y3c]&v^meyel|E]Vd&8)#uTy!Y9hvARZ/aQɥ۩THIf0LI|96!YFSk>H 6P(]|EH$Xudt >`UhGVw/\z \CeY`R߯@)}zmw*إ43Q~tIvWY,U6Y5.A}AE6O#^zP"нUjs>nQT3U~%2@A}Pb%Z+S YNsLeDE4 HkNK1ѯxZ cc?{:==O+Dy`W^ qWsdPtOHn:7^-x溥z?b_RΛ =&nzJz_\Z6}TڬAC<sн*%gV'W?8˹0Ht1boJ !C[S朥]r? Zd: glt3Ҿ{=3G唞K`EFAߔHƮCGF< aTVA d#;AQ DeFt?!=V ɪB=lfNۏR8f-0zT@G pIgj_N|G{a#.N}4Q#tcl~3$Ž. :r[B5ĔuĞLH#%XTy%f&`iPMݼ3Mv%CI +bg 5-u 8٘2IW$?[E^ OR /~it$K b||Q,)*3ta:QPc&)u2U-"lBTuZ'tS0<8+-MҲ |x3D;5lMEsnu#m$ }/NRz%tw BRto#k lKiUݞSf*IVļ4 ~Q ll M{u6偖7ο6Dd>ZTm.2"68)Lv@CԚᷜ1F]l\biYD I}[A `a{L5DӁ@;T5m >, 8xF [E #BчyY"v7 栉TmUՠhGiN3;Bxg(F0r9) ,> .i&DNzbSk*BOŰ\=ABkWNo6L[mq#i(PylTLos s}Qb56;cTqI}9/DO \4( :@1~,(?a3myn3Veb {xZle?m3/]9=tba++?JW- zaKh2Ŕ 6(e3Wv<&(i5i'rdbKzpwCEj1WG:چڂCeW-"M+m:P]Ku^#B 6,܉(Xm@$fz:Y8 yF朔D{ i^qKDQE7†'?kջrh){AFVs> k_lyCD͈tH9lW"&\d3os*(i_uNbxHmAHQ8axW3.c l":KB:Fz-8dxB n΢Whx+":q<Τx<[ OAm }k$ԯ9~a9J̓o1 MlMPqqO5W_=qmw)hUV`z"Lo3oHGI`+dpK/XCǥ{e7_GOHy pXy_^3 Gn UgZR>Z4cALyL)'4~7ҼJ5ʲ\_7 Bsu r^P6wr0s SA1`4. ʾWBAG1l I8UFI%oø]n 1Y]7[(漥h^!ڇ >usֲvkBDc;ۯfD}׷!fl`th*H?F'd-'%ϹNaWe=&I~?&nX3>gpN+*eUk\lLSůSByh%XɆEP1M.ʶgfCN) Io\'6㶶{~ͣdpF&N}<Ζ_΂ Dkީi^5ja~8wT*?7NXx*Wy"B_.&6༨0ǪwZ'C#4o6Λr аf V(23?6s)SStFW]!}gLunV_&_ߗD0B1nȊ@vD}&09b,r}-2k.[gNo$Fǹ)"V7?KpT!׆H)6|5~}>òGcг%9 X+@dE!XbM܈p~&Yzyde+3  hd_IO C{(6옞gwPSOǃήRbɇ)>gafJT|D"RGxi1<`Lu_uw:BeZzfڀ:氾;\(v`лC#x'Rގ':*$16U# E8ILtFf˳rwx] Coȹ6FQdmN@N Bnrp̷. X\>4)8@!ͅ>H,̏%9}nÏó:U2g-9X;y튙в$E JZFh[$ 8kg8.O&SD N~|0֍,tF7 ^PV@sg WkV gq-]Ƃ( b~}&nNJW %k}v_}/߽!A$-) 2\=ӟɨҜ1SSwEN $,ӷp|bx]+i)glL PFuʓԬ uAOHL|&{mRQQ7M}jrS~DPiCRJ})igESGUٟb:~F`t,]"[Kꈨdv't]C4X~.CV7eP8v6ԭS L5ߩaHfb1vK^YOgJxEPpjU+^2>N-!YyAX 6v,&ap ;DLG6=Zn {:h0%xfI5<1aqg)}WGQˇa)ujỄ5AIUkIDX.4IR^F7i[.\\Uajxc.,~I*eZlIqԒӹ']$|BSb~'̞SNz% 2J&~^ҁ2ݗ1%ĥMӨ JշH'*%rwQā瀟N}Z'EAς8ѰWу+]3v'3~l5ISEUgLс{o;%\jC[5vzԘ?p͓]S$v+60 mjh֨I \{=Xu*Z$4Ϝ n}uk ]{l$ 8_GLl>*€]5DXҬܚ"|J5/`n,^%U,/4[^OPA:;PBƧ"YXo+ச\`$=YX5ג6w$lVg99CԦOv2-| |7Nx֓.\C#(6]N2m'O<~z$ڏۻWzum8K u}d#ot=].@OG:*sY1q3Ȇ JT |\FRJ2ؙV]:lLZ&SkITA3p\~Ձ 0E\PIv?RFxyc ٠oDm7J׳i$hZc̳ 8w3Ū᳹WsB̼=Sh\0Zִ7Fb4tqj,qpg}`}^`҅(}Pm޹r,`8dw; g7Ga޶!CiAS4_Ť$ ߃CY(MrCOf4!\.RR;ahoBJxQl2o+e36%C .>, -IۯB}vZ8ᡂ\<`D 1+w}lKbPW Gf%10Y:\G-E ʶ9@x8i);(=sM s|))ý%RJ d7qL=Ђ)Q "r]~RqݷxqZˀF4v{1y ?-U `cFw.J!(A&q{D>]urQ&~# ~ NQ8x jL0HAtHUY;S۞9_LTƋvxW~;"聕U3Cs d7+!Fsx,e]n}I 뼪T ^1&r>7wŎ>kGS\g-].޲[_-#Im^v-MoӃT!ݶ%N K=ԈZ󸬓!&?5OP[*p!ǨvK4t2JKe͑Ywj[Q6-s2;VaL' WQS_1o3rC?"V$)j~>5PHol} ï4BI x:\IM y& "|*#&Z~]e;l>O4#n`j ;=\T!a$y;$ja[[o)9gn+ y'eڟ\l3=-;1[dL{ gtq`.—pBD5rA|@ < &/Il_L&΄hhr $pS" z!$:uR2s^UA Dx ,Ucǜ|+$9Y1W!QM7@4ωyIbqz Y8y?a.u逊{{jPM(_G8?] 7BUUoXgh{ 2fވHEU״vQKjwteE0݄^aNϝRp =qDQ\3M~;DyKr $(w%.n Ab<<"ofӥ$,0,8Mn~o}iSx8#Cu/8zYHUHC; 9*~&Bryv% oĮpESa#PwxS(C$]750|szE4,;j[Z&0pP-D%\4|U0ʝSh^*GHa岩?ꤜ{" @=I4!,3dc\<~$Fܧu*bdc4މW%<ѭmTD8];6ʡ4-,5 zޑ&t( B19:ȦwoJ] `w:8 ɣȥy Sɱ)R+'4SbyuU#I1*vwl`&_ IH=61 G;ՔQokLT&f5_wjW{ G.Lr9CkT lH;FO9xPY᲋%Xh1{Lto[.rb,'lZ)wjd$=G?ұ4wlW]0?@ 1 ̆5?kRN_.j"NIP7oKW܎So!ٌJ5j>Fd.!YȣPgeIax $L>fɠ ^sa Isǝ$'˲^?6c%Wkm搐- KK٠ɸ> ɾ[i u4hyG3kho obwǬ<_&خ`tƋ5T ]"Bq9\;O& FT 18I9LNWy|rO7emi"sTj6Ŋ_} {"ҁ9G㫐 EȄxl6YhHʀORy_NW'-ނb[_yf,72B8i)?ssmFѥ@wxqNi@- /BE>?;+3SDJ̗'/$=0iG>kMܟZTo?>گY\Te90i|QjO/EAJ w8&lJziFJRrFS!CC}&|ƒZX^6|o>L{?wP?^զ u x80#E.bw:EJ6,S $yҰ[C8lg AvlR1Y XA YC(O>3GD~CC#\*}Bַp0̫'"ld~Ys JMq>F|l"uW0cáh.oK+[kd]*ܨ'O݁ƊZ#E۝%3& .G2ddĭiR)փϿxiYz>=B5W![i@({l2멳xCKL%{KW*k+(|q8e=Iʧ|a)b.;@iLyyz2ZGd")γ\;0+6RJy_[ވTNtpUs+,z+?.+EDkoP )J3v>QٝAW:v3xnT];g`AP%u<\%EʔM( Q /`C#s{ Ko95ȹC΂4!W;(7ѥn\onC(yK%8>'I@W]e=g6F>BKrʝ#+]J֭Vaρo+ъSlK>Թb Hz'2eff353xQ7xu Ist!lc瀑YGg7O5eQӯ2Y:g\aY|NЛoYh%νqȐj'8 kNBF])4 c )ġ\Hg}, I.F:1 2u{С{bk=j,xb67iHUbG NMHaDJ(< ;?Ytj./hNNp9MVV1T19")4N-]_XoE}!Zq 8W1U^~7^ ǑLjέ(L[c| `8;>G#ki6:dZp{x5$aZ-MI^oĴ^`0D<92=]SU YO0L^㋁lRӣ1.[AG,_f]b=\?ȾsKA{jbviGocɚ4z'ɽMV_Kb_\zv$f=." X3ņ+lל+WZ*aP}oCdMOVHc1<Ó>>'QaK g.&ďЙp({nKÕ@2!71'iǞl PN4*FZ."R R[(.>ȴmOb1{ ]k%U4]|q[B'WOյW(ֵG =I1 UT,"nHR#9 q{_kh$f;DP$e $Z.f&^lHZ_?nvT_6DX|}  ΩpmqogяӞ,]KC|8NMi + PV;&fU؃Jm>:8TL)}H@uP;y5![Eze0\sC$|4'*V<KZJL(/4.7 eφ|^DY]Of$cՀK6MʰiUM',3 eA.O[9z8VexJcWzGSk3E}"q6,yA͐ LPw7;?/]ʧ",M}Jő.} fE[@vR,2M5,BFSVX]sŭ]UdL^l,'㏚Lf9\jQsz,"]ph2  T)5 k^PEMsk7]YwQD %ˣ>P?Vs'Iussux_Nq݅{/+o=7HiPՓIiփ鶄5R9x {Ib+|78 kP tBq9\04y0Y=q}yQy6.#'.u&94$4 AoX,oh)7RPiiVST,I^w)vrH:"ϛ7B*Ěڏ՗iFqoxfu;܄l*P<"I l(*4 ՠY̅yB>jKt&-RR.S*8h8T󇡇Lb``kdN'Nm<%ʻH!g~6,ݙW+?ӷs;( \Y9eRG[) > ,bpܼkTjw*=$1Ɵ'=du]1)g E$]8؁m_~ &_sui_}8&SDh7͈"!.nVS)(v0#mXuYCF\Kqr [*hX}%@s[%2Dc'lPV>p`0mS1~f {ӳ/k4 jm.TfauBZ14`3FfV D8cT0<. !Ɲ~g$&3q?w/ QNʊ|#"gWMNWKD_6+%p\{ )¬$S[- `{0ߞa>lj#KIN yA#OKѴYݰe~!paP$N | Obd+2* YM3DwvW)( yDTd|ae$Sbdm @\`^yyjhvpO.~;oӞjJffጮ;| 8 Jii)~/Z[b[rpꔓ,z!\ɖ 3fi.@lteY\PouX L ̿" =Q0^d_ Ȋ?<,ǝVR*] $ɐ8ʶ"ƛ\}8c>9~+qE jUvb.XӶ44𗧑lC2YסOM;!M/9mz_\6KA[\T'NqϞ,mȆ50_׍^Z*G clpO/ٜoC* i96ps%]GIQځ8ELCFiwy%F@}o@ſMS͹3Ɔ-%sSUYzmtB[1^xM0, ſ  U/zBڌ1GINb='#&r4y;4B{m^!}OU i*J". |XLdn#=h{9sZ\qHa[#<7k㍼\9XlrtfA|i#0ђFޯP3TeL@̅+߷}e M-FLx֭ޚDnE#4~w?Ž6.I& XM%.y!v*-:JkvB^r3D~;Al̀}<8uxRT&p &^{n+Q+#_QMM/;bU rMsÐܐ(gxlo[2=t˺xV޹]EIw]`?TYJj8 48k܄JlAXy\ a+ VŏAo;lp1V+7I)u햬SFW:ě7 C), VŤvM"̔v\rBITSѫH_PVTzqe.8$-I?:?Ϲ L J1NΕȋ;94lejQq{e'k$̼wf|^0&`!z[[=զ;җ yC4 kkE_L@u -%+ka-Ld'd/Aa\CG"[ &cّ |tI DAzOEWG^v_3gdϞ\VF/ź9&8LlQH~Xf=*'\€J?zHZˬF(BKVsڀzfE|dk_ o[D&LJg).  /8;Y-3aȐp d]? ۯoLM6fVZ07$$GY~S+=XB4g-i7VYLț.oǏg ZQcAC4dhrxi-YeEݡK.Wn1D敊M˿8WpPjf~1y.-Q%zi,8EAnqK-LUGthl-0 O@ gۡZ~dA~w[*ނ&.CmO[f,VS"ؿ ȯ3˹xX"TG*a4h-(vZX\P `x-Us]YF|0[=#~%|Ob|"S΃}ULaػ[v06IP9kmF@)mX,6ߺE 4/[1'܊aT6f*4s\5Nv^i ٟmo&,-Pa"fmaH ZhԊHi8eZA E-BGBl5u _"'\? )Str15BF"yPyw}#[~ͨ7@װH.؆QV,aU6RS~~^̓B`E1lLjΖ*o>1k iYlCtn~Xdz״db]=RWtpPvJׁ7Ϳ!4IxQCvu4E.hFVGϛbۢ`pA [7@ϩ0/ߜz ɠsIl}(/8>ʨs# hܽa7tʲܻ>cNTmuE\ɝoR>iKX-7G> {q8' M)wv=Ӵ $T@;JB Ly34VHqxU5\m&$^n"8x?sijՏ~{N\=+ Č񲫴^N=B_FR{-3o$ĩ}3W:]ҺJX)p`1篙UZӣ 7 Cbg!o=ܓ]|:n%žI+x7d#w\"᳕7j8{1OqW#/2%a9sh:$H5it32<!"2[ҫ_6 MU bit}s ^kJѫW6B%ַ2FWq ^v9L+ l瓣ڕ*M l5ݔ)Nx)=t AƤ;ESž}I D|7n aӠsډC#YU%q7g6fET$]rىB`؝Ayޗ)9zFQ]Bunn<}Iq%Ed -ښዛҜ}o^v:R+ڝIaŸ[s$ԡn௦$ǣD'45678$9:;<=>>??@ABCDDEFGGHIJJKLMNOOPPQRSTUVW XYZ[\]]^^_`abL.@4<==>?@ABCCDEFGHIJKKLMNOPQRRSTUVWXYYZ[\]^_``abcdefgghijklmnnoc@4<=>?@AABCDEFGHHIJKLMNOPPQRSTUVWWXYZ[\]^^_`abcdeefghijkllmnopd5=>.pqd6=>.pqe6>?.qrfo7?@.rrf7?@.rsf ӝ8@A.stg"8@A.stgA8AB.tuhiгpZRW\ai@9BCCDEFGHIJKKLMNOPQQRSTUVWXXYZ[\]^_``abcdefgghijklmnnopqrstuuhoq< Gu@9BCDEFGHHIJKLMNOOPQRSTUVVWXYZ[\]^^_`abcdeefghijkklmnopqrsstuvi:5CD=>?@@AB CDDEFFGGHHIJJKLMNNOPPQQRRSTTUUVVWXXYYZZ[[\]vwa 5bҪV+ C,CD.vwOXk?C,DE.wxPܐ=-EF.xyPc-EF.xyP)Q-FG.yzQ*.GG.yzQ.GH.z{R/HI.{|R1 /HI.{|R /IJ.|}S 0JK.|}SU 0JK.}~Tx ޑ1KL.~T ݐ1KL.~T߀ ۏ1LM.U{ނ ڎ2MM.U`ۀ܂݀ ؍2MN.V)ڃۀ ׌3NO.V׀؄ Ջ3NO.VPՀք׀ ӊ3OP.WԅՀ ҉4PQ.Wр҆ Ј4PQ.XMπІрΆ5QR.X;}Έ ͺi5QR;<==>?@ABCDEFFGHIJKLX(;>?@?:!=5RSTUVVWXYZ[\]^^_`abcdeefghijkklmnopqrsstuvwxyzz{|}~Y=6STTUVWXYZ[[\]^_`abccdefghiijklmnopqqrstuvwxxyz{|}~Y !""#$%&'()*+,,-./)KkӁǰoP-?рҀӁԁՂȉG PȀрҀӀԁՃցқY ^ЀрҀӀԀՂև֬i]ЀрҀӀԀՁփ׆l LπрҀԁՀւ׋Z;΀ЀҀӀՁցׂ؅قI+πрӀՁրׁ؋ف8g΀рӀԀց׀؃كڃف |πҀԀՀׁ؁يځـ̀рӀՀ׀؁كڂۂځـ*.΀ҀՀր؁فڈہڀـI JЀӀր׀فڃۀ܃ۀڀـpìрՀ׀ـځۇ܁ۀڀו v΀Ӏր؀ځۊ܀ۀـצ[πԀ؀ـہ܅݁܀ۀ؀> рրـۀ܉݀܀ڀc& Ҁ׀ڀ܁݄ހ݀ۀ@̀ Ԁـۀ݇ހ܀؀$̀Հڀ݁ނ߀ހڀֹq΀ ր ܀ޅ߀ۀ ՠG π ׀ ݀߁݀n π؀ ހ߂ހW Ѐـ߀ր Ѐ}ـݠy߀ր#e πA\ހ.ހ րԔ π Af݀ߕ$݀ Հ2t΀ a܀ޱ9ۀ ӥ'̀ռՀ<ڀ Dˀ Ӏhۀ?܀؀ ӳ Ҁ:ڀkۀ׀-HрԚہu܀ـՀn| πyTۀ؀Ԁү ΀ `ځ:ۀـ׀Ӏ;̀рGqـۢ ۀڀ؀Հ]oʀ Ѐ.Xفۉڀـ׀Ԁѝ ΀-Wـڀـ׀Հ-̀ЀFp؀ڡـ؀րԀL`ˀπ^؁8ـ؀׀ՀӀЊ΀Ѐw؀Rف؀׀րԀб̀πҗׁr؀׀րԀҀ ʀ΀Ѐ7ׁf؁׀րՀӀр!&̀πdւغ;؁ׁրՀԀҀB=ˀ΀ЀҸЀփ8ׁրՀԀҀр_Hɀ̀΀Ѐ[~Ղց3ׂցՀԀӀрkRˀ̀πЀ<^Ճ׊ƂցՁԀӀҀЀu\ɀˀ΀πЀ 9SԁՄt &ւՁԀӀҀЀ΀eʀ̀΀πЀҺsӁԃՂϑmփՁԁӀҀрπmɀˀ̀΀πЀрҁӂԐՂԀӁҀрЀ͒eʀˀ̀΀πЀр҂ӃԊՃԁӁҀрЀ͊\ʀ̀̀΀πЀс҂ӒԁӁҁрЀπRɀˀ̀̀΀πЁс҃ӋԄӁҁрЀπuIʀˀ̀̀΀πЁтғӂҁсЀπ΀j>ŀʀˀ̀̀΀ρЁуҍӃ҂рЁπ΀^&ɀʀˀ̀̀΁ρЂчҀӇ҂сЁπ΀̀A Àɀʀˀ̀̀΁ςЃю҃сЁπ΁̀"Ȁɀʀˀ̀́΁ςІу҇тЁπ΁̀Ȁɀʀˀ́̀΂σАуЁρ΀́ˮbȀɀʀˀ́́΂φЅцЂρ΁̀́0Ȁɀʀˁ́́΃ϑЃς΁̀́MȀɀʁˀ̂͂΅χІς΁́̀qȀɀʁˁ̂̓Βσ΁́́ˀ<ȀɁʁˁ̂ͅΉυ΃́́ˀ[ ȁɀʁ˂͓̃΃͂́ˁ}ȁɁʁ˃͉̅Ά͂̂ˁɨHÁȀɂʁ˄̔̓̂ˁʁiǀȁɁ˳ǁȁɀ-ǁȂʄyǁȁ ,89:;<==>??@ABBCDEFFGGHIJKKLMNOPQRSTTUVWWXYYZ[\]^_`abbcdeNǁBɄ8ABCDDEFGHIIJKLMNNOPQRSSTUVWXXYZ[\]^^_`abccdefghhijklmmnopqrrfiǂ@9BBCDEFGGHIJKLLMNOPQRRSTUVWWXYZ[\\]^_`aabcdefgghijkklmnopqqrsfƀǀ9BC4stfZÂ:CD4stg ŀ:CD4tuhI ǂ;DE4uuhvGHIIJKLMNNOPQRSSTUVWXXYZ[\]]^_`abbcdefghhijklmmnopqrrstuvwwxkJJ(/Mk@n?GHIJKLLMNOPQQRSTUVVWXYZ[\\]^_`aabcdeffghijkklmnoppqrstuuvwxyl&` n9HIBCCDDEFGHHIJKLLMMNNOPQRRSTUVVWXYZZ[[\\]^__`ayyb$D^m|x[= ,gn/II4yzQ `5RS4W `6RS4Xr ^6ST4X4~ ^7TT4X\~ \7TU4X]~ [7UV4Y2sZ7UV4Z&Qcr |F8VW@@ABCCDEFGHIJKLLMNOPZ ')*'=9VWXYZ[\\]^_`aabcdeffghijkklmnoppqrstuuvwxyz{{|}~Z=9WXYZZ[\]^__`abcdeefghijjklmnoopqrsttuvwxyyz{|}~~Z !"#$%&'()*+,,-./  +>Rds{~zlYE2$Inyz{|}}~~V- ,Ppwxyz{|}~b83Xrtuvwyz{|}~nC 2hqrtuvwxy{{}~E (aoqrstuwxyz{|}: Ynopqstuvwyz{|}~x/$Olmnoqrsuvwxy{|}~n$$"jklnopqstuvxyz{|~ U' hjkmnoqrsuvwxz{|}~ k &Fiklmopqrtuvxyz{}~ {&hjklnoprstuwxy{|}~ /(Cijkmnoqrsuvwyz{|~G(dijlmopqrtuvxyz|}~^*(hiklnopqstuwxz{|}i)Mhjklnoprsuvwyz{|~U. gijkmnoqrtuvxyz{}~>+1hijlmnpqrtuvxy{|}(*Thijlmopqstuwxy{|}~-ehiklmopqstuwxz{|~s ,ghiklmoprstvwxz{}~cI0ghiklnoprstvwyz{}~CJFghiklnoprsuvwyz{}~}J\ghiklnoprsuvwyz{}~NL eghiklnoprsuvwyz{}~}QZuY~/eghiklnoprsuvwyz{}~)=] !Y%eghiklnoprstvwyz{}~)Dk,eghiklmoprstvwxz{}~= Y~(b3efhijlmopqstuwxz{|~t +i~}(9efhijlmopqstuwxy{|}@ a,~}i@efgijlmnpqrtuvxy{|} 'K~}{Gdfgijkmnoqrtuvwyz{}~^ Q~|{@Ldfghjklnoprsuvwyz{|~In9}|{eGdeghiklmopqstuwxz{|}:\'~}{zyAdefhijlmopqrtuvxyz|}~+Kn~|{zx5 Z\\]^__`aabccA S[\]]^_``abbA K[\\]^^_``a@,9:;<==>?@ABBCDEEFGGHHIJKKLMNOPQQRSTTUVWXYZZ[\]]^^_``abLK@Z[\\]^^_`?9BCDDEFGGHIJJKLMMNOPQQRSTTUVWXXYZ[[\]^^_`abbcdeefghhijkllmnoocJ1Z[[\\]^^>:CCDEFFGHIIJKLLMNOPPQRSSTUVWWXYZZ[\]]^_`aabcddefgghijkklmnnopd !WZ[[\\]=:CD6ppd PYZ[[\<;DD6pqe ,UYZZ<;DE6qre 3WY;GH6stg=?GHIJJKLMMNOPPQRSTTUVWWXYZ[[\]^^_`aabcdeefghhijkllmnoopqrrstug=?HIIJKLLMNOOPQRSSTUVVWXYZZ[\]]^_``abcddefgghijkklmnnopqqrsttuh:HICDEFGHIJKLLMMNNOOPPQQRRSTUVWXYZ[\]^_uv`"&)*)" /IJ6vvN  !#$&'(*+,-./0110( 0IJ6vwO "#%&()*,-./1223210, 0JK6wwO !"$%'()+,./023454310/-(1JK6wxP) !"$%'(*+-./12456765321/.,+(1KL6xxP* !"$%'(*+-./12456765321/.,+)1LL6xyP!"$%'()+,./023454310/-,+)1LM6yyP !"#%&()*,-.0123220/.-+*)2MM6yzQ !#$&'(*+,-./01 0/.-,+)(2MN6z{Q  !"$%&')*+,-./0//..-,+*('3NN6z{R !#$%&')*++,--.--,+*)('&3NO6{|R "#$%&'()*+,++**)('&%3OO6{|R !"#$%&''())* ))(''&%$3OP6|}S  "##$%&&''( ''&&%$#"4PQ6}}S  !"##$%%& %%$##"!5PQ6}~T  !""##$ ##""! 5QR6~~T  !!"! 5QR6~T  5RS6T 6RS6U  6ST6U  7TT6V  7TU6V   7UU6V   7UVAABCDEFGHIJKLMNOPV=8VVWXYZZ[\]]^_``abcddefgghijkklmnnopqqrsttuvwxxyz{{|}~W=8VWXYYZ[\\]^__`abccdeffghiijklmmnoppqrsstuvwwxyzz{|}~~W !"#$%&'()*+,-.ih32 B    fͰi  _i FӍQ  ѓ%$ؗ gl]MہBt  ~Z+  8:́t=oG΅ Չ́t 8Z++]MہBt,56Z_(<>ACEHJLOQSVXZ]_adfhkmo=.q?.s =A.t%PI=4+;jBEGILNPSUWZ\^acehjloqtvV\#3D.w 5F.y G.{ I.|J.~ L.N. bO._Q. #+,(SUWZ\^acehjloqsvxz}    TíX  LրجX  7؀ػD  {قؙ ڂض݀׺  zހ נ ! EZ# NAߪ:e  TL% rm  ܙ 1(ӫd 1 \҄^= x Ҫc ѵ  ؕ / J$ nM@֢7a#$Ԃ + ҀӀԀ  ц  πЄ ̿q σЀˎ =́΀πK ˀ̆ sʝACFHJLOQSUXZ\^acegilnpreC4tD4v)F4w$ 6U0)#(GgGJLNPSUWY\^`begikmprtvy;kv{^A#oI4zar%K4|zL4}VN4O4Q4uR4@T4>wU4 WY[^`bdgikmprtvx{} .Scsyk]6  (Zux{~n7tw{~x*lorvy|bYmptw{~u jnqux|Nkorvy}vgkosvz~c!hloswz~5hloswz~}2+|{*Iw+hkosvz~/ P@ 8gkorvy}j "t=gjnqux|gYE ~{3fimptw{O>) w}zD)ehlorvydVB {xf cgjnqtwzva }zvr beilorux+F}zwtqLdgjmpsvq-&nf#=}{xuro-behknqtvy{} ~|zxuspm _cfilnqsvxz{}~ ~~|{ywuspnk  :adfilnpsuvxyz{ zywvtrpmkh [adfiknoqsuvwwx wvutsqomkh` /_adfhjlnpqrst srqonljheE C^acegiklnoop onmljigeb# N^`bdfhijkllm llkjigedb_ O]_abD\^_BDFHJLNQSUWY[]_acegikmo4Y\D6q?E6rF6tHJLNPRTVXZ\^`cegikmoqsu !%#I6v #'+/2541 K6x #'+/3541-)L6y "&),/00.+(N6{  #&)+*(%O6|  "$&%#!P6~  ! R6 S6 U6VXZ\^`bdfikmoqsuwy{}il32E   *hk, #D׉7!wrM> <ޏ! V_<f~݂8 '? 'օ'?2e}܂$>NW2B44'0 P1(ą+9<>ADGIMORUX[^M;8.c l:.dGNNMQj8>@BDGILNPRUWY[a kׂ03.U 4.W /6.X @ݏ8.Z ֋9.\ %VM;;<>?@ABDEFGIJK]  !#$%&()*+-.  !SѽY# l׀t /ـٹ- Pۀ_42)ؽdIS*Um-\!6s 6ҷ$Tj,лAI}&-($ Ҁ!Ѐ̽ k΂˃7ʳ&Ȅ.>ACFIKNQSVY\^aP(>4f Iq?4h04557G{n=CEGJLNPRTWY\^_d  H[!74X eg84Y f:4[ )b<4\ |^=4^8_rtuwwq3>ABCDEFHIJKLMOP_   "#$%&')*+,-.   +[n}vf4 7rx|HVpuzy-mrw}9[nsy~intyuintyx/b=cJ#hnsy~4M'gmrw|g%\}?fkpuzd$Z{g dinsx1Ex}xt Zgkpul&S}.O}yuq:dhmqux{~|yuqm ^eimqtwy{|{ywtqmi (aeilortvwvtrpmi_ Fadhjmopqpomkhe> X`cYDEFGFEDCA?H^?/?ADGIKNPSUXZ\_N+:>6d @6e>DFHJLNPRTVXZ\^`  $*/4.76V $*/43.96W "&*-,):6X !$%%#;6Y  =6[ >BCDEFGHIJKLMOP] !"#$%&'()+,-is32n--2{{.UăGE˅2>qƀ OG >q8T<#· zCGJORIF-L؀B.N e=7:.Uefd&+-/2468- !! $`Ȗd! =ۢ7 1ڦ% gѱ5cfV}Dա1ί4_*9.͢ieBEJMPJH/4?4QEdmk8=?ADFHKDD94>I<4?8BDC!.13579;-  -Px~[7 .t~e  Tvd jvl"G`5= itKy.[]od=T}p>iqx}~{ulZhnrttqlO Z98@BDGIKC&/.%6;! &6>/13578:,t8mk@+SxxS+<}ݶ}<&yy&kk33## kk77]]&&GGpp__;; [[33SSjj %%EE FFOOzz55AAMMYYeennZdBX*L?3zx6J TCr'XXXXXXXXXXXoXXnXXmXXlXX_XX X-XdXXXXXwXeXUXCXXZXXXXXXX;XcX^XIX4XXXX.XXXaX pX *3:X/@NSWZ^oX ;S\bcccdddX8PZ`bcccddddfX(:IPSWZ^abccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddccccba^ZWSPI:( #*3:BJNRUY\_abbbbcccccccddddddddddddddddddddddddddddddddddddddddddddddddddcccccccbbbba_\YURNJB:3*#  '/7?FILNOQRTVWYZ\]_abbbbbbbbbbbccccccccccccccccccccccbbbbbbbbbbba_]\ZYWVTRQONLIF?7/'  !%(,/37:>AEHLMMNNOOPPQQRRSSTTTUVVVVVVUTTTSSRRQQPPOONNMMLHEA>:73/,(%!   !"$%%'()*+,-./0110/.-,+*)('%%$"!   h8mk ?ss?OOMM--TT``::qq~~""rr9?#!jsm WV3ddh"8HXddddddddddddddddddddddddddddddXH8" !%*-26:>CC>:62-*%! l8mk %% \\ II==XY44PPJV:XX%XXXnXdXXiXX`XXDjX(8FLPUY]bddddddb]YUPLF8( s8mk``!!,- &*.2662.*&teeworlds-0.6.2+dfsg/other/icons/Teeworlds_srv.ico0000644000175000017500000031614412140200333021235 0ustar felixfelix Of (O00 %$X  } t hPNG  IHDR\rfO]IDATx]մ'TPl.qO\AE[QTE!AEQQKe9ﶽi;~io圓4 D-".@!RB8@1B0FH!B 0K%KbT?P@"Z,5dH˶K>~ֲ'K-ە,Jup2X:S:".X {XZ (-bi&4 =QSeD0P/ aFH, M)ci!4B5K[S]%$dԔT(8<&6KR]!$u? Yjuu%KcXzm. 9,E,ah bs@!2tKR] ?,e hBh h~ڠh,^BڶX!`YYؾsګmwj۝V5KR]C7FIE%ѨnHhjŒqeg=n_C+߱+Fl]X?lb-8x0fdpADH@wY?VBqԤc^)|t[%XkSF H~hG d(a1~`tUB&C "p܁{XAHEоE-thUYj\B쌮v Q\Y+ Z3_?,eۿzCK" :FHAxOTޮi o),w J/zZf02`朥̝wtn @4yy…vR]ENUes`""yf۹+0f\t!lgu40 G14B~ܐm기Q8#QM\"ww$^#/'_-^ua<҃,!q&K@3.˔qTT+堕r<5lܲ >]1 VQ,M !/?++;75Ccu(.yi 1oƫ`C@n_~ܬ !$3Ŀ…=KZaPjyuûEޗX+/3;_c;E#x@l?B0.KXj&E eӏm@4V|:iP~7*i@ao}a]Y:e8_c/7Gc2vsYUVvX\o 6Rg<;4lݾ<0v go4wQkV(ڍ?Cs zIp%Y؎P\1?w>jfL.AMń мt ^7\0ǑZz^Sߍ;S2vǂl*KÇ3e&ͮ><8 58Ѡ`u^X0hqBX^{C,SBk [o.FLAA' 6ok`5Q O~~8rN_,O/1@8{}G_2%CB&= *(@MswrQ\ɋ뺲DW9$Dyr(U;v߸/&7;ƺ.>hQp@Uд;)>Ր~ B}! 8.I,ypl?v/.IBA$g;+`'rT_Km,y߿v($pA ya1өK@7B=X`Pbh-Ls Z粻ue{(7d9[; *}r?!`!|sIHd C qGY韻$Q P>KgO;`s/"r:p&>tiBmY nQ[g)Թqk4"EY[O_Vo8/@R񍓋h)m)/o:9Y P j-[[Yvpea- F.trQ! KYzAerW,Cs`V}0Sb߿.o͆mvkuֱt"ACL&ZpLԯ |vpEF}-U+ay2J%"Ewpd<\~+@vob e3H.?N.Jd*\[_r\]LP$kIBt,l΁## 2Pȣ(/h)vpEHѯT/H52(7 9'm1D2UZm'-ߥEQ7Vۋ Ab.B3%rkΪ<)gJ5++ Fr_ւ˔Fѕ"Ի 8%VAfwK7oоF=zA)pKCT =GUzHUrGeKЍ/5pMo\Nr_toCc|CX_U8U f^WZ灯TNH!F,m<@")J,oG[| ϗy噸gt֟l/TBґP_YE~~Y_0mk WE F`spiH@PVn^}l>~:{3EAXzA@~'Oo9ֆݫ3_l"э>[|IЂM|UC֫UB: ?<4HzUeHl7QO}]N_VH=_7\Tcip2@+.3Z}} AIBD(;/_Ey U0 gim$ JB~I:/hYKg6g_/Ď:? E4uNIA:leZ*<MTA)Nc~ Yd|2Dy3_Ć;D@ .PNҍ<߲2~O\ j * gJ'ZF,7b{Xx ym+FN0K'~ H7Z_UlQ!mȯ+dj@;Ų*MЭ$%0eN,#T[|7O5 QAW@[:-NPű=׊VC AU?i>XBw@d{m='vQaشu7#c۔#ZUx_ʷW/eGg lvy&wGtŇ_}6^ !_^| @69hu+ M`'k 1KOFWW ŧuRX{Pha~4%6nGyfO?ࡏ1]ńi!MUpPHE2lm15}E2tSJgBޏXzw,4[;ꄆ4b*.1썩pXx5n߅ ѥ1(]13]}=hylب4[,OE0(ӝ?0S~U}W)lwEFy .U1UKdp9m(MJ##xŪurecKt7 `0kFࠆ,)'&W e =}A@GJk](=vkנR6i|7V>Lf309%e3NkO\, eC> >R|F* yL3U{2V\z{8EZ jWĴ7EjNV?# k:1ྷ[ӹ)ƽp 7q<DƏxq=ST&TF* `KdB,e!eH #щ*O:ӥZv5,7=7j*n?OhE&HhqcecChy\Uq}\Wh, ^ x!4 qs0 p&R_j- B\f=â?QRi,-U b+kSn\i  j/l_hYSDӗނ=q2:3薧7ZOѓC[{ǎ<({Pa;Y;~ٸ8jj#Sh_Ԫ-zh\_/nX{&?O9_Fk(c؛pR io|eKYd±ASQFՊ܋:]a=*KS:p*@iO⵵e\w7A>k>姊'G^ rYV9O3;+i^MB* FS!ÿЗg#<< ],3_v4p*҂d[> Q%R>66BݕY Fy";?? Boʕ.b]mF`gs+ aBتE@]U;<;.ހ L&C2!a>* JA>O=*2v@Y7Ť~5KWOc i[b+(wƆ9Ob9 #pN%ϓ+r9IiA,=heƐL>a.U] K2Yo41 KVn RuCw{}7sycm͆-yҝ0mt⑊(O?vjK̚47f+#7_KXMA]E>8s~jH`3l0}կy Ԡps !)(֟1׶KXf$L,%i-InrG3i ||k r [ ?tt=H$7?؈Ɂmc?$uIe5Vqi Ai`"Kgʄ޻ RJ@BYUd2o~M. Hloyaݷrʾ=1_/_ú{cG"׏d"; ~GA-oArY&X`$XMeL89/~O jW1euY|5GGʥomqtץb=5OVU"9pK˄yZJS PrN%)xnIIrpkiG`F)A3^LHEaCncTzX W_EFj@I27>fu-ڷj)tN^|MrVڽTa7)2vEJ- ȣ ?_& }!Vf8Qư_wdעC#,xfqnbMtZΉg8rЂ׺ɓY69FVϠ K_˄z3O.b@->WFr^IƜwӣcgRnFDf~,Nt[z+<6Jɵ/ה%v `KɄ{{\4`/9'7@Ӿ%r/;D~<T*/,tf,?<|2t=Ǿ >`,Z8plKbDmF*B !'܇*J~_8xկ/_FN?׻ .shgvâK@gu N&I8-~} zEbՐ47goz.GyiO9-b-Y`} FTe<:7MeUHK\BI$^f/NFs A3$AԻ r; נEZU`A2x4 ~xi- S~ z~yM)@@e46?vA,P~*D ߥЧQxK,kG3C_ ^!vS|þ'h%(Fyo.[iItiWvP(^G쇉Xk{mg UeV݌:Z>g]mI, )Vڟ~݀V(}LkٿDIC {oNl`)x߯xpƍ?_3:kY e@˸!RAVV m߱>IXɄ^ZW`Dy8~9`On=XNe-!Ϻ=1e3I+>8iEcVEW* ͢A<`+@g9%)7/Oe:m%+ 1o_Gu˟ĥw w\ ;R Fwˢ=m;]93NGcQAݗhH]#!@*]5E8@sFbRWxvHP~㾐[vIC|[̊݀{$A@OYy>4/'zCAVʄ{_Uk >\/G+VdOA աBN?,|+/E'-+>8l*+l"Yq޳o-O~R 4T"'uZdn-=h-$ 0)ּUUF9BŨf[FodݢvꝠ^8 7;V~e@{oJ3>h@隚N҉>g"ScjE..sٽGGi_Nmꃫ<ݟV>ZtQ>U|[}yʯo漿WoGT+E7LGu* TK&/i݅AvM88$\ mO=8eُHppսJ](+[r,U`þ;`9'5|]@fT1V1E4tdH+|kTc(+r~߁>+`>z~t򧧎k.?bۻ Z (_~VT,lj%Vƭ{j<ȃ4KE4tڗ*e* *w\<yp-ؐGKKU\ӣx xNl|xޏ W~U^j!IGr,Kl(~,j\ؼMdM v (xeB:dj؀ V/EOYsWåc\69㮊Mŋ;y#fbg3V1fKsX**)'):V.\jBO|/dtCThQ 'HGB5*G}هX;ᝏgؾU=|r+b#^dݹǟ6.Ω6K:L "X#gi`iSh]uv`_p}L.E0mPzx+1瓅2)xi!=Oi ^"m$*LPU'vL Nay"Z㼃Hz9`U )h5:-[oɬiKxh.1ZѸJx: ,DpzCgCny"k@=_(zO] fQ&AMB$ЈoO+-HDrIB#ؑȉYO.kΧ`k`u*Dc+ڡ%Ư1Dz>s[#‡3eFL!U#pUP`UX[oЏIGPRKSEҥ[~x(_wJ'뙫x~," Џ]n+J,pź )oA\+MA7!S  z+#ߗ.ȒAcV]$h`=SGAU:]5!Qtkty~Aߘ|w|H4z Sv:68_w\ jd5WKJ\?yxٝɜ!XY SV7n=Sr|;;( {HZì$)qt+G>w[exǀ+eCJn ߁@޽Uī. -r,3קu7(T9- ` l?ot*WI8 q? gbՕi6~WqP$]51?!~TfQ6i -,GΓTzN)d2.vl{>wNIq@:t1`[!Ӆꊝ_d|(v 7`<5hs'R8ft MpEP@ J'9řiף?ߩ殮W Um~"ho~K:-wҕ2oR14W`je<@DJ@{_Fc|c rSLGdiLhʥ*[ʝ](_E}cm _\y ;"!1}_/XBױI9c,V@aQObj=^dy}H?E"uxN(4H(S~؞D yEeG5٠Vh)@Tj~;Uw9ud`s?HdFMVsD=؉J*0k6E, }v7Jel[b[[Y pd眞7؜B{lN)Z&We݆Jj6@J3)gM*DP@ =i@Ji}/'U PtK$?8 *X 60zG*r2K|]"@C:+]. 喂??߉,y26./( ɹ$OF*ߵ_f(+H/y(qP؁_F92Ag`)By8%iJ6~9y91ȳ9TTzkؚpӖ⼻gTc zafP,_U[00ѦPnzLYU{LY.|Su p|whҏ h" 0{ mcj|duptiAIM a#\\X)H_DlM~2P9X>\srَoaϾ^2!w Ky_\%ׂ} ~.=؍pZQSi9rcNM~㽾X+1&ZmcL(c:6Ѧ O:6\9|?^yfS"sZ˔zhx a?;Qp߅B+E1{2~'oHR*엌֓4ZT (Y ~nc}w(KU E?MgTB(T #|~6Jgf5w{2YM "s<w|>o˶!ܑmK.8h,O"V@M ~e)l[r/]~H%KFJc>wz^HLΡL#ЈIX{?>/`I1\)i gCB5GwĺiE,' x28J''N. 2Uk0+AJᾈqE7*[\Yo5/bQ~=MYi- n͋D,ϖsT63ZU6ϭ?y/o],!*/hӆ(gĴ`: 1%jJrO"SzXi,l3F}FS9򟃓g"boL! [*|sRX QYl!݂!5M&pB*?/;Űiam^YdJϳfȉ230@).Y-(QA 5ȇ{"`锉2,P2{F%6kpq`4`b[-{%#q_c妳u4D xa,~F D+(3͆l7!,IW( n$I)Yd dZexP){ilݖN>! /2ʳ |zW4A7A|[2O915Z3F[XzJE=&yfT7 "-T*NH [[Ɉ@ܝ77z~*447F ó|4 `I~Crj&lMS"kfyG3Y"xiR]$H%l *P  ._ ѩ=Y<̘y@v2Ba\x-)hP#G\@h!d2:?)5^ 0c hFk0G\JuqSdL3zn N{j&t?m A`Jd f".hE2(I@F+M:X7mV:DB#@&5mY+UQrWߴ@ K5bAc KE\{mV̈́A(!d6:w EK-eՅ`1G7@&ӘBCXMJBУy1S0fE+-W(!|kIGno+vcΟ;0%" 7\+ `˹(4I(SH]'[&*pPK߶qѺ8:W$j'*_$j V\߬Y@@[s 'K`P\K 2@G\Z?{9@~5kCd<1 XhHqObӢMPM{o Ġ} vVu:Vທh)zBdO`'NN{xeB fֿ)wC N}f0x^;' `)SH ĶҜJD+WJ}h^/WwfV>Qŭ]G@汲_@Fw7u~ \2vs\P~Q]/n+@я^=jY&$LFp V&5§\Q*ވ)8i/|mb OeZf] ^~!J MLsXR}@L=G HՕ_ҭ ZV'<+@Wq ޞ ":XZ!10*?7IiK4X$@μdt~‹݉oUx5 Ȭs?@xë|hJ%$̆b.@j,LE-=uN^/S3Օ0 '3T# EXcb qZ 8!} `Kg//c OpT=XŕBd8 `KD D{R @W]9D7 ~b8`DMKNj=!7t+KDߋ j8>lcKA{+Bh޻k˦5fm ||mc0C[JpBlD OsdBGe;j˘Vxըסfo}ӆZҟ {J {z^ZҔUD0σݐ@xkwNoJ^ ފcF% \TBtE#L[sdx}c~*?Ad$3v[0`K.wR! 00Ma; g,uz!;fqi@?N'@jL%Z6@f3{%tnWhv{C-8v6W٨Ƕe0\oϗ=@H3*|/ V0i&p]2{ Luc0=sGǎ|.bt\3m$b9g**1֧^ϩ\fگYzB7w'`v)'akM$ 91XR0KX!XDqcLym{a1޶yl?m?Į}pBKgqbQHV}[bQ Y'/1-f5hlfF ElW? N`Uvճb[}?'h>FhEWTSM9bzy a !$6gϨyfB(=/ϑ~s;A]WvR\Cʱl)Q`h ayʢe8䊑/Uzl(\"rV(W<4l[s(.bz[@21pLw6+X_`>˜xOpfb?gye`k#XSS|3+W$|4 e.RX"ՕYg#*XlN !B.H eaUX*Rqhomy.*SMh ѬSQ!Bd0FW%HniA.B!FR K5'35nAB3 ՅF8u"D" ,R%]"Gy,^E3׈1(7R Yz$Յ VHRr%@#)Y!B /ϒXXKX AuboT|c l 4 vd[J.BA!?/7>{zyߐp#7pSGn&2Ww2AHEXB%M0D!q#$!cn0OVIENDB`(    !"$%%'()*+,-./0110/.-,+*)('%%$"!   !%(,/37:>AEHLMMNNOOPPQQRRSSTTTUVVVVVVUTTTSSRRQQPPOONNMMLHEA>:73/,(%!  '/7?FILNOQRTVWYZ\]_abbbbbbbbbbbccccccccccccccccccccccbbbbbbbbbbba_]\ZYWVTRQONLIF?7/'  #*3:BJNRUY\_abbbbcccccccddddddddddddddddddddddddddddddddddddddddddddddddddcccccccbbbba_\YURNJB:3*# (:IPSWZ^abccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddccccba^ZWSPI:(8PZ`bcccddddfX ;S\bcccdddX/@NSWZ^o     ! ! !! !" !"!""!"#!"#!##"#$"#$##$#$$#$%$$%$$%$%&$%&%%&%%&%&'&&'&&'&&'&'(''(''('')(()(()(()))*))*))*))+**+**+**++*,++,++-++-,+-,,--,.-,.--..-/.-/.-/..//X *3:896VWSWXTXYTYZUYZVZ[W[\X\]Y\^Z]_[^_[_`\_a]`b^ac_bd`ceacebdfcegcfhdfiegjfhjgikhilijmiknjlokmolmpmnqnoropspptqqtqrursvsswttxuuyvvywwzxw{xx|yy}zz~{z~|{}|~}~~WZYX p (';)>)>)>)>*?*?*?*?*?*?*@*@*@*@*@*@*@*@*@*@*@*?':!895VVRVWSWXTXYUYZVZ[VZ\W[\X\]Y]^Z]_[^`\_a]`a^`b^ac_bd`ceadfbdfcegdfhegiegjfhkgikhjlikmjknklokmplnpmnqnoropspqtqqurrussvstwttxuuyvvzww{xx{yx|zy}zz~{{|{}|~}~WZYXa&;Q}c r  | Fi785UVQVWRA@;A@;BA;BADC>DD>DD?ED?ED?EE?FE@FE@FF@FFAGFAGFAGGBGGBHGBHHBHHCIHCIHCIIDIIDJIDJIDJJEJJEKJEKKFKKFKKGLKGLLGLLGLMHMMHMMHMMIMNINNINNINOJOOJOOJOOKPPKPPKPPLVZXX2Ms   Z775UUQUVR64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.VZXX]~  [774TUPUVQ64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.VYXX.\~ \774TTPTUQ64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.VXWX4P~ ^673STOTTP64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.UXWXr  ^663RSNSTO64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.UXVX)   `563RRNSSO64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.TXVX4>`  !!""""""""!!! `552QRMRSN64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.~TWVXIP{  !""##$$$$$$$##""! b552QQMRRM64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.~~TWUX^[  !"##$%%&&&&&&&%%$##"!b551PQLQRM64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.}~TVUXc\  "##$%&&''(((((''&&%$#"d441PPKQQL64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.}~}SVTX;Ox !"#$%&''())*****))(''&%$d341OOKPPL64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.|~}SVTX8U "#$%&'()*+++,,,++**)('&%e330OOJOPK64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.{}|~RUTX !#$%&')*++,--...--,+*)('&f330NNJOOK64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.{||}RUSX f !"$%&')*+,-.///0//..-,+*('f33/NNINOJ64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.z~|{}RTSXX 1 !#$&'(*+,-./0111110/.-,+)(g22/MMHNNI64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.z~{{|QTRX W!"#%&()*,-.0123333220/.-+*)g22/MMHMMI64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.y}{z~|QTRXZp!"$%'()+,./02345554310/-,+)g11.LLGMMH64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.y}zy}{PSRXy !"$%'(*+-./12456765321/.,+)h11.LKGLLG64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.x|yy}zPSQXC j !"$%'(*+-./12456765321/.,+(9Q11-KKFLLG64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.x|yx|zPRQXU Cc!"$%'()+,./02345554310/-(Y10-JJEKKF64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.w{xx|yPRPXeY "#%&()*,-./122333210,f +=00-JJEKKF64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.wzxw{yORPXw  DC>DD>ED?FE@FF@FFAGFBHGBHHBHHCIIDJJDJJEJJFKKFLLGLLGMMHMMHNNINNJOOJOPKPPLPPLQQLQRMRRNRSNSTOTTPTTPTUQUVQVVRVWRVXSWXTXXTXYUXZUYZVZ[VZ[WZ\X[\X\]Y\^Y\^Z]^Z^_[^_[^`\_a]uyvvyw`baXJoJq(< /GMukn??9HGBIHCIIDJJEKKFLLGLLHMMHNNIOOJOPKPQLQQMRRNSSOSTOTUPUVQVVRVWSWXTXYUYZVZ[VZ\W[\X\]Y]^Z]_[^`\_a]`a^`b^ac_bd`ceadfbdfcegdfhegiegjfhkgikhjlikmjknklokmplnpmnqnoropspqtqqurrussvstwttxuuyvhliXdEiwgYJp;Z6R9W=\@aEi^|n?>9GGBHHCIICJIDJJEKKFLLGMMHMNINNJOOKPPKPQLQRMRSNSSOTTPTUQUVQVWRWXSWXTXYUYZVZ[W[\X[]X\]Y]^Z^_[^`\_a]`b^ab_ac`bd`ceadfbegcehdfhegifhjghkgilhjmikmjlnklolmpmnqnornoropspqtqrurrvsswttwuuxugkhX-+An>=8GFAHGB64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.swttxugkhX "n==8FF@GFA64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.svstwtfjgX r=<8FE@FFA64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.rvsswtfigX_v ;:<<7ED?FE@64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.rursvsfifXIo3WY;<;7ED?EE@64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.qurrurfhfXl ,UYZZ<;:6DC>ED?64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.qtqrurehfXZPYZ[[\<;:6DC=DD>64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.pspqtqegeXm!WZ[[\\]=:95CB=DC>64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.pspptqdfdXi1Z[[\\]^^>:94CBED?FE@FFAGGAHGBIHCIIDJJEKKFLLGLLHMMHNNIOOJPPKPQLQRMRRNSSOSTPTUPUVQVWRWWSWXTXYUYZVZ[WZ\W[\X\]Y]^Z]_[^`\_a]`a^ab^ac_bd`ceadfbdgcegdfhegiegjfhkgikhjlikmjknklolmplnqmnqnoropspdfdXn.@Z[\\]^^_`?984BAED?FE@GFAGGBHHCIICJIDJJEKKFLLGMMHMNINNJOOKPPKQQLQRMRSNSSOTTPTUQUVRVWRWXSXXTXYUYZVZ[W[\X[]Y\^Y]^Z^_[^`\_a]`b^ac_bc`bd`ceadfbegcehdfhegifhjghkgilhjmikmjlnklolmpmnqnornorocfcXy K[\\]^^_``a@,,'984:95;:6<;7=<8==8>=8?>9??:??;@@BB>CC?DD?EE@EFAFFBGGCGGDHHDHIEIJFJKGKKGKLHLMIMNJNOJOOKOOLOPMPQNQROQSORTPSTPTUQTVRUWSVWTWXUWYVWYWXZWY[WZ\XZ]Y[^Z\^[]^\]_]^`]^a^_b^`b_`c`adabebLNLXo-DS[\]]^_``abbAXZ\\]^__`aabccAX'W\]]^_`aabccdeYCCCCDDEEEEEEEFFFFFFFFFFFFFEEEEEEDDDCCCBBAAA@@@?>>> $XXXXXXXXXXrHnO\]^^_`abbcddeffghhiiijjkkkllllllmmmmllllllkkkjjjiihhggfeedccbaa`_1i}E\]^_``abcddeffghhiijjkklllmmmmnnnnnnnnnnnmmmmllkkkjjiihggfeedcbba`O 6\]^_`abbcdeefghhiijkkllmmmnnnoooooooooooooonnnnmmllkkjjiihggfeddcba` $CT<[&\]^_`abccdefgghiijkkllmmnnooopppppqqqqqqpppppoooonnmmllkjjiihgffedcba,[sq[]^_`abcdeefghiijkklmmnnoopppqqqqrrrrrrrrrrrqqqqppooonmmllkjjihggfedcbK V]^_`abcdefgghijjklmmnnooppqqrrrssssssttsssssssrrrqqppoonnmllkjiihgfedcb 60I=]^_`abcdefghiijkllmnooppqqrrsssttttuuuuuuuuuttttssrrrqppoonmmlkjjihgfeed&MaJzb]^_`abcdefghijjklmnnoppqqrsstttuuuvvvvvvvvvvvvuuuuttssrrqqpoonmllkjihggfeDxF^_`abcdefghijkllmnoopqrrssttuuvvvwwwwwxxxxxwwwwwvvuuuttsrrqpponnmlkjiihgfW^_`abcdefghijklmnnopqqrsstuuvvwwwxxxyyyyyyyyyyxxxxwwvvuuttsrrqpoonmlkjiihge O_`abcdefghijklmnoopqrsstuuvvwwxxyyyzzzzzzzzzzzzzyyyxxwwvuuttsrqqponmlkjjihg"+&:$^`abcdefghijklmnoppqrstuuvvwxxyyzzz{{{{||||||{{{{{zzyyyxwwvuutssrqponmllkjih!AR>^T_`bcdefghijklmnopqrrstuvvwxxyzz{{{|||}}}}}}}}}}||||{{zzyyxwwvuutsrqpoonmlkii0^v3Io._`abcefghijklmnopqrsttuvwxxyzz{{||}}}~~~~~~~~~~}}|||{{zyyxwvvutsrqpoonmkji6j?*R}W`abcdeghijklmnopqrstuuvwxyyz{{|}}~~~~~}}||{{zyxxwvutsrqpoomlkj^ gijkmnoqrtuvxyz{}~>cv[Mhjklnoprsuvwyz{|~U v(hiklnopqstuwxz{|}i idijlmopqrtuvxyz|}~^ ;JqCijkmnoqrsuvwyz{|~Gp;_.Fhjklnoprstuwxy{|}~/IW_p%Fiklmopqrtuvxyz{}~{*2pG  |hjkmnoqrsuvwxz{|}~k G&"gjklnopqstuvxyz{|~U&+6Olmnoqrsuvwxy{|}~n$8B;JYnopqstuvwyz{|}~x/IW](L^aoqrstuwxyz{|}:Zk]72]shqrtuvwxy{{}~El 7k 3^tXrtuvwyz{|}~nCi} k ,PbPpwxyz{|}~b8Yi  $?MInyz{|}}~~V-GU #)2+K[>kRds{~zlYEo2P_-6#3 !" 3kk&yy&<}}<+SxxS+??????(0`  !%*-26:>CC>:62-*%! "8HXddddddddddddddddddddddddddddddXH8"3ddhV #+++,,,,,( VWSXYUZ[W\^Z^`\`b^bdadgcfieikhkmjmploroqtqsvsuxvw{xy}z{}}>_ w UUQ64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64. @b STO64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64. u !!! RRN64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.  "$&&&%#!PQL64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.~  #&)+++*(%OOJ64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.|~W V"&),/00.+(NNI64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.{|  z #'+/3541-)LLG64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.y}{m a #'+/2541r %5KKF64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.x|ys ;Vkv!%#{^A\##3oIID64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.vzw 6PU0I)=#4+(;GjgHGBJJELLGNNIPPLRSNTUPVWSXYUZ\W\^Z^`\`b^ceaegcgieikhkmjmploroqtqsvtuyvj )=FFA64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.twt!?ED?64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.rvse4Y\DC=64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.64.qtq#(D\^_BAFFAHHCJJELLHNOJQQLSSOUUQWXSYZV[\X]^Z_a]ac_ceaegdgifilhknkmpmoros O]_ab N^`bdfhijkllmmmllkjigedb_ 9=ZC^acegiklnooppppponmljigeb#K_?q/_adfhjlnpqrstttttsrqonljheE   [adfiknoqsuvwwxxxwvutsqomkh`:adfilnpsuvxyz{{{{{zywvtrpmkh _cfilnqsvxz{}~~~|{ywuspnk $5-behknqtvy{}~|zxuspm+6+Ldgjmpsvq-M]&@Mnf#7B=at}{xuro#,  beilorux+JZ$+ Fn}zwtqcgjnqtwz va/8}zvr)ehlorvydVBct{xf r \3fimptw{O>^o)=Gw}zDx r"(:=gjnqux|gYEdt~{1=" 8gkorvy} j"18t~ T~+hkosvz~/LZ%+ Pr@m ~ hloswz~}2N]+AM|{*:BIetw q Eghloswz~5Zlq zgkosvz~c :Nkorvy}v :`% jnqux|$` Ymptw{~u {lorvy|b T 7F[qtw{~x*DQ T- (L_Zux{~n7Xi -M .TfScsyk]6Xi  MO      O?ss????( @  (8FLPUY]bddddddb]YUPLF8(Dj         !" "#!#$#$%$%&%&'&')((*))+*+,+,---..X %8V _rtuwwq3M>>;BA;CBED?FE@GFAHHBIIDJJEKKFLLGMMIOOJPPK]_]X` |^==964.64.64.64.64.64.64.64.64.64.64.64.64.64.[^\X)@!$%%#b;<864.64.64.64.64.64.64.64.64.64.64.64.64.64.Y\ZXi/"&*-,)f::664.64.64.64.64.64.64.64.64.64.64.64.64.64.X[XX e$*/43.g98464.64.64.64.64.64.64.64.64.64.64.64.64.64.WYWXd  Hk$*/4.[!077364.64.64.64.64.64.64.64.64.64.64.64.64.64.VXUXn0G4N5N5M7QGj{n>=8DC>FE@HGBJJDLLGNNIPPLRRNTTPVWRXYUZ\W\^Y^_[`daX Il q@?:64.64.64.64.64.64.64.64.64.64.64.64.64.64.ehdX(;+:>>864.64.64.64.64.64.64.64.64.64.64.64.64.64.dfcX%(H^?/.+?>9AAGFAIIDKKGNNIPQMSSOUVRXYUZ\X\^[_a^NPMX7P X`cYDEFGGGFEDCA?&1XX kFadhjmopqqqpomkhe> !0(aeilortvwwwvtrpmi_ $4 ^eimqtwy{|||{ywtqmi ':J-B:dhmqux{~|yuqm(4VP,>Zgkpul&ANS}.IWO}}yuq&2P4$2dinsx1TeEj}x}xt $4'fkpuz 'd$6?Z{g  \'gmrw|!'g%6?\}?s *<#hnsy~4UfMm~-8 dintyx/IVb=S_cJX)<intyu!Y4M[nsy~2> !Pw-mrw}9_r=/DVpuzy-7 = #7lrx|HtI !*+Sh[n}vf4Yk#, I \      \ %% ??(0    Cq  @)>?` Pz R{ T} T} Fi/0-A@GFAIHCKJEMMHOOJQQLSSOfif Z687264.64.64.64.64.64.64.64.64.64.VWS-;TQ`984<;7?>:BA=DE@GGCJJGLMJOQMRTQUWS Y Ycgjlnonmkhd,f {EdimqsuvvtrnjM)<$cinswz|}}{xupg )5MHhnskkmzzup+7,?^krx }-5zl %&tgnujlb~S  nU|ipwxw 3`w o 6LjqxCk<\l;R]\y*4Kojqx*N_ !1qPpw~V &6Y|ku|:aw !"/L'0;IJAAAAAAAAAAAAAAAAAAAAAAAA(  &*.2662.*& .8UBeDfCd!&/.+11-33/552774896:;8,-- -Io! &?>Dg&/.%9B64.64.64.64.64.64.64.;>; Eedmk%8=>=7@?:BAiqx}~{ul.<1G]od4>=_qT}p*8 itK}y.DO[!gjvl"5>Gcq`5f!1E Tvd%2=U.t~e7G $2-`{Px~[7d{ !. ` !- !- `AAAAAAAAAAAAAAAAteeworlds-0.6.2+dfsg/other/icons/teeworlds_cl.rc0000644000175000017500000000003112140200333020674 0ustar felixfelix50h ICON "teeworlds.ico" teeworlds-0.6.2+dfsg/other/icons/teeworlds_gcc.rc0000644000175000017500000000003012140200333021031 0ustar felixfelixID ICON "teeworlds.ico" teeworlds-0.6.2+dfsg/other/icons/teeworlds_srv_cl.rc0000644000175000017500000000003512140200333021572 0ustar felixfelix50h ICON "Teeworlds_srv.ico" teeworlds-0.6.2+dfsg/other/icons/teeworlds_srv_gcc.rc0000644000175000017500000000003412140200333021727 0ustar felixfelixID ICON "Teeworlds_srv.ico" teeworlds-0.6.2+dfsg/other/sdl/0000755000175000017500000000000012141202226015341 5ustar felixfelixteeworlds-0.6.2+dfsg/other/sdl/sdl.lua0000644000175000017500000000451212140200333016624 0ustar felixfelixSDL = { basepath = PathDir(ModuleFilename()), OptFind = function (name, required) local check = function(option, settings) option.value = false option.use_sdlconfig = false option.use_winlib = 0 option.use_osxframework = false option.lib_path = nil if ExecuteSilent("sdl-config") > 0 and ExecuteSilent("sdl-config --cflags") == 0 then option.value = true option.use_sdlconfig = true end if platform == "win32" then option.value = true option.use_winlib = 32 elseif platform == "win64" then option.value = true option.use_winlib = 64 end if platform == "macosx" then option.value = true option.use_osxframework = true option.use_sdlconfig = false end end local apply = function(option, settings) if option.use_sdlconfig == true then settings.cc.flags:Add("`sdl-config --cflags`") settings.link.flags:Add("`sdl-config --libs`") end if option.use_osxframework == true then client_settings.link.frameworks:Add("SDL") client_settings.cc.includes:Add("/Library/Frameworks/SDL.framework/Headers") end if option.use_winlib > 0 then settings.cc.includes:Add(SDL.basepath .. "/include") if option.use_winlib == 32 then settings.link.libpath:Add(SDL.basepath .. "/lib32") else settings.link.libpath:Add(SDL.basepath .. "/lib64") end settings.link.libs:Add("SDL") settings.link.libs:Add("SDLmain") end end local save = function(option, output) output:option(option, "value") output:option(option, "use_sdlconfig") output:option(option, "use_winlib") output:option(option, "use_osxframework") end local display = function(option) if option.value == true then if option.use_sdlconfig == true then return "using sdl-config" end if option.use_winlib == 32 then return "using supplied win32 libraries" end if option.use_winlib == 64 then return "using supplied win64 libraries" end if option.use_osxframework == true then return "using osx framework" end return "using unknown method" else if option.required then return "not found (required)" else return "not found (optional)" end end end local o = MakeOption(name, 0, check, save, display) o.Apply = apply o.include_path = nil o.lib_path = nil o.required = required return o end } teeworlds-0.6.2+dfsg/other/sdl/sdlnotes.txt0000644000175000017500000000026212140200333017731 0ustar felixfelixNOTE. This is a really stripped down version of SDL only used to compile teeworlds for windows. For a complete release of SDL, please visit their site at http://www.libsdl.org.teeworlds-0.6.2+dfsg/readme.txt0000644000175000017500000000054412140200333015433 0ustar felixfelixCopyright (c) 2012 Magnus Auvinen 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. Please visit http://www.teeworlds.com for up-to-date information about the game, including new versions, custom maps and much more. teeworlds-0.6.2+dfsg/scripts/0000755000175000017500000000000012140200333015121 5ustar felixfelixteeworlds-0.6.2+dfsg/scripts/SDL_keysym.h0000644000175000017500000001577012140200333017327 0ustar felixfelix/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2006 Sam Lantinga 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 Sam Lantinga slouken@libsdl.org */ #ifndef _SDL_keysym_h #define _SDL_keysym_h /* What we really want is a mapping of every raw key on the keyboard. To support international keyboards, we use the range 0xA1 - 0xFF as international virtual keycodes. We'll follow in the footsteps of X11... The names of the keys */ typedef enum { /* The keyboard syms have been cleverly chosen to map to ASCII */ SDLK_UNKNOWN = 0, SDLK_FIRST = 0, SDLK_BACKSPACE = 8, SDLK_TAB = 9, SDLK_CLEAR = 12, SDLK_RETURN = 13, SDLK_PAUSE = 19, SDLK_ESCAPE = 27, SDLK_SPACE = 32, SDLK_EXCLAIM = 33, SDLK_QUOTEDBL = 34, SDLK_HASH = 35, SDLK_DOLLAR = 36, SDLK_AMPERSAND = 38, SDLK_QUOTE = 39, SDLK_LEFTPAREN = 40, SDLK_RIGHTPAREN = 41, SDLK_ASTERISK = 42, SDLK_PLUS = 43, SDLK_COMMA = 44, SDLK_MINUS = 45, SDLK_PERIOD = 46, SDLK_SLASH = 47, SDLK_0 = 48, SDLK_1 = 49, SDLK_2 = 50, SDLK_3 = 51, SDLK_4 = 52, SDLK_5 = 53, SDLK_6 = 54, SDLK_7 = 55, SDLK_8 = 56, SDLK_9 = 57, SDLK_COLON = 58, SDLK_SEMICOLON = 59, SDLK_LESS = 60, SDLK_EQUALS = 61, SDLK_GREATER = 62, SDLK_QUESTION = 63, SDLK_AT = 64, /* Skip uppercase letters */ SDLK_LEFTBRACKET = 91, SDLK_BACKSLASH = 92, SDLK_RIGHTBRACKET = 93, SDLK_CARET = 94, SDLK_UNDERSCORE = 95, SDLK_BACKQUOTE = 96, SDLK_a = 97, SDLK_b = 98, SDLK_c = 99, SDLK_d = 100, SDLK_e = 101, SDLK_f = 102, SDLK_g = 103, SDLK_h = 104, SDLK_i = 105, SDLK_j = 106, SDLK_k = 107, SDLK_l = 108, SDLK_m = 109, SDLK_n = 110, SDLK_o = 111, SDLK_p = 112, SDLK_q = 113, SDLK_r = 114, SDLK_s = 115, SDLK_t = 116, SDLK_u = 117, SDLK_v = 118, SDLK_w = 119, SDLK_x = 120, SDLK_y = 121, SDLK_z = 122, SDLK_DELETE = 127, /* End of ASCII mapped keysyms */ /* International keyboard syms */ SDLK_WORLD_0 = 160, /* 0xA0 */ SDLK_WORLD_1 = 161, SDLK_WORLD_2 = 162, SDLK_WORLD_3 = 163, SDLK_WORLD_4 = 164, SDLK_WORLD_5 = 165, SDLK_WORLD_6 = 166, SDLK_WORLD_7 = 167, SDLK_WORLD_8 = 168, SDLK_WORLD_9 = 169, SDLK_WORLD_10 = 170, SDLK_WORLD_11 = 171, SDLK_WORLD_12 = 172, SDLK_WORLD_13 = 173, SDLK_WORLD_14 = 174, SDLK_WORLD_15 = 175, SDLK_WORLD_16 = 176, SDLK_WORLD_17 = 177, SDLK_WORLD_18 = 178, SDLK_WORLD_19 = 179, SDLK_WORLD_20 = 180, SDLK_WORLD_21 = 181, SDLK_WORLD_22 = 182, SDLK_WORLD_23 = 183, SDLK_WORLD_24 = 184, SDLK_WORLD_25 = 185, SDLK_WORLD_26 = 186, SDLK_WORLD_27 = 187, SDLK_WORLD_28 = 188, SDLK_WORLD_29 = 189, SDLK_WORLD_30 = 190, SDLK_WORLD_31 = 191, SDLK_WORLD_32 = 192, SDLK_WORLD_33 = 193, SDLK_WORLD_34 = 194, SDLK_WORLD_35 = 195, SDLK_WORLD_36 = 196, SDLK_WORLD_37 = 197, SDLK_WORLD_38 = 198, SDLK_WORLD_39 = 199, SDLK_WORLD_40 = 200, SDLK_WORLD_41 = 201, SDLK_WORLD_42 = 202, SDLK_WORLD_43 = 203, SDLK_WORLD_44 = 204, SDLK_WORLD_45 = 205, SDLK_WORLD_46 = 206, SDLK_WORLD_47 = 207, SDLK_WORLD_48 = 208, SDLK_WORLD_49 = 209, SDLK_WORLD_50 = 210, SDLK_WORLD_51 = 211, SDLK_WORLD_52 = 212, SDLK_WORLD_53 = 213, SDLK_WORLD_54 = 214, SDLK_WORLD_55 = 215, SDLK_WORLD_56 = 216, SDLK_WORLD_57 = 217, SDLK_WORLD_58 = 218, SDLK_WORLD_59 = 219, SDLK_WORLD_60 = 220, SDLK_WORLD_61 = 221, SDLK_WORLD_62 = 222, SDLK_WORLD_63 = 223, SDLK_WORLD_64 = 224, SDLK_WORLD_65 = 225, SDLK_WORLD_66 = 226, SDLK_WORLD_67 = 227, SDLK_WORLD_68 = 228, SDLK_WORLD_69 = 229, SDLK_WORLD_70 = 230, SDLK_WORLD_71 = 231, SDLK_WORLD_72 = 232, SDLK_WORLD_73 = 233, SDLK_WORLD_74 = 234, SDLK_WORLD_75 = 235, SDLK_WORLD_76 = 236, SDLK_WORLD_77 = 237, SDLK_WORLD_78 = 238, SDLK_WORLD_79 = 239, SDLK_WORLD_80 = 240, SDLK_WORLD_81 = 241, SDLK_WORLD_82 = 242, SDLK_WORLD_83 = 243, SDLK_WORLD_84 = 244, SDLK_WORLD_85 = 245, SDLK_WORLD_86 = 246, SDLK_WORLD_87 = 247, SDLK_WORLD_88 = 248, SDLK_WORLD_89 = 249, SDLK_WORLD_90 = 250, SDLK_WORLD_91 = 251, SDLK_WORLD_92 = 252, SDLK_WORLD_93 = 253, SDLK_WORLD_94 = 254, SDLK_WORLD_95 = 255, /* 0xFF */ /* Numeric keypad */ SDLK_KP0 = 256, SDLK_KP1 = 257, SDLK_KP2 = 258, SDLK_KP3 = 259, SDLK_KP4 = 260, SDLK_KP5 = 261, SDLK_KP6 = 262, SDLK_KP7 = 263, SDLK_KP8 = 264, SDLK_KP9 = 265, SDLK_KP_PERIOD = 266, SDLK_KP_DIVIDE = 267, SDLK_KP_MULTIPLY = 268, SDLK_KP_MINUS = 269, SDLK_KP_PLUS = 270, SDLK_KP_ENTER = 271, SDLK_KP_EQUALS = 272, /* Arrows + Home/End pad */ SDLK_UP = 273, SDLK_DOWN = 274, SDLK_RIGHT = 275, SDLK_LEFT = 276, SDLK_INSERT = 277, SDLK_HOME = 278, SDLK_END = 279, SDLK_PAGEUP = 280, SDLK_PAGEDOWN = 281, /* Function keys */ SDLK_F1 = 282, SDLK_F2 = 283, SDLK_F3 = 284, SDLK_F4 = 285, SDLK_F5 = 286, SDLK_F6 = 287, SDLK_F7 = 288, SDLK_F8 = 289, SDLK_F9 = 290, SDLK_F10 = 291, SDLK_F11 = 292, SDLK_F12 = 293, SDLK_F13 = 294, SDLK_F14 = 295, SDLK_F15 = 296, /* Key state modifier keys */ SDLK_NUMLOCK = 300, SDLK_CAPSLOCK = 301, SDLK_SCROLLOCK = 302, SDLK_RSHIFT = 303, SDLK_LSHIFT = 304, SDLK_RCTRL = 305, SDLK_LCTRL = 306, SDLK_RALT = 307, SDLK_LALT = 308, SDLK_RMETA = 309, SDLK_LMETA = 310, SDLK_LSUPER = 311, /* Left "Windows" key */ SDLK_RSUPER = 312, /* Right "Windows" key */ SDLK_MODE = 313, /* "Alt Gr" key */ SDLK_COMPOSE = 314, /* Multi-key compose key */ /* Miscellaneous function keys */ SDLK_HELP = 315, SDLK_PRINT = 316, SDLK_SYSREQ = 317, SDLK_BREAK = 318, SDLK_MENU = 319, SDLK_POWER = 320, /* Power Macintosh power key */ SDLK_EURO = 321, /* Some european keyboards */ SDLK_UNDO = 322, /* Atari keyboard has Undo */ /* Add any other keys here */ SDLK_LAST } SDLKey; /* Enumeration of valid key mods (possibly OR'd together) */ typedef enum { KMOD_NONE = 0x0000, KMOD_LSHIFT= 0x0001, KMOD_RSHIFT= 0x0002, KMOD_LCTRL = 0x0040, KMOD_RCTRL = 0x0080, KMOD_LALT = 0x0100, KMOD_RALT = 0x0200, KMOD_LMETA = 0x0400, KMOD_RMETA = 0x0800, KMOD_NUM = 0x1000, KMOD_CAPS = 0x2000, KMOD_MODE = 0x4000, KMOD_RESERVED = 0x8000 } SDLMod; #define KMOD_CTRL (KMOD_LCTRL|KMOD_RCTRL) #define KMOD_SHIFT (KMOD_LSHIFT|KMOD_RSHIFT) #define KMOD_ALT (KMOD_LALT|KMOD_RALT) #define KMOD_META (KMOD_LMETA|KMOD_RMETA) #endif /* _SDL_keysym_h */ teeworlds-0.6.2+dfsg/scripts/build.py0000644000175000017500000002062512140200333016577 0ustar felixfeliximport imp, optparse, os, re, shutil, sys, zipfile from optparse import OptionParser if sys.version_info[0] == 2: import urllib url_lib = urllib elif sys.version_info[0] == 3: import urllib.request url_lib = urllib.request match = re.search('(.*)/', sys.argv[0]) if match != None: os.chdir(match.group(1)) os.chdir('../') url_bam = "http://github.com/matricks/bam/zipball/master" url_teeworlds = "http://github.com/teeworlds/teeworlds/zipball/master" release_type = "server_release client_release" arguments = OptionParser() arguments.add_option("-b", "--url_bam", dest = "url_bam") arguments.add_option("-t", "--url_teeworlds", dest = "url_teeworlds") arguments.add_option("-r", "--release_type", dest = "release_type") (options, arguments) = arguments.parse_args() if options.url_bam == None: options.url_bam = url_bam if options.url_teeworlds == None: options.url_teeworlds = url_teeworlds if options.release_type == None: options.release_type = release_type bam = options.url_bam[7:].split("/") version_bam = re.search(r"\d\.\d\.\d", bam[len(bam)-1]) if version_bam: version_bam = version_bam.group(0) else: version_bam = "trunk" teeworlds = options.url_teeworlds[7:].split("/") version_teeworlds = re.search(r"\d\.\d\.\d", teeworlds[len(teeworlds)-1]) if version_teeworlds: version_teeworlds = version_teeworlds.group(0) else: version_teeworlds = "trunk" bam_execution_path = "" if version_bam < "0.3.0": bam_execution_path = "src%s" % os.sep name = "teeworlds" flag_clean = True flag_download = True flag_unpack = True flag_build_bam = True flag_build_teeworlds = True flag_make_release = True if os.name == "nt": platform = "win32" else: # get name osname = os.popen("uname").readline().strip().lower() if osname == "darwin": osname = "osx" # get arch machine = os.popen("uname -m").readline().strip().lower() arch = "unknown" if machine[0] == "i" and machine[2:] == "86": arch = "x86" elif machine == "x86_64": arch = "x86_64" elif "power" in machine.lower(): arch = "ppc" platform = osname + "_" + arch print("%s-%s-%s" % (name, version_teeworlds, platform)) root_dir = os.getcwd() + os.sep work_dir = root_dir + "scripts/work" def fetch_file(url): try: print("trying %s" % url) real_url = url_lib.urlopen(url).geturl() local = real_url.split("/") local = local[len(local)-1].split("?") local = local[0] url_lib.urlretrieve(real_url, local) return local except: return False def unzip(filename, where): try: z = zipfile.ZipFile(filename, "r") except: return False list = "\n" for name in z.namelist(): list += "%s\n" % name try: os.makedirs(where+"/"+os.path.dirname(name)) except: pass try: f = open(where+"/"+name, "wb") f.write(z.read(name)) f.close() except: pass z.close() directory = "[^/\n]*?/" part_1 = "(?<=\n)" part_2 = "[^/\n]+(?=\n)" regular_expression = r"%s%s" % (part_1, part_2) main_directory = re.search(regular_expression, list) while main_directory == None: part_1 += directory regular_expression = r"%s%s" % (part_1, part_2) main_directory = re.search(regular_expression, list) main_directory = re.search(r".*/", "./%s" % main_directory.group(0)) return main_directory.group(0) def bail(reason): print(reason) os.chdir(work_dir) sys.exit(-1) def clean(): print("*** cleaning ***") try: shutil.rmtree(work_dir) except: pass def file_exists(file): try: open(file).close() return True except: return False; def search_object(directory, object): directory = os.listdir(directory) for entry in directory: match = re.search(object, entry) if match != None: return entry # clean if flag_clean: clean() # make dir try: os.mkdir(work_dir) except: pass # change dir os.chdir(work_dir) # download if flag_download: print("*** downloading bam source package ***") src_package_bam = fetch_file(options.url_bam) if src_package_bam: if version_bam == 'trunk': version = re.search(r"-[^-]*?([^-]*?)\.[^.]*$", src_package_bam) if version: version_bam = version.group(1) else: bail("couldn't find bam source package and couldn't download it") print("*** downloading %s source package ***" % name) src_package_teeworlds = fetch_file(options.url_teeworlds) if src_package_teeworlds: if version_teeworlds == 'trunk': version = re.search(r"-[^-]*?([^-]*?)\.[^.]*$", src_package_teeworlds) if version: version_teeworlds = version.group(1) else: bail("couldn't find %s source package and couldn't download it" % name) # unpack if flag_unpack: print("*** unpacking source ***") if hasattr(locals(), 'src_package_bam') == False: src_package_bam = search_object(work_dir, r"bam.*?\.") if not src_package_bam: bail("couldn't find bam source package") src_dir_bam = unzip(src_package_bam, ".") if not src_dir_bam: bail("couldn't unpack bam source package") if hasattr(locals(), 'src_package_teeworlds') == False: src_package_teeworlds = search_object(work_dir, r"teeworlds.*?\.") if not src_package_bam: bail("couldn't find %s source package" % name) src_dir_teeworlds = unzip(src_package_teeworlds, ".") if not src_dir_teeworlds: bail("couldn't unpack %s source package" % name) # build bam if flag_build_bam: print("*** building bam ***") os.chdir("%s/%s" % (work_dir, src_dir_bam)) if os.name == "nt": bam_compiled = False compiler_bam = ["cl", "gcc"] for compiler in compiler_bam: if compiler == "cl": os.system("make_win32_msvc.bat") elif compiler == "gcc": os.system("make_win32_mingw.bat") if file_exists("%sbam.exe" % bam_execution_path) == True: bam_compiled = True break if bam_compiled == False: bail("failed to build bam") else: os.system("sh make_unix.sh") if file_exists("%sbam" % bam_execution_path) == False: bail("failed to build bam") os.chdir(work_dir) # build the game if flag_build_teeworlds: print("*** building %s ***" % name) if hasattr(locals(), 'src_dir_bam') == False: src_dir_bam = search_object(work_dir, r"bam[^\.]*$") + os.sep if src_dir_bam: directory = src_dir_bam + bam_execution_path file = r"bam" if os.name == "nt": file += r"\.exe" if not search_object(directory, file): bail("couldn't find bam") else: bail("couldn't find bam") if hasattr(locals(), 'src_dir_teeworlds') == False: src_dir_teeworlds = search_object(work_dir, r"teeworlds[^\.]*$") if not src_dir_teeworlds: bail("couldn't find %s source" % name) command = 1 if os.name == "nt": file = open("build.bat", "wb") content = "@echo off\n" content += "@REM check if we already have the tools in the environment\n" content += "if exist \"%VCINSTALLDIR%\" (\ngoto compile\n)\n" content += "@REM Check for Visual Studio\n" content += "if exist \"%VS100COMNTOOLS%\" (\nset VSPATH=\"%VS100COMNTOOLS%\"\ngoto set_env\n)\n" content += "if exist \"%VS90COMNTOOLS%\" (\nset VSPATH=\"%VS90COMNTOOLS%\"\ngoto set_env\n)\n" content += "if exist \"%VS80COMNTOOLS%\" (\nset VSPATH=\"%VS80COMNTOOLS%\"\ngoto set_env\n)\n\n" content += "echo You need Microsoft Visual Studio 8, 9 or 10 installed\n" content += "exit\n" content += "@ setup the environment\n" content += ":set_env\n" content += "call %VSPATH%vsvars32.bat\n\n" content += ":compile\n" content += 'cd %s\n"%s\\%s%sbam" config\n"%s\\%s%sbam" %s' % (src_dir_teeworlds, work_dir, src_dir_bam, bam_execution_path, work_dir, src_dir_bam, bam_execution_path, options.release_type) file.write(content.encode()) file.close() command = os.system("build.bat") else: os.chdir(src_dir_teeworlds) command = os.system("%s/%s%sbam %s" % (work_dir, src_dir_bam, bam_execution_path, options.release_type)) if command != 0: bail("failed to build %s" % name) os.chdir(work_dir) # make release if flag_make_release: print("*** making release ***") if hasattr(locals(), 'src_dir_teeworlds') == False: src_dir_teeworlds = search_object(work_dir, r"teeworlds[^\.]*$") if not src_dir_teeworlds: bail("couldn't find %s source" % name) os.chdir(src_dir_teeworlds) command = '"%s/%s/scripts/make_release.py" %s %s' % (work_dir, src_dir_teeworlds, version_teeworlds, platform) if os.name != "nt": command = "python %s" % command if os.system(command) != 0: bail("failed to make a relase of %s" % name) final_output = "FAIL" for f in os.listdir("."): if version_teeworlds in f and platform in f and name in f and (".zip" in f or ".tar.gz" in f): final_output = f os.chdir(work_dir) shutil.copy("%s/%s" % (src_dir_teeworlds, final_output), "../"+final_output) os.chdir(root_dir) clean() print("*** all done ***") teeworlds-0.6.2+dfsg/scripts/check_header_guards.py0000644000175000017500000000141512140200333021426 0ustar felixfeliximport os PATH = "../src/" def check_file(filename): file = open(filename) while 1: line = file.readline() if len(line) == 0: break if line[0] == "/" or line[0] == "*" or line[0] == "\r" or line[0] == "\n" or line[0] == "\t": continue if line[:7] == "#ifndef": hg = "#ifndef " + ("_".join(filename.split(PATH)[1].split("/"))[:-2]).upper() + "_H" if line[:-1] != hg: print "Wrong header guard in " + filename else: print "Missing header guard in " + filename break file.close() def check_dir(dir): list = os.listdir(dir) for file in list: if os.path.isdir(dir+file): if file != "external" and file != "generated": check_dir(dir+file+"/") elif file[-2:] == ".h" and file != "keynames.h": check_file(dir+file) check_dir(PATH) teeworlds-0.6.2+dfsg/scripts/cmd5.py0000644000175000017500000000204712140200333016326 0ustar felixfeliximport hashlib, sys, re alphanum = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_".encode() def cstrip(lines): d = "".encode() for l in lines: l = re.sub("#.*".encode(), "".encode(), l) l = re.sub("//.*".encode(), "".encode(), l) d += l + " ".encode() d = re.sub("\/\*.*?\*/".encode(), "".encode(), d) # remove /* */ comments d = d.replace("\t".encode(), " ".encode()) # tab to space d = re.sub(" *".encode(), " ".encode(), d) # remove double spaces d = re.sub("".encode(), "".encode(), d) # remove /* */ comments d = d.strip() # this eats up cases like 'n {' i = 1 while i < len(d)-2: if d[i:i + 1] == " ".encode(): if not (d[i - 1:i] in alphanum and d[i+1:i + 2] in alphanum): d = d[:i] + d[i + 1:] i += 1 return d f = "".encode() for filename in sys.argv[1:]: f += cstrip([l.strip() for l in open(filename, "rb")]) hash = hashlib.md5(f).hexdigest().lower()[16:] #TODO 0.7: improve nethash creation if hash == "3dc531e4296de555": hash = "626fce9a778df4d4" print('#define GAME_NETVERSION_HASH "%s"' % hash) teeworlds-0.6.2+dfsg/scripts/compiler.py0000755000175000017500000003733012140200333017316 0ustar felixfelix#!/usr/bin/python import sys import struct import os option_ptrsize = struct.calcsize("P") option_intsize = struct.calcsize("l") option_floatsize = struct.calcsize("f") option_inttype = "long" option_floattype = "float" class node: def __init__(self): self.values = [] self.children = [] self.parent = 0 def name(self): if len(self.values): return self.values[0] return "" def debug_print(self, level): print (" "*level) + " ".join(self.values), if len(self.children): print "{" for c in self.children: c.debug_print(level+1) print (" "*level)+"}" else: print "" def debug_root(self): for c in self.children: c.debug_print(0) # TODO: should return list of items in the tree, def gather(self, str): def recurse(parts, path, node): if not len(parts): r = {} path = path + "." + node.values[0] r = [node] #print "found", path return r l = [] for c in node.children: if parts[0] == "*" or c.values[0] == parts[0]: if len(node.values): if len(path): l += recurse(parts[1:], path+"."+node.values[0], c) else: l += recurse(parts[1:], node.values[0], c) else: l += recurse(parts[1:], path, c) return l parts = str.split(".") return recurse(parts, "", self) def find_node(self, str): parts = str.split(".") node = self for part in parts: if len(part) == 0: continue if part == "parent": node = node.parent else: found = 0 for c in node.children: if part == c.values[0]: node = c found = 1 break if node == self: return return node def get_single(self, str): parts = str.split("@") index = -1 if len(parts) == 2: index = int(parts[1]) node = self if len(parts[0]): node = self.find_node(parts[0]) if not node: print "failed to get", str return Null if index == -1: return node.get_path()[1:] return node.values[index] def get_path(self): if self.parent == 0: return "" return self.parent.get_path() + "." + self.values[0] def get_single_name(self, str): return self.get_path()[1:] + "." + str class parser: lines = [] def parse_node(self, this_node): while len(self.lines): line = self.lines.pop(0) # grab line fields = line.strip().split() # TODO: improve this to handle strings with spaces if not len(fields): continue if fields[-1] == '{': new_node = node() new_node.parent = this_node new_node.values = fields[:-1] this_node.children += [new_node] self.parse_node(new_node) elif fields[-1] == '}': break else: new_node = node() new_node.parent = this_node new_node.values = fields this_node.children += [new_node] def parse_file(self, filename): self.lines = file(filename).readlines() n = node() self.parse_node(n) return n def parse_file(filename): return parser().parse_file(filename) class pointer: def __init__(self, index, target): self.index = index self.target = target class data_constructor: def __init__(self): self.data = "" self.trans = 0 self.pointers = [] self.targets = {} self.enums = {} def get_type(self, s): return self.trans.types[s] def allocate(self, size): index = len(self.data) self.data += "\0"*size return index def add_pointer(self, index, target): self.pointers += [pointer(index, target)] def add_enum(self, name, value): self.enums[name] = value def get_enum_value(self, name): if not name in self.enums: print "ERROR: couldn't find enum '%s'" % (name) return self.enums[name] def add_target(self, target, index): # TODO: warn about duplicates #print "add_target(target='%s' index=%d)" % (target, index) self.targets[target] = index def write(self, index, size, data): try: self.data = self.data[:index] + data + self.data[index+size:] except: print "write error:" print "\tself.data =", self.data print "\tdata =", data def patch_pointers(self): for p in self.pointers: if p.target in self.targets: i = self.targets[p.target] #print "ptr @ %d -> %s -> %d" % (p.index, p.target, i) data = struct.pack("P", i) self.write(p.index, len(data), data) else: print "ERROR: couldn't find target '%s' for pointer at %d" % (p.target, p.index) class type: def __init__(self): self.name = "" def size(self): pass class structure: def __init__(self): self.name = "" self.members = [] def size(self): s = 0 for m in self.members: s += m.size() return s def emit_header_code(self, out): print >>out, "struct", self.name print >>out, "{" for m in self.members: for l in m.get_code(): print >>out, "\t" + l print >>out, "};" print >>out, "" def emit_source_code(self, out): print >>out, "static void patch_ptr_%s(%s *self, char *base)" % (self.name, self.name) print >>out, "{" for m in self.members: for l in m.get_patch_code("self", "base"): print >>out, "\t" + l print >>out, "}" print >>out, "" def emit_data(self, cons, index, src_data): #print self.name+":" member_index = index for m in self.members: #print "\t" + m.name m.emit_data(cons, member_index, src_data) member_index += m.size() class variable: def __init__(self): self.expr = "" self.type = "" self.subtype = "" def get_code(self): return [] def get_patch_code(self, ptrname, basename): return [] def emit_data(self, cons, index, src_data): pass class variable_int(variable): def get_code(self): return ["%s %s;" % (option_inttype, self.name)] def size(self): return option_intsize def emit_data(self, cons, index, src_data): try: value = int(self.expr) except: value = int(src_data.get_single(self.expr)) #print "int", self.name, "=", value, "@", index data = struct.pack("l", value) cons.write(index, len(data), data) class variable_float(variable): def get_code(self): return ["%s %s;" % (option_floattype, self.name)] def size(self): return option_floatsize def emit_data(self, cons, index, src_data): try: value = float(self.expr) except: value = float(src_data.get_single(self.expr)) #print "int", self.name, "=", value, "@", index data = struct.pack("f", value) cons.write(index, len(data), data) class variable_string(variable): def get_code(self): return ["char *%s;" % (self.name)] def get_patch_code(self, ptrname, basename): return ["patch_ptr((char **)&(%s->%s), %s);" % (ptrname, self.name, basename)] def size(self): return option_ptrsize def emit_data(self, cons, index, src_data): string = src_data.get_single(self.expr) string = string.strip()[1:-1] # skip " and " string_index = cons.allocate(len(string)+1) cons.write(string_index, len(string), string) data = struct.pack("P", string_index) # TODO: solve this cons.write(index, len(data), data) class variable_ptr(variable): def get_code(self): return ["%s *%s;" % (self.subtype, self.name)] def get_patch_code(self, ptrname, basename): return ["patch_ptr((char**)&(%s->%s), %s);" % (ptrname, self.name, basename)] def size(self): return option_ptrsize def emit_data(self, cons, index, src_data): target = src_data.get_single(self.expr) cons.add_pointer(index, target) class variable_enum(variable): def get_code(self): return ["long *%s;" % (self.name)] def size(self): return option_intsize def emit_data(self, cons, index, src_data): target = src_data.get_single(self.expr) data = struct.pack("l", cons.get_enum_value(target)) cons.write(index, len(data), data) class variable_instance(variable): def get_code(self): return ["%s %s;" % (self.subtype, self.name)] def get_patch_code(self, ptrname, basename): return ["patch_ptr_%s(&(%s->%s), %s);" % (self.subtype, ptrname, self.name, basename)] def size(self): return self.translator.types[self.subtype].size() def emit_data(self, cons, index, src_data): target = src_data.find_node(self.expr) translator.types[self.subtype].emit_data(cons, index, target) #target = #cons.add_pointer(index, target) class variable_array(variable): def get_code(self): return ["long num_%s;" % self.name, "%s *%s;" % (self.subtype, self.name)] def get_patch_code(self, ptrname, baseptr): code = [] code += ["patch_ptr((char**)&(%s->%s), %s);" % (ptrname, self.name, baseptr)] code += ["for(int i = 0; i < %s->num_%s; i++)" % (ptrname, self.name)] code += ["\tpatch_ptr_%s(%s->%s+i, %s);" % (self.subtype, ptrname, self.name, baseptr)] return code def emit_data(self, cons, index, src_data): array_data = src_data.gather(self.expr) array_type = cons.get_type(self.subtype) size = array_type.size()*len(array_data) #print "packing array", self.name #print "\ttype =", array_type.name #print "\tsize =", array_type.size() array_index = cons.allocate(size) data = struct.pack("lP", len(array_data), array_index) # TODO: solve this cons.write(index, len(data), data) member_index = array_index for node in array_data: cons.add_target(node.get_path()[1:], member_index) array_type.emit_data(cons, member_index, node) member_index += array_type.size() #print "array", member_index def size(self): return option_ptrsize+option_intsize class const_arrayint: def __init__(self): self.name = "" self.values = [] def emit_header_code(self, out): print >>out, "enum" print >>out, "{" for i in xrange(0, len(self.values)): print >>out, "\t%s_%s = %d," % (self.name.upper(), self.values[i].upper(), i) print >>out, "\tNUM_%sS = %d" % (self.name.upper(), len(self.values)) print >>out, "};" print >>out, "" class translator: def __init__(self): self.types = {} self.structs = [] self.constants = [] self.data = 0 self.srcdata = 0 self.types["int"] = variable_int() self.types["float"] = variable_float() self.types["string"] = variable_string() self.types["ptr"] = variable_ptr() self.types["array"] = variable_array() def parse_variable(self, node): if len(node.values) != 4: print node.values raise "error parsing variable" type = node.values[0] subtype = "" if type == "int": v = variable_int() elif type == "enum": v = variable_enum() elif type == "float": v = variable_float() elif type == "string": v = variable_string() else: # complex type parts = type.split(":") if len(parts) != 2: raise "can't emit code for variable %s of type %s" % (self.name, self.type) elif parts[0] == "ptr": subtype = parts[1] v = variable_ptr() elif parts[0] == "instance": subtype = parts[1] v = variable_instance() elif parts[0] == "array": subtype = parts[1] v = variable_array() else: raise "can't emit code for variable %s of type %s" % (self.name, self.type) v.translator = self v.type = node.values[0] v.subtype = subtype v.name = node.values[1] assignment = node.values[2] v.expr = node.values[3] if assignment != "=": raise "error parsing variable. expected =" return v def parse_struct(self, node): if len(node.values) != 2: raise "error parsing struct" s = structure() s.name = node.values[1] for statement in node.children: s.members += [self.parse_variable(statement)] return s def parse_constant(self, node): if len(node.values) != 5: print node.values raise "error parsing constant" type = node.values[1] name = node.values[2] assignment = node.values[3] expression = node.values[4] if assignment != "=": print node.values raise "error parsing constant" ints = const_arrayint() ints.name = name items = self.srcdata.gather(expression) for c in items: ints.values += [c.name()] self.constants += [ints] def parse(self, script, srcdata): self.srcdata = srcdata for statement in script.children: if statement.values[0] == "struct": s = self.parse_struct(statement) self.structs += [s] self.types[s.name] = s elif statement.values[0] == "const": self.parse_constant(statement) else: raise "unknown statement:" + statement def emit_header_code(self, out): for c in self.constants: c.emit_header_code(out) for s in self.structs: s.emit_header_code(out) print >>out, "" print >>out, "struct data_container *load_data_from_file(const char *filename);" print >>out, "struct data_container *load_data_from_memory(unsigned char *filename);" print >>out, "" def emit_source_code(self, out, header_filename): print >>out, ''' #include "%s" #include #include static void patch_ptr(char **ptr, char *base) { *ptr = base+(size_t)(*ptr); } ''' % header_filename for s in self.structs: s.emit_source_code(out) print >>out, ''' data_container *load_data_from_memory(unsigned char *mem) { if(mem[0] != sizeof(void*)) return 0; if(mem[1] != sizeof(long)) return 0; if(mem[2] != sizeof(float)) return 0; /* patch all pointers */ data_container *con = (data_container*)(mem + 4); patch_ptr_data_container(con, (char *)con); return con; } data_container *load_data_from_file(const char *filename) { unsigned char *data = 0; int size; /* open file */ FILE *f = fopen(filename, "rb"); /* get size */ fseek(f, 0, SEEK_END); size = ftell(f); fseek(f, 0, SEEK_SET); /* allocate, read data and close file */ data = (unsigned char *)malloc(size); fread(data, 1, size, f); fclose(f); return load_data_from_memory(data); } ''' def emit_data(self): for s in self.structs: if s.name == "data_container": #print "found data_container" cons = data_constructor() cons.trans = self i = cons.allocate(s.size()) s.emit_data(cons, i, self.srcdata) cons.patch_pointers() header = struct.pack("bbbb", option_ptrsize, option_intsize, option_floatsize, 0) return header + cons.data def create_translator(script, srcdata): t = translator() t.parse(script, srcdata) return t def validate(script, validator): def validate_values(values, check): if not len(check) or check[0] == "*": print "too many values" return p = check[0].split(":") type = p[0] name = p[1] # TODO: check type and stuff # recurse if len(values) > 1: if not len(check): print "unexpected value" validate_values(values[1:], check[1:]) else: if len(check) > 1 and check[1] != "*": print "to few values" if len(script.values): validate_values(script.values, validator.values) for child in script.children: tag = child.values[0] n = validator.find_node("tag:"+tag) if not n: found = 0 for vc in validator.children: if "ident:" in vc.values[0]: validate(child, vc) print vc.values[0] found = 1 break if not found: print "error:", tag, "not found" else: print "tag:"+tag validate(child, n) input_filename = sys.argv[1] script_filename = sys.argv[2] output_filename = 0 coutput_filename = 0 header_filename = 0 source_filename = 0 sheader_filename = 0 if sys.argv[3] == '-h': header_filename = sys.argv[4] elif sys.argv[3] == '-s': source_filename = sys.argv[4] sheader_filename = sys.argv[5] elif sys.argv[3] == '-d': output_filename = sys.argv[4] elif sys.argv[3] == '-c': coutput_filename = sys.argv[4] srcdata = parse_file(input_filename) script = parse_file(script_filename) translator = create_translator(script, srcdata) if header_filename: translator.emit_header_code(file(header_filename, "w")) if source_filename: translator.emit_source_code(file(source_filename, "w"), os.path.basename(sheader_filename)) if output_filename: rawdata = translator.emit_data() file(output_filename, "wb").write(rawdata) if coutput_filename: i = 0 rawdata = translator.emit_data() f = file(coutput_filename, "w") print >>f,"unsigned char internal_data[] = {" print >>f,str(ord(rawdata[0])), for d in rawdata[1:]: s = ","+str(ord(d)) print >>f,s, i += len(s)+1 if i >= 70: print >>f,"" i = 0 print >>f,"" print >>f,"};" print >>f,"" f.close() teeworlds-0.6.2+dfsg/scripts/copyright.py0000755000175000017500000000370612140200333017514 0ustar felixfeliximport os, re, sys match = re.search('(.*)/', sys.argv[0]) if match != None: os.chdir(match.group(1)) os.chdir('../') notice = [b"/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */\n", b"/* If you are missing that file, acquire a complete release at teeworlds.com. */\n"] exclude = ["src%sengine%sexternal" % (os.sep, os.sep), "src%sosxlaunch" % os.sep] updated_files = 0 def fix_copyright_notice(filename): global updated_files f = open(filename, "rb") lines = f.readlines() f.close() i = 0 length_lines = len(lines) if length_lines > 0: while i <= length_lines and (lines[i].decode("utf-8").lstrip()[:2] == "//" or lines[i].decode("utf-8").lstrip()[:2] == "/*" and lines[i].decode("utf-8").rstrip()[-2:] == "*/") and ("Magnus" in lines[i].decode("utf-8") or "magnus" in lines[i].decode("utf-8") or "Auvinen" in lines[i].decode("utf-8") or "auvinen" in lines[i].decode("utf-8") or "license" in lines[i].decode("utf-8") or "teeworlds" in lines[i].decode("utf-8")): i += 1 length_notice = len(notice) if i > 0: j = 0 while lines[j] == notice[j]: j += 1 if j == length_notice: return k = j j = 0 while j < length_notice -1 - k: lines = [notice[j]] + lines j += 1 while j < length_notice: lines[j] = notice[j] j += 1 if length_lines == 0 or i == 0: j = length_notice - 1 while j >= 0: lines = [notice[j]] + lines j -= 1 open(filename, "wb").writelines(lines) updated_files += 1 skip = False for root, dirs, files in os.walk("src"): for excluding in exclude: if root[:len(excluding)] == excluding: skip = True break if skip == True: skip = False continue for name in files: filename = os.path.join(root, name) if filename[-2:] != ".c" and filename[-4:] != ".cpp" and filename[-2:] != ".h": continue fix_copyright_notice(filename) output = "file" if updated_files != 1: output += "s" print("*** updated %d %s ***" % (updated_files, output)) teeworlds-0.6.2+dfsg/scripts/count_source.sh0000644000175000017500000000016412140200333020166 0ustar felixfelixsvn blame `svn -R ls | grep ^src | grep -v external | grep -v /$ | grep -v \.txt` | python scripts/process_blame.py teeworlds-0.6.2+dfsg/scripts/dat2c.py0000644000175000017500000000036512140200333016474 0ustar felixfeliximport sys data = file(sys.argv[1], "rb").read() i = 0 print "unsigned char", sys.argv[2], "[] = {" print str(ord(data[0])), for d in data[1:]: s = ","+str(ord(d)) print s, i += len(s)+1 if i >= 70: print "" i = 0 print "" print "};" teeworlds-0.6.2+dfsg/scripts/font_converter.py0000644000175000017500000001002612140200333020527 0ustar felixfelixfrom __future__ import with_statement import struct import sys import re def convert(input, output): with open(input, "r") as in_file: with open(output, "w") as out_file: def build_dic(parts): dic = {} for part in parts: key, value = part.split('=') try: dic[key] = int(value) except: dic[key] = value return dic def get_entry(line): while line[-1] == "\r" or line[-1] == "\n": line = line[0:-1] parts = [] quote = 0 part = "" for c in line: if c == "\"": quote = 1-quote elif c == " " and not quote: if part: parts.append(part) part = "" else: part += c if part: parts.append(part) type = parts[0] dic = build_dic(parts[1:]) return type, dic def write_int16(val): out_file.write(struct.pack('= 2: print "converting..." filenames = sys.argv[1:] for filename in filenames: input = filename output = re.sub("fnt$", "tfnt", input) print "input: %s, output: %s" % (input, output) convert(input, output) print "done!" else: print "font converter! converts .fnt files to teeworlds .tfnt" print "usage: font_converter " teeworlds-0.6.2+dfsg/scripts/font_installer.sh0000755000175000017500000000014512140200333020503 0ustar felixfelixecho Generating .fnts... ../../font_generator/a.out python ../scripts/font_converter.py default*.fnt teeworlds-0.6.2+dfsg/scripts/gen_keys.py0000644000175000017500000000375412140200333017310 0ustar felixfeliximport sys, os # genereate keys.h file f = file("src/engine/keys.h", "w") keynames = [] for i in range(0, 512): keynames += ["&%d"%i] print >>f, "#ifndef ENGINE_KEYS_H" print >>f, "#define ENGINE_KEYS_H" print >>f, '/* AUTO GENERATED! DO NOT EDIT MANUALLY! */' print >>f, "enum" print >>f, "{" highestid = 0 for line in open("scripts/SDL_keysym.h"): l = line.strip().split("=") if len(l) == 2 and "SDLK_" in line: key = l[0].strip().replace("SDLK_", "KEY_") value = int(l[1].split(",")[0].strip()) print >>f, "\t%s = %d,"%(key, value) keynames[value] = key.replace("KEY_", "").lower() if value > highestid: highestid =value print >>f, "\tKEY_MOUSE_1 = %d,"%(highestid+1); keynames[highestid+1] = "mouse1" print >>f, "\tKEY_MOUSE_2 = %d,"%(highestid+2); keynames[highestid+2] = "mouse2" print >>f, "\tKEY_MOUSE_3 = %d,"%(highestid+3); keynames[highestid+3] = "mouse3" print >>f, "\tKEY_MOUSE_4 = %d,"%(highestid+4); keynames[highestid+4] = "mouse4" print >>f, "\tKEY_MOUSE_5 = %d,"%(highestid+5); keynames[highestid+5] = "mouse5" print >>f, "\tKEY_MOUSE_6 = %d,"%(highestid+6); keynames[highestid+6] = "mouse6" print >>f, "\tKEY_MOUSE_7 = %d,"%(highestid+7); keynames[highestid+7] = "mouse7" print >>f, "\tKEY_MOUSE_8 = %d,"%(highestid+8); keynames[highestid+8] = "mouse8" print >>f, "\tKEY_MOUSE_WHEEL_UP = %d,"%(highestid+9); keynames[highestid+9] = "mousewheelup" print >>f, "\tKEY_MOUSE_WHEEL_DOWN = %d,"%(highestid+10); keynames[highestid+10] = "mousewheeldown" print >>f, "\tKEY_LAST," print >>f, "};" print >>f, "" print >>f, "#endif" # generate keynames.c file f = file("src/engine/client/keynames.h", "w") print >>f, '/* AUTO GENERATED! DO NOT EDIT MANUALLY! */' print >>f, '' print >>f, '#ifndef KEYS_INCLUDE' print >>f, '#error do not include this header!' print >>f, '#endif' print >>f, '' print >>f, "#include " print >>f, "" print >>f, "const char g_aaKeyStrings[512][16] =" print >>f, "{" for n in keynames: print >>f, '\t"%s",'%n print >>f, "};" print >>f, "" f.close() teeworlds-0.6.2+dfsg/scripts/linecount.sh0000755000175000017500000000011312140200333017453 0ustar felixfelix#!/bin/sh wc `find . -iname *.cpp` `find . -iname *.h` `find . -iname *.c` teeworlds-0.6.2+dfsg/scripts/make_docs.sh0000755000175000017500000000015612140200333017407 0ustar felixfelixperl docs/tool/NaturalDocs -i src/game -i src/engine -xi src/engine/external -p docs/conf -o html docs/output teeworlds-0.6.2+dfsg/scripts/make_release.py0000644000175000017500000001461012140200333020112 0ustar felixfeliximport shutil, os, sys, zipfile #valid_platforms = ["win32", "linux86", "linux86_64", "src"] if len(sys.argv) != 3: print("wrong number of arguments") print(sys.argv[0], "VERSION PLATFORM") sys.exit(-1) name = "teeworlds" version = sys.argv[1] platform = sys.argv[2] exe_ext = "" use_zip = 0 use_gz = 1 use_dmg = 0 use_bundle = 0 include_data = True include_exe = True include_src = False if platform == "src": include_data = True include_exe = False include_src = True use_zip = 1 use_gz = 1 #if not platform in valid_platforms: # print("not a valid platform") # print(valid_platforms) # sys.exit(-1) if platform == 'win32': exe_ext = ".exe" use_zip = 1 use_gz = 0 if platform == 'osx': use_dmg = 1 use_gz = 0 use_bundle = 1 def copydir(src, dst, excl=[]): for root, dirs, files in os.walk(src, topdown=True): if "/." in root or "\\." in root: continue for name in dirs: if name[0] != '.': os.mkdir(os.path.join(dst, root, name)) for name in files: if name[0] != '.': shutil.copy(os.path.join(root, name), os.path.join(dst, root, name)) package = "%s-%s-%s" %(name, version, platform) package_dir = package print("cleaning target") shutil.rmtree(package_dir, True) os.mkdir(package_dir) print("adding files") shutil.copy("readme.txt", package_dir) shutil.copy("license.txt", package_dir) shutil.copy("storage.cfg", package_dir) if include_data and not use_bundle: os.mkdir(os.path.join(package_dir, "data")) copydir("data", package_dir) if platform[:3] == "win": shutil.copy("other/config_directory.bat", package_dir) shutil.copy("SDL.dll", package_dir) shutil.copy("freetype.dll", package_dir) if include_exe and not use_bundle: shutil.copy(name+exe_ext, package_dir) shutil.copy(name+"_srv"+exe_ext, package_dir) if include_src: for p in ["src", "scripts", "datasrc", "other", "objs"]: os.mkdir(os.path.join(package_dir, p)) copydir(p, package_dir) shutil.copy("bam.lua", package_dir) shutil.copy("configure.lua", package_dir) if use_bundle: bins = [name, name+'_srv', 'serverlaunch'] platforms = ('x86', 'x86_64', 'ppc') for bin in bins: to_lipo = [] for p in platforms: fname = bin+'_'+p if os.path.isfile(fname): to_lipo.append(fname) if to_lipo: os.system("lipo -create -output "+bin+" "+" ".join(to_lipo)) # create Teeworlds appfolder clientbundle_content_dir = os.path.join(package_dir, "Teeworlds.app/Contents") clientbundle_bin_dir = os.path.join(clientbundle_content_dir, "MacOS") clientbundle_resource_dir = os.path.join(clientbundle_content_dir, "Resources") clientbundle_framework_dir = os.path.join(clientbundle_content_dir, "Frameworks") os.mkdir(os.path.join(package_dir, "Teeworlds.app")) os.mkdir(clientbundle_content_dir) os.mkdir(clientbundle_bin_dir) os.mkdir(clientbundle_resource_dir) os.mkdir(clientbundle_framework_dir) os.mkdir(os.path.join(clientbundle_resource_dir, "data")) copydir("data", clientbundle_resource_dir) shutil.copy("other/icons/Teeworlds.icns", clientbundle_resource_dir) shutil.copy(name+exe_ext, clientbundle_bin_dir) os.system("cp -R /Library/Frameworks/SDL.framework " + clientbundle_framework_dir) file(os.path.join(clientbundle_content_dir, "Info.plist"), "w").write(""" CFBundleDevelopmentRegion English CFBundleExecutable teeworlds CFBundleIconFile Teeworlds CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion %s """ % (version)) file(os.path.join(clientbundle_content_dir, "PkgInfo"), "w").write("APPL????") # create Teeworlds Server appfolder serverbundle_content_dir = os.path.join(package_dir, "Teeworlds Server.app/Contents") serverbundle_bin_dir = os.path.join(serverbundle_content_dir, "MacOS") serverbundle_resource_dir = os.path.join(serverbundle_content_dir, "Resources") os.mkdir(os.path.join(package_dir, "Teeworlds Server.app")) os.mkdir(serverbundle_content_dir) os.mkdir(serverbundle_bin_dir) os.mkdir(serverbundle_resource_dir) os.mkdir(os.path.join(serverbundle_resource_dir, "data")) os.mkdir(os.path.join(serverbundle_resource_dir, "data/maps")) os.mkdir(os.path.join(serverbundle_resource_dir, "data/mapres")) copydir("data/maps", serverbundle_resource_dir) shutil.copy("other/icons/Teeworlds_srv.icns", serverbundle_resource_dir) shutil.copy(name+"_srv"+exe_ext, serverbundle_bin_dir) shutil.copy("serverlaunch"+exe_ext, serverbundle_bin_dir + "/"+name+"_server") file(os.path.join(serverbundle_content_dir, "Info.plist"), "w").write(""" CFBundleDevelopmentRegion English CFBundleExecutable teeworlds_server CFBundleIconFile Teeworlds_srv CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion %s """ % (version)) file(os.path.join(serverbundle_content_dir, "PkgInfo"), "w").write("APPL????") if use_zip: print("making zip archive") zf = zipfile.ZipFile("%s.zip" % package, 'w', zipfile.ZIP_DEFLATED) for root, dirs, files in os.walk(package_dir, topdown=True): for name in files: n = os.path.join(root, name) zf.write(n, n) #zf.printdir() zf.close() if use_gz: print("making tar.gz archive") os.system("tar czf %s.tar.gz %s" % (package, package_dir)) if use_dmg: print("making disk image") os.system("rm -f %s.dmg %s_temp.dmg" % (package, package)) os.system("hdiutil create -srcfolder %s -volname Teeworlds -quiet %s_temp" % (package_dir, package)) os.system("hdiutil convert %s_temp.dmg -format UDBZ -o %s.dmg -quiet" % (package, package)) os.system("rm -f %s_temp.dmg" % package) print("done") teeworlds-0.6.2+dfsg/scripts/make_src.py0000644000175000017500000000170212140200333017257 0ustar felixfeliximport os, shutil, zipfile, sys if len(sys.argv) <= 1: print "%s VERSION [SVN TREE]" % sys.argv[0] sys.exit(-1) version = sys.argv[1] svn_tree = "tags/release-%s" % version if len(sys.argv) > 2: svn_tree = sys.argv[2] # make clean if 1: try: shutil.rmtree("srcwork") except: pass try: os.mkdir("srcwork") except: pass root_dir = os.getcwd() + "/srcwork" # change dir os.chdir(root_dir) # fix bam #if 1: # os.system("svn export http://stalverk80.se/svn/bam bam") # z = zipfile.ZipFile("../bam.zip", "w") # for root, dirs, files in os.walk("bam"): # for f in files: # z.write(root+"/"+ f) # z.close() if 1: os.system("svn export svn://svn.teeworlds.com/teeworlds/%s teeworlds" % svn_tree) os.chdir("teeworlds") os.system("python scripts/make_release.py %s src" % version) os.chdir(root_dir) for f in os.listdir("teeworlds"): if "teeworlds" in f and "src" in f and (".zip" in f or ".tar.gz" in f): shutil.copy("teeworlds/"+f, "../" + f) teeworlds-0.6.2+dfsg/scripts/mass_server.py0000644000175000017500000000203712140200333020026 0ustar felixfelix#from random import choice import random import os masterservers = ["localhost 8300"] maps = [ ["dm1", "dm2", "dm6"], ["dm1", "dm2", "dm6"], ["ctf1", "ctf2", "ctf3"], ] servernames = [ "%s playhouse", "%s own server", ] nicks = [] for l in file("scripts/nicks.txt"): nicks += l.replace(":port80c.se.quakenet.org 353 matricks_ = #pcw :", "").strip().split() inick = 0 def get_nick(): global inick, nicks inick = (inick+1)%len(nicks) return nicks[inick].replace("`", "\`") for s in xrange(0, 350): cmd = "./fake_server_d_d " cmd += '-n "%s" ' % (random.choice(servernames) % get_nick()) for m in masterservers: cmd += '-m %s '%m max = random.randint(2, 16) cmd += "-x %d " % max t = random.randint(0, 2) cmd += '-a "%s" ' % random.choice(maps[t]) cmd += '-g %d ' % random.randint(0, 100) cmd += '-t %d ' % t # dm, tdm, ctf cmd += "-f %d " % random.randint(0, 1) # password protected for p in xrange(0, random.randint(0, max)): cmd += '-p "%s" %d ' % (get_nick(), random.randint(0, 20)) print cmd os.popen2(cmd) teeworlds-0.6.2+dfsg/scripts/netobj.py0000644000175000017500000002721712140200333016765 0ustar felixfeliximport sys, os line_count = 0 class variable: name = "unknown" def __init__(self, args, name): global line_count self.name = name self.line = line_count def emit_declaration(self): return ["\tint %s;" % self.name] def linedef(self): return "#line %d" % self.line def emit_secure(self, parent): return [] def emit_unpack(self): return ["msg.%s = msg_unpack_int();" % self.name] def emit_unpack_check(self): return [] def emit_pack(self): return ["\t\tmsg_pack_int(%s);" % self.name] class var_any(variable): def __init__(self, args, name): variable.__init__(self, args, name) class var_range(variable): def __init__(self, args, name): variable.__init__(self, args, name) self.min = args[0] self.max = args[1] def emit_unpack_check(self): return ["if(msg.%s < %s || msg.%s > %s) { msg_failed_on = \"%s\"; return 0; }" % (self.name, self.min, self.name, self.max, self.name)] def emit_secure(self, parent): return [self.linedef(), "obj->%s = netobj_clamp_int(\"%s.%s\", obj->%s, %s, %s);" % (self.name, parent.name, self.name, self.name, self.min, self.max)] class var_string(variable): def __init__(self, args, name): variable.__init__(self, args, name) class var_string(variable): def __init__(self, args, name): variable.__init__(self, args, name) def emit_declaration(self): return ["\tconst char *%s;" % self.name] def emit_unpack(self): return ["msg.%s = msg_unpack_string();" % self.name] def emit_pack(self): return ["\t\tmsg_pack_string(%s, -1);" % self.name] class object: def __init__(self, line): fields = line.split() self.name = fields[1] self.extends = None if len(fields) == 4 and fields[2] == "extends": self.extends = fields[3] self.enum_name = "NETOBJTYPE_%s" % self.name.upper() self.struct_name = "NETOBJ_%s" % self.name.upper() self.members = [] def parse(self, lines): global line_count for index in xrange(0, len(lines)): line_count += 1 line = lines[index] if not len(line): continue if line == "end": return lines[index+1:] else: # check for argument fields = line.split(")", 1) if len(fields) == 2: names = [line.strip() for line in fields[1].split(",")] l = fields[0].split("(", 1) type = l[0] args = [line.strip() for line in l[1].split(",")] else: l = fields[0].split(None, 1) type = l[0] args = [] names = [line.strip() for line in l[1].split(",")] for name in names: create_string = 'var_%s(%s, "%s")' % (type, args, name) new_member = eval(create_string) self.members += [new_member] raise BaseException("Parse error") def emit_declaration(self): lines = [] if self.extends: lines += ["struct %s : public NETOBJ_%s\n {" % (self.struct_name, self.extends.upper())] else: lines += ["struct %s\n {" % self.struct_name] for m in self.members: lines += m.emit_declaration() lines += ["};"] return lines def emit_secure(self): lines = [] for m in self.members: lines += m.emit_secure(self) return lines class message: def __init__(self, line): fields = line.split() self.name = fields[1] self.enum_name = "NETMSGTYPE_%s" % self.name.upper() self.struct_name = "NETMSG_%s" % self.name.upper() self.members = [] def parse(self, lines): global line_count for index in xrange(0, len(lines)): line_count += 1 line = lines[index] if not len(line): continue if line == "end": return lines[index+1:] else: # check for argument fields = line.split(")", 1) if len(fields) == 2: names = [line.strip() for line in fields[1].split(",")] l = fields[0].split("(", 1) type = l[0] args = [line.strip() for line in l[1].split(",")] else: l = fields[0].split(None, 1) type = l[0] args = [] names = [line.strip() for line in l[1].split(",")] for name in names: create_string = 'var_%s(%s, "%s")' % (type, args, name) new_member = eval(create_string) self.members += [new_member] raise BaseException("Parse error") def emit_declaration(self): lines = [] lines += ["struct %s\n {" % self.struct_name] for m in self.members: lines += m.emit_declaration() lines += ["\tvoid pack(int flags)"] lines += ["\t{"] lines += ["\t\tmsg_pack_start(%s, flags);" % self.enum_name] for m in self.members: lines += m.emit_pack() lines += ["\t\tmsg_pack_end();"] lines += ["\t}"] lines += ["};"] return lines def emit_unpack(self): lines = [] for m in self.members: lines += m.emit_unpack() for m in self.members: lines += m.emit_unpack_check() return lines def emit_pack(self): lines = [] for m in self.members: lines += m.emit_pack() return lines class event(object): def __init__(self, line): object.__init__(self, line) self.enum_name = "NETEVENTTYPE_%s" % self.name.upper() self.struct_name = "NETEVENT_%s" % self.name.upper() class raw_reader: def __init__(self): self.raw_lines = [] def parse(self, lines): global line_count for index in xrange(0, len(lines)): line_count += 1 line = lines[index] if not len(line): continue if line == "end": return lines[index+1:] else: self.raw_lines += [line] raise BaseException("Parse error") class proto: def __init__(self): self.objects = [] self.messages = [] self.source_raw = [] self.header_raw = [] def load(filename): # read the file global line_count line_count = 0 lines = [line.split("//", 2)[0].strip() for line in file(filename).readlines()] p = proto() while len(lines): line_count += 1 line = lines[0] if not len(line): del lines[0] continue fields = line.split(None, 1) del lines[0] if fields[0] == "object": new_obj = object(line) lines = new_obj.parse(lines) p.objects += [new_obj] elif fields[0] == "message": new_msg = message(line) lines = new_msg.parse(lines) p.messages += [new_msg] elif fields[0] == "event": new_obj = event(line) lines = new_obj.parse(lines) p.objects += [new_obj] elif fields[0] == "raw_source": raw = raw_reader() lines = raw.parse(lines) p.source_raw += raw.raw_lines elif fields[0] == "raw_header": raw = raw_reader() lines = raw.parse(lines) p.header_raw += raw.raw_lines else: print "error, strange line:", line return p def emit_header_file(f, p): for l in p.header_raw: print >>f, l if 1: # emit the enum table for objects print >>f, "enum {" print >>f, "\tNETOBJTYPE_INVALID=0," for obj in p.objects: print >>f, "\t%s," % obj.enum_name print >>f, "\tNUM_NETOBJTYPES" print >>f, "};" print >>f, "" if 1: # emit the enum table for messages print >>f, "enum {" print >>f, "\tNETMSGTYPE_INVALID=0," for msg in p.messages: print >>f, "\t%s," % msg.enum_name print >>f, "\tNUM_NETMSGTYPES" print >>f, "};" print >>f, "" print >>f, "int netobj_secure(int type, void *data, int size);" print >>f, "const char *netobj_get_name(int type);" print >>f, "int netobj_num_corrections();" print >>f, "const char *netobj_corrected_on();" print >>f, "" print >>f, "void *netmsg_secure_unpack(int type);" print >>f, "const char *netmsg_get_name(int type);" print >>f, "const char *netmsg_failed_on();" print >>f, "" for obj in p.objects: for l in obj.emit_declaration(): print >>f, l print >>f, "" for msg in p.messages: for l in msg.emit_declaration(): print >>f, l print >>f, "" def emit_source_file(f, p, protofilename): print >>f, "#line 1 \"%s\"" % os.path.abspath(protofilename).replace("\\", "\\\\") for l in p.source_raw: print >>f, l print >>f, "const char *msg_failed_on = \"\";" print >>f, "const char *obj_corrected_on = \"\";" print >>f, "static int num_corrections = 0;" print >>f, "int netobj_num_corrections() { return num_corrections; }" print >>f, "const char *netobj_corrected_on() { return obj_corrected_on; }" print >>f, "const char *netmsg_failed_on() { return msg_failed_on; }" print >>f, "" print >>f, "static int netobj_clamp_int(const char *error_msg, int v, int min, int max)" print >>f, "{" print >>f, "\tif(v>f, "\tif(v>max) { obj_corrected_on = error_msg; num_corrections++; return max; }" print >>f, "\treturn v;" print >>f, "}" print >>f, "" if 1: # names print >>f, "static const char *object_names[] = {" print >>f, "\t" + '"invalid",' for obj in p.objects: print >>f, '\t"%s",' % obj.name print >>f, '\t""' print >>f, "};" print >>f, "" if 1: # secure functions print >>f, "static int secure_object_invalid(void *data, int size) { return 0; }" for obj in p.objects: print >>f, "static int secure_%s(void *data, int size)" % obj.name print >>f, "{" print >>f, "\t%s *obj = (%s *)data;" % (obj.struct_name, obj.struct_name) print >>f, "\t(void)obj;" # to get rid of "unused variable" warning print >>f, "\tif(size != sizeof(%s)) return -1;" % obj.struct_name if obj.extends: print >>f, "\tif(secure_%s(data, sizeof(NETOBJ_%s)) != 0) return -1;" % (obj.extends, obj.extends.upper()) for l in obj.emit_secure(): print >>f, "\t" + l print >>f, "\treturn 0;"; print >>f, "}" print >>f, "" if 1: # secure function table print >>f, "typedef int(*SECUREFUNC)(void *data, int size);" print >>f, "static SECUREFUNC secure_funcs[] = {" print >>f, "\t" + 'secure_object_invalid,' for obj in p.objects: print >>f, "\tsecure_%s," % obj.name print >>f, "\t" + '0x0' print >>f, "};" print >>f, "" if 1: print >>f, "int netobj_secure(int type, void *data, int size)" print >>f, "{" print >>f, "\tif(type < 0 || type >= NUM_NETOBJTYPES) return -1;" print >>f, "\treturn secure_funcs[type](data, size);" print >>f, "};" print >>f, "" if 1: print >>f, "const char *netobj_get_name(int type)" print >>f, "{" print >>f, "\tif(type < 0 || type >= NUM_NETOBJTYPES) return \"(invalid)\";" print >>f, "\treturn object_names[type];" print >>f, "};" print >>f, "" if 1: # names print >>f, "static const char *message_names[] = {" print >>f, "\t" + '"invalid",' for msg in p.messages: print >>f, '\t"%s",' % msg.name print >>f, '\t""' print >>f, "};" print >>f, "" if 1: # secure functions print >>f, "static void *secure_unpack_invalid() { return 0; }" for msg in p.messages: print >>f, "static void *secure_unpack_%s()" % msg.name print >>f, "{" print >>f, "\tstatic %s msg;" % msg.struct_name for l in msg.emit_unpack(): print >>f, "\t" + l print >>f, "\treturn &msg;"; print >>f, "}" print >>f, "" if 1: # secure function table print >>f, "typedef void *(*SECUREUNPACKFUNC)();" print >>f, "static SECUREUNPACKFUNC secure_unpack_funcs[] = {" print >>f, "\t" + 'secure_unpack_invalid,' for msg in p.messages: print >>f, "\tsecure_unpack_%s," % msg.name print >>f, "\t" + '0x0' print >>f, "};" print >>f, "" if 1: print >>f, "void *netmsg_secure_unpack(int type)" print >>f, "{" print >>f, "\tvoid *msg;" print >>f, "\tmsg_failed_on = \"\";" print >>f, "\tif(type < 0 || type >= NUM_NETMSGTYPES) return 0;" print >>f, "\tmsg = secure_unpack_funcs[type]();" print >>f, "\tif(msg_unpack_error()) return 0;" print >>f, "\treturn msg;" print >>f, "};" print >>f, "" if 1: print >>f, "const char *netmsg_get_name(int type)" print >>f, "{" print >>f, "\tif(type < 0 || type >= NUM_NETMSGTYPES) return \"(invalid)\";" print >>f, "\treturn message_names[type];" print >>f, "};" print >>f, "" if sys.argv[1] == "header": p = load(sys.argv[2]) emit_header_file(file(sys.argv[3], "w"), p) elif sys.argv[1] == "source": p = load(sys.argv[2]) emit_source_file(file(sys.argv[3], "w"), p, sys.argv[2]) else: print "invalid command" sys.exit(-1) teeworlds-0.6.2+dfsg/scripts/nicks.txt0000644000175000017500000003675712140200333017013 0ustar felixfelix:port80c.se.quakenet.org 353 matricks_ = #pcw :SPQR|Snapshot em0k1d n1sse iTouch|HedaN Hyeen Mattzki i9`Nilzon matricks_ WCG|Johan format` |ceMan PREGE lololollalalal kishe|Pookie polisen Rambo-ohsite firre15 ais-nax Obbmaster diskoturk SR|KinG gone-andytheman [FG]AkO cfg-gunnar proshit|Benis raaEW bengan-- Loser^ zNEKS Fokka Ping28|kwnztahh Palo^ partyZAH NillePillopio discover J-N ios Cajanen Bsite`oZe haxxcoto Hell[v]SOVA rabies Lampard2k7 DeFuN Linkan bjorniss Soet-DgR-_-[A] BridgeMill|Mod1 :port80c.se.quakenet.org 353 matricks_ = #pcw :Mutt Hofvits [G][L][H][f] dahlgren Zervantes ben_dover fanfanfanfan ibersklan-ruyrl Grismusen Ploxzish Ejwin^mp Poontuus sintr0z hbfs___dSq Bombastic sasdd ErNoI TaizK UnLess Astan SwS-Garcia WyH|spliffstar lololololol Simixiz SD|barkeN MOOE keekz Centern Xzide^^ N43-HYPER LeaW`3D hotnils Lectra`MAEKTIG fnytt frtyschoooooooo insanity|DavidO dr-tom MIM wayu n9ef dinmammaamamam eppel Fess1g wardh hzapRingMeisteR kidneb xplayn Lajgarn flaxe HEJJADANNE :port80c.se.quakenet.org 353 matricks_ = #pcw :Big^F Bsite`layd hejehjhk hsd1rrruffe AroooooN lexx_ lucchi AriGold DeDDu maflip eMO-aboOoOo Ramos6 ruub bjuse Chawn r3t _ogg kAerhu AIE|malle KimIO-SWE LooOOLiiiZ333eN kullersten Poke_- DryNox KoSmurfen ExakTT Gs|T1AO vtine|MAAAUNS heroX Twind [wc3]-Chiwi[CL] chilirec|raimat SeeWaR erdussel TROPP- exay franky540 ActionBarbie mHz\ZTK`sleep RRP^Jaffa cookiemonstAH WarL|thiDe Oskar^ qK-iMaz Nacka VILLIG-Booyah Beltdjur SoX-cOUPE kund|playz BCS|Winter :port80c.se.quakenet.org 353 matricks_ = #pcw :Pajsarn svamp tfs\a TruqN babben hr-gil mapD|endoZz gnomie bostrom kA-WANGA kNNas Abxtract|pilshe vogga koolaid-krille DeVixx jwn rdl-- Kee FjuNe koolaid-iskn Pr0`Z10d3y snowsky vibes Nikjou vtine|zlivero OmGaAA mAJ|Britt hekla [0]apa kEy [F]Kaela bananskalFTW|da jeb` vampyren H0JT4R0LJ4 SheVa^ mAxXI Lectro FtN bajajajajajajja mZ`WIGGE dAMI^ moll3 GitfaN boisan [cs]-sNT Ex`Novag[jb] PPB|everest[wa] xiver- KulaN N43-xhady pluffenFOSHO wilho :port80c.se.quakenet.org 353 matricks_ = #pcw :Nilsson^Arvika nRe`SmitH Ice`Lie[jb] sukki elgenkek drt0FF TaZ- Caesarion Limonaatipoika robf[S] DNAtive broder lolipop jollsy Genander Ballo_Ong Musikant|musicu ToY|Machine nerf|dupl0x gopy` fn\EXESSION FreZZ joharn _Folz [D]KvasteN daeeawewasdfadf CamelRyttArn Xabian HinzeL qRoN _dARUUF CUC|MiniMe^Away hewnk ASTRA|ove xideR Krigarn^ nIw|PlixxaN nMe|| Plumpen S0DA|BorrE teddis daboomb Bongo` Unknownperson TTA`BAdh SefuTzu`AWAY QRLGRIM neraz :port80c.se.quakenet.org 353 matricks_ = #pcw :Xipho|Fudge Guggztah etojk Lindgrene [V]ZAIKON BmF^Off Wf`jeager\aw Havsmanet-ehn krisa hojhoj alfonz RoBBY faB|mHk Cheeser Admin1337 DoFFrR Caution- mZ`NoKaas HR|bramhultz`` mxyzptlk luder^myfish i`pikoL ZhenjkEe^^-777 Mansvalp sajje1996 v4de Redical`quexOFF n^sdadasJo eXITD`aw teknikvm-jaoel FLIPP-Shapen ALEJKO cliz^ acequeen Ferato Shudde sinsKal`ply frittlol Deadlier Farbrorspurk FizaH` \Azash sWingY fb\ekN xtreck addeadam KneKk azkiN rinxzor :port80c.se.quakenet.org 353 matricks_ = #pcw :ArneH asdn brunte GeN|HollywoodHu bL\ZuND UNNEBERZ Synthetic|Xorci portoni saxparty|imso Inti |RnE oFFily Sp|DiamaNt Rhombus Nebrek kelamies Thingg BFB|incedeNt TAZzen whinan J0nte p12|wiggie okaJ mZ`Raztad FABF R3|sNELL blaupunkt2 Norrland-WaHoO maccan Ben---- aimD aLTOR EVIG|Falken nilsso bamstAr aGona`scalper reign[m4]n inzejN|ZoneX imag1ne a^meda|EYIE conejito puhaaa clime dsp123 mario_o bRRRA litextra|wezy TG|SaTaN Mando Weiche- wezzan :port80c.se.quakenet.org 353 matricks_ = #pcw :Labe mp`serve soulK [V]Gudiikzt4r XampeD fs\dcube TrolleRovarN Emptyy SG-daskep0t Byssan Bernts1 SG|YAhoo KOKKA rL`SnowZen^ hIGHTECH__ aPPeLk4k4n otto^_ backs`wouL DeaGJIa mONGOLOJD|kree xekafutuwu uris vagrant ^a^cklet neaK-spiN nozter Arve S0oker GotticH pr0n^ traff`mElissA BC|Kebab2000 CipRi andor-- barbara- traff`lizze harserver3on3 RalleTruss EAES EKEMAN Cowafuckingdogk superlime LokY Hockey-Syvve Gigi qk-WyverN Larsito spendex eiviN und`feelme :port80c.se.quakenet.org 353 matricks_ = #pcw :aderblasu yHYSS Cmore WaskE lodiz NachiMux Bodde kiiM Claddy TTAgital soker2on2plz mixzxz TmY- KrabbateN HAKKAKDGK VarsKo^aW Fuzak GZ`Kirra^^ mhaji Full|Hytra saxy0z0z0z Akapulka|urban CaZzpeR DarkLink FALLE- AmoZ mADSEN inetpro asd1 [100fps]elgit0 loltih GOLIATH`JONKAN sn1tch_4qs ischi87 Wazee LLLgHOST Derotti flw mandis daskdkad BlixteN_OFF Mjada-Hickdead Eazy-game|pAjk DulleN Sp3karn aimstar^mWd voffsi asdas Keo-muAz Liviu^^ vLaNskyldig :port80c.se.quakenet.org 353 matricks_ = #pcw :sdfgdfg [4]bappo polackn [42]xeelol basseeee LuppaN eSport|RoxoR Heat2 Helgon`KEXITAN vaxxus|kY kaarel_ i-Link`Slobbo DazOFF Lectra`VolveR [51N19E]Mdr NFTS_aptand pd\cilleh wirram Ag- kn1^ROSA Nixt0n @Josi berrtill mikl ut|brbr LoLiz3N Ishootudie HaGa1 Tetrispro|Veloc Stilig firin Local`Bhz goodR N-Bot GangstA^Niise CLOCKK MaGeN churru` tB-SidW playm8|DjwaNdz PenisPasta sbd-phuntanN Sh4cky vED kimpann mylvis ville_12345678 MeLL^-Q sio\chaez :port80c.se.quakenet.org 353 matricks_ = #pcw :PLAYER|ZOMG KappeZ^ pennpenn FatzoooO Snark^ Laakko FreddaN zure fiSKen vaccA[cx] Beart FD|Phoenix latrviabaatvik saffu tveka`StiKo HubbaBubbaBoyz q5^n3imad RETARDED pLym|Muffe GYG|RagnarssoN rF|neddemIRC HydrOO ollee sliff Eaten_Alive bollih\away fisarn Fanboyz\qcube Oish Da5|Poppo brottare mHz\xAantic [blueprint|Sn] SneZ WarQ|TriZ^ webcore|R3D95 rubeiiin`1st elius j0mppe- Zwoltex hebbe lallala vAH_ cp^traxzzlol Kung-Fonz Sprattelvatten inzejn[M] :port80c.se.quakenet.org 353 matricks_ = #pcw :IR|psN backs`Fester Linus CreEckDeztrox _hillztaah IrLo bissen jonjonjon giant^da princip-xtinct smaakskcake [P]use ZerOSh00TS WarQ|Mathilda [P]nikkz sEasiun N43-PuNKy PuttEE Sp|SaLo^| zErios Klerburgare Silikon|Laxen e`zejN hejkanin Zien volvers promizer yewlar HeJ_hEj`aw jeakk rilleh x1ofdewm Swift^ Infinit3 RattiSorsa Ludvika|keken `m1r0n robbagg PillaD-Goss3N Apa`MAx |1g|LegoBilen Ainish [EN]Xanti aviad- puFFFin hejbabuirabakal Hodja WildHead :port80c.se.quakenet.org 353 matricks_ = #pcw :Lo2P VadeHs|FortFarN Bollhuvve ebayer BEckzOFF Gonzo9014 DarkmindTheGrea trwon nena_ skillbill TpN-Rille^OFF Apl- zune[N] matsinyyyy spyyr stkiih MOSSEN Mathiaz dot222222222 MUFFINN DIMMamxxx xtinct BANZAI|Unders siCKO^^ ALEXMAN GM95 PinkDeagle Chlebo WiNk0 NITR0 Mykos Immortal-King Brodda inzejN|TiGeR Jaaanpoo GZ`SneLF |Ahoehoe R4mzi sadasda FoSho zOOM^ HEHEO2 princip-HermiN^ SUPERFASTTEC yohanseN n23|folieN-_- muffins crakkiz tmd-vdF Ello^ :port80c.se.quakenet.org 353 matricks_ = #pcw :WOTS|christian |F|6|F|Volle Sp4rv3N Nibbler|LAN BVG|Anonim HENNING Local`sNl ifektO whipee\ vaxxus|gtv cL\\ninjaaraben r4jz_- vaxxus|nIc vaxxus|aVd Beastie^ Meier bjarne-_-12 Kalhygge|aBc inspet nuLLifY zlF BLAN|sUPERJAK biggy flon-sebbe fjurtis-otrolig Kalhygge|naXo Playgr0und Bamsar^Bwhl Kalhygge|meXA Kindow sylta pZi paraL^Deja BlasTmaN-tB deeh` [5b]CW|maxii AceDude_- LG^Panik GoA-Het^y|OFF sTr1nG^AFK zxn^off denbette^BNC ZoniX^Off LG^bruzken :port80c.se.quakenet.org 353 matricks_ = #pcw :Zip^BNC ANONZOFF c`FoOjegerOff Ordspil^afk zanoJ-off bakhoj^off VeLuX^BNC p-zkarp Error404 Nivius^^ DP^OFF|SILENTY VICKY SkytteNOFF nAz JC|RedeTeZ^BNC hooligan`away Splutt|BNC svennjeavlnOFF aNTWAn CB|knubbiz-`AWA bliztr NB|freq[N] kOllEH deML|StoLeN\OFF DOED|EnRIz erN^BNC^AW jompa Cha0tix^OFF Pinstrup-off wolves-munkaway skoogan airhead^OFF Jeffie D5|Lindahl^OFF onaqui skinK aNders|BNC KadaveR^ valtsu_ sledz[aw] Cryptztahh`off FleexOFF stycket :port80c.se.quakenet.org 353 matricks_ = #pcw :xGx_kmn^off WC anto_o GAndroo^aw schmaCk|icko lyngordon wUULF tX|Dzenan dERG0 chansurf HW|eriksson SG|Hornet xTz`ReXor^off_ syn4psE catsie skize Hezxy tomater HildaOFF nEXIN-tirre [NeutroN] ^sne WoA|dfish xTz`xNitroX^off exero koiz drastic`aVoid Checky_OFF Graxor LinusOFF_ nesc|Meibi` crezz eLiaZ unrea CharlieE eco`nejked tompA^ exp3rt Moejoe FloraCs|Aora Kalhygge|z1 iksO fake[n]ick FloraCsAora inzejN|Jonse ZoRoXo FD|tVEKA XMG\Gngs brrave^Borta :port80c.se.quakenet.org 353 matricks_ = #pcw :aLpi-AtroOFF mustafakrister PEWPEW MiRRE`OFFLiNE Mixxarna-WejK^ gP|Deex cAD-BNC1 tomh BnCinzejn henka snacjsar EnE|vilsN TixoNBnc shifty|ossi WSOP|fredada MortenSoccer kiimpan [E]Polle^ doke muuuie Androoz SIXO wtai|tryckveard [sc]-falle Tele\weRRe`OFF Martin_- annette-away iGwtRealT3cH gUsk smekarn Onttu xVera`kreeeeee Somppiaeae LasseMan [SS]BoZo inzejn[A] HR|WINESY ^^juh0^^ BYS`vojnik nejmzah Sh1ft-_- Thunder-str R22du sankan DDark MtM PlayN-ziNk^Aw :port80c.se.quakenet.org 353 matricks_ = #pcw :pd|firren GROSSER LIMEDNULKE HellkaN Mattan tzeron`g0ne Mr-Zorky HoD-Espen BAdhBNC ahlt ramoneur roxon_ dOFF`bth WcG|memphis Jules_ Hye Toot Justicia hajpad-Ante Fia`T8im e5g-Re\FILM hjort iNet\fjollabero Jeespoks SH|Thonk ztar`oFF Widow[away] mj\away CheatoN^BNC LAPPHOREoff dO`esn paal`aw Prayon emFFF zeLo FluBBa dalleBNC aTer waah|off kdo^ C_OFFE Dynis|AWAY miniwolbc BpN^away ReF^Zzz kyAx-OFF therazorsedge vT-viggolito CaLm[mC] Fredde^ acuBNC :port80c.se.quakenet.org 353 matricks_ = #pcw :Xipho|HollyWood _ArvedssoN^BNC Rayan Mastodonten kempa Blizo`bnc SnIpa Suspected`Bnc1 Neftus dO`RadeoN Madicken daniel123 D-Line|m00jsi osbnc2 AWskian quality`BNC2 inzite`chad CHiLLiPiLl^bnc swaftan QlintoN iTouch|LundiN vandalizm Qslig[FM] makke Tele\wHomp^bnc steamacc4sale Playbackvxo asiQ^BNC Cash-Flow deniiX ITFYTD olssonn nehyd [421]Bihaz- CrilleeOFF elicious`wE111A sndOFF`Ass_slac kusn Myscobnc shade`nu [1Ramlosa] j1m1bnc TPI-piggerN :port80c.se.quakenet.org 353 matricks_ = #pcw :gedis`AFK mX|Ximer3`BNC Rofel Std samhOFF tG`JeBuu roxz peace`zwa _jacce dRELL tetta bubbenBNC`[GA] __viktor ture frell newbcake k00HOOHO-- makkan Bihaz_- joacim _simon sajje1995 emf|zupppiyoyoy elixyr forfam|bOFF elitasson _sockan Gulle der-Andy RexorN NER|M0wz`aw n0pL_OFF AdamBNC kRIIL falCoOFF ajz antein splexan DNX Team-Unic_bnc2 Team-Unic_bnc1 Team-dH^Jacki3 |F|6|F|Penelo SCUMMY-OFF goL|GustiS^away koppar MartinsBNC xANIZ\bnc chilLboY :port80c.se.quakenet.org 353 matricks_ = #pcw :Erik2son powerbnc2 Nizer Qeamer tobiasmatss swsBNC `Tobb Pyret Gv\MortiOFF aTschi xamber123 _borre boeka`kankeOFF reaction-bnc1 wiggan Zenhto TUX|ximmy hariiss HS|JagaleX^Offl ohm-bnc4 Iam hawkztr wibbaan Stamina\Proteus rME st4rl\heawen cursed-^^ _LarssoN_ Empis KnaspeR freez Deja-OFF QseBNC ninjaFREDDE ReTrez^Bnc^Away Divid0 mosklubba XnoW MozzyOFF mZ`Freddy Kladden^bnc alkh`aw Prood nIIICKOOOOO CR^SquierBNC H9jE^ b`hoffenOFF grikko sevonOFF :port80c.se.quakenet.org 353 matricks_ = #pcw :Vexey avdunkad Rizley razzz BJARTMAR PlayHardGoFat Bubstah Gaffel [imbaOFF]sajkez mooaern emric Znap Hyso[csP] Kvasten^-off @Fabi Ind`laaKen amsrOFF Stamina\Achtung aceit\MorianA- c^KNDOO DAJMEN`AW runpuff Drunke fisken10 Let_It_Whip Poxi boeka`zeppOFF bodil avlid^bnc markisen`bnc qurry oBiee PZ|FiC-Aw Jonirl_gone luttman _micro Cr33d^Away Anderss^OFF rasmus11 axl0n17 pAjk Vibban\OFF zAt-off `tyrantBNC HB`off|djnatnat mP`off|Redfir3 TS|kolben_afk :port80c.se.quakenet.org 353 matricks_ = #pcw :Manual\AFK mP`off|Redbot RetardacE ewh`FL1NK\away TaeferN`aw Divan^KaLa^BNC Divan^myRan^BNC DUMBASS`BNC sudden21 Cyber`Mnisaway [BFF]-REeLexX AEEEEEEEEEEEEEE ZMLB-Odis deaf-cs|Lille Ninjan` bojer^off freaKKKy_BNC Replay` GuFFe D3nim smn-_- jerry[bnc] D`timex a5\eqiNawaY inviz maRkN_ Brodda^SKOLAN zG|CBB^Off TisPik_off AFK^[TC]pvp chiva0FF hughi-off amokz^BNC SteelpliX^BNC Bioonic nIELSENoFF OFF|fZoe OliverL2`AWAY babb Chuck_N SNOEN^OFF [CYBER]niijaz :port80c.se.quakenet.org 353 matricks_ = #pcw :LilleGris^BnC zG|Flod__ \lEGO`OFF LinusOFF SaX`Gubbi`OFF kolmio m|Smith Mitt3 iluen haMp gDesigns Reb_6ff blank|tox^off Unf[BNC]JLS SYNTEK|bArk FJERLEND PerSpelmann toXq` ieS|make`away pwang12 wajk\aw InV^Raccoon-OFF ComsyS ElakSomFan^^ @m3z @pimpo @MYM|Muesli`off ADAMeh^zzzz DLM^b1ue^Off Hootarn croz kylan_off ing\\tsabNC Offson n1mez`off spanier^off dieNasty`brb [D]Bamb DKB|Night[oFF] Basket-off xS|HeliuM Hardcorehilda attixoff thorr_ minib :port80c.se.quakenet.org 353 matricks_ = #pcw :rwn ironic|Haunted khalannz PCW-Poker spitz Hiippari- iMrClean C5|Jakobervaek Casa`berssaBNC gamer`away myNKOFF Tjalfeen^off_ ^cooling noisi-a-way JennaDD mySKi-[a]ngeh mav0FF sanoj\ dicti KLADDIS`AWAY OFF|ShAmOnE dollface WoC^RuFi selo|elloAFK LnC-Kezse kn1^Mole__ haVec- BorgareN^ steddan Verga PawP SAAAID onemind`xent dyfu`viciouz Ice`OFF_ kEbAbMaNnEn gamax|luN_ guragoa`off xorTon Kirka bruikki SkarvaNOFF empton nessaia|noHn-OF iNet\xerp :port80c.se.quakenet.org 353 matricks_ = #pcw :]5[kbz tjaeder sulaN^OFFLAJN Relayish mr-o oxido drulen CR1M3Z^off_ ziNx` Local`MickeMann deaf-cs|Brajen cL\\ninjaBNC tomh^soet eriik^ Carn4tioN`away Rapt0r KAAAALLLEE`BNC raY^^ aNnaa` ^apan LpY|p0sh[kol] dempAWAY zuxen\OFF aztro ToggeN [A1]No_52 [A1]etuxia Jusa Playm|DjToppi- Bodoom BCS^OFF|mkiss skau ThumbSucker^BNC tOFF-FuSe fnpOFF|aes ^SlappFisa^ Bhz`OFF Unf[BNC]Lion b00z\away Raised|ProBlem [A]fittb extinct`zake blike|AplE`oFF eNtiC MeLLKeR :port80c.se.quakenet.org 353 matricks_ = #pcw :SNELHEST Nexo rkO`aw zG|Numse_ Maff n9way|mIkLo bEnz SpiderA _cgx GZ`cAD RICK1DAH fun|Skippsen INFAME|eRIKa\aw SS|xtinqt _mys|da HolySmoke Rq hoorai\naolein qutip mYth|schnaLz_M rengo`off aRa|Voilala^Off skilleAWAY BCS^OFF|dexer @FSHost-com aeom`away tvekaOFF`haMME Smog^ PartyPoker Sp|SpeTLighT^OF [Fixx]Olle sIMMe`offline panik_herman avu\partz0r rekyL^_- BCS^OFF|AMPARI Fluen^BNC Wkd^off eXm-SunnY^ ^hej Kniks DiXeR`off rfwdm_ TPI_piggerN_ Mataza|off :port80c.se.quakenet.org 353 matricks_ = #pcw :epzBNC Ampro @hardstep goL|craJpAW WwG-Muste E|Evil^off MADREFLEX`rhZ adde` Crazy^SpexXI Jerker alq-andreA H1Xer aGILITY`POLYMOX Joker^BNC Mohkis [LEGE]HeJLeN^ Caprice Intgen`BAERB{J} VILLIG-7thAWAY Neehajd`BNC Batti LewfeN^Off Ravnn sky\bangz0ff`` SkenaN^bnc GladPanda fausti pittins^BNC SaX|f|Gubbi^ rM|pIx^^ Rms- RANGERBOY`aw FixxeR^ Edvnz uga BoSS|Benal`BNC sjonasm8k PND\s humpyskump SKOVDE|Snasi @HighTech @spam-scan @S @Q @[-hoorai-] STEN11 :port80c.se.quakenet.org 353 matricks_ = #pcw :Voteski xP|Puhbaer^off Yoshi_ CWE`Flippen CeveRR [ShaKa]CoOoL`AW h3h3 LnC-iNZANEoff_ Wu-djaoff Zerooo Pieper_ chica`SanziLOFF BB4FRAGS|XTM`A limespOFF`malle oPS|JBbnc staphe G`Quix NItron\bnc c55-feros hejx HighG`wdE_OFF eco`zN Myt willybob`bnc Rh-G^TippeR^ JUHP-BNC|Jumert mthz Moldskred MxG\\MailBoX MeejtAWAY [c]eKipz dkz`xfx zaped`off ptrNo_OFF Jeamu c`Crelle-R^off rew`away Ak-87^ TOOOMMY\off L2D_-_Rappi Ghost^BNC _AraCi SKytteN^ ^StoKer^ :port80c.se.quakenet.org 353 matricks_ = #pcw :zNei mYth|LucK3r n-N|TarriC poohi hamasbnc Coutz1 Char|ieBoY AZ^LEVING-BNC plike^HuliaN___ uR`saniOFF Gtrip|Hebo`OFF Redical`Score IceBlu EvilEye_bnc maaxi`off [AWAY]Darkling Noobet|StajOFF bjarne-_- zG|Eriksen^Off venom^off mHuen utini_off eveni\OFF Xqe MefistoFX`oFF bas-off|f4me TRiCK`iDfye MAAUNS CamiK^ GrQnaerten blike|amns`oFF sandersan Lt`HipPus Mossepo siOFF \zimze`BNC R33t Gs\BaZe^OFF zaney drateR^OFF Free1337 off|Hunter ifrit apfelmus :port80c.se.quakenet.org 353 matricks_ = #pcw :eu-off|Blade jfl-oFF`miD Uniline charlie` painkiller`kool OFF|ShOcK telk0^BNC gh|jack^off EX-adrin^bnc w\Hairboi osfa|puddy^off CruisE-OFF- [A1]EnGud kungeeN^^ CMAX|[m]addilo Sk-off|MichYs9N NTL-Sentinal Tjalfuglen^off KapteWN`BNC cichlide^AWAY ChomP`away paltieBNC^[cz] WGV|PwnZ^Off pidde-_- TELETUBBIE Ecka fazer|NoxtrnOFF Lolad-net^ diRectAWAY evil|parasite xultRoNaw genics^BNC steri`off RaliAWAY oxid`zsiltsoff xazury`bnc IRLHELTEN r0ntti :port80c.se.quakenet.org 353 matricks_ = #pcw :searon_ Saturn` Nimra jOHNSONN KegleN^AFK JC|PlaNke d4NNY`0fflajn MuGGe^Bnc _4P|StyLish^bnc s8`swinnnk Jackkis F`off`NickyH F5_rakkeeee Thuriaz inzym Moriz edom z1ax^0FFL1NE eXm-nex0r|bNc unstuck|L- aimstyle`vzn\a Gaylorden WrD ShadowOfAMaN gh|8Ball^off Retard-- SAGG-Lipton backyard\KoWORK awaylen BCS^OFF|Pipe TPI`Ferro fredde` xeet_ BlaZe180 Macan_ biblas^BNC Cyeclone Vali[away] BK|awayman armoryh oKend _cB-Us3-Bnc_ Kefir [nerd]Kurr3 teeworlds-0.6.2+dfsg/scripts/png.py0000644000175000017500000000504212140200333016260 0ustar felixfeliximport struct, zlib, sys class image: w = 0 h = 0 data = [] def read_tga(f): image = f.read() img_type = struct.unpack("")[0] #if not "/" in include_file: # checker.Error("%s is not allowed" % include_file) elif '"' in line: include_file = line.split('"')[1] #print include_file if include_file in self.disallowed_headers: checker.Error("%s is not allowed" % include_file) class HeaderGuardChecker(Checker): def CheckStart(self, checker, filename): self.check = ".h" in filename self.guard = "#ifndef " + filename[4:].replace("/", "_").replace(".hpp", "").replace(".h", "").upper() + "_H" def CheckLine(self, checker, line): if self.check: #if "#" in line: self.check = False #if not self.check: if line.strip() == self.guard: pass else: checker.Error("malformed or missing header guard. Should be '%s'" % self.guard) class CommentChecker(Checker): def CheckLine(self, checker, line): if line.strip()[-2:] == "*/" and "/*" in line: checker.Error("single line multiline comment") class FileChecker: def __init__(self): self.checkers = [] self.checkers += [FilenameExtentionChecker()] self.checkers += [HeaderGuardChecker()] self.checkers += [IncludeChecker()] self.checkers += [CommentChecker()] def Error(self, errormessage): self.current_errors += [(self.current_line, errormessage)] def CheckLine(self, line): for c in self.checkers: c.CheckLine(self, line) return True def CheckFile(self, filename): self.current_file = filename self.current_line = 0 self.current_errors = [] for c in self.checkers: c.CheckStart(self, filename) for line in file(filename).readlines(): self.current_line += 1 if "ignore_check" in line: continue self.CheckLine(line) for c in self.checkers: c.CheckEnd(self) def GetErrors(self): return self.current_errors def cstrip(lines): d = "" for l in lines: if "ignore_convention" in l: continue l = re.sub("^[\t ]*#.*", "", l) l = re.sub("//.*", "", l) l = re.sub('\".*?\"', '"String"', l) # remove strings d += l.strip() + " " d = re.sub('\/\*.*?\*\/', "", d) # remove /* */ comments d = d.replace("\t", " ") # tab to space d = re.sub(" *", " ", d) # remove double spaces #d = re.sub("", "", d) # remove /* */ comments d = d.strip() # this eats up cases like 'n {' i = 1 while i < len(d)-2: if d[i] == ' ': if not (d[i-1] in alphanum and d[i+1] in alphanum): d = d[:i] + d[i+1:] i += 1 return d #def stripstrings(data): # return re.sub('\".*?\"', 'STRING', data) def get_identifiers(data): idents = {} data = " "+data+" " regexp = re.compile("[^a-zA-Z0-9_][a-zA-Z_][a-zA-Z0-9_]+[^a-zA-Z0-9_]") start = 0 while 1: m = regexp.search(data, start) if m == None: break start = m.end()-1 name = data[m.start()+1:m.end()-1] if name in idents: idents[name] += 1 else: idents[name] = 1 return idents grand_total = 0 grand_offenders = 0 gen_html = 1 if gen_html: print "" print '' print "" print "" print '

' print '
' print 'teeworlds logo' print '
' print '' print '
 
' print '
' print '
' print '

' print '

Code Refactoring Progress

' print '''This is generated by a script that find identifiers in the code that doesn't conform to the code standard. Right now it only shows headers because they need to be fixed before we can do the rest of the source. This is a ROUGH estimate of the progress''' print '

' print '

' print '' #print "" line_order = 1 total_files = 0 complete_files = 0 total_errors = 0 for (root,dirs,files) in os.walk("src"): for filename in files: filename = os.path.join(root, filename) if "/." in filename or "/external/" in filename or "/base/" in filename or "/generated/" in filename: continue if "src/osxlaunch/client.h" in filename: # ignore this file, ObjC file continue if "e_config_variables.h" in filename: # ignore config files continue if "src/game/variables.hpp" in filename: # ignore config files continue if not (".hpp" in filename or ".h" in filename or ".cpp" in filename): continue #total_files += 1 #if not "src/engine/client/ec_client.cpp" in filename: # continue f = FileChecker() f.CheckFile(filename) num_errors = len(f.GetErrors()) total_errors += num_errors if num_errors: print '' % (filename, num_errors), for line, msg in f.GetErrors(): print '' % (line, msg) #print '
%#FileOffenders
%s, %d errors
%d%s
' #GetErrors() if 0: text = cstrip(file(filename).readlines()) # remove all preprocessor stuff and comments #text = stripstrings(text) # remove strings (does not solve all cases however) #print text idents = get_identifiers(text) offenders = 0 total = 0 offender_list = {} for name in idents: #print name if len(name) <= 2: # skip things that are too small continue if name in cpp_keywords: # skip keywords continue if name in allowed_words: # skip allowed keywords continue total += idents[name] if name != name.lower(): # strip names that are not only lower case continue offender_list[name] = idents[name] if not gen_html: print "[%d] %s"%(idents[name], name) offenders += idents[name] grand_total += total grand_offenders += offenders if total == 0: total = 1 line_order = -line_order done = int((1-(offenders / float(total))) * 100) if done == 100: complete_files += 1 if done != 100 and gen_html: color = "#ffa0a0" if done > 20: color = "#ffd080" if done > 50: color = "#ffff80" if done > 75: color = "#e0ff80" if done == 100: color = "#80ff80" line_color = "#f0efd5" if line_order > 0: line_color = "#ffffff" offender_string = "" count = 0 for name in offender_list: count += 1 offender_string += "[%d]%s " % (offender_list[name], name) if count%5 == 0: offender_string += "
" print '' % line_color, print '' % (color, done, offenders, filename), print '' % offender_string print "" count = 0 if gen_html: print "
%d%%%d%s%s
" print "

%d errors

" % total_errors if 0: print "

%.1f%% Identifiers done

" % ((1-(grand_offenders / float(grand_total))) * 100) print "%d left of %d" % (grand_offenders, grand_total) print "

%.1f%% Files done

" % ((complete_files / float(total_files)) * 100) print "%d left of %d" % (total_files-complete_files, total_files) print "

" print "
" print '
' print '
' print '
 
' print '
' print "" teeworlds-0.6.2+dfsg/scripts/tw_api.py0000644000175000017500000001442712140200333016766 0ustar felixfelix# coding: utf-8 from socket import * import struct import sys import threading import time NUM_MASTERSERVERS = 4 MASTERSERVER_PORT = 8300 TIMEOUT = 2 SERVERTYPE_NORMAL = 0 SERVERTYPE_LEGACY = 1 PACKET_GETLIST = "\x20\x00\x00\x00\x00\x00\xff\xff\xff\xffreqt" PACKET_GETLIST2 = "\x20\x00\x00\x00\x00\x00\xff\xff\xff\xffreq2" PACKET_GETINFO = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgief" PACKET_GETINFO2 = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgie2" + "\x00" PACKET_GETINFO3 = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffgie3" + "\x00" class Server_Info(threading.Thread): def __init__(self, address, type): self.address = address self.type = type self.finished = False threading.Thread.__init__(self, target = self.run) def run(self): self.info = None if self.type == SERVERTYPE_NORMAL: self.info = get_server_info3(self.address) elif self.type == SERVERTYPE_LEGACY: self.info = get_server_info(self.address) if self.info: self.info = get_server_info2(self.address) self.finished = True def get_server_info(address): try: sock = socket(AF_INET, SOCK_DGRAM) sock.settimeout(TIMEOUT); sock.sendto(PACKET_GETINFO, address) data, addr = sock.recvfrom(1024) sock.close() data = data[14:] # skip header slots = data.split("\x00") server_info = {} server_info["version"] = slots[0] server_info["name"] = slots[1] server_info["map"] = slots[2] server_info["gametype"] = slots[3] server_info["flags"] = int(slots[4]) server_info["progression"] = int(slots[5]) server_info["num_players"] = int(slots[6]) server_info["max_players"] = int(slots[7]) server_info["players"] = [] for i in xrange(0, server_info["num_players"]): player = {} player["name"] = slots[8+i*2] player["score"] = int(slots[8+i*2+1]) server_info["players"].append(player) return server_info except: sock.close() return None def get_server_info2(address): try: sock = socket(AF_INET, SOCK_DGRAM) sock.settimeout(TIMEOUT); sock.sendto(PACKET_GETINFO2, address) data, addr = sock.recvfrom(1024) sock.close() data = data[14:] # skip header slots = data.split("\x00") server_info = {} server_info["token"] = slots[0] server_info["version"] = slots[1] server_info["name"] = slots[2] server_info["map"] = slots[3] server_info["gametype"] = slots[4] server_info["flags"] = int(slots[5]) server_info["progression"] = int(slots[6]) server_info["num_players"] = int(slots[7]) server_info["max_players"] = int(slots[8]) server_info["players"] = [] for i in xrange(0, server_info["num_players"]): player = {} player["name"] = slots[9+i*2] player["score"] = int(slots[9+i*2+1]) server_info["players"].append(player) return server_info except: sock.close() return None def get_server_info3(address): try: sock = socket(AF_INET, SOCK_DGRAM) sock.settimeout(TIMEOUT); sock.sendto(PACKET_GETINFO3, address) data, addr = sock.recvfrom(1400) sock.close() data = data[14:] # skip header slots = data.split("\x00") server_info = {} server_info["token"] = slots[0] server_info["version"] = slots[1] server_info["name"] = slots[2] server_info["map"] = slots[3] server_info["gametype"] = slots[4] server_info["flags"] = int(slots[5]) server_info["num_players"] = int(slots[6]) server_info["max_players"] = int(slots[7]) server_info["num_clients"] = int(slots[8]) server_info["max_clients"] = int(slots[9]) server_info["players"] = [] for i in xrange(0, server_info["num_clients"]): player = {} player["name"] = slots[10+i*5] player["clan"] = slots[10+i*5+1] player["country"] = int(slots[10+i*5+2]) player["score"] = int(slots[10+i*5+3]) if int(slots[10+i*5+4]): player["player"] = True else: player["player"] = False server_info["players"].append(player) return server_info except: sock.close() return None class Master_Server_Info(threading.Thread): def __init__(self, address): self.address = address self.finished = False threading.Thread.__init__(self, target = self.run) def run(self): self.servers = get_list(self.address) + get_list2(self.address) self.finished = True def get_list(address): servers = [] try: sock = socket(AF_INET, SOCK_DGRAM) sock.settimeout(TIMEOUT) sock.sendto(PACKET_GETLIST, address) while 1: data, addr = sock.recvfrom(1024) data = data[14:] num_servers = len(data) / 6 for n in range(0, num_servers): ip = ".".join(map(str, map(ord, data[n*6:n*6+4]))) port = ord(data[n*6+5]) * 256 + ord(data[n*6+4]) servers += [[(ip, port), SERVERTYPE_LEGACY]] except: sock.close() return servers def get_list2(address): servers = [] try: sock = socket(AF_INET, SOCK_DGRAM) sock.settimeout(TIMEOUT) sock.sendto(PACKET_GETLIST2, address) while 1: data, addr = sock.recvfrom(1400) data = data[14:] num_servers = len(data) / 18 for n in range(0, num_servers): if data[n*18:n*18+12] == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff": ip = ".".join(map(str, map(ord, data[n*18+12:n*18+16]))) else: ip = ":".join(map(str, map(ord, data[n*18:n*18+16]))) port = (ord(data[n*18+16])<<8) + ord(data[n*18+17]) servers += [[(ip, port), SERVERTYPE_NORMAL]] except: sock.close() return servers master_servers = [] for i in range(1, NUM_MASTERSERVERS+1): m = Master_Server_Info(("master%d.teeworlds.com"%i, MASTERSERVER_PORT)) master_servers.append(m) m.start() time.sleep(0.001) # avoid issues servers = [] while len(master_servers) != 0: if master_servers[0].finished == True: if master_servers[0].servers: servers += master_servers[0].servers del master_servers[0] time.sleep(0.001) # be nice servers_info = [] print str(len(servers)) + " servers" for server in servers: s = Server_Info(server[0], server[1]) servers_info.append(s) s.start() time.sleep(0.001) # avoid issues num_players = 0 num_clients = 0 while len(servers_info) != 0: if servers_info[0].finished == True: if servers_info[0].info: num_players += servers_info[0].info["num_players"] if servers_info[0].type == SERVERTYPE_NORMAL: num_clients += servers_info[0].info["num_clients"] else: num_clients += servers_info[0].info["num_players"] del servers_info[0] time.sleep(0.001) # be nice print str(num_players) + " players and " + str(num_clients-num_players) + " spectators" teeworlds-0.6.2+dfsg/scripts/update_localization.py0000644000175000017500000000442212140200333021527 0ustar felixfeliximport os, re, sys match = re.search('(.*)/', sys.argv[0]) if match != None: os.chdir(match.group(1)) os.chdir('../') source_exts = [".c", ".cpp", ".h"] def parse_source(): stringtable = {} def process_line(line): if 'Localize("'.encode() in line: fields = line.split('Localize("'.encode(), 1)[1].split('"'.encode(), 1) stringtable[fields[0]] = "" process_line(fields[1]) for root, dirs, files in os.walk("src"): for name in files: filename = os.path.join(root, name) if os.sep + "external" + os.sep in filename: continue if filename[-2:] in source_exts or filename[-4:] in source_exts: for line in open(filename, "rb"): process_line(line) return stringtable def load_languagefile(filename): f = open(filename, "rb") lines = f.readlines() f.close() stringtable = {} for i in range(0, len(lines)-1): l = lines[i].strip() if len(l) and not l[0:1] == "=".encode() and not l[0:1] == "#".encode(): stringtable[l] = lines[i+1][3:].rstrip() return stringtable def generate_languagefile(outputfilename, srctable, loctable): f = open(outputfilename, "wb") num_items = 0 new_items = 0 old_items = 0 srctable_keys = [] for key in srctable: srctable_keys.append(key) srctable_keys.sort() content = "\n##### translated strings #####\n\n".encode() for k in srctable_keys: if k in loctable and len(loctable[k]): content += k + "\n== ".encode() + loctable[k] + "\n\n".encode() num_items += 1 content += "##### needs translation #####\n\n".encode() for k in srctable_keys: if not k in loctable or len(loctable[k]) == 0: content += k + "\n== \n\n".encode() num_items += 1 new_items += 1 content += "##### old translations #####\n\n".encode() for k in loctable: if not k in srctable: content += k + "\n== ".encode() + loctable[k] + "\n\n".encode() num_items += 1 old_items += 1 f.write(content) f.close() print("%-40s %8d %8d %8d" % (outputfilename, num_items, new_items, old_items)) srctable = parse_source() print("%-40s %8s %8s %8s" % ("filename", "total", "new", "old")) for filename in os.listdir("data/languages"): if not ".txt" in filename: continue if filename == "index.txt": continue filename = "data/languages/" + filename generate_languagefile(filename, srctable, load_languagefile(filename)) teeworlds-0.6.2+dfsg/src/0000755000175000017500000000000012140200333014221 5ustar felixfelixteeworlds-0.6.2+dfsg/src/base/0000755000175000017500000000000012140200333015133 5ustar felixfelixteeworlds-0.6.2+dfsg/src/base/detect.h0000644000175000017500000000757212140200333016567 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_DETECT_H #define BASE_DETECT_H /* this file detected the family, platform and architecture to compile for. */ /* platforms */ /* windows Family */ #if defined(WIN64) || defined(_WIN64) /* Hmm, is this IA64 or x86-64? */ #define CONF_FAMILY_WINDOWS 1 #define CONF_FAMILY_STRING "windows" #define CONF_PLATFORM_WIN64 1 #define CONF_PLATFORM_STRING "win64" #elif defined(WIN32) || defined(_WIN32) || defined(__CYGWIN32__) || defined(__MINGW32__) #define CONF_FAMILY_WINDOWS 1 #define CONF_FAMILY_STRING "windows" #define CONF_PLATFORM_WIN32 1 #define CONF_PLATFORM_STRING "win32" #endif /* unix family */ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #define CONF_FAMILY_UNIX 1 #define CONF_FAMILY_STRING "unix" #define CONF_PLATFORM_FREEBSD 1 #define CONF_PLATFORM_STRING "freebsd" #endif #if defined(__OpenBSD__) #define CONF_FAMILY_UNIX 1 #define CONF_FAMILY_STRING "unix" #define CONF_PLATFORM_OPENBSD 1 #define CONF_PLATFORM_STRING "openbsd" #endif #if defined(__LINUX__) || defined(__linux__) #define CONF_FAMILY_UNIX 1 #define CONF_FAMILY_STRING "unix" #define CONF_PLATFORM_LINUX 1 #define CONF_PLATFORM_STRING "linux" #endif #if defined(__GNU__) || defined(__gnu__) #define CONF_FAMILY_UNIX 1 #define CONF_FAMILY_STRING "unix" #define CONF_PLATFORM_HURD 1 #define CONF_PLATFORM_STRING "gnu" #endif #if defined(MACOSX) || defined(__APPLE__) || defined(__DARWIN__) #define CONF_FAMILY_UNIX 1 #define CONF_FAMILY_STRING "unix" #define CONF_PLATFORM_MACOSX 1 #define CONF_PLATFORM_STRING "macosx" #endif #if defined(__sun) #define CONF_FAMILY_UNIX 1 #define CONF_FAMILY_STRING "unix" #define CONF_PLATFORM_SOLARIS 1 #define CONF_PLATFORM_STRING "solaris" #endif /* beos family */ #if defined(__BeOS) || defined(__BEOS__) #define CONF_FAMILY_BEOS 1 #define CONF_FAMILY_STRING "beos" #define CONF_PLATFORM_BEOS 1 #define CONF_PLATFORM_STRING "beos" #endif /* use gcc endianness definitions when available */ #if defined(__GNUC__) && !defined(__APPLE__) && !defined(__MINGW32__) && !defined(__sun) #if defined(__FreeBSD__) || defined(__OpenBSD__) #include #else #include #endif #if __BYTE_ORDER == __LITTLE_ENDIAN #define CONF_ARCH_ENDIAN_LITTLE 1 #elif __BYTE_ORDER == __BIG_ENDIAN #define CONF_ARCH_ENDIAN_BIG 1 #endif #endif /* architectures */ #if defined(i386) || defined(__i386__) || defined(__x86__) || defined(CONF_PLATFORM_WIN32) #define CONF_ARCH_IA32 1 #define CONF_ARCH_STRING "ia32" #if !defined(CONF_ARCH_ENDIAN_LITTLE) && !defined(CONF_ARCH_ENDIAN_BIG) #define CONF_ARCH_ENDIAN_LITTLE 1 #endif #endif #if defined(__ia64__) || defined(_M_IA64) #define CONF_ARCH_IA64 1 #define CONF_ARCH_STRING "ia64" #if !defined(CONF_ARCH_ENDIAN_LITTLE) && !defined(CONF_ARCH_ENDIAN_BIG) #define CONF_ARCH_ENDIAN_LITTLE 1 #endif #endif #if defined(__amd64__) || defined(__x86_64__) || defined(_M_X64) #define CONF_ARCH_AMD64 1 #define CONF_ARCH_STRING "amd64" #if !defined(CONF_ARCH_ENDIAN_LITTLE) && !defined(CONF_ARCH_ENDIAN_BIG) #define CONF_ARCH_ENDIAN_LITTLE 1 #endif #endif #if defined(__powerpc__) || defined(__ppc__) #define CONF_ARCH_PPC 1 #define CONF_ARCH_STRING "ppc" #if !defined(CONF_ARCH_ENDIAN_LITTLE) && !defined(CONF_ARCH_ENDIAN_BIG) #define CONF_ARCH_ENDIAN_BIG 1 #endif #endif #if defined(__sparc__) #define CONF_ARCH_SPARC 1 #define CONF_ARCH_STRING "sparc" #if !defined(CONF_ARCH_ENDIAN_LITTLE) && !defined(CONF_ARCH_ENDIAN_BIG) #define CONF_ARCH_ENDIAN_BIG 1 #endif #endif #ifndef CONF_FAMILY_STRING #define CONF_FAMILY_STRING "unknown" #endif #ifndef CONF_PLATFORM_STRING #define CONF_PLATFORM_STRING "unknown" #endif #ifndef CONF_ARCH_STRING #define CONF_ARCH_STRING "unknown" #endif #endif teeworlds-0.6.2+dfsg/src/base/math.h0000644000175000017500000000274512140200333016245 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_MATH_H #define BASE_MATH_H #include template inline T clamp(T val, T min, T max) { if(val < min) return min; if(val > max) return max; return val; } inline float sign(float f) { return f<0.0f?-1.0f:1.0f; } inline int round(float f) { if(f > 0) return (int)(f+0.5f); return (int)(f-0.5f); } template inline T mix(const T a, const T b, TB amount) { return a + (b-a)*amount; } inline float frandom() { return rand()/(float)(RAND_MAX); } // float to fixed inline int f2fx(float v) { return (int)(v*(float)(1<<10)); } inline float fx2f(int v) { return v*(1.0f/(1<<10)); } inline int gcd(int a, int b) { while(b != 0) { int c = a % b; a = b; b = c; } return a; } class fxp { int value; public: void set(int v) { value = v; } int get() const { return value; } fxp &operator = (int v) { value = v<<10; return *this; } fxp &operator = (float v) { value = (int)(v*(float)(1<<10)); return *this; } operator float() const { return value/(float)(1<<10); } }; const float pi = 3.1415926535897932384626433f; template inline T min(T a, T b) { return a inline T max(T a, T b) { return a>b?a:b; } template inline T absolute(T a) { return a #include #include #include #include #include #include "system.h" #if defined(CONF_FAMILY_UNIX) #include #include /* unix net includes */ #include #include #include #include #include #include #include #include #include #include #include #if defined(CONF_PLATFORM_MACOSX) #include #endif #elif defined(CONF_FAMILY_WINDOWS) #define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x0501 /* required for mingw to get getaddrinfo to work */ #include #include #include #include #include #include #else #error NOT IMPLEMENTED #endif #if defined(CONF_PLATFORM_SOLARIS) #include #endif #if defined(__cplusplus) extern "C" { #endif IOHANDLE io_stdin() { return (IOHANDLE)stdin; } IOHANDLE io_stdout() { return (IOHANDLE)stdout; } IOHANDLE io_stderr() { return (IOHANDLE)stderr; } static DBG_LOGGER loggers[16]; static int num_loggers = 0; static NETSTATS network_stats = {0}; static MEMSTATS memory_stats = {0}; static NETSOCKET invalid_socket = {NETTYPE_INVALID, -1, -1}; void dbg_logger(DBG_LOGGER logger) { loggers[num_loggers++] = logger; } void dbg_assert_imp(const char *filename, int line, int test, const char *msg) { if(!test) { dbg_msg("assert", "%s(%d): %s", filename, line, msg); dbg_break(); } } void dbg_break() { *((volatile unsigned*)0) = 0x0; } void dbg_msg(const char *sys, const char *fmt, ...) { va_list args; char str[1024*4]; char *msg; int i, len; str_format(str, sizeof(str), "[%08x][%s]: ", (int)time(0), sys); len = strlen(str); msg = (char *)str + len; va_start(args, fmt); #if defined(CONF_FAMILY_WINDOWS) _vsnprintf(msg, sizeof(str)-len, fmt, args); #else vsnprintf(msg, sizeof(str)-len, fmt, args); #endif va_end(args); for(i = 0; i < num_loggers; i++) loggers[i](str); } static void logger_stdout(const char *line) { printf("%s\n", line); fflush(stdout); } static void logger_debugger(const char *line) { #if defined(CONF_FAMILY_WINDOWS) OutputDebugString(line); OutputDebugString("\n"); #endif } static IOHANDLE logfile = 0; static void logger_file(const char *line) { io_write(logfile, line, strlen(line)); io_write_newline(logfile); io_flush(logfile); } void dbg_logger_stdout() { dbg_logger(logger_stdout); } void dbg_logger_debugger() { dbg_logger(logger_debugger); } void dbg_logger_file(const char *filename) { logfile = io_open(filename, IOFLAG_WRITE); if(logfile) dbg_logger(logger_file); else dbg_msg("dbg/logger", "failed to open '%s' for logging", filename); } /* */ typedef struct MEMHEADER { const char *filename; int line; int size; struct MEMHEADER *prev; struct MEMHEADER *next; } MEMHEADER; typedef struct MEMTAIL { int guard; } MEMTAIL; static struct MEMHEADER *first = 0; static const int MEM_GUARD_VAL = 0xbaadc0de; void *mem_alloc_debug(const char *filename, int line, unsigned size, unsigned alignment) { /* TODO: fix alignment */ /* TODO: add debugging */ MEMTAIL *tail; MEMHEADER *header = (struct MEMHEADER *)malloc(size+sizeof(MEMHEADER)+sizeof(MEMTAIL)); dbg_assert(header != 0, "mem_alloc failure"); if(!header) return NULL; tail = (struct MEMTAIL *)(((char*)(header+1))+size); header->size = size; header->filename = filename; header->line = line; memory_stats.allocated += header->size; memory_stats.total_allocations++; memory_stats.active_allocations++; tail->guard = MEM_GUARD_VAL; header->prev = (MEMHEADER *)0; header->next = first; if(first) first->prev = header; first = header; /*dbg_msg("mem", "++ %p", header+1); */ return header+1; } void mem_free(void *p) { if(p) { MEMHEADER *header = (MEMHEADER *)p - 1; MEMTAIL *tail = (MEMTAIL *)(((char*)(header+1))+header->size); if(tail->guard != MEM_GUARD_VAL) dbg_msg("mem", "!! %p", p); /* dbg_msg("mem", "-- %p", p); */ memory_stats.allocated -= header->size; memory_stats.active_allocations--; if(header->prev) header->prev->next = header->next; else first = header->next; if(header->next) header->next->prev = header->prev; free(header); } } void mem_debug_dump(IOHANDLE file) { char buf[1024]; MEMHEADER *header = first; if(!file) file = io_open("memory.txt", IOFLAG_WRITE); if(file) { while(header) { str_format(buf, sizeof(buf), "%s(%d): %d", header->filename, header->line, header->size); io_write(file, buf, strlen(buf)); io_write_newline(file); header = header->next; } io_close(file); } } void mem_copy(void *dest, const void *source, unsigned size) { memcpy(dest, source, size); } void mem_move(void *dest, const void *source, unsigned size) { memmove(dest, source, size); } void mem_zero(void *block,unsigned size) { memset(block, 0, size); } int mem_check_imp() { MEMHEADER *header = first; while(header) { MEMTAIL *tail = (MEMTAIL *)(((char*)(header+1))+header->size); if(tail->guard != MEM_GUARD_VAL) { dbg_msg("mem", "Memory check failed at %s(%d): %d", header->filename, header->line, header->size); return 0; } header = header->next; } return 1; } IOHANDLE io_open(const char *filename, int flags) { if(flags == IOFLAG_READ) { #if defined(CONF_FAMILY_WINDOWS) // check for filename case sensitive WIN32_FIND_DATA finddata; HANDLE handle; int length; length = str_length(filename); if(!filename || !length || filename[length-1] == '\\') return 0x0; handle = FindFirstFile(filename, &finddata); if(handle == INVALID_HANDLE_VALUE) return 0x0; else if(str_comp(filename+length-str_length(finddata.cFileName), finddata.cFileName) != 0) { FindClose(handle); return 0x0; } FindClose(handle); #endif return (IOHANDLE)fopen(filename, "rb"); } if(flags == IOFLAG_WRITE) return (IOHANDLE)fopen(filename, "wb"); return 0x0; } unsigned io_read(IOHANDLE io, void *buffer, unsigned size) { return fread(buffer, 1, size, (FILE*)io); } unsigned io_skip(IOHANDLE io, int size) { fseek((FILE*)io, size, SEEK_CUR); return size; } int io_seek(IOHANDLE io, int offset, int origin) { int real_origin; switch(origin) { case IOSEEK_START: real_origin = SEEK_SET; break; case IOSEEK_CUR: real_origin = SEEK_CUR; break; case IOSEEK_END: real_origin = SEEK_END; break; default: return -1; } return fseek((FILE*)io, offset, real_origin); } long int io_tell(IOHANDLE io) { return ftell((FILE*)io); } long int io_length(IOHANDLE io) { long int length; io_seek(io, 0, IOSEEK_END); length = io_tell(io); io_seek(io, 0, IOSEEK_START); return length; } unsigned io_write(IOHANDLE io, const void *buffer, unsigned size) { return fwrite(buffer, 1, size, (FILE*)io); } unsigned io_write_newline(IOHANDLE io) { #if defined(CONF_FAMILY_WINDOWS) return fwrite("\r\n", 1, 2, (FILE*)io); #else return fwrite("\n", 1, 1, (FILE*)io); #endif } int io_close(IOHANDLE io) { fclose((FILE*)io); return 1; } int io_flush(IOHANDLE io) { fflush((FILE*)io); return 0; } void *thread_create(void (*threadfunc)(void *), void *u) { #if defined(CONF_FAMILY_UNIX) pthread_t id; pthread_create(&id, NULL, (void *(*)(void*))threadfunc, u); return (void*)id; #elif defined(CONF_FAMILY_WINDOWS) return CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadfunc, u, 0, NULL); #else #error not implemented #endif } void thread_wait(void *thread) { #if defined(CONF_FAMILY_UNIX) pthread_join((pthread_t)thread, NULL); #elif defined(CONF_FAMILY_WINDOWS) WaitForSingleObject((HANDLE)thread, INFINITE); #else #error not implemented #endif } void thread_destroy(void *thread) { #if defined(CONF_FAMILY_UNIX) void *r = 0; pthread_join((pthread_t)thread, &r); #else /*#error not implemented*/ #endif } void thread_yield() { #if defined(CONF_FAMILY_UNIX) sched_yield(); #elif defined(CONF_FAMILY_WINDOWS) Sleep(0); #else #error not implemented #endif } void thread_sleep(int milliseconds) { #if defined(CONF_FAMILY_UNIX) usleep(milliseconds*1000); #elif defined(CONF_FAMILY_WINDOWS) Sleep(milliseconds); #else #error not implemented #endif } void thread_detach(void *thread) { #if defined(CONF_FAMILY_UNIX) pthread_detach((pthread_t)(thread)); #elif defined(CONF_FAMILY_WINDOWS) CloseHandle(thread); #else #error not implemented #endif } #if defined(CONF_FAMILY_UNIX) typedef pthread_mutex_t LOCKINTERNAL; #elif defined(CONF_FAMILY_WINDOWS) typedef CRITICAL_SECTION LOCKINTERNAL; #else #error not implemented on this platform #endif LOCK lock_create() { LOCKINTERNAL *lock = (LOCKINTERNAL*)mem_alloc(sizeof(LOCKINTERNAL), 4); #if defined(CONF_FAMILY_UNIX) pthread_mutex_init(lock, 0x0); #elif defined(CONF_FAMILY_WINDOWS) InitializeCriticalSection((LPCRITICAL_SECTION)lock); #else #error not implemented on this platform #endif return (LOCK)lock; } void lock_destroy(LOCK lock) { #if defined(CONF_FAMILY_UNIX) pthread_mutex_destroy((LOCKINTERNAL *)lock); #elif defined(CONF_FAMILY_WINDOWS) DeleteCriticalSection((LPCRITICAL_SECTION)lock); #else #error not implemented on this platform #endif mem_free(lock); } int lock_try(LOCK lock) { #if defined(CONF_FAMILY_UNIX) return pthread_mutex_trylock((LOCKINTERNAL *)lock); #elif defined(CONF_FAMILY_WINDOWS) return !TryEnterCriticalSection((LPCRITICAL_SECTION)lock); #else #error not implemented on this platform #endif } void lock_wait(LOCK lock) { #if defined(CONF_FAMILY_UNIX) pthread_mutex_lock((LOCKINTERNAL *)lock); #elif defined(CONF_FAMILY_WINDOWS) EnterCriticalSection((LPCRITICAL_SECTION)lock); #else #error not implemented on this platform #endif } void lock_release(LOCK lock) { #if defined(CONF_FAMILY_UNIX) pthread_mutex_unlock((LOCKINTERNAL *)lock); #elif defined(CONF_FAMILY_WINDOWS) LeaveCriticalSection((LPCRITICAL_SECTION)lock); #else #error not implemented on this platform #endif } #if !defined(CONF_PLATFORM_MACOSX) #if defined(CONF_FAMILY_UNIX) void semaphore_init(SEMAPHORE *sem) { sem_init(sem, 0, 0); } void semaphore_wait(SEMAPHORE *sem) { sem_wait(sem); } void semaphore_signal(SEMAPHORE *sem) { sem_post(sem); } void semaphore_destroy(SEMAPHORE *sem) { sem_destroy(sem); } #elif defined(CONF_FAMILY_WINDOWS) void semaphore_init(SEMAPHORE *sem) { *sem = CreateSemaphore(0, 0, 10000, 0); } void semaphore_wait(SEMAPHORE *sem) { WaitForSingleObject((HANDLE)*sem, INFINITE); } void semaphore_signal(SEMAPHORE *sem) { ReleaseSemaphore((HANDLE)*sem, 1, NULL); } void semaphore_destroy(SEMAPHORE *sem) { CloseHandle((HANDLE)*sem); } #else #error not implemented on this platform #endif #endif /* ----- time ----- */ int64 time_get() { #if defined(CONF_FAMILY_UNIX) struct timeval val; gettimeofday(&val, NULL); return (int64)val.tv_sec*(int64)1000000+(int64)val.tv_usec; #elif defined(CONF_FAMILY_WINDOWS) static int64 last = 0; int64 t; QueryPerformanceCounter((PLARGE_INTEGER)&t); if(ttype != NETTYPE_IPV4) { dbg_msg("system", "couldn't convert NETADDR of type %d to ipv4", src->type); return; } dest->sin_family = AF_INET; dest->sin_port = htons(src->port); mem_copy(&dest->sin_addr.s_addr, src->ip, 4); } static void netaddr_to_sockaddr_in6(const NETADDR *src, struct sockaddr_in6 *dest) { mem_zero(dest, sizeof(struct sockaddr_in6)); if(src->type != NETTYPE_IPV6) { dbg_msg("system", "couldn't not convert NETADDR of type %d to ipv6", src->type); return; } dest->sin6_family = AF_INET6; dest->sin6_port = htons(src->port); mem_copy(&dest->sin6_addr.s6_addr, src->ip, 16); } static void sockaddr_to_netaddr(const struct sockaddr *src, NETADDR *dst) { if(src->sa_family == AF_INET) { mem_zero(dst, sizeof(NETADDR)); dst->type = NETTYPE_IPV4; dst->port = htons(((struct sockaddr_in*)src)->sin_port); mem_copy(dst->ip, &((struct sockaddr_in*)src)->sin_addr.s_addr, 4); } else if(src->sa_family == AF_INET6) { mem_zero(dst, sizeof(NETADDR)); dst->type = NETTYPE_IPV6; dst->port = htons(((struct sockaddr_in6*)src)->sin6_port); mem_copy(dst->ip, &((struct sockaddr_in6*)src)->sin6_addr.s6_addr, 16); } else { mem_zero(dst, sizeof(struct sockaddr)); dbg_msg("system", "couldn't convert sockaddr of family %d", src->sa_family); } } int net_addr_comp(const NETADDR *a, const NETADDR *b) { return mem_comp(a, b, sizeof(NETADDR)); } void net_addr_str(const NETADDR *addr, char *string, int max_length, int add_port) { if(addr->type == NETTYPE_IPV4) { if(add_port != 0) str_format(string, max_length, "%d.%d.%d.%d:%d", addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], addr->port); else str_format(string, max_length, "%d.%d.%d.%d", addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3]); } else if(addr->type == NETTYPE_IPV6) { if(add_port != 0) str_format(string, max_length, "[%x:%x:%x:%x:%x:%x:%x:%x]:%d", (addr->ip[0]<<8)|addr->ip[1], (addr->ip[2]<<8)|addr->ip[3], (addr->ip[4]<<8)|addr->ip[5], (addr->ip[6]<<8)|addr->ip[7], (addr->ip[8]<<8)|addr->ip[9], (addr->ip[10]<<8)|addr->ip[11], (addr->ip[12]<<8)|addr->ip[13], (addr->ip[14]<<8)|addr->ip[15], addr->port); else str_format(string, max_length, "[%x:%x:%x:%x:%x:%x:%x:%x]", (addr->ip[0]<<8)|addr->ip[1], (addr->ip[2]<<8)|addr->ip[3], (addr->ip[4]<<8)|addr->ip[5], (addr->ip[6]<<8)|addr->ip[7], (addr->ip[8]<<8)|addr->ip[9], (addr->ip[10]<<8)|addr->ip[11], (addr->ip[12]<<8)|addr->ip[13], (addr->ip[14]<<8)|addr->ip[15]); } else str_format(string, max_length, "unknown type %d", addr->type); } static int priv_net_extract(const char *hostname, char *host, int max_host, int *port) { int i; *port = 0; host[0] = 0; if(hostname[0] == '[') { // ipv6 mode for(i = 1; i < max_host && hostname[i] && hostname[i] != ']'; i++) host[i-1] = hostname[i]; host[i-1] = 0; if(hostname[i] != ']') // malformatted return -1; i++; if(hostname[i] == ':') *port = atol(hostname+i+1); } else { // generic mode (ipv4, hostname etc) for(i = 0; i < max_host-1 && hostname[i] && hostname[i] != ':'; i++) host[i] = hostname[i]; host[i] = 0; if(hostname[i] == ':') *port = atol(hostname+i+1); } return 0; } int net_host_lookup(const char *hostname, NETADDR *addr, int types) { struct addrinfo hints; struct addrinfo *result; int e; char host[256]; int port = 0; if(priv_net_extract(hostname, host, sizeof(host), &port)) return -1; /* dbg_msg("host lookup", "host='%s' port=%d %d", host, port, types); */ mem_zero(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; if(types == NETTYPE_IPV4) hints.ai_family = AF_INET; else if(types == NETTYPE_IPV6) hints.ai_family = AF_INET6; e = getaddrinfo(host, NULL, &hints, &result); if(e != 0 || !result) return -1; sockaddr_to_netaddr(result->ai_addr, addr); freeaddrinfo(result); addr->port = port; return 0; } static int parse_int(int *out, const char **str) { int i = 0; *out = 0; if(**str < '0' || **str > '9') return -1; i = **str - '0'; (*str)++; while(1) { if(**str < '0' || **str > '9') { *out = i; return 0; } i = (i*10) + (**str - '0'); (*str)++; } return 0; } static int parse_char(char c, const char **str) { if(**str != c) return -1; (*str)++; return 0; } static int parse_uint8(unsigned char *out, const char **str) { int i; if(parse_int(&i, str) != 0) return -1; if(i < 0 || i > 0xff) return -1; *out = i; return 0; } static int parse_uint16(unsigned short *out, const char **str) { int i; if(parse_int(&i, str) != 0) return -1; if(i < 0 || i > 0xffff) return -1; *out = i; return 0; } int net_addr_from_str(NETADDR *addr, const char *string) { const char *str = string; mem_zero(addr, sizeof(NETADDR)); if(str[0] == '[') { /* ipv6 */ struct sockaddr_in6 sa6; char buf[128]; int i; str++; for(i = 0; i < 127 && str[i] && str[i] != ']'; i++) buf[i] = str[i]; buf[i] = 0; str += i; #if defined(CONF_FAMILY_WINDOWS) { int size; sa6.sin6_family = AF_INET6; size = (int)sizeof(sa6); if(WSAStringToAddress(buf, AF_INET6, NULL, (struct sockaddr *)&sa6, &size) != 0) return -1; } #else if(inet_pton(AF_INET6, buf, &sa6) != 1) return -1; #endif sockaddr_to_netaddr((struct sockaddr *)&sa6, addr); if(*str == ']') { str++; if(*str == ':') { str++; if(parse_uint16(&addr->port, &str)) return -1; } } else return -1; return 0; } else { /* ipv4 */ if(parse_uint8(&addr->ip[0], &str)) return -1; if(parse_char('.', &str)) return -1; if(parse_uint8(&addr->ip[1], &str)) return -1; if(parse_char('.', &str)) return -1; if(parse_uint8(&addr->ip[2], &str)) return -1; if(parse_char('.', &str)) return -1; if(parse_uint8(&addr->ip[3], &str)) return -1; if(*str == ':') { str++; if(parse_uint16(&addr->port, &str)) return -1; } addr->type = NETTYPE_IPV4; } return 0; } static void priv_net_close_socket(int sock) { #if defined(CONF_FAMILY_WINDOWS) closesocket(sock); #else close(sock); #endif } static int priv_net_close_all_sockets(NETSOCKET sock) { /* close down ipv4 */ if(sock.ipv4sock >= 0) { priv_net_close_socket(sock.ipv4sock); sock.ipv4sock = -1; sock.type &= ~NETTYPE_IPV4; } /* close down ipv6 */ if(sock.ipv6sock >= 0) { priv_net_close_socket(sock.ipv6sock); sock.ipv6sock = -1; sock.type &= ~NETTYPE_IPV6; } return 0; } static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, int sockaddrlen) { int sock, e; /* create socket */ sock = socket(domain, type, 0); if(sock < 0) { #if defined(CONF_FAMILY_WINDOWS) char buf[128]; int error = WSAGetLastError(); if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, buf, sizeof(buf), 0) == 0) buf[0] = 0; dbg_msg("net", "failed to create socket with domain %d and type %d (%d '%s')", domain, type, error, buf); #else dbg_msg("net", "failed to create socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno)); #endif return -1; } /* set to IPv6 only if thats what we are creating */ #if defined(IPV6_V6ONLY) /* windows sdk 6.1 and higher */ if(domain == AF_INET6) { int ipv6only = 1; setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&ipv6only, sizeof(ipv6only)); } #endif /* bind the socket */ e = bind(sock, addr, sockaddrlen); if(e != 0) { #if defined(CONF_FAMILY_WINDOWS) char buf[128]; int error = WSAGetLastError(); if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, buf, sizeof(buf), 0) == 0) buf[0] = 0; dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, error, buf); #else dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno)); #endif priv_net_close_socket(sock); return -1; } /* return the newly created socket */ return sock; } NETSOCKET net_udp_create(NETADDR bindaddr) { NETSOCKET sock = invalid_socket; NETADDR tmpbindaddr = bindaddr; int broadcast = 1; int recvsize = 65536; if(bindaddr.type&NETTYPE_IPV4) { struct sockaddr_in addr; int socket = -1; /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV4; netaddr_to_sockaddr_in(&tmpbindaddr, &addr); socket = priv_net_create_socket(AF_INET, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr)); if(socket >= 0) { sock.type |= NETTYPE_IPV4; sock.ipv4sock = socket; /* set boardcast */ setsockopt(socket, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcast, sizeof(broadcast)); /* set receive buffer size */ setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (char*)&recvsize, sizeof(recvsize)); } } if(bindaddr.type&NETTYPE_IPV6) { struct sockaddr_in6 addr; int socket = -1; /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV6; netaddr_to_sockaddr_in6(&tmpbindaddr, &addr); socket = priv_net_create_socket(AF_INET6, SOCK_DGRAM, (struct sockaddr *)&addr, sizeof(addr)); if(socket >= 0) { sock.type |= NETTYPE_IPV6; sock.ipv6sock = socket; /* set boardcast */ setsockopt(socket, SOL_SOCKET, SO_BROADCAST, (const char*)&broadcast, sizeof(broadcast)); /* set receive buffer size */ setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (char*)&recvsize, sizeof(recvsize)); } } /* set non-blocking */ net_set_non_blocking(sock); /* return */ return sock; } int net_udp_send(NETSOCKET sock, const NETADDR *addr, const void *data, int size) { int d = -1; if(addr->type&NETTYPE_IPV4) { if(sock.ipv4sock >= 0) { struct sockaddr_in sa; if(addr->type&NETTYPE_LINK_BROADCAST) { mem_zero(&sa, sizeof(sa)); sa.sin_port = htons(addr->port); sa.sin_family = AF_INET; sa.sin_addr.s_addr = INADDR_BROADCAST; } else netaddr_to_sockaddr_in(addr, &sa); d = sendto((int)sock.ipv4sock, (const char*)data, size, 0, (struct sockaddr *)&sa, sizeof(sa)); } else dbg_msg("net", "can't sent ipv4 traffic to this socket"); } if(addr->type&NETTYPE_IPV6) { if(sock.ipv6sock >= 0) { struct sockaddr_in6 sa; if(addr->type&NETTYPE_LINK_BROADCAST) { mem_zero(&sa, sizeof(sa)); sa.sin6_port = htons(addr->port); sa.sin6_family = AF_INET6; sa.sin6_addr.s6_addr[0] = 0xff; /* multicast */ sa.sin6_addr.s6_addr[1] = 0x02; /* link local scope */ sa.sin6_addr.s6_addr[15] = 1; /* all nodes */ } else netaddr_to_sockaddr_in6(addr, &sa); d = sendto((int)sock.ipv6sock, (const char*)data, size, 0, (struct sockaddr *)&sa, sizeof(sa)); } else dbg_msg("net", "can't sent ipv6 traffic to this socket"); } /* else dbg_msg("net", "can't sent to network of type %d", addr->type); */ /*if(d < 0) { char addrstr[256]; net_addr_str(addr, addrstr, sizeof(addrstr)); dbg_msg("net", "sendto error (%d '%s')", errno, strerror(errno)); dbg_msg("net", "\tsock = %d %x", sock, sock); dbg_msg("net", "\tsize = %d %x", size, size); dbg_msg("net", "\taddr = %s", addrstr); }*/ network_stats.sent_bytes += size; network_stats.sent_packets++; return d; } int net_udp_recv(NETSOCKET sock, NETADDR *addr, void *data, int maxsize) { char sockaddrbuf[128]; socklen_t fromlen;// = sizeof(sockaddrbuf); int bytes = 0; if(bytes == 0 && sock.ipv4sock >= 0) { fromlen = sizeof(struct sockaddr_in); bytes = recvfrom(sock.ipv4sock, (char*)data, maxsize, 0, (struct sockaddr *)&sockaddrbuf, &fromlen); } if(bytes <= 0 && sock.ipv6sock >= 0) { fromlen = sizeof(struct sockaddr_in6); bytes = recvfrom(sock.ipv6sock, (char*)data, maxsize, 0, (struct sockaddr *)&sockaddrbuf, &fromlen); } if(bytes > 0) { sockaddr_to_netaddr((struct sockaddr *)&sockaddrbuf, addr); network_stats.recv_bytes += bytes; network_stats.recv_packets++; return bytes; } else if(bytes == 0) return 0; return -1; /* error */ } int net_udp_close(NETSOCKET sock) { return priv_net_close_all_sockets(sock); } NETSOCKET net_tcp_create(NETADDR bindaddr) { NETSOCKET sock = invalid_socket; NETADDR tmpbindaddr = bindaddr; if(bindaddr.type&NETTYPE_IPV4) { struct sockaddr_in addr; int socket = -1; /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV4; netaddr_to_sockaddr_in(&tmpbindaddr, &addr); socket = priv_net_create_socket(AF_INET, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr)); if(socket >= 0) { sock.type |= NETTYPE_IPV4; sock.ipv4sock = socket; } } if(bindaddr.type&NETTYPE_IPV6) { struct sockaddr_in6 addr; int socket = -1; /* bind, we should check for error */ tmpbindaddr.type = NETTYPE_IPV6; netaddr_to_sockaddr_in6(&tmpbindaddr, &addr); socket = priv_net_create_socket(AF_INET6, SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr)); if(socket >= 0) { sock.type |= NETTYPE_IPV6; sock.ipv6sock = socket; } } /* return */ return sock; } int net_set_non_blocking(NETSOCKET sock) { unsigned long mode = 1; if(sock.ipv4sock >= 0) { #if defined(CONF_FAMILY_WINDOWS) ioctlsocket(sock.ipv4sock, FIONBIO, (unsigned long *)&mode); #else ioctl(sock.ipv4sock, FIONBIO, (unsigned long *)&mode); #endif } if(sock.ipv6sock >= 0) { #if defined(CONF_FAMILY_WINDOWS) ioctlsocket(sock.ipv6sock, FIONBIO, (unsigned long *)&mode); #else ioctl(sock.ipv6sock, FIONBIO, (unsigned long *)&mode); #endif } return 0; } int net_set_blocking(NETSOCKET sock) { unsigned long mode = 0; if(sock.ipv4sock >= 0) { #if defined(CONF_FAMILY_WINDOWS) ioctlsocket(sock.ipv4sock, FIONBIO, (unsigned long *)&mode); #else ioctl(sock.ipv4sock, FIONBIO, (unsigned long *)&mode); #endif } if(sock.ipv6sock >= 0) { #if defined(CONF_FAMILY_WINDOWS) ioctlsocket(sock.ipv6sock, FIONBIO, (unsigned long *)&mode); #else ioctl(sock.ipv6sock, FIONBIO, (unsigned long *)&mode); #endif } return 0; } int net_tcp_listen(NETSOCKET sock, int backlog) { int err = -1; if(sock.ipv4sock >= 0) err = listen(sock.ipv4sock, backlog); if(sock.ipv6sock >= 0) err = listen(sock.ipv6sock, backlog); return err; } int net_tcp_accept(NETSOCKET sock, NETSOCKET *new_sock, NETADDR *a) { int s; socklen_t sockaddr_len; *new_sock = invalid_socket; if(sock.ipv4sock >= 0) { struct sockaddr_in addr; sockaddr_len = sizeof(addr); s = accept(sock.ipv4sock, (struct sockaddr *)&addr, &sockaddr_len); if (s != -1) { sockaddr_to_netaddr((const struct sockaddr *)&addr, a); new_sock->type = NETTYPE_IPV4; new_sock->ipv4sock = s; return s; } } if(sock.ipv6sock >= 0) { struct sockaddr_in6 addr; sockaddr_len = sizeof(addr); s = accept(sock.ipv6sock, (struct sockaddr *)&addr, &sockaddr_len); if (s != -1) { sockaddr_to_netaddr((const struct sockaddr *)&addr, a); new_sock->type = NETTYPE_IPV6; new_sock->ipv6sock = s; return s; } } return -1; } int net_tcp_connect(NETSOCKET sock, const NETADDR *a) { if(a->type&NETTYPE_IPV4) { struct sockaddr_in addr; netaddr_to_sockaddr_in(a, &addr); return connect(sock.ipv4sock, (struct sockaddr *)&addr, sizeof(addr)); } if(a->type&NETTYPE_IPV6) { struct sockaddr_in6 addr; netaddr_to_sockaddr_in6(a, &addr); return connect(sock.ipv6sock, (struct sockaddr *)&addr, sizeof(addr)); } return -1; } int net_tcp_connect_non_blocking(NETSOCKET sock, NETADDR bindaddr) { int res = 0; net_set_non_blocking(sock); res = net_tcp_connect(sock, &bindaddr); net_set_blocking(sock); return res; } int net_tcp_send(NETSOCKET sock, const void *data, int size) { int bytes = -1; if(sock.ipv4sock >= 0) bytes = send((int)sock.ipv4sock, (const char*)data, size, 0); if(sock.ipv6sock >= 0) bytes = send((int)sock.ipv6sock, (const char*)data, size, 0); return bytes; } int net_tcp_recv(NETSOCKET sock, void *data, int maxsize) { int bytes = -1; if(sock.ipv4sock >= 0) bytes = recv((int)sock.ipv4sock, (char*)data, maxsize, 0); if(sock.ipv6sock >= 0) bytes = recv((int)sock.ipv6sock, (char*)data, maxsize, 0); return bytes; } int net_tcp_close(NETSOCKET sock) { return priv_net_close_all_sockets(sock); } int net_errno() { #if defined(CONF_FAMILY_WINDOWS) return WSAGetLastError(); #else return errno; #endif } int net_would_block() { #if defined(CONF_FAMILY_WINDOWS) return net_errno() == WSAEWOULDBLOCK; #else return net_errno() == EWOULDBLOCK; #endif } int net_init() { #if defined(CONF_FAMILY_WINDOWS) WSADATA wsaData; int err = WSAStartup(MAKEWORD(1, 1), &wsaData); dbg_assert(err == 0, "network initialization failed."); return err==0?0:1; #endif return 0; } int fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user) { #if defined(CONF_FAMILY_WINDOWS) WIN32_FIND_DATA finddata; HANDLE handle; char buffer[1024*2]; int length; str_format(buffer, sizeof(buffer), "%s/*", dir); handle = FindFirstFileA(buffer, &finddata); if (handle == INVALID_HANDLE_VALUE) return 0; str_format(buffer, sizeof(buffer), "%s/", dir); length = str_length(buffer); /* add all the entries */ do { str_copy(buffer+length, finddata.cFileName, (int)sizeof(buffer)-length); if(cb(finddata.cFileName, fs_is_dir(buffer), type, user)) break; } while (FindNextFileA(handle, &finddata)); FindClose(handle); return 0; #else struct dirent *entry; char buffer[1024*2]; int length; DIR *d = opendir(dir); if(!d) return 0; str_format(buffer, sizeof(buffer), "%s/", dir); length = str_length(buffer); while((entry = readdir(d)) != NULL) { str_copy(buffer+length, entry->d_name, (int)sizeof(buffer)-length); if(cb(entry->d_name, fs_is_dir(buffer), type, user)) break; } /* close the directory and return */ closedir(d); return 0; #endif } int fs_storage_path(const char *appname, char *path, int max) { #if defined(CONF_FAMILY_WINDOWS) char *home = getenv("APPDATA"); if(!home) return -1; _snprintf(path, max, "%s/%s", home, appname); return 0; #else char *home = getenv("HOME"); #if !defined(CONF_PLATFORM_MACOSX) int i; #endif if(!home) return -1; #if defined(CONF_PLATFORM_MACOSX) snprintf(path, max, "%s/Library/Application Support/%s", home, appname); #else snprintf(path, max, "%s/.%s", home, appname); for(i = strlen(home)+2; path[i]; i++) path[i] = tolower(path[i]); #endif return 0; #endif } int fs_makedir(const char *path) { #if defined(CONF_FAMILY_WINDOWS) if(_mkdir(path) == 0) return 0; if(errno == EEXIST) return 0; return -1; #else if(mkdir(path, 0755) == 0) return 0; if(errno == EEXIST) return 0; return -1; #endif } int fs_is_dir(const char *path) { #if defined(CONF_FAMILY_WINDOWS) /* TODO: do this smarter */ WIN32_FIND_DATA finddata; HANDLE handle; char buffer[1024*2]; str_format(buffer, sizeof(buffer), "%s/*", path); if ((handle = FindFirstFileA(buffer, &finddata)) == INVALID_HANDLE_VALUE) return 0; FindClose(handle); return 1; #else struct stat sb; if (stat(path, &sb) == -1) return 0; if (S_ISDIR(sb.st_mode)) return 1; else return 0; #endif } int fs_chdir(const char *path) { if(fs_is_dir(path)) { if(chdir(path)) return 1; else return 0; } else return 1; } char *fs_getcwd(char *buffer, int buffer_size) { if(buffer == 0) return 0; #if defined(CONF_FAMILY_WINDOWS) return _getcwd(buffer, buffer_size); #else return getcwd(buffer, buffer_size); #endif } int fs_parent_dir(char *path) { char *parent = 0; for(; *path; ++path) { if(*path == '/' || *path == '\\') parent = path; } if(parent) { *parent = 0; return 0; } return 1; } int fs_remove(const char *filename) { if(remove(filename) != 0) return 1; return 0; } int fs_rename(const char *oldname, const char *newname) { if(rename(oldname, newname) != 0) return 1; return 0; } void swap_endian(void *data, unsigned elem_size, unsigned num) { char *src = (char*) data; char *dst = src + (elem_size - 1); while(num) { unsigned n = elem_size>>1; char tmp; while(n) { tmp = *src; *src = *dst; *dst = tmp; src++; dst--; n--; } src = src + (elem_size>>1); dst = src + (elem_size - 1); num--; } } int net_socket_read_wait(NETSOCKET sock, int time) { struct timeval tv; fd_set readfds; int sockid; tv.tv_sec = 0; tv.tv_usec = 1000*time; sockid = 0; FD_ZERO(&readfds); if(sock.ipv4sock >= 0) { FD_SET(sock.ipv4sock, &readfds); sockid = sock.ipv4sock; } if(sock.ipv6sock >= 0) { FD_SET(sock.ipv6sock, &readfds); if(sock.ipv6sock > sockid) sockid = sock.ipv6sock; } /* don't care about writefds and exceptfds */ select(sockid+1, &readfds, NULL, NULL, &tv); if(sock.ipv4sock >= 0 && FD_ISSET(sock.ipv4sock, &readfds)) return 1; if(sock.ipv6sock >= 0 && FD_ISSET(sock.ipv6sock, &readfds)) return 1; return 0; } int time_timestamp() { return time(0); } void str_append(char *dst, const char *src, int dst_size) { int s = strlen(dst); int i = 0; while(s < dst_size) { dst[s] = src[i]; if(!src[i]) /* check for null termination */ break; s++; i++; } dst[dst_size-1] = 0; /* assure null termination */ } void str_copy(char *dst, const char *src, int dst_size) { strncpy(dst, src, dst_size); dst[dst_size-1] = 0; /* assure null termination */ } int str_length(const char *str) { return (int)strlen(str); } void str_format(char *buffer, int buffer_size, const char *format, ...) { #if defined(CONF_FAMILY_WINDOWS) va_list ap; va_start(ap, format); _vsnprintf(buffer, buffer_size, format, ap); va_end(ap); #else va_list ap; va_start(ap, format); vsnprintf(buffer, buffer_size, format, ap); va_end(ap); #endif buffer[buffer_size-1] = 0; /* assure null termination */ } /* makes sure that the string only contains the characters between 32 and 127 */ void str_sanitize_strong(char *str_in) { unsigned char *str = (unsigned char *)str_in; while(*str) { *str &= 0x7f; if(*str < 32) *str = 32; str++; } } /* makes sure that the string only contains the characters between 32 and 255 */ void str_sanitize_cc(char *str_in) { unsigned char *str = (unsigned char *)str_in; while(*str) { if(*str < 32) *str = ' '; str++; } } /* makes sure that the string only contains the characters between 32 and 255 + \r\n\t */ void str_sanitize(char *str_in) { unsigned char *str = (unsigned char *)str_in; while(*str) { if(*str < 32 && !(*str == '\r') && !(*str == '\n') && !(*str == '\t')) *str = ' '; str++; } } char *str_skip_to_whitespace(char *str) { while(*str && (*str != ' ' && *str != '\t' && *str != '\n')) str++; return str; } char *str_skip_whitespaces(char *str) { while(*str && (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r')) str++; return str; } /* case */ int str_comp_nocase(const char *a, const char *b) { #if defined(CONF_FAMILY_WINDOWS) return _stricmp(a,b); #else return strcasecmp(a,b); #endif } int str_comp_nocase_num(const char *a, const char *b, const int num) { #if defined(CONF_FAMILY_WINDOWS) return _strnicmp(a, b, num); #else return strncasecmp(a, b, num); #endif } int str_comp(const char *a, const char *b) { return strcmp(a, b); } int str_comp_num(const char *a, const char *b, const int num) { return strncmp(a, b, num); } int str_comp_filenames(const char *a, const char *b) { int result; for(; *a && *b; ++a, ++b) { if(*a >= '0' && *a <= '9' && *b >= '0' && *b <= '9') { result = 0; do { if(!result) result = *a - *b; ++a; ++b; } while(*a >= '0' && *a <= '9' && *b >= '0' && *b <= '9'); if(*a >= '0' && *a <= '9') return 1; else if(*b >= '0' && *b <= '9') return -1; else if(result) return result; } if(*a != *b) break; } return *a - *b; } const char *str_find_nocase(const char *haystack, const char *needle) { while(*haystack) /* native implementation */ { const char *a = haystack; const char *b = needle; while(*a && *b && tolower(*a) == tolower(*b)) { a++; b++; } if(!(*b)) return haystack; haystack++; } return 0; } const char *str_find(const char *haystack, const char *needle) { while(*haystack) /* native implementation */ { const char *a = haystack; const char *b = needle; while(*a && *b && *a == *b) { a++; b++; } if(!(*b)) return haystack; haystack++; } return 0; } void str_hex(char *dst, int dst_size, const void *data, int data_size) { static const char hex[] = "0123456789ABCDEF"; int b; for(b = 0; b < data_size && b < dst_size/4-4; b++) { dst[b*3] = hex[((const unsigned char *)data)[b]>>4]; dst[b*3+1] = hex[((const unsigned char *)data)[b]&0xf]; dst[b*3+2] = ' '; dst[b*3+3] = 0; } } void str_timestamp(char *buffer, int buffer_size) { time_t time_data; struct tm *time_info; time(&time_data); time_info = localtime(&time_data); strftime(buffer, buffer_size, "%Y-%m-%d_%H-%M-%S", time_info); buffer[buffer_size-1] = 0; /* assure null termination */ } int mem_comp(const void *a, const void *b, int size) { return memcmp(a,b,size); } const MEMSTATS *mem_stats() { return &memory_stats; } void net_stats(NETSTATS *stats_inout) { *stats_inout = network_stats; } void gui_messagebox(const char *title, const char *message) { #if defined(CONF_PLATFORM_MACOSX) DialogRef theItem; DialogItemIndex itemIndex; /* FIXME: really needed? can we rely on glfw? */ /* HACK - get events without a bundle */ ProcessSerialNumber psn; GetCurrentProcess(&psn); TransformProcessType(&psn,kProcessTransformToForegroundApplication); SetFrontProcess(&psn); /* END HACK */ CreateStandardAlert(kAlertStopAlert, CFStringCreateWithCString(NULL, title, kCFStringEncodingASCII), CFStringCreateWithCString(NULL, message, kCFStringEncodingASCII), NULL, &theItem); RunStandardAlert(theItem, NULL, &itemIndex); #elif defined(CONF_FAMILY_UNIX) static char cmd[1024]; int err; /* use xmessage which is available on nearly every X11 system */ snprintf(cmd, sizeof(cmd), "xmessage -center -title '%s' '%s'", title, message); err = system(cmd); dbg_msg("gui/msgbox", "result = %i", err); #elif defined(CONF_FAMILY_WINDOWS) MessageBox(NULL, message, title, MB_ICONEXCLAMATION | MB_OK); #else /* this is not critical */ #warning not implemented #endif } int str_isspace(char c) { return c == ' ' || c == '\n' || c == '\t'; } char str_uppercase(char c) { if(c >= 'a' && c <= 'z') return 'A' + (c-'a'); return c; } int str_toint(const char *str) { return atoi(str); } float str_tofloat(const char *str) { return atof(str); } const char *str_utf8_skip_whitespaces(const char *str) { const char *str_old; int code; while(*str) { str_old = str; code = str_utf8_decode(&str); // check if unicode is not empty if(code > 0x20 && code != 0xA0 && code != 0x034F && (code < 0x2000 || code > 0x200F) && (code < 0x2028 || code > 0x202F) && (code < 0x205F || code > 0x2064) && (code < 0x206A || code > 0x206F) && (code < 0xFE00 || code > 0xFE0F) && code != 0xFEFF && (code < 0xFFF9 || code > 0xFFFC)) { return str_old; } } return str; } static int str_utf8_isstart(char c) { if((c&0xC0) == 0x80) /* 10xxxxxx */ return 0; return 1; } int str_utf8_rewind(const char *str, int cursor) { while(cursor) { cursor--; if(str_utf8_isstart(*(str + cursor))) break; } return cursor; } int str_utf8_forward(const char *str, int cursor) { const char *buf = str + cursor; if(!buf[0]) return cursor; if((*buf&0x80) == 0x0) /* 0xxxxxxx */ return cursor+1; else if((*buf&0xE0) == 0xC0) /* 110xxxxx */ { if(!buf[1]) return cursor+1; return cursor+2; } else if((*buf & 0xF0) == 0xE0) /* 1110xxxx */ { if(!buf[1]) return cursor+1; if(!buf[2]) return cursor+2; return cursor+3; } else if((*buf & 0xF8) == 0xF0) /* 11110xxx */ { if(!buf[1]) return cursor+1; if(!buf[2]) return cursor+2; if(!buf[3]) return cursor+3; return cursor+4; } /* invalid */ return cursor+1; } int str_utf8_encode(char *ptr, int chr) { /* encode */ if(chr <= 0x7F) { ptr[0] = (char)chr; return 1; } else if(chr <= 0x7FF) { ptr[0] = 0xC0|((chr>>6)&0x1F); ptr[1] = 0x80|(chr&0x3F); return 2; } else if(chr <= 0xFFFF) { ptr[0] = 0xE0|((chr>>12)&0x0F); ptr[1] = 0x80|((chr>>6)&0x3F); ptr[2] = 0x80|(chr&0x3F); return 3; } else if(chr <= 0x10FFFF) { ptr[0] = 0xF0|((chr>>18)&0x07); ptr[1] = 0x80|((chr>>12)&0x3F); ptr[2] = 0x80|((chr>>6)&0x3F); ptr[3] = 0x80|(chr&0x3F); return 4; } return 0; } int str_utf8_decode(const char **ptr) { const char *buf = *ptr; int ch = 0; do { if((*buf&0x80) == 0x0) /* 0xxxxxxx */ { ch = *buf; buf++; } else if((*buf&0xE0) == 0xC0) /* 110xxxxx */ { ch = (*buf++ & 0x3F) << 6; if(!(*buf)) break; ch += (*buf++ & 0x3F); if(ch == 0) ch = -1; } else if((*buf & 0xF0) == 0xE0) /* 1110xxxx */ { ch = (*buf++ & 0x1F) << 12; if(!(*buf)) break; ch += (*buf++ & 0x3F) << 6; if(!(*buf)) break; ch += (*buf++ & 0x3F); if(ch == 0) ch = -1; } else if((*buf & 0xF8) == 0xF0) /* 11110xxx */ { ch = (*buf++ & 0x0F) << 18; if(!(*buf)) break; ch += (*buf++ & 0x3F) << 12; if(!(*buf)) break; ch += (*buf++ & 0x3F) << 6; if(!(*buf)) break; ch += (*buf++ & 0x3F); if(ch == 0) ch = -1; } else { /* invalid */ buf++; break; } *ptr = buf; return ch; } while(0); /* out of bounds */ *ptr = buf; return -1; } int str_utf8_check(const char *str) { while(*str) { if((*str&0x80) == 0x0) str++; else if((*str&0xE0) == 0xC0 && (*(str+1)&0xC0) == 0x80) str += 2; else if((*str&0xF0) == 0xE0 && (*(str+1)&0xC0) == 0x80 && (*(str+2)&0xC0) == 0x80) str += 3; else if((*str&0xF8) == 0xF0 && (*(str+1)&0xC0) == 0x80 && (*(str+2)&0xC0) == 0x80 && (*(str+3)&0xC0) == 0x80) str += 4; else return 0; } return 1; } unsigned str_quickhash(const char *str) { unsigned hash = 5381; for(; *str; str++) hash = ((hash << 5) + hash) + (*str); /* hash * 33 + c */ return hash; } #if defined(__cplusplus) } #endif teeworlds-0.6.2+dfsg/src/base/system.h0000644000175000017500000006361512140200333016643 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ /* Title: OS Abstraction */ #ifndef BASE_SYSTEM_H #define BASE_SYSTEM_H #include "detect.h" #ifdef __cplusplus extern "C" { #endif /* Group: Debug */ /* Function: dbg_assert Breaks into the debugger based on a test. Parameters: test - Result of the test. msg - Message that should be printed if the test fails. Remarks: Does nothing in release version of the library. See Also: */ void dbg_assert(int test, const char *msg); #define dbg_assert(test,msg) dbg_assert_imp(__FILE__, __LINE__, test, msg) void dbg_assert_imp(const char *filename, int line, int test, const char *msg); #ifdef __clang_analyzer__ #include #undef dbg_assert #define dbg_assert(test,msg) assert(test) #endif /* Function: dbg_break Breaks into the debugger. Remarks: Does nothing in release version of the library. See Also: */ void dbg_break(); /* Function: dbg_msg Prints a debug message. Parameters: sys - A string that describes what system the message belongs to fmt - A printf styled format string. Remarks: Does nothing in release version of the library. See Also: */ void dbg_msg(const char *sys, const char *fmt, ...); /* Group: Memory */ /* Function: mem_alloc Allocates memory. Parameters: size - Size of the needed block. alignment - Alignment for the block. Returns: Returns a pointer to the newly allocated block. Returns a null pointer if the memory couldn't be allocated. Remarks: - Passing 0 to size will allocated the smallest amount possible and return a unique pointer. See Also: */ void *mem_alloc_debug(const char *filename, int line, unsigned size, unsigned alignment); #define mem_alloc(s,a) mem_alloc_debug(__FILE__, __LINE__, (s), (a)) /* Function: mem_free Frees a block allocated through . Remarks: - In the debug version of the library the function will assert if a non-valid block is passed, like a null pointer or a block that isn't allocated. See Also: */ void mem_free(void *block); /* Function: mem_copy Copies a a memory block. Parameters: dest - Destination. source - Source to copy. size - Size of the block to copy. Remarks: - This functions DOES NOT handles cases where source and destination is overlapping. See Also: */ void mem_copy(void *dest, const void *source, unsigned size); /* Function: mem_move Copies a a memory block Parameters: dest - Destination source - Source to copy size - Size of the block to copy Remarks: - This functions handles cases where source and destination is overlapping See Also: */ void mem_move(void *dest, const void *source, unsigned size); /* Function: mem_zero Sets a complete memory block to 0 Parameters: block - Pointer to the block to zero out size - Size of the block */ void mem_zero(void *block, unsigned size); /* Function: mem_comp Compares two blocks of memory Parameters: a - First block of data b - Second block of data size - Size of the data to compare Returns: <0 - Block a is lesser then block b 0 - Block a is equal to block b >0 - Block a is greater then block b */ int mem_comp(const void *a, const void *b, int size); /* Function: mem_check Validates the heap Will trigger a assert if memory has failed. */ int mem_check_imp(); #define mem_check() dbg_assert_imp(__FILE__, __LINE__, mem_check_imp(), "Memory check failed") /* Group: File IO */ enum { IOFLAG_READ = 1, IOFLAG_WRITE = 2, IOFLAG_RANDOM = 4, IOSEEK_START = 0, IOSEEK_CUR = 1, IOSEEK_END = 2 }; typedef struct IOINTERNAL *IOHANDLE; /* Function: io_open Opens a file. Parameters: filename - File to open. flags - A set of flags. IOFLAG_READ, IOFLAG_WRITE, IOFLAG_RANDOM. Returns: Returns a handle to the file on success and 0 on failure. */ IOHANDLE io_open(const char *filename, int flags); /* Function: io_read Reads data into a buffer from a file. Parameters: io - Handle to the file to read data from. buffer - Pointer to the buffer that will recive the data. size - Number of bytes to read from the file. Returns: Number of bytes read. */ unsigned io_read(IOHANDLE io, void *buffer, unsigned size); /* Function: io_skip Skips data in a file. Parameters: io - Handle to the file. size - Number of bytes to skip. Returns: Number of bytes skipped. */ unsigned io_skip(IOHANDLE io, int size); /* Function: io_write Writes data from a buffer to file. Parameters: io - Handle to the file. buffer - Pointer to the data that should be written. size - Number of bytes to write. Returns: Number of bytes written. */ unsigned io_write(IOHANDLE io, const void *buffer, unsigned size); /* Function: io_write_newline Writes newline to file. Parameters: io - Handle to the file. Returns: Number of bytes written. */ unsigned io_write_newline(IOHANDLE io); /* Function: io_seek Seeks to a specified offset in the file. Parameters: io - Handle to the file. offset - Offset from pos to stop. origin - Position to start searching from. Returns: Returns 0 on success. */ int io_seek(IOHANDLE io, int offset, int origin); /* Function: io_tell Gets the current position in the file. Parameters: io - Handle to the file. Returns: Returns the current position. -1L if an error occured. */ long int io_tell(IOHANDLE io); /* Function: io_length Gets the total length of the file. Resetting cursor to the beginning Parameters: io - Handle to the file. Returns: Returns the total size. -1L if an error occured. */ long int io_length(IOHANDLE io); /* Function: io_close Closes a file. Parameters: io - Handle to the file. Returns: Returns 0 on success. */ int io_close(IOHANDLE io); /* Function: io_flush Empties all buffers and writes all pending data. Parameters: io - Handle to the file. Returns: Returns 0 on success. */ int io_flush(IOHANDLE io); /* Function: io_stdin Returns an to the standard input. */ IOHANDLE io_stdin(); /* Function: io_stdout Returns an to the standard output. */ IOHANDLE io_stdout(); /* Function: io_stderr Returns an to the standard error. */ IOHANDLE io_stderr(); /* Group: Threads */ /* Function: thread_sleep Suspends the current thread for a given period. Parameters: milliseconds - Number of milliseconds to sleep. */ void thread_sleep(int milliseconds); /* Function: thread_create Creates a new thread. Parameters: threadfunc - Entry point for the new thread. user - Pointer to pass to the thread. */ void *thread_create(void (*threadfunc)(void *), void *user); /* Function: thread_wait Waits for a thread to be done or destroyed. Parameters: thread - Thread to wait for. */ void thread_wait(void *thread); /* Function: thread_destroy Destroys a thread. Parameters: thread - Thread to destroy. */ void thread_destroy(void *thread); /* Function: thread_yeild Yeild the current threads execution slice. */ void thread_yield(); /* Function: thread_detach Puts the thread in the detached thread, guaranteeing that resources of the thread will be freed immediately when the thread terminates. Parameters: thread - Thread to detach */ void thread_detach(void *thread); /* Group: Locks */ typedef void* LOCK; LOCK lock_create(); void lock_destroy(LOCK lock); int lock_try(LOCK lock); void lock_wait(LOCK lock); void lock_release(LOCK lock); /* Group: Semaphores */ #if !defined(CONF_PLATFORM_MACOSX) #if defined(CONF_FAMILY_UNIX) #include typedef sem_t SEMAPHORE; #elif defined(CONF_FAMILY_WINDOWS) typedef void* SEMAPHORE; #else #error missing sempahore implementation #endif void semaphore_init(SEMAPHORE *sem); void semaphore_wait(SEMAPHORE *sem); void semaphore_signal(SEMAPHORE *sem); void semaphore_destroy(SEMAPHORE *sem); #endif /* Group: Timer */ #ifdef __GNUC__ /* if compiled with -pedantic-errors it will complain about long not being a C90 thing. */ __extension__ typedef long long int64; #else typedef long long int64; #endif /* Function: time_get Fetches a sample from a high resolution timer. Returns: Current value of the timer. Remarks: To know how fast the timer is ticking, see . */ int64 time_get(); /* Function: time_freq Returns the frequency of the high resolution timer. Returns: Returns the frequency of the high resolution timer. */ int64 time_freq(); /* Function: time_timestamp Retrives the current time as a UNIX timestamp Returns: The time as a UNIX timestamp */ int time_timestamp(); /* Group: Network General */ typedef struct { int type; int ipv4sock; int ipv6sock; } NETSOCKET; enum { NETADDR_MAXSTRSIZE = 1+(8*4+7)+1+1+5+1, // [XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX]:XXXXX NETTYPE_INVALID = 0, NETTYPE_IPV4 = 1, NETTYPE_IPV6 = 2, NETTYPE_LINK_BROADCAST = 4, NETTYPE_ALL = NETTYPE_IPV4|NETTYPE_IPV6 }; typedef struct { unsigned int type; unsigned char ip[16]; unsigned short port; } NETADDR; /* Function: net_init Initiates network functionallity. Returns: Returns 0 on success, Remarks: You must call this function before using any other network functions. */ int net_init(); /* Function: net_host_lookup Does a hostname lookup by name and fills out the passed NETADDR struct with the recieved details. Returns: 0 on success. */ int net_host_lookup(const char *hostname, NETADDR *addr, int types); /* Function: net_addr_comp Compares two network addresses. Parameters: a - Address to compare b - Address to compare to. Returns: <0 - Address a is lesser then address b 0 - Address a is equal to address b >0 - Address a is greater then address b */ int net_addr_comp(const NETADDR *a, const NETADDR *b); /* Function: net_addr_str Turns a network address into a representive string. Parameters: addr - Address to turn into a string. string - Buffer to fill with the string. max_length - Maximum size of the string. add_port - add port to string or not Remarks: - The string will always be zero terminated */ void net_addr_str(const NETADDR *addr, char *string, int max_length, int add_port); /* Function: net_addr_from_str Turns string into a network address. Returns: 0 on success Parameters: addr - Address to fill in. string - String to parse. */ int net_addr_from_str(NETADDR *addr, const char *string); /* Group: Network UDP */ /* Function: net_udp_create Creates a UDP socket and binds it to a port. Parameters: bindaddr - Address to bind the socket to. Returns: On success it returns an handle to the socket. On failure it returns NETSOCKET_INVALID. */ NETSOCKET net_udp_create(NETADDR bindaddr); /* Function: net_udp_send Sends a packet over an UDP socket. Parameters: sock - Socket to use. addr - Where to send the packet. data - Pointer to the packet data to send. size - Size of the packet. Returns: On success it returns the number of bytes sent. Returns -1 on error. */ int net_udp_send(NETSOCKET sock, const NETADDR *addr, const void *data, int size); /* Function: net_udp_recv Recives a packet over an UDP socket. Parameters: sock - Socket to use. addr - Pointer to an NETADDR that will recive the address. data - Pointer to a buffer that will recive the data. maxsize - Maximum size to recive. Returns: On success it returns the number of bytes recived. Returns -1 on error. */ int net_udp_recv(NETSOCKET sock, NETADDR *addr, void *data, int maxsize); /* Function: net_udp_close Closes an UDP socket. Parameters: sock - Socket to close. Returns: Returns 0 on success. -1 on error. */ int net_udp_close(NETSOCKET sock); /* Group: Network TCP */ /* Function: net_tcp_create Creates a TCP socket. Parameters: bindaddr - Address to bind the socket to. Returns: On success it returns an handle to the socket. On failure it returns NETSOCKET_INVALID. */ NETSOCKET net_tcp_create(NETADDR bindaddr); /* Function: net_tcp_listen Makes the socket start listening for new connections. Parameters: sock - Socket to start listen to. backlog - Size of the queue of incomming connections to keep. Returns: Returns 0 on success. */ int net_tcp_listen(NETSOCKET sock, int backlog); /* Function: net_tcp_accept Polls a listning socket for a new connection. Parameters: sock - Listning socket to poll. new_sock - Pointer to a socket to fill in with the new socket. addr - Pointer to an address that will be filled in the remote address (optional, can be NULL). Returns: Returns a non-negative integer on success. Negative integer on failure. */ int net_tcp_accept(NETSOCKET sock, NETSOCKET *new_sock, NETADDR *addr); /* Function: net_tcp_connect Connects one socket to another. Parameters: sock - Socket to connect. addr - Address to connect to. Returns: Returns 0 on success. */ int net_tcp_connect(NETSOCKET sock, const NETADDR *addr); /* Function: net_tcp_send Sends data to a TCP stream. Parameters: sock - Socket to send data to. data - Pointer to the data to send. size - Size of the data to send. Returns: Number of bytes sent. Negative value on failure. */ int net_tcp_send(NETSOCKET sock, const void *data, int size); /* Function: net_tcp_recv Recvives data from a TCP stream. Parameters: sock - Socket to recvive data from. data - Pointer to a buffer to write the data to max_size - Maximum of data to write to the buffer. Returns: Number of bytes recvived. Negative value on failure. When in non-blocking mode, it returns 0 when there is no more data to be fetched. */ int net_tcp_recv(NETSOCKET sock, void *data, int maxsize); /* Function: net_tcp_close Closes a TCP socket. Parameters: sock - Socket to close. Returns: Returns 0 on success. Negative value on failure. */ int net_tcp_close(NETSOCKET sock); /* Group: Strings */ /* Function: str_append Appends a string to another. Parameters: dst - Pointer to a buffer that contains a string. src - String to append. dst_size - Size of the buffer of the dst string. Remarks: - The strings are treated as zero-termineted strings. - Garantees that dst string will contain zero-termination. */ void str_append(char *dst, const char *src, int dst_size); /* Function: str_copy Copies a string to another. Parameters: dst - Pointer to a buffer that shall recive the string. src - String to be copied. dst_size - Size of the buffer dst. Remarks: - The strings are treated as zero-termineted strings. - Garantees that dst string will contain zero-termination. */ void str_copy(char *dst, const char *src, int dst_size); /* Function: str_length Returns the length of a zero terminated string. Parameters: str - Pointer to the string. Returns: Length of string in bytes excluding the zero termination. */ int str_length(const char *str); /* Function: str_format Performs printf formating into a buffer. Parameters: buffer - Pointer to the buffer to recive the formated string. buffer_size - Size of the buffer. format - printf formating string. ... - Parameters for the formating. Remarks: - See the C manual for syntax for the printf formating string. - The strings are treated as zero-termineted strings. - Garantees that dst string will contain zero-termination. */ void str_format(char *buffer, int buffer_size, const char *format, ...); /* Function: str_sanitize_strong Replaces all characters below 32 and above 127 with whitespace. Parameters: str - String to sanitize. Remarks: - The strings are treated as zero-termineted strings. */ void str_sanitize_strong(char *str); /* Function: str_sanitize_cc Replaces all characters below 32 with whitespace. Parameters: str - String to sanitize. Remarks: - The strings are treated as zero-termineted strings. */ void str_sanitize_cc(char *str); /* Function: str_sanitize Replaces all characters below 32 with whitespace with exception to \t, \n and \r. Parameters: str - String to sanitize. Remarks: - The strings are treated as zero-termineted strings. */ void str_sanitize(char *str); /* Function: str_skip_to_whitespace Skips leading non-whitespace characters(all but ' ', '\t', '\n', '\r'). Parameters: str - Pointer to the string. Returns: Pointer to the first whitespace character found within the string. Remarks: - The strings are treated as zero-termineted strings. */ char *str_skip_to_whitespace(char *str); /* Function: str_skip_whitespaces Skips leading whitespace characters(' ', '\t', '\n', '\r'). Parameters: str - Pointer to the string. Returns: Pointer to the first non-whitespace character found within the string. Remarks: - The strings are treated as zero-termineted strings. */ char *str_skip_whitespaces(char *str); /* Function: str_comp_nocase Compares to strings case insensitive. Parameters: a - String to compare. b - String to compare. Returns: <0 - String a is lesser then string b 0 - String a is equal to string b >0 - String a is greater then string b Remarks: - Only garanted to work with a-z/A-Z. - The strings are treated as zero-termineted strings. */ int str_comp_nocase(const char *a, const char *b); /* Function: str_comp_nocase_num Compares up to num characters of two strings case insensitive. Parameters: a - String to compare. b - String to compare. num - Maximum characters to compare Returns: <0 - String a is lesser than string b 0 - String a is equal to string b >0 - String a is greater than string b Remarks: - Only garanted to work with a-z/A-Z. - The strings are treated as zero-termineted strings. */ int str_comp_nocase_num(const char *a, const char *b, const int num); /* Function: str_comp Compares to strings case sensitive. Parameters: a - String to compare. b - String to compare. Returns: <0 - String a is lesser then string b 0 - String a is equal to string b >0 - String a is greater then string b Remarks: - The strings are treated as zero-termineted strings. */ int str_comp(const char *a, const char *b); /* Function: str_comp_num Compares up to num characters of two strings case sensitive. Parameters: a - String to compare. b - String to compare. num - Maximum characters to compare Returns: <0 - String a is lesser then string b 0 - String a is equal to string b >0 - String a is greater then string b Remarks: - The strings are treated as zero-termineted strings. */ int str_comp_num(const char *a, const char *b, const int num); /* Function: str_comp_filenames Compares two strings case sensitive, digit chars will be compared as numbers. Parameters: a - String to compare. b - String to compare. Returns: <0 - String a is lesser then string b 0 - String a is equal to string b >0 - String a is greater then string b Remarks: - The strings are treated as zero-termineted strings. */ int str_comp_filenames(const char *a, const char *b); /* Function: str_find_nocase Finds a string inside another string case insensitive. Parameters: haystack - String to search in needle - String to search for Returns: A pointer into haystack where the needle was found. Returns NULL of needle could not be found. Remarks: - Only garanted to work with a-z/A-Z. - The strings are treated as zero-termineted strings. */ const char *str_find_nocase(const char *haystack, const char *needle); /* Function: str_find Finds a string inside another string case sensitive. Parameters: haystack - String to search in needle - String to search for Returns: A pointer into haystack where the needle was found. Returns NULL of needle could not be found. Remarks: - The strings are treated as zero-termineted strings. */ const char *str_find(const char *haystack, const char *needle); /* Function: str_hex Takes a datablock and generates a hexstring of it. Parameters: dst - Buffer to fill with hex data dst_size - size of the buffer data - Data to turn into hex data - Size of the data Remarks: - The desination buffer will be zero-terminated */ void str_hex(char *dst, int dst_size, const void *data, int data_size); /* Function: str_timestamp Copies a time stamp in the format year-month-day_hour-minute-second to the string. Parameters: buffer - Pointer to a buffer that shall receive the time stamp string. buffer_size - Size of the buffer. Remarks: - Guarantees that buffer string will contain zero-termination. */ void str_timestamp(char *buffer, int buffer_size); /* Group: Filesystem */ /* Function: fs_listdir Lists the files in a directory Parameters: dir - Directory to list cb - Callback function to call for each entry type - Type of the directory user - Pointer to give to the callback Returns: Always returns 0. */ typedef int (*FS_LISTDIR_CALLBACK)(const char *name, int is_dir, int dir_type, void *user); int fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user); /* Function: fs_makedir Creates a directory Parameters: path - Directory to create Returns: Returns 0 on success. Negative value on failure. Remarks: Does not create several directories if needed. "a/b/c" will result in a failure if b or a does not exist. */ int fs_makedir(const char *path); /* Function: fs_storage_path Fetches per user configuration directory. Returns: Returns 0 on success. Negative value on failure. Remarks: - Returns ~/.appname on UNIX based systems - Returns ~/Library/Applications Support/appname on Mac OS X - Returns %APPDATA%/Appname on Windows based systems */ int fs_storage_path(const char *appname, char *path, int max); /* Function: fs_is_dir Checks if directory exists Returns: Returns 1 on success, 0 on failure. */ int fs_is_dir(const char *path); /* Function: fs_chdir Changes current working directory Returns: Returns 0 on success, 1 on failure. */ int fs_chdir(const char *path); /* Function: fs_getcwd Gets the current working directory. Returns: Returns a pointer to the buffer on success, 0 on failure. */ char *fs_getcwd(char *buffer, int buffer_size); /* Function: fs_parent_dir Get the parent directory of a directory Parameters: path - The directory string Returns: Returns 0 on success, 1 on failure. Remarks: - The string is treated as zero-termineted string. */ int fs_parent_dir(char *path); /* Function: fs_remove Deletes the file with the specified name. Parameters: filename - The file to delete Returns: Returns 0 on success, 1 on failure. Remarks: - The strings are treated as zero-terminated strings. */ int fs_remove(const char *filename); /* Function: fs_rename Renames the file or directory. If the paths differ the file will be moved. Parameters: oldname - The actual name newname - The new name Returns: Returns 0 on success, 1 on failure. Remarks: - The strings are treated as zero-terminated strings. */ int fs_rename(const char *oldname, const char *newname); /* Group: Undocumented */ /* Function: net_tcp_connect_non_blocking DOCTODO: serp */ int net_tcp_connect_non_blocking(NETSOCKET sock, NETADDR bindaddr); /* Function: net_set_non_blocking DOCTODO: serp */ int net_set_non_blocking(NETSOCKET sock); /* Function: net_set_non_blocking DOCTODO: serp */ int net_set_blocking(NETSOCKET sock); /* Function: net_errno DOCTODO: serp */ int net_errno(); /* Function: net_would_block DOCTODO: serp */ int net_would_block(); int net_socket_read_wait(NETSOCKET sock, int time); void mem_debug_dump(IOHANDLE file); void swap_endian(void *data, unsigned elem_size, unsigned num); typedef void (*DBG_LOGGER)(const char *line); void dbg_logger(DBG_LOGGER logger); void dbg_logger_stdout(); void dbg_logger_debugger(); void dbg_logger_file(const char *filename); typedef struct { int allocated; int active_allocations; int total_allocations; } MEMSTATS; const MEMSTATS *mem_stats(); typedef struct { int sent_packets; int sent_bytes; int recv_packets; int recv_bytes; } NETSTATS; void net_stats(NETSTATS *stats); int str_toint(const char *str); float str_tofloat(const char *str); int str_isspace(char c); char str_uppercase(char c); unsigned str_quickhash(const char *str); /* Function: gui_messagebox Display plain OS-dependent message box Parameters: title - title of the message box message - text to display */ void gui_messagebox(const char *title, const char *message); const char *str_utf8_skip_whitespaces(const char *str); /* Function: str_utf8_rewind Moves a cursor backwards in an utf8 string Parameters: str - utf8 string cursor - position in the string Returns: New cursor position. Remarks: - Won't move the cursor less then 0 */ int str_utf8_rewind(const char *str, int cursor); /* Function: str_utf8_forward Moves a cursor forwards in an utf8 string Parameters: str - utf8 string cursor - position in the string Returns: New cursor position. Remarks: - Won't move the cursor beyond the zero termination marker */ int str_utf8_forward(const char *str, int cursor); /* Function: str_utf8_decode Decodes an utf8 character Parameters: ptr - pointer to an utf8 string. this pointer will be moved forward Returns: Unicode value for the character. -1 for invalid characters and 0 for end of string. Remarks: - This function will also move the pointer forward. */ int str_utf8_decode(const char **ptr); /* Function: str_utf8_encode Encode an utf8 character Parameters: ptr - Pointer to a buffer that should recive the data. Should be able to hold at least 4 bytes. Returns: Number of bytes put into the buffer. Remarks: - Does not do zero termination of the string. */ int str_utf8_encode(char *ptr, int chr); /* Function: str_utf8_check Checks if a strings contains just valid utf8 characters. Parameters: str - Pointer to a possible utf8 string. Returns: 0 - invalid characters found. 1 - only valid characters found. Remarks: - The string is treated as zero-terminated utf8 string. */ int str_utf8_check(const char *str); #ifdef __cplusplus } #endif #endif teeworlds-0.6.2+dfsg/src/base/tl/0000755000175000017500000000000012140200333015552 5ustar felixfelixteeworlds-0.6.2+dfsg/src/base/tl/algorithm.h0000644000175000017500000000473112140200333017716 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_TL_ALGORITHM_H #define BASE_TL_ALGORITHM_H #include "range.h" /* insert 4 v 1 2 3 4 5 6 */ template R partition_linear(R range, T value) { concept_empty::check(range); concept_forwarditeration::check(range); concept_sorted::check(range); for(; !range.empty(); range.pop_front()) { if(!(range.front() < value)) return range; } return range; } template R partition_binary(R range, T value) { concept_empty::check(range); concept_index::check(range); concept_size::check(range); concept_slice::check(range); concept_sorted::check(range); if(range.empty()) return range; if(range.back() < value) return R(); while(range.size() > 1) { unsigned pivot = (range.size()-1)/2; if(range.index(pivot) < value) range = range.slice(pivot+1, range.size()-1); else range = range.slice(0, pivot+1); } return range; } template R find_linear(R range, T value) { concept_empty::check(range); concept_forwarditeration::check(range); for(; !range.empty(); range.pop_front()) if(value == range.front()) break; return range; } template R find_binary(R range, T value) { range = partition_linear(range, value); if(range.empty()) return range; if(range.front() == value) return range; return R(); } template void sort_bubble(R range) { concept_empty::check(range); concept_forwarditeration::check(range); concept_backwarditeration::check(range); // slow bubblesort :/ for(; !range.empty(); range.pop_back()) { R section = range; typename R::type *prev = §ion.front(); section.pop_front(); for(; !section.empty(); section.pop_front()) { typename R::type *cur = §ion.front(); if(*cur < *prev) swap(*cur, *prev); prev = cur; } } } /* template void sort_quick(R range) { concept_index::check(range); }*/ template void sort(R range) { sort_bubble(range); } template bool sort_verify(R range) { concept_empty::check(range); concept_forwarditeration::check(range); typename R::type *prev = &range.front(); range.pop_front(); for(; !range.empty(); range.pop_front()) { typename R::type *cur = &range.front(); if(*cur < *prev) return false; prev = cur; } return true; } #endif // TL_FILE_ALGORITHMS_HPP teeworlds-0.6.2+dfsg/src/base/tl/allocator.h0000644000175000017500000000100712140200333017701 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_TL_ALLOCATOR_H #define BASE_TL_ALLOCATOR_H template class allocator_default { public: static T *alloc() { return new T; } static void free(T *p) { delete p; } static T *alloc_array(int size) { return new T [size]; } static void free_array(T *p) { delete [] p; } }; #endif // TL_FILE_ALLOCATOR_HPP teeworlds-0.6.2+dfsg/src/base/tl/array.h0000644000175000017500000001230512140200333017042 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_TL_ARRAY_H #define BASE_TL_ARRAY_H #include "range.h" #include "allocator.h" /* Class: array Normal dynamic array class Remarks: - Grows 50% each time it needs to fit new items - Use set_size() if you know how many elements - Use optimize() to reduce the needed space. */ template > class array : private ALLOCATOR { void init() { list = 0x0; clear(); } public: typedef plain_range range; /* Function: array constructor */ array() { init(); } /* Function: array copy constructor */ array(const array &other) { init(); set_size(other.size()); for(int i = 0; i < size(); i++) (*this)[i] = other[i]; } /* Function: array destructor */ ~array() { ALLOCATOR::free_array(list); list = 0x0; } /* Function: delete_all Remarks: - Invalidates ranges */ void delete_all() { for(int i = 0; i < size(); i++) delete list[i]; clear(); } /* Function: clear Remarks: - Invalidates ranges */ void clear() { ALLOCATOR::free_array(list); list_size = 1; list = ALLOCATOR::alloc_array(list_size); num_elements = 0; } /* Function: size */ int size() const { return num_elements; } /* Function: remove_index_fast Remarks: - Invalidates ranges */ void remove_index_fast(int index) { list[index] = list[num_elements-1]; set_size(size()-1); } /* Function: remove_fast Remarks: - Invalidates ranges */ void remove_fast(const T& item) { for(int i = 0; i < size(); i++) if(list[i] == item) { remove_index_fast(i); return; } } /* Function: remove_index Remarks: - Invalidates ranges */ void remove_index(int index) { for(int i = index+1; i < num_elements; i++) list[i-1] = list[i]; set_size(size()-1); } /* Function: remove Remarks: - Invalidates ranges */ bool remove(const T& item) { for(int i = 0; i < size(); i++) if(list[i] == item) { remove_index(i); return true; } return false; } /* Function: add Adds an item to the array. Arguments: item - Item to add. Remarks: - Invalidates ranges - See remarks about how the array grows. */ int add(const T& item) { incsize(); set_size(size()+1); list[num_elements-1] = item; return num_elements-1; } /* Function: insert Inserts an item into the array at a specified location. Arguments: item - Item to insert. r - Range where to insert the item Remarks: - Invalidates ranges - See remarks about how the array grows. */ int insert(const T& item, range r) { if(r.empty()) return add(item); int index = (int)(&r.front()-list); incsize(); set_size(size()+1); for(int i = num_elements-1; i > index; i--) list[i] = list[i-1]; list[index] = item; return num_elements-1; } /* Function: operator[] */ T& operator[] (int index) { return list[index]; } /* Function: const operator[] */ const T& operator[] (int index) const { return list[index]; } /* Function: base_ptr */ T *base_ptr() { return list; } /* Function: base_ptr */ const T *base_ptr() const { return list; } /* Function: set_size Resizes the array to the specified size. Arguments: new_size - The new size for the array. */ void set_size(int new_size) { if(list_size < new_size) alloc(new_size); num_elements = new_size; } /* Function: hint_size Allocates the number of elements wanted but does not increase the list size. Arguments: hint - Size to allocate. Remarks: - If the hint is smaller then the number of elements, nothing will be done. - Invalidates ranges */ void hint_size(int hint) { if(num_elements < hint) alloc(hint); } /* Function: optimize Removes unnessasary data, returns how many bytes was earned. Remarks: - Invalidates ranges */ int optimize() { int before = memusage(); alloc(num_elements); return before - memusage(); } /* Function: memusage Returns how much memory this dynamic array is using */ int memusage() { return sizeof(array) + sizeof(T)*list_size; } /* Function: operator=(array) Remarks: - Invalidates ranges */ array &operator = (const array &other) { set_size(other.size()); for(int i = 0; i < size(); i++) (*this)[i] = other[i]; return *this; } /* Function: all Returns a range that contains the whole array. */ range all() { return range(list, list+num_elements); } protected: void incsize() { if(num_elements == list_size) { if(list_size < 2) alloc(list_size+1); else alloc(list_size+list_size/2); } } void alloc(int new_len) { list_size = new_len; T *new_list = ALLOCATOR::alloc_array(list_size); int end = num_elements < list_size ? num_elements : list_size; for(int i = 0; i < end; i++) new_list[i] = list[i]; ALLOCATOR::free_array(list); num_elements = num_elements < list_size ? num_elements : list_size; list = new_list; } T *list; int list_size; int num_elements; }; #endif // TL_FILE_ARRAY_HPP teeworlds-0.6.2+dfsg/src/base/tl/base.h0000644000175000017500000000065412140200333016642 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_TL_BASE_H #define BASE_TL_BASE_H #include inline void tl_assert(bool statement) { dbg_assert(statement, "assert!"); } template inline void swap(T &a, T &b) { T c = b; b = a; a = c; } #endif teeworlds-0.6.2+dfsg/src/base/tl/range.h0000644000175000017500000000766012140200333017030 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_TL_RANGE_H #define BASE_TL_RANGE_H #include "base.h" /* Group: Range concepts */ /* Concept: concept_empty template struct range { bool empty() const; }; */ struct concept_empty { template static void check(T &t) { if(0) t.empty(); }; }; /* Concept: concept_index template struct range { T &index(size_t); }; */ struct concept_index { template static void check(T &t) { if(0) t.index(0); }; }; /* Concept: concept_size template struct range { size_t size(); }; */ struct concept_size { template static void check(T &t) { if(0) t.size(); }; }; /* Concept: concept_slice template struct range { range slice(size_t start, size_t count); }; */ struct concept_slice { template static void check(T &t) { if(0) t.slice(0, 0); }; }; /* Concept: concept_sorted template struct range { void sorted(); }; */ struct concept_sorted { template static void check(T &t) { if(0) t.sorted(); }; }; /* Concept: concept_forwarditeration Checks for the front and pop_front methods template struct range { void pop_front(); T &front() const; }; */ struct concept_forwarditeration { template static void check(T &t) { if(0) { t.front(); t.pop_front(); } }; }; /* Concept: concept_backwarditeration Checks for the back and pop_back methods template struct range { void pop_back(); T &back() const; }; */ struct concept_backwarditeration { template static void check(T &t) { if(0) { t.back(); t.pop_back(); } }; }; /* Group: Range classes */ /* Class: plain_range Concepts: */ template class plain_range { public: typedef T type; plain_range() { begin = 0x0; end = 0x0; } plain_range(const plain_range &r) { *this = r; } plain_range(T *b, T *e) { begin = b; end = e; } bool empty() const { return begin >= end; } void pop_front() { tl_assert(!empty()); begin++; } void pop_back() { tl_assert(!empty()); end--; } T& front() { tl_assert(!empty()); return *begin; } T& back() { tl_assert(!empty()); return *(end-1); } T& index(unsigned i) { tl_assert(i < (unsigned)(end-begin)); return begin[i]; } unsigned size() const { return (unsigned)(end-begin); } plain_range slice(unsigned startindex, unsigned endindex) { return plain_range(begin+startindex, begin+endindex); } protected: T *begin; T *end; }; /* Class: plain_range_sorted Concepts: Same as but with these additions: */ template class plain_range_sorted : public plain_range { typedef plain_range parent; public: /* sorted concept */ void sorted() const { } plain_range_sorted() {} plain_range_sorted(const plain_range_sorted &r) { *this = r; } plain_range_sorted(T *b, T *e) : parent(b, e) {} plain_range_sorted slice(unsigned start, unsigned count) { return plain_range_sorted(parent::begin+start, parent::begin+start+count); } }; template class reverse_range { private: reverse_range() {} public: typedef typename R::type type; reverse_range(R r) { range = r; } reverse_range(const reverse_range &other) { range = other.range; } bool empty() const { return range.empty(); } void pop_front() { range.pop_back(); } void pop_back() { range.pop_front(); } type& front() { return range.back(); } type& back() { return range.front(); } R range; }; template reverse_range reverse(R range) { return reverse_range(range); } template R reverse(reverse_range range) { return range.range; } #endif // TL_FILE_RANGE_HPP teeworlds-0.6.2+dfsg/src/base/tl/sorted_array.h0000644000175000017500000000206412140200333020423 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_TL_SORTED_ARRAY_H #define BASE_TL_SORTED_ARRAY_H #include "algorithm.h" #include "array.h" template > class sorted_array : public array { typedef array parent; // insert and size is not allowed int insert(const T& item, typename parent::range r) { dbg_break(); return 0; } int set_size(int new_size) { dbg_break(); return 0; } public: typedef plain_range_sorted range; int add(const T& item) { return parent::insert(item, partition_binary(all(), item)); } int add_unsorted(const T& item) { return parent::add(item); } void sort_range() { sort(all()); } /* Function: all Returns a sorted range that contains the whole array. */ range all() { return range(parent::list, parent::list+parent::num_elements); } }; #endif // TL_FILE_SORTED_ARRAY_HPP teeworlds-0.6.2+dfsg/src/base/tl/string.h0000644000175000017500000000271312140200333017234 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_TL_STRING_H #define BASE_TL_STRING_H #include "base.h" #include "allocator.h" template class string_base : private ALLOCATOR { char *str; int length; void reset() { str = 0; length = 0; } void free() { ALLOCATOR::free_array(str); reset(); } void copy(const char *other_str, int other_length) { length = other_length; str = ALLOCATOR::alloc_array(length+1); mem_copy(str, other_str, length+1); } void copy(const string_base &other) { if(!other.str) return; copy(other.str, other.length); } public: string_base() { reset(); } string_base(const char *other_str) { copy(other_str, str_length(other_str)); } string_base(const string_base &other) { reset(); copy(other); } ~string_base() { free(); } string_base &operator = (const char *other) { free(); if(other) copy(other, str_length(other)); return *this; } string_base &operator = (const string_base &other) { free(); copy(other); return *this; } bool operator < (const char *other_str) const { return str_comp(str, other_str) < 0; } operator const char *() const { return str; } const char *cstr() const { return str; } }; /* normal allocated string */ typedef string_base > string; #endif // TL_FILE_STRING_HPP teeworlds-0.6.2+dfsg/src/base/tl/threading.h0000644000175000017500000000377412140200333017703 0ustar felixfelix #pragma once #include "../system.h" /* atomic_inc - should return the value after increment atomic_dec - should return the value after decrement atomic_compswap - should return the value before the eventual swap sync_barrier - creates a full hardware fence */ #if defined(__GNUC__) inline unsigned atomic_inc(volatile unsigned *pValue) { return __sync_add_and_fetch(pValue, 1); } inline unsigned atomic_dec(volatile unsigned *pValue) { return __sync_add_and_fetch(pValue, -1); } inline unsigned atomic_compswap(volatile unsigned *pValue, unsigned comperand, unsigned value) { return __sync_val_compare_and_swap(pValue, comperand, value); } inline void sync_barrier() { __sync_synchronize(); } #elif defined(_MSC_VER) #include #define WIN32_LEAN_AND_MEAN #include inline unsigned atomic_inc(volatile unsigned *pValue) { return _InterlockedIncrement((volatile long *)pValue); } inline unsigned atomic_dec(volatile unsigned *pValue) { return _InterlockedDecrement((volatile long *)pValue); } inline unsigned atomic_compswap(volatile unsigned *pValue, unsigned comperand, unsigned value) { return _InterlockedCompareExchange((volatile long *)pValue, (long)value, (long)comperand); } inline void sync_barrier() { MemoryBarrier(); } #else #error missing atomic implementation for this compiler #endif #if defined(CONF_PLATFORM_MACOSX) /* use semaphore provided by SDL on macosx */ #else class semaphore { SEMAPHORE sem; public: semaphore() { semaphore_init(&sem); } ~semaphore() { semaphore_destroy(&sem); } void wait() { semaphore_wait(&sem); } void signal() { semaphore_signal(&sem); } }; #endif class lock { friend class scope_lock; LOCK var; void take() { lock_wait(var); } void release() { lock_release(var); } public: lock() { var = lock_create(); } ~lock() { lock_destroy(var); } }; class scope_lock { lock *var; public: scope_lock(lock *l) { var = l; var->take(); } ~scope_lock() { var->release(); } }; teeworlds-0.6.2+dfsg/src/base/vmath.h0000644000175000017500000001652412140200333016433 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef BASE_VMATH_H #define BASE_VMATH_H #include // ------------------------------------ template class vector2_base { public: union { T x,u; }; union { T y,v; }; vector2_base() {} vector2_base(float nx, float ny) { x = nx; y = ny; } vector2_base operator -() const { return vector2_base(-x, -y); } vector2_base operator -(const vector2_base &v) const { return vector2_base(x-v.x, y-v.y); } vector2_base operator +(const vector2_base &v) const { return vector2_base(x+v.x, y+v.y); } vector2_base operator *(const T v) const { return vector2_base(x*v, y*v); } vector2_base operator *(const vector2_base &v) const { return vector2_base(x*v.x, y*v.y); } vector2_base operator /(const T v) const { return vector3_base(x/v, y/v); } vector2_base operator /(const vector2_base &v) const { return vector2_base(x/v.x, y/v.y); } const vector2_base &operator =(const vector2_base &v) { x = v.x; y = v.y; return *this; } const vector2_base &operator +=(const vector2_base &v) { x += v.x; y += v.y; return *this; } const vector2_base &operator -=(const vector2_base &v) { x -= v.x; y -= v.y; return *this; } const vector2_base &operator *=(const T v) { x *= v; y *= v; return *this; } const vector2_base &operator *=(const vector2_base &v) { x *= v.x; y *= v.y; return *this; } const vector2_base &operator /=(const T v) { x /= v; y /= v; return *this; } const vector2_base &operator /=(const vector2_base &v) { x /= v.x; y /= v.y; return *this; } bool operator ==(const vector2_base &v) const { return x == v.x && y == v.y; } //TODO: do this with an eps instead operator const T* () { return &x; } }; template inline T length(const vector2_base &a) { return sqrtf(a.x*a.x + a.y*a.y); } template inline T distance(const vector2_base a, const vector2_base &b) { return length(a-b); } template inline T dot(const vector2_base a, const vector2_base &b) { return a.x*b.x + a.y*b.y; } template inline vector2_base normalize(const vector2_base &v) { T l = (T)(1.0f/sqrtf(v.x*v.x + v.y*v.y)); return vector2_base(v.x*l, v.y*l); } typedef vector2_base vec2; typedef vector2_base bvec2; typedef vector2_base ivec2; template inline vector2_base closest_point_on_line(vector2_base line_point0, vector2_base line_point1, vector2_base target_point) { vector2_base c = target_point - line_point0; vector2_base v = (line_point1 - line_point0); v = normalize(v); T d = length(line_point0-line_point1); T t = dot(v, c)/d; return mix(line_point0, line_point1, clamp(t, (T)0, (T)1)); /* if (t < 0) t = 0; if (t > 1.0f) return 1.0f; return t;*/ } // ------------------------------------ template class vector3_base { public: union { T x,r,h; }; union { T y,g,s; }; union { T z,b,v,l; }; vector3_base() {} vector3_base(float nx, float ny, float nz) { x = nx; y = ny; z = nz; } const vector3_base &operator =(const vector3_base &v) { x = v.x; y = v.y; z = v.z; return *this; } vector3_base operator -(const vector3_base &v) const { return vector3_base(x-v.x, y-v.y, z-v.z); } vector3_base operator -() const { return vector3_base(-x, -y, -z); } vector3_base operator +(const vector3_base &v) const { return vector3_base(x+v.x, y+v.y, z+v.z); } vector3_base operator *(const T v) const { return vector3_base(x*v, y*v, z*v); } vector3_base operator *(const vector3_base &v) const { return vector3_base(x*v.x, y*v.y, z*v.z); } vector3_base operator /(const T v) const { return vector3_base(x/v, y/v, z/v); } vector3_base operator /(const vector3_base &v) const { return vector3_base(x/v.x, y/v.y, z/v.z); } const vector3_base &operator +=(const vector3_base &v) { x += v.x; y += v.y; z += v.z; return *this; } const vector3_base &operator -=(const vector3_base &v) { x -= v.x; y -= v.y; z -= v.z; return *this; } const vector3_base &operator *=(const T v) { x *= v; y *= v; z *= v; return *this; } const vector3_base &operator *=(const vector3_base &v) { x *= v.x; y *= v.y; z *= v.z; return *this; } const vector3_base &operator /=(const T v) { x /= v; y /= v; z /= v; return *this; } const vector3_base &operator /=(const vector3_base &v) { x /= v.x; y /= v.y; z /= v.z; return *this; } bool operator ==(const vector3_base &v) const { return x == v.x && y == v.y && z == v.z; } //TODO: do this with an eps instead operator const T* () { return &x; } }; template inline T length(const vector3_base &a) { return sqrtf(a.x*a.x + a.y*a.y + a.z*a.z); } template inline T distance(const vector3_base &a, const vector3_base &b) { return length(a-b); } template inline T dot(const vector3_base &a, const vector3_base &b) { return a.x*b.x + a.y*b.y + a.z*b.z; } template inline vector3_base normalize(const vector3_base &v) { T l = (T)(1.0f/sqrtf(v.x*v.x + v.y*v.y + v.z*v.z)); return vector3_base(v.x*l, v.y*l, v.z*l); } template inline vector3_base cross(const vector3_base &a, const vector3_base &b) { return vector3_base( a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x); } typedef vector3_base vec3; typedef vector3_base bvec3; typedef vector3_base ivec3; // ------------------------------------ template class vector4_base { public: union { T x,r; }; union { T y,g; }; union { T z,b; }; union { T w,a; }; vector4_base() {} vector4_base(float nx, float ny, float nz, float nw) { x = nx; y = ny; z = nz; w = nw; } vector4_base operator +(const vector4_base &v) const { return vector4_base(x+v.x, y+v.y, z+v.z, w+v.w); } vector4_base operator -(const vector4_base &v) const { return vector4_base(x-v.x, y-v.y, z-v.z, w-v.w); } vector4_base operator -() const { return vector4_base(-x, -y, -z, -w); } vector4_base operator *(const vector4_base &v) const { return vector4_base(x*v.x, y*v.y, z*v.z, w*v.w); } vector4_base operator *(const T v) const { return vector4_base(x*v, y*v, z*v, w*v); } vector4_base operator /(const vector4_base &v) const { return vector4_base(x/v.x, y/v.y, z/v.z, w/v.w); } vector4_base operator /(const T v) const { return vector4_base(x/v, y/v, z/v, w/v); } const vector4_base &operator =(const vector4_base &v) { x = v.x; y = v.y; z = v.z; w = v.w; return *this; } const vector4_base &operator +=(const vector4_base &v) { x += v.x; y += v.y; z += v.z; w += v.w; return *this; } const vector4_base &operator -=(const vector4_base &v) { x -= v.x; y -= v.y; z -= v.z; w -= v.w; return *this; } const vector4_base &operator *=(const T v) { x *= v; y *= v; z *= v; w *= v; return *this; } const vector4_base &operator *=(const vector4_base &v) { x *= v.x; y *= v.y; z *= v.z; w *= v.w; return *this; } const vector4_base &operator /=(const T v) { x /= v; y /= v; z /= v; w /= v; return *this; } const vector4_base &operator /=(const vector4_base &v) { x /= v.x; y /= v.y; z /= v.z; w /= v.w; return *this; } bool operator ==(const vector4_base &v) const { return x == v.x && y == v.y && z == v.z && w == v.w; } //TODO: do this with an eps instead operator const T* () { return &x; } }; typedef vector4_base vec4; typedef vector4_base bvec4; typedef vector4_base ivec4; #endif teeworlds-0.6.2+dfsg/src/engine/0000755000175000017500000000000012141202226015472 5ustar felixfelixteeworlds-0.6.2+dfsg/src/engine/client.h0000644000175000017500000001060512140200333017117 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CLIENT_H #define ENGINE_CLIENT_H #include "kernel.h" #include "message.h" class IClient : public IInterface { MACRO_INTERFACE("client", 0) protected: // quick access to state of the client int m_State; // quick access to time variables int m_PrevGameTick; int m_CurGameTick; float m_GameIntraTick; float m_GameTickTime; int m_PredTick; float m_PredIntraTick; float m_LocalTime; float m_RenderFrameTime; int m_GameTickSpeed; public: class CSnapItem { public: int m_Type; int m_ID; int m_DataSize; }; /* Constants: Client States STATE_OFFLINE - The client is offline. STATE_CONNECTING - The client is trying to connect to a server. STATE_LOADING - The client has connected to a server and is loading resources. STATE_ONLINE - The client is connected to a server and running the game. STATE_DEMOPLAYBACK - The client is playing a demo STATE_QUITING - The client is quiting. */ enum { STATE_OFFLINE=0, STATE_CONNECTING, STATE_LOADING, STATE_ONLINE, STATE_DEMOPLAYBACK, STATE_QUITING, }; // inline int State() const { return m_State; } // tick time access inline int PrevGameTick() const { return m_PrevGameTick; } inline int GameTick() const { return m_CurGameTick; } inline int PredGameTick() const { return m_PredTick; } inline float IntraGameTick() const { return m_GameIntraTick; } inline float PredIntraGameTick() const { return m_PredIntraTick; } inline float GameTickTime() const { return m_GameTickTime; } inline int GameTickSpeed() const { return m_GameTickSpeed; } // other time access inline float RenderFrameTime() const { return m_RenderFrameTime; } inline float LocalTime() const { return m_LocalTime; } // actions virtual void Connect(const char *pAddress) = 0; virtual void Disconnect() = 0; virtual void Quit() = 0; virtual const char *DemoPlayer_Play(const char *pFilename, int StorageType) = 0; virtual void DemoRecorder_Start(const char *pFilename, bool WithTimestamp) = 0; virtual void DemoRecorder_HandleAutoStart() = 0; virtual void DemoRecorder_Stop() = 0; virtual void AutoScreenshot_Start() = 0; virtual void ServerBrowserUpdate() = 0; // networking virtual void EnterGame() = 0; // virtual int MapDownloadAmount() = 0; virtual int MapDownloadTotalsize() = 0; // input virtual int *GetInput(int Tick) = 0; // remote console virtual void RconAuth(const char *pUsername, const char *pPassword) = 0; virtual bool RconAuthed() = 0; virtual bool UseTempRconCommands() = 0; virtual void Rcon(const char *pLine) = 0; // server info virtual void GetServerInfo(class CServerInfo *pServerInfo) = 0; // snapshot interface enum { SNAP_CURRENT=0, SNAP_PREV=1 }; // TODO: Refactor: should redo this a bit i think, too many virtual calls virtual int SnapNumItems(int SnapID) = 0; virtual void *SnapFindItem(int SnapID, int Type, int ID) = 0; virtual void *SnapGetItem(int SnapID, int Index, CSnapItem *pItem) = 0; virtual void SnapInvalidateItem(int SnapID, int Index) = 0; virtual void SnapSetStaticsize(int ItemType, int Size) = 0; virtual int SendMsg(CMsgPacker *pMsg, int Flags) = 0; template int SendPackMsg(T *pMsg, int Flags) { CMsgPacker Packer(pMsg->MsgID()); if(pMsg->Pack(&Packer)) return -1; return SendMsg(&Packer, Flags); } // virtual const char *ErrorString() = 0; virtual const char *LatestVersion() = 0; virtual bool ConnectionProblems() = 0; virtual bool SoundInitFailed() = 0; virtual int GetDebugFont() = 0; }; class IGameClient : public IInterface { MACRO_INTERFACE("gameclient", 0) protected: public: virtual void OnConsoleInit() = 0; virtual void OnRconLine(const char *pLine) = 0; virtual void OnInit() = 0; virtual void OnNewSnapshot() = 0; virtual void OnEnterGame() = 0; virtual void OnShutdown() = 0; virtual void OnRender() = 0; virtual void OnStateChange(int NewState, int OldState) = 0; virtual void OnConnected() = 0; virtual void OnMessage(int MsgID, CUnpacker *pUnpacker) = 0; virtual void OnPredict() = 0; virtual void OnActivateEditor() = 0; virtual int OnSnapInput(int *pData) = 0; virtual const char *GetItemName(int Type) = 0; virtual const char *Version() = 0; virtual const char *NetVersion() = 0; }; extern IGameClient *CreateGameClient(); #endif teeworlds-0.6.2+dfsg/src/engine/client/0000755000175000017500000000000012140200333016744 5ustar felixfelixteeworlds-0.6.2+dfsg/src/engine/client/backend_sdl.cpp0000644000175000017500000004375612140200333021720 0ustar felixfelix #include "SDL.h" #include "SDL_opengl.h" #include #include "graphics_threaded.h" #include "backend_sdl.h" // ------------ CGraphicsBackend_Threaded void CGraphicsBackend_Threaded::ThreadFunc(void *pUser) { #ifdef CONF_PLATFORM_MACOSX CAutoreleasePool AutoreleasePool; #endif CGraphicsBackend_Threaded *pThis = (CGraphicsBackend_Threaded *)pUser; while(!pThis->m_Shutdown) { pThis->m_Activity.wait(); if(pThis->m_pBuffer) { pThis->m_pProcessor->RunBuffer(pThis->m_pBuffer); sync_barrier(); pThis->m_pBuffer = 0x0; pThis->m_BufferDone.signal(); } } } CGraphicsBackend_Threaded::CGraphicsBackend_Threaded() { m_pBuffer = 0x0; m_pProcessor = 0x0; m_pThread = 0x0; } void CGraphicsBackend_Threaded::StartProcessor(ICommandProcessor *pProcessor) { m_Shutdown = false; m_pProcessor = pProcessor; m_pThread = thread_create(ThreadFunc, this); m_BufferDone.signal(); } void CGraphicsBackend_Threaded::StopProcessor() { m_Shutdown = true; m_Activity.signal(); thread_wait(m_pThread); thread_destroy(m_pThread); } void CGraphicsBackend_Threaded::RunBuffer(CCommandBuffer *pBuffer) { WaitForIdle(); m_pBuffer = pBuffer; m_Activity.signal(); } bool CGraphicsBackend_Threaded::IsIdle() const { return m_pBuffer == 0x0; } void CGraphicsBackend_Threaded::WaitForIdle() { while(m_pBuffer != 0x0) m_BufferDone.wait(); } // ------------ CCommandProcessorFragment_General void CCommandProcessorFragment_General::Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand) { pCommand->m_pSemaphore->signal(); } bool CCommandProcessorFragment_General::RunCommand(const CCommandBuffer::SCommand * pBaseCommand) { switch(pBaseCommand->m_Cmd) { case CCommandBuffer::CMD_NOP: break; case CCommandBuffer::CMD_SIGNAL: Cmd_Signal(static_cast(pBaseCommand)); break; default: return false; } return true; } // ------------ CCommandProcessorFragment_OpenGL int CCommandProcessorFragment_OpenGL::TexFormatToOpenGLFormat(int TexFormat) { if(TexFormat == CCommandBuffer::TEXFORMAT_RGB) return GL_RGB; if(TexFormat == CCommandBuffer::TEXFORMAT_ALPHA) return GL_ALPHA; if(TexFormat == CCommandBuffer::TEXFORMAT_RGBA) return GL_RGBA; return GL_RGBA; } unsigned char CCommandProcessorFragment_OpenGL::Sample(int w, int h, const unsigned char *pData, int u, int v, int Offset, int ScaleW, int ScaleH, int Bpp) { int Value = 0; for(int x = 0; x < ScaleW; x++) for(int y = 0; y < ScaleH; y++) Value += pData[((v+y)*w+(u+x))*Bpp+Offset]; return Value/(ScaleW*ScaleH); } void *CCommandProcessorFragment_OpenGL::Rescale(int Width, int Height, int NewWidth, int NewHeight, int Format, const unsigned char *pData) { unsigned char *pTmpData; int ScaleW = Width/NewWidth; int ScaleH = Height/NewHeight; int Bpp = 3; if(Format == CCommandBuffer::TEXFORMAT_RGBA) Bpp = 4; pTmpData = (unsigned char *)mem_alloc(NewWidth*NewHeight*Bpp, 1); int c = 0; for(int y = 0; y < NewHeight; y++) for(int x = 0; x < NewWidth; x++, c++) { pTmpData[c*Bpp] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 0, ScaleW, ScaleH, Bpp); pTmpData[c*Bpp+1] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 1, ScaleW, ScaleH, Bpp); pTmpData[c*Bpp+2] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 2, ScaleW, ScaleH, Bpp); if(Bpp == 4) pTmpData[c*Bpp+3] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 3, ScaleW, ScaleH, Bpp); } return pTmpData; } void CCommandProcessorFragment_OpenGL::SetState(const CCommandBuffer::SState &State) { // blend switch(State.m_BlendMode) { case CCommandBuffer::BLEND_NONE: glDisable(GL_BLEND); break; case CCommandBuffer::BLEND_ALPHA: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; case CCommandBuffer::BLEND_ADDITIVE: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); break; default: dbg_msg("render", "unknown blendmode %d\n", State.m_BlendMode); }; // clip if(State.m_ClipEnable) { glScissor(State.m_ClipX, State.m_ClipY, State.m_ClipW, State.m_ClipH); glEnable(GL_SCISSOR_TEST); } else glDisable(GL_SCISSOR_TEST); // texture if(State.m_Texture >= 0 && State.m_Texture < CCommandBuffer::MAX_TEXTURES) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, m_aTextures[State.m_Texture].m_Tex); } else glDisable(GL_TEXTURE_2D); switch(State.m_WrapMode) { case CCommandBuffer::WRAP_REPEAT: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); break; case CCommandBuffer::WRAP_CLAMP: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); break; default: dbg_msg("render", "unknown wrapmode %d\n", State.m_WrapMode); }; // screen mapping glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(State.m_ScreenTL.x, State.m_ScreenBR.x, State.m_ScreenBR.y, State.m_ScreenTL.y, 1.0f, 10.f); } void CCommandProcessorFragment_OpenGL::Cmd_Init(const SCommand_Init *pCommand) { m_pTextureMemoryUsage = pCommand->m_pTextureMemoryUsage; } void CCommandProcessorFragment_OpenGL::Cmd_Texture_Update(const CCommandBuffer::SCommand_Texture_Update *pCommand) { glBindTexture(GL_TEXTURE_2D, m_aTextures[pCommand->m_Slot].m_Tex); glTexSubImage2D(GL_TEXTURE_2D, 0, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height, TexFormatToOpenGLFormat(pCommand->m_Format), GL_UNSIGNED_BYTE, pCommand->m_pData); mem_free(pCommand->m_pData); } void CCommandProcessorFragment_OpenGL::Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand) { glDeleteTextures(1, &m_aTextures[pCommand->m_Slot].m_Tex); *m_pTextureMemoryUsage -= m_aTextures[pCommand->m_Slot].m_MemSize; } void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) { int Width = pCommand->m_Width; int Height = pCommand->m_Height; void *pTexData = pCommand->m_pData; // resample if needed if(pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGBA || pCommand->m_Format == CCommandBuffer::TEXFORMAT_RGB) { int MaxTexSize; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &MaxTexSize); if(Width > MaxTexSize || Height > MaxTexSize) { do { Width>>=1; Height>>=1; } while(Width > MaxTexSize || Height > MaxTexSize); void *pTmpData = Rescale(pCommand->m_Width, pCommand->m_Height, Width, Height, pCommand->m_Format, static_cast(pCommand->m_pData)); mem_free(pTexData); pTexData = pTmpData; } else if(Width > 16 && Height > 16 && (pCommand->m_Flags&CCommandBuffer::TEXFLAG_QUALITY) == 0) { Width>>=1; Height>>=1; void *pTmpData = Rescale(pCommand->m_Width, pCommand->m_Height, Width, Height, pCommand->m_Format, static_cast(pCommand->m_pData)); mem_free(pTexData); pTexData = pTmpData; } } int Oglformat = TexFormatToOpenGLFormat(pCommand->m_Format); int StoreOglformat = TexFormatToOpenGLFormat(pCommand->m_StoreFormat); if(pCommand->m_Flags&CCommandBuffer::TEXFLAG_COMPRESSED) { switch(StoreOglformat) { case GL_RGB: StoreOglformat = GL_COMPRESSED_RGB_ARB; break; case GL_ALPHA: StoreOglformat = GL_COMPRESSED_ALPHA_ARB; break; case GL_RGBA: StoreOglformat = GL_COMPRESSED_RGBA_ARB; break; default: StoreOglformat = GL_COMPRESSED_RGBA_ARB; } } glGenTextures(1, &m_aTextures[pCommand->m_Slot].m_Tex); glBindTexture(GL_TEXTURE_2D, m_aTextures[pCommand->m_Slot].m_Tex); if(pCommand->m_Flags&CCommandBuffer::TEXFLAG_NOMIPMAPS) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, StoreOglformat, Width, Height, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, StoreOglformat, Width, Height, Oglformat, GL_UNSIGNED_BYTE, pTexData); } // calculate memory usage m_aTextures[pCommand->m_Slot].m_MemSize = Width*Height*pCommand->m_PixelSize; while(Width > 2 && Height > 2) { Width>>=1; Height>>=1; m_aTextures[pCommand->m_Slot].m_MemSize += Width*Height*pCommand->m_PixelSize; } *m_pTextureMemoryUsage += m_aTextures[pCommand->m_Slot].m_MemSize; mem_free(pTexData); } void CCommandProcessorFragment_OpenGL::Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand) { glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } void CCommandProcessorFragment_OpenGL::Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand) { SetState(pCommand->m_State); glVertexPointer(3, GL_FLOAT, sizeof(CCommandBuffer::SVertex), (char*)pCommand->m_pVertices); glTexCoordPointer(2, GL_FLOAT, sizeof(CCommandBuffer::SVertex), (char*)pCommand->m_pVertices + sizeof(float)*3); glColorPointer(4, GL_FLOAT, sizeof(CCommandBuffer::SVertex), (char*)pCommand->m_pVertices + sizeof(float)*5); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); switch(pCommand->m_PrimType) { case CCommandBuffer::PRIMTYPE_QUADS: glDrawArrays(GL_QUADS, 0, pCommand->m_PrimCount*4); break; case CCommandBuffer::PRIMTYPE_LINES: glDrawArrays(GL_LINES, 0, pCommand->m_PrimCount*2); break; default: dbg_msg("render", "unknown primtype %d\n", pCommand->m_Cmd); }; } void CCommandProcessorFragment_OpenGL::Cmd_Screenshot(const CCommandBuffer::SCommand_Screenshot *pCommand) { // fetch image data GLint aViewport[4] = {0,0,0,0}; glGetIntegerv(GL_VIEWPORT, aViewport); int w = aViewport[2]; int h = aViewport[3]; // we allocate one more row to use when we are flipping the texture unsigned char *pPixelData = (unsigned char *)mem_alloc(w*(h+1)*3, 1); unsigned char *pTempRow = pPixelData+w*h*3; // fetch the pixels GLint Alignment; glGetIntegerv(GL_PACK_ALIGNMENT, &Alignment); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0,0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pPixelData); glPixelStorei(GL_PACK_ALIGNMENT, Alignment); // flip the pixel because opengl works from bottom left corner for(int y = 0; y < h/2; y++) { mem_copy(pTempRow, pPixelData+y*w*3, w*3); mem_copy(pPixelData+y*w*3, pPixelData+(h-y-1)*w*3, w*3); mem_copy(pPixelData+(h-y-1)*w*3, pTempRow,w*3); } // fill in the information pCommand->m_pImage->m_Width = w; pCommand->m_pImage->m_Height = h; pCommand->m_pImage->m_Format = CImageInfo::FORMAT_RGB; pCommand->m_pImage->m_pData = pPixelData; } CCommandProcessorFragment_OpenGL::CCommandProcessorFragment_OpenGL() { mem_zero(m_aTextures, sizeof(m_aTextures)); m_pTextureMemoryUsage = 0; } bool CCommandProcessorFragment_OpenGL::RunCommand(const CCommandBuffer::SCommand * pBaseCommand) { switch(pBaseCommand->m_Cmd) { case CMD_INIT: Cmd_Init(static_cast(pBaseCommand)); break; case CCommandBuffer::CMD_TEXTURE_CREATE: Cmd_Texture_Create(static_cast(pBaseCommand)); break; case CCommandBuffer::CMD_TEXTURE_DESTROY: Cmd_Texture_Destroy(static_cast(pBaseCommand)); break; case CCommandBuffer::CMD_TEXTURE_UPDATE: Cmd_Texture_Update(static_cast(pBaseCommand)); break; case CCommandBuffer::CMD_CLEAR: Cmd_Clear(static_cast(pBaseCommand)); break; case CCommandBuffer::CMD_RENDER: Cmd_Render(static_cast(pBaseCommand)); break; case CCommandBuffer::CMD_SCREENSHOT: Cmd_Screenshot(static_cast(pBaseCommand)); break; default: return false; } return true; } // ------------ CCommandProcessorFragment_SDL void CCommandProcessorFragment_SDL::Cmd_Init(const SCommand_Init *pCommand) { m_GLContext = pCommand->m_Context; GL_MakeCurrent(m_GLContext); // set some default settings glEnable(GL_BLEND); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glAlphaFunc(GL_GREATER, 0); glEnable(GL_ALPHA_TEST); glDepthMask(0); } void CCommandProcessorFragment_SDL::Cmd_Shutdown(const SCommand_Shutdown *pCommand) { GL_ReleaseContext(m_GLContext); } void CCommandProcessorFragment_SDL::Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand) { GL_SwapBuffers(m_GLContext); if(pCommand->m_Finish) glFinish(); } void CCommandProcessorFragment_SDL::Cmd_VideoModes(const CCommandBuffer::SCommand_VideoModes *pCommand) { // TODO: fix this code on osx or windows SDL_Rect **ppModes = SDL_ListModes(NULL, SDL_OPENGL|SDL_GL_DOUBLEBUFFER|SDL_FULLSCREEN); if(ppModes == NULL) { // no modes *pCommand->m_pNumModes = 0; } else if(ppModes == (SDL_Rect**)-1) { // no modes *pCommand->m_pNumModes = 0; } else { int NumModes = 0; for(int i = 0; ppModes[i]; ++i) { if(NumModes == pCommand->m_MaxModes) break; pCommand->m_pModes[NumModes].m_Width = ppModes[i]->w; pCommand->m_pModes[NumModes].m_Height = ppModes[i]->h; pCommand->m_pModes[NumModes].m_Red = 8; pCommand->m_pModes[NumModes].m_Green = 8; pCommand->m_pModes[NumModes].m_Blue = 8; NumModes++; } *pCommand->m_pNumModes = NumModes; } } CCommandProcessorFragment_SDL::CCommandProcessorFragment_SDL() { } bool CCommandProcessorFragment_SDL::RunCommand(const CCommandBuffer::SCommand *pBaseCommand) { switch(pBaseCommand->m_Cmd) { case CCommandBuffer::CMD_SWAP: Cmd_Swap(static_cast(pBaseCommand)); break; case CCommandBuffer::CMD_VIDEOMODES: Cmd_VideoModes(static_cast(pBaseCommand)); break; case CMD_INIT: Cmd_Init(static_cast(pBaseCommand)); break; case CMD_SHUTDOWN: Cmd_Shutdown(static_cast(pBaseCommand)); break; default: return false; } return true; } // ------------ CCommandProcessor_SDL_OpenGL void CCommandProcessor_SDL_OpenGL::RunBuffer(CCommandBuffer *pBuffer) { unsigned CmdIndex = 0; while(1) { const CCommandBuffer::SCommand *pBaseCommand = pBuffer->GetCommand(&CmdIndex); if(pBaseCommand == 0x0) break; if(m_OpenGL.RunCommand(pBaseCommand)) continue; if(m_SDL.RunCommand(pBaseCommand)) continue; if(m_General.RunCommand(pBaseCommand)) continue; dbg_msg("graphics", "unknown command %d", pBaseCommand->m_Cmd); } } // ------------ CGraphicsBackend_SDL_OpenGL int CGraphicsBackend_SDL_OpenGL::Init(const char *pName, int *Width, int *Height, int FsaaSamples, int Flags) { if(!SDL_WasInit(SDL_INIT_VIDEO)) { if(SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { dbg_msg("gfx", "unable to init SDL video: %s", SDL_GetError()); return -1; } #ifdef CONF_FAMILY_WINDOWS if(!getenv("SDL_VIDEO_WINDOW_POS") && !getenv("SDL_VIDEO_CENTERED")) // ignore_convention putenv("SDL_VIDEO_WINDOW_POS=center"); // ignore_convention #endif } const SDL_VideoInfo *pInfo = SDL_GetVideoInfo(); SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); // prevent stuck mouse cursor sdl-bug when loosing fullscreen focus in windows // use current resolution as default if(*Width == 0 || *Height == 0) { *Width = pInfo->current_w; *Height = pInfo->current_h; } // set flags int SdlFlags = SDL_OPENGL; if(Flags&IGraphicsBackend::INITFLAG_RESIZABLE) SdlFlags |= SDL_RESIZABLE; if(pInfo->hw_available) // ignore_convention SdlFlags |= SDL_HWSURFACE; else SdlFlags |= SDL_SWSURFACE; if(pInfo->blit_hw) // ignore_convention SdlFlags |= SDL_HWACCEL; dbg_assert(!(Flags&IGraphicsBackend::INITFLAG_BORDERLESS) || !(Flags&IGraphicsBackend::INITFLAG_FULLSCREEN), "only one of borderless and fullscreen may be activated at the same time"); if(Flags&IGraphicsBackend::INITFLAG_BORDERLESS) SdlFlags |= SDL_NOFRAME; if(Flags&IGraphicsBackend::INITFLAG_FULLSCREEN) SdlFlags |= SDL_FULLSCREEN; // set gl attributes if(FsaaSamples) { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, FsaaSamples); } else { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, Flags&IGraphicsBackend::INITFLAG_VSYNC ? 1 : 0); // set caption SDL_WM_SetCaption(pName, pName); // create window m_pScreenSurface = SDL_SetVideoMode(*Width, *Height, 0, SdlFlags); if(!m_pScreenSurface) { dbg_msg("gfx", "unable to set video mode: %s", SDL_GetError()); //*pCommand->m_pResult = -1; return -1; } SDL_ShowCursor(0); // fetch gl contexts and release the context from this thread m_GLContext = GL_GetCurrentContext(); GL_ReleaseContext(m_GLContext); // start the command processor m_pProcessor = new CCommandProcessor_SDL_OpenGL; StartProcessor(m_pProcessor); // issue init commands for OpenGL and SDL CCommandBuffer CmdBuffer(1024, 512); CCommandProcessorFragment_OpenGL::SCommand_Init CmdOpenGL; CmdOpenGL.m_pTextureMemoryUsage = &m_TextureMemoryUsage; CmdBuffer.AddCommand(CmdOpenGL); CCommandProcessorFragment_SDL::SCommand_Init CmdSDL; CmdSDL.m_Context = m_GLContext; CmdBuffer.AddCommand(CmdSDL); RunBuffer(&CmdBuffer); WaitForIdle(); // return return 0; } int CGraphicsBackend_SDL_OpenGL::Shutdown() { // issue a shutdown command CCommandBuffer CmdBuffer(1024, 512); CCommandProcessorFragment_SDL::SCommand_Shutdown Cmd; CmdBuffer.AddCommand(Cmd); RunBuffer(&CmdBuffer); WaitForIdle(); // stop and delete the processor StopProcessor(); delete m_pProcessor; m_pProcessor = 0; SDL_QuitSubSystem(SDL_INIT_VIDEO); return 0; } int CGraphicsBackend_SDL_OpenGL::MemoryUsage() const { return m_TextureMemoryUsage; } void CGraphicsBackend_SDL_OpenGL::Minimize() { SDL_WM_IconifyWindow(); } void CGraphicsBackend_SDL_OpenGL::Maximize() { // TODO: SDL } int CGraphicsBackend_SDL_OpenGL::WindowActive() { return SDL_GetAppState()&SDL_APPINPUTFOCUS; } int CGraphicsBackend_SDL_OpenGL::WindowOpen() { return SDL_GetAppState()&SDL_APPACTIVE; } IGraphicsBackend *CreateGraphicsBackend() { return new CGraphicsBackend_SDL_OpenGL; } teeworlds-0.6.2+dfsg/src/engine/client/backend_sdl.h0000644000175000017500000001640112140200333021350 0ustar felixfelix #include "SDL.h" #include "SDL_opengl.h" #include "graphics_threaded.h" // platform dependent implementations for transfering render context from the main thread to the graphics thread // TODO: when SDL 1.3 comes, this can be removed #if defined(CONF_FAMILY_WINDOWS) struct SGLContext { HDC m_hDC; HGLRC m_hGLRC; }; static SGLContext GL_GetCurrentContext() { SGLContext Context; Context.m_hDC = wglGetCurrentDC(); Context.m_hGLRC = wglGetCurrentContext(); return Context; } static void GL_MakeCurrent(const SGLContext &Context) { wglMakeCurrent(Context.m_hDC, Context.m_hGLRC); } static void GL_ReleaseContext(const SGLContext &Context) { wglMakeCurrent(NULL, NULL); } static void GL_SwapBuffers(const SGLContext &Context) { SwapBuffers(Context.m_hDC); } #elif defined(CONF_PLATFORM_MACOSX) #include class semaphore { SDL_sem *sem; public: semaphore() { sem = SDL_CreateSemaphore(0); } ~semaphore() { SDL_DestroySemaphore(sem); } void wait() { SDL_SemWait(sem); } void signal() { SDL_SemPost(sem); } }; struct SGLContext { id m_Context; }; static SGLContext GL_GetCurrentContext() { SGLContext Context; Class NSOpenGLContextClass = (Class) objc_getClass("NSOpenGLContext"); SEL selector = sel_registerName("currentContext"); Context.m_Context = objc_msgSend((objc_object*) NSOpenGLContextClass, selector); return Context; } static void GL_MakeCurrent(const SGLContext &Context) { SEL selector = sel_registerName("makeCurrentContext"); objc_msgSend(Context.m_Context, selector); } static void GL_ReleaseContext(const SGLContext &Context) { Class NSOpenGLContextClass = (Class) objc_getClass("NSOpenGLContext"); SEL selector = sel_registerName("clearCurrentContext"); objc_msgSend((objc_object*) NSOpenGLContextClass, selector); } static void GL_SwapBuffers(const SGLContext &Context) { SEL selector = sel_registerName("flushBuffer"); objc_msgSend(Context.m_Context, selector); } class CAutoreleasePool { private: id m_Pool; public: CAutoreleasePool() { Class NSAutoreleasePoolClass = (Class) objc_getClass("NSAutoreleasePool"); m_Pool = class_createInstance(NSAutoreleasePoolClass, 0); SEL selector = sel_registerName("init"); objc_msgSend(m_Pool, selector); } ~CAutoreleasePool() { SEL selector = sel_registerName("drain"); objc_msgSend(m_Pool, selector); } }; #elif defined(CONF_FAMILY_UNIX) #include struct SGLContext { Display *m_pDisplay; GLXDrawable m_Drawable; GLXContext m_Context; }; static SGLContext GL_GetCurrentContext() { SGLContext Context; Context.m_pDisplay = glXGetCurrentDisplay(); Context.m_Drawable = glXGetCurrentDrawable(); Context.m_Context = glXGetCurrentContext(); return Context; } static void GL_MakeCurrent(const SGLContext &Context) { glXMakeCurrent(Context.m_pDisplay, Context.m_Drawable, Context.m_Context); } static void GL_ReleaseContext(const SGLContext &Context) { glXMakeCurrent(Context.m_pDisplay, None, 0x0); } static void GL_SwapBuffers(const SGLContext &Context) { glXSwapBuffers(Context.m_pDisplay, Context.m_Drawable); } #else #error missing implementation #endif // basic threaded backend, abstract, missing init and shutdown functions class CGraphicsBackend_Threaded : public IGraphicsBackend { public: // constructed on the main thread, the rest of the functions is runned on the render thread class ICommandProcessor { public: virtual ~ICommandProcessor() {} virtual void RunBuffer(CCommandBuffer *pBuffer) = 0; }; CGraphicsBackend_Threaded(); virtual void RunBuffer(CCommandBuffer *pBuffer); virtual bool IsIdle() const; virtual void WaitForIdle(); protected: void StartProcessor(ICommandProcessor *pProcessor); void StopProcessor(); private: ICommandProcessor *m_pProcessor; CCommandBuffer * volatile m_pBuffer; volatile bool m_Shutdown; semaphore m_Activity; semaphore m_BufferDone; void *m_pThread; static void ThreadFunc(void *pUser); }; // takes care of implementation independent operations class CCommandProcessorFragment_General { void Cmd_Nop(); void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand); public: bool RunCommand(const CCommandBuffer::SCommand * pBaseCommand); }; // takes care of opengl related rendering class CCommandProcessorFragment_OpenGL { struct CTexture { GLuint m_Tex; int m_MemSize; }; CTexture m_aTextures[CCommandBuffer::MAX_TEXTURES]; volatile int *m_pTextureMemoryUsage; public: enum { CMD_INIT = CCommandBuffer::CMDGROUP_PLATFORM_OPENGL, }; struct SCommand_Init : public CCommandBuffer::SCommand { SCommand_Init() : SCommand(CMD_INIT) {} volatile int *m_pTextureMemoryUsage; }; private: static int TexFormatToOpenGLFormat(int TexFormat); static unsigned char Sample(int w, int h, const unsigned char *pData, int u, int v, int Offset, int ScaleW, int ScaleH, int Bpp); static void *Rescale(int Width, int Height, int NewWidth, int NewHeight, int Format, const unsigned char *pData); void SetState(const CCommandBuffer::SState &State); void Cmd_Init(const SCommand_Init *pCommand); void Cmd_Texture_Update(const CCommandBuffer::SCommand_Texture_Update *pCommand); void Cmd_Texture_Destroy(const CCommandBuffer::SCommand_Texture_Destroy *pCommand); void Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand); void Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand); void Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand); void Cmd_Screenshot(const CCommandBuffer::SCommand_Screenshot *pCommand); public: CCommandProcessorFragment_OpenGL(); bool RunCommand(const CCommandBuffer::SCommand * pBaseCommand); }; // takes care of sdl related commands class CCommandProcessorFragment_SDL { // SDL stuff SGLContext m_GLContext; public: enum { CMD_INIT = CCommandBuffer::CMDGROUP_PLATFORM_SDL, CMD_SHUTDOWN, }; struct SCommand_Init : public CCommandBuffer::SCommand { SCommand_Init() : SCommand(CMD_INIT) {} SGLContext m_Context; }; struct SCommand_Shutdown : public CCommandBuffer::SCommand { SCommand_Shutdown() : SCommand(CMD_SHUTDOWN) {} }; private: void Cmd_Init(const SCommand_Init *pCommand); void Cmd_Shutdown(const SCommand_Shutdown *pCommand); void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand); void Cmd_VideoModes(const CCommandBuffer::SCommand_VideoModes *pCommand); public: CCommandProcessorFragment_SDL(); bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand); }; // command processor impelementation, uses the fragments to combine into one processor class CCommandProcessor_SDL_OpenGL : public CGraphicsBackend_Threaded::ICommandProcessor { CCommandProcessorFragment_OpenGL m_OpenGL; CCommandProcessorFragment_SDL m_SDL; CCommandProcessorFragment_General m_General; public: virtual void RunBuffer(CCommandBuffer *pBuffer); }; // graphics backend implemented with SDL and OpenGL class CGraphicsBackend_SDL_OpenGL : public CGraphicsBackend_Threaded { SDL_Surface *m_pScreenSurface; ICommandProcessor *m_pProcessor; SGLContext m_GLContext; volatile int m_TextureMemoryUsage; public: virtual int Init(const char *pName, int *Width, int *Height, int FsaaSamples, int Flags); virtual int Shutdown(); virtual int MemoryUsage() const; virtual void Minimize(); virtual void Maximize(); virtual int WindowActive(); virtual int WindowOpen(); }; teeworlds-0.6.2+dfsg/src/engine/client/client.cpp0000644000175000017500000017554712140200333020751 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include // qsort #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "friends.h" #include "serverbrowser.h" #include "client.h" #if defined(CONF_FAMILY_WINDOWS) #define _WIN32_WINNT 0x0501 #define WIN32_LEAN_AND_MEAN #include #endif #include "SDL.h" #ifdef main #undef main #endif void CGraph::Init(float Min, float Max) { m_Min = Min; m_Max = Max; m_Index = 0; } void CGraph::ScaleMax() { int i = 0; m_Max = 0; for(i = 0; i < MAX_VALUES; i++) { if(m_aValues[i] > m_Max) m_Max = m_aValues[i]; } } void CGraph::ScaleMin() { int i = 0; m_Min = m_Max; for(i = 0; i < MAX_VALUES; i++) { if(m_aValues[i] < m_Min) m_Min = m_aValues[i]; } } void CGraph::Add(float v, float r, float g, float b) { m_Index = (m_Index+1)&(MAX_VALUES-1); m_aValues[m_Index] = v; m_aColors[m_Index][0] = r; m_aColors[m_Index][1] = g; m_aColors[m_Index][2] = b; } void CGraph::Render(IGraphics *pGraphics, int Font, float x, float y, float w, float h, const char *pDescription) { //m_pGraphics->BlendNormal(); pGraphics->TextureSet(-1); pGraphics->QuadsBegin(); pGraphics->SetColor(0, 0, 0, 0.75f); IGraphics::CQuadItem QuadItem(x, y, w, h); pGraphics->QuadsDrawTL(&QuadItem, 1); pGraphics->QuadsEnd(); pGraphics->LinesBegin(); pGraphics->SetColor(0.95f, 0.95f, 0.95f, 1.00f); IGraphics::CLineItem LineItem(x, y+h/2, x+w, y+h/2); pGraphics->LinesDraw(&LineItem, 1); pGraphics->SetColor(0.5f, 0.5f, 0.5f, 0.75f); IGraphics::CLineItem Array[2] = { IGraphics::CLineItem(x, y+(h*3)/4, x+w, y+(h*3)/4), IGraphics::CLineItem(x, y+h/4, x+w, y+h/4)}; pGraphics->LinesDraw(Array, 2); for(int i = 1; i < MAX_VALUES; i++) { float a0 = (i-1)/(float)MAX_VALUES; float a1 = i/(float)MAX_VALUES; int i0 = (m_Index+i-1)&(MAX_VALUES-1); int i1 = (m_Index+i)&(MAX_VALUES-1); float v0 = (m_aValues[i0]-m_Min) / (m_Max-m_Min); float v1 = (m_aValues[i1]-m_Min) / (m_Max-m_Min); IGraphics::CColorVertex Array[2] = { IGraphics::CColorVertex(0, m_aColors[i0][0], m_aColors[i0][1], m_aColors[i0][2], 0.75f), IGraphics::CColorVertex(1, m_aColors[i1][0], m_aColors[i1][1], m_aColors[i1][2], 0.75f)}; pGraphics->SetColorVertex(Array, 2); IGraphics::CLineItem LineItem(x+a0*w, y+h-v0*h, x+a1*w, y+h-v1*h); pGraphics->LinesDraw(&LineItem, 1); } pGraphics->LinesEnd(); pGraphics->TextureSet(Font); pGraphics->QuadsBegin(); pGraphics->QuadsText(x+2, y+h-16, 16, pDescription); char aBuf[32]; str_format(aBuf, sizeof(aBuf), "%.2f", m_Max); pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+2, 16, aBuf); str_format(aBuf, sizeof(aBuf), "%.2f", m_Min); pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+h-16, 16, aBuf); pGraphics->QuadsEnd(); } void CSmoothTime::Init(int64 Target) { m_Snap = time_get(); m_Current = Target; m_Target = Target; m_aAdjustSpeed[0] = 0.3f; m_aAdjustSpeed[1] = 0.3f; m_Graph.Init(0.0f, 0.5f); } void CSmoothTime::SetAdjustSpeed(int Direction, float Value) { m_aAdjustSpeed[Direction] = Value; } int64 CSmoothTime::Get(int64 Now) { int64 c = m_Current + (Now - m_Snap); int64 t = m_Target + (Now - m_Snap); // it's faster to adjust upward instead of downward // we might need to adjust these abit float AdjustSpeed = m_aAdjustSpeed[0]; if(t > c) AdjustSpeed = m_aAdjustSpeed[1]; float a = ((Now-m_Snap)/(float)time_freq()) * AdjustSpeed; if(a > 1.0f) a = 1.0f; int64 r = c + (int64)((t-c)*a); m_Graph.Add(a+0.5f,1,1,1); return r; } void CSmoothTime::UpdateInt(int64 Target) { int64 Now = time_get(); m_Current = Get(Now); m_Snap = Now; m_Target = Target; } void CSmoothTime::Update(CGraph *pGraph, int64 Target, int TimeLeft, int AdjustDirection) { int UpdateTimer = 1; if(TimeLeft < 0) { int IsSpike = 0; if(TimeLeft < -50) { IsSpike = 1; m_SpikeCounter += 5; if(m_SpikeCounter > 50) m_SpikeCounter = 50; } if(IsSpike && m_SpikeCounter < 15) { // ignore this ping spike UpdateTimer = 0; pGraph->Add(TimeLeft, 1,1,0); } else { pGraph->Add(TimeLeft, 1,0,0); if(m_aAdjustSpeed[AdjustDirection] < 30.0f) m_aAdjustSpeed[AdjustDirection] *= 2.0f; } } else { if(m_SpikeCounter) m_SpikeCounter--; pGraph->Add(TimeLeft, 0,1,0); m_aAdjustSpeed[AdjustDirection] *= 0.95f; if(m_aAdjustSpeed[AdjustDirection] < 2.0f) m_aAdjustSpeed[AdjustDirection] = 2.0f; } if(UpdateTimer) UpdateInt(Target); } CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta), m_DemoRecorder(&m_SnapshotDelta) { m_pEditor = 0; m_pInput = 0; m_pGraphics = 0; m_pSound = 0; m_pGameClient = 0; m_pMap = 0; m_pConsole = 0; m_RenderFrameTime = 0.0001f; m_RenderFrameTimeLow = 1.0f; m_RenderFrameTimeHigh = 0.0f; m_RenderFrames = 0; m_LastRenderTime = time_get(); m_GameTickSpeed = SERVER_TICK_SPEED; m_WindowMustRefocus = 0; m_SnapCrcErrors = 0; m_AutoScreenshotRecycle = false; m_EditorActive = false; m_AckGameTick = -1; m_CurrentRecvTick = 0; m_RconAuthed = 0; // version-checking m_aVersionStr[0] = '0'; m_aVersionStr[1] = 0; // pinging m_PingStartTime = 0; // m_aCurrentMap[0] = 0; m_CurrentMapCrc = 0; // m_aCmdConnect[0] = 0; // map download m_aMapdownloadFilename[0] = 0; m_aMapdownloadName[0] = 0; m_MapdownloadFile = 0; m_MapdownloadChunk = 0; m_MapdownloadCrc = 0; m_MapdownloadAmount = -1; m_MapdownloadTotalsize = -1; m_CurrentServerInfoRequestTime = -1; m_CurrentInput = 0; m_State = IClient::STATE_OFFLINE; m_aServerAddressStr[0] = 0; mem_zero(m_aSnapshots, sizeof(m_aSnapshots)); m_SnapshotStorage.Init(); m_RecivedSnapshots = 0; m_VersionInfo.m_State = CVersionInfo::STATE_INIT; } // ----- send functions ----- int CClient::SendMsg(CMsgPacker *pMsg, int Flags) { return SendMsgEx(pMsg, Flags, false); } int CClient::SendMsgEx(CMsgPacker *pMsg, int Flags, bool System) { CNetChunk Packet; if(State() == IClient::STATE_OFFLINE) return 0; mem_zero(&Packet, sizeof(CNetChunk)); Packet.m_ClientID = 0; Packet.m_pData = pMsg->Data(); Packet.m_DataSize = pMsg->Size(); // HACK: modify the message id in the packet and store the system flag if(*((unsigned char*)Packet.m_pData) == 1 && System && Packet.m_DataSize == 1) dbg_break(); *((unsigned char*)Packet.m_pData) <<= 1; if(System) *((unsigned char*)Packet.m_pData) |= 1; if(Flags&MSGFLAG_VITAL) Packet.m_Flags |= NETSENDFLAG_VITAL; if(Flags&MSGFLAG_FLUSH) Packet.m_Flags |= NETSENDFLAG_FLUSH; if(Flags&MSGFLAG_RECORD) { if(m_DemoRecorder.IsRecording()) m_DemoRecorder.RecordMessage(Packet.m_pData, Packet.m_DataSize); } if(!(Flags&MSGFLAG_NOSEND)) m_NetClient.Send(&Packet); return 0; } void CClient::SendInfo() { CMsgPacker Msg(NETMSG_INFO); Msg.AddString(GameClient()->NetVersion(), 128); Msg.AddString(g_Config.m_Password, 128); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH); } void CClient::SendEnterGame() { CMsgPacker Msg(NETMSG_ENTERGAME); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH); } void CClient::SendReady() { CMsgPacker Msg(NETMSG_READY); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH); } void CClient::RconAuth(const char *pName, const char *pPassword) { if(RconAuthed()) return; CMsgPacker Msg(NETMSG_RCON_AUTH); Msg.AddString(pName, 32); Msg.AddString(pPassword, 32); Msg.AddInt(1); SendMsgEx(&Msg, MSGFLAG_VITAL); } void CClient::Rcon(const char *pCmd) { CMsgPacker Msg(NETMSG_RCON_CMD); Msg.AddString(pCmd, 256); SendMsgEx(&Msg, MSGFLAG_VITAL); } bool CClient::ConnectionProblems() { return m_NetClient.GotProblems() != 0; } void CClient::DirectInput(int *pInput, int Size) { int i; CMsgPacker Msg(NETMSG_INPUT); Msg.AddInt(m_AckGameTick); Msg.AddInt(m_PredTick); Msg.AddInt(Size); for(i = 0; i < Size/4; i++) Msg.AddInt(pInput[i]); SendMsgEx(&Msg, 0); } void CClient::SendInput() { int64 Now = time_get(); if(m_PredTick <= 0) return; // fetch input int Size = GameClient()->OnSnapInput(m_aInputs[m_CurrentInput].m_aData); if(!Size) return; // pack input CMsgPacker Msg(NETMSG_INPUT); Msg.AddInt(m_AckGameTick); Msg.AddInt(m_PredTick); Msg.AddInt(Size); m_aInputs[m_CurrentInput].m_Tick = m_PredTick; m_aInputs[m_CurrentInput].m_PredictedTime = m_PredictedTime.Get(Now); m_aInputs[m_CurrentInput].m_Time = Now; // pack it for(int i = 0; i < Size/4; i++) Msg.AddInt(m_aInputs[m_CurrentInput].m_aData[i]); m_CurrentInput++; m_CurrentInput%=200; SendMsgEx(&Msg, MSGFLAG_FLUSH); } const char *CClient::LatestVersion() { return m_aVersionStr; } // TODO: OPT: do this alot smarter! int *CClient::GetInput(int Tick) { int Best = -1; for(int i = 0; i < 200; i++) { if(m_aInputs[i].m_Tick <= Tick && (Best == -1 || m_aInputs[Best].m_Tick < m_aInputs[i].m_Tick)) Best = i; } if(Best != -1) return (int *)m_aInputs[Best].m_aData; return 0; } // ------ state handling ----- void CClient::SetState(int s) { if(m_State == IClient::STATE_QUITING) return; int Old = m_State; if(g_Config.m_Debug) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "state change. last=%d current=%d", m_State, s); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", aBuf); } m_State = s; if(Old != s) GameClient()->OnStateChange(m_State, Old); } // called when the map is loaded and we should init for a new round void CClient::OnEnterGame() { // reset input int i; for(i = 0; i < 200; i++) m_aInputs[i].m_Tick = -1; m_CurrentInput = 0; // reset snapshots m_aSnapshots[SNAP_CURRENT] = 0; m_aSnapshots[SNAP_PREV] = 0; m_SnapshotStorage.PurgeAll(); m_RecivedSnapshots = 0; m_SnapshotParts = 0; m_PredTick = 0; m_CurrentRecvTick = 0; m_CurGameTick = 0; m_PrevGameTick = 0; } void CClient::EnterGame() { if(State() == IClient::STATE_DEMOPLAYBACK) return; // now we will wait for two snapshots // to finish the connection SendEnterGame(); OnEnterGame(); } void CClient::Connect(const char *pAddress) { char aBuf[512]; int Port = 8303; Disconnect(); str_copy(m_aServerAddressStr, pAddress, sizeof(m_aServerAddressStr)); str_format(aBuf, sizeof(aBuf), "connecting to '%s'", m_aServerAddressStr); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); ServerInfoRequest(); if(net_host_lookup(m_aServerAddressStr, &m_ServerAddress, m_NetClient.NetType()) != 0) { char aBufMsg[256]; str_format(aBufMsg, sizeof(aBufMsg), "could not find the address of %s, connecting to localhost", aBuf); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBufMsg); net_host_lookup("localhost", &m_ServerAddress, m_NetClient.NetType()); } m_RconAuthed = 0; if(m_ServerAddress.port == 0) m_ServerAddress.port = Port; m_NetClient.Connect(&m_ServerAddress); SetState(IClient::STATE_CONNECTING); if(m_DemoRecorder.IsRecording()) DemoRecorder_Stop(); m_InputtimeMarginGraph.Init(-150.0f, 150.0f); m_GametimeMarginGraph.Init(-150.0f, 150.0f); } void CClient::DisconnectWithReason(const char *pReason) { char aBuf[512]; str_format(aBuf, sizeof(aBuf), "disconnecting. reason='%s'", pReason?pReason:"unknown"); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); // stop demo playback and recorder m_DemoPlayer.Stop(); DemoRecorder_Stop(); // m_RconAuthed = 0; m_UseTempRconCommands = 0; m_pConsole->DeregisterTempAll(); m_NetClient.Disconnect(pReason); SetState(IClient::STATE_OFFLINE); m_pMap->Unload(); // disable all downloads m_MapdownloadChunk = 0; if(m_MapdownloadFile) io_close(m_MapdownloadFile); m_MapdownloadFile = 0; m_MapdownloadCrc = 0; m_MapdownloadTotalsize = -1; m_MapdownloadAmount = 0; // clear the current server info mem_zero(&m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); mem_zero(&m_ServerAddress, sizeof(m_ServerAddress)); // clear snapshots m_aSnapshots[SNAP_CURRENT] = 0; m_aSnapshots[SNAP_PREV] = 0; m_RecivedSnapshots = 0; } void CClient::Disconnect() { DisconnectWithReason(0); } void CClient::GetServerInfo(CServerInfo *pServerInfo) { mem_copy(pServerInfo, &m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); } void CClient::ServerInfoRequest() { mem_zero(&m_CurrentServerInfo, sizeof(m_CurrentServerInfo)); m_CurrentServerInfoRequestTime = 0; } int CClient::LoadData() { m_DebugFont = Graphics()->LoadTexture("debug_font.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, IGraphics::TEXLOAD_NORESAMPLE); return 1; } // --- void *CClient::SnapGetItem(int SnapID, int Index, CSnapItem *pItem) { CSnapshotItem *i; dbg_assert(SnapID >= 0 && SnapID < NUM_SNAPSHOT_TYPES, "invalid SnapID"); i = m_aSnapshots[SnapID]->m_pAltSnap->GetItem(Index); pItem->m_DataSize = m_aSnapshots[SnapID]->m_pAltSnap->GetItemSize(Index); pItem->m_Type = i->Type(); pItem->m_ID = i->ID(); return (void *)i->Data(); } void CClient::SnapInvalidateItem(int SnapID, int Index) { CSnapshotItem *i; dbg_assert(SnapID >= 0 && SnapID < NUM_SNAPSHOT_TYPES, "invalid SnapID"); i = m_aSnapshots[SnapID]->m_pAltSnap->GetItem(Index); if(i) { if((char *)i < (char *)m_aSnapshots[SnapID]->m_pAltSnap || (char *)i > (char *)m_aSnapshots[SnapID]->m_pAltSnap + m_aSnapshots[SnapID]->m_SnapSize) m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", "snap invalidate problem"); if((char *)i >= (char *)m_aSnapshots[SnapID]->m_pSnap && (char *)i < (char *)m_aSnapshots[SnapID]->m_pSnap + m_aSnapshots[SnapID]->m_SnapSize) m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", "snap invalidate problem"); i->m_TypeAndID = -1; } } void *CClient::SnapFindItem(int SnapID, int Type, int ID) { // TODO: linear search. should be fixed. int i; if(!m_aSnapshots[SnapID]) return 0x0; for(i = 0; i < m_aSnapshots[SnapID]->m_pSnap->NumItems(); i++) { CSnapshotItem *pItem = m_aSnapshots[SnapID]->m_pAltSnap->GetItem(i); if(pItem->Type() == Type && pItem->ID() == ID) return (void *)pItem->Data(); } return 0x0; } int CClient::SnapNumItems(int SnapID) { dbg_assert(SnapID >= 0 && SnapID < NUM_SNAPSHOT_TYPES, "invalid SnapID"); if(!m_aSnapshots[SnapID]) return 0; return m_aSnapshots[SnapID]->m_pSnap->NumItems(); } void CClient::SnapSetStaticsize(int ItemType, int Size) { m_SnapshotDelta.SetStaticsize(ItemType, Size); } void CClient::DebugRender() { static NETSTATS Prev, Current; static int64 LastSnap = 0; static float FrameTimeAvg = 0; int64 Now = time_get(); char aBuffer[512]; if(!g_Config.m_Debug) return; //m_pGraphics->BlendNormal(); Graphics()->TextureSet(m_DebugFont); Graphics()->MapScreen(0,0,Graphics()->ScreenWidth(),Graphics()->ScreenHeight()); Graphics()->QuadsBegin(); if(time_get()-LastSnap > time_freq()) { LastSnap = time_get(); Prev = Current; net_stats(&Current); } /* eth = 14 ip = 20 udp = 8 total = 42 */ FrameTimeAvg = FrameTimeAvg*0.9f + m_RenderFrameTime*0.1f; str_format(aBuffer, sizeof(aBuffer), "ticks: %8d %8d mem %dk %d gfxmem: %dk fps: %3d", m_CurGameTick, m_PredTick, mem_stats()->allocated/1024, mem_stats()->total_allocations, Graphics()->MemoryUsage()/1024, (int)(1.0f/FrameTimeAvg + 0.5f)); Graphics()->QuadsText(2, 2, 16, aBuffer); { int SendPackets = (Current.sent_packets-Prev.sent_packets); int SendBytes = (Current.sent_bytes-Prev.sent_bytes); int SendTotal = SendBytes + SendPackets*42; int RecvPackets = (Current.recv_packets-Prev.recv_packets); int RecvBytes = (Current.recv_bytes-Prev.recv_bytes); int RecvTotal = RecvBytes + RecvPackets*42; if(!SendPackets) SendPackets++; if(!RecvPackets) RecvPackets++; str_format(aBuffer, sizeof(aBuffer), "send: %3d %5d+%4d=%5d (%3d kbps) avg: %5d\nrecv: %3d %5d+%4d=%5d (%3d kbps) avg: %5d", SendPackets, SendBytes, SendPackets*42, SendTotal, (SendTotal*8)/1024, SendBytes/SendPackets, RecvPackets, RecvBytes, RecvPackets*42, RecvTotal, (RecvTotal*8)/1024, RecvBytes/RecvPackets); Graphics()->QuadsText(2, 14, 16, aBuffer); } // render rates { int y = 0; int i; for(i = 0; i < 256; i++) { if(m_SnapshotDelta.GetDataRate(i)) { str_format(aBuffer, sizeof(aBuffer), "%4d %20s: %8d %8d %8d", i, GameClient()->GetItemName(i), m_SnapshotDelta.GetDataRate(i)/8, m_SnapshotDelta.GetDataUpdates(i), (m_SnapshotDelta.GetDataRate(i)/m_SnapshotDelta.GetDataUpdates(i))/8); Graphics()->QuadsText(2, 100+y*12, 16, aBuffer); y++; } } } str_format(aBuffer, sizeof(aBuffer), "pred: %d ms", (int)((m_PredictedTime.Get(Now)-m_GameTime.Get(Now))*1000/(float)time_freq())); Graphics()->QuadsText(2, 70, 16, aBuffer); Graphics()->QuadsEnd(); // render graphs if(g_Config.m_DbgGraphs) { //Graphics()->MapScreen(0,0,400.0f,300.0f); float w = Graphics()->ScreenWidth()/4.0f; float h = Graphics()->ScreenHeight()/6.0f; float sp = Graphics()->ScreenWidth()/100.0f; float x = Graphics()->ScreenWidth()-w-sp; m_FpsGraph.ScaleMax(); m_FpsGraph.ScaleMin(); m_FpsGraph.Render(Graphics(), m_DebugFont, x, sp*5, w, h, "FPS"); m_InputtimeMarginGraph.Render(Graphics(), m_DebugFont, x, sp*5+h+sp, w, h, "Prediction Margin"); m_GametimeMarginGraph.Render(Graphics(), m_DebugFont, x, sp*5+h+sp+h+sp, w, h, "Gametime Margin"); } } void CClient::Quit() { SetState(IClient::STATE_QUITING); } const char *CClient::ErrorString() { return m_NetClient.ErrorString(); } void CClient::Render() { if(g_Config.m_GfxClear) Graphics()->Clear(1,1,0); GameClient()->OnRender(); DebugRender(); } const char *CClient::LoadMap(const char *pName, const char *pFilename, unsigned WantedCrc) { static char aErrorMsg[128]; SetState(IClient::STATE_LOADING); if(!m_pMap->Load(pFilename)) { str_format(aErrorMsg, sizeof(aErrorMsg), "map '%s' not found", pFilename); return aErrorMsg; } // get the crc of the map if(m_pMap->Crc() != WantedCrc) { str_format(aErrorMsg, sizeof(aErrorMsg), "map differs from the server. %08x != %08x", m_pMap->Crc(), WantedCrc); m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aErrorMsg); m_pMap->Unload(); return aErrorMsg; } // stop demo recording if we loaded a new map DemoRecorder_Stop(); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "loaded map '%s'", pFilename); m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); m_RecivedSnapshots = 0; str_copy(m_aCurrentMap, pName, sizeof(m_aCurrentMap)); m_CurrentMapCrc = m_pMap->Crc(); return 0x0; } const char *CClient::LoadMapSearch(const char *pMapName, int WantedCrc) { const char *pError = 0; char aBuf[512]; str_format(aBuf, sizeof(aBuf), "loading map, map=%s wanted crc=%08x", pMapName, WantedCrc); m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); SetState(IClient::STATE_LOADING); // try the normal maps folder str_format(aBuf, sizeof(aBuf), "maps/%s.map", pMapName); pError = LoadMap(pMapName, aBuf, WantedCrc); if(!pError) return pError; // try the downloaded maps str_format(aBuf, sizeof(aBuf), "downloadedmaps/%s_%08x.map", pMapName, WantedCrc); pError = LoadMap(pMapName, aBuf, WantedCrc); if(!pError) return pError; // search for the map within subfolders char aFilename[128]; str_format(aFilename, sizeof(aFilename), "%s.map", pMapName); if(Storage()->FindFile(aFilename, "maps", IStorage::TYPE_ALL, aBuf, sizeof(aBuf))) pError = LoadMap(pMapName, aBuf, WantedCrc); return pError; } int CClient::PlayerScoreComp(const void *a, const void *b) { CServerInfo::CClient *p0 = (CServerInfo::CClient *)a; CServerInfo::CClient *p1 = (CServerInfo::CClient *)b; if(p0->m_Player && !p1->m_Player) return -1; if(!p0->m_Player && p1->m_Player) return 1; if(p0->m_Score == p1->m_Score) return 0; if(p0->m_Score < p1->m_Score) return 1; return -1; } void CClient::ProcessConnlessPacket(CNetChunk *pPacket) { // version server if(m_VersionInfo.m_State == CVersionInfo::STATE_READY && net_addr_comp(&pPacket->m_Address, &m_VersionInfo.m_VersionServeraddr.m_Addr) == 0) { // version info if(pPacket->m_DataSize == (int)(sizeof(VERSIONSRV_VERSION) + sizeof(GAME_RELEASE_VERSION)) && mem_comp(pPacket->m_pData, VERSIONSRV_VERSION, sizeof(VERSIONSRV_VERSION)) == 0) { char *pVersionData = (char*)pPacket->m_pData + sizeof(VERSIONSRV_VERSION); int VersionMatch = !mem_comp(pVersionData, GAME_RELEASE_VERSION, sizeof(GAME_RELEASE_VERSION)); char aVersion[sizeof(GAME_RELEASE_VERSION)]; str_copy(aVersion, pVersionData, sizeof(aVersion)); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "version does %s (%s)", VersionMatch ? "match" : "NOT match", aVersion); m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/version", aBuf); // assume version is out of date when version-data doesn't match if(!VersionMatch) { str_copy(m_aVersionStr, aVersion, sizeof(m_aVersionStr)); } // request the map version list now CNetChunk Packet; mem_zero(&Packet, sizeof(Packet)); Packet.m_ClientID = -1; Packet.m_Address = m_VersionInfo.m_VersionServeraddr.m_Addr; Packet.m_pData = VERSIONSRV_GETMAPLIST; Packet.m_DataSize = sizeof(VERSIONSRV_GETMAPLIST); Packet.m_Flags = NETSENDFLAG_CONNLESS; m_NetClient.Send(&Packet); } // map version list if(pPacket->m_DataSize >= (int)sizeof(VERSIONSRV_MAPLIST) && mem_comp(pPacket->m_pData, VERSIONSRV_MAPLIST, sizeof(VERSIONSRV_MAPLIST)) == 0) { int Size = pPacket->m_DataSize-sizeof(VERSIONSRV_MAPLIST); int Num = Size/sizeof(CMapVersion); m_MapChecker.AddMaplist((CMapVersion *)((char*)pPacket->m_pData+sizeof(VERSIONSRV_MAPLIST)), Num); } } // server list from master server if(pPacket->m_DataSize >= (int)sizeof(SERVERBROWSE_LIST) && mem_comp(pPacket->m_pData, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST)) == 0) { // check for valid master server address bool Valid = false; for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; ++i) { if(m_pMasterServer->IsValid(i)) { NETADDR Addr = m_pMasterServer->GetAddr(i); if(net_addr_comp(&pPacket->m_Address, &Addr) == 0) { Valid = true; break; } } } if(!Valid) return; int Size = pPacket->m_DataSize-sizeof(SERVERBROWSE_LIST); int Num = Size/sizeof(CMastersrvAddr); CMastersrvAddr *pAddrs = (CMastersrvAddr *)((char*)pPacket->m_pData+sizeof(SERVERBROWSE_LIST)); for(int i = 0; i < Num; i++) { NETADDR Addr; static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; // copy address if(!mem_comp(IPV4Mapping, pAddrs[i].m_aIp, sizeof(IPV4Mapping))) { mem_zero(&Addr, sizeof(Addr)); Addr.type = NETTYPE_IPV4; Addr.ip[0] = pAddrs[i].m_aIp[12]; Addr.ip[1] = pAddrs[i].m_aIp[13]; Addr.ip[2] = pAddrs[i].m_aIp[14]; Addr.ip[3] = pAddrs[i].m_aIp[15]; } else { Addr.type = NETTYPE_IPV6; mem_copy(Addr.ip, pAddrs[i].m_aIp, sizeof(Addr.ip)); } Addr.port = (pAddrs[i].m_aPort[0]<<8) | pAddrs[i].m_aPort[1]; m_ServerBrowser.Set(Addr, IServerBrowser::SET_MASTER_ADD, -1, 0x0); } } // server info if(pPacket->m_DataSize >= (int)sizeof(SERVERBROWSE_INFO) && mem_comp(pPacket->m_pData, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO)) == 0) { // we got ze info CUnpacker Up; CServerInfo Info = {0}; Up.Reset((unsigned char*)pPacket->m_pData+sizeof(SERVERBROWSE_INFO), pPacket->m_DataSize-sizeof(SERVERBROWSE_INFO)); int Token = str_toint(Up.GetString()); str_copy(Info.m_aVersion, Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES), sizeof(Info.m_aVersion)); str_copy(Info.m_aName, Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES), sizeof(Info.m_aName)); str_copy(Info.m_aMap, Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES), sizeof(Info.m_aMap)); str_copy(Info.m_aGameType, Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES), sizeof(Info.m_aGameType)); Info.m_Flags = str_toint(Up.GetString()); Info.m_NumPlayers = str_toint(Up.GetString()); Info.m_MaxPlayers = str_toint(Up.GetString()); Info.m_NumClients = str_toint(Up.GetString()); Info.m_MaxClients = str_toint(Up.GetString()); // don't add invalid info to the server browser list if(Info.m_NumClients < 0 || Info.m_NumClients > MAX_CLIENTS || Info.m_MaxClients < 0 || Info.m_MaxClients > MAX_CLIENTS || Info.m_NumPlayers < 0 || Info.m_NumPlayers > Info.m_NumClients || Info.m_MaxPlayers < 0 || Info.m_MaxPlayers > Info.m_MaxClients) return; net_addr_str(&pPacket->m_Address, Info.m_aAddress, sizeof(Info.m_aAddress), true); for(int i = 0; i < Info.m_NumClients; i++) { str_copy(Info.m_aClients[i].m_aName, Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES), sizeof(Info.m_aClients[i].m_aName)); str_copy(Info.m_aClients[i].m_aClan, Up.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES), sizeof(Info.m_aClients[i].m_aClan)); Info.m_aClients[i].m_Country = str_toint(Up.GetString()); Info.m_aClients[i].m_Score = str_toint(Up.GetString()); Info.m_aClients[i].m_Player = str_toint(Up.GetString()) != 0 ? true : false; } if(!Up.Error()) { // sort players qsort(Info.m_aClients, Info.m_NumClients, sizeof(*Info.m_aClients), PlayerScoreComp); if(net_addr_comp(&m_ServerAddress, &pPacket->m_Address) == 0) { mem_copy(&m_CurrentServerInfo, &Info, sizeof(m_CurrentServerInfo)); m_CurrentServerInfo.m_NetAddr = m_ServerAddress; m_CurrentServerInfoRequestTime = -1; } else m_ServerBrowser.Set(pPacket->m_Address, IServerBrowser::SET_TOKEN, Token, &Info); } } } void CClient::ProcessServerPacket(CNetChunk *pPacket) { CUnpacker Unpacker; Unpacker.Reset(pPacket->m_pData, pPacket->m_DataSize); // unpack msgid and system flag int Msg = Unpacker.GetInt(); int Sys = Msg&1; Msg >>= 1; if(Unpacker.Error()) return; if(Sys) { // system message if(Msg == NETMSG_MAP_CHANGE) { const char *pMap = Unpacker.GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES); int MapCrc = Unpacker.GetInt(); int MapSize = Unpacker.GetInt(); const char *pError = 0; if(Unpacker.Error()) return; // check for valid standard map if(!m_MapChecker.IsMapValid(pMap, MapCrc, MapSize)) pError = "invalid standard map"; for(int i = 0; pMap[i]; i++) // protect the player from nasty map names { if(pMap[i] == '/' || pMap[i] == '\\') pError = "strange character in map name"; } if(MapSize < 0) pError = "invalid map size"; if(pError) DisconnectWithReason(pError); else { pError = LoadMapSearch(pMap, MapCrc); if(!pError) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "loading done"); SendReady(); } else { str_format(m_aMapdownloadFilename, sizeof(m_aMapdownloadFilename), "downloadedmaps/%s_%08x.map", pMap, MapCrc); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "starting to download map to '%s'", m_aMapdownloadFilename); m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", aBuf); m_MapdownloadChunk = 0; str_copy(m_aMapdownloadName, pMap, sizeof(m_aMapdownloadName)); if(m_MapdownloadFile) io_close(m_MapdownloadFile); m_MapdownloadFile = Storage()->OpenFile(m_aMapdownloadFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); m_MapdownloadCrc = MapCrc; m_MapdownloadTotalsize = MapSize; m_MapdownloadAmount = 0; CMsgPacker Msg(NETMSG_REQUEST_MAP_DATA); Msg.AddInt(m_MapdownloadChunk); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH); if(g_Config.m_Debug) { str_format(aBuf, sizeof(aBuf), "requested chunk %d", m_MapdownloadChunk); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client/network", aBuf); } } } } else if(Msg == NETMSG_MAP_DATA) { int Last = Unpacker.GetInt(); int MapCRC = Unpacker.GetInt(); int Chunk = Unpacker.GetInt(); int Size = Unpacker.GetInt(); const unsigned char *pData = Unpacker.GetRaw(Size); // check fior errors if(Unpacker.Error() || Size <= 0 || MapCRC != m_MapdownloadCrc || Chunk != m_MapdownloadChunk || !m_MapdownloadFile) return; io_write(m_MapdownloadFile, pData, Size); m_MapdownloadAmount += Size; if(Last) { const char *pError; m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "download complete, loading map"); if(m_MapdownloadFile) io_close(m_MapdownloadFile); m_MapdownloadFile = 0; m_MapdownloadAmount = 0; m_MapdownloadTotalsize = -1; // load map pError = LoadMap(m_aMapdownloadName, m_aMapdownloadFilename, m_MapdownloadCrc); if(!pError) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client/network", "loading done"); SendReady(); } else DisconnectWithReason(pError); } else { // request new chunk m_MapdownloadChunk++; CMsgPacker Msg(NETMSG_REQUEST_MAP_DATA); Msg.AddInt(m_MapdownloadChunk); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH); if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "requested chunk %d", m_MapdownloadChunk); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client/network", aBuf); } } } else if(Msg == NETMSG_CON_READY) { GameClient()->OnConnected(); } else if(Msg == NETMSG_PING) { CMsgPacker Msg(NETMSG_PING_REPLY); SendMsgEx(&Msg, 0); } else if(Msg == NETMSG_RCON_CMD_ADD) { const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC); const char *pHelp = Unpacker.GetString(CUnpacker::SANITIZE_CC); const char *pParams = Unpacker.GetString(CUnpacker::SANITIZE_CC); if(Unpacker.Error() == 0) m_pConsole->RegisterTemp(pName, pParams, CFGFLAG_SERVER, pHelp); } else if(Msg == NETMSG_RCON_CMD_REM) { const char *pName = Unpacker.GetString(CUnpacker::SANITIZE_CC); if(Unpacker.Error() == 0) m_pConsole->DeregisterTemp(pName); } else if(Msg == NETMSG_RCON_AUTH_STATUS) { int Result = Unpacker.GetInt(); if(Unpacker.Error() == 0) m_RconAuthed = Result; int Old = m_UseTempRconCommands; m_UseTempRconCommands = Unpacker.GetInt(); if(Unpacker.Error() != 0) m_UseTempRconCommands = 0; if(Old != 0 && m_UseTempRconCommands == 0) m_pConsole->DeregisterTempAll(); } else if(Msg == NETMSG_RCON_LINE) { const char *pLine = Unpacker.GetString(); if(Unpacker.Error() == 0) GameClient()->OnRconLine(pLine); } else if(Msg == NETMSG_PING_REPLY) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "latency %.2f", (time_get() - m_PingStartTime)*1000 / (float)time_freq()); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client/network", aBuf); } else if(Msg == NETMSG_INPUTTIMING) { int InputPredTick = Unpacker.GetInt(); int TimeLeft = Unpacker.GetInt(); // adjust our prediction time int64 Target = 0; for(int k = 0; k < 200; k++) { if(m_aInputs[k].m_Tick == InputPredTick) { Target = m_aInputs[k].m_PredictedTime + (time_get() - m_aInputs[k].m_Time); Target = Target - (int64)(((TimeLeft-PREDICTION_MARGIN)/1000.0f)*time_freq()); break; } } if(Target) m_PredictedTime.Update(&m_InputtimeMarginGraph, Target, TimeLeft, 1); } else if(Msg == NETMSG_SNAP || Msg == NETMSG_SNAPSINGLE || Msg == NETMSG_SNAPEMPTY) { int NumParts = 1; int Part = 0; int GameTick = Unpacker.GetInt(); int DeltaTick = GameTick-Unpacker.GetInt(); int PartSize = 0; int Crc = 0; int CompleteSize = 0; const char *pData = 0; // we are not allowed to process snapshot yet if(State() < IClient::STATE_LOADING) return; if(Msg == NETMSG_SNAP) { NumParts = Unpacker.GetInt(); Part = Unpacker.GetInt(); } if(Msg != NETMSG_SNAPEMPTY) { Crc = Unpacker.GetInt(); PartSize = Unpacker.GetInt(); } pData = (const char *)Unpacker.GetRaw(PartSize); if(Unpacker.Error()) return; if(GameTick >= m_CurrentRecvTick) { if(GameTick != m_CurrentRecvTick) { m_SnapshotParts = 0; m_CurrentRecvTick = GameTick; } // TODO: clean this up abit mem_copy((char*)m_aSnapshotIncommingData + Part*MAX_SNAPSHOT_PACKSIZE, pData, PartSize); m_SnapshotParts |= 1<= 0) { int DeltashotSize = m_SnapshotStorage.Get(DeltaTick, 0, &pDeltaShot, 0); if(DeltashotSize < 0) { // couldn't find the delta snapshots that the server used // to compress this snapshot. force the server to resync if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "error, couldn't find the delta snapshot"); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", aBuf); } // ack snapshot // TODO: combine this with the input message m_AckGameTick = -1; return; } } // decompress snapshot pDeltaData = m_SnapshotDelta.EmptyDelta(); DeltaSize = sizeof(int)*3; if(CompleteSize) { int IntSize = CVariableInt::Decompress(m_aSnapshotIncommingData, CompleteSize, aTmpBuffer2); if(IntSize < 0) // failure during decompression, bail return; pDeltaData = aTmpBuffer2; DeltaSize = IntSize; } // unpack delta SnapSize = m_SnapshotDelta.UnpackDelta(pDeltaShot, pTmpBuffer3, pDeltaData, DeltaSize); if(SnapSize < 0) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", "delta unpack failed!"); return; } if(Msg != NETMSG_SNAPEMPTY && pTmpBuffer3->Crc() != Crc) { if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "snapshot crc error #%d - tick=%d wantedcrc=%d gotcrc=%d compressed_size=%d delta_tick=%d", m_SnapCrcErrors, GameTick, Crc, pTmpBuffer3->Crc(), CompleteSize, DeltaTick); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", aBuf); } m_SnapCrcErrors++; if(m_SnapCrcErrors > 10) { // to many errors, send reset m_AckGameTick = -1; SendInput(); m_SnapCrcErrors = 0; } return; } else { if(m_SnapCrcErrors) m_SnapCrcErrors--; } // purge old snapshots PurgeTick = DeltaTick; if(m_aSnapshots[SNAP_PREV] && m_aSnapshots[SNAP_PREV]->m_Tick < PurgeTick) PurgeTick = m_aSnapshots[SNAP_PREV]->m_Tick; if(m_aSnapshots[SNAP_CURRENT] && m_aSnapshots[SNAP_CURRENT]->m_Tick < PurgeTick) PurgeTick = m_aSnapshots[SNAP_CURRENT]->m_Tick; m_SnapshotStorage.PurgeUntil(PurgeTick); // add new m_SnapshotStorage.Add(GameTick, time_get(), SnapSize, pTmpBuffer3, 1); // add snapshot to demo if(m_DemoRecorder.IsRecording()) { // write snapshot m_DemoRecorder.RecordSnapshot(GameTick, pTmpBuffer3, SnapSize); } // apply snapshot, cycle pointers m_RecivedSnapshots++; m_CurrentRecvTick = GameTick; // we got two snapshots until we see us self as connected if(m_RecivedSnapshots == 2) { // start at 200ms and work from there m_PredictedTime.Init(GameTick*time_freq()/50); m_PredictedTime.SetAdjustSpeed(1, 1000.0f); m_GameTime.Init((GameTick-1)*time_freq()/50); m_aSnapshots[SNAP_PREV] = m_SnapshotStorage.m_pFirst; m_aSnapshots[SNAP_CURRENT] = m_SnapshotStorage.m_pLast; m_LocalStartTime = time_get(); SetState(IClient::STATE_ONLINE); DemoRecorder_HandleAutoStart(); } // adjust game time if(m_RecivedSnapshots > 2) { int64 Now = m_GameTime.Get(time_get()); int64 TickStart = GameTick*time_freq()/50; int64 TimeLeft = (TickStart-Now)*1000 / time_freq(); m_GameTime.Update(&m_GametimeMarginGraph, (GameTick-1)*time_freq()/50, TimeLeft, 0); } // ack snapshot m_AckGameTick = GameTick; } } } } else { // game message if(m_DemoRecorder.IsRecording()) m_DemoRecorder.RecordMessage(pPacket->m_pData, pPacket->m_DataSize); GameClient()->OnMessage(Msg, &Unpacker); } } void CClient::PumpNetwork() { m_NetClient.Update(); if(State() != IClient::STATE_DEMOPLAYBACK) { // check for errors if(State() != IClient::STATE_OFFLINE && State() != IClient::STATE_QUITING && m_NetClient.State() == NETSTATE_OFFLINE) { SetState(IClient::STATE_OFFLINE); Disconnect(); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "offline error='%s'", m_NetClient.ErrorString()); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); } // if(State() == IClient::STATE_CONNECTING && m_NetClient.State() == NETSTATE_ONLINE) { // we switched to online m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", "connected, sending info"); SetState(IClient::STATE_LOADING); SendInfo(); } } // process packets CNetChunk Packet; while(m_NetClient.Recv(&Packet)) { if(Packet.m_ClientID == -1) ProcessConnlessPacket(&Packet); else ProcessServerPacket(&Packet); } } void CClient::OnDemoPlayerSnapshot(void *pData, int Size) { // update ticks, they could have changed const CDemoPlayer::CPlaybackInfo *pInfo = m_DemoPlayer.Info(); CSnapshotStorage::CHolder *pTemp; m_CurGameTick = pInfo->m_Info.m_CurrentTick; m_PrevGameTick = pInfo->m_PreviousTick; // handle snapshots pTemp = m_aSnapshots[SNAP_PREV]; m_aSnapshots[SNAP_PREV] = m_aSnapshots[SNAP_CURRENT]; m_aSnapshots[SNAP_CURRENT] = pTemp; mem_copy(m_aSnapshots[SNAP_CURRENT]->m_pSnap, pData, Size); mem_copy(m_aSnapshots[SNAP_CURRENT]->m_pAltSnap, pData, Size); GameClient()->OnNewSnapshot(); } void CClient::OnDemoPlayerMessage(void *pData, int Size) { CUnpacker Unpacker; Unpacker.Reset(pData, Size); // unpack msgid and system flag int Msg = Unpacker.GetInt(); int Sys = Msg&1; Msg >>= 1; if(Unpacker.Error()) return; if(!Sys) GameClient()->OnMessage(Msg, &Unpacker); } /* const IDemoPlayer::CInfo *client_demoplayer_getinfo() { static DEMOPLAYBACK_INFO ret; const DEMOREC_PLAYBACKINFO *info = m_DemoPlayer.Info(); ret.first_tick = info->first_tick; ret.last_tick = info->last_tick; ret.current_tick = info->current_tick; ret.paused = info->paused; ret.speed = info->speed; return &ret; }*/ /* void DemoPlayer()->SetPos(float percent) { demorec_playback_set(percent); } void DemoPlayer()->SetSpeed(float speed) { demorec_playback_setspeed(speed); } void DemoPlayer()->SetPause(int paused) { if(paused) demorec_playback_pause(); else demorec_playback_unpause(); }*/ void CClient::Update() { if(State() == IClient::STATE_DEMOPLAYBACK) { m_DemoPlayer.Update(); if(m_DemoPlayer.IsPlaying()) { // update timers const CDemoPlayer::CPlaybackInfo *pInfo = m_DemoPlayer.Info(); m_CurGameTick = pInfo->m_Info.m_CurrentTick; m_PrevGameTick = pInfo->m_PreviousTick; m_GameIntraTick = pInfo->m_IntraTick; m_GameTickTime = pInfo->m_TickTime; } else { // disconnect on error Disconnect(); } } else if(State() == IClient::STATE_ONLINE && m_RecivedSnapshots >= 3) { // switch snapshot int Repredict = 0; int64 Freq = time_freq(); int64 Now = m_GameTime.Get(time_get()); int64 PredNow = m_PredictedTime.Get(time_get()); while(1) { CSnapshotStorage::CHolder *pCur = m_aSnapshots[SNAP_CURRENT]; int64 TickStart = (pCur->m_Tick)*time_freq()/50; if(TickStart < Now) { CSnapshotStorage::CHolder *pNext = m_aSnapshots[SNAP_CURRENT]->m_pNext; if(pNext) { m_aSnapshots[SNAP_PREV] = m_aSnapshots[SNAP_CURRENT]; m_aSnapshots[SNAP_CURRENT] = pNext; // set ticks m_CurGameTick = m_aSnapshots[SNAP_CURRENT]->m_Tick; m_PrevGameTick = m_aSnapshots[SNAP_PREV]->m_Tick; if(m_aSnapshots[SNAP_CURRENT] && m_aSnapshots[SNAP_PREV]) { GameClient()->OnNewSnapshot(); Repredict = 1; } } else break; } else break; } if(m_aSnapshots[SNAP_CURRENT] && m_aSnapshots[SNAP_PREV]) { int64 CurtickStart = (m_aSnapshots[SNAP_CURRENT]->m_Tick)*time_freq()/50; int64 PrevtickStart = (m_aSnapshots[SNAP_PREV]->m_Tick)*time_freq()/50; int PrevPredTick = (int)(PredNow*50/time_freq()); int NewPredTick = PrevPredTick+1; m_GameIntraTick = (Now - PrevtickStart) / (float)(CurtickStart-PrevtickStart); m_GameTickTime = (Now - PrevtickStart) / (float)Freq; //(float)SERVER_TICK_SPEED); CurtickStart = NewPredTick*time_freq()/50; PrevtickStart = PrevPredTick*time_freq()/50; m_PredIntraTick = (PredNow - PrevtickStart) / (float)(CurtickStart-PrevtickStart); if(NewPredTick < m_aSnapshots[SNAP_PREV]->m_Tick-SERVER_TICK_SPEED || NewPredTick > m_aSnapshots[SNAP_PREV]->m_Tick+SERVER_TICK_SPEED) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", "prediction time reset!"); m_PredictedTime.Init(m_aSnapshots[SNAP_CURRENT]->m_Tick*time_freq()/50); } if(NewPredTick > m_PredTick) { m_PredTick = NewPredTick; Repredict = 1; // send input SendInput(); } } // only do sane predictions if(Repredict) { if(m_PredTick > m_CurGameTick && m_PredTick < m_CurGameTick+50) GameClient()->OnPredict(); } // fetch server info if we don't have it if(State() >= IClient::STATE_LOADING && m_CurrentServerInfoRequestTime >= 0 && time_get() > m_CurrentServerInfoRequestTime) { m_ServerBrowser.Request(m_ServerAddress); m_CurrentServerInfoRequestTime = time_get()+time_freq()*2; } } // STRESS TEST: join the server again if(g_Config.m_DbgStress) { static int64 ActionTaken = 0; int64 Now = time_get(); if(State() == IClient::STATE_OFFLINE) { if(Now > ActionTaken+time_freq()*2) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "stress", "reconnecting!"); Connect(g_Config.m_DbgStressServer); ActionTaken = Now; } } else { if(Now > ActionTaken+time_freq()*(10+g_Config.m_DbgStress)) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "stress", "disconnecting!"); Disconnect(); ActionTaken = Now; } } } // pump the network PumpNetwork(); // update the maser server registry MasterServer()->Update(); // update the server browser m_ServerBrowser.Update(m_ResortServerBrowser); m_ResortServerBrowser = false; } void CClient::VersionUpdate() { if(m_VersionInfo.m_State == CVersionInfo::STATE_INIT) { Engine()->HostLookup(&m_VersionInfo.m_VersionServeraddr, g_Config.m_ClVersionServer, m_NetClient.NetType()); m_VersionInfo.m_State = CVersionInfo::STATE_START; } else if(m_VersionInfo.m_State == CVersionInfo::STATE_START) { if(m_VersionInfo.m_VersionServeraddr.m_Job.Status() == CJob::STATE_DONE) { CNetChunk Packet; mem_zero(&Packet, sizeof(Packet)); m_VersionInfo.m_VersionServeraddr.m_Addr.port = VERSIONSRV_PORT; Packet.m_ClientID = -1; Packet.m_Address = m_VersionInfo.m_VersionServeraddr.m_Addr; Packet.m_pData = VERSIONSRV_GETVERSION; Packet.m_DataSize = sizeof(VERSIONSRV_GETVERSION); Packet.m_Flags = NETSENDFLAG_CONNLESS; m_NetClient.Send(&Packet); m_VersionInfo.m_State = CVersionInfo::STATE_READY; } } } void CClient::RegisterInterfaces() { Kernel()->RegisterInterface(static_cast(&m_DemoRecorder)); Kernel()->RegisterInterface(static_cast(&m_DemoPlayer)); Kernel()->RegisterInterface(static_cast(&m_ServerBrowser)); Kernel()->RegisterInterface(static_cast(&m_Friends)); } void CClient::InitInterfaces() { // fetch interfaces m_pEngine = Kernel()->RequestInterface(); m_pEditor = Kernel()->RequestInterface(); //m_pGraphics = Kernel()->RequestInterface(); m_pSound = Kernel()->RequestInterface(); m_pGameClient = Kernel()->RequestInterface(); m_pInput = Kernel()->RequestInterface(); m_pMap = Kernel()->RequestInterface(); m_pMasterServer = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); // m_ServerBrowser.SetBaseInfo(&m_NetClient, m_pGameClient->NetVersion()); m_Friends.Init(); } void CClient::Run() { m_LocalStartTime = time_get(); m_SnapshotParts = 0; // init SDL { if(SDL_Init(0) < 0) { dbg_msg("client", "unable to init SDL base: %s", SDL_GetError()); return; } atexit(SDL_Quit); // ignore_convention } // init graphics { if(g_Config.m_GfxThreaded) m_pGraphics = CreateEngineGraphicsThreaded(); else m_pGraphics = CreateEngineGraphics(); bool RegisterFail = false; RegisterFail = RegisterFail || !Kernel()->RegisterInterface(static_cast(m_pGraphics)); // register graphics as both RegisterFail = RegisterFail || !Kernel()->RegisterInterface(static_cast(m_pGraphics)); if(RegisterFail || m_pGraphics->Init() != 0) { dbg_msg("client", "couldn't init graphics"); return; } } // init sound, allowed to fail m_SoundInitFailed = Sound()->Init() != 0; // open socket { NETADDR BindAddr; if(g_Config.m_Bindaddr[0] && net_host_lookup(g_Config.m_Bindaddr, &BindAddr, NETTYPE_ALL) == 0) { // got bindaddr BindAddr.type = NETTYPE_ALL; } else { mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; } if(!m_NetClient.Open(BindAddr, 0)) { dbg_msg("client", "couldn't open socket"); return; } } // init font rendering Kernel()->RequestInterface()->Init(); // init the input Input()->Init(); // start refreshing addresses while we load MasterServer()->RefreshAddresses(m_NetClient.NetType()); // init the editor m_pEditor->Init(); // load data if(!LoadData()) return; GameClient()->OnInit(); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "version %s", GameClient()->NetVersion()); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); // connect to the server if wanted /* if(config.cl_connect[0] != 0) Connect(config.cl_connect); config.cl_connect[0] = 0; */ // m_FpsGraph.Init(0.0f, 200.0f); // never start with the editor g_Config.m_ClEditor = 0; Input()->MouseModeRelative(); // process pending commands m_pConsole->StoreCommands(false); while (1) { // VersionUpdate(); // handle pending connects if(m_aCmdConnect[0]) { str_copy(g_Config.m_UiServerAddress, m_aCmdConnect, sizeof(g_Config.m_UiServerAddress)); Connect(m_aCmdConnect); m_aCmdConnect[0] = 0; } // update input if(Input()->Update()) break; // SDL_QUIT // update sound Sound()->Update(); // release focus if(!m_pGraphics->WindowActive()) { if(m_WindowMustRefocus == 0) Input()->MouseModeAbsolute(); m_WindowMustRefocus = 1; } else if (g_Config.m_DbgFocus && Input()->KeyPressed(KEY_ESCAPE)) { Input()->MouseModeAbsolute(); m_WindowMustRefocus = 1; } // refocus if(m_WindowMustRefocus && m_pGraphics->WindowActive()) { if(m_WindowMustRefocus < 3) { Input()->MouseModeAbsolute(); m_WindowMustRefocus++; } if(m_WindowMustRefocus >= 3 || Input()->KeyPressed(KEY_MOUSE_1)) { Input()->MouseModeRelative(); m_WindowMustRefocus = 0; } } // panic quit button if(Input()->KeyPressed(KEY_LCTRL) && Input()->KeyPressed(KEY_LSHIFT) && Input()->KeyPressed('q')) { Quit(); break; } if(Input()->KeyPressed(KEY_LCTRL) && Input()->KeyPressed(KEY_LSHIFT) && Input()->KeyDown('d')) g_Config.m_Debug ^= 1; if(Input()->KeyPressed(KEY_LCTRL) && Input()->KeyPressed(KEY_LSHIFT) && Input()->KeyDown('g')) g_Config.m_DbgGraphs ^= 1; if(Input()->KeyPressed(KEY_LCTRL) && Input()->KeyPressed(KEY_LSHIFT) && Input()->KeyDown('e')) { g_Config.m_ClEditor = g_Config.m_ClEditor^1; Input()->MouseModeRelative(); } /* if(!gfx_window_open()) break; */ // render { if(g_Config.m_ClEditor) { if(!m_EditorActive) { GameClient()->OnActivateEditor(); m_EditorActive = true; } } else if(m_EditorActive) m_EditorActive = false; Update(); if(!g_Config.m_GfxAsyncRender || m_pGraphics->IsIdle()) { m_RenderFrames++; // update frametime int64 Now = time_get(); m_RenderFrameTime = (Now - m_LastRenderTime) / (float)time_freq(); if(m_RenderFrameTime < m_RenderFrameTimeLow) m_RenderFrameTimeLow = m_RenderFrameTime; if(m_RenderFrameTime > m_RenderFrameTimeHigh) m_RenderFrameTimeHigh = m_RenderFrameTime; m_FpsGraph.Add(1.0f/m_RenderFrameTime, 1,1,1); m_LastRenderTime = Now; if(g_Config.m_DbgStress) { if((m_RenderFrames%10) == 0) { if(!m_EditorActive) Render(); else { m_pEditor->UpdateAndRender(); DebugRender(); } m_pGraphics->Swap(); } } else { if(!m_EditorActive) Render(); else { m_pEditor->UpdateAndRender(); DebugRender(); } m_pGraphics->Swap(); } } } AutoScreenshot_Cleanup(); // check conditions if(State() == IClient::STATE_QUITING) break; // beNice if(g_Config.m_ClCpuThrottle) thread_sleep(g_Config.m_ClCpuThrottle); else if(g_Config.m_DbgStress || !m_pGraphics->WindowActive()) thread_sleep(5); if(g_Config.m_DbgHitch) { thread_sleep(g_Config.m_DbgHitch); g_Config.m_DbgHitch = 0; } /* if(ReportTime < time_get()) { if(0 && g_Config.m_Debug) { dbg_msg("client/report", "fps=%.02f (%.02f %.02f) netstate=%d", m_Frames/(float)(ReportInterval/time_freq()), 1.0f/m_RenderFrameTimeHigh, 1.0f/m_RenderFrameTimeLow, m_NetClient.State()); } m_RenderFrameTimeLow = 1; m_RenderFrameTimeHigh = 0; m_RenderFrames = 0; ReportTime += ReportInterval; }*/ // update local time m_LocalTime = (time_get()-m_LocalStartTime)/(float)time_freq(); } GameClient()->OnShutdown(); Disconnect(); m_pGraphics->Shutdown(); m_pSound->Shutdown(); // shutdown SDL { SDL_Quit(); } } void CClient::Con_Connect(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; str_copy(pSelf->m_aCmdConnect, pResult->GetString(0), sizeof(pSelf->m_aCmdConnect)); } void CClient::Con_Disconnect(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->Disconnect(); } void CClient::Con_Quit(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->Quit(); } void CClient::Con_Minimize(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->Graphics()->Minimize(); } void CClient::Con_Ping(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; CMsgPacker Msg(NETMSG_PING); pSelf->SendMsgEx(&Msg, 0); pSelf->m_PingStartTime = time_get(); } void CClient::AutoScreenshot_Start() { if(g_Config.m_ClAutoScreenshot) { Graphics()->TakeScreenshot("auto/autoscreen"); m_AutoScreenshotRecycle = true; } } void CClient::AutoScreenshot_Cleanup() { if(m_AutoScreenshotRecycle) { if(g_Config.m_ClAutoScreenshotMax) { // clean up auto taken screens CFileCollection AutoScreens; AutoScreens.Init(Storage(), "screenshots/auto", "autoscreen", ".png", g_Config.m_ClAutoScreenshotMax); } m_AutoScreenshotRecycle = false; } } void CClient::Con_Screenshot(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->Graphics()->TakeScreenshot(0); } void CClient::Con_Rcon(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->Rcon(pResult->GetString(0)); } void CClient::Con_RconAuth(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->RconAuth("", pResult->GetString(0)); } void CClient::Con_AddFavorite(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; NETADDR Addr; if(net_addr_from_str(&Addr, pResult->GetString(0)) == 0) pSelf->m_ServerBrowser.AddFavorite(Addr); } void CClient::Con_RemoveFavorite(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; NETADDR Addr; if(net_addr_from_str(&Addr, pResult->GetString(0)) == 0) pSelf->m_ServerBrowser.RemoveFavorite(Addr); } const char *CClient::DemoPlayer_Play(const char *pFilename, int StorageType) { int Crc; const char *pError; Disconnect(); m_NetClient.ResetErrorString(); // try to start playback m_DemoPlayer.SetListner(this); if(m_DemoPlayer.Load(Storage(), m_pConsole, pFilename, StorageType)) return "error loading demo"; // load map Crc = (m_DemoPlayer.Info()->m_Header.m_aMapCrc[0]<<24)| (m_DemoPlayer.Info()->m_Header.m_aMapCrc[1]<<16)| (m_DemoPlayer.Info()->m_Header.m_aMapCrc[2]<<8)| (m_DemoPlayer.Info()->m_Header.m_aMapCrc[3]); pError = LoadMapSearch(m_DemoPlayer.Info()->m_Header.m_aMapName, Crc); if(pError) { DisconnectWithReason(pError); return pError; } GameClient()->OnConnected(); // setup buffers mem_zero(m_aDemorecSnapshotData, sizeof(m_aDemorecSnapshotData)); m_aSnapshots[SNAP_CURRENT] = &m_aDemorecSnapshotHolders[SNAP_CURRENT]; m_aSnapshots[SNAP_PREV] = &m_aDemorecSnapshotHolders[SNAP_PREV]; m_aSnapshots[SNAP_CURRENT]->m_pSnap = (CSnapshot *)m_aDemorecSnapshotData[SNAP_CURRENT][0]; m_aSnapshots[SNAP_CURRENT]->m_pAltSnap = (CSnapshot *)m_aDemorecSnapshotData[SNAP_CURRENT][1]; m_aSnapshots[SNAP_CURRENT]->m_SnapSize = 0; m_aSnapshots[SNAP_CURRENT]->m_Tick = -1; m_aSnapshots[SNAP_PREV]->m_pSnap = (CSnapshot *)m_aDemorecSnapshotData[SNAP_PREV][0]; m_aSnapshots[SNAP_PREV]->m_pAltSnap = (CSnapshot *)m_aDemorecSnapshotData[SNAP_PREV][1]; m_aSnapshots[SNAP_PREV]->m_SnapSize = 0; m_aSnapshots[SNAP_PREV]->m_Tick = -1; // enter demo playback state SetState(IClient::STATE_DEMOPLAYBACK); m_DemoPlayer.Play(); GameClient()->OnEnterGame(); return 0; } void CClient::Con_Play(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->DemoPlayer_Play(pResult->GetString(0), IStorage::TYPE_ALL); } void CClient::DemoRecorder_Start(const char *pFilename, bool WithTimestamp) { if(State() != IClient::STATE_ONLINE) m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demorec/record", "client is not online"); else { char aFilename[128]; if(WithTimestamp) { char aDate[20]; str_timestamp(aDate, sizeof(aDate)); str_format(aFilename, sizeof(aFilename), "demos/%s_%s.demo", pFilename, aDate); } else str_format(aFilename, sizeof(aFilename), "demos/%s.demo", pFilename); m_DemoRecorder.Start(Storage(), m_pConsole, aFilename, GameClient()->NetVersion(), m_aCurrentMap, m_CurrentMapCrc, "client"); } } void CClient::DemoRecorder_HandleAutoStart() { if(g_Config.m_ClAutoDemoRecord) { DemoRecorder_Stop(); DemoRecorder_Start("auto/autorecord", true); if(g_Config.m_ClAutoDemoMax) { // clean up auto recorded demos CFileCollection AutoDemos; AutoDemos.Init(Storage(), "demos/auto", "autorecord", ".demo", g_Config.m_ClAutoDemoMax); } } } void CClient::DemoRecorder_Stop() { m_DemoRecorder.Stop(); } void CClient::DemoRecorder_AddDemoMarker() { m_DemoRecorder.AddDemoMarker(); } void CClient::Con_Record(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; if(pResult->NumArguments()) pSelf->DemoRecorder_Start(pResult->GetString(0), false); else pSelf->DemoRecorder_Start("demo", true); } void CClient::Con_StopRecord(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->DemoRecorder_Stop(); } void CClient::Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData) { CClient *pSelf = (CClient *)pUserData; pSelf->DemoRecorder_AddDemoMarker(); } void CClient::ServerBrowserUpdate() { m_ResortServerBrowser = true; } void CClient::ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments()) ((CClient *)pUserData)->ServerBrowserUpdate(); } void CClient::RegisterCommands() { m_pConsole = Kernel()->RequestInterface(); // register server dummy commands for tab completion m_pConsole->Register("kick", "i?r", CFGFLAG_SERVER, 0, 0, "Kick player with specified id for any reason"); m_pConsole->Register("ban", "s?ir", CFGFLAG_SERVER, 0, 0, "Ban player with ip/id for x minutes for any reason"); m_pConsole->Register("unban", "s", CFGFLAG_SERVER, 0, 0, "Unban ip"); m_pConsole->Register("bans", "", CFGFLAG_SERVER, 0, 0, "Show banlist"); m_pConsole->Register("status", "", CFGFLAG_SERVER, 0, 0, "List players"); m_pConsole->Register("shutdown", "", CFGFLAG_SERVER, 0, 0, "Shut down"); m_pConsole->Register("record", "?s", CFGFLAG_SERVER, 0, 0, "Record to a file"); m_pConsole->Register("stoprecord", "", CFGFLAG_SERVER, 0, 0, "Stop recording"); m_pConsole->Register("reload", "", CFGFLAG_SERVER, 0, 0, "Reload the map"); m_pConsole->Register("quit", "", CFGFLAG_CLIENT|CFGFLAG_STORE, Con_Quit, this, "Quit Teeworlds"); m_pConsole->Register("exit", "", CFGFLAG_CLIENT|CFGFLAG_STORE, Con_Quit, this, "Quit Teeworlds"); m_pConsole->Register("minimize", "", CFGFLAG_CLIENT|CFGFLAG_STORE, Con_Minimize, this, "Minimize Teeworlds"); m_pConsole->Register("connect", "s", CFGFLAG_CLIENT, Con_Connect, this, "Connect to the specified host/ip"); m_pConsole->Register("disconnect", "", CFGFLAG_CLIENT, Con_Disconnect, this, "Disconnect from the server"); m_pConsole->Register("ping", "", CFGFLAG_CLIENT, Con_Ping, this, "Ping the current server"); m_pConsole->Register("screenshot", "", CFGFLAG_CLIENT, Con_Screenshot, this, "Take a screenshot"); m_pConsole->Register("rcon", "r", CFGFLAG_CLIENT, Con_Rcon, this, "Send specified command to rcon"); m_pConsole->Register("rcon_auth", "s", CFGFLAG_CLIENT, Con_RconAuth, this, "Authenticate to rcon"); m_pConsole->Register("play", "r", CFGFLAG_CLIENT|CFGFLAG_STORE, Con_Play, this, "Play the file specified"); m_pConsole->Register("record", "?s", CFGFLAG_CLIENT, Con_Record, this, "Record to the file"); m_pConsole->Register("stoprecord", "", CFGFLAG_CLIENT, Con_StopRecord, this, "Stop recording"); m_pConsole->Register("add_demomarker", "", CFGFLAG_CLIENT, Con_AddDemoMarker, this, "Add demo timeline marker"); m_pConsole->Register("add_favorite", "s", CFGFLAG_CLIENT, Con_AddFavorite, this, "Add a server as a favorite"); m_pConsole->Register("remove_favorite", "s", CFGFLAG_CLIENT, Con_RemoveFavorite, this, "Remove a server from favorites"); // used for server browser update m_pConsole->Chain("br_filter_string", ConchainServerBrowserUpdate, this); m_pConsole->Chain("br_filter_gametype", ConchainServerBrowserUpdate, this); m_pConsole->Chain("br_filter_serveraddress", ConchainServerBrowserUpdate, this); } static CClient *CreateClient() { CClient *pClient = static_cast(mem_alloc(sizeof(CClient), 1)); mem_zero(pClient, sizeof(CClient)); return new(pClient) CClient; } /* Server Time Client Mirror Time Client Predicted Time Snapshot Latency Downstream latency Prediction Latency Upstream latency */ #if defined(CONF_PLATFORM_MACOSX) extern "C" int SDL_main(int argc, char **argv_) // ignore_convention { const char **argv = const_cast(argv_); #else int main(int argc, const char **argv) // ignore_convention { #endif #if defined(CONF_FAMILY_WINDOWS) for(int i = 1; i < argc; i++) // ignore_convention { if(str_comp("-s", argv[i]) == 0 || str_comp("--silent", argv[i]) == 0) // ignore_convention { FreeConsole(); break; } } #endif CClient *pClient = CreateClient(); IKernel *pKernel = IKernel::Create(); pKernel->RegisterInterface(pClient); pClient->RegisterInterfaces(); // create the components IEngine *pEngine = CreateEngine("Teeworlds"); IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT); IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_CLIENT, argc, argv); // ignore_convention IConfig *pConfig = CreateConfig(); IEngineSound *pEngineSound = CreateEngineSound(); IEngineInput *pEngineInput = CreateEngineInput(); IEngineTextRender *pEngineTextRender = CreateEngineTextRender(); IEngineMap *pEngineMap = CreateEngineMap(); IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer(); { bool RegisterFail = false; RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngine); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineSound)); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineSound)); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineInput)); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineInput)); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineTextRender)); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineTextRender)); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMap)); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMap)); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMasterServer)); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMasterServer)); RegisterFail = RegisterFail || !pKernel->RegisterInterface(CreateEditor()); RegisterFail = RegisterFail || !pKernel->RegisterInterface(CreateGameClient()); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pStorage); if(RegisterFail) return -1; } pEngine->Init(); pConfig->Init(); pEngineMasterServer->Init(); pEngineMasterServer->Load(); // register all console commands pClient->RegisterCommands(); pKernel->RequestInterface()->OnConsoleInit(); // init client's interfaces pClient->InitInterfaces(); // execute config file pConsole->ExecuteFile("settings.cfg"); // execute autoexec file pConsole->ExecuteFile("autoexec.cfg"); // parse the command line arguments if(argc > 1) // ignore_convention pConsole->ParseArguments(argc-1, &argv[1]); // ignore_convention // restore empty config strings to their defaults pConfig->RestoreStrings(); pClient->Engine()->InitLogfile(); // run the client dbg_msg("client", "starting..."); pClient->Run(); // write down the config and quit pConfig->Save(); return 0; } teeworlds-0.6.2+dfsg/src/engine/client/client.h0000644000175000017500000001752312140200333020403 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CLIENT_CLIENT_H #define ENGINE_CLIENT_CLIENT_H class CGraph { public: enum { // restrictions: Must be power of two MAX_VALUES=128, }; float m_Min, m_Max; float m_aValues[MAX_VALUES]; float m_aColors[MAX_VALUES][3]; int m_Index; void Init(float Min, float Max); void ScaleMax(); void ScaleMin(); void Add(float v, float r, float g, float b); void Render(IGraphics *pGraphics, int Font, float x, float y, float w, float h, const char *pDescription); }; class CSmoothTime { int64 m_Snap; int64 m_Current; int64 m_Target; int64 m_RLast; int64 m_TLast; CGraph m_Graph; int m_SpikeCounter; float m_aAdjustSpeed[2]; // 0 = down, 1 = up public: void Init(int64 Target); void SetAdjustSpeed(int Direction, float Value); int64 Get(int64 Now); void UpdateInt(int64 Target); void Update(CGraph *pGraph, int64 Target, int TimeLeft, int AdjustDirection); }; class CClient : public IClient, public CDemoPlayer::IListner { // needed interfaces IEngine *m_pEngine; IEditor *m_pEditor; IEngineInput *m_pInput; IEngineGraphics *m_pGraphics; IEngineSound *m_pSound; IGameClient *m_pGameClient; IEngineMap *m_pMap; IConsole *m_pConsole; IStorage *m_pStorage; IEngineMasterServer *m_pMasterServer; enum { NUM_SNAPSHOT_TYPES=2, PREDICTION_MARGIN=1000/50/2, // magic network prediction value }; class CNetClient m_NetClient; class CDemoPlayer m_DemoPlayer; class CDemoRecorder m_DemoRecorder; class CServerBrowser m_ServerBrowser; class CFriends m_Friends; class CMapChecker m_MapChecker; char m_aServerAddressStr[256]; unsigned m_SnapshotParts; int64 m_LocalStartTime; int m_DebugFont; int64 m_LastRenderTime; float m_RenderFrameTimeLow; float m_RenderFrameTimeHigh; int m_RenderFrames; NETADDR m_ServerAddress; int m_WindowMustRefocus; int m_SnapCrcErrors; bool m_AutoScreenshotRecycle; bool m_EditorActive; bool m_SoundInitFailed; bool m_ResortServerBrowser; int m_AckGameTick; int m_CurrentRecvTick; int m_RconAuthed; int m_UseTempRconCommands; // version-checking char m_aVersionStr[10]; // pinging int64 m_PingStartTime; // char m_aCurrentMap[256]; unsigned m_CurrentMapCrc; // char m_aCmdConnect[256]; // map download char m_aMapdownloadFilename[256]; char m_aMapdownloadName[256]; IOHANDLE m_MapdownloadFile; int m_MapdownloadChunk; int m_MapdownloadCrc; int m_MapdownloadAmount; int m_MapdownloadTotalsize; // time CSmoothTime m_GameTime; CSmoothTime m_PredictedTime; // input struct // TODO: handle input better { int m_aData[MAX_INPUT_SIZE]; // the input data int m_Tick; // the tick that the input is for int64 m_PredictedTime; // prediction latency when we sent this input int64 m_Time; } m_aInputs[200]; int m_CurrentInput; // graphs CGraph m_InputtimeMarginGraph; CGraph m_GametimeMarginGraph; CGraph m_FpsGraph; // the game snapshots are modifiable by the game class CSnapshotStorage m_SnapshotStorage; CSnapshotStorage::CHolder *m_aSnapshots[NUM_SNAPSHOT_TYPES]; int m_RecivedSnapshots; char m_aSnapshotIncommingData[CSnapshot::MAX_SIZE]; class CSnapshotStorage::CHolder m_aDemorecSnapshotHolders[NUM_SNAPSHOT_TYPES]; char *m_aDemorecSnapshotData[NUM_SNAPSHOT_TYPES][2][CSnapshot::MAX_SIZE]; class CSnapshotDelta m_SnapshotDelta; // class CServerInfo m_CurrentServerInfo; int64 m_CurrentServerInfoRequestTime; // >= 0 should request, == -1 got info // version info struct CVersionInfo { enum { STATE_INIT=0, STATE_START, STATE_READY, }; int m_State; class CHostLookup m_VersionServeraddr; } m_VersionInfo; volatile int m_GfxState; static void GraphicsThreadProxy(void *pThis) { ((CClient*)pThis)->GraphicsThread(); } void GraphicsThread(); public: IEngine *Engine() { return m_pEngine; } IEngineGraphics *Graphics() { return m_pGraphics; } IEngineInput *Input() { return m_pInput; } IEngineSound *Sound() { return m_pSound; } IGameClient *GameClient() { return m_pGameClient; } IEngineMasterServer *MasterServer() { return m_pMasterServer; } IStorage *Storage() { return m_pStorage; } CClient(); // ----- send functions ----- virtual int SendMsg(CMsgPacker *pMsg, int Flags); int SendMsgEx(CMsgPacker *pMsg, int Flags, bool System=true); void SendInfo(); void SendEnterGame(); void SendReady(); virtual bool RconAuthed() { return m_RconAuthed != 0; } virtual bool UseTempRconCommands() { return m_UseTempRconCommands != 0; } void RconAuth(const char *pName, const char *pPassword); virtual void Rcon(const char *pCmd); virtual bool ConnectionProblems(); virtual bool SoundInitFailed() { return m_SoundInitFailed; } virtual int GetDebugFont() { return m_DebugFont; } void DirectInput(int *pInput, int Size); void SendInput(); // TODO: OPT: do this alot smarter! virtual int *GetInput(int Tick); const char *LatestVersion(); void VersionUpdate(); // ------ state handling ----- void SetState(int s); // called when the map is loaded and we should init for a new round void OnEnterGame(); virtual void EnterGame(); virtual void Connect(const char *pAddress); void DisconnectWithReason(const char *pReason); virtual void Disconnect(); virtual void GetServerInfo(CServerInfo *pServerInfo); void ServerInfoRequest(); int LoadData(); // --- void *SnapGetItem(int SnapID, int Index, CSnapItem *pItem); void SnapInvalidateItem(int SnapID, int Index); void *SnapFindItem(int SnapID, int Type, int ID); int SnapNumItems(int SnapID); void SnapSetStaticsize(int ItemType, int Size); void Render(); void DebugRender(); virtual void Quit(); virtual const char *ErrorString(); const char *LoadMap(const char *pName, const char *pFilename, unsigned WantedCrc); const char *LoadMapSearch(const char *pMapName, int WantedCrc); static int PlayerScoreComp(const void *a, const void *b); void ProcessConnlessPacket(CNetChunk *pPacket); void ProcessServerPacket(CNetChunk *pPacket); virtual int MapDownloadAmount() { return m_MapdownloadAmount; } virtual int MapDownloadTotalsize() { return m_MapdownloadTotalsize; } void PumpNetwork(); virtual void OnDemoPlayerSnapshot(void *pData, int Size); virtual void OnDemoPlayerMessage(void *pData, int Size); void Update(); void RegisterInterfaces(); void InitInterfaces(); void Run(); static void Con_Connect(IConsole::IResult *pResult, void *pUserData); static void Con_Disconnect(IConsole::IResult *pResult, void *pUserData); static void Con_Quit(IConsole::IResult *pResult, void *pUserData); static void Con_Minimize(IConsole::IResult *pResult, void *pUserData); static void Con_Ping(IConsole::IResult *pResult, void *pUserData); static void Con_Screenshot(IConsole::IResult *pResult, void *pUserData); static void Con_Rcon(IConsole::IResult *pResult, void *pUserData); static void Con_RconAuth(IConsole::IResult *pResult, void *pUserData); static void Con_AddFavorite(IConsole::IResult *pResult, void *pUserData); static void Con_RemoveFavorite(IConsole::IResult *pResult, void *pUserData); static void Con_Play(IConsole::IResult *pResult, void *pUserData); static void Con_Record(IConsole::IResult *pResult, void *pUserData); static void Con_StopRecord(IConsole::IResult *pResult, void *pUserData); static void Con_AddDemoMarker(IConsole::IResult *pResult, void *pUserData); static void ConchainServerBrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); void RegisterCommands(); const char *DemoPlayer_Play(const char *pFilename, int StorageType); void DemoRecorder_Start(const char *pFilename, bool WithTimestamp); void DemoRecorder_HandleAutoStart(); void DemoRecorder_Stop(); void DemoRecorder_AddDemoMarker(); void AutoScreenshot_Start(); void AutoScreenshot_Cleanup(); void ServerBrowserUpdate(); }; #endif teeworlds-0.6.2+dfsg/src/engine/client/friends.cpp0000644000175000017500000001027112140200333021103 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include "friends.h" CFriends::CFriends() { mem_zero(m_aFriends, sizeof(m_aFriends)); m_NumFriends = 0; } void CFriends::ConAddFriend(IConsole::IResult *pResult, void *pUserData) { CFriends *pSelf = (CFriends *)pUserData; pSelf->AddFriend(pResult->GetString(0), pResult->GetString(1)); } void CFriends::ConRemoveFriend(IConsole::IResult *pResult, void *pUserData) { CFriends *pSelf = (CFriends *)pUserData; pSelf->RemoveFriend(pResult->GetString(0), pResult->GetString(1)); } void CFriends::Init() { IConfig *pConfig = Kernel()->RequestInterface(); if(pConfig) pConfig->RegisterCallback(ConfigSaveCallback, this); IConsole *pConsole = Kernel()->RequestInterface(); if(pConsole) { pConsole->Register("add_friend", "ss", CFGFLAG_CLIENT, ConAddFriend, this, "Add a friend"); pConsole->Register("remove_Friend", "ss", CFGFLAG_CLIENT, ConRemoveFriend, this, "Remove a friend"); } } const CFriendInfo *CFriends::GetFriend(int Index) const { return &m_aFriends[max(0, Index%m_NumFriends)]; } int CFriends::GetFriendState(const char *pName, const char *pClan) const { int Result = FRIEND_NO; unsigned NameHash = str_quickhash(pName); unsigned ClanHash = str_quickhash(pClan); for(int i = 0; i < m_NumFriends; ++i) { if(m_aFriends[i].m_ClanHash == ClanHash) { if(m_aFriends[i].m_aName[0] == 0) Result = FRIEND_CLAN; else if(m_aFriends[i].m_NameHash == NameHash) { Result = FRIEND_PLAYER; break; } } } return Result; } bool CFriends::IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const { unsigned NameHash = str_quickhash(pName); unsigned ClanHash = str_quickhash(pClan); for(int i = 0; i < m_NumFriends; ++i) { if(m_aFriends[i].m_ClanHash == ClanHash && ((!PlayersOnly && m_aFriends[i].m_aName[0] == 0) || m_aFriends[i].m_NameHash == NameHash)) return true; } return false; } void CFriends::AddFriend(const char *pName, const char *pClan) { if(m_NumFriends == MAX_FRIENDS || (pName[0] == 0 && pClan[0] == 0)) return; // make sure we don't have the friend already unsigned NameHash = str_quickhash(pName); unsigned ClanHash = str_quickhash(pClan); for(int i = 0; i < m_NumFriends; ++i) { if(m_aFriends[i].m_NameHash == NameHash && m_aFriends[i].m_ClanHash == ClanHash) return; } str_copy(m_aFriends[m_NumFriends].m_aName, pName, sizeof(m_aFriends[m_NumFriends].m_aName)); str_copy(m_aFriends[m_NumFriends].m_aClan, pClan, sizeof(m_aFriends[m_NumFriends].m_aClan)); m_aFriends[m_NumFriends].m_NameHash = NameHash; m_aFriends[m_NumFriends].m_ClanHash = ClanHash; ++m_NumFriends; } void CFriends::RemoveFriend(const char *pName, const char *pClan) { unsigned NameHash = str_quickhash(pName); unsigned ClanHash = str_quickhash(pClan); for(int i = 0; i < m_NumFriends; ++i) { if(m_aFriends[i].m_NameHash == NameHash && m_aFriends[i].m_ClanHash == ClanHash) { RemoveFriend(i); return; } } } void CFriends::RemoveFriend(int Index) { if(Index >= 0 && Index < m_NumFriends) { mem_move(&m_aFriends[Index], &m_aFriends[Index+1], sizeof(CFriendInfo)*(m_NumFriends-(Index+1))); --m_NumFriends; } return; } void CFriends::ConfigSaveCallback(IConfig *pConfig, void *pUserData) { CFriends *pSelf = (CFriends *)pUserData; char aBuf[128]; const char *pEnd = aBuf+sizeof(aBuf)-4; for(int i = 0; i < pSelf->m_NumFriends; ++i) { str_copy(aBuf, "add_friend ", sizeof(aBuf)); const char *pSrc = pSelf->m_aFriends[i].m_aName; char *pDst = aBuf+str_length(aBuf); *pDst++ = '"'; while(*pSrc && pDst < pEnd) { if(*pSrc == '"' || *pSrc == '\\') // escape \ and " *pDst++ = '\\'; *pDst++ = *pSrc++; } *pDst++ = '"'; *pDst++ = ' '; pSrc = pSelf->m_aFriends[i].m_aClan; *pDst++ = '"'; while(*pSrc && pDst < pEnd) { if(*pSrc == '"' || *pSrc == '\\') // escape \ and " *pDst++ = '\\'; *pDst++ = *pSrc++; } *pDst++ = '"'; *pDst++ = 0; pConfig->WriteLine(aBuf); } } teeworlds-0.6.2+dfsg/src/engine/client/friends.h0000644000175000017500000000200512140200333020544 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CLIENT_FRIENDS_H #define ENGINE_CLIENT_FRIENDS_H #include class CFriends : public IFriends { CFriendInfo m_aFriends[MAX_FRIENDS]; int m_NumFriends; static void ConAddFriend(IConsole::IResult *pResult, void *pUserData); static void ConRemoveFriend(IConsole::IResult *pResult, void *pUserData); static void ConfigSaveCallback(IConfig *pConfig, void *pUserData); public: CFriends(); void Init(); int NumFriends() const { return m_NumFriends; } const CFriendInfo *GetFriend(int Index) const; int GetFriendState(const char *pName, const char *pClan) const; bool IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const; void AddFriend(const char *pName, const char *pClan); void RemoveFriend(const char *pName, const char *pClan); void RemoveFriend(int Index); }; #endif teeworlds-0.6.2+dfsg/src/engine/client/graphics.cpp0000644000175000017500000006461512140200333021264 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "SDL.h" #include "SDL_opengl.h" #include #include #include #include #include #include #include #include // cosf, sinf #include "graphics.h" #if defined(CONF_PLATFORM_MACOSX) class semaphore { SDL_sem *sem; public: semaphore() { sem = SDL_CreateSemaphore(0); } ~semaphore() { SDL_DestroySemaphore(sem); } void wait() { SDL_SemWait(sem); } void signal() { SDL_SemPost(sem); } }; #endif static CVideoMode g_aFakeModes[] = { {320,240,8,8,8}, {400,300,8,8,8}, {640,480,8,8,8}, {720,400,8,8,8}, {768,576,8,8,8}, {800,600,8,8,8}, {1024,600,8,8,8}, {1024,768,8,8,8}, {1152,864,8,8,8}, {1280,768,8,8,8}, {1280,800,8,8,8}, {1280,960,8,8,8}, {1280,1024,8,8,8}, {1368,768,8,8,8}, {1400,1050,8,8,8}, {1440,900,8,8,8}, {1440,1050,8,8,8}, {1600,1000,8,8,8}, {1600,1200,8,8,8}, {1680,1050,8,8,8}, {1792,1344,8,8,8}, {1800,1440,8,8,8}, {1856,1392,8,8,8}, {1920,1080,8,8,8}, {1920,1200,8,8,8}, {1920,1440,8,8,8}, {1920,2400,8,8,8}, {2048,1536,8,8,8}, {320,240,5,6,5}, {400,300,5,6,5}, {640,480,5,6,5}, {720,400,5,6,5}, {768,576,5,6,5}, {800,600,5,6,5}, {1024,600,5,6,5}, {1024,768,5,6,5}, {1152,864,5,6,5}, {1280,768,5,6,5}, {1280,800,5,6,5}, {1280,960,5,6,5}, {1280,1024,5,6,5}, {1368,768,5,6,5}, {1400,1050,5,6,5}, {1440,900,5,6,5}, {1440,1050,5,6,5}, {1600,1000,5,6,5}, {1600,1200,5,6,5}, {1680,1050,5,6,5}, {1792,1344,5,6,5}, {1800,1440,5,6,5}, {1856,1392,5,6,5}, {1920,1080,5,6,5}, {1920,1200,5,6,5}, {1920,1440,5,6,5}, {1920,2400,5,6,5}, {2048,1536,5,6,5} }; void CGraphics_OpenGL::Flush() { if(m_NumVertices == 0) return; //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glVertexPointer(3, GL_FLOAT, sizeof(CVertex), (char*)m_aVertices); glTexCoordPointer(2, GL_FLOAT, sizeof(CVertex), (char*)m_aVertices + sizeof(float)*3); glColorPointer(4, GL_FLOAT, sizeof(CVertex), (char*)m_aVertices + sizeof(float)*5); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); if(m_RenderEnable) { if(m_Drawing == DRAWING_QUADS) glDrawArrays(GL_QUADS, 0, m_NumVertices); else if(m_Drawing == DRAWING_LINES) glDrawArrays(GL_LINES, 0, m_NumVertices); } // Reset pointer m_NumVertices = 0; } void CGraphics_OpenGL::AddVertices(int Count) { m_NumVertices += Count; if((m_NumVertices + Count) >= MAX_VERTICES) Flush(); } void CGraphics_OpenGL::Rotate4(const CPoint &rCenter, CVertex *pPoints) { float c = cosf(m_Rotation); float s = sinf(m_Rotation); float x, y; int i; for(i = 0; i < 4; i++) { x = pPoints[i].m_Pos.x - rCenter.x; y = pPoints[i].m_Pos.y - rCenter.y; pPoints[i].m_Pos.x = x * c - y * s + rCenter.x; pPoints[i].m_Pos.y = x * s + y * c + rCenter.y; } } unsigned char CGraphics_OpenGL::Sample(int w, int h, const unsigned char *pData, int u, int v, int Offset, int ScaleW, int ScaleH, int Bpp) { int Value = 0; for(int x = 0; x < ScaleW; x++) for(int y = 0; y < ScaleH; y++) Value += pData[((v+y)*w+(u+x))*Bpp+Offset]; return Value/(ScaleW*ScaleH); } unsigned char *CGraphics_OpenGL::Rescale(int Width, int Height, int NewWidth, int NewHeight, int Format, const unsigned char *pData) { unsigned char *pTmpData; int ScaleW = Width/NewWidth; int ScaleH = Height/NewHeight; int Bpp = 3; if(Format == CImageInfo::FORMAT_RGBA) Bpp = 4; pTmpData = (unsigned char *)mem_alloc(NewWidth*NewHeight*Bpp, 1); int c = 0; for(int y = 0; y < NewHeight; y++) for(int x = 0; x < NewWidth; x++, c++) { pTmpData[c*Bpp] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 0, ScaleW, ScaleH, Bpp); pTmpData[c*Bpp+1] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 1, ScaleW, ScaleH, Bpp); pTmpData[c*Bpp+2] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 2, ScaleW, ScaleH, Bpp); if(Bpp == 4) pTmpData[c*Bpp+3] = Sample(Width, Height, pData, x*ScaleW, y*ScaleH, 3, ScaleW, ScaleH, Bpp); } return pTmpData; } CGraphics_OpenGL::CGraphics_OpenGL() { m_NumVertices = 0; m_ScreenX0 = 0; m_ScreenY0 = 0; m_ScreenX1 = 0; m_ScreenY1 = 0; m_ScreenWidth = -1; m_ScreenHeight = -1; m_Rotation = 0; m_Drawing = 0; m_InvalidTexture = 0; m_TextureMemoryUsage = 0; m_RenderEnable = true; m_DoScreenshot = false; } void CGraphics_OpenGL::ClipEnable(int x, int y, int w, int h) { if(x < 0) w += x; if(y < 0) h += y; x = clamp(x, 0, ScreenWidth()); y = clamp(y, 0, ScreenHeight()); w = clamp(w, 0, ScreenWidth()-x); h = clamp(h, 0, ScreenHeight()-y); glScissor(x, ScreenHeight()-(y+h), w, h); glEnable(GL_SCISSOR_TEST); } void CGraphics_OpenGL::ClipDisable() { //if(no_gfx) return; glDisable(GL_SCISSOR_TEST); } void CGraphics_OpenGL::BlendNone() { glDisable(GL_BLEND); } void CGraphics_OpenGL::BlendNormal() { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } void CGraphics_OpenGL::BlendAdditive() { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); } void CGraphics_OpenGL::WrapNormal() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } void CGraphics_OpenGL::WrapClamp() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } int CGraphics_OpenGL::MemoryUsage() const { return m_TextureMemoryUsage; } void CGraphics_OpenGL::MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY) { m_ScreenX0 = TopLeftX; m_ScreenY0 = TopLeftY; m_ScreenX1 = BottomRightX; m_ScreenY1 = BottomRightY; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(TopLeftX, BottomRightX, BottomRightY, TopLeftY, 1.0f, 10.f); } void CGraphics_OpenGL::GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY) { *pTopLeftX = m_ScreenX0; *pTopLeftY = m_ScreenY0; *pBottomRightX = m_ScreenX1; *pBottomRightY = m_ScreenY1; } void CGraphics_OpenGL::LinesBegin() { dbg_assert(m_Drawing == 0, "called Graphics()->LinesBegin twice"); m_Drawing = DRAWING_LINES; SetColor(1,1,1,1); } void CGraphics_OpenGL::LinesEnd() { dbg_assert(m_Drawing == DRAWING_LINES, "called Graphics()->LinesEnd without begin"); Flush(); m_Drawing = 0; } void CGraphics_OpenGL::LinesDraw(const CLineItem *pArray, int Num) { dbg_assert(m_Drawing == DRAWING_LINES, "called Graphics()->LinesDraw without begin"); for(int i = 0; i < Num; ++i) { m_aVertices[m_NumVertices + 2*i].m_Pos.x = pArray[i].m_X0; m_aVertices[m_NumVertices + 2*i].m_Pos.y = pArray[i].m_Y0; m_aVertices[m_NumVertices + 2*i].m_Tex = m_aTexture[0]; m_aVertices[m_NumVertices + 2*i].m_Color = m_aColor[0]; m_aVertices[m_NumVertices + 2*i + 1].m_Pos.x = pArray[i].m_X1; m_aVertices[m_NumVertices + 2*i + 1].m_Pos.y = pArray[i].m_Y1; m_aVertices[m_NumVertices + 2*i + 1].m_Tex = m_aTexture[1]; m_aVertices[m_NumVertices + 2*i + 1].m_Color = m_aColor[1]; } AddVertices(2*Num); } int CGraphics_OpenGL::UnloadTexture(int Index) { if(Index == m_InvalidTexture) return 0; if(Index < 0) return 0; glDeleteTextures(1, &m_aTextures[Index].m_Tex); m_aTextures[Index].m_Next = m_FirstFreeTexture; m_TextureMemoryUsage -= m_aTextures[Index].m_MemSize; m_FirstFreeTexture = Index; return 0; } int CGraphics_OpenGL::LoadTextureRawSub(int TextureID, int x, int y, int Width, int Height, int Format, const void *pData) { int Oglformat = GL_RGBA; if(Format == CImageInfo::FORMAT_RGB) Oglformat = GL_RGB; else if(Format == CImageInfo::FORMAT_ALPHA) Oglformat = GL_ALPHA; glBindTexture(GL_TEXTURE_2D, m_aTextures[TextureID].m_Tex); glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, Width, Height, Oglformat, GL_UNSIGNED_BYTE, pData); return 0; } int CGraphics_OpenGL::LoadTextureRaw(int Width, int Height, int Format, const void *pData, int StoreFormat, int Flags) { int Mipmap = 1; unsigned char *pTexData = (unsigned char *)pData; unsigned char *pTmpData = 0; int Oglformat = 0; int StoreOglformat = 0; int Tex = 0; // don't waste memory on texture if we are stress testing if(g_Config.m_DbgStress) return m_InvalidTexture; // grab texture Tex = m_FirstFreeTexture; m_FirstFreeTexture = m_aTextures[Tex].m_Next; m_aTextures[Tex].m_Next = -1; // resample if needed if(!(Flags&TEXLOAD_NORESAMPLE) && (Format == CImageInfo::FORMAT_RGBA || Format == CImageInfo::FORMAT_RGB)) { if(Width > GL_MAX_TEXTURE_SIZE || Height > GL_MAX_TEXTURE_SIZE) { int NewWidth = min(Width, GL_MAX_TEXTURE_SIZE); int NewHeight = min(Height, GL_MAX_TEXTURE_SIZE); pTmpData = Rescale(Width, Height, NewWidth, NewHeight, Format, pTexData); pTexData = pTmpData; Width = NewWidth; Height = NewHeight; } else if(Width > 16 && Height > 16 && g_Config.m_GfxTextureQuality == 0) { pTmpData = Rescale(Width, Height, Width/2, Height/2, Format, pTexData); pTexData = pTmpData; Width /= 2; Height /= 2; } } Oglformat = GL_RGBA; if(Format == CImageInfo::FORMAT_RGB) Oglformat = GL_RGB; else if(Format == CImageInfo::FORMAT_ALPHA) Oglformat = GL_ALPHA; // upload texture if(g_Config.m_GfxTextureCompression) { StoreOglformat = GL_COMPRESSED_RGBA_ARB; if(StoreFormat == CImageInfo::FORMAT_RGB) StoreOglformat = GL_COMPRESSED_RGB_ARB; else if(StoreFormat == CImageInfo::FORMAT_ALPHA) StoreOglformat = GL_COMPRESSED_ALPHA_ARB; } else { StoreOglformat = GL_RGBA; if(StoreFormat == CImageInfo::FORMAT_RGB) StoreOglformat = GL_RGB; else if(StoreFormat == CImageInfo::FORMAT_ALPHA) StoreOglformat = GL_ALPHA; } glGenTextures(1, &m_aTextures[Tex].m_Tex); glBindTexture(GL_TEXTURE_2D, m_aTextures[Tex].m_Tex); if(Flags&TEXLOAD_NOMIPMAPS) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, StoreOglformat, Width, Height, 0, Oglformat, GL_UNSIGNED_BYTE, pData); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, StoreOglformat, Width, Height, Oglformat, GL_UNSIGNED_BYTE, pTexData); } // calculate memory usage { int PixelSize = 4; if(StoreFormat == CImageInfo::FORMAT_RGB) PixelSize = 3; else if(StoreFormat == CImageInfo::FORMAT_ALPHA) PixelSize = 1; m_aTextures[Tex].m_MemSize = Width*Height*PixelSize; if(Mipmap) { while(Width > 2 && Height > 2) { Width>>=1; Height>>=1; m_aTextures[Tex].m_MemSize += Width*Height*PixelSize; } } } m_TextureMemoryUsage += m_aTextures[Tex].m_MemSize; mem_free(pTmpData); return Tex; } // simple uncompressed RGBA loaders int CGraphics_OpenGL::LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) { int l = str_length(pFilename); int ID; CImageInfo Img; if(l < 3) return -1; if(LoadPNG(&Img, pFilename, StorageType)) { if (StoreFormat == CImageInfo::FORMAT_AUTO) StoreFormat = Img.m_Format; ID = LoadTextureRaw(Img.m_Width, Img.m_Height, Img.m_Format, Img.m_pData, StoreFormat, Flags); mem_free(Img.m_pData); if(ID != m_InvalidTexture && g_Config.m_Debug) dbg_msg("graphics/texture", "loaded %s", pFilename); return ID; } return m_InvalidTexture; } int CGraphics_OpenGL::LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) { char aCompleteFilename[512]; unsigned char *pBuffer; png_t Png; // ignore_convention // open file for reading png_init(0,0); // ignore_convention IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType, aCompleteFilename, sizeof(aCompleteFilename)); if(File) io_close(File); else { dbg_msg("game/png", "failed to open file. filename='%s'", pFilename); return 0; } int Error = png_open_file(&Png, aCompleteFilename); // ignore_convention if(Error != PNG_NO_ERROR) { dbg_msg("game/png", "failed to open file. filename='%s'", aCompleteFilename); if(Error != PNG_FILE_ERROR) png_close_file(&Png); // ignore_convention return 0; } if(Png.depth != 8 || (Png.color_type != PNG_TRUECOLOR && Png.color_type != PNG_TRUECOLOR_ALPHA)) // ignore_convention { dbg_msg("game/png", "invalid format. filename='%s'", aCompleteFilename); png_close_file(&Png); // ignore_convention return 0; } pBuffer = (unsigned char *)mem_alloc(Png.width * Png.height * Png.bpp, 1); // ignore_convention png_get_data(&Png, pBuffer); // ignore_convention png_close_file(&Png); // ignore_convention pImg->m_Width = Png.width; // ignore_convention pImg->m_Height = Png.height; // ignore_convention if(Png.color_type == PNG_TRUECOLOR) // ignore_convention pImg->m_Format = CImageInfo::FORMAT_RGB; else if(Png.color_type == PNG_TRUECOLOR_ALPHA) // ignore_convention pImg->m_Format = CImageInfo::FORMAT_RGBA; pImg->m_pData = pBuffer; return 1; } void CGraphics_OpenGL::ScreenshotDirect(const char *pFilename) { // fetch image data int y; int w = m_ScreenWidth; int h = m_ScreenHeight; unsigned char *pPixelData = (unsigned char *)mem_alloc(w*(h+1)*3, 1); unsigned char *pTempRow = pPixelData+w*h*3; GLint Alignment; glGetIntegerv(GL_PACK_ALIGNMENT, &Alignment); glPixelStorei(GL_PACK_ALIGNMENT, 1); glReadPixels(0,0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pPixelData); glPixelStorei(GL_PACK_ALIGNMENT, Alignment); // flip the pixel because opengl works from bottom left corner for(y = 0; y < h/2; y++) { mem_copy(pTempRow, pPixelData+y*w*3, w*3); mem_copy(pPixelData+y*w*3, pPixelData+(h-y-1)*w*3, w*3); mem_copy(pPixelData+(h-y-1)*w*3, pTempRow,w*3); } // find filename { char aWholePath[1024]; png_t Png; // ignore_convention IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE, aWholePath, sizeof(aWholePath)); if(File) io_close(File); // save png char aBuf[256]; str_format(aBuf, sizeof(aBuf), "saved screenshot to '%s'", aWholePath); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); png_open_file_write(&Png, aWholePath); // ignore_convention png_set_data(&Png, w, h, 8, PNG_TRUECOLOR, (unsigned char *)pPixelData); // ignore_convention png_close_file(&Png); // ignore_convention } // clean up mem_free(pPixelData); } void CGraphics_OpenGL::TextureSet(int TextureID) { dbg_assert(m_Drawing == 0, "called Graphics()->TextureSet within begin"); if(TextureID == -1) { glDisable(GL_TEXTURE_2D); } else { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, m_aTextures[TextureID].m_Tex); } } void CGraphics_OpenGL::Clear(float r, float g, float b) { glClearColor(r,g,b,0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } void CGraphics_OpenGL::QuadsBegin() { dbg_assert(m_Drawing == 0, "called Graphics()->QuadsBegin twice"); m_Drawing = DRAWING_QUADS; QuadsSetSubset(0,0,1,1); QuadsSetRotation(0); SetColor(1,1,1,1); } void CGraphics_OpenGL::QuadsEnd() { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsEnd without begin"); Flush(); m_Drawing = 0; } void CGraphics_OpenGL::QuadsSetRotation(float Angle) { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsSetRotation without begin"); m_Rotation = Angle; } void CGraphics_OpenGL::SetColorVertex(const CColorVertex *pArray, int Num) { dbg_assert(m_Drawing != 0, "called Graphics()->SetColorVertex without begin"); for(int i = 0; i < Num; ++i) { m_aColor[pArray[i].m_Index].r = pArray[i].m_R; m_aColor[pArray[i].m_Index].g = pArray[i].m_G; m_aColor[pArray[i].m_Index].b = pArray[i].m_B; m_aColor[pArray[i].m_Index].a = pArray[i].m_A; } } void CGraphics_OpenGL::SetColor(float r, float g, float b, float a) { dbg_assert(m_Drawing != 0, "called Graphics()->SetColor without begin"); CColorVertex Array[4] = { CColorVertex(0, r, g, b, a), CColorVertex(1, r, g, b, a), CColorVertex(2, r, g, b, a), CColorVertex(3, r, g, b, a)}; SetColorVertex(Array, 4); } void CGraphics_OpenGL::QuadsSetSubset(float TlU, float TlV, float BrU, float BrV) { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsSetSubset without begin"); m_aTexture[0].u = TlU; m_aTexture[1].u = BrU; m_aTexture[0].v = TlV; m_aTexture[1].v = TlV; m_aTexture[3].u = TlU; m_aTexture[2].u = BrU; m_aTexture[3].v = BrV; m_aTexture[2].v = BrV; } void CGraphics_OpenGL::QuadsSetSubsetFree( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) { m_aTexture[0].u = x0; m_aTexture[0].v = y0; m_aTexture[1].u = x1; m_aTexture[1].v = y1; m_aTexture[2].u = x2; m_aTexture[2].v = y2; m_aTexture[3].u = x3; m_aTexture[3].v = y3; } void CGraphics_OpenGL::QuadsDraw(CQuadItem *pArray, int Num) { for(int i = 0; i < Num; ++i) { pArray[i].m_X -= pArray[i].m_Width/2; pArray[i].m_Y -= pArray[i].m_Height/2; } QuadsDrawTL(pArray, Num); } void CGraphics_OpenGL::QuadsDrawTL(const CQuadItem *pArray, int Num) { CPoint Center; Center.z = 0; dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsDrawTL without begin"); for(int i = 0; i < Num; ++i) { m_aVertices[m_NumVertices + 4*i].m_Pos.x = pArray[i].m_X; m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y; m_aVertices[m_NumVertices + 4*i].m_Tex = m_aTexture[0]; m_aVertices[m_NumVertices + 4*i].m_Color = m_aColor[0]; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y; m_aVertices[m_NumVertices + 4*i + 1].m_Tex = m_aTexture[1]; m_aVertices[m_NumVertices + 4*i + 1].m_Color = m_aColor[1]; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; m_aVertices[m_NumVertices + 4*i + 2].m_Tex = m_aTexture[2]; m_aVertices[m_NumVertices + 4*i + 2].m_Color = m_aColor[2]; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.x = pArray[i].m_X; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; m_aVertices[m_NumVertices + 4*i + 3].m_Tex = m_aTexture[3]; m_aVertices[m_NumVertices + 4*i + 3].m_Color = m_aColor[3]; if(m_Rotation != 0) { Center.x = pArray[i].m_X + pArray[i].m_Width/2; Center.y = pArray[i].m_Y + pArray[i].m_Height/2; Rotate4(Center, &m_aVertices[m_NumVertices + 4*i]); } } AddVertices(4*Num); } void CGraphics_OpenGL::QuadsDrawFreeform(const CFreeformItem *pArray, int Num) { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsDrawFreeform without begin"); for(int i = 0; i < Num; ++i) { m_aVertices[m_NumVertices + 4*i].m_Pos.x = pArray[i].m_X0; m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y0; m_aVertices[m_NumVertices + 4*i].m_Tex = m_aTexture[0]; m_aVertices[m_NumVertices + 4*i].m_Color = m_aColor[0]; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.x = pArray[i].m_X1; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y1; m_aVertices[m_NumVertices + 4*i + 1].m_Tex = m_aTexture[1]; m_aVertices[m_NumVertices + 4*i + 1].m_Color = m_aColor[1]; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.x = pArray[i].m_X3; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y3; m_aVertices[m_NumVertices + 4*i + 2].m_Tex = m_aTexture[3]; m_aVertices[m_NumVertices + 4*i + 2].m_Color = m_aColor[3]; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.x = pArray[i].m_X2; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y2; m_aVertices[m_NumVertices + 4*i + 3].m_Tex = m_aTexture[2]; m_aVertices[m_NumVertices + 4*i + 3].m_Color = m_aColor[2]; } AddVertices(4*Num); } void CGraphics_OpenGL::QuadsText(float x, float y, float Size, const char *pText) { float StartX = x; while(*pText) { char c = *pText; pText++; if(c == '\n') { x = StartX; y += Size; } else { QuadsSetSubset( (c%16)/16.0f, (c/16)/16.0f, (c%16)/16.0f+1.0f/16.0f, (c/16)/16.0f+1.0f/16.0f); CQuadItem QuadItem(x, y, Size, Size); QuadsDrawTL(&QuadItem, 1); x += Size/2; } } } int CGraphics_OpenGL::Init() { m_pStorage = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); // Set all z to -5.0f for(int i = 0; i < MAX_VERTICES; i++) m_aVertices[i].m_Pos.z = -5.0f; // init textures m_FirstFreeTexture = 0; for(int i = 0; i < MAX_TEXTURES; i++) m_aTextures[i].m_Next = i+1; m_aTextures[MAX_TEXTURES-1].m_Next = -1; // set some default settings glEnable(GL_BLEND); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glAlphaFunc(GL_GREATER, 0); glEnable(GL_ALPHA_TEST); glDepthMask(0); // create null texture, will get id=0 static const unsigned char aNullTextureData[] = { 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff, 0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff, }; m_InvalidTexture = LoadTextureRaw(4,4,CImageInfo::FORMAT_RGBA,aNullTextureData,CImageInfo::FORMAT_RGBA,TEXLOAD_NORESAMPLE); return 0; } int CGraphics_SDL::TryInit() { const SDL_VideoInfo *pInfo = SDL_GetVideoInfo(); SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); // prevent stuck mouse cursor sdl-bug when loosing fullscreen focus in windows // use current resolution as default if(g_Config.m_GfxScreenWidth == 0 || g_Config.m_GfxScreenHeight == 0) { g_Config.m_GfxScreenWidth = pInfo->current_w; g_Config.m_GfxScreenHeight = pInfo->current_h; } m_ScreenWidth = g_Config.m_GfxScreenWidth; m_ScreenHeight = g_Config.m_GfxScreenHeight; // set flags int Flags = SDL_OPENGL; if(g_Config.m_DbgResizable) Flags |= SDL_RESIZABLE; if(pInfo->hw_available) // ignore_convention Flags |= SDL_HWSURFACE; else Flags |= SDL_SWSURFACE; if(pInfo->blit_hw) // ignore_convention Flags |= SDL_HWACCEL; if(g_Config.m_GfxBorderless && g_Config.m_GfxFullscreen) { dbg_msg("gfx", "both borderless and fullscreen activated, disabling borderless"); g_Config.m_GfxBorderless = 0; } if(g_Config.m_GfxBorderless) Flags |= SDL_NOFRAME; else if(g_Config.m_GfxFullscreen) Flags |= SDL_FULLSCREEN; // set gl attributes if(g_Config.m_GfxFsaaSamples) { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, g_Config.m_GfxFsaaSamples); } else { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, g_Config.m_GfxVsync); // set caption SDL_WM_SetCaption("Teeworlds", "Teeworlds"); // create window m_pScreenSurface = SDL_SetVideoMode(m_ScreenWidth, m_ScreenHeight, 0, Flags); if(m_pScreenSurface == NULL) { dbg_msg("gfx", "unable to set video mode: %s", SDL_GetError()); return -1; } return 0; } int CGraphics_SDL::InitWindow() { if(TryInit() == 0) return 0; // try disabling fsaa while(g_Config.m_GfxFsaaSamples) { g_Config.m_GfxFsaaSamples--; if(g_Config.m_GfxFsaaSamples) dbg_msg("gfx", "lowering FSAA to %d and trying again", g_Config.m_GfxFsaaSamples); else dbg_msg("gfx", "disabling FSAA and trying again"); if(TryInit() == 0) return 0; } // try lowering the resolution if(g_Config.m_GfxScreenWidth != 640 || g_Config.m_GfxScreenHeight != 480) { dbg_msg("gfx", "setting resolution to 640x480 and trying again"); g_Config.m_GfxScreenWidth = 640; g_Config.m_GfxScreenHeight = 480; if(TryInit() == 0) return 0; } dbg_msg("gfx", "out of ideas. failed to init graphics"); return -1; } CGraphics_SDL::CGraphics_SDL() { m_pScreenSurface = 0; } int CGraphics_SDL::Init() { { int Systems = SDL_INIT_VIDEO; if(g_Config.m_SndEnable) Systems |= SDL_INIT_AUDIO; if(g_Config.m_ClEventthread) Systems |= SDL_INIT_EVENTTHREAD; if(SDL_Init(Systems) < 0) { dbg_msg("gfx", "unable to init SDL: %s", SDL_GetError()); return -1; } } atexit(SDL_Quit); // ignore_convention #ifdef CONF_FAMILY_WINDOWS if(!getenv("SDL_VIDEO_WINDOW_POS") && !getenv("SDL_VIDEO_CENTERED")) // ignore_convention putenv("SDL_VIDEO_WINDOW_POS=center"); // ignore_convention #endif if(InitWindow() != 0) return -1; SDL_ShowCursor(0); CGraphics_OpenGL::Init(); MapScreen(0,0,g_Config.m_GfxScreenWidth, g_Config.m_GfxScreenHeight); return 0; } void CGraphics_SDL::Shutdown() { // TODO: SDL, is this correct? SDL_Quit(); } void CGraphics_SDL::Minimize() { SDL_WM_IconifyWindow(); } void CGraphics_SDL::Maximize() { // TODO: SDL } int CGraphics_SDL::WindowActive() { return SDL_GetAppState()&SDL_APPINPUTFOCUS; } int CGraphics_SDL::WindowOpen() { return SDL_GetAppState()&SDL_APPACTIVE; } void CGraphics_SDL::TakeScreenshot(const char *pFilename) { char aDate[20]; str_timestamp(aDate, sizeof(aDate)); str_format(m_aScreenshotName, sizeof(m_aScreenshotName), "screenshots/%s_%s.png", pFilename?pFilename:"screenshot", aDate); m_DoScreenshot = true; } void CGraphics_SDL::Swap() { if(m_DoScreenshot) { if(WindowActive()) ScreenshotDirect(m_aScreenshotName); m_DoScreenshot = false; } SDL_GL_SwapBuffers(); if(g_Config.m_GfxFinish) glFinish(); } int CGraphics_SDL::GetVideoModes(CVideoMode *pModes, int MaxModes) { int NumModes = sizeof(g_aFakeModes)/sizeof(CVideoMode); SDL_Rect **ppModes; if(g_Config.m_GfxDisplayAllModes) { int Count = sizeof(g_aFakeModes)/sizeof(CVideoMode); mem_copy(pModes, g_aFakeModes, sizeof(g_aFakeModes)); if(MaxModes < Count) Count = MaxModes; return Count; } // TODO: fix this code on osx or windows ppModes = SDL_ListModes(NULL, SDL_OPENGL|SDL_GL_DOUBLEBUFFER|SDL_FULLSCREEN); if(ppModes == NULL) { // no modes NumModes = 0; } else if(ppModes == (SDL_Rect**)-1) { // all modes } else { NumModes = 0; for(int i = 0; ppModes[i]; ++i) { if(NumModes == MaxModes) break; pModes[NumModes].m_Width = ppModes[i]->w; pModes[NumModes].m_Height = ppModes[i]->h; pModes[NumModes].m_Red = 8; pModes[NumModes].m_Green = 8; pModes[NumModes].m_Blue = 8; NumModes++; } } return NumModes; } // syncronization void CGraphics_SDL::InsertSignal(semaphore *pSemaphore) { pSemaphore->signal(); } bool CGraphics_SDL::IsIdle() { return true; } void CGraphics_SDL::WaitForIdle() { } extern IEngineGraphics *CreateEngineGraphics() { return new CGraphics_SDL(); } teeworlds-0.6.2+dfsg/src/engine/client/graphics.h0000644000175000017500000000773712140200333020733 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CLIENT_GRAPHICS_H #define ENGINE_CLIENT_GRAPHICS_H class CGraphics_OpenGL : public IEngineGraphics { protected: class IStorage *m_pStorage; class IConsole *m_pConsole; // typedef struct { float x, y, z; } CPoint; typedef struct { float u, v; } CTexCoord; typedef struct { float r, g, b, a; } CColor; typedef struct { CPoint m_Pos; CTexCoord m_Tex; CColor m_Color; } CVertex; enum { MAX_VERTICES = 32*1024, MAX_TEXTURES = 1024*4, DRAWING_QUADS=1, DRAWING_LINES=2 }; CVertex m_aVertices[MAX_VERTICES]; int m_NumVertices; CColor m_aColor[4]; CTexCoord m_aTexture[4]; bool m_RenderEnable; float m_Rotation; int m_Drawing; bool m_DoScreenshot; char m_aScreenshotName[128]; float m_ScreenX0; float m_ScreenY0; float m_ScreenX1; float m_ScreenY1; int m_InvalidTexture; struct CTexture { GLuint m_Tex; int m_MemSize; int m_Flags; int m_Next; }; CTexture m_aTextures[MAX_TEXTURES]; int m_FirstFreeTexture; int m_TextureMemoryUsage; void Flush(); void AddVertices(int Count); void Rotate4(const CPoint &rCenter, CVertex *pPoints); static unsigned char Sample(int w, int h, const unsigned char *pData, int u, int v, int Offset, int ScaleW, int ScaleH, int Bpp); static unsigned char *Rescale(int Width, int Height, int NewWidth, int NewHeight, int Format, const unsigned char *pData); public: CGraphics_OpenGL(); virtual void ClipEnable(int x, int y, int w, int h); virtual void ClipDisable(); virtual void BlendNone(); virtual void BlendNormal(); virtual void BlendAdditive(); virtual void WrapNormal(); virtual void WrapClamp(); virtual int MemoryUsage() const; virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY); virtual void GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY); virtual void LinesBegin(); virtual void LinesEnd(); virtual void LinesDraw(const CLineItem *pArray, int Num); virtual int UnloadTexture(int Index); virtual int LoadTextureRaw(int Width, int Height, int Format, const void *pData, int StoreFormat, int Flags); virtual int LoadTextureRawSub(int TextureID, int x, int y, int Width, int Height, int Format, const void *pData); // simple uncompressed RGBA loaders virtual int LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags); virtual int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType); void ScreenshotDirect(const char *pFilename); virtual void TextureSet(int TextureID); virtual void Clear(float r, float g, float b); virtual void QuadsBegin(); virtual void QuadsEnd(); virtual void QuadsSetRotation(float Angle); virtual void SetColorVertex(const CColorVertex *pArray, int Num); virtual void SetColor(float r, float g, float b, float a); virtual void QuadsSetSubset(float TlU, float TlV, float BrU, float BrV); virtual void QuadsSetSubsetFree( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3); virtual void QuadsDraw(CQuadItem *pArray, int Num); virtual void QuadsDrawTL(const CQuadItem *pArray, int Num); virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num); virtual void QuadsText(float x, float y, float Size, const char *pText); virtual int Init(); }; class CGraphics_SDL : public CGraphics_OpenGL { SDL_Surface *m_pScreenSurface; int TryInit(); int InitWindow(); public: CGraphics_SDL(); virtual int Init(); virtual void Shutdown(); virtual void Minimize(); virtual void Maximize(); virtual int WindowActive(); virtual int WindowOpen(); virtual void TakeScreenshot(const char *pFilename); virtual void Swap(); virtual int GetVideoModes(CVideoMode *pModes, int MaxModes); // syncronization virtual void InsertSignal(semaphore *pSemaphore); virtual bool IsIdle(); virtual void WaitForIdle(); }; #endif teeworlds-0.6.2+dfsg/src/engine/client/graphics_threaded.cpp0000644000175000017500000005653012140200333023121 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include // cosf, sinf #include "graphics_threaded.h" static CVideoMode g_aFakeModes[] = { {320,240,8,8,8}, {400,300,8,8,8}, {640,480,8,8,8}, {720,400,8,8,8}, {768,576,8,8,8}, {800,600,8,8,8}, {1024,600,8,8,8}, {1024,768,8,8,8}, {1152,864,8,8,8}, {1280,768,8,8,8}, {1280,800,8,8,8}, {1280,960,8,8,8}, {1280,1024,8,8,8}, {1368,768,8,8,8}, {1400,1050,8,8,8}, {1440,900,8,8,8}, {1440,1050,8,8,8}, {1600,1000,8,8,8}, {1600,1200,8,8,8}, {1680,1050,8,8,8}, {1792,1344,8,8,8}, {1800,1440,8,8,8}, {1856,1392,8,8,8}, {1920,1080,8,8,8}, {1920,1200,8,8,8}, {1920,1440,8,8,8}, {1920,2400,8,8,8}, {2048,1536,8,8,8}, {320,240,5,6,5}, {400,300,5,6,5}, {640,480,5,6,5}, {720,400,5,6,5}, {768,576,5,6,5}, {800,600,5,6,5}, {1024,600,5,6,5}, {1024,768,5,6,5}, {1152,864,5,6,5}, {1280,768,5,6,5}, {1280,800,5,6,5}, {1280,960,5,6,5}, {1280,1024,5,6,5}, {1368,768,5,6,5}, {1400,1050,5,6,5}, {1440,900,5,6,5}, {1440,1050,5,6,5}, {1600,1000,5,6,5}, {1600,1200,5,6,5}, {1680,1050,5,6,5}, {1792,1344,5,6,5}, {1800,1440,5,6,5}, {1856,1392,5,6,5}, {1920,1080,5,6,5}, {1920,1200,5,6,5}, {1920,1440,5,6,5}, {1920,2400,5,6,5}, {2048,1536,5,6,5} }; void CGraphics_Threaded::FlushVertices() { if(m_NumVertices == 0) return; int NumVerts = m_NumVertices; m_NumVertices = 0; CCommandBuffer::SCommand_Render Cmd; Cmd.m_State = m_State; if(m_Drawing == DRAWING_QUADS) { Cmd.m_PrimType = CCommandBuffer::PRIMTYPE_QUADS; Cmd.m_PrimCount = NumVerts/4; } else if(m_Drawing == DRAWING_LINES) { Cmd.m_PrimType = CCommandBuffer::PRIMTYPE_LINES; Cmd.m_PrimCount = NumVerts/2; } else return; Cmd.m_pVertices = (CCommandBuffer::SVertex *)m_pCommandBuffer->AllocData(sizeof(CCommandBuffer::SVertex)*NumVerts); if(Cmd.m_pVertices == 0x0) { // kick command buffer and try again KickCommandBuffer(); Cmd.m_pVertices = (CCommandBuffer::SVertex *)m_pCommandBuffer->AllocData(sizeof(CCommandBuffer::SVertex)*NumVerts); if(Cmd.m_pVertices == 0x0) { dbg_msg("graphics", "failed to allocate data for vertices"); return; } } // check if we have enough free memory in the commandbuffer if(!m_pCommandBuffer->AddCommand(Cmd)) { // kick command buffer and try again KickCommandBuffer(); Cmd.m_pVertices = (CCommandBuffer::SVertex *)m_pCommandBuffer->AllocData(sizeof(CCommandBuffer::SVertex)*NumVerts); if(Cmd.m_pVertices == 0x0) { dbg_msg("graphics", "failed to allocate data for vertices"); return; } if(!m_pCommandBuffer->AddCommand(Cmd)) { dbg_msg("graphics", "failed to allocate memory for render command"); return; } } mem_copy(Cmd.m_pVertices, m_aVertices, sizeof(CCommandBuffer::SVertex)*NumVerts); } void CGraphics_Threaded::AddVertices(int Count) { m_NumVertices += Count; if((m_NumVertices + Count) >= MAX_VERTICES) FlushVertices(); } void CGraphics_Threaded::Rotate4(const CCommandBuffer::SPoint &rCenter, CCommandBuffer::SVertex *pPoints) { float c = cosf(m_Rotation); float s = sinf(m_Rotation); float x, y; int i; for(i = 0; i < 4; i++) { x = pPoints[i].m_Pos.x - rCenter.x; y = pPoints[i].m_Pos.y - rCenter.y; pPoints[i].m_Pos.x = x * c - y * s + rCenter.x; pPoints[i].m_Pos.y = x * s + y * c + rCenter.y; } } CGraphics_Threaded::CGraphics_Threaded() { m_State.m_ScreenTL.x = 0; m_State.m_ScreenTL.y = 0; m_State.m_ScreenBR.x = 0; m_State.m_ScreenBR.y = 0; m_State.m_ClipEnable = false; m_State.m_ClipX = 0; m_State.m_ClipY = 0; m_State.m_ClipW = 0; m_State.m_ClipH = 0; m_State.m_Texture = -1; m_State.m_BlendMode = CCommandBuffer::BLEND_NONE; m_State.m_WrapMode = CCommandBuffer::WRAP_REPEAT; m_CurrentCommandBuffer = 0; m_pCommandBuffer = 0x0; m_apCommandBuffers[0] = 0x0; m_apCommandBuffers[1] = 0x0; m_NumVertices = 0; m_ScreenWidth = -1; m_ScreenHeight = -1; m_Rotation = 0; m_Drawing = 0; m_InvalidTexture = 0; m_TextureMemoryUsage = 0; m_RenderEnable = true; m_DoScreenshot = false; } void CGraphics_Threaded::ClipEnable(int x, int y, int w, int h) { if(x < 0) w += x; if(y < 0) h += y; x = clamp(x, 0, ScreenWidth()); y = clamp(y, 0, ScreenHeight()); w = clamp(w, 0, ScreenWidth()-x); h = clamp(h, 0, ScreenHeight()-y); m_State.m_ClipEnable = true; m_State.m_ClipX = x; m_State.m_ClipY = ScreenHeight()-(y+h); m_State.m_ClipW = w; m_State.m_ClipH = h; } void CGraphics_Threaded::ClipDisable() { m_State.m_ClipEnable = false; } void CGraphics_Threaded::BlendNone() { m_State.m_BlendMode = CCommandBuffer::BLEND_NONE; } void CGraphics_Threaded::BlendNormal() { m_State.m_BlendMode = CCommandBuffer::BLEND_ALPHA; } void CGraphics_Threaded::BlendAdditive() { m_State.m_BlendMode = CCommandBuffer::BLEND_ADDITIVE; } void CGraphics_Threaded::WrapNormal() { m_State.m_WrapMode = CCommandBuffer::WRAP_REPEAT; } void CGraphics_Threaded::WrapClamp() { m_State.m_WrapMode = CCommandBuffer::WRAP_CLAMP; } int CGraphics_Threaded::MemoryUsage() const { return m_pBackend->MemoryUsage(); } void CGraphics_Threaded::MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY) { m_State.m_ScreenTL.x = TopLeftX; m_State.m_ScreenTL.y = TopLeftY; m_State.m_ScreenBR.x = BottomRightX; m_State.m_ScreenBR.y = BottomRightY; } void CGraphics_Threaded::GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY) { *pTopLeftX = m_State.m_ScreenTL.x; *pTopLeftY = m_State.m_ScreenTL.y; *pBottomRightX = m_State.m_ScreenBR.x; *pBottomRightY = m_State.m_ScreenBR.y; } void CGraphics_Threaded::LinesBegin() { dbg_assert(m_Drawing == 0, "called Graphics()->LinesBegin twice"); m_Drawing = DRAWING_LINES; SetColor(1,1,1,1); } void CGraphics_Threaded::LinesEnd() { dbg_assert(m_Drawing == DRAWING_LINES, "called Graphics()->LinesEnd without begin"); FlushVertices(); m_Drawing = 0; } void CGraphics_Threaded::LinesDraw(const CLineItem *pArray, int Num) { dbg_assert(m_Drawing == DRAWING_LINES, "called Graphics()->LinesDraw without begin"); for(int i = 0; i < Num; ++i) { m_aVertices[m_NumVertices + 2*i].m_Pos.x = pArray[i].m_X0; m_aVertices[m_NumVertices + 2*i].m_Pos.y = pArray[i].m_Y0; m_aVertices[m_NumVertices + 2*i].m_Tex = m_aTexture[0]; m_aVertices[m_NumVertices + 2*i].m_Color = m_aColor[0]; m_aVertices[m_NumVertices + 2*i + 1].m_Pos.x = pArray[i].m_X1; m_aVertices[m_NumVertices + 2*i + 1].m_Pos.y = pArray[i].m_Y1; m_aVertices[m_NumVertices + 2*i + 1].m_Tex = m_aTexture[1]; m_aVertices[m_NumVertices + 2*i + 1].m_Color = m_aColor[1]; } AddVertices(2*Num); } int CGraphics_Threaded::UnloadTexture(int Index) { if(Index == m_InvalidTexture) return 0; if(Index < 0) return 0; CCommandBuffer::SCommand_Texture_Destroy Cmd; Cmd.m_Slot = Index; m_pCommandBuffer->AddCommand(Cmd); m_aTextureIndices[Index] = m_FirstFreeTexture; m_FirstFreeTexture = Index; return 0; } static int ImageFormatToTexFormat(int Format) { if(Format == CImageInfo::FORMAT_RGB) return CCommandBuffer::TEXFORMAT_RGB; if(Format == CImageInfo::FORMAT_RGBA) return CCommandBuffer::TEXFORMAT_RGBA; if(Format == CImageInfo::FORMAT_ALPHA) return CCommandBuffer::TEXFORMAT_ALPHA; return CCommandBuffer::TEXFORMAT_RGBA; } static int ImageFormatToPixelSize(int Format) { switch(Format) { case CImageInfo::FORMAT_RGB: return 3; case CImageInfo::FORMAT_ALPHA: return 1; default: return 4; } } int CGraphics_Threaded::LoadTextureRawSub(int TextureID, int x, int y, int Width, int Height, int Format, const void *pData) { CCommandBuffer::SCommand_Texture_Update Cmd; Cmd.m_Slot = TextureID; Cmd.m_X = x; Cmd.m_Y = y; Cmd.m_Width = Width; Cmd.m_Height = Height; Cmd.m_Format = ImageFormatToTexFormat(Format); // calculate memory usage int MemSize = Width*Height*ImageFormatToPixelSize(Format); // copy texture data void *pTmpData = mem_alloc(MemSize, sizeof(void*)); mem_copy(pTmpData, pData, MemSize); Cmd.m_pData = pTmpData; // m_pCommandBuffer->AddCommand(Cmd); return 0; } int CGraphics_Threaded::LoadTextureRaw(int Width, int Height, int Format, const void *pData, int StoreFormat, int Flags) { // don't waste memory on texture if we are stress testing if(g_Config.m_DbgStress) return m_InvalidTexture; // grab texture int Tex = m_FirstFreeTexture; m_FirstFreeTexture = m_aTextureIndices[Tex]; m_aTextureIndices[Tex] = -1; CCommandBuffer::SCommand_Texture_Create Cmd; Cmd.m_Slot = Tex; Cmd.m_Width = Width; Cmd.m_Height = Height; Cmd.m_PixelSize = ImageFormatToPixelSize(Format); Cmd.m_Format = ImageFormatToTexFormat(Format); Cmd.m_StoreFormat = ImageFormatToTexFormat(StoreFormat); // flags Cmd.m_Flags = 0; if(Flags&IGraphics::TEXLOAD_NOMIPMAPS) Cmd.m_Flags |= CCommandBuffer::TEXFLAG_NOMIPMAPS; if(g_Config.m_GfxTextureCompression) Cmd.m_Flags |= CCommandBuffer::TEXFLAG_COMPRESSED; if(g_Config.m_GfxTextureQuality || Flags&TEXLOAD_NORESAMPLE) Cmd.m_Flags |= CCommandBuffer::TEXFLAG_QUALITY; // copy texture data int MemSize = Width*Height*Cmd.m_PixelSize; void *pTmpData = mem_alloc(MemSize, sizeof(void*)); mem_copy(pTmpData, pData, MemSize); Cmd.m_pData = pTmpData; // m_pCommandBuffer->AddCommand(Cmd); return Tex; } // simple uncompressed RGBA loaders int CGraphics_Threaded::LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) { int l = str_length(pFilename); int ID; CImageInfo Img; if(l < 3) return -1; if(LoadPNG(&Img, pFilename, StorageType)) { if (StoreFormat == CImageInfo::FORMAT_AUTO) StoreFormat = Img.m_Format; ID = LoadTextureRaw(Img.m_Width, Img.m_Height, Img.m_Format, Img.m_pData, StoreFormat, Flags); mem_free(Img.m_pData); if(ID != m_InvalidTexture && g_Config.m_Debug) dbg_msg("graphics/texture", "loaded %s", pFilename); return ID; } return m_InvalidTexture; } int CGraphics_Threaded::LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) { char aCompleteFilename[512]; unsigned char *pBuffer; png_t Png; // ignore_convention // open file for reading png_init(0,0); // ignore_convention IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType, aCompleteFilename, sizeof(aCompleteFilename)); if(File) io_close(File); else { dbg_msg("game/png", "failed to open file. filename='%s'", pFilename); return 0; } int Error = png_open_file(&Png, aCompleteFilename); // ignore_convention if(Error != PNG_NO_ERROR) { dbg_msg("game/png", "failed to open file. filename='%s'", aCompleteFilename); if(Error != PNG_FILE_ERROR) png_close_file(&Png); // ignore_convention return 0; } if(Png.depth != 8 || (Png.color_type != PNG_TRUECOLOR && Png.color_type != PNG_TRUECOLOR_ALPHA)) // ignore_convention { dbg_msg("game/png", "invalid format. filename='%s'", aCompleteFilename); png_close_file(&Png); // ignore_convention return 0; } pBuffer = (unsigned char *)mem_alloc(Png.width * Png.height * Png.bpp, 1); // ignore_convention png_get_data(&Png, pBuffer); // ignore_convention png_close_file(&Png); // ignore_convention pImg->m_Width = Png.width; // ignore_convention pImg->m_Height = Png.height; // ignore_convention if(Png.color_type == PNG_TRUECOLOR) // ignore_convention pImg->m_Format = CImageInfo::FORMAT_RGB; else if(Png.color_type == PNG_TRUECOLOR_ALPHA) // ignore_convention pImg->m_Format = CImageInfo::FORMAT_RGBA; pImg->m_pData = pBuffer; return 1; } void CGraphics_Threaded::KickCommandBuffer() { m_pBackend->RunBuffer(m_pCommandBuffer); // swap buffer m_CurrentCommandBuffer ^= 1; m_pCommandBuffer = m_apCommandBuffers[m_CurrentCommandBuffer]; m_pCommandBuffer->Reset(); } void CGraphics_Threaded::ScreenshotDirect(const char *pFilename) { // add swap command CImageInfo Image; mem_zero(&Image, sizeof(Image)); CCommandBuffer::SCommand_Screenshot Cmd; Cmd.m_pImage = &Image; m_pCommandBuffer->AddCommand(Cmd); // kick the buffer and wait for the result KickCommandBuffer(); WaitForIdle(); if(Image.m_pData) { // find filename char aWholePath[1024]; png_t Png; // ignore_convention IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE, aWholePath, sizeof(aWholePath)); if(File) io_close(File); // save png char aBuf[256]; str_format(aBuf, sizeof(aBuf), "saved screenshot to '%s'", aWholePath); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBuf); png_open_file_write(&Png, aWholePath); // ignore_convention png_set_data(&Png, Image.m_Width, Image.m_Height, 8, PNG_TRUECOLOR, (unsigned char *)Image.m_pData); // ignore_convention png_close_file(&Png); // ignore_convention mem_free(Image.m_pData); } } void CGraphics_Threaded::TextureSet(int TextureID) { dbg_assert(m_Drawing == 0, "called Graphics()->TextureSet within begin"); m_State.m_Texture = TextureID; } void CGraphics_Threaded::Clear(float r, float g, float b) { CCommandBuffer::SCommand_Clear Cmd; Cmd.m_Color.r = r; Cmd.m_Color.g = g; Cmd.m_Color.b = b; Cmd.m_Color.a = 0; m_pCommandBuffer->AddCommand(Cmd); } void CGraphics_Threaded::QuadsBegin() { dbg_assert(m_Drawing == 0, "called Graphics()->QuadsBegin twice"); m_Drawing = DRAWING_QUADS; QuadsSetSubset(0,0,1,1); QuadsSetRotation(0); SetColor(1,1,1,1); } void CGraphics_Threaded::QuadsEnd() { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsEnd without begin"); FlushVertices(); m_Drawing = 0; } void CGraphics_Threaded::QuadsSetRotation(float Angle) { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsSetRotation without begin"); m_Rotation = Angle; } void CGraphics_Threaded::SetColorVertex(const CColorVertex *pArray, int Num) { dbg_assert(m_Drawing != 0, "called Graphics()->SetColorVertex without begin"); for(int i = 0; i < Num; ++i) { m_aColor[pArray[i].m_Index].r = pArray[i].m_R; m_aColor[pArray[i].m_Index].g = pArray[i].m_G; m_aColor[pArray[i].m_Index].b = pArray[i].m_B; m_aColor[pArray[i].m_Index].a = pArray[i].m_A; } } void CGraphics_Threaded::SetColor(float r, float g, float b, float a) { dbg_assert(m_Drawing != 0, "called Graphics()->SetColor without begin"); CColorVertex Array[4] = { CColorVertex(0, r, g, b, a), CColorVertex(1, r, g, b, a), CColorVertex(2, r, g, b, a), CColorVertex(3, r, g, b, a)}; SetColorVertex(Array, 4); } void CGraphics_Threaded::QuadsSetSubset(float TlU, float TlV, float BrU, float BrV) { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsSetSubset without begin"); m_aTexture[0].u = TlU; m_aTexture[1].u = BrU; m_aTexture[0].v = TlV; m_aTexture[1].v = TlV; m_aTexture[3].u = TlU; m_aTexture[2].u = BrU; m_aTexture[3].v = BrV; m_aTexture[2].v = BrV; } void CGraphics_Threaded::QuadsSetSubsetFree( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) { m_aTexture[0].u = x0; m_aTexture[0].v = y0; m_aTexture[1].u = x1; m_aTexture[1].v = y1; m_aTexture[2].u = x2; m_aTexture[2].v = y2; m_aTexture[3].u = x3; m_aTexture[3].v = y3; } void CGraphics_Threaded::QuadsDraw(CQuadItem *pArray, int Num) { for(int i = 0; i < Num; ++i) { pArray[i].m_X -= pArray[i].m_Width/2; pArray[i].m_Y -= pArray[i].m_Height/2; } QuadsDrawTL(pArray, Num); } void CGraphics_Threaded::QuadsDrawTL(const CQuadItem *pArray, int Num) { CCommandBuffer::SPoint Center; Center.z = 0; dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsDrawTL without begin"); for(int i = 0; i < Num; ++i) { m_aVertices[m_NumVertices + 4*i].m_Pos.x = pArray[i].m_X; m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y; m_aVertices[m_NumVertices + 4*i].m_Tex = m_aTexture[0]; m_aVertices[m_NumVertices + 4*i].m_Color = m_aColor[0]; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y; m_aVertices[m_NumVertices + 4*i + 1].m_Tex = m_aTexture[1]; m_aVertices[m_NumVertices + 4*i + 1].m_Color = m_aColor[1]; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.x = pArray[i].m_X + pArray[i].m_Width; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; m_aVertices[m_NumVertices + 4*i + 2].m_Tex = m_aTexture[2]; m_aVertices[m_NumVertices + 4*i + 2].m_Color = m_aColor[2]; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.x = pArray[i].m_X; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y + pArray[i].m_Height; m_aVertices[m_NumVertices + 4*i + 3].m_Tex = m_aTexture[3]; m_aVertices[m_NumVertices + 4*i + 3].m_Color = m_aColor[3]; if(m_Rotation != 0) { Center.x = pArray[i].m_X + pArray[i].m_Width/2; Center.y = pArray[i].m_Y + pArray[i].m_Height/2; Rotate4(Center, &m_aVertices[m_NumVertices + 4*i]); } } AddVertices(4*Num); } void CGraphics_Threaded::QuadsDrawFreeform(const CFreeformItem *pArray, int Num) { dbg_assert(m_Drawing == DRAWING_QUADS, "called Graphics()->QuadsDrawFreeform without begin"); for(int i = 0; i < Num; ++i) { m_aVertices[m_NumVertices + 4*i].m_Pos.x = pArray[i].m_X0; m_aVertices[m_NumVertices + 4*i].m_Pos.y = pArray[i].m_Y0; m_aVertices[m_NumVertices + 4*i].m_Tex = m_aTexture[0]; m_aVertices[m_NumVertices + 4*i].m_Color = m_aColor[0]; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.x = pArray[i].m_X1; m_aVertices[m_NumVertices + 4*i + 1].m_Pos.y = pArray[i].m_Y1; m_aVertices[m_NumVertices + 4*i + 1].m_Tex = m_aTexture[1]; m_aVertices[m_NumVertices + 4*i + 1].m_Color = m_aColor[1]; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.x = pArray[i].m_X3; m_aVertices[m_NumVertices + 4*i + 2].m_Pos.y = pArray[i].m_Y3; m_aVertices[m_NumVertices + 4*i + 2].m_Tex = m_aTexture[3]; m_aVertices[m_NumVertices + 4*i + 2].m_Color = m_aColor[3]; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.x = pArray[i].m_X2; m_aVertices[m_NumVertices + 4*i + 3].m_Pos.y = pArray[i].m_Y2; m_aVertices[m_NumVertices + 4*i + 3].m_Tex = m_aTexture[2]; m_aVertices[m_NumVertices + 4*i + 3].m_Color = m_aColor[2]; } AddVertices(4*Num); } void CGraphics_Threaded::QuadsText(float x, float y, float Size, const char *pText) { float StartX = x; while(*pText) { char c = *pText; pText++; if(c == '\n') { x = StartX; y += Size; } else { QuadsSetSubset( (c%16)/16.0f, (c/16)/16.0f, (c%16)/16.0f+1.0f/16.0f, (c/16)/16.0f+1.0f/16.0f); CQuadItem QuadItem(x, y, Size, Size); QuadsDrawTL(&QuadItem, 1); x += Size/2; } } } int CGraphics_Threaded::IssueInit() { int Flags = 0; if(g_Config.m_GfxBorderless && g_Config.m_GfxFullscreen) { dbg_msg("gfx", "both borderless and fullscreen activated, disabling borderless"); g_Config.m_GfxBorderless = 0; } if(g_Config.m_GfxBorderless) Flags |= IGraphicsBackend::INITFLAG_BORDERLESS; else if(g_Config.m_GfxFullscreen) Flags |= IGraphicsBackend::INITFLAG_FULLSCREEN; if(g_Config.m_GfxVsync) Flags |= IGraphicsBackend::INITFLAG_VSYNC; if(g_Config.m_DbgResizable) Flags |= IGraphicsBackend::INITFLAG_RESIZABLE; return m_pBackend->Init("Teeworlds", &g_Config.m_GfxScreenWidth, &g_Config.m_GfxScreenHeight, g_Config.m_GfxFsaaSamples, Flags); } int CGraphics_Threaded::InitWindow() { if(IssueInit() == 0) return 0; // try disabling fsaa while(g_Config.m_GfxFsaaSamples) { g_Config.m_GfxFsaaSamples--; if(g_Config.m_GfxFsaaSamples) dbg_msg("gfx", "lowering FSAA to %d and trying again", g_Config.m_GfxFsaaSamples); else dbg_msg("gfx", "disabling FSAA and trying again"); if(IssueInit() == 0) return 0; } // try lowering the resolution if(g_Config.m_GfxScreenWidth != 640 || g_Config.m_GfxScreenHeight != 480) { dbg_msg("gfx", "setting resolution to 640x480 and trying again"); g_Config.m_GfxScreenWidth = 640; g_Config.m_GfxScreenHeight = 480; if(IssueInit() == 0) return 0; } dbg_msg("gfx", "out of ideas. failed to init graphics"); return -1; } int CGraphics_Threaded::Init() { // fetch pointers m_pStorage = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); // Set all z to -5.0f for(int i = 0; i < MAX_VERTICES; i++) m_aVertices[i].m_Pos.z = -5.0f; // init textures m_FirstFreeTexture = 0; for(int i = 0; i < MAX_TEXTURES-1; i++) m_aTextureIndices[i] = i+1; m_aTextureIndices[MAX_TEXTURES-1] = -1; m_pBackend = CreateGraphicsBackend(); if(InitWindow() != 0) return -1; // fetch final resolusion m_ScreenWidth = g_Config.m_GfxScreenWidth; m_ScreenHeight = g_Config.m_GfxScreenHeight; // create command buffers for(int i = 0; i < NUM_CMDBUFFERS; i++) m_apCommandBuffers[i] = new CCommandBuffer(128*1024, 2*1024*1024); m_pCommandBuffer = m_apCommandBuffers[0]; // create null texture, will get id=0 static const unsigned char aNullTextureData[] = { 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0xff,0x00,0xff, 0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff, 0x00,0x00,0xff,0xff, 0x00,0x00,0xff,0xff, 0xff,0xff,0x00,0xff, 0xff,0xff,0x00,0xff, }; m_InvalidTexture = LoadTextureRaw(4,4,CImageInfo::FORMAT_RGBA,aNullTextureData,CImageInfo::FORMAT_RGBA,TEXLOAD_NORESAMPLE); return 0; } void CGraphics_Threaded::Shutdown() { // shutdown the backend m_pBackend->Shutdown(); delete m_pBackend; m_pBackend = 0x0; // delete the command buffers for(int i = 0; i < NUM_CMDBUFFERS; i++) delete m_apCommandBuffers[i]; } void CGraphics_Threaded::Minimize() { m_pBackend->Minimize(); } void CGraphics_Threaded::Maximize() { // TODO: SDL m_pBackend->Maximize(); } int CGraphics_Threaded::WindowActive() { return m_pBackend->WindowActive(); } int CGraphics_Threaded::WindowOpen() { return m_pBackend->WindowOpen(); } void CGraphics_Threaded::TakeScreenshot(const char *pFilename) { // TODO: screenshot support char aDate[20]; str_timestamp(aDate, sizeof(aDate)); str_format(m_aScreenshotName, sizeof(m_aScreenshotName), "screenshots/%s_%s.png", pFilename?pFilename:"screenshot", aDate); m_DoScreenshot = true; } void CGraphics_Threaded::Swap() { // TODO: screenshot support if(m_DoScreenshot) { if(WindowActive()) ScreenshotDirect(m_aScreenshotName); m_DoScreenshot = false; } // add swap command CCommandBuffer::SCommand_Swap Cmd; Cmd.m_Finish = g_Config.m_GfxFinish; m_pCommandBuffer->AddCommand(Cmd); // kick the command buffer KickCommandBuffer(); } // syncronization void CGraphics_Threaded::InsertSignal(semaphore *pSemaphore) { CCommandBuffer::SCommand_Signal Cmd; Cmd.m_pSemaphore = pSemaphore; m_pCommandBuffer->AddCommand(Cmd); } bool CGraphics_Threaded::IsIdle() { return m_pBackend->IsIdle(); } void CGraphics_Threaded::WaitForIdle() { m_pBackend->WaitForIdle(); } int CGraphics_Threaded::GetVideoModes(CVideoMode *pModes, int MaxModes) { if(g_Config.m_GfxDisplayAllModes) { int Count = sizeof(g_aFakeModes)/sizeof(CVideoMode); mem_copy(pModes, g_aFakeModes, sizeof(g_aFakeModes)); if(MaxModes < Count) Count = MaxModes; return Count; } // add videomodes command CImageInfo Image; mem_zero(&Image, sizeof(Image)); int NumModes = 0; CCommandBuffer::SCommand_VideoModes Cmd; Cmd.m_pModes = pModes; Cmd.m_MaxModes = MaxModes; Cmd.m_pNumModes = &NumModes; m_pCommandBuffer->AddCommand(Cmd); // kick the buffer and wait for the result and return it KickCommandBuffer(); WaitForIdle(); return NumModes; } extern IEngineGraphics *CreateEngineGraphicsThreaded() { return new CGraphics_Threaded(); } teeworlds-0.6.2+dfsg/src/engine/client/graphics_threaded.h0000644000175000017500000002204712140200333022562 0ustar felixfelix#pragma once #include class CCommandBuffer { class CBuffer { unsigned char *m_pData; unsigned m_Size; unsigned m_Used; public: CBuffer(unsigned BufferSize) { m_Size = BufferSize; m_pData = new unsigned char[m_Size]; m_Used = 0; } ~CBuffer() { delete [] m_pData; m_pData = 0x0; m_Used = 0; m_Size = 0; } void Reset() { m_Used = 0; } void *Alloc(unsigned Requested) { if(Requested + m_Used > m_Size) return 0; void *pPtr = &m_pData[m_Used]; m_Used += Requested; return pPtr; } unsigned char *DataPtr() { return m_pData; } unsigned DataSize() { return m_Size; } unsigned DataUsed() { return m_Used; } }; public: CBuffer m_CmdBuffer; CBuffer m_DataBuffer; enum { MAX_TEXTURES=1024*4, }; enum { // commadn groups CMDGROUP_CORE = 0, // commands that everyone has to implement CMDGROUP_PLATFORM_OPENGL = 10000, // commands specific to a platform CMDGROUP_PLATFORM_SDL = 20000, // CMD_NOP = CMDGROUP_CORE, // CMD_RUNBUFFER, // syncronization CMD_SIGNAL, // texture commands CMD_TEXTURE_CREATE, CMD_TEXTURE_DESTROY, CMD_TEXTURE_UPDATE, // rendering CMD_CLEAR, CMD_RENDER, // swap CMD_SWAP, // misc CMD_SCREENSHOT, CMD_VIDEOMODES, }; enum { TEXFORMAT_INVALID = 0, TEXFORMAT_RGB, TEXFORMAT_RGBA, TEXFORMAT_ALPHA, TEXFLAG_NOMIPMAPS = 1, TEXFLAG_COMPRESSED = 2, TEXFLAG_QUALITY = 4, }; enum { // PRIMTYPE_INVALID = 0, PRIMTYPE_LINES, PRIMTYPE_QUADS, }; enum { BLEND_NONE = 0, BLEND_ALPHA, BLEND_ADDITIVE, }; enum { WRAP_REPEAT = 0, WRAP_CLAMP, }; struct SPoint { float x, y, z; }; struct STexCoord { float u, v; }; struct SColor { float r, g, b, a; }; struct SVertex { SPoint m_Pos; STexCoord m_Tex; SColor m_Color; }; struct SCommand { public: SCommand(unsigned Cmd) : m_Cmd(Cmd), m_Size(0) {} unsigned m_Cmd; unsigned m_Size; }; struct SState { int m_BlendMode; int m_WrapMode; int m_Texture; SPoint m_ScreenTL; SPoint m_ScreenBR; // clip bool m_ClipEnable; int m_ClipX; int m_ClipY; int m_ClipW; int m_ClipH; }; struct SCommand_Clear : public SCommand { SCommand_Clear() : SCommand(CMD_CLEAR) {} SColor m_Color; }; struct SCommand_Signal : public SCommand { SCommand_Signal() : SCommand(CMD_SIGNAL) {} semaphore *m_pSemaphore; }; struct SCommand_RunBuffer : public SCommand { SCommand_RunBuffer() : SCommand(CMD_RUNBUFFER) {} CCommandBuffer *m_pOtherBuffer; }; struct SCommand_Render : public SCommand { SCommand_Render() : SCommand(CMD_RENDER) {} SState m_State; unsigned m_PrimType; unsigned m_PrimCount; SVertex *m_pVertices; // you should use the command buffer data to allocate vertices for this command }; struct SCommand_Screenshot : public SCommand { SCommand_Screenshot() : SCommand(CMD_SCREENSHOT) {} CImageInfo *m_pImage; // processor will fill this out, the one who adds this command must free the data as well }; struct SCommand_VideoModes : public SCommand { SCommand_VideoModes() : SCommand(CMD_VIDEOMODES) {} CVideoMode *m_pModes; // processor will fill this in int m_MaxModes; // maximum of modes the processor can write to the m_pModes int *m_pNumModes; // processor will write to this pointer }; struct SCommand_Swap : public SCommand { SCommand_Swap() : SCommand(CMD_SWAP) {} int m_Finish; }; struct SCommand_Texture_Create : public SCommand { SCommand_Texture_Create() : SCommand(CMD_TEXTURE_CREATE) {} // texture information int m_Slot; int m_Width; int m_Height; int m_PixelSize; int m_Format; int m_StoreFormat; int m_Flags; void *m_pData; // will be freed by the command processor }; struct SCommand_Texture_Update : public SCommand { SCommand_Texture_Update() : SCommand(CMD_TEXTURE_UPDATE) {} // texture information int m_Slot; int m_X; int m_Y; int m_Width; int m_Height; int m_Format; void *m_pData; // will be freed by the command processor }; struct SCommand_Texture_Destroy : public SCommand { SCommand_Texture_Destroy() : SCommand(CMD_TEXTURE_DESTROY) {} // texture information int m_Slot; }; // CCommandBuffer(unsigned CmdBufferSize, unsigned DataBufferSize) : m_CmdBuffer(CmdBufferSize), m_DataBuffer(DataBufferSize) { } void *AllocData(unsigned WantedSize) { return m_DataBuffer.Alloc(WantedSize); } template bool AddCommand(const T &Command) { // make sure that we don't do something stupid like ->AddCommand(&Cmd); (void)static_cast(&Command); // allocate and copy the command into the buffer SCommand *pCmd = (SCommand *)m_CmdBuffer.Alloc(sizeof(Command)); if(!pCmd) return false; mem_copy(pCmd, &Command, sizeof(Command)); pCmd->m_Size = sizeof(Command); return true; } SCommand *GetCommand(unsigned *pIndex) { if(*pIndex >= m_CmdBuffer.DataUsed()) return NULL; SCommand *pCommand = (SCommand *)&m_CmdBuffer.DataPtr()[*pIndex]; *pIndex += pCommand->m_Size; return pCommand; } void Reset() { m_CmdBuffer.Reset(); m_DataBuffer.Reset(); } }; // interface for the graphics backend // all these functions are called on the main thread class IGraphicsBackend { public: enum { INITFLAG_FULLSCREEN = 1, INITFLAG_VSYNC = 2, INITFLAG_RESIZABLE = 4, INITFLAG_BORDERLESS = 8, }; virtual ~IGraphicsBackend() {} virtual int Init(const char *pName, int *Width, int *Height, int FsaaSamples, int Flags) = 0; virtual int Shutdown() = 0; virtual int MemoryUsage() const = 0; virtual void Minimize() = 0; virtual void Maximize() = 0; virtual int WindowActive() = 0; virtual int WindowOpen() = 0; virtual void RunBuffer(CCommandBuffer *pBuffer) = 0; virtual bool IsIdle() const = 0; virtual void WaitForIdle() = 0; }; class CGraphics_Threaded : public IEngineGraphics { enum { NUM_CMDBUFFERS = 2, MAX_VERTICES = 32*1024, MAX_TEXTURES = 1024*4, DRAWING_QUADS=1, DRAWING_LINES=2 }; CCommandBuffer::SState m_State; IGraphicsBackend *m_pBackend; CCommandBuffer *m_apCommandBuffers[NUM_CMDBUFFERS]; CCommandBuffer *m_pCommandBuffer; unsigned m_CurrentCommandBuffer; // class IStorage *m_pStorage; class IConsole *m_pConsole; CCommandBuffer::SVertex m_aVertices[MAX_VERTICES]; int m_NumVertices; CCommandBuffer::SColor m_aColor[4]; CCommandBuffer::STexCoord m_aTexture[4]; bool m_RenderEnable; float m_Rotation; int m_Drawing; bool m_DoScreenshot; char m_aScreenshotName[128]; int m_InvalidTexture; int m_aTextureIndices[MAX_TEXTURES]; int m_FirstFreeTexture; int m_TextureMemoryUsage; void FlushVertices(); void AddVertices(int Count); void Rotate4(const CCommandBuffer::SPoint &rCenter, CCommandBuffer::SVertex *pPoints); void KickCommandBuffer(); int IssueInit(); int InitWindow(); public: CGraphics_Threaded(); virtual void ClipEnable(int x, int y, int w, int h); virtual void ClipDisable(); virtual void BlendNone(); virtual void BlendNormal(); virtual void BlendAdditive(); virtual void WrapNormal(); virtual void WrapClamp(); virtual int MemoryUsage() const; virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY); virtual void GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY); virtual void LinesBegin(); virtual void LinesEnd(); virtual void LinesDraw(const CLineItem *pArray, int Num); virtual int UnloadTexture(int Index); virtual int LoadTextureRaw(int Width, int Height, int Format, const void *pData, int StoreFormat, int Flags); virtual int LoadTextureRawSub(int TextureID, int x, int y, int Width, int Height, int Format, const void *pData); // simple uncompressed RGBA loaders virtual int LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags); virtual int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType); void ScreenshotDirect(const char *pFilename); virtual void TextureSet(int TextureID); virtual void Clear(float r, float g, float b); virtual void QuadsBegin(); virtual void QuadsEnd(); virtual void QuadsSetRotation(float Angle); virtual void SetColorVertex(const CColorVertex *pArray, int Num); virtual void SetColor(float r, float g, float b, float a); virtual void QuadsSetSubset(float TlU, float TlV, float BrU, float BrV); virtual void QuadsSetSubsetFree( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3); virtual void QuadsDraw(CQuadItem *pArray, int Num); virtual void QuadsDrawTL(const CQuadItem *pArray, int Num); virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num); virtual void QuadsText(float x, float y, float Size, const char *pText); virtual void Minimize(); virtual void Maximize(); virtual int WindowActive(); virtual int WindowOpen(); virtual int Init(); virtual void Shutdown(); virtual void TakeScreenshot(const char *pFilename); virtual void Swap(); virtual int GetVideoModes(CVideoMode *pModes, int MaxModes); // syncronization virtual void InsertSignal(semaphore *pSemaphore); virtual bool IsIdle(); virtual void WaitForIdle(); }; extern IGraphicsBackend *CreateGraphicsBackend(); teeworlds-0.6.2+dfsg/src/engine/client/input.cpp0000644000175000017500000001330712140200333020613 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "SDL.h" #include #include #include #include #include #include "input.h" //print >>f, "int inp_key_code(const char *key_name) { int i; if (!strcmp(key_name, \"-?-\")) return -1; else for (i = 0; i < 512; i++) if (!strcmp(key_strings[i], key_name)) return i; return -1; }" // this header is protected so you don't include it from anywere #define KEYS_INCLUDE #include "keynames.h" #undef KEYS_INCLUDE void CInput::AddEvent(int Unicode, int Key, int Flags) { if(m_NumEvents != INPUT_BUFFER_SIZE) { m_aInputEvents[m_NumEvents].m_Unicode = Unicode; m_aInputEvents[m_NumEvents].m_Key = Key; m_aInputEvents[m_NumEvents].m_Flags = Flags; m_NumEvents++; } } CInput::CInput() { mem_zero(m_aInputCount, sizeof(m_aInputCount)); mem_zero(m_aInputState, sizeof(m_aInputState)); m_InputCurrent = 0; m_InputGrabbed = 0; m_InputDispatched = false; m_LastRelease = 0; m_ReleaseDelta = -1; m_NumEvents = 0; } void CInput::Init() { m_pGraphics = Kernel()->RequestInterface(); SDL_EnableUNICODE(1); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); } void CInput::MouseRelative(float *x, float *y) { int nx = 0, ny = 0; float Sens = g_Config.m_InpMousesens/100.0f; if(g_Config.m_InpGrab) SDL_GetRelativeMouseState(&nx, &ny); else { if(m_InputGrabbed) { SDL_GetMouseState(&nx,&ny); SDL_WarpMouse(Graphics()->ScreenWidth()/2,Graphics()->ScreenHeight()/2); nx -= Graphics()->ScreenWidth()/2; ny -= Graphics()->ScreenHeight()/2; } } *x = nx*Sens; *y = ny*Sens; } void CInput::MouseModeAbsolute() { SDL_ShowCursor(1); m_InputGrabbed = 0; if(g_Config.m_InpGrab) SDL_WM_GrabInput(SDL_GRAB_OFF); } void CInput::MouseModeRelative() { SDL_ShowCursor(0); m_InputGrabbed = 1; if(g_Config.m_InpGrab) SDL_WM_GrabInput(SDL_GRAB_ON); } int CInput::MouseDoubleClick() { if(m_ReleaseDelta >= 0 && m_ReleaseDelta < (time_freq() >> 2)) { m_LastRelease = 0; m_ReleaseDelta = -1; return 1; } return 0; } void CInput::ClearKeyStates() { mem_zero(m_aInputState, sizeof(m_aInputState)); mem_zero(m_aInputCount, sizeof(m_aInputCount)); } int CInput::KeyState(int Key) { return m_aInputState[m_InputCurrent][Key]; } int CInput::Update() { if(m_InputGrabbed && !Graphics()->WindowActive()) MouseModeAbsolute(); /*if(!input_grabbed && Graphics()->WindowActive()) Input()->MouseModeRelative();*/ if(m_InputDispatched) { // clear and begin count on the other one m_InputCurrent^=1; mem_zero(&m_aInputCount[m_InputCurrent], sizeof(m_aInputCount[m_InputCurrent])); mem_zero(&m_aInputState[m_InputCurrent], sizeof(m_aInputState[m_InputCurrent])); m_InputDispatched = false; } { int i; Uint8 *pState = SDL_GetKeyState(&i); if(i >= KEY_LAST) i = KEY_LAST-1; mem_copy(m_aInputState[m_InputCurrent], pState, i); } // these states must always be updated manually because they are not in the GetKeyState from SDL int i = SDL_GetMouseState(NULL, NULL); if(i&SDL_BUTTON(1)) m_aInputState[m_InputCurrent][KEY_MOUSE_1] = 1; // 1 is left if(i&SDL_BUTTON(3)) m_aInputState[m_InputCurrent][KEY_MOUSE_2] = 1; // 3 is right if(i&SDL_BUTTON(2)) m_aInputState[m_InputCurrent][KEY_MOUSE_3] = 1; // 2 is middle if(i&SDL_BUTTON(4)) m_aInputState[m_InputCurrent][KEY_MOUSE_4] = 1; if(i&SDL_BUTTON(5)) m_aInputState[m_InputCurrent][KEY_MOUSE_5] = 1; if(i&SDL_BUTTON(6)) m_aInputState[m_InputCurrent][KEY_MOUSE_6] = 1; if(i&SDL_BUTTON(7)) m_aInputState[m_InputCurrent][KEY_MOUSE_7] = 1; if(i&SDL_BUTTON(8)) m_aInputState[m_InputCurrent][KEY_MOUSE_8] = 1; { SDL_Event Event; while(SDL_PollEvent(&Event)) { int Key = -1; int Action = IInput::FLAG_PRESS; switch (Event.type) { // handle keys case SDL_KEYDOWN: // skip private use area of the BMP(contains the unicodes for keyboard function keys on MacOS) if(Event.key.keysym.unicode < 0xE000 || Event.key.keysym.unicode > 0xF8FF) // ignore_convention AddEvent(Event.key.keysym.unicode, 0, 0); // ignore_convention Key = Event.key.keysym.sym; // ignore_convention break; case SDL_KEYUP: Action = IInput::FLAG_RELEASE; Key = Event.key.keysym.sym; // ignore_convention break; // handle mouse buttons case SDL_MOUSEBUTTONUP: Action = IInput::FLAG_RELEASE; if(Event.button.button == 1) // ignore_convention { m_ReleaseDelta = time_get() - m_LastRelease; m_LastRelease = time_get(); } // fall through case SDL_MOUSEBUTTONDOWN: if(Event.button.button == SDL_BUTTON_LEFT) Key = KEY_MOUSE_1; // ignore_convention if(Event.button.button == SDL_BUTTON_RIGHT) Key = KEY_MOUSE_2; // ignore_convention if(Event.button.button == SDL_BUTTON_MIDDLE) Key = KEY_MOUSE_3; // ignore_convention if(Event.button.button == SDL_BUTTON_WHEELUP) Key = KEY_MOUSE_WHEEL_UP; // ignore_convention if(Event.button.button == SDL_BUTTON_WHEELDOWN) Key = KEY_MOUSE_WHEEL_DOWN; // ignore_convention if(Event.button.button == 6) Key = KEY_MOUSE_6; // ignore_convention if(Event.button.button == 7) Key = KEY_MOUSE_7; // ignore_convention if(Event.button.button == 8) Key = KEY_MOUSE_8; // ignore_convention break; // other messages case SDL_QUIT: return 1; } // if(Key != -1) { m_aInputCount[m_InputCurrent][Key].m_Presses++; if(Action == IInput::FLAG_PRESS) m_aInputState[m_InputCurrent][Key] = 1; AddEvent(0, Key, Action); } } } return 0; } IEngineInput *CreateEngineInput() { return new CInput; } teeworlds-0.6.2+dfsg/src/engine/client/input.h0000644000175000017500000000152712140200333020261 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CLIENT_INPUT_H #define ENGINE_CLIENT_INPUT_H class CInput : public IEngineInput { IEngineGraphics *m_pGraphics; int m_InputGrabbed; int64 m_LastRelease; int64 m_ReleaseDelta; void AddEvent(int Unicode, int Key, int Flags); IEngineGraphics *Graphics() { return m_pGraphics; } public: CInput(); virtual void Init(); virtual void MouseRelative(float *x, float *y); virtual void MouseModeAbsolute(); virtual void MouseModeRelative(); virtual int MouseDoubleClick(); void ClearKeyStates(); int KeyState(int Key); int ButtonPressed(int Button) { return m_aInputState[m_InputCurrent][Button]; } virtual int Update(); }; #endif teeworlds-0.6.2+dfsg/src/engine/client/keynames.h0000644000175000017500000001234112140200333020732 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ /* AUTO GENERATED! DO NOT EDIT MANUALLY! */ #ifndef KEYS_INCLUDE #error do not include this header! #endif #include const char g_aaKeyStrings[512][16] = { "first", "&1", "&2", "&3", "&4", "&5", "&6", "&7", "backspace", "tab", "&10", "&11", "clear", "return", "&14", "&15", "&16", "&17", "&18", "pause", "&20", "&21", "&22", "&23", "&24", "&25", "&26", "escape", "&28", "&29", "&30", "&31", "space", "exclaim", "quotedbl", "hash", "dollar", "&37", "ampersand", "quote", "leftparen", "rightparen", "asterisk", "plus", "comma", "minus", "period", "slash", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "colon", "semicolon", "less", "equals", "greater", "question", "at", "&65", "&66", "&67", "&68", "&69", "&70", "&71", "&72", "&73", "&74", "&75", "&76", "&77", "&78", "&79", "&80", "&81", "&82", "&83", "&84", "&85", "&86", "&87", "&88", "&89", "&90", "leftbracket", "backslash", "rightbracket", "caret", "underscore", "backquote", "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", "&123", "&124", "&125", "&126", "delete", "&128", "&129", "&130", "&131", "&132", "&133", "&134", "&135", "&136", "&137", "&138", "&139", "&140", "&141", "&142", "&143", "&144", "&145", "&146", "&147", "&148", "&149", "&150", "&151", "&152", "&153", "&154", "&155", "&156", "&157", "&158", "&159", "world_0", "world_1", "world_2", "world_3", "world_4", "world_5", "world_6", "world_7", "world_8", "world_9", "world_10", "world_11", "world_12", "world_13", "world_14", "world_15", "world_16", "world_17", "world_18", "world_19", "world_20", "world_21", "world_22", "world_23", "world_24", "world_25", "world_26", "world_27", "world_28", "world_29", "world_30", "world_31", "world_32", "world_33", "world_34", "world_35", "world_36", "world_37", "world_38", "world_39", "world_40", "world_41", "world_42", "world_43", "world_44", "world_45", "world_46", "world_47", "world_48", "world_49", "world_50", "world_51", "world_52", "world_53", "world_54", "world_55", "world_56", "world_57", "world_58", "world_59", "world_60", "world_61", "world_62", "world_63", "world_64", "world_65", "world_66", "world_67", "world_68", "world_69", "world_70", "world_71", "world_72", "world_73", "world_74", "world_75", "world_76", "world_77", "world_78", "world_79", "world_80", "world_81", "world_82", "world_83", "world_84", "world_85", "world_86", "world_87", "world_88", "world_89", "world_90", "world_91", "world_92", "world_93", "world_94", "world_95", "kp0", "kp1", "kp2", "kp3", "kp4", "kp5", "kp6", "kp7", "kp8", "kp9", "kp_period", "kp_divide", "kp_multiply", "kp_minus", "kp_plus", "kp_enter", "kp_equals", "up", "down", "right", "left", "insert", "home", "end", "pageup", "pagedown", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "&297", "&298", "&299", "numlock", "capslock", "scrollock", "rshift", "lshift", "rctrl", "lctrl", "ralt", "lalt", "rmeta", "lmeta", "lsuper", "rsuper", "mode", "compose", "help", "print", "sysreq", "break", "menu", "power", "euro", "undo", "mouse1", "mouse2", "mouse3", "mouse4", "mouse5", "mouse6", "mouse7", "mouse8", "mousewheelup", "mousewheeldown", "&333", "&334", "&335", "&336", "&337", "&338", "&339", "&340", "&341", "&342", "&343", "&344", "&345", "&346", "&347", "&348", "&349", "&350", "&351", "&352", "&353", "&354", "&355", "&356", "&357", "&358", "&359", "&360", "&361", "&362", "&363", "&364", "&365", "&366", "&367", "&368", "&369", "&370", "&371", "&372", "&373", "&374", "&375", "&376", "&377", "&378", "&379", "&380", "&381", "&382", "&383", "&384", "&385", "&386", "&387", "&388", "&389", "&390", "&391", "&392", "&393", "&394", "&395", "&396", "&397", "&398", "&399", "&400", "&401", "&402", "&403", "&404", "&405", "&406", "&407", "&408", "&409", "&410", "&411", "&412", "&413", "&414", "&415", "&416", "&417", "&418", "&419", "&420", "&421", "&422", "&423", "&424", "&425", "&426", "&427", "&428", "&429", "&430", "&431", "&432", "&433", "&434", "&435", "&436", "&437", "&438", "&439", "&440", "&441", "&442", "&443", "&444", "&445", "&446", "&447", "&448", "&449", "&450", "&451", "&452", "&453", "&454", "&455", "&456", "&457", "&458", "&459", "&460", "&461", "&462", "&463", "&464", "&465", "&466", "&467", "&468", "&469", "&470", "&471", "&472", "&473", "&474", "&475", "&476", "&477", "&478", "&479", "&480", "&481", "&482", "&483", "&484", "&485", "&486", "&487", "&488", "&489", "&490", "&491", "&492", "&493", "&494", "&495", "&496", "&497", "&498", "&499", "&500", "&501", "&502", "&503", "&504", "&505", "&506", "&507", "&508", "&509", "&510", "&511", }; teeworlds-0.6.2+dfsg/src/engine/client/serverbrowser.cpp0000644000175000017500000005072612140200333022374 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include // sort TODO: remove this #include #include #include #include #include #include #include #include #include #include #include #include "serverbrowser.h" class SortWrap { typedef bool (CServerBrowser::*SortFunc)(int, int) const; SortFunc m_pfnSort; CServerBrowser *m_pThis; public: SortWrap(CServerBrowser *t, SortFunc f) : m_pfnSort(f), m_pThis(t) {} bool operator()(int a, int b) { return (g_Config.m_BrSortOrder ? (m_pThis->*m_pfnSort)(b, a) : (m_pThis->*m_pfnSort)(a, b)); } }; CServerBrowser::CServerBrowser() { m_pMasterServer = 0; m_ppServerlist = 0; m_pSortedServerlist = 0; m_NumFavoriteServers = 0; mem_zero(m_aServerlistIp, sizeof(m_aServerlistIp)); m_pFirstReqServer = 0; // request list m_pLastReqServer = 0; m_NumRequests = 0; m_NeedRefresh = 0; m_NumSortedServers = 0; m_NumSortedServersCapacity = 0; m_NumServers = 0; m_NumServerCapacity = 0; m_Sorthash = 0; m_aFilterString[0] = 0; m_aFilterGametypeString[0] = 0; // the token is to keep server refresh separated from each other m_CurrentToken = 1; m_ServerlistType = 0; m_BroadcastTime = 0; } void CServerBrowser::SetBaseInfo(class CNetClient *pClient, const char *pNetVersion) { m_pNetClient = pClient; str_copy(m_aNetVersion, pNetVersion, sizeof(m_aNetVersion)); m_pMasterServer = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); m_pFriends = Kernel()->RequestInterface(); IConfig *pConfig = Kernel()->RequestInterface(); if(pConfig) pConfig->RegisterCallback(ConfigSaveCallback, this); } const CServerInfo *CServerBrowser::SortedGet(int Index) const { if(Index < 0 || Index >= m_NumSortedServers) return 0; return &m_ppServerlist[m_pSortedServerlist[Index]]->m_Info; } bool CServerBrowser::SortCompareName(int Index1, int Index2) const { CServerEntry *a = m_ppServerlist[Index1]; CServerEntry *b = m_ppServerlist[Index2]; // make sure empty entries are listed last return (a->m_GotInfo && b->m_GotInfo) || (!a->m_GotInfo && !b->m_GotInfo) ? str_comp(a->m_Info.m_aName, b->m_Info.m_aName) < 0 : a->m_GotInfo ? true : false; } bool CServerBrowser::SortCompareMap(int Index1, int Index2) const { CServerEntry *a = m_ppServerlist[Index1]; CServerEntry *b = m_ppServerlist[Index2]; return str_comp(a->m_Info.m_aMap, b->m_Info.m_aMap) < 0; } bool CServerBrowser::SortComparePing(int Index1, int Index2) const { CServerEntry *a = m_ppServerlist[Index1]; CServerEntry *b = m_ppServerlist[Index2]; return a->m_Info.m_Latency < b->m_Info.m_Latency; } bool CServerBrowser::SortCompareGametype(int Index1, int Index2) const { CServerEntry *a = m_ppServerlist[Index1]; CServerEntry *b = m_ppServerlist[Index2]; return str_comp(a->m_Info.m_aGameType, b->m_Info.m_aGameType) < 0; } bool CServerBrowser::SortCompareNumPlayers(int Index1, int Index2) const { CServerEntry *a = m_ppServerlist[Index1]; CServerEntry *b = m_ppServerlist[Index2]; return a->m_Info.m_NumPlayers < b->m_Info.m_NumPlayers; } bool CServerBrowser::SortCompareNumClients(int Index1, int Index2) const { CServerEntry *a = m_ppServerlist[Index1]; CServerEntry *b = m_ppServerlist[Index2]; return a->m_Info.m_NumClients < b->m_Info.m_NumClients; } void CServerBrowser::Filter() { int i = 0, p = 0; m_NumSortedServers = 0; // allocate the sorted list if(m_NumSortedServersCapacity < m_NumServers) { if(m_pSortedServerlist) mem_free(m_pSortedServerlist); m_NumSortedServersCapacity = m_NumServers; m_pSortedServerlist = (int *)mem_alloc(m_NumSortedServersCapacity*sizeof(int), 1); } // filter the servers for(i = 0; i < m_NumServers; i++) { int Filtered = 0; if(g_Config.m_BrFilterEmpty && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == 0) || m_ppServerlist[i]->m_Info.m_NumClients == 0)) Filtered = 1; else if(g_Config.m_BrFilterFull && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == m_ppServerlist[i]->m_Info.m_MaxPlayers) || m_ppServerlist[i]->m_Info.m_NumClients == m_ppServerlist[i]->m_Info.m_MaxClients)) Filtered = 1; else if(g_Config.m_BrFilterPw && m_ppServerlist[i]->m_Info.m_Flags&SERVER_FLAG_PASSWORD) Filtered = 1; else if(g_Config.m_BrFilterPure && (str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "DM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "TDM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "CTF") != 0)) { Filtered = 1; } else if(g_Config.m_BrFilterPureMap && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm6") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm7") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm8") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm9") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf3") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf4") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf5") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf6") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf7") == 0) ) { Filtered = 1; } else if(g_Config.m_BrFilterPing < m_ppServerlist[i]->m_Info.m_Latency) Filtered = 1; else if(g_Config.m_BrFilterCompatversion && str_comp_num(m_ppServerlist[i]->m_Info.m_aVersion, m_aNetVersion, 3) != 0) Filtered = 1; else if(g_Config.m_BrFilterServerAddress[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aAddress, g_Config.m_BrFilterServerAddress)) Filtered = 1; else if(g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && str_comp_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else if(!g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else { if(g_Config.m_BrFilterCountry) { Filtered = 1; // match against player country for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(m_ppServerlist[i]->m_Info.m_aClients[p].m_Country == g_Config.m_BrFilterCountryIndex) { Filtered = 0; break; } } } if(!Filtered && g_Config.m_BrFilterString[0] != 0) { int MatchFound = 0; m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0; // match against server name if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; } // match against players for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, g_Config.m_BrFilterString) || str_find_nocase(m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER; break; } } // match against map if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; } if(!MatchFound) Filtered = 1; } } if(Filtered == 0) { // check for friend m_ppServerlist[i]->m_Info.m_FriendState = IFriends::FRIEND_NO; for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState = m_pFriends->GetFriendState(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan); m_ppServerlist[i]->m_Info.m_FriendState = max(m_ppServerlist[i]->m_Info.m_FriendState, m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState); } if(!g_Config.m_BrFilterFriends || m_ppServerlist[i]->m_Info.m_FriendState != IFriends::FRIEND_NO) m_pSortedServerlist[m_NumSortedServers++] = i; } } } int CServerBrowser::SortHash() const { int i = g_Config.m_BrSort&0xf; i |= g_Config.m_BrFilterEmpty<<4; i |= g_Config.m_BrFilterFull<<5; i |= g_Config.m_BrFilterSpectators<<6; i |= g_Config.m_BrFilterFriends<<7; i |= g_Config.m_BrFilterPw<<8; i |= g_Config.m_BrSortOrder<<9; i |= g_Config.m_BrFilterCompatversion<<10; i |= g_Config.m_BrFilterPure<<11; i |= g_Config.m_BrFilterPureMap<<12; i |= g_Config.m_BrFilterGametypeStrict<<13; i |= g_Config.m_BrFilterCountry<<14; i |= g_Config.m_BrFilterPing<<15; return i; } void CServerBrowser::Sort() { int i; // create filtered list Filter(); // sort if(g_Config.m_BrSort == IServerBrowser::SORT_NAME) std::stable_sort(m_pSortedServerlist, m_pSortedServerlist+m_NumSortedServers, SortWrap(this, &CServerBrowser::SortCompareName)); else if(g_Config.m_BrSort == IServerBrowser::SORT_PING) std::stable_sort(m_pSortedServerlist, m_pSortedServerlist+m_NumSortedServers, SortWrap(this, &CServerBrowser::SortComparePing)); else if(g_Config.m_BrSort == IServerBrowser::SORT_MAP) std::stable_sort(m_pSortedServerlist, m_pSortedServerlist+m_NumSortedServers, SortWrap(this, &CServerBrowser::SortCompareMap)); else if(g_Config.m_BrSort == IServerBrowser::SORT_NUMPLAYERS) std::stable_sort(m_pSortedServerlist, m_pSortedServerlist+m_NumSortedServers, SortWrap(this, g_Config.m_BrFilterSpectators ? &CServerBrowser::SortCompareNumPlayers : &CServerBrowser::SortCompareNumClients)); else if(g_Config.m_BrSort == IServerBrowser::SORT_GAMETYPE) std::stable_sort(m_pSortedServerlist, m_pSortedServerlist+m_NumSortedServers, SortWrap(this, &CServerBrowser::SortCompareGametype)); // set indexes for(i = 0; i < m_NumSortedServers; i++) m_ppServerlist[m_pSortedServerlist[i]]->m_Info.m_SortedIndex = i; str_copy(m_aFilterGametypeString, g_Config.m_BrFilterGametype, sizeof(m_aFilterGametypeString)); str_copy(m_aFilterString, g_Config.m_BrFilterString, sizeof(m_aFilterString)); m_Sorthash = SortHash(); } void CServerBrowser::RemoveRequest(CServerEntry *pEntry) { if(pEntry->m_pPrevReq || pEntry->m_pNextReq || m_pFirstReqServer == pEntry) { if(pEntry->m_pPrevReq) pEntry->m_pPrevReq->m_pNextReq = pEntry->m_pNextReq; else m_pFirstReqServer = pEntry->m_pNextReq; if(pEntry->m_pNextReq) pEntry->m_pNextReq->m_pPrevReq = pEntry->m_pPrevReq; else m_pLastReqServer = pEntry->m_pPrevReq; pEntry->m_pPrevReq = 0; pEntry->m_pNextReq = 0; m_NumRequests--; } } CServerBrowser::CServerEntry *CServerBrowser::Find(const NETADDR &Addr) { CServerEntry *pEntry = m_aServerlistIp[Addr.ip[0]]; for(; pEntry; pEntry = pEntry->m_pNextIp) { if(net_addr_comp(&pEntry->m_Addr, &Addr) == 0) return pEntry; } return (CServerEntry*)0; } void CServerBrowser::QueueRequest(CServerEntry *pEntry) { // add it to the list of servers that we should request info from pEntry->m_pPrevReq = m_pLastReqServer; if(m_pLastReqServer) m_pLastReqServer->m_pNextReq = pEntry; else m_pFirstReqServer = pEntry; m_pLastReqServer = pEntry; m_NumRequests++; } void CServerBrowser::SetInfo(CServerEntry *pEntry, const CServerInfo &Info) { int Fav = pEntry->m_Info.m_Favorite; pEntry->m_Info = Info; pEntry->m_Info.m_Favorite = Fav; pEntry->m_Info.m_NetAddr = pEntry->m_Addr; // all these are just for nice compability if(pEntry->m_Info.m_aGameType[0] == '0' && pEntry->m_Info.m_aGameType[1] == 0) str_copy(pEntry->m_Info.m_aGameType, "DM", sizeof(pEntry->m_Info.m_aGameType)); else if(pEntry->m_Info.m_aGameType[0] == '1' && pEntry->m_Info.m_aGameType[1] == 0) str_copy(pEntry->m_Info.m_aGameType, "TDM", sizeof(pEntry->m_Info.m_aGameType)); else if(pEntry->m_Info.m_aGameType[0] == '2' && pEntry->m_Info.m_aGameType[1] == 0) str_copy(pEntry->m_Info.m_aGameType, "CTF", sizeof(pEntry->m_Info.m_aGameType)); /*if(!request) { pEntry->m_Info.latency = (time_get()-pEntry->request_time)*1000/time_freq(); RemoveRequest(pEntry); }*/ pEntry->m_GotInfo = 1; } CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr) { int Hash = Addr.ip[0]; CServerEntry *pEntry = 0; int i; // create new pEntry pEntry = (CServerEntry *)m_ServerlistHeap.Allocate(sizeof(CServerEntry)); mem_zero(pEntry, sizeof(CServerEntry)); // set the info pEntry->m_Addr = Addr; pEntry->m_Info.m_NetAddr = Addr; pEntry->m_Info.m_Latency = 999; net_addr_str(&Addr, pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aAddress), true); str_copy(pEntry->m_Info.m_aName, pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aName)); // check if it's a favorite for(i = 0; i < m_NumFavoriteServers; i++) { if(net_addr_comp(&Addr, &m_aFavoriteServers[i]) == 0) pEntry->m_Info.m_Favorite = 1; } // add to the hash list pEntry->m_pNextIp = m_aServerlistIp[Hash]; m_aServerlistIp[Hash] = pEntry; if(m_NumServers == m_NumServerCapacity) { CServerEntry **ppNewlist; m_NumServerCapacity += 100; ppNewlist = (CServerEntry **)mem_alloc(m_NumServerCapacity*sizeof(CServerEntry*), 1); mem_copy(ppNewlist, m_ppServerlist, m_NumServers*sizeof(CServerEntry*)); mem_free(m_ppServerlist); m_ppServerlist = ppNewlist; } // add to list m_ppServerlist[m_NumServers] = pEntry; pEntry->m_Info.m_ServerIndex = m_NumServers; m_NumServers++; return pEntry; } void CServerBrowser::Set(const NETADDR &Addr, int Type, int Token, const CServerInfo *pInfo) { CServerEntry *pEntry = 0; if(Type == IServerBrowser::SET_MASTER_ADD) { if(m_ServerlistType != IServerBrowser::TYPE_INTERNET) return; if(!Find(Addr)) { pEntry = Add(Addr); QueueRequest(pEntry); } } else if(Type == IServerBrowser::SET_FAV_ADD) { if(m_ServerlistType != IServerBrowser::TYPE_FAVORITES) return; if(!Find(Addr)) { pEntry = Add(Addr); QueueRequest(pEntry); } } else if(Type == IServerBrowser::SET_TOKEN) { if(Token != m_CurrentToken) return; pEntry = Find(Addr); if(!pEntry) pEntry = Add(Addr); if(pEntry) { SetInfo(pEntry, *pInfo); if(m_ServerlistType == IServerBrowser::TYPE_LAN) pEntry->m_Info.m_Latency = min(static_cast((time_get()-m_BroadcastTime)*1000/time_freq()), 999); else pEntry->m_Info.m_Latency = min(static_cast((time_get()-pEntry->m_RequestTime)*1000/time_freq()), 999); RemoveRequest(pEntry); } } Sort(); } void CServerBrowser::Refresh(int Type) { // clear out everything m_ServerlistHeap.Reset(); m_NumServers = 0; m_NumSortedServers = 0; mem_zero(m_aServerlistIp, sizeof(m_aServerlistIp)); m_pFirstReqServer = 0; m_pLastReqServer = 0; m_NumRequests = 0; // next token m_CurrentToken = (m_CurrentToken+1)&0xff; // m_ServerlistType = Type; if(Type == IServerBrowser::TYPE_LAN) { unsigned char Buffer[sizeof(SERVERBROWSE_GETINFO)+1]; CNetChunk Packet; int i; mem_copy(Buffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentToken; /* do the broadcast version */ Packet.m_ClientID = -1; mem_zero(&Packet, sizeof(Packet)); Packet.m_Address.type = m_pNetClient->NetType()|NETTYPE_LINK_BROADCAST; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = sizeof(Buffer); Packet.m_pData = Buffer; m_BroadcastTime = time_get(); for(i = 8303; i <= 8310; i++) { Packet.m_Address.port = i; m_pNetClient->Send(&Packet); } if(g_Config.m_Debug) m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", "broadcasting for servers"); } else if(Type == IServerBrowser::TYPE_INTERNET) m_NeedRefresh = 1; else if(Type == IServerBrowser::TYPE_FAVORITES) { for(int i = 0; i < m_NumFavoriteServers; i++) Set(m_aFavoriteServers[i], IServerBrowser::SET_FAV_ADD, -1, 0); } } void CServerBrowser::RequestImpl(const NETADDR &Addr, CServerEntry *pEntry) const { unsigned char Buffer[sizeof(SERVERBROWSE_GETINFO)+1]; CNetChunk Packet; if(g_Config.m_Debug) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr), true); char aBuf[256]; str_format(aBuf, sizeof(aBuf),"requesting server info from %s", aAddrStr); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", aBuf); } mem_copy(Buffer, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); Buffer[sizeof(SERVERBROWSE_GETINFO)] = m_CurrentToken; Packet.m_ClientID = -1; Packet.m_Address = Addr; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = sizeof(Buffer); Packet.m_pData = Buffer; m_pNetClient->Send(&Packet); if(pEntry) pEntry->m_RequestTime = time_get(); } void CServerBrowser::Request(const NETADDR &Addr) const { RequestImpl(Addr, 0); } void CServerBrowser::Update(bool ForceResort) { int64 Timeout = time_freq(); int64 Now = time_get(); int Count; CServerEntry *pEntry, *pNext; // do server list requests if(m_NeedRefresh && !m_pMasterServer->IsRefreshing()) { NETADDR Addr; CNetChunk Packet; int i; m_NeedRefresh = 0; mem_zero(&Packet, sizeof(Packet)); Packet.m_ClientID = -1; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = sizeof(SERVERBROWSE_GETLIST); Packet.m_pData = SERVERBROWSE_GETLIST; for(i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) { if(!m_pMasterServer->IsValid(i)) continue; Addr = m_pMasterServer->GetAddr(i); Packet.m_Address = Addr; m_pNetClient->Send(&Packet); } if(g_Config.m_Debug) m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", "requesting server list"); } // do timeouts pEntry = m_pFirstReqServer; while(1) { if(!pEntry) // no more entries break; pNext = pEntry->m_pNextReq; if(pEntry->m_RequestTime && pEntry->m_RequestTime+Timeout < Now) { // timeout RemoveRequest(pEntry); } pEntry = pNext; } // do timeouts pEntry = m_pFirstReqServer; Count = 0; while(1) { if(!pEntry) // no more entries break; // no more then 10 concurrent requests if(Count == g_Config.m_BrMaxRequests) break; if(pEntry->m_RequestTime == 0) RequestImpl(pEntry->m_Addr, pEntry); Count++; pEntry = pEntry->m_pNextReq; } // check if we need to resort if(m_Sorthash != SortHash() || ForceResort) Sort(); } bool CServerBrowser::IsFavorite(const NETADDR &Addr) const { // search for the address int i; for(i = 0; i < m_NumFavoriteServers; i++) { if(net_addr_comp(&Addr, &m_aFavoriteServers[i]) == 0) return true; } return false; } void CServerBrowser::AddFavorite(const NETADDR &Addr) { CServerEntry *pEntry; if(m_NumFavoriteServers == MAX_FAVORITES) return; // make sure that we don't already have the server in our list for(int i = 0; i < m_NumFavoriteServers; i++) { if(net_addr_comp(&Addr, &m_aFavoriteServers[i]) == 0) return; } // add the server to the list m_aFavoriteServers[m_NumFavoriteServers++] = Addr; pEntry = Find(Addr); if(pEntry) pEntry->m_Info.m_Favorite = 1; if(g_Config.m_Debug) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr), true); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "added fav, %s", aAddrStr); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", aBuf); } } void CServerBrowser::RemoveFavorite(const NETADDR &Addr) { int i; CServerEntry *pEntry; for(i = 0; i < m_NumFavoriteServers; i++) { if(net_addr_comp(&Addr, &m_aFavoriteServers[i]) == 0) { mem_move(&m_aFavoriteServers[i], &m_aFavoriteServers[i+1], sizeof(NETADDR)*(m_NumFavoriteServers-(i+1))); m_NumFavoriteServers--; pEntry = Find(Addr); if(pEntry) pEntry->m_Info.m_Favorite = 0; return; } } } bool CServerBrowser::IsRefreshing() const { return m_pFirstReqServer != 0; } bool CServerBrowser::IsRefreshingMasters() const { return m_pMasterServer->IsRefreshing(); } int CServerBrowser::LoadingProgression() const { if(m_NumServers == 0) return 0; int Servers = m_NumServers; int Loaded = m_NumServers-m_NumRequests; return 100.0f * Loaded/Servers; } void CServerBrowser::ConfigSaveCallback(IConfig *pConfig, void *pUserData) { CServerBrowser *pSelf = (CServerBrowser *)pUserData; char aAddrStr[128]; char aBuffer[256]; for(int i = 0; i < pSelf->m_NumFavoriteServers; i++) { net_addr_str(&pSelf->m_aFavoriteServers[i], aAddrStr, sizeof(aAddrStr), true); str_format(aBuffer, sizeof(aBuffer), "add_favorite %s", aAddrStr); pConfig->WriteLine(aBuffer); } } teeworlds-0.6.2+dfsg/src/engine/client/serverbrowser.h0000644000175000017500000000555112140200333022035 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CLIENT_SERVERBROWSER_H #define ENGINE_CLIENT_SERVERBROWSER_H #include class CServerBrowser : public IServerBrowser { public: class CServerEntry { public: NETADDR m_Addr; int64 m_RequestTime; int m_GotInfo; CServerInfo m_Info; CServerEntry *m_pNextIp; // ip hashed list CServerEntry *m_pPrevReq; // request list CServerEntry *m_pNextReq; }; enum { MAX_FAVORITES=256 }; CServerBrowser(); // interface functions void Refresh(int Type); bool IsRefreshing() const; bool IsRefreshingMasters() const; int LoadingProgression() const; int NumServers() const { return m_NumServers; } int NumSortedServers() const { return m_NumSortedServers; } const CServerInfo *SortedGet(int Index) const; bool IsFavorite(const NETADDR &Addr) const; void AddFavorite(const NETADDR &Addr); void RemoveFavorite(const NETADDR &Addr); // void Update(bool ForceResort); void Set(const NETADDR &Addr, int Type, int Token, const CServerInfo *pInfo); void Request(const NETADDR &Addr) const; void SetBaseInfo(class CNetClient *pClient, const char *pNetVersion); private: CNetClient *m_pNetClient; IMasterServer *m_pMasterServer; class IConsole *m_pConsole; class IFriends *m_pFriends; char m_aNetVersion[128]; CHeap m_ServerlistHeap; CServerEntry **m_ppServerlist; int *m_pSortedServerlist; NETADDR m_aFavoriteServers[MAX_FAVORITES]; int m_NumFavoriteServers; CServerEntry *m_aServerlistIp[256]; // ip hash list CServerEntry *m_pFirstReqServer; // request list CServerEntry *m_pLastReqServer; int m_NumRequests; int m_NeedRefresh; int m_NumSortedServers; int m_NumSortedServersCapacity; int m_NumServers; int m_NumServerCapacity; int m_Sorthash; char m_aFilterString[64]; char m_aFilterGametypeString[128]; // the token is to keep server refresh separated from each other int m_CurrentToken; int m_ServerlistType; int64 m_BroadcastTime; // sorting criterions bool SortCompareName(int Index1, int Index2) const; bool SortCompareMap(int Index1, int Index2) const; bool SortComparePing(int Index1, int Index2) const; bool SortCompareGametype(int Index1, int Index2) const; bool SortCompareNumPlayers(int Index1, int Index2) const; bool SortCompareNumClients(int Index1, int Index2) const; // void Filter(); void Sort(); int SortHash() const; CServerEntry *Find(const NETADDR &Addr); CServerEntry *Add(const NETADDR &Addr); void RemoveRequest(CServerEntry *pEntry); void QueueRequest(CServerEntry *pEntry); void RequestImpl(const NETADDR &Addr, CServerEntry *pEntry) const; void SetInfo(CServerEntry *pEntry, const CServerInfo &Info); static void ConfigSaveCallback(IConfig *pConfig, void *pUserData); }; #endif teeworlds-0.6.2+dfsg/src/engine/client/sound.cpp0000644000175000017500000002635412140200333020612 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include "SDL.h" #include "sound.h" extern "C" { // wavpack #include } #include enum { NUM_SAMPLES = 512, NUM_VOICES = 64, NUM_CHANNELS = 16, }; struct CSample { short *m_pData; int m_NumFrames; int m_Rate; int m_Channels; int m_LoopStart; int m_LoopEnd; int m_PausedAt; }; struct CChannel { int m_Vol; int m_Pan; } ; struct CVoice { CSample *m_pSample; CChannel *m_pChannel; int m_Tick; int m_Vol; // 0 - 255 int m_Flags; int m_X, m_Y; } ; static CSample m_aSamples[NUM_SAMPLES] = { {0} }; static CVoice m_aVoices[NUM_VOICES] = { {0} }; static CChannel m_aChannels[NUM_CHANNELS] = { {255, 0} }; static LOCK m_SoundLock = 0; static int m_CenterX = 0; static int m_CenterY = 0; static int m_MixingRate = 48000; static volatile int m_SoundVolume = 100; static int m_NextVoice = 0; static int *m_pMixBuffer = 0; // buffer only used by the thread callback function static unsigned m_MaxFrames = 0; // TODO: there should be a faster way todo this static short Int2Short(int i) { if(i > 0x7fff) return 0x7fff; else if(i < -0x7fff) return -0x7fff; return i; } static int IntAbs(int i) { if(i<0) return -i; return i; } static void Mix(short *pFinalOut, unsigned Frames) { int MasterVol; mem_zero(m_pMixBuffer, m_MaxFrames*2*sizeof(int)); Frames = min(Frames, m_MaxFrames); // aquire lock while we are mixing lock_wait(m_SoundLock); MasterVol = m_SoundVolume; for(unsigned i = 0; i < NUM_VOICES; i++) { if(m_aVoices[i].m_pSample) { // mix voice CVoice *v = &m_aVoices[i]; int *pOut = m_pMixBuffer; int Step = v->m_pSample->m_Channels; // setup input sources short *pInL = &v->m_pSample->m_pData[v->m_Tick*Step]; short *pInR = &v->m_pSample->m_pData[v->m_Tick*Step+1]; unsigned End = v->m_pSample->m_NumFrames-v->m_Tick; int Rvol = v->m_pChannel->m_Vol; int Lvol = v->m_pChannel->m_Vol; // make sure that we don't go outside the sound data if(Frames < End) End = Frames; // check if we have a mono sound if(v->m_pSample->m_Channels == 1) pInR = pInL; // volume calculation if(v->m_Flags&ISound::FLAG_POS && v->m_pChannel->m_Pan) { // TODO: we should respect the channel panning value const int Range = 1500; // magic value, remove int dx = v->m_X - m_CenterX; int dy = v->m_Y - m_CenterY; int Dist = (int)sqrtf((float)dx*dx+dy*dy); // float here. nasty int p = IntAbs(dx); if(Dist >= 0 && Dist < Range) { // panning if(dx > 0) Lvol = ((Range-p)*Lvol)/Range; else Rvol = ((Range-p)*Rvol)/Range; // falloff Lvol = (Lvol*(Range-Dist))/Range; Rvol = (Rvol*(Range-Dist))/Range; } else { Lvol = 0; Rvol = 0; } } // process all frames for(unsigned s = 0; s < End; s++) { *pOut++ += (*pInL)*Lvol; *pOut++ += (*pInR)*Rvol; pInL += Step; pInR += Step; v->m_Tick++; } // free voice if not used any more if(v->m_Tick == v->m_pSample->m_NumFrames) { if(v->m_Flags&ISound::FLAG_LOOP) v->m_Tick = 0; else v->m_pSample = 0; } } } // release the lock lock_release(m_SoundLock); { // clamp accumulated values // TODO: this seams slow for(unsigned i = 0; i < Frames; i++) { int j = i<<1; int vl = ((m_pMixBuffer[j]*MasterVol)/101)>>8; int vr = ((m_pMixBuffer[j+1]*MasterVol)/101)>>8; pFinalOut[j] = Int2Short(vl); pFinalOut[j+1] = Int2Short(vr); } } #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(pFinalOut, sizeof(short), Frames * 2); #endif } static void SdlCallback(void *pUnused, Uint8 *pStream, int Len) { (void)pUnused; Mix((short *)pStream, Len/2/2); } int CSound::Init() { m_SoundEnabled = 0; m_pGraphics = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); SDL_AudioSpec Format; m_SoundLock = lock_create(); if(!g_Config.m_SndEnable) return 0; if(SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { dbg_msg("gfx", "unable to init SDL audio: %s", SDL_GetError()); return -1; } m_MixingRate = g_Config.m_SndRate; // Set 16-bit stereo audio at 22Khz Format.freq = g_Config.m_SndRate; // ignore_convention Format.format = AUDIO_S16; // ignore_convention Format.channels = 2; // ignore_convention Format.samples = g_Config.m_SndBufferSize; // ignore_convention Format.callback = SdlCallback; // ignore_convention Format.userdata = NULL; // ignore_convention // Open the audio device and start playing sound! if(SDL_OpenAudio(&Format, NULL) < 0) { dbg_msg("client/sound", "unable to open audio: %s", SDL_GetError()); return -1; } else dbg_msg("client/sound", "sound init successful"); m_MaxFrames = g_Config.m_SndBufferSize*2; m_pMixBuffer = (int *)mem_alloc(m_MaxFrames*2*sizeof(int), 1); SDL_PauseAudio(0); m_SoundEnabled = 1; Update(); // update the volume return 0; } int CSound::Update() { // update volume int WantedVolume = g_Config.m_SndVolume; if(!m_pGraphics->WindowActive() && g_Config.m_SndNonactiveMute) WantedVolume = 0; if(WantedVolume != m_SoundVolume) { lock_wait(m_SoundLock); m_SoundVolume = WantedVolume; lock_release(m_SoundLock); } return 0; } int CSound::Shutdown() { SDL_CloseAudio(); SDL_QuitSubSystem(SDL_INIT_AUDIO); lock_destroy(m_SoundLock); if(m_pMixBuffer) { mem_free(m_pMixBuffer); m_pMixBuffer = 0; } return 0; } int CSound::AllocID() { // TODO: linear search, get rid of it for(unsigned SampleID = 0; SampleID < NUM_SAMPLES; SampleID++) { if(m_aSamples[SampleID].m_pData == 0x0) return SampleID; } return -1; } void CSound::RateConvert(int SampleID) { CSample *pSample = &m_aSamples[SampleID]; int NumFrames = 0; short *pNewData = 0; // make sure that we need to convert this sound if(!pSample->m_pData || pSample->m_Rate == m_MixingRate) return; // allocate new data NumFrames = (int)((pSample->m_NumFrames/(float)pSample->m_Rate)*m_MixingRate); pNewData = (short *)mem_alloc(NumFrames*pSample->m_Channels*sizeof(short), 1); for(int i = 0; i < NumFrames; i++) { // resample TODO: this should be done better, like linear atleast float a = i/(float)NumFrames; int f = (int)(a*pSample->m_NumFrames); if(f >= pSample->m_NumFrames) f = pSample->m_NumFrames-1; // set new data if(pSample->m_Channels == 1) pNewData[i] = pSample->m_pData[f]; else if(pSample->m_Channels == 2) { pNewData[i*2] = pSample->m_pData[f*2]; pNewData[i*2+1] = pSample->m_pData[f*2+1]; } } // free old data and apply new mem_free(pSample->m_pData); pSample->m_pData = pNewData; pSample->m_NumFrames = NumFrames; } int CSound::ReadData(void *pBuffer, int Size) { return io_read(ms_File, pBuffer, Size); } int CSound::LoadWV(const char *pFilename) { CSample *pSample; int SampleID = -1; char aError[100]; WavpackContext *pContext; // don't waste memory on sound when we are stress testing if(g_Config.m_DbgStress) return -1; // no need to load sound when we are running with no sound if(!m_SoundEnabled) return 1; if(!m_pStorage) return -1; ms_File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL); if(!ms_File) { dbg_msg("sound/wv", "failed to open file. filename='%s'", pFilename); return -1; } SampleID = AllocID(); if(SampleID < 0) return -1; pSample = &m_aSamples[SampleID]; pContext = WavpackOpenFileInput(ReadData, aError); if (pContext) { int m_aSamples = WavpackGetNumSamples(pContext); int BitsPerSample = WavpackGetBitsPerSample(pContext); unsigned int SampleRate = WavpackGetSampleRate(pContext); int m_aChannels = WavpackGetNumChannels(pContext); int *pData; int *pSrc; short *pDst; int i; pSample->m_Channels = m_aChannels; pSample->m_Rate = SampleRate; if(pSample->m_Channels > 2) { dbg_msg("sound/wv", "file is not mono or stereo. filename='%s'", pFilename); return -1; } /* if(snd->rate != 44100) { dbg_msg("sound/wv", "file is %d Hz, not 44100 Hz. filename='%s'", snd->rate, filename); return -1; }*/ if(BitsPerSample != 16) { dbg_msg("sound/wv", "bps is %d, not 16, filname='%s'", BitsPerSample, pFilename); return -1; } pData = (int *)mem_alloc(4*m_aSamples*m_aChannels, 1); WavpackUnpackSamples(pContext, pData, m_aSamples); // TODO: check return value pSrc = pData; pSample->m_pData = (short *)mem_alloc(2*m_aSamples*m_aChannels, 1); pDst = pSample->m_pData; for (i = 0; i < m_aSamples*m_aChannels; i++) *pDst++ = (short)*pSrc++; mem_free(pData); pSample->m_NumFrames = m_aSamples; pSample->m_LoopStart = -1; pSample->m_LoopEnd = -1; pSample->m_PausedAt = 0; } else { dbg_msg("sound/wv", "failed to open %s: %s", pFilename, aError); } io_close(ms_File); ms_File = NULL; if(g_Config.m_Debug) dbg_msg("sound/wv", "loaded %s", pFilename); RateConvert(SampleID); return SampleID; } void CSound::SetListenerPos(float x, float y) { m_CenterX = (int)x; m_CenterY = (int)y; } void CSound::SetChannel(int ChannelID, float Vol, float Pan) { m_aChannels[ChannelID].m_Vol = (int)(Vol*255.0f); m_aChannels[ChannelID].m_Pan = (int)(Pan*255.0f); // TODO: this is only on and off right now } int CSound::Play(int ChannelID, int SampleID, int Flags, float x, float y) { int VoiceID = -1; int i; lock_wait(m_SoundLock); // search for voice for(i = 0; i < NUM_VOICES; i++) { int id = (m_NextVoice + i) % NUM_VOICES; if(!m_aVoices[id].m_pSample) { VoiceID = id; m_NextVoice = id+1; break; } } // voice found, use it if(VoiceID != -1) { m_aVoices[VoiceID].m_pSample = &m_aSamples[SampleID]; m_aVoices[VoiceID].m_pChannel = &m_aChannels[ChannelID]; if(Flags & FLAG_LOOP) m_aVoices[VoiceID].m_Tick = m_aSamples[SampleID].m_PausedAt; else m_aVoices[VoiceID].m_Tick = 0; m_aVoices[VoiceID].m_Vol = 255; m_aVoices[VoiceID].m_Flags = Flags; m_aVoices[VoiceID].m_X = (int)x; m_aVoices[VoiceID].m_Y = (int)y; } lock_release(m_SoundLock); return VoiceID; } int CSound::PlayAt(int ChannelID, int SampleID, int Flags, float x, float y) { return Play(ChannelID, SampleID, Flags|ISound::FLAG_POS, x, y); } int CSound::Play(int ChannelID, int SampleID, int Flags) { return Play(ChannelID, SampleID, Flags, 0, 0); } void CSound::Stop(int SampleID) { // TODO: a nice fade out lock_wait(m_SoundLock); CSample *pSample = &m_aSamples[SampleID]; for(int i = 0; i < NUM_VOICES; i++) { if(m_aVoices[i].m_pSample == pSample) { if(m_aVoices[i].m_Flags & FLAG_LOOP) m_aVoices[i].m_pSample->m_PausedAt = m_aVoices[i].m_Tick; else m_aVoices[i].m_pSample->m_PausedAt = 0; m_aVoices[i].m_pSample = 0; } } lock_release(m_SoundLock); } void CSound::StopAll() { // TODO: a nice fade out lock_wait(m_SoundLock); for(int i = 0; i < NUM_VOICES; i++) { if(m_aVoices[i].m_pSample) { if(m_aVoices[i].m_Flags & FLAG_LOOP) m_aVoices[i].m_pSample->m_PausedAt = m_aVoices[i].m_Tick; else m_aVoices[i].m_pSample->m_PausedAt = 0; } m_aVoices[i].m_pSample = 0; } lock_release(m_SoundLock); } IOHANDLE CSound::ms_File = 0; IEngineSound *CreateEngineSound() { return new CSound; } teeworlds-0.6.2+dfsg/src/engine/client/sound.h0000644000175000017500000000214512140200333020247 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CLIENT_SOUND_H #define ENGINE_CLIENT_SOUND_H #include class CSound : public IEngineSound { int m_SoundEnabled; public: IEngineGraphics *m_pGraphics; IStorage *m_pStorage; virtual int Init(); int Update(); int Shutdown(); int AllocID(); static void RateConvert(int SampleID); // TODO: Refactor: clean this mess up static IOHANDLE ms_File; static int ReadData(void *pBuffer, int Size); virtual bool IsSoundEnabled() { return m_SoundEnabled != 0; } virtual int LoadWV(const char *pFilename); virtual void SetListenerPos(float x, float y); virtual void SetChannel(int ChannelID, float Vol, float Pan); int Play(int ChannelID, int SampleID, int Flags, float x, float y); virtual int PlayAt(int ChannelID, int SampleID, int Flags, float x, float y); virtual int Play(int ChannelID, int SampleID, int Flags); virtual void Stop(int SampleID); virtual void StopAll(); }; #endif teeworlds-0.6.2+dfsg/src/engine/client/text.cpp0000644000175000017500000004574612140200333020454 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #ifdef CONF_FAMILY_WINDOWS #include #endif // ft2 texture #include #include FT_FREETYPE_H // TODO: Refactor: clean this up enum { MAX_CHARACTERS = 64, }; static int aFontSizes[] = {8,9,10,11,12,13,14,15,16,17,18,19,20,36,64}; #define NUM_FONT_SIZES (sizeof(aFontSizes)/sizeof(int)) struct CFontChar { int m_ID; // these values are scaled to the pFont size // width * font_size == real_size float m_Width; float m_Height; float m_OffsetX; float m_OffsetY; float m_AdvanceX; float m_aUvs[4]; int64 m_TouchTime; }; struct CFontSizeData { int m_FontSize; FT_Face *m_pFace; int m_aTextures[2]; int m_TextureWidth; int m_TextureHeight; int m_NumXChars; int m_NumYChars; int m_CharMaxWidth; int m_CharMaxHeight; CFontChar m_aCharacters[MAX_CHARACTERS*MAX_CHARACTERS]; int m_CurrentCharacter; }; class CFont { public: char m_aFilename[512]; FT_Face m_FtFace; CFontSizeData m_aSizes[NUM_FONT_SIZES]; }; class CTextRender : public IEngineTextRender { IGraphics *m_pGraphics; IGraphics *Graphics() { return m_pGraphics; } int WordLength(const char *pText) { int s = 1; while(1) { if(*pText == 0) return s-1; if(*pText == '\n' || *pText == '\t' || *pText == ' ') return s; pText++; s++; } } float m_TextR; float m_TextG; float m_TextB; float m_TextA; float m_TextOutlineR; float m_TextOutlineG; float m_TextOutlineB; float m_TextOutlineA; //int m_FontTextureFormat; CFont *m_pDefaultFont; FT_Library m_FTLibrary; int GetFontSizeIndex(int Pixelsize) { for(unsigned i = 0; i < NUM_FONT_SIZES; i++) { if(aFontSizes[i] >= Pixelsize) return i; } return NUM_FONT_SIZES-1; } void Grow(unsigned char *pIn, unsigned char *pOut, int w, int h) { for(int y = 0; y < h; y++) for(int x = 0; x < w; x++) { int c = pIn[y*w+x]; for(int sy = -1; sy <= 1; sy++) for(int sx = -1; sx <= 1; sx++) { int GetX = x+sx; int GetY = y+sy; if (GetX >= 0 && GetY >= 0 && GetX < w && GetY < h) { int Index = GetY*w+GetX; if(pIn[Index] > c) c = pIn[Index]; } } pOut[y*w+x] = c; } } void InitTexture(CFontSizeData *pSizeData, int CharWidth, int CharHeight, int Xchars, int Ychars) { static int FontMemoryUsage = 0; int Width = CharWidth*Xchars; int Height = CharHeight*Ychars; void *pMem = mem_alloc(Width*Height, 1); mem_zero(pMem, Width*Height); for(int i = 0; i < 2; i++) { if(pSizeData->m_aTextures[i] != 0) { Graphics()->UnloadTexture(pSizeData->m_aTextures[i]); FontMemoryUsage -= pSizeData->m_TextureWidth*pSizeData->m_TextureHeight; pSizeData->m_aTextures[i] = 0; } pSizeData->m_aTextures[i] = Graphics()->LoadTextureRaw(Width, Height, CImageInfo::FORMAT_ALPHA, pMem, CImageInfo::FORMAT_ALPHA, IGraphics::TEXLOAD_NOMIPMAPS); FontMemoryUsage += Width*Height; } pSizeData->m_NumXChars = Xchars; pSizeData->m_NumYChars = Ychars; pSizeData->m_TextureWidth = Width; pSizeData->m_TextureHeight = Height; pSizeData->m_CurrentCharacter = 0; dbg_msg("", "pFont memory usage: %d", FontMemoryUsage); mem_free(pMem); } int AdjustOutlineThicknessToFontSize(int OutlineThickness, int FontSize) { if(FontSize > 36) OutlineThickness *= 4; else if(FontSize >= 18) OutlineThickness *= 2; return OutlineThickness; } void IncreaseTextureSize(CFontSizeData *pSizeData) { if(pSizeData->m_TextureWidth < pSizeData->m_TextureHeight) pSizeData->m_NumXChars <<= 1; else pSizeData->m_NumYChars <<= 1; InitTexture(pSizeData, pSizeData->m_CharMaxWidth, pSizeData->m_CharMaxHeight, pSizeData->m_NumXChars, pSizeData->m_NumYChars); } // TODO: Refactor: move this into a pFont class void InitIndex(CFont *pFont, int Index) { CFontSizeData *pSizeData = &pFont->m_aSizes[Index]; pSizeData->m_FontSize = aFontSizes[Index]; FT_Set_Pixel_Sizes(pFont->m_FtFace, 0, pSizeData->m_FontSize); int OutlineThickness = AdjustOutlineThicknessToFontSize(1, pSizeData->m_FontSize); { unsigned GlyphIndex; int MaxH = 0; int MaxW = 0; int Charcode = FT_Get_First_Char(pFont->m_FtFace, &GlyphIndex); while(GlyphIndex != 0) { // do stuff FT_Load_Glyph(pFont->m_FtFace, GlyphIndex, FT_LOAD_DEFAULT); if(pFont->m_FtFace->glyph->metrics.width > MaxW) MaxW = pFont->m_FtFace->glyph->metrics.width; // ignore_convention if(pFont->m_FtFace->glyph->metrics.height > MaxH) MaxH = pFont->m_FtFace->glyph->metrics.height; // ignore_convention Charcode = FT_Get_Next_Char(pFont->m_FtFace, Charcode, &GlyphIndex); } MaxW = (MaxW>>6)+2+OutlineThickness*2; MaxH = (MaxH>>6)+2+OutlineThickness*2; for(pSizeData->m_CharMaxWidth = 1; pSizeData->m_CharMaxWidth < MaxW; pSizeData->m_CharMaxWidth <<= 1); for(pSizeData->m_CharMaxHeight = 1; pSizeData->m_CharMaxHeight < MaxH; pSizeData->m_CharMaxHeight <<= 1); } //dbg_msg("pFont", "init size %d, texture size %d %d", pFont->sizes[index].font_size, w, h); //FT_New_Face(m_FTLibrary, "data/fonts/vera.ttf", 0, &pFont->ft_face); InitTexture(pSizeData, pSizeData->m_CharMaxWidth, pSizeData->m_CharMaxHeight, 8, 8); } CFontSizeData *GetSize(CFont *pFont, int Pixelsize) { int Index = GetFontSizeIndex(Pixelsize); if(pFont->m_aSizes[Index].m_FontSize != aFontSizes[Index]) InitIndex(pFont, Index); return &pFont->m_aSizes[Index]; } void UploadGlyph(CFontSizeData *pSizeData, int Texnum, int SlotID, int Chr, const void *pData) { int x = (SlotID%pSizeData->m_NumXChars) * (pSizeData->m_TextureWidth/pSizeData->m_NumXChars); int y = (SlotID/pSizeData->m_NumXChars) * (pSizeData->m_TextureHeight/pSizeData->m_NumYChars); Graphics()->LoadTextureRawSub(pSizeData->m_aTextures[Texnum], x, y, pSizeData->m_TextureWidth/pSizeData->m_NumXChars, pSizeData->m_TextureHeight/pSizeData->m_NumYChars, CImageInfo::FORMAT_ALPHA, pData); /* glBindTexture(GL_TEXTURE_2D, pSizeData->m_aTextures[Texnum]); glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, pSizeData->m_TextureWidth/pSizeData->m_NumXChars, pSizeData->m_TextureHeight/pSizeData->m_NumYChars, m_FontTextureFormat, GL_UNSIGNED_BYTE, pData);*/ } // 32k of data used for rendering glyphs unsigned char ms_aGlyphData[(1024/8) * (1024/8)]; unsigned char ms_aGlyphDataOutlined[(1024/8) * (1024/8)]; int GetSlot(CFontSizeData *pSizeData) { int CharCount = pSizeData->m_NumXChars*pSizeData->m_NumYChars; if(pSizeData->m_CurrentCharacter < CharCount) { int i = pSizeData->m_CurrentCharacter; pSizeData->m_CurrentCharacter++; return i; } // kick out the oldest // TODO: remove this linear search { int Oldest = 0; for(int i = 1; i < CharCount; i++) { if(pSizeData->m_aCharacters[i].m_TouchTime < pSizeData->m_aCharacters[Oldest].m_TouchTime) Oldest = i; } if(time_get()-pSizeData->m_aCharacters[Oldest].m_TouchTime < time_freq() && (pSizeData->m_NumXChars < MAX_CHARACTERS || pSizeData->m_NumYChars < MAX_CHARACTERS)) { IncreaseTextureSize(pSizeData); return GetSlot(pSizeData); } return Oldest; } } int RenderGlyph(CFont *pFont, CFontSizeData *pSizeData, int Chr) { FT_Bitmap *pBitmap; int SlotID = 0; int SlotW = pSizeData->m_TextureWidth / pSizeData->m_NumXChars; int SlotH = pSizeData->m_TextureHeight / pSizeData->m_NumYChars; int SlotSize = SlotW*SlotH; int x = 1; int y = 1; int px, py; FT_Set_Pixel_Sizes(pFont->m_FtFace, 0, pSizeData->m_FontSize); if(FT_Load_Char(pFont->m_FtFace, Chr, FT_LOAD_RENDER|FT_LOAD_NO_BITMAP)) { dbg_msg("pFont", "error loading glyph %d", Chr); return -1; } pBitmap = &pFont->m_FtFace->glyph->bitmap; // ignore_convention // fetch slot SlotID = GetSlot(pSizeData); if(SlotID < 0) return -1; // adjust spacing int OutlineThickness = AdjustOutlineThicknessToFontSize(1, pSizeData->m_FontSize); x += OutlineThickness; y += OutlineThickness; // prepare glyph data mem_zero(ms_aGlyphData, SlotSize); if(pBitmap->pixel_mode == FT_PIXEL_MODE_GRAY) // ignore_convention { for(py = 0; py < pBitmap->rows; py++) // ignore_convention for(px = 0; px < pBitmap->width; px++) // ignore_convention ms_aGlyphData[(py+y)*SlotW+px+x] = pBitmap->buffer[py*pBitmap->pitch+px]; // ignore_convention } else if(pBitmap->pixel_mode == FT_PIXEL_MODE_MONO) // ignore_convention { for(py = 0; py < pBitmap->rows; py++) // ignore_convention for(px = 0; px < pBitmap->width; px++) // ignore_convention { if(pBitmap->buffer[py*pBitmap->pitch+px/8]&(1<<(7-(px%8)))) // ignore_convention ms_aGlyphData[(py+y)*SlotW+px+x] = 255; } } if(0) for(py = 0; py < SlotW; py++) for(px = 0; px < SlotH; px++) ms_aGlyphData[py*SlotW+px] = 255; // upload the glyph UploadGlyph(pSizeData, 0, SlotID, Chr, ms_aGlyphData); if(OutlineThickness == 1) { Grow(ms_aGlyphData, ms_aGlyphDataOutlined, SlotW, SlotH); UploadGlyph(pSizeData, 1, SlotID, Chr, ms_aGlyphDataOutlined); } else { for(int i = OutlineThickness; i > 0; i-=2) { Grow(ms_aGlyphData, ms_aGlyphDataOutlined, SlotW, SlotH); Grow(ms_aGlyphDataOutlined, ms_aGlyphData, SlotW, SlotH); } UploadGlyph(pSizeData, 1, SlotID, Chr, ms_aGlyphData); } // set char info { CFontChar *pFontchr = &pSizeData->m_aCharacters[SlotID]; float Scale = 1.0f/pSizeData->m_FontSize; float Uscale = 1.0f/pSizeData->m_TextureWidth; float Vscale = 1.0f/pSizeData->m_TextureHeight; int Height = pBitmap->rows + OutlineThickness*2 + 2; // ignore_convention int Width = pBitmap->width + OutlineThickness*2 + 2; // ignore_convention pFontchr->m_ID = Chr; pFontchr->m_Height = Height * Scale; pFontchr->m_Width = Width * Scale; pFontchr->m_OffsetX = (pFont->m_FtFace->glyph->bitmap_left-1) * Scale; // ignore_convention pFontchr->m_OffsetY = (pSizeData->m_FontSize - pFont->m_FtFace->glyph->bitmap_top) * Scale; // ignore_convention pFontchr->m_AdvanceX = (pFont->m_FtFace->glyph->advance.x>>6) * Scale; // ignore_convention pFontchr->m_aUvs[0] = (SlotID%pSizeData->m_NumXChars) / (float)(pSizeData->m_NumXChars); pFontchr->m_aUvs[1] = (SlotID/pSizeData->m_NumXChars) / (float)(pSizeData->m_NumYChars); pFontchr->m_aUvs[2] = pFontchr->m_aUvs[0] + Width*Uscale; pFontchr->m_aUvs[3] = pFontchr->m_aUvs[1] + Height*Vscale; } return SlotID; } CFontChar *GetChar(CFont *pFont, CFontSizeData *pSizeData, int Chr) { CFontChar *pFontchr = NULL; // search for the character // TODO: remove this linear search int i; for(i = 0; i < pSizeData->m_CurrentCharacter; i++) { if(pSizeData->m_aCharacters[i].m_ID == Chr) { pFontchr = &pSizeData->m_aCharacters[i]; break; } } // check if we need to render the character if(!pFontchr) { int Index = RenderGlyph(pFont, pSizeData, Chr); if(Index >= 0) pFontchr = &pSizeData->m_aCharacters[Index]; } // touch the character // TODO: don't call time_get here if(pFontchr) pFontchr->m_TouchTime = time_get(); return pFontchr; } // must only be called from the rendering function as the pFont must be set to the correct size void RenderSetup(CFont *pFont, int size) { FT_Set_Pixel_Sizes(pFont->m_FtFace, 0, size); } float Kerning(CFont *pFont, int Left, int Right) { FT_Vector Kerning = {0,0}; FT_Get_Kerning(pFont->m_FtFace, Left, Right, FT_KERNING_DEFAULT, &Kerning); return (Kerning.x>>6); } public: CTextRender() { m_pGraphics = 0; m_TextR = 1.0f; m_TextG = 1.0f; m_TextB = 1.0f; m_TextA = 1.0f; m_TextOutlineR = 0.0f; m_TextOutlineG = 0.0f; m_TextOutlineB = 0.0f; m_TextOutlineA = 0.3f; m_pDefaultFont = 0; // GL_LUMINANCE can be good for debugging //m_FontTextureFormat = GL_ALPHA; } virtual void Init() { m_pGraphics = Kernel()->RequestInterface(); FT_Init_FreeType(&m_FTLibrary); } virtual CFont *LoadFont(const char *pFilename) { CFont *pFont = (CFont *)mem_alloc(sizeof(CFont), 1); mem_zero(pFont, sizeof(*pFont)); str_copy(pFont->m_aFilename, pFilename, sizeof(pFont->m_aFilename)); if(FT_New_Face(m_FTLibrary, pFont->m_aFilename, 0, &pFont->m_FtFace)) { mem_free(pFont); return NULL; } for(unsigned i = 0; i < NUM_FONT_SIZES; i++) pFont->m_aSizes[i].m_FontSize = -1; dbg_msg("textrender", "loaded pFont from '%s'", pFilename); return pFont; }; virtual void DestroyFont(CFont *pFont) { mem_free(pFont); } virtual void SetDefaultFont(CFont *pFont) { dbg_msg("textrender", "default pFont set %p", pFont); m_pDefaultFont = pFont; } virtual void SetCursor(CTextCursor *pCursor, float x, float y, float FontSize, int Flags) { mem_zero(pCursor, sizeof(*pCursor)); pCursor->m_FontSize = FontSize; pCursor->m_StartX = x; pCursor->m_StartY = y; pCursor->m_X = x; pCursor->m_Y = y; pCursor->m_LineCount = 1; pCursor->m_LineWidth = -1; pCursor->m_Flags = Flags; pCursor->m_CharCount = 0; } virtual void Text(void *pFontSetV, float x, float y, float Size, const char *pText, int MaxWidth) { CTextCursor Cursor; SetCursor(&Cursor, x, y, Size, TEXTFLAG_RENDER); Cursor.m_LineWidth = MaxWidth; TextEx(&Cursor, pText, -1); } virtual float TextWidth(void *pFontSetV, float Size, const char *pText, int Length) { CTextCursor Cursor; SetCursor(&Cursor, 0, 0, Size, 0); TextEx(&Cursor, pText, Length); return Cursor.m_X; } virtual int TextLineCount(void *pFontSetV, float Size, const char *pText, float LineWidth) { CTextCursor Cursor; SetCursor(&Cursor, 0, 0, Size, 0); Cursor.m_LineWidth = LineWidth; TextEx(&Cursor, pText, -1); return Cursor.m_LineCount; } virtual void TextColor(float r, float g, float b, float a) { m_TextR = r; m_TextG = g; m_TextB = b; m_TextA = a; } virtual void TextOutlineColor(float r, float g, float b, float a) { m_TextOutlineR = r; m_TextOutlineG = g; m_TextOutlineB = b; m_TextOutlineA = a; } virtual void TextEx(CTextCursor *pCursor, const char *pText, int Length) { CFont *pFont = pCursor->m_pFont; CFontSizeData *pSizeData = NULL; //dbg_msg("textrender", "rendering text '%s'", text); float ScreenX0, ScreenY0, ScreenX1, ScreenY1; float FakeToScreenX, FakeToScreenY; int ActualX, ActualY; int ActualSize; int i; int GotNewLine = 0; float DrawX = 0.0f, DrawY = 0.0f; int LineCount = 0; float CursorX, CursorY; float Size = pCursor->m_FontSize; // to correct coords, convert to screen coords, round, and convert back Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); FakeToScreenX = (Graphics()->ScreenWidth()/(ScreenX1-ScreenX0)); FakeToScreenY = (Graphics()->ScreenHeight()/(ScreenY1-ScreenY0)); ActualX = (int)(pCursor->m_X * FakeToScreenX); ActualY = (int)(pCursor->m_Y * FakeToScreenY); CursorX = ActualX / FakeToScreenX; CursorY = ActualY / FakeToScreenY; // same with size ActualSize = (int)(Size * FakeToScreenY); Size = ActualSize / FakeToScreenY; // fetch pFont data if(!pFont) pFont = m_pDefaultFont; if(!pFont) return; pSizeData = GetSize(pFont, ActualSize); RenderSetup(pFont, ActualSize); float Scale = 1/pSizeData->m_FontSize; // set length if(Length < 0) Length = str_length(pText); // if we don't want to render, we can just skip the first outline pass i = 1; if(pCursor->m_Flags&TEXTFLAG_RENDER) i = 0; for(;i < 2; i++) { const char *pCurrent = (char *)pText; const char *pEnd = pCurrent+Length; DrawX = CursorX; DrawY = CursorY; LineCount = pCursor->m_LineCount; if(pCursor->m_Flags&TEXTFLAG_RENDER) { // TODO: Make this better if (i == 0) Graphics()->TextureSet(pSizeData->m_aTextures[1]); else Graphics()->TextureSet(pSizeData->m_aTextures[0]); Graphics()->QuadsBegin(); if (i == 0) Graphics()->SetColor(m_TextOutlineR, m_TextOutlineG, m_TextOutlineB, m_TextOutlineA*m_TextA); else Graphics()->SetColor(m_TextR, m_TextG, m_TextB, m_TextA); } while(pCurrent < pEnd && (pCursor->m_MaxLines < 1 || LineCount <= pCursor->m_MaxLines)) { int NewLine = 0; const char *pBatchEnd = pEnd; if(pCursor->m_LineWidth > 0 && !(pCursor->m_Flags&TEXTFLAG_STOP_AT_END)) { int Wlen = min(WordLength((char *)pCurrent), (int)(pEnd-pCurrent)); CTextCursor Compare = *pCursor; Compare.m_X = DrawX; Compare.m_Y = DrawY; Compare.m_Flags &= ~TEXTFLAG_RENDER; Compare.m_LineWidth = -1; TextEx(&Compare, pCurrent, Wlen); if(Compare.m_X-DrawX > pCursor->m_LineWidth) { // word can't be fitted in one line, cut it CTextCursor Cutter = *pCursor; Cutter.m_CharCount = 0; Cutter.m_X = DrawX; Cutter.m_Y = DrawY; Cutter.m_Flags &= ~TEXTFLAG_RENDER; Cutter.m_Flags |= TEXTFLAG_STOP_AT_END; TextEx(&Cutter, (const char *)pCurrent, Wlen); Wlen = Cutter.m_CharCount; NewLine = 1; if(Wlen <= 3) // if we can't place 3 chars of the word on this line, take the next Wlen = 0; } else if(Compare.m_X-pCursor->m_StartX > pCursor->m_LineWidth) { NewLine = 1; Wlen = 0; } pBatchEnd = pCurrent + Wlen; } const char *pTmp = pCurrent; int NextCharacter = str_utf8_decode(&pTmp); while(pCurrent < pBatchEnd) { int Character = NextCharacter; pCurrent = pTmp; NextCharacter = str_utf8_decode(&pTmp); if(Character == '\n') { DrawX = pCursor->m_StartX; DrawY += Size; DrawX = (int)(DrawX * FakeToScreenX) / FakeToScreenX; // realign DrawY = (int)(DrawY * FakeToScreenY) / FakeToScreenY; ++LineCount; if(pCursor->m_MaxLines > 0 && LineCount > pCursor->m_MaxLines) break; continue; } CFontChar *pChr = GetChar(pFont, pSizeData, Character); if(pChr) { float Advance = pChr->m_AdvanceX + Kerning(pFont, Character, NextCharacter)*Scale; if(pCursor->m_Flags&TEXTFLAG_STOP_AT_END && DrawX+Advance*Size-pCursor->m_StartX > pCursor->m_LineWidth) { // we hit the end of the line, no more to render or count pCurrent = pEnd; break; } if(pCursor->m_Flags&TEXTFLAG_RENDER) { Graphics()->QuadsSetSubset(pChr->m_aUvs[0], pChr->m_aUvs[1], pChr->m_aUvs[2], pChr->m_aUvs[3]); IGraphics::CQuadItem QuadItem(DrawX+pChr->m_OffsetX*Size, DrawY+pChr->m_OffsetY*Size, pChr->m_Width*Size, pChr->m_Height*Size); Graphics()->QuadsDrawTL(&QuadItem, 1); } DrawX += Advance*Size; pCursor->m_CharCount++; } } if(NewLine) { DrawX = pCursor->m_StartX; DrawY += Size; GotNewLine = 1; DrawX = (int)(DrawX * FakeToScreenX) / FakeToScreenX; // realign DrawY = (int)(DrawY * FakeToScreenY) / FakeToScreenY; ++LineCount; } } if(pCursor->m_Flags&TEXTFLAG_RENDER) Graphics()->QuadsEnd(); } pCursor->m_X = DrawX; pCursor->m_LineCount = LineCount; if(GotNewLine) pCursor->m_Y = DrawY; } }; IEngineTextRender *CreateEngineTextRender() { return new CTextRender; } teeworlds-0.6.2+dfsg/src/engine/config.h0000644000175000017500000000126712140200333017112 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CONFIG_H #define ENGINE_CONFIG_H #include "kernel.h" class IConfig : public IInterface { MACRO_INTERFACE("config", 0) public: typedef void (*SAVECALLBACKFUNC)(IConfig *pConfig, void *pUserData); virtual void Init() = 0; virtual void Reset() = 0; virtual void RestoreStrings() = 0; virtual void Save() = 0; virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) = 0; virtual void WriteLine(const char *pLine) = 0; }; extern IConfig *CreateConfig(); #endif teeworlds-0.6.2+dfsg/src/engine/console.h0000644000175000017500000000621012140200333017300 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_CONSOLE_H #define ENGINE_CONSOLE_H #include "kernel.h" class IConsole : public IInterface { MACRO_INTERFACE("console", 0) public: // TODO: rework/cleanup enum { OUTPUT_LEVEL_STANDARD=0, OUTPUT_LEVEL_ADDINFO, OUTPUT_LEVEL_DEBUG, ACCESS_LEVEL_ADMIN=0, ACCESS_LEVEL_MOD, TEMPCMD_NAME_LENGTH=32, TEMPCMD_HELP_LENGTH=96, TEMPCMD_PARAMS_LENGTH=16, MAX_PRINT_CB=4, }; // TODO: rework this interface to reduce the amount of virtual calls class IResult { protected: unsigned m_NumArgs; public: IResult() { m_NumArgs = 0; } virtual ~IResult() {} virtual int GetInteger(unsigned Index) = 0; virtual float GetFloat(unsigned Index) = 0; virtual const char *GetString(unsigned Index) = 0; int NumArguments() const { return m_NumArgs; } }; class CCommandInfo { protected: int m_AccessLevel; public: CCommandInfo() { m_AccessLevel = ACCESS_LEVEL_ADMIN; } virtual ~CCommandInfo() {} const char *m_pName; const char *m_pHelp; const char *m_pParams; virtual const CCommandInfo *NextCommandInfo(int AccessLevel, int FlagMask) const = 0; int GetAccessLevel() const { return m_AccessLevel; } }; typedef void (*FPrintCallback)(const char *pStr, void *pUser); typedef void (*FPossibleCallback)(const char *pCmd, void *pUser); typedef void (*FCommandCallback)(IResult *pResult, void *pUserData); typedef void (*FChainCommandCallback)(IResult *pResult, void *pUserData, FCommandCallback pfnCallback, void *pCallbackUserData); virtual const CCommandInfo *FirstCommandInfo(int AccessLevel, int Flagmask) const = 0; virtual const CCommandInfo *GetCommandInfo(const char *pName, int FlagMask, bool Temp) = 0; virtual void PossibleCommands(const char *pStr, int FlagMask, bool Temp, FPossibleCallback pfnCallback, void *pUser) = 0; virtual void ParseArguments(int NumArgs, const char **ppArguments) = 0; virtual void Register(const char *pName, const char *pParams, int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp) = 0; virtual void RegisterTemp(const char *pName, const char *pParams, int Flags, const char *pHelp) = 0; virtual void DeregisterTemp(const char *pName) = 0; virtual void DeregisterTempAll() = 0; virtual void Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser) = 0; virtual void StoreCommands(bool Store) = 0; virtual bool LineIsValid(const char *pStr) = 0; virtual void ExecuteLine(const char *Sptr) = 0; virtual void ExecuteLineFlag(const char *Sptr, int FlasgMask) = 0; virtual void ExecuteLineStroked(int Stroke, const char *pStr) = 0; virtual void ExecuteFile(const char *pFilename) = 0; virtual int RegisterPrintCallback(int OutputLevel, FPrintCallback pfnPrintCallback, void *pUserData) = 0; virtual void SetPrintOutputLevel(int Index, int OutputLevel) = 0; virtual void Print(int Level, const char *pFrom, const char *pStr) = 0; virtual void SetAccessLevel(int AccessLevel) = 0; }; extern IConsole *CreateConsole(int FlagMask); #endif // FILE_ENGINE_CONSOLE_H teeworlds-0.6.2+dfsg/src/engine/demo.h0000644000175000017500000000320112140200333016557 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_DEMO_H #define ENGINE_DEMO_H #include "kernel.h" enum { MAX_TIMELINE_MARKERS=64 }; struct CDemoHeader { unsigned char m_aMarker[7]; unsigned char m_Version; char m_aNetversion[64]; char m_aMapName[64]; unsigned char m_aMapSize[4]; unsigned char m_aMapCrc[4]; char m_aType[8]; char m_aLength[4]; char m_aTimestamp[20]; }; struct CTimelineMarkers { char m_aNumTimelineMarkers[4]; char m_aTimelineMarkers[MAX_TIMELINE_MARKERS][4]; }; class IDemoPlayer : public IInterface { MACRO_INTERFACE("demoplayer", 0) public: class CInfo { public: bool m_Paused; float m_Speed; int m_FirstTick; int m_CurrentTick; int m_LastTick; int m_NumTimelineMarkers; int m_aTimelineMarkers[MAX_TIMELINE_MARKERS]; }; enum { DEMOTYPE_INVALID=0, DEMOTYPE_CLIENT, DEMOTYPE_SERVER, }; ~IDemoPlayer() {} virtual void SetSpeed(float Speed) = 0; virtual int SetPos(float Percent) = 0; virtual void Pause() = 0; virtual void Unpause() = 0; virtual const CInfo *BaseInfo() const = 0; virtual void GetDemoName(char *pBuffer, int BufferSize) const = 0; virtual bool GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader) const = 0; virtual int GetDemoType() const = 0; }; class IDemoRecorder : public IInterface { MACRO_INTERFACE("demorecorder", 0) public: ~IDemoRecorder() {} virtual bool IsRecording() const = 0; virtual int Stop() = 0; virtual int Length() const = 0; }; #endif teeworlds-0.6.2+dfsg/src/engine/docs/0000755000175000017500000000000012140200333016416 5ustar felixfelixteeworlds-0.6.2+dfsg/src/engine/docs/client_time.txt0000644000175000017500000000050212140200333021450 0ustar felixfelixTitle: Time on the client tick, intratick predtick, predintratick prevtick tick predtick 4 8 14 |---------------------|---------------------| 0 <- intratick -> 1 0 <- ticktime(in s)-> X 0 <- predintratick?-> 1 teeworlds-0.6.2+dfsg/src/engine/docs/prediction.txt0000644000175000017500000000140212140200333021314 0ustar felixfelixTitle: Prediction The engine calls when reprediction is required. This happens usally when new data has arrived from the server. should to prediction from the current snapshot and current snapshot tick ( + 1) upto and including the tick returned by . Predicted input sent to the server can be retrived by calling with the corresponding tick that you want the input for. Here is a simple example of how it might look. > void modc_predict() > { > int tick; > prediction_reset(); > > for(tick = client_tick()+1; tick <= client_predtick(); tick++) > { > MY_INPUT *input = (MY_INPUT *)client_get_input(); > if(input) > prediction_apply_input(input); > prediction_tick(); > } > } teeworlds-0.6.2+dfsg/src/engine/docs/server_op.txt0000644000175000017500000000100212140200333021154 0ustar felixfelixTitle: Server Operation Section: Init Section: Running Here is an graph over how the server operates on each refresh. (start code) load map init mod while running if map change then load new map shutdown mod reset clients to init state init mod end if if new tick then call for each client do create snapshot send snapshot end for end process new network messages end while unload map (end) Section: Reinit Section: Shutdown teeworlds-0.6.2+dfsg/src/engine/docs/snapshots.txt0000644000175000017500000000642712140200333021212 0ustar felixfelixTitle: Snapshots Section: Overview Topic: Definitions - *Snapshot*. A is a serialized game state from which a client can render the game from. They are sent from the server at a regular interval and is created specificly for each client in order to reduce bandwidth. - *Delta Snapshot*. A set of data that can be applied to a snapshot in order to create a new snapshot with the updated game state. Topic: Structure A snapshot contains a series of items. Each item have a type, id and data. - *Type*. Type of item. Could be projectile or character for example. - *Id*. A unique id so the client can identify the item between two snapshots. - *Data*. A series of 32-bit integers that contains the per item type specific data. Section: Server Side Topic: Creating Items can be added when is called using the function to insert an item to the snapshot. The server can not inspect the snapshot that is in progress of being created. Section: Client Side Topic: Inspection is called when a new snapshot has arrived for processing. , and can be used to inspect the current and previous snapshot. This can be done anywhere while the client is running and not just in the function. The client can also call if an item contains improper information that could harm the operation of the client. This should however be done in to assure that no bad data propagates into the rest of the client. Topic: Rendering DOCTODO Section: In depth Topic: Compression After a snapshot have been created, compression is applyed to reduce the bandwidth. There are several steps taken inorder to reduce the size of the size of the snapshot. - *Delta*. The server looks in a clients backlog of snapshots to find a previous acked snapshot. It then compares the two snapshots and creates a delta snapshot containing the changes from the previous acked snapshot to the new one. - *Variable Integers*. The delta snapshot which is only consisting of 32-bit integers is then encoded into variable integers similar to UTF-8. Each byte has a bit that tells the decoder that it needs one more byte to decode the 32-bit integer. The first byte also contains a bit for telling the sign of the integer. > ESDDDDDD EDDDDDDD EDDDDDDD EDDDDDDD > E = extend > S = sign > D = data bit - *Huffman*. The last step is to compress the buffer with a huffman encoder. It uses a static tree that is weighted towards 0 because it's where most of the data will be because of the delta compression. Topic: Interval The interval for how often a client recives a snapshot changes during the course of the connection. There are three different snapshot rates. - *Init*. 5 snapshots per second. Used when a client is connecting and used until the client has acknowlaged a snapshot. This mechanism is used because the first snapshot because no delta compression can be done. - *Full*. Snapshot for every tick or every even tick depending on server configuration. This is used during normal gameplay and everything is running smooth. - *Recovery*. 1 snapshot each second. A client enters recovery rate when it havn't acknowlaged a snapshot over 1 second. This is to let the client to beable to recover if it has a slow connection. teeworlds-0.6.2+dfsg/src/engine/editor.h0000644000175000017500000000076512140200333017135 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_EDITOR_H #define ENGINE_EDITOR_H #include "kernel.h" class IEditor : public IInterface { MACRO_INTERFACE("editor", 0) public: virtual ~IEditor() {} virtual void Init() = 0; virtual void UpdateAndRender() = 0; virtual bool HasUnsavedData() = 0; }; extern IEditor *CreateEditor(); #endif teeworlds-0.6.2+dfsg/src/engine/engine.h0000644000175000017500000000142512140200333017106 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_ENGINE_H #define ENGINE_ENGINE_H #include "kernel.h" #include class CHostLookup { public: CJob m_Job; char m_aHostname[128]; int m_Nettype; NETADDR m_Addr; }; class IEngine : public IInterface { MACRO_INTERFACE("engine", 0) protected: class CJobPool m_JobPool; public: virtual void Init() = 0; virtual void InitLogfile() = 0; virtual void HostLookup(CHostLookup *pLookup, const char *pHostname, int Nettype) = 0; virtual void AddJob(CJob *pJob, JOBFUNC pfnFunc, void *pData) = 0; }; extern IEngine *CreateEngine(const char *pAppname); #endif teeworlds-0.6.2+dfsg/src/engine/friends.h0000644000175000017500000000200712140200333017270 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_FRIENDS_H #define ENGINE_FRIENDS_H #include #include "kernel.h" struct CFriendInfo { char m_aName[MAX_NAME_LENGTH]; char m_aClan[MAX_CLAN_LENGTH]; unsigned m_NameHash; unsigned m_ClanHash; }; class IFriends : public IInterface { MACRO_INTERFACE("friends", 0) public: enum { FRIEND_NO=0, FRIEND_CLAN, FRIEND_PLAYER, MAX_FRIENDS=128, }; virtual void Init() = 0; virtual int NumFriends() const = 0; virtual const CFriendInfo *GetFriend(int Index) const = 0; virtual int GetFriendState(const char *pName, const char *pClan) const = 0; virtual bool IsFriend(const char *pName, const char *pClan, bool PlayersOnly) const = 0; virtual void AddFriend(const char *pName, const char *pClan) = 0; virtual void RemoveFriend(const char *pName, const char *pClan) = 0; }; #endif teeworlds-0.6.2+dfsg/src/engine/graphics.h0000644000175000017500000001131112140200333017434 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_GRAPHICS_H #define ENGINE_GRAPHICS_H #include "kernel.h" class CImageInfo { public: enum { FORMAT_AUTO=-1, FORMAT_RGB=0, FORMAT_RGBA=1, FORMAT_ALPHA=2, }; /* Variable: width Contains the width of the image */ int m_Width; /* Variable: height Contains the height of the image */ int m_Height; /* Variable: format Contains the format of the image. See for more information. */ int m_Format; /* Variable: data Pointer to the image data. */ void *m_pData; }; /* Structure: CVideoMode */ class CVideoMode { public: int m_Width, m_Height; int m_Red, m_Green, m_Blue; }; class IGraphics : public IInterface { MACRO_INTERFACE("graphics", 0) protected: int m_ScreenWidth; int m_ScreenHeight; public: /* Constants: Texture Loading Flags TEXLOAD_NORESAMPLE - Prevents the texture from any resampling */ enum { TEXLOAD_NORESAMPLE = 1, TEXLOAD_NOMIPMAPS = 2, }; int ScreenWidth() const { return m_ScreenWidth; } int ScreenHeight() const { return m_ScreenHeight; } float ScreenAspect() const { return (float)ScreenWidth()/(float)ScreenHeight(); } virtual void Clear(float r, float g, float b) = 0; virtual void ClipEnable(int x, int y, int w, int h) = 0; virtual void ClipDisable() = 0; virtual void MapScreen(float TopLeftX, float TopLeftY, float BottomRightX, float BottomRightY) = 0; virtual void GetScreen(float *pTopLeftX, float *pTopLeftY, float *pBottomRightX, float *pBottomRightY) = 0; // TODO: These should perhaps not be virtuals virtual void BlendNone() = 0; virtual void BlendNormal() = 0; virtual void BlendAdditive() = 0; virtual void WrapNormal() = 0; virtual void WrapClamp() = 0; virtual int MemoryUsage() const = 0; virtual int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) = 0; virtual int UnloadTexture(int Index) = 0; virtual int LoadTextureRaw(int Width, int Height, int Format, const void *pData, int StoreFormat, int Flags) = 0; virtual int LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) = 0; virtual int LoadTextureRawSub(int TextureID, int x, int y, int Width, int Height, int Format, const void *pData) = 0; virtual void TextureSet(int TextureID) = 0; struct CLineItem { float m_X0, m_Y0, m_X1, m_Y1; CLineItem() {} CLineItem(float x0, float y0, float x1, float y1) : m_X0(x0), m_Y0(y0), m_X1(x1), m_Y1(y1) {} }; virtual void LinesBegin() = 0; virtual void LinesEnd() = 0; virtual void LinesDraw(const CLineItem *pArray, int Num) = 0; virtual void QuadsBegin() = 0; virtual void QuadsEnd() = 0; virtual void QuadsSetRotation(float Angle) = 0; virtual void QuadsSetSubset(float TopLeftY, float TopLeftV, float BottomRightU, float BottomRightV) = 0; virtual void QuadsSetSubsetFree(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) = 0; struct CQuadItem { float m_X, m_Y, m_Width, m_Height; CQuadItem() {} CQuadItem(float x, float y, float w, float h) : m_X(x), m_Y(y), m_Width(w), m_Height(h) {} }; virtual void QuadsDraw(CQuadItem *pArray, int Num) = 0; virtual void QuadsDrawTL(const CQuadItem *pArray, int Num) = 0; struct CFreeformItem { float m_X0, m_Y0, m_X1, m_Y1, m_X2, m_Y2, m_X3, m_Y3; CFreeformItem() {} CFreeformItem(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) : m_X0(x0), m_Y0(y0), m_X1(x1), m_Y1(y1), m_X2(x2), m_Y2(y2), m_X3(x3), m_Y3(y3) {} }; virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) = 0; virtual void QuadsText(float x, float y, float Size, const char *pText) = 0; struct CColorVertex { int m_Index; float m_R, m_G, m_B, m_A; CColorVertex() {} CColorVertex(int i, float r, float g, float b, float a) : m_Index(i), m_R(r), m_G(g), m_B(b), m_A(a) {} }; virtual void SetColorVertex(const CColorVertex *pArray, int Num) = 0; virtual void SetColor(float r, float g, float b, float a) = 0; virtual void TakeScreenshot(const char *pFilename) = 0; virtual int GetVideoModes(CVideoMode *pModes, int MaxModes) = 0; virtual void Swap() = 0; // syncronization virtual void InsertSignal(class semaphore *pSemaphore) = 0; virtual bool IsIdle() = 0; virtual void WaitForIdle() = 0; }; class IEngineGraphics : public IGraphics { MACRO_INTERFACE("enginegraphics", 0) public: virtual int Init() = 0; virtual void Shutdown() = 0; virtual void Minimize() = 0; virtual void Maximize() = 0; virtual int WindowActive() = 0; virtual int WindowOpen() = 0; }; extern IEngineGraphics *CreateEngineGraphics(); extern IEngineGraphics *CreateEngineGraphicsThreaded(); #endif teeworlds-0.6.2+dfsg/src/engine/input.h0000644000175000017500000000377012140200333017005 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_INPUT_H #define ENGINE_INPUT_H #include "kernel.h" extern const char g_aaKeyStrings[512][16]; class IInput : public IInterface { MACRO_INTERFACE("input", 0) public: class CEvent { public: int m_Flags; int m_Unicode; int m_Key; }; protected: enum { INPUT_BUFFER_SIZE=32 }; // quick access to events int m_NumEvents; IInput::CEvent m_aInputEvents[INPUT_BUFFER_SIZE]; //quick access to input struct { unsigned char m_Presses; unsigned char m_Releases; } m_aInputCount[2][1024]; unsigned char m_aInputState[2][1024]; int m_InputCurrent; bool m_InputDispatched; int KeyWasPressed(int Key) { return m_aInputState[m_InputCurrent^1][Key]; } public: enum { FLAG_PRESS=1, FLAG_RELEASE=2, FLAG_REPEAT=4 }; // events int NumEvents() const { return m_NumEvents; } void ClearEvents() { m_NumEvents = 0; m_InputDispatched = true; } CEvent GetEvent(int Index) const { if(Index < 0 || Index >= m_NumEvents) { IInput::CEvent e = {0,0}; return e; } return m_aInputEvents[Index]; } // keys int KeyPressed(int Key) { return m_aInputState[m_InputCurrent][Key]; } int KeyReleases(int Key) { return m_aInputCount[m_InputCurrent][Key].m_Releases; } int KeyPresses(int Key) { return m_aInputCount[m_InputCurrent][Key].m_Presses; } int KeyDown(int Key) { return KeyPressed(Key)&&!KeyWasPressed(Key); } const char *KeyName(int Key) { return (Key >= 0 && Key < 512) ? g_aaKeyStrings[Key] : g_aaKeyStrings[0]; } // virtual void MouseModeRelative() = 0; virtual void MouseModeAbsolute() = 0; virtual int MouseDoubleClick() = 0; virtual void MouseRelative(float *x, float *y) = 0; }; class IEngineInput : public IInput { MACRO_INTERFACE("engineinput", 0) public: virtual void Init() = 0; virtual int Update() = 0; }; extern IEngineInput *CreateEngineInput(); #endif teeworlds-0.6.2+dfsg/src/engine/kernel.h0000644000175000017500000000371412140200333017124 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_KERNEL_H #define ENGINE_KERNEL_H #include class IKernel; class IInterface; class IInterface { // friend with the kernel implementation friend class CKernel; IKernel *m_pKernel; protected: IKernel *Kernel() { return m_pKernel; } public: IInterface() : m_pKernel(0) {} virtual ~IInterface() {} //virtual unsigned InterfaceID() = 0; //virtual const char *InterfaceName() = 0; }; #define MACRO_INTERFACE(Name, ver) \ public: \ static const char *InterfaceName() { return Name; } \ private: //virtual unsigned InterfaceID() { return INTERFACE_ID; } //virtual const char *InterfaceName() { return name; } // This kernel thingie makes the structure very flat and basiclly singletons. // I'm not sure if this is a good idea but it works for now. class IKernel { // hide the implementation virtual bool RegisterInterfaceImpl(const char *InterfaceName, IInterface *pInterface) = 0; virtual bool ReregisterInterfaceImpl(const char *InterfaceName, IInterface *pInterface) = 0; virtual IInterface *RequestInterfaceImpl(const char *InterfaceName) = 0; public: static IKernel *Create(); virtual ~IKernel() {} // templated access to handle pointer convertions and interface names template bool RegisterInterface(TINTERFACE *pInterface) { return RegisterInterfaceImpl(TINTERFACE::InterfaceName(), pInterface); } template bool ReregisterInterface(TINTERFACE *pInterface) { return ReregisterInterfaceImpl(TINTERFACE::InterfaceName(), pInterface); } // Usage example: // IMyInterface *pMyHandle = Kernel()->RequestInterface() template TINTERFACE *RequestInterface() { return reinterpret_cast(RequestInterfaceImpl(TINTERFACE::InterfaceName())); } }; #endif teeworlds-0.6.2+dfsg/src/engine/keys.h0000644000175000017500000001134112140200333016612 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_KEYS_H #define ENGINE_KEYS_H /* AUTO GENERATED! DO NOT EDIT MANUALLY! */ enum { KEY_UNKNOWN = 0, KEY_FIRST = 0, KEY_BACKSPACE = 8, KEY_TAB = 9, KEY_CLEAR = 12, KEY_RETURN = 13, KEY_PAUSE = 19, KEY_ESCAPE = 27, KEY_SPACE = 32, KEY_EXCLAIM = 33, KEY_QUOTEDBL = 34, KEY_HASH = 35, KEY_DOLLAR = 36, KEY_AMPERSAND = 38, KEY_QUOTE = 39, KEY_LEFTPAREN = 40, KEY_RIGHTPAREN = 41, KEY_ASTERISK = 42, KEY_PLUS = 43, KEY_COMMA = 44, KEY_MINUS = 45, KEY_PERIOD = 46, KEY_SLASH = 47, KEY_0 = 48, KEY_1 = 49, KEY_2 = 50, KEY_3 = 51, KEY_4 = 52, KEY_5 = 53, KEY_6 = 54, KEY_7 = 55, KEY_8 = 56, KEY_9 = 57, KEY_COLON = 58, KEY_SEMICOLON = 59, KEY_LESS = 60, KEY_EQUALS = 61, KEY_GREATER = 62, KEY_QUESTION = 63, KEY_AT = 64, KEY_LEFTBRACKET = 91, KEY_BACKSLASH = 92, KEY_RIGHTBRACKET = 93, KEY_CARET = 94, KEY_UNDERSCORE = 95, KEY_BACKQUOTE = 96, KEY_a = 97, KEY_b = 98, KEY_c = 99, KEY_d = 100, KEY_e = 101, KEY_f = 102, KEY_g = 103, KEY_h = 104, KEY_i = 105, KEY_j = 106, KEY_k = 107, KEY_l = 108, KEY_m = 109, KEY_n = 110, KEY_o = 111, KEY_p = 112, KEY_q = 113, KEY_r = 114, KEY_s = 115, KEY_t = 116, KEY_u = 117, KEY_v = 118, KEY_w = 119, KEY_x = 120, KEY_y = 121, KEY_z = 122, KEY_DELETE = 127, KEY_WORLD_0 = 160, KEY_WORLD_1 = 161, KEY_WORLD_2 = 162, KEY_WORLD_3 = 163, KEY_WORLD_4 = 164, KEY_WORLD_5 = 165, KEY_WORLD_6 = 166, KEY_WORLD_7 = 167, KEY_WORLD_8 = 168, KEY_WORLD_9 = 169, KEY_WORLD_10 = 170, KEY_WORLD_11 = 171, KEY_WORLD_12 = 172, KEY_WORLD_13 = 173, KEY_WORLD_14 = 174, KEY_WORLD_15 = 175, KEY_WORLD_16 = 176, KEY_WORLD_17 = 177, KEY_WORLD_18 = 178, KEY_WORLD_19 = 179, KEY_WORLD_20 = 180, KEY_WORLD_21 = 181, KEY_WORLD_22 = 182, KEY_WORLD_23 = 183, KEY_WORLD_24 = 184, KEY_WORLD_25 = 185, KEY_WORLD_26 = 186, KEY_WORLD_27 = 187, KEY_WORLD_28 = 188, KEY_WORLD_29 = 189, KEY_WORLD_30 = 190, KEY_WORLD_31 = 191, KEY_WORLD_32 = 192, KEY_WORLD_33 = 193, KEY_WORLD_34 = 194, KEY_WORLD_35 = 195, KEY_WORLD_36 = 196, KEY_WORLD_37 = 197, KEY_WORLD_38 = 198, KEY_WORLD_39 = 199, KEY_WORLD_40 = 200, KEY_WORLD_41 = 201, KEY_WORLD_42 = 202, KEY_WORLD_43 = 203, KEY_WORLD_44 = 204, KEY_WORLD_45 = 205, KEY_WORLD_46 = 206, KEY_WORLD_47 = 207, KEY_WORLD_48 = 208, KEY_WORLD_49 = 209, KEY_WORLD_50 = 210, KEY_WORLD_51 = 211, KEY_WORLD_52 = 212, KEY_WORLD_53 = 213, KEY_WORLD_54 = 214, KEY_WORLD_55 = 215, KEY_WORLD_56 = 216, KEY_WORLD_57 = 217, KEY_WORLD_58 = 218, KEY_WORLD_59 = 219, KEY_WORLD_60 = 220, KEY_WORLD_61 = 221, KEY_WORLD_62 = 222, KEY_WORLD_63 = 223, KEY_WORLD_64 = 224, KEY_WORLD_65 = 225, KEY_WORLD_66 = 226, KEY_WORLD_67 = 227, KEY_WORLD_68 = 228, KEY_WORLD_69 = 229, KEY_WORLD_70 = 230, KEY_WORLD_71 = 231, KEY_WORLD_72 = 232, KEY_WORLD_73 = 233, KEY_WORLD_74 = 234, KEY_WORLD_75 = 235, KEY_WORLD_76 = 236, KEY_WORLD_77 = 237, KEY_WORLD_78 = 238, KEY_WORLD_79 = 239, KEY_WORLD_80 = 240, KEY_WORLD_81 = 241, KEY_WORLD_82 = 242, KEY_WORLD_83 = 243, KEY_WORLD_84 = 244, KEY_WORLD_85 = 245, KEY_WORLD_86 = 246, KEY_WORLD_87 = 247, KEY_WORLD_88 = 248, KEY_WORLD_89 = 249, KEY_WORLD_90 = 250, KEY_WORLD_91 = 251, KEY_WORLD_92 = 252, KEY_WORLD_93 = 253, KEY_WORLD_94 = 254, KEY_WORLD_95 = 255, KEY_KP0 = 256, KEY_KP1 = 257, KEY_KP2 = 258, KEY_KP3 = 259, KEY_KP4 = 260, KEY_KP5 = 261, KEY_KP6 = 262, KEY_KP7 = 263, KEY_KP8 = 264, KEY_KP9 = 265, KEY_KP_PERIOD = 266, KEY_KP_DIVIDE = 267, KEY_KP_MULTIPLY = 268, KEY_KP_MINUS = 269, KEY_KP_PLUS = 270, KEY_KP_ENTER = 271, KEY_KP_EQUALS = 272, KEY_UP = 273, KEY_DOWN = 274, KEY_RIGHT = 275, KEY_LEFT = 276, KEY_INSERT = 277, KEY_HOME = 278, KEY_END = 279, KEY_PAGEUP = 280, KEY_PAGEDOWN = 281, KEY_F1 = 282, KEY_F2 = 283, KEY_F3 = 284, KEY_F4 = 285, KEY_F5 = 286, KEY_F6 = 287, KEY_F7 = 288, KEY_F8 = 289, KEY_F9 = 290, KEY_F10 = 291, KEY_F11 = 292, KEY_F12 = 293, KEY_F13 = 294, KEY_F14 = 295, KEY_F15 = 296, KEY_NUMLOCK = 300, KEY_CAPSLOCK = 301, KEY_SCROLLOCK = 302, KEY_RSHIFT = 303, KEY_LSHIFT = 304, KEY_RCTRL = 305, KEY_LCTRL = 306, KEY_RALT = 307, KEY_LALT = 308, KEY_RMETA = 309, KEY_LMETA = 310, KEY_LSUPER = 311, KEY_RSUPER = 312, KEY_MODE = 313, KEY_COMPOSE = 314, KEY_HELP = 315, KEY_PRINT = 316, KEY_SYSREQ = 317, KEY_BREAK = 318, KEY_MENU = 319, KEY_POWER = 320, KEY_EURO = 321, KEY_UNDO = 322, KEY_MOUSE_1 = 323, KEY_MOUSE_2 = 324, KEY_MOUSE_3 = 325, KEY_MOUSE_4 = 326, KEY_MOUSE_5 = 327, KEY_MOUSE_6 = 328, KEY_MOUSE_7 = 329, KEY_MOUSE_8 = 330, KEY_MOUSE_WHEEL_UP = 331, KEY_MOUSE_WHEEL_DOWN = 332, KEY_LAST, }; #endif teeworlds-0.6.2+dfsg/src/engine/map.h0000644000175000017500000000161512140200333016417 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_MAP_H #define ENGINE_MAP_H #include "kernel.h" class IMap : public IInterface { MACRO_INTERFACE("map", 0) public: virtual void *GetData(int Index) = 0; virtual void *GetDataSwapped(int Index) = 0; virtual void UnloadData(int Index) = 0; virtual void *GetItem(int Index, int *Type, int *pID) = 0; virtual void GetType(int Type, int *pStart, int *pNum) = 0; virtual void *FindItem(int Type, int ID) = 0; virtual int NumItems() = 0; }; class IEngineMap : public IMap { MACRO_INTERFACE("enginemap", 0) public: virtual bool Load(const char *pMapName) = 0; virtual bool IsLoaded() = 0; virtual void Unload() = 0; virtual unsigned Crc() = 0; }; extern IEngineMap *CreateEngineMap(); #endif teeworlds-0.6.2+dfsg/src/engine/masterserver.h0000644000175000017500000000162312140200333020363 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_MASTERSERVER_H #define ENGINE_MASTERSERVER_H #include "kernel.h" class IMasterServer : public IInterface { MACRO_INTERFACE("masterserver", 0) public: enum { MAX_MASTERSERVERS=4 }; virtual void Init() = 0; virtual void SetDefault() = 0; virtual int Load() = 0; virtual int Save() = 0; virtual int RefreshAddresses(int Nettype) = 0; virtual void Update() = 0; virtual int IsRefreshing() = 0; virtual NETADDR GetAddr(int Index) = 0; virtual const char *GetName(int Index) = 0; virtual bool IsValid(int Index) = 0; }; class IEngineMasterServer : public IMasterServer { MACRO_INTERFACE("enginemasterserver", 0) public: }; extern IEngineMasterServer *CreateEngineMasterServer(); #endif teeworlds-0.6.2+dfsg/src/engine/message.h0000644000175000017500000000060412140200333017263 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_MESSAGE_H #define ENGINE_MESSAGE_H #include class CMsgPacker : public CPacker { public: CMsgPacker(int Type) { Reset(); AddInt(Type); } }; #endif teeworlds-0.6.2+dfsg/src/engine/server.h0000644000175000017500000000560612140200333017154 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SERVER_H #define ENGINE_SERVER_H #include "kernel.h" #include "message.h" class IServer : public IInterface { MACRO_INTERFACE("server", 0) protected: int m_CurrentGameTick; int m_TickSpeed; public: /* Structure: CClientInfo */ struct CClientInfo { const char *m_pName; int m_Latency; }; int Tick() const { return m_CurrentGameTick; } int TickSpeed() const { return m_TickSpeed; } virtual int MaxClients() const = 0; virtual const char *ClientName(int ClientID) = 0; virtual const char *ClientClan(int ClientID) = 0; virtual int ClientCountry(int ClientID) = 0; virtual bool ClientIngame(int ClientID) = 0; virtual int GetClientInfo(int ClientID, CClientInfo *pInfo) = 0; virtual void GetClientAddr(int ClientID, char *pAddrStr, int Size) = 0; virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientID) = 0; template int SendPackMsg(T *pMsg, int Flags, int ClientID) { CMsgPacker Packer(pMsg->MsgID()); if(pMsg->Pack(&Packer)) return -1; return SendMsg(&Packer, Flags, ClientID); } virtual void SetClientName(int ClientID, char const *pName) = 0; virtual void SetClientClan(int ClientID, char const *pClan) = 0; virtual void SetClientCountry(int ClientID, int Country) = 0; virtual void SetClientScore(int ClientID, int Score) = 0; virtual int SnapNewID() = 0; virtual void SnapFreeID(int ID) = 0; virtual void *SnapNewItem(int Type, int ID, int Size) = 0; virtual void SnapSetStaticsize(int ItemType, int Size) = 0; enum { RCON_CID_SERV=-1, RCON_CID_VOTE=-2, }; virtual void SetRconCID(int ClientID) = 0; virtual bool IsAuthed(int ClientID) = 0; virtual void Kick(int ClientID, const char *pReason) = 0; virtual void DemoRecorder_HandleAutoStart() = 0; virtual bool DemoRecorder_IsRecording() = 0; }; class IGameServer : public IInterface { MACRO_INTERFACE("gameserver", 0) protected: public: virtual void OnInit() = 0; virtual void OnConsoleInit() = 0; virtual void OnShutdown() = 0; virtual void OnTick() = 0; virtual void OnPreSnap() = 0; virtual void OnSnap(int ClientID) = 0; virtual void OnPostSnap() = 0; virtual void OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) = 0; virtual void OnClientConnected(int ClientID) = 0; virtual void OnClientEnter(int ClientID) = 0; virtual void OnClientDrop(int ClientID, const char *pReason) = 0; virtual void OnClientDirectInput(int ClientID, void *pInput) = 0; virtual void OnClientPredictedInput(int ClientID, void *pInput) = 0; virtual bool IsClientReady(int ClientID) = 0; virtual bool IsClientPlayer(int ClientID) = 0; virtual const char *GameType() = 0; virtual const char *Version() = 0; virtual const char *NetVersion() = 0; }; extern IGameServer *CreateGameServer(); #endif teeworlds-0.6.2+dfsg/src/engine/server/0000755000175000017500000000000012140200333016774 5ustar felixfelixteeworlds-0.6.2+dfsg/src/engine/server/register.cpp0000644000175000017500000002024112140200333021323 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "register.h" CRegister::CRegister() { m_pNetServer = 0; m_pMasterServer = 0; m_pConsole = 0; m_RegisterState = REGISTERSTATE_START; m_RegisterStateStart = 0; m_RegisterFirst = 1; m_RegisterCount = 0; mem_zero(m_aMasterserverInfo, sizeof(m_aMasterserverInfo)); m_RegisterRegisteredServer = -1; } void CRegister::RegisterNewState(int State) { m_RegisterState = State; m_RegisterStateStart = time_get(); } void CRegister::RegisterSendFwcheckresponse(NETADDR *pAddr) { CNetChunk Packet; Packet.m_ClientID = -1; Packet.m_Address = *pAddr; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = sizeof(SERVERBROWSE_FWRESPONSE); Packet.m_pData = SERVERBROWSE_FWRESPONSE; m_pNetServer->Send(&Packet); } void CRegister::RegisterSendHeartbeat(NETADDR Addr) { static unsigned char aData[sizeof(SERVERBROWSE_HEARTBEAT) + 2]; unsigned short Port = g_Config.m_SvPort; CNetChunk Packet; mem_copy(aData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)); Packet.m_ClientID = -1; Packet.m_Address = Addr; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = sizeof(SERVERBROWSE_HEARTBEAT) + 2; Packet.m_pData = &aData; // supply the set port that the master can use if it has problems if(g_Config.m_SvExternalPort) Port = g_Config.m_SvExternalPort; aData[sizeof(SERVERBROWSE_HEARTBEAT)] = Port >> 8; aData[sizeof(SERVERBROWSE_HEARTBEAT)+1] = Port&0xff; m_pNetServer->Send(&Packet); } void CRegister::RegisterSendCountRequest(NETADDR Addr) { CNetChunk Packet; Packet.m_ClientID = -1; Packet.m_Address = Addr; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = sizeof(SERVERBROWSE_GETCOUNT); Packet.m_pData = SERVERBROWSE_GETCOUNT; m_pNetServer->Send(&Packet); } void CRegister::RegisterGotCount(CNetChunk *pChunk) { unsigned char *pData = (unsigned char *)pChunk->m_pData; int Count = (pData[sizeof(SERVERBROWSE_COUNT)]<<8) | pData[sizeof(SERVERBROWSE_COUNT)+1]; for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) { if(net_addr_comp(&m_aMasterserverInfo[i].m_Addr, &pChunk->m_Address) == 0) { m_aMasterserverInfo[i].m_Count = Count; break; } } } void CRegister::Init(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole) { m_pNetServer = pNetServer; m_pMasterServer = pMasterServer; m_pConsole = pConsole; } void CRegister::RegisterUpdate(int Nettype) { int64 Now = time_get(); int64 Freq = time_freq(); if(!g_Config.m_SvRegister) return; m_pMasterServer->Update(); if(m_RegisterState == REGISTERSTATE_START) { m_RegisterCount = 0; m_RegisterFirst = 1; RegisterNewState(REGISTERSTATE_UPDATE_ADDRS); m_pMasterServer->RefreshAddresses(Nettype); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "refreshing ip addresses"); } else if(m_RegisterState == REGISTERSTATE_UPDATE_ADDRS) { m_RegisterRegisteredServer = -1; if(!m_pMasterServer->IsRefreshing()) { int i; for(i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) { if(!m_pMasterServer->IsValid(i)) { m_aMasterserverInfo[i].m_Valid = 0; m_aMasterserverInfo[i].m_Count = 0; continue; } NETADDR Addr = m_pMasterServer->GetAddr(i); m_aMasterserverInfo[i].m_Addr = Addr; m_aMasterserverInfo[i].m_Valid = 1; m_aMasterserverInfo[i].m_Count = -1; m_aMasterserverInfo[i].m_LastSend = 0; } m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "fetching server counts"); RegisterNewState(REGISTERSTATE_QUERY_COUNT); } } else if(m_RegisterState == REGISTERSTATE_QUERY_COUNT) { int Left = 0; for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) { if(!m_aMasterserverInfo[i].m_Valid) continue; if(m_aMasterserverInfo[i].m_Count == -1) { Left++; if(m_aMasterserverInfo[i].m_LastSend+Freq < Now) { m_aMasterserverInfo[i].m_LastSend = Now; RegisterSendCountRequest(m_aMasterserverInfo[i].m_Addr); } } } // check if we are done or timed out if(Left == 0 || Now > m_RegisterStateStart+Freq*3) { // choose server int Best = -1; int i; for(i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) { if(!m_aMasterserverInfo[i].m_Valid || m_aMasterserverInfo[i].m_Count == -1) continue; if(Best == -1 || m_aMasterserverInfo[i].m_Count < m_aMasterserverInfo[Best].m_Count) Best = i; } // server chosen m_RegisterRegisteredServer = Best; if(m_RegisterRegisteredServer == -1) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "WARNING: No master servers. Retrying in 60 seconds"); RegisterNewState(REGISTERSTATE_ERROR); } else { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "chose '%s' as master, sending heartbeats", m_pMasterServer->GetName(m_RegisterRegisteredServer)); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", aBuf); m_aMasterserverInfo[m_RegisterRegisteredServer].m_LastSend = 0; RegisterNewState(REGISTERSTATE_HEARTBEAT); } } } else if(m_RegisterState == REGISTERSTATE_HEARTBEAT) { // check if we should send heartbeat if(Now > m_aMasterserverInfo[m_RegisterRegisteredServer].m_LastSend+Freq*15) { m_aMasterserverInfo[m_RegisterRegisteredServer].m_LastSend = Now; RegisterSendHeartbeat(m_aMasterserverInfo[m_RegisterRegisteredServer].m_Addr); } if(Now > m_RegisterStateStart+Freq*60) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "WARNING: Master server is not responding, switching master"); RegisterNewState(REGISTERSTATE_START); } } else if(m_RegisterState == REGISTERSTATE_REGISTERED) { if(m_RegisterFirst) m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "server registered"); m_RegisterFirst = 0; // check if we should send new heartbeat again if(Now > m_RegisterStateStart+Freq) { if(m_RegisterCount == 120) // redo the whole process after 60 minutes to balance out the master servers RegisterNewState(REGISTERSTATE_START); else { m_RegisterCount++; RegisterNewState(REGISTERSTATE_HEARTBEAT); } } } else if(m_RegisterState == REGISTERSTATE_ERROR) { // check for restart if(Now > m_RegisterStateStart+Freq*60) RegisterNewState(REGISTERSTATE_START); } } int CRegister::RegisterProcessPacket(CNetChunk *pPacket) { // check for masterserver address bool Valid = false; NETADDR Addr1 = pPacket->m_Address; Addr1.port = 0; for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++) { NETADDR Addr2 = m_aMasterserverInfo[i].m_Addr; Addr2.port = 0; if(net_addr_comp(&Addr1, &Addr2) == 0) { Valid = true; break; } } if(!Valid) return 0; if(pPacket->m_DataSize == sizeof(SERVERBROWSE_FWCHECK) && mem_comp(pPacket->m_pData, SERVERBROWSE_FWCHECK, sizeof(SERVERBROWSE_FWCHECK)) == 0) { RegisterSendFwcheckresponse(&pPacket->m_Address); return 1; } else if(pPacket->m_DataSize == sizeof(SERVERBROWSE_FWOK) && mem_comp(pPacket->m_pData, SERVERBROWSE_FWOK, sizeof(SERVERBROWSE_FWOK)) == 0) { if(m_RegisterFirst) m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "no firewall/nat problems detected"); RegisterNewState(REGISTERSTATE_REGISTERED); return 1; } else if(pPacket->m_DataSize == sizeof(SERVERBROWSE_FWERROR) && mem_comp(pPacket->m_pData, SERVERBROWSE_FWERROR, sizeof(SERVERBROWSE_FWERROR)) == 0) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "ERROR: the master server reports that clients can not connect to this server."); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "ERROR: configure your firewall/nat to let through udp on port %d.", g_Config.m_SvPort); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", aBuf); RegisterNewState(REGISTERSTATE_ERROR); return 1; } else if(pPacket->m_DataSize == sizeof(SERVERBROWSE_COUNT)+2 && mem_comp(pPacket->m_pData, SERVERBROWSE_COUNT, sizeof(SERVERBROWSE_COUNT)) == 0) { RegisterGotCount(pPacket); return 1; } return 0; } teeworlds-0.6.2+dfsg/src/engine/server/register.h0000644000175000017500000000245512140200333020777 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SERVER_REGISTER_H #define ENGINE_SERVER_REGISTER_H class CRegister { enum { REGISTERSTATE_START=0, REGISTERSTATE_UPDATE_ADDRS, REGISTERSTATE_QUERY_COUNT, REGISTERSTATE_HEARTBEAT, REGISTERSTATE_REGISTERED, REGISTERSTATE_ERROR }; struct CMasterserverInfo { NETADDR m_Addr; int m_Count; int m_Valid; int64 m_LastSend; }; class CNetServer *m_pNetServer; class IEngineMasterServer *m_pMasterServer; class IConsole *m_pConsole; int m_RegisterState; int64 m_RegisterStateStart; int m_RegisterFirst; int m_RegisterCount; CMasterserverInfo m_aMasterserverInfo[IMasterServer::MAX_MASTERSERVERS]; int m_RegisterRegisteredServer; void RegisterNewState(int State); void RegisterSendFwcheckresponse(NETADDR *pAddr); void RegisterSendHeartbeat(NETADDR Addr); void RegisterSendCountRequest(NETADDR Addr); void RegisterGotCount(struct CNetChunk *pChunk); public: CRegister(); void Init(class CNetServer *pNetServer, class IEngineMasterServer *pMasterServer, class IConsole *pConsole); void RegisterUpdate(int Nettype); int RegisterProcessPacket(struct CNetChunk *pPacket); }; #endif teeworlds-0.6.2+dfsg/src/engine/server/server.cpp0000644000175000017500000014016112140200333021011 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "register.h" #include "server.h" #if defined(CONF_FAMILY_WINDOWS) #define _WIN32_WINNT 0x0501 #define WIN32_LEAN_AND_MEAN #include #endif static const char *StrLtrim(const char *pStr) { while(*pStr && *pStr >= 0 && *pStr <= 32) pStr++; return pStr; } static void StrRtrim(char *pStr) { int i = str_length(pStr); while(i >= 0) { if(pStr[i] < 0 || pStr[i] > 32) break; pStr[i] = 0; i--; } } CSnapIDPool::CSnapIDPool() { Reset(); } void CSnapIDPool::Reset() { for(int i = 0; i < MAX_IDS; i++) { m_aIDs[i].m_Next = i+1; m_aIDs[i].m_State = 0; } m_aIDs[MAX_IDS-1].m_Next = -1; m_FirstFree = 0; m_FirstTimed = -1; m_LastTimed = -1; m_Usage = 0; m_InUsage = 0; } void CSnapIDPool::RemoveFirstTimeout() { int NextTimed = m_aIDs[m_FirstTimed].m_Next; // add it to the free list m_aIDs[m_FirstTimed].m_Next = m_FirstFree; m_aIDs[m_FirstTimed].m_State = 0; m_FirstFree = m_FirstTimed; // remove it from the timed list m_FirstTimed = NextTimed; if(m_FirstTimed == -1) m_LastTimed = -1; m_Usage--; } int CSnapIDPool::NewID() { int64 Now = time_get(); // process timed ids while(m_FirstTimed != -1 && m_aIDs[m_FirstTimed].m_Timeout < Now) RemoveFirstTimeout(); int ID = m_FirstFree; dbg_assert(ID != -1, "id error"); if(ID == -1) return ID; m_FirstFree = m_aIDs[m_FirstFree].m_Next; m_aIDs[ID].m_State = 1; m_Usage++; m_InUsage++; return ID; } void CSnapIDPool::TimeoutIDs() { // process timed ids while(m_FirstTimed != -1) RemoveFirstTimeout(); } void CSnapIDPool::FreeID(int ID) { if(ID < 0) return; dbg_assert(m_aIDs[ID].m_State == 1, "id is not alloced"); m_InUsage--; m_aIDs[ID].m_State = 2; m_aIDs[ID].m_Timeout = time_get()+time_freq()*5; m_aIDs[ID].m_Next = -1; if(m_LastTimed != -1) { m_aIDs[m_LastTimed].m_Next = ID; m_LastTimed = ID; } else { m_FirstTimed = ID; m_LastTimed = ID; } } void CServerBan::InitServerBan(IConsole *pConsole, IStorage *pStorage, CServer* pServer) { CNetBan::Init(pConsole, pStorage); m_pServer = pServer; // overwrites base command, todo: improve this Console()->Register("ban", "s?ir", CFGFLAG_SERVER|CFGFLAG_STORE, ConBanExt, this, "Ban player with ip/client id for x minutes for any reason"); } template int CServerBan::BanExt(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason) { // validate address if(Server()->m_RconClientID >= 0 && Server()->m_RconClientID < MAX_CLIENTS && Server()->m_aClients[Server()->m_RconClientID].m_State != CServer::CClient::STATE_EMPTY) { if(NetMatch(pData, Server()->m_NetServer.ClientAddr(Server()->m_RconClientID))) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (you can't ban yourself)"); return -1; } for(int i = 0; i < MAX_CLIENTS; ++i) { if(i == Server()->m_RconClientID || Server()->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY) continue; if(Server()->m_aClients[i].m_Authed >= Server()->m_RconAuthLevel && NetMatch(pData, Server()->m_NetServer.ClientAddr(i))) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (command denied)"); return -1; } } } else if(Server()->m_RconClientID == IServer::RCON_CID_VOTE) { for(int i = 0; i < MAX_CLIENTS; ++i) { if(Server()->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY) continue; if(Server()->m_aClients[i].m_Authed != CServer::AUTHED_NO && NetMatch(pData, Server()->m_NetServer.ClientAddr(i))) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (command denied)"); return -1; } } } int Result = Ban(pBanPool, pData, Seconds, pReason); if(Result != 0) return Result; // drop banned clients typename T::CDataType Data = *pData; for(int i = 0; i < MAX_CLIENTS; ++i) { if(Server()->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY) continue; if(NetMatch(&Data, Server()->m_NetServer.ClientAddr(i))) { CNetHash NetHash(&Data); char aBuf[256]; MakeBanInfo(pBanPool->Find(&Data, &NetHash), aBuf, sizeof(aBuf), MSGTYPE_PLAYER); Server()->m_NetServer.Drop(i, aBuf); } } return Result; } int CServerBan::BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason) { return BanExt(&m_BanAddrPool, pAddr, Seconds, pReason); } int CServerBan::BanRange(const CNetRange *pRange, int Seconds, const char *pReason) { if(pRange->IsValid()) return BanExt(&m_BanRangePool, pRange, Seconds, pReason); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban failed (invalid range)"); return -1; } void CServerBan::ConBanExt(IConsole::IResult *pResult, void *pUser) { CServerBan *pThis = static_cast(pUser); const char *pStr = pResult->GetString(0); int Minutes = pResult->NumArguments()>1 ? clamp(pResult->GetInteger(1), 0, 44640) : 30; const char *pReason = pResult->NumArguments()>2 ? pResult->GetString(2) : "No reason given"; if(StrAllnum(pStr)) { int ClientID = str_toint(pStr); if(ClientID < 0 || ClientID >= MAX_CLIENTS || pThis->Server()->m_aClients[ClientID].m_State == CServer::CClient::STATE_EMPTY) pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (invalid client id)"); else pThis->BanAddr(pThis->Server()->m_NetServer.ClientAddr(ClientID), Minutes*60, pReason); } else ConBan(pResult, pUser); } void CServer::CClient::Reset() { // reset input for(int i = 0; i < 200; i++) m_aInputs[i].m_GameTick = -1; m_CurrentInput = 0; mem_zero(&m_LatestInput, sizeof(m_LatestInput)); m_Snapshots.PurgeAll(); m_LastAckedSnapshot = -1; m_LastInputTick = -1; m_SnapRate = CClient::SNAPRATE_INIT; m_Score = 0; } CServer::CServer() : m_DemoRecorder(&m_SnapshotDelta) { m_TickSpeed = SERVER_TICK_SPEED; m_pGameServer = 0; m_CurrentGameTick = 0; m_RunServer = 1; m_pCurrentMapData = 0; m_CurrentMapSize = 0; m_MapReload = 0; m_RconClientID = IServer::RCON_CID_SERV; m_RconAuthLevel = AUTHED_ADMIN; Init(); } int CServer::TrySetClientName(int ClientID, const char *pName) { char aTrimmedName[64]; // trim the name str_copy(aTrimmedName, StrLtrim(pName), sizeof(aTrimmedName)); StrRtrim(aTrimmedName); // check for empty names if(!aTrimmedName[0]) return -1; // check if new and old name are the same if(m_aClients[ClientID].m_aName[0] && str_comp(m_aClients[ClientID].m_aName, aTrimmedName) == 0) return 0; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "'%s' -> '%s'", pName, aTrimmedName); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf); pName = aTrimmedName; // make sure that two clients doesn't have the same name for(int i = 0; i < MAX_CLIENTS; i++) if(i != ClientID && m_aClients[i].m_State >= CClient::STATE_READY) { if(str_comp(pName, m_aClients[i].m_aName) == 0) return -1; } // set the client name str_copy(m_aClients[ClientID].m_aName, pName, MAX_NAME_LENGTH); return 0; } void CServer::SetClientName(int ClientID, const char *pName) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State < CClient::STATE_READY) return; if(!pName) return; char aCleanName[MAX_NAME_LENGTH]; str_copy(aCleanName, pName, sizeof(aCleanName)); // clear name for(char *p = aCleanName; *p; ++p) { if(*p < 32) *p = ' '; } if(TrySetClientName(ClientID, aCleanName)) { // auto rename for(int i = 1;; i++) { char aNameTry[MAX_NAME_LENGTH]; str_format(aNameTry, sizeof(aCleanName), "(%d)%s", i, aCleanName); if(TrySetClientName(ClientID, aNameTry) == 0) break; } } } void CServer::SetClientClan(int ClientID, const char *pClan) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State < CClient::STATE_READY || !pClan) return; str_copy(m_aClients[ClientID].m_aClan, pClan, MAX_CLAN_LENGTH); } void CServer::SetClientCountry(int ClientID, int Country) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State < CClient::STATE_READY) return; m_aClients[ClientID].m_Country = Country; } void CServer::SetClientScore(int ClientID, int Score) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State < CClient::STATE_READY) return; m_aClients[ClientID].m_Score = Score; } void CServer::Kick(int ClientID, const char *pReason) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State == CClient::STATE_EMPTY) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "invalid client id to kick"); return; } else if(m_RconClientID == ClientID) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "you can't kick yourself"); return; } else if(m_aClients[ClientID].m_Authed > m_RconAuthLevel) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "kick command denied"); return; } m_NetServer.Drop(ClientID, pReason); } /*int CServer::Tick() { return m_CurrentGameTick; }*/ int64 CServer::TickStartTime(int Tick) { return m_GameStartTime + (time_freq()*Tick)/SERVER_TICK_SPEED; } /*int CServer::TickSpeed() { return SERVER_TICK_SPEED; }*/ int CServer::Init() { for(int i = 0; i < MAX_CLIENTS; i++) { m_aClients[i].m_State = CClient::STATE_EMPTY; m_aClients[i].m_aName[0] = 0; m_aClients[i].m_aClan[0] = 0; m_aClients[i].m_Country = -1; m_aClients[i].m_Snapshots.Init(); } m_CurrentGameTick = 0; return 0; } void CServer::SetRconCID(int ClientID) { m_RconClientID = ClientID; } bool CServer::IsAuthed(int ClientID) { return m_aClients[ClientID].m_Authed; } int CServer::GetClientInfo(int ClientID, CClientInfo *pInfo) { dbg_assert(ClientID >= 0 && ClientID < MAX_CLIENTS, "client_id is not valid"); dbg_assert(pInfo != 0, "info can not be null"); if(m_aClients[ClientID].m_State == CClient::STATE_INGAME) { pInfo->m_pName = m_aClients[ClientID].m_aName; pInfo->m_Latency = m_aClients[ClientID].m_Latency; return 1; } return 0; } void CServer::GetClientAddr(int ClientID, char *pAddrStr, int Size) { if(ClientID >= 0 && ClientID < MAX_CLIENTS && m_aClients[ClientID].m_State == CClient::STATE_INGAME) net_addr_str(m_NetServer.ClientAddr(ClientID), pAddrStr, Size, false); } const char *CServer::ClientName(int ClientID) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State == CServer::CClient::STATE_EMPTY) return "(invalid)"; if(m_aClients[ClientID].m_State == CServer::CClient::STATE_INGAME) return m_aClients[ClientID].m_aName; else return "(connecting)"; } const char *CServer::ClientClan(int ClientID) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State == CServer::CClient::STATE_EMPTY) return ""; if(m_aClients[ClientID].m_State == CServer::CClient::STATE_INGAME) return m_aClients[ClientID].m_aClan; else return ""; } int CServer::ClientCountry(int ClientID) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || m_aClients[ClientID].m_State == CServer::CClient::STATE_EMPTY) return -1; if(m_aClients[ClientID].m_State == CServer::CClient::STATE_INGAME) return m_aClients[ClientID].m_Country; else return -1; } bool CServer::ClientIngame(int ClientID) { return ClientID >= 0 && ClientID < MAX_CLIENTS && m_aClients[ClientID].m_State == CServer::CClient::STATE_INGAME; } int CServer::MaxClients() const { return m_NetServer.MaxClients(); } int CServer::SendMsg(CMsgPacker *pMsg, int Flags, int ClientID) { return SendMsgEx(pMsg, Flags, ClientID, false); } int CServer::SendMsgEx(CMsgPacker *pMsg, int Flags, int ClientID, bool System) { CNetChunk Packet; if(!pMsg) return -1; mem_zero(&Packet, sizeof(CNetChunk)); Packet.m_ClientID = ClientID; Packet.m_pData = pMsg->Data(); Packet.m_DataSize = pMsg->Size(); // HACK: modify the message id in the packet and store the system flag *((unsigned char*)Packet.m_pData) <<= 1; if(System) *((unsigned char*)Packet.m_pData) |= 1; if(Flags&MSGFLAG_VITAL) Packet.m_Flags |= NETSENDFLAG_VITAL; if(Flags&MSGFLAG_FLUSH) Packet.m_Flags |= NETSENDFLAG_FLUSH; // write message to demo recorder if(!(Flags&MSGFLAG_NORECORD)) m_DemoRecorder.RecordMessage(pMsg->Data(), pMsg->Size()); if(!(Flags&MSGFLAG_NOSEND)) { if(ClientID == -1) { // broadcast int i; for(i = 0; i < MAX_CLIENTS; i++) if(m_aClients[i].m_State == CClient::STATE_INGAME) { Packet.m_ClientID = i; m_NetServer.Send(&Packet); } } else m_NetServer.Send(&Packet); } return 0; } void CServer::DoSnapshot() { GameServer()->OnPreSnap(); // create snapshot for demo recording if(m_DemoRecorder.IsRecording()) { char aData[CSnapshot::MAX_SIZE]; int SnapshotSize; // build snap and possibly add some messages m_SnapshotBuilder.Init(); GameServer()->OnSnap(-1); SnapshotSize = m_SnapshotBuilder.Finish(aData); // write snapshot m_DemoRecorder.RecordSnapshot(Tick(), aData, SnapshotSize); } // create snapshots for all clients for(int i = 0; i < MAX_CLIENTS; i++) { // client must be ingame to recive snapshots if(m_aClients[i].m_State != CClient::STATE_INGAME) continue; // this client is trying to recover, don't spam snapshots if(m_aClients[i].m_SnapRate == CClient::SNAPRATE_RECOVER && (Tick()%50) != 0) continue; // this client is trying to recover, don't spam snapshots if(m_aClients[i].m_SnapRate == CClient::SNAPRATE_INIT && (Tick()%10) != 0) continue; { char aData[CSnapshot::MAX_SIZE]; CSnapshot *pData = (CSnapshot*)aData; // Fix compiler warning for strict-aliasing char aDeltaData[CSnapshot::MAX_SIZE]; char aCompData[CSnapshot::MAX_SIZE]; int SnapshotSize; int Crc; static CSnapshot EmptySnap; CSnapshot *pDeltashot = &EmptySnap; int DeltashotSize; int DeltaTick = -1; int DeltaSize; m_SnapshotBuilder.Init(); GameServer()->OnSnap(i); // finish snapshot SnapshotSize = m_SnapshotBuilder.Finish(pData); Crc = pData->Crc(); // remove old snapshos // keep 3 seconds worth of snapshots m_aClients[i].m_Snapshots.PurgeUntil(m_CurrentGameTick-SERVER_TICK_SPEED*3); // save it the snapshot m_aClients[i].m_Snapshots.Add(m_CurrentGameTick, time_get(), SnapshotSize, pData, 0); // find snapshot that we can preform delta against EmptySnap.Clear(); { DeltashotSize = m_aClients[i].m_Snapshots.Get(m_aClients[i].m_LastAckedSnapshot, 0, &pDeltashot, 0); if(DeltashotSize >= 0) DeltaTick = m_aClients[i].m_LastAckedSnapshot; else { // no acked package found, force client to recover rate if(m_aClients[i].m_SnapRate == CClient::SNAPRATE_FULL) m_aClients[i].m_SnapRate = CClient::SNAPRATE_RECOVER; } } // create delta DeltaSize = m_SnapshotDelta.CreateDelta(pDeltashot, pData, aDeltaData); if(DeltaSize) { // compress it int SnapshotSize; const int MaxSize = MAX_SNAPSHOT_PACKSIZE; int NumPackets; SnapshotSize = CVariableInt::Compress(aDeltaData, DeltaSize, aCompData); NumPackets = (SnapshotSize+MaxSize-1)/MaxSize; for(int n = 0, Left = SnapshotSize; Left; n++) { int Chunk = Left < MaxSize ? Left : MaxSize; Left -= Chunk; if(NumPackets == 1) { CMsgPacker Msg(NETMSG_SNAPSINGLE); Msg.AddInt(m_CurrentGameTick); Msg.AddInt(m_CurrentGameTick-DeltaTick); Msg.AddInt(Crc); Msg.AddInt(Chunk); Msg.AddRaw(&aCompData[n*MaxSize], Chunk); SendMsgEx(&Msg, MSGFLAG_FLUSH, i, true); } else { CMsgPacker Msg(NETMSG_SNAP); Msg.AddInt(m_CurrentGameTick); Msg.AddInt(m_CurrentGameTick-DeltaTick); Msg.AddInt(NumPackets); Msg.AddInt(n); Msg.AddInt(Crc); Msg.AddInt(Chunk); Msg.AddRaw(&aCompData[n*MaxSize], Chunk); SendMsgEx(&Msg, MSGFLAG_FLUSH, i, true); } } } else { CMsgPacker Msg(NETMSG_SNAPEMPTY); Msg.AddInt(m_CurrentGameTick); Msg.AddInt(m_CurrentGameTick-DeltaTick); SendMsgEx(&Msg, MSGFLAG_FLUSH, i, true); } } } GameServer()->OnPostSnap(); } int CServer::NewClientCallback(int ClientID, void *pUser) { CServer *pThis = (CServer *)pUser; pThis->m_aClients[ClientID].m_State = CClient::STATE_AUTH; pThis->m_aClients[ClientID].m_aName[0] = 0; pThis->m_aClients[ClientID].m_aClan[0] = 0; pThis->m_aClients[ClientID].m_Country = -1; pThis->m_aClients[ClientID].m_Authed = AUTHED_NO; pThis->m_aClients[ClientID].m_AuthTries = 0; pThis->m_aClients[ClientID].m_pRconCmdToSend = 0; pThis->m_aClients[ClientID].Reset(); return 0; } int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser) { CServer *pThis = (CServer *)pUser; char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pThis->m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "client dropped. cid=%d addr=%s reason='%s'", ClientID, aAddrStr, pReason); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf); // notify the mod about the drop if(pThis->m_aClients[ClientID].m_State >= CClient::STATE_READY) pThis->GameServer()->OnClientDrop(ClientID, pReason); pThis->m_aClients[ClientID].m_State = CClient::STATE_EMPTY; pThis->m_aClients[ClientID].m_aName[0] = 0; pThis->m_aClients[ClientID].m_aClan[0] = 0; pThis->m_aClients[ClientID].m_Country = -1; pThis->m_aClients[ClientID].m_Authed = AUTHED_NO; pThis->m_aClients[ClientID].m_AuthTries = 0; pThis->m_aClients[ClientID].m_pRconCmdToSend = 0; pThis->m_aClients[ClientID].m_Snapshots.PurgeAll(); return 0; } void CServer::SendMap(int ClientID) { CMsgPacker Msg(NETMSG_MAP_CHANGE); Msg.AddString(GetMapName(), 0); Msg.AddInt(m_CurrentMapCrc); Msg.AddInt(m_CurrentMapSize); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID, true); } void CServer::SendConnectionReady(int ClientID) { CMsgPacker Msg(NETMSG_CON_READY); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID, true); } void CServer::SendRconLine(int ClientID, const char *pLine) { CMsgPacker Msg(NETMSG_RCON_LINE); Msg.AddString(pLine, 512); SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true); } void CServer::SendRconLineAuthed(const char *pLine, void *pUser) { CServer *pThis = (CServer *)pUser; static volatile int ReentryGuard = 0; int i; if(ReentryGuard) return; ReentryGuard++; for(i = 0; i < MAX_CLIENTS; i++) { if(pThis->m_aClients[i].m_State != CClient::STATE_EMPTY && pThis->m_aClients[i].m_Authed >= pThis->m_RconAuthLevel) pThis->SendRconLine(i, pLine); } ReentryGuard--; } void CServer::SendRconCmdAdd(const IConsole::CCommandInfo *pCommandInfo, int ClientID) { CMsgPacker Msg(NETMSG_RCON_CMD_ADD); Msg.AddString(pCommandInfo->m_pName, IConsole::TEMPCMD_NAME_LENGTH); Msg.AddString(pCommandInfo->m_pHelp, IConsole::TEMPCMD_HELP_LENGTH); Msg.AddString(pCommandInfo->m_pParams, IConsole::TEMPCMD_PARAMS_LENGTH); SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true); } void CServer::SendRconCmdRem(const IConsole::CCommandInfo *pCommandInfo, int ClientID) { CMsgPacker Msg(NETMSG_RCON_CMD_REM); Msg.AddString(pCommandInfo->m_pName, 256); SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true); } void CServer::UpdateClientRconCommands() { int ClientID = Tick() % MAX_CLIENTS; if(m_aClients[ClientID].m_State != CClient::STATE_EMPTY && m_aClients[ClientID].m_Authed) { int ConsoleAccessLevel = m_aClients[ClientID].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : IConsole::ACCESS_LEVEL_MOD; for(int i = 0; i < MAX_RCONCMD_SEND && m_aClients[ClientID].m_pRconCmdToSend; ++i) { SendRconCmdAdd(m_aClients[ClientID].m_pRconCmdToSend, ClientID); m_aClients[ClientID].m_pRconCmdToSend = m_aClients[ClientID].m_pRconCmdToSend->NextCommandInfo(ConsoleAccessLevel, CFGFLAG_SERVER); } } } void CServer::ProcessClientPacket(CNetChunk *pPacket) { int ClientID = pPacket->m_ClientID; CUnpacker Unpacker; Unpacker.Reset(pPacket->m_pData, pPacket->m_DataSize); // unpack msgid and system flag int Msg = Unpacker.GetInt(); int Sys = Msg&1; Msg >>= 1; if(Unpacker.Error()) return; if(Sys) { // system message if(Msg == NETMSG_INFO) { if(m_aClients[ClientID].m_State == CClient::STATE_AUTH) { const char *pVersion = Unpacker.GetString(CUnpacker::SANITIZE_CC); if(str_comp(pVersion, GameServer()->NetVersion()) != 0) { // wrong version char aReason[256]; str_format(aReason, sizeof(aReason), "Wrong version. Server is running '%s' and client '%s'", GameServer()->NetVersion(), pVersion); m_NetServer.Drop(ClientID, aReason); return; } const char *pPassword = Unpacker.GetString(CUnpacker::SANITIZE_CC); if(g_Config.m_Password[0] != 0 && str_comp(g_Config.m_Password, pPassword) != 0) { // wrong password m_NetServer.Drop(ClientID, "Wrong password"); return; } m_aClients[ClientID].m_State = CClient::STATE_CONNECTING; SendMap(ClientID); } } else if(Msg == NETMSG_REQUEST_MAP_DATA) { if(m_aClients[ClientID].m_State < CClient::STATE_CONNECTING) return; int Chunk = Unpacker.GetInt(); int ChunkSize = 1024-128; int Offset = Chunk * ChunkSize; int Last = 0; // drop faulty map data requests if(Chunk < 0 || Offset > m_CurrentMapSize) return; if(Offset+ChunkSize >= m_CurrentMapSize) { ChunkSize = m_CurrentMapSize-Offset; if(ChunkSize < 0) ChunkSize = 0; Last = 1; } CMsgPacker Msg(NETMSG_MAP_DATA); Msg.AddInt(Last); Msg.AddInt(m_CurrentMapCrc); Msg.AddInt(Chunk); Msg.AddInt(ChunkSize); Msg.AddRaw(&m_pCurrentMapData[Offset], ChunkSize); SendMsgEx(&Msg, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID, true); if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "sending chunk %d with size %d", Chunk, ChunkSize); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "server", aBuf); } } else if(Msg == NETMSG_READY) { if(m_aClients[ClientID].m_State == CClient::STATE_CONNECTING) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "player is ready. ClientID=%x addr=%s", ClientID, aAddrStr); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf); m_aClients[ClientID].m_State = CClient::STATE_READY; GameServer()->OnClientConnected(ClientID); SendConnectionReady(ClientID); } } else if(Msg == NETMSG_ENTERGAME) { if(m_aClients[ClientID].m_State == CClient::STATE_READY && GameServer()->IsClientReady(ClientID)) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(m_NetServer.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "player has entered the game. ClientID=%x addr=%s", ClientID, aAddrStr); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); m_aClients[ClientID].m_State = CClient::STATE_INGAME; GameServer()->OnClientEnter(ClientID); } } else if(Msg == NETMSG_INPUT) { CClient::CInput *pInput; int64 TagTime; m_aClients[ClientID].m_LastAckedSnapshot = Unpacker.GetInt(); int IntendedTick = Unpacker.GetInt(); int Size = Unpacker.GetInt(); // check for errors if(Unpacker.Error() || Size/4 > MAX_INPUT_SIZE) return; if(m_aClients[ClientID].m_LastAckedSnapshot > 0) m_aClients[ClientID].m_SnapRate = CClient::SNAPRATE_FULL; if(m_aClients[ClientID].m_Snapshots.Get(m_aClients[ClientID].m_LastAckedSnapshot, &TagTime, 0, 0) >= 0) m_aClients[ClientID].m_Latency = (int)(((time_get()-TagTime)*1000)/time_freq()); // add message to report the input timing // skip packets that are old if(IntendedTick > m_aClients[ClientID].m_LastInputTick) { int TimeLeft = ((TickStartTime(IntendedTick)-time_get())*1000) / time_freq(); CMsgPacker Msg(NETMSG_INPUTTIMING); Msg.AddInt(IntendedTick); Msg.AddInt(TimeLeft); SendMsgEx(&Msg, 0, ClientID, true); } m_aClients[ClientID].m_LastInputTick = IntendedTick; pInput = &m_aClients[ClientID].m_aInputs[m_aClients[ClientID].m_CurrentInput]; if(IntendedTick <= Tick()) IntendedTick = Tick()+1; pInput->m_GameTick = IntendedTick; for(int i = 0; i < Size/4; i++) pInput->m_aData[i] = Unpacker.GetInt(); mem_copy(m_aClients[ClientID].m_LatestInput.m_aData, pInput->m_aData, MAX_INPUT_SIZE*sizeof(int)); m_aClients[ClientID].m_CurrentInput++; m_aClients[ClientID].m_CurrentInput %= 200; // call the mod with the fresh input data if(m_aClients[ClientID].m_State == CClient::STATE_INGAME) GameServer()->OnClientDirectInput(ClientID, m_aClients[ClientID].m_LatestInput.m_aData); } else if(Msg == NETMSG_RCON_CMD) { const char *pCmd = Unpacker.GetString(); if(Unpacker.Error() == 0 && m_aClients[ClientID].m_Authed) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "ClientID=%d rcon='%s'", ClientID, pCmd); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf); m_RconClientID = ClientID; m_RconAuthLevel = m_aClients[ClientID].m_Authed; Console()->SetAccessLevel(m_aClients[ClientID].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : IConsole::ACCESS_LEVEL_MOD); Console()->ExecuteLineFlag(pCmd, CFGFLAG_SERVER); Console()->SetAccessLevel(IConsole::ACCESS_LEVEL_ADMIN); m_RconClientID = IServer::RCON_CID_SERV; m_RconAuthLevel = AUTHED_ADMIN; } } else if(Msg == NETMSG_RCON_AUTH) { const char *pPw; Unpacker.GetString(); // login name, not used pPw = Unpacker.GetString(CUnpacker::SANITIZE_CC); if(Unpacker.Error() == 0) { if(g_Config.m_SvRconPassword[0] == 0 && g_Config.m_SvRconModPassword[0] == 0) { SendRconLine(ClientID, "No rcon password set on server. Set sv_rcon_password and/or sv_rcon_mod_password to enable the remote console."); } else if(g_Config.m_SvRconPassword[0] && str_comp(pPw, g_Config.m_SvRconPassword) == 0) { CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS); Msg.AddInt(1); //authed Msg.AddInt(1); //cmdlist SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true); m_aClients[ClientID].m_Authed = AUTHED_ADMIN; int SendRconCmds = Unpacker.GetInt(); if(Unpacker.Error() == 0 && SendRconCmds) m_aClients[ClientID].m_pRconCmdToSend = Console()->FirstCommandInfo(IConsole::ACCESS_LEVEL_ADMIN, CFGFLAG_SERVER); SendRconLine(ClientID, "Admin authentication successful. Full remote console access granted."); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "ClientID=%d authed (admin)", ClientID); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); } else if(g_Config.m_SvRconModPassword[0] && str_comp(pPw, g_Config.m_SvRconModPassword) == 0) { CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS); Msg.AddInt(1); //authed Msg.AddInt(1); //cmdlist SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true); m_aClients[ClientID].m_Authed = AUTHED_MOD; int SendRconCmds = Unpacker.GetInt(); if(Unpacker.Error() == 0 && SendRconCmds) m_aClients[ClientID].m_pRconCmdToSend = Console()->FirstCommandInfo(IConsole::ACCESS_LEVEL_MOD, CFGFLAG_SERVER); SendRconLine(ClientID, "Moderator authentication successful. Limited remote console access granted."); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "ClientID=%d authed (moderator)", ClientID); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); } else if(g_Config.m_SvRconMaxTries) { m_aClients[ClientID].m_AuthTries++; char aBuf[128]; str_format(aBuf, sizeof(aBuf), "Wrong password %d/%d.", m_aClients[ClientID].m_AuthTries, g_Config.m_SvRconMaxTries); SendRconLine(ClientID, aBuf); if(m_aClients[ClientID].m_AuthTries >= g_Config.m_SvRconMaxTries) { if(!g_Config.m_SvRconBantime) m_NetServer.Drop(ClientID, "Too many remote console authentication tries"); else m_ServerBan.BanAddr(m_NetServer.ClientAddr(ClientID), g_Config.m_SvRconBantime*60, "Too many remote console authentication tries"); } } else { SendRconLine(ClientID, "Wrong password."); } } } else if(Msg == NETMSG_PING) { CMsgPacker Msg(NETMSG_PING_REPLY); SendMsgEx(&Msg, 0, ClientID, true); } else { if(g_Config.m_Debug) { char aHex[] = "0123456789ABCDEF"; char aBuf[512]; for(int b = 0; b < pPacket->m_DataSize && b < 32; b++) { aBuf[b*3] = aHex[((const unsigned char *)pPacket->m_pData)[b]>>4]; aBuf[b*3+1] = aHex[((const unsigned char *)pPacket->m_pData)[b]&0xf]; aBuf[b*3+2] = ' '; aBuf[b*3+3] = 0; } char aBufMsg[256]; str_format(aBufMsg, sizeof(aBufMsg), "strange message ClientID=%d msg=%d data_size=%d", ClientID, Msg, pPacket->m_DataSize); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "server", aBufMsg); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "server", aBuf); } } } else { // game message if(m_aClients[ClientID].m_State >= CClient::STATE_READY) GameServer()->OnMessage(Msg, &Unpacker, ClientID); } } void CServer::SendServerInfo(const NETADDR *pAddr, int Token) { CNetChunk Packet; CPacker p; char aBuf[128]; // count the players int PlayerCount = 0, ClientCount = 0; for(int i = 0; i < MAX_CLIENTS; i++) { if(m_aClients[i].m_State != CClient::STATE_EMPTY) { if(GameServer()->IsClientPlayer(i)) PlayerCount++; ClientCount++; } } p.Reset(); p.AddRaw(SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO)); str_format(aBuf, sizeof(aBuf), "%d", Token); p.AddString(aBuf, 6); p.AddString(GameServer()->Version(), 32); p.AddString(g_Config.m_SvName, 64); p.AddString(GetMapName(), 32); // gametype p.AddString(GameServer()->GameType(), 16); // flags int i = 0; if(g_Config.m_Password[0]) // password set i |= SERVER_FLAG_PASSWORD; str_format(aBuf, sizeof(aBuf), "%d", i); p.AddString(aBuf, 2); str_format(aBuf, sizeof(aBuf), "%d", PlayerCount); p.AddString(aBuf, 3); // num players str_format(aBuf, sizeof(aBuf), "%d", m_NetServer.MaxClients()-g_Config.m_SvSpectatorSlots); p.AddString(aBuf, 3); // max players str_format(aBuf, sizeof(aBuf), "%d", ClientCount); p.AddString(aBuf, 3); // num clients str_format(aBuf, sizeof(aBuf), "%d", m_NetServer.MaxClients()); p.AddString(aBuf, 3); // max clients for(i = 0; i < MAX_CLIENTS; i++) { if(m_aClients[i].m_State != CClient::STATE_EMPTY) { p.AddString(ClientName(i), MAX_NAME_LENGTH); // client name p.AddString(ClientClan(i), MAX_CLAN_LENGTH); // client clan str_format(aBuf, sizeof(aBuf), "%d", m_aClients[i].m_Country); p.AddString(aBuf, 6); // client country str_format(aBuf, sizeof(aBuf), "%d", m_aClients[i].m_Score); p.AddString(aBuf, 6); // client score str_format(aBuf, sizeof(aBuf), "%d", GameServer()->IsClientPlayer(i)?1:0); p.AddString(aBuf, 2); // is player? } } Packet.m_ClientID = -1; Packet.m_Address = *pAddr; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = p.Size(); Packet.m_pData = p.Data(); m_NetServer.Send(&Packet); } void CServer::UpdateServerInfo() { for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_aClients[i].m_State != CClient::STATE_EMPTY) SendServerInfo(m_NetServer.ClientAddr(i), -1); } } void CServer::PumpNetwork() { CNetChunk Packet; m_NetServer.Update(); // process packets while(m_NetServer.Recv(&Packet)) { if(Packet.m_ClientID == -1) { // stateless if(!m_Register.RegisterProcessPacket(&Packet)) { if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETINFO)+1 && mem_comp(Packet.m_pData, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)) == 0) { SendServerInfo(&Packet.m_Address, ((unsigned char *)Packet.m_pData)[sizeof(SERVERBROWSE_GETINFO)]); } } } else ProcessClientPacket(&Packet); } m_ServerBan.Update(); m_Econ.Update(); } char *CServer::GetMapName() { // get the name of the map without his path char *pMapShortName = &g_Config.m_SvMap[0]; for(int i = 0; i < str_length(g_Config.m_SvMap)-1; i++) { if(g_Config.m_SvMap[i] == '/' || g_Config.m_SvMap[i] == '\\') pMapShortName = &g_Config.m_SvMap[i+1]; } return pMapShortName; } int CServer::LoadMap(const char *pMapName) { //DATAFILE *df; char aBuf[512]; str_format(aBuf, sizeof(aBuf), "maps/%s.map", pMapName); /*df = datafile_load(buf); if(!df) return 0;*/ // check for valid standard map if(!m_MapChecker.ReadAndValidateMap(Storage(), aBuf, IStorage::TYPE_ALL)) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mapchecker", "invalid standard map"); return 0; } if(!m_pMap->Load(aBuf)) return 0; // stop recording when we change map m_DemoRecorder.Stop(); // reinit snapshot ids m_IDPool.TimeoutIDs(); // get the crc of the map m_CurrentMapCrc = m_pMap->Crc(); char aBufMsg[256]; str_format(aBufMsg, sizeof(aBufMsg), "%s crc is %08x", aBuf, m_CurrentMapCrc); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBufMsg); str_copy(m_aCurrentMap, pMapName, sizeof(m_aCurrentMap)); //map_set(df); // load complete map into memory for download { IOHANDLE File = Storage()->OpenFile(aBuf, IOFLAG_READ, IStorage::TYPE_ALL); m_CurrentMapSize = (int)io_length(File); if(m_pCurrentMapData) mem_free(m_pCurrentMapData); m_pCurrentMapData = (unsigned char *)mem_alloc(m_CurrentMapSize, 1); io_read(File, m_pCurrentMapData, m_CurrentMapSize); io_close(File); } return 1; } void CServer::InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole) { m_Register.Init(pNetServer, pMasterServer, pConsole); } int CServer::Run() { // m_PrintCBIndex = Console()->RegisterPrintCallback(g_Config.m_ConsoleOutputLevel, SendRconLineAuthed, this); // load map if(!LoadMap(g_Config.m_SvMap)) { dbg_msg("server", "failed to load map. mapname='%s'", g_Config.m_SvMap); return -1; } // start server NETADDR BindAddr; if(g_Config.m_Bindaddr[0] && net_host_lookup(g_Config.m_Bindaddr, &BindAddr, NETTYPE_ALL) == 0) { // sweet! BindAddr.type = NETTYPE_ALL; BindAddr.port = g_Config.m_SvPort; } else { mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = g_Config.m_SvPort; } if(!m_NetServer.Open(BindAddr, &m_ServerBan, g_Config.m_SvMaxClients, g_Config.m_SvMaxClientsPerIP, 0)) { dbg_msg("server", "couldn't open socket. port %d might already be in use", g_Config.m_SvPort); return -1; } m_NetServer.SetCallbacks(NewClientCallback, DelClientCallback, this); m_Econ.Init(Console(), &m_ServerBan); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "server name is '%s'", g_Config.m_SvName); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); GameServer()->OnInit(); str_format(aBuf, sizeof(aBuf), "version %s", GameServer()->NetVersion()); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); // process pending commands m_pConsole->StoreCommands(false); // start game { int64 ReportTime = time_get(); int ReportInterval = 3; m_Lastheartbeat = 0; m_GameStartTime = time_get(); if(g_Config.m_Debug) { str_format(aBuf, sizeof(aBuf), "baseline memory usage %dk", mem_stats()->allocated/1024); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "server", aBuf); } while(m_RunServer) { int64 t = time_get(); int NewTicks = 0; // load new map TODO: don't poll this if(str_comp(g_Config.m_SvMap, m_aCurrentMap) != 0 || m_MapReload) { m_MapReload = 0; // load map if(LoadMap(g_Config.m_SvMap)) { // new map loaded GameServer()->OnShutdown(); for(int c = 0; c < MAX_CLIENTS; c++) { if(m_aClients[c].m_State <= CClient::STATE_AUTH) continue; SendMap(c); m_aClients[c].Reset(); m_aClients[c].m_State = CClient::STATE_CONNECTING; } m_GameStartTime = time_get(); m_CurrentGameTick = 0; Kernel()->ReregisterInterface(GameServer()); GameServer()->OnInit(); UpdateServerInfo(); } else { str_format(aBuf, sizeof(aBuf), "failed to load map. mapname='%s'", g_Config.m_SvMap); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); str_copy(g_Config.m_SvMap, m_aCurrentMap, sizeof(g_Config.m_SvMap)); } } while(t > TickStartTime(m_CurrentGameTick+1)) { m_CurrentGameTick++; NewTicks++; // apply new input for(int c = 0; c < MAX_CLIENTS; c++) { if(m_aClients[c].m_State == CClient::STATE_EMPTY) continue; for(int i = 0; i < 200; i++) { if(m_aClients[c].m_aInputs[i].m_GameTick == Tick()) { if(m_aClients[c].m_State == CClient::STATE_INGAME) GameServer()->OnClientPredictedInput(c, m_aClients[c].m_aInputs[i].m_aData); break; } } } GameServer()->OnTick(); } // snap game if(NewTicks) { if(g_Config.m_SvHighBandwidth || (m_CurrentGameTick%2) == 0) DoSnapshot(); UpdateClientRconCommands(); } // master server stuff m_Register.RegisterUpdate(m_NetServer.NetType()); PumpNetwork(); if(ReportTime < time_get()) { if(g_Config.m_Debug) { /* static NETSTATS prev_stats; NETSTATS stats; netserver_stats(net, &stats); perf_next(); if(config.dbg_pref) perf_dump(&rootscope); dbg_msg("server", "send=%8d recv=%8d", (stats.send_bytes - prev_stats.send_bytes)/reportinterval, (stats.recv_bytes - prev_stats.recv_bytes)/reportinterval); prev_stats = stats; */ } ReportTime += time_freq()*ReportInterval; } // wait for incomming data net_socket_read_wait(m_NetServer.Socket(), 5); } } // disconnect all clients on shutdown for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_aClients[i].m_State != CClient::STATE_EMPTY) m_NetServer.Drop(i, "Server shutdown"); m_Econ.Shutdown(); } GameServer()->OnShutdown(); m_pMap->Unload(); if(m_pCurrentMapData) mem_free(m_pCurrentMapData); return 0; } void CServer::ConKick(IConsole::IResult *pResult, void *pUser) { if(pResult->NumArguments() > 1) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "Kicked (%s)", pResult->GetString(1)); ((CServer *)pUser)->Kick(pResult->GetInteger(0), aBuf); } else ((CServer *)pUser)->Kick(pResult->GetInteger(0), "Kicked by console"); } void CServer::ConStatus(IConsole::IResult *pResult, void *pUser) { char aBuf[1024]; char aAddrStr[NETADDR_MAXSTRSIZE]; CServer* pThis = static_cast(pUser); for(int i = 0; i < MAX_CLIENTS; i++) { if(pThis->m_aClients[i].m_State != CClient::STATE_EMPTY) { net_addr_str(pThis->m_NetServer.ClientAddr(i), aAddrStr, sizeof(aAddrStr), true); if(pThis->m_aClients[i].m_State == CClient::STATE_INGAME) { const char *pAuthStr = pThis->m_aClients[i].m_Authed == CServer::AUTHED_ADMIN ? "(Admin)" : pThis->m_aClients[i].m_Authed == CServer::AUTHED_MOD ? "(Mod)" : ""; str_format(aBuf, sizeof(aBuf), "id=%d addr=%s name='%s' score=%d %s", i, aAddrStr, pThis->m_aClients[i].m_aName, pThis->m_aClients[i].m_Score, pAuthStr); } else str_format(aBuf, sizeof(aBuf), "id=%d addr=%s connecting", i, aAddrStr); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "Server", aBuf); } } } void CServer::ConShutdown(IConsole::IResult *pResult, void *pUser) { ((CServer *)pUser)->m_RunServer = 0; } void CServer::DemoRecorder_HandleAutoStart() { if(g_Config.m_SvAutoDemoRecord) { m_DemoRecorder.Stop(); char aFilename[128]; char aDate[20]; str_timestamp(aDate, sizeof(aDate)); str_format(aFilename, sizeof(aFilename), "demos/%s_%s.demo", "auto/autorecord", aDate); m_DemoRecorder.Start(Storage(), m_pConsole, aFilename, GameServer()->NetVersion(), m_aCurrentMap, m_CurrentMapCrc, "server"); if(g_Config.m_SvAutoDemoMax) { // clean up auto recorded demos CFileCollection AutoDemos; AutoDemos.Init(Storage(), "demos/server", "autorecord", ".demo", g_Config.m_SvAutoDemoMax); } } } bool CServer::DemoRecorder_IsRecording() { return m_DemoRecorder.IsRecording(); } void CServer::ConRecord(IConsole::IResult *pResult, void *pUser) { CServer* pServer = (CServer *)pUser; char aFilename[128]; if(pResult->NumArguments()) str_format(aFilename, sizeof(aFilename), "demos/%s.demo", pResult->GetString(0)); else { char aDate[20]; str_timestamp(aDate, sizeof(aDate)); str_format(aFilename, sizeof(aFilename), "demos/demo_%s.demo", aDate); } pServer->m_DemoRecorder.Start(pServer->Storage(), pServer->Console(), aFilename, pServer->GameServer()->NetVersion(), pServer->m_aCurrentMap, pServer->m_CurrentMapCrc, "server"); } void CServer::ConStopRecord(IConsole::IResult *pResult, void *pUser) { ((CServer *)pUser)->m_DemoRecorder.Stop(); } void CServer::ConMapReload(IConsole::IResult *pResult, void *pUser) { ((CServer *)pUser)->m_MapReload = 1; } void CServer::ConLogout(IConsole::IResult *pResult, void *pUser) { CServer *pServer = (CServer *)pUser; if(pServer->m_RconClientID >= 0 && pServer->m_RconClientID < MAX_CLIENTS && pServer->m_aClients[pServer->m_RconClientID].m_State != CServer::CClient::STATE_EMPTY) { CMsgPacker Msg(NETMSG_RCON_AUTH_STATUS); Msg.AddInt(0); //authed Msg.AddInt(0); //cmdlist pServer->SendMsgEx(&Msg, MSGFLAG_VITAL, pServer->m_RconClientID, true); pServer->m_aClients[pServer->m_RconClientID].m_Authed = AUTHED_NO; pServer->m_aClients[pServer->m_RconClientID].m_AuthTries = 0; pServer->m_aClients[pServer->m_RconClientID].m_pRconCmdToSend = 0; pServer->SendRconLine(pServer->m_RconClientID, "Logout successful."); char aBuf[32]; str_format(aBuf, sizeof(aBuf), "ClientID=%d logged out", pServer->m_RconClientID); pServer->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); } } void CServer::ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments()) ((CServer *)pUserData)->UpdateServerInfo(); } void CServer::ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments()) ((CServer *)pUserData)->m_NetServer.SetMaxClientsPerIP(pResult->GetInteger(0)); } void CServer::ConchainModCommandUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { if(pResult->NumArguments() == 2) { CServer *pThis = static_cast(pUserData); const IConsole::CCommandInfo *pInfo = pThis->Console()->GetCommandInfo(pResult->GetString(0), CFGFLAG_SERVER, false); int OldAccessLevel = 0; if(pInfo) OldAccessLevel = pInfo->GetAccessLevel(); pfnCallback(pResult, pCallbackUserData); if(pInfo && OldAccessLevel != pInfo->GetAccessLevel()) { for(int i = 0; i < MAX_CLIENTS; ++i) { if(pThis->m_aClients[i].m_State == CServer::CClient::STATE_EMPTY || pThis->m_aClients[i].m_Authed != CServer::AUTHED_MOD || (pThis->m_aClients[i].m_pRconCmdToSend && str_comp(pResult->GetString(0), pThis->m_aClients[i].m_pRconCmdToSend->m_pName) >= 0)) continue; if(OldAccessLevel == IConsole::ACCESS_LEVEL_ADMIN) pThis->SendRconCmdAdd(pInfo, i); else pThis->SendRconCmdRem(pInfo, i); } } } else pfnCallback(pResult, pCallbackUserData); } void CServer::ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments() == 1) { CServer *pThis = static_cast(pUserData); pThis->Console()->SetPrintOutputLevel(pThis->m_PrintCBIndex, pResult->GetInteger(0)); } } void CServer::RegisterCommands() { m_pConsole = Kernel()->RequestInterface(); m_pGameServer = Kernel()->RequestInterface(); m_pMap = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); // register console commands Console()->Register("kick", "i?r", CFGFLAG_SERVER, ConKick, this, "Kick player with specified id for any reason"); Console()->Register("status", "", CFGFLAG_SERVER, ConStatus, this, "List players"); Console()->Register("shutdown", "", CFGFLAG_SERVER, ConShutdown, this, "Shut down"); Console()->Register("logout", "", CFGFLAG_SERVER, ConLogout, this, "Logout of rcon"); Console()->Register("record", "?s", CFGFLAG_SERVER|CFGFLAG_STORE, ConRecord, this, "Record to a file"); Console()->Register("stoprecord", "", CFGFLAG_SERVER, ConStopRecord, this, "Stop recording"); Console()->Register("reload", "", CFGFLAG_SERVER, ConMapReload, this, "Reload the map"); Console()->Chain("sv_name", ConchainSpecialInfoupdate, this); Console()->Chain("password", ConchainSpecialInfoupdate, this); Console()->Chain("sv_max_clients_per_ip", ConchainMaxclientsperipUpdate, this); Console()->Chain("mod_command", ConchainModCommandUpdate, this); Console()->Chain("console_output_level", ConchainConsoleOutputLevelUpdate, this); // register console commands in sub parts m_ServerBan.InitServerBan(Console(), Storage(), this); m_pGameServer->OnConsoleInit(); } int CServer::SnapNewID() { return m_IDPool.NewID(); } void CServer::SnapFreeID(int ID) { m_IDPool.FreeID(ID); } void *CServer::SnapNewItem(int Type, int ID, int Size) { dbg_assert(Type >= 0 && Type <=0xffff, "incorrect type"); dbg_assert(ID >= 0 && ID <=0xffff, "incorrect id"); return ID < 0 ? 0 : m_SnapshotBuilder.NewItem(Type, ID, Size); } void CServer::SnapSetStaticsize(int ItemType, int Size) { m_SnapshotDelta.SetStaticsize(ItemType, Size); } static CServer *CreateServer() { return new CServer(); } int main(int argc, const char **argv) // ignore_convention { #if defined(CONF_FAMILY_WINDOWS) for(int i = 1; i < argc; i++) // ignore_convention { if(str_comp("-s", argv[i]) == 0 || str_comp("--silent", argv[i]) == 0) // ignore_convention { ShowWindow(GetConsoleWindow(), SW_HIDE); break; } } #endif CServer *pServer = CreateServer(); IKernel *pKernel = IKernel::Create(); // create the components IEngine *pEngine = CreateEngine("Teeworlds"); IEngineMap *pEngineMap = CreateEngineMap(); IGameServer *pGameServer = CreateGameServer(); IConsole *pConsole = CreateConsole(CFGFLAG_SERVER|CFGFLAG_ECON); IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer(); IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); // ignore_convention IConfig *pConfig = CreateConfig(); pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConsole); { bool RegisterFail = false; RegisterFail = RegisterFail || !pKernel->RegisterInterface(pServer); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngine); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMap)); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMap)); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pGameServer); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pStorage); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMasterServer)); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast(pEngineMasterServer)); if(RegisterFail) return -1; } pEngine->Init(); pConfig->Init(); pEngineMasterServer->Init(); pEngineMasterServer->Load(); // register all console commands pServer->RegisterCommands(); // execute autoexec file pConsole->ExecuteFile("autoexec.cfg"); // parse the command line arguments if(argc > 1) // ignore_convention pConsole->ParseArguments(argc-1, &argv[1]); // ignore_convention // restore empty config strings to their defaults pConfig->RestoreStrings(); pEngine->InitLogfile(); // run the server dbg_msg("server", "starting..."); pServer->Run(); // free delete pServer; delete pKernel; delete pEngineMap; delete pGameServer; delete pConsole; delete pEngineMasterServer; delete pStorage; delete pConfig; return 0; } teeworlds-0.6.2+dfsg/src/engine/server/server.h0000644000175000017500000001406112140200333020455 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SERVER_SERVER_H #define ENGINE_SERVER_SERVER_H #include class CSnapIDPool { enum { MAX_IDS = 16*1024, }; class CID { public: short m_Next; short m_State; // 0 = free, 1 = alloced, 2 = timed int m_Timeout; }; CID m_aIDs[MAX_IDS]; int m_FirstFree; int m_FirstTimed; int m_LastTimed; int m_Usage; int m_InUsage; public: CSnapIDPool(); void Reset(); void RemoveFirstTimeout(); int NewID(); void TimeoutIDs(); void FreeID(int ID); }; class CServerBan : public CNetBan { class CServer *m_pServer; template int BanExt(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason); public: class CServer *Server() const { return m_pServer; } void InitServerBan(class IConsole *pConsole, class IStorage *pStorage, class CServer* pServer); virtual int BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason); virtual int BanRange(const CNetRange *pRange, int Seconds, const char *pReason); static void ConBanExt(class IConsole::IResult *pResult, void *pUser); }; class CServer : public IServer { class IGameServer *m_pGameServer; class IConsole *m_pConsole; class IStorage *m_pStorage; public: class IGameServer *GameServer() { return m_pGameServer; } class IConsole *Console() { return m_pConsole; } class IStorage *Storage() { return m_pStorage; } enum { AUTHED_NO=0, AUTHED_MOD, AUTHED_ADMIN, MAX_RCONCMD_SEND=16, }; class CClient { public: enum { STATE_EMPTY = 0, STATE_AUTH, STATE_CONNECTING, STATE_READY, STATE_INGAME, SNAPRATE_INIT=0, SNAPRATE_FULL, SNAPRATE_RECOVER }; class CInput { public: int m_aData[MAX_INPUT_SIZE]; int m_GameTick; // the tick that was chosen for the input }; // connection state info int m_State; int m_Latency; int m_SnapRate; int m_LastAckedSnapshot; int m_LastInputTick; CSnapshotStorage m_Snapshots; CInput m_LatestInput; CInput m_aInputs[200]; // TODO: handle input better int m_CurrentInput; char m_aName[MAX_NAME_LENGTH]; char m_aClan[MAX_CLAN_LENGTH]; int m_Country; int m_Score; int m_Authed; int m_AuthTries; const IConsole::CCommandInfo *m_pRconCmdToSend; void Reset(); }; CClient m_aClients[MAX_CLIENTS]; CSnapshotDelta m_SnapshotDelta; CSnapshotBuilder m_SnapshotBuilder; CSnapIDPool m_IDPool; CNetServer m_NetServer; CEcon m_Econ; CServerBan m_ServerBan; IEngineMap *m_pMap; int64 m_GameStartTime; //int m_CurrentGameTick; int m_RunServer; int m_MapReload; int m_RconClientID; int m_RconAuthLevel; int m_PrintCBIndex; int64 m_Lastheartbeat; //static NETADDR4 master_server; char m_aCurrentMap[64]; unsigned m_CurrentMapCrc; unsigned char *m_pCurrentMapData; int m_CurrentMapSize; CDemoRecorder m_DemoRecorder; CRegister m_Register; CMapChecker m_MapChecker; CServer(); int TrySetClientName(int ClientID, const char *pName); virtual void SetClientName(int ClientID, const char *pName); virtual void SetClientClan(int ClientID, char const *pClan); virtual void SetClientCountry(int ClientID, int Country); virtual void SetClientScore(int ClientID, int Score); void Kick(int ClientID, const char *pReason); void DemoRecorder_HandleAutoStart(); bool DemoRecorder_IsRecording(); //int Tick() int64 TickStartTime(int Tick); //int TickSpeed() int Init(); void SetRconCID(int ClientID); bool IsAuthed(int ClientID); int GetClientInfo(int ClientID, CClientInfo *pInfo); void GetClientAddr(int ClientID, char *pAddrStr, int Size); const char *ClientName(int ClientID); const char *ClientClan(int ClientID); int ClientCountry(int ClientID); bool ClientIngame(int ClientID); int MaxClients() const; virtual int SendMsg(CMsgPacker *pMsg, int Flags, int ClientID); int SendMsgEx(CMsgPacker *pMsg, int Flags, int ClientID, bool System); void DoSnapshot(); static int NewClientCallback(int ClientID, void *pUser); static int DelClientCallback(int ClientID, const char *pReason, void *pUser); void SendMap(int ClientID); void SendConnectionReady(int ClientID); void SendRconLine(int ClientID, const char *pLine); static void SendRconLineAuthed(const char *pLine, void *pUser); void SendRconCmdAdd(const IConsole::CCommandInfo *pCommandInfo, int ClientID); void SendRconCmdRem(const IConsole::CCommandInfo *pCommandInfo, int ClientID); void UpdateClientRconCommands(); void ProcessClientPacket(CNetChunk *pPacket); void SendServerInfo(const NETADDR *pAddr, int Token); void UpdateServerInfo(); void PumpNetwork(); char *GetMapName(); int LoadMap(const char *pMapName); void InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole); int Run(); static void ConKick(IConsole::IResult *pResult, void *pUser); static void ConStatus(IConsole::IResult *pResult, void *pUser); static void ConShutdown(IConsole::IResult *pResult, void *pUser); static void ConRecord(IConsole::IResult *pResult, void *pUser); static void ConStopRecord(IConsole::IResult *pResult, void *pUser); static void ConMapReload(IConsole::IResult *pResult, void *pUser); static void ConLogout(IConsole::IResult *pResult, void *pUser); static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainMaxclientsperipUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainModCommandUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); void RegisterCommands(); virtual int SnapNewID(); virtual void SnapFreeID(int ID); virtual void *SnapNewItem(int Type, int ID, int Size); void SnapSetStaticsize(int ItemType, int Size); }; #endif teeworlds-0.6.2+dfsg/src/engine/serverbrowser.h0000644000175000017500000000400112140200333020544 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SERVERBROWSER_H #define ENGINE_SERVERBROWSER_H #include #include "kernel.h" /* Structure: CServerInfo */ class CServerInfo { public: /* Structure: CInfoClient */ class CClient { public: char m_aName[MAX_NAME_LENGTH]; char m_aClan[MAX_CLAN_LENGTH]; int m_Country; int m_Score; bool m_Player; int m_FriendState; }; int m_SortedIndex; int m_ServerIndex; NETADDR m_NetAddr; int m_QuickSearchHit; int m_FriendState; int m_MaxClients; int m_NumClients; int m_MaxPlayers; int m_NumPlayers; int m_Flags; int m_Favorite; int m_Latency; // in ms char m_aGameType[16]; char m_aName[64]; char m_aMap[32]; char m_aVersion[32]; char m_aAddress[NETADDR_MAXSTRSIZE]; CClient m_aClients[MAX_CLIENTS]; }; class IServerBrowser : public IInterface { MACRO_INTERFACE("serverbrowser", 0) public: /* Constants: Server Browser Sorting SORT_NAME - Sort by name. SORT_PING - Sort by ping. SORT_MAP - Sort by map SORT_GAMETYPE - Sort by game type. DM, TDM etc. SORT_NUMPLAYERS - Sort after how many players there are on the server. */ enum{ SORT_NAME = 0, SORT_PING, SORT_MAP, SORT_GAMETYPE, SORT_NUMPLAYERS, QUICK_SERVERNAME=1, QUICK_PLAYER=2, QUICK_MAPNAME=4, TYPE_INTERNET = 0, TYPE_LAN = 1, TYPE_FAVORITES = 2, SET_MASTER_ADD=1, SET_FAV_ADD, SET_TOKEN }; virtual void Refresh(int Type) = 0; virtual bool IsRefreshing() const = 0; virtual bool IsRefreshingMasters() const = 0; virtual int LoadingProgression() const = 0; virtual int NumServers() const = 0; virtual int NumSortedServers() const = 0; virtual const CServerInfo *SortedGet(int Index) const = 0; virtual bool IsFavorite(const NETADDR &Addr) const = 0; virtual void AddFavorite(const NETADDR &Addr) = 0; virtual void RemoveFavorite(const NETADDR &Addr) = 0; }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/0000755000175000017500000000000012140200333016734 5ustar felixfelixteeworlds-0.6.2+dfsg/src/engine/shared/compression.cpp0000644000175000017500000000356412140200333022011 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "compression.h" // Format: ESDDDDDD EDDDDDDD EDD... Extended, Data, Sign unsigned char *CVariableInt::Pack(unsigned char *pDst, int i) { *pDst = (i>>25)&0x40; // set sign bit if i<0 i = i^(i>>31); // if(i<0) i = ~i *pDst |= i&0x3F; // pack 6bit into dst i >>= 6; // discard 6 bits if(i) { *pDst |= 0x80; // set extend bit while(1) { pDst++; *pDst = i&(0x7F); // pack 7bit i >>= 7; // discard 7 bits *pDst |= (i!=0)<<7; // set extend bit (may branch) if(!i) break; } } pDst++; return pDst; } const unsigned char *CVariableInt::Unpack(const unsigned char *pSrc, int *pInOut) { int Sign = (*pSrc>>6)&1; *pInOut = *pSrc&0x3F; do { if(!(*pSrc&0x80)) break; pSrc++; *pInOut |= (*pSrc&(0x7F))<<(6); if(!(*pSrc&0x80)) break; pSrc++; *pInOut |= (*pSrc&(0x7F))<<(6+7); if(!(*pSrc&0x80)) break; pSrc++; *pInOut |= (*pSrc&(0x7F))<<(6+7+7); if(!(*pSrc&0x80)) break; pSrc++; *pInOut |= (*pSrc&(0x7F))<<(6+7+7+7); } while(0); pSrc++; *pInOut ^= -Sign; // if(sign) *i = ~(*i) return pSrc; } long CVariableInt::Decompress(const void *pSrc_, int Size, void *pDst_) { const unsigned char *pSrc = (unsigned char *)pSrc_; const unsigned char *pEnd = pSrc + Size; int *pDst = (int *)pDst_; while(pSrc < pEnd) { pSrc = CVariableInt::Unpack(pSrc, pDst); pDst++; } return (long)((unsigned char *)pDst-(unsigned char *)pDst_); } long CVariableInt::Compress(const void *pSrc_, int Size, void *pDst_) { int *pSrc = (int *)pSrc_; unsigned char *pDst = (unsigned char *)pDst_; Size /= 4; while(Size) { pDst = CVariableInt::Pack(pDst, *pSrc); Size--; pSrc++; } return (long)(pDst-(unsigned char *)pDst_); } teeworlds-0.6.2+dfsg/src/engine/shared/compression.h0000644000175000017500000000111512140200333021444 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_COMPRESSION_H #define ENGINE_SHARED_COMPRESSION_H // variable int packing class CVariableInt { public: static unsigned char *Pack(unsigned char *pDst, int i); static const unsigned char *Unpack(const unsigned char *pSrc, int *pInOut); static long Compress(const void *pSrc, int Size, void *pDst); static long Decompress(const void *pSrc, int Size, void *pDst); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/config.cpp0000644000175000017500000000572212140200333020713 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include CConfiguration g_Config; class CConfig : public IConfig { IStorage *m_pStorage; IOHANDLE m_ConfigFile; struct CCallback { SAVECALLBACKFUNC m_pfnFunc; void *m_pUserData; }; enum { MAX_CALLBACKS = 16 }; CCallback m_aCallbacks[MAX_CALLBACKS]; int m_NumCallbacks; void EscapeParam(char *pDst, const char *pSrc, int size) { for(int i = 0; *pSrc && i < size - 1; ++i) { if(*pSrc == '"' || *pSrc == '\\') // escape \ and " *pDst++ = '\\'; *pDst++ = *pSrc++; } *pDst = 0; } public: CConfig() { m_ConfigFile = 0; m_NumCallbacks = 0; } virtual void Init() { m_pStorage = Kernel()->RequestInterface(); Reset(); } virtual void Reset() { #define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) g_Config.m_##Name = def; #define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) str_copy(g_Config.m_##Name, def, len); #include "config_variables.h" #undef MACRO_CONFIG_INT #undef MACRO_CONFIG_STR } virtual void RestoreStrings() { #define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) // nop #define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if(!g_Config.m_##Name[0] && def[0]) str_copy(g_Config.m_##Name, def, len); #include "config_variables.h" #undef MACRO_CONFIG_INT #undef MACRO_CONFIG_STR } virtual void Save() { if(!m_pStorage) return; m_ConfigFile = m_pStorage->OpenFile("settings.cfg", IOFLAG_WRITE, IStorage::TYPE_SAVE); if(!m_ConfigFile) return; char aLineBuf[1024*2]; char aEscapeBuf[1024*2]; #define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) if((flags)&CFGFLAG_SAVE){ str_format(aLineBuf, sizeof(aLineBuf), "%s %i", #ScriptName, g_Config.m_##Name); WriteLine(aLineBuf); } #define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if((flags)&CFGFLAG_SAVE){ EscapeParam(aEscapeBuf, g_Config.m_##Name, sizeof(aEscapeBuf)); str_format(aLineBuf, sizeof(aLineBuf), "%s \"%s\"", #ScriptName, aEscapeBuf); WriteLine(aLineBuf); } #include "config_variables.h" #undef MACRO_CONFIG_INT #undef MACRO_CONFIG_STR for(int i = 0; i < m_NumCallbacks; i++) m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData); io_close(m_ConfigFile); m_ConfigFile = 0; } virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) { dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks"); m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc; m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData; m_NumCallbacks++; } virtual void WriteLine(const char *pLine) { if(!m_ConfigFile) return; io_write(m_ConfigFile, pLine, str_length(pLine)); io_write_newline(m_ConfigFile); } }; IConfig *CreateConfig() { return new CConfig; } teeworlds-0.6.2+dfsg/src/engine/shared/config.h0000644000175000017500000000130412140200333020350 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_CONFIG_H #define ENGINE_SHARED_CONFIG_H struct CConfiguration { #define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Save,Desc) int m_##Name; #define MACRO_CONFIG_STR(Name,ScriptName,Len,Def,Save,Desc) char m_##Name[Len]; // Flawfinder: ignore #include "config_variables.h" #undef MACRO_CONFIG_INT #undef MACRO_CONFIG_STR }; extern CConfiguration g_Config; enum { CFGFLAG_SAVE=1, CFGFLAG_CLIENT=2, CFGFLAG_SERVER=4, CFGFLAG_STORE=8, CFGFLAG_MASTER=16, CFGFLAG_ECON=32, }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/config_variables.h0000644000175000017500000002512012140200333022402 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_CONFIG_VARIABLES_H #define ENGINE_SHARED_CONFIG_VARIABLES_H #undef ENGINE_SHARED_CONFIG_VARIABLES_H // this file will be included several times // TODO: remove this #include "././game/variables.h" MACRO_CONFIG_STR(PlayerName, player_name, 16, "nameless tee", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Name of the player") MACRO_CONFIG_STR(PlayerClan, player_clan, 12, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Clan of the player") MACRO_CONFIG_INT(PlayerCountry, player_country, -1, -1, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Country of the player") MACRO_CONFIG_STR(Password, password, 32, "", CFGFLAG_CLIENT|CFGFLAG_SERVER, "Password to the server") MACRO_CONFIG_STR(Logfile, logfile, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT|CFGFLAG_SERVER, "Filename to log all output to") MACRO_CONFIG_INT(ConsoleOutputLevel, console_output_level, 0, 0, 2, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Adjusts the amount of information in the console") MACRO_CONFIG_INT(ClCpuThrottle, cl_cpu_throttle, 0, 0, 100, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(ClEditor, cl_editor, 0, 0, 1, CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(ClLoadCountryFlags, cl_load_country_flags, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Load and show country flags") MACRO_CONFIG_INT(ClAutoDemoRecord, cl_auto_demo_record, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Automatically record demos") MACRO_CONFIG_INT(ClAutoDemoMax, cl_auto_demo_max, 10, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Maximum number of automatically recorded demos (0 = no limit)") MACRO_CONFIG_INT(ClAutoScreenshot, cl_auto_screenshot, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Automatically take game over screenshot") MACRO_CONFIG_INT(ClAutoScreenshotMax, cl_auto_screenshot_max, 10, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Maximum number of automatically created screenshots (0 = no limit)") MACRO_CONFIG_INT(ClEventthread, cl_eventthread, 0, 0, 1, CFGFLAG_CLIENT, "Enables the usage of a thread to pump the events") MACRO_CONFIG_INT(InpGrab, inp_grab, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Use forceful input grabbing method") MACRO_CONFIG_STR(BrFilterString, br_filter_string, 25, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Server browser filtering string") MACRO_CONFIG_INT(BrFilterFull, br_filter_full, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out full server in browser") MACRO_CONFIG_INT(BrFilterEmpty, br_filter_empty, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out empty server in browser") MACRO_CONFIG_INT(BrFilterSpectators, br_filter_spectators, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out spectators from player numbers") MACRO_CONFIG_INT(BrFilterFriends, br_filter_friends, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out servers with no friends") MACRO_CONFIG_INT(BrFilterCountry, br_filter_country, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out servers with non-matching player country") MACRO_CONFIG_INT(BrFilterCountryIndex, br_filter_country_index, -1, -1, 999, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Player country to filter by in the server browser") MACRO_CONFIG_INT(BrFilterPw, br_filter_pw, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out password protected servers in browser") MACRO_CONFIG_INT(BrFilterPing, br_filter_ping, 999, 0, 999, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Ping to filter by in the server browser") MACRO_CONFIG_STR(BrFilterGametype, br_filter_gametype, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Game types to filter") MACRO_CONFIG_INT(BrFilterGametypeStrict, br_filter_gametype_strict, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Strict gametype filter") MACRO_CONFIG_STR(BrFilterServerAddress, br_filter_serveraddress, 128, "", CFGFLAG_SAVE|CFGFLAG_CLIENT, "Server address to filter") MACRO_CONFIG_INT(BrFilterPure, br_filter_pure, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-standard servers in browser") MACRO_CONFIG_INT(BrFilterPureMap, br_filter_pure_map, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-standard maps in browser") MACRO_CONFIG_INT(BrFilterCompatversion, br_filter_compatversion, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Filter out non-compatible servers in browser") MACRO_CONFIG_INT(BrSort, br_sort, 0, 0, 256, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(BrSortOrder, br_sort_order, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(BrMaxRequests, br_max_requests, 25, 0, 1000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Number of requests to use when refreshing server browser") MACRO_CONFIG_INT(SndBufferSize, snd_buffer_size, 512, 128, 32768, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound buffer size") MACRO_CONFIG_INT(SndRate, snd_rate, 48000, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound mixing rate") MACRO_CONFIG_INT(SndEnable, snd_enable, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound enable") MACRO_CONFIG_INT(SndMusic, snd_enable_music, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Play background music") MACRO_CONFIG_INT(SndVolume, snd_volume, 100, 0, 100, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound volume") MACRO_CONFIG_INT(SndDevice, snd_device, -1, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "(deprecated) Sound device to use") MACRO_CONFIG_INT(SndNonactiveMute, snd_nonactive_mute, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(GfxScreenWidth, gfx_screen_width, 0, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Screen resolution width") MACRO_CONFIG_INT(GfxScreenHeight, gfx_screen_height, 0, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Screen resolution height") MACRO_CONFIG_INT(GfxBorderless, gfx_borderless, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Borderless window (not to be used with fullscreen)") MACRO_CONFIG_INT(GfxFullscreen, gfx_fullscreen, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Fullscreen") MACRO_CONFIG_INT(GfxAlphabits, gfx_alphabits, 0, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Alpha bits for framebuffer (fullscreen only)") MACRO_CONFIG_INT(GfxColorDepth, gfx_color_depth, 24, 16, 24, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Colors bits for framebuffer (fullscreen only)") MACRO_CONFIG_INT(GfxClear, gfx_clear, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Clear screen before rendering") MACRO_CONFIG_INT(GfxVsync, gfx_vsync, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Vertical sync") MACRO_CONFIG_INT(GfxDisplayAllModes, gfx_display_all_modes, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(GfxTextureCompression, gfx_texture_compression, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Use texture compression") MACRO_CONFIG_INT(GfxHighDetail, gfx_high_detail, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "High detail") MACRO_CONFIG_INT(GfxTextureQuality, gfx_texture_quality, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(GfxFsaaSamples, gfx_fsaa_samples, 0, 0, 16, CFGFLAG_SAVE|CFGFLAG_CLIENT, "FSAA Samples") MACRO_CONFIG_INT(GfxRefreshRate, gfx_refresh_rate, 0, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Screen refresh rate") MACRO_CONFIG_INT(GfxFinish, gfx_finish, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(GfxAsyncRender, gfx_asyncrender, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Do rendering async from the the update") MACRO_CONFIG_INT(GfxThreaded, gfx_threaded, 0, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Use the threaded graphics backend") MACRO_CONFIG_INT(InpMousesens, inp_mousesens, 100, 5, 100000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Mouse sensitivity") MACRO_CONFIG_STR(SvName, sv_name, 128, "unnamed server", CFGFLAG_SERVER, "Server name") MACRO_CONFIG_STR(Bindaddr, bindaddr, 128, "", CFGFLAG_CLIENT|CFGFLAG_SERVER|CFGFLAG_MASTER, "Address to bind the client/server to") MACRO_CONFIG_INT(SvPort, sv_port, 8303, 0, 0, CFGFLAG_SERVER, "Port to use for the server") MACRO_CONFIG_INT(SvExternalPort, sv_external_port, 0, 0, 0, CFGFLAG_SERVER, "External port to report to the master servers") MACRO_CONFIG_STR(SvMap, sv_map, 128, "dm1", CFGFLAG_SERVER, "Map to use on the server") MACRO_CONFIG_INT(SvMaxClients, sv_max_clients, 8, 1, MAX_CLIENTS, CFGFLAG_SERVER, "Maximum number of clients that are allowed on a server") MACRO_CONFIG_INT(SvMaxClientsPerIP, sv_max_clients_per_ip, 4, 1, MAX_CLIENTS, CFGFLAG_SERVER, "Maximum number of clients with the same IP that can connect to the server") MACRO_CONFIG_INT(SvHighBandwidth, sv_high_bandwidth, 0, 0, 1, CFGFLAG_SERVER, "Use high bandwidth mode. Doubles the bandwidth required for the server. LAN use only") MACRO_CONFIG_INT(SvRegister, sv_register, 1, 0, 1, CFGFLAG_SERVER, "Register server with master server for public listing") MACRO_CONFIG_STR(SvRconPassword, sv_rcon_password, 32, "", CFGFLAG_SERVER, "Remote console password (full access)") MACRO_CONFIG_STR(SvRconModPassword, sv_rcon_mod_password, 32, "", CFGFLAG_SERVER, "Remote console password for moderators (limited access)") MACRO_CONFIG_INT(SvRconMaxTries, sv_rcon_max_tries, 3, 0, 100, CFGFLAG_SERVER, "Maximum number of tries for remote console authentication") MACRO_CONFIG_INT(SvRconBantime, sv_rcon_bantime, 5, 0, 1440, CFGFLAG_SERVER, "The time a client gets banned if remote console authentication fails. 0 makes it just use kick") MACRO_CONFIG_INT(SvAutoDemoRecord, sv_auto_demo_record, 0, 0, 1, CFGFLAG_SERVER, "Automatically record demos") MACRO_CONFIG_INT(SvAutoDemoMax, sv_auto_demo_max, 10, 0, 1000, CFGFLAG_SERVER, "Maximum number of automatically recorded demos (0 = no limit)") MACRO_CONFIG_STR(EcBindaddr, ec_bindaddr, 128, "localhost", CFGFLAG_ECON, "Address to bind the external console to. Anything but 'localhost' is dangerous") MACRO_CONFIG_INT(EcPort, ec_port, 0, 0, 0, CFGFLAG_ECON, "Port to use for the external console") MACRO_CONFIG_STR(EcPassword, ec_password, 32, "", CFGFLAG_ECON, "External console password") MACRO_CONFIG_INT(EcBantime, ec_bantime, 0, 0, 1440, CFGFLAG_ECON, "The time a client gets banned if econ authentication fails. 0 just closes the connection") MACRO_CONFIG_INT(EcAuthTimeout, ec_auth_timeout, 30, 1, 120, CFGFLAG_ECON, "Time in seconds before the the econ authentification times out") MACRO_CONFIG_INT(EcOutputLevel, ec_output_level, 1, 0, 2, CFGFLAG_ECON, "Adjusts the amount of information in the external console") MACRO_CONFIG_INT(Debug, debug, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Debug mode") MACRO_CONFIG_INT(DbgStress, dbg_stress, 0, 0, 0, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Stress systems") MACRO_CONFIG_INT(DbgStressNetwork, dbg_stress_network, 0, 0, 0, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Stress network") MACRO_CONFIG_INT(DbgPref, dbg_pref, 0, 0, 1, CFGFLAG_SERVER, "Performance outputs") MACRO_CONFIG_INT(DbgGraphs, dbg_graphs, 0, 0, 1, CFGFLAG_CLIENT, "Performance graphs") MACRO_CONFIG_INT(DbgHitch, dbg_hitch, 0, 0, 0, CFGFLAG_SERVER, "Hitch warnings") MACRO_CONFIG_STR(DbgStressServer, dbg_stress_server, 32, "localhost", CFGFLAG_CLIENT, "Server to stress") MACRO_CONFIG_INT(DbgResizable, dbg_resizable, 0, 0, 0, CFGFLAG_CLIENT, "Enables window resizing") #endif teeworlds-0.6.2+dfsg/src/engine/shared/console.cpp0000644000175000017500000005413012140200333021105 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include "config.h" #include "console.h" #include "linereader.h" // todo: rework this const char *CConsole::CResult::GetString(unsigned Index) { if (Index >= m_NumArgs) return ""; return m_apArgs[Index]; } int CConsole::CResult::GetInteger(unsigned Index) { if (Index >= m_NumArgs) return 0; return str_toint(m_apArgs[Index]); } float CConsole::CResult::GetFloat(unsigned Index) { if (Index >= m_NumArgs) return 0.0f; return str_tofloat(m_apArgs[Index]); } const IConsole::CCommandInfo *CConsole::CCommand::NextCommandInfo(int AccessLevel, int FlagMask) const { const CCommand *pInfo = m_pNext; while(pInfo) { if(pInfo->m_Flags&FlagMask && pInfo->m_AccessLevel >= AccessLevel) break; pInfo = pInfo->m_pNext; } return pInfo; } const IConsole::CCommandInfo *CConsole::FirstCommandInfo(int AccessLevel, int FlagMask) const { for(const CCommand *pCommand = m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) { if(pCommand->m_Flags&FlagMask && pCommand->GetAccessLevel() >= AccessLevel) return pCommand; } return 0; } // the maximum number of tokens occurs in a string of length CONSOLE_MAX_STR_LENGTH with tokens size 1 separated by single spaces int CConsole::ParseStart(CResult *pResult, const char *pString, int Length) { char *pStr; int Len = sizeof(pResult->m_aStringStorage); if(Length < Len) Len = Length; str_copy(pResult->m_aStringStorage, pString, Len); pStr = pResult->m_aStringStorage; // get command pStr = str_skip_whitespaces(pStr); pResult->m_pCommand = pStr; pStr = str_skip_to_whitespace(pStr); if(*pStr) { pStr[0] = 0; pStr++; } pResult->m_pArgsStart = pStr; return 0; } int CConsole::ParseArgs(CResult *pResult, const char *pFormat) { char Command; char *pStr; int Optional = 0; int Error = 0; pStr = pResult->m_pArgsStart; while(1) { // fetch command Command = *pFormat; pFormat++; if(!Command) break; if(Command == '?') Optional = 1; else { pStr = str_skip_whitespaces(pStr); if(!(*pStr)) // error, non optional command needs value { if(!Optional) Error = 1; break; } // add token if(*pStr == '"') { char *pDst; pStr++; pResult->AddArgument(pStr); pDst = pStr; // we might have to process escape data while(1) { if(pStr[0] == '"') break; else if(pStr[0] == '\\') { if(pStr[1] == '\\') pStr++; // skip due to escape else if(pStr[1] == '"') pStr++; // skip due to escape } else if(pStr[0] == 0) return 1; // return error *pDst = *pStr; pDst++; pStr++; } // write null termination *pDst = 0; pStr++; } else { pResult->AddArgument(pStr); if(Command == 'r') // rest of the string break; else if(Command == 'i') // validate int pStr = str_skip_to_whitespace(pStr); else if(Command == 'f') // validate float pStr = str_skip_to_whitespace(pStr); else if(Command == 's') // validate string pStr = str_skip_to_whitespace(pStr); if(pStr[0] != 0) // check for end of string { pStr[0] = 0; pStr++; } } } } return Error; } int CConsole::RegisterPrintCallback(int OutputLevel, FPrintCallback pfnPrintCallback, void *pUserData) { if(m_NumPrintCB == MAX_PRINT_CB) return -1; m_aPrintCB[m_NumPrintCB].m_OutputLevel = clamp(OutputLevel, (int)(OUTPUT_LEVEL_STANDARD), (int)(OUTPUT_LEVEL_DEBUG)); m_aPrintCB[m_NumPrintCB].m_pfnPrintCallback = pfnPrintCallback; m_aPrintCB[m_NumPrintCB].m_pPrintCallbackUserdata = pUserData; return m_NumPrintCB++; } void CConsole::SetPrintOutputLevel(int Index, int OutputLevel) { if(Index >= 0 && Index < MAX_PRINT_CB) m_aPrintCB[Index].m_OutputLevel = clamp(OutputLevel, (int)(OUTPUT_LEVEL_STANDARD), (int)(OUTPUT_LEVEL_DEBUG)); } void CConsole::Print(int Level, const char *pFrom, const char *pStr) { dbg_msg(pFrom ,"%s", pStr); for(int i = 0; i < m_NumPrintCB; ++i) { if(Level <= m_aPrintCB[i].m_OutputLevel && m_aPrintCB[i].m_pfnPrintCallback) { char aBuf[1024]; str_format(aBuf, sizeof(aBuf), "[%s]: %s", pFrom, pStr); m_aPrintCB[i].m_pfnPrintCallback(aBuf, m_aPrintCB[i].m_pPrintCallbackUserdata); } } } bool CConsole::LineIsValid(const char *pStr) { if(!pStr || *pStr == 0) return false; do { CResult Result; const char *pEnd = pStr; const char *pNextPart = 0; int InString = 0; while(*pEnd) { if(*pEnd == '"') InString ^= 1; else if(*pEnd == '\\') // escape sequences { if(pEnd[1] == '"') pEnd++; } else if(!InString) { if(*pEnd == ';') // command separator { pNextPart = pEnd+1; break; } else if(*pEnd == '#') // comment, no need to do anything more break; } pEnd++; } if(ParseStart(&Result, pStr, (pEnd-pStr) + 1) != 0) return false; CCommand *pCommand = FindCommand(Result.m_pCommand, m_FlagMask); if(!pCommand || ParseArgs(&Result, pCommand->m_pParams)) return false; pStr = pNextPart; } while(pStr && *pStr); return true; } void CConsole::ExecuteLineStroked(int Stroke, const char *pStr) { while(pStr && *pStr) { CResult Result; const char *pEnd = pStr; const char *pNextPart = 0; int InString = 0; while(*pEnd) { if(*pEnd == '"') InString ^= 1; else if(*pEnd == '\\') // escape sequences { if(pEnd[1] == '"') pEnd++; } else if(!InString) { if(*pEnd == ';') // command separator { pNextPart = pEnd+1; break; } else if(*pEnd == '#') // comment, no need to do anything more break; } pEnd++; } if(ParseStart(&Result, pStr, (pEnd-pStr) + 1) != 0) return; if(!*Result.m_pCommand) return; CCommand *pCommand = FindCommand(Result.m_pCommand, m_FlagMask); if(pCommand) { if(pCommand->GetAccessLevel() >= m_AccessLevel) { int IsStrokeCommand = 0; if(Result.m_pCommand[0] == '+') { // insert the stroke direction token Result.AddArgument(m_paStrokeStr[Stroke]); IsStrokeCommand = 1; } if(Stroke || IsStrokeCommand) { if(ParseArgs(&Result, pCommand->m_pParams)) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "Invalid arguments... Usage: %s %s", pCommand->m_pName, pCommand->m_pParams); Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); } else if(m_StoreCommands && pCommand->m_Flags&CFGFLAG_STORE) { m_ExecutionQueue.AddEntry(); m_ExecutionQueue.m_pLast->m_pfnCommandCallback = pCommand->m_pfnCallback; m_ExecutionQueue.m_pLast->m_pCommandUserData = pCommand->m_pUserData; m_ExecutionQueue.m_pLast->m_Result = Result; } else pCommand->m_pfnCallback(&Result, pCommand->m_pUserData); } } else if(Stroke) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "Access for command %s denied.", Result.m_pCommand); Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); } } else if(Stroke) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "No such command: %s.", Result.m_pCommand); Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); } pStr = pNextPart; } } void CConsole::PossibleCommands(const char *pStr, int FlagMask, bool Temp, FPossibleCallback pfnCallback, void *pUser) { for(CCommand *pCommand = m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) { if(pCommand->m_Flags&FlagMask && pCommand->m_Temp == Temp) { if(str_find_nocase(pCommand->m_pName, pStr)) pfnCallback(pCommand->m_pName, pUser); } } } CConsole::CCommand *CConsole::FindCommand(const char *pName, int FlagMask) { for(CCommand *pCommand = m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) { if(pCommand->m_Flags&FlagMask) { if(str_comp_nocase(pCommand->m_pName, pName) == 0) return pCommand; } } return 0x0; } void CConsole::ExecuteLine(const char *pStr) { CConsole::ExecuteLineStroked(1, pStr); // press it CConsole::ExecuteLineStroked(0, pStr); // then release it } void CConsole::ExecuteLineFlag(const char *pStr, int FlagMask) { int Temp = m_FlagMask; m_FlagMask = FlagMask; ExecuteLine(pStr); m_FlagMask = Temp; } void CConsole::ExecuteFile(const char *pFilename) { // make sure that this isn't being executed already for(CExecFile *pCur = m_pFirstExec; pCur; pCur = pCur->m_pPrev) if(str_comp(pFilename, pCur->m_pFilename) == 0) return; if(!m_pStorage) m_pStorage = Kernel()->RequestInterface(); if(!m_pStorage) return; // push this one to the stack CExecFile ThisFile; CExecFile *pPrev = m_pFirstExec; ThisFile.m_pFilename = pFilename; ThisFile.m_pPrev = m_pFirstExec; m_pFirstExec = &ThisFile; // exec the file IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL); char aBuf[256]; if(File) { char *pLine; CLineReader lr; str_format(aBuf, sizeof(aBuf), "executing '%s'", pFilename); Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); lr.Init(File); while((pLine = lr.Get())) ExecuteLine(pLine); io_close(File); } else { str_format(aBuf, sizeof(aBuf), "failed to open '%s'", pFilename); Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", aBuf); } m_pFirstExec = pPrev; } void CConsole::Con_Echo(IResult *pResult, void *pUserData) { ((CConsole*)pUserData)->Print(IConsole::OUTPUT_LEVEL_STANDARD, "Console", pResult->GetString(0)); } void CConsole::Con_Exec(IResult *pResult, void *pUserData) { ((CConsole*)pUserData)->ExecuteFile(pResult->GetString(0)); } void CConsole::ConModCommandAccess(IResult *pResult, void *pUser) { CConsole* pConsole = static_cast(pUser); char aBuf[128]; CCommand *pCommand = pConsole->FindCommand(pResult->GetString(0), CFGFLAG_SERVER); if(pCommand) { if(pResult->NumArguments() == 2) { pCommand->SetAccessLevel(pResult->GetInteger(1)); str_format(aBuf, sizeof(aBuf), "moderator access for '%s' is now %s", pResult->GetString(0), pCommand->GetAccessLevel() ? "enabled" : "disabled"); } else str_format(aBuf, sizeof(aBuf), "moderator access for '%s' is %s", pResult->GetString(0), pCommand->GetAccessLevel() ? "enabled" : "disabled"); } else str_format(aBuf, sizeof(aBuf), "No such command: '%s'.", pResult->GetString(0)); pConsole->Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); } void CConsole::ConModCommandStatus(IResult *pResult, void *pUser) { CConsole* pConsole = static_cast(pUser); char aBuf[240]; mem_zero(aBuf, sizeof(aBuf)); int Used = 0; for(CCommand *pCommand = pConsole->m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) { if(pCommand->m_Flags&pConsole->m_FlagMask && pCommand->GetAccessLevel() == ACCESS_LEVEL_MOD) { int Length = str_length(pCommand->m_pName); if(Used + Length + 2 < (int)(sizeof(aBuf))) { if(Used > 0) { Used += 2; str_append(aBuf, ", ", sizeof(aBuf)); } str_append(aBuf, pCommand->m_pName, sizeof(aBuf)); Used += Length; } else { pConsole->Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); mem_zero(aBuf, sizeof(aBuf)); str_copy(aBuf, pCommand->m_pName, sizeof(aBuf)); Used = Length; } } } if(Used > 0) pConsole->Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); } struct CIntVariableData { IConsole *m_pConsole; int *m_pVariable; int m_Min; int m_Max; }; struct CStrVariableData { IConsole *m_pConsole; char *m_pStr; int m_MaxSize; }; static void IntVariableCommand(IConsole::IResult *pResult, void *pUserData) { CIntVariableData *pData = (CIntVariableData *)pUserData; if(pResult->NumArguments()) { int Val = pResult->GetInteger(0); // do clamping if(pData->m_Min != pData->m_Max) { if (Val < pData->m_Min) Val = pData->m_Min; if (pData->m_Max != 0 && Val > pData->m_Max) Val = pData->m_Max; } *(pData->m_pVariable) = Val; } else { char aBuf[1024]; str_format(aBuf, sizeof(aBuf), "Value: %d", *(pData->m_pVariable)); pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "Console", aBuf); } } static void StrVariableCommand(IConsole::IResult *pResult, void *pUserData) { CStrVariableData *pData = (CStrVariableData *)pUserData; if(pResult->NumArguments()) { const char *pString = pResult->GetString(0); if(!str_utf8_check(pString)) { char Temp[4]; int Length = 0; while(*pString) { int Size = str_utf8_encode(Temp, static_cast(*pString++)); if(Length+Size < pData->m_MaxSize) { mem_copy(pData->m_pStr+Length, &Temp, Size); Length += Size; } else break; } pData->m_pStr[Length] = 0; } else str_copy(pData->m_pStr, pString, pData->m_MaxSize); } else { char aBuf[1024]; str_format(aBuf, sizeof(aBuf), "Value: %s", pData->m_pStr); pData->m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "Console", aBuf); } } void CConsole::ConToggle(IConsole::IResult *pResult, void *pUser) { CConsole* pConsole = static_cast(pUser); char aBuf[128] = {0}; CCommand *pCommand = pConsole->FindCommand(pResult->GetString(0), pConsole->m_FlagMask); if(pCommand) { FCommandCallback pfnCallback = pCommand->m_pfnCallback; void *pUserData = pCommand->m_pUserData; // check for chain if(pCommand->m_pfnCallback == Con_Chain) { CChain *pChainInfo = static_cast(pCommand->m_pUserData); pfnCallback = pChainInfo->m_pfnCallback; pUserData = pChainInfo->m_pCallbackUserData; } if(pfnCallback == IntVariableCommand) { CIntVariableData *pData = static_cast(pUserData); int Val = *(pData->m_pVariable)==pResult->GetInteger(1) ? pResult->GetInteger(2) : pResult->GetInteger(1); str_format(aBuf, sizeof(aBuf), "%s %i", pResult->GetString(0), Val); pConsole->ExecuteLine(aBuf); aBuf[0] = 0; } else str_format(aBuf, sizeof(aBuf), "Invalid command: '%s'.", pResult->GetString(0)); } else str_format(aBuf, sizeof(aBuf), "No such command: '%s'.", pResult->GetString(0)); if(aBuf[0] != 0) pConsole->Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); } void CConsole::ConToggleStroke(IConsole::IResult *pResult, void *pUser) { CConsole* pConsole = static_cast(pUser); char aBuf[128] = {0}; CCommand *pCommand = pConsole->FindCommand(pResult->GetString(1), pConsole->m_FlagMask); if(pCommand) { FCommandCallback pfnCallback = pCommand->m_pfnCallback; // check for chain if(pCommand->m_pfnCallback == Con_Chain) { CChain *pChainInfo = static_cast(pCommand->m_pUserData); pfnCallback = pChainInfo->m_pfnCallback; } if(pfnCallback == IntVariableCommand) { int Val = pResult->GetInteger(0)==0 ? pResult->GetInteger(3) : pResult->GetInteger(2); str_format(aBuf, sizeof(aBuf), "%s %i", pResult->GetString(1), Val); pConsole->ExecuteLine(aBuf); aBuf[0] = 0; } else str_format(aBuf, sizeof(aBuf), "Invalid command: '%s'.", pResult->GetString(1)); } else str_format(aBuf, sizeof(aBuf), "No such command: '%s'.", pResult->GetString(1)); if(aBuf[0] != 0) pConsole->Print(OUTPUT_LEVEL_STANDARD, "Console", aBuf); } CConsole::CConsole(int FlagMask) { m_FlagMask = FlagMask; m_AccessLevel = ACCESS_LEVEL_ADMIN; m_pRecycleList = 0; m_TempCommands.Reset(); m_StoreCommands = true; m_paStrokeStr[0] = "0"; m_paStrokeStr[1] = "1"; m_ExecutionQueue.Reset(); m_pFirstCommand = 0; m_pFirstExec = 0; mem_zero(m_aPrintCB, sizeof(m_aPrintCB)); m_NumPrintCB = 0; m_pStorage = 0; // register some basic commands Register("echo", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_Echo, this, "Echo the text"); Register("exec", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_Exec, this, "Execute the specified file"); Register("toggle", "sii", CFGFLAG_SERVER|CFGFLAG_CLIENT, ConToggle, this, "Toggle config value"); Register("+toggle", "sii", CFGFLAG_CLIENT, ConToggleStroke, this, "Toggle config value via keypress"); Register("mod_command", "s?i", CFGFLAG_SERVER, ConModCommandAccess, this, "Specify command accessibility for moderators"); Register("mod_status", "", CFGFLAG_SERVER, ConModCommandStatus, this, "List all commands which are accessible for moderators"); // TODO: this should disappear #define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Flags,Desc) \ { \ static CIntVariableData Data = { this, &g_Config.m_##Name, Min, Max }; \ Register(#ScriptName, "?i", Flags, IntVariableCommand, &Data, Desc); \ } #define MACRO_CONFIG_STR(Name,ScriptName,Len,Def,Flags,Desc) \ { \ static CStrVariableData Data = { this, g_Config.m_##Name, Len }; \ Register(#ScriptName, "?r", Flags, StrVariableCommand, &Data, Desc); \ } #include "config_variables.h" #undef MACRO_CONFIG_INT #undef MACRO_CONFIG_STR } void CConsole::ParseArguments(int NumArgs, const char **ppArguments) { for(int i = 0; i < NumArgs; i++) { // check for scripts to execute if(ppArguments[i][0] == '-' && ppArguments[i][1] == 'f' && ppArguments[i][2] == 0) { if(NumArgs - i > 1) ExecuteFile(ppArguments[i+1]); i++; } else if(!str_comp("-s", ppArguments[i]) || !str_comp("--silent", ppArguments[i])) { // skip silent param continue; } else { // search arguments for overrides ExecuteLine(ppArguments[i]); } } } void CConsole::AddCommandSorted(CCommand *pCommand) { if(!m_pFirstCommand || str_comp(pCommand->m_pName, m_pFirstCommand->m_pName) <= 0) { if(m_pFirstCommand && m_pFirstCommand->m_pNext) pCommand->m_pNext = m_pFirstCommand; else pCommand->m_pNext = 0; m_pFirstCommand = pCommand; } else { for(CCommand *p = m_pFirstCommand; p; p = p->m_pNext) { if(!p->m_pNext || str_comp(pCommand->m_pName, p->m_pNext->m_pName) <= 0) { pCommand->m_pNext = p->m_pNext; p->m_pNext = pCommand; break; } } } } void CConsole::Register(const char *pName, const char *pParams, int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp) { CCommand *pCommand = FindCommand(pName, Flags); bool DoAdd = false; if(pCommand == 0) { pCommand = new(mem_alloc(sizeof(CCommand), sizeof(void*))) CCommand; DoAdd = true; } pCommand->m_pfnCallback = pfnFunc; pCommand->m_pUserData = pUser; pCommand->m_pName = pName; pCommand->m_pHelp = pHelp; pCommand->m_pParams = pParams; pCommand->m_Flags = Flags; pCommand->m_Temp = false; if(DoAdd) AddCommandSorted(pCommand); } void CConsole::RegisterTemp(const char *pName, const char *pParams, int Flags, const char *pHelp) { CCommand *pCommand; if(m_pRecycleList) { pCommand = m_pRecycleList; str_copy(const_cast(pCommand->m_pName), pName, TEMPCMD_NAME_LENGTH); str_copy(const_cast(pCommand->m_pHelp), pHelp, TEMPCMD_HELP_LENGTH); str_copy(const_cast(pCommand->m_pParams), pParams, TEMPCMD_PARAMS_LENGTH); m_pRecycleList = m_pRecycleList->m_pNext; } else { pCommand = new(m_TempCommands.Allocate(sizeof(CCommand))) CCommand; char *pMem = static_cast(m_TempCommands.Allocate(TEMPCMD_NAME_LENGTH)); str_copy(pMem, pName, TEMPCMD_NAME_LENGTH); pCommand->m_pName = pMem; pMem = static_cast(m_TempCommands.Allocate(TEMPCMD_HELP_LENGTH)); str_copy(pMem, pHelp, TEMPCMD_HELP_LENGTH); pCommand->m_pHelp = pMem; pMem = static_cast(m_TempCommands.Allocate(TEMPCMD_PARAMS_LENGTH)); str_copy(pMem, pParams, TEMPCMD_PARAMS_LENGTH); pCommand->m_pParams = pMem; } pCommand->m_pfnCallback = 0; pCommand->m_pUserData = 0; pCommand->m_Flags = Flags; pCommand->m_Temp = true; AddCommandSorted(pCommand); } void CConsole::DeregisterTemp(const char *pName) { if(!m_pFirstCommand) return; CCommand *pRemoved = 0; // remove temp entry from command list if(m_pFirstCommand->m_Temp && str_comp(m_pFirstCommand->m_pName, pName) == 0) { pRemoved = m_pFirstCommand; m_pFirstCommand = m_pFirstCommand->m_pNext; } else { for(CCommand *pCommand = m_pFirstCommand; pCommand->m_pNext; pCommand = pCommand->m_pNext) if(pCommand->m_pNext->m_Temp && str_comp(pCommand->m_pNext->m_pName, pName) == 0) { pRemoved = pCommand->m_pNext; pCommand->m_pNext = pCommand->m_pNext->m_pNext; break; } } // add to recycle list if(pRemoved) { pRemoved->m_pNext = m_pRecycleList; m_pRecycleList = pRemoved; } } void CConsole::DeregisterTempAll() { // set non temp as first one for(; m_pFirstCommand && m_pFirstCommand->m_Temp; m_pFirstCommand = m_pFirstCommand->m_pNext); // remove temp entries from command list for(CCommand *pCommand = m_pFirstCommand; pCommand && pCommand->m_pNext; pCommand = pCommand->m_pNext) { CCommand *pNext = pCommand->m_pNext; if(pNext->m_Temp) { for(; pNext && pNext->m_Temp; pNext = pNext->m_pNext); pCommand->m_pNext = pNext; } } m_TempCommands.Reset(); m_pRecycleList = 0; } void CConsole::Con_Chain(IResult *pResult, void *pUserData) { CChain *pInfo = (CChain *)pUserData; pInfo->m_pfnChainCallback(pResult, pInfo->m_pUserData, pInfo->m_pfnCallback, pInfo->m_pCallbackUserData); } void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser) { CCommand *pCommand = FindCommand(pName, m_FlagMask); if(!pCommand) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "failed to chain '%s'", pName); Print(IConsole::OUTPUT_LEVEL_DEBUG, "console", aBuf); return; } CChain *pChainInfo = (CChain *)mem_alloc(sizeof(CChain), sizeof(void*)); // store info pChainInfo->m_pfnChainCallback = pfnChainFunc; pChainInfo->m_pUserData = pUser; pChainInfo->m_pfnCallback = pCommand->m_pfnCallback; pChainInfo->m_pCallbackUserData = pCommand->m_pUserData; // chain pCommand->m_pfnCallback = Con_Chain; pCommand->m_pUserData = pChainInfo; } void CConsole::StoreCommands(bool Store) { if(!Store) { for(CExecutionQueue::CQueueEntry *pEntry = m_ExecutionQueue.m_pFirst; pEntry; pEntry = pEntry->m_pNext) pEntry->m_pfnCommandCallback(&pEntry->m_Result, pEntry->m_pCommandUserData); m_ExecutionQueue.Reset(); } m_StoreCommands = Store; } const IConsole::CCommandInfo *CConsole::GetCommandInfo(const char *pName, int FlagMask, bool Temp) { for(CCommand *pCommand = m_pFirstCommand; pCommand; pCommand = pCommand->m_pNext) { if(pCommand->m_Flags&FlagMask && pCommand->m_Temp == Temp) { if(str_comp_nocase(pCommand->m_pName, pName) == 0) return pCommand; } } return 0; } extern IConsole *CreateConsole(int FlagMask) { return new CConsole(FlagMask); } teeworlds-0.6.2+dfsg/src/engine/shared/console.h0000644000175000017500000001221012140200333020543 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_CONSOLE_H #define ENGINE_SHARED_CONSOLE_H #include #include "memheap.h" class CConsole : public IConsole { class CCommand : public CCommandInfo { public: CCommand *m_pNext; int m_Flags; bool m_Temp; FCommandCallback m_pfnCallback; void *m_pUserData; virtual const CCommandInfo *NextCommandInfo(int AccessLevel, int FlagMask) const; void SetAccessLevel(int AccessLevel) { m_AccessLevel = clamp(AccessLevel, (int)(ACCESS_LEVEL_ADMIN), (int)(ACCESS_LEVEL_MOD)); } }; class CChain { public: FChainCommandCallback m_pfnChainCallback; FCommandCallback m_pfnCallback; void *m_pCallbackUserData; void *m_pUserData; }; int m_FlagMask; bool m_StoreCommands; const char *m_paStrokeStr[2]; CCommand *m_pFirstCommand; class CExecFile { public: const char *m_pFilename; CExecFile *m_pPrev; }; CExecFile *m_pFirstExec; class IStorage *m_pStorage; int m_AccessLevel; CCommand *m_pRecycleList; CHeap m_TempCommands; static void Con_Chain(IResult *pResult, void *pUserData); static void Con_Echo(IResult *pResult, void *pUserData); static void Con_Exec(IResult *pResult, void *pUserData); static void ConToggle(IResult *pResult, void *pUser); static void ConToggleStroke(IResult *pResult, void *pUser); static void ConModCommandAccess(IResult *pResult, void *pUser); static void ConModCommandStatus(IConsole::IResult *pResult, void *pUser); void ExecuteFileRecurse(const char *pFilename); void ExecuteLineStroked(int Stroke, const char *pStr); struct { int m_OutputLevel; FPrintCallback m_pfnPrintCallback; void *m_pPrintCallbackUserdata; } m_aPrintCB[MAX_PRINT_CB]; int m_NumPrintCB; enum { CONSOLE_MAX_STR_LENGTH = 1024, MAX_PARTS = (CONSOLE_MAX_STR_LENGTH+1)/2 }; class CResult : public IResult { public: char m_aStringStorage[CONSOLE_MAX_STR_LENGTH+1]; char *m_pArgsStart; const char *m_pCommand; const char *m_apArgs[MAX_PARTS]; CResult() : IResult() { mem_zero(m_aStringStorage, sizeof(m_aStringStorage)); m_pArgsStart = 0; m_pCommand = 0; mem_zero(m_apArgs, sizeof(m_apArgs)); } CResult &operator =(const CResult &Other) { if(this != &Other) { IResult::operator=(Other); int Offset = m_aStringStorage - Other.m_aStringStorage; mem_copy(m_aStringStorage, Other.m_aStringStorage, sizeof(m_aStringStorage)); m_pArgsStart = Other.m_pArgsStart + Offset; m_pCommand = Other.m_pCommand + Offset; for(unsigned i = 0; i < Other.m_NumArgs; ++i) m_apArgs[i] = Other.m_apArgs[i] + Offset; } return *this; } void AddArgument(const char *pArg) { m_apArgs[m_NumArgs++] = pArg; } virtual const char *GetString(unsigned Index); virtual int GetInteger(unsigned Index); virtual float GetFloat(unsigned Index); }; int ParseStart(CResult *pResult, const char *pString, int Length); int ParseArgs(CResult *pResult, const char *pFormat); class CExecutionQueue { CHeap m_Queue; public: struct CQueueEntry { CQueueEntry *m_pNext; FCommandCallback m_pfnCommandCallback; void *m_pCommandUserData; CResult m_Result; } *m_pFirst, *m_pLast; void AddEntry() { CQueueEntry *pEntry = static_cast(m_Queue.Allocate(sizeof(CQueueEntry))); pEntry->m_pNext = 0; if(!m_pFirst) m_pFirst = pEntry; if(m_pLast) m_pLast->m_pNext = pEntry; m_pLast = pEntry; (void)new(&(pEntry->m_Result)) CResult; } void Reset() { m_Queue.Reset(); m_pFirst = m_pLast = 0; } } m_ExecutionQueue; void AddCommandSorted(CCommand *pCommand); CCommand *FindCommand(const char *pName, int FlagMask); public: CConsole(int FlagMask); virtual const CCommandInfo *FirstCommandInfo(int AccessLevel, int FlagMask) const; virtual const CCommandInfo *GetCommandInfo(const char *pName, int FlagMask, bool Temp); virtual void PossibleCommands(const char *pStr, int FlagMask, bool Temp, FPossibleCallback pfnCallback, void *pUser); virtual void ParseArguments(int NumArgs, const char **ppArguments); virtual void Register(const char *pName, const char *pParams, int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp); virtual void RegisterTemp(const char *pName, const char *pParams, int Flags, const char *pHelp); virtual void DeregisterTemp(const char *pName); virtual void DeregisterTempAll(); virtual void Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser); virtual void StoreCommands(bool Store); virtual bool LineIsValid(const char *pStr); virtual void ExecuteLine(const char *pStr); virtual void ExecuteLineFlag(const char *pStr, int FlagMask); virtual void ExecuteFile(const char *pFilename); virtual int RegisterPrintCallback(int OutputLevel, FPrintCallback pfnPrintCallback, void *pUserData); virtual void SetPrintOutputLevel(int Index, int OutputLevel); virtual void Print(int Level, const char *pFrom, const char *pStr); void SetAccessLevel(int AccessLevel) { m_AccessLevel = clamp(AccessLevel, (int)(ACCESS_LEVEL_ADMIN), (int)(ACCESS_LEVEL_MOD)); } }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/datafile.cpp0000644000175000017500000004554712140200333021230 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "datafile.h" #include static const int DEBUG=0; struct CDatafileItemType { int m_Type; int m_Start; int m_Num; } ; struct CDatafileItem { int m_TypeAndID; int m_Size; }; struct CDatafileHeader { char m_aID[4]; int m_Version; int m_Size; int m_Swaplen; int m_NumItemTypes; int m_NumItems; int m_NumRawData; int m_ItemSize; int m_DataSize; }; struct CDatafileData { int m_NumItemTypes; int m_NumItems; int m_NumRawData; int m_ItemSize; int m_DataSize; char m_aStart[4]; }; struct CDatafileInfo { CDatafileItemType *m_pItemTypes; int *m_pItemOffsets; int *m_pDataOffsets; int *m_pDataSizes; char *m_pItemStart; char *m_pDataStart; }; struct CDatafile { IOHANDLE m_File; unsigned m_Crc; CDatafileInfo m_Info; CDatafileHeader m_Header; int m_DataStartOffset; char **m_ppDataPtrs; char *m_pData; }; bool CDataFileReader::Open(class IStorage *pStorage, const char *pFilename, int StorageType) { dbg_msg("datafile", "loading. filename='%s'", pFilename); IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType); if(!File) { dbg_msg("datafile", "could not open '%s'", pFilename); return false; } // take the CRC of the file and store it unsigned Crc = 0; { enum { BUFFER_SIZE = 64*1024 }; unsigned char aBuffer[BUFFER_SIZE]; while(1) { unsigned Bytes = io_read(File, aBuffer, BUFFER_SIZE); if(Bytes <= 0) break; Crc = crc32(Crc, aBuffer, Bytes); // ignore_convention } io_seek(File, 0, IOSEEK_START); } // TODO: change this header CDatafileHeader Header; io_read(File, &Header, sizeof(Header)); if(Header.m_aID[0] != 'A' || Header.m_aID[1] != 'T' || Header.m_aID[2] != 'A' || Header.m_aID[3] != 'D') { if(Header.m_aID[0] != 'D' || Header.m_aID[1] != 'A' || Header.m_aID[2] != 'T' || Header.m_aID[3] != 'A') { dbg_msg("datafile", "wrong signature. %x %x %x %x", Header.m_aID[0], Header.m_aID[1], Header.m_aID[2], Header.m_aID[3]); return 0; } } #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(&Header, sizeof(int), sizeof(Header)/sizeof(int)); #endif if(Header.m_Version != 3 && Header.m_Version != 4) { dbg_msg("datafile", "wrong version. version=%x", Header.m_Version); return 0; } // read in the rest except the data unsigned Size = 0; Size += Header.m_NumItemTypes*sizeof(CDatafileItemType); Size += (Header.m_NumItems+Header.m_NumRawData)*sizeof(int); if(Header.m_Version == 4) Size += Header.m_NumRawData*sizeof(int); // v4 has uncompressed data sizes aswell Size += Header.m_ItemSize; unsigned AllocSize = Size; AllocSize += sizeof(CDatafile); // add space for info structure AllocSize += Header.m_NumRawData*sizeof(void*); // add space for data pointers CDatafile *pTmpDataFile = (CDatafile*)mem_alloc(AllocSize, 1); pTmpDataFile->m_Header = Header; pTmpDataFile->m_DataStartOffset = sizeof(CDatafileHeader) + Size; pTmpDataFile->m_ppDataPtrs = (char**)(pTmpDataFile+1); pTmpDataFile->m_pData = (char *)(pTmpDataFile+1)+Header.m_NumRawData*sizeof(char *); pTmpDataFile->m_File = File; pTmpDataFile->m_Crc = Crc; // clear the data pointers mem_zero(pTmpDataFile->m_ppDataPtrs, Header.m_NumRawData*sizeof(void*)); // read types, offsets, sizes and item data unsigned ReadSize = io_read(File, pTmpDataFile->m_pData, Size); if(ReadSize != Size) { io_close(pTmpDataFile->m_File); mem_free(pTmpDataFile); pTmpDataFile = 0; dbg_msg("datafile", "couldn't load the whole thing, wanted=%d got=%d", Size, ReadSize); return false; } Close(); m_pDataFile = pTmpDataFile; #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(m_pDataFile->m_pData, sizeof(int), min(static_cast(Header.m_Swaplen), Size) / sizeof(int)); #endif //if(DEBUG) { dbg_msg("datafile", "allocsize=%d", AllocSize); dbg_msg("datafile", "readsize=%d", ReadSize); dbg_msg("datafile", "swaplen=%d", Header.m_Swaplen); dbg_msg("datafile", "item_size=%d", m_pDataFile->m_Header.m_ItemSize); } m_pDataFile->m_Info.m_pItemTypes = (CDatafileItemType *)m_pDataFile->m_pData; m_pDataFile->m_Info.m_pItemOffsets = (int *)&m_pDataFile->m_Info.m_pItemTypes[m_pDataFile->m_Header.m_NumItemTypes]; m_pDataFile->m_Info.m_pDataOffsets = (int *)&m_pDataFile->m_Info.m_pItemOffsets[m_pDataFile->m_Header.m_NumItems]; m_pDataFile->m_Info.m_pDataSizes = (int *)&m_pDataFile->m_Info.m_pDataOffsets[m_pDataFile->m_Header.m_NumRawData]; if(Header.m_Version == 4) m_pDataFile->m_Info.m_pItemStart = (char *)&m_pDataFile->m_Info.m_pDataSizes[m_pDataFile->m_Header.m_NumRawData]; else m_pDataFile->m_Info.m_pItemStart = (char *)&m_pDataFile->m_Info.m_pDataOffsets[m_pDataFile->m_Header.m_NumRawData]; m_pDataFile->m_Info.m_pDataStart = m_pDataFile->m_Info.m_pItemStart + m_pDataFile->m_Header.m_ItemSize; dbg_msg("datafile", "loading done. datafile='%s'", pFilename); if(DEBUG) { /* for(int i = 0; i < m_pDataFile->data.num_raw_data; i++) { void *p = datafile_get_data(df, i); dbg_msg("datafile", "%d %d", (int)((char*)p - (char*)(&m_pDataFile->data)), size); } for(int i = 0; i < datafile_num_items(df); i++) { int type, id; void *data = datafile_get_item(df, i, &type, &id); dbg_msg("map", "\t%d: type=%x id=%x p=%p offset=%d", i, type, id, data, m_pDataFile->info.item_offsets[i]); int *idata = (int*)data; for(int k = 0; k < 3; k++) dbg_msg("datafile", "\t\t%d=%d (%x)", k, idata[k], idata[k]); } for(int i = 0; i < m_pDataFile->data.num_m_aItemTypes; i++) { dbg_msg("map", "\t%d: type=%x start=%d num=%d", i, m_pDataFile->info.m_aItemTypes[i].type, m_pDataFile->info.m_aItemTypes[i].start, m_pDataFile->info.m_aItemTypes[i].num); for(int k = 0; k < m_pDataFile->info.m_aItemTypes[i].num; k++) { int type, id; datafile_get_item(df, m_pDataFile->info.m_aItemTypes[i].start+k, &type, &id); if(type != m_pDataFile->info.m_aItemTypes[i].type) dbg_msg("map", "\tERROR"); } } */ } return true; } bool CDataFileReader::GetCrcSize(class IStorage *pStorage, const char *pFilename, int StorageType, unsigned *pCrc, unsigned *pSize) { IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType); if(!File) return false; // get crc and size unsigned Crc = 0; unsigned Size = 0; unsigned char aBuffer[64*1024]; while(1) { unsigned Bytes = io_read(File, aBuffer, sizeof(aBuffer)); if(Bytes <= 0) break; Crc = crc32(Crc, aBuffer, Bytes); // ignore_convention Size += Bytes; } io_close(File); *pCrc = Crc; *pSize = Size; return true; } int CDataFileReader::NumData() { if(!m_pDataFile) { return 0; } return m_pDataFile->m_Header.m_NumRawData; } // always returns the size in the file int CDataFileReader::GetDataSize(int Index) { if(!m_pDataFile) { return 0; } if(Index == m_pDataFile->m_Header.m_NumRawData-1) return m_pDataFile->m_Header.m_DataSize-m_pDataFile->m_Info.m_pDataOffsets[Index]; return m_pDataFile->m_Info.m_pDataOffsets[Index+1]-m_pDataFile->m_Info.m_pDataOffsets[Index]; } void *CDataFileReader::GetDataImpl(int Index, int Swap) { if(!m_pDataFile) { return 0; } // load it if needed if(!m_pDataFile->m_ppDataPtrs[Index]) { // fetch the data size int DataSize = GetDataSize(Index); #if defined(CONF_ARCH_ENDIAN_BIG) int SwapSize = DataSize; #endif if(m_pDataFile->m_Header.m_Version == 4) { // v4 has compressed data void *pTemp = (char *)mem_alloc(DataSize, 1); unsigned long UncompressedSize = m_pDataFile->m_Info.m_pDataSizes[Index]; unsigned long s; dbg_msg("datafile", "loading data index=%d size=%d uncompressed=%d", Index, DataSize, UncompressedSize); m_pDataFile->m_ppDataPtrs[Index] = (char *)mem_alloc(UncompressedSize, 1); // read the compressed data io_seek(m_pDataFile->m_File, m_pDataFile->m_DataStartOffset+m_pDataFile->m_Info.m_pDataOffsets[Index], IOSEEK_START); io_read(m_pDataFile->m_File, pTemp, DataSize); // decompress the data, TODO: check for errors s = UncompressedSize; uncompress((Bytef*)m_pDataFile->m_ppDataPtrs[Index], &s, (Bytef*)pTemp, DataSize); // ignore_convention #if defined(CONF_ARCH_ENDIAN_BIG) SwapSize = s; #endif // clean up the temporary buffers mem_free(pTemp); } else { // load the data dbg_msg("datafile", "loading data index=%d size=%d", Index, DataSize); m_pDataFile->m_ppDataPtrs[Index] = (char *)mem_alloc(DataSize, 1); io_seek(m_pDataFile->m_File, m_pDataFile->m_DataStartOffset+m_pDataFile->m_Info.m_pDataOffsets[Index], IOSEEK_START); io_read(m_pDataFile->m_File, m_pDataFile->m_ppDataPtrs[Index], DataSize); } #if defined(CONF_ARCH_ENDIAN_BIG) if(Swap && SwapSize) swap_endian(m_pDataFile->m_ppDataPtrs[Index], sizeof(int), SwapSize/sizeof(int)); #endif } return m_pDataFile->m_ppDataPtrs[Index]; } void *CDataFileReader::GetData(int Index) { return GetDataImpl(Index, 0); } void *CDataFileReader::GetDataSwapped(int Index) { return GetDataImpl(Index, 1); } void CDataFileReader::UnloadData(int Index) { if(Index < 0) return; // mem_free(m_pDataFile->m_ppDataPtrs[Index]); m_pDataFile->m_ppDataPtrs[Index] = 0x0; } int CDataFileReader::GetItemSize(int Index) { if(!m_pDataFile) { return 0; } if(Index == m_pDataFile->m_Header.m_NumItems-1) return m_pDataFile->m_Header.m_ItemSize-m_pDataFile->m_Info.m_pItemOffsets[Index]; return m_pDataFile->m_Info.m_pItemOffsets[Index+1]-m_pDataFile->m_Info.m_pItemOffsets[Index]; } void *CDataFileReader::GetItem(int Index, int *pType, int *pID) { if(!m_pDataFile) { if(pType) *pType = 0; if(pID) *pID = 0; return 0; } CDatafileItem *i = (CDatafileItem *)(m_pDataFile->m_Info.m_pItemStart+m_pDataFile->m_Info.m_pItemOffsets[Index]); if(pType) *pType = (i->m_TypeAndID>>16)&0xffff; // remove sign extention if(pID) *pID = i->m_TypeAndID&0xffff; return (void *)(i+1); } void CDataFileReader::GetType(int Type, int *pStart, int *pNum) { *pStart = 0; *pNum = 0; if(!m_pDataFile) return; for(int i = 0; i < m_pDataFile->m_Header.m_NumItemTypes; i++) { if(m_pDataFile->m_Info.m_pItemTypes[i].m_Type == Type) { *pStart = m_pDataFile->m_Info.m_pItemTypes[i].m_Start; *pNum = m_pDataFile->m_Info.m_pItemTypes[i].m_Num; return; } } } void *CDataFileReader::FindItem(int Type, int ID) { if(!m_pDataFile) return 0; int Start, Num; GetType(Type, &Start, &Num); for(int i = 0; i < Num; i++) { int ItemID; void *pItem = GetItem(Start+i,0, &ItemID); if(ID == ItemID) return pItem; } return 0; } int CDataFileReader::NumItems() { if(!m_pDataFile) return 0; return m_pDataFile->m_Header.m_NumItems; } bool CDataFileReader::Close() { if(!m_pDataFile) return true; // free the data that is loaded int i; for(i = 0; i < m_pDataFile->m_Header.m_NumRawData; i++) mem_free(m_pDataFile->m_ppDataPtrs[i]); io_close(m_pDataFile->m_File); mem_free(m_pDataFile); m_pDataFile = 0; return true; } unsigned CDataFileReader::Crc() { if(!m_pDataFile) return 0xFFFFFFFF; return m_pDataFile->m_Crc; } CDataFileWriter::CDataFileWriter() { m_File = 0; m_pItemTypes = static_cast(mem_alloc(sizeof(CItemTypeInfo) * MAX_ITEM_TYPES, 1)); m_pItems = static_cast(mem_alloc(sizeof(CItemInfo) * MAX_ITEMS, 1)); m_pDatas = static_cast(mem_alloc(sizeof(CDataInfo) * MAX_DATAS, 1)); } CDataFileWriter::~CDataFileWriter() { mem_free(m_pItemTypes); m_pItemTypes = 0; mem_free(m_pItems); m_pItems = 0; mem_free(m_pDatas); m_pDatas = 0; } bool CDataFileWriter::Open(class IStorage *pStorage, const char *pFilename) { dbg_assert(!m_File, "a file already exists"); m_File = pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); if(!m_File) return false; m_NumItems = 0; m_NumDatas = 0; m_NumItemTypes = 0; mem_zero(m_pItemTypes, sizeof(CItemTypeInfo) * MAX_ITEM_TYPES); for(int i = 0; i < MAX_ITEM_TYPES; i++) { m_pItemTypes[i].m_First = -1; m_pItemTypes[i].m_Last = -1; } return true; } int CDataFileWriter::AddItem(int Type, int ID, int Size, void *pData) { if(!m_File) return 0; dbg_assert(Type >= 0 && Type < 0xFFFF, "incorrect type"); dbg_assert(m_NumItems < 1024, "too many items"); dbg_assert(Size%sizeof(int) == 0, "incorrect boundary"); m_pItems[m_NumItems].m_Type = Type; m_pItems[m_NumItems].m_ID = ID; m_pItems[m_NumItems].m_Size = Size; // copy data m_pItems[m_NumItems].m_pData = mem_alloc(Size, 1); mem_copy(m_pItems[m_NumItems].m_pData, pData, Size); if(!m_pItemTypes[Type].m_Num) // count item types m_NumItemTypes++; // link m_pItems[m_NumItems].m_Prev = m_pItemTypes[Type].m_Last; m_pItems[m_NumItems].m_Next = -1; if(m_pItemTypes[Type].m_Last != -1) m_pItems[m_pItemTypes[Type].m_Last].m_Next = m_NumItems; m_pItemTypes[Type].m_Last = m_NumItems; if(m_pItemTypes[Type].m_First == -1) m_pItemTypes[Type].m_First = m_NumItems; m_pItemTypes[Type].m_Num++; m_NumItems++; return m_NumItems-1; } int CDataFileWriter::AddData(int Size, void *pData) { if(!m_File) return 0; dbg_assert(m_NumDatas < 1024, "too much data"); CDataInfo *pInfo = &m_pDatas[m_NumDatas]; unsigned long s = compressBound(Size); void *pCompData = mem_alloc(s, 1); // temporary buffer that we use during compression int Result = compress((Bytef*)pCompData, &s, (Bytef*)pData, Size); // ignore_convention if(Result != Z_OK) { dbg_msg("datafile", "compression error %d", Result); dbg_assert(0, "zlib error"); } pInfo->m_UncompressedSize = Size; pInfo->m_CompressedSize = (int)s; pInfo->m_pCompressedData = mem_alloc(pInfo->m_CompressedSize, 1); mem_copy(pInfo->m_pCompressedData, pCompData, pInfo->m_CompressedSize); mem_free(pCompData); m_NumDatas++; return m_NumDatas-1; } int CDataFileWriter::AddDataSwapped(int Size, void *pData) { dbg_assert(Size%sizeof(int) == 0, "incorrect boundary"); #if defined(CONF_ARCH_ENDIAN_BIG) void *pSwapped = mem_alloc(Size, 1); // temporary buffer that we use during compression mem_copy(pSwapped, pData, Size); swap_endian(pSwapped, sizeof(int), Size/sizeof(int)); int Index = AddData(Size, pSwapped); mem_free(pSwapped); return Index; #else return AddData(Size, pData); #endif } int CDataFileWriter::Finish() { if(!m_File) return 1; int ItemSize = 0; int TypesSize, HeaderSize, OffsetSize, FileSize, SwapSize; int DataSize = 0; CDatafileHeader Header; // we should now write this file! if(DEBUG) dbg_msg("datafile", "writing"); // calculate sizes for(int i = 0; i < m_NumItems; i++) { if(DEBUG) dbg_msg("datafile", "item=%d size=%d (%d)", i, m_pItems[i].m_Size, m_pItems[i].m_Size+sizeof(CDatafileItem)); ItemSize += m_pItems[i].m_Size + sizeof(CDatafileItem); } for(int i = 0; i < m_NumDatas; i++) DataSize += m_pDatas[i].m_CompressedSize; // calculate the complete size TypesSize = m_NumItemTypes*sizeof(CDatafileItemType); HeaderSize = sizeof(CDatafileHeader); OffsetSize = (m_NumItems + m_NumDatas + m_NumDatas) * sizeof(int); // ItemOffsets, DataOffsets, DataUncompressedSizes FileSize = HeaderSize + TypesSize + OffsetSize + ItemSize + DataSize; SwapSize = FileSize - DataSize; (void)SwapSize; if(DEBUG) dbg_msg("datafile", "num_m_aItemTypes=%d TypesSize=%d m_aItemsize=%d DataSize=%d", m_NumItemTypes, TypesSize, ItemSize, DataSize); // construct Header { Header.m_aID[0] = 'D'; Header.m_aID[1] = 'A'; Header.m_aID[2] = 'T'; Header.m_aID[3] = 'A'; Header.m_Version = 4; Header.m_Size = FileSize - 16; Header.m_Swaplen = SwapSize - 16; Header.m_NumItemTypes = m_NumItemTypes; Header.m_NumItems = m_NumItems; Header.m_NumRawData = m_NumDatas; Header.m_ItemSize = ItemSize; Header.m_DataSize = DataSize; // write Header if(DEBUG) dbg_msg("datafile", "HeaderSize=%d", sizeof(Header)); #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(&Header, sizeof(int), sizeof(Header)/sizeof(int)); #endif io_write(m_File, &Header, sizeof(Header)); } // write types for(int i = 0, Count = 0; i < 0xffff; i++) { if(m_pItemTypes[i].m_Num) { // write info CDatafileItemType Info; Info.m_Type = i; Info.m_Start = Count; Info.m_Num = m_pItemTypes[i].m_Num; if(DEBUG) dbg_msg("datafile", "writing type=%x start=%d num=%d", Info.m_Type, Info.m_Start, Info.m_Num); #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(&Info, sizeof(int), sizeof(CDatafileItemType)/sizeof(int)); #endif io_write(m_File, &Info, sizeof(Info)); Count += m_pItemTypes[i].m_Num; } } // write item offsets for(int i = 0, Offset = 0; i < 0xffff; i++) { if(m_pItemTypes[i].m_Num) { // write all m_pItems in of this type int k = m_pItemTypes[i].m_First; while(k != -1) { if(DEBUG) dbg_msg("datafile", "writing item offset num=%d offset=%d", k, Offset); int Temp = Offset; #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(&Temp, sizeof(int), sizeof(Temp)/sizeof(int)); #endif io_write(m_File, &Temp, sizeof(Temp)); Offset += m_pItems[k].m_Size + sizeof(CDatafileItem); // next k = m_pItems[k].m_Next; } } } // write data offsets for(int i = 0, Offset = 0; i < m_NumDatas; i++) { if(DEBUG) dbg_msg("datafile", "writing data offset num=%d offset=%d", i, Offset); int Temp = Offset; #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(&Temp, sizeof(int), sizeof(Temp)/sizeof(int)); #endif io_write(m_File, &Temp, sizeof(Temp)); Offset += m_pDatas[i].m_CompressedSize; } // write data uncompressed sizes for(int i = 0; i < m_NumDatas; i++) { if(DEBUG) dbg_msg("datafile", "writing data uncompressed size num=%d size=%d", i, m_pDatas[i].m_UncompressedSize); int UncompressedSize = m_pDatas[i].m_UncompressedSize; #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(&UncompressedSize, sizeof(int), sizeof(UncompressedSize)/sizeof(int)); #endif io_write(m_File, &UncompressedSize, sizeof(UncompressedSize)); } // write m_pItems for(int i = 0; i < 0xffff; i++) { if(m_pItemTypes[i].m_Num) { // write all m_pItems in of this type int k = m_pItemTypes[i].m_First; while(k != -1) { CDatafileItem Item; Item.m_TypeAndID = (i<<16)|m_pItems[k].m_ID; Item.m_Size = m_pItems[k].m_Size; if(DEBUG) dbg_msg("datafile", "writing item type=%x idx=%d id=%d size=%d", i, k, m_pItems[k].m_ID, m_pItems[k].m_Size); #if defined(CONF_ARCH_ENDIAN_BIG) swap_endian(&Item, sizeof(int), sizeof(Item)/sizeof(int)); swap_endian(m_pItems[k].m_pData, sizeof(int), m_pItems[k].m_Size/sizeof(int)); #endif io_write(m_File, &Item, sizeof(Item)); io_write(m_File, m_pItems[k].m_pData, m_pItems[k].m_Size); // next k = m_pItems[k].m_Next; } } } // write data for(int i = 0; i < m_NumDatas; i++) { if(DEBUG) dbg_msg("datafile", "writing data id=%d size=%d", i, m_pDatas[i].m_CompressedSize); io_write(m_File, m_pDatas[i].m_pCompressedData, m_pDatas[i].m_CompressedSize); } // free data for(int i = 0; i < m_NumItems; i++) mem_free(m_pItems[i].m_pData); for(int i = 0; i < m_NumDatas; ++i) mem_free(m_pDatas[i].m_pCompressedData); io_close(m_File); m_File = 0; if(DEBUG) dbg_msg("datafile", "done"); return 0; } teeworlds-0.6.2+dfsg/src/engine/shared/datafile.h0000644000175000017500000000364712140200333020670 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_DATAFILE_H #define ENGINE_SHARED_DATAFILE_H // raw datafile access class CDataFileReader { struct CDatafile *m_pDataFile; void *GetDataImpl(int Index, int Swap); public: CDataFileReader() : m_pDataFile(0) {} ~CDataFileReader() { Close(); } bool IsOpen() const { return m_pDataFile != 0; } bool Open(class IStorage *pStorage, const char *pFilename, int StorageType); bool Close(); static bool GetCrcSize(class IStorage *pStorage, const char *pFilename, int StorageType, unsigned *pCrc, unsigned *pSize); void *GetData(int Index); void *GetDataSwapped(int Index); // makes sure that the data is 32bit LE ints when saved int GetDataSize(int Index); void UnloadData(int Index); void *GetItem(int Index, int *pType, int *pID); int GetItemSize(int Index); void GetType(int Type, int *pStart, int *pNum); void *FindItem(int Type, int ID); int NumItems(); int NumData(); void Unload(); unsigned Crc(); }; // write access class CDataFileWriter { struct CDataInfo { int m_UncompressedSize; int m_CompressedSize; void *m_pCompressedData; }; struct CItemInfo { int m_Type; int m_ID; int m_Size; int m_Next; int m_Prev; void *m_pData; }; struct CItemTypeInfo { int m_Num; int m_First; int m_Last; }; enum { MAX_ITEM_TYPES=0xffff, MAX_ITEMS=1024, MAX_DATAS=1024, }; IOHANDLE m_File; int m_NumItems; int m_NumDatas; int m_NumItemTypes; CItemTypeInfo *m_pItemTypes; CItemInfo *m_pItems; CDataInfo *m_pDatas; public: CDataFileWriter(); ~CDataFileWriter(); bool Open(class IStorage *pStorage, const char *Filename); int AddData(int Size, void *pData); int AddDataSwapped(int Size, void *pData); int AddItem(int Type, int ID, int Size, void *pData); int Finish(); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/demo.cpp0000644000175000017500000005360112140200333020371 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include "compression.h" #include "demo.h" #include "memheap.h" #include "network.h" #include "snapshot.h" static const unsigned char gs_aHeaderMarker[7] = {'T', 'W', 'D', 'E', 'M', 'O', 0}; static const unsigned char gs_ActVersion = 4; static const unsigned char gs_OldVersion = 3; static const int gs_LengthOffset = 152; static const int gs_NumMarkersOffset = 176; CDemoRecorder::CDemoRecorder(class CSnapshotDelta *pSnapshotDelta) { m_File = 0; m_LastTickMarker = -1; m_pSnapshotDelta = pSnapshotDelta; } // Record int CDemoRecorder::Start(class IStorage *pStorage, class IConsole *pConsole, const char *pFilename, const char *pNetVersion, const char *pMap, unsigned Crc, const char *pType) { CDemoHeader Header; CTimelineMarkers TimelineMarkers; if(m_File) return -1; m_pConsole = pConsole; // open mapfile char aMapFilename[128]; // try the normal maps folder str_format(aMapFilename, sizeof(aMapFilename), "maps/%s.map", pMap); IOHANDLE MapFile = pStorage->OpenFile(aMapFilename, IOFLAG_READ, IStorage::TYPE_ALL); if(!MapFile) { // try the downloaded maps str_format(aMapFilename, sizeof(aMapFilename), "downloadedmaps/%s_%08x.map", pMap, Crc); MapFile = pStorage->OpenFile(aMapFilename, IOFLAG_READ, IStorage::TYPE_ALL); } if(!MapFile) { // search for the map within subfolders char aBuf[512]; str_format(aMapFilename, sizeof(aMapFilename), "%s.map", pMap); if(pStorage->FindFile(aMapFilename, "maps", IStorage::TYPE_ALL, aBuf, sizeof(aBuf))) MapFile = pStorage->OpenFile(aBuf, IOFLAG_READ, IStorage::TYPE_ALL); } if(!MapFile) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "Unable to open mapfile '%s'", pMap); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", aBuf); return -1; } IOHANDLE DemoFile = pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); if(!DemoFile) { io_close(MapFile); MapFile = 0; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "Unable to open '%s' for recording", pFilename); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", aBuf); return -1; } // write header mem_zero(&Header, sizeof(Header)); mem_copy(Header.m_aMarker, gs_aHeaderMarker, sizeof(Header.m_aMarker)); Header.m_Version = gs_ActVersion; str_copy(Header.m_aNetversion, pNetVersion, sizeof(Header.m_aNetversion)); str_copy(Header.m_aMapName, pMap, sizeof(Header.m_aMapName)); unsigned MapSize = io_length(MapFile); Header.m_aMapSize[0] = (MapSize>>24)&0xff; Header.m_aMapSize[1] = (MapSize>>16)&0xff; Header.m_aMapSize[2] = (MapSize>>8)&0xff; Header.m_aMapSize[3] = (MapSize)&0xff; Header.m_aMapCrc[0] = (Crc>>24)&0xff; Header.m_aMapCrc[1] = (Crc>>16)&0xff; Header.m_aMapCrc[2] = (Crc>>8)&0xff; Header.m_aMapCrc[3] = (Crc)&0xff; str_copy(Header.m_aType, pType, sizeof(Header.m_aType)); // Header.m_Length - add this on stop str_timestamp(Header.m_aTimestamp, sizeof(Header.m_aTimestamp)); io_write(DemoFile, &Header, sizeof(Header)); io_write(DemoFile, &TimelineMarkers, sizeof(TimelineMarkers)); // fill this on stop // write map data while(1) { unsigned char aChunk[1024*64]; int Bytes = io_read(MapFile, &aChunk, sizeof(aChunk)); if(Bytes <= 0) break; io_write(DemoFile, &aChunk, Bytes); } io_close(MapFile); m_LastKeyFrame = -1; m_LastTickMarker = -1; m_FirstTick = -1; m_NumTimelineMarkers = 0; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "Recording to '%s'", pFilename); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", aBuf); m_File = DemoFile; return 0; } /* Tickmarker 7 = Always set 6 = Keyframe flag 0-5 = Delta tick Normal 7 = Not set 5-6 = Type 0-4 = Size */ enum { CHUNKTYPEFLAG_TICKMARKER = 0x80, CHUNKTICKFLAG_KEYFRAME = 0x40, // only when tickmarker is set CHUNKMASK_TICK = 0x3f, CHUNKMASK_TYPE = 0x60, CHUNKMASK_SIZE = 0x1f, CHUNKTYPE_SNAPSHOT = 1, CHUNKTYPE_MESSAGE = 2, CHUNKTYPE_DELTA = 3, CHUNKFLAG_BIGSIZE = 0x10 }; void CDemoRecorder::WriteTickMarker(int Tick, int Keyframe) { if(m_LastTickMarker == -1 || Tick-m_LastTickMarker > 63 || Keyframe) { unsigned char aChunk[5]; aChunk[0] = CHUNKTYPEFLAG_TICKMARKER; aChunk[1] = (Tick>>24)&0xff; aChunk[2] = (Tick>>16)&0xff; aChunk[3] = (Tick>>8)&0xff; aChunk[4] = (Tick)&0xff; if(Keyframe) aChunk[0] |= CHUNKTICKFLAG_KEYFRAME; io_write(m_File, aChunk, sizeof(aChunk)); } else { unsigned char aChunk[1]; aChunk[0] = CHUNKTYPEFLAG_TICKMARKER | (Tick-m_LastTickMarker); io_write(m_File, aChunk, sizeof(aChunk)); } m_LastTickMarker = Tick; if(m_FirstTick < 0) m_FirstTick = Tick; } void CDemoRecorder::Write(int Type, const void *pData, int Size) { char aBuffer[64*1024]; char aBuffer2[64*1024]; unsigned char aChunk[3]; if(!m_File) return; /* pad the data with 0 so we get an alignment of 4, else the compression won't work and miss some bytes */ mem_copy(aBuffer2, pData, Size); while(Size&3) aBuffer2[Size++] = 0; Size = CVariableInt::Compress(aBuffer2, Size, aBuffer); // buffer2 -> buffer Size = CNetBase::Compress(aBuffer, Size, aBuffer2, sizeof(aBuffer2)); // buffer -> buffer2 aChunk[0] = ((Type&0x3)<<5); if(Size < 30) { aChunk[0] |= Size; io_write(m_File, aChunk, 1); } else { if(Size < 256) { aChunk[0] |= 30; aChunk[1] = Size&0xff; io_write(m_File, aChunk, 2); } else { aChunk[0] |= 31; aChunk[1] = Size&0xff; aChunk[2] = Size>>8; io_write(m_File, aChunk, 3); } } io_write(m_File, aBuffer2, Size); } void CDemoRecorder::RecordSnapshot(int Tick, const void *pData, int Size) { if(m_LastKeyFrame == -1 || (Tick-m_LastKeyFrame) > SERVER_TICK_SPEED*5) { // write full tickmarker WriteTickMarker(Tick, 1); // write snapshot Write(CHUNKTYPE_SNAPSHOT, pData, Size); m_LastKeyFrame = Tick; mem_copy(m_aLastSnapshotData, pData, Size); } else { // create delta, prepend tick char aDeltaData[CSnapshot::MAX_SIZE+sizeof(int)]; int DeltaSize; // write tickmarker WriteTickMarker(Tick, 0); DeltaSize = m_pSnapshotDelta->CreateDelta((CSnapshot*)m_aLastSnapshotData, (CSnapshot*)pData, &aDeltaData); if(DeltaSize) { // record delta Write(CHUNKTYPE_DELTA, aDeltaData, DeltaSize); mem_copy(m_aLastSnapshotData, pData, Size); } } } void CDemoRecorder::RecordMessage(const void *pData, int Size) { Write(CHUNKTYPE_MESSAGE, pData, Size); } int CDemoRecorder::Stop() { if(!m_File) return -1; // add the demo length to the header io_seek(m_File, gs_LengthOffset, IOSEEK_START); int DemoLength = Length(); char aLength[4]; aLength[0] = (DemoLength>>24)&0xff; aLength[1] = (DemoLength>>16)&0xff; aLength[2] = (DemoLength>>8)&0xff; aLength[3] = (DemoLength)&0xff; io_write(m_File, aLength, sizeof(aLength)); // add the timeline markers to the header io_seek(m_File, gs_NumMarkersOffset, IOSEEK_START); char aNumMarkers[4]; aNumMarkers[0] = (m_NumTimelineMarkers>>24)&0xff; aNumMarkers[1] = (m_NumTimelineMarkers>>16)&0xff; aNumMarkers[2] = (m_NumTimelineMarkers>>8)&0xff; aNumMarkers[3] = (m_NumTimelineMarkers)&0xff; io_write(m_File, aNumMarkers, sizeof(aNumMarkers)); for(int i = 0; i < m_NumTimelineMarkers; i++) { int Marker = m_aTimelineMarkers[i]; char aMarker[4]; aMarker[0] = (Marker>>24)&0xff; aMarker[1] = (Marker>>16)&0xff; aMarker[2] = (Marker>>8)&0xff; aMarker[3] = (Marker)&0xff; io_write(m_File, aMarker, sizeof(aMarker)); } io_close(m_File); m_File = 0; m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Stopped recording"); return 0; } void CDemoRecorder::AddDemoMarker() { if(m_LastTickMarker < 0 || m_NumTimelineMarkers >= MAX_TIMELINE_MARKERS) return; // not more than 1 marker in a second if(m_NumTimelineMarkers > 0) { int Diff = m_LastTickMarker - m_aTimelineMarkers[m_NumTimelineMarkers-1]; if(Diff < SERVER_TICK_SPEED*1.0f) return; } m_aTimelineMarkers[m_NumTimelineMarkers++] = m_LastTickMarker; m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_recorder", "Added timeline marker"); } CDemoPlayer::CDemoPlayer(class CSnapshotDelta *pSnapshotDelta) { m_File = 0; m_pKeyFrames = 0; m_pSnapshotDelta = pSnapshotDelta; m_LastSnapshotDataSize = -1; } void CDemoPlayer::SetListner(IListner *pListner) { m_pListner = pListner; } int CDemoPlayer::ReadChunkHeader(int *pType, int *pSize, int *pTick) { unsigned char Chunk = 0; *pSize = 0; *pType = 0; if(io_read(m_File, &Chunk, sizeof(Chunk)) != sizeof(Chunk)) return -1; if(Chunk&CHUNKTYPEFLAG_TICKMARKER) { // decode tick marker int Tickdelta = Chunk&(CHUNKMASK_TICK); *pType = Chunk&(CHUNKTYPEFLAG_TICKMARKER|CHUNKTICKFLAG_KEYFRAME); if(Tickdelta == 0) { unsigned char aTickdata[4]; if(io_read(m_File, aTickdata, sizeof(aTickdata)) != sizeof(aTickdata)) return -1; *pTick = (aTickdata[0]<<24) | (aTickdata[1]<<16) | (aTickdata[2]<<8) | aTickdata[3]; } else { *pTick += Tickdelta; } } else { // decode normal chunk *pType = (Chunk&CHUNKMASK_TYPE)>>5; *pSize = Chunk&CHUNKMASK_SIZE; if(*pSize == 30) { unsigned char aSizedata[1]; if(io_read(m_File, aSizedata, sizeof(aSizedata)) != sizeof(aSizedata)) return -1; *pSize = aSizedata[0]; } else if(*pSize == 31) { unsigned char aSizedata[2]; if(io_read(m_File, aSizedata, sizeof(aSizedata)) != sizeof(aSizedata)) return -1; *pSize = (aSizedata[1]<<8) | aSizedata[0]; } } return 0; } void CDemoPlayer::ScanFile() { long StartPos; CHeap Heap; CKeyFrameSearch *pFirstKey = 0; CKeyFrameSearch *pCurrentKey = 0; //DEMOREC_CHUNK chunk; int ChunkSize, ChunkType, ChunkTick = 0; int i; StartPos = io_tell(m_File); m_Info.m_SeekablePoints = 0; while(1) { long CurrentPos = io_tell(m_File); if(ReadChunkHeader(&ChunkType, &ChunkSize, &ChunkTick)) break; // read the chunk if(ChunkType&CHUNKTYPEFLAG_TICKMARKER) { if(ChunkType&CHUNKTICKFLAG_KEYFRAME) { CKeyFrameSearch *pKey; // save the position pKey = (CKeyFrameSearch *)Heap.Allocate(sizeof(CKeyFrameSearch)); pKey->m_Frame.m_Filepos = CurrentPos; pKey->m_Frame.m_Tick = ChunkTick; pKey->m_pNext = 0; if(pCurrentKey) pCurrentKey->m_pNext = pKey; if(!pFirstKey) pFirstKey = pKey; pCurrentKey = pKey; m_Info.m_SeekablePoints++; } if(m_Info.m_Info.m_FirstTick == -1) m_Info.m_Info.m_FirstTick = ChunkTick; m_Info.m_Info.m_LastTick = ChunkTick; } else if(ChunkSize) io_skip(m_File, ChunkSize); } // copy all the frames to an array instead for fast access m_pKeyFrames = (CKeyFrame*)mem_alloc(m_Info.m_SeekablePoints*sizeof(CKeyFrame), 1); for(pCurrentKey = pFirstKey, i = 0; pCurrentKey; pCurrentKey = pCurrentKey->m_pNext, i++) m_pKeyFrames[i] = pCurrentKey->m_Frame; // destroy the temporary heap and seek back to the start io_seek(m_File, StartPos, IOSEEK_START); } void CDemoPlayer::DoTick() { static char aCompresseddata[CSnapshot::MAX_SIZE]; static char aDecompressed[CSnapshot::MAX_SIZE]; static char aData[CSnapshot::MAX_SIZE]; int ChunkType, ChunkTick, ChunkSize; int DataSize = 0; int GotSnapshot = 0; // update ticks m_Info.m_PreviousTick = m_Info.m_Info.m_CurrentTick; m_Info.m_Info.m_CurrentTick = m_Info.m_NextTick; ChunkTick = m_Info.m_Info.m_CurrentTick; while(1) { if(ReadChunkHeader(&ChunkType, &ChunkSize, &ChunkTick)) { // stop on error or eof m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", "end of file"); if(m_Info.m_PreviousTick == -1) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", "empty demo"); Stop(); } else Pause(); break; } // read the chunk if(ChunkSize) { if(io_read(m_File, aCompresseddata, ChunkSize) != (unsigned)ChunkSize) { // stop on error or eof m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", "error reading chunk"); Stop(); break; } DataSize = CNetBase::Decompress(aCompresseddata, ChunkSize, aDecompressed, sizeof(aDecompressed)); if(DataSize < 0) { // stop on error or eof m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", "error during network decompression"); Stop(); break; } DataSize = CVariableInt::Decompress(aDecompressed, DataSize, aData); if(DataSize < 0) { m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", "error during intpack decompression"); Stop(); break; } } if(ChunkType == CHUNKTYPE_DELTA) { // process delta snapshot static char aNewsnap[CSnapshot::MAX_SIZE]; GotSnapshot = 1; DataSize = m_pSnapshotDelta->UnpackDelta((CSnapshot*)m_aLastSnapshotData, (CSnapshot*)aNewsnap, aData, DataSize); if(DataSize >= 0) { if(m_pListner) m_pListner->OnDemoPlayerSnapshot(aNewsnap, DataSize); m_LastSnapshotDataSize = DataSize; mem_copy(m_aLastSnapshotData, aNewsnap, DataSize); } else { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "error during unpacking of delta, err=%d", DataSize); m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", aBuf); } } else if(ChunkType == CHUNKTYPE_SNAPSHOT) { // process full snapshot GotSnapshot = 1; m_LastSnapshotDataSize = DataSize; mem_copy(m_aLastSnapshotData, aData, DataSize); if(m_pListner) m_pListner->OnDemoPlayerSnapshot(aData, DataSize); } else { // if there were no snapshots in this tick, replay the last one if(!GotSnapshot && m_pListner && m_LastSnapshotDataSize != -1) { GotSnapshot = 1; m_pListner->OnDemoPlayerSnapshot(m_aLastSnapshotData, m_LastSnapshotDataSize); } // check the remaining types if(ChunkType&CHUNKTYPEFLAG_TICKMARKER) { m_Info.m_NextTick = ChunkTick; break; } else if(ChunkType == CHUNKTYPE_MESSAGE) { if(m_pListner) m_pListner->OnDemoPlayerMessage(aData, DataSize); } } } } void CDemoPlayer::Pause() { m_Info.m_Info.m_Paused = 1; } void CDemoPlayer::Unpause() { if(m_Info.m_Info.m_Paused) { /*m_Info.start_tick = m_Info.current_tick; m_Info.start_time = time_get();*/ m_Info.m_Info.m_Paused = 0; } } int CDemoPlayer::Load(class IStorage *pStorage, class IConsole *pConsole, const char *pFilename, int StorageType) { m_pConsole = pConsole; m_File = pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType); if(!m_File) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "could not open '%s'", pFilename); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", aBuf); return -1; } // store the filename str_copy(m_aFilename, pFilename, sizeof(m_aFilename)); // clear the playback info mem_zero(&m_Info, sizeof(m_Info)); m_Info.m_Info.m_FirstTick = -1; m_Info.m_Info.m_LastTick = -1; m_Info.m_NextTick = -1; m_Info.m_Info.m_CurrentTick = -1; m_Info.m_PreviousTick = -1; m_Info.m_Info.m_Speed = 1; m_LastSnapshotDataSize = -1; // read the header io_read(m_File, &m_Info.m_Header, sizeof(m_Info.m_Header)); if(mem_comp(m_Info.m_Header.m_aMarker, gs_aHeaderMarker, sizeof(gs_aHeaderMarker)) != 0) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "'%s' is not a demo file", pFilename); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", aBuf); io_close(m_File); m_File = 0; return -1; } if(m_Info.m_Header.m_Version < gs_OldVersion) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "demo version %d is not supported", m_Info.m_Header.m_Version); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", aBuf); io_close(m_File); m_File = 0; return -1; } else if(m_Info.m_Header.m_Version > gs_OldVersion) io_read(m_File, &m_Info.m_TimelineMarkers, sizeof(m_Info.m_TimelineMarkers)); // get demo type if(!str_comp(m_Info.m_Header.m_aType, "client")) m_DemoType = DEMOTYPE_CLIENT; else if(!str_comp(m_Info.m_Header.m_aType, "server")) m_DemoType = DEMOTYPE_SERVER; else m_DemoType = DEMOTYPE_INVALID; // read map unsigned MapSize = (m_Info.m_Header.m_aMapSize[0]<<24) | (m_Info.m_Header.m_aMapSize[1]<<16) | (m_Info.m_Header.m_aMapSize[2]<<8) | (m_Info.m_Header.m_aMapSize[3]); // check if we already have the map // TODO: improve map checking (maps folder, check crc) unsigned Crc = (m_Info.m_Header.m_aMapCrc[0]<<24) | (m_Info.m_Header.m_aMapCrc[1]<<16) | (m_Info.m_Header.m_aMapCrc[2]<<8) | (m_Info.m_Header.m_aMapCrc[3]); char aMapFilename[128]; str_format(aMapFilename, sizeof(aMapFilename), "downloadedmaps/%s_%08x.map", m_Info.m_Header.m_aMapName, Crc); IOHANDLE MapFile = pStorage->OpenFile(aMapFilename, IOFLAG_READ, IStorage::TYPE_ALL); if(MapFile) { io_skip(m_File, MapSize); io_close(MapFile); } else if(MapSize > 0) { // get map data unsigned char *pMapData = (unsigned char *)mem_alloc(MapSize, 1); io_read(m_File, pMapData, MapSize); // save map MapFile = pStorage->OpenFile(aMapFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); io_write(MapFile, pMapData, MapSize); io_close(MapFile); // free data mem_free(pMapData); } if(m_Info.m_Header.m_Version > gs_OldVersion) { // get timeline markers int Num = ((m_Info.m_TimelineMarkers.m_aNumTimelineMarkers[0]<<24)&0xFF000000) | ((m_Info.m_TimelineMarkers.m_aNumTimelineMarkers[1]<<16)&0xFF0000) | ((m_Info.m_TimelineMarkers.m_aNumTimelineMarkers[2]<<8)&0xFF00) | (m_Info.m_TimelineMarkers.m_aNumTimelineMarkers[3]&0xFF); m_Info.m_Info.m_NumTimelineMarkers = Num; for(int i = 0; i < Num && i < MAX_TIMELINE_MARKERS; i++) { char *pTimelineMarker = m_Info.m_TimelineMarkers.m_aTimelineMarkers[i]; m_Info.m_Info.m_aTimelineMarkers[i] = ((pTimelineMarker[0]<<24)&0xFF000000) | ((pTimelineMarker[1]<<16)&0xFF0000) | ((pTimelineMarker[2]<<8)&0xFF00) | (pTimelineMarker[3]&0xFF); } } // scan the file for interessting points ScanFile(); // ready for playback return 0; } int CDemoPlayer::NextFrame() { DoTick(); return IsPlaying(); } int CDemoPlayer::Play() { // fill in previous and next tick while(m_Info.m_PreviousTick == -1 && IsPlaying()) DoTick(); // set start info /*m_Info.start_tick = m_Info.previous_tick; m_Info.start_time = time_get();*/ m_Info.m_CurrentTime = m_Info.m_PreviousTick*time_freq()/SERVER_TICK_SPEED; m_Info.m_LastUpdate = time_get(); return 0; } int CDemoPlayer::SetPos(float Percent) { int Keyframe; int WantedTick; if(!m_File) return -1; // -5 because we have to have a current tick and previous tick when we do the playback WantedTick = m_Info.m_Info.m_FirstTick + (int)((m_Info.m_Info.m_LastTick-m_Info.m_Info.m_FirstTick)*Percent) - 5; Keyframe = (int)(m_Info.m_SeekablePoints*Percent); if(Keyframe < 0 || Keyframe >= m_Info.m_SeekablePoints) return -1; // get correct key frame if(m_pKeyFrames[Keyframe].m_Tick < WantedTick) while(Keyframe < m_Info.m_SeekablePoints-1 && m_pKeyFrames[Keyframe].m_Tick < WantedTick) Keyframe++; while(Keyframe && m_pKeyFrames[Keyframe].m_Tick > WantedTick) Keyframe--; // seek to the correct keyframe io_seek(m_File, m_pKeyFrames[Keyframe].m_Filepos, IOSEEK_START); //m_Info.start_tick = -1; m_Info.m_NextTick = -1; m_Info.m_Info.m_CurrentTick = -1; m_Info.m_PreviousTick = -1; // playback everything until we hit our tick while(m_Info.m_PreviousTick < WantedTick) DoTick(); Play(); return 0; } void CDemoPlayer::SetSpeed(float Speed) { m_Info.m_Info.m_Speed = Speed; } int CDemoPlayer::Update() { int64 Now = time_get(); int64 Deltatime = Now-m_Info.m_LastUpdate; m_Info.m_LastUpdate = Now; if(!IsPlaying()) return 0; if(m_Info.m_Info.m_Paused) { } else { int64 Freq = time_freq(); m_Info.m_CurrentTime += (int64)(Deltatime*(double)m_Info.m_Info.m_Speed); while(1) { int64 CurtickStart = (m_Info.m_Info.m_CurrentTick)*Freq/SERVER_TICK_SPEED; // break if we are ready if(CurtickStart > m_Info.m_CurrentTime) break; // do one more tick DoTick(); if(m_Info.m_Info.m_Paused) return 0; } // update intratick { int64 CurtickStart = (m_Info.m_Info.m_CurrentTick)*Freq/SERVER_TICK_SPEED; int64 PrevtickStart = (m_Info.m_PreviousTick)*Freq/SERVER_TICK_SPEED; m_Info.m_IntraTick = (m_Info.m_CurrentTime - PrevtickStart) / (float)(CurtickStart-PrevtickStart); m_Info.m_TickTime = (m_Info.m_CurrentTime - PrevtickStart) / (float)Freq; } if(m_Info.m_Info.m_CurrentTick == m_Info.m_PreviousTick || m_Info.m_Info.m_CurrentTick == m_Info.m_NextTick) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "tick error prev=%d cur=%d next=%d", m_Info.m_PreviousTick, m_Info.m_Info.m_CurrentTick, m_Info.m_NextTick); m_pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "demo_player", aBuf); } } return 0; } int CDemoPlayer::Stop() { if(!m_File) return -1; m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demo_player", "Stopped playback"); io_close(m_File); m_File = 0; mem_free(m_pKeyFrames); m_pKeyFrames = 0; str_copy(m_aFilename, "", sizeof(m_aFilename)); return 0; } void CDemoPlayer::GetDemoName(char *pBuffer, int BufferSize) const { const char *pFileName = m_aFilename; const char *pExtractedName = pFileName; const char *pEnd = 0; for(; *pFileName; ++pFileName) { if(*pFileName == '/' || *pFileName == '\\') pExtractedName = pFileName+1; else if(*pFileName == '.') pEnd = pFileName; } int Length = pEnd > pExtractedName ? min(BufferSize, (int)(pEnd-pExtractedName+1)) : BufferSize; str_copy(pBuffer, pExtractedName, Length); } bool CDemoPlayer::GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader) const { if(!pDemoHeader) return false; mem_zero(pDemoHeader, sizeof(CDemoHeader)); IOHANDLE File = pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType); if(!File) return false; io_read(File, pDemoHeader, sizeof(CDemoHeader)); if(mem_comp(pDemoHeader->m_aMarker, gs_aHeaderMarker, sizeof(gs_aHeaderMarker)) || pDemoHeader->m_Version < gs_OldVersion) { io_close(File); return false; } io_close(File); return true; } int CDemoPlayer::GetDemoType() const { if(m_File) return m_DemoType; return DEMOTYPE_INVALID; } teeworlds-0.6.2+dfsg/src/engine/shared/demo.h0000644000175000017500000000576312140200333020044 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_DEMO_H #define ENGINE_SHARED_DEMO_H #include #include #include "snapshot.h" class CDemoRecorder : public IDemoRecorder { class IConsole *m_pConsole; IOHANDLE m_File; int m_LastTickMarker; int m_LastKeyFrame; int m_FirstTick; unsigned char m_aLastSnapshotData[CSnapshot::MAX_SIZE]; class CSnapshotDelta *m_pSnapshotDelta; int m_NumTimelineMarkers; int m_aTimelineMarkers[MAX_TIMELINE_MARKERS]; void WriteTickMarker(int Tick, int Keyframe); void Write(int Type, const void *pData, int Size); public: CDemoRecorder(class CSnapshotDelta *pSnapshotDelta); int Start(class IStorage *pStorage, class IConsole *pConsole, const char *pFilename, const char *pNetversion, const char *pMap, unsigned MapCrc, const char *pType); int Stop(); void AddDemoMarker(); void RecordSnapshot(int Tick, const void *pData, int Size); void RecordMessage(const void *pData, int Size); bool IsRecording() const { return m_File != 0; } int Length() const { return (m_LastTickMarker - m_FirstTick)/SERVER_TICK_SPEED; } }; class CDemoPlayer : public IDemoPlayer { public: class IListner { public: virtual ~IListner() {} virtual void OnDemoPlayerSnapshot(void *pData, int Size) = 0; virtual void OnDemoPlayerMessage(void *pData, int Size) = 0; }; struct CPlaybackInfo { CDemoHeader m_Header; CTimelineMarkers m_TimelineMarkers; IDemoPlayer::CInfo m_Info; int64 m_LastUpdate; int64 m_CurrentTime; int m_SeekablePoints; int m_NextTick; int m_PreviousTick; float m_IntraTick; float m_TickTime; }; private: IListner *m_pListner; // Playback struct CKeyFrame { long m_Filepos; int m_Tick; }; struct CKeyFrameSearch { CKeyFrame m_Frame; CKeyFrameSearch *m_pNext; }; class IConsole *m_pConsole; IOHANDLE m_File; char m_aFilename[256]; CKeyFrame *m_pKeyFrames; CPlaybackInfo m_Info; int m_DemoType; unsigned char m_aLastSnapshotData[CSnapshot::MAX_SIZE]; int m_LastSnapshotDataSize; class CSnapshotDelta *m_pSnapshotDelta; int ReadChunkHeader(int *pType, int *pSize, int *pTick); void DoTick(); void ScanFile(); int NextFrame(); public: CDemoPlayer(class CSnapshotDelta *m_pSnapshotDelta); void SetListner(IListner *pListner); int Load(class IStorage *pStorage, class IConsole *pConsole, const char *pFilename, int StorageType); int Play(); void Pause(); void Unpause(); int Stop(); void SetSpeed(float Speed); int SetPos(float Percent); const CInfo *BaseInfo() const { return &m_Info.m_Info; } void GetDemoName(char *pBuffer, int BufferSize) const; bool GetDemoInfo(class IStorage *pStorage, const char *pFilename, int StorageType, CDemoHeader *pDemoHeader) const; int GetDemoType() const; int Update(); const CPlaybackInfo *Info() const { return &m_Info; } int IsPlaying() const { return m_File != 0; } }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/econ.cpp0000644000175000017500000001316712140200333020374 0ustar felixfelix#include #include #include "econ.h" #include "netban.h" int CEcon::NewClientCallback(int ClientID, void *pUser) { CEcon *pThis = (CEcon *)pUser; char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pThis->m_NetConsole.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); char aBuf[128]; str_format(aBuf, sizeof(aBuf), "client accepted. cid=%d addr=%s'", ClientID, aAddrStr); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "econ", aBuf); pThis->m_aClients[ClientID].m_State = CClient::STATE_CONNECTED; pThis->m_aClients[ClientID].m_TimeConnected = time_get(); pThis->m_aClients[ClientID].m_AuthTries = 0; pThis->m_NetConsole.Send(ClientID, "Enter password:"); return 0; } int CEcon::DelClientCallback(int ClientID, const char *pReason, void *pUser) { CEcon *pThis = (CEcon *)pUser; char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pThis->m_NetConsole.ClientAddr(ClientID), aAddrStr, sizeof(aAddrStr), true); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "client dropped. cid=%d addr=%s reason='%s'", ClientID, aAddrStr, pReason); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "econ", aBuf); pThis->m_aClients[ClientID].m_State = CClient::STATE_EMPTY; return 0; } void CEcon::SendLineCB(const char *pLine, void *pUserData) { static_cast(pUserData)->Send(-1, pLine); } void CEcon::ConchainEconOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments() == 1) { CEcon *pThis = static_cast(pUserData); pThis->Console()->SetPrintOutputLevel(pThis->m_PrintCBIndex, pResult->GetInteger(0)); } } void CEcon::ConLogout(IConsole::IResult *pResult, void *pUserData) { CEcon *pThis = static_cast(pUserData); if(pThis->m_UserClientID >= 0 && pThis->m_UserClientID < NET_MAX_CONSOLE_CLIENTS && pThis->m_aClients[pThis->m_UserClientID].m_State != CClient::STATE_EMPTY) pThis->m_NetConsole.Drop(pThis->m_UserClientID, "Logout"); } void CEcon::Init(IConsole *pConsole, CNetBan *pNetBan) { m_pConsole = pConsole; for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) m_aClients[i].m_State = CClient::STATE_EMPTY; m_Ready = false; m_UserClientID = -1; if(g_Config.m_EcPort == 0 || g_Config.m_EcPassword[0] == 0) return; NETADDR BindAddr; if(g_Config.m_EcBindaddr[0] && net_host_lookup(g_Config.m_EcBindaddr, &BindAddr, NETTYPE_ALL) == 0) { // got bindaddr BindAddr.type = NETTYPE_ALL; BindAddr.port = g_Config.m_EcPort; } else { mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = g_Config.m_EcPort; } if(m_NetConsole.Open(BindAddr, pNetBan, 0)) { m_NetConsole.SetCallbacks(NewClientCallback, DelClientCallback, this); m_Ready = true; char aBuf[128]; str_format(aBuf, sizeof(aBuf), "bound to %s:%d", g_Config.m_EcBindaddr, g_Config.m_EcPort); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD,"econ", aBuf); Console()->Chain("ec_output_level", ConchainEconOutputLevelUpdate, this); m_PrintCBIndex = Console()->RegisterPrintCallback(g_Config.m_EcOutputLevel, SendLineCB, this); Console()->Register("logout", "", CFGFLAG_ECON, ConLogout, this, "Logout of econ"); } else Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD,"econ", "couldn't open socket. port might already be in use"); } void CEcon::Update() { if(!m_Ready) return; m_NetConsole.Update(); char aBuf[NET_MAX_PACKETSIZE]; int ClientID; while(m_NetConsole.Recv(aBuf, (int)(sizeof(aBuf))-1, &ClientID)) { dbg_assert(m_aClients[ClientID].m_State != CClient::STATE_EMPTY, "got message from empty slot"); if(m_aClients[ClientID].m_State == CClient::STATE_CONNECTED) { if(str_comp(aBuf, g_Config.m_EcPassword) == 0) { m_aClients[ClientID].m_State = CClient::STATE_AUTHED; m_NetConsole.Send(ClientID, "Authentication successful. External console access granted."); str_format(aBuf, sizeof(aBuf), "cid=%d authed", ClientID); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "econ", aBuf); } else { m_aClients[ClientID].m_AuthTries++; char aMsg[128]; str_format(aMsg, sizeof(aMsg), "Wrong password %d/%d.", m_aClients[ClientID].m_AuthTries, MAX_AUTH_TRIES); m_NetConsole.Send(ClientID, aMsg); if(m_aClients[ClientID].m_AuthTries >= MAX_AUTH_TRIES) { if(!g_Config.m_EcBantime) m_NetConsole.Drop(ClientID, "Too many authentication tries"); else m_NetConsole.NetBan()->BanAddr(m_NetConsole.ClientAddr(ClientID), g_Config.m_EcBantime*60, "Too many authentication tries"); } } } else if(m_aClients[ClientID].m_State == CClient::STATE_AUTHED) { char aFormatted[256]; str_format(aFormatted, sizeof(aFormatted), "cid=%d cmd='%s'", ClientID, aBuf); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aFormatted); m_UserClientID = ClientID; Console()->ExecuteLine(aBuf); m_UserClientID = -1; } } for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; ++i) { if(m_aClients[i].m_State == CClient::STATE_CONNECTED && time_get() > m_aClients[i].m_TimeConnected + g_Config.m_EcAuthTimeout * time_freq()) m_NetConsole.Drop(i, "authentication timeout"); } } void CEcon::Send(int ClientID, const char *pLine) { if(!m_Ready) return; if(ClientID == -1) { for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) { if(m_aClients[i].m_State == CClient::STATE_AUTHED) m_NetConsole.Send(i, pLine); } } else if(ClientID >= 0 && ClientID < NET_MAX_CONSOLE_CLIENTS && m_aClients[ClientID].m_State == CClient::STATE_AUTHED) m_NetConsole.Send(ClientID, pLine); } void CEcon::Shutdown() { if(!m_Ready) return; m_NetConsole.Close(); } teeworlds-0.6.2+dfsg/src/engine/shared/econ.h0000644000175000017500000000205612140200333020034 0ustar felixfelix#ifndef ENGINE_SHARED_ECON_H #define ENGINE_SHARED_ECON_H #include "network.h" class CEcon { enum { MAX_AUTH_TRIES=3, }; class CClient { public: enum { STATE_EMPTY=0, STATE_CONNECTED, STATE_AUTHED, }; int m_State; int64 m_TimeConnected; int m_AuthTries; }; CClient m_aClients[NET_MAX_CONSOLE_CLIENTS]; IConsole *m_pConsole; CNetConsole m_NetConsole; bool m_Ready; int m_PrintCBIndex; int m_UserClientID; static void SendLineCB(const char *pLine, void *pUserData); static void ConchainEconOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConLogout(IConsole::IResult *pResult, void *pUserData); static int NewClientCallback(int ClientID, void *pUser); static int DelClientCallback(int ClientID, const char *pReason, void *pUser); public: IConsole *Console() { return m_pConsole; } void Init(IConsole *pConsole, class CNetBan *pNetBan); void Update(); void Send(int ClientID, const char *pLine); void Shutdown(); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/engine.cpp0000644000175000017500000000635512140200333020716 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include static int HostLookupThread(void *pUser) { CHostLookup *pLookup = (CHostLookup *)pUser; return net_host_lookup(pLookup->m_aHostname, &pLookup->m_Addr, pLookup->m_Nettype); } class CEngine : public IEngine { public: IConsole *m_pConsole; IStorage *m_pStorage; bool m_Logging; static void Con_DbgDumpmem(IConsole::IResult *pResult, void *pUserData) { CEngine *pEngine = static_cast(pUserData); char aBuf[32]; str_timestamp(aBuf, sizeof(aBuf)); char aFilename[128]; str_format(aFilename, sizeof(aFilename), "dumps/memory_%s.txt", aBuf); mem_debug_dump(pEngine->m_pStorage->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE)); } static void Con_DbgLognetwork(IConsole::IResult *pResult, void *pUserData) { CEngine *pEngine = static_cast(pUserData); if(pEngine->m_Logging) { CNetBase::CloseLog(); pEngine->m_Logging = false; } else { char aBuf[32]; str_timestamp(aBuf, sizeof(aBuf)); char aFilenameSent[128], aFilenameRecv[128]; str_format(aFilenameSent, sizeof(aFilenameSent), "dumps/network_sent_%s.txt", aBuf); str_format(aFilenameRecv, sizeof(aFilenameRecv), "dumps/network_recv_%s.txt", aBuf); CNetBase::OpenLog(pEngine->m_pStorage->OpenFile(aFilenameSent, IOFLAG_WRITE, IStorage::TYPE_SAVE), pEngine->m_pStorage->OpenFile(aFilenameRecv, IOFLAG_WRITE, IStorage::TYPE_SAVE)); pEngine->m_Logging = true; } } CEngine(const char *pAppname) { dbg_logger_stdout(); dbg_logger_debugger(); // dbg_msg("engine", "running on %s-%s-%s", CONF_FAMILY_STRING, CONF_PLATFORM_STRING, CONF_ARCH_STRING); #ifdef CONF_ARCH_ENDIAN_LITTLE dbg_msg("engine", "arch is little endian"); #elif defined(CONF_ARCH_ENDIAN_BIG) dbg_msg("engine", "arch is big endian"); #else dbg_msg("engine", "unknown endian"); #endif // init the network net_init(); CNetBase::Init(); m_JobPool.Init(1); m_Logging = false; } void Init() { m_pConsole = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); if(!m_pConsole || !m_pStorage) return; m_pConsole->Register("dbg_dumpmem", "", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_DbgDumpmem, this, "Dump the memory"); m_pConsole->Register("dbg_lognetwork", "", CFGFLAG_SERVER|CFGFLAG_CLIENT, Con_DbgLognetwork, this, "Log the network"); } void InitLogfile() { // open logfile if needed if(g_Config.m_Logfile[0]) dbg_logger_file(g_Config.m_Logfile); } void HostLookup(CHostLookup *pLookup, const char *pHostname, int Nettype) { str_copy(pLookup->m_aHostname, pHostname, sizeof(pLookup->m_aHostname)); pLookup->m_Nettype = Nettype; AddJob(&pLookup->m_Job, HostLookupThread, pLookup); } void AddJob(CJob *pJob, JOBFUNC pfnFunc, void *pData) { if(g_Config.m_Debug) dbg_msg("engine", "job added"); m_JobPool.Add(pJob, pfnFunc, pData); } }; IEngine *CreateEngine(const char *pAppname) { return new CEngine(pAppname); } teeworlds-0.6.2+dfsg/src/engine/shared/filecollection.cpp0000644000175000017500000001351712140200333022442 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "filecollection.h" bool CFileCollection::IsFilenameValid(const char *pFilename) { if(str_length(pFilename) != m_FileDescLength+TIMESTAMP_LENGTH+m_FileExtLength || str_comp_num(pFilename, m_aFileDesc, m_FileDescLength) || str_comp(pFilename+m_FileDescLength+TIMESTAMP_LENGTH, m_aFileExt)) return false; pFilename += m_FileDescLength; if(pFilename[0] == '_' && pFilename[1] >= '0' && pFilename[1] <= '9' && pFilename[2] >= '0' && pFilename[2] <= '9' && pFilename[3] >= '0' && pFilename[3] <= '9' && pFilename[4] >= '0' && pFilename[4] <= '9' && pFilename[5] == '-' && pFilename[6] >= '0' && pFilename[6] <= '9' && pFilename[7] >= '0' && pFilename[7] <= '9' && pFilename[8] == '-' && pFilename[9] >= '0' && pFilename[9] <= '9' && pFilename[10] >= '0' && pFilename[10] <= '9' && pFilename[11] == '_' && pFilename[12] >= '0' && pFilename[12] <= '9' && pFilename[13] >= '0' && pFilename[13] <= '9' && pFilename[14] == '-' && pFilename[15] >= '0' && pFilename[15] <= '9' && pFilename[16] >= '0' && pFilename[16] <= '9' && pFilename[17] == '-' && pFilename[18] >= '0' && pFilename[18] <= '9' && pFilename[19] >= '0' && pFilename[19] <= '9') return true; return false; } int64 CFileCollection::ExtractTimestamp(const char *pTimestring) { int64 Timestamp = pTimestring[0]-'0'; Timestamp <<= 4; Timestamp += pTimestring[1]-'0'; Timestamp <<= 4; Timestamp += pTimestring[2]-'0'; Timestamp <<= 4; Timestamp += pTimestring[3]-'0'; Timestamp <<= 4; Timestamp += pTimestring[5]-'0'; Timestamp <<= 4; Timestamp += pTimestring[6]-'0'; Timestamp <<= 4; Timestamp += pTimestring[8]-'0'; Timestamp <<= 4; Timestamp += pTimestring[9]-'0'; Timestamp <<= 4; Timestamp += pTimestring[11]-'0'; Timestamp <<= 4; Timestamp += pTimestring[12]-'0'; Timestamp <<= 4; Timestamp += pTimestring[14]-'0'; Timestamp <<= 4; Timestamp += pTimestring[15]-'0'; Timestamp <<= 4; Timestamp += pTimestring[17]-'0'; Timestamp <<= 4; Timestamp += pTimestring[18]-'0'; return Timestamp; } void CFileCollection::BuildTimestring(int64 Timestamp, char *pTimestring) { pTimestring[19] = 0; pTimestring[18] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[17] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[16] = '-'; pTimestring[15] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[14] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[13] = '-'; pTimestring[12] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[11] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[10] = '_'; pTimestring[9] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[8] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[7] = '-'; pTimestring[6] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[5] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[4] = '-'; pTimestring[3] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[2] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[1] = (Timestamp&0xF)+'0'; Timestamp >>= 4; pTimestring[0] = (Timestamp&0xF)+'0'; } void CFileCollection::Init(IStorage *pStorage, const char *pPath, const char *pFileDesc, const char *pFileExt, int MaxEntries) { mem_zero(m_aTimestamps, sizeof(m_aTimestamps)); m_NumTimestamps = 0; m_MaxEntries = clamp(MaxEntries, 1, static_cast(MAX_ENTRIES)); str_copy(m_aFileDesc, pFileDesc, sizeof(m_aFileDesc)); m_FileDescLength = str_length(m_aFileDesc); str_copy(m_aFileExt, pFileExt, sizeof(m_aFileExt)); m_FileExtLength = str_length(m_aFileExt); str_copy(m_aPath, pPath, sizeof(m_aPath)); m_pStorage = pStorage; m_pStorage->ListDirectory(IStorage::TYPE_SAVE, m_aPath, FilelistCallback, this); } void CFileCollection::AddEntry(int64 Timestamp) { if(m_NumTimestamps == 0) { // empty list m_aTimestamps[m_NumTimestamps++] = Timestamp; } else { // remove old file if(m_NumTimestamps == m_MaxEntries) { char aBuf[512]; char aTimestring[TIMESTAMP_LENGTH]; BuildTimestring(m_aTimestamps[0], aTimestring); str_format(aBuf, sizeof(aBuf), "%s/%s_%s%s", m_aPath, m_aFileDesc, aTimestring, m_aFileExt); m_pStorage->RemoveFile(aBuf, IStorage::TYPE_SAVE); } // add entry to the sorted list if(m_aTimestamps[0] > Timestamp) { // first entry if(m_NumTimestamps < m_MaxEntries) { mem_move(m_aTimestamps+1, m_aTimestamps, m_NumTimestamps*sizeof(int64)); m_aTimestamps[0] = Timestamp; ++m_NumTimestamps; } } else if(m_aTimestamps[m_NumTimestamps-1] <= Timestamp) { // last entry if(m_NumTimestamps == m_MaxEntries) { mem_move(m_aTimestamps, m_aTimestamps+1, (m_NumTimestamps-1)*sizeof(int64)); m_aTimestamps[m_NumTimestamps-1] = Timestamp; } else m_aTimestamps[m_NumTimestamps++] = Timestamp; } else { // middle entry int Left = 0, Right = m_NumTimestamps-1; while(Right-Left > 1) { int Mid = (Left+Right)/2; if(m_aTimestamps[Mid] > Timestamp) Right = Mid; else Left = Mid; } if(m_NumTimestamps == m_MaxEntries) { mem_move(m_aTimestamps, m_aTimestamps+1, (Right-1)*sizeof(int64)); m_aTimestamps[Right-1] = Timestamp; } else { mem_move(m_aTimestamps+Right+1, m_aTimestamps+Right, (m_NumTimestamps-Right)*sizeof(int64)); m_aTimestamps[Right] = Timestamp; ++m_NumTimestamps; } } } } int CFileCollection::FilelistCallback(const char *pFilename, int IsDir, int StorageType, void *pUser) { CFileCollection *pThis = static_cast(pUser); // check for valid file name format if(IsDir || !pThis->IsFilenameValid(pFilename)) return 0; // extract the timestamp int64 Timestamp = pThis->ExtractTimestamp(pFilename+pThis->m_FileDescLength+1); // add the entry pThis->AddEntry(Timestamp); return 0; } teeworlds-0.6.2+dfsg/src/engine/shared/filecollection.h0000644000175000017500000000175212140200333022105 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_FILECOLLECTION_H #define ENGINE_SHARED_FILECOLLECTION_H class CFileCollection { enum { MAX_ENTRIES=1000, TIMESTAMP_LENGTH=20, // _YYYY-MM-DD_HH-MM-SS }; int64 m_aTimestamps[MAX_ENTRIES]; int m_NumTimestamps; int m_MaxEntries; char m_aFileDesc[128]; int m_FileDescLength; char m_aFileExt[32]; int m_FileExtLength; char m_aPath[512]; IStorage *m_pStorage; bool IsFilenameValid(const char *pFilename); int64 ExtractTimestamp(const char *pTimestring); void BuildTimestring(int64 Timestamp, char *pTimestring); public: void Init(IStorage *pStorage, const char *pPath, const char *pFileDesc, const char *pFileExt, int MaxEntries); void AddEntry(int64 Timestamp); static int FilelistCallback(const char *pFilename, int IsDir, int StorageType, void *pUser); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/huffman.cpp0000644000175000017500000001505312140200333021070 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "huffman.h" struct CHuffmanConstructNode { unsigned short m_NodeId; int m_Frequency; }; void CHuffman::Setbits_r(CNode *pNode, int Bits, unsigned Depth) { if(pNode->m_aLeafs[1] != 0xffff) Setbits_r(&m_aNodes[pNode->m_aLeafs[1]], Bits|(1<m_aLeafs[0] != 0xffff) Setbits_r(&m_aNodes[pNode->m_aLeafs[0]], Bits, Depth+1); if(pNode->m_NumBits) { pNode->m_Bits = Bits; pNode->m_NumBits = Depth; } } // TODO: this should be something faster, but it's enough for now static void BubbleSort(CHuffmanConstructNode **ppList, int Size) { int Changed = 1; CHuffmanConstructNode *pTemp; while(Changed) { Changed = 0; for(int i = 0; i < Size-1; i++) { if(ppList[i]->m_Frequency < ppList[i+1]->m_Frequency) { pTemp = ppList[i]; ppList[i] = ppList[i+1]; ppList[i+1] = pTemp; Changed = 1; } } Size--; } } void CHuffman::ConstructTree(const unsigned *pFrequencies) { CHuffmanConstructNode aNodesLeftStorage[HUFFMAN_MAX_SYMBOLS]; CHuffmanConstructNode *apNodesLeft[HUFFMAN_MAX_SYMBOLS]; int NumNodesLeft = HUFFMAN_MAX_SYMBOLS; // add the symbols for(int i = 0; i < HUFFMAN_MAX_SYMBOLS; i++) { m_aNodes[i].m_NumBits = 0xFFFFFFFF; m_aNodes[i].m_Symbol = i; m_aNodes[i].m_aLeafs[0] = 0xffff; m_aNodes[i].m_aLeafs[1] = 0xffff; if(i == HUFFMAN_EOF_SYMBOL) aNodesLeftStorage[i].m_Frequency = 1; else aNodesLeftStorage[i].m_Frequency = pFrequencies[i]; aNodesLeftStorage[i].m_NodeId = i; apNodesLeft[i] = &aNodesLeftStorage[i]; } m_NumNodes = HUFFMAN_MAX_SYMBOLS; // construct the table while(NumNodesLeft > 1) { // we can't rely on stdlib's qsort for this, it can generate different results on different implementations BubbleSort(apNodesLeft, NumNodesLeft); m_aNodes[m_NumNodes].m_NumBits = 0; m_aNodes[m_NumNodes].m_aLeafs[0] = apNodesLeft[NumNodesLeft-1]->m_NodeId; m_aNodes[m_NumNodes].m_aLeafs[1] = apNodesLeft[NumNodesLeft-2]->m_NodeId; apNodesLeft[NumNodesLeft-2]->m_NodeId = m_NumNodes; apNodesLeft[NumNodesLeft-2]->m_Frequency = apNodesLeft[NumNodesLeft-1]->m_Frequency + apNodesLeft[NumNodesLeft-2]->m_Frequency; m_NumNodes++; NumNodesLeft--; } // set start node m_pStartNode = &m_aNodes[m_NumNodes-1]; // build symbol bits Setbits_r(m_pStartNode, 0, 0); } void CHuffman::Init(const unsigned *pFrequencies) { int i; // make sure to cleanout every thing mem_zero(this, sizeof(*this)); // construct the tree ConstructTree(pFrequencies); // build decode LUT for(i = 0; i < HUFFMAN_LUTSIZE; i++) { unsigned Bits = i; int k; CNode *pNode = m_pStartNode; for(k = 0; k < HUFFMAN_LUTBITS; k++) { pNode = &m_aNodes[pNode->m_aLeafs[Bits&1]]; Bits >>= 1; if(!pNode) break; if(pNode->m_NumBits) { m_apDecodeLut[i] = pNode; break; } } if(k == HUFFMAN_LUTBITS) m_apDecodeLut[i] = pNode; } } //*************************************************************** int CHuffman::Compress(const void *pInput, int InputSize, void *pOutput, int OutputSize) { // this macro loads a symbol for a byte into bits and bitcount #define HUFFMAN_MACRO_LOADSYMBOL(Sym) \ Bits |= m_aNodes[Sym].m_Bits << Bitcount; \ Bitcount += m_aNodes[Sym].m_NumBits; // this macro writes the symbol stored in bits and bitcount to the dst pointer #define HUFFMAN_MACRO_WRITE() \ while(Bitcount >= 8) \ { \ *pDst++ = (unsigned char)(Bits&0xff); \ if(pDst == pDstEnd) \ return -1; \ Bits >>= 8; \ Bitcount -= 8; \ } // setup buffer pointers const unsigned char *pSrc = (const unsigned char *)pInput; const unsigned char *pSrcEnd = pSrc + InputSize; unsigned char *pDst = (unsigned char *)pOutput; unsigned char *pDstEnd = pDst + OutputSize; // symbol variables unsigned Bits = 0; unsigned Bitcount = 0; // make sure that we have data that we want to compress if(InputSize) { // {A} load the first symbol int Symbol = *pSrc++; while(pSrc != pSrcEnd) { // {B} load the symbol HUFFMAN_MACRO_LOADSYMBOL(Symbol) // {C} fetch next symbol, this is done here because it will reduce dependency in the code Symbol = *pSrc++; // {B} write the symbol loaded at HUFFMAN_MACRO_WRITE() } // write the last symbol loaded from {C} or {A} in the case of only 1 byte input buffer HUFFMAN_MACRO_LOADSYMBOL(Symbol) HUFFMAN_MACRO_WRITE() } // write EOF symbol HUFFMAN_MACRO_LOADSYMBOL(HUFFMAN_EOF_SYMBOL) HUFFMAN_MACRO_WRITE() // write out the last bits *pDst++ = Bits; // return the size of the output return (int)(pDst - (const unsigned char *)pOutput); // remove macros #undef HUFFMAN_MACRO_LOADSYMBOL #undef HUFFMAN_MACRO_WRITE } //*************************************************************** int CHuffman::Decompress(const void *pInput, int InputSize, void *pOutput, int OutputSize) { // setup buffer pointers unsigned char *pDst = (unsigned char *)pOutput; unsigned char *pSrc = (unsigned char *)pInput; unsigned char *pDstEnd = pDst + OutputSize; unsigned char *pSrcEnd = pSrc + InputSize; unsigned Bits = 0; unsigned Bitcount = 0; CNode *pEof = &m_aNodes[HUFFMAN_EOF_SYMBOL]; CNode *pNode = 0; while(1) { // {A} try to load a node now, this will reduce dependency at location {D} pNode = 0; if(Bitcount >= HUFFMAN_LUTBITS) pNode = m_apDecodeLut[Bits&HUFFMAN_LUTMASK]; // {B} fill with new bits while(Bitcount < 24 && pSrc != pSrcEnd) { Bits |= (*pSrc++) << Bitcount; Bitcount += 8; } // {C} load symbol now if we didn't that earlier at location {A} if(!pNode) pNode = m_apDecodeLut[Bits&HUFFMAN_LUTMASK]; if(!pNode) return -1; // {D} check if we hit a symbol already if(pNode->m_NumBits) { // remove the bits for that symbol Bits >>= pNode->m_NumBits; Bitcount -= pNode->m_NumBits; } else { // remove the bits that the lut checked up for us Bits >>= HUFFMAN_LUTBITS; Bitcount -= HUFFMAN_LUTBITS; // walk the tree bit by bit while(1) { // traverse tree pNode = &m_aNodes[pNode->m_aLeafs[Bits&1]]; // remove bit Bitcount--; Bits >>= 1; // check if we hit a symbol if(pNode->m_NumBits) break; // no more bits, decoding error if(Bitcount == 0) return -1; } } // check for eof if(pNode == pEof) break; // output character if(pDst == pDstEnd) return -1; *pDst++ = pNode->m_Symbol; } // return the size of the decompressed buffer return (int)(pDst - (const unsigned char *)pOutput); } teeworlds-0.6.2+dfsg/src/engine/shared/huffman.h0000644000175000017500000000447412140200333020542 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_HUFFMAN_H #define ENGINE_SHARED_HUFFMAN_H class CHuffman { enum { HUFFMAN_EOF_SYMBOL = 256, HUFFMAN_MAX_SYMBOLS=HUFFMAN_EOF_SYMBOL+1, HUFFMAN_MAX_NODES=HUFFMAN_MAX_SYMBOLS*2-1, HUFFMAN_LUTBITS = 10, HUFFMAN_LUTSIZE = (1< #include "jobs.h" CJobPool::CJobPool() { // empty the pool m_Lock = lock_create(); m_pFirstJob = 0; m_pLastJob = 0; } void CJobPool::WorkerThread(void *pUser) { CJobPool *pPool = (CJobPool *)pUser; while(1) { CJob *pJob = 0; // fetch job from queue lock_wait(pPool->m_Lock); if(pPool->m_pFirstJob) { pJob = pPool->m_pFirstJob; pPool->m_pFirstJob = pPool->m_pFirstJob->m_pNext; if(pPool->m_pFirstJob) pPool->m_pFirstJob->m_pPrev = 0; else pPool->m_pLastJob = 0; } lock_release(pPool->m_Lock); // do the job if we have one if(pJob) { pJob->m_Status = CJob::STATE_RUNNING; pJob->m_Result = pJob->m_pfnFunc(pJob->m_pFuncData); pJob->m_Status = CJob::STATE_DONE; } else thread_sleep(10); } } int CJobPool::Init(int NumThreads) { // start threads for(int i = 0; i < NumThreads; i++) thread_create(WorkerThread, this); return 0; } int CJobPool::Add(CJob *pJob, JOBFUNC pfnFunc, void *pData) { mem_zero(pJob, sizeof(CJob)); pJob->m_pfnFunc = pfnFunc; pJob->m_pFuncData = pData; lock_wait(m_Lock); // add job to queue pJob->m_pPrev = m_pLastJob; if(m_pLastJob) m_pLastJob->m_pNext = pJob; m_pLastJob = pJob; if(!m_pFirstJob) m_pFirstJob = pJob; lock_release(m_Lock); return 0; } teeworlds-0.6.2+dfsg/src/engine/shared/jobs.h0000644000175000017500000000163312140200333020045 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_JOBS_H #define ENGINE_SHARED_JOBS_H typedef int (*JOBFUNC)(void *pData); class CJobPool; class CJob { friend class CJobPool; CJobPool *m_pPool; CJob *m_pPrev; CJob *m_pNext; volatile int m_Status; volatile int m_Result; JOBFUNC m_pfnFunc; void *m_pFuncData; public: CJob() { m_Status = STATE_DONE; m_pFuncData = 0; } enum { STATE_PENDING=0, STATE_RUNNING, STATE_DONE }; int Status() const { return m_Status; } int Result() const {return m_Result; } }; class CJobPool { LOCK m_Lock; CJob *m_pFirstJob; CJob *m_pLastJob; static void WorkerThread(void *pUser); public: CJobPool(); int Init(int NumThreads); int Add(CJob *pJob, JOBFUNC pfnFunc, void *pData); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/kernel.cpp0000644000175000017500000000426012140200333020722 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include class CKernel : public IKernel { enum { MAX_INTERFACES=32, }; class CInterfaceInfo { public: CInterfaceInfo() { m_aName[0] = 0; m_pInterface = 0x0; } char m_aName[64]; IInterface *m_pInterface; }; CInterfaceInfo m_aInterfaces[MAX_INTERFACES]; int m_NumInterfaces; CInterfaceInfo *FindInterfaceInfo(const char *pName) { for(int i = 0; i < m_NumInterfaces; i++) { if(str_comp(pName, m_aInterfaces[i].m_aName) == 0) return &m_aInterfaces[i]; } return 0x0; } public: CKernel() { m_NumInterfaces = 0; } virtual bool RegisterInterfaceImpl(const char *pName, IInterface *pInterface) { // TODO: More error checks here if(!pInterface) { dbg_msg("kernel", "ERROR: couldn't register interface %s. null pointer given", pName); return false; } if(m_NumInterfaces == MAX_INTERFACES) { dbg_msg("kernel", "ERROR: couldn't register interface '%s'. maximum of interfaces reached", pName); return false; } if(FindInterfaceInfo(pName) != 0) { dbg_msg("kernel", "ERROR: couldn't register interface '%s'. interface already exists", pName); return false; } pInterface->m_pKernel = this; m_aInterfaces[m_NumInterfaces].m_pInterface = pInterface; str_copy(m_aInterfaces[m_NumInterfaces].m_aName, pName, sizeof(m_aInterfaces[m_NumInterfaces].m_aName)); m_NumInterfaces++; return true; } virtual bool ReregisterInterfaceImpl(const char *pName, IInterface *pInterface) { if(FindInterfaceInfo(pName) == 0) { dbg_msg("kernel", "ERROR: couldn't reregister interface '%s'. interface doesn't exist"); return false; } pInterface->m_pKernel = this; return true; } virtual IInterface *RequestInterfaceImpl(const char *pName) { CInterfaceInfo *pInfo = FindInterfaceInfo(pName); if(!pInfo) { dbg_msg("kernel", "failed to find interface with the name '%s'", pName); return 0; } return pInfo->m_pInterface; } }; IKernel *IKernel::Create() { return new CKernel; } teeworlds-0.6.2+dfsg/src/engine/shared/linereader.cpp0000644000175000017500000000334212140200333021554 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "linereader.h" void CLineReader::Init(IOHANDLE io) { m_BufferMaxSize = sizeof(m_aBuffer); m_BufferSize = 0; m_BufferPos = 0; m_IO = io; } char *CLineReader::Get() { unsigned LineStart = m_BufferPos; bool CRLFBreak = false; while(1) { if(m_BufferPos >= m_BufferSize) { // fetch more // move the remaining part to the front unsigned Read; unsigned Left = m_BufferSize - LineStart; if(LineStart > m_BufferSize) Left = 0; if(Left) mem_move(m_aBuffer, &m_aBuffer[LineStart], Left); m_BufferPos = Left; // fill the buffer Read = io_read(m_IO, &m_aBuffer[m_BufferPos], m_BufferMaxSize-m_BufferPos); m_BufferSize = Left + Read; LineStart = 0; if(!Read) { if(Left) { m_aBuffer[Left] = 0; // return the last line m_BufferPos = Left; m_BufferSize = Left; return m_aBuffer; } else return 0x0; // we are done! } } else { if(m_aBuffer[m_BufferPos] == '\n' || m_aBuffer[m_BufferPos] == '\r') { // line found if(m_aBuffer[m_BufferPos] == '\r') { if(m_BufferPos+1 >= m_BufferSize) { // read more to get the connected '\n' CRLFBreak = true; ++m_BufferPos; continue; } else if(m_aBuffer[m_BufferPos+1] == '\n') m_aBuffer[m_BufferPos++] = 0; } m_aBuffer[m_BufferPos++] = 0; return &m_aBuffer[LineStart]; } else if(CRLFBreak) { if(m_aBuffer[m_BufferPos] == '\n') m_aBuffer[m_BufferPos++] = 0; return &m_aBuffer[LineStart]; } else m_BufferPos++; } } } teeworlds-0.6.2+dfsg/src/engine/shared/linereader.h0000644000175000017500000000106012140200333021214 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_LINEREADER_H #define ENGINE_SHARED_LINEREADER_H #include // buffered stream for reading lines, should perhaps be something smaller class CLineReader { char m_aBuffer[4*1024]; unsigned m_BufferPos; unsigned m_BufferSize; unsigned m_BufferMaxSize; IOHANDLE m_IO; public: void Init(IOHANDLE IoHandle); char *Get(); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/map.cpp0000644000175000017500000000256212140200333020222 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "datafile.h" class CMap : public IEngineMap { CDataFileReader m_DataFile; public: CMap() {} virtual void *GetData(int Index) { return m_DataFile.GetData(Index); } virtual void *GetDataSwapped(int Index) { return m_DataFile.GetDataSwapped(Index); } virtual void UnloadData(int Index) { m_DataFile.UnloadData(Index); } virtual void *GetItem(int Index, int *pType, int *pID) { return m_DataFile.GetItem(Index, pType, pID); } virtual void GetType(int Type, int *pStart, int *pNum) { m_DataFile.GetType(Type, pStart, pNum); } virtual void *FindItem(int Type, int ID) { return m_DataFile.FindItem(Type, ID); } virtual int NumItems() { return m_DataFile.NumItems(); } virtual void Unload() { m_DataFile.Close(); } virtual bool Load(const char *pMapName) { IStorage *pStorage = Kernel()->RequestInterface(); if(!pStorage) return false; return m_DataFile.Open(pStorage, pMapName, IStorage::TYPE_ALL); } virtual bool IsLoaded() { return m_DataFile.IsOpen(); } virtual unsigned Crc() { return m_DataFile.Crc(); } }; extern IEngineMap *CreateEngineMap() { return new CMap; } teeworlds-0.6.2+dfsg/src/engine/shared/mapchecker.cpp0000644000175000017500000000551112140200333021544 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include "datafile.h" #include "memheap.h" #include "mapchecker.h" CMapChecker::CMapChecker() { Init(); SetDefaults(); } void CMapChecker::Init() { m_Whitelist.Reset(); m_pFirst = 0; m_RemoveDefaultList = false; } void CMapChecker::SetDefaults() { AddMaplist(s_aMapVersionList, s_NumMapVersionItems); m_RemoveDefaultList = true; } void CMapChecker::AddMaplist(CMapVersion *pMaplist, int Num) { if(m_RemoveDefaultList) Init(); for(int i = 0; i < Num; ++i) { CWhitelistEntry *pEntry = (CWhitelistEntry *)m_Whitelist.Allocate(sizeof(CWhitelistEntry)); pEntry->m_pNext = m_pFirst; m_pFirst = pEntry; str_copy(pEntry->m_aMapName, pMaplist[i].m_aName, sizeof(pEntry->m_aMapName)); pEntry->m_MapCrc = (pMaplist[i].m_aCrc[0]<<24) | (pMaplist[i].m_aCrc[1]<<16) | (pMaplist[i].m_aCrc[2]<<8) | pMaplist[i].m_aCrc[3]; pEntry->m_MapSize = (pMaplist[i].m_aSize[0]<<24) | (pMaplist[i].m_aSize[1]<<16) | (pMaplist[i].m_aSize[2]<<8) | pMaplist[i].m_aSize[3]; } } bool CMapChecker::IsMapValid(const char *pMapName, unsigned MapCrc, unsigned MapSize) { bool StandardMap = false; for(CWhitelistEntry *pCurrent = m_pFirst; pCurrent; pCurrent = pCurrent->m_pNext) { if(str_comp(pCurrent->m_aMapName, pMapName) == 0) { StandardMap = true; if(pCurrent->m_MapCrc == MapCrc && pCurrent->m_MapSize == MapSize) return true; } } return StandardMap?false:true; } bool CMapChecker::ReadAndValidateMap(IStorage *pStorage, const char *pFilename, int StorageType) { bool LoadedMapInfo = false; bool StandardMap = false; unsigned MapCrc = 0; unsigned MapSize = 0; // extract map name char aMapName[MAX_MAP_LENGTH]; const char *pExtractedName = pFilename; const char *pEnd = 0; for(const char *pSrc = pFilename; *pSrc; ++pSrc) { if(*pSrc == '/' || *pSrc == '\\') pExtractedName = pSrc+1; else if(*pSrc == '.') pEnd = pSrc; } int Length = (int)(pEnd - pExtractedName); if(Length <= 0 || Length >= MAX_MAP_LENGTH) return true; str_copy(aMapName, pExtractedName, min((int)MAX_MAP_LENGTH, (int)(pEnd-pExtractedName+1))); // check for valid map for(CWhitelistEntry *pCurrent = m_pFirst; pCurrent; pCurrent = pCurrent->m_pNext) { if(str_comp(pCurrent->m_aMapName, aMapName) == 0) { StandardMap = true; if(!LoadedMapInfo) { if(!CDataFileReader::GetCrcSize(pStorage, pFilename, StorageType, &MapCrc, &MapSize)) return true; LoadedMapInfo = true; } if(pCurrent->m_MapCrc == MapCrc && pCurrent->m_MapSize == MapSize) return true; } } return StandardMap?false:true; } teeworlds-0.6.2+dfsg/src/engine/shared/mapchecker.h0000644000175000017500000000152712140200333021214 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_MAPCHECKER_H #define ENGINE_SHARED_MAPCHECKER_H #include "memheap.h" class CMapChecker { enum { MAX_MAP_LENGTH=8, }; struct CWhitelistEntry { char m_aMapName[MAX_MAP_LENGTH]; unsigned m_MapCrc; unsigned m_MapSize; CWhitelistEntry *m_pNext; }; class CHeap m_Whitelist; CWhitelistEntry *m_pFirst; bool m_RemoveDefaultList; void Init(); void SetDefaults(); public: CMapChecker(); void AddMaplist(struct CMapVersion *pMaplist, int Num); bool IsMapValid(const char *pMapName, unsigned MapCrc, unsigned MapSize); bool ReadAndValidateMap(class IStorage *pStorage, const char *pFilename, int StorageType); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/masterserver.cpp0000644000175000017500000001056412140200333022170 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include // sscanf #include #include #include #include #include "linereader.h" class CMasterServer : public IEngineMasterServer { public: // master server functions struct CMasterInfo { char m_aHostname[128]; NETADDR m_Addr; bool m_Valid; CHostLookup m_Lookup; }; enum { STATE_INIT, STATE_UPDATE, STATE_READY, }; CMasterInfo m_aMasterServers[MAX_MASTERSERVERS]; int m_State; IEngine *m_pEngine; IStorage *m_pStorage; CMasterServer() { SetDefault(); m_State = STATE_INIT; m_pEngine = 0; m_pStorage = 0; } virtual int RefreshAddresses(int Nettype) { if(m_State != STATE_INIT) return -1; dbg_msg("engine/mastersrv", "refreshing master server addresses"); // add lookup jobs for(int i = 0; i < MAX_MASTERSERVERS; i++) { m_pEngine->HostLookup(&m_aMasterServers[i].m_Lookup, m_aMasterServers[i].m_aHostname, Nettype); m_aMasterServers[i].m_Valid = false; } m_State = STATE_UPDATE; return 0; } virtual void Update() { // check if we need to update if(m_State != STATE_UPDATE) return; m_State = STATE_READY; for(int i = 0; i < MAX_MASTERSERVERS; i++) { if(m_aMasterServers[i].m_Lookup.m_Job.Status() != CJob::STATE_DONE) m_State = STATE_UPDATE; else { if(m_aMasterServers[i].m_Lookup.m_Job.Result() == 0) { m_aMasterServers[i].m_Addr = m_aMasterServers[i].m_Lookup.m_Addr; m_aMasterServers[i].m_Addr.port = 8300; m_aMasterServers[i].m_Valid = true; } else m_aMasterServers[i].m_Valid = false; } } if(m_State == STATE_READY) { dbg_msg("engine/mastersrv", "saving addresses"); Save(); } } virtual int IsRefreshing() { return m_State != STATE_READY; } virtual NETADDR GetAddr(int Index) { return m_aMasterServers[Index].m_Addr; } virtual const char *GetName(int Index) { return m_aMasterServers[Index].m_aHostname; } virtual bool IsValid(int Index) { return m_aMasterServers[Index].m_Valid; } virtual void Init() { m_pEngine = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); } virtual void SetDefault() { mem_zero(m_aMasterServers, sizeof(m_aMasterServers)); for(int i = 0; i < MAX_MASTERSERVERS; i++) str_format(m_aMasterServers[i].m_aHostname, sizeof(m_aMasterServers[i].m_aHostname), "master%d.teeworlds.com", i+1); } virtual int Load() { if(!m_pStorage) return -1; // try to open file IOHANDLE File = m_pStorage->OpenFile("masters.cfg", IOFLAG_READ, IStorage::TYPE_SAVE); if(!File) return -1; CLineReader LineReader; LineReader.Init(File); while(1) { CMasterInfo Info = {{0}}; const char *pLine = LineReader.Get(); if(!pLine) break; // parse line char aAddrStr[NETADDR_MAXSTRSIZE]; if(sscanf(pLine, "%127s %47s", Info.m_aHostname, aAddrStr) == 2 && net_addr_from_str(&Info.m_Addr, aAddrStr) == 0) { Info.m_Addr.port = 8300; bool Added = false; for(int i = 0; i < MAX_MASTERSERVERS; ++i) if(str_comp(m_aMasterServers[i].m_aHostname, Info.m_aHostname) == 0) { m_aMasterServers[i] = Info; Added = true; break; } if(!Added) { for(int i = 0; i < MAX_MASTERSERVERS; ++i) if(m_aMasterServers[i].m_Addr.type == NETTYPE_INVALID) { m_aMasterServers[i] = Info; Added = true; break; } } if(!Added) break; } } io_close(File); return 0; } virtual int Save() { if(!m_pStorage) return -1; // try to open file IOHANDLE File = m_pStorage->OpenFile("masters.cfg", IOFLAG_WRITE, IStorage::TYPE_SAVE); if(!File) return -1; for(int i = 0; i < MAX_MASTERSERVERS; i++) { char aAddrStr[NETADDR_MAXSTRSIZE]; if(m_aMasterServers[i].m_Addr.type != NETTYPE_INVALID) net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr), true); else aAddrStr[0] = 0; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "%s %s", m_aMasterServers[i].m_aHostname, aAddrStr); io_write(File, aBuf, str_length(aBuf)); io_write_newline(File); } io_close(File); return 0; } }; IEngineMasterServer *CreateEngineMasterServer() { return new CMasterServer; } teeworlds-0.6.2+dfsg/src/engine/shared/memheap.cpp0000644000175000017500000000340012140200333021051 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "memheap.h" static const int CHUNK_SIZE = 1024*64; // allocates a new chunk to be used void CHeap::NewChunk() { CChunk *pChunk; char *pMem; // allocate memory pMem = (char*)mem_alloc(sizeof(CChunk)+CHUNK_SIZE, 1); if(!pMem) return; // the chunk structure is located in the begining of the chunk // init it and return the chunk pChunk = (CChunk*)pMem; pChunk->m_pMemory = (char*)(pChunk+1); pChunk->m_pCurrent = pChunk->m_pMemory; pChunk->m_pEnd = pChunk->m_pMemory + CHUNK_SIZE; pChunk->m_pNext = (CChunk *)0x0; pChunk->m_pNext = m_pCurrent; m_pCurrent = pChunk; } //**************** void *CHeap::AllocateFromChunk(unsigned int Size) { char *pMem; // check if we need can fit the allocation if(m_pCurrent->m_pCurrent + Size > m_pCurrent->m_pEnd) return (void*)0x0; // get memory and move the pointer forward pMem = m_pCurrent->m_pCurrent; m_pCurrent->m_pCurrent += Size; return pMem; } // creates a heap CHeap::CHeap() { m_pCurrent = 0x0; Reset(); } CHeap::~CHeap() { Clear(); } void CHeap::Reset() { Clear(); NewChunk(); } // destroys the heap void CHeap::Clear() { CChunk *pChunk = m_pCurrent; CChunk *pNext; while(pChunk) { pNext = pChunk->m_pNext; mem_free(pChunk); pChunk = pNext; } m_pCurrent = 0x0; } // void *CHeap::Allocate(unsigned Size) { char *pMem; // try to allocate from current chunk pMem = (char *)AllocateFromChunk(Size); if(!pMem) { // allocate new chunk and add it to the heap NewChunk(); // try to allocate again pMem = (char *)AllocateFromChunk(Size); } return pMem; } teeworlds-0.6.2+dfsg/src/engine/shared/memheap.h0000644000175000017500000000116512140200333020524 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_MEMHEAP_H #define ENGINE_SHARED_MEMHEAP_H class CHeap { struct CChunk { char *m_pMemory; char *m_pCurrent; char *m_pEnd; CChunk *m_pNext; }; enum { // how large each chunk should be CHUNK_SIZE = 1025*64, }; CChunk *m_pCurrent; void Clear(); void NewChunk(); void *AllocateFromChunk(unsigned int Size); public: CHeap(); ~CHeap(); void Reset(); void *Allocate(unsigned Size); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/message.h0000644000175000017500000000062612140200333020535 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_MESSAGE_H #define ENGINE_SHARED_MESSAGE_H class CMessage { public: virtual bool Pack(void *pData, unsigned MaxDataSize); virtual bool Unpack(const void *pData, unsigned DataSize); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/netban.cpp0000644000175000017500000004175512140200333020723 0ustar felixfelix#include #include #include #include #include "netban.h" bool CNetBan::StrAllnum(const char *pStr) { while(*pStr) { if(!(*pStr >= '0' && *pStr <= '9')) return false; pStr++; } return true; } CNetBan::CNetHash::CNetHash(const NETADDR *pAddr) { if(pAddr->type==NETTYPE_IPV4) m_Hash = (pAddr->ip[0]+pAddr->ip[1]+pAddr->ip[2]+pAddr->ip[3])&0xFF; else m_Hash = (pAddr->ip[0]+pAddr->ip[1]+pAddr->ip[2]+pAddr->ip[3]+pAddr->ip[4]+pAddr->ip[5]+pAddr->ip[6]+pAddr->ip[7]+ pAddr->ip[8]+pAddr->ip[9]+pAddr->ip[10]+pAddr->ip[11]+pAddr->ip[12]+pAddr->ip[13]+pAddr->ip[14]+pAddr->ip[15])&0xFF; m_HashIndex = 0; } CNetBan::CNetHash::CNetHash(const CNetRange *pRange) { m_Hash = 0; m_HashIndex = 0; for(int i = 0; pRange->m_LB.ip[i] == pRange->m_UB.ip[i]; ++i) { m_Hash += pRange->m_LB.ip[i]; ++m_HashIndex; } m_Hash &= 0xFF; } int CNetBan::CNetHash::MakeHashArray(const NETADDR *pAddr, CNetHash aHash[17]) { int Length = pAddr->type==NETTYPE_IPV4 ? 4 : 16; aHash[0].m_Hash = 0; aHash[0].m_HashIndex = 0; for(int i = 1, Sum = 0; i <= Length; ++i) { Sum += pAddr->ip[i-1]; aHash[i].m_Hash = Sum&0xFF; aHash[i].m_HashIndex = i%Length; } return Length; } template typename CNetBan::CBan *CNetBan::CBanPool::Add(const T *pData, const CBanInfo *pInfo, const CNetHash *pNetHash) { if(!m_pFirstFree) return 0; // create new ban CBan *pBan = m_pFirstFree; pBan->m_Data = *pData; pBan->m_Info = *pInfo; pBan->m_NetHash = *pNetHash; if(pBan->m_pNext) pBan->m_pNext->m_pPrev = pBan->m_pPrev; if(pBan->m_pPrev) pBan->m_pPrev->m_pNext = pBan->m_pNext; else m_pFirstFree = pBan->m_pNext; // add it to the hash list if(m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]) m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]->m_pHashPrev = pBan; pBan->m_pHashPrev = 0; pBan->m_pHashNext = m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash] = pBan; // insert it into the used list if(m_pFirstUsed) { for(CBan *p = m_pFirstUsed; ; p = p->m_pNext) { if(p->m_Info.m_Expires == CBanInfo::EXPIRES_NEVER || (pInfo->m_Expires != CBanInfo::EXPIRES_NEVER && pInfo->m_Expires <= p->m_Info.m_Expires)) { // insert before pBan->m_pNext = p; pBan->m_pPrev = p->m_pPrev; if(p->m_pPrev) p->m_pPrev->m_pNext = pBan; else m_pFirstUsed = pBan; p->m_pPrev = pBan; break; } if(!p->m_pNext) { // last entry p->m_pNext = pBan; pBan->m_pPrev = p; pBan->m_pNext = 0; break; } } } else { m_pFirstUsed = pBan; pBan->m_pNext = pBan->m_pPrev = 0; } // update ban count ++m_CountUsed; return pBan; } template int CNetBan::CBanPool::Remove(CBan *pBan) { if(pBan == 0) return -1; // remove from hash list if(pBan->m_pHashNext) pBan->m_pHashNext->m_pHashPrev = pBan->m_pHashPrev; if(pBan->m_pHashPrev) pBan->m_pHashPrev->m_pHashNext = pBan->m_pHashNext; else m_paaHashList[pBan->m_NetHash.m_HashIndex][pBan->m_NetHash.m_Hash] = pBan->m_pHashNext; pBan->m_pHashNext = pBan->m_pHashPrev = 0; // remove from used list if(pBan->m_pNext) pBan->m_pNext->m_pPrev = pBan->m_pPrev; if(pBan->m_pPrev) pBan->m_pPrev->m_pNext = pBan->m_pNext; else m_pFirstUsed = pBan->m_pNext; // add to recycle list if(m_pFirstFree) m_pFirstFree->m_pPrev = pBan; pBan->m_pPrev = 0; pBan->m_pNext = m_pFirstFree; m_pFirstFree = pBan; // update ban count --m_CountUsed; return 0; } template void CNetBan::CBanPool::Update(CBan *pBan, const CBanInfo *pInfo) { pBan->m_Info = *pInfo; // remove from used list if(pBan->m_pNext) pBan->m_pNext->m_pPrev = pBan->m_pPrev; if(pBan->m_pPrev) pBan->m_pPrev->m_pNext = pBan->m_pNext; else m_pFirstUsed = pBan->m_pNext; // insert it into the used list if(m_pFirstUsed) { for(CBan *p = m_pFirstUsed; ; p = p->m_pNext) { if(p->m_Info.m_Expires == CBanInfo::EXPIRES_NEVER || (pInfo->m_Expires != CBanInfo::EXPIRES_NEVER && pInfo->m_Expires <= p->m_Info.m_Expires)) { // insert before pBan->m_pNext = p; pBan->m_pPrev = p->m_pPrev; if(p->m_pPrev) p->m_pPrev->m_pNext = pBan; else m_pFirstUsed = pBan; p->m_pPrev = pBan; break; } if(!p->m_pNext) { // last entry p->m_pNext = pBan; pBan->m_pPrev = p; pBan->m_pNext = 0; break; } } } else { m_pFirstUsed = pBan; pBan->m_pNext = pBan->m_pPrev = 0; } } template void CNetBan::CBanPool::Reset() { mem_zero(m_paaHashList, sizeof(m_paaHashList)); mem_zero(m_aBans, sizeof(m_aBans)); m_pFirstUsed = 0; m_CountUsed = 0; for(int i = 1; i < MAX_BANS-1; ++i) { m_aBans[i].m_pNext = &m_aBans[i+1]; m_aBans[i].m_pPrev = &m_aBans[i-1]; } m_aBans[0].m_pNext = &m_aBans[1]; m_aBans[MAX_BANS-1].m_pPrev = &m_aBans[MAX_BANS-2]; m_pFirstFree = &m_aBans[0]; } template typename CNetBan::CBan *CNetBan::CBanPool::Get(int Index) const { if(Index < 0 || Index >= Num()) return 0; for(CNetBan::CBan *pBan = m_pFirstUsed; pBan; pBan = pBan->m_pNext, --Index) { if(Index == 0) return pBan; } return 0; } template void CNetBan::MakeBanInfo(const CBan *pBan, char *pBuf, unsigned BuffSize, int Type) const { if(pBan == 0 || pBuf == 0) { if(BuffSize > 0) pBuf[0] = 0; return; } // build type based part char aBuf[256]; if(Type == MSGTYPE_PLAYER) str_copy(aBuf, "You have been banned", sizeof(aBuf)); else { char aTemp[256]; switch(Type) { case MSGTYPE_LIST: str_format(aBuf, sizeof(aBuf), "%s banned", NetToString(&pBan->m_Data, aTemp, sizeof(aTemp))); break; case MSGTYPE_BANADD: str_format(aBuf, sizeof(aBuf), "banned %s", NetToString(&pBan->m_Data, aTemp, sizeof(aTemp))); break; case MSGTYPE_BANREM: str_format(aBuf, sizeof(aBuf), "unbanned %s", NetToString(&pBan->m_Data, aTemp, sizeof(aTemp))); break; default: aBuf[0] = 0; } } // add info part if(pBan->m_Info.m_Expires != CBanInfo::EXPIRES_NEVER) { int Mins = ((pBan->m_Info.m_Expires-time_timestamp()) + 59) / 60; if(Mins <= 1) str_format(pBuf, BuffSize, "%s for 1 minute (%s)", aBuf, pBan->m_Info.m_aReason); else str_format(pBuf, BuffSize, "%s for %d minutes (%s)", aBuf, Mins, pBan->m_Info.m_aReason); } else str_format(pBuf, BuffSize, "%s for life (%s)", aBuf, pBan->m_Info.m_aReason); } template int CNetBan::Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason) { // do not ban localhost if(NetMatch(pData, &m_LocalhostIPV4) || NetMatch(pData, &m_LocalhostIPV6)) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban failed (localhost)"); return -1; } int Stamp = Seconds > 0 ? time_timestamp()+Seconds : CBanInfo::EXPIRES_NEVER; // set up info CBanInfo Info = {0}; Info.m_Expires = Stamp; str_copy(Info.m_aReason, pReason, sizeof(Info.m_aReason)); // check if it already exists CNetHash NetHash(pData); CBan *pBan = pBanPool->Find(pData, &NetHash); if(pBan) { // adjust the ban pBanPool->Update(pBan, &Info); char aBuf[128]; MakeBanInfo(pBan, aBuf, sizeof(aBuf), MSGTYPE_LIST); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); return 1; } // add ban and print result pBan = pBanPool->Add(pData, &Info, &NetHash); if(pBan) { char aBuf[128]; MakeBanInfo(pBan, aBuf, sizeof(aBuf), MSGTYPE_BANADD); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); return 0; } else Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban failed (full banlist)"); return -1; } template int CNetBan::Unban(T *pBanPool, const typename T::CDataType *pData) { CNetHash NetHash(pData); CBan *pBan = pBanPool->Find(pData, &NetHash); if(pBan) { char aBuf[256]; MakeBanInfo(pBan, aBuf, sizeof(aBuf), MSGTYPE_BANREM); pBanPool->Remove(pBan); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); return 0; } else Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "unban failed (invalid entry)"); return -1; } void CNetBan::Init(IConsole *pConsole, IStorage *pStorage) { m_pConsole = pConsole; m_pStorage = pStorage; m_BanAddrPool.Reset(); m_BanRangePool.Reset(); net_host_lookup("localhost", &m_LocalhostIPV4, NETTYPE_IPV4); net_host_lookup("localhost", &m_LocalhostIPV6, NETTYPE_IPV6); Console()->Register("ban", "s?ir", CFGFLAG_SERVER|CFGFLAG_MASTER|CFGFLAG_STORE, ConBan, this, "Ban ip for x minutes for any reason"); Console()->Register("ban_range", "ss?ir", CFGFLAG_SERVER|CFGFLAG_MASTER|CFGFLAG_STORE, ConBanRange, this, "Ban ip range for x minutes for any reason"); Console()->Register("unban", "s", CFGFLAG_SERVER|CFGFLAG_MASTER|CFGFLAG_STORE, ConUnban, this, "Unban ip/banlist entry"); Console()->Register("unban_range", "ss", CFGFLAG_SERVER|CFGFLAG_MASTER|CFGFLAG_STORE, ConUnbanRange, this, "Unban ip range"); Console()->Register("unban_all", "", CFGFLAG_SERVER|CFGFLAG_MASTER|CFGFLAG_STORE, ConUnbanAll, this, "Unban all entries"); Console()->Register("bans", "", CFGFLAG_SERVER|CFGFLAG_MASTER|CFGFLAG_STORE, ConBans, this, "Show banlist"); Console()->Register("bans_save", "s", CFGFLAG_SERVER|CFGFLAG_MASTER|CFGFLAG_STORE, ConBansSave, this, "Save banlist in a file"); } void CNetBan::Update() { int Now = time_timestamp(); // remove expired bans char aBuf[256], aNetStr[256]; while(m_BanAddrPool.First() && m_BanAddrPool.First()->m_Info.m_Expires != CBanInfo::EXPIRES_NEVER && m_BanAddrPool.First()->m_Info.m_Expires < Now) { str_format(aBuf, sizeof(aBuf), "ban %s expired", NetToString(&m_BanAddrPool.First()->m_Data, aNetStr, sizeof(aNetStr))); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); m_BanAddrPool.Remove(m_BanAddrPool.First()); } while(m_BanRangePool.First() && m_BanRangePool.First()->m_Info.m_Expires != CBanInfo::EXPIRES_NEVER && m_BanRangePool.First()->m_Info.m_Expires < Now) { str_format(aBuf, sizeof(aBuf), "ban %s expired", NetToString(&m_BanRangePool.First()->m_Data, aNetStr, sizeof(aNetStr))); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); m_BanRangePool.Remove(m_BanRangePool.First()); } } int CNetBan::BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason) { return Ban(&m_BanAddrPool, pAddr, Seconds, pReason); } int CNetBan::BanRange(const CNetRange *pRange, int Seconds, const char *pReason) { if(pRange->IsValid()) return Ban(&m_BanRangePool, pRange, Seconds, pReason); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban failed (invalid range)"); return -1; } int CNetBan::UnbanByAddr(const NETADDR *pAddr) { return Unban(&m_BanAddrPool, pAddr); } int CNetBan::UnbanByRange(const CNetRange *pRange) { if(pRange->IsValid()) return Unban(&m_BanRangePool, pRange); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban failed (invalid range)"); return -1; } int CNetBan::UnbanByIndex(int Index) { int Result; char aBuf[256]; CBanAddr *pBan = m_BanAddrPool.Get(Index); if(pBan) { NetToString(&pBan->m_Data, aBuf, sizeof(aBuf)); Result = m_BanAddrPool.Remove(pBan); } else { CBanRange *pBan = m_BanRangePool.Get(Index-m_BanAddrPool.Num()); if(pBan) { NetToString(&pBan->m_Data, aBuf, sizeof(aBuf)); Result = m_BanRangePool.Remove(pBan); } else { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "unban failed (invalid index)"); return -1; } } char aMsg[256]; str_format(aMsg, sizeof(aMsg), "unbanned index %i (%s)", Index, aBuf); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aMsg); return Result; } bool CNetBan::IsBanned(const NETADDR *pAddr, char *pBuf, unsigned BufferSize) const { CNetHash aHash[17]; int Length = CNetHash::MakeHashArray(pAddr, aHash); // check ban adresses CBanAddr *pBan = m_BanAddrPool.Find(pAddr, &aHash[Length]); if(pBan) { MakeBanInfo(pBan, pBuf, BufferSize, MSGTYPE_PLAYER); return true; } // check ban ranges for(int i = Length-1; i >= 0; --i) { for(CBanRange *pBan = m_BanRangePool.First(&aHash[i]); pBan; pBan = pBan->m_pHashNext) { if(NetMatch(&pBan->m_Data, pAddr, i, Length)) { MakeBanInfo(pBan, pBuf, BufferSize, MSGTYPE_PLAYER); return true; } } } return false; } void CNetBan::ConBan(IConsole::IResult *pResult, void *pUser) { CNetBan *pThis = static_cast(pUser); const char *pStr = pResult->GetString(0); int Minutes = pResult->NumArguments()>1 ? clamp(pResult->GetInteger(1), 0, 44640) : 30; const char *pReason = pResult->NumArguments()>2 ? pResult->GetString(2) : "No reason given"; NETADDR Addr; if(net_addr_from_str(&Addr, pStr) == 0) pThis->BanAddr(&Addr, Minutes*60, pReason); else pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (invalid network address)"); } void CNetBan::ConBanRange(IConsole::IResult *pResult, void *pUser) { CNetBan *pThis = static_cast(pUser); const char *pStr1 = pResult->GetString(0); const char *pStr2 = pResult->GetString(1); int Minutes = pResult->NumArguments()>2 ? clamp(pResult->GetInteger(2), 0, 44640) : 30; const char *pReason = pResult->NumArguments()>3 ? pResult->GetString(3) : "No reason given"; CNetRange Range; if(net_addr_from_str(&Range.m_LB, pStr1) == 0 && net_addr_from_str(&Range.m_UB, pStr2) == 0) pThis->BanRange(&Range, Minutes*60, pReason); else pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "ban error (invalid range)"); } void CNetBan::ConUnban(IConsole::IResult *pResult, void *pUser) { CNetBan *pThis = static_cast(pUser); const char *pStr = pResult->GetString(0); if(StrAllnum(pStr)) pThis->UnbanByIndex(str_toint(pStr)); else { NETADDR Addr; if(net_addr_from_str(&Addr, pStr) == 0) pThis->UnbanByAddr(&Addr); else pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "unban error (invalid network address)"); } } void CNetBan::ConUnbanRange(IConsole::IResult *pResult, void *pUser) { CNetBan *pThis = static_cast(pUser); const char *pStr1 = pResult->GetString(0); const char *pStr2 = pResult->GetString(1); CNetRange Range; if(net_addr_from_str(&Range.m_LB, pStr1) == 0 && net_addr_from_str(&Range.m_UB, pStr2) == 0) pThis->UnbanByRange(&Range); else pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "unban error (invalid range)"); } void CNetBan::ConUnbanAll(IConsole::IResult *pResult, void *pUser) { CNetBan *pThis = static_cast(pUser); pThis->UnbanAll(); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", "unbanned all entries"); } void CNetBan::ConBans(IConsole::IResult *pResult, void *pUser) { CNetBan *pThis = static_cast(pUser); int Count = 0; char aBuf[256], aMsg[256]; for(CBanAddr *pBan = pThis->m_BanAddrPool.First(); pBan; pBan = pBan->m_pNext) { pThis->MakeBanInfo(pBan, aBuf, sizeof(aBuf), MSGTYPE_LIST); str_format(aMsg, sizeof(aMsg), "#%i %s", Count++, aBuf); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aMsg); } for(CBanRange *pBan = pThis->m_BanRangePool.First(); pBan; pBan = pBan->m_pNext) { pThis->MakeBanInfo(pBan, aBuf, sizeof(aBuf), MSGTYPE_LIST); str_format(aMsg, sizeof(aMsg), "#%i %s", Count++, aBuf); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aMsg); } str_format(aMsg, sizeof(aMsg), "%d %s", Count, Count==1?"ban":"bans"); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aMsg); } void CNetBan::ConBansSave(IConsole::IResult *pResult, void *pUser) { CNetBan *pThis = static_cast(pUser); char aBuf[256]; IOHANDLE File = pThis->Storage()->OpenFile(pResult->GetString(0), IOFLAG_WRITE, IStorage::TYPE_SAVE); if(!File) { str_format(aBuf, sizeof(aBuf), "failed to save banlist to '%s'", pResult->GetString(0)); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); return; } int Now = time_timestamp(); char aAddrStr1[NETADDR_MAXSTRSIZE], aAddrStr2[NETADDR_MAXSTRSIZE]; for(CBanAddr *pBan = pThis->m_BanAddrPool.First(); pBan; pBan = pBan->m_pNext) { int Min = pBan->m_Info.m_Expires>-1 ? (pBan->m_Info.m_Expires-Now+59)/60 : -1; net_addr_str(&pBan->m_Data, aAddrStr1, sizeof(aAddrStr1), false); str_format(aBuf, sizeof(aBuf), "ban %s %i %s", aAddrStr1, Min, pBan->m_Info.m_aReason); io_write(File, aBuf, str_length(aBuf)); io_write_newline(File); } for(CBanRange *pBan = pThis->m_BanRangePool.First(); pBan; pBan = pBan->m_pNext) { int Min = pBan->m_Info.m_Expires>-1 ? (pBan->m_Info.m_Expires-Now+59)/60 : -1; net_addr_str(&pBan->m_Data.m_LB, aAddrStr1, sizeof(aAddrStr1), false); net_addr_str(&pBan->m_Data.m_UB, aAddrStr2, sizeof(aAddrStr2), false); str_format(aBuf, sizeof(aBuf), "ban_range %s %s %i %s", aAddrStr1, aAddrStr2, Min, pBan->m_Info.m_aReason); io_write(File, aBuf, str_length(aBuf)); io_write_newline(File); } io_close(File); str_format(aBuf, sizeof(aBuf), "saved banlist to '%s'", pResult->GetString(0)); pThis->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "net_ban", aBuf); } teeworlds-0.6.2+dfsg/src/engine/shared/netban.h0000644000175000017500000001263512140200333020363 0ustar felixfelix#ifndef ENGINE_SHARED_NETBAN_H #define ENGINE_SHARED_NETBAN_H #include inline int NetComp(const NETADDR *pAddr1, const NETADDR *pAddr2) { return mem_comp(pAddr1, pAddr2, pAddr1->type==NETTYPE_IPV4 ? 8 : 20); } class CNetRange { public: NETADDR m_LB; NETADDR m_UB; bool IsValid() const { return m_LB.type == m_UB.type && NetComp(&m_LB, &m_UB) < 0; } }; inline int NetComp(const CNetRange *pRange1, const CNetRange *pRange2) { return NetComp(&pRange1->m_LB, &pRange2->m_LB) || NetComp(&pRange1->m_UB, &pRange2->m_UB); } class CNetBan { protected: bool NetMatch(const NETADDR *pAddr1, const NETADDR *pAddr2) const { return NetComp(pAddr1, pAddr2) == 0; } bool NetMatch(const CNetRange *pRange, const NETADDR *pAddr, int Start, int Length) const { return pRange->m_LB.type == pAddr->type && (Start == 0 || mem_comp(&pRange->m_LB.ip[0], &pAddr->ip[0], Start) == 0) && mem_comp(&pRange->m_LB.ip[Start], &pAddr->ip[Start], Length-Start) <= 0 && mem_comp(&pRange->m_UB.ip[Start], &pAddr->ip[Start], Length-Start) >= 0; } bool NetMatch(const CNetRange *pRange, const NETADDR *pAddr) const { return NetMatch(pRange, pAddr, 0, pRange->m_LB.type==NETTYPE_IPV4 ? 4 : 16); } const char *NetToString(const NETADDR *pData, char *pBuffer, unsigned BufferSize) const { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pData, aAddrStr, sizeof(aAddrStr), false); str_format(pBuffer, BufferSize, "'%s'", aAddrStr); return pBuffer; } const char *NetToString(const CNetRange *pData, char *pBuffer, unsigned BufferSize) const { char aAddrStr1[NETADDR_MAXSTRSIZE], aAddrStr2[NETADDR_MAXSTRSIZE]; net_addr_str(&pData->m_LB, aAddrStr1, sizeof(aAddrStr1), false); net_addr_str(&pData->m_UB, aAddrStr2, sizeof(aAddrStr2), false); str_format(pBuffer, BufferSize, "'%s' - '%s'", aAddrStr1, aAddrStr2); return pBuffer; } // todo: move? static bool StrAllnum(const char *pStr); class CNetHash { public: int m_Hash; int m_HashIndex; // matching parts for ranges, 0 for addr CNetHash() {} CNetHash(const NETADDR *pAddr); CNetHash(const CNetRange *pRange); static int MakeHashArray(const NETADDR *pAddr, CNetHash aHash[17]); }; struct CBanInfo { enum { EXPIRES_NEVER=-1, REASON_LENGTH=64, }; int m_Expires; char m_aReason[REASON_LENGTH]; }; template struct CBan { T m_Data; CBanInfo m_Info; CNetHash m_NetHash; // hash list CBan *m_pHashNext; CBan *m_pHashPrev; // used or free list CBan *m_pNext; CBan *m_pPrev; }; template class CBanPool { public: typedef T CDataType; CBan *Add(const CDataType *pData, const CBanInfo *pInfo, const CNetHash *pNetHash); int Remove(CBan *pBan); void Update(CBan *pBan, const CBanInfo *pInfo); void Reset(); int Num() const { return m_CountUsed; } bool IsFull() const { return m_CountUsed == MAX_BANS; } CBan *First() const { return m_pFirstUsed; } CBan *First(const CNetHash *pNetHash) const { return m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; } CBan *Find(const CDataType *pData, const CNetHash *pNetHash) const { for(CBan *pBan = m_paaHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; pBan; pBan = pBan->m_pHashNext) { if(NetComp(&pBan->m_Data, pData) == 0) return pBan; } return 0; } CBan *Get(int Index) const; private: enum { MAX_BANS=1024, }; CBan *m_paaHashList[HashCount][256]; CBan m_aBans[MAX_BANS]; CBan *m_pFirstFree; CBan *m_pFirstUsed; int m_CountUsed; }; typedef CBanPool CBanAddrPool; typedef CBanPool CBanRangePool; typedef CBan CBanAddr; typedef CBan CBanRange; template void MakeBanInfo(const CBan *pBan, char *pBuf, unsigned BuffSize, int Type) const; template int Ban(T *pBanPool, const typename T::CDataType *pData, int Seconds, const char *pReason); template int Unban(T *pBanPool, const typename T::CDataType *pData); class IConsole *m_pConsole; class IStorage *m_pStorage; CBanAddrPool m_BanAddrPool; CBanRangePool m_BanRangePool; NETADDR m_LocalhostIPV4, m_LocalhostIPV6; public: enum { MSGTYPE_PLAYER=0, MSGTYPE_LIST, MSGTYPE_BANADD, MSGTYPE_BANREM, }; class IConsole *Console() const { return m_pConsole; } class IStorage *Storage() const { return m_pStorage; } virtual ~CNetBan() {} void Init(class IConsole *pConsole, class IStorage *pStorage); void Update(); virtual int BanAddr(const NETADDR *pAddr, int Seconds, const char *pReason); virtual int BanRange(const CNetRange *pRange, int Seconds, const char *pReason); int UnbanByAddr(const NETADDR *pAddr); int UnbanByRange(const CNetRange *pRange); int UnbanByIndex(int Index); void UnbanAll() { m_BanAddrPool.Reset(); m_BanRangePool.Reset(); } bool IsBanned(const NETADDR *pAddr, char *pBuf, unsigned BufferSize) const; static void ConBan(class IConsole::IResult *pResult, void *pUser); static void ConBanRange(class IConsole::IResult *pResult, void *pUser); static void ConUnban(class IConsole::IResult *pResult, void *pUser); static void ConUnbanRange(class IConsole::IResult *pResult, void *pUser); static void ConUnbanAll(class IConsole::IResult *pResult, void *pUser); static void ConBans(class IConsole::IResult *pResult, void *pUser); static void ConBansSave(class IConsole::IResult *pResult, void *pUser); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/network.cpp0000644000175000017500000002216312140200333021135 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "config.h" #include "network.h" #include "huffman.h" void CNetRecvUnpacker::Clear() { m_Valid = false; } void CNetRecvUnpacker::Start(const NETADDR *pAddr, CNetConnection *pConnection, int ClientID) { m_Addr = *pAddr; m_pConnection = pConnection; m_ClientID = ClientID; m_CurrentChunk = 0; m_Valid = true; } // TODO: rename this function int CNetRecvUnpacker::FetchChunk(CNetChunk *pChunk) { CNetChunkHeader Header; unsigned char *pEnd = m_Data.m_aChunkData + m_Data.m_DataSize; while(1) { unsigned char *pData = m_Data.m_aChunkData; // check for old data to unpack if(!m_Valid || m_CurrentChunk >= m_Data.m_NumChunks) { Clear(); return 0; } // TODO: add checking here so we don't read too far for(int i = 0; i < m_CurrentChunk; i++) { pData = Header.Unpack(pData); pData += Header.m_Size; } // unpack the header pData = Header.Unpack(pData); m_CurrentChunk++; if(pData+Header.m_Size > pEnd) { Clear(); return 0; } // handle sequence stuff if(m_pConnection && (Header.m_Flags&NET_CHUNKFLAG_VITAL)) { if(Header.m_Sequence == (m_pConnection->m_Ack+1)%NET_MAX_SEQUENCE) { // in sequence m_pConnection->m_Ack = (m_pConnection->m_Ack+1)%NET_MAX_SEQUENCE; } else { // old packet that we already got if(CNetBase::IsSeqInBackroom(Header.m_Sequence, m_pConnection->m_Ack)) continue; // out of sequence, request resend if(g_Config.m_Debug) dbg_msg("conn", "asking for resend %d %d", Header.m_Sequence, (m_pConnection->m_Ack+1)%NET_MAX_SEQUENCE); m_pConnection->SignalResend(); continue; // take the next chunk in the packet } } // fill in the info pChunk->m_ClientID = m_ClientID; pChunk->m_Address = m_Addr; pChunk->m_Flags = 0; pChunk->m_DataSize = Header.m_Size; pChunk->m_pData = pData; return 1; } } // packs the data tight and sends it void CNetBase::SendPacketConnless(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize) { unsigned char aBuffer[NET_MAX_PACKETSIZE]; aBuffer[0] = 0xff; aBuffer[1] = 0xff; aBuffer[2] = 0xff; aBuffer[3] = 0xff; aBuffer[4] = 0xff; aBuffer[5] = 0xff; mem_copy(&aBuffer[6], pData, DataSize); net_udp_send(Socket, pAddr, aBuffer, 6+DataSize); } void CNetBase::SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket) { unsigned char aBuffer[NET_MAX_PACKETSIZE]; int CompressedSize = -1; int FinalSize = -1; // log the data if(ms_DataLogSent) { int Type = 1; io_write(ms_DataLogSent, &Type, sizeof(Type)); io_write(ms_DataLogSent, &pPacket->m_DataSize, sizeof(pPacket->m_DataSize)); io_write(ms_DataLogSent, &pPacket->m_aChunkData, pPacket->m_DataSize); io_flush(ms_DataLogSent); } // compress CompressedSize = ms_Huffman.Compress(pPacket->m_aChunkData, pPacket->m_DataSize, &aBuffer[3], NET_MAX_PACKETSIZE-4); // check if the compression was enabled, successful and good enough if(CompressedSize > 0 && CompressedSize < pPacket->m_DataSize) { FinalSize = CompressedSize; pPacket->m_Flags |= NET_PACKETFLAG_COMPRESSION; } else { // use uncompressed data FinalSize = pPacket->m_DataSize; mem_copy(&aBuffer[3], pPacket->m_aChunkData, pPacket->m_DataSize); pPacket->m_Flags &= ~NET_PACKETFLAG_COMPRESSION; } // set header and send the packet if all things are good if(FinalSize >= 0) { FinalSize += NET_PACKETHEADERSIZE; aBuffer[0] = ((pPacket->m_Flags<<4)&0xf0)|((pPacket->m_Ack>>8)&0xf); aBuffer[1] = pPacket->m_Ack&0xff; aBuffer[2] = pPacket->m_NumChunks; net_udp_send(Socket, pAddr, aBuffer, FinalSize); // log raw socket data if(ms_DataLogSent) { int Type = 0; io_write(ms_DataLogSent, &Type, sizeof(Type)); io_write(ms_DataLogSent, &FinalSize, sizeof(FinalSize)); io_write(ms_DataLogSent, aBuffer, FinalSize); io_flush(ms_DataLogSent); } } } // TODO: rename this function int CNetBase::UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket) { // check the size if(Size < NET_PACKETHEADERSIZE || Size > NET_MAX_PACKETSIZE) { dbg_msg("", "packet too small, %d", Size); return -1; } // log the data if(ms_DataLogRecv) { int Type = 0; io_write(ms_DataLogRecv, &Type, sizeof(Type)); io_write(ms_DataLogRecv, &Size, sizeof(Size)); io_write(ms_DataLogRecv, pBuffer, Size); io_flush(ms_DataLogRecv); } // read the packet pPacket->m_Flags = pBuffer[0]>>4; pPacket->m_Ack = ((pBuffer[0]&0xf)<<8) | pBuffer[1]; pPacket->m_NumChunks = pBuffer[2]; pPacket->m_DataSize = Size - NET_PACKETHEADERSIZE; if(pPacket->m_Flags&NET_PACKETFLAG_CONNLESS) { if(Size < 6) { dbg_msg("", "connection less packet too small, %d", Size); return -1; } pPacket->m_Flags = NET_PACKETFLAG_CONNLESS; pPacket->m_Ack = 0; pPacket->m_NumChunks = 0; pPacket->m_DataSize = Size - 6; mem_copy(pPacket->m_aChunkData, &pBuffer[6], pPacket->m_DataSize); } else { if(pPacket->m_Flags&NET_PACKETFLAG_COMPRESSION) pPacket->m_DataSize = ms_Huffman.Decompress(&pBuffer[3], pPacket->m_DataSize, pPacket->m_aChunkData, sizeof(pPacket->m_aChunkData)); else mem_copy(pPacket->m_aChunkData, &pBuffer[3], pPacket->m_DataSize); } // check for errors if(pPacket->m_DataSize < 0) { if(g_Config.m_Debug) dbg_msg("network", "error during packet decoding"); return -1; } // log the data if(ms_DataLogRecv) { int Type = 1; io_write(ms_DataLogRecv, &Type, sizeof(Type)); io_write(ms_DataLogRecv, &pPacket->m_DataSize, sizeof(pPacket->m_DataSize)); io_write(ms_DataLogRecv, pPacket->m_aChunkData, pPacket->m_DataSize); io_flush(ms_DataLogRecv); } // return success return 0; } void CNetBase::SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int ControlMsg, const void *pExtra, int ExtraSize) { CNetPacketConstruct Construct; Construct.m_Flags = NET_PACKETFLAG_CONTROL; Construct.m_Ack = Ack; Construct.m_NumChunks = 0; Construct.m_DataSize = 1+ExtraSize; Construct.m_aChunkData[0] = ControlMsg; mem_copy(&Construct.m_aChunkData[1], pExtra, ExtraSize); // send the control message CNetBase::SendPacket(Socket, pAddr, &Construct); } unsigned char *CNetChunkHeader::Pack(unsigned char *pData) { pData[0] = ((m_Flags&3)<<6)|((m_Size>>4)&0x3f); pData[1] = (m_Size&0xf); if(m_Flags&NET_CHUNKFLAG_VITAL) { pData[1] |= (m_Sequence>>2)&0xf0; pData[2] = m_Sequence&0xff; return pData + 3; } return pData + 2; } unsigned char *CNetChunkHeader::Unpack(unsigned char *pData) { m_Flags = (pData[0]>>6)&3; m_Size = ((pData[0]&0x3f)<<4) | (pData[1]&0xf); m_Sequence = -1; if(m_Flags&NET_CHUNKFLAG_VITAL) { m_Sequence = ((pData[1]&0xf0)<<2) | pData[2]; return pData + 3; } return pData + 2; } int CNetBase::IsSeqInBackroom(int Seq, int Ack) { int Bottom = (Ack-NET_MAX_SEQUENCE/2); if(Bottom < 0) { if(Seq <= Ack) return 1; if(Seq >= (Bottom + NET_MAX_SEQUENCE)) return 1; } else { if(Seq <= Ack && Seq >= Bottom) return 1; } return 0; } IOHANDLE CNetBase::ms_DataLogSent = 0; IOHANDLE CNetBase::ms_DataLogRecv = 0; CHuffman CNetBase::ms_Huffman; void CNetBase::OpenLog(IOHANDLE DataLogSent, IOHANDLE DataLogRecv) { if(DataLogSent) { ms_DataLogSent = DataLogSent; dbg_msg("network", "logging sent packages"); } else dbg_msg("network", "failed to start logging sent packages"); if(DataLogRecv) { ms_DataLogRecv = DataLogRecv; dbg_msg("network", "logging recv packages"); } else dbg_msg("network", "failed to start logging recv packages"); } void CNetBase::CloseLog() { if(ms_DataLogSent) { dbg_msg("network", "stopped logging sent packages"); io_close(ms_DataLogSent); ms_DataLogSent = 0; } if(ms_DataLogRecv) { dbg_msg("network", "stopped logging recv packages"); io_close(ms_DataLogRecv); ms_DataLogRecv = 0; } } int CNetBase::Compress(const void *pData, int DataSize, void *pOutput, int OutputSize) { return ms_Huffman.Compress(pData, DataSize, pOutput, OutputSize); } int CNetBase::Decompress(const void *pData, int DataSize, void *pOutput, int OutputSize) { return ms_Huffman.Decompress(pData, DataSize, pOutput, OutputSize); } static const unsigned gs_aFreqTable[256+1] = { 1<<30,4545,2657,431,1950,919,444,482,2244,617,838,542,715,1814,304,240,754,212,647,186, 283,131,146,166,543,164,167,136,179,859,363,113,157,154,204,108,137,180,202,176, 872,404,168,134,151,111,113,109,120,126,129,100,41,20,16,22,18,18,17,19, 16,37,13,21,362,166,99,78,95,88,81,70,83,284,91,187,77,68,52,68, 59,66,61,638,71,157,50,46,69,43,11,24,13,19,10,12,12,20,14,9, 20,20,10,10,15,15,12,12,7,19,15,14,13,18,35,19,17,14,8,5, 15,17,9,15,14,18,8,10,2173,134,157,68,188,60,170,60,194,62,175,71, 148,67,167,78,211,67,156,69,1674,90,174,53,147,89,181,51,174,63,163,80, 167,94,128,122,223,153,218,77,200,110,190,73,174,69,145,66,277,143,141,60, 136,53,180,57,142,57,158,61,166,112,152,92,26,22,21,28,20,26,30,21, 32,27,20,17,23,21,30,22,22,21,27,25,17,27,23,18,39,26,15,21, 12,18,18,27,20,18,15,19,11,17,33,12,18,15,19,18,16,26,17,18, 9,10,25,22,22,17,20,16,6,16,15,20,14,18,24,335,1517}; void CNetBase::Init() { ms_Huffman.Init(gs_aFreqTable); } teeworlds-0.6.2+dfsg/src/engine/shared/network.h0000644000175000017500000002126112140200333020600 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_NETWORK_H #define ENGINE_SHARED_NETWORK_H #include "ringbuffer.h" #include "huffman.h" /* CURRENT: packet header: 3 bytes unsigned char flags_ack; // 4bit flags, 4bit ack unsigned char ack; // 8 bit ack unsigned char num_chunks; // 8 bit chunks (unsigned char padding[3]) // 24 bit extra incase it's a connection less packet // this is to make sure that it's compatible with the // old protocol chunk header: 2-3 bytes unsigned char flags_size; // 2bit flags, 6 bit size unsigned char size_seq; // 4bit size, 4bit seq (unsigned char seq;) // 8bit seq, if vital flag is set */ enum { NETFLAG_ALLOWSTATELESS=1, NETSENDFLAG_VITAL=1, NETSENDFLAG_CONNLESS=2, NETSENDFLAG_FLUSH=4, NETSTATE_OFFLINE=0, NETSTATE_CONNECTING, NETSTATE_ONLINE, NETBANTYPE_SOFT=1, NETBANTYPE_DROP=2 }; enum { NET_VERSION = 2, NET_MAX_PACKETSIZE = 1400, NET_MAX_PAYLOAD = NET_MAX_PACKETSIZE-6, NET_MAX_CHUNKHEADERSIZE = 5, NET_PACKETHEADERSIZE = 3, NET_MAX_CLIENTS = 16, NET_MAX_CONSOLE_CLIENTS = 4, NET_MAX_SEQUENCE = 1<<10, NET_SEQUENCE_MASK = NET_MAX_SEQUENCE-1, NET_CONNSTATE_OFFLINE=0, NET_CONNSTATE_CONNECT=1, NET_CONNSTATE_PENDING=2, NET_CONNSTATE_ONLINE=3, NET_CONNSTATE_ERROR=4, NET_PACKETFLAG_CONTROL=1, NET_PACKETFLAG_CONNLESS=2, NET_PACKETFLAG_RESEND=4, NET_PACKETFLAG_COMPRESSION=8, NET_CHUNKFLAG_VITAL=1, NET_CHUNKFLAG_RESEND=2, NET_CTRLMSG_KEEPALIVE=0, NET_CTRLMSG_CONNECT=1, NET_CTRLMSG_CONNECTACCEPT=2, NET_CTRLMSG_ACCEPT=3, NET_CTRLMSG_CLOSE=4, NET_CONN_BUFFERSIZE=1024*32, NET_ENUM_TERMINATOR }; typedef int (*NETFUNC_DELCLIENT)(int ClientID, const char* pReason, void *pUser); typedef int (*NETFUNC_NEWCLIENT)(int ClientID, void *pUser); struct CNetChunk { // -1 means that it's a stateless packet // 0 on the client means the server int m_ClientID; NETADDR m_Address; // only used when client_id == -1 int m_Flags; int m_DataSize; const void *m_pData; }; class CNetChunkHeader { public: int m_Flags; int m_Size; int m_Sequence; unsigned char *Pack(unsigned char *pData); unsigned char *Unpack(unsigned char *pData); }; class CNetChunkResend { public: int m_Flags; int m_DataSize; unsigned char *m_pData; int m_Sequence; int64 m_LastSendTime; int64 m_FirstSendTime; }; class CNetPacketConstruct { public: int m_Flags; int m_Ack; int m_NumChunks; int m_DataSize; unsigned char m_aChunkData[NET_MAX_PAYLOAD]; }; class CNetConnection { // TODO: is this needed because this needs to be aware of // the ack sequencing number and is also responible for updating // that. this should be fixed. friend class CNetRecvUnpacker; private: unsigned short m_Sequence; unsigned short m_Ack; unsigned m_State; int m_Token; int m_RemoteClosed; bool m_BlockCloseMsg; TStaticRingBuffer m_Buffer; int64 m_LastUpdateTime; int64 m_LastRecvTime; int64 m_LastSendTime; char m_ErrorString[256]; CNetPacketConstruct m_Construct; NETADDR m_PeerAddr; NETSOCKET m_Socket; NETSTATS m_Stats; // void Reset(); void ResetStats(); void SetError(const char *pString); void AckChunks(int Ack); int QueueChunkEx(int Flags, int DataSize, const void *pData, int Sequence); void SendControl(int ControlMsg, const void *pExtra, int ExtraSize); void ResendChunk(CNetChunkResend *pResend); void Resend(); public: void Init(NETSOCKET Socket, bool BlockCloseMsg); int Connect(NETADDR *pAddr); void Disconnect(const char *pReason); int Update(); int Flush(); int Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr); int QueueChunk(int Flags, int DataSize, const void *pData); const char *ErrorString(); void SignalResend(); int State() const { return m_State; } const NETADDR *PeerAddress() const { return &m_PeerAddr; } void ResetErrorString() { m_ErrorString[0] = 0; } const char *ErrorString() const { return m_ErrorString; } // Needed for GotProblems in NetClient int64 LastRecvTime() const { return m_LastRecvTime; } int64 ConnectTime() const { return m_LastUpdateTime; } int AckSequence() const { return m_Ack; } }; class CConsoleNetConnection { private: int m_State; NETADDR m_PeerAddr; NETSOCKET m_Socket; char m_aBuffer[NET_MAX_PACKETSIZE]; int m_BufferOffset; char m_aErrorString[256]; bool m_LineEndingDetected; char m_aLineEnding[3]; public: void Init(NETSOCKET Socket, const NETADDR *pAddr); void Disconnect(const char *pReason); int State() const { return m_State; } const NETADDR *PeerAddress() const { return &m_PeerAddr; } const char *ErrorString() const { return m_aErrorString; } void Reset(); int Update(); int Send(const char *pLine); int Recv(char *pLine, int MaxLength); }; class CNetRecvUnpacker { public: bool m_Valid; NETADDR m_Addr; CNetConnection *m_pConnection; int m_CurrentChunk; int m_ClientID; CNetPacketConstruct m_Data; unsigned char m_aBuffer[NET_MAX_PACKETSIZE]; CNetRecvUnpacker() { Clear(); } void Clear(); void Start(const NETADDR *pAddr, CNetConnection *pConnection, int ClientID); int FetchChunk(CNetChunk *pChunk); }; // server side class CNetServer { struct CSlot { public: CNetConnection m_Connection; }; NETSOCKET m_Socket; class CNetBan *m_pNetBan; CSlot m_aSlots[NET_MAX_CLIENTS]; int m_MaxClients; int m_MaxClientsPerIP; NETFUNC_NEWCLIENT m_pfnNewClient; NETFUNC_DELCLIENT m_pfnDelClient; void *m_UserPtr; CNetRecvUnpacker m_RecvUnpacker; public: int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser); // bool Open(NETADDR BindAddr, class CNetBan *pNetBan, int MaxClients, int MaxClientsPerIP, int Flags); int Close(); // int Recv(CNetChunk *pChunk); int Send(CNetChunk *pChunk); int Update(); // int Drop(int ClientID, const char *pReason); // status requests const NETADDR *ClientAddr(int ClientID) const { return m_aSlots[ClientID].m_Connection.PeerAddress(); } NETSOCKET Socket() const { return m_Socket; } class CNetBan *NetBan() const { return m_pNetBan; } int NetType() const { return m_Socket.type; } int MaxClients() const { return m_MaxClients; } // void SetMaxClientsPerIP(int Max); }; class CNetConsole { struct CSlot { CConsoleNetConnection m_Connection; }; NETSOCKET m_Socket; class CNetBan *m_pNetBan; CSlot m_aSlots[NET_MAX_CONSOLE_CLIENTS]; NETFUNC_NEWCLIENT m_pfnNewClient; NETFUNC_DELCLIENT m_pfnDelClient; void *m_UserPtr; CNetRecvUnpacker m_RecvUnpacker; public: void SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser); // bool Open(NETADDR BindAddr, class CNetBan *pNetBan, int Flags); int Close(); // int Recv(char *pLine, int MaxLength, int *pClientID = 0); int Send(int ClientID, const char *pLine); int Update(); // int AcceptClient(NETSOCKET Socket, const NETADDR *pAddr); int Drop(int ClientID, const char *pReason); // status requests const NETADDR *ClientAddr(int ClientID) const { return m_aSlots[ClientID].m_Connection.PeerAddress(); } class CNetBan *NetBan() const { return m_pNetBan; } }; // client side class CNetClient { NETADDR m_ServerAddr; CNetConnection m_Connection; CNetRecvUnpacker m_RecvUnpacker; NETSOCKET m_Socket; public: // openness bool Open(NETADDR BindAddr, int Flags); int Close(); // connection state int Disconnect(const char *Reason); int Connect(NETADDR *Addr); // communication int Recv(CNetChunk *Chunk); int Send(CNetChunk *Chunk); // pumping int Update(); int Flush(); int ResetErrorString(); // error and state int NetType() const { return m_Socket.type; } int State(); int GotProblems(); const char *ErrorString(); }; // TODO: both, fix these. This feels like a junk class for stuff that doesn't fit anywere class CNetBase { static IOHANDLE ms_DataLogSent; static IOHANDLE ms_DataLogRecv; static CHuffman ms_Huffman; public: static void OpenLog(IOHANDLE DataLogSent, IOHANDLE DataLogRecv); static void CloseLog(); static void Init(); static int Compress(const void *pData, int DataSize, void *pOutput, int OutputSize); static int Decompress(const void *pData, int DataSize, void *pOutput, int OutputSize); static void SendControlMsg(NETSOCKET Socket, NETADDR *pAddr, int Ack, int ControlMsg, const void *pExtra, int ExtraSize); static void SendPacketConnless(NETSOCKET Socket, NETADDR *pAddr, const void *pData, int DataSize); static void SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket); static int UnpackPacket(unsigned char *pBuffer, int Size, CNetPacketConstruct *pPacket); // The backroom is ack-NET_MAX_SEQUENCE/2. Used for knowing if we acked a packet or not static int IsSeqInBackroom(int Seq, int Ack); }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/network_client.cpp0000644000175000017500000000605112140200333022471 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "network.h" bool CNetClient::Open(NETADDR BindAddr, int Flags) { // open socket NETSOCKET Socket; Socket = net_udp_create(BindAddr); if(!Socket.type) return false; // clean it mem_zero(this, sizeof(*this)); // init m_Socket = Socket; m_Connection.Init(m_Socket, false); return true; } int CNetClient::Close() { // TODO: implement me return 0; } int CNetClient::Disconnect(const char *pReason) { //dbg_msg("netclient", "disconnected. reason=\"%s\"", pReason); m_Connection.Disconnect(pReason); return 0; } int CNetClient::Update() { m_Connection.Update(); if(m_Connection.State() == NET_CONNSTATE_ERROR) Disconnect(m_Connection.ErrorString()); return 0; } int CNetClient::Connect(NETADDR *pAddr) { m_Connection.Connect(pAddr); return 0; } int CNetClient::ResetErrorString() { m_Connection.ResetErrorString(); return 0; } int CNetClient::Recv(CNetChunk *pChunk) { while(1) { // check for a chunk if(m_RecvUnpacker.FetchChunk(pChunk)) return 1; // TODO: empty the recvinfo NETADDR Addr; int Bytes = net_udp_recv(m_Socket, &Addr, m_RecvUnpacker.m_aBuffer, NET_MAX_PACKETSIZE); // no more packets for now if(Bytes <= 0) break; if(CNetBase::UnpackPacket(m_RecvUnpacker.m_aBuffer, Bytes, &m_RecvUnpacker.m_Data) == 0) { if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS) { pChunk->m_Flags = NETSENDFLAG_CONNLESS; pChunk->m_ClientID = -1; pChunk->m_Address = Addr; pChunk->m_DataSize = m_RecvUnpacker.m_Data.m_DataSize; pChunk->m_pData = m_RecvUnpacker.m_Data.m_aChunkData; return 1; } else { if(m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr)) m_RecvUnpacker.Start(&Addr, &m_Connection, 0); } } } return 0; } int CNetClient::Send(CNetChunk *pChunk) { if(pChunk->m_DataSize >= NET_MAX_PAYLOAD) { dbg_msg("netclient", "chunk payload too big. %d. dropping chunk", pChunk->m_DataSize); return -1; } if(pChunk->m_Flags&NETSENDFLAG_CONNLESS) { // send connectionless packet CNetBase::SendPacketConnless(m_Socket, &pChunk->m_Address, pChunk->m_pData, pChunk->m_DataSize); } else { int Flags = 0; dbg_assert(pChunk->m_ClientID == 0, "errornous client id"); if(pChunk->m_Flags&NETSENDFLAG_VITAL) Flags = NET_CHUNKFLAG_VITAL; m_Connection.QueueChunk(Flags, pChunk->m_DataSize, pChunk->m_pData); if(pChunk->m_Flags&NETSENDFLAG_FLUSH) m_Connection.Flush(); } return 0; } int CNetClient::State() { if(m_Connection.State() == NET_CONNSTATE_ONLINE) return NETSTATE_ONLINE; if(m_Connection.State() == NET_CONNSTATE_OFFLINE) return NETSTATE_OFFLINE; return NETSTATE_CONNECTING; } int CNetClient::Flush() { return m_Connection.Flush(); } int CNetClient::GotProblems() { if(time_get() - m_Connection.LastRecvTime() > time_freq()) return 1; return 0; } const char *CNetClient::ErrorString() { return m_Connection.ErrorString(); } teeworlds-0.6.2+dfsg/src/engine/shared/network_conn.cpp0000644000175000017500000002036012140200333022147 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "config.h" #include "network.h" void CNetConnection::ResetStats() { mem_zero(&m_Stats, sizeof(m_Stats)); } void CNetConnection::Reset() { m_Sequence = 0; m_Ack = 0; m_RemoteClosed = 0; m_State = NET_CONNSTATE_OFFLINE; m_LastSendTime = 0; m_LastRecvTime = 0; m_LastUpdateTime = 0; m_Token = -1; mem_zero(&m_PeerAddr, sizeof(m_PeerAddr)); m_Buffer.Init(); mem_zero(&m_Construct, sizeof(m_Construct)); } const char *CNetConnection::ErrorString() { return m_ErrorString; } void CNetConnection::SetError(const char *pString) { str_copy(m_ErrorString, pString, sizeof(m_ErrorString)); } void CNetConnection::Init(NETSOCKET Socket, bool BlockCloseMsg) { Reset(); ResetStats(); m_Socket = Socket; m_BlockCloseMsg = BlockCloseMsg; mem_zero(m_ErrorString, sizeof(m_ErrorString)); } void CNetConnection::AckChunks(int Ack) { while(1) { CNetChunkResend *pResend = m_Buffer.First(); if(!pResend) break; if(CNetBase::IsSeqInBackroom(pResend->m_Sequence, Ack)) m_Buffer.PopFirst(); else break; } } void CNetConnection::SignalResend() { m_Construct.m_Flags |= NET_PACKETFLAG_RESEND; } int CNetConnection::Flush() { int NumChunks = m_Construct.m_NumChunks; if(!NumChunks && !m_Construct.m_Flags) return 0; // send of the packets m_Construct.m_Ack = m_Ack; CNetBase::SendPacket(m_Socket, &m_PeerAddr, &m_Construct); // update send times m_LastSendTime = time_get(); // clear construct so we can start building a new package mem_zero(&m_Construct, sizeof(m_Construct)); return NumChunks; } int CNetConnection::QueueChunkEx(int Flags, int DataSize, const void *pData, int Sequence) { unsigned char *pChunkData; // check if we have space for it, if not, flush the connection if(m_Construct.m_DataSize + DataSize + NET_MAX_CHUNKHEADERSIZE > (int)sizeof(m_Construct.m_aChunkData)) Flush(); // pack all the data CNetChunkHeader Header; Header.m_Flags = Flags; Header.m_Size = DataSize; Header.m_Sequence = Sequence; pChunkData = &m_Construct.m_aChunkData[m_Construct.m_DataSize]; pChunkData = Header.Pack(pChunkData); mem_copy(pChunkData, pData, DataSize); pChunkData += DataSize; // m_Construct.m_NumChunks++; m_Construct.m_DataSize = (int)(pChunkData-m_Construct.m_aChunkData); // set packet flags aswell if(Flags&NET_CHUNKFLAG_VITAL && !(Flags&NET_CHUNKFLAG_RESEND)) { // save packet if we need to resend CNetChunkResend *pResend = m_Buffer.Allocate(sizeof(CNetChunkResend)+DataSize); if(pResend) { pResend->m_Sequence = Sequence; pResend->m_Flags = Flags; pResend->m_DataSize = DataSize; pResend->m_pData = (unsigned char *)(pResend+1); pResend->m_FirstSendTime = time_get(); pResend->m_LastSendTime = pResend->m_FirstSendTime; mem_copy(pResend->m_pData, pData, DataSize); } else { // out of buffer Disconnect("too weak connection (out of buffer)"); return -1; } } return 0; } int CNetConnection::QueueChunk(int Flags, int DataSize, const void *pData) { if(Flags&NET_CHUNKFLAG_VITAL) m_Sequence = (m_Sequence+1)%NET_MAX_SEQUENCE; return QueueChunkEx(Flags, DataSize, pData, m_Sequence); } void CNetConnection::SendControl(int ControlMsg, const void *pExtra, int ExtraSize) { // send the control message m_LastSendTime = time_get(); CNetBase::SendControlMsg(m_Socket, &m_PeerAddr, m_Ack, ControlMsg, pExtra, ExtraSize); } void CNetConnection::ResendChunk(CNetChunkResend *pResend) { QueueChunkEx(pResend->m_Flags|NET_CHUNKFLAG_RESEND, pResend->m_DataSize, pResend->m_pData, pResend->m_Sequence); pResend->m_LastSendTime = time_get(); } void CNetConnection::Resend() { for(CNetChunkResend *pResend = m_Buffer.First(); pResend; pResend = m_Buffer.Next(pResend)) ResendChunk(pResend); } int CNetConnection::Connect(NETADDR *pAddr) { if(State() != NET_CONNSTATE_OFFLINE) return -1; // init connection Reset(); m_PeerAddr = *pAddr; mem_zero(m_ErrorString, sizeof(m_ErrorString)); m_State = NET_CONNSTATE_CONNECT; SendControl(NET_CTRLMSG_CONNECT, 0, 0); return 0; } void CNetConnection::Disconnect(const char *pReason) { if(State() == NET_CONNSTATE_OFFLINE) return; if(m_RemoteClosed == 0) { if(pReason) SendControl(NET_CTRLMSG_CLOSE, pReason, str_length(pReason)+1); else SendControl(NET_CTRLMSG_CLOSE, 0, 0); m_ErrorString[0] = 0; if(pReason) str_copy(m_ErrorString, pReason, sizeof(m_ErrorString)); } Reset(); } int CNetConnection::Feed(CNetPacketConstruct *pPacket, NETADDR *pAddr) { int64 Now = time_get(); // check if resend is requested if(pPacket->m_Flags&NET_PACKETFLAG_RESEND) Resend(); // if(pPacket->m_Flags&NET_PACKETFLAG_CONTROL) { int CtrlMsg = pPacket->m_aChunkData[0]; if(CtrlMsg == NET_CTRLMSG_CLOSE) { if(net_addr_comp(&m_PeerAddr, pAddr) == 0) { m_State = NET_CONNSTATE_ERROR; m_RemoteClosed = 1; char Str[128] = {0}; if(pPacket->m_DataSize > 1) { // make sure to sanitize the error string form the other party if(pPacket->m_DataSize < 128) str_copy(Str, (char *)&pPacket->m_aChunkData[1], pPacket->m_DataSize); else str_copy(Str, (char *)&pPacket->m_aChunkData[1], sizeof(Str)); str_sanitize_strong(Str); } if(!m_BlockCloseMsg) { // set the error string SetError(Str); } if(g_Config.m_Debug) dbg_msg("conn", "closed reason='%s'", Str); } return 0; } else { if(State() == NET_CONNSTATE_OFFLINE) { if(CtrlMsg == NET_CTRLMSG_CONNECT) { // send response and init connection Reset(); m_State = NET_CONNSTATE_PENDING; m_PeerAddr = *pAddr; mem_zero(m_ErrorString, sizeof(m_ErrorString)); m_LastSendTime = Now; m_LastRecvTime = Now; m_LastUpdateTime = Now; SendControl(NET_CTRLMSG_CONNECTACCEPT, 0, 0); if(g_Config.m_Debug) dbg_msg("connection", "got connection, sending connect+accept"); } } else if(State() == NET_CONNSTATE_CONNECT) { // connection made if(CtrlMsg == NET_CTRLMSG_CONNECTACCEPT) { m_LastRecvTime = Now; SendControl(NET_CTRLMSG_ACCEPT, 0, 0); m_State = NET_CONNSTATE_ONLINE; if(g_Config.m_Debug) dbg_msg("connection", "got connect+accept, sending accept. connection online"); } } } } else { if(State() == NET_CONNSTATE_PENDING) { m_LastRecvTime = Now; m_State = NET_CONNSTATE_ONLINE; if(g_Config.m_Debug) dbg_msg("connection", "connecting online"); } } if(State() == NET_CONNSTATE_ONLINE) { m_LastRecvTime = Now; AckChunks(pPacket->m_Ack); } return 1; } int CNetConnection::Update() { int64 Now = time_get(); if(State() == NET_CONNSTATE_OFFLINE || State() == NET_CONNSTATE_ERROR) return 0; // check for timeout if(State() != NET_CONNSTATE_OFFLINE && State() != NET_CONNSTATE_CONNECT && (Now-m_LastRecvTime) > time_freq()*10) { m_State = NET_CONNSTATE_ERROR; SetError("Timeout"); } // fix resends if(m_Buffer.First()) { CNetChunkResend *pResend = m_Buffer.First(); // check if we have some really old stuff laying around and abort if not acked if(Now-pResend->m_FirstSendTime > time_freq()*10) { m_State = NET_CONNSTATE_ERROR; SetError("Too weak connection (not acked for 10 seconds)"); } else { // resend packet if we havn't got it acked in 1 second if(Now-pResend->m_LastSendTime > time_freq()) ResendChunk(pResend); } } // send keep alives if nothing has happend for 250ms if(State() == NET_CONNSTATE_ONLINE) { if(time_get()-m_LastSendTime > time_freq()/2) // flush connection after 500ms if needed { int NumFlushedChunks = Flush(); if(NumFlushedChunks && g_Config.m_Debug) dbg_msg("connection", "flushed connection due to timeout. %d chunks.", NumFlushedChunks); } if(time_get()-m_LastSendTime > time_freq()) SendControl(NET_CTRLMSG_KEEPALIVE, 0, 0); } else if(State() == NET_CONNSTATE_CONNECT) { if(time_get()-m_LastSendTime > time_freq()/2) // send a new connect every 500ms SendControl(NET_CTRLMSG_CONNECT, 0, 0); } else if(State() == NET_CONNSTATE_PENDING) { if(time_get()-m_LastSendTime > time_freq()/2) // send a new connect/accept every 500ms SendControl(NET_CTRLMSG_CONNECTACCEPT, 0, 0); } return 0; } teeworlds-0.6.2+dfsg/src/engine/shared/network_console.cpp0000644000175000017500000000673112140200333022662 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "netban.h" #include "network.h" bool CNetConsole::Open(NETADDR BindAddr, CNetBan *pNetBan, int Flags) { // zero out the whole structure mem_zero(this, sizeof(*this)); m_Socket.type = NETTYPE_INVALID; m_Socket.ipv4sock = -1; m_Socket.ipv6sock = -1; m_pNetBan = pNetBan; // open socket m_Socket = net_tcp_create(BindAddr); if(!m_Socket.type) return false; if(net_tcp_listen(m_Socket, NET_MAX_CONSOLE_CLIENTS)) return false; net_set_non_blocking(m_Socket); for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) m_aSlots[i].m_Connection.Reset(); return true; } void CNetConsole::SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser) { m_pfnNewClient = pfnNewClient; m_pfnDelClient = pfnDelClient; m_UserPtr = pUser; } int CNetConsole::Close() { for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) m_aSlots[i].m_Connection.Disconnect("closing console"); net_tcp_close(m_Socket); return 0; } int CNetConsole::Drop(int ClientID, const char *pReason) { if(m_pfnDelClient) m_pfnDelClient(ClientID, pReason, m_UserPtr); m_aSlots[ClientID].m_Connection.Disconnect(pReason); return 0; } int CNetConsole::AcceptClient(NETSOCKET Socket, const NETADDR *pAddr) { char aError[256] = { 0 }; int FreeSlot = -1; // look for free slot or multiple client for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) { if(FreeSlot == -1 && m_aSlots[i].m_Connection.State() == NET_CONNSTATE_OFFLINE) FreeSlot = i; if(m_aSlots[i].m_Connection.State() != NET_CONNSTATE_OFFLINE) { if(net_addr_comp(pAddr, m_aSlots[i].m_Connection.PeerAddress()) == 0) { str_copy(aError, "only one client per IP allowed", sizeof(aError)); break; } } } // accept client if(!aError[0] && FreeSlot != -1) { m_aSlots[FreeSlot].m_Connection.Init(Socket, pAddr); if(m_pfnNewClient) m_pfnNewClient(FreeSlot, m_UserPtr); return 0; } // reject client if(!aError[0]) str_copy(aError, "no free slot available", sizeof(aError)); net_tcp_send(Socket, aError, str_length(aError)); net_tcp_close(Socket); return -1; } int CNetConsole::Update() { NETSOCKET Socket; NETADDR Addr; if(net_tcp_accept(m_Socket, &Socket, &Addr) > 0) { // check if we just should drop the packet char aBuf[128]; if(NetBan() && NetBan()->IsBanned(&Addr, aBuf, sizeof(aBuf))) { // banned, reply with a message and drop net_tcp_send(Socket, aBuf, str_length(aBuf)); net_tcp_close(Socket); } else AcceptClient(Socket, &Addr); } for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) { if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_ONLINE) m_aSlots[i].m_Connection.Update(); if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_ERROR) Drop(i, m_aSlots[i].m_Connection.ErrorString()); } return 0; } int CNetConsole::Recv(char *pLine, int MaxLength, int *pClientID) { for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++) { if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_ONLINE && m_aSlots[i].m_Connection.Recv(pLine, MaxLength)) { if(pClientID) *pClientID = i; return 1; } } return 0; } int CNetConsole::Send(int ClientID, const char *pLine) { if(m_aSlots[ClientID].m_Connection.State() == NET_CONNSTATE_ONLINE) return m_aSlots[ClientID].m_Connection.Send(pLine); else return -1; } teeworlds-0.6.2+dfsg/src/engine/shared/network_console_conn.cpp0000644000175000017500000001021312140200333023665 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "network.h" void CConsoleNetConnection::Reset() { m_State = NET_CONNSTATE_OFFLINE; mem_zero(&m_PeerAddr, sizeof(m_PeerAddr)); m_aErrorString[0] = 0; m_Socket.type = NETTYPE_INVALID; m_Socket.ipv4sock = -1; m_Socket.ipv6sock = -1; m_aBuffer[0] = 0; m_BufferOffset = 0; m_LineEndingDetected = false; #if defined(CONF_FAMILY_WINDOWS) m_aLineEnding[0] = '\r'; m_aLineEnding[1] = '\n'; m_aLineEnding[2] = 0; #else m_aLineEnding[0] = '\n'; m_aLineEnding[1] = 0; m_aLineEnding[2] = 0; #endif } void CConsoleNetConnection::Init(NETSOCKET Socket, const NETADDR *pAddr) { Reset(); m_Socket = Socket; net_set_non_blocking(m_Socket); m_PeerAddr = *pAddr; m_State = NET_CONNSTATE_ONLINE; } void CConsoleNetConnection::Disconnect(const char *pReason) { if(State() == NET_CONNSTATE_OFFLINE) return; if(pReason && pReason[0]) Send(pReason); net_tcp_close(m_Socket); Reset(); } int CConsoleNetConnection::Update() { if(State() == NET_CONNSTATE_ONLINE) { if((int)(sizeof(m_aBuffer)) <= m_BufferOffset) { m_State = NET_CONNSTATE_ERROR; str_copy(m_aErrorString, "too weak connection (out of buffer)", sizeof(m_aErrorString)); return -1; } int Bytes = net_tcp_recv(m_Socket, m_aBuffer+m_BufferOffset, (int)(sizeof(m_aBuffer))-m_BufferOffset); if(Bytes > 0) { m_BufferOffset += Bytes; } else if(Bytes < 0) { if(net_would_block()) // no data received return 0; m_State = NET_CONNSTATE_ERROR; // error str_copy(m_aErrorString, "connection failure", sizeof(m_aErrorString)); return -1; } else { m_State = NET_CONNSTATE_ERROR; str_copy(m_aErrorString, "remote end closed the connection", sizeof(m_aErrorString)); return -1; } } return 0; } int CConsoleNetConnection::Recv(char *pLine, int MaxLength) { if(State() == NET_CONNSTATE_ONLINE) { if(m_BufferOffset) { // find message start int StartOffset = 0; while(m_aBuffer[StartOffset] == '\r' || m_aBuffer[StartOffset] == '\n') { // detect clients line ending format if(!m_LineEndingDetected) { m_aLineEnding[0] = m_aBuffer[StartOffset]; if(StartOffset+1 < m_BufferOffset && (m_aBuffer[StartOffset+1] == '\r' || m_aBuffer[StartOffset+1] == '\n') && m_aBuffer[StartOffset] != m_aBuffer[StartOffset+1]) m_aLineEnding[1] = m_aBuffer[StartOffset+1]; m_LineEndingDetected = true; } if(++StartOffset >= m_BufferOffset) { m_BufferOffset = 0; return 0; } } // find message end int EndOffset = StartOffset; while(m_aBuffer[EndOffset] != '\r' && m_aBuffer[EndOffset] != '\n') { if(++EndOffset >= m_BufferOffset) { if(StartOffset > 0) { mem_move(m_aBuffer, m_aBuffer+StartOffset, m_BufferOffset-StartOffset); m_BufferOffset -= StartOffset; } return 0; } } // extract message and update buffer if(MaxLength-1 < EndOffset-StartOffset) { if(StartOffset > 0) { mem_move(m_aBuffer, m_aBuffer+StartOffset, m_BufferOffset-StartOffset); m_BufferOffset -= StartOffset; } return 0; } mem_copy(pLine, m_aBuffer+StartOffset, EndOffset-StartOffset); pLine[EndOffset-StartOffset] = 0; str_sanitize_cc(pLine); mem_move(m_aBuffer, m_aBuffer+EndOffset, m_BufferOffset-EndOffset); m_BufferOffset -= EndOffset; return 1; } } return 0; } int CConsoleNetConnection::Send(const char *pLine) { if(State() != NET_CONNSTATE_ONLINE) return -1; char aBuf[1024]; str_copy(aBuf, pLine, (int)(sizeof(aBuf))-2); int Length = str_length(aBuf); aBuf[Length] = m_aLineEnding[0]; aBuf[Length+1] = m_aLineEnding[1]; aBuf[Length+2] = m_aLineEnding[2]; Length += 3; const char *pData = aBuf; while(true) { int Send = net_tcp_send(m_Socket, pData, Length); if(Send < 0) { m_State = NET_CONNSTATE_ERROR; str_copy(m_aErrorString, "failed to send packet", sizeof(m_aErrorString)); return -1; } if(Send >= Length) break; pData += Send; Length -= Send; } return 0; } teeworlds-0.6.2+dfsg/src/engine/shared/network_server.cpp0000644000175000017500000001452712140200333022530 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "netban.h" #include "network.h" bool CNetServer::Open(NETADDR BindAddr, CNetBan *pNetBan, int MaxClients, int MaxClientsPerIP, int Flags) { // zero out the whole structure mem_zero(this, sizeof(*this)); // open socket m_Socket = net_udp_create(BindAddr); if(!m_Socket.type) return false; m_pNetBan = pNetBan; // clamp clients m_MaxClients = MaxClients; if(m_MaxClients > NET_MAX_CLIENTS) m_MaxClients = NET_MAX_CLIENTS; if(m_MaxClients < 1) m_MaxClients = 1; m_MaxClientsPerIP = MaxClientsPerIP; for(int i = 0; i < NET_MAX_CLIENTS; i++) m_aSlots[i].m_Connection.Init(m_Socket, true); return true; } int CNetServer::SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser) { m_pfnNewClient = pfnNewClient; m_pfnDelClient = pfnDelClient; m_UserPtr = pUser; return 0; } int CNetServer::Close() { // TODO: implement me return 0; } int CNetServer::Drop(int ClientID, const char *pReason) { // TODO: insert lots of checks here /*NETADDR Addr = ClientAddr(ClientID); dbg_msg("net_server", "client dropped. cid=%d ip=%d.%d.%d.%d reason=\"%s\"", ClientID, Addr.ip[0], Addr.ip[1], Addr.ip[2], Addr.ip[3], pReason );*/ if(m_pfnDelClient) m_pfnDelClient(ClientID, pReason, m_UserPtr); m_aSlots[ClientID].m_Connection.Disconnect(pReason); return 0; } int CNetServer::Update() { int64 Now = time_get(); for(int i = 0; i < MaxClients(); i++) { m_aSlots[i].m_Connection.Update(); if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_ERROR) { if(Now - m_aSlots[i].m_Connection.ConnectTime() < time_freq() && NetBan()) NetBan()->BanAddr(ClientAddr(i), 60, "Stressing network"); else Drop(i, m_aSlots[i].m_Connection.ErrorString()); } } return 0; } /* TODO: chopp up this function into smaller working parts */ int CNetServer::Recv(CNetChunk *pChunk) { while(1) { NETADDR Addr; // check for a chunk if(m_RecvUnpacker.FetchChunk(pChunk)) return 1; // TODO: empty the recvinfo int Bytes = net_udp_recv(m_Socket, &Addr, m_RecvUnpacker.m_aBuffer, NET_MAX_PACKETSIZE); // no more packets for now if(Bytes <= 0) break; if(CNetBase::UnpackPacket(m_RecvUnpacker.m_aBuffer, Bytes, &m_RecvUnpacker.m_Data) == 0) { // check if we just should drop the packet char aBuf[128]; if(NetBan() && NetBan()->IsBanned(&Addr, aBuf, sizeof(aBuf))) { // banned, reply with a message CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, str_length(aBuf)+1); continue; } if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONNLESS) { pChunk->m_Flags = NETSENDFLAG_CONNLESS; pChunk->m_ClientID = -1; pChunk->m_Address = Addr; pChunk->m_DataSize = m_RecvUnpacker.m_Data.m_DataSize; pChunk->m_pData = m_RecvUnpacker.m_Data.m_aChunkData; return 1; } else { // TODO: check size here if(m_RecvUnpacker.m_Data.m_Flags&NET_PACKETFLAG_CONTROL && m_RecvUnpacker.m_Data.m_aChunkData[0] == NET_CTRLMSG_CONNECT) { bool Found = false; // check if we already got this client for(int i = 0; i < MaxClients(); i++) { if(m_aSlots[i].m_Connection.State() != NET_CONNSTATE_OFFLINE && net_addr_comp(m_aSlots[i].m_Connection.PeerAddress(), &Addr) == 0) { Found = true; // silent ignore.. we got this client already break; } } // client that wants to connect if(!Found) { // only allow a specific number of players with the same ip NETADDR ThisAddr = Addr, OtherAddr; int FoundAddr = 1; ThisAddr.port = 0; for(int i = 0; i < MaxClients(); ++i) { if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_OFFLINE) continue; OtherAddr = *m_aSlots[i].m_Connection.PeerAddress(); OtherAddr.port = 0; if(!net_addr_comp(&ThisAddr, &OtherAddr)) { if(FoundAddr++ >= m_MaxClientsPerIP) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "Only %d players with the same IP are allowed", m_MaxClientsPerIP); CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, aBuf, sizeof(aBuf)); return 0; } } } for(int i = 0; i < MaxClients(); i++) { if(m_aSlots[i].m_Connection.State() == NET_CONNSTATE_OFFLINE) { Found = true; m_aSlots[i].m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr); if(m_pfnNewClient) m_pfnNewClient(i, m_UserPtr); break; } } if(!Found) { const char FullMsg[] = "This server is full"; CNetBase::SendControlMsg(m_Socket, &Addr, 0, NET_CTRLMSG_CLOSE, FullMsg, sizeof(FullMsg)); } } } else { // normal packet, find matching slot for(int i = 0; i < MaxClients(); i++) { if(net_addr_comp(m_aSlots[i].m_Connection.PeerAddress(), &Addr) == 0) { if(m_aSlots[i].m_Connection.Feed(&m_RecvUnpacker.m_Data, &Addr)) { if(m_RecvUnpacker.m_Data.m_DataSize) m_RecvUnpacker.Start(&Addr, &m_aSlots[i].m_Connection, i); } } } } } } } return 0; } int CNetServer::Send(CNetChunk *pChunk) { if(pChunk->m_DataSize >= NET_MAX_PAYLOAD) { dbg_msg("netserver", "packet payload too big. %d. dropping packet", pChunk->m_DataSize); return -1; } if(pChunk->m_Flags&NETSENDFLAG_CONNLESS) { // send connectionless packet CNetBase::SendPacketConnless(m_Socket, &pChunk->m_Address, pChunk->m_pData, pChunk->m_DataSize); } else { int Flags = 0; dbg_assert(pChunk->m_ClientID >= 0, "errornous client id"); dbg_assert(pChunk->m_ClientID < MaxClients(), "errornous client id"); if(pChunk->m_Flags&NETSENDFLAG_VITAL) Flags = NET_CHUNKFLAG_VITAL; if(m_aSlots[pChunk->m_ClientID].m_Connection.QueueChunk(Flags, pChunk->m_DataSize, pChunk->m_pData) == 0) { if(pChunk->m_Flags&NETSENDFLAG_FLUSH) m_aSlots[pChunk->m_ClientID].m_Connection.Flush(); } else { Drop(pChunk->m_ClientID, "Error sending data"); } } return 0; } void CNetServer::SetMaxClientsPerIP(int Max) { // clamp if(Max < 1) Max = 1; else if(Max > NET_MAX_CLIENTS) Max = NET_MAX_CLIENTS; m_MaxClientsPerIP = Max; } teeworlds-0.6.2+dfsg/src/engine/shared/packer.cpp0000644000175000017500000000466212140200333020715 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "packer.h" #include "compression.h" #include "config.h" void CPacker::Reset() { m_Error = 0; m_pCurrent = m_aBuffer; m_pEnd = m_pCurrent + PACKER_BUFFER_SIZE; } void CPacker::AddInt(int i) { if(m_Error) return; // make sure that we have space enough if(m_pEnd - m_pCurrent < 6) { dbg_break(); m_Error = 1; } else m_pCurrent = CVariableInt::Pack(m_pCurrent, i); } void CPacker::AddString(const char *pStr, int Limit) { if(m_Error) return; // if(Limit > 0) { while(*pStr && Limit != 0) { *m_pCurrent++ = *pStr++; Limit--; if(m_pCurrent >= m_pEnd) { m_Error = 1; break; } } *m_pCurrent++ = 0; } else { while(*pStr) { *m_pCurrent++ = *pStr++; if(m_pCurrent >= m_pEnd) { m_Error = 1; break; } } *m_pCurrent++ = 0; } } void CPacker::AddRaw(const void *pData, int Size) { if(m_Error) return; if(m_pCurrent+Size >= m_pEnd) { m_Error = 1; return; } const unsigned char *pSrc = (const unsigned char *)pData; while(Size) { *m_pCurrent++ = *pSrc++; Size--; } } void CUnpacker::Reset(const void *pData, int Size) { m_Error = 0; m_pStart = (const unsigned char *)pData; m_pEnd = m_pStart + Size; m_pCurrent = m_pStart; } int CUnpacker::GetInt() { if(m_Error) return 0; if(m_pCurrent >= m_pEnd) { m_Error = 1; return 0; } int i; m_pCurrent = CVariableInt::Unpack(m_pCurrent, &i); if(m_pCurrent > m_pEnd) { m_Error = 1; return 0; } return i; } const char *CUnpacker::GetString(int SanitizeType) { if(m_Error || m_pCurrent >= m_pEnd) return ""; char *pPtr = (char *)m_pCurrent; while(*m_pCurrent) // skip the string { m_pCurrent++; if(m_pCurrent == m_pEnd) { m_Error = 1;; return ""; } } m_pCurrent++; // sanitize all strings if(SanitizeType&SANITIZE) str_sanitize(pPtr); else if(SanitizeType&SANITIZE_CC) str_sanitize_cc(pPtr); return SanitizeType&SKIP_START_WHITESPACES ? str_utf8_skip_whitespaces(pPtr) : pPtr; } const unsigned char *CUnpacker::GetRaw(int Size) { const unsigned char *pPtr = m_pCurrent; if(m_Error) return 0; // check for nasty sizes if(Size < 0 || m_pCurrent+Size > m_pEnd) { m_Error = 1; return 0; } // "unpack" the data m_pCurrent += Size; return pPtr; } teeworlds-0.6.2+dfsg/src/engine/shared/packer.h0000644000175000017500000000215112140200333020351 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_PACKER_H #define ENGINE_SHARED_PACKER_H class CPacker { enum { PACKER_BUFFER_SIZE=1024*2 }; unsigned char m_aBuffer[PACKER_BUFFER_SIZE]; unsigned char *m_pCurrent; unsigned char *m_pEnd; int m_Error; public: void Reset(); void AddInt(int i); void AddString(const char *pStr, int Limit); void AddRaw(const void *pData, int Size); int Size() const { return (int)(m_pCurrent-m_aBuffer); } const unsigned char *Data() const { return m_aBuffer; } bool Error() const { return m_Error; } }; class CUnpacker { const unsigned char *m_pStart; const unsigned char *m_pCurrent; const unsigned char *m_pEnd; int m_Error; public: enum { SANITIZE=1, SANITIZE_CC=2, SKIP_START_WHITESPACES=4 }; void Reset(const void *pData, int Size); int GetInt(); const char *GetString(int SanitizeType = SANITIZE); const unsigned char *GetRaw(int Size); bool Error() const { return m_Error; } }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/protocol.h0000644000175000017500000000446112140200333020753 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_PROTOCOL_H #define ENGINE_SHARED_PROTOCOL_H #include /* Connection diagram - How the initilization works. Client -> INFO -> Server Contains version info, name, and some other info. Client <- MAP <- Server Contains current map. Client -> READY -> Server The client has loaded the map and is ready to go, but the mod needs to send it's information aswell. modc_connected is called on the client and mods_connected is called on the server. The client should call client_entergame when the mod has done it's initilization. Client -> ENTERGAME -> Server Tells the server to start sending snapshots. client_entergame and server_client_enter is called. */ enum { NETMSG_NULL=0, // the first thing sent by the client // contains the version info for the client NETMSG_INFO=1, // sent by server NETMSG_MAP_CHANGE, // sent when client should switch map NETMSG_MAP_DATA, // map transfer, contains a chunk of the map file NETMSG_CON_READY, // connection is ready, client should send start info NETMSG_SNAP, // normal snapshot, multiple parts NETMSG_SNAPEMPTY, // empty snapshot NETMSG_SNAPSINGLE, // ? NETMSG_SNAPSMALL, // NETMSG_INPUTTIMING, // reports how off the input was NETMSG_RCON_AUTH_STATUS,// result of the authentication NETMSG_RCON_LINE, // line that should be printed to the remote console NETMSG_AUTH_CHALLANGE, // NETMSG_AUTH_RESULT, // // sent by client NETMSG_READY, // NETMSG_ENTERGAME, NETMSG_INPUT, // contains the inputdata from the client NETMSG_RCON_CMD, // NETMSG_RCON_AUTH, // NETMSG_REQUEST_MAP_DATA,// NETMSG_AUTH_START, // NETMSG_AUTH_RESPONSE, // // sent by both NETMSG_PING, NETMSG_PING_REPLY, NETMSG_ERROR, // sent by server (todo: move it up) NETMSG_RCON_CMD_ADD, NETMSG_RCON_CMD_REM, }; // this should be revised enum { SERVER_TICK_SPEED=50, SERVER_FLAG_PASSWORD = 0x1, MAX_CLIENTS=16, MAX_INPUT_SIZE=128, MAX_SNAPSHOT_PACKSIZE=900, MAX_NAME_LENGTH=16, MAX_CLAN_LENGTH=12, // message packing MSGFLAG_VITAL=1, MSGFLAG_FLUSH=2, MSGFLAG_NORECORD=4, MSGFLAG_RECORD=8, MSGFLAG_NOSEND=16 }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/ringbuffer.cpp0000644000175000017500000000752012140200333021575 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "ringbuffer.h" CRingBufferBase::CItem *CRingBufferBase::NextBlock(CItem *pItem) { if(pItem->m_pNext) return pItem->m_pNext; return m_pFirst; } CRingBufferBase::CItem *CRingBufferBase::PrevBlock(CItem *pItem) { if(pItem->m_pPrev) return pItem->m_pPrev; return m_pLast; } CRingBufferBase::CItem *CRingBufferBase::MergeBack(CItem *pItem) { // make sure that this block and previous block is free if(!pItem->m_Free || !pItem->m_pPrev || !pItem->m_pPrev->m_Free) return pItem; // merge the blocks pItem->m_pPrev->m_Size += pItem->m_Size; pItem->m_pPrev->m_pNext = pItem->m_pNext; // fixup pointers if(pItem->m_pNext) pItem->m_pNext->m_pPrev = pItem->m_pPrev; else m_pLast = pItem->m_pPrev; if(pItem == m_pProduce) m_pProduce = pItem->m_pPrev; if(pItem == m_pConsume) m_pConsume = pItem->m_pPrev; // return the current block return pItem->m_pPrev; } void CRingBufferBase::Init(void *pMemory, int Size, int Flags) { mem_zero(pMemory, Size); m_Size = (Size)/sizeof(CItem)*sizeof(CItem); m_pFirst = (CItem *)pMemory; m_pFirst->m_Free = 1; m_pFirst->m_Size = m_Size; m_pLast = m_pFirst; m_pProduce = m_pFirst; m_pConsume = m_pFirst; m_Flags = Flags; } void *CRingBufferBase::Allocate(int Size) { int WantedSize = (Size+sizeof(CItem)+sizeof(CItem)-1)/sizeof(CItem)*sizeof(CItem); CItem *pBlock = 0; // check if we even can fit this block if(WantedSize > m_Size) return 0; while(1) { // check for space if(m_pProduce->m_Free) { if(m_pProduce->m_Size >= WantedSize) pBlock = m_pProduce; else { // wrap around to try to find a block if(m_pFirst->m_Free && m_pFirst->m_Size >= WantedSize) pBlock = m_pFirst; } } if(pBlock) break; else { // we have no block, check our policy and see what todo if(m_Flags&FLAG_RECYCLE) { if(!PopFirst()) return 0; } else return 0; } } // okey, we have our block // split the block if needed if(pBlock->m_Size > WantedSize+(int)sizeof(CItem)) { CItem *pNewItem = (CItem *)((char *)pBlock + WantedSize); pNewItem->m_pPrev = pBlock; pNewItem->m_pNext = pBlock->m_pNext; if(pNewItem->m_pNext) pNewItem->m_pNext->m_pPrev = pNewItem; pBlock->m_pNext = pNewItem; pNewItem->m_Free = 1; pNewItem->m_Size = pBlock->m_Size - WantedSize; pBlock->m_Size = WantedSize; if(!pNewItem->m_pNext) m_pLast = pNewItem; } // set next block m_pProduce = NextBlock(pBlock); // set as used and return the item pointer pBlock->m_Free = 0; return (void *)(pBlock+1); } int CRingBufferBase::PopFirst() { if(m_pConsume->m_Free) return 0; // set the free flag m_pConsume->m_Free = 1; // previous block is also free, merge them m_pConsume = MergeBack(m_pConsume); // advance the consume pointer m_pConsume = NextBlock(m_pConsume); while(m_pConsume->m_Free && m_pConsume != m_pProduce) { m_pConsume = MergeBack(m_pConsume); m_pConsume = NextBlock(m_pConsume); } // in the case that we have catched up with the produce pointer // we might stand on a free block so merge em MergeBack(m_pConsume); return 1; } void *CRingBufferBase::Prev(void *pCurrent) { CItem *pItem = ((CItem *)pCurrent) - 1; while(1) { pItem = PrevBlock(pItem); if(pItem == m_pProduce) return 0; if(!pItem->m_Free) return pItem+1; } } void *CRingBufferBase::Next(void *pCurrent) { CItem *pItem = ((CItem *)pCurrent) - 1; while(1) { pItem = NextBlock(pItem); if(pItem == m_pProduce) return 0; if(!pItem->m_Free) return pItem+1; } } void *CRingBufferBase::First() { if(m_pConsume->m_Free) return 0; return (void *)(m_pConsume+1); } void *CRingBufferBase::Last() { return Prev(m_pProduce+1); } teeworlds-0.6.2+dfsg/src/engine/shared/ringbuffer.h0000644000175000017500000000303012140200333021232 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_RINGBUFFER_H #define ENGINE_SHARED_RINGBUFFER_H typedef struct RINGBUFFER RINGBUFFER; class CRingBufferBase { class CItem { public: CItem *m_pPrev; CItem *m_pNext; int m_Free; int m_Size; }; CItem *m_pProduce; CItem *m_pConsume; CItem *m_pFirst; CItem *m_pLast; void *m_pMemory; int m_Size; int m_Flags; CItem *NextBlock(CItem *pItem); CItem *PrevBlock(CItem *pItem); CItem *MergeBack(CItem *pItem); protected: void *Allocate(int Size); void *Prev(void *pCurrent); void *Next(void *pCurrent); void *First(); void *Last(); void Init(void *pMemory, int Size, int Flags); int PopFirst(); public: enum { // Will start to destroy items to try to fit the next one FLAG_RECYCLE=1 }; }; template class TStaticRingBuffer : public CRingBufferBase { unsigned char m_aBuffer[TSIZE]; public: TStaticRingBuffer() { Init(); } void Init() { CRingBufferBase::Init(m_aBuffer, TSIZE, TFLAGS); } T *Allocate(int Size) { return (T*)CRingBufferBase::Allocate(Size); } int PopFirst() { return CRingBufferBase::PopFirst(); } T *Prev(T *pCurrent) { return (T*)CRingBufferBase::Prev(pCurrent); } T *Next(T *pCurrent) { return (T*)CRingBufferBase::Next(pCurrent); } T *First() { return (T*)CRingBufferBase::First(); } T *Last() { return (T*)CRingBufferBase::Last(); } }; #endif teeworlds-0.6.2+dfsg/src/engine/shared/snapshot.cpp0000644000175000017500000002701012140200333021277 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "snapshot.h" #include "compression.h" // CSnapshot CSnapshotItem *CSnapshot::GetItem(int Index) { return (CSnapshotItem *)(DataStart() + Offsets()[Index]); } int CSnapshot::GetItemSize(int Index) { if(Index == m_NumItems-1) return (m_DataSize - Offsets()[Index]) - sizeof(CSnapshotItem); return (Offsets()[Index+1] - Offsets()[Index]) - sizeof(CSnapshotItem); } int CSnapshot::GetItemIndex(int Key) { // TODO: OPT: this should not be a linear search. very bad for(int i = 0; i < m_NumItems; i++) { if(GetItem(i)->Key() == Key) return i; } return -1; } int CSnapshot::Crc() { int Crc = 0; for(int i = 0; i < m_NumItems; i++) { CSnapshotItem *pItem = GetItem(i); int Size = GetItemSize(i); for(int b = 0; b < Size/4; b++) Crc += pItem->Data()[b]; } return Crc; } void CSnapshot::DebugDump() { dbg_msg("snapshot", "data_size=%d num_items=%d", m_DataSize, m_NumItems); for(int i = 0; i < m_NumItems; i++) { CSnapshotItem *pItem = GetItem(i); int Size = GetItemSize(i); dbg_msg("snapshot", "\ttype=%d id=%d", pItem->Type(), pItem->ID()); for(int b = 0; b < Size/4; b++) dbg_msg("snapshot", "\t\t%3d %12d\t%08x", b, pItem->Data()[b], pItem->Data()[b]); } } // CSnapshotDelta struct CItemList { int m_Num; int m_aKeys[64]; int m_aIndex[64]; }; enum { HASHLIST_SIZE = 256, }; static void GenerateHash(CItemList *pHashlist, CSnapshot *pSnapshot) { for(int i = 0; i < HASHLIST_SIZE; i++) pHashlist[i].m_Num = 0; for(int i = 0; i < pSnapshot->NumItems(); i++) { int Key = pSnapshot->GetItem(i)->Key(); int HashID = ((Key>>12)&0xf0) | (Key&0xf); if(pHashlist[HashID].m_Num != 64) { pHashlist[HashID].m_aIndex[pHashlist[HashID].m_Num] = i; pHashlist[HashID].m_aKeys[pHashlist[HashID].m_Num] = Key; pHashlist[HashID].m_Num++; } } } static int GetItemIndexHashed(int Key, const CItemList *pHashlist) { int HashID = ((Key>>12)&0xf0) | (Key&0xf); for(int i = 0; i < pHashlist[HashID].m_Num; i++) { if(pHashlist[HashID].m_aKeys[i] == Key) return pHashlist[HashID].m_aIndex[i]; } return -1; } static int DiffItem(int *pPast, int *pCurrent, int *pOut, int Size) { int Needed = 0; while(Size) { *pOut = *pCurrent-*pPast; Needed |= *pOut; pOut++; pPast++; pCurrent++; Size--; } return Needed; } void CSnapshotDelta::UndiffItem(int *pPast, int *pDiff, int *pOut, int Size) { while(Size) { *pOut = *pPast+*pDiff; if(*pDiff == 0) m_aSnapshotDataRate[m_SnapshotCurrent] += 1; else { unsigned char aBuf[16]; unsigned char *pEnd = CVariableInt::Pack(aBuf, *pDiff); m_aSnapshotDataRate[m_SnapshotCurrent] += (int)(pEnd - (unsigned char*)aBuf) * 8; } pOut++; pPast++; pDiff++; Size--; } } CSnapshotDelta::CSnapshotDelta() { mem_zero(m_aItemSizes, sizeof(m_aItemSizes)); mem_zero(m_aSnapshotDataRate, sizeof(m_aSnapshotDataRate)); mem_zero(m_aSnapshotDataUpdates, sizeof(m_aSnapshotDataUpdates)); m_SnapshotCurrent = 0; mem_zero(&m_Empty, sizeof(m_Empty)); } void CSnapshotDelta::SetStaticsize(int ItemType, int Size) { m_aItemSizes[ItemType] = Size; } CSnapshotDelta::CData *CSnapshotDelta::EmptyDelta() { return &m_Empty; } // TODO: OPT: this should be made much faster int CSnapshotDelta::CreateDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pDstData) { CData *pDelta = (CData *)pDstData; int *pData = (int *)pDelta->m_pData; int i, ItemSize, PastIndex; CSnapshotItem *pFromItem; CSnapshotItem *pCurItem; CSnapshotItem *pPastItem; int Count = 0; int SizeCount = 0; pDelta->m_NumDeletedItems = 0; pDelta->m_NumUpdateItems = 0; pDelta->m_NumTempItems = 0; CItemList Hashlist[HASHLIST_SIZE]; GenerateHash(Hashlist, pTo); // pack deleted stuff for(i = 0; i < pFrom->NumItems(); i++) { pFromItem = pFrom->GetItem(i); if(GetItemIndexHashed(pFromItem->Key(), Hashlist) == -1) { // deleted pDelta->m_NumDeletedItems++; *pData = pFromItem->Key(); pData++; } } GenerateHash(Hashlist, pFrom); int aPastIndecies[1024]; // fetch previous indices // we do this as a separate pass because it helps the cache const int NumItems = pTo->NumItems(); for(i = 0; i < NumItems; i++) { pCurItem = pTo->GetItem(i); // O(1) .. O(n) aPastIndecies[i] = GetItemIndexHashed(pCurItem->Key(), Hashlist); // O(n) .. O(n^n) } for(i = 0; i < NumItems; i++) { // do delta ItemSize = pTo->GetItemSize(i); // O(1) .. O(n) pCurItem = pTo->GetItem(i); // O(1) .. O(n) PastIndex = aPastIndecies[i]; if(PastIndex != -1) { int *pItemDataDst = pData+3; pPastItem = pFrom->GetItem(PastIndex); if(m_aItemSizes[pCurItem->Type()]) pItemDataDst = pData+2; if(DiffItem((int*)pPastItem->Data(), (int*)pCurItem->Data(), pItemDataDst, ItemSize/4)) { *pData++ = pCurItem->Type(); *pData++ = pCurItem->ID(); if(!m_aItemSizes[pCurItem->Type()]) *pData++ = ItemSize/4; pData += ItemSize/4; pDelta->m_NumUpdateItems++; } } else { *pData++ = pCurItem->Type(); *pData++ = pCurItem->ID(); if(!m_aItemSizes[pCurItem->Type()]) *pData++ = ItemSize/4; mem_copy(pData, pCurItem->Data(), ItemSize); SizeCount += ItemSize; pData += ItemSize/4; pDelta->m_NumUpdateItems++; Count++; } } if(0) { dbg_msg("snapshot", "%d %d %d", pDelta->m_NumDeletedItems, pDelta->m_NumUpdateItems, pDelta->m_NumTempItems); } /* // TODO: pack temp stuff // finish //mem_copy(pDelta->offsets, deleted, pDelta->num_deleted_items*sizeof(int)); //mem_copy(&(pDelta->offsets[pDelta->num_deleted_items]), update, pDelta->num_update_items*sizeof(int)); //mem_copy(&(pDelta->offsets[pDelta->num_deleted_items+pDelta->num_update_items]), temp, pDelta->num_temp_items*sizeof(int)); //mem_copy(pDelta->data_start(), data, data_size); //pDelta->data_size = data_size; * */ if(!pDelta->m_NumDeletedItems && !pDelta->m_NumUpdateItems && !pDelta->m_NumTempItems) return 0; return (int)((char*)pData-(char*)pDstData); } static int RangeCheck(void *pEnd, void *pPtr, int Size) { if((const char *)pPtr + Size > (const char *)pEnd) return -1; return 0; } int CSnapshotDelta::UnpackDelta(CSnapshot *pFrom, CSnapshot *pTo, void *pSrcData, int DataSize) { CSnapshotBuilder Builder; CData *pDelta = (CData *)pSrcData; int *pData = (int *)pDelta->m_pData; int *pEnd = (int *)(((char *)pSrcData + DataSize)); CSnapshotItem *pFromItem; int Keep, ItemSize; int *pDeleted; int ID, Type, Key; int FromIndex; int *pNewData; Builder.Init(); // unpack deleted stuff pDeleted = pData; pData += pDelta->m_NumDeletedItems; if(pData > pEnd) return -1; // copy all non deleted stuff for(int i = 0; i < pFrom->NumItems(); i++) { // dbg_assert(0, "fail!"); pFromItem = pFrom->GetItem(i); ItemSize = pFrom->GetItemSize(i); Keep = 1; for(int d = 0; d < pDelta->m_NumDeletedItems; d++) { if(pDeleted[d] == pFromItem->Key()) { Keep = 0; break; } } if(Keep) { // keep it mem_copy( Builder.NewItem(pFromItem->Type(), pFromItem->ID(), ItemSize), pFromItem->Data(), ItemSize); } } // unpack updated stuff for(int i = 0; i < pDelta->m_NumUpdateItems; i++) { if(pData+2 > pEnd) return -1; Type = *pData++; ID = *pData++; if(m_aItemSizes[Type]) ItemSize = m_aItemSizes[Type]; else { if(pData+1 > pEnd) return -2; ItemSize = (*pData++) * 4; } m_SnapshotCurrent = Type; if(RangeCheck(pEnd, pData, ItemSize) || ItemSize < 0) return -3; Key = (Type<<16)|ID; // create the item if needed pNewData = Builder.GetItemData(Key); if(!pNewData) pNewData = (int *)Builder.NewItem(Key>>16, Key&0xffff, ItemSize); //if(range_check(pEnd, pNewData, ItemSize)) return -4; FromIndex = pFrom->GetItemIndex(Key); if(FromIndex != -1) { // we got an update so we need pTo apply the diff UndiffItem((int *)pFrom->GetItem(FromIndex)->Data(), pData, pNewData, ItemSize/4); m_aSnapshotDataUpdates[m_SnapshotCurrent]++; } else // no previous, just copy the pData { mem_copy(pNewData, pData, ItemSize); m_aSnapshotDataRate[m_SnapshotCurrent] += ItemSize*8; m_aSnapshotDataUpdates[m_SnapshotCurrent]++; } pData += ItemSize/4; } // finish up return Builder.Finish(pTo); } // CSnapshotStorage void CSnapshotStorage::Init() { m_pFirst = 0; m_pLast = 0; } void CSnapshotStorage::PurgeAll() { CHolder *pHolder = m_pFirst; CHolder *pNext; while(pHolder) { pNext = pHolder->m_pNext; mem_free(pHolder); pHolder = pNext; } // no more snapshots in storage m_pFirst = 0; m_pLast = 0; } void CSnapshotStorage::PurgeUntil(int Tick) { CHolder *pHolder = m_pFirst; CHolder *pNext; while(pHolder) { pNext = pHolder->m_pNext; if(pHolder->m_Tick >= Tick) return; // no more to remove mem_free(pHolder); // did we come to the end of the list? if (!pNext) break; m_pFirst = pNext; pNext->m_pPrev = 0x0; pHolder = pNext; } // no more snapshots in storage m_pFirst = 0; m_pLast = 0; } void CSnapshotStorage::Add(int Tick, int64 Tagtime, int DataSize, void *pData, int CreateAlt) { // allocate memory for holder + snapshot_data int TotalSize = sizeof(CHolder)+DataSize; if(CreateAlt) TotalSize += DataSize; CHolder *pHolder = (CHolder *)mem_alloc(TotalSize, 1); // set data pHolder->m_Tick = Tick; pHolder->m_Tagtime = Tagtime; pHolder->m_SnapSize = DataSize; pHolder->m_pSnap = (CSnapshot*)(pHolder+1); mem_copy(pHolder->m_pSnap, pData, DataSize); if(CreateAlt) // create alternative if wanted { pHolder->m_pAltSnap = (CSnapshot*)(((char *)pHolder->m_pSnap) + DataSize); mem_copy(pHolder->m_pAltSnap, pData, DataSize); } else pHolder->m_pAltSnap = 0; // link pHolder->m_pNext = 0; pHolder->m_pPrev = m_pLast; if(m_pLast) m_pLast->m_pNext = pHolder; else m_pFirst = pHolder; m_pLast = pHolder; } int CSnapshotStorage::Get(int Tick, int64 *pTagtime, CSnapshot **ppData, CSnapshot **ppAltData) { CHolder *pHolder = m_pFirst; while(pHolder) { if(pHolder->m_Tick == Tick) { if(pTagtime) *pTagtime = pHolder->m_Tagtime; if(ppData) *ppData = pHolder->m_pSnap; if(ppAltData) *ppAltData = pHolder->m_pAltSnap; return pHolder->m_SnapSize; } pHolder = pHolder->m_pNext; } return -1; } // CSnapshotBuilder void CSnapshotBuilder::Init() { m_DataSize = 0; m_NumItems = 0; } CSnapshotItem *CSnapshotBuilder::GetItem(int Index) { return (CSnapshotItem *)&(m_aData[m_aOffsets[Index]]); } int *CSnapshotBuilder::GetItemData(int Key) { int i; for(i = 0; i < m_NumItems; i++) { if(GetItem(i)->Key() == Key) return (int *)GetItem(i)->Data(); } return 0; } int CSnapshotBuilder::Finish(void *SpnapData) { // flattern and make the snapshot CSnapshot *pSnap = (CSnapshot *)SpnapData; int OffsetSize = sizeof(int)*m_NumItems; pSnap->m_DataSize = m_DataSize; pSnap->m_NumItems = m_NumItems; mem_copy(pSnap->Offsets(), m_aOffsets, OffsetSize); mem_copy(pSnap->DataStart(), m_aData, m_DataSize); return sizeof(CSnapshot) + OffsetSize + m_DataSize; } void *CSnapshotBuilder::NewItem(int Type, int ID, int Size) { if(m_DataSize + sizeof(CSnapshotItem) + Size >= CSnapshot::MAX_SIZE || m_NumItems+1 >= MAX_ITEMS) { dbg_assert(m_DataSize < CSnapshot::MAX_SIZE, "too much data"); dbg_assert(m_NumItems < MAX_ITEMS, "too many items"); return 0; } CSnapshotItem *pObj = (CSnapshotItem *)(m_aData + m_DataSize); mem_zero(pObj, sizeof(CSnapshotItem) + Size); pObj->m_TypeAndID = (Type<<16)|ID; m_aOffsets[m_NumItems] = m_DataSize; m_DataSize += sizeof(CSnapshotItem) + Size; m_NumItems++; return pObj->Data(); } teeworlds-0.6.2+dfsg/src/engine/shared/snapshot.h0000644000175000017500000000513312140200333020746 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SHARED_SNAPSHOT_H #define ENGINE_SHARED_SNAPSHOT_H #include // CSnapshot class CSnapshotItem { public: int m_TypeAndID; int *Data() { return (int *)(this+1); } int Type() { return m_TypeAndID>>16; } int ID() { return m_TypeAndID&0xffff; } int Key() { return m_TypeAndID; } }; class CSnapshot { friend class CSnapshotBuilder; int m_DataSize; int m_NumItems; int *Offsets() const { return (int *)(this+1); } char *DataStart() const { return (char*)(Offsets()+m_NumItems); } public: enum { MAX_SIZE=64*1024 }; void Clear() { m_DataSize = 0; m_NumItems = 0; } int NumItems() const { return m_NumItems; } CSnapshotItem *GetItem(int Index); int GetItemSize(int Index); int GetItemIndex(int Key); int Crc(); void DebugDump(); }; // CSnapshotDelta class CSnapshotDelta { public: class CData { public: int m_NumDeletedItems; int m_NumUpdateItems; int m_NumTempItems; // needed? int m_pData[1]; }; private: // TODO: strange arbitrary number short m_aItemSizes[64]; int m_aSnapshotDataRate[0xffff]; int m_aSnapshotDataUpdates[0xffff]; int m_SnapshotCurrent; CData m_Empty; void UndiffItem(int *pPast, int *pDiff, int *pOut, int Size); public: CSnapshotDelta(); int GetDataRate(int Index) { return m_aSnapshotDataRate[Index]; } int GetDataUpdates(int Index) { return m_aSnapshotDataUpdates[Index]; } void SetStaticsize(int ItemType, int Size); CData *EmptyDelta(); int CreateDelta(class CSnapshot *pFrom, class CSnapshot *pTo, void *pData); int UnpackDelta(class CSnapshot *pFrom, class CSnapshot *pTo, void *pData, int DataSize); }; // CSnapshotStorage class CSnapshotStorage { public: class CHolder { public: CHolder *m_pPrev; CHolder *m_pNext; int64 m_Tagtime; int m_Tick; int m_SnapSize; CSnapshot *m_pSnap; CSnapshot *m_pAltSnap; }; CHolder *m_pFirst; CHolder *m_pLast; void Init(); void PurgeAll(); void PurgeUntil(int Tick); void Add(int Tick, int64 Tagtime, int DataSize, void *pData, int CreateAlt); int Get(int Tick, int64 *Tagtime, CSnapshot **pData, CSnapshot **ppAltData); }; class CSnapshotBuilder { enum { MAX_ITEMS = 1024 }; char m_aData[CSnapshot::MAX_SIZE]; int m_DataSize; int m_aOffsets[MAX_ITEMS]; int m_NumItems; public: void Init(); void *NewItem(int Type, int ID, int Size); CSnapshotItem *GetItem(int Index); int *GetItemData(int Key); int Finish(void *Snapdata); }; #endif // ENGINE_SNAPSHOT_H teeworlds-0.6.2+dfsg/src/engine/shared/storage.cpp0000644000175000017500000002376212140200333021116 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "linereader.h" // compiled-in data-dir path #define DATA_DIR "data" class CStorage : public IStorage { public: enum { MAX_PATHS = 16, MAX_PATH_LENGTH = 512 }; char m_aaStoragePaths[MAX_PATHS][MAX_PATH_LENGTH]; int m_NumPaths; char m_aDatadir[MAX_PATH_LENGTH]; char m_aUserdir[MAX_PATH_LENGTH]; char m_aCurrentdir[MAX_PATH_LENGTH]; CStorage() { mem_zero(m_aaStoragePaths, sizeof(m_aaStoragePaths)); m_NumPaths = 0; m_aDatadir[0] = 0; m_aUserdir[0] = 0; } int Init(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) { // get userdir fs_storage_path(pApplicationName, m_aUserdir, sizeof(m_aUserdir)); // get datadir FindDatadir(ppArguments[0]); // get currentdir if(!fs_getcwd(m_aCurrentdir, sizeof(m_aCurrentdir))) m_aCurrentdir[0] = 0; // load paths from storage.cfg LoadPaths(ppArguments[0]); if(!m_NumPaths) { dbg_msg("storage", "using standard paths"); AddDefaultPaths(); } // add save directories if(StorageType != STORAGETYPE_BASIC && m_NumPaths && (!m_aaStoragePaths[TYPE_SAVE][0] || !fs_makedir(m_aaStoragePaths[TYPE_SAVE]))) { char aPath[MAX_PATH_LENGTH]; if(StorageType == STORAGETYPE_CLIENT) { fs_makedir(GetPath(TYPE_SAVE, "screenshots", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "screenshots/auto", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "maps", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "downloadedmaps", aPath, sizeof(aPath))); } fs_makedir(GetPath(TYPE_SAVE, "dumps", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "demos", aPath, sizeof(aPath))); fs_makedir(GetPath(TYPE_SAVE, "demos/auto", aPath, sizeof(aPath))); } return m_NumPaths ? 0 : 1; } void LoadPaths(const char *pArgv0) { // check current directory IOHANDLE File = io_open("storage.cfg", IOFLAG_READ); if(!File) { // check usable path in argv[0] unsigned int Pos = ~0U; for(unsigned i = 0; pArgv0[i]; i++) if(pArgv0[i] == '/' || pArgv0[i] == '\\') Pos = i; if(Pos < MAX_PATH_LENGTH) { char aBuffer[MAX_PATH_LENGTH]; str_copy(aBuffer, pArgv0, Pos+1); str_append(aBuffer, "/storage.cfg", sizeof(aBuffer)); File = io_open(aBuffer, IOFLAG_READ); } if(Pos >= MAX_PATH_LENGTH || !File) { dbg_msg("storage", "couldn't open storage.cfg"); return; } } char *pLine; CLineReader LineReader; LineReader.Init(File); while((pLine = LineReader.Get())) { if(str_length(pLine) > 9 && !str_comp_num(pLine, "add_path ", 9)) AddPath(pLine+9); } io_close(File); if(!m_NumPaths) dbg_msg("storage", "no paths found in storage.cfg"); } void AddDefaultPaths() { AddPath("$USERDIR"); AddPath("$DATADIR"); AddPath("$CURRENTDIR"); } void AddPath(const char *pPath) { if(m_NumPaths >= MAX_PATHS || !pPath[0]) return; if(!str_comp(pPath, "$USERDIR")) { if(m_aUserdir[0]) { str_copy(m_aaStoragePaths[m_NumPaths++], m_aUserdir, MAX_PATH_LENGTH); dbg_msg("storage", "added path '$USERDIR' ('%s')", m_aUserdir); } } else if(!str_comp(pPath, "$DATADIR")) { if(m_aDatadir[0]) { str_copy(m_aaStoragePaths[m_NumPaths++], m_aDatadir, MAX_PATH_LENGTH); dbg_msg("storage", "added path '$DATADIR' ('%s')", m_aDatadir); } } else if(!str_comp(pPath, "$CURRENTDIR")) { m_aaStoragePaths[m_NumPaths++][0] = 0; dbg_msg("storage", "added path '$CURRENTDIR' ('%s')", m_aCurrentdir); } else { if(fs_is_dir(pPath)) { str_copy(m_aaStoragePaths[m_NumPaths++], pPath, MAX_PATH_LENGTH); dbg_msg("storage", "added path '%s'", pPath); } } } void FindDatadir(const char *pArgv0) { // 1) use data-dir in PWD if present if(fs_is_dir("data/mapres")) { str_copy(m_aDatadir, "data", sizeof(m_aDatadir)); return; } // 2) use compiled-in data-dir if present if(fs_is_dir(DATA_DIR "/mapres")) { str_copy(m_aDatadir, DATA_DIR, sizeof(m_aDatadir)); return; } // 3) check for usable path in argv[0] { unsigned int Pos = ~0U; for(unsigned i = 0; pArgv0[i]; i++) if(pArgv0[i] == '/' || pArgv0[i] == '\\') Pos = i; if(Pos < MAX_PATH_LENGTH) { char aBaseDir[MAX_PATH_LENGTH]; str_copy(aBaseDir, pArgv0, Pos+1); str_format(m_aDatadir, sizeof(m_aDatadir), "%s/data", aBaseDir); str_append(aBaseDir, "/data/mapres", sizeof(aBaseDir)); if(fs_is_dir(aBaseDir)) return; else m_aDatadir[0] = 0; } } #if defined(CONF_FAMILY_UNIX) // 4) check for all default locations { const char *aDirs[] = { "/usr/share/teeworlds/data", "/usr/share/games/teeworlds/data", "/usr/local/share/teeworlds/data", "/usr/local/share/games/teeworlds/data", "/opt/teeworlds/data" }; const int DirsCount = sizeof(aDirs) / sizeof(aDirs[0]); int i; for (i = 0; i < DirsCount; i++) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%s/mapres", aDirs[i]); if(fs_is_dir(aBuf)) { str_copy(m_aDatadir, aDirs[i], sizeof(m_aDatadir)); return; } } } #endif // no data-dir found dbg_msg("storage", "warning no data directory found"); } virtual void ListDirectory(int Type, const char *pPath, FS_LISTDIR_CALLBACK pfnCallback, void *pUser) { char aBuffer[MAX_PATH_LENGTH]; if(Type == TYPE_ALL) { // list all available directories for(int i = 0; i < m_NumPaths; ++i) fs_listdir(GetPath(i, pPath, aBuffer, sizeof(aBuffer)), pfnCallback, i, pUser); } else if(Type >= 0 && Type < m_NumPaths) { // list wanted directory fs_listdir(GetPath(Type, pPath, aBuffer, sizeof(aBuffer)), pfnCallback, Type, pUser); } } const char *GetPath(int Type, const char *pDir, char *pBuffer, unsigned BufferSize) { str_format(pBuffer, BufferSize, "%s%s%s", m_aaStoragePaths[Type], !m_aaStoragePaths[Type][0] ? "" : "/", pDir); return pBuffer; } virtual IOHANDLE OpenFile(const char *pFilename, int Flags, int Type, char *pBuffer = 0, int BufferSize = 0) { char aBuffer[MAX_PATH_LENGTH]; if(!pBuffer) { pBuffer = aBuffer; BufferSize = sizeof(aBuffer); } if(Flags&IOFLAG_WRITE) { return io_open(GetPath(TYPE_SAVE, pFilename, pBuffer, BufferSize), Flags); } else { IOHANDLE Handle = 0; if(Type == TYPE_ALL) { // check all available directories for(int i = 0; i < m_NumPaths; ++i) { Handle = io_open(GetPath(i, pFilename, pBuffer, BufferSize), Flags); if(Handle) return Handle; } } else if(Type >= 0 && Type < m_NumPaths) { // check wanted directory Handle = io_open(GetPath(Type, pFilename, pBuffer, BufferSize), Flags); if(Handle) return Handle; } } pBuffer[0] = 0; return 0; } struct CFindCBData { CStorage *pStorage; const char *pFilename; const char *pPath; char *pBuffer; int BufferSize; }; static int FindFileCallback(const char *pName, int IsDir, int Type, void *pUser) { CFindCBData Data = *static_cast(pUser); if(IsDir) { if(pName[0] == '.') return 0; // search within the folder char aBuf[MAX_PATH_LENGTH]; char aPath[MAX_PATH_LENGTH]; str_format(aPath, sizeof(aPath), "%s/%s", Data.pPath, pName); Data.pPath = aPath; fs_listdir(Data.pStorage->GetPath(Type, aPath, aBuf, sizeof(aBuf)), FindFileCallback, Type, &Data); if(Data.pBuffer[0]) return 1; } else if(!str_comp(pName, Data.pFilename)) { // found the file = end str_format(Data.pBuffer, Data.BufferSize, "%s/%s", Data.pPath, Data.pFilename); return 1; } return 0; } virtual bool FindFile(const char *pFilename, const char *pPath, int Type, char *pBuffer, int BufferSize) { if(BufferSize < 1) return false; pBuffer[0] = 0; char aBuf[MAX_PATH_LENGTH]; CFindCBData Data; Data.pStorage = this; Data.pFilename = pFilename; Data.pPath = pPath; Data.pBuffer = pBuffer; Data.BufferSize = BufferSize; if(Type == TYPE_ALL) { // search within all available directories for(int i = 0; i < m_NumPaths; ++i) { fs_listdir(GetPath(i, pPath, aBuf, sizeof(aBuf)), FindFileCallback, i, &Data); if(pBuffer[0]) return true; } } else if(Type >= 0 && Type < m_NumPaths) { // search within wanted directory fs_listdir(GetPath(Type, pPath, aBuf, sizeof(aBuf)), FindFileCallback, Type, &Data); } return pBuffer[0] != 0; } virtual bool RemoveFile(const char *pFilename, int Type) { if(Type < 0 || Type >= m_NumPaths) return false; char aBuffer[MAX_PATH_LENGTH]; return !fs_remove(GetPath(Type, pFilename, aBuffer, sizeof(aBuffer))); } virtual bool RenameFile(const char* pOldFilename, const char* pNewFilename, int Type) { if(Type < 0 || Type >= m_NumPaths) return false; char aOldBuffer[MAX_PATH_LENGTH]; char aNewBuffer[MAX_PATH_LENGTH]; return !fs_rename(GetPath(Type, pOldFilename, aOldBuffer, sizeof(aOldBuffer)), GetPath(Type, pNewFilename, aNewBuffer, sizeof (aNewBuffer))); } virtual bool CreateFolder(const char *pFoldername, int Type) { if(Type < 0 || Type >= m_NumPaths) return false; char aBuffer[MAX_PATH_LENGTH]; return !fs_makedir(GetPath(Type, pFoldername, aBuffer, sizeof(aBuffer))); } virtual void GetCompletePath(int Type, const char *pDir, char *pBuffer, unsigned BufferSize) { if(Type < 0 || Type >= m_NumPaths) { if(BufferSize > 0) pBuffer[0] = 0; return; } GetPath(Type, pDir, pBuffer, BufferSize); } static IStorage *Create(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) { CStorage *p = new CStorage(); if(p && p->Init(pApplicationName, StorageType, NumArgs, ppArguments)) { dbg_msg("storage", "initialisation failed"); delete p; p = 0; } return p; } }; IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) { return CStorage::Create(pApplicationName, StorageType, NumArgs, ppArguments); } teeworlds-0.6.2+dfsg/src/engine/sound.h0000644000175000017500000000201212140200333016762 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_SOUND_H #define ENGINE_SOUND_H #include "kernel.h" class ISound : public IInterface { MACRO_INTERFACE("sound", 0) public: enum { FLAG_LOOP=1, FLAG_POS=2, FLAG_ALL=3 }; virtual bool IsSoundEnabled() = 0; virtual int LoadWV(const char *pFilename) = 0; virtual void SetChannel(int ChannelID, float Volume, float Panning) = 0; virtual void SetListenerPos(float x, float y) = 0; virtual int PlayAt(int ChannelID, int SampleID, int Flags, float x, float y) = 0; virtual int Play(int ChannelID, int SampleID, int Flags) = 0; virtual void Stop(int SampleID) = 0; virtual void StopAll() = 0; }; class IEngineSound : public ISound { MACRO_INTERFACE("enginesound", 0) public: virtual int Init() = 0; virtual int Update() = 0; virtual int Shutdown() = 0; }; extern IEngineSound *CreateEngineSound(); #endif teeworlds-0.6.2+dfsg/src/engine/storage.h0000644000175000017500000000233412140200333017305 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_STORAGE_H #define ENGINE_STORAGE_H #include "kernel.h" class IStorage : public IInterface { MACRO_INTERFACE("storage", 0) public: enum { TYPE_SAVE = 0, TYPE_ALL = -1, STORAGETYPE_BASIC = 0, STORAGETYPE_SERVER, STORAGETYPE_CLIENT, }; virtual void ListDirectory(int Type, const char *pPath, FS_LISTDIR_CALLBACK pfnCallback, void *pUser) = 0; virtual IOHANDLE OpenFile(const char *pFilename, int Flags, int Type, char *pBuffer = 0, int BufferSize = 0) = 0; virtual bool FindFile(const char *pFilename, const char *pPath, int Type, char *pBuffer, int BufferSize) = 0; virtual bool RemoveFile(const char *pFilename, int Type) = 0; virtual bool RenameFile(const char* pOldFilename, const char* pNewFilename, int Type) = 0; virtual bool CreateFolder(const char *pFoldername, int Type) = 0; virtual void GetCompletePath(int Type, const char *pDir, char *pBuffer, unsigned BufferSize) = 0; }; extern IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments); #endif teeworlds-0.6.2+dfsg/src/engine/textrender.h0000644000175000017500000000313312140200333020023 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef ENGINE_TEXTRENDER_H #define ENGINE_TEXTRENDER_H #include "kernel.h" enum { TEXTFLAG_RENDER=1, TEXTFLAG_ALLOW_NEWLINE=2, TEXTFLAG_STOP_AT_END=4 }; class CFont; class CTextCursor { public: int m_Flags; int m_LineCount; int m_CharCount; int m_MaxLines; float m_StartX; float m_StartY; float m_LineWidth; float m_X, m_Y; CFont *m_pFont; float m_FontSize; }; class ITextRender : public IInterface { MACRO_INTERFACE("textrender", 0) public: virtual void SetCursor(CTextCursor *pCursor, float x, float y, float FontSize, int Flags) = 0; virtual CFont *LoadFont(const char *pFilename) = 0; virtual void DestroyFont(CFont *pFont) = 0; virtual void SetDefaultFont(CFont *pFont) = 0; // virtual void TextEx(CTextCursor *pCursor, const char *pText, int Length) = 0; // old foolish interface virtual void TextColor(float r, float g, float b, float a) = 0; virtual void TextOutlineColor(float r, float g, float b, float a) = 0; virtual void Text(void *pFontSetV, float x, float y, float Size, const char *pText, int MaxWidth) = 0; virtual float TextWidth(void *pFontSetV, float Size, const char *pText, int Length) = 0; virtual int TextLineCount(void *pFontSetV, float Size, const char *pText, float LineWidth) = 0; }; class IEngineTextRender : public ITextRender { MACRO_INTERFACE("enginetextrender", 0) public: virtual void Init() = 0; }; extern IEngineTextRender *CreateEngineTextRender(); #endif teeworlds-0.6.2+dfsg/src/game/0000755000175000017500000000000012140200333015132 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/client/0000755000175000017500000000000012140200333016410 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/client/animstate.cpp0000644000175000017500000000477512140200333021116 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "animstate.h" static void AnimSeqEval(CAnimSequence *pSeq, float Time, CAnimKeyframe *pFrame) { if(pSeq->m_NumFrames == 0) { pFrame->m_Time = 0; pFrame->m_X = 0; pFrame->m_Y = 0; pFrame->m_Angle = 0; } else if(pSeq->m_NumFrames == 1) { *pFrame = pSeq->m_aFrames[0]; } else { //time = max(0.0f, min(1.0f, time / duration)); // TODO: use clamp CAnimKeyframe *pFrame1 = 0; CAnimKeyframe *pFrame2 = 0; float Blend = 0.0f; // TODO: make this smarter.. binary search for (int i = 1; i < pSeq->m_NumFrames; i++) { if (pSeq->m_aFrames[i-1].m_Time <= Time && pSeq->m_aFrames[i].m_Time >= Time) { pFrame1 = &pSeq->m_aFrames[i-1]; pFrame2 = &pSeq->m_aFrames[i]; Blend = (Time - pFrame1->m_Time) / (pFrame2->m_Time - pFrame1->m_Time); break; } } if (pFrame1 && pFrame2) { pFrame->m_Time = Time; pFrame->m_X = mix(pFrame1->m_X, pFrame2->m_X, Blend); pFrame->m_Y = mix(pFrame1->m_Y, pFrame2->m_Y, Blend); pFrame->m_Angle = mix(pFrame1->m_Angle, pFrame2->m_Angle, Blend); } } } static void AnimAddKeyframe(CAnimKeyframe *pSeq, CAnimKeyframe *pAdded, float Amount) { pSeq->m_X += pAdded->m_X*Amount; pSeq->m_Y += pAdded->m_Y*Amount; pSeq->m_Angle += pAdded->m_Angle*Amount; } static void AnimAdd(CAnimState *pState, CAnimState *pAdded, float Amount) { AnimAddKeyframe(pState->GetBody(), pAdded->GetBody(), Amount); AnimAddKeyframe(pState->GetBackFoot(), pAdded->GetBackFoot(), Amount); AnimAddKeyframe(pState->GetFrontFoot(), pAdded->GetFrontFoot(), Amount); AnimAddKeyframe(pState->GetAttach(), pAdded->GetAttach(), Amount); } void CAnimState::Set(CAnimation *pAnim, float Time) { AnimSeqEval(&pAnim->m_Body, Time, &m_Body); AnimSeqEval(&pAnim->m_BackFoot, Time, &m_BackFoot); AnimSeqEval(&pAnim->m_FrontFoot, Time, &m_FrontFoot); AnimSeqEval(&pAnim->m_Attach, Time, &m_Attach); } void CAnimState::Add(CAnimation *pAnim, float Time, float Amount) { CAnimState Add; Add.Set(pAnim, Time); AnimAdd(this, &Add, Amount); } CAnimState *CAnimState::GetIdle() { static CAnimState State; static bool Init = true; if(Init) { State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0); State.Add(&g_pData->m_aAnimations[ANIM_IDLE], 0, 1.0f); Init = false; } return &State; } teeworlds-0.6.2+dfsg/src/game/client/animstate.h0000644000175000017500000000134412140200333020550 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_ANIMSTATE_H #define GAME_CLIENT_ANIMSTATE_H class CAnimState { CAnimKeyframe m_Body; CAnimKeyframe m_BackFoot; CAnimKeyframe m_FrontFoot; CAnimKeyframe m_Attach; public: CAnimKeyframe *GetBody() { return &m_Body; }; CAnimKeyframe *GetBackFoot() { return &m_BackFoot; }; CAnimKeyframe *GetFrontFoot() { return &m_FrontFoot; }; CAnimKeyframe *GetAttach() { return &m_Attach; }; void Set(CAnimation *pAnim, float Time); void Add(CAnimation *pAdded, float Time, float Amount); static CAnimState *GetIdle(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/component.h0000644000175000017500000000360112140200333020563 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENT_H #define GAME_CLIENT_COMPONENT_H #include #include "gameclient.h" class CComponent { protected: friend class CGameClient; CGameClient *m_pClient; // perhaps propagte pointers for these as well class IKernel *Kernel() const { return m_pClient->Kernel(); } class IGraphics *Graphics() const { return m_pClient->Graphics(); } class ITextRender *TextRender() const { return m_pClient->TextRender(); } class IClient *Client() const { return m_pClient->Client(); } class IInput *Input() const { return m_pClient->Input(); } class IStorage *Storage() const { return m_pClient->Storage(); } class CUI *UI() const { return m_pClient->UI(); } class ISound *Sound() const { return m_pClient->Sound(); } class CRenderTools *RenderTools() const { return m_pClient->RenderTools(); } class IConsole *Console() const { return m_pClient->Console(); } class IDemoPlayer *DemoPlayer() const { return m_pClient->DemoPlayer(); } class IDemoRecorder *DemoRecorder() const { return m_pClient->DemoRecorder(); } class IServerBrowser *ServerBrowser() const { return m_pClient->ServerBrowser(); } class CLayers *Layers() const { return m_pClient->Layers(); } class CCollision *Collision() const { return m_pClient->Collision(); } public: virtual ~CComponent() {} virtual void OnStateChange(int NewState, int OldState) {}; virtual void OnConsoleInit() {}; virtual void OnInit() {}; virtual void OnReset() {}; virtual void OnRender() {}; virtual void OnRelease() {}; virtual void OnMapLoad() {}; virtual void OnMessage(int Msg, void *pRawMsg) {} virtual bool OnMouseMove(float x, float y) { return false; } virtual bool OnInput(IInput::CEvent e) { return false; } }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/0000755000175000017500000000000012140200333020575 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/client/components/binds.cpp0000644000175000017500000001354012140200333022403 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "binds.h" bool CBinds::CBindsSpecial::OnInput(IInput::CEvent Event) { // don't handle invalid events and keys that arn't set to anything if(Event.m_Key >= KEY_F1 && Event.m_Key <= KEY_F15 && m_pBinds->m_aaKeyBindings[Event.m_Key][0] != 0) { int Stroke = 0; if(Event.m_Flags&IInput::FLAG_PRESS) Stroke = 1; m_pBinds->GetConsole()->ExecuteLineStroked(Stroke, m_pBinds->m_aaKeyBindings[Event.m_Key]); return true; } return false; } CBinds::CBinds() { mem_zero(m_aaKeyBindings, sizeof(m_aaKeyBindings)); m_SpecialBinds.m_pBinds = this; } void CBinds::Bind(int KeyID, const char *pStr) { if(KeyID < 0 || KeyID >= KEY_LAST) return; str_copy(m_aaKeyBindings[KeyID], pStr, sizeof(m_aaKeyBindings[KeyID])); char aBuf[256]; if(!m_aaKeyBindings[KeyID][0]) str_format(aBuf, sizeof(aBuf), "unbound %s (%d)", Input()->KeyName(KeyID), KeyID); else str_format(aBuf, sizeof(aBuf), "bound %s (%d) = %s", Input()->KeyName(KeyID), KeyID, m_aaKeyBindings[KeyID]); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf); } bool CBinds::OnInput(IInput::CEvent e) { // don't handle invalid events and keys that arn't set to anything if(e.m_Key <= 0 || e.m_Key >= KEY_LAST || m_aaKeyBindings[e.m_Key][0] == 0) return false; int Stroke = 0; if(e.m_Flags&IInput::FLAG_PRESS) Stroke = 1; Console()->ExecuteLineStroked(Stroke, m_aaKeyBindings[e.m_Key]); return true; } void CBinds::UnbindAll() { for(int i = 0; i < KEY_LAST; i++) m_aaKeyBindings[i][0] = 0; } const char *CBinds::Get(int KeyID) { if(KeyID > 0 && KeyID < KEY_LAST) return m_aaKeyBindings[KeyID]; return ""; } const char *CBinds::GetKey(const char *pBindStr) { for(int KeyId = 0; KeyId < KEY_LAST; KeyId++) { const char *pBind = Get(KeyId); if(!pBind[0]) continue; if(str_comp(pBind, pBindStr) == 0) return Input()->KeyName(KeyId); } return ""; } void CBinds::SetDefaults() { // set default key bindings UnbindAll(); Bind(KEY_F1, "toggle_local_console"); Bind(KEY_F2, "toggle_remote_console"); Bind(KEY_TAB, "+scoreboard"); Bind('u', "+show_chat"); Bind(KEY_F10, "screenshot"); Bind('a', "+left"); Bind('d', "+right"); Bind(KEY_SPACE, "+jump"); Bind(KEY_MOUSE_1, "+fire"); Bind(KEY_MOUSE_2, "+hook"); Bind(KEY_LSHIFT, "+emote"); Bind(KEY_RSHIFT, "+spectate"); Bind(KEY_RIGHT, "spectate_next"); Bind(KEY_LEFT, "spectate_previous"); Bind('1', "+weapon1"); Bind('2', "+weapon2"); Bind('3', "+weapon3"); Bind('4', "+weapon4"); Bind('5', "+weapon5"); Bind(KEY_MOUSE_WHEEL_UP, "+prevweapon"); Bind(KEY_MOUSE_WHEEL_DOWN, "+nextweapon"); Bind('t', "chat all"); Bind('y', "chat team"); Bind(KEY_F3, "vote yes"); Bind(KEY_F4, "vote no"); } void CBinds::OnConsoleInit() { // bindings IConfig *pConfig = Kernel()->RequestInterface(); if(pConfig) pConfig->RegisterCallback(ConfigSaveCallback, this); Console()->Register("bind", "sr", CFGFLAG_CLIENT, ConBind, this, "Bind key to execute the command"); Console()->Register("unbind", "s", CFGFLAG_CLIENT, ConUnbind, this, "Unbind key"); Console()->Register("unbindall", "", CFGFLAG_CLIENT, ConUnbindAll, this, "Unbind all keys"); Console()->Register("dump_binds", "", CFGFLAG_CLIENT, ConDumpBinds, this, "Dump binds"); // default bindings SetDefaults(); } void CBinds::ConBind(IConsole::IResult *pResult, void *pUserData) { CBinds *pBinds = (CBinds *)pUserData; const char *pKeyName = pResult->GetString(0); int id = pBinds->GetKeyID(pKeyName); if(!id) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "key %s not found", pKeyName); pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf); return; } pBinds->Bind(id, pResult->GetString(1)); } void CBinds::ConUnbind(IConsole::IResult *pResult, void *pUserData) { CBinds *pBinds = (CBinds *)pUserData; const char *pKeyName = pResult->GetString(0); int id = pBinds->GetKeyID(pKeyName); if(!id) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "key %s not found", pKeyName); pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf); return; } pBinds->Bind(id, ""); } void CBinds::ConUnbindAll(IConsole::IResult *pResult, void *pUserData) { CBinds *pBinds = (CBinds *)pUserData; pBinds->UnbindAll(); } void CBinds::ConDumpBinds(IConsole::IResult *pResult, void *pUserData) { CBinds *pBinds = (CBinds *)pUserData; char aBuf[1024]; for(int i = 0; i < KEY_LAST; i++) { if(pBinds->m_aaKeyBindings[i][0] == 0) continue; str_format(aBuf, sizeof(aBuf), "%s (%d) = %s", pBinds->Input()->KeyName(i), i, pBinds->m_aaKeyBindings[i]); pBinds->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "binds", aBuf); } } int CBinds::GetKeyID(const char *pKeyName) { // check for numeric if(pKeyName[0] == '&') { int i = str_toint(pKeyName+1); if(i > 0 && i < KEY_LAST) return i; // numeric } // search for key for(int i = 0; i < KEY_LAST; i++) { if(str_comp(pKeyName, Input()->KeyName(i)) == 0) return i; } return 0; } void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData) { CBinds *pSelf = (CBinds *)pUserData; char aBuffer[256]; char *pEnd = aBuffer+sizeof(aBuffer)-8; pConfig->WriteLine("unbindall"); for(int i = 0; i < KEY_LAST; i++) { if(pSelf->m_aaKeyBindings[i][0] == 0) continue; str_format(aBuffer, sizeof(aBuffer), "bind %s ", pSelf->Input()->KeyName(i)); // process the string. we need to escape some characters const char *pSrc = pSelf->m_aaKeyBindings[i]; char *pDst = aBuffer + str_length(aBuffer); *pDst++ = '"'; while(*pSrc && pDst < pEnd) { if(*pSrc == '"' || *pSrc == '\\') // escape \ and " *pDst++ = '\\'; *pDst++ = *pSrc++; } *pDst++ = '"'; *pDst++ = 0; pConfig->WriteLine(aBuffer); } } teeworlds-0.6.2+dfsg/src/game/client/components/binds.h0000644000175000017500000000237112140200333022050 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_BINDS_H #define GAME_CLIENT_COMPONENTS_BINDS_H #include #include class CBinds : public CComponent { char m_aaKeyBindings[KEY_LAST][128]; int GetKeyID(const char *pKeyName); static void ConBind(IConsole::IResult *pResult, void *pUserData); static void ConUnbind(IConsole::IResult *pResult, void *pUserData); static void ConUnbindAll(IConsole::IResult *pResult, void *pUserData); static void ConDumpBinds(IConsole::IResult *pResult, void *pUserData); class IConsole *GetConsole() const { return Console(); } static void ConfigSaveCallback(class IConfig *pConfig, void *pUserData); public: CBinds(); class CBindsSpecial : public CComponent { public: CBinds *m_pBinds; virtual bool OnInput(IInput::CEvent Event); }; CBindsSpecial m_SpecialBinds; void Bind(int KeyID, const char *pStr); void SetDefaults(); void UnbindAll(); const char *Get(int KeyID); const char *GetKey(const char *pBindStr); virtual void OnConsoleInit(); virtual bool OnInput(IInput::CEvent Event); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/broadcast.cpp0000644000175000017500000000313612140200333023246 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include "broadcast.h" void CBroadcast::OnReset() { m_BroadcastTime = 0; } void CBroadcast::OnRender() { if(m_pClient->m_pScoreboard->Active() || m_pClient->m_pMotd->IsActive()) return; Graphics()->MapScreen(0, 0, 300*Graphics()->ScreenAspect(), 300); if(time_get() < m_BroadcastTime) { CTextCursor Cursor; TextRender()->SetCursor(&Cursor, m_BroadcastRenderOffset, 40.0f, 12.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = 300*Graphics()->ScreenAspect()-m_BroadcastRenderOffset; TextRender()->TextEx(&Cursor, m_aBroadcastText, -1); } } void CBroadcast::OnMessage(int MsgType, void *pRawMsg) { if(MsgType == NETMSGTYPE_SV_BROADCAST) { CNetMsg_Sv_Broadcast *pMsg = (CNetMsg_Sv_Broadcast *)pRawMsg; str_copy(m_aBroadcastText, pMsg->m_pMessage, sizeof(m_aBroadcastText)); CTextCursor Cursor; TextRender()->SetCursor(&Cursor, 0, 0, 12.0f, TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = 300*Graphics()->ScreenAspect(); TextRender()->TextEx(&Cursor, m_aBroadcastText, -1); m_BroadcastRenderOffset = 150*Graphics()->ScreenAspect()-Cursor.m_X/2; m_BroadcastTime = time_get()+time_freq()*10; } } teeworlds-0.6.2+dfsg/src/game/client/components/broadcast.h0000644000175000017500000000110212140200333022702 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_BROADCAST_H #define GAME_CLIENT_COMPONENTS_BROADCAST_H #include class CBroadcast : public CComponent { // broadcasts char m_aBroadcastText[1024]; int64 m_BroadcastTime; float m_BroadcastRenderOffset; public: virtual void OnReset(); virtual void OnRender(); virtual void OnMessage(int MsgType, void *pRawMsg); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/camera.cpp0000644000175000017500000000305512140200333022534 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include "camera.h" #include "controls.h" CCamera::CCamera() { m_CamType = CAMTYPE_UNDEFINED; } void CCamera::OnRender() { //vec2 center; m_Zoom = 1.0f; // update camera center if(m_pClient->m_Snap.m_SpecInfo.m_Active && !m_pClient->m_Snap.m_SpecInfo.m_UsePosition) { if(m_CamType != CAMTYPE_SPEC) { m_pClient->m_pControls->m_MousePos = m_PrevCenter; m_pClient->m_pControls->ClampMousePos(); m_CamType = CAMTYPE_SPEC; } m_Center = m_pClient->m_pControls->m_MousePos; } else { if(m_CamType != CAMTYPE_PLAYER) { m_pClient->m_pControls->ClampMousePos(); m_CamType = CAMTYPE_PLAYER; } vec2 CameraOffset(0, 0); float l = length(m_pClient->m_pControls->m_MousePos); if(l > 0.0001f) // make sure that this isn't 0 { float DeadZone = g_Config.m_ClMouseDeadzone; float FollowFactor = g_Config.m_ClMouseFollowfactor/100.0f; float OffsetAmount = max(l-DeadZone, 0.0f) * FollowFactor; CameraOffset = normalize(m_pClient->m_pControls->m_MousePos)*OffsetAmount; } if(m_pClient->m_Snap.m_SpecInfo.m_Active) m_Center = m_pClient->m_Snap.m_SpecInfo.m_Position + CameraOffset; else m_Center = m_pClient->m_LocalCharacterPos + CameraOffset; } m_PrevCenter = m_Center; } teeworlds-0.6.2+dfsg/src/game/client/components/camera.h0000644000175000017500000000106612140200333022201 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_CAMERA_H #define GAME_CLIENT_COMPONENTS_CAMERA_H #include #include class CCamera : public CComponent { enum { CAMTYPE_UNDEFINED=-1, CAMTYPE_SPEC, CAMTYPE_PLAYER, }; int m_CamType; vec2 m_PrevCenter; public: vec2 m_Center; float m_Zoom; CCamera(); virtual void OnRender(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/chat.cpp0000644000175000017500000003753712140200333022237 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include "chat.h" CChat::CChat() { OnReset(); } void CChat::OnReset() { for(int i = 0; i < MAX_LINES; i++) { m_aLines[i].m_Time = 0; m_aLines[i].m_aText[0] = 0; m_aLines[i].m_aName[0] = 0; } m_Show = false; m_InputUpdate = false; m_ChatStringOffset = 0; m_CompletionChosen = -1; m_aCompletionBuffer[0] = 0; m_PlaceholderOffset = 0; m_PlaceholderLength = 0; m_pHistoryEntry = 0x0; m_PendingChatCounter = 0; m_LastChatSend = 0; for(int i = 0; i < CHAT_NUM; ++i) m_aLastSoundPlayed[i] = 0; } void CChat::OnRelease() { m_Show = false; } void CChat::OnStateChange(int NewState, int OldState) { if(OldState <= IClient::STATE_CONNECTING) { m_Mode = MODE_NONE; for(int i = 0; i < MAX_LINES; i++) m_aLines[i].m_Time = 0; m_CurrentLine = 0; } } void CChat::ConSay(IConsole::IResult *pResult, void *pUserData) { ((CChat*)pUserData)->Say(0, pResult->GetString(0)); } void CChat::ConSayTeam(IConsole::IResult *pResult, void *pUserData) { ((CChat*)pUserData)->Say(1, pResult->GetString(0)); } void CChat::ConChat(IConsole::IResult *pResult, void *pUserData) { const char *pMode = pResult->GetString(0); if(str_comp(pMode, "all") == 0) ((CChat*)pUserData)->EnableMode(0); else if(str_comp(pMode, "team") == 0) ((CChat*)pUserData)->EnableMode(1); else ((CChat*)pUserData)->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "console", "expected all or team as mode"); } void CChat::ConShowChat(IConsole::IResult *pResult, void *pUserData) { ((CChat *)pUserData)->m_Show = pResult->GetInteger(0) != 0; } void CChat::OnConsoleInit() { Console()->Register("say", "r", CFGFLAG_CLIENT, ConSay, this, "Say in chat"); Console()->Register("say_team", "r", CFGFLAG_CLIENT, ConSayTeam, this, "Say in team chat"); Console()->Register("chat", "s", CFGFLAG_CLIENT, ConChat, this, "Enable chat with all/team mode"); Console()->Register("+show_chat", "", CFGFLAG_CLIENT, ConShowChat, this, "Show chat"); } bool CChat::OnInput(IInput::CEvent Event) { if(m_Mode == MODE_NONE) return false; if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) { m_Mode = MODE_NONE; m_pClient->OnRelease(); } else if(Event.m_Flags&IInput::FLAG_PRESS && (Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER)) { if(m_Input.GetString()[0]) { bool AddEntry = false; if(m_LastChatSend+time_freq() < time_get()) { Say(m_Mode == MODE_ALL ? 0 : 1, m_Input.GetString()); AddEntry = true; } else if(m_PendingChatCounter < 3) { ++m_PendingChatCounter; AddEntry = true; } if(AddEntry) { CHistoryEntry *pEntry = m_History.Allocate(sizeof(CHistoryEntry)+m_Input.GetLength()); pEntry->m_Team = m_Mode == MODE_ALL ? 0 : 1; mem_copy(pEntry->m_aText, m_Input.GetString(), m_Input.GetLength()+1); } } m_pHistoryEntry = 0x0; m_Mode = MODE_NONE; m_pClient->OnRelease(); } if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_TAB) { // fill the completion buffer if(m_CompletionChosen < 0) { const char *pCursor = m_Input.GetString()+m_Input.GetCursorOffset(); for(int Count = 0; Count < m_Input.GetCursorOffset() && *(pCursor-1) != ' '; --pCursor, ++Count); m_PlaceholderOffset = pCursor-m_Input.GetString(); for(m_PlaceholderLength = 0; *pCursor && *pCursor != ' '; ++pCursor) ++m_PlaceholderLength; str_copy(m_aCompletionBuffer, m_Input.GetString()+m_PlaceholderOffset, min(static_cast(sizeof(m_aCompletionBuffer)), m_PlaceholderLength+1)); } // find next possible name const char *pCompletionString = 0; m_CompletionChosen = (m_CompletionChosen+1)%(2*MAX_CLIENTS); for(int i = 0; i < 2*MAX_CLIENTS; ++i) { int SearchType = ((m_CompletionChosen+i)%(2*MAX_CLIENTS))/MAX_CLIENTS; int Index = (m_CompletionChosen+i)%MAX_CLIENTS; if(!m_pClient->m_Snap.m_paPlayerInfos[Index]) continue; bool Found = false; if(SearchType == 1) { if(str_comp_nocase_num(m_pClient->m_aClients[Index].m_aName, m_aCompletionBuffer, str_length(m_aCompletionBuffer)) && str_find_nocase(m_pClient->m_aClients[Index].m_aName, m_aCompletionBuffer)) Found = true; } else if(!str_comp_nocase_num(m_pClient->m_aClients[Index].m_aName, m_aCompletionBuffer, str_length(m_aCompletionBuffer))) Found = true; if(Found) { pCompletionString = m_pClient->m_aClients[Index].m_aName; m_CompletionChosen = Index+SearchType*MAX_CLIENTS; break; } } // insert the name if(pCompletionString) { char aBuf[256]; // add part before the name str_copy(aBuf, m_Input.GetString(), min(static_cast(sizeof(aBuf)), m_PlaceholderOffset+1)); // add the name str_append(aBuf, pCompletionString, sizeof(aBuf)); // add seperator const char *pSeparator = ""; if(*(m_Input.GetString()+m_PlaceholderOffset+m_PlaceholderLength) != ' ') pSeparator = m_PlaceholderOffset == 0 ? ": " : " "; else if(m_PlaceholderOffset == 0) pSeparator = ":"; if(*pSeparator) str_append(aBuf, pSeparator, sizeof(aBuf)); // add part after the name str_append(aBuf, m_Input.GetString()+m_PlaceholderOffset+m_PlaceholderLength, sizeof(aBuf)); m_PlaceholderLength = str_length(pSeparator)+str_length(pCompletionString); m_OldChatStringLength = m_Input.GetLength(); m_Input.Set(aBuf); m_Input.SetCursorOffset(m_PlaceholderOffset+m_PlaceholderLength); m_InputUpdate = true; } } else { // reset name completion process if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key != KEY_TAB) m_CompletionChosen = -1; m_OldChatStringLength = m_Input.GetLength(); m_Input.ProcessInput(Event); m_InputUpdate = true; } if(Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_UP) { if(m_pHistoryEntry) { CHistoryEntry *pTest = m_History.Prev(m_pHistoryEntry); if(pTest) m_pHistoryEntry = pTest; } else m_pHistoryEntry = m_History.Last(); if(m_pHistoryEntry) m_Input.Set(m_pHistoryEntry->m_aText); } else if (Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_DOWN) { if(m_pHistoryEntry) m_pHistoryEntry = m_History.Next(m_pHistoryEntry); if (m_pHistoryEntry) m_Input.Set(m_pHistoryEntry->m_aText); else m_Input.Clear(); } return true; } void CChat::EnableMode(int Team) { if(Client()->State() == IClient::STATE_DEMOPLAYBACK) return; if(m_Mode == MODE_NONE) { if(Team) m_Mode = MODE_TEAM; else m_Mode = MODE_ALL; m_Input.Clear(); Input()->ClearEvents(); m_CompletionChosen = -1; } } void CChat::OnMessage(int MsgType, void *pRawMsg) { if(MsgType == NETMSGTYPE_SV_CHAT) { CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; AddLine(pMsg->m_ClientID, pMsg->m_Team, pMsg->m_pMessage); } } void CChat::AddLine(int ClientID, int Team, const char *pLine) { if(*pLine == 0 || (ClientID != -1 && (m_pClient->m_aClients[ClientID].m_aName[0] == '\0' || // unknown client m_pClient->m_aClients[ClientID].m_ChatIgnore || (m_pClient->m_Snap.m_LocalClientID != ClientID && g_Config.m_ClShowChatFriends && !m_pClient->m_aClients[ClientID].m_Friend)))) return; // trim right and set maximum length to 128 utf8-characters int Length = 0; const char *pStr = pLine; const char *pEnd = 0; while(*pStr) { const char *pStrOld = pStr; int Code = str_utf8_decode(&pStr); // check if unicode is not empty if(Code > 0x20 && Code != 0xA0 && Code != 0x034F && (Code < 0x2000 || Code > 0x200F) && (Code < 0x2028 || Code > 0x202F) && (Code < 0x205F || Code > 0x2064) && (Code < 0x206A || Code > 0x206F) && (Code < 0xFE00 || Code > 0xFE0F) && Code != 0xFEFF && (Code < 0xFFF9 || Code > 0xFFFC)) { pEnd = 0; } else if(pEnd == 0) pEnd = pStrOld; if(++Length >= 127) { *(const_cast(pStr)) = 0; break; } } if(pEnd != 0) *(const_cast(pEnd)) = 0; bool Highlighted = false; char *p = const_cast(pLine); while(*p) { Highlighted = false; pLine = p; // find line seperator and strip multiline while(*p) { if(*p++ == '\n') { *(p-1) = 0; break; } } m_CurrentLine = (m_CurrentLine+1)%MAX_LINES; m_aLines[m_CurrentLine].m_Time = time_get(); m_aLines[m_CurrentLine].m_YOffset[0] = -1.0f; m_aLines[m_CurrentLine].m_YOffset[1] = -1.0f; m_aLines[m_CurrentLine].m_ClientID = ClientID; m_aLines[m_CurrentLine].m_Team = Team; m_aLines[m_CurrentLine].m_NameColor = -2; // check for highlighted name const char *pHL = str_find_nocase(pLine, m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientID].m_aName); if(pHL) { int Length = str_length(m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientID].m_aName); if((pLine == pHL || pHL[-1] == ' ') && (pHL[Length] == 0 || pHL[Length] == ' ' || (pHL[Length] == ':' && pHL[Length+1] == ' '))) Highlighted = true; } m_aLines[m_CurrentLine].m_Highlighted = Highlighted; if(ClientID == -1) // server message { str_copy(m_aLines[m_CurrentLine].m_aName, "*** ", sizeof(m_aLines[m_CurrentLine].m_aName)); str_format(m_aLines[m_CurrentLine].m_aText, sizeof(m_aLines[m_CurrentLine].m_aText), "%s", pLine); } else { if(m_pClient->m_aClients[ClientID].m_Team == TEAM_SPECTATORS) m_aLines[m_CurrentLine].m_NameColor = TEAM_SPECTATORS; if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) { if(m_pClient->m_aClients[ClientID].m_Team == TEAM_RED) m_aLines[m_CurrentLine].m_NameColor = TEAM_RED; else if(m_pClient->m_aClients[ClientID].m_Team == TEAM_BLUE) m_aLines[m_CurrentLine].m_NameColor = TEAM_BLUE; } str_copy(m_aLines[m_CurrentLine].m_aName, m_pClient->m_aClients[ClientID].m_aName, sizeof(m_aLines[m_CurrentLine].m_aName)); str_format(m_aLines[m_CurrentLine].m_aText, sizeof(m_aLines[m_CurrentLine].m_aText), ": %s", pLine); } char aBuf[1024]; str_format(aBuf, sizeof(aBuf), "%s%s", m_aLines[m_CurrentLine].m_aName, m_aLines[m_CurrentLine].m_aText); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, m_aLines[m_CurrentLine].m_Team?"teamchat":"chat", aBuf); } // play sound int64 Now = time_get(); if(ClientID == -1) { if(Now-m_aLastSoundPlayed[CHAT_SERVER] >= time_freq()*3/10) { m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_SERVER, 0); m_aLastSoundPlayed[CHAT_SERVER] = Now; } } else if(Highlighted) { if(Now-m_aLastSoundPlayed[CHAT_HIGHLIGHT] >= time_freq()*3/10) { m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_HIGHLIGHT, 0); m_aLastSoundPlayed[CHAT_HIGHLIGHT] = Now; } } else { if(Now-m_aLastSoundPlayed[CHAT_CLIENT] >= time_freq()*3/10) { m_pClient->m_pSounds->Play(CSounds::CHN_GUI, SOUND_CHAT_CLIENT, 0); m_aLastSoundPlayed[CHAT_CLIENT] = Now; } } } void CChat::OnRender() { // send pending chat messages if(m_PendingChatCounter > 0 && m_LastChatSend+time_freq() < time_get()) { CHistoryEntry *pEntry = m_History.Last(); for(int i = m_PendingChatCounter-1; pEntry; --i, pEntry = m_History.Prev(pEntry)) { if(i == 0) { Say(pEntry->m_Team, pEntry->m_aText); break; } } --m_PendingChatCounter; } float Width = 300.0f*Graphics()->ScreenAspect(); Graphics()->MapScreen(0.0f, 0.0f, Width, 300.0f); float x = 5.0f; float y = 300.0f-20.0f; if(m_Mode != MODE_NONE) { // render chat input CTextCursor Cursor; TextRender()->SetCursor(&Cursor, x, y, 8.0f, TEXTFLAG_RENDER); Cursor.m_LineWidth = Width-190.0f; Cursor.m_MaxLines = 2; if(m_Mode == MODE_ALL) TextRender()->TextEx(&Cursor, Localize("All"), -1); else if(m_Mode == MODE_TEAM) TextRender()->TextEx(&Cursor, Localize("Team"), -1); else TextRender()->TextEx(&Cursor, Localize("Chat"), -1); TextRender()->TextEx(&Cursor, ": ", -1); // check if the visible text has to be moved if(m_InputUpdate) { if(m_ChatStringOffset > 0 && m_Input.GetLength() < m_OldChatStringLength) m_ChatStringOffset = max(0, m_ChatStringOffset-(m_OldChatStringLength-m_Input.GetLength())); if(m_ChatStringOffset > m_Input.GetCursorOffset()) m_ChatStringOffset -= m_ChatStringOffset-m_Input.GetCursorOffset(); else { CTextCursor Temp = Cursor; Temp.m_Flags = 0; TextRender()->TextEx(&Temp, m_Input.GetString()+m_ChatStringOffset, m_Input.GetCursorOffset()-m_ChatStringOffset); TextRender()->TextEx(&Temp, "|", -1); while(Temp.m_LineCount > 2) { ++m_ChatStringOffset; Temp = Cursor; Temp.m_Flags = 0; TextRender()->TextEx(&Temp, m_Input.GetString()+m_ChatStringOffset, m_Input.GetCursorOffset()-m_ChatStringOffset); TextRender()->TextEx(&Temp, "|", -1); } } m_InputUpdate = false; } TextRender()->TextEx(&Cursor, m_Input.GetString()+m_ChatStringOffset, m_Input.GetCursorOffset()-m_ChatStringOffset); static float MarkerOffset = TextRender()->TextWidth(0, 8.0f, "|", -1)/3; CTextCursor Marker = Cursor; Marker.m_X -= MarkerOffset; TextRender()->TextEx(&Marker, "|", -1); TextRender()->TextEx(&Cursor, m_Input.GetString()+m_Input.GetCursorOffset(), -1); } y -= 8.0f; int64 Now = time_get(); float LineWidth = m_pClient->m_pScoreboard->Active() ? 90.0f : 200.0f; float HeightLimit = m_pClient->m_pScoreboard->Active() ? 230.0f : m_Show ? 50.0f : 200.0f; float Begin = x; float FontSize = 6.0f; CTextCursor Cursor; int OffsetType = m_pClient->m_pScoreboard->Active() ? 1 : 0; for(int i = 0; i < MAX_LINES; i++) { int r = ((m_CurrentLine-i)+MAX_LINES)%MAX_LINES; if(Now > m_aLines[r].m_Time+16*time_freq() && !m_Show) break; // get the y offset (calculate it if we haven't done that yet) if(m_aLines[r].m_YOffset[OffsetType] < 0.0f) { TextRender()->SetCursor(&Cursor, Begin, 0.0f, FontSize, 0); Cursor.m_LineWidth = LineWidth; TextRender()->TextEx(&Cursor, m_aLines[r].m_aName, -1); TextRender()->TextEx(&Cursor, m_aLines[r].m_aText, -1); m_aLines[r].m_YOffset[OffsetType] = Cursor.m_Y + Cursor.m_FontSize; } y -= m_aLines[r].m_YOffset[OffsetType]; // cut off if msgs waste too much space if(y < HeightLimit) break; float Blend = Now > m_aLines[r].m_Time+14*time_freq() && !m_Show ? 1.0f-(Now-m_aLines[r].m_Time-14*time_freq())/(2.0f*time_freq()) : 1.0f; // reset the cursor TextRender()->SetCursor(&Cursor, Begin, y, FontSize, TEXTFLAG_RENDER); Cursor.m_LineWidth = LineWidth; // render name if(m_aLines[r].m_ClientID == -1) TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system else if(m_aLines[r].m_Team) TextRender()->TextColor(0.45f, 0.9f, 0.45f, Blend); // team message else if(m_aLines[r].m_NameColor == TEAM_RED) TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // red else if(m_aLines[r].m_NameColor == TEAM_BLUE) TextRender()->TextColor(0.7f, 0.7f, 1.0f, Blend); // blue else if(m_aLines[r].m_NameColor == TEAM_SPECTATORS) TextRender()->TextColor(0.75f, 0.5f, 0.75f, Blend); // spectator else TextRender()->TextColor(0.8f, 0.8f, 0.8f, Blend); TextRender()->TextEx(&Cursor, m_aLines[r].m_aName, -1); // render line if(m_aLines[r].m_ClientID == -1) TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system else if(m_aLines[r].m_Highlighted) TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // highlighted else if(m_aLines[r].m_Team) TextRender()->TextColor(0.65f, 1.0f, 0.65f, Blend); // team message else TextRender()->TextColor(1.0f, 1.0f, 1.0f, Blend); TextRender()->TextEx(&Cursor, m_aLines[r].m_aText, -1); } TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); } void CChat::Say(int Team, const char *pLine) { m_LastChatSend = time_get(); // send chat message CNetMsg_Cl_Say Msg; Msg.m_Team = Team; Msg.m_pMessage = pLine; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } teeworlds-0.6.2+dfsg/src/game/client/components/chat.h0000644000175000017500000000377612140200333021702 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_CHAT_H #define GAME_CLIENT_COMPONENTS_CHAT_H #include #include #include class CChat : public CComponent { CLineInput m_Input; enum { MAX_LINES = 25, }; struct CLine { int64 m_Time; float m_YOffset[2]; int m_ClientID; int m_Team; int m_NameColor; char m_aName[64]; char m_aText[512]; bool m_Highlighted; }; CLine m_aLines[MAX_LINES]; int m_CurrentLine; // chat enum { MODE_NONE=0, MODE_ALL, MODE_TEAM, CHAT_SERVER=0, CHAT_HIGHLIGHT, CHAT_CLIENT, CHAT_NUM, }; int m_Mode; bool m_Show; bool m_InputUpdate; int m_ChatStringOffset; int m_OldChatStringLength; int m_CompletionChosen; char m_aCompletionBuffer[256]; int m_PlaceholderOffset; int m_PlaceholderLength; struct CHistoryEntry { int m_Team; char m_aText[1]; }; CHistoryEntry *m_pHistoryEntry; TStaticRingBuffer m_History; int m_PendingChatCounter; int64 m_LastChatSend; int64 m_aLastSoundPlayed[CHAT_NUM]; static void ConSay(IConsole::IResult *pResult, void *pUserData); static void ConSayTeam(IConsole::IResult *pResult, void *pUserData); static void ConChat(IConsole::IResult *pResult, void *pUserData); static void ConShowChat(IConsole::IResult *pResult, void *pUserData); public: CChat(); bool IsActive() const { return m_Mode != MODE_NONE; } void AddLine(int ClientID, int Team, const char *pLine); void EnableMode(int Team); void Say(int Team, const char *pLine); virtual void OnReset(); virtual void OnConsoleInit(); virtual void OnStateChange(int NewState, int OldState); virtual void OnRender(); virtual void OnRelease(); virtual void OnMessage(int MsgType, void *pRawMsg); virtual bool OnInput(IInput::CEvent Event); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/console.cpp0000644000175000017500000005161412140200333022752 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "console.h" enum { CONSOLE_CLOSED, CONSOLE_OPENING, CONSOLE_OPEN, CONSOLE_CLOSING, }; CGameConsole::CInstance::CInstance(int Type) { m_pHistoryEntry = 0x0; m_Type = Type; if(Type == CGameConsole::CONSOLETYPE_LOCAL) m_CompletionFlagmask = CFGFLAG_CLIENT; else m_CompletionFlagmask = CFGFLAG_SERVER; m_aCompletionBuffer[0] = 0; m_CompletionChosen = -1; m_CompletionRenderOffset = 0.0f; m_IsCommand = false; } void CGameConsole::CInstance::Init(CGameConsole *pGameConsole) { m_pGameConsole = pGameConsole; }; void CGameConsole::CInstance::ClearBacklog() { m_Backlog.Init(); m_BacklogActPage = 0; } void CGameConsole::CInstance::ClearHistory() { m_History.Init(); m_pHistoryEntry = 0; } void CGameConsole::CInstance::ExecuteLine(const char *pLine) { if(m_Type == CGameConsole::CONSOLETYPE_LOCAL) m_pGameConsole->m_pConsole->ExecuteLine(pLine); else { if(m_pGameConsole->Client()->RconAuthed()) m_pGameConsole->Client()->Rcon(pLine); else m_pGameConsole->Client()->RconAuth("", pLine); } } void CGameConsole::CInstance::PossibleCommandsCompleteCallback(const char *pStr, void *pUser) { CGameConsole::CInstance *pInstance = (CGameConsole::CInstance *)pUser; if(pInstance->m_CompletionChosen == pInstance->m_CompletionEnumerationCount) pInstance->m_Input.Set(pStr); pInstance->m_CompletionEnumerationCount++; } void CGameConsole::CInstance::OnInput(IInput::CEvent Event) { bool Handled = false; if(Event.m_Flags&IInput::FLAG_PRESS) { if(Event.m_Key == KEY_RETURN || Event.m_Key == KEY_KP_ENTER) { if(m_Input.GetString()[0]) { if(m_Type == CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) { char *pEntry = m_History.Allocate(m_Input.GetLength()+1); mem_copy(pEntry, m_Input.GetString(), m_Input.GetLength()+1); } ExecuteLine(m_Input.GetString()); m_Input.Clear(); m_pHistoryEntry = 0x0; } Handled = true; } else if (Event.m_Key == KEY_UP) { if (m_pHistoryEntry) { char *pTest = m_History.Prev(m_pHistoryEntry); if (pTest) m_pHistoryEntry = pTest; } else m_pHistoryEntry = m_History.Last(); if (m_pHistoryEntry) m_Input.Set(m_pHistoryEntry); Handled = true; } else if (Event.m_Key == KEY_DOWN) { if (m_pHistoryEntry) m_pHistoryEntry = m_History.Next(m_pHistoryEntry); if (m_pHistoryEntry) m_Input.Set(m_pHistoryEntry); else m_Input.Clear(); Handled = true; } else if(Event.m_Key == KEY_TAB) { if(m_Type == CGameConsole::CONSOLETYPE_LOCAL || m_pGameConsole->Client()->RconAuthed()) { m_CompletionChosen++; m_CompletionEnumerationCount = 0; m_pGameConsole->m_pConsole->PossibleCommands(m_aCompletionBuffer, m_CompletionFlagmask, m_Type != CGameConsole::CONSOLETYPE_LOCAL && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands(), PossibleCommandsCompleteCallback, this); // handle wrapping if(m_CompletionEnumerationCount && m_CompletionChosen >= m_CompletionEnumerationCount) { m_CompletionChosen %= m_CompletionEnumerationCount; m_CompletionEnumerationCount = 0; m_pGameConsole->m_pConsole->PossibleCommands(m_aCompletionBuffer, m_CompletionFlagmask, m_Type != CGameConsole::CONSOLETYPE_LOCAL && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands(), PossibleCommandsCompleteCallback, this); } } } else if(Event.m_Key == KEY_PAGEUP) { ++m_BacklogActPage; } else if(Event.m_Key == KEY_PAGEDOWN) { --m_BacklogActPage; if(m_BacklogActPage < 0) m_BacklogActPage = 0; } } if(!Handled) m_Input.ProcessInput(Event); if(Event.m_Flags&IInput::FLAG_PRESS) { if(Event.m_Key != KEY_TAB) { m_CompletionChosen = -1; str_copy(m_aCompletionBuffer, m_Input.GetString(), sizeof(m_aCompletionBuffer)); } // find the current command { char aBuf[64] = {0}; const char *pSrc = GetString(); int i = 0; for(; i < (int)sizeof(aBuf)-1 && *pSrc && *pSrc != ' '; i++, pSrc++) aBuf[i] = *pSrc; aBuf[i] = 0; const IConsole::CCommandInfo *pCommand = m_pGameConsole->m_pConsole->GetCommandInfo(aBuf, m_CompletionFlagmask, m_Type != CGameConsole::CONSOLETYPE_LOCAL && m_pGameConsole->Client()->RconAuthed() && m_pGameConsole->Client()->UseTempRconCommands()); if(pCommand) { m_IsCommand = true; str_copy(m_aCommandName, pCommand->m_pName, IConsole::TEMPCMD_NAME_LENGTH); str_copy(m_aCommandHelp, pCommand->m_pHelp, IConsole::TEMPCMD_HELP_LENGTH); str_copy(m_aCommandParams, pCommand->m_pParams, IConsole::TEMPCMD_PARAMS_LENGTH); } else m_IsCommand = false; } } } void CGameConsole::CInstance::PrintLine(const char *pLine) { int Len = str_length(pLine); if (Len > 255) Len = 255; CBacklogEntry *pEntry = m_Backlog.Allocate(sizeof(CBacklogEntry)+Len); pEntry->m_YOffset = -1.0f; mem_copy(pEntry->m_aText, pLine, Len); pEntry->m_aText[Len] = 0; } CGameConsole::CGameConsole() : m_LocalConsole(CONSOLETYPE_LOCAL), m_RemoteConsole(CONSOLETYPE_REMOTE) { m_ConsoleType = CONSOLETYPE_LOCAL; m_ConsoleState = CONSOLE_CLOSED; m_StateChangeEnd = 0.0f; m_StateChangeDuration = 0.1f; } float CGameConsole::TimeNow() { static long long s_TimeStart = time_get(); return float(time_get()-s_TimeStart)/float(time_freq()); } CGameConsole::CInstance *CGameConsole::CurrentConsole() { if(m_ConsoleType == CONSOLETYPE_REMOTE) return &m_RemoteConsole; return &m_LocalConsole; } void CGameConsole::OnReset() { } // only defined for 0<=t<=1 static float ConsoleScaleFunc(float t) { //return t; return sinf(acosf(1.0f-t)); } struct CRenderInfo { CGameConsole *m_pSelf; CTextCursor m_Cursor; const char *m_pCurrentCmd; int m_WantedCompletion; int m_EnumCount; float m_Offset; float m_Width; }; void CGameConsole::PossibleCommandsRenderCallback(const char *pStr, void *pUser) { CRenderInfo *pInfo = static_cast(pUser); if(pInfo->m_EnumCount == pInfo->m_WantedCompletion) { float tw = pInfo->m_pSelf->TextRender()->TextWidth(pInfo->m_Cursor.m_pFont, pInfo->m_Cursor.m_FontSize, pStr, -1); pInfo->m_pSelf->Graphics()->TextureSet(-1); pInfo->m_pSelf->Graphics()->QuadsBegin(); pInfo->m_pSelf->Graphics()->SetColor(229.0f/255.0f,185.0f/255.0f,4.0f/255.0f,0.85f); pInfo->m_pSelf->RenderTools()->DrawRoundRect(pInfo->m_Cursor.m_X-3, pInfo->m_Cursor.m_Y, tw+5, pInfo->m_Cursor.m_FontSize+4, pInfo->m_Cursor.m_FontSize/3); pInfo->m_pSelf->Graphics()->QuadsEnd(); // scroll when out of sight if(pInfo->m_Cursor.m_X < 3.0f) pInfo->m_Offset = 0.0f; else if(pInfo->m_Cursor.m_X+tw > pInfo->m_Width) pInfo->m_Offset -= pInfo->m_Width/2; pInfo->m_pSelf->TextRender()->TextColor(0.05f, 0.05f, 0.05f,1); pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pStr, -1); } else { const char *pMatchStart = str_find_nocase(pStr, pInfo->m_pCurrentCmd); if(pMatchStart) { pInfo->m_pSelf->TextRender()->TextColor(0.5f,0.5f,0.5f,1); pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pStr, pMatchStart-pStr); pInfo->m_pSelf->TextRender()->TextColor(229.0f/255.0f,185.0f/255.0f,4.0f/255.0f,1); pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pMatchStart, str_length(pInfo->m_pCurrentCmd)); pInfo->m_pSelf->TextRender()->TextColor(0.5f,0.5f,0.5f,1); pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pMatchStart+str_length(pInfo->m_pCurrentCmd), -1); } else { pInfo->m_pSelf->TextRender()->TextColor(0.75f,0.75f,0.75f,1); pInfo->m_pSelf->TextRender()->TextEx(&pInfo->m_Cursor, pStr, -1); } } pInfo->m_EnumCount++; pInfo->m_Cursor.m_X += 7.0f; } void CGameConsole::OnRender() { CUIRect Screen = *UI()->Screen(); float ConsoleMaxHeight = Screen.h*3/5.0f; float ConsoleHeight; float Progress = (TimeNow()-(m_StateChangeEnd-m_StateChangeDuration))/float(m_StateChangeDuration); if (Progress >= 1.0f) { if (m_ConsoleState == CONSOLE_CLOSING) m_ConsoleState = CONSOLE_CLOSED; else if (m_ConsoleState == CONSOLE_OPENING) m_ConsoleState = CONSOLE_OPEN; Progress = 1.0f; } if (m_ConsoleState == CONSOLE_OPEN && g_Config.m_ClEditor) Toggle(CONSOLETYPE_LOCAL); if (m_ConsoleState == CONSOLE_CLOSED) return; if (m_ConsoleState == CONSOLE_OPEN) Input()->MouseModeAbsolute(); float ConsoleHeightScale; if (m_ConsoleState == CONSOLE_OPENING) ConsoleHeightScale = ConsoleScaleFunc(Progress); else if (m_ConsoleState == CONSOLE_CLOSING) ConsoleHeightScale = ConsoleScaleFunc(1.0f-Progress); else //if (console_state == CONSOLE_OPEN) ConsoleHeightScale = ConsoleScaleFunc(1.0f); ConsoleHeight = ConsoleHeightScale*ConsoleMaxHeight; Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); // do console shadow Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex(0, 0,0,0, 0.5f), IGraphics::CColorVertex(1, 0,0,0, 0.5f), IGraphics::CColorVertex(2, 0,0,0, 0.0f), IGraphics::CColorVertex(3, 0,0,0, 0.0f)}; Graphics()->SetColorVertex(Array, 4); IGraphics::CQuadItem QuadItem(0, ConsoleHeight, Screen.w, 10.0f); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); // do background Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CONSOLE_BG].m_Id); Graphics()->QuadsBegin(); Graphics()->SetColor(0.2f, 0.2f, 0.2f,0.9f); if(m_ConsoleType == CONSOLETYPE_REMOTE) Graphics()->SetColor(0.4f, 0.2f, 0.2f,0.9f); Graphics()->QuadsSetSubset(0,-ConsoleHeight*0.075f,Screen.w*0.075f*0.5f,0); QuadItem = IGraphics::CQuadItem(0, 0, Screen.w, ConsoleHeight); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); // do small bar shadow Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Array[0] = IGraphics::CColorVertex(0, 0,0,0, 0.0f); Array[1] = IGraphics::CColorVertex(1, 0,0,0, 0.0f); Array[2] = IGraphics::CColorVertex(2, 0,0,0, 0.25f); Array[3] = IGraphics::CColorVertex(3, 0,0,0, 0.25f); Graphics()->SetColorVertex(Array, 4); QuadItem = IGraphics::CQuadItem(0, ConsoleHeight-20, Screen.w, 10); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); // do the lower bar Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CONSOLE_BAR].m_Id); Graphics()->QuadsBegin(); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.9f); Graphics()->QuadsSetSubset(0,0.1f,Screen.w*0.015f,1-0.1f); QuadItem = IGraphics::CQuadItem(0,ConsoleHeight-10.0f,Screen.w,10.0f); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); ConsoleHeight -= 22.0f; CInstance *pConsole = CurrentConsole(); { float FontSize = 10.0f; float RowHeight = FontSize*1.25f; float x = 3; float y = ConsoleHeight - RowHeight - 5.0f; CRenderInfo Info; Info.m_pSelf = this; Info.m_WantedCompletion = pConsole->m_CompletionChosen; Info.m_EnumCount = 0; Info.m_Offset = pConsole->m_CompletionRenderOffset; Info.m_Width = Screen.w; Info.m_pCurrentCmd = pConsole->m_aCompletionBuffer; TextRender()->SetCursor(&Info.m_Cursor, x+Info.m_Offset, y+RowHeight+2.0f, FontSize, TEXTFLAG_RENDER); // render prompt CTextCursor Cursor; TextRender()->SetCursor(&Cursor, x, y, FontSize, TEXTFLAG_RENDER); const char *pPrompt = "> "; if(m_ConsoleType == CONSOLETYPE_REMOTE) { if(Client()->State() == IClient::STATE_ONLINE) { if(Client()->RconAuthed()) pPrompt = "rcon> "; else pPrompt = "ENTER PASSWORD> "; } else pPrompt = "NOT CONNECTED> "; } TextRender()->TextEx(&Cursor, pPrompt, -1); x = Cursor.m_X; //hide rcon password char aInputString[256]; str_copy(aInputString, pConsole->m_Input.GetString(), sizeof(aInputString)); if(m_ConsoleType == CONSOLETYPE_REMOTE && Client()->State() == IClient::STATE_ONLINE && !Client()->RconAuthed()) { for(int i = 0; i < pConsole->m_Input.GetLength(); ++i) aInputString[i] = '*'; } // render console input (wrap line) TextRender()->SetCursor(&Cursor, x, y, FontSize, 0); Cursor.m_LineWidth = Screen.w - 10.0f - x; TextRender()->TextEx(&Cursor, aInputString, pConsole->m_Input.GetCursorOffset()); TextRender()->TextEx(&Cursor, aInputString+pConsole->m_Input.GetCursorOffset(), -1); int Lines = Cursor.m_LineCount; y -= (Lines - 1) * FontSize; TextRender()->SetCursor(&Cursor, x, y, FontSize, TEXTFLAG_RENDER); Cursor.m_LineWidth = Screen.w - 10.0f - x; TextRender()->TextEx(&Cursor, aInputString, pConsole->m_Input.GetCursorOffset()); static float MarkerOffset = TextRender()->TextWidth(0, FontSize, "|", -1)/3; CTextCursor Marker = Cursor; Marker.m_X -= MarkerOffset; Marker.m_LineWidth = -1; TextRender()->TextEx(&Marker, "|", -1); TextRender()->TextEx(&Cursor, aInputString+pConsole->m_Input.GetCursorOffset(), -1); // render possible commands if(m_ConsoleType == CONSOLETYPE_LOCAL || Client()->RconAuthed()) { if(pConsole->m_Input.GetString()[0] != 0) { m_pConsole->PossibleCommands(pConsole->m_aCompletionBuffer, pConsole->m_CompletionFlagmask, m_ConsoleType != CGameConsole::CONSOLETYPE_LOCAL && Client()->RconAuthed() && Client()->UseTempRconCommands(), PossibleCommandsRenderCallback, &Info); pConsole->m_CompletionRenderOffset = Info.m_Offset; if(Info.m_EnumCount <= 0) { if(pConsole->m_IsCommand) { char aBuf[512]; str_format(aBuf, sizeof(aBuf), "Help: %s ", pConsole->m_aCommandHelp); TextRender()->TextEx(&Info.m_Cursor, aBuf, -1); TextRender()->TextColor(0.75f, 0.75f, 0.75f, 1); str_format(aBuf, sizeof(aBuf), "Syntax: %s %s", pConsole->m_aCommandName, pConsole->m_aCommandParams); TextRender()->TextEx(&Info.m_Cursor, aBuf, -1); } } } } TextRender()->TextColor(1,1,1,1); // render log (actual page, wrap lines) CInstance::CBacklogEntry *pEntry = pConsole->m_Backlog.Last(); float OffsetY = 0.0f; float LineOffset = 1.0f; for(int Page = 0; Page <= pConsole->m_BacklogActPage; ++Page, OffsetY = 0.0f) { while(pEntry) { // get y offset (calculate it if we haven't yet) if(pEntry->m_YOffset < 0.0f) { TextRender()->SetCursor(&Cursor, 0.0f, 0.0f, FontSize, 0); Cursor.m_LineWidth = Screen.w-10; TextRender()->TextEx(&Cursor, pEntry->m_aText, -1); pEntry->m_YOffset = Cursor.m_Y+Cursor.m_FontSize+LineOffset; } OffsetY += pEntry->m_YOffset; // next page when lines reach the top if(y-OffsetY <= RowHeight) break; // just render output from actual backlog page (render bottom up) if(Page == pConsole->m_BacklogActPage) { TextRender()->SetCursor(&Cursor, 0.0f, y-OffsetY, FontSize, TEXTFLAG_RENDER); Cursor.m_LineWidth = Screen.w-10.0f; TextRender()->TextEx(&Cursor, pEntry->m_aText, -1); } pEntry = pConsole->m_Backlog.Prev(pEntry); } // actual backlog page number is too high, render last available page (current checked one, render top down) if(!pEntry && Page < pConsole->m_BacklogActPage) { pConsole->m_BacklogActPage = Page; pEntry = pConsole->m_Backlog.First(); while(OffsetY > 0.0f && pEntry) { TextRender()->SetCursor(&Cursor, 0.0f, y-OffsetY, FontSize, TEXTFLAG_RENDER); Cursor.m_LineWidth = Screen.w-10.0f; TextRender()->TextEx(&Cursor, pEntry->m_aText, -1); OffsetY -= pEntry->m_YOffset; pEntry = pConsole->m_Backlog.Next(pEntry); } break; } } // render page char aBuf[128]; str_format(aBuf, sizeof(aBuf), Localize("-Page %d-"), pConsole->m_BacklogActPage+1); TextRender()->Text(0, 10.0f, 0.0f, FontSize, aBuf, -1); // render version str_format(aBuf, sizeof(aBuf), "v%s", GAME_VERSION); float Width = TextRender()->TextWidth(0, FontSize, aBuf, -1); TextRender()->Text(0, Screen.w-Width-10.0f, 0.0f, FontSize, aBuf, -1); } } void CGameConsole::OnMessage(int MsgType, void *pRawMsg) { } bool CGameConsole::OnInput(IInput::CEvent Event) { if(m_ConsoleState == CONSOLE_CLOSED) return false; if(Event.m_Key >= KEY_F1 && Event.m_Key <= KEY_F15) return false; if(Event.m_Key == KEY_ESCAPE && (Event.m_Flags&IInput::FLAG_PRESS)) Toggle(m_ConsoleType); else CurrentConsole()->OnInput(Event); return true; } void CGameConsole::Toggle(int Type) { if(m_ConsoleType != Type && (m_ConsoleState == CONSOLE_OPEN || m_ConsoleState == CONSOLE_OPENING)) { // don't toggle console, just switch what console to use } else { if (m_ConsoleState == CONSOLE_CLOSED || m_ConsoleState == CONSOLE_OPEN) { m_StateChangeEnd = TimeNow()+m_StateChangeDuration; } else { float Progress = m_StateChangeEnd-TimeNow(); float ReversedProgress = m_StateChangeDuration-Progress; m_StateChangeEnd = TimeNow()+ReversedProgress; } if (m_ConsoleState == CONSOLE_CLOSED || m_ConsoleState == CONSOLE_CLOSING) { Input()->MouseModeAbsolute(); m_pClient->m_pMenus->UseMouseButtons(false); m_ConsoleState = CONSOLE_OPENING; // reset controls m_pClient->m_pControls->OnReset(); } else { Input()->MouseModeRelative(); m_pClient->m_pMenus->UseMouseButtons(true); m_pClient->OnRelease(); m_ConsoleState = CONSOLE_CLOSING; } } m_ConsoleType = Type; } void CGameConsole::Dump(int Type) { CInstance *pConsole = Type == CONSOLETYPE_REMOTE ? &m_RemoteConsole : &m_LocalConsole; char aFilename[128]; char aDate[20]; str_timestamp(aDate, sizeof(aDate)); str_format(aFilename, sizeof(aFilename), "dumps/%s_dump_%s.txt", Type==CONSOLETYPE_REMOTE?"remote_console":"local_console", aDate); IOHANDLE io = Storage()->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); if(io) { for(CInstance::CBacklogEntry *pEntry = pConsole->m_Backlog.First(); pEntry; pEntry = pConsole->m_Backlog.Next(pEntry)) { io_write(io, pEntry->m_aText, str_length(pEntry->m_aText)); io_write_newline(io); } io_close(io); } } void CGameConsole::ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->Toggle(CONSOLETYPE_LOCAL); } void CGameConsole::ConToggleRemoteConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->Toggle(CONSOLETYPE_REMOTE); } void CGameConsole::ConClearLocalConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->m_LocalConsole.ClearBacklog(); } void CGameConsole::ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->m_RemoteConsole.ClearBacklog(); } void CGameConsole::ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->Dump(CONSOLETYPE_LOCAL); } void CGameConsole::ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData) { ((CGameConsole *)pUserData)->Dump(CONSOLETYPE_REMOTE); } void CGameConsole::ClientConsolePrintCallback(const char *pStr, void *pUserData) { ((CGameConsole *)pUserData)->m_LocalConsole.PrintLine(pStr); } void CGameConsole::ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments() == 1) { CGameConsole *pThis = static_cast(pUserData); pThis->Console()->SetPrintOutputLevel(pThis->m_PrintCBIndex, pResult->GetInteger(0)); } } void CGameConsole::PrintLine(int Type, const char *pLine) { if(Type == CONSOLETYPE_LOCAL) m_LocalConsole.PrintLine(pLine); else if(Type == CONSOLETYPE_REMOTE) m_RemoteConsole.PrintLine(pLine); } void CGameConsole::OnConsoleInit() { // init console instances m_LocalConsole.Init(this); m_RemoteConsole.Init(this); m_pConsole = Kernel()->RequestInterface(); // m_PrintCBIndex = Console()->RegisterPrintCallback(g_Config.m_ConsoleOutputLevel, ClientConsolePrintCallback, this); Console()->Register("toggle_local_console", "", CFGFLAG_CLIENT, ConToggleLocalConsole, this, "Toggle local console"); Console()->Register("toggle_remote_console", "", CFGFLAG_CLIENT, ConToggleRemoteConsole, this, "Toggle remote console"); Console()->Register("clear_local_console", "", CFGFLAG_CLIENT, ConClearLocalConsole, this, "Clear local console"); Console()->Register("clear_remote_console", "", CFGFLAG_CLIENT, ConClearRemoteConsole, this, "Clear remote console"); Console()->Register("dump_local_console", "", CFGFLAG_CLIENT, ConDumpLocalConsole, this, "Dump local console"); Console()->Register("dump_remote_console", "", CFGFLAG_CLIENT, ConDumpRemoteConsole, this, "Dump remote console"); Console()->Chain("console_output_level", ConchainConsoleOutputLevelUpdate, this); } void CGameConsole::OnStateChange(int NewState, int OldState) { if(NewState == IClient::STATE_OFFLINE) m_RemoteConsole.ClearHistory(); } teeworlds-0.6.2+dfsg/src/game/client/components/console.h0000644000175000017500000000570012140200333022412 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_CONSOLE_H #define GAME_CLIENT_COMPONENTS_CONSOLE_H #include #include #include class CGameConsole : public CComponent { class CInstance { public: struct CBacklogEntry { float m_YOffset; char m_aText[1]; }; TStaticRingBuffer m_Backlog; TStaticRingBuffer m_History; char *m_pHistoryEntry; CLineInput m_Input; int m_Type; int m_CompletionEnumerationCount; int m_BacklogActPage; public: CGameConsole *m_pGameConsole; char m_aCompletionBuffer[128]; int m_CompletionChosen; int m_CompletionFlagmask; float m_CompletionRenderOffset; bool m_IsCommand; char m_aCommandName[IConsole::TEMPCMD_NAME_LENGTH]; char m_aCommandHelp[IConsole::TEMPCMD_HELP_LENGTH]; char m_aCommandParams[IConsole::TEMPCMD_PARAMS_LENGTH]; CInstance(int t); void Init(CGameConsole *pGameConsole); void ClearBacklog(); void ClearHistory(); void ExecuteLine(const char *pLine); void OnInput(IInput::CEvent Event); void PrintLine(const char *pLine); const char *GetString() const { return m_Input.GetString(); } static void PossibleCommandsCompleteCallback(const char *pStr, void *pUser); }; class IConsole *m_pConsole; CInstance m_LocalConsole; CInstance m_RemoteConsole; CInstance *CurrentConsole(); float TimeNow(); int m_PrintCBIndex; int m_ConsoleType; int m_ConsoleState; float m_StateChangeEnd; float m_StateChangeDuration; void Toggle(int Type); void Dump(int Type); static void PossibleCommandsRenderCallback(const char *pStr, void *pUser); static void ClientConsolePrintCallback(const char *pStr, void *pUserData); static void ConToggleLocalConsole(IConsole::IResult *pResult, void *pUserData); static void ConToggleRemoteConsole(IConsole::IResult *pResult, void *pUserData); static void ConClearLocalConsole(IConsole::IResult *pResult, void *pUserData); static void ConClearRemoteConsole(IConsole::IResult *pResult, void *pUserData); static void ConDumpLocalConsole(IConsole::IResult *pResult, void *pUserData); static void ConDumpRemoteConsole(IConsole::IResult *pResult, void *pUserData); static void ConchainConsoleOutputLevelUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); public: enum { CONSOLETYPE_LOCAL=0, CONSOLETYPE_REMOTE, }; CGameConsole(); void PrintLine(int Type, const char *pLine); virtual void OnStateChange(int NewState, int OldState); virtual void OnConsoleInit(); virtual void OnReset(); virtual void OnRender(); virtual void OnMessage(int MsgType, void *pRawMsg); virtual bool OnInput(IInput::CEvent Events); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/controls.cpp0000644000175000017500000001725312140200333023154 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include "controls.h" CControls::CControls() { mem_zero(&m_LastData, sizeof(m_LastData)); } void CControls::OnReset() { m_LastData.m_Direction = 0; m_LastData.m_Hook = 0; // simulate releasing the fire button if((m_LastData.m_Fire&1) != 0) m_LastData.m_Fire++; m_LastData.m_Fire &= INPUT_STATE_MASK; m_LastData.m_Jump = 0; m_InputData = m_LastData; m_InputDirectionLeft = 0; m_InputDirectionRight = 0; } void CControls::OnRelease() { OnReset(); } void CControls::OnPlayerDeath() { m_LastData.m_WantedWeapon = m_InputData.m_WantedWeapon = 0; } static void ConKeyInputState(IConsole::IResult *pResult, void *pUserData) { ((int *)pUserData)[0] = pResult->GetInteger(0); } static void ConKeyInputCounter(IConsole::IResult *pResult, void *pUserData) { int *v = (int *)pUserData; if(((*v)&1) != pResult->GetInteger(0)) (*v)++; *v &= INPUT_STATE_MASK; } struct CInputSet { CControls *m_pControls; int *m_pVariable; int m_Value; }; static void ConKeyInputSet(IConsole::IResult *pResult, void *pUserData) { CInputSet *pSet = (CInputSet *)pUserData; if(pResult->GetInteger(0)) *pSet->m_pVariable = pSet->m_Value; } static void ConKeyInputNextPrevWeapon(IConsole::IResult *pResult, void *pUserData) { CInputSet *pSet = (CInputSet *)pUserData; ConKeyInputCounter(pResult, pSet->m_pVariable); pSet->m_pControls->m_InputData.m_WantedWeapon = 0; } void CControls::OnConsoleInit() { // game commands Console()->Register("+left", "", CFGFLAG_CLIENT, ConKeyInputState, &m_InputDirectionLeft, "Move left"); Console()->Register("+right", "", CFGFLAG_CLIENT, ConKeyInputState, &m_InputDirectionRight, "Move right"); Console()->Register("+jump", "", CFGFLAG_CLIENT, ConKeyInputState, &m_InputData.m_Jump, "Jump"); Console()->Register("+hook", "", CFGFLAG_CLIENT, ConKeyInputState, &m_InputData.m_Hook, "Hook"); Console()->Register("+fire", "", CFGFLAG_CLIENT, ConKeyInputCounter, &m_InputData.m_Fire, "Fire"); { static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 1}; Console()->Register("+weapon1", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to hammer"); } { static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 2}; Console()->Register("+weapon2", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to gun"); } { static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 3}; Console()->Register("+weapon3", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to shotgun"); } { static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 4}; Console()->Register("+weapon4", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to grenade"); } { static CInputSet s_Set = {this, &m_InputData.m_WantedWeapon, 5}; Console()->Register("+weapon5", "", CFGFLAG_CLIENT, ConKeyInputSet, (void *)&s_Set, "Switch to rifle"); } { static CInputSet s_Set = {this, &m_InputData.m_NextWeapon, 0}; Console()->Register("+nextweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to next weapon"); } { static CInputSet s_Set = {this, &m_InputData.m_PrevWeapon, 0}; Console()->Register("+prevweapon", "", CFGFLAG_CLIENT, ConKeyInputNextPrevWeapon, (void *)&s_Set, "Switch to previous weapon"); } } void CControls::OnMessage(int Msg, void *pRawMsg) { if(Msg == NETMSGTYPE_SV_WEAPONPICKUP) { CNetMsg_Sv_WeaponPickup *pMsg = (CNetMsg_Sv_WeaponPickup *)pRawMsg; if(g_Config.m_ClAutoswitchWeapons) m_InputData.m_WantedWeapon = pMsg->m_Weapon+1; } } int CControls::SnapInput(int *pData) { static int64 LastSendTime = 0; bool Send = false; // update player state if(m_pClient->m_pChat->IsActive()) m_InputData.m_PlayerFlags = PLAYERFLAG_CHATTING; else if(m_pClient->m_pMenus->IsActive()) m_InputData.m_PlayerFlags = PLAYERFLAG_IN_MENU; else m_InputData.m_PlayerFlags = PLAYERFLAG_PLAYING; if(m_pClient->m_pScoreboard->Active()) m_InputData.m_PlayerFlags |= PLAYERFLAG_SCOREBOARD; if(m_LastData.m_PlayerFlags != m_InputData.m_PlayerFlags) Send = true; m_LastData.m_PlayerFlags = m_InputData.m_PlayerFlags; // we freeze the input if chat or menu is activated if(!(m_InputData.m_PlayerFlags&PLAYERFLAG_PLAYING)) { OnReset(); mem_copy(pData, &m_InputData, sizeof(m_InputData)); // send once a second just to be sure if(time_get() > LastSendTime + time_freq()) Send = true; } else { m_InputData.m_TargetX = (int)m_MousePos.x; m_InputData.m_TargetY = (int)m_MousePos.y; if(!m_InputData.m_TargetX && !m_InputData.m_TargetY) { m_InputData.m_TargetX = 1; m_MousePos.x = 1; } // set direction m_InputData.m_Direction = 0; if(m_InputDirectionLeft && !m_InputDirectionRight) m_InputData.m_Direction = -1; if(!m_InputDirectionLeft && m_InputDirectionRight) m_InputData.m_Direction = 1; // stress testing if(g_Config.m_DbgStress) { float t = Client()->LocalTime(); mem_zero(&m_InputData, sizeof(m_InputData)); m_InputData.m_Direction = ((int)t/2)&1; m_InputData.m_Jump = ((int)t); m_InputData.m_Fire = ((int)(t*10)); m_InputData.m_Hook = ((int)(t*2))&1; m_InputData.m_WantedWeapon = ((int)t)%NUM_WEAPONS; m_InputData.m_TargetX = (int)(sinf(t*3)*100.0f); m_InputData.m_TargetY = (int)(cosf(t*3)*100.0f); } // check if we need to send input if(m_InputData.m_Direction != m_LastData.m_Direction) Send = true; else if(m_InputData.m_Jump != m_LastData.m_Jump) Send = true; else if(m_InputData.m_Fire != m_LastData.m_Fire) Send = true; else if(m_InputData.m_Hook != m_LastData.m_Hook) Send = true; else if(m_InputData.m_WantedWeapon != m_LastData.m_WantedWeapon) Send = true; else if(m_InputData.m_NextWeapon != m_LastData.m_NextWeapon) Send = true; else if(m_InputData.m_PrevWeapon != m_LastData.m_PrevWeapon) Send = true; // send at at least 10hz if(time_get() > LastSendTime + time_freq()/25) Send = true; } // copy and return size m_LastData = m_InputData; if(!Send) return 0; LastSendTime = time_get(); mem_copy(pData, &m_InputData, sizeof(m_InputData)); return sizeof(m_InputData); } void CControls::OnRender() { // update target pos if(m_pClient->m_Snap.m_pGameInfoObj && !m_pClient->m_Snap.m_SpecInfo.m_Active) m_TargetPos = m_pClient->m_LocalCharacterPos + m_MousePos; else if(m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_UsePosition) m_TargetPos = m_pClient->m_Snap.m_SpecInfo.m_Position + m_MousePos; else m_TargetPos = m_MousePos; } bool CControls::OnMouseMove(float x, float y) { if((m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) || (m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_pChat->IsActive())) return false; m_MousePos += vec2(x, y); // TODO: ugly ClampMousePos(); return true; } void CControls::ClampMousePos() { if(m_pClient->m_Snap.m_SpecInfo.m_Active && !m_pClient->m_Snap.m_SpecInfo.m_UsePosition) { m_MousePos.x = clamp(m_MousePos.x, 200.0f, Collision()->GetWidth()*32-200.0f); m_MousePos.y = clamp(m_MousePos.y, 200.0f, Collision()->GetHeight()*32-200.0f); } else { float CameraMaxDistance = 200.0f; float FollowFactor = g_Config.m_ClMouseFollowfactor/100.0f; float MouseMax = min(CameraMaxDistance/FollowFactor + g_Config.m_ClMouseDeadzone, (float)g_Config.m_ClMouseMaxDistance); if(length(m_MousePos) > MouseMax) m_MousePos = normalize(m_MousePos)*MouseMax; } } teeworlds-0.6.2+dfsg/src/game/client/components/controls.h0000644000175000017500000000153212140200333022612 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_CONTROLS_H #define GAME_CLIENT_COMPONENTS_CONTROLS_H #include #include class CControls : public CComponent { public: vec2 m_MousePos; vec2 m_TargetPos; CNetObj_PlayerInput m_InputData; CNetObj_PlayerInput m_LastData; int m_InputDirectionLeft; int m_InputDirectionRight; CControls(); virtual void OnReset(); virtual void OnRelease(); virtual void OnRender(); virtual void OnMessage(int MsgType, void *pRawMsg); virtual bool OnMouseMove(float x, float y); virtual void OnConsoleInit(); virtual void OnPlayerDeath(); int SnapInput(int *pData); void ClampMousePos(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/countryflags.cpp0000644000175000017500000001160212140200333024021 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include "countryflags.h" void CCountryFlags::LoadCountryflagsIndexfile() { IOHANDLE File = Storage()->OpenFile("countryflags/index.txt", IOFLAG_READ, IStorage::TYPE_ALL); if(!File) { Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", "couldn't open index file"); return; } char aOrigin[128]; CLineReader LineReader; LineReader.Init(File); char *pLine; while((pLine = LineReader.Get())) { if(!str_length(pLine) || pLine[0] == '#') // skip empty lines and comments continue; str_copy(aOrigin, pLine, sizeof(aOrigin)); char *pReplacement = LineReader.Get(); if(!pReplacement) { Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", "unexpected end of index file"); break; } if(pReplacement[0] != '=' || pReplacement[1] != '=' || pReplacement[2] != ' ') { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "malform replacement for index '%s'", aOrigin); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf); continue; } int CountryCode = str_toint(pReplacement+3); if(CountryCode < CODE_LB || CountryCode > CODE_UB) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "country code '%i' not within valid code range [%i..%i]", CountryCode, CODE_LB, CODE_UB); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf); continue; } // load the graphic file char aBuf[128]; CImageInfo Info; if(g_Config.m_ClLoadCountryFlags) { str_format(aBuf, sizeof(aBuf), "countryflags/%s.png", aOrigin); if(!Graphics()->LoadPNG(&Info, aBuf, IStorage::TYPE_ALL)) { char aMsg[128]; str_format(aMsg, sizeof(aMsg), "failed to load '%s'", aBuf); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aMsg); continue; } } // add entry CCountryFlag CountryFlag; CountryFlag.m_CountryCode = CountryCode; str_copy(CountryFlag.m_aCountryCodeString, aOrigin, sizeof(CountryFlag.m_aCountryCodeString)); if(g_Config.m_ClLoadCountryFlags) { CountryFlag.m_Texture = Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); mem_free(Info.m_pData); } else CountryFlag.m_Texture = -1; if(g_Config.m_Debug) { str_format(aBuf, sizeof(aBuf), "loaded country flag '%s'", aOrigin); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "countryflags", aBuf); } m_aCountryFlags.add_unsorted(CountryFlag); } io_close(File); m_aCountryFlags.sort_range(); // find index of default item int DefaultIndex = 0, Index = 0; for(sorted_array::range r = m_aCountryFlags.all(); !r.empty(); r.pop_front(), ++Index) if(r.front().m_CountryCode == -1) { DefaultIndex = Index; break; } // init LUT if(DefaultIndex != 0) for(int i = 0; i < CODE_RANGE; ++i) m_CodeIndexLUT[i] = DefaultIndex; else mem_zero(m_CodeIndexLUT, sizeof(m_CodeIndexLUT)); for(int i = 0; i < m_aCountryFlags.size(); ++i) m_CodeIndexLUT[max(0, (m_aCountryFlags[i].m_CountryCode-CODE_LB)%CODE_RANGE)] = i; } void CCountryFlags::OnInit() { // load country flags m_aCountryFlags.clear(); LoadCountryflagsIndexfile(); if(!m_aCountryFlags.size()) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "countryflags", "failed to load country flags. folder='countryflags/'"); CCountryFlag DummyEntry; DummyEntry.m_CountryCode = -1; DummyEntry.m_Texture = -1; mem_zero(DummyEntry.m_aCountryCodeString, sizeof(DummyEntry.m_aCountryCodeString)); m_aCountryFlags.add(DummyEntry); } } int CCountryFlags::Num() const { return m_aCountryFlags.size(); } const CCountryFlags::CCountryFlag *CCountryFlags::GetByCountryCode(int CountryCode) const { return GetByIndex(m_CodeIndexLUT[max(0, (CountryCode-CODE_LB)%CODE_RANGE)]); } const CCountryFlags::CCountryFlag *CCountryFlags::GetByIndex(int Index) const { return &m_aCountryFlags[max(0, Index%m_aCountryFlags.size())]; } void CCountryFlags::Render(int CountryCode, const vec4 *pColor, float x, float y, float w, float h) { const CCountryFlag *pFlag = GetByCountryCode(CountryCode); if(pFlag->m_Texture != -1) { Graphics()->TextureSet(pFlag->m_Texture); Graphics()->QuadsBegin(); Graphics()->SetColor(pColor->r, pColor->g, pColor->b, pColor->a); IGraphics::CQuadItem QuadItem(x, y, w, h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } else { CTextCursor Cursor; TextRender()->SetCursor(&Cursor, x, y, 10.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = w; TextRender()->TextEx(&Cursor, pFlag->m_aCountryCodeString, -1); } } teeworlds-0.6.2+dfsg/src/game/client/components/countryflags.h0000644000175000017500000000210112140200333023460 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_COUNTRYFLAGS_H #define GAME_CLIENT_COMPONENTS_COUNTRYFLAGS_H #include #include #include class CCountryFlags : public CComponent { public: struct CCountryFlag { int m_CountryCode; char m_aCountryCodeString[8]; int m_Texture; bool operator<(const CCountryFlag &Other) { return str_comp(m_aCountryCodeString, Other.m_aCountryCodeString) < 0; } }; void OnInit(); int Num() const; const CCountryFlag *GetByCountryCode(int CountryCode) const; const CCountryFlag *GetByIndex(int Index) const; void Render(int CountryCode, const vec4 *pColor, float x, float y, float w, float h); private: enum { CODE_LB=-1, CODE_UB=999, CODE_RANGE=CODE_UB-CODE_LB+1, }; sorted_array m_aCountryFlags; int m_CodeIndexLUT[CODE_RANGE]; void LoadCountryflagsIndexfile(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/damageind.cpp0000644000175000017500000000437312140200333023221 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include // get_angle #include #include #include "damageind.h" CDamageInd::CDamageInd() { m_Lastupdate = 0; m_NumItems = 0; } CDamageInd::CItem *CDamageInd::CreateI() { if (m_NumItems < MAX_ITEMS) { CItem *p = &m_aItems[m_NumItems]; m_NumItems++; return p; } return 0; } void CDamageInd::DestroyI(CDamageInd::CItem *i) { m_NumItems--; *i = m_aItems[m_NumItems]; } void CDamageInd::Create(vec2 Pos, vec2 Dir) { CItem *i = CreateI(); if (i) { i->m_Pos = Pos; i->m_StartTime = Client()->LocalTime(); i->m_Dir = Dir*-1; i->m_StartAngle = (( (float)rand()/(float)RAND_MAX) - 1.0f) * 2.0f * pi; } } void CDamageInd::OnRender() { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); static float s_LastLocalTime = Client()->LocalTime(); for(int i = 0; i < m_NumItems;) { if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(pInfo->m_Paused) m_aItems[i].m_StartTime += Client()->LocalTime()-s_LastLocalTime; else m_aItems[i].m_StartTime += (Client()->LocalTime()-s_LastLocalTime)*(1.0f-pInfo->m_Speed); } else { if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) m_aItems[i].m_StartTime += Client()->LocalTime()-s_LastLocalTime; } float Life = 0.75f - (Client()->LocalTime() - m_aItems[i].m_StartTime); if(Life < 0.0f) DestroyI(&m_aItems[i]); else { vec2 Pos = mix(m_aItems[i].m_Pos+m_aItems[i].m_Dir*75.0f, m_aItems[i].m_Pos, clamp((Life-0.60f)/0.15f, 0.0f, 1.0f)); Graphics()->SetColor(1.0f,1.0f,1.0f, Life/0.1f); Graphics()->QuadsSetRotation(m_aItems[i].m_StartAngle + Life * 2.0f); RenderTools()->SelectSprite(SPRITE_STAR1); RenderTools()->DrawSprite(Pos.x, Pos.y, 48.0f); i++; } } s_LastLocalTime = Client()->LocalTime(); Graphics()->QuadsEnd(); } teeworlds-0.6.2+dfsg/src/game/client/components/damageind.h0000644000175000017500000000130312140200333022654 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_DAMAGEIND_H #define GAME_CLIENT_COMPONENTS_DAMAGEIND_H #include #include class CDamageInd : public CComponent { int64 m_Lastupdate; struct CItem { vec2 m_Pos; vec2 m_Dir; float m_StartTime; float m_StartAngle; }; enum { MAX_ITEMS=64, }; CItem m_aItems[MAX_ITEMS]; int m_NumItems; CItem *CreateI(); void DestroyI(CItem *i); public: CDamageInd(); void Create(vec2 Pos, vec2 Dir); virtual void OnRender(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/debughud.cpp0000644000175000017500000001132512140200333023072 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include //#include "controls.h" //#include "camera.h" #include "debughud.h" void CDebugHud::RenderNetCorrections() { if(!g_Config.m_Debug || g_Config.m_DbgGraphs || !m_pClient->m_Snap.m_pLocalCharacter || !m_pClient->m_Snap.m_pLocalPrevCharacter) return; float Width = 300*Graphics()->ScreenAspect(); Graphics()->MapScreen(0, 0, Width, 300); /*float speed = distance(vec2(netobjects.local_prev_character->x, netobjects.local_prev_character->y), vec2(netobjects.local_character->x, netobjects.local_character->y));*/ float Velspeed = length(vec2(m_pClient->m_Snap.m_pLocalCharacter->m_VelX/256.0f, m_pClient->m_Snap.m_pLocalCharacter->m_VelY/256.0f))*50; float Ramp = VelocityRamp(Velspeed, m_pClient->m_Tuning.m_VelrampStart, m_pClient->m_Tuning.m_VelrampRange, m_pClient->m_Tuning.m_VelrampCurvature); const char *paStrings[] = {"velspeed:", "velspeed*ramp:", "ramp:", "Pos", " x:", " y:", "netobj corrections", " num:", " on:"}; const int Num = sizeof(paStrings)/sizeof(char *); const float LineHeight = 6.0f; const float Fontsize = 5.0f; float x = Width-100.0f, y = 50.0f; for(int i = 0; i < Num; ++i) TextRender()->Text(0, x, y+i*LineHeight, Fontsize, paStrings[i], -1); x = Width-10.0f; char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%.0f", Velspeed/32); float w = TextRender()->TextWidth(0, Fontsize, aBuf, -1); TextRender()->Text(0, x-w, y, Fontsize, aBuf, -1); y += LineHeight; str_format(aBuf, sizeof(aBuf), "%.0f", Velspeed/32*Ramp); w = TextRender()->TextWidth(0, Fontsize, aBuf, -1); TextRender()->Text(0, x-w, y, Fontsize, aBuf, -1); y += LineHeight; str_format(aBuf, sizeof(aBuf), "%.2f", Ramp); w = TextRender()->TextWidth(0, Fontsize, aBuf, -1); TextRender()->Text(0, x-w, y, Fontsize, aBuf, -1); y += 2*LineHeight; str_format(aBuf, sizeof(aBuf), "%d", m_pClient->m_Snap.m_pLocalCharacter->m_X/32); w = TextRender()->TextWidth(0, Fontsize, aBuf, -1); TextRender()->Text(0, x-w, y, Fontsize, aBuf, -1); y += LineHeight; str_format(aBuf, sizeof(aBuf), "%d", m_pClient->m_Snap.m_pLocalCharacter->m_Y/32); w = TextRender()->TextWidth(0, Fontsize, aBuf, -1); TextRender()->Text(0, x-w, y, Fontsize, aBuf, -1); y += 2*LineHeight; str_format(aBuf, sizeof(aBuf), "%d", m_pClient->NetobjNumCorrections()); w = TextRender()->TextWidth(0, Fontsize, aBuf, -1); TextRender()->Text(0, x-w, y, Fontsize, aBuf, -1); y += LineHeight; w = TextRender()->TextWidth(0, Fontsize, m_pClient->NetobjCorrectedOn(), -1); TextRender()->Text(0, x-w, y, Fontsize, m_pClient->NetobjCorrectedOn(), -1); } void CDebugHud::RenderTuning() { // render tuning debugging if(!g_Config.m_DbgTuning) return; CTuningParams StandardTuning; Graphics()->MapScreen(0, 0, 300*Graphics()->ScreenAspect(), 300); float y = 50.0f; int Count = 0; for(int i = 0; i < m_pClient->m_Tuning.Num(); i++) { char aBuf[128]; float Current, Standard; m_pClient->m_Tuning.Get(i, &Current); StandardTuning.Get(i, &Standard); if(Standard == Current) TextRender()->TextColor(1,1,1,1.0f); else TextRender()->TextColor(1,0.25f,0.25f,1.0f); float w; float x = 5.0f; str_format(aBuf, sizeof(aBuf), "%.2f", Standard); x += 20.0f; w = TextRender()->TextWidth(0, 5, aBuf, -1); TextRender()->Text(0x0, x-w, y+Count*6, 5, aBuf, -1); str_format(aBuf, sizeof(aBuf), "%.2f", Current); x += 20.0f; w = TextRender()->TextWidth(0, 5, aBuf, -1); TextRender()->Text(0x0, x-w, y+Count*6, 5, aBuf, -1); x += 5.0f; TextRender()->Text(0x0, x, y+Count*6, 5, m_pClient->m_Tuning.m_apNames[i], -1); Count++; } y = y+Count*6; Graphics()->TextureSet(-1); Graphics()->BlendNormal(); Graphics()->LinesBegin(); float Height = 50.0f; float pv = 1; IGraphics::CLineItem Array[100]; for(int i = 0; i < 100; i++) { float Speed = i/100.0f * 3000; float Ramp = VelocityRamp(Speed, m_pClient->m_Tuning.m_VelrampStart, m_pClient->m_Tuning.m_VelrampRange, m_pClient->m_Tuning.m_VelrampCurvature); float RampedSpeed = (Speed * Ramp)/1000.0f; Array[i] = IGraphics::CLineItem((i-1)*2, y+Height-pv*Height, i*2, y+Height-RampedSpeed*Height); //Graphics()->LinesDraw((i-1)*2, 200, i*2, 200); pv = RampedSpeed; } Graphics()->LinesDraw(Array, 100); Graphics()->LinesEnd(); TextRender()->TextColor(1,1,1,1); } void CDebugHud::OnRender() { RenderTuning(); RenderNetCorrections(); } teeworlds-0.6.2+dfsg/src/game/client/components/debughud.h0000644000175000017500000000067712140200333022547 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_DEBUGHUD_H #define GAME_CLIENT_COMPONENTS_DEBUGHUD_H #include class CDebugHud : public CComponent { void RenderNetCorrections(); void RenderTuning(); public: virtual void OnRender(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/effects.cpp0000644000175000017500000001565612140200333022735 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include "effects.h" inline vec2 RandomDir() { return normalize(vec2(frandom()-0.5f, frandom()-0.5f)); } CEffects::CEffects() { m_Add50hz = false; m_Add100hz = false; } void CEffects::AirJump(vec2 Pos) { CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_AIRJUMP; p.m_Pos = Pos + vec2(-6.0f, 16.0f); p.m_Vel = vec2(0, -200); p.m_LifeSpan = 0.5f; p.m_StartSize = 48.0f; p.m_EndSize = 0; p.m_Rot = frandom()*pi*2; p.m_Rotspeed = pi*2; p.m_Gravity = 500; p.m_Friction = 0.7f; p.m_FlowAffected = 0.0f; m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p); p.m_Pos = Pos + vec2(6.0f, 16.0f); m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p); m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_AIRJUMP, 1.0f, Pos); } void CEffects::DamageIndicator(vec2 Pos, vec2 Dir) { m_pClient->m_pDamageind->Create(Pos, Dir); } void CEffects::PowerupShine(vec2 Pos, vec2 size) { if(!m_Add50hz) return; CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_SLICE; p.m_Pos = Pos + vec2((frandom()-0.5f)*size.x, (frandom()-0.5f)*size.y); p.m_Vel = vec2(0, 0); p.m_LifeSpan = 0.5f; p.m_StartSize = 16.0f; p.m_EndSize = 0; p.m_Rot = frandom()*pi*2; p.m_Rotspeed = pi*2; p.m_Gravity = 500; p.m_Friction = 0.9f; p.m_FlowAffected = 0.0f; m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p); } void CEffects::SmokeTrail(vec2 Pos, vec2 Vel) { if(!m_Add50hz) return; CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_SMOKE; p.m_Pos = Pos; p.m_Vel = Vel + RandomDir()*50.0f; p.m_LifeSpan = 0.5f + frandom()*0.5f; p.m_StartSize = 12.0f + frandom()*8; p.m_EndSize = 0; p.m_Friction = 0.7f; p.m_Gravity = frandom()*-500.0f; m_pClient->m_pParticles->Add(CParticles::GROUP_PROJECTILE_TRAIL, &p); } void CEffects::SkidTrail(vec2 Pos, vec2 Vel) { if(!m_Add100hz) return; CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_SMOKE; p.m_Pos = Pos; p.m_Vel = Vel + RandomDir()*50.0f; p.m_LifeSpan = 0.5f + frandom()*0.5f; p.m_StartSize = 24.0f + frandom()*12; p.m_EndSize = 0; p.m_Friction = 0.7f; p.m_Gravity = frandom()*-500.0f; p.m_Color = vec4(0.75f,0.75f,0.75f,1.0f); m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p); } void CEffects::BulletTrail(vec2 Pos) { if(!m_Add100hz) return; CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_BALL; p.m_Pos = Pos; p.m_LifeSpan = 0.25f + frandom()*0.25f; p.m_StartSize = 8.0f; p.m_EndSize = 0; p.m_Friction = 0.7f; m_pClient->m_pParticles->Add(CParticles::GROUP_PROJECTILE_TRAIL, &p); } void CEffects::PlayerSpawn(vec2 Pos) { for(int i = 0; i < 32; i++) { CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_SHELL; p.m_Pos = Pos; p.m_Vel = RandomDir() * (powf(frandom(), 3)*600.0f); p.m_LifeSpan = 0.3f + frandom()*0.3f; p.m_StartSize = 64.0f + frandom()*32; p.m_EndSize = 0; p.m_Rot = frandom()*pi*2; p.m_Rotspeed = frandom(); p.m_Gravity = frandom()*-400.0f; p.m_Friction = 0.7f; p.m_Color = vec4(0xb5/255.0f, 0x50/255.0f, 0xcb/255.0f, 1.0f); m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p); } m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_SPAWN, 1.0f, Pos); } void CEffects::PlayerDeath(vec2 Pos, int ClientID) { vec3 BloodColor(1.0f,1.0f,1.0f); if(ClientID >= 0) { if(m_pClient->m_aClients[ClientID].m_UseCustomColor) BloodColor = m_pClient->m_pSkins->GetColorV3(m_pClient->m_aClients[ClientID].m_ColorBody); else { const CSkins::CSkin *s = m_pClient->m_pSkins->Get(m_pClient->m_aClients[ClientID].m_SkinID); if(s) BloodColor = s->m_BloodColor; } } for(int i = 0; i < 64; i++) { CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_SPLAT01 + (rand()%3); p.m_Pos = Pos; p.m_Vel = RandomDir() * ((frandom()+0.1f)*900.0f); p.m_LifeSpan = 0.3f + frandom()*0.3f; p.m_StartSize = 24.0f + frandom()*16; p.m_EndSize = 0; p.m_Rot = frandom()*pi*2; p.m_Rotspeed = (frandom()-0.5f) * pi; p.m_Gravity = 800.0f; p.m_Friction = 0.8f; vec3 c = BloodColor * (0.75f + frandom()*0.25f); p.m_Color = vec4(c.r, c.g, c.b, 0.75f); m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p); } } void CEffects::Explosion(vec2 Pos) { // add to flow for(int y = -8; y <= 8; y++) for(int x = -8; x <= 8; x++) { if(x == 0 && y == 0) continue; float a = 1 - (length(vec2(x,y)) / length(vec2(8,8))); m_pClient->m_pFlow->Add(Pos+vec2(x,y)*16, normalize(vec2(x,y))*5000.0f*a, 10.0f); } // add the explosion CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_EXPL01; p.m_Pos = Pos; p.m_LifeSpan = 0.4f; p.m_StartSize = 150.0f; p.m_EndSize = 0; p.m_Rot = frandom()*pi*2; m_pClient->m_pParticles->Add(CParticles::GROUP_EXPLOSIONS, &p); // add the smoke for(int i = 0; i < 24; i++) { CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_SMOKE; p.m_Pos = Pos; p.m_Vel = RandomDir() * ((1.0f + frandom()*0.2f) * 1000.0f); p.m_LifeSpan = 0.5f + frandom()*0.4f; p.m_StartSize = 32.0f + frandom()*8; p.m_EndSize = 0; p.m_Gravity = frandom()*-800.0f; p.m_Friction = 0.4f; p.m_Color = mix(vec4(0.75f,0.75f,0.75f,1.0f), vec4(0.5f,0.5f,0.5f,1.0f), frandom()); m_pClient->m_pParticles->Add(CParticles::GROUP_GENERAL, &p); } } void CEffects::HammerHit(vec2 Pos) { // add the explosion CParticle p; p.SetDefault(); p.m_Spr = SPRITE_PART_HIT01; p.m_Pos = Pos; p.m_LifeSpan = 0.3f; p.m_StartSize = 120.0f; p.m_EndSize = 0; p.m_Rot = frandom()*pi*2; m_pClient->m_pParticles->Add(CParticles::GROUP_EXPLOSIONS, &p); m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_HAMMER_HIT, 1.0f, Pos); } void CEffects::OnRender() { static int64 LastUpdate100hz = 0; static int64 LastUpdate50hz = 0; if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(time_get()-LastUpdate100hz > time_freq()/(100*pInfo->m_Speed)) { m_Add100hz = true; LastUpdate100hz = time_get(); } else m_Add100hz = false; if(time_get()-LastUpdate50hz > time_freq()/(100*pInfo->m_Speed)) { m_Add50hz = true; LastUpdate50hz = time_get(); } else m_Add50hz = false; if(m_Add50hz) m_pClient->m_pFlow->Update(); return; } if(time_get()-LastUpdate100hz > time_freq()/100) { m_Add100hz = true; LastUpdate100hz = time_get(); } else m_Add100hz = false; if(time_get()-LastUpdate50hz > time_freq()/100) { m_Add50hz = true; LastUpdate50hz = time_get(); } else m_Add50hz = false; if(m_Add50hz) m_pClient->m_pFlow->Update(); } teeworlds-0.6.2+dfsg/src/game/client/components/effects.h0000644000175000017500000000143512140200333022370 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_EFFECTS_H #define GAME_CLIENT_COMPONENTS_EFFECTS_H #include class CEffects : public CComponent { bool m_Add50hz; bool m_Add100hz; public: CEffects(); virtual void OnRender(); void BulletTrail(vec2 Pos); void SmokeTrail(vec2 Pos, vec2 Vel); void SkidTrail(vec2 Pos, vec2 Vel); void Explosion(vec2 Pos); void HammerHit(vec2 Pos); void AirJump(vec2 Pos); void DamageIndicator(vec2 Pos, vec2 Dir); void PlayerSpawn(vec2 Pos); void PlayerDeath(vec2 Pos, int ClientID); void PowerupShine(vec2 Pos, vec2 Size); void Update(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/emoticon.cpp0000644000175000017500000001006312140200333023116 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include // get_angle #include #include #include "emoticon.h" CEmoticon::CEmoticon() { OnReset(); } void CEmoticon::ConKeyEmoticon(IConsole::IResult *pResult, void *pUserData) { CEmoticon *pSelf = (CEmoticon *)pUserData; if(!pSelf->m_pClient->m_Snap.m_SpecInfo.m_Active && pSelf->Client()->State() != IClient::STATE_DEMOPLAYBACK) pSelf->m_Active = pResult->GetInteger(0) != 0; } void CEmoticon::ConEmote(IConsole::IResult *pResult, void *pUserData) { ((CEmoticon *)pUserData)->Emote(pResult->GetInteger(0)); } void CEmoticon::OnConsoleInit() { Console()->Register("+emote", "", CFGFLAG_CLIENT, ConKeyEmoticon, this, "Open emote selector"); Console()->Register("emote", "i", CFGFLAG_CLIENT, ConEmote, this, "Use emote"); } void CEmoticon::OnReset() { m_WasActive = false; m_Active = false; m_SelectedEmote = -1; } void CEmoticon::OnRelease() { m_Active = false; } void CEmoticon::OnMessage(int MsgType, void *pRawMsg) { } bool CEmoticon::OnMouseMove(float x, float y) { if(!m_Active) return false; UI()->ConvertMouseMove(&x, &y); m_SelectorMouse += vec2(x,y); return true; } void CEmoticon::DrawCircle(float x, float y, float r, int Segments) { IGraphics::CFreeformItem Array[32]; int NumItems = 0; float FSegments = (float)Segments; for(int i = 0; i < Segments; i+=2) { float a1 = i/FSegments * 2*pi; float a2 = (i+1)/FSegments * 2*pi; float a3 = (i+2)/FSegments * 2*pi; float Ca1 = cosf(a1); float Ca2 = cosf(a2); float Ca3 = cosf(a3); float Sa1 = sinf(a1); float Sa2 = sinf(a2); float Sa3 = sinf(a3); Array[NumItems++] = IGraphics::CFreeformItem( x, y, x+Ca1*r, y+Sa1*r, x+Ca3*r, y+Sa3*r, x+Ca2*r, y+Sa2*r); if(NumItems == 32) { m_pClient->Graphics()->QuadsDrawFreeform(Array, 32); NumItems = 0; } } if(NumItems) m_pClient->Graphics()->QuadsDrawFreeform(Array, NumItems); } void CEmoticon::OnRender() { if(!m_Active) { if(m_WasActive && m_SelectedEmote != -1) Emote(m_SelectedEmote); m_WasActive = false; return; } if(m_pClient->m_Snap.m_SpecInfo.m_Active) { m_Active = false; m_WasActive = false; return; } m_WasActive = true; if (length(m_SelectorMouse) > 170.0f) m_SelectorMouse = normalize(m_SelectorMouse) * 170.0f; float SelectedAngle = GetAngle(m_SelectorMouse) + 2*pi/24; if (SelectedAngle < 0) SelectedAngle += 2*pi; if (length(m_SelectorMouse) > 110.0f) m_SelectedEmote = (int)(SelectedAngle / (2*pi) * NUM_EMOTICONS); CUIRect Screen = *UI()->Screen(); Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.3f); DrawCircle(Screen.w/2, Screen.h/2, 190.0f, 64); Graphics()->QuadsEnd(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_EMOTICONS].m_Id); Graphics()->QuadsBegin(); for (int i = 0; i < NUM_EMOTICONS; i++) { float Angle = 2*pi*i/NUM_EMOTICONS; if (Angle > pi) Angle -= 2*pi; bool Selected = m_SelectedEmote == i; float Size = Selected ? 80.0f : 50.0f; float NudgeX = 150.0f * cosf(Angle); float NudgeY = 150.0f * sinf(Angle); RenderTools()->SelectSprite(SPRITE_OOP + i); IGraphics::CQuadItem QuadItem(Screen.w/2 + NudgeX, Screen.h/2 + NudgeY, Size, Size); Graphics()->QuadsDraw(&QuadItem, 1); } Graphics()->QuadsEnd(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id); Graphics()->QuadsBegin(); Graphics()->SetColor(1,1,1,1); IGraphics::CQuadItem QuadItem(m_SelectorMouse.x+Screen.w/2,m_SelectorMouse.y+Screen.h/2,24,24); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } void CEmoticon::Emote(int Emoticon) { CNetMsg_Cl_Emoticon Msg; Msg.m_Emoticon = Emoticon; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } teeworlds-0.6.2+dfsg/src/game/client/components/emoticon.h0000644000175000017500000000164012140200333022564 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_EMOTICON_H #define GAME_CLIENT_COMPONENTS_EMOTICON_H #include #include class CEmoticon : public CComponent { void DrawCircle(float x, float y, float r, int Segments); bool m_WasActive; bool m_Active; vec2 m_SelectorMouse; int m_SelectedEmote; static void ConKeyEmoticon(IConsole::IResult *pResult, void *pUserData); static void ConEmote(IConsole::IResult *pResult, void *pUserData); public: CEmoticon(); virtual void OnReset(); virtual void OnConsoleInit(); virtual void OnRender(); virtual void OnRelease(); virtual void OnMessage(int MsgType, void *pRawMsg); virtual bool OnMouseMove(float x, float y); void Emote(int Emoticon); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/flow.cpp0000644000175000017500000000402112140200333022245 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "flow.h" CFlow::CFlow() { m_pCells = 0; m_Height = 0; m_Width = 0; m_Spacing = 16; } void CFlow::DbgRender() { if(!m_pCells) return; IGraphics::CLineItem Array[1024]; int NumItems = 0; Graphics()->TextureSet(-1); Graphics()->LinesBegin(); for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) { vec2 Pos(x*m_Spacing, y*m_Spacing); vec2 Vel = m_pCells[y*m_Width+x].m_Vel * 0.01f; Array[NumItems++] = IGraphics::CLineItem(Pos.x, Pos.y, Pos.x+Vel.x, Pos.y+Vel.y); if(NumItems == 1024) { Graphics()->LinesDraw(Array, 1024); NumItems = 0; } } if(NumItems) Graphics()->LinesDraw(Array, NumItems); Graphics()->LinesEnd(); } void CFlow::Init() { if(m_pCells) { mem_free(m_pCells); m_pCells = 0; } CMapItemLayerTilemap *pTilemap = Layers()->GameLayer(); m_Width = pTilemap->m_Width*32/m_Spacing; m_Height = pTilemap->m_Height*32/m_Spacing; // allocate and clear m_pCells = (CCell *)mem_alloc(sizeof(CCell)*m_Width*m_Height, 1); for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pCells[y*m_Width+x].m_Vel = vec2(0.0f, 0.0f); } void CFlow::Update() { if(!m_pCells) return; for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pCells[y*m_Width+x].m_Vel *= 0.85f; } vec2 CFlow::Get(vec2 Pos) { if(!m_pCells) return vec2(0,0); int x = (int)(Pos.x / m_Spacing); int y = (int)(Pos.y / m_Spacing); if(x < 0 || y < 0 || x >= m_Width || y >= m_Height) return vec2(0,0); return m_pCells[y*m_Width+x].m_Vel; } void CFlow::Add(vec2 Pos, vec2 Vel, float Size) { if(!m_pCells) return; int x = (int)(Pos.x / m_Spacing); int y = (int)(Pos.y / m_Spacing); if(x < 0 || y < 0 || x >= m_Width || y >= m_Height) return; m_pCells[y*m_Width+x].m_Vel += Vel; } teeworlds-0.6.2+dfsg/src/game/client/components/flow.h0000644000175000017500000000113512140200333021715 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_FLOW_H #define GAME_CLIENT_COMPONENTS_FLOW_H #include #include class CFlow : public CComponent { struct CCell { vec2 m_Vel; }; CCell *m_pCells; int m_Height; int m_Width; int m_Spacing; void DbgRender(); void Init(); public: CFlow(); vec2 Get(vec2 Pos); void Add(vec2 Pos, vec2 Vel, float Size); void Update(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/hud.cpp0000644000175000017500000004055312140200333022070 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include "controls.h" #include "camera.h" #include "hud.h" #include "voting.h" #include "binds.h" CHud::CHud() { // won't work if zero m_AverageFPS = 1.0f; } void CHud::OnReset() { } void CHud::RenderGameTimer() { float Half = 300.0f*Graphics()->ScreenAspect()/2.0f; if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_SUDDENDEATH)) { char Buf[32]; int Time = 0; if(m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit && !m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer) { Time = m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit*60 - ((Client()->GameTick()-m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick)/Client()->GameTickSpeed()); if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER) Time = 0; } else Time = (Client()->GameTick()-m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick)/Client()->GameTickSpeed(); str_format(Buf, sizeof(Buf), "%d:%02d", Time/60, Time%60); float FontSize = 10.0f; float w = TextRender()->TextWidth(0, FontSize, Buf, -1); // last 60 sec red, last 10 sec blink if(m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit && Time <= 60 && !m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer) { float Alpha = Time <= 10 && (2*time_get()/time_freq()) % 2 ? 0.5f : 1.0f; TextRender()->TextColor(1.0f, 0.25f, 0.25f, Alpha); } TextRender()->Text(0, Half-w/2, 2, FontSize, Buf, -1); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); } } void CHud::RenderPauseNotification() { if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) { const char *pText = Localize("Game paused"); float FontSize = 20.0f; float w = TextRender()->TextWidth(0, FontSize,pText, -1); TextRender()->Text(0, 150.0f*Graphics()->ScreenAspect()+-w/2.0f, 50.0f, FontSize, pText, -1); } } void CHud::RenderSuddenDeath() { if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_SUDDENDEATH) { float Half = 300.0f*Graphics()->ScreenAspect()/2.0f; const char *pText = Localize("Sudden Death"); float FontSize = 12.0f; float w = TextRender()->TextWidth(0, FontSize, pText, -1); TextRender()->Text(0, Half-w/2, 2, FontSize, pText, -1); } } void CHud::RenderScoreHud() { // render small score hud if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) { int GameFlags = m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags; float Whole = 300*Graphics()->ScreenAspect(); float StartY = 229.0f; if(GameFlags&GAMEFLAG_TEAMS && m_pClient->m_Snap.m_pGameDataObj) { char aScoreTeam[2][32]; str_format(aScoreTeam[TEAM_RED], sizeof(aScoreTeam)/2, "%d", m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed); str_format(aScoreTeam[TEAM_BLUE], sizeof(aScoreTeam)/2, "%d", m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue); float aScoreTeamWidth[2] = { TextRender()->TextWidth(0, 14.0f, aScoreTeam[TEAM_RED], -1), TextRender()->TextWidth(0, 14.0f, aScoreTeam[TEAM_BLUE], -1) }; int FlagCarrier[2] = { m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierRed, m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue }; float ScoreWidthMax = max(max(aScoreTeamWidth[TEAM_RED], aScoreTeamWidth[TEAM_BLUE]), TextRender()->TextWidth(0, 14.0f, "100", -1)); float Split = 3.0f; float ImageSize = GameFlags&GAMEFLAG_FLAGS ? 16.0f : Split; for(int t = 0; t < 2; t++) { // draw box Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); if(t == 0) Graphics()->SetColor(1.0f, 0.0f, 0.0f, 0.25f); else Graphics()->SetColor(0.0f, 0.0f, 1.0f, 0.25f); RenderTools()->DrawRoundRectExt(Whole-ScoreWidthMax-ImageSize-2*Split, StartY+t*20, ScoreWidthMax+ImageSize+2*Split, 18.0f, 5.0f, CUI::CORNER_L); Graphics()->QuadsEnd(); // draw score TextRender()->Text(0, Whole-ScoreWidthMax+(ScoreWidthMax-aScoreTeamWidth[t])/2-Split, StartY+t*20, 14.0f, aScoreTeam[t], -1); if(GameFlags&GAMEFLAG_FLAGS) { int BlinkTimer = (m_pClient->m_FlagDropTick[t] != 0 && (Client()->GameTick()-m_pClient->m_FlagDropTick[t])/Client()->GameTickSpeed() >= 25) ? 10 : 20; if(FlagCarrier[t] == FLAG_ATSTAND || (FlagCarrier[t] == FLAG_TAKEN && ((Client()->GameTick()/BlinkTimer)&1))) { // draw flag Graphics()->BlendNormal(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(t==0?SPRITE_FLAG_RED:SPRITE_FLAG_BLUE); IGraphics::CQuadItem QuadItem(Whole-ScoreWidthMax-ImageSize, StartY+1.0f+t*20, ImageSize/2, ImageSize); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } else if(FlagCarrier[t] >= 0) { // draw name of the flag holder int ID = FlagCarrier[t]%MAX_CLIENTS; const char *pName = m_pClient->m_aClients[ID].m_aName; float w = TextRender()->TextWidth(0, 8.0f, pName, -1); TextRender()->Text(0, min(Whole-w-1.0f, Whole-ScoreWidthMax-ImageSize-2*Split), StartY+(t+1)*20.0f-3.0f, 8.0f, pName, -1); // draw tee of the flag holder CTeeRenderInfo Info = m_pClient->m_aClients[ID].m_RenderInfo; Info.m_Size = 18.0f; RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1,0), vec2(Whole-ScoreWidthMax-Info.m_Size/2-Split, StartY+1.0f+Info.m_Size/2+t*20)); } } StartY += 8.0f; } } else { int Local = -1; int aPos[2] = { 1, 2 }; const CNetObj_PlayerInfo *apPlayerInfo[2] = { 0, 0 }; int i = 0; for(int t = 0; t < 2 && i < MAX_CLIENTS && m_pClient->m_Snap.m_paInfoByScore[i]; ++i) { if(m_pClient->m_Snap.m_paInfoByScore[i]->m_Team != TEAM_SPECTATORS) { apPlayerInfo[t] = m_pClient->m_Snap.m_paInfoByScore[i]; if(apPlayerInfo[t]->m_ClientID == m_pClient->m_Snap.m_LocalClientID) Local = t; ++t; } } // search local player info if not a spectator, nor within top2 scores if(Local == -1 && m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS) { for(; i < MAX_CLIENTS && m_pClient->m_Snap.m_paInfoByScore[i]; ++i) { if(m_pClient->m_Snap.m_paInfoByScore[i]->m_Team != TEAM_SPECTATORS) ++aPos[1]; if(m_pClient->m_Snap.m_paInfoByScore[i]->m_ClientID == m_pClient->m_Snap.m_LocalClientID) { apPlayerInfo[1] = m_pClient->m_Snap.m_paInfoByScore[i]; Local = 1; break; } } } char aScore[2][32]; for(int t = 0; t < 2; ++t) { if(apPlayerInfo[t]) str_format(aScore[t], sizeof(aScore)/2, "%d", apPlayerInfo[t]->m_Score); else aScore[t][0] = 0; } float aScoreWidth[2] = {TextRender()->TextWidth(0, 14.0f, aScore[0], -1), TextRender()->TextWidth(0, 14.0f, aScore[1], -1)}; float ScoreWidthMax = max(max(aScoreWidth[0], aScoreWidth[1]), TextRender()->TextWidth(0, 14.0f, "10", -1)); float Split = 3.0f, ImageSize = 16.0f, PosSize = 16.0f; for(int t = 0; t < 2; t++) { // draw box Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); if(t == Local) Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f); else Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.25f); RenderTools()->DrawRoundRectExt(Whole-ScoreWidthMax-ImageSize-2*Split-PosSize, StartY+t*20, ScoreWidthMax+ImageSize+2*Split+PosSize, 18.0f, 5.0f, CUI::CORNER_L); Graphics()->QuadsEnd(); // draw score TextRender()->Text(0, Whole-ScoreWidthMax+(ScoreWidthMax-aScoreWidth[t])/2-Split, StartY+t*20, 14.0f, aScore[t], -1); if(apPlayerInfo[t]) { // draw name int ID = apPlayerInfo[t]->m_ClientID; const char *pName = m_pClient->m_aClients[ID].m_aName; float w = TextRender()->TextWidth(0, 8.0f, pName, -1); TextRender()->Text(0, min(Whole-w-1.0f, Whole-ScoreWidthMax-ImageSize-2*Split-PosSize), StartY+(t+1)*20.0f-3.0f, 8.0f, pName, -1); // draw tee CTeeRenderInfo Info = m_pClient->m_aClients[ID].m_RenderInfo; Info.m_Size = 18.0f; RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1,0), vec2(Whole-ScoreWidthMax-Info.m_Size/2-Split, StartY+1.0f+Info.m_Size/2+t*20)); } // draw position char aBuf[32]; str_format(aBuf, sizeof(aBuf), "%d.", aPos[t]); TextRender()->Text(0, Whole-ScoreWidthMax-ImageSize-Split-PosSize, StartY+2.0f+t*20, 10.0f, aBuf, -1); StartY += 8.0f; } } } } void CHud::RenderWarmupTimer() { // render warmup timer if(m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer) { char Buf[256]; float FontSize = 20.0f; float w = TextRender()->TextWidth(0, FontSize, Localize("Warmup"), -1); TextRender()->Text(0, 150*Graphics()->ScreenAspect()+-w/2, 50, FontSize, Localize("Warmup"), -1); int Seconds = m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer/SERVER_TICK_SPEED; if(Seconds < 5) str_format(Buf, sizeof(Buf), "%d.%d", Seconds, (m_pClient->m_Snap.m_pGameInfoObj->m_WarmupTimer*10/SERVER_TICK_SPEED)%10); else str_format(Buf, sizeof(Buf), "%d", Seconds); w = TextRender()->TextWidth(0, FontSize, Buf, -1); TextRender()->Text(0, 150*Graphics()->ScreenAspect()+-w/2, 75, FontSize, Buf, -1); } } void CHud::MapscreenToGroup(float CenterX, float CenterY, CMapItemGroup *pGroup) { float Points[4]; RenderTools()->MapscreenToWorld(CenterX, CenterY, pGroup->m_ParallaxX/100.0f, pGroup->m_ParallaxY/100.0f, pGroup->m_OffsetX, pGroup->m_OffsetY, Graphics()->ScreenAspect(), 1.0f, Points); Graphics()->MapScreen(Points[0], Points[1], Points[2], Points[3]); } void CHud::RenderFps() { if(g_Config.m_ClShowfps) { // calculate avg. fps float FPS = 1.0f / Client()->RenderFrameTime(); m_AverageFPS = (m_AverageFPS*(1.0f-(1.0f/m_AverageFPS))) + (FPS*(1.0f/m_AverageFPS)); char Buf[512]; str_format(Buf, sizeof(Buf), "%d", (int)m_AverageFPS); TextRender()->Text(0, m_Width-10-TextRender()->TextWidth(0,12,Buf,-1), 5, 12, Buf, -1); } } void CHud::RenderConnectionWarning() { if(Client()->ConnectionProblems()) { const char *pText = Localize("Connection Problems..."); float w = TextRender()->TextWidth(0, 24, pText, -1); TextRender()->Text(0, 150*Graphics()->ScreenAspect()-w/2, 50, 24, pText, -1); } } void CHud::RenderTeambalanceWarning() { // render prompt about team-balance bool Flash = time_get()/(time_freq()/2)%2 == 0; if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) { int TeamDiff = m_pClient->m_Snap.m_aTeamSize[TEAM_RED]-m_pClient->m_Snap.m_aTeamSize[TEAM_BLUE]; if (g_Config.m_ClWarningTeambalance && (TeamDiff >= 2 || TeamDiff <= -2)) { const char *pText = Localize("Please balance teams!"); if(Flash) TextRender()->TextColor(1,1,0.5f,1); else TextRender()->TextColor(0.7f,0.7f,0.2f,1.0f); TextRender()->Text(0x0, 5, 50, 6, pText, -1); TextRender()->TextColor(1,1,1,1); } } } void CHud::RenderVoting() { if(!m_pClient->m_pVoting->IsVoting() || Client()->State() == IClient::STATE_DEMOPLAYBACK) return; Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.40f); RenderTools()->DrawRoundRect(-10, 60-2, 100+10+4+5, 46, 5.0f); Graphics()->QuadsEnd(); TextRender()->TextColor(1,1,1,1); CTextCursor Cursor; char aBuf[512]; str_format(aBuf, sizeof(aBuf), Localize("%ds left"), m_pClient->m_pVoting->SecondsLeft()); float tw = TextRender()->TextWidth(0x0, 6, aBuf, -1); TextRender()->SetCursor(&Cursor, 5.0f+100.0f-tw, 60.0f, 6.0f, TEXTFLAG_RENDER); TextRender()->TextEx(&Cursor, aBuf, -1); TextRender()->SetCursor(&Cursor, 5.0f, 60.0f, 6.0f, TEXTFLAG_RENDER); Cursor.m_LineWidth = 100.0f-tw; Cursor.m_MaxLines = 3; TextRender()->TextEx(&Cursor, m_pClient->m_pVoting->VoteDescription(), -1); // reason str_format(aBuf, sizeof(aBuf), "%s %s", Localize("Reason:"), m_pClient->m_pVoting->VoteReason()); TextRender()->SetCursor(&Cursor, 5.0f, 79.0f, 6.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = 100.0f; TextRender()->TextEx(&Cursor, aBuf, -1); CUIRect Base = {5, 88, 100, 4}; m_pClient->m_pVoting->RenderBars(Base, false); const char *pYesKey = m_pClient->m_pBinds->GetKey("vote yes"); const char *pNoKey = m_pClient->m_pBinds->GetKey("vote no"); str_format(aBuf, sizeof(aBuf), "%s - %s", pYesKey, Localize("Vote yes")); Base.y += Base.h+1; UI()->DoLabel(&Base, aBuf, 6.0f, -1); str_format(aBuf, sizeof(aBuf), "%s - %s", Localize("Vote no"), pNoKey); UI()->DoLabel(&Base, aBuf, 6.0f, 1); } void CHud::RenderCursor() { if(!m_pClient->m_Snap.m_pLocalCharacter || Client()->State() == IClient::STATE_DEMOPLAYBACK) return; MapscreenToGroup(m_pClient->m_pCamera->m_Center.x, m_pClient->m_pCamera->m_Center.y, Layers()->GameGroup()); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); // render cursor RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[m_pClient->m_Snap.m_pLocalCharacter->m_Weapon%NUM_WEAPONS].m_pSpriteCursor); float CursorSize = 64; RenderTools()->DrawSprite(m_pClient->m_pControls->m_TargetPos.x, m_pClient->m_pControls->m_TargetPos.y, CursorSize); Graphics()->QuadsEnd(); } void CHud::RenderHealthAndAmmo(const CNetObj_Character *pCharacter) { if(!pCharacter) return; //mapscreen_to_group(gacenter_x, center_y, layers_game_group()); float x = 5; float y = 5; // render ammo count // render gui stuff Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); // if weaponstage is active, put a "glow" around the stage ammo RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[pCharacter->m_Weapon%NUM_WEAPONS].m_pSpriteProj); IGraphics::CQuadItem Array[10]; int i; for (i = 0; i < min(pCharacter->m_AmmoCount, 10); i++) Array[i] = IGraphics::CQuadItem(x+i*12,y+24,10,10); Graphics()->QuadsDrawTL(Array, i); Graphics()->QuadsEnd(); Graphics()->QuadsBegin(); int h = 0; // render health RenderTools()->SelectSprite(SPRITE_HEALTH_FULL); for(; h < min(pCharacter->m_Health, 10); h++) Array[h] = IGraphics::CQuadItem(x+h*12,y,10,10); Graphics()->QuadsDrawTL(Array, h); i = 0; RenderTools()->SelectSprite(SPRITE_HEALTH_EMPTY); for(; h < 10; h++) Array[i++] = IGraphics::CQuadItem(x+h*12,y,10,10); Graphics()->QuadsDrawTL(Array, i); // render armor meter h = 0; RenderTools()->SelectSprite(SPRITE_ARMOR_FULL); for(; h < min(pCharacter->m_Armor, 10); h++) Array[h] = IGraphics::CQuadItem(x+h*12,y+12,10,10); Graphics()->QuadsDrawTL(Array, h); i = 0; RenderTools()->SelectSprite(SPRITE_ARMOR_EMPTY); for(; h < 10; h++) Array[i++] = IGraphics::CQuadItem(x+h*12,y+12,10,10); Graphics()->QuadsDrawTL(Array, i); Graphics()->QuadsEnd(); } void CHud::RenderSpectatorHud() { // draw the box Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.4f); RenderTools()->DrawRoundRectExt(m_Width-180.0f, m_Height-15.0f, 180.0f, 15.0f, 5.0f, CUI::CORNER_TL); Graphics()->QuadsEnd(); // draw the text char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Spectate"), m_pClient->m_Snap.m_SpecInfo.m_SpectatorID != SPEC_FREEVIEW ? m_pClient->m_aClients[m_pClient->m_Snap.m_SpecInfo.m_SpectatorID].m_aName : Localize("Free-View")); TextRender()->Text(0, m_Width-174.0f, m_Height-13.0f, 8.0f, aBuf, -1); } void CHud::OnRender() { if(!m_pClient->m_Snap.m_pGameInfoObj) return; m_Width = 300.0f*Graphics()->ScreenAspect(); m_Height = 300.0f; Graphics()->MapScreen(0.0f, 0.0f, m_Width, m_Height); if(g_Config.m_ClShowhud) { if(m_pClient->m_Snap.m_pLocalCharacter && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) RenderHealthAndAmmo(m_pClient->m_Snap.m_pLocalCharacter); else if(m_pClient->m_Snap.m_SpecInfo.m_Active) { if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorID != SPEC_FREEVIEW) RenderHealthAndAmmo(&m_pClient->m_Snap.m_aCharacters[m_pClient->m_Snap.m_SpecInfo.m_SpectatorID].m_Cur); RenderSpectatorHud(); } RenderGameTimer(); RenderPauseNotification(); RenderSuddenDeath(); RenderScoreHud(); RenderWarmupTimer(); RenderFps(); if(Client()->State() != IClient::STATE_DEMOPLAYBACK) RenderConnectionWarning(); RenderTeambalanceWarning(); RenderVoting(); } RenderCursor(); } teeworlds-0.6.2+dfsg/src/game/client/components/hud.h0000644000175000017500000000161312140200333021527 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_HUD_H #define GAME_CLIENT_COMPONENTS_HUD_H #include class CHud : public CComponent { float m_Width, m_Height; float m_AverageFPS; void RenderCursor(); void RenderFps(); void RenderConnectionWarning(); void RenderTeambalanceWarning(); void RenderVoting(); void RenderHealthAndAmmo(const CNetObj_Character *pCharacter); void RenderGameTimer(); void RenderPauseNotification(); void RenderSuddenDeath(); void RenderScoreHud(); void RenderSpectatorHud(); void RenderWarmupTimer(); void MapscreenToGroup(float CenterX, float CenterY, struct CMapItemGroup *PGroup); public: CHud(); virtual void OnReset(); virtual void OnRender(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/items.cpp0000644000175000017500000002441512140200333022430 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include // get_angle #include #include #include #include #include #include "items.h" void CItems::OnReset() { m_NumExtraProjectiles = 0; } void CItems::RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID) { // get positions float Curvature = 0; float Speed = 0; if(pCurrent->m_Type == WEAPON_GRENADE) { Curvature = m_pClient->m_Tuning.m_GrenadeCurvature; Speed = m_pClient->m_Tuning.m_GrenadeSpeed; } else if(pCurrent->m_Type == WEAPON_SHOTGUN) { Curvature = m_pClient->m_Tuning.m_ShotgunCurvature; Speed = m_pClient->m_Tuning.m_ShotgunSpeed; } else if(pCurrent->m_Type == WEAPON_GUN) { Curvature = m_pClient->m_Tuning.m_GunCurvature; Speed = m_pClient->m_Tuning.m_GunSpeed; } static float s_LastGameTickTime = Client()->GameTickTime(); if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) s_LastGameTickTime = Client()->GameTickTime(); float Ct = (Client()->PrevGameTick()-pCurrent->m_StartTick)/(float)SERVER_TICK_SPEED + s_LastGameTickTime; if(Ct < 0) return; // projectile havn't been shot yet vec2 StartPos(pCurrent->m_X, pCurrent->m_Y); vec2 StartVel(pCurrent->m_VelX/100.0f, pCurrent->m_VelY/100.0f); vec2 Pos = CalcPos(StartPos, StartVel, Curvature, Speed, Ct); vec2 PrevPos = CalcPos(StartPos, StartVel, Curvature, Speed, Ct-0.001f); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[clamp(pCurrent->m_Type, 0, NUM_WEAPONS-1)].m_pSpriteProj); vec2 Vel = Pos-PrevPos; //vec2 pos = mix(vec2(prev->x, prev->y), vec2(current->x, current->y), Client()->IntraGameTick()); // add particle for this projectile if(pCurrent->m_Type == WEAPON_GRENADE) { m_pClient->m_pEffects->SmokeTrail(Pos, Vel*-1); static float s_Time = 0.0f; static float s_LastLocalTime = Client()->LocalTime(); if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(!pInfo->m_Paused) s_Time += (Client()->LocalTime()-s_LastLocalTime)*pInfo->m_Speed; } else { if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) s_Time += Client()->LocalTime()-s_LastLocalTime; } Graphics()->QuadsSetRotation(s_Time*pi*2*2 + ItemID); s_LastLocalTime = Client()->LocalTime(); } else { m_pClient->m_pEffects->BulletTrail(Pos); if(length(Vel) > 0.00001f) Graphics()->QuadsSetRotation(GetAngle(Vel)); else Graphics()->QuadsSetRotation(0); } IGraphics::CQuadItem QuadItem(Pos.x, Pos.y, 32, 32); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->QuadsSetRotation(0); Graphics()->QuadsEnd(); } void CItems::RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCurrent) { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); vec2 Pos = mix(vec2(pPrev->m_X, pPrev->m_Y), vec2(pCurrent->m_X, pCurrent->m_Y), Client()->IntraGameTick()); float Angle = 0.0f; float Size = 64.0f; if (pCurrent->m_Type == POWERUP_WEAPON) { Angle = 0; //-pi/6;//-0.25f * pi * 2.0f; RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[clamp(pCurrent->m_Subtype, 0, NUM_WEAPONS-1)].m_pSpriteBody); Size = g_pData->m_Weapons.m_aId[clamp(pCurrent->m_Subtype, 0, NUM_WEAPONS-1)].m_VisualSize; } else { const int c[] = { SPRITE_PICKUP_HEALTH, SPRITE_PICKUP_ARMOR, SPRITE_PICKUP_WEAPON, SPRITE_PICKUP_NINJA }; RenderTools()->SelectSprite(c[pCurrent->m_Type]); if(c[pCurrent->m_Type] == SPRITE_PICKUP_NINJA) { m_pClient->m_pEffects->PowerupShine(Pos, vec2(96,18)); Size *= 2.0f; Pos.x -= 10.0f; } } Graphics()->QuadsSetRotation(Angle); static float s_Time = 0.0f; static float s_LastLocalTime = Client()->LocalTime(); float Offset = Pos.y/32.0f + Pos.x/32.0f; if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(!pInfo->m_Paused) s_Time += (Client()->LocalTime()-s_LastLocalTime)*pInfo->m_Speed; } else { if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) s_Time += Client()->LocalTime()-s_LastLocalTime; } Pos.x += cosf(s_Time*2.0f+Offset)*2.5f; Pos.y += sinf(s_Time*2.0f+Offset)*2.5f; s_LastLocalTime = Client()->LocalTime(); RenderTools()->DrawSprite(Pos.x, Pos.y, Size); Graphics()->QuadsEnd(); } void CItems::RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent, const CNetObj_GameData *pPrevGameData, const CNetObj_GameData *pCurGameData) { float Angle = 0.0f; float Size = 42.0f; Graphics()->BlendNormal(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); if(pCurrent->m_Team == TEAM_RED) RenderTools()->SelectSprite(SPRITE_FLAG_RED); else RenderTools()->SelectSprite(SPRITE_FLAG_BLUE); Graphics()->QuadsSetRotation(Angle); vec2 Pos = mix(vec2(pPrev->m_X, pPrev->m_Y), vec2(pCurrent->m_X, pCurrent->m_Y), Client()->IntraGameTick()); if(pCurGameData) { // make sure that the flag isn't interpolated between capture and return if(pPrevGameData && ((pCurrent->m_Team == TEAM_RED && pPrevGameData->m_FlagCarrierRed != pCurGameData->m_FlagCarrierRed) || (pCurrent->m_Team == TEAM_BLUE && pPrevGameData->m_FlagCarrierBlue != pCurGameData->m_FlagCarrierBlue))) Pos = vec2(pCurrent->m_X, pCurrent->m_Y); // make sure to use predicted position if we are the carrier if(m_pClient->m_Snap.m_pLocalInfo && ((pCurrent->m_Team == TEAM_RED && pCurGameData->m_FlagCarrierRed == m_pClient->m_Snap.m_LocalClientID) || (pCurrent->m_Team == TEAM_BLUE && pCurGameData->m_FlagCarrierBlue == m_pClient->m_Snap.m_LocalClientID))) Pos = m_pClient->m_LocalCharacterPos; } IGraphics::CQuadItem QuadItem(Pos.x, Pos.y-Size*0.75f, Size, Size*2); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->QuadsEnd(); } void CItems::RenderLaser(const struct CNetObj_Laser *pCurrent) { vec2 Pos = vec2(pCurrent->m_X, pCurrent->m_Y); vec2 From = vec2(pCurrent->m_FromX, pCurrent->m_FromY); vec2 Dir = normalize(Pos-From); float Ticks = Client()->GameTick() + Client()->IntraGameTick() - pCurrent->m_StartTick; float Ms = (Ticks/50.0f) * 1000.0f; float a = Ms / m_pClient->m_Tuning.m_LaserBounceDelay; a = clamp(a, 0.0f, 1.0f); float Ia = 1-a; vec2 Out, Border; Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); //vec4 inner_color(0.15f,0.35f,0.75f,1.0f); //vec4 outer_color(0.65f,0.85f,1.0f,1.0f); // do outline vec4 OuterColor(0.075f, 0.075f, 0.25f, 1.0f); Graphics()->SetColor(OuterColor.r, OuterColor.g, OuterColor.b, 1.0f); Out = vec2(Dir.y, -Dir.x) * (7.0f*Ia); IGraphics::CFreeformItem Freeform( From.x-Out.x, From.y-Out.y, From.x+Out.x, From.y+Out.y, Pos.x-Out.x, Pos.y-Out.y, Pos.x+Out.x, Pos.y+Out.y); Graphics()->QuadsDrawFreeform(&Freeform, 1); // do inner vec4 InnerColor(0.5f, 0.5f, 1.0f, 1.0f); Out = vec2(Dir.y, -Dir.x) * (5.0f*Ia); Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, 1.0f); // center Freeform = IGraphics::CFreeformItem( From.x-Out.x, From.y-Out.y, From.x+Out.x, From.y+Out.y, Pos.x-Out.x, Pos.y-Out.y, Pos.x+Out.x, Pos.y+Out.y); Graphics()->QuadsDrawFreeform(&Freeform, 1); Graphics()->QuadsEnd(); // render head { Graphics()->BlendNormal(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_PARTICLES].m_Id); Graphics()->QuadsBegin(); int Sprites[] = {SPRITE_PART_SPLAT01, SPRITE_PART_SPLAT02, SPRITE_PART_SPLAT03}; RenderTools()->SelectSprite(Sprites[Client()->GameTick()%3]); Graphics()->QuadsSetRotation(Client()->GameTick()); Graphics()->SetColor(OuterColor.r, OuterColor.g, OuterColor.b, 1.0f); IGraphics::CQuadItem QuadItem(Pos.x, Pos.y, 24, 24); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->SetColor(InnerColor.r, InnerColor.g, InnerColor.b, 1.0f); QuadItem = IGraphics::CQuadItem(Pos.x, Pos.y, 20, 20); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->QuadsEnd(); } Graphics()->BlendNormal(); } void CItems::OnRender() { if(Client()->State() < IClient::STATE_ONLINE) return; int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int i = 0; i < Num; i++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item); if(Item.m_Type == NETOBJTYPE_PROJECTILE) { RenderProjectile((const CNetObj_Projectile *)pData, Item.m_ID); } else if(Item.m_Type == NETOBJTYPE_PICKUP) { const void *pPrev = Client()->SnapFindItem(IClient::SNAP_PREV, Item.m_Type, Item.m_ID); if(pPrev) RenderPickup((const CNetObj_Pickup *)pPrev, (const CNetObj_Pickup *)pData); } else if(Item.m_Type == NETOBJTYPE_LASER) { RenderLaser((const CNetObj_Laser *)pData); } } // render flag for(int i = 0; i < Num; i++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item); if(Item.m_Type == NETOBJTYPE_FLAG) { const void *pPrev = Client()->SnapFindItem(IClient::SNAP_PREV, Item.m_Type, Item.m_ID); if (pPrev) { const void *pPrevGameData = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_GAMEDATA, m_pClient->m_Snap.m_GameDataSnapID); RenderFlag(static_cast(pPrev), static_cast(pData), static_cast(pPrevGameData), m_pClient->m_Snap.m_pGameDataObj); } } } // render extra projectiles for(int i = 0; i < m_NumExtraProjectiles; i++) { if(m_aExtraProjectiles[i].m_StartTick < Client()->GameTick()) { m_aExtraProjectiles[i] = m_aExtraProjectiles[m_NumExtraProjectiles-1]; m_NumExtraProjectiles--; } else RenderProjectile(&m_aExtraProjectiles[i], 0); } } void CItems::AddExtraProjectile(CNetObj_Projectile *pProj) { if(m_NumExtraProjectiles != MAX_EXTRA_PROJECTILES) { m_aExtraProjectiles[m_NumExtraProjectiles] = *pProj; m_NumExtraProjectiles++; } } teeworlds-0.6.2+dfsg/src/game/client/components/items.h0000644000175000017500000000170312140200333022070 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_ITEMS_H #define GAME_CLIENT_COMPONENTS_ITEMS_H #include class CItems : public CComponent { enum { MAX_EXTRA_PROJECTILES=32, }; CNetObj_Projectile m_aExtraProjectiles[MAX_EXTRA_PROJECTILES]; int m_NumExtraProjectiles; void RenderProjectile(const CNetObj_Projectile *pCurrent, int ItemID); void RenderPickup(const CNetObj_Pickup *pPrev, const CNetObj_Pickup *pCurrent); void RenderFlag(const CNetObj_Flag *pPrev, const CNetObj_Flag *pCurrent, const CNetObj_GameData *pPrevGameData, const CNetObj_GameData *pCurGameData); void RenderLaser(const struct CNetObj_Laser *pCurrent); public: virtual void OnReset(); virtual void OnRender(); void AddExtraProjectile(CNetObj_Projectile *pProj); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/killmessages.cpp0000644000175000017500000001063512140200333023771 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "killmessages.h" void CKillMessages::OnReset() { m_KillmsgCurrent = 0; for(int i = 0; i < MAX_KILLMSGS; i++) m_aKillmsgs[i].m_Tick = -100000; } void CKillMessages::OnMessage(int MsgType, void *pRawMsg) { if(MsgType == NETMSGTYPE_SV_KILLMSG) { CNetMsg_Sv_KillMsg *pMsg = (CNetMsg_Sv_KillMsg *)pRawMsg; // unpack messages CKillMsg Kill; Kill.m_VictimID = pMsg->m_Victim; Kill.m_VictimTeam = m_pClient->m_aClients[Kill.m_VictimID].m_Team; str_copy(Kill.m_aVictimName, m_pClient->m_aClients[Kill.m_VictimID].m_aName, sizeof(Kill.m_aVictimName)); Kill.m_VictimRenderInfo = m_pClient->m_aClients[Kill.m_VictimID].m_RenderInfo; Kill.m_KillerID = pMsg->m_Killer; Kill.m_KillerTeam = m_pClient->m_aClients[Kill.m_KillerID].m_Team; str_copy(Kill.m_aKillerName, m_pClient->m_aClients[Kill.m_KillerID].m_aName, sizeof(Kill.m_aKillerName)); Kill.m_KillerRenderInfo = m_pClient->m_aClients[Kill.m_KillerID].m_RenderInfo; Kill.m_Weapon = pMsg->m_Weapon; Kill.m_ModeSpecial = pMsg->m_ModeSpecial; Kill.m_Tick = Client()->GameTick(); // add the message m_KillmsgCurrent = (m_KillmsgCurrent+1)%MAX_KILLMSGS; m_aKillmsgs[m_KillmsgCurrent] = Kill; } } void CKillMessages::OnRender() { float Width = 400*3.0f*Graphics()->ScreenAspect(); float Height = 400*3.0f; Graphics()->MapScreen(0, 0, Width*1.5f, Height*1.5f); float StartX = Width*1.5f-10.0f; float y = 20.0f; for(int i = 1; i <= MAX_KILLMSGS; i++) { int r = (m_KillmsgCurrent+i)%MAX_KILLMSGS; if(Client()->GameTick() > m_aKillmsgs[r].m_Tick+50*10) continue; float FontSize = 36.0f; float KillerNameW = TextRender()->TextWidth(0, FontSize, m_aKillmsgs[r].m_aKillerName, -1); float VictimNameW = TextRender()->TextWidth(0, FontSize, m_aKillmsgs[r].m_aVictimName, -1); float x = StartX; // render victim name x -= VictimNameW; TextRender()->Text(0, x, y, FontSize, m_aKillmsgs[r].m_aVictimName, -1); // render victim tee x -= 24.0f; if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_FLAGS) { if(m_aKillmsgs[r].m_ModeSpecial&1) { Graphics()->BlendNormal(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); if(m_aKillmsgs[r].m_VictimTeam == TEAM_RED) RenderTools()->SelectSprite(SPRITE_FLAG_BLUE); else RenderTools()->SelectSprite(SPRITE_FLAG_RED); float Size = 56.0f; IGraphics::CQuadItem QuadItem(x, y-16, Size/2, Size); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } } RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_VictimRenderInfo, EMOTE_PAIN, vec2(-1,0), vec2(x, y+28)); x -= 32.0f; // render weapon x -= 44.0f; if (m_aKillmsgs[r].m_Weapon >= 0) { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[m_aKillmsgs[r].m_Weapon].m_pSpriteBody); RenderTools()->DrawSprite(x, y+28, 96); Graphics()->QuadsEnd(); } x -= 52.0f; if(m_aKillmsgs[r].m_VictimID != m_aKillmsgs[r].m_KillerID) { if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_FLAGS) { if(m_aKillmsgs[r].m_ModeSpecial&2) { Graphics()->BlendNormal(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); if(m_aKillmsgs[r].m_KillerTeam == TEAM_RED) RenderTools()->SelectSprite(SPRITE_FLAG_BLUE, SPRITE_FLAG_FLIP_X); else RenderTools()->SelectSprite(SPRITE_FLAG_RED, SPRITE_FLAG_FLIP_X); float Size = 56.0f; IGraphics::CQuadItem QuadItem(x-56, y-16, Size/2, Size); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } } // render killer tee x -= 24.0f; RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_KillerRenderInfo, EMOTE_ANGRY, vec2(1,0), vec2(x, y+28)); x -= 32.0f; // render killer name x -= KillerNameW; TextRender()->Text(0, x, y, FontSize, m_aKillmsgs[r].m_aKillerName, -1); } y += 46.0f; } } teeworlds-0.6.2+dfsg/src/game/client/components/killmessages.h0000644000175000017500000000164212140200333023434 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_KILLMESSAGES_H #define GAME_CLIENT_COMPONENTS_KILLMESSAGES_H #include class CKillMessages : public CComponent { public: // kill messages struct CKillMsg { int m_Weapon; int m_VictimID; int m_VictimTeam; char m_aVictimName[64]; CTeeRenderInfo m_VictimRenderInfo; int m_KillerID; int m_KillerTeam; char m_aKillerName[64]; CTeeRenderInfo m_KillerRenderInfo; int m_ModeSpecial; // for CTF, if the guy is carrying a flag for example int m_Tick; }; enum { MAX_KILLMSGS = 5, }; CKillMsg m_aKillmsgs[MAX_KILLMSGS]; int m_KillmsgCurrent; virtual void OnReset(); virtual void OnRender(); virtual void OnMessage(int MsgType, void *pRawMsg); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/mapimages.cpp0000644000175000017500000000252612140200333023251 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include "mapimages.h" CMapImages::CMapImages() { m_Count = 0; } void CMapImages::OnMapLoad() { IMap *pMap = Kernel()->RequestInterface(); // unload all textures for(int i = 0; i < m_Count; i++) { Graphics()->UnloadTexture(m_aTextures[i]); m_aTextures[i] = -1; } m_Count = 0; int Start; pMap->GetType(MAPITEMTYPE_IMAGE, &Start, &m_Count); // load new textures for(int i = 0; i < m_Count; i++) { m_aTextures[i] = 0; CMapItemImage *pImg = (CMapItemImage *)pMap->GetItem(Start+i, 0, 0); if(pImg->m_External) { char Buf[256]; char *pName = (char *)pMap->GetData(pImg->m_ImageName); str_format(Buf, sizeof(Buf), "mapres/%s.png", pName); m_aTextures[i] = Graphics()->LoadTexture(Buf, IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); } else { void *pData = pMap->GetData(pImg->m_ImageData); m_aTextures[i] = Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, CImageInfo::FORMAT_RGBA, pData, CImageInfo::FORMAT_RGBA, 0); pMap->UnloadData(pImg->m_ImageData); } } } teeworlds-0.6.2+dfsg/src/game/client/components/mapimages.h0000644000175000017500000000104212140200333022706 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_MAPIMAGES_H #define GAME_CLIENT_COMPONENTS_MAPIMAGES_H #include class CMapImages : public CComponent { int m_aTextures[64]; int m_Count; public: CMapImages(); int Get(int Index) const { return m_aTextures[Index]; } int Num() const { return m_Count; } virtual void OnMapLoad(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/maplayers.cpp0000644000175000017500000002046712140200333023307 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "maplayers.h" CMapLayers::CMapLayers(int t) { m_Type = t; m_pLayers = 0; m_CurrentLocalTick = 0; m_LastLocalTick = 0; m_EnvelopeUpdate = false; } void CMapLayers::OnInit() { m_pLayers = Layers(); } void CMapLayers::EnvelopeUpdate() { if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); m_CurrentLocalTick = pInfo->m_CurrentTick; m_LastLocalTick = pInfo->m_CurrentTick; m_EnvelopeUpdate = true; } } void CMapLayers::MapScreenToGroup(float CenterX, float CenterY, CMapItemGroup *pGroup) { float Points[4]; RenderTools()->MapscreenToWorld(CenterX, CenterY, pGroup->m_ParallaxX/100.0f, pGroup->m_ParallaxY/100.0f, pGroup->m_OffsetX, pGroup->m_OffsetY, Graphics()->ScreenAspect(), 1.0f, Points); Graphics()->MapScreen(Points[0], Points[1], Points[2], Points[3]); } void CMapLayers::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pUser) { CMapLayers *pThis = (CMapLayers *)pUser; pChannels[0] = 0; pChannels[1] = 0; pChannels[2] = 0; pChannels[3] = 0; CEnvPoint *pPoints = 0; { int Start, Num; pThis->m_pLayers->Map()->GetType(MAPITEMTYPE_ENVPOINTS, &Start, &Num); if(Num) pPoints = (CEnvPoint *)pThis->m_pLayers->Map()->GetItem(Start, 0, 0); } int Start, Num; pThis->m_pLayers->Map()->GetType(MAPITEMTYPE_ENVELOPE, &Start, &Num); if(Env >= Num) return; CMapItemEnvelope *pItem = (CMapItemEnvelope *)pThis->m_pLayers->Map()->GetItem(Start+Env, 0, 0); static float s_Time = 0.0f; static float s_LastLocalTime = pThis->Client()->LocalTime(); if(pThis->Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = pThis->DemoPlayer()->BaseInfo(); if(!pInfo->m_Paused || pThis->m_EnvelopeUpdate) { if(pThis->m_CurrentLocalTick != pInfo->m_CurrentTick) { pThis->m_LastLocalTick = pThis->m_CurrentLocalTick; pThis->m_CurrentLocalTick = pInfo->m_CurrentTick; } s_Time = mix(pThis->m_LastLocalTick / (float)pThis->Client()->GameTickSpeed(), pThis->m_CurrentLocalTick / (float)pThis->Client()->GameTickSpeed(), pThis->Client()->IntraGameTick()); } pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels); } else { if(pThis->m_pClient->m_Snap.m_pGameInfoObj && !(pThis->m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) { if(pItem->m_Version < 2 || pItem->m_Synchronized) { s_Time = mix((pThis->Client()->PrevGameTick()-pThis->m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / (float)pThis->Client()->GameTickSpeed(), (pThis->Client()->GameTick()-pThis->m_pClient->m_Snap.m_pGameInfoObj->m_RoundStartTick) / (float)pThis->Client()->GameTickSpeed(), pThis->Client()->IntraGameTick()); } else s_Time += pThis->Client()->LocalTime()-s_LastLocalTime; } pThis->RenderTools()->RenderEvalEnvelope(pPoints+pItem->m_StartPoint, pItem->m_NumPoints, 4, s_Time+TimeOffset, pChannels); s_LastLocalTime = pThis->Client()->LocalTime(); } } void CMapLayers::OnRender() { if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) return; CUIRect Screen; Graphics()->GetScreen(&Screen.x, &Screen.y, &Screen.w, &Screen.h); vec2 Center = m_pClient->m_pCamera->m_Center; //float center_x = gameclient.camera->center.x; //float center_y = gameclient.camera->center.y; bool PassedGameLayer = false; for(int g = 0; g < m_pLayers->NumGroups(); g++) { CMapItemGroup *pGroup = m_pLayers->GetGroup(g); if(!g_Config.m_GfxNoclip && pGroup->m_Version >= 2 && pGroup->m_UseClipping) { // set clipping float Points[4]; MapScreenToGroup(Center.x, Center.y, m_pLayers->GameGroup()); Graphics()->GetScreen(&Points[0], &Points[1], &Points[2], &Points[3]); float x0 = (pGroup->m_ClipX - Points[0]) / (Points[2]-Points[0]); float y0 = (pGroup->m_ClipY - Points[1]) / (Points[3]-Points[1]); float x1 = ((pGroup->m_ClipX+pGroup->m_ClipW) - Points[0]) / (Points[2]-Points[0]); float y1 = ((pGroup->m_ClipY+pGroup->m_ClipH) - Points[1]) / (Points[3]-Points[1]); Graphics()->ClipEnable((int)(x0*Graphics()->ScreenWidth()), (int)(y0*Graphics()->ScreenHeight()), (int)((x1-x0)*Graphics()->ScreenWidth()), (int)((y1-y0)*Graphics()->ScreenHeight())); } MapScreenToGroup(Center.x, Center.y, pGroup); for(int l = 0; l < pGroup->m_NumLayers; l++) { CMapItemLayer *pLayer = m_pLayers->GetLayer(pGroup->m_StartLayer+l); bool Render = false; bool IsGameLayer = false; if(pLayer == (CMapItemLayer*)m_pLayers->GameLayer()) { IsGameLayer = true; PassedGameLayer = 1; } // skip rendering if detail layers if not wanted if(pLayer->m_Flags&LAYERFLAG_DETAIL && !g_Config.m_GfxHighDetail && !IsGameLayer) continue; if(m_Type == -1) Render = true; else if(m_Type == 0) { if(PassedGameLayer) return; Render = true; } else { if(PassedGameLayer && !IsGameLayer) Render = true; } if(Render && pLayer->m_Type == LAYERTYPE_TILES && Input()->KeyPressed(KEY_LCTRL) && Input()->KeyPressed(KEY_LSHIFT) && Input()->KeyDown(KEY_KP0)) { CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; CTile *pTiles = (CTile *)m_pLayers->Map()->GetData(pTMap->m_Data); CServerInfo CurrentServerInfo; Client()->GetServerInfo(&CurrentServerInfo); char aFilename[256]; str_format(aFilename, sizeof(aFilename), "dumps/tilelayer_dump_%s-%d-%d-%dx%d.txt", CurrentServerInfo.m_aMap, g, l, pTMap->m_Width, pTMap->m_Height); IOHANDLE File = Storage()->OpenFile(aFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE); if(File) { for(int y = 0; y < pTMap->m_Height; y++) { for(int x = 0; x < pTMap->m_Width; x++) io_write(File, &(pTiles[y*pTMap->m_Width + x].m_Index), sizeof(pTiles[y*pTMap->m_Width + x].m_Index)); io_write_newline(File); } io_close(File); } } if(Render && !IsGameLayer) { //layershot_begin(); if(pLayer->m_Type == LAYERTYPE_TILES) { CMapItemLayerTilemap *pTMap = (CMapItemLayerTilemap *)pLayer; if(pTMap->m_Image == -1) Graphics()->TextureSet(-1); else Graphics()->TextureSet(m_pClient->m_pMapimages->Get(pTMap->m_Image)); CTile *pTiles = (CTile *)m_pLayers->Map()->GetData(pTMap->m_Data); Graphics()->BlendNone(); vec4 Color = vec4(pTMap->m_Color.r/255.0f, pTMap->m_Color.g/255.0f, pTMap->m_Color.b/255.0f, pTMap->m_Color.a/255.0f); RenderTools()->RenderTilemap(pTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_OPAQUE, EnvelopeEval, this, pTMap->m_ColorEnv, pTMap->m_ColorEnvOffset); Graphics()->BlendNormal(); RenderTools()->RenderTilemap(pTiles, pTMap->m_Width, pTMap->m_Height, 32.0f, Color, TILERENDERFLAG_EXTEND|LAYERRENDERFLAG_TRANSPARENT, EnvelopeEval, this, pTMap->m_ColorEnv, pTMap->m_ColorEnvOffset); } else if(pLayer->m_Type == LAYERTYPE_QUADS) { CMapItemLayerQuads *pQLayer = (CMapItemLayerQuads *)pLayer; if(pQLayer->m_Image == -1) Graphics()->TextureSet(-1); else Graphics()->TextureSet(m_pClient->m_pMapimages->Get(pQLayer->m_Image)); CQuad *pQuads = (CQuad *)m_pLayers->Map()->GetDataSwapped(pQLayer->m_Data); Graphics()->BlendNone(); RenderTools()->RenderQuads(pQuads, pQLayer->m_NumQuads, LAYERRENDERFLAG_OPAQUE, EnvelopeEval, this); Graphics()->BlendNormal(); RenderTools()->RenderQuads(pQuads, pQLayer->m_NumQuads, LAYERRENDERFLAG_TRANSPARENT, EnvelopeEval, this); } //layershot_end(); } } if(!g_Config.m_GfxNoclip) Graphics()->ClipDisable(); } if(!g_Config.m_GfxNoclip) Graphics()->ClipDisable(); // reset the screen like it was before Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); } teeworlds-0.6.2+dfsg/src/game/client/components/maplayers.h0000644000175000017500000000153012140200333022742 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_MAPLAYERS_H #define GAME_CLIENT_COMPONENTS_MAPLAYERS_H #include class CMapLayers : public CComponent { CLayers *m_pLayers; // todo refactor: maybe remove it and access it through client* int m_Type; int m_CurrentLocalTick; int m_LastLocalTick; bool m_EnvelopeUpdate; void MapScreenToGroup(float CenterX, float CenterY, CMapItemGroup *pGroup); static void EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pUser); public: enum { TYPE_BACKGROUND=0, TYPE_FOREGROUND, }; CMapLayers(int Type); virtual void OnInit(); virtual void OnRender(); void EnvelopeUpdate(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/menus.cpp0000644000175000017500000013111412140200333022431 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "countryflags.h" #include "menus.h" #include "skins.h" vec4 CMenus::ms_GuiColor; vec4 CMenus::ms_ColorTabbarInactiveOutgame; vec4 CMenus::ms_ColorTabbarActiveOutgame; vec4 CMenus::ms_ColorTabbarInactive; vec4 CMenus::ms_ColorTabbarActive = vec4(0,0,0,0.5f); vec4 CMenus::ms_ColorTabbarInactiveIngame; vec4 CMenus::ms_ColorTabbarActiveIngame; float CMenus::ms_ButtonHeight = 25.0f; float CMenus::ms_ListheaderHeight = 17.0f; float CMenus::ms_FontmodHeight = 0.8f; IInput::CEvent CMenus::m_aInputEvents[MAX_INPUTEVENTS]; int CMenus::m_NumInputEvents; CMenus::CMenus() { m_Popup = POPUP_NONE; m_ActivePage = PAGE_INTERNET; m_GamePage = PAGE_GAME; m_NeedRestartGraphics = false; m_NeedRestartSound = false; m_NeedSendinfo = false; m_MenuActive = true; m_UseMouseButtons = true; m_EscapePressed = false; m_EnterPressed = false; m_DeletePressed = false; m_NumInputEvents = 0; m_LastInput = time_get(); str_copy(m_aCurrentDemoFolder, "demos", sizeof(m_aCurrentDemoFolder)); m_aCallvoteReason[0] = 0; m_FriendlistSelectedIndex = -1; } vec4 CMenus::ButtonColorMul(const void *pID) { if(UI()->ActiveItem() == pID) return vec4(1,1,1,0.5f); else if(UI()->HotItem() == pID) return vec4(1,1,1,1.5f); return vec4(1,1,1,1); } int CMenus::DoButton_Icon(int ImageId, int SpriteId, const CUIRect *pRect) { Graphics()->TextureSet(g_pData->m_aImages[ImageId].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(SpriteId); IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); return 0; } int CMenus::DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect, bool Active) { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIBUTTONS].m_Id); Graphics()->QuadsBegin(); if(!Active) Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f); RenderTools()->SelectSprite(Checked?SPRITE_GUIBUTTON_ON:SPRITE_GUIBUTTON_OFF); IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h); Graphics()->QuadsDrawTL(&QuadItem, 1); if(UI()->HotItem() == pID && Active) { RenderTools()->SelectSprite(SPRITE_GUIBUTTON_HOVER); IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h); Graphics()->QuadsDrawTL(&QuadItem, 1); } Graphics()->QuadsEnd(); return Active ? UI()->DoButtonLogic(pID, "", Checked, pRect) : 0; } int CMenus::DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect) { RenderTools()->DrawUIRect(pRect, vec4(1,1,1,0.5f)*ButtonColorMul(pID), CUI::CORNER_ALL, 5.0f); CUIRect Temp; pRect->HMargin(pRect->h>=20.0f?2.0f:1.0f, &Temp); UI()->DoLabel(&Temp, pText, Temp.h*ms_FontmodHeight, 0); return UI()->DoButtonLogic(pID, pText, Checked, pRect); } void CMenus::DoButton_KeySelect(const void *pID, const char *pText, int Checked, const CUIRect *pRect) { RenderTools()->DrawUIRect(pRect, vec4(1,1,1,0.5f)*ButtonColorMul(pID), CUI::CORNER_ALL, 5.0f); CUIRect Temp; pRect->HMargin(1.0f, &Temp); UI()->DoLabel(&Temp, pText, Temp.h*ms_FontmodHeight, 0); } int CMenus::DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners) { if(Checked) RenderTools()->DrawUIRect(pRect, ms_ColorTabbarActive, Corners, 10.0f); else RenderTools()->DrawUIRect(pRect, ms_ColorTabbarInactive, Corners, 10.0f); CUIRect Temp; pRect->HMargin(2.0f, &Temp); UI()->DoLabel(&Temp, pText, Temp.h*ms_FontmodHeight, 0); return UI()->DoButtonLogic(pID, pText, Checked, pRect); } int CMenus::DoButton_GridHeader(const void *pID, const char *pText, int Checked, const CUIRect *pRect) //void CMenus::ui_draw_grid_header(const void *id, const char *text, int checked, const CUIRect *r, const void *extra) { if(Checked) RenderTools()->DrawUIRect(pRect, vec4(1,1,1,0.5f), CUI::CORNER_T, 5.0f); CUIRect t; pRect->VSplitLeft(5.0f, 0, &t); UI()->DoLabel(&t, pText, pRect->h*ms_FontmodHeight, -1); return UI()->DoButtonLogic(pID, pText, Checked, pRect); } int CMenus::DoButton_CheckBox_Common(const void *pID, const char *pText, const char *pBoxText, const CUIRect *pRect) //void CMenus::ui_draw_checkbox_common(const void *id, const char *text, const char *boxtext, const CUIRect *r, const void *extra) { CUIRect c = *pRect; CUIRect t = *pRect; c.w = c.h; t.x += c.w; t.w -= c.w; t.VSplitLeft(5.0f, 0, &t); c.Margin(2.0f, &c); RenderTools()->DrawUIRect(&c, vec4(1,1,1,0.25f)*ButtonColorMul(pID), CUI::CORNER_ALL, 3.0f); c.y += 2; UI()->DoLabel(&c, pBoxText, pRect->h*ms_FontmodHeight*0.6f, 0); UI()->DoLabel(&t, pText, pRect->h*ms_FontmodHeight*0.8f, -1); return UI()->DoButtonLogic(pID, pText, 0, pRect); } int CMenus::DoButton_CheckBox(const void *pID, const char *pText, int Checked, const CUIRect *pRect) { return DoButton_CheckBox_Common(pID, pText, Checked?"X":"", pRect); } int CMenus::DoButton_CheckBox_Number(const void *pID, const char *pText, int Checked, const CUIRect *pRect) { char aBuf[16]; str_format(aBuf, sizeof(aBuf), "%d", Checked); return DoButton_CheckBox_Common(pID, pText, aBuf, pRect); } int CMenus::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden, int Corners) { int Inside = UI()->MouseInside(pRect); bool ReturnValue = false; bool UpdateOffset = false; static int s_AtIndex = 0; static bool s_DoScroll = false; static float s_ScrollStart = 0.0f; FontSize *= UI()->Scale(); if(UI()->LastActiveItem() == pID) { int Len = str_length(pStr); if(Len == 0) s_AtIndex = 0; if(Inside && UI()->MouseButton(0)) { s_DoScroll = true; s_ScrollStart = UI()->MouseX(); int MxRel = (int)(UI()->MouseX() - pRect->x); for(int i = 1; i <= Len; i++) { if(TextRender()->TextWidth(0, FontSize, pStr, i) - *Offset > MxRel) { s_AtIndex = i - 1; break; } if(i == Len) s_AtIndex = Len; } } else if(!UI()->MouseButton(0)) s_DoScroll = false; else if(s_DoScroll) { // do scrolling if(UI()->MouseX() < pRect->x && s_ScrollStart-UI()->MouseX() > 10.0f) { s_AtIndex = max(0, s_AtIndex-1); s_ScrollStart = UI()->MouseX(); UpdateOffset = true; } else if(UI()->MouseX() > pRect->x+pRect->w && UI()->MouseX()-s_ScrollStart > 10.0f) { s_AtIndex = min(Len, s_AtIndex+1); s_ScrollStart = UI()->MouseX(); UpdateOffset = true; } } for(int i = 0; i < m_NumInputEvents; i++) { Len = str_length(pStr); int NumChars = Len; ReturnValue |= CLineInput::Manipulate(m_aInputEvents[i], pStr, StrSize, StrSize, &Len, &s_AtIndex, &NumChars); } } bool JustGotActive = false; if(UI()->ActiveItem() == pID) { if(!UI()->MouseButton(0)) { s_AtIndex = min(s_AtIndex, str_length(pStr)); s_DoScroll = false; UI()->SetActiveItem(0); } } else if(UI()->HotItem() == pID) { if(UI()->MouseButton(0)) { if (UI()->LastActiveItem() != pID) JustGotActive = true; UI()->SetActiveItem(pID); } } if(Inside) UI()->SetHotItem(pID); CUIRect Textbox = *pRect; RenderTools()->DrawUIRect(&Textbox, vec4(1, 1, 1, 0.5f), Corners, 3.0f); Textbox.VMargin(2.0f, &Textbox); Textbox.HMargin(2.0f, &Textbox); const char *pDisplayStr = pStr; char aStars[128]; if(Hidden) { unsigned s = str_length(pStr); if(s >= sizeof(aStars)) s = sizeof(aStars)-1; for(unsigned int i = 0; i < s; ++i) aStars[i] = '*'; aStars[s] = 0; pDisplayStr = aStars; } // check if the text has to be moved if(UI()->LastActiveItem() == pID && !JustGotActive && (UpdateOffset || m_NumInputEvents)) { float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex); if(w-*Offset > Textbox.w) { // move to the left float wt = TextRender()->TextWidth(0, FontSize, pDisplayStr, -1); do { *Offset += min(wt-*Offset-Textbox.w, Textbox.w/3); } while(w-*Offset > Textbox.w); } else if(w-*Offset < 0.0f) { // move to the right do { *Offset = max(0.0f, *Offset-Textbox.w/3); } while(w-*Offset < 0.0f); } } UI()->ClipEnable(pRect); Textbox.x -= *Offset; UI()->DoLabel(&Textbox, pDisplayStr, FontSize, -1); // render the cursor if(UI()->LastActiveItem() == pID && !JustGotActive) { float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex); Textbox = *pRect; Textbox.VSplitLeft(2.0f, 0, &Textbox); Textbox.x += (w-*Offset-TextRender()->TextWidth(0, FontSize, "|", -1)/2); if((2*time_get()/time_freq()) % 2) // make it blink UI()->DoLabel(&Textbox, "|", FontSize, -1); } UI()->ClipDisable(); return ReturnValue; } float CMenus::DoScrollbarV(const void *pID, const CUIRect *pRect, float Current) { CUIRect Handle; static float OffsetY; pRect->HSplitTop(33, &Handle, 0); Handle.y += (pRect->h-Handle.h)*Current; // logic float ReturnValue = Current; int Inside = UI()->MouseInside(&Handle); if(UI()->ActiveItem() == pID) { if(!UI()->MouseButton(0)) UI()->SetActiveItem(0); float Min = pRect->y; float Max = pRect->h-Handle.h; float Cur = UI()->MouseY()-OffsetY; ReturnValue = (Cur-Min)/Max; if(ReturnValue < 0.0f) ReturnValue = 0.0f; if(ReturnValue > 1.0f) ReturnValue = 1.0f; } else if(UI()->HotItem() == pID) { if(UI()->MouseButton(0)) { UI()->SetActiveItem(pID); OffsetY = UI()->MouseY()-Handle.y; } } if(Inside) UI()->SetHotItem(pID); // render CUIRect Rail; pRect->VMargin(5.0f, &Rail); RenderTools()->DrawUIRect(&Rail, vec4(1,1,1,0.25f), 0, 0.0f); CUIRect Slider = Handle; Slider.w = Rail.x-Slider.x; RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f), CUI::CORNER_L, 2.5f); Slider.x = Rail.x+Rail.w; RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f), CUI::CORNER_R, 2.5f); Slider = Handle; Slider.Margin(5.0f, &Slider); RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f)*ButtonColorMul(pID), CUI::CORNER_ALL, 2.5f); return ReturnValue; } float CMenus::DoScrollbarH(const void *pID, const CUIRect *pRect, float Current) { CUIRect Handle; static float OffsetX; pRect->VSplitLeft(33, &Handle, 0); Handle.x += (pRect->w-Handle.w)*Current; // logic float ReturnValue = Current; int Inside = UI()->MouseInside(&Handle); if(UI()->ActiveItem() == pID) { if(!UI()->MouseButton(0)) UI()->SetActiveItem(0); float Min = pRect->x; float Max = pRect->w-Handle.w; float Cur = UI()->MouseX()-OffsetX; ReturnValue = (Cur-Min)/Max; if(ReturnValue < 0.0f) ReturnValue = 0.0f; if(ReturnValue > 1.0f) ReturnValue = 1.0f; } else if(UI()->HotItem() == pID) { if(UI()->MouseButton(0)) { UI()->SetActiveItem(pID); OffsetX = UI()->MouseX()-Handle.x; } } if(Inside) UI()->SetHotItem(pID); // render CUIRect Rail; pRect->HMargin(5.0f, &Rail); RenderTools()->DrawUIRect(&Rail, vec4(1,1,1,0.25f), 0, 0.0f); CUIRect Slider = Handle; Slider.h = Rail.y-Slider.y; RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f), CUI::CORNER_T, 2.5f); Slider.y = Rail.y+Rail.h; RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f), CUI::CORNER_B, 2.5f); Slider = Handle; Slider.Margin(5.0f, &Slider); RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f)*ButtonColorMul(pID), CUI::CORNER_ALL, 2.5f); return ReturnValue; } int CMenus::DoKeyReader(void *pID, const CUIRect *pRect, int Key) { // process static void *pGrabbedID = 0; static bool MouseReleased = true; static int ButtonUsed = 0; int Inside = UI()->MouseInside(pRect); int NewKey = Key; if(!UI()->MouseButton(0) && !UI()->MouseButton(1) && pGrabbedID == pID) MouseReleased = true; if(UI()->ActiveItem() == pID) { if(m_Binder.m_GotKey) { // abort with escape key if(m_Binder.m_Key.m_Key != KEY_ESCAPE) NewKey = m_Binder.m_Key.m_Key; m_Binder.m_GotKey = false; UI()->SetActiveItem(0); MouseReleased = false; pGrabbedID = pID; } if(ButtonUsed == 1 && !UI()->MouseButton(1)) { if(Inside) NewKey = 0; UI()->SetActiveItem(0); } } else if(UI()->HotItem() == pID) { if(MouseReleased) { if(UI()->MouseButton(0)) { m_Binder.m_TakeKey = true; m_Binder.m_GotKey = false; UI()->SetActiveItem(pID); ButtonUsed = 0; } if(UI()->MouseButton(1)) { UI()->SetActiveItem(pID); ButtonUsed = 1; } } } if(Inside) UI()->SetHotItem(pID); // draw if (UI()->ActiveItem() == pID && ButtonUsed == 0) DoButton_KeySelect(pID, "???", 0, pRect); else { if(Key == 0) DoButton_KeySelect(pID, "", 0, pRect); else DoButton_KeySelect(pID, Input()->KeyName(Key), 0, pRect); } return NewKey; } int CMenus::RenderMenubar(CUIRect r) { CUIRect Box = r; CUIRect Button; m_ActivePage = g_Config.m_UiPage; int NewPage = -1; if(Client()->State() != IClient::STATE_OFFLINE) m_ActivePage = m_GamePage; if(Client()->State() == IClient::STATE_OFFLINE) { // offline menus if(0) // this is not done yet { Box.VSplitLeft(90.0f, &Button, &Box); static int s_NewsButton=0; if (DoButton_MenuTab(&s_NewsButton, Localize("News"), m_ActivePage==PAGE_NEWS, &Button, 0)) NewPage = PAGE_NEWS; Box.VSplitLeft(30.0f, 0, &Box); } Box.VSplitLeft(100.0f, &Button, &Box); static int s_InternetButton=0; if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), m_ActivePage==PAGE_INTERNET, &Button, CUI::CORNER_TL)) { ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); NewPage = PAGE_INTERNET; } //Box.VSplitLeft(4.0f, 0, &Box); Box.VSplitLeft(80.0f, &Button, &Box); static int s_LanButton=0; if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), m_ActivePage==PAGE_LAN, &Button, 0)) { ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); NewPage = PAGE_LAN; } //box.VSplitLeft(4.0f, 0, &box); Box.VSplitLeft(110.0f, &Button, &Box); static int s_FavoritesButton=0; if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), m_ActivePage==PAGE_FAVORITES, &Button, CUI::CORNER_TR)) { ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); NewPage = PAGE_FAVORITES; } Box.VSplitLeft(4.0f*5, 0, &Box); Box.VSplitLeft(100.0f, &Button, &Box); static int s_DemosButton=0; if(DoButton_MenuTab(&s_DemosButton, Localize("Demos"), m_ActivePage==PAGE_DEMOS, &Button, CUI::CORNER_T)) { DemolistPopulate(); NewPage = PAGE_DEMOS; } } else { // online menus Box.VSplitLeft(90.0f, &Button, &Box); static int s_GameButton=0; if(DoButton_MenuTab(&s_GameButton, Localize("Game"), m_ActivePage==PAGE_GAME, &Button, CUI::CORNER_TL)) NewPage = PAGE_GAME; Box.VSplitLeft(90.0f, &Button, &Box); static int s_PlayersButton=0; if(DoButton_MenuTab(&s_PlayersButton, Localize("Players"), m_ActivePage==PAGE_PLAYERS, &Button, 0)) NewPage = PAGE_PLAYERS; Box.VSplitLeft(130.0f, &Button, &Box); static int s_ServerInfoButton=0; if(DoButton_MenuTab(&s_ServerInfoButton, Localize("Server info"), m_ActivePage==PAGE_SERVER_INFO, &Button, 0)) NewPage = PAGE_SERVER_INFO; Box.VSplitLeft(130.0f, &Button, &Box); static int s_CallVoteButton=0; if(DoButton_MenuTab(&s_CallVoteButton, Localize("Call vote"), m_ActivePage==PAGE_CALLVOTE, &Button, CUI::CORNER_TR)) NewPage = PAGE_CALLVOTE; } /* box.VSplitRight(110.0f, &box, &button); static int system_button=0; if (UI()->DoButton(&system_button, "System", g_Config.m_UiPage==PAGE_SYSTEM, &button)) g_Config.m_UiPage = PAGE_SYSTEM; box.VSplitRight(30.0f, &box, 0); */ Box.VSplitRight(90.0f, &Box, &Button); static int s_QuitButton=0; if(DoButton_MenuTab(&s_QuitButton, Localize("Quit"), 0, &Button, CUI::CORNER_T)) m_Popup = POPUP_QUIT; Box.VSplitRight(10.0f, &Box, &Button); Box.VSplitRight(130.0f, &Box, &Button); static int s_SettingsButton=0; if(DoButton_MenuTab(&s_SettingsButton, Localize("Settings"), m_ActivePage==PAGE_SETTINGS, &Button, CUI::CORNER_T)) NewPage = PAGE_SETTINGS; if(NewPage != -1) { if(Client()->State() == IClient::STATE_OFFLINE) g_Config.m_UiPage = NewPage; else m_GamePage = NewPage; } return 0; } void CMenus::RenderLoading() { // TODO: not supported right now due to separate render thread static int64 LastLoadRender = 0; float Percent = m_LoadCurrent++/(float)m_LoadTotal; // make sure that we don't render for each little thing we load // because that will slow down loading if we have vsync if(time_get()-LastLoadRender < time_freq()/60) return; LastLoadRender = time_get(); // need up date this here to get correct vec3 Rgb = HslToRgb(vec3(g_Config.m_UiColorHue/255.0f, g_Config.m_UiColorSat/255.0f, g_Config.m_UiColorLht/255.0f)); ms_GuiColor = vec4(Rgb.r, Rgb.g, Rgb.b, g_Config.m_UiColorAlpha/255.0f); CUIRect Screen = *UI()->Screen(); Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); RenderBackground(); float w = 700; float h = 200; float x = Screen.w/2-w/2; float y = Screen.h/2-h/2; Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.50f); RenderTools()->DrawRoundRect(x, y, w, h, 40.0f); Graphics()->QuadsEnd(); const char *pCaption = Localize("Loading"); CUIRect r; r.x = x; r.y = y+20; r.w = w; r.h = h; UI()->DoLabel(&r, pCaption, 48.0f, 0, -1); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(1,1,1,0.75f); RenderTools()->DrawRoundRect(x+40, y+h-75, (w-80)*Percent, 25, 5.0f); Graphics()->QuadsEnd(); Graphics()->Swap(); } void CMenus::RenderNews(CUIRect MainView) { RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); } void CMenus::OnInit() { /* array my_strings; array::range r2; my_strings.add("4"); my_strings.add("6"); my_strings.add("1"); my_strings.add("3"); my_strings.add("7"); my_strings.add("5"); my_strings.add("2"); for(array::range r = my_strings.all(); !r.empty(); r.pop_front()) dbg_msg("", "%s", r.front().cstr()); sort(my_strings.all()); dbg_msg("", "after:"); for(array::range r = my_strings.all(); !r.empty(); r.pop_front()) dbg_msg("", "%s", r.front().cstr()); array myarray; myarray.add(4); myarray.add(6); myarray.add(1); myarray.add(3); myarray.add(7); myarray.add(5); myarray.add(2); for(array::range r = myarray.all(); !r.empty(); r.pop_front()) dbg_msg("", "%d", r.front()); sort(myarray.all()); sort_verify(myarray.all()); dbg_msg("", "after:"); for(array::range r = myarray.all(); !r.empty(); r.pop_front()) dbg_msg("", "%d", r.front()); exit(-1); // */ if(g_Config.m_ClShowWelcome) m_Popup = POPUP_LANGUAGE; g_Config.m_ClShowWelcome = 0; Console()->Chain("add_favorite", ConchainServerbrowserUpdate, this); Console()->Chain("remove_favorite", ConchainServerbrowserUpdate, this); Console()->Chain("add_friend", ConchainFriendlistUpdate, this); Console()->Chain("remove_friend", ConchainFriendlistUpdate, this); // setup load amount m_LoadCurrent = 0; m_LoadTotal = g_pData->m_NumImages; if(!g_Config.m_ClThreadsoundloading) m_LoadTotal += g_pData->m_NumSounds; } void CMenus::PopupMessage(const char *pTopic, const char *pBody, const char *pButton) { // reset active item UI()->SetActiveItem(0); str_copy(m_aMessageTopic, pTopic, sizeof(m_aMessageTopic)); str_copy(m_aMessageBody, pBody, sizeof(m_aMessageBody)); str_copy(m_aMessageButton, pButton, sizeof(m_aMessageButton)); m_Popup = POPUP_MESSAGE; } int CMenus::Render() { CUIRect Screen = *UI()->Screen(); Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); static bool s_First = true; if(s_First) { if(g_Config.m_UiPage == PAGE_INTERNET) ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); else if(g_Config.m_UiPage == PAGE_LAN) ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); else if(g_Config.m_UiPage == PAGE_FAVORITES) ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); m_pClient->m_pSounds->Enqueue(CSounds::CHN_MUSIC, SOUND_MENU); s_First = false; } if(Client()->State() == IClient::STATE_ONLINE) { ms_ColorTabbarInactive = ms_ColorTabbarInactiveIngame; ms_ColorTabbarActive = ms_ColorTabbarActiveIngame; } else { RenderBackground(); ms_ColorTabbarInactive = ms_ColorTabbarInactiveOutgame; ms_ColorTabbarActive = ms_ColorTabbarActiveOutgame; } CUIRect TabBar; CUIRect MainView; // some margin around the screen Screen.Margin(10.0f, &Screen); static bool s_SoundCheck = false; if(!s_SoundCheck && m_Popup == POPUP_NONE) { if(Client()->SoundInitFailed()) m_Popup = POPUP_SOUNDERROR; s_SoundCheck = true; } if(m_Popup == POPUP_NONE) { // do tab bar Screen.HSplitTop(24.0f, &TabBar, &MainView); TabBar.VMargin(20.0f, &TabBar); RenderMenubar(TabBar); // news is not implemented yet if(g_Config.m_UiPage <= PAGE_NEWS || g_Config.m_UiPage > PAGE_SETTINGS || (Client()->State() == IClient::STATE_OFFLINE && g_Config.m_UiPage >= PAGE_GAME && g_Config.m_UiPage <= PAGE_CALLVOTE)) { ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); g_Config.m_UiPage = PAGE_INTERNET; } // render current page if(Client()->State() != IClient::STATE_OFFLINE) { if(m_GamePage == PAGE_GAME) RenderGame(MainView); else if(m_GamePage == PAGE_PLAYERS) RenderPlayers(MainView); else if(m_GamePage == PAGE_SERVER_INFO) RenderServerInfo(MainView); else if(m_GamePage == PAGE_CALLVOTE) RenderServerControl(MainView); else if(m_GamePage == PAGE_SETTINGS) RenderSettings(MainView); } else if(g_Config.m_UiPage == PAGE_NEWS) RenderNews(MainView); else if(g_Config.m_UiPage == PAGE_INTERNET) RenderServerbrowser(MainView); else if(g_Config.m_UiPage == PAGE_LAN) RenderServerbrowser(MainView); else if(g_Config.m_UiPage == PAGE_DEMOS) RenderDemoList(MainView); else if(g_Config.m_UiPage == PAGE_FAVORITES) RenderServerbrowser(MainView); else if(g_Config.m_UiPage == PAGE_SETTINGS) RenderSettings(MainView); } else { // make sure that other windows doesn't do anything funnay! //UI()->SetHotItem(0); //UI()->SetActiveItem(0); char aBuf[128]; const char *pTitle = ""; const char *pExtraText = ""; const char *pButtonText = ""; int ExtraAlign = 0; if(m_Popup == POPUP_MESSAGE) { pTitle = m_aMessageTopic; pExtraText = m_aMessageBody; pButtonText = m_aMessageButton; } else if(m_Popup == POPUP_CONNECTING) { pTitle = Localize("Connecting to"); pExtraText = g_Config.m_UiServerAddress; // TODO: query the client about the address pButtonText = Localize("Abort"); if(Client()->MapDownloadTotalsize() > 0) { pTitle = Localize("Downloading map"); pExtraText = ""; } } else if(m_Popup == POPUP_DISCONNECTED) { pTitle = Localize("Disconnected"); pExtraText = Client()->ErrorString(); pButtonText = Localize("Ok"); ExtraAlign = -1; } else if(m_Popup == POPUP_PURE) { pTitle = Localize("Disconnected"); pExtraText = Localize("The server is running a non-standard tuning on a pure game type."); pButtonText = Localize("Ok"); ExtraAlign = -1; } else if(m_Popup == POPUP_DELETE_DEMO) { pTitle = Localize("Delete demo"); pExtraText = Localize("Are you sure that you want to delete the demo?"); ExtraAlign = -1; } else if(m_Popup == POPUP_RENAME_DEMO) { pTitle = Localize("Rename demo"); pExtraText = ""; ExtraAlign = -1; } else if(m_Popup == POPUP_REMOVE_FRIEND) { pTitle = Localize("Remove friend"); pExtraText = Localize("Are you sure that you want to remove the player from your friends list?"); ExtraAlign = -1; } else if(m_Popup == POPUP_SOUNDERROR) { pTitle = Localize("Sound error"); pExtraText = Localize("The audio device couldn't be initialised."); pButtonText = Localize("Ok"); ExtraAlign = -1; } else if(m_Popup == POPUP_PASSWORD) { pTitle = Localize("Password incorrect"); pExtraText = ""; pButtonText = Localize("Try again"); } else if(m_Popup == POPUP_QUIT) { pTitle = Localize("Quit"); pExtraText = Localize("Are you sure that you want to quit?"); ExtraAlign = -1; } else if(m_Popup == POPUP_FIRST_LAUNCH) { pTitle = Localize("Welcome to Teeworlds"); pExtraText = Localize("As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server."); pButtonText = Localize("Ok"); ExtraAlign = -1; } CUIRect Box, Part; Box = Screen; Box.VMargin(150.0f/UI()->Scale(), &Box); Box.HMargin(150.0f/UI()->Scale(), &Box); // render the box RenderTools()->DrawUIRect(&Box, vec4(0,0,0,0.5f), CUI::CORNER_ALL, 15.0f); Box.HSplitTop(20.f/UI()->Scale(), &Part, &Box); Box.HSplitTop(24.f/UI()->Scale(), &Part, &Box); UI()->DoLabelScaled(&Part, pTitle, 24.f, 0); Box.HSplitTop(20.f/UI()->Scale(), &Part, &Box); Box.HSplitTop(24.f/UI()->Scale(), &Part, &Box); Part.VMargin(20.f/UI()->Scale(), &Part); if(ExtraAlign == -1) UI()->DoLabelScaled(&Part, pExtraText, 20.f, -1, (int)Part.w); else UI()->DoLabelScaled(&Part, pExtraText, 20.f, 0, -1); if(m_Popup == POPUP_QUIT) { CUIRect Yes, No; Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); // additional info Box.HSplitTop(10.0f, 0, &Box); Box.VMargin(20.f/UI()->Scale(), &Box); if(m_pClient->Editor()->HasUnsavedData()) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "%s\n%s", Localize("There's an unsaved map in the editor, you might want to save it before you quit the game."), Localize("Quit anyway?")); UI()->DoLabelScaled(&Box, aBuf, 20.f, -1, Part.w-20.0f); } // buttons Part.VMargin(80.0f, &Part); Part.VSplitMid(&No, &Yes); Yes.VMargin(20.0f, &Yes); No.VMargin(20.0f, &No); static int s_ButtonAbort = 0; if(DoButton_Menu(&s_ButtonAbort, Localize("No"), 0, &No) || m_EscapePressed) m_Popup = POPUP_NONE; static int s_ButtonTryAgain = 0; if(DoButton_Menu(&s_ButtonTryAgain, Localize("Yes"), 0, &Yes) || m_EnterPressed) Client()->Quit(); } else if(m_Popup == POPUP_PASSWORD) { CUIRect Label, TextBox, TryAgain, Abort; Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VMargin(80.0f, &Part); Part.VSplitMid(&Abort, &TryAgain); TryAgain.VMargin(20.0f, &TryAgain); Abort.VMargin(20.0f, &Abort); static int s_ButtonAbort = 0; if(DoButton_Menu(&s_ButtonAbort, Localize("Abort"), 0, &Abort) || m_EscapePressed) m_Popup = POPUP_NONE; static int s_ButtonTryAgain = 0; if(DoButton_Menu(&s_ButtonTryAgain, Localize("Try again"), 0, &TryAgain) || m_EnterPressed) { Client()->Connect(g_Config.m_UiServerAddress); } Box.HSplitBottom(60.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VSplitLeft(60.0f, 0, &Label); Label.VSplitLeft(100.0f, 0, &TextBox); TextBox.VSplitLeft(20.0f, 0, &TextBox); TextBox.VSplitRight(60.0f, &TextBox, 0); UI()->DoLabel(&Label, Localize("Password"), 18.0f, -1); static float Offset = 0.0f; DoEditBox(&g_Config.m_Password, &TextBox, g_Config.m_Password, sizeof(g_Config.m_Password), 12.0f, &Offset, true); } else if(m_Popup == POPUP_CONNECTING) { Box = Screen; Box.VMargin(150.0f, &Box); Box.HMargin(150.0f, &Box); Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VMargin(120.0f, &Part); static int s_Button = 0; if(DoButton_Menu(&s_Button, pButtonText, 0, &Part) || m_EscapePressed || m_EnterPressed) { Client()->Disconnect(); m_Popup = POPUP_NONE; } if(Client()->MapDownloadTotalsize() > 0) { int64 Now = time_get(); if(Now-m_DownloadLastCheckTime >= time_freq()) { if(m_DownloadLastCheckSize > Client()->MapDownloadAmount()) { // map downloaded restarted m_DownloadLastCheckSize = 0; } // update download speed float Diff = (Client()->MapDownloadAmount()-m_DownloadLastCheckSize)/((int)((Now-m_DownloadLastCheckTime)/time_freq())); float StartDiff = m_DownloadLastCheckSize-0.0f; if(StartDiff+Diff > 0.0f) m_DownloadSpeed = (Diff/(StartDiff+Diff))*(Diff/1.0f) + (StartDiff/(Diff+StartDiff))*m_DownloadSpeed; else m_DownloadSpeed = 0.0f; m_DownloadLastCheckTime = Now; m_DownloadLastCheckSize = Client()->MapDownloadAmount(); } Box.HSplitTop(64.f, 0, &Box); Box.HSplitTop(24.f, &Part, &Box); str_format(aBuf, sizeof(aBuf), "%d/%d KiB (%.1f KiB/s)", Client()->MapDownloadAmount()/1024, Client()->MapDownloadTotalsize()/1024, m_DownloadSpeed/1024.0f); UI()->DoLabel(&Part, aBuf, 20.f, 0, -1); // time left const char *pTimeLeftString; int TimeLeft = max(1, m_DownloadSpeed > 0.0f ? static_cast((Client()->MapDownloadTotalsize()-Client()->MapDownloadAmount())/m_DownloadSpeed) : 1); if(TimeLeft >= 60) { TimeLeft /= 60; pTimeLeftString = TimeLeft == 1 ? Localize("%i minute left") : Localize("%i minutes left"); } else pTimeLeftString = TimeLeft == 1 ? Localize("%i second left") : Localize("%i seconds left"); Box.HSplitTop(20.f, 0, &Box); Box.HSplitTop(24.f, &Part, &Box); str_format(aBuf, sizeof(aBuf), pTimeLeftString, TimeLeft); UI()->DoLabel(&Part, aBuf, 20.f, 0, -1); // progress bar Box.HSplitTop(20.f, 0, &Box); Box.HSplitTop(24.f, &Part, &Box); Part.VMargin(40.0f, &Part); RenderTools()->DrawUIRect(&Part, vec4(1.0f, 1.0f, 1.0f, 0.25f), CUI::CORNER_ALL, 5.0f); Part.w = max(10.0f, (Part.w*Client()->MapDownloadAmount())/Client()->MapDownloadTotalsize()); RenderTools()->DrawUIRect(&Part, vec4(1.0f, 1.0f, 1.0f, 0.5f), CUI::CORNER_ALL, 5.0f); } } else if(m_Popup == POPUP_LANGUAGE) { Box = Screen; Box.VMargin(150.0f, &Box); Box.HMargin(150.0f, &Box); Box.HSplitTop(20.f, &Part, &Box); Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Box.HSplitBottom(20.f, &Box, 0); Box.VMargin(20.0f, &Box); RenderLanguageSelection(Box); Part.VMargin(120.0f, &Part); static int s_Button = 0; if(DoButton_Menu(&s_Button, Localize("Ok"), 0, &Part) || m_EscapePressed || m_EnterPressed) m_Popup = POPUP_FIRST_LAUNCH; } else if(m_Popup == POPUP_COUNTRY) { Box = Screen; Box.VMargin(150.0f, &Box); Box.HMargin(150.0f, &Box); Box.HSplitTop(20.f, &Part, &Box); Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Box.HSplitBottom(20.f, &Box, 0); Box.VMargin(20.0f, &Box); static int ActSelection = -2; if(ActSelection == -2) ActSelection = g_Config.m_BrFilterCountryIndex; static float s_ScrollValue = 0.0f; int OldSelected = -1; UiDoListboxStart(&s_ScrollValue, &Box, 50.0f, Localize("Country"), "", m_pClient->m_pCountryFlags->Num(), 6, OldSelected, s_ScrollValue); for(int i = 0; i < m_pClient->m_pCountryFlags->Num(); ++i) { const CCountryFlags::CCountryFlag *pEntry = m_pClient->m_pCountryFlags->GetByIndex(i); if(pEntry->m_CountryCode == ActSelection) OldSelected = i; CListboxItem Item = UiDoListboxNextItem(&pEntry->m_CountryCode, OldSelected == i); if(Item.m_Visible) { CUIRect Label; Item.m_Rect.Margin(5.0f, &Item.m_Rect); Item.m_Rect.HSplitBottom(10.0f, &Item.m_Rect, &Label); float OldWidth = Item.m_Rect.w; Item.m_Rect.w = Item.m_Rect.h*2; Item.m_Rect.x += (OldWidth-Item.m_Rect.w)/ 2.0f; vec4 Color(1.0f, 1.0f, 1.0f, 1.0f); m_pClient->m_pCountryFlags->Render(pEntry->m_CountryCode, &Color, Item.m_Rect.x, Item.m_Rect.y, Item.m_Rect.w, Item.m_Rect.h); UI()->DoLabel(&Label, pEntry->m_aCountryCodeString, 10.0f, 0); } } const int NewSelected = UiDoListboxEnd(&s_ScrollValue, 0); if(OldSelected != NewSelected) ActSelection = m_pClient->m_pCountryFlags->GetByIndex(NewSelected)->m_CountryCode; Part.VMargin(120.0f, &Part); static int s_Button = 0; if(DoButton_Menu(&s_Button, Localize("Ok"), 0, &Part) || m_EnterPressed) { g_Config.m_BrFilterCountryIndex = ActSelection; Client()->ServerBrowserUpdate(); m_Popup = POPUP_NONE; } if(m_EscapePressed) { ActSelection = g_Config.m_BrFilterCountryIndex; m_Popup = POPUP_NONE; } } else if(m_Popup == POPUP_DELETE_DEMO) { CUIRect Yes, No; Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VMargin(80.0f, &Part); Part.VSplitMid(&No, &Yes); Yes.VMargin(20.0f, &Yes); No.VMargin(20.0f, &No); static int s_ButtonAbort = 0; if(DoButton_Menu(&s_ButtonAbort, Localize("No"), 0, &No) || m_EscapePressed) m_Popup = POPUP_NONE; static int s_ButtonTryAgain = 0; if(DoButton_Menu(&s_ButtonTryAgain, Localize("Yes"), 0, &Yes) || m_EnterPressed) { m_Popup = POPUP_NONE; // delete demo if(m_DemolistSelectedIndex >= 0 && !m_DemolistSelectedIsDir) { char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%s/%s", m_aCurrentDemoFolder, m_lDemos[m_DemolistSelectedIndex].m_aFilename); if(Storage()->RemoveFile(aBuf, m_lDemos[m_DemolistSelectedIndex].m_StorageType)) { DemolistPopulate(); DemolistOnUpdate(false); } else PopupMessage(Localize("Error"), Localize("Unable to delete the demo"), Localize("Ok")); } } } else if(m_Popup == POPUP_RENAME_DEMO) { CUIRect Label, TextBox, Ok, Abort; Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VMargin(80.0f, &Part); Part.VSplitMid(&Abort, &Ok); Ok.VMargin(20.0f, &Ok); Abort.VMargin(20.0f, &Abort); static int s_ButtonAbort = 0; if(DoButton_Menu(&s_ButtonAbort, Localize("Abort"), 0, &Abort) || m_EscapePressed) m_Popup = POPUP_NONE; static int s_ButtonOk = 0; if(DoButton_Menu(&s_ButtonOk, Localize("Ok"), 0, &Ok) || m_EnterPressed) { m_Popup = POPUP_NONE; // rename demo if(m_DemolistSelectedIndex >= 0 && !m_DemolistSelectedIsDir) { char aBufOld[512]; str_format(aBufOld, sizeof(aBufOld), "%s/%s", m_aCurrentDemoFolder, m_lDemos[m_DemolistSelectedIndex].m_aFilename); int Length = str_length(m_aCurrentDemoFile); char aBufNew[512]; if(Length <= 4 || m_aCurrentDemoFile[Length-5] != '.' || str_comp_nocase(m_aCurrentDemoFile+Length-4, "demo")) str_format(aBufNew, sizeof(aBufNew), "%s/%s.demo", m_aCurrentDemoFolder, m_aCurrentDemoFile); else str_format(aBufNew, sizeof(aBufNew), "%s/%s", m_aCurrentDemoFolder, m_aCurrentDemoFile); if(Storage()->RenameFile(aBufOld, aBufNew, m_lDemos[m_DemolistSelectedIndex].m_StorageType)) { DemolistPopulate(); DemolistOnUpdate(false); } else PopupMessage(Localize("Error"), Localize("Unable to rename the demo"), Localize("Ok")); } } Box.HSplitBottom(60.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VSplitLeft(60.0f, 0, &Label); Label.VSplitLeft(120.0f, 0, &TextBox); TextBox.VSplitLeft(20.0f, 0, &TextBox); TextBox.VSplitRight(60.0f, &TextBox, 0); UI()->DoLabel(&Label, Localize("New name:"), 18.0f, -1); static float Offset = 0.0f; DoEditBox(&Offset, &TextBox, m_aCurrentDemoFile, sizeof(m_aCurrentDemoFile), 12.0f, &Offset); } else if(m_Popup == POPUP_REMOVE_FRIEND) { CUIRect Yes, No; Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VMargin(80.0f, &Part); Part.VSplitMid(&No, &Yes); Yes.VMargin(20.0f, &Yes); No.VMargin(20.0f, &No); static int s_ButtonAbort = 0; if(DoButton_Menu(&s_ButtonAbort, Localize("No"), 0, &No) || m_EscapePressed) m_Popup = POPUP_NONE; static int s_ButtonTryAgain = 0; if(DoButton_Menu(&s_ButtonTryAgain, Localize("Yes"), 0, &Yes) || m_EnterPressed) { m_Popup = POPUP_NONE; // remove friend if(m_FriendlistSelectedIndex >= 0) { m_pClient->Friends()->RemoveFriend(m_lFriends[m_FriendlistSelectedIndex].m_pFriendInfo->m_aName, m_lFriends[m_FriendlistSelectedIndex].m_pFriendInfo->m_aClan); FriendlistOnUpdate(); Client()->ServerBrowserUpdate(); } } } else if(m_Popup == POPUP_FIRST_LAUNCH) { CUIRect Label, TextBox; Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VMargin(80.0f, &Part); static int s_EnterButton = 0; if(DoButton_Menu(&s_EnterButton, Localize("Enter"), 0, &Part) || m_EnterPressed) m_Popup = POPUP_NONE; Box.HSplitBottom(40.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VSplitLeft(60.0f, 0, &Label); Label.VSplitLeft(100.0f, 0, &TextBox); TextBox.VSplitLeft(20.0f, 0, &TextBox); TextBox.VSplitRight(60.0f, &TextBox, 0); UI()->DoLabel(&Label, Localize("Nickname"), 18.0f, -1); static float Offset = 0.0f; DoEditBox(&g_Config.m_PlayerName, &TextBox, g_Config.m_PlayerName, sizeof(g_Config.m_PlayerName), 12.0f, &Offset); } else { Box.HSplitBottom(20.f, &Box, &Part); Box.HSplitBottom(24.f, &Box, &Part); Part.VMargin(120.0f, &Part); static int s_Button = 0; if(DoButton_Menu(&s_Button, pButtonText, 0, &Part) || m_EscapePressed || m_EnterPressed) m_Popup = POPUP_NONE; } if(m_Popup == POPUP_NONE) UI()->SetActiveItem(0); } return 0; } void CMenus::SetActive(bool Active) { m_MenuActive = Active; if(!m_MenuActive) { if(m_NeedSendinfo) { m_pClient->SendInfo(false); m_NeedSendinfo = false; } if(Client()->State() == IClient::STATE_ONLINE) { m_pClient->OnRelease(); } } else if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { m_pClient->OnRelease(); } } void CMenus::OnReset() { } bool CMenus::OnMouseMove(float x, float y) { m_LastInput = time_get(); if(!m_MenuActive) return false; UI()->ConvertMouseMove(&x, &y); m_MousePos.x += x; m_MousePos.y += y; if(m_MousePos.x < 0) m_MousePos.x = 0; if(m_MousePos.y < 0) m_MousePos.y = 0; if(m_MousePos.x > Graphics()->ScreenWidth()) m_MousePos.x = Graphics()->ScreenWidth(); if(m_MousePos.y > Graphics()->ScreenHeight()) m_MousePos.y = Graphics()->ScreenHeight(); return true; } bool CMenus::OnInput(IInput::CEvent e) { m_LastInput = time_get(); // special handle esc and enter for popup purposes if(e.m_Flags&IInput::FLAG_PRESS) { if(e.m_Key == KEY_ESCAPE) { m_EscapePressed = true; SetActive(!IsActive()); return true; } } if(IsActive()) { if(e.m_Flags&IInput::FLAG_PRESS) { // special for popups if(e.m_Key == KEY_RETURN || e.m_Key == KEY_KP_ENTER) m_EnterPressed = true; else if(e.m_Key == KEY_DELETE) m_DeletePressed = true; } if(m_NumInputEvents < MAX_INPUTEVENTS) m_aInputEvents[m_NumInputEvents++] = e; return true; } return false; } void CMenus::OnStateChange(int NewState, int OldState) { // reset active item UI()->SetActiveItem(0); if(NewState == IClient::STATE_OFFLINE) { if(OldState >= IClient::STATE_ONLINE && NewState < IClient::STATE_QUITING) m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f); m_Popup = POPUP_NONE; if(Client()->ErrorString() && Client()->ErrorString()[0] != 0) { if(str_find(Client()->ErrorString(), "password")) { m_Popup = POPUP_PASSWORD; UI()->SetHotItem(&g_Config.m_Password); UI()->SetActiveItem(&g_Config.m_Password); } else m_Popup = POPUP_DISCONNECTED; } } else if(NewState == IClient::STATE_LOADING) { m_Popup = POPUP_CONNECTING; m_DownloadLastCheckTime = time_get(); m_DownloadLastCheckSize = 0; m_DownloadSpeed = 0.0f; //client_serverinfo_request(); } else if(NewState == IClient::STATE_CONNECTING) m_Popup = POPUP_CONNECTING; else if (NewState == IClient::STATE_ONLINE || NewState == IClient::STATE_DEMOPLAYBACK) { m_Popup = POPUP_NONE; SetActive(false); } } extern "C" void font_debug_render(); void CMenus::OnRender() { /* // text rendering test stuff render_background(); CTextCursor cursor; TextRender()->SetCursor(&cursor, 10, 10, 20, TEXTFLAG_RENDER); TextRender()->TextEx(&cursor, "ようこそ - ガイド", -1); TextRender()->SetCursor(&cursor, 10, 30, 15, TEXTFLAG_RENDER); TextRender()->TextEx(&cursor, "ようこそ - ガイド", -1); //Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->QuadsDrawTL(60, 60, 5000, 5000); Graphics()->QuadsEnd(); return;*/ if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) SetActive(true); if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { CUIRect Screen = *UI()->Screen(); Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); RenderDemoPlayer(Screen); } if(Client()->State() == IClient::STATE_ONLINE && m_pClient->m_ServerMode == m_pClient->SERVERMODE_PUREMOD) { Client()->Disconnect(); SetActive(true); m_Popup = POPUP_PURE; } if(!IsActive()) { m_EscapePressed = false; m_EnterPressed = false; m_DeletePressed = false; m_NumInputEvents = 0; return; } // update colors vec3 Rgb = HslToRgb(vec3(g_Config.m_UiColorHue/255.0f, g_Config.m_UiColorSat/255.0f, g_Config.m_UiColorLht/255.0f)); ms_GuiColor = vec4(Rgb.r, Rgb.g, Rgb.b, g_Config.m_UiColorAlpha/255.0f); ms_ColorTabbarInactiveOutgame = vec4(0,0,0,0.25f); ms_ColorTabbarActiveOutgame = vec4(0,0,0,0.5f); float ColorIngameScaleI = 0.5f; float ColorIngameAcaleA = 0.2f; ms_ColorTabbarInactiveIngame = vec4( ms_GuiColor.r*ColorIngameScaleI, ms_GuiColor.g*ColorIngameScaleI, ms_GuiColor.b*ColorIngameScaleI, ms_GuiColor.a*0.8f); ms_ColorTabbarActiveIngame = vec4( ms_GuiColor.r*ColorIngameAcaleA, ms_GuiColor.g*ColorIngameAcaleA, ms_GuiColor.b*ColorIngameAcaleA, ms_GuiColor.a); // update the ui CUIRect *pScreen = UI()->Screen(); float mx = (m_MousePos.x/(float)Graphics()->ScreenWidth())*pScreen->w; float my = (m_MousePos.y/(float)Graphics()->ScreenHeight())*pScreen->h; int Buttons = 0; if(m_UseMouseButtons) { if(Input()->KeyPressed(KEY_MOUSE_1)) Buttons |= 1; if(Input()->KeyPressed(KEY_MOUSE_2)) Buttons |= 2; if(Input()->KeyPressed(KEY_MOUSE_3)) Buttons |= 4; } UI()->Update(mx,my,mx*3.0f,my*3.0f,Buttons); // render if(Client()->State() != IClient::STATE_DEMOPLAYBACK) Render(); // render cursor Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id); Graphics()->QuadsBegin(); Graphics()->SetColor(1,1,1,1); IGraphics::CQuadItem QuadItem(mx, my, 24, 24); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); // render debug information if(g_Config.m_Debug) { CUIRect Screen = *UI()->Screen(); Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h); char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%p %p %p", UI()->HotItem(), UI()->ActiveItem(), UI()->LastActiveItem()); CTextCursor Cursor; TextRender()->SetCursor(&Cursor, 10, 10, 10, TEXTFLAG_RENDER); TextRender()->TextEx(&Cursor, aBuf, -1); } m_EscapePressed = false; m_EnterPressed = false; m_DeletePressed = false; m_NumInputEvents = 0; } static int gs_TextureBlob = -1; void CMenus::RenderBackground() { //Graphics()->Clear(1,1,1); //render_sunrays(0,0); if(gs_TextureBlob == -1) gs_TextureBlob = Graphics()->LoadTexture("blob.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); float sw = 300*Graphics()->ScreenAspect(); float sh = 300; Graphics()->MapScreen(0, 0, sw, sh); // render background color Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); //vec4 bottom(gui_color.r*0.3f, gui_color.g*0.3f, gui_color.b*0.3f, 1.0f); //vec4 bottom(0, 0, 0, 1.0f); vec4 Bottom(ms_GuiColor.r, ms_GuiColor.g, ms_GuiColor.b, 1.0f); vec4 Top(ms_GuiColor.r, ms_GuiColor.g, ms_GuiColor.b, 1.0f); IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex(0, Top.r, Top.g, Top.b, Top.a), IGraphics::CColorVertex(1, Top.r, Top.g, Top.b, Top.a), IGraphics::CColorVertex(2, Bottom.r, Bottom.g, Bottom.b, Bottom.a), IGraphics::CColorVertex(3, Bottom.r, Bottom.g, Bottom.b, Bottom.a)}; Graphics()->SetColorVertex(Array, 4); IGraphics::CQuadItem QuadItem(0, 0, sw, sh); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); // render the tiles Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); float Size = 15.0f; float OffsetTime = fmod(Client()->LocalTime()*0.15f, 2.0f); for(int y = -2; y < (int)(sw/Size); y++) for(int x = -2; x < (int)(sh/Size); x++) { Graphics()->SetColor(0,0,0,0.045f); IGraphics::CQuadItem QuadItem((x-OffsetTime)*Size*2+(y&1)*Size, (y+OffsetTime)*Size, Size, Size); Graphics()->QuadsDrawTL(&QuadItem, 1); } Graphics()->QuadsEnd(); // render border fade Graphics()->TextureSet(gs_TextureBlob); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.5f); QuadItem = IGraphics::CQuadItem(-100, -100, sw+200, sh+200); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); // restore screen {CUIRect Screen = *UI()->Screen(); Graphics()->MapScreen(Screen.x, Screen.y, Screen.w, Screen.h);} } teeworlds-0.6.2+dfsg/src/game/client/components/menus.h0000644000175000017500000002243312140200333022101 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_MENUS_H #define GAME_CLIENT_COMPONENTS_MENUS_H #include #include #include #include #include #include #include // compnent to fetch keypresses, override all other input class CMenusKeyBinder : public CComponent { public: bool m_TakeKey; bool m_GotKey; IInput::CEvent m_Key; CMenusKeyBinder(); virtual bool OnInput(IInput::CEvent Event); }; class CMenus : public CComponent { static vec4 ms_GuiColor; static vec4 ms_ColorTabbarInactiveOutgame; static vec4 ms_ColorTabbarActiveOutgame; static vec4 ms_ColorTabbarInactiveIngame; static vec4 ms_ColorTabbarActiveIngame; static vec4 ms_ColorTabbarInactive; static vec4 ms_ColorTabbarActive; vec4 ButtonColorMul(const void *pID); int DoButton_DemoPlayer(const void *pID, const char *pText, int Checked, const CUIRect *pRect); int DoButton_Sprite(const void *pID, int ImageID, int SpriteID, int Checked, const CUIRect *pRect, int Corners); int DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect, bool Active); int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect); int DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners); int DoButton_CheckBox_Common(const void *pID, const char *pText, const char *pBoxText, const CUIRect *pRect); int DoButton_CheckBox(const void *pID, const char *pText, int Checked, const CUIRect *pRect); int DoButton_CheckBox_Number(const void *pID, const char *pText, int Checked, const CUIRect *pRect); /*static void ui_draw_menu_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra); static void ui_draw_keyselect_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra); static void ui_draw_menu_tab_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra); static void ui_draw_settings_tab_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra); */ int DoButton_Icon(int ImageId, int SpriteId, const CUIRect *pRect); int DoButton_GridHeader(const void *pID, const char *pText, int Checked, const CUIRect *pRect); //static void ui_draw_browse_icon(int what, const CUIRect *r); //static void ui_draw_grid_header(const void *id, const char *text, int checked, const CUIRect *r, const void *extra); /*static void ui_draw_checkbox_common(const void *id, const char *text, const char *boxtext, const CUIRect *r, const void *extra); static void ui_draw_checkbox(const void *id, const char *text, int checked, const CUIRect *r, const void *extra); static void ui_draw_checkbox_number(const void *id, const char *text, int checked, const CUIRect *r, const void *extra); */ int DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden=false, int Corners=CUI::CORNER_ALL); //static int ui_do_edit_box(void *id, const CUIRect *rect, char *str, unsigned str_size, float font_size, bool hidden=false); float DoScrollbarV(const void *pID, const CUIRect *pRect, float Current); float DoScrollbarH(const void *pID, const CUIRect *pRect, float Current); void DoButton_KeySelect(const void *pID, const char *pText, int Checked, const CUIRect *pRect); int DoKeyReader(void *pID, const CUIRect *pRect, int Key); //static int ui_do_key_reader(void *id, const CUIRect *rect, int key); void UiDoGetButtons(int Start, int Stop, CUIRect View); struct CListboxItem { int m_Visible; int m_Selected; CUIRect m_Rect; CUIRect m_HitRect; }; void UiDoListboxStart(const void *pID, const CUIRect *pRect, float RowHeight, const char *pTitle, const char *pBottomText, int NumItems, int ItemsPerRow, int SelectedIndex, float ScrollValue); CListboxItem UiDoListboxNextItem(const void *pID, bool Selected = false); CListboxItem UiDoListboxNextRow(); int UiDoListboxEnd(float *pScrollValue, bool *pItemActivated); //static void demolist_listdir_callback(const char *name, int is_dir, void *user); //static void demolist_list_callback(const CUIRect *rect, int index, void *user); enum { POPUP_NONE=0, POPUP_FIRST_LAUNCH, POPUP_CONNECTING, POPUP_MESSAGE, POPUP_DISCONNECTED, POPUP_PURE, POPUP_LANGUAGE, POPUP_COUNTRY, POPUP_DELETE_DEMO, POPUP_RENAME_DEMO, POPUP_REMOVE_FRIEND, POPUP_SOUNDERROR, POPUP_PASSWORD, POPUP_QUIT, }; enum { PAGE_NEWS=1, PAGE_GAME, PAGE_PLAYERS, PAGE_SERVER_INFO, PAGE_CALLVOTE, PAGE_INTERNET, PAGE_LAN, PAGE_FAVORITES, PAGE_DEMOS, PAGE_SETTINGS, PAGE_SYSTEM, }; int m_GamePage; int m_Popup; int m_ActivePage; bool m_MenuActive; bool m_UseMouseButtons; vec2 m_MousePos; int64 m_LastInput; // loading int m_LoadCurrent; int m_LoadTotal; // char m_aMessageTopic[512]; char m_aMessageBody[512]; char m_aMessageButton[512]; void PopupMessage(const char *pTopic, const char *pBody, const char *pButton); // TODO: this is a bit ugly but.. well.. yeah enum { MAX_INPUTEVENTS = 32 }; static IInput::CEvent m_aInputEvents[MAX_INPUTEVENTS]; static int m_NumInputEvents; // some settings static float ms_ButtonHeight; static float ms_ListheaderHeight; static float ms_FontmodHeight; // for settings bool m_NeedRestartGraphics; bool m_NeedRestartSound; bool m_NeedSendinfo; int m_SettingPlayerPage; // bool m_EscapePressed; bool m_EnterPressed; bool m_DeletePressed; // for map download popup int64 m_DownloadLastCheckTime; int m_DownloadLastCheckSize; float m_DownloadSpeed; // for call vote int m_CallvoteSelectedOption; int m_CallvoteSelectedPlayer; char m_aCallvoteReason[VOTE_REASON_LENGTH]; // demo struct CDemoItem { char m_aFilename[128]; char m_aName[128]; bool m_IsDir; int m_StorageType; bool m_InfosLoaded; bool m_Valid; CDemoHeader m_Info; bool operator<(const CDemoItem &Other) { return !str_comp(m_aFilename, "..") ? true : !str_comp(Other.m_aFilename, "..") ? false : m_IsDir && !Other.m_IsDir ? true : !m_IsDir && Other.m_IsDir ? false : str_comp_filenames(m_aFilename, Other.m_aFilename) < 0; } }; sorted_array m_lDemos; char m_aCurrentDemoFolder[256]; char m_aCurrentDemoFile[64]; int m_DemolistSelectedIndex; bool m_DemolistSelectedIsDir; int m_DemolistStorageType; void DemolistOnUpdate(bool Reset); void DemolistPopulate(); static int DemolistFetchCallback(const char *pName, int IsDir, int StorageType, void *pUser); // friends struct CFriendItem { const CFriendInfo *m_pFriendInfo; int m_NumFound; bool operator<(const CFriendItem &Other) { if(m_NumFound && !Other.m_NumFound) return true; else if(!m_NumFound && Other.m_NumFound) return false; else { int Result = str_comp(m_pFriendInfo->m_aName, Other.m_pFriendInfo->m_aName); if(Result) return Result < 0; else return str_comp(m_pFriendInfo->m_aClan, Other.m_pFriendInfo->m_aClan) < 0; } } }; sorted_array m_lFriends; int m_FriendlistSelectedIndex; void FriendlistOnUpdate(); // found in menus.cpp int Render(); //void render_background(); //void render_loading(float percent); int RenderMenubar(CUIRect r); void RenderNews(CUIRect MainView); // found in menus_demo.cpp void RenderDemoPlayer(CUIRect MainView); void RenderDemoList(CUIRect MainView); // found in menus_ingame.cpp void RenderGame(CUIRect MainView); void RenderPlayers(CUIRect MainView); void RenderServerInfo(CUIRect MainView); void RenderServerControl(CUIRect MainView); void RenderServerControlKick(CUIRect MainView, bool FilterSpectators); void RenderServerControlServer(CUIRect MainView); // found in menus_browser.cpp int m_SelectedIndex; int m_ScrollOffset; void RenderServerbrowserServerList(CUIRect View); void RenderServerbrowserServerDetail(CUIRect View); void RenderServerbrowserFilters(CUIRect View); void RenderServerbrowserFriends(CUIRect View); void RenderServerbrowser(CUIRect MainView); static void ConchainFriendlistUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); static void ConchainServerbrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); // found in menus_settings.cpp void RenderLanguageSelection(CUIRect MainView); void RenderSettingsGeneral(CUIRect MainView); void RenderSettingsPlayer(CUIRect MainView); void RenderSettingsTee(CUIRect MainView); void RenderSettingsControls(CUIRect MainView); void RenderSettingsGraphics(CUIRect MainView); void RenderSettingsSound(CUIRect MainView); void RenderSettings(CUIRect MainView); void SetActive(bool Active); public: void RenderBackground(); void UseMouseButtons(bool Use) { m_UseMouseButtons = Use; } static CMenusKeyBinder m_Binder; CMenus(); void RenderLoading(); bool IsActive() const { return m_MenuActive; } virtual void OnInit(); virtual void OnStateChange(int NewState, int OldState); virtual void OnReset(); virtual void OnRender(); virtual bool OnInput(IInput::CEvent Event); virtual bool OnMouseMove(float x, float y); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/menus_browser.cpp0000644000175000017500000010756712140200333024213 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "menus.h" void CMenus::RenderServerbrowserServerList(CUIRect View) { CUIRect Headers; CUIRect Status; View.HSplitTop(ms_ListheaderHeight, &Headers, &View); View.HSplitBottom(28.0f, &View, &Status); // split of the scrollbar RenderTools()->DrawUIRect(&Headers, vec4(1,1,1,0.25f), CUI::CORNER_T, 5.0f); Headers.VSplitRight(20.0f, &Headers, 0); struct CColumn { int m_ID; int m_Sort; CLocConstString m_Caption; int m_Direction; float m_Width; int m_Flags; CUIRect m_Rect; CUIRect m_Spacer; }; enum { FIXED=1, SPACER=2, COL_FLAG_LOCK=0, COL_FLAG_PURE, COL_FLAG_FAV, COL_NAME, COL_GAMETYPE, COL_MAP, COL_PLAYERS, COL_PING, COL_VERSION, }; static CColumn s_aCols[] = { {-1, -1, " ", -1, 2.0f, 0, {0}, {0}}, {COL_FLAG_LOCK, -1, " ", -1, 14.0f, 0, {0}, {0}}, {COL_FLAG_PURE, -1, " ", -1, 14.0f, 0, {0}, {0}}, {COL_FLAG_FAV, -1, " ", -1, 14.0f, 0, {0}, {0}}, {COL_NAME, IServerBrowser::SORT_NAME, "Name", 0, 300.0f, 0, {0}, {0}}, // Localize - these strings are localized within CLocConstString {COL_GAMETYPE, IServerBrowser::SORT_GAMETYPE, "Type", 1, 50.0f, 0, {0}, {0}}, {COL_MAP, IServerBrowser::SORT_MAP, "Map", 1, 100.0f, 0, {0}, {0}}, {COL_PLAYERS, IServerBrowser::SORT_NUMPLAYERS, "Players", 1, 60.0f, 0, {0}, {0}}, {-1, -1, " ", 1, 10.0f, 0, {0}, {0}}, {COL_PING, IServerBrowser::SORT_PING, "Ping", 1, 40.0f, FIXED, {0}, {0}}, }; // This is just for scripts/update_localization.py to work correctly (all other strings are already Localize()'d somewhere else). Don't remove! // Localize("Type"); int NumCols = sizeof(s_aCols)/sizeof(CColumn); // do layout for(int i = 0; i < NumCols; i++) { if(s_aCols[i].m_Direction == -1) { Headers.VSplitLeft(s_aCols[i].m_Width, &s_aCols[i].m_Rect, &Headers); if(i+1 < NumCols) { //Cols[i].flags |= SPACER; Headers.VSplitLeft(2, &s_aCols[i].m_Spacer, &Headers); } } } for(int i = NumCols-1; i >= 0; i--) { if(s_aCols[i].m_Direction == 1) { Headers.VSplitRight(s_aCols[i].m_Width, &Headers, &s_aCols[i].m_Rect); Headers.VSplitRight(2, &Headers, &s_aCols[i].m_Spacer); } } for(int i = 0; i < NumCols; i++) { if(s_aCols[i].m_Direction == 0) s_aCols[i].m_Rect = Headers; } // do headers for(int i = 0; i < NumCols; i++) { if(DoButton_GridHeader(s_aCols[i].m_Caption, s_aCols[i].m_Caption, g_Config.m_BrSort == s_aCols[i].m_Sort, &s_aCols[i].m_Rect)) { if(s_aCols[i].m_Sort != -1) { if(g_Config.m_BrSort == s_aCols[i].m_Sort) g_Config.m_BrSortOrder ^= 1; else g_Config.m_BrSortOrder = 0; g_Config.m_BrSort = s_aCols[i].m_Sort; } } } RenderTools()->DrawUIRect(&View, vec4(0,0,0,0.15f), 0, 0); CUIRect Scroll; View.VSplitRight(15, &View, &Scroll); int NumServers = ServerBrowser()->NumSortedServers(); // display important messages in the middle of the screen so no // users misses it { CUIRect MsgBox = View; MsgBox.y += View.h/3; if(m_ActivePage == PAGE_INTERNET && ServerBrowser()->IsRefreshingMasters()) UI()->DoLabelScaled(&MsgBox, Localize("Refreshing master servers"), 16.0f, 0); else if(!ServerBrowser()->NumServers()) UI()->DoLabelScaled(&MsgBox, Localize("No servers found"), 16.0f, 0); else if(ServerBrowser()->NumServers() && !NumServers) UI()->DoLabelScaled(&MsgBox, Localize("No servers match your filter criteria"), 16.0f, 0); } int Num = (int)(View.h/s_aCols[0].m_Rect.h) + 1; static int s_ScrollBar = 0; static float s_ScrollValue = 0; Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = DoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); int ScrollNum = NumServers-Num+1; if(ScrollNum > 0) { if(m_ScrollOffset) { s_ScrollValue = (float)(m_ScrollOffset)/ScrollNum; m_ScrollOffset = 0; } if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP) && UI()->MouseInside(&View)) s_ScrollValue -= 3.0f/ScrollNum; if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&View)) s_ScrollValue += 3.0f/ScrollNum; } else ScrollNum = 0; if(m_SelectedIndex > -1) { for(int i = 0; i < m_NumInputEvents; i++) { int NewIndex = -1; if(m_aInputEvents[i].m_Flags&IInput::FLAG_PRESS) { if(m_aInputEvents[i].m_Key == KEY_DOWN) NewIndex = m_SelectedIndex + 1; if(m_aInputEvents[i].m_Key == KEY_UP) NewIndex = m_SelectedIndex - 1; } if(NewIndex > -1 && NewIndex < NumServers) { //scroll float IndexY = View.y - s_ScrollValue*ScrollNum*s_aCols[0].m_Rect.h + NewIndex*s_aCols[0].m_Rect.h; int Scroll = View.y > IndexY ? -1 : View.y+View.h < IndexY+s_aCols[0].m_Rect.h ? 1 : 0; if(Scroll) { if(Scroll < 0) { int NumScrolls = (View.y-IndexY+s_aCols[0].m_Rect.h-1.0f)/s_aCols[0].m_Rect.h; s_ScrollValue -= (1.0f/ScrollNum)*NumScrolls; } else { int NumScrolls = (IndexY+s_aCols[0].m_Rect.h-(View.y+View.h)+s_aCols[0].m_Rect.h-1.0f)/s_aCols[0].m_Rect.h; s_ScrollValue += (1.0f/ScrollNum)*NumScrolls; } } m_SelectedIndex = NewIndex; const CServerInfo *pItem = ServerBrowser()->SortedGet(m_SelectedIndex); str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress, sizeof(g_Config.m_UiServerAddress)); } } } if(s_ScrollValue < 0) s_ScrollValue = 0; if(s_ScrollValue > 1) s_ScrollValue = 1; // set clipping UI()->ClipEnable(&View); CUIRect OriginalView = View; View.y -= s_ScrollValue*ScrollNum*s_aCols[0].m_Rect.h; int NewSelected = -1; int NumPlayers = 0; m_SelectedIndex = -1; // reset friend counter for(int i = 0; i < m_lFriends.size(); m_lFriends[i++].m_NumFound = 0); for (int i = 0; i < NumServers; i++) { int ItemIndex = i; const CServerInfo *pItem = ServerBrowser()->SortedGet(ItemIndex); NumPlayers += g_Config.m_BrFilterSpectators ? pItem->m_NumPlayers : pItem->m_NumClients; CUIRect Row; CUIRect SelectHitBox; int Selected = str_comp(pItem->m_aAddress, g_Config.m_UiServerAddress) == 0; //selected_index==ItemIndex; View.HSplitTop(17.0f, &Row, &View); SelectHitBox = Row; if(Selected) m_SelectedIndex = i; // update friend counter if(pItem->m_FriendState != IFriends::FRIEND_NO) { for(int j = 0; j < pItem->m_NumClients; ++j) { if(pItem->m_aClients[j].m_FriendState != IFriends::FRIEND_NO) { unsigned NameHash = str_quickhash(pItem->m_aClients[j].m_aName); unsigned ClanHash = str_quickhash(pItem->m_aClients[j].m_aClan); for(int f = 0; f < m_lFriends.size(); ++f) { if(ClanHash == m_lFriends[f].m_pFriendInfo->m_ClanHash && (!m_lFriends[f].m_pFriendInfo->m_aName[0] || NameHash == m_lFriends[f].m_pFriendInfo->m_NameHash)) { m_lFriends[f].m_NumFound++; if(m_lFriends[f].m_pFriendInfo->m_aName[0]) break; } } } } } // make sure that only those in view can be selected if(Row.y+Row.h > OriginalView.y && Row.y < OriginalView.y+OriginalView.h) { if(Selected) { CUIRect r = Row; r.Margin(1.5f, &r); RenderTools()->DrawUIRect(&r, vec4(1,1,1,0.5f), CUI::CORNER_ALL, 4.0f); } // clip the selection if(SelectHitBox.y < OriginalView.y) // top { SelectHitBox.h -= OriginalView.y-SelectHitBox.y; SelectHitBox.y = OriginalView.y; } else if(SelectHitBox.y+SelectHitBox.h > OriginalView.y+OriginalView.h) // bottom SelectHitBox.h = OriginalView.y+OriginalView.h-SelectHitBox.y; if(UI()->DoButtonLogic(pItem, "", Selected, &SelectHitBox)) { NewSelected = ItemIndex; } } else { // reset active item, if not visible if(UI()->ActiveItem() == pItem) UI()->SetActiveItem(0); // don't render invisible items continue; } for(int c = 0; c < NumCols; c++) { CUIRect Button; char aTemp[64]; Button.x = s_aCols[c].m_Rect.x; Button.y = Row.y; Button.h = Row.h; Button.w = s_aCols[c].m_Rect.w; int ID = s_aCols[c].m_ID; if(ID == COL_FLAG_LOCK) { if(pItem->m_Flags & SERVER_FLAG_PASSWORD) DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_LOCK, &Button); } else if(ID == COL_FLAG_PURE) { if( str_comp(pItem->m_aGameType, "DM") == 0 || str_comp(pItem->m_aGameType, "TDM") == 0 || str_comp(pItem->m_aGameType, "CTF") == 0) { // pure server } else { // unpure DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_UNPURE, &Button); } } else if(ID == COL_FLAG_FAV) { if(pItem->m_Favorite) DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_HEART, &Button); } else if(ID == COL_NAME) { CTextCursor Cursor; TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f * UI()->Scale(), TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Button.w; if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit&IServerBrowser::QUICK_SERVERNAME)) { // highlight the parts that matches const char *pStr = str_find_nocase(pItem->m_aName, g_Config.m_BrFilterString); if(pStr) { TextRender()->TextEx(&Cursor, pItem->m_aName, (int)(pStr-pItem->m_aName)); TextRender()->TextColor(0.4f,0.4f,1.0f,1); TextRender()->TextEx(&Cursor, pStr, str_length(g_Config.m_BrFilterString)); TextRender()->TextColor(1,1,1,1); TextRender()->TextEx(&Cursor, pStr+str_length(g_Config.m_BrFilterString), -1); } else TextRender()->TextEx(&Cursor, pItem->m_aName, -1); } else TextRender()->TextEx(&Cursor, pItem->m_aName, -1); } else if(ID == COL_MAP) { CTextCursor Cursor; TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f * UI()->Scale(), TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Button.w; if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit&IServerBrowser::QUICK_MAPNAME)) { // highlight the parts that matches const char *pStr = str_find_nocase(pItem->m_aMap, g_Config.m_BrFilterString); if(pStr) { TextRender()->TextEx(&Cursor, pItem->m_aMap, (int)(pStr-pItem->m_aMap)); TextRender()->TextColor(0.4f,0.4f,1.0f,1); TextRender()->TextEx(&Cursor, pStr, str_length(g_Config.m_BrFilterString)); TextRender()->TextColor(1,1,1,1); TextRender()->TextEx(&Cursor, pStr+str_length(g_Config.m_BrFilterString), -1); } else TextRender()->TextEx(&Cursor, pItem->m_aMap, -1); } else TextRender()->TextEx(&Cursor, pItem->m_aMap, -1); } else if(ID == COL_PLAYERS) { CUIRect Icon; Button.VMargin(4.0f, &Button); if(pItem->m_FriendState != IFriends::FRIEND_NO) { Button.VSplitLeft(Button.h, &Icon, &Button); Icon.Margin(2.0f, &Icon); DoButton_Icon(IMAGE_BROWSEICONS, SPRITE_BROWSE_HEART, &Icon); } if(g_Config.m_BrFilterSpectators) str_format(aTemp, sizeof(aTemp), "%i/%i", pItem->m_NumPlayers, pItem->m_MaxPlayers); else str_format(aTemp, sizeof(aTemp), "%i/%i", pItem->m_NumClients, pItem->m_MaxClients); if(g_Config.m_BrFilterString[0] && (pItem->m_QuickSearchHit&IServerBrowser::QUICK_PLAYER)) TextRender()->TextColor(0.4f,0.4f,1.0f,1); UI()->DoLabelScaled(&Button, aTemp, 12.0f, 1); TextRender()->TextColor(1,1,1,1); } else if(ID == COL_PING) { str_format(aTemp, sizeof(aTemp), "%i", pItem->m_Latency); UI()->DoLabelScaled(&Button, aTemp, 12.0f, 1); } else if(ID == COL_VERSION) { const char *pVersion = pItem->m_aVersion; UI()->DoLabelScaled(&Button, pVersion, 12.0f, 1); } else if(ID == COL_GAMETYPE) { CTextCursor Cursor; TextRender()->SetCursor(&Cursor, Button.x, Button.y, 12.0f*UI()->Scale(), TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Button.w; TextRender()->TextEx(&Cursor, pItem->m_aGameType, -1); } } } UI()->ClipDisable(); if(NewSelected != -1) { // select the new server const CServerInfo *pItem = ServerBrowser()->SortedGet(NewSelected); str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress, sizeof(g_Config.m_UiServerAddress)); if(Input()->MouseDoubleClick()) Client()->Connect(g_Config.m_UiServerAddress); } RenderTools()->DrawUIRect(&Status, vec4(1,1,1,0.25f), CUI::CORNER_B, 5.0f); Status.Margin(5.0f, &Status); // render quick search CUIRect QuickSearch, Button; Status.VSplitLeft(240.0f, &QuickSearch, &Status); const char *pLabel = Localize("Quick search:"); UI()->DoLabelScaled(&QuickSearch, pLabel, 12.0f, -1); float w = TextRender()->TextWidth(0, 12.0f, pLabel, -1); QuickSearch.VSplitLeft(w, 0, &QuickSearch); QuickSearch.VSplitLeft(5.0f, 0, &QuickSearch); QuickSearch.VSplitLeft(240.0f-w-22.0f, &QuickSearch, &Button); static float Offset = 0.0f; if(DoEditBox(&g_Config.m_BrFilterString, &QuickSearch, g_Config.m_BrFilterString, sizeof(g_Config.m_BrFilterString), 12.0f, &Offset, false, CUI::CORNER_L)) Client()->ServerBrowserUpdate(); // clear button { static int s_ClearButton = 0; RenderTools()->DrawUIRect(&Button, vec4(1,1,1,0.33f)*ButtonColorMul(&s_ClearButton), CUI::CORNER_R, 3.0f); UI()->DoLabel(&Button, "x", Button.h*ms_FontmodHeight, 0); if(UI()->DoButtonLogic(&s_ClearButton, "x", 0, &Button)) { g_Config.m_BrFilterString[0] = 0; UI()->SetActiveItem(&g_Config.m_BrFilterString); Client()->ServerBrowserUpdate(); } } // render status char aBuf[128]; if(ServerBrowser()->IsRefreshing()) str_format(aBuf, sizeof(aBuf), Localize("%d%% loaded"), ServerBrowser()->LoadingProgression()); else str_format(aBuf, sizeof(aBuf), Localize("%d of %d servers, %d players"), ServerBrowser()->NumSortedServers(), ServerBrowser()->NumServers(), NumPlayers); Status.VSplitRight(TextRender()->TextWidth(0, 14.0f, aBuf, -1), 0, &Status); UI()->DoLabelScaled(&Status, aBuf, 14.0f, -1); } void CMenus::RenderServerbrowserFilters(CUIRect View) { CUIRect ServerFilter = View, FilterHeader; const float FontSize = 12.0f; ServerFilter.HSplitBottom(42.5f, &ServerFilter, 0); // server filter ServerFilter.HSplitTop(ms_ListheaderHeight, &FilterHeader, &ServerFilter); RenderTools()->DrawUIRect(&FilterHeader, vec4(1,1,1,0.25f), CUI::CORNER_T, 4.0f); RenderTools()->DrawUIRect(&ServerFilter, vec4(0,0,0,0.15f), CUI::CORNER_B, 4.0f); UI()->DoLabelScaled(&FilterHeader, Localize("Server filter"), FontSize+2.0f, 0); CUIRect Button; ServerFilter.VSplitLeft(5.0f, 0, &ServerFilter); ServerFilter.Margin(3.0f, &ServerFilter); ServerFilter.VMargin(5.0f, &ServerFilter); ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox(&g_Config.m_BrFilterEmpty, Localize("Has people playing"), g_Config.m_BrFilterEmpty, &Button)) g_Config.m_BrFilterEmpty ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if(DoButton_CheckBox(&g_Config.m_BrFilterSpectators, Localize("Count players only"), g_Config.m_BrFilterSpectators, &Button)) g_Config.m_BrFilterSpectators ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox(&g_Config.m_BrFilterFull, Localize("Server not full"), g_Config.m_BrFilterFull, &Button)) g_Config.m_BrFilterFull ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox(&g_Config.m_BrFilterFriends, Localize("Show friends only"), g_Config.m_BrFilterFriends, &Button)) g_Config.m_BrFilterFriends ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox(&g_Config.m_BrFilterPw, Localize("No password"), g_Config.m_BrFilterPw, &Button)) g_Config.m_BrFilterPw ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox((char *)&g_Config.m_BrFilterCompatversion, Localize("Compatible version"), g_Config.m_BrFilterCompatversion, &Button)) g_Config.m_BrFilterCompatversion ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox((char *)&g_Config.m_BrFilterPure, Localize("Standard gametype"), g_Config.m_BrFilterPure, &Button)) g_Config.m_BrFilterPure ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox((char *)&g_Config.m_BrFilterPureMap, Localize("Standard map"), g_Config.m_BrFilterPureMap, &Button)) g_Config.m_BrFilterPureMap ^= 1; ServerFilter.HSplitTop(20.0f, &Button, &ServerFilter); if (DoButton_CheckBox((char *)&g_Config.m_BrFilterGametypeStrict, Localize("Strict gametype filter"), g_Config.m_BrFilterGametypeStrict, &Button)) g_Config.m_BrFilterGametypeStrict ^= 1; ServerFilter.HSplitTop(5.0f, 0, &ServerFilter); ServerFilter.HSplitTop(19.0f, &Button, &ServerFilter); UI()->DoLabelScaled(&Button, Localize("Game types:"), FontSize, -1); Button.VSplitRight(60.0f, 0, &Button); ServerFilter.HSplitTop(3.0f, 0, &ServerFilter); static float Offset = 0.0f; if(DoEditBox(&g_Config.m_BrFilterGametype, &Button, g_Config.m_BrFilterGametype, sizeof(g_Config.m_BrFilterGametype), FontSize, &Offset)) Client()->ServerBrowserUpdate(); { ServerFilter.HSplitTop(19.0f, &Button, &ServerFilter); CUIRect EditBox; Button.VSplitRight(60.0f, &Button, &EditBox); UI()->DoLabelScaled(&Button, Localize("Maximum ping:"), FontSize, -1); char aBuf[5]; str_format(aBuf, sizeof(aBuf), "%d", g_Config.m_BrFilterPing); static float Offset = 0.0f; DoEditBox(&g_Config.m_BrFilterPing, &EditBox, aBuf, sizeof(aBuf), FontSize, &Offset); g_Config.m_BrFilterPing = clamp(str_toint(aBuf), 0, 999); } // server address ServerFilter.HSplitTop(3.0f, 0, &ServerFilter); ServerFilter.HSplitTop(19.0f, &Button, &ServerFilter); UI()->DoLabelScaled(&Button, Localize("Server address:"), FontSize, -1); Button.VSplitRight(60.0f, 0, &Button); static float OffsetAddr = 0.0f; if(DoEditBox(&g_Config.m_BrFilterServerAddress, &Button, g_Config.m_BrFilterServerAddress, sizeof(g_Config.m_BrFilterServerAddress), FontSize, &OffsetAddr)) Client()->ServerBrowserUpdate(); // player country { CUIRect Rect; ServerFilter.HSplitTop(3.0f, 0, &ServerFilter); ServerFilter.HSplitTop(26.0f, &Button, &ServerFilter); Button.VSplitRight(60.0f, &Button, &Rect); Button.HMargin(3.0f, &Button); if(DoButton_CheckBox(&g_Config.m_BrFilterCountry, Localize("Player country:"), g_Config.m_BrFilterCountry, &Button)) g_Config.m_BrFilterCountry ^= 1; float OldWidth = Rect.w; Rect.w = Rect.h*2; Rect.x += (OldWidth-Rect.w)/2.0f; vec4 Color(1.0f, 1.0f, 1.0f, g_Config.m_BrFilterCountry?1.0f: 0.5f); m_pClient->m_pCountryFlags->Render(g_Config.m_BrFilterCountryIndex, &Color, Rect.x, Rect.y, Rect.w, Rect.h); if(g_Config.m_BrFilterCountry && UI()->DoButtonLogic(&g_Config.m_BrFilterCountryIndex, "", 0, &Rect)) m_Popup = POPUP_COUNTRY; } ServerFilter.HSplitBottom(5.0f, &ServerFilter, 0); ServerFilter.HSplitBottom(ms_ButtonHeight-2.0f, &ServerFilter, &Button); static int s_ClearButton = 0; if(DoButton_Menu(&s_ClearButton, Localize("Reset filter"), 0, &Button)) { g_Config.m_BrFilterString[0] = 0; g_Config.m_BrFilterFull = 0; g_Config.m_BrFilterEmpty = 0; g_Config.m_BrFilterSpectators = 0; g_Config.m_BrFilterFriends = 0; g_Config.m_BrFilterCountry = 0; g_Config.m_BrFilterCountryIndex = -1; g_Config.m_BrFilterPw = 0; g_Config.m_BrFilterPing = 999; g_Config.m_BrFilterGametype[0] = 0; g_Config.m_BrFilterGametypeStrict = 0; g_Config.m_BrFilterServerAddress[0] = 0; g_Config.m_BrFilterPure = 1; g_Config.m_BrFilterPureMap = 1; g_Config.m_BrFilterCompatversion = 1; Client()->ServerBrowserUpdate(); } } void CMenus::RenderServerbrowserServerDetail(CUIRect View) { CUIRect ServerDetails = View; CUIRect ServerScoreBoard, ServerHeader; const CServerInfo *pSelectedServer = ServerBrowser()->SortedGet(m_SelectedIndex); // split off a piece to use for scoreboard ServerDetails.HSplitTop(90.0f, &ServerDetails, &ServerScoreBoard); ServerDetails.HSplitBottom(2.5f, &ServerDetails, 0x0); // server details CTextCursor Cursor; const float FontSize = 12.0f; ServerDetails.HSplitTop(ms_ListheaderHeight, &ServerHeader, &ServerDetails); RenderTools()->DrawUIRect(&ServerHeader, vec4(1,1,1,0.25f), CUI::CORNER_T, 4.0f); RenderTools()->DrawUIRect(&ServerDetails, vec4(0,0,0,0.15f), CUI::CORNER_B, 4.0f); UI()->DoLabelScaled(&ServerHeader, Localize("Server details"), FontSize+2.0f, 0); if (pSelectedServer) { ServerDetails.VSplitLeft(5.0f, 0, &ServerDetails); ServerDetails.Margin(3.0f, &ServerDetails); CUIRect Row; static CLocConstString s_aLabels[] = { "Version", // Localize - these strings are localized within CLocConstString "Game type", "Ping"}; CUIRect LeftColumn; CUIRect RightColumn; // { CUIRect Button; ServerDetails.HSplitBottom(20.0f, &ServerDetails, &Button); Button.VSplitLeft(5.0f, 0, &Button); static int s_AddFavButton = 0; if(DoButton_CheckBox(&s_AddFavButton, Localize("Favorite"), pSelectedServer->m_Favorite, &Button)) { if(pSelectedServer->m_Favorite) ServerBrowser()->RemoveFavorite(pSelectedServer->m_NetAddr); else ServerBrowser()->AddFavorite(pSelectedServer->m_NetAddr); } } ServerDetails.VSplitLeft(5.0f, 0x0, &ServerDetails); ServerDetails.VSplitLeft(80.0f, &LeftColumn, &RightColumn); for (unsigned int i = 0; i < sizeof(s_aLabels) / sizeof(s_aLabels[0]); i++) { LeftColumn.HSplitTop(15.0f, &Row, &LeftColumn); UI()->DoLabelScaled(&Row, s_aLabels[i], FontSize, -1); } RightColumn.HSplitTop(15.0f, &Row, &RightColumn); TextRender()->SetCursor(&Cursor, Row.x, Row.y, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Row.w; TextRender()->TextEx(&Cursor, pSelectedServer->m_aVersion, -1); RightColumn.HSplitTop(15.0f, &Row, &RightColumn); TextRender()->SetCursor(&Cursor, Row.x, Row.y, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Row.w; TextRender()->TextEx(&Cursor, pSelectedServer->m_aGameType, -1); char aTemp[16]; str_format(aTemp, sizeof(aTemp), "%d", pSelectedServer->m_Latency); RightColumn.HSplitTop(15.0f, &Row, &RightColumn); TextRender()->SetCursor(&Cursor, Row.x, Row.y, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Row.w; TextRender()->TextEx(&Cursor, aTemp, -1); } // server scoreboard ServerScoreBoard.HSplitBottom(20.0f, &ServerScoreBoard, 0x0); ServerScoreBoard.HSplitTop(ms_ListheaderHeight, &ServerHeader, &ServerScoreBoard); RenderTools()->DrawUIRect(&ServerHeader, vec4(1,1,1,0.25f), CUI::CORNER_T, 4.0f); RenderTools()->DrawUIRect(&ServerScoreBoard, vec4(0,0,0,0.15f), CUI::CORNER_B, 4.0f); UI()->DoLabelScaled(&ServerHeader, Localize("Scoreboard"), FontSize+2.0f, 0); if(pSelectedServer) { ServerScoreBoard.Margin(3.0f, &ServerScoreBoard); for (int i = 0; i < pSelectedServer->m_NumClients; i++) { CUIRect Name, Clan, Score, Flag; ServerScoreBoard.HSplitTop(25.0f, &Name, &ServerScoreBoard); if(UI()->DoButtonLogic(&pSelectedServer->m_aClients[i], "", 0, &Name)) { if(pSelectedServer->m_aClients[i].m_FriendState == IFriends::FRIEND_PLAYER) m_pClient->Friends()->RemoveFriend(pSelectedServer->m_aClients[i].m_aName, pSelectedServer->m_aClients[i].m_aClan); else m_pClient->Friends()->AddFriend(pSelectedServer->m_aClients[i].m_aName, pSelectedServer->m_aClients[i].m_aClan); FriendlistOnUpdate(); Client()->ServerBrowserUpdate(); } vec4 Colour = pSelectedServer->m_aClients[i].m_FriendState == IFriends::FRIEND_NO ? vec4(1.0f, 1.0f, 1.0f, (i%2+1)*0.05f) : vec4(0.5f, 1.0f, 0.5f, 0.15f+(i%2+1)*0.05f); RenderTools()->DrawUIRect(&Name, Colour, CUI::CORNER_ALL, 4.0f); Name.VSplitLeft(5.0f, 0, &Name); Name.VSplitLeft(30.0f, &Score, &Name); Name.VSplitRight(34.0f, &Name, &Flag); Flag.HMargin(4.0f, &Flag); Name.HSplitTop(11.0f, &Name, &Clan); // score if(pSelectedServer->m_aClients[i].m_Player) { char aTemp[16]; str_format(aTemp, sizeof(aTemp), "%d", pSelectedServer->m_aClients[i].m_Score); TextRender()->SetCursor(&Cursor, Score.x, Score.y+(Score.h-FontSize)/4.0f, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Score.w; TextRender()->TextEx(&Cursor, aTemp, -1); } // name TextRender()->SetCursor(&Cursor, Name.x, Name.y, FontSize-2, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Name.w; const char *pName = pSelectedServer->m_aClients[i].m_aName; if(g_Config.m_BrFilterString[0]) { // highlight the parts that matches const char *s = str_find_nocase(pName, g_Config.m_BrFilterString); if(s) { TextRender()->TextEx(&Cursor, pName, (int)(s-pName)); TextRender()->TextColor(0.4f, 0.4f, 1.0f, 1.0f); TextRender()->TextEx(&Cursor, s, str_length(g_Config.m_BrFilterString)); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); TextRender()->TextEx(&Cursor, s+str_length(g_Config.m_BrFilterString), -1); } else TextRender()->TextEx(&Cursor, pName, -1); } else TextRender()->TextEx(&Cursor, pName, -1); // clan TextRender()->SetCursor(&Cursor, Clan.x, Clan.y, FontSize-2, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Clan.w; const char *pClan = pSelectedServer->m_aClients[i].m_aClan; if(g_Config.m_BrFilterString[0]) { // highlight the parts that matches const char *s = str_find_nocase(pClan, g_Config.m_BrFilterString); if(s) { TextRender()->TextEx(&Cursor, pClan, (int)(s-pClan)); TextRender()->TextColor(0.4f, 0.4f, 1.0f, 1.0f); TextRender()->TextEx(&Cursor, s, str_length(g_Config.m_BrFilterString)); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); TextRender()->TextEx(&Cursor, s+str_length(g_Config.m_BrFilterString), -1); } else TextRender()->TextEx(&Cursor, pClan, -1); } else TextRender()->TextEx(&Cursor, pClan, -1); // flag vec4 Color(1.0f, 1.0f, 1.0f, 0.5f); m_pClient->m_pCountryFlags->Render(pSelectedServer->m_aClients[i].m_Country, &Color, Flag.x, Flag.y, Flag.w, Flag.h); } } } void CMenus::FriendlistOnUpdate() { m_lFriends.clear(); for(int i = 0; i < m_pClient->Friends()->NumFriends(); ++i) { CFriendItem Item; Item.m_pFriendInfo = m_pClient->Friends()->GetFriend(i); Item.m_NumFound = 0; m_lFriends.add_unsorted(Item); } m_lFriends.sort_range(); } void CMenus::RenderServerbrowserFriends(CUIRect View) { static int s_Inited = 0; if(!s_Inited) { FriendlistOnUpdate(); s_Inited = 1; } CUIRect ServerFriends = View, FilterHeader; const float FontSize = 10.0f; // header ServerFriends.HSplitTop(ms_ListheaderHeight, &FilterHeader, &ServerFriends); RenderTools()->DrawUIRect(&FilterHeader, vec4(1,1,1,0.25f), CUI::CORNER_T, 4.0f); RenderTools()->DrawUIRect(&ServerFriends, vec4(0,0,0,0.15f), 0, 4.0f); UI()->DoLabelScaled(&FilterHeader, Localize("Friends"), FontSize+4.0f, 0); CUIRect Button, List; ServerFriends.Margin(3.0f, &ServerFriends); ServerFriends.VMargin(3.0f, &ServerFriends); ServerFriends.HSplitBottom(100.0f, &List, &ServerFriends); // friends list(remove friend) static float s_ScrollValue = 0; if(m_FriendlistSelectedIndex >= m_lFriends.size()) m_FriendlistSelectedIndex = m_lFriends.size()-1; UiDoListboxStart(&m_lFriends, &List, 30.0f, "", "", m_lFriends.size(), 1, m_FriendlistSelectedIndex, s_ScrollValue); m_lFriends.sort_range(); for(int i = 0; i < m_lFriends.size(); ++i) { CListboxItem Item = UiDoListboxNextItem(&m_lFriends[i]); if(Item.m_Visible) { Item.m_Rect.Margin(1.5f, &Item.m_Rect); CUIRect OnState; Item.m_Rect.VSplitRight(30.0f, &Item.m_Rect, &OnState); RenderTools()->DrawUIRect(&Item.m_Rect, vec4(1.0f, 1.0f, 1.0f, 0.1f), CUI::CORNER_L, 4.0f); Item.m_Rect.VMargin(2.5f, &Item.m_Rect); Item.m_Rect.HSplitTop(12.0f, &Item.m_Rect, &Button); UI()->DoLabelScaled(&Item.m_Rect, m_lFriends[i].m_pFriendInfo->m_aName, FontSize, -1); UI()->DoLabelScaled(&Button, m_lFriends[i].m_pFriendInfo->m_aClan, FontSize, -1); RenderTools()->DrawUIRect(&OnState, m_lFriends[i].m_NumFound ? vec4(0.0f, 1.0f, 0.0f, 0.25f) : vec4(1.0f, 0.0f, 0.0f, 0.25f), CUI::CORNER_R, 4.0f); OnState.HMargin((OnState.h-FontSize)/3, &OnState); OnState.VMargin(5.0f, &OnState); char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%i", m_lFriends[i].m_NumFound); UI()->DoLabelScaled(&OnState, aBuf, FontSize+2, 1); } } bool Activated = false; m_FriendlistSelectedIndex = UiDoListboxEnd(&s_ScrollValue, &Activated); // activate found server with friend if(Activated && !m_EnterPressed && m_lFriends[m_FriendlistSelectedIndex].m_NumFound) { bool Found = false; int NumServers = ServerBrowser()->NumSortedServers(); for (int i = 0; i < NumServers && !Found; i++) { int ItemIndex = m_SelectedIndex != -1 ? (m_SelectedIndex+i+1)%NumServers : i; const CServerInfo *pItem = ServerBrowser()->SortedGet(ItemIndex); if(pItem->m_FriendState != IFriends::FRIEND_NO) { for(int j = 0; j < pItem->m_NumClients && !Found; ++j) { if(pItem->m_aClients[j].m_FriendState != IFriends::FRIEND_NO && str_quickhash(pItem->m_aClients[j].m_aClan) == m_lFriends[m_FriendlistSelectedIndex].m_pFriendInfo->m_ClanHash && (!m_lFriends[m_FriendlistSelectedIndex].m_pFriendInfo->m_aName[0] || str_quickhash(pItem->m_aClients[j].m_aName) == m_lFriends[m_FriendlistSelectedIndex].m_pFriendInfo->m_NameHash)) { str_copy(g_Config.m_UiServerAddress, pItem->m_aAddress, sizeof(g_Config.m_UiServerAddress)); m_ScrollOffset = ItemIndex; m_SelectedIndex = ItemIndex; Found = true; } } } } } ServerFriends.HSplitTop(2.5f, 0, &ServerFriends); ServerFriends.HSplitTop(20.0f, &Button, &ServerFriends); if(m_FriendlistSelectedIndex != -1) { static int s_RemoveButton = 0; if(DoButton_Menu(&s_RemoveButton, Localize("Remove"), 0, &Button)) m_Popup = POPUP_REMOVE_FRIEND; } // add friend if(m_pClient->Friends()->NumFriends() < IFriends::MAX_FRIENDS) { ServerFriends.HSplitTop(10.0f, 0, &ServerFriends); ServerFriends.HSplitTop(19.0f, &Button, &ServerFriends); char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%s:", Localize("Name")); UI()->DoLabelScaled(&Button, aBuf, FontSize, -1); Button.VSplitLeft(80.0f, 0, &Button); static char s_aName[MAX_NAME_LENGTH] = {0}; static float s_OffsetName = 0.0f; DoEditBox(&s_aName, &Button, s_aName, sizeof(s_aName), FontSize, &s_OffsetName); ServerFriends.HSplitTop(3.0f, 0, &ServerFriends); ServerFriends.HSplitTop(19.0f, &Button, &ServerFriends); str_format(aBuf, sizeof(aBuf), "%s:", Localize("Clan")); UI()->DoLabelScaled(&Button, aBuf, FontSize, -1); Button.VSplitLeft(80.0f, 0, &Button); static char s_aClan[MAX_CLAN_LENGTH] = {0}; static float s_OffsetClan = 0.0f; DoEditBox(&s_aClan, &Button, s_aClan, sizeof(s_aClan), FontSize, &s_OffsetClan); ServerFriends.HSplitTop(3.0f, 0, &ServerFriends); ServerFriends.HSplitTop(20.0f, &Button, &ServerFriends); static int s_AddButton = 0; if(DoButton_Menu(&s_AddButton, Localize("Add Friend"), 0, &Button)) { m_pClient->Friends()->AddFriend(s_aName, s_aClan); FriendlistOnUpdate(); Client()->ServerBrowserUpdate(); } } } void CMenus::RenderServerbrowser(CUIRect MainView) { /* +-----------------+ +-------+ | | | | | | | tool | | server list | | box | | | | | | | | | +-----------------+ | | status box tab +-------+ */ CUIRect ServerList, ToolBox, StatusBox, TabBar; // background RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); MainView.Margin(10.0f, &MainView); // create server list, status box, tab bar and tool box area MainView.VSplitRight(205.0f, &ServerList, &ToolBox); ServerList.HSplitBottom(70.0f, &ServerList, &StatusBox); StatusBox.VSplitRight(100.0f, &StatusBox, &TabBar); ServerList.VSplitRight(5.0f, &ServerList, 0); // server list { RenderServerbrowserServerList(ServerList); } int ToolboxPage = g_Config.m_UiToolboxPage; // tab bar { CUIRect TabButton0, TabButton1, TabButton2; TabBar.HSplitTop(5.0f, 0, &TabBar); TabBar.HSplitTop(20.0f, &TabButton0, &TabBar); TabBar.HSplitTop(2.5f, 0, &TabBar); TabBar.HSplitTop(20.0f, &TabButton1, &TabBar); TabBar.HSplitTop(2.5f, 0, &TabBar); TabBar.HSplitTop(20.0f, &TabButton2, 0); vec4 Active = ms_ColorTabbarActive; vec4 InActive = ms_ColorTabbarInactive; ms_ColorTabbarActive = vec4(0.0f, 0.0f, 0.0f, 0.3f); ms_ColorTabbarInactive = vec4(0.0f, 0.0f, 0.0f, 0.15f); static int s_FiltersTab = 0; if (DoButton_MenuTab(&s_FiltersTab, Localize("Filter"), ToolboxPage==0, &TabButton0, CUI::CORNER_L)) ToolboxPage = 0; static int s_InfoTab = 0; if (DoButton_MenuTab(&s_InfoTab, Localize("Info"), ToolboxPage==1, &TabButton1, CUI::CORNER_L)) ToolboxPage = 1; static int s_FriendsTab = 0; if (DoButton_MenuTab(&s_FriendsTab, Localize("Friends"), ToolboxPage==2, &TabButton2, CUI::CORNER_L)) ToolboxPage = 2; ms_ColorTabbarActive = Active; ms_ColorTabbarInactive = InActive; g_Config.m_UiToolboxPage = ToolboxPage; } // tool box { RenderTools()->DrawUIRect(&ToolBox, vec4(0.0f, 0.0f, 0.0f, 0.15f), CUI::CORNER_T, 4.0f); if(ToolboxPage == 0) RenderServerbrowserFilters(ToolBox); else if(ToolboxPage == 1) RenderServerbrowserServerDetail(ToolBox); else if(ToolboxPage == 2) RenderServerbrowserFriends(ToolBox); } // status box { CUIRect Button, ButtonArea; StatusBox.HSplitTop(5.0f, 0, &StatusBox); // version note StatusBox.HSplitBottom(15.0f, &StatusBox, &Button); char aBuf[64]; if(str_comp(Client()->LatestVersion(), "0") != 0) { str_format(aBuf, sizeof(aBuf), Localize("Teeworlds %s is out! Download it at www.teeworlds.com!"), Client()->LatestVersion()); TextRender()->TextColor(1.0f, 0.4f, 0.4f, 1.0f); } else str_format(aBuf, sizeof(aBuf), Localize("Current version: %s"), GAME_VERSION); UI()->DoLabelScaled(&Button, aBuf, 14.0f, -1); TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); // button area StatusBox.VSplitRight(80.0f, &StatusBox, 0); StatusBox.VSplitRight(170.0f, &StatusBox, &ButtonArea); ButtonArea.VSplitRight(150.0f, 0, &ButtonArea); ButtonArea.HSplitTop(20.0f, &Button, &ButtonArea); Button.VMargin(2.0f, &Button); static int s_RefreshButton = 0; if(DoButton_Menu(&s_RefreshButton, Localize("Refresh"), 0, &Button)) { if(g_Config.m_UiPage == PAGE_INTERNET) ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); else if(g_Config.m_UiPage == PAGE_LAN) ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); else if(g_Config.m_UiPage == PAGE_FAVORITES) ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); } ButtonArea.HSplitTop(5.0f, 0, &ButtonArea); ButtonArea.HSplitTop(20.0f, &Button, &ButtonArea); Button.VMargin(2.0f, &Button); static int s_JoinButton = 0; if(DoButton_Menu(&s_JoinButton, Localize("Connect"), 0, &Button) || m_EnterPressed) { Client()->Connect(g_Config.m_UiServerAddress); m_EnterPressed = false; } // address info StatusBox.VSplitLeft(20.0f, 0, &StatusBox); StatusBox.HSplitTop(20.0f, &Button, &StatusBox); UI()->DoLabelScaled(&Button, Localize("Host address"), 14.0f, -1); StatusBox.HSplitTop(20.0f, &Button, 0); static float Offset = 0.0f; DoEditBox(&g_Config.m_UiServerAddress, &Button, g_Config.m_UiServerAddress, sizeof(g_Config.m_UiServerAddress), 14.0f, &Offset); } } void CMenus::ConchainFriendlistUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments() == 2 && ((CMenus *)pUserData)->Client()->State() == IClient::STATE_OFFLINE) { ((CMenus *)pUserData)->FriendlistOnUpdate(); ((CMenus *)pUserData)->Client()->ServerBrowserUpdate(); } } void CMenus::ConchainServerbrowserUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments() && g_Config.m_UiPage == PAGE_FAVORITES && ((CMenus *)pUserData)->Client()->State() == IClient::STATE_OFFLINE) ((CMenus *)pUserData)->ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); } teeworlds-0.6.2+dfsg/src/game/client/components/menus_demo.cpp0000644000175000017500000005751212140200333023446 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include "maplayers.h" #include "menus.h" int CMenus::DoButton_DemoPlayer(const void *pID, const char *pText, int Checked, const CUIRect *pRect) { RenderTools()->DrawUIRect(pRect, vec4(1,1,1, Checked ? 0.10f : 0.5f)*ButtonColorMul(pID), CUI::CORNER_ALL, 5.0f); UI()->DoLabel(pRect, pText, 14.0f, 0); return UI()->DoButtonLogic(pID, pText, Checked, pRect); } int CMenus::DoButton_Sprite(const void *pID, int ImageID, int SpriteID, int Checked, const CUIRect *pRect, int Corners) { RenderTools()->DrawUIRect(pRect, Checked ? vec4(1.0f, 1.0f, 1.0f, 0.10f) : vec4(1.0f, 1.0f, 1.0f, 0.5f)*ButtonColorMul(pID), Corners, 5.0f); Graphics()->TextureSet(g_pData->m_aImages[ImageID].m_Id); Graphics()->QuadsBegin(); if(!Checked) Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.5f); RenderTools()->SelectSprite(SpriteID); IGraphics::CQuadItem QuadItem(pRect->x, pRect->y, pRect->w, pRect->h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); return UI()->DoButtonLogic(pID, "", Checked, pRect); } void CMenus::RenderDemoPlayer(CUIRect MainView) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); const float SeekBarHeight = 15.0f; const float ButtonbarHeight = 20.0f; const float NameBarHeight = 20.0f; const float Margins = 5.0f; float TotalHeight; if(m_MenuActive) TotalHeight = SeekBarHeight+ButtonbarHeight+NameBarHeight+Margins*3; else TotalHeight = SeekBarHeight+Margins*2; MainView.HSplitBottom(TotalHeight, 0, &MainView); MainView.VSplitLeft(50.0f, 0, &MainView); MainView.VSplitRight(450.0f, &MainView, 0); RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_T, 10.0f); MainView.Margin(5.0f, &MainView); CUIRect SeekBar, ButtonBar, NameBar; int CurrentTick = pInfo->m_CurrentTick - pInfo->m_FirstTick; int TotalTicks = pInfo->m_LastTick - pInfo->m_FirstTick; if(m_MenuActive) { MainView.HSplitTop(SeekBarHeight, &SeekBar, &ButtonBar); ButtonBar.HSplitTop(Margins, 0, &ButtonBar); ButtonBar.HSplitBottom(NameBarHeight, &ButtonBar, &NameBar); NameBar.HSplitTop(4.0f, 0, &NameBar); } else SeekBar = MainView; // do seekbar { static int s_SeekBarID = 0; void *id = &s_SeekBarID; char aBuffer[128]; // draw seek bar RenderTools()->DrawUIRect(&SeekBar, vec4(0,0,0,0.5f), CUI::CORNER_ALL, 5.0f); // draw filled bar float Amount = CurrentTick/(float)TotalTicks; CUIRect FilledBar = SeekBar; FilledBar.w = 10.0f + (FilledBar.w-10.0f)*Amount; RenderTools()->DrawUIRect(&FilledBar, vec4(1,1,1,0.5f), CUI::CORNER_ALL, 5.0f); // draw markers for(int i = 0; i < pInfo->m_NumTimelineMarkers; i++) { float Ratio = (pInfo->m_aTimelineMarkers[i]-pInfo->m_FirstTick) / (float)TotalTicks; Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); IGraphics::CQuadItem QuadItem(SeekBar.x + (SeekBar.w-10.0f)*Ratio, SeekBar.y, UI()->PixelSize(), SeekBar.h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } // draw time str_format(aBuffer, sizeof(aBuffer), "%d:%02d / %d:%02d", CurrentTick/SERVER_TICK_SPEED/60, (CurrentTick/SERVER_TICK_SPEED)%60, TotalTicks/SERVER_TICK_SPEED/60, (TotalTicks/SERVER_TICK_SPEED)%60); UI()->DoLabel(&SeekBar, aBuffer, SeekBar.h*0.70f, 0); // do the logic int Inside = UI()->MouseInside(&SeekBar); if(UI()->ActiveItem() == id) { if(!UI()->MouseButton(0)) UI()->SetActiveItem(0); else { static float PrevAmount = 0.0f; float Amount = (UI()->MouseX()-SeekBar.x)/(float)SeekBar.w; if(Amount > 0.0f && Amount < 1.0f && absolute(PrevAmount-Amount) >= 0.01f) { PrevAmount = Amount; m_pClient->OnReset(); m_pClient->m_SuppressEvents = true; DemoPlayer()->SetPos(Amount); m_pClient->m_SuppressEvents = false; m_pClient->m_pMapLayersBackGround->EnvelopeUpdate(); m_pClient->m_pMapLayersForeGround->EnvelopeUpdate(); } } } else if(UI()->HotItem() == id) { if(UI()->MouseButton(0)) UI()->SetActiveItem(id); } if(Inside) UI()->SetHotItem(id); } if(CurrentTick == TotalTicks) { m_pClient->OnReset(); DemoPlayer()->Pause(); DemoPlayer()->SetPos(0); } bool IncreaseDemoSpeed = false, DecreaseDemoSpeed = false; if(m_MenuActive) { // do buttons CUIRect Button; // combined play and pause button ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); static int s_PlayPauseButton = 0; if(!pInfo->m_Paused) { if(DoButton_Sprite(&s_PlayPauseButton, IMAGE_DEMOBUTTONS, SPRITE_DEMOBUTTON_PAUSE, false, &Button, CUI::CORNER_ALL)) DemoPlayer()->Pause(); } else { if(DoButton_Sprite(&s_PlayPauseButton, IMAGE_DEMOBUTTONS, SPRITE_DEMOBUTTON_PLAY, false, &Button, CUI::CORNER_ALL)) DemoPlayer()->Unpause(); } // stop button ButtonBar.VSplitLeft(Margins, 0, &ButtonBar); ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); static int s_ResetButton = 0; if(DoButton_Sprite(&s_ResetButton, IMAGE_DEMOBUTTONS, SPRITE_DEMOBUTTON_STOP, false, &Button, CUI::CORNER_ALL)) { m_pClient->OnReset(); DemoPlayer()->Pause(); DemoPlayer()->SetPos(0); } // slowdown ButtonBar.VSplitLeft(Margins, 0, &ButtonBar); ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); static int s_SlowDownButton = 0; if(DoButton_Sprite(&s_SlowDownButton, IMAGE_DEMOBUTTONS, SPRITE_DEMOBUTTON_SLOWER, 0, &Button, CUI::CORNER_ALL) || Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) DecreaseDemoSpeed = true; // fastforward ButtonBar.VSplitLeft(Margins, 0, &ButtonBar); ButtonBar.VSplitLeft(ButtonbarHeight, &Button, &ButtonBar); static int s_FastForwardButton = 0; if(DoButton_Sprite(&s_FastForwardButton, IMAGE_DEMOBUTTONS, SPRITE_DEMOBUTTON_FASTER, 0, &Button, CUI::CORNER_ALL)) IncreaseDemoSpeed = true; // speed meter ButtonBar.VSplitLeft(Margins*3, 0, &ButtonBar); char aBuffer[64]; if(pInfo->m_Speed >= 1.0f) str_format(aBuffer, sizeof(aBuffer), "x%.0f", pInfo->m_Speed); else str_format(aBuffer, sizeof(aBuffer), "x%.2f", pInfo->m_Speed); UI()->DoLabel(&ButtonBar, aBuffer, Button.h*0.7f, -1); // close button ButtonBar.VSplitRight(ButtonbarHeight*3, &ButtonBar, &Button); static int s_ExitButton = 0; if(DoButton_DemoPlayer(&s_ExitButton, Localize("Close"), 0, &Button)) Client()->Disconnect(); // demo name char aDemoName[64] = {0}; DemoPlayer()->GetDemoName(aDemoName, sizeof(aDemoName)); char aBuf[128]; str_format(aBuf, sizeof(aBuf), Localize("Demofile: %s"), aDemoName); CTextCursor Cursor; TextRender()->SetCursor(&Cursor, NameBar.x, NameBar.y, Button.h*0.5f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = MainView.w; TextRender()->TextEx(&Cursor, aBuf, -1); } if(IncreaseDemoSpeed || Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) { if(pInfo->m_Speed < 0.1f) DemoPlayer()->SetSpeed(0.1f); else if(pInfo->m_Speed < 0.25f) DemoPlayer()->SetSpeed(0.25f); else if(pInfo->m_Speed < 0.5f) DemoPlayer()->SetSpeed(0.5f); else if(pInfo->m_Speed < 0.75f) DemoPlayer()->SetSpeed(0.75f); else if(pInfo->m_Speed < 1.0f) DemoPlayer()->SetSpeed(1.0f); else if(pInfo->m_Speed < 2.0f) DemoPlayer()->SetSpeed(2.0f); else if(pInfo->m_Speed < 4.0f) DemoPlayer()->SetSpeed(4.0f); else DemoPlayer()->SetSpeed(8.0f); } else if(DecreaseDemoSpeed || Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) { if(pInfo->m_Speed > 4.0f) DemoPlayer()->SetSpeed(4.0f); else if(pInfo->m_Speed > 2.0f) DemoPlayer()->SetSpeed(2.0f); else if(pInfo->m_Speed > 1.0f) DemoPlayer()->SetSpeed(1.0f); else if(pInfo->m_Speed > 0.75f) DemoPlayer()->SetSpeed(0.75f); else if(pInfo->m_Speed > 0.5f) DemoPlayer()->SetSpeed(0.5f); else if(pInfo->m_Speed > 0.25f) DemoPlayer()->SetSpeed(0.25f); else if(pInfo->m_Speed > 0.1f) DemoPlayer()->SetSpeed(0.1f); else DemoPlayer()->SetSpeed(0.05f); } } static CUIRect gs_ListBoxOriginalView; static CUIRect gs_ListBoxView; static float gs_ListBoxRowHeight; static int gs_ListBoxItemIndex; static int gs_ListBoxSelectedIndex; static int gs_ListBoxNewSelected; static int gs_ListBoxDoneEvents; static int gs_ListBoxNumItems; static int gs_ListBoxItemsPerRow; static float gs_ListBoxScrollValue; static bool gs_ListBoxItemActivated; void CMenus::UiDoListboxStart(const void *pID, const CUIRect *pRect, float RowHeight, const char *pTitle, const char *pBottomText, int NumItems, int ItemsPerRow, int SelectedIndex, float ScrollValue) { CUIRect Scroll, Row; CUIRect View = *pRect; CUIRect Header, Footer; // draw header View.HSplitTop(ms_ListheaderHeight, &Header, &View); RenderTools()->DrawUIRect(&Header, vec4(1,1,1,0.25f), CUI::CORNER_T, 5.0f); UI()->DoLabel(&Header, pTitle, Header.h*ms_FontmodHeight, 0); // draw footers View.HSplitBottom(ms_ListheaderHeight, &View, &Footer); RenderTools()->DrawUIRect(&Footer, vec4(1,1,1,0.25f), CUI::CORNER_B, 5.0f); Footer.VSplitLeft(10.0f, 0, &Footer); UI()->DoLabel(&Footer, pBottomText, Header.h*ms_FontmodHeight, 0); // background RenderTools()->DrawUIRect(&View, vec4(0,0,0,0.15f), 0, 0); // prepare the scroll View.VSplitRight(15, &View, &Scroll); // setup the variables gs_ListBoxOriginalView = View; gs_ListBoxSelectedIndex = SelectedIndex; gs_ListBoxNewSelected = SelectedIndex; gs_ListBoxItemIndex = 0; gs_ListBoxRowHeight = RowHeight; gs_ListBoxNumItems = NumItems; gs_ListBoxItemsPerRow = ItemsPerRow; gs_ListBoxDoneEvents = 0; gs_ListBoxScrollValue = ScrollValue; gs_ListBoxItemActivated = false; // do the scrollbar View.HSplitTop(gs_ListBoxRowHeight, &Row, 0); int NumViewable = (int)(gs_ListBoxOriginalView.h/Row.h) + 1; int Num = (NumItems+gs_ListBoxItemsPerRow-1)/gs_ListBoxItemsPerRow-NumViewable+1; if(Num < 0) Num = 0; if(Num > 0) { if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP) && UI()->MouseInside(&View)) gs_ListBoxScrollValue -= 3.0f/Num; if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN) && UI()->MouseInside(&View)) gs_ListBoxScrollValue += 3.0f/Num; if(gs_ListBoxScrollValue < 0.0f) gs_ListBoxScrollValue = 0.0f; if(gs_ListBoxScrollValue > 1.0f) gs_ListBoxScrollValue = 1.0f; } Scroll.HMargin(5.0f, &Scroll); gs_ListBoxScrollValue = DoScrollbarV(pID, &Scroll, gs_ListBoxScrollValue); // the list gs_ListBoxView = gs_ListBoxOriginalView; gs_ListBoxView.VMargin(5.0f, &gs_ListBoxView); UI()->ClipEnable(&gs_ListBoxView); gs_ListBoxView.y -= gs_ListBoxScrollValue*Num*Row.h; } CMenus::CListboxItem CMenus::UiDoListboxNextRow() { static CUIRect s_RowView; CListboxItem Item = {0}; if(gs_ListBoxItemIndex%gs_ListBoxItemsPerRow == 0) gs_ListBoxView.HSplitTop(gs_ListBoxRowHeight /*-2.0f*/, &s_RowView, &gs_ListBoxView); s_RowView.VSplitLeft(s_RowView.w/(gs_ListBoxItemsPerRow-gs_ListBoxItemIndex%gs_ListBoxItemsPerRow)/(UI()->Scale()), &Item.m_Rect, &s_RowView); Item.m_Visible = 1; //item.rect = row; Item.m_HitRect = Item.m_Rect; //CUIRect select_hit_box = item.rect; if(gs_ListBoxSelectedIndex == gs_ListBoxItemIndex) Item.m_Selected = 1; // make sure that only those in view can be selected if(Item.m_Rect.y+Item.m_Rect.h > gs_ListBoxOriginalView.y) { if(Item.m_HitRect.y < Item.m_HitRect.y) // clip the selection { Item.m_HitRect.h -= gs_ListBoxOriginalView.y-Item.m_HitRect.y; Item.m_HitRect.y = gs_ListBoxOriginalView.y; } } else Item.m_Visible = 0; // check if we need to do more if(Item.m_Rect.y > gs_ListBoxOriginalView.y+gs_ListBoxOriginalView.h) Item.m_Visible = 0; gs_ListBoxItemIndex++; return Item; } CMenus::CListboxItem CMenus::UiDoListboxNextItem(const void *pId, bool Selected) { int ThisItemIndex = gs_ListBoxItemIndex; if(Selected) { if(gs_ListBoxSelectedIndex == gs_ListBoxNewSelected) gs_ListBoxNewSelected = ThisItemIndex; gs_ListBoxSelectedIndex = ThisItemIndex; } CListboxItem Item = UiDoListboxNextRow(); if(Item.m_Visible && UI()->DoButtonLogic(pId, "", gs_ListBoxSelectedIndex == gs_ListBoxItemIndex, &Item.m_HitRect)) gs_ListBoxNewSelected = ThisItemIndex; // process input, regard selected index if(gs_ListBoxSelectedIndex == ThisItemIndex) { if(!gs_ListBoxDoneEvents) { gs_ListBoxDoneEvents = 1; if(m_EnterPressed || (UI()->ActiveItem() == pId && Input()->MouseDoubleClick())) { gs_ListBoxItemActivated = true; UI()->SetActiveItem(0); } else { for(int i = 0; i < m_NumInputEvents; i++) { int NewIndex = -1; if(m_aInputEvents[i].m_Flags&IInput::FLAG_PRESS) { if(m_aInputEvents[i].m_Key == KEY_DOWN) NewIndex = gs_ListBoxNewSelected + 1; if(m_aInputEvents[i].m_Key == KEY_UP) NewIndex = gs_ListBoxNewSelected - 1; } if(NewIndex > -1 && NewIndex < gs_ListBoxNumItems) { // scroll float Offset = (NewIndex/gs_ListBoxItemsPerRow-gs_ListBoxNewSelected/gs_ListBoxItemsPerRow)*gs_ListBoxRowHeight; int Scroll = gs_ListBoxOriginalView.y > Item.m_Rect.y+Offset ? -1 : gs_ListBoxOriginalView.y+gs_ListBoxOriginalView.h < Item.m_Rect.y+Item.m_Rect.h+Offset ? 1 : 0; if(Scroll) { int NumViewable = (int)(gs_ListBoxOriginalView.h/gs_ListBoxRowHeight) + 1; int ScrollNum = (gs_ListBoxNumItems+gs_ListBoxItemsPerRow-1)/gs_ListBoxItemsPerRow-NumViewable+1; if(Scroll < 0) { int Num = (gs_ListBoxOriginalView.y-Item.m_Rect.y-Offset+gs_ListBoxRowHeight-1.0f)/gs_ListBoxRowHeight; gs_ListBoxScrollValue -= (1.0f/ScrollNum)*Num; } else { int Num = (Item.m_Rect.y+Item.m_Rect.h+Offset-(gs_ListBoxOriginalView.y+gs_ListBoxOriginalView.h)+gs_ListBoxRowHeight-1.0f)/ gs_ListBoxRowHeight; gs_ListBoxScrollValue += (1.0f/ScrollNum)*Num; } if(gs_ListBoxScrollValue < 0.0f) gs_ListBoxScrollValue = 0.0f; if(gs_ListBoxScrollValue > 1.0f) gs_ListBoxScrollValue = 1.0f; } gs_ListBoxNewSelected = NewIndex; } } } } //selected_index = i; CUIRect r = Item.m_Rect; r.Margin(1.5f, &r); RenderTools()->DrawUIRect(&r, vec4(1,1,1,0.5f), CUI::CORNER_ALL, 4.0f); } return Item; } int CMenus::UiDoListboxEnd(float *pScrollValue, bool *pItemActivated) { UI()->ClipDisable(); if(pScrollValue) *pScrollValue = gs_ListBoxScrollValue; if(pItemActivated) *pItemActivated = gs_ListBoxItemActivated; return gs_ListBoxNewSelected; } int CMenus::DemolistFetchCallback(const char *pName, int IsDir, int StorageType, void *pUser) { CMenus *pSelf = (CMenus *)pUser; int Length = str_length(pName); if((pName[0] == '.' && (pName[1] == 0 || (pName[1] == '.' && pName[2] == 0 && !str_comp(pSelf->m_aCurrentDemoFolder, "demos")))) || (!IsDir && (Length < 5 || str_comp(pName+Length-5, ".demo")))) return 0; CDemoItem Item; str_copy(Item.m_aFilename, pName, sizeof(Item.m_aFilename)); if(IsDir) { str_format(Item.m_aName, sizeof(Item.m_aName), "%s/", pName); Item.m_Valid = false; } else { str_copy(Item.m_aName, pName, min(static_cast(sizeof(Item.m_aName)), Length-4)); Item.m_InfosLoaded = false; } Item.m_IsDir = IsDir != 0; Item.m_StorageType = StorageType; pSelf->m_lDemos.add_unsorted(Item); return 0; } void CMenus::DemolistPopulate() { m_lDemos.clear(); if(!str_comp(m_aCurrentDemoFolder, "demos")) m_DemolistStorageType = IStorage::TYPE_ALL; Storage()->ListDirectory(m_DemolistStorageType, m_aCurrentDemoFolder, DemolistFetchCallback, this); m_lDemos.sort_range(); } void CMenus::DemolistOnUpdate(bool Reset) { m_DemolistSelectedIndex = Reset ? m_lDemos.size() > 0 ? 0 : -1 : m_DemolistSelectedIndex >= m_lDemos.size() ? m_lDemos.size()-1 : m_DemolistSelectedIndex; m_DemolistSelectedIsDir = m_DemolistSelectedIndex < 0 ? false : m_lDemos[m_DemolistSelectedIndex].m_IsDir; } void CMenus::RenderDemoList(CUIRect MainView) { static int s_Inited = 0; if(!s_Inited) { DemolistPopulate(); DemolistOnUpdate(true); s_Inited = 1; } char aFooterLabel[128] = {0}; if(m_DemolistSelectedIndex >= 0) { CDemoItem *Item = &m_lDemos[m_DemolistSelectedIndex]; if(str_comp(Item->m_aFilename, "..") == 0) str_copy(aFooterLabel, Localize("Parent Folder"), sizeof(aFooterLabel)); else if(m_DemolistSelectedIsDir) str_copy(aFooterLabel, Localize("Folder"), sizeof(aFooterLabel)); else { if(!Item->m_InfosLoaded) { char aBuffer[512]; str_format(aBuffer, sizeof(aBuffer), "%s/%s", m_aCurrentDemoFolder, Item->m_aFilename); Item->m_Valid = DemoPlayer()->GetDemoInfo(Storage(), aBuffer, Item->m_StorageType, &Item->m_Info); Item->m_InfosLoaded = true; } if(!Item->m_Valid) str_copy(aFooterLabel, Localize("Invalid Demo"), sizeof(aFooterLabel)); else str_copy(aFooterLabel, Localize("Demo details"), sizeof(aFooterLabel)); } } // render background RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); MainView.Margin(10.0f, &MainView); CUIRect ButtonBar, RefreshRect, PlayRect, DeleteRect, RenameRect, FileIcon, ListBox; MainView.HSplitBottom(ms_ButtonHeight+5.0f, &MainView, &ButtonBar); ButtonBar.HSplitTop(5.0f, 0, &ButtonBar); ButtonBar.VSplitRight(130.0f, &ButtonBar, &PlayRect); ButtonBar.VSplitLeft(130.0f, &RefreshRect, &ButtonBar); ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(120.0f, &DeleteRect, &ButtonBar); ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(120.0f, &RenameRect, &ButtonBar); MainView.HSplitBottom(140.0f, &ListBox, &MainView); // render demo info MainView.VMargin(5.0f, &MainView); MainView.HSplitBottom(5.0f, &MainView, 0); RenderTools()->DrawUIRect(&MainView, vec4(0,0,0,0.15f), CUI::CORNER_B, 4.0f); if(!m_DemolistSelectedIsDir && m_DemolistSelectedIndex >= 0 && m_lDemos[m_DemolistSelectedIndex].m_Valid) { CUIRect Left, Right, Labels; MainView.Margin(20.0f, &MainView); MainView.VSplitMid(&Labels, &MainView); // left side Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(150.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Created:"), 14.0f, -1); UI()->DoLabelScaled(&Right, m_lDemos[m_DemolistSelectedIndex].m_Info.m_aTimestamp, 14.0f, -1); Labels.HSplitTop(5.0f, 0, &Labels); Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(150.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Type:"), 14.0f, -1); UI()->DoLabelScaled(&Right, m_lDemos[m_DemolistSelectedIndex].m_Info.m_aType, 14.0f, -1); Labels.HSplitTop(5.0f, 0, &Labels); Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(150.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Length:"), 14.0f, -1); int Length = ((m_lDemos[m_DemolistSelectedIndex].m_Info.m_aLength[0]<<24)&0xFF000000) | ((m_lDemos[m_DemolistSelectedIndex].m_Info.m_aLength[1]<<16)&0xFF0000) | ((m_lDemos[m_DemolistSelectedIndex].m_Info.m_aLength[2]<<8)&0xFF00) | (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aLength[3]&0xFF); char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%d:%02d", Length/60, Length%60); UI()->DoLabelScaled(&Right, aBuf, 14.0f, -1); Labels.HSplitTop(5.0f, 0, &Labels); Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(150.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Version:"), 14.0f, -1); str_format(aBuf, sizeof(aBuf), "%d", m_lDemos[m_DemolistSelectedIndex].m_Info.m_Version); UI()->DoLabelScaled(&Right, aBuf, 14.0f, -1); // right side Labels = MainView; Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(150.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Map:"), 14.0f, -1); UI()->DoLabelScaled(&Right, m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapName, 14.0f, -1); Labels.HSplitTop(5.0f, 0, &Labels); Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(20.0f, 0, &Left); Left.VSplitLeft(130.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Size:"), 14.0f, -1); unsigned Size = (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapSize[0]<<24) | (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapSize[1]<<16) | (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapSize[2]<<8) | (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapSize[3]); str_format(aBuf, sizeof(aBuf), Localize("%d Bytes"), Size); UI()->DoLabelScaled(&Right, aBuf, 14.0f, -1); Labels.HSplitTop(5.0f, 0, &Labels); Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(20.0f, 0, &Left); Left.VSplitLeft(130.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Crc:"), 14.0f, -1); unsigned Crc = (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapCrc[0]<<24) | (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapCrc[1]<<16) | (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapCrc[2]<<8) | (m_lDemos[m_DemolistSelectedIndex].m_Info.m_aMapCrc[3]); str_format(aBuf, sizeof(aBuf), "%08x", Crc); UI()->DoLabelScaled(&Right, aBuf, 14.0f, -1); Labels.HSplitTop(5.0f, 0, &Labels); Labels.HSplitTop(20.0f, &Left, &Labels); Left.VSplitLeft(150.0f, &Left, &Right); UI()->DoLabelScaled(&Left, Localize("Netversion:"), 14.0f, -1); UI()->DoLabelScaled(&Right, m_lDemos[m_DemolistSelectedIndex].m_Info.m_aNetversion, 14.0f, -1); } static int s_DemoListId = 0; static float s_ScrollValue = 0; UiDoListboxStart(&s_DemoListId, &ListBox, 17.0f, Localize("Demos"), aFooterLabel, m_lDemos.size(), 1, m_DemolistSelectedIndex, s_ScrollValue); for(sorted_array::range r = m_lDemos.all(); !r.empty(); r.pop_front()) { CListboxItem Item = UiDoListboxNextItem((void*)(&r.front())); if(Item.m_Visible) { Item.m_Rect.VSplitLeft(Item.m_Rect.h, &FileIcon, &Item.m_Rect); Item.m_Rect.VSplitLeft(5.0f, 0, &Item.m_Rect); DoButton_Icon(IMAGE_FILEICONS, r.front().m_IsDir?SPRITE_FILE_FOLDER:SPRITE_FILE_DEMO1, &FileIcon); UI()->DoLabel(&Item.m_Rect, r.front().m_aName, Item.m_Rect.h*ms_FontmodHeight, -1); } } bool Activated = false; m_DemolistSelectedIndex = UiDoListboxEnd(&s_ScrollValue, &Activated); DemolistOnUpdate(false); static int s_RefreshButton = 0; if(DoButton_Menu(&s_RefreshButton, Localize("Refresh"), 0, &RefreshRect)) { DemolistPopulate(); DemolistOnUpdate(false); } static int s_PlayButton = 0; if(DoButton_Menu(&s_PlayButton, m_DemolistSelectedIsDir?Localize("Open"):Localize("Play"), 0, &PlayRect) || Activated) { if(m_DemolistSelectedIndex >= 0) { if(m_DemolistSelectedIsDir) // folder { if(str_comp(m_lDemos[m_DemolistSelectedIndex].m_aFilename, "..") == 0) // parent folder fs_parent_dir(m_aCurrentDemoFolder); else // sub folder { char aTemp[256]; str_copy(aTemp, m_aCurrentDemoFolder, sizeof(aTemp)); str_format(m_aCurrentDemoFolder, sizeof(m_aCurrentDemoFolder), "%s/%s", aTemp, m_lDemos[m_DemolistSelectedIndex].m_aFilename); m_DemolistStorageType = m_lDemos[m_DemolistSelectedIndex].m_StorageType; } DemolistPopulate(); DemolistOnUpdate(true); } else // file { char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%s/%s", m_aCurrentDemoFolder, m_lDemos[m_DemolistSelectedIndex].m_aFilename); const char *pError = Client()->DemoPlayer_Play(aBuf, m_lDemos[m_DemolistSelectedIndex].m_StorageType); if(pError) PopupMessage(Localize("Error"), str_comp(pError, "error loading demo") ? pError : Localize("Error loading demo"), Localize("Ok")); else { UI()->SetActiveItem(0); return; } } } } if(!m_DemolistSelectedIsDir) { static int s_DeleteButton = 0; if(DoButton_Menu(&s_DeleteButton, Localize("Delete"), 0, &DeleteRect) || m_DeletePressed) { if(m_DemolistSelectedIndex >= 0) { UI()->SetActiveItem(0); m_Popup = POPUP_DELETE_DEMO; return; } } static int s_RenameButton = 0; if(DoButton_Menu(&s_RenameButton, Localize("Rename"), 0, &RenameRect)) { if(m_DemolistSelectedIndex >= 0) { UI()->SetActiveItem(0); m_Popup = POPUP_RENAME_DEMO; str_copy(m_aCurrentDemoFile, m_lDemos[m_DemolistSelectedIndex].m_aFilename, sizeof(m_aCurrentDemoFile)); return; } } } } teeworlds-0.6.2+dfsg/src/game/client/components/menus_ingame.cpp0000644000175000017500000004637512140200333023767 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "menus.h" #include "motd.h" #include "voting.h" void CMenus::RenderGame(CUIRect MainView) { CUIRect Button, ButtonBar; MainView.HSplitTop(45.0f, &ButtonBar, &MainView); RenderTools()->DrawUIRect(&ButtonBar, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); // button bar ButtonBar.HSplitTop(10.0f, 0, &ButtonBar); ButtonBar.HSplitTop(25.0f, &ButtonBar, 0); ButtonBar.VMargin(10.0f, &ButtonBar); ButtonBar.VSplitRight(120.0f, &ButtonBar, &Button); static int s_DisconnectButton = 0; if(DoButton_Menu(&s_DisconnectButton, Localize("Disconnect"), 0, &Button)) Client()->Disconnect(); if(m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pGameInfoObj) { if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS) { ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); static int s_SpectateButton = 0; if(DoButton_Menu(&s_SpectateButton, Localize("Spectate"), 0, &Button)) { m_pClient->SendSwitchTeam(TEAM_SPECTATORS); SetActive(false); } } if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) { if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_RED) { ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); static int s_SpectateButton = 0; if(DoButton_Menu(&s_SpectateButton, Localize("Join red"), 0, &Button)) { m_pClient->SendSwitchTeam(TEAM_RED); SetActive(false); } } if(m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_BLUE) { ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); static int s_SpectateButton = 0; if(DoButton_Menu(&s_SpectateButton, Localize("Join blue"), 0, &Button)) { m_pClient->SendSwitchTeam(TEAM_BLUE); SetActive(false); } } } else { if(m_pClient->m_Snap.m_pLocalInfo->m_Team != 0) { ButtonBar.VSplitLeft(10.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(120.0f, &Button, &ButtonBar); static int s_SpectateButton = 0; if(DoButton_Menu(&s_SpectateButton, Localize("Join game"), 0, &Button)) { m_pClient->SendSwitchTeam(0); SetActive(false); } } } } ButtonBar.VSplitLeft(100.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(150.0f, &Button, &ButtonBar); static int s_DemoButton = 0; bool Recording = DemoRecorder()->IsRecording(); if(DoButton_Menu(&s_DemoButton, Localize(Recording ? "Stop record" : "Record demo"), 0, &Button)) // Localize("Stop record");Localize("Record demo"); { if(!Recording) Client()->DemoRecorder_Start("demo", true); else Client()->DemoRecorder_Stop(); } } void CMenus::RenderPlayers(CUIRect MainView) { CUIRect Button, ButtonBar, Options, Player; RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); // player options MainView.Margin(10.0f, &Options); RenderTools()->DrawUIRect(&Options, vec4(1.0f, 1.0f, 1.0f, 0.25f), CUI::CORNER_ALL, 10.0f); Options.Margin(10.0f, &Options); Options.HSplitTop(50.0f, &Button, &Options); UI()->DoLabelScaled(&Button, Localize("Player options"), 34.0f, -1); // headline Options.HSplitTop(34.0f, &ButtonBar, &Options); ButtonBar.VSplitRight(220.0f, &Player, &ButtonBar); UI()->DoLabelScaled(&Player, Localize("Player"), 24.0f, -1); ButtonBar.HMargin(1.0f, &ButtonBar); float Width = ButtonBar.h*2.0f; ButtonBar.VSplitLeft(Width, &Button, &ButtonBar); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIICONS].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(SPRITE_GUIICON_MUTE); IGraphics::CQuadItem QuadItem(Button.x, Button.y, Button.w, Button.h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); ButtonBar.VSplitLeft(20.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(Width, &Button, &ButtonBar); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GUIICONS].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(SPRITE_GUIICON_FRIEND); QuadItem = IGraphics::CQuadItem(Button.x, Button.y, Button.w, Button.h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); // options static int s_aPlayerIDs[MAX_CLIENTS][2] = {{0}}; for(int i = 0, Count = 0; i < MAX_CLIENTS; ++i) { if(!m_pClient->m_Snap.m_paInfoByTeam[i]) continue; int Index = m_pClient->m_Snap.m_paInfoByTeam[i]->m_ClientID; if(Index == m_pClient->m_Snap.m_LocalClientID) continue; Options.HSplitTop(28.0f, &ButtonBar, &Options); if(Count++%2 == 0) RenderTools()->DrawUIRect(&ButtonBar, vec4(1.0f, 1.0f, 1.0f, 0.25f), CUI::CORNER_ALL, 10.0f); ButtonBar.VSplitRight(220.0f, &Player, &ButtonBar); // player info Player.VSplitLeft(28.0f, &Button, &Player); CTeeRenderInfo Info = m_pClient->m_aClients[Index].m_RenderInfo; Info.m_Size = Button.h; RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1.0f, 0.0f), vec2(Button.x+Button.h/2, Button.y+Button.h/2)); Player.HSplitTop(1.5f, 0, &Player); Player.VSplitMid(&Player, &Button); CTextCursor Cursor; TextRender()->SetCursor(&Cursor, Player.x, Player.y, 14.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Player.w; TextRender()->TextEx(&Cursor, m_pClient->m_aClients[Index].m_aName, -1); TextRender()->SetCursor(&Cursor, Button.x,Button.y, 14.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = Button.w; TextRender()->TextEx(&Cursor, m_pClient->m_aClients[Index].m_aClan, -1); // ignore button ButtonBar.HMargin(2.0f, &ButtonBar); ButtonBar.VSplitLeft(Width, &Button, &ButtonBar); Button.VSplitLeft((Width-Button.h)/4.0f, 0, &Button); Button.VSplitLeft(Button.h, &Button, 0); if(g_Config.m_ClShowChatFriends && !m_pClient->m_aClients[Index].m_Friend) DoButton_Toggle(&s_aPlayerIDs[Index][0], 1, &Button, false); else if(DoButton_Toggle(&s_aPlayerIDs[Index][0], m_pClient->m_aClients[Index].m_ChatIgnore, &Button, true)) m_pClient->m_aClients[Index].m_ChatIgnore ^= 1; // friend button ButtonBar.VSplitLeft(20.0f, &Button, &ButtonBar); ButtonBar.VSplitLeft(Width, &Button, &ButtonBar); Button.VSplitLeft((Width-Button.h)/4.0f, 0, &Button); Button.VSplitLeft(Button.h, &Button, 0); if(DoButton_Toggle(&s_aPlayerIDs[Index][1], m_pClient->m_aClients[Index].m_Friend, &Button, true)) { if(m_pClient->m_aClients[Index].m_Friend) m_pClient->Friends()->RemoveFriend(m_pClient->m_aClients[Index].m_aName, m_pClient->m_aClients[Index].m_aClan); else m_pClient->Friends()->AddFriend(m_pClient->m_aClients[Index].m_aName, m_pClient->m_aClients[Index].m_aClan); } } /* CUIRect bars; votearea.HSplitTop(10.0f, 0, &votearea); votearea.HSplitTop(25.0f + 10.0f*3 + 25.0f, &votearea, &bars); RenderTools()->DrawUIRect(&votearea, color_tabbar_active, CUI::CORNER_ALL, 10.0f); votearea.VMargin(20.0f, &votearea); votearea.HMargin(10.0f, &votearea); votearea.HSplitBottom(35.0f, &votearea, &bars); if(gameclient.voting->is_voting()) { // do yes button votearea.VSplitLeft(50.0f, &button, &votearea); static int yes_button = 0; if(UI()->DoButton(&yes_button, "Yes", 0, &button, ui_draw_menu_button, 0)) gameclient.voting->vote(1); // do no button votearea.VSplitLeft(5.0f, 0, &votearea); votearea.VSplitLeft(50.0f, &button, &votearea); static int no_button = 0; if(UI()->DoButton(&no_button, "No", 0, &button, ui_draw_menu_button, 0)) gameclient.voting->vote(-1); // do time left votearea.VSplitRight(50.0f, &votearea, &button); char buf[256]; str_format(buf, sizeof(buf), "%d", gameclient.voting->seconds_left()); UI()->DoLabel(&button, buf, 24.0f, 0); // do description and command votearea.VSplitLeft(5.0f, 0, &votearea); UI()->DoLabel(&votearea, gameclient.voting->vote_description(), 14.0f, -1); votearea.HSplitTop(16.0f, 0, &votearea); UI()->DoLabel(&votearea, gameclient.voting->vote_command(), 10.0f, -1); // do bars bars.HSplitTop(10.0f, 0, &bars); bars.HMargin(5.0f, &bars); gameclient.voting->render_bars(bars, true); } else { UI()->DoLabel(&votearea, "No vote in progress", 18.0f, -1); }*/ } void CMenus::RenderServerInfo(CUIRect MainView) { if(!m_pClient->m_Snap.m_pLocalInfo) return; // fetch server info CServerInfo CurrentServerInfo; Client()->GetServerInfo(&CurrentServerInfo); // render background RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_ALL, 10.0f); CUIRect View, ServerInfo, GameInfo, Motd; float x = 0.0f; float y = 0.0f; char aBuf[1024]; // set view to use for all sub-modules MainView.Margin(10.0f, &View); // serverinfo View.HSplitTop(View.h/2/UI()->Scale()-5.0f, &ServerInfo, &Motd); ServerInfo.VSplitLeft(View.w/2/UI()->Scale()-5.0f, &ServerInfo, &GameInfo); RenderTools()->DrawUIRect(&ServerInfo, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); ServerInfo.Margin(5.0f, &ServerInfo); x = 5.0f; y = 0.0f; TextRender()->Text(0, ServerInfo.x+x, ServerInfo.y+y, 32, Localize("Server info"), 250); y += 32.0f+5.0f; mem_zero(aBuf, sizeof(aBuf)); str_format( aBuf, sizeof(aBuf), "%s\n\n" "%s: %s\n" "%s: %d\n" "%s: %s\n" "%s: %s\n", CurrentServerInfo.m_aName, Localize("Address"), g_Config.m_UiServerAddress, Localize("Ping"), m_pClient->m_Snap.m_pLocalInfo->m_Latency, Localize("Version"), CurrentServerInfo.m_aVersion, Localize("Password"), CurrentServerInfo.m_Flags &1 ? Localize("Yes") : Localize("No") ); TextRender()->Text(0, ServerInfo.x+x, ServerInfo.y+y, 20, aBuf, 250); { CUIRect Button; int IsFavorite = ServerBrowser()->IsFavorite(CurrentServerInfo.m_NetAddr); ServerInfo.HSplitBottom(20.0f, &ServerInfo, &Button); static int s_AddFavButton = 0; if(DoButton_CheckBox(&s_AddFavButton, Localize("Favorite"), IsFavorite, &Button)) { if(IsFavorite) ServerBrowser()->RemoveFavorite(CurrentServerInfo.m_NetAddr); else ServerBrowser()->AddFavorite(CurrentServerInfo.m_NetAddr); } } // gameinfo GameInfo.VSplitLeft(10.0f, 0x0, &GameInfo); RenderTools()->DrawUIRect(&GameInfo, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); GameInfo.Margin(5.0f, &GameInfo); x = 5.0f; y = 0.0f; TextRender()->Text(0, GameInfo.x+x, GameInfo.y+y, 32, Localize("Game info"), 250); y += 32.0f+5.0f; if(m_pClient->m_Snap.m_pGameInfoObj) { mem_zero(aBuf, sizeof(aBuf)); str_format( aBuf, sizeof(aBuf), "\n\n" "%s: %s\n" "%s: %s\n" "%s: %d\n" "%s: %d\n" "\n" "%s: %d/%d\n", Localize("Game type"), CurrentServerInfo.m_aGameType, Localize("Map"), CurrentServerInfo.m_aMap, Localize("Score limit"), m_pClient->m_Snap.m_pGameInfoObj->m_ScoreLimit, Localize("Time limit"), m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit, Localize("Players"), m_pClient->m_Snap.m_NumPlayers, CurrentServerInfo.m_MaxClients ); TextRender()->Text(0, GameInfo.x+x, GameInfo.y+y, 20, aBuf, 250); } // motd Motd.HSplitTop(10.0f, 0, &Motd); RenderTools()->DrawUIRect(&Motd, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); Motd.Margin(5.0f, &Motd); y = 0.0f; x = 5.0f; TextRender()->Text(0, Motd.x+x, Motd.y+y, 32, Localize("MOTD"), -1); y += 32.0f+5.0f; TextRender()->Text(0, Motd.x+x, Motd.y+y, 16, m_pClient->m_pMotd->m_aServerMotd, (int)Motd.w); } void CMenus::RenderServerControlServer(CUIRect MainView) { static int s_VoteList = 0; static float s_ScrollValue = 0; CUIRect List = MainView; UiDoListboxStart(&s_VoteList, &List, 24.0f, "", "", m_pClient->m_pVoting->m_NumVoteOptions, 1, m_CallvoteSelectedOption, s_ScrollValue); for(CVoteOptionClient *pOption = m_pClient->m_pVoting->m_pFirst; pOption; pOption = pOption->m_pNext) { CListboxItem Item = UiDoListboxNextItem(pOption); if(Item.m_Visible) UI()->DoLabelScaled(&Item.m_Rect, pOption->m_aDescription, 16.0f, -1); } m_CallvoteSelectedOption = UiDoListboxEnd(&s_ScrollValue, 0); } void CMenus::RenderServerControlKick(CUIRect MainView, bool FilterSpectators) { int NumOptions = 0; int Selected = -1; static int aPlayerIDs[MAX_CLIENTS]; for(int i = 0; i < MAX_CLIENTS; i++) { if(!m_pClient->m_Snap.m_paInfoByTeam[i]) continue; int Index = m_pClient->m_Snap.m_paInfoByTeam[i]->m_ClientID; if(Index == m_pClient->m_Snap.m_LocalClientID || (FilterSpectators && m_pClient->m_Snap.m_paInfoByTeam[i]->m_Team == TEAM_SPECTATORS)) continue; if(m_CallvoteSelectedPlayer == Index) Selected = NumOptions; aPlayerIDs[NumOptions++] = Index; } static int s_VoteList = 0; static float s_ScrollValue = 0; CUIRect List = MainView; UiDoListboxStart(&s_VoteList, &List, 24.0f, "", "", NumOptions, 1, Selected, s_ScrollValue); for(int i = 0; i < NumOptions; i++) { CListboxItem Item = UiDoListboxNextItem(&aPlayerIDs[i]); if(Item.m_Visible) { CTeeRenderInfo Info = m_pClient->m_aClients[aPlayerIDs[i]].m_RenderInfo; Info.m_Size = Item.m_Rect.h; Item.m_Rect.HSplitTop(5.0f, 0, &Item.m_Rect); // some margin from the top RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1,0), vec2(Item.m_Rect.x+Item.m_Rect.h/2, Item.m_Rect.y+Item.m_Rect.h/2)); Item.m_Rect.x +=Info.m_Size; UI()->DoLabelScaled(&Item.m_Rect, m_pClient->m_aClients[aPlayerIDs[i]].m_aName, 16.0f, -1); } } Selected = UiDoListboxEnd(&s_ScrollValue, 0); m_CallvoteSelectedPlayer = Selected != -1 ? aPlayerIDs[Selected] : -1; } void CMenus::RenderServerControl(CUIRect MainView) { static int s_ControlPage = 0; // render background CUIRect Bottom, Extended, TabBar, Button; MainView.HSplitTop(20.0f, &Bottom, &MainView); RenderTools()->DrawUIRect(&Bottom, ms_ColorTabbarActive, CUI::CORNER_T, 10.0f); MainView.HSplitTop(20.0f, &TabBar, &MainView); RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_B, 10.0f); MainView.Margin(10.0f, &MainView); MainView.HSplitBottom(90.0f, &MainView, &Extended); // tab bar { TabBar.VSplitLeft(TabBar.w/3, &Button, &TabBar); static int s_Button0 = 0; if(DoButton_MenuTab(&s_Button0, Localize("Change settings"), s_ControlPage == 0, &Button, 0)) s_ControlPage = 0; TabBar.VSplitMid(&Button, &TabBar); static int s_Button1 = 0; if(DoButton_MenuTab(&s_Button1, Localize("Kick player"), s_ControlPage == 1, &Button, 0)) s_ControlPage = 1; static int s_Button2 = 0; if(DoButton_MenuTab(&s_Button2, Localize("Move player to spectators"), s_ControlPage == 2, &TabBar, 0)) s_ControlPage = 2; } // render page MainView.HSplitBottom(ms_ButtonHeight + 5*2, &MainView, &Bottom); Bottom.HMargin(5.0f, &Bottom); if(s_ControlPage == 0) RenderServerControlServer(MainView); else if(s_ControlPage == 1) RenderServerControlKick(MainView, false); else if(s_ControlPage == 2) RenderServerControlKick(MainView, true); // vote menu { CUIRect Button; Bottom.VSplitRight(120.0f, &Bottom, &Button); static int s_CallVoteButton = 0; if(DoButton_Menu(&s_CallVoteButton, Localize("Call vote"), 0, &Button)) { if(s_ControlPage == 0) m_pClient->m_pVoting->CallvoteOption(m_CallvoteSelectedOption, m_aCallvoteReason); else if(s_ControlPage == 1) { if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && m_pClient->m_Snap.m_paPlayerInfos[m_CallvoteSelectedPlayer]) { m_pClient->m_pVoting->CallvoteKick(m_CallvoteSelectedPlayer, m_aCallvoteReason); SetActive(false); } } else if(s_ControlPage == 2) { if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && m_pClient->m_Snap.m_paPlayerInfos[m_CallvoteSelectedPlayer]) { m_pClient->m_pVoting->CallvoteSpectate(m_CallvoteSelectedPlayer, m_aCallvoteReason); SetActive(false); } } m_aCallvoteReason[0] = 0; } // render kick reason CUIRect Reason; Bottom.VSplitRight(40.0f, &Bottom, 0); Bottom.VSplitRight(160.0f, &Bottom, &Reason); Reason.HSplitTop(5.0f, 0, &Reason); const char *pLabel = Localize("Reason:"); UI()->DoLabelScaled(&Reason, pLabel, 14.0f, -1); float w = TextRender()->TextWidth(0, 14.0f, pLabel, -1); Reason.VSplitLeft(w+10.0f, 0, &Reason); static float s_Offset = 0.0f; DoEditBox(&m_aCallvoteReason, &Reason, m_aCallvoteReason, sizeof(m_aCallvoteReason), 14.0f, &s_Offset, false, CUI::CORNER_ALL); // extended features (only available when authed in rcon) if(Client()->RconAuthed()) { // background Extended.Margin(10.0f, &Extended); Extended.HSplitTop(20.0f, &Bottom, &Extended); Extended.HSplitTop(5.0f, 0, &Extended); // force vote Bottom.VSplitLeft(5.0f, 0, &Bottom); Bottom.VSplitLeft(120.0f, &Button, &Bottom); static int s_ForceVoteButton = 0; if(DoButton_Menu(&s_ForceVoteButton, Localize("Force vote"), 0, &Button)) { if(s_ControlPage == 0) m_pClient->m_pVoting->CallvoteOption(m_CallvoteSelectedOption, m_aCallvoteReason, true); else if(s_ControlPage == 1) { if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && m_pClient->m_Snap.m_paPlayerInfos[m_CallvoteSelectedPlayer]) { m_pClient->m_pVoting->CallvoteKick(m_CallvoteSelectedPlayer, m_aCallvoteReason, true); SetActive(false); } } else if(s_ControlPage == 2) { if(m_CallvoteSelectedPlayer >= 0 && m_CallvoteSelectedPlayer < MAX_CLIENTS && m_pClient->m_Snap.m_paPlayerInfos[m_CallvoteSelectedPlayer]) { m_pClient->m_pVoting->CallvoteSpectate(m_CallvoteSelectedPlayer, m_aCallvoteReason, true); SetActive(false); } } m_aCallvoteReason[0] = 0; } if(s_ControlPage == 0) { // remove vote Bottom.VSplitRight(10.0f, &Bottom, 0); Bottom.VSplitRight(120.0f, 0, &Button); static int s_RemoveVoteButton = 0; if(DoButton_Menu(&s_RemoveVoteButton, Localize("Remove"), 0, &Button)) m_pClient->m_pVoting->RemovevoteOption(m_CallvoteSelectedOption); // add vote Extended.HSplitTop(20.0f, &Bottom, &Extended); Bottom.VSplitLeft(5.0f, 0, &Bottom); Bottom.VSplitLeft(250.0f, &Button, &Bottom); UI()->DoLabelScaled(&Button, Localize("Vote description:"), 14.0f, -1); Bottom.VSplitLeft(20.0f, 0, &Button); UI()->DoLabelScaled(&Button, Localize("Vote command:"), 14.0f, -1); static char s_aVoteDescription[64] = {0}; static char s_aVoteCommand[512] = {0}; Extended.HSplitTop(20.0f, &Bottom, &Extended); Bottom.VSplitRight(10.0f, &Bottom, 0); Bottom.VSplitRight(120.0f, &Bottom, &Button); static int s_AddVoteButton = 0; if(DoButton_Menu(&s_AddVoteButton, Localize("Add"), 0, &Button)) if(s_aVoteDescription[0] != 0 && s_aVoteCommand[0] != 0) m_pClient->m_pVoting->AddvoteOption(s_aVoteDescription, s_aVoteCommand); Bottom.VSplitLeft(5.0f, 0, &Bottom); Bottom.VSplitLeft(250.0f, &Button, &Bottom); static float s_OffsetDesc = 0.0f; DoEditBox(&s_aVoteDescription, &Button, s_aVoteDescription, sizeof(s_aVoteDescription), 14.0f, &s_OffsetDesc, false, CUI::CORNER_ALL); Bottom.VMargin(20.0f, &Button); static float s_OffsetCmd = 0.0f; DoEditBox(&s_aVoteCommand, &Button, s_aVoteCommand, sizeof(s_aVoteCommand), 14.0f, &s_OffsetCmd, false, CUI::CORNER_ALL); } } } } teeworlds-0.6.2+dfsg/src/game/client/components/menus_settings.cpp0000644000175000017500000010445312140200333024357 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "binds.h" #include "countryflags.h" #include "menus.h" #include "skins.h" CMenusKeyBinder CMenus::m_Binder; CMenusKeyBinder::CMenusKeyBinder() { m_TakeKey = false; m_GotKey = false; } bool CMenusKeyBinder::OnInput(IInput::CEvent Event) { if(m_TakeKey) { if(Event.m_Flags&IInput::FLAG_PRESS) { m_Key = Event; m_GotKey = true; m_TakeKey = false; } return true; } return false; } void CMenus::RenderSettingsGeneral(CUIRect MainView) { char aBuf[128]; CUIRect Label, Button, Left, Right, Game, Client; MainView.HSplitTop(150.0f, &Game, &Client); // game { // headline Game.HSplitTop(30.0f, &Label, &Game); UI()->DoLabelScaled(&Label, Localize("Game"), 20.0f, -1); Game.Margin(5.0f, &Game); Game.VSplitMid(&Left, &Right); Left.VSplitRight(5.0f, &Left, 0); Right.VMargin(5.0f, &Right); // dynamic camera Left.HSplitTop(20.0f, &Button, &Left); static int s_DynamicCameraButton = 0; if(DoButton_CheckBox(&s_DynamicCameraButton, Localize("Dynamic Camera"), g_Config.m_ClMouseDeadzone != 0, &Button)) { if(g_Config.m_ClMouseDeadzone) { g_Config.m_ClMouseFollowfactor = 0; g_Config.m_ClMouseMaxDistance = 400; g_Config.m_ClMouseDeadzone = 0; } else { g_Config.m_ClMouseFollowfactor = 60; g_Config.m_ClMouseMaxDistance = 1000; g_Config.m_ClMouseDeadzone = 300; } } // weapon pickup Left.HSplitTop(5.0f, 0, &Left); Left.HSplitTop(20.0f, &Button, &Left); if(DoButton_CheckBox(&g_Config.m_ClAutoswitchWeapons, Localize("Switch weapon on pickup"), g_Config.m_ClAutoswitchWeapons, &Button)) g_Config.m_ClAutoswitchWeapons ^= 1; // show hud Left.HSplitTop(5.0f, 0, &Left); Left.HSplitTop(20.0f, &Button, &Left); if(DoButton_CheckBox(&g_Config.m_ClShowhud, Localize("Show ingame HUD"), g_Config.m_ClShowhud, &Button)) g_Config.m_ClShowhud ^= 1; // chat messages Left.HSplitTop(5.0f, 0, &Left); Left.HSplitTop(20.0f, &Button, &Left); if(DoButton_CheckBox(&g_Config.m_ClShowChatFriends, Localize("Show only chat messages from friends"), g_Config.m_ClShowChatFriends, &Button)) g_Config.m_ClShowChatFriends ^= 1; // name plates Right.HSplitTop(20.0f, &Button, &Right); if(DoButton_CheckBox(&g_Config.m_ClNameplates, Localize("Show name plates"), g_Config.m_ClNameplates, &Button)) g_Config.m_ClNameplates ^= 1; if(g_Config.m_ClNameplates) { Right.HSplitTop(2.5f, 0, &Right); Right.VSplitLeft(30.0f, 0, &Right); Right.HSplitTop(20.0f, &Button, &Right); if(DoButton_CheckBox(&g_Config.m_ClNameplatesAlways, Localize("Always show name plates"), g_Config.m_ClNameplatesAlways, &Button)) g_Config.m_ClNameplatesAlways ^= 1; Right.HSplitTop(2.5f, 0, &Right); Right.HSplitTop(20.0f, &Label, &Right); Right.HSplitTop(20.0f, &Button, &Right); str_format(aBuf, sizeof(aBuf), "%s: %i", Localize("Name plates size"), g_Config.m_ClNameplatesSize); UI()->DoLabelScaled(&Label, aBuf, 13.0f, -1); Button.HMargin(2.0f, &Button); g_Config.m_ClNameplatesSize = (int)(DoScrollbarH(&g_Config.m_ClNameplatesSize, &Button, g_Config.m_ClNameplatesSize/100.0f)*100.0f+0.1f); Right.HSplitTop(20.0f, &Button, &Right); if(DoButton_CheckBox(&g_Config.m_ClNameplatesTeamcolors, Localize("Use team colors for name plates"), g_Config.m_ClNameplatesTeamcolors, &Button)) g_Config.m_ClNameplatesTeamcolors ^= 1; } } // client { // headline Client.HSplitTop(30.0f, &Label, &Client); UI()->DoLabelScaled(&Label, Localize("Client"), 20.0f, -1); Client.Margin(5.0f, &Client); Client.VSplitMid(&Left, &Right); Left.VSplitRight(5.0f, &Left, 0); Right.VMargin(5.0f, &Right); // auto demo settings { Left.HSplitTop(20.0f, &Button, &Left); if(DoButton_CheckBox(&g_Config.m_ClAutoDemoRecord, Localize("Automatically record demos"), g_Config.m_ClAutoDemoRecord, &Button)) g_Config.m_ClAutoDemoRecord ^= 1; Right.HSplitTop(20.0f, &Button, &Right); if(DoButton_CheckBox(&g_Config.m_ClAutoScreenshot, Localize("Automatically take game over screenshot"), g_Config.m_ClAutoScreenshot, &Button)) g_Config.m_ClAutoScreenshot ^= 1; Left.HSplitTop(10.0f, 0, &Left); Left.VSplitLeft(20.0f, 0, &Left); Left.HSplitTop(20.0f, &Label, &Left); Button.VSplitRight(20.0f, &Button, 0); char aBuf[64]; if(g_Config.m_ClAutoDemoMax) str_format(aBuf, sizeof(aBuf), "%s: %i", Localize("Max demos"), g_Config.m_ClAutoDemoMax); else str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Max demos"), Localize("no limit")); UI()->DoLabelScaled(&Label, aBuf, 13.0f, -1); Left.HSplitTop(20.0f, &Button, 0); Button.HMargin(2.0f, &Button); g_Config.m_ClAutoDemoMax = static_cast(DoScrollbarH(&g_Config.m_ClAutoDemoMax, &Button, g_Config.m_ClAutoDemoMax/1000.0f)*1000.0f+0.1f); Right.HSplitTop(10.0f, 0, &Right); Right.VSplitLeft(20.0f, 0, &Right); Right.HSplitTop(20.0f, &Label, &Right); Button.VSplitRight(20.0f, &Button, 0); if(g_Config.m_ClAutoScreenshotMax) str_format(aBuf, sizeof(aBuf), "%s: %i", Localize("Max Screenshots"), g_Config.m_ClAutoScreenshotMax); else str_format(aBuf, sizeof(aBuf), "%s: %s", Localize("Max Screenshots"), Localize("no limit")); UI()->DoLabelScaled(&Label, aBuf, 13.0f, -1); Right.HSplitTop(20.0f, &Button, 0); Button.HMargin(2.0f, &Button); g_Config.m_ClAutoScreenshotMax = static_cast(DoScrollbarH(&g_Config.m_ClAutoScreenshotMax, &Button, g_Config.m_ClAutoScreenshotMax/1000.0f)*1000.0f+0.1f); } } } void CMenus::RenderSettingsPlayer(CUIRect MainView) { CUIRect Button, Label; MainView.HSplitTop(10.0f, 0, &MainView); // player name MainView.HSplitTop(20.0f, &Button, &MainView); Button.VSplitLeft(80.0f, &Label, &Button); Button.VSplitLeft(150.0f, &Button, 0); char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%s:", Localize("Name")); UI()->DoLabelScaled(&Label, aBuf, 14.0, -1); static float s_OffsetName = 0.0f; if(DoEditBox(g_Config.m_PlayerName, &Button, g_Config.m_PlayerName, sizeof(g_Config.m_PlayerName), 14.0f, &s_OffsetName)) m_NeedSendinfo = true; // player clan MainView.HSplitTop(5.0f, 0, &MainView); MainView.HSplitTop(20.0f, &Button, &MainView); Button.VSplitLeft(80.0f, &Label, &Button); Button.VSplitLeft(150.0f, &Button, 0); str_format(aBuf, sizeof(aBuf), "%s:", Localize("Clan")); UI()->DoLabelScaled(&Label, aBuf, 14.0, -1); static float s_OffsetClan = 0.0f; if(DoEditBox(g_Config.m_PlayerClan, &Button, g_Config.m_PlayerClan, sizeof(g_Config.m_PlayerClan), 14.0f, &s_OffsetClan)) m_NeedSendinfo = true; // country flag selector MainView.HSplitTop(20.0f, 0, &MainView); static float s_ScrollValue = 0.0f; int OldSelected = -1; UiDoListboxStart(&s_ScrollValue, &MainView, 50.0f, Localize("Country"), "", m_pClient->m_pCountryFlags->Num(), 6, OldSelected, s_ScrollValue); for(int i = 0; i < m_pClient->m_pCountryFlags->Num(); ++i) { const CCountryFlags::CCountryFlag *pEntry = m_pClient->m_pCountryFlags->GetByIndex(i); if(pEntry->m_CountryCode == g_Config.m_PlayerCountry) OldSelected = i; CListboxItem Item = UiDoListboxNextItem(&pEntry->m_CountryCode, OldSelected == i); if(Item.m_Visible) { CUIRect Label; Item.m_Rect.Margin(5.0f, &Item.m_Rect); Item.m_Rect.HSplitBottom(10.0f, &Item.m_Rect, &Label); float OldWidth = Item.m_Rect.w; Item.m_Rect.w = Item.m_Rect.h*2; Item.m_Rect.x += (OldWidth-Item.m_Rect.w)/ 2.0f; vec4 Color(1.0f, 1.0f, 1.0f, 1.0f); m_pClient->m_pCountryFlags->Render(pEntry->m_CountryCode, &Color, Item.m_Rect.x, Item.m_Rect.y, Item.m_Rect.w, Item.m_Rect.h); if(pEntry->m_Texture != -1) UI()->DoLabel(&Label, pEntry->m_aCountryCodeString, 10.0f, 0); } } const int NewSelected = UiDoListboxEnd(&s_ScrollValue, 0); if(OldSelected != NewSelected) { g_Config.m_PlayerCountry = m_pClient->m_pCountryFlags->GetByIndex(NewSelected)->m_CountryCode; m_NeedSendinfo = true; } } void CMenus::RenderSettingsTee(CUIRect MainView) { CUIRect Button, Label; MainView.HSplitTop(10.0f, 0, &MainView); // skin info const CSkins::CSkin *pOwnSkin = m_pClient->m_pSkins->Get(m_pClient->m_pSkins->Find(g_Config.m_PlayerSkin)); CTeeRenderInfo OwnSkinInfo; if(g_Config.m_PlayerUseCustomColor) { OwnSkinInfo.m_Texture = pOwnSkin->m_ColorTexture; OwnSkinInfo.m_ColorBody = m_pClient->m_pSkins->GetColorV4(g_Config.m_PlayerColorBody); OwnSkinInfo.m_ColorFeet = m_pClient->m_pSkins->GetColorV4(g_Config.m_PlayerColorFeet); } else { OwnSkinInfo.m_Texture = pOwnSkin->m_OrgTexture; OwnSkinInfo.m_ColorBody = vec4(1.0f, 1.0f, 1.0f, 1.0f); OwnSkinInfo.m_ColorFeet = vec4(1.0f, 1.0f, 1.0f, 1.0f); } OwnSkinInfo.m_Size = 50.0f*UI()->Scale(); MainView.HSplitTop(20.0f, &Label, &MainView); Label.VSplitLeft(230.0f, &Label, 0); char aBuf[128]; str_format(aBuf, sizeof(aBuf), "%s:", Localize("Your skin")); UI()->DoLabelScaled(&Label, aBuf, 14.0f, -1); MainView.HSplitTop(50.0f, &Label, &MainView); Label.VSplitLeft(230.0f, &Label, 0); RenderTools()->DrawUIRect(&Label, vec4(1.0f, 1.0f, 1.0f, 0.25f), CUI::CORNER_ALL, 10.0f); RenderTools()->RenderTee(CAnimState::GetIdle(), &OwnSkinInfo, 0, vec2(1, 0), vec2(Label.x+30.0f, Label.y+28.0f)); Label.HSplitTop(15.0f, 0, &Label);; Label.VSplitLeft(70.0f, 0, &Label); UI()->DoLabelScaled(&Label, g_Config.m_PlayerSkin, 14.0f, -1, 150.0f); // custom colour selector MainView.HSplitTop(20.0f, 0, &MainView); MainView.HSplitTop(20.0f, &Button, &MainView); Button.VSplitLeft(230.0f, &Button, 0); if(DoButton_CheckBox(&g_Config.m_PlayerColorBody, Localize("Custom colors"), g_Config.m_PlayerUseCustomColor, &Button)) { g_Config.m_PlayerUseCustomColor = g_Config.m_PlayerUseCustomColor?0:1; m_NeedSendinfo = true; } MainView.HSplitTop(5.0f, 0, &MainView); MainView.HSplitTop(82.5f, &Label, &MainView); if(g_Config.m_PlayerUseCustomColor) { CUIRect aRects[2]; Label.VSplitMid(&aRects[0], &aRects[1]); aRects[0].VSplitRight(10.0f, &aRects[0], 0); aRects[1].VSplitLeft(10.0f, 0, &aRects[1]); int *paColors[2]; paColors[0] = &g_Config.m_PlayerColorBody; paColors[1] = &g_Config.m_PlayerColorFeet; const char *paParts[] = { Localize("Body"), Localize("Feet")}; const char *paLabels[] = { Localize("Hue"), Localize("Sat."), Localize("Lht.")}; static int s_aColorSlider[2][3] = {{0}}; for(int i = 0; i < 2; i++) { aRects[i].HSplitTop(20.0f, &Label, &aRects[i]); UI()->DoLabelScaled(&Label, paParts[i], 14.0f, -1); aRects[i].VSplitLeft(20.0f, 0, &aRects[i]); aRects[i].HSplitTop(2.5f, 0, &aRects[i]); int PrevColor = *paColors[i]; int Color = 0; for(int s = 0; s < 3; s++) { aRects[i].HSplitTop(20.0f, &Label, &aRects[i]); Label.VSplitLeft(100.0f, &Label, &Button); Button.HMargin(2.0f, &Button); float k = ((PrevColor>>((2-s)*8))&0xff) / 255.0f; k = DoScrollbarH(&s_aColorSlider[i][s], &Button, k); Color <<= 8; Color += clamp((int)(k*255), 0, 255); UI()->DoLabelScaled(&Label, paLabels[s], 14.0f, -1); } if(PrevColor != Color) m_NeedSendinfo = true; *paColors[i] = Color; } } // skin selector MainView.HSplitTop(20.0f, 0, &MainView); static bool s_InitSkinlist = true; static sorted_array s_paSkinList; static float s_ScrollValue = 0.0f; if(s_InitSkinlist) { s_paSkinList.clear(); for(int i = 0; i < m_pClient->m_pSkins->Num(); ++i) { const CSkins::CSkin *s = m_pClient->m_pSkins->Get(i); // no special skins if(s->m_aName[0] == 'x' && s->m_aName[1] == '_') continue; s_paSkinList.add(s); } s_InitSkinlist = false; } int OldSelected = -1; UiDoListboxStart(&s_InitSkinlist, &MainView, 50.0f, Localize("Skins"), "", s_paSkinList.size(), 4, OldSelected, s_ScrollValue); for(int i = 0; i < s_paSkinList.size(); ++i) { const CSkins::CSkin *s = s_paSkinList[i]; if(s == 0) continue; if(str_comp(s->m_aName, g_Config.m_PlayerSkin) == 0) OldSelected = i; CListboxItem Item = UiDoListboxNextItem(&s_paSkinList[i], OldSelected == i); if(Item.m_Visible) { CTeeRenderInfo Info; if(g_Config.m_PlayerUseCustomColor) { Info.m_Texture = s->m_ColorTexture; Info.m_ColorBody = m_pClient->m_pSkins->GetColorV4(g_Config.m_PlayerColorBody); Info.m_ColorFeet = m_pClient->m_pSkins->GetColorV4(g_Config.m_PlayerColorFeet); } else { Info.m_Texture = s->m_OrgTexture; Info.m_ColorBody = vec4(1.0f, 1.0f, 1.0f, 1.0f); Info.m_ColorFeet = vec4(1.0f, 1.0f, 1.0f, 1.0f); } Info.m_Size = UI()->Scale()*50.0f; Item.m_Rect.HSplitTop(5.0f, 0, &Item.m_Rect); // some margin from the top RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, 0, vec2(1.0f, 0.0f), vec2(Item.m_Rect.x+Item.m_Rect.w/2, Item.m_Rect.y+Item.m_Rect.h/2)); if(g_Config.m_Debug) { vec3 BloodColor = g_Config.m_PlayerUseCustomColor ? m_pClient->m_pSkins->GetColorV3(g_Config.m_PlayerColorBody) : s->m_BloodColor; Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(BloodColor.r, BloodColor.g, BloodColor.b, 1.0f); IGraphics::CQuadItem QuadItem(Item.m_Rect.x, Item.m_Rect.y, 12.0f, 12.0f); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } } } const int NewSelected = UiDoListboxEnd(&s_ScrollValue, 0); if(OldSelected != NewSelected) { mem_copy(g_Config.m_PlayerSkin, s_paSkinList[NewSelected]->m_aName, sizeof(g_Config.m_PlayerSkin)); m_NeedSendinfo = true; } } typedef void (*pfnAssignFuncCallback)(CConfiguration *pConfig, int Value); typedef struct { CLocConstString m_Name; const char *m_pCommand; int m_KeyId; } CKeyInfo; static CKeyInfo gs_aKeys[] = { { "Move left", "+left", 0}, // Localize - these strings are localized within CLocConstString { "Move right", "+right", 0 }, { "Jump", "+jump", 0 }, { "Fire", "+fire", 0 }, { "Hook", "+hook", 0 }, { "Hammer", "+weapon1", 0 }, { "Pistol", "+weapon2", 0 }, { "Shotgun", "+weapon3", 0 }, { "Grenade", "+weapon4", 0 }, { "Rifle", "+weapon5", 0 }, { "Next weapon", "+nextweapon", 0 }, { "Prev. weapon", "+prevweapon", 0 }, { "Vote yes", "vote yes", 0 }, { "Vote no", "vote no", 0 }, { "Chat", "chat all", 0 }, { "Team chat", "chat team", 0 }, { "Show chat", "+show_chat", 0 }, { "Emoticon", "+emote", 0 }, { "Spectator mode", "+spectate", 0 }, { "Spectate next", "spectate_next", 0 }, { "Spectate previous", "spectate_previous", 0 }, { "Console", "toggle_local_console", 0 }, { "Remote console", "toggle_remote_console", 0 }, { "Screenshot", "screenshot", 0 }, { "Scoreboard", "+scoreboard", 0 }, { "Respawn", "kill", 0 }, }; /* This is for scripts/update_localization.py to work, don't remove! Localize("Move left");Localize("Move right");Localize("Jump");Localize("Fire");Localize("Hook");Localize("Hammer"); Localize("Pistol");Localize("Shotgun");Localize("Grenade");Localize("Rifle");Localize("Next weapon");Localize("Prev. weapon"); Localize("Vote yes");Localize("Vote no");Localize("Chat");Localize("Team chat");Localize("Show chat");Localize("Emoticon"); Localize("Spectator mode");Localize("Spectate next");Localize("Spectate previous");Localize("Console");Localize("Remote console");Localize("Screenshot");Localize("Scoreboard");Localize("Respawn"); */ const int g_KeyCount = sizeof(gs_aKeys) / sizeof(CKeyInfo); void CMenus::UiDoGetButtons(int Start, int Stop, CUIRect View) { for (int i = Start; i < Stop; i++) { CKeyInfo &Key = gs_aKeys[i]; CUIRect Button, Label; View.HSplitTop(20.0f, &Button, &View); Button.VSplitLeft(135.0f, &Label, &Button); char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%s:", (const char *)Key.m_Name); UI()->DoLabelScaled(&Label, aBuf, 13.0f, -1); int OldId = Key.m_KeyId; int NewId = DoKeyReader((void *)&gs_aKeys[i].m_Name, &Button, OldId); if(NewId != OldId) { if(OldId != 0 || NewId == 0) m_pClient->m_pBinds->Bind(OldId, ""); if(NewId != 0) m_pClient->m_pBinds->Bind(NewId, gs_aKeys[i].m_pCommand); } View.HSplitTop(5.0f, 0, &View); } } void CMenus::RenderSettingsControls(CUIRect MainView) { // this is kinda slow, but whatever for(int i = 0; i < g_KeyCount; i++) gs_aKeys[i].m_KeyId = 0; for(int KeyId = 0; KeyId < KEY_LAST; KeyId++) { const char *pBind = m_pClient->m_pBinds->Get(KeyId); if(!pBind[0]) continue; for(int i = 0; i < g_KeyCount; i++) if(str_comp(pBind, gs_aKeys[i].m_pCommand) == 0) { gs_aKeys[i].m_KeyId = KeyId; break; } } CUIRect MovementSettings, WeaponSettings, VotingSettings, ChatSettings, MiscSettings, ResetButton; MainView.VSplitMid(&MovementSettings, &VotingSettings); // movement settings { MovementSettings.VMargin(5.0f, &MovementSettings); MovementSettings.HSplitTop(MainView.h/3+60.0f, &MovementSettings, &WeaponSettings); RenderTools()->DrawUIRect(&MovementSettings, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); MovementSettings.Margin(10.0f, &MovementSettings); TextRender()->Text(0, MovementSettings.x, MovementSettings.y, 14.0f*UI()->Scale(), Localize("Movement"), -1); MovementSettings.HSplitTop(14.0f+5.0f+10.0f, 0, &MovementSettings); { CUIRect Button, Label; MovementSettings.HSplitTop(20.0f, &Button, &MovementSettings); Button.VSplitLeft(135.0f, &Label, &Button); UI()->DoLabel(&Label, Localize("Mouse sens."), 14.0f*UI()->Scale(), -1); Button.HMargin(2.0f, &Button); g_Config.m_InpMousesens = (int)(DoScrollbarH(&g_Config.m_InpMousesens, &Button, (g_Config.m_InpMousesens-5)/500.0f)*500.0f)+5; //*key.key = ui_do_key_reader(key.key, &Button, *key.key); MovementSettings.HSplitTop(20.0f, 0, &MovementSettings); } UiDoGetButtons(0, 5, MovementSettings); } // weapon settings { WeaponSettings.HSplitTop(10.0f, 0, &WeaponSettings); WeaponSettings.HSplitTop(MainView.h/3+50.0f, &WeaponSettings, &ResetButton); RenderTools()->DrawUIRect(&WeaponSettings, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); WeaponSettings.Margin(10.0f, &WeaponSettings); TextRender()->Text(0, WeaponSettings.x, WeaponSettings.y, 14.0f*UI()->Scale(), Localize("Weapon"), -1); WeaponSettings.HSplitTop(14.0f+5.0f+10.0f, 0, &WeaponSettings); UiDoGetButtons(5, 12, WeaponSettings); } // defaults { ResetButton.HSplitTop(10.0f, 0, &ResetButton); RenderTools()->DrawUIRect(&ResetButton, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); ResetButton.HMargin(10.0f, &ResetButton); ResetButton.VMargin(30.0f, &ResetButton); ResetButton.HSplitTop(20.0f, &ResetButton, 0); static int s_DefaultButton = 0; if(DoButton_Menu((void*)&s_DefaultButton, Localize("Reset to defaults"), 0, &ResetButton)) m_pClient->m_pBinds->SetDefaults(); } // voting settings { VotingSettings.VMargin(5.0f, &VotingSettings); VotingSettings.HSplitTop(MainView.h/3-75.0f, &VotingSettings, &ChatSettings); RenderTools()->DrawUIRect(&VotingSettings, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); VotingSettings.Margin(10.0f, &VotingSettings); TextRender()->Text(0, VotingSettings.x, VotingSettings.y, 14.0f*UI()->Scale(), Localize("Voting"), -1); VotingSettings.HSplitTop(14.0f+5.0f+10.0f, 0, &VotingSettings); UiDoGetButtons(12, 14, VotingSettings); } // chat settings { ChatSettings.HSplitTop(10.0f, 0, &ChatSettings); ChatSettings.HSplitTop(MainView.h/3-45.0f, &ChatSettings, &MiscSettings); RenderTools()->DrawUIRect(&ChatSettings, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); ChatSettings.Margin(10.0f, &ChatSettings); TextRender()->Text(0, ChatSettings.x, ChatSettings.y, 14.0f*UI()->Scale(), Localize("Chat"), -1); ChatSettings.HSplitTop(14.0f+5.0f+10.0f, 0, &ChatSettings); UiDoGetButtons(14, 17, ChatSettings); } // misc settings { MiscSettings.HSplitTop(10.0f, 0, &MiscSettings); RenderTools()->DrawUIRect(&MiscSettings, vec4(1,1,1,0.25f), CUI::CORNER_ALL, 10.0f); MiscSettings.Margin(10.0f, &MiscSettings); TextRender()->Text(0, MiscSettings.x, MiscSettings.y, 14.0f*UI()->Scale(), Localize("Miscellaneous"), -1); MiscSettings.HSplitTop(14.0f+5.0f+10.0f, 0, &MiscSettings); UiDoGetButtons(17, 26, MiscSettings); } } void CMenus::RenderSettingsGraphics(CUIRect MainView) { CUIRect Button; char aBuf[128]; bool CheckSettings = false; static const int MAX_RESOLUTIONS = 256; static CVideoMode s_aModes[MAX_RESOLUTIONS]; static int s_NumNodes = Graphics()->GetVideoModes(s_aModes, MAX_RESOLUTIONS); static int s_GfxScreenWidth = g_Config.m_GfxScreenWidth; static int s_GfxScreenHeight = g_Config.m_GfxScreenHeight; static int s_GfxColorDepth = g_Config.m_GfxColorDepth; static int s_GfxBorderless = g_Config.m_GfxBorderless; static int s_GfxFullscreen = g_Config.m_GfxFullscreen; static int s_GfxVsync = g_Config.m_GfxVsync; static int s_GfxFsaaSamples = g_Config.m_GfxFsaaSamples; static int s_GfxTextureQuality = g_Config.m_GfxTextureQuality; static int s_GfxTextureCompression = g_Config.m_GfxTextureCompression; static int s_GfxThreaded = g_Config.m_GfxThreaded; CUIRect ModeList; MainView.VSplitLeft(300.0f, &MainView, &ModeList); // draw allmodes switch ModeList.HSplitTop(20, &Button, &ModeList); if(DoButton_CheckBox(&g_Config.m_GfxDisplayAllModes, Localize("Show only supported"), g_Config.m_GfxDisplayAllModes^1, &Button)) { g_Config.m_GfxDisplayAllModes ^= 1; s_NumNodes = Graphics()->GetVideoModes(s_aModes, MAX_RESOLUTIONS); } // display mode list static float s_ScrollValue = 0; int OldSelected = -1; int G = gcd(s_GfxScreenWidth, s_GfxScreenHeight); str_format(aBuf, sizeof(aBuf), "%s: %dx%d %d bit (%d:%d)", Localize("Current"), s_GfxScreenWidth, s_GfxScreenHeight, s_GfxColorDepth, s_GfxScreenWidth/G, s_GfxScreenHeight/G); UiDoListboxStart(&s_NumNodes , &ModeList, 24.0f, Localize("Display Modes"), aBuf, s_NumNodes, 1, OldSelected, s_ScrollValue); for(int i = 0; i < s_NumNodes; ++i) { const int Depth = s_aModes[i].m_Red+s_aModes[i].m_Green+s_aModes[i].m_Blue > 16 ? 24 : 16; if(g_Config.m_GfxColorDepth == Depth && g_Config.m_GfxScreenWidth == s_aModes[i].m_Width && g_Config.m_GfxScreenHeight == s_aModes[i].m_Height) { OldSelected = i; } CListboxItem Item = UiDoListboxNextItem(&s_aModes[i], OldSelected == i); if(Item.m_Visible) { int G = gcd(s_aModes[i].m_Width, s_aModes[i].m_Height); str_format(aBuf, sizeof(aBuf), " %dx%d %d bit (%d:%d)", s_aModes[i].m_Width, s_aModes[i].m_Height, Depth, s_aModes[i].m_Width/G, s_aModes[i].m_Height/G); UI()->DoLabelScaled(&Item.m_Rect, aBuf, 16.0f, -1); } } const int NewSelected = UiDoListboxEnd(&s_ScrollValue, 0); if(OldSelected != NewSelected) { const int Depth = s_aModes[NewSelected].m_Red+s_aModes[NewSelected].m_Green+s_aModes[NewSelected].m_Blue > 16 ? 24 : 16; g_Config.m_GfxColorDepth = Depth; g_Config.m_GfxScreenWidth = s_aModes[NewSelected].m_Width; g_Config.m_GfxScreenHeight = s_aModes[NewSelected].m_Height; CheckSettings = true; } // switches MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_GfxBorderless, Localize("Borderless window"), g_Config.m_GfxBorderless, &Button)) { g_Config.m_GfxBorderless ^= 1; if(g_Config.m_GfxBorderless && g_Config.m_GfxFullscreen) g_Config.m_GfxFullscreen = 0; CheckSettings = true; } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_GfxFullscreen, Localize("Fullscreen"), g_Config.m_GfxFullscreen, &Button)) { g_Config.m_GfxFullscreen ^= 1; if(g_Config.m_GfxFullscreen && g_Config.m_GfxBorderless) g_Config.m_GfxBorderless = 0; CheckSettings = true; } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_GfxVsync, Localize("V-Sync"), g_Config.m_GfxVsync, &Button)) { g_Config.m_GfxVsync ^= 1; CheckSettings = true; } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox_Number(&g_Config.m_GfxFsaaSamples, Localize("FSAA samples"), g_Config.m_GfxFsaaSamples, &Button)) { g_Config.m_GfxFsaaSamples = (g_Config.m_GfxFsaaSamples+1)%17; CheckSettings = true; } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_GfxThreaded, Localize("Threaded rendering"), g_Config.m_GfxThreaded, &Button)) { g_Config.m_GfxThreaded ^= 1; CheckSettings = true; } MainView.HSplitTop(20.0f, &Button, &MainView); if(g_Config.m_GfxThreaded) { Button.VSplitLeft(20.0f, 0, &Button); if(DoButton_CheckBox(&g_Config.m_GfxAsyncRender, Localize("Handle rendering async from updates"), g_Config.m_GfxAsyncRender, &Button)) { g_Config.m_GfxAsyncRender ^= 1; CheckSettings = true; } } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_GfxTextureQuality, Localize("Quality Textures"), g_Config.m_GfxTextureQuality, &Button)) { g_Config.m_GfxTextureQuality ^= 1; CheckSettings = true; } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_GfxTextureCompression, Localize("Texture Compression"), g_Config.m_GfxTextureCompression, &Button)) { g_Config.m_GfxTextureCompression ^= 1; CheckSettings = true; } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_GfxHighDetail, Localize("High Detail"), g_Config.m_GfxHighDetail, &Button)) g_Config.m_GfxHighDetail ^= 1; // check if the new settings require a restart if(CheckSettings) { if(s_GfxScreenWidth == g_Config.m_GfxScreenWidth && s_GfxScreenHeight == g_Config.m_GfxScreenHeight && s_GfxColorDepth == g_Config.m_GfxColorDepth && s_GfxBorderless == g_Config.m_GfxBorderless && s_GfxFullscreen == g_Config.m_GfxFullscreen && s_GfxVsync == g_Config.m_GfxVsync && s_GfxFsaaSamples == g_Config.m_GfxFsaaSamples && s_GfxTextureQuality == g_Config.m_GfxTextureQuality && s_GfxTextureCompression == g_Config.m_GfxTextureCompression && s_GfxThreaded == g_Config.m_GfxThreaded) m_NeedRestartGraphics = false; else m_NeedRestartGraphics = true; } // CUIRect Text; MainView.HSplitTop(20.0f, 0, &MainView); MainView.HSplitTop(20.0f, &Text, &MainView); //text.VSplitLeft(15.0f, 0, &text); UI()->DoLabelScaled(&Text, Localize("UI Color"), 14.0f, -1); const char *paLabels[] = { Localize("Hue"), Localize("Sat."), Localize("Lht."), Localize("Alpha")}; int *pColorSlider[4] = {&g_Config.m_UiColorHue, &g_Config.m_UiColorSat, &g_Config.m_UiColorLht, &g_Config.m_UiColorAlpha}; for(int s = 0; s < 4; s++) { CUIRect Text; MainView.HSplitTop(19.0f, &Button, &MainView); Button.VMargin(15.0f, &Button); Button.VSplitLeft(100.0f, &Text, &Button); //Button.VSplitRight(5.0f, &Button, 0); Button.HSplitTop(4.0f, 0, &Button); float k = (*pColorSlider[s]) / 255.0f; k = DoScrollbarH(pColorSlider[s], &Button, k); *pColorSlider[s] = (int)(k*255.0f); UI()->DoLabelScaled(&Text, paLabels[s], 15.0f, -1); } } void CMenus::RenderSettingsSound(CUIRect MainView) { CUIRect Button; MainView.VSplitMid(&MainView, 0); static int s_SndEnable = g_Config.m_SndEnable; static int s_SndRate = g_Config.m_SndRate; MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_SndEnable, Localize("Use sounds"), g_Config.m_SndEnable, &Button)) { g_Config.m_SndEnable ^= 1; if(g_Config.m_SndEnable) { if(g_Config.m_SndMusic) m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f); } else m_pClient->m_pSounds->Stop(SOUND_MENU); m_NeedRestartSound = g_Config.m_SndEnable && (!s_SndEnable || s_SndRate != g_Config.m_SndRate); } if(!g_Config.m_SndEnable) return; MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_SndMusic, Localize("Play background music"), g_Config.m_SndMusic, &Button)) { g_Config.m_SndMusic ^= 1; if(Client()->State() == IClient::STATE_OFFLINE) { if(g_Config.m_SndMusic) m_pClient->m_pSounds->Play(CSounds::CHN_MUSIC, SOUND_MENU, 1.0f); else m_pClient->m_pSounds->Stop(SOUND_MENU); } } MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_SndNonactiveMute, Localize("Mute when not active"), g_Config.m_SndNonactiveMute, &Button)) g_Config.m_SndNonactiveMute ^= 1; MainView.HSplitTop(20.0f, &Button, &MainView); if(DoButton_CheckBox(&g_Config.m_ClThreadsoundloading, Localize("Threaded sound loading"), g_Config.m_ClThreadsoundloading, &Button)) g_Config.m_ClThreadsoundloading ^= 1; // sample rate box { char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%d", g_Config.m_SndRate); MainView.HSplitTop(20.0f, &Button, &MainView); UI()->DoLabelScaled(&Button, Localize("Sample rate"), 14.0f, -1); Button.VSplitLeft(190.0f, 0, &Button); static float Offset = 0.0f; DoEditBox(&g_Config.m_SndRate, &Button, aBuf, sizeof(aBuf), 14.0f, &Offset); g_Config.m_SndRate = max(1, str_toint(aBuf)); m_NeedRestartSound = !s_SndEnable || s_SndRate != g_Config.m_SndRate; } // volume slider { CUIRect Button, Label; MainView.HSplitTop(5.0f, &Button, &MainView); MainView.HSplitTop(20.0f, &Button, &MainView); Button.VSplitLeft(190.0f, &Label, &Button); Button.HMargin(2.0f, &Button); UI()->DoLabelScaled(&Label, Localize("Sound volume"), 14.0f, -1); g_Config.m_SndVolume = (int)(DoScrollbarH(&g_Config.m_SndVolume, &Button, g_Config.m_SndVolume/100.0f)*100.0f); MainView.HSplitTop(20.0f, 0, &MainView); } } class CLanguage { public: CLanguage() {} CLanguage(const char *n, const char *f, int Code) : m_Name(n), m_FileName(f), m_CountryCode(Code) {} string m_Name; string m_FileName; int m_CountryCode; bool operator<(const CLanguage &Other) { return m_Name < Other.m_Name; } }; void LoadLanguageIndexfile(IStorage *pStorage, IConsole *pConsole, sorted_array *pLanguages) { IOHANDLE File = pStorage->OpenFile("languages/index.txt", IOFLAG_READ, IStorage::TYPE_ALL); if(!File) { pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", "couldn't open index file"); return; } char aOrigin[128]; char aReplacement[128]; CLineReader LineReader; LineReader.Init(File); char *pLine; while((pLine = LineReader.Get())) { if(!str_length(pLine) || pLine[0] == '#') // skip empty lines and comments continue; str_copy(aOrigin, pLine, sizeof(aOrigin)); pLine = LineReader.Get(); if(!pLine) { pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", "unexpected end of index file"); break; } if(pLine[0] != '=' || pLine[1] != '=' || pLine[2] != ' ') { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "malform replacement for index '%s'", aOrigin); pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); (void)LineReader.Get(); continue; } str_copy(aReplacement, pLine+3, sizeof(aReplacement)); pLine = LineReader.Get(); if(!pLine) { pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", "unexpected end of index file"); break; } if(pLine[0] != '=' || pLine[1] != '=' || pLine[2] != ' ') { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "malform replacement for index '%s'", aOrigin); pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); continue; } char aFileName[128]; str_format(aFileName, sizeof(aFileName), "languages/%s.txt", aOrigin); pLanguages->add(CLanguage(aReplacement, aFileName, str_toint(pLine+3))); } io_close(File); } void CMenus::RenderLanguageSelection(CUIRect MainView) { static int s_LanguageList = 0; static int s_SelectedLanguage = 0; static sorted_array s_Languages; static float s_ScrollValue = 0; if(s_Languages.size() == 0) { s_Languages.add(CLanguage("English", "", 826)); LoadLanguageIndexfile(Storage(), Console(), &s_Languages); for(int i = 0; i < s_Languages.size(); i++) if(str_comp(s_Languages[i].m_FileName, g_Config.m_ClLanguagefile) == 0) { s_SelectedLanguage = i; break; } } int OldSelected = s_SelectedLanguage; UiDoListboxStart(&s_LanguageList , &MainView, 24.0f, Localize("Language"), "", s_Languages.size(), 1, s_SelectedLanguage, s_ScrollValue); for(sorted_array::range r = s_Languages.all(); !r.empty(); r.pop_front()) { CListboxItem Item = UiDoListboxNextItem(&r.front()); if(Item.m_Visible) { CUIRect Rect; Item.m_Rect.VSplitLeft(Item.m_Rect.h*2.0f, &Rect, &Item.m_Rect); Rect.VMargin(6.0f, &Rect); Rect.HMargin(3.0f, &Rect); vec4 Color(1.0f, 1.0f, 1.0f, 1.0f); m_pClient->m_pCountryFlags->Render(r.front().m_CountryCode, &Color, Rect.x, Rect.y, Rect.w, Rect.h); Item.m_Rect.HSplitTop(2.0f, 0, &Item.m_Rect); UI()->DoLabelScaled(&Item.m_Rect, r.front().m_Name, 16.0f, -1); } } s_SelectedLanguage = UiDoListboxEnd(&s_ScrollValue, 0); if(OldSelected != s_SelectedLanguage) { str_copy(g_Config.m_ClLanguagefile, s_Languages[s_SelectedLanguage].m_FileName, sizeof(g_Config.m_ClLanguagefile)); g_Localization.Load(s_Languages[s_SelectedLanguage].m_FileName, Storage(), Console()); } } void CMenus::RenderSettings(CUIRect MainView) { static int s_SettingsPage = 0; // render background CUIRect Temp, TabBar, RestartWarning; MainView.HSplitBottom(15.0f, &MainView, &RestartWarning); MainView.VSplitRight(120.0f, &MainView, &TabBar); RenderTools()->DrawUIRect(&MainView, ms_ColorTabbarActive, CUI::CORNER_B|CUI::CORNER_TL, 10.0f); TabBar.HSplitTop(50.0f, &Temp, &TabBar); RenderTools()->DrawUIRect(&Temp, ms_ColorTabbarActive, CUI::CORNER_R, 10.0f); MainView.HSplitTop(10.0f, 0, &MainView); CUIRect Button; const char *aTabs[] = { Localize("Language"), Localize("General"), Localize("Player"), ("Tee"), Localize("Controls"), Localize("Graphics"), Localize("Sound")}; int NumTabs = (int)(sizeof(aTabs)/sizeof(*aTabs)); for(int i = 0; i < NumTabs; i++) { TabBar.HSplitTop(10, &Button, &TabBar); TabBar.HSplitTop(26, &Button, &TabBar); if(DoButton_MenuTab(aTabs[i], aTabs[i], s_SettingsPage == i, &Button, CUI::CORNER_R)) s_SettingsPage = i; } MainView.Margin(10.0f, &MainView); if(s_SettingsPage == 0) RenderLanguageSelection(MainView); else if(s_SettingsPage == 1) RenderSettingsGeneral(MainView); else if(s_SettingsPage == 2) RenderSettingsPlayer(MainView); else if(s_SettingsPage == 3) RenderSettingsTee(MainView); else if(s_SettingsPage == 4) RenderSettingsControls(MainView); else if(s_SettingsPage == 5) RenderSettingsGraphics(MainView); else if(s_SettingsPage == 6) RenderSettingsSound(MainView); if(m_NeedRestartGraphics || m_NeedRestartSound) UI()->DoLabel(&RestartWarning, Localize("You must restart the game for all settings to take effect."), 15.0f, -1); } teeworlds-0.6.2+dfsg/src/game/client/components/motd.cpp0000644000175000017500000000404412140200333022246 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include "motd.h" void CMotd::Clear() { m_ServerMotdTime = 0; } bool CMotd::IsActive() { return time_get() < m_ServerMotdTime; } void CMotd::OnStateChange(int NewState, int OldState) { if(OldState == IClient::STATE_ONLINE || OldState == IClient::STATE_OFFLINE) Clear(); } void CMotd::OnRender() { if(!IsActive()) return; float Width = 400*3.0f*Graphics()->ScreenAspect(); float Height = 400*3.0f; Graphics()->MapScreen(0, 0, Width, Height); float h = 800.0f; float w = 650.0f; float x = Width/2 - w/2; float y = 150.0f; Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.5f); RenderTools()->DrawRoundRect(x, y, w, h, 40.0f); Graphics()->QuadsEnd(); TextRender()->Text(0, x+40.0f, y+40.0f, 32.0f, m_aServerMotd, (int)(w-80.0f)); } void CMotd::OnMessage(int MsgType, void *pRawMsg) { if(Client()->State() == IClient::STATE_DEMOPLAYBACK) return; if(MsgType == NETMSGTYPE_SV_MOTD) { CNetMsg_Sv_Motd *pMsg = (CNetMsg_Sv_Motd *)pRawMsg; // process escaping str_copy(m_aServerMotd, pMsg->m_pMessage, sizeof(m_aServerMotd)); for(int i = 0; m_aServerMotd[i]; i++) { if(m_aServerMotd[i] == '\\') { if(m_aServerMotd[i+1] == 'n') { m_aServerMotd[i] = ' '; m_aServerMotd[i+1] = '\n'; i++; } } } if(m_aServerMotd[0] && g_Config.m_ClMotdTime) m_ServerMotdTime = time_get()+time_freq()*g_Config.m_ClMotdTime; else m_ServerMotdTime = 0; } } bool CMotd::OnInput(IInput::CEvent Event) { if(IsActive() && Event.m_Flags&IInput::FLAG_PRESS && Event.m_Key == KEY_ESCAPE) { Clear(); return true; } return false; } teeworlds-0.6.2+dfsg/src/game/client/components/motd.h0000644000175000017500000000117112140200333021711 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_MOTD_H #define GAME_CLIENT_COMPONENTS_MOTD_H #include class CMotd : public CComponent { // motd int64 m_ServerMotdTime; public: char m_aServerMotd[900]; void Clear(); bool IsActive(); virtual void OnRender(); virtual void OnStateChange(int NewState, int OldState); virtual void OnMessage(int MsgType, void *pRawMsg); virtual bool OnInput(IInput::CEvent Event); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/nameplates.cpp0000644000175000017500000000476412140200333023445 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "nameplates.h" #include "controls.h" void CNamePlates::RenderNameplate( const CNetObj_Character *pPrevChar, const CNetObj_Character *pPlayerChar, const CNetObj_PlayerInfo *pPlayerInfo ) { float IntraTick = Client()->IntraGameTick(); vec2 Position = mix(vec2(pPrevChar->m_X, pPrevChar->m_Y), vec2(pPlayerChar->m_X, pPlayerChar->m_Y), IntraTick); float FontSize = 18.0f + 20.0f * g_Config.m_ClNameplatesSize / 100.0f; // render name plate if(!pPlayerInfo->m_Local) { float a = 1; if(g_Config.m_ClNameplatesAlways == 0) a = clamp(1-powf(distance(m_pClient->m_pControls->m_TargetPos, Position)/200.0f,16.0f), 0.0f, 1.0f); const char *pName = m_pClient->m_aClients[pPlayerInfo->m_ClientID].m_aName; float tw = TextRender()->TextWidth(0, FontSize, pName, -1); TextRender()->TextOutlineColor(0.0f, 0.0f, 0.0f, 0.5f*a); TextRender()->TextColor(1.0f, 1.0f, 1.0f, a); if(g_Config.m_ClNameplatesTeamcolors && m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) { if(pPlayerInfo->m_Team == TEAM_RED) TextRender()->TextColor(1.0f, 0.5f, 0.5f, a); else if(pPlayerInfo->m_Team == TEAM_BLUE) TextRender()->TextColor(0.7f, 0.7f, 1.0f, a); } TextRender()->Text(0, Position.x-tw/2.0f, Position.y-FontSize-38.0f, FontSize, pName, -1); if(g_Config.m_Debug) // render client id when in debug aswell { char aBuf[128]; str_format(aBuf, sizeof(aBuf),"%d", pPlayerInfo->m_ClientID); TextRender()->Text(0, Position.x, Position.y-90, 28.0f, aBuf, -1); } TextRender()->TextColor(1,1,1,1); TextRender()->TextOutlineColor(0.0f, 0.0f, 0.0f, 0.3f); } } void CNamePlates::OnRender() { if (!g_Config.m_ClNameplates) return; for(int i = 0; i < MAX_CLIENTS; i++) { // only render active characters if(!m_pClient->m_Snap.m_aCharacters[i].m_Active) continue; const void *pInfo = Client()->SnapFindItem(IClient::SNAP_CURRENT, NETOBJTYPE_PLAYERINFO, i); if(pInfo) { RenderNameplate( &m_pClient->m_Snap.m_aCharacters[i].m_Prev, &m_pClient->m_Snap.m_aCharacters[i].m_Cur, (const CNetObj_PlayerInfo *)pInfo); } } } teeworlds-0.6.2+dfsg/src/game/client/components/nameplates.h0000644000175000017500000000104312140200333023075 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_NAMEPLATES_H #define GAME_CLIENT_COMPONENTS_NAMEPLATES_H #include class CNamePlates : public CComponent { void RenderNameplate( const CNetObj_Character *pPrevChar, const CNetObj_Character *pPlayerChar, const CNetObj_PlayerInfo *pPlayerInfo ); public: virtual void OnRender(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/particles.cpp0000644000175000017500000001144112140200333023270 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "particles.h" CParticles::CParticles() { OnReset(); m_RenderTrail.m_pParts = this; m_RenderExplosions.m_pParts = this; m_RenderGeneral.m_pParts = this; } void CParticles::OnReset() { // reset particles for(int i = 0; i < MAX_PARTICLES; i++) { m_aParticles[i].m_PrevPart = i-1; m_aParticles[i].m_NextPart = i+1; } m_aParticles[0].m_PrevPart = 0; m_aParticles[MAX_PARTICLES-1].m_NextPart = -1; m_FirstFree = 0; for(int i = 0; i < NUM_GROUPS; i++) m_aFirstPart[i] = -1; } void CParticles::Add(int Group, CParticle *pPart) { if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(pInfo->m_Paused) return; } else { if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) return; } if (m_FirstFree == -1) return; // remove from the free list int Id = m_FirstFree; m_FirstFree = m_aParticles[Id].m_NextPart; if(m_FirstFree != -1) m_aParticles[m_FirstFree].m_PrevPart = -1; // copy data m_aParticles[Id] = *pPart; // insert to the group list m_aParticles[Id].m_PrevPart = -1; m_aParticles[Id].m_NextPart = m_aFirstPart[Group]; if(m_aFirstPart[Group] != -1) m_aParticles[m_aFirstPart[Group]].m_PrevPart = Id; m_aFirstPart[Group] = Id; // set some parameters m_aParticles[Id].m_Life = 0; } void CParticles::Update(float TimePassed) { static float FrictionFraction = 0; FrictionFraction += TimePassed; if(FrictionFraction > 2.0f) // safty messure FrictionFraction = 0; int FrictionCount = 0; while(FrictionFraction > 0.05f) { FrictionCount++; FrictionFraction -= 0.05f; } for(int g = 0; g < NUM_GROUPS; g++) { int i = m_aFirstPart[g]; while(i != -1) { int Next = m_aParticles[i].m_NextPart; //m_aParticles[i].vel += flow_get(m_aParticles[i].pos)*time_passed * m_aParticles[i].flow_affected; m_aParticles[i].m_Vel.y += m_aParticles[i].m_Gravity*TimePassed; for(int f = 0; f < FrictionCount; f++) // apply friction m_aParticles[i].m_Vel *= m_aParticles[i].m_Friction; // move the point vec2 Vel = m_aParticles[i].m_Vel*TimePassed; Collision()->MovePoint(&m_aParticles[i].m_Pos, &Vel, 0.1f+0.9f*frandom(), NULL); m_aParticles[i].m_Vel = Vel* (1.0f/TimePassed); m_aParticles[i].m_Life += TimePassed; m_aParticles[i].m_Rot += TimePassed * m_aParticles[i].m_Rotspeed; // check particle death if(m_aParticles[i].m_Life > m_aParticles[i].m_LifeSpan) { // remove it from the group list if(m_aParticles[i].m_PrevPart != -1) m_aParticles[m_aParticles[i].m_PrevPart].m_NextPart = m_aParticles[i].m_NextPart; else m_aFirstPart[g] = m_aParticles[i].m_NextPart; if(m_aParticles[i].m_NextPart != -1) m_aParticles[m_aParticles[i].m_NextPart].m_PrevPart = m_aParticles[i].m_PrevPart; // insert to the free list if(m_FirstFree != -1) m_aParticles[m_FirstFree].m_PrevPart = i; m_aParticles[i].m_PrevPart = -1; m_aParticles[i].m_NextPart = m_FirstFree; m_FirstFree = i; } i = Next; } } } void CParticles::OnRender() { if(Client()->State() < IClient::STATE_ONLINE) return; static int64 LastTime = 0; int64 t = time_get(); if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(!pInfo->m_Paused) Update((float)((t-LastTime)/(double)time_freq())*pInfo->m_Speed); } else { if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) Update((float)((t-LastTime)/(double)time_freq())); } LastTime = t; } void CParticles::RenderGroup(int Group) { Graphics()->BlendNormal(); //gfx_blend_additive(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_PARTICLES].m_Id); Graphics()->QuadsBegin(); int i = m_aFirstPart[Group]; while(i != -1) { RenderTools()->SelectSprite(m_aParticles[i].m_Spr); float a = m_aParticles[i].m_Life / m_aParticles[i].m_LifeSpan; vec2 p = m_aParticles[i].m_Pos; float Size = mix(m_aParticles[i].m_StartSize, m_aParticles[i].m_EndSize, a); Graphics()->QuadsSetRotation(m_aParticles[i].m_Rot); Graphics()->SetColor( m_aParticles[i].m_Color.r, m_aParticles[i].m_Color.g, m_aParticles[i].m_Color.b, m_aParticles[i].m_Color.a); // pow(a, 0.75f) * IGraphics::CQuadItem QuadItem(p.x, p.y, Size, Size); Graphics()->QuadsDraw(&QuadItem, 1); i = m_aParticles[i].m_NextPart; } Graphics()->QuadsEnd(); Graphics()->BlendNormal(); } teeworlds-0.6.2+dfsg/src/game/client/components/particles.h0000644000175000017500000000322712140200333022740 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_PARTICLES_H #define GAME_CLIENT_COMPONENTS_PARTICLES_H #include #include // particles struct CParticle { void SetDefault() { m_Vel = vec2(0,0); m_LifeSpan = 0; m_StartSize = 32; m_EndSize = 32; m_Rot = 0; m_Rotspeed = 0; m_Gravity = 0; m_Friction = 0; m_FlowAffected = 1.0f; m_Color = vec4(1,1,1,1); } vec2 m_Pos; vec2 m_Vel; int m_Spr; float m_FlowAffected; float m_LifeSpan; float m_StartSize; float m_EndSize; float m_Rot; float m_Rotspeed; float m_Gravity; float m_Friction; vec4 m_Color; // set by the particle system float m_Life; int m_PrevPart; int m_NextPart; }; class CParticles : public CComponent { friend class CGameClient; public: enum { GROUP_PROJECTILE_TRAIL=0, GROUP_EXPLOSIONS, GROUP_GENERAL, NUM_GROUPS }; CParticles(); void Add(int Group, CParticle *pPart); virtual void OnReset(); virtual void OnRender(); private: enum { MAX_PARTICLES=1024*8, }; CParticle m_aParticles[MAX_PARTICLES]; int m_FirstFree; int m_aFirstPart[NUM_GROUPS]; void RenderGroup(int Group); void Update(float TimePassed); template class CRenderGroup : public CComponent { public: CParticles *m_pParts; virtual void OnRender() { m_pParts->RenderGroup(TGROUP); } }; CRenderGroup m_RenderTrail; CRenderGroup m_RenderExplosions; CRenderGroup m_RenderGeneral; }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/players.cpp0000644000175000017500000004651412140200333022772 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include // get_angle #include #include #include #include #include #include #include #include #include #include "players.h" void CPlayers::RenderHand(CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset) { // for drawing hand //const skin *s = skin_get(skin_id); float BaseSize = 10.0f; //dir = normalize(hook_pos-pos); vec2 HandPos = CenterPos + Dir; float Angle = GetAngle(Dir); if (Dir.x < 0) Angle -= AngleOffset; else Angle += AngleOffset; vec2 DirX = Dir; vec2 DirY(-Dir.y,Dir.x); if (Dir.x < 0) DirY = -DirY; HandPos += DirX * PostRotOffset.x; HandPos += DirY * PostRotOffset.y; //Graphics()->TextureSet(data->m_aImages[IMAGE_CHAR_DEFAULT].id); Graphics()->TextureSet(pInfo->m_Texture); Graphics()->QuadsBegin(); Graphics()->SetColor(pInfo->m_ColorBody.r, pInfo->m_ColorBody.g, pInfo->m_ColorBody.b, pInfo->m_ColorBody.a); // two passes for (int i = 0; i < 2; i++) { bool OutLine = i == 0; RenderTools()->SelectSprite(OutLine?SPRITE_TEE_HAND_OUTLINE:SPRITE_TEE_HAND, 0, 0, 0); Graphics()->QuadsSetRotation(Angle); IGraphics::CQuadItem QuadItem(HandPos.x, HandPos.y, 2*BaseSize, 2*BaseSize); Graphics()->QuadsDraw(&QuadItem, 1); } Graphics()->QuadsSetRotation(0); Graphics()->QuadsEnd(); } inline float NormalizeAngular(float f) { return fmod(f+pi*2, pi*2); } inline float AngularMixDirection (float Src, float Dst) { return sinf(Dst-Src) >0?1:-1; } inline float AngularDistance(float Src, float Dst) { return asinf(sinf(Dst-Src)); } inline float AngularApproach(float Src, float Dst, float Amount) { float d = AngularMixDirection (Src, Dst); float n = Src + Amount*d; if(AngularMixDirection (n, Dst) != d) return Dst; return n; } void CPlayers::RenderHook( const CNetObj_Character *pPrevChar, const CNetObj_Character *pPlayerChar, const CNetObj_PlayerInfo *pPrevInfo, const CNetObj_PlayerInfo *pPlayerInfo ) { CNetObj_Character Prev; CNetObj_Character Player; Prev = *pPrevChar; Player = *pPlayerChar; CNetObj_PlayerInfo pInfo = *pPlayerInfo; CTeeRenderInfo RenderInfo = m_aRenderInfo[pInfo.m_ClientID]; float IntraTick = Client()->IntraGameTick(); // set size RenderInfo.m_Size = 64.0f; // use preditect players if needed if(pInfo.m_Local && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) { if(!m_pClient->m_Snap.m_pLocalCharacter || (m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) { } else { // apply predicted results m_pClient->m_PredictedChar.Write(&Player); m_pClient->m_PredictedPrevChar.Write(&Prev); IntraTick = Client()->PredIntraGameTick(); } } vec2 Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); // draw hook if (Prev.m_HookState>0 && Player.m_HookState>0) { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); //Graphics()->QuadsBegin(); vec2 Pos = Position; vec2 HookPos; if(pPlayerChar->m_HookedPlayer != -1) { if(m_pClient->m_Snap.m_pLocalInfo && pPlayerChar->m_HookedPlayer == m_pClient->m_Snap.m_pLocalInfo->m_ClientID) { if(Client()->State() == IClient::STATE_DEMOPLAYBACK) // only use prediction if needed HookPos = vec2(m_pClient->m_LocalCharacterPos.x, m_pClient->m_LocalCharacterPos.y); else HookPos = mix(vec2(m_pClient->m_PredictedPrevChar.m_Pos.x, m_pClient->m_PredictedPrevChar.m_Pos.y), vec2(m_pClient->m_PredictedChar.m_Pos.x, m_pClient->m_PredictedChar.m_Pos.y), Client()->PredIntraGameTick()); } else if(pInfo.m_Local) { HookPos = mix(vec2(m_pClient->m_Snap.m_aCharacters[pPlayerChar->m_HookedPlayer].m_Prev.m_X, m_pClient->m_Snap.m_aCharacters[pPlayerChar->m_HookedPlayer].m_Prev.m_Y), vec2(m_pClient->m_Snap.m_aCharacters[pPlayerChar->m_HookedPlayer].m_Cur.m_X, m_pClient->m_Snap.m_aCharacters[pPlayerChar->m_HookedPlayer].m_Cur.m_Y), Client()->IntraGameTick()); } else HookPos = mix(vec2(pPrevChar->m_HookX, pPrevChar->m_HookY), vec2(pPlayerChar->m_HookX, pPlayerChar->m_HookY), Client()->IntraGameTick()); } else HookPos = mix(vec2(Prev.m_HookX, Prev.m_HookY), vec2(Player.m_HookX, Player.m_HookY), IntraTick); float d = distance(Pos, HookPos); vec2 Dir = normalize(Pos-HookPos); Graphics()->QuadsSetRotation(GetAngle(Dir)+pi); // render head RenderTools()->SelectSprite(SPRITE_HOOK_HEAD); IGraphics::CQuadItem QuadItem(HookPos.x, HookPos.y, 24,16); Graphics()->QuadsDraw(&QuadItem, 1); // render chain RenderTools()->SelectSprite(SPRITE_HOOK_CHAIN); IGraphics::CQuadItem Array[1024]; int i = 0; for(float f = 24; f < d && i < 1024; f += 24, i++) { vec2 p = HookPos + Dir*f; Array[i] = IGraphics::CQuadItem(p.x, p.y,24,16); } Graphics()->QuadsDraw(Array, i); Graphics()->QuadsSetRotation(0); Graphics()->QuadsEnd(); RenderHand(&RenderInfo, Position, normalize(HookPos-Pos), -pi/2, vec2(20, 0)); } } void CPlayers::RenderPlayer( const CNetObj_Character *pPrevChar, const CNetObj_Character *pPlayerChar, const CNetObj_PlayerInfo *pPrevInfo, const CNetObj_PlayerInfo *pPlayerInfo ) { CNetObj_Character Prev; CNetObj_Character Player; Prev = *pPrevChar; Player = *pPlayerChar; CNetObj_PlayerInfo pInfo = *pPlayerInfo; CTeeRenderInfo RenderInfo = m_aRenderInfo[pInfo.m_ClientID]; bool NewTick = m_pClient->m_NewTick; // set size RenderInfo.m_Size = 64.0f; float IntraTick = Client()->IntraGameTick(); float Angle = mix((float)Prev.m_Angle, (float)Player.m_Angle, IntraTick)/256.0f; //float angle = 0; if(pInfo.m_Local && Client()->State() != IClient::STATE_DEMOPLAYBACK) { // just use the direct input if it's local player we are rendering Angle = GetAngle(m_pClient->m_pControls->m_MousePos); } else { /* float mixspeed = Client()->FrameTime()*2.5f; if(player.attacktick != prev.attacktick) // shooting boosts the mixing speed mixspeed *= 15.0f; // move the delta on a constant speed on a x^2 curve float current = g_GameClient.m_aClients[info.cid].angle; float target = player.angle/256.0f; float delta = angular_distance(current, target); float sign = delta < 0 ? -1 : 1; float new_delta = delta - 2*mixspeed*sqrt(delta*sign)*sign + mixspeed*mixspeed; // make sure that it doesn't vibrate when it's still if(fabs(delta) < 2/256.0f) angle = target; else angle = angular_approach(current, target, fabs(delta-new_delta)); g_GameClient.m_aClients[info.cid].angle = angle;*/ } // use preditect players if needed if(pInfo.m_Local && g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) { if(!m_pClient->m_Snap.m_pLocalCharacter || (m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) { } else { // apply predicted results m_pClient->m_PredictedChar.Write(&Player); m_pClient->m_PredictedPrevChar.Write(&Prev); IntraTick = Client()->PredIntraGameTick(); NewTick = m_pClient->m_NewPredictedTick; } } vec2 Direction = GetDirection((int)(Angle*256.0f)); vec2 Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); vec2 Vel = mix(vec2(Prev.m_VelX/256.0f, Prev.m_VelY/256.0f), vec2(Player.m_VelX/256.0f, Player.m_VelY/256.0f), IntraTick); m_pClient->m_pFlow->Add(Position, Vel*100.0f, 10.0f); RenderInfo.m_GotAirJump = Player.m_Jumped&2?0:1; // detect events if(NewTick) { // detect air jump if(!RenderInfo.m_GotAirJump && !(Prev.m_Jumped&2)) m_pClient->m_pEffects->AirJump(Position); } bool Stationary = Player.m_VelX <= 1 && Player.m_VelX >= -1; bool InAir = !Collision()->CheckPoint(Player.m_X, Player.m_Y+16); bool WantOtherDir = (Player.m_Direction == -1 && Vel.x > 0) || (Player.m_Direction == 1 && Vel.x < 0); // evaluate animation float WalkTime = fmod(absolute(Position.x), 100.0f)/100.0f; CAnimState State; State.Set(&g_pData->m_aAnimations[ANIM_BASE], 0); if(InAir) State.Add(&g_pData->m_aAnimations[ANIM_INAIR], 0, 1.0f); // TODO: some sort of time here else if(Stationary) State.Add(&g_pData->m_aAnimations[ANIM_IDLE], 0, 1.0f); // TODO: some sort of time here else if(!WantOtherDir) State.Add(&g_pData->m_aAnimations[ANIM_WALK], WalkTime, 1.0f); static float s_LastGameTickTime = Client()->GameTickTime(); if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) s_LastGameTickTime = Client()->GameTickTime(); if (Player.m_Weapon == WEAPON_HAMMER) { float ct = (Client()->PrevGameTick()-Player.m_AttackTick)/(float)SERVER_TICK_SPEED + s_LastGameTickTime; State.Add(&g_pData->m_aAnimations[ANIM_HAMMER_SWING], clamp(ct*5.0f,0.0f,1.0f), 1.0f); } if (Player.m_Weapon == WEAPON_NINJA) { float ct = (Client()->PrevGameTick()-Player.m_AttackTick)/(float)SERVER_TICK_SPEED + s_LastGameTickTime; State.Add(&g_pData->m_aAnimations[ANIM_NINJA_SWING], clamp(ct*2.0f,0.0f,1.0f), 1.0f); } // do skidding if(!InAir && WantOtherDir && length(Vel*50) > 500.0f) { static int64 SkidSoundTime = 0; if(time_get()-SkidSoundTime > time_freq()/10) { m_pClient->m_pSounds->PlayAt(CSounds::CHN_WORLD, SOUND_PLAYER_SKID, 0.25f, Position); SkidSoundTime = time_get(); } m_pClient->m_pEffects->SkidTrail( Position+vec2(-Player.m_Direction*6,12), vec2(-Player.m_Direction*100*length(Vel),-50) ); } // draw gun { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); Graphics()->QuadsSetRotation(State.GetAttach()->m_Angle*pi*2+Angle); // normal weapons int iw = clamp(Player.m_Weapon, 0, NUM_WEAPONS-1); RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[iw].m_pSpriteBody, Direction.x < 0 ? SPRITE_FLAG_FLIP_Y : 0); vec2 Dir = Direction; float Recoil = 0.0f; vec2 p; if (Player.m_Weapon == WEAPON_HAMMER) { // Static position for hammer p = Position + vec2(State.GetAttach()->m_X, State.GetAttach()->m_Y); p.y += g_pData->m_Weapons.m_aId[iw].m_Offsety; // if attack is under way, bash stuffs if(Direction.x < 0) { Graphics()->QuadsSetRotation(-pi/2-State.GetAttach()->m_Angle*pi*2); p.x -= g_pData->m_Weapons.m_aId[iw].m_Offsetx; } else { Graphics()->QuadsSetRotation(-pi/2+State.GetAttach()->m_Angle*pi*2); } RenderTools()->DrawSprite(p.x, p.y, g_pData->m_Weapons.m_aId[iw].m_VisualSize); } else if (Player.m_Weapon == WEAPON_NINJA) { p = Position; p.y += g_pData->m_Weapons.m_aId[iw].m_Offsety; if(Direction.x < 0) { Graphics()->QuadsSetRotation(-pi/2-State.GetAttach()->m_Angle*pi*2); p.x -= g_pData->m_Weapons.m_aId[iw].m_Offsetx; m_pClient->m_pEffects->PowerupShine(p+vec2(32,0), vec2(32,12)); } else { Graphics()->QuadsSetRotation(-pi/2+State.GetAttach()->m_Angle*pi*2); m_pClient->m_pEffects->PowerupShine(p-vec2(32,0), vec2(32,12)); } RenderTools()->DrawSprite(p.x, p.y, g_pData->m_Weapons.m_aId[iw].m_VisualSize); // HADOKEN if ((Client()->GameTick()-Player.m_AttackTick) <= (SERVER_TICK_SPEED / 6) && g_pData->m_Weapons.m_aId[iw].m_NumSpriteMuzzles) { int IteX = rand() % g_pData->m_Weapons.m_aId[iw].m_NumSpriteMuzzles; static int s_LastIteX = IteX; if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(pInfo->m_Paused) IteX = s_LastIteX; else s_LastIteX = IteX; } else { if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) IteX = s_LastIteX; else s_LastIteX = IteX; } if(g_pData->m_Weapons.m_aId[iw].m_aSpriteMuzzles[IteX]) { vec2 Dir = vec2(pPlayerChar->m_X,pPlayerChar->m_Y) - vec2(pPrevChar->m_X, pPrevChar->m_Y); Dir = normalize(Dir); float HadOkenAngle = GetAngle(Dir); Graphics()->QuadsSetRotation(HadOkenAngle ); //float offsety = -data->weapons[iw].muzzleoffsety; RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[iw].m_aSpriteMuzzles[IteX], 0); vec2 DirY(-Dir.y,Dir.x); p = Position; float OffsetX = g_pData->m_Weapons.m_aId[iw].m_Muzzleoffsetx; p -= Dir * OffsetX; RenderTools()->DrawSprite(p.x, p.y, 160.0f); } } } else { // TODO: should be an animation Recoil = 0; static float s_LastIntraTick = IntraTick; if(m_pClient->m_Snap.m_pGameInfoObj && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED)) s_LastIntraTick = IntraTick; float a = (Client()->GameTick()-Player.m_AttackTick+s_LastIntraTick)/5.0f; if(a < 1) Recoil = sinf(a*pi); p = Position + Dir * g_pData->m_Weapons.m_aId[iw].m_Offsetx - Dir*Recoil*10.0f; p.y += g_pData->m_Weapons.m_aId[iw].m_Offsety; RenderTools()->DrawSprite(p.x, p.y, g_pData->m_Weapons.m_aId[iw].m_VisualSize); } if (Player.m_Weapon == WEAPON_GUN || Player.m_Weapon == WEAPON_SHOTGUN) { // check if we're firing stuff if(g_pData->m_Weapons.m_aId[iw].m_NumSpriteMuzzles)//prev.attackticks) { float Alpha = 0.0f; int Phase1Tick = (Client()->GameTick() - Player.m_AttackTick); if (Phase1Tick < (g_pData->m_Weapons.m_aId[iw].m_Muzzleduration + 3)) { float t = ((((float)Phase1Tick) + IntraTick)/(float)g_pData->m_Weapons.m_aId[iw].m_Muzzleduration); Alpha = mix(2.0f, 0.0f, min(1.0f,max(0.0f,t))); } int IteX = rand() % g_pData->m_Weapons.m_aId[iw].m_NumSpriteMuzzles; static int s_LastIteX = IteX; if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); if(pInfo->m_Paused) IteX = s_LastIteX; else s_LastIteX = IteX; } else { if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) IteX = s_LastIteX; else s_LastIteX = IteX; } if (Alpha > 0.0f && g_pData->m_Weapons.m_aId[iw].m_aSpriteMuzzles[IteX]) { float OffsetY = -g_pData->m_Weapons.m_aId[iw].m_Muzzleoffsety; RenderTools()->SelectSprite(g_pData->m_Weapons.m_aId[iw].m_aSpriteMuzzles[IteX], Direction.x < 0 ? SPRITE_FLAG_FLIP_Y : 0); if(Direction.x < 0) OffsetY = -OffsetY; vec2 DirY(-Dir.y,Dir.x); vec2 MuzzlePos = p + Dir * g_pData->m_Weapons.m_aId[iw].m_Muzzleoffsetx + DirY * OffsetY; RenderTools()->DrawSprite(MuzzlePos.x, MuzzlePos.y, g_pData->m_Weapons.m_aId[iw].m_VisualSize); } } } Graphics()->QuadsEnd(); switch (Player.m_Weapon) { case WEAPON_GUN: RenderHand(&RenderInfo, p, Direction, -3*pi/4, vec2(-15, 4)); break; case WEAPON_SHOTGUN: RenderHand(&RenderInfo, p, Direction, -pi/2, vec2(-5, 4)); break; case WEAPON_GRENADE: RenderHand(&RenderInfo, p, Direction, -pi/2, vec2(-4, 7)); break; } } // render the "shadow" tee if(pInfo.m_Local && g_Config.m_Debug) { vec2 GhostPosition = mix(vec2(pPrevChar->m_X, pPrevChar->m_Y), vec2(pPlayerChar->m_X, pPlayerChar->m_Y), Client()->IntraGameTick()); CTeeRenderInfo Ghost = RenderInfo; Ghost.m_ColorBody.a = 0.5f; Ghost.m_ColorFeet.a = 0.5f; RenderTools()->RenderTee(&State, &Ghost, Player.m_Emote, Direction, GhostPosition); // render ghost } RenderInfo.m_Size = 64.0f; // force some settings RenderInfo.m_ColorBody.a = 1.0f; RenderInfo.m_ColorFeet.a = 1.0f; RenderTools()->RenderTee(&State, &RenderInfo, Player.m_Emote, Direction, Position); if(Player.m_PlayerFlags&PLAYERFLAG_CHATTING) { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_EMOTICONS].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(SPRITE_DOTDOT); IGraphics::CQuadItem QuadItem(Position.x + 24, Position.y - 40, 64,64); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->QuadsEnd(); } if (m_pClient->m_aClients[pInfo.m_ClientID].m_EmoticonStart != -1 && m_pClient->m_aClients[pInfo.m_ClientID].m_EmoticonStart + 2 * Client()->GameTickSpeed() > Client()->GameTick()) { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_EMOTICONS].m_Id); Graphics()->QuadsBegin(); int SinceStart = Client()->GameTick() - m_pClient->m_aClients[pInfo.m_ClientID].m_EmoticonStart; int FromEnd = m_pClient->m_aClients[pInfo.m_ClientID].m_EmoticonStart + 2 * Client()->GameTickSpeed() - Client()->GameTick(); float a = 1; if (FromEnd < Client()->GameTickSpeed() / 5) a = FromEnd / (Client()->GameTickSpeed() / 5.0); float h = 1; if (SinceStart < Client()->GameTickSpeed() / 10) h = SinceStart / (Client()->GameTickSpeed() / 10.0); float Wiggle = 0; if (SinceStart < Client()->GameTickSpeed() / 5) Wiggle = SinceStart / (Client()->GameTickSpeed() / 5.0); float WiggleAngle = sinf(5*Wiggle); Graphics()->QuadsSetRotation(pi/6*WiggleAngle); Graphics()->SetColor(1.0f,1.0f,1.0f,a); // client_datas::emoticon is an offset from the first emoticon RenderTools()->SelectSprite(SPRITE_OOP + m_pClient->m_aClients[pInfo.m_ClientID].m_Emoticon); IGraphics::CQuadItem QuadItem(Position.x, Position.y - 23 - 32*h, 64, 64*h); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->QuadsEnd(); } } void CPlayers::OnRender() { // update RenderInfo for ninja bool IsTeamplay = false; if(m_pClient->m_Snap.m_pGameInfoObj) IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) != 0; for(int i = 0; i < MAX_CLIENTS; ++i) { m_aRenderInfo[i] = m_pClient->m_aClients[i].m_RenderInfo; if(m_pClient->m_Snap.m_aCharacters[i].m_Cur.m_Weapon == WEAPON_NINJA) { // change the skin for the player to the ninja int Skin = m_pClient->m_pSkins->Find("x_ninja"); if(Skin != -1) { if(IsTeamplay) m_aRenderInfo[i].m_Texture = m_pClient->m_pSkins->Get(Skin)->m_ColorTexture; else { m_aRenderInfo[i].m_Texture = m_pClient->m_pSkins->Get(Skin)->m_OrgTexture; m_aRenderInfo[i].m_ColorBody = vec4(1,1,1,1); m_aRenderInfo[i].m_ColorFeet = vec4(1,1,1,1); } } } } // render other players in two passes, first pass we render the other, second pass we render our self for(int p = 0; p < 4; p++) { for(int i = 0; i < MAX_CLIENTS; i++) { // only render active characters if(!m_pClient->m_Snap.m_aCharacters[i].m_Active) continue; const void *pPrevInfo = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_PLAYERINFO, i); const void *pInfo = Client()->SnapFindItem(IClient::SNAP_CURRENT, NETOBJTYPE_PLAYERINFO, i); if(pPrevInfo && pInfo) { // bool Local = ((const CNetObj_PlayerInfo *)pInfo)->m_Local !=0; if((p % 2) == 0 && Local) continue; if((p % 2) == 1 && !Local) continue; CNetObj_Character PrevChar = m_pClient->m_Snap.m_aCharacters[i].m_Prev; CNetObj_Character CurChar = m_pClient->m_Snap.m_aCharacters[i].m_Cur; if(p<2) RenderHook( &PrevChar, &CurChar, (const CNetObj_PlayerInfo *)pPrevInfo, (const CNetObj_PlayerInfo *)pInfo ); else RenderPlayer( &PrevChar, &CurChar, (const CNetObj_PlayerInfo *)pPrevInfo, (const CNetObj_PlayerInfo *)pInfo ); } } } } teeworlds-0.6.2+dfsg/src/game/client/components/players.h0000644000175000017500000000161512140200333022430 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_PLAYERS_H #define GAME_CLIENT_COMPONENTS_PLAYERS_H #include class CPlayers : public CComponent { CTeeRenderInfo m_aRenderInfo[MAX_CLIENTS]; void RenderHand(class CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset); void RenderPlayer( const CNetObj_Character *pPrevChar, const CNetObj_Character *pPlayerChar, const CNetObj_PlayerInfo *pPrevInfo, const CNetObj_PlayerInfo *pPlayerInfo ); void RenderHook( const CNetObj_Character *pPrevChar, const CNetObj_Character *pPlayerChar, const CNetObj_PlayerInfo *pPrevInfo, const CNetObj_PlayerInfo *pPlayerInfo ); public: virtual void OnRender(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/scoreboard.cpp0000644000175000017500000003240412140200333023427 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "scoreboard.h" CScoreboard::CScoreboard() { OnReset(); } void CScoreboard::ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData) { ((CScoreboard *)pUserData)->m_Active = pResult->GetInteger(0) != 0; } void CScoreboard::OnReset() { m_Active = false; } void CScoreboard::OnRelease() { m_Active = false; } void CScoreboard::OnConsoleInit() { Console()->Register("+scoreboard", "", CFGFLAG_CLIENT, ConKeyScoreboard, this, "Show scoreboard"); } void CScoreboard::RenderGoals(float x, float y, float w) { float h = 50.0f; Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.5f); RenderTools()->DrawRoundRect(x, y, w, h, 10.0f); Graphics()->QuadsEnd(); // render goals y += 10.0f; if(m_pClient->m_Snap.m_pGameInfoObj) { if(m_pClient->m_Snap.m_pGameInfoObj->m_ScoreLimit) { char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%s: %d", Localize("Score limit"), m_pClient->m_Snap.m_pGameInfoObj->m_ScoreLimit); TextRender()->Text(0, x+10.0f, y, 20.0f, aBuf, -1); } if(m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit) { char aBuf[64]; str_format(aBuf, sizeof(aBuf), Localize("Time limit: %d min"), m_pClient->m_Snap.m_pGameInfoObj->m_TimeLimit); TextRender()->Text(0, x+230.0f, y, 20.0f, aBuf, -1); } if(m_pClient->m_Snap.m_pGameInfoObj->m_RoundNum && m_pClient->m_Snap.m_pGameInfoObj->m_RoundCurrent) { char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%s %d/%d", Localize("Round"), m_pClient->m_Snap.m_pGameInfoObj->m_RoundCurrent, m_pClient->m_Snap.m_pGameInfoObj->m_RoundNum); float tw = TextRender()->TextWidth(0, 20.0f, aBuf, -1); TextRender()->Text(0, x+w-tw-10.0f, y, 20.0f, aBuf, -1); } } } void CScoreboard::RenderSpectators(float x, float y, float w) { float h = 140.0f; // background Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0,0,0,0.5f); RenderTools()->DrawRoundRect(x, y, w, h, 10.0f); Graphics()->QuadsEnd(); // Headline y += 10.0f; TextRender()->Text(0, x+10.0f, y, 28.0f, Localize("Spectators"), w-20.0f); // spectator names y += 30.0f; char aBuffer[1024*4]; aBuffer[0] = 0; bool Multiple = false; for(int i = 0; i < MAX_CLIENTS; ++i) { const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paPlayerInfos[i]; if(!pInfo || pInfo->m_Team != TEAM_SPECTATORS) continue; if(Multiple) str_append(aBuffer, ", ", sizeof(aBuffer)); str_append(aBuffer, m_pClient->m_aClients[pInfo->m_ClientID].m_aName, sizeof(aBuffer)); Multiple = true; } CTextCursor Cursor; TextRender()->SetCursor(&Cursor, x+10.0f, y, 22.0f, TEXTFLAG_RENDER); Cursor.m_LineWidth = w-20.0f; Cursor.m_MaxLines = 4; TextRender()->TextEx(&Cursor, aBuffer, -1); } void CScoreboard::RenderScoreboard(float x, float y, float w, int Team, const char *pTitle) { if(Team == TEAM_SPECTATORS) return; float h = 760.0f; // background Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.5f); RenderTools()->DrawRoundRect(x, y, w, h, 17.0f); Graphics()->QuadsEnd(); // render title float TitleFontsize = 40.0f; if(!pTitle) { if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER) pTitle = Localize("Game over"); else pTitle = Localize("Score board"); } TextRender()->Text(0, x+20.0f, y, TitleFontsize, pTitle, -1); char aBuf[128] = {0}; if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) { if(m_pClient->m_Snap.m_pGameDataObj) { int Score = Team == TEAM_RED ? m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed : m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue; str_format(aBuf, sizeof(aBuf), "%d", Score); } } else { if(m_pClient->m_Snap.m_SpecInfo.m_Active && m_pClient->m_Snap.m_SpecInfo.m_SpectatorID != SPEC_FREEVIEW && m_pClient->m_Snap.m_paPlayerInfos[m_pClient->m_Snap.m_SpecInfo.m_SpectatorID]) { int Score = m_pClient->m_Snap.m_paPlayerInfos[m_pClient->m_Snap.m_SpecInfo.m_SpectatorID]->m_Score; str_format(aBuf, sizeof(aBuf), "%d", Score); } else if(m_pClient->m_Snap.m_pLocalInfo) { int Score = m_pClient->m_Snap.m_pLocalInfo->m_Score; str_format(aBuf, sizeof(aBuf), "%d", Score); } } float tw = TextRender()->TextWidth(0, TitleFontsize, aBuf, -1); TextRender()->Text(0, x+w-tw-20.0f, y, TitleFontsize, aBuf, -1); // calculate measurements x += 10.0f; float LineHeight = 60.0f; float TeeSizeMod = 1.0f; float Spacing = 16.0f; if(m_pClient->m_Snap.m_aTeamSize[Team] > 12) { LineHeight = 40.0f; TeeSizeMod = 0.8f; Spacing = 0.0f; } else if(m_pClient->m_Snap.m_aTeamSize[Team] > 8) { LineHeight = 50.0f; TeeSizeMod = 0.9f; Spacing = 8.0f; } float ScoreOffset = x+10.0f, ScoreLength = 60.0f; float TeeOffset = ScoreOffset+ScoreLength, TeeLength = 60*TeeSizeMod; float NameOffset = TeeOffset+TeeLength, NameLength = 300.0f-TeeLength; float PingOffset = x+610.0f, PingLength = 65.0f; float CountryOffset = PingOffset-(LineHeight-Spacing-TeeSizeMod*5.0f)*2.0f, CountryLength = (LineHeight-Spacing-TeeSizeMod*5.0f)*2.0f; float ClanOffset = x+370.0f, ClanLength = 230.0f-CountryLength; // render headlines y += 50.0f; float HeadlineFontsize = 22.0f; tw = TextRender()->TextWidth(0, HeadlineFontsize, Localize("Score"), -1); TextRender()->Text(0, ScoreOffset+ScoreLength-tw, y, HeadlineFontsize, Localize("Score"), -1); TextRender()->Text(0, NameOffset, y, HeadlineFontsize, Localize("Name"), -1); tw = TextRender()->TextWidth(0, HeadlineFontsize, Localize("Clan"), -1); TextRender()->Text(0, ClanOffset+ClanLength/2-tw/2, y, HeadlineFontsize, Localize("Clan"), -1); tw = TextRender()->TextWidth(0, HeadlineFontsize, Localize("Ping"), -1); TextRender()->Text(0, PingOffset+PingLength-tw, y, HeadlineFontsize, Localize("Ping"), -1); // render player entries y += HeadlineFontsize*2.0f; float FontSize = 24.0f; CTextCursor Cursor; for(int i = 0; i < MAX_CLIENTS; i++) { // make sure that we render the correct team const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByScore[i]; if(!pInfo || pInfo->m_Team != Team) continue; // background so it's easy to find the local player or the followed one in spectator mode if(pInfo->m_Local || (m_pClient->m_Snap.m_SpecInfo.m_Active && pInfo->m_ClientID == m_pClient->m_Snap.m_SpecInfo.m_SpectatorID)) { Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f); RenderTools()->DrawRoundRect(x, y, w-20.0f, LineHeight, 15.0f); Graphics()->QuadsEnd(); } // score str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Score, -999, 999)); tw = TextRender()->TextWidth(0, FontSize, aBuf, -1); TextRender()->SetCursor(&Cursor, ScoreOffset+ScoreLength-tw, y+Spacing, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = ScoreLength; TextRender()->TextEx(&Cursor, aBuf, -1); // flag if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_FLAGS && m_pClient->m_Snap.m_pGameDataObj && (m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierRed == pInfo->m_ClientID || m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue == pInfo->m_ClientID)) { Graphics()->BlendNormal(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(pInfo->m_Team==TEAM_RED ? SPRITE_FLAG_BLUE : SPRITE_FLAG_RED, SPRITE_FLAG_FLIP_X); float Size = LineHeight; IGraphics::CQuadItem QuadItem(TeeOffset+0.0f, y-5.0f-Spacing/2.0f, Size/2.0f, Size); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } // avatar CTeeRenderInfo TeeInfo = m_pClient->m_aClients[pInfo->m_ClientID].m_RenderInfo; TeeInfo.m_Size *= TeeSizeMod; RenderTools()->RenderTee(CAnimState::GetIdle(), &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), vec2(TeeOffset+TeeLength/2, y+LineHeight/2)); // name TextRender()->SetCursor(&Cursor, NameOffset, y+Spacing, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = NameLength; TextRender()->TextEx(&Cursor, m_pClient->m_aClients[pInfo->m_ClientID].m_aName, -1); // clan tw = TextRender()->TextWidth(0, FontSize, m_pClient->m_aClients[pInfo->m_ClientID].m_aClan, -1); TextRender()->SetCursor(&Cursor, ClanOffset+ClanLength/2-tw/2, y+Spacing, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = ClanLength; TextRender()->TextEx(&Cursor, m_pClient->m_aClients[pInfo->m_ClientID].m_aClan, -1); // country flag vec4 Color(1.0f, 1.0f, 1.0f, 0.5f); m_pClient->m_pCountryFlags->Render(m_pClient->m_aClients[pInfo->m_ClientID].m_Country, &Color, CountryOffset, y+(Spacing+TeeSizeMod*5.0f)/2.0f, CountryLength, LineHeight-Spacing-TeeSizeMod*5.0f); // ping str_format(aBuf, sizeof(aBuf), "%d", clamp(pInfo->m_Latency, 0, 1000)); tw = TextRender()->TextWidth(0, FontSize, aBuf, -1); TextRender()->SetCursor(&Cursor, PingOffset+PingLength-tw, y+Spacing, FontSize, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = PingLength; TextRender()->TextEx(&Cursor, aBuf, -1); y += LineHeight+Spacing; } } void CScoreboard::RenderRecordingNotification(float x) { if(!m_pClient->DemoRecorder()->IsRecording()) return; //draw the box Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.4f); RenderTools()->DrawRoundRectExt(x, 0.0f, 180.0f, 50.0f, 15.0f, CUI::CORNER_B); Graphics()->QuadsEnd(); //draw the red dot Graphics()->QuadsBegin(); Graphics()->SetColor(1.0f, 0.0f, 0.0f, 1.0f); RenderTools()->DrawRoundRect(x+20, 15.0f, 20.0f, 20.0f, 10.0f); Graphics()->QuadsEnd(); //draw the text char aBuf[64]; int Seconds = m_pClient->DemoRecorder()->Length(); str_format(aBuf, sizeof(aBuf), Localize("REC %3d:%02d"), Seconds/60, Seconds%60); TextRender()->Text(0, x+50.0f, 10.0f, 20.0f, aBuf, -1); } void CScoreboard::OnRender() { if(!Active()) return; // if the score board is active, then we should clear the motd message aswell if(m_pClient->m_pMotd->IsActive()) m_pClient->m_pMotd->Clear(); float Width = 400*3.0f*Graphics()->ScreenAspect(); float Height = 400*3.0f; Graphics()->MapScreen(0, 0, Width, Height); float w = 700.0f; if(m_pClient->m_Snap.m_pGameInfoObj) { if(!(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS)) RenderScoreboard(Width/2-w/2, 150.0f, w, 0, 0); else { const char *pRedClanName = GetClanName(TEAM_RED); const char *pBlueClanName = GetClanName(TEAM_BLUE); if(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER && m_pClient->m_Snap.m_pGameDataObj) { char aText[256]; str_copy(aText, Localize("Draw!"), sizeof(aText)); if(m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed > m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue) { if(pRedClanName) str_format(aText, sizeof(aText), Localize("%s wins!"), pRedClanName); else str_copy(aText, Localize("Red team wins!"), sizeof(aText)); } else if(m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreBlue > m_pClient->m_Snap.m_pGameDataObj->m_TeamscoreRed) { if(pBlueClanName) str_format(aText, sizeof(aText), Localize("%s wins!"), pBlueClanName); else str_copy(aText, Localize("Blue team wins!"), sizeof(aText)); } float w = TextRender()->TextWidth(0, 86.0f, aText, -1); TextRender()->Text(0, Width/2-w/2, 39, 86.0f, aText, -1); } RenderScoreboard(Width/2-w-5.0f, 150.0f, w, TEAM_RED, pRedClanName ? pRedClanName : Localize("Red team")); RenderScoreboard(Width/2+5.0f, 150.0f, w, TEAM_BLUE, pBlueClanName ? pBlueClanName : Localize("Blue team")); } } RenderGoals(Width/2-w/2, 150+760+10, w); RenderSpectators(Width/2-w/2, 150+760+10+50+10, w); RenderRecordingNotification((Width/7)*4); } bool CScoreboard::Active() { // if we activly wanna look on the scoreboard if(m_Active) return true; if(m_pClient->m_Snap.m_pLocalInfo && m_pClient->m_Snap.m_pLocalInfo->m_Team != TEAM_SPECTATORS) { // we are not a spectator, check if we are dead if(!m_pClient->m_Snap.m_pLocalCharacter) return true; } // if the game is over if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER) return true; return false; } const char *CScoreboard::GetClanName(int Team) { int ClanPlayers = 0; const char *pClanName = 0; for(int i = 0; i < MAX_CLIENTS; i++) { const CNetObj_PlayerInfo *pInfo = m_pClient->m_Snap.m_paInfoByScore[i]; if(!pInfo || pInfo->m_Team != Team) continue; if(!pClanName) { pClanName = m_pClient->m_aClients[pInfo->m_ClientID].m_aClan; ClanPlayers++; } else { if(str_comp(m_pClient->m_aClients[pInfo->m_ClientID].m_aClan, pClanName) == 0) ClanPlayers++; else return 0; } } if(ClanPlayers > 1 && pClanName[0]) return pClanName; else return 0; } teeworlds-0.6.2+dfsg/src/game/client/components/scoreboard.h0000644000175000017500000000154712140200333023100 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_SCOREBOARD_H #define GAME_CLIENT_COMPONENTS_SCOREBOARD_H #include class CScoreboard : public CComponent { void RenderGoals(float x, float y, float w); void RenderSpectators(float x, float y, float w); void RenderScoreboard(float x, float y, float w, int Team, const char *pTitle); void RenderRecordingNotification(float x); static void ConKeyScoreboard(IConsole::IResult *pResult, void *pUserData); const char *GetClanName(int Team); bool m_Active; public: CScoreboard(); virtual void OnReset(); virtual void OnConsoleInit(); virtual void OnRender(); virtual void OnRelease(); bool Active(); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/skins.cpp0000644000175000017500000000770212140200333022436 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "skins.h" int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser) { CSkins *pSelf = (CSkins *)pUser; int l = str_length(pName); if(l < 4 || IsDir || str_comp(pName+l-4, ".png") != 0) return 0; char aBuf[512]; str_format(aBuf, sizeof(aBuf), "skins/%s", pName); CImageInfo Info; if(!pSelf->Graphics()->LoadPNG(&Info, aBuf, DirType)) { str_format(aBuf, sizeof(aBuf), "failed to load skin from %s", pName); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf); return 0; } CSkin Skin; Skin.m_OrgTexture = pSelf->Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); int BodySize = 96; // body size unsigned char *d = (unsigned char *)Info.m_pData; int Pitch = Info.m_Width*4; // dig out blood color { int aColors[3] = {0}; for(int y = 0; y < BodySize; y++) for(int x = 0; x < BodySize; x++) { if(d[y*Pitch+x*4+3] > 128) { aColors[0] += d[y*Pitch+x*4+0]; aColors[1] += d[y*Pitch+x*4+1]; aColors[2] += d[y*Pitch+x*4+2]; } } Skin.m_BloodColor = normalize(vec3(aColors[0], aColors[1], aColors[2])); } // create colorless version int Step = Info.m_Format == CImageInfo::FORMAT_RGBA ? 4 : 3; // make the texture gray scale for(int i = 0; i < Info.m_Width*Info.m_Height; i++) { int v = (d[i*Step]+d[i*Step+1]+d[i*Step+2])/3; d[i*Step] = v; d[i*Step+1] = v; d[i*Step+2] = v; } int Freq[256] = {0}; int OrgWeight = 0; int NewWeight = 192; // find most common frequence for(int y = 0; y < BodySize; y++) for(int x = 0; x < BodySize; x++) { if(d[y*Pitch+x*4+3] > 128) Freq[d[y*Pitch+x*4]]++; } for(int i = 1; i < 256; i++) { if(Freq[OrgWeight] < Freq[i]) OrgWeight = i; } // reorder int InvOrgWeight = 255-OrgWeight; int InvNewWeight = 255-NewWeight; for(int y = 0; y < BodySize; y++) for(int x = 0; x < BodySize; x++) { int v = d[y*Pitch+x*4]; if(v <= OrgWeight) v = (int)(((v/(float)OrgWeight) * NewWeight)); else v = (int)(((v-OrgWeight)/(float)InvOrgWeight)*InvNewWeight + NewWeight); d[y*Pitch+x*4] = v; d[y*Pitch+x*4+1] = v; d[y*Pitch+x*4+2] = v; } Skin.m_ColorTexture = pSelf->Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); mem_free(Info.m_pData); // set skin data str_copy(Skin.m_aName, pName, min((int)sizeof(Skin.m_aName),l-3)); if(g_Config.m_Debug) { str_format(aBuf, sizeof(aBuf), "load skin %s", Skin.m_aName); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf); } pSelf->m_aSkins.add(Skin); return 0; } void CSkins::OnInit() { // load skins m_aSkins.clear(); Storage()->ListDirectory(IStorage::TYPE_ALL, "skins", SkinScan, this); if(!m_aSkins.size()) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "gameclient", "failed to load skins. folder='skins/'"); CSkin DummySkin; DummySkin.m_OrgTexture = -1; DummySkin.m_ColorTexture = -1; str_copy(DummySkin.m_aName, "dummy", sizeof(DummySkin.m_aName)); DummySkin.m_BloodColor = vec3(1.0f, 1.0f, 1.0f); m_aSkins.add(DummySkin); } } int CSkins::Num() { return m_aSkins.size(); } const CSkins::CSkin *CSkins::Get(int Index) { return &m_aSkins[max(0, Index%m_aSkins.size())]; } int CSkins::Find(const char *pName) { for(int i = 0; i < m_aSkins.size(); i++) { if(str_comp(m_aSkins[i].m_aName, pName) == 0) return i; } return -1; } vec3 CSkins::GetColorV3(int v) { return HslToRgb(vec3(((v>>16)&0xff)/255.0f, ((v>>8)&0xff)/255.0f, 0.5f+(v&0xff)/255.0f*0.5f)); } vec4 CSkins::GetColorV4(int v) { vec3 r = GetColorV3(v); return vec4(r.r, r.g, r.b, 1.0f); } teeworlds-0.6.2+dfsg/src/game/client/components/skins.h0000644000175000017500000000160112140200333022073 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_SKINS_H #define GAME_CLIENT_COMPONENTS_SKINS_H #include #include #include class CSkins : public CComponent { public: // do this better and nicer struct CSkin { int m_OrgTexture; int m_ColorTexture; char m_aName[24]; vec3 m_BloodColor; bool operator<(const CSkin &Other) { return str_comp(m_aName, Other.m_aName) < 0; } }; void OnInit(); vec3 GetColorV3(int v); vec4 GetColorV4(int v); int Num(); const CSkin *Get(int Index); int Find(const char *pName); private: sorted_array m_aSkins; static int SkinScan(const char *pName, int IsDir, int DirType, void *pUser); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/sounds.cpp0000644000175000017500000001072312140200333022617 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include "sounds.h" struct CUserData { CGameClient *m_pGameClient; bool m_Render; } g_UserData; static int LoadSoundsThread(void *pUser) { CUserData *pData = static_cast(pUser); for(int s = 0; s < g_pData->m_NumSounds; s++) { for(int i = 0; i < g_pData->m_aSounds[s].m_NumSounds; i++) { int Id = pData->m_pGameClient->Sound()->LoadWV(g_pData->m_aSounds[s].m_aSounds[i].m_pFilename); g_pData->m_aSounds[s].m_aSounds[i].m_Id = Id; } if(pData->m_Render) pData->m_pGameClient->m_pMenus->RenderLoading(); } return 0; } int CSounds::GetSampleId(int SetId) { if(!g_Config.m_SndEnable || !Sound()->IsSoundEnabled() || m_WaitForSoundJob || SetId < 0 || SetId >= g_pData->m_NumSounds) return -1; CDataSoundset *pSet = &g_pData->m_aSounds[SetId]; if(!pSet->m_NumSounds) return -1; if(pSet->m_NumSounds == 1) return pSet->m_aSounds[0].m_Id; // return random one int Id; do { Id = rand() % pSet->m_NumSounds; } while(Id == pSet->m_Last); pSet->m_Last = Id; return pSet->m_aSounds[Id].m_Id; } void CSounds::OnInit() { // setup sound channels Sound()->SetChannel(CSounds::CHN_GUI, 1.0f, 0.0f); Sound()->SetChannel(CSounds::CHN_MUSIC, 1.0f, 0.0f); Sound()->SetChannel(CSounds::CHN_WORLD, 0.9f, 1.0f); Sound()->SetChannel(CSounds::CHN_GLOBAL, 1.0f, 0.0f); Sound()->SetListenerPos(0.0f, 0.0f); ClearQueue(); // load sounds if(g_Config.m_ClThreadsoundloading) { g_UserData.m_pGameClient = m_pClient; g_UserData.m_Render = false; m_pClient->Engine()->AddJob(&m_SoundJob, LoadSoundsThread, &g_UserData); m_WaitForSoundJob = true; } else { g_UserData.m_pGameClient = m_pClient; g_UserData.m_Render = true; LoadSoundsThread(&g_UserData); m_WaitForSoundJob = false; } } void CSounds::OnReset() { if(Client()->State() >= IClient::STATE_ONLINE) { Sound()->StopAll(); ClearQueue(); } } void CSounds::OnStateChange(int NewState, int OldState) { if(NewState == IClient::STATE_ONLINE || NewState == IClient::STATE_DEMOPLAYBACK) OnReset(); } void CSounds::OnRender() { // check for sound initialisation if(m_WaitForSoundJob) { if(m_SoundJob.Status() == CJob::STATE_DONE) m_WaitForSoundJob = false; else return; } // set listner pos Sound()->SetListenerPos(m_pClient->m_pCamera->m_Center.x, m_pClient->m_pCamera->m_Center.y); // play sound from queue if(m_QueuePos > 0) { int64 Now = time_get(); if(m_QueueWaitTime <= Now) { Play(m_aQueue[0].m_Channel, m_aQueue[0].m_SetId, 1.0f); m_QueueWaitTime = Now+time_freq()*3/10; // wait 300ms before playing the next one if(--m_QueuePos > 0) mem_move(m_aQueue, m_aQueue+1, m_QueuePos*sizeof(QueueEntry)); } } } void CSounds::ClearQueue() { mem_zero(m_aQueue, sizeof(m_aQueue)); m_QueuePos = 0; m_QueueWaitTime = time_get(); } void CSounds::Enqueue(int Channel, int SetId) { // add sound to the queue if(m_QueuePos < QUEUE_SIZE) { if(Channel == CHN_MUSIC || !g_Config.m_ClEditor) { m_aQueue[m_QueuePos].m_Channel = Channel; m_aQueue[m_QueuePos++].m_SetId = SetId; } } } void CSounds::PlayAndRecord(int Chn, int SetId, float Vol, vec2 Pos) { CNetMsg_Sv_SoundGlobal Msg; Msg.m_SoundID = SetId; Client()->SendPackMsg(&Msg, MSGFLAG_NOSEND|MSGFLAG_RECORD); Play(Chn, SetId, Vol); } void CSounds::Play(int Chn, int SetId, float Vol) { if(Chn == CHN_MUSIC && !g_Config.m_SndMusic) return; int SampleId = GetSampleId(SetId); if(SampleId == -1) return; int Flags = 0; if(Chn == CHN_MUSIC) Flags = ISound::FLAG_LOOP; Sound()->Play(Chn, SampleId, Flags); } void CSounds::PlayAt(int Chn, int SetId, float Vol, vec2 Pos) { if(Chn == CHN_MUSIC && !g_Config.m_SndMusic) return; int SampleId = GetSampleId(SetId); if(SampleId == -1) return; int Flags = 0; if(Chn == CHN_MUSIC) Flags = ISound::FLAG_LOOP; Sound()->PlayAt(Chn, SampleId, Flags, Pos.x, Pos.y); } void CSounds::Stop(int SetId) { if(m_WaitForSoundJob || SetId < 0 || SetId >= g_pData->m_NumSounds) return; CDataSoundset *pSet = &g_pData->m_aSounds[SetId]; for(int i = 0; i < pSet->m_NumSounds; i++) Sound()->Stop(pSet->m_aSounds[i].m_Id); } teeworlds-0.6.2+dfsg/src/game/client/components/sounds.h0000644000175000017500000000205612140200333022264 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_SOUNDS_H #define GAME_CLIENT_COMPONENTS_SOUNDS_H #include class CSounds : public CComponent { enum { QUEUE_SIZE = 32, }; struct QueueEntry { int m_Channel; int m_SetId; } m_aQueue[QUEUE_SIZE]; int m_QueuePos; int64 m_QueueWaitTime; class CJob m_SoundJob; bool m_WaitForSoundJob; int GetSampleId(int SetId); public: // sound channels enum { CHN_GUI=0, CHN_MUSIC, CHN_WORLD, CHN_GLOBAL, }; virtual void OnInit(); virtual void OnReset(); virtual void OnStateChange(int NewState, int OldState); virtual void OnRender(); void ClearQueue(); void Enqueue(int Channel, int SetId); void Play(int Channel, int SetId, float Vol); void PlayAt(int Channel, int SetId, float Vol, vec2 Pos); void PlayAndRecord(int Channel, int SetId, float Vol, vec2 Pos); void Stop(int SetId); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/spectator.cpp0000644000175000017500000002106112140200333023305 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include "spectator.h" void CSpectator::ConKeySpectator(IConsole::IResult *pResult, void *pUserData) { CSpectator *pSelf = (CSpectator *)pUserData; if(pSelf->m_pClient->m_Snap.m_SpecInfo.m_Active && (pSelf->Client()->State() != IClient::STATE_DEMOPLAYBACK || pSelf->DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER)) pSelf->m_Active = pResult->GetInteger(0) != 0; } void CSpectator::ConSpectate(IConsole::IResult *pResult, void *pUserData) { ((CSpectator *)pUserData)->Spectate(pResult->GetInteger(0)); } void CSpectator::ConSpectateNext(IConsole::IResult *pResult, void *pUserData) { CSpectator *pSelf = (CSpectator *)pUserData; int NewSpectatorID; bool GotNewSpectatorID = false; if(pSelf->m_pClient->m_Snap.m_SpecInfo.m_SpectatorID == SPEC_FREEVIEW) { for(int i = 0; i < MAX_CLIENTS; i++) { if(!pSelf->m_pClient->m_Snap.m_paPlayerInfos[i] || pSelf->m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team == TEAM_SPECTATORS) continue; NewSpectatorID = i; GotNewSpectatorID = true; break; } } else { for(int i = pSelf->m_pClient->m_Snap.m_SpecInfo.m_SpectatorID + 1; i < MAX_CLIENTS; i++) { if(!pSelf->m_pClient->m_Snap.m_paPlayerInfos[i] || pSelf->m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team == TEAM_SPECTATORS) continue; NewSpectatorID = i; GotNewSpectatorID = true; break; } if(!GotNewSpectatorID) { for(int i = 0; i < pSelf->m_pClient->m_Snap.m_SpecInfo.m_SpectatorID; i++) { if(!pSelf->m_pClient->m_Snap.m_paPlayerInfos[i] || pSelf->m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team == TEAM_SPECTATORS) continue; NewSpectatorID = i; GotNewSpectatorID = true; break; } } } if(GotNewSpectatorID) pSelf->Spectate(NewSpectatorID); } void CSpectator::ConSpectatePrevious(IConsole::IResult *pResult, void *pUserData) { CSpectator *pSelf = (CSpectator *)pUserData; int NewSpectatorID; bool GotNewSpectatorID = false; if(pSelf->m_pClient->m_Snap.m_SpecInfo.m_SpectatorID == SPEC_FREEVIEW) { for(int i = MAX_CLIENTS -1; i > -1; i--) { if(!pSelf->m_pClient->m_Snap.m_paPlayerInfos[i] || pSelf->m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team == TEAM_SPECTATORS) continue; NewSpectatorID = i; GotNewSpectatorID = true; break; } } else { for(int i = pSelf->m_pClient->m_Snap.m_SpecInfo.m_SpectatorID - 1; i > -1; i--) { if(!pSelf->m_pClient->m_Snap.m_paPlayerInfos[i] || pSelf->m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team == TEAM_SPECTATORS) continue; NewSpectatorID = i; GotNewSpectatorID = true; break; } if(!GotNewSpectatorID) { for(int i = MAX_CLIENTS - 1; i > pSelf->m_pClient->m_Snap.m_SpecInfo.m_SpectatorID; i--) { if(!pSelf->m_pClient->m_Snap.m_paPlayerInfos[i] || pSelf->m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team == TEAM_SPECTATORS) continue; NewSpectatorID = i; GotNewSpectatorID = true; break; } } } if(GotNewSpectatorID) pSelf->Spectate(NewSpectatorID); } CSpectator::CSpectator() { OnReset(); } void CSpectator::OnConsoleInit() { Console()->Register("+spectate", "", CFGFLAG_CLIENT, ConKeySpectator, this, "Open spectator mode selector"); Console()->Register("spectate", "i", CFGFLAG_CLIENT, ConSpectate, this, "Switch spectator mode"); Console()->Register("spectate_next", "", CFGFLAG_CLIENT, ConSpectateNext, this, "Spectate the next player"); Console()->Register("spectate_previous", "", CFGFLAG_CLIENT, ConSpectatePrevious, this, "Spectate the previous player"); } bool CSpectator::OnMouseMove(float x, float y) { if(!m_Active) return false; UI()->ConvertMouseMove(&x, &y); m_SelectorMouse += vec2(x,y); return true; } void CSpectator::OnRelease() { OnReset(); } void CSpectator::OnRender() { if(!m_Active) { if(m_WasActive) { if(m_SelectedSpectatorID != NO_SELECTION) Spectate(m_SelectedSpectatorID); m_WasActive = false; } return; } if(!m_pClient->m_Snap.m_SpecInfo.m_Active) { m_Active = false; m_WasActive = false; return; } m_WasActive = true; m_SelectedSpectatorID = NO_SELECTION; // draw background float Width = 400*3.0f*Graphics()->ScreenAspect(); float Height = 400*3.0f; Graphics()->MapScreen(0, 0, Width, Height); Graphics()->BlendNormal(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.3f); RenderTools()->DrawRoundRect(Width/2.0f-300.0f, Height/2.0f-300.0f, 600.0f, 600.0f, 20.0f); Graphics()->QuadsEnd(); // clamp mouse position to selector area m_SelectorMouse.x = clamp(m_SelectorMouse.x, -280.0f, 280.0f); m_SelectorMouse.y = clamp(m_SelectorMouse.y, -280.0f, 280.0f); // draw selections float FontSize = 20.0f; float StartY = -190.0f; float LineHeight = 60.0f; bool Selected = false; if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorID == SPEC_FREEVIEW) { Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f); RenderTools()->DrawRoundRect(Width/2.0f-280.0f, Height/2.0f-280.0f, 270.0f, 60.0f, 20.0f); Graphics()->QuadsEnd(); } if(m_SelectorMouse.x >= -280.0f && m_SelectorMouse.x <= -10.0f && m_SelectorMouse.y >= -280.0f && m_SelectorMouse.y <= -220.0f) { m_SelectedSpectatorID = SPEC_FREEVIEW; Selected = true; } TextRender()->TextColor(1.0f, 1.0f, 1.0f, Selected?1.0f:0.5f); TextRender()->Text(0, Width/2.0f-240.0f, Height/2.0f-265.0f, FontSize, Localize("Free-View"), -1); float x = -270.0f, y = StartY; for(int i = 0, Count = 0; i < MAX_CLIENTS; ++i) { if(!m_pClient->m_Snap.m_paPlayerInfos[i] || m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team == TEAM_SPECTATORS) continue; if(++Count%9 == 0) { x += 290.0f; y = StartY; } if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorID == i) { Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f); RenderTools()->DrawRoundRect(Width/2.0f+x-10.0f, Height/2.0f+y-10.0f, 270.0f, 60.0f, 20.0f); Graphics()->QuadsEnd(); } Selected = false; if(m_SelectorMouse.x >= x-10.0f && m_SelectorMouse.x <= x+260.0f && m_SelectorMouse.y >= y-10.0f && m_SelectorMouse.y <= y+50.0f) { m_SelectedSpectatorID = i; Selected = true; } TextRender()->TextColor(1.0f, 1.0f, 1.0f, Selected?1.0f:0.5f); TextRender()->Text(0, Width/2.0f+x+50.0f, Height/2.0f+y+5.0f, FontSize, m_pClient->m_aClients[i].m_aName, 220.0f); // flag if(m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_FLAGS && m_pClient->m_Snap.m_pGameDataObj && (m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierRed == m_pClient->m_Snap.m_paPlayerInfos[i]->m_ClientID || m_pClient->m_Snap.m_pGameDataObj->m_FlagCarrierBlue == m_pClient->m_Snap.m_paPlayerInfos[i]->m_ClientID)) { Graphics()->BlendNormal(); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(m_pClient->m_Snap.m_paPlayerInfos[i]->m_Team==TEAM_RED ? SPRITE_FLAG_BLUE : SPRITE_FLAG_RED, SPRITE_FLAG_FLIP_X); float Size = LineHeight; IGraphics::CQuadItem QuadItem(Width/2.0f+x-LineHeight/5.0f, Height/2.0f+y-LineHeight/3.0f, Size/2.0f, Size); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } CTeeRenderInfo TeeInfo = m_pClient->m_aClients[i].m_RenderInfo; RenderTools()->RenderTee(CAnimState::GetIdle(), &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), vec2(Width/2.0f+x+20.0f, Height/2.0f+y+20.0f)); y += LineHeight; } TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); // draw cursor Graphics()->TextureSet(g_pData->m_aImages[IMAGE_CURSOR].m_Id); Graphics()->QuadsBegin(); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); IGraphics::CQuadItem QuadItem(m_SelectorMouse.x+Width/2.0f, m_SelectorMouse.y+Height/2.0f, 48.0f, 48.0f); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } void CSpectator::OnReset() { m_WasActive = false; m_Active = false; m_SelectedSpectatorID = NO_SELECTION; } void CSpectator::Spectate(int SpectatorID) { if(Client()->State() == IClient::STATE_DEMOPLAYBACK) { m_pClient->m_DemoSpecID = clamp(SpectatorID, (int)SPEC_FREEVIEW, MAX_CLIENTS-1); return; } if(m_pClient->m_Snap.m_SpecInfo.m_SpectatorID == SpectatorID) return; CNetMsg_Cl_SetSpectatorMode Msg; Msg.m_SpectatorID = SpectatorID; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } teeworlds-0.6.2+dfsg/src/game/client/components/spectator.h0000644000175000017500000000177712140200333022766 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_SPECTATOR_H #define GAME_CLIENT_COMPONENTS_SPECTATOR_H #include #include class CSpectator : public CComponent { enum { NO_SELECTION=-2, }; bool m_Active; bool m_WasActive; int m_SelectedSpectatorID; vec2 m_SelectorMouse; static void ConKeySpectator(IConsole::IResult *pResult, void *pUserData); static void ConSpectate(IConsole::IResult *pResult, void *pUserData); static void ConSpectateNext(IConsole::IResult *pResult, void *pUserData); static void ConSpectatePrevious(IConsole::IResult *pResult, void *pUserData); public: CSpectator(); virtual void OnConsoleInit(); virtual bool OnMouseMove(float x, float y); virtual void OnRender(); virtual void OnRelease(); virtual void OnReset(); void Spectate(int SpectatorID); }; #endif teeworlds-0.6.2+dfsg/src/game/client/components/voting.cpp0000644000175000017500000002033612140200333022613 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include "voting.h" void CVoting::ConCallvote(IConsole::IResult *pResult, void *pUserData) { CVoting *pSelf = (CVoting*)pUserData; pSelf->Callvote(pResult->GetString(0), pResult->GetString(1), pResult->NumArguments() > 2 ? pResult->GetString(2) : ""); } void CVoting::ConVote(IConsole::IResult *pResult, void *pUserData) { CVoting *pSelf = (CVoting *)pUserData; if(str_comp_nocase(pResult->GetString(0), "yes") == 0) pSelf->Vote(1); else if(str_comp_nocase(pResult->GetString(0), "no") == 0) pSelf->Vote(-1); } void CVoting::Callvote(const char *pType, const char *pValue, const char *pReason) { CNetMsg_Cl_CallVote Msg = {0}; Msg.m_Type = pType; Msg.m_Value = pValue; Msg.m_Reason = pReason; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } void CVoting::CallvoteSpectate(int ClientID, const char *pReason, bool ForceVote) { if(ForceVote) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "set_team %d -1", ClientID); Client()->Rcon(aBuf); } else { char aBuf[32]; str_format(aBuf, sizeof(aBuf), "%d", ClientID); Callvote("spectate", aBuf, pReason); } } void CVoting::CallvoteKick(int ClientID, const char *pReason, bool ForceVote) { if(ForceVote) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "force_vote kick %d %s", ClientID, pReason); Client()->Rcon(aBuf); } else { char aBuf[32]; str_format(aBuf, sizeof(aBuf), "%d", ClientID); Callvote("kick", aBuf, pReason); } } void CVoting::CallvoteOption(int OptionID, const char *pReason, bool ForceVote) { CVoteOptionClient *pOption = m_pFirst; while(pOption && OptionID >= 0) { if(OptionID == 0) { if(ForceVote) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "force_vote option \"%s\" %s", pOption->m_aDescription, pReason); Client()->Rcon(aBuf); } else Callvote("option", pOption->m_aDescription, pReason); break; } OptionID--; pOption = pOption->m_pNext; } } void CVoting::RemovevoteOption(int OptionID) { CVoteOptionClient *pOption = m_pFirst; while(pOption && OptionID >= 0) { if(OptionID == 0) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "remove_vote \"%s\"", pOption->m_aDescription); Client()->Rcon(aBuf); break; } OptionID--; pOption = pOption->m_pNext; } } void CVoting::AddvoteOption(const char *pDescription, const char *pCommand) { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "add_vote \"%s\" %s", pDescription, pCommand); Client()->Rcon(aBuf); } void CVoting::Vote(int v) { CNetMsg_Cl_Vote Msg = {v}; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } CVoting::CVoting() { ClearOptions(); m_Closetime = 0; m_aDescription[0] = 0; m_aReason[0] = 0; m_Yes = m_No = m_Pass = m_Total = 0; m_Voted = 0; } void CVoting::AddOption(const char *pDescription) { CVoteOptionClient *pOption; if(m_pRecycleFirst) { pOption = m_pRecycleFirst; m_pRecycleFirst = m_pRecycleFirst->m_pNext; if(m_pRecycleFirst) m_pRecycleFirst->m_pPrev = 0; else m_pRecycleLast = 0; } else pOption = (CVoteOptionClient *)m_Heap.Allocate(sizeof(CVoteOptionClient)); pOption->m_pNext = 0; pOption->m_pPrev = m_pLast; if(pOption->m_pPrev) pOption->m_pPrev->m_pNext = pOption; m_pLast = pOption; if(!m_pFirst) m_pFirst = pOption; str_copy(pOption->m_aDescription, pDescription, sizeof(pOption->m_aDescription)); ++m_NumVoteOptions; } void CVoting::ClearOptions() { m_Heap.Reset(); m_NumVoteOptions = 0; m_pFirst = 0; m_pLast = 0; m_pRecycleFirst = 0; m_pRecycleLast = 0; } void CVoting::OnReset() { if(Client()->State() == IClient::STATE_LOADING) // do not reset active vote while connecting return; m_Closetime = 0; m_aDescription[0] = 0; m_aReason[0] = 0; m_Yes = m_No = m_Pass = m_Total = 0; m_Voted = 0; } void CVoting::OnConsoleInit() { Console()->Register("callvote", "ss?r", CFGFLAG_CLIENT, ConCallvote, this, "Call vote"); Console()->Register("vote", "r", CFGFLAG_CLIENT, ConVote, this, "Vote yes/no"); } void CVoting::OnMessage(int MsgType, void *pRawMsg) { if(MsgType == NETMSGTYPE_SV_VOTESET) { CNetMsg_Sv_VoteSet *pMsg = (CNetMsg_Sv_VoteSet *)pRawMsg; if(pMsg->m_Timeout) { OnReset(); str_copy(m_aDescription, pMsg->m_pDescription, sizeof(m_aDescription)); str_copy(m_aReason, pMsg->m_pReason, sizeof(m_aReason)); m_Closetime = time_get() + time_freq() * pMsg->m_Timeout; } else OnReset(); } else if(MsgType == NETMSGTYPE_SV_VOTESTATUS) { CNetMsg_Sv_VoteStatus *pMsg = (CNetMsg_Sv_VoteStatus *)pRawMsg; m_Yes = pMsg->m_Yes; m_No = pMsg->m_No; m_Pass = pMsg->m_Pass; m_Total = pMsg->m_Total; } else if(MsgType == NETMSGTYPE_SV_VOTECLEAROPTIONS) { ClearOptions(); } else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONLISTADD) { CNetMsg_Sv_VoteOptionListAdd *pMsg = (CNetMsg_Sv_VoteOptionListAdd *)pRawMsg; int NumOptions = pMsg->m_NumOptions; for(int i = 0; i < NumOptions; ++i) { switch(i) { case 0: AddOption(pMsg->m_pDescription0); break; case 1: AddOption(pMsg->m_pDescription1); break; case 2: AddOption(pMsg->m_pDescription2); break; case 3: AddOption(pMsg->m_pDescription3); break; case 4: AddOption(pMsg->m_pDescription4); break; case 5: AddOption(pMsg->m_pDescription5); break; case 6: AddOption(pMsg->m_pDescription6); break; case 7: AddOption(pMsg->m_pDescription7); break; case 8: AddOption(pMsg->m_pDescription8); break; case 9: AddOption(pMsg->m_pDescription9); break; case 10: AddOption(pMsg->m_pDescription10); break; case 11: AddOption(pMsg->m_pDescription11); break; case 12: AddOption(pMsg->m_pDescription12); break; case 13: AddOption(pMsg->m_pDescription13); break; case 14: AddOption(pMsg->m_pDescription14); } } } else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONADD) { CNetMsg_Sv_VoteOptionAdd *pMsg = (CNetMsg_Sv_VoteOptionAdd *)pRawMsg; AddOption(pMsg->m_pDescription); } else if(MsgType == NETMSGTYPE_SV_VOTEOPTIONREMOVE) { CNetMsg_Sv_VoteOptionRemove *pMsg = (CNetMsg_Sv_VoteOptionRemove *)pRawMsg; for(CVoteOptionClient *pOption = m_pFirst; pOption; pOption = pOption->m_pNext) { if(str_comp(pOption->m_aDescription, pMsg->m_pDescription) == 0) { // remove it from the list if(m_pFirst == pOption) m_pFirst = m_pFirst->m_pNext; if(m_pLast == pOption) m_pLast = m_pLast->m_pPrev; if(pOption->m_pPrev) pOption->m_pPrev->m_pNext = pOption->m_pNext; if(pOption->m_pNext) pOption->m_pNext->m_pPrev = pOption->m_pPrev; --m_NumVoteOptions; // add it to recycle list pOption->m_pNext = 0; pOption->m_pPrev = m_pRecycleLast; if(pOption->m_pPrev) pOption->m_pPrev->m_pNext = pOption; m_pRecycleLast = pOption; if(!m_pRecycleFirst) m_pRecycleLast = pOption; break; } } } } void CVoting::OnRender() { } void CVoting::RenderBars(CUIRect Bars, bool Text) { RenderTools()->DrawUIRect(&Bars, vec4(0.8f,0.8f,0.8f,0.5f), CUI::CORNER_ALL, Bars.h/3); CUIRect Splitter = Bars; Splitter.x = Splitter.x+Splitter.w/2; Splitter.w = Splitter.h/2.0f; Splitter.x -= Splitter.w/2; RenderTools()->DrawUIRect(&Splitter, vec4(0.4f,0.4f,0.4f,0.5f), CUI::CORNER_ALL, Splitter.h/4); if(m_Total) { CUIRect PassArea = Bars; if(m_Yes) { CUIRect YesArea = Bars; YesArea.w *= m_Yes/(float)m_Total; RenderTools()->DrawUIRect(&YesArea, vec4(0.2f,0.9f,0.2f,0.85f), CUI::CORNER_ALL, Bars.h/3); if(Text) { char Buf[256]; str_format(Buf, sizeof(Buf), "%d", m_Yes); UI()->DoLabel(&YesArea, Buf, Bars.h*0.75f, 0); } PassArea.x += YesArea.w; PassArea.w -= YesArea.w; } if(m_No) { CUIRect NoArea = Bars; NoArea.w *= m_No/(float)m_Total; NoArea.x = (Bars.x + Bars.w)-NoArea.w; RenderTools()->DrawUIRect(&NoArea, vec4(0.9f,0.2f,0.2f,0.85f), CUI::CORNER_ALL, Bars.h/3); if(Text) { char Buf[256]; str_format(Buf, sizeof(Buf), "%d", m_No); UI()->DoLabel(&NoArea, Buf, Bars.h*0.75f, 0); } PassArea.w -= NoArea.w; } if(Text && m_Pass) { char Buf[256]; str_format(Buf, sizeof(Buf), "%d", m_Pass); UI()->DoLabel(&PassArea, Buf, Bars.h*0.75f, 0); } } } teeworlds-0.6.2+dfsg/src/game/client/components/voting.h0000644000175000017500000000357412140200333022265 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_COMPONENTS_VOTING_H #define GAME_CLIENT_COMPONENTS_VOTING_H #include #include #include #include class CVoting : public CComponent { CHeap m_Heap; static void ConCallvote(IConsole::IResult *pResult, void *pUserData); static void ConVote(IConsole::IResult *pResult, void *pUserData); int64 m_Closetime; char m_aDescription[VOTE_DESC_LENGTH]; char m_aReason[VOTE_REASON_LENGTH]; int m_Voted; int m_Yes, m_No, m_Pass, m_Total; void AddOption(const char *pDescription); void ClearOptions(); void Callvote(const char *pType, const char *pValue, const char *pReason); public: int m_NumVoteOptions; CVoteOptionClient *m_pFirst; CVoteOptionClient *m_pLast; CVoteOptionClient *m_pRecycleFirst; CVoteOptionClient *m_pRecycleLast; CVoting(); virtual void OnReset(); virtual void OnConsoleInit(); virtual void OnMessage(int Msgtype, void *pRawMsg); virtual void OnRender(); void RenderBars(CUIRect Bars, bool Text); void CallvoteSpectate(int ClientID, const char *pReason, bool ForceVote = false); void CallvoteKick(int ClientID, const char *pReason, bool ForceVote = false); void CallvoteOption(int OptionID, const char *pReason, bool ForceVote = false); void RemovevoteOption(int OptionID); void AddvoteOption(const char *pDescription, const char *pCommand); void Vote(int v); // -1 = no, 1 = yes int SecondsLeft() { return (m_Closetime - time_get())/time_freq(); } bool IsVoting() { return m_Closetime != 0; } int TakenChoice() const { return m_Voted; } const char *VoteDescription() const { return m_aDescription; } const char *VoteReason() const { return m_aReason; } }; #endif teeworlds-0.6.2+dfsg/src/game/client/gameclient.cpp0000644000175000017500000011035312140200333021227 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "render.h" #include "gameclient.h" #include "components/binds.h" #include "components/broadcast.h" #include "components/camera.h" #include "components/chat.h" #include "components/console.h" #include "components/controls.h" #include "components/countryflags.h" #include "components/damageind.h" #include "components/debughud.h" #include "components/effects.h" #include "components/emoticon.h" #include "components/flow.h" #include "components/hud.h" #include "components/items.h" #include "components/killmessages.h" #include "components/mapimages.h" #include "components/maplayers.h" #include "components/menus.h" #include "components/motd.h" #include "components/particles.h" #include "components/players.h" #include "components/nameplates.h" #include "components/scoreboard.h" #include "components/skins.h" #include "components/sounds.h" #include "components/spectator.h" #include "components/voting.h" CGameClient g_GameClient; // instanciate all systems static CKillMessages gs_KillMessages; static CCamera gs_Camera; static CChat gs_Chat; static CMotd gs_Motd; static CBroadcast gs_Broadcast; static CGameConsole gs_GameConsole; static CBinds gs_Binds; static CParticles gs_Particles; static CMenus gs_Menus; static CSkins gs_Skins; static CCountryFlags gs_CountryFlags; static CFlow gs_Flow; static CHud gs_Hud; static CDebugHud gs_DebugHud; static CControls gs_Controls; static CEffects gs_Effects; static CScoreboard gs_Scoreboard; static CSounds gs_Sounds; static CEmoticon gs_Emoticon; static CDamageInd gsDamageInd; static CVoting gs_Voting; static CSpectator gs_Spectator; static CPlayers gs_Players; static CNamePlates gs_NamePlates; static CItems gs_Items; static CMapImages gs_MapImages; static CMapLayers gs_MapLayersBackGround(CMapLayers::TYPE_BACKGROUND); static CMapLayers gs_MapLayersForeGround(CMapLayers::TYPE_FOREGROUND); CGameClient::CStack::CStack() { m_Num = 0; } void CGameClient::CStack::Add(class CComponent *pComponent) { m_paComponents[m_Num++] = pComponent; } const char *CGameClient::Version() { return GAME_VERSION; } const char *CGameClient::NetVersion() { return GAME_NETVERSION; } const char *CGameClient::GetItemName(int Type) { return m_NetObjHandler.GetObjName(Type); } void CGameClient::OnConsoleInit() { m_pEngine = Kernel()->RequestInterface(); m_pClient = Kernel()->RequestInterface(); m_pTextRender = Kernel()->RequestInterface(); m_pSound = Kernel()->RequestInterface(); m_pInput = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); m_pDemoPlayer = Kernel()->RequestInterface(); m_pDemoRecorder = Kernel()->RequestInterface(); m_pServerBrowser = Kernel()->RequestInterface(); m_pEditor = Kernel()->RequestInterface(); m_pFriends = Kernel()->RequestInterface(); // setup pointers m_pBinds = &::gs_Binds; m_pGameConsole = &::gs_GameConsole; m_pParticles = &::gs_Particles; m_pMenus = &::gs_Menus; m_pSkins = &::gs_Skins; m_pCountryFlags = &::gs_CountryFlags; m_pChat = &::gs_Chat; m_pFlow = &::gs_Flow; m_pCamera = &::gs_Camera; m_pControls = &::gs_Controls; m_pEffects = &::gs_Effects; m_pSounds = &::gs_Sounds; m_pMotd = &::gs_Motd; m_pDamageind = &::gsDamageInd; m_pMapimages = &::gs_MapImages; m_pVoting = &::gs_Voting; m_pScoreboard = &::gs_Scoreboard; m_pItems = &::gs_Items; m_pMapLayersBackGround = &::gs_MapLayersBackGround; m_pMapLayersForeGround = &::gs_MapLayersForeGround; // make a list of all the systems, make sure to add them in the corrent render order m_All.Add(m_pSkins); m_All.Add(m_pCountryFlags); m_All.Add(m_pMapimages); m_All.Add(m_pEffects); // doesn't render anything, just updates effects m_All.Add(m_pParticles); m_All.Add(m_pBinds); m_All.Add(m_pControls); m_All.Add(m_pCamera); m_All.Add(m_pSounds); m_All.Add(m_pVoting); m_All.Add(m_pParticles); // doesn't render anything, just updates all the particles m_All.Add(&gs_MapLayersBackGround); // first to render m_All.Add(&m_pParticles->m_RenderTrail); m_All.Add(m_pItems); m_All.Add(&gs_Players); m_All.Add(&gs_MapLayersForeGround); m_All.Add(&m_pParticles->m_RenderExplosions); m_All.Add(&gs_NamePlates); m_All.Add(&m_pParticles->m_RenderGeneral); m_All.Add(m_pDamageind); m_All.Add(&gs_Hud); m_All.Add(&gs_Spectator); m_All.Add(&gs_Emoticon); m_All.Add(&gs_KillMessages); m_All.Add(m_pChat); m_All.Add(&gs_Broadcast); m_All.Add(&gs_DebugHud); m_All.Add(&gs_Scoreboard); m_All.Add(m_pMotd); m_All.Add(m_pMenus); m_All.Add(m_pGameConsole); // build the input stack m_Input.Add(&m_pMenus->m_Binder); // this will take over all input when we want to bind a key m_Input.Add(&m_pBinds->m_SpecialBinds); m_Input.Add(m_pGameConsole); m_Input.Add(m_pChat); // chat has higher prio due to tha you can quit it by pressing esc m_Input.Add(m_pMotd); // for pressing esc to remove it m_Input.Add(m_pMenus); m_Input.Add(&gs_Spectator); m_Input.Add(&gs_Emoticon); m_Input.Add(m_pControls); m_Input.Add(m_pBinds); // add the some console commands Console()->Register("team", "i", CFGFLAG_CLIENT, ConTeam, this, "Switch team"); Console()->Register("kill", "", CFGFLAG_CLIENT, ConKill, this, "Kill yourself"); // register server dummy commands for tab completion Console()->Register("tune", "si", CFGFLAG_SERVER, 0, 0, "Tune variable to value"); Console()->Register("tune_reset", "", CFGFLAG_SERVER, 0, 0, "Reset tuning"); Console()->Register("tune_dump", "", CFGFLAG_SERVER, 0, 0, "Dump tuning"); Console()->Register("change_map", "?r", CFGFLAG_SERVER, 0, 0, "Change map"); Console()->Register("restart", "?i", CFGFLAG_SERVER, 0, 0, "Restart in x seconds"); Console()->Register("broadcast", "r", CFGFLAG_SERVER, 0, 0, "Broadcast message"); Console()->Register("say", "r", CFGFLAG_SERVER, 0, 0, "Say in chat"); Console()->Register("set_team", "ii?i", CFGFLAG_SERVER, 0, 0, "Set team of player to team"); Console()->Register("set_team_all", "i", CFGFLAG_SERVER, 0, 0, "Set team of all players to team"); Console()->Register("add_vote", "sr", CFGFLAG_SERVER, 0, 0, "Add a voting option"); Console()->Register("remove_vote", "s", CFGFLAG_SERVER, 0, 0, "remove a voting option"); Console()->Register("force_vote", "ss?r", CFGFLAG_SERVER, 0, 0, "Force a voting option"); Console()->Register("clear_votes", "", CFGFLAG_SERVER, 0, 0, "Clears the voting options"); Console()->Register("vote", "r", CFGFLAG_SERVER, 0, 0, "Force a vote to yes/no"); Console()->Register("swap_teams", "", CFGFLAG_SERVER, 0, 0, "Swap the current teams"); Console()->Register("shuffle_teams", "", CFGFLAG_SERVER, 0, 0, "Shuffle the current teams"); for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->m_pClient = this; // let all the other components register their console commands for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnConsoleInit(); // Console()->Chain("player_name", ConchainSpecialInfoupdate, this); Console()->Chain("player_clan", ConchainSpecialInfoupdate, this); Console()->Chain("player_country", ConchainSpecialInfoupdate, this); Console()->Chain("player_use_custom_color", ConchainSpecialInfoupdate, this); Console()->Chain("player_color_body", ConchainSpecialInfoupdate, this); Console()->Chain("player_color_feet", ConchainSpecialInfoupdate, this); Console()->Chain("player_skin", ConchainSpecialInfoupdate, this); // m_SuppressEvents = false; } void CGameClient::OnInit() { m_pGraphics = Kernel()->RequestInterface(); // propagate pointers m_UI.SetGraphics(Graphics(), TextRender()); m_RenderTools.m_pGraphics = Graphics(); m_RenderTools.m_pUI = UI(); int64 Start = time_get(); // set the language g_Localization.Load(g_Config.m_ClLanguagefile, Storage(), Console()); // TODO: this should be different // setup item sizes for(int i = 0; i < NUM_NETOBJTYPES; i++) Client()->SnapSetStaticsize(i, m_NetObjHandler.GetObjSize(i)); // load default font static CFont *pDefaultFont = 0; char aFilename[512]; IOHANDLE File = Storage()->OpenFile("fonts/DejaVuSans.ttf", IOFLAG_READ, IStorage::TYPE_ALL, aFilename, sizeof(aFilename)); if(File) { io_close(File); pDefaultFont = TextRender()->LoadFont(aFilename); TextRender()->SetDefaultFont(pDefaultFont); } if(!pDefaultFont) Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "gameclient", "failed to load font. filename='fonts/DejaVuSans.ttf'"); // init all components for(int i = m_All.m_Num-1; i >= 0; --i) m_All.m_paComponents[i]->OnInit(); // setup load amount// load textures for(int i = 0; i < g_pData->m_NumImages; i++) { g_pData->m_aImages[i].m_Id = Graphics()->LoadTexture(g_pData->m_aImages[i].m_pFilename, IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); g_GameClient.m_pMenus->RenderLoading(); } for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnReset(); int64 End = time_get(); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "initialisation finished after %.2fms", ((End-Start)*1000)/(float)time_freq()); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "gameclient", aBuf); m_ServerMode = SERVERMODE_PURE; } void CGameClient::DispatchInput() { // handle mouse movement float x = 0.0f, y = 0.0f; Input()->MouseRelative(&x, &y); if(x != 0.0f || y != 0.0f) { for(int h = 0; h < m_Input.m_Num; h++) { if(m_Input.m_paComponents[h]->OnMouseMove(x, y)) break; } } // handle key presses for(int i = 0; i < Input()->NumEvents(); i++) { IInput::CEvent e = Input()->GetEvent(i); for(int h = 0; h < m_Input.m_Num; h++) { if(m_Input.m_paComponents[h]->OnInput(e)) { //dbg_msg("", "%d char=%d key=%d flags=%d", h, e.ch, e.key, e.flags); break; } } } // clear all events for this frame Input()->ClearEvents(); } int CGameClient::OnSnapInput(int *pData) { return m_pControls->SnapInput(pData); } void CGameClient::OnConnected() { m_Layers.Init(Kernel()); m_Collision.Init(Layers()); RenderTools()->RenderTilemapGenerateSkip(Layers()); for(int i = 0; i < m_All.m_Num; i++) { m_All.m_paComponents[i]->OnMapLoad(); m_All.m_paComponents[i]->OnReset(); } CServerInfo CurrentServerInfo; Client()->GetServerInfo(&CurrentServerInfo); m_ServerMode = SERVERMODE_PURE; m_LastSendInfo = 0; // send the inital info SendInfo(true); } void CGameClient::OnReset() { // clear out the invalid pointers m_LastNewPredictedTick = -1; mem_zero(&g_GameClient.m_Snap, sizeof(g_GameClient.m_Snap)); for(int i = 0; i < MAX_CLIENTS; i++) m_aClients[i].Reset(); for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnReset(); m_DemoSpecID = SPEC_FREEVIEW; m_FlagDropTick[TEAM_RED] = 0; m_FlagDropTick[TEAM_BLUE] = 0; m_Tuning = CTuningParams(); } void CGameClient::UpdatePositions() { // local character position if(g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) { if(!m_Snap.m_pLocalCharacter || (m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) { // don't use predicted } else m_LocalCharacterPos = mix(m_PredictedPrevChar.m_Pos, m_PredictedChar.m_Pos, Client()->PredIntraGameTick()); } else if(m_Snap.m_pLocalCharacter && m_Snap.m_pLocalPrevCharacter) { m_LocalCharacterPos = mix( vec2(m_Snap.m_pLocalPrevCharacter->m_X, m_Snap.m_pLocalPrevCharacter->m_Y), vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y), Client()->IntraGameTick()); } // spectator position if(m_Snap.m_SpecInfo.m_Active) { if(Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER && m_Snap.m_SpecInfo.m_SpectatorID != SPEC_FREEVIEW) { m_Snap.m_SpecInfo.m_Position = mix( vec2(m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Prev.m_X, m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Prev.m_Y), vec2(m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Cur.m_X, m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Cur.m_Y), Client()->IntraGameTick()); m_Snap.m_SpecInfo.m_UsePosition = true; } else if(m_Snap.m_pSpectatorInfo && (Client()->State() == IClient::STATE_DEMOPLAYBACK || m_Snap.m_SpecInfo.m_SpectatorID != SPEC_FREEVIEW)) { if(m_Snap.m_pPrevSpectatorInfo) m_Snap.m_SpecInfo.m_Position = mix(vec2(m_Snap.m_pPrevSpectatorInfo->m_X, m_Snap.m_pPrevSpectatorInfo->m_Y), vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y), Client()->IntraGameTick()); else m_Snap.m_SpecInfo.m_Position = vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y); m_Snap.m_SpecInfo.m_UsePosition = true; } } } static void Evolve(CNetObj_Character *pCharacter, int Tick) { CWorldCore TempWorld; CCharacterCore TempCore; mem_zero(&TempCore, sizeof(TempCore)); TempCore.Init(&TempWorld, g_GameClient.Collision()); TempCore.Read(pCharacter); while(pCharacter->m_Tick < Tick) { pCharacter->m_Tick++; TempCore.Tick(false); TempCore.Move(); TempCore.Quantize(); } TempCore.Write(pCharacter); } void CGameClient::OnRender() { /*Graphics()->Clear(1,0,0); menus->render_background(); return;*/ /* Graphics()->Clear(1,0,0); Graphics()->MapScreen(0,0,100,100); Graphics()->QuadsBegin(); Graphics()->SetColor(1,1,1,1); Graphics()->QuadsDraw(50, 50, 30, 30); Graphics()->QuadsEnd(); return;*/ // update the local character and spectate position UpdatePositions(); // dispatch all input to systems DispatchInput(); // render all systems for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnRender(); // clear new tick flags m_NewTick = false; m_NewPredictedTick = false; // check if client info has to be resent if(m_LastSendInfo && Client()->State() == IClient::STATE_ONLINE && m_Snap.m_LocalClientID >= 0 && !m_pMenus->IsActive() && m_LastSendInfo+time_freq()*6 < time_get()) { // resend if client info differs if(str_comp(g_Config.m_PlayerName, m_aClients[m_Snap.m_LocalClientID].m_aName) || str_comp(g_Config.m_PlayerClan, m_aClients[m_Snap.m_LocalClientID].m_aClan) || g_Config.m_PlayerCountry != m_aClients[m_Snap.m_LocalClientID].m_Country || str_comp(g_Config.m_PlayerSkin, m_aClients[m_Snap.m_LocalClientID].m_aSkinName) || (m_Snap.m_pGameInfoObj && !(m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) && // no teamgame? (g_Config.m_PlayerUseCustomColor != m_aClients[m_Snap.m_LocalClientID].m_UseCustomColor || g_Config.m_PlayerColorBody != m_aClients[m_Snap.m_LocalClientID].m_ColorBody || g_Config.m_PlayerColorFeet != m_aClients[m_Snap.m_LocalClientID].m_ColorFeet))) { SendInfo(false); } m_LastSendInfo = 0; } } void CGameClient::OnRelease() { // release all systems for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnRelease(); } void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker) { // special messages if(MsgId == NETMSGTYPE_SV_EXTRAPROJECTILE) { int Num = pUnpacker->GetInt(); for(int k = 0; k < Num; k++) { CNetObj_Projectile Proj; for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) ((int *)&Proj)[i] = pUnpacker->GetInt(); if(pUnpacker->Error()) return; g_GameClient.m_pItems->AddExtraProjectile(&Proj); } return; } else if(MsgId == NETMSGTYPE_SV_TUNEPARAMS) { // unpack the new tuning CTuningParams NewTuning; int *pParams = (int *)&NewTuning; for(unsigned i = 0; i < sizeof(CTuningParams)/sizeof(int); i++) pParams[i] = pUnpacker->GetInt(); // check for unpacking errors if(pUnpacker->Error()) return; m_ServerMode = SERVERMODE_PURE; // apply new tuning m_Tuning = NewTuning; return; } void *pRawMsg = m_NetObjHandler.SecureUnpackMsg(MsgId, pUnpacker); if(!pRawMsg) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "dropped weird message '%s' (%d), failed on '%s'", m_NetObjHandler.GetMsgName(MsgId), MsgId, m_NetObjHandler.FailedMsgOn()); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "client", aBuf); return; } // TODO: this should be done smarter for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnMessage(MsgId, pRawMsg); if(MsgId == NETMSGTYPE_SV_READYTOENTER) { Client()->EnterGame(); } else if (MsgId == NETMSGTYPE_SV_EMOTICON) { CNetMsg_Sv_Emoticon *pMsg = (CNetMsg_Sv_Emoticon *)pRawMsg; // apply m_aClients[pMsg->m_ClientID].m_Emoticon = pMsg->m_Emoticon; m_aClients[pMsg->m_ClientID].m_EmoticonStart = Client()->GameTick(); } else if(MsgId == NETMSGTYPE_SV_SOUNDGLOBAL) { if(m_SuppressEvents) return; // don't enqueue pseudo-global sounds from demos (created by PlayAndRecord) CNetMsg_Sv_SoundGlobal *pMsg = (CNetMsg_Sv_SoundGlobal *)pRawMsg; if(pMsg->m_SoundID == SOUND_CTF_DROP || pMsg->m_SoundID == SOUND_CTF_RETURN || pMsg->m_SoundID == SOUND_CTF_CAPTURE || pMsg->m_SoundID == SOUND_CTF_GRAB_EN || pMsg->m_SoundID == SOUND_CTF_GRAB_PL) g_GameClient.m_pSounds->Enqueue(CSounds::CHN_GLOBAL, pMsg->m_SoundID); else g_GameClient.m_pSounds->Play(CSounds::CHN_GLOBAL, pMsg->m_SoundID, 1.0f); } } void CGameClient::OnStateChange(int NewState, int OldState) { // reset everything when not already connected (to keep gathered stuff) if(NewState < IClient::STATE_ONLINE) OnReset(); // then change the state for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnStateChange(NewState, OldState); } void CGameClient::OnShutdown() {} void CGameClient::OnEnterGame() {} void CGameClient::OnGameOver() { if(Client()->State() != IClient::STATE_DEMOPLAYBACK && g_Config.m_ClEditor == 0) Client()->AutoScreenshot_Start(); } void CGameClient::OnStartGame() { if(Client()->State() != IClient::STATE_DEMOPLAYBACK) Client()->DemoRecorder_HandleAutoStart(); } void CGameClient::OnRconLine(const char *pLine) { m_pGameConsole->PrintLine(CGameConsole::CONSOLETYPE_REMOTE, pLine); } void CGameClient::ProcessEvents() { if(m_SuppressEvents) return; int SnapType = IClient::SNAP_CURRENT; int Num = Client()->SnapNumItems(SnapType); for(int Index = 0; Index < Num; Index++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(SnapType, Index, &Item); if(Item.m_Type == NETEVENTTYPE_DAMAGEIND) { CNetEvent_DamageInd *ev = (CNetEvent_DamageInd *)pData; g_GameClient.m_pEffects->DamageIndicator(vec2(ev->m_X, ev->m_Y), GetDirection(ev->m_Angle)); } else if(Item.m_Type == NETEVENTTYPE_EXPLOSION) { CNetEvent_Explosion *ev = (CNetEvent_Explosion *)pData; g_GameClient.m_pEffects->Explosion(vec2(ev->m_X, ev->m_Y)); } else if(Item.m_Type == NETEVENTTYPE_HAMMERHIT) { CNetEvent_HammerHit *ev = (CNetEvent_HammerHit *)pData; g_GameClient.m_pEffects->HammerHit(vec2(ev->m_X, ev->m_Y)); } else if(Item.m_Type == NETEVENTTYPE_SPAWN) { CNetEvent_Spawn *ev = (CNetEvent_Spawn *)pData; g_GameClient.m_pEffects->PlayerSpawn(vec2(ev->m_X, ev->m_Y)); } else if(Item.m_Type == NETEVENTTYPE_DEATH) { CNetEvent_Death *ev = (CNetEvent_Death *)pData; g_GameClient.m_pEffects->PlayerDeath(vec2(ev->m_X, ev->m_Y), ev->m_ClientID); } else if(Item.m_Type == NETEVENTTYPE_SOUNDWORLD) { CNetEvent_SoundWorld *ev = (CNetEvent_SoundWorld *)pData; g_GameClient.m_pSounds->PlayAt(CSounds::CHN_WORLD, ev->m_SoundID, 1.0f, vec2(ev->m_X, ev->m_Y)); } } } void CGameClient::OnNewSnapshot() { m_NewTick = true; // clear out the invalid pointers mem_zero(&g_GameClient.m_Snap, sizeof(g_GameClient.m_Snap)); m_Snap.m_LocalClientID = -1; // secure snapshot { int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int Index = 0; Index < Num; Index++) { IClient::CSnapItem Item; void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, Index, &Item); if(m_NetObjHandler.ValidateObj(Item.m_Type, pData, Item.m_DataSize) != 0) { if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "invalidated index=%d type=%d (%s) size=%d id=%d", Index, Item.m_Type, m_NetObjHandler.GetObjName(Item.m_Type), Item.m_DataSize, Item.m_ID); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); } Client()->SnapInvalidateItem(IClient::SNAP_CURRENT, Index); } } } ProcessEvents(); if(g_Config.m_DbgStress) { if((Client()->GameTick()%100) == 0) { char aMessage[64]; int MsgLen = rand()%(sizeof(aMessage)-1); for(int i = 0; i < MsgLen; i++) aMessage[i] = 'a'+(rand()%('z'-'a')); aMessage[MsgLen] = 0; CNetMsg_Cl_Say Msg; Msg.m_Team = rand()&1; Msg.m_pMessage = aMessage; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } } // go trough all the items in the snapshot and gather the info we want { m_Snap.m_aTeamSize[TEAM_RED] = m_Snap.m_aTeamSize[TEAM_BLUE] = 0; int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT); for(int i = 0; i < Num; i++) { IClient::CSnapItem Item; const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item); if(Item.m_Type == NETOBJTYPE_CLIENTINFO) { const CNetObj_ClientInfo *pInfo = (const CNetObj_ClientInfo *)pData; int ClientID = Item.m_ID; IntsToStr(&pInfo->m_Name0, 4, m_aClients[ClientID].m_aName); IntsToStr(&pInfo->m_Clan0, 3, m_aClients[ClientID].m_aClan); m_aClients[ClientID].m_Country = pInfo->m_Country; IntsToStr(&pInfo->m_Skin0, 6, m_aClients[ClientID].m_aSkinName); m_aClients[ClientID].m_UseCustomColor = pInfo->m_UseCustomColor; m_aClients[ClientID].m_ColorBody = pInfo->m_ColorBody; m_aClients[ClientID].m_ColorFeet = pInfo->m_ColorFeet; // prepare the info if(m_aClients[ClientID].m_aSkinName[0] == 'x' || m_aClients[ClientID].m_aSkinName[1] == '_') str_copy(m_aClients[ClientID].m_aSkinName, "default", 64); m_aClients[ClientID].m_SkinInfo.m_ColorBody = m_pSkins->GetColorV4(m_aClients[ClientID].m_ColorBody); m_aClients[ClientID].m_SkinInfo.m_ColorFeet = m_pSkins->GetColorV4(m_aClients[ClientID].m_ColorFeet); m_aClients[ClientID].m_SkinInfo.m_Size = 64; // find new skin m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find(m_aClients[ClientID].m_aSkinName); if(m_aClients[ClientID].m_SkinID < 0) { m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find("default"); if(m_aClients[ClientID].m_SkinID < 0) m_aClients[ClientID].m_SkinID = 0; } if(m_aClients[ClientID].m_UseCustomColor) m_aClients[ClientID].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[ClientID].m_SkinID)->m_ColorTexture; else { m_aClients[ClientID].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[ClientID].m_SkinID)->m_OrgTexture; m_aClients[ClientID].m_SkinInfo.m_ColorBody = vec4(1,1,1,1); m_aClients[ClientID].m_SkinInfo.m_ColorFeet = vec4(1,1,1,1); } m_aClients[ClientID].UpdateRenderInfo(); } else if(Item.m_Type == NETOBJTYPE_PLAYERINFO) { const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)pData; m_aClients[pInfo->m_ClientID].m_Team = pInfo->m_Team; m_aClients[pInfo->m_ClientID].m_Active = true; m_Snap.m_paPlayerInfos[pInfo->m_ClientID] = pInfo; m_Snap.m_NumPlayers++; if(pInfo->m_Local) { m_Snap.m_LocalClientID = Item.m_ID; m_Snap.m_pLocalInfo = pInfo; if(pInfo->m_Team == TEAM_SPECTATORS) { m_Snap.m_SpecInfo.m_Active = true; m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW; } } // calculate team-balance if(pInfo->m_Team != TEAM_SPECTATORS) m_Snap.m_aTeamSize[pInfo->m_Team]++; } else if(Item.m_Type == NETOBJTYPE_CHARACTER) { const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_ID); m_Snap.m_aCharacters[Item.m_ID].m_Cur = *((const CNetObj_Character *)pData); if(pOld) { m_Snap.m_aCharacters[Item.m_ID].m_Active = true; m_Snap.m_aCharacters[Item.m_ID].m_Prev = *((const CNetObj_Character *)pOld); if(m_Snap.m_aCharacters[Item.m_ID].m_Prev.m_Tick) Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Prev, Client()->PrevGameTick()); if(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_Tick) Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Cur, Client()->GameTick()); } } else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO) { m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *)pData; m_Snap.m_pPrevSpectatorInfo = (const CNetObj_SpectatorInfo *)Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_SPECTATORINFO, Item.m_ID); m_Snap.m_SpecInfo.m_SpectatorID = m_Snap.m_pSpectatorInfo->m_SpectatorID; } else if(Item.m_Type == NETOBJTYPE_GAMEINFO) { static bool s_GameOver = 0; m_Snap.m_pGameInfoObj = (const CNetObj_GameInfo *)pData; if(!s_GameOver && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER) OnGameOver(); else if(s_GameOver && !(m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) OnStartGame(); s_GameOver = m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER; } else if(Item.m_Type == NETOBJTYPE_GAMEDATA) { m_Snap.m_pGameDataObj = (const CNetObj_GameData *)pData; m_Snap.m_GameDataSnapID = Item.m_ID; if(m_Snap.m_pGameDataObj->m_FlagCarrierRed == FLAG_TAKEN) { if(m_FlagDropTick[TEAM_RED] == 0) m_FlagDropTick[TEAM_RED] = Client()->GameTick(); } else if(m_FlagDropTick[TEAM_RED] != 0) m_FlagDropTick[TEAM_RED] = 0; if(m_Snap.m_pGameDataObj->m_FlagCarrierBlue == FLAG_TAKEN) { if(m_FlagDropTick[TEAM_BLUE] == 0) m_FlagDropTick[TEAM_BLUE] = Client()->GameTick(); } else if(m_FlagDropTick[TEAM_BLUE] != 0) m_FlagDropTick[TEAM_BLUE] = 0; } else if(Item.m_Type == NETOBJTYPE_FLAG) m_Snap.m_paFlags[Item.m_ID%2] = (const CNetObj_Flag *)pData; } } // setup local pointers if(m_Snap.m_LocalClientID >= 0) { CSnapState::CCharacterInfo *c = &m_Snap.m_aCharacters[m_Snap.m_LocalClientID]; if(c->m_Active) { m_Snap.m_pLocalCharacter = &c->m_Cur; m_Snap.m_pLocalPrevCharacter = &c->m_Prev; m_LocalCharacterPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y); } else if(Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, m_Snap.m_LocalClientID)) { // player died m_pControls->OnPlayerDeath(); } } else { m_Snap.m_SpecInfo.m_Active = true; if(Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER && m_DemoSpecID != SPEC_FREEVIEW && m_Snap.m_aCharacters[m_DemoSpecID].m_Active) m_Snap.m_SpecInfo.m_SpectatorID = m_DemoSpecID; else m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW; } // clear out unneeded client data for(int i = 0; i < MAX_CLIENTS; ++i) { if(!m_Snap.m_paPlayerInfos[i] && m_aClients[i].m_Active) m_aClients[i].Reset(); } // update friend state for(int i = 0; i < MAX_CLIENTS; ++i) { if(i == m_Snap.m_LocalClientID || !m_Snap.m_paPlayerInfos[i] || !Friends()->IsFriend(m_aClients[i].m_aName, m_aClients[i].m_aClan, true)) m_aClients[i].m_Friend = false; else m_aClients[i].m_Friend = true; } // sort player infos by score mem_copy(m_Snap.m_paInfoByScore, m_Snap.m_paPlayerInfos, sizeof(m_Snap.m_paInfoByScore)); for(int k = 0; k < MAX_CLIENTS-1; k++) // ffs, bubblesort { for(int i = 0; i < MAX_CLIENTS-k-1; i++) { if(m_Snap.m_paInfoByScore[i+1] && (!m_Snap.m_paInfoByScore[i] || m_Snap.m_paInfoByScore[i]->m_Score < m_Snap.m_paInfoByScore[i+1]->m_Score)) { const CNetObj_PlayerInfo *pTmp = m_Snap.m_paInfoByScore[i]; m_Snap.m_paInfoByScore[i] = m_Snap.m_paInfoByScore[i+1]; m_Snap.m_paInfoByScore[i+1] = pTmp; } } } // sort player infos by team int Teams[3] = { TEAM_RED, TEAM_BLUE, TEAM_SPECTATORS }; int Index = 0; for(int Team = 0; Team < 3; ++Team) { for(int i = 0; i < MAX_CLIENTS && Index < MAX_CLIENTS; ++i) { if(m_Snap.m_paPlayerInfos[i] && m_Snap.m_paPlayerInfos[i]->m_Team == Teams[Team]) m_Snap.m_paInfoByTeam[Index++] = m_Snap.m_paPlayerInfos[i]; } } CTuningParams StandardTuning; CServerInfo CurrentServerInfo; Client()->GetServerInfo(&CurrentServerInfo); if(CurrentServerInfo.m_aGameType[0] != '0') { if(str_comp(CurrentServerInfo.m_aGameType, "DM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "TDM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "CTF") != 0) m_ServerMode = SERVERMODE_MOD; else if(mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) == 0) m_ServerMode = SERVERMODE_PURE; else m_ServerMode = SERVERMODE_PUREMOD; } // add tuning to demo if(DemoRecorder()->IsRecording() && mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) != 0) { CMsgPacker Msg(NETMSGTYPE_SV_TUNEPARAMS); int *pParams = (int *)&m_Tuning; for(unsigned i = 0; i < sizeof(m_Tuning)/sizeof(int); i++) Msg.AddInt(pParams[i]); Client()->SendMsg(&Msg, MSGFLAG_RECORD|MSGFLAG_NOSEND); } } void CGameClient::OnPredict() { // store the previous values so we can detect prediction errors CCharacterCore BeforePrevChar = m_PredictedPrevChar; CCharacterCore BeforeChar = m_PredictedChar; // we can't predict without our own id or own character if(m_Snap.m_LocalClientID == -1 || !m_Snap.m_aCharacters[m_Snap.m_LocalClientID].m_Active) return; // don't predict anything if we are paused if(m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_PAUSED) { if(m_Snap.m_pLocalCharacter) m_PredictedChar.Read(m_Snap.m_pLocalCharacter); if(m_Snap.m_pLocalPrevCharacter) m_PredictedPrevChar.Read(m_Snap.m_pLocalPrevCharacter); return; } // repredict character CWorldCore World; World.m_Tuning = m_Tuning; // search for players for(int i = 0; i < MAX_CLIENTS; i++) { if(!m_Snap.m_aCharacters[i].m_Active) continue; g_GameClient.m_aClients[i].m_Predicted.Init(&World, Collision()); World.m_apCharacters[i] = &g_GameClient.m_aClients[i].m_Predicted; g_GameClient.m_aClients[i].m_Predicted.Read(&m_Snap.m_aCharacters[i].m_Cur); } // predict for(int Tick = Client()->GameTick()+1; Tick <= Client()->PredGameTick(); Tick++) { // fetch the local if(Tick == Client()->PredGameTick() && World.m_apCharacters[m_Snap.m_LocalClientID]) m_PredictedPrevChar = *World.m_apCharacters[m_Snap.m_LocalClientID]; // first calculate where everyone should move for(int c = 0; c < MAX_CLIENTS; c++) { if(!World.m_apCharacters[c]) continue; mem_zero(&World.m_apCharacters[c]->m_Input, sizeof(World.m_apCharacters[c]->m_Input)); if(m_Snap.m_LocalClientID == c) { // apply player input int *pInput = Client()->GetInput(Tick); if(pInput) World.m_apCharacters[c]->m_Input = *((CNetObj_PlayerInput*)pInput); World.m_apCharacters[c]->Tick(true); } else World.m_apCharacters[c]->Tick(false); } // move all players and quantize their data for(int c = 0; c < MAX_CLIENTS; c++) { if(!World.m_apCharacters[c]) continue; World.m_apCharacters[c]->Move(); World.m_apCharacters[c]->Quantize(); } // check if we want to trigger effects if(Tick > m_LastNewPredictedTick) { m_LastNewPredictedTick = Tick; m_NewPredictedTick = true; if(m_Snap.m_LocalClientID != -1 && World.m_apCharacters[m_Snap.m_LocalClientID]) { vec2 Pos = World.m_apCharacters[m_Snap.m_LocalClientID]->m_Pos; int Events = World.m_apCharacters[m_Snap.m_LocalClientID]->m_TriggeredEvents; if(Events&COREEVENT_GROUND_JUMP) g_GameClient.m_pSounds->PlayAndRecord(CSounds::CHN_WORLD, SOUND_PLAYER_JUMP, 1.0f, Pos); /*if(events&COREEVENT_AIR_JUMP) { GameClient.effects->air_jump(pos); GameClient.sounds->play_and_record(SOUNDS::CHN_WORLD, SOUND_PLAYER_AIRJUMP, 1.0f, pos); }*/ //if(events&COREEVENT_HOOK_LAUNCH) snd_play_random(CHN_WORLD, SOUND_HOOK_LOOP, 1.0f, pos); //if(events&COREEVENT_HOOK_ATTACH_PLAYER) snd_play_random(CHN_WORLD, SOUND_HOOK_ATTACH_PLAYER, 1.0f, pos); if(Events&COREEVENT_HOOK_ATTACH_GROUND) g_GameClient.m_pSounds->PlayAndRecord(CSounds::CHN_WORLD, SOUND_HOOK_ATTACH_GROUND, 1.0f, Pos); if(Events&COREEVENT_HOOK_HIT_NOHOOK) g_GameClient.m_pSounds->PlayAndRecord(CSounds::CHN_WORLD, SOUND_HOOK_NOATTACH, 1.0f, Pos); //if(events&COREEVENT_HOOK_RETRACT) snd_play_random(CHN_WORLD, SOUND_PLAYER_JUMP, 1.0f, pos); } } if(Tick == Client()->PredGameTick() && World.m_apCharacters[m_Snap.m_LocalClientID]) m_PredictedChar = *World.m_apCharacters[m_Snap.m_LocalClientID]; } if(g_Config.m_Debug && g_Config.m_ClPredict && m_PredictedTick == Client()->PredGameTick()) { CNetObj_CharacterCore Before = {0}, Now = {0}, BeforePrev = {0}, NowPrev = {0}; BeforeChar.Write(&Before); BeforePrevChar.Write(&BeforePrev); m_PredictedChar.Write(&Now); m_PredictedPrevChar.Write(&NowPrev); if(mem_comp(&Before, &Now, sizeof(CNetObj_CharacterCore)) != 0) { Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", "prediction error"); for(unsigned i = 0; i < sizeof(CNetObj_CharacterCore)/sizeof(int); i++) if(((int *)&Before)[i] != ((int *)&Now)[i]) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), " %d %d %d (%d %d)", i, ((int *)&Before)[i], ((int *)&Now)[i], ((int *)&BeforePrev)[i], ((int *)&NowPrev)[i]); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client", aBuf); } } } m_PredictedTick = Client()->PredGameTick(); } void CGameClient::OnActivateEditor() { OnRelease(); } void CGameClient::CClientData::UpdateRenderInfo() { m_RenderInfo = m_SkinInfo; // force team colors if(g_GameClient.m_Snap.m_pGameInfoObj && g_GameClient.m_Snap.m_pGameInfoObj->m_GameFlags&GAMEFLAG_TEAMS) { m_RenderInfo.m_Texture = g_GameClient.m_pSkins->Get(m_SkinID)->m_ColorTexture; const int TeamColors[2] = {65387, 10223467}; if(m_Team >= TEAM_RED && m_Team <= TEAM_BLUE) { m_RenderInfo.m_ColorBody = g_GameClient.m_pSkins->GetColorV4(TeamColors[m_Team]); m_RenderInfo.m_ColorFeet = g_GameClient.m_pSkins->GetColorV4(TeamColors[m_Team]); } else { m_RenderInfo.m_ColorBody = g_GameClient.m_pSkins->GetColorV4(12895054); m_RenderInfo.m_ColorFeet = g_GameClient.m_pSkins->GetColorV4(12895054); } } } void CGameClient::CClientData::Reset() { m_aName[0] = 0; m_aClan[0] = 0; m_Country = -1; m_SkinID = 0; m_Team = 0; m_Angle = 0; m_Emoticon = 0; m_EmoticonStart = -1; m_Active = false; m_ChatIgnore = false; m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(0)->m_ColorTexture; m_SkinInfo.m_ColorBody = vec4(1,1,1,1); m_SkinInfo.m_ColorFeet = vec4(1,1,1,1); UpdateRenderInfo(); } void CGameClient::SendSwitchTeam(int Team) { CNetMsg_Cl_SetTeam Msg; Msg.m_Team = Team; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } void CGameClient::SendInfo(bool Start) { if(Start) { CNetMsg_Cl_StartInfo Msg; Msg.m_pName = g_Config.m_PlayerName; Msg.m_pClan = g_Config.m_PlayerClan; Msg.m_Country = g_Config.m_PlayerCountry; Msg.m_pSkin = g_Config.m_PlayerSkin; Msg.m_UseCustomColor = g_Config.m_PlayerUseCustomColor; Msg.m_ColorBody = g_Config.m_PlayerColorBody; Msg.m_ColorFeet = g_Config.m_PlayerColorFeet; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } else { CNetMsg_Cl_ChangeInfo Msg; Msg.m_pName = g_Config.m_PlayerName; Msg.m_pClan = g_Config.m_PlayerClan; Msg.m_Country = g_Config.m_PlayerCountry; Msg.m_pSkin = g_Config.m_PlayerSkin; Msg.m_UseCustomColor = g_Config.m_PlayerUseCustomColor; Msg.m_ColorBody = g_Config.m_PlayerColorBody; Msg.m_ColorFeet = g_Config.m_PlayerColorFeet; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); // activate timer to resend the info if it gets filtered if(!m_LastSendInfo || m_LastSendInfo+time_freq()*5 < time_get()) m_LastSendInfo = time_get(); } } void CGameClient::SendKill(int ClientID) { CNetMsg_Cl_Kill Msg; Client()->SendPackMsg(&Msg, MSGFLAG_VITAL); } void CGameClient::ConTeam(IConsole::IResult *pResult, void *pUserData) { ((CGameClient*)pUserData)->SendSwitchTeam(pResult->GetInteger(0)); } void CGameClient::ConKill(IConsole::IResult *pResult, void *pUserData) { ((CGameClient*)pUserData)->SendKill(-1); } void CGameClient::ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments()) ((CGameClient*)pUserData)->SendInfo(false); } IGameClient *CreateGameClient() { return &g_GameClient; } teeworlds-0.6.2+dfsg/src/game/client/gameclient.h0000644000175000017500000001544612140200333020703 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_GAMECLIENT_H #define GAME_CLIENT_GAMECLIENT_H #include #include #include #include #include #include "render.h" class CGameClient : public IGameClient { class CStack { public: enum { MAX_COMPONENTS = 64, }; CStack(); void Add(class CComponent *pComponent); class CComponent *m_paComponents[MAX_COMPONENTS]; int m_Num; }; CStack m_All; CStack m_Input; CNetObjHandler m_NetObjHandler; class IEngine *m_pEngine; class IInput *m_pInput; class IGraphics *m_pGraphics; class ITextRender *m_pTextRender; class IClient *m_pClient; class ISound *m_pSound; class IConsole *m_pConsole; class IStorage *m_pStorage; class IDemoPlayer *m_pDemoPlayer; class IDemoRecorder *m_pDemoRecorder; class IServerBrowser *m_pServerBrowser; class IEditor *m_pEditor; class IFriends *m_pFriends; CLayers m_Layers; class CCollision m_Collision; CUI m_UI; void DispatchInput(); void ProcessEvents(); void UpdatePositions(); int m_PredictedTick; int m_LastNewPredictedTick; int64 m_LastSendInfo; static void ConTeam(IConsole::IResult *pResult, void *pUserData); static void ConKill(IConsole::IResult *pResult, void *pUserData); static void ConchainSpecialInfoupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); public: IKernel *Kernel() { return IInterface::Kernel(); } IEngine *Engine() const { return m_pEngine; } class IGraphics *Graphics() const { return m_pGraphics; } class IClient *Client() const { return m_pClient; } class CUI *UI() { return &m_UI; } class ISound *Sound() const { return m_pSound; } class IInput *Input() const { return m_pInput; } class IStorage *Storage() const { return m_pStorage; } class IConsole *Console() { return m_pConsole; } class ITextRender *TextRender() const { return m_pTextRender; } class IDemoPlayer *DemoPlayer() const { return m_pDemoPlayer; } class IDemoRecorder *DemoRecorder() const { return m_pDemoRecorder; } class IServerBrowser *ServerBrowser() const { return m_pServerBrowser; } class CRenderTools *RenderTools() { return &m_RenderTools; } class CLayers *Layers() { return &m_Layers; }; class CCollision *Collision() { return &m_Collision; }; class IEditor *Editor() { return m_pEditor; } class IFriends *Friends() { return m_pFriends; } int NetobjNumCorrections() { return m_NetObjHandler.NumObjCorrections(); } const char *NetobjCorrectedOn() { return m_NetObjHandler.CorrectedObjOn(); } bool m_SuppressEvents; bool m_NewTick; bool m_NewPredictedTick; int m_FlagDropTick[2]; // TODO: move this CTuningParams m_Tuning; enum { SERVERMODE_PURE=0, SERVERMODE_MOD, SERVERMODE_PUREMOD, }; int m_ServerMode; int m_DemoSpecID; vec2 m_LocalCharacterPos; // predicted players CCharacterCore m_PredictedPrevChar; CCharacterCore m_PredictedChar; // snap pointers struct CSnapState { const CNetObj_Character *m_pLocalCharacter; const CNetObj_Character *m_pLocalPrevCharacter; const CNetObj_PlayerInfo *m_pLocalInfo; const CNetObj_SpectatorInfo *m_pSpectatorInfo; const CNetObj_SpectatorInfo *m_pPrevSpectatorInfo; const CNetObj_Flag *m_paFlags[2]; const CNetObj_GameInfo *m_pGameInfoObj; const CNetObj_GameData *m_pGameDataObj; int m_GameDataSnapID; const CNetObj_PlayerInfo *m_paPlayerInfos[MAX_CLIENTS]; const CNetObj_PlayerInfo *m_paInfoByScore[MAX_CLIENTS]; const CNetObj_PlayerInfo *m_paInfoByTeam[MAX_CLIENTS]; int m_LocalClientID; int m_NumPlayers; int m_aTeamSize[2]; // spectate data struct CSpectateInfo { bool m_Active; int m_SpectatorID; bool m_UsePosition; vec2 m_Position; } m_SpecInfo; // struct CCharacterInfo { bool m_Active; // snapshots CNetObj_Character m_Prev; CNetObj_Character m_Cur; // interpolated position vec2 m_Position; }; CCharacterInfo m_aCharacters[MAX_CLIENTS]; }; CSnapState m_Snap; // client data struct CClientData { int m_UseCustomColor; int m_ColorBody; int m_ColorFeet; char m_aName[MAX_NAME_LENGTH]; char m_aClan[MAX_CLAN_LENGTH]; int m_Country; char m_aSkinName[64]; int m_SkinID; int m_SkinColor; int m_Team; int m_Emoticon; int m_EmoticonStart; CCharacterCore m_Predicted; CTeeRenderInfo m_SkinInfo; // this is what the server reports CTeeRenderInfo m_RenderInfo; // this is what we use float m_Angle; bool m_Active; bool m_ChatIgnore; bool m_Friend; void UpdateRenderInfo(); void Reset(); }; CClientData m_aClients[MAX_CLIENTS]; CRenderTools m_RenderTools; void OnReset(); // hooks virtual void OnConnected(); virtual void OnRender(); virtual void OnRelease(); virtual void OnInit(); virtual void OnConsoleInit(); virtual void OnStateChange(int NewState, int OldState); virtual void OnMessage(int MsgId, CUnpacker *pUnpacker); virtual void OnNewSnapshot(); virtual void OnPredict(); virtual void OnActivateEditor(); virtual int OnSnapInput(int *pData); virtual void OnShutdown(); virtual void OnEnterGame(); virtual void OnRconLine(const char *pLine); virtual void OnGameOver(); virtual void OnStartGame(); virtual const char *GetItemName(int Type); virtual const char *Version(); virtual const char *NetVersion(); // actions // TODO: move these void SendSwitchTeam(int Team); void SendInfo(bool Start); void SendKill(int ClientID); // pointers to all systems class CGameConsole *m_pGameConsole; class CBinds *m_pBinds; class CParticles *m_pParticles; class CMenus *m_pMenus; class CSkins *m_pSkins; class CCountryFlags *m_pCountryFlags; class CFlow *m_pFlow; class CChat *m_pChat; class CDamageInd *m_pDamageind; class CCamera *m_pCamera; class CControls *m_pControls; class CEffects *m_pEffects; class CSounds *m_pSounds; class CMotd *m_pMotd; class CMapImages *m_pMapimages; class CVoting *m_pVoting; class CScoreboard *m_pScoreboard; class CItems *m_pItems; class CMapLayers *m_pMapLayersBackGround; class CMapLayers *m_pMapLayersForeGround; }; inline float HueToRgb(float v1, float v2, float h) { if(h < 0.0f) h += 1; if(h > 1.0f) h -= 1; if((6.0f * h) < 1.0f) return v1 + (v2 - v1) * 6.0f * h; if((2.0f * h) < 1.0f) return v2; if((3.0f * h) < 2.0f) return v1 + (v2 - v1) * ((2.0f/3.0f) - h) * 6.0f; return v1; } inline vec3 HslToRgb(vec3 HSL) { if(HSL.s == 0.0f) return vec3(HSL.l, HSL.l, HSL.l); else { float v2 = HSL.l < 0.5f ? HSL.l * (1.0f + HSL.s) : (HSL.l+HSL.s) - (HSL.s*HSL.l); float v1 = 2.0f * HSL.l - v2; return vec3(HueToRgb(v1, v2, HSL.h + (1.0f/3.0f)), HueToRgb(v1, v2, HSL.h), HueToRgb(v1, v2, HSL.h - (1.0f/3.0f))); } } extern const char *Localize(const char *Str); #endif teeworlds-0.6.2+dfsg/src/game/client/lineinput.cpp0000644000175000017500000000532612140200333021131 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "lineinput.h" CLineInput::CLineInput() { Clear(); } void CLineInput::Clear() { mem_zero(m_Str, sizeof(m_Str)); m_Len = 0; m_CursorPos = 0; m_NumChars = 0; } void CLineInput::Set(const char *pString) { str_copy(m_Str, pString, sizeof(m_Str)); m_Len = str_length(m_Str); m_CursorPos = m_Len; m_NumChars = 0; int Offset = 0; while(pString[Offset]) { Offset = str_utf8_forward(pString, Offset); ++m_NumChars; } } bool CLineInput::Manipulate(IInput::CEvent e, char *pStr, int StrMaxSize, int StrMaxChars, int *pStrLenPtr, int *pCursorPosPtr, int *pNumCharsPtr) { int NumChars = *pNumCharsPtr; int CursorPos = *pCursorPosPtr; int Len = *pStrLenPtr; bool Changes = false; if(CursorPos > Len) CursorPos = Len; int Code = e.m_Unicode; int k = e.m_Key; // 127 is produced on Mac OS X and corresponds to the delete key if (!(Code >= 0 && Code < 32) && Code != 127) { char Tmp[8]; int CharSize = str_utf8_encode(Tmp, Code); if (Len < StrMaxSize - CharSize && CursorPos < StrMaxSize - CharSize && NumChars < StrMaxChars) { mem_move(pStr + CursorPos + CharSize, pStr + CursorPos, Len-CursorPos+1); // +1 == null term for(int i = 0; i < CharSize; i++) pStr[CursorPos+i] = Tmp[i]; CursorPos += CharSize; Len += CharSize; if(CharSize > 0) ++NumChars; Changes = true; } } if(e.m_Flags&IInput::FLAG_PRESS) { if (k == KEY_BACKSPACE && CursorPos > 0) { int NewCursorPos = str_utf8_rewind(pStr, CursorPos); int CharSize = CursorPos-NewCursorPos; mem_move(pStr+NewCursorPos, pStr+CursorPos, Len - NewCursorPos - CharSize + 1); // +1 == null term CursorPos = NewCursorPos; Len -= CharSize; if(CharSize > 0) --NumChars; Changes = true; } else if (k == KEY_DELETE && CursorPos < Len) { int p = str_utf8_forward(pStr, CursorPos); int CharSize = p-CursorPos; mem_move(pStr + CursorPos, pStr + CursorPos + CharSize, Len - CursorPos - CharSize + 1); // +1 == null term Len -= CharSize; if(CharSize > 0) --NumChars; Changes = true; } else if (k == KEY_LEFT && CursorPos > 0) CursorPos = str_utf8_rewind(pStr, CursorPos); else if (k == KEY_RIGHT && CursorPos < Len) CursorPos = str_utf8_forward(pStr, CursorPos); else if (k == KEY_HOME) CursorPos = 0; else if (k == KEY_END) CursorPos = Len; } *pNumCharsPtr = NumChars; *pCursorPosPtr = CursorPos; *pStrLenPtr = Len; return Changes; } void CLineInput::ProcessInput(IInput::CEvent e) { Manipulate(e, m_Str, MAX_SIZE, MAX_CHARS, &m_Len, &m_CursorPos, &m_NumChars); } teeworlds-0.6.2+dfsg/src/game/client/lineinput.h0000644000175000017500000000204412140200333020570 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_LINEINPUT_H #define GAME_CLIENT_LINEINPUT_H #include // line input helter class CLineInput { enum { MAX_SIZE=512, MAX_CHARS=MAX_SIZE/4, }; char m_Str[MAX_SIZE]; int m_Len; int m_CursorPos; int m_NumChars; public: static bool Manipulate(IInput::CEvent e, char *pStr, int StrMaxSize, int StrMaxChars, int *pStrLenPtr, int *pCursorPosPtr, int *pNumCharsPtr); class CCallback { public: virtual ~CCallback() {} virtual bool Event(IInput::CEvent e) = 0; }; CLineInput(); void Clear(); void ProcessInput(IInput::CEvent e); void Set(const char *pString); const char *GetString() const { return m_Str; } int GetLength() const { return m_Len; } int GetCursorOffset() const { return m_CursorPos; } void SetCursorOffset(int Offset) { m_CursorPos = Offset > m_Len ? m_Len : Offset < 0 ? 0 : Offset; } }; #endif teeworlds-0.6.2+dfsg/src/game/client/render.cpp0000644000175000017500000002122212140200333020372 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include "animstate.h" #include "render.h" static float gs_SpriteWScale; static float gs_SpriteHScale; /* static void layershot_begin() { if(!config.cl_layershot) return; Graphics()->Clear(0,0,0); } static void layershot_end() { if(!config.cl_layershot) return; char buf[256]; str_format(buf, sizeof(buf), "screenshots/layers_%04d.png", config.cl_layershot); gfx_screenshot_direct(buf); config.cl_layershot++; }*/ void CRenderTools::SelectSprite(CDataSprite *pSpr, int Flags, int sx, int sy) { int x = pSpr->m_X+sx; int y = pSpr->m_Y+sy; int w = pSpr->m_W; int h = pSpr->m_H; int cx = pSpr->m_pSet->m_Gridx; int cy = pSpr->m_pSet->m_Gridy; float f = sqrtf(h*h + w*w); gs_SpriteWScale = w/f; gs_SpriteHScale = h/f; float x1 = x/(float)cx; float x2 = (x+w)/(float)cx; float y1 = y/(float)cy; float y2 = (y+h)/(float)cy; float Temp = 0; if(Flags&SPRITE_FLAG_FLIP_Y) { Temp = y1; y1 = y2; y2 = Temp; } if(Flags&SPRITE_FLAG_FLIP_X) { Temp = x1; x1 = x2; x2 = Temp; } Graphics()->QuadsSetSubset(x1, y1, x2, y2); } void CRenderTools::SelectSprite(int Id, int Flags, int sx, int sy) { if(Id < 0 || Id >= g_pData->m_NumSprites) return; SelectSprite(&g_pData->m_aSprites[Id], Flags, sx, sy); } void CRenderTools::DrawSprite(float x, float y, float Size) { IGraphics::CQuadItem QuadItem(x, y, Size*gs_SpriteWScale, Size*gs_SpriteHScale); Graphics()->QuadsDraw(&QuadItem, 1); } void CRenderTools::DrawRoundRectExt(float x, float y, float w, float h, float r, int Corners) { IGraphics::CFreeformItem ArrayF[32]; int NumItems = 0; int Num = 8; for(int i = 0; i < Num; i+=2) { float a1 = i/(float)Num * pi/2; float a2 = (i+1)/(float)Num * pi/2; float a3 = (i+2)/(float)Num * pi/2; float Ca1 = cosf(a1); float Ca2 = cosf(a2); float Ca3 = cosf(a3); float Sa1 = sinf(a1); float Sa2 = sinf(a2); float Sa3 = sinf(a3); if(Corners&1) // TL ArrayF[NumItems++] = IGraphics::CFreeformItem( x+r, y+r, x+(1-Ca1)*r, y+(1-Sa1)*r, x+(1-Ca3)*r, y+(1-Sa3)*r, x+(1-Ca2)*r, y+(1-Sa2)*r); if(Corners&2) // TR ArrayF[NumItems++] = IGraphics::CFreeformItem( x+w-r, y+r, x+w-r+Ca1*r, y+(1-Sa1)*r, x+w-r+Ca3*r, y+(1-Sa3)*r, x+w-r+Ca2*r, y+(1-Sa2)*r); if(Corners&4) // BL ArrayF[NumItems++] = IGraphics::CFreeformItem( x+r, y+h-r, x+(1-Ca1)*r, y+h-r+Sa1*r, x+(1-Ca3)*r, y+h-r+Sa3*r, x+(1-Ca2)*r, y+h-r+Sa2*r); if(Corners&8) // BR ArrayF[NumItems++] = IGraphics::CFreeformItem( x+w-r, y+h-r, x+w-r+Ca1*r, y+h-r+Sa1*r, x+w-r+Ca3*r, y+h-r+Sa3*r, x+w-r+Ca2*r, y+h-r+Sa2*r); } Graphics()->QuadsDrawFreeform(ArrayF, NumItems); IGraphics::CQuadItem ArrayQ[9]; NumItems = 0; ArrayQ[NumItems++] = IGraphics::CQuadItem(x+r, y+r, w-r*2, h-r*2); // center ArrayQ[NumItems++] = IGraphics::CQuadItem(x+r, y, w-r*2, r); // top ArrayQ[NumItems++] = IGraphics::CQuadItem(x+r, y+h-r, w-r*2, r); // bottom ArrayQ[NumItems++] = IGraphics::CQuadItem(x, y+r, r, h-r*2); // left ArrayQ[NumItems++] = IGraphics::CQuadItem(x+w-r, y+r, r, h-r*2); // right if(!(Corners&1)) ArrayQ[NumItems++] = IGraphics::CQuadItem(x, y, r, r); // TL if(!(Corners&2)) ArrayQ[NumItems++] = IGraphics::CQuadItem(x+w, y, -r, r); // TR if(!(Corners&4)) ArrayQ[NumItems++] = IGraphics::CQuadItem(x, y+h, r, -r); // BL if(!(Corners&8)) ArrayQ[NumItems++] = IGraphics::CQuadItem(x+w, y+h, -r, -r); // BR Graphics()->QuadsDrawTL(ArrayQ, NumItems); } void CRenderTools::DrawRoundRect(float x, float y, float w, float h, float r) { DrawRoundRectExt(x,y,w,h,r,0xf); } void CRenderTools::DrawUIRect(const CUIRect *r, vec4 Color, int Corners, float Rounding) { Graphics()->TextureSet(-1); // TODO: FIX US Graphics()->QuadsBegin(); Graphics()->SetColor(Color.r, Color.g, Color.b, Color.a); DrawRoundRectExt(r->x,r->y,r->w,r->h,Rounding*UI()->Scale(), Corners); Graphics()->QuadsEnd(); } void CRenderTools::RenderTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos) { vec2 Direction = Dir; vec2 Position = Pos; //Graphics()->TextureSet(data->images[IMAGE_CHAR_DEFAULT].id); Graphics()->TextureSet(pInfo->m_Texture); // TODO: FIX ME Graphics()->QuadsBegin(); //Graphics()->QuadsDraw(pos.x, pos.y-128, 128, 128); // first pass we draw the outline // second pass we draw the filling for(int p = 0; p < 2; p++) { int OutLine = p==0 ? 1 : 0; for(int f = 0; f < 2; f++) { float AnimScale = pInfo->m_Size * 1.0f/64.0f; float BaseSize = pInfo->m_Size; if(f == 1) { Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); // draw body Graphics()->SetColor(pInfo->m_ColorBody.r, pInfo->m_ColorBody.g, pInfo->m_ColorBody.b, pInfo->m_ColorBody.a); vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y)*AnimScale; SelectSprite(OutLine?SPRITE_TEE_BODY_OUTLINE:SPRITE_TEE_BODY, 0, 0, 0); IGraphics::CQuadItem QuadItem(BodyPos.x, BodyPos.y, BaseSize, BaseSize); Graphics()->QuadsDraw(&QuadItem, 1); // draw eyes if(p == 1) { switch (Emote) { case EMOTE_PAIN: SelectSprite(SPRITE_TEE_EYE_PAIN, 0, 0, 0); break; case EMOTE_HAPPY: SelectSprite(SPRITE_TEE_EYE_HAPPY, 0, 0, 0); break; case EMOTE_SURPRISE: SelectSprite(SPRITE_TEE_EYE_SURPRISE, 0, 0, 0); break; case EMOTE_ANGRY: SelectSprite(SPRITE_TEE_EYE_ANGRY, 0, 0, 0); break; default: SelectSprite(SPRITE_TEE_EYE_NORMAL, 0, 0, 0); break; } float EyeScale = BaseSize*0.40f; float h = Emote == EMOTE_BLINK ? BaseSize*0.15f : EyeScale; float EyeSeparation = (0.075f - 0.010f*absolute(Direction.x))*BaseSize; vec2 Offset = vec2(Direction.x*0.125f, -0.05f+Direction.y*0.10f)*BaseSize; IGraphics::CQuadItem Array[2] = { IGraphics::CQuadItem(BodyPos.x-EyeSeparation+Offset.x, BodyPos.y+Offset.y, EyeScale, h), IGraphics::CQuadItem(BodyPos.x+EyeSeparation+Offset.x, BodyPos.y+Offset.y, -EyeScale, h)}; Graphics()->QuadsDraw(Array, 2); } } // draw feet CAnimKeyframe *pFoot = f ? pAnim->GetFrontFoot() : pAnim->GetBackFoot(); float w = BaseSize; float h = BaseSize/2; Graphics()->QuadsSetRotation(pFoot->m_Angle*pi*2); bool Indicate = !pInfo->m_GotAirJump && g_Config.m_ClAirjumpindicator; float cs = 1.0f; // color scale if(OutLine) SelectSprite(SPRITE_TEE_FOOT_OUTLINE, 0, 0, 0); else { SelectSprite(SPRITE_TEE_FOOT, 0, 0, 0); if(Indicate) cs = 0.5f; } Graphics()->SetColor(pInfo->m_ColorFeet.r*cs, pInfo->m_ColorFeet.g*cs, pInfo->m_ColorFeet.b*cs, pInfo->m_ColorFeet.a); IGraphics::CQuadItem QuadItem(Position.x+pFoot->m_X*AnimScale, Position.y+pFoot->m_Y*AnimScale, w, h); Graphics()->QuadsDraw(&QuadItem, 1); } } Graphics()->QuadsEnd(); } static void CalcScreenParams(float Amount, float WMax, float HMax, float Aspect, float *w, float *h) { float f = sqrtf(Amount) / sqrtf(Aspect); *w = f*Aspect; *h = f; // limit the view if(*w > WMax) { *w = WMax; *h = *w/Aspect; } if(*h > HMax) { *h = HMax; *w = *h*Aspect; } } void CRenderTools::MapscreenToWorld(float CenterX, float CenterY, float ParallaxX, float ParallaxY, float OffsetX, float OffsetY, float Aspect, float Zoom, float *pPoints) { float Width, Height; CalcScreenParams(1150*1000, 1500, 1050, Aspect, &Width, &Height); CenterX *= ParallaxX; CenterY *= ParallaxY; Width *= Zoom; Height *= Zoom; pPoints[0] = OffsetX+CenterX-Width/2; pPoints[1] = OffsetY+CenterY-Height/2; pPoints[2] = pPoints[0]+Width; pPoints[3] = pPoints[1]+Height; } void CRenderTools::RenderTilemapGenerateSkip(class CLayers *pLayers) { for(int g = 0; g < pLayers->NumGroups(); g++) { CMapItemGroup *pGroup = pLayers->GetGroup(g); for(int l = 0; l < pGroup->m_NumLayers; l++) { CMapItemLayer *pLayer = pLayers->GetLayer(pGroup->m_StartLayer+l); if(pLayer->m_Type == LAYERTYPE_TILES) { CMapItemLayerTilemap *pTmap = (CMapItemLayerTilemap *)pLayer; CTile *pTiles = (CTile *)pLayers->Map()->GetData(pTmap->m_Data); for(int y = 0; y < pTmap->m_Height; y++) { for(int x = 1; x < pTmap->m_Width;) { int sx; for(sx = 1; x+sx < pTmap->m_Width && sx < 255; sx++) { if(pTiles[y*pTmap->m_Width+x+sx].m_Index) break; } pTiles[y*pTmap->m_Width+x].m_Skip = sx-1; x += sx; } } } } } } teeworlds-0.6.2+dfsg/src/game/client/render.h0000644000175000017500000000440612140200333020044 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_RENDER_H #define GAME_CLIENT_RENDER_H #include #include #include "ui.h" class CTeeRenderInfo { public: CTeeRenderInfo() { m_Texture = -1; m_ColorBody = vec4(1,1,1,1); m_ColorFeet = vec4(1,1,1,1); m_Size = 1.0f; m_GotAirJump = 1; }; int m_Texture; vec4 m_ColorBody; vec4 m_ColorFeet; float m_Size; int m_GotAirJump; }; // sprite renderings enum { SPRITE_FLAG_FLIP_Y=1, SPRITE_FLAG_FLIP_X=2, LAYERRENDERFLAG_OPAQUE=1, LAYERRENDERFLAG_TRANSPARENT=2, TILERENDERFLAG_EXTEND=4, }; typedef void (*ENVELOPE_EVAL)(float TimeOffset, int Env, float *pChannels, void *pUser); class CRenderTools { public: class IGraphics *m_pGraphics; class CUI *m_pUI; class IGraphics *Graphics() const { return m_pGraphics; } class CUI *UI() const { return m_pUI; } //typedef struct SPRITE; void SelectSprite(struct CDataSprite *pSprite, int Flags=0, int sx=0, int sy=0); void SelectSprite(int id, int Flags=0, int sx=0, int sy=0); void DrawSprite(float x, float y, float size); // rects void DrawRoundRect(float x, float y, float w, float h, float r); void DrawRoundRectExt(float x, float y, float w, float h, float r, int Corners); void DrawUIRect(const CUIRect *pRect, vec4 Color, int Corners, float Rounding); // larger rendering methods void RenderTilemapGenerateSkip(class CLayers *pLayers); // object render methods (gc_render_obj.cpp) void RenderTee(class CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos); // map render methods (gc_render_map.cpp) static void RenderEvalEnvelope(CEnvPoint *pPoints, int NumPoints, int Channels, float Time, float *pResult); void RenderQuads(CQuad *pQuads, int NumQuads, int Flags, ENVELOPE_EVAL pfnEval, void *pUser); void RenderTilemap(CTile *pTiles, int w, int h, float Scale, vec4 Color, int RenderFlags, ENVELOPE_EVAL pfnEval, void *pUser, int ColorEnv, int ColorEnvOffset); // helpers void MapscreenToWorld(float CenterX, float CenterY, float ParallaxX, float ParallaxY, float OffsetX, float OffsetY, float Aspect, float Zoom, float *pPoints); }; #endif teeworlds-0.6.2+dfsg/src/game/client/render_map.cpp0000644000175000017500000002014612140200333021233 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "render.h" void CRenderTools::RenderEvalEnvelope(CEnvPoint *pPoints, int NumPoints, int Channels, float Time, float *pResult) { if(NumPoints == 0) { pResult[0] = 0; pResult[1] = 0; pResult[2] = 0; pResult[3] = 0; return; } if(NumPoints == 1) { pResult[0] = fx2f(pPoints[0].m_aValues[0]); pResult[1] = fx2f(pPoints[0].m_aValues[1]); pResult[2] = fx2f(pPoints[0].m_aValues[2]); pResult[3] = fx2f(pPoints[0].m_aValues[3]); return; } Time = fmod(Time, pPoints[NumPoints-1].m_Time/1000.0f)*1000.0f; for(int i = 0; i < NumPoints-1; i++) { if(Time >= pPoints[i].m_Time && Time <= pPoints[i+1].m_Time) { float Delta = pPoints[i+1].m_Time-pPoints[i].m_Time; float a = (Time-pPoints[i].m_Time)/Delta; if(pPoints[i].m_Curvetype == CURVETYPE_SMOOTH) a = -2*a*a*a + 3*a*a; // second hermite basis else if(pPoints[i].m_Curvetype == CURVETYPE_SLOW) a = a*a*a; else if(pPoints[i].m_Curvetype == CURVETYPE_FAST) { a = 1-a; a = 1-a*a*a; } else if (pPoints[i].m_Curvetype == CURVETYPE_STEP) a = 0; else { // linear } for(int c = 0; c < Channels; c++) { float v0 = fx2f(pPoints[i].m_aValues[c]); float v1 = fx2f(pPoints[i+1].m_aValues[c]); pResult[c] = v0 + (v1-v0) * a; } return; } } pResult[0] = fx2f(pPoints[NumPoints-1].m_aValues[0]); pResult[1] = fx2f(pPoints[NumPoints-1].m_aValues[1]); pResult[2] = fx2f(pPoints[NumPoints-1].m_aValues[2]); pResult[3] = fx2f(pPoints[NumPoints-1].m_aValues[3]); return; } static void Rotate(CPoint *pCenter, CPoint *pPoint, float Rotation) { int x = pPoint->x - pCenter->x; int y = pPoint->y - pCenter->y; pPoint->x = (int)(x * cosf(Rotation) - y * sinf(Rotation) + pCenter->x); pPoint->y = (int)(x * sinf(Rotation) + y * cosf(Rotation) + pCenter->y); } void CRenderTools::RenderQuads(CQuad *pQuads, int NumQuads, int RenderFlags, ENVELOPE_EVAL pfnEval, void *pUser) { Graphics()->QuadsBegin(); float Conv = 1/255.0f; for(int i = 0; i < NumQuads; i++) { CQuad *q = &pQuads[i]; float r=1, g=1, b=1, a=1; if(q->m_ColorEnv >= 0) { float aChannels[4]; pfnEval(q->m_ColorEnvOffset/1000.0f, q->m_ColorEnv, aChannels, pUser); r = aChannels[0]; g = aChannels[1]; b = aChannels[2]; a = aChannels[3]; } bool Opaque = false; /* TODO: Analyze quadtexture if(a < 0.01f || (q->m_aColors[0].a < 0.01f && q->m_aColors[1].a < 0.01f && q->m_aColors[2].a < 0.01f && q->m_aColors[3].a < 0.01f)) Opaque = true; */ if(Opaque && !(RenderFlags&LAYERRENDERFLAG_OPAQUE)) continue; if(!Opaque && !(RenderFlags&LAYERRENDERFLAG_TRANSPARENT)) continue; Graphics()->QuadsSetSubsetFree( fx2f(q->m_aTexcoords[0].x), fx2f(q->m_aTexcoords[0].y), fx2f(q->m_aTexcoords[1].x), fx2f(q->m_aTexcoords[1].y), fx2f(q->m_aTexcoords[2].x), fx2f(q->m_aTexcoords[2].y), fx2f(q->m_aTexcoords[3].x), fx2f(q->m_aTexcoords[3].y) ); float OffsetX = 0; float OffsetY = 0; float Rot = 0; // TODO: fix this if(q->m_PosEnv >= 0) { float aChannels[4]; pfnEval(q->m_PosEnvOffset/1000.0f, q->m_PosEnv, aChannels, pUser); OffsetX = aChannels[0]; OffsetY = aChannels[1]; Rot = aChannels[2]/360.0f*pi*2; } IGraphics::CColorVertex Array[4] = { IGraphics::CColorVertex(0, q->m_aColors[0].r*Conv*r, q->m_aColors[0].g*Conv*g, q->m_aColors[0].b*Conv*b, q->m_aColors[0].a*Conv*a), IGraphics::CColorVertex(1, q->m_aColors[1].r*Conv*r, q->m_aColors[1].g*Conv*g, q->m_aColors[1].b*Conv*b, q->m_aColors[1].a*Conv*a), IGraphics::CColorVertex(2, q->m_aColors[2].r*Conv*r, q->m_aColors[2].g*Conv*g, q->m_aColors[2].b*Conv*b, q->m_aColors[2].a*Conv*a), IGraphics::CColorVertex(3, q->m_aColors[3].r*Conv*r, q->m_aColors[3].g*Conv*g, q->m_aColors[3].b*Conv*b, q->m_aColors[3].a*Conv*a)}; Graphics()->SetColorVertex(Array, 4); CPoint *pPoints = q->m_aPoints; if(Rot != 0) { static CPoint aRotated[4]; aRotated[0] = q->m_aPoints[0]; aRotated[1] = q->m_aPoints[1]; aRotated[2] = q->m_aPoints[2]; aRotated[3] = q->m_aPoints[3]; pPoints = aRotated; Rotate(&q->m_aPoints[4], &aRotated[0], Rot); Rotate(&q->m_aPoints[4], &aRotated[1], Rot); Rotate(&q->m_aPoints[4], &aRotated[2], Rot); Rotate(&q->m_aPoints[4], &aRotated[3], Rot); } IGraphics::CFreeformItem Freeform( fx2f(pPoints[0].x)+OffsetX, fx2f(pPoints[0].y)+OffsetY, fx2f(pPoints[1].x)+OffsetX, fx2f(pPoints[1].y)+OffsetY, fx2f(pPoints[2].x)+OffsetX, fx2f(pPoints[2].y)+OffsetY, fx2f(pPoints[3].x)+OffsetX, fx2f(pPoints[3].y)+OffsetY); Graphics()->QuadsDrawFreeform(&Freeform, 1); } Graphics()->QuadsEnd(); } void CRenderTools::RenderTilemap(CTile *pTiles, int w, int h, float Scale, vec4 Color, int RenderFlags, ENVELOPE_EVAL pfnEval, void *pUser, int ColorEnv, int ColorEnvOffset) { //Graphics()->TextureSet(img_get(tmap->image)); float ScreenX0, ScreenY0, ScreenX1, ScreenY1; Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); //Graphics()->MapScreen(screen_x0-50, screen_y0-50, screen_x1+50, screen_y1+50); // calculate the final pixelsize for the tiles float TilePixelSize = 1024/32.0f; float FinalTileSize = Scale/(ScreenX1-ScreenX0) * Graphics()->ScreenWidth(); float FinalTilesetScale = FinalTileSize/TilePixelSize; float r=1, g=1, b=1, a=1; if(ColorEnv >= 0) { float aChannels[4]; pfnEval(ColorEnvOffset/1000.0f, ColorEnv, aChannels, pUser); r = aChannels[0]; g = aChannels[1]; b = aChannels[2]; a = aChannels[3]; } Graphics()->QuadsBegin(); Graphics()->SetColor(Color.r*r, Color.g*g, Color.b*b, Color.a*a); int StartY = (int)(ScreenY0/Scale)-1; int StartX = (int)(ScreenX0/Scale)-1; int EndY = (int)(ScreenY1/Scale)+1; int EndX = (int)(ScreenX1/Scale)+1; // adjust the texture shift according to mipmap level float TexSize = 1024.0f; float Frac = (1.25f/TexSize) * (1/FinalTilesetScale); float Nudge = (0.5f/TexSize) * (1/FinalTilesetScale); for(int y = StartY; y < EndY; y++) for(int x = StartX; x < EndX; x++) { int mx = x; int my = y; if(RenderFlags&TILERENDERFLAG_EXTEND) { if(mx<0) mx = 0; if(mx>=w) mx = w-1; if(my<0) my = 0; if(my>=h) my = h-1; } else { if(mx<0) continue; // mx = 0; if(mx>=w) continue; // mx = w-1; if(my<0) continue; // my = 0; if(my>=h) continue; // my = h-1; } int c = mx + my*w; unsigned char Index = pTiles[c].m_Index; if(Index) { unsigned char Flags = pTiles[c].m_Flags; bool Render = false; if(Flags&TILEFLAG_OPAQUE && Color.a*a > 254.0f/255.0f) { if(RenderFlags&LAYERRENDERFLAG_OPAQUE) Render = true; } else { if(RenderFlags&LAYERRENDERFLAG_TRANSPARENT) Render = true; } if(Render) { int tx = Index%16; int ty = Index/16; int Px0 = tx*(1024/16); int Py0 = ty*(1024/16); int Px1 = Px0+(1024/16)-1; int Py1 = Py0+(1024/16)-1; float x0 = Nudge + Px0/TexSize+Frac; float y0 = Nudge + Py0/TexSize+Frac; float x1 = Nudge + Px1/TexSize-Frac; float y1 = Nudge + Py0/TexSize+Frac; float x2 = Nudge + Px1/TexSize-Frac; float y2 = Nudge + Py1/TexSize-Frac; float x3 = Nudge + Px0/TexSize+Frac; float y3 = Nudge + Py1/TexSize-Frac; if(Flags&TILEFLAG_VFLIP) { x0 = x2; x1 = x3; x2 = x3; x3 = x0; } if(Flags&TILEFLAG_HFLIP) { y0 = y3; y2 = y1; y3 = y1; y1 = y0; } if(Flags&TILEFLAG_ROTATE) { float Tmp = x0; x0 = x3; x3 = x2; x2 = x1; x1 = Tmp; Tmp = y0; y0 = y3; y3 = y2; y2 = y1; y1 = Tmp; } Graphics()->QuadsSetSubsetFree(x0, y0, x1, y1, x2, y2, x3, y3); IGraphics::CQuadItem QuadItem(x*Scale, y*Scale, Scale, Scale); Graphics()->QuadsDrawTL(&QuadItem, 1); } } x += pTiles[c].m_Skip; } Graphics()->QuadsEnd(); Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } teeworlds-0.6.2+dfsg/src/game/client/ui.cpp0000644000175000017500000001502712140200333017536 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include "ui.h" /******************************************************** UI *********************************************************/ CUI::CUI() { m_pHotItem = 0; m_pActiveItem = 0; m_pLastActiveItem = 0; m_pBecommingHotItem = 0; m_MouseX = 0; m_MouseY = 0; m_MouseWorldX = 0; m_MouseWorldY = 0; m_MouseButtons = 0; m_LastMouseButtons = 0; m_Screen.x = 0; m_Screen.y = 0; m_Screen.w = 848.0f; m_Screen.h = 480.0f; } int CUI::Update(float Mx, float My, float Mwx, float Mwy, int Buttons) { m_MouseX = Mx; m_MouseY = My; m_MouseWorldX = Mwx; m_MouseWorldY = Mwy; m_LastMouseButtons = m_MouseButtons; m_MouseButtons = Buttons; m_pHotItem = m_pBecommingHotItem; if(m_pActiveItem) m_pHotItem = m_pActiveItem; m_pBecommingHotItem = 0; return 0; } int CUI::MouseInside(const CUIRect *r) { if(m_MouseX >= r->x && m_MouseX <= r->x+r->w && m_MouseY >= r->y && m_MouseY <= r->y+r->h) return 1; return 0; } void CUI::ConvertMouseMove(float *x, float *y) { float Fac = (float)(g_Config.m_UiMousesens)/g_Config.m_InpMousesens; *x = *x*Fac; *y = *y*Fac; } CUIRect *CUI::Screen() { float Aspect = Graphics()->ScreenAspect(); float w, h; h = 600; w = Aspect*h; m_Screen.w = w; m_Screen.h = h; return &m_Screen; } float CUI::PixelSize() { return Screen()->w/Graphics()->ScreenWidth(); } void CUI::SetScale(float s) { g_Config.m_UiScale = (int)(s*100.0f); } float CUI::Scale() { return g_Config.m_UiScale/100.0f; } float CUIRect::Scale() const { return g_Config.m_UiScale/100.0f; } void CUI::ClipEnable(const CUIRect *r) { float XScale = Graphics()->ScreenWidth()/Screen()->w; float YScale = Graphics()->ScreenHeight()/Screen()->h; Graphics()->ClipEnable((int)(r->x*XScale), (int)(r->y*YScale), (int)(r->w*XScale), (int)(r->h*YScale)); } void CUI::ClipDisable() { Graphics()->ClipDisable(); } void CUIRect::HSplitMid(CUIRect *pTop, CUIRect *pBottom) const { CUIRect r = *this; float Cut = r.h/2; if(pTop) { pTop->x = r.x; pTop->y = r.y; pTop->w = r.w; pTop->h = Cut; } if(pBottom) { pBottom->x = r.x; pBottom->y = r.y + Cut; pBottom->w = r.w; pBottom->h = r.h - Cut; } } void CUIRect::HSplitTop(float Cut, CUIRect *pTop, CUIRect *pBottom) const { CUIRect r = *this; Cut *= Scale(); if (pTop) { pTop->x = r.x; pTop->y = r.y; pTop->w = r.w; pTop->h = Cut; } if (pBottom) { pBottom->x = r.x; pBottom->y = r.y + Cut; pBottom->w = r.w; pBottom->h = r.h - Cut; } } void CUIRect::HSplitBottom(float Cut, CUIRect *pTop, CUIRect *pBottom) const { CUIRect r = *this; Cut *= Scale(); if (pTop) { pTop->x = r.x; pTop->y = r.y; pTop->w = r.w; pTop->h = r.h - Cut; } if (pBottom) { pBottom->x = r.x; pBottom->y = r.y + r.h - Cut; pBottom->w = r.w; pBottom->h = Cut; } } void CUIRect::VSplitMid(CUIRect *pLeft, CUIRect *pRight) const { CUIRect r = *this; float Cut = r.w/2; // Cut *= Scale(); if (pLeft) { pLeft->x = r.x; pLeft->y = r.y; pLeft->w = Cut; pLeft->h = r.h; } if (pRight) { pRight->x = r.x + Cut; pRight->y = r.y; pRight->w = r.w - Cut; pRight->h = r.h; } } void CUIRect::VSplitLeft(float Cut, CUIRect *pLeft, CUIRect *pRight) const { CUIRect r = *this; Cut *= Scale(); if (pLeft) { pLeft->x = r.x; pLeft->y = r.y; pLeft->w = Cut; pLeft->h = r.h; } if (pRight) { pRight->x = r.x + Cut; pRight->y = r.y; pRight->w = r.w - Cut; pRight->h = r.h; } } void CUIRect::VSplitRight(float Cut, CUIRect *pLeft, CUIRect *pRight) const { CUIRect r = *this; Cut *= Scale(); if (pLeft) { pLeft->x = r.x; pLeft->y = r.y; pLeft->w = r.w - Cut; pLeft->h = r.h; } if (pRight) { pRight->x = r.x + r.w - Cut; pRight->y = r.y; pRight->w = Cut; pRight->h = r.h; } } void CUIRect::Margin(float Cut, CUIRect *pOtherRect) const { CUIRect r = *this; Cut *= Scale(); pOtherRect->x = r.x + Cut; pOtherRect->y = r.y + Cut; pOtherRect->w = r.w - 2*Cut; pOtherRect->h = r.h - 2*Cut; } void CUIRect::VMargin(float Cut, CUIRect *pOtherRect) const { CUIRect r = *this; Cut *= Scale(); pOtherRect->x = r.x + Cut; pOtherRect->y = r.y; pOtherRect->w = r.w - 2*Cut; pOtherRect->h = r.h; } void CUIRect::HMargin(float Cut, CUIRect *pOtherRect) const { CUIRect r = *this; Cut *= Scale(); pOtherRect->x = r.x; pOtherRect->y = r.y + Cut; pOtherRect->w = r.w; pOtherRect->h = r.h - 2*Cut; } int CUI::DoButtonLogic(const void *pID, const char *pText, int Checked, const CUIRect *pRect) { // logic int ReturnValue = 0; int Inside = MouseInside(pRect); static int ButtonUsed = 0; if(ActiveItem() == pID) { if(!MouseButton(ButtonUsed)) { if(Inside && Checked >= 0) ReturnValue = 1+ButtonUsed; SetActiveItem(0); } } else if(HotItem() == pID) { if(MouseButton(0)) { SetActiveItem(pID); ButtonUsed = 0; } if(MouseButton(1)) { SetActiveItem(pID); ButtonUsed = 1; } } if(Inside) SetHotItem(pID); return ReturnValue; } /* int CUI::DoButton(const void *id, const char *text, int checked, const CUIRect *r, ui_draw_button_func draw_func, const void *extra) { // logic int ret = 0; int inside = ui_MouseInside(r); static int button_used = 0; if(ui_ActiveItem() == id) { if(!ui_MouseButton(button_used)) { if(inside && checked >= 0) ret = 1+button_used; ui_SetActiveItem(0); } } else if(ui_HotItem() == id) { if(ui_MouseButton(0)) { ui_SetActiveItem(id); button_used = 0; } if(ui_MouseButton(1)) { ui_SetActiveItem(id); button_used = 1; } } if(inside) ui_SetHotItem(id); if(draw_func) draw_func(id, text, checked, r, extra); return ret; }*/ void CUI::DoLabel(const CUIRect *r, const char *pText, float Size, int Align, int MaxWidth) { // TODO: FIX ME!!!! //Graphics()->BlendNormal(); if(Align == 0) { float tw = TextRender()->TextWidth(0, Size, pText, MaxWidth); TextRender()->Text(0, r->x + r->w/2-tw/2, r->y - Size/10, Size, pText, MaxWidth); } else if(Align < 0) TextRender()->Text(0, r->x, r->y - Size/10, Size, pText, MaxWidth); else if(Align > 0) { float tw = TextRender()->TextWidth(0, Size, pText, MaxWidth); TextRender()->Text(0, r->x + r->w-tw, r->y - Size/10, Size, pText, MaxWidth); } } void CUI::DoLabelScaled(const CUIRect *r, const char *pText, float Size, int Align, int MaxWidth) { DoLabel(r, pText, Size*Scale(), Align, MaxWidth); }teeworlds-0.6.2+dfsg/src/game/client/ui.h0000644000175000017500000000640212140200333017200 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_CLIENT_UI_H #define GAME_CLIENT_UI_H class CUIRect { // TODO: Refactor: Redo UI scaling float Scale() const; public: float x, y, w, h; void HSplitMid(CUIRect *pTop, CUIRect *pBottom) const; void HSplitTop(float Cut, CUIRect *pTop, CUIRect *pBottom) const; void HSplitBottom(float Cut, CUIRect *pTop, CUIRect *pBottom) const; void VSplitMid(CUIRect *pLeft, CUIRect *pRight) const; void VSplitLeft(float Cut, CUIRect *pLeft, CUIRect *pRight) const; void VSplitRight(float Cut, CUIRect *pLeft, CUIRect *pRight) const; void Margin(float Cut, CUIRect *pOtherRect) const; void VMargin(float Cut, CUIRect *pOtherRect) const; void HMargin(float Cut, CUIRect *pOtherRect) const; }; class CUI { const void *m_pHotItem; const void *m_pActiveItem; const void *m_pLastActiveItem; const void *m_pBecommingHotItem; float m_MouseX, m_MouseY; // in gui space float m_MouseWorldX, m_MouseWorldY; // in world space unsigned m_MouseButtons; unsigned m_LastMouseButtons; CUIRect m_Screen; class IGraphics *m_pGraphics; class ITextRender *m_pTextRender; public: // TODO: Refactor: Fill this in void SetGraphics(class IGraphics *pGraphics, class ITextRender *pTextRender) { m_pGraphics = pGraphics; m_pTextRender = pTextRender;} class IGraphics *Graphics() { return m_pGraphics; } class ITextRender *TextRender() { return m_pTextRender; } CUI(); enum { CORNER_TL=1, CORNER_TR=2, CORNER_BL=4, CORNER_BR=8, CORNER_T=CORNER_TL|CORNER_TR, CORNER_B=CORNER_BL|CORNER_BR, CORNER_R=CORNER_TR|CORNER_BR, CORNER_L=CORNER_TL|CORNER_BL, CORNER_ALL=CORNER_T|CORNER_B }; int Update(float mx, float my, float Mwx, float Mwy, int m_Buttons); float MouseX() const { return m_MouseX; } float MouseY() const { return m_MouseY; } float MouseWorldX() const { return m_MouseWorldX; } float MouseWorldY() const { return m_MouseWorldY; } int MouseButton(int Index) const { return (m_MouseButtons>>Index)&1; } int MouseButtonClicked(int Index) { return MouseButton(Index) && !((m_LastMouseButtons>>Index)&1) ; } void SetHotItem(const void *pID) { m_pBecommingHotItem = pID; } void SetActiveItem(const void *pID) { m_pActiveItem = pID; if (pID) m_pLastActiveItem = pID; } void ClearLastActiveItem() { m_pLastActiveItem = 0; } const void *HotItem() const { return m_pHotItem; } const void *NextHotItem() const { return m_pBecommingHotItem; } const void *ActiveItem() const { return m_pActiveItem; } const void *LastActiveItem() const { return m_pLastActiveItem; } int MouseInside(const CUIRect *pRect); void ConvertMouseMove(float *x, float *y); CUIRect *Screen(); float PixelSize(); void ClipEnable(const CUIRect *pRect); void ClipDisable(); // TODO: Refactor: Redo UI scaling void SetScale(float s); float Scale(); int DoButtonLogic(const void *pID, const char *pText /* TODO: Refactor: Remove */, int Checked, const CUIRect *pRect); // TODO: Refactor: Remove this? void DoLabel(const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1); void DoLabelScaled(const CUIRect *pRect, const char *pText, float Size, int Align, int MaxWidth = -1); }; #endif teeworlds-0.6.2+dfsg/src/game/collision.cpp0000644000175000017500000001004012140200333017624 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include CCollision::CCollision() { m_pTiles = 0; m_Width = 0; m_Height = 0; m_pLayers = 0; } void CCollision::Init(class CLayers *pLayers) { m_pLayers = pLayers; m_Width = m_pLayers->GameLayer()->m_Width; m_Height = m_pLayers->GameLayer()->m_Height; m_pTiles = static_cast(m_pLayers->Map()->GetData(m_pLayers->GameLayer()->m_Data)); for(int i = 0; i < m_Width*m_Height; i++) { int Index = m_pTiles[i].m_Index; if(Index > 128) continue; switch(Index) { case TILE_DEATH: m_pTiles[i].m_Index = COLFLAG_DEATH; break; case TILE_SOLID: m_pTiles[i].m_Index = COLFLAG_SOLID; break; case TILE_NOHOOK: m_pTiles[i].m_Index = COLFLAG_SOLID|COLFLAG_NOHOOK; break; default: m_pTiles[i].m_Index = 0; } } } int CCollision::GetTile(int x, int y) { int Nx = clamp(x/32, 0, m_Width-1); int Ny = clamp(y/32, 0, m_Height-1); return m_pTiles[Ny*m_Width+Nx].m_Index > 128 ? 0 : m_pTiles[Ny*m_Width+Nx].m_Index; } bool CCollision::IsTileSolid(int x, int y) { return GetTile(x, y)&COLFLAG_SOLID; } // TODO: rewrite this smarter! int CCollision::IntersectLine(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision) { float Distance = distance(Pos0, Pos1); int End(Distance+1); vec2 Last = Pos0; for(int i = 0; i < End; i++) { float a = i/Distance; vec2 Pos = mix(Pos0, Pos1, a); if(CheckPoint(Pos.x, Pos.y)) { if(pOutCollision) *pOutCollision = Pos; if(pOutBeforeCollision) *pOutBeforeCollision = Last; return GetCollisionAt(Pos.x, Pos.y); } Last = Pos; } if(pOutCollision) *pOutCollision = Pos1; if(pOutBeforeCollision) *pOutBeforeCollision = Pos1; return 0; } // TODO: OPT: rewrite this smarter! void CCollision::MovePoint(vec2 *pInoutPos, vec2 *pInoutVel, float Elasticity, int *pBounces) { if(pBounces) *pBounces = 0; vec2 Pos = *pInoutPos; vec2 Vel = *pInoutVel; if(CheckPoint(Pos + Vel)) { int Affected = 0; if(CheckPoint(Pos.x + Vel.x, Pos.y)) { pInoutVel->x *= -Elasticity; if(pBounces) (*pBounces)++; Affected++; } if(CheckPoint(Pos.x, Pos.y + Vel.y)) { pInoutVel->y *= -Elasticity; if(pBounces) (*pBounces)++; Affected++; } if(Affected == 0) { pInoutVel->x *= -Elasticity; pInoutVel->y *= -Elasticity; } } else { *pInoutPos = Pos + Vel; } } bool CCollision::TestBox(vec2 Pos, vec2 Size) { Size *= 0.5f; if(CheckPoint(Pos.x-Size.x, Pos.y-Size.y)) return true; if(CheckPoint(Pos.x+Size.x, Pos.y-Size.y)) return true; if(CheckPoint(Pos.x-Size.x, Pos.y+Size.y)) return true; if(CheckPoint(Pos.x+Size.x, Pos.y+Size.y)) return true; return false; } void CCollision::MoveBox(vec2 *pInoutPos, vec2 *pInoutVel, vec2 Size, float Elasticity) { // do the move vec2 Pos = *pInoutPos; vec2 Vel = *pInoutVel; float Distance = length(Vel); int Max = (int)Distance; if(Distance > 0.00001f) { //vec2 old_pos = pos; float Fraction = 1.0f/(float)(Max+1); for(int i = 0; i <= Max; i++) { //float amount = i/(float)max; //if(max == 0) //amount = 0; vec2 NewPos = Pos + Vel*Fraction; // TODO: this row is not nice if(TestBox(vec2(NewPos.x, NewPos.y), Size)) { int Hits = 0; if(TestBox(vec2(Pos.x, NewPos.y), Size)) { NewPos.y = Pos.y; Vel.y *= -Elasticity; Hits++; } if(TestBox(vec2(NewPos.x, Pos.y), Size)) { NewPos.x = Pos.x; Vel.x *= -Elasticity; Hits++; } // neither of the tests got a collision. // this is a real _corner case_! if(Hits == 0) { NewPos.y = Pos.y; Vel.y *= -Elasticity; NewPos.x = Pos.x; Vel.x *= -Elasticity; } } Pos = NewPos; } } *pInoutPos = Pos; *pInoutVel = Vel; } teeworlds-0.6.2+dfsg/src/game/collision.h0000644000175000017500000000220512140200333017275 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_COLLISION_H #define GAME_COLLISION_H #include class CCollision { class CTile *m_pTiles; int m_Width; int m_Height; class CLayers *m_pLayers; bool IsTileSolid(int x, int y); int GetTile(int x, int y); public: enum { COLFLAG_SOLID=1, COLFLAG_DEATH=2, COLFLAG_NOHOOK=4, }; CCollision(); void Init(class CLayers *pLayers); bool CheckPoint(float x, float y) { return IsTileSolid(round(x), round(y)); } bool CheckPoint(vec2 Pos) { return CheckPoint(Pos.x, Pos.y); } int GetCollisionAt(float x, float y) { return GetTile(round(x), round(y)); } int GetWidth() { return m_Width; }; int GetHeight() { return m_Height; }; int IntersectLine(vec2 Pos0, vec2 Pos1, vec2 *pOutCollision, vec2 *pOutBeforeCollision); void MovePoint(vec2 *pInoutPos, vec2 *pInoutVel, float Elasticity, int *pBounces); void MoveBox(vec2 *pInoutPos, vec2 *pInoutVel, vec2 Size, float Elasticity); bool TestBox(vec2 Pos, vec2 Size); }; #endif teeworlds-0.6.2+dfsg/src/game/editor/0000755000175000017500000000000012140200333016420 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/editor/auto_map.cpp0000644000175000017500000001201112140200333020724 0ustar felixfelix#include // sscanf #include #include #include #include "auto_map.h" #include "editor.h" CAutoMapper::CAutoMapper(CEditor *pEditor) { m_pEditor = pEditor; m_FileLoaded = false; } void CAutoMapper::Load(const char* pTileName) { char aPath[256]; str_format(aPath, sizeof(aPath), "editor/%s.rules", pTileName); IOHANDLE RulesFile = m_pEditor->Storage()->OpenFile(aPath, IOFLAG_READ, IStorage::TYPE_ALL); if(!RulesFile) return; CLineReader LineReader; LineReader.Init(RulesFile); CConfiguration *pCurrentConf = 0; CIndexRule *pCurrentIndex = 0; char aBuf[256]; // read each line while(char *pLine = LineReader.Get()) { // skip blank/empty lines as well as comments if(str_length(pLine) > 0 && pLine[0] != '#' && pLine[0] != '\n' && pLine[0] != '\r' && pLine[0] != '\t' && pLine[0] != '\v' && pLine[0] != ' ') { if(pLine[0]== '[') { // new configuration, get the name pLine++; CConfiguration NewConf; int ID = m_lConfigs.add(NewConf); pCurrentConf = &m_lConfigs[ID]; str_copy(pCurrentConf->m_aName, pLine, str_length(pLine)); } else { if(!str_comp_num(pLine, "Index", 5)) { // new index int ID = 0; char aFlip[128] = ""; sscanf(pLine, "Index %d %127s", &ID, aFlip); CIndexRule NewIndexRule; NewIndexRule.m_ID = ID; NewIndexRule.m_Flag = 0; NewIndexRule.m_RandomValue = 0; NewIndexRule.m_BaseTile = false; if(str_length(aFlip) > 0) { if(!str_comp(aFlip, "XFLIP")) NewIndexRule.m_Flag = TILEFLAG_VFLIP; else if(!str_comp(aFlip, "YFLIP")) NewIndexRule.m_Flag = TILEFLAG_HFLIP; } // add the index rule object and make it current int ArrayID = pCurrentConf->m_aIndexRules.add(NewIndexRule); pCurrentIndex = &pCurrentConf->m_aIndexRules[ArrayID]; } else if(!str_comp_num(pLine, "BaseTile", 8) && pCurrentIndex) { pCurrentIndex->m_BaseTile = true; } else if(!str_comp_num(pLine, "Pos", 3) && pCurrentIndex) { int x = 0, y = 0; char aValue[128]; int Value = CPosRule::EMPTY; bool IndexValue = false; sscanf(pLine, "Pos %d %d %127s", &x, &y, aValue); if(!str_comp(aValue, "FULL")) Value = CPosRule::FULL; else if(!str_comp_num(aValue, "INDEX", 5)) { sscanf(pLine, "Pos %*d %*d INDEX %d", &Value); IndexValue = true; } CPosRule NewPosRule = {x, y, Value, IndexValue}; pCurrentIndex->m_aRules.add(NewPosRule); } else if(!str_comp_num(pLine, "Random", 6) && pCurrentIndex) { sscanf(pLine, "Random %d", &pCurrentIndex->m_RandomValue); } } } } io_close(RulesFile); str_format(aBuf, sizeof(aBuf),"loaded %s", aPath); m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor", aBuf); m_FileLoaded = true; } const char* CAutoMapper::GetConfigName(int Index) { if(Index < 0 || Index >= m_lConfigs.size()) return ""; return m_lConfigs[Index].m_aName; } void CAutoMapper::Proceed(CLayerTiles *pLayer, int ConfigID) { if(!m_FileLoaded || pLayer->m_Readonly || ConfigID < 0 || ConfigID >= m_lConfigs.size()) return; CConfiguration *pConf = &m_lConfigs[ConfigID]; if(!pConf->m_aIndexRules.size()) return; int BaseTile = 1; // find base tile if there is one for(int i = 0; i < pConf->m_aIndexRules.size(); ++i) { if(pConf->m_aIndexRules[i].m_BaseTile) { BaseTile = pConf->m_aIndexRules[i].m_ID; break; } } // auto map ! int MaxIndex = pLayer->m_Width*pLayer->m_Height; for(int y = 0; y < pLayer->m_Height; y++) for(int x = 0; x < pLayer->m_Width; x++) { CTile *pTile = &(pLayer->m_pTiles[y*pLayer->m_Width+x]); if(pTile->m_Index == 0) continue; pTile->m_Index = BaseTile; m_pEditor->m_Map.m_Modified = true; if(y == 0 || y == pLayer->m_Height-1 || x == 0 || x == pLayer->m_Width-1) continue; for(int i = 0; i < pConf->m_aIndexRules.size(); ++i) { if(pConf->m_aIndexRules[i].m_BaseTile) continue; bool RespectRules = true; for(int j = 0; j < pConf->m_aIndexRules[i].m_aRules.size() && RespectRules; ++j) { CPosRule *pRule = &pConf->m_aIndexRules[i].m_aRules[j]; int CheckIndex = (y+pRule->m_Y)*pLayer->m_Width+(x+pRule->m_X); if(CheckIndex < 0 || CheckIndex >= MaxIndex) RespectRules = false; else { if(pRule->m_IndexValue) { if(pLayer->m_pTiles[CheckIndex].m_Index != pRule->m_Value) RespectRules = false; } else { if(pLayer->m_pTiles[CheckIndex].m_Index > 0 && pRule->m_Value == CPosRule::EMPTY) RespectRules = false; if(pLayer->m_pTiles[CheckIndex].m_Index == 0 && pRule->m_Value == CPosRule::FULL) RespectRules = false; } } } if(RespectRules && (pConf->m_aIndexRules[i].m_RandomValue <= 1 || (int)((float)rand() / ((float)RAND_MAX + 1) * pConf->m_aIndexRules[i].m_RandomValue) == 1)) { pTile->m_Index = pConf->m_aIndexRules[i].m_ID; pTile->m_Flags = pConf->m_aIndexRules[i].m_Flag; } } } } teeworlds-0.6.2+dfsg/src/game/editor/auto_map.h0000644000175000017500000000146512140200333020404 0ustar felixfelix#ifndef GAME_EDITOR_AUTO_MAP_H #define GAME_EDITOR_AUTO_MAP_H #include class CAutoMapper { struct CPosRule { int m_X; int m_Y; int m_Value; bool m_IndexValue; enum { EMPTY=0, FULL }; }; struct CIndexRule { int m_ID; array m_aRules; int m_Flag; int m_RandomValue; bool m_BaseTile; }; struct CConfiguration { array m_aIndexRules; char m_aName[128]; }; public: CAutoMapper(class CEditor *pEditor); void Load(const char* pTileName); void Proceed(class CLayerTiles *pLayer, int ConfigID); int ConfigNamesNum() { return m_lConfigs.size(); } const char* GetConfigName(int Index); const bool IsLoaded() { return m_FileLoaded; } private: array m_lConfigs; class CEditor *m_pEditor; bool m_FileLoaded; }; #endif teeworlds-0.6.2+dfsg/src/game/editor/editor.cpp0000644000175000017500000034475012140200333020427 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "auto_map.h" #include "editor.h" int CEditor::ms_CheckerTexture; int CEditor::ms_BackgroundTexture; int CEditor::ms_CursorTexture; int CEditor::ms_EntitiesTexture; const void* CEditor::ms_pUiGotContext; enum { BUTTON_CONTEXT=1, }; CEditorImage::~CEditorImage() { m_pEditor->Graphics()->UnloadTexture(m_TexID); if(m_pData) { mem_free(m_pData); m_pData = 0; } } CLayerGroup::CLayerGroup() { m_aName[0] = 0; m_Visible = true; m_SaveToMap = true; m_Collapse = false; m_GameGroup = false; m_OffsetX = 0; m_OffsetY = 0; m_ParallaxX = 100; m_ParallaxY = 100; m_UseClipping = 0; m_ClipX = 0; m_ClipY = 0; m_ClipW = 0; m_ClipH = 0; } CLayerGroup::~CLayerGroup() { Clear(); } void CLayerGroup::Convert(CUIRect *pRect) { pRect->x += m_OffsetX; pRect->y += m_OffsetY; } void CLayerGroup::Mapping(float *pPoints) { m_pMap->m_pEditor->RenderTools()->MapscreenToWorld( m_pMap->m_pEditor->m_WorldOffsetX, m_pMap->m_pEditor->m_WorldOffsetY, m_ParallaxX/100.0f, m_ParallaxY/100.0f, m_OffsetX, m_OffsetY, m_pMap->m_pEditor->Graphics()->ScreenAspect(), m_pMap->m_pEditor->m_WorldZoom, pPoints); pPoints[0] += m_pMap->m_pEditor->m_EditorOffsetX; pPoints[1] += m_pMap->m_pEditor->m_EditorOffsetY; pPoints[2] += m_pMap->m_pEditor->m_EditorOffsetX; pPoints[3] += m_pMap->m_pEditor->m_EditorOffsetY; } void CLayerGroup::MapScreen() { float aPoints[4]; Mapping(aPoints); m_pMap->m_pEditor->Graphics()->MapScreen(aPoints[0], aPoints[1], aPoints[2], aPoints[3]); } void CLayerGroup::Render() { MapScreen(); IGraphics *pGraphics = m_pMap->m_pEditor->Graphics(); if(m_UseClipping) { float aPoints[4]; m_pMap->m_pGameGroup->Mapping(aPoints); float x0 = (m_ClipX - aPoints[0]) / (aPoints[2]-aPoints[0]); float y0 = (m_ClipY - aPoints[1]) / (aPoints[3]-aPoints[1]); float x1 = ((m_ClipX+m_ClipW) - aPoints[0]) / (aPoints[2]-aPoints[0]); float y1 = ((m_ClipY+m_ClipH) - aPoints[1]) / (aPoints[3]-aPoints[1]); pGraphics->ClipEnable((int)(x0*pGraphics->ScreenWidth()), (int)(y0*pGraphics->ScreenHeight()), (int)((x1-x0)*pGraphics->ScreenWidth()), (int)((y1-y0)*pGraphics->ScreenHeight())); } for(int i = 0; i < m_lLayers.size(); i++) { if(m_lLayers[i]->m_Visible && m_lLayers[i] != m_pMap->m_pGameLayer) { if(m_pMap->m_pEditor->m_ShowDetail || !(m_lLayers[i]->m_Flags&LAYERFLAG_DETAIL)) m_lLayers[i]->Render(); } } pGraphics->ClipDisable(); } void CLayerGroup::AddLayer(CLayer *l) { m_pMap->m_Modified = true; m_lLayers.add(l); } void CLayerGroup::DeleteLayer(int Index) { if(Index < 0 || Index >= m_lLayers.size()) return; delete m_lLayers[Index]; m_lLayers.remove_index(Index); m_pMap->m_Modified = true; } void CLayerGroup::GetSize(float *w, float *h) { *w = 0; *h = 0; for(int i = 0; i < m_lLayers.size(); i++) { float lw, lh; m_lLayers[i]->GetSize(&lw, &lh); *w = max(*w, lw); *h = max(*h, lh); } } int CLayerGroup::SwapLayers(int Index0, int Index1) { if(Index0 < 0 || Index0 >= m_lLayers.size()) return Index0; if(Index1 < 0 || Index1 >= m_lLayers.size()) return Index0; if(Index0 == Index1) return Index0; m_pMap->m_Modified = true; swap(m_lLayers[Index0], m_lLayers[Index1]); return Index1; } void CEditorImage::AnalyseTileFlags() { mem_zero(m_aTileFlags, sizeof(m_aTileFlags)); int tw = m_Width/16; // tilesizes int th = m_Height/16; if ( tw == th ) { unsigned char *pPixelData = (unsigned char *)m_pData; int TileID = 0; for(int ty = 0; ty < 16; ty++) for(int tx = 0; tx < 16; tx++, TileID++) { bool Opaque = true; for(int x = 0; x < tw; x++) for(int y = 0; y < th; y++) { int p = (ty*tw+y)*m_Width + tx*tw+x; if(pPixelData[p*4+3] < 250) { Opaque = false; break; } } if(Opaque) m_aTileFlags[TileID] |= TILEFLAG_OPAQUE; } } } void CEditor::EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pUser) { CEditor *pThis = (CEditor *)pUser; if(Env < 0 || Env >= pThis->m_Map.m_lEnvelopes.size()) { pChannels[0] = 0; pChannels[1] = 0; pChannels[2] = 0; pChannels[3] = 0; return; } CEnvelope *e = pThis->m_Map.m_lEnvelopes[Env]; float t = pThis->m_AnimateTime+TimeOffset; t *= pThis->m_AnimateSpeed; e->Eval(t, pChannels); } /******************************************************** OTHER *********************************************************/ // copied from gc_menu.cpp, should be more generalized //extern int ui_do_edit_box(void *id, const CUIRect *rect, char *str, int str_size, float font_size, bool hidden=false); int CEditor::DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden, int Corners) { int Inside = UI()->MouseInside(pRect); bool ReturnValue = false; bool UpdateOffset = false; static int s_AtIndex = 0; static bool s_DoScroll = false; static float s_ScrollStart = 0.0f; FontSize *= UI()->Scale(); if(UI()->LastActiveItem() == pID) { m_EditBoxActive = 2; int Len = str_length(pStr); if(Len == 0) s_AtIndex = 0; if(Inside && UI()->MouseButton(0)) { s_DoScroll = true; s_ScrollStart = UI()->MouseX(); int MxRel = (int)(UI()->MouseX() - pRect->x); for(int i = 1; i <= Len; i++) { if(TextRender()->TextWidth(0, FontSize, pStr, i) - *Offset > MxRel) { s_AtIndex = i - 1; break; } if(i == Len) s_AtIndex = Len; } } else if(!UI()->MouseButton(0)) s_DoScroll = false; else if(s_DoScroll) { // do scrolling if(UI()->MouseX() < pRect->x && s_ScrollStart-UI()->MouseX() > 10.0f) { s_AtIndex = max(0, s_AtIndex-1); s_ScrollStart = UI()->MouseX(); UpdateOffset = true; } else if(UI()->MouseX() > pRect->x+pRect->w && UI()->MouseX()-s_ScrollStart > 10.0f) { s_AtIndex = min(Len, s_AtIndex+1); s_ScrollStart = UI()->MouseX(); UpdateOffset = true; } } for(int i = 0; i < Input()->NumEvents(); i++) { Len = str_length(pStr); int NumChars = Len; ReturnValue |= CLineInput::Manipulate(Input()->GetEvent(i), pStr, StrSize, StrSize, &Len, &s_AtIndex, &NumChars); } } bool JustGotActive = false; if(UI()->ActiveItem() == pID) { if(!UI()->MouseButton(0)) { s_AtIndex = min(s_AtIndex, str_length(pStr)); s_DoScroll = false; UI()->SetActiveItem(0); } } else if(UI()->HotItem() == pID) { if(UI()->MouseButton(0)) { if (UI()->LastActiveItem() != pID) JustGotActive = true; UI()->SetActiveItem(pID); } } if(Inside) UI()->SetHotItem(pID); CUIRect Textbox = *pRect; RenderTools()->DrawUIRect(&Textbox, vec4(1, 1, 1, 0.5f), Corners, 3.0f); Textbox.VMargin(2.0f, &Textbox); const char *pDisplayStr = pStr; char aStars[128]; if(Hidden) { unsigned s = str_length(pStr); if(s >= sizeof(aStars)) s = sizeof(aStars)-1; for(unsigned int i = 0; i < s; ++i) aStars[i] = '*'; aStars[s] = 0; pDisplayStr = aStars; } // check if the text has to be moved if(UI()->LastActiveItem() == pID && !JustGotActive && (UpdateOffset || Input()->NumEvents())) { float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex); if(w-*Offset > Textbox.w) { // move to the left float wt = TextRender()->TextWidth(0, FontSize, pDisplayStr, -1); do { *Offset += min(wt-*Offset-Textbox.w, Textbox.w/3); } while(w-*Offset > Textbox.w); } else if(w-*Offset < 0.0f) { // move to the right do { *Offset = max(0.0f, *Offset-Textbox.w/3); } while(w-*Offset < 0.0f); } } UI()->ClipEnable(pRect); Textbox.x -= *Offset; UI()->DoLabel(&Textbox, pDisplayStr, FontSize, -1); // render the cursor if(UI()->LastActiveItem() == pID && !JustGotActive) { float w = TextRender()->TextWidth(0, FontSize, pDisplayStr, s_AtIndex); Textbox = *pRect; Textbox.VSplitLeft(2.0f, 0, &Textbox); Textbox.x += (w-*Offset-TextRender()->TextWidth(0, FontSize, "|", -1)/2); if((2*time_get()/time_freq()) % 2) // make it blink UI()->DoLabel(&Textbox, "|", FontSize, -1); } UI()->ClipDisable(); return ReturnValue; } vec4 CEditor::ButtonColorMul(const void *pID) { if(UI()->ActiveItem() == pID) return vec4(1,1,1,0.5f); else if(UI()->HotItem() == pID) return vec4(1,1,1,1.5f); return vec4(1,1,1,1); } float CEditor::UiDoScrollbarV(const void *pID, const CUIRect *pRect, float Current) { CUIRect Handle; static float s_OffsetY; pRect->HSplitTop(33, &Handle, 0); Handle.y += (pRect->h-Handle.h)*Current; // logic float Ret = Current; int Inside = UI()->MouseInside(&Handle); if(UI()->ActiveItem() == pID) { if(!UI()->MouseButton(0)) UI()->SetActiveItem(0); float Min = pRect->y; float Max = pRect->h-Handle.h; float Cur = UI()->MouseY()-s_OffsetY; Ret = (Cur-Min)/Max; if(Ret < 0.0f) Ret = 0.0f; if(Ret > 1.0f) Ret = 1.0f; } else if(UI()->HotItem() == pID) { if(UI()->MouseButton(0)) { UI()->SetActiveItem(pID); s_OffsetY = UI()->MouseY()-Handle.y; } } if(Inside) UI()->SetHotItem(pID); // render CUIRect Rail; pRect->VMargin(5.0f, &Rail); RenderTools()->DrawUIRect(&Rail, vec4(1,1,1,0.25f), 0, 0.0f); CUIRect Slider = Handle; Slider.w = Rail.x-Slider.x; RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f), CUI::CORNER_L, 2.5f); Slider.x = Rail.x+Rail.w; RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f), CUI::CORNER_R, 2.5f); Slider = Handle; Slider.Margin(5.0f, &Slider); RenderTools()->DrawUIRect(&Slider, vec4(1,1,1,0.25f)*ButtonColorMul(pID), CUI::CORNER_ALL, 2.5f); return Ret; } vec4 CEditor::GetButtonColor(const void *pID, int Checked) { if(Checked < 0) return vec4(0,0,0,0.5f); if(Checked > 0) { if(UI()->HotItem() == pID) return vec4(1,0,0,0.75f); return vec4(1,0,0,0.5f); } if(UI()->HotItem() == pID) return vec4(1,1,1,0.75f); return vec4(1,1,1,0.5f); } int CEditor::DoButton_Editor_Common(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { if(UI()->MouseInside(pRect)) { if(Flags&BUTTON_CONTEXT) ms_pUiGotContext = pID; if(m_pTooltip) m_pTooltip = pToolTip; } if(UI()->HotItem() == pID && pToolTip) m_pTooltip = (const char *)pToolTip; return UI()->DoButtonLogic(pID, pText, Checked, pRect); // Draw here //return UI()->DoButton(id, text, checked, r, draw_func, 0); } int CEditor::DoButton_Editor(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, Checked), CUI::CORNER_ALL, 3.0f); CUIRect NewRect = *pRect; NewRect.y += NewRect.h/2.0f-7.0f; float tw = min(TextRender()->TextWidth(0, 10.0f, pText, -1), NewRect.w); CTextCursor Cursor; TextRender()->SetCursor(&Cursor, NewRect.x + NewRect.w/2-tw/2, NewRect.y - 1.0f, 10.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = NewRect.w; TextRender()->TextEx(&Cursor, pText, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } int CEditor::DoButton_File(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { if(Checked) RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, Checked), CUI::CORNER_ALL, 3.0f); CUIRect t = *pRect; t.VMargin(5.0f, &t); UI()->DoLabel(&t, pText, 10, -1, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } int CEditor::DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { CUIRect r = *pRect; RenderTools()->DrawUIRect(&r, vec4(0.5f, 0.5f, 0.5f, 1.0f), CUI::CORNER_T, 3.0f); r = *pRect; r.VMargin(5.0f, &r); UI()->DoLabel(&r, pText, 10, -1, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } int CEditor::DoButton_MenuItem(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { if(UI()->HotItem() == pID || Checked) RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, Checked), CUI::CORNER_ALL, 3.0f); CUIRect t = *pRect; t.VMargin(5.0f, &t); CTextCursor Cursor; TextRender()->SetCursor(&Cursor, t.x, t.y - 1.0f, 10.0f, TEXTFLAG_RENDER|TEXTFLAG_STOP_AT_END); Cursor.m_LineWidth = t.w; TextRender()->TextEx(&Cursor, pText, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } int CEditor::DoButton_Tab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, Checked), CUI::CORNER_T, 5.0f); CUIRect NewRect = *pRect; NewRect.y += NewRect.h/2.0f-7.0f; UI()->DoLabel(&NewRect, pText, 10, 0, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } int CEditor::DoButton_Ex(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip, int Corners, float FontSize) { RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, Checked), Corners, 3.0f); CUIRect NewRect = *pRect; NewRect.HMargin(NewRect.h/2.0f-FontSize/2.0f-1.0f, &NewRect); UI()->DoLabel(&NewRect, pText, FontSize, 0, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } int CEditor::DoButton_ButtonInc(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, Checked), CUI::CORNER_R, 3.0f); UI()->DoLabel(pRect, pText?pText:"+", 10, 0, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } int CEditor::DoButton_ButtonDec(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip) { RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, Checked), CUI::CORNER_L, 3.0f); UI()->DoLabel(pRect, pText?pText:"-", 10, 0, -1); return DoButton_Editor_Common(pID, pText, Checked, pRect, Flags, pToolTip); } void CEditor::RenderGrid(CLayerGroup *pGroup) { if(!m_GridActive) return; float aGroupPoints[4]; pGroup->Mapping(aGroupPoints); float w = UI()->Screen()->w; float h = UI()->Screen()->h; int LineDistance = GetLineDistance(); int XOffset = aGroupPoints[0]/LineDistance; int YOffset = aGroupPoints[1]/LineDistance; int XGridOffset = XOffset % m_GridFactor; int YGridOffset = YOffset % m_GridFactor; Graphics()->TextureSet(-1); Graphics()->LinesBegin(); for(int i = 0; i < (int)w; i++) { if((i+YGridOffset) % m_GridFactor == 0) Graphics()->SetColor(1.0f, 0.3f, 0.3f, 0.3f); else Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.15f); IGraphics::CLineItem Line = IGraphics::CLineItem(LineDistance*XOffset, LineDistance*i+LineDistance*YOffset, w+aGroupPoints[2], LineDistance*i+LineDistance*YOffset); Graphics()->LinesDraw(&Line, 1); if((i+XGridOffset) % m_GridFactor == 0) Graphics()->SetColor(1.0f, 0.3f, 0.3f, 0.3f); else Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.15f); Line = IGraphics::CLineItem(LineDistance*i+LineDistance*XOffset, LineDistance*YOffset, LineDistance*i+LineDistance*XOffset, h+aGroupPoints[3]); Graphics()->LinesDraw(&Line, 1); } Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); Graphics()->LinesEnd(); } void CEditor::RenderBackground(CUIRect View, int Texture, float Size, float Brightness) { Graphics()->TextureSet(Texture); Graphics()->BlendNormal(); Graphics()->QuadsBegin(); Graphics()->SetColor(Brightness, Brightness, Brightness, 1.0f); Graphics()->QuadsSetSubset(0,0, View.w/Size, View.h/Size); IGraphics::CQuadItem QuadItem(View.x, View.y, View.w, View.h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } int CEditor::UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip) { // logic static float s_Value; int Inside = UI()->MouseInside(pRect); if(UI()->ActiveItem() == pID) { if(!UI()->MouseButton(0)) { m_LockMouse = false; UI()->SetActiveItem(0); } else { if(Input()->KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) s_Value += m_MouseDeltaX*0.05f; else s_Value += m_MouseDeltaX; if(absolute(s_Value) > Scale) { int Count = (int)(s_Value/Scale); s_Value = fmod(s_Value, Scale); Current += Step*Count; if(Current < Min) Current = Min; if(Current > Max) Current = Max; } } if(pToolTip) m_pTooltip = pToolTip; } else if(UI()->HotItem() == pID) { if(UI()->MouseButton(0)) { m_LockMouse = true; s_Value = 0; UI()->SetActiveItem(pID); } if(pToolTip) m_pTooltip = pToolTip; } if(Inside) UI()->SetHotItem(pID); // render char aBuf[128]; str_format(aBuf, sizeof(aBuf),"%s %d", pLabel, Current); RenderTools()->DrawUIRect(pRect, GetButtonColor(pID, 0), CUI::CORNER_ALL, 5.0f); pRect->y += pRect->h/2.0f-7.0f; UI()->DoLabel(pRect, aBuf, 10, 0, -1); return Current; } CLayerGroup *CEditor::GetSelectedGroup() { if(m_SelectedGroup >= 0 && m_SelectedGroup < m_Map.m_lGroups.size()) return m_Map.m_lGroups[m_SelectedGroup]; return 0x0; } CLayer *CEditor::GetSelectedLayer(int Index) { CLayerGroup *pGroup = GetSelectedGroup(); if(!pGroup) return 0x0; if(m_SelectedLayer >= 0 && m_SelectedLayer < m_Map.m_lGroups[m_SelectedGroup]->m_lLayers.size()) return pGroup->m_lLayers[m_SelectedLayer]; return 0x0; } CLayer *CEditor::GetSelectedLayerType(int Index, int Type) { CLayer *p = GetSelectedLayer(Index); if(p && p->m_Type == Type) return p; return 0x0; } CQuad *CEditor::GetSelectedQuad() { CLayerQuads *ql = (CLayerQuads *)GetSelectedLayerType(0, LAYERTYPE_QUADS); if(!ql) return 0; if(m_SelectedQuad >= 0 && m_SelectedQuad < ql->m_lQuads.size()) return &ql->m_lQuads[m_SelectedQuad]; return 0; } void CEditor::CallbackOpenMap(const char *pFileName, int StorageType, void *pUser) { CEditor *pEditor = (CEditor*)pUser; if(pEditor->Load(pFileName, StorageType)) { str_copy(pEditor->m_aFileName, pFileName, 512); pEditor->m_ValidSaveFilename = StorageType == IStorage::TYPE_SAVE && pEditor->m_pFileDialogPath == pEditor->m_aFileDialogCurrentFolder; pEditor->SortImages(); pEditor->m_Dialog = DIALOG_NONE; pEditor->m_Map.m_Modified = false; } } void CEditor::CallbackAppendMap(const char *pFileName, int StorageType, void *pUser) { CEditor *pEditor = (CEditor*)pUser; if(pEditor->Append(pFileName, StorageType)) pEditor->m_aFileName[0] = 0; else pEditor->SortImages(); pEditor->m_Dialog = DIALOG_NONE; } void CEditor::CallbackSaveMap(const char *pFileName, int StorageType, void *pUser) { CEditor *pEditor = static_cast(pUser); char aBuf[1024]; const int Length = str_length(pFileName); // add map extension if(Length <= 4 || pFileName[Length-4] != '.' || str_comp_nocase(pFileName+Length-3, "map")) { str_format(aBuf, sizeof(aBuf), "%s.map", pFileName); pFileName = aBuf; } if(pEditor->Save(pFileName)) { str_copy(pEditor->m_aFileName, pFileName, sizeof(pEditor->m_aFileName)); pEditor->m_ValidSaveFilename = StorageType == IStorage::TYPE_SAVE && pEditor->m_pFileDialogPath == pEditor->m_aFileDialogCurrentFolder; pEditor->m_Map.m_Modified = false; } pEditor->m_Dialog = DIALOG_NONE; } void CEditor::DoToolbar(CUIRect ToolBar) { CUIRect TB_Top, TB_Bottom; CUIRect Button; ToolBar.HSplitTop(ToolBar.h/2.0f, &TB_Top, &TB_Bottom); TB_Top.HSplitBottom(2.5f, &TB_Top, 0); TB_Bottom.HSplitTop(2.5f, 0, &TB_Bottom); // ctrl+o to open if(Input()->KeyDown('o') && (Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)) && m_Dialog == DIALOG_NONE) { if(HasUnsavedData()) { if(!m_PopupEventWasActivated) { m_PopupEventType = POPEVENT_LOAD; m_PopupEventActivated = true; } } else InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Load map", "Load", "maps", "", CallbackOpenMap, this); } // ctrl+s to save if(Input()->KeyDown('s') && (Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)) && m_Dialog == DIALOG_NONE) { if(m_aFileName[0] && m_ValidSaveFilename) { if(!m_PopupEventWasActivated) { str_copy(m_aFileSaveName, m_aFileName, sizeof(m_aFileSaveName)); m_PopupEventType = POPEVENT_SAVE; m_PopupEventActivated = true; } } else InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save", "maps", "", CallbackSaveMap, this); } // detail button TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_HqButton = 0; if(DoButton_Editor(&s_HqButton, "HD", m_ShowDetail, &Button, 0, "[ctrl+h] Toggle High Detail") || (Input()->KeyDown('h') && (Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)))) { m_ShowDetail = !m_ShowDetail; } TB_Top.VSplitLeft(5.0f, 0, &TB_Top); // animation button TB_Top.VSplitLeft(40.0f, &Button, &TB_Top); static int s_AnimateButton = 0; if(DoButton_Editor(&s_AnimateButton, "Anim", m_Animate, &Button, 0, "[ctrl+m] Toggle animation") || (Input()->KeyDown('m') && (Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)))) { m_AnimateStart = time_get(); m_Animate = !m_Animate; } TB_Top.VSplitLeft(5.0f, 0, &TB_Top); // proof button TB_Top.VSplitLeft(40.0f, &Button, &TB_Top); static int s_ProofButton = 0; if(DoButton_Editor(&s_ProofButton, "Proof", m_ProofBorders, &Button, 0, "[ctrl+p] Toggles proof borders. These borders represent what a player maximum can see.") || (Input()->KeyDown('p') && (Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)))) { m_ProofBorders = !m_ProofBorders; } TB_Top.VSplitLeft(5.0f, 0, &TB_Top); // tile info button TB_Top.VSplitLeft(40.0f, &Button, &TB_Top); static int s_TileInfoButton = 0; if(DoButton_Editor(&s_TileInfoButton, "Info", m_ShowTileInfo, &Button, 0, "[ctrl+i] Show tile informations") || (Input()->KeyDown('i') && (Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)))) { m_ShowTileInfo = !m_ShowTileInfo; m_ShowEnvelopePreview = 0; } TB_Top.VSplitLeft(15.0f, 0, &TB_Top); // zoom group TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_ZoomOutButton = 0; if(DoButton_Ex(&s_ZoomOutButton, "ZO", 0, &Button, 0, "[NumPad-] Zoom out", CUI::CORNER_L)) m_ZoomLevel += 50; TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_ZoomNormalButton = 0; if(DoButton_Ex(&s_ZoomNormalButton, "1:1", 0, &Button, 0, "[NumPad*] Zoom to normal and remove editor offset", 0)) { m_EditorOffsetX = 0; m_EditorOffsetY = 0; m_ZoomLevel = 100; } TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_ZoomInButton = 0; if(DoButton_Ex(&s_ZoomInButton, "ZI", 0, &Button, 0, "[NumPad+] Zoom in", CUI::CORNER_R)) m_ZoomLevel -= 50; TB_Top.VSplitLeft(10.0f, 0, &TB_Top); // animation speed TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_AnimFasterButton = 0; if(DoButton_Ex(&s_AnimFasterButton, "A+", 0, &Button, 0, "Increase animation speed", CUI::CORNER_L)) m_AnimateSpeed += 0.5f; TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_AnimNormalButton = 0; if(DoButton_Ex(&s_AnimNormalButton, "1", 0, &Button, 0, "Normal animation speed", 0)) m_AnimateSpeed = 1.0f; TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_AnimSlowerButton = 0; if(DoButton_Ex(&s_AnimSlowerButton, "A-", 0, &Button, 0, "Decrease animation speed", CUI::CORNER_R)) { if(m_AnimateSpeed > 0.5f) m_AnimateSpeed -= 0.5f; } TB_Top.VSplitLeft(10.0f, &Button, &TB_Top); // brush manipulation { int Enabled = m_Brush.IsEmpty()?-1:0; // flip buttons TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_FlipXButton = 0; if(DoButton_Ex(&s_FlipXButton, "X/X", Enabled, &Button, 0, "[N] Flip brush horizontal", CUI::CORNER_L) || Input()->KeyDown('n')) { for(int i = 0; i < m_Brush.m_lLayers.size(); i++) m_Brush.m_lLayers[i]->BrushFlipX(); } TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_FlipyButton = 0; if(DoButton_Ex(&s_FlipyButton, "Y/Y", Enabled, &Button, 0, "[M] Flip brush vertical", CUI::CORNER_R) || Input()->KeyDown('m')) { for(int i = 0; i < m_Brush.m_lLayers.size(); i++) m_Brush.m_lLayers[i]->BrushFlipY(); } // rotate buttons TB_Top.VSplitLeft(15.0f, &Button, &TB_Top); TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_RotationAmount = 90; bool TileLayer = false; // check for tile layers in brush selection for(int i = 0; i < m_Brush.m_lLayers.size(); i++) if(m_Brush.m_lLayers[i]->m_Type == LAYERTYPE_TILES) { TileLayer = true; s_RotationAmount = max(90, (s_RotationAmount/90)*90); break; } s_RotationAmount = UiDoValueSelector(&s_RotationAmount, &Button, "", s_RotationAmount, TileLayer?90:1, 359, TileLayer?90:1, TileLayer?10.0f:2.0f, "Rotation of the brush in degrees. Use left mouse button to drag and change the value. Hold shift to be more precise."); TB_Top.VSplitLeft(5.0f, &Button, &TB_Top); TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_CcwButton = 0; if(DoButton_Ex(&s_CcwButton, "CCW", Enabled, &Button, 0, "[R] Rotates the brush counter clockwise", CUI::CORNER_L) || Input()->KeyDown('r')) { for(int i = 0; i < m_Brush.m_lLayers.size(); i++) m_Brush.m_lLayers[i]->BrushRotate(-s_RotationAmount/360.0f*pi*2); } TB_Top.VSplitLeft(30.0f, &Button, &TB_Top); static int s_CwButton = 0; if(DoButton_Ex(&s_CwButton, "CW", Enabled, &Button, 0, "[T] Rotates the brush clockwise", CUI::CORNER_R) || Input()->KeyDown('t')) { for(int i = 0; i < m_Brush.m_lLayers.size(); i++) m_Brush.m_lLayers[i]->BrushRotate(s_RotationAmount/360.0f*pi*2); } } // quad manipulation { // do add button TB_Top.VSplitLeft(10.0f, &Button, &TB_Top); TB_Top.VSplitLeft(60.0f, &Button, &TB_Top); static int s_NewButton = 0; CLayerQuads *pQLayer = (CLayerQuads *)GetSelectedLayerType(0, LAYERTYPE_QUADS); //CLayerTiles *tlayer = (CLayerTiles *)get_selected_layer_type(0, LAYERTYPE_TILES); if(DoButton_Editor(&s_NewButton, "Add Quad", pQLayer?0:-1, &Button, 0, "Adds a new quad")) { if(pQLayer) { float Mapping[4]; CLayerGroup *g = GetSelectedGroup(); g->Mapping(Mapping); int AddX = f2fx(Mapping[0] + (Mapping[2]-Mapping[0])/2); int AddY = f2fx(Mapping[1] + (Mapping[3]-Mapping[1])/2); CQuad *q = pQLayer->NewQuad(); for(int i = 0; i < 5; i++) { q->m_aPoints[i].x += AddX; q->m_aPoints[i].y += AddY; } } } } // tile manipulation { TB_Bottom.VSplitLeft(40.0f, &Button, &TB_Bottom); static int s_BorderBut = 0; CLayerTiles *pT = (CLayerTiles *)GetSelectedLayerType(0, LAYERTYPE_TILES); if(DoButton_Editor(&s_BorderBut, "Border", pT?0:-1, &Button, 0, "Adds border tiles")) { if(pT) DoMapBorder(); } } TB_Bottom.VSplitLeft(5.0f, 0, &TB_Bottom); // refocus button TB_Bottom.VSplitLeft(50.0f, &Button, &TB_Bottom); static int s_RefocusButton = 0; if(DoButton_Editor(&s_RefocusButton, "Refocus", m_WorldOffsetX&&m_WorldOffsetY?0:-1, &Button, 0, "[HOME] Restore map focus") || (m_EditBoxActive == 0 && Input()->KeyDown(KEY_HOME))) { m_WorldOffsetX = 0; m_WorldOffsetY = 0; } TB_Bottom.VSplitLeft(5.0f, 0, &TB_Bottom); // grid button TB_Bottom.VSplitLeft(50.0f, &Button, &TB_Bottom); static int s_GridButton = 0; if(DoButton_Editor(&s_GridButton, "Grid", m_GridActive, &Button, 0, "Toggle Grid")) { m_GridActive = !m_GridActive; } TB_Bottom.VSplitLeft(30.0f, 0, &TB_Bottom); // grid zoom TB_Bottom.VSplitLeft(30.0f, &Button, &TB_Bottom); static int s_GridIncreaseButton = 0; if(DoButton_Ex(&s_GridIncreaseButton, "G-", 0, &Button, 0, "Decrease grid", CUI::CORNER_L)) { if(m_GridFactor > 1) m_GridFactor--; } TB_Bottom.VSplitLeft(30.0f, &Button, &TB_Bottom); static int s_GridNormalButton = 0; if(DoButton_Ex(&s_GridNormalButton, "1", 0, &Button, 0, "Normal grid", 0)) m_GridFactor = 1; TB_Bottom.VSplitLeft(30.0f, &Button, &TB_Bottom); static int s_GridDecreaseButton = 0; if(DoButton_Ex(&s_GridDecreaseButton, "G+", 0, &Button, 0, "Increase grid", CUI::CORNER_R)) { if(m_GridFactor < 15) m_GridFactor++; } } static void Rotate(const CPoint *pCenter, CPoint *pPoint, float Rotation) { int x = pPoint->x - pCenter->x; int y = pPoint->y - pCenter->y; pPoint->x = (int)(x * cosf(Rotation) - y * sinf(Rotation) + pCenter->x); pPoint->y = (int)(x * sinf(Rotation) + y * cosf(Rotation) + pCenter->y); } void CEditor::DoQuad(CQuad *q, int Index) { enum { OP_NONE=0, OP_MOVE_ALL, OP_MOVE_PIVOT, OP_ROTATE, OP_CONTEXT_MENU, }; // some basic values void *pID = &q->m_aPoints[4]; // use pivot addr as id static CPoint s_RotatePoints[4]; static float s_LastWx; static float s_LastWy; static int s_Operation = OP_NONE; static float s_RotateAngle = 0; float wx = UI()->MouseWorldX(); float wy = UI()->MouseWorldY(); // get pivot float CenterX = fx2f(q->m_aPoints[4].x); float CenterY = fx2f(q->m_aPoints[4].y); float dx = (CenterX - wx)/m_WorldZoom; float dy = (CenterY - wy)/m_WorldZoom; if(dx*dx+dy*dy < 50) UI()->SetHotItem(pID); bool IgnoreGrid; if(Input()->KeyPressed(KEY_LALT) || Input()->KeyPressed(KEY_RALT)) IgnoreGrid = true; else IgnoreGrid = false; // draw selection background if(m_SelectedQuad == Index) { Graphics()->SetColor(0,0,0,1); IGraphics::CQuadItem QuadItem(CenterX, CenterY, 7.0f, 7.0f); Graphics()->QuadsDraw(&QuadItem, 1); } if(UI()->ActiveItem() == pID) { if(m_MouseDeltaWx*m_MouseDeltaWx+m_MouseDeltaWy*m_MouseDeltaWy > 0.5f) { // check if we only should move pivot if(s_Operation == OP_MOVE_PIVOT) { if(m_GridActive && !IgnoreGrid) { int LineDistance = GetLineDistance(); float x = 0.0f; float y = 0.0f; if(wx >= 0) x = (int)((wx+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else x = (int)((wx-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); if(wy >= 0) y = (int)((wy+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else y = (int)((wy-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); q->m_aPoints[4].x = f2fx(x); q->m_aPoints[4].y = f2fx(y); } else { q->m_aPoints[4].x += f2fx(wx-s_LastWx); q->m_aPoints[4].y += f2fx(wy-s_LastWy); } } else if(s_Operation == OP_MOVE_ALL) { // move all points including pivot if(m_GridActive && !IgnoreGrid) { int LineDistance = GetLineDistance(); float x = 0.0f; float y = 0.0f; if(wx >= 0) x = (int)((wx+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else x = (int)((wx-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); if(wy >= 0) y = (int)((wy+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else y = (int)((wy-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); int OldX = q->m_aPoints[4].x; int OldY = q->m_aPoints[4].y; q->m_aPoints[4].x = f2fx(x); q->m_aPoints[4].y = f2fx(y); int DiffX = q->m_aPoints[4].x - OldX; int DiffY = q->m_aPoints[4].y - OldY; for(int v = 0; v < 4; v++) { q->m_aPoints[v].x += DiffX; q->m_aPoints[v].y += DiffY; } } else { for(int v = 0; v < 5; v++) { q->m_aPoints[v].x += f2fx(wx-s_LastWx); q->m_aPoints[v].y += f2fx(wy-s_LastWy); } } } else if(s_Operation == OP_ROTATE) { for(int v = 0; v < 4; v++) { q->m_aPoints[v] = s_RotatePoints[v]; Rotate(&q->m_aPoints[4], &q->m_aPoints[v], s_RotateAngle); } } } s_RotateAngle += (m_MouseDeltaX) * 0.002f; s_LastWx = wx; s_LastWy = wy; if(s_Operation == OP_CONTEXT_MENU) { if(!UI()->MouseButton(1)) { static int s_QuadPopupID = 0; UiInvokePopupMenu(&s_QuadPopupID, 0, UI()->MouseX(), UI()->MouseY(), 120, 180, PopupQuad); m_LockMouse = false; s_Operation = OP_NONE; UI()->SetActiveItem(0); } } else { if(!UI()->MouseButton(0)) { m_LockMouse = false; s_Operation = OP_NONE; UI()->SetActiveItem(0); } } Graphics()->SetColor(1,1,1,1); } else if(UI()->HotItem() == pID) { ms_pUiGotContext = pID; Graphics()->SetColor(1,1,1,1); m_pTooltip = "Left mouse button to move. Hold shift to move pivot. Hold ctrl to rotate. Hold alt to ignore grid."; if(UI()->MouseButton(0)) { if(Input()->KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) s_Operation = OP_MOVE_PIVOT; else if(Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)) { m_LockMouse = true; s_Operation = OP_ROTATE; s_RotateAngle = 0; s_RotatePoints[0] = q->m_aPoints[0]; s_RotatePoints[1] = q->m_aPoints[1]; s_RotatePoints[2] = q->m_aPoints[2]; s_RotatePoints[3] = q->m_aPoints[3]; } else s_Operation = OP_MOVE_ALL; UI()->SetActiveItem(pID); if(m_SelectedQuad != Index) m_SelectedPoints = 0; m_SelectedQuad = Index; s_LastWx = wx; s_LastWy = wy; } if(UI()->MouseButton(1)) { if(m_SelectedQuad != Index) m_SelectedPoints = 0; m_SelectedQuad = Index; s_Operation = OP_CONTEXT_MENU; UI()->SetActiveItem(pID); } } else Graphics()->SetColor(0,1,0,1); IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f*m_WorldZoom, 5.0f*m_WorldZoom); Graphics()->QuadsDraw(&QuadItem, 1); } void CEditor::DoQuadPoint(CQuad *pQuad, int QuadIndex, int V) { void *pID = &pQuad->m_aPoints[V]; float wx = UI()->MouseWorldX(); float wy = UI()->MouseWorldY(); float px = fx2f(pQuad->m_aPoints[V].x); float py = fx2f(pQuad->m_aPoints[V].y); float dx = (px - wx)/m_WorldZoom; float dy = (py - wy)/m_WorldZoom; if(dx*dx+dy*dy < 50) UI()->SetHotItem(pID); // draw selection background if(m_SelectedQuad == QuadIndex && m_SelectedPoints&(1<SetColor(0,0,0,1); IGraphics::CQuadItem QuadItem(px, py, 7.0f, 7.0f); Graphics()->QuadsDraw(&QuadItem, 1); } enum { OP_NONE=0, OP_MOVEPOINT, OP_MOVEUV, OP_CONTEXT_MENU }; static bool s_Moved; static int s_Operation = OP_NONE; bool IgnoreGrid; if(Input()->KeyPressed(KEY_LALT) || Input()->KeyPressed(KEY_RALT)) IgnoreGrid = true; else IgnoreGrid = false; if(UI()->ActiveItem() == pID) { float dx = m_MouseDeltaWx; float dy = m_MouseDeltaWy; if(!s_Moved) { if(dx*dx+dy*dy > 0.5f) s_Moved = true; } if(s_Moved) { if(s_Operation == OP_MOVEPOINT) { if(m_GridActive && !IgnoreGrid) { for(int m = 0; m < 4; m++) if(m_SelectedPoints&(1<= 0) x = (int)((wx+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else x = (int)((wx-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); if(wy >= 0) y = (int)((wy+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else y = (int)((wy-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); pQuad->m_aPoints[m].x = f2fx(x); pQuad->m_aPoints[m].y = f2fx(y); } } else { for(int m = 0; m < 4; m++) if(m_SelectedPoints&(1<m_aPoints[m].x += f2fx(dx); pQuad->m_aPoints[m].y += f2fx(dy); } } } else if(s_Operation == OP_MOVEUV) { for(int m = 0; m < 4; m++) if(m_SelectedPoints&(1<m_aTexcoords[m].x += f2fx(dx*0.001f); pQuad->m_aTexcoords[(m+2)%4].x += f2fx(dx*0.001f); pQuad->m_aTexcoords[m].y += f2fx(dy*0.001f); pQuad->m_aTexcoords[m^1].y += f2fx(dy*0.001f); } } } if(s_Operation == OP_CONTEXT_MENU) { if(!UI()->MouseButton(1)) { static int s_PointPopupID = 0; UiInvokePopupMenu(&s_PointPopupID, 0, UI()->MouseX(), UI()->MouseY(), 120, 150, PopupPoint); UI()->SetActiveItem(0); } } else { if(!UI()->MouseButton(0)) { if(!s_Moved) { if(Input()->KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) m_SelectedPoints ^= 1<SetActiveItem(0); } } Graphics()->SetColor(1,1,1,1); } else if(UI()->HotItem() == pID) { ms_pUiGotContext = pID; Graphics()->SetColor(1,1,1,1); m_pTooltip = "Left mouse button to move. Hold shift to move the texture. Hold alt to ignore grid."; if(UI()->MouseButton(0)) { UI()->SetActiveItem(pID); s_Moved = false; if(Input()->KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) { s_Operation = OP_MOVEUV; m_LockMouse = true; } else s_Operation = OP_MOVEPOINT; if(!(m_SelectedPoints&(1<KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) m_SelectedPoints |= 1<MouseButton(1)) { s_Operation = OP_CONTEXT_MENU; m_SelectedQuad = QuadIndex; UI()->SetActiveItem(pID); if(!(m_SelectedPoints&(1<KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) m_SelectedPoints |= 1<SetColor(1,0,0,1); IGraphics::CQuadItem QuadItem(px, py, 5.0f*m_WorldZoom, 5.0f*m_WorldZoom); Graphics()->QuadsDraw(&QuadItem, 1); } void CEditor::DoQuadEnvelopes(const array &lQuads, int TexID) { int Num = lQuads.size(); CEnvelope **apEnvelope = new CEnvelope*[Num]; mem_zero(apEnvelope, sizeof(CEnvelope*)*Num); for(int i = 0; i < Num; i++) { if((m_ShowEnvelopePreview == 1 && lQuads[i].m_PosEnv == m_SelectedEnvelope) || m_ShowEnvelopePreview == 2) if(lQuads[i].m_PosEnv >= 0 && lQuads[i].m_PosEnv < m_Map.m_lEnvelopes.size()) apEnvelope[i] = m_Map.m_lEnvelopes[lQuads[i].m_PosEnv]; } //Draw Lines Graphics()->TextureSet(-1); Graphics()->LinesBegin(); Graphics()->SetColor(80.0f/255, 150.0f/255, 230.f/255, 0.5f); for(int j = 0; j < Num; j++) { if(!apEnvelope[j]) continue; //QuadParams const CPoint *pPoints = lQuads[j].m_aPoints; for(int i = 0; i < apEnvelope[j]->m_lPoints.size()-1; i++) { float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]); float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]); vec2 Pos0 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY); OffsetX = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[0]); OffsetY = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[1]); vec2 Pos1 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY); IGraphics::CLineItem Line = IGraphics::CLineItem(Pos0.x, Pos0.y, Pos1.x, Pos1.y); Graphics()->LinesDraw(&Line, 1); } } Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); Graphics()->LinesEnd(); //Draw Quads Graphics()->TextureSet(TexID); Graphics()->QuadsBegin(); for(int j = 0; j < Num; j++) { if(!apEnvelope[j]) continue; //QuadParams const CPoint *pPoints = lQuads[j].m_aPoints; for(int i = 0; i < apEnvelope[j]->m_lPoints.size(); i++) { //Calc Env Position float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]); float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]); float Rot = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[2])/360.0f*pi*2; //Set Colours float Alpha = (m_SelectedQuadEnvelope == lQuads[j].m_PosEnv && m_SelectedEnvelopePoint == i) ? 0.65f : 0.35f; IGraphics::CColorVertex aArray[4] = { IGraphics::CColorVertex(0, lQuads[j].m_aColors[0].r, lQuads[j].m_aColors[0].g, lQuads[j].m_aColors[0].b, Alpha), IGraphics::CColorVertex(1, lQuads[j].m_aColors[1].r, lQuads[j].m_aColors[1].g, lQuads[j].m_aColors[1].b, Alpha), IGraphics::CColorVertex(2, lQuads[j].m_aColors[2].r, lQuads[j].m_aColors[2].g, lQuads[j].m_aColors[2].b, Alpha), IGraphics::CColorVertex(3, lQuads[j].m_aColors[3].r, lQuads[j].m_aColors[3].g, lQuads[j].m_aColors[3].b, Alpha)}; Graphics()->SetColorVertex(aArray, 4); //Rotation if(Rot != 0) { static CPoint aRotated[4]; aRotated[0] = lQuads[j].m_aPoints[0]; aRotated[1] = lQuads[j].m_aPoints[1]; aRotated[2] = lQuads[j].m_aPoints[2]; aRotated[3] = lQuads[j].m_aPoints[3]; pPoints = aRotated; Rotate(&lQuads[j].m_aPoints[4], &aRotated[0], Rot); Rotate(&lQuads[j].m_aPoints[4], &aRotated[1], Rot); Rotate(&lQuads[j].m_aPoints[4], &aRotated[2], Rot); Rotate(&lQuads[j].m_aPoints[4], &aRotated[3], Rot); } //Set Texture Coords Graphics()->QuadsSetSubsetFree( fx2f(lQuads[j].m_aTexcoords[0].x), fx2f(lQuads[j].m_aTexcoords[0].y), fx2f(lQuads[j].m_aTexcoords[1].x), fx2f(lQuads[j].m_aTexcoords[1].y), fx2f(lQuads[j].m_aTexcoords[2].x), fx2f(lQuads[j].m_aTexcoords[2].y), fx2f(lQuads[j].m_aTexcoords[3].x), fx2f(lQuads[j].m_aTexcoords[3].y) ); //Set Quad Coords & Draw IGraphics::CFreeformItem Freeform( fx2f(pPoints[0].x)+OffsetX, fx2f(pPoints[0].y)+OffsetY, fx2f(pPoints[1].x)+OffsetX, fx2f(pPoints[1].y)+OffsetY, fx2f(pPoints[2].x)+OffsetX, fx2f(pPoints[2].y)+OffsetY, fx2f(pPoints[3].x)+OffsetX, fx2f(pPoints[3].y)+OffsetY); Graphics()->QuadsDrawFreeform(&Freeform, 1); } } Graphics()->QuadsEnd(); Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); // Draw QuadPoints for(int j = 0; j < Num; j++) { if(!apEnvelope[j]) continue; //QuadParams for(int i = 0; i < apEnvelope[j]->m_lPoints.size()-1; i++) DoQuadEnvPoint(&lQuads[j], j, i); } Graphics()->QuadsEnd(); delete[] apEnvelope; } void CEditor::DoQuadEnvPoint(const CQuad *pQuad, int QIndex, int PIndex) { enum { OP_NONE=0, OP_MOVE, OP_ROTATE, }; // some basic values static float s_LastWx; static float s_LastWy; static int s_Operation = OP_NONE; float wx = UI()->MouseWorldX(); float wy = UI()->MouseWorldY(); CEnvelope *pEnvelope = m_Map.m_lEnvelopes[pQuad->m_PosEnv]; void *pID = &pEnvelope->m_lPoints[PIndex]; static int s_ActQIndex = -1; // get pivot float CenterX = fx2f(pQuad->m_aPoints[4].x)+fx2f(pEnvelope->m_lPoints[PIndex].m_aValues[0]); float CenterY = fx2f(pQuad->m_aPoints[4].y)+fx2f(pEnvelope->m_lPoints[PIndex].m_aValues[1]); float dx = (CenterX - wx)/m_WorldZoom; float dy = (CenterY - wy)/m_WorldZoom; if(dx*dx+dy*dy < 50.0f && UI()->ActiveItem() == 0) { UI()->SetHotItem(pID); s_ActQIndex = QIndex; } bool IgnoreGrid; if(Input()->KeyPressed(KEY_LALT) || Input()->KeyPressed(KEY_RALT)) IgnoreGrid = true; else IgnoreGrid = false; if(UI()->ActiveItem() == pID && s_ActQIndex == QIndex) { if(s_Operation == OP_MOVE) { if(m_GridActive && !IgnoreGrid) { int LineDistance = GetLineDistance(); float x = 0.0f; float y = 0.0f; if(wx >= 0) x = (int)((wx+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else x = (int)((wx-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); if(wy >= 0) y = (int)((wy+(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); else y = (int)((wy-(LineDistance/2)*m_GridFactor)/(LineDistance*m_GridFactor)) * (LineDistance*m_GridFactor); pEnvelope->m_lPoints[PIndex].m_aValues[0] = f2fx(x); pEnvelope->m_lPoints[PIndex].m_aValues[1] = f2fx(y); } else { pEnvelope->m_lPoints[PIndex].m_aValues[0] += f2fx(wx-s_LastWx); pEnvelope->m_lPoints[PIndex].m_aValues[1] += f2fx(wy-s_LastWy); } } else if(s_Operation == OP_ROTATE) pEnvelope->m_lPoints[PIndex].m_aValues[2] += 10*m_MouseDeltaX; s_LastWx = wx; s_LastWy = wy; if(!UI()->MouseButton(0)) { m_LockMouse = false; s_Operation = OP_NONE; UI()->SetActiveItem(0); } Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); } else if(UI()->HotItem() == pID && s_ActQIndex == QIndex) { ms_pUiGotContext = pID; Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); m_pTooltip = "Left mouse button to move. Hold ctrl to rotate. Hold alt to ignore grid."; if(UI()->MouseButton(0)) { if(Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL)) { m_LockMouse = true; s_Operation = OP_ROTATE; } else s_Operation = OP_MOVE; m_SelectedEnvelopePoint = PIndex; m_SelectedQuadEnvelope = pQuad->m_PosEnv; UI()->SetActiveItem(pID); if(m_SelectedQuad != QIndex) m_SelectedPoints = 0; m_SelectedQuad = QIndex; s_LastWx = wx; s_LastWy = wy; } else { m_SelectedEnvelopePoint = -1; m_SelectedQuadEnvelope = -1; } } else Graphics()->SetColor(0.0f, 1.0f, 0.0f, 1.0f); IGraphics::CQuadItem QuadItem(CenterX, CenterY, 5.0f*m_WorldZoom, 5.0f*m_WorldZoom); Graphics()->QuadsDraw(&QuadItem, 1); } void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar) { // render all good stuff if(!m_ShowPicker) { for(int g = 0; g < m_Map.m_lGroups.size(); g++) { if(m_Map.m_lGroups[g]->m_Visible) m_Map.m_lGroups[g]->Render(); //UI()->ClipEnable(&view); } // render the game above everything else if(m_Map.m_pGameGroup->m_Visible && m_Map.m_pGameLayer->m_Visible) { m_Map.m_pGameGroup->MapScreen(); m_Map.m_pGameLayer->Render(); } CLayerTiles *pT = static_cast(GetSelectedLayerType(0, LAYERTYPE_TILES)); if(m_ShowTileInfo && pT && pT->m_Visible && m_ZoomLevel <= 300) { GetSelectedGroup()->MapScreen(); pT->ShowInfo(); } } else { // fix aspect ratio of the image in the picker float Max = min(View.w, View.h); View.w = View.h = Max; } static void *s_pEditorID = (void *)&s_pEditorID; int Inside = UI()->MouseInside(&View); // fetch mouse position float wx = UI()->MouseWorldX(); float wy = UI()->MouseWorldY(); float mx = UI()->MouseX(); float my = UI()->MouseY(); static float s_StartWx = 0; static float s_StartWy = 0; enum { OP_NONE=0, OP_BRUSH_GRAB, OP_BRUSH_DRAW, OP_BRUSH_PAINT, OP_PAN_WORLD, OP_PAN_EDITOR, }; // remap the screen so it can display the whole tileset if(m_ShowPicker) { CUIRect Screen = *UI()->Screen(); float Size = 32.0*16.0f; float w = Size*(Screen.w/View.w); float h = Size*(Screen.h/View.h); float x = -(View.x/Screen.w)*w; float y = -(View.y/Screen.h)*h; wx = x+w*mx/Screen.w; wy = y+h*my/Screen.h; Graphics()->MapScreen(x, y, x+w, y+h); CLayerTiles *t = (CLayerTiles *)GetSelectedLayerType(0, LAYERTYPE_TILES); if(t) { m_TilesetPicker.m_Image = t->m_Image; m_TilesetPicker.m_TexID = t->m_TexID; m_TilesetPicker.Render(); if(m_ShowTileInfo) m_TilesetPicker.ShowInfo(); } } static int s_Operation = OP_NONE; // draw layer borders CLayer *pEditLayers[16]; int NumEditLayers = 0; NumEditLayers = 0; if(m_ShowPicker) { pEditLayers[0] = &m_TilesetPicker; NumEditLayers++; } else { pEditLayers[0] = GetSelectedLayer(0); if(pEditLayers[0]) NumEditLayers++; CLayerGroup *g = GetSelectedGroup(); if(g) { g->MapScreen(); RenderGrid(g); for(int i = 0; i < NumEditLayers; i++) { if(pEditLayers[i]->m_Type != LAYERTYPE_TILES) continue; float w, h; pEditLayers[i]->GetSize(&w, &h); IGraphics::CLineItem Array[4] = { IGraphics::CLineItem(0, 0, w, 0), IGraphics::CLineItem(w, 0, w, h), IGraphics::CLineItem(w, h, 0, h), IGraphics::CLineItem(0, h, 0, 0)}; Graphics()->TextureSet(-1); Graphics()->LinesBegin(); Graphics()->LinesDraw(Array, 4); Graphics()->LinesEnd(); } } } if(Inside) { UI()->SetHotItem(s_pEditorID); // do global operations like pan and zoom if(UI()->ActiveItem() == 0 && (UI()->MouseButton(0) || UI()->MouseButton(2))) { s_StartWx = wx; s_StartWy = wy; if(Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL) || UI()->MouseButton(2)) { if(Input()->KeyPressed(KEY_LSHIFT)) s_Operation = OP_PAN_EDITOR; else s_Operation = OP_PAN_WORLD; UI()->SetActiveItem(s_pEditorID); } } // brush editing if(UI()->HotItem() == s_pEditorID) { if(m_Brush.IsEmpty()) m_pTooltip = "Use left mouse button to drag and create a brush."; else m_pTooltip = "Use left mouse button to paint with the brush. Right button clears the brush."; if(UI()->ActiveItem() == s_pEditorID) { CUIRect r; r.x = s_StartWx; r.y = s_StartWy; r.w = wx-s_StartWx; r.h = wy-s_StartWy; if(r.w < 0) { r.x += r.w; r.w = -r.w; } if(r.h < 0) { r.y += r.h; r.h = -r.h; } if(s_Operation == OP_BRUSH_DRAW) { if(!m_Brush.IsEmpty()) { // draw with brush for(int k = 0; k < NumEditLayers; k++) { if(pEditLayers[k]->m_Type == m_Brush.m_lLayers[0]->m_Type) pEditLayers[k]->BrushDraw(m_Brush.m_lLayers[0], wx, wy); } } } else if(s_Operation == OP_BRUSH_GRAB) { if(!UI()->MouseButton(0)) { // grab brush char aBuf[256]; str_format(aBuf, sizeof(aBuf),"grabbing %f %f %f %f", r.x, r.y, r.w, r.h); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor", aBuf); // TODO: do all layers int Grabs = 0; for(int k = 0; k < NumEditLayers; k++) Grabs += pEditLayers[k]->BrushGrab(&m_Brush, r); if(Grabs == 0) m_Brush.Clear(); } else { //editor.map.groups[selected_group]->mapscreen(); for(int k = 0; k < NumEditLayers; k++) pEditLayers[k]->BrushSelecting(r); Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); } } else if(s_Operation == OP_BRUSH_PAINT) { if(!UI()->MouseButton(0)) { for(int k = 0; k < NumEditLayers; k++) pEditLayers[k]->FillSelection(m_Brush.IsEmpty(), m_Brush.m_lLayers[0], r); } else { //editor.map.groups[selected_group]->mapscreen(); for(int k = 0; k < NumEditLayers; k++) pEditLayers[k]->BrushSelecting(r); Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); } } } else { if(UI()->MouseButton(1)) m_Brush.Clear(); if(UI()->MouseButton(0) && s_Operation == OP_NONE) { UI()->SetActiveItem(s_pEditorID); if(m_Brush.IsEmpty()) s_Operation = OP_BRUSH_GRAB; else { s_Operation = OP_BRUSH_DRAW; for(int k = 0; k < NumEditLayers; k++) { if(pEditLayers[k]->m_Type == m_Brush.m_lLayers[0]->m_Type) pEditLayers[k]->BrushPlace(m_Brush.m_lLayers[0], wx, wy); } } CLayerTiles *pLayer = (CLayerTiles*)GetSelectedLayerType(0, LAYERTYPE_TILES); if((Input()->KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) && pLayer) s_Operation = OP_BRUSH_PAINT; } if(!m_Brush.IsEmpty()) { m_Brush.m_OffsetX = -(int)wx; m_Brush.m_OffsetY = -(int)wy; for(int i = 0; i < m_Brush.m_lLayers.size(); i++) { if(m_Brush.m_lLayers[i]->m_Type == LAYERTYPE_TILES) { m_Brush.m_OffsetX = -(int)(wx/32.0f)*32; m_Brush.m_OffsetY = -(int)(wy/32.0f)*32; break; } } CLayerGroup *g = GetSelectedGroup(); if(g) { m_Brush.m_OffsetX += g->m_OffsetX; m_Brush.m_OffsetY += g->m_OffsetY; m_Brush.m_ParallaxX = g->m_ParallaxX; m_Brush.m_ParallaxY = g->m_ParallaxY; m_Brush.Render(); float w, h; m_Brush.GetSize(&w, &h); IGraphics::CLineItem Array[4] = { IGraphics::CLineItem(0, 0, w, 0), IGraphics::CLineItem(w, 0, w, h), IGraphics::CLineItem(w, h, 0, h), IGraphics::CLineItem(0, h, 0, 0)}; Graphics()->TextureSet(-1); Graphics()->LinesBegin(); Graphics()->LinesDraw(Array, 4); Graphics()->LinesEnd(); } } } } // quad editing { if(!m_ShowPicker && m_Brush.IsEmpty()) { // fetch layers CLayerGroup *g = GetSelectedGroup(); if(g) g->MapScreen(); for(int k = 0; k < NumEditLayers; k++) { if(pEditLayers[k]->m_Type == LAYERTYPE_QUADS) { CLayerQuads *pLayer = (CLayerQuads *)pEditLayers[k]; if(!m_ShowEnvelopePreview) m_ShowEnvelopePreview = 2; Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); for(int i = 0; i < pLayer->m_lQuads.size(); i++) { for(int v = 0; v < 4; v++) DoQuadPoint(&pLayer->m_lQuads[i], i, v); DoQuad(&pLayer->m_lQuads[i], i); } Graphics()->QuadsEnd(); } } Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); } // do panning if(UI()->ActiveItem() == s_pEditorID) { if(s_Operation == OP_PAN_WORLD) { m_WorldOffsetX -= m_MouseDeltaX*m_WorldZoom; m_WorldOffsetY -= m_MouseDeltaY*m_WorldZoom; } else if(s_Operation == OP_PAN_EDITOR) { m_EditorOffsetX -= m_MouseDeltaX*m_WorldZoom; m_EditorOffsetY -= m_MouseDeltaY*m_WorldZoom; } // release mouse if(!UI()->MouseButton(0)) { s_Operation = OP_NONE; UI()->SetActiveItem(0); } } } } else if(UI()->ActiveItem() == s_pEditorID) { // release mouse if(!UI()->MouseButton(0)) { s_Operation = OP_NONE; UI()->SetActiveItem(0); } } if(!m_ShowPicker && GetSelectedGroup() && GetSelectedGroup()->m_UseClipping) { CLayerGroup *g = m_Map.m_pGameGroup; g->MapScreen(); Graphics()->TextureSet(-1); Graphics()->LinesBegin(); CUIRect r; r.x = GetSelectedGroup()->m_ClipX; r.y = GetSelectedGroup()->m_ClipY; r.w = GetSelectedGroup()->m_ClipW; r.h = GetSelectedGroup()->m_ClipH; IGraphics::CLineItem Array[4] = { IGraphics::CLineItem(r.x, r.y, r.x+r.w, r.y), IGraphics::CLineItem(r.x+r.w, r.y, r.x+r.w, r.y+r.h), IGraphics::CLineItem(r.x+r.w, r.y+r.h, r.x, r.y+r.h), IGraphics::CLineItem(r.x, r.y+r.h, r.x, r.y)}; Graphics()->SetColor(1,0,0,1); Graphics()->LinesDraw(Array, 4); Graphics()->LinesEnd(); } // render screen sizes if(m_ProofBorders) { CLayerGroup *g = m_Map.m_pGameGroup; g->MapScreen(); Graphics()->TextureSet(-1); Graphics()->LinesBegin(); float aLastPoints[4]; float Start = 1.0f; //9.0f/16.0f; float End = 16.0f/9.0f; const int NumSteps = 20; for(int i = 0; i <= NumSteps; i++) { float aPoints[4]; float Aspect = Start + (End-Start)*(i/(float)NumSteps); RenderTools()->MapscreenToWorld( m_WorldOffsetX, m_WorldOffsetY, 1.0f, 1.0f, 0.0f, 0.0f, Aspect, 1.0f, aPoints); if(i == 0) { IGraphics::CLineItem Array[2] = { IGraphics::CLineItem(aPoints[0], aPoints[1], aPoints[2], aPoints[1]), IGraphics::CLineItem(aPoints[0], aPoints[3], aPoints[2], aPoints[3])}; Graphics()->LinesDraw(Array, 2); } if(i != 0) { IGraphics::CLineItem Array[4] = { IGraphics::CLineItem(aPoints[0], aPoints[1], aLastPoints[0], aLastPoints[1]), IGraphics::CLineItem(aPoints[2], aPoints[1], aLastPoints[2], aLastPoints[1]), IGraphics::CLineItem(aPoints[0], aPoints[3], aLastPoints[0], aLastPoints[3]), IGraphics::CLineItem(aPoints[2], aPoints[3], aLastPoints[2], aLastPoints[3])}; Graphics()->LinesDraw(Array, 4); } if(i == NumSteps) { IGraphics::CLineItem Array[2] = { IGraphics::CLineItem(aPoints[0], aPoints[1], aPoints[0], aPoints[3]), IGraphics::CLineItem(aPoints[2], aPoints[1], aPoints[2], aPoints[3])}; Graphics()->LinesDraw(Array, 2); } mem_copy(aLastPoints, aPoints, sizeof(aPoints)); } if(1) { Graphics()->SetColor(1,0,0,1); for(int i = 0; i < 2; i++) { float aPoints[4]; float aAspects[] = {4.0f/3.0f, 16.0f/10.0f, 5.0f/4.0f, 16.0f/9.0f}; float Aspect = aAspects[i]; RenderTools()->MapscreenToWorld( m_WorldOffsetX, m_WorldOffsetY, 1.0f, 1.0f, 0.0f, 0.0f, Aspect, 1.0f, aPoints); CUIRect r; r.x = aPoints[0]; r.y = aPoints[1]; r.w = aPoints[2]-aPoints[0]; r.h = aPoints[3]-aPoints[1]; IGraphics::CLineItem Array[4] = { IGraphics::CLineItem(r.x, r.y, r.x+r.w, r.y), IGraphics::CLineItem(r.x+r.w, r.y, r.x+r.w, r.y+r.h), IGraphics::CLineItem(r.x+r.w, r.y+r.h, r.x, r.y+r.h), IGraphics::CLineItem(r.x, r.y+r.h, r.x, r.y)}; Graphics()->LinesDraw(Array, 4); Graphics()->SetColor(0,1,0,1); } } Graphics()->LinesEnd(); } if (!m_ShowPicker && m_ShowTileInfo && m_ShowEnvelopePreview != 0 && GetSelectedLayer(0) && GetSelectedLayer(0)->m_Type == LAYERTYPE_QUADS) { GetSelectedGroup()->MapScreen(); CLayerQuads *pLayer = (CLayerQuads*)GetSelectedLayer(0); int TexID = -1; if(pLayer->m_Image >= 0 && pLayer->m_Image < m_Map.m_lImages.size()) TexID = m_Map.m_lImages[pLayer->m_Image]->m_TexID; DoQuadEnvelopes(pLayer->m_lQuads, TexID); m_ShowEnvelopePreview = 0; } Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); //UI()->ClipDisable(); } int CEditor::DoProperties(CUIRect *pToolBox, CProperty *pProps, int *pIDs, int *pNewVal) { int Change = -1; for(int i = 0; pProps[i].m_pName; i++) { CUIRect Slot; pToolBox->HSplitTop(13.0f, &Slot, pToolBox); CUIRect Label, Shifter; Slot.VSplitMid(&Label, &Shifter); Shifter.HMargin(1.0f, &Shifter); UI()->DoLabel(&Label, pProps[i].m_pName, 10.0f, -1, -1); if(pProps[i].m_Type == PROPTYPE_INT_STEP) { CUIRect Inc, Dec; char aBuf[64]; Shifter.VSplitRight(10.0f, &Shifter, &Inc); Shifter.VSplitLeft(10.0f, &Dec, &Shifter); str_format(aBuf, sizeof(aBuf),"%d", pProps[i].m_Value); RenderTools()->DrawUIRect(&Shifter, vec4(1,1,1,0.5f), 0, 0.0f); UI()->DoLabel(&Shifter, aBuf, 10.0f, 0, -1); if(DoButton_ButtonDec(&pIDs[i], 0, 0, &Dec, 0, "Decrease")) { *pNewVal = pProps[i].m_Value-1; Change = i; } if(DoButton_ButtonInc(((char *)&pIDs[i])+1, 0, 0, &Inc, 0, "Increase")) { *pNewVal = pProps[i].m_Value+1; Change = i; } } else if(pProps[i].m_Type == PROPTYPE_BOOL) { CUIRect No, Yes; Shifter.VSplitMid(&No, &Yes); if(DoButton_ButtonDec(&pIDs[i], "No", !pProps[i].m_Value, &No, 0, "")) { *pNewVal = 0; Change = i; } if(DoButton_ButtonInc(((char *)&pIDs[i])+1, "Yes", pProps[i].m_Value, &Yes, 0, "")) { *pNewVal = 1; Change = i; } } else if(pProps[i].m_Type == PROPTYPE_INT_SCROLL) { int NewValue = UiDoValueSelector(&pIDs[i], &Shifter, "", pProps[i].m_Value, pProps[i].m_Min, pProps[i].m_Max, 1, 1.0f, "Use left mouse button to drag and change the value. Hold shift to be more precise."); if(NewValue != pProps[i].m_Value) { *pNewVal = NewValue; Change = i; } } else if(pProps[i].m_Type == PROPTYPE_COLOR) { static const char *s_paTexts[4] = {"R", "G", "B", "A"}; static int s_aShift[] = {24, 16, 8, 0}; int NewColor = 0; for(int c = 0; c < 4; c++) { int v = (pProps[i].m_Value >> s_aShift[c])&0xff; NewColor |= UiDoValueSelector(((char *)&pIDs[i])+c, &Shifter, s_paTexts[c], v, 0, 255, 1, 1.0f, "Use left mouse button to drag and change the color value. Hold shift to be more precise.")<HSplitTop(13.0f, &Slot, pToolBox); Slot.VSplitMid(0, &Shifter); Shifter.HMargin(1.0f, &Shifter); } } if(NewColor != pProps[i].m_Value) { *pNewVal = NewColor; Change = i; } } else if(pProps[i].m_Type == PROPTYPE_IMAGE) { char aBuf[64]; if(pProps[i].m_Value < 0) str_copy(aBuf, "None", sizeof(aBuf)); else str_format(aBuf, sizeof(aBuf),"%s", m_Map.m_lImages[pProps[i].m_Value]->m_aName); if(DoButton_Editor(&pIDs[i], aBuf, 0, &Shifter, 0, 0)) PopupSelectImageInvoke(pProps[i].m_Value, UI()->MouseX(), UI()->MouseY()); int r = PopupSelectImageResult(); if(r >= -1) { *pNewVal = r; Change = i; } } else if(pProps[i].m_Type == PROPTYPE_SHIFT) { CUIRect Left, Right, Up, Down; Shifter.VSplitMid(&Left, &Up); Left.VSplitRight(1.0f, &Left, 0); Up.VSplitLeft(1.0f, 0, &Up); Left.VSplitLeft(10.0f, &Left, &Shifter); Shifter.VSplitRight(10.0f, &Shifter, &Right); RenderTools()->DrawUIRect(&Shifter, vec4(1,1,1,0.5f), 0, 0.0f); UI()->DoLabel(&Shifter, "X", 10.0f, 0, -1); Up.VSplitLeft(10.0f, &Up, &Shifter); Shifter.VSplitRight(10.0f, &Shifter, &Down); RenderTools()->DrawUIRect(&Shifter, vec4(1,1,1,0.5f), 0, 0.0f); UI()->DoLabel(&Shifter, "Y", 10.0f, 0, -1); if(DoButton_ButtonDec(&pIDs[i], "-", 0, &Left, 0, "Left")) { *pNewVal = 1; Change = i; } if(DoButton_ButtonInc(((char *)&pIDs[i])+3, "+", 0, &Right, 0, "Right")) { *pNewVal = 2; Change = i; } if(DoButton_ButtonDec(((char *)&pIDs[i])+1, "-", 0, &Up, 0, "Up")) { *pNewVal = 4; Change = i; } if(DoButton_ButtonInc(((char *)&pIDs[i])+2, "+", 0, &Down, 0, "Down")) { *pNewVal = 8; Change = i; } } } return Change; } void CEditor::RenderLayers(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) { CUIRect LayersBox = ToolBox; if(!m_GuiActive) return; CUIRect Slot, Button; char aBuf[64]; float LayersHeight = 12.0f; // Height of AddGroup button static int s_ScrollBar = 0; static float s_ScrollValue = 0; for(int g = 0; g < m_Map.m_lGroups.size(); g++) { // Each group is 19.0f // Each layer is 14.0f LayersHeight += 19.0f; if(!m_Map.m_lGroups[g]->m_Collapse) LayersHeight += m_Map.m_lGroups[g]->m_lLayers.size() * 14.0f; } float ScrollDifference = LayersHeight - LayersBox.h; if(LayersHeight > LayersBox.h) // Do we even need a scrollbar? { CUIRect Scroll; LayersBox.VSplitRight(15.0f, &LayersBox, &Scroll); LayersBox.VSplitRight(3.0f, &LayersBox, 0); // extra spacing Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = UiDoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); if(UI()->MouseInside(&Scroll) || UI()->MouseInside(&LayersBox)) { int ScrollNum = (int)((LayersHeight-LayersBox.h)/15.0f)+1; if(ScrollNum > 0) { if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) s_ScrollValue = clamp(s_ScrollValue - 1.0f/ScrollNum, 0.0f, 1.0f); if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) s_ScrollValue = clamp(s_ScrollValue + 1.0f/ScrollNum, 0.0f, 1.0f); } } } float LayerStartAt = ScrollDifference * s_ScrollValue; if(LayerStartAt < 0.0f) LayerStartAt = 0.0f; float LayerStopAt = LayersHeight - ScrollDifference * (1 - s_ScrollValue); float LayerCur = 0; // render layers { for(int g = 0; g < m_Map.m_lGroups.size(); g++) { if(LayerCur > LayerStopAt) break; else if(LayerCur + m_Map.m_lGroups[g]->m_lLayers.size() * 14.0f + 19.0f < LayerStartAt) { LayerCur += m_Map.m_lGroups[g]->m_lLayers.size() * 14.0f + 19.0f; continue; } CUIRect VisibleToggle, SaveCheck; if(LayerCur >= LayerStartAt) { LayersBox.HSplitTop(12.0f, &Slot, &LayersBox); Slot.VSplitLeft(12, &VisibleToggle, &Slot); if(DoButton_Ex(&m_Map.m_lGroups[g]->m_Visible, m_Map.m_lGroups[g]->m_Visible?"V":"H", m_Map.m_lGroups[g]->m_Collapse ? 1 : 0, &VisibleToggle, 0, "Toggle group visibility", CUI::CORNER_L)) m_Map.m_lGroups[g]->m_Visible = !m_Map.m_lGroups[g]->m_Visible; Slot.VSplitRight(12.0f, &Slot, &SaveCheck); if(DoButton_Ex(&m_Map.m_lGroups[g]->m_SaveToMap, "S", m_Map.m_lGroups[g]->m_SaveToMap, &SaveCheck, 0, "Enable/disable group for saving", CUI::CORNER_R)) if(!m_Map.m_lGroups[g]->m_GameGroup) m_Map.m_lGroups[g]->m_SaveToMap = !m_Map.m_lGroups[g]->m_SaveToMap; str_format(aBuf, sizeof(aBuf),"#%d %s", g, m_Map.m_lGroups[g]->m_aName); float FontSize = 10.0f; while(TextRender()->TextWidth(0, FontSize, aBuf, -1) > Slot.w) FontSize--; if(int Result = DoButton_Ex(&m_Map.m_lGroups[g], aBuf, g==m_SelectedGroup, &Slot, BUTTON_CONTEXT, m_Map.m_lGroups[g]->m_Collapse ? "Select group. Double click to expand." : "Select group. Double click to collapse.", 0, FontSize)) { m_SelectedGroup = g; m_SelectedLayer = 0; static int s_GroupPopupId = 0; if(Result == 2) UiInvokePopupMenu(&s_GroupPopupId, 0, UI()->MouseX(), UI()->MouseY(), 145, 220, PopupGroup); if(m_Map.m_lGroups[g]->m_lLayers.size() && Input()->MouseDoubleClick()) m_Map.m_lGroups[g]->m_Collapse ^= 1; } LayersBox.HSplitTop(2.0f, &Slot, &LayersBox); } LayerCur += 14.0f; for(int i = 0; i < m_Map.m_lGroups[g]->m_lLayers.size(); i++) { if(LayerCur > LayerStopAt) break; else if(LayerCur < LayerStartAt) { LayerCur += 14.0f; continue; } if(m_Map.m_lGroups[g]->m_Collapse) continue; //visible LayersBox.HSplitTop(12.0f, &Slot, &LayersBox); Slot.VSplitLeft(12.0f, 0, &Button); Button.VSplitLeft(15, &VisibleToggle, &Button); if(DoButton_Ex(&m_Map.m_lGroups[g]->m_lLayers[i]->m_Visible, m_Map.m_lGroups[g]->m_lLayers[i]->m_Visible?"V":"H", 0, &VisibleToggle, 0, "Toggle layer visibility", CUI::CORNER_L)) m_Map.m_lGroups[g]->m_lLayers[i]->m_Visible = !m_Map.m_lGroups[g]->m_lLayers[i]->m_Visible; Button.VSplitRight(12.0f, &Button, &SaveCheck); if(DoButton_Ex(&m_Map.m_lGroups[g]->m_lLayers[i]->m_SaveToMap, "S", m_Map.m_lGroups[g]->m_lLayers[i]->m_SaveToMap, &SaveCheck, 0, "Enable/disable layer for saving", CUI::CORNER_R)) if(m_Map.m_lGroups[g]->m_lLayers[i] != m_Map.m_pGameLayer) m_Map.m_lGroups[g]->m_lLayers[i]->m_SaveToMap = !m_Map.m_lGroups[g]->m_lLayers[i]->m_SaveToMap; if(m_Map.m_lGroups[g]->m_lLayers[i]->m_aName[0]) str_format(aBuf, sizeof(aBuf), "%s", m_Map.m_lGroups[g]->m_lLayers[i]->m_aName); else if(m_Map.m_lGroups[g]->m_lLayers[i]->m_Type == LAYERTYPE_TILES) str_copy(aBuf, "Tiles", sizeof(aBuf)); else str_copy(aBuf, "Quads", sizeof(aBuf)); float FontSize = 10.0f; while(TextRender()->TextWidth(0, FontSize, aBuf, -1) > Button.w) FontSize--; if(int Result = DoButton_Ex(m_Map.m_lGroups[g]->m_lLayers[i], aBuf, g==m_SelectedGroup&&i==m_SelectedLayer, &Button, BUTTON_CONTEXT, "Select layer.", 0, FontSize)) { m_SelectedLayer = i; m_SelectedGroup = g; static int s_LayerPopupID = 0; if(Result == 2) UiInvokePopupMenu(&s_LayerPopupID, 0, UI()->MouseX(), UI()->MouseY(), 120, 245, PopupLayer); } LayerCur += 14.0f; LayersBox.HSplitTop(2.0f, &Slot, &LayersBox); } if(LayerCur > LayerStartAt && LayerCur < LayerStopAt) LayersBox.HSplitTop(5.0f, &Slot, &LayersBox); LayerCur += 5.0f; } } if(LayerCur <= LayerStopAt) { LayersBox.HSplitTop(12.0f, &Slot, &LayersBox); static int s_NewGroupButton = 0; if(DoButton_Editor(&s_NewGroupButton, "Add group", 0, &Slot, 0, "Adds a new group")) { m_Map.NewGroup(); m_SelectedGroup = m_Map.m_lGroups.size()-1; } } } void CEditor::ReplaceImage(const char *pFileName, int StorageType, void *pUser) { CEditor *pEditor = (CEditor *)pUser; CEditorImage ImgInfo(pEditor); if(!pEditor->Graphics()->LoadPNG(&ImgInfo, pFileName, StorageType)) return; CEditorImage *pImg = pEditor->m_Map.m_lImages[pEditor->m_SelectedImage]; int External = pImg->m_External; pEditor->Graphics()->UnloadTexture(pImg->m_TexID); if(pImg->m_pData) { mem_free(pImg->m_pData); pImg->m_pData = 0; } *pImg = ImgInfo; pImg->m_External = External; pEditor->ExtractName(pFileName, pImg->m_aName, sizeof(pImg->m_aName)); pImg->m_AutoMapper.Load(pImg->m_aName); pImg->m_TexID = pEditor->Graphics()->LoadTextureRaw(ImgInfo.m_Width, ImgInfo.m_Height, ImgInfo.m_Format, ImgInfo.m_pData, CImageInfo::FORMAT_AUTO, 0); ImgInfo.m_pData = 0; pEditor->SortImages(); for(int i = 0; i < pEditor->m_Map.m_lImages.size(); ++i) { if(!str_comp(pEditor->m_Map.m_lImages[i]->m_aName, pImg->m_aName)) pEditor->m_SelectedImage = i; } pEditor->m_Dialog = DIALOG_NONE; } void CEditor::AddImage(const char *pFileName, int StorageType, void *pUser) { CEditor *pEditor = (CEditor *)pUser; CEditorImage ImgInfo(pEditor); if(!pEditor->Graphics()->LoadPNG(&ImgInfo, pFileName, StorageType)) return; // check if we have that image already char aBuf[128]; ExtractName(pFileName, aBuf, sizeof(aBuf)); for(int i = 0; i < pEditor->m_Map.m_lImages.size(); ++i) { if(!str_comp(pEditor->m_Map.m_lImages[i]->m_aName, aBuf)) return; } CEditorImage *pImg = new CEditorImage(pEditor); *pImg = ImgInfo; pImg->m_TexID = pEditor->Graphics()->LoadTextureRaw(ImgInfo.m_Width, ImgInfo.m_Height, ImgInfo.m_Format, ImgInfo.m_pData, CImageInfo::FORMAT_AUTO, 0); ImgInfo.m_pData = 0; pImg->m_External = 1; // external by default str_copy(pImg->m_aName, aBuf, sizeof(pImg->m_aName)); pImg->m_AutoMapper.Load(pImg->m_aName); pEditor->m_Map.m_lImages.add(pImg); pEditor->SortImages(); if(pEditor->m_SelectedImage > -1 && pEditor->m_SelectedImage < pEditor->m_Map.m_lImages.size()) { for(int i = 0; i <= pEditor->m_SelectedImage; ++i) if(!str_comp(pEditor->m_Map.m_lImages[i]->m_aName, aBuf)) { pEditor->m_SelectedImage++; break; } } pEditor->m_Dialog = DIALOG_NONE; } static int gs_ModifyIndexDeletedIndex; static void ModifyIndexDeleted(int *pIndex) { if(*pIndex == gs_ModifyIndexDeletedIndex) *pIndex = -1; else if(*pIndex > gs_ModifyIndexDeletedIndex) *pIndex = *pIndex - 1; } int CEditor::PopupImage(CEditor *pEditor, CUIRect View) { static int s_ReplaceButton = 0; static int s_RemoveButton = 0; CUIRect Slot; View.HSplitTop(2.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); CEditorImage *pImg = pEditor->m_Map.m_lImages[pEditor->m_SelectedImage]; static int s_ExternalButton = 0; if(pImg->m_External) { if(pEditor->DoButton_MenuItem(&s_ExternalButton, "Embed", 0, &Slot, 0, "Embeds the image into the map file.")) { pImg->m_External = 0; return 1; } } else { if(pEditor->DoButton_MenuItem(&s_ExternalButton, "Make external", 0, &Slot, 0, "Removes the image from the map file.")) { pImg->m_External = 1; return 1; } } View.HSplitTop(10.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_ReplaceButton, "Replace", 0, &Slot, 0, "Replaces the image with a new one")) { pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_IMG, "Replace Image", "Replace", "mapres", "", ReplaceImage, pEditor); return 1; } View.HSplitTop(10.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_RemoveButton, "Remove", 0, &Slot, 0, "Removes the image from the map")) { delete pImg; pEditor->m_Map.m_lImages.remove_index(pEditor->m_SelectedImage); gs_ModifyIndexDeletedIndex = pEditor->m_SelectedImage; pEditor->m_Map.ModifyImageIndex(ModifyIndexDeleted); return 1; } return 0; } static int CompareImageName(const void *pObject1, const void *pObject2) { CEditorImage *pImage1 = *(CEditorImage**)pObject1; CEditorImage *pImage2 = *(CEditorImage**)pObject2; return str_comp(pImage1->m_aName, pImage2->m_aName); } static int *gs_pSortedIndex = 0; static void ModifySortedIndex(int *pIndex) { if(*pIndex > -1) *pIndex = gs_pSortedIndex[*pIndex]; } void CEditor::SortImages() { bool Sorted = true; for(int i = 1; i < m_Map.m_lImages.size(); i++) if( str_comp(m_Map.m_lImages[i]->m_aName, m_Map.m_lImages[i-1]->m_aName) < 0 ) { Sorted = false; break; } if(!Sorted) { array lTemp = array(m_Map.m_lImages); gs_pSortedIndex = new int[lTemp.size()]; qsort(m_Map.m_lImages.base_ptr(), m_Map.m_lImages.size(), sizeof(CEditorImage*), CompareImageName); for(int OldIndex = 0; OldIndex < lTemp.size(); OldIndex++) for(int NewIndex = 0; NewIndex < m_Map.m_lImages.size(); NewIndex++) if(lTemp[OldIndex] == m_Map.m_lImages[NewIndex]) gs_pSortedIndex[OldIndex] = NewIndex; m_Map.ModifyImageIndex(ModifySortedIndex); delete [] gs_pSortedIndex; gs_pSortedIndex = 0; } } void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View) { static int s_ScrollBar = 0; static float s_ScrollValue = 0; float ImagesHeight = 30.0f + 14.0f * m_Map.m_lImages.size() + 27.0f; float ScrollDifference = ImagesHeight - ToolBox.h; if(ImagesHeight > ToolBox.h) // Do we even need a scrollbar? { CUIRect Scroll; ToolBox.VSplitRight(15.0f, &ToolBox, &Scroll); ToolBox.VSplitRight(3.0f, &ToolBox, 0); // extra spacing Scroll.HMargin(5.0f, &Scroll); s_ScrollValue = UiDoScrollbarV(&s_ScrollBar, &Scroll, s_ScrollValue); if(UI()->MouseInside(&Scroll) || UI()->MouseInside(&ToolBox)) { int ScrollNum = (int)((ImagesHeight-ToolBox.h)/14.0f)+1; if(ScrollNum > 0) { if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) s_ScrollValue = clamp(s_ScrollValue - 1.0f/ScrollNum, 0.0f, 1.0f); if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) s_ScrollValue = clamp(s_ScrollValue + 1.0f/ScrollNum, 0.0f, 1.0f); } } } float ImageStartAt = ScrollDifference * s_ScrollValue; if(ImageStartAt < 0.0f) ImageStartAt = 0.0f; float ImageStopAt = ImagesHeight - ScrollDifference * (1 - s_ScrollValue); float ImageCur = 0.0f; for(int e = 0; e < 2; e++) // two passes, first embedded, then external { CUIRect Slot; if(ImageCur > ImageStopAt) break; else if(ImageCur >= ImageStartAt) { ToolBox.HSplitTop(15.0f, &Slot, &ToolBox); if(e == 0) UI()->DoLabel(&Slot, "Embedded", 12.0f, 0); else UI()->DoLabel(&Slot, "External", 12.0f, 0); } ImageCur += 15.0f; for(int i = 0; i < m_Map.m_lImages.size(); i++) { if((e && !m_Map.m_lImages[i]->m_External) || (!e && m_Map.m_lImages[i]->m_External)) { continue; } if(ImageCur > ImageStopAt) break; else if(ImageCur < ImageStartAt) { ImageCur += 14.0f; continue; } ImageCur += 14.0f; char aBuf[128]; str_copy(aBuf, m_Map.m_lImages[i]->m_aName, sizeof(aBuf)); ToolBox.HSplitTop(12.0f, &Slot, &ToolBox); if(int Result = DoButton_Editor(&m_Map.m_lImages[i], aBuf, m_SelectedImage == i, &Slot, BUTTON_CONTEXT, "Select image")) { m_SelectedImage = i; static int s_PopupImageID = 0; if(Result == 2) UiInvokePopupMenu(&s_PopupImageID, 0, UI()->MouseX(), UI()->MouseY(), 120, 80, PopupImage); } ToolBox.HSplitTop(2.0f, 0, &ToolBox); // render image if(m_SelectedImage == i) { CUIRect r; View.Margin(10.0f, &r); if(r.h < r.w) r.w = r.h; else r.h = r.w; float Max = (float)(max(m_Map.m_lImages[i]->m_Width, m_Map.m_lImages[i]->m_Height)); r.w *= m_Map.m_lImages[i]->m_Width/Max; r.h *= m_Map.m_lImages[i]->m_Height/Max; Graphics()->TextureSet(m_Map.m_lImages[i]->m_TexID); Graphics()->BlendNormal(); Graphics()->WrapClamp(); Graphics()->QuadsBegin(); IGraphics::CQuadItem QuadItem(r.x, r.y, r.w, r.h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); Graphics()->WrapNormal(); } } // separator ToolBox.HSplitTop(5.0f, &Slot, &ToolBox); ImageCur += 5.0f; IGraphics::CLineItem LineItem(Slot.x, Slot.y+Slot.h/2, Slot.x+Slot.w, Slot.y+Slot.h/2); Graphics()->TextureSet(-1); Graphics()->LinesBegin(); Graphics()->LinesDraw(&LineItem, 1); Graphics()->LinesEnd(); } if(ImageCur + 27.0f > ImageStopAt) return; CUIRect Slot; ToolBox.HSplitTop(5.0f, &Slot, &ToolBox); // new image static int s_NewImageButton = 0; ToolBox.HSplitTop(12.0f, &Slot, &ToolBox); if(DoButton_Editor(&s_NewImageButton, "Add", 0, &Slot, 0, "Load a new image to use in the map")) InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_IMG, "Add Image", "Add", "mapres", "", AddImage, this); } static int EditorListdirCallback(const char *pName, int IsDir, int StorageType, void *pUser) { CEditor *pEditor = (CEditor*)pUser; int Length = str_length(pName); if((pName[0] == '.' && (pName[1] == 0 || (pName[1] == '.' && pName[2] == 0 && (!str_comp(pEditor->m_pFileDialogPath, "maps") || !str_comp(pEditor->m_pFileDialogPath, "mapres"))))) || (!IsDir && ((pEditor->m_FileDialogFileType == CEditor::FILETYPE_MAP && (Length < 4 || str_comp(pName+Length-4, ".map"))) || (pEditor->m_FileDialogFileType == CEditor::FILETYPE_IMG && (Length < 4 || str_comp(pName+Length-4, ".png")))))) return 0; CEditor::CFilelistItem Item; str_copy(Item.m_aFilename, pName, sizeof(Item.m_aFilename)); if(IsDir) str_format(Item.m_aName, sizeof(Item.m_aName), "%s/", pName); else str_copy(Item.m_aName, pName, min(static_cast(sizeof(Item.m_aName)), Length-3)); Item.m_IsDir = IsDir != 0; Item.m_IsLink = false; Item.m_StorageType = StorageType; pEditor->m_FileList.add(Item); return 0; } void CEditor::AddFileDialogEntry(int Index, CUIRect *pView) { m_FilesCur++; if(m_FilesCur-1 < m_FilesStartAt || m_FilesCur >= m_FilesStopAt) return; CUIRect Button, FileIcon; pView->HSplitTop(15.0f, &Button, pView); pView->HSplitTop(2.0f, 0, pView); Button.VSplitLeft(Button.h, &FileIcon, &Button); Button.VSplitLeft(5.0f, 0, &Button); Graphics()->TextureSet(g_pData->m_aImages[IMAGE_FILEICONS].m_Id); Graphics()->QuadsBegin(); RenderTools()->SelectSprite(m_FileList[Index].m_IsDir?SPRITE_FILE_FOLDER:SPRITE_FILE_MAP2); IGraphics::CQuadItem QuadItem(FileIcon.x, FileIcon.y, FileIcon.w, FileIcon.h); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); if(DoButton_File(&m_FileList[Index], m_FileList[Index].m_aName, m_FilesSelectedIndex == Index, &Button, 0, 0)) { if(!m_FileList[Index].m_IsDir) str_copy(m_aFileDialogFileName, m_FileList[Index].m_aFilename, sizeof(m_aFileDialogFileName)); else m_aFileDialogFileName[0] = 0; m_FilesSelectedIndex = Index; if(Input()->MouseDoubleClick()) m_aFileDialogActivate = true; } } void CEditor::RenderFileDialog() { // GUI coordsys Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); CUIRect View = *UI()->Screen(); float Width = View.w, Height = View.h; RenderTools()->DrawUIRect(&View, vec4(0,0,0,0.25f), 0, 0); View.VMargin(150.0f, &View); View.HMargin(50.0f, &View); RenderTools()->DrawUIRect(&View, vec4(0,0,0,0.75f), CUI::CORNER_ALL, 5.0f); View.Margin(10.0f, &View); CUIRect Title, FileBox, FileBoxLabel, ButtonBar, Scroll, PathBox; View.HSplitTop(18.0f, &Title, &View); View.HSplitTop(5.0f, 0, &View); // some spacing View.HSplitBottom(14.0f, &View, &ButtonBar); View.HSplitBottom(10.0f, &View, 0); // some spacing View.HSplitBottom(14.0f, &View, &PathBox); View.HSplitBottom(5.0f, &View, 0); // some spacing View.HSplitBottom(14.0f, &View, &FileBox); FileBox.VSplitLeft(55.0f, &FileBoxLabel, &FileBox); View.HSplitBottom(10.0f, &View, 0); // some spacing View.VSplitRight(15.0f, &View, &Scroll); // title RenderTools()->DrawUIRect(&Title, vec4(1, 1, 1, 0.25f), CUI::CORNER_ALL, 4.0f); Title.VMargin(10.0f, &Title); UI()->DoLabel(&Title, m_pFileDialogTitle, 12.0f, -1, -1); // pathbox char aPath[128], aBuf[128]; if(m_FilesSelectedIndex != -1) Storage()->GetCompletePath(m_FileList[m_FilesSelectedIndex].m_StorageType, m_pFileDialogPath, aPath, sizeof(aPath)); else aPath[0] = 0; str_format(aBuf, sizeof(aBuf), "Current path: %s", aPath); UI()->DoLabel(&PathBox, aBuf, 10.0f, -1, -1); // filebox if(m_FileDialogStorageType == IStorage::TYPE_SAVE) { static float s_FileBoxID = 0; UI()->DoLabel(&FileBoxLabel, "Filename:", 10.0f, -1, -1); if(DoEditBox(&s_FileBoxID, &FileBox, m_aFileDialogFileName, sizeof(m_aFileDialogFileName), 10.0f, &s_FileBoxID)) { // remove '/' and '\' for(int i = 0; m_aFileDialogFileName[i]; ++i) if(m_aFileDialogFileName[i] == '/' || m_aFileDialogFileName[i] == '\\') str_copy(&m_aFileDialogFileName[i], &m_aFileDialogFileName[i+1], (int)(sizeof(m_aFileDialogFileName))-i); m_FilesSelectedIndex = -1; } } int Num = (int)(View.h/17.0f)+1; static int ScrollBar = 0; Scroll.HMargin(5.0f, &Scroll); m_FileDialogScrollValue = UiDoScrollbarV(&ScrollBar, &Scroll, m_FileDialogScrollValue); int ScrollNum = m_FileList.size()-Num+1; if(ScrollNum > 0) { if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) m_FileDialogScrollValue -= 3.0f/ScrollNum; if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) m_FileDialogScrollValue += 3.0f/ScrollNum; } else ScrollNum = 0; if(m_FilesSelectedIndex > -1) { for(int i = 0; i < Input()->NumEvents(); i++) { int NewIndex = -1; if(Input()->GetEvent(i).m_Flags&IInput::FLAG_PRESS) { if(Input()->GetEvent(i).m_Key == KEY_DOWN) NewIndex = m_FilesSelectedIndex + 1; if(Input()->GetEvent(i).m_Key == KEY_UP) NewIndex = m_FilesSelectedIndex - 1; } if(NewIndex > -1 && NewIndex < m_FileList.size()) { //scroll float IndexY = View.y - m_FileDialogScrollValue*ScrollNum*17.0f + NewIndex*17.0f; int Scroll = View.y > IndexY ? -1 : View.y+View.h < IndexY+17.0f ? 1 : 0; if(Scroll) { if(Scroll < 0) m_FileDialogScrollValue = ((float)(NewIndex)+0.5f)/ScrollNum; else m_FileDialogScrollValue = ((float)(NewIndex-Num)+2.5f)/ScrollNum; } if(!m_FileList[NewIndex].m_IsDir) str_copy(m_aFileDialogFileName, m_FileList[NewIndex].m_aFilename, sizeof(m_aFileDialogFileName)); else m_aFileDialogFileName[0] = 0; m_FilesSelectedIndex = NewIndex; } } } for(int i = 0; i < Input()->NumEvents(); i++) { if(Input()->GetEvent(i).m_Flags&IInput::FLAG_PRESS) { if(Input()->GetEvent(i).m_Key == KEY_RETURN || Input()->GetEvent(i).m_Key == KEY_KP_ENTER) m_aFileDialogActivate = true; } } if(m_FileDialogScrollValue < 0) m_FileDialogScrollValue = 0; if(m_FileDialogScrollValue > 1) m_FileDialogScrollValue = 1; m_FilesStartAt = (int)(ScrollNum*m_FileDialogScrollValue); if(m_FilesStartAt < 0) m_FilesStartAt = 0; m_FilesStopAt = m_FilesStartAt+Num; m_FilesCur = 0; // set clipping UI()->ClipEnable(&View); for(int i = 0; i < m_FileList.size(); i++) AddFileDialogEntry(i, &View); // disable clipping again UI()->ClipDisable(); // the buttons static int s_OkButton = 0; static int s_CancelButton = 0; static int s_NewFolderButton = 0; static int s_MapInfoButton = 0; CUIRect Button; ButtonBar.VSplitRight(50.0f, &ButtonBar, &Button); bool IsDir = m_FilesSelectedIndex >= 0 && m_FileList[m_FilesSelectedIndex].m_IsDir; if(DoButton_Editor(&s_OkButton, IsDir ? "Open" : m_pFileDialogButtonText, 0, &Button, 0, 0) || m_aFileDialogActivate) { m_aFileDialogActivate = false; if(IsDir) // folder { if(str_comp(m_FileList[m_FilesSelectedIndex].m_aFilename, "..") == 0) // parent folder { if(fs_parent_dir(m_pFileDialogPath)) m_pFileDialogPath = m_aFileDialogCurrentFolder; // leave the link } else // sub folder { if(m_FileList[m_FilesSelectedIndex].m_IsLink) { m_pFileDialogPath = m_aFileDialogCurrentLink; // follow the link str_copy(m_aFileDialogCurrentLink, m_FileList[m_FilesSelectedIndex].m_aFilename, sizeof(m_aFileDialogCurrentLink)); } else { char aTemp[MAX_PATH_LENGTH]; str_copy(aTemp, m_pFileDialogPath, sizeof(aTemp)); str_format(m_pFileDialogPath, MAX_PATH_LENGTH, "%s/%s", aTemp, m_FileList[m_FilesSelectedIndex].m_aFilename); } } FilelistPopulate(!str_comp(m_pFileDialogPath, "maps") || !str_comp(m_pFileDialogPath, "mapres") ? m_FileDialogStorageType : m_FileList[m_FilesSelectedIndex].m_StorageType); if(m_FilesSelectedIndex >= 0 && !m_FileList[m_FilesSelectedIndex].m_IsDir) str_copy(m_aFileDialogFileName, m_FileList[m_FilesSelectedIndex].m_aFilename, sizeof(m_aFileDialogFileName)); else m_aFileDialogFileName[0] = 0; } else // file { str_format(m_aFileSaveName, sizeof(m_aFileSaveName), "%s/%s", m_pFileDialogPath, m_aFileDialogFileName); if(!str_comp(m_pFileDialogButtonText, "Save")) { IOHANDLE File = Storage()->OpenFile(m_aFileSaveName, IOFLAG_READ, IStorage::TYPE_SAVE); if(File) { io_close(File); m_PopupEventType = POPEVENT_SAVE; m_PopupEventActivated = true; } else if(m_pfnFileDialogFunc) m_pfnFileDialogFunc(m_aFileSaveName, m_FilesSelectedIndex >= 0 ? m_FileList[m_FilesSelectedIndex].m_StorageType : m_FileDialogStorageType, m_pFileDialogUser); } else if(m_pfnFileDialogFunc) m_pfnFileDialogFunc(m_aFileSaveName, m_FilesSelectedIndex >= 0 ? m_FileList[m_FilesSelectedIndex].m_StorageType : m_FileDialogStorageType, m_pFileDialogUser); } } ButtonBar.VSplitRight(40.0f, &ButtonBar, &Button); ButtonBar.VSplitRight(50.0f, &ButtonBar, &Button); if(DoButton_Editor(&s_CancelButton, "Cancel", 0, &Button, 0, 0) || Input()->KeyPressed(KEY_ESCAPE)) m_Dialog = DIALOG_NONE; if(m_FileDialogStorageType == IStorage::TYPE_SAVE) { ButtonBar.VSplitLeft(40.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(70.0f, &Button, &ButtonBar); if(DoButton_Editor(&s_NewFolderButton, "New folder", 0, &Button, 0, 0)) { m_FileDialogNewFolderName[0] = 0; m_FileDialogErrString[0] = 0; static int s_NewFolderPopupID = 0; UiInvokePopupMenu(&s_NewFolderPopupID, 0, Width/2.0f-200.0f, Height/2.0f-100.0f, 400.0f, 200.0f, PopupNewFolder); UI()->SetActiveItem(0); } } if(m_FileDialogStorageType == IStorage::TYPE_SAVE) { ButtonBar.VSplitLeft(40.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(70.0f, &Button, &ButtonBar); if(DoButton_Editor(&s_MapInfoButton, "Map details", 0, &Button, 0, 0)) { str_copy(m_Map.m_MapInfo.m_aAuthorTmp, m_Map.m_MapInfo.m_aAuthor, sizeof(m_Map.m_MapInfo.m_aAuthorTmp)); str_copy(m_Map.m_MapInfo.m_aVersionTmp, m_Map.m_MapInfo.m_aVersion, sizeof(m_Map.m_MapInfo.m_aVersionTmp)); str_copy(m_Map.m_MapInfo.m_aCreditsTmp, m_Map.m_MapInfo.m_aCredits, sizeof(m_Map.m_MapInfo.m_aCreditsTmp)); str_copy(m_Map.m_MapInfo.m_aLicenseTmp, m_Map.m_MapInfo.m_aLicense, sizeof(m_Map.m_MapInfo.m_aLicenseTmp)); static int s_MapInfoPopupID = 0; UiInvokePopupMenu(&s_MapInfoPopupID, 0, Width/2.0f-200.0f, Height/2.0f-100.0f, 400.0f, 200.0f, PopupMapInfo); UI()->SetActiveItem(0); } } } void CEditor::FilelistPopulate(int StorageType) { m_FileList.clear(); if(m_FileDialogStorageType != IStorage::TYPE_SAVE && !str_comp(m_pFileDialogPath, "maps")) { CFilelistItem Item; str_copy(Item.m_aFilename, "downloadedmaps", sizeof(Item.m_aFilename)); str_copy(Item.m_aName, "downloadedmaps/", sizeof(Item.m_aName)); Item.m_IsDir = true; Item.m_IsLink = true; Item.m_StorageType = IStorage::TYPE_SAVE; m_FileList.add(Item); } Storage()->ListDirectory(StorageType, m_pFileDialogPath, EditorListdirCallback, this); m_FilesSelectedIndex = m_FileList.size() ? 0 : -1; m_aFileDialogActivate = false; } void CEditor::InvokeFileDialog(int StorageType, int FileType, const char *pTitle, const char *pButtonText, const char *pBasePath, const char *pDefaultName, void (*pfnFunc)(const char *pFileName, int StorageType, void *pUser), void *pUser) { m_FileDialogStorageType = StorageType; m_pFileDialogTitle = pTitle; m_pFileDialogButtonText = pButtonText; m_pfnFileDialogFunc = pfnFunc; m_pFileDialogUser = pUser; m_aFileDialogFileName[0] = 0; m_aFileDialogCurrentFolder[0] = 0; m_aFileDialogCurrentLink[0] = 0; m_pFileDialogPath = m_aFileDialogCurrentFolder; m_FileDialogFileType = FileType; m_FileDialogScrollValue = 0.0f; if(pDefaultName) str_copy(m_aFileDialogFileName, pDefaultName, sizeof(m_aFileDialogFileName)); if(pBasePath) str_copy(m_aFileDialogCurrentFolder, pBasePath, sizeof(m_aFileDialogCurrentFolder)); FilelistPopulate(m_FileDialogStorageType); m_Dialog = DIALOG_FILE; } void CEditor::RenderModebar(CUIRect View) { CUIRect Button; // mode buttons { View.VSplitLeft(65.0f, &Button, &View); Button.HSplitTop(30.0f, 0, &Button); static int s_Button = 0; const char *pButName = m_Mode == MODE_LAYERS ? "Layers" : "Images"; if(DoButton_Tab(&s_Button, pButName, 0, &Button, 0, "Switch between images and layers managment.")) { if(m_Mode == MODE_LAYERS) m_Mode = MODE_IMAGES; else m_Mode = MODE_LAYERS; } } View.VSplitLeft(5.0f, 0, &View); } void CEditor::RenderStatusbar(CUIRect View) { CUIRect Button; View.VSplitRight(60.0f, &View, &Button); static int s_EnvelopeButton = 0; if(DoButton_Editor(&s_EnvelopeButton, "Envelopes", m_ShowEnvelopeEditor, &Button, 0, "Toggles the envelope editor.")) m_ShowEnvelopeEditor = (m_ShowEnvelopeEditor+1)%4; if(m_pTooltip) { if(ms_pUiGotContext && ms_pUiGotContext == UI()->HotItem()) { char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%s Right click for context menu.", m_pTooltip); UI()->DoLabel(&View, aBuf, 10.0f, -1, -1); } else UI()->DoLabel(&View, m_pTooltip, 10.0f, -1, -1); } } void CEditor::RenderEnvelopeEditor(CUIRect View) { if(m_SelectedEnvelope < 0) m_SelectedEnvelope = 0; if(m_SelectedEnvelope >= m_Map.m_lEnvelopes.size()) m_SelectedEnvelope = m_Map.m_lEnvelopes.size()-1; CEnvelope *pEnvelope = 0; if(m_SelectedEnvelope >= 0 && m_SelectedEnvelope < m_Map.m_lEnvelopes.size()) pEnvelope = m_Map.m_lEnvelopes[m_SelectedEnvelope]; CUIRect ToolBar, CurveBar, ColorBar; View.HSplitTop(15.0f, &ToolBar, &View); View.HSplitTop(15.0f, &CurveBar, &View); ToolBar.Margin(2.0f, &ToolBar); CurveBar.Margin(2.0f, &CurveBar); // do the toolbar { CUIRect Button; CEnvelope *pNewEnv = 0; ToolBar.VSplitRight(50.0f, &ToolBar, &Button); static int s_New4dButton = 0; if(DoButton_Editor(&s_New4dButton, "Color+", 0, &Button, 0, "Creates a new color envelope")) { m_Map.m_Modified = true; pNewEnv = m_Map.NewEnvelope(4); } ToolBar.VSplitRight(5.0f, &ToolBar, &Button); ToolBar.VSplitRight(50.0f, &ToolBar, &Button); static int s_New2dButton = 0; if(DoButton_Editor(&s_New2dButton, "Pos.+", 0, &Button, 0, "Creates a new pos envelope")) { m_Map.m_Modified = true; pNewEnv = m_Map.NewEnvelope(3); } // Delete button if(m_SelectedEnvelope >= 0) { ToolBar.VSplitRight(10.0f, &ToolBar, &Button); ToolBar.VSplitRight(50.0f, &ToolBar, &Button); static int s_DelButton = 0; if(DoButton_Editor(&s_DelButton, "Delete", 0, &Button, 0, "Delete this envelope")) { m_Map.m_Modified = true; m_Map.DeleteEnvelope(m_SelectedEnvelope); if(m_SelectedEnvelope >= m_Map.m_lEnvelopes.size()) m_SelectedEnvelope = m_Map.m_lEnvelopes.size()-1; pEnvelope = m_SelectedEnvelope >= 0 ? m_Map.m_lEnvelopes[m_SelectedEnvelope] : 0; } } if(pNewEnv) // add the default points { if(pNewEnv->m_Channels == 4) { pNewEnv->AddPoint(0, 1,1,1,1); pNewEnv->AddPoint(1000, 1,1,1,1); } else { pNewEnv->AddPoint(0, 0); pNewEnv->AddPoint(1000, 0); } } CUIRect Shifter, Inc, Dec; ToolBar.VSplitLeft(60.0f, &Shifter, &ToolBar); Shifter.VSplitRight(15.0f, &Shifter, &Inc); Shifter.VSplitLeft(15.0f, &Dec, &Shifter); char aBuf[512]; str_format(aBuf, sizeof(aBuf),"%d/%d", m_SelectedEnvelope+1, m_Map.m_lEnvelopes.size()); RenderTools()->DrawUIRect(&Shifter, vec4(1,1,1,0.5f), 0, 0.0f); UI()->DoLabel(&Shifter, aBuf, 10.0f, 0, -1); static int s_PrevButton = 0; if(DoButton_ButtonDec(&s_PrevButton, 0, 0, &Dec, 0, "Previous Envelope")) m_SelectedEnvelope--; static int s_NextButton = 0; if(DoButton_ButtonInc(&s_NextButton, 0, 0, &Inc, 0, "Next Envelope")) m_SelectedEnvelope++; if(pEnvelope) { ToolBar.VSplitLeft(15.0f, &Button, &ToolBar); ToolBar.VSplitLeft(35.0f, &Button, &ToolBar); UI()->DoLabel(&Button, "Name:", 10.0f, -1, -1); ToolBar.VSplitLeft(80.0f, &Button, &ToolBar); static float s_NameBox = 0; if(DoEditBox(&s_NameBox, &Button, pEnvelope->m_aName, sizeof(pEnvelope->m_aName), 10.0f, &s_NameBox)) m_Map.m_Modified = true; } } bool ShowColorBar = false; if(pEnvelope && pEnvelope->m_Channels == 4) { ShowColorBar = true; View.HSplitTop(20.0f, &ColorBar, &View); ColorBar.Margin(2.0f, &ColorBar); RenderBackground(ColorBar, ms_CheckerTexture, 16.0f, 1.0f); } RenderBackground(View, ms_CheckerTexture, 32.0f, 0.1f); if(pEnvelope) { static array Selection; static int sEnvelopeEditorID = 0; static int s_ActiveChannels = 0xf; if(pEnvelope) { CUIRect Button; ToolBar.VSplitLeft(15.0f, &Button, &ToolBar); static const char *s_paNames[2][4] = { {"X", "Y", "R", ""}, {"R", "G", "B", "A"}, }; const char *paDescriptions[2][4] = { {"X-axis of the envelope", "Y-axis of the envelope", "Rotation of the envelope", ""}, {"Red value of the envelope", "Green value of the envelope", "Blue value of the envelope", "Alpha value of the envelope"}, }; static int s_aChannelButtons[4] = {0}; int Bit = 1; //ui_draw_button_func draw_func; for(int i = 0; i < pEnvelope->m_Channels; i++, Bit<<=1) { ToolBar.VSplitLeft(15.0f, &Button, &ToolBar); /*if(i == 0) draw_func = draw_editor_button_l; else if(i == envelope->channels-1) draw_func = draw_editor_button_r; else draw_func = draw_editor_button_m;*/ if(DoButton_Editor(&s_aChannelButtons[i], s_paNames[pEnvelope->m_Channels-3][i], s_ActiveChannels&Bit, &Button, 0, paDescriptions[pEnvelope->m_Channels-3][i])) s_ActiveChannels ^= Bit; } // sync checkbox ToolBar.VSplitLeft(15.0f, &Button, &ToolBar); ToolBar.VSplitLeft(12.0f, &Button, &ToolBar); static int s_SyncButton; if(DoButton_Editor(&s_SyncButton, pEnvelope->m_Synchronized?"X":"", 0, &Button, 0, "Enable envelope synchronization between clients")) pEnvelope->m_Synchronized = !pEnvelope->m_Synchronized; ToolBar.VSplitLeft(4.0f, &Button, &ToolBar); ToolBar.VSplitLeft(80.0f, &Button, &ToolBar); UI()->DoLabel(&Button, "Synchronized", 10.0f, -1, -1); } float EndTime = pEnvelope->EndTime(); if(EndTime < 1) EndTime = 1; pEnvelope->FindTopBottom(s_ActiveChannels); float Top = pEnvelope->m_Top; float Bottom = pEnvelope->m_Bottom; if(Top < 1) Top = 1; if(Bottom >= 0) Bottom = 0; float TimeScale = EndTime/View.w; float ValueScale = (Top-Bottom)/View.h; if(UI()->MouseInside(&View)) UI()->SetHotItem(&sEnvelopeEditorID); if(UI()->HotItem() == &sEnvelopeEditorID) { // do stuff if(pEnvelope) { if(UI()->MouseButtonClicked(1)) { // add point int Time = (int)(((UI()->MouseX()-View.x)*TimeScale)*1000.0f); //float env_y = (UI()->MouseY()-view.y)/TimeScale; float aChannels[4]; pEnvelope->Eval(Time, aChannels); pEnvelope->AddPoint(Time, f2fx(aChannels[0]), f2fx(aChannels[1]), f2fx(aChannels[2]), f2fx(aChannels[3])); m_Map.m_Modified = true; } m_ShowEnvelopePreview = 1; m_pTooltip = "Press right mouse button to create a new point"; } } vec3 aColors[] = {vec3(1,0.2f,0.2f), vec3(0.2f,1,0.2f), vec3(0.2f,0.2f,1), vec3(1,1,0.2f)}; // render lines { UI()->ClipEnable(&View); Graphics()->TextureSet(-1); Graphics()->LinesBegin(); for(int c = 0; c < pEnvelope->m_Channels; c++) { if(s_ActiveChannels&(1<SetColor(aColors[c].r,aColors[c].g,aColors[c].b,1); else Graphics()->SetColor(aColors[c].r*0.5f,aColors[c].g*0.5f,aColors[c].b*0.5f,1); float PrevX = 0; float aResults[4]; pEnvelope->Eval(0.000001f, aResults); float PrevValue = aResults[c]; int Steps = (int)((View.w/UI()->Screen()->w) * Graphics()->ScreenWidth()); for(int i = 1; i <= Steps; i++) { float a = i/(float)Steps; pEnvelope->Eval(a*EndTime, aResults); float v = aResults[c]; v = (v-Bottom)/(Top-Bottom); IGraphics::CLineItem LineItem(View.x + PrevX*View.w, View.y+View.h - PrevValue*View.h, View.x + a*View.w, View.y+View.h - v*View.h); Graphics()->LinesDraw(&LineItem, 1); PrevX = a; PrevValue = v; } } Graphics()->LinesEnd(); UI()->ClipDisable(); } // render curve options { for(int i = 0; i < pEnvelope->m_lPoints.size()-1; i++) { float t0 = pEnvelope->m_lPoints[i].m_Time/1000.0f/EndTime; float t1 = pEnvelope->m_lPoints[i+1].m_Time/1000.0f/EndTime; //dbg_msg("", "%f", end_time); CUIRect v; v.x = CurveBar.x + (t0+(t1-t0)*0.5f) * CurveBar.w; v.y = CurveBar.y; v.h = CurveBar.h; v.w = CurveBar.h; v.x -= v.w/2; void *pID = &pEnvelope->m_lPoints[i].m_Curvetype; const char *paTypeName[] = { "N", "L", "S", "F", "M" }; if(DoButton_Editor(pID, paTypeName[pEnvelope->m_lPoints[i].m_Curvetype], 0, &v, 0, "Switch curve type")) pEnvelope->m_lPoints[i].m_Curvetype = (pEnvelope->m_lPoints[i].m_Curvetype+1)%NUM_CURVETYPES; } } // render colorbar if(ShowColorBar) { Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); for(int i = 0; i < pEnvelope->m_lPoints.size()-1; i++) { float r0 = fx2f(pEnvelope->m_lPoints[i].m_aValues[0]); float g0 = fx2f(pEnvelope->m_lPoints[i].m_aValues[1]); float b0 = fx2f(pEnvelope->m_lPoints[i].m_aValues[2]); float a0 = fx2f(pEnvelope->m_lPoints[i].m_aValues[3]); float r1 = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[0]); float g1 = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[1]); float b1 = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[2]); float a1 = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[3]); IGraphics::CColorVertex Array[4] = {IGraphics::CColorVertex(0, r0, g0, b0, a0), IGraphics::CColorVertex(1, r1, g1, b1, a1), IGraphics::CColorVertex(2, r1, g1, b1, a1), IGraphics::CColorVertex(3, r0, g0, b0, a0)}; Graphics()->SetColorVertex(Array, 4); float x0 = pEnvelope->m_lPoints[i].m_Time/1000.0f/EndTime; // float y0 = (fx2f(envelope->points[i].values[c])-bottom)/(top-bottom); float x1 = pEnvelope->m_lPoints[i+1].m_Time/1000.0f/EndTime; //float y1 = (fx2f(envelope->points[i+1].values[c])-bottom)/(top-bottom); CUIRect v; v.x = ColorBar.x + x0*ColorBar.w; v.y = ColorBar.y; v.w = (x1-x0)*ColorBar.w; v.h = ColorBar.h; IGraphics::CQuadItem QuadItem(v.x, v.y, v.w, v.h); Graphics()->QuadsDrawTL(&QuadItem, 1); } Graphics()->QuadsEnd(); } // render handles { int CurrentValue = 0, CurrentTime = 0; Graphics()->TextureSet(-1); Graphics()->QuadsBegin(); for(int c = 0; c < pEnvelope->m_Channels; c++) { if(!(s_ActiveChannels&(1<m_lPoints.size(); i++) { float x0 = pEnvelope->m_lPoints[i].m_Time/1000.0f/EndTime; float y0 = (fx2f(pEnvelope->m_lPoints[i].m_aValues[c])-Bottom)/(Top-Bottom); CUIRect Final; Final.x = View.x + x0*View.w; Final.y = View.y+View.h - y0*View.h; Final.x -= 2.0f; Final.y -= 2.0f; Final.w = 4.0f; Final.h = 4.0f; void *pID = &pEnvelope->m_lPoints[i].m_aValues[c]; if(UI()->MouseInside(&Final)) UI()->SetHotItem(pID); float ColorMod = 1.0f; if(UI()->ActiveItem() == pID) { if(!UI()->MouseButton(0)) { m_SelectedQuadEnvelope = -1; m_SelectedEnvelopePoint = -1; UI()->SetActiveItem(0); } else { if(Input()->KeyPressed(KEY_LSHIFT) || Input()->KeyPressed(KEY_RSHIFT)) { if(i != 0) { if((Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL))) pEnvelope->m_lPoints[i].m_Time += (int)((m_MouseDeltaX)); else pEnvelope->m_lPoints[i].m_Time += (int)((m_MouseDeltaX*TimeScale)*1000.0f); if(pEnvelope->m_lPoints[i].m_Time < pEnvelope->m_lPoints[i-1].m_Time) pEnvelope->m_lPoints[i].m_Time = pEnvelope->m_lPoints[i-1].m_Time + 1; if(i+1 != pEnvelope->m_lPoints.size() && pEnvelope->m_lPoints[i].m_Time > pEnvelope->m_lPoints[i+1].m_Time) pEnvelope->m_lPoints[i].m_Time = pEnvelope->m_lPoints[i+1].m_Time - 1; } } else { if((Input()->KeyPressed(KEY_LCTRL) || Input()->KeyPressed(KEY_RCTRL))) pEnvelope->m_lPoints[i].m_aValues[c] -= f2fx(m_MouseDeltaY*0.001f); else pEnvelope->m_lPoints[i].m_aValues[c] -= f2fx(m_MouseDeltaY*ValueScale); } m_SelectedQuadEnvelope = m_SelectedEnvelope; m_ShowEnvelopePreview = 1; m_SelectedEnvelopePoint = i; m_Map.m_Modified = true; } ColorMod = 100.0f; Graphics()->SetColor(1,1,1,1); } else if(UI()->HotItem() == pID) { if(UI()->MouseButton(0)) { Selection.clear(); Selection.add(i); UI()->SetActiveItem(pID); } // remove point if(UI()->MouseButtonClicked(1)) { pEnvelope->m_lPoints.remove_index(i); m_Map.m_Modified = true; } m_ShowEnvelopePreview = 1; ColorMod = 100.0f; Graphics()->SetColor(1,0.75f,0.75f,1); m_pTooltip = "Left mouse to drag. Hold ctrl to be more precise. Hold shift to alter time point aswell. Right click to delete."; } if(UI()->ActiveItem() == pID || UI()->HotItem() == pID) { CurrentTime = pEnvelope->m_lPoints[i].m_Time; CurrentValue = pEnvelope->m_lPoints[i].m_aValues[c]; } if (m_SelectedQuadEnvelope == m_SelectedEnvelope && m_SelectedEnvelopePoint == i) Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); else Graphics()->SetColor(aColors[c].r*ColorMod, aColors[c].g*ColorMod, aColors[c].b*ColorMod, 1.0f); IGraphics::CQuadItem QuadItem(Final.x, Final.y, Final.w, Final.h); Graphics()->QuadsDrawTL(&QuadItem, 1); } } Graphics()->QuadsEnd(); char aBuf[512]; str_format(aBuf, sizeof(aBuf),"%.3f %.3f", CurrentTime/1000.0f, fx2f(CurrentValue)); UI()->DoLabel(&ToolBar, aBuf, 10.0f, 0, -1); } } } int CEditor::PopupMenuFile(CEditor *pEditor, CUIRect View) { static int s_NewMapButton = 0; static int s_SaveButton = 0; static int s_SaveAsButton = 0; static int s_OpenButton = 0; static int s_AppendButton = 0; static int s_ExitButton = 0; CUIRect Slot; View.HSplitTop(2.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_NewMapButton, "New", 0, &Slot, 0, "Creates a new map")) { if(pEditor->HasUnsavedData()) { pEditor->m_PopupEventType = POPEVENT_NEW; pEditor->m_PopupEventActivated = true; } else { pEditor->Reset(); pEditor->m_aFileName[0] = 0; } return 1; } View.HSplitTop(10.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_OpenButton, "Load", 0, &Slot, 0, "Opens a map for editing")) { if(pEditor->HasUnsavedData()) { pEditor->m_PopupEventType = POPEVENT_LOAD; pEditor->m_PopupEventActivated = true; } else pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Load map", "Load", "maps", "", pEditor->CallbackOpenMap, pEditor); return 1; } View.HSplitTop(10.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_AppendButton, "Append", 0, &Slot, 0, "Opens a map and adds everything from that map to the current one")) { pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Append map", "Append", "maps", "", pEditor->CallbackAppendMap, pEditor); return 1; } View.HSplitTop(10.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_SaveButton, "Save", 0, &Slot, 0, "Saves the current map")) { if(pEditor->m_aFileName[0] && pEditor->m_ValidSaveFilename) { str_copy(pEditor->m_aFileSaveName, pEditor->m_aFileName, sizeof(pEditor->m_aFileSaveName)); pEditor->m_PopupEventType = POPEVENT_SAVE; pEditor->m_PopupEventActivated = true; } else pEditor->InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save", "maps", "", pEditor->CallbackSaveMap, pEditor); return 1; } View.HSplitTop(2.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_SaveAsButton, "Save As", 0, &Slot, 0, "Saves the current map under a new name")) { pEditor->InvokeFileDialog(IStorage::TYPE_SAVE, FILETYPE_MAP, "Save map", "Save", "maps", "", pEditor->CallbackSaveMap, pEditor); return 1; } View.HSplitTop(10.0f, &Slot, &View); View.HSplitTop(12.0f, &Slot, &View); if(pEditor->DoButton_MenuItem(&s_ExitButton, "Exit", 0, &Slot, 0, "Exits from the editor")) { if(pEditor->HasUnsavedData()) { pEditor->m_PopupEventType = POPEVENT_EXIT; pEditor->m_PopupEventActivated = true; } else g_Config.m_ClEditor = 0; return 1; } return 0; } void CEditor::RenderMenubar(CUIRect MenuBar) { static CUIRect s_File /*, view, help*/; MenuBar.VSplitLeft(60.0f, &s_File, &MenuBar); if(DoButton_Menu(&s_File, "File", 0, &s_File, 0, 0)) UiInvokePopupMenu(&s_File, 1, s_File.x, s_File.y+s_File.h-1.0f, 120, 150, PopupMenuFile, this); /* menubar.VSplitLeft(5.0f, 0, &menubar); menubar.VSplitLeft(60.0f, &view, &menubar); if(do_editor_button(&view, "View", 0, &view, draw_editor_button_menu, 0, 0)) (void)0; menubar.VSplitLeft(5.0f, 0, &menubar); menubar.VSplitLeft(60.0f, &help, &menubar); if(do_editor_button(&help, "Help", 0, &help, draw_editor_button_menu, 0, 0)) (void)0; */ CUIRect Info; MenuBar.VSplitLeft(40.0f, 0, &MenuBar); MenuBar.VSplitLeft(MenuBar.w*0.75f, &MenuBar, &Info); char aBuf[128]; str_format(aBuf, sizeof(aBuf), "File: %s", m_aFileName); UI()->DoLabel(&MenuBar, aBuf, 10.0f, -1, -1); str_format(aBuf, sizeof(aBuf), "Z: %i, A: %.1f, G: %i", m_ZoomLevel, m_AnimateSpeed, m_GridFactor); UI()->DoLabel(&Info, aBuf, 10.0f, 1, -1); } void CEditor::Render() { // basic start Graphics()->Clear(1.0f, 0.0f, 1.0f); CUIRect View = *UI()->Screen(); Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); float Width = View.w; float Height = View.h; // reset tip m_pTooltip = 0; if(m_EditBoxActive) --m_EditBoxActive; // render checker RenderBackground(View, ms_CheckerTexture, 32.0f, 1.0f); CUIRect MenuBar, CModeBar, ToolBar, StatusBar, EnvelopeEditor, ToolBox; m_ShowPicker = Input()->KeyPressed(KEY_SPACE) != 0 && m_Dialog == DIALOG_NONE; if(m_GuiActive) { View.HSplitTop(16.0f, &MenuBar, &View); View.HSplitTop(53.0f, &ToolBar, &View); View.VSplitLeft(100.0f, &ToolBox, &View); View.HSplitBottom(16.0f, &View, &StatusBar); if(m_ShowEnvelopeEditor && !m_ShowPicker) { float size = 125.0f; if(m_ShowEnvelopeEditor == 2) size *= 2.0f; else if(m_ShowEnvelopeEditor == 3) size *= 3.0f; View.HSplitBottom(size, &View, &EnvelopeEditor); } } // a little hack for now if(m_Mode == MODE_LAYERS) DoMapEditor(View, ToolBar); // do zooming if(Input()->KeyDown(KEY_KP_MINUS)) m_ZoomLevel += 50; if(Input()->KeyDown(KEY_KP_PLUS)) m_ZoomLevel -= 50; if(Input()->KeyDown(KEY_KP_MULTIPLY)) { m_EditorOffsetX = 0; m_EditorOffsetY = 0; m_ZoomLevel = 100; } if(m_Dialog == DIALOG_NONE && UI()->MouseInside(&View)) { if(Input()->KeyPresses(KEY_MOUSE_WHEEL_UP)) m_ZoomLevel -= 20; if(Input()->KeyPresses(KEY_MOUSE_WHEEL_DOWN)) m_ZoomLevel += 20; } m_ZoomLevel = clamp(m_ZoomLevel, 50, 2000); m_WorldZoom = m_ZoomLevel/100.0f; if(m_GuiActive) { float Brightness = 0.25f; RenderBackground(MenuBar, ms_BackgroundTexture, 128.0f, Brightness*0); MenuBar.Margin(2.0f, &MenuBar); RenderBackground(ToolBox, ms_BackgroundTexture, 128.0f, Brightness); ToolBox.Margin(2.0f, &ToolBox); RenderBackground(ToolBar, ms_BackgroundTexture, 128.0f, Brightness); ToolBar.Margin(2.0f, &ToolBar); ToolBar.VSplitLeft(100.0f, &CModeBar, &ToolBar); RenderBackground(StatusBar, ms_BackgroundTexture, 128.0f, Brightness); StatusBar.Margin(2.0f, &StatusBar); // do the toolbar if(m_Mode == MODE_LAYERS) DoToolbar(ToolBar); if(m_ShowEnvelopeEditor) { RenderBackground(EnvelopeEditor, ms_BackgroundTexture, 128.0f, Brightness); EnvelopeEditor.Margin(2.0f, &EnvelopeEditor); } } if(m_Mode == MODE_LAYERS) RenderLayers(ToolBox, ToolBar, View); else if(m_Mode == MODE_IMAGES) RenderImages(ToolBox, ToolBar, View); Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); if(m_GuiActive) { RenderMenubar(MenuBar); RenderModebar(CModeBar); if(m_ShowEnvelopeEditor) RenderEnvelopeEditor(EnvelopeEditor); } if(m_Dialog == DIALOG_FILE) { static int s_NullUiTarget = 0; UI()->SetHotItem(&s_NullUiTarget); RenderFileDialog(); } if(m_PopupEventActivated) { static int s_PopupID = 0; UiInvokePopupMenu(&s_PopupID, 0, Width/2.0f-200.0f, Height/2.0f-100.0f, 400.0f, 200.0f, PopupEvent); m_PopupEventActivated = false; m_PopupEventWasActivated = true; } UiDoPopupMenu(); if(m_GuiActive) RenderStatusbar(StatusBar); // if(g_Config.m_EdShowkeys) { Graphics()->MapScreen(UI()->Screen()->x, UI()->Screen()->y, UI()->Screen()->w, UI()->Screen()->h); CTextCursor Cursor; TextRender()->SetCursor(&Cursor, View.x+10, View.y+View.h-24-10, 24.0f, TEXTFLAG_RENDER); int NKeys = 0; for(int i = 0; i < KEY_LAST; i++) { if(Input()->KeyPressed(i)) { if(NKeys) TextRender()->TextEx(&Cursor, " + ", -1); TextRender()->TextEx(&Cursor, Input()->KeyName(i), -1); NKeys++; } } } if(m_ShowMousePointer) { // render butt ugly mouse cursor float mx = UI()->MouseX(); float my = UI()->MouseY(); Graphics()->TextureSet(ms_CursorTexture); Graphics()->QuadsBegin(); if(ms_pUiGotContext == UI()->HotItem()) Graphics()->SetColor(1,0,0,1); IGraphics::CQuadItem QuadItem(mx,my, 16.0f, 16.0f); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } } void CEditor::Reset(bool CreateDefault) { m_Map.Clean(); // create default layers if(CreateDefault) m_Map.CreateDefault(ms_EntitiesTexture); /* { }*/ m_SelectedLayer = 0; m_SelectedGroup = 0; m_SelectedQuad = -1; m_SelectedPoints = 0; m_SelectedEnvelope = 0; m_SelectedImage = 0; m_WorldOffsetX = 0; m_WorldOffsetY = 0; m_EditorOffsetX = 0.0f; m_EditorOffsetY = 0.0f; m_WorldZoom = 1.0f; m_ZoomLevel = 200; m_MouseDeltaX = 0; m_MouseDeltaY = 0; m_MouseDeltaWx = 0; m_MouseDeltaWy = 0; m_Map.m_Modified = false; m_ShowEnvelopePreview = 0; } int CEditor::GetLineDistance() { int LineDistance = 512; if(m_ZoomLevel <= 100) LineDistance = 16; else if(m_ZoomLevel <= 250) LineDistance = 32; else if(m_ZoomLevel <= 450) LineDistance = 64; else if(m_ZoomLevel <= 850) LineDistance = 128; else if(m_ZoomLevel <= 1550) LineDistance = 256; return LineDistance; } void CEditorMap::DeleteEnvelope(int Index) { if(Index < 0 || Index >= m_lEnvelopes.size()) return; m_Modified = true; // fix links between envelopes and quads for(int i = 0; i < m_lGroups.size(); ++i) for(int j = 0; j < m_lGroups[i]->m_lLayers.size(); ++j) if(m_lGroups[i]->m_lLayers[j]->m_Type == LAYERTYPE_QUADS) { CLayerQuads *pLayer = static_cast(m_lGroups[i]->m_lLayers[j]); for(int k = 0; k < pLayer->m_lQuads.size(); ++k) { if(pLayer->m_lQuads[k].m_PosEnv == Index) pLayer->m_lQuads[k].m_PosEnv = -1; else if(pLayer->m_lQuads[k].m_PosEnv > Index) pLayer->m_lQuads[k].m_PosEnv--; if(pLayer->m_lQuads[k].m_ColorEnv == Index) pLayer->m_lQuads[k].m_ColorEnv = -1; else if(pLayer->m_lQuads[k].m_ColorEnv > Index) pLayer->m_lQuads[k].m_ColorEnv--; } } else if(m_lGroups[i]->m_lLayers[j]->m_Type == LAYERTYPE_TILES) { CLayerTiles *pLayer = static_cast(m_lGroups[i]->m_lLayers[j]); if(pLayer->m_ColorEnv == Index) pLayer->m_ColorEnv = -1; if(pLayer->m_ColorEnv > Index) pLayer->m_ColorEnv--; } m_lEnvelopes.remove_index(Index); } void CEditorMap::MakeGameLayer(CLayer *pLayer) { m_pGameLayer = (CLayerGame *)pLayer; m_pGameLayer->m_pEditor = m_pEditor; m_pGameLayer->m_TexID = m_pEditor->ms_EntitiesTexture; } void CEditorMap::MakeGameGroup(CLayerGroup *pGroup) { m_pGameGroup = pGroup; m_pGameGroup->m_GameGroup = true; str_copy(m_pGameGroup->m_aName, "Game", sizeof(m_pGameGroup->m_aName)); } void CEditorMap::Clean() { m_lGroups.delete_all(); m_lEnvelopes.delete_all(); m_lImages.delete_all(); m_MapInfo.Reset(); m_pGameLayer = 0x0; m_pGameGroup = 0x0; m_Modified = false; } void CEditorMap::CreateDefault(int EntitiesTexture) { // add background CLayerGroup *pGroup = NewGroup(); pGroup->m_ParallaxX = 0; pGroup->m_ParallaxY = 0; CLayerQuads *pLayer = new CLayerQuads; pLayer->m_pEditor = m_pEditor; CQuad *pQuad = pLayer->NewQuad(); const int Width = 800000; const int Height = 600000; pQuad->m_aPoints[0].x = pQuad->m_aPoints[2].x = -Width; pQuad->m_aPoints[1].x = pQuad->m_aPoints[3].x = Width; pQuad->m_aPoints[0].y = pQuad->m_aPoints[1].y = -Height; pQuad->m_aPoints[2].y = pQuad->m_aPoints[3].y = Height; pQuad->m_aColors[0].r = pQuad->m_aColors[1].r = 94; pQuad->m_aColors[0].g = pQuad->m_aColors[1].g = 132; pQuad->m_aColors[0].b = pQuad->m_aColors[1].b = 174; pQuad->m_aColors[2].r = pQuad->m_aColors[3].r = 204; pQuad->m_aColors[2].g = pQuad->m_aColors[3].g = 232; pQuad->m_aColors[2].b = pQuad->m_aColors[3].b = 255; pGroup->AddLayer(pLayer); // add game layer MakeGameGroup(NewGroup()); MakeGameLayer(new CLayerGame(50, 50)); m_pGameGroup->AddLayer(m_pGameLayer); } void CEditor::Init() { m_pInput = Kernel()->RequestInterface(); m_pClient = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); m_pGraphics = Kernel()->RequestInterface(); m_pTextRender = Kernel()->RequestInterface(); m_pStorage = Kernel()->RequestInterface(); m_RenderTools.m_pGraphics = m_pGraphics; m_RenderTools.m_pUI = &m_UI; m_UI.SetGraphics(m_pGraphics, m_pTextRender); m_Map.m_pEditor = this; ms_CheckerTexture = Graphics()->LoadTexture("editor/checker.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); ms_BackgroundTexture = Graphics()->LoadTexture("editor/background.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); ms_CursorTexture = Graphics()->LoadTexture("editor/cursor.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); ms_EntitiesTexture = Graphics()->LoadTexture("editor/entities.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); m_TilesetPicker.m_pEditor = this; m_TilesetPicker.MakePalette(); m_TilesetPicker.m_Readonly = true; m_Brush.m_pMap = &m_Map; Reset(); m_Map.m_Modified = false; } void CEditor::DoMapBorder() { CLayerTiles *pT = (CLayerTiles *)GetSelectedLayerType(0, LAYERTYPE_TILES); for(int i = 0; i < pT->m_Width*2; ++i) pT->m_pTiles[i].m_Index = 1; for(int i = 0; i < pT->m_Width*pT->m_Height; ++i) { if(i%pT->m_Width < 2 || i%pT->m_Width > pT->m_Width-3) pT->m_pTiles[i].m_Index = 1; } for(int i = (pT->m_Width*(pT->m_Height-2)); i < pT->m_Width*pT->m_Height; ++i) pT->m_pTiles[i].m_Index = 1; } void CEditor::UpdateAndRender() { static float s_MouseX = 0.0f; static float s_MouseY = 0.0f; if(m_Animate) m_AnimateTime = (time_get()-m_AnimateStart)/(float)time_freq(); else m_AnimateTime = 0; ms_pUiGotContext = 0; // handle mouse movement float mx, my, Mwx, Mwy; float rx, ry; { Input()->MouseRelative(&rx, &ry); UI()->ConvertMouseMove(&rx, &ry); m_MouseDeltaX = rx; m_MouseDeltaY = ry; if(!m_LockMouse) { s_MouseX += rx; s_MouseY += ry; } s_MouseX = clamp(s_MouseX, 0.0f, UI()->Screen()->w); s_MouseY = clamp(s_MouseY, 0.0f, UI()->Screen()->h); // update the ui mx = s_MouseX; my = s_MouseY; Mwx = 0; Mwy = 0; // fix correct world x and y CLayerGroup *g = GetSelectedGroup(); if(g) { float aPoints[4]; g->Mapping(aPoints); float WorldWidth = aPoints[2]-aPoints[0]; float WorldHeight = aPoints[3]-aPoints[1]; Mwx = aPoints[0] + WorldWidth * (s_MouseX/UI()->Screen()->w); Mwy = aPoints[1] + WorldHeight * (s_MouseY/UI()->Screen()->h); m_MouseDeltaWx = m_MouseDeltaX*(WorldWidth / UI()->Screen()->w); m_MouseDeltaWy = m_MouseDeltaY*(WorldHeight / UI()->Screen()->h); } int Buttons = 0; if(Input()->KeyPressed(KEY_MOUSE_1)) Buttons |= 1; if(Input()->KeyPressed(KEY_MOUSE_2)) Buttons |= 2; if(Input()->KeyPressed(KEY_MOUSE_3)) Buttons |= 4; UI()->Update(mx,my,Mwx,Mwy,Buttons); } // toggle gui if(Input()->KeyDown(KEY_TAB)) m_GuiActive = !m_GuiActive; if(Input()->KeyDown(KEY_F10)) m_ShowMousePointer = false; Render(); if(Input()->KeyDown(KEY_F10)) { Graphics()->TakeScreenshot(0); m_ShowMousePointer = true; } Input()->ClearEvents(); } IEditor *CreateEditor() { return new CEditor; } teeworlds-0.6.2+dfsg/src/game/editor/editor.h0000644000175000017500000004605712140200333020073 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_EDITOR_EDITOR_H #define GAME_EDITOR_EDITOR_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "auto_map.h" typedef void (*INDEX_MODIFY_FUNC)(int *pIndex); //CRenderTools m_RenderTools; // CEditor SPECIFIC enum { MODE_LAYERS=0, MODE_IMAGES, DIALOG_NONE=0, DIALOG_FILE, }; struct CEntity { CPoint m_Position; int m_Type; }; class CEnvelope { public: int m_Channels; array m_lPoints; char m_aName[32]; float m_Bottom, m_Top; bool m_Synchronized; CEnvelope(int Chan) { m_Channels = Chan; m_aName[0] = 0; m_Bottom = 0; m_Top = 0; m_Synchronized = true; } void Resort() { sort(m_lPoints.all()); FindTopBottom(0xf); } void FindTopBottom(int ChannelMask) { m_Top = -1000000000.0f; m_Bottom = 1000000000.0f; for(int i = 0; i < m_lPoints.size(); i++) { for(int c = 0; c < m_Channels; c++) { if(ChannelMask&(1< m_Top) m_Top = v; if(v < m_Bottom) m_Bottom = v; } } } } int Eval(float Time, float *pResult) { CRenderTools::RenderEvalEnvelope(m_lPoints.base_ptr(), m_lPoints.size(), m_Channels, Time, pResult); return m_Channels; } void AddPoint(int Time, int v0, int v1=0, int v2=0, int v3=0) { CEnvPoint p; p.m_Time = Time; p.m_aValues[0] = v0; p.m_aValues[1] = v1; p.m_aValues[2] = v2; p.m_aValues[3] = v3; p.m_Curvetype = CURVETYPE_LINEAR; m_lPoints.add(p); Resort(); } float EndTime() { if(m_lPoints.size()) return m_lPoints[m_lPoints.size()-1].m_Time*(1.0f/1000.0f); return 0; } }; class CLayer; class CLayerGroup; class CEditorMap; class CLayer { public: class CEditor *m_pEditor; class IGraphics *Graphics(); class ITextRender *TextRender(); CLayer() { m_Type = LAYERTYPE_INVALID; str_copy(m_aName, "(invalid)", sizeof(m_aName)); m_Visible = true; m_Readonly = false; m_SaveToMap = true; m_Flags = 0; m_pEditor = 0; } virtual ~CLayer() { } virtual void BrushSelecting(CUIRect Rect) {} virtual int BrushGrab(CLayerGroup *pBrush, CUIRect Rect) { return 0; } virtual void FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect) {} virtual void BrushDraw(CLayer *pBrush, float x, float y) {} virtual void BrushPlace(CLayer *pBrush, float x, float y) {} virtual void BrushFlipX() {} virtual void BrushFlipY() {} virtual void BrushRotate(float Amount) {} virtual void Render() {} virtual int RenderProperties(CUIRect *pToolbox) { return 0; } virtual void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc) {} virtual void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc) {} virtual void GetSize(float *w, float *h) { *w = 0; *h = 0;} char m_aName[12]; int m_Type; int m_Flags; bool m_Readonly; bool m_Visible; bool m_SaveToMap; }; class CLayerGroup { public: class CEditorMap *m_pMap; array m_lLayers; int m_OffsetX; int m_OffsetY; int m_ParallaxX; int m_ParallaxY; int m_UseClipping; int m_ClipX; int m_ClipY; int m_ClipW; int m_ClipH; char m_aName[12]; bool m_GameGroup; bool m_Visible; bool m_SaveToMap; bool m_Collapse; CLayerGroup(); ~CLayerGroup(); void Convert(CUIRect *pRect); void Render(); void MapScreen(); void Mapping(float *pPoints); void GetSize(float *w, float *h); void DeleteLayer(int Index); int SwapLayers(int Index0, int Index1); bool IsEmpty() const { return m_lLayers.size() == 0; } void Clear() { m_lLayers.delete_all(); } void AddLayer(CLayer *l); void ModifyImageIndex(INDEX_MODIFY_FUNC Func) { for(int i = 0; i < m_lLayers.size(); i++) m_lLayers[i]->ModifyImageIndex(Func); } void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC Func) { for(int i = 0; i < m_lLayers.size(); i++) m_lLayers[i]->ModifyEnvelopeIndex(Func); } }; class CEditorImage : public CImageInfo { public: CEditor *m_pEditor; CEditorImage(CEditor *pEditor) : m_AutoMapper(pEditor) { m_pEditor = pEditor; m_TexID = -1; m_aName[0] = 0; m_External = 0; m_Width = 0; m_Height = 0; m_pData = 0; m_Format = 0; } ~CEditorImage(); void AnalyseTileFlags(); int m_TexID; int m_External; char m_aName[128]; unsigned char m_aTileFlags[256]; class CAutoMapper m_AutoMapper; }; class CEditorMap { void MakeGameGroup(CLayerGroup *pGroup); void MakeGameLayer(CLayer *pLayer); public: CEditor *m_pEditor; bool m_Modified; CEditorMap() { Clean(); } array m_lGroups; array m_lImages; array m_lEnvelopes; class CMapInfo { public: char m_aAuthorTmp[32]; char m_aVersionTmp[16]; char m_aCreditsTmp[128]; char m_aLicenseTmp[32]; char m_aAuthor[32]; char m_aVersion[16]; char m_aCredits[128]; char m_aLicense[32]; void Reset() { m_aAuthorTmp[0] = 0; m_aVersionTmp[0] = 0; m_aCreditsTmp[0] = 0; m_aLicenseTmp[0] = 0; m_aAuthor[0] = 0; m_aVersion[0] = 0; m_aCredits[0] = 0; m_aLicense[0] = 0; } }; CMapInfo m_MapInfo; class CLayerGame *m_pGameLayer; CLayerGroup *m_pGameGroup; CEnvelope *NewEnvelope(int Channels) { m_Modified = true; CEnvelope *e = new CEnvelope(Channels); m_lEnvelopes.add(e); return e; } void DeleteEnvelope(int Index); CLayerGroup *NewGroup() { m_Modified = true; CLayerGroup *g = new CLayerGroup; g->m_pMap = this; m_lGroups.add(g); return g; } int SwapGroups(int Index0, int Index1) { if(Index0 < 0 || Index0 >= m_lGroups.size()) return Index0; if(Index1 < 0 || Index1 >= m_lGroups.size()) return Index0; if(Index0 == Index1) return Index0; m_Modified = true; swap(m_lGroups[Index0], m_lGroups[Index1]); return Index1; } void DeleteGroup(int Index) { if(Index < 0 || Index >= m_lGroups.size()) return; m_Modified = true; delete m_lGroups[Index]; m_lGroups.remove_index(Index); } void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc) { m_Modified = true; for(int i = 0; i < m_lGroups.size(); i++) m_lGroups[i]->ModifyImageIndex(pfnFunc); } void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc) { m_Modified = true; for(int i = 0; i < m_lGroups.size(); i++) m_lGroups[i]->ModifyEnvelopeIndex(pfnFunc); } void Clean(); void CreateDefault(int EntitiesTexture); // io int Save(class IStorage *pStorage, const char *pFilename); int Load(class IStorage *pStorage, const char *pFilename, int StorageType); }; struct CProperty { const char *m_pName; int m_Value; int m_Type; int m_Min; int m_Max; }; enum { PROPTYPE_NULL=0, PROPTYPE_BOOL, PROPTYPE_INT_STEP, PROPTYPE_INT_SCROLL, PROPTYPE_COLOR, PROPTYPE_IMAGE, PROPTYPE_ENVELOPE, PROPTYPE_SHIFT, }; typedef struct { int x, y; int w, h; } RECTi; class CLayerTiles : public CLayer { public: CLayerTiles(int w, int h); ~CLayerTiles(); void Resize(int NewW, int NewH); void Shift(int Direction); void MakePalette(); virtual void Render(); int ConvertX(float x) const; int ConvertY(float y) const; void Convert(CUIRect Rect, RECTi *pOut); void Snap(CUIRect *pRect); void Clamp(RECTi *pRect); virtual void BrushSelecting(CUIRect Rect); virtual int BrushGrab(CLayerGroup *pBrush, CUIRect Rect); virtual void FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect); virtual void BrushDraw(CLayer *pBrush, float wx, float wy); virtual void BrushFlipX(); virtual void BrushFlipY(); virtual void BrushRotate(float Amount); virtual void ShowInfo(); virtual int RenderProperties(CUIRect *pToolbox); virtual void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc); virtual void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc); void PrepareForSave(); void GetSize(float *w, float *h) { *w = m_Width*32.0f; *h = m_Height*32.0f; } int m_TexID; int m_Game; int m_Image; int m_Width; int m_Height; CColor m_Color; int m_ColorEnv; int m_ColorEnvOffset; CTile *m_pTiles; }; class CLayerQuads : public CLayer { public: CLayerQuads(); ~CLayerQuads(); virtual void Render(); CQuad *NewQuad(); virtual void BrushSelecting(CUIRect Rect); virtual int BrushGrab(CLayerGroup *pBrush, CUIRect Rect); virtual void BrushPlace(CLayer *pBrush, float wx, float wy); virtual void BrushFlipX(); virtual void BrushFlipY(); virtual void BrushRotate(float Amount); virtual int RenderProperties(CUIRect *pToolbox); virtual void ModifyImageIndex(INDEX_MODIFY_FUNC pfnFunc); virtual void ModifyEnvelopeIndex(INDEX_MODIFY_FUNC pfnFunc); void GetSize(float *w, float *h); int m_Image; array m_lQuads; }; class CLayerGame : public CLayerTiles { public: CLayerGame(int w, int h); ~CLayerGame(); virtual int RenderProperties(CUIRect *pToolbox); }; class CEditor : public IEditor { class IInput *m_pInput; class IClient *m_pClient; class IConsole *m_pConsole; class IGraphics *m_pGraphics; class ITextRender *m_pTextRender; class IStorage *m_pStorage; CRenderTools m_RenderTools; CUI m_UI; public: class IInput *Input() { return m_pInput; }; class IClient *Client() { return m_pClient; }; class IConsole *Console() { return m_pConsole; }; class IGraphics *Graphics() { return m_pGraphics; }; class ITextRender *TextRender() { return m_pTextRender; }; class IStorage *Storage() { return m_pStorage; }; CUI *UI() { return &m_UI; } CRenderTools *RenderTools() { return &m_RenderTools; } CEditor() : m_TilesetPicker(16, 16) { m_pInput = 0; m_pClient = 0; m_pGraphics = 0; m_pTextRender = 0; m_Mode = MODE_LAYERS; m_Dialog = 0; m_EditBoxActive = 0; m_pTooltip = 0; m_GridActive = false; m_GridFactor = 1; m_aFileName[0] = 0; m_aFileSaveName[0] = 0; m_ValidSaveFilename = false; m_PopupEventActivated = false; m_PopupEventWasActivated = false; m_FileDialogStorageType = 0; m_pFileDialogTitle = 0; m_pFileDialogButtonText = 0; m_pFileDialogUser = 0; m_aFileDialogFileName[0] = 0; m_aFileDialogCurrentFolder[0] = 0; m_aFileDialogCurrentLink[0] = 0; m_pFileDialogPath = m_aFileDialogCurrentFolder; m_aFileDialogActivate = false; m_FileDialogScrollValue = 0.0f; m_FilesSelectedIndex = -1; m_FilesStartAt = 0; m_FilesCur = 0; m_FilesStopAt = 999; m_WorldOffsetX = 0; m_WorldOffsetY = 0; m_EditorOffsetX = 0.0f; m_EditorOffsetY = 0.0f; m_WorldZoom = 1.0f; m_ZoomLevel = 200; m_LockMouse = false; m_ShowMousePointer = true; m_MouseDeltaX = 0; m_MouseDeltaY = 0; m_MouseDeltaWx = 0; m_MouseDeltaWy = 0; m_GuiActive = true; m_ProofBorders = false; m_ShowTileInfo = false; m_ShowDetail = true; m_Animate = false; m_AnimateStart = 0; m_AnimateTime = 0; m_AnimateSpeed = 1; m_ShowEnvelopeEditor = 0; m_ShowEnvelopePreview = 0; m_SelectedQuadEnvelope = -1; m_SelectedEnvelopePoint = -1; ms_CheckerTexture = 0; ms_BackgroundTexture = 0; ms_CursorTexture = 0; ms_EntitiesTexture = 0; ms_pUiGotContext = 0; } virtual void Init(); virtual void UpdateAndRender(); virtual bool HasUnsavedData() { return m_Map.m_Modified; } void FilelistPopulate(int StorageType); void InvokeFileDialog(int StorageType, int FileType, const char *pTitle, const char *pButtonText, const char *pBasepath, const char *pDefaultName, void (*pfnFunc)(const char *pFilename, int StorageType, void *pUser), void *pUser); void Reset(bool CreateDefault=true); int Save(const char *pFilename); int Load(const char *pFilename, int StorageType); int Append(const char *pFilename, int StorageType); void Render(); CQuad *GetSelectedQuad(); CLayer *GetSelectedLayerType(int Index, int Type); CLayer *GetSelectedLayer(int Index); CLayerGroup *GetSelectedGroup(); int DoProperties(CUIRect *pToolbox, CProperty *pProps, int *pIDs, int *pNewVal); int m_Mode; int m_Dialog; int m_EditBoxActive; const char *m_pTooltip; bool m_GridActive; int m_GridFactor; char m_aFileName[512]; char m_aFileSaveName[512]; bool m_ValidSaveFilename; enum { POPEVENT_EXIT=0, POPEVENT_LOAD, POPEVENT_NEW, POPEVENT_SAVE, }; int m_PopupEventType; int m_PopupEventActivated; int m_PopupEventWasActivated; enum { FILETYPE_MAP, FILETYPE_IMG, MAX_PATH_LENGTH = 512 }; int m_FileDialogStorageType; const char *m_pFileDialogTitle; const char *m_pFileDialogButtonText; void (*m_pfnFileDialogFunc)(const char *pFileName, int StorageType, void *pUser); void *m_pFileDialogUser; char m_aFileDialogFileName[MAX_PATH_LENGTH]; char m_aFileDialogCurrentFolder[MAX_PATH_LENGTH]; char m_aFileDialogCurrentLink[MAX_PATH_LENGTH]; char *m_pFileDialogPath; bool m_aFileDialogActivate; int m_FileDialogFileType; float m_FileDialogScrollValue; int m_FilesSelectedIndex; char m_FileDialogNewFolderName[64]; char m_FileDialogErrString[64]; struct CFilelistItem { char m_aFilename[128]; char m_aName[128]; bool m_IsDir; bool m_IsLink; int m_StorageType; bool operator<(const CFilelistItem &Other) { return !str_comp(m_aFilename, "..") ? true : !str_comp(Other.m_aFilename, "..") ? false : m_IsDir && !Other.m_IsDir ? true : !m_IsDir && Other.m_IsDir ? false : str_comp_filenames(m_aFilename, Other.m_aFilename) < 0; } }; sorted_array m_FileList; int m_FilesStartAt; int m_FilesCur; int m_FilesStopAt; float m_WorldOffsetX; float m_WorldOffsetY; float m_EditorOffsetX; float m_EditorOffsetY; float m_WorldZoom; int m_ZoomLevel; bool m_LockMouse; bool m_ShowMousePointer; bool m_GuiActive; bool m_ProofBorders; float m_MouseDeltaX; float m_MouseDeltaY; float m_MouseDeltaWx; float m_MouseDeltaWy; bool m_ShowTileInfo; bool m_ShowDetail; bool m_Animate; int64 m_AnimateStart; float m_AnimateTime; float m_AnimateSpeed; int m_ShowEnvelopeEditor; int m_ShowEnvelopePreview; //Values: 0-Off|1-Selected Envelope|2-All bool m_ShowPicker; int m_SelectedLayer; int m_SelectedGroup; int m_SelectedQuad; int m_SelectedPoints; int m_SelectedEnvelope; int m_SelectedEnvelopePoint; int m_SelectedQuadEnvelope; int m_SelectedImage; static int ms_CheckerTexture; static int ms_BackgroundTexture; static int ms_CursorTexture; static int ms_EntitiesTexture; CLayerGroup m_Brush; CLayerTiles m_TilesetPicker; static const void *ms_pUiGotContext; CEditorMap m_Map; static void EnvelopeEval(float TimeOffset, int Env, float *pChannels, void *pUser); void DoMapBorder(); int DoButton_Editor_Common(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); int DoButton_Editor(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); int DoButton_Tab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); int DoButton_Ex(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip, int Corners, float FontSize=10.0f); int DoButton_ButtonDec(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); int DoButton_ButtonInc(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); int DoButton_File(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags, const char *pToolTip); int DoButton_MenuItem(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Flags=0, const char *pToolTip=0); int DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, float *Offset, bool Hidden=false, int Corners=CUI::CORNER_ALL); void RenderBackground(CUIRect View, int Texture, float Size, float Brightness); void RenderGrid(CLayerGroup *pGroup); void UiInvokePopupMenu(void *pID, int Flags, float X, float Y, float W, float H, int (*pfnFunc)(CEditor *pEditor, CUIRect Rect), void *pExtra=0); void UiDoPopupMenu(); int UiDoValueSelector(void *pID, CUIRect *pRect, const char *pLabel, int Current, int Min, int Max, int Step, float Scale, const char *pToolTip); static int PopupGroup(CEditor *pEditor, CUIRect View); static int PopupLayer(CEditor *pEditor, CUIRect View); static int PopupQuad(CEditor *pEditor, CUIRect View); static int PopupPoint(CEditor *pEditor, CUIRect View); static int PopupNewFolder(CEditor *pEditor, CUIRect View); static int PopupMapInfo(CEditor *pEditor, CUIRect View); static int PopupEvent(CEditor *pEditor, CUIRect View); static int PopupSelectImage(CEditor *pEditor, CUIRect View); static int PopupSelectGametileOp(CEditor *pEditor, CUIRect View); static int PopupImage(CEditor *pEditor, CUIRect View); static int PopupMenuFile(CEditor *pEditor, CUIRect View); static int PopupSelectConfigAutoMap(CEditor *pEditor, CUIRect View); static void CallbackOpenMap(const char *pFileName, int StorageType, void *pUser); static void CallbackAppendMap(const char *pFileName, int StorageType, void *pUser); static void CallbackSaveMap(const char *pFileName, int StorageType, void *pUser); void PopupSelectImageInvoke(int Current, float x, float y); int PopupSelectImageResult(); void PopupSelectGametileOpInvoke(float x, float y); int PopupSelectGameTileOpResult(); void PopupSelectConfigAutoMapInvoke(float x, float y); int PopupSelectConfigAutoMapResult(); vec4 ButtonColorMul(const void *pID); void DoQuadEnvelopes(const array &m_lQuads, int TexID = -1); void DoQuadEnvPoint(const CQuad *pQuad, int QIndex, int pIndex); void DoQuadPoint(CQuad *pQuad, int QuadIndex, int v); void DoMapEditor(CUIRect View, CUIRect Toolbar); void DoToolbar(CUIRect Toolbar); void DoQuad(CQuad *pQuad, int Index); float UiDoScrollbarV(const void *pID, const CUIRect *pRect, float Current); vec4 GetButtonColor(const void *pID, int Checked); static void ReplaceImage(const char *pFilename, int StorageType, void *pUser); static void AddImage(const char *pFilename, int StorageType, void *pUser); void RenderImages(CUIRect Toolbox, CUIRect Toolbar, CUIRect View); void RenderLayers(CUIRect Toolbox, CUIRect Toolbar, CUIRect View); void RenderModebar(CUIRect View); void RenderStatusbar(CUIRect View); void RenderEnvelopeEditor(CUIRect View); void RenderMenubar(CUIRect Menubar); void RenderFileDialog(); void AddFileDialogEntry(int Index, CUIRect *pView); void SortImages(); static void ExtractName(const char *pFileName, char *pName, int BufferSize) { const char *pExtractedName = pFileName; const char *pEnd = 0; for(; *pFileName; ++pFileName) { if(*pFileName == '/' || *pFileName == '\\') pExtractedName = pFileName+1; else if(*pFileName == '.') pEnd = pFileName; } int Length = pEnd > pExtractedName ? min(BufferSize, (int)(pEnd-pExtractedName+1)) : BufferSize; str_copy(pName, pExtractedName, Length); } int GetLineDistance(); }; // make sure to inline this function inline class IGraphics *CLayer::Graphics() { return m_pEditor->Graphics(); } inline class ITextRender *CLayer::TextRender() { return m_pEditor->TextRender(); } #endif teeworlds-0.6.2+dfsg/src/game/editor/io.cpp0000644000175000017500000004672712140200333017553 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "editor.h" template static int MakeVersion(int i, const T &v) { return (i<<16)+sizeof(T); } // backwards compatiblity /* void editor_load_old(DATAFILE *df, MAP *map) { class mapres_image { public: int width; int height; int image_data; }; struct mapres_tilemap { int image; int width; int height; int x, y; int scale; int data; int main; }; struct mapres_entity { int x, y; int data[1]; }; struct mapres_spawnpoint { int x, y; }; struct mapres_item { int x, y; int type; }; struct mapres_flagstand { int x, y; }; enum { MAPRES_ENTS_START=1, MAPRES_SPAWNPOINT=1, MAPRES_ITEM=2, MAPRES_SPAWNPOINT_RED=3, MAPRES_SPAWNPOINT_BLUE=4, MAPRES_FLAGSTAND_RED=5, MAPRES_FLAGSTAND_BLUE=6, MAPRES_ENTS_END, ITEM_NULL=0, ITEM_WEAPON_GUN=0x00010001, ITEM_WEAPON_SHOTGUN=0x00010002, ITEM_WEAPON_ROCKET=0x00010003, ITEM_WEAPON_SNIPER=0x00010004, ITEM_WEAPON_HAMMER=0x00010005, ITEM_HEALTH =0x00020001, ITEM_ARMOR=0x00030001, ITEM_NINJA=0x00040001, }; enum { MAPRES_REGISTERED=0x8000, MAPRES_IMAGE=0x8001, MAPRES_TILEMAP=0x8002, MAPRES_COLLISIONMAP=0x8003, MAPRES_TEMP_THEME=0x8fff, }; // load tilemaps int game_width = 0; int game_height = 0; { int start, num; datafile_get_type(df, MAPRES_TILEMAP, &start, &num); for(int t = 0; t < num; t++) { mapres_tilemap *tmap = (mapres_tilemap *)datafile_get_item(df, start+t,0,0); CLayerTiles *l = new CLayerTiles(tmap->width, tmap->height); if(tmap->main) { // move game layer to correct position for(int i = 0; i < map->groups[0]->layers.len()-1; i++) { if(map->groups[0]->layers[i] == pEditor->map.game_layer) map->groups[0]->swap_layers(i, i+1); } game_width = tmap->width; game_height = tmap->height; } // add new layer map->groups[0]->add_layer(l); // process the data unsigned char *src_data = (unsigned char *)datafile_get_data(df, tmap->data); CTile *dst_data = l->tiles; for(int y = 0; y < tmap->height; y++) for(int x = 0; x < tmap->width; x++, dst_data++, src_data+=2) { dst_data->index = src_data[0]; dst_data->flags = src_data[1]; } l->image = tmap->image; } } // load images { int start, count; datafile_get_type(df, MAPRES_IMAGE, &start, &count); for(int i = 0; i < count; i++) { mapres_image *imgres = (mapres_image *)datafile_get_item(df, start+i, 0, 0); void *data = datafile_get_data(df, imgres->image_data); EDITOR_IMAGE *img = new EDITOR_IMAGE; img->width = imgres->width; img->height = imgres->height; img->format = CImageInfo::FORMAT_RGBA; // copy image data img->data = mem_alloc(img->width*img->height*4, 1); mem_copy(img->data, data, img->width*img->height*4); img->tex_id = Graphics()->LoadTextureRaw(img->width, img->height, img->format, img->data, CImageInfo::FORMAT_AUTO, 0); map->images.add(img); // unload image datafile_unload_data(df, imgres->image_data); } } // load entities { CLayerGame *g = map->game_layer; g->resize(game_width, game_height); for(int t = MAPRES_ENTS_START; t < MAPRES_ENTS_END; t++) { // fetch entities of this class int start, num; datafile_get_type(df, t, &start, &num); for(int i = 0; i < num; i++) { mapres_entity *e = (mapres_entity *)datafile_get_item(df, start+i,0,0); int x = e->x/32; int y = e->y/32; int id = -1; if(t == MAPRES_SPAWNPOINT) id = ENTITY_SPAWN; else if(t == MAPRES_SPAWNPOINT_RED) id = ENTITY_SPAWN_RED; else if(t == MAPRES_SPAWNPOINT_BLUE) id = ENTITY_SPAWN_BLUE; else if(t == MAPRES_FLAGSTAND_RED) id = ENTITY_FLAGSTAND_RED; else if(t == MAPRES_FLAGSTAND_BLUE) id = ENTITY_FLAGSTAND_BLUE; else if(t == MAPRES_ITEM) { if(e->data[0] == ITEM_WEAPON_SHOTGUN) id = ENTITY_WEAPON_SHOTGUN; else if(e->data[0] == ITEM_WEAPON_ROCKET) id = ENTITY_WEAPON_GRENADE; else if(e->data[0] == ITEM_NINJA) id = ENTITY_POWERUP_NINJA; else if(e->data[0] == ITEM_ARMOR) id = ENTITY_ARMOR_1; else if(e->data[0] == ITEM_HEALTH) id = ENTITY_HEALTH_1; } if(id > 0 && x >= 0 && x < g->width && y >= 0 && y < g->height) g->tiles[y*g->width+x].index = id+ENTITY_OFFSET; } } } }*/ int CEditor::Save(const char *pFilename) { return m_Map.Save(Kernel()->RequestInterface(), pFilename); } int CEditorMap::Save(class IStorage *pStorage, const char *pFileName) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "saving to '%s'...", pFileName); m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor", aBuf); CDataFileWriter df; if(!df.Open(pStorage, pFileName)) { str_format(aBuf, sizeof(aBuf), "failed to open file '%s'...", pFileName); m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "editor", aBuf); return 0; } // save version { CMapItemVersion Item; Item.m_Version = 1; df.AddItem(MAPITEMTYPE_VERSION, 0, sizeof(Item), &Item); } // save map info { CMapItemInfo Item; Item.m_Version = 1; if(m_MapInfo.m_aAuthor[0]) Item.m_Author = df.AddData(str_length(m_MapInfo.m_aAuthor)+1, m_MapInfo.m_aAuthor); else Item.m_Author = -1; if(m_MapInfo.m_aVersion[0]) Item.m_MapVersion = df.AddData(str_length(m_MapInfo.m_aVersion)+1, m_MapInfo.m_aVersion); else Item.m_MapVersion = -1; if(m_MapInfo.m_aCredits[0]) Item.m_Credits = df.AddData(str_length(m_MapInfo.m_aCredits)+1, m_MapInfo.m_aCredits); else Item.m_Credits = -1; if(m_MapInfo.m_aLicense[0]) Item.m_License = df.AddData(str_length(m_MapInfo.m_aLicense)+1, m_MapInfo.m_aLicense); else Item.m_License = -1; df.AddItem(MAPITEMTYPE_INFO, 0, sizeof(Item), &Item); } // save images for(int i = 0; i < m_lImages.size(); i++) { CEditorImage *pImg = m_lImages[i]; // analyse the image for when saving (should be done when we load the image) // TODO! pImg->AnalyseTileFlags(); CMapItemImage Item; Item.m_Version = 1; Item.m_Width = pImg->m_Width; Item.m_Height = pImg->m_Height; Item.m_External = pImg->m_External; Item.m_ImageName = df.AddData(str_length(pImg->m_aName)+1, pImg->m_aName); if(pImg->m_External) Item.m_ImageData = -1; else Item.m_ImageData = df.AddData(Item.m_Width*Item.m_Height*4, pImg->m_pData); df.AddItem(MAPITEMTYPE_IMAGE, i, sizeof(Item), &Item); } // save layers int LayerCount = 0, GroupCount = 0; for(int g = 0; g < m_lGroups.size(); g++) { CLayerGroup *pGroup = m_lGroups[g]; if(!pGroup->m_SaveToMap) continue; CMapItemGroup GItem; GItem.m_Version = CMapItemGroup::CURRENT_VERSION; GItem.m_ParallaxX = pGroup->m_ParallaxX; GItem.m_ParallaxY = pGroup->m_ParallaxY; GItem.m_OffsetX = pGroup->m_OffsetX; GItem.m_OffsetY = pGroup->m_OffsetY; GItem.m_UseClipping = pGroup->m_UseClipping; GItem.m_ClipX = pGroup->m_ClipX; GItem.m_ClipY = pGroup->m_ClipY; GItem.m_ClipW = pGroup->m_ClipW; GItem.m_ClipH = pGroup->m_ClipH; GItem.m_StartLayer = LayerCount; GItem.m_NumLayers = 0; // save group name StrToInts(GItem.m_aName, sizeof(GItem.m_aName)/sizeof(int), pGroup->m_aName); for(int l = 0; l < pGroup->m_lLayers.size(); l++) { if(!pGroup->m_lLayers[l]->m_SaveToMap) continue; if(pGroup->m_lLayers[l]->m_Type == LAYERTYPE_TILES) { m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving tiles layer"); CLayerTiles *pLayer = (CLayerTiles *)pGroup->m_lLayers[l]; pLayer->PrepareForSave(); CMapItemLayerTilemap Item; Item.m_Version = 3; Item.m_Layer.m_Flags = pLayer->m_Flags; Item.m_Layer.m_Type = pLayer->m_Type; Item.m_Color = pLayer->m_Color; Item.m_ColorEnv = pLayer->m_ColorEnv; Item.m_ColorEnvOffset = pLayer->m_ColorEnvOffset; Item.m_Width = pLayer->m_Width; Item.m_Height = pLayer->m_Height; Item.m_Flags = pLayer->m_Game ? TILESLAYERFLAG_GAME : 0; Item.m_Image = pLayer->m_Image; Item.m_Data = df.AddData(pLayer->m_Width*pLayer->m_Height*sizeof(CTile), pLayer->m_pTiles); // save layer name StrToInts(Item.m_aName, sizeof(Item.m_aName)/sizeof(int), pLayer->m_aName); df.AddItem(MAPITEMTYPE_LAYER, LayerCount, sizeof(Item), &Item); GItem.m_NumLayers++; LayerCount++; } else if(pGroup->m_lLayers[l]->m_Type == LAYERTYPE_QUADS) { m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving quads layer"); CLayerQuads *pLayer = (CLayerQuads *)pGroup->m_lLayers[l]; if(pLayer->m_lQuads.size()) { CMapItemLayerQuads Item; Item.m_Version = 2; Item.m_Layer.m_Flags = pLayer->m_Flags; Item.m_Layer.m_Type = pLayer->m_Type; Item.m_Image = pLayer->m_Image; // add the data Item.m_NumQuads = pLayer->m_lQuads.size(); Item.m_Data = df.AddDataSwapped(pLayer->m_lQuads.size()*sizeof(CQuad), pLayer->m_lQuads.base_ptr()); // save layer name StrToInts(Item.m_aName, sizeof(Item.m_aName)/sizeof(int), pLayer->m_aName); df.AddItem(MAPITEMTYPE_LAYER, LayerCount, sizeof(Item), &Item); // clean up //mem_free(quads); GItem.m_NumLayers++; LayerCount++; } } } df.AddItem(MAPITEMTYPE_GROUP, GroupCount++, sizeof(GItem), &GItem); } // save envelopes int PointCount = 0; for(int e = 0; e < m_lEnvelopes.size(); e++) { CMapItemEnvelope Item; Item.m_Version = CMapItemEnvelope::CURRENT_VERSION; Item.m_Channels = m_lEnvelopes[e]->m_Channels; Item.m_StartPoint = PointCount; Item.m_NumPoints = m_lEnvelopes[e]->m_lPoints.size(); Item.m_Synchronized = m_lEnvelopes[e]->m_Synchronized; StrToInts(Item.m_aName, sizeof(Item.m_aName)/sizeof(int), m_lEnvelopes[e]->m_aName); df.AddItem(MAPITEMTYPE_ENVELOPE, e, sizeof(Item), &Item); PointCount += Item.m_NumPoints; } // save points int TotalSize = sizeof(CEnvPoint) * PointCount; CEnvPoint *pPoints = (CEnvPoint *)mem_alloc(TotalSize, 1); PointCount = 0; for(int e = 0; e < m_lEnvelopes.size(); e++) { int Count = m_lEnvelopes[e]->m_lPoints.size(); mem_copy(&pPoints[PointCount], m_lEnvelopes[e]->m_lPoints.base_ptr(), sizeof(CEnvPoint)*Count); PointCount += Count; } df.AddItem(MAPITEMTYPE_ENVPOINTS, 0, TotalSize, pPoints); mem_free(pPoints); // finish the data file df.Finish(); m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "editor", "saving done"); // send rcon.. if we can if(m_pEditor->Client()->RconAuthed()) { CServerInfo CurrentServerInfo; m_pEditor->Client()->GetServerInfo(&CurrentServerInfo); char aMapName[128]; m_pEditor->ExtractName(pFileName, aMapName, sizeof(aMapName)); if(!str_comp(aMapName, CurrentServerInfo.m_aMap)) m_pEditor->Client()->Rcon("reload"); } return 1; } int CEditor::Load(const char *pFileName, int StorageType) { Reset(); return m_Map.Load(Kernel()->RequestInterface(), pFileName, StorageType); } int CEditorMap::Load(class IStorage *pStorage, const char *pFileName, int StorageType) { CDataFileReader DataFile; //DATAFILE *df = datafile_load(filename); if(!DataFile.Open(pStorage, pFileName, StorageType)) return 0; Clean(); // check version CMapItemVersion *pItem = (CMapItemVersion *)DataFile.FindItem(MAPITEMTYPE_VERSION, 0); if(!pItem) { // import old map /*MAP old_mapstuff; editor->reset(); editor_load_old(df, this); */ } else if(pItem->m_Version == 1) { //editor.reset(false); // load map info { CMapItemInfo *pItem = (CMapItemInfo *)DataFile.FindItem(MAPITEMTYPE_INFO, 0); if(pItem && pItem->m_Version == 1) { if(pItem->m_Author > -1) str_copy(m_MapInfo.m_aAuthor, (char *)DataFile.GetData(pItem->m_Author), sizeof(m_MapInfo.m_aAuthor)); if(pItem->m_MapVersion > -1) str_copy(m_MapInfo.m_aVersion, (char *)DataFile.GetData(pItem->m_MapVersion), sizeof(m_MapInfo.m_aVersion)); if(pItem->m_Credits > -1) str_copy(m_MapInfo.m_aCredits, (char *)DataFile.GetData(pItem->m_Credits), sizeof(m_MapInfo.m_aCredits)); if(pItem->m_License > -1) str_copy(m_MapInfo.m_aLicense, (char *)DataFile.GetData(pItem->m_License), sizeof(m_MapInfo.m_aLicense)); } } // load images { int Start, Num; DataFile.GetType( MAPITEMTYPE_IMAGE, &Start, &Num); for(int i = 0; i < Num; i++) { CMapItemImage *pItem = (CMapItemImage *)DataFile.GetItem(Start+i, 0, 0); char *pName = (char *)DataFile.GetData(pItem->m_ImageName); // copy base info CEditorImage *pImg = new CEditorImage(m_pEditor); pImg->m_External = pItem->m_External; if(pItem->m_External) { char aBuf[256]; str_format(aBuf, sizeof(aBuf),"mapres/%s.png", pName); // load external CEditorImage ImgInfo(m_pEditor); if(m_pEditor->Graphics()->LoadPNG(&ImgInfo, aBuf, IStorage::TYPE_ALL)) { *pImg = ImgInfo; pImg->m_TexID = m_pEditor->Graphics()->LoadTextureRaw(ImgInfo.m_Width, ImgInfo.m_Height, ImgInfo.m_Format, ImgInfo.m_pData, CImageInfo::FORMAT_AUTO, 0); ImgInfo.m_pData = 0; pImg->m_External = 1; } } else { pImg->m_Width = pItem->m_Width; pImg->m_Height = pItem->m_Height; pImg->m_Format = CImageInfo::FORMAT_RGBA; // copy image data void *pData = DataFile.GetData(pItem->m_ImageData); pImg->m_pData = mem_alloc(pImg->m_Width*pImg->m_Height*4, 1); mem_copy(pImg->m_pData, pData, pImg->m_Width*pImg->m_Height*4); pImg->m_TexID = m_pEditor->Graphics()->LoadTextureRaw(pImg->m_Width, pImg->m_Height, pImg->m_Format, pImg->m_pData, CImageInfo::FORMAT_AUTO, 0); } // copy image name if(pName) str_copy(pImg->m_aName, pName, 128); // load auto mapper file pImg->m_AutoMapper.Load(pImg->m_aName); m_lImages.add(pImg); // unload image DataFile.UnloadData(pItem->m_ImageData); DataFile.UnloadData(pItem->m_ImageName); } } // load groups { int LayersStart, LayersNum; DataFile.GetType(MAPITEMTYPE_LAYER, &LayersStart, &LayersNum); int Start, Num; DataFile.GetType(MAPITEMTYPE_GROUP, &Start, &Num); for(int g = 0; g < Num; g++) { CMapItemGroup *pGItem = (CMapItemGroup *)DataFile.GetItem(Start+g, 0, 0); if(pGItem->m_Version < 1 || pGItem->m_Version > CMapItemGroup::CURRENT_VERSION) continue; CLayerGroup *pGroup = NewGroup(); pGroup->m_ParallaxX = pGItem->m_ParallaxX; pGroup->m_ParallaxY = pGItem->m_ParallaxY; pGroup->m_OffsetX = pGItem->m_OffsetX; pGroup->m_OffsetY = pGItem->m_OffsetY; if(pGItem->m_Version >= 2) { pGroup->m_UseClipping = pGItem->m_UseClipping; pGroup->m_ClipX = pGItem->m_ClipX; pGroup->m_ClipY = pGItem->m_ClipY; pGroup->m_ClipW = pGItem->m_ClipW; pGroup->m_ClipH = pGItem->m_ClipH; } // load group name if(pGItem->m_Version >= 3) IntsToStr(pGItem->m_aName, sizeof(pGroup->m_aName)/sizeof(int), pGroup->m_aName); for(int l = 0; l < pGItem->m_NumLayers; l++) { CLayer *pLayer = 0; CMapItemLayer *pLayerItem = (CMapItemLayer *)DataFile.GetItem(LayersStart+pGItem->m_StartLayer+l, 0, 0); if(!pLayerItem) continue; if(pLayerItem->m_Type == LAYERTYPE_TILES) { CMapItemLayerTilemap *pTilemapItem = (CMapItemLayerTilemap *)pLayerItem; CLayerTiles *pTiles = 0; if(pTilemapItem->m_Flags&TILESLAYERFLAG_GAME) { pTiles = new CLayerGame(pTilemapItem->m_Width, pTilemapItem->m_Height); MakeGameLayer(pTiles); MakeGameGroup(pGroup); } else { pTiles = new CLayerTiles(pTilemapItem->m_Width, pTilemapItem->m_Height); pTiles->m_pEditor = m_pEditor; pTiles->m_Color = pTilemapItem->m_Color; pTiles->m_ColorEnv = pTilemapItem->m_ColorEnv; pTiles->m_ColorEnvOffset = pTilemapItem->m_ColorEnvOffset; } pLayer = pTiles; pGroup->AddLayer(pTiles); void *pData = DataFile.GetData(pTilemapItem->m_Data); pTiles->m_Image = pTilemapItem->m_Image; pTiles->m_Game = pTilemapItem->m_Flags&TILESLAYERFLAG_GAME; // load layer name if(pTilemapItem->m_Version >= 3) IntsToStr(pTilemapItem->m_aName, sizeof(pTiles->m_aName)/sizeof(int), pTiles->m_aName); mem_copy(pTiles->m_pTiles, pData, pTiles->m_Width*pTiles->m_Height*sizeof(CTile)); if(pTiles->m_Game && pTilemapItem->m_Version == MakeVersion(1, *pTilemapItem)) { for(int i = 0; i < pTiles->m_Width*pTiles->m_Height; i++) { if(pTiles->m_pTiles[i].m_Index) pTiles->m_pTiles[i].m_Index += ENTITY_OFFSET; } } DataFile.UnloadData(pTilemapItem->m_Data); } else if(pLayerItem->m_Type == LAYERTYPE_QUADS) { CMapItemLayerQuads *pQuadsItem = (CMapItemLayerQuads *)pLayerItem; CLayerQuads *pQuads = new CLayerQuads; pQuads->m_pEditor = m_pEditor; pLayer = pQuads; pQuads->m_Image = pQuadsItem->m_Image; if(pQuads->m_Image < -1 || pQuads->m_Image >= m_lImages.size()) pQuads->m_Image = -1; // load layer name if(pQuadsItem->m_Version >= 2) IntsToStr(pQuadsItem->m_aName, sizeof(pQuads->m_aName)/sizeof(int), pQuads->m_aName); void *pData = DataFile.GetDataSwapped(pQuadsItem->m_Data); pGroup->AddLayer(pQuads); pQuads->m_lQuads.set_size(pQuadsItem->m_NumQuads); mem_copy(pQuads->m_lQuads.base_ptr(), pData, sizeof(CQuad)*pQuadsItem->m_NumQuads); DataFile.UnloadData(pQuadsItem->m_Data); } if(pLayer) pLayer->m_Flags = pLayerItem->m_Flags; } } } // load envelopes { CEnvPoint *pPoints = 0; { int Start, Num; DataFile.GetType(MAPITEMTYPE_ENVPOINTS, &Start, &Num); if(Num) pPoints = (CEnvPoint *)DataFile.GetItem(Start, 0, 0); } int Start, Num; DataFile.GetType(MAPITEMTYPE_ENVELOPE, &Start, &Num); for(int e = 0; e < Num; e++) { CMapItemEnvelope *pItem = (CMapItemEnvelope *)DataFile.GetItem(Start+e, 0, 0); CEnvelope *pEnv = new CEnvelope(pItem->m_Channels); pEnv->m_lPoints.set_size(pItem->m_NumPoints); mem_copy(pEnv->m_lPoints.base_ptr(), &pPoints[pItem->m_StartPoint], sizeof(CEnvPoint)*pItem->m_NumPoints); if(pItem->m_aName[0] != -1) // compatibility with old maps IntsToStr(pItem->m_aName, sizeof(pItem->m_aName)/sizeof(int), pEnv->m_aName); m_lEnvelopes.add(pEnv); if(pItem->m_Version >= 2) pEnv->m_Synchronized = pItem->m_Synchronized; } } } return 1; } static int gs_ModifyAddAmount = 0; static void ModifyAdd(int *pIndex) { if(*pIndex >= 0) *pIndex += gs_ModifyAddAmount; } int CEditor::Append(const char *pFileName, int StorageType) { CEditorMap NewMap; NewMap.m_pEditor = this; int Err; Err = NewMap.Load(Kernel()->RequestInterface(), pFileName, StorageType); if(!Err) return Err; // modify indecies gs_ModifyAddAmount = m_Map.m_lImages.size(); NewMap.ModifyImageIndex(ModifyAdd); gs_ModifyAddAmount = m_Map.m_lEnvelopes.size(); NewMap.ModifyEnvelopeIndex(ModifyAdd); // transfer images for(int i = 0; i < NewMap.m_lImages.size(); i++) m_Map.m_lImages.add(NewMap.m_lImages[i]); NewMap.m_lImages.clear(); // transfer envelopes for(int i = 0; i < NewMap.m_lEnvelopes.size(); i++) m_Map.m_lEnvelopes.add(NewMap.m_lEnvelopes[i]); NewMap.m_lEnvelopes.clear(); // transfer groups for(int i = 0; i < NewMap.m_lGroups.size(); i++) { if(NewMap.m_lGroups[i] == NewMap.m_pGameGroup) delete NewMap.m_lGroups[i]; else { NewMap.m_lGroups[i]->m_pMap = &m_Map; m_Map.m_lGroups.add(NewMap.m_lGroups[i]); } } NewMap.m_lGroups.clear(); // all done \o/ return 0; } teeworlds-0.6.2+dfsg/src/game/editor/layer_game.cpp0000644000175000017500000000076112140200333021235 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "editor.h" CLayerGame::CLayerGame(int w, int h) : CLayerTiles(w, h) { str_copy(m_aName, "Game", sizeof(m_aName)); m_Game = 1; } CLayerGame::~CLayerGame() { } int CLayerGame::RenderProperties(CUIRect *pToolbox) { int r = CLayerTiles::RenderProperties(pToolbox); m_Image = -1; return r; } teeworlds-0.6.2+dfsg/src/game/editor/layer_quads.cpp0000644000175000017500000001315512140200333021442 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "editor.h" #include #include #include CLayerQuads::CLayerQuads() { m_Type = LAYERTYPE_QUADS; str_copy(m_aName, "Quads", sizeof(m_aName)); m_Image = -1; } CLayerQuads::~CLayerQuads() { } void CLayerQuads::Render() { Graphics()->TextureSet(-1); if(m_Image >= 0 && m_Image < m_pEditor->m_Map.m_lImages.size()) Graphics()->TextureSet(m_pEditor->m_Map.m_lImages[m_Image]->m_TexID); Graphics()->BlendNone(); m_pEditor->RenderTools()->RenderQuads(m_lQuads.base_ptr(), m_lQuads.size(), LAYERRENDERFLAG_OPAQUE, m_pEditor->EnvelopeEval, m_pEditor); Graphics()->BlendNormal(); m_pEditor->RenderTools()->RenderQuads(m_lQuads.base_ptr(), m_lQuads.size(), LAYERRENDERFLAG_TRANSPARENT, m_pEditor->EnvelopeEval, m_pEditor); } CQuad *CLayerQuads::NewQuad() { m_pEditor->m_Map.m_Modified = true; CQuad *q = &m_lQuads[m_lQuads.add(CQuad())]; q->m_PosEnv = -1; q->m_ColorEnv = -1; q->m_PosEnvOffset = 0; q->m_ColorEnvOffset = 0; int x = 0, y = 0; q->m_aPoints[0].x = x; q->m_aPoints[0].y = y; q->m_aPoints[1].x = x+64; q->m_aPoints[1].y = y; q->m_aPoints[2].x = x; q->m_aPoints[2].y = y+64; q->m_aPoints[3].x = x+64; q->m_aPoints[3].y = y+64; q->m_aPoints[4].x = x+32; // pivot q->m_aPoints[4].y = y+32; for(int i = 0; i < 5; i++) { q->m_aPoints[i].x <<= 10; q->m_aPoints[i].y <<= 10; } q->m_aTexcoords[0].x = 0; q->m_aTexcoords[0].y = 0; q->m_aTexcoords[1].x = 1<<10; q->m_aTexcoords[1].y = 0; q->m_aTexcoords[2].x = 0; q->m_aTexcoords[2].y = 1<<10; q->m_aTexcoords[3].x = 1<<10; q->m_aTexcoords[3].y = 1<<10; q->m_aColors[0].r = 255; q->m_aColors[0].g = 255; q->m_aColors[0].b = 255; q->m_aColors[0].a = 255; q->m_aColors[1].r = 255; q->m_aColors[1].g = 255; q->m_aColors[1].b = 255; q->m_aColors[1].a = 255; q->m_aColors[2].r = 255; q->m_aColors[2].g = 255; q->m_aColors[2].b = 255; q->m_aColors[2].a = 255; q->m_aColors[3].r = 255; q->m_aColors[3].g = 255; q->m_aColors[3].b = 255; q->m_aColors[3].a = 255; return q; } void CLayerQuads::BrushSelecting(CUIRect Rect) { // draw selection rectangle IGraphics::CLineItem Array[4] = { IGraphics::CLineItem(Rect.x, Rect.y, Rect.x+Rect.w, Rect.y), IGraphics::CLineItem(Rect.x+Rect.w, Rect.y, Rect.x+Rect.w, Rect.y+Rect.h), IGraphics::CLineItem(Rect.x+Rect.w, Rect.y+Rect.h, Rect.x, Rect.y+Rect.h), IGraphics::CLineItem(Rect.x, Rect.y+Rect.h, Rect.x, Rect.y)}; Graphics()->TextureSet(-1); Graphics()->LinesBegin(); Graphics()->LinesDraw(Array, 4); Graphics()->LinesEnd(); } int CLayerQuads::BrushGrab(CLayerGroup *pBrush, CUIRect Rect) { // create new layers CLayerQuads *pGrabbed = new CLayerQuads(); pGrabbed->m_pEditor = m_pEditor; pGrabbed->m_Image = m_Image; pBrush->AddLayer(pGrabbed); //dbg_msg("", "%f %f %f %f", rect.x, rect.y, rect.w, rect.h); for(int i = 0; i < m_lQuads.size(); i++) { CQuad *q = &m_lQuads[i]; float px = fx2f(q->m_aPoints[4].x); float py = fx2f(q->m_aPoints[4].y); if(px > Rect.x && px < Rect.x+Rect.w && py > Rect.y && py < Rect.y+Rect.h) { CQuad n; n = *q; for(int p = 0; p < 5; p++) { n.m_aPoints[p].x -= f2fx(Rect.x); n.m_aPoints[p].y -= f2fx(Rect.y); } pGrabbed->m_lQuads.add(n); } } return pGrabbed->m_lQuads.size()?1:0; } void CLayerQuads::BrushPlace(CLayer *pBrush, float wx, float wy) { CLayerQuads *l = (CLayerQuads *)pBrush; for(int i = 0; i < l->m_lQuads.size(); i++) { CQuad n = l->m_lQuads[i]; for(int p = 0; p < 5; p++) { n.m_aPoints[p].x += f2fx(wx); n.m_aPoints[p].y += f2fx(wy); } m_lQuads.add(n); } m_pEditor->m_Map.m_Modified = true; } void CLayerQuads::BrushFlipX() { } void CLayerQuads::BrushFlipY() { } void Rotate(vec2 *pCenter, vec2 *pPoint, float Rotation) { float x = pPoint->x - pCenter->x; float y = pPoint->y - pCenter->y; pPoint->x = x * cosf(Rotation) - y * sinf(Rotation) + pCenter->x; pPoint->y = x * sinf(Rotation) + y * cosf(Rotation) + pCenter->y; } void CLayerQuads::BrushRotate(float Amount) { vec2 Center; GetSize(&Center.x, &Center.y); Center.x /= 2; Center.y /= 2; for(int i = 0; i < m_lQuads.size(); i++) { CQuad *q = &m_lQuads[i]; for(int p = 0; p < 5; p++) { vec2 Pos(fx2f(q->m_aPoints[p].x), fx2f(q->m_aPoints[p].y)); Rotate(&Center, &Pos, Amount); q->m_aPoints[p].x = f2fx(Pos.x); q->m_aPoints[p].y = f2fx(Pos.y); } } } void CLayerQuads::GetSize(float *w, float *h) { *w = 0; *h = 0; for(int i = 0; i < m_lQuads.size(); i++) { for(int p = 0; p < 5; p++) { *w = max(*w, fx2f(m_lQuads[i].m_aPoints[p].x)); *h = max(*h, fx2f(m_lQuads[i].m_aPoints[p].y)); } } } extern int gs_SelectedPoints; int CLayerQuads::RenderProperties(CUIRect *pToolBox) { // layer props enum { PROP_IMAGE=0, NUM_PROPS, }; CProperty aProps[] = { {"Image", m_Image, PROPTYPE_IMAGE, -1, 0}, {0}, }; static int s_aIds[NUM_PROPS] = {0}; int NewVal = 0; int Prop = m_pEditor->DoProperties(pToolBox, aProps, s_aIds, &NewVal); if(Prop != -1) m_pEditor->m_Map.m_Modified = true; if(Prop == PROP_IMAGE) { if(NewVal >= 0) m_Image = NewVal%m_pEditor->m_Map.m_lImages.size(); else m_Image = -1; } return 0; } void CLayerQuads::ModifyImageIndex(INDEX_MODIFY_FUNC Func) { Func(&m_Image); } void CLayerQuads::ModifyEnvelopeIndex(INDEX_MODIFY_FUNC Func) { for(int i = 0; i < m_lQuads.size(); i++) { Func(&m_lQuads[i].m_PosEnv); Func(&m_lQuads[i].m_ColorEnv); } } teeworlds-0.6.2+dfsg/src/game/editor/layer_tiles.cpp0000644000175000017500000003136212140200333021445 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "editor.h" #include CLayerTiles::CLayerTiles(int w, int h) { m_Type = LAYERTYPE_TILES; str_copy(m_aName, "Tiles", sizeof(m_aName)); m_Width = w; m_Height = h; m_Image = -1; m_TexID = -1; m_Game = 0; m_Color.r = 255; m_Color.g = 255; m_Color.b = 255; m_Color.a = 255; m_ColorEnv = -1; m_ColorEnvOffset = 0; m_pTiles = new CTile[m_Width*m_Height]; mem_zero(m_pTiles, m_Width*m_Height*sizeof(CTile)); } CLayerTiles::~CLayerTiles() { delete [] m_pTiles; } void CLayerTiles::PrepareForSave() { for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pTiles[y*m_Width+x].m_Flags &= TILEFLAG_VFLIP|TILEFLAG_HFLIP|TILEFLAG_ROTATE; if(m_Image != -1 && m_Color.a == 255) { for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pTiles[y*m_Width+x].m_Flags |= m_pEditor->m_Map.m_lImages[m_Image]->m_aTileFlags[m_pTiles[y*m_Width+x].m_Index]; } } void CLayerTiles::MakePalette() { for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pTiles[y*m_Width+x].m_Index = y*16+x; } void CLayerTiles::Render() { if(m_Image >= 0 && m_Image < m_pEditor->m_Map.m_lImages.size()) m_TexID = m_pEditor->m_Map.m_lImages[m_Image]->m_TexID; Graphics()->TextureSet(m_TexID); vec4 Color = vec4(m_Color.r/255.0f, m_Color.g/255.0f, m_Color.b/255.0f, m_Color.a/255.0f); Graphics()->BlendNone(); m_pEditor->RenderTools()->RenderTilemap(m_pTiles, m_Width, m_Height, 32.0f, Color, LAYERRENDERFLAG_OPAQUE, m_pEditor->EnvelopeEval, m_pEditor, m_ColorEnv, m_ColorEnvOffset); Graphics()->BlendNormal(); m_pEditor->RenderTools()->RenderTilemap(m_pTiles, m_Width, m_Height, 32.0f, Color, LAYERRENDERFLAG_TRANSPARENT, m_pEditor->EnvelopeEval, m_pEditor, m_ColorEnv, m_ColorEnvOffset); } int CLayerTiles::ConvertX(float x) const { return (int)(x/32.0f); } int CLayerTiles::ConvertY(float y) const { return (int)(y/32.0f); } void CLayerTiles::Convert(CUIRect Rect, RECTi *pOut) { pOut->x = ConvertX(Rect.x); pOut->y = ConvertY(Rect.y); pOut->w = ConvertX(Rect.x+Rect.w+31) - pOut->x; pOut->h = ConvertY(Rect.y+Rect.h+31) - pOut->y; } void CLayerTiles::Snap(CUIRect *pRect) { RECTi Out; Convert(*pRect, &Out); pRect->x = Out.x*32.0f; pRect->y = Out.y*32.0f; pRect->w = Out.w*32.0f; pRect->h = Out.h*32.0f; } void CLayerTiles::Clamp(RECTi *pRect) { if(pRect->x < 0) { pRect->w += pRect->x; pRect->x = 0; } if(pRect->y < 0) { pRect->h += pRect->y; pRect->y = 0; } if(pRect->x+pRect->w > m_Width) pRect->w = m_Width - pRect->x; if(pRect->y+pRect->h > m_Height) pRect->h = m_Height - pRect->y; if(pRect->h < 0) pRect->h = 0; if(pRect->w < 0) pRect->w = 0; } void CLayerTiles::BrushSelecting(CUIRect Rect) { Graphics()->TextureSet(-1); m_pEditor->Graphics()->QuadsBegin(); m_pEditor->Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.4f); Snap(&Rect); IGraphics::CQuadItem QuadItem(Rect.x, Rect.y, Rect.w, Rect.h); m_pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1); m_pEditor->Graphics()->QuadsEnd(); char aBuf[16]; str_format(aBuf, sizeof(aBuf), "%d,%d", ConvertX(Rect.w), ConvertY(Rect.h)); TextRender()->Text(0, Rect.x+3.0f, Rect.y+3.0f, m_pEditor->m_ShowPicker?15.0f:15.0f*m_pEditor->m_WorldZoom, aBuf, -1); } int CLayerTiles::BrushGrab(CLayerGroup *pBrush, CUIRect Rect) { RECTi r; Convert(Rect, &r); Clamp(&r); if(!r.w || !r.h) return 0; // create new layers CLayerTiles *pGrabbed = new CLayerTiles(r.w, r.h); pGrabbed->m_pEditor = m_pEditor; pGrabbed->m_TexID = m_TexID; pGrabbed->m_Image = m_Image; pGrabbed->m_Game = m_Game; pBrush->AddLayer(pGrabbed); // copy the tiles for(int y = 0; y < r.h; y++) for(int x = 0; x < r.w; x++) pGrabbed->m_pTiles[y*pGrabbed->m_Width+x] = m_pTiles[(r.y+y)*m_Width+(r.x+x)]; return 1; } void CLayerTiles::FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect) { if(m_Readonly) return; Snap(&Rect); int sx = ConvertX(Rect.x); int sy = ConvertY(Rect.y); int w = ConvertX(Rect.w); int h = ConvertY(Rect.h); CLayerTiles *pLt = static_cast(pBrush); for(int y = 0; y < h; y++) { for(int x = 0; x < w; x++) { int fx = x+sx; int fy = y+sy; if(fx < 0 || fx >= m_Width || fy < 0 || fy >= m_Height) continue; if(Empty) m_pTiles[fy*m_Width+fx].m_Index = 1; else m_pTiles[fy*m_Width+fx] = pLt->m_pTiles[(y*pLt->m_Width + x%pLt->m_Width) % (pLt->m_Width*pLt->m_Height)]; } } m_pEditor->m_Map.m_Modified = true; } void CLayerTiles::BrushDraw(CLayer *pBrush, float wx, float wy) { if(m_Readonly) return; // CLayerTiles *l = (CLayerTiles *)pBrush; int sx = ConvertX(wx); int sy = ConvertY(wy); for(int y = 0; y < l->m_Height; y++) for(int x = 0; x < l->m_Width; x++) { int fx = x+sx; int fy = y+sy; if(fx<0 || fx >= m_Width || fy < 0 || fy >= m_Height) continue; m_pTiles[fy*m_Width+fx] = l->m_pTiles[y*l->m_Width+x]; } m_pEditor->m_Map.m_Modified = true; } void CLayerTiles::BrushFlipX() { for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width/2; x++) { CTile Tmp = m_pTiles[y*m_Width+x]; m_pTiles[y*m_Width+x] = m_pTiles[y*m_Width+m_Width-1-x]; m_pTiles[y*m_Width+m_Width-1-x] = Tmp; } if(!m_Game) for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pTiles[y*m_Width+x].m_Flags ^= m_pTiles[y*m_Width+x].m_Flags&TILEFLAG_ROTATE ? TILEFLAG_HFLIP : TILEFLAG_VFLIP; } void CLayerTiles::BrushFlipY() { for(int y = 0; y < m_Height/2; y++) for(int x = 0; x < m_Width; x++) { CTile Tmp = m_pTiles[y*m_Width+x]; m_pTiles[y*m_Width+x] = m_pTiles[(m_Height-1-y)*m_Width+x]; m_pTiles[(m_Height-1-y)*m_Width+x] = Tmp; } if(!m_Game) for(int y = 0; y < m_Height; y++) for(int x = 0; x < m_Width; x++) m_pTiles[y*m_Width+x].m_Flags ^= m_pTiles[y*m_Width+x].m_Flags&TILEFLAG_ROTATE ? TILEFLAG_VFLIP : TILEFLAG_HFLIP; } void CLayerTiles::BrushRotate(float Amount) { int Rotation = (round(360.0f*Amount/(pi*2))/90)%4; // 0=0, 1=90, 2=180, 3=270 if(Rotation < 0) Rotation +=4; if(Rotation == 1 || Rotation == 3) { // 90 rotation CTile *pTempData = new CTile[m_Width*m_Height]; mem_copy(pTempData, m_pTiles, m_Width*m_Height*sizeof(CTile)); CTile *pDst = m_pTiles; for(int x = 0; x < m_Width; ++x) for(int y = m_Height-1; y >= 0; --y, ++pDst) { *pDst = pTempData[y*m_Width+x]; if(!m_Game) { if(pDst->m_Flags&TILEFLAG_ROTATE) pDst->m_Flags ^= (TILEFLAG_HFLIP|TILEFLAG_VFLIP); pDst->m_Flags ^= TILEFLAG_ROTATE; } } int Temp = m_Width; m_Width = m_Height; m_Height = Temp; delete[] pTempData; } if(Rotation == 2 || Rotation == 3) { BrushFlipX(); BrushFlipY(); } } void CLayerTiles::Resize(int NewW, int NewH) { CTile *pNewData = new CTile[NewW*NewH]; mem_zero(pNewData, NewW*NewH*sizeof(CTile)); // copy old data for(int y = 0; y < min(NewH, m_Height); y++) mem_copy(&pNewData[y*NewW], &m_pTiles[y*m_Width], min(m_Width, NewW)*sizeof(CTile)); // replace old delete [] m_pTiles; m_pTiles = pNewData; m_Width = NewW; m_Height = NewH; } void CLayerTiles::Shift(int Direction) { switch(Direction) { case 1: { // left for(int y = 0; y < m_Height; ++y) mem_move(&m_pTiles[y*m_Width], &m_pTiles[y*m_Width+1], (m_Width-1)*sizeof(CTile)); } break; case 2: { // right for(int y = 0; y < m_Height; ++y) mem_move(&m_pTiles[y*m_Width+1], &m_pTiles[y*m_Width], (m_Width-1)*sizeof(CTile)); } break; case 4: { // up for(int y = 0; y < m_Height-1; ++y) mem_copy(&m_pTiles[y*m_Width], &m_pTiles[(y+1)*m_Width], m_Width*sizeof(CTile)); } break; case 8: { // down for(int y = m_Height-1; y > 0; --y) mem_copy(&m_pTiles[y*m_Width], &m_pTiles[(y-1)*m_Width], m_Width*sizeof(CTile)); } } } void CLayerTiles::ShowInfo() { float ScreenX0, ScreenY0, ScreenX1, ScreenY1; Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); Graphics()->TextureSet(m_pEditor->Client()->GetDebugFont()); Graphics()->QuadsBegin(); int StartY = max(0, (int)(ScreenY0/32.0f)-1); int StartX = max(0, (int)(ScreenX0/32.0f)-1); int EndY = min((int)(ScreenY1/32.0f)+1, m_Height); int EndX = min((int)(ScreenX1/32.0f)+1, m_Width); for(int y = StartY; y < EndY; y++) for(int x = StartX; x < EndX; x++) { int c = x + y*m_Width; if(m_pTiles[c].m_Index) { char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%i", m_pTiles[c].m_Index); m_pEditor->Graphics()->QuadsText(x*32, y*32, 16.0f, aBuf); char aFlags[4] = { m_pTiles[c].m_Flags&TILEFLAG_VFLIP ? 'V' : ' ', m_pTiles[c].m_Flags&TILEFLAG_HFLIP ? 'H' : ' ', m_pTiles[c].m_Flags&TILEFLAG_ROTATE? 'R' : ' ', 0}; m_pEditor->Graphics()->QuadsText(x*32, y*32+16, 16.0f, aFlags); } x += m_pTiles[c].m_Skip; } Graphics()->QuadsEnd(); Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } int CLayerTiles::RenderProperties(CUIRect *pToolBox) { CUIRect Button; bool InGameGroup = !find_linear(m_pEditor->m_Map.m_pGameGroup->m_lLayers.all(), this).empty(); if(m_pEditor->m_Map.m_pGameLayer != this) { if(m_Image >= 0 && m_Image < m_pEditor->m_Map.m_lImages.size() && m_pEditor->m_Map.m_lImages[m_Image]->m_AutoMapper.IsLoaded()) { static int s_AutoMapperButton = 0; pToolBox->HSplitBottom(12.0f, pToolBox, &Button); if(m_pEditor->DoButton_Editor(&s_AutoMapperButton, "Auto map", 0, &Button, 0, "")) m_pEditor->PopupSelectConfigAutoMapInvoke(m_pEditor->UI()->MouseX(), m_pEditor->UI()->MouseY()); int Result = m_pEditor->PopupSelectConfigAutoMapResult(); if(Result > -1) { m_pEditor->m_Map.m_lImages[m_Image]->m_AutoMapper.Proceed(this, Result); return 1; } } } else InGameGroup = false; if(InGameGroup) { pToolBox->HSplitBottom(2.0f, pToolBox, 0); pToolBox->HSplitBottom(12.0f, pToolBox, &Button); static int s_ColclButton = 0; if(m_pEditor->DoButton_Editor(&s_ColclButton, "Game tiles", 0, &Button, 0, "Constructs game tiles from this layer")) m_pEditor->PopupSelectGametileOpInvoke(m_pEditor->UI()->MouseX(), m_pEditor->UI()->MouseY()); int Result = m_pEditor->PopupSelectGameTileOpResult(); if(Result > -1) { CLayerTiles *gl = m_pEditor->m_Map.m_pGameLayer; int w = min(gl->m_Width, m_Width); int h = min(gl->m_Height, m_Height); for(int y = 0; y < h; y++) for(int x = 0; x < w; x++) if(m_pTiles[y*m_Width+x].m_Index) gl->m_pTiles[y*gl->m_Width+x].m_Index = TILE_AIR+Result; return 1; } } enum { PROP_WIDTH=0, PROP_HEIGHT, PROP_SHIFT, PROP_IMAGE, PROP_COLOR, PROP_COLOR_ENV, PROP_COLOR_ENV_OFFSET, NUM_PROPS, }; int Color = 0; Color |= m_Color.r<<24; Color |= m_Color.g<<16; Color |= m_Color.b<<8; Color |= m_Color.a; CProperty aProps[] = { {"Width", m_Width, PROPTYPE_INT_SCROLL, 1, 1000000000}, {"Height", m_Height, PROPTYPE_INT_SCROLL, 1, 1000000000}, {"Shift", 0, PROPTYPE_SHIFT, 0, 0}, {"Image", m_Image, PROPTYPE_IMAGE, 0, 0}, {"Color", Color, PROPTYPE_COLOR, 0, 0}, {"Color Env", m_ColorEnv+1, PROPTYPE_INT_STEP, 0, m_pEditor->m_Map.m_lEnvelopes.size()+1}, {"Color TO", m_ColorEnvOffset, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {0}, }; if(m_pEditor->m_Map.m_pGameLayer == this) // remove the image and color properties if this is the game layer { aProps[3].m_pName = 0; aProps[4].m_pName = 0; } static int s_aIds[NUM_PROPS] = {0}; int NewVal = 0; int Prop = m_pEditor->DoProperties(pToolBox, aProps, s_aIds, &NewVal); if(Prop != -1) m_pEditor->m_Map.m_Modified = true; if(Prop == PROP_WIDTH && NewVal > 1) Resize(NewVal, m_Height); else if(Prop == PROP_HEIGHT && NewVal > 1) Resize(m_Width, NewVal); else if(Prop == PROP_SHIFT) Shift(NewVal); else if(Prop == PROP_IMAGE) { if (NewVal == -1) { m_TexID = -1; m_Image = -1; } else m_Image = NewVal%m_pEditor->m_Map.m_lImages.size(); } else if(Prop == PROP_COLOR) { m_Color.r = (NewVal>>24)&0xff; m_Color.g = (NewVal>>16)&0xff; m_Color.b = (NewVal>>8)&0xff; m_Color.a = NewVal&0xff; } if(Prop == PROP_COLOR_ENV) { int Index = clamp(NewVal-1, -1, m_pEditor->m_Map.m_lEnvelopes.size()-1); int Step = (Index-m_ColorEnv)%2; if(Step != 0) { for(; Index >= -1 && Index < m_pEditor->m_Map.m_lEnvelopes.size(); Index += Step) if(Index == -1 || m_pEditor->m_Map.m_lEnvelopes[Index]->m_Channels == 4) { m_ColorEnv = Index; break; } } } if(Prop == PROP_COLOR_ENV_OFFSET) m_ColorEnvOffset = NewVal; return 0; } void CLayerTiles::ModifyImageIndex(INDEX_MODIFY_FUNC Func) { Func(&m_Image); } void CLayerTiles::ModifyEnvelopeIndex(INDEX_MODIFY_FUNC Func) { } teeworlds-0.6.2+dfsg/src/game/editor/popups.cpp0000644000175000017500000007275312140200333020470 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "editor.h" // popup menu handling static struct { CUIRect m_Rect; void *m_pId; int (*m_pfnFunc)(CEditor *pEditor, CUIRect Rect); int m_IsMenu; void *m_pExtra; } s_UiPopups[8]; static int g_UiNumPopups = 0; void CEditor::UiInvokePopupMenu(void *pID, int Flags, float x, float y, float Width, float Height, int (*pfnFunc)(CEditor *pEditor, CUIRect Rect), void *pExtra) { Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor", "invoked"); if(x + Width > UI()->Screen()->w) x -= Width; if(y + Height > UI()->Screen()->h) y -= Height; s_UiPopups[g_UiNumPopups].m_pId = pID; s_UiPopups[g_UiNumPopups].m_IsMenu = Flags; s_UiPopups[g_UiNumPopups].m_Rect.x = x; s_UiPopups[g_UiNumPopups].m_Rect.y = y; s_UiPopups[g_UiNumPopups].m_Rect.w = Width; s_UiPopups[g_UiNumPopups].m_Rect.h = Height; s_UiPopups[g_UiNumPopups].m_pfnFunc = pfnFunc; s_UiPopups[g_UiNumPopups].m_pExtra = pExtra; g_UiNumPopups++; } void CEditor::UiDoPopupMenu() { for(int i = 0; i < g_UiNumPopups; i++) { bool Inside = UI()->MouseInside(&s_UiPopups[i].m_Rect); UI()->SetHotItem(&s_UiPopups[i].m_pId); if(UI()->ActiveItem() == &s_UiPopups[i].m_pId) { if(!UI()->MouseButton(0)) { if(!Inside) g_UiNumPopups--; UI()->SetActiveItem(0); } } else if(UI()->HotItem() == &s_UiPopups[i].m_pId) { if(UI()->MouseButton(0)) UI()->SetActiveItem(&s_UiPopups[i].m_pId); } int Corners = CUI::CORNER_ALL; if(s_UiPopups[i].m_IsMenu) Corners = CUI::CORNER_R|CUI::CORNER_B; CUIRect r = s_UiPopups[i].m_Rect; RenderTools()->DrawUIRect(&r, vec4(0.5f,0.5f,0.5f,0.75f), Corners, 3.0f); r.Margin(1.0f, &r); RenderTools()->DrawUIRect(&r, vec4(0,0,0,0.75f), Corners, 3.0f); r.Margin(4.0f, &r); if(s_UiPopups[i].m_pfnFunc(this, r)) g_UiNumPopups--; if(Input()->KeyDown(KEY_ESCAPE)) g_UiNumPopups--; } } int CEditor::PopupGroup(CEditor *pEditor, CUIRect View) { // remove group button CUIRect Button; View.HSplitBottom(12.0f, &View, &Button); static int s_DeleteButton = 0; // don't allow deletion of game group if(pEditor->m_Map.m_pGameGroup != pEditor->GetSelectedGroup()) { if(pEditor->DoButton_Editor(&s_DeleteButton, "Delete group", 0, &Button, 0, "Delete group")) { pEditor->m_Map.DeleteGroup(pEditor->m_SelectedGroup); pEditor->m_SelectedGroup = max(0, pEditor->m_SelectedGroup-1); return 1; } } else { if(pEditor->DoButton_Editor(&s_DeleteButton, "Clean-up game tiles", 0, &Button, 0, "Removes game tiles that aren't based on a layer")) { // gather all tile layers array Layers; for(int i = 0; i < pEditor->m_Map.m_pGameGroup->m_lLayers.size(); ++i) { if(pEditor->m_Map.m_pGameGroup->m_lLayers[i] != pEditor->m_Map.m_pGameLayer && pEditor->m_Map.m_pGameGroup->m_lLayers[i]->m_Type == LAYERTYPE_TILES) Layers.add(static_cast(pEditor->m_Map.m_pGameGroup->m_lLayers[i])); } // search for unneeded game tiles CLayerTiles *gl = pEditor->m_Map.m_pGameLayer; for(int y = 0; y < gl->m_Height; ++y) for(int x = 0; x < gl->m_Width; ++x) { if(gl->m_pTiles[y*gl->m_Width+x].m_Index > static_cast(TILE_NOHOOK)) continue; bool Found = false; for(int i = 0; i < Layers.size(); ++i) { if(x < Layers[i]->m_Width && y < Layers[i]->m_Height && Layers[i]->m_pTiles[y*Layers[i]->m_Width+x].m_Index) { Found = true; break; } } if(!Found) { gl->m_pTiles[y*gl->m_Width+x].m_Index = TILE_AIR; pEditor->m_Map.m_Modified = true; } } return 1; } } // new tile layer View.HSplitBottom(10.0f, &View, &Button); View.HSplitBottom(12.0f, &View, &Button); static int s_NewQuadLayerButton = 0; if(pEditor->DoButton_Editor(&s_NewQuadLayerButton, "Add quads layer", 0, &Button, 0, "Creates a new quad layer")) { CLayer *l = new CLayerQuads; l->m_pEditor = pEditor; pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->AddLayer(l); pEditor->m_SelectedLayer = pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_lLayers.size()-1; pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_Collapse = false; return 1; } // new quad layer View.HSplitBottom(5.0f, &View, &Button); View.HSplitBottom(12.0f, &View, &Button); static int s_NewTileLayerButton = 0; if(pEditor->DoButton_Editor(&s_NewTileLayerButton, "Add tile layer", 0, &Button, 0, "Creates a new tile layer")) { CLayer *l = new CLayerTiles(50, 50); l->m_pEditor = pEditor; pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->AddLayer(l); pEditor->m_SelectedLayer = pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_lLayers.size()-1; pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_Collapse = false; return 1; } // group name if(!pEditor->GetSelectedGroup()->m_GameGroup) { View.HSplitBottom(5.0f, &View, &Button); View.HSplitBottom(12.0f, &View, &Button); static float s_Name = 0; pEditor->UI()->DoLabel(&Button, "Name:", 10.0f, -1, -1); Button.VSplitLeft(40.0f, 0, &Button); if(pEditor->DoEditBox(&s_Name, &Button, pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_aName, sizeof(pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_aName), 10.0f, &s_Name)) pEditor->m_Map.m_Modified = true; } enum { PROP_ORDER=0, PROP_POS_X, PROP_POS_Y, PROP_PARA_X, PROP_PARA_Y, PROP_USE_CLIPPING, PROP_CLIP_X, PROP_CLIP_Y, PROP_CLIP_W, PROP_CLIP_H, NUM_PROPS, }; CProperty aProps[] = { {"Order", pEditor->m_SelectedGroup, PROPTYPE_INT_STEP, 0, pEditor->m_Map.m_lGroups.size()-1}, {"Pos X", -pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_OffsetX, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Pos Y", -pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_OffsetY, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Para X", pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ParallaxX, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Para Y", pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ParallaxY, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Use Clipping", pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_UseClipping, PROPTYPE_BOOL, 0, 1}, {"Clip X", pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipX, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Clip Y", pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipY, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Clip W", pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipW, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Clip H", pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipH, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {0}, }; static int s_aIds[NUM_PROPS] = {0}; int NewVal = 0; // cut the properties that isn't needed if(pEditor->GetSelectedGroup()->m_GameGroup) aProps[PROP_POS_X].m_pName = 0; int Prop = pEditor->DoProperties(&View, aProps, s_aIds, &NewVal); if(Prop != -1) pEditor->m_Map.m_Modified = true; if(Prop == PROP_ORDER) pEditor->m_SelectedGroup = pEditor->m_Map.SwapGroups(pEditor->m_SelectedGroup, NewVal); // these can not be changed on the game group if(!pEditor->GetSelectedGroup()->m_GameGroup) { if(Prop == PROP_PARA_X) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ParallaxX = NewVal; else if(Prop == PROP_PARA_Y) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ParallaxY = NewVal; else if(Prop == PROP_POS_X) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_OffsetX = -NewVal; else if(Prop == PROP_POS_Y) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_OffsetY = -NewVal; else if(Prop == PROP_USE_CLIPPING) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_UseClipping = NewVal; else if(Prop == PROP_CLIP_X) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipX = NewVal; else if(Prop == PROP_CLIP_Y) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipY = NewVal; else if(Prop == PROP_CLIP_W) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipW = NewVal; else if(Prop == PROP_CLIP_H) pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->m_ClipH = NewVal; } return 0; } int CEditor::PopupLayer(CEditor *pEditor, CUIRect View) { // remove layer button CUIRect Button; View.HSplitBottom(12.0f, &View, &Button); static int s_DeleteButton = 0; // don't allow deletion of game layer if(pEditor->m_Map.m_pGameLayer != pEditor->GetSelectedLayer(0) && pEditor->DoButton_Editor(&s_DeleteButton, "Delete layer", 0, &Button, 0, "Deletes the layer")) { pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]->DeleteLayer(pEditor->m_SelectedLayer); return 1; } // layer name if(pEditor->m_Map.m_pGameLayer != pEditor->GetSelectedLayer(0)) { View.HSplitBottom(5.0f, &View, &Button); View.HSplitBottom(12.0f, &View, &Button); static float s_Name = 0; pEditor->UI()->DoLabel(&Button, "Name:", 10.0f, -1, -1); Button.VSplitLeft(40.0f, 0, &Button); if(pEditor->DoEditBox(&s_Name, &Button, pEditor->GetSelectedLayer(0)->m_aName, sizeof(pEditor->GetSelectedLayer(0)->m_aName), 10.0f, &s_Name)) pEditor->m_Map.m_Modified = true; } View.HSplitBottom(10.0f, &View, 0); CLayerGroup *pCurrentGroup = pEditor->m_Map.m_lGroups[pEditor->m_SelectedGroup]; CLayer *pCurrentLayer = pEditor->GetSelectedLayer(0); enum { PROP_GROUP=0, PROP_ORDER, PROP_HQ, NUM_PROPS, }; CProperty aProps[] = { {"Group", pEditor->m_SelectedGroup, PROPTYPE_INT_STEP, 0, pEditor->m_Map.m_lGroups.size()-1}, {"Order", pEditor->m_SelectedLayer, PROPTYPE_INT_STEP, 0, pCurrentGroup->m_lLayers.size()}, {"Detail", pCurrentLayer->m_Flags&LAYERFLAG_DETAIL, PROPTYPE_BOOL, 0, 1}, {0}, }; if(pEditor->m_Map.m_pGameLayer == pEditor->GetSelectedLayer(0)) // dont use Group and Detail from the selection if this is the game layer { aProps[0].m_Type = PROPTYPE_NULL; aProps[2].m_Type = PROPTYPE_NULL; } static int s_aIds[NUM_PROPS] = {0}; int NewVal = 0; int Prop = pEditor->DoProperties(&View, aProps, s_aIds, &NewVal); if(Prop != -1) pEditor->m_Map.m_Modified = true; if(Prop == PROP_ORDER) pEditor->m_SelectedLayer = pCurrentGroup->SwapLayers(pEditor->m_SelectedLayer, NewVal); else if(Prop == PROP_GROUP && pCurrentLayer->m_Type != LAYERTYPE_GAME) { if(NewVal >= 0 && NewVal < pEditor->m_Map.m_lGroups.size()) { pCurrentGroup->m_lLayers.remove(pCurrentLayer); pEditor->m_Map.m_lGroups[NewVal]->m_lLayers.add(pCurrentLayer); pEditor->m_SelectedGroup = NewVal; pEditor->m_SelectedLayer = pEditor->m_Map.m_lGroups[NewVal]->m_lLayers.size()-1; } } else if(Prop == PROP_HQ) { pCurrentLayer->m_Flags &= ~LAYERFLAG_DETAIL; if(NewVal) pCurrentLayer->m_Flags |= LAYERFLAG_DETAIL; } return pCurrentLayer->RenderProperties(&View); } int CEditor::PopupQuad(CEditor *pEditor, CUIRect View) { CQuad *pQuad = pEditor->GetSelectedQuad(); CUIRect Button; // delete button View.HSplitBottom(12.0f, &View, &Button); static int s_DeleteButton = 0; if(pEditor->DoButton_Editor(&s_DeleteButton, "Delete", 0, &Button, 0, "Deletes the current quad")) { CLayerQuads *pLayer = (CLayerQuads *)pEditor->GetSelectedLayerType(0, LAYERTYPE_QUADS); if(pLayer) { pEditor->m_Map.m_Modified = true; pLayer->m_lQuads.remove_index(pEditor->m_SelectedQuad); pEditor->m_SelectedQuad--; } return 1; } // aspect ratio button View.HSplitBottom(10.0f, &View, &Button); View.HSplitBottom(12.0f, &View, &Button); CLayerQuads *pLayer = (CLayerQuads *)pEditor->GetSelectedLayerType(0, LAYERTYPE_QUADS); if(pLayer && pLayer->m_Image >= 0 && pLayer->m_Image < pEditor->m_Map.m_lImages.size()) { static int s_AspectRatioButton = 0; if(pEditor->DoButton_Editor(&s_AspectRatioButton, "Aspect ratio", 0, &Button, 0, "Resizes the current Quad based on the aspect ratio of the image")) { int Top = pQuad->m_aPoints[0].y; int Left = pQuad->m_aPoints[0].x; int Right = pQuad->m_aPoints[0].x; for(int k = 1; k < 4; k++) { if(pQuad->m_aPoints[k].y < Top) Top = pQuad->m_aPoints[k].y; if(pQuad->m_aPoints[k].x < Left) Left = pQuad->m_aPoints[k].x; if(pQuad->m_aPoints[k].x > Right) Right = pQuad->m_aPoints[k].x; } int Height = (Right-Left)*pEditor->m_Map.m_lImages[pLayer->m_Image]->m_Height/pEditor->m_Map.m_lImages[pLayer->m_Image]->m_Width; pQuad->m_aPoints[0].x = Left; pQuad->m_aPoints[0].y = Top; pQuad->m_aPoints[1].x = Right; pQuad->m_aPoints[1].y = Top; pQuad->m_aPoints[2].x = Left; pQuad->m_aPoints[2].y = Top+Height; pQuad->m_aPoints[3].x = Right; pQuad->m_aPoints[3].y = Top+Height; pEditor->m_Map.m_Modified = true; return 1; } } // align button View.HSplitBottom(6.0f, &View, &Button); View.HSplitBottom(12.0f, &View, &Button); static int s_AlignButton = 0; if(pEditor->DoButton_Editor(&s_AlignButton, "Align", 0, &Button, 0, "Aligns coordinates of the quad points")) { for(int k = 1; k < 4; k++) { pQuad->m_aPoints[k].x = 1000.0f * (int(pQuad->m_aPoints[k].x) / 1000); pQuad->m_aPoints[k].y = 1000.0f * (int(pQuad->m_aPoints[k].y) / 1000); } pEditor->m_Map.m_Modified = true; return 1; } // square button View.HSplitBottom(6.0f, &View, &Button); View.HSplitBottom(12.0f, &View, &Button); static int s_Button = 0; if(pEditor->DoButton_Editor(&s_Button, "Square", 0, &Button, 0, "Squares the current quad")) { int Top = pQuad->m_aPoints[0].y; int Left = pQuad->m_aPoints[0].x; int Bottom = pQuad->m_aPoints[0].y; int Right = pQuad->m_aPoints[0].x; for(int k = 1; k < 4; k++) { if(pQuad->m_aPoints[k].y < Top) Top = pQuad->m_aPoints[k].y; if(pQuad->m_aPoints[k].x < Left) Left = pQuad->m_aPoints[k].x; if(pQuad->m_aPoints[k].y > Bottom) Bottom = pQuad->m_aPoints[k].y; if(pQuad->m_aPoints[k].x > Right) Right = pQuad->m_aPoints[k].x; } pQuad->m_aPoints[0].x = Left; pQuad->m_aPoints[0].y = Top; pQuad->m_aPoints[1].x = Right; pQuad->m_aPoints[1].y = Top; pQuad->m_aPoints[2].x = Left; pQuad->m_aPoints[2].y = Bottom; pQuad->m_aPoints[3].x = Right; pQuad->m_aPoints[3].y = Bottom; pEditor->m_Map.m_Modified = true; return 1; } enum { PROP_POS_X=0, PROP_POS_Y, PROP_POS_ENV, PROP_POS_ENV_OFFSET, PROP_COLOR_ENV, PROP_COLOR_ENV_OFFSET, NUM_PROPS, }; CProperty aProps[] = { {"Pos X", pQuad->m_aPoints[4].x/1000, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Pos Y", pQuad->m_aPoints[4].y/1000, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Pos. Env", pQuad->m_PosEnv+1, PROPTYPE_INT_STEP, 0, pEditor->m_Map.m_lEnvelopes.size()+1}, {"Pos. TO", pQuad->m_PosEnvOffset, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Color Env", pQuad->m_ColorEnv+1, PROPTYPE_INT_STEP, 0, pEditor->m_Map.m_lEnvelopes.size()+1}, {"Color TO", pQuad->m_ColorEnvOffset, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {0}, }; static int s_aIds[NUM_PROPS] = {0}; int NewVal = 0; int Prop = pEditor->DoProperties(&View, aProps, s_aIds, &NewVal); if(Prop != -1) pEditor->m_Map.m_Modified = true; if(Prop == PROP_POS_X) { float Offset = NewVal*1000-pQuad->m_aPoints[4].x; for(int k = 0; k < 5; ++k) pQuad->m_aPoints[k].x += Offset; } if(Prop == PROP_POS_Y) { float Offset = NewVal*1000-pQuad->m_aPoints[4].y; for(int k = 0; k < 5; ++k) pQuad->m_aPoints[k].y += Offset; } if(Prop == PROP_POS_ENV) { int Index = clamp(NewVal-1, -1, pEditor->m_Map.m_lEnvelopes.size()-1); int Step = (Index-pQuad->m_PosEnv)%2; if(Step != 0) { for(; Index >= -1 && Index < pEditor->m_Map.m_lEnvelopes.size(); Index += Step) if(Index == -1 || pEditor->m_Map.m_lEnvelopes[Index]->m_Channels == 3) { pQuad->m_PosEnv = Index; break; } } } if(Prop == PROP_POS_ENV_OFFSET) pQuad->m_PosEnvOffset = NewVal; if(Prop == PROP_COLOR_ENV) { int Index = clamp(NewVal-1, -1, pEditor->m_Map.m_lEnvelopes.size()-1); int Step = (Index-pQuad->m_ColorEnv)%2; if(Step != 0) { for(; Index >= -1 && Index < pEditor->m_Map.m_lEnvelopes.size(); Index += Step) if(Index == -1 || pEditor->m_Map.m_lEnvelopes[Index]->m_Channels == 4) { pQuad->m_ColorEnv = Index; break; } } } if(Prop == PROP_COLOR_ENV_OFFSET) pQuad->m_ColorEnvOffset = NewVal; return 0; } int CEditor::PopupPoint(CEditor *pEditor, CUIRect View) { CQuad *pQuad = pEditor->GetSelectedQuad(); enum { PROP_POS_X=0, PROP_POS_Y, PROP_COLOR, NUM_PROPS, }; int Color = 0; int x = 0, y = 0; for(int v = 0; v < 4; v++) { if(pEditor->m_SelectedPoints&(1<m_aColors[v].r<<24; Color |= pQuad->m_aColors[v].g<<16; Color |= pQuad->m_aColors[v].b<<8; Color |= pQuad->m_aColors[v].a; x = pQuad->m_aPoints[v].x/1000; y = pQuad->m_aPoints[v].y/1000; } } CProperty aProps[] = { {"Pos X", x, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Pos Y", y, PROPTYPE_INT_SCROLL, -1000000, 1000000}, {"Color", Color, PROPTYPE_COLOR, -1, pEditor->m_Map.m_lEnvelopes.size()}, {0}, }; static int s_aIds[NUM_PROPS] = {0}; int NewVal = 0; int Prop = pEditor->DoProperties(&View, aProps, s_aIds, &NewVal); if(Prop != -1) pEditor->m_Map.m_Modified = true; if(Prop == PROP_POS_X) { for(int v = 0; v < 4; v++) if(pEditor->m_SelectedPoints&(1<m_aPoints[v].x = NewVal*1000; } if(Prop == PROP_POS_Y) { for(int v = 0; v < 4; v++) if(pEditor->m_SelectedPoints&(1<m_aPoints[v].y = NewVal*1000; } if(Prop == PROP_COLOR) { for(int v = 0; v < 4; v++) { if(pEditor->m_SelectedPoints&(1<m_aColors[v].r = (NewVal>>24)&0xff; pQuad->m_aColors[v].g = (NewVal>>16)&0xff; pQuad->m_aColors[v].b = (NewVal>>8)&0xff; pQuad->m_aColors[v].a = NewVal&0xff; } } } return 0; } int CEditor::PopupNewFolder(CEditor *pEditor, CUIRect View) { CUIRect Label, ButtonBar; // title View.HSplitTop(10.0f, 0, &View); View.HSplitTop(30.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "Create new folder", 20.0f, 0); View.HSplitBottom(10.0f, &View, 0); View.HSplitBottom(20.0f, &View, &ButtonBar); if(pEditor->m_FileDialogErrString[0] == 0) { // interaction box View.HSplitBottom(40.0f, &View, 0); View.VMargin(40.0f, &View); View.HSplitBottom(20.0f, &View, &Label); static float s_FolderBox = 0; pEditor->DoEditBox(&s_FolderBox, &Label, pEditor->m_FileDialogNewFolderName, sizeof(pEditor->m_FileDialogNewFolderName), 15.0f, &s_FolderBox); View.HSplitBottom(20.0f, &View, &Label); pEditor->UI()->DoLabel(&Label, "Name:", 10.0f, -1); // button bar ButtonBar.VSplitLeft(30.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(110.0f, &Label, &ButtonBar); static int s_CreateButton = 0; if(pEditor->DoButton_Editor(&s_CreateButton, "Create", 0, &Label, 0, 0)) { // create the folder if(*pEditor->m_FileDialogNewFolderName) { char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%s/%s", pEditor->m_pFileDialogPath, pEditor->m_FileDialogNewFolderName); if(pEditor->Storage()->CreateFolder(aBuf, IStorage::TYPE_SAVE)) { pEditor->FilelistPopulate(IStorage::TYPE_SAVE); return 1; } else str_copy(pEditor->m_FileDialogErrString, "Unable to create the folder", sizeof(pEditor->m_FileDialogErrString)); } } ButtonBar.VSplitRight(30.0f, &ButtonBar, 0); ButtonBar.VSplitRight(110.0f, &ButtonBar, &Label); static int s_AbortButton = 0; if(pEditor->DoButton_Editor(&s_AbortButton, "Abort", 0, &Label, 0, 0)) return 1; } else { // error text View.HSplitTop(30.0f, 0, &View); View.VMargin(40.0f, &View); View.HSplitTop(20.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "Error:", 10.0f, -1); View.HSplitTop(20.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "Unable to create the folder", 10.0f, -1, View.w); // button ButtonBar.VMargin(ButtonBar.w/2.0f-55.0f, &ButtonBar); static int s_CreateButton = 0; if(pEditor->DoButton_Editor(&s_CreateButton, "Ok", 0, &ButtonBar, 0, 0)) return 1; } return 0; } int CEditor::PopupMapInfo(CEditor *pEditor, CUIRect View) { CUIRect Label, ButtonBar, Button; // title View.HSplitTop(10.0f, 0, &View); View.HSplitTop(30.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "Map details", 20.0f, 0); View.HSplitBottom(10.0f, &View, 0); View.HSplitBottom(20.0f, &View, &ButtonBar); View.VMargin(40.0f, &View); // author box View.HSplitTop(20.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "Author:", 10.0f, -1); Label.VSplitLeft(40.0f, 0, &Button); Button.HSplitTop(12.0f, &Button, 0); static float s_AuthorBox = 0; pEditor->DoEditBox(&s_AuthorBox, &Button, pEditor->m_Map.m_MapInfo.m_aAuthorTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aAuthorTmp), 10.0f, &s_AuthorBox); // version box View.HSplitTop(20.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "Version:", 10.0f, -1); Label.VSplitLeft(40.0f, 0, &Button); Button.HSplitTop(12.0f, &Button, 0); static float s_VersionBox = 0; pEditor->DoEditBox(&s_VersionBox, &Button, pEditor->m_Map.m_MapInfo.m_aVersionTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aVersionTmp), 10.0f, &s_VersionBox); // credits box View.HSplitTop(20.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "Credits:", 10.0f, -1); Label.VSplitLeft(40.0f, 0, &Button); Button.HSplitTop(12.0f, &Button, 0); static float s_CreditsBox = 0; pEditor->DoEditBox(&s_CreditsBox, &Button, pEditor->m_Map.m_MapInfo.m_aCreditsTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aCreditsTmp), 10.0f, &s_CreditsBox); // license box View.HSplitTop(20.0f, &Label, &View); pEditor->UI()->DoLabel(&Label, "License:", 10.0f, -1); Label.VSplitLeft(40.0f, 0, &Button); Button.HSplitTop(12.0f, &Button, 0); static float s_LicenseBox = 0; pEditor->DoEditBox(&s_LicenseBox, &Button, pEditor->m_Map.m_MapInfo.m_aLicenseTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aLicenseTmp), 10.0f, &s_LicenseBox); // button bar ButtonBar.VSplitLeft(30.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(110.0f, &Label, &ButtonBar); static int s_CreateButton = 0; if(pEditor->DoButton_Editor(&s_CreateButton, "Save", 0, &Label, 0, 0)) { str_copy(pEditor->m_Map.m_MapInfo.m_aAuthor, pEditor->m_Map.m_MapInfo.m_aAuthorTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aAuthor)); str_copy(pEditor->m_Map.m_MapInfo.m_aVersion, pEditor->m_Map.m_MapInfo.m_aVersionTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aVersion)); str_copy(pEditor->m_Map.m_MapInfo.m_aCredits, pEditor->m_Map.m_MapInfo.m_aCreditsTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aCredits)); str_copy(pEditor->m_Map.m_MapInfo.m_aLicense, pEditor->m_Map.m_MapInfo.m_aLicenseTmp, sizeof(pEditor->m_Map.m_MapInfo.m_aLicense)); return 1; } ButtonBar.VSplitRight(30.0f, &ButtonBar, 0); ButtonBar.VSplitRight(110.0f, &ButtonBar, &Label); static int s_AbortButton = 0; if(pEditor->DoButton_Editor(&s_AbortButton, "Abort", 0, &Label, 0, 0)) return 1; return 0; } int CEditor::PopupEvent(CEditor *pEditor, CUIRect View) { CUIRect Label, ButtonBar; // title View.HSplitTop(10.0f, 0, &View); View.HSplitTop(30.0f, &Label, &View); if(pEditor->m_PopupEventType == POPEVENT_EXIT) pEditor->UI()->DoLabel(&Label, "Exit the editor", 20.0f, 0); else if(pEditor->m_PopupEventType == POPEVENT_LOAD) pEditor->UI()->DoLabel(&Label, "Load map", 20.0f, 0); else if(pEditor->m_PopupEventType == POPEVENT_NEW) pEditor->UI()->DoLabel(&Label, "New map", 20.0f, 0); else if(pEditor->m_PopupEventType == POPEVENT_SAVE) pEditor->UI()->DoLabel(&Label, "Save map", 20.0f, 0); View.HSplitBottom(10.0f, &View, 0); View.HSplitBottom(20.0f, &View, &ButtonBar); // notification text View.HSplitTop(30.0f, 0, &View); View.VMargin(40.0f, &View); View.HSplitTop(20.0f, &Label, &View); if(pEditor->m_PopupEventType == POPEVENT_EXIT) pEditor->UI()->DoLabel(&Label, "The map contains unsaved data, you might want to save it before you exit the editor.\nContinue anyway?", 10.0f, -1, Label.w-10.0f); else if(pEditor->m_PopupEventType == POPEVENT_LOAD) pEditor->UI()->DoLabel(&Label, "The map contains unsaved data, you might want to save it before you load a new map.\nContinue anyway?", 10.0f, -1, Label.w-10.0f); else if(pEditor->m_PopupEventType == POPEVENT_NEW) pEditor->UI()->DoLabel(&Label, "The map contains unsaved data, you might want to save it before you create a new map.\nContinue anyway?", 10.0f, -1, Label.w-10.0f); else if(pEditor->m_PopupEventType == POPEVENT_SAVE) pEditor->UI()->DoLabel(&Label, "The file already exists.\nDo you want to overwrite the map?", 10.0f, -1); // button bar ButtonBar.VSplitLeft(30.0f, 0, &ButtonBar); ButtonBar.VSplitLeft(110.0f, &Label, &ButtonBar); static int s_OkButton = 0; if(pEditor->DoButton_Editor(&s_OkButton, "Ok", 0, &Label, 0, 0)) { if(pEditor->m_PopupEventType == POPEVENT_EXIT) g_Config.m_ClEditor = 0; else if(pEditor->m_PopupEventType == POPEVENT_LOAD) pEditor->InvokeFileDialog(IStorage::TYPE_ALL, FILETYPE_MAP, "Load map", "Load", "maps", "", pEditor->CallbackOpenMap, pEditor); else if(pEditor->m_PopupEventType == POPEVENT_NEW) { pEditor->Reset(); pEditor->m_aFileName[0] = 0; } else if(pEditor->m_PopupEventType == POPEVENT_SAVE) pEditor->CallbackSaveMap(pEditor->m_aFileSaveName, IStorage::TYPE_SAVE, pEditor); pEditor->m_PopupEventWasActivated = false; return 1; } ButtonBar.VSplitRight(30.0f, &ButtonBar, 0); ButtonBar.VSplitRight(110.0f, &ButtonBar, &Label); static int s_AbortButton = 0; if(pEditor->DoButton_Editor(&s_AbortButton, "Abort", 0, &Label, 0, 0)) { pEditor->m_PopupEventWasActivated = false; return 1; } return 0; } static int g_SelectImageSelected = -100; static int g_SelectImageCurrent = -100; int CEditor::PopupSelectImage(CEditor *pEditor, CUIRect View) { CUIRect ButtonBar, ImageView; View.VSplitLeft(80.0f, &ButtonBar, &View); View.Margin(10.0f, &ImageView); int ShowImage = g_SelectImageCurrent; for(int i = -1; i < pEditor->m_Map.m_lImages.size(); i++) { CUIRect Button; ButtonBar.HSplitTop(12.0f, &Button, &ButtonBar); ButtonBar.HSplitTop(2.0f, 0, &ButtonBar); if(pEditor->UI()->MouseInside(&Button)) ShowImage = i; if(i == -1) { if(pEditor->DoButton_MenuItem(&pEditor->m_Map.m_lImages[i], "None", i==g_SelectImageCurrent, &Button)) g_SelectImageSelected = -1; } else { if(pEditor->DoButton_MenuItem(&pEditor->m_Map.m_lImages[i], pEditor->m_Map.m_lImages[i]->m_aName, i==g_SelectImageCurrent, &Button)) g_SelectImageSelected = i; } } if(ShowImage >= 0 && ShowImage < pEditor->m_Map.m_lImages.size()) { if(ImageView.h < ImageView.w) ImageView.w = ImageView.h; else ImageView.h = ImageView.w; float Max = (float)(max(pEditor->m_Map.m_lImages[ShowImage]->m_Width, pEditor->m_Map.m_lImages[ShowImage]->m_Height)); ImageView.w *= pEditor->m_Map.m_lImages[ShowImage]->m_Width/Max; ImageView.h *= pEditor->m_Map.m_lImages[ShowImage]->m_Height/Max; pEditor->Graphics()->TextureSet(pEditor->m_Map.m_lImages[ShowImage]->m_TexID); pEditor->Graphics()->BlendNormal(); pEditor->Graphics()->WrapClamp(); pEditor->Graphics()->QuadsBegin(); IGraphics::CQuadItem QuadItem(ImageView.x, ImageView.y, ImageView.w, ImageView.h); pEditor->Graphics()->QuadsDrawTL(&QuadItem, 1); pEditor->Graphics()->QuadsEnd(); pEditor->Graphics()->WrapNormal(); } return 0; } void CEditor::PopupSelectImageInvoke(int Current, float x, float y) { static int s_SelectImagePopupId = 0; g_SelectImageSelected = -100; g_SelectImageCurrent = Current; UiInvokePopupMenu(&s_SelectImagePopupId, 0, x, y, 400, 300, PopupSelectImage); } int CEditor::PopupSelectImageResult() { if(g_SelectImageSelected == -100) return -100; g_SelectImageCurrent = g_SelectImageSelected; g_SelectImageSelected = -100; return g_SelectImageCurrent; } static int s_GametileOpSelected = -1; int CEditor::PopupSelectGametileOp(CEditor *pEditor, CUIRect View) { static const char *s_pButtonNames[] = { "Clear", "Collision", "Death", "Unhookable" }; static unsigned s_NumButtons = sizeof(s_pButtonNames) / sizeof(char*); CUIRect Button; for(unsigned i = 0; i < s_NumButtons; ++i) { View.HSplitTop(2.0f, 0, &View); View.HSplitTop(12.0f, &Button, &View); if(pEditor->DoButton_Editor(&s_pButtonNames[i], s_pButtonNames[i], 0, &Button, 0, 0)) s_GametileOpSelected = i; } return 0; } void CEditor::PopupSelectGametileOpInvoke(float x, float y) { static int s_SelectGametileOpPopupId = 0; s_GametileOpSelected = -1; UiInvokePopupMenu(&s_SelectGametileOpPopupId, 0, x, y, 120.0f, 70.0f, PopupSelectGametileOp); } int CEditor::PopupSelectGameTileOpResult() { if(s_GametileOpSelected < 0) return -1; int Result = s_GametileOpSelected; s_GametileOpSelected = -1; return Result; } static int s_AutoMapConfigSelected = -1; int CEditor::PopupSelectConfigAutoMap(CEditor *pEditor, CUIRect View) { CLayerTiles *pLayer = static_cast(pEditor->GetSelectedLayer(0)); CUIRect Button; static int s_AutoMapperConfigButtons[256]; CAutoMapper *pAutoMapper = &pEditor->m_Map.m_lImages[pLayer->m_Image]->m_AutoMapper; for(int i = 0; i < pAutoMapper->ConfigNamesNum(); ++i) { View.HSplitTop(2.0f, 0, &View); View.HSplitTop(12.0f, &Button, &View); if(pEditor->DoButton_Editor(&s_AutoMapperConfigButtons[i], pAutoMapper->GetConfigName(i), 0, &Button, 0, 0)) s_AutoMapConfigSelected = i; } return 0; } void CEditor::PopupSelectConfigAutoMapInvoke(float x, float y) { static int s_AutoMapConfigSelectID = 0; s_AutoMapConfigSelected = -1; CLayerTiles *pLayer = static_cast(GetSelectedLayer(0)); if(pLayer && pLayer->m_Image >= 0 && pLayer->m_Image < m_Map.m_lImages.size() && m_Map.m_lImages[pLayer->m_Image]->m_AutoMapper.ConfigNamesNum()) UiInvokePopupMenu(&s_AutoMapConfigSelectID, 0, x, y, 120.0f, 12.0f+14.0f*m_Map.m_lImages[pLayer->m_Image]->m_AutoMapper.ConfigNamesNum(), PopupSelectConfigAutoMap); } int CEditor::PopupSelectConfigAutoMapResult() { if(s_AutoMapConfigSelected < 0) return -1; int Result = s_AutoMapConfigSelected; s_AutoMapConfigSelected = -1; return Result; } teeworlds-0.6.2+dfsg/src/game/gamecore.cpp0000644000175000017500000002675512140200333017437 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "gamecore.h" const char *CTuningParams::m_apNames[] = { #define MACRO_TUNING_PARAM(Name,ScriptName,Value) #ScriptName, #include "tuning.h" #undef MACRO_TUNING_PARAM }; bool CTuningParams::Set(int Index, float Value) { if(Index < 0 || Index >= Num()) return false; ((CTuneParam *)this)[Index] = Value; return true; } bool CTuningParams::Get(int Index, float *pValue) { if(Index < 0 || Index >= Num()) return false; *pValue = (float)((CTuneParam *)this)[Index]; return true; } bool CTuningParams::Set(const char *pName, float Value) { for(int i = 0; i < Num(); i++) if(str_comp_nocase(pName, m_apNames[i]) == 0) return Set(i, Value); return false; } bool CTuningParams::Get(const char *pName, float *pValue) { for(int i = 0; i < Num(); i++) if(str_comp_nocase(pName, m_apNames[i]) == 0) return Get(i, pValue); return false; } float HermiteBasis1(float v) { return 2*v*v*v - 3*v*v+1; } float VelocityRamp(float Value, float Start, float Range, float Curvature) { if(Value < Start) return 1.0f; return 1.0f/powf(Curvature, (Value-Start)/Range); } void CCharacterCore::Init(CWorldCore *pWorld, CCollision *pCollision) { m_pWorld = pWorld; m_pCollision = pCollision; } void CCharacterCore::Reset() { m_Pos = vec2(0,0); m_Vel = vec2(0,0); m_HookPos = vec2(0,0); m_HookDir = vec2(0,0); m_HookTick = 0; m_HookState = HOOK_IDLE; m_HookedPlayer = -1; m_Jumped = 0; m_TriggeredEvents = 0; } void CCharacterCore::Tick(bool UseInput) { float PhysSize = 28.0f; m_TriggeredEvents = 0; // get ground state bool Grounded = false; if(m_pCollision->CheckPoint(m_Pos.x+PhysSize/2, m_Pos.y+PhysSize/2+5)) Grounded = true; if(m_pCollision->CheckPoint(m_Pos.x-PhysSize/2, m_Pos.y+PhysSize/2+5)) Grounded = true; vec2 TargetDirection = normalize(vec2(m_Input.m_TargetX, m_Input.m_TargetY)); m_Vel.y += m_pWorld->m_Tuning.m_Gravity; float MaxSpeed = Grounded ? m_pWorld->m_Tuning.m_GroundControlSpeed : m_pWorld->m_Tuning.m_AirControlSpeed; float Accel = Grounded ? m_pWorld->m_Tuning.m_GroundControlAccel : m_pWorld->m_Tuning.m_AirControlAccel; float Friction = Grounded ? m_pWorld->m_Tuning.m_GroundFriction : m_pWorld->m_Tuning.m_AirFriction; // handle input if(UseInput) { m_Direction = m_Input.m_Direction; // setup angle float a = 0; if(m_Input.m_TargetX == 0) a = atanf((float)m_Input.m_TargetY); else a = atanf((float)m_Input.m_TargetY/(float)m_Input.m_TargetX); if(m_Input.m_TargetX < 0) a = a+pi; m_Angle = (int)(a*256.0f); // handle jump if(m_Input.m_Jump) { if(!(m_Jumped&1)) { if(Grounded) { m_TriggeredEvents |= COREEVENT_GROUND_JUMP; m_Vel.y = -m_pWorld->m_Tuning.m_GroundJumpImpulse; m_Jumped |= 1; } else if(!(m_Jumped&2)) { m_TriggeredEvents |= COREEVENT_AIR_JUMP; m_Vel.y = -m_pWorld->m_Tuning.m_AirJumpImpulse; m_Jumped |= 3; } } } else m_Jumped &= ~1; // handle hook if(m_Input.m_Hook) { if(m_HookState == HOOK_IDLE) { m_HookState = HOOK_FLYING; m_HookPos = m_Pos+TargetDirection*PhysSize*1.5f; m_HookDir = TargetDirection; m_HookedPlayer = -1; m_HookTick = 0; m_TriggeredEvents |= COREEVENT_HOOK_LAUNCH; } } else { m_HookedPlayer = -1; m_HookState = HOOK_IDLE; m_HookPos = m_Pos; } } // add the speed modification according to players wanted direction if(m_Direction < 0) m_Vel.x = SaturatedAdd(-MaxSpeed, MaxSpeed, m_Vel.x, -Accel); if(m_Direction > 0) m_Vel.x = SaturatedAdd(-MaxSpeed, MaxSpeed, m_Vel.x, Accel); if(m_Direction == 0) m_Vel.x *= Friction; // handle jumping // 1 bit = to keep track if a jump has been made on this input // 2 bit = to keep track if a air-jump has been made if(Grounded) m_Jumped &= ~2; // do hook if(m_HookState == HOOK_IDLE) { m_HookedPlayer = -1; m_HookState = HOOK_IDLE; m_HookPos = m_Pos; } else if(m_HookState >= HOOK_RETRACT_START && m_HookState < HOOK_RETRACT_END) { m_HookState++; } else if(m_HookState == HOOK_RETRACT_END) { m_HookState = HOOK_RETRACTED; m_TriggeredEvents |= COREEVENT_HOOK_RETRACT; m_HookState = HOOK_RETRACTED; } else if(m_HookState == HOOK_FLYING) { vec2 NewPos = m_HookPos+m_HookDir*m_pWorld->m_Tuning.m_HookFireSpeed; if(distance(m_Pos, NewPos) > m_pWorld->m_Tuning.m_HookLength) { m_HookState = HOOK_RETRACT_START; NewPos = m_Pos + normalize(NewPos-m_Pos) * m_pWorld->m_Tuning.m_HookLength; } // make sure that the hook doesn't go though the ground bool GoingToHitGround = false; bool GoingToRetract = false; int Hit = m_pCollision->IntersectLine(m_HookPos, NewPos, &NewPos, 0); if(Hit) { if(Hit&CCollision::COLFLAG_NOHOOK) GoingToRetract = true; else GoingToHitGround = true; } // Check against other players first if(m_pWorld && m_pWorld->m_Tuning.m_PlayerHooking) { float Distance = 0.0f; for(int i = 0; i < MAX_CLIENTS; i++) { CCharacterCore *pCharCore = m_pWorld->m_apCharacters[i]; if(!pCharCore || pCharCore == this) continue; vec2 ClosestPoint = closest_point_on_line(m_HookPos, NewPos, pCharCore->m_Pos); if(distance(pCharCore->m_Pos, ClosestPoint) < PhysSize+2.0f) { if (m_HookedPlayer == -1 || distance(m_HookPos, pCharCore->m_Pos) < Distance) { m_TriggeredEvents |= COREEVENT_HOOK_ATTACH_PLAYER; m_HookState = HOOK_GRABBED; m_HookedPlayer = i; Distance = distance(m_HookPos, pCharCore->m_Pos); } } } } if(m_HookState == HOOK_FLYING) { // check against ground if(GoingToHitGround) { m_TriggeredEvents |= COREEVENT_HOOK_ATTACH_GROUND; m_HookState = HOOK_GRABBED; } else if(GoingToRetract) { m_TriggeredEvents |= COREEVENT_HOOK_HIT_NOHOOK; m_HookState = HOOK_RETRACT_START; } m_HookPos = NewPos; } } if(m_HookState == HOOK_GRABBED) { if(m_HookedPlayer != -1) { CCharacterCore *pCharCore = m_pWorld->m_apCharacters[m_HookedPlayer]; if(pCharCore) m_HookPos = pCharCore->m_Pos; else { // release hook m_HookedPlayer = -1; m_HookState = HOOK_RETRACTED; m_HookPos = m_Pos; } // keep players hooked for a max of 1.5sec //if(Server()->Tick() > hook_tick+(Server()->TickSpeed()*3)/2) //release_hooked(); } // don't do this hook rutine when we are hook to a player if(m_HookedPlayer == -1 && distance(m_HookPos, m_Pos) > 46.0f) { vec2 HookVel = normalize(m_HookPos-m_Pos)*m_pWorld->m_Tuning.m_HookDragAccel; // the hook as more power to drag you up then down. // this makes it easier to get on top of an platform if(HookVel.y > 0) HookVel.y *= 0.3f; // the hook will boost it's power if the player wants to move // in that direction. otherwise it will dampen everything abit if((HookVel.x < 0 && m_Direction < 0) || (HookVel.x > 0 && m_Direction > 0)) HookVel.x *= 0.95f; else HookVel.x *= 0.75f; vec2 NewVel = m_Vel+HookVel; // check if we are under the legal limit for the hook if(length(NewVel) < m_pWorld->m_Tuning.m_HookDragSpeed || length(NewVel) < length(m_Vel)) m_Vel = NewVel; // no problem. apply } // release hook (max hook time is 1.25 m_HookTick++; if(m_HookedPlayer != -1 && (m_HookTick > SERVER_TICK_SPEED+SERVER_TICK_SPEED/5 || !m_pWorld->m_apCharacters[m_HookedPlayer])) { m_HookedPlayer = -1; m_HookState = HOOK_RETRACTED; m_HookPos = m_Pos; } } if(m_pWorld) { for(int i = 0; i < MAX_CLIENTS; i++) { CCharacterCore *pCharCore = m_pWorld->m_apCharacters[i]; if(!pCharCore) continue; //player *p = (player*)ent; if(pCharCore == this) // || !(p->flags&FLAG_ALIVE) continue; // make sure that we don't nudge our self // handle player <-> player collision float Distance = distance(m_Pos, pCharCore->m_Pos); vec2 Dir = normalize(m_Pos - pCharCore->m_Pos); if(m_pWorld->m_Tuning.m_PlayerCollision && Distance < PhysSize*1.25f && Distance > 0.0f) { float a = (PhysSize*1.45f - Distance); float Velocity = 0.5f; // make sure that we don't add excess force by checking the // direction against the current velocity. if not zero. if (length(m_Vel) > 0.0001) Velocity = 1-(dot(normalize(m_Vel), Dir)+1)/2; m_Vel += Dir*a*(Velocity*0.75f); m_Vel *= 0.85f; } // handle hook influence if(m_HookedPlayer == i && m_pWorld->m_Tuning.m_PlayerHooking) { if(Distance > PhysSize*1.50f) // TODO: fix tweakable variable { float Accel = m_pWorld->m_Tuning.m_HookDragAccel * (Distance/m_pWorld->m_Tuning.m_HookLength); float DragSpeed = m_pWorld->m_Tuning.m_HookDragSpeed; // add force to the hooked player pCharCore->m_Vel.x = SaturatedAdd(-DragSpeed, DragSpeed, pCharCore->m_Vel.x, Accel*Dir.x*1.5f); pCharCore->m_Vel.y = SaturatedAdd(-DragSpeed, DragSpeed, pCharCore->m_Vel.y, Accel*Dir.y*1.5f); // add a little bit force to the guy who has the grip m_Vel.x = SaturatedAdd(-DragSpeed, DragSpeed, m_Vel.x, -Accel*Dir.x*0.25f); m_Vel.y = SaturatedAdd(-DragSpeed, DragSpeed, m_Vel.y, -Accel*Dir.y*0.25f); } } } } // clamp the velocity to something sane if(length(m_Vel) > 6000) m_Vel = normalize(m_Vel) * 6000; } void CCharacterCore::Move() { float RampValue = VelocityRamp(length(m_Vel)*50, m_pWorld->m_Tuning.m_VelrampStart, m_pWorld->m_Tuning.m_VelrampRange, m_pWorld->m_Tuning.m_VelrampCurvature); m_Vel.x = m_Vel.x*RampValue; vec2 NewPos = m_Pos; m_pCollision->MoveBox(&NewPos, &m_Vel, vec2(28.0f, 28.0f), 0); m_Vel.x = m_Vel.x*(1.0f/RampValue); if(m_pWorld && m_pWorld->m_Tuning.m_PlayerCollision) { // check player collision float Distance = distance(m_Pos, NewPos); int End = Distance+1; vec2 LastPos = m_Pos; for(int i = 0; i < End; i++) { float a = i/Distance; vec2 Pos = mix(m_Pos, NewPos, a); for(int p = 0; p < MAX_CLIENTS; p++) { CCharacterCore *pCharCore = m_pWorld->m_apCharacters[p]; if(!pCharCore || pCharCore == this) continue; float D = distance(Pos, pCharCore->m_Pos); if(D < 28.0f && D > 0.0f) { if(a > 0.0f) m_Pos = LastPos; else if(distance(NewPos, pCharCore->m_Pos) > D) m_Pos = NewPos; return; } } LastPos = Pos; } } m_Pos = NewPos; } void CCharacterCore::Write(CNetObj_CharacterCore *pObjCore) { pObjCore->m_X = round(m_Pos.x); pObjCore->m_Y = round(m_Pos.y); pObjCore->m_VelX = round(m_Vel.x*256.0f); pObjCore->m_VelY = round(m_Vel.y*256.0f); pObjCore->m_HookState = m_HookState; pObjCore->m_HookTick = m_HookTick; pObjCore->m_HookX = round(m_HookPos.x); pObjCore->m_HookY = round(m_HookPos.y); pObjCore->m_HookDx = round(m_HookDir.x*256.0f); pObjCore->m_HookDy = round(m_HookDir.y*256.0f); pObjCore->m_HookedPlayer = m_HookedPlayer; pObjCore->m_Jumped = m_Jumped; pObjCore->m_Direction = m_Direction; pObjCore->m_Angle = m_Angle; } void CCharacterCore::Read(const CNetObj_CharacterCore *pObjCore) { m_Pos.x = pObjCore->m_X; m_Pos.y = pObjCore->m_Y; m_Vel.x = pObjCore->m_VelX/256.0f; m_Vel.y = pObjCore->m_VelY/256.0f; m_HookState = pObjCore->m_HookState; m_HookTick = pObjCore->m_HookTick; m_HookPos.x = pObjCore->m_HookX; m_HookPos.y = pObjCore->m_HookY; m_HookDir.x = pObjCore->m_HookDx/256.0f; m_HookDir.y = pObjCore->m_HookDy/256.0f; m_HookedPlayer = pObjCore->m_HookedPlayer; m_Jumped = pObjCore->m_Jumped; m_Direction = pObjCore->m_Direction; m_Angle = pObjCore->m_Angle; } void CCharacterCore::Quantize() { CNetObj_CharacterCore Core; Write(&Core); Read(&Core); } teeworlds-0.6.2+dfsg/src/game/gamecore.h0000644000175000017500000000774112140200333017076 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_GAMECORE_H #define GAME_GAMECORE_H #include #include #include #include "collision.h" #include #include class CTuneParam { int m_Value; public: void Set(int v) { m_Value = v; } int Get() const { return m_Value; } CTuneParam &operator = (int v) { m_Value = (int)(v*100.0f); return *this; } CTuneParam &operator = (float v) { m_Value = (int)(v*100.0f); return *this; } operator float() const { return m_Value/100.0f; } }; class CTuningParams { public: CTuningParams() { const float TicksPerSecond = 50.0f; #define MACRO_TUNING_PARAM(Name,ScriptName,Value) m_##Name.Set((int)(Value*100.0f)); #include "tuning.h" #undef MACRO_TUNING_PARAM } static const char *m_apNames[]; #define MACRO_TUNING_PARAM(Name,ScriptName,Value) CTuneParam m_##Name; #include "tuning.h" #undef MACRO_TUNING_PARAM static int Num() { return sizeof(CTuningParams)/sizeof(int); } bool Set(int Index, float Value); bool Set(const char *pName, float Value); bool Get(int Index, float *pValue); bool Get(const char *pName, float *pValue); }; inline vec2 GetDirection(int Angle) { float a = Angle/256.0f; return vec2(cosf(a), sinf(a)); } inline vec2 GetDir(float Angle) { return vec2(cosf(Angle), sinf(Angle)); } inline float GetAngle(vec2 Dir) { if(Dir.x == 0 && Dir.y == 0) return 0.0f; float a = atanf(Dir.y/Dir.x); if(Dir.x < 0) a = a+pi; return a; } inline void StrToInts(int *pInts, int Num, const char *pStr) { int Index = 0; while(Num) { char aBuf[4] = {0,0,0,0}; for(int c = 0; c < 4 && pStr[Index]; c++, Index++) aBuf[c] = pStr[Index]; *pInts = ((aBuf[0]+128)<<24)|((aBuf[1]+128)<<16)|((aBuf[2]+128)<<8)|(aBuf[3]+128); pInts++; Num--; } // null terminate pInts[-1] &= 0xffffff00; } inline void IntsToStr(const int *pInts, int Num, char *pStr) { while(Num) { pStr[0] = (((*pInts)>>24)&0xff)-128; pStr[1] = (((*pInts)>>16)&0xff)-128; pStr[2] = (((*pInts)>>8)&0xff)-128; pStr[3] = ((*pInts)&0xff)-128; pStr += 4; pInts++; Num--; } // null terminate pStr[-1] = 0; } inline vec2 CalcPos(vec2 Pos, vec2 Velocity, float Curvature, float Speed, float Time) { vec2 n; Time *= Speed; n.x = Pos.x + Velocity.x*Time; n.y = Pos.y + Velocity.y*Time + Curvature/10000*(Time*Time); return n; } template inline T SaturatedAdd(T Min, T Max, T Current, T Modifier) { if(Modifier < 0) { if(Current < Min) return Current; Current += Modifier; if(Current < Min) Current = Min; return Current; } else { if(Current > Max) return Current; Current += Modifier; if(Current > Max) Current = Max; return Current; } } float VelocityRamp(float Value, float Start, float Range, float Curvature); // hooking stuff enum { HOOK_RETRACTED=-1, HOOK_IDLE=0, HOOK_RETRACT_START=1, HOOK_RETRACT_END=3, HOOK_FLYING, HOOK_GRABBED, COREEVENT_GROUND_JUMP=0x01, COREEVENT_AIR_JUMP=0x02, COREEVENT_HOOK_LAUNCH=0x04, COREEVENT_HOOK_ATTACH_PLAYER=0x08, COREEVENT_HOOK_ATTACH_GROUND=0x10, COREEVENT_HOOK_HIT_NOHOOK=0x20, COREEVENT_HOOK_RETRACT=0x40, }; class CWorldCore { public: CWorldCore() { mem_zero(m_apCharacters, sizeof(m_apCharacters)); } CTuningParams m_Tuning; class CCharacterCore *m_apCharacters[MAX_CLIENTS]; }; class CCharacterCore { CWorldCore *m_pWorld; CCollision *m_pCollision; public: vec2 m_Pos; vec2 m_Vel; vec2 m_HookPos; vec2 m_HookDir; int m_HookTick; int m_HookState; int m_HookedPlayer; int m_Jumped; int m_Direction; int m_Angle; CNetObj_PlayerInput m_Input; int m_TriggeredEvents; void Init(CWorldCore *pWorld, CCollision *pCollision); void Reset(); void Tick(bool UseInput); void Move(); void Read(const CNetObj_CharacterCore *pObjCore); void Write(CNetObj_CharacterCore *pObjCore); void Quantize(); }; #endif teeworlds-0.6.2+dfsg/src/game/generated/0000755000175000017500000000000012140200333017070 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/generated/createdir.txt0000644000175000017500000000000012140200333021561 0ustar felixfelixteeworlds-0.6.2+dfsg/src/game/layers.cpp0000644000175000017500000000333412140200333017140 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "layers.h" CLayers::CLayers() { m_GroupsNum = 0; m_GroupsStart = 0; m_LayersNum = 0; m_LayersStart = 0; m_pGameGroup = 0; m_pGameLayer = 0; m_pMap = 0; } void CLayers::Init(class IKernel *pKernel) { m_pMap = pKernel->RequestInterface(); m_pMap->GetType(MAPITEMTYPE_GROUP, &m_GroupsStart, &m_GroupsNum); m_pMap->GetType(MAPITEMTYPE_LAYER, &m_LayersStart, &m_LayersNum); for(int g = 0; g < NumGroups(); g++) { CMapItemGroup *pGroup = GetGroup(g); for(int l = 0; l < pGroup->m_NumLayers; l++) { CMapItemLayer *pLayer = GetLayer(pGroup->m_StartLayer+l); if(pLayer->m_Type == LAYERTYPE_TILES) { CMapItemLayerTilemap *pTilemap = reinterpret_cast(pLayer); if(pTilemap->m_Flags&TILESLAYERFLAG_GAME) { m_pGameLayer = pTilemap; m_pGameGroup = pGroup; // make sure the game group has standard settings m_pGameGroup->m_OffsetX = 0; m_pGameGroup->m_OffsetY = 0; m_pGameGroup->m_ParallaxX = 100; m_pGameGroup->m_ParallaxY = 100; if(m_pGameGroup->m_Version >= 2) { m_pGameGroup->m_UseClipping = 0; m_pGameGroup->m_ClipX = 0; m_pGameGroup->m_ClipY = 0; m_pGameGroup->m_ClipW = 0; m_pGameGroup->m_ClipH = 0; } break; } } } } } CMapItemGroup *CLayers::GetGroup(int Index) const { return static_cast(m_pMap->GetItem(m_GroupsStart+Index, 0, 0)); } CMapItemLayer *CLayers::GetLayer(int Index) const { return static_cast(m_pMap->GetItem(m_LayersStart+Index, 0, 0)); } teeworlds-0.6.2+dfsg/src/game/layers.h0000644000175000017500000000151312140200333016602 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_LAYERS_H #define GAME_LAYERS_H #include #include class CLayers { int m_GroupsNum; int m_GroupsStart; int m_LayersNum; int m_LayersStart; CMapItemGroup *m_pGameGroup; CMapItemLayerTilemap *m_pGameLayer; class IMap *m_pMap; public: CLayers(); void Init(class IKernel *pKernel); int NumGroups() const { return m_GroupsNum; }; class IMap *Map() const { return m_pMap; }; CMapItemGroup *GameGroup() const { return m_pGameGroup; }; CMapItemLayerTilemap *GameLayer() const { return m_pGameLayer; }; CMapItemGroup *GetGroup(int Index) const; CMapItemLayer *GetLayer(int Index) const; }; #endif teeworlds-0.6.2+dfsg/src/game/localization.cpp0000644000175000017500000000530512140200333020331 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "localization.h" #include #include #include #include const char *Localize(const char *pStr) { const char *pNewStr = g_Localization.FindString(str_quickhash(pStr)); return pNewStr ? pNewStr : pStr; } CLocConstString::CLocConstString(const char *pStr) { m_pDefaultStr = pStr; m_Hash = str_quickhash(m_pDefaultStr); m_Version = -1; } void CLocConstString::Reload() { m_Version = g_Localization.Version(); const char *pNewStr = g_Localization.FindString(m_Hash); m_pCurrentStr = pNewStr; if(!m_pCurrentStr) m_pCurrentStr = m_pDefaultStr; } CLocalizationDatabase::CLocalizationDatabase() { m_VersionCounter = 0; m_CurrentVersion = 0; } void CLocalizationDatabase::AddString(const char *pOrgStr, const char *pNewStr) { CString s; s.m_Hash = str_quickhash(pOrgStr); s.m_Replacement = *pNewStr ? pNewStr : pOrgStr; m_Strings.add(s); } bool CLocalizationDatabase::Load(const char *pFilename, IStorage *pStorage, IConsole *pConsole) { // empty string means unload if(pFilename[0] == 0) { m_Strings.clear(); m_CurrentVersion = 0; return true; } IOHANDLE IoHandle = pStorage->OpenFile(pFilename, IOFLAG_READ, IStorage::TYPE_ALL); if(!IoHandle) return false; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "loaded '%s'", pFilename); pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); m_Strings.clear(); char aOrigin[512]; CLineReader LineReader; LineReader.Init(IoHandle); char *pLine; while((pLine = LineReader.Get())) { if(!str_length(pLine)) continue; if(pLine[0] == '#') // skip comments continue; str_copy(aOrigin, pLine, sizeof(aOrigin)); char *pReplacement = LineReader.Get(); if(!pReplacement) { pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", "unexpected end of file"); break; } if(pReplacement[0] != '=' || pReplacement[1] != '=' || pReplacement[2] != ' ') { str_format(aBuf, sizeof(aBuf), "malform replacement line for '%s'", aOrigin); pConsole->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "localization", aBuf); continue; } pReplacement += 3; AddString(aOrigin, pReplacement); } io_close(IoHandle); m_CurrentVersion = ++m_VersionCounter; return true; } const char *CLocalizationDatabase::FindString(unsigned Hash) { CString String; String.m_Hash = Hash; sorted_array::range r = ::find_binary(m_Strings.all(), String); if(r.empty()) return 0; return r.front().m_Replacement; } CLocalizationDatabase g_Localization; teeworlds-0.6.2+dfsg/src/game/localization.h0000644000175000017500000000272412140200333020000 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_LOCALIZATION_H #define GAME_LOCALIZATION_H #include #include class CLocalizationDatabase { class CString { public: unsigned m_Hash; // TODO: do this as an const char * and put everything on a incremental heap string m_Replacement; bool operator <(const CString &Other) const { return m_Hash < Other.m_Hash; } bool operator <=(const CString &Other) const { return m_Hash <= Other.m_Hash; } bool operator ==(const CString &Other) const { return m_Hash == Other.m_Hash; } }; sorted_array m_Strings; int m_VersionCounter; int m_CurrentVersion; public: CLocalizationDatabase(); bool Load(const char *pFilename, class IStorage *pStorage, class IConsole *pConsole); int Version() { return m_CurrentVersion; } void AddString(const char *pOrgStr, const char *pNewStr); const char *FindString(unsigned Hash); }; extern CLocalizationDatabase g_Localization; class CLocConstString { const char *m_pDefaultStr; const char *m_pCurrentStr; unsigned m_Hash; int m_Version; public: CLocConstString(const char *pStr); void Reload(); inline operator const char *() { if(m_Version != g_Localization.Version()) Reload(); return m_pCurrentStr; } }; extern const char *Localize(const char *pStr); #endif teeworlds-0.6.2+dfsg/src/game/mapitems.h0000644000175000017500000000561412140200333017130 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_MAPITEMS_H #define GAME_MAPITEMS_H // layer types enum { LAYERTYPE_INVALID=0, LAYERTYPE_GAME, LAYERTYPE_TILES, LAYERTYPE_QUADS, MAPITEMTYPE_VERSION=0, MAPITEMTYPE_INFO, MAPITEMTYPE_IMAGE, MAPITEMTYPE_ENVELOPE, MAPITEMTYPE_GROUP, MAPITEMTYPE_LAYER, MAPITEMTYPE_ENVPOINTS, CURVETYPE_STEP=0, CURVETYPE_LINEAR, CURVETYPE_SLOW, CURVETYPE_FAST, CURVETYPE_SMOOTH, NUM_CURVETYPES, // game layer tiles ENTITY_NULL=0, ENTITY_SPAWN, ENTITY_SPAWN_RED, ENTITY_SPAWN_BLUE, ENTITY_FLAGSTAND_RED, ENTITY_FLAGSTAND_BLUE, ENTITY_ARMOR_1, ENTITY_HEALTH_1, ENTITY_WEAPON_SHOTGUN, ENTITY_WEAPON_GRENADE, ENTITY_POWERUP_NINJA, ENTITY_WEAPON_RIFLE, NUM_ENTITIES, TILE_AIR=0, TILE_SOLID, TILE_DEATH, TILE_NOHOOK, TILEFLAG_VFLIP=1, TILEFLAG_HFLIP=2, TILEFLAG_OPAQUE=4, TILEFLAG_ROTATE=8, LAYERFLAG_DETAIL=1, TILESLAYERFLAG_GAME=1, ENTITY_OFFSET=255-16*4, }; struct CPoint { int x, y; // 22.10 fixed point }; struct CColor { int r, g, b, a; }; struct CQuad { CPoint m_aPoints[5]; CColor m_aColors[4]; CPoint m_aTexcoords[4]; int m_PosEnv; int m_PosEnvOffset; int m_ColorEnv; int m_ColorEnvOffset; }; class CTile { public: unsigned char m_Index; unsigned char m_Flags; unsigned char m_Skip; unsigned char m_Reserved; }; struct CMapItemInfo { int m_Version; int m_Author; int m_MapVersion; int m_Credits; int m_License; } ; struct CMapItemImage { int m_Version; int m_Width; int m_Height; int m_External; int m_ImageName; int m_ImageData; } ; struct CMapItemGroup_v1 { int m_Version; int m_OffsetX; int m_OffsetY; int m_ParallaxX; int m_ParallaxY; int m_StartLayer; int m_NumLayers; } ; struct CMapItemGroup : public CMapItemGroup_v1 { enum { CURRENT_VERSION=3 }; int m_UseClipping; int m_ClipX; int m_ClipY; int m_ClipW; int m_ClipH; int m_aName[3]; } ; struct CMapItemLayer { int m_Version; int m_Type; int m_Flags; } ; struct CMapItemLayerTilemap { CMapItemLayer m_Layer; int m_Version; int m_Width; int m_Height; int m_Flags; CColor m_Color; int m_ColorEnv; int m_ColorEnvOffset; int m_Image; int m_Data; int m_aName[3]; } ; struct CMapItemLayerQuads { CMapItemLayer m_Layer; int m_Version; int m_NumQuads; int m_Data; int m_Image; int m_aName[3]; } ; struct CMapItemVersion { int m_Version; } ; struct CEnvPoint { int m_Time; // in ms int m_Curvetype; int m_aValues[4]; // 1-4 depending on envelope (22.10 fixed point) bool operator<(const CEnvPoint &Other) { return m_Time < Other.m_Time; } } ; struct CMapItemEnvelope_v1 { int m_Version; int m_Channels; int m_StartPoint; int m_NumPoints; int m_aName[8]; } ; struct CMapItemEnvelope : public CMapItemEnvelope_v1 { enum { CURRENT_VERSION=2 }; int m_Synchronized; }; #endif teeworlds-0.6.2+dfsg/src/game/server/0000755000175000017500000000000012140200333016440 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/server/entities/0000755000175000017500000000000012140200333020264 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/server/entities/character.cpp0000644000175000017500000005500512140200333022731 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include "character.h" #include "laser.h" #include "projectile.h" //input count struct CInputCount { int m_Presses; int m_Releases; }; CInputCount CountInput(int Prev, int Cur) { CInputCount c = {0, 0}; Prev &= INPUT_STATE_MASK; Cur &= INPUT_STATE_MASK; int i = Prev; while(i != Cur) { i = (i+1)&INPUT_STATE_MASK; if(i&1) c.m_Presses++; else c.m_Releases++; } return c; } MACRO_ALLOC_POOL_ID_IMPL(CCharacter, MAX_CLIENTS) // Character, "physical" player's part CCharacter::CCharacter(CGameWorld *pWorld) : CEntity(pWorld, CGameWorld::ENTTYPE_CHARACTER) { m_ProximityRadius = ms_PhysSize; m_Health = 0; m_Armor = 0; } void CCharacter::Reset() { Destroy(); } bool CCharacter::Spawn(CPlayer *pPlayer, vec2 Pos) { m_EmoteStop = -1; m_LastAction = -1; m_LastNoAmmoSound = -1; m_ActiveWeapon = WEAPON_GUN; m_LastWeapon = WEAPON_HAMMER; m_QueuedWeapon = -1; m_pPlayer = pPlayer; m_Pos = Pos; m_Core.Reset(); m_Core.Init(&GameServer()->m_World.m_Core, GameServer()->Collision()); m_Core.m_Pos = m_Pos; GameServer()->m_World.m_Core.m_apCharacters[m_pPlayer->GetCID()] = &m_Core; m_ReckoningTick = 0; mem_zero(&m_SendCore, sizeof(m_SendCore)); mem_zero(&m_ReckoningCore, sizeof(m_ReckoningCore)); GameServer()->m_World.InsertEntity(this); m_Alive = true; GameServer()->m_pController->OnCharacterSpawn(this); return true; } void CCharacter::Destroy() { GameServer()->m_World.m_Core.m_apCharacters[m_pPlayer->GetCID()] = 0; m_Alive = false; } void CCharacter::SetWeapon(int W) { if(W == m_ActiveWeapon) return; m_LastWeapon = m_ActiveWeapon; m_QueuedWeapon = -1; m_ActiveWeapon = W; GameServer()->CreateSound(m_Pos, SOUND_WEAPON_SWITCH); if(m_ActiveWeapon < 0 || m_ActiveWeapon >= NUM_WEAPONS) m_ActiveWeapon = 0; } bool CCharacter::IsGrounded() { if(GameServer()->Collision()->CheckPoint(m_Pos.x+m_ProximityRadius/2, m_Pos.y+m_ProximityRadius/2+5)) return true; if(GameServer()->Collision()->CheckPoint(m_Pos.x-m_ProximityRadius/2, m_Pos.y+m_ProximityRadius/2+5)) return true; return false; } void CCharacter::HandleNinja() { if(m_ActiveWeapon != WEAPON_NINJA) return; if ((Server()->Tick() - m_Ninja.m_ActivationTick) > (g_pData->m_Weapons.m_Ninja.m_Duration * Server()->TickSpeed() / 1000)) { // time's up, return m_aWeapons[WEAPON_NINJA].m_Got = false; m_ActiveWeapon = m_LastWeapon; SetWeapon(m_ActiveWeapon); return; } // force ninja Weapon SetWeapon(WEAPON_NINJA); m_Ninja.m_CurrentMoveTime--; if (m_Ninja.m_CurrentMoveTime == 0) { // reset velocity m_Core.m_Vel = m_Ninja.m_ActivationDir*m_Ninja.m_OldVelAmount; } if (m_Ninja.m_CurrentMoveTime > 0) { // Set velocity m_Core.m_Vel = m_Ninja.m_ActivationDir * g_pData->m_Weapons.m_Ninja.m_Velocity; vec2 OldPos = m_Pos; GameServer()->Collision()->MoveBox(&m_Core.m_Pos, &m_Core.m_Vel, vec2(m_ProximityRadius, m_ProximityRadius), 0.f); // reset velocity so the client doesn't predict stuff m_Core.m_Vel = vec2(0.f, 0.f); // check if we Hit anything along the way { CCharacter *aEnts[MAX_CLIENTS]; vec2 Dir = m_Pos - OldPos; float Radius = m_ProximityRadius * 2.0f; vec2 Center = OldPos + Dir * 0.5f; int Num = GameServer()->m_World.FindEntities(Center, Radius, (CEntity**)aEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); for (int i = 0; i < Num; ++i) { if (aEnts[i] == this) continue; // make sure we haven't Hit this object before bool bAlreadyHit = false; for (int j = 0; j < m_NumObjectsHit; j++) { if (m_apHitObjects[j] == aEnts[i]) bAlreadyHit = true; } if (bAlreadyHit) continue; // check so we are sufficiently close if (distance(aEnts[i]->m_Pos, m_Pos) > (m_ProximityRadius * 2.0f)) continue; // Hit a player, give him damage and stuffs... GameServer()->CreateSound(aEnts[i]->m_Pos, SOUND_NINJA_HIT); // set his velocity to fast upward (for now) if(m_NumObjectsHit < 10) m_apHitObjects[m_NumObjectsHit++] = aEnts[i]; aEnts[i]->TakeDamage(vec2(0, -10.0f), g_pData->m_Weapons.m_Ninja.m_pBase->m_Damage, m_pPlayer->GetCID(), WEAPON_NINJA); } } return; } return; } void CCharacter::DoWeaponSwitch() { // make sure we can switch if(m_ReloadTimer != 0 || m_QueuedWeapon == -1 || m_aWeapons[WEAPON_NINJA].m_Got) return; // switch Weapon SetWeapon(m_QueuedWeapon); } void CCharacter::HandleWeaponSwitch() { int WantedWeapon = m_ActiveWeapon; if(m_QueuedWeapon != -1) WantedWeapon = m_QueuedWeapon; // select Weapon int Next = CountInput(m_LatestPrevInput.m_NextWeapon, m_LatestInput.m_NextWeapon).m_Presses; int Prev = CountInput(m_LatestPrevInput.m_PrevWeapon, m_LatestInput.m_PrevWeapon).m_Presses; if(Next < 128) // make sure we only try sane stuff { while(Next) // Next Weapon selection { WantedWeapon = (WantedWeapon+1)%NUM_WEAPONS; if(m_aWeapons[WantedWeapon].m_Got) Next--; } } if(Prev < 128) // make sure we only try sane stuff { while(Prev) // Prev Weapon selection { WantedWeapon = (WantedWeapon-1)<0?NUM_WEAPONS-1:WantedWeapon-1; if(m_aWeapons[WantedWeapon].m_Got) Prev--; } } // Direct Weapon selection if(m_LatestInput.m_WantedWeapon) WantedWeapon = m_Input.m_WantedWeapon-1; // check for insane values if(WantedWeapon >= 0 && WantedWeapon < NUM_WEAPONS && WantedWeapon != m_ActiveWeapon && m_aWeapons[WantedWeapon].m_Got) m_QueuedWeapon = WantedWeapon; DoWeaponSwitch(); } void CCharacter::FireWeapon() { if(m_ReloadTimer != 0) return; DoWeaponSwitch(); vec2 Direction = normalize(vec2(m_LatestInput.m_TargetX, m_LatestInput.m_TargetY)); bool FullAuto = false; if(m_ActiveWeapon == WEAPON_GRENADE || m_ActiveWeapon == WEAPON_SHOTGUN || m_ActiveWeapon == WEAPON_RIFLE) FullAuto = true; // check if we gonna fire bool WillFire = false; if(CountInput(m_LatestPrevInput.m_Fire, m_LatestInput.m_Fire).m_Presses) WillFire = true; if(FullAuto && (m_LatestInput.m_Fire&1) && m_aWeapons[m_ActiveWeapon].m_Ammo) WillFire = true; if(!WillFire) return; // check for ammo if(!m_aWeapons[m_ActiveWeapon].m_Ammo) { // 125ms is a magical limit of how fast a human can click m_ReloadTimer = 125 * Server()->TickSpeed() / 1000; if(m_LastNoAmmoSound+Server()->TickSpeed() <= Server()->Tick()) { GameServer()->CreateSound(m_Pos, SOUND_WEAPON_NOAMMO); m_LastNoAmmoSound = Server()->Tick(); } return; } vec2 ProjStartPos = m_Pos+Direction*m_ProximityRadius*0.75f; switch(m_ActiveWeapon) { case WEAPON_HAMMER: { // reset objects Hit m_NumObjectsHit = 0; GameServer()->CreateSound(m_Pos, SOUND_HAMMER_FIRE); CCharacter *apEnts[MAX_CLIENTS]; int Hits = 0; int Num = GameServer()->m_World.FindEntities(ProjStartPos, m_ProximityRadius*0.5f, (CEntity**)apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); for (int i = 0; i < Num; ++i) { CCharacter *pTarget = apEnts[i]; if ((pTarget == this) || GameServer()->Collision()->IntersectLine(ProjStartPos, pTarget->m_Pos, NULL, NULL)) continue; // set his velocity to fast upward (for now) if(length(pTarget->m_Pos-ProjStartPos) > 0.0f) GameServer()->CreateHammerHit(pTarget->m_Pos-normalize(pTarget->m_Pos-ProjStartPos)*m_ProximityRadius*0.5f); else GameServer()->CreateHammerHit(ProjStartPos); vec2 Dir; if (length(pTarget->m_Pos - m_Pos) > 0.0f) Dir = normalize(pTarget->m_Pos - m_Pos); else Dir = vec2(0.f, -1.f); pTarget->TakeDamage(vec2(0.f, -1.f) + normalize(Dir + vec2(0.f, -1.1f)) * 10.0f, g_pData->m_Weapons.m_Hammer.m_pBase->m_Damage, m_pPlayer->GetCID(), m_ActiveWeapon); Hits++; } // if we Hit anything, we have to wait for the reload if(Hits) m_ReloadTimer = Server()->TickSpeed()/3; } break; case WEAPON_GUN: { CProjectile *pProj = new CProjectile(GameWorld(), WEAPON_GUN, m_pPlayer->GetCID(), ProjStartPos, Direction, (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GunLifetime), 1, 0, 0, -1, WEAPON_GUN); // pack the Projectile and send it to the client Directly CNetObj_Projectile p; pProj->FillInfo(&p); CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE); Msg.AddInt(1); for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) Msg.AddInt(((int *)&p)[i]); Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID()); GameServer()->CreateSound(m_Pos, SOUND_GUN_FIRE); } break; case WEAPON_SHOTGUN: { int ShotSpread = 2; CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE); Msg.AddInt(ShotSpread*2+1); for(int i = -ShotSpread; i <= ShotSpread; ++i) { float Spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f}; float a = GetAngle(Direction); a += Spreading[i+2]; float v = 1-(absolute(i)/(float)ShotSpread); float Speed = mix((float)GameServer()->Tuning()->m_ShotgunSpeeddiff, 1.0f, v); CProjectile *pProj = new CProjectile(GameWorld(), WEAPON_SHOTGUN, m_pPlayer->GetCID(), ProjStartPos, vec2(cosf(a), sinf(a))*Speed, (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_ShotgunLifetime), 1, 0, 0, -1, WEAPON_SHOTGUN); // pack the Projectile and send it to the client Directly CNetObj_Projectile p; pProj->FillInfo(&p); for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) Msg.AddInt(((int *)&p)[i]); } Server()->SendMsg(&Msg, 0,m_pPlayer->GetCID()); GameServer()->CreateSound(m_Pos, SOUND_SHOTGUN_FIRE); } break; case WEAPON_GRENADE: { CProjectile *pProj = new CProjectile(GameWorld(), WEAPON_GRENADE, m_pPlayer->GetCID(), ProjStartPos, Direction, (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GrenadeLifetime), 1, true, 0, SOUND_GRENADE_EXPLODE, WEAPON_GRENADE); // pack the Projectile and send it to the client Directly CNetObj_Projectile p; pProj->FillInfo(&p); CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE); Msg.AddInt(1); for(unsigned i = 0; i < sizeof(CNetObj_Projectile)/sizeof(int); i++) Msg.AddInt(((int *)&p)[i]); Server()->SendMsg(&Msg, 0, m_pPlayer->GetCID()); GameServer()->CreateSound(m_Pos, SOUND_GRENADE_FIRE); } break; case WEAPON_RIFLE: { new CLaser(GameWorld(), m_Pos, Direction, GameServer()->Tuning()->m_LaserReach, m_pPlayer->GetCID()); GameServer()->CreateSound(m_Pos, SOUND_RIFLE_FIRE); } break; case WEAPON_NINJA: { // reset Hit objects m_NumObjectsHit = 0; m_Ninja.m_ActivationDir = Direction; m_Ninja.m_CurrentMoveTime = g_pData->m_Weapons.m_Ninja.m_Movetime * Server()->TickSpeed() / 1000; m_Ninja.m_OldVelAmount = length(m_Core.m_Vel); GameServer()->CreateSound(m_Pos, SOUND_NINJA_FIRE); } break; } m_AttackTick = Server()->Tick(); if(m_aWeapons[m_ActiveWeapon].m_Ammo > 0) // -1 == unlimited m_aWeapons[m_ActiveWeapon].m_Ammo--; if(!m_ReloadTimer) m_ReloadTimer = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Firedelay * Server()->TickSpeed() / 1000; } void CCharacter::HandleWeapons() { //ninja HandleNinja(); // check reload timer if(m_ReloadTimer) { m_ReloadTimer--; return; } // fire Weapon, if wanted FireWeapon(); // ammo regen int AmmoRegenTime = g_pData->m_Weapons.m_aId[m_ActiveWeapon].m_Ammoregentime; if(AmmoRegenTime) { // If equipped and not active, regen ammo? if (m_ReloadTimer <= 0) { if (m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart < 0) m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart = Server()->Tick(); if ((Server()->Tick() - m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart) >= AmmoRegenTime * Server()->TickSpeed() / 1000) { // Add some ammo m_aWeapons[m_ActiveWeapon].m_Ammo = min(m_aWeapons[m_ActiveWeapon].m_Ammo + 1, 10); m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart = -1; } } else { m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart = -1; } } return; } bool CCharacter::GiveWeapon(int Weapon, int Ammo) { if(m_aWeapons[Weapon].m_Ammo < g_pData->m_Weapons.m_aId[Weapon].m_Maxammo || !m_aWeapons[Weapon].m_Got) { m_aWeapons[Weapon].m_Got = true; m_aWeapons[Weapon].m_Ammo = min(g_pData->m_Weapons.m_aId[Weapon].m_Maxammo, Ammo); return true; } return false; } void CCharacter::GiveNinja() { m_Ninja.m_ActivationTick = Server()->Tick(); m_aWeapons[WEAPON_NINJA].m_Got = true; m_aWeapons[WEAPON_NINJA].m_Ammo = -1; if (m_ActiveWeapon != WEAPON_NINJA) m_LastWeapon = m_ActiveWeapon; m_ActiveWeapon = WEAPON_NINJA; GameServer()->CreateSound(m_Pos, SOUND_PICKUP_NINJA); } void CCharacter::SetEmote(int Emote, int Tick) { m_EmoteType = Emote; m_EmoteStop = Tick; } void CCharacter::OnPredictedInput(CNetObj_PlayerInput *pNewInput) { // check for changes if(mem_comp(&m_Input, pNewInput, sizeof(CNetObj_PlayerInput)) != 0) m_LastAction = Server()->Tick(); // copy new input mem_copy(&m_Input, pNewInput, sizeof(m_Input)); m_NumInputs++; // it is not allowed to aim in the center if(m_Input.m_TargetX == 0 && m_Input.m_TargetY == 0) m_Input.m_TargetY = -1; } void CCharacter::OnDirectInput(CNetObj_PlayerInput *pNewInput) { mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput)); mem_copy(&m_LatestInput, pNewInput, sizeof(m_LatestInput)); // it is not allowed to aim in the center if(m_LatestInput.m_TargetX == 0 && m_LatestInput.m_TargetY == 0) m_LatestInput.m_TargetY = -1; if(m_NumInputs > 2 && m_pPlayer->GetTeam() != TEAM_SPECTATORS) { HandleWeaponSwitch(); FireWeapon(); } mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput)); } void CCharacter::ResetInput() { m_Input.m_Direction = 0; m_Input.m_Hook = 0; // simulate releasing the fire button if((m_Input.m_Fire&1) != 0) m_Input.m_Fire++; m_Input.m_Fire &= INPUT_STATE_MASK; m_Input.m_Jump = 0; m_LatestPrevInput = m_LatestInput = m_Input; } void CCharacter::Tick() { if(m_pPlayer->m_ForceBalanced) { char Buf[128]; str_format(Buf, sizeof(Buf), "You were moved to %s due to team balancing", GameServer()->m_pController->GetTeamName(m_pPlayer->GetTeam())); GameServer()->SendBroadcast(Buf, m_pPlayer->GetCID()); m_pPlayer->m_ForceBalanced = false; } m_Core.m_Input = m_Input; m_Core.Tick(true); // handle death-tiles and leaving gamelayer if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameLayerClipped(m_Pos)) { Die(m_pPlayer->GetCID(), WEAPON_WORLD); } // handle Weapons HandleWeapons(); // Previnput m_PrevInput = m_Input; return; } void CCharacter::TickDefered() { // advance the dummy { CWorldCore TempWorld; m_ReckoningCore.Init(&TempWorld, GameServer()->Collision()); m_ReckoningCore.Tick(false); m_ReckoningCore.Move(); m_ReckoningCore.Quantize(); } //lastsentcore vec2 StartPos = m_Core.m_Pos; vec2 StartVel = m_Core.m_Vel; bool StuckBefore = GameServer()->Collision()->TestBox(m_Core.m_Pos, vec2(28.0f, 28.0f)); m_Core.Move(); bool StuckAfterMove = GameServer()->Collision()->TestBox(m_Core.m_Pos, vec2(28.0f, 28.0f)); m_Core.Quantize(); bool StuckAfterQuant = GameServer()->Collision()->TestBox(m_Core.m_Pos, vec2(28.0f, 28.0f)); m_Pos = m_Core.m_Pos; if(!StuckBefore && (StuckAfterMove || StuckAfterQuant)) { // Hackish solution to get rid of strict-aliasing warning union { float f; unsigned u; }StartPosX, StartPosY, StartVelX, StartVelY; StartPosX.f = StartPos.x; StartPosY.f = StartPos.y; StartVelX.f = StartVel.x; StartVelY.f = StartVel.y; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "STUCK!!! %d %d %d %f %f %f %f %x %x %x %x", StuckBefore, StuckAfterMove, StuckAfterQuant, StartPos.x, StartPos.y, StartVel.x, StartVel.y, StartPosX.u, StartPosY.u, StartVelX.u, StartVelY.u); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); } int Events = m_Core.m_TriggeredEvents; int Mask = CmaskAllExceptOne(m_pPlayer->GetCID()); if(Events&COREEVENT_GROUND_JUMP) GameServer()->CreateSound(m_Pos, SOUND_PLAYER_JUMP, Mask); if(Events&COREEVENT_HOOK_ATTACH_PLAYER) GameServer()->CreateSound(m_Pos, SOUND_HOOK_ATTACH_PLAYER, CmaskAll()); if(Events&COREEVENT_HOOK_ATTACH_GROUND) GameServer()->CreateSound(m_Pos, SOUND_HOOK_ATTACH_GROUND, Mask); if(Events&COREEVENT_HOOK_HIT_NOHOOK) GameServer()->CreateSound(m_Pos, SOUND_HOOK_NOATTACH, Mask); if(m_pPlayer->GetTeam() == TEAM_SPECTATORS) { m_Pos.x = m_Input.m_TargetX; m_Pos.y = m_Input.m_TargetY; } // update the m_SendCore if needed { CNetObj_Character Predicted; CNetObj_Character Current; mem_zero(&Predicted, sizeof(Predicted)); mem_zero(&Current, sizeof(Current)); m_ReckoningCore.Write(&Predicted); m_Core.Write(&Current); // only allow dead reackoning for a top of 3 seconds if(m_ReckoningTick+Server()->TickSpeed()*3 < Server()->Tick() || mem_comp(&Predicted, &Current, sizeof(CNetObj_Character)) != 0) { m_ReckoningTick = Server()->Tick(); m_SendCore = m_Core; m_ReckoningCore = m_Core; } } } void CCharacter::TickPaused() { ++m_AttackTick; ++m_DamageTakenTick; ++m_Ninja.m_ActivationTick; ++m_ReckoningTick; if(m_LastAction != -1) ++m_LastAction; if(m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart > -1) ++m_aWeapons[m_ActiveWeapon].m_AmmoRegenStart; if(m_EmoteStop > -1) ++m_EmoteStop; } bool CCharacter::IncreaseHealth(int Amount) { if(m_Health >= 10) return false; m_Health = clamp(m_Health+Amount, 0, 10); return true; } bool CCharacter::IncreaseArmor(int Amount) { if(m_Armor >= 10) return false; m_Armor = clamp(m_Armor+Amount, 0, 10); return true; } void CCharacter::Die(int Killer, int Weapon) { // we got to wait 0.5 secs before respawning m_pPlayer->m_RespawnTick = Server()->Tick()+Server()->TickSpeed()/2; int ModeSpecial = GameServer()->m_pController->OnCharacterDeath(this, GameServer()->m_apPlayers[Killer], Weapon); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "kill killer='%d:%s' victim='%d:%s' weapon=%d special=%d", Killer, Server()->ClientName(Killer), m_pPlayer->GetCID(), Server()->ClientName(m_pPlayer->GetCID()), Weapon, ModeSpecial); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); // send the kill message CNetMsg_Sv_KillMsg Msg; Msg.m_Killer = Killer; Msg.m_Victim = m_pPlayer->GetCID(); Msg.m_Weapon = Weapon; Msg.m_ModeSpecial = ModeSpecial; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1); // a nice sound GameServer()->CreateSound(m_Pos, SOUND_PLAYER_DIE); // this is for auto respawn after 3 secs m_pPlayer->m_DieTick = Server()->Tick(); m_Alive = false; GameServer()->m_World.RemoveEntity(this); GameServer()->m_World.m_Core.m_apCharacters[m_pPlayer->GetCID()] = 0; GameServer()->CreateDeath(m_Pos, m_pPlayer->GetCID()); } bool CCharacter::TakeDamage(vec2 Force, int Dmg, int From, int Weapon) { m_Core.m_Vel += Force; if(GameServer()->m_pController->IsFriendlyFire(m_pPlayer->GetCID(), From) && !g_Config.m_SvTeamdamage) return false; // m_pPlayer only inflicts half damage on self if(From == m_pPlayer->GetCID()) Dmg = max(1, Dmg/2); m_DamageTaken++; // create healthmod indicator if(Server()->Tick() < m_DamageTakenTick+25) { // make sure that the damage indicators doesn't group together GameServer()->CreateDamageInd(m_Pos, m_DamageTaken*0.25f, Dmg); } else { m_DamageTaken = 0; GameServer()->CreateDamageInd(m_Pos, 0, Dmg); } if(Dmg) { if(m_Armor) { if(Dmg > 1) { m_Health--; Dmg--; } if(Dmg > m_Armor) { Dmg -= m_Armor; m_Armor = 0; } else { m_Armor -= Dmg; Dmg = 0; } } m_Health -= Dmg; } m_DamageTakenTick = Server()->Tick(); // do damage Hit sound if(From >= 0 && From != m_pPlayer->GetCID() && GameServer()->m_apPlayers[From]) { int Mask = CmaskOne(From); for(int i = 0; i < MAX_CLIENTS; i++) { if(GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->GetTeam() == TEAM_SPECTATORS && GameServer()->m_apPlayers[i]->m_SpectatorID == From) Mask |= CmaskOne(i); } GameServer()->CreateSound(GameServer()->m_apPlayers[From]->m_ViewPos, SOUND_HIT, Mask); } // check for death if(m_Health <= 0) { Die(From, Weapon); // set attacker's face to happy (taunt!) if (From >= 0 && From != m_pPlayer->GetCID() && GameServer()->m_apPlayers[From]) { CCharacter *pChr = GameServer()->m_apPlayers[From]->GetCharacter(); if (pChr) { pChr->m_EmoteType = EMOTE_HAPPY; pChr->m_EmoteStop = Server()->Tick() + Server()->TickSpeed(); } } return false; } if (Dmg > 2) GameServer()->CreateSound(m_Pos, SOUND_PLAYER_PAIN_LONG); else GameServer()->CreateSound(m_Pos, SOUND_PLAYER_PAIN_SHORT); m_EmoteType = EMOTE_PAIN; m_EmoteStop = Server()->Tick() + 500 * Server()->TickSpeed() / 1000; return true; } void CCharacter::Snap(int SnappingClient) { if(NetworkClipped(SnappingClient)) return; CNetObj_Character *pCharacter = static_cast(Server()->SnapNewItem(NETOBJTYPE_CHARACTER, m_pPlayer->GetCID(), sizeof(CNetObj_Character))); if(!pCharacter) return; // write down the m_Core if(!m_ReckoningTick || GameServer()->m_World.m_Paused) { // no dead reckoning when paused because the client doesn't know // how far to perform the reckoning pCharacter->m_Tick = 0; m_Core.Write(pCharacter); } else { pCharacter->m_Tick = m_ReckoningTick; m_SendCore.Write(pCharacter); } // set emote if (m_EmoteStop < Server()->Tick()) { m_EmoteType = EMOTE_NORMAL; m_EmoteStop = -1; } pCharacter->m_Emote = m_EmoteType; pCharacter->m_AmmoCount = 0; pCharacter->m_Health = 0; pCharacter->m_Armor = 0; pCharacter->m_Weapon = m_ActiveWeapon; pCharacter->m_AttackTick = m_AttackTick; pCharacter->m_Direction = m_Input.m_Direction; if(m_pPlayer->GetCID() == SnappingClient || SnappingClient == -1 || (!g_Config.m_SvStrictSpectateMode && m_pPlayer->GetCID() == GameServer()->m_apPlayers[SnappingClient]->m_SpectatorID)) { pCharacter->m_Health = m_Health; pCharacter->m_Armor = m_Armor; if(m_aWeapons[m_ActiveWeapon].m_Ammo > 0) pCharacter->m_AmmoCount = m_aWeapons[m_ActiveWeapon].m_Ammo; } if(pCharacter->m_Emote == EMOTE_NORMAL) { if(250 - ((Server()->Tick() - m_LastAction)%(250)) < 5) pCharacter->m_Emote = EMOTE_BLINK; } pCharacter->m_PlayerFlags = GetPlayer()->m_PlayerFlags; } teeworlds-0.6.2+dfsg/src/game/server/entities/character.h0000644000175000017500000000541212140200333022373 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_ENTITIES_CHARACTER_H #define GAME_SERVER_ENTITIES_CHARACTER_H #include #include #include #include enum { WEAPON_GAME = -3, // team switching etc WEAPON_SELF = -2, // console kill command WEAPON_WORLD = -1, // death tiles etc }; class CCharacter : public CEntity { MACRO_ALLOC_POOL_ID() public: //character's size static const int ms_PhysSize = 28; CCharacter(CGameWorld *pWorld); virtual void Reset(); virtual void Destroy(); virtual void Tick(); virtual void TickDefered(); virtual void TickPaused(); virtual void Snap(int SnappingClient); bool IsGrounded(); void SetWeapon(int W); void HandleWeaponSwitch(); void DoWeaponSwitch(); void HandleWeapons(); void HandleNinja(); void OnPredictedInput(CNetObj_PlayerInput *pNewInput); void OnDirectInput(CNetObj_PlayerInput *pNewInput); void ResetInput(); void FireWeapon(); void Die(int Killer, int Weapon); bool TakeDamage(vec2 Force, int Dmg, int From, int Weapon); bool Spawn(class CPlayer *pPlayer, vec2 Pos); bool Remove(); bool IncreaseHealth(int Amount); bool IncreaseArmor(int Amount); bool GiveWeapon(int Weapon, int Ammo); void GiveNinja(); void SetEmote(int Emote, int Tick); bool IsAlive() const { return m_Alive; } class CPlayer *GetPlayer() { return m_pPlayer; } private: // player controlling this character class CPlayer *m_pPlayer; bool m_Alive; // weapon info CEntity *m_apHitObjects[10]; int m_NumObjectsHit; struct WeaponStat { int m_AmmoRegenStart; int m_Ammo; int m_Ammocost; bool m_Got; } m_aWeapons[NUM_WEAPONS]; int m_ActiveWeapon; int m_LastWeapon; int m_QueuedWeapon; int m_ReloadTimer; int m_AttackTick; int m_DamageTaken; int m_EmoteType; int m_EmoteStop; // last tick that the player took any action ie some input int m_LastAction; int m_LastNoAmmoSound; // these are non-heldback inputs CNetObj_PlayerInput m_LatestPrevInput; CNetObj_PlayerInput m_LatestInput; // input CNetObj_PlayerInput m_PrevInput; CNetObj_PlayerInput m_Input; int m_NumInputs; int m_Jumped; int m_DamageTakenTick; int m_Health; int m_Armor; // ninja struct { vec2 m_ActivationDir; int m_ActivationTick; int m_CurrentMoveTime; int m_OldVelAmount; } m_Ninja; // the player core for the physics CCharacterCore m_Core; // info for dead reckoning int m_ReckoningTick; // tick that we are performing dead reckoning From CCharacterCore m_SendCore; // core that we should send CCharacterCore m_ReckoningCore; // the dead reckoning core }; #endif teeworlds-0.6.2+dfsg/src/game/server/entities/flag.cpp0000644000175000017500000000170312140200333021702 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include "flag.h" CFlag::CFlag(CGameWorld *pGameWorld, int Team) : CEntity(pGameWorld, CGameWorld::ENTTYPE_FLAG) { m_Team = Team; m_ProximityRadius = ms_PhysSize; m_pCarryingCharacter = NULL; m_GrabTick = 0; Reset(); } void CFlag::Reset() { m_pCarryingCharacter = NULL; m_AtStand = 1; m_Pos = m_StandPos; m_Vel = vec2(0,0); m_GrabTick = 0; } void CFlag::TickPaused() { ++m_DropTick; if(m_GrabTick) ++m_GrabTick; } void CFlag::Snap(int SnappingClient) { if(NetworkClipped(SnappingClient)) return; CNetObj_Flag *pFlag = (CNetObj_Flag *)Server()->SnapNewItem(NETOBJTYPE_FLAG, m_Team, sizeof(CNetObj_Flag)); if(!pFlag) return; pFlag->m_X = (int)m_Pos.x; pFlag->m_Y = (int)m_Pos.y; pFlag->m_Team = m_Team; } teeworlds-0.6.2+dfsg/src/game/server/entities/flag.h0000644000175000017500000000121112140200333021341 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_ENTITIES_FLAG_H #define GAME_SERVER_ENTITIES_FLAG_H #include class CFlag : public CEntity { public: static const int ms_PhysSize = 14; CCharacter *m_pCarryingCharacter; vec2 m_Vel; vec2 m_StandPos; int m_Team; int m_AtStand; int m_DropTick; int m_GrabTick; CFlag(CGameWorld *pGameWorld, int Team); virtual void Reset(); virtual void TickPaused(); virtual void Snap(int SnappingClient); }; #endif teeworlds-0.6.2+dfsg/src/game/server/entities/laser.cpp0000644000175000017500000000472012140200333022101 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "laser.h" CLaser::CLaser(CGameWorld *pGameWorld, vec2 Pos, vec2 Direction, float StartEnergy, int Owner) : CEntity(pGameWorld, CGameWorld::ENTTYPE_LASER) { m_Pos = Pos; m_Owner = Owner; m_Energy = StartEnergy; m_Dir = Direction; m_Bounces = 0; m_EvalTick = 0; GameWorld()->InsertEntity(this); DoBounce(); } bool CLaser::HitCharacter(vec2 From, vec2 To) { vec2 At; CCharacter *pOwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *pHit = GameServer()->m_World.IntersectCharacter(m_Pos, To, 0.f, At, pOwnerChar); if(!pHit) return false; m_From = From; m_Pos = At; m_Energy = -1; pHit->TakeDamage(vec2(0.f, 0.f), GameServer()->Tuning()->m_LaserDamage, m_Owner, WEAPON_RIFLE); return true; } void CLaser::DoBounce() { m_EvalTick = Server()->Tick(); if(m_Energy < 0) { GameServer()->m_World.DestroyEntity(this); return; } vec2 To = m_Pos + m_Dir * m_Energy; if(GameServer()->Collision()->IntersectLine(m_Pos, To, 0x0, &To)) { if(!HitCharacter(m_Pos, To)) { // intersected m_From = m_Pos; m_Pos = To; vec2 TempPos = m_Pos; vec2 TempDir = m_Dir * 4.0f; GameServer()->Collision()->MovePoint(&TempPos, &TempDir, 1.0f, 0); m_Pos = TempPos; m_Dir = normalize(TempDir); m_Energy -= distance(m_From, m_Pos) + GameServer()->Tuning()->m_LaserBounceCost; m_Bounces++; if(m_Bounces > GameServer()->Tuning()->m_LaserBounceNum) m_Energy = -1; GameServer()->CreateSound(m_Pos, SOUND_RIFLE_BOUNCE); } } else { if(!HitCharacter(m_Pos, To)) { m_From = m_Pos; m_Pos = To; m_Energy = -1; } } } void CLaser::Reset() { GameServer()->m_World.DestroyEntity(this); } void CLaser::Tick() { if(Server()->Tick() > m_EvalTick+(Server()->TickSpeed()*GameServer()->Tuning()->m_LaserBounceDelay)/1000.0f) DoBounce(); } void CLaser::TickPaused() { ++m_EvalTick; } void CLaser::Snap(int SnappingClient) { if(NetworkClipped(SnappingClient)) return; CNetObj_Laser *pObj = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser))); if(!pObj) return; pObj->m_X = (int)m_Pos.x; pObj->m_Y = (int)m_Pos.y; pObj->m_FromX = (int)m_From.x; pObj->m_FromY = (int)m_From.y; pObj->m_StartTick = m_EvalTick; } teeworlds-0.6.2+dfsg/src/game/server/entities/laser.h0000644000175000017500000000132512140200333021544 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_ENTITIES_LASER_H #define GAME_SERVER_ENTITIES_LASER_H #include class CLaser : public CEntity { public: CLaser(CGameWorld *pGameWorld, vec2 Pos, vec2 Direction, float StartEnergy, int Owner); virtual void Reset(); virtual void Tick(); virtual void TickPaused(); virtual void Snap(int SnappingClient); protected: bool HitCharacter(vec2 From, vec2 To); void DoBounce(); private: vec2 m_From; vec2 m_Dir; float m_Energy; int m_Bounces; int m_EvalTick; int m_Owner; }; #endif teeworlds-0.6.2+dfsg/src/game/server/entities/pickup.cpp0000644000175000017500000000721412140200333022267 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "pickup.h" CPickup::CPickup(CGameWorld *pGameWorld, int Type, int SubType) : CEntity(pGameWorld, CGameWorld::ENTTYPE_PICKUP) { m_Type = Type; m_Subtype = SubType; m_ProximityRadius = PickupPhysSize; Reset(); GameWorld()->InsertEntity(this); } void CPickup::Reset() { if (g_pData->m_aPickups[m_Type].m_Spawndelay > 0) m_SpawnTick = Server()->Tick() + Server()->TickSpeed() * g_pData->m_aPickups[m_Type].m_Spawndelay; else m_SpawnTick = -1; } void CPickup::Tick() { // wait for respawn if(m_SpawnTick > 0) { if(Server()->Tick() > m_SpawnTick) { // respawn m_SpawnTick = -1; if(m_Type == POWERUP_WEAPON) GameServer()->CreateSound(m_Pos, SOUND_WEAPON_SPAWN); } else return; } // Check if a player intersected us CCharacter *pChr = GameServer()->m_World.ClosestCharacter(m_Pos, 20.0f, 0); if(pChr && pChr->IsAlive()) { // player picked us up, is someone was hooking us, let them go int RespawnTime = -1; switch (m_Type) { case POWERUP_HEALTH: if(pChr->IncreaseHealth(1)) { GameServer()->CreateSound(m_Pos, SOUND_PICKUP_HEALTH); RespawnTime = g_pData->m_aPickups[m_Type].m_Respawntime; } break; case POWERUP_ARMOR: if(pChr->IncreaseArmor(1)) { GameServer()->CreateSound(m_Pos, SOUND_PICKUP_ARMOR); RespawnTime = g_pData->m_aPickups[m_Type].m_Respawntime; } break; case POWERUP_WEAPON: if(m_Subtype >= 0 && m_Subtype < NUM_WEAPONS) { if(pChr->GiveWeapon(m_Subtype, 10)) { RespawnTime = g_pData->m_aPickups[m_Type].m_Respawntime; if(m_Subtype == WEAPON_GRENADE) GameServer()->CreateSound(m_Pos, SOUND_PICKUP_GRENADE); else if(m_Subtype == WEAPON_SHOTGUN) GameServer()->CreateSound(m_Pos, SOUND_PICKUP_SHOTGUN); else if(m_Subtype == WEAPON_RIFLE) GameServer()->CreateSound(m_Pos, SOUND_PICKUP_SHOTGUN); if(pChr->GetPlayer()) GameServer()->SendWeaponPickup(pChr->GetPlayer()->GetCID(), m_Subtype); } } break; case POWERUP_NINJA: { // activate ninja on target player pChr->GiveNinja(); RespawnTime = g_pData->m_aPickups[m_Type].m_Respawntime; // loop through all players, setting their emotes CCharacter *pC = static_cast(GameServer()->m_World.FindFirst(CGameWorld::ENTTYPE_CHARACTER)); for(; pC; pC = (CCharacter *)pC->TypeNext()) { if (pC != pChr) pC->SetEmote(EMOTE_SURPRISE, Server()->Tick() + Server()->TickSpeed()); } pChr->SetEmote(EMOTE_ANGRY, Server()->Tick() + 1200 * Server()->TickSpeed() / 1000); break; } default: break; }; if(RespawnTime >= 0) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "pickup player='%d:%s' item=%d/%d", pChr->GetPlayer()->GetCID(), Server()->ClientName(pChr->GetPlayer()->GetCID()), m_Type, m_Subtype); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); m_SpawnTick = Server()->Tick() + Server()->TickSpeed() * RespawnTime; } } } void CPickup::TickPaused() { if(m_SpawnTick != -1) ++m_SpawnTick; } void CPickup::Snap(int SnappingClient) { if(m_SpawnTick != -1 || NetworkClipped(SnappingClient)) return; CNetObj_Pickup *pP = static_cast(Server()->SnapNewItem(NETOBJTYPE_PICKUP, m_ID, sizeof(CNetObj_Pickup))); if(!pP) return; pP->m_X = (int)m_Pos.x; pP->m_Y = (int)m_Pos.y; pP->m_Type = m_Type; pP->m_Subtype = m_Subtype; } teeworlds-0.6.2+dfsg/src/game/server/entities/pickup.h0000644000175000017500000000115212140200333021727 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_ENTITIES_PICKUP_H #define GAME_SERVER_ENTITIES_PICKUP_H #include const int PickupPhysSize = 14; class CPickup : public CEntity { public: CPickup(CGameWorld *pGameWorld, int Type, int SubType = 0); virtual void Reset(); virtual void Tick(); virtual void TickPaused(); virtual void Snap(int SnappingClient); private: int m_Type; int m_Subtype; int m_SpawnTick; }; #endif teeworlds-0.6.2+dfsg/src/game/server/entities/projectile.cpp0000644000175000017500000000577012140200333023141 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "projectile.h" CProjectile::CProjectile(CGameWorld *pGameWorld, int Type, int Owner, vec2 Pos, vec2 Dir, int Span, int Damage, bool Explosive, float Force, int SoundImpact, int Weapon) : CEntity(pGameWorld, CGameWorld::ENTTYPE_PROJECTILE) { m_Type = Type; m_Pos = Pos; m_Direction = Dir; m_LifeSpan = Span; m_Owner = Owner; m_Force = Force; m_Damage = Damage; m_SoundImpact = SoundImpact; m_Weapon = Weapon; m_StartTick = Server()->Tick(); m_Explosive = Explosive; GameWorld()->InsertEntity(this); } void CProjectile::Reset() { GameServer()->m_World.DestroyEntity(this); } vec2 CProjectile::GetPos(float Time) { float Curvature = 0; float Speed = 0; switch(m_Type) { case WEAPON_GRENADE: Curvature = GameServer()->Tuning()->m_GrenadeCurvature; Speed = GameServer()->Tuning()->m_GrenadeSpeed; break; case WEAPON_SHOTGUN: Curvature = GameServer()->Tuning()->m_ShotgunCurvature; Speed = GameServer()->Tuning()->m_ShotgunSpeed; break; case WEAPON_GUN: Curvature = GameServer()->Tuning()->m_GunCurvature; Speed = GameServer()->Tuning()->m_GunSpeed; break; } return CalcPos(m_Pos, m_Direction, Curvature, Speed, Time); } void CProjectile::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &CurPos, 0); CCharacter *OwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *TargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, CurPos, 6.0f, CurPos, OwnerChar); m_LifeSpan--; if(TargetChr || Collide || m_LifeSpan < 0 || GameLayerClipped(CurPos)) { if(m_LifeSpan >= 0 || m_Weapon == WEAPON_GRENADE) GameServer()->CreateSound(CurPos, m_SoundImpact); if(m_Explosive) GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false); else if(TargetChr) TargetChr->TakeDamage(m_Direction * max(0.001f, m_Force), m_Damage, m_Owner, m_Weapon); GameServer()->m_World.DestroyEntity(this); } } void CProjectile::TickPaused() { ++m_StartTick; } void CProjectile::FillInfo(CNetObj_Projectile *pProj) { pProj->m_X = (int)m_Pos.x; pProj->m_Y = (int)m_Pos.y; pProj->m_VelX = (int)(m_Direction.x*100.0f); pProj->m_VelY = (int)(m_Direction.y*100.0f); pProj->m_StartTick = m_StartTick; pProj->m_Type = m_Type; } void CProjectile::Snap(int SnappingClient) { float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); if(NetworkClipped(SnappingClient, GetPos(Ct))) return; CNetObj_Projectile *pProj = static_cast(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, m_ID, sizeof(CNetObj_Projectile))); if(pProj) FillInfo(pProj); } teeworlds-0.6.2+dfsg/src/game/server/entities/projectile.h0000644000175000017500000000152612140200333022601 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_ENTITIES_PROJECTILE_H #define GAME_SERVER_ENTITIES_PROJECTILE_H class CProjectile : public CEntity { public: CProjectile(CGameWorld *pGameWorld, int Type, int Owner, vec2 Pos, vec2 Dir, int Span, int Damage, bool Explosive, float Force, int SoundImpact, int Weapon); vec2 GetPos(float Time); void FillInfo(CNetObj_Projectile *pProj); virtual void Reset(); virtual void Tick(); virtual void TickPaused(); virtual void Snap(int SnappingClient); private: vec2 m_Direction; int m_LifeSpan; int m_Owner; int m_Type; int m_Damage; int m_SoundImpact; int m_Weapon; float m_Force; int m_StartTick; bool m_Explosive; }; #endif teeworlds-0.6.2+dfsg/src/game/server/entity.cpp0000644000175000017500000000275712140200333020473 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "entity.h" #include "gamecontext.h" ////////////////////////////////////////////////// // Entity ////////////////////////////////////////////////// CEntity::CEntity(CGameWorld *pGameWorld, int ObjType) { m_pGameWorld = pGameWorld; m_ObjType = ObjType; m_Pos = vec2(0,0); m_ProximityRadius = 0; m_MarkedForDestroy = false; m_ID = Server()->SnapNewID(); m_pPrevTypeEntity = 0; m_pNextTypeEntity = 0; } CEntity::~CEntity() { GameWorld()->RemoveEntity(this); Server()->SnapFreeID(m_ID); } int CEntity::NetworkClipped(int SnappingClient) { return NetworkClipped(SnappingClient, m_Pos); } int CEntity::NetworkClipped(int SnappingClient, vec2 CheckPos) { if(SnappingClient == -1) return 0; float dx = GameServer()->m_apPlayers[SnappingClient]->m_ViewPos.x-CheckPos.x; float dy = GameServer()->m_apPlayers[SnappingClient]->m_ViewPos.y-CheckPos.y; if(absolute(dx) > 1000.0f || absolute(dy) > 800.0f) return 1; if(distance(GameServer()->m_apPlayers[SnappingClient]->m_ViewPos, CheckPos) > 1100.0f) return 1; return 0; } bool CEntity::GameLayerClipped(vec2 CheckPos) { return round(CheckPos.x)/32 < -200 || round(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 || round(CheckPos.y)/32 < -200 || round(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false; } teeworlds-0.6.2+dfsg/src/game/server/entity.h0000644000175000017500000000766612140200333020144 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_ENTITY_H #define GAME_SERVER_ENTITY_H #include #include #include #define MACRO_ALLOC_HEAP() \ public: \ void *operator new(size_t Size) \ { \ void *p = mem_alloc(Size, 1); \ /*dbg_msg("", "++ %p %d", p, size);*/ \ mem_zero(p, Size); \ return p; \ } \ void operator delete(void *pPtr) \ { \ /*dbg_msg("", "-- %p", p);*/ \ mem_free(pPtr); \ } \ private: #define MACRO_ALLOC_POOL_ID() \ public: \ void *operator new(size_t Size, int id); \ void operator delete(void *p); \ private: #define MACRO_ALLOC_POOL_ID_IMPL(POOLTYPE, PoolSize) \ static char ms_PoolData##POOLTYPE[PoolSize][sizeof(POOLTYPE)] = {{0}}; \ static int ms_PoolUsed##POOLTYPE[PoolSize] = {0}; \ void *POOLTYPE::operator new(size_t Size, int id) \ { \ dbg_assert(sizeof(POOLTYPE) == Size, "size error"); \ dbg_assert(!ms_PoolUsed##POOLTYPE[id], "already used"); \ /*dbg_msg("pool", "++ %s %d", #POOLTYPE, id);*/ \ ms_PoolUsed##POOLTYPE[id] = 1; \ mem_zero(ms_PoolData##POOLTYPE[id], Size); \ return ms_PoolData##POOLTYPE[id]; \ } \ void POOLTYPE::operator delete(void *p) \ { \ int id = (POOLTYPE*)p - (POOLTYPE*)ms_PoolData##POOLTYPE; \ dbg_assert(ms_PoolUsed##POOLTYPE[id], "not used"); \ /*dbg_msg("pool", "-- %s %d", #POOLTYPE, id);*/ \ ms_PoolUsed##POOLTYPE[id] = 0; \ mem_zero(ms_PoolData##POOLTYPE[id], sizeof(POOLTYPE)); \ } /* Class: Entity Basic entity class. */ class CEntity { MACRO_ALLOC_HEAP() friend class CGameWorld; // entity list handling CEntity *m_pPrevTypeEntity; CEntity *m_pNextTypeEntity; class CGameWorld *m_pGameWorld; protected: bool m_MarkedForDestroy; int m_ID; int m_ObjType; public: CEntity(CGameWorld *pGameWorld, int Objtype); virtual ~CEntity(); class CGameWorld *GameWorld() { return m_pGameWorld; } class CGameContext *GameServer() { return GameWorld()->GameServer(); } class IServer *Server() { return GameWorld()->Server(); } CEntity *TypeNext() { return m_pNextTypeEntity; } CEntity *TypePrev() { return m_pPrevTypeEntity; } /* Function: destroy Destorys the entity. */ virtual void Destroy() { delete this; } /* Function: reset Called when the game resets the map. Puts the entity back to it's starting state or perhaps destroys it. */ virtual void Reset() {} /* Function: tick Called progress the entity to the next tick. Updates and moves the entity to it's new state and position. */ virtual void Tick() {} /* Function: tick_defered Called after all entities tick() function has been called. */ virtual void TickDefered() {} /* Function: TickPaused Called when the game is paused, to freeze the state and position of the entity. */ virtual void TickPaused() {} /* Function: snap Called when a new snapshot is being generated for a specific client. Arguments: snapping_client - ID of the client which snapshot is being generated. Could be -1 to create a complete snapshot of everything in the game for demo recording. */ virtual void Snap(int SnappingClient) {} /* Function: networkclipped(int snapping_client) Performs a series of test to see if a client can see the entity. Arguments: snapping_client - ID of the client which snapshot is being generated. Could be -1 to create a complete snapshot of everything in the game for demo recording. Returns: Non-zero if the entity doesn't have to be in the snapshot. */ int NetworkClipped(int SnappingClient); int NetworkClipped(int SnappingClient, vec2 CheckPos); bool GameLayerClipped(vec2 CheckPos); /* Variable: proximity_radius Contains the physical size of the entity. */ float m_ProximityRadius; /* Variable: pos Contains the current posititon of the entity. */ vec2 m_Pos; }; #endif teeworlds-0.6.2+dfsg/src/game/server/eventhandler.cpp0000644000175000017500000000276512140200333021635 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "eventhandler.h" #include "gamecontext.h" ////////////////////////////////////////////////// // Event handler ////////////////////////////////////////////////// CEventHandler::CEventHandler() { m_pGameServer = 0; Clear(); } void CEventHandler::SetGameServer(CGameContext *pGameServer) { m_pGameServer = pGameServer; } void *CEventHandler::Create(int Type, int Size, int Mask) { if(m_NumEvents == MAX_EVENTS) return 0; if(m_CurrentOffset+Size >= MAX_DATASIZE) return 0; void *p = &m_aData[m_CurrentOffset]; m_aOffsets[m_NumEvents] = m_CurrentOffset; m_aTypes[m_NumEvents] = Type; m_aSizes[m_NumEvents] = Size; m_aClientMasks[m_NumEvents] = Mask; m_CurrentOffset += Size; m_NumEvents++; return p; } void CEventHandler::Clear() { m_NumEvents = 0; m_CurrentOffset = 0; } void CEventHandler::Snap(int SnappingClient) { for(int i = 0; i < m_NumEvents; i++) { if(SnappingClient == -1 || CmaskIsSet(m_aClientMasks[i], SnappingClient)) { CNetEvent_Common *ev = (CNetEvent_Common *)&m_aData[m_aOffsets[i]]; if(SnappingClient == -1 || distance(GameServer()->m_apPlayers[SnappingClient]->m_ViewPos, vec2(ev->m_X, ev->m_Y)) < 1500.0f) { void *d = GameServer()->Server()->SnapNewItem(m_aTypes[i], i, m_aSizes[i]); if(d) mem_copy(d, &m_aData[m_aOffsets[i]], m_aSizes[i]); } } } } teeworlds-0.6.2+dfsg/src/game/server/eventhandler.h0000644000175000017500000000154512140200333021275 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_EVENTHANDLER_H #define GAME_SERVER_EVENTHANDLER_H // class CEventHandler { static const int MAX_EVENTS = 128; static const int MAX_DATASIZE = 128*64; int m_aTypes[MAX_EVENTS]; // TODO: remove some of these arrays int m_aOffsets[MAX_EVENTS]; int m_aSizes[MAX_EVENTS]; int m_aClientMasks[MAX_EVENTS]; char m_aData[MAX_DATASIZE]; class CGameContext *m_pGameServer; int m_CurrentOffset; int m_NumEvents; public: CGameContext *GameServer() const { return m_pGameServer; } void SetGameServer(CGameContext *pGameServer); CEventHandler(); void *Create(int Type, int Size, int Mask = -1); void Clear(); void Snap(int SnappingClient); }; #endif teeworlds-0.6.2+dfsg/src/game/server/gamecontext.cpp0000644000175000017500000013717112140200333021474 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include "gamecontext.h" #include #include #include #include "gamemodes/dm.h" #include "gamemodes/tdm.h" #include "gamemodes/ctf.h" #include "gamemodes/mod.h" enum { RESET, NO_RESET }; void CGameContext::Construct(int Resetting) { m_Resetting = 0; m_pServer = 0; for(int i = 0; i < MAX_CLIENTS; i++) m_apPlayers[i] = 0; m_pController = 0; m_VoteCloseTime = 0; m_pVoteOptionFirst = 0; m_pVoteOptionLast = 0; m_NumVoteOptions = 0; m_LockTeams = 0; if(Resetting==NO_RESET) m_pVoteOptionHeap = new CHeap(); } CGameContext::CGameContext(int Resetting) { Construct(Resetting); } CGameContext::CGameContext() { Construct(NO_RESET); } CGameContext::~CGameContext() { for(int i = 0; i < MAX_CLIENTS; i++) delete m_apPlayers[i]; if(!m_Resetting) delete m_pVoteOptionHeap; } void CGameContext::Clear() { CHeap *pVoteOptionHeap = m_pVoteOptionHeap; CVoteOptionServer *pVoteOptionFirst = m_pVoteOptionFirst; CVoteOptionServer *pVoteOptionLast = m_pVoteOptionLast; int NumVoteOptions = m_NumVoteOptions; CTuningParams Tuning = m_Tuning; m_Resetting = true; this->~CGameContext(); mem_zero(this, sizeof(*this)); new (this) CGameContext(RESET); m_pVoteOptionHeap = pVoteOptionHeap; m_pVoteOptionFirst = pVoteOptionFirst; m_pVoteOptionLast = pVoteOptionLast; m_NumVoteOptions = NumVoteOptions; m_Tuning = Tuning; } class CCharacter *CGameContext::GetPlayerChar(int ClientID) { if(ClientID < 0 || ClientID >= MAX_CLIENTS || !m_apPlayers[ClientID]) return 0; return m_apPlayers[ClientID]->GetCharacter(); } void CGameContext::CreateDamageInd(vec2 Pos, float Angle, int Amount) { float a = 3 * 3.14159f / 2 + Angle; //float a = get_angle(dir); float s = a-pi/3; float e = a+pi/3; for(int i = 0; i < Amount; i++) { float f = mix(s, e, float(i+1)/float(Amount+2)); CNetEvent_DamageInd *pEvent = (CNetEvent_DamageInd *)m_Events.Create(NETEVENTTYPE_DAMAGEIND, sizeof(CNetEvent_DamageInd)); if(pEvent) { pEvent->m_X = (int)Pos.x; pEvent->m_Y = (int)Pos.y; pEvent->m_Angle = (int)(f*256.0f); } } } void CGameContext::CreateHammerHit(vec2 Pos) { // create the event CNetEvent_HammerHit *pEvent = (CNetEvent_HammerHit *)m_Events.Create(NETEVENTTYPE_HAMMERHIT, sizeof(CNetEvent_HammerHit)); if(pEvent) { pEvent->m_X = (int)Pos.x; pEvent->m_Y = (int)Pos.y; } } void CGameContext::CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage) { // create the event CNetEvent_Explosion *pEvent = (CNetEvent_Explosion *)m_Events.Create(NETEVENTTYPE_EXPLOSION, sizeof(CNetEvent_Explosion)); if(pEvent) { pEvent->m_X = (int)Pos.x; pEvent->m_Y = (int)Pos.y; } if (!NoDamage) { // deal damage CCharacter *apEnts[MAX_CLIENTS]; float Radius = 135.0f; float InnerRadius = 48.0f; int Num = m_World.FindEntities(Pos, Radius, (CEntity**)apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); for(int i = 0; i < Num; i++) { vec2 Diff = apEnts[i]->m_Pos - Pos; vec2 ForceDir(0,1); float l = length(Diff); if(l) ForceDir = normalize(Diff); l = 1-clamp((l-InnerRadius)/(Radius-InnerRadius), 0.0f, 1.0f); float Dmg = 6 * l; if((int)Dmg) apEnts[i]->TakeDamage(ForceDir*Dmg*2, (int)Dmg, Owner, Weapon); } } } /* void create_smoke(vec2 Pos) { // create the event EV_EXPLOSION *pEvent = (EV_EXPLOSION *)events.create(EVENT_SMOKE, sizeof(EV_EXPLOSION)); if(pEvent) { pEvent->x = (int)Pos.x; pEvent->y = (int)Pos.y; } }*/ void CGameContext::CreatePlayerSpawn(vec2 Pos) { // create the event CNetEvent_Spawn *ev = (CNetEvent_Spawn *)m_Events.Create(NETEVENTTYPE_SPAWN, sizeof(CNetEvent_Spawn)); if(ev) { ev->m_X = (int)Pos.x; ev->m_Y = (int)Pos.y; } } void CGameContext::CreateDeath(vec2 Pos, int ClientID) { // create the event CNetEvent_Death *pEvent = (CNetEvent_Death *)m_Events.Create(NETEVENTTYPE_DEATH, sizeof(CNetEvent_Death)); if(pEvent) { pEvent->m_X = (int)Pos.x; pEvent->m_Y = (int)Pos.y; pEvent->m_ClientID = ClientID; } } void CGameContext::CreateSound(vec2 Pos, int Sound, int Mask) { if (Sound < 0) return; // create a sound CNetEvent_SoundWorld *pEvent = (CNetEvent_SoundWorld *)m_Events.Create(NETEVENTTYPE_SOUNDWORLD, sizeof(CNetEvent_SoundWorld), Mask); if(pEvent) { pEvent->m_X = (int)Pos.x; pEvent->m_Y = (int)Pos.y; pEvent->m_SoundID = Sound; } } void CGameContext::CreateSoundGlobal(int Sound, int Target) { if (Sound < 0) return; CNetMsg_Sv_SoundGlobal Msg; Msg.m_SoundID = Sound; if(Target == -2) Server()->SendPackMsg(&Msg, MSGFLAG_NOSEND, -1); else { int Flag = MSGFLAG_VITAL; if(Target != -1) Flag |= MSGFLAG_NORECORD; Server()->SendPackMsg(&Msg, Flag, Target); } } void CGameContext::SendChatTarget(int To, const char *pText) { CNetMsg_Sv_Chat Msg; Msg.m_Team = 0; Msg.m_ClientID = -1; Msg.m_pMessage = pText; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, To); } void CGameContext::SendChat(int ChatterClientID, int Team, const char *pText) { char aBuf[256]; if(ChatterClientID >= 0 && ChatterClientID < MAX_CLIENTS) str_format(aBuf, sizeof(aBuf), "%d:%d:%s: %s", ChatterClientID, Team, Server()->ClientName(ChatterClientID), pText); else str_format(aBuf, sizeof(aBuf), "*** %s", pText); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, Team!=CHAT_ALL?"teamchat":"chat", aBuf); if(Team == CHAT_ALL) { CNetMsg_Sv_Chat Msg; Msg.m_Team = 0; Msg.m_ClientID = ChatterClientID; Msg.m_pMessage = pText; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1); } else { CNetMsg_Sv_Chat Msg; Msg.m_Team = 1; Msg.m_ClientID = ChatterClientID; Msg.m_pMessage = pText; // pack one for the recording only Server()->SendPackMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_NOSEND, -1); // send to the clients for(int i = 0; i < MAX_CLIENTS; i++) { if(m_apPlayers[i] && m_apPlayers[i]->GetTeam() == Team) Server()->SendPackMsg(&Msg, MSGFLAG_VITAL|MSGFLAG_NORECORD, i); } } } void CGameContext::SendEmoticon(int ClientID, int Emoticon) { CNetMsg_Sv_Emoticon Msg; Msg.m_ClientID = ClientID; Msg.m_Emoticon = Emoticon; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1); } void CGameContext::SendWeaponPickup(int ClientID, int Weapon) { CNetMsg_Sv_WeaponPickup Msg; Msg.m_Weapon = Weapon; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); } void CGameContext::SendBroadcast(const char *pText, int ClientID) { CNetMsg_Sv_Broadcast Msg; Msg.m_pMessage = pText; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); } // void CGameContext::StartVote(const char *pDesc, const char *pCommand, const char *pReason) { // check if a vote is already running if(m_VoteCloseTime) return; // reset votes m_VoteEnforce = VOTE_ENFORCE_UNKNOWN; for(int i = 0; i < MAX_CLIENTS; i++) { if(m_apPlayers[i]) { m_apPlayers[i]->m_Vote = 0; m_apPlayers[i]->m_VotePos = 0; } } // start vote m_VoteCloseTime = time_get() + time_freq()*25; str_copy(m_aVoteDescription, pDesc, sizeof(m_aVoteDescription)); str_copy(m_aVoteCommand, pCommand, sizeof(m_aVoteCommand)); str_copy(m_aVoteReason, pReason, sizeof(m_aVoteReason)); SendVoteSet(-1); m_VoteUpdate = true; } void CGameContext::EndVote() { m_VoteCloseTime = 0; SendVoteSet(-1); } void CGameContext::SendVoteSet(int ClientID) { CNetMsg_Sv_VoteSet Msg; if(m_VoteCloseTime) { Msg.m_Timeout = (m_VoteCloseTime-time_get())/time_freq(); Msg.m_pDescription = m_aVoteDescription; Msg.m_pReason = m_aVoteReason; } else { Msg.m_Timeout = 0; Msg.m_pDescription = ""; Msg.m_pReason = ""; } Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); } void CGameContext::SendVoteStatus(int ClientID, int Total, int Yes, int No) { CNetMsg_Sv_VoteStatus Msg = {0}; Msg.m_Total = Total; Msg.m_Yes = Yes; Msg.m_No = No; Msg.m_Pass = Total - (Yes+No); Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); } void CGameContext::AbortVoteKickOnDisconnect(int ClientID) { if(m_VoteCloseTime && ((!str_comp_num(m_aVoteCommand, "kick ", 5) && str_toint(&m_aVoteCommand[5]) == ClientID) || (!str_comp_num(m_aVoteCommand, "set_team ", 9) && str_toint(&m_aVoteCommand[9]) == ClientID))) m_VoteCloseTime = -1; } void CGameContext::CheckPureTuning() { // might not be created yet during start up if(!m_pController) return; if( str_comp(m_pController->m_pGameType, "DM")==0 || str_comp(m_pController->m_pGameType, "TDM")==0 || str_comp(m_pController->m_pGameType, "CTF")==0) { CTuningParams p; if(mem_comp(&p, &m_Tuning, sizeof(p)) != 0) { Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "resetting tuning due to pure server"); m_Tuning = p; } } } void CGameContext::SendTuningParams(int ClientID) { CheckPureTuning(); CMsgPacker Msg(NETMSGTYPE_SV_TUNEPARAMS); int *pParams = (int *)&m_Tuning; for(unsigned i = 0; i < sizeof(m_Tuning)/sizeof(int); i++) Msg.AddInt(pParams[i]); Server()->SendMsg(&Msg, MSGFLAG_VITAL, ClientID); } void CGameContext::SwapTeams() { if(!m_pController->IsTeamplay()) return; SendChat(-1, CGameContext::CHAT_ALL, "Teams were swapped"); for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_apPlayers[i] && m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS) m_apPlayers[i]->SetTeam(m_apPlayers[i]->GetTeam()^1, false); } (void)m_pController->CheckTeamBalance(); } void CGameContext::OnTick() { // check tuning CheckPureTuning(); // copy tuning m_World.m_Core.m_Tuning = m_Tuning; m_World.Tick(); //if(world.paused) // make sure that the game object always updates m_pController->Tick(); for(int i = 0; i < MAX_CLIENTS; i++) { if(m_apPlayers[i]) { m_apPlayers[i]->Tick(); m_apPlayers[i]->PostTick(); } } // update voting if(m_VoteCloseTime) { // abort the kick-vote on player-leave if(m_VoteCloseTime == -1) { SendChat(-1, CGameContext::CHAT_ALL, "Vote aborted"); EndVote(); } else { int Total = 0, Yes = 0, No = 0; if(m_VoteUpdate) { // count votes char aaBuf[MAX_CLIENTS][NETADDR_MAXSTRSIZE] = {{0}}; for(int i = 0; i < MAX_CLIENTS; i++) if(m_apPlayers[i]) Server()->GetClientAddr(i, aaBuf[i], NETADDR_MAXSTRSIZE); bool aVoteChecked[MAX_CLIENTS] = {0}; for(int i = 0; i < MAX_CLIENTS; i++) { if(!m_apPlayers[i] || m_apPlayers[i]->GetTeam() == TEAM_SPECTATORS || aVoteChecked[i]) // don't count in votes by spectators continue; int ActVote = m_apPlayers[i]->m_Vote; int ActVotePos = m_apPlayers[i]->m_VotePos; // check for more players with the same ip (only use the vote of the one who voted first) for(int j = i+1; j < MAX_CLIENTS; ++j) { if(!m_apPlayers[j] || aVoteChecked[j] || str_comp(aaBuf[j], aaBuf[i])) continue; aVoteChecked[j] = true; if(m_apPlayers[j]->m_Vote && (!ActVote || ActVotePos > m_apPlayers[j]->m_VotePos)) { ActVote = m_apPlayers[j]->m_Vote; ActVotePos = m_apPlayers[j]->m_VotePos; } } Total++; if(ActVote > 0) Yes++; else if(ActVote < 0) No++; } if(Yes >= Total/2+1) m_VoteEnforce = VOTE_ENFORCE_YES; else if(No >= (Total+1)/2) m_VoteEnforce = VOTE_ENFORCE_NO; } if(m_VoteEnforce == VOTE_ENFORCE_YES) { Server()->SetRconCID(IServer::RCON_CID_VOTE); Console()->ExecuteLine(m_aVoteCommand); Server()->SetRconCID(IServer::RCON_CID_SERV); EndVote(); SendChat(-1, CGameContext::CHAT_ALL, "Vote passed"); if(m_apPlayers[m_VoteCreator]) m_apPlayers[m_VoteCreator]->m_LastVoteCall = 0; } else if(m_VoteEnforce == VOTE_ENFORCE_NO || time_get() > m_VoteCloseTime) { EndVote(); SendChat(-1, CGameContext::CHAT_ALL, "Vote failed"); } else if(m_VoteUpdate) { m_VoteUpdate = false; SendVoteStatus(-1, Total, Yes, No); } } } #ifdef CONF_DEBUG if(g_Config.m_DbgDummies) { for(int i = 0; i < g_Config.m_DbgDummies ; i++) { CNetObj_PlayerInput Input = {0}; Input.m_Direction = (i&1)?-1:1; m_apPlayers[MAX_CLIENTS-i-1]->OnPredictedInput(&Input); } } #endif } // Server hooks void CGameContext::OnClientDirectInput(int ClientID, void *pInput) { if(!m_World.m_Paused) m_apPlayers[ClientID]->OnDirectInput((CNetObj_PlayerInput *)pInput); } void CGameContext::OnClientPredictedInput(int ClientID, void *pInput) { if(!m_World.m_Paused) m_apPlayers[ClientID]->OnPredictedInput((CNetObj_PlayerInput *)pInput); } void CGameContext::OnClientEnter(int ClientID) { //world.insert_entity(&players[client_id]); m_apPlayers[ClientID]->Respawn(); char aBuf[512]; str_format(aBuf, sizeof(aBuf), "'%s' entered and joined the %s", Server()->ClientName(ClientID), m_pController->GetTeamName(m_apPlayers[ClientID]->GetTeam())); SendChat(-1, CGameContext::CHAT_ALL, aBuf); str_format(aBuf, sizeof(aBuf), "team_join player='%d:%s' team=%d", ClientID, Server()->ClientName(ClientID), m_apPlayers[ClientID]->GetTeam()); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); m_VoteUpdate = true; } void CGameContext::OnClientConnected(int ClientID) { // Check which team the player should be on const int StartTeam = g_Config.m_SvTournamentMode ? TEAM_SPECTATORS : m_pController->GetAutoTeam(ClientID); m_apPlayers[ClientID] = new(ClientID) CPlayer(this, ClientID, StartTeam); //players[client_id].init(client_id); //players[client_id].client_id = client_id; (void)m_pController->CheckTeamBalance(); #ifdef CONF_DEBUG if(g_Config.m_DbgDummies) { if(ClientID >= MAX_CLIENTS-g_Config.m_DbgDummies) return; } #endif // send active vote if(m_VoteCloseTime) SendVoteSet(ClientID); // send motd CNetMsg_Sv_Motd Msg; Msg.m_pMessage = g_Config.m_SvMotd; Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID); } void CGameContext::OnClientDrop(int ClientID, const char *pReason) { AbortVoteKickOnDisconnect(ClientID); m_apPlayers[ClientID]->OnDisconnect(pReason); delete m_apPlayers[ClientID]; m_apPlayers[ClientID] = 0; (void)m_pController->CheckTeamBalance(); m_VoteUpdate = true; // update spectator modes for(int i = 0; i < MAX_CLIENTS; ++i) { if(m_apPlayers[i] && m_apPlayers[i]->m_SpectatorID == ClientID) m_apPlayers[i]->m_SpectatorID = SPEC_FREEVIEW; } } void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) { void *pRawMsg = m_NetObjHandler.SecureUnpackMsg(MsgID, pUnpacker); CPlayer *pPlayer = m_apPlayers[ClientID]; if(!pRawMsg) { if(g_Config.m_Debug) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "dropped weird message '%s' (%d), failed on '%s'", m_NetObjHandler.GetMsgName(MsgID), MsgID, m_NetObjHandler.FailedMsgOn()); Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "server", aBuf); } return; } if(Server()->ClientIngame(ClientID)) { if(MsgID == NETMSGTYPE_CL_SAY) { if(g_Config.m_SvSpamprotection && pPlayer->m_LastChat && pPlayer->m_LastChat+Server()->TickSpeed() > Server()->Tick()) return; CNetMsg_Cl_Say *pMsg = (CNetMsg_Cl_Say *)pRawMsg; int Team = pMsg->m_Team ? pPlayer->GetTeam() : CGameContext::CHAT_ALL; // trim right and set maximum length to 128 utf8-characters int Length = 0; const char *p = pMsg->m_pMessage; const char *pEnd = 0; while(*p) { const char *pStrOld = p; int Code = str_utf8_decode(&p); // check if unicode is not empty if(Code > 0x20 && Code != 0xA0 && Code != 0x034F && (Code < 0x2000 || Code > 0x200F) && (Code < 0x2028 || Code > 0x202F) && (Code < 0x205F || Code > 0x2064) && (Code < 0x206A || Code > 0x206F) && (Code < 0xFE00 || Code > 0xFE0F) && Code != 0xFEFF && (Code < 0xFFF9 || Code > 0xFFFC)) { pEnd = 0; } else if(pEnd == 0) pEnd = pStrOld; if(++Length >= 127) { *(const_cast(p)) = 0; break; } } if(pEnd != 0) *(const_cast(pEnd)) = 0; // drop empty and autocreated spam messages (more than 16 characters per second) if(Length == 0 || (g_Config.m_SvSpamprotection && pPlayer->m_LastChat && pPlayer->m_LastChat+Server()->TickSpeed()*((15+Length)/16) > Server()->Tick())) return; pPlayer->m_LastChat = Server()->Tick(); SendChat(ClientID, Team, pMsg->m_pMessage); } else if(MsgID == NETMSGTYPE_CL_CALLVOTE) { if(g_Config.m_SvSpamprotection && pPlayer->m_LastVoteTry && pPlayer->m_LastVoteTry+Server()->TickSpeed()*3 > Server()->Tick()) return; int64 Now = Server()->Tick(); pPlayer->m_LastVoteTry = Now; if(pPlayer->GetTeam() == TEAM_SPECTATORS) { SendChatTarget(ClientID, "Spectators aren't allowed to start a vote."); return; } if(m_VoteCloseTime) { SendChatTarget(ClientID, "Wait for current vote to end before calling a new one."); return; } int Timeleft = pPlayer->m_LastVoteCall + Server()->TickSpeed()*60 - Now; if(pPlayer->m_LastVoteCall && Timeleft > 0) { char aChatmsg[512] = {0}; str_format(aChatmsg, sizeof(aChatmsg), "You must wait %d seconds before making another vote", (Timeleft/Server()->TickSpeed())+1); SendChatTarget(ClientID, aChatmsg); return; } char aChatmsg[512] = {0}; char aDesc[VOTE_DESC_LENGTH] = {0}; char aCmd[VOTE_CMD_LENGTH] = {0}; CNetMsg_Cl_CallVote *pMsg = (CNetMsg_Cl_CallVote *)pRawMsg; const char *pReason = pMsg->m_Reason[0] ? pMsg->m_Reason : "No reason given"; if(str_comp_nocase(pMsg->m_Type, "option") == 0) { CVoteOptionServer *pOption = m_pVoteOptionFirst; while(pOption) { if(str_comp_nocase(pMsg->m_Value, pOption->m_aDescription) == 0) { str_format(aChatmsg, sizeof(aChatmsg), "'%s' called vote to change server option '%s' (%s)", Server()->ClientName(ClientID), pOption->m_aDescription, pReason); str_format(aDesc, sizeof(aDesc), "%s", pOption->m_aDescription); str_format(aCmd, sizeof(aCmd), "%s", pOption->m_aCommand); break; } pOption = pOption->m_pNext; } if(!pOption) { str_format(aChatmsg, sizeof(aChatmsg), "'%s' isn't an option on this server", pMsg->m_Value); SendChatTarget(ClientID, aChatmsg); return; } } else if(str_comp_nocase(pMsg->m_Type, "kick") == 0) { if(!g_Config.m_SvVoteKick) { SendChatTarget(ClientID, "Server does not allow voting to kick players"); return; } if(g_Config.m_SvVoteKickMin) { int PlayerNum = 0; for(int i = 0; i < MAX_CLIENTS; ++i) if(m_apPlayers[i] && m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS) ++PlayerNum; if(PlayerNum < g_Config.m_SvVoteKickMin) { str_format(aChatmsg, sizeof(aChatmsg), "Kick voting requires %d players on the server", g_Config.m_SvVoteKickMin); SendChatTarget(ClientID, aChatmsg); return; } } int KickID = str_toint(pMsg->m_Value); if(KickID < 0 || KickID >= MAX_CLIENTS || !m_apPlayers[KickID]) { SendChatTarget(ClientID, "Invalid client id to kick"); return; } if(KickID == ClientID) { SendChatTarget(ClientID, "You can't kick yourself"); return; } if(Server()->IsAuthed(KickID)) { SendChatTarget(ClientID, "You can't kick admins"); char aBufKick[128]; str_format(aBufKick, sizeof(aBufKick), "'%s' called for vote to kick you", Server()->ClientName(ClientID)); SendChatTarget(KickID, aBufKick); return; } str_format(aChatmsg, sizeof(aChatmsg), "'%s' called for vote to kick '%s' (%s)", Server()->ClientName(ClientID), Server()->ClientName(KickID), pReason); str_format(aDesc, sizeof(aDesc), "Kick '%s'", Server()->ClientName(KickID)); if (!g_Config.m_SvVoteKickBantime) str_format(aCmd, sizeof(aCmd), "kick %d Kicked by vote", KickID); else { char aAddrStr[NETADDR_MAXSTRSIZE] = {0}; Server()->GetClientAddr(KickID, aAddrStr, sizeof(aAddrStr)); str_format(aCmd, sizeof(aCmd), "ban %s %d Banned by vote", aAddrStr, g_Config.m_SvVoteKickBantime); } } else if(str_comp_nocase(pMsg->m_Type, "spectate") == 0) { if(!g_Config.m_SvVoteSpectate) { SendChatTarget(ClientID, "Server does not allow voting to move players to spectators"); return; } int SpectateID = str_toint(pMsg->m_Value); if(SpectateID < 0 || SpectateID >= MAX_CLIENTS || !m_apPlayers[SpectateID] || m_apPlayers[SpectateID]->GetTeam() == TEAM_SPECTATORS) { SendChatTarget(ClientID, "Invalid client id to move"); return; } if(SpectateID == ClientID) { SendChatTarget(ClientID, "You can't move yourself"); return; } str_format(aChatmsg, sizeof(aChatmsg), "'%s' called for vote to move '%s' to spectators (%s)", Server()->ClientName(ClientID), Server()->ClientName(SpectateID), pReason); str_format(aDesc, sizeof(aDesc), "move '%s' to spectators", Server()->ClientName(SpectateID)); str_format(aCmd, sizeof(aCmd), "set_team %d -1 %d", SpectateID, g_Config.m_SvVoteSpectateRejoindelay); } if(aCmd[0]) { SendChat(-1, CGameContext::CHAT_ALL, aChatmsg); StartVote(aDesc, aCmd, pReason); pPlayer->m_Vote = 1; pPlayer->m_VotePos = m_VotePos = 1; m_VoteCreator = ClientID; pPlayer->m_LastVoteCall = Now; } } else if(MsgID == NETMSGTYPE_CL_VOTE) { if(!m_VoteCloseTime) return; if(pPlayer->m_Vote == 0) { CNetMsg_Cl_Vote *pMsg = (CNetMsg_Cl_Vote *)pRawMsg; if(!pMsg->m_Vote) return; pPlayer->m_Vote = pMsg->m_Vote; pPlayer->m_VotePos = ++m_VotePos; m_VoteUpdate = true; } } else if (MsgID == NETMSGTYPE_CL_SETTEAM && !m_World.m_Paused) { CNetMsg_Cl_SetTeam *pMsg = (CNetMsg_Cl_SetTeam *)pRawMsg; if(pPlayer->GetTeam() == pMsg->m_Team || (g_Config.m_SvSpamprotection && pPlayer->m_LastSetTeam && pPlayer->m_LastSetTeam+Server()->TickSpeed()*3 > Server()->Tick())) return; if(pMsg->m_Team != TEAM_SPECTATORS && m_LockTeams) { pPlayer->m_LastSetTeam = Server()->Tick(); SendBroadcast("Teams are locked", ClientID); return; } if(pPlayer->m_TeamChangeTick > Server()->Tick()) { pPlayer->m_LastSetTeam = Server()->Tick(); int TimeLeft = (pPlayer->m_TeamChangeTick - Server()->Tick())/Server()->TickSpeed(); char aBuf[128]; str_format(aBuf, sizeof(aBuf), "Time to wait before changing team: %02d:%02d", TimeLeft/60, TimeLeft%60); SendBroadcast(aBuf, ClientID); return; } // Switch team on given client and kill/respawn him if(m_pController->CanJoinTeam(pMsg->m_Team, ClientID)) { if(m_pController->CanChangeTeam(pPlayer, pMsg->m_Team)) { pPlayer->m_LastSetTeam = Server()->Tick(); if(pPlayer->GetTeam() == TEAM_SPECTATORS || pMsg->m_Team == TEAM_SPECTATORS) m_VoteUpdate = true; pPlayer->SetTeam(pMsg->m_Team); (void)m_pController->CheckTeamBalance(); pPlayer->m_TeamChangeTick = Server()->Tick(); } else SendBroadcast("Teams must be balanced, please join other team", ClientID); } else { char aBuf[128]; str_format(aBuf, sizeof(aBuf), "Only %d active players are allowed", Server()->MaxClients()-g_Config.m_SvSpectatorSlots); SendBroadcast(aBuf, ClientID); } } else if (MsgID == NETMSGTYPE_CL_SETSPECTATORMODE && !m_World.m_Paused) { CNetMsg_Cl_SetSpectatorMode *pMsg = (CNetMsg_Cl_SetSpectatorMode *)pRawMsg; if(pPlayer->GetTeam() != TEAM_SPECTATORS || pPlayer->m_SpectatorID == pMsg->m_SpectatorID || ClientID == pMsg->m_SpectatorID || (g_Config.m_SvSpamprotection && pPlayer->m_LastSetSpectatorMode && pPlayer->m_LastSetSpectatorMode+Server()->TickSpeed()*3 > Server()->Tick())) return; pPlayer->m_LastSetSpectatorMode = Server()->Tick(); if(pMsg->m_SpectatorID != SPEC_FREEVIEW && (!m_apPlayers[pMsg->m_SpectatorID] || m_apPlayers[pMsg->m_SpectatorID]->GetTeam() == TEAM_SPECTATORS)) SendChatTarget(ClientID, "Invalid spectator id used"); else pPlayer->m_SpectatorID = pMsg->m_SpectatorID; } else if (MsgID == NETMSGTYPE_CL_CHANGEINFO) { if(g_Config.m_SvSpamprotection && pPlayer->m_LastChangeInfo && pPlayer->m_LastChangeInfo+Server()->TickSpeed()*5 > Server()->Tick()) return; CNetMsg_Cl_ChangeInfo *pMsg = (CNetMsg_Cl_ChangeInfo *)pRawMsg; pPlayer->m_LastChangeInfo = Server()->Tick(); // set infos char aOldName[MAX_NAME_LENGTH]; str_copy(aOldName, Server()->ClientName(ClientID), sizeof(aOldName)); Server()->SetClientName(ClientID, pMsg->m_pName); if(str_comp(aOldName, Server()->ClientName(ClientID)) != 0) { char aChatText[256]; str_format(aChatText, sizeof(aChatText), "'%s' changed name to '%s'", aOldName, Server()->ClientName(ClientID)); SendChat(-1, CGameContext::CHAT_ALL, aChatText); } Server()->SetClientClan(ClientID, pMsg->m_pClan); Server()->SetClientCountry(ClientID, pMsg->m_Country); str_copy(pPlayer->m_TeeInfos.m_SkinName, pMsg->m_pSkin, sizeof(pPlayer->m_TeeInfos.m_SkinName)); pPlayer->m_TeeInfos.m_UseCustomColor = pMsg->m_UseCustomColor; pPlayer->m_TeeInfos.m_ColorBody = pMsg->m_ColorBody; pPlayer->m_TeeInfos.m_ColorFeet = pMsg->m_ColorFeet; m_pController->OnPlayerInfoChange(pPlayer); } else if (MsgID == NETMSGTYPE_CL_EMOTICON && !m_World.m_Paused) { CNetMsg_Cl_Emoticon *pMsg = (CNetMsg_Cl_Emoticon *)pRawMsg; if(g_Config.m_SvSpamprotection && pPlayer->m_LastEmote && pPlayer->m_LastEmote+Server()->TickSpeed()*3 > Server()->Tick()) return; pPlayer->m_LastEmote = Server()->Tick(); SendEmoticon(ClientID, pMsg->m_Emoticon); } else if (MsgID == NETMSGTYPE_CL_KILL && !m_World.m_Paused) { if(pPlayer->m_LastKill && pPlayer->m_LastKill+Server()->TickSpeed()*3 > Server()->Tick()) return; pPlayer->m_LastKill = Server()->Tick(); pPlayer->KillCharacter(WEAPON_SELF); } } else { if(MsgID == NETMSGTYPE_CL_STARTINFO) { if(pPlayer->m_IsReady) return; CNetMsg_Cl_StartInfo *pMsg = (CNetMsg_Cl_StartInfo *)pRawMsg; pPlayer->m_LastChangeInfo = Server()->Tick(); // set start infos Server()->SetClientName(ClientID, pMsg->m_pName); Server()->SetClientClan(ClientID, pMsg->m_pClan); Server()->SetClientCountry(ClientID, pMsg->m_Country); str_copy(pPlayer->m_TeeInfos.m_SkinName, pMsg->m_pSkin, sizeof(pPlayer->m_TeeInfos.m_SkinName)); pPlayer->m_TeeInfos.m_UseCustomColor = pMsg->m_UseCustomColor; pPlayer->m_TeeInfos.m_ColorBody = pMsg->m_ColorBody; pPlayer->m_TeeInfos.m_ColorFeet = pMsg->m_ColorFeet; m_pController->OnPlayerInfoChange(pPlayer); // send vote options CNetMsg_Sv_VoteClearOptions ClearMsg; Server()->SendPackMsg(&ClearMsg, MSGFLAG_VITAL, ClientID); CNetMsg_Sv_VoteOptionListAdd OptionMsg; int NumOptions = 0; OptionMsg.m_pDescription0 = ""; OptionMsg.m_pDescription1 = ""; OptionMsg.m_pDescription2 = ""; OptionMsg.m_pDescription3 = ""; OptionMsg.m_pDescription4 = ""; OptionMsg.m_pDescription5 = ""; OptionMsg.m_pDescription6 = ""; OptionMsg.m_pDescription7 = ""; OptionMsg.m_pDescription8 = ""; OptionMsg.m_pDescription9 = ""; OptionMsg.m_pDescription10 = ""; OptionMsg.m_pDescription11 = ""; OptionMsg.m_pDescription12 = ""; OptionMsg.m_pDescription13 = ""; OptionMsg.m_pDescription14 = ""; CVoteOptionServer *pCurrent = m_pVoteOptionFirst; while(pCurrent) { switch(NumOptions++) { case 0: OptionMsg.m_pDescription0 = pCurrent->m_aDescription; break; case 1: OptionMsg.m_pDescription1 = pCurrent->m_aDescription; break; case 2: OptionMsg.m_pDescription2 = pCurrent->m_aDescription; break; case 3: OptionMsg.m_pDescription3 = pCurrent->m_aDescription; break; case 4: OptionMsg.m_pDescription4 = pCurrent->m_aDescription; break; case 5: OptionMsg.m_pDescription5 = pCurrent->m_aDescription; break; case 6: OptionMsg.m_pDescription6 = pCurrent->m_aDescription; break; case 7: OptionMsg.m_pDescription7 = pCurrent->m_aDescription; break; case 8: OptionMsg.m_pDescription8 = pCurrent->m_aDescription; break; case 9: OptionMsg.m_pDescription9 = pCurrent->m_aDescription; break; case 10: OptionMsg.m_pDescription10 = pCurrent->m_aDescription; break; case 11: OptionMsg.m_pDescription11 = pCurrent->m_aDescription; break; case 12: OptionMsg.m_pDescription12 = pCurrent->m_aDescription; break; case 13: OptionMsg.m_pDescription13 = pCurrent->m_aDescription; break; case 14: { OptionMsg.m_pDescription14 = pCurrent->m_aDescription; OptionMsg.m_NumOptions = NumOptions; Server()->SendPackMsg(&OptionMsg, MSGFLAG_VITAL, ClientID); OptionMsg = CNetMsg_Sv_VoteOptionListAdd(); NumOptions = 0; OptionMsg.m_pDescription1 = ""; OptionMsg.m_pDescription2 = ""; OptionMsg.m_pDescription3 = ""; OptionMsg.m_pDescription4 = ""; OptionMsg.m_pDescription5 = ""; OptionMsg.m_pDescription6 = ""; OptionMsg.m_pDescription7 = ""; OptionMsg.m_pDescription8 = ""; OptionMsg.m_pDescription9 = ""; OptionMsg.m_pDescription10 = ""; OptionMsg.m_pDescription11 = ""; OptionMsg.m_pDescription12 = ""; OptionMsg.m_pDescription13 = ""; OptionMsg.m_pDescription14 = ""; } } pCurrent = pCurrent->m_pNext; } if(NumOptions > 0) { OptionMsg.m_NumOptions = NumOptions; Server()->SendPackMsg(&OptionMsg, MSGFLAG_VITAL, ClientID); } // send tuning parameters to client SendTuningParams(ClientID); // client is ready to enter pPlayer->m_IsReady = true; CNetMsg_Sv_ReadyToEnter m; Server()->SendPackMsg(&m, MSGFLAG_VITAL|MSGFLAG_FLUSH, ClientID); } } } void CGameContext::ConTuneParam(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; const char *pParamName = pResult->GetString(0); float NewValue = pResult->GetFloat(1); if(pSelf->Tuning()->Set(pParamName, NewValue)) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "%s changed to %.2f", pParamName, NewValue); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "tuning", aBuf); pSelf->SendTuningParams(-1); } else pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "tuning", "No such tuning parameter"); } void CGameContext::ConTuneReset(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; CTuningParams TuningParams; *pSelf->Tuning() = TuningParams; pSelf->SendTuningParams(-1); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "tuning", "Tuning reset"); } void CGameContext::ConTuneDump(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; char aBuf[256]; for(int i = 0; i < pSelf->Tuning()->Num(); i++) { float v; pSelf->Tuning()->Get(i, &v); str_format(aBuf, sizeof(aBuf), "%s %.2f", pSelf->Tuning()->m_apNames[i], v); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "tuning", aBuf); } } void CGameContext::ConPause(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(pSelf->m_pController->IsGameOver()) return; pSelf->m_World.m_Paused ^= 1; } void CGameContext::ConChangeMap(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->m_pController->ChangeMap(pResult->NumArguments() ? pResult->GetString(0) : ""); } void CGameContext::ConRestart(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(pResult->NumArguments()) pSelf->m_pController->DoWarmup(pResult->GetInteger(0)); else pSelf->m_pController->StartRound(); } void CGameContext::ConBroadcast(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->SendBroadcast(pResult->GetString(0), -1); } void CGameContext::ConSay(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->SendChat(-1, CGameContext::CHAT_ALL, pResult->GetString(0)); } void CGameContext::ConSetTeam(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; int ClientID = clamp(pResult->GetInteger(0), 0, (int)MAX_CLIENTS-1); int Team = clamp(pResult->GetInteger(1), -1, 1); int Delay = pResult->NumArguments()>2 ? pResult->GetInteger(2) : 0; if(!pSelf->m_apPlayers[ClientID]) return; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "moved client %d to team %d", ClientID, Team); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); pSelf->m_apPlayers[ClientID]->m_TeamChangeTick = pSelf->Server()->Tick()+pSelf->Server()->TickSpeed()*Delay*60; pSelf->m_apPlayers[ClientID]->SetTeam(Team); (void)pSelf->m_pController->CheckTeamBalance(); } void CGameContext::ConSetTeamAll(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; int Team = clamp(pResult->GetInteger(0), -1, 1); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "All players were moved to the %s", pSelf->m_pController->GetTeamName(Team)); pSelf->SendChat(-1, CGameContext::CHAT_ALL, aBuf); for(int i = 0; i < MAX_CLIENTS; ++i) if(pSelf->m_apPlayers[i]) pSelf->m_apPlayers[i]->SetTeam(Team, false); (void)pSelf->m_pController->CheckTeamBalance(); } void CGameContext::ConSwapTeams(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->SwapTeams(); } void CGameContext::ConShuffleTeams(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!pSelf->m_pController->IsTeamplay()) return; int CounterRed = 0; int CounterBlue = 0; int PlayerTeam = 0; for(int i = 0; i < MAX_CLIENTS; ++i) if(pSelf->m_apPlayers[i] && pSelf->m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS) ++PlayerTeam; PlayerTeam = (PlayerTeam+1)/2; pSelf->SendChat(-1, CGameContext::CHAT_ALL, "Teams were shuffled"); for(int i = 0; i < MAX_CLIENTS; ++i) { if(pSelf->m_apPlayers[i] && pSelf->m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS) { if(CounterRed == PlayerTeam) pSelf->m_apPlayers[i]->SetTeam(TEAM_BLUE, false); else if(CounterBlue == PlayerTeam) pSelf->m_apPlayers[i]->SetTeam(TEAM_RED, false); else { if(rand() % 2) { pSelf->m_apPlayers[i]->SetTeam(TEAM_BLUE, false); ++CounterBlue; } else { pSelf->m_apPlayers[i]->SetTeam(TEAM_RED, false); ++CounterRed; } } } } (void)pSelf->m_pController->CheckTeamBalance(); } void CGameContext::ConLockTeams(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->m_LockTeams ^= 1; if(pSelf->m_LockTeams) pSelf->SendChat(-1, CGameContext::CHAT_ALL, "Teams were locked"); else pSelf->SendChat(-1, CGameContext::CHAT_ALL, "Teams were unlocked"); } void CGameContext::ConAddVote(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; const char *pDescription = pResult->GetString(0); const char *pCommand = pResult->GetString(1); if(pSelf->m_NumVoteOptions == MAX_VOTE_OPTIONS) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "maximum number of vote options reached"); return; } // check for valid option if(!pSelf->Console()->LineIsValid(pCommand) || str_length(pCommand) >= VOTE_CMD_LENGTH) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "skipped invalid command '%s'", pCommand); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); return; } while(*pDescription && *pDescription == ' ') pDescription++; if(str_length(pDescription) >= VOTE_DESC_LENGTH || *pDescription == 0) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "skipped invalid option '%s'", pDescription); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); return; } // check for duplicate entry CVoteOptionServer *pOption = pSelf->m_pVoteOptionFirst; while(pOption) { if(str_comp_nocase(pDescription, pOption->m_aDescription) == 0) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "option '%s' already exists", pDescription); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); return; } pOption = pOption->m_pNext; } // add the option ++pSelf->m_NumVoteOptions; int Len = str_length(pCommand); pOption = (CVoteOptionServer *)pSelf->m_pVoteOptionHeap->Allocate(sizeof(CVoteOptionServer) + Len); pOption->m_pNext = 0; pOption->m_pPrev = pSelf->m_pVoteOptionLast; if(pOption->m_pPrev) pOption->m_pPrev->m_pNext = pOption; pSelf->m_pVoteOptionLast = pOption; if(!pSelf->m_pVoteOptionFirst) pSelf->m_pVoteOptionFirst = pOption; str_copy(pOption->m_aDescription, pDescription, sizeof(pOption->m_aDescription)); mem_copy(pOption->m_aCommand, pCommand, Len+1); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "added option '%s' '%s'", pOption->m_aDescription, pOption->m_aCommand); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); // inform clients about added option CNetMsg_Sv_VoteOptionAdd OptionMsg; OptionMsg.m_pDescription = pOption->m_aDescription; pSelf->Server()->SendPackMsg(&OptionMsg, MSGFLAG_VITAL, -1); } void CGameContext::ConRemoveVote(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; const char *pDescription = pResult->GetString(0); // check for valid option CVoteOptionServer *pOption = pSelf->m_pVoteOptionFirst; while(pOption) { if(str_comp_nocase(pDescription, pOption->m_aDescription) == 0) break; pOption = pOption->m_pNext; } if(!pOption) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "option '%s' does not exist", pDescription); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); return; } // inform clients about removed option CNetMsg_Sv_VoteOptionRemove OptionMsg; OptionMsg.m_pDescription = pOption->m_aDescription; pSelf->Server()->SendPackMsg(&OptionMsg, MSGFLAG_VITAL, -1); // TODO: improve this // remove the option --pSelf->m_NumVoteOptions; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "removed option '%s' '%s'", pOption->m_aDescription, pOption->m_aCommand); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); CHeap *pVoteOptionHeap = new CHeap(); CVoteOptionServer *pVoteOptionFirst = 0; CVoteOptionServer *pVoteOptionLast = 0; int NumVoteOptions = pSelf->m_NumVoteOptions; for(CVoteOptionServer *pSrc = pSelf->m_pVoteOptionFirst; pSrc; pSrc = pSrc->m_pNext) { if(pSrc == pOption) continue; // copy option int Len = str_length(pSrc->m_aCommand); CVoteOptionServer *pDst = (CVoteOptionServer *)pVoteOptionHeap->Allocate(sizeof(CVoteOptionServer) + Len); pDst->m_pNext = 0; pDst->m_pPrev = pVoteOptionLast; if(pDst->m_pPrev) pDst->m_pPrev->m_pNext = pDst; pVoteOptionLast = pDst; if(!pVoteOptionFirst) pVoteOptionFirst = pDst; str_copy(pDst->m_aDescription, pSrc->m_aDescription, sizeof(pDst->m_aDescription)); mem_copy(pDst->m_aCommand, pSrc->m_aCommand, Len+1); } // clean up delete pSelf->m_pVoteOptionHeap; pSelf->m_pVoteOptionHeap = pVoteOptionHeap; pSelf->m_pVoteOptionFirst = pVoteOptionFirst; pSelf->m_pVoteOptionLast = pVoteOptionLast; pSelf->m_NumVoteOptions = NumVoteOptions; } void CGameContext::ConForceVote(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; const char *pType = pResult->GetString(0); const char *pValue = pResult->GetString(1); const char *pReason = pResult->NumArguments() > 2 && pResult->GetString(2)[0] ? pResult->GetString(2) : "No reason given"; char aBuf[128] = {0}; if(str_comp_nocase(pType, "option") == 0) { CVoteOptionServer *pOption = pSelf->m_pVoteOptionFirst; while(pOption) { if(str_comp_nocase(pValue, pOption->m_aDescription) == 0) { str_format(aBuf, sizeof(aBuf), "admin forced server option '%s' (%s)", pValue, pReason); pSelf->SendChatTarget(-1, aBuf); pSelf->Console()->ExecuteLine(pOption->m_aCommand); break; } pOption = pOption->m_pNext; } if(!pOption) { str_format(aBuf, sizeof(aBuf), "'%s' isn't an option on this server", pValue); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); return; } } else if(str_comp_nocase(pType, "kick") == 0) { int KickID = str_toint(pValue); if(KickID < 0 || KickID >= MAX_CLIENTS || !pSelf->m_apPlayers[KickID]) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "Invalid client id to kick"); return; } if (!g_Config.m_SvVoteKickBantime) { str_format(aBuf, sizeof(aBuf), "kick %d %s", KickID, pReason); pSelf->Console()->ExecuteLine(aBuf); } else { char aAddrStr[NETADDR_MAXSTRSIZE] = {0}; pSelf->Server()->GetClientAddr(KickID, aAddrStr, sizeof(aAddrStr)); str_format(aBuf, sizeof(aBuf), "ban %s %d %s", aAddrStr, g_Config.m_SvVoteKickBantime, pReason); pSelf->Console()->ExecuteLine(aBuf); } } else if(str_comp_nocase(pType, "spectate") == 0) { int SpectateID = str_toint(pValue); if(SpectateID < 0 || SpectateID >= MAX_CLIENTS || !pSelf->m_apPlayers[SpectateID] || pSelf->m_apPlayers[SpectateID]->GetTeam() == TEAM_SPECTATORS) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "Invalid client id to move"); return; } str_format(aBuf, sizeof(aBuf), "admin moved '%s' to spectator (%s)", pSelf->Server()->ClientName(SpectateID), pReason); pSelf->SendChatTarget(-1, aBuf); str_format(aBuf, sizeof(aBuf), "set_team %d -1 %d", SpectateID, g_Config.m_SvVoteSpectateRejoindelay); pSelf->Console()->ExecuteLine(aBuf); } } void CGameContext::ConClearVotes(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", "cleared votes"); CNetMsg_Sv_VoteClearOptions VoteClearOptionsMsg; pSelf->Server()->SendPackMsg(&VoteClearOptionsMsg, MSGFLAG_VITAL, -1); pSelf->m_pVoteOptionHeap->Reset(); pSelf->m_pVoteOptionFirst = 0; pSelf->m_pVoteOptionLast = 0; pSelf->m_NumVoteOptions = 0; } void CGameContext::ConVote(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; // check if there is a vote running if(!pSelf->m_VoteCloseTime) return; if(str_comp_nocase(pResult->GetString(0), "yes") == 0) pSelf->m_VoteEnforce = CGameContext::VOTE_ENFORCE_YES; else if(str_comp_nocase(pResult->GetString(0), "no") == 0) pSelf->m_VoteEnforce = CGameContext::VOTE_ENFORCE_NO; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "admin forced vote %s", pResult->GetString(0)); pSelf->SendChatTarget(-1, aBuf); str_format(aBuf, sizeof(aBuf), "forcing vote %s", pResult->GetString(0)); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf); } void CGameContext::ConchainSpecialMotdupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData) { pfnCallback(pResult, pCallbackUserData); if(pResult->NumArguments()) { CNetMsg_Sv_Motd Msg; Msg.m_pMessage = g_Config.m_SvMotd; CGameContext *pSelf = (CGameContext *)pUserData; for(int i = 0; i < MAX_CLIENTS; ++i) if(pSelf->m_apPlayers[i]) pSelf->Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, i); } } void CGameContext::OnConsoleInit() { m_pServer = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); Console()->Register("tune", "si", CFGFLAG_SERVER, ConTuneParam, this, "Tune variable to value"); Console()->Register("tune_reset", "", CFGFLAG_SERVER, ConTuneReset, this, "Reset tuning"); Console()->Register("tune_dump", "", CFGFLAG_SERVER, ConTuneDump, this, "Dump tuning"); Console()->Register("pause", "", CFGFLAG_SERVER, ConPause, this, "Pause/unpause game"); Console()->Register("change_map", "?r", CFGFLAG_SERVER|CFGFLAG_STORE, ConChangeMap, this, "Change map"); Console()->Register("restart", "?i", CFGFLAG_SERVER|CFGFLAG_STORE, ConRestart, this, "Restart in x seconds (0 = abort)"); Console()->Register("broadcast", "r", CFGFLAG_SERVER, ConBroadcast, this, "Broadcast message"); Console()->Register("say", "r", CFGFLAG_SERVER, ConSay, this, "Say in chat"); Console()->Register("set_team", "ii?i", CFGFLAG_SERVER, ConSetTeam, this, "Set team of player to team"); Console()->Register("set_team_all", "i", CFGFLAG_SERVER, ConSetTeamAll, this, "Set team of all players to team"); Console()->Register("swap_teams", "", CFGFLAG_SERVER, ConSwapTeams, this, "Swap the current teams"); Console()->Register("shuffle_teams", "", CFGFLAG_SERVER, ConShuffleTeams, this, "Shuffle the current teams"); Console()->Register("lock_teams", "", CFGFLAG_SERVER, ConLockTeams, this, "Lock/unlock teams"); Console()->Register("add_vote", "sr", CFGFLAG_SERVER, ConAddVote, this, "Add a voting option"); Console()->Register("remove_vote", "s", CFGFLAG_SERVER, ConRemoveVote, this, "remove a voting option"); Console()->Register("force_vote", "ss?r", CFGFLAG_SERVER, ConForceVote, this, "Force a voting option"); Console()->Register("clear_votes", "", CFGFLAG_SERVER, ConClearVotes, this, "Clears the voting options"); Console()->Register("vote", "r", CFGFLAG_SERVER, ConVote, this, "Force a vote to yes/no"); Console()->Chain("sv_motd", ConchainSpecialMotdupdate, this); } void CGameContext::OnInit(/*class IKernel *pKernel*/) { m_pServer = Kernel()->RequestInterface(); m_pConsole = Kernel()->RequestInterface(); m_World.SetGameServer(this); m_Events.SetGameServer(this); //if(!data) // only load once //data = load_data_from_memory(internal_data); for(int i = 0; i < NUM_NETOBJTYPES; i++) Server()->SnapSetStaticsize(i, m_NetObjHandler.GetObjSize(i)); m_Layers.Init(Kernel()); m_Collision.Init(&m_Layers); // reset everything here //world = new GAMEWORLD; //players = new CPlayer[MAX_CLIENTS]; // select gametype if(str_comp(g_Config.m_SvGametype, "mod") == 0) m_pController = new CGameControllerMOD(this); else if(str_comp(g_Config.m_SvGametype, "ctf") == 0) m_pController = new CGameControllerCTF(this); else if(str_comp(g_Config.m_SvGametype, "tdm") == 0) m_pController = new CGameControllerTDM(this); else m_pController = new CGameControllerDM(this); // setup core world //for(int i = 0; i < MAX_CLIENTS; i++) // game.players[i].core.world = &game.world.core; // create all entities from the game layer CMapItemLayerTilemap *pTileMap = m_Layers.GameLayer(); CTile *pTiles = (CTile *)Kernel()->RequestInterface()->GetData(pTileMap->m_Data); /* num_spawn_points[0] = 0; num_spawn_points[1] = 0; num_spawn_points[2] = 0; */ for(int y = 0; y < pTileMap->m_Height; y++) { for(int x = 0; x < pTileMap->m_Width; x++) { int Index = pTiles[y*pTileMap->m_Width+x].m_Index; if(Index >= ENTITY_OFFSET) { vec2 Pos(x*32.0f+16.0f, y*32.0f+16.0f); m_pController->OnEntity(Index-ENTITY_OFFSET, Pos); } } } //game.world.insert_entity(game.Controller); #ifdef CONF_DEBUG if(g_Config.m_DbgDummies) { for(int i = 0; i < g_Config.m_DbgDummies ; i++) { OnClientConnected(MAX_CLIENTS-i-1); } } #endif } void CGameContext::OnShutdown() { delete m_pController; m_pController = 0; Clear(); } void CGameContext::OnSnap(int ClientID) { // add tuning to demo CTuningParams StandardTuning; if(ClientID == -1 && Server()->DemoRecorder_IsRecording() && mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) != 0) { CMsgPacker Msg(NETMSGTYPE_SV_TUNEPARAMS); int *pParams = (int *)&m_Tuning; for(unsigned i = 0; i < sizeof(m_Tuning)/sizeof(int); i++) Msg.AddInt(pParams[i]); Server()->SendMsg(&Msg, MSGFLAG_RECORD|MSGFLAG_NOSEND, ClientID); } m_World.Snap(ClientID); m_pController->Snap(ClientID); m_Events.Snap(ClientID); for(int i = 0; i < MAX_CLIENTS; i++) { if(m_apPlayers[i]) m_apPlayers[i]->Snap(ClientID); } } void CGameContext::OnPreSnap() {} void CGameContext::OnPostSnap() { m_Events.Clear(); } bool CGameContext::IsClientReady(int ClientID) { return m_apPlayers[ClientID] && m_apPlayers[ClientID]->m_IsReady ? true : false; } bool CGameContext::IsClientPlayer(int ClientID) { return m_apPlayers[ClientID] && m_apPlayers[ClientID]->GetTeam() == TEAM_SPECTATORS ? false : true; } const char *CGameContext::GameType() { return m_pController && m_pController->m_pGameType ? m_pController->m_pGameType : ""; } const char *CGameContext::Version() { return GAME_VERSION; } const char *CGameContext::NetVersion() { return GAME_NETVERSION; } IGameServer *CreateGameServer() { return new CGameContext; } teeworlds-0.6.2+dfsg/src/game/server/gamecontext.h0000644000175000017500000001325412140200333021134 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_GAMECONTEXT_H #define GAME_SERVER_GAMECONTEXT_H #include #include #include #include #include #include "eventhandler.h" #include "gamecontroller.h" #include "gameworld.h" #include "player.h" /* Tick Game Context (CGameContext::tick) Game World (GAMEWORLD::tick) Reset world if requested (GAMEWORLD::reset) All entities in the world (ENTITY::tick) All entities in the world (ENTITY::tick_defered) Remove entities marked for deletion (GAMEWORLD::remove_entities) Game Controller (GAMECONTROLLER::tick) All players (CPlayer::tick) Snap Game Context (CGameContext::snap) Game World (GAMEWORLD::snap) All entities in the world (ENTITY::snap) Game Controller (GAMECONTROLLER::snap) Events handler (EVENT_HANDLER::snap) All players (CPlayer::snap) */ class CGameContext : public IGameServer { IServer *m_pServer; class IConsole *m_pConsole; CLayers m_Layers; CCollision m_Collision; CNetObjHandler m_NetObjHandler; CTuningParams m_Tuning; static void ConTuneParam(IConsole::IResult *pResult, void *pUserData); static void ConTuneReset(IConsole::IResult *pResult, void *pUserData); static void ConTuneDump(IConsole::IResult *pResult, void *pUserData); static void ConPause(IConsole::IResult *pResult, void *pUserData); static void ConChangeMap(IConsole::IResult *pResult, void *pUserData); static void ConRestart(IConsole::IResult *pResult, void *pUserData); static void ConBroadcast(IConsole::IResult *pResult, void *pUserData); static void ConSay(IConsole::IResult *pResult, void *pUserData); static void ConSetTeam(IConsole::IResult *pResult, void *pUserData); static void ConSetTeamAll(IConsole::IResult *pResult, void *pUserData); static void ConSwapTeams(IConsole::IResult *pResult, void *pUserData); static void ConShuffleTeams(IConsole::IResult *pResult, void *pUserData); static void ConLockTeams(IConsole::IResult *pResult, void *pUserData); static void ConAddVote(IConsole::IResult *pResult, void *pUserData); static void ConRemoveVote(IConsole::IResult *pResult, void *pUserData); static void ConForceVote(IConsole::IResult *pResult, void *pUserData); static void ConClearVotes(IConsole::IResult *pResult, void *pUserData); static void ConVote(IConsole::IResult *pResult, void *pUserData); static void ConchainSpecialMotdupdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData); CGameContext(int Resetting); void Construct(int Resetting); bool m_Resetting; public: IServer *Server() const { return m_pServer; } class IConsole *Console() { return m_pConsole; } CCollision *Collision() { return &m_Collision; } CTuningParams *Tuning() { return &m_Tuning; } CGameContext(); ~CGameContext(); void Clear(); CEventHandler m_Events; CPlayer *m_apPlayers[MAX_CLIENTS]; IGameController *m_pController; CGameWorld m_World; // helper functions class CCharacter *GetPlayerChar(int ClientID); int m_LockTeams; // voting void StartVote(const char *pDesc, const char *pCommand, const char *pReason); void EndVote(); void SendVoteSet(int ClientID); void SendVoteStatus(int ClientID, int Total, int Yes, int No); void AbortVoteKickOnDisconnect(int ClientID); int m_VoteCreator; int64 m_VoteCloseTime; bool m_VoteUpdate; int m_VotePos; char m_aVoteDescription[VOTE_DESC_LENGTH]; char m_aVoteCommand[VOTE_CMD_LENGTH]; char m_aVoteReason[VOTE_REASON_LENGTH]; int m_NumVoteOptions; int m_VoteEnforce; enum { VOTE_ENFORCE_UNKNOWN=0, VOTE_ENFORCE_NO, VOTE_ENFORCE_YES, }; CHeap *m_pVoteOptionHeap; CVoteOptionServer *m_pVoteOptionFirst; CVoteOptionServer *m_pVoteOptionLast; // helper functions void CreateDamageInd(vec2 Pos, float AngleMod, int Amount); void CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage); void CreateHammerHit(vec2 Pos); void CreatePlayerSpawn(vec2 Pos); void CreateDeath(vec2 Pos, int Who); void CreateSound(vec2 Pos, int Sound, int Mask=-1); void CreateSoundGlobal(int Sound, int Target=-1); enum { CHAT_ALL=-2, CHAT_SPEC=-1, CHAT_RED=0, CHAT_BLUE=1 }; // network void SendChatTarget(int To, const char *pText); void SendChat(int ClientID, int Team, const char *pText); void SendEmoticon(int ClientID, int Emoticon); void SendWeaponPickup(int ClientID, int Weapon); void SendBroadcast(const char *pText, int ClientID); // void CheckPureTuning(); void SendTuningParams(int ClientID); // void SwapTeams(); // engine events virtual void OnInit(); virtual void OnConsoleInit(); virtual void OnShutdown(); virtual void OnTick(); virtual void OnPreSnap(); virtual void OnSnap(int ClientID); virtual void OnPostSnap(); virtual void OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID); virtual void OnClientConnected(int ClientID); virtual void OnClientEnter(int ClientID); virtual void OnClientDrop(int ClientID, const char *pReason); virtual void OnClientDirectInput(int ClientID, void *pInput); virtual void OnClientPredictedInput(int ClientID, void *pInput); virtual bool IsClientReady(int ClientID); virtual bool IsClientPlayer(int ClientID); virtual const char *GameType(); virtual const char *Version(); virtual const char *NetVersion(); }; inline int CmaskAll() { return -1; } inline int CmaskOne(int ClientID) { return 1< #include #include #include "entities/pickup.h" #include "gamecontroller.h" #include "gamecontext.h" IGameController::IGameController(class CGameContext *pGameServer) { m_pGameServer = pGameServer; m_pServer = m_pGameServer->Server(); m_pGameType = "unknown"; // DoWarmup(g_Config.m_SvWarmup); m_GameOverTick = -1; m_SuddenDeath = 0; m_RoundStartTick = Server()->Tick(); m_RoundCount = 0; m_GameFlags = 0; m_aTeamscore[TEAM_RED] = 0; m_aTeamscore[TEAM_BLUE] = 0; m_aMapWish[0] = 0; m_UnbalancedTick = -1; m_ForceBalanced = false; m_aNumSpawnPoints[0] = 0; m_aNumSpawnPoints[1] = 0; m_aNumSpawnPoints[2] = 0; } IGameController::~IGameController() { } float IGameController::EvaluateSpawnPos(CSpawnEval *pEval, vec2 Pos) { float Score = 0.0f; CCharacter *pC = static_cast(GameServer()->m_World.FindFirst(CGameWorld::ENTTYPE_CHARACTER)); for(; pC; pC = (CCharacter *)pC->TypeNext()) { // team mates are not as dangerous as enemies float Scoremod = 1.0f; if(pEval->m_FriendlyTeam != -1 && pC->GetPlayer()->GetTeam() == pEval->m_FriendlyTeam) Scoremod = 0.5f; float d = distance(Pos, pC->m_Pos); Score += Scoremod * (d == 0 ? 1000000000.0f : 1.0f/d); } return Score; } void IGameController::EvaluateSpawnType(CSpawnEval *pEval, int Type) { // get spawn point for(int i = 0; i < m_aNumSpawnPoints[Type]; i++) { // check if the position is occupado CCharacter *aEnts[MAX_CLIENTS]; int Num = GameServer()->m_World.FindEntities(m_aaSpawnPoints[Type][i], 64, (CEntity**)aEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); vec2 Positions[5] = { vec2(0.0f, 0.0f), vec2(-32.0f, 0.0f), vec2(0.0f, -32.0f), vec2(32.0f, 0.0f), vec2(0.0f, 32.0f) }; // start, left, up, right, down int Result = -1; for(int Index = 0; Index < 5 && Result == -1; ++Index) { Result = Index; for(int c = 0; c < Num; ++c) if(GameServer()->Collision()->CheckPoint(m_aaSpawnPoints[Type][i]+Positions[Index]) || distance(aEnts[c]->m_Pos, m_aaSpawnPoints[Type][i]+Positions[Index]) <= aEnts[c]->m_ProximityRadius) { Result = -1; break; } } if(Result == -1) continue; // try next spawn point vec2 P = m_aaSpawnPoints[Type][i]+Positions[Result]; float S = EvaluateSpawnPos(pEval, P); if(!pEval->m_Got || pEval->m_Score > S) { pEval->m_Got = true; pEval->m_Score = S; pEval->m_Pos = P; } } } bool IGameController::CanSpawn(int Team, vec2 *pOutPos) { CSpawnEval Eval; // spectators can't spawn if(Team == TEAM_SPECTATORS) return false; if(IsTeamplay()) { Eval.m_FriendlyTeam = Team; // first try own team spawn, then normal spawn and then enemy EvaluateSpawnType(&Eval, 1+(Team&1)); if(!Eval.m_Got) { EvaluateSpawnType(&Eval, 0); if(!Eval.m_Got) EvaluateSpawnType(&Eval, 1+((Team+1)&1)); } } else { EvaluateSpawnType(&Eval, 0); EvaluateSpawnType(&Eval, 1); EvaluateSpawnType(&Eval, 2); } *pOutPos = Eval.m_Pos; return Eval.m_Got; } bool IGameController::OnEntity(int Index, vec2 Pos) { int Type = -1; int SubType = 0; if(Index == ENTITY_SPAWN) m_aaSpawnPoints[0][m_aNumSpawnPoints[0]++] = Pos; else if(Index == ENTITY_SPAWN_RED) m_aaSpawnPoints[1][m_aNumSpawnPoints[1]++] = Pos; else if(Index == ENTITY_SPAWN_BLUE) m_aaSpawnPoints[2][m_aNumSpawnPoints[2]++] = Pos; else if(Index == ENTITY_ARMOR_1) Type = POWERUP_ARMOR; else if(Index == ENTITY_HEALTH_1) Type = POWERUP_HEALTH; else if(Index == ENTITY_WEAPON_SHOTGUN) { Type = POWERUP_WEAPON; SubType = WEAPON_SHOTGUN; } else if(Index == ENTITY_WEAPON_GRENADE) { Type = POWERUP_WEAPON; SubType = WEAPON_GRENADE; } else if(Index == ENTITY_WEAPON_RIFLE) { Type = POWERUP_WEAPON; SubType = WEAPON_RIFLE; } else if(Index == ENTITY_POWERUP_NINJA && g_Config.m_SvPowerups) { Type = POWERUP_NINJA; SubType = WEAPON_NINJA; } if(Type != -1) { CPickup *pPickup = new CPickup(&GameServer()->m_World, Type, SubType); pPickup->m_Pos = Pos; return true; } return false; } void IGameController::EndRound() { if(m_Warmup) // game can't end when we are running warmup return; GameServer()->m_World.m_Paused = true; m_GameOverTick = Server()->Tick(); m_SuddenDeath = 0; } void IGameController::ResetGame() { GameServer()->m_World.m_ResetRequested = true; } const char *IGameController::GetTeamName(int Team) { if(IsTeamplay()) { if(Team == TEAM_RED) return "red team"; else if(Team == TEAM_BLUE) return "blue team"; } else { if(Team == 0) return "game"; } return "spectators"; } static bool IsSeparator(char c) { return c == ';' || c == ' ' || c == ',' || c == '\t'; } void IGameController::StartRound() { ResetGame(); m_RoundStartTick = Server()->Tick(); m_SuddenDeath = 0; m_GameOverTick = -1; GameServer()->m_World.m_Paused = false; m_aTeamscore[TEAM_RED] = 0; m_aTeamscore[TEAM_BLUE] = 0; m_ForceBalanced = false; Server()->DemoRecorder_HandleAutoStart(); char aBuf[256]; str_format(aBuf, sizeof(aBuf), "start round type='%s' teamplay='%d'", m_pGameType, m_GameFlags&GAMEFLAG_TEAMS); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); } void IGameController::ChangeMap(const char *pToMap) { str_copy(m_aMapWish, pToMap, sizeof(m_aMapWish)); EndRound(); } void IGameController::CycleMap() { if(m_aMapWish[0] != 0) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "rotating map to %s", m_aMapWish); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); str_copy(g_Config.m_SvMap, m_aMapWish, sizeof(g_Config.m_SvMap)); m_aMapWish[0] = 0; m_RoundCount = 0; return; } if(!str_length(g_Config.m_SvMaprotation)) return; if(m_RoundCount < g_Config.m_SvRoundsPerMap-1) { if(g_Config.m_SvRoundSwap) GameServer()->SwapTeams(); return; } // handle maprotation const char *pMapRotation = g_Config.m_SvMaprotation; const char *pCurrentMap = g_Config.m_SvMap; int CurrentMapLen = str_length(pCurrentMap); const char *pNextMap = pMapRotation; while(*pNextMap) { int WordLen = 0; while(pNextMap[WordLen] && !IsSeparator(pNextMap[WordLen])) WordLen++; if(WordLen == CurrentMapLen && str_comp_num(pNextMap, pCurrentMap, CurrentMapLen) == 0) { // map found pNextMap += CurrentMapLen; while(*pNextMap && IsSeparator(*pNextMap)) pNextMap++; break; } pNextMap++; } // restart rotation if(pNextMap[0] == 0) pNextMap = pMapRotation; // cut out the next map char aBuf[512] = {0}; for(int i = 0; i < 511; i++) { aBuf[i] = pNextMap[i]; if(IsSeparator(pNextMap[i]) || pNextMap[i] == 0) { aBuf[i] = 0; break; } } // skip spaces int i = 0; while(IsSeparator(aBuf[i])) i++; m_RoundCount = 0; char aBufMsg[256]; str_format(aBufMsg, sizeof(aBufMsg), "rotating map to %s", &aBuf[i]); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); str_copy(g_Config.m_SvMap, &aBuf[i], sizeof(g_Config.m_SvMap)); } void IGameController::PostReset() { for(int i = 0; i < MAX_CLIENTS; i++) { if(GameServer()->m_apPlayers[i]) { GameServer()->m_apPlayers[i]->Respawn(); GameServer()->m_apPlayers[i]->m_Score = 0; GameServer()->m_apPlayers[i]->m_ScoreStartTick = Server()->Tick(); GameServer()->m_apPlayers[i]->m_RespawnTick = Server()->Tick()+Server()->TickSpeed()/2; } } } void IGameController::OnPlayerInfoChange(class CPlayer *pP) { const int aTeamColors[2] = {65387, 10223467}; if(IsTeamplay()) { pP->m_TeeInfos.m_UseCustomColor = 1; if(pP->GetTeam() >= TEAM_RED && pP->GetTeam() <= TEAM_BLUE) { pP->m_TeeInfos.m_ColorBody = aTeamColors[pP->GetTeam()]; pP->m_TeeInfos.m_ColorFeet = aTeamColors[pP->GetTeam()]; } else { pP->m_TeeInfos.m_ColorBody = 12895054; pP->m_TeeInfos.m_ColorFeet = 12895054; } } } int IGameController::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) { // do scoreing if(!pKiller || Weapon == WEAPON_GAME) return 0; if(pKiller == pVictim->GetPlayer()) pVictim->GetPlayer()->m_Score--; // suicide else { if(IsTeamplay() && pVictim->GetPlayer()->GetTeam() == pKiller->GetTeam()) pKiller->m_Score--; // teamkill else pKiller->m_Score++; // normal kill } if(Weapon == WEAPON_SELF) pVictim->GetPlayer()->m_RespawnTick = Server()->Tick()+Server()->TickSpeed()*3.0f; return 0; } void IGameController::OnCharacterSpawn(class CCharacter *pChr) { // default health pChr->IncreaseHealth(10); // give default weapons pChr->GiveWeapon(WEAPON_HAMMER, -1); pChr->GiveWeapon(WEAPON_GUN, 10); } void IGameController::DoWarmup(int Seconds) { if(Seconds < 0) m_Warmup = 0; else m_Warmup = Seconds*Server()->TickSpeed(); } bool IGameController::IsFriendlyFire(int ClientID1, int ClientID2) { if(ClientID1 == ClientID2) return false; if(IsTeamplay()) { if(!GameServer()->m_apPlayers[ClientID1] || !GameServer()->m_apPlayers[ClientID2]) return false; if(GameServer()->m_apPlayers[ClientID1]->GetTeam() == GameServer()->m_apPlayers[ClientID2]->GetTeam()) return true; } return false; } bool IGameController::IsForceBalanced() { if(m_ForceBalanced) { m_ForceBalanced = false; return true; } else return false; } bool IGameController::CanBeMovedOnBalance(int ClientID) { return true; } void IGameController::Tick() { // do warmup if(m_Warmup) { m_Warmup--; if(!m_Warmup) StartRound(); } if(m_GameOverTick != -1) { // game over.. wait for restart if(Server()->Tick() > m_GameOverTick+Server()->TickSpeed()*10) { CycleMap(); StartRound(); m_RoundCount++; } } // game is Paused if(GameServer()->m_World.m_Paused) ++m_RoundStartTick; // do team-balancing if(IsTeamplay() && m_UnbalancedTick != -1 && Server()->Tick() > m_UnbalancedTick+g_Config.m_SvTeambalanceTime*Server()->TickSpeed()*60) { GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", "Balancing teams"); int aT[2] = {0,0}; float aTScore[2] = {0,0}; float aPScore[MAX_CLIENTS] = {0.0f}; for(int i = 0; i < MAX_CLIENTS; i++) { if(GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS) { aT[GameServer()->m_apPlayers[i]->GetTeam()]++; aPScore[i] = GameServer()->m_apPlayers[i]->m_Score*Server()->TickSpeed()*60.0f/ (Server()->Tick()-GameServer()->m_apPlayers[i]->m_ScoreStartTick); aTScore[GameServer()->m_apPlayers[i]->GetTeam()] += aPScore[i]; } } // are teams unbalanced? if(absolute(aT[0]-aT[1]) >= 2) { int M = (aT[0] > aT[1]) ? 0 : 1; int NumBalance = absolute(aT[0]-aT[1]) / 2; do { CPlayer *pP = 0; float PD = aTScore[M]; for(int i = 0; i < MAX_CLIENTS; i++) { if(!GameServer()->m_apPlayers[i] || !CanBeMovedOnBalance(i)) continue; // remember the player who would cause lowest score-difference if(GameServer()->m_apPlayers[i]->GetTeam() == M && (!pP || absolute((aTScore[M^1]+aPScore[i]) - (aTScore[M]-aPScore[i])) < PD)) { pP = GameServer()->m_apPlayers[i]; PD = absolute((aTScore[M^1]+aPScore[i]) - (aTScore[M]-aPScore[i])); } } // move the player to the other team int Temp = pP->m_LastActionTick; pP->SetTeam(M^1); pP->m_LastActionTick = Temp; pP->Respawn(); pP->m_ForceBalanced = true; } while (--NumBalance); m_ForceBalanced = true; } m_UnbalancedTick = -1; } // check for inactive players if(g_Config.m_SvInactiveKickTime > 0) { for(int i = 0; i < MAX_CLIENTS; ++i) { #ifdef CONF_DEBUG if(g_Config.m_DbgDummies) { if(i >= MAX_CLIENTS-g_Config.m_DbgDummies) break; } #endif if(GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS && !Server()->IsAuthed(i)) { if(Server()->Tick() > GameServer()->m_apPlayers[i]->m_LastActionTick+g_Config.m_SvInactiveKickTime*Server()->TickSpeed()*60) { switch(g_Config.m_SvInactiveKick) { case 0: { // move player to spectator GameServer()->m_apPlayers[i]->SetTeam(TEAM_SPECTATORS); } break; case 1: { // move player to spectator if the reserved slots aren't filled yet, kick him otherwise int Spectators = 0; for(int j = 0; j < MAX_CLIENTS; ++j) if(GameServer()->m_apPlayers[j] && GameServer()->m_apPlayers[j]->GetTeam() == TEAM_SPECTATORS) ++Spectators; if(Spectators >= g_Config.m_SvSpectatorSlots) Server()->Kick(i, "Kicked for inactivity"); else GameServer()->m_apPlayers[i]->SetTeam(TEAM_SPECTATORS); } break; case 2: { // kick the player Server()->Kick(i, "Kicked for inactivity"); } } } } } } DoWincheck(); } bool IGameController::IsTeamplay() const { return m_GameFlags&GAMEFLAG_TEAMS; } void IGameController::Snap(int SnappingClient) { CNetObj_GameInfo *pGameInfoObj = (CNetObj_GameInfo *)Server()->SnapNewItem(NETOBJTYPE_GAMEINFO, 0, sizeof(CNetObj_GameInfo)); if(!pGameInfoObj) return; pGameInfoObj->m_GameFlags = m_GameFlags; pGameInfoObj->m_GameStateFlags = 0; if(m_GameOverTick != -1) pGameInfoObj->m_GameStateFlags |= GAMESTATEFLAG_GAMEOVER; if(m_SuddenDeath) pGameInfoObj->m_GameStateFlags |= GAMESTATEFLAG_SUDDENDEATH; if(GameServer()->m_World.m_Paused) pGameInfoObj->m_GameStateFlags |= GAMESTATEFLAG_PAUSED; pGameInfoObj->m_RoundStartTick = m_RoundStartTick; pGameInfoObj->m_WarmupTimer = m_Warmup; pGameInfoObj->m_ScoreLimit = g_Config.m_SvScorelimit; pGameInfoObj->m_TimeLimit = g_Config.m_SvTimelimit; pGameInfoObj->m_RoundNum = (str_length(g_Config.m_SvMaprotation) && g_Config.m_SvRoundsPerMap) ? g_Config.m_SvRoundsPerMap : 0; pGameInfoObj->m_RoundCurrent = m_RoundCount+1; } int IGameController::GetAutoTeam(int NotThisID) { // this will force the auto balancer to work overtime aswell if(g_Config.m_DbgStress) return 0; int aNumplayers[2] = {0,0}; for(int i = 0; i < MAX_CLIENTS; i++) { if(GameServer()->m_apPlayers[i] && i != NotThisID) { if(GameServer()->m_apPlayers[i]->GetTeam() >= TEAM_RED && GameServer()->m_apPlayers[i]->GetTeam() <= TEAM_BLUE) aNumplayers[GameServer()->m_apPlayers[i]->GetTeam()]++; } } int Team = 0; if(IsTeamplay()) Team = aNumplayers[TEAM_RED] > aNumplayers[TEAM_BLUE] ? TEAM_BLUE : TEAM_RED; if(CanJoinTeam(Team, NotThisID)) return Team; return -1; } bool IGameController::CanJoinTeam(int Team, int NotThisID) { if(Team == TEAM_SPECTATORS || (GameServer()->m_apPlayers[NotThisID] && GameServer()->m_apPlayers[NotThisID]->GetTeam() != TEAM_SPECTATORS)) return true; int aNumplayers[2] = {0,0}; for(int i = 0; i < MAX_CLIENTS; i++) { if(GameServer()->m_apPlayers[i] && i != NotThisID) { if(GameServer()->m_apPlayers[i]->GetTeam() >= TEAM_RED && GameServer()->m_apPlayers[i]->GetTeam() <= TEAM_BLUE) aNumplayers[GameServer()->m_apPlayers[i]->GetTeam()]++; } } return (aNumplayers[0] + aNumplayers[1]) < Server()->MaxClients()-g_Config.m_SvSpectatorSlots; } bool IGameController::CheckTeamBalance() { if(!IsTeamplay() || !g_Config.m_SvTeambalanceTime) return true; int aT[2] = {0, 0}; for(int i = 0; i < MAX_CLIENTS; i++) { CPlayer *pP = GameServer()->m_apPlayers[i]; if(pP && pP->GetTeam() != TEAM_SPECTATORS) aT[pP->GetTeam()]++; } char aBuf[256]; if(absolute(aT[0]-aT[1]) >= 2) { str_format(aBuf, sizeof(aBuf), "Teams are NOT balanced (red=%d blue=%d)", aT[0], aT[1]); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); if(GameServer()->m_pController->m_UnbalancedTick == -1) GameServer()->m_pController->m_UnbalancedTick = Server()->Tick(); return false; } else { str_format(aBuf, sizeof(aBuf), "Teams are balanced (red=%d blue=%d)", aT[0], aT[1]); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); GameServer()->m_pController->m_UnbalancedTick = -1; return true; } } bool IGameController::CanChangeTeam(CPlayer *pPlayer, int JoinTeam) { int aT[2] = {0, 0}; if (!IsTeamplay() || JoinTeam == TEAM_SPECTATORS || !g_Config.m_SvTeambalanceTime) return true; for(int i = 0; i < MAX_CLIENTS; i++) { CPlayer *pP = GameServer()->m_apPlayers[i]; if(pP && pP->GetTeam() != TEAM_SPECTATORS) aT[pP->GetTeam()]++; } // simulate what would happen if changed team aT[JoinTeam]++; if (pPlayer->GetTeam() != TEAM_SPECTATORS) aT[JoinTeam^1]--; // there is a player-difference of at least 2 if(absolute(aT[0]-aT[1]) >= 2) { // player wants to join team with less players if ((aT[0] < aT[1] && JoinTeam == TEAM_RED) || (aT[0] > aT[1] && JoinTeam == TEAM_BLUE)) return true; else return false; } else return true; } void IGameController::DoWincheck() { if(m_GameOverTick == -1 && !m_Warmup && !GameServer()->m_World.m_ResetRequested) { if(IsTeamplay()) { // check score win condition if((g_Config.m_SvScorelimit > 0 && (m_aTeamscore[TEAM_RED] >= g_Config.m_SvScorelimit || m_aTeamscore[TEAM_BLUE] >= g_Config.m_SvScorelimit)) || (g_Config.m_SvTimelimit > 0 && (Server()->Tick()-m_RoundStartTick) >= g_Config.m_SvTimelimit*Server()->TickSpeed()*60)) { if(m_aTeamscore[TEAM_RED] != m_aTeamscore[TEAM_BLUE]) EndRound(); else m_SuddenDeath = 1; } } else { // gather some stats int Topscore = 0; int TopscoreCount = 0; for(int i = 0; i < MAX_CLIENTS; i++) { if(GameServer()->m_apPlayers[i]) { if(GameServer()->m_apPlayers[i]->m_Score > Topscore) { Topscore = GameServer()->m_apPlayers[i]->m_Score; TopscoreCount = 1; } else if(GameServer()->m_apPlayers[i]->m_Score == Topscore) TopscoreCount++; } } // check score win condition if((g_Config.m_SvScorelimit > 0 && Topscore >= g_Config.m_SvScorelimit) || (g_Config.m_SvTimelimit > 0 && (Server()->Tick()-m_RoundStartTick) >= g_Config.m_SvTimelimit*Server()->TickSpeed()*60)) { if(TopscoreCount == 1) EndRound(); else m_SuddenDeath = 1; } } } } int IGameController::ClampTeam(int Team) { if(Team < 0) return TEAM_SPECTATORS; if(IsTeamplay()) return Team&1; return 0; } teeworlds-0.6.2+dfsg/src/game/server/gamecontroller.h0000644000175000017500000000602312140200333021627 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_GAMECONTROLLER_H #define GAME_SERVER_GAMECONTROLLER_H #include /* Class: Game Controller Controls the main game logic. Keeping track of team and player score, winning conditions and specific game logic. */ class IGameController { vec2 m_aaSpawnPoints[3][64]; int m_aNumSpawnPoints[3]; class CGameContext *m_pGameServer; class IServer *m_pServer; protected: CGameContext *GameServer() const { return m_pGameServer; } IServer *Server() const { return m_pServer; } struct CSpawnEval { CSpawnEval() { m_Got = false; m_FriendlyTeam = -1; m_Pos = vec2(100,100); } vec2 m_Pos; bool m_Got; int m_FriendlyTeam; float m_Score; }; float EvaluateSpawnPos(CSpawnEval *pEval, vec2 Pos); void EvaluateSpawnType(CSpawnEval *pEval, int Type); bool EvaluateSpawn(class CPlayer *pP, vec2 *pPos); void CycleMap(); void ResetGame(); char m_aMapWish[128]; int m_RoundStartTick; int m_GameOverTick; int m_SuddenDeath; int m_aTeamscore[2]; int m_Warmup; int m_RoundCount; int m_GameFlags; int m_UnbalancedTick; bool m_ForceBalanced; public: const char *m_pGameType; bool IsTeamplay() const; bool IsGameOver() const { return m_GameOverTick != -1; } IGameController(class CGameContext *pGameServer); virtual ~IGameController(); virtual void DoWincheck(); void DoWarmup(int Seconds); void StartRound(); void EndRound(); void ChangeMap(const char *pToMap); bool IsFriendlyFire(int ClientID1, int ClientID2); bool IsForceBalanced(); /* */ virtual bool CanBeMovedOnBalance(int ClientID); virtual void Tick(); virtual void Snap(int SnappingClient); /* Function: on_entity Called when the map is loaded to process an entity in the map. Arguments: index - Entity index. pos - Where the entity is located in the world. Returns: bool? */ virtual bool OnEntity(int Index, vec2 Pos); /* Function: on_CCharacter_spawn Called when a CCharacter spawns into the game world. Arguments: chr - The CCharacter that was spawned. */ virtual void OnCharacterSpawn(class CCharacter *pChr); /* Function: on_CCharacter_death Called when a CCharacter in the world dies. Arguments: victim - The CCharacter that died. killer - The player that killed it. weapon - What weapon that killed it. Can be -1 for undefined weapon when switching team or player suicides. */ virtual int OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon); virtual void OnPlayerInfoChange(class CPlayer *pP); // virtual bool CanSpawn(int Team, vec2 *pPos); /* */ virtual const char *GetTeamName(int Team); virtual int GetAutoTeam(int NotThisID); virtual bool CanJoinTeam(int Team, int NotThisID); bool CheckTeamBalance(); bool CanChangeTeam(CPlayer *pPplayer, int JoinTeam); int ClampTeam(int Team); virtual void PostReset(); }; #endif teeworlds-0.6.2+dfsg/src/game/server/gamemodes/0000755000175000017500000000000012140200333020401 5ustar felixfelixteeworlds-0.6.2+dfsg/src/game/server/gamemodes/ctf.cpp0000644000175000017500000002120212140200333021656 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include "ctf.h" CGameControllerCTF::CGameControllerCTF(class CGameContext *pGameServer) : IGameController(pGameServer) { m_apFlags[0] = 0; m_apFlags[1] = 0; m_pGameType = "CTF"; m_GameFlags = GAMEFLAG_TEAMS|GAMEFLAG_FLAGS; } bool CGameControllerCTF::OnEntity(int Index, vec2 Pos) { if(IGameController::OnEntity(Index, Pos)) return true; int Team = -1; if(Index == ENTITY_FLAGSTAND_RED) Team = TEAM_RED; if(Index == ENTITY_FLAGSTAND_BLUE) Team = TEAM_BLUE; if(Team == -1 || m_apFlags[Team]) return false; CFlag *F = new CFlag(&GameServer()->m_World, Team); F->m_StandPos = Pos; F->m_Pos = Pos; m_apFlags[Team] = F; GameServer()->m_World.InsertEntity(F); return true; } int CGameControllerCTF::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int WeaponID) { IGameController::OnCharacterDeath(pVictim, pKiller, WeaponID); int HadFlag = 0; // drop flags for(int i = 0; i < 2; i++) { CFlag *F = m_apFlags[i]; if(F && pKiller && pKiller->GetCharacter() && F->m_pCarryingCharacter == pKiller->GetCharacter()) HadFlag |= 2; if(F && F->m_pCarryingCharacter == pVictim) { GameServer()->CreateSoundGlobal(SOUND_CTF_DROP); F->m_DropTick = Server()->Tick(); F->m_pCarryingCharacter = 0; F->m_Vel = vec2(0,0); if(pKiller && pKiller->GetTeam() != pVictim->GetPlayer()->GetTeam()) pKiller->m_Score++; HadFlag |= 1; } } return HadFlag; } void CGameControllerCTF::DoWincheck() { if(m_GameOverTick == -1 && !m_Warmup) { // check score win condition if((g_Config.m_SvScorelimit > 0 && (m_aTeamscore[TEAM_RED] >= g_Config.m_SvScorelimit || m_aTeamscore[TEAM_BLUE] >= g_Config.m_SvScorelimit)) || (g_Config.m_SvTimelimit > 0 && (Server()->Tick()-m_RoundStartTick) >= g_Config.m_SvTimelimit*Server()->TickSpeed()*60)) { if(m_SuddenDeath) { if(m_aTeamscore[TEAM_RED]/100 != m_aTeamscore[TEAM_BLUE]/100) EndRound(); } else { if(m_aTeamscore[TEAM_RED] != m_aTeamscore[TEAM_BLUE]) EndRound(); else m_SuddenDeath = 1; } } } } bool CGameControllerCTF::CanBeMovedOnBalance(int ClientID) { CCharacter* Character = GameServer()->m_apPlayers[ClientID]->GetCharacter(); if(Character) { for(int fi = 0; fi < 2; fi++) { CFlag *F = m_apFlags[fi]; if(F && F->m_pCarryingCharacter == Character) return false; } } return true; } void CGameControllerCTF::Snap(int SnappingClient) { IGameController::Snap(SnappingClient); CNetObj_GameData *pGameDataObj = (CNetObj_GameData *)Server()->SnapNewItem(NETOBJTYPE_GAMEDATA, 0, sizeof(CNetObj_GameData)); if(!pGameDataObj) return; pGameDataObj->m_TeamscoreRed = m_aTeamscore[TEAM_RED]; pGameDataObj->m_TeamscoreBlue = m_aTeamscore[TEAM_BLUE]; if(m_apFlags[TEAM_RED]) { if(m_apFlags[TEAM_RED]->m_AtStand) pGameDataObj->m_FlagCarrierRed = FLAG_ATSTAND; else if(m_apFlags[TEAM_RED]->m_pCarryingCharacter && m_apFlags[TEAM_RED]->m_pCarryingCharacter->GetPlayer()) pGameDataObj->m_FlagCarrierRed = m_apFlags[TEAM_RED]->m_pCarryingCharacter->GetPlayer()->GetCID(); else pGameDataObj->m_FlagCarrierRed = FLAG_TAKEN; } else pGameDataObj->m_FlagCarrierRed = FLAG_MISSING; if(m_apFlags[TEAM_BLUE]) { if(m_apFlags[TEAM_BLUE]->m_AtStand) pGameDataObj->m_FlagCarrierBlue = FLAG_ATSTAND; else if(m_apFlags[TEAM_BLUE]->m_pCarryingCharacter && m_apFlags[TEAM_BLUE]->m_pCarryingCharacter->GetPlayer()) pGameDataObj->m_FlagCarrierBlue = m_apFlags[TEAM_BLUE]->m_pCarryingCharacter->GetPlayer()->GetCID(); else pGameDataObj->m_FlagCarrierBlue = FLAG_TAKEN; } else pGameDataObj->m_FlagCarrierBlue = FLAG_MISSING; } void CGameControllerCTF::Tick() { IGameController::Tick(); if(GameServer()->m_World.m_ResetRequested || GameServer()->m_World.m_Paused) return; for(int fi = 0; fi < 2; fi++) { CFlag *F = m_apFlags[fi]; if(!F) continue; // flag hits death-tile or left the game layer, reset it if(GameServer()->Collision()->GetCollisionAt(F->m_Pos.x, F->m_Pos.y)&CCollision::COLFLAG_DEATH || F->GameLayerClipped(F->m_Pos)) { GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", "flag_return"); GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN); F->Reset(); continue; } // if(F->m_pCarryingCharacter) { // update flag position F->m_Pos = F->m_pCarryingCharacter->m_Pos; if(m_apFlags[fi^1] && m_apFlags[fi^1]->m_AtStand) { if(distance(F->m_Pos, m_apFlags[fi^1]->m_Pos) < CFlag::ms_PhysSize + CCharacter::ms_PhysSize) { // CAPTURE! \o/ m_aTeamscore[fi^1] += 100; F->m_pCarryingCharacter->GetPlayer()->m_Score += 5; char aBuf[512]; str_format(aBuf, sizeof(aBuf), "flag_capture player='%d:%s'", F->m_pCarryingCharacter->GetPlayer()->GetCID(), Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID())); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); float CaptureTime = (Server()->Tick() - F->m_GrabTick)/(float)Server()->TickSpeed(); if(CaptureTime <= 60) { str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s' (%d.%s%d seconds)", fi ? "blue" : "red", Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()), (int)CaptureTime%60, ((int)(CaptureTime*100)%100)<10?"0":"", (int)(CaptureTime*100)%100); } else { str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s'", fi ? "blue" : "red", Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID())); } GameServer()->SendChat(-1, -2, aBuf); for(int i = 0; i < 2; i++) m_apFlags[i]->Reset(); GameServer()->CreateSoundGlobal(SOUND_CTF_CAPTURE); } } } else { CCharacter *apCloseCCharacters[MAX_CLIENTS]; int Num = GameServer()->m_World.FindEntities(F->m_Pos, CFlag::ms_PhysSize, (CEntity**)apCloseCCharacters, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); for(int i = 0; i < Num; i++) { if(!apCloseCCharacters[i]->IsAlive() || apCloseCCharacters[i]->GetPlayer()->GetTeam() == TEAM_SPECTATORS || GameServer()->Collision()->IntersectLine(F->m_Pos, apCloseCCharacters[i]->m_Pos, NULL, NULL)) continue; if(apCloseCCharacters[i]->GetPlayer()->GetTeam() == F->m_Team) { // return the flag if(!F->m_AtStand) { CCharacter *pChr = apCloseCCharacters[i]; pChr->GetPlayer()->m_Score += 1; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "flag_return player='%d:%s'", pChr->GetPlayer()->GetCID(), Server()->ClientName(pChr->GetPlayer()->GetCID())); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN); F->Reset(); } } else { // take the flag if(F->m_AtStand) { m_aTeamscore[fi^1]++; F->m_GrabTick = Server()->Tick(); } F->m_AtStand = 0; F->m_pCarryingCharacter = apCloseCCharacters[i]; F->m_pCarryingCharacter->GetPlayer()->m_Score += 1; char aBuf[256]; str_format(aBuf, sizeof(aBuf), "flag_grab player='%d:%s'", F->m_pCarryingCharacter->GetPlayer()->GetCID(), Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID())); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); for(int c = 0; c < MAX_CLIENTS; c++) { CPlayer *pPlayer = GameServer()->m_apPlayers[c]; if(!pPlayer) continue; if(pPlayer->GetTeam() == TEAM_SPECTATORS && pPlayer->m_SpectatorID != SPEC_FREEVIEW && GameServer()->m_apPlayers[pPlayer->m_SpectatorID] && GameServer()->m_apPlayers[pPlayer->m_SpectatorID]->GetTeam() == fi) GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, c); else if(pPlayer->GetTeam() == fi) GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, c); else GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_PL, c); } // demo record entry GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, -2); break; } } if(!F->m_pCarryingCharacter && !F->m_AtStand) { if(Server()->Tick() > F->m_DropTick + Server()->TickSpeed()*30) { GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN); F->Reset(); } else { F->m_Vel.y += GameServer()->m_World.m_Core.m_Tuning.m_Gravity; GameServer()->Collision()->MoveBox(&F->m_Pos, &F->m_Vel, vec2(F->ms_PhysSize, F->ms_PhysSize), 0.5f); } } } } } teeworlds-0.6.2+dfsg/src/game/server/gamemodes/ctf.h0000644000175000017500000000140312140200333021324 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_GAMEMODES_CTF_H #define GAME_SERVER_GAMEMODES_CTF_H #include #include class CGameControllerCTF : public IGameController { public: class CFlag *m_apFlags[2]; CGameControllerCTF(class CGameContext *pGameServer); virtual void DoWincheck(); virtual bool CanBeMovedOnBalance(int ClientID); virtual void Snap(int SnappingClient); virtual void Tick(); virtual bool OnEntity(int Index, vec2 Pos); virtual int OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon); }; #endif teeworlds-0.6.2+dfsg/src/game/server/gamemodes/dm.cpp0000644000175000017500000000061612140200333021510 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "dm.h" CGameControllerDM::CGameControllerDM(class CGameContext *pGameServer) : IGameController(pGameServer) { m_pGameType = "DM"; } void CGameControllerDM::Tick() { IGameController::Tick(); } teeworlds-0.6.2+dfsg/src/game/server/gamemodes/dm.h0000644000175000017500000000067712140200333021164 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_GAMEMODES_DM_H #define GAME_SERVER_GAMEMODES_DM_H #include class CGameControllerDM : public IGameController { public: CGameControllerDM(class CGameContext *pGameServer); virtual void Tick(); }; #endif teeworlds-0.6.2+dfsg/src/game/server/gamemodes/mod.cpp0000644000175000017500000000125412140200333021666 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "mod.h" CGameControllerMOD::CGameControllerMOD(class CGameContext *pGameServer) : IGameController(pGameServer) { // Exchange this to a string that identifies your game mode. // DM, TDM and CTF are reserved for teeworlds original modes. m_pGameType = "MOD"; //m_GameFlags = GAMEFLAG_TEAMS; // GAMEFLAG_TEAMS makes it a two-team gamemode } void CGameControllerMOD::Tick() { // this is the main part of the gamemode, this function is run every tick IGameController::Tick(); } teeworlds-0.6.2+dfsg/src/game/server/gamemodes/mod.h0000644000175000017500000000115612140200333021334 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_GAMEMODES_MOD_H #define GAME_SERVER_GAMEMODES_MOD_H #include // you can subclass GAMECONTROLLER_CTF, GAMECONTROLLER_TDM etc if you want // todo a modification with their base as well. class CGameControllerMOD : public IGameController { public: CGameControllerMOD(class CGameContext *pGameServer); virtual void Tick(); // add more virtual functions here if you wish }; #endif teeworlds-0.6.2+dfsg/src/game/server/gamemodes/tdm.cpp0000644000175000017500000000310212140200333021665 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "tdm.h" CGameControllerTDM::CGameControllerTDM(class CGameContext *pGameServer) : IGameController(pGameServer) { m_pGameType = "TDM"; m_GameFlags = GAMEFLAG_TEAMS; } int CGameControllerTDM::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon) { IGameController::OnCharacterDeath(pVictim, pKiller, Weapon); if(pKiller && Weapon != WEAPON_GAME) { // do team scoring if(pKiller == pVictim->GetPlayer() || pKiller->GetTeam() == pVictim->GetPlayer()->GetTeam()) m_aTeamscore[pKiller->GetTeam()&1]--; // klant arschel else m_aTeamscore[pKiller->GetTeam()&1]++; // good shit } pVictim->GetPlayer()->m_RespawnTick = max(pVictim->GetPlayer()->m_RespawnTick, Server()->Tick()+Server()->TickSpeed()*g_Config.m_SvRespawnDelayTDM); return 0; } void CGameControllerTDM::Snap(int SnappingClient) { IGameController::Snap(SnappingClient); CNetObj_GameData *pGameDataObj = (CNetObj_GameData *)Server()->SnapNewItem(NETOBJTYPE_GAMEDATA, 0, sizeof(CNetObj_GameData)); if(!pGameDataObj) return; pGameDataObj->m_TeamscoreRed = m_aTeamscore[TEAM_RED]; pGameDataObj->m_TeamscoreBlue = m_aTeamscore[TEAM_BLUE]; pGameDataObj->m_FlagCarrierRed = 0; pGameDataObj->m_FlagCarrierBlue = 0; } void CGameControllerTDM::Tick() { IGameController::Tick(); } teeworlds-0.6.2+dfsg/src/game/server/gamemodes/tdm.h0000644000175000017500000000110212140200333021330 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_GAMEMODES_TDM_H #define GAME_SERVER_GAMEMODES_TDM_H #include class CGameControllerTDM : public IGameController { public: CGameControllerTDM(class CGameContext *pGameServer); int OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int Weapon); virtual void Snap(int SnappingClient); virtual void Tick(); }; #endif teeworlds-0.6.2+dfsg/src/game/server/gameworld.cpp0000644000175000017500000001324212140200333021127 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "gameworld.h" #include "entity.h" #include "gamecontext.h" ////////////////////////////////////////////////// // game world ////////////////////////////////////////////////// CGameWorld::CGameWorld() { m_pGameServer = 0x0; m_pServer = 0x0; m_Paused = false; m_ResetRequested = false; for(int i = 0; i < NUM_ENTTYPES; i++) m_apFirstEntityTypes[i] = 0; } CGameWorld::~CGameWorld() { // delete all entities for(int i = 0; i < NUM_ENTTYPES; i++) while(m_apFirstEntityTypes[i]) delete m_apFirstEntityTypes[i]; } void CGameWorld::SetGameServer(CGameContext *pGameServer) { m_pGameServer = pGameServer; m_pServer = m_pGameServer->Server(); } CEntity *CGameWorld::FindFirst(int Type) { return Type < 0 || Type >= NUM_ENTTYPES ? 0 : m_apFirstEntityTypes[Type]; } int CGameWorld::FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max, int Type) { if(Type < 0 || Type >= NUM_ENTTYPES) return 0; int Num = 0; for(CEntity *pEnt = m_apFirstEntityTypes[Type]; pEnt; pEnt = pEnt->m_pNextTypeEntity) { if(distance(pEnt->m_Pos, Pos) < Radius+pEnt->m_ProximityRadius) { if(ppEnts) ppEnts[Num] = pEnt; Num++; if(Num == Max) break; } } return Num; } void CGameWorld::InsertEntity(CEntity *pEnt) { #ifdef CONF_DEBUG for(CEntity *pCur = m_apFirstEntityTypes[pEnt->m_ObjType]; pCur; pCur = pCur->m_pNextTypeEntity) dbg_assert(pCur != pEnt, "err"); #endif // insert it if(m_apFirstEntityTypes[pEnt->m_ObjType]) m_apFirstEntityTypes[pEnt->m_ObjType]->m_pPrevTypeEntity = pEnt; pEnt->m_pNextTypeEntity = m_apFirstEntityTypes[pEnt->m_ObjType]; pEnt->m_pPrevTypeEntity = 0x0; m_apFirstEntityTypes[pEnt->m_ObjType] = pEnt; } void CGameWorld::DestroyEntity(CEntity *pEnt) { pEnt->m_MarkedForDestroy = true; } void CGameWorld::RemoveEntity(CEntity *pEnt) { // not in the list if(!pEnt->m_pNextTypeEntity && !pEnt->m_pPrevTypeEntity && m_apFirstEntityTypes[pEnt->m_ObjType] != pEnt) return; // remove if(pEnt->m_pPrevTypeEntity) pEnt->m_pPrevTypeEntity->m_pNextTypeEntity = pEnt->m_pNextTypeEntity; else m_apFirstEntityTypes[pEnt->m_ObjType] = pEnt->m_pNextTypeEntity; if(pEnt->m_pNextTypeEntity) pEnt->m_pNextTypeEntity->m_pPrevTypeEntity = pEnt->m_pPrevTypeEntity; // keep list traversing valid if(m_pNextTraverseEntity == pEnt) m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->m_pNextTypeEntity = 0; pEnt->m_pPrevTypeEntity = 0; } // void CGameWorld::Snap(int SnappingClient) { for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Snap(SnappingClient); pEnt = m_pNextTraverseEntity; } } void CGameWorld::Reset() { // reset all entities for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Reset(); pEnt = m_pNextTraverseEntity; } RemoveEntities(); GameServer()->m_pController->PostReset(); RemoveEntities(); m_ResetRequested = false; } void CGameWorld::RemoveEntities() { // destroy objects marked for destruction for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; if(pEnt->m_MarkedForDestroy) { RemoveEntity(pEnt); pEnt->Destroy(); } pEnt = m_pNextTraverseEntity; } } void CGameWorld::Tick() { if(m_ResetRequested) Reset(); if(!m_Paused) { if(GameServer()->m_pController->IsForceBalanced()) GameServer()->SendChat(-1, CGameContext::CHAT_ALL, "Teams have been balanced"); // update all objects for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Tick(); pEnt = m_pNextTraverseEntity; } for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickDefered(); pEnt = m_pNextTraverseEntity; } } else { // update all objects for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickPaused(); pEnt = m_pNextTraverseEntity; } } RemoveEntities(); } // TODO: should be more general CCharacter *CGameWorld::IntersectCharacter(vec2 Pos0, vec2 Pos1, float Radius, vec2& NewPos, CEntity *pNotThis) { // Find other players float ClosestLen = distance(Pos0, Pos1) * 100.0f; CCharacter *pClosest = 0; CCharacter *p = (CCharacter *)FindFirst(ENTTYPE_CHARACTER); for(; p; p = (CCharacter *)p->TypeNext()) { if(p == pNotThis) continue; vec2 IntersectPos = closest_point_on_line(Pos0, Pos1, p->m_Pos); float Len = distance(p->m_Pos, IntersectPos); if(Len < p->m_ProximityRadius+Radius) { Len = distance(Pos0, IntersectPos); if(Len < ClosestLen) { NewPos = IntersectPos; ClosestLen = Len; pClosest = p; } } } return pClosest; } CCharacter *CGameWorld::ClosestCharacter(vec2 Pos, float Radius, CEntity *pNotThis) { // Find other players float ClosestRange = Radius*2; CCharacter *pClosest = 0; CCharacter *p = (CCharacter *)GameServer()->m_World.FindFirst(ENTTYPE_CHARACTER); for(; p; p = (CCharacter *)p->TypeNext()) { if(p == pNotThis) continue; float Len = distance(Pos, p->m_Pos); if(Len < p->m_ProximityRadius+Radius) { if(Len < ClosestRange) { ClosestRange = Len; pClosest = p; } } } return pClosest; } teeworlds-0.6.2+dfsg/src/game/server/gameworld.h0000644000175000017500000000637312140200333020603 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_GAMEWORLD_H #define GAME_SERVER_GAMEWORLD_H #include class CEntity; class CCharacter; /* Class: Game World Tracks all entities in the game. Propagates tick and snap calls to all entities. */ class CGameWorld { public: enum { ENTTYPE_PROJECTILE = 0, ENTTYPE_LASER, ENTTYPE_PICKUP, ENTTYPE_FLAG, ENTTYPE_CHARACTER, NUM_ENTTYPES }; private: void Reset(); void RemoveEntities(); CEntity *m_pNextTraverseEntity; CEntity *m_apFirstEntityTypes[NUM_ENTTYPES]; class CGameContext *m_pGameServer; class IServer *m_pServer; public: class CGameContext *GameServer() { return m_pGameServer; } class IServer *Server() { return m_pServer; } bool m_ResetRequested; bool m_Paused; CWorldCore m_Core; CGameWorld(); ~CGameWorld(); void SetGameServer(CGameContext *pGameServer); CEntity *FindFirst(int Type); /* Function: find_entities Finds entities close to a position and returns them in a list. Arguments: pos - Position. radius - How close the entities have to be. ents - Pointer to a list that should be filled with the pointers to the entities. max - Number of entities that fits into the ents array. type - Type of the entities to find. Returns: Number of entities found and added to the ents array. */ int FindEntities(vec2 Pos, float Radius, CEntity **ppEnts, int Max, int Type); /* Function: interserct_CCharacter Finds the closest CCharacter that intersects the line. Arguments: pos0 - Start position pos2 - End position radius - How for from the line the CCharacter is allowed to be. new_pos - Intersection position notthis - Entity to ignore intersecting with Returns: Returns a pointer to the closest hit or NULL of there is no intersection. */ class CCharacter *IntersectCharacter(vec2 Pos0, vec2 Pos1, float Radius, vec2 &NewPos, class CEntity *pNotThis = 0); /* Function: closest_CCharacter Finds the closest CCharacter to a specific point. Arguments: pos - The center position. radius - How far off the CCharacter is allowed to be notthis - Entity to ignore Returns: Returns a pointer to the closest CCharacter or NULL if no CCharacter is close enough. */ class CCharacter *ClosestCharacter(vec2 Pos, float Radius, CEntity *ppNotThis); /* Function: insert_entity Adds an entity to the world. Arguments: entity - Entity to add */ void InsertEntity(CEntity *pEntity); /* Function: remove_entity Removes an entity from the world. Arguments: entity - Entity to remove */ void RemoveEntity(CEntity *pEntity); /* Function: destroy_entity Destroys an entity in the world. Arguments: entity - Entity to destroy */ void DestroyEntity(CEntity *pEntity); /* Function: snap Calls snap on all the entities in the world to create the snapshot. Arguments: snapping_client - ID of the client which snapshot is being created. */ void Snap(int SnappingClient); /* Function: tick Calls tick on all the entities in the world to progress the world to the next tick. */ void Tick(); }; #endif teeworlds-0.6.2+dfsg/src/game/server/player.cpp0000644000175000017500000002014512140200333020442 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include "player.h" MACRO_ALLOC_POOL_ID_IMPL(CPlayer, MAX_CLIENTS) IServer *CPlayer::Server() const { return m_pGameServer->Server(); } CPlayer::CPlayer(CGameContext *pGameServer, int ClientID, int Team) { m_pGameServer = pGameServer; m_RespawnTick = Server()->Tick(); m_DieTick = Server()->Tick(); m_ScoreStartTick = Server()->Tick(); m_pCharacter = 0; m_ClientID = ClientID; m_Team = GameServer()->m_pController->ClampTeam(Team); m_SpectatorID = SPEC_FREEVIEW; m_LastActionTick = Server()->Tick(); m_TeamChangeTick = Server()->Tick(); } CPlayer::~CPlayer() { delete m_pCharacter; m_pCharacter = 0; } void CPlayer::Tick() { #ifdef CONF_DEBUG if(!g_Config.m_DbgDummies || m_ClientID < MAX_CLIENTS-g_Config.m_DbgDummies) #endif if(!Server()->ClientIngame(m_ClientID)) return; Server()->SetClientScore(m_ClientID, m_Score); // do latency stuff { IServer::CClientInfo Info; if(Server()->GetClientInfo(m_ClientID, &Info)) { m_Latency.m_Accum += Info.m_Latency; m_Latency.m_AccumMax = max(m_Latency.m_AccumMax, Info.m_Latency); m_Latency.m_AccumMin = min(m_Latency.m_AccumMin, Info.m_Latency); } // each second if(Server()->Tick()%Server()->TickSpeed() == 0) { m_Latency.m_Avg = m_Latency.m_Accum/Server()->TickSpeed(); m_Latency.m_Max = m_Latency.m_AccumMax; m_Latency.m_Min = m_Latency.m_AccumMin; m_Latency.m_Accum = 0; m_Latency.m_AccumMin = 1000; m_Latency.m_AccumMax = 0; } } if(!GameServer()->m_World.m_Paused) { if(!m_pCharacter && m_Team == TEAM_SPECTATORS && m_SpectatorID == SPEC_FREEVIEW) m_ViewPos -= vec2(clamp(m_ViewPos.x-m_LatestActivity.m_TargetX, -500.0f, 500.0f), clamp(m_ViewPos.y-m_LatestActivity.m_TargetY, -400.0f, 400.0f)); if(!m_pCharacter && m_DieTick+Server()->TickSpeed()*3 <= Server()->Tick()) m_Spawning = true; if(m_pCharacter) { if(m_pCharacter->IsAlive()) { m_ViewPos = m_pCharacter->m_Pos; } else { delete m_pCharacter; m_pCharacter = 0; } } else if(m_Spawning && m_RespawnTick <= Server()->Tick()) TryRespawn(); } else { ++m_RespawnTick; ++m_DieTick; ++m_ScoreStartTick; ++m_LastActionTick; ++m_TeamChangeTick; } } void CPlayer::PostTick() { // update latency value if(m_PlayerFlags&PLAYERFLAG_SCOREBOARD) { for(int i = 0; i < MAX_CLIENTS; ++i) { if(GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->GetTeam() != TEAM_SPECTATORS) m_aActLatency[i] = GameServer()->m_apPlayers[i]->m_Latency.m_Min; } } // update view pos for spectators if(m_Team == TEAM_SPECTATORS && m_SpectatorID != SPEC_FREEVIEW && GameServer()->m_apPlayers[m_SpectatorID]) m_ViewPos = GameServer()->m_apPlayers[m_SpectatorID]->m_ViewPos; } void CPlayer::Snap(int SnappingClient) { #ifdef CONF_DEBUG if(!g_Config.m_DbgDummies || m_ClientID < MAX_CLIENTS-g_Config.m_DbgDummies) #endif if(!Server()->ClientIngame(m_ClientID)) return; CNetObj_ClientInfo *pClientInfo = static_cast(Server()->SnapNewItem(NETOBJTYPE_CLIENTINFO, m_ClientID, sizeof(CNetObj_ClientInfo))); if(!pClientInfo) return; StrToInts(&pClientInfo->m_Name0, 4, Server()->ClientName(m_ClientID)); StrToInts(&pClientInfo->m_Clan0, 3, Server()->ClientClan(m_ClientID)); pClientInfo->m_Country = Server()->ClientCountry(m_ClientID); StrToInts(&pClientInfo->m_Skin0, 6, m_TeeInfos.m_SkinName); pClientInfo->m_UseCustomColor = m_TeeInfos.m_UseCustomColor; pClientInfo->m_ColorBody = m_TeeInfos.m_ColorBody; pClientInfo->m_ColorFeet = m_TeeInfos.m_ColorFeet; CNetObj_PlayerInfo *pPlayerInfo = static_cast(Server()->SnapNewItem(NETOBJTYPE_PLAYERINFO, m_ClientID, sizeof(CNetObj_PlayerInfo))); if(!pPlayerInfo) return; pPlayerInfo->m_Latency = SnappingClient == -1 ? m_Latency.m_Min : GameServer()->m_apPlayers[SnappingClient]->m_aActLatency[m_ClientID]; pPlayerInfo->m_Local = 0; pPlayerInfo->m_ClientID = m_ClientID; pPlayerInfo->m_Score = m_Score; pPlayerInfo->m_Team = m_Team; if(m_ClientID == SnappingClient) pPlayerInfo->m_Local = 1; if(m_ClientID == SnappingClient && m_Team == TEAM_SPECTATORS) { CNetObj_SpectatorInfo *pSpectatorInfo = static_cast(Server()->SnapNewItem(NETOBJTYPE_SPECTATORINFO, m_ClientID, sizeof(CNetObj_SpectatorInfo))); if(!pSpectatorInfo) return; pSpectatorInfo->m_SpectatorID = m_SpectatorID; pSpectatorInfo->m_X = m_ViewPos.x; pSpectatorInfo->m_Y = m_ViewPos.y; } } void CPlayer::OnDisconnect(const char *pReason) { KillCharacter(); if(Server()->ClientIngame(m_ClientID)) { char aBuf[512]; if(pReason && *pReason) str_format(aBuf, sizeof(aBuf), "'%s' has left the game (%s)", Server()->ClientName(m_ClientID), pReason); else str_format(aBuf, sizeof(aBuf), "'%s' has left the game", Server()->ClientName(m_ClientID)); GameServer()->SendChat(-1, CGameContext::CHAT_ALL, aBuf); str_format(aBuf, sizeof(aBuf), "leave player='%d:%s'", m_ClientID, Server()->ClientName(m_ClientID)); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "game", aBuf); } } void CPlayer::OnPredictedInput(CNetObj_PlayerInput *NewInput) { // skip the input if chat is active if((m_PlayerFlags&PLAYERFLAG_CHATTING) && (NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING)) return; if(m_pCharacter) m_pCharacter->OnPredictedInput(NewInput); } void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) { if(NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING) { // skip the input if chat is active if(m_PlayerFlags&PLAYERFLAG_CHATTING) return; // reset input if(m_pCharacter) m_pCharacter->ResetInput(); m_PlayerFlags = NewInput->m_PlayerFlags; return; } m_PlayerFlags = NewInput->m_PlayerFlags; if(m_pCharacter) m_pCharacter->OnDirectInput(NewInput); if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) m_Spawning = true; // check for activity if(NewInput->m_Direction || m_LatestActivity.m_TargetX != NewInput->m_TargetX || m_LatestActivity.m_TargetY != NewInput->m_TargetY || NewInput->m_Jump || NewInput->m_Fire&1 || NewInput->m_Hook) { m_LatestActivity.m_TargetX = NewInput->m_TargetX; m_LatestActivity.m_TargetY = NewInput->m_TargetY; m_LastActionTick = Server()->Tick(); } } CCharacter *CPlayer::GetCharacter() { if(m_pCharacter && m_pCharacter->IsAlive()) return m_pCharacter; return 0; } void CPlayer::KillCharacter(int Weapon) { if(m_pCharacter) { m_pCharacter->Die(m_ClientID, Weapon); delete m_pCharacter; m_pCharacter = 0; } } void CPlayer::Respawn() { if(m_Team != TEAM_SPECTATORS) m_Spawning = true; } void CPlayer::SetTeam(int Team, bool DoChatMsg) { // clamp the team Team = GameServer()->m_pController->ClampTeam(Team); if(m_Team == Team) return; char aBuf[512]; if(DoChatMsg) { str_format(aBuf, sizeof(aBuf), "'%s' joined the %s", Server()->ClientName(m_ClientID), GameServer()->m_pController->GetTeamName(Team)); GameServer()->SendChat(-1, CGameContext::CHAT_ALL, aBuf); } KillCharacter(); m_Team = Team; m_LastActionTick = Server()->Tick(); m_SpectatorID = SPEC_FREEVIEW; // we got to wait 0.5 secs before respawning m_RespawnTick = Server()->Tick()+Server()->TickSpeed()/2; str_format(aBuf, sizeof(aBuf), "team_join player='%d:%s' m_Team=%d", m_ClientID, Server()->ClientName(m_ClientID), m_Team); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); GameServer()->m_pController->OnPlayerInfoChange(GameServer()->m_apPlayers[m_ClientID]); if(Team == TEAM_SPECTATORS) { // update spectator modes for(int i = 0; i < MAX_CLIENTS; ++i) { if(GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->m_SpectatorID == m_ClientID) GameServer()->m_apPlayers[i]->m_SpectatorID = SPEC_FREEVIEW; } } } void CPlayer::TryRespawn() { vec2 SpawnPos; if(!GameServer()->m_pController->CanSpawn(m_Team, &SpawnPos)) return; m_Spawning = false; m_pCharacter = new(m_ClientID) CCharacter(&GameServer()->m_World); m_pCharacter->Spawn(this, SpawnPos); GameServer()->CreatePlayerSpawn(SpawnPos); } teeworlds-0.6.2+dfsg/src/game/server/player.h0000644000175000017500000000437612140200333020117 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_SERVER_PLAYER_H #define GAME_SERVER_PLAYER_H // this include should perhaps be removed #include "entities/character.h" #include "gamecontext.h" // player object class CPlayer { MACRO_ALLOC_POOL_ID() public: CPlayer(CGameContext *pGameServer, int ClientID, int Team); ~CPlayer(); void Init(int CID); void TryRespawn(); void Respawn(); void SetTeam(int Team, bool DoChatMsg=true); int GetTeam() const { return m_Team; }; int GetCID() const { return m_ClientID; }; void Tick(); void PostTick(); void Snap(int SnappingClient); void OnDirectInput(CNetObj_PlayerInput *NewInput); void OnPredictedInput(CNetObj_PlayerInput *NewInput); void OnDisconnect(const char *pReason); void KillCharacter(int Weapon = WEAPON_GAME); CCharacter *GetCharacter(); //--------------------------------------------------------- // this is used for snapping so we know how we can clip the view for the player vec2 m_ViewPos; // states if the client is chatting, accessing a menu etc. int m_PlayerFlags; // used for snapping to just update latency if the scoreboard is active int m_aActLatency[MAX_CLIENTS]; // used for spectator mode int m_SpectatorID; bool m_IsReady; // int m_Vote; int m_VotePos; // int m_LastVoteCall; int m_LastVoteTry; int m_LastChat; int m_LastSetTeam; int m_LastSetSpectatorMode; int m_LastChangeInfo; int m_LastEmote; int m_LastKill; // TODO: clean this up struct { char m_SkinName[64]; int m_UseCustomColor; int m_ColorBody; int m_ColorFeet; } m_TeeInfos; int m_RespawnTick; int m_DieTick; int m_Score; int m_ScoreStartTick; bool m_ForceBalanced; int m_LastActionTick; int m_TeamChangeTick; struct { int m_TargetX; int m_TargetY; } m_LatestActivity; // network latency calculations struct { int m_Accum; int m_AccumMin; int m_AccumMax; int m_Avg; int m_Min; int m_Max; } m_Latency; private: CCharacter *m_pCharacter; CGameContext *m_pGameServer; CGameContext *GameServer() const { return m_pGameServer; } IServer *Server() const; // bool m_Spawning; int m_ClientID; int m_Team; }; #endif teeworlds-0.6.2+dfsg/src/game/tuning.h0000644000175000017500000000435412140200333016615 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_TUNING_H #define GAME_TUNING_H #undef GAME_TUNING_H // this file will be included several times // physics tuning MACRO_TUNING_PARAM(GroundControlSpeed, ground_control_speed, 10.0f) MACRO_TUNING_PARAM(GroundControlAccel, ground_control_accel, 100.0f / TicksPerSecond) MACRO_TUNING_PARAM(GroundFriction, ground_friction, 0.5f) MACRO_TUNING_PARAM(GroundJumpImpulse, ground_jump_impulse, 13.2f) MACRO_TUNING_PARAM(AirJumpImpulse, air_jump_impulse, 12.0f) MACRO_TUNING_PARAM(AirControlSpeed, air_control_speed, 250.0f / TicksPerSecond) MACRO_TUNING_PARAM(AirControlAccel, air_control_accel, 1.5f) MACRO_TUNING_PARAM(AirFriction, air_friction, 0.95f) MACRO_TUNING_PARAM(HookLength, hook_length, 380.0f) MACRO_TUNING_PARAM(HookFireSpeed, hook_fire_speed, 80.0f) MACRO_TUNING_PARAM(HookDragAccel, hook_drag_accel, 3.0f) MACRO_TUNING_PARAM(HookDragSpeed, hook_drag_speed, 15.0f) MACRO_TUNING_PARAM(Gravity, gravity, 0.5f) MACRO_TUNING_PARAM(VelrampStart, velramp_start, 550) MACRO_TUNING_PARAM(VelrampRange, velramp_range, 2000) MACRO_TUNING_PARAM(VelrampCurvature, velramp_curvature, 1.4f) // weapon tuning MACRO_TUNING_PARAM(GunCurvature, gun_curvature, 1.25f) MACRO_TUNING_PARAM(GunSpeed, gun_speed, 2200.0f) MACRO_TUNING_PARAM(GunLifetime, gun_lifetime, 2.0f) MACRO_TUNING_PARAM(ShotgunCurvature, shotgun_curvature, 1.25f) MACRO_TUNING_PARAM(ShotgunSpeed, shotgun_speed, 2750.0f) MACRO_TUNING_PARAM(ShotgunSpeeddiff, shotgun_speeddiff, 0.8f) MACRO_TUNING_PARAM(ShotgunLifetime, shotgun_lifetime, 0.20f) MACRO_TUNING_PARAM(GrenadeCurvature, grenade_curvature, 7.0f) MACRO_TUNING_PARAM(GrenadeSpeed, grenade_speed, 1000.0f) MACRO_TUNING_PARAM(GrenadeLifetime, grenade_lifetime, 2.0f) MACRO_TUNING_PARAM(LaserReach, laser_reach, 800.0f) MACRO_TUNING_PARAM(LaserBounceDelay, laser_bounce_delay, 150) MACRO_TUNING_PARAM(LaserBounceNum, laser_bounce_num, 1) MACRO_TUNING_PARAM(LaserBounceCost, laser_bounce_cost, 0) MACRO_TUNING_PARAM(LaserDamage, laser_damage, 5) MACRO_TUNING_PARAM(PlayerCollision, player_collision, 1) MACRO_TUNING_PARAM(PlayerHooking, player_hooking, 1) #endif teeworlds-0.6.2+dfsg/src/game/variables.h0000644000175000017500000001657612140200333017272 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_VARIABLES_H #define GAME_VARIABLES_H #undef GAME_VARIABLES_H // this file will be included several times // client MACRO_CONFIG_INT(ClPredict, cl_predict, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Predict client movements") MACRO_CONFIG_INT(ClNameplates, cl_nameplates, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show name plates") MACRO_CONFIG_INT(ClNameplatesAlways, cl_nameplates_always, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Always show name plates disregarding of distance") MACRO_CONFIG_INT(ClNameplatesTeamcolors, cl_nameplates_teamcolors, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Use team colors for name plates") MACRO_CONFIG_INT(ClNameplatesSize, cl_nameplates_size, 50, 0, 100, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Size of the name plates from 0 to 100%") MACRO_CONFIG_INT(ClAutoswitchWeapons, cl_autoswitch_weapons, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Auto switch weapon on pickup") MACRO_CONFIG_INT(ClShowhud, cl_showhud, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show ingame HUD") MACRO_CONFIG_INT(ClShowChatFriends, cl_show_chat_friends, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show only chat messages from friends") MACRO_CONFIG_INT(ClShowfps, cl_showfps, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show ingame FPS counter") MACRO_CONFIG_INT(ClAirjumpindicator, cl_airjumpindicator, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") MACRO_CONFIG_INT(ClThreadsoundloading, cl_threadsoundloading, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Load sound files threaded") MACRO_CONFIG_INT(ClWarningTeambalance, cl_warning_teambalance, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Warn about team balance") MACRO_CONFIG_INT(ClMouseDeadzone, cl_mouse_deadzone, 300, 0, 0, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") MACRO_CONFIG_INT(ClMouseFollowfactor, cl_mouse_followfactor, 60, 0, 200, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") MACRO_CONFIG_INT(ClMouseMaxDistance, cl_mouse_max_distance, 800, 0, 0, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") MACRO_CONFIG_INT(EdShowkeys, ed_showkeys, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") //MACRO_CONFIG_INT(ClFlow, cl_flow, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") MACRO_CONFIG_INT(ClShowWelcome, cl_show_welcome, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "") MACRO_CONFIG_INT(ClMotdTime, cl_motd_time, 10, 0, 100, CFGFLAG_CLIENT|CFGFLAG_SAVE, "How long to show the server message of the day") MACRO_CONFIG_STR(ClVersionServer, cl_version_server, 100, "version.teeworlds.com", CFGFLAG_CLIENT|CFGFLAG_SAVE, "Server to use to check for new versions") MACRO_CONFIG_STR(ClLanguagefile, cl_languagefile, 255, "", CFGFLAG_CLIENT|CFGFLAG_SAVE, "What language file to use") MACRO_CONFIG_INT(PlayerUseCustomColor, player_use_custom_color, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Toggles usage of custom colors") MACRO_CONFIG_INT(PlayerColorBody, player_color_body, 65408, 0, 0xFFFFFF, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Player body color") MACRO_CONFIG_INT(PlayerColorFeet, player_color_feet, 65408, 0, 0xFFFFFF, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Player feet color") MACRO_CONFIG_STR(PlayerSkin, player_skin, 24, "default", CFGFLAG_CLIENT|CFGFLAG_SAVE, "Player skin") MACRO_CONFIG_INT(UiPage, ui_page, 6, 0, 10, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Interface page") MACRO_CONFIG_INT(UiToolboxPage, ui_toolbox_page, 0, 0, 2, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Toolbox page") MACRO_CONFIG_STR(UiServerAddress, ui_server_address, 64, "localhost:8303", CFGFLAG_CLIENT|CFGFLAG_SAVE, "Interface server address") MACRO_CONFIG_INT(UiScale, ui_scale, 100, 50, 150, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Interface scale") MACRO_CONFIG_INT(UiMousesens, ui_mousesens, 100, 5, 100000, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Mouse sensitivity for menus/editor") MACRO_CONFIG_INT(UiColorHue, ui_color_hue, 160, 0, 255, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Interface color hue") MACRO_CONFIG_INT(UiColorSat, ui_color_sat, 70, 0, 255, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Interface color saturation") MACRO_CONFIG_INT(UiColorLht, ui_color_lht, 175, 0, 255, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Interface color lightness") MACRO_CONFIG_INT(UiColorAlpha, ui_color_alpha, 228, 0, 255, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Interface alpha") MACRO_CONFIG_INT(GfxNoclip, gfx_noclip, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Disable clipping") // server MACRO_CONFIG_INT(SvWarmup, sv_warmup, 0, 0, 0, CFGFLAG_SERVER, "Number of seconds to do warmup before round starts") MACRO_CONFIG_STR(SvMotd, sv_motd, 900, "", CFGFLAG_SERVER, "Message of the day to display for the clients") MACRO_CONFIG_INT(SvTeamdamage, sv_teamdamage, 0, 0, 1, CFGFLAG_SERVER, "Team damage") MACRO_CONFIG_STR(SvMaprotation, sv_maprotation, 768, "", CFGFLAG_SERVER, "Maps to rotate between") MACRO_CONFIG_INT(SvRoundsPerMap, sv_rounds_per_map, 1, 1, 100, CFGFLAG_SERVER, "Number of rounds on each map before rotating") MACRO_CONFIG_INT(SvRoundSwap, sv_round_swap, 1, 0, 1, CFGFLAG_SERVER, "Swap teams between rounds") MACRO_CONFIG_INT(SvPowerups, sv_powerups, 1, 0, 1, CFGFLAG_SERVER, "Allow powerups like ninja") MACRO_CONFIG_INT(SvScorelimit, sv_scorelimit, 20, 0, 1000, CFGFLAG_SERVER, "Score limit (0 disables)") MACRO_CONFIG_INT(SvTimelimit, sv_timelimit, 0, 0, 1000, CFGFLAG_SERVER, "Time limit in minutes (0 disables)") MACRO_CONFIG_STR(SvGametype, sv_gametype, 32, "dm", CFGFLAG_SERVER, "Game type (dm, tdm, ctf)") MACRO_CONFIG_INT(SvTournamentMode, sv_tournament_mode, 0, 0, 1, CFGFLAG_SERVER, "Tournament mode. When enabled, players joins the server as spectator") MACRO_CONFIG_INT(SvSpamprotection, sv_spamprotection, 1, 0, 1, CFGFLAG_SERVER, "Spam protection") MACRO_CONFIG_INT(SvRespawnDelayTDM, sv_respawn_delay_tdm, 3, 0, 10, CFGFLAG_SERVER, "Time needed to respawn after death in tdm gametype") MACRO_CONFIG_INT(SvSpectatorSlots, sv_spectator_slots, 0, 0, MAX_CLIENTS, CFGFLAG_SERVER, "Number of slots to reserve for spectators") MACRO_CONFIG_INT(SvTeambalanceTime, sv_teambalance_time, 1, 0, 1000, CFGFLAG_SERVER, "How many minutes to wait before autobalancing teams") MACRO_CONFIG_INT(SvInactiveKickTime, sv_inactivekick_time, 3, 0, 1000, CFGFLAG_SERVER, "How many minutes to wait before taking care of inactive players") MACRO_CONFIG_INT(SvInactiveKick, sv_inactivekick, 1, 0, 2, CFGFLAG_SERVER, "How to deal with inactive players (0=move to spectator, 1=move to free spectator slot/kick, 2=kick)") MACRO_CONFIG_INT(SvStrictSpectateMode, sv_strict_spectate_mode, 0, 0, 1, CFGFLAG_SERVER, "Restricts information in spectator mode") MACRO_CONFIG_INT(SvVoteSpectate, sv_vote_spectate, 1, 0, 1, CFGFLAG_SERVER, "Allow voting to move players to spectators") MACRO_CONFIG_INT(SvVoteSpectateRejoindelay, sv_vote_spectate_rejoindelay, 3, 0, 1000, CFGFLAG_SERVER, "How many minutes to wait before a player can rejoin after being moved to spectators by vote") MACRO_CONFIG_INT(SvVoteKick, sv_vote_kick, 1, 0, 1, CFGFLAG_SERVER, "Allow voting to kick players") MACRO_CONFIG_INT(SvVoteKickMin, sv_vote_kick_min, 0, 0, MAX_CLIENTS, CFGFLAG_SERVER, "Minimum number of players required to start a kick vote") MACRO_CONFIG_INT(SvVoteKickBantime, sv_vote_kick_bantime, 5, 0, 1440, CFGFLAG_SERVER, "The time to ban a player if kicked by vote. 0 makes it just use kick") // debug #ifdef CONF_DEBUG // this one can crash the server if not used correctly MACRO_CONFIG_INT(DbgDummies, dbg_dummies, 0, 0, 15, CFGFLAG_SERVER, "") #endif MACRO_CONFIG_INT(DbgFocus, dbg_focus, 0, 0, 1, CFGFLAG_CLIENT, "") MACRO_CONFIG_INT(DbgTuning, dbg_tuning, 0, 0, 1, CFGFLAG_CLIENT, "") #endif teeworlds-0.6.2+dfsg/src/game/version.h0000644000175000017500000000066112140200333016773 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_VERSION_H #define GAME_VERSION_H #include "generated/nethash.cpp" #define GAME_VERSION "0.6.2" #define GAME_NETVERSION "0.6 " GAME_NETVERSION_HASH static const char GAME_RELEASE_VERSION[8] = {'0', '.', '6', '.', '2', 0}; #endif teeworlds-0.6.2+dfsg/src/game/voting.h0000644000175000017500000000116212140200333016611 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef GAME_VOTING_H #define GAME_VOTING_H enum { VOTE_DESC_LENGTH=64, VOTE_CMD_LENGTH=512, VOTE_REASON_LENGTH=16, MAX_VOTE_OPTIONS=128, }; struct CVoteOptionClient { CVoteOptionClient *m_pNext; CVoteOptionClient *m_pPrev; char m_aDescription[VOTE_DESC_LENGTH]; }; struct CVoteOptionServer { CVoteOptionServer *m_pNext; CVoteOptionServer *m_pPrev; char m_aDescription[VOTE_DESC_LENGTH]; char m_aCommand[1]; }; #endif teeworlds-0.6.2+dfsg/src/mastersrv/0000755000175000017500000000000012140200333016247 5ustar felixfelixteeworlds-0.6.2+dfsg/src/mastersrv/mastersrv.cpp0000644000175000017500000003515512140200333021012 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include #include #include #include #include "mastersrv.h" enum { MTU = 1400, MAX_SERVERS_PER_PACKET=75, MAX_PACKETS=16, MAX_SERVERS=MAX_SERVERS_PER_PACKET*MAX_PACKETS, EXPIRE_TIME = 90 }; struct CCheckServer { enum ServerType m_Type; NETADDR m_Address; NETADDR m_AltAddress; int m_TryCount; int64 m_TryTime; }; static CCheckServer m_aCheckServers[MAX_SERVERS]; static int m_NumCheckServers = 0; struct CServerEntry { enum ServerType m_Type; NETADDR m_Address; int64 m_Expire; }; static CServerEntry m_aServers[MAX_SERVERS]; static int m_NumServers = 0; struct CPacketData { int m_Size; struct { unsigned char m_aHeader[sizeof(SERVERBROWSE_LIST)]; CMastersrvAddr m_aServers[MAX_SERVERS_PER_PACKET]; } m_Data; }; CPacketData m_aPackets[MAX_PACKETS]; static int m_NumPackets = 0; // legacy code struct CPacketDataLegacy { int m_Size; struct { unsigned char m_aHeader[sizeof(SERVERBROWSE_LIST_LEGACY)]; CMastersrvAddrLegacy m_aServers[MAX_SERVERS_PER_PACKET]; } m_Data; }; CPacketDataLegacy m_aPacketsLegacy[MAX_PACKETS]; static int m_NumPacketsLegacy = 0; struct CCountPacketData { unsigned char m_Header[sizeof(SERVERBROWSE_COUNT)]; unsigned char m_High; unsigned char m_Low; }; static CCountPacketData m_CountData; static CCountPacketData m_CountDataLegacy; CNetBan m_NetBan; static CNetClient m_NetChecker; // NAT/FW checker static CNetClient m_NetOp; // main IConsole *m_pConsole; void BuildPackets() { CServerEntry *pCurrent = &m_aServers[0]; int ServersLeft = m_NumServers; m_NumPackets = 0; m_NumPacketsLegacy = 0; int PacketIndex = 0; int PacketIndexLegacy = 0; while(ServersLeft-- && (m_NumPackets + m_NumPacketsLegacy) < MAX_PACKETS) { if(pCurrent->m_Type == SERVERTYPE_NORMAL) { if(PacketIndex % MAX_SERVERS_PER_PACKET == 0) { PacketIndex = 0; m_NumPackets++; } // copy header mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aHeader, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST)); // copy server addresses if(pCurrent->m_Address.type == NETTYPE_IPV6) { mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, pCurrent->m_Address.ip, sizeof(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp)); } else { static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, IPV4Mapping, sizeof(IPV4Mapping)); m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[12] = pCurrent->m_Address.ip[0]; m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[13] = pCurrent->m_Address.ip[1]; m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[14] = pCurrent->m_Address.ip[2]; m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[15] = pCurrent->m_Address.ip[3]; } m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aPort[0] = (pCurrent->m_Address.port>>8)&0xff; m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aPort[1] = pCurrent->m_Address.port&0xff; PacketIndex++; m_aPackets[m_NumPackets-1].m_Size = sizeof(SERVERBROWSE_LIST) + sizeof(CMastersrvAddr)*PacketIndex; pCurrent++; } else if(pCurrent->m_Type == SERVERTYPE_LEGACY) { if(PacketIndexLegacy % MAX_SERVERS_PER_PACKET == 0) { PacketIndexLegacy = 0; m_NumPacketsLegacy++; } // copy header mem_copy(m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aHeader, SERVERBROWSE_LIST_LEGACY, sizeof(SERVERBROWSE_LIST_LEGACY)); // copy server addresses mem_copy(m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aIp, pCurrent->m_Address.ip, sizeof(m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aIp)); // 0.5 has the port in little endian on the network m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aPort[0] = pCurrent->m_Address.port&0xff; m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Data.m_aServers[PacketIndexLegacy].m_aPort[1] = (pCurrent->m_Address.port>>8)&0xff; PacketIndexLegacy++; m_aPacketsLegacy[m_NumPacketsLegacy-1].m_Size = sizeof(SERVERBROWSE_LIST_LEGACY) + sizeof(CMastersrvAddrLegacy)*PacketIndexLegacy; pCurrent++; } else { *pCurrent = m_aServers[m_NumServers-1]; m_NumServers--; dbg_msg("mastersrv", "error: server of invalid type, dropping it"); } } } void SendOk(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(SERVERBROWSE_FWOK); p.m_pData = SERVERBROWSE_FWOK; // send on both to be sure m_NetChecker.Send(&p); m_NetOp.Send(&p); } void SendError(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(SERVERBROWSE_FWERROR); p.m_pData = SERVERBROWSE_FWERROR; m_NetOp.Send(&p); } void SendCheck(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(SERVERBROWSE_FWCHECK); p.m_pData = SERVERBROWSE_FWCHECK; m_NetChecker.Send(&p); } void AddCheckserver(NETADDR *pInfo, NETADDR *pAlt, ServerType Type) { // add server if(m_NumCheckServers == MAX_SERVERS) { dbg_msg("mastersrv", "error: mastersrv is full"); return; } char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pInfo, aAddrStr, sizeof(aAddrStr), true); char aAltAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pAlt, aAltAddrStr, sizeof(aAltAddrStr), true); dbg_msg("mastersrv", "checking: %s (%s)", aAddrStr, aAltAddrStr); m_aCheckServers[m_NumCheckServers].m_Address = *pInfo; m_aCheckServers[m_NumCheckServers].m_AltAddress = *pAlt; m_aCheckServers[m_NumCheckServers].m_TryCount = 0; m_aCheckServers[m_NumCheckServers].m_TryTime = 0; m_aCheckServers[m_NumCheckServers].m_Type = Type; m_NumCheckServers++; } void AddServer(NETADDR *pInfo, ServerType Type) { // see if server already exists in list for(int i = 0; i < m_NumServers; i++) { if(net_addr_comp(&m_aServers[i].m_Address, pInfo) == 0) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pInfo, aAddrStr, sizeof(aAddrStr), true); dbg_msg("mastersrv", "updated: %s", aAddrStr); m_aServers[i].m_Expire = time_get()+time_freq()*EXPIRE_TIME; return; } } // add server if(m_NumServers == MAX_SERVERS) { dbg_msg("mastersrv", "error: mastersrv is full"); return; } char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(pInfo, aAddrStr, sizeof(aAddrStr), true); dbg_msg("mastersrv", "added: %s", aAddrStr); m_aServers[m_NumServers].m_Address = *pInfo; m_aServers[m_NumServers].m_Expire = time_get()+time_freq()*EXPIRE_TIME; m_aServers[m_NumServers].m_Type = Type; m_NumServers++; } void UpdateServers() { int64 Now = time_get(); int64 Freq = time_freq(); for(int i = 0; i < m_NumCheckServers; i++) { if(Now > m_aCheckServers[i].m_TryTime+Freq) { if(m_aCheckServers[i].m_TryCount == 10) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&m_aCheckServers[i].m_Address, aAddrStr, sizeof(aAddrStr), true); char aAltAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&m_aCheckServers[i].m_AltAddress, aAltAddrStr, sizeof(aAltAddrStr), true); dbg_msg("mastersrv", "check failed: %s (%s)", aAddrStr, aAltAddrStr); // FAIL!! SendError(&m_aCheckServers[i].m_Address); m_aCheckServers[i] = m_aCheckServers[m_NumCheckServers-1]; m_NumCheckServers--; i--; } else { m_aCheckServers[i].m_TryCount++; m_aCheckServers[i].m_TryTime = Now; if(m_aCheckServers[i].m_TryCount&1) SendCheck(&m_aCheckServers[i].m_Address); else SendCheck(&m_aCheckServers[i].m_AltAddress); } } } } void PurgeServers() { int64 Now = time_get(); int i = 0; while(i < m_NumServers) { if(m_aServers[i].m_Expire < Now) { // remove server char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&m_aServers[i].m_Address, aAddrStr, sizeof(aAddrStr), true); dbg_msg("mastersrv", "expired: %s", aAddrStr); m_aServers[i] = m_aServers[m_NumServers-1]; m_NumServers--; } else i++; } } void ReloadBans() { m_NetBan.UnbanAll(); m_pConsole->ExecuteFile("master.cfg"); } int main(int argc, const char **argv) // ignore_convention { int64 LastBuild = 0, LastBanReload = 0; ServerType Type = SERVERTYPE_INVALID; NETADDR BindAddr; dbg_logger_stdout(); net_init(); mem_copy(m_CountData.m_Header, SERVERBROWSE_COUNT, sizeof(SERVERBROWSE_COUNT)); mem_copy(m_CountDataLegacy.m_Header, SERVERBROWSE_COUNT_LEGACY, sizeof(SERVERBROWSE_COUNT_LEGACY)); IKernel *pKernel = IKernel::Create(); IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); IConfig *pConfig = CreateConfig(); m_pConsole = CreateConsole(CFGFLAG_MASTER); bool RegisterFail = !pKernel->RegisterInterface(pStorage); RegisterFail |= !pKernel->RegisterInterface(m_pConsole); RegisterFail |= !pKernel->RegisterInterface(pConfig); if(RegisterFail) return -1; pConfig->Init(); m_NetBan.Init(m_pConsole, pStorage); if(argc > 1) // ignore_convention m_pConsole->ParseArguments(argc-1, &argv[1]); // ignore_convention if(g_Config.m_Bindaddr[0] && net_host_lookup(g_Config.m_Bindaddr, &BindAddr, NETTYPE_ALL) == 0) { // got bindaddr BindAddr.type = NETTYPE_ALL; BindAddr.port = MASTERSERVER_PORT; } else { mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = MASTERSERVER_PORT; } if(!m_NetOp.Open(BindAddr, 0)) { dbg_msg("mastersrv", "couldn't start network (op)"); return -1; } BindAddr.port = MASTERSERVER_PORT+1; if(!m_NetChecker.Open(BindAddr, 0)) { dbg_msg("mastersrv", "couldn't start network (checker)"); return -1; } // process pending commands m_pConsole->StoreCommands(false); dbg_msg("mastersrv", "started"); while(1) { m_NetOp.Update(); m_NetChecker.Update(); // process m_aPackets CNetChunk Packet; while(m_NetOp.Recv(&Packet)) { // check if the server is banned if(m_NetBan.IsBanned(&Packet.m_Address, 0, 0)) continue; if(Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT)+2 && mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)) == 0) { NETADDR Alt; unsigned char *d = (unsigned char *)Packet.m_pData; Alt = Packet.m_Address; Alt.port = (d[sizeof(SERVERBROWSE_HEARTBEAT)]<<8) | d[sizeof(SERVERBROWSE_HEARTBEAT)+1]; // add it AddCheckserver(&Packet.m_Address, &Alt, SERVERTYPE_NORMAL); } else if(Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)+2 && mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT_LEGACY, sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)) == 0) { NETADDR Alt; unsigned char *d = (unsigned char *)Packet.m_pData; Alt = Packet.m_Address; Alt.port = (d[sizeof(SERVERBROWSE_HEARTBEAT)]<<8) | d[sizeof(SERVERBROWSE_HEARTBEAT)+1]; // add it AddCheckserver(&Packet.m_Address, &Alt, SERVERTYPE_LEGACY); } else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT) && mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT, sizeof(SERVERBROWSE_GETCOUNT)) == 0) { dbg_msg("mastersrv", "count requested, responding with %d", m_NumServers); CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(m_CountData); p.m_pData = &m_CountData; m_CountData.m_High = (m_NumServers>>8)&0xff; m_CountData.m_Low = m_NumServers&0xff; m_NetOp.Send(&p); } else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT_LEGACY) && mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT_LEGACY, sizeof(SERVERBROWSE_GETCOUNT_LEGACY)) == 0) { dbg_msg("mastersrv", "count requested, responding with %d", m_NumServers); CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(m_CountData); p.m_pData = &m_CountDataLegacy; m_CountDataLegacy.m_High = (m_NumServers>>8)&0xff; m_CountDataLegacy.m_Low = m_NumServers&0xff; m_NetOp.Send(&p); } else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST) && mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST, sizeof(SERVERBROWSE_GETLIST)) == 0) { // someone requested the list dbg_msg("mastersrv", "requested, responding with %d m_aServers", m_NumServers); CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; for(int i = 0; i < m_NumPackets; i++) { p.m_DataSize = m_aPackets[i].m_Size; p.m_pData = &m_aPackets[i].m_Data; m_NetOp.Send(&p); } } else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST_LEGACY) && mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST_LEGACY, sizeof(SERVERBROWSE_GETLIST_LEGACY)) == 0) { // someone requested the list dbg_msg("mastersrv", "requested, responding with %d m_aServers", m_NumServers); CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; for(int i = 0; i < m_NumPacketsLegacy; i++) { p.m_DataSize = m_aPacketsLegacy[i].m_Size; p.m_pData = &m_aPacketsLegacy[i].m_Data; m_NetOp.Send(&p); } } } // process m_aPackets while(m_NetChecker.Recv(&Packet)) { // check if the server is banned if(m_NetBan.IsBanned(&Packet.m_Address, 0, 0)) continue; if(Packet.m_DataSize == sizeof(SERVERBROWSE_FWRESPONSE) && mem_comp(Packet.m_pData, SERVERBROWSE_FWRESPONSE, sizeof(SERVERBROWSE_FWRESPONSE)) == 0) { Type = SERVERTYPE_INVALID; // remove it from checking for(int i = 0; i < m_NumCheckServers; i++) { if(net_addr_comp(&m_aCheckServers[i].m_Address, &Packet.m_Address) == 0 || net_addr_comp(&m_aCheckServers[i].m_AltAddress, &Packet.m_Address) == 0) { Type = m_aCheckServers[i].m_Type; m_NumCheckServers--; m_aCheckServers[i] = m_aCheckServers[m_NumCheckServers]; break; } } // drops servers that were not in the CheckServers list if(Type == SERVERTYPE_INVALID) continue; AddServer(&Packet.m_Address, Type); SendOk(&Packet.m_Address); } } if(time_get()-LastBanReload > time_freq()*300) { LastBanReload = time_get(); ReloadBans(); } if(time_get()-LastBuild > time_freq()*5) { LastBuild = time_get(); PurgeServers(); UpdateServers(); BuildPackets(); } // be nice to the CPU thread_sleep(1); } return 0; } teeworlds-0.6.2+dfsg/src/mastersrv/mastersrv.h0000644000175000017500000000412712140200333020452 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef MASTERSRV_MASTERSRV_H #define MASTERSRV_MASTERSRV_H static const int MASTERSERVER_PORT = 8300; enum ServerType { SERVERTYPE_INVALID = -1, SERVERTYPE_NORMAL, SERVERTYPE_LEGACY }; struct CMastersrvAddr { unsigned char m_aIp[16]; unsigned char m_aPort[2]; }; static const unsigned char SERVERBROWSE_HEARTBEAT[] = {255, 255, 255, 255, 'b', 'e', 'a', '2'}; static const unsigned char SERVERBROWSE_GETLIST[] = {255, 255, 255, 255, 'r', 'e', 'q', '2'}; static const unsigned char SERVERBROWSE_LIST[] = {255, 255, 255, 255, 'l', 'i', 's', '2'}; static const unsigned char SERVERBROWSE_GETCOUNT[] = {255, 255, 255, 255, 'c', 'o', 'u', '2'}; static const unsigned char SERVERBROWSE_COUNT[] = {255, 255, 255, 255, 's', 'i', 'z', '2'}; static const unsigned char SERVERBROWSE_GETINFO[] = {255, 255, 255, 255, 'g', 'i', 'e', '3'}; static const unsigned char SERVERBROWSE_INFO[] = {255, 255, 255, 255, 'i', 'n', 'f', '3'}; static const unsigned char SERVERBROWSE_FWCHECK[] = {255, 255, 255, 255, 'f', 'w', '?', '?'}; static const unsigned char SERVERBROWSE_FWRESPONSE[] = {255, 255, 255, 255, 'f', 'w', '!', '!'}; static const unsigned char SERVERBROWSE_FWOK[] = {255, 255, 255, 255, 'f', 'w', 'o', 'k'}; static const unsigned char SERVERBROWSE_FWERROR[] = {255, 255, 255, 255, 'f', 'w', 'e', 'r'}; // packet headers for the 0.5 branch struct CMastersrvAddrLegacy { unsigned char m_aIp[4]; unsigned char m_aPort[2]; }; static const unsigned char SERVERBROWSE_HEARTBEAT_LEGACY[] = {255, 255, 255, 255, 'b', 'e', 'a', 't'}; static const unsigned char SERVERBROWSE_GETLIST_LEGACY[] = {255, 255, 255, 255, 'r', 'e', 'q', 't'}; static const unsigned char SERVERBROWSE_LIST_LEGACY[] = {255, 255, 255, 255, 'l', 'i', 's', 't'}; static const unsigned char SERVERBROWSE_GETCOUNT_LEGACY[] = {255, 255, 255, 255, 'c', 'o', 'u', 'n'}; static const unsigned char SERVERBROWSE_COUNT_LEGACY[] = {255, 255, 255, 255, 's', 'i', 'z', 'e'}; #endif teeworlds-0.6.2+dfsg/src/osxlaunch/0000755000175000017500000000000012140200333016225 5ustar felixfelixteeworlds-0.6.2+dfsg/src/osxlaunch/client.h0000644000175000017500000000054112140200333017654 0ustar felixfelix#ifndef OSXLAUNCH_CLIENT_H #define OSXLAUNCH_CLIENT_H /* SDLMain.m - main entry point for our Cocoa-ized SDL app Initial Version: Darrell Walisser Non-NIB-Code & other changes: Max Horn Feel free to customize this file to suit your needs */ #import @interface SDLMain : NSObject @end #endif teeworlds-0.6.2+dfsg/src/osxlaunch/client.m0000644000175000017500000002372312140200333017670 0ustar felixfelix/* SDLMain.m - main entry point for our Cocoa-ized SDL app Initial Version: Darrell Walisser Non-NIB-Code & other changes: Max Horn Feel free to customize this file to suit your needs */ #import #import "client.h" #import /* for MAXPATHLEN */ #import /* For some reaon, Apple removed setAppleMenu from the headers in 10.4, but the method still is there and works. To avoid warnings, we declare it ourselves here. */ @interface NSApplication(SDL_Missing_Methods) - (void)setAppleMenu:(NSMenu *)menu; @end /* Use this flag to determine whether we use SDLMain.nib or not */ #define SDL_USE_NIB_FILE 0 /* Use this flag to determine whether we use CPS (docking) or not */ #define SDL_USE_CPS 1 #ifdef SDL_USE_CPS /* Portions of CPS.h */ typedef struct CPSProcessSerNum { UInt32 lo; UInt32 hi; } CPSProcessSerNum; extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn); extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn); #endif /* SDL_USE_CPS */ static int gArgc; static char **gArgv; static BOOL gFinderLaunch; static BOOL gCalledAppMainline = FALSE; static NSString *getApplicationName(void) { NSDictionary *dict; NSString *appName = 0; /* Determine the application name */ dict = (NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle()); if (dict) appName = [dict objectForKey: @"CFBundleName"]; if (![appName length]) appName = [[NSProcessInfo processInfo] processName]; return appName; } #if SDL_USE_NIB_FILE /* A helper category for NSString */ @interface NSString (ReplaceSubString) - (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString; @end #endif @interface SDLApplication : NSApplication @end @implementation SDLApplication /* Invoked from the Quit menu item */ - (void)terminate:(id)sender { /* Post a SDL_QUIT event */ SDL_Event event; event.type = SDL_QUIT; SDL_PushEvent(&event); } @end /* The main class of the application, the application's delegate */ @implementation SDLMain /* Set the working directory to the .app's parent directory */ - (void) setupWorkingDirectory:(BOOL)shouldChdir { NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; [[NSFileManager defaultManager] changeCurrentDirectoryPath:resourcePath]; } #if SDL_USE_NIB_FILE /* Fix menu to contain the real app name instead of "SDL App" */ - (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName { NSRange aRange; NSEnumerator *enumerator; NSMenuItem *menuItem; aRange = [[aMenu title] rangeOfString:@"SDL App"]; if (aRange.length != 0) [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]]; enumerator = [[aMenu itemArray] objectEnumerator]; while ((menuItem = [enumerator nextObject])) { aRange = [[menuItem title] rangeOfString:@"SDL App"]; if (aRange.length != 0) [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]]; if ([menuItem hasSubmenu]) [self fixMenu:[menuItem submenu] withAppName:appName]; } [ aMenu sizeToFit ]; } #else static void setApplicationMenu(void) { /* warning: this code is very odd */ NSMenu *appleMenu; NSMenuItem *menuItem; NSString *title; NSString *appName; appName = getApplicationName(); appleMenu = [[NSMenu alloc] initWithTitle:@""]; /* Add menu items */ title = [@"About " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [appleMenu addItem:[NSMenuItem separatorItem]]; title = [@"Hide " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"]; menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; [appleMenu addItem:[NSMenuItem separatorItem]]; title = [@"Quit " stringByAppendingString:appName]; [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"]; /* Put menu into the menubar */ menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; [menuItem setSubmenu:appleMenu]; [[NSApp mainMenu] addItem:menuItem]; /* Tell the application object that this is now the application menu */ [NSApp setAppleMenu:appleMenu]; /* Finally give up our references to the objects */ [appleMenu release]; [menuItem release]; } /* Create a window menu */ static void setupWindowMenu(void) { NSMenu *windowMenu; NSMenuItem *windowMenuItem; NSMenuItem *menuItem; windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; /* "Minimize" item */ menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; [windowMenu addItem:menuItem]; [menuItem release]; /* Put menu into the menubar */ windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; [windowMenuItem setSubmenu:windowMenu]; [[NSApp mainMenu] addItem:windowMenuItem]; /* Tell the application object that this is now the window menu */ [NSApp setWindowsMenu:windowMenu]; /* Finally give up our references to the objects */ [windowMenu release]; [windowMenuItem release]; } /* Replacement for NSApplicationMain */ static void CustomApplicationMain (int argc, char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; SDLMain *sdlMain; /* Ensure the application object is initialised */ [SDLApplication sharedApplication]; #ifdef SDL_USE_CPS { CPSProcessSerNum PSN; /* Tell the dock about us */ if (!CPSGetCurrentProcess(&PSN)) if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103)) if (!CPSSetFrontProcess(&PSN)) [SDLApplication sharedApplication]; } #endif /* SDL_USE_CPS */ /* Set up the menubar */ [NSApp setMainMenu:[[NSMenu alloc] init]]; setApplicationMenu(); setupWindowMenu(); /* Create SDLMain and make it the app delegate */ sdlMain = [[SDLMain alloc] init]; [NSApp setDelegate:sdlMain]; /* Start the main event loop */ [NSApp run]; [sdlMain release]; [pool release]; } #endif /* * Catch document open requests...this lets us notice files when the app * was launched by double-clicking a document, or when a document was * dragged/dropped on the app's icon. You need to have a * CFBundleDocumentsType section in your Info.plist to get this message, * apparently. * * Files are added to gArgv, so to the app, they'll look like command line * arguments. Previously, apps launched from the finder had nothing but * an argv[0]. * * This message may be received multiple times to open several docs on launch. * * This message is ignored once the app's mainline has been called. */ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { const char *temparg; size_t arglen; char *arg; char **newargv; if (!gFinderLaunch) /* MacOS is passing command line args. */ return FALSE; if (gCalledAppMainline) /* app has started, ignore this document. */ return FALSE; temparg = [filename UTF8String]; arglen = SDL_strlen(temparg) + 1; arg = (char *) SDL_malloc(arglen); if (arg == NULL) return FALSE; newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2)); if (newargv == NULL) { SDL_free(arg); return FALSE; } gArgv = newargv; SDL_strlcpy(arg, temparg, arglen); gArgv[gArgc++] = arg; gArgv[gArgc] = NULL; return TRUE; } /* Called when the internal event loop has just started running */ - (void) applicationDidFinishLaunching: (NSNotification *) note { int status; /* Set the working directory to the .app's parent directory */ [self setupWorkingDirectory:gFinderLaunch]; #if SDL_USE_NIB_FILE /* Set the main menu to contain the real app name instead of "SDL App" */ [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()]; #endif /* Hand off to main application code */ gCalledAppMainline = TRUE; status = SDL_main (gArgc, gArgv); /* We're done, thank you for playing */ exit(status); } @end @implementation NSString (ReplaceSubString) - (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString { unsigned int bufferSize; unsigned int selfLen = [self length]; unsigned int aStringLen = [aString length]; unichar *buffer; NSRange localRange; NSString *result; bufferSize = selfLen + aStringLen - aRange.length; buffer = NSAllocateMemoryPages(bufferSize*sizeof(unichar)); /* Get first part into buffer */ localRange.location = 0; localRange.length = aRange.location; [self getCharacters:buffer range:localRange]; /* Get middle part into buffer */ localRange.location = 0; localRange.length = aStringLen; [aString getCharacters:(buffer+aRange.location) range:localRange]; /* Get last part into buffer */ localRange.location = aRange.location + aRange.length; localRange.length = selfLen - localRange.location; [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange]; /* Build output string */ result = [NSString stringWithCharacters:buffer length:bufferSize]; NSDeallocateMemoryPages(buffer, bufferSize); return result; } @end #ifdef main #undef main #endif /* Main entry point to executable - should *not* be SDL_main! */ int main (int argc, char **argv) { /* Copy the arguments into a global variable */ /* This is passed if we are launched by double-clicking */ if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { gArgv = (char **) SDL_malloc(sizeof (char *) * 2); gArgv[0] = argv[0]; gArgv[1] = NULL; gArgc = 1; gFinderLaunch = YES; } else { int i; gArgc = argc; gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1)); for (i = 0; i <= argc; i++) gArgv[i] = argv[i]; gFinderLaunch = NO; } #if SDL_USE_NIB_FILE [SDLApplication poseAsClass:[NSApplication class]]; NSApplicationMain (argc, argv); #else CustomApplicationMain (argc, argv); #endif return 0; } teeworlds-0.6.2+dfsg/src/osxlaunch/server.m0000644000175000017500000000532512140200333017716 0ustar felixfelix#import @interface ServerView : NSTextView { NSTask *task; NSFileHandle *file; } - (void)listenTo: (NSTask*)t; @end @implementation ServerView - (void)listenTo: (NSTask*)t; { NSPipe *pipe; task = t; pipe = [NSPipe pipe]; [task setStandardOutput: pipe]; file = [pipe fileHandleForReading]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(outputNotification:) name: NSFileHandleReadCompletionNotification object: file]; [file readInBackgroundAndNotify]; } - (void) outputNotification: (NSNotification *) notification { NSData *data = [[[notification userInfo] objectForKey: NSFileHandleNotificationDataItem] retain]; NSString *string = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding]; NSAttributedString *attrstr = [[NSAttributedString alloc] initWithString: string]; [[self textStorage] appendAttributedString: attrstr]; int length = [[self textStorage] length]; NSRange range = NSMakeRange(length, 0); [self scrollRangeToVisible: range]; [attrstr release]; [string release]; [file readInBackgroundAndNotify]; } -(void)windowWillClose:(NSNotification *)notification { [task terminate]; [NSApp terminate:self]; } @end void runServer() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSApp = [NSApplication sharedApplication]; NSBundle* mainBundle = [NSBundle mainBundle]; NSTask *task; task = [[NSTask alloc] init]; [task setCurrentDirectoryPath: [mainBundle resourcePath]]; // get a server config NSOpenPanel* openDlg = [NSOpenPanel openPanel]; [openDlg setCanChooseFiles:YES]; if([openDlg runModalForDirectory:nil file:nil] != NSOKButton) return; NSArray* filenames = [openDlg filenames]; if([filenames count] != 1) return; NSString* filename = [filenames objectAtIndex: 0]; NSArray* arguments = [NSArray arrayWithObjects: @"-f", filename, nil]; // run server NSWindow *window; ServerView *view; NSRect graphicsRect; graphicsRect = NSMakeRect(100.0, 1000.0, 600.0, 400.0); window = [[NSWindow alloc] initWithContentRect: graphicsRect styleMask: NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask backing: NSBackingStoreBuffered defer: NO]; [window setTitle: @"Teeworlds Server"]; view = [[[ServerView alloc] initWithFrame: graphicsRect] autorelease]; [view setEditable: NO]; [view setRulerVisible: YES]; [window setContentView: view]; [window setDelegate: view]; [window makeKeyAndOrderFront: nil]; [view listenTo: task]; [task setLaunchPath: [mainBundle pathForAuxiliaryExecutable: @"teeworlds_srv"]]; [task setArguments: arguments]; [task launch]; [NSApp run]; [task terminate]; [NSApp release]; [pool release]; } int main (int argc, char **argv) { runServer(); return 0; } teeworlds-0.6.2+dfsg/src/tools/0000755000175000017500000000000012140200333015361 5ustar felixfelixteeworlds-0.6.2+dfsg/src/tools/crapnet.cpp0000644000175000017500000001073012140200333017522 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include struct CPacket { CPacket *m_pPrev; CPacket *m_pNext; NETADDR m_SendTo; int64 m_Timestamp; int m_ID; int m_DataSize; char m_aData[1]; }; static CPacket *m_pFirst = (CPacket *)0; static CPacket *m_pLast = (CPacket *)0; static int m_CurrentLatency = 0; struct CPingConfig { int m_Base; int m_Flux; int m_Spike; int m_Loss; int m_Delay; int m_DelayFreq; }; static CPingConfig m_aConfigPings[] = { // base flux spike loss delay delayfreq {0, 0, 0, 0, 0, 0}, {40, 20, 100, 0, 0, 0}, {140, 40, 200, 0, 0, 0}, }; static int m_ConfigNumpingconfs = sizeof(m_aConfigPings)/sizeof(CPingConfig); static int m_ConfigInterval = 10; // seconds between different pingconfigs static int m_ConfigLog = 0; static int m_ConfigReorder = 0; void Run(int Port, NETADDR Dest) { NETADDR Src = {NETTYPE_IPV4, {0,0,0,0}, Port}; NETSOCKET Socket = net_udp_create(Src); char aBuffer[1024*2]; int ID = 0; int Delaycounter = 0; while(1) { static int Lastcfg = 0; int n = ((time_get()/time_freq())/m_ConfigInterval) % m_ConfigNumpingconfs; CPingConfig Ping = m_aConfigPings[n]; if(n != Lastcfg) dbg_msg("crapnet", "cfg = %d", n); Lastcfg = n; // handle incomming packets while(1) { // fetch data int DataTrash = 0; NETADDR From; int Bytes = net_udp_recv(Socket, &From, aBuffer, 1024*2); if(Bytes <= 0) break; if((rand()%100) < Ping.m_Loss) // drop the packet { if(m_ConfigLog) dbg_msg("crapnet", "dropped packet"); continue; } // create new packet CPacket *p = (CPacket *)mem_alloc(sizeof(CPacket)+Bytes, 1); if(net_addr_comp(&From, &Dest) == 0) p->m_SendTo = Src; // from the server else { Src = From; // from the client p->m_SendTo = Dest; } // queue packet p->m_pPrev = m_pLast; p->m_pNext = 0; if(m_pLast) m_pLast->m_pNext = p; else { m_pFirst = p; m_pLast = p; } m_pLast = p; // set data in packet p->m_Timestamp = time_get(); p->m_DataSize = Bytes; p->m_ID = ID++; mem_copy(p->m_aData, aBuffer, Bytes); if(ID > 20 && Bytes > 6 && DataTrash) { p->m_aData[6+(rand()%(Bytes-6))] = rand()&255; // modify a byte if((rand()%10) == 0) { p->m_DataSize -= rand()%32; if(p->m_DataSize < 6) p->m_DataSize = 6; } } if(Delaycounter <= 0) { if(Ping.m_Delay) p->m_Timestamp += (time_freq()*1000)/Ping.m_Delay; Delaycounter = Ping.m_DelayFreq; } Delaycounter--; if(m_ConfigLog) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&From, aAddrStr, sizeof(aAddrStr), true); dbg_msg("crapnet", "<< %08d %s (%d)", p->m_ID, aAddrStr, p->m_DataSize); } } // /*while(1) {*/ CPacket *p = 0; CPacket *pNext = m_pFirst; while(1) { p = pNext; if(!p) break; pNext = p->m_pNext; if((time_get()-p->m_Timestamp) > m_CurrentLatency) { char aFlags[] = " "; if(m_ConfigReorder && (rand()%2) == 0 && p->m_pNext) { aFlags[0] = 'R'; p = m_pFirst->m_pNext; } if(p->m_pNext) p->m_pNext->m_pPrev = p->m_pPrev; else m_pLast = p->m_pPrev; if(p->m_pPrev) p->m_pPrev->m_pNext = p->m_pNext; else m_pFirst = p->m_pNext; /*CPacket *cur = first; while(cur) { dbg_assert(cur != p, "p still in list"); cur = cur->next; }*/ // send and remove packet //if((rand()%20) != 0) // heavy packetloss net_udp_send(Socket, &p->m_SendTo, p->m_aData, p->m_DataSize); // update lag double Flux = rand()/(double)RAND_MAX; int MsSpike = Ping.m_Spike; int MsFlux = Ping.m_Flux; int MsPing = Ping.m_Base; m_CurrentLatency = ((time_freq()*MsPing)/1000) + (int64)(((time_freq()*MsFlux)/1000)*Flux); // 50ms if(MsSpike && (p->m_ID%100) == 0) { m_CurrentLatency += (time_freq()*MsSpike)/1000; aFlags[1] = 'S'; } if(m_ConfigLog) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&p->m_SendTo, aAddrStr, sizeof(aAddrStr), true); dbg_msg("crapnet", ">> %08d %s (%d) %s", p->m_ID, aAddrStr, p->m_DataSize, aFlags); } mem_free(p); } } thread_sleep(1); } } int main(int argc, char **argv) // ignore_convention { NETADDR Addr = {NETTYPE_IPV4, {127,0,0,1},8303}; dbg_logger_stdout(); Run(8302, Addr); return 0; } teeworlds-0.6.2+dfsg/src/tools/dilate.cpp0000644000175000017500000000423112140200333017327 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include typedef struct { unsigned char r, g, b, a; } CPixel; static void Dilate(int w, int h, CPixel *pSrc, CPixel *pDest) { int ix, iy; const int xo[] = {0, -1, 1, 0}; const int yo[] = {-1, 0, 0, 1}; int m = 0; for(int y = 0; y < h; y++) { for(int x = 0; x < w; x++, m++) { pDest[m] = pSrc[m]; if(pSrc[m].a) continue; for(int c = 0; c < 4; c++) { ix = clamp(x + xo[c], 0, w-1); iy = clamp(y + yo[c], 0, h-1); int k = iy*w+ix; if(pSrc[k].a) { pDest[m] = pSrc[k]; pDest[m].a = 255; break; } } } } } static void CopyAlpha(int w, int h, CPixel *pSrc, CPixel *pDest) { int m = 0; for(int y = 0; y < h; y++) for(int x = 0; x < w; x++, m++) pDest[m].a = pSrc[m].a; } int DilateFile(const char *pFileName) { png_t Png; CPixel *pBuffer[3] = {0,0,0}; png_init(0, 0); png_open_file(&Png, pFileName); if(Png.color_type != PNG_TRUECOLOR_ALPHA) { dbg_msg("dilate", "%s: not an RGBA image", pFileName); return 1; } pBuffer[0] = (CPixel*)mem_alloc(Png.width*Png.height*sizeof(CPixel), 1); pBuffer[1] = (CPixel*)mem_alloc(Png.width*Png.height*sizeof(CPixel), 1); pBuffer[2] = (CPixel*)mem_alloc(Png.width*Png.height*sizeof(CPixel), 1); png_get_data(&Png, (unsigned char *)pBuffer[0]); png_close_file(&Png); int w = Png.width; int h = Png.height; Dilate(w, h, pBuffer[0], pBuffer[1]); for(int i = 0; i < 5; i++) { Dilate(w, h, pBuffer[1], pBuffer[2]); Dilate(w, h, pBuffer[2], pBuffer[1]); } CopyAlpha(w, h, pBuffer[0], pBuffer[1]); // save here png_open_file_write(&Png, pFileName); png_set_data(&Png, w, h, 8, PNG_TRUECOLOR_ALPHA, (unsigned char *)pBuffer[1]); png_close_file(&Png); return 0; } int main(int argc, const char **argv) { dbg_logger_stdout(); if(argc == 1) { dbg_msg("Usage", "%s FILE1 [ FILE2... ]", argv[0]); return -1; } for(int i = 1; i < argc; i++) DilateFile(argv[i]); return 0; } teeworlds-0.6.2+dfsg/src/tools/fake_server.cpp0000644000175000017500000001051312140200333020361 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include //rand #include #include #include #include CNetServer *pNet; int Progression = 50; int GameType = 0; int Flags = 0; const char *pVersion = "trunk"; const char *pMap = "somemap"; const char *pServerName = "unnamed server"; NETADDR aMasterServers[16] = {{0,{0},0}}; int NumMasters = 0; const char *PlayerNames[16] = {0}; int PlayerScores[16] = {0}; int NumPlayers = 0; int MaxPlayers = 0; char aInfoMsg[1024]; int aInfoMsgSize; static void SendHeartBeats() { static unsigned char aData[sizeof(SERVERBROWSE_HEARTBEAT) + 2]; CNetChunk Packet; mem_copy(aData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)); Packet.m_ClientID = -1; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = sizeof(SERVERBROWSE_HEARTBEAT) + 2; Packet.m_pData = &aData; /* supply the set port that the master can use if it has problems */ aData[sizeof(SERVERBROWSE_HEARTBEAT)] = 0; aData[sizeof(SERVERBROWSE_HEARTBEAT)+1] = 0; for(int i = 0; i < NumMasters; i++) { Packet.m_Address = aMasterServers[i]; pNet->Send(&Packet); } } static void WriteStr(const char *pStr) { int l = str_length(pStr)+1; mem_copy(&aInfoMsg[aInfoMsgSize], pStr, l); aInfoMsgSize += l; } static void WriteInt(int i) { char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%d", i); WriteStr(aBuf); } static void BuildInfoMsg() { aInfoMsgSize = sizeof(SERVERBROWSE_INFO); mem_copy(aInfoMsg, SERVERBROWSE_INFO, aInfoMsgSize); WriteInt(-1); WriteStr(pVersion); WriteStr(pServerName); WriteStr(pMap); WriteInt(GameType); WriteInt(Flags); WriteInt(Progression); WriteInt(NumPlayers); WriteInt(MaxPlayers); for(int i = 0; i < NumPlayers; i++) { WriteStr(PlayerNames[i]); WriteInt(PlayerScores[i]); } } static void SendServerInfo(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = aInfoMsgSize; p.m_pData = aInfoMsg; pNet->Send(&p); } static void SendFWCheckResponse(NETADDR *pAddr) { CNetChunk p; p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_DataSize = sizeof(SERVERBROWSE_FWRESPONSE); p.m_pData = SERVERBROWSE_FWRESPONSE; pNet->Send(&p); } static int Run() { int64 NextHeartBeat = 0; NETADDR BindAddr = {NETTYPE_IPV4, {0},0}; if(!pNet->Open(BindAddr, 0, 0, 0, 0)) return 0; while(1) { CNetChunk p; pNet->Update(); while(pNet->Recv(&p)) { if(p.m_ClientID == -1) { if(p.m_DataSize == sizeof(SERVERBROWSE_GETINFO) && mem_comp(p.m_pData, SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)) == 0) { SendServerInfo(&p.m_Address); } else if(p.m_DataSize == sizeof(SERVERBROWSE_FWCHECK) && mem_comp(p.m_pData, SERVERBROWSE_FWCHECK, sizeof(SERVERBROWSE_FWCHECK)) == 0) { SendFWCheckResponse(&p.m_Address); } } } /* send heartbeats if needed */ if(NextHeartBeat < time_get()) { NextHeartBeat = time_get()+time_freq()*(15+(rand()%15)); SendHeartBeats(); } thread_sleep(100); } } int main(int argc, char **argv) { pNet = new CNetServer; while(argc) { // ? /*if(str_comp(*argv, "-m") == 0) { argc--; argv++; net_host_lookup(*argv, &aMasterServers[NumMasters], NETTYPE_IPV4); argc--; argv++; aMasterServers[NumMasters].port = str_toint(*argv); NumMasters++; } else */if(str_comp(*argv, "-p") == 0) { argc--; argv++; PlayerNames[NumPlayers++] = *argv; argc--; argv++; PlayerScores[NumPlayers] = str_toint(*argv); } else if(str_comp(*argv, "-a") == 0) { argc--; argv++; pMap = *argv; } else if(str_comp(*argv, "-x") == 0) { argc--; argv++; MaxPlayers = str_toint(*argv); } else if(str_comp(*argv, "-t") == 0) { argc--; argv++; GameType = str_toint(*argv); } else if(str_comp(*argv, "-g") == 0) { argc--; argv++; Progression = str_toint(*argv); } else if(str_comp(*argv, "-f") == 0) { argc--; argv++; Flags = str_toint(*argv); } else if(str_comp(*argv, "-n") == 0) { argc--; argv++; pServerName = *argv; } argc--; argv++; } BuildInfoMsg(); int RunReturn = Run(); delete pNet; return RunReturn; } teeworlds-0.6.2+dfsg/src/tools/map_resave.cpp0000644000175000017500000000223012140200333020204 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include int main(int argc, const char **argv) { IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); int Index, ID = 0, Type = 0, Size; void *pPtr; char aFileName[1024]; CDataFileReader DataFile; CDataFileWriter df; if(!pStorage || argc != 3) return -1; str_format(aFileName, sizeof(aFileName), "%s", argv[2]); if(!DataFile.Open(pStorage, argv[1], IStorage::TYPE_ALL)) return -1; if(!df.Open(pStorage, aFileName)) return -1; // add all items for(Index = 0; Index < DataFile.NumItems(); Index++) { pPtr = DataFile.GetItem(Index, &Type, &ID); Size = DataFile.GetItemSize(Index); df.AddItem(Type, ID, Size, pPtr); } // add all data for(Index = 0; Index < DataFile.NumData(); Index++) { pPtr = DataFile.GetData(Index); Size = DataFile.GetDataSize(Index); df.AddData(Size, pPtr); } DataFile.Close(); df.Finish(); return 0; } teeworlds-0.6.2+dfsg/src/tools/map_version.cpp0000644000175000017500000000377712140200333020425 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include #include static IOHANDLE s_File = 0; static IStorage *s_pStorage = 0; static IEngineMap *s_pEngineMap = 0; int MaplistCallback(const char *pName, int IsDir, int DirType, void *pUser) { int l = str_length(pName); if(l < 4 || IsDir || str_comp(pName+l-4, ".map") != 0) return 0; char aBuf[128]; str_format(aBuf, sizeof(aBuf), "maps/%s", pName); if(!s_pEngineMap->Load(aBuf)) return 0; unsigned MapCrc = s_pEngineMap->Crc(); s_pEngineMap->Unload(); IOHANDLE MapFile = s_pStorage->OpenFile(aBuf, IOFLAG_READ, DirType); unsigned MapSize = io_length(MapFile); io_close(MapFile); char aMapName[8]; str_copy(aMapName, pName, min((int)sizeof(aMapName),l-3)); str_format(aBuf, sizeof(aBuf), "\t{\"%s\", {0x%02x, 0x%02x, 0x%02x, 0x%02x}, {0x%02x, 0x%02x, 0x%02x, 0x%02x}},\n", aMapName, (MapCrc>>24)&0xff, (MapCrc>>16)&0xff, (MapCrc>>8)&0xff, MapCrc&0xff, (MapSize>>24)&0xff, (MapSize>>16)&0xff, (MapSize>>8)&0xff, MapSize&0xff); io_write(s_File, aBuf, str_length(aBuf)); return 0; } int main(int argc, const char **argv) // ignore_convention { IKernel *pKernel = IKernel::Create(); s_pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); s_pEngineMap = CreateEngineMap(); bool RegisterFail = !pKernel->RegisterInterface(s_pStorage); RegisterFail |= !pKernel->RegisterInterface(s_pEngineMap); if(RegisterFail) return -1; s_File = s_pStorage->OpenFile("map_version.txt", IOFLAG_WRITE, 1); if(s_File) { io_write(s_File, "static CMapVersion s_aMapVersionList[] = {\n", str_length("static CMapVersion s_aMapVersionList[] = {\n")); s_pStorage->ListDirectory(1, "maps", MaplistCallback, 0); io_write(s_File, "};\n", str_length("};\n")); io_close(s_File); } return 0; } teeworlds-0.6.2+dfsg/src/tools/packetgen.cpp0000644000175000017500000000152112140200333020025 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include enum { NUM_SOCKETS = 64 }; void Run(NETADDR Dest) { NETSOCKET aSockets[NUM_SOCKETS]; for(int i = 0; i < NUM_SOCKETS; i++) { NETADDR BindAddr = {NETTYPE_IPV4, {0}, 0}; aSockets[i] = net_udp_create(BindAddr); } while(1) { unsigned char aData[1024]; int Size = 0; int SocketToUse = 0; io_read(io_stdin(), &Size, 2); io_read(io_stdin(), &SocketToUse, 1); Size %= 256; SocketToUse %= NUM_SOCKETS; io_read(io_stdin(), aData, Size); net_udp_send(aSockets[SocketToUse], &Dest, aData, Size); } } int main(int argc, char **argv) { NETADDR Dest = {NETTYPE_IPV4, {127,0,0,1}, 8303}; Run(Dest); return 0; } teeworlds-0.6.2+dfsg/src/tools/tileset_borderadd.cpp0000644000175000017500000000357712140200333021560 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include typedef struct { unsigned char r, g, b, a; } CPixel; static void TilesetBorderadd(int w, int h, CPixel *pSrc, CPixel *pDest) { int TileW = w/16; int TileH = h/16; for(int tx = 0; tx < 16; tx++) { for(int ty = 0; ty < 16; ty++) { for(int x = 0; x < TileW + 4; x++) { for(int y = 0; y < TileH + 4; y++) { int SourceX = tx * TileW + clamp(x - 2, 0, TileW - 1); int SourceY = ty * TileH + clamp(y - 2, 0, TileH - 1); int DestX = tx * (TileW + 4) + x; int DestY = ty * (TileH + 4) + y; int SourceI = SourceY * w + SourceX; int DestI = DestY * (w + 16 * 4) + DestX; pDest[DestI] = pSrc[SourceI]; } } } } } int FixFile(const char *pFileName) { png_t Png; CPixel *pBuffer[2] = {0,0}; png_init(0, 0); png_open_file(&Png, pFileName); if(Png.color_type != PNG_TRUECOLOR_ALPHA) { dbg_msg("tileset_borderadd", "%s: not an RGBA image", pFileName); return 1; } int w = Png.width; int h = Png.height; pBuffer[0] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); pBuffer[1] = (CPixel*)mem_alloc((w+16*4)*(h+16*4)*sizeof(CPixel), 1); png_get_data(&Png, (unsigned char *)pBuffer[0]); png_close_file(&Png); TilesetBorderadd(w, h, pBuffer[0], pBuffer[1]); // save here png_open_file_write(&Png, pFileName); png_set_data(&Png, w + 16 * 4, h + 16 * 4, 8, PNG_TRUECOLOR_ALPHA, (unsigned char *)pBuffer[1]); png_close_file(&Png); return 0; } int main(int argc, const char **argv) { dbg_logger_stdout(); if(argc == 1) { dbg_msg("Usage", "%s FILE1 [ FILE2... ]", argv[0]); return -1; } for(int i = 1; i < argc; i++) FixFile(argv[i]); return 0; } teeworlds-0.6.2+dfsg/src/tools/tileset_borderfix.cpp0000644000175000017500000000447512140200333021614 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include typedef struct { unsigned char r, g, b, a; } CPixel; static CPixel Sample(int x, int y, int w, int h, CPixel *pData, int Pitch, float u, float v) { x = x + (int)(w*u); y = y + (int)(h*v); return pData[y*Pitch+x]; } static void TilesetBorderfix(int w, int h, CPixel *pSrc, CPixel *pDest) { int TileW = w/16; int TileH = h/16; mem_zero(pDest, sizeof(CPixel)*w*h); for(int ty = 0; ty < 16; ty++) { for(int tx = 0; tx < 16; tx++) { for(int y = 0; y < TileH-2; y++) { for(int x = 0; x < TileW-2; x++) { float u = 0.5f/TileW + x/(float)(TileW-2); float v = 0.5f/TileH + y/(float)(TileH-2); int k = (ty*TileH+1+y)*w + tx*TileW+x+1; pDest[k] = Sample(tx*TileW, ty*TileH, TileW, TileH, pSrc, w, u, v); if(x == 0) pDest[k-1] = pDest[k]; if(x == TileW-2-1) pDest[k+1] = pDest[k]; if(y == 0) pDest[k-w] = pDest[k]; if(y == TileH-2-1) pDest[k+w] = pDest[k]; if(x == 0 && y == 0) pDest[k-w-1] = pDest[k]; if(x == TileW-2-1 && y == 0) pDest[k-w+1] = pDest[k]; if(x == 0 && y == TileH-2-1) pDest[k+w-1] = pDest[k]; if(x == TileW-2-1 && y == TileH-2-1) pDest[k+w+1] = pDest[k]; } } } } } int FixFile(const char *pFileName) { png_t Png; CPixel *pBuffer[2] = {0,0}; png_init(0, 0); png_open_file(&Png, pFileName); if(Png.color_type != PNG_TRUECOLOR_ALPHA) { dbg_msg("tileset_borderfix", "%s: not an RGBA image", pFileName); return 1; } int w = Png.width; int h = Png.height; pBuffer[0] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); pBuffer[1] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); png_get_data(&Png, (unsigned char *)pBuffer[0]); png_close_file(&Png); TilesetBorderfix(w, h, pBuffer[0], pBuffer[1]); // save here png_open_file_write(&Png, pFileName); png_set_data(&Png, w, h, 8, PNG_TRUECOLOR_ALPHA, (unsigned char *)pBuffer[1]); png_close_file(&Png); return 0; } int main(int argc, const char **argv) { dbg_logger_stdout(); if(argc == 1) { dbg_msg("Usage", "%s FILE1 [ FILE2... ]", argv[0]); return -1; } for(int i = 1; i < argc; i++) FixFile(argv[i]); return 0; } teeworlds-0.6.2+dfsg/src/tools/tileset_borderrem.cpp0000644000175000017500000000352512140200333021604 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include typedef struct { unsigned char r, g, b, a; } CPixel; static void TilesetBorderrem(int w, int h, CPixel *pSrc, CPixel *pDest) { int TileW = w/16; int TileH = h/16; for(int tx = 0; tx < 16; tx++) { for(int ty = 0; ty < 16; ty++) { for(int x = 0; x < TileW - 4; x++) { for(int y = 0; y < TileH - 4; y++) { int SourceX = tx * TileW + x + 2; int SourceY = ty * TileH + y + 2; int DestX = tx * (TileW - 4) + x; int DestY = ty * (TileH - 4) + y; int SourceI = SourceY * w + SourceX; int DestI = DestY * (w - 16 * 4) + DestX; pDest[DestI] = pSrc[SourceI]; } } } } } int FixFile(const char *pFileName) { png_t Png; CPixel *pBuffer[2] = {0,0}; png_init(0, 0); png_open_file(&Png, pFileName); if(Png.color_type != PNG_TRUECOLOR_ALPHA) { dbg_msg("tileset_borderrem", "%s: not an RGBA image", pFileName); return 1; } int w = Png.width; int h = Png.height; pBuffer[0] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); pBuffer[1] = (CPixel*)mem_alloc((w-16*4)*(h-16*4)*sizeof(CPixel), 1); png_get_data(&Png, (unsigned char *)pBuffer[0]); png_close_file(&Png); TilesetBorderrem(w, h, pBuffer[0], pBuffer[1]); // save here png_open_file_write(&Png, pFileName); png_set_data(&Png, w - 16 * 4, h - 16 * 4, 8, PNG_TRUECOLOR_ALPHA, (unsigned char *)pBuffer[1]); png_close_file(&Png); return 0; } int main(int argc, const char **argv) { dbg_logger_stdout(); if(argc == 1) { dbg_msg("Usage", "%s FILE1 [ FILE2... ]", argv[0]); return -1; } for(int i = 1; i < argc; i++) FixFile(argv[i]); return 0; } teeworlds-0.6.2+dfsg/src/tools/tileset_borderset.cpp0000644000175000017500000000334112140200333021610 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include typedef struct { unsigned char r, g, b, a; } CPixel; static void TilesetBorderset(int w, int h, CPixel *pSrc, CPixel *pDest) { int TileW = w/16; int TileH = h/16; for(int tx = 0; tx < 16; tx++) { for(int ty = 0; ty < 16; ty++) { for(int x = 0; x < TileW; x++) { for(int y = 0; y < TileH; y++) { #define TILE_INDEX(tx_, ty_, x_, y_) (((ty_) * TileH + (y_)) * w + (tx_) * TileW + (x_)) pDest[TILE_INDEX(tx, ty, x, y)] = pSrc[TILE_INDEX(tx, ty, clamp(x, 2, TileW - 3), clamp(y, 2, TileH - 3))]; } } } } } int FixFile(const char *pFileName) { png_t Png; CPixel *pBuffer[2] = {0,0}; png_init(0, 0); png_open_file(&Png, pFileName); if(Png.color_type != PNG_TRUECOLOR_ALPHA) { dbg_msg("tileset_borderset", "%s: not an RGBA image", pFileName); return 1; } int w = Png.width; int h = Png.height; pBuffer[0] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); pBuffer[1] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); png_get_data(&Png, (unsigned char *)pBuffer[0]); png_close_file(&Png); TilesetBorderset(w, h, pBuffer[0], pBuffer[1]); // save here png_open_file_write(&Png, pFileName); png_set_data(&Png, w, h, 8, PNG_TRUECOLOR_ALPHA, (unsigned char *)pBuffer[1]); png_close_file(&Png); return 0; } int main(int argc, const char **argv) { dbg_logger_stdout(); if(argc == 1) { dbg_msg("Usage", "%s FILE1 [ FILE2... ]", argv[0]); return -1; } for(int i = 1; i < argc; i++) FixFile(argv[i]); return 0; } teeworlds-0.6.2+dfsg/src/versionsrv/0000755000175000017500000000000012140200333016441 5ustar felixfelixteeworlds-0.6.2+dfsg/src/versionsrv/mapversions.h0000644000175000017500000000227412140200333021165 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef VERSIONSRV_MAPVERSIONS_H #define VERSIONSRV_MAPVERSIONS_H static CMapVersion s_aMapVersionList[] = { {"ctf1", {0x06, 0xb5, 0xf1, 0x17}, {0x00, 0x00, 0x12, 0x38}}, {"ctf2", {0x27, 0xbc, 0x5e, 0xac}, {0x00, 0x00, 0x64, 0x1a}}, {"ctf3", {0xa3, 0x73, 0x9d, 0x41}, {0x00, 0x00, 0x17, 0x0f}}, {"ctf4", {0xbe, 0x7c, 0x4d, 0xb9}, {0x00, 0x00, 0x2e, 0xfe}}, {"ctf5", {0xd9, 0x21, 0x29, 0xa0}, {0x00, 0x00, 0x2f, 0x4c}}, {"ctf6", {0x28, 0xc8, 0x43, 0x51}, {0x00, 0x00, 0x69, 0x2f}}, {"ctf7", {0x1d, 0x35, 0x98, 0x72}, {0x00, 0x00, 0x15, 0x87}}, {"dm1", {0xf2, 0x15, 0x9e, 0x6e}, {0x00, 0x00, 0x16, 0xad}}, {"dm2", {0x71, 0x83, 0x98, 0x78}, {0x00, 0x00, 0x21, 0xdf}}, {"dm6", {0x47, 0x4d, 0xa2, 0x35}, {0x00, 0x00, 0x1e, 0x95}}, {"dm7", {0x42, 0x6d, 0xa1, 0x67}, {0x00, 0x00, 0x27, 0x2a}}, {"dm8", {0x85, 0xf1, 0x1e, 0xd6}, {0x00, 0x00, 0x9e, 0xbd}}, {"dm9", {0x42, 0xd4, 0x77, 0x7e}, {0x00, 0x00, 0x20, 0x11}}, }; static const int s_NumMapVersionItems = sizeof(s_aMapVersionList)/sizeof(CMapVersion); #endif teeworlds-0.6.2+dfsg/src/versionsrv/versionsrv.cpp0000644000175000017500000000565412140200333021377 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include #include #include #include "versionsrv.h" #include "mapversions.h" enum { MAX_MAPS_PER_PACKET=48, MAX_PACKETS=16, MAX_MAPS=MAX_MAPS_PER_PACKET*MAX_PACKETS, }; struct CPacketData { int m_Size; struct { unsigned char m_aHeader[sizeof(VERSIONSRV_MAPLIST)]; CMapVersion m_aMaplist[MAX_MAPS_PER_PACKET]; } m_Data; }; CPacketData m_aPackets[MAX_PACKETS]; static int m_NumPackets = 0; static CNetClient g_NetOp; // main void BuildPackets() { CMapVersion *pCurrent = &s_aMapVersionList[0]; int ServersLeft = s_NumMapVersionItems; m_NumPackets = 0; while(ServersLeft && m_NumPackets < MAX_PACKETS) { int Chunk = ServersLeft; if(Chunk > MAX_MAPS_PER_PACKET) Chunk = MAX_MAPS_PER_PACKET; ServersLeft -= Chunk; // copy header mem_copy(m_aPackets[m_NumPackets].m_Data.m_aHeader, VERSIONSRV_MAPLIST, sizeof(VERSIONSRV_MAPLIST)); // copy map versions for(int i = 0; i < Chunk; i++) { m_aPackets[m_NumPackets].m_Data.m_aMaplist[i] = *pCurrent; pCurrent++; } m_aPackets[m_NumPackets].m_Size = sizeof(VERSIONSRV_MAPLIST) + sizeof(CMapVersion)*Chunk; m_NumPackets++; } } void SendVer(NETADDR *pAddr) { CNetChunk p; unsigned char aData[sizeof(VERSIONSRV_VERSION) + sizeof(GAME_RELEASE_VERSION)]; mem_copy(aData, VERSIONSRV_VERSION, sizeof(VERSIONSRV_VERSION)); mem_copy(aData + sizeof(VERSIONSRV_VERSION), GAME_RELEASE_VERSION, sizeof(GAME_RELEASE_VERSION)); p.m_ClientID = -1; p.m_Address = *pAddr; p.m_Flags = NETSENDFLAG_CONNLESS; p.m_pData = aData; p.m_DataSize = sizeof(aData); g_NetOp.Send(&p); } int main(int argc, char **argv) // ignore_convention { NETADDR BindAddr; dbg_logger_stdout(); net_init(); mem_zero(&BindAddr, sizeof(BindAddr)); BindAddr.type = NETTYPE_ALL; BindAddr.port = VERSIONSRV_PORT; if(!g_NetOp.Open(BindAddr, 0)) { dbg_msg("mastersrv", "couldn't start network"); return -1; } BuildPackets(); dbg_msg("versionsrv", "started"); while(1) { g_NetOp.Update(); // process packets CNetChunk Packet; while(g_NetOp.Recv(&Packet)) { if(Packet.m_DataSize == sizeof(VERSIONSRV_GETVERSION) && mem_comp(Packet.m_pData, VERSIONSRV_GETVERSION, sizeof(VERSIONSRV_GETVERSION)) == 0) { SendVer(&Packet.m_Address); } if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) && mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0) { CNetChunk p; p.m_ClientID = -1; p.m_Address = Packet.m_Address; p.m_Flags = NETSENDFLAG_CONNLESS; for(int i = 0; i < m_NumPackets; i++) { p.m_DataSize = m_aPackets[i].m_Size; p.m_pData = &m_aPackets[i].m_Data; g_NetOp.Send(&p); } } } // be nice to the CPU thread_sleep(1); } return 0; } teeworlds-0.6.2+dfsg/src/versionsrv/versionsrv.h0000644000175000017500000000141012140200333021026 0ustar felixfelix/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #ifndef VERSIONSRV_VERSIONSRV_H #define VERSIONSRV_VERSIONSRV_H static const int VERSIONSRV_PORT = 8302; struct CMapVersion { char m_aName[8]; unsigned char m_aCrc[4]; unsigned char m_aSize[4]; }; static const unsigned char VERSIONSRV_GETVERSION[] = {255, 255, 255, 255, 'v', 'e', 'r', 'g'}; static const unsigned char VERSIONSRV_VERSION[] = {255, 255, 255, 255, 'v', 'e', 'r', 's'}; static const unsigned char VERSIONSRV_GETMAPLIST[] = {255, 255, 255, 255, 'v', 'm', 'l', 'g'}; static const unsigned char VERSIONSRV_MAPLIST[] = {255, 255, 255, 255, 'v', 'm', 'l', 's'}; #endif teeworlds-0.6.2+dfsg/storage.cfg0000644000175000017500000000153612140200333015564 0ustar felixfelix#### # This specifies where and in which order Teeworlds looks # for its data (sounds, skins, ...). The search goes top # down which means the first path has the highest priority. # Furthermore the top entry also defines the save path where # all data (settings.cfg, screenshots, ...) are stored. # There are 3 special paths available: # $USERDIR # - ~/.appname on UNIX based systems # - ~/Library/Applications Support/appname on Mac OS X # - %APPDATA%/Appname on Windows based systems # $DATADIR # - the 'data' directory which is part of an official # release # $CURRENTDIR # - current working directory # # # The default file has the following entries: # add_path $USERDIR # add_path $DATADIR # add_path $CURRENTDIR # # A customised one could look like this: # add_path user # add_path mods/mymod #### add_path $USERDIR add_path $DATADIR add_path $CURRENTDIR

z!|Cg)'}[0G#C虇6t5WL &|xeyKIm-{(~H75q;@BƸ,X<^8j2cV@5z%  یtK›N 3sG0 C v3$ U0<_803}t NN1ƹ ԛu@(Ol3^ޝPSQۂ*,}=(:'n- 2G"<07QJQ?. N!cP ;B&,bHB;-|"]y=_2P1k~e[_yמSC]!]J>jk؟>D+cowB<~EOoTe)ti91?OYޝQƗCϱO|ITOP7)}ݏg='ȉí I-Dy5o}Xk\Z+s$NQK+f'DBEo\&,٢:`u@hɲpDeGa_9hSezS[int?=ǯ.'%\ W\ ! Y㈱fBRY?)ɉPL"Kw7}7q`Ns6=*,oGA$\CuU韆.?=P5?d@/ܫBպmE|EI +A"JIv vύRO-LX+dv Uq'Y@%LTa0Ŝ6|'`ƂtZZD=]"`Lj{[XF++nNJ"qdȖ);}V'lZLߩfCh+vr8w /~T&#LހL}E:4ˏXB=iJbP>\7yB^LV#Fteeworlds-0.6.2+dfsg/data/audio/sfx_pickup_arm-03.wv0000644000175000017500000001400212140200333021251 0ustar felixfelixwvpkRBWWWGHJVIe Z/ߎm~_;S߭.e77_ y{}%S??@ߪSu AS90nc0iqww&?ž?Dfߨ9T g _QgpF0FxƻO'( }VRJ'LM@l|m'BFQ]qF-q"o bF5h/]F3R)UlFzl(J0X"SDq\ڝ:6ʼxЎu9EhF\U8Fy^HnAb$BRB% qXZr #T UEmp#G¸T/Lz3tˤ2€k%H?X`ŝɞzׇq"0|yxE*A21'9jכ] /ڿ\-zmGXpǕۉdy]n<`,mgfy& gn0~ F !78ޗt z,m}2 $`ma|Lu|Zkg_la;䊖qf|?%Фr(CzA6QZ+P.ۖ`5ih8S շy,K,}ёFd'0@*buZ#:2 Od2. UasQqP>*Be12vS?( *?rYUgu|hht9^o' ( &Q} wA6u CIaGwm]YǎȿJ?vDy'"\NZAVW4Q M1cipdf$I鯙4Jة4 ).H1eU5u`hA Jm@'?.  ᑢ$ȀɀakG:,P M9< dse1{Eސc ]@FFI.Z{D0ܑq8mWINPڲW m w! _35iMD _PR[7 !A&h/T ji|yd\$D;XMH}Eb*;WzY+qHFܴ<bY9@K$Hke^VMdDm@I~ch;_"p[aWbmDea<ãH-{8SrEbb-ß!& wujtVA. 0ț+GЭx*{ ,ACvخzJ wnh,1< EݒwH !i'׆K/HYF O*Sԁ`|Ҷ 'ߺșzq׫|˶]Vrj|cP-`(}P<&ͱDz6!ge0 cR"HU?T3Ug 1Yϲtr{y153 ~Yjt lVآ%jp{!:odž`I@Nh^+jDz\j1WϤBMxFy q }!@nRXe LF68P!|2 Z Yʖ۬"$DL8&HBjrEdbШ^JV ^1YBW:% h1޻\ᄑ2s dJkB(ADmP0 |TH)s 6ثD i`*6)yiCb0V(ې SsB4O[=(զ@@Nd,1Eo}:&Gj}/. 'uSnYBUM2YW^wx+Y^>80 ʐ;LheJEH8q<7sTиbZʫ.CkjΥ-ulrk+6ePy"P;ĉWcWrd8@W]\bxuC!F61xI .&"wX q}5u m)O E`22njVeڨw 4k%jHz *XG'%69\c}[(^?c467 ˳VhN˕RΥXg:I#˔ +95eS9UX=.@`q0licE'Mt6uG%YvaVpC5cD dڱ BFo!EeU$$KA$.(<2.ZuĸAQ .N4G$Q /fGBʄ}1⸓8q}s׌QR|z kIO$9_P뼅||I_04acP/(h5t;a5fu .= 9#CTІRȲ0 v>'A楿< »*rB@y i9ڮꜺ\Ǣ*k3iR${ ARUPo^AO\\F:>5>#% EbIp)Q^|6ʷ=da߻_B2obJN-X8ۨPBa'x)i0EN6ң<*bM/0],) g]duś3%05HYS!!ܛQ-ĜV6n ^1vyvrvصi=:}W-B+P]ѐg^WB<)Ȱs7΃J9{ ')C>tmdPYZ11ب|(KI 8 v_CZl˙K0?z]=@j3Jf_Q`e?z%@ jp@;\[^MgC{E| V⎶5lmxFw2C6''/ ]0'Բm["aDѰ4oRrwRg&Mk펍vn$!lF.fUƽrbN"@7rE8( IC|we !#aܘ-u5 n^/yagTVOw/-0 yIQPp>dHʹ}Z^X#4eROrx-<=\|+Z{Dw Ȧf,Gcb%['8۱n *Mq %Iq1ZV#n] /%fE&D9n&!=A}pUќK+=!Vyh "%F04\GJx"6+CK$;U' .($wVUj^B t $$@lql5e ˇG8+O___]_~'|aww/z{|ȓYw|4|8'U/*/lOvKZ9O8+kxOk rPD)9n` 2ܽ/z Tz?/aYpʵtO ã|-oƨT_{!,W/;}'<+OsPRz^:@Qq^?VY.ߟYo|k:9SFjߊQysI?/>OA.6E,<eqLR-!:=0֡3W=4.豏YlyhYͤ4m>;"(J*Hа,=͉pZ--} @ƾb WQr.j@i2=Rw^47\;8dh`m;KˀAk ;Y3xN@l s0HhRֲ-M1@/\$pdL0G>Xڅ&=( A.b6w19hGQTֺITMd"5p  x|IcYƓn;"y]MxU:Ca{Zk7l=O!KcD 4 +싂; A,ӑ!S i-KɬtNסK(o[@isbE5+a:6P:WM$&ptF;]d DxPV=;/аózŌW\E9[ v" Ea\D o o:CrɁe?jrM@b(6idӍїŠU%p8=PQ.,zRnQ8ioaۓ>HƳ+FaGN~/d=z:n;55Sv C,8؊6P3y?z닌{r:MhEXMůmoYB@$PNwu`?3~Jwaҫteeworlds-0.6.2+dfsg/data/audio/sfx_pickup_arm-04.wv0000644000175000017500000001314612140200333021262 0ustar felixfelixwvpk^0!2WWWGHJVIe W߿7߿z/*u?ߚ_8Gwzowgg;qfWasܣ'y9?`-ёSr-V5ʹ|4^%Uΰ( *-y$Ÿ5&!~`-ӮDKFNVlh}Zy ͝4zYe6֞xx &隙mnyuas&!~+ƜF LH惞c rK V7"VRChy>2W-A+Rkvz 7ɟ `Y 74SQK%^Xߜ7(OSpdϐҴxzDU}$mns.b:&mKXJu))JiCW_'ś]|FR BHxQ@.A%.mՇn)o+ <Q 4MgoR_q5 "\xQ" rF[:ҋȺp)#Zgxz71d_l2+YgW3E{ؿ/TP'egƧrelv`HMMG="J?N#\8t9,1(Y]3(I!n d8v@NKg_,c_4"gIQuYS+lj͍t̮ҍnc9&O}t*TRIW "†W3_=>0}ٯbg8>> 0Oأ*z/\&Y1yڞd:}g>` |* ^qcf:l^P:)0 %=dX0(F=Z-6G#/0`%݅\@aBPMoƁ JI JaMcK*oWaXq0'2*{6,)k>k`ߔ.w2-B:騉Iu02%QB@~G69%f, x)|8u%L' `T~,wo ʔw#@^O;Sba?je o)45҇Mu[*ENG ^c% s1:T*o$*AWnX kgPZY$Q*WSPHI n=]®< cM2a+DYZ!W&>\sHePd*!A3%^h0 ZP@DHHtNM躓@Y;$(8 im^ 0ުeȆWBFC_ѭjo4[xf)igY21|P5'0xC卫U.bdOyY h3ψM%$y&Ҩٴއ.{n?.`=h ,O   ]ev4ɯ 1"{֜lx C#ȯ@b{q&!̣7oǀSpGa>lx ,>Os 9Gm`Va,al"dm@$EjB(?fZ帨>5z0lJ$TK Ro-ѷش$ÙP{J_\@k򜩠"HARP޺2=(bƩnR{_fVBW/7N~A@7DyE2-bQLa 3:}ƍXH6%w`_SfS fصy@Gpwܴ+E%f9naE=~pF bBȑ|fģ$-<ֳotnll`~vڈǢģ@BO?ǽ;wnx:s#>os /uJ T :bH@Kh0q1R[TAWɍd=&qit|#jOn3#_UZF$‰bPnA&a2eʩ+A{HXnP6Q\7]wis,d|S wa5"/ý?rlaI|^ܗ_O~KT~q 'SD~OKh0G?om]9T=wr{:} 9+svޕ*}oR p `Fe숯,W xϫǩszwKdTe!ˆnemLJ[Uy!xTLZds XE#VA'@\: O٭FE=)ؘgCZ:F 7\z1&.Uס&\8S';]F9l+姣bR&˒UaMrgqnCpeW<]n*j)& 슄Rnz1Տe7D 4x>"n.Ihf=8k)S-T1ùFlÕF[JLyț%`uGa\Zye,9B+ϨĈVl <(ȗVdȽy?OپfYA1y45@S@B 0aZṋDb+%D݇BؽMʁmd´O}2}C9`.9)]2<#t%9:HO't|7%W*#kY5c~V:>݁}tWNadwpVL9f1o/lxbjp8 TK 5 ԅQ-(iz+J>Rě!(>rrb q/,Qn/+4D+!ѷlʏ(%9u%7g 1.qSfIa:9YPjKݝ5;p-o.k+;^G!dB$C]Wks?5Mu|U3a ]`J~JdnН$6iw|D f8+|Եq?J" fMdšzP@:{RCHW^3aۻ܍^A?V++OJ\,MtS|q7qđ`[7 ,"+mTha;67 []o}sܷZ)nnS%)GP#~6+_XL05BMH򊐕ߐSH6ۢ62BU}t#m$Febc#"`B<^ SkZ$5~|̈qOUĨKI jMAx^]& "">8TFq|iAÄWOƲ5ԀfD7 !O]S"iYhІv?N(G ?%/v\*bA$ΞekRk$OgՕx_ Z$ T0F'H `go#cw}+x9`/&1F{akx|%t7L aқ'?VMS[aJ,w6044jH҂QeN%O1VU.|ڥHabrUԑiq \&F8f.Y;"rs $_j̫@t%}AϷhk ϶`۰:j6%Z)hPI*~mg"^>ݩWEC]_p8xMezl}DHh F1V]'v}6얙E xblEo&8a-G}@T gaZn(0,"Ꚃ2Aq|ҺvI'o]YVj, %3ѐ}%\3ˋ;Cp~XXQ“^L9kHzjh4OMvӝ l}vwt`fZs,0 ?dx5<#`YZћN6E8݋fqzrgL<~M/ːI)V!mG 8-& K>}VU <0y".ʕlԹ6 [q~0 D:G"n:p..gG۝Þ?g? ?,9Uvzy3}__-c>94\!}蟜Xkz?r1'TdQEQ˰Ë܆$ή|CUZbZas:/$~r=O\uk-ʔd:E{a #26VK l Ґf{\1(^0ڈ"t%gobhSZXÍ;[E-d\lѪ{|?[! v$s2XI2,V}62N>@RC:pTgk eOUuo&'5  n,/V/}H `}p}9SM,#ϴ9Z~[nay˿nl@1^ H4ͪe?G˄B|T`?/$T!2gC@dys$\G!XR/&o!'DZ̘VSD6μ'p#I1D5Zz #@M{x#_ }s+ѻ1$ˮl!sw>Hu3+5iCfL}\sC̖18j48OXմ;\gNql r=-MNӌI[֌0t#i&Ѣa8KH~ďE{IN3N/<%!aa7}O*7.C;;DhB%nF b|ΐ/kd( E0Abёm~t3zU3?2Eeu#m?`3>Ԫ34{}}# I<ࢯv~qZ:ŘGX~&L<|h"IV"NrD*MD}& ˑ]'&3 .ꁏTIA8LbCyʻZnhus8 Q4pGQaG9v_kۗf#?K^a%My}Zs|z>.̤ir~R݀\"\ ֳ ڠJ,U]兠n{ )IPaZ f,KPHC6jɢ=vE1^ E q lWI(@D ?dY-X6!!La,~]Oz!\@%ܱb`Sc5e ا@N2eQ?xuJr$HO"ӨsLtCJ$<#Re7:lk;ԗh ߯E̵,+ݟGOAE˥Y) 2 8@۞ _h?`up,PwcٵӈCգ>o-1*ZeTt2ifU/bOrk*H_|B$yǕ +8Sd|bL}ʪXZ7:e^{rU8J ] h| 9p|8\B7XOiAޫy>x2bK6čdp 6OތXCLtKT"fi`.bh00j\w:/q9"s!ݍk@,9KR^DUR{%8s8:O:@#[$٧ m7S~p 3,PpԮQM`O%DIDSaIiq h]%!2\b.$֮N)ߜ}6!GF :@@]0 8*3R"EխUz"@r ,p(<v;Kl>Uo7!]NoRRl3D9NIrMk5uP4RKQatm\*I@Xx7Aee~a{$.b >ǎ N5\zy(ݕDMgHag*GfGbcSQtVVXZQ8[L!]NǖP5b{RѶ&YH%ҸzAΆÕ E'L"汿 ai"l;j #ɒ񜯏_B+n.k3AJ `ĐqWAHŢ?솚)WfBvdq:8-Lh#[F8Aͣs :=M~/K-^ tÒXlAntV`d#2l1X&`0T144[{LF`paSFagpѱĬ dywW$ ǖ9&&48ˍ@& G^H&3rj0!gx-Cq WݿY!Fّ/P^\"Ou67z[n4[.t<#[6捂{3y:\L#:ϛ|qKa|'&dYSIVG)6mv(IXY6嗑`&\/ҀQ-}~ ^KKC@ Զ& rFa;oj gBj) jI4%On0NwQ7{]t }-{vz֯&5 ][w}'e75ڲ_ЇY";fU>tJ\iRv*]J%5{6Q{xK8c<*JQLR=:z;^J^ ?eMǫrI}!EY\#ǙYګ_|"ėe1[Q-aT{72H{#Q'>kS#u=br2[L6R:mI l2}cYSGlnPãQNg;skHZiZ^6Z:K yE,y77fw>%ڣ xM}Fƅ%V͕^J4k/ N~*b>Viy:ZcM_ʂfDnC:IeA#\ p.UMذ8CsW6%bnDx^ i :QZWW'QM7J{YI> sf<ב֡FCNIDJt;hپIsx''Ж IW5Hb,MSimrz={-$tE8uzS&A 7y ~̒IX|l|Lhu\]־[ʆ0n٥4&4tY!w;`RG>BȤmt#ږQddDoZ$ LZGӲt 8TێJeBII53hwSXp1O_!td'l,dcZK֟_ѣ++כYlIj k.p?4iHqY&lz j/!0>(|r3NMzH(*,\+efz'z^ ][-.xW%oB1Rc7oOn] ss[_~:J@{_̧;tX/+,nN3DjJ`;B*Ar|J5}Wt⊕#nmlo L1d({}3Py6(}9^Խ.iꌧaȡ3:{&ii߇[nFu,ihis[]2otUH!׹ !躵-[ڮh#Fީׇ 02 ȈaF>U=C!L|ӷH) MM,`u@uF䄳 D}@BCm.&:C؉jaZTDtR||%Dؠ7ψlv3 V[ BҮDYnw0C 3BNd{~@H653s^b7*ߙeiEk'=[ 66_|;+:Xb{S I29j"Wkd,e_l`RUʺak[L MP6S7}sZ|qc5Ȗ EϋhI(iP)Տ T:0!s|0 6Ia0.l a zrD)d/S s`3~]??!uez {[‘'Y_n #űCH⽫`TYGTF_]|nNc~۾T&G i/l m9~b;8?*C8°%^Le$7/mVy a_җdž {<GKm'H "Wub`!-UKg &s}tO CeVSI[2눼rv{71 lh{ЗfQ~tR11c8q?w*9P`<;Fē,[/,o 6~d8Zb(!mQQUWY:[~#+Oԇ[Lٵs﷙waf߀iԎgs_oOna4zH9}ja`vuS1$j@qD%RE5ҘJˆgʧ+tItw ϒjevZN90^}ŊAbhڳN|0m^PF$+2aAk֟f+MAEݥ!q '[s# w?Ty Lx]:[t (+b)HL-ĖȒ $l`K 0:LL{ھ%Ё i%:g y_uD5]wvc@ ܋o< f֙.vAՉ|DҹBnfA4>TJF،p.P@#n 1w5<#{/ݥ=Zz?6B1(9)_`h.pp~Ov F(2%0s봜ZYy*wE*:sw+m*Ri7w2􏿚2ޏCs7oȲ6BxMlTlT‡x=kBs,Nu`v'rIv6eF=f* N;%)@b 9yldw3h3nΝ'=#@x#*X8^+ŝSuNΝ-z@Q]p ys`{''=ޔY%`'ۙU`hhج LspM)xE ̛DN o!܋=Qi͉w?-/W%BËso_E?ɟ55}鏥O\teeworlds-0.6.2+dfsg/data/audio/sfx_pickup_hrt-01.wv0000644000175000017500000001124012140200333021266 0ustar felixfelixwvpk|WWWGHJVIe. h{m{_oߋ+]y|G闶ן~ןLW\fwz-=,FgEU>u%*i,5Iik"`LThSB`)֩4Ԏel;)kFH/|gj_+߯%{ |+8Bq/)[9W.GKsWc`r/bă۩1eߣˢ){[eHUhScq7) {#>~?G?ݒwB{{I| )3dH:m:[{5XTRt͑8[nnTju}Nr\B7MPJYƓr9ϣEQn꺃fTIRyOujs1|'vA^%fdv$Lčq5siQ{GOKli35]o~jw4i]~e%Mn2LƇ"׆ɂe&&] UjNH<ث !R9e,kȓَ=0 TH Vc~,sϹ`_h+7 {bu.e"KN.m"驺zIbsg H`n֔0BGE95Q@ȩC(VniidIO2 Q)-@VxjܞӔ}];_qCi x ƫ*PGHrx?wKpG ?|;.LyyGݵXЪTJGh:Vu{ho7'N4n~彆߲56Sw",m=F5 )ʔa RyN)%Bťq;`>KʱAjr/ ~tq2Gu?o~L#]OCTGRZ7HG[h5q>X#S!ϹW~b,aTG*Xe׆w4WM&Q°m9 ;9]ފGEBl;|Zx%B#5OX@Mv\Jih*ݘe8-u3@9LE*UFxe Nj0@!T&Q>ֆ |ŗnTt"2@n~B( W ɖ95G(^ ĢLKGNG\zՈ ܙ<6C`W׋ɂv)@sx0v,3 qlAG7-b-="(Jk\ʧBԷADah޶ol*Ny=~iC[ud{n k+pd'cEvLccϩN wUn35M݅=2N $33qK>\~ =YAjЛIB)X Z֤u𕳊57*ɚ/L-'js-'<F;Dwk0{ o(8W-p9SHp dH6[]s( ?(gB*H׉3ʮ떨8w'Z5<J~r9";ɀ MB+@*LZ0UkisD& zi:6ЀQn}Yf.AhSKNz(/-A?]K^Vg:s !?+UDR`b$t8f% 7sQ_?yySw+$Sy$0;Ujz1ƣ`Vb֦m=|_͆mR-EQ2gؖآ^aE3ME[#m&;0}KgREeæ|E2S =6La![}:׏2x!F>P=,oIJPBPbԸf3VsomHq\Q´{NNf<ZdkR?i){-_:Ul5@T&m=ðgU{_ G@ \tE&Ds~)f ޑ<5JGG.ɒa8('̣v_C̎- q1$5n2S#ϦGC/uj壓m|ˁIF#B N`"1U"icf}Z4h1D;>: g/jqna2`X=2j# V%q`aU Xd#8t?0&1/SiA#dL?#}^sю"xQ/@ 2\,Iܒ AZhx ɯjSqFE]5vvJMf܍lIɠc9q~JnlA[!wXY+(.O?/HFB)iF[";b)|eZ0 FPH],[X! 167n0k`nS0na0\~L֠,Td)t+XOQ0R`AjĐC:Amz\7r @Eai⫆,H[zaoK4GS_Gge =x-SsHl\pD)W4Q2`\̋cSsʇѺ .@O'CG D}P5'FD_GsV{Dp<K8J[Tg!'r߃]oōt0{sIǯBα~ILw;l4Vr 5gPFށhSG0# ['ex}YEۏYFvl)ܺ( y+`ab%+Q.Tuax5ur/@0>=0s)NkRca,'QgW_5 :}O#97kGnHXȠ>lp3|K;1 ߌߵ[4A)6 kR˗CVyc;R6k; f HN*gٛ B={砇f(|CHW>!TY OJC=@WQӀ ^k݌<B-Dlye j^:|8J- gdu>Bk_> %7،'A\")׊1Ր{Z@G9zdQ RPp͘]58,y~nܧU@P`%Cߍ+8IafK]mX~̛ԑ+ƒAsiۯU-tɈ[.33'S'  HP!X1 J>Q%Ǎ#9Ϻ5V tbG)qT|ӓ1aӧ(">T29' ~zIvV|- pzHҍGp|,0n`e㝲N þا{ 磵OrWw{tSC6CٛqLЄ&'RãF¡f^TAz& lR~eq =Jε/v b-[%Nc$NVip*"fӥpWm:‡Jc,{DzGs-so'Ob4 RzYEo,tw]Hٯ'VU@8C[.e%nŅ-P'Jwv X%F$f63#M}b7 o.Yխ ak~sQ(V80#Fݨh )FOGGm6)hA5G mnkk*+17}F@!sq~&J$VԽE,@~]δN+&J}/WO-)|Cv$i>KG CAOjteeworlds-0.6.2+dfsg/data/audio/sfx_pickup_hrt-02.wv0000644000175000017500000001157612140200333021303 0ustar felixfelixwvpkvCCWWWGHJVIe o9o o6_o{!m߿z6~o ?{o-_J1'"ٷ|(MYSO.4N(.Ē`~rRXվ w//?ս-|: f-Ɓ bLʻ^NI/L 6S5mCJ }WPHem`:Io(-IWuzmAAuit>h>N:b"mu@/[5/yıHl%[*um*Hq?I1 XgaN-5Bw9ùmq ©B~ͦ&Q[g`?':b|cY.'C Ū]"Mz;-O{RxӀl$`,C,ʼMP6ς̸=Fž,B >Mjf7ji Kw`Um6N.(܅ # )77܋ڤA]Z/X^*C{SXn0W EYԮv? yJ8t㝘[%T\eHWj(A'_xo1|{-opb>4n-Glu`5Qg?b]GäIGrS5_䁴 2yD@㯐ū .P)T3rاF G ^CpR c ∖lG$`= J%Z]x5YhD#=|Iܐ%g gnټ(vpq`ZN]]{ZnH\s6x~O.A[P5Mq_ cJ#Jp$K4R A|nHt Ӏճ?*YAMe|22xa^VҀLܶ0KQ`'2V*oV/ۃ".($3\ xX}cbYEoMԉL0GJ|k8n085@|M2L"r%CG]~kZ Pp:*`2<h3yyՍvMsipjTK~aC i=8M\d|Ҟ gT4eu_ڇ'0> dYkz/^SF⽳yG4@98dL=ǏPGbkǵUGT)QU:Jٯ_nbfV L|ԭ˻|E.6c!gk*4x$Bs@RKjgS3։($EyxV&T 8Jn`FGJk&2/mb -׃{vĻ$;jX{SjNmY9VLVgA*Brpc J7P01ZtMevn>^! ϲJ "N_Xem-NP-V^|C(fCaĺ`o sK<^a d<:Pr8 N^?޷6!sN`t]sAdd! 0\G;6N)XYeP*o\J!d em(՝]SL4)A!Bmk9%m_~(ߢ=5VA_+qczv G TX1U6 -&鸏Y}ߙPѥ`kfOJ9q *X f9b} 9'oLe@8hY^rTxc6FޞlFRr[uH!se~5ҧ ۄqeeFB(*BaK~K6Fu#}b:pQ.~dsEZ!rK',wYW!uqq[nh ȦAU,M}24٪x3ˆ +ڃ`!uE\ dBU Qs%q ɀ.uth _ʎnAh\O9|{Pp DhtЎ6ȶ_x+u=c,43LD;f4x\i-.AJcPF/j֙(*|٘33Y?ߟz6f͢0_,Cck qP:VJ[aaN/hg!X8r5`@;W0UfβlY&e)7ˊcƲ$%6QQtDF<>sl%~$O9R }:{ZAŧJ6F)z6j_h~ {G-o.DxmZzc<{LcM\g~g!ʋq&T#qm>A iW1yo:n^6r|iؙ}[۪t=8iH/fҘ!D0:nD!z(tswиE,WVR2,R{^la+s:^r2iM >HIBFmza|*XSܜś]`OӥR}'VNtYO!-0RӁ4-HC6i8KJ}t<ߪf@<2̈|ڑ >s$`)W;s0WHP>r# (W\DnOzJٟU%0n w `46 g #;nfv r1Yp-C@\e[ ^-S*^#/e.g,4o7 =: ˹KT6D((/2cqWsqK*ιՑ&Ң_ I :+>2z2(mfaGm 1WO2 vFv1_w@^GAFaֳJpeUedw>1tToV69;d[lEKU؁ǏKgu+~cnikg[Si)/|F5Q~ i\eO lYq>Q1%"\$h4|Xjvm'_O2mo,&3*+fAx1}kd~E5_}t8JR—Bʁ4(E蚨gNUue K`퍉#`F1 \2QNS0!G'uKd'Aƛ1NfES7 m7@BboTgb#*T]Ֆ~D->a}1 ƀ+ inD\zA=iF=teeworlds-0.6.2+dfsg/data/audio/sfx_pickup_launcher.wv0000644000175000017500000005236212140200333022066 0ustar felixfelixwvpkTJJ"iWWWGHJVIeW**&,~Η#"_h(}l>|s`<o_/9zxN+MG+" ~Ͽopg(׺z|b?_ͱ̙Y,!"jՏv69K4"N :8o~,/_-0J(흺>(`$T&؉)LGU[+x{q?"eE쯲q{{'jl?$X q m0N 3oMF /g|fv}S`M_y<6/bwjyДB )&u[3"1{^DmP(҂,)Tq&|vcw >u/ˣ~%4^'w/&cyf ƿQ8YVDVcZyu~GY7AkbWLF9.ij=sN=+@nˬ|f}[PFVo08Gx*MS#+&y=+XMIͨ O3%]kޡΙ%vuƥf"@&Zs뭤šD~uP"DuwuYT9E0VN[K ͠F{R+!-p(]+'*=LMMR7GLsyeu`" Ys;PeǒG1&#{'';дw~x<m^k^F<d/}WC' &!8 3kpnyqnI@$KG8TYOIYzu;c$7Z*p ЕǦi1m{+IB ,3Oe#Txo낈c~1X@\HN]'}~ Iư a1xi;ї\EF9u(erS=ԅ}Ȑ\^8%رn?-UH"?j%ƅM<̖Η.aRoud&JvlŚgK1aIdѹ*E4?xj:HM',?TWG8:|XH{]~r0j1'*F2{iQ\|Z%xYHx:?7#*_q.|gE*>fLc~yvcI]\2h;K(y&[,:7QJKg+޼!l0/nVܟjm#"YNojNS}sq3՝Dps]]B/l_;vc:tGDIR: MQoD-p D閭k>7i~xbORzF}_-;U(0~n4gNa#k~6\gݙWI"7B~YDa͟Y4͋0^pu~Wt:6Exz"y?tg~;G*KX!Q~uòg\awoD =f`,&igp Gdηt;|'L;JVʽ4L%OxB~Cך:7ށhܳb4Qn4X .jߦh#AۈVb axUill7Yž^ 5li?Qn¥>*uQچ<;d"\pi,]@榺]yT쳭-|[(<-I~hxJ;`lbz3Ÿ~SYc爐Ae"ؗJl٢nKy91oOIIa ^ٌ=v5 =hFY:,Y3CW+ ϐ@!K"is^5CР4͏He>$H58I9%xu)M]MgTEIżJa_Z;(ZG%X={jMq5Ru4/_EOBKhIn}z6F"N yim aczbLAV~LT%>G=\Ⱥ~ \JᖺPT;s:Ld9v471kF}rկ>ʋ!/O"c&| 浣q)#\3:VKن׉<=^08+帜|߼GI,4{(=soԊoY4x W.Iu:4hKbte1ל>c+70=P%iԶ]>~j^1DyE aۯJY`X9P;Blp^H3M/~n{&L%/N1,ۥfjN՚_~Cq]:&kC-,c;?9e]gğ e> <:0\W5pEjP҂ 2q֦ ZwɎv%T؋N?bd&Bhw)K[2KZW=u^/bhQ)c_/wl#b]`oᮇɰzRg6L 1XvMՂV(0i ГY꾆)bA UqY*&lbߗ*$+^-vtD꠽>\ˠk7nqVI|3NV\#<#J9F8m+: RP2ԿJ{5C2~dPo0P5 {@g5J:;. @o qWbc~#>Y$y)F"˫><9Gpu-~XXo@;Xp {ލ fUO!-KK+6̏' o u{H+|}e/]$P@ּ׼o#=HH)=u f59Sl1Dmu(tVՙZLj]zcxQ }yX#D*^{ĸ ӾѢܩ"[G'h{eLji bwfG5H&3}\}8!ëjgOl_@>dP|L:f)=>}wS~^2c7y-B\2W[{L2#b=)j[$lpR! .1qCfEi|θ/}`}iJ+} W+ UF`f:C/| 9 gc,3ep<Թ];`Ď`|@@iDYa" 7/ jzV!uz("$.w}O,zdfa-+)iZ@jmcqBbZ]}#Z$ .(*AUjɠ(CѣZ?m՘]#_[f._JBaNġxGL𮌒2R@"Y%za$sq7 E&"*Aq8~xF9Dޝ6[{}@fw=Zԥ/\%R0#I[E׊SLl˔1 yjQ]-]s@ mVy++h;j_Lx=l2jJLo˔YcOB7Uq̪_/SB2 ܏(f sTF%~jaG\zu;qho1e\}Zj6t |x`ǘXaۊQ,}EtC[C.)6*Q;=8`{Hw !Eiµ]“g}xxk G>e>'~IqOE:Wr[\5gfa)ӺY<\sgmZlR ([B+&؏d;Ú+i5"z1L]3RBPy`.!6C9E" Al0E9cl>2Ւ^gM݇@%=/\R.Ɔ{ыu-6GCZӱMUr$P'ݽq'c_BC;έ_onc8,Z' $f[9 l {~.2CȀ++R>3b/WuH߬;3V*:2zK%6$^%N #61Zs ܼD$g5Z$al.D#Iu/[w'(Z^r/W(&T<̥.Vګ_G W0Xl_r ۂcV囷YeW߈dտ <"6Aڋ 톸_~~M2G81A()jYkL˪9V3sKMӯ?o.n/nHqS>}J+ٛZq{w/>^KL1\4)(ʮw}:BHΓRIkf}SD%pWD(j)Lвf`~M2_.|O{ɻɈ{H xeY1֦:q|&`oaW+  'ϱn_/'CEӏw=:q_>@֨t .-gՇ^-[hTeҭ䝓M6I5C/OHr6yϴ1>nbZIMT֛)]F7y9oN)CAmAbaΐeZyÒZ>ϛTCѱhv<:'toWwz"F?M{\A1ȘH|8}_p&W /7Q\ta|R\uOvsdU}16 |D8ӿ+\s;uAK6X9@'3CpPZ܊8؇Lت"ߢ'byїvz*ix,.~8XU$>_V_~"yp+5;q:ݠF']-/pp]y̨?O^1ĻS4W2P6c-kjg ȍ@ &$IHA=Rפ5 7Ho&џ̥eE1rqEjvZ&-AX_Lv53Cd⶝s+DQ$H`{8ɥ+DB doR͝ZJ 6pz*xWrB jpFZлb@$'=2Ï͖YYR8dL!zF-5 #N4v=vae 濣z޿D:I'&^ܿߙYr>7_w'M;Ԙ~NP.')[2VF:02 {a)g!q/P(PV-Z HeN.Z6TD>`SժO udkjuB-#nza̬Ad5x|f%?<( %`@e2%RZ%e ojN\õo;0/aXfd?tarq(dgMQK{M)'lFSMuVeuF`=(n5* DP7<rEqL Gf|Ls='}8*Na$6ITG2O8K պ:V.Zwȕ]r[*GUeQ,~y3 PqA@ue!_Rt&='v!%6&fTZ7gpaBWi$nH;QT>KL}(٣ 7 Mp^G|UAΊz]x/Frl+άJe&]}[ 9?e&q!K]Mٮq@~Լ-Bg~#LHc3IO9JI@vpf1_53Ϝ]}K߉J&Ϥѳ[g%@6:9ĄU@'}ŧ]_A/y& ]vsj =5Ex\Uv9;7Ƞѡ鈷dR3BpXg_^%/y/+^ .7ۯ rsɜfhV0*pQ^XŒRb@CU8DYojfVEa "Ijˮ"o*t(i'\ܴؿ$fcxpi>2 ˺54<Üq6tOaDl$;)34ޜXEܭaRgB*5@ƴP t(b(A a0t-U,Cыh:kn&h r`|LxrBeCE9_h7oә\UWHBqO'E{_ "Nj0go͈L"grx>Hc<9kgV&iugmdkE:豲-(0+$N@شh[ᅍF APx5gsdNwh/1%i]n6 {V *O,rY^[p>xxbLL-)x\ρj2Y(0S$!.^H=cuCv8o򓻩F^3 #1uʺo5ŻPV#QZuRA6a#YdJ/&(—^|vQ6XWy eXt739z@D8X}ow<~UAŁ(ǵ!"c:p9G$NH~%52^x}D| [{(4 :i*HE{ {!._ƙFb9SNUQN|XNB#\jkF2J<(dDI(":{#,&=مvE رt`x1э(G(c`fq.7u ڮ 3Ch䓺C}O?M~V7vf,]8;ֻD]5Up=nMzDTH z ;f?1h{,nTP{D~:ocǞ׎Ą>{ްgc94rTSf}h_~M.0ஂJWLUlEhX} \x^0[v^xU"-ZڇRmSȩaNpr_YQ0$ݴK>SJ}5]@^O|4X.xŠ&-&. hracEfq`q76W>L0#: g x' ;/'i`QJ)`xcּϋ{B#oz(VW22 ó~hoE<4?nS}l ^KDjW3TElNPk-ds_S R?)k˾Էq6^R^䷛4ޭˍiPNeC[@a_ ^y8@@ Dwl%'zkoI)/p 'J@Es-9C\°] ?ǃ7V% =XPOMuPVjIpF&`4p܃1ߚ5"mͯ# Gu =  x@,ġB{p1196=V 2 X&i- Œ@=w6+tYe\BpoHN[̘_!ҡ@Ox WUA13A=١S4•:=&[5hL6PZ/1O/tg2*6{v> "gF$A)ݗ<+aS=LR^7qTV()eEQ -)}>62zg1޸9FBLs\Ζ$f曚'cgm[1nczu('=fc4YAգb`H]o]% ʀ?1VoOwiۇ71_Dy3GRICs5w=r%|-Ë!H2w|E> 0j$pvMh<!X[agy-AiGӪb:GHI.N.(Zsò(ƅqm!4JB^FtD N@C$e|x W:AŢܤp!Z@4=X&`h0aUn.<tŔ}gЦ kɅx )_3\r6)K짤[r$.ɲ!{ mK5#PG!pS $-zWZt%5 gT_y\nu!Rx[!(R=zzڭU)l48?vm݊=]՚V+A:FhuĬ_aɐ/0fthNZ*8tlyLfAQ̋fpZ5;NW ,qP\E:*OnkNI+1 0+T' |s_G9uh88W<8!?uv =@f?y>ALrpiYzDhx2XBSP(TF0mh M`V.Xn{l%jz@"/9TNRCAF k\П}U 2n7ĿE8LSb#jG8 P @Vd 7?~.xv•FR6M' cыEt 26y3*`bUSC VE6eA@yȚ J{4XDms8JԢIπ#m7Z |͔85 Cl3v,ъVڦ2{(;ZiWnτB47iw2&>UI"slqSǩGEHYv;P+gL&x2R|,X'c6֥u7GcSeZ@e=MX~:Yqfƶ4K}=gN"h-a>:qXGZm\ah1'xPXzBA\[z*"Է+{R>PǛ&Nt8Y9ׂt &'qZl-Q^,,Ukɚ'M1tRxA S232~uxbLa_9HIVR_ O(:p.MIoOcuWE9WٙFDs^0mBS}ĶYJ8+ _ yeD6JNlR^KLM61; R)}O ե61LZCeHL,sŸ5H%LӾp<}Bێ2oҁ]~ 8cWS-ciW~5O~87t}dOA'͊'#oU eIj_Wލ8ӝѱ#A[:brcB>맺5k6-MQ-09]BA~Nj `8 mW qy:F[Ġ\ ~jMl̫BGG.6P<ɋM\y\xa3vhSE4 ą"@VhcQ7ȝu+(79bۣ:\[ ֍`-ݴ ^80URV8Ђ4s-j^/p,Fvb@L~eICWZfM>[a ςWsw pEcbTahTBQsOuAy=*ԝf10Ͽ˳wUEYGJwKE8<%#J4*;2Tb҃,I ^TɷSO PU}v]}.UHyOqɀg1C{( Av,glAJ=Yi+_j<~,cєȤGGW،8bc׬O ^(&[R:e4Sz[@6/mC9Х`lH`X X@18)gS%[7ι2Q,/AɈ (ct"|ba~Ad/ Mlp㸉)|sg:6Itn}|oٿXBE/"nTɈOD-^lcp _MXVX2F _PsyM?)x*GWx=xd K\*Sit_DM ª%ki{ g_Eg~,Od#ߓ|X}~Rϰ|l~eʤ{rgt~UNh؁_NЏ#*o÷_9D^} x}?>ȘPY]|dMHb}6;|KH|+f%‰TPzb̶r_fQA|x>lܟ xQ_u;w]EOb{U8MwefH#K4dyt3n(;MMU68=N)X"j8єߑEzS8L9Ԕ].XIqTW-8~=ԕ$WG9(OȾ4.&dj, -rj/c%%!ZUwHla*[Ցi6 &/ OٲfT l ή/cdagYoTPgWI*-D)_zh}0 {dd'!󪚔Wu-sNt Bf ZȡՋmFbgW?]aL[>jv`SETRN"1`1 oH<c1>µºIO I#uۉDᨄ#H+df6S,8R]&y(= %tezubDx>`- r8ڐ5`^ Vr9=CpkP%&81鈼H5q֛7؅؞rWq.8ۅB6l])$.el4&,)L(a$YH+iH{.S-~aGbݛB0{ӌ߄,֙ײ+9i s1Pg]y9sO~QC@?(95LzID{ ٠!ul<֙оXmY1+sWU/o\_p_Q_)g >~{ރ?iVjf*+OT#nXj!|#蟤Zj{KɸMLy*J*1CQڜb7ҋϡ?J?;$նwH` U#U2W#Vȫ"VŐWE$%Xh!`(QL<871Sidtb1kGAMa|۷9Mށ':ʼn-Dhs9"^r1 ,ߝgUFx/*^n5 /L yQQ$||3Xkm('֗Yn,1SO)%lN,C  :צ:6~LSlUHStZlÍUv-dJ/q5wq$]#fL:L>(: K812$qY0N&٠Cd`Z| cQbGС]*t؋N@/h#Oϗ Ud`c2`h? G6\Ər55/U'H Iw܇D\j6٘X E}a]]5E']~1V]CחeJFP!dM\G E-zѨjlgQ f>Hl"oM]6l@ #b+pwkI/l7pfX;0EB "a)qYI24+'8#LV%zq;P[v)G;h'*#Wcʜv"g#D`9m,SKdc]C jIPx4IKeYzs;<^$4ow`gT(Ą:"e6ccזHNu1tQQ{io 3Ր6$H: \Ǔ0xkgqpȒ2? 7 /4C\u?g8):]NX܎]OΛskK8ҽȯU6n7+,.% l_v f^#EH +FbϪO3 [Ej:ޠsCVG%o l)0…u R 2@D!gp_36LkwemWKxk?$-?bwS^rM0Е%4kU:B}@/ qj5Q>DI؋5 j b t%/2l/~(LΪJ,P"bYic i0΢goe D! b1T_< 'oQs ki=JRKr 6HMK+uP1 3=3ıжJLMǠ}rUF\T)ΘZh[+$/)?Y)Z"spfڣt;1qgoa\_ȫɨh/fЬKr\dAFRaI*uhϧe>M7DzPN6'WC v i Ltcj"W|gI^aieZPx~&9Ivt#2bNPb+40im~ $=v6fX'A*Mٙ"1X#BJ"D0A`"R҈pl8iBHt@I])\Hav%(s\UHI@kO4ȓ(Kl A?KnveZVjj6 VU@F^9?x> }{kOK߿__Uo~0Kj;-ߝZ%8?1z w⷏+F) =>mCVCdpbY[J*)ﮟ$uJqp %D;ĻsaMz}SA |R,_ݝ\<I]<՚:.a0c!,r>0k 8N&*4Y-]5l0}JI.gcD^6a!J tKXDp@d9Nph*G.<~fغg##TU)&-'#n,Ghk[10 Q+\>>q=#h`GxxO%BF gUA|!X^tl ;žut" hLJE2XzܒA)xS՛Y_Aƕo@"m?e8-A~L}jmseF| F帍F"P\LlV3WĄqrخtw♔7N340ay^s9K8^.oʂJ=.GK{y*ZZZp x=6 9?NW+ݓhV`JSυmۻ0r>l3H!.;h7*mn Z5cc.l%O#= UGe俧CgBN:FuvJg. ԀJz=!&p/ԳA_#8پnQ>]l-Hl!PDYQOtɇpȽQViawJlZS檻O_¾ӜDu9XM{DA蘩Rm`Gq88-pi#" |)f]f{GeE"r')zQv([sPTK[Kaaқ5qW?lܵw{TTz_l'rng//.Oc{dz`Ԯ3|yv2fa8O,dhN>Ax.{o$RF'dGn`g\7R:hf䳱W~=V; Q)Z/,W7~ xTb7L a=0 ! qUr0sщMܯU)~tbZ-@N23C]fg%\߳EpA g z2y!td=Q:i5unYFu>9#9A]}(tf4ACY\TmL$ EK8ki٨*te^~""߱&/4S*e?F߽}ױe6wsz;p畛XB~4Χ &H7ŏDDUc&]0Z]fiday)ú1 #j`ZTMʬgD! Aµ/)]l/6`Pqզkdx +'89vS&`V[_ʝѥ@9uԴa~dH{O 2`rRfa1F`{Qǯ6Za+! \UKͱ)?g]!z&_ϦB*5șNe)1bVא#%@y&X#uX=SMH n/7D' +[38 i@Q <2Yj&ѥb +Fjq)Ԋq4;w<>ۃ붧 R5kZS6'knN}TSBZZ J .~LVI{< Q`C3pge~vc+YPpC] %{p;*@P[z\0B |Bi_R5f>f_Ȱj[voV'@,o-֩//d$B1~7 `e'>ǫݦռ2`j!=?BCuUSʄ*"G|LFn/ݺ0cB,λ@]Ej Sf#D̦:{褥xXi|u~"rϣ Rx֝yOs1648bX8&fЃH.Rԝ 3缪ɞY7fd@`hhp;JZ½["qw"]6"k8Kr0CZu-Up@ۢ 2Ȟ|1CϦv h$_a߸Bv_=($S˶1+ʙ4R]VR Ɗ]TMQvf2I2)jtQu}J!}pnb{F%KOދ|mkz}&\ 8'':ITH#*prRK0{ 6ۘ|`˅xd]ή1 Aa ,؞Ֆ0y(&04`5>+o{bAطLM m:>: IS{ V޶pR (9IšH}cؿ֦]f6-pS/Ճ2{e|,uR'4f!WyP1Ac\RMݻ]M?*},txgRDs%d!KS7RG~/A^IjꝀ5 W ӢS;9S=3HiZ,2?fńlgL' Hеj,}RO7[;Bf, .2Áٙʆ܁S7W xA'7^ש}}d6/ȫ7?bYvk)_1z?⪀6 67ِ8POI \O~0Z8&|g pu,NlMө%_) oiwN2`q8S~jiix&6:kaiU=B?bH3? ~N~ٹt;w\X ,M QbHUVE17]~&-/tW2CI*ֳܼOgK~:U#g`d$`*rý y6u@A_<ՂRÒJm-ӡ^] %O/W};&Y7K ae?gE= AB0?Px>Ymıf ߴS@PhZ2C %߉0VAy  2}%%& f*A@%b$Q l,yj&vm+)D4TO+6U&+}5eUIFteeworlds-0.6.2+dfsg/data/audio/sfx_pickup_ninja.wv0000644000175000017500000012627412140200333021370 0ustar felixfelixwvpk oWWWGHJVIe#`h|޶?`1=D|l(]c'hjB衾XjH{"+gXdQG$,fxō-o2Yf:OZ(m%f5vѵ&9\&֙X)pEVva>yzψ{hZ5V+]GH|7IskE1{ /wk:1ty|TK\d_2Z^ovk:| ׂC*% S}ըlG{L2~0g}p1S0Q`y:=tk <`Zv2#gcj83X_h$~gfy|f4xҕ 1CI'1Ft` Pva +ͪP_KD_8={ d-=;גw5wf"V|wNFIͬKW/ duekSc xwUsCl]{FҲjZ6{! 눁|w wC7~##>BG#NqvҺX14u:LMkULq9/8J/~p/qwA&Mw n )h'v侶|蛰h p bUu/A}wuNt}0$?Yc|RaWsj"-$sNGvScU&Cyt.2pɧt]DmGmJ!6$"e~oY4g ]Zee稏B]j#7ҟeU&)aij"ʶ |#aSIeGa Bo K11?GFT(_8kr߷"ϲ! qZ,Ƒ/j]dL${o+Οjw 4"CoVk8p mpPͺ5/";lLdNʧGj|w% C$T)_(@izNk,Wz*vDl}h5tzO. YLq] + {ʳ|< 9-0Rw"gv5*b8d^~A7Bn|ΔFfI!(Z< Jsb^̙ D#T*݈@  Jb <@ib=N;n h$m++(&>|#D)H^nY".XWbl$ J|UGa{]̳bmY&łt'KBe)ݫH($ٰj?sNizAJUҤeY@y#D^[+}΋(K>,YbF&:VU56dP|$B6!\Uk͕BevI+sgǘŗD?~ Lmn\7Z5%n|y9T" ncg?P<9)pf7;dZ^Kׁ(TJ) LptgW)oyW>NT0uB :*#7 ev:X+Y/o+owpTX)CaYmW.=#k4ۈ<6W\_ )݇x|Z-<97(BdmNVCx7Z."Ill*2F -~CLƅhvdO= _J955v:P9QƎs»IIi(OEB`2`X #HFI͢#-=3[(JZ_. I3͂+oPOp/k]YyV!}u|& E%kbYUp5E5#t(,kKTP AR1g$z_qoJyO[?6tl ѷ&]WVĠyGn37\2M4LB Kf0 x}'-(h =S?(%+< N F{.kwȄS[{kgsw(r@nUPye0< UAN* ef8弡vc4Qꧠ$2Qt/,C 'IT=. hXSF׊Hc[ if6o}9>o%u0MU GIܮKZ G|B%bfZt$t*W[mB 5rο}?urC\P!Xm{d0CJr@sK^|ǛoL:b^x$]{b&iWF-%>VStk`qI|͸_eD8sҙIY e> g5&⊗9?Gs9ެnV[gwWو}1}7CpC)-ٓ C(2"Bo}dbi~_w0*T2C-Z*@^'uU?s|_xV:,`MnlkǕQ# JCγ O6>spjYvo,wq(guAW6ϊRa^J9˖9`S٢I{QJzտl4Esc-̯(omDy4ԑ2L]$$FK@6noȘBW7b?wiatpm&y,|Hs_S`tBqŐsqFoOW ;Oг弿&6`;iŸ*oml]ZҚ-Q` ţ6^8ŋJuØZbn1_oy5dRe.zwB|N%oFGLT,>s?h8P @A'D䝵K@`A#;q(ɓRM i/(x{OashДm4(l V;}Ϊu* S?cbx)-z %QieZ¿Y\@=/u8 nz},Љ6'pyօ׽º=o ~-M|U̴>]|s軨6vlvH/d"Ճ{%^w^N*(Cdچ]9Q.F -cF;Ȯ|ę~!/il/d"}[eUv;]ep_5!aLs@[=$(_EƷ_[NCt1ÊԂ. T:z~䬥}d)V=RCJ/@;r(lJ+;ޜ|Og>^iV7Cg'wKFĐeL}]e(29tP{;x0 衾R2Ժhۓ$GDD*N1Va3N/?"&FHgT!8ճ2E8Ms`W6 { (:gs&[/gBoakCːj!.y zS ;ϡݱB&37NxeR͸XK? \X)5BڭU"ᕤGrer t~~F;ŰH*.K84L23ho_Āμ$/)/W",V5,VC܌+SIhr>S1Đclp@QIY0ci ޼KJPjb@Y:tV݀bO4?_dX.P@-_b kpZ:0XDF\D.3nQ\߁IǗeKƸ/81$tVZTwPU -Ղy+'uUt !׃ f> '4}]|nZv6aVѶzTOIRξ B.Kϯoa+WmY{Ѹ!-xQSam.Q/v--" cOOz2>GHb7{\Q!&w&q|2P>@xqpDD0`&>h#N/Z'lQA sڠh`3'&H7z( tKt^^ `y+R̻]1q ⢠8T5á_/hvww7[6]o)S; ꖡs5M&oA #> oWR50J|B3K n2|;N]7•իkՐRqu;Y 8DN7-Gr A=[F\drxA/L;ꙇV+M {m%cY:" DMa#wePBp+JE4`\fkܸʣvxO) ,l FAPgxxc 7f[?z;PT >h2n,TX U ngqMp+͊O)qd^/>WPq&o(,R,xpKK:dĜrMtcH@N9x.yKb_t _?+).=I*LX~ >oA&!y4QK]7& .jbk.\XEƔCskߵRl]Zr#;Mc$?`)ȓ*H\ ~bP:s Ǵ_,PVBh=YI7' А>Θc `D+i24K aHȰrKJ9_}5/) $[%2Kw";rU9L'k+J }]ڨ˜Zkpv8ΘPvķq]2A{)7H.U#x.9쾅yBƽiU+yzU[; =cJ1j7_MFC2̓ӓI5. װNJyD[xAOרcx`,N~d`ςҕp_ʞ:Ĭ32@ѡwK% &p(ڪs%_"K]aˁyU$@-ŶxrsҦu9Ee_I b΅[ݏ2|KGW99AQ ,wt(@*CLNBIi%$ *?M趶EQ2Fǜ(n+4Si}@h5E8ŸmKGiWQu{*82yQV=r v5bY>:t$3lDCd!hr]݌694g9®3N-O=4mk]x9]o&51s1Q#2\[ ]LݺjS!gnNm6Cspm єm&\7oל~ֆUARrh Ѭd&czq^yɹ{:Pi6D*[{8[g7_6tRvP!~Hƙ[ؗoPM'^pNkQy{Ss:S:`q\jŻ9:bĻ)j'{K-`+J"]FQ Na7\$4,-ahkٌQS=(T{8 N~M~%-*t ? # U4^~/X7 K!ZPo70J~Ihjmu#QHryWMf3S~8lD8*{"PQmgMXHJfz>GRcE\YW8y-> .GͶˠR{ WY*YiYlWkޔ0&K,Q|Y1< v g ؀̏IJ򙊗~: SG'+耬4n+ μXR_tq :EVnXg0aDhbz&IYki _|[KY:p ޖ79"@p2|/:_6~˗^R̋塾Ip ׁX  -OPDs3 Xʋ4:MS{\p}Yz_8`hiV6jd$^ x=eu9{?= &?)l! V~YYjEb2kv,*^1R3&`#~ ,5:4S$ _+!wivAZh>?Qq<+R8i@/Ӣbo.}6XQ˅RT稈38胳@r1%NW&J`@*+aSa 2y"{˔)ރ%N@%) KHrhISU~S)EnjP\hUA97rzyR ղ} )- x 7hxRNWW᱔Ɯ#,W!pA P;OH=Ex׋及uI||_{|87} *]$Bʣ!B5JdJOq^W<&پH[cB/x[crpS B {-XYR_D*ֶr٥Bx3,z%zLJ^) [G{9d ,A+W,U R}o@_z: Ddi1 K)#´(4 6A.un0`T>)΍q?W{39T‚JܒFTj0HӨ>F!Awo T<&:!k{C'Ph19@Br[U&|=cþ䀯}Ǿu7*{Bܻږb ~y Og,#dwkN[kO&yX5TD?ۍ9,2"QώVv@)3$M+3NY͘W97i[<}M_.yF&^dC&r@2UaKyš]ȶ( ,:ʭm8?{ĄZW̰kKUvH"Y*F{#$+P=п?-śK^)ӓ.K``P dw{3FNdDྋIF#7^S>4@.r䝛i.1CM6`dw,<+ʇYt@|`{7v^Q:}GbiTS,<-z{5Al nG2̈39QdMlA-Jta'6֌gq LqI$S 9=3$>G#98O?^ ;N-ٯ <ݤ@]T=TX+({{)g.Aԝh;OXQK<')/zލ ]˩{SGIsN &"#fW[2BZ<`ˀ |`:H]v?9b"<7 kyB. f@Av Ch&\CLJ[ӁĄ*v&abM^#ܡ#ɬ?f !CF4qumM3 ];aeGߒz8(}_7dUnTz=Cb߃ȘckUv+a[tw[)Oz*[ 9Ng5( ;=\ Ӄ(/!uv1AYQ1ڜ)-,67'ybN)vFgMqs܃>>3Cv=Yvh5@:Pq.B*R3߫+V(D>P۔@zȣ %bJc'׷#-Ws XP(2f rI\ ݩ;Pu>Dݘ1te!q`U1;Ü=$R;{NR?6:"`}d -y0P>e]k-=%p02N }y?APm0&}'s; U|qJ>*.j?帯^& ܩ$ϔ֙x#[}Sį@ffǣ:$@<.Fv"&Iެ Yt1 w Jl_ct87eFIҷ,@{4Pij84G;^Z5gpG@L;B(J>L"y>ðQՁyY d8[cS ڽ]BN-ukqiz`kDbI.חPmk._fkeLBd 啡9^NdрW̮x0af<0nZ+WZwRBjoehfXY*U<F%$cfc4GhTļs4t[O<HO,q mB'~8) *pC=Y~; -f&zۗ N:ͳ$5If.QeWm)j%k)ÇLB9b& tΦ܆S U:;}\%/G V"WɫJС墱t0ǀxO4m'.UBX[ϳ^Hأ˩AX&z?wn̽"0DS{[J=VC fz".P)ϒw}yrV8R۷϶_/ d/y;Uo}bEr`IAI0| V2J>[qU͝Qt/ԛFHGK[GF4jkHimr*㾬_=lKSvPW')kkBB-Ȑwc78_k>,=Z@XS/>J/[6-݀W)m~F8۫Sѳ(N9Gܤ $97`rZauxƣr~><,\ KcV&0Ϩ6x!2 Ч^}IfXл}j)&uO|[v|;ɴM"b;j:;{~<%1`]Ųj)|YZVs8҄aW2 2R }8˓;(^!d/ժq.P!f'.^%P2hTd7ps ȅ/v9␗\X`dѡE~:0?qH.w) fMbxT+%~{KA؞Wkz;I#?rWq1)&4r|JJ02\3&.m;Tp" D QBfanc fxWwB`h:׳%-~\–B1 @pV$ur0E}ѳl7\'Hd3%<^%7m&к$+$Ј#3v@` )2K6M{e&";4mj6r$.03@1#(^3ra N0ۥK2Wt5iAb]EvV`?}9¡5ryhޙ0&$[:`˂[ܥhUUf09J@_1'Vh@h31`= H׸dv(I}L2 =I]woȆU?^h,B|,ݡxeczA&mj2 Q9)&IߏMa"G>T_&O>GT$B~-2~g]O)<2 }ՠ7 |\ϕg cEZ3q41K2L|3Zd_b28 5Iͮ@"}i|["0=!Ϧ8V2J^ṵA Rxzh ^yoR |O{ؚo [x יQ?bja'tch8cr{uiLwC' H`s#r4K|4dO+߁^ {Sx#&fwl4KXD~xͬDn6p1^Zi!y ]$ fHГ@;RjgOҼk{vN}gwe充΍VG+QV#48s\L[wнw}+hc@̴<' CR7aOI:pm0b#m6gL x9~6a1BG_S f2Ѵ_!~O8U`<WOn41>xy^Q3m ;U(A>hY0Ŧ@E @Y!lɨ7tpio/yE8#@ݔ+PX*a>##j0dIӕR[ل/$qJc%HrF_5|>4X&'Ȕ &7%Ъ5F1F|mؔ3ʧQP a[dцoƖ Ly"Pz%C]7ehu590KV O+g˿ѻDެۚE}C*Cd]oBQHzS<ƥu8vyx}NXM8x}H:UvݬMeY>-*/>R.[c~?`wȫ{_t`%vm] 6N#S4Fz7|=q ;GW8aȍ] }Ǧ}oc%ReYEenB0-;4Qh{"3Å>9CF)~ ļhl@*z@:=NnPP S PC#)&bŗSa_xЄ*RGN;ܦ1x:pi9N:fyM- u"38f\x Sry &N 6]uL-lҺeXd_Eև qbii~Sj 7|:la ́#bs 3UQ  78".rur?ӑJÄ|bsW]MP^C1>g¦@t4eqܒUQ@-9$]warnRJMh2w{.,)ES^&ZoWcxa)GO"UvJ0'9pWkRlN]Qwu*d9>% S ̈́MqnsmS|'+=(5R9jA \URbHz1 N|Cw/P1vŽUG6H\=[o8Zmv_dƛ 2[/O_Ki0 ym@3J+(S@)F XJlO/Xp[5r$ՉR:cX1ѫE qhe>tX-692c盶jY u >wF x:TܩbʱehmKm7`a^\RHo.F-OnG-Cg352:ObXoxi{o_[qjXꯎ@] ִ)fRJRj.>X`>70`BQɜ>>9 fr&%vw9y:1a` (`S8H Βe"=Y7~JPQtzٱT5>wnFJc)V\SNWqjGp HXcXnA#^L-0=M(gW5~ch1`z@m0dzrN~CQ[=_\!uś.q!V|I_\{D%5=7Qv}DUnس"K>Q{ Y=I89Tn/KYTR3d|/c£/Yy? >=M0PW-h"38# IH9  4L+jґ5MHqo`)]du)pr/µh2g̘Cja8nI[d^C\/y|1`}Pm#4ev j1+8wzsMUW4ݜ~|NylQ#*sBq5rX?z=[E2oe:'@ `Կ@ uzػl3+\t[xԁ'FFnթY2-U栘  hlU u U!`@]ČTсxJ#lU* IY^>:.7|免z{lz<5ЎKۖ  M̈1WޢsTcۻI;ܟOӨJNb b /XH Z=7sTx="(XDU[M9Чӆ(7>#9pEՑr85 4e\U `<ѽaݪ>y0 uFh;c'# k297G2&|WJ*K/Ba%ģ}McՕE Jjl>'y^-咁ncɥ_Na(bdMŘi~ la5ɧN]~XsBU{os<\7{.`?V h.o7AӖg$"IJIh,ϏG0ĥp;"̶̾)^ ԯg.nxj0׾&k?΂/*r_{DI.<(O.ks JSk4aD\":G>X86nJ\7]4~Vsbh9z.jWԭ"! Cc4ϻr9оQNڑ.!su&9g 㵸z@'5nBDgeTgAK;*FEͮt|i½1vƇsӅ[&Aϻ%C{R 3ė=) ~UݣϋjXbMS*GF+D)qe7N,}1+V7Ǯ~BZ3}y^~]0KSl;.TtA9 FHfdd'GzDE% NhF>KNLp&iYr|ulT$J59 @*+eiԾm֖!uJ@1#c 0PQub(8b4TZyj*fLBDf6ߦ~g``TU/Vu!ժXlqO $`4W*B%C JDIii\Ɛy0~_l],kADJcx7=. 3ED!۶J녊Rh0{c_l,t|ɳ'w}R~LUC ?ٰ ~U6[Q~tGe`.؈^.~P1h@8C!nR~3ev77)G %b\tkRA7EJő22(3~GOx*(g<>D;@NBai;6Wa4rs:uխiZdT0Wױҙg)[[/Q?'oyh;[`[IFM23t& 0S~F;hAU2PЎI -W&`3 >yP bӇ5W~qUHʟh᪱#wڃ!8ļy|e"ÇSNgt+j~uvIsE~ /P\|t |6q/E~YZ<3]s䗝sG-.(^!1qsy2u{e:2Z MІːP{]F(%fNwi1'?MRg_7Buūv ߥؙWH3"xLH'[@:; !@ԟfld6{?pquP KywO <L J|3'ohA(a{nfpt)gBvcBiʋތ+?dXB{ "Y7,(vG!OdV^S(J"^@1o/>ЧruV{3*ns(vwU8|\t 88@HW opg`8,0g u_: &߸48]B.s/ybFv* ]4%e>$cӄ&D՜UVoʻbAU( MJۉ_Hxp[tNa9N*PB6-$ђJ=wwZQJ6[w9#OQ3Aʫ<.N0WE` ƝS .ۦ5BZ{V8ț r8}6(ڠ!8~&gGݍ@XނXi;1mnܴ"5[ԥ,!fp׈1|4Iz=6g$ުqM`DeΝlrz=F BPzwj#]=zrRj<љ?xxX(7>bX:Cɳ83o/򵃇gxSoUb^kx[jeeFQ* jSCoNU |i*@X1F_j@IVYJc'B[!U$UhM0tb@Tr>%^:7I#gS^}!~lޏQeѴڵFS{;!RA4&!6睶p+:چB6r!{)̡ Hf/ד>/!],X/җq,,I<%Q:.Q 7%B)EQ"<Vdϴ0' m1YC92 RÞQIIt tC(j۳&a{^Z/*<e*pʐv=դBжc2r#5XFtm3o&B>a+1߹9?} VvPQ@MM 9QV8zMo KM[8h )ӿ['׉[_UJyȍHI3"38:z( £Le4Ok`NʄW*s7aJ۷1s wY}bN&Aˀad+~ȷ3n@P0HVP|X毰6rSDտ RW"o)ӆcKC5$WDuK%xsPVtOP"±\L-3iaSn";&W\P1$u){ eN~8CI'':pe[},I\fuHpTH;3Ԇ;9$& a7<{@cfB8]xTˊ^ξXQ !4 jaZWfeX3;d1q19Jpß)@-Ssn~SW3Z6'캷DrVҧd Qd6^mt?dfțygxqhClŹu̸K#UBoAuc2@(`c}6b|sֹT;`I0a4)Izo4QOڲy1ſ %$|AOV+Sp_}~fw"#~Ar&Gɵyzp0I8iYD` U&F30$yCz3^r,^k`O=d.5`4: F68ghD61泋Dӻk<hs@&?GSs4,6.86Na"LS¥-?] %<7kxinw.R* Ap1U'*;MJl2l#w=񏔑[~v"xu0Ru$1zM2#"Vnool4$˘ b]U' GR;پŕ&gHtӌdP; -p6) - cutJĹ hH DbYW~)(vz1b6R5+}T<؍f;ng?XX,ZK]aǑb2(g׆N|5:B~7Q:df}F<튧m\%5a]IYf5QCs=[':Tuv@N3V'f )єJ+>{؍0f^?xG!*H]#(*< DԚXv;4g6bF6mZL#טg%_$|n[x5'%jzL螥RX=s\p">C< MN}WmCz]7;b`j n'8Ahqi⪏g3aRTb'lIQ@(i/ʋ%N{q6 άﶍ=;t6ƈf*jڿC6&Xλ#EDK΋l p2xVך4>r|J/+EmH}fagϊ`)QnL1ӎ܏?=0ՁkIG ؖH夕v0XYy^,׸i~2D ,,)ਖ਼T( (DGꙍ2P_|n~( S,7ax2s|K?߅B4Uk Př~+ 90GOԍ }㿴nG뚿~L߱:5 T@ }D AN?u~~HP3۾hp,:QBBpHLeEًH /? 1e>: x>
rwo>lc UiV]%X4iZP|#qg[.hV"k4f)D'n>5گt֏*ϱ%vrn^Mx.I[T|*=?2W,yS2d4,ΚC,I8 ! cGgx-¬<@RBa.T_g=[6& ڇf<HA'0]4MfTxѠz:w.#PP&OIqOÉLtw*lreOW\шTm}zՍ}熉o}d wvOf}zXgk =9 M AÛ5aO hq"%}6quS8!1ǪY7Kw1V§% 8:Sq+S.ec1539 ۞蕰Wp=XIzQANm!(ٖJiUjgs(1}c:㲪2g/Awp EH1ճߩ#$8^x&ā^/yJh?qK؄5rT_l[U֯ь얕|ň*MTnyj} ê eUFzx,Msy}'8BQ )٨>T1Pw9̚3)eO4r&0\:mlc'zzw6K.\VqYi-u|op@#a<¶A.ѢaTr[!;e]l Nu꿤NWy#M'D j&ܙ)h'fő[v\&}$!+켜 pC`$ g>@^41A \Pվ"0^搥[R)-*6vh?b61Kڇ(R a%U< D $WoPܺQ /_JL^{񀸥D\Rb^HzX?q{Sicſhђתҕ?6bjBbVy{ N 5%CVG ,w:n፨hh%HCԛ?A0o.e6=nta^t*LlAXWXnЎIzqm.sAmLב,##Mm*fPveu['7.1sQSG8!/cސ,TlNR}!^S.1MD_t˾e6y?t/om #gn>ǔ*Ϳa\{paGBƄc4r4B=閹S.'0xHg4na=p$š@B<_1&P0O43,2hL2 :ersƂ~4*V&ģua5J^h^k7PQpٰ4Chn7rȷJ]mjޭsQ:C֧j8Vm#!FRG2,zSZ=z[Sۺ̀ ?gS6~͙v{N㵫#7sϦ0q_D7,Uw(Vvl*ìNܸΜb:OZ>_y]&3$,&b<6jt4/"e< 4L=_ xGt 5{>Ħ4oX &,z9u'Pی^Lj? 0 M:ޣtiš *K\PYpLnёR9f|uGNdUg),@I)8nN7] Ӱ~Z|6Iz#ڲXSraHuF<[`T6OyxaAN(:Ѽ/DM89QI1n ?Af7E0U++Ra3(luG; |m_.8Sr+cx&_M4ID׫{]mSHmqVtz֨q"f21ű"23 j>!ZcӃ*#ꆪGsm-4: *Jk4uYV7ȋmx;Ŗ05~0cPaXCܖbY*lW D?({5ov_vIƑ.ᰇx'髓ׁ>$|mC/%A{3TBG?Us:4[^ yp",<;K\ڇb?;&wj}H2(d p0 ]PTwbZfUFL_aS%])CN˧,ۙ}Y'8r`֍4`T,rQ^zg6-u}8+X85~Wǧ8+&Civ򎵻m ~I2$˞م_mS{&rnJţ ʜ1!ȷlaNoڭ5I !1RH4J3M7nWV7,A!>%&I}w:gBm~>j,>@ t & *"&="zpWڏta'9&q@fNc1#]Tx Fwoiڗʅ` ghJ aIDYGbn\]O$^@Jbh` 'Hv8 fUӫ%*ܺ8>k tP@ixGiQU !P ]ؤ$SRU$~2vcBnJfM&qyr U%ŹClbXGӟj;jsÏjMMDQ*schks =)' c&k@E Tu%4+9OM`}OM0#jK-S;Be^ ̬4ik{^/nVz-B]ֽE݂ dc:Of LX"kJ]#nn*woaIH*T=Yl5Po"6U+UG=Q&M*1?< yg\7;]o33wW=p{)сUCY_?>~Ci| -x+E[y>VI$=[P;Y2_c-HWتQ:K)8"otVhų]OZprv(un:*v=/dN̝UzfwQ5h+gAwF~ !6Qj㓭<慈Id9b^:P衎ڃê$7E _~L>d| 5W^A|6XR@U&#Ӎ xր}Md  ` ?j`!Y[.%oqn7 :usY.7rOL 09s`z (XI1 tAC;%,GgcVs9'ߢ:CK m3"jbI6.hV8A^; >IS͜堘 -oi4QKہ#P\2NRFe}%|(ƪ)}|DbCG?l}L&j] ^P&Rt+٬W]*tr,"ɟ ex֬XB&ˈpܺ Ir&Wxai 2x f5C`I=3Z'Mm{!0ڡs vy@Sԩ(қEEC8t*d^~:xt g0m# C`; (1e88{)IHD\z=s8Jwݏ*Фeݟ?S+/?kΫ5_"m`d`hX 9Kή;E%LxbFhM;9ݙ%x3ib%۟CtJ!.d?waMu rP5) VU2w@\KdX坑ӧHPȑwv„ ƸQ{ЩӓTF繁ay %~U-4MPDJMrbsz~̗]w.As3zV0*6!~O@H2Z/8IwjUr;jۑ DZ{(B )_X 7m-C>ɸQR>Ʒ{^o=-l]֬u>byH 'OH29 s(~COds!/4w2ItKd &d~}zHZE]6%Q-a;KR.=S?{EDc˅Dч \<FF~(eU&̓Pm'/!^GqUyr*2$<W}q.YUa|4Ӟ_zݎl}1ߥZsF9wrg8RkND6Tt%$h~yE.xxxs'9l6!9D=zQ Nr4w|H$8;'ojl72uWʌ~+X'C1o#g sz/Ot0OsZh<$EKT,E6srA7׮9ai+|m# 5ԫDqp\ݺrŝ: O/*OIeR ҆.jr%`RZuZʘ!)%W_(fOZH;L.A$=E ]ڮ}M1wNXgc?aJN2:mIvؾoop/s +bߩYUGPvJ >AKŽ햏lս ;K%BO":B"mxH-;EobAvZR@Dj dz2$*U+)<qM;ȫbUN}\'`Q=h7Z5yUD_OzgGsE.$OO6epX{3!jܲX~?98MG8KUb`b[*}є,bzj`XomwPuU7>\aJ5y=hR@._Xaq7!YlF׹V8ye8ymQj+vbx}*ѵIR%ُ=#@[D)kj?F3,¯UYWJ56823h׶Bno\RH҃%&;˓QրN7 ̭ľU7$g䳉~GڜуT4(,Ь]Ln&\FIxpK]ӏF1?aX17 a (N,݈Fni-`A90+~az$ç&H`- = v0\%zS*1:="NZ['"ނy]y՜pBB,GuЮ8uNc\|f9k-P4#1OI+ڔ2iCN;}B~`#t2-H2}BGq k(AI oIYӂᏰ۵tq%?իsf~Sx9N*N6SM,^4T@߬Zm 5F ,gG @H+r@]-[ KT*VU{SuqQbD<_$wd?w{:#.};Yň{졤6N)?9Y#]`JL/1{x"xXzJPP_>鷂FMp;cfkŊk "'b ~v,H&pLp#jlk*3:%ŧo$qQ(x|1أU&|&J/#pr/ZD!k_b\Y2g9dl/S)@dg(c˶f3AǬʴnj3&8Q4TqoEfC!zʕU/̤wc[jHnmUQ#G+\; L oT]N{bYʦdhX3oJїc8_Zlɉׯmޞ6#)VӇ̰`#mS=Iks'PθMnil̮hmn'vXlg%1Oxj/0L/lԛk .\x>tz 6zr8`+UqIhj9>yY9/I;kJlsc@G5P&g 6msB~m ð@먰p'[sioqxr5oJ8X"{o5Rc]nȏ̐׋KWQXP>c?& Y#'K :ڬ)cy& Sy|uc&)U% l*^6ҥA~>OT nltY5E6,?z}GLh(_ !Ƴ'"6xlwB.N_.b/շ-<6д-rJj\Gۺ52QXڊâ2 WzՏhU?"HC ʬd,>>9bijiySF3mr޿Pp:P2br63Q*n,] v1'Gl#ǓQbcfEf)ȵ߾:Mfm/ˈ]ؘW5l4}s8QT^S[;-M1rU̙S<"Ra3_͙̰"+5lXr*YVEQ& shF]&uTL|VHn\@un1~+_bqär|:3@\s"Ϋ=H5[/Sns_(umIͦEѴ+7x{YDzB.kjϲ- 7'i0m 6V0QPjƲS sc )'ɘ@  -Nf>c5܁y0ǰYFolql>GӉC'L`. C\y}q,&'ӭc!}\R=^!q[t4.c +<^;T")" # x_ MoeSanm3zk8 R-d[  sPHJ_]5|Ix?';>+qAմߣ?S0E]N $Ni>=p(z\Ym،F3PRY,G9.4kΨހ&gD2+ fHn~"f p(v84B^༏Gq[r./"౔t !\D[bǴ@6Dma^ !EԆ*=Ro[ۤ\.:(v_S̼W<;%24ӷ:3%sRxkyF*(T\jW蒱480?56%fg'=09Ue\N؜{N!Dʼ̖ _;!,*XmzBY²}}t{ 3yРԹٱ6Uwdo;5}88Fs@v~+=3t1py(Jd#{͌EiG=w]$h)Sܜ!ƀ{7mڼv-`Xz_ZؚxCv0A|}UTnu߹fYYyIa?+E5EyC@1qR>V W!ـ_K<ߡ&??)OB\J~;_-i]zsr$ =. Ȉ 7 H:c:Zd`zpvB\ ;Uf6e*K@}/D0PvȊ"Np(O66ɟ(dLJ=Kn~,J[PHuw;C _n _ ,$G#A<G]z9vA*3"X  4syVkIY>S~͜K7=d؃NK &+oaA1 g ztcY;*GNv%#l~6-Sv%BW#bTiQbUvޏYNH?~ZH2^l.8q}%}[v' 1׆U]FA!^u0~/-BlOPBs/01%WLOZ=2#Р!Μjy 5M@,'FZ:s29 ^ť!BDfQU` OB4<=2Ax?T{2?0\="-_ɗԢz5E7:_4XQqAhCN;Px ?@d8@>Brp#ي'pV#1t3򰵰$d)|mkQR 8(%Vˀ==TV#M<*:C 7C2K,}73î^cb? 60S8 9\ˠkƞXT-ضOe|XD06_|+m'h_YyvBU/(3rrVdP<673{R`Hϋ8?@b)Kq色,B58D9 j x~aNŽpw? 0;O,/L*C_2EYIKoXj̉š%%Z/A&vא c\$vL&2Ӕ__LJCNrF?NhbCiOl(cRf4o'j#`4/jQ0c[Q | 3B8^F,k?CEᤗ"L*ax4F <ʧAܜ(#TXIF$?diVtq@ ZˇqBɡ4]1M?1¨LT1c]B 51ȣ4h**$>?ϖWѦ.gĕ*jP*&anHC20 83&BQ8Sb XO+J!r9@PJOÈ=w"{rAyP'@##A (}Ig1l1!0Px$g$ H E"Ui% CF̑Ѓ'`,'2.c0P5<ɤ1qD83#:jrF>z%c) s 3:K(Ʃ&0@0AOEXO )8ɤ!O88=h`L!>X@4 s@%0p'%ePMTyBy jE<9sBiG` !q c:e't<`H $`%f > 4F25c" 1 d$ Y0 IbCB:0(Ip 0$Ap/( \[)"]yP htX@)CE@!@A @R2@'ħ%F4@@` >D Gt~4 b k  f5:`c3p 4G1'( &@Q`S00% 8((c ! sP@!30hAPC985yPRDXy( A*&n "{q: 7`v`Ez8@{1D:9`h!(6:x^ÁpfU`N `!S#zHG!`IE%8Ȥ1TRED/.teeworlds-0.6.2+dfsg/data/audio/sfx_pickup_sg.wv0000644000175000017500000005203212140200333020670 0ustar felixfelixwvpkTKKzWWWGHJVIe)s m7/W[b~/vp˩|._mq #ЮW8fo::ľd2>3gV+˛øIx]bz]ղPU%,y7Erh+߾w1mvNVJRǝB.M1\jB#6Ahҡ!6H1T; $ .08A,c S !%q-D[JWgʱ0!%db,1whxx>?ń6|O}Ng'_?b~bXNm{dj~FSe-$ãUoS1zeJŲQك\G){7n/޽wF/u{wBKW_o鄃VYCx>`;{S5MttEVDo֜w-?o4x2\ֲQUG5p9+Mڐ>W~3%7 b5N: No2,w(IѹG>~5Lv ١~s'%MN۰' ^f?БBXu]Ǜ\k~ 1/T4 Sk CƐt"v=3Ox[=XKfAd=[s`Yd $#!p$:|L* (J!~n/Sa4"QkiELwJR1=M"Π"k4<!;P_*r *2 Tm.Gl ޾~EU,pOb>u0@xl,9i1?Xi4OL`aVU{B7y!WhHEn,<ߣz}MS:CcEO֏lJ!xE{9H#9r77_`: *5FyAY[81([ 2O a&s]-Q5Ru-A[m% `&`1XaOf- (& ~lҶв潨nE >G{Vc!Efn/f*2f@(6dNZV SZ i^ kͿBnEc<"l>g^t;fBKK듨]q sm1z#P)zjRB5hΘ2R;ӳoSЛ-=q>a5]&Å.ږVjK6HWd'-XP{SpgAA_!ȳr)3-)h"2ld\b+޸nSվ P+krLS(Jd$$ lN #@&CO*Źwr\,q Hҏ``޳(,M>g.79.$\8h_\ ʿHz >HQpD rR1#0HL1Ȍ7 $"xbJmh< |I[0Vzȏ .[n(ӛI J&&sn rd8+f~3oЮd)"sjЧT1+Q˿S-[u'Ehj?P~=~}))㞿d>*u3x"%o(VWu#(Um4;s neKahdTe;~WHOzUkr~3^%YF$ۿOCK cF LitZYmVU'z MaUޓ#RZ8W;N (@)b lϝ8./KJTa C.ؔ`BhPV>¬_W)-'`>,OPhSf]pg>Zm4t#1mO*eg5SX w4>6{I0BCV `V\;4cW?vy!Oq gss'ʌ~X4bW1F\^A7ٻ`}Sr$1acɲĪDa|q}zƲkk,ˇ) lKgB+ʂ78#nCE۩ b72Cmī0"/jAN2j[x FeCi\;|2'ƅ<|_!8f7?9r &Znh]\^>;Ok䖿jE vs=K9_C~#6*Ͽ5jXpcEs( \B]lB:8u,S㲷mLn&D)Jb[ڧEz  p5.9 k& '‹cp >8s/ΜP6=#;>ӌlKb<2ٹ.8 UX%MkFޙt9:v6h%q[E9$ZZ6S25OUO9fԴg P@BK:FgtiM[lq_᷃yCK̫dz65/nŢ {' {JE ᤏdMa@Z=֥1Gn׭kLy k_ aB6[-_c{WTUOdjڴE#_7_:ߘ}6̷!ϒ<m=>RT}1h7R&M2v7}fZ&#萢H'Sf]qMBSn}0_EOmGLjz}fea*6;1f/>cjWHJi)΀<(? !_8>f@2H0o.ɖ`P`n*{PS9_>S΃y2t1х뜈TzN`g\`U v*ėʜ?=fJI,n*SA.x?[H+ojf.mT@L=#A'f;OшiMP g^6H84r\EV0h}ylc 9O9N;usmyb,ޘ e%[24`tB؍%/3^Vv={ e K;5x q/,w'PQ᫤1b*fȯ=\.vcf>*O:)෧(< } r2d4nĮ 50N!@i@ \͆^W-f@Akd˵_<"E 2ǐC7}\Fk,PunQMNFo$#-I,SP01 觵@,q rz_5L7wwK?6rl1!4ZD2޽Nx{7 l[b(M ^_?lWSx!>}cs{9< N+նBӊ?ۀyяo~KvK L>}q{KTD>٩=q'%tVӄDjvD9W ,a>;dQTCF:UH۸~HPӢ私G.hlvE%[>(;"-b H5lՃޗ d@9V]W&I|ZA6frMOYW^wVO(ә,QapT qRV.˧{+4ݓٕ熐T.?udXL=8נ-)PC<FGfg(2,x~/h _%{@v.pihAqOwϐ!فؗ(uܨ e48let=w,`\^k[)M)<7f)j_`&k/P##p Bs0:c(aa SE?ޮB@e0;,TZڿ!CFGWAV+IY˯~d=-)Ąc,| Iyi~yO &t,"(Ja1xQ#ӱ8[ރ')ƣ*ivP$& 9r{[acmRQx9xPpܷem:4+eP&G O)*:V7acL ]phToS\Yվ,y^,GYz|y"X06(15ˌX'"]# H|/Ŧv]*JY …ES[ $椞c0[azrb Nٺ;i+ě8m$QF$Rո/ǜ_N>Nڵ)v.^˙(kÀh)n=`ARŒZQo8+*/KqIMH߭)W*zh8|ơt]* OlK,0ԓ2}oΝx$N!\ )iBLۦv^*1R!pinOϠ \ PxXB:ΆTSX~#*Ր ШnDxa5ZK(|T:p QʼnE9c{Q%.]7d X}UהC|VlJ*qq EaporvD"LZIs`**S A7Z2^%D=͍jәM, H†Ak͝n9cro,5TsHѣ)xe=2Y>^^dnIۡsH!L$jГ O0@3hغ#0 %K5'%MCMiDp>iՏ_[L{:)]pR0W$bRY7lzI-<nNNF/1BxdYI节Cx/;Szˆ2'UfBb!p+S8zB"ֵtW~ >,]X,NĮ&T܍&Tk iPͩӇ@T0Y=mcx:blE8ບc3 ;kf ^ F!jpV;_!E̮ )ck^9 ꞻ[SwQM~+XR]K #Ib9sbT-˧ r)7V2e݄33 +}2İM7VԯM~޶3kև(o.8NZd+!Uz_y^ܘtM>λ,ޙ/:I|4YwCd *WD+EpԌ=&s1Foeg\ia^.#py tu˙&k!7xjU`i^~X%we} Fj1%!4yH 2&\o%7< R@Jgrjcw{;_9 ė͋m 0мX$1odqʂrFNUԝ4U.o"Y$_kwSSǙeaL. CXʺ`{OѲOWL֪NZqtByUc#e E c0e?b~\Qを\ɂ qML*6J3xv0Bj&̳Xy.J'`#} 9w>ň~Z(w:(Vrq}[3%v8@+/;U "S խVi:u)n#FP逿k(B4Chin%Kd۶K"l5Q]tfYImosFпDp}5%Bkr4V$߆OTc&!IsZXB.VfrHHKaBGj=ĉ`#&љj b˳~Kingv)J2|Zaq*6'\+kX-2.2uqs/B\e ᖧ{rac Z v[s~E&IC|ƺUtU3}"OV0(%{d48?=?L+u[u6 *2$G4)rl(]8$ջYkHE CVH'5vJvl͛:FD=oEu#Ú#Ŧt>yU|{JG0;4/;q9Z]qu""mxcf}Y\eKqaV!eXzqZ+Y탪~= l*ʱ5Sy4 dZj>b 1E3ԑz^-""hɡfC%C,:ls#78"it/w-JmDpr M+j=  @cn)ɜYw)>hu1#M}j9")r0O[EKKD|MRRAL]yGXoRrymo|v`=u:*ga'AȳI$/ W8jWg qSfjr\~ 4Y/LgP3M'd@m)~)TcHEuM,>@w4/Tpٙ4ӥZe"Ίae.0(>$յYBZy[Y?ܶԸaQ'VKM*gvPe@"!}W f=T|*4k(P;pk&VI۰P3H !J<݀ؑMߩ = vF7ZXW#rPfj6}H@tBϠxRte ˱#mʶm X+qg,!klڲ%\hJпwDesHbW{"6 tOVbQ:U1$ ٕi`̃6\gyb^'A: r[5 $ۯK+# Wp.G)R^MaВr`4hIyY ,eʶ޾sE+G"F,DUr%^`F47&k͞0-y,7>9nG$Sf+_p$wCik9˚O_ f*?&caC55 أqS lA)!rx3{cb'A2Ў\ cO?g[t1GW-fh $Fs&OhhB=[l@"KCvZ:S7bPTIt/ NM(k$U p'4ߜ>#y!yCb&^?j&0 PJs5j'e=$ Qan؆Ii*P{TL"d|䌺EN7lߪ^trSA_ITऔk x5juՕcF 1ךrۄA9Q%:OYcgO-{q H[k B̙؞keZ<^*:jKgh?3PLPH6mxcpZm,w0 qy,,.>[MKȊ h1[ P׹CޮNvk:dw,־\W+dT/;s+a-~0V-bo䝥o"X~rMvxvAݟU.qu EZ^9~cF.ڛM vu`xyz4lTMxB͡ ,́GA/'_WMd5xսg2];wXO7m;J1RT-i1do&Qb mBb )B.2pu%Y#54!cC!(̛ re2_0k}YeP!-͍w *Ų#m]J#?~y' [Mx* p>Bbp66/6|'SIH\LB)m2BɂA|=ԟeocUEV ONZ׈\G͋/_{ ޔEde9W훟9= 8 xԃ&_HS2K``|X@UzLIBU>Xfh,>2en[cl 4^`ZO&ōGXq.gE:Δ]$ôYY-tD5˥'lk}ԟ9m^MeF#cr1?.`:Fm<-i$Ʋ,uC'I)Y6&$|Pă0 \ΒuW`:묨~z7{0+j~ĄuJFwCw.uT?$^f;Ӻ~?IJ'RWBBfźH՛ z>AarnCm1-ʥ-1Sm|FG$2\a@ IֱOٲ%7leќx2Iґ)4Bb56.輎@q&c8ۿf SpE nK R`k?DYT[?y /3l TXeǵ|CE0 )RHYHX|Y]I=wIɍjƒJ? BsPE>AVCCfFm9MS (I+4+5jwr< 3)]2[CtEI `g?ŏ &lZ8{u4`,A3BNp9!neb^4[>/m- X ǤX"^&݅fGX%БRa;,圸 ШLHB+st '#$*I- h'˜va Z8Vf]%]ce54X a k̝VY2zoUMd2 Yyy G^DITZY6rS WBJvyD4em3+D!N8sA?4.U@9JaHӣYfR13 2P>&gCezpcIh(RղE%Y+)+elr.e`J6ADE@hl/?cph̀ZN h&5{pnݸcTcA?6TaY2˗ 9 fp~@L8?Q_:Vq1TӜ.2@ /d]>گ!ae"ċn]A:3iw% _ M^9$+E?4hEL&qBh9MUu\#@^NsLnM$`Eybk߿W)o&m[/C}rO8_K\k_&>"/@Jcp_8RCSwϒG~n}@ NU9g!R?|)o}t9Q˵فd,;4Y/o-ȔxIzq;vߡ~ok7[5#iU%'tzzӯ& :?F${ zƠ< 'o%#p͉Bfk#Gl%<w[-Cg&X<9;izfz_=5O;-E+c׽7d]effmc  xh x[/l=nu'Fr>%WOܤ)0Ca~ck0QÉF-6-xlΙY|zz?o kPq|+ %cȝY/.t?FYɑZryQ$L-xltz}X=J|PϨa87*o 5H'aVffڃ=*?9<߿!;Kŀv)c+a& /N7|)l&+~:TrSI6!xf,ץRG3yuA*Gc8%bG"'0>FJ^?ZxDž\`4 +^Vեh/3ֺlMZJ_jr gre]A(}:9̾ɖK"]+Ԍ`끮[}ҞHj$E =4ψu/LBG.p5>;+6"1LAkn$3&ʫ|B0׆{2$[gz _ipHwܮji*:(+f TO&MFqPNM%XDX̛\c(5jP7cv/O#O [Ŧ|Sƺ\˚AkGK}aE-yO@"+9yTUvC:3wv0~)[]FsDSGJfkݻ-'[t` !CUܑsHEmcʈ~-*]x*fN;+?Yxs4ۄOz5eU)Xh'2jc!݉P\ M>%QA̪} 1AŲuV(sW~!w /uZtBdx, :h/xbbsm[pwu?:QSmSWT/?gI_OVv_Z ߘv = :>1+ ?MQuB۞]WofSuټ 13|$UIWCO&$"Mo# ̤1)dkÔ(FQ9~Yc("nFN*yJݮyM)tM\C2ԍAbfE\}Oؤ~)#~ic:$ ;n)g'*}u/3vdͷgPi#,պq?O*g#ůM%2k4'~Ak.:E|BF49sȩZ|_Iw9Mi?؈R 0@C] phδ5x/ V%biAn w!-b{G?B$_> x'pJN}3'zKq vh{ ;MGM \1IJfkI1ܼ;&:o ۻ7u9( <=n  N2^Y]6d:+5;q ̆$q]/C4 |d7( q\JȜҥG<>q f5/W<Ho2X"` 3ozB´={F[y(=Mv1MlՋyYPXќ-X90 {uIX?r φSHWx'\j82`p HD%:JYGӱ>9y  얦#g\_S]1;V<].m n^0蟞Iӟ[`&\5rGxWB|9Ulr0M{VEQ#Ds,7e"+ GӵYgG.bV5Q4n~@/[{*lU5%GִWy fb  q)4W6T? [&垱%h&Dlk.(긹{FbG{sk|Zv_-jR~|uf]eR>"(Ú(< iʞ_62f?2{f4wPie{~ETHь BS4q"ppL3yK94w5|V*LU ,Gz ilLur w07QcX~u:HJ|!&RH"g*Gb*Bs~4wlZ1ξJ ӕQ9?|e=`q^/ctPdnb?OmUN\St{'.Ahk3B>[:CL JMPUPįŬZ^>; ( e'L7r6Ĕz3QIU.9HުUP[_Ͽ_]&E+`(ʑ75畿kQn\|5"?Y\J݄넌oT}j#ګ` u3gg,Am{d4b]Puc Tª _lB3Ymyg!U ՟`zg 4j",t/z'/|kv؂oZHhE1u&PM&WR'EIG륈!P#{R=APeTpgn lq-pZZh#@dUwe@`K]6mHq]&8oъb,dl&&S1NF(5KmAsU9]$eWVyZM$Cv]..խJ`3BnU_xģ UF:eu F(@-/o#v,E4' I⟀!Vm, /< Y;vAzjͥ4fF5ӃP`TQL98Xњ/#b}LqIMٿ3筴"@zeA447؁1Dk"Hό/;/8OpA=ֽ e0YZ_ҥO#;veps}MF*e( B$WLigwv? \NP{a pjE^1 -KX<%ڹL*$EOCJ-?0(=ݎ*!"/:5?O&נ_~~׶L-ㅫs8=KtUMעSfW[dڝuIضmcHy? &Q͟)&'ڝP14jh\콭Hz`fCgnNH.C(JSMז-NOȉׅ^oh{UnQ@RuM\=.y:,2@uvOIȜW@c.zQcoΩ9 pb"̢bc#2Q)ːTǀRHa* 0dWE jeL韴pYcu` 0fpAi}pԘ)+aFFhk5!OD{bƇ-C\ 3!uԉ ja|~/{glePr =|* Y‘[EL`Pn L]x(x5"ސ~Jn/; 971~"m ޿ӣq3HӰd[T5sT,e E|G wXHڧS}9@RݔLjs#gYas4j e=-ð1Ƙ)gvc9!3k^LenT=Ȟk<F&QY|c[K x݊K!@M{i c]:UKiO&@aT /o0 ,Ŀx)GB`<$~_Ft>3ukwXq=$$b2\r6 e R"(.g~_yT}7&RøbXo.T]b AaëƟ2E(%%fzA]&%i:T"W]ːӢ`c \z x 2ؓo/!BT$`CmWi9ap?ECdP)!;ιi*"$tuɀC0&Dɗ9auu5Gl>wfF#z$elӊ_q1%): sɄ"heO",=ؿdZ0ӨK@ϲ60eiIY׼ nucZ]T`{js5t m^*h W)EIuٔZ52O@捻jիxf+$je)ha f (Ujyqp#; uG8 蠍ƞ!Um`6 SX,Vz1Ϯ{[dښrY9aEV_Go {c&CeڹBYן|A.ֻ,D6`7e4JX[nXQvy!ӵVuP p ((e8)6" ֩$9pT;=%krDhjܔOeHbo:UNkNX/?5 n Dp teeworlds-0.6.2+dfsg/data/audio/sfx_skid-01.wv0000644000175000017500000001072412140200333020056 0ustar felixfelixwvpk!!M<%V!RIFF&BWAVEfmt wdataBBWWGVHCu\D *  e`d~P`,_CwX ~j)@s .π1)HC>q@Lj:>jדEa"@51y>*45fiw)>>rC LTG0,H j!J83!aR+3 "~G9ibGkf9a6 5K40fTG6+5?$8B'&#m4QVDV"1ˠ/SCa4x= PP|ܺ#{h1P#zW{[jV _RԽF#=wa) >)?y2E/ILZN X ΨInAsX񂙧d>wVPc DŽ8;ΩGH\Įj@pTil&ASpApMJ d^DtA.t!Lєذe50}Wc ORA4\as]NU b8!M(R96 +YuQK#t, c ;niuŠOWqx^~ZgE&iH7Ls*ZOyi?~GjpO﹯%)W}QZwdG^4?Lwd?O%cm5?Ͼ?|fDK:xP`>}}7?Y_w?7>/9==䜣2q8La<|A3$@?k"'S^il}b uW aN,SCépn%蹅w}X|Ee}_^E\?J1(U A+lxd0[yz@yaٴ*fFs@j1 fq񵧣,,te'!tWY(Zpշw&+l1"HeLV!j ;Ǹ\x^ 3jO N(46TN>8YP^鰴;`G1g 409X[jSPvwGuu ^Pz@6>N'e8+}5]ȀszO2ѹ Z E@V%.dX|q#;Ttg2豉4t4c)Yr64 8kDlUXS/s~H HI&AG)H1x .`J3ȧIIeDPDH}(-QItDpq3e2؈>9A Y5V?FB6˭ C8M@|5hG-R~t5hU*́1P1K1'Aq`c@ ۤ$eW I_xЊ;!¦y1ӞŁ1q\)YZ7PP AIۚG!2[z&LTG_xnq\V,m+.00*`2Ф?z/VbFΜBYu|#GO̡Uv[ XFziBlm~yCrf`IXYȮA ?/8tfOS1߃:1'L՜X!x&\>m,2}@m˜H" ^^aV7|6U1AG~|WBSL2N'+&Ag?д駒ܞ+~I5u[w&2e `&12C.Fs>7:4*U(9: )WGO(,,"""-w @'"930i ABEN"u,!2E.  DK6#%a!P5(CRDCJDJCc@$ I$ I$ IyP tA@A`9@ 8@ `ABdH QCLjc:cǍq)r]@fӨ@@1T0'{oi0h=JD@Hdyb|;rwF 8}ᾮfh@Ep-3 #TM[>|]7ɑ KN("Ukd}Bli2ɞWeD8VҷK=1blfΨYj.*f,]a7zTA J>@hbd"9H-MPI1̑q@9ɷNd~J!i)k>uB:0pq(M㲳Ϡ8GDِ6V/{W@:d ";3πv,Ѕ"?.4Q?+U=@CX(g2( 'r'rN Q@Bwч>>ƄUpU#O>P}_sQɟsoInPW@ȁ*NB%N|)JL,w9K~hdd5GRJ|5?9|q+bqzQX(D2Ȩn9|.臨 TXzô'h=@U1`iRi[ˋ^22ʮ=0Pjg aTkM#/pJXblj&T %圍i5zaTvJFFFլ5O)1gjn57@E03+@V8@i) GR܅0PFIy{p P()PɪDBtFEf d0 !# k%!$I$I$I$ IHJdL$ "B<⠠РDĠ  T@ 04FAu9FVC~av3aߛ1}y+?teeworlds-0.6.2+dfsg/data/audio/sfx_skid-02.wv0000644000175000017500000001376012140200333020062 0ustar felixfelixwvpk,,M<%R:!RIFFYWAVEfmt wdataYBWWGVHCT0  $e` ]׎e#ۿ^w{k—'7&LF\9ǻ#>ngэ2]3juVola#7@xX^ď8ޜ&n*B]ijޒ22eŃoNt _s(c?rmw|o翪A_SyOɃ?Ohk:p6mm0n|c^ֳ8A߻|1ܖngc-j9Gny`ؙx!SW׭TLөY` " yQ{C) A7FU>elM R3d3`>9 T0+X2,IY,=%CXtCpk0UIz)s>~'$SٸfA;zSH\S(/@5WF=aCs+hk0aSJAE5/p<`J F"|5d$/#FϛBB9NSIa*jdxeOO؎ǼP6"\{ο{bw{J>/ $BM TMGT jN͇X_n4g`?M&* B*@r K5g5BŏRIDz2 Q׏u-&S B={?n,aE/>Ix4٘o+h(X K bgN`A22TrW~C9(t84 OsO)IFF,dgA2T53aLԪE8h)d磉v(9` 'Yh`X*$-aāl 9*x֦+GC$;q8dB0?䮃PPsxS\w4q%݉3!TI.tEʺZ(uɫdBq3}>6,H4S[49 @'PD:ʁ&Ȼ5c@1ݱ#!Cȧd8!+cIU_+ =F@aգ_, < \$Ģ!\J.KK84Vؔ8îBF2|P(|A^֮ J_;5K?`* -'j~x?xKzߏdf8rx#"81@Gj'b 7@b ygJ__rS ﹓:c[`!a N4Hp^⠡:vM:W H±dNhX7Ta1R`ЇrxFIv ?wd)-j$,O{~Bhu304/DG?P405D崇@"nd/ʀ.&PFM; JP0Ǿa"}w5"@E!WᣦQGap!xă+CS#4dr(XfAAs-f+j)=R*oa1iِ sGrq; b2wDh A ,&BH%!3X2G$Bd䃒!2GsI&IRE'$A%I$$C $(A\P@aA@c{&Q a)`8;z=*q& y:){Q~9YMG:_"_J}*Em9> Y*$!rhN*dܦgX( NNְu/>bX[ݐ;k NmR%]5굮. szU@s*TۯQxpE9]π p^pf 7aebq.,Q4pWCmCMr,Ϋ&x|(=Sc9j?-H!5r--嫾я);$wc' #QXaiYD (@GZN$P5n^֧2*M7GaFv'X,QG.fQlXCs7ԛCzS."FԼS[,C~L04 ӣ=I(Yo 3?TiH :'ePvcٵ&$v1♂.xw_+r)mB"bE|7_v+=mϋp_PsieӈY(q9U հWvi&^"$QcDCKϦ72{גѬgp tx̡|zqBm%{R X8V?_m@DjdXmƅ ?/CxfJ?07Ô)u@ջ$}Ri+Sp6 ?v}gBǷ5d vDq]!$ _'囚8ݡMM1-mB?CQͤݭq`N2sM= O#?\mG fLnPmsG`"dn+j?%c< =3 )sga513^c3F}֗eGB1M xfi'ɬgg24 CCZP3޳KM1(5 RVTIobdI?E"7GAYNA' @>20fM@c48 ; `fB*yAY@ _&Q0B@qB5Q@5# " !I2Q$$$DQ$8BB 1D(!"$!$)h G(D!hp A Gp XI8|\gMvp*j]_Cfh+|u?=k*ˮ?<>.o5nGy?z4ebXG~IEz2} }?55z.,"l!,!`Sx_᪬?W[}}5W'qU.۫W]ÅR2-gE5ߦЫX8@aYk"dzHwxZ*x!_W9"? ûde20>*ظo`Pd+靜؟sV͂I-A 4xKa(MxsOҐm p " Az""V1)2hmu@(qmu(С,,AjtN).W L 38WA .ےn{q1,S\PL ei݃ 4zyVQ *M=XG; o:SV7bK G x<.%f]`0E;ilPi=3PZb>6q>kFvFr`X=+h'p phz[cmwz)(TX($lXfa6O>=8) h̿ h\7-Z7-#c6BHYselT?JD#̫6Яթ=d:D$G[Y"~Q2$Qjj~U$A]p0t5c<8P*. ~sw(.FkUH8qR,e!,P": ҔxqǂYvL]p+"S-TP)?Dٌϔdo(OA>:'"W|mq>A=|ɸN.4"*9J yU0'xs-&;Vd`;&%yL=]$~j܏ >\;PAh>WH.`7f=A6p;[b("'stBcY>Te#IDK˗+719D~Quf H`st0ŞpHD>Lb4j *ubc:`Q[9xQS_Ƨ^vL߸G ib %{Z,Pb*yh!lvl[$@Z>H$ԵH? M|. h-/CBɄ2.1Q cGz]|R_/)vX7h"pO O̲TJŘMs@tK%y2bԌLcڃؑ!tdžI]ЅC0H/BuK3SR^U+WD@r W q%| C%v|T" dZ7(dM ;~j \h˨B)$foQ`? 'wGtUu]ۆza hL9:h]M>` ^{v ^7+_S7pAt3 ' .jV02&d`ffY!  $`3$$$D%##HI$ $I$Iteeworlds-0.6.2+dfsg/data/audio/sfx_skid-03.wv0000644000175000017500000001335012140200333020056 0ustar felixfelixwvpk**M<%I4!RIFF&TWAVEfmt wdataTBWWGVHC[;u K %e`6 `3vPRg4 {/8T>BuF}>}RLG d|OȧzJp0{5?|uϪԴ&PVZ'A!\BdeR 5@IHO,= aʐB%"@H& @$[dQ!F !PCx@!SP@ @aC($$ T @HD4B@ @@H< Ar0!DQQp 88 Aux0I>9O aSK]F'?3g '>'o Ѵ_O2{(tb׏|]tpϕ0} ,+vbǑ/p~M*jӼ+>'ilx e'g_?xύOyFw?wyV.0U7>@/^^|ze5-!WZDK;g}5!XwYEngwChΛg'L*eVsa<ƃ?s@Xhq {Xc66)(ʠLWujfjxQܡ"΢:$oӦ|>$ȶ^抲v^Q7|,MМ^F/Q$(62/nEaq%T ,d@8`̵ڑzR y*p&~Փ0n8!'=sRv~XqüO;E ?Oe!12N[A>BK0xܐ H5ďѬ J03j?Jҙ `DN>EjncX|́; ^*Aa%F$5afuK3/Ǖ*%!nxF%aI9 AE*t0L'94S#ڒxe<ֲǐ@" 5H$/G3HkZh91wk.p\p h+.I$臂KWV1a C, *}A[,Mc0M!\ib-@U$B"#qN4͡ It= .B`jA1%WR&k4{>)Ej&.ne+^ 4-H{kd\)1B=Z F4Hs:aHc7 :E%xկS?52 #-яX52ş?hDC[3)X &&U̴c8:cw xPSfiHfRR_ ;n @qDXT&Oa"d{'C@P.,gXB&^Zq"9HX4:Tʸ?Ja3\KNa.UlȨȊa>KҶ酠QԂ~I+W(?:2ǯa} @@rLFq&8}< T"2NR<dm7yԔQvM Aq3 $ #E-+d5?A`r8x 7YTO˱@Fԗp?&ݷVeȅNTiP_d|\#k4l˔ Io`%F#NMHOg,e1{GfPj $*Rf-'QTAGY(x1UV*7gG9p 9< Ŕ8G(2H!$0C$I$I$II%$ IɐdH$DH$D"PP:!% @hTA*x@e:8@@@ 8pB@= FA"&Cs" ] :|Aj\r?!%エVȡ84KT8`Ԛ33a-YEcI~{~4`zP?f{st7q0sAG d+̧*:1B>]MG&tsTM7H٨ڿJQ\5Z{!YlP)"gFB<\l41rQrESglSݮW-o؍/]g)=Rafy~mRF ,Y_qP?I F,֟]yl_pHCF7`H d_fy⹙')})׋ #H#Q@MUn/q,H~m|@@G%1 3CPT_3~ʂAʏb{nl} qBTG$5;BI[j9$:Q8ov``,S^"h2|٫dMXlV.KT/lGXsN&(})}"e?a<G)!/8Ǖ%# "olAgX|=>ђЀ"FJb! Ѓ?W3$o?|?4Q"[LTLP Fl USEQhH/5(8fq9+Jxx]l|cs ѻ_?m?*>00XxbOv8̱VW/S8m`VȆYG>`bSN(fG$?eK83aΜhZKn̑I+rUBIOy$XVTo%, dz6 s$`cV?"Tw / Af X=>x' ;sKpq@mrmU: Dϐ(]T>z楈P[5ie4iyQ/x3*OB1lJ[DL aW}228l?8fZjD~b;H+TBugvZn,cj#p-2ʙm\%[J4h,<\#*}IP >%3!ٚ҇)\j2; ox/s t9($SH WT?؝u.#(Pͮ5@F{*;^=rÍ"|5q0|J_YO6!P,SNZq &&& TS#[> .2`fV"Bg/KgPCb|cYzδl2%ށigdBwLb7?\K8:8 I$T+8e/]БfUK ߈f sjRʖͭ4ѓ2q(Yțo"z1BH &$lͣ}+Zx_]_efOA&hۏjfԑ,kr~A)$ȼʄԵD;fU. )a@7v| M>ej0LinȘAzAG r8⟇uouo ad pcF8hdW n@DXSGׂ W-P}`˷~~+m; +i EY_n*ٔ?p6;͡C#VfGqgX(Gr!m,80TTQDR]!S;&S~III_ݝQB A4ꈋ)b9K C7x9M N!k| 1 TSIJ?r0H?{Nڸ}H5$-t1yFN[C=J÷68uhxs#A7*ܙ(o&yGҷ Tbtjr$\DDө|z+ZɧtBoJ)1c4As*TyJYr8x 7)uR߀GR[ |CB@`7{ژB&M15 ؟(#R9kpd֟ O1ARAroCZ1b' ԣs˪~G*2ADܥ3%GNey_C=bß /LF턔 SK&BKwF]$";yQSdCL;91.J? PI@|ӕ;6o_b<+0AE GiƹbjH1`Iɩh4(pt0BZkI@|!" #PRb0Ԁ(X" (I$1"ID!IIHƒ 1D(#lP$!"J`B QPQPq qBp I` 㯏/DV1и({%m;5)_?|0;޹a'SHnqr`}:=?ĞL]y_u=d ˳&nJK4e]' н3[wR%ҘY'~*?ɒ'26*gD y=x$* M 6P*HWqT!-m^@p\WmMPSpi]HZֻ?1!i_"bb*VQ6[߃$' QKn?h$\;<l_>*pTu=G#!GHܳM2]_TJ8SGz/| [K(yMv@?_eW!ߠ*:Pch`P E#MJxXⰎC_&JnŖ> Θ}MR/7#qQ|+>I"@Ay6=ar. Ly; 8̗0UD9aDO" T9v x ;E1AKKAxlë3~qwZ0l V$F'Aec+tLKbuWDص' bGH,;eE 1X:`Pi jrhY[B/p>[TO 3ۊa:>/(CD^p*CZ~q%p2 Mz>0|QOR̡Y&qM&<+g.ljsLS||AbL@6̫y;:xK42!EN6w4qF()\ ^;ncRȇM@߃?,S2ٖ4c#j xhG|%vīӱ+ťHgӿ T2a*+IL?4ߏ%I=T|gΊ7UT\OiQ2$q -\գh@`sqk|=Зe 6:~hu9X RI1[61?g!&vo@%w@ ]k8r#򉅜]$L!gO$&`^ɪU|"^殂4scC ?,D8||Mqb8"V8@`S!0D!kIdB朣PC ՚8`(6a$I$IE0$I"!$!HH BA!H4A@((`A8_~'{wwnoE ߋs4}E $>zc,^wR/qi?#>Ol~vZY]QS2ok:G#wSh-IS#7lGo/Iܼb9Ї|̉n#e% mjV$ FWc / LU0T!)KB:)˞EJn2+e)Fbtį%ȗ|R%]2\@PhXz9akHeܮl#sz0:bd5J_iJ3 riL%3'_r i!,mT#sf%? 1 SƇ-9A?&6A7|n;9yyV`p?AB$$ ?E0"B{b{%YyNg6R[G<3MC84'ccIАPj1&Ph'3'A$B<ރ^ZwQ(1,tCN TN?(6| PpF}Y`Bf>(9&Bcd HD^Jy{o n$CgPftN`UEͬ$(P`mBx@D8o`IM)32Mknw~Ȇ1+; OE:#1 R8 F0&Giӛ`uh|D%yIWģD" A\RD12@ `@Ig$$IRH̐$I$DB"!!"teeworlds-0.6.2+dfsg/data/audio/sfx_spawn_wpn-01.wv0000644000175000017500000003212012140200333021132 0ustar felixfelixwvpkH4..y6 WWWGHJVIefffff 8 H|NIXpsn$$7tXWJXfM/m]W!> 2ba3Lb*m~pA(<\%IܱB#P İ9( )C JSD))r)yG: a~e(*(1j'tttE`rÙd9Kl?P<'wXH0:J #|IR^0aI O813y>hpÅwDIx`ƹ *igCkDI 5 Di]: "PbQcTgkF#vXy<"bB8 ,ӮFJ P&A>(z>+ _@e>"zsxfļ̀#,$kCLQ>*r s(UV H1".5lIt τB3z:3ffs #P` 4MGeȍg ;#{[?S#Kk#%Jc!? Q,9J dr(Z{1tj/Z@y@]sx-\K>`LYIFC!UdX=:ӴmΊl?9JD-nɧFn5$uk O^a&Vm<] 8¨3tԼ A^YZ^V:)9=5SK ȗ#ˑ aob#adQkjnfGZp[Fȫ+wUR8odBj\ېs4sѪa^dߞ3E0W:/ ۭhw>ZEwUxMvmɻ6?& Tɘ[}I@~'ǻv r ̴uo'켳wwȟs9RE0cH5 ]Mh!KWPĈTuE"/`Լ7ϝ8V-5W_8!Ο(4jg֎ QW6n,oP\믍 ݞ!4 ȆfJdM6L-qE=|ʒ) {ӳ$yy1u7/k&;R[43.wԗ[k`~(ˡ< '撻'f޾ ۚDhEZHbӅr:1W>)Y`5GSnn"\3כ.ўHI|tMeէA=ǬTg7F#pe7'RdRL  +]@;w?7; %2:luVra p x2LgAVnw]UXR;̠aOwl{{#a?ciVp*VR=:X(-pfԮOpan 3~GOCXk")SdEJ$htrKY u9mwpxhS;X!D _X]jyAS?@T{tSVpܿx8;:- *捥2}'d K%fNMP  !zijKQ}6_m'UvD,ɟ"lHg-ac $pֆp _ɶ膵a h&*ߋ ?-/g$x}L/`Ω;|V`8+2'_e}a_~ AtMz5)Fa3 Q ߣ#%5՝3Lpip3O}Sv )\fAoH2 ȸdTэY`mLrggrH{_5cYz k?v):'"ˌnm|(>N6:n3 G_˯4Az('5eԄw9:% LO*PNAG-R=8ߣ|4_o.CE}~Z"o[ZUB' Yqs[xM'O~3c'7&rBFE"Ec +VڧRe+T@|"/%Os j8D@5Y7Ft7BCx`X שAT:H#s5QDV)jl0n~Fy\Ύ#-)H=?HuVOl+GBoY .7x5`td~K\Rځ R_fgIcGzYj!H|KVwi[m3 a 'ʢ}i]";},2aI2|11dJ=Ydԙ TFQIIO^Tԉ^_ 梼}v<_ eb]$3H26q~>pBQR}e_,)czb2:eWW->Ʋ8{w7VNA}k.4ib=]⇉Y'g"صD oɘ40օHh tR>66)/ҥ7C8bd2!y96UuDڍ4} Ԏcr-)5զ'c}4vrrw M`'ۋ H'ab"8 wpkSnBdv^O>M[s4`Gy]?7q:_8V>Qbw3>9z> %Sذ2]%5EVwD0A!;ٌۅot ؀AԬWbR[h<?ħYY[59\УQ85w*nsJ/8y xo ea=6tI{n\n[:='nz*,. 'Zpf3u7n5W#JCXi-ZEw=.1;nַ5r~Ca|Ulh{w~-^P fO'2 Օ.˞]׋OЁ0y$}Y"Ѫ-t3SiE L`C2L@o-Yex+(ȸŇ+8u<6.3 "wEN{uwv,ұ #r^PLJh\,g*D{H5T{m70"NjCw6ѯE#lbiaR= 2$ ߐ+ 8$`tRkKWq)yڋؒP|%j>Dz"47ld#XcDE=-L|`#ÅN)첛[@%H@h=`5'(XZi^l:݂'^90}}'n|)(,C:&ឮ7ui$(bJp-^qM3pS*y3݈F@2(N8տOr^ i &l~gS?[XL-"Z_]Ma8D>Cm̅&U;MN)5f2h=j.vΊp]@3 _ij.m]I[Gy+`6ћY3ϥ/ # {brĦχ*,oi*Q sVުUA5½WenW ,vPeYi D\ 7ǽ@fk֩*CǵOd3 f$+T^Qo 0jUY1_:'[Oڬ/Z&-J@k2fr4*^2u ;~܇i3lRj2Wt]Wb IGF_KPbݞ1h/H&&".w2y}P*b4M p1ݘzWj$Z6WAFp0n/!Zͮ2 HV\V2* 1Gۈ>IUfwl`\ &Z#>C(?Il%Lxr6?;(oG 8Uq~8!aiؿФj 2 ~-oLK,`( VJ+90䄹~1ɻ}f66 g &`=d䔅5ڰ Mޒn|{caЉlf 0r,uܿ>> rj`lfk%3?SV\a@A9~˷T8oZ|0wBqAgmʃI^)WBū!;.Sҿ1zeWľ9Cg7*n2+M3Z"RTQ:uhiЙsG*GI*h`'X ZslBB7FVDn=aԖ@Qzޤ~LjeKI8j 9H[ @[9f8eHL . 2#-U*dgA'܇ОSQ2k VQJWݑ@On1E+="-14%fg|?vr:9܏\5L)1Qp^BϬ?|ߪ̌ZeGK6%'ɒL5vhb߼@&_v=CVmQӾa'ŎcE'_1E8?aWO-K%Ta[$wCC*T30KPͣzKy"0sʈ_ Ąt_x^ /#CO9˕#s$ԝAKҏ]FL2~rqK.|;RnA [|xGa@ЩajϠ( ۝'с?o \;Ϛ֑IT* 8$:/W g6^q`1x(&:A}~cgyT{Yu"UQBs|3#l&Sin--SGoX _a{|?m/S,d>S6`bGux:kLYL٨7$Nc!˅Weea#rqgo[Ȳ` :IlY/IϾjUl&A!w (O*st[5YQ'5JgҪ>[.~4.To|R!/>j~/5DD`elBWCX*8C5UoGpSY&]PQai#m|rcgjqȅ@I^>b?A~?_'i:N3;ևOZuTL*2qxs-Mp:L2~N lĽvGҗ$ t8;)dC^U?W r8'[9{%&qwnJ90v?cfT,p cG]^V>^R40|C.F {,0+ր$ĨCmKCq1@Մ|~0I*YuڅbNq،M)%#_Sgw|ZL7[x= dzOg\ڔ](Y}CNRN1Y5^KIi%T8yBf94Jl&Y_KHNgL_{sikx_9'Nڕ/{ZD;z,W0th>sqRHWCqv]E!/V$T8>y1oۯu&8eYX:`F|N[i\t+v'mio{!)8ܢˎQnU%6Syi?|dmg4#K`;[Ő[.5>>U&RKY_|?<ۓPuHg,|@eej}*21s| /憍zy Q; 'hkG$yB*MwԴ1˝*dʛ4sGۆ:/f'c͹&Z8tLLW0R%Jg(f1qXZuvyqZ \ Eds E@Ùj<1d\<3BFN禆б^ TH|KɸeΟF;=b RN]ؒkJwWF̏N7Dңc $Jc h֤)[TI}]Z}LѰuZ: D. >*w~ʢi/ Г}󐹪odϦ-3jvf&-!/`MK3WP 1s1~K2D- .F iB9Jo,\'nA-|Z`9s̞o-gK:-RsrsJrz;gd%,^OhdÓ(Ry'(Wƴz~pv |/z T>p=~J:;@Dܻf:wMsZ/$B%P, ;B-]];pٜ.`k'{&VK{λny71 ~p?O},k74EH&#,Ǭ[ 4'%8eTK1f3]AWMdJlmNIkfC۬RE?/Ն;)!&;9'rebl@l y_j ȖS 4iV[iam Iʀ? \N.42ݠ gT-|!-mKjifx.K]SфƳ̜6]66Xioe![jFX_ݗԟvzSvs e^=V_ ѭ5a̓DҜt R`P/2Sy7.a/cs/G hXXE /SRiZߟ࿔p"jʇ̻{>mjW_Ry]IqaE1'N2d_ :dW{S[tM*QꑣE?1q&wΗbIWoVTKא4Ҕa(}~IuNH,_ljwi8lU=ZS"uwy/wn /*-&k$> ?v"zELH_pPdpg]9nbx  wKc Eo xa59=5 x j%VIzRN:eٗbO|xH7J:h̻.f#,KLŵzwӪmUbF@-Ԣ!45C-"5j.(8u_Ǿhq6sȄiϸɹ#j'sDt`I^l?`hy򝴦"!4F rqfТˆ)//z^WȌR1ab3'a,~U#d1$P2)__G:u- Z(3=7hnx?'g }mVI/+@!*Sb6 ;F(x,u?xsORGk">1XtXq{Vv#yQ&'oRIihiFᲳB$by>/^g!x w;NT\j㋈q~1*ЕY5xg,&f쌈lF|FzJVi*3]FijD7wgR־ĬdS}9MU?M]YdKCb"s=_h\U`Q*<*shUN`~ܨNP J(u) kМbNʳW9o3dVbU-XEXL{DR#mݥ)|@1 zX}|ŁAX5v ?480xѺ1K}jkfv|gҗ7l0ԅPJ&LI N ꎞUDKQ;}Й 89'!3Ȉ<"LǨK /Fr /@yp=baofQ6]:iOہgx+2M؄` W3kh'[?sgUb{ljʱ  ä2Xe88YA H2hE# LY*Ú@E0 #LrC nL1@2PJ (ցDsu(d6 ²<  xh^X!@1 *ysb.DRfԉ0jA#D*bƔ wfP Y竁~~ap8RXt0Q%9 1ةt}\!:X]i}#:{t|Sb`|H/4= qDCAMT"^)lTDP):n33`#c9Pi<2|@-@|8L&}}(@7LY' ڽСhe` c^K9¤ ԏ(PZL҈_ i( &&嘨r\(@ V8|-s̘*7..薚qR^ROFP1gsin\bLj L51BU6}1$4‰ !_QI|R-p'j̾B[`^ܚ|%ٕ)"a7"P S)c%.OP2|rDo]cۑ~Ye _.=p&-e@+# E6(  Xt`{~BVP=&6!B5ʔkToG䱣,@XlMC{at e$}9tZJλs8Kizv[" C)5wMhzG]@4]'JAyckǩ1?Q_["Tb3ie l !S+l{ơjJk8}f,M}MrmrzHG_Nxy2b':+ė?,i"H4j ? O"Τf‘ȵ9po=J0̸Y "B-_`K׋WF?㶕ӿ6wOt:j&Vm0:fi"{K.1&_v7nv@^jBżTLp |^zSj\'gUur@{(_El)!BE5zߤ% GkEITTF'JmeaOE)ڽ+8fjz*7faAke{`q4k`4~`l_ I pbVX8k,ͫ7bhIW25>ar[`F IM˚B#ŲhE2XGU? - +LmϞ8#<DQK}*$2HV('ӺpJ-q9p/Gftc~b zk .f79Sݰɿ2?mwO2|ZKXg/wm;\Dޢ٨bi׈DAM1>!Xox||H|I3,? lqL&mE32ʵ:9f:=m5ǏeW`:T_ML/ҷhZ#[y_뤧=Uyf];UՄOZB+C֕!: ibaE$g ˭0m 0^JOc>PWKX)WvFQwvA' e?Q7%mh@_T@랞 pxRܱ5@sS)|o :. 7Kum!2Ws{Ʃ~Zo >ȧ$F})'9$EA D`o6Z#e,]6qi&Y1/0I Gvoi OH I;?8`jS /He稉oJ{RC}s8]u؁~N>xYMS?LԦup)b5{cG~rE:RzLVfWW2xfX *eWJnnx/ÿx *N]G#(bsN$#8gYv`cQ?",<ޚ<grue^6cvWa/SN;ݵfEp X(13G77'ܕ~w^_z |4;Aj.%xk d#,_" YImd*R1]TC~ W*7٢D\/ܷ0!բsD2L!ZwOYA_Za 1S"WQ'Wjp`ksxHUX[J4pVA|c}4[]Xffnڄ^ڶ%cKߠO#}/ivo>$OM%N̒:'$A)v=2t‹p.E5he3xi<7c07;P L!ftN{pXdvRrІF/@0}_Ԏ{z]OHz 306<;_ zrAOf!13*Wjm\oynL / T~c˰-?|skNhPۣGRTcO *k_{T yi `z֛1ĉ0vVÑ?%I"gUxݓ/:BAamҒObdOWƒn!L^ZRouަ:Iu 1zrtLZiP6ZWԬo k^,U[dЩ\}&JH3Őn u`Gj|Ԙ޴B4-Q`bF X=F=T%UD87D$)mofI-U#ky'Mm_\1 \ ]Nb[špy;@m[=QkN1r&uL;/ "%" ?cUBZF~ 8}1# |G. t[HCƊJH۩zI>j:պҎ=tʯ#Nq982Xp N=uE1 K?vEIi9[C`6$6-eɞҮ[\u3KoAPW)alOeW, ,o*9t0qoĿEX|1BÀD ȦmI`|䟋6ѻ)WVU#Nj4#݇s8 ׊e}/w}n*5DxNן6欤SKcm-P T5]v&Lž /UeLRU jKΒ n{dqw|#$v0&p"Ap~c?e%\Io.w,'FEĩ^REGW{fO\H*HSQ|zҒ5A6)`D\tSGwrS1|4Xb!j# x}wsަ0 6 Zka\КI^* Q^aLl+Y&(Cw񡂻,yiH{N 4B!#)MOy]Y텝6Ctp'vB~uT5=Aqij(`3vK 7/ PYzøa`Lfnp׫ h*Qv %OettMNeN/ #{h)J3N/],i)2m6dل_ƿN=2_`x1 n=Z" ;^ r묧M-bD1䷝d˾:ݢ@O?/th91ocfJ>vҍN/DL(8jHv,LlYݹ`}**6.pr)@<BkAUcA 4鬎 %!QHa.Q߁@?R,?41d|nޱ@M 0lֺkDF3@0kQ[EԂ@vҀwײ5N'ѾWKFDÆM\BYrcFPCg=*^5J`S~SXF tIi Qj4vzY^~QhCA).|4fy}"s}?l54>KQǙ7^](a>] \LD'X^T5&ʷ5br bibzhjAc/yrBeyotWYIݾ&BfP 0ZV ٮ>+Ɉ-fHS7mF@7uMkh::M'5 V-n"j}ەȦOraa5[aS$V@\VL^NqN+|+|r>O{yyǛ9\)|RݫAvTŒƸ}JfLjsS ` .n I>ƱhblEHv9!> ُCYy}LgDjg`{p>}NqS,ڇNfDƏedH_^jR:` qrǩSĭ2tzKV_C}s?wdDpX]U5veB#3 ijsN Jg@ߠ1rrR1p'yĆ2|(jN8aG8 퐬̏4 ]AQ5s ;%CV(jEdp*6'Vy}myD碍wg#׺$/O@lk-Og%$f}nGe*F8z3;`dF`ްcȖ2$h`0%r@y}H-W {,Í9yWA [~BoMvmI9rx,^..GlpRCH!mu) N-QP \uŽ@0NtVj *4c$ gNQr@ |>`=2y?q̤.;VOıhUA7}FoLe  Qc͑!;fF9o6uTIMDɺAO\PXN-6pTVaڃЎqf!,O7"hhB| ;2`\΂{oAd=ɦ8Zwb0lGRoCj&O<&$,1R }=W~1$]W$`D>ygpȦ=BxiQ'z Rg4 唁;;J%vcR(Hlygl;LLsfQorNe֯rCa{ROOCuE(_(-XЬx kMgv .$fssW5 -uys`qjCr_īk=H6ʰ'_Pɵ뽕 Zgf>D":t"t2gȖ/*(ڮ!X8H4TT|Kh?l1lޏFd@G>O2GST;e4^&d*Px1ѿ UYѬ_i b{;PډYrb< @Zm_; HNL\jx"F=X&ϥc?噻yNuQ>\FX f;!;Fkx$ï`Qo>ZFN{iSM|{*TFnQ~uGbb5}pȞv` ೲx1Fp9Y>:HSj m7!Y5"!LNBb,qΫ؏jRD _#A1FFP'6]˭$a(Gw8.|"VQ[K1ZпQZ^e:mR,Fq/51J]u `~RW*DSR5e sJMTXnx+'H6v8D}C:*{&.=Uoxr:LI@z4ءS42:GDG;r4SHRaQvO@-R1`sJ95Cb4ފ|[c}jIcnߠS9?m<ZIco2νni7mLGEb #%6.X/r2(-IDREl)1(ȹ2`g.ڱ p'cGi)?ï~L{1WX#odk-i}p+dݣ!:Yw.qS-'Y7>/GrIM^š2Z~,dJ{席sGGam̂O Z`9P؇۹}wd 46bC4C^ղ_0C|*>z<_Q蜒J{$jްnzG!7Ry,r{{/1^)ϓkq/H%̝^<ү4]‡as;zVkH< NɔkЯ3'ktIM3߱ƨD1]v0HpEz,0CդSuIuԦˠ\oTܑrpnI(Ǧ܏NQC,BY;J_n$힞shatf_C*ӺgѱCֶ Ҝqi;JπVZ όXb1qK^μ%8=Z~?ҲGQ7m%>W<;)1%iVxg\N(St!2NBBP٣sk,ܕ_$E:/Ȏ9 4 @¿s3#^/* GS(dqNR] H32!0 vDŽEԁLjne;Ej4뛯TegKp)dU%qD DBJǦ%TCiTY-vZ}j;MϡPqTN>e<%d,YUTRF,`;ǬS hv[*6M9+e\ɸQݡ n!0B\x%8۠68SbyHoU}9I),)ԖS6w6PV!DL;h#$pp"C6WM*Rl4!ѝ䧟^нZvYɦem#6 I @_Fe~ab u${TA|ϝw | WHϸ<ƹxYI9y1l'mEAǢNU+4{y[5gmLW)at77QD/"I -{Y :s4 v`Z\a1p yGK.Y8ŏp742ޤ.Z tn<$.%s|I*/#Ԕe؋ϊ*ˍ JG!teeworlds-0.6.2+dfsg/data/audio/sfx_spawn_wpn-03.wv0000644000175000017500000002712212140200333021142 0ustar felixfelixwvpkJ.,),)/ FzWWWGHJVIec?>ARa60fL@Dt0LheY׼OϏ1OKiٵ)*3n0cƱ1[VDlP#CFD [NPND.@z&8@\!Y@h~P-Dg Y>V\.4~IH)䔖W6E`,5Iaؙ}$T?Tiq*MI̓BQ0>l 5]72r^G1"Gh9>Z<:*PdfrQ¨1Tlj(;]8.Nڶܧ$" *RH0S C.1= 5H,Ii\@.'bJܐUrdÔM Q) dlK0Nł`Ecl xGf9(Px"=0r%`M~EpC V1p@xҢT90`+0'?@ ,N2 A s60/(YcϤd2,ևIc$?&r rMN#q,ºbC '($1|p|" ]~ uv$ z!OrQ yDS'e8t ZK^dDFVpILGhSM</"Ƀ.2P_1&262TL]3e)pDeVqZRT{ j E>蚶!>:&R6u(vc)-բ xA> [pF\Ux ?2g gQ`6kaub3kÇO ] &A2)b}L^RclpOl!j$&9O U!ËRz¯hL_a'nLL>Y)3]C헵_EVf),J h+J+Ȋ; AK+#(A|nG\"0i,>}QIK[y=i 8HAժe+dO~WrZ> Hgޏ-cbAsk2O':XBuʗGA}OF긵}_?Ÿ(tLj-Pua^|Q'.g?@|I>l>)n]VvTNP,Sus= `ǂ?ѯR_Ü4/b|'i;EҁD3ȃ[a"mr Ag"݈yi+0z>]yIf;h2"{r @}߯r pQ8BH@$A&Y6-$8s6?zr/f05RbӰhb3caW3;URP)af PV._4 0͹:lĿ*aXMy>^ 9;5~m솫:ΪJa>r%!7Q9,gwmsKZwf!&5*TW[` ld^` Suo!?{Xfg柑Fb8=QO|O̯도^\#BU^ & ݣ#0wiarNwr,6RFݮ)!*ӚHMnN-%gzx0'B4OIٗ˓5 <,PWWގQ  uСOHG&)7xO r+}zbU _kwu⊺PjpRCe -di^} ExۄȵWt~퐎w=NジZ6"N>K6%7$*aH>36JC8;ÌY8#)WE+="~,2yk97ߓpE/\'Rjש;^(EId j~ A%jphunf;;ar~oBL FH wc)'auɺ #b Ԓϔٲ F',kB/”r HfQm<}i:P&(ko'jmƊLjU?$> ^% ap9 FUŢ/2^BPk=0>lჅ4a_y( ϫװcO oP ̽xA[.NuO?r h7.X(jR|<"͒n Ƚ ^Ff6(ؚx}dQO8Jץܒ5V#N>&N2 DB1 ªn{LG+%qAjy#fG{̆$^kM'Y \umrtjl;-\$z';Is|S㾅goX_۔Sd;ks7cz:oJ'#3. ane`%\P{O{XV3ᰊRd,Zukjd"8Hyk[ZAݳPk}?}7ڿD ueن4(".{oydhzS8a|=TE/_ZC$5cBi-ǚJc}_ M-µVv[ !_FHx#b:_ְ[OiVGcxc[;r(7)yM??%L8903w뺍r:apFO]٩iw`C/QIv¿[ $q\M o |w06B^]vғ9uQ$og>pG ?UiF>ދvwWiZ#~"}VG=9Q+~v˦Yb|OxN=/2醤GI$7PqY- ³ h ~Bz^ԭ[(1+g#K3sya$?$WBcEBG15\Knue/s>FW W x~ILdH#?+[7Z CC gKvgQns^2pTY\3'ەM٩+.=[g(5L鞙74OwJ$FSIDdMPmR } NTP13_X"F@:igz(e#bPe=z AWp;{1Oms?C Kxk7DwH</u"%WF Hߥy^+0(쀔:ql*Ex [V,>ݳR'#U,0r1ljXSGrw B_SW툣H'w֦HU-O(`*8pd4.،sQF?_di{bI5 f [BbZdy}GAĈG{;K+. մԶTQ%V@T]FKO#:7Hdl} ӑ{œOV vQXS9pl8c;)yWA:,> r_YȪmDs CLH&KA/ H͹CPV`/%d%s=!6d]~'G0^!;"G_ST+Z0S15E6c%( Y-l;W\L)?ETCnjrN7&{c'x;+ R#yd'h?^]t9Zy:$7c<ڛb,AU$=W?FbW>Kcj'Q^ ,ӪI )vɄwxoq"Jp\{L2T4\SSU>.r>Xpp'"8~azwln.t%0=׉ȵKTAsD}p?.jh&y44Vxb* [ڇV.GrnϣpI{*萨lZrK Ր dZZR1KM alH85xgu364L5kq4Cf=,/(rD G#E^)DVFguWk"S8u-P282KQOfťtmxSާñR3&ӕr:e=\%7|j[ >y^ˤX's>6J81!#\ʉ\ByqňLH*iY&GySdb u0m7KX3fS)=~BC ^i`lDSP6NǶI4^#zSy;vhiHr}so}kwoQc12i F4 `Vy˨6-x GN6fo .kI嘳b/ ?sx+I1?Ң6S}iG\b9'xgd$Jl9W:/iTc7cO2g&)]q%mFx%Of#bW]OMZF gGwZV Iizf5do'Yl<;MHvثOL-~DTKnR.jm G['V2P! ^b tqR qbw?"Zt^PsʱiOXݳTg G!A3i^F>ȱk7w,P^ mTSa)Jг϶sF堆\=*te~OXK\MUߩCO7d8O Un'1̄R֊ZJtxl95w/&U9px XBk:C:X^ n+<;|,u_Vv/{)ce@-?VsM}*- dZePpϺ&_x好~c.Q¶ w|QCUɜ0< %iળ>IXyg,J0 pKG:C`מ M|x 9%pڕ`~.F;- y1 ~g lnwwmS>xکAwPh6(!]k54ȭהZ4?f#H%=CPwS2QWG]ġ ){eր&tDBuC3 ̊_ `@0b\K֜Jp뀜'@t*s4Yi(+%NHFK=I:>L"b ވӳ{Iv}gגUC AdH4֧P'#wbC/ ~yf=Y7?oտ_yB ru,qn,yS[Ɵthgeƾk' ﮆ[vg5oc~Bt~1>[dKJxc0|~P]g~{6Tg9X\n]O,`bp+=]=҄r_~"奝fĒAc46.#k> B-)ũC.Ío?WQu2qϮK1HV]۪!C0_ R:QP$x Ŝ%1)ԍ3m7,9iR:AO~,guukK&64]UӷgQEӦ 'iV;sCC1a &a̖tdwsy5 >ڊ_ɇ.{5okog ]0P$n}K Fp~`_[wLT;6pL+WwE'3˶#ζ2Zpmo!L̻a&ی_.zfדš0(t)%s),+ܚQUyK)aG򡁪)ƛեYO :l:ʵUqA  Њs0c]\9&s:y/CLJg#=Oz8uxI[\14{85 ?9~M`|L'ܒȲYr&3NJgWp+^/*%3ݟP£gP^0'Qmx}?g},Ҋxb};őE?n!j#ѯp.4w@nhGfUx;YmI*ȧl#'wfSe%ay(==2o.C!O "!@k}mz+/I^hYø *zo"{!#=Q\yI; 3v7{DG 0\ M鈋uC*x w\/Gr{|5 J8V<R, fnwuvsdD%Otg]gD!P=CA׷Yᐪ idsff]v[8K:e +|-WGm]۵|I:4VجQNxWCsM ǎJB֦.}2DP0 L` }"8 Bu6k|@T' MRKqa;zy6Iŝv1L3 ވ^+o=2\.+`~Wsfc@0z26_tnh,]VA{]*78d@{a .PXN9[oiDߐF2_A9RXH.tLnzE([tEESGuMwhcŵڍ7(`3`sLu`ĚedaWGѩ[X$=si(6Bx_ϔYu(Η* (I6@NWwjAU)%U<4Q0_;z!N pDeo22$,g;05CTڰIK7oH[~5uk#!mbW,pf2^ %;y)%aymauʟ#H)2wPh9C y^AL I?tMyOfHj/QRK 2Tx7r cxߚ!7`硌2 iʢkOHi%ՇңIU9/xj߈8w#YolBfL:f)h>oHÝ-% e%{ D6o9#WEe_1c.){\2ХjK/B176ݾZ]GI3hBūn!A(ɉio٦xfq:zVht3m0DqL_HjuR͔1BYd@0Ho/+FKAd񖸢o$ASsF,y$j7t>[Y36" ny{v͖c%#9BYHSN_} eq" /{AUIآIEmI0Z' ږkjŒVr:# wlv"ov]:n 6;"y;eZ7AHU\ƶ#QtN҄n1@0m{$m>|&d0Paɨqf躙Nh PV(Xfw*O^g`b i`IMȴ9\L57X_ { By}9gϮrjָ2F+NSa3!$q} L+Vz~XeǧFWuXNߩ aC&K-?[AaG+c` T _ "L)b1ؾe>8Qq&!|20X689xNo`<,JnvE@Vu{:Db@{7brj<-J4'ɠ7>+_Z 0R%clQck> 6մ{%oB^%aΕc:^[6Ru=b`$6ʂȮkxڡ|%2#NѺgMS~M eVDH@[Yɍ ߪ51^cx)13J祈,dZ:(" ἰT6-m\4h4Obx+ssS5^J%~ꭑ[,xnJ\s_zS/RKe.j! O0H[>MC34$3JtX2'S k%|R_?W0ʦ5t m̯8`.uY\mJHF1ٕgTgsކV@?y05r)GY2)0Gΐa{b6$z31$?>vD#N,E[φ֞%ȞIڍ66e_B`)x/ÑͳKé퉩lq24[2%qg¢3P*XKPˊb5L$1sQ;h+( q.I] ]m5"M9gƇ}smUWueLTք6g kh[i3h+2uo_oB>:C`} pbrn WgAYVc0)RMyK/jaAޙFh>YicBJC1m\MDrI XY>66R0^k`W0av8F iPN2v|ʰ~{}gO* d;T/'Z6ۀ ۫d9>%ZRa;+盧gҊkVoXk6ƂZqeIiRP#d4:QTs :ٵMnvϻA|C_\1\5)5/ <p}^GS)D-0*Jڑ0$$nVAnsFĴ3s>G  ?E>WQX3'Ga!rQ }M/YмWo#]:F#0 HQTr3ա5XUO;5-e؂+( `~FDǦuIst1O[YPE` 't'U)xpܜcLP)޽|Ih7s"oC\gٛ>!*`zw$I)nA:T)Dph LJԗb` ZNQ̦QCE ])VkRi3Yr2LV1`tD= $g.T<QU1&˰<3ݑ/+ē젒IQ*!hT#Z9a}`,{`6B٥5E3`:΂Y4O@-_z'͓Jh7R(cD+ o'% Su -}_;T2]x:AbA9p i}C]5ݙTtI0m 2Iʨ]Vښi{:ȕesF@堘< sJFRTKeBRQx<, 9lވ> 5d  Uɻo rwt-;X3=k)OճR~. teeworlds-0.6.2+dfsg/data/audio/vo_teefault_cry-01.wv0000644000175000017500000015360412140200333021443 0ustar felixfelixwvpkrD;wWWWGHJVIeL/]?WՏ~{'gtb\5ET9tᢓg0D횝$%KaAP2 b,!{ RV? /akQQl&19:$"4cD@D2p%Q_ %&d|ӭƉ/@]o( ñjA <%pLAs &d% fj  -H`*U$@ !ӆ(hPAA8!bIEmV G"8Z& Q#(M0:$r0<,;(Ip0hH((kYN(i@$gCpE() P @;P̮3& p)~p` )F= `Ђ@&(9dLx0Ѓ3c MN9 >() (:HxQ;@%@C(C@E4ਲ4DBPBg1$I $J0:$|lPs& %4yr! "``b  S'2faģ5a$TPPh pH(' e  lI Fc 4P|@ACF0{f)h@h LcD'` 78* Rb80SA! pMqn2fO!!Jl`>Up@H А(48AtJ !C`9c*PH#szI4 4<L ?_=ٲ14AD v: ꃫpx#G2l> n^ǫ^IvS#6j}4JmuL#Y#|,9Ap"[xc_|U|+7ߌ:Squ>F*^R[Qu `0]ΈCYuXXeFb|ؕ0EV !˵<۵gBcFn&듽^]Oer}HbQ\3 `޼0CJ#Zv颅%;V-tTz^ +{'&`GM'ofb.UOԈZu"; TѲՊZ?Gjkp Ec~N}\K 2BU}k߄׺ǼA}-K49[FAjsβD+x0Tp~ʕGcAvA;eފ:G@&n2 mި 9g2wX{}PQItD.wLj mvKEPH=q |Ow_ޘF(vQK}P<+gț|%26_+U4NCˀJq6jz?LxɆa/al0F+ǾG& B&FXAnU %nRH_zZ1zT*Y+Kѝ$8HΕg|`~)q0K0iao;BS'l?`m ӸV)}kXY'R?q Bպ[Ku= |S9䱓 H7 tuO>h$O_؅OcRRx[6%{ uB17˱=(rWÇ`vGO+_ dZ^gēdFlӸ HI2.u;"ǰ ܌T:QjċRi=s9.~kt) ,7, `Ϭ)CrI5(uf'r>Eo&:ߦ4#6oǢɂ'd6A2u5\34TBP%#zEj9]oDkv ?eOW@_Gsk$Fָ&8M~r>BY/)Լ@$b]L˕~;#_t$o *uYh1F+ӊAޫ(#L% o!UE5o0>(L,5JtԤBmC~lvuG,)908=ZV#r9 Q209:opb- G%q>mwRa-qtw.Td2NDʿQ'Ⴗ4dt%DJ 4}j%EI "yrWY.E3@#xdcnU0a \?꿦cAPo [}m,x \CZY,F{mxi~1e ΗuBnbu 'rK316QdW!Hy:aO~(mԶa«r!LڒYl\G.u153sN&1|^89;mߴ6I;R (Y_]),t4$ʉb* `Dxu+3S[-/ HIHB%Ir4 e/[Bb*;XyU9K~8? !/*+=C3K(J쑝4ǔ0,.{A=c[nMTĦFM60 E+6vAӍ}_%G6=>nt߮׭Cc %$*[ǭ ]W's~gA!IU;Uf> !oW\X̧faAeq~QJcbrx@PTdyq?ϣuӷTKprX6(v3<YL/y3AFwI3(pL8 ao]xR}QMIhNGBnIsMKOt :P3Fz?48SUgpp18 %'y$ BlF$m:X]F۟k_jrs׮_N vkph&xD;RaKf˰ pi/Ŋ[Żiz o; ^ `[xYP.&@7ĥR %y(\B37p- -d'35Xis{rZR'{}C8`Xчa؎׿jWTy7. KY7a`;]'|[Ga:-Sc/<t=@Պ?nZ&]M`^)'=?seNb ۮ#/=OP[eV!:0&Sˁ3!_3Ĕ}vҳNm._QC"aidFcZٛm`>굾"#DCڱ~}Q7]Gn)9ƛHcI3+59_@+rͦ6-O'Opb58z,yCb0b9dgDShmw|F19& 9=P\3Y,"e ^L"2·lAۼ!ziGs7 $j|[rE\)'WyʋE'>in7m䄮E̜2wl) Ra_\-:kzȈ d+3f>~O?VrxPM3T{h}\G3]C_@[[ U׺{>]oXs~q|t~qNy-EK *lt->L 3;'y{ZzP[ Ȁ9,q{JC$"zT_aT"TSD<iQ4\Q|{۝ '}@6Y]ogfG!,!u:SW),l~(PWs@pyKѓu=!hv]U#= ݑqU&NQX r"4Dk#cd#E,I؛w_:~lR~'o1{6+`I)xr'bIBSōj5%KG~ޙSfv5l=][|J暒)~VtXF4 q rL[q%Cka'ؑ(\bFy#hevV-Vڙ:?FgL'?Dbma_pz̥FrF*:vٝث.s<⃯ ĖpWC*_*OL/F] ˆ Q: KfPǎFVTr)%9O\N UxgRE|s=eB-CдSw{jȥ"f?sAd8g$"- Rh?1mmJSx"b`0u´:Bp wF0R$!k- J1[7]5j(Z8Z1L-$2Cn `z'R1M hHZ F;] -fKsfp_2|.{P#r3yQOBYOÌAҘ#*RœX!E\\zնh^R=Vfl;W0,HiTm8j%7sXe{3JNWX/HZ=*ÒAfx] 5=Dtܾ%bI:OŸR+%0,[L0N˧ =LŖĭaW4=;Fa^B3,ݾ36@#י8@B'0AI]i!{ 31S2q\ Wb%]*]cF#+,gJ: GRTЃ~71ebUoh$eFQR;B<ÕdڝwM~RvNPTz\ߩ'J/V^awO=Dms> 18VlN?[[0Jr'S_j=KQ^D)MajsIUn,D+MC,\ 3Zs0I'گSqs +^А~ "叮!TQ{e9x'!+5y4AI=2A8(#x aࣖ{ ^l5no FYe[{t%s jU+A]FwD0!)%_O[ZC  ڑb 5RWzH>p rӟU#pꧬ{VPQ!"2,Q"wic'_1%~ G|FȀa`ѿ+}9]I V/:/>?|=FkZs=HOx;aM5w9 dpxZ08yri@pߌ)ݠ=X _=]'Ӛ| L?!\hN_dĠ6-e*ʝ1(zo{sJ~P'g͑[r‡OD9 9!]k4;1L[H.odIGӻ0\vL KՁp΁qKI0oxedMć?b&{..3%3p+%Eɞ8rW NN\皥}S63_QExԖڴ sxn10 L`vUh tD26v^󚼡r29b;b W}-ػUAOqQp$"`ygֽ7Ȑ;X W8jrz.{"H:^Os}_G6CRnl2j@O;nzVdDaξ_hc"oƗ$A$HG f+}Kv:`4DWhs\K LR @vdDRpށkdyke@8cuCQGTv޵e `^jGm$MJ(TQtOt+num_ ȡ#|g*L*}ۂ OWQ!9ҡi?>6hM(t& (͆ތb#_sA 3|cb`i-W_ k8T뿣n QPC^,Vv(뾃Xɷ;,%[F*'mHJxcI-uV?W/];-s^6e !q̚NAz>XęJ4,bt+ApR@N7C߉N@Kd{W8{󗆻;$75V\䨟4!J 9( =}xapj)1:)HSCg>5yGa(N! =Slzȃ_ }9ό G8lՏF*-Ad;nK o 3'ڴ╒.JlGFZS7:*:r`x-&敋(% -΂E0bꑱ_Iŗ8ĀBP@aN<ҝ1y8 ݍѓsYё: ֑Rh"$y(w/HUy3GI#.mKbFHj63wh,:ʇN L ORKkTȴޟ4fc?5+f#:F"&(d1j@say'{I@3I>eG#pwgswa*3$8`--qdFp0<U T [t)&mm=zL&L9A/ K![4t,ə9PrvV.@&20g6K^?B Cz[d~ ?^aqP&G3mXn%/u/_E0t;6N% `f},naNn^^-"wqŤ?bTei.HWej4 B?@/ @Ř/E |b(]lH`N71 y9žu7F[6@J[e0ZG͈CWZ۝~Wd>b˞g*۱dB&RuʑfVJ udO A0iY$e`ֲvH9ф*@#(|b0 HS椬)F5<Q5іK'FZ. cc:p}8'6oܲX@W3 Uϴ.=E_Bv4,X3\I@FM9Tp|T sO:MDvWN*%S&*Rh WW(W3A (6WQ)w5MDYDǭ-XA R@79 Rq8-2a{$xc_&،[YU=)Sc_ZcQY# xڙLG)eJ{Y1P{{Yƾ+ #A~M ;2fOɽ/Ґ|@T X8вB[=M@26xցh-XROu8^4o_)kQ }/'p;Q v-5DdDV!4fCt4: T|I;Mz yy D^I'>@ UL'Є\5=J{}H9g7D;sQt>ț2.bG(\zP4D/ϙEPOqv",؍wc2i$hcGoeZ <7,1g/c[K?G ho%xD2^2W-sLOŪsC2vӋQ;;Zn3~ǣY-FGߴaO%</OT"Y0C4͂,u!-l͋˼$dW[()1&Wz:XlHXa!#"> j#5{rtV{vXC%$+ӵ?H4d3 COj%:tQCFjghO]lh]XƝ"cvW- .z@shdDİ$7Ž? 1> c7 <[XW_K@Duia-X-$-[A-^ޡ2G4NoaTeʆEF $HkeSnz ?G>Ùޑk՗'}'q1 9CJ gq"YwG}nKQN2l ڡ7r40[m \QEtt5`8_0VT!} FιSV;#<VJ\rWk,;!xE'3ljrVa%m'3:nH.ZC  2 IW%_I $F)*!3%T;֩N,|mE&Ӻ543HEDw<&FX.rJ-)t{Yj>MJL-[rBo@W cXi,$AZ0_*,žwNw 4h;8Os.8݊qEl)oAz nG8M!TLr[V DN@9?1:dQ9)=A2Fl|cÃ)/6,J |vv=]G '*YFd։\vIf(IꞱ*uuiwKﻌ}#ɪ4`JlZ!TH\.|⣭Px~jq`cXۤhH]44[UM񠦉@OҲ}FZDN,WU8^yf5<46qވج\ēҜwwqbj[;tG&M=٩\3=qE}  x|)>=rOeTkX铁FDM"tyƐ2\(-dp$n@D_ThqF(yZW,ҁI>fϢ,sXLoZ\"%eAOAnz\xy8On>#sB_"դ>nkBnl@{XvA?TR5a &Fi>woPHpKFT ֞Q=6U^Q7)|@R%4eҕ"{$ԋ 0{fjv;pQu})Xffngo 봊UiACw>A^!A*?. WzP!/n6"kG}JQ0mKgT@L#!XIoUûG ˍ=h+Bڹbdƽnu%LdnʼnPJ:շgG<dYa-eRlz96hZVtl>lSQNbԲuq=m,(tF("+T N4qbĹ5Pp6P`JGGWq{nqә"O'ݘ72F,ȧftTa8iQ pZNA{ ySWkFk 0&X1]RtvŅ T28 !:@MD}l,8>LS/J1wR,ik8|u,M'}MzHM/~Z+Q c.F.D!T Z\~OC_)ߨg$*O_{bPkt]nPR{*DdGY FTE U ?H?j$hQSEuBiCr%Ք_o g|^Fg^Bo[N)2?("+_Vɓn!'3WB1_N@ e"> FU *ޟsdAUiD>UOGOL9 !]:؈(2G(}2e,':re`=ҳ-gO [S<$Xs@CM.=Sî5.|869ZԪݰzj @Gwn! _NLI{k҄ς cIhfۆ~4ιK Tj ] -'x1ީ]ՆBRDO2b 34j!KKw3ׄ^[GYD 6]Rn" ܬ)a%< mk6G9l¹ϣШ"ssOE|΃\U@,m8DW'))[.WvôVa=#lU bBd*; Ftje$rݠvZ;`9Y|N[9gvTTcae=G+s%nd^d)F90 sdrWl?rFd[`ɚ8/L~63 &_FKES̹R)d"++d|r$}oGG;2!Ii㲥c.FslD98G1C Y$4DC]kn*u[_;1j,I6$/s5<̨3 S2蓟 /p3[Oe=3[O(E9AäL~w ּ@|3: &>[l7s$٧<7m2LdKPOs:[Y&vd&Hca&:{ve3/ٿvC+ pcf輠v2o&Gx(t1ДPmA5x] Xt'e{U1FFFͭ$;Q+`LLr$:5S$ APi{VCf2TG/uM?) 3&|V RC_ͧ#j0NO|χ>\!?ݍH UnO]@W{So2Qs\ }ĠkU$'G{'%2kdPڇȂ`*?ԃc(/˵М88mJLc* )bqe\_1N[DI6-yH*.4~o*䤿\4Шm/aV ?[M=˪!It6 GZѨ$zQ Z__YyasO.}=Mi kj##sr:qt4?C6Rm&qL] G [d:^ d!{[u'\w~/e{0;h@jir\j5XX/r=m<{_DG~Mb}O3j.@*k"ک4%Zp j s~ώѐ.w݂) WLEՈmHQ*SL"|d nT66%9!~jK[g#VԈˣ q{[FtPM[LQ#l)@}㾜EQ4B"PGc_2(r8郓QR˹s9!ln;mLhMX7DnARZ&CX0ѯp/O}BO`>.^p7~̖8QM%|6LBCl{.P[}C%tf$M~ 'Е̑lų|5S; $``a510- pA<Z /M"B~Hcki;m7ii:P+/1/qR3:b3b!hrqBv79}uˀMdE,t@V]4 1jm1Om_:, ^FTnJHZ 3iQ "ѵ@WI4P %qs&Us(1d@VN&Tx# rf @5.NI} ;ySu .;l3KrV٭z?~2հ,#=PQiBRv ! x6 +{6AN9,Rup0ҟi$&XŖH *熏l66g4ϲcAAU`肺%tHVoRvBKuvrYt._ݯ]uh "W!V,HJt+M{x HM=s$P=“ 3yac @ -VhxU=F /@Ĭp-/ >&"VMZ]*Ra;e.`]ry&#|!z0ðr+1Ȭ`H&T hruh]Ymݛy.#Bi.,lˡi$`cTU>zW#{(&`F ?M~&⤈pvt|l@c r}*WX0jy]Qz-= ]\Q ı5oMP~:!AsD޺rwbѼORמ] c9>LtsVND=jU/sobVl'fk#'N|?aghhR;,$KǍJ5Cw.)kR=UR9`E .H;vLNB .TzA[^FQ_Ns58:;τD"6T_Bgj S0LmXX??09{mlI@Ɛ 6W]g1aGʠ@\]Zr@ᝮpݷ6i8:5 {eef~{/4 2S" E: 5|ێplՎ0MJ8|อ%$ '$@) 6壆fs7wC:]cKPa+.|E\Bq0$r=g{s]<8oN8fiW0|['u"nKE9Ɔ"DGb-ЮVgZA+" M(۹7h= y*W{@qaxGŶ{6;5ҝgeN%hI`1 fN`>R%'vOGp924eܐ`^wPuBeAgo̐iÏ b66vz9L[Z{ GQY}PM7觺Q=` ÓaBp1NRE",+rF3/{w7LE"vRlm/еc=R} ~4 p9Iu#dU/Tzdefܷ8-s|*rwqo0R^k9WCaITJ!3]\) = ([̞T3J4I"K%|Ykyw9l'> 9ZO9IDb8&goqa$&W,/͏8],ɲzGY ufqQp#An A 0+)CUs(`t X<ʬ#g!bIXo(xb0y$=0<_PrDUMs||. W*0=% U]{Y3K.G~2kտNTs-J`/ M[ zw !keU\i`l_ eQ`{Ɂ\2#=F5 N-N6ž44c 2 !-ϧQÝ/%Fv5lN}X?jÃƘ~w[T=F_l  n6( fҰgYo #Mo(n欬ixV SC! k^j4/ ZFY\AHbe.omÎgcѦq ȓE>rſMq4g?-VcX F BF23w~".\?DX$> ݺJ>/WaCگ)N'Ӣ:߫ Ox%ZPMqhbt4^-{Cu6 @{Z9g\Qzh^Bh}/=+vi Fh *Bg?9\WxwY}_, cd\gT~@*{W9u(@3߬ aSC%BTŮFSrHoXG!hP6DOMuh _ʒOVfҊ朦 es`>t 8qD҅w)F%ɔK[XDD%Vu&t^X\7r9vxSrϤJ1niߜ,eRM:ْ1@XmC;v&sitYm%ڽhmSk0}\~?Iv>I,NfcQĚ-ZV_;Crf rxlzޖɮuT "$z2`ٌMMu&~3g11NMGwk߈+Չ޳D6T3=?F%K$OS*c@ƃ>N?koVa.p6$ޚ|pȊPkX@k=$[06cfz@WtPmNz ̈!ًhC ? UH+[Ѱqe[_!l(;9>ڣ2p/ 9򥋳7Iӑ-3Y&!tx|qR:kBz[i|!$eyzϮ&Ã4՝#7OkqPy!(R՜_ڷ+`N i# i$ҡ~p`]Xjۈ]zFSDqp]!NYmםP1R Arl0@S. *C\G\ C*[*Mj#i,b_OW{ cdB?YE0;-A;ŏhlB ïHc _ R9G$31^v= *Lo-Cᄤ:8-$G8i X$hP9ɽ?'2tH̔̾=YYj )~{gBn&K[Ih&TE^VĚ3IdZ'#B*TCWESҀ.*]kȿ3RGwDѢFbL ; i'dt)$j ]ϸZɣj[ـњXu^:7<}c5- e>Ucog[} Kd:V(x/sOoQkZP0̴1.LT,NU_+ Zt7G!3RMJWcAMM5 0~\QB*¼K ܕú5Ф N.C\S0+^QiuڊF4Ϫ~Do>PL^{{eVs7>CF-y-dm}=#ejh#*RȻ7H uXե} rJo?An%;N\'zYaDR m@2+BVlM kWFb^Cp(+H˶9 N3z{swTWRcrŞ?`Uo`o`67T@IWׂ;y`,xqWѲ Upj?OpOK/|[Jz`+A 87uE ]nb=KHӃRm:[Qٞe XٔE2xvJOvUvwr2rK2X2 # `3;LXgMս&&fZ/HMl\Jmb`HS#&I@7%=pVvHDDi-8w2iJsY[ǰ)cQ<۵ED3ȁy&HW!bWfB R3]7LEJפB")ZN/iVL"i5fƒX +SZl,洤^KEyp?ZeZҒPJ:"e%yiUGV{CMАкxy 6>o^3 AT r#اsIdE CgqkPϕs?s/'[cHQgvF7^\&:Rub\s2G>`oˁБ@–)PbE8پs/N̴i4UzZ^ey9J=e@# [|Rz2>P"w[#4ri fȓ N҈USiUf/) =7QTRM22+SIݲU pMѤGQ;QBMqbAZ)`^Hz(60a@k y(K2NlI(Nc| 4qk.,j VC^D>ETp[wK@?y2q: F kHd+ z~NL58J(3|HQb?@tv/R1N-~k gwHwmbWqQ/Df}uet]֋,Y' FSi3rӤ~F*l ! }P+3qBˈ--w@.ʓ9V]Śx.ZE;9C/7 ,b78a6LA { _$D1CW6#x𻂸{< Zs^>I A1‹uAߑ;c>1]-eO( qpE_C=jZ0kh-5[ߍ1Jlwx]X*X5wºKAqWOz.Jѻ$|駂OYߴ̠7ZtG—FK%~Q~SB(Oü,|'LIj'^ R8W\4=؎F3ڒB>ꐥdHcl\i&@ƓOl@(Lwwuo-/(tb%p|sϼoOrEUT{ņy/w)zGt>j .`jͮv2~#|D>RC5r$ &u|qfK8wd],XՀ/C㩙WçD\SI`&?P]{hU@88s~\n%hs,Y ,^ҾWfA_V PSۄ+Th,>h%0nd/aFfz7ěO|(IVA^]rBˎifjˆ!4{ó;<}Lr[L4^MJ{HTy`誄9|f`yo+P.],`qm,i 1A)bRx <%^!YR-e!uy( e_UM/B:DOY-YH5V7kDA4s2%m4Hrx LVqyp$z'AyR-hnZ}Ji@6p͡Ϥ7NrށӃ䒔]{> ;o.m69 *{e7.r*呻}"T`[ soq-1jޏsnfwDkuh5}:j{j*O|D*Dž}/9bc'AWAyI[wVkK*Z&5O+v3EXBbHuvwt{ Ѱ[dS߀>Nzu[ ZItCwea`'ȱ nmcyE.a+;նAij>-`6h[^LMc*3CۧGzz gߟ`gx,ԘR}L5~Ɨ9~~Nߗdϳ'YV6&s Jm {r\t!g"l m}\Ј\YLh>p) B!Bdi5b =kaO'k;C\Fi6bHe66#;ZApLlRuˤk/$fﯘژZ1q\ܭ?r]MP*W%$13aCd -# ͜N)߀ׁOG#{>S[O H=0BAI|&yU $@T!q̴%aV50 µއ!6P,Ziս[Zg}'^Yf+1+Fʤ#PCq,zvOVB%r>GVN+x:>]J7wAވΏ<%NcYXDXiBsEGQVEŔ2kM{H6sbma UŊULR}XxzaX{N*[C~x2 nkѻͫJvEy礠A-C5.}B|l'Aٿɞ 5N$sJTbAYR,5WQH BoDc6Ow[YpE~@>/JA"I#S*^ 7g6tXp[K,Zb0Na[?]tk;a,51$0qN+0uܜ*llhF4/7LRk$8B 3t'7]+ɱj)=%v\CGf?ҝwCq3l3;*o\7S8>Kڭ mԫgE62#/ ] yJ!2ׯЦj4=[MH4 YzV:_kc2_f"94P @Y#-XCgkbkjxE'S؍22m: wJŎ֕39UWhh Ws;Lu5)^Iq3D6V~zI3@4%?iw"C?9 jbLQ@n&RE-YH!>¥ 跞Cyp-XBW:CKB5؄ <;IA]4hCK`0+" de4 > @'ᕆ SLFРIZ`[_ or xE0JjHA͜9Bl"EHܷW<_L),mGK5 k%Un=m*, Ծ>]/=IZ6=Aaa%H]H4BMAlV .B| oABN HFfT|6HEJBf:.}*gsbS)AVhUc}NLj$t0 z ؘZxyk5J =;:{,&莡B-W$Gg<{/|+$[}l? (;%O/B"W$ɯ Uz3]O Zˀ  f1 Z8 X|Mn~*31s%]¨G^ $!ݔI16*uݫ(s起Qwէ zLPL BDB N'|rƆ0LwF^\0$Q@)^ ~I^%e(v02tP^@`'*,mߧ, `X̵FPID+*j(epZsC=Ro*pdj^E֧la$)E-5EcT_ h;9-hT!3W4bjr=#X~U֕Ο_~ÿaVy˙0̦W[0 r8ՏAJT]#j bg{WzZ 23$Ha Ld͂0G$7ܖ^32cBqMfiRB,nR^ijZ"ʄ1%SnPW`C,Fē?"?M2=[ ׹ZׂW-]C}UC,@[XQ{dc oy(< 3rﴄVŗ& &Έ:t=2g(TG$ü4ZPft| }v_ץ1i,,qBvK>~Bg iFFVRm3;{Ըs5m$EgXC0n&Dp.LG5 \{^R\w`5eCd`Y.BA*UG=ZA!|&('\N(񴮵{n@z^I]5 ZVO2 VǷQ!/?~Rm<D9B]B;C~B0BCkV[l?_ GNg 7R6[m{3R jkٗ>{jlĜRW: #{SP였;QHBX&82/Ȇz#E݉(j{>}xhn#BC 1IP gH  ln[}H2@09R{^}8%hjT/! 9l{h>LU҂M+Q$Cʨ>)5>v7Ӟ#QPFC#qVj6uk PҀNMԓW-kxDf/T :FeH ^ tCNӚzx'ؒVDBߺ&R=*Lfgbmr; \ ^A>%[XH1ܵ 4Svr7Ub~*(g,6~ FD63Z-HH#z52@߰H$+&0 y7wʅ W/[^iUqt1 1q-W*]dA4(Gn W;㾅24&E.hR>pk! cy ";{!@ҏvk$6MnJ=^`Vhֶ T1H W`%55YQ"JsLZZ˱%Ex5WL8%̒Efճ/z-Sm &#̳֓:< E7 @);qHCe"'%T@"ۣFb08kI @ L@t",QM J}@?@۹Cw'JL:η0X$q% a&$5D)-wзE \CCHQ\LC;bY Eg7}//4CŎ1YRi a(ٽ0MϾ U:ct( +CɅQ(1n=Uv gX2D n;o|TCa44 6Š9) N^u\~&Fwt?jauEE-@;GWiE.悛9BiV`%ֽV1yck~e:wG;o,[n󔴑uY$_Cr%O %*7?`vPOI3" en| aDۙ.Υ~9`~D Nt8f/<""vNHz1Ϲƈ,Qc3GJGhZȥE!-sC|k;;O:Olxj==6`];CPԵјuE]j;Č!8x ?xWgC B;HHn^gY}\o`3<`AYEO6Y rS Oq}T7UQBifSj6D|dsBkKnhJcU]ScwEߒA) @q?kz,0UUr4L2o T8$8&ntd6>)Y/`+eZHFI* : A(Ӗ  .Fe?AjDI(e;^a:+ -5 %%屶JNևjm<ڰP'_`FW+[x-3D?gY!r bUU~^ v#Pha'`J>9;B'NL2ƣhJGgG~naL3n:܈V3mi(0Wɳ1D9cmnRIҟcgxa-̮F~ZAb"߬Ҽ)tK;BM2#J?g 1’C]qFo8 /ayȘ72ux7 (U 31^i`VS\E4} y-FkVu(zhcW"Uł9ŧt ʹs=^AH¡\nٍ.Tkvu*<5b<Ld= ~pA:Ӡx/5_EE=BNU"ώ8?SJG-``1vumyl%QL6l`7W)c f'i?ULb٧}P*iCNتAqyfWo\o\n5h&d.N{D9l;Z\묮㆜O>WK]ʕWa:4Dp5! FAfY_ Ƴ9Yn7rTV9 яfp 3.b}kn KZy|<2$w?s|)(TԯƘMP)YUT}Q[XuI OѢF,TgQ6WJ =rUlo߇ձԼ}g?Hqz VJ\lӭml`<.`\;e+ᛄhIcB er{}*2;U ;ɑ#dC3 97*H)}mJLF%ĩ F[aQZmZ(_m\d[uPǴ`]xJ~+kieNa+ Ek@+XevRi\c ~ l ~@Bq<t'ؙs؝ϽvC[2cԡmX q)<,@ B|I?i2?k[quPj<v؄PV\iM?@mL@/hDH:8ezw԰RC#Y8N|ߋV4rj֬կ~e Θ930Fb'^(?oZaa6nEu $,: :H"m@h,OoJ>U& v i:_ -\+N%3zԟ۸Y"P(IrLc&ºDd0verbE 5Qhfq7BNS;"8T#ًK&!B^9rxӅ8ib,]p 8B&VKK êy*4$Xl0T|ӵʼ2:C ߻BüOj}7(Zz)C—b*ƌ3ݖt'fTT" #',*83 rpS nY_̗$C*Xw\p)hPġ; ]ޛg')$,[/ѕL@7W[s /l د=?bኵt.@K{#s` ks%*LN&~{WC2a&YjߊUkXAJW0ɒϟx{ɗ]aCRb+I&hDjVGxO g ύ&T+s `!3 \O@I5ox\;[ySGHŹ?<,[;RW@&wŜI?!PQ}3x㱅vXݬbS}pn ށjN.JfBy-;jwO[x>r 喝"32 ΎĽ1`eFi Kz[7Tzz ?eNoWf?nȑкR&ٿ|K^JPhA Mjb%unl\$퀔 NAJ<= 3=BU\Xձ^qUd%֟*X{tH5l1nAFhNL)9eQUC8/+L{ 4X]5Lt\w c?{PT Rpؓ0|3 e&M2R*MN҉\4@ks_:._YfA!)K{1!g$5$}4G"A*aB^?j 48:!u)"}npvv@2w2ZYc-*0D%6u6Hzǧ}N!7bNPKDk>0'@BMh~K!O$}=M2ŝF V:HZKDO1"_w%c3o<([&.qI 6|(ȏ5mU+4B)ٟɣ8R@"Ia0 _jz^ AFLɨTibIAxxN5ލZ$lh XƢ|岻Y.R.EXVE/J{N+;ZtI,BqYbJkIil 塠R,Hm_PQ78jlil!)@/ !iP:\ZBaxA%:ʼn\'mv7qYvCء%u~p3 #.Gx卿x_D֌' /%HU^lmgmjνގyLKth)w2x/xlo=n莁SD{e\JXZ.[/ S8GC0NՉF9Ŭ&RȈ$;7[uPo_;5TaW)?zS<PIѺo)Q-pOs/u PP[kRy;#c%]h@׋<';sicB,:!z @QA_h uQERsx1!1sG9G7#s5s=$aGt i@>ES=gYvJw@]ZJ Swh k0#Dou^pž%mV#ry1c&ߵA'UB+w Ã'C*zn42\ 71Tqo۪ڷOwܼAT3 Cgtg&=Um-1i[SP'P UCaOX+$̓@&Sf.%rõ'(y >p 8w A*acry* R 2H$dVF קz 1A0=${U7y;J1AN.l|diN#M#ZAJ[5u}ӳ'`<®SA"S * c>'2Z;r R>V?VR'cG.U {5Q\ %`&Rgf'6f_ a\Ed8ZΓv1$71:XW}ȧ@sֆI4< FD@0n+A&8>I>%0jbк /VNA} CM3S$KOtTs'[ǹjӛmI53S\@[g˓?H+a>r@x#l^Bd%! u6_'XEiIP;aab$TÆF a2pzc&($DI&7wG0fP ⛁.@g2w(禵4pʅe>yRs4 @ڎ2a2$qI.'ox"}/s`=%n mjrvӌSC?>jC^F-Et٨]⛡ZaL^#IWsFl -4lyLɌiS߻ei|g ~? [.Ni)>1z-,'hk&y+,,|`:eX c0ĤO陘 O+ʦANW tSc 蒭~&]87Vr/wRl<ϋ"A:}cCKm37=|UIܼ+ 7 jnz5v@aWr:ZyuSN:w+ BDx&vU g m&Z,țS`> l:&[CamՖV$͆beiz+|P~zDPQrk2WWWGHJVIpkL V  n |Xg];[#Z+9@h:ii{xk"g ޙe`-j#LpiLA3`u꒫ *o&o A afzaUlVV -V.`/+q+LfGX~bQQq)@%ˉksWX $ŗ㸚,(y똶]EP% A _Cj#N_q'bU 5\&aG\Ia5zxIv4| ?~uPN< ˧;!R@!eSTHHXH*]UV*KԮ/ErA\t2QMK,d'Q"Z zrhU 9^'S&)-mrhm&s *jНY] xIf\bӝ9vl3y0=л| Cj繸+B e]0iJXrwrŌ/f aVvC1뒘nʻ$7I̙]E얧%$(4G;0>(C Zw\aT8kjFR?p(V=Wf0GlugKe< 3ɹ^97lCȔ0~W Eksrţڬ5GFK&[wx3D \m#E,k5?=$ G6|պ aI3&MaVC既_d{9)vbOՄ9]x{yR6\Be c<"8=4HlǞplN#QX"1, I 6k[@ޖ`C6-1YI&p Z;suk27F=%=GMLJ]4yA4v3b`1W 2VX"1C\a6=EgV .TLBw Xre6 Ѡ]ewA.Z@ ߡ$Xx4X?- Ѣ L0oO2 ɩnZ(Mf06urB\{咏L6" X5lsV)"/V^!RQI5ۻR$ 5w[y; y<$ v \Wvk]s̭┨z,2ܪ9@BM4P?[#rdLHvJ!fMYSaTJnzyAB5ы)^d붪D x sNГݎy>m);ʂa.B}}pN6bl6c?4̤Dݠ!~5oؚi$XR8p%ȷ~=ؽ!48v%>Vֽ`7sCù˅]~i+z -af) )>?Ne91>޸OˮN&foe쒌hX+cb q*e ET.g*Py!;XF3+RcՈ(e}EhILv\4u.EH$Q2/T ǧR}E+ '[O3 T6]w!1C]6{ꢇms+wG$nBS[)M.b`ۤ-҉z4WD]UXL駨{@\o2Lj J+}y=:_sbWNM$USO].KJ2ZR˺Πa7Y+Y根c!Xu:y+iZK&34k(T{]8}/);.2?:C▹.3|>2Vt4ce_ :άy{RçGK:l fRtgfbyA# ~u*䃆X8kfݣt]XߤFk5_USpkmlD/k \W#j"B3Vs%C \Q3őxVېt c L6S6jaTdAV!Lyj6<e=ߩԌ6/ <()ox6?Vjt]{2/@5&21E #ob(N?T_0;J?z_H;8 ?:nDz(ԁF)~'d: ep]I y|cᗻ9pe0{L="Ui$ఞɱUSU qP 7Z"_[]:殡qˣ%*bgq VɽC:-ś53xl^5Ώ LeChrshמjd!semOoG{pò:!i VKT\8zt~xLS=`y}RuQW>dr뜘S O[iD#όXE}SsL/}cdm^\rr֫JCo>Zd. b 1 &cmuZSlBjiMj:d_KR-Z}Aq +9ι?lOc5EWێ%κ?NyZu>ƿrE5-iٞI;w DuUbGÓ:Jwb)(m Yg/x"/s:Gq0 \+3ϾWeAWGOȘaR̀_בҴ说HfM~69F%0oUպ >2=6LM*KhB[VDL8ڐ'0;˒ i7g/ɵeg^w`p؉Dl;=z>ڪse@d05ШSƄL>yy$4n _za1̤%htplS(Q^Wz?4=[vQo/H\3G+ Xš H|f! +ƃGH\FhgUC L X_QC~䝡2#HIJo,;ܐB!K {(+@P Z4!>F P+4X CK2pC` bSsC64! J٬ ꨘ @,@w!pڄ0}m9?]=;v^kO'kd7?e^,%Pc[-dw߳;%hK%*8`z̡.43u& rk^RTJT'Ֆz*8~ a N5-k bT]\] iE8.*W=(8F>*ٞE] Sc%XdObPwfNƎ qr[fWV̻^d&+!Ɵ7GKY)dՙa0&.UΝP.Ӗ&+;]ʯ; } nZav9m6SӶ0lu;d>Y'ls}F6\=-Rv6ZC%rg'G3l>@. tʽ`1ngk:KpiYDZ_I,}{6l N6LCԙp/)wPÐr%u8q;:pG9>^ѭLώĬ%B"p"c窭]ӡ5İ?Ffk }ч<.BO/n̙\Z ;C֫boځ R)p)t9jU7k8&~jcVyvT{, ʮv+h+^Z;s~UiD@Ѧ ՜p=5@xO D!0wDВ'/)\46 ]zN/3nn{h҉v%g6wz 6X6{e?H#Ej Pz(W&[/R0$e$Dm4V7}Ӷ!EO(:n>>bM2 | Zhy̚g-Ff/+_Q2@BY@avplpjrn:zeN>ܲ9, ^a.ORM7 vg^].=k[8?a $st kaI\ >|;p6QO֑ \ZQmhl = j=껪>J,ADߓI̩GF0zS9L ^):R~#g!d#0-c"'&!3jSvhnwx'xSҜ09'vrCSE2bX3脩Iߩ]½K. N5ٶ x8w+TfXܱr*LK(S3?P*YrI]ҵh^ұppW236w-z:I*;=I7BUp\D6=2EН%v1~ˍuW8=ϑ }B ډ!S$\vT3 RgTiYf> נdqﯧ1[F*#8Tk4K: 99F7+,U K!jno#4DQސenrȔmZ+ΙwkS@6fq=!"zRT?UlќtI\RmTVwVF7tIzszн nj%UKO>A$9#v_"wT$;[Rf 1̣ Ir8kǺ!5˫w\1aAt1\*B)֝GwTeÖ5]oYtȒ]ɎUA`A϶m\(j*|O].X{R pdPZ(N K&Flcg jq~#"C[L.J,] P]ݏ QaNpԹ:*{C۷y@SWOnJ>z$Vx?3h]&Wk(OB+ U70/V"Wn{CoA%1<Ν-,ad-S| :zP_GKTh`?3ߵ30j*TARҴ|CM c^h'*/~Z@WF˩%&i܉ѪQ>z&U^wm"ڣJPUYre0Vs`bk\e ZL D!ɖDsu'&[*Tz>o,8F"f1*VX&:ʞ!P(-`/?VW& oC{7*+sAh1#Fb. Ez)(zG?ʙVsP9r88GxI<<ƨKg[~cEB* ]iGܫAQF ͧͭ+˩ʊq,11ui_ ^vv3a{>sn£SoqƞL.~ȶp:wV9S63'oA0a0Ce5R\De1LEB}|siz?lhV^=-*@d;:2[$Cdx*(61aP B+,OI8ʰyin;'V6>z)D$sS"cc0ODhJd" ήMfU4~6X% tvtfMĒ-T˧Yɫԝ!u |=E[ vT/! r& J<ȵ`㆑ޙbwO {a>R;4^bP= )wg tN28HD[MUbŸ!~=mVr Cu; hm;(|TB آ\Xh#e 1LgӦreixd~1zRBȎ[Yuo|KaWGش,F߱\C,(NSQeM%^T lU JU64%fqY<ٙz/rtn˜%nV~%k :Pa*P! ̆xK>_xY,bnm=o9U' bxįŇeI Z$&cmb^2?*Og`ɶtO{tZ\}JS=k MI=ѯ@NVoޯߝr]M~ j;j%]O^֖WdYk!K6H K JyԎe՛_][&ZyZ3|?xʇhi۶nh3ҝL9\Kt&H'ens3.u& QN{P(V$$Āy\+ b$.pg<֒aƬ$d>FdÈ;I' E.z|`vLIs#F0H8y<"S-ch(_TD\&&ĸSc~ ,Ax Cz)Sc B2L5ȁ!LMDE)GqO#n· ki -\Նc¿9pTQ~޵?01JLmTtbw} dX:r%#+4J8j^SI#ϫ>A:[)r  (3U&Le \?eBٲr( S2 aq$0"fo\E(naŲ,ͅK[N%؂y\鮕iWʟȿTꮸ $pΈ/_O F{+-ZVj8_f+o ʯ#u ~˰R!k΂r˜`4 fq A"V{8SU!SR٬U?K%I- 봜+NUa;ldFql&g\1`bCR9yc+Hz;q%#7WzqS ~س3m!j #tHF8iK)oڹm {,'f W/ggf9D +; Gn!)x8b5)KrsKП.=-iwH{%]Dinue ]sǓhofeU) \L#x,mQXN'6Oz_N(AE;ϝtE )fU`C^3uYG:6jM&KEJJwy[x|>(LHotҋh|],&k vq4mlm`D*0r2<66kKǦ/¶UFRa%cczwW~E߼#\2t >6Lnu 8flonW+V'v~[Q nqڣ98cD~Str3qR\7{ǔo'D $^:x2mWEwn[/PȬO-K,7ԏ S^ pnɚ?Aӛ~v9vJewyA/U0$0z )cq xzaT609 bWF[x̛/CR#ˏCܩN@((}QSb*&AOV-Ґw@CKө0}UT| N5ձbJg(F* h"mm QF1D'AaQ<)qH}a[E++"jR`j2 dbag١Ā8KrP*uĈ>kpN:y;a?SM{ZaqkSDX-!4U_!L FF5ڛOX<7]Ridw5a& dH )B'@,]t]h[9MYչՊ͘4X"}oJgQDEq̓ab9nAU0؏<g-­ְ0o7}7W SM2pzo8w™6WQ)h;=\ݖ b4ku}„^w-V~raՑX<DVF61"n;ޟ,N3 ʝ`u(*;ií|l\B.N՞6BU@3 SSӮρLIXL9 [cEhDBDi%Fz6*tBF%ώ\nYe5IBa_R D ʃY<.O-aK4wTN#EI&cr3'NmC}0 M*8@M~gn_eH22x)o|jpd!\@-ՈE5񱹈Q` pIu9W&0mD!2Fh4LC+$JgZBhQj BƔhA耊 6H츃XK#891VvÐg;Q/< 4?qg7>IʅC:3ɖI;TcgxJl7|x~z)s%]-Md? &CudB/Rcb4C[Q4V`߭A0" tڱdES&3΃A$%/Cva iN\ˉCLt59(x#пQVmQ Zڰxj]Z|cF~b h!J RXh$V!d%$朸:4qQ8р22/`4&037Da5G ouฮ(D#a|16Nw4$c !1-!, N|  >(L cBAP( q& H)cp0kd#Dy!d&P?P4=#`;@A 5B L`I&AH p zp 4NF`N 1DpA90S  R A 8! f8s 0ć Y1 L9eF5E@ 4RPq05T(Ѐ#0PcgY8&v3BhP '@㮺S3qE2S !s040 40)@L@ @f 0h`*@  x cdHLD) 8 3 Pc4ALp @s/W@Q14耇c4 CA<c@c@ d qB` \A48 v f4ch10'P$F@ xz84Pph4c@3 4,!&4 0 p` hȔ14: @0 g pi W3f`8`5f`4cI(00I3q M2GQpNp78#@ h04ApA@% B!HLn`CHH @m t1d`") '4`A1$IJlL  caF)H04&d`:3xF'!p` Jff,b5p#@ 3qB8<NBb.#A` 8Tx 'Pf Paf8x4:!Q4 @ /P @# :8!h F8!*m#H0F0@hIB`P3#fs@hτPQC`]A4$ r蔁F0 fI '12Ԁ9YhP!df3,g jAD*B$!yZ Q8A@Ya(\J|10bCe fh!PFf>Ih(@elFhsh]$! d|hPB% g8!hܽuBDJ<7ęc"8g`݊ OBJ % ;@(lN*c$H;4]$`p08qƊAA Mi1QV 0@0!teeworlds-0.6.2+dfsg/data/audio/vo_teefault_cry-02.wv0000644000175000017500000012011212140200333021430 0ustar felixfelixwvpk2NDma}WWWGHJVIe{E|>|s=k䧨vDHCC, j>{Us| )µ(X!1CJ!nmQ 0bܹSWUz-D8\&|h`i1γ*|)2X(JH7.$"36^nSv <'41Aа=$f,FyJ,ǫ>M7őOaWc kV!j(pu#C ). ,@ #FCc D00Uf#둢@(Gr_?a?)ă  DJ uЀTJQ(a&'4A!GAKxZU>&`1@S(edLp 4dlgI|l sZLڦ N<0!zÄ GC@Nd(c Q2G gHIm#,,F1$ >'@FH%64Y0(+NAb 4LTEB~ b!  c|K *,%ۭ#l10 @`C[ gO nŶP'RI>2&g6?zR2%B4*gMe}yga`h]YU}^>?W_Uuc`I{>+댽`=_Okxsq X!w1)0 Zy~O7%XY/]ʶ`7 0ME/N:SK/tJ2?ȃU<pdJ(U9i1mR?4qg|}PhQ9d(Wa#$U)~oWdt t†茵Pz#F}tiÖH,sտ ΰ; %pA[8xF_ E,/e~9[OhF mY1zPgQu4L6V/Co yV¤{:zdZO%梟CYJ3؃8 {؉S`l\ '74,欣k8Ÿ Ah@6:BA( N7.SO^v9}v c"`pXfu0EappOyV@foGM/bЫD1,Q`)ՑbB%]Sc6J (g5ϊk9ZC3t8Z@!EVZN)hw 3uQ#??5_|~W\]؝K$ Ŗ:^ _Gs*]-`񱶖#*!̋<̆zNs{6$ß̦9ݬ3#FV2R Z1w!Z_Y.0RaӔW2'"82 V,Ew2 jUcWp%)RKyx/!Pb"#_.ա*yݎoO%5COBr$ *:Fzu5T.d;sO^D!912wPrVj@rUOa+`]koӭ%s\8q M\3 5G$uR䤭 -;8XLاOgv?Ơe ! ˬ=9:D @dXPD< "Y  $s|ߕ: +X$:e 0R[Xb"&{"R˾=9vUkt5_P b- 3IgpP4"GÛq6rl%S rj(s^W ytrQ^ɬR>@~&/&b  `e ¨h^.hC)1sUIIzUDᒿ0V]άD<ecȐ/&ٟbz"d7i2h ^?׀Ȋ) 7PI9K˔i%ۜ0%u심)k1$EUMѫ(꾞%ѩ]\;aMȗ(wshѹ:c &G7S&j*&0r5ݩJ寣ݦ+$0v%S( &+z3k& !2X;0:Ct9Fm&'|F ft೯e1wtr=sC]7f0,T+]> } aW,eTAyyE):]=eQ!vʲxF_Ķ˒al&kJҺ|T_%J8۸}'RMBǫṭ}fr* G.H0ҼȀt@<+Ǥa#k[D>fr}!5Q 8jH{sU? K{Hpj,6YgBB:TV=M+|B*Pc9԰n9lnV1V| ojT%+Pئ08GOzB;}Y7Na~Z_@y8y="$NH$z,\9(zzhʁ"&M R_Ϸ"vAkba)]i;Fsi5S$Yt W Z'Sq²ⳬ\XCKQ1^HWt5akARsvToNA oN!? xga?CDY^2s H[zkĮ]cwH&$BnW"|MdnOL¬x2@ 1'a$2@| W]!:}9i"ru|kxj5t'f]u =LTW G -O6;EaGu<+luc@9 5+Ę1ut]uAW+/{#/QDj]5!mF8NH;7Hs$WR[ȱ\ FQ]22ej\ Y3sD\|F@f +EqCWV&ӭ%uNΠ[r {s[c/W]cXdE56m2c zI$Fwxgn)Edu=mrI-q l^B{vuxªx˄< ZDbɴfP`9;ڴ [T>Gln}Fܾ?O/ #EC:+[<OB\_8Zɮs#򽝵tF)'ʍ$Q1Q%閵#ELŃJ (->t.NnwF6N҇kX!qc'?dS%S=Z_`D=ȡy*9nNh;kp0:Zki@?0=_Y^-bt,w4X7~vls/ߒ_W߱n|GM: ֚7Ӱ B{VmMԥғl^\T.=}쯜%{c@oJD2)!E 000a*N}DO[Kk/%SBY(K㎗(=v)e[-=Ԗn= W뙐hR4j5*H#w!() r`c1G|\g}pNˁK J4JQTIvdX}.heb-hq/0+ry2H40"8tFΛ&chV:=uQQYͽ\+rNմys4oiZY3LFbúF4KrH&u )D{(AZ(kW%\>iUqGxg2i,ryTJ,!`zVvuǀf)g%2I(?YJ_4T]q!HRQT SnpFԷ \1cIY77:Wd.$,RCN%&OG P񨞡ME.;,3x>hpS4 nZR$Mzv0c !QYţ8CylFDa ;*IH,#6D\YpY֠<59Ws6@dxiX^R L-G]t齛_}G}W$U'XNCi$(Ω44"9S|X0Fmdn#P{@ ꥥxU7 *ڶ#Q7Q$!A3|0/-xӚ+vm=?WϿ m@,L8hM6LVͭ)Kh,8oT#brUTs ;n9dGSdG;9\X!0*wB+ R0a N$ŷ<QD/*85V-l6>4vLۃe(fTier޸\o5K8 Ұ+B] $U &W*aEۺ]SӍ&@_zw"vB"F/hޙܢUL0?Nʘq!)3RwC$%]_U #KBP*}O!\x4'fY磡1Y<g |=woܚ,#c)@CW2X VG+HH/ZEHL_tUi \B`p=r^eq V5\Vy):fΙ8|xMV~ZD~@n0B%N8xI.Oڡ`;]\t#*'3cvv [ĒX0S/;84}AS~.&*ۘ̈X=&kF=6+}tǝHLa$cL]ĭ:\ m)4KW =r9NF(5/c7EՅe4t^Cgvс;@`g+Nh6AVN (h]@'<\ώ."RN=0ԩ_ﮗ?t5{eO5Y&ét:2!++Di[M;DnFo_JAi,8y0>+mn"ëSW$a\kusxyX\!U٬Ss-y,p:W.,lFåCv0r?^ +u, H< 3lRyy6 6z=t6&Y/ ]Ol-&q+US[}ٔdX,lHl%ot*`b,#Tyչ3sYC! EњjP+ i em r#m}y3LaJ%*Ԅ4׺ ڊ'qZBC]Xf? WF|b~8\(40OPrvOnW'8bר`=3׭J|4Tw\ϖk^^ȄuFbȩ@9e{,/q׬ЕOߔaN4_9d|I1L%HSU"ɺ*An~b'R&>HeV)#".V](vgq΍n܇%tNY8ڦ:iQNьb@G3GI3@;_F3fɗ:Ϝ'M]SZ_ V[A]@u@ bA#Lԉ*  sFDq-VUBbHKBXYYM)G&G?y@6tQY:n/@"w^N&}ɋ5ae8 2ߩ1NX el[:a _4! 6|pNH(XSQ3EiD g1G̙nq%)x BBwf\ٹqr8_ ?41SrNm0J!uԀPN!?!2@ mժ%\Iﭚ+S] &AҔcyv1ƬV8>ɣ&H/':H-)k~wExMj! %HJRP.bK:$˂s#5qcʺ=! OUό#HiB_@/}m"?=C螛:&qFz[MlV2T?}~&C_Xm +n)@ژyVnSJ|X<1zǼd0Q=gXU dO#)SL*A;Q%~FБ9 *e.0 H)Si{2AXᦤ,UaGOphF`*oȤa|%$xlqogV0 7pLҀlj–U^*%؆O2fi5S$:hX`)RPCX Ck"9ds}c6#&şVZ}p$evKj>046s>JrDSn(3{Ghh 7d8~z 0;սdEsMt2;:Z c ë֮(ȉJDe F#nD\L+T(LţN2mY1CQHd4*[><֩C9mNC!J $#̔O2kX_pND^Q ?Rld 0GM&|!N kj)!VBiqx=JH bjj :b-@oҐQc:eAiyQܔ46 C(*y)$^EZ0֒aB5@a(ž@F)(( )|,#D) ̢$9ɗMBȁ<~+vE@XJzpf?8F4 \ Ha!NP aPNORCq0A1 l ,iHL Hl$|0@yl= &B?t@j>=aJ&>@`~4ufB @`AHB)@!Pǀ()*0 z1f‘98t |d $QL6871|:zh0:LGȄxB64GPÁ g`(00 /*h`L >!&1 (8 @A h u ``4hg8:.< 5N@%5$AsJAI(2ơIX'$Hs0"H < 접Q@3 J ʑ!^98BICHq,C@@&AD1DpM8uC!Tq1F4`b#84 VyF Mu@OhCt|p"ycTsf`&!iAD=@cpxBB; tQƁx֐H2 0 I`Y<'QGo`#j6# bLJU"3 `--B/#2 ,U`cKejOٺfRCj!\e fShnGvQ5T`_ 0'Gp)eIFmkR<>ZJ"VUJFukeF(^%O l6wY?6mOf2crSG _X#ccqҒ .;oXVHK\]ig$5?#~T5' v&W7/mRͧ¬NubzQ$OaU SP5G)Vbh+NR[D?hWch/=j2*ĉrZ[)m J |nwJnJIVК"7&UH%i1Q[w O1+6 Xhg)>u"`Z"X&&_pʯˢb8@kL,3N! #;ψ8p/ɔT"ךL,|LNJuhE"-ܹy|Qދb72teܺr{QVB;ެZNA%UGmg )u7yboZPO />_e\ᚭjlDnQ7]9 z3ۀ 7}Y0p@{G&Fө b,Cz t'Ѿu|,KM)@#YNy[o|FBuNfUOr};H@:jtF}q ӬU5 1(dZV;RfM`̄"=x J[bܨQJP`_ɼ2싊a0eb6fvM ͍H8_&QAmۦ [h~O}iӌD7L_ G<;GS6om8Ymmi)LTX]9TGRd1ZVdʎ[PYSw?uߪҗL>7}JQE UUʈV7P쬎&MCj>NϪ^Ϣ["?:*$o2%Z̰Jc ,R8ZN[m5jUI?U|;_؞2]1`+x^Rc>ujT7KQzԿmɦ2Y[" EnKM $Dұ֔`߳;](UjC~hɼϊ͋ȳr+MT+VO%8Z_GgGR;Mϰ"7ב چT(k7v>p89> ~p&-֜}jȁw7p=mw{(И6Y:vU>M="5=W$wTaqBIt.ɅCXޜ8^8`2|EHںHru]GIکĉQeY3 &M5!&y\F~a-\(`lZ(rmM#.s'*ȮԃTCmP(.5))-Zx89DN 4Xiv y/GkmA8g;c =-8%3V 5C]8aMAФM Sq" 9rR&ofN~lQ9 6=mKQϯHTmF1`R5W㨊[3tΤ(#53%κ`٣ݣ3:U燐'HY׉?$8ufF%7:|Kꌺ뱝&,} R|M%aڻ8 sM 5Wmfrܮf![έRw~7ZTؐM}Aj;{LdHO)Fw.CS>ZXW0}18.t!?] ': ܞ+Ge) ?{!0>yl:=>ᵷCsiyH*AWQH^8ti.\'z#eRK&c[+;xqAeλ&cTbxTڞ)PXJI @[vO7V$2Q}Rw>*ٟ *ORôֵ4'Uv9VT $itL4M! 0*שּׂ^݀AE#;b}Ɋ"7sIϚg,B{Ï;jC k_"Y1jV^TiɪEr,+W-;9O}UEQ/$Kq2r!3֐)!ݗ 3LqnZ E2nǷ4ݽv0ɺu,Z5>cd7.炄V*Ԧ&/an!7a?Olg1i>79ʆ?Tw_y%Nñ$S\Cg?'oS=&f F 2 W!Nq6ojQ$ }$UHׂ͑{yS,aO#^ثW[]z4\n 2'b]Kw*Rv2 U/!tjf qQ35vRxaKcȩXϖ'Kr(%.oH'Lk;pIah,b ki}P˄]0"|\=tQ.4gIfHdx!scFwMn6p!Lɦ/WN(% #|2vL>1\Gׯ2wǚōٛ”1IbE&:ElL6M\$@ sm5!䖌PiM [rMU^:uJ\or?v?&WK:C)xܦsKz;1"*+&:sqt0MWxq Eᚢ0Vu'q?p c6=}9']{9p$ wn)kn5mCr,ey(K*ݬYFa / u5UA? Gy.&YI)C36lo/khUw4؁Ia5ЛfFNqV)?/&'XX9ׯqaС6έYxgMUKZUށN73uh]"}ݐ^Ѵ5pGk]+n~/TR(TC5F>.Y@.e`9Q4 <v g=!j|2n.t6Eu%l}Lh M3?ə}e?mJ;w` t F$qa˃ ]ݏaf_|a1Buzgy𯓽Z"xM.U|n: ! 'Kl{~zTVd^GoEq^clA?&:kl M6G]W&eR'Дz 6 qUhĚ\^S !W92;4p;b#C>,Uq֠`}$OtݵuU}[tc&n Z-&kJ(e$q aWJ/x,7?&%O1" Ljp&Z&J-74 lc!jO8߭̿#iHE3>s$$ޓ~+" 6QgCd1kIZ80m/FvLd$3L)oI5ヷ  6;O$,'dmV#n^L2,.͵7s` 2r5)$^B;IOβg Q4eEJt+'#1~g8^̠9ӰLtPZg!Un4$Dt0 ˉZEԾFҬȬLڿ$n<$V°3%Q9J`_H d +ܢ umf8IH7(;\!e7i89ZlDk8?yvbIx9`I:+yyIG@({$]P;K;|+6uBzH<:vj%yD0$9-KmH>_6LO~3Uv|Xh1Mmu69y64Af%,04Wt31e B.F[FGY=$jpFQT[ƍ0i=r-lchgӏatntbj?uFfQFL>w-45Y̨G#wLlwC[Y6x& zJ|Lr$t3E<@_EA|Bdj~[g}maO pעп$P|*yأg:Cj1{/`I3)+\z$sNx²W {'P>Tԉ]L ofEXC";TcУ gDr.RR#s$a>sy ,Sb3@Cw!LBc9( b[c,R SnVAD[E >ؐ X q 'WExPb[iJ4. !ǀFK挨< J-@r9@<&:3VT-! +/M01 4T`gPlE NXR$C/P-MhR1C=+@ 1t`]H@ c^4hPn6@BpQ`Bdup@sy$C)`1I䃉LbvEAsxL02A`H&X9!F'$E G"Rd!`JwŤZ|(C ntO",E¡U#>&(G h8B AdDOyP& h,dt<Єb#AUhVH4.z>Уd*q0M@H9DCFUPĆ<.$MgJCzdP2hPlBxD0N>@Jc`qr40"EB h9MCO0L rp X|Ԑ)>a< #@2&8ЀC F20 8DlH '^`5:t hxK(=ABSt"Z@〠CQtʑ}DfC FHhHG  ^ D)< j4'F(A8hhЀPQhEQs)@hʀiO~' 0rs38@0 nc<8@AC4j1r" ʠ 0xg"+0@ q!Af8`8sAP H ``pdt$'@u(񎓑b@4``<L0I &&3` 8`*`Q@ 8" I " MP 'D'&H Ml.e|df$ 9 a20j - >#= Ojd( 1`DhbcDS'I0:`r0i?#@a@HN1 4D|! 6()NRa6q`;㌂E `4 @4QGA6C`P@HcJpL#!sP M`#@< Ej 3. (M4YӝANHÂ@cQ'((8#<g!%$ h4`΁IHB%eR`dL85tˀ 7!<ЀX6 JaaC *@;d p,Hfu319FGc2hМh( DCL` 4= X2Ld' F$@P@ 4p8KДA)p( `!PchsBPPE&Ԓ٬:2A1t4)HFeA*/e+J`)&0Ag5 8D 40 NdC̐Q) aq G CU \ cBנ p4l* hVg`Ҏ @ 4=30 sΠ( A f 9H(<A &A~`L `) 08Źƒ`hM # `B)1`( b9@ %t @tzdh>#  SV15 )t8 LA9``Dɴ1Ƙ@r6:` d!: #JچTW9X+lD# 9Pht` `1sഁ0p! 1 3Wg` p e QxF|{` 4@&X`liGp8F0Ffc95O@8pz@%oI=!P1w 24h@c 9D(*ޓt8J9D `e%Yc46HB,p׏|ZbGDי2&Zk9Qn%_ HL`JA{HR0S(Wv?eSoQìkʶPN V](d8Z8oCև,PZ&R]W "~/?/Hƈ -~%R~^^Kmv`BTVq.K2 HMKeknyu3~@;$8T3c9~+x o`Ԩ_Utn3/2Έ3ߧijIq-%|(t^OҌ+ilE^5P3]` j3[KUk> ?ZO>k=JuE=Ei2ATCX=`mzϿ w}^A91ТY, =2)sưuLH6̈́HU1M{3 hŝvmKL;=lsCp\ك|IIJ;&Tȅ*7%eWV8w?ϾF=х+k`bm;E`Sb)fd?iƍ&%rU wmti%WԿvo㋬ssG~J0?b~&"=1eX84A z|hXY^8պMURntcS%?eé+; obO8OcJKh\]%TUmkmyO[~.3D7/8۞BC52>Gbj߲45/x <ۧ}mO#,†qPBmX{b-duK߈Z[;,7*HO}]vAI -XI!'O P7j'1 &Oh%Urik4}n2cZeKee{)!M>N^(X':RaW4oQ(ݖl:h![ P$ZEG2O@4NngWA Юǵ2e[W2w`'ޛw>ΥXA));qji/IL!K' _Jk|hsK"eqh6<^ap5E.$FTݨCd Pp?tr oA=x :_xnjXA|}TK?›U[Zia5XG!0(JPF"Kawu1~CC5u(D5][Tvٓ,-c&˗n~ KO' fɀy[u(h0O gxy,2eGg-H!!1_WHT g@է b+]>i{'o#1`]w ,A7}n0"޾9g_m| NjI!Gȹugmp $g;V8[0k-N9-k|C[ф%cTf֏cWkp5U˔ENzӍ*8C83ˋ)C#(_"Y1O 'p="/LHU| A@bڙ Pr2B&aÌe=_g5~BJF,9.ض\PQ[ zU;qZMNWYyԈ ~'0pOL&(Węi at5g1ǜH$ā#^Bx6.r%$Fn$踸,Xƈcᝉ@0j2PiqG1 #P&EtzY ȐH*-0@hc1%i{Y|nχ/a/*EB,cGS-dCY 1mCA.9Qnğ^-j.o3w߲pP TpK',WzeA#]D)@T ]CmbyCfN!Z"$tJv.ȞY?$z3=#\&)sa;LD( R ^TDJW*9wK*~я8 : i?-9.>O@# QHy F>y)Ov~kQQtR(My֗mK{Y!ƙ-#~Cg e !Lm`Rd_t7yQ} YZ={ }+1qӠp."UZ[8/.?VmU\.? s^ ԁ -Z ɫo5[u)W_)VAݔmXx(Ϳ>A[69;kj<;}ʲ 1S:!S^.ӌOv_W؆ֺZI䉩J? :. D[%gp$\55WآRvvo15}ȸrx~hQhRrh 7scj"| $o{>#]ޗ`Ճ'= e0OTŇ[by%c_%ӸO[~0]O08MC+0Ojrre@X# A-$&5f\~t lS5p$U pK}`M d_R2g#KY>_痨6sx.~n'řDԆdExDVw `azy&!D+dT:hlrb6OIc^IDX&G-w LhAnTgTYN ^Bڕ1탏C9uio.sA_T|bWDic&JjPœ6iocE~ i5h.Tn{4/dɠ1u ߖ8U|Nf1#+=<Fg( xA.}ȁUAAf.11p1&NΫ>]2Nn[u@k|U~9A.g%o)ru'!UK1AL9wD_} H,aLo, դ| 8q_Fҝ~# DZqY2fFp4IJ!fBŠ/&_?_ &5JT{!ҩIbݐP_PEZS oj:^R],/9=Z8D3T<(ݰ\jW> lv+/2NF uc !觴]2Ź54;;љ&0rfVq]lAҮ]PVݔF o֠PukМ;ܟ?ԷHu@]Gj".,. 2 1G%~%h2qS`.v4*q[^K1>a9mU<קQ@_Uf=,LG:4o%r]5h*Kv5=p7X؟s.+y@i˵N,t%D9:n dp&݌e#NƄ0`t4O=IP9{{$%\ƣrT[M~n/S*oް\߯!W^(@GUWԙ)lєa=s_\N.ؿ OP$)z9D1^DE,8pq!m,vOSu'y|kq(H#d˵4Н/@j1쮸ٶF U$j#:$Jxktb}j'rCɄs?5O"Ot^ck7^ g:K=HXn9T Q qCt5B6/>E۲g[3ʹ54jQ\BQ?cin€dʤyPylB1g0nqϳ9c,P9<Ux 1_W~m@\p/xB ţCbb0 pG:ß<=WiT!J7 υj,Mdylcj!ͮF ssڸejP)X"Y:e\qLdh_gs#\cA}a\g.ptBcHma-,oDZy{:G(~$]60$ئg+E b†;D)*FTn݇fݯf2G11+[BWJ b'Yd8?ܿ)q8Hהkmͷ48*8S0^GO}7[qAQ hG#@-&ɴQ xkԨkTzA8߹օ*a=AX訸1'3/%T?ʃɬ%5ǿ˜Q`VMP(; -Z 79(2dQccRd$<̿LwK2Ȍz8WC"JזHh+‰1ZuU-.Kډ68g$Oԗ =nER?{P|Qn"?޴+I!Sjo]PRg "=7is*b*'fY4>s *S9_ )`Ħ }nM$-a hE*Q#Fck'eB^hb@7E.212VQ`<ת*G%LE;qzOUm#arb Vm B eQg-+|ڟ N/~ǓfAmuPV=qalrK[/ֽ`}"3/[NmDhzڜN2IucOMQBpHEѶXYEn|K*~Br1ur5x4a7<&oωqND`@|$pVE$nQyp_%Xfcn.! aBzK!, lM6|bwIGԺ*{B}o-?qO/(Ia+ 퐶$k8cWH$@Chj w4w4j8H>WؖS}-eWK՘g0Zx#u1xLL zܥ@nk=>r8mhߚ+,Ϻ{+t &_9E$ FrIП S %Bc)Ơ{5demRHɧƅ?éŹ'" :451,wD&$fL Q9|,|zy3oywbgЀ-3N]a) wu*@Slw /)cqYMD`k1%)90 r6*P&ڈ-,/q+d;uKc̃55:?7 Ģr} K!-y..Ο_ 705R2LS{mqT!Sĺe/wWǴJY?NOGDVqhg'pGegj$=t1l2ޓ#Bl(hA@!,ơߝ@@ȈP3 J"G6nڜ?Z7wW!*C{PIreeNXa J$cvyvk2y.jԛPTbQSMS TFm723} ׄ'i nb͞?"cV)FTLe*%M(̋NES Qtijř *"ƴ翆 T![ru}b[S)QJE@ ^p5kFؾȀ/jܲv=`3i/sa(؁EU+Z"f U,~ ]JT-{ZiF*0 Fݱ "c3<cdD-UwF&vCY%Ybs_E ? 0<~2#ZOsudݭe)6Gܠs iF63gSS#ֆnfY̨L̑OT#A#~SՂC :ߖ ecIc'Z E1mk1y7E` M卂~Pq;|?_d_XV[E`HO*Q"\]hCCSZ#SMYq'sBGK?κ3;5% %T#EJBKfUZ}[n= 5~-D9B$Jg˃* \ÕbNq2a_6K?[g`}a*5rzT B%[Щل0& b 5s ~^MfYsyR ɆduM]~fz7 "E&Jƛ48{]rYu\ = nGf)J>Hv1$PRE^c uo_]Tf12cB"U`Noz0!)q@3e4׸Xz e ji]wrC0{9Z`u^.^;V"S{T?%׍:i)Z&Y^;RmtxflqrX< B+0Ks:/kJ{?dIwK"Pn3h=t7 QAa֬[/b.E&+$x"tTIV^=.ԑ>ɷO;~>X.fB=]+8J,a^C:>Cbs|YN޺"oAI]{e?YuRcM_Lާn"c{;"Noسi3CF=z6 j03FqU{ $%F 9×L|c3aMji3{u"DYS ]<%}QD V~kKt WE1sGa@lқod'Z3I,QBwR@?8 Xd#g7T!(Ƹ @I[_m| n:'vz'^˰M]4N>@w"`AF#MƚOU0P >r%GZOSWϡ ;x':r{eH 1S#"s@5DzS#d%9 jxZrt{l{$s("&||[-"T ^U࡭$;t+C@p+A Nxpv{__4 Lt5EO,!*28#Ԩt(פ?=gи Z[r ȨD)@qu-H85&O&l)U]QOB@ +t c  GTtBoRC2cVH% 8\VSsDB +fCar|V:tø﯈ƴIe]mQ)G V̓tI,%@ Sy&r"|,>/Pe, (*s!2m*H=6HyFH)i,PlR+2T")UbGCʚsA9-?ԏ5sbac5&{y/ծsLXe3&D(5͇#B(&tzYj o*- uI9OIe6`V- S{cp%E&°hJ3qts97. i]oʠ w%4P6^f+=ط78(#2oV)Kwg5hPuhV@+nBVe]kRkVT IUg{[G *1 S(yGŞ!s.:[)d[D*mtsVHSgѻJ[fON+7s[ϱl?`WŊWNq+c7NΌ4*jjp'i,n BYW\ ?>V98>0]oUdW50 TV:e9Xq.:ʁd*OncnڸP.H#.uaMWVHbF㼷 g[BX7})/j|qi{UL[3 T]A=B~vm*Uqd* ȃ-ψߠ2r'x̗%SiRJPZxc&ޙ%!_i`.hš)GYKS .>Z$(CAde1z2ϼ„,7ߐ4@&IF"y>mz (a섿T ͢{9Ilʣf8HiXyw!lS'a@oym,1OԚHBY%v>K ՋҗwMPxLzt8iZ@6 y gaǷSp_x +e"7!W RP6{'3_|鲌G=1swGa8V)A_\jCqt6L1;7=0D`X) ]׈ʀFDr,{H@ QB1Z#Ғ,78B``_("L qYH^i]d gbz{&Hax4̱맦R8;HBAՊmbzRΈB쬀y\;98g{ ћ(hc5h eG#uHMT|J/Вc/V DB( 'X u(%E]&l;3u'jEoaj*,R)~ҙA|,!oE 8IͺC40e8?WHDե|;#UXK7`tJ65"j \bA V!BRU #q5\* ( E8m؞Y;\xIٮ̮@dZai.tA?HmneObV63$p>vʃW;`ZnIL=>rcQRGλCj!b^ &ۗ;`?(38oGI|ʅsCagb,sX+Jat)g<=.g?0V95n3\wus`(_V#VA*ۇϣ_?1KAfC*<?SjXb)^Uf:Fb;~t>U*˽Q6wpc+Zi\n=X)m1%ƅ.u{xEo?iBp8mF%}Tf*Nq0Ĝr"V=!zQݑ4 Y:ln.$j=%UA_] /_X,ΩT[]gMtZ\M (D">kX'_y 'm8"5#! B yӖ0NS8TJ` F ï_βb8ߨMZ5}k 2`8tne eL`܅CWV񘖑6XJśZdP +*}p /gyy9$ĝRT$ؙ0ajGJ욈m3eSRˏ,7ב*iYQs:7gDܪa&"֜utjb}aoک`V̂|BZTfC3V$|0͊N6'=]v\ N-w"EqgUmq<^EmH9hd҅q+_fD ]hRtuhZF0%}S'pL|\[RӶ$.)DxJ9@-s=$Ht@ESM!H(5hNt`͖ΏH{E'F^bz9I/ʽ& NY9rwmeU;bu@uRXնTT{HfF A|W†?THi:l`=QSmRJJVuHR =2{ $Q\=\n/kD~]%)Xg? ΅,C `V6G\Y(A+Xf--a{vX?qU&6[yA(MA6Z]\/ip7O&wpXOI{\OkqYQ5Z}vI]<.wہEʪO`f h,M"+uS>CWi07 J oF"C۹q0jRI#Si&A9["5Kf?2L.kCe'!.V3)GDARG3b5C]ӜwS>G\c.{,(6hЬ# >Ay(o[:]ew8)~_Tw! )$9Ot=kt;6;ɭ#mg} }݀HAA.Ϩ !bXFU炾P/0f/ztd8JFV54\uB'ؖ q,)sw녡r+s~\M­peLxdfU0:sBwۡaЈ7HK]ЫPXQ~#DAM a!( al0:iX&0ھ7: %r|?q{NN,\/3 ,`VZDsViŁ*IYPQxA˲,\.@r O1<^ʝgD# ; Y AB%RM4 ^-wxm.lomI0L ƢSnBKBS fYu۩5FE} ' pUai:hQ֔x#uo#l(gI3kE;HΩ]6 m Pt\j`Udu܂܏gAěX?#jK@!׽KXAJg2)^}>Za&[yx2!#A0S`.g9tvTSwvpkND FWWWGHJVIor[$  z e V6? VWh ەxVb|>e|lA/Ń YBAɂ9|3pG=Tx0չ!i/yF:Dt.ۂ$` ǂz?}җwf!{O#LUUص#U}肷tUZ{h*~Zp;$}rYO>rV qbvt!.ٷLڢIR|vo''{ ;֑MJ7y GÙQvRBrFAAŅ͠7XF]œ?z^ k$1 w/U~ߖkC{“ oSju4V@m}Yċ@P#w`Pϒk|n85l2**l*ǔ & AH]AY'Ѣbh_y/-+48 eksuІӄm -ĩkھUT&}= pK[>LK|8n =HZ7U)8&j휈e-g,MPΖUVZaCgTɧ J!Gd3n]l)?l/xeHJf+pA;PRT|Q/̷_9jc8iNF//%j1n[JkTݩnJyl2H܂F21*Ӂ }V$^ 84 Zgb4K $D2سdg\ bx.C[ʡ؜'98WZ/aJzD^~HVg3QJa")Xi@\H69O4ymL)426![0T} 3EQ+۰v )T%F jIC]ΝNɤuɪ~T1'"KP$m!*>UEt!°l}Mc{E ˀ/lu8AYZ8ġ^AIEK%e6-&dЎռOgR$%lyYCq!ԍ~X:4kȣ`߳;)v{悲n755'C;>rf5&ǾjA/49g #T@>Ddnk4O6_*^&pH0)j JLP* |;m&@}Asv+UR˸fm,[ĉFs]> úM]ne(rÿq}RXfGt*g[1LdKY(vu1~C=T1hf2kd 8 f`<[gMt>`J+Jm  4#)T!ELhtM;EpHul<*ҋPsNnz2" E4]G. 0"Gc]DL ;ڤԺaֺk# Γ"/͠oQ-3P\!ZF"W&5=)g'`s!Ʒ1篆Fo`ҹӉG v_c޽/tq鲴ֻi.Ywp f Q%HŽX/ҥc TbP 'ѸMS5 v(HF0C~q}z?_}W(.Tӑd1d D2cR>=N3|Y>)#<^ =gDԖܪDH($m*PKfb>AJjjI3"1 Rb"ajΉPSU*%F&+ B w1^/ _'mR%υxX t+kIUtsFw)P')S|δmXr|dZ\SصDq2֜ԜciyBI\1CàO 6逢h=ƺHgqq8h륭iMY*R:K3~ۻd<pj 9:\" p@an_;g֥dv r68^N-~bi9 K& %04m]+U`~K>-_, ,h>p?ƎE^a $B&}Da9eQgy'p8k?°r$sV`Wp.N†c&-w>wan fo$ǒ.b)2N<BggaM?2Q reb +ߐ/ Y3E ؏@3(a9!٥@J,B `j-!#Yۼc F&?zVTp'uJR/ݦ\;@7 'UV0qf\곫 wvoCRkc@ _!2ihQ{*LqJ=E@g"(-$.4a Mxɢrt! @m߬Qdg ̎j;J4CLnw,y3Jm.hA' ޝ:)M:mDEdղh>AQx?L|>WaS[)4&RD&A$ IDӋ.:XdÜ0s 2#H9B!-r:6}8b8փ`:R!g0}[l͓WUv#oΪGRJ.ɑ}'gvSW/ʉ4@:Ylx7B{˂1<6X$P7L6+9vʦMz6 R>aa79=#mt+9:^ƍ'fp%u`:`ad}k xY IA/;M_H8 #0IŰvZL|-_ (b#_1) !v' cR4䤧 {i:=-ꌃeӯ@g؏I4nE8E|蓩FCDh]CxxD33 (Dźd`68Cdܙ3 &Da-%:Qb-]@ O_S8X (є'8it#hDZb%qrmn~\D"pG*5xly f!ϱGjE j2 dΘ}ZJ+V3 vB>f OMN큰 ʩRA&0vݰa Q+*W:2DG:^G.&JCJQtH*Ä́#{)xjaND" L3aZ@ 'X3Iǀ TM0iЄ(& -~ d2FP¡i\i͕: >H 9f``IM (L$4ʧG hL >> AH2IF8 a 0iip "r3Pa h7T p$CL0 t!8h`Nl>w#i@1! O0v,FXC+p @c*Jf &0`Lp Rt C`O0D8u0040Ĉa`` Մ9J251 *TP hB; 84!`(GAQd@ H (r3#8(x (\ C aC#@p(QQrdn)+w0)8@98 1Ҝ2Q ?qg=>- a!§HBE0 {yv@דau>b-(QN^%>0?5XK,c"gahP*rA׊q~j1#86MU"#"1N$*P"ЏL.!ž@-"SF k($`CJ8q@?4>83φIJJI ]Pkԏ?~DE ![ وؒ9xO}_4s]Z/)yhfb 0U-L6 6Gw tn(1BrR!G]%y18IPtz(צ+#BM ?/lf)M7.4e'-Ex2A95xϿxg}$zeOKc cΆvc7@+>@50SIJأM6=ޞr!b MJבs nR1X9'E~bWs{Fȗlѓ2knO.Ϸ +d\P4*cs 4{ ͤK9_g~Zu|V^BDS:JgsH [/\<_B"ȵ`XS8FZ [0 :#OE1 zÙsR2g ) cB^kBWsCdol?deFbUS3y#(-Sj3r W}2wVxI|LRZڂF䐬corhr"@a+ovsB1cн-3ȌbgB9e?1Qx7ٯxfę(/A3k&-6ɝtsR9y}bw% \W 1O2hÛ`op.]e`/AYڄ B%9(F;~qDYlOxZ.e6ķ3F\vRq <<*# B)dWJ(=ziR_ J]_,3z>@5m3@hna.7ނz944Ŭ/^-шWxE @ҨQ6~bvpeC29HÌ-nu-4~ 8J(wb^RK䌌 c7|rQ^ִGӌ͑J%- Q买7n]("غ%eE IxhM !MI E25W&BN|W}/G^S'Q{m@ :6B ~#?ƟkTJ1rɛՇ X6Fu"AF.XN\͈Ibkwur *sG Eb4؂WOtmerun6;@-l9Ԋ,0Dä^CW^+ -nnyX}a R8AuWr)B$Bb`1ae*BQ>BUβ\6eg)ޡz8?6}>kc\JCq LllT(:8,jN8Ъr&7O:ijk̯`ZɲQB@49>88!`@?Sҏl3x9W 4k AI `= XKjXvɶq(1cv͈XT/Q<]SOqnhSI翛0܌9; br$̧oNKH><#4-_N\i6rMCw n$1#3PPKe]{(HxdM(8uCj:zR)·2 ӗP FdXQjHKcy DubDGSg51B:q1v8,Ƕ< a\nC-+>P wa) QTѹnъ򀲣wA=I& J$e(L`GEܣF)9sE;L&Z}90g^gx;oIlc&GΞ9X os9]4>z38\nj67o/=g1*,c&z*Ls&!Sl-dG[(X䇂<̄2\ɗ$N%PE O1c:gPFւzd(qB']rmc B)$K[”g#@wzp#;[9}"|O ; e`[Ghd']*eVVz3 G8#Kfp ȵ i9{YW0"Ȫv=k3X P)ܥ&:]KCP:34 n4~:ݵgM)Ko 2')0~{{͟-yZTZ#"_wވ{ 0U䕷ъ@q*aux1bvZM Y]'+YAdtZ)ĚrcM=ڶD DK(AC`&BxCOniG; *OV3Pnab-VfQOFG}W\ݏIV &$yM%ΰ\ Ziec AȤ\x6],{v!#lU Q$ LC9f`0@A\%|Z!+7:k4 Di;4k@gXT.Ľy?`*tEՇn?cdExzs&0N#YgҺB9S ;P!i:Z&] }f[AyE pueṊYyQF' Kq+[6ū!=G>+`DŠq0j]~NyF>* *6~,j F|樊ƨ# LY[:ܭ1l< cw n>?Zz)@Heh6o=^oхUEmK&" ޒv_(O;X$Gl*|% kEIZL!08F8|1ufy0Q'ⲛ)>?NF?'MPPBhXWEށݻG5>Gbs2$}yl!-lа t `KeU9}ahӎJХ Q/?n^ 6=)d}Jʙ>>D'W;xu0gkեp qʵ)qg{A.t(%%5!;Roaf,Wox| F/l]8eB5a|$!Z 739> pw=ё梱v[o\sF({EvvnE׵?*e)F#=p?A}[f~7W9]1'`Jx;lk0?Hyۧ8!˘_xr`*[JE܈a<˹!CŲ*Y;B8rg]K҂WGOcQv6,8Zh6;{tW?  )OUIES}4r =%a:,ӈT/1o/#T K.g^gom"f(L y.e3 ^7`2hA1# :ӄBa;Ӕc7Wx!0Ւ*LBx"ߛ\490#ex[r!n,IX;*%DyQAtϿ{O''F9ݫ[@.>aݰBc?(ъ=iF 07 [E b?4 }׳-[Pfo"r@G"+m̍M̗?l,=h5T;OPN6brw2LےOOn |43foaV[CR"a[ǃeNy&g,Lۗ9O YJT ~G߲ʻiWP=l9cgWnwr>rt7*6`A[)~%8 ,琂G H+4k߄.c_ZlpI=r{=ΌQ; 2!z%@U} sto7.ǥ+ump#I` 300OZg1c<sru[|O0 *!sًD;Vb#z,(3n=V/}PcxEA B$kv@Tl]=$pV ΗIwBQ2DP9 J~HK6d&qnLVsf@ 1P)TLتy= t!(@Ɔ"3EHr !iA) E_/4db!̬:X9 w g^_E"uGa|HLf^9A~D_A!ί(8AɔP ix[Gx%=I뭁Y^~9hT#b-^7$xJƜ9t󑙻㐣89O{]Y\!OVO*f !DLC*JʤXE[E\87g/ #&-W=X>dO0p4k:chB$ =aUss$cƣ%՜ дW:s8 jzNMp 1[İ򲵅j)P,A/w4 3v0{ k4r엟ϫ%|LSF=[,9:3JM/}< `C+^lf!D{& t8ρ~+>)"#}'o_#ZW2[ |Pq<7t s5AilV;QE~M*1M@XEg`4m )#y1B4oDŲ)8DdvaV\MvaEQ'Lm) r];Y.A»(֞)p&2hu#9Q]+ 0#u}LJ݌hUm0O\6 !v)`iDc<[<\88&bVg MXa m߉-lpy!/VEY &Yt&A RU/ ԛoa1Y#VubN{k nG_![2!:l Rλp-\ۓuxa!Dض.ynH\] S/Ds֕SY25 EzJY8,sR d%y^6^m8!vex'%8tštc{W@s3j smshAg !"362Q?X,IiV4s@XK hݴ- q~ȺoEp"̃wS@}1SHΟ2 GܯV :_g轹/2>NFx 6J] j) u#dbǚ) ʮTIYR0}"pjU9F7,B5GMdl"cspOi3޺ouG@(&9MȮ OS4'1|qv (b3.3yF2,2b2D(V.ub,T vTzI  ͥU9Ty ߴO b)n@T](.x0@! UwDz9秦K[2`$gNkԢ61Xo ˆ( Fգ5Z18ġvb D+Y"$ʺjCS(fw#b7~>+Ru^HRO7"/AŅ6m^W?-[b}']l L Ȉ)3`BkeB=X7n2$%n(2:(Ĵm#B!_+3ޓpmΊ<;iU9Aj{*o=qGrDw GdEkV"m`DO!BTaQH-H$:f I_<0:]Mz&;ܹ\ZDbrNHX@&2-D-91<]b ZF~P7 ˹N,k0ɽ 6u)iS7@;'\x9,= 0- \bg%9XȄqǶAllzN&_ n?*tmYU񺟼K>,*]EW>b@c6!Q[Y;hlug~$Vs6FKA;w ܂RwƧkPҒ1X֞J(ḿ%l"U!s..g:W6@άmj8;E!,&ʬ-{j?I:\q]tkx ;/تbt<8 sthdt/5 P}m z~b$P޴5PG ʛ$F̈́}0+5<EVLY^aƒT\X< Kr &ak%*07CWwrz3f NY!;DZftQo :Pg%z{=sukڑ4ӑ230"dL2'U&/T#iWW@? &Ҩ#d 9ہT( `\PI )la_I b* NGs~%p]4?$_y6wv I'βuZ>HtJpQ|ֿO`g%$PFGO"TXM$Om?ݭ&xLEkS:UqoA mΈSvy8?E ӠoԷmm{8C$-Hlb9XY_*zyV9 tɧ#v0vU;&jJ}v$=m9T@( xDbJba$Lv!N!!u*(}hҔ#`61 q}Eh&THy8ShR)Wuȋ4fq?]3#BAߘ6ԮZbQ] h”wF/lIuzFdTvư`* g콻g'z=)%k2 Ry#c^/Hs, RCD< ЃτKTsUn[Os#,_jJ 3~y w[.hk15{WߔҞ,/ާ;O ŶN;]%Na%2~Y#$ w ӆ /agc@Kts6= ^ f#&U\> "8/0CK.0|rc_kUNE3&s |x C7$$Ie>\ t8?ԯ Shܪ@3dhz^ -iB4(@t2Ԑfj Vu Xm[2wc-'WLMBضm@.B*P~XWX>SKA,&(;)n鶐tc @z+:͕ Y$.p{Sk|tMJ@V ,!KeitܰHF:m訉hXig]mj`[B͘VK@1,y9(%K׽dVb(%L A.oR'~t%NP. T l,u=$d555r8?J6H1cӴ2n;{1Eؿ`M]8QC68#DŽ0ZV߆G"l@By Nĸ'd!H; 悀'XXP3BɅē5h1jSIV-bp?H2h-p12|Z~)8 juc9aC,"QwB@rUC!yEg2g^lt^ q=TlDe.Ɉ݆sT.ndlqBƚ铊b"l g[78 #&^\ C3Ucȩd|Au 6Z#S h&^(fL1) 9~'a dRk1=LwA{`rX*hČ+ӟTņT@^gp @6$;R K  Ej)C 4m>XhȂ`",@Lb88GXd茠p Pg? R(@槔cΐ!H)0a"h>z OpOrSeR}qY K@@ǁIBId*Dth Tx0" & 1%L;f@A9 i0S!A@М`XI$@'H>?P(aelteeworlds-0.6.2+dfsg/data/audio/vo_teefault_ninja-02.wv0000644000175000017500000007006412140200333021744 0ustar felixfelixwvpk,pVV~"WWWGHJVIe7g//_?kn>S?gǧdڻOG_ߒ|7T'}<3~wc $Z7fqO^Go9>,ՐZA[#M]|2oQ(QibSP/"Hd'{Ś 0J6:92+KK&Z%6I PW{`9+D 5*~(U4 Rxw:a ׀Rf+5 |)W5ͨS5?zF;F CpǪ]m6O<Cd*boVS SܥNqr|j>*B,Ǒ މپ\B$MNC 22[|BDAz9vo+*7!{|0 ]#P8D/a5PUEhW \_OO78H4 #d2Mq.37Tp %Kpۇ8d5mxl{ Ss87޵=b@0ql B(ՇR/|ٵ}wDD%_%o~SaqS)FNVO"OΙAHYk> #<]. GDNRa"^0 .7n{VgIL@~1 r7^L9 *ޟ{~ArLG9fvBW_)"ɏfĂbmEXBcc/е%7 ֵjvN6Rl8A`3%Fv{S٘0M;jFEy,~\xp g,j1c ^ʁ.A/ Q׮h$JOC(G?6HڊaGncSzu6҃UeVV^zdˆ7Mv6fR87.@ fl >kU)AhgZSש@J*(\eA9HaKKU(_t[3}>7~Ux:T bQЍS${׀02;,PE=wii%bf ,7\!upPPEoP% IfCQ5!&2N'mƵ|xP~D*~VNbgI*$! t#In#i?cεlSJk bqfGho,10l%a/ i*5^ל%d!UK Y|@7ڵb weS֠&hm%aF]WW݋QP [0Ռ;]_K /s>^`=IK%8'r ;vjXD|4[+ewh$GU=Ʌce"pE x=VM+ȓZM_sA^caM].lm= %Q LؘY]N0^N~sud;zg ^ij lbH&_YI#|buft7Z"U=Υh lK}];:%Ih_"1&#T҇Y M_hw 5mS^&[c+o(ӛS9O3ETaO—l%DI=wd=v s^ʱGOb:"0A/F7ʜ.)){]jP1SgɎ`!K> X϶ϊ, _H[[H +Nf0aJXC9sQd#:-W txoGȍr${ߙƢm2CldY ;zY$B*ÏGD$+5]8%m&]Fr] P NfTj"IVצ󨌍40ύK\e Z^-čMg¼ȟ9+ L򵐮q 8MNdLpEMlsd*i'z@LUiw g>ڑk) 4%3 .m@ߺJ$l{:[tONS lD|-grcE #f\:)5 ^X4I%?!0d (UVMUN&o;R;m7p}Oٸ 5Z0YďW/UB\ @X.MVv9*\-6_Hӻ{/rHdA&(0yj ]s-uGۉadu'Ne"lPC.!ڋ{H ? 82$u&!&Grr2hH'$y3fgmEJz̪Jd@wh D-o[^gOu8gCCb_|]WH== y難}ܙe3-WڝN4+Ea0g([ҥWhѡ|}c[|[$P#Q,cp8UǕBtGf#:"8^\BD4ۙδu!8{H߫rm]DZ#3j,)s% c#^h= }f{2>CV}IɡQ}Al7\ 9y{g`{}'ψ]5tT0$ jJCh$mlq;2_IY4,;@g9W_l [@]"bo6G4۵;6kK.}4bcCQuYSFxWZ-87 DJc5Mޭ%o@|ꌘ43 Uw.ﲰU&33ubq5(Z~ ѿ o|[KY5/7Z>,8KS`X^zzD{"@@CК)ky ċt2%z Ity\C6::,?9y|WO k 9"W_:$TM/Sm/jr;۴iJ_zJW Gy]$}Sn7 %fҶIdY9@iph-f HRSÈ(5hWpܼy╞64Eax!XIS-Ӣ3u%׽BW⪑ҎcJw.'ԛӧc䟳@Of Ai~߫j:16~k*? awE,)v?MEMsT6K48ꦔ':%?AxDM.p5 Ɍu>J/b\= g@A/E"$HGkXFL#>648& ^fnol;p5:s;__Jѝ /sN~}T)^ +0I2oںB{gnUiyi ג:Ҭ/꿌7\̬}lz-]Ԑ(SvФoR=踴;[χܮ2c&Nm_"=0^pœPƗ߁HG:C_3&6_=)@͚,t]ܲHaW D&K%^X ָr`*MbST(Zag+ş%ihcCǃY<dK "جL!PX{f <ґŰm4YQ"4,?BoC}plD?qvSBX=+-QWɣR>cUUӏiSԢ?C>$wД[Ƨ2,zq+~HQ_l´)bȯ>ǝ9M49Id" ?/}yX,ZdMAemѝ{95i/'~_u>J͞;wU̅ǣ d `0 xW.G z]*2ز`ѼFNd+&X &oW&$5\z9>Պ 'l1'o(µ8bTj/5hA>5We%𽪚s77 D_T5F0[ud 5M0CL+oG롶2SA?,ǺsB{0 Z—g<ӨPeg)J`UMRO?W# W_M˯iLj0&]4uLnoNECio2qw8;0F`Y!m.73{cC>NF]P"W/IA:^)Dt#k./W;q14vovi,cu}u}He Zobmy} $mKW%٣bVZ.U1G@7%e(\(N}AJ9]7l+.(GCA61h-*ᷛ(``mӾ?N[էO(_mIaK?_^fd ~] ?Ȩ һfr逍{BaF@lZ铺vٴ"~q57-^+{[th] Svtx#cWHOa`e0Rֈ2"A? &I yXC&kov`Es9hĠ=p 9&(k}?'`DчDL;9^N3w-/鏤 ]J _J6WϚix茇Sx4W;^GPúa`*Sq\/Sbx b$t$Xނbt8RP8:wf疩I>2a"ÚeuAŦr}is\`˪samTkIӻXRYdsڲv7x5Vä̩w0Afקݓ0:iZUIJOlz#%!V^#; HY+OMgʮ:IVrD_(BqxgJxQ8m&.4I+$ҝNM s="Nۉݤ$lwlj=\b=) O哶;DK=%CR>$.(9%!؇P.%# oh3YeXwХ\b pia/9$y\5.kf^FPX"IFʚ5\w4gd%0M%u}Ϣӭ>G ٚ#8,>rnA$ _eҖ%H>&m~3ԡ/spUu1זw|uTD5?1ag|y1F(o2PY 䑀SC֞,ϦɑF,fE_6֣ .=pNWlsp6^  ?\ /]p}T~)iH7Uy9;Kc{ܾ7J|mmy`HԫرX~p <ǃPX9q%sŠhwfȞ DEPzCA0*Sf L\񏔀r4|^ņ9ZK4Njb"D[x7k(O6?_Fd (?PňI W ɿ玘 E10{dgLSz .,VU%A!,ۿbInxx.$ˆ)88dA֐AWRxFt򼋖TDnYyj$AXķj p9<,J 7 {akΏRl^h(2m%SMl)s\)"(fŀwJ;zs:={/>,~crE/o~4psȭ_[qFWN2fKiT40Yjk9N\Ï]\|澗계A_5S)ᣘg؁J'HWFm,K54N#X|R_#TzI ,`1d1RoC.Ƃ};j録gɩGA*t Kq썄}vѝ=qpl5avbrI!SniZ<y{)*: >4sgQ>6?~}mCɶ߮+7溏-WABzj$ۇL [} #ccw˸/P%[q:{` }$4]گ1 %l+J:GIS/T|F^ǀHz~J[UOo`]xAYx+˯5,Ñ@q[0xp=ca NÂ)C?vMt6d{+/Hiх \T\$y a(AWž2ߧ3O (6x(Ol}zB] waV@ CF0e^? }4xy8G1d-9~fT3󘖰f Dn 41zȞ㽧U +JkIxD:܄QыGvzrث߄Z2lm XM7 FqMs{t4Ӻ,-kg 2K^#)qn2D82L u\aί@˛ br]?ZPJcA±^4"*A?S"Bэqhz\Vph؂z:*~` iĊ[>+y e{'&;j݉}:x* 㥿%,.M/@=EU:MIe,:&}?ӔƆOO8QrIJdp}NZf1]Z>Y[]>ځ84Ft]+MCr{ceXԣ˯[VPW ^l [#֤x!0:>1(xqzkV;t"o17=&%, (=( >(*zycImѰ]%xׂ+D3']٢pX _9 h/R7^^e8tҳ%^ ]X@麎^Fc^y.tP [=|ߐn z a.i 6}+TQPߥH$m  >C6?G~#HIFDEr,v=32-.%)S|)9OKlSgpxrL?Nv$X޲SǸY(_vW Dtn lΨ)- [ i.)a3p5Xxٖ@~C&xЈ^ExtAGJ*K<6/cjVmeߏ̐3`ȧ.l\οjd L@ͽr\ z [@b#E:1W3a9fij:0[5qǟ3˫T% 21>%p}YSs3V7 '?#y;*K<[,>vNCGf >UV/ v#Gz(éE0L!4&4rxp. nݜhFh"}#OaKvx瞛 5c["{jHf,;Cb_uB!QI8JPZ+pюy4ylVL+8%L `2q_6?C"XyM̈oxDЪf@֏Xȸ V0kJ Y<"oJ~3(욚޶ r4]ӭ*XQAfH8ܧc1Xnkt݉,釽1m}k}eؔx`$k0i ҵR}VrƣE >gZĽ%Nv7\e߉ ܍;wFU8%FW@i{@햛pxA)__W퉇q_#d/iP\\ŌSMC {6'pFW@ mD6=L< -˽fܼOxcCֱ RG Q%0Vr $YNû~e5-@9nY;2?8VD]X@5ByRU1Dm1h 6O^۴I2(2ސ i[y=r2"-vPb-)(==D?P٤nѩmŞz0D2Y@|hfRY#vMg ^d z)FI  M3rM!Uos4Vq4y O2wgSM^,A` ćF~P|ts5Nc 071{0J|ȿ0 20HIH w3O+<xB}- U<.=9.G8$b^.UCWR!,((aok\o/sXf&Ov˽6wwwzP1ĪdЖ>&ډktNI IA^M 6r~|l{.*_)ȥv AaJ1TW%V(s/Nec; c3ryi%`&e=)S RȤitX9uu]8Ee9BaqDM,Ul/7l=Ѷtj]U]sUq8_~&)eW5nr`foxv+A(Up˨FViQC0JTK _bM;yGO)B OfdQo嚫,1i8뛶[Z:hϕ5>(i&^~#[Zk1[ lPbL zXXTy{V1IԹ:=hJ'_ 36 P}OJ[=\w"g"g@HoȷF 7엘Rܘ|fb" (3?/_Xy+)2!gTGDy)W_g)(oVh7o83&@swe=mVW\,D~LciT< OI/_OX~ q!f( /"*1b¾D hi|h7~EL{Lt?fDG(?ҦE3 ɇs9TuEߢ\1$ŵn>HW+lVG$&45K'bGn"NB$"9*|3щ)9O?yR^Hy^C@Ӏ'e/K++KnnF'i?Sڿ`r4li ޺F HEK䔙X_}՚iV sbBH6\9;[j.xY;5ScqB W|af5~n +y@]qd2&@1EQ{Ϟ]D t߁Z?:2Ǵԣjc mEVBT(I4R;M UZ6o*5~Ď|5"@o3- Oo֗V pĿ%n@&TXA*9;F6n5݅j{ͼH[fszTk/lK]F #kW.$~8#NO׆ѶCk*%1dg\8sPs5>+K"hє"vi˱-z8d on槙8U"ThQ<ۋ_ r2"{I3[7svzKtсϯ` 1I@On!47ŚkgbeQ6QWBR:I1 dVG<(5Čt+vM!vYO̎ CȺ~z;2{Ivkn7x3wV\4b‡$3.7mqu|@s>: ( gg9G;45*oW q ࢃvdw6 //CZnC>-=HֺT9bNVH6$Y2 Opѵhfc@zaF?9[y3iKIc%0bQN~Mh4R%a"c$dQ&?PmUA֚|ǡsXw sqm g$.PD/J v&V댪1V%f f%w͹ IujvΨ`p#T*:G<*ńn>{g$'5:K|-ZcԹM,"X>}5--y\0%1s4dرkfQE&$! Bg.Fa݂ 0pXtCxFIJi rr ̘"}+;aI \;(֡`xBj{_ȧڵg2ISd/2U$2 vҸYXW2RM J@έp;t6{]&> cd%9Sؕ+[ k=Դ\F#7~#)}i'+ :Q/"ɺ'bH6#B>:v VǪ-+^n, /'1y%`YCIęy()|'>'<ϷC$UYoCr\4D~/SP춓Jb84(¯fT~=43X%WNΦ8U3Qvu`WҰcO{wI`&UEɈ -?x~ KteJĜY; kЄ})hNT˓eED JJuV%}[6!˪GɝC+r>|od`~+3^}xW4@fHbzQO0SW,ӝ[Sl1 A+4Oۖw]$LL29l=ʺg_8c>1CU=h}D.g'q{8p Xe֛w7x9L_/&Czb{_kil,xEK]^ {bK{P#$}/ox$L(vocON*hrڌmMwuСKv)fH]lΡI.O+G4Q,$:{ v+_}&&|ΐYۓѭ,,ڛp En$HDVÌk oG*L~oXyv})e ǑWIuya]dg\=tA7lpk 2QדwtЩ'ksAiڶ0y=ӇDt\匨PVw !:s)q1<nI!_㷤}HKn(Kip 41*)`NZ}rQ]e^_}.T'QTt&8/,70<q."{{ޕFpVejKޝD=D?<wruLj J%g\țFEz 7DcExUD m?L?ءpѕ߆cjYU= [06j0}٬c2.nhfdx!AqXB(0KMkr6*MFe78 Ot%,ju?Ap{ZϼJJ<֣s>[p*o1}d*E[W okQ\L~!Y9/O;^;XۖvqNC֮N,l/n R،#ԕHIpg -Ɲ}z-ҭ69 g a遇݇J.C!Z/i>ueYt5$(^L`]R߈ 3J!7l]?e6Py!f?nnNnN4A7o*Dz~:P z]c\q(N|eDd̜>;s>+nWQ(|= K>"aRs)6XqYx%-m!>Q&N>L@[aK[(M%B];'!⅝i\KƘ2G*];oσy Vn1 2`&m~^j͜ o\Uv 5IRR(Ehg7@:}ڬ0m !h6!% ٺQYT ?c 9o}ѡPFO Q5u 7 F]jܫ=2ȑ,GNTWTBzZqwC.W/%&32 @hܩU?P1\xQE9ujJ~wfALo:]a,B&^ a$P !IJHx4}Os =NQ.g_^y8T^Ck#dLMy=/Zڳ_ڽwQ=mo5W0"O\Tsϴ+c/T8q X'B_HDc_A3ATkөB2ٳdC=D Wd<PzV0Et˗T{3:'r+? ,Y K~mjFc ɭJjS>[.0,@< nhcqiW'-I/I4μN"F4;l;0!}zE\,P$OC܂!.l4gb@>[GgTE(T4 _{ )_W@g&۟<+lÌ[I|CE{aɥHoWf141! 9 cftGn/@l1~ԉu0նE&1AV һ?xsk`*0+H.s0$2w<-펪qR&нwras *=$K-B Ÿ0 ]rI4 z?O{^ѢgXru_ZN-Vc/ELfr \؀7iPp87RҶ,Qc3bõS@7$l5!7hwh6J'ŷMjZxrhFd>%{1ؑgBo$ή{~Tu(3;;W4^xj_H!hl(8M&Ҿ'ouz[hU#\Rڔ0;FvPǹp8ֻ愐N7EȖpMueY6):vռ$B`FjURy[H=?T An5]'?ʍKubnzɯH;}IϷK]X&;?Vσbz%eӪG`_S2 Cқ-< *VK2>ʭ&MB0Rj נUGnLt_6*SB= Ю߃_.a\ mG~ /̀<}I47-m42',ۯoBlL<xkV@Di-@rAۂR}~a>ú̓&i+~z)[a!}r)-JXa@c"Qm^#A+`El;u77@n/ܮX 4U]on,Hi'uȻ3.JW,ISfbo#t"2q$ Xz1}2!QUl" S OH5.Efd֐m^(0 h"ػODP[r:vWCkR͏ܚO-\))8ȳԪsֻ d]"-<5"~JLH}DVNӜY2ȝ4&A&-HDa  OL4a1c>Y_8{0|z[udn+Rܬ4ӽQX8BA[jI"8|rFrCjwx[ñ ! @Ņ}P{Y[p꟔=]V,pVg e7CR{Za9t!wX)PM._va5EV.BD|rK=M.elц=}/y|u?E#T^I>\/UJtJG7>oHx^V0& 6 JZ1܊ y,U˳{(4+n}fMSQ{daIEWJ%*Ǒk$\8 eS &DXvEeܦך]bs KH,'Yʐ5W /0 uۏ"ԕc i+0zk8yWϖY\ =(߹j=f0+!/0]8Uƃ>,8V"NnPlQaI7犑K0D&+tT~(AXďk ?RZ;/|X({2شj$EzH *b5gk u#j%ޞb%sVde [r-2.b NR.-,&:M 7.M^J~Jy㟣<L<^HsY杰dݴ胝i[&g'DmX"<ˁ)s(r IA*FD/;Sb"f`> ,^-#Lt/;B:n~InZEܑr{ywё?wM'5MO*/RNRe40\ >[K…2>&^2"L|>swtx~V9ӂc àAh] Xꯛ (ZC.&3/lsg羶5DˣO_ @}? p>/;cSr8p֎w} gC]n`7|R4OEMR\MQț&)T&;1|/f)Y3 f!zT驋 VsB7UJo9vmBQ,NspԺm98d}V+Y`+Ճ(sjm%w1G!HbS!|"m||Ӈrg2"h?Rs^9^+4jw"yMrAap8a+XكO4ΣC?`9 ^~ 4S>zɠb;q(.z'O,ߢ2gnԟ Dr1_p;w{|(!*vPF qV :.x4Zv7=Ib- G0@NQZ `7EPJ_v/_ T*+/cw!f6)U"@Rܤq5޹# \Y$z늮22+S&b~k WF QZu$V]p=:hI&A_7NTy* nwYٴ<`$Hf#UUS>R"LCzw4&< [)Xٜ[s {<Q??XNHC U>+Rvpbމ{uzj Z~b`a6ȧ9SuqA #thNn)j,ºSo*ɝ>:>/ b]j0K ߖӥď8ʟwLdBlBv,a\(o8hԀ{n+WDKrZ_LJJIȹ+짣Z#3S=8>|"_*þF䜻Nη+0ԌHk94M)O"9s#rM#CDb^\:- EFV(8pFt^ؓ3 w4IrӍbY<| YUo²jN.WF+6bGm7+zKo I0}bf}Ja˺r'n=l6a@T#76; G%I%yWQs& $RBx#62wL~wh_nJ}K5*픳Nú, h=މ;Ê:=S\)\ln5KY )eNq,[8B6)=di/O$O~G.q0EdM jd &+fMƲ1snk(!-CLt9ONy&86) xM_ =x06[NL"q򍞋1Kg1lW$"k%Bum;bO.~jqG|\\6LĜ×A?E0i-lxtwy'O?XA!H\zh0IgU#kOBBcL2\:-oV. 2X ma1ٜ[f6q=!Yg/\.Q8KbjE9}-='IHKl7=%XGȄ@cA'jۓNE'SaYڤ"!"8ozr+Cܺ Q D+;Ou$ "_ =#OK1D m爢~h7}\ PMJt0KY %bG5ݹ?fӊ539ξjwЂc Ƈ*06R\ɔ TH$%Ɍ(f(xzظ=hNQotT,%]OJ? ̝jCr нo ZT13xߟRЕ{6,$^Chޟarqyf?LT=+փ˄-X^Hw@RLb2}v2}ְ5Ƀ;tpHhŷ=NsRt>1RPM\חDcRW_<@?G{r~I\MBo( NQuBjsԙȭ]C[>)jJyty_jW< TT()sэ8tρ7QR3-yI}jX&!sl(p1KOv*&&$<֩fvF+} /*٤ bՀZ>|)Əa%90FB{聻9{0C8m2w$X,gIT$t(cx/~a@'z!/9pN.ػcaG%X2Pz |қ ߑ.E iW^5>$(7سBh0h%}ka3cUW4Y}l{%fK!J#:OUWhCќ5VxWyYn/ONN#@~G)aVǵ9@$[PE"搎)(Q - 519>Xltb9vyXx=屔8=ȗ腓>\Ȥp[n\\ diz%M})ɡo|E\s?\1ǼWۧ(NunX5:vxBS[NN9sm#dld}ՊHlIHdjaVNr0m^ުJ/x⾰؁'r2Pz}?CT&6)Q[B$n8jyDઠ]V d-;Fņzk+59\@>Z[KHPfP0q10cDBy^n'~.z/TTA:s㸔L? sc_nS$ic1{jWA0i+r []:IWچ& 'rel= MJ&9( C>ۦw5[#81ӷFñ(w5[ac6X!fu}JSۀ ]X r&O}ALcWtIX!⾦y1Hg; r_TrsufA)._\Cp:}Xd~u?7߾8Ӝ쓞Yhsh 64بBd8d)1|s"@y~@ntAGwM' IU.= 5ġ h0A,#!~!&4-KrkJ9*-M]M+,(MBjg<]l,t1S1UG`%$9L`MvUX xDIb$n,!2xHO`CG KoQ))U` 2dNcVPv "e Bj2?_ )Dfʵ$bgŧ+Ɵ_2+W䲣1$)D‚ DtAjds3h{޺tV9bnsvp dPP*Ġxz]A`4cA 1%U+=pр:ADj&LJÐâwsv 9 S %Am"D 6؀B f M- N\wހS)Rar"˹ {"u3i{[1Dy&>U Q.kl*Л2l=]Dygrȼt}yKDu!o0@a%\&WKXnKd-(R-=Ȥi,RH*2'l!0G;AOS0mT虅2v&7n;?E0R0#24/oj;B̻**(lq*Ύ 2Nchbַ¥M.I* h?vS ېW)`n9Q~wBSgwnP%7EU4.ZǬcKQEFQFпBoX zhI4yWMv 3Jʂ!*16 ؔlKu$+E {@O0ti L!(teeworlds-0.6.2+dfsg/data/audio/vo_teefault_ninja-03.wv0000644000175000017500000004115012140200333021737 0ustar felixfelixwvpk`BiTiTWWWGHJVIe!ߜ?w/m.O_|͙L+>R~֮Y6D@t` B\`IJ3FΌ `)l*ahmdD9BO%  P`JR ɂK=uh uyDJ^D)SGPX4d}XIMf ?F0IbX&ATQI1T.d@0M]d@Q~X)=Jst/q<0@K; `1B8d "P:=@@& 4s\ 8xLF>(:d@Nǥ0f8p:=|P:xl\dzCk; k @DUQ` E>1NMLo0/]_@tw_NޏDd!]0 IF73^KZɧba 6 2SGShzNg{:50gᐓ] ["V؃AM# Ly`> cS}e9H!I99ԘU!@$ "(*Xr#EOf쪴>~S__/YDCJoX4XSCF#($F_H 4_ɜ]~#*LztI+%A@]mx 0`ܩ@G_\%@p7MM IEA4PȒ]T/6$RG:~kEةpY=M\/xDITF*HLCj5 &Lj0?VQNY +/8xHOkt %h^ׂsJa,CJ4sѵp@DMlA=ZbmMb> p_˲eܣb73a"W[&z(oׂʽѢ|aD]\o;w~u0,TUJ(+( 9%<fkNC}=o9s#[`>AWkOB(+Ul@`:(Dfm3Ik(~"m[vN~^~="wѭtE\Z,uf (u9Nt4NBaI =p d96"CXه\zh|HvGĘ]HX[JÖl_)B{/nܶ"kΞuvLAfPHKwzJԗR_ ~+@BT;f쿩ޝ `?7z"I&pǨI!81; C#>}ы9O;?J=wd'T*`7mc?jJz2wT+CS & uz+~㩨voY~IT}ݩĀ/ꎟQGrECal(&!oA=8G{]'GWdߥ[S=T>,׳p|61A Rbŀ73!)RMP0Z0 ?64AIDpV)wmE()ʉ_ZvG"Feػ-P'tכ8V{0iS 킧x6u~v:GC@ul)BR jɇQ|lV4/o|/a:tI,UjWų2f ;]F8f)сI#D%YTM12_u+*>_̤21 ӡ[!uT.cfr1f+ zg5Dg<_ϸJp7SM?`\–u,})`jUjRA135΅1)ð{}qŲ̋e#KSj" f`ś ҅'̶ p8Z/)@%@\Hj!-zi}/&z[#73x H }p sLb敡@I5&4$+-P]?1- qAu=8$jm"Li,VO2 $TǨ%p̍IK}+=Ĺ<.`D J k@M.a$D17Ru"H* 7\젼Yh9 Bjk@k'ژKB8I<"/d.,]!Ps:bڛwe!/ۢC5]Ϝ.uj4-Px` cQYM!TcJ(mb ԑ" ®c՞;((U%R{V`&it":, %"#|J>b < eX@ TjrR>__+Ze۹f6Ź1j6|KG+N uqM76+ZPBKA|OU /o;OcZ(zx;J։B*'cvdfVCϠ BrAMp͙Ԟ$ tuњ;b-e77J'HSXa 4`QŴWM[8/z-q|e'e) ? "\#ȥEI{ALHaJ`:ʠ&l}KөO(/5'JMIGIZ m;w`|~,h@[i8dNVelAGt#|PPf yl7$^`3xI4>b-_.%E>Y8UQI5$f@ l jÌ;:/QL㼓&F_I K0|','YUU?zs PvV+@sHx=s_BYΝ`LhTO@Ab iq"aO7@̉a 16^hh7->;}˧\i4!}>e%C4=W9d<6V!9qP\(Bw!xM.9_~50d w\9JIct|OL,V݅)Yi k%c;xMK%J!R)56t8nO8i!^0*CakT.c۬~lZy}v cfK_$Zn ">M,D"yi NRL&5RIMP_&=ުcXkt9;§Bc`T0BWҤ#4z˵Z4['ldU$S-Ԡa ~d4* e!Y PASy#d`Zxƒo(acs ;gۥB1$X-@_,nݷ Rq_b̄Z%kqɍI1Kaj6X2I9TkLI%yr0!!ѐQc@E Q~;`q#rcrKeaeTPWe,3mz"ɉnf{b\2M AKbLhCwabИSc%\Or0xO1~R"nP2 .Pڐ8|,K7J¯vf=|SiIѡ,!a `A`R (wg0[lM1dOpw?tԢΡpb @y΢n,˲ 0@wZ$>Itb<7g"ƊϽ#'-ALfK()F-PLQF@0'%;F_HPD >SJxDUVF8rUtDV[g.ymз RPƫd\*y(*=+8>^Syi;?,s", 5P3wxI[+ݳB7s< @"Mg\7#ίoF!5`ҍ\ִwP0e,\Q44!ofqOON9EŞzr)..Mh9)r{4+` R/b-.7iۂi渤sEzGVXxqH4Er'O xDYUAÄErW%P1WmAidqVZ`*MN:i/fh-v/ opG򓄧O7vtlA^yCiP%qYITSRcx?[Nmq2u (@>`e=j?YeO `NwK\#Q YCkk?,v24SbPR| },qg/r7_m ذ5~T f:tnq@|.%5J)E$Xِ궤6VBq%q<G=(biYFPeWhBg=AkXr70cQq0`le/fʗQ\,ayjGWB SH d@nv8A1fVt0~K?,w=v3xIu6HP 9>TΓ Tn@1m ՃP6ݛ6W fSѥq6i.62" HPմaBQ E(.[znW\>{FL8vS`E]Q!(_2N8iPJa1 s"s2mIBAye;n`opEk V+Ry8 *&9QC=lo;͗4! `C#vJ$z\w4[\.Q,y"jq;Aػ H@ۮA^kI0bώ6:1TDU3"OTV5 )iHFܞs |;Gթu[EFe9ՅXݮQ^)4F +1TN<G<n Sl*@Q=4XhzK.ٽf$@+IQ[9)N ;0m$l nR:v7,G1f7ޕ?_Nf:–DD"d1ΠYd9ѲydD$,ЄQX@W~_qԚR'QNPfB<(B7 -R 4.Y ,d{xJLcU `V:IC vHg@k,] ^/z1۞H+IG0`#rgG] B>MryCoXcV%d64GB&Bmƀ`;AspxAz>umuBtM*dKsԻcV`5$HY_yvVWH7JӬ_#5&QO"|gp5V÷u@TMm ÛrgU 4v簽 ňek"Q{6 ߸b n/gLY=pf$b:2!#$('" ̢Ӂ@iZI( 䥃LR|üܬՀp.07&KX ќx 83Xʛ !V9E+{\uD6dA @_fv/ +cdc)Y/*BD0 ݌ƸCG t%~pP.Nwj(ãCpۊgx1SbPL3J=Kd9:i~ /.oe- @@ cvaDŽT>J8{(fA wqJFGNk6Y:bd'^؁̓ #> SnqRk!j^:TF0B&Lҽ`L"ޓ+tUTR8>uU/cix$NpoJف0S<%0|1_r@c*E;+B?ˇ3hZ@Ў?垷M@HuKvK]F|BI}KC/qGSGKdHGs?y_e7#mR7sP_P0ϧB(ZN Z>ѽ~wI2>MD`AEֺMGK3\RB[[5"}8qD- f[.yo˹"҃u:й*[|IhU1:o!a%,jl)GMC$dsQYSe`t t"'d 7@d/Ԁ`L)ѴbZyBg>8D*/ksi`l),n+Bd37ʸZ1P[(*t^ _}S5UV`j㇔.Z(7[NP_Zae9E@Lа_霹?~s*G8X&r|H,Ѕ@A߈J \> ʻiϞK{ǧe0; hբ19"s djEhϚK>upk84b! C ڧꎼ2OgWsKOJt0T:xV}pҝN=NXo}6JhN ,ţs@v.$}`Qg~'LnO'Iw ZR`c|$I7kp4_s +VrV$"Hp2~c IǜJ-X@pEPgguz('{Fcߙ-ygV XY .w&'a_$v+eZa,aq#zEW5s骣ś`YSۋ'x$d%ew}j^齍͟W_ȍ^b n Po4N9?K?ؤ?^[%5Ӧ(ҔvDS@oi )\_Frgf 98k}b1ȢwvAB[9!^U|:HFuڹ~0~=罆~ѷW]A^Y?6eb/`d.‡+e}OBkv#W@LZ@Mg%$pvC_ӟ r}2^ ʷAapeP8 ^E:;ݬ>.SaEBqp1HqiI W3GymYH :\wtCi@C\oEկ}7_(V\DUT>m}`ٷĹGn4:mPhJxk-ۯ^|nF=ZA )\@ fjXql>muEhⶫYbIx,3M6b⏃\>PȟQv#N] "|W⁌: /p~;+}R# SfG rQ- Uu#i e>FZBYM9㺖g%s:΢-?"S{7LEƙ9jr}`'`q F-3VY;??; z_㢈eyߴ:&Rz)ȑQVUF ~, FwyL09WtA2MAu`÷4iwe(dT XmQ߃0R$f54ͬ^cɕ[B]I4^9sM;Q}Ցiu#OWUB\ER:wk!sKl(n bU,]#0U;K[Lša&buSm__ *·}Icny@ N'Q*=#4j&'_y5Y^Iqv/한OD8ozjj(7icU4?a1*J+;F׉nLn1l5bXW}7W[_-Bm:OgNB Sja7226Vf3f&w3x>#W(D zp 7_CO…jVR- lbT1Id*d`E]%iqP%NHU]\ )R^βJ " p5R ) ZOїpx gOd~)r|wiur=="G3>y'淫^/2􌜏iBNԻ,# 駨sjiZ${Tѫ%@6i-{DNf+ L{iF0S#YAzk4\ }ĀP/gxsPiDY,`(8EU.ACkvU">8CFp-1$UI>)M$Uڮnz3?{ptړb%͐v i8u`59_@ZC9}|61n.?q bE($s |-(ȱRE6K\Ћ_n (o$2 _@w.'aQQO X2, OУ0keʸ{2T:]td0EO6=\hr^%8":3\reF5 c?O ^w~^o*3! chQ43HII <ʅb d4UѭѮGn4!y]"YK)voI(ݱ RS D"t3+Mʆ%5"Zy($Cƈ ʹRr)6[㠞ъI0kLge=I0 bIbvaz?DOazvI /Qx8wuKs?drG3UcѨV-iuiV$=9 ' 9코p_ՋL(cBeU+rPJČQ$EDh]CM!Ҙ&=s(n3`jʗmo3*\MpUx I.֌┴k -hBBFʐ"sFR dы֚qz"2v8He5dyPg[oO });u{ǟLP.T [K:S0k_@'eO~=U4tIsya\স79/Xm/V@ʴ FCg1& LJ,x$&C,Wظ߂=/w Xj|ݿ\"4Q> fp!F]Mczר>~{d#usG[_ ϛeP\kqdss90=7o+?ѳ` zc NC5W8>,z˺'bT_ 3짖?hF z4rð\QYD; VqWJLz0&V1k~< $Hz:DdK>>8!:39KɽzS~s>JoCd&Ó`0ChaK},OQ>Dg63i- Udhn^q"[ڻZgGt:k}!tiU^R xٔ"pvkUD:*`x + SL9'wt[t9 0WtK Te5Xi xj[vc|g֡L+nCĢ:, Db]aK2x%v ܧ_V_'5B3u9O6%'a,{d5*J>ڤXiSƗu6DL$4n'_ǃҒ"kGټPܿWףL}x*Y=7E}dHjm:-g+XVt&qO6-_ˆ'.h]Fu;YYzhT{j_#qJ%aBUS1L`r4C2i☷"i LpPG,̹\*HfLWv"_^ttjs9A ddb(11nJ!4)LdJ av/`Sb׻{Ih!(?D Y8O*nղf=s҉%jT}[x"(ރeRT(˻8 UuYL 8 X!^.}Hd0>w.qxe?07gҨ?x^t|)?,6&xyg9 0f唬Qfiv[ I ݔ K Q Ѳ K.7>Whl):pv\Įرt ,2Cx܄_g#e n AUGad,t `Q_ שӲ3z:, x%F bf4V,!2F " xJ GkVgFcV1gkEP.+;R6KTk.9T7.jm> Pi|'jq<݈Q1ba{HҢɄmU`(!fa^ eJ5w_\6e RR%6O,&8v)x`H,: WV!΁sDᨙ:oJ2ls{ [eW7|?j .T:G1n˭Q-)Jv%7 <<Kt(f$ p)^`Ψuh 3NH;jA#ccK{lիZO~X>wฺ@@p)K<Ɂ7y@ RISBJ!25"&?Y''q;\*9YޕBNCJ \~f; 'a_x|'i+ZwVE: k35QoG\ei,TLΣ0_(Y=Vky@QFop]WB- Xf :~Ÿ_(X3y.Ts"T3Ccj^| ߛ!(~ǀ?zvlA`"灒capQ6N2y6/@͒DN:2oajlWu9r?C6 pM7+DŽR6, SH0aH {. ѡ!DL YןK?55T_ ;RXtB~ʁL! ?NlFT9<@y6 wr*V&3WLvF/]U "'y!JԒDeMh rBhI_C4MO0 !O9hxy?A; #-S <`2!2?³D*y.|X{㒂+u$"oZ ~( c zEiU1"cN$U /Ӧ˛$es |g@z#K|ҩ̄3OJOUZá`@S-@ Nж*fr>JyX&ŘhJ|r45E#ޖw^`4 d֪a1 XUT9Jig[5iJH :BTM+<!{8:wВb:^C@v .GtCtKn:ùdT| ꢰş*4~̠q&1W`׈5r\g((Y{NQ{{V0S֎Ѱ(PLDݥl =(*f^D tU{ڋ$VL!MFhΙm&"~.> lw_`(KUQ)j5l6\pviG~LOWЋy\0F()n6@:d֍7( )#~60Pe^#н))¦DJlJ8NۗJ%y2'^,@MQ]@5b "aC0k$^DңK/'Lɇ.g-@CBH?筞BW0Ps;rh5QH㐭":|Nz 5IS:@`Q`ѱB<EɧQ><{h,G=B0P<$c Qhpgӈ 0` > E5"$8Td'@hO sǣ4"\Or($!}M$:>Xix tSA@ǝ# M`@S0LAH!PyFTH0 1$ a~>8! NT^:h 5P (GPsa@csx+LOa10xh00 @O L`cg vI)< \g߯ǩ jx*0c `OBjhhteeworlds-0.6.2+dfsg/data/audio/vo_teefault_ninja-04.wv0000644000175000017500000003263012140200333021743 0ustar felixfelixwvpk5::WWWGHJVIeZ*ur9Q9Hy^Seh 'VΦNQ( w̸[Ɔ2-I?8P_OWQaIo h-=O_܇ AKpWtYLu,rF3\ tw$Ybd`/qY05gzLA>|iZdC:f4H eZva>?q%]йg8]VVUjr|3xe @RGϿGrؖ<ikLT_CP\= 0_qB0Ӭ_3 O T[x+,waD <469"Em>lFC&С, 5JL<*qglΌEQA C&kꔷFf |PGBW'u;a$;iGrE /4Uw+7‚^P>tWLC C|%>[XD 'KSU!Փbaxn8]}+QOӿȃ, qO!_̀;hVrM<-NR)x6fEQ7%㟱vڱ)ښ@v(I rN?XU\/Cc(JUA-1HYƞ8j/mjE/?"8dqOs+b=%d1Pd,./W\TKLI>"Q" LmDo+6ZDbPyj-APUPl|d%fG cᑷ$|146zl~-FTw^QIz+PƋ'ly]u8}ՁN$FtB,ᗤ&roQcG%LN:b.RZH]8J8)PPba/^9 pذlKSAY]# 4NhHE k1U n$Z7-z(35˗ah=EBpL\8+N5!HW5#QuRѾ+~z ;̓$iOށҟtwC ,)w|d˘_'ֵT"kHBkt-6!NEI8*#4ZK,›Е/b1(mO`X\:+bl3'Q~0̢m `۴~ʛIkğO&^N>.RnBD,6rR֚p|dX\CV>rM<`rZ4'Ljڒ2J !2qicsxqY7{Dzhp[a,!E &3$7ɋ2ۯf+6jXz!e܍zڔޣH$ˉd~Ow7S8"e. O?1l>Yz&MԮm{|t`°h.bBF×tg)ƈFѤJEey`-T%i&f蝉n=a<`D? \jȖ+ $'&OAVۂM)!J<=NVxq t[f2JaX9!Z"r {hQ-GcZzHcȩϑ)C&ȟ!ɋOZ$n`&|Ce0/O3 (4>N,7IA-jv$2pB.2pGKԲQZwC0  @I(PAQ&c?JRCw >r2q32:p̀a4]7 G urDh݉3 sj$Dq D-I[ꝵ+E4GW@_)"tz^-c)Ck@G +MK\zhjdjIDkj*(-0$*!PjӀ,S՗"d#,ɓPNjegЍ^ 6:mӻ 'u{z:QJKiG;ZRM86*-޺#M%w$`ɬ%հvXW1S:aV0v U9m1'6n9IZDz spz0Ph1d$/җ˓#`pN o";FX2>6N{xe\ +5w9_|s\"FҠ||u`݌'.2+>;|g[ODWE-3.UA!%$怒)YFP3hGp(p~*jzn1܁᪀{޽8?87/LbK wdraV?wV^H|&_ܲ{GOe䋍N+70_ʻ#MY]RF&|1[vGX; \.jOIF'%PH8NLwE]2|ـP%gè"KRLLQ29Uoem,Dܻg}6\l6U|Am'J:figA:Aj=8,"?&Qp ӁGR%Ƨ^!npx3b&~ @K c_.jEh,g):;gy<<1}ˎP<϶<7/8 JN8w>WR Q(TLY&d}<Y ڿ}YsX^޻8[e z 7k# e7!hp0۠ÞfXPKalFb}_kx \̣b٫ M?*/Lj2r$NO)Zt`n{ MDD4榢kA |& [<(U& `88\e_s+'tD ד*"bV$ CLl4m1Za?ߑl7y<2)`~;Rmgs&k>Ki)!ޠ zg= !M7̌s XDVq݊\E b ׃3( &/ aӷì߳мc[킫yGNUœN#]:S#9%V?iٴUYmG!y_:BJxLWLhOUH$m0[갔~`1`@Gaމ^gE'lS&rotSs=|C^ݖ!$`ftR]"ϫ'hFObr*Q=ɿ]tաę~XTDsejg |Fmv.9Ɯ & :x\=M//UWG!580Yg%=ᐬ^ɵh?xNle@"bĬaVC3Wa>㝨]7ܟxJD&T7FSsfVݮڐ|`|{+%Kt'|QY_7q^Ni9FSy?W+\Z1v,eޱ x7mmKD ?,;1a.<[0:u:^6`j |)exh )ogUh{om>v2^/|HLxI|Qe4dġ]i` T/v"p iDdLj]0fV[J5^4P:.)"4B9µܲ2ZSN9'\7![t I^6 <8ᘑ'`t$^Vo['wQ39,zAdaB1 3#D&2=D~<9:.vc7*!-:'u 4 Vfg}/8&{-&pAis3$^#3@@IPT6ϒХ'DϬ 7olauER_mxWВ2v]S:Sa+ q8cG՘KH 2??ݥ~w΀A2wngPa3G &3Eq78N+'oD#7~?j3( #RK76)O{k%m`g4B[Ho]˕"tG&:rv ?I<_x[qQ{F ^TA$ “:AdT=`, ϡ3jRu} |/x#D}}:~& JS2mY7m\C35ҕA;Qs]> [qo/tǚt%Y!$*NRzTL ljBWEWȤkSASGeilXl4_x\Di @ԫ0G2 W#?ˌew+왙?H MVleZpb~=}L9T D hk.N Z=e((es@"8P눟Y1ĭpW%3x?C76C-C t i+h;|j qMR \Ƶɞ^㹲ӌl'Н!,[DGxL혤0LױV RP@A]Bf\H|S@ C3onSuqVpZ_ߖVVn]YDQM\Ŗ2-O3NqEv)C0Fn5Pjē/&o咭YU8sxJ>C 5p~Sk+dǎ/?W8w& rI7];0ƥּVhHqLʬr[җ!Yw6I.ߚ}&wζC+W1I6^[[x:BoCkO@.ޘftyoba`!EB N%ſF^s:MCw&uy=L E =>! =\[i/U8 j!'@A"eԣl 2"`V"P6`W8>+[f<~w !\{hCLuܽ}KWyDndUEbwRf9 36Y֗UXLS-j7+ VvV!r/CȬӲ sxL0ځf|jkH߆0 -d^P^bAATwsX"ЛS흺n N/GD@>^"3 dJX@Q h-gՊ("CZ1cԝmSmW* Y^ u$k(bUѐuEJT55lf| IEW4r<"f)% ;mFRݦqz%$SVc}nu?`Ĕ&x\}I<+-.+S;F"ֱUV<ӻf9bUW< ,Ռ[K7y< tS;yIJeE.^#YG#t[LrdN)NB+ډYp lg}C#WrĚz /]z8}7Ú\BzUتr'}?LQ'}v\]{)j4C-єuh80`ȰS+(h8o)lobÉpm^o4t|lʁT3mQ+DjBqVWӑnЋ[49!` LA _+̠0:?Y^dݖ-_1o/zSc8c'YOoD|"j%y"'pDIo>uq@Xn42M2a4rs(Dk>3ts?àz'gYp!$)OVgܯw<ıxQFM3h斴*>rxhuS'YAI5DG(v8;3Hc\uK ӚO[/h[Vfi!+h a2H;vS"0IJP _oF,5m|n$O cqEX徭Hz4qA [ElW |Dzo*g W\ۙe܌ bbn:x%1G0*BB\ڧC._eh5Oڊ ~ ܣى|`$fkukC'zB1 ]YRK׼IGB>g/oZ@ցؼ7F[OwS~Ć0Rnє0w˖|$?тt!=A9]),L\EN̼0s|J M#Ul [bHR3ll$Ɩcь%'rrP .J\n!S9O;W". ż.y?WJ΃xCdQJ@%琝(e ޢoRZiAX$}%bFB7o 7,Zs<6Q6IvI_cA*}H k@D6(_+otU\Qbfw'xPԣ 8P ҔKũ&&WC*)`|lHmxs{2`f6pgFnU" m[3+sZ]፥Q~8xLa" *3qӽ>>3=_~o'zʧQ~$[7*Myř٧@kz(Qح4[81 8 q6I?7_&_2rAItm= xCM)-8gETuRJPTk FR:<j)嬍>Fux_L417t} k>B!p&6.of+5mꦱo\*;$+Bj4ʩLһWo3bS 7m,Z~U#bfKh!Wh# (1Wx:#9.).jge1.b*j))=}(?>9$9&R>J  Jz8P ?o?31prx͍ []N5bɫ1@]vPaLʼ{y> >S/+l74~ep&Ex>`SwaD.<-Ka!<Ҥ5Y zz63i=Y xB¦o3fE:|c)GDZC0^L":OIS% .˩1Uz_' uycY`L_뉜iwNRcuni!n^LS? {Pa`L2\:U/}}8#k]G41gg>DL՟3Xڨ"RM%8k[~cĴjp ˈH+5p"rc1'}"N1$gDxAC3moݛvƳ-%BXU;6e:%nX {%s @*4toFK\ Xؤ WG~WbBccPjxf'6䴒`zjF]#Ҝh$EƢlL,Ff㨥8-lĂ:6`MNǩloWtxe(?4ha:@Apknش7aj6LҚ/,(]{B#Rкƒ*:)xe3g2<"8 /+%6#Of}$[`q503.vfi-+O/2*ݏLS7MW=fL券 '-Íƚ:$XP-T¤Yjʇ.m? !8k5 OTy)@! 6VPHұJ5 >pUZ&\GY0*M t!\\۠]M;2jl!xpvt&e۵Xt x'1+0RzI '9_p| '.w.+@<fpq[d=9w($&iapu u#} $oӣm>x*=wڻAb&dآ $̀?<۷kH)mYʨj1f#f?WnUVAfOUY0ufdDOhfemOZ"ڠ k _Wu/u$QlRBC|&Iɽȟ'rx3ascE2%E0C5Kb51Մ)`[mL JbE\!IMM@@ *ﲑb媤.#Kf?2,ZA/go wn{L7:Jw1 ^ fh "bWwHt\Ԃ('9{q'_T2 ݊vtɴ0U Hf]ª9,:Um>-@[cR"IbplXS|ޏ?Zd h+3" ݩ.KkN$É)b32\w̮b|L%r}4! a6 rNRP p, >G^urϺlFr1@1`^0UСX/-TnAKE~+ښla2*l,E"6R#~=npSoz{~~vX3i'a.ja{n9۝^3.#I "x#E ʒpGЭ|XS3Y3j=>BćD>[(cvV*D_xpp'f=ėc,a/DMuֲ6KC/>^@e?ns+3گߞV'}^ܽuvLh'uq͵;{ ý$"vƹPOhީ( ~yQ#]o1BEF˼Qy,50X.CH.j(PyM}{E'sA.lZM_FptL:,nAGJj'X&Fjc)\cS秵y]YdG_q7`[ $nEJWhzY߀\^/MKGQ 61t-Pn\_HnQR@gd5xiin6L{Z^KI0vAcL%bP]iG8 z@$ dqUdi3wȏ?k@FF=fl3$zv2TGCY2+`J/fE9l9!65'=\,n =Uu9"=]GТPxt NEq ,xa6TuMp'rJ:PH!(7[g2*EkW${,$gO ÜQ**?{`Mg !iN2hw(D@(K/= Bn/r't ,C 8kbCl4) YiF IYl4@]dI!H;Wp҅0r&eiIJt:I4#eK DdaZs!`#RqP[@3jo &8hY`V]AM\4T!gUĆSu;?T8F° "#P,b̚/'7005h ] (\l5"1 &Z7I=+QʁARQ0S) qɊu錔5AP(24A<|&1O(t0 ‰OC|P`ĦOD0 teeworlds-0.6.2+dfsg/data/audio/vo_teefault_pain_long-01.wv0000644000175000017500000014665612140200333022625 0ustar felixfelixwvpk0QDuWWWGHJVIea5@;Wk_~y $f3! _3+*) 4 B x hA!` @)*E)-r08R1)(8P>^L{zy @EIPJ=?ghz $4I:g2'y ,П#z@@H$4#?EA!Π4;0'!E #sG@\x9=p s~.Os50\ g=_#ᡟG)=%@`{z1Pn Ox+2=~@Sa scGHBpg;w!qRbPcJQxofMH@_/^d=_wͲPGfCyK۞Fhr!UbZ=\L>9Ab vUV!ғr'ig$ķ9Meh]xs$10O_IŪ7 {<4 k^hm{# ^>}%ޔ֦׺H~)La`ܰ[U2Y8FXAT@k H1!,{~'lv;*|?_*!5jHcPx|5'YP4eRxaA !DPjQ xL HYRN>OӖ 7A{p8_ ^}9_ν dPxO|y4g9 Fʜcxogb O> ~Z/Q> JS uX}bCbWҮݱI!/mǙe1%Bw!4@CHT9K5Qtf(m18 $NF{Z$RI75>kES4ܔOz0}ղ r% 7(v>Τgcmn9q­Ps#q(_ykĥW5}B$T2Ѥ jRzGQ \z'f5U F^+ql $1@fH:@ c.OEcXfKfeGK_D 2@6ʑMF),a&xج$*)/@.o G‹lb]m++3xDg ;s4<$+sN,%GFFja4-IN>lH025V}W%mJY],X Iu ywvԶVW e>R `J\9<~f=O{o"w&Z te(V>aNPZ)jh"\ztxl@3/5,0}t|EeB nm6E,=ys\::?#=G*6gRAM{0. ~(Qצ2\~L(R{fkZhْΟ[\Ǥ[v]q17>=>WgoɄIO\ea|8:mE%5K`XqN>|ޏD# Cx-|8,rȆJBTP Fu 4R!Ed㪔?wo+c .\,mH!#daA5.\_.&! &Vg%E⑬ᠷhuJz4wS'Z}Vz GUOǢI5tOnhD~s_B7M[Vۦ8@oB͟ZgUK?n/w[p)P.xrs54|fEnԮ` s-8M"ecrƞ,FӅ|vIpCYҍwJ!_OoV j2g9E%—Xy)\I{g-R%1V8ss0jJ0;VTnd{= v ȳ"5e173-`&'p|x.6f*"dNM1LrK*SNC==P·U0n |ex?܇\IHC]"`gRQIV\,S辪<&nG&sTVX$ t09y[#m3MbidDQWdKAY{!F]m^7ZKo[B0-„14RL?F-TZ@=x̋Vr,he\ ϶@9-K/XYWvH]G .fQIh*2gy-Ru܄η1!HfVxOol"hyn m>=03heMr'X8r?|׏FWfޛE73ha_ LW-΁)IpJS.;NT9DτxuC#/G$^QE6TS#B4ҕ>θo>PZރpƱ./hO,!BS<$}C1_ ҍӭYL em ˬ)LXJFU '^]w)#!:rI /%P<8<݉p簖N*mX?|O=M9|Yc,ccrE&y FeIh/^EWIVR,R8]cɚ/2;H֑ǶҮv*=wk~>ÿ#wJ2Nl]R:)&K%Т?]cֆ(O͚&ooAc炷朗OAqH`h#rXHLGtEKYsjX Bق7F˝`,98p7?zhʫ!4pY[O=Bb-Gl3{^mVGZ\4j~_ZXAI*0#@-zk,~D7$ZT#(+>'oI򇃬2_Ϸy$ %^4m{U+5;,{3js-p^a洗z r0Ħ<<+;TPR1UםA?F/:(H xr&$4weS~˚QQWc<0I! 3} *zwxQ_v/fW,_LHOO ..D*:E<]Hi&݃Ɲ ^-\FNloh)nCqo x_@QNU\bT*?uQZvsŋJ6&Pe<`Fo2^.CAĠYDn2(~9 3|GHvE㏉Aɨ>K:rSذ5 oX5C,o.9hzl 82_?%6gL8 Q6=kxq?@_t޲5Ϻ!5c/Rq$^_-1K fHqM> Zۻ46D?rVAwB$ ս Nx}DζT8:SmU<$ά>hM&EcsYN~Ii| GwrLUy(~xXovL[j>/!M ^AI*i[ 0Rl/2Ct#)I"["uΧ s~~wBΏ¿@Oxr')%X,F}rJ%g{Yv|[.б+`_Z,̪ K+ 5Dw.? /~,J-= )yLS9wqUpl·7"Ge.WǬ3ƞڞ:b 袻3~ܯ0BI4GC ̺*(B]~oNx~P&iרq٩LX&`t&ҿl_ίE??#}*yq6Y?R{FS\? 'O_<嫠DzɚhsO& %:.om,w_# 1@@4;;nWwa)>D.\v>QN}PKb hYS 8ڴ\PJ9C5];zRǍ@X}n21 {8QmAS˼wa-e65kSu:sw->lw] 8|Og^X?= \I$!L%=1GوMl&,(4vJAK(Y}Fyi\jYN7phꌇa@:_H}d8mi +g`͈GfRЗ%õIRa6oR. ٲ*MRO5KrB"/]Zp%fRFぞU1NXklթE[1m:Lz51nsh>5BhccRFvzZ# yMwF?f@We-S= =5,Q'&sz{Ap={ ZmE8?eLw >Z|_P?}|^  q&]gWM73Vc7r/@0阮8ƳJ»CNf^c*q_7wO I)̇pN^l)}y|XDA K{zIjX8IzE}{lg# aD_})Bc!cz؛)#JGk y Nn(1WhaESq6]#KV?ũ/0QwUc5(E{}C2 `FRrm`r]iTvti@5RWxu8̀|P` LWk WPAtQ}Fr7y.وYV:n\m~sU8?dY87kq/04ޱ+.qu)3wiFߔ$PyEwj'/66/̼Q~Q>e}YHeb0 eaaZPmZ]SQI9`an;FFݧ#I3W_"w|PvƋ'>u&/ N\eUADݯ 67Ps0/gӾsi;^oMi O^sVχK`!v9YIuYy=qѕ "-Y0U}ג{iGuެ ?햟1̗p7Xjkt@ك%c%=UyGU*aF>OY nЏ5UNg%(ZAe$`+_9{G>F}k&]NPT]+]߅$$] &B˱g+Kq uZB@i&g*&A|6{F=\&~vq?X )>I!U|[ 1]3N_N8x}g`݉af,rCa W52f %):>)xtO:#!gs9ͯZ+{%zҪvkOζ~_չɳ}ϹݛTY ?#!FYhp\2 :e{>$PzSh r[Ca~#MAGO^y B~D EE]S<Z &~,;EQZd\єѹpJȈ Ɇy7z Vz124]%jvփ ,Wǽ >v^*48Ã/ⲇ 'S|> Ѕw"Ix$It``${$wa(\2 E.V|;ZD[ 3"a9 E+=u:Vc_ PȔz"QuKgL?y9^ dbr$ PƕSA/RTɸ֑xc^hg^1,(#l a*mRl?t!zRr^>O̬HU f z§XΚksi cGܑ+7q2‹]7}S{I+/=٦^RuGiBbВ1®P^މN) ow'Кln>Xn RN7BRP"YhFҡsxe6|fQd^B?jci|`,GQiA(! ş**it~˿K]goO9I)iq%fۦ"ʨ#]oy|9g.4C:x$jß}z|J-!\]*F;9l@M]'.50I V{lLV[¶'?^26cZw\iXK[-=-=wS2@zvK&k&TWk|%2&u-*R츳o{GAI'xkC`ךN ҠRh9 9:m> pB0oaic!h'Vq":kÖm-H"e$['8`ߚP1 n6Í.82rvJoT$'Ĝ/X'Ƨ`K"q5\!>'`OIYAk 1(^B~PbhD)1-#cN;+;%Ƣjϛion~ 2XQSP;M9N<0ݳQRUi!ߌ1Ϊ،k@'Jtm+\;׎&7CF3 |70v hEUqKhdۧM=> {!3ӏ:bӅb.56~ W#4%"I\DNf:BΚE-zHf]ҿͤ;=sJ!-NJ_)ծ`Bc]iD#dIevHvw'Cz뺣P⯵^|0%xE0"S.J_>r1+ʡꋼxcj,S$ُ%5 |Z 3]{BB^N)^F 4KHMDe-MF0BkIBp|,Ik dY7D|1mP]r7#Z4 JARf2>|?LP; Șd15lMh%p_(r GϗoSXlPl25p=1%Cs;@cR҃)OCg%8ESg&ǜYѬuMk|JG:͝=J(3~2ȋя)e&3>J1vU>Q+P@Q~mO^޴ qC&3wջtvmPSiN`3ciSM"8(DUof/ˈ5BIMY$,hmvr(iwn P$<8r k t¬ZCXpX^lY7j3N~ 0w^:Wsnݹ̓ÝrCUEӀ vx%C Bci7@i.Q - c%˼~tz[)[8zH Ѹ$ ~5!8xm#{5"6,2F4' ]իD5;CR1kmdBWW䄸c0Ct16'|~m o12:C>D'R] P36EĮ{ؓ0Uƒo\o0 v,k mMp]S_!=5># ^Ŵrc?Bf?]N}h>H_E!R8SwuQVuBy[w#.)ƿՆ*q XD3ӆ3kn݆Xg+/~Z y8RfkKE)e$}NDED~ί peuToa ۄyv|}$Se> th@;tdECcLKO@b>;QsX^6']+Eg=3ǓM^hO0_b4k֧ ^Џ㐉"* 8.K6I岹.GR E)Gy8J2}ݮ"6zDO^bm <[5PWYl thoQ {>o.η AY5n9Ue;Y3tgj>r-phDUjq\C#;;oסd6 T,7Z VffALnFק&2^zF)z z* iy4,њEHt5dgx"s:$,$%Λ; J?/ҧF4!CBx/ь51^eWA``ħP%M~"63(0J%rU*c\9FXESߜNʩۙPm1ycmFS'?l?e ѧTf.&tuX(%TGdhx,[0>?ۨo.qGtzЈ 6B8Ҋu&Fݰdd?R :ZoZ^͒mixShA"]iw\OZ=@Qsa&j !X#vtd/5?+V.ۜS01 +9.>vG.x-oɣA2<̆"_፶G3vm7%bMDvpȲ;~y o%]gEEi[%Mz5;P7] u(D5| kҦ: X0Ѫxӵ]@I}UZ+bbgbU,U@Y7sZc@n7* A @C挷B' Z\n=0p~@$5X4 K(&=*fL2Ft!.Nꂮ-e[A U*aIs|:asdH - Tc.߁U a+l%4ZfiԦ.[-'D\.+!ZU&v?bX@@h S A wY) ݩ}o95$tYTFTdrZ*EGY 16v)[ ߊ;;W cT fy8J=JͳL8i$p%rz 0Ko'7j9$>ϼϯM~o-獢TUŖGpE#MA UST(_.!UnT;l\KPn \m/ xmsH(OI[˓B2CoAmy`IޱnEε_܎<vnK\A bcjˠ,EyX÷Ѭ+3DwVA"bj'(VX%&Dz&nIy;rj8d>9hC~XV< ɳ %:Ⅱ{d })}RX"(H\T|)ьd&ɾ%mۘP[A৶ĹiD5\|̟@R2pnJ{շrx‰VfZ 7 A_OŏV#q BOTjh7Bn;ZRe)GOte ڡL݉/f:ϤY>j TǾ> z=zY̞DXO,rR܀UK gbD[boۘhqMS5Ss`Uy7v%u)ou4\1 y6@O{i)+ܹS|Q<40MǾ`aN,ߌxTe/&ֵSz-&k%7қJ$r"r׃W*Rz 7XYqMxS`X=]`M_t{-Ƥ|vAR^M *$\1ܚ6R2}~_pH7G`k&qeMuf|?ę}pP%x` .1t&gy$7ev $jˁG. C~$ޞ{F xPRV[$y^wBiU-pp8,|Q/ `?&E Ցi~=. |`!uCTf7A&h_ӯ(o8~O΄űdڈ^%ʱK4ҸGrk8xޮl >/0҄ \fКY}'yGOnuRQH&2vK[p =jFU^ )Xm?N@'Os>dτ2=1P1{x2`P,%\7VYCNo| jUsL)*UVթ8n[kO# l4a}arX|Ŵs)Fmӌ= .*]E{%B#6p4,U`5rr$4TKxM$Φcx~/LxM4-ܸ47D+o3*q|?$rƻîѮ_޼I c- ˚mM5ڬv'N w}2z]Zu[iPhDuؗK8eZS[aquiy]5uXvTM͹[QT8U]}34cg E`UwKuR*)&qFӦݹsYY>jֽ#;F!ZcIXdOICbBT "ƴjX*Ss8%N\QJVV+ =1)2W!r痊;uIQvMcd&mR졜cn%[p .UTIɩKT9R=> feJ2wJ f83Y {D(k Slj&ko'0܊{K;׺Hɫ5͂mC0ʪqX_qc z%o0 L`9wvqJҳx?H#Ԍ|3J$$-vNO`lZ06sy_;oj mfdܜݧ$8 l.cg _u߽ WgCa]e1l6fQ%VnUk90Zq m`6 1i\,{qxCzmJUCɽu&#3`ێp{u- :!%<n"O筣׃g3fJX*R׈5HDȗ)j{SXY `\V6`ɒUP*FSwi*vdq%\m_NB8IҵjFhA3ĖQ{d5֐$qz^!?ZWFvWſoO^UPϹs{B/ C_xÙoE|;6~zRT`LB^0s?Sl^=f{/Nr,Ie 2qè<ʺǹey=^QQc2[J}ߘ^%>3@mdrW#ݻd1YF('ͽ6W6d(WZa 9"{YZ.@:ee1x}i4`-D7n=h An޷=:4F=ug-;ʒ:.x<6ZLQKΠl\Eef t~#  _!(9T{A???Y,b*mȔW3rcgfE} ߵ6]gEډ ' ʠx[y%3/sDJ*3YyX j3D)=.]-|r7٦d$FRfv (]\IOجu]+E.m!/P6rAMj! dAtRAJ"q QQIzWt8(~ڄKs >1 hnL.cy1^ws%)5ew6\0:(׷;`EKP ]-ɉ 85%gi}&T[dF/"c@wn83-Rb? S=%1'D*l₎vR>O1ӿrp)\FЩE(!}ɭ.!;C \p[:U5=Ns~DLp 22(UE"x 3bMn}A]XI}L9:л1[aud%#d%q"[_<БdNbaru")~!ѿe}IϭĘX1BzX\L. emy6D| w㓎 h,<*{E&o/(Uѥ5njR6jg.\h0٨]ci+Ԫc0{~ryL[ ~z0b;41I+уTYJB }:2b4;9ԟDƆV,wd'#©c |-d  fk#4[&p2&h?oh.H4d湤Qj9(2E:E}Ϙ0voՏI;Hz":X-rGزսUcf"O7pqξ\|}R(T>(`ũ{ wm~đ`X 읿g^^}`D0Db o+T,>.uH0Z _tP~ 8+Բ括YBPOSvlҲ[Ja ۸..NoW㷛eX'#pb0;ꛕD hȬc*^0Ckk`)(!4AZlOx2CćIS3L˜T1\HSO{XEmwLvdq]W|qG-μ7,:2<Դ4&8^t'9˻.z,1nd)%[)hpJzV9OJqXTIQ;ʩ$cwzݯ#J+OCF01cL[ς@; hcl-nqEZ})CwU(UqFi0krg|"_cT;xi{My-];L7}cr^o 7CO^y-X~4[>F7jx!>GR`c%L: qf7M2 Xί_ݖ"}(o?$'Ϻnmf%-@׬jϏ_}{2Xb~PO'qYLk\uE#qYΡ}oQ|2*q 3c`SƭW),1 omh!.3,[iW~koٿ1B3m 2p~6z`M<Þl4PUn)N2G;Qo CW0^LpLm `te[bȜR5l3EH}I #4VWz^HA( )Wř[(EoωCYpI΍nF'fM<{~xBRO&sbl۫ra#f<,ϓS6)pTs4ațRzCm֗$ AI/OiD5Bט$"m >6*ջUhWAN k~CѺ@)J4޿Z RI{ (?eL@c`y (g^,K.T ̀*rXnl;e5ܟ/BiTGk_3` 6BZ,}=5?_A񜕟_뇘9șM_7qo'i8ȭ :e%\\MdĬ\R3B?k{hY/pBHm☠XYlw:* GhByyS"D*M1 ^AMcRsIEa7l}5DDiE<|? rgg+*x,^gܥP,Q˔vTdT Ʃ{ZxCb^2N$Xޢ[Ǐ9U)({" , \ $?t-Yy֬ ln㝹ױB l~qk T.\}3@Rr%_$#:̜9q]"bE0!+y]$$%wERKðF},mʫsw`.=fos"v`Ͳyv^=H'L<$XG_Q)Z0`g1b ,*tni*܈ûel,!ؕ#idl1 suefKjJi_;uu߈2"*tƾOV*|ƂE #jb(gt. bB G%qO]mudllK* &V9[Ջ9ZϛHu:cU$v~|n rlTh(z W:hͽ~:>@D8n .6+/8L'h& x#r0vepjy@{u1o*"/1{-=ˌìT54Gw5#Ц-j(8߶f_gb;:pQXoƿ,a@I/ Rc? lvY2$7Ƌł_6HAuL)"7Aexj8HeXs  c~= ? hyW"㰒!OJ!OR^L &Jr?>sں+C9 hrV7<ɳ17^rg)Ezbi>ۋH4ڌy)uގ\$)malUg a^擜If .aDI-%6K2Q-.cprL-m>t%V3Yay۠H o |) xȿX8揃DԬ;kLT҂ը/$ErѺELr oe)%"@RuZJnP*7o3Uq :<> V!fjmLaG헓xq53rpjK@1|[[ Rء>,f\fޘQ";j cC]cC͢` N\>kn^u8iACRƩcX9c "BCwPO&Dh_C(V-*bP4OSr̵.SRlwaʒICt#&pI ,jλ吊$WɼxM4=^JsG 1<3sK,uƀb*;V6e=~t2(aUiaҲ2WN nxdaH%/2S ΁y&!^6/g%{pe~>.~3!-OCTΧZKaB^M$O95Q9-ƭc@  U\j Vs8{f X`7~aYM ,:;bU6&ԴA6=|45Tܚ2޳!']?n=TA!;4&95웆Q  'َ2bʰ^F?Ivٯz O ~$PUr H&Ae#\'`]C%O6vL#F B Q bɢ]t )}.a{Xt8z.% CsDYZF՜ 1X"(UU7˂΋L0x|w%Dh0!" Mђ>l9@spzfkpH+ 7}ͤ浔*>AI H%:C} n|͸Xi' w{c9)>?K!p9Rr9ƤMBxQ|N$N$>Jve1#{RI%*e_`R/ԾWޱXq0 g!TUev \W:p("2mhAVkCEˉ-IֈJ]s׾sQaVHhsb.Jas;Fdh_8n^Up;&8 MڷԵ$[ 5{i?7aU20%<ؓt[LAǒh)%Znߢ^_ y2û`Blf4Rs3<"^[?qhzRU!yՓW#p^1ToF("vG:8dXڤ {JGQII3LRfTq~^*%tW!;u ~ 0 WWi@2\ISM#֌o8,7k+Mw+N$T 7F%yK%_h#@L2@M[il3;)c(P9-B4PKC#R*˓$ BmLjBq/3H%a2.b \Ho뷂v+B&FU92 Q77n93s-gOӡa *[q 2faYⷫnu7d"hUNТd>Vhrً F@Ɖ}kL8rPFF`>& ]p:K(E l;%~#]B<Sr`f1MpeS2Bt 6D#g,1]ɓBJ-)6c~M!tL lJkD(42$A8\<")~Z =z ȜkTCpYT!!qjAyCgxG8k_PXnV&d16]‚*ǷlH3ɦ~Rp[2"7`6MË7cPlx p(g$DDHwA&l?54ǥXvx*P'RY|Y{ vA?]8 JX7\S*ERU& =ne=ӘjZ']ޟG&V J>Ko7SP&`12LĂl"'\ט I.+12<\LX} 'Ӓ oyW2oAqhuF(~4ڣ\=@ry EU [<%A+@rz{B=Vj%>GELY)x)e'#)E%6]nŁN޺5`o cgk  &АGE| _xgZJ婡܃'i >ZeUpI ^iHkՉ$׿7v`P$]hȵ==9 Uԅ.!)]HX@mf<%NaU!-d8A9Q3dYShQK![9Xz &#W3\;;J#\!|h%~1t)<-Y`"֙dÛ05CҭT(l (\){5oo+d)No6. mKQt+ 3IKvZeAFO$[3#ˏ7#QXEFa'{QW Y4u#>h^o#'%A ꣫X,3 Nh+9ZٕyKKw1IR jC~7tY̤n'nK.kj2QAITz*Зӵlvd%i:  eNrW:KO@hٲq[[642U3EQ{ ^n3~HU嘞L PE]?MeO@;Waa}Z)v՚b>^W%f0h)Bq-R }o$: rOLo|ײp]N1R{B*lf q;:5 !}H.|*%7Os'v+xOhD-doT,mKuħ-mFSۻYܦ,w-@PY 忊p΅iDwIcq$w _fLZͫ۱׌ҒȞ8`O]@Դ7kwBFr׍Y.!O{FPif27 .]LW9Y^VXL̎w|g&8_`Yt#GI Oht?ΩAIԅ35lYPQmk l~A1/@:`yBf0s3"?4Z 6rXo_Jb}\$j,flv>0\xv,R ̠>ͨ nlɷ_ZϹ*961UR dL!tH`DI6=L`?5IĞܿ3:=P8!ϟ 8$>Rn3#~#c܎@_P>qd;, ~T(Sr}Vr\Y-mKA (^KFeסCo8$'M1uu)'f[.ёpѦch3 I* s7R*n`yo{?]4q5 ͆RƱmbK~c gmLR KeqXsCQVfa*їD7JsyQ@"=}^) h49{Y:ND&,OB*q2xp3Â!YzvF vѯIwB:"kY|xXZ>5` fW7NU'DhA+e  ա[γ2R6KɄ" ė)JKp_jH>df?J@BOBA:[R0qG_z,FSMx @dRk k t!#wXsj"]\W9\ӐZxלi#vn";,@Dcyu`EhJ%\zidG~eRL|UGWF%ϞA^'x΀'(2s"fV`Ly~X6M̪3p^Mb?h)ɾt}t0k`!k`2~st P+xXĵ(~ rmhr=Pr+6\/ygLrkgM9O!Qzϗ[;Cl\y ɉ_fWz#wJWd{j0&<ྯd}!01DMRt0eOJؕ3ު`D<}f5 ˲ZT=i@J6E v13D'n+-JM\ma ) R9Us,hd8~ʎ?rY""fB[:2ᘤ #p|f@7K>[sK) }{>}$/V-{*-2d('G$-Kܕ[+r^98`ցFKZ݉rx'Q6۷ K("븓4F(Pïr%st=ߌBO(!#UBgⶶO3Or. TRdlZ /N_K? UfnuZoGi]P #ϔ. xy@ұm' գT̋F i@Alӻ00GᏚR45ៜf[U6̢@sKH:}{pU6[cH"* tBVoJ g1iIr4ELO?ڍcg9sQ'J10{6Xٗ-zp (zMwDP̼:ڀC[(JRWF:P þ8gNy,w'c enh*$ƽxu2G<'xd_P/1ڔA^¼t$IΒZ wP\7~OqàNo?V/i2 dbaD@T]q4x1'z1uGQ(@L&]G4>N,tpfQa aQ$ֶ|:cd %u̼1p5)ġF!VD{T\T9a42j%,aBt؋x{}n|rI_}Oن4e4+L>VPD4N 3V:xhoELS3sY(Ci(zMn1 ~R9SStщ|`n%?]Ԣe-!ј\ ^2PJ%4CyCyX{4NI F/XlDe @gTNWm:+E#Ȭc(^ 2x~M >_gnL*1C8`Z4[Ӂ `c(; W 6RwcOW,:A@IVPKA㪬 - 5P5k˞*Hy[SMEѸ*,`3V4OJ)_42v< |wt˪ lf}U'N ?r9%V+tMlnohAj&9p{O`l9l Ôej XىμЁŒKM'cH!)9ƔQjו"kcFkH3aT(i$ RbFRM}loM՗^V-C%3H~US8ifs*%&sѩH{% ?QzTq.zGHよ9A`xD`o#&\C" u%L=b'cv.)&gHVaۃ8O =vSQf8BUlևߋB܃{aC@ E?pB$b~kIXihJ367M7Lq* &XnLSja(h0 3<?m?zp AnmUQ%DjmlLwm3g=䅢izpm¼LּJ瀒I4! ꔶB*C4Uʔv~/ SBX΁SyQ_ "{܎SuOMC*/J͖)cnCICT^j=A@ j|7Dї6,"h|zXvxmnҫ8 8|{$A\,"Y㛡 $ܼ5іCw<4:,Ts (fJ $̅ 9 zUsPvq8'tdJIUͭT(Z]]a '_*ЍMbt`x #Z Q@opQ_ XxO\nMS57R-@H,]ǪoV.[R7q%]V~Ɉ]$^խQsLx&VL^ʀ=_m=Ԛ 0@o=,$cqOp՚.>D`yudG@S= )CA8(;S:nVAfsFLmu4{TLζ/ڀ5ɪѰ\%c`Cq2Zk7q2T@Lo+ GSx/E/PZ,o3zPnߋ&]I;6 A)ȎE[fxsWe_Q9 Bms>}xĆzYIb +(Ip)$H\-%CΣ4+y]#= (%qiP*xȖtd5EJZ($X4zYDWMcȹIr?//m,F+K,SUO@p @c^FkgxzEm$E[5AN槅g>[bfJӏOgG7AčדLy B ZT%# '4l-x )wlI)Ɖa)J-͘ۃF氺"^^p7J|qYW'UqL@r"[ +MnE\E-m-<ٓd(FP -^c*6Q70y]tD1wj=(ۄHΔ!cf0zi|~Fhڀxp?:$ñ2œyng kvˋy؅ϸ"X8 *u7\"NJe@{.Z.z6i2]hۏxiߛ /[¦N, S ")Og_bcM/J?X{K@㌐+GI/Jbva(j*]b B"ZցT~5 HS RCrZk-L' šǓU֬/BoduJUD"-ǖi5͝(SkAi,?H^:Y9J൛6~ɿm'}m"{r5Ѝ9k&SғwP vPhq$B7TFJX!;5ѦdǾA)&7J;GmReBk{/cO;l#qz$UA&f\ozߐ$\tn{] jvO;ưнP[2% yxM=F¦luh5' ?c)pa+(zMMCL3-ݶ8i1ҝ~%N([+$xV)Qw2JW;Bw.7W@Kc" \RouN+μ.ݼ?!)ȍV3cLgĀ;E`Ҝ/Cº-MP(_?"cXژ/QD.yV! &1Otm)qbՀft18!u$/pμЉIIm;0âHveT͓|jPkSP0 kBں,Pf  1#SH_G*J{f5:@>sjioL~;i 7ދQ`$eRRh}vTUP,d@_<i#fBxRifoA~h 9 DcYpj)8{ViG tZEL&G~sx6rJAsb&$E̡ 6%JG)JFKr@,s$A殣KQM߹%Hk}ؚ8t,R@l|u%Q>6@g/߂J7;d bsREL'Ο!rmc^2FWPg 2TO[: U~ 慻nŴ"0d.p]#Jcf;ev䤓83ut=#3CSxۣ(j գ7ԉ G+oIhM)R0aݑό=`iV trS(Cs͔=$x̣B ˋSG޽EW>"ܫ59 %oP9?aCM)ZIlUm^`. w k']A+[) -Q 7!raJt"1nJh=:p i'/{C;7H{c@trgBƄuMhõ,heӾ4=!xd|a"!|K RCDI ( r k Oyn SXR1>VIa aQmG "7*A&!)&<^ŭJlaQ>U>ME-׉RC_-kglB9rbcMԦ]~'qͮyaQvclĔ,gd]WKWNZH~ Ot_) ғ3> :Na-< )fکV @aYK6Ui}46mb^iXRٔiMQhF ƖC^Ww띐Ji0l呛Kي5'J(~(FW*d Kwh>ߒߌΎ.("KA -r̂Rg:E$q8gKҙ(|uUiW-nZg!=ojdlp-*6Wsg,EL4$鴞(sW|\Dgani;냍*83d߮XU,dXցޢUIur(Iso֌9,c%Mj0)DD4#ug+]_?v!?/^/lݰŜat_4Md >F g,JQpWI/@KEI'GS2|Z\HH`*4)2q~k?xw|0|4 jr5)LbNajy>&a1DZtf jH%3Ԛ@U( eVƚ_(K*T C0m>j}(4%ej.P3dov-Epj$ܨaU fҺ4ZUH!Ym.Ði`ᴵiX[,^8eT"Ma (&'hAi3*KsTAԩKx/gvT]f؟$d8ҷo9j3-ߨd8D>; Dyd|r#&6"[SC hԪ`O!HՂ^a5_Iw7~{g$OGTXG&{nC!AUA@kTn+@C)<AxQ`nA9 }MUIvFmiRҽ2=0|1bn0~nH Ky{X0}lVY|BW$XgC~ =)o2+dd5I~t<YDz(.̈́QHdxl>:F A6`͠ɇe1>$=oՆU`ƄAI/ˇԒ-*o2cT0ݒ%C`~Iэ2LbD<.w8^C &4VJ5&uG}b2" Q2uhNH5vJk뼺CK`Rf|펟j,<HUYUAY |5`5IW'8À,z̛+lcXe.B82k-VCPH:X{یFv!^I;gS]lmLFZ(ض;fs–l%A%\om|9BVri07IXD4T?hu-x y)t C ~3+$r4(!ɿYVP*؃ p0Sp=jWuLV`F7[T4V@fSjžᠮLvоsJzW huLLRC<N#qw?m_OEiᔔl^) e]XА+찔ď!IJm?ާU?:g^Z.2sCYqyՉ"P];9RV(MڕtA<"Vk %oi~Ku"(P#I [x4 'A1Y:Tzb&u8]6ڻJE~X9gl^\NXX~jK`yǦT|p|wFfTmڀ\S2۠9BLUUMT=7''p'x@gV@9[-_QbPTϒr.[0xTɯ'DNnr}Z?Vgx ~3mx'n4V1w*+1ܪhFDzҁt~xT/YT`!Jt,Ea3eH]r{¶QZ#&IY/ee_ $f!,^ nag˒':$bYZCĚ{: WcFg{&{X$2a:kƒp ILSD$eC)TCչnIǨoFR vO\~TE3>e%ArT׀ k1–a=ًVA࿪;_kՓwŰ 7H5waf[