bin/lpkg0000755000175000017500000001655110774736520012440 0ustar matthewmatthew#!/usr/bin/env lua --[[ (C) Copyright 2008 Matthew Wild This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --]] require "lpkg.pkgdb" require "lpkg.pkgutil" require "lpkg.lpkgman" lpkg = { config = {} }; -- Actions -- function lpkg:list() local db = lpkgman.db; print("Status","Name","Version", "Installed-Version"); for _, pkg in db:entries() do -- Installed version info print((pkg.installed and "i") or "u", pkg.name or "unknown", (pkg.version and table.concat(pkg.version, ".")) or "unknown", (pkg.installed_version and table.concat(pkg.installed_version, ".")) or "unknown"); end end function lpkg:update() require "lpkg.pkgfeeds" pkgfeeds:refresh(arg[1]); showMessage("info", "Feed(s) updated"); end lpkg.refresh = lpkg.update; function lpkg:upgrade(args) local db = lpkgman.db; local num_upgraded = 0; for _, pkg in db:entries() do if pkg.installed and pkg.installed_version and pkg.installed_version < pkg.version then showMessage("info", "Removing old version of "..pkg.name.."..."); lpkgman:uninstall(pkg.name, true) showMessage("info", "Installing new version of "..pkg.name.."..."); lpkgman:install(pkg.name); num_upgraded = num_upgraded + 1; end end showMessage("info", "Upgrade complete, "..num_upgraded.." package(s) upgraded"); end function lpkg:install(arg) local db = lpkgman.db; local name = arg[1]; if not name then error("No package specified for installation", 0); end local pkg = db:getpackage(name); if not pkg then error("No such package '"..name.."'", 0); end if pkg.installed and not lpkg.config.reinstall then error(string.format("Package '%s' is already installed", name), 2); end local res, askeddeps = nil, false; while type(res) ~= "boolean" do res = lpkgman:install(name, function (option) print("Option: ", option.name, "("..tostring(option.default)..")"); print(option.hint or ""); io.write("Value: "); return io.read("*l") end, ((askeddeps or lpkg.config.assumeyes) and "yes") or "ask"); if type(res) == "table" then print("The installation of "..name.." requires installing "..#res.." other packages first: "); for _, dep in ipairs(res) do io.write(dep, ", "); end io.write("\nInstall these and continue? [Y/n] "); local choice = io.read("*l"); if #choice < 1 or choice:match("[yY]$") then askeddeps = true; else error("Installation cancelled", 0); break; end end end if res == true then showMessage("info", "Package '"..name.."' installed successfully"); else showMessage("warn", "Operation failed to complete successfully"); end end function lpkg:remove(args) local db = lpkgman.db; local name = args[1] or error("Please supply the name of the package you would like to remove", 0); local pkg = db:getpackage(args[1]); if not pkg then error("No package '"..name.."' found", 0); end if not pkg.installed then error(name.." is not currently installed", 0); end lpkgman:uninstall(name); showMessage("info", "Operation completed successfully"); end function lpkg:show(args) local db = lpkgman.db; local name = args[1] or error("Please supply the name of a package to show", 0); local pkg = db:getpackage(name); if not pkg then error("No package '"..name.."' found", 0); end print("Name: ", name); print("Installed: ", pkg.installed and "Yes" or "No"); if pkg.installed then print("Installed version: ", table.concat(pkg.installed_version or { "Unknown" }, ".")); end print("Latest version: ", table.concat(pkg.version or { "Unknown" }, ".")); end -- Feed management function lpkg:addfeed(args) local url = args[1] or error("Please supply a feed URL", 0); require "lpkg.pkgfeeds" pkgfeeds:add(url); showMessage("info", "Feed added successfully"); end function lpkg:showfeeds() require "lpkg.pkgfeeds" print("ID", "URL"); for id, url in ipairs(pkgfeeds:list()) do print(id, url); end end lpkg.listfeeds = lpkg.showfeeds; function lpkg:removefeed(args) require "lpkg.pkgfeeds" if not pkgfeeds:remove(tonumber(args[1]) or args[1] or error("Please supply a feed URL or id to remove")) then error("Error while removing feed. Does that feed exist?", 0); end showMessage("info", "Feed removed successfully"); end -- Service package control -- function lpkg:control(args) local name = args[1] or error("Please supply the name of the package to control", 0); local command = args[2] or error("Please supply a command to send to "..name, 0); require "lpkg.pkgutil" if pkgutil.control(name, command) then showMessage("info", "Command sent successfully"); else showMessage("warn", "Command failed to send successfully"); end end -------------------- function lpkg:usage() print "Lua Package Manager v1.1" print "(C) 2007 Matthew Wild" print "" print "Available actions:" print "" print "-- Package management" print "\tinstall\t-\tInstall a package" print "\tremove\t-\tRemove an installed package" print "\tshow\t-\tShow info about any known package" print "\tlist\t-\tLists available packages" print "" print "-- Feed management" print "\trefresh\t-\tUpdate information about packages from their feeds" print "\taddfeed\t-\tAdd a feed" print "\tshowfeeds\t-\tShows all feeds lpkg is using" print "\tremovefeed\t-\tRemove a feed" print "" print "-- Service control" print "\tcontrol \tSends to , common commands are 'start' and 'stop'" print "" end -- Initialisation -- if not pcall(require,"config") then error("Unable to load 'config' module", 0); end --[[ if not pcall(require, "lfs") then lfs = {}; function lfs.exists(path) return os.execute(string.format("test -e %q", path)) == 0; end end ]] if not (arg and arg[1]) then lpkg:usage(); end -- Handle message -- local errorprefix = { info = "(II)", warn = "(WW)", error = "(EE)", verbose = "(++)" } function showMessage(type, message) print((errorprefix[type] or "(??)").." "..message); end -- Command line parsing parsecl = {} parsecl.flags = { s = function () lpkg.config.simulate = true; end; y = function () lpkg.config.assumeyes = true; end; f = function () lpkg.config.reinstall = true; end; } function parsearg(currarg) if currarg:match("^%-") then for flag in currarg:gmatch("%a") do if parsecl.flags[flag] then parsecl.flags[flag](); end end else if not parsecl.action then parsecl.action = currarg; else return false; end end end local maxarg = 0; for _, currarg in ipairs(arg) do if parsearg(currarg) == false then break; else maxarg = maxarg + 1; end end for i = 0, maxarg-1 do table.remove(arg, 1); end if lpkg[parsecl.action] then local success, msg = pcall(lpkg[parsecl.action], lpkg, arg); if not success then showMessage("error", "Fatal error: "..msg); return 1; else return 0; end else showMessage("warn", "Unknown action '"..tostring(parsecl.action).."'"); end lib/0000755000175000017500000000000010746414043011533 5ustar matthewmatthewlib/lua/0000755000175000017500000000000010746420136012314 5ustar matthewmatthewlib/lua/simplecurl.lua0000644000175000017500000000133510774604057015207 0ustar matthewmatthewrequire "curl" simplecurl = {}; function simplecurl.download(url, filename, useragent, progress) local c = curl.easy_init(); local destfile = io.open(filename, "w+"); if not destfile then error("Unable to open "..filename.." for writing", 2); end c:setopt(curl.OPT_URL, url); c:setopt(curl.OPT_CONNECTTIMEOUT, 3); c:setopt(curl.OPT_NOSIGNAL, 1); c:setopt(curl.OPT_LOW_SPEED_LIMIT, 100); c:setopt(curl.OPT_LOW_SPEED_TIME, 15); c:setopt(curl.OPT_USERAGENT, useragent or "curl (Neuros OSD)"); c:setopt(curl.OPT_WRITEFUNCTION, function (s, len) destfile:write(s); if progress then pcall(progress, len) end return len, nil; end); local code, msg = c:perform(); destfile:close(); return code, msg; end module "simplecurl" lib/lua/lpkg/0000755000175000017500000000000010746414125013252 5ustar matthewmatthewlib/lua/lpkg/pkgdb.lua0000644000175000017500000000764210774737032015063 0ustar matthewmatthew--[[ (C) Copyright 2008 Matthew Wild This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --]] pkgdb = { }; function pkgdb:load(filename, write_access) local db = { packages = {}, filename = filename, writeable = write_access }; local chunk, msg = loadfile(filename); if not chunk then error("pkgdb: Syntax error in package list '"..filename.."': "..msg, 0); end setfenv(chunk, { pkg = function (t) setmetatable(t.version or {}, self.mt_version); setmetatable(t.installed_version or {}, self.mt_version); table.insert(db.packages, t); if t.name then db.packages[t.name] = t; end end }); local success, ret = pcall(chunk); if not success then error("pkgdb: Error parsing package list '"..filename.."': "..ret, 0); end if write_access then -- This code will auto-save the db db._u = newproxy(true); getmetatable(db._u).__gc = function () db:save(); end getmetatable(db._u).module = db; end return setmetatable(db, { __index = self }); end function pkgdb:save(filename) if not self.writeable then error("pkgdb: Attempt to save a database not opened for write-access", 2); end local f = io.open(filename or self.filename, "w+"); if not f then error("Unable to open "..(filename or self.filename).." for saving database", 0); end local serialize; serialize = function (val) if type(val) == "string" then f:write(string.format("%q", val)); elseif type(val) == "boolean" or type(val) == "number" then f:write(tostring(val)); elseif type(val) == "table" then f:write("{ "); -- Below code will take (marginally) more time, but will produce more compact tables when possible for k, v in ipairs(val) do serialize(v); f:write(", "); end for k, v in pairs(val) do if type(k) ~= "number" or k > #val then -- Skip vars handled by above loop f:write("["); serialize(k) f:write("] = "); serialize(v); f:write(", "); end end f:write(" }"); else f:write("nil"); end end for _, p in self:entries() do f:write("pkg"); serialize(p); f:write("\n"); end f:close(); end function pkgdb:getpackage(name) if not self.packages[name] then return nil; end local p = {}; for k, v in pairs(self.packages[name]) do p[k] = v; end setmetatable(p.version or {}, self.mt_version); setmetatable(p.installed_version or {}, self.mt_version); return p; end function pkgdb:setpackage(name, record, merge) if not self.writeable then error("pkgdb: Attempt to modify a database not opened for write-access", 2); end if (not merge) or (not self.packages[name]) then self.packages[name] = {}; table.insert(self.packages, self.packages[name]); end for k, v in pairs(record) do self.packages[name][k] = v; end end function pkgdb:entries() return ipairs(self.packages); end function pkgdb:numericversion(v) return v[1] + v[2]*10 + v[3]*100 + v[4]*1000; end pkgdb.mt_version = {} function pkgdb.mt_version.__lt(a, b) return a[1] < b[1] or a[2] < b[2] or a[3] < b[3] or a[4] < b[4] or false; end function pkgdb.mt_version.__eq(a, b) return (a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] == b[4]) or false; end lib/lua/lpkg/pkgfeeds.lua0000644000175000017500000000710510774737212015556 0ustar matthewmatthew--[[ (C) Copyright 2008 Matthew Wild This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --]] require "config" pkgfeeds = {}; -- pkgdb with write_access, merge in function pkgfeeds:add(url) local feeds = config:get("lpkg.feeds") or {}; table.insert(feeds, url); config:set("lpkg.feeds", feeds); end function pkgfeeds:remove(url) local feeds = config:get("lpkg.feeds"); if feeds then for id, feed in ipairs(feeds) do if id == url or feed == url then table.remove(feeds, id); config:set("lpkg.feeds", feeds); return true; end end return false; end end function pkgfeeds:list() local feeds = config:get("lpkg.feeds") or {}; local feedlist = {}; for _, feed in ipairs(feeds) do table.insert(feedlist, feed); end return feedlist; end function pkgfeeds:refreshall() for _, feed in ipairs(self:list()) do self:refresh(feed); end end function pkgfeeds:refresh(url) local feed = ""; if not url then return self:refreshall(); end if url:match("^http://") then require "simplecurl" local destfile = os.tmpname()..".lpf"; io.write(string.format("(II) Downloading %s... ", url)); local code, msg = simplecurl.download(url, destfile, "lpkg (Neuros OSD)"); if code == 0 then io.write("done.\n"); local feedfile = io.open(destfile); feed = feedfile:read("*a"); feedfile:close(); host = "http://"..url:match("http://([^/]+)"); else io.write("\n"); error(string.format("Feed download failed with error %d:%s", code, msg), 0); end os.remove(destfile); elseif url:match("^ftp://") then local destfile = os.tmpname()..".lpf"; local host, remotepath = url:match("^ftp://([^%/]+)(.+)$"); if not host and path then error("Unable to parse URL: "..url); end os.execute("ftpget %q %q %q", host, destfile, remotepath); local feedfile = io.open(destfile) or error("Error downloading feed: "..url); feed = feedfile:read("*a"); feedfile:close(); elseif url:match("^file://") or url:match("^/") then local f = io.open((url:match("^file://(.+)$")) or url); if not f then error("Unable to open feed: "..url, 2); end feed = f:read("*a"); else showMessage("warn", "Unsupported protocol for fetching feed '"..url.."' - not updating"); return false; end require "lpkg.lpkgman" local db = lpkgman.db or error("Unable to access package database", 0); local chunk, msg = loadstring(feed); if not chunk then error("Syntax error in feed '"..url.."': "..msg, 0); end setfenv(chunk, setmetatable({ pkg = function (t) print("Updating package "..t.name); t.source = host or "file://"; db:setpackage(t.name, t, true); end }, { __index = nil})); local success, ret = pcall(chunk); if not success then error("Error parsing feed file '"..url.."': "..ret, 0); end db:save(); return setmetatable({ url = url, packages = packages }, self); end lib/lua/lpkg/lpkgman.lua0000600000175000017500000000753510774736764015431 0ustar matthewmatthew--[[ (C) Copyright 2008 Matthew Wild This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --]] require "config" require "lpkg.pkgdb" lpkgman = {}; lpkgman.pkgroot = (config:get("lpkg.paths.root") or os.getenv("PKGROOT") or "/usr/local"); lpkgman.pkgdbfile = lpkgman.pkgroot .. "/var/lpkg/packages.db"; lpkgman.db = pkgdb:load(lpkgman.pkgdbfile, true) or error("Unable to load package database"); function lpkgman:install(name, confighandler, depcheck) local pkg = self.db:getpackage(name); if not pkg then error("No such package '"..name.."'", 0); end if depcheck ~= "none" then local deps = self:_depends(name, {}); local d = {}; for dep in pairs(deps) do local deppkg = self.db:getpackage(dep); if not deppkg then error(name.." depends on '"..dep.."' but that package can't be found", 0); elseif not deppkg.installed then table.insert(d, dep); end end if depcheck == "ask" then if #d > 0 then return d; end end for _, dep in pairs(d) do showMessage("info", "Installing dependency '"..dep.."'..."); self:install(dep, confighandler, "none"); end end for _, conflicting in ipairs(pkg.conflicts or {}) do local pkg = self.db:getpackage(conflicting); if pkg.installed then error("Unable to install "..name.." because it conflicts with "..conflicting.." which is already installed", 0); end end if pkg.path then showMessage("info", name..": Downloading..."); local filename = pkgutil.download(name, string.format("%s%s", pkg.source, pkg.path)); showMessage("info", name..": Unpacking...") pkgutil.unpack(filename); showMessage("info", name..": Configuring...") pkgutil.configure(name, confighandler); self.db:setpackage(name, { installed = true, installed_version = pkg.version, files = pkgutil.getfiles(filename) }, true); else showMessage("info", name.." is a metapackage, it installed no files"); end return true; end function lpkgman:_depends(name, deps) local pkg = self.db:getpackage(name); if not pkg then return; end if pkg.depends and #pkg.depends > 0 then deps = deps or {}; for _, dep in ipairs(pkg.depends) do if not deps[dep] then deps[dep] = true; self:_depends(dep, deps); end end end return deps; end function lpkgman:uninstall(name, checkdeps) local pkg = self.db:getpackage(name); if not pkg then error("lpkgman: No such package '"..name.."'", 0); end if not checkdeps then showMessage("info", "Checking dependencies..."); for _, pkg in self.db:entries() do if pkg.installed and pkg.depends then for _, dep in pairs(pkg.depends) do if dep == name then error("The package '"..pkg.name.."' depends on "..name, 0); end end end end end showMessage("info", "Stopping package..."); pkgutil.control(name, "stop"); if pkg.files then showMessage("info", "Removing package files..."); pkgutil.remove(name, pkg.files, function (n, f) showMessage("verbose", "Removing "..f.."..."); return true; end); else showMessage("warn", "Package '"..name.."' does not have a file list. No files shall be removed."); end self.db:setpackage(name, { installed = false, files = false}, true); return true; end lib/lua/lpkg/pkgutil.lua0000644000175000017500000001063610774737254015456 0ustar matthewmatthew--[[ (C) Copyright 2008 Matthew Wild This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --]] require "config" pkgutil = {}; pkgutil.pkgroot = config:get("lpkg.paths.root") or os.getenv("PKGROOT") or "/usr/local"; function pkgutil.download(name, url, forcenew) if not config:get("lpkg.paths.cache") then error("No cache directory set in lpkg.paths.cache", 0); end local cachedpath = config:get("lpkg.paths.cache").."/"..name..".lpkg"; if not url then require "lfs" -- Check file is in cache, or error if not lfs.exists(cachedpath) then error(string.format("Package '%s' is not in the cache, and no URL given", name), 0); end elseif url:match("^http://") then require "simplecurl" local success, message = simplecurl.download(url, cachedpath, "lpkg 1.1 (Neuros OSD; "..tostring(_VERSION)..")", function () io.write(".") end); print ""; if not success then error(string.format("Error downloading package '%s' from %s: %s", name, url, message), 0); end elseif url:match("^ftp://") then local host, remotepath = url:match("^ftp://([^%/]+)(.+)$"); if not host and path then error("Unable to parse URL: "..url); end os.execute("ftpget %q %q %q", host, cachedpath, remotepath); end return cachedpath; end function pkgutil.unpack(filename) -- local total_files, unpacked_files = #pkgutil.getfilelist(filename), 0; local oper = io.popen(string.format("tar xvf %q -C %q", filename, pkgutil.pkgroot)); local line = oper:read("*l"); -- unpacked_files = unpacked_files + 1; while line do -- io.write("\r"..unpacked_files.."/"..total_files); -- io.flush(); line = oper:read("*l"); -- unpacked_files = unpacked_files + 1 end end function pkgutil.getfiles(filename) local files = {}; local oper = io.popen(string.format("tar tf %q", filename)); local f = oper:read("*l"); while f do table.insert(files, f); f = oper:read("*l"); end oper:close(); return files; end function pkgutil.configure(name, handler) local configfile, msg = loadfile(pkgutil.pkgroot .. "/etc/config/"..name); if not configfile then showMessage("info", "No configuration file for "..name..", skipping configuration"); return; end setfenv(configfile, setmetatable({ package = name, handleoption = handler}, { __index = _G })); -- Read-only access to Lua standard functions local success, msg = pcall(configfile); if not success then error("Error configuring package '"..name.."' - "..msg, 0); end end function pkgutil.remove(name, files, callback) local dirs = {}; local root_dir = (pkgutil.pkgroot or error("pkgutil: Package root directory not set, this is a bug")) .. "/"; local success, msg; for _, file in ipairs(files) do if not file:match("/$") then if callback and callback(_, root_dir..file) then -- Delete file success, msg = os.remove(root_dir..file); if not success then showMessage("warn", "Remove failed: "..msg); end end else -- A directory... remove it later table.insert(dirs, file); end end table.sort(dirs, function (a, b) return #a < #b; end); for _, dir in ipairs(dirs) do if callback and callback(_, root_dir..dir) then -- Remove dir success, msg = os.remove(root_dir..dir); if not success then showMessage("warn", "Remove failed: "..msg); end end end end function pkgutil.control(name, command) local controlscript = pkgutil.pkgroot .. "/etc/control/"..name; local oper = io.popen(controlscript.." "..command); local output = {}; local line = oper:read("*l"); while line do -- print(line) table.insert(output, line); line = oper:read("*l"); end return output[#output] and output[#output]:match("OK$"), output; end lib/lua/config.lua0000644000175000017500000000410410746473672014300 0ustar matthewmatthewconfig = { registry = {} }; -- Muahaha!! This is a nice trick... config._u = newproxy(true); getmetatable(config._u).__gc = function () if config.changed then config:save(); end end getmetatable(config._u).module = config; -- ...please leave it alone :) function config:load(fn) self.fn = fn; local success, ret = pcall(loadfile, fn); if not success then error("Parse error loading configuration file: "..ret, 0); end if not ret then return; end local t = {}; setfenv(ret, t); local success, ret = pcall(ret); if not success then error("config: Error loading configuration file: "..ret, 0); end self.registry = t.registry or self.registry or {}; end function config:get(name) return self.registry[name]; end function config:set(name, value) self.registry[name] = value; self.changed = true; end function config:save(fn) -- There are concurrency issues with this. Would be rare, and would need multiple users saving at the same time. -- Awaiting a nicer API for getting/setting prefs self.fn = self.fn or fn; if not self.fn then error("config: No file selected to save configuration data", 0); end local f = io.open(self.fn, "w+"); local serialize; serialize = function (val) if type(val) == "string" then f:write(string.format("%q", val)); elseif type(val) == "boolean" or type(val) == "number" then f:write(tostring(val)); elseif type(val) == "table" then f:write("{ "); -- Below code will take (marginally) more time, but will produce more compact tables when possible for k, v in ipairs(val) do serialize(v); f:write(", "); end for k, v in pairs(val) do if type(k) ~= "number" or k > #val then -- Skip vars handled by above loop f:write("["); serialize(k) f:write("] = "); serialize(v); f:write(",\n\t"); end end f:write(" }"); else f:write("nil"); end end -- serialize() f:write("registry = "); serialize(self.registry); f:flush(); f:close(); end config:load("/mnt/OSD/registry.lua.dat"); module "config" lib/lua/curl.so0000755000175000017500000066737410746420137013657 0ustar matthewmatthewELFa(04dk4 (p`p`p`pp\0`}x9[P=wCsSI:I\-pi.P'To)uMkO0y*@q[1 m>e&7b^nRf! UJ$`agY |H9 %zN~3|tpLd'.3A~5{:_ UV_rG bvmj@oc24"hWu}<l(<Wwn &*,$4C=!N%Y^]H6+i(#M\/AvxfSc7zQ`KaE)2>D"; eOdJhq8?B-ltLk#R{ ByFs/FQ?G6ZX1]+XVKgr,j5ZE0D8 T;0 T ` l` pxxt4  (D D DT XK4 |L c\ ,f  > B  ` XB$8 Ĥ M  B@G d 8 lp  X 2@z  (C L   F( $ 7G0 z XK T 0qpH Ndn` H < d,  ?` B L ]4 tI0 (^B  44 6dV0  ALA<   G$R4 TE$ # C |, n B l  ( vh  d  S^  j  8 m` T X L C,q @ C ? 7D `4x C T <yw C Rd  x A0C 4 T( 2   N Q v|H    tA nH0 4t  48 Jd <,M  L` - B , l y z ,  #p t8} P< Q@  `  j 8C r84 } w`$  4t'  ", hT0 [ B D s c h@   ЊX I 7@ +-4 =t D p P HC8  pL $ whKX NX n BI <VI Y F, \R@ ? pO(, | 4< g   /LL ;@ 0#b \   0L jXJ  ( < D (  {` L p  g DH = 5,h     H  C  $: $ 0  dB4  C )$]| 7$Of_ 4I N BP< ,L 4 T [G( ?HGX  P Fa]4 m 9L ]h f`K Tg@ i L$ 4E iK 1  (]$ T( -|p  pk PR  8  6@ 60 R@ p8 p & |Tt R x@   T | E c 4   M @C +  D\0 p _  =  xG VR0 H " <[ Fx3DG Jp  gH hDR    ,L 1 Y  d$ | < G0 _DYNAMIC__gmon_start___fini__cxa_finalize_Jv_RegisterClassesluaL_checkudataluaL_argerrorlua_typelua_typenamelua_tonumberlua_gettoplua_pushnilcurl_slist_free_alllua_tolstringlua_settopcurl_slist_appendlua_nextcurl_easy_performL_checknarglua_pushnumberlua_pushstringlua_pushlightuserdatalua_rawgetlua_pushlstringlua_calllua_objlenmemcpyL_tablesizeluaL_checklstringluaL_checkintegercurl_formaddcurl_easy_setoptcurl_formfreeluaL_checknumberlua_pushvaluelua_rawsetcurl_easy_initlua_newuserdatalua_getfieldlua_setmetatablecurl_easy_cleanupcurl_escapecurl_freecurl_unescapecurl_versioncurl_version_infolua_createtablelua_settableluacurl_openluaL_newmetatablelua_pushcclosureluaL_registerL_openconstluacurl_open_and_initcurl_global_initluaopen_curllua_tobooleanstderrluaL_errorL_openTconstL_checkludatalua_touserdatamemsetCurl_cmallocstrlenCurl_cstrdupcurl_strequalCurl_ccallocCurl_cfree__xstat64curl_mvsnprintfCurl_formcleanCurl_FormInit__xpg_basenamefopen64freadfcloseCurl_FormReaderCurl_formpostheaderCurl_FormBoundarysrandCurl_getFormDatastdincurl_formgetCurl_readCurl_multi_canPipeline__errno_locationCurl_ssl_recvfwriteCurl_debugcurl_msnprintfCurl_failfCurl_client_writememcmpCurl_writeCurl_strerrorCurl_ssl_sendCurl_sendfcurl_mvaprintfCurl_infofCurl_ssl_versioncurl_easy_escapeCurl_crealloccurl_easy_unescape__ctype_b_loc__strtol_internalstrcatcurl_mvfprintffputccurl_mvprintfstdoutcurl_mvsprintfcurl_mfprintfcurl_mprintfcurl_msprintfcurl_maprintfstrcasecmpcurl_strnequalstrncasecmpCurl_strcasestrCurl_strlcatCurl_ssl_initcurl_global_init_memcurl_global_cleanupCurl_global_host_cache_dtorCurl_ssl_cleanupCurl_openCurl_setoptCurl_mk_conncCurl_performCurl_global_host_cache_getCurl_mk_dnscacheCurl_hash_destroyCurl_closeCurl_easy_addmultiCurl_easy_initHandleDatacurl_easy_getinfoCurl_getinfocurl_easy_duphandleCurl_dupsetCurl_freesetCurl_cookie_initCurl_rm_connccurl_easy_resetCurl_safefreeCurl_hash_initCurl_llist_allocCurl_llist_destroyCurl_hash_allocCurl_hash_addCurl_llist_insert_nextCurl_hash_deleteCurl_llist_removeCurl_hash_pickCurl_hash_cleanCurl_hash_clean_with_criteriumCurl_hash_strCurl_str_key_comparecurl_multi_initCurl_multi_handlePipeBreakCurl_resolv_getsockCurl_single_getsockCurl_doing_getsockCurl_protocol_getsockcurl_multi_fdsetcurl_multi_cleanupCurl_disconnectcurl_multi_info_readcurl_multi_setoptcurlx_tvnowCurl_splaycurl_multi_timeoutCurl_expireCurl_splayremovebyaddrCurl_splayinsertcurlx_tvdiffCurl_removeHandleFromPipelineCurl_pretransferCurl_pgrsTimeCurl_connectCurl_addHandleToPipelineCurl_is_connectedCurl_http_connectCurl_is_resolvedCurl_async_resolvedCurl_protocol_connectingCurl_posttransferCurl_doneCurl_pgrsUpdateCurl_do_moreCurl_readwrite_initCurl_pre_readwriteCurl_isHandleAtHeadCurl_readwriteCurl_retry_requestCurl_doCurl_protocol_doingCurl_followCurl_protocol_connectcurl_multi_remove_handleCurl_multi_rmeasycurl_multi_performCurl_splaygetbestcurl_multi_socket_allcurl_multi_socket_actioncurl_multi_socketcurl_multi_add_handleCurl_ch_connccurl_multi_assigncurl_easy_strerrorcurl_multi_strerrorcurl_share_strerrorstrerror_rstrncpystrrchrCurl_wait_for_resolvCurl_ssl_config_matchesCurl_clone_ssl_configCurl_free_ssl_configCurl_ssl_connectCurl_ssl_connect_nonblockingCurl_ssl_close_allCurl_ssl_closeCurl_ssl_shutdownCurl_ssl_set_engineCurl_ssl_set_engine_defaultCurl_ssl_engines_listCurl_ssl_initsessionsCurl_ssl_check_cxnCurl_ssl_data_pendinggettimeofdaycurlx_tvdiff_secsCurl_tvlongCurl_global_host_cache_initCurl_num_addressesCurl_printable_addressCurl_inet_ntopCurl_hostcache_pruneCurl_share_lockCurl_share_unlockCurl_cache_addrCurl_resolv__sigsetjmpCurl_ipvalidCurl_getaddrinfoCurl_freeaddrinfocurl_jmpenvCurl_resolv_unlockCurl_pgrsResetTimesCurl_pgrsStartNowCurl_pgrsSetDownloadCounterCurl_pgrsSetUploadCounterCurl_pgrsSetDownloadSizeCurl_pgrsSetUploadSizefflushCurl_pgrsDoneCurl_cookie_getliststrncmpCurl_cookie_freelistCurl_cookie_clearallCurl_cookie_clearsessCurl_cookie_cleanupCurl_cookie_outputCurl_cookie_listCurl_cookie_addstrchrsscanf__rawmemchr__strtok_rstrcmp__strtoll_internalcurl_getdatefgetsCurl_cookie_loadfilesCurl_handler_httpCurl_httpCurl_http_doneCurl_base64_encodeCurl_http_should_failCurl_http_auth_actCurl_readrewindCurl_output_digestCurl_http_input_authCurl_input_digestCurl_compareheaderCurl_proxyCONNECTCurl_socket_readyCurl_httpchunk_initCurl_httpchunk_readCurl_reset_reqprotostrstrgmtime_rCurl_setup_transferCurl_monthCurl_wkday__ctype_toupper_locCurl_handler_ftpCurl_handler_telnetCurl_handler_dictCurl_handler_fileCurl_handler_tftpsiglongjmpCurl_digest_cleanupCurl_connecthostCurl_store_ip_addrCurl_SOCKS4Curl_SOCKS5memmove__strtoul_internalsigactionalarmcurl_getenv__ctype_tolower_locCurl_file_connectCurl_parsenetrcstrcpyCurl_pollgeteuidgetpwuidCurl_initinfoCurl_fillreadbufferfseekCurl_speedinitCurl_speedcheckCurl_nonblockfcntlgetsockoptgetprotobynamesetsockoptbindgetsocknameinet_addrinet_ptonCurl_if2ipCurl_llist_initCurl_llist_countcurl_share_initcurl_share_setoptcurl_share_cleanupCurl_digest_cleanup_oneCurl_md5itinet_ntoamktimesendtorecvfromfdopen__fxstat64lseek64Curl_base64_decodeCurl_handler_ftp_proxyacceptCurl_GetFTPResponseCurl_ftpsendfCurl_nbftpsendfgetnameinfolistenioctllibc.so.6__data_start_edata__bss_start__bss_start___end__bss_end____end__GLIBC_2.1.3GLIBC_2.2GLIBC_2.3GLIBC_2.1GLIBC_2.0si ii ii ii ii LPTX\`dhlptx|ĠȠ̠РԠؠܠ  $(,048<@DHLPTX\`dhlptx|ġȡ̡Сԡءܡ  HL|0488ĪȪTX\  $(,048<@DHDHLPTX\`dhlptx|tx|$(,tx|  $(Hlptx|@D|dhlp dhlD XHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx| hlptx| $(,04(,048<@DHLPTP        X    @DHLPTX\`dhx$|$$ %%%%% %$%(%,%0%4%8%<%@%D%H%L%040:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|:::::::::::::::::::::::::::::::::;;; ;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;=========================>>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>(?,?0?4?8?W$YWWtWW4C Cl C\CC C4C9CICTlCXnCțCCLC|CCCChCC<__`_ _p__|__,_\__ _ _ _` _d_____(____|_ _0_ 4_9_I_L_(M_Z_\_\_]_]___`_dl_Ln_o_(|_|_}_H_Ȋ_ _____X_h_ا_8_l_8_\__P_t____8_J_\K_8N_O_S_TY_ __0_0__p_\___\\Pn\d\Tl h |x'< T_\  PP  22 JJqhqql Gk@MkGDML`+@q+4++ Hq8Ĝ|22B-] -](-22G2O2l:p{tX \ ` dhlptx| !"#$%&'()*,-/023456789:;<=?@ ACDEF H$I(J,L0M4N8P<Q@RDSHTLVPWTXXY\Z`[d\h^l_p`taxb|defgijlmnopqrstuvwxyz{|}~  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|    !"#$&'()*+ ,-./0 1$2(3,4054687<8@9D;H<L=P>T?X@\A`BdDhElGpItJxK|LMNPRSTUVXYZ[]`abcdefghijlmnopqrsvwx yz|} $(,048<@DHLP-뷙-RƏ5ʌƏ5ʌ Ə5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌ|Ə5ʌtƏ5ʌlƏ5ʌdƏ5ʌ\Ə5ʌTƏ5ʌLƏ5ʌDƏ5ʌ<Ə5ʌ4Ə5ʌ,Ə5ʌ$Ə5ʌƏ5ʌƏ5ʌ Ə5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌƏ5ʌ|Ə5ʌtƏ5ʌlƏ5ʌdƏ5ʌ\Ə5ʌTƏ5ʌLƏ5ʌDƏ5ʌ<Ə5ʌ4Ə5ʌ,Ə5ʌ$Ə5ʌƏ5ʌƏ5ʌ Ə5ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$Ə4ʌƏ4ʌƏ4ʌ Ə4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$Ə4ʌƏ4ʌƏ4ʌ Ə4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$Ə4ʌƏ4ʌƏ4ʌ Ə4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$Ə4ʌƏ4ʌƏ4ʌ Ə4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$Ə4ʌƏ4ʌƏ4ʌ Ə4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$Ə4ʌƏ4ʌƏ4ʌ Ə4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$Ə4ʌƏ4ʌƏ4ʌ Ə4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌƏ4ʌ|Ə4ʌtƏ4ʌlƏ4ʌdƏ4ʌ\Ə4ʌTƏ4ʌLƏ4ʌDƏ4ʌ<Ə4ʌ4Ə4ʌ,Ə4ʌ$D- 00S C(0D-造P 0 R0l0Qd0 T00 R @000 R 000B  -D-000  R00S0B$- -LM 8 00 0S 00 K   -LM 4 00 0S y0 K   -L M  0' 0P0 P0YZ@ V8V 0S(V0S0S00S~8@Tp (ЍO Ѝ 0Y@S 0Q PT 5  `P` 0Y@S;P H5 p3 0[P PI PS P)Y00@S( $0:(0SY00@(010Y@S9 0 P 4 `P40Y  @S4 ,0Y@S 4P, 000,|u nSfP 3P 00P 3P | 0P0 P0[` A  $   0040 , 02 @P X Z R 0R0 0  0 0  ,0(PJ $0$0$@08` S V y @0S, 0S) 0S P P%  !$0S#  R 0S& %10#W00S .P] P00 0S  L 0S0L @@1 0R0 9 X @P0Uc *Y 0P P00P | 1 0TP P  P00= uptO-p@aP`Mℰ@P U P0`ЍPP  L0 P0S@@@[ YpP  P,0@ 0@. -p@-`PMM@ʍ@D 0 ( 0`Ѝڍp@Ѝ@-p@T,`PU@PQ0  00p@-@PpP$P`(0P (0 PP,PV@pp@-<@PP` @$0`p@-@p`hP0PP 0 TVP 0 0 0A-P\p ` 0S`$ 0@f0nS tP 0R0n`  0S _0` `PP\ 0000  @-)0`P T 000wl 4~'P@0(0c @(T O-@PQ PM00 B "2@ PP U`40T$PPq2P像2/  $ 0PP$PP iPP#PP$P {#0PP~$P `e ,\@ t#0TP\3U+0S 8#PP" @TZ 0#PPU@T"|PP(0 0 0PP!  2ߍ PK t2@T d2 TP, ~ 0PU$`VC $P(03 ,0S@a !7TP AU  !,0 0P  PP `!PP> L^@r f,\@\U$0S !0@PUZU 0PPy/ @ l 20t 7,0S@0{ , P@d7L.G-p MM: 0P:PU ``F0S @ T PU <Ѝڍ T  T* @t :P p@-0`@PP l0@P V00 @ 0SPp`p0`Pp@-p0`@PPU@pO-@`$P/ P+ 0pSYp, R/ 0CVP1P!UD19@ V1#1 RD01S'  pP U#Y/0000SpYp0(2S )R S  Q0S S @  D10D1pP @ DQHQ 0NpP@-@`pTQUM Ѝ\ $0 00 A-P`pMHP\ `\0A St0@x  0P 0Ѝ((000 0<8(-@-B^P@!kH`M 0 P \ 0 `2SЍ@ Ѝ=`>0pV `0 ((t0p=00O-@`p! \MS,  H\1   V 1SDЍ00V  1DV [` 2ASVX !萉 0S   SPP 0KP0`!#:[ P!;0  P U03`h050 S `F !;0P@  !`쐉 00@0 0`VP*, OP 0 S0C00\H@-@\ a^  0qW 9P u07PpP0S SP @, Pu07Pt -O-` M4000p1P% 0 0( @P0U@Pc  0?P  `2S 0`0U@Pc 0 ЍOЍ-0@-PPM M ` @A@D \$0 Ѝۍ0@ Ѝ?o0  Y0@-HPH _0`@SCRP 000O-RM;  1pP2 X - P`AT*00D S [* 0P! p0 `0HSP 0@ZTa0DS`0HS@P 00Ѝ 0 p  O-R@ME 1P( pHW` `0GS@`p%PP^00 P0G%S@` [00` Ѝ0  pHP0 0P-00@-@P100C@0 0 P $Q00000 S*0  0 p@-0@ `\ P  0S *`000p|0P 000`000p80P 00P0 0p0000O-`MM1 `/`/0S %S`0%S` {P@@[8<`0 CZRZE0C@D3S񟗝@d@@@@@@@@@@@@@@@@@@@@@@@@@0|T@0@@@@ @@@@@`ZR_,,D,,,,,,,|L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,<,,,,,,,,,,,,,,,4[HPPEh0! \0 S00`0 S@T0@00` [ 0dO `1P@d/0S %S d/0 d/`0S %S  pߍۍ`0@00 d/%P P@H0 0C₱p 00!/ 0 0 c 0N0@!/ 0! 0C SO8hp\\X P0uPPe44 R@B  @Dp0 S`4@U @  p@ U`p 40S@C  @Dp0 S`p "  pu ` 0 0d/X  `0@B c @ d/  pY d/`?P< = ČL4 A?@C= p ` , 0N0@!  P 00!_Pz= =X@|+0,,  `, @U,0L+|@p l00p  e0E00009M= 1@P  p P`z@  0Os0(@_ 0NX0p0   0pA00 pS`  p 0`M 00@S@PG  p @U`<P$ )9   @P $ 0s000( . ( $pǏ0 |0(@D0 (@ {P@( b $@T000SPa0a_ S7SPcC0A0S(0C(0$@ TXPE^p8p53 U@E  @Dp0C S`P Pp0@X`U0  U@E 0 @Dp0# S`P(.@ R*0 U@E   @Dp0 S`ʒ 08 0*SY  0<0ꀀ0P000[80pHP0PE1  80< 0  @Cp01  B@    <0C !@ 0 0 @@@00IpHP0PE1  pHP0PE1  pHP0PE1pHP0PE1  pHP0PE1pHP0PE1  pHP0PE1pHP0PE1  pHP0PE1  pHP0PE1wpHP0PE1  mpHP0PE1  dpHP0PE1おZpHP0PE1APPE>0S`:  p@Sʪ   F40`0`f00  g0G00<  $ N+ 00$0I; :  $ 0$ ;0  p 0 `Ax  p `-  p @@t00TPpp"  p p`= = pu= pt= pm+  p @ZX  p `U00PC 0U@A  @Dp0y S`P@(  pn P`0U@E   @Dp0\ S`  pR @`{ P   R< <tl.d(000APE(`-@ Q 00 0p P@${d @_ $ r`0 0  -0 $M, 0 Ѝt-(-M 0 Ѝ Ѝ-000-M  0uЍЍ-<-M 0 d0 Ѝ Ѝt@- @0M @@@ @Pp Q0SP Ѝ0S $00-@-@M 0 @@@ @!p Q 0SX Ѝ@Ѝ0S $00@-@ M 0@ R 0R00@C@ ЍT --M 0 ЍЍ-p3-;p3n@-@R:0S @ R P000^ 0S @` RR BPa00@- @00S0 d d0d `0` \0\ X0X T0  GP 80@A-RQ`p@P  US X X0 R ;P808 `40p, P(0@0@-< 0S@C0T(P@00@0-@0 RMP yPЍ-P+0-M  N0Ѝ Ѝ@-@P+0S 0S PP @ u2S 0S S 0 0S00NPPQ @- @40 0--M00-Ѝ Ѝ0@-P (1@P0 1P  <$4 P P 0SP PTQ LQPP @0 4S44 N4S T3L P$T3L #1P P 0P 0 3P \0P 03K8 <$0 0 P PA-@Pp1P.P/ 2#00 {?0`2!+0,  D1<0T $2?0L! 10" B1i? q吁4q8aT R|"2deP p@-8`P@0S ` pA-RQpP QS 00 pP@ W@`x|@1S `W0V!p#*@pVH@0A-QP`p@PM@ЍSR @00@P PP 0@G-`p @@T P 0P@T@ PP @P  : @ %P000  40 @A-Pp` @@T 0 0P@T 0A-`p @1PU @ 0PPU0@-@0S@00P0 0PU00G-`P0 qPUU 0 @P P 0U0C0Y@-@P00P@- #@" * n 2\#rQ- 0 \P0SQ0D  BD -00S-r0@-0x:>@P000PU 0PP PUXP PP0` 000XoPm00\0"R0 0@-!;0@P ^ 0C P@ P tllll@p@R 00@@R 00G-PpM :> 0R Ѝ@T`% ` P  P> 2! !!0P3 1 21| V `^@ T40`G-P :> 0R @P@X` 0S`0T0Q0S@ 00 ` 0`0ThPU !{`䐟p`@TP 0 R @TP` p@T ` 0S`P`dyPU@0P-0:> 0R@^ P 0S PP 0N@000C0@O-0 $M0 00000 R   Bp0cW0 1$0!X PPPP@T 0U T  HL0    PpW4P6 @` W  0Q   R 1Q0 0 0s X  P!  L0   HXP 0 0P  4`V@ !4p$Ѝ4 0X`00 0g@PL0@P  0P 0-PM :> 0R Ѝ Ѝ'<0 P  P- P  00L N0S PU 0@T K YP 0@T;Pt@ @0S P @  0S 0 R0S PR  @ThP~ g P? g0 l3S P1 0<7!;50 50C0 @RT P  '0SA Pk @T6 P 08 <  P 04AT<LP 0 41gR-l3Sʍ iO0UEd3S8    04  0@5!TB PU  p0Sb 0<W 0 0p P] pWR 5PyRU HP@ PUB{ 05AT8P 051l 6P@ 0S 0S PVh3S*i0 d3S`3S* PAh3Sn P7 3S R  Pp@3@P  sP@T4 0S@h3@P* 0 0x @00 @@0    0 P RIP0P 4 BPP 00!+5 Q y !;00S 4P@Q00_ 8V7`3SK  ?TA"<Pu 0 <y 0p o 00 P]PVOl0'WP> 00SO-`P :> 0R<$0#Q @T pQpWD00CD0!;50 R QQ50C0  qP0S0C00 0S 0Sx `0P:Q5 !R 0U00 !;0`2Ph00hhpPWԱ `0P !R 0R` QZI XY pPd4 R! 00 R00P0S 0P P0R<00C<0 0\4 8!< 0p0,0  R00PP{P z!;0YhP8G-PP M :> 0R  Ѝ`@  0S 0S% @P!;T0!k` p@ !;0@@ PT 0STD0Z0S00@E-`PM ,@rW X Pp @<$0 0R{<$0!QjpWg81`PhP X@  R 0X@p1Wh@@P `9 0S1 S4 P`04 0S> 00đ0` 0` 0b9<0`0 P<0d R P ZP h000P0 0 \D00D0.`04@-q@ M  XP0@ Ѝ0PP񟗪t;|;;;<;;;;;<;<;;;<;;;<;;<< <<<$<<,<4<<<<D<L<T<\<d<l<<t<|<<<<<<<<<<<<<<<<<<<<= ===$=,=4=<=D=L=T=\=d=l=t=|====  |xtplhd`\XTPLHD@<840,($  <Tx8pHXl,L`t,T|lp|DL\t  ( H\ XP ?????>>>@<840,($ pt   H   P???|?t?($ !HD!,!!0@-0@,]_Mt1 P 0 @ @ P 0e S@ŖP0e S00܍0 ^\!0000PQ-  P0@-@P 0R 0 0R 0RP P P P P00@-@P \ 0  0P% P 0P P h0P  P D0P P 0P 00@-@ @ 0S00 0S0000X@-QM3 00 @ 0 00cS!\ 00cS00 R'   00cS\ 00cS  @ 00 00Ѝ0S  00 000@-@RP Q > 0U 0cS0  0 P0 00 P0 @ 00 0 0Qp@-`P@0 @ 0`S Q @@p0S @ 0`S00Q 00@@pQP0@-@P0 p T0P 0  00 R0000S 0Q 00@-@M   Ѝ@-@bdc AfAcb@င.A@-8@\0, M(0$00ЍM@-@0S 00P0 0P0@-@0 ^@~ p! 00bS0S@-@$2s M 0S 0S p$”0 $ 00S3 ЍHHA-PpM`P0! @0  @P0 倀pPP >0 0 L 00Ѝ,0000@-$M 00tP0 0tPpyPPi ?@0S I0 0S 1 @T% $2s! 0S  $2P0QP 0S   x!G0S 0 0 0S, 0S   0 0R0  0 0$Ѝ00S@ P 0S  P  05@P 0S  0 0S L 0SHHx!0@- P@\ 0\0C000@.@-@0  0M@-@Q pM& d2`P2cbDcU]<<0Ud0E p Ѝd`@ F0 D Ѝ@d 0 Ѝ@!!!!G-YMHYY/ /O$aO$1`p pff@cd&OA0 !G_ ЍW 0OO$ !JFBZ0 !P'=0Y,'8>0Y@ < [eD!@0 )a;?0P$4c8C9CP5P*ffOd(J0  Py 0OO$ !?1BO  j0 | cqX* 7 eP @0 T E0( PK!!"!!!"!@-(03Cp3tCx3|C3C@-A@0MQ hQQQQ`QQDQ 4/ 䁄0Ѝ + :. ܁("( #3:. ⁄:.  :. ~ށ@-0@M4 #3Ѝ48#<@#R$(#T3@0T3 T3@0T3QR,0#T3 0T3 T3 0T3QO--M dDD@0#3 b0c!1AoAT7 @0D3HC0A8<70Q0/b ?b0DHXRA cR 0 1@0s_`phdWq4SxdV dW0@-@P C2D00@-@PxPtPP PPP(P$P0p@-@`P0@Ue050P0pG-@Tp`PU `: PU 0T//T,0S X P 0S' P @T   P00@P ``SS P 0SV P@`TP0@-0P@T0@-@P_0 00@-pPU` 0S@` UPP@( ` 00C 0TPp@-PPpP8`4`P @ TpG- QM Z 0.Sㄐ ||@,pP`Qd 00L\T@ZD W 4PP `@4ЍP/4#,#0:$#<#A-PP@ 0SApP 0` 0zPU p@P  PUXD`P,u.\#$X##A-PP 0S `V Php .PU `WpV g@PPO-@PBMMHs ;0P U"0#S PP PPDPU U# R  0S` U00sN P ;0SP  =P U00U0S vPU 0S @ P P P@ 0S S S ;}PP0S PPpW^ @YT0S  R0S 0@TV @T- PP BP P Q 9P P Q 0P -PU-0S80P0XXPP PP$P(P    0SP@0S 0T  (  ` `pJTU 00 0 $Ѝۍ 7 S S00S,$ppGp 0P4PK0S` 8P $7P E S S0SPP> p.W@.P @T3.W`[  ;P 0.S\6P 0 0@nP0,0 0R S SBB@ P00  0Q S S S@PHNP 5P( 0"S0 ( 4A. @T] :>P(W0.S@ppp3`U D0\ S@pT` WVTgP Pp`p` pP, 0p`Pp`p`Pp`p` 0S| 0S" @`  0SU \00A. $@z U @ ``P@0 S @a0S@@V0p 0s03V0S> <gPS0SA0S P 00.L/PK L0aPH!P  L0 @0W LPp`p` N0E[ 0P@0P Bi}Pp00` <0  $$$$$$$$$$$$,#4#`$$,$0:E-R@PMM pTp XP;0S;p`V. N $1@P# N YP  P0 0Q Q QQ0W"00Ѝh0`\;p`D0PP T000.%p %0@-@SU0 E#1rPUS0p@-@`ATP  P@Tpp@-p^G_ `BN@0|0M 06P PT@P@H0WD <0SЍD%L% %0  0000 00000 10000Q2S 0 p R 0S 1S >e0RRR R0S !;0R0SA-`P dR; !K@0S30S >0Rc 0S KR^p0S e?0R\ 0S KRWWg 2Pz 1SS@P  @Q2S@0S0S @ ^ p3 0p0 V Q0QN 0 !;0 RM 0C0 RH 000 p @P ! :pP00! 3P!;0  !R9 RB RG P0KS!{p@T0S 1SS 0P00@P0q  Q R T1S P0@0q o0Sj0 LScpqMpz}Q:%T%G-Pp!k!K\`@ 0S R0 R'\0 0!;40 R*0SK S7 0 0P0 0 00SXK X^ 0 00S \ 0S  R 0S!;80P \PS2S0 0 0S 0R 0 |0 00s03 0 0yP   PP  0S0Q 0 R00 | 00s03 0 0NP4<PP w&%%%%%G-e?0QPP@l!{l!{`p`pT= O@P 0000eY 000 P Y!;0  P (P 000 P U @@;!;0P&00  @T%X&0&%G-@ 0P`H0S H0S00W 0   +@p0S0 V  0S @  @`H 4<80 p`L P1@`Dp H -(0  P00O-P M0 0p` @90 pP`2S