From 6474b9356bcc521c669fbdbbb707fba4e99489c9 Mon Sep 17 00:00:00 2001 From: 20kdc Date: Sun, 18 Mar 2018 23:10:54 +0000 Subject: [PATCH] With SYSTEM HEROES making continuing feasible, FIRST COMMIT --- .gitignore | 6 + README.md | 79 +++++ code/apps/app-claw.lua | 338 ++++++++++++++++++ code/apps/app-fm.lua | 13 + code/apps/app-launcher.lua | 41 +++ code/apps/app-pass.lua | 47 +++ code/apps/app-taskmgr.lua | 134 +++++++ code/apps/app-textedit.lua | 423 ++++++++++++++++++++++ code/apps/sys-donkonit.lua | 295 ++++++++++++++++ code/apps/sys-everest.lua | 639 +++++++++++++++++++++++++++++++++ code/apps/sys-icecap.lua | 137 +++++++ code/apps/sys-init.lua | 417 ++++++++++++++++++++++ code/init.lua | 667 +++++++++++++++++++++++++++++++++++ code/libs/event.lua | 104 ++++++ code/libs/neoux.lua | 406 +++++++++++++++++++++ code/libs/serial.lua | 28 ++ code/libs/sys-filedialog.lua | 159 +++++++++ code/libs/sys-filevfs.lua | 181 ++++++++++ code/libs/sys-filewrap.lua | 42 +++ code/libs/sys-secpolicy.lua | 90 +++++ com2/bdivide.lua | 58 +++ com2/bundiv.lua | 64 ++++ com2/preproc.lua | 17 + heroes.lua | 32 ++ insthead.lua | 103 ++++++ mkucinst.lua | 24 ++ preSH.tar.gz | Bin 0 -> 294267 bytes repository/app-eeprog.lua | 48 +++ repository/list | 3 + 29 files changed, 4595 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 code/apps/app-claw.lua create mode 100644 code/apps/app-fm.lua create mode 100644 code/apps/app-launcher.lua create mode 100644 code/apps/app-pass.lua create mode 100644 code/apps/app-taskmgr.lua create mode 100644 code/apps/app-textedit.lua create mode 100644 code/apps/sys-donkonit.lua create mode 100644 code/apps/sys-everest.lua create mode 100644 code/apps/sys-icecap.lua create mode 100644 code/apps/sys-init.lua create mode 100644 code/init.lua create mode 100644 code/libs/event.lua create mode 100644 code/libs/neoux.lua create mode 100644 code/libs/serial.lua create mode 100644 code/libs/sys-filedialog.lua create mode 100644 code/libs/sys-filevfs.lua create mode 100644 code/libs/sys-filewrap.lua create mode 100644 code/libs/sys-secpolicy.lua create mode 100644 com2/bdivide.lua create mode 100644 com2/bundiv.lua create mode 100644 com2/preproc.lua create mode 100644 heroes.lua create mode 100644 insthead.lua create mode 100644 mkucinst.lua create mode 100644 preSH.tar.gz create mode 100644 repository/app-eeprog.lua create mode 100644 repository/list diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a0c2815 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# leaving in preSH.tar.gz for anyone who's interested +# in how NOT to do compression +code.tar +inst.lua +com2/code.tar.bd + diff --git a/README.md b/README.md new file mode 100644 index 0000000..5572fed --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# KittenOS NEO +### efficient. multi-tasking. clean. security-oriented. + +# WARNING! STATUS: UNSTABLE! + +The first commit is after I got the installer working again after the new compression system (BDIVIDE). + +The older compression systems (which are not compatible with `heroes.lua`) are kept in preSH.tar.gz in case you want to see how NOT to do things. + +## Description + +KittenOS NEO is an OpenComputers operating system designed for Tier 1 hardware. + +This means, among other things, it has an operating overhead limit of 192KiB real-world (on 32-bit). + +Unlike the original KittenOS (now in the "legacy" branch), it is also designed with some attempt at cleanliness. + +## User Guide + +It is recommended that you take out your OpenComputers CPU, and shift-right-click until it says "Architecture: Lua 5.3", if possible. + +Then simply download the installer from inst.lua here, rename it to "init.lua" and put it on a blank disk. + +Finally, remove all other disks and reboot. + +KittenOS NEO will install itself. + +(This does not account for custom EEPROMs.) + +## Policy regarding updates + +KittenOS NEO's installer, including the full KittenOS NEO base operating system, is 65536 bytes or below. + +As the installer must be loaded in full into RAM, this is not negotiable. + +If it can't be kept this way with the current compressor, then a better compressor will have to be made. + +All kernel or security-critical `sys-` process bugs will cause an installer update. + +Other bugs will merely result in an updated copy in the repository. + +This copy will be copied to installer code if and only if another condition requires the installer code be updated. + +The code in the `code/` folder is the code meant for the installer. + +Non-installer code is in the `repository/`, (WORKING ON THIS) and thus accessible via CLAW. + +(NOTE: HTTPS is not used for this due to OC/OCEmu issues.) + +Requests for additional features in system APIs will NOT cause an installer update. + +## Building + +The tools are meant for internal use, so are thus designed to run on some generic Unix. + +Firstly, you can create a "raw installer" (uncompressed) with `mkucinst.lua`. + +This executes `tar -cf code.tar code`, which you will need to do in any case - the installer contains a compressed TAR. + +Secondly, for a compressed installer, after creating the TAR, `symsear-st1.sh`, `symsear-st2.sh`, and `symsear-st4.sh` (st3 is executed by st2) are used. + +## Kernel Architecture + +KittenOS NEO is an idea of what a Lua-based efficient microkernel would look like. + +Scheduling is based entirely around uptime and timers, + which cause something to be executed at a given uptime. + +## Installer Architecture + +The installer is split into a generic TAR extractor frontend `insthead.lua` and a replacable compression backend (written in by relevant tools - in current versions, `heroes.lua` is where it starts). + +There was more details on this but the details changed. + +## License + + This is released into the public domain. + No warranty is provided, implied or otherwise. + diff --git a/code/apps/app-claw.lua b/code/apps/app-claw.lua new file mode 100644 index 0000000..656d021 --- /dev/null +++ b/code/apps/app-claw.lua @@ -0,0 +1,338 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- app-claw: Package manager. + +-- HTTP-only because OCEmu SUCKS +local source = "http://20kdc.duckdns.org/neo/" + +local primaryINet = neo.requestAccess("c.internet") +if primaryINet then primaryINet = primaryINet.list()() end + +local function pkgExists(pkg, isApp) + local b = {} + if isApp then + b = neo.listApps() + else + b = neo.listLibs() + end + for _, v in ipairs(b) do + if v == pkg then return true end + end +end + +-- global app variables +-- elements: +-- { +-- description, +-- dlURL/nil, +-- localPath, +-- isApp, +-- } +local packages = {} +local packageList = {} +local libList = {} -- removed after scan +local windows = 1 +local searchTx = "" +local primaryWindowRegen +-- + +local event = require("event")(neo) +local neoux, err = require("neoux") +if not neoux then error(err) end +neoux = neoux(event, neo) + +local function download(url) + if not primaryINet then return nil, "no internet" end + local req, err = primaryINet.request(url) + if not req then + return nil, tostring(err) + end + local ok, err = req.finishConnect() + if not req.finishConnect() then + req.close() + return nil, tostring(err) + end + local dt = "" + while true do + local n, n2 = req.read() + if not n then + req.close() + if n2 then + return nil, n2 + else + break + end + else + if n == "" then + -- slightly dangerous, but what can we do? + event.sleepTo(os.uptime() + 0.05) + end + dt = dt .. n + end + end + req.close() + return dt +end + +local function readLocal() + -- Read apps & libs + local function isLua(v) + if v:sub(#v - 3) == ".lua" then + return v:sub(1, #v - 4) + end + end + for _, pkg in ipairs(neo.listApps()) do + table.insert(packageList, pkg) + packages[pkg] = { + "A pre-installed or self-written process.", + nil, + "apps/" .. pkg .. ".lua", + true + } + end + for _, pkg in ipairs(neo.listLibs()) do + table.insert(libList, pkg) + packages[pkg] = { + "A pre-installed or self-written library.", + nil, + "libs/" .. pkg .. ".lua", + false + } + end +end + +local function getEntry(name, isApp) + if packages[name] then + if packages[name][4] ~= isApp then + return + end + else + local path = "libs/" .. name .. ".lua" + if isApp then + path = "apps/" .. name .. ".lua" + end + packages[name] = {"An unknown entry, lost to time.", nil, path, isApp} + if isApp then + table.insert(packageList, name) + else + table.insert(libList, name) + end + end + return packages[name] +end + +local function readWeb() + local listData, err = download(source .. "list") + if not listData then + neoux.startDialog("Couldn't get web index: " .. err, "web", true) + return + end + --neoux.startDialog(listData, "web", false) + listData = (listData .. "\n"):gmatch(".-\n") + local function listDataStrip() + local l = listData() + if not l then + return + end + l = l:sub(1, #l - 1) + return l + end + while true do + local l = listDataStrip() + if not l then return end + if l == "end" then return end + local ent = getEntry(l:sub(5), l:sub(1, 4) == "app ") + if ent then + ent[1] = listDataStrip() or "PARSE ERROR" + ent[2] = source .. l:sub(5) .. ".lua" + end + end +end + +readLocal() +if source then + readWeb() +end + +table.sort(packageList) +table.sort(libList) +for _, v in ipairs(libList) do + table.insert(packageList, v) +end +libList = nil + +local function startPackageWindow(pkg) + windows = windows + 1 + local downloading = false + local desc = packages[pkg][1] + local isApp = packages[pkg][4] + local isSysSvc = isApp and (pkg:sub(1, 4) == "sys-") + local isSvc = isSysSvc or (isApp and (pkg:sub(1, 4) == "svc-")) + local settings + if isSvc then + settings = neo.requestAccess("x.neo.sys.manage") + end + local function update(w) + if downloading then return end + downloading = true + local fd = download(packages[pkg][2]) + local msg = "Success!" + if fd then + local primaryDisk = neo.requestAccess("c.filesystem").primary + local f = primaryDisk.open(packages[pkg][3], "wb") + primaryDisk.write(f, fd) + primaryDisk.close(f) + else + msg = "Couldn't download." + end + w.close() + windows = windows - 1 + primaryWindowRegen() + -- Another event loop so the program won't exit too early. + neoux.startDialog(msg, pkg, true) + downloading = false + end + + local elems = { + neoux.tcrawview(1, 1, neoux.fmtText(unicode.safeTextFormat(desc), 30)), + } + -- {txt, run} + local buttonbar = {} + if pkgExists(pkg, isApp) then + if isApp then + if not isSvc then + table.insert(buttonbar, {"Start", function (w) + neo.executeAsync(pkg) + w.close() + windows = windows - 1 + end}) + else + if not isSysSvc then + table.insert(buttonbar, {"Start", function (w) + neo.executeAsync(pkg) + w.close() + windows = windows - 1 + end}) + end + if settings.getSetting("run." .. pkg) == "yes" then + table.insert(buttonbar, {"Disable", function (w) + settings.setSetting("run." .. pkg, "no") + w.close() + windows = windows - 1 + end}) + else + table.insert(buttonbar, {"Enable", function (w) + settings.setSetting("run." .. pkg, "yes") + w.close() + windows = windows - 1 + end}) + end + end + end + if packages[pkg][2] then + table.insert(buttonbar, {"Update", update}) + end + table.insert(buttonbar, {"Delete", function (w) + local primaryDisk = neo.requestAccess("c.filesystem").primary + primaryDisk.remove(packages[pkg][3]) + w.close() + windows = windows - 1 + primaryWindowRegen() + end}) + else + if packages[pkg][2] then + table.insert(buttonbar, {"Install", update}) + end + end + local x = 1 + for _, v in ipairs(buttonbar) do + local b = neoux.tcbutton(x, 10, v[1], v[2]) + x = x + (#v[1]) + 2 + table.insert(elems, b) + end + neoux.create(30, 10, pkg, neoux.tcwindow(30, 10, elems, function (w) + w.close() + windows = windows - 1 + end, 0xFFFFFF, 0)) +end + +local genwin, primaryWindow +local primaryWindowPage = 1 +local primaryWindowList = packageList + +function primaryWindowRegen() + primaryWindow.reset(20, 8, genwin(primaryWindowPage, primaryWindowList)) +end + +genwin = function (page, efList) + local pages = math.ceil(#efList / 6) + local elems = { + neoux.tcbutton(18, 1, "+", function (w) + if page < pages then + primaryWindowPage = page + 1 + primaryWindowRegen() + end + end), + neoux.tcrawview(4, 1, {neoux.pad(page .. " / " .. pages, 14, true, true)}), + neoux.tcbutton(1, 1, "-", function (w) + if page > 1 then + primaryWindowPage = page - 1 + primaryWindowRegen() + end + end) + } + local base = (page - 1) * 6 + for i = 1, 6 do + local ent = efList[base + i] + if ent then + local enttx = ent + if packages[ent][4] then + enttx = "A " .. enttx + else + enttx = "L " .. enttx + end + if pkgExists(ent, packages[ent][4]) then + if packages[ent][2] then + enttx = "I" .. enttx + else + enttx = "i" .. enttx + end + else + enttx = " " .. enttx + end + table.insert(elems, neoux.tcbutton(1, i + 1, unicode.safeTextFormat(enttx), function (w) + -- Start a dialog + startPackageWindow(ent) + end)) + end + end + table.insert(elems, neoux.tcfield(1, 8, 11, function (s) + if s then searchTx = s end + return searchTx + end)) + table.insert(elems, neoux.tcbutton(12, 8, "Search!", function (w) + local n = {} + for _, v in ipairs(packageList) do + for i = 1, #v do + if v:sub(i, i + #searchTx - 1) == searchTx then + table.insert(n, v) + break + end + end + end + primaryWindowPage = 1 + primaryWindowList = n + primaryWindowRegen() + end)) + return neoux.tcwindow(20, 8, elems, function (w) + w.close() + windows = windows - 1 + end, 0xFFFFFF, 0) +end + +primaryWindow = neoux.create(20, 8, "claw", genwin(1, packageList)) + +while windows > 0 do + event.pull() +end diff --git a/code/apps/app-fm.lua b/code/apps/app-fm.lua new file mode 100644 index 0000000..1b0d1e2 --- /dev/null +++ b/code/apps/app-fm.lua @@ -0,0 +1,13 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- app-fm: dummy app to start FM +neo.requestAccess("x.neo.pub.base").showFileDialogAsync(nil) +while true do + local x = {coroutine.yield()} + if x[1] == "x.neo.pub.base" then + if x[2] == "filedialog" then + return + end + end +end diff --git a/code/apps/app-launcher.lua b/code/apps/app-launcher.lua new file mode 100644 index 0000000..e2801f0 --- /dev/null +++ b/code/apps/app-launcher.lua @@ -0,0 +1,41 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- app-launcher: The launcher +local event = require("event")(neo) +local neoux, err = require("neoux") +if not neoux then error(err) end -- This app is basically neoux's testcase +neoux = neoux(event, neo) + +local running = true + +local buttons = {} +local xlen = 0 +local appNames = neo.listApps() +for k, v in ipairs(appNames) do + if v:sub(1, 4) == "app-" then + local vl = unicode.len(v) + if xlen < vl then + xlen = vl + end + table.insert(buttons, neoux.tcbutton(1, #buttons + 1, v, function (w) + -- Button pressed. + local pid, err = neo.executeAsync(v) + if not pid then + neoux.startDialog(tostring(err), "launchErr") + else + w.close() + running = false + end + end)) + end +end + +neoux.create(xlen + 2, #buttons, nil, neoux.tcwindow(xlen + 2, #buttons, buttons, function (w) + w.close() + running = false +end, 0xFFFFFF, 0)) + +while running do + event.pull() +end diff --git a/code/apps/app-pass.lua b/code/apps/app-pass.lua new file mode 100644 index 0000000..cf507bb --- /dev/null +++ b/code/apps/app-pass.lua @@ -0,0 +1,47 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- app-pass: The password setter +local settings = neo.requestAccess("x.neo.sys.manage") +if not settings then error("no management") return end + +local event = require("event")(neo) +local neoux, err = require("neoux") +if not neoux then error(err) end +neoux = neoux(event, neo) + +local running = true + +local pw = settings.getSetting("password") +neoux.create(20, 2, nil, neoux.tcwindow(20, 2, { + neoux.tcfield(1, 1, 12, function (set) + if not set then + return pw + end + pw = set + end), + neoux.tcbutton(13, 1, "set PW", function (w) + settings.setSetting("password", pw) + w.close() + running = false + end), + neoux.tcbutton(1, 2, "log out", function (w) + w.close() + running = false + local session = neo.requestAccess("x.neo.sys.session") + if not session then return end + session.endSession(true) + end), + neoux.tcbutton(11, 2, "shutdown", function (w) + w.close() + running = false + settings.shutdown(false) + end) +}, function (w) + w.close() + running = false +end, 0xFFFFFF, 0)) + +while running do + event.pull() +end diff --git a/code/apps/app-taskmgr.lua b/code/apps/app-taskmgr.lua new file mode 100644 index 0000000..58d680a --- /dev/null +++ b/code/apps/app-taskmgr.lua @@ -0,0 +1,134 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- app-taskmgr: Task manager +-- a-hello : simple test program for Everest. + +local everest = neo.requestAccess("x.neo.pub.window") +if not everest then error("no everest") return end + +local kill = neo.requestAccess("k.kill") + +local sW, sH = 20, 8 +local headlines = 2 + +local window = everest(sW, sH) +if not window then error("no window") end + +local lastIdleTimeTime = os.uptime() +local lastIdleTime = neo.totalIdleTime() +local cpuPercent = 100 + +local lastCPUTimeRecord = {} +local cpuCause = "(none)" + +local camY = 1 +-- elements have {pid, text} +local consistentProcList = {} + +local function drawLine(n) + local red = false + local idx = (camY + n) - (headlines + 1) + local stat = ("~"):rep(sW) + if n == 1 then + -- x.everest redraw. Since this window only has one line... + local usage = math.floor((os.totalMemory() - os.freeMemory()) / 1024) + stat = usage .. "/" .. math.floor(os.totalMemory() / 1024) .. "K, CPU " .. cpuPercent .. "%" + red = true + elseif n == 2 then + stat = "MAX:" .. cpuCause + red = true + elseif consistentProcList[idx] then + if idx == camY then + stat = ">" .. consistentProcList[idx][2] + else + stat = " " .. consistentProcList[idx][2] + end + end + stat = unicode.safeTextFormat(stat) + while unicode.len(stat) < sW do stat = stat .. " " end + if red then + window.span(1, n, unicode.sub(stat, 1, sW), 0xFFFFFF, 0) + else + window.span(1, n, unicode.sub(stat, 1, sW), 0x000000, 0xFFFFFF) + end +end +local function updateConsistentProcList(pt, lp) + local tbl = {} + local tbl2 = {} + local tbl3 = {} + for _, v in ipairs(pt) do + table.insert(tbl, v[1]) + tbl2[v[1]] = v[2] .. "/" .. v[1] .. " " .. tostring(lp[v[1]]) .. "%" + end + table.sort(tbl) + for k, v in ipairs(tbl) do + tbl3[k] = {v, tbl2[v]} + end + consistentProcList = tbl3 +end +local p = os.uptime() +neo.scheduleTimer(p) +while true do + local n = {coroutine.yield()} + if n[1] == "x.neo.pub.window" then + if n[3] == "line" then + drawLine(n[4]) + end + if n[3] == "close" then + return + end + if n[3] == "key" then + if n[6] then + if n[4] == 8 then + if consistentProcList[camY] then + kill(consistentProcList[camY][1]) + end + end + if n[5] == 200 then + camY = camY - 1 + if camY < 1 then camY = 1 end + for i = (headlines + 1), sH do drawLine(i) end + end + if n[5] == 208 then + camY = camY + 1 + for i = (headlines + 1), sH do drawLine(i) end + end + end + end + end + if n[1] == "k.timer" then + local now = os.uptime() + local nowIT = neo.totalIdleTime() + local tD = now - lastIdleTimeTime + local iD = nowIT - lastIdleTime + cpuPercent = math.ceil(((tD - iD) / tD) * 100) + lastIdleTimeTime = now + lastIdleTime = nowIT + + local newRecord = {} + cpuCause = "(none)" + local causeUsage = 0 + local pt = neo.listProcs() + local localPercent = {} + for _, v in ipairs(pt) do + -- pkg, pid, cpuTime + local baseline = 0 + if lastCPUTimeRecord[v[1]] then + baseline = lastCPUTimeRecord[v[1]] + end + local val = v[3] - baseline + localPercent[v[1]] = math.ceil(100 * (val / tD)) + if causeUsage < val then + cpuCause = v[2] .. "/" .. v[1] + causeUsage = val + end + newRecord[v[1]] = v[3] + end + lastCPUTimeRecord = newRecord + updateConsistentProcList(pt, localPercent) + for i = 1, sH do drawLine(i) end + p = p + 1 + neo.scheduleTimer(p) + end +end diff --git a/code/apps/app-textedit.lua b/code/apps/app-textedit.lua new file mode 100644 index 0000000..8eff7e0 --- /dev/null +++ b/code/apps/app-textedit.lua @@ -0,0 +1,423 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- 'neolithic': Text Editor +-- This was textedit (femto) from KittenOS brought kicking and screaming into the NEO world +-- It also has fixes for bugs involving wide text, and runs faster due to the chars -> lines change. + +-- needs translation??? figure out how to do translation in the new system NICELY +local lines = { + "Neolithic: Text Editor", + "^A, ^S, ^Q: Load, Save, New", + "^C, ^V, ^D: Copy, Paste, Delete Line", + -- These two are meant to replace similar functionality in GNU Nano + -- (which I consider the best console text editor out there - Neolithic is an *imitation* and a poor one at that), + -- except fixing a UI flaw by instead making J responsible for resetting the append flag, + -- so the user can more or less arbitrarily mash together lines + "^J: Reset 'append' flag for Cut Lines", + "^K: Cut Line(s)", + "^: Resize Win", + "'^' is Control.", + "Wide text can be pasted in,", + " using your 'actual' clipboard.", + "For example, this.", +} + +-- If replicating Nano's clipboard : +-- Nano starts off in a "replace" mode, +-- and then after an action occurs switches to "append" until *any cursor action is performed*. +-- The way I have things setup is that you perform J then K(repeat) *instead*, which means you have to explicitly say "destroy current clipboard". + +local event = require("event")(neo) +local clipboard = neo.requestAccess("x.neo.pub.clip.text") +if not clipboard then + local clipboardData = "" + clipboard = { + copy = function (text) clipboardData = text end, + paste = function () return clipboardData end + } +end + +local cursorX = 1 +local cursorY = math.ceil(#lines / 2) +local cFlash = true +local ctrlFlag = false +local dialogLock = false +local appendFlag = false +local sW, sH = 37, #lines + 2 +local window = neo.requestAccess("x.neo.pub.window")(sW, sH) +local flush + +local function splitCur() + local s = lines[cursorY] + local st = unicode.sub(s, 1, cursorX - 1) + local en = unicode.sub(s, cursorX) + return st, en +end + +local function clampCursorX() + local s = lines[cursorY] + if unicode.len(s) < (cursorX - 1) then + cursorX = unicode.len(s) + 1 + return true + end + return false +end + +local function fileDialog(writing, callback) + local tag = neo.requestAccess("x.neo.pub.base").showFileDialogAsync(writing) + local f + function f(_, evt, tag2, res) + if evt == "filedialog" then + if tag == tag2 then + callback(res) + event.ignore(f) + end + end + end + event.listen("x.neo.pub.base", f) +end + +-- Save/Load +local function startSave() + dialogLock = true + fileDialog(true, function (res) + dialogLock = false + if res then + for k, v in ipairs(lines) do + if k ~= 1 then + res.write("\n" .. v) + else + res.write(v) + end + end + res.close() + end + end) +end + +local function startLoad() + dialogLock = true + fileDialog(false, function (res) + dialogLock = false + if res then + lines = {} + local lb = "" + while true do + local l = res.read(64) + if not l then + table.insert(lines, lb) + cursorX = 1 + cursorY = 1 + res.close() + flush() + return + end + local lp = l:find("\n") + while lp do + lb = lb .. l:sub(1, lp - 1) + table.insert(lines, lb) + lb = "" + l = l:sub(lp + 1) + lp = l:find("\n") + end + lb = lb .. l + end + end + end) +end + +local function getline(y) + -- do rY first since unw + -- only requires that + -- horizontal stuff be + -- messed with... + -- ...thankfully + local rY = (y + cursorY) - math.ceil(sH / 2) + + -- rX is difficult! + local rX = 1 + local Xthold = math.floor(sW / 2) + local _, cursorXP = unicode.safeTextFormat(lines[cursorY], cursorX) + if cursorXP > Xthold then + rX = rX + (cursorXP - Xthold) + end + local line = lines[rY] + if not line then + return ("¬"):rep(sW) + end + line = unicode.safeTextFormat(line) + -- + local tl = unicode.sub(line, rX, rX + sW - 1) + cursorXP = (cursorXP - rX) + 1 + if cFlash then + if rY == cursorY then + if cursorXP >= 1 then + if cursorXP <= sW then + local start = unicode.sub(tl, 1, cursorXP - 1) + local endx = unicode.sub(tl, cursorXP + 1) + tl = start .. "_" .. endx + end + end + end + end + while unicode.len(tl) < sW do + tl = tl .. " " + end + return tl +end +local function delLine() + local contents = lines[cursorY] + if cursorY == #lines then + if cursorY == 1 then + lines[1] = "" + else + cursorY = cursorY - 1 + lines[#lines] = nil + end + else + table.remove(lines, cursorY) + end + return contents +end +-- add a single character +local function putLetter(ch) + if ch == "\r" then + local a, b = splitCur() + lines[cursorY] = a + table.insert(lines, cursorY + 1, b) + cursorY = cursorY + 1 + cursorX = 1 + return + end + local a, b = splitCur() + a = a .. ch + lines[cursorY] = a .. b + cursorX = unicode.len(a) + 1 +end +local function ev_key(ka, kc, down) + if dialogLock then + return false + end + if kc == 29 then + ctrlFlag = down + return false + end + if ctrlFlag then + if not down then return false end + if kc == 200 then -- Up + sH = sH - 1 + if sH == 0 then + sH = 1 + end + sW, sH = window.setSize(sW, sH) + end + if kc == 208 then -- Down + sH = sH + 1 + sW, sH = window.setSize(sW, sH) + end + if kc == 203 then -- Left + sW = sW - 1 + if sW == 0 then + sW = 1 + end + sW, sH = window.setSize(sW, sH) + end + if kc == 205 then -- Right + sW = sW + 1 + sW, sH = window.setSize(sW, sH) + end + if kc == 31 then -- S + startSave() + end + if kc == 30 then -- A + startLoad() + end + if kc == 16 then -- Q + lines = {""} + cursorX = 1 + cursorY = 1 + return true + end + if kc == 32 then -- D + delLine() + return true + end + if kc == 46 then -- C + clipboard.copy(lines[cursorY]) + end + if kc == 36 then -- J + appendFlag = false + end + if kc == 37 then -- K + if appendFlag then + local base = clipboard.paste() + clipboard.copy(base .. "\n" .. delLine()) + else + clipboard.copy(delLine()) + end + appendFlag = true + return true + end + if kc == 47 then -- V + local tx = clipboard.paste() + local txi = tx:find("\n") + local nt = {} + while txi do + table.insert(nt, 1, tx:sub(1, txi - 1)) + tx = tx:sub(txi + 1) + txi = tx:find("\n") + end + table.insert(lines, cursorY, tx) + for _, v in ipairs(nt) do + table.insert(lines, cursorY, v) + end + return true + end + return false + end + -- action keys + if not down then + return false + end + if kc == 200 or kc == 201 then -- Go up one - go up page + local moveAmount = 1 + if kc == 201 then + moveAmount = math.floor(sH / 2) + end + cursorY = cursorY - moveAmount + if cursorY < 1 then + cursorY = 1 + end + clampCursorX() + return true + end + if kc == 208 or kc == 209 then -- Go down one - go down page + local moveAmount = 1 + if kc == 209 then + moveAmount = math.floor(sH / 2) + end + cursorY = cursorY + moveAmount + if cursorY > #lines then + cursorY = #lines + end + clampCursorX() + return true + end + if kc == 203 then + if cursorX > 1 then + cursorX = cursorX - 1 + else + if cursorY > 1 then + cursorY = cursorY - 1 + cursorX = unicode.len(lines[cursorY]) + 1 + else + return false + end + end + return true + end + if kc == 205 then + cursorX = cursorX + 1 + if clampCursorX() then + if cursorY < #lines then + cursorY = cursorY + 1 + cursorX = 1 + end + end + return true + end + if kc == 199 then + cursorX = 1 + return true + end + if kc == 207 then + cursorX = unicode.len(lines[cursorY]) + 1 + return true + end + if ka == 8 then + if cursorX == 1 then + if cursorY == 1 then + return false + end + local l = table.remove(lines, cursorY) + cursorY = cursorY - 1 + cursorX = unicode.len(lines[cursorY]) + 1 + lines[cursorY] = lines[cursorY] .. l + else + local a, b = splitCur() + a = unicode.sub(a, 1, unicode.len(a) - 1) + lines[cursorY] = a.. b + cursorX = cursorX - 1 + end + return true + end + if ka ~= 0 then + putLetter(unicode.char(ka)) + return true + end + return false +end + +local function ev_clipboard(t) + for i = 1, unicode.len(t) do + local c = unicode.sub(t, i, i) + if c ~= "\r" then + if c == "\n" then + c = "\r" + end + putLetter(c) + end + end +end + +flush = function () + for i = 1, sH do + window.span(1, i, getline(i), 0xFFFFFF, 0) + end +end +local flash +flash = function () + cFlash = not cFlash + -- reverse: + --local rY = (y + cursorY) - math.ceil(sH / 2) + local csY = math.ceil(sH / 2) + window.span(1, csY, getline(csY), 0xFFFFFF, 0) + event.runAt(os.uptime() + 0.5, flash) +end +event.runAt(os.uptime() + 0.5, flash) + +while true do + local e = {event.pull()} + if e[1] == "x.neo.pub.window" then + if e[2] == window.id then + if e[3] == "touch" then + -- reverse: + --local rY = (y + cursorY) - math.ceil(sH / 2) + local csY = math.ceil(sH / 2) + local nY = math.max(1, math.min(#lines, (math.floor(e[5]) - csY) + cursorY)) + cursorY = nY + clampCursorX() + flush() + end + if e[3] == "key" then + if ev_key(e[4], e[5], e[6]) then + flush() + end + end + if e[3] == "line" then + window.span(1, e[4], getline(e[4]), 0xFFFFFF, 0) + end + if e[3] == "focus" then + ctrlFlag = false + end + if e[3] == "close" then + return + end + if e[3] == "clipboard" then + ev_clipboard(e[4]) + flush() + end + end + end +end diff --git a/code/apps/sys-donkonit.lua b/code/apps/sys-donkonit.lua new file mode 100644 index 0000000..a7ba429 --- /dev/null +++ b/code/apps/sys-donkonit.lua @@ -0,0 +1,295 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- s-donkonit : config, shutdown, screens + +-- Doesn't matter what calls this service, because there's a mutex here. +local donkonitSPProvider = neo.requestAccess("r.neo.sys.manage") -- Restrict to s- +if not donkonitSPProvider then return end +local donkonitRDProvider = neo.requestAccess("r.neo.sys.screens") +if not donkonitRDProvider then return end + +local computer = neo.requestAccess("k.computer") +local fs = neo.requestAccess("c.filesystem") +local gpus = neo.requestAccess("c.gpu") +local screens = neo.requestAccess("c.screen") +neo.requestAccess("s.h.component_added") +neo.requestAccess("s.h.component_removed") + +local function shutdownFin(reboot) + -- any final actions donkonit needs to take here + computer.shutdown(reboot) +end + +-- keys are pids +local targs = {} -- settings notify targs +local targsSD = {} -- shutdown notify targs +local targsST = {} -- saving throws + +local targsRD = {} -- pid->{sendSig,dead} + +-- screen address -> {gpu, monitor} +local monitorMap = {} + +local shuttingDown = false +local shutdownMode = false + +-- needs improvements +local settings = { + -- The list of settings is here: + -- password + password = "", + ["run.sys-everest"] = "yes", + ["run.sys-icecap"] = "yes", + -- scr.w/h/d. +} + +local function loadSettings() + pcall(function () + local fw = require("sys-filewrap") + local se = require("serial") + local st = fw(fs.primary, "data/sys-donkonit/sysconf.lua", false) + local cfg = st.read("*a") + st.close() + st = nil + fw = nil + cfg = se.deserialize(cfg) + for k, v in pairs(cfg) do + if type(k) == "string" then + if type(v) == "string" then + settings[k] = v + end + end + end + end) +end +local function saveSettings() + local fw = require("sys-filewrap") + local se = require("serial") + fs.primary.makeDirectory("data/sys-donkonit") + local st = fw(fs.primary, "data/sys-donkonit/sysconf.lua", true) + st.write(se.serialize(settings)) + st.close() +end + +-- Monitor management stuff +local monitorPool = {} +-- {gpu, claimedLoseCallback} +local monitorClaims = {} + +local function announceFreeMonitor(address, except) + for k, v in pairs(targsRD) do + if k ~= except then + v[1]("available", address) + end + end +end + +local function getGPU(monitor) + local bestG + local bestD = 0 + for v in gpus.list() do + v.bind(monitor.address) + local d = v.maxDepth() + if d > bestD then + bestG = v + bestD = d + end + end + return bestG +end + +local function setupMonitor(gpu, monitor) + local maxW, maxH = gpu.maxResolution() + local maxD = gpu.maxDepth() + local w = tonumber(settings["scr.w." .. monitor.address]) or 80 + local h = tonumber(settings["scr.h." .. monitor.address]) or 25 + local d = tonumber(settings["scr.d." .. monitor.address]) or 8 + w, h, d = math.floor(w), math.floor(h), math.floor(d) + w, h, d = math.min(w, maxW), math.min(h, maxH), math.min(d, maxD) + settings["scr.w." .. monitor.address] = tostring(w) + settings["scr.h." .. monitor.address] = tostring(h) + settings["scr.d." .. monitor.address] = tostring(d) + gpu.setResolution(w, h) + gpu.setDepth(d) + pcall(saveSettings) +end + +donkonitSPProvider(function (pkg, pid, sendSig) + targs[pid] = sendSig + return { + listSettings = function () + local s = {} + for k, v in pairs(settings) do + table.insert(s, k) + end + return s + end, + getSetting = function (name) + if type(name) ~= "string" then error("Setting name must be string") end + return settings[name] + end, + delSetting = function (name) + if type(name) ~= "string" then error("Setting name must be string") end + local val = nil + if name == "password" then val = "" end + settings[name] = val + for _, v in pairs(targs) do + v("set_setting", name, val) + end + pcall(saveSettings) + end, + setSetting = function (name, val) + if type(name) ~= "string" then error("Setting name must be string") end + if type(val) ~= "string" then error("Setting value must be string") end + settings[name] = val + for _, v in pairs(targs) do + v("set_setting", name, val) + end + pcall(saveSettings) + --saveSettings() + end, + registerForShutdownEvent = function () + targsSD[pid] = sendSig + end, + registerSavingThrow = function (st) + if type(st) ~= "function" then error("Saving throw function must be a function") end + targsST[pid] = st + end, + shutdown = function (reboot) + if type(reboot) ~= "boolean" then error("Shutdown parameter must be a boolean (reboot)") end + if shuttingDown then return end + shuttingDown = true + shutdownMode = reboot + local counter = 0 + neo.scheduleTimer(os.uptime() + 5) -- in case the upcoming code fails in some way + for f, v in pairs(targsSD) do + counter = counter + 1 + v("shutdown", reboot, function () + counter = counter - 1 + if counter == 0 then + shutdownFin(reboot) + end + end) + end + if counter == 0 then + shutdownFin(reboot) + end + -- donkonit will shutdown when the timer is hit. + end + } +end) + +donkonitRDProvider(function (pkg, pid, sendSig) + local claimed = {} + targsRD[pid] = {sendSig, function () + for k, v in pairs(claimed) do + -- Nothing to really do here + monitorClaims[k] = nil + announceFreeMonitor(k, pid) + end + end} + return { + getClaimable = function () + local c = {} + -- do we have gpu? + if not gpus.list()() then return c end + for _, v in ipairs(monitorPool) do + table.insert(c, v.address) + end + return c + end, + claim = function (address) + if type(address) ~= "string" then error("Address must be string.") end + for k, v in ipairs(monitorPool) do + if v.address == address then + local gpu = getGPU(v) + if gpu then + setupMonitor(gpu, v) + gpu = gpu.address + local disclaimer = function (wasDevLoss) + -- we lost it + monitorClaims[address] = nil + claimed[address] = nil + if not wasDevLoss then + table.insert(monitorPool, v) + announceFreeMonitor(address, pid) + else + sendSig("lost", address) + end + end + claimed[address] = disclaimer + monitorClaims[address] = {gpu, disclaimer} + table.remove(monitorPool, k) + return function () + for v in gpus.list() do + if v.address == gpu then + local _, v2 = v.bind(address) + if not v2 then + return v + else + return + end + end + end + end + end + end + end + end, + disclaim = function (address) + if not address then error("Cannot disclaim nothing.") end + if claimed[address] then + claimed[address](false) + end + end + } +end) + +-- -- The actual initialization +loadSettings() +local function rescanDevs() + monitorPool = {} + local hasGPU = gpus.list()() + for m in screens.list() do + if monitorClaims[m.address] then + monitorClaims[m.address][2](true) + end + table.insert(monitorPool, m) + if hasGPU then + announceFreeMonitor(m.address) + end + end +end +rescanDevs() + +-- Save any settings made during the above (or just the language) +saveSettings() +-- -- + +while true do + local s = {coroutine.yield()} + if s[1] == "k.timer" then + -- always shutdown + shutdownFin(shutdownMode) + end + if s[1] == "h.component_added" then + rescanDevs() + end + if s[1] == "h.component_removed" then + rescanDevs() + end + if s[1] == "k.procdie" then + targs[s[3]] = nil + targsSD[s[3]] = nil + if targsST[s[3]] then + if s[4] then + pcall(targsST[s[3]]) + end + end + targsST[s[3]] = nil + if targsRD[s[3]] then + targsRD[s[3]][2]() + end + end +end diff --git a/code/apps/sys-everest.lua b/code/apps/sys-everest.lua new file mode 100644 index 0000000..67a650b --- /dev/null +++ b/code/apps/sys-everest.lua @@ -0,0 +1,639 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- s-everest + +-- Terminology: +-- "monitor": Either the Null Virtual Monitor[0] (a safetynet), +-- or an actual GPU/Screen pair managed by donkonit. +-- "surface": Everest system-level drawing primitive +-- "window" : Everest user-level wrapper around a surface providing a reliable window frame, movement, etc. +-- "line" : A Wx1 area across a surface. +-- "span" : A ?x1 area across a surface with text and a single fg/bg colour. +-- This has less user calls as opposed to the old KittenOS system, which had a high CPU usage. +-- Another thing to note is that Everest still uses callbacks, both for efficiency and library convenience, +-- though with automatically closing windows on process death. + +-- How Bristol talks to this is: +-- 1. Bristol starts up Everest. Everest does not claim new monitors by default. +-- 2. Bristol claims all available monitors to blank out the display +-- 3. The user logs in +-- 4. Bristol runs "startSession", enabling claiming of free monitors, and then promptly dies. +-- 5. Everest claims the new monitors, and the desktop session begins +-- 6. Everest dies/respawns, or endSession is called - in both cases, +-- Everest is now essentially back at the state in 1. +-- 7. Either this is Bristol, so go to 2, +-- or this is a screensaver host, and has a saving-throw to start Bristol if it dies unexpectedly. +-- In any case, this eventually returns to 2 or 4. + +local everestProvider = neo.requestAccess("r.neo.pub.window") +if not everestProvider then return end + +local everestSessionProvider = neo.requestAccess("r.neo.sys.session") +if not everestSessionProvider then return end + +-- Got mutexes. Now setup saving throw and shutdown callback +-- Something to note is that Donkonit is the safety net on this, +-- as it auto-releases the monitors. +local screens = neo.requestAccess("x.neo.sys.screens") +if not screens then + error("Donkonit is required to run Everest") +end + +neo.requestAccess("s.h.clipboard") +neo.requestAccess("s.h.touch") +neo.requestAccess("s.h.drag") +neo.requestAccess("s.h.key_up") +neo.requestAccess("s.h.key_down") + +-- {gpu, screenAddr, w, h, bg, fg} +local monitors = {} + +-- NULL VIRTUAL MONITOR! +-- This is where we stuff processes while Bristol isn't online +monitors[0] = {nil, nil, 80, 25} + +-- {monitor, x, y, w, h, callback} +-- callback events are: +-- key ka kc down +-- line y +local surfaces = {} + +-- Dead process's switch to clean up resources by crashing processes which "just don't get it" +local dead = false + +local savingThrow = neo.requestAccess("x.neo.sys.manage") +if savingThrow then + savingThrow.registerForShutdownEvent() + savingThrow.registerSavingThrow(function () + if #monitors > 0 then + neo.executeAsync("sys-init", monitors[1][2]) + end + neo.executeAsync("sys-everest") + -- In this case the surfaces are leaked and hold references here. They have to be removed manually. + -- Do this via a "primary event" (k.deregistration) and "deathtrap events" + -- If a process evades the deathtrap then it clearly has reason to stay alive regardless of Everest status. + dead = true + monitors = {} + for _, v in ipairs(surfaces) do + pcall(v[6], "line", 1) + pcall(v[6], "line", 2) + end + end) +end + +-- Grab all available monitors when they become available +local inSession = false + +local function renderingAllowed() + -- This is a safety feature to prevent implosion due to missing monitors. + return #monitors > 0 +end + +local function surfaceAt(monitor, x, y) + for k, v in ipairs(surfaces) do + if v[1] == monitor then + if x >= v[2] then + if y >= v[3] then + if x < (v[2] + v[4]) then + if y < (v[3] + v[5]) then + return k, (x - v[2]) + 1, (y - v[3]) + 1 + end + end + end + end + end + end +end + +local function monitorGPUColours(m, cb, bg, fg) + local nbg = m[5] + local nfg = m[6] + if nbg ~= bg then + cb.setBackground(bg) + m[5] = bg + end + if nfg ~= fg then + cb.setForeground(fg) + m[6] = fg + end +end + +local function updateRegion(monitorId, x, y, w, h, surfaceSpanCache) + if not renderingAllowed() then return end + local m = monitors[monitorId] + local mg = m[1]() + if not mg then return end + -- The input region is the one that makes SENSE. + -- Considering WC handling, that's not an option. + -- WCHAX: start + if x > 1 then + x = x - 1 + w = w + 1 + end + -- this, in combination with 'forcefully blank out last column of window during render', + -- cleans up littering + w = w + 1 + -- end + + for span = 1, h do + local backgroundMarkStart = nil + for sx = 1, w do + local t, tx, ty = surfaceAt(monitorId, sx + x - 1, span + y - 1) + if t then + -- It has to be in this order to get rid of wide char weirdness + if backgroundMarkStart then + monitorGPUColours(m, mg, 0x000020, 0) + mg.fill(backgroundMarkStart + x - 1, span + y - 1, sx - backgroundMarkStart, 1, " ") + backgroundMarkStart = nil + end + if not surfaceSpanCache[t .. "_" .. ty] then + surfaceSpanCache[t .. "_" .. ty] = true + surfaces[t][6]("line", ty) + end + elseif not backgroundMarkStart then + backgroundMarkStart = sx + end + end + if backgroundMarkStart then + local m = monitors[monitorId] + monitorGPUColours(m, mg, 0x000020, 0) + mg.fill(backgroundMarkStart + x - 1, span + y - 1, (w - backgroundMarkStart) + 1, 1, " ") + end + end +end + +local function ensureOnscreen(monitor, x, y, w, h) + if monitor <= 0 then monitor = #monitors end + if monitor >= (#monitors + 1) then monitor = 1 end + -- Failing anything else, revert to monitor 0 + if #monitors == 0 then monitor = 0 end + x = math.min(math.max(1, x), monitors[monitor][3] - (w - 1)) + y = math.min(math.max(1, y), monitors[monitor][4] - (h - 1)) + return monitor, x, y +end + +-- This is the "a state change occurred" function, only for use when needed +local function reconcileAll() + for k, v in ipairs(surfaces) do + -- About to update whole screen anyway so avoid the wait. + v[1], v[2], v[3] = ensureOnscreen(v[1], v[2], v[3], v[4], v[5]) + end + for k, v in ipairs(monitors) do + local mon = v[1]() + if mon then + v[3], v[4] = mon.getResolution() + end + v[5] = -1 + v[6] = -1 + updateRegion(k, 1, 1, v[3], v[4], {}) + end +end + +local function moveSurface(surface, m, x, y, w, h) + local om, ox, oy, ow, oh = table.unpack(surface, 1, 5) + m = m or om + x = x or ox + y = y or oy + w = w or ow + h = h or oh + surface[1], surface[2], surface[3], surface[4], surface[5] = m, x, y, w, h + local cache = {} + if om == m then + if ow == w then + if oh == h then + -- Cheat - perform a GPU copy + -- this increases "apparent" performance while we're inevitably waiting for the app to catch up, + -- CANNOT glitch since we're going to draw over this later, + -- and will usually work since the user can only move focused surfaces + if renderingAllowed() then + local cb = monitors[m][1]() + if cb then + cb.copy(ox, oy, w, h, x - ox, y - oy) + end + end + end + end + end + updateRegion(om, ox, oy, ow, oh, cache) + updateRegion(m, x, y, w, h, cache) +end +-- Returns offset from where we expected to be to where we are. +local function ofsSurface(focus, dx, dy) + local exX, exY = focus[2] + dx, focus[3] + dy + local m, x, y = ensureOnscreen(focus[1], exX, exY, focus[4], focus[5]) + moveSurface(focus, nil, x, y) + return focus[2] - exX, focus[3] - exY +end +local function ofsMSurface(focus, dm) + local m, x, y = ensureOnscreen(focus[1] + dm, focus[2], focus[3], focus[4], focus[5]) + moveSurface(focus, m, x, y) +end + +local function handleSpan(target, x, y, text, bg, fg) + if not renderingAllowed() then return end + local m = monitors[target[1]] + local cb = m[1]() + if not cb then return end + -- It is assumed basic type checks were handled earlier. + if y < 1 then return end + if y > target[5] then return end + if x < 1 then return end + -- Note the use of unicode.len here. + -- It's assumed that if the app is using Unicode text, then it used safeTextFormat earlier. + -- This works for a consistent safety check. + local w = unicode.len(text) + if ((x + w) - 1) > target[4] then return end + -- Checks complete, now commence screen cropping... + local worldY = ((y + target[3]) - 1) + if worldY < 1 then return end + if worldY > monitors[target[1]][4] then return end + -- The actual draw loop + local buildingSegmentWX = nil + local buildingSegmentWY = nil + local buildingSegment = nil + local buildingSegmentE = nil + local function submitSegment() + if buildingSegment then + base = unicode.sub(text, buildingSegment, buildingSegmentE - 1) + local ext = unicode.sub(text, buildingSegmentE, buildingSegmentE) + if unicode.charWidth(ext) == 1 then + base = base .. ext + else + -- While the GPU may or may not be able to display "half a character", + -- getting it to do so reliably is another matter. + -- In my experience it always leads to drawing errors much worse than if the code was left alone. + -- If your language uses wide chars and you are affected by a window's positioning... + -- ... may I ask how, exactly, you intend me to fix it? + -- My current theory is that for cases where the segment is >= 2 chars (so we have scratchpad), + -- the GPU might be tricked via a copy. + -- Then the rest of the draw can proceed as normal, + -- with the offending char removed. + base = base .. " " + end + monitorGPUColours(m, cb, bg, fg) + cb.set(buildingSegmentWX, buildingSegmentWY, unicode.undoSafeTextFormat(base)) + buildingSegment = nil + end + end + for i = 1, w do + local rWX = (i - 1) + (x - 1) + target[2] + local rWY = (y - 1) + target[3] + local s = surfaceAt(target[1], rWX, rWY) + local ok = false + if s then + ok = surfaces[s] == target + end + if ok then + if not buildingSegment then + buildingSegmentWX = rWX + buildingSegmentWY = rWY + buildingSegment = i + end + buildingSegmentE = i + else + submitSegment() + end + end + submitSegment() +end + +local function changeFocus(oldSurface, optcache) + local ns1 = surfaces[1] + optcache = optcache or {} + if ns1 ~= oldSurface then + if oldSurface then + oldSurface[6]("focus", false) + end + if ns1 then + ns1[6]("focus", true) + end + if oldSurface then + updateRegion(oldSurface[1], oldSurface[2], oldSurface[3], oldSurface[4], oldSurface[5], optcache) + end + if ns1 then + updateRegion(ns1[1], ns1[2], ns1[3], ns1[4], ns1[5], optcache) + end + end +end + +-- THE EVEREST USER API BEGINS +local surfaceOwners = {} + +-- Not relevant here really, but has to be up here because it closes the window +local waitingShutdownCallback = nil +local function checkWSC() + if waitingShutdownCallback then + if #surfaces == 0 then + waitingShutdownCallback() + waitingShutdownCallback = nil + end + end +end + +everestProvider(function (pkg, pid, sendSig) + local base = pkg .. "/" .. pid + local lid = 0 + return function (w, h, title) + if dead then error("everest died") end + w = math.floor(math.max(w, 8)) + h = math.floor(math.max(h, 1)) + 1 + if type(title) ~= "string" then + title = base + else + title = base .. ":" .. title + end + local m = 0 + if renderingAllowed() then m = 1 end + local surf = {m, 1, 1, w, h} + local focusState = false + local llid = lid + lid = lid + 1 + local specialDragHandler + surf[6] = function (ev, a, b, c) + -- Must forward surface events + if ev == "focus" then + focusState = a + end + if ev == "touch" then + specialDragHandler = nil + if math.floor(b) == 1 then + specialDragHandler = function (x, y) + local ofsX, ofsY = math.floor(x) - math.floor(a), math.floor(y) - math.floor(b) + if (ofsX == 0) and (ofsY == 0) then return end + local pX, pY = ofsSurface(surf, ofsX, ofsY) + --a = a + pX + --b = b + pY + end + return + end + b = b - 1 + end + if ev == "drag" then + if specialDragHandler then + specialDragHandler(a, b) + return + end + b = b - 1 + end + if ev == "line" then + if a == 1 then + local lw = surf[4] + local bg = 0x0080FF + local fg = 0x000000 + local tx = "-" + if focusState then + bg = 0x000000 + fg = 0x0080FF + tx = "+" + end + local vtitle = title + local vto = unicode.len(vtitle) + if vto < lw then + vtitle = vtitle .. (tx):rep(lw - vto) + else + vtitle = unicode.sub(vtitle, 1, lw) + end + handleSpan(surf, 1, 1, vtitle, bg, fg) + return + end + -- WCHAX : Wide-char-cleanup has to be done left-to-right, so this handles the important part of that. + handleSpan(surf, surf[4], a, " ", 0, 0) + a = a - 1 + end + sendSig(llid, ev, a, b, c) + end + local osrf = surfaces[1] + table.insert(surfaces, 1, surf) + surfaceOwners[surf] = pid + changeFocus(osrf) + return { + id = llid, + setSize = function (w, h) + if dead then return end + w = math.floor(math.max(w, 8)) + h = math.floor(math.max(h, 1)) + 1 + local _, x, y = ensureOnscreen(surf[1], surf[2], surf[3], w, h) + moveSurface(surf, nil, x, y, w, h) + return w, (h - 1) + end, + span = function (x, y, text, bg, fg) + if dead then error("everest died") end + if type(x) ~= "number" then error("X must be number.") end + if type(y) ~= "number" then error("Y must be number.") end + if type(bg) ~= "number" then error("Background must be number.") end + if type(fg) ~= "number" then error("Foreground must be number.") end + if type(text) ~= "string" then error("Text must be string.") end + x, y, bg, fg = math.floor(x), math.floor(y), math.floor(bg), math.floor(fg) + if y == 0 then return end + handleSpan(surf, x, y + 1, text, bg, fg) + end, + close = function () + if dead then return end + local os1 = surfaces[1] + surfaceOwners[surf] = nil + for k, v in ipairs(surfaces) do + if v == surf then + table.remove(surfaces, k) + local cache = {} + checkWSC() + changeFocus(os1, cache) + -- focus up to date, deal with any remains + updateRegion(surf[1], surf[2], surf[3], surf[4], surf[5], cache) + return + end + end + end + } + end +end) +-- THE EVEREST USER API ENDS (now for the session API, which just does boring stuff) +everestSessionProvider(function (pkg, pid, sendSig) + return { + startSession = function () + inSession = true + end, + endSession = function (startBristol) + if not inSession then return end + local m = nil + if monitors[1] then + m = monitors[1][2] + end + inSession = false + for k = 1, #monitors do + screens.disclaim(monitors[k][2]) + monitors[k] = nil + end + if startBristol then + neo.executeAsync("sys-init", m) + end + reconcileAll() + if not startBristol then + return m + end + end + } +end) +-- THE EVEREST SESSION API ENDS + +-- WM shortcuts are: +-- Alt-Z: Switch surface +-- Alt-Enter: Launcher +-- Alt-Up/Down/Left/Right: Move surface +local isAltDown = false +local isCtrDown = false +local function key(ka, kc, down) + local focus = surfaces[1] + if kc == 29 then isCtrDown = down end + if kc == 56 then isAltDown = down end + if isAltDown then + if ka == 120 then + if focus and down then ofsMSurface(focus, 1) end return + end + if kc == 200 then + if focus and down then ofsSurface(focus, 0, -1) end return + end + if kc == 208 then + if focus and down then ofsSurface(focus, 0, 1) end return + end + if kc == 203 then + if focus and down then ofsSurface(focus, -1, 0) end return + end + if kc == 205 then + if focus and down then ofsSurface(focus, 1, 0) end return + end + if ka == 122 then + if focus and down then + local n = table.remove(surfaces, 1) + table.insert(surfaces, n) + changeFocus(n) + end return + end + if ka == 3 then + -- Ctrl-Alt-C (!?!?!!) + if isCtrDown then + error("User-authorized Everest crash.") + end + end + if ka == 99 then + if down then + if isCtrDown then + error("User-authorized Everest crash.") + else + if focus then + focus[6]("close") + end + end + end + return + end + if ka == 13 then + if down and (not waitingShutdownCallback) then neo.executeAsync("app-launcher") end return + end + end + if focus then + focus[6]("key", ka, kc, down) + end +end + +while true do + local s = {coroutine.yield()} + if renderingAllowed() then + if s[1] == "h.key_down" then + key(s[3], s[4], true) + end + if s[1] == "h.key_up" then + key(s[3], s[4], false) + end + if s[1] == "h.clipboard" then + if surfaces[1] then + surfaces[1][6]("clipboard", s[3]) + end + end + -- next on my list: high-res coordinates + if s[1] == "h.touch" then + for k, v in ipairs(monitors) do + if v[2] == s[2] then + local x, y = math.floor(s[3]), math.floor(s[4]) + local sid, lx, ly = surfaceAt(k, x, y) + if sid then + local os = surfaces[1] + local ns = table.remove(surfaces, sid) + table.insert(surfaces, 1, ns) + changeFocus(os) + ns[6]("touch", lx, ly) + end + break + end + end + end + if s[1] == "h.drag" then + -- Pass to focus surface, even if out of bounds + local focus = surfaces[1] + if focus then + for k, v in ipairs(monitors) do + if v[2] == s[2] then + if k == focus[1] then + local x, y = (math.floor(s[3]) - focus[2]) + 1, (math.floor(s[4]) - focus[3]) + 1 + focus[6]("drag", x, y) + end + break + end + end + end + end + else + isCtrDown = false + isAltDown = false + end + if s[1] == "k.procdie" then + local os1 = surfaces[1] + -- Note this is in order (that's important) + local tags = {} + for k, v in ipairs(surfaces) do + if surfaceOwners[v] == s[3] then + table.insert(tags, k) + surfaceOwners[v] = nil + end + end + for k, v in ipairs(tags) do + local surf = table.remove(surfaces, v - (k - 1)) + updateRegion(surf[1], surf[2], surf[3], surf[4], surf[5], {}) + end + checkWSC() + changeFocus(os1) + end + if s[1] == "x.neo.sys.screens" then + if s[2] == "available" then + if inSession then + local gpu = screens.claim(s[3]) + local gpucb = gpu and (gpu()) + if gpucb then + local w, h = gpucb.getResolution() + table.insert(monitors, {gpu, s[3], w, h, -1, -1}) + -- This is required to ensure windows are moved off of the null monitor. + -- Luckily, there's an obvious sign if they aren't - everest will promptly crash. + reconcileAll() + end + end + end + if s[2] == "lost" then + for k, v in ipairs(monitors) do + if v[2] == s[3] then + table.remove(monitors, k) + reconcileAll() + break + end + end + end + end + if s[1] == "x.neo.sys.manage" then + if s[2] == "shutdown" then + waitingShutdownCallback = s[4] + for k, v in ipairs(surfaces) do + v[6]("close") + end + checkWSC() + end + end +end diff --git a/code/apps/sys-icecap.lua b/code/apps/sys-icecap.lua new file mode 100644 index 0000000..91eda3f --- /dev/null +++ b/code/apps/sys-icecap.lua @@ -0,0 +1,137 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- s-icecap : Responsible for x.neo.pub API, crash dialogs, and security policy that isn't "sys- has ALL access, anything else has none" +-- In general, this is what userspace will be interacting with in some way or another to get stuff done + +local event = require("event")(neo) +local neoux, err = require("neoux") +if not neoux then error(err) end -- This app is basically neoux's testcase +neoux = neoux(event, neo) + +local donkonit = neo.requestAccess("x.neo.sys.manage") +if not donkonit then error("needs donkonit for sysconf access") end +local scr = neo.requestAccess("s.k.securityrequest") +if not scr then error("no security request access") end + +local fs = neo.requestAccess("c.filesystem") + +local donkonitDFProvider = neo.requestAccess("r.neo.pub.base") +if not donkonitDFProvider then return end + +local targsDH = {} -- data disposal + +donkonitDFProvider(function (pkg, pid, sendSig) + local prefixNS = "data/" .. pkg + local prefixWS = "data/" .. pkg .. "/" + fs.primary.makeDirectory(prefixNS) + local openHandles = {} + targsDH[pid] = function () + for k, v in pairs(openHandles) do + v() + end + end + return { + showFileDialogAsync = function (forWrite) + -- Not hooked into the event API, so can't safely interfere + -- Thus, this is async and uses a return event. + local tag = {} + event.runAt(0, function () + -- sys-filedialog is yet another "library to control memory usage". + local closer = require("sys-filedialog")(event, neoux, function (res) openHandles[tag] = nil sendSig("filedialog", tag, res) end, fs, pkg, forWrite) + openHandles[tag] = closer + end) + return tag + end, + -- Paths must begin with / implicitly + list = function (path) + if type(path) ~= "string" then error("Expected path to be string") end + path = prefixNS .. path + neo.ensurePath(path, prefixWS) + if path:sub(#path, #path) ~= "/" then error("Expected / at end") end + return fs.primary.list(path:sub(1, #path - 1)) + end, + makeDirectory = function (path) + if type(path) ~= "string" then error("Expected path to be string") end + path = prefixNS .. path + neo.ensurePath(path, prefixWS) + if path:sub(#path, #path) == "/" then error("Expected no / at end") end + return fs.primary.makeDirectory(path) + end, + rename = function (path1, path2) + if type(path1) ~= "string" then error("Expected path to be string") end + if type(path2) ~= "string" then error("Expected path to be string") end + path1 = prefixNS .. path1 + path2 = prefixNS .. path2 + neo.ensurePath(path1, prefixWS) + neo.ensurePath(path2, prefixWS) + if path:sub(#path1, #path1) == "/" then error("Expected no / at end") end + if path:sub(#path2, #path2) == "/" then error("Expected no / at end") end + return fs.primary.rename(path1, path2) + end, + open = function (path, mode) + if type(path) ~= "string" then error("Expected path to be string") end + if type(mode) ~= "boolean" then error("Expected mode to be boolean (writing)") end + path = prefixNS .. path + neo.ensurePath(path, prefixWS) + if path:sub(#path, #path) == "/" then error("Expected no / at end") end + local fw, closer = require("sys-filewrap")(fs.primary, path, mode) + local oc = fw.close + fw.close = function () + oc() + openHandles[fw] = nil + end + openHandles[fw] = closer + return fw + end, + remove = function (path) + if type(path) ~= "string" then error("Expected path to be string") end + path = prefixNS .. path + neo.ensurePath(path, prefixWS) + if path:sub(#path, #path) == "/" then error("Expected no / at end") end + return fs.primary.remove(path) + end, + stat = function (path) + if type(path) ~= "string" then error("Expected path to be string") end + path = prefixNS .. path + neo.ensurePath(path, prefixWS) + if path:sub(#path, #path) == "/" then error("Expected no / at end") end + if not fs.primary.exists(path) then return nil end + return { + fs.primary.isDirectory(path), + fs.primary.size(path), + fs.primary.lastModified(path) + } + end, + -- getLabel/setLabel have nothing to do with this + spaceUsed = fs.primary.spaceUsed, + spaceTotal = fs.primary.spaceTotal, + isReadOnly = fs.primary.isReadOnly + } +end) + +event.listen("k.securityrequest", function (evt, pkg, pid, perm, rsp) + local secpol, err = require("sys-secpolicy") + if not secpol then + rsp(false) + error("Bad security policy: " .. err) + end + secpol(neoux, donkonit, pkg, pid, perm, rsp) +end) + +event.listen("k.procdie", function (evt, pkg, pid, reason) + if targsDH[pid] then + targsDH[pid]() + end + targsDH[pid] = nil + if reason then + -- Process death logging in console (for lifecycle dbg) + -- neo.emergency(n[2]) + -- neo.emergency(n[4]) + neoux.startDialog(string.format("%s/%i died:\n%s", pkg, pid, reason), "error") + end +end) + +while true do + event.pull() +end diff --git a/code/apps/sys-init.lua b/code/apps/sys-init.lua new file mode 100644 index 0000000..20e90db --- /dev/null +++ b/code/apps/sys-init.lua @@ -0,0 +1,417 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- s-bristol splash screen, login agent +-- Named to allude to Plymouth (splash screen used in some linux distros) + +local callerPkg, callerPid, callerScr = ... + +local gpu, screen = nil, nil +local shutdownEmergency = neo.requestAccess("k.computer").shutdown +neo.requestAccess("s.h.key_down") + +-- donkonit hasn't started yet - this will be dealt with later +local function _(tx) + return tx +end + +local scrW, scrH +local warnings = { + "", + "", + "" +} + +-- Attempts to call upon nsm for a safe shutdown +local function shutdown(reboot) + local donkonit = neo.requestAccess("x.neo.sys.manage") + if donkonit then + donkonit.shutdown(reboot) + while true do + coroutine.yield() + end + else + shutdownEmergency(reboot) + end +end + +local function basicDraw() + scrW, scrH = gpu.getResolution() + gpu.fill(1, 1, scrW, scrH, " ") + gpu.set(2, 2, _("KittenOS NEO")) +end + +local function advDraw() + basicDraw() + local usage = math.floor((os.totalMemory() - os.freeMemory()) / 1024) + gpu.set(2, 3, _("RAM Usage: ") .. usage .. "K / " .. math.floor(os.totalMemory() / 1024) .. "K") + for i = 1, #warnings do + gpu.set(2, 6 + i, warnings[i]) + end +end + +-- Callback setup by finalPrompt to disclaim the main monitor first +local performDisclaim = nil + +local function retrieveNssMonitor(nss) + gpu = nil + local subpool = {} + while not gpu do + if performDisclaim then + performDisclaim() + end + -- nss available - this means the monitor pool is now ready. + -- If no monitors are available, shut down now. + -- donkonit monitor pool output is smaller than, but similar to, Everest monitor data: + -- {gpu, screenAddr} + local pool = nss.getClaimable() + while not pool[1] do + coroutine.yield() -- wait for presumably a donkonit notification + pool = nss.getClaimable() + end + subpool = {} + -- Specifies which element to elevate to top priority + local optimalSwap = nil + if screen then + for k, v in ipairs(pool) do + if v == screen then + optimalSwap = k + break + end + end + end + if optimalSwap then + local swapA = pool[optimalSwap] + pool[optimalSwap] = pool[1] + pool[1] = swapA + end + for _, v in ipairs(pool) do + local gpu = nss.claim(v) + if gpu then + local gcb = gpu() + if gcb then + table.insert(subpool, {gpu, v}) + gcb.setBackground(0x000020) + local w, h = gcb.getResolution() + gcb.fill(1, 1, w, h, " ") + end + end + end + + if not subpool[1] then error(_("Unable to claim any monitor.")) end + gpu = subpool[1][1]() -- BAD + screen = subpool[1][2] + end + -- done with search + scrW, scrH = gpu.getResolution() + gpu.setBackground(0xFFFFFF) + gpu.setForeground(0x000000) + gpu.fill(1, 1, scrW, scrH, " ") + performDisclaim = function () + for _, v in ipairs(subpool) do + nss.disclaim(v[2]) + end + end +end + +local function sleep(t) + neo.scheduleTimer(os.uptime() + t) + while true do + local ev = {coroutine.yield()} + if ev[1] == "k.timer" then + break + end + if ev[1] == "x.neo.sys.screens" then + -- This implies we have and can use nss, but check anyway + local nss = neo.requestAccess("x.neo.sys.screens") + if nss then + retrieveNssMonitor(nss) + gpu.setBackground(0xFFFFFF) + gpu.setForeground(0x000000) + basicDraw() + end + end + end +end + +local function finalPrompt() + local nss = neo.requestAccess("x.neo.sys.screens") + if nss then + retrieveNssMonitor(nss) + end + -- This is nsm's final chance to make itself available and thus allow the password to be set + local nsm = neo.requestAccess("x.neo.sys.manage") + local waiting = true + local safeModeActive = false + local password = "" + if nsm then + password = nsm.getSetting("password") + end + warnings[1] = _("TAB to change option,") + warnings[2] = _("ENTER to select...") + -- The actual main prompt loop + while waiting do + advDraw() + local entry = "" + local entry2 = "" + local active = true + local shButton = _("") + local rbButton = _("") + local smButton = _("") + local pw = {function () + return _("Password: ") .. entry2 + end, function (key) + if key >= 32 then + entry = entry .. unicode.char(key) + entry2 = entry2 .. "*" + end + if key == 13 then + if entry == password then + waiting = false + else + advDraw() + sleep(1) + end + active = false + end + end, 2, 5, scrW - 2} + if password == "" then + pw = {function () + return "Log in..." + end, function (key) + if key == 13 then + waiting = false + active = false + end + end, 2, 5, scrW - 2} + end + local controls = { + {function () + return shButton + end, function (key) + if key == 13 then + basicDraw() + gpu.set(2, 4, "Shutting down...") + shutdown(false) + end + end, 2, scrH - 1, unicode.len(shButton)}, + {function () + return rbButton + end, function (key) + if key == 13 then + basicDraw() + gpu.set(2, 4, "Rebooting...") + shutdown(true) + end + end, 3 + unicode.len(shButton), scrH - 1, unicode.len(rbButton)}, + {function () + return smButton + end, function (key) + if key == 13 then + basicDraw() + gpu.set(2, 4, "Login to activate Safe Mode.") + sleep(1) + safeModeActive = true + advDraw() + end + end, 4 + unicode.len(shButton) + unicode.len(rbButton), scrH - 1, unicode.len(smButton)}, + pw, + } + local control = #controls + while active do + for k, v in ipairs(controls) do + if k == control then + gpu.setBackground(0x000000) + gpu.setForeground(0xFFFFFF) + else + gpu.setBackground(0xFFFFFF) + gpu.setForeground(0x000000) + end + gpu.fill(v[3], v[4], v[5], 1, " ") + gpu.set(v[3], v[4], v[1]()) + end + -- Reset to normal + gpu.setBackground(0xFFFFFF) + gpu.setForeground(0x000000) + -- event handling... + local sig = {coroutine.yield()} + if sig[1] == "x.neo.sys.screens" then + -- We need to reinit screens no matter what. + retrieveNssMonitor(nss) + end + if sig[1] == "h.key_down" then + if sig[4] == 15 then + -- this makes sense in context + control = control % (#controls) + control = control + 1 + else + controls[control][2](sig[3]) + end + end + end + end + advDraw() + return safeModeActive +end +local function postPrompt() + -- Begin to finish login, or fail + local everests = neo.requestAccess("x.neo.sys.session") + if everests then + local s, e = pcall(everests.startSession) + if not s then + table.insert(warnings, "Everest failed to create a session") + table.insert(warnings, tostring(e)) + else + warnings = {"Transferring to Everest..."} + advDraw() + if performDisclaim then + performDisclaim() + -- Give Everest time (this isn't perceptible, and is really just a safety measure) + sleep(1) + end + return + end + else + table.insert(warnings, "Couldn't communicate with Everest...") + end + advDraw() + sleep(1) + shutdown(true) +end + +local function initializeSystem() + -- System has just booted, bristol is in charge + -- Firstly, initialize hardware to something sensible since we don't know scrcfg + gpu = neo.requestAccess("c.gpu").list()() + if gpu then + screen = neo.requestAccess("c.screen").list()() + if not screen then gpu = nil end + end + if gpu then + screen = screen.address + gpu.bind(screen, true) + gpu.setDepth(gpu.maxDepth()) + local gW, gH = gpu.maxResolution() + gW, gH = math.min(80, gW), math.min(25, gH) + gpu.setResolution(gW, gH) + gpu.setForeground(0x000000) + end + local w = 1 + local steps = { + "sys-donkonit", -- (Donkonit : Config, Screen, Power) + -- Let that start, and system GC + "WAIT", + "WAIT", + "WAIT", + "WAIT", + -- Start services + "INJECT", + -- extra GC time + "WAIT", + "WAIT", + "WAIT", + "WAIT", + "WAIT", + "WAIT", + "WAIT" + } + local stepCount = #steps + + neo.scheduleTimer(os.uptime()) + while true do + local ev = {coroutine.yield()} + if ev[1] == "k.procnew" then + table.insert(warnings, ev[2] .. "/" .. ev[3] .. " UP") + end + if ev[1] == "k.procdie" then + table.insert(warnings, ev[2] .. "/" .. ev[3] .. " DOWN") + table.insert(warnings, tostring(ev[4])) + end + if ev[1] == "k.timer" then + if gpu then + gpu.setForeground(0x000000) + if w < stepCount then + local n = math.floor((w / stepCount) * 255) + gpu.setBackground((n * 0x10000) + (n * 0x100) + n) + else + gpu.setBackground(0xFFFFFF) + end + basicDraw() + end + if steps[w] then + if steps[w] == "INJECT" then + local donkonit = neo.requestAccess("x.neo.sys.manage") + if not donkonit then + table.insert(warnings, "Settings not available for INJECT.") + else + local nextstepsA = {} + local nextstepsB = {} + for _, v in ipairs(neo.listApps()) do + if donkonit.getSetting("run." .. v) == "yes" then + if v:sub(1, 4) == "sys-" then + table.insert(nextstepsA, v) + else + table.insert(nextstepsB, v) + end + end + end + for _, v in ipairs(nextstepsB) do + table.insert(steps, w + 1, v) + end + for _, v in ipairs(nextstepsA) do + table.insert(steps, w + 1, v) + end + end + elseif steps[w] == "WAIT" then + else + local v, err = neo.executeAsync(steps[w]) + if not v then + table.insert(warnings, steps[w] .. " STF") + table.insert(warnings, err) + end + end + else + break + end + w = w + 1 + neo.scheduleTimer(os.uptime() + 0.049) + end + end +end +-- Actual sequence + +if callerPkg ~= nil then + -- Everest can call into this to force a login screen + -- In this case it locks Everest, then starts Bristol. + -- + if callerPkg ~= "sys-everest" then + return + end + screen = callerScr + -- Skip to "System initialized" (Everest either logged off, or died & used a Saving Throw to restart) +else + initializeSystem() +end +-- System initialized +if finalPrompt() then + -- Safe Mode + basicDraw() + local donkonit = neo.requestAccess("x.neo.sys.manage") + if donkonit then + gpu.set(2, 4, "Rebooting for Safe Mode...") + for _, v in ipairs(donkonit.listSettings()) do + if v ~= "password" then + donkonit.delSetting(v) + end + end + else + -- assume sysconf.lua did something very bad + gpu.set(2, 4, "No Donkonit. Wiping configuration completely.") + local fs = neo.requestAccess("c.filesystem") + fs.primary.remove("/data/sys-donkonit/sysconf.lua") + end + -- Do not give anything a chance to alter the new configuration + shutdownEmergency(true) + return +end +postPrompt() diff --git a/code/init.lua b/code/init.lua new file mode 100644 index 0000000..a675ce7 --- /dev/null +++ b/code/init.lua @@ -0,0 +1,667 @@ +-- KittenOS N.E.O Kernel: "Tell Mettaton I said hi." +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- NOTE: If it's not "local", it's because k.root ought to access it. +-- List of things that apply: +-- primaryDisk, timers, libraries, processes, accesses, wrapMeta, +-- distEvent, baseProcEnv, loadLibraryInner, retrieveAccess, +-- start + +-- Debugging option, turns process errors into actual errors (!) +local criticalFailure = false +-- In case of OpenComputers configuration abnormality +local readBufSize = 2048 + +-- A function used for logging, usable by programs. +-- Comment this out if you don't want programs to have +-- access to ocemu's logger. +local emergencyFunction +local ocemu = component.list("ocemu", true)() +if ocemu then + ocemu = component.proxy(ocemu) + emergencyFunction = ocemu.log +end + +primaryDisk = component.proxy(computer.getBootAddress()) + +timers = {} + +libraries = {} +setmetatable(libraries, { + __mode = "v" +}) + +-- proc.co = coroutine.create(appfunc) +-- proc.pkg = "pkg" +-- proc.access = {["perm"] = true, ...} +-- proc.denied = {["perm"] = true, ...} +-- proc.deathcbs = {function(), ...} +-- very slightly adjusted total CPU time +-- proc.cpuUsage +processes = {} +-- Maps registration-accesses to function(pkg, pid) +accesses = {} +local lastPID = 0 + +-- keys: +-- sr.waiting: keys are PIDs, values are just "true" +-- sr.service: function() +-- sr.result: boolean +local outstandingSR = {} + +-- Kernel global "idle time" counter, useful for accurate performance data +local idleTime = 0 + +-- This function is critical to wide text support. +function unicode.safeTextFormat(s, ptr) + local res = "" + if not ptr then ptr = 1 end + local aptr = 1 + for i = 1, unicode.len(s) do + local ch = unicode.sub(s, i, i) + local ex = unicode.charWidth(ch) + if i < ptr then + aptr = aptr + ex + end + for j = 2, ex do + ch = ch .. " " + end + res = res .. ch + end + return res, aptr +end + +-- The issue with the above function, of course, is that in practice the GPU is a weird mess. +-- So this undoes the above transformation for feeding to gpu.set. +-- (In practice if safeTextFormat supports RTL, and that's a big "if", then this will not undo that. +-- The point is that this converts it into gpu.set format.) +function unicode.undoSafeTextFormat(s) + local res = "" + local ignoreNext = false + for i = 1, unicode.len(s) do + if not ignoreNext then + local ch = unicode.sub(s, i, i) + ignoreNext = unicode.charWidth(ch) ~= 1 + res = res .. ch + else + ignoreNext = false + end + end + return res +end + +local function loadfile(s, e) + local h = primaryDisk.open(s) + if h then + local ch = "" + local c = primaryDisk.read(h, readBufSize) + while c do + ch = ch .. c + c = primaryDisk.read(h, readBufSize) + end + primaryDisk.close(h) + return load(ch, "=" .. s, "t", e) + end + return nil, "File Unreadable" +end + +local wrapMeta = nil +local uniqueNEOProtectionObject = {} +function wrapMeta(t) + if type(t) == "table" then + local t2 = {} + setmetatable(t2, { + __index = function (a, k) return wrapMeta(t[k]) end, + __newindex = function (a, k, v) end, + __pairs = function (a) + return function (x, key) + local k, v = next(t, k) + if k then return k, wrapMeta(v) end + end, {}, nil + end, + __ipairs = function (a) + return function (x, key) + key = key + 1 + if t[key] then + return key, wrapMeta(t[key]) + end + end, {}, 0 + end, + __metatable = uniqueNEOProtectionObject + -- Don't protect this table - it'll make things worse + }) + return t2 + else + return t + end +end + +local function ensureType(a, t) + if type(a) ~= t then error("Invalid parameter, expected a " .. t) end + if t == "table" then + if getmetatable(a) then error("Invalid parameter, has metatable") end + end +end + +local function ensurePathComponent(s) + if not s:match("^[a-zA-Z0-9_%-%+%,%#%~%@%'%;%[%]%(%)%&%%%$%! %=%{%}%^]+") then error("chars disallowed") end + if s == "." then error("single dot disallowed") end + if s == ".." then error("double dot disallowed") end +end + +local function ensurePath(s, r) + -- Filter filename for anything "worrying". Note / is allowed, see further filters + if not s:match("^[a-zA-Z0-9_%-%+%,%#%~%@%'%;%[%]%(%)%&%%%$%! %=%{%}%^%/]+") then error("chars disallowed") end + if s:sub(1, r:len()) ~= r then error("base disallowed") end + if s:match("//") then error("// disallowed") end + if s:match("^%.%./") then error("../ disallowed") end + if s:match("/%.%./") then error("/../ disallowed") end + if s:match("/%.%.$") then error("/.. disallowed") end + if s:match("^%./") then error("./ disallowed") end + if s:match("/%./") then error("/./ disallowed") end + if s:match("/%.$") then error("/. disallowed") end +end + +local wrapMath = wrapMeta(math) +local wrapTable = wrapMeta(table) +local wrapString = wrapMeta(string) +local wrapUnicode = wrapMeta(unicode) +local wrapCoroutine = wrapMeta(coroutine) +local wrapOs = wrapMeta({ + totalMemory = computer.totalMemory, freeMemory = computer.freeMemory, + energy = computer.energy, maxEnergy = computer.maxEnergy, + clock = os.clock, date = os.date, difftime = os.difftime, + time = os.time, uptime = computer.uptime + }) + +local distEvent = nil + +-- Use with extreme care. +-- (A process killing itself will actually survive until the next yield... before any of the death events have run.) +local function termProc(pid, reason) + if processes[pid] then + -- Immediately prepare for GC, it's possible this is out of memory. + -- If out of memory, then to reduce risk of memory leak by error, memory needs to be freed ASAP. + -- Start by getting rid of all process data. + local dcbs = processes[pid].deathcbs + local pkg = processes[pid].pkg + local usage = processes[pid].cpuUsage + processes[pid] = nil + -- This gets rid of a few more bits of data. + for _, v in ipairs(dcbs) do + v() + end + -- This finishes off that. + dcbs = nil + if reason and criticalFailure then + error(tostring(reason)) -- This is a debugging aid to give development work an easy-to-get-at outlet. Icecap is for most cases + end + if reason and emergencyFunction then + emergencyFunction("d1 " .. pkg .. "/" .. pid) + emergencyFunction("d2 " .. reason) + end + -- And this is why it's important, because this generates timers. + -- The important targets of these timers will delete even more data. + distEvent(nil, "k.procdie", pkg, pid, reason, usage) + end +end + +local function execEvent(k, ...) + if processes[k] then + local v = processes[k] + local timerA = computer.uptime() + local r, reason = coroutine.resume(v.co, ...) + -- Mostly reliable accounting + v.cpuUsage = v.cpuUsage + (computer.uptime() - timerA) + local dead = not r + local hasReason = dead + if not dead then + if coroutine.status(v.co) == "dead" then + dead = true + end + end + if dead then + if hasReason then + reason = tostring(reason) + else + reason = nil + end + termProc(k, reason) + return hasReason + end + end +end + +function distEvent(pid, s, ...) + local ev = {...} + if pid then + local v = processes[pid] + if not v then + return + end + if (not v.access["s." .. s]) or v.access["k.root"] then + return + end + -- Schedule a timer for "now" + table.insert(timers, {computer.uptime(), function () + return execEvent(pid, s, table.unpack(ev)) + end}) + return + end + for k, v in pairs(processes) do + distEvent(k, s, ...) + end +end + +local loadLibraryInner = nil + +function baseProcEnv() + return {math = wrapMath, + table = wrapTable, + string = wrapString, + unicode = wrapUnicode, + coroutine = wrapCoroutine, + os = wrapOs, + -- Note raw-methods are gone - these can interfere with the metatable safeties. + require = loadLibraryInner, + assert = assert, ipairs = ipairs, + load = load, next = next, + pairs = pairs, pcall = pcall, + xpcall = xpcall, select = select, + type = type, error = error, + tonumber = tonumber, tostring = tostring, + setmetatable = setmetatable, getmetatable = function (n) + local mt = getmetatable(n) + if mt == uniqueNEOProtectionObject then return "NEO-Protected Object" end + return mt + end, + rawset = function (t, i, v) + local mt = getmetatable(n) + if mt == uniqueNEOProtectionObject then error("NEO-Protected Object") end + return rawset(t, i, v) + end, rawget = rawget, rawlen = rawlen, rawequal = rawequal, + neo = { + emergency = emergencyFunction, + readBufSize = readBufSize, + wrapMeta = wrapMeta, + listProcs = function () + local n = {} + for k, v in pairs(processes) do + table.insert(n, {k, v.pkg, v.cpuUsage}) + end + return n + end, + listApps = function () + local n = primaryDisk.list("apps/") + local n2 = {} + for k, v in ipairs(n) do + if v:sub(#v - 3) == ".lua" then + table.insert(n2, v:sub(1, #v - 4)) + end + end + return n2 + end, + listLibs = function () + local n = primaryDisk.list("libs/") + local n2 = {} + for k, v in ipairs(n) do + if v:sub(#v - 3) == ".lua" then + table.insert(n2, v:sub(1, #v - 4)) + end + end + return n2 + end, + totalIdleTime = function () return idleTime end, + ensurePath = ensurePath, + ensurePathComponent = ensurePathComponent, + } + } +end + +function loadLibraryInner(library) + ensureType(library, "string") + library = "libs/" .. library .. ".lua" + ensurePath(library, "libs/") + if libraries[library] then return libraries[library] end + local l, r = loadfile(library, baseProcEnv()) + if l then + local ok, al = pcall(l) + if ok then + libraries[library] = al + return al + else + return nil, al + end + end + return nil, r +end + +function retrieveAccess(perm, pkg, pid) + -- Return the access lib and the death callback. + + -- Access categories are sorted into: + -- "c.": Component + -- "s.": Signal receiver (with responsibilities for Security Request watchers) + -- "s.k.<...>": Kernel stuff + -- "s.k.securityrequest": !!! HAS SIDE EFFECTS !!! + -- "s.h.<...>": Incoming HW messages + -- "s.x.": This access is actually useless on it's own - it is given by x. + + -- "k.": Kernel + -- "k.root": _ENV (holy grail) + -- "k.computer": computer + + -- "r.": Registration Of Service... + -- "x.": Access Of Service (handled by r. & accesses table) + if accesses[perm] then + return accesses[perm](pkg, pid) + end + + if perm == "k.root" then + return _ENV + end + if perm == "k.computer" then + return wrapMeta(computer) + end + if perm == "k.kill" then + return function(npid) + ensureType(npid, "number") + termProc(npid, "Killed by " .. pkg .. "/" .. pid) + end + end + if perm:sub(1, 2) == "s." then + -- This is more of a "return success". Signal access is determined by the access/denied maps. + return true + end + if perm:sub(1, 2) == "c." then + -- Allows for simple "Control any of these connected to the system" APIs, + -- for things the OS shouldn't be poking it's nose in. + local primary = nil + local temporary = nil + local t = perm:sub(3) + if t == "filesystem" then + primary = primaryDisk + temporary = component.proxy(computer.tmpAddress()) + end + return { + list = function () + local i = component.list(t, true) + return function () + local ii = i() + if not ii then return nil end + return component.proxy(ii) + end + end, + primary = primary, + temporary = temporary + } + end + if perm:sub(1, 2) == "r." then + local uid = "x" .. perm:sub(2) + local sid = "s.x" .. perm:sub(2) + if accesses[uid] then return nil end + accesses[uid] = function (pkg, pid) + return nil + end + return function (f) + -- Registration function + ensureType(f, "function") + local accessObjectCache = {} + accesses[uid] = function(pkg, pid) + -- Basically, a per registration per process cache. + -- This is a consistent yet flexible behavior. + if accessObjectCache[pid] then + return accessObjectCache[pid] + end + processes[pid].access[sid] = true + local ok, a = pcall(f, pkg, pid, function (...) + distEvent(pid, uid, ...) + end) + if ok then + accessObjectCache[pid] = a + return a, function () + accessObjectCache[pid] = nil + end + end + -- returns nil and fails + end + -- Announce registration + distEvent(nil, "k.registration", uid) + end, function () + -- Registration becomes null (access is held but other processes cannot retrieve object) + if accesses[uid] then + distEvent(nil, "k.deregistration", uid) + end + accesses[uid] = nil + end + end +end + +local start = nil + +function start(pkg, ...) + ensureType(pkg, "string") + ensurePathComponent(pkg .. ".lua") + local args = {...} + local proc = {} + local pid = lastPID + lastPID = lastPID + 1 + + local function startFromUser(ipkg, ...) + -- VERY specific injunction here: + -- non "sys-" apps NEVER start "sys-" apps + -- This is part of the "default security policy" below: + -- sys- has all access + -- anything else has none + if ipkg:sub(1, 4) == "sys-" then + if pkg:sub(1, 4) ~= "sys-" then + return nil, "non-sys app trying to start sys app" + end + end + return start(ipkg, pkg, pid, ...) + end + + local function osExecuteCore(handler, ...) + local pid, err = startFromUser(...) + while pid do + local sig = {coroutine.yield()} + if sig[1] == "k.procdie" then + if sig[3] == pid then + return 0, sig[4] + end + end + end + return -1, err + end + + local requestAccessAsync = function (perm) + ensureType(perm, "string") + -- Safety-checked, prepare security event. + local req = {} + req.waiting = {} + req.service = function () + if processes[pid] then + local n = nil + local n2 = nil + if req.result then + proc.access[perm] = true + n, n2 = retrieveAccess(perm, pkg, pid) + if n2 then + table.insert(processes[pid].deathcbs, n2) + end + else + proc.denied[perm] = true + end + distEvent(pid, "k.securityresponse", perm, n) + end + end + req.result = (not proc.denied[perm]) or proc.access["k.root"] + if proc.access["k.root"] or proc.access[perm] or proc.denied[perm] then + -- Use cached result to prevent possible unintentional security service spam + req.service() + return + end + -- Anything with s.k.securityrequest access has the response function and thus the vote, + -- but can't vote on itself for obvious reasons. Kernel judge is a fallback. + local shouldKernelJudge = true + for k, v in pairs(processes) do + if v.access["s.k.securityrequest"] then + shouldKernelJudge = false + if k ~= pid then + req.waiting[k] = true + distEvent(k, "k.securityrequest", pkg, pid, perm, function (r) + ensureType(r, "boolean") + if not r then + req.result = false + end + req.waiting[k] = nil + end) + end + end + end + if shouldKernelJudge then + -- Rather restrictive, but an important safety measure + req.result = pkg:sub(1, 4) == "sys-" + req.service() + else + table.insert(outstandingSR, req) + end + end + local env = baseProcEnv() + env.neo.pid = pid + env.neo.executeAsync = startFromUser + env.neo.execute = function (...) + return osExecuteCore(function () end, ...) + end + env.neo.executeExt = osExecuteCore + env.neo.requestAccessAsync = requestAccessAsync + env.neo.requestAccess = function (perm, handler) + requestAccessAsync(perm) + if not handler then handler = function() end end + while true do + local n = {coroutine.yield()} + if n[1] == "k.securityresponse" then + -- Security response - if it involves the permission, then take it + if n[2] == perm then return n[3] end + end + handler(table.unpack(n)) + end + end + env.neo.scheduleTimer = function (time) + ensureType(time, "number") + local tag = {} + table.insert(timers, {time, function(ofs) + return execEvent(pid, "k.timer", tag, time, ofs) + end}) + return tag + end + + local appfunc, r = loadfile("apps/" .. pkg .. ".lua", env) + if not appfunc then + return nil, r + end + proc.co = coroutine.create(appfunc) + proc.pkg = pkg + proc.access = { + -- These permissions are the "critical set". + ["s.k.securityresponse"] = true, + ["s.k.timer"] = true, + ["s.k.procnew"] = true, + ["s.k.procdie"] = true, + -- Used when a registration is updated, in particular, as this signifies "readiness" + ["s.k.registration"] = true, + } + proc.denied = {} + proc.deathcbs = {} + proc.cpuUsage = 0 + -- Note the target process doesn't get the procnew (it's executed after it's creation) + pcall(distEvent, nil, "k.procnew", pkg, pid) + processes[pid] = proc + -- For processes waiting on others, this at least tries to guarantee some safety. + if criticalFailure then + execEvent(pid, ...) + else + if not pcall(execEvent, pid, ...) then + return nil, "neocore" + end + end + return pid +end + +-- Main Scheduling Loop -- + +local function processSRs() + local didAnything = false + for k, v in pairs(outstandingSR) do + -- Outstanding security request handler. + local actualWaitingCount = 0 + for k2, _ in pairs(v.waiting) do + if not processes[k2] then + v.waiting[k2] = nil + v.result = false + else + actualWaitingCount = actualWaitingCount + 1 + end + end + if actualWaitingCount == 0 then + -- Service the SR + outstandingSR[k].service() + outstandingSR[k] = nil + didAnything = true + end + end + return didAnything +end + +-- The actual loop & initialization + +if not start("sys-init") then error("Could not start sys-init") end +while true do + local tmr = nil + for i = 1, 16 do + tmr = nil + local now = computer.uptime() + local breaking = false -- Used when a process dies - in this case it's assumed OC just did something drastic + local didAnything = false + local k = 1 + while timers[k] do + local v = timers[k] + if v[1] <= now then + if v[2](now - v[1]) then + breaking = true + tmr = 0.05 + break + end + didAnything = true + v = nil + else + if not tmr then + tmr = v[1] + else + tmr = math.min(tmr, v[1]) + end + end + if v then + k = k + 1 + else + table.remove(timers, k) + end + end + if breaking then break end + didAnything = didAnything or processSRs() + -- If the system didn't make any progress, then we're waiting for a signal (this includes timers) + if not didAnything then break end + end + now = computer.uptime() -- the above probably took a while + local dist = nil + if tmr then + dist = tmr - now + if dist < 0.05 then dist = 0.05 end + end + local signal = {computer.pullSignal(dist)} + idleTime = idleTime + (computer.uptime() - now) + if signal[1] then + distEvent(nil, "h." .. signal[1], select(2, table.unpack(signal))) + end +end diff --git a/code/libs/event.lua b/code/libs/event.lua new file mode 100644 index 0000000..a34e557 --- /dev/null +++ b/code/libs/event.lua @@ -0,0 +1,104 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- event: Implements pull/listen semantics in a consistent way for a given process. +-- This is similar in API to OpenOS's event framework, but is per-process. +-- To make this work, a function is shared. +-- This function needs access to the caller's NEO in order to ensure that NEO system functions are covered. +-- This can do less checks than usual as it only affects the caller. + +return function (neo) + local listeners = {} + local translations = {} + local timers = {} + local oldRA = neo.requestAccess + local function doPush(tp, tag, ...) + if tp == "k.timer" then + local f = timers[tag] + timers[tag] = nil + if f then + f(...) + end + end + local listeners2 = {} + for k, _ in pairs(listeners) do + table.insert(listeners2, k) + end + for _, v in ipairs(listeners2) do + v(tp, tag, ...) + end + end + neo.requestAccess = function (perm, handler) + return oldRA(perm, function (...) + doPush(...) + if handler then + handler(...) + end + end) + end + local function doPull() + local ev = {coroutine.yield()} + doPush(table.unpack(ev)) + return ev + end + return { + listen = function (p1, p2) + if type(p2) == "function" then + local t = function (...) + local evn = ... + if evn == p1 then + p2(...) + end + end + translations[p2] = t + listeners[t] = true + else + listeners[p1] = true + end + end, + ignore = function (func) + if translations[func] then + listeners[translations[func]] = nil + translations[func] = nil + end + listeners[func] = nil + end, + -- Arguments are filtering. + -- For example, to filter for timers with a given tag, use pull("k.timer", tag) + -- Note the explicit discouragement of timeout-pulls. Use runAt or the complex form of sleep. + pull = function (...) + local filter = {...} + while true do + local ev = doPull() + local err = false + for i = 1, #filter do + err = err or (filter[i] ~= ev[i]) + end + if not err then return table.unpack(ev) end + end + end, + -- Run a function at a specified uptime. + runAt = function (time, func) + timers[neo.scheduleTimer(time)] = func + end, + -- Sleeps until a time (unless time is nil, in which case sleeps forever), but can be woken up before then. + -- This allows using an async API as a synchronous one with optional time-to-failure. + sleepTo = function (time, wakeUpPoll) + local timerHit = false + local oWUP = wakeUpPoll + wakeUpPoll = function () + if oWUP then + return timerHit or (oWUP()) + end + return timerHit + end + if time then + timers[neo.scheduleTimer(time)] = function () timerHit = true end + end + while true do + local ev = doPull() + if wakeUpPoll() then return end + end + end + } +end diff --git a/code/libs/neoux.lua b/code/libs/neoux.lua new file mode 100644 index 0000000..71a61ef --- /dev/null +++ b/code/libs/neoux.lua @@ -0,0 +1,406 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- neoux: Implements utilities on top of Everest & event: +-- Everest crash protection +return function (event, neo) + -- this is why neo access is 'needed' + local function retrieveIcecap() + return neo.requestAccess("x.neo.pub.base") + end + local function retrieveEverest() + return neo.requestAccess("x.neo.pub.window") + end + -- id -> {lclEv, w, h, title, callback} + local windows = {} + local lclEvToW = {} + retrieveEverest() + local function everestDied() + for _, v in pairs(windows) do + v[1] = nil + end + lclEvToW = {} + end + local function pushWindowToEverest(k) + local everest = retrieveEverest() + if not everest then + everestDied() + return + end + local v = windows[k] + local r, res = pcall(everest, v[2], v[3], v[4]) + if not r then + everestDied() + return + else + -- res is the window! + lclEvToW[res.id] = k + windows[k][1] = res + end + end + event.listen("k.registration", function (_, xe) + if #windows > 0 then + if xe == "x.neo.pub.window" then + for k, v in pairs(windows) do + pushWindowToEverest(k) + end + end + end + end) + event.listen("k.deregistration", function (_, xe) + if xe == "x.neo.pub.window" then + everestDied() + end + end) + event.listen("x.neo.pub.window", function (_, window, tp, ...) + if lclEvToW[window] then + windows[lclEvToW[window]][5](tp, ...) + end + end) + local neoux = {} + neoux.fileDialog = function (forWrite, callback) + local sync = false + local rtt = nil + if not callback then + sync = true + callback = function (rt) + sync = false + rtt = rt + end + end + local tag = retrieveIcecap().showFileDialogAsync(forWrite) + local f + f = function (_, fd, tg, re) + if fd == "filedialog" then + if tg == tag then + callback(re) + event.ignore(f) + end + end + end + event.listen("x.neo.pub.base", f) + while sync do + event.pull() + end + return rtt + end + -- Creates a wrapper around a window. + neoux.create = function (w, h, title, callback) + local window = {} + local windowCore = {nil, w, h, title, function (...) callback(window, ...) end} + local k = #windows + 1 + table.insert(windows, windowCore) + pushWindowToEverest(k) + window.reset = function (w, h, cb) + callback = cb + if mw or nh then + windowCore[2] = nw + windowCore[3] = nh + end + if windowCore[1] then + windowCore[1].setSize(windowCore[2], windowCore[3]) + end + end + window.getSize = function () + return windowCore[2], windowCore[3] + end + window.setSize = function (w, h) + windowCore[2] = w + windowCore[3] = h + if windowCore[1] then + windowCore[1].setSize(w, h) + end + end + window.span = function (x, y, text, bg, fg) + if windowCore[1] then + pcall(windowCore[1].span, x, y, text, bg, fg) + end + end + window.close = function () + if windowCore[1] then + windowCore[1].close() + lclEvToW[windowCore[1].id] = nil + windowCore[1] = nil + end + windows[k] = nil + end + return window + end + -- Padding function + neoux.pad = function (t, len, centre, cut) + local l = unicode.len(t) + local add = len - l + if add > 0 then + if centre then + t = (" "):rep(math.floor(add / 2)) .. t .. (" "):rep(math.ceil(add / 2)) + else + t = t .. (" "):rep(add) + end + end + if cut then + t = unicode.sub(t, 1, len) + end + return t + end + -- Text dialog formatting function. + -- Assumes you've run unicode.safeTextFormat if need be + neoux.fmtText = function (text, w) + local nl = text:find("\n") + if nl then + local base = text:sub(1, nl - 1) + local ext = text:sub(nl + 1) + local baseT = neoux.fmtText(base, w) + local extT = neoux.fmtText(ext, w) + for _, v in ipairs(extT) do + table.insert(baseT, v) + end + return baseT + end + if unicode.len(text) > w then + local lastSpace + for i = 1, w do + if unicode.sub(text, i, i) == " " then + -- Check this isn't an inserted space (unicode safe text format) + local ok = true + if i > 1 then + if unicode.charWidth(unicode.sub(text, i - 1, i - 1)) ~= 1 then + ok = false + end + end + if ok then + lastSpace = i + end + end + end + local baseText, extText + if not lastSpace then + -- Break at a 1-earlier boundary + local wEffect = w + if unicode.charWidth(unicode.sub(text, w, w)) ~= 1 then + -- Guaranteed to be safe, so + wEffect = wEffect - 1 + end + baseText = unicode.sub(text, 1, wEffect) + extText = unicode.sub(text, wEffect + 1) + else + baseText = unicode.sub(text, 1, lastSpace - 1) + extText = unicode.sub(text, lastSpace + 1) + end + local full = neoux.fmtText(extText, w) + table.insert(full, 1, neoux.pad(baseText, w)) + return full + end + return {neoux.pad(text, w)} + end + -- UI FRAMEWORK -- + neoux.tcwindow = function (w, h, controls, closing, bg, fg) + local selIndex = #controls + if #controls == 0 then + selIndex = 1 + end + local function rotateSelIndex() + local original = selIndex + while true do + selIndex = selIndex + 1 + if not controls[selIndex] then + selIndex = 1 + end + if controls[selIndex] then + if controls[selIndex].selectable then + return + end + end + if selIndex == original then + return + end + end + end + rotateSelIndex() + + local function doLine(window, a) + window.span(1, a, (" "):rep(w), bg, fg) + for k, v in ipairs(controls) do + if a >= v.y then + if a < (v.y + v.h) then + v.line(window, v.x, a, (a - v.y) + 1, bg, fg, selIndex == k) + end + end + end + end + local function doZone(window, control, cache) + for i = 1, control.h do + local l = i + control.y - 1 + if (not cache) or (not cache[l]) then + doLine(window, l) + if cache then cache[l] = true end + end + end + end + + return function (window, ev, a, b, c) + if ev == "touch" then + local found = nil + for k, v in ipairs(controls) do + if v.selectable then + if a >= v.x then + if a < (v.x + v.w) then + if b >= v.y then + if b < (v.y + v.h) then + found = k + break + end + end + end + end + end + end + if found then + local c1 = controls[selIndex] + selIndex = found + local c2 = controls[selIndex] + local cache = {} + if c1 then doZone(window, c1, cache) end + if c2 then + doZone(window, c2, cache) + if c2.touch then + c2.touch(window, function () doZone(window, c2) end, (a - c2.x) + 1, (b - c2.y) + 1) + end + end + end + end + if ev == "drag" then + if controls[selIndex] then + if controls[selIndex].drag then + controls[selIndex].drag(window, function () doZone(window, controls[selIndex]) end, (a - controls[selIndex].x) + 1, (b - controls[selIndex].y) + 1) + end + end + end + if ev == "key" then + if a == 9 then + if c then + local c1 = controls[selIndex] + rotateSelIndex() + local c2 = controls[selIndex] + local cache = {} + if c1 then doZone(window, c1, cache) end + if c2 then doZone(window, c2, cache) end + end + else + if controls[selIndex] then + if controls[selIndex].key then + controls[selIndex].key(window, function () doZone(window, controls[selIndex]) end, a, b, c) + end + end + end + end + if ev == "line" then + doLine(window, a) + end + if ev == "close" then + closing(window) + end + end, doZone + end + neoux.tcrawview = function (x, y, lines) + return { + x = x, + y = y, + w = unicode.len(lines[1]), + h = #lines, + selectable = false, + line = function (window, x, y, lined, bg, fg, selected) + -- Can't be selected normally so ignore that flag + window.span(x, y, lines[lined], bg, fg) + end + } + end + neoux.tchdivider = function (x, y, w) + return neoux.tcrawview(x, y, {("-"):rep(w)}) + end + neoux.tcvdivider = function (x, y, h) + local n = {} + for i = 1, h do + n[i] = "|" + end + return neoux.tcrawview(x, y, n) + end + neoux.tcbutton = function (x, y, text, callback) + text = "<" .. text .. ">" + return { + x = x, + y = y, + w = unicode.len(text), + h = 1, + selectable = true, + key = function (window, update, a, c, d) + if d then + if a == 13 or a == 32 then + callback(window) + end + end + end, + touch = function (window, update, x, y) + callback(window) + end, + line = function (window, x, y, lind, bg, fg, selected) + local fg1 = fg + if selected then + fg = bg + bg = fg1 + end + window.span(x, y, text, bg, fg) + end + } + end + -- Note: w should be at least 2 - this is similar to buttons. + neoux.tcfield = function (x, y, w, textprop) + return { + x = x, + y = y, + w = w, + h = 1, + selectable = true, + key = function (window, update, a, c, d) + if d then + if a == 13 then + elseif a == 8 then + local str = textprop() + textprop(unicode.sub(str, 1, unicode.len(str) - 1)) + update() + elseif a ~= 0 then + textprop(textprop() .. unicode.char(a)) + update() + end + end + end, + line = function (window, x, y, lind, bg, fg, selected) + local fg1 = fg + if selected then + fg = bg + bg = fg1 + end + local text = unicode.safeTextFormat(textprop()) + local txl = unicode.len(text) + local start = math.max(1, (txl - (w - 2)) + 1) + text = "[" .. neoux.pad(unicode.sub(text, start, start + (w - 3)), w - 2, false, true) .. "]" + window.span(x, y, text, bg, fg) + end + } + end + neoux.startDialog = function (fmt, title, wait) + fmt = neoux.fmtText(unicode.safeTextFormat(fmt), 20) + neoux.create(20, #fmt, title, function (window, ev, a, b, c) + if ev == "line" then + window.span(1, a, fmt[a], 0xFFFFFF, 0) + end + if ev == "close" then + window.close() + wait = nil + end + end) + while wait do + event.pull() + end + end + return neoux +end diff --git a/code/libs/serial.lua b/code/libs/serial.lua new file mode 100644 index 0000000..a33f22c --- /dev/null +++ b/code/libs/serial.lua @@ -0,0 +1,28 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. +local doSerialize = nil +function doSerialize(s) + if type(s) == "table" then + local str = "{\n" + for k, v in pairs(s) do + str = str .. "[" .. doSerialize(k) .. "]=" .. doSerialize(v) .. ",\n" + end + return str .. "}" + end + if type(s) == "string" then + return string.format("%q", s) + end + if type(s) == "number" then + return tostring(s) + end + error("Cannot serialize " .. type(s)) +end +return neo.wrapMeta({ + serialize = function (x) return "return " .. doSerialize(x) end, + deserialize = function (s) + local r1, r2 = pcall(function() return load(s, "=serial", "t", {})() end) + if r1 then + return r2 + end + end +}) diff --git a/code/libs/sys-filedialog.lua b/code/libs/sys-filedialog.lua new file mode 100644 index 0000000..ec45d7b --- /dev/null +++ b/code/libs/sys-filedialog.lua @@ -0,0 +1,159 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- just don't bother with proper indent here +return function (event, neoux, retFunc, fs, pkg, mode) + +local class = "manage" +if mode ~= nil then + if mode then + class = "save" + else + class = "load" + end +end + +local prepareNode + +local ccb = nil +local function cb(...) + local res, e = pcall(ccb, ...) + if not res then + prepareNode({ + name = "F.M. Error", + list = function () + local l = {} + for k, v in ipairs(neoux.fmtText(unicode.safeTextFormat(e), 25)) do + l[k] = {v, function () return true end} + end + return l + end, + unknownAvailable = false, + selectUnknown = function (text) end + }) + end +end + +local function prepareNodeI(node) + local l = node.list() + local w, h = 30, 8 + -- Local State + -- Selection. Having this equal to #l + 1 means typing area ('unknown') + local selection = 1 + local unknownTx = "" + -- + local function format(a) + if a <= 1 then + return true, true, node.name + end + local camY = math.max(1, selection - 4) + local idx = a + camY - 2 + if node.unknownAvailable then + if idx == #l + 1 then + return selection == #l + 1, false, ":" .. unknownTx + end + end + if l[idx] then + return selection == idx, false, l[idx][1] + end + return true, true, "~~~" + end + local function updateLine(wnd, a) + local colA, colB = 0xFFFFFF, 0 + local sel, cen, text = format(a) + if sel then + colB, colA = 0xFFFFFF, 0 + end + wnd.span(1, a, neoux.pad(unicode.safeTextFormat(text), w, cen, true), colA, colB) + end + local function flush(wnd) + for i = 1, h do + updateLine(wnd, i) + end + end + local function key(wnd, ka, kc, down) + if not down then return end + if (ka == 9) or (kc == 208) then + local lo = selection + selection = selection + 1 + local max = #l + if node.unknownAvailable then + max = max + 1 + end + if selection > max then + selection = 1 + end + flush(wnd) + return + end + if kc == 200 then + local lo = selection + selection = selection - 1 + local max = #l + if node.unknownAvailable then + max = max + 1 + end + if selection == 0 then + selection = max + end + flush(wnd) + return + end + if ka == 13 then + local aResult, res + if selection ~= #l + 1 then + aResult, res = l[selection][2]() + else + aResult, res = node.selectUnknown(unknownTx) + end + if aResult then + retFunc(res) + wnd.close() + else + prepareNode(res) + end + return + end + if selection == #l + 1 then + if ka == 8 then + unknownTx = unicode.sub(unknownTx, 1, unicode.len(unknownTx) - 1) + flush(wnd) + return + end + if ka ~= 0 then + unknownTx = unknownTx .. unicode.char(ka) + flush(wnd) + end + end + end + return w, h, function (wnd, evt, a, b, c) + if evt == "key" then + key(wnd, a, b, c) + end + if evt == "line" then + updateLine(wnd, a) + end + if evt == "close" then + retFunc(nil) + wnd.close() + end + end +end + +local text = class .. " " .. pkg +local window = neoux.create(25, 10, text, cb) + +function prepareNode(node) + local w, h, c = prepareNodeI(node) + ccb = c + window.setSize(w, h) +end + +prepareNode(require("sys-filevfs")(fs, mode)) +return function () + retFunc() + window.close() +end + +-- end bad indent +end diff --git a/code/libs/sys-filevfs.lua b/code/libs/sys-filevfs.lua new file mode 100644 index 0000000..3e90ea4 --- /dev/null +++ b/code/libs/sys-filevfs.lua @@ -0,0 +1,181 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- Used by filedialog to provide a sane relative environment. +-- Essentially, the filedialog is just a 'thin' UI wrapper over this. +-- Returns the root node. + +local function dialog(name, parent) + return { + name = name, + list = function () return {{"Back", function () return nil, parent end}} end, + unknownAvailable = false, + selectUnknown = function (text) end + } +end + +local getFsNode, getRoot +local setupCopyNode +function setupCopyNode(parent, myRoot, op, complete) + local function handleResult(aRes, res) + if aRes then + return complete(res) + else + return nil, setupCopyNode(parent, res, op, complete) + end + end + return { + name = "(" .. op .. ") " .. myRoot.name, + list = function () + local l = {} + table.insert(l, {"Cancel Operation: " .. op, function () + return false, parent + end}) + for _, v in ipairs(myRoot.list()) do + table.insert(l, {v[1], function () + return handleResult(v[2]()) + end}) + end + return l + end, + unknownAvailable = myRoot.unknownAvailable, + selectUnknown = function (tx) + return handleResult(myRoot.selectUnknown(tx)) + end + } +end +local function setupCopyVirtualEnvironment(fs, parent, fwrap) + if not fwrap then + return false, dialog("Could not open source", parent) + end + local myRoot = getRoot(fs, true) + -- Setup wrapping node + return setupCopyNode(parent, myRoot, "Copy", function (fwrap2) + if not fwrap2 then + return false, dialog("Could not open dest.", parent) + end + local data = fwrap.read(neo.readBufSize) + while data do + fwrap2.write(data) + data = fwrap.read(neo.readBufSize) + end + fwrap.close() + fwrap2.close() + return false, dialog("Completed copy.", parent) + end) +end +getFsNode = function (fs, parent, fsc, path, mode) + local va = fsc.address:sub(1, 4) + if path:sub(#path, #path) == "/" then + local t + local confirmedDel = false + t = { + name = "DIR : " .. va .. path, + list = function () + local n = {} + n[1] = {"..", function () + return nil, parent + end} + for k, v in ipairs(fsc.list(path)) do + local nm = "[F] " .. v + local fp = path .. v + if fsc.isDirectory(fp) then + nm = "[D] " .. v + end + n[k + 1] = {nm, function () return nil, getFsNode(fs, t, fsc, fp, mode) end} + end + local delText = "Delete" + if confirmedDel then + delText = "Delete " + end + n[#n + 1] = {delText, function () + if not confirmedDel then + confirmedDel = true + return nil, t + end + fsc.remove(path) + return nil, dialog("Done.", parent) + end} + n[#n + 1] = {"Mk. Directory", function () + return nil, { + name = "MKDIR...", + list = function () return {} end, + unknownAvailable = true, + selectUnknown = function (text) + fsc.makeDirectory(path .. text) + return nil, dialog("Done!", t) + end + } + end} + return n + end, + unknownAvailable = mode ~= nil, + selectUnknown = function (text) + return true, require("sys-filewrap")(fsc, path .. text, mode) + end + } + return t + end + return { + name = "FILE: " .. va .. path, + list = function () + local n = {} + table.insert(n, {"Back", function () + return nil, parent + end}) + if mode ~= nil then + table.insert(n, {"Open", function () + return true, require("sys-filewrap")(fsc, path, mode) + end}) + end + table.insert(n, {"Copy", function () + return nil, setupCopyVirtualEnvironment(fs, parent, require("sys-filewrap")(fsc, path, false)) + end}) + table.insert(n, {"Delete", function () + fsc.remove(path) + return nil, dialog("Done.", parent) + end}) + return n + end, + unknownAvailable = false, + selectUnknown = function (text) end + } +end +function getRoot(fs, mode) + local t + t = { + name = "DRVS:", + list = function () + local l = {} + for fsi in fs.list() do + local id = fsi.getLabel() + if not id then + id = " Disk" + else + id = ":" .. id + end + if fsi == fs.primary then + id = "NEO" .. id + elseif fsi == fs.temporary then + id = "RAM" .. id + end + local used, total = fsi.spaceUsed(), fsi.spaceTotal() + local amount = string.format("%02i", math.ceil((used / total) * 100)) + local mb = math.floor(total / (1024 * 1024)) + if fsi.isReadOnly() then + id = amount .. "% RO " .. mb .. "M " .. id + else + id = amount .. "% RW " .. mb .. "M " .. id + end + table.insert(l, {fsi.address:sub(1, 4) .. ": " .. id, function () + return nil, getFsNode(fs, t, fsi, "/", mode) + end}) + end + return l + end, + unknownAvailable = false, + selectUnknown = function (text) end + } + return t +end +return getRoot diff --git a/code/libs/sys-filewrap.lua b/code/libs/sys-filewrap.lua new file mode 100644 index 0000000..580b628 --- /dev/null +++ b/code/libs/sys-filewrap.lua @@ -0,0 +1,42 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +return function(dev, file, mode) + local n = "rb" + if mode then n = "wb" end + local handle = dev.open(file, n) + local open = true + local function closer() + if not open then return end + open = false + pcall(function() + dev.close(handle) + end) + end + if not mode then + return { + close = closer, + read = function (len) + if len == "*a" then + local ch = "" + local c = dev.read(handle, neo.readBufSize) + while c do + ch = ch .. c + c = dev.read(handle, neo.readBufSize) + end + return ch + end + if type(len) ~= "number" then error("Length of read must be number or '*a'") end + return dev.read(handle, len) + end + }, closer + else + return { + close = closer, + write = function (txt) + if type(txt) ~= "string" then error("Write data must be string-bytearray") end + return dev.write(handle, txt) + end + }, closer + end +end diff --git a/code/libs/sys-secpolicy.lua b/code/libs/sys-secpolicy.lua new file mode 100644 index 0000000..2c7482c --- /dev/null +++ b/code/libs/sys-secpolicy.lua @@ -0,0 +1,90 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- CRITICAL FILE! +-- This file defines how your KittenOS NEO system responds to access requests. +-- Modification, renaming or deletion can disable security features. +-- Usually, a change that breaks the ability for the file to do it's job will cause the "failsafe" to activate, +-- and for the system to become unable to run user applications. +-- However - I would not like to test this in a situation where said user applications were in any way untrusted, +-- for example, if you downloaded them from the Internet, or in particular if someone forwarded them over Discord. +-- IRC is usually pretty safe, but no guarantees. + +-- Returns "allow", "deny", or "ask". +local actualPolicy = function (pkg, pid, perm) + -- System stuff is allowed. + if pkg:sub(1, 4) == "sys-" then + return "allow" + end + -- + -- x.neo.pub (aka Icecap) is open to all + if perm:sub(1, 10) == "x.neo.pub." then + return "allow" + end + -- This is to ensure the prefix naming scheme is FOLLOWED! + -- sys- : System, part of KittenOS NEO and thus tries to present a "unified fragmented interface" in 'neo' + -- app- : Application - these can have ad-hoc relationships. It is EXPECTED these have a GUI + -- svc- : Service - Same as Application but with no expectation of desktop usability + -- Libraries "have no rights" as they are essentially loadable blobs of Lua code. + -- They have access via the calling program, and have a subset of the NEO Kernel API + local pfx = nil + if pkg:sub(1, 4) == "app-" then pfx = "app" end + if pkg:sub(1, 4) == "svc-" then pfx = "svc" end + if pfx then + -- Apps can register with their own name + if perm == "r." .. pfx .. "." .. pkg:sub(5) then + return "allow" + end + end + -- Userlevel has no other registration rights + if perm:sub(1, 2) == "r." then + return "deny" + end + -- app/svc stuff is world-accessible + if perm:sub(1, 6) == "x.app." then + return "allow" + end + if perm:sub(1, 6) == "x.svc." then + return "allow" + end + -- For hardware access, ASK! + return "ask" +end + +return function (neoux, settings, pkg, pid, perm, rsp) + local res = actualPolicy(pkg, pid, perm) + if res == "ask" then + res = settings.getSetting("perm|" .. pkg .. "|" .. perm) or "ask" + end + if res == "ask" then + local fmt = neoux.fmtText(unicode.safeTextFormat(string.format("%s/%i wants:\n%s\nAllow this?", pkg, pid, perm)), 20) + + local always = "Always" + local yes = "Yes" + local no = "No" + local totalW = (#yes) + (#always) + (#no) + 8 + neoux.create(20, #fmt + 2, "security", neoux.tcwindow(20, #fmt + 3, { + neoux.tcbutton(1, #fmt + 2, no, function (w) + rsp(false) + w.close() + end), + neoux.tcbutton(totalW - ((#yes) + 1), #fmt + 2, yes, function (w) + rsp(true) + w.close() + end), + neoux.tcbutton((#yes) + 3, #fmt + 2, always, function (w) + settings.setSetting("perm|" .. pkg .. "|" .. perm, "allow") + rsp(true) + w.close() + end), + neoux.tchdivider(1, #fmt + 1, 21), + neoux.tcrawview(1, 1, fmt), + }, function (w) + rsp(false) + w.close() + end, 0xFFFFFF, 0)) + else + rsp(res == "allow") + end +end + diff --git a/com2/bdivide.lua b/com2/bdivide.lua new file mode 100644 index 0000000..670dcf3 --- /dev/null +++ b/com2/bdivide.lua @@ -0,0 +1,58 @@ +-- BDIVIDE +-- format: +-- 0-127 for constants +-- , <(len - 3) * 2, + lowest bit is upper bit of position>, + +io.write("\x00") -- initiation character + +local blockCache = {} +local window = 0 +local blockUse = 128 +for i = 128, 128 + blockUse - 1 do + blockCache[i] = ("\x00"):rep(512) +end + +local function runBlock(blk) + -- firstly, get current block index + local blockIndex = window + 128 + window = (window + 1) % blockUse + blockCache[blockIndex] = "" + -- ok, now work on the problem + local i = 1 + while i <= #blk do + local bestData = blk:sub(i, i) + local bestRes = bestData + local bestScore = 1 + for bid = 128, 128 + blockUse - 1 do + for lm = 0, 127 do + local al = lm + 3 + local pfx = blk:sub(i, i + al - 1) + if #pfx ~= al then + break + end + local p = blockCache[bid]:find(pfx, 1, true) + if not p then + break + end + local score = al / 3 + if score > bestScore then + bestData = string.char(bid) .. string.char((lm * 2) + math.floor((p - 1) / 256)) .. string.char((p - 1) % 256) + bestRes = pfx + bestScore = score + end + end + end + -- ok, encode! + io.write(bestData) + blockCache[blockIndex] = blockCache[blockIndex] .. bestRes + i = i + #bestRes + end +end + +while true do + local blkd = io.read(512) + runBlock(blkd) + if #blkd < 512 then + return + end +end diff --git a/com2/bundiv.lua b/com2/bundiv.lua new file mode 100644 index 0000000..f0c5e18 --- /dev/null +++ b/com2/bundiv.lua @@ -0,0 +1,64 @@ +local sector = io.write -- XX +-- BUNDIVIDE reference implementation for integration XX +local Cs,Cbu,Cb,Cw,Cp,Ci,CP,CB,CD={},128,"",128,"" +CP=function(d,b,i) + i=1 + while i<=#d do + b=d:byte(i) + i=i+1 + if b==127 then + b=d:byte(i) + i=i+1 + if b==127 then + b=d:byte(i)+254 + i=i+1 + else + b=b+127 + end + end + Cp=Cp..string.char(b) + if #Cp==512 then + sector(Cp) + Cp="" + end + end +end +for i=128,127+Cbu do Cs[i]=("\x00"):rep(512) end +Cs[Cw]="" +CB=function(d,i,d2,x,y) + i=1 + while i<=#d-2 do + b=d:byte(i) + d2=d:sub(i,i) + i=i+1 + if not Ci then + if b==0then + Ci=1 + end + else + if b>=128then + x=d:byte(i)i=i+1 + y=(d:byte(i)+((x%2)*256))i=i+1 + d2=Cs[b]:sub(y+1,y+3+math.floor(x/2)) + end + Cs[Cw]=Cs[Cw]..d2 + if #Cs[Cw]>=512then + CP(Cs[Cw]) + Cw=((Cw-127)%Cbu)+128 + Cs[Cw]="" + end + end + end + return i +end +CD=function(d) + Cb=Cb..d + Cb=Cb:sub(CB(Cb)) +end +CD(io.read("*a")) -- XX +--D.remove("init-bdivide.lua")-- +--D.rename("init.lua","init-bdivide.lua")-- +--local Ch=D.open("init-bdivide.lua","rb")-- +--dieCB=function()D.close(Ch)D.remove("init-bdivide.lua")end-- +--while true do local t=D.read(Ch, 64)if not t then break end CD(t)end-- +CD("\x00\x00")CP(Cs[Cw]) diff --git a/com2/preproc.lua b/com2/preproc.lua new file mode 100644 index 0000000..66db649 --- /dev/null +++ b/com2/preproc.lua @@ -0,0 +1,17 @@ +-- PREPROC: preprocess input +while true do + local c = io.read(1) + if not c then return end + local bc = c:byte() + if bc < 127 then + io.write(c) + else + if bc <= 253 then + -- 127(0) through 253(126) + io.write("\x7F" .. string.char(bc - 127)) + else + -- 254(0) through 255 (1) + io.write("\x7F\x7F" .. string.char(bc - 254)) + end + end +end diff --git a/heroes.lua b/heroes.lua new file mode 100644 index 0000000..e8bb003 --- /dev/null +++ b/heroes.lua @@ -0,0 +1,32 @@ +-- SYSTEM HEROES. +-- Nabbed Sonic Heroes lyrics follow: +-- "What comes up, must come down... " +-- "Yet, my feet don't touch the ground..." + +-- arg is the size of the code.tar file +local arg = ... +os.execute("lua com2/preproc.lua < code.tar | lua com2/bdivide.lua > com2/code.tar.bd") +os.execute("cat insthead.lua") +print("sC=" .. math.ceil(tonumber(arg) / 512)) +local src = io.open("com2/bundiv.lua", "r") +while true do + local line = src:read() + if not line then + src:close() + io.write("--[[") + io.flush() + os.execute("cat com2/code.tar.bd") + io.write("]]") + return + end + local endix = line:sub(#line-1,#line) + if endix ~= "XX" then + if endix == "--" then + -- included + print(line:sub(3,#line-2)) + else + print(line) + end + end + -- XX means ignored. +end diff --git a/insthead.lua b/insthead.lua new file mode 100644 index 0000000..59095fe --- /dev/null +++ b/insthead.lua @@ -0,0 +1,103 @@ +-- KOSNEO inst. +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +local C, O, G, D = component, computer +local sa = C.list("screen", true)() +if sa then + G = C.list("gpu", true)() + if G then + G = C.proxy(G) + G.bind(sa) + G.setForeground(0xFFFFFF) + G.setBackground(0x000000) + G.setResolution(50, 5) + G.setDepth(1) + G.fill(1, 1, 50, 5, " ") + G.setBackground(0xFFFFFF) + G.setForeground(0x000000) + G.fill(1, 2, 50, 1, " ") + G.set(2, 2, "KittenOS NEO Installer") + end +end + +D = C.proxy(O.getBootAddress()) + +local tF = nil +local tFN = "Starting..." +local tFSR = 0 +local tW = 0 + +local convoct +convoct = function (oct) + local v = oct:byte(#oct) - 0x30 + if #oct > 1 then + return (convoct(oct:sub(1, #oct - 1)) * 8) + v + end + return v +end +local function tA(s) + if tW > 0 then + tW = tW - 1 + return + end + if tF then + local ta = math.min(512, tFSR) + D.write(tF, s:sub(1, ta)) + tFSR = tFSR - ta + if tFSR == 0 then + D.close(tF) + tF = nil + end + else + tFN = s:sub(1, 100):gsub("\x00", "") + local sz = convoct(s:sub(125, 135)) + if tFN:sub(1, 5) ~= "code/" then + tW = math.ceil(sz / 512) + else + tFN = tFN:sub(6) + if tFN == "" then + return + end + if tFN:sub(#tFN) == "/" then + tW = math.ceil(sz / 512) + D.makeDirectory(tFN) + else + tF = D.open(tFN, "wb") + tFSR = sz + if tFSR == 0 then + D.close(tF) + tF = nil + end + end + end + end +end + +local dieCB = function () end + +local sN = 0 +local sC = 0 + +local function sector(n) + tA(n) + sN = sN + 1 + if G then + local a = sN / sC + G.fill(1, 2, 50, 1, " ") + G.set(2, 2, "KittenOS NEO Installer : " .. tFN) + G.setForeground(0xFFFFFF) + G.setBackground(0x000000) + G.fill(2, 4, 48, 1, " ") + G.setBackground(0xFFFFFF) + G.setForeground(0x000000) + G.fill(2, 4, math.ceil(48 * a), 1, " ") + end + if sN % 8 == 0 then + O.pullSignal(0.05) + end + if sN == sC then + dieCB() + O.shutdown(true) + end +end diff --git a/mkucinst.lua b/mkucinst.lua new file mode 100644 index 0000000..8f48e4d --- /dev/null +++ b/mkucinst.lua @@ -0,0 +1,24 @@ +os.execute("tar -cf code.tar code") +os.execute("cat insthead.lua > inst.lua") +local f = io.open("inst.lua", "ab") + +local df = io.open("code.tar", "rb") +local sc = 0 +while true do + local d = df:read(512) + if not d then break end + sc = sc + 1 +end +df:close() +local df = io.open("code.tar", "rb") +f:write("sC = " .. sc .. "\n") +while true do + local d = df:read(512) + if d then + f:write(string.format("sector(%q)", d)) + else + break + end +end +df:close() +f:close() diff --git a/preSH.tar.gz b/preSH.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ec94073e625a880c833215aeaec3874c6a4bbcda GIT binary patch literal 294267 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

rNB@LMHrnVJ-d)D zgIo_U|3dJp4VGzUl)rvBw~&OU-wWK=tWNy>a(?a>nc?Asn@RO^&F`uw)e3mMQ^6;I zvg9&6D_#uvE=&H>^pmj&; zydqPupYuwfDTg)HPOl*mQS2H8;M?)`6xFR(h1S7L8LrYKhPV$wNLgn=#||Ym*;L`|v}*x-WkWzNnDDT0e%7 zU_}92tcgtC{ahRFNY-NzovU(MAPXty76A_ETsu)>E&+S6&EzD;Gvr1w$fs&BZ#dsrD_DmOo2< zody-P>$pUP6(sJ!FpJu;(B(3qze9v;qH09-r8ah<{QK@>I&i0SQ6}!+FYzs?uX&#R zvFx@}EynFaQEypZeV2*aE(ywsHEhJOEIAE}S1zw2q7KsU*p3@Kf50xCJSg}R3uMhcf+5fO!7EFTbc&1Kz`7ZKLBM91O7@#ZvUbc zDHo8oUO0#N2Uwy>#AQb2BE?jz1i@Z)OpgnV#++&S+~L*T{G*#w?db-$i%Yki2um;; zdzI4UCLDgDM`U8XrB#p$?Spz;Aeh1PRgEnDF%WXO2S`bA<#Lq6qDNEASf?<#g)QUe zlc|p!NsY1M(y+-e z)Z$^lOw-LF!1BW?qh%9K=*X~*R2eP;T?5`BF4%;Gkf3B{H=fAtt_g5d3^nZQGvwlTwhR>Ob+TN}$*pN?KXSrb*v2>`Qy} zAXbMI5n~MC2mzz~OrxvYzu4~5WNCk)g2}1KNTt!FaOm@Qnmxau8{UVm90Hc^7mgF6 zwDk#T3>nF5Wk=CB{B@I35X58WjE96bd8gm1Dw`ZoH}1EN97m>o_CZe;UK;Pk8nwZ% zP5L3TAEiPqrMEZasT4{1#!0gh=@;O;MrRdEz%t)V)-}1Ip7zt?LmMKEfHTbF!jqhm zMtGLkZdT}3Cx-7g3xwEpdzf~>1RnRYnd*Vzi$%|gGf|fw&$?_uB5{!52}$T;$V7|T zrON6YIcK$I-N2PPQApOiM+OF@B&~p=r%O;8(XFzh6I_A~4mkTDb1ouK#gKQ3{ER3J--nuB* zG643VU^RlV*W6wT_j>r47O6H@xU2Y2#3!HTP-wQ+{fjcg-Roq0RPzKU=3B< zA5rcn*<`2@hmzj&Xbe2_XXM-N54_aOPAQ(_Zt(#La=!hO;2EQZ2p={HGY#S4^<3|i zRr7xhzQ*&No&^9;wPC7AR20&X9P?SCf*^8g8DHmcbSQq+h->Gm4ie_y76=6&SW({8 zwAuZw_AJhaKU1!RU13HkgVPW@c!?GOmNw?S(qEZ~oQ0vikk0wjFZfE;xJ(MB``Ur& zN8NpP{9S-lD%zsIk=ZOeo}1Op=OC2oZJj6<7M@G?ao>?H=$NYoPX)lVp3oH9KfOl~ zx=_(od07puBZJ7n7~6{lID3JV#X`Nc34Py=%)p0?%l|e!iag2yF0MzZ=}NSo2#H96 zKr6c2Eppq-b51d7mX{IU$T1Q3gka(@MSmyALle$W+8EvXo2$TJ0Vs{nxl__VVvxK6 zl%Hd(Tr{1;^qhD_I_y$|55gk-hU<+x;c3FNvh^%;?M$wstaXd{vTMdsRaea)8;;Tc z`EoQ4Qak`){xbZ{Hrz{VU1(b*rE4`6jj?gJFnTC|pHryJe5}U|>SBbyV{me_*$du= zWyJbh4Bmq%HKvpk#*QX^V~as7(pzrM4ZNLYxpgj)Z{rZ(6*xiiKljc3FagY!2bt^a z2~wf2-u!TY;-ICz;X%04&g+tZV!<)s&-eAH0*+@`77W~wa`zogkdV@aC- ztN_KBb$Jq>2$ll=-h@h1VF}w-8lK6qpYC}R5VzK5|9#Q69Egl~@owuujBk_`W@_OX zR!kX?p#u2FH@bX};?^%^@S_K$I#INzFI}wEzd2E!vFmIKK&-%ADu3*O73_V%cOoV` z2YANT>LrkAacRgvZ_V*IX5n-+yA&H}JjHaOsW>69KtyGH3> zB#ww~Gv|+%Hi_OLt8SC86i)?SK@4&rq5r(|J^0vfDc`d*euUvh2qI_^+2&)(JC8aw zGKsTk|9evpJSp7jztSjlogi`xZV%sbNuRF!2R!Eyg#c2@oz!!*fDNFCGNg1&YFxVE zVS_d^e+FU)htHY~$RpoefDqpcFe&V9ZUT;DIQo`Mr~bgi7p}Vo#m_ZyrxnJs7p$4_ zocF|=3w5Jam4&{}7POm3DMiTCn?thtczGjuIy`iL>r=`x-aPB#bWv>h=XyHx>WLX| zLR{+_LBOv9hvj`Ir?ADKsgl460VC3#sVRqswq{|@Sgvz6BFoDzaND(DoYHS}_G+Y>4K5$rBwO7?;MK6CD z#=WDuuIKB*e$57M2a|$(MV7+g$&D>qZ4uj@V#c(J34%zF(RNgJj7Uw=Pw|$^NyV8O zjD!g1iIO8W0y{49V5u)LYin*{|Ja_JoS2k>dpO?P-7_Qx`*?opDzv^25hTGMoz@y> zhK$lzKwUqRejw}nl_FRVa~~eJEwN~tM76QDxkZ>8-fjpE0UNK%&CJNuhBC24l6|cF zhd5$AeWtCnJG+VT_ffC_rfZE?HPU?aD@}Zt$x#73uWa4q#?NID>|Uuf=%{NKc(LXA zfBAoc^8Z7X(hSpRpkef<)w6vi?3mcYr3`JW*_bvBmNEa_)0AbvkZtAG&)2(KdsdyO zX%(1YQ3~w;>3@vnURD=b0dP?C>H-?LmT+UW@HWiaCO(WkI;GxIkJ?Tukv{*Ij|uZq zQN?y1!hW6IA&-W;KwS>-1ADEhyk)`jOklZW2Y#(Z%`S1j9iZ1z1>p1Jlcz0b(h&&}DMgKwhMcSnxTy=uXE@KV zSvV0_Q9Cgm)5mY(YQo4NpwXj)Ts~xS9D96A)pSZ|f4Z}RIT=OvGizmGc4Z0<`pl4M zr0nT}S`@@K+zh?V00b>98?6A9mI04GB9Crmo!LzM&nPG=B||4Q)ol^m7(6YgR53XS zm0KKyhFzPf@u&^(nCHlhu!E(k>dSwZbYDukI}Z-_0OZNotm6?&0G;Zq_XW(on)q{| zSd@#(D3~wS7(O#B`pag$rM@l>j8i?!AJW*OGOqlk9vrycu$jUt!T&?;7U!#q6RT3$ zq2T6F$q5()8MPMH|CP#}`dvy;!PX)xsR_5L>KGfZFr=M1f-l2tA?B{{exO9Yz+Wl7Z=e84 z+k(Z6(+TB}Zy|}PRc`EK&>PvR!3I-`X29jcxqIAgukxQL2w;>xW?tq1#yYd) zLDKBE3cH@8d9|Sbv89tq;`T=3h|w3WcO>H_xSn_JznRj!?o?{os*Zv}^ST11mW9>n zKcn}J-2?ZR>6vZTeJ={~>rJ39B*?$x+&HwGI|D928No2&Y!CdFvah-joguBeVM+sw zBAi~$vZb^mC-l-;NZy;Fieia2@JR0UD3aGxQU<^!0wyk}Xx^U2#g?m(CH^jR-eQI0$43J- zc*UAf9@nEg4)o0x{Xs*#%NLLcKG*xFYOjwsR%Fj*O|SKyzYfAM0%-h2;Nq5g@9Vi#HfpQE{mB25F5N6iyZgJd$CY9n_gOWUb#1-jh9c ztBRtVo}Y3PBW65pH~91ltF$f^k1EgvcNv>`iCxAit_!Z_A@J|8VhKuMp^--!KfJp9 z7}1|HVX4~-+NqxlOV6QhBzmd=d1Ome6a<8)_CCn=!AjHT#SumYgBZQ|1r!kGP-XttOP6mRMf8o9vf1?ClfbnPX zED%&U25|_D#SQ5gQ28-7%KoE84aejE`gbc`+X|Y5Q3xt24UQPg_&E|^Y|kegt)Zx$ z(qMuF@$m-GB`)G~QeppS#}v7Nh|k+Md0S^Y+$?i#o1!rE#inzD?xI+ISgK9p1~bBd z7*jA&j66TdhI~*~c-#3wG-c9mt&>Y$#xUE(>N};<17H)RP!iSv+Abg-U#%tfiS)z3 z8U=igr@GDp1*-=}sw@nC!f90grxFzlB%{_U@D}|Vg{Y_bn#Mb0ddsM9jd>L6=-!V1 zh#Z2zw08x~OAbJphb-1gL>2)LAp3J*PFnYj+j(=&XC#a`UA z8Pj&m?$380@Dw=-jzVO{N!+g0{8bLYX+KZpQul?+Yv>;_F!}F9 z1ve(JUrBk3ye{3*%`<>gxc`(+YSG{t%Da)<8}!}~84@QQ_+ z%yCKJ4;H=yjuOWYlRH|Av{&(at)|tKU#rs>0zH09BTxmVJM>4e7@*E^g7}}0U&Yc0 zz+!Kc?ix{*%PE$7GztqFL2}M4~qht?^MO*zS#agB^3j&_Bt6g^#JWb(9Nj(%Fhq(@b7_A!+gZ9F8~yJ5Zg z82xQN0NGDZK+BV@nvc=e@Zo9o=1v`ScbYK9F;DMXd^@-2kTzNsyvpBCa%eso2zINq zIp0E*eqnDwe3wn!gLcu4N%gC3i+&d#wEx&c#5ZrrK-xLux@J%4`PZ&)2s;mzK(d&0 zhkT*vjy)o!?WR?%f^_;P;3iNhB*Ft0f4ehVjdM)FLkMD z^ZgV01$`z#e4jUz47>@S>J*<^I(BXRUW;0viPRyRj;ww@;#HuPVD;%Q$*US=WuZ7p zqYw>RB8oD_MPW;emyBAtU_1A(n{miMcwexZg)ZTPDZam}FI;(leQl68qu|?c!nssy z?shKSVR-M*zoF-lqiNIHIaMB_iIV;Yw=Wh@HgF_Z7&@my046C@KN|fuR-GzY4D}L8 zF>0#NL_=3s8+@G>gU|9`Uk9VWsA%5Q_ux)i(tJD!lA^w_+Q_-h!IB%L@o*SSsfVv% zNwmxRQ2pC46dW-0eDyKM)C{sxZbZR?f>a?n+cW0gEqSMKw{0zR4fO1a&+-W6Yo^*r zuk@0fq%Y@K%q_cI^6IMb<8xNSb_HnJfk7om(JK3fKJ`vqPm0Sy|FxPe=+t~0JX$DY zq_lQ+W8$VN)h#_yaVeFk2F#ghidH9jBLTR;^99epuB=_qR zG6QX#^1QmO$a6D|3s>Lfc`K*tFSSe5qLlJOB^2ruA?%rI5nY$UrOL9r0o@#5V}qA3 zkso&}W^0s094U@bGk`$ha|1zv=+Jng-D4Qjb61!3%r>>x{YTKt_kEF()(bW_)rfnJ z=YL=R%%rD{C|nj~_56J*Ts;)J^vaV`-7G!|TyQ#mAZF7+_nMnxro#UO!t`(3FeJW) z0?Au{la^i62F@Baty$Cs)2!KGA275vx~mupTx~Xe!@tO7kp%>k5KU{< zf9wl|AVu2qSq#Fo(YC{a;rjG(#yy8G!>prXUw9zBI+;e(q6qYgSQ;jAYl~~YM6RY% zkv}IaCzq@cB93p~4r9B7~3GP2tby6O;O5vUzSbEXG$k<<3JoKKEcfQfx0(U)NMLhbdDm%d=lSpLo-!So-(m=%{j2Tp~+s zRg8PJY`zjlUb?n6UreJmp8g5Sc6(=(3%oE-omlyb&#lS={HAV{yNQo1B7N@6v z?y+wi%7{vcGOWl=wGJ8q>D;mz)d1}Wl9-6yv(`htOXcwKil^UlG)FudE*ciiRO_Hm zAd+`xskR&67@}X&W{!sgn`bI$e7WRJW~)bNW|BiO;ayQ3CdjaLH6%_A80?O=02>n7 zY<`n}cnQ$SGsQa~VgmZ{p~2}!iX{@;S$0xLxrzfN1chnH30NeXs{E8fs#TFAVFku_ z#>|oU5&F1Yf(#c5T}Mwtj3lrPyBR>u6$*5BK+hg<1QeEslWc{1!!%Sb+Zrn50MZLNX(q5P2rjjdhbBH`AS>K^8}Dt z^3bugBLYXr`b^u|&BS%q?Tx1uGA0`-GZm_>HWfKnltQL$w{DOVOr}Q|3Jj49B{8EG z>I^`c)ohv!+a2kL?H-CObKb%EC#JwGF+`f<{U|ypI9T}Kj!d4(LywVH#7S|kCN#wWO)Zp-$gF>Cyn zFoCqtU@5j`#lh2 zR;#HBQ>4&fUe0(hPW}zFOii1m5tcieI}zYZpBTyZ7BzeXXPh4{qh)WluA8@F&f!OG>5Ob@yp}MM??w)wT z>Soj0?OAynQ!fgOgIB*A!iN2CS5jpVsb2-4U715j+PqLLxd zbaCq!$AmKmRbg4&+n+fTdtQ54v4>vdccezFg^phP6fJO+knL=SbJ_SG7q3HgOV>@1 zdkQsIHG#BT(toY+7JTvxk25WL7#N!H8h7iW3tkpu+*L70IhzRYH%=f|r=Zi83+ zEGu(fGyp|Fy1!HsneXe;1rC+ij~J@1ZaS=7tpC`c7>!)uMS~?9eHBpPj7$z3CKl0Q z8yk_w@zWrvIS&3I3Tr?sk$U8lYdWEZ*Bz6)6@+DWG6Y1|SnaS64~_It43=(8)lnhO zYaaAZkL@zAUnq+oc)t?&JbTW$p{EcU!wWzzs0D~p5f?r<)9+ltSsKWF31O>_5y?Bh zV)k6oC;9>2HSM>({sILkH>7XHy*`h3mGsld)`pzC!)Jeul7^0MFNf@0y1PuL|dS{uY`)KGabi3hR&^G^Lw*gTsx>Qt(YUJAX>F_-TpR}i|GT1_;o zWrvgNEGy}ZMqg}Z7R=T@E}&6v)A!eQiy7bY|9C>F2VVYOK5gvh!5q@~JX2^t(_|jS zkm*_!_2OKjrz|-6(i8sD9*5J-9+00FkJs0sl?O;G2!}fk^2^s*{#%5q9Q0F0FD}jU zP#i4fKQ?X%Es~L$w#4+^+`RbkT0wSf<<^q7dd~9=NexM~4_H+}9man~sf=Y7&o}KM zKM*mz1DjH;CX&uNBT-s2E8f^=?#fKX@Fvsbkg?30zqlvep1ZM@GYnp9qW>RJ*n$Cj9*U+isdtrew?=i$6b)o>|deYuGIKbYD3U=j?r+wX79JvJLnaR ztiiP@gr(pnYs!-kt9(w%98~I)URdO#qCVr0wm-ibB?*~$Qx2k2}`kS z>D{havP(89ai_bbv*XEYb5m~cGXc!H)dW5er9hbBaA3=g_p&LGCeVII%U@AN;jTsO zc9I$}ar?!|3Mt#{ZPmcx4<7he%v7hnESK}Yt&6N*)09eLzZSdVUb4oT>mpCEHkygg z>aVE5V5hM9}uflU#f#+_V;T-S)M``p1iBCI#iouQBaGSjr!vmAdxJ zSCNZ;=b1w#RJ9$d=wf6CTQvSXDO{F9WokmMNF;UXv3yaq#cYKFGA)+CYg4I^9>7fH z#PxCQA!z2zili~AO~SmYJ=oFqw%iPX`H#YP-EIw zp{4GomIlmepbKtsIshs?vGZzR^d0bi<>h%!DBUffLNvPYC^_%Gx2aaGm3zOU!%vcn^0R$+65pALow5ERbOvvF8@%$vCj`O} zgg*X$^Igs3jusk)9)uxI1YLDx7idLej=p;yNl*<)`yv3_v^xu{A34F zPJMHJh3nSDk0wt&;R$)ZUYSY8h#yjDC5=^e>kTUG)+7HtMYnspiK^~gKmh1$__m5j zL$Y{-qVP>|sq;B#WnK3A6dR15!&2I!5r@TbHZ+?eE97HW@ZUcbt@j=$e-`;}p%Xyy ztYqX=F$6oMV7tToX;5u_#&<{eZS&MjTsmbYX6xzPFaX~A@H7W+C|Dyn;$(z9g&d`* zEAAeYj_Xt4)dzEKiKu&`zv106QEq*OhF`{C=!gFC1vp(qx%JQ`l!!m0D}Sf0eUp+~ z@v|Ed>;K^0X#>uuIiA3S2;cn~b-Qv7AEqq|amUqCCh!DA_j#Q53Sy@-csc7m5 zSF`f_UGgaFlOz+-2!iyDc}a4TS5H2~D4Y5$Exj08GAa%DiWO+9t@xY`PhR@=&Ip|C z{Kk!HOQk>)^EQ+^bunaL12-;TIUj*m|F-*0N*0-u&A)4}dCq}WpA=q;iGLGj3dkTx z<9kvIw+YngXv6af(9MnweB;dg6krga#hG)yjC0bhf(1Ml1BLdF5FyhElh4*_WC+V9 zu-6-!Pq#!6z6z?QPh%3RKGm-KAvA2Ls^HhS;7uQq5UnX!8yo^wiEjnO>=w`Bh^T@? zUE`re6g7&?a78@I8Xran!P4;aFw4$BW05+tKjJ8bB&}A}KH$aIITDv<4bj$qRzLI; zF5j(O2#44zAwn5xPXT?5kuhB$Z!Ge*30TZ-sm<; zY80U9S6n4(;$$HYJrZ1 zLr>Lb)gACHU09)i;prHM0ujBfB-$Ld&LXrgsV z!R$fhlh!#z8L1C}-zC(44VY1oi(Di4ZoxXSu-%=Ab zA%l!T`sGFm-m!_$x~Pt3E);05aC(jp8d`5+uiK8=ZGNASM?nkGYC<`}k%U<`>RgfD zvJv|vi#u^pzc~dpYi}N2G&Pn8Lu-(qM2W=`V@y6w7#itx#1DkeI3?Q&Hbc za6K}xjDcZjis!lt?oNqor`0aWD{&tCM|%3Yc)+0b*{5`;9(k>!asUuVR0QOF{mD_v z_2thBg9Letjz@^WOHRu`e$B?i&xXvscW7D``lA}SL6MzE<%n~L<~$J0Cb-pf$YWDM zvB;3`ZuQ-#2d1DA-5t>PwYXhiC5Wlc4|Ey)7;lq+7U`=9}6C8GbqPYlvB>`6O3qa1>ssh77_qLlF2m1%ye@^@?=3(137d*w9%Q`&ustY zcU6Cw{zT$iD0_jEulPK}EtsH#$LMYqv~%ltO0f{do^@a7u|T1XqJQ5Vjp)3w6dSn; z=Ikf$UXu+52}BkOs~FfdFwsYnD)3@k-`5_zC)gk!Ze8T>gON2O_Hp}RH%m;+_m>)A z@lpe`;K9<3o&T&&x~IlH(TZtj7daW?<=egyKuM72hxo`QR}2zd9U!|DOsfYKd z0^Pj}q7%cS6#nI>X1eDIhmApBEC_Ti^q;_-sifC|ni2u;N%GzLkv&rOeunU4n%+M~ zbJly2F#;H$vfD6UvnoWH^+>CzvM!2jI>Flcbj5bu-o*F^0Z!Pmai*l>b#)$=hpVIjeTK|c+DpQ#A&=@Skd9Yaa^h^SYiSP-Lp-jBdf9QJ)tgh> zYwX_1e<{690aYzQ!d{>hc5x6YX+9Y}77-e#NoH9?1ydM~I)oT3`5X0{t=J!6gr#SN zv~<%U*c~pZ=ehUXmRiqy58(ZR`3+ueW@oQD$XJA++tZ)Xz@|vkeZZc9m>OK8-k^aA z21YeNa+mrTMpUV<6zog|&)F{N&FIDhv^a>}!tQk4Mh*+t5wa;XwHcU_2=Tl$y+pNL zQBHY{tN+4m(WZrJ2ht`hLaG7{t`ky8(_-f`!)eyO@*|jWw5Ze&I7bHE2C}%5u`SIW zSd1Tw(WP#F&RIN#4%Vd(#a(9;Z66nPF+FkiOGeh2Pr>Q-Mu%ulJz&3aZG=*Db>tvF zalqg+0WRXKzSzrGqBl0hQF}S6A~tbYB~2I@jyy5TrzgX&oHRT2*NrMSdJ}Nx&+{xz z#!GBbd)>V)QLWc;FIoo;9-OI{a&E@M=5sSfDw zkufUImn?MI8@jSydV)AxYUQUy1O03B=y4r3Q|zp(gl|d2E9I~|yE}>0(tRHu{esRz zds#2jw$wtMG^7U7Lj|QT7UcNDbHqBJAZ1Zp7m6{bV86-}LJT+yiU^!!_gnPLM(4FC zZCwNiJ(rrVN<}jnjr33tRL+N;l2Z!#nlAD^ zLbW_#1owqht1(f5J?Y`jPuVQ|Vz%?*kqIpP8rZy?_YEFZ2-%6e&eq(dy`Iuqt!FMd z?sL%NL>lOvrB#iZu9lsbWK-ub7X)FB+`@D_CoxP=#vo7-Q&?>wSDV-BlDWi99Xcfa zlX-SNxFd&(PMnooVcehs4J8&w&EPT*~j5&1?-1^ z3p}qpjmz0nl$$?vyWIRnl)7HjmRNg(F);6}c&UDAYNQsw;~8=?FNUf%3+$4K(h|}R zWqrzmoL1kd-{GUG5x_KJ;{`S)0uIyDcWHJ8XGRppnv$mFfQe|-HQ%my~ikNh3n#ciAO^Sp`8Ndm4@E5f!E2$r|a9T{m=&_P2 zHqfl4-4mxuia0^PT*O?G!Qom@%h+k<(6T*JW*KHah7~7tz%bu32lbe94klvKUhkM% zh~xf=OA-C;x_PfHUm*s<&I{3@mFztfXG|z|K2apPFr%FUl_5pu;RQm+rceubN+exj z#=?js+%&Mnskl1*X?Nc`E#UgjtArl9Q0ua+8~%Z0q&FV#_T=f{(Bc@?u<9^XBn}e> zr7eD3OzT4Ysh|W~Lvq^JkT1X*WcwUPUrEfQ&Lu?^&w#f=*FQ^7Udx5hJ_ac+DJd`hL~-w4*( z9%hHV%9feQ5mBbqvwHbU$O#B(QkAcC8H>xm-$FpzWlBI^9bA&|7C{VfSxY53mr%<- zXtQS5!-vlt3*XqahppqcG@p#8S67lhI(>mGsMYJfy^|h6 zKXMp^t_nd+c1@(GqRQEPyGix*9>Nh5*9vp{FjJGe#KdhE3BUwre~MaknT7M4*#aV` zFIoZJss53+;29Y9m|JMlQv~EU4bdCoOI|T``zLS?lyo$5`RG)BW>%6svkWmgFBS=| zQJlu7;dIz^r^}TZudw_jr{8tR)vvEF($ELO$K=}hOm&`jgvlOXO*4)jWj?i)=Q*^* z-6I0dS8P+MO)!p+c&|nk7KoSvl$ogj`~!+JKvV%&9#IvA1y%a7CRkRHCiDFTM>d=? zB%YVC@?0!T*f_DOe_jok^W0pw4d&BbTZ0J;Nn^v(57t(@qYSKe0MxW#tagr)BS-A% z1|1&pj5@FE9I?@Pv&^a>-OcA!`3n0HD$)5JZaY>TX%mb9wA}nDChL+SD-~+^;ibB(YqpM> zs@0D6!Mi=nzXa``ab0rGTXepC-$3uidBPjDb+2t4b#UB>))wbcbEVYd_YU76B=72?KVRm>FqcJ7N_pBc zXQ)^t>MlH~sDlIIGT{YBlFVH{t{?h+ z=&@1nl-K#*QVX9_YiTX1{62wmO{SraTy$z#R{5;y8%jeXymlP&^_6esaV-x#rMEI5 z?cn*ZMqaD8&y>9~D8KY+v7R#VYJxM zd$AT7a{H`{R-BVG+q~;4r(JW-Zl}46Z41`TSem8J;a8Exf9liP)5A&+UN*3)xK$tV zYI;$Xc4d!Vqxg)RYugUlYzyj;J+xkM^-$lAUGoR)6=sT>EKHNSvo!GhQT+wW21yy8 zQQQ)@dRv0{{vrdr4b?i|_D`HxlI$n3B;@R}gjVhw@BKpVC@qsUk@;{+vo$VOKRGn%mcgD(>iCS;vZ5j1oZNN0Uux^E-)Ah;gWo z@aI)Au%8eea5?ps-?PMM`BUldgye)jrR1-)DjTd_W%5{b?WAh{cZn0PPKX_Na15{B z+QfOD0)kr)&QFZ z=-QaFSjA83hn7bTJCiMHZlBLnnlQ`5?|W>W$hpC8rxLtF#4B}9+pAm;t!Tf+vAUv2 z`&RRp)S=c}Ucb7~F4WOp{-t)5?XWVN4@0Id6e(5cR;Ri~n%~afT{>XPs7}|`9ZQm_ zviI-Guaq6VWwM_EBhwCUkXI3QT&(@Ec!6$#BB_A2vg^qA>q+qIUjzch7R!w~Pguh!k+QIn|tw)2LA;(^r@)hkx% zjTWpKBf0+JRLS;-$0dX|#o60dpWD92_|0vd{mH43!3s;R1hyycZ)ov2vHz><%=7XJ zYdbf6tiST~wWsS9rN-?~o}S72UZ|n$vc1#7%jAX06Y=md=VmW9I4e11ch%C0r2zs< z_l-?kt^7#g%KbAQ_2s(~b{+~(@rk$T@tIW@RD3+na7xqs`K?zERWH5MG`c=(oJ3Rk z9(li<59d|BObnjoSW~)}JIc>^r)=^f)jf-s=?@b-C6#`CO^;lW&02RZo0Jp$7w?qZ z?DF3gBGvOXAwXevzLEGt-RW0egsR3IeKB0`rR!bu_Cn6PSI?=`wRbc$T>PZpb#k_u zwtQfr!0@<%Q>7vb7K+X*GYmPr#COFuWli<4hJ(E;71!1U4zx_ZckXyirC{#c*--`d zVfQA^cq(MunRL_X^fS5dy=Mx(4Q&aKT`^3w&D!QLcU#7Y(!C}59l^eim&Q3wwOsst zVTRPnz^jX2jNv%O=V9y_;P+so2s}eLCgMJ zW7Y+Jz1%mJTaI2!FHqAxGfwE>q0PRnyH$Gb%5xOo5&M2=kExQ(ZYLz;tWs|dQQFqNnv2J3v$4^$=#nm(TYK74 zP9F9==*eBwb5W@vS=s*ir8(9XEjrh&4DS@1ez?2jzWLGT4d2?|dWuBMmgF|rFl_7U zg8TJB8>Y1Hl#3r_akFa6{tLO44d+uIPMViK!|dArb+#6VzAbR}p6>7H`RLejoz#;; zUpKuv{4OKsuEw1^9#;)3=S}6UAGTQFYxIXyD!FL*!~_MGTXTfP?~U28C&%luw7Y9; zi?;5@9tH37@6$Xq4JNc3ZE|JB>UVx-mv;fQ{qm8g4`8X zOFqb+S}DA~pvCm;x80&A6dr_+P=7E{-)7!~+ZGY;&%KLGve~up`b~pJiX5xs^>sTl z&lH=h=vW=SrMcj1rRX=M)|#1vq=;Wy(hA=^vR6)qowj?o17=)x``*1>iDk<6e#BMD0{Ng<cMc1RtKlhPWdC0Ltl>G9cXUj#F zoicS_J#+LD(^eI)sn_|ctCXtVZ(q=qy!TnmPS5z*JgqNZe2+N>M2~hken$R9Wo=N& zEQv1haeL+ItohatM6B{(L>muox-jxW($@6-*=Lka4tviZ_o-^P>A>NtZNfV;bOy%T z=>^x<7%N zdgxkz^X-X;W?$c2opbivz;V0=sRCjKD{nhblRTiPoKfmyuB9rc@7fWe_wnU4zk#>U ztv)lcB=Gd1gPV`Z9|=l1vw;6f^t#z1;o{#qTIK2=DeqXd^wpqun+LUToFyt#?O-u2 z$Xz30w)l)iyjIF@vx;1mbQiyoHp;Yn6KZO$w_{xL^rhAo&2PQN*zO#*=EAixvqSc! z1+V-Sc$*3G$+~B!1_%>}Y zZwIeu$T@3=eH^Q-w!3-iwQGOYl3U!psNy8$@L*3EPlEfDw;6eE8*blyw!t(pG{`Y( z`KN0(G_C0T&AVWA&GZhH?Jr!)W=TZv6qTX3N~xN!->kUyA#aSf=$`zSZthLqACpc* zHHW;=hz$*h{B(Shu6khBkz21*L$cb8=Bhu|HPSiVF3bCzzoBC^_m}}bi;nkpiaXw= z9?9ulw=?kFT57m;VP~zXViCQ@?gqcl#m6xjmbTVfexm9V%m(Rxx^Voxf58;-1Cq)2 z;!fOn_346Q={?meyk!e~cwT(?JjlPJSM>Z>$v5!}C-V;fF#b)jfz{#Zm7RyQmhUrc z_YBzSt*TXN{zbR`>yn1&!Pffw;+#GAn;nszTRPSuG+ozB!`bHHn)OvT9`7xt*0pwb zp01kkNOZ%wErAZIc>+p2OR4$Z^vsRLlj3E9XG->rViAUs!~;^mMvH}85FR*!pab4z{HTi!1l47l}7x7v(e=CuFO z2v^6U5sgAElA9hF2s(Oqt1{!fKmU?9M~Uo$e9`vI5V4E4mO? zzhlDT)wfzxHd=3s`j$4fbdPewV`cBe%-j606%LE@^n9N9Ji=$i^s%ExjtbCPBs{a# zPekaU@igTjGWSiJR@`mXaI+p_)VM3UP`UiHr>e}w-Xp0k_X1B0Oer1{dx_iSb!*4m zoC&-%S_R5B_dC#w4lJaL|`!E2u>Y1ug>?-bnr8tZ+v^_mrr%)4)tWxnWKlO4gg? zt}M%|Ea1EFt#HcXoJ)DL4##gRyDKdCsb$6*mFVaPZ9{nHO&c$~R`ap_(&z4(jVGoj zeu=);Gq_baP~y=pgY>3^tg8cRRaKV;-^tV2Z8PoZ*5I$MZZS2%ayd%*8#z9nAG%>t zq|)ba$?7*w)LonYtn29NcPjTEzAAh7*0a4N_@mxfvAq4$vXX`4Pge_V5Hpv1=eD5B zKgd{Vih8HkRrhzAl{S{)<}u%Q*^XOydBKxeQc{DXCRCP$E{|||peFlCcX-ko-Oahx z-z2lQJ^rw&!_-XuPEh#S@48=yaNn7a7NOmfWbQ{FF!Z^Ysc&%p z`Pqm=H&RkhtZU_vEsr?t6(lI_F=hPZ)j|Trb(e3}bl;2?<%m0U?v2CR&r(xfWqn__ zw~cGQ($ty31-2YXax0$iF%~nEN*diR@<4Qz>A_VC(vQ-kMIH87?hSTrY3&-8?%+Cj z=851^7rwO5k>UK_P7YV^XJoEFH-BKPchu_^qx44tn}tNb*!8Sau32&*>=HM>(w^wx zOrDIW;t4`>FP)7RRo4bufJtlt$8l^iZXJ=ZO@S~L( zL!M0?afp{cOI%8FopPD}>P6bNhl>XImsT!QmR_qa6rm}?`PuW{eA(FRw>N${bm(r_ z)h)00Y;(RXbMlVA?}Y5^TdAGHmQIN0(z_?%dF0~!GxwCIxEhYJdMc%svrXW1%4pN= zE$TVdJ$Gi06VcqHof+)AxT9EivHpUKwRF`c!sv9u_)^{scz;c%{RVITNR zXS6OUD&g3~>${^X*g@`vP4s4$5Z>@9P0!w28*#)f+-efH>f=Obqtu941()fgc$+iA zoiAuyE{$Rh70kD^cxsKC zaMFIm!EmiTbF0Ui6sRxFUUt}UXhzYz(}yP?F4-YI?3Uek=g|7oK4n>Xl>v^Ss^5M%XwV@!yrbYTp^} z5Bo**(xkVZbBK9heV1q0iu(7BAJ=A-C|ZV};@bG;bhG-XY|kl{ZqQpb-&pIlvO?1qpV!;hxpXgHyl;=L_x-3++oZTRXHxuAZaumD zX-3+vBE4m=-HQ#I=0CTKcYd+8>AKBYN9P%~)0PWnPCvDM=l$m{F|$1W^-pzjkp&aI zzjzmod9Y_NH#O@+@0Oj;0}jOU@COHatyDf+_AUN$wY|we8}IEMIZ_!*$CVeaJ*N3e zI^pS+`cA(yodX6Gd=Ach*Uz7^d@N?(>n7hkN$O2Cx5WL8na}86y^r3LXYk8BTJ~~~^~mzY^Th?g)C;HAdG0OY3d^$_apJ=4-ACt*oj7)zaE}B> z`7ZaHlh&N_-8{gu?u)te-dK(}%hp+k1atI#j-}Z~ob1$ZE$~~{I&ocTsufhl)mZJ7sEWD*mrwgr=#qO}@!d+N z(p2@{89CV>Q^%_>>#o0U^?X9=!chWw?IBkW?r9yQT`~BQ>yj<`#tmikrMt4#c3Jt# zGq;c4Fv_IW)7@)liJtq!jjlekzi*RP8J9CXbmOoM`NifLNeYRhhi9yvZ#J3xUhC+G zvwKBe4c2;VYw|@Z?)#}(wcZm`CWM9US!!1@S|gqQEMFXuGDoZ8z^3xE2d$g}_uX!~ znqiPKIYj;ZN@cC$=-c;YGq)AZQ+S#%Z2$GZa3SA8Pe)|)zMr+Zsa5@2yYYe-aTVPM zwYXItHjSr^X3my2j}~tJkdf##bK(dS0hMCWUGL|l8*N>8yH2#h#aZ;an=60Nsa2I1 z^Ix31-4vI6c~jf%^mXyYtEKN&)$OS1J^kUe*zS*<9dg{e50xw5qbF7Ab9on+AplGeGYJHS~ zyWSvyiw9X)WbJ4;h!n@$qO` z%jmWl3fK8c=;Bq)Em9oM^c0K(RE)FR$30RK@QaRfiy3g-L(}Vay8Y^5GB2ol@#&Fi ztJm$iF{w&=kk*BglF65O`MK28YG?XKbgL&$oESK(OykJn-ch+BYxwRqCaf7HmE-{QbkzLb|T!%oA%zM}-ua$MAL637yZadX@gjZg{K;-?p)f zzaB`d9klMc+$F_u7l*X>Ts(qhE9PhMExx;zD<)vtp_F5sPIeXJ6PG`64L>y5vVO{- z$`0R6w(E}v=D*E2$oulx@z&;dlBSV+Ze}m}JTLQA&%oi+Yn7y9PrPnl^4|H~lgX-8 z%Wm(OD_E=kuH~xHw4Ob2`#)Qm-sXv3e0O<^x%lP>yq)=t`*b71xA}aF}bixerWDt1cWk<%{d`19Q?#R_(8nuWhm6d11+aW}x%3Gwv(SN%;C6oVO^F zSNfF4#rYEaIxl&978+WGM76!Xyf>)y#gfa9y{XaZHv^aLf7rWw6){7{*zX_wdG*%) z-P~@r(m{=?Vf$Q#3+>Fs{TGF)Rki1@cNxFuX56l!FGX$hTPydBC_AE%{_1w!-JNGb z{ZdOd-P4$JFLw6}_4nn%vG>iy-UtV4Qn@n?R&w%=iCoWlQg2-GvbApu`9hs$DJM-| z^SE-((r=32xE$Jw1`XMGAj>`PR?)sZF$syqmF2F7tV3qCU3|a3RO%IHQj2!GdFH+1 zo%_R_>~5V{%k^~EJFY#w`R)29dm3Np@g2TgF;n-_A}Re3>)yzGI52(K%z*f7raI%b zMm~OaOmnoVmy(P55!LYW;n%Lqhr86}%Xiejjy#uAmU(fT1;@d`&)X)g7n!7Oq39ZY ziN|Ybt;-azpvB9*LPZM~Q-aD;-?wND8ZhXSt-y7T(rvt!HVf`vcHcRt^n%aT{5FdR zuU72(*Zv!8Smx>e#_Z4`?pm>zHQ%>J)>l4p?2eA$wA&pLUFmD==BgDCsw4Sbc@}Lw zUi$dFIR^^@%*9uCOK;9g%|AD6gg}t(B)~_Qaue7d|Z%oiBRDL0eUE z*=KFjo~Kq*Y80OAD}Lqw($3fA@jx$rq4ObaA3rNh@QyurefgyzF}bh0H@XfzE%LQ} z<;W!#AT=V3`@w>UZx6T?`_x@I<3;*Enqq7pm z8-Cl87}C-5?)W+pBcA;aN8eoG`TdTvhGVGS>eh8bcy)S4?@e1lDX3*|>#KW&=Lnsj zkvv~)HRbeKfuD-pvo*=@WQp?zSB+)nmkv89*&o_|^!Sm6CV9T8bF;5s&Pz&pd$skY z*PAtEMFp+*M^V*FOiL!b>}-+!SaT$2AV)zpcbF?*t?914#vZA{3nUhpY%`F1(P(2o z{HB&;t&p#sLDc^C*ud}yMwtN_j}OiAPCmJ%plIaSjMPU5(i9&r`10w~vAg!2ao;EB zMQJC~)BJUVXQk!bo^s@UTF87=4I`~9vqjWAPKhfRtliONy9GY;g%+Ep_(xQ{UNN~Y zIx4^Z#`A7l-ZI`vZITrdAA@@~ZxT0B@YDdlyupc;4Q zc<%{m$+mSLBgda_yv{qwd@@hua*@J1*+~me2u)wVAh}|>yx|NP)qBe}L|Yd-%y5x= zyhv=d-W~5(+pXuT zxxd>Z9d_uT=CYxJ6U`^|>a`5k*HK1;if4V=@H487d01-;!6>@ZGm{lt!}rdk2Z!9aIMwaEgw7)M zf}9EO9Q+O|ypy@T>v~P`$DOeoCPnr(S?&7#-o=5t@Z-Uj!7Yuw%VT2Ks4q6&s_e3? z(QA#P?1roLTTb4#4=YLXpFeA`;E9ooZuqtD>=dpT5}I!kdUE}Msb0NlS7arM4=1T6 z-$}ld$75+VYIM(ZF>YDTODji7^-kFlJ8#3fxuYc?MJ|d9l}^aleWIOo*MA57ay8Ey z!*a98BXQ3w%NxV?4LMT4u_9oezeJ7y*Mu!=qo}i24XouW@(b3A-P^tWgRMvVlFE)l?uIGwC(DB{eeN&&3bD?^UdRo9xpSRntLL9=k{A4 z-i`*tX`d6zR|V&6 zh{<%SEnd2W!&ZAuUgh$K6PDeP{W$4qg89fy0o%5KuN&@)@=rcCb=JzWk6-Oy=aN(5 zCn{mT?D;+}xmDMV7ECBnbyT*QbI$1e%{h|lp(PP(Lq~Et4heg7HFkL`@9RKi#hkUx ze4iHZK70PiqEK4Zbp5oeQ!U+g1iVu#nzuFiY&>;#Ivpb=@0(_5QE26?bkS~)d+SUI zH|sa`pU-s%ZSVbZbl>9?Z|@JzLdpgSQI^kdE=&!${iZRuboYm$+8o`3EsmcZ^5x$9 zVcQm^8OiR>zP3P%mzMYtx<%>M-Ia;@u6tHIw=>(9ny@{3+?d>F6;DNYY`pd=8ol&6 zzwSZmRLKW(9vSBh9PsSM%b3REW5z0@!zT&Ow~sr!GiF5n`>i?ixB8d}nVZe$OPQlF zMOfH>nwryG{{`DMGxT3<3n}~Ru_;$2WUs}A{8K}}QakVP^+a&5&5AhU8WtKibDG3a ztMt6Q$+@#`KPo-)B*4U^ye>Ls;k5>#d98b#Z3H(iPp2H>b|pW^Lp8 z+Ki@=qZ+kFpDX{oXprB{F~ep|8YLn8MYv;#XMx)Fvl}GkvLgqY9^$YGxYzC;eKY#0 zvUo<(boH!Gu7W(dM@>)}&9YS9x-L2iT-O~3Z)%7s#>gj_e+lQSV zAN}^quF-;Lj*J(-GvZN0#C_hd!zl}M?2LQX&c52sExe=0OHx_;V3njArR*#*>&(ls z2^>xXWU}v?=Qyeqn>gN|{EF+v`_=Y0yX&2#405Y)t+&^-3n&Sl6?b-=-~!(+=Mx!i zxohqg%Btv$efqVbH=~+s_3D=1o}0B@!>96GpEllnN~Z5O%?_7+qt^Lk4zc#w%=2Mg zqn>p_98dgJyHN`+X=M0odT_2TdU{o8R${Kl)3FA{Hxp~7-ne=5&6!7|mfs(%>#X|G zdokZ8owhQgUVn)NZx>0q8a_C?F?!TO>*3>0tyBK?GUN8?0L_Y>8yt&Y@mO%&`j}L+ zByDY0*sv;Bf7zLlbt&iWOxT>Sd40Oz?K|u4XGg88X@A%)`=(oF--Hgn&WVAWCJsI- zxG611!>|o)n<@hr1el#Pj_{WVw%rx#Rex*B>48Uwy%TFao$yhj zBh~XprG$rQD5D%ZTC~>I# zlEprOLp;sCSm#tcmT5M;zxm1Bf^A1r7+(=5yL zr{p#{8y57us$K0fXHJhf9k#FHP^gq|M(D|cv^z7*zGum6+P*R#qd#ER?vE4Xg=+^p zIdhM4pHpc*Z`PQ0fm{;7nF2* z#T#GP6nHsEtN7*HHFx9ZH|-s^uA|1rVO;)|Y1Lak>uky9@V$R}_QsQk?P4tDpK5aE zW$e$Jw`b}ly}^x79^8MR&;PBZ>0Ohp*yzCndIu=h9N#=;z&x|X^XJTrxccCv#4E#h zI$eW!WP;T%Z#IhG7{hyJzi_(5 zh{w8|H{3ma(_V3;2HGDG4g~vE1v3^4O$3bbsc4tyjDxNck zPaJ=`iGNi~eEbPn4Y_l74-|*041K4?uSQGfyltMnc~|Ok)!5XClLs~wEIy)URb??Edce)R%OjR( z8Kf;SnWh&gXc%;M%B6_cadYR#Uhz2aYW?BxnO9ym`Ja=BT##&$RV=bLr(E*X2;Kd! z?XFfTH^p{t4Kkp z<~aU2_eL+_95U+W5w6d5qxPw+(vx@Zh%r5NMt5JTU4@6aWlKXYzfE1eZb;ht_-@6* zyA4TV6P@1a8J7rTrTSKVs{MMV)!R#_v|~&fkJghqDPFHnw`OR1jMn7}vKrdvZ}p$U_H#=N=Qmd1TmcdJ`QrFeeBgFzQY ztNBHF?!Nx=O3c#s9SiCoX!n@U={_`jow=up$hStZ#d}7k-;$oY+fDJ|p<|an?dwc5 ze1Bm`$N>9xM;;6Laq`8-SNK;saW04#7P(%zP-xRV`j&dp3VlZ-sF8 zF&EcO-`9xSYn`ndCwOtwW{w>;3%nwi7y0_w-con5H`vXayK&$2Qp#zcnfuJ{wfhf` zzn4aU58sHd+8!rWI2BF}m_MTUl5U8j*cqdn6Eaq>v~?_4zDK}D z$3R?7g7>?{-8Wa_#>97TSM@nsd%3yUCRV+;CS<9+;00UPj0)x3`fExGhH{kD7_2aP zZZS$~vA7Yw(PrYivoVkDjW;=@%^NPY ztyMa$c(p=f!`R_tIZnSYDw}!kdCSd;Pr|odyKRTuF&;UhK7NvM%VfSKAFtl-R8r9I zQCgl_x_XA~OffCFhgS+Zt{$1D_~^jQ5yfj_gU*?S9@uBT`$$5)TUxx&@bHF5Nv7Aj zPcI&1qR4Na71JyOBI}7Q=jy2O(53oL_qUt@{RYqx6*VnC@8jtv$mMgnyp8VLp z&fGLFZ`)t1{fvO_b z&D6}RkJfD-sk(Bwle1B3u3%I8Qc7C#o6yZpF^`<(ZyU#NGv8rtEqYFU$gL}f!=nb9 z=x&e;&kufjerK3=0$;Nz-?Q4_XXO<&l8eir7-GQ-{;}pI=;FxXj zzD9fJ!>6_f7Js?B<(|c-gVt|++Luo2RinNvUn+gzWTB9eO^?-vZL_{F;tiXXyrtJ| z*(!LFnAbS> zl9itObGu_-1UZ*wxAOkwe8=PH|pOgx^J1S_pxHs(x)y@Mol~9J#TDa`^2qT3W@S@=Zi#@B=XkG zme&zGY%G1ka@oagtLC_94LD*LcVshfxE+7&zGco&51VxCO!=N2!d>{5*FRnMK1P~WKExFI!@bd$>Sbl#DA^p*$`C? zJ>4;mFP<8mZ`g08^>O1KkDfEe$5N656vt$|pYvvC!>ND$cj;8y?C;-B=kv5Fyt9hm z_|Z$aqtc*ds`Q7Ek%OdGT)nbR_S$5H9&maO&V%T1akHMPFWaNgQuK2pAGum5GI7Za~W&&f}2 zF&LrsaEYD!o7X-&{02sZ6xTIcEwCEcv1`1mY-pGDw!koM-LF}K`>(`Zs>;o~Gkae4 z?O~;A!?i*u)z;~cG@tZ!!HcdDi(Qpg_>`-U9$zSMTAenZAf{xW^e?5kJXajulxTC# zbrmt)G8L5@dttAaNqe?Aj6p3b^=>vpkXY3Zj2JlCrm$LcwSPxu)7 z&aiA@&8lN=*A{W}mHCX1Ft^eint07D`|S{e(5AWf9`38fTP|Ly9Wcd%vK2% zsNelW&0}WDdH#UpPmc%Y#co`6+iqdyXEVj9#E78G?Th1dR>drv7b$3w)DJxo_JX8Yt4rF(_S>sSw=f%D|(p? z{HA;Rj96l-w z6VqkYG-B;}YSz|mAG($g80c|3OVd(d{G+7@E}iQt(~PtKY$bDcz>ZO7SL_SFN4{|1 z{i@;d;7+X!8Q0hKd^{%N>B0hnQ?#_23r5Rt^)Y;^(Y3L7-h$~X1k55LSDb9W^kV4H zr(Zo^iG_?*uoOP&vt!Z0gM!P_2RRxhwhgF{^*#2rDAxIKz|lEj0kxw{EzdRyHm95q z6rCV*Y3|DbrRU@0^XjesmH5)V1>35VJO-aJSkT_N?@C~BOoD3Oge7IeAD3!T^tP6p zI=+w3ikRJ4Y_@;bD$B!4r4LRCylyxkeZaAEymI2S8_Fy4O3p+K*crRj*Y{H4{j$!~ zknFH$qxse-81J9T9B^}=dyndS{>!|A<6jyt zTByQ#tmqKu{=GZ7)>??pw{6qrKbIhii$yBH{78*j=t^MRIh8bd3R86O~40E^-+<9_LmaI zFTKY(J!ZuXskz0n=9035o&?F=Rkdz9_3YJy3Zs`cv6gdJT+ePldU)xj*xY*wL&xlH z_`d#7U2^W(Z{u6TJ7%xYXq*@SiKp$g^o;Bv^8)or9kDI5jHAq>?WD%s9;xJd)8m1vO-#xN7ddRMD1T$X%{;W9xHQ1=2Vciz{mj3y;R#3p}EaI71XD=kd?0kmLE2ex~6~H zB*wC7*uedPJ7ym(P1yhRP*%j*yx6Ljk(_sT=RFoGa=t#R?(518YgD!7y1Z}hjHfsmh(B1V%3s*SmRT|WNde&<0d~d#-qUjD9ZjlpwVf+hE zex9;wn0)oub-e>~7T12;rM~uP+v?FqH%siS?PmFJ78M)%?(OiCOHWtEm`*(-VZbecm1oZR0viwW^gLqtmkm8a-6Xx@r9T_}l&5n@~o*Ve@ z1_RK|%urBphNlTUISIqS;YQA?U-f03QI+#nyLA*Con~x{)RvnK-b`4!|1P_x9;=CPm-yUb{O}f zeSyalmDX|A%^xk@hJAJa+B>Y*>i9|xzLCn4XY$|a@x1i5RO9Z2twyqD1GR2g?YuYo zK5xptK+(7-)ApsLZTCzoyRcU3n33rPq1TVnDkdm?mK&L=wf^;k4QqED=e#zlzTC45IBntWGV@?92@ji29OhJ7&A}`aLHSRs=}i&3hTMsB4kP z2i0eylCtT67W=x3>P&7mN{dSf4EQ|GDn4T4&I8)+3Few|2g{}Hm3l68#Z;$=De9`o z-pCW5?a4EBeS75Bz!xih#(&Yc#`|GW!xHIZGR3-Ys-}8e-P4vbHPKD@)|Wyp<@{nv zr;J|b>>;ie)=#oU6AK5PUU_bbj{~3bsjh~z=B0B}mnCYY`PJ%MtJUyNH+24TO)a%E zw(>pSx1P4s{DahVF1@aOnr)zy>{dGQ)W>B1Oot}}o`f!NozUp$-ZoPxrtriV&7uCg z-P$_6ou@1kyuIM+`Et#<%K6*`rjrbjB2cU7B;# zL>_*=qpR}mTC8Vusqm)sc*FVEbJ_w$%3gEj-s?WMci6YOqqDW#UPw#LotGti-=OY6 zty4x~>yv3SmnDyW6(;5`IXcUQPxR?!$!(E7ilXO3Q~l2fFEf|qHJZ8f#Vf}v8>j1J zg)QE8%leDi@&(1z(Q7JU13c<$-oys+Z`}R0c2M z)%tm&cbtMl%BCJ)m@&Mw>ebxP%!^m1b(mJ=(ZTP6ZTa*=Pkc(AWV-c$TgRB&Hz#># zZ7`@1RD7bcMXq?)qD4wxlWI>)T;a5;I%UKC!JD2JS1*nCJKNkTAK!9D=E~${i_e7L zIj`U5W%N|3D>z_TX}7Vgf#<8G+*_~?-CY@J#US6JhPM~_i`{#StC2(ElxcuqVV69x0n?7g! zhN}#Ab+dDp<<4p=W=qPM+?=j4oKE8^E}Bl zP9WaqQFZR}ebYR@-(Pv`|+{xmHlC)v_WFI{7y^875>Fi%!~YZNE5FY|y5~ zUqA61t~h$F-nXF4NZ_#NV3CO2SL3b6O=J=FUr;dG{pp6&9XV zJ1)}2uXV9v?sZ)SzSJ>OjjB02s~S&6)jG+&HofD$?DDubPBLd6jt*!RSNQa3_v4Of zc{N)k?RVs_(040VE*&1Lt-7Quc`DC9s}F7K9dq4cjt|p`+%C-8o~*z`Iq%)Zt<@ZG$?uBH2Q&x}61*JtI?_57{o3Q6;x``uG4|DdU|e&5z> z{OUm`OD7vnc@mMfqwTYCmyC1BsGa_I0`Bv~C(aW|TVgyasof}#Yt(X{VXtMJ7d#8+ zUgw!u-KsDqm21GVZuO-Ld&k{aDw6SemaNj87OoXacQ~R(7wtIq6ORs3WimQQDWHWgZop>`6~FA$O)cp_o_a=^WMtkU$!c5_IEv$>(8O> zaA8Yz!#wMp!h2HQgFKddeJpVEU*vQ@&ZMn#ewqePit>vm(`wA9vNt^@=Rdr$d7Ex_ zuk}=H^1c(RbR>>cM~_cga;#3ub-*q0?Q1u_%zja}BH-w@i0$hPt3)#2+dH&Lh~!qL zD_`v>zkRKEl)$EUdVDEhxWn<)}}*3pb<-xeu?;o+|fQ*XiK$w;m(ID*R8Z z_xkuue$@d>OhVN3tp=H1EHu&! zOZ&1(V>92l{N!hq4yQ9qo_+M6(6me=DDdGtwG@HEYY!`;1@eYjJnLEREGlvPK-F7U(YIDHm(;0qIC-Tz+qK;Q@n-=gX zI9}+ST_NYt_m_vH@n^n~Q(ZVzjIVV^ilC9k%kF(b5()Cpza2BvpD20sn&5?NQ%#>; zY0~_Dr+rF*`s(E~>;+!)ZTj329$0mF=Ueql1FvPt3}2C8FiV5GqrCLWc;)vaueL}y z%qh&x`1G>;^!7)SLxe+KhQ!y*xOI^``VGGn@8#^04PiF}HwJq-9QRplB|qh>R+L?y zO|GWpJye>h-4FuVY`_ zI+j29Z1Uc>VF_7nrM%_*7OxCGuFq55Rxz(tHsYe1LGKAIHRXM2RkxgqR~*v6+;%D= ze0WpR{ZEN8hR+5Fojtp&&1EpB;`BSU#f{q4nNR4f*ZaPgi%hEZwVO0^@HdV(rNj9v z+(%0qXf9f8+;n?{`-DX<^dgOwWwt>^zFSOc&sMFiiFX*|d310>Sf0VO@aQQQJ*3{G zaV#8hrJ?fn4V~dn-_E$((*1VehlYRqf8g9f%Xjx4J-CHOKHeuj_HEfsFAGIEPaidX zhXK~_rmP9vA(`=9&Ghh~nx>rnqqkm~xMH=DA)snthvI$vH*VXTkx z%UVb3S*J?#@l}J>xm;J9xy?`^e6~gzhj)qsB48oMMqV4S9Q)rR*vfd+7Fwv&h|jNyE<3?IMzo zwtH!6E%d338XKJHy6KfDw}agaag943XSc3cvqsT$;SCQHizf%2<9E#Om?beJSmO4u z3!MKF^HYR<;WlBh_>93y!_7XazJ6+d|N6tqH+#Pi-Naid{$}7r?-a?h8RI_?-9HR)1kX8bk9%dcNGyG?(;I9=f7j@fU| zzn!ttp}9iyp8RCBg^M<>m>4CH?Ym`q_3UwLMHN3i-VgmwMw`S&wh?prZxa%$bT>7-iCFP8O>Ps>@nVZ%t&Dz+KkW%YfxY>W` zzK=_0cUhb(ejz4QDwnt-B_Slh&Db%>v32&rO|vYXE4}sNb?Wr(ihMS)=I)}87v^0I zF+MUc?(on)B2Mm9WH*5Y70^i+aqN#TeQkW&?<~75*`rWebIA} zgpo2a%5)tg+W%so*ZqSYn|aeuT#oITr$OV+S`o-Rl;|Vth{Vc z|IK`tq!Vq|+1(*qFQGX2%aU%1bJ+`}Ezao=tJ&BlEp>WXq2xmcUq62Sy7u|&c}H=` z>eucmsPQOYRTQLgYX9u_Q)Y3A^;|u!JMP_+j!j&(YGkx z{^aHfd&ZfFo>5XBfAn3h#+bIyxt4<8^{skFO}zfTlNxjIl%{6ayMZg*IbSyA=wjpnhQ&0_x5hrNgFCQ>aggs%NF@Dd!oYKga`S$Jq$cHVnp+s<1RNN2E=S# znV0imz3aBpN2^n+65ndMD9u{X(EHwAeX+jJbkPJ(?`Xa?THhwkdF@Q6FHu?4dOgfb z;liGBgI4jeehY(=Y>MagO#SYntv8SNs=Vuh*wc9tvsZSJaLz% zzYnvMEl995GBHolO|*MH(cwVWf(XUJkr53eCro(nWc^WENIWwuE+fZKcSu6Sj_)z! zgRc2{9NsIoK6-5W@a-KtPSp)mc_n^X%IWK*YYV1{%sRK$mQP{=@5HUUXE^iw@pOlc zT*N)H`rCwwQ=hq?h+O;H|ICQ|{z~I7*;UOnO_-k{LF2`RMYppKK%gs~f zdRtrbpl1E#@2&5f-rG@QxCRawi2nUwODU0gBA4ygsVK-R1(bg>(th$-3xHsVrFXgD%Qu<*~z&p>rBAWBS%M;C&xyfjTCCQla-d5Cf)tCyrj59 zZB$!B-SaxLncUqSpE{fu3yd1dGxX?MdgfHYsgaw||Nd*`ij^h4+cp^+8P`R5?%J_^ zM@M?7?;-C)Lrbqjg@=VteQ`TIDKSZ+^HFJGLE*|_%`a-7)EZA4)Y;n7xGlQYrjDiy%&Z*$(H_*l{w$J^`1f~ON|J)#DS9C#E;BID>iz$te`xyO zBK+&?zyJC_KT`C6ey9G=AL1L0f1vRX|2|F8|M?HB^Plse6#bt||9L|H=M5^!yrFR~ zs?X2pD9!v0Yk_9q35}1l`R&IfG%U}4bTkE;oo1%~jr)K6jVa2o)bBZla5xIX1N|R$ znCA?Oe@7GYFrfk=&d=mPE~6GrlS3Kih%!Fj5NhmNl=8DE`F}**YF*0B+&?#I2W`MbbeMRBl;V&2i+|tZX6lz2)7DzXR zN5ad2nGuBp{rrPmngW&j07Ya%*RqU{Kr#>^Hi~iZU!{{KS)lQV1UGP2JQrdIy#MhB zaKLI6I4q4_O`(WDApq-yCWPylL7=+eOdl0!WFl;O3b9SIG{Q<#fGb98n(08J>5*LE z-mkQPP#_1`v7{0-I1Fziit(s4_|PKi_R$)@L8}ev2^KX*jlBRQ#I+Gk3?{q~S>xJw z97ay?E8#De+0e%ag}?*3$f?0wU<5EKb}t1!Z&+o;_lYQAms9MEuq+S!jb>ir-31K} zPQfGOeLQGC$lw}93L{U$+doAK;suM724KG8jubcy?aKT{vuFm&(J1KfF%*#e1tbE$ zp~07*Tm_T-;JQx<_O~&GEE)SL4HUjZG$0a(Rul>qln>thr?kP#jNItpypA{L;s;0)rQhNo#_E+VQFz5>Q4J`agDXvZ>BGAA&F zC=`fmKovnE;)zKSl9dMin6E?)a_ypP*!jf9_=^(Y@xa))H=vg-)nrzH9r3`x1`|a>{y`fm z&f<3H63hk)JO~HHf`&*s${;v_q2OwmLb^{AW~C5gGuxAl7?>1nir-2nbQgn~DMq^V z2STFLPmhC{F!8K7@Jn!?DZ-X#(lSUQJQIsj6lej{MkBV+4dxL2yX@hWhI{?Wut;n? zHCiwf^^=RN`CuzH3NauF+5}OEHXE)BF0QNKY8iv+|5Vv>vl{d3P@J7XD9U7#0m5CeqR z87wG?lp)Gl-a|bAx9~T1lEHU0c^#$}n-{Z<_Y^ZE0gI?jMh28%5ru{?Kw|Njj0OaC z6mf`28M_4wB7ic6X8Y&B;~fgULwXjO2~L6rWUb4RKEl%AS0V~5&0$Zr2L4SF@Nhq7 z0tf$5d7vr(er<~RXhj?VZ5uLBCG-h`=gmy zn4kbK3IamhkS&0RX)q%GkU-`jJ|6#3w_#>zI4@2Ba}DnR@CB|L#xH-5?pHG{}4m>v(8nPfR}Z29l3tVj5xNB9Uk|`-Xu8ybs65 zy7p^(!kbvnKbHw}4Z=Y<>Q{h4lnGH-Tf(tei!eU|x3SUEBJ6#a$|+65+!Fd{Mn zMhsCBKe zyfAhrn1Yr88wOj7WgQU~_zV8~g}v|`AOiS4%Rp!aQ)Dj+xsAO{h&4nSBIK7PDL4#V zGGsNH0gUp_GAiN_9mf$NMrFq?P4vdUkY@Xbv_gvrwZdG|@CkC_FRcg|py6Yb2|P-_ zpH_Gu;gWa)P?(qr*orBRqy$x11ZGZxDIh2`5Y2!=ow21L%3n#xmR?2)rYd$Y%MYL@ zg2haY%3)!cLjW`WgZaf)K=1mxgkgo9U)g1zsKZ1EyvCcKMJmV+q?3sdMV1Gx(Uj2T zxEz8)0Rt1$(Xa+ZV_@XaAPfvVR#uP-%n1f1)(LA!m>S8)G$2PNa>7PNHeSYYgmh!O z(##4aX9K86Pz3)VAwY0&oQ5*cKdD9&zyX3EO0d-c2Lq9gP%*@?ZH1o@O5;i_oZ<`< z+xBxBLIHM=d5nz+B8?283vIvRe#QXw_^qCsZMx!U-EzBBr zHs}v?0tWbteJCUyHXSh*UZ=PM@wtO`Dwcq$50)Nc1Q?05GsX%-fgq!d;?5LJ{){RR zME2Ql1Sjm&#q9Q>k3B(f*WhhK|3& z-!MJE^69S#V^FwQA^g6P{jZJc%R7HA|VxdAH`{+{w*b3Q| z0!^6hgi?)7^+QgwDH{?2ML-^0iz3Rw+5fkH`vDlNRhTKjK8tCvd6_4S36MV#MQpkv zd9jtzCjxdC`O%18Qm9m)kDb1U3E?orzHf++9flRy0v+g6n|y=j`?(pIqhJRxMeqaQ z)qhrYz$GFDO^ml71cLv@TakzZ+;89#u1cY9cp@gqh)I+;mOcK*UHb6Pv_}2FHb!3V z?-qsH{5S)3MjH%S2Eb*r8_?E*)MNAg;1`d}wm5|#vwux4dJGAC4*#?CGQL1H`y#*- zUpDAt5=MkF++s;ekmgv|?ByLQ|}Dz%2iTq%yo?PO-Hh z`F}7O^E0T+JODnUS^kEq<4wz=#N%!fgDUU}#$WGYuYKlKyFR zX*4wAh@#N;p&9rX8PX7qPQx+D#fvzgF!?adAd5tJz@V%gA`4L-ND2^-PMYLRLv@;<*qB-yc{Tn@K zaEtyORERye^T1I?BxVGp3ymM3xZ}QkX~$gRP_Yw^2CE1PMNq)bs9<*FKL#iXgE)^t z5|3zf9!-Lih}mEmCtFbDBh-*E7($Ba!RPx3gc<|S!KMg1*b!L!{xZOBB!HpcaM1t? zU<%oWLZQWjVm1jtM7mfj6WW1m|F?!j0Y!u2w1UG3J~#?P0mp*vn9F3=&@>>=*raS9 zAo6MAOMhh0eKrGz2}&WQ8A?D*vE)!{3U;GG7TH-IzGg&WO8lVlzos&)2te*19k9TC zb_DYng^*eHL_R5YC6HP_-#l0pq!auB`35WWqardZu+wi?vcDRL6POP?A(3T(72BrI zJU~NI8{jyE4B8C+%^dkFo?*i)3lqO#9kyisk%O4REJ6W>;4JtxVF1WFjscXLKtc8Q z4Vadg2cd*wuoMQqW}X-=C2=fIdHA1CfHef`5Pk z%kH@a!)V-}F|jlh_CJ~ebtDmC z*i7Lc|CohO(Eu~+HvMrOzb0_A>?lMdlW;-yiFB?jPEN)q)_xOt4T6>tY*$gkkDv#4iyc zs4g4%p+|@#2prhkH1-QcyoMAJbfK9E^5HW2NpF-QKofJ1p$4CVo8*Ty6tfdZ74Z)J zYw96NS=0mH!J1~u(GV0m2girHVC%sH2pJL*4MvWNOoTTpx=b!oXhT-tFl5lopoIL` zLBF;h!z|csPy?_ZQE}9Rrom}28M=q$g=+j~{m^*P;8`%61Wgzxu>2pDhc*YP`;FVg zz&Lb-4S^4#SnzYVj|IVHf;?8BSXKZR{sDeOdmXF#0~p0x4Jr#(CLR{djyy~tMRWH- z!@L8U_EF%MWtatp&@vXr0BITwgFCUKf!uB2(a%i`WC6aWi7rTVED|!wFEfIc8kFj{ z0f8k&GZZ0~5P^R>CDxpA4QTi`{m49`F&G-rfayigffF%T&@U_&z~=g`(89qemd-fE z{dtNaI+CSOlm5cp4?CF9{s#t!$Q=Bdq@Oe=G6IpKRq^XNnT^Xpgak3KkhR!o1MG~p zFsAQM31-M(>ftM(AYl}oJ;WP^14e-dew4?qp`jyjb;irg)Qkpb9wKREF?l|h`~KzIVk7`gI(y9c7?C#_&KG2`$DCS&@U?l%v8koU>?=ZfD+ZtaY$}lp5S!nzcTMQVQ z;RKrp!(jpg7AlPmNJHEd>Vqf1KQOV!tOB>A2`P#I0V=ZtNF#Z0H~`lq7`$L$ZdlmE zA~DavE+f}HsRMce=*J9!THrFk&ddtNqS?;@GT4_F!V z2V)5cgGM4YAv=))ZVKC%1tT61e#gQD;%BADco=!I_6eXs!!p+g8Z zA|H^&>MRN|M&V&-I5v$t(dZA<6TM^B2o55EKr{OXIhaj1>;$4bh2ar~LWHC1cmxVG zAUH+=X1i|CkU)QyWMhax4FHl@00dhAA8JO(ge7GhiUwtRP!#9@<%dzgHL%AK!;nc< zY;5_UC}M1u8u%zk5LWmHqrmWZEPR+k2UsWlVJ9#j4e-J5updMT1t*-0=>mi!0f~i( ztFjt^bu|J{K*A|F1PgRr0#Ar8L$hP*CIeI>rJxyK6R1hzu=|1g z2xnufl9q#0fc-}L37lgb3XzlUX6Ixu0Fx%x%mC?6z&PdDPBiF+Y}ya!c$=WK zp(B3+0%Vm!-a{E;W4-0%233XT!3!I3`qJ;qE`(4vwB)9{!RcJ<` zzQzD{K;;pmXfd+5kkAEwR{V2DXYj(`ky|MM7{}p%lQ^;^TyzjY$oSv6F9D+)W<9KoI?y2Vg*aiNcS;3xZY}K0xxq zL{d0x3}^TtP9$7MaEB3!5dj6CwiH1Ya~lkRoJ1&@M*&`Ct` zAFPt=2A4)Pn6gAXY4n8!FC>kKAEbuHbJHZG{&EYoWc*F&%A6$E5ZXClq4W_JJs>QL zZBB%gk%VUCLNXzobf0R-v|viW21pvRKDY$!yv@OJC;QZ{sx~bI7ZAwU`jAH8jr>;NuH2HaFm!IXqGbMJHmVas7_=e z7@W*E)>$b;Arcjj0cB+4NEk015*F|OBxWE^;081tjj$tSka_U7!rapc6N@}dGj<>B zus)`O=|tq0X@xxo+(APO2rvGPrV%zMERDcp8W<)ZHPG=iAOW;wF#&oFIxssEI1IrD zjKG4wK@Z}DShfsvz~waSDH=mSFZ(VSf>8*EWehfE#PRyk0kVqppwT2`8=9puRIZQv za7ZXv6Np5Zhd7C%hn(McQsxsGaRv}U8v;{f&l9m_DzFMhiVYS6d7Q$&miu6Ouwel}8h%3+k@cC2cnWwN_oPW`ka+cA0hhrd(GW8r2=yoKu!J2t z0QNy5LJOdv(|8gPAQWdfDT9G|Og6#^BNIbGD={_#SRpoIQ7~#k$0K}DQRG6LX_kE9 zX@N`0aABsPy9tFrRV)RgHhhY97f1;O9uU*e;5o6S2xZ~+VsRqw0pk7(C($%{2PGI2 zPNN$%OG%2T&rl3>qNzRzfKPsW1%omHf$Rca(Q9JG0LEYkND`72zC#}&ge^fid=d5q zA0-t2!@OpF21r92l?G`3j2{X_0hhowp~=o5b`;U@cb5!u2Yd>{LfpoSiFif2p8hMg zV^N72fF&EaFkZMAFkHf*2w@6{0=ou%VWt8Kqrq5}2V~-vM_vNf0Ci9kKsFQ;JjAge za1zUs#R&a+45bG!NJ#dP`c!^bpyiT(_j^c#bLZ>lmT$~gH zxCELPJA#ey1dVW5=%F9n5kUjggL+7|U&kL6g%iL;LLg{sfokMGE8%i5x_BUP2iP9D zmHHjXSVOumX$(6^W43%l)hL!W7Xby`2;aQ;};|_#2XDTVC85U)x+Bbx`X8o z(3~L@QPW>#JSLlJETrLG2;xAv3tplB78*9y*q~uw2&)B;{?G`l5gOy7DfAq93GocL zfI#u@#E=YLG$|n%iG^n0k!VVEg)`Ft5wZzB#F&QobYV*u>`(ZO%~d!7oD%Iw3S9>X zX$lqvTtHn}6eoCx)&apHm_koLs=@lja$tVoAXpznB5*eoE(#lk#($$R@y4R?N%R=+ z03b3L4jp5eorMkn3EX9z0v za95gPy3g~zo3T$30E)23FZ9BJ{L_gkJSXE+h>9edNC8EmV>mh#oRNWsv}PXRko0pA z&jl6&2o^95c#Yb@SkbsL)D&orwV>H{?0bqLjv|SfsgZ%vqJpa6%>u%KcPaP=YBC3C zmZCs#gc2V>(V$3Hz$9py_PGVfrdfJX$ZX&SmW~D^f-~$Y0X|uZ0JQ;qEcdZeglx=j z&hf!3E<+xRhlJ|6N8{L}KDZ<6)tlktgs{ zVr+^v`U!Lj{rQF2X#f#n_&dhO(<6YuWdDS*`T+S&E(sg_Hkbbp8-xk}Avdw#B6tRz zCklWCBh#oE&L_q0Igx}uMOZ^mUPtsZ2Wb5L9}o=11JQ%KvO*@b#jQazB*|~R{HN*nkETF)tWY z)c^i(M3hO-VTmb36pg&lUp*R;&B#E=1ab)JBv#N51ndrDSin9QH-ip7!qVelL0hwf zL@Y^COf>q>NM*dn7!jETJYZJ9Us3Jn&2jR<*eC>y4g?V9D^3*_ji3mJf{~g~5pd0P zLAe7efuNv61Ua}5;|N>^w}kzXPS6;5YBVn#0tiXd;1P~H4WtG!KwXg0KuLg*b!9Lk z)8H783Na1lqlgYnckmip6a*C(MF=R+mx&3Uf@Xsa(25r#E>1%W^jid;ViX|w`Nd=u zMSKPG!e5Y6Xa)u>^_v{RH4owh`hY>8k7$B!kShqC-~%CI!HEotr|DA@MGGu!AOz_} z_y~FxG-2mgw#dkY5UrV{(`0Kxd>nWR9{oMqn6Zha0~S5$d72a#HzYyR;1EqvjPrqZ z7~}>U0@xiRq|s$yE9M>EYcvT8WDHIRa!n+H7>5{^^%D^31%ila!v(Ov0LuspX-yC< zr~@-ATIYyoT({5PNG+O1Phi5BH#GVNO@oNUTOLgYNCp$KE-1h`akt+DLvk3(p>-&H z57L6iBZve7Vp>2>fCun+sB0fNfI;w8q6niUkOR5}ID%jkuRoLzj1|U*T(=l7vqK0< z0ZkY?2nL`W3QPb-vXXfQ$-}28JU2=aOeJoFVPGYQl(AwYjE=Zsk`9;!Ze&?t#6=cr zn3Vm{7T2TEmp|@DA=+qiI;ID3GgxC3k{OtkkeLvexydpYGZPLDNGUQEv^LTgf9sni z6eT1t1CYl5p(*e?1?vM@VJwLm5sfsCQy-b&P9TB{S}?$Xbm$mlp874km@Ie^!=V_L zAg^N5SU`Y?{3=+?Wt1HnHHY140^?81G3Ek-Va<^*2|4hgzvX_g6~NJc7{c8D&e-g= zCXGnW`6~oO!WbU#?@U&I79fU9P`aO=G4IT_K~_S#V%8BWpa62zkFioPez=~olWJQKM{0i0vB(U87QId=TA`+6s((Bin5dLSa@VEVgb@>lW5LYs) z6vWMjUcz9g6S@fE_+Jkio&_`lL*vI3{{9<9vE<}Kz#t%tc|wC_g`T6CF*IOP=4Tq= z!N|$`7&e7}r@>F8=b=yGrx%fa=5vBV=SWgfQ#Q|WNs0#W5h8LTgJaw&!HBg9NU z#4C$SfCE_lgKsmoN72FqKu16~vQ{G84fJM95t0#`fe;&*5tRhmvLuZeoJQXf$;|2h zn!Lb|K&1b7mj{De`LY^o1g)4^G2FxQo3!VsS-4_C*CuoQd zLhAzi{nD-&Is5dXk+J_k53CeLL8D-2LMYzw7-5bDFs=^Df|ftZ49#E>fbbAZAXLbXEGA?yfpvu*5nMq^ z7_7`0R0^VIF((awgHzCd83=IJFF?^G3X&iIgF%R|0-wV;v92hVGc*80BjkUJZrlSS zL|!2}5D6fUAn#(*K@*fE$PEoYje&hJP6|JyQCCPR_9$4%M-x$4^j}r7Tg5{_CxdgzqW75$48~}IchnzD03Gu8Ac8BX2~D(ze_&(eB}QOEOd8UR zuh9563T`Eo9|jSU0sTg%n1Ya@qsSQb5r8INqU}VZ?zjxG1b#ID0TzP-R;9p8=JsC{ z9kC2VhxgFW#Li_Y&&EJ7QiOcu7DF7dK?_`hA^w0uZ2fu$~@DIks^ne(CDLyPm z6V(VBn1~Z+z$ zh#`&6ptS(nVaxrDA{@WOlV_-%omf_I)p@|+pAAxzq7_`rpz@s3m zGgITne?Lux2M`%-Qu5EX!|MdQf}xSI1N`#a3^6U(u#NOZgHi-|nz1GtjBz#vYOq)Y zsg4F^xI=7$nnX2ZBN7fUCS)1}2-o>>8x;U2uv?*^cwXd5I3_p_*^WwX3T4ZN5CLRo%w~vMU zu^Y%6SZ5R?06+-=0HcxNqQK_sa|x3StHR^(GL651IOEY7xv(!F?Rb~{v11WO5Cwva zWE z@Eg0zV0P>SpbP~&gBLV947EhOfL7=Z@(R=e1R0USgo33Fs(_7)79oxEbi@&Rx%2F2tP85r4|*h-K$ zG%;QRNJC^$iuprE4mD&NK!s@BoFN$5kgz>X$c`h1=*Hu-*8Q`_*o728fcRzODb`k` zPN+I=)~7dd11pI2L&_jzzo`+PAECxANRCkm;We-fFa-b|s*E^h6S6-w3L9tkg$G~} z#4`r?0THE~W(OPr#2o?q41U5k$crqdLQlYa&{zzCNOdyW7!5Wa1{Kl)PRFo}EQw%%W;m<)+~)3Jkzv9|jXPIZHdn zCw;H7V*nH(P%&m=wKxsW_pQe8MnSxc{EX9oK?Pa{SRjxm8hpXd#*;v90J~uCPy~b6 z%)c56P)IBxC=2caJdBJ^+WPO!0JNrAkQ3SbyF>jziPR(d{=-A{mr;-<7!SNVDEt^x zgV6y^&}Rap7P2+Xs?0L-Gp%wKTJkr*kk zYVqU@*$5lW(utXb;SBi$)d#)-bg|wC`K9p~m}p{`QTPUE4RA5cfSf{Yko<&)XbQcB zeb5_hj34l^XpmJrE%F1R0Td*d$B)2dOqU-Qp$VBMeVo=`4?=LF2W$cI%cd3ExsWfg zS=pZ>_5ArDY>E=E`_w|_W?O{D0`xxtaSMkVan|45G+r$<2@Sgm76UQBW+9!z^g?@- zg`_8EerKwS`dyumQBG@=_14z4o{5W55O0wRKOFkkw5iozI> zPV6)#0tt=L_cf3Z?F+yJxgcv9D$oeaJz({|170QL_{aL`FZJE-2 zoZM#%GnM{QhLL>8NE9p#gn?$q?TDFB^a&3$_rQi?IwG3@uR+-{R_s2;jpP=<(PR3f zZvZP$it#j!FQcE4R48?@I|bhUp<7|fu=X%oG$e+Z6_o>P2Rey#6gCPdije`Qqvb}r z>rd$W-CJnk1G-7|`=|ok37qgJJ(%;)Wh2aJ;cPphOF^`fk8~M+=d?*$P_pO3^B|wG>vJ( z^ieeHY*;P^4e}O3jmD$_Dux(F1>Bc~V8B#A-C=xwb%RC#(Jv4YumHw_J%Xo00V|$jm@RZX`BPUn3C^0cMmb zqzDKevqSKn#UUbNh}4EJu=-#Wa(5t22&pN+5nddiGoT26($Kg8&3c-&AVopKp$C7| z!Y*bhLor-Iqx4sX#L9927o^CO;2aIc#zw>g;B5nm??)dvUH_9~`@!*WAV>j#cG$S+ zVZYHqj$+J3m>dW|Iui#9008`Y|BpBQ~o7?;Fq&jQ#U*{unO}mL>2ImV)s2kHhFX$`d+; z=4Dnk3MNDfpkS6*twYn8GK3%J6FQ#)X=0i}V5~7i_u!smF%-Erkc12Ypef*<0@E^m z8BM4@bs1%mdJqw;MjbHt_^IVo`f7DNCUuLJDAKLJsVVF%Dil>EIhaJc(Fz&Zvf z%_Ns#78?Z#$wMMCsFPNU)=p~UJ)~nLtJpe-Xqp`2(54?4XbVCo-h> z>A(;`vvfeuVFw&=EG1qDgdrHE@Z=a3xP~2piKHM|=qNTN!5B>>18j?5wSuFuZ^fE& z3bllN*yQxjDVNnxcc(gId5YjY;k62=K0j44gBI$vfKrQ59#NJOT(4Y=>7)izN>-TdQe_O<# zl>b8|5iu-1m@pEPVeN6;h&=)$L{qRJsS#1U&l;pDgct*dq@V`?0$w_hMxZeT$D%Me z42Z_kAdk@KC^kRx3?h~7ZUV#7q*@>a=px=Ee^3`W8J0(UVlR=wV`Cb&dSf;J^y(kR z2@(YKLk>mCz|%+-B8}iA;Z$S+fED{0BmlI-)?q9RTo0EXh6V>>O!`dBOq`?aW2#<|)X734XbHpau5l?`o z!0@qNG_oD2ha|>G;0%CsW}lF20CqrK5m=hQKqM3z2@OMj$Alt@p-owi00SXDNl8fA z`c}c43{!=<1Ifb9pfEK!CZvYg0;mSyo+7UIBR1jDzJmYUCx8SrDCmbrL@EN8W6@a5 z4J^t4z!76s2-)wyK@5r++LCZw5HNBhpfrGyV3-+P=q8*34vXE3*2-_m0xn_BFcH9r zOy0nGQXRAhfo_;L#4_GSLT4rXGExP>}G2axy4m!zVA zBf_T;KLZGi!Bk?K zSuhUx%8p_L2G>I8eoh}d!{aZ14?MZkL9l^Oe*%N7i*HddIe5VWyP*`3ixKw*)uFI` z-2udg1Y&~Gc;p*)t$%PrVF);Ps1lkM^8yH>(Y#OrXattF4B-F*0MBFfD$MI|7d(cwmXrU~(`PO9BxOOke=sisL|NE<#M$l-mZ~I-)C>2;kU?#M(NJRAA5fKtl4>8d1AbY9N~HHkJt1>+A`|d5=Gf< z%Ms;vdx-GR;dV!Nxuc>30+SL-P=W=3Qk6T}f4lE+_FBKS&v}P?GXYUpL8PoE_Tf(qh$JyKMI`uW<<)u^e!iks-?#Xk>q5|MIN3DBH8G;IGH@CiUJEZ)0 z8%P&i6tW^_i|U7`nn&41G*D`>OeDdXZQf#t6G$W6NvB)sxvxdjG`W4_v~XNbgKV~; zRm8Srl2#FvWtp6L+&rz}G`lS|(oy?@{*dZRw zTVK6GCUI6g_2~d31AAD>QQkwoRR9=!5}^l|4Sa6k(Kb-N62#M3;G9}q z*gFzixst6*dlT#Kn6(%YZs<{}we9sG8MHC{I~gs*g8_GH0*eDHml>7}c*+uf3I9v; zwZsGcV5@hI#TV{GtYe0Mia#VJ*Xi-OcDgm--Yq{Djjkw~mwSOguDgTR_&tlr;b?|M z<(?f+g)4eur1NC$0o&PE+<%@r%BWb685jt}`%pJ8V``;;w}U&bIx5fB6bs@&1f@jb9thk($gG$PaE#Knvqo=Ppg zp>}3W`(1^WzbNFao>A0x;R82o2rQ-2Jr4`;tYe_TK$5o-5bz+z28J1HKX7`?Um6l7 zC75s|1<3U@Bdfg63e|j#>0C|Eg1r76vd|2>2{jq4p!vcoLGbc)@@sQV{hi_-57f#6 z1rw4|4V2UxT;~a5Ni>!^(8QyyX8LG4v(Edpwi{~EhM~)6+V$9yo}y7t3k0M7pt{Hu z@+5l21O#;ImXC3$abEkUMIJ=gx!*CLr08Z5ivwk)M*GvAXeJ;~{M)~rn`Mz+29D-8 zXWD}Fgu0ki(VmTg6-72GT7-ofB)tLQxgEw>+5Jfr(qkbme!HxS=eEZTSmA{+fc)e~ zk2r^99w@}#{*B_ad=rq!s?myMKZ_UwuZKKh5d&PDE;K(F#CAV=y*khbBZilN)kXPC z1NcPDDK0T=sIzA^{W_>{!t(3k@o4|YY&FZN8dJR8(Z)Cm6GT|1l??fCl7|Hjl2El_ z^2=E?N=uIw&cTv1%V8{2+!?Ip{?>Jx!yl+1Ev;UgX)riXSRxy8nQ|jnk-DNd$P9_O zN5*#mlBH=zJd_%of|0yFlH)9MaRn|K%0$Q~yd&2a!C_=9Pqd^~jXuRGC-rI8$%0wj}OBfAV4>9>)X)wj(w9Hx(tKQU&aD$jm*n<1KPA4gp7rSL*1$ zaP@#Nnp++Vr@?|Ij~mtl!Je(5k7KY>`H`T*9AHCa@QE5RmRr@?`kd@IeAxnFy2L0N z<1d)o10qI-&i^Gw3Lnw&lHn9G3M zu$O4MOu@D^EdDlfVz{_EH(x9~LuXT}?E?HiF>31+3gL zUKE$=y0H`4668oCiENyjxYt4Hm2ZjIW@eS2C;Kr5OJFl)CNyQzh2}CrOa%k?ziI6n z%`IqXv2QtvGR9zI$$G(%NH=&9Ea0xy25zr~&kpAmFnQG(ZHk)>^I~I{`-0<3NTLPlXVs? z-f0e|NSM)d<%h+sCjUrw{Wn;-Ml8la(s+j0kigdFU%-Q6bP?0#ik_Jd`i777ZeHfZ znGPm(DP3O+gZ2~)$U$|vg)Z7PRK$cVb!>>B&b)LjPr(2~Lmq2D{y}ObrQptyXzdp~+ocrT6J z@B5<%w{P@c075LKP1#2K5ujJoaIUi5jk**rBWkRkNv)b8qblI`4*_4-BNGq=bOBb4 z+k7hG>B~#PHU1;vf+Bx0U`4bw!d#)uHACz?;sYb`&5v>kQc+G(s@y*iFPz_n1UZ$! z`WWPvwx806JliZhWcQSxEQ4J(jW-p9Qyc{!|9W9ypHOno8H}Lt2}V|j5o?AkA7j#0 z7ip12BnzSz9mr!BMa4r7`d|CQ=3f3|mwmf2q7RJR9!;hv+g=rlAtTca@lR#MtX1x! zOUT$`fd-@l?kKjW9a{b2k_IYsoSLQo6(z#fde*L})@K-5iXSm1*Pa96wV^wV!nNu( zUe02xAv7)xb8Sc+3$tGbl_KfwZ|$Rm$jpZB%k#=$EnSpb7|=t zw(TRx+ZmmVyvB1lUrjq?0vvwjVIP*4;un9{LP&;PvLZn&rOdsivos8oR*wC~fJ!uWi22PB;!}-%_h4?;C1>v@rz1GSY zC5$^^u*IH0tKTt>M-+=X+o2bwR9RvaPL+o<58&JdNP6y0j;YaYkM;-X)-^T*bbu_^ z0JAi>qBKZP&Ox9SN9IJWwAMsN5_I%BBt))ZJg^z0B8+LS)fP*l#eruun>=Q(g#L~m ziLqwYGs;a`zy>c2KHURQYM)0Dv7>tjJ*}Ufg1s;{ZApaP7v2?=u+LeRpk9x`M~Et{ z*ZV*Lbp>t8B!AS3+s8c==YGiY=mz>ytH(&S~w1Gs;ZZY_1mYcY8~f||q| z!pcRR&=QQ^;>(FE6fRGwB_9gQIGIcspD?EfBRhLsCp_d+sz8QTaSkSJ8&Rh~UZlL~ zV^o?tpV&_Mp&pYu9b2Pc+IOsk_HyuwWj}O0y}!C z7PXX~&TxUoq<7~%QEB}~Tsm^r4=$HPSMMb0r%o4d!@BU&u|QOUZ(JK&ZfP7Zm{H?` zPAi77%)&`Ka*^bw4Ka-qFi&DxQ8cm4&`j9ld0~sBl3LNKJ=E*f z8c}J#m=f#r>G|fm*bUa}ox^DBV{1u@n!jVs$~+5Y7lDaSBols+Dc~1ED9(s^b}^0> z=v~m-j1tl*Hz$57F}-9Lz>#CPIjzt$hY~J-3j69}OWc=%c#C*e&~Z2p7N9wW{v7a7?K!iQd4?UzFTlO8p^LcChiF;4?&rD@uJ^W7 zCL>DBLBE(fE|u#5SdgRp#%6Jv58SXuBuPRjwrv*Z71BVsVgp)}NpcB`1numpv@k>G zfg*chRHoKi*rk#q<6yRJDY}k8l2L=Sz)*y9DI%LYyc^kz)L-Z#2g8lvTa{!_{m0Yt zr*2X0)!F8BJ1~hHZgayu@hkE75M(-gbOJ4Wh%3KVoE18ylXDo;TC-IicgCN=!X~Cx zuXh~ca2mA9Im8>OC|srJQ$smuhaPXvXc(tXXt?k3i8PEv9&@5psd3c#MASS(Sa8%e z9Y7pTR9qwdYim8Y?zDFcSpV4Wy*@7V44b*xM#grqp!?>afk->qQpKgJJ+P{0$#@tU%WIPmoa8(v(Az*8@1x-KJ=2b&1q4agUa_iC zat#mJ&(G8Q5KpLxXB?reDyFWmKQ*Uty-}X$*yp##>ira2V>v~o8I@ha*9C(@_=2r8 z4OYOjOr%*^+Z?(UzL8>T_l2Z~ra>6cs$_LrIskRVnca7?5B8|-df4E{*9N)pTN^&sE;QN`p)o?+4n+C)MRX_2D@~e7>Mz0W zUlf$uW2oed%ZER^wmc%QXh5$IM7ME>ysqZT{gHtm3Y-6^l&%#UwokJpVy{m27@QGsY9zgBv~|`wNeBR^D2|Z=nnKJ5gJa=TBo7 z3zw1%&3jnZ)01FaJJSdU3GhB}IPPHB9`1O@&WMKK^-?_CS#wVI#-QdL4s|-+0yu9weWXvwh~eW2W#!l!?tOO9>z%}2cTX*J)IeZCh~&) zRt=(8ghW?oI!5}C9#n>{#e#vVPmf5ecW{v0R*~k9R6mb6Gt;4oaIbuB1_>J=Fb{oF zfdvUWpo)GS@&QnP+V+iYBfVhAj<8h7F$Mi<(&}~R~yk5Y^*laVslXM ze=6_`86OP<$zNOjU|M_4NrvH7-a%)ySWjlvSpCZtW}yA#iulxyZr)uYc&?>7HOAh^ zcg*41I=B(X(bj_>_E=)muRdDwy(R77q*ZrHlZneRd?<;Gpo{yb7Hd_&tsn&nfTBcf z5Um(cCwex@VGoaE*dzB{xC#QDlcyJgs)}P1p$sX$&AbJ{mr!Gf(>B>Kzg81XkXKJg z&lowXMCA+V4OO3jo@SSmWx_!U&VtTc`2w8l@-@Xvo#G;loXHyEpI zMGp{%^R+{L6qc706%UQOv?;Aye?t3klP5UM;2q zwDRPd{-mXU?5MVSb-L|}$;wC_?&DDUw0j5x-D0U+*%QL7LgXsQg#f~an)fWnynzcg zRljTHMYN@z6#Al*Ct~gVVl8{L0e4fgk^pGy+#L{pyTY|Pub!qCvLuOTWjH>EkBl&a ze2ET6dNrY)#D$2sXCvga;xP7aT|K;|Goj(=tElX~0f+Z`E;D0*v6Wz=Zbnr@=%A5s zxh_jhqp?x8B!T0!%Xs5@Mj*mdv(fV^Xk{?#pV$veQraULh@0`?s)>M7&}Ns{>dghI z;BDJ)iC5l_H=%PBg(LusZCkT}(Aec_W(VuR6{Nah=ch|4+n-cLOcI!j_>ulLb$-WGx)(=XG;dQoI zE(4o!z-Vj0t|!P2-~0DJ_$}~MXFvdlp?DbKxVmm5@=yH0K#?UeYUaBK*9|kfaJ=k{ z++}{+XKYXn(ZxFSc}T7>96PUt=^fO&2Rm#Lof?5*^8oU>fKXc#ddZ}e4NB(7F_y{& zXR5v8sMHX;ym(5E$$unCY{PAIwgx~^VF61fx}FN8mj5UhEO2+aD7KR+>jPCKo|2%# zK|jM{J)?s5U`92acAbhEMDw?0uQZlrfGSiezbnASwGHIXF*Gxy&$VWa@}rZjG7n3s z3(ci*0N*S!|GDFT%Fki-8)Oe989caewOiuvk$%rNWwoNwrg+6A{H3F)WTW|M}=74 z0sL#ex7zCz@v~91q z@Aun@^aSfR?owj}i4l|%Sp#vR?pIy~Ul*=g22UDOh-c(m%aGQGnnlzgUAs&C^lO(M zba6fhvR6df7)I~X0JfplN%w=bf!c^l5Y;d$hcAX}!G3cLD|9fztYZfMOivwT8C^z* zIw+tTX<#aus3NuuX005T+?5;jf)$yqg4nce+p5Mm?7!wlH;9gMZOr zq+%z_fMf53a(cTnOMXkang1j_-*@hYl`{rhVc?b4@ZOPYXb^9E z1Ywmg;9X%)yxbacM)QMkknYGWJR+L`_u@4yu3RS4C2_cFlZxAWsD$w(+9-+iNJpgy z2%f_r5po*F^flRR$1wOLkIo)jC&^qU{_}W0Ky@d$zyf7h460!zPkJip1ROnqoFi?W>60<3XwU>Owu0E|vrVHT@3&r8} zsM#-kB+Y0M{Ff`!^nVEYEoZNyzD2F`U^TJfu!NVoNVAI}iz&;*>sOPm8HSi%MmFVI zIe-n*c)$YnX?R{48lZala5Np`YX;WHp}}(ZAzoM&lW1k=hYd1=l<;W@RU4YZ3AP9< zDXBz7Oiigieo~5Hhn1CYxSxtxZ;Q0tAvP*|j!YN&M6C4tOUvZPXj>wwYn1ftVx<;2X|dA*Hk=H)juNY_EnV)s+Lv=C}|3KX4S zN*6e31Y8&X{TN+@B}}ZYOTZ+f)qA3B{n-_}MY|2X`grHFPehZ8xd^SBwT=L+iD>Gv zJ%VoqEr2p`NVl_~4Dc~r4YuQ92v8P{W{f+2yYEM9`5*eQ5LJQ-9OG8HvQ;T@X44tvp!-@>Er>FF??%0 z!E*7%s(Q=Z*wg@7%eZ3Jqwi3^^n=C?geDe2Ob=>zn3I?`mQtp90ocAsxv#g4LRRHB z86ht+=1`k#Nh^>?82v}P-^TFq6 zMwKJLE+(G|)N^c`7;yWyVrbXTHGoy%i`%~!?!%#HptfCcmPcLDUoocI+I?g`r+~urM@IBDQ_;T6Bm&Tja|5rKA)g);;Pv~k z*U@^#ltBw}b;;d+uum4o^^v4OGpy0OJ6BzR(XCD#$Z3>XFto?Xz2_}fd^u>i2*Y#{ zw(RHS2CJ7XP%4hU92^eoH40$o+@Rt8UsXQX!Ccoh~3~+9>E^ZVG!r!u? z%5_EFml9ah)zGmD&KfMK{HLO%2CKLu4K(inA&d*V)Iw#9Sgly2-C%yaFt8kiADVdS z=mzZI4Rk1ZfLp~;$;CXn#%wjP+Ugc1NeEKe%?Vnppahhg+1N7?iR*cctBcs^f`Q!Q zpwQE)E)Rd2YE964$FHxEV6gJzO0fL?`4Sl6ir*TDgtEa5M=UrGC`&)4cw|f){z$|k zQ(YShn1VWUHDFY`A+zHVD;S5+?X?!N%y)?d7&-{*Wf7e(&U-t5aW_H&Tn)6A;ujwR8815w~h1EL@mvD`be*YJr}l(Gm>!x2FhTqJd49N=mdFHFM)r%3M8PKh%B zUl>3!>c>EW?@O852rCiM8C-%GW>x-&Fj`-H30vQWFdA^G1MvD&>?c zAMQggh!5N&ogLy|JPZE)PVvc=)UcJT2)p_mq|njzFd;aul~)YR6RuWZ6dH~ue^D62 zu7kRACHI7_Jv0mxQNyT<*+6iE^RM!0P2kE~+o=s$oCRsYr~(FO9kDI$c-RUVg@Yu% z#Ytr09RFRy#iVDl6(xt+mJ<+8qaxThW14Fkm(R0=3?Rd|s9qcGYicaGM`Ng4o0^{S zr5=eBhxdB06B`VhNv-Vsv{TF6!{FO!nLZ6cM`*r^u>>`-!CUd|;XhLRbb7^Lnl<)6 z7D=GO3l$-DU&RQ*E91nLD*rO6DqR&0O9@Lg-*^+6lIZj>*vW{Y!(w80j}V4MYn6Nq9eHR(mzgxZ($HPmr*T034KkqxUStD85m*-zt!vi#`Kt5 zMKxkuGCn*op5}-@br)CR*i8FqxZO6){)?#4K#D^Z?F!1&U&&-Z6 zQ{fYn+D-_y;5033kF9I*g&Ma|v%p3fkOBjNoB#wmz;KU7$S;8O_tAPXHdwl_5m~Yy zTImDeRL?~tXxC5N_&HaBgaR&DeWw$m4ibx}*+7KgcRpvmv1%+ez?=hRLCx@`vS})x z#7ldYv_vd{?s{y^U>W0+y3&AHdc!z49c6cYSkcc<)yA9akRFL%ux9aty6a+dWy+sJ z7tO9j<+sHGI#e}*07lpa)?)oeqI6$X7w(daf&>Jf|A?N_SIbW3Vr(@Z=yL!)tI1Tk z{sTaE`=u8i$w}fDkD?Ksz!5g=y_5~q0qQA`TY+@+n+N^r7s*U}qYuiezPwX{n+(b* zhP4bIl=Wutw%VBmR$>83qk2se5ctdq;DgYW_0JI%XSIg#^)o4KbAnWJmg1iYSyJ4O zKv-_DVTm4uD@5=-2I3(0IbrZ_nBI<_PvE^M=K^%5s9H$vSSd`7#3Dj_f0;#TrT)`X zHh|-IrkVvgtk&MK=N2bS-!dsCPaJ7(4{bBW&iVsn0G1a$AyBV53PXR}HW#o=Lz~Z;h z#$p2V35YcD-WwibQ^!cSQ8cETGHenOYVCU?dj4qL6MJrKX!Xnb!eBn# z&z$|VseIQ|EgvMo18;d%6MDlXC;hpQ|Y2Wj8~jn%L(#=Sd5g_3Wpgk3bilNRo4L*HK8dNEXQeZm5`s(r_X9Q z=%Xq!0?v(Htm5U0)hi_&fMm~+Bd zLo3%!YXk9MiP_W$sH*2>(B=?^j@&0Y`vJ=L7d5`wGz9DFD7OQgzbYR!gS{f@Vqa+) z$e~R~7J$W~>%k%y^5fnNE36eGVv9?&eLG=7H>@=MVWvi5&x61@Q{oF#Q*>m?p3G56 z>?iU@gbo83BDL^rz@%+cK5qa%A`(a|sOTs#I7Hwm&alYxlkYJ#PA+4mjHDF_j=H6mM-yW3r9RfL-wRxPa?KjBs@ zt(3g5a5!G$_blRh+)Q8Ovy2WOS8jsRk*7Jf9k-}0@8xqGe}t$=5YkkO&ntlJbc)!@ z7sZnfQ+r_Ju2xs>n7LN8MiqSW?I1stSMsE3kJy+G7g}gm%R?D!+!co^6Q350)xU!@ z2||;(6;-Q6rWi6V*(D~5r&hMtYvwB1R#CgW*w&M;W{3;2Hy-+_3bB?t^H0=}XbvN3 z521qG!pnKw^amfHt%$9uKk{M3bLT@5IcBWoHUiQi@jsG@fbpGK__tddAwp+i7{i4` zpvj52VK4T@bJJFF!UCRa=0o_BUH`B>AhbnCTB@>;f`E#Ey+_D(Q*j3VaKuFeQiw)0 zK#XU{@8n66S|cgzRTIJ~Hzzb@0gH*{U^-2Dmnt6V`L#C~zx~7jxFfuoE`P9Au*u<2 z-DCO!K6}!LCjKWI(Pm^`!%g60*Avkh&++9WA^;P3CY|IbDfIaJ2=v>%RI3*gzGkRd zVFD+}sJnfyB{Xs%3Wc(4p|t1pr$&$6)ozctu}Kq@=D^O}*~&^#nlKW*XW+JmV$Tm@ zxjn5r>+&1|JxV3QP|~-sv*f=OhZ&~n3R5I!599L--W0-{$g_>2xD;n(2^F8;*8IC$ zdpsSund-=VOf2$N?7t^2XWOQ?A>1;?L3LP`ef1m)XUwL(!>rIX^X~|EyX?P*RDq5> z5kcYm#e+hB2Z{ns%LD|vBfMT<^GL{}p);~+LwUtCVwuF|+5Cf44H2~D3Kzf}w|e;k zd0N!Sbz=rsUThhZRWhq4u^J-LB}C7GC+hpUR;=`}so_-zq_0pYCtSX_p$5SXsNA0Y zdP5EaU}LpIZH%pxU8eq>h2*yEST`{4RS=yya4FTROR`(Hm(m0ZRqrG!1i0>V0bwv z(&VNUE;B_`jKPr6IyfCRlqKasOB_6)#W6{Wi+|z+>?jH}4;&%G;Et=M$rtgUL`5^0 zueJABd(A+p+XiP~$A{sT2vO|9hAp9cAU;vLKpst`u{s}ETP3>%D8pHDE%}kMF{p|e zQxay&?yO^8unSuj8Vso(L1vnfa zvNXs!Tp7Cyp5M^;CB~+Ovathm7~KWV%mWv-zBDh&q%XXJBQ9=l_hA2a<`Nw;6i9ah zcX2teFb5l-E8hk;Vw@XFRA-XEOG z32_zyn||`Rxnk1*{i4`;1#rcz27oAHGq#`={fGk$+AGCYi?=ygsjK(EA~^8EEfRl* z5mh-{(|(((z&G4l=8tQE(8Ukj1_pu?hPBYTFoKSS5|#Mew4!n~qU~qlRR*)rpKGM6 zlC2ARY}K(uL@mRI5#$O?Od$#fEJF9^8uA}gHo}W9BdP;8L%&OfWaVjw^@JL*j#z

_x25=D#A(%hW7H)aw7*;7I|qB$S#>OO6tGO|Ah z<|@~a^LiZ>)G7$0C%$C16VIbAT6RHhAtC4wE5WP{bIq9~dTB7+#h0^)^zwiMd#gvw zE$g)a#syZu*CO^I`ActN^-04L?sWa2v)`mukKXK(Rngh&&9a31qAm-T&&M$50|7GE z0BpniG+zcUPp#0_C=6A)Q8?WH1kMrgb&v1SPkBn&WTWmb35qoPppt|W$ECGY0B@wWZ_>F)eghpQhx4| zGL9HB*96T>hC=XD3qq~1WqNcow}3I&kjg_vld?dpNPsHocsxkwiye#K;?$?89MpVl zwPlk)c#>?JLl5sInZl~eXyrEa+D`y?4aCprM8X|Q2eMSEI9u(y$HJJ&ZEW#KHsOUO z<$EQ;`oXSj$B=2UeJhgoDRcCiCrxY~2(E=E1cGM06iEqETV^s<$uV{jY?&@!NCacV;21q@^#`H&LQ zC;pm)R^E#lJtL(fQn}>D*0U43am|}j-tD~Ca`P9n&bGWw@kl#jFu;w3OmZR|X%X|T zrA1NHEHNHC@~I=VF;x*kb9;*$J~;4dUsqfA+%GmOB5Y~z7~Tj$N{#kz1%Az+eVr=o zgTKeqOp``t0o=fCSse@6H&C$CCx>r$AeZSlRJ1LT+%Mv;wp(TsGshBGKWTHRRQ>hf zuCig*w8`DH@Gsuc(UyP{w(beV;N{;^qQZ5Q%uWoEBO4;yUWW6yL%1APE&9PY3Ijm^ zpro!s>`15cA#C}}L~qQv2kW9*Bhoiwt!lEE2(S}$#8L$?vY@qO&gUXg9bd_6qzU6o z14TbJejfEe41-8f5?&fMo)5xQiRp3Cb{1j$< zQnmJ_*yw7Btrz2@^#~h8KR#zsp=X4hN^qzvVR#W;gyH8q81Z9;AM}WO>JlHjeM93; zBx{|o93!5ptc6BW)2}Bt+0q6x3c0R{QkYiKTv_ED<6K~f{e?or8ihRO4pI3Q7BQ@W z!zM+p;3@8!-9<@sdU!zHHKq%X_&6NHUcC;#w^3#JGx))I;2-x*O!%p3YnbDEME#Y)|# zs*0Q#p}-D>T});PkV{Aegt17@5NOHNBAUWr#fZwlr0O`KH{u8OfbfY7=7!$p2|@J` zSYYMQ!}aJozPKWf!bFwa z?u^5bA&WX04#a0GaRvSoOR#15BY|%VaO2sO%8PS#lGO38OBP4%iUv+l%3C zeGZFA{|HI6Bk+-~VbMMxUfcdC{fI@8fQ>|72;AWvjmqQxqFVd1T6%8ogBTa#P}x)d z0su`eDs2eE0p%+S6Z&9{+c78b!C{RcqOBO_RTK@^?--axT(*&DKu8g5HLE{RcupGe zO7b16L@Qz82RvEv25NK59IZ){RRm=;g(tKr`@=ci1&}`}YoJWO z_h;^q6I)>|c1;R;-cLShsP~*ni<6xmH)OjoZm;T{70zsz8b1U>jk_`dsRX@dM6qRI zy_R70hK(T=5M!>GO^r(vV!;8AS`I6z3KR#q3ZH5$4nsMmKB4vyyYZ=Y-z>jt;H6S- zg7B7W)k*|W(E5Aqxr=zrGltpa0%)Pa;RDf8tX@GPUUy{x^4LJQ*baUc%YbT)Tv{8I z^;}6poI2tMr;e=Baw)!r*2C2JuM0Kiar4K6eD27>UOIg);AT2I3E{mm9rkZqOg_XI zXIbEvX{)YqM>TW*5o}Os8VygB(tfhjajZBxCsst5#21baW7MKERv`YmQG zrPJq*>KvRqh~UAwGdVnQxZ-1f_^9~c%Z_`enO!)KzeTk*m_9oWFUqsXuoTuuZT-gB z@1~TMAWJ`)-^9KZMf@zJQQLh@gs(epvYKAn$vxGy1BPUaRy|lW+fHzJTO(Ig#8A0} zn#;m7Ha|fFtm5Bol$5CF-gq84tp2M~v=mr7ak;e-NlhQ7ZwiPb7@@K?!xI`wO_$7X zG7A+D?T(u!H0AnwJ!{Ywtk@;xw6KafhwpRvvv1IvlOoD3>tVWW1 z0%qZXJ)f9%jHNFn6JTo#NB5}cI{8t&t|4|TF3%};!c$1w>eZ=Fl*b{M9Cpx(wCH%o z$}~z8*j7w1KV^_K1nk4neO6lYYZLxcDCOMdr93;{U=GyU@yK`MTaG93fk*hMcPqSb zqHvQt&-EMGM>4_EH6X7YTp9iV;+UzA>F|>gN92uBaHLHCQ_*x%mQrV1Zni6vu#+;@ zN4ed~NxRVb1C~;|I3z8cz+_9k%L5r(0FIrv{Pb*vPHLI)>MPht2bHR-A}B!u_D@4PnEW^@EH!Tk@;LTqe2RE?aE#)^DYVHaZPI~ z{d5?>}Qoy)hcIwcoa3k5>?gZSEUw9N$)_^EAMpgQhWXaOvcZ<&nz-P6!L`ie6B z)mz$TkEHDiG8r^}4{VoYXk{_8X*y#}vv5QKV#sCyppdu*)t4;e(JB)P>#NZsj2_Ek z`2gE4!96&|HG*kjS9N!I#faU^SESFo!edMS6>nP3H4d);7(f85^l`OOacUGSte)Cm z(JWoj%R*Dr!o5xwEM|IrO2IWbI?Bb6mY~j!6Le5NXpI?&Wh7%bjRHVmz)!xs*EEzd zjBk^42tx}o9b^4#8$m|bu_uCy63%j}aJ#wSR@OK%J%VQEX{wdQIi(JjKF9LoKpXjI zg`IIJKO}Q)Zw;jLeaD;wpiE-8FpJ+#Dv&DChfQXR251x+!OBOJH;v`NnsIar-$yzu z48LiN+ekuA?P|mXg z;M+^t0@|w1i};gBk{AhS-WTdaCtF`d0Si~A&vRSTacXK2?1~=)B@^97H`xMR_?YgT%3L6YUs&h) zup_Tv4PNsV@h-PvBUV6J#aq68NW;Q&Ox=oHM~P31ny3mblre`bvt|`fEejzy%QZuL z$)6YWi1>>LXrRpyl$sImmgSmS73!u^&WS3yn~Xsg5ztTDqHT^WhBT%j$^;`!u&eLD zE?EI-i5J7xo%Q%nOX}&Ni3{f{=$+OtdT_G(^qyw+=~wNyA{TdwAyxmZ=ZTT&e zdkybM)D!Mp*h!bP?v82F{G-6b(j)MVg=r54Q%b@HanIq$1Hl3cARkF(g^iv>tNgKH zeU3EYrDxX=x6iIozV~qhRq^vtp(k&gi35s zINc8UY^?>#md_M#1-7NdrfajeSd{S=j>_eYZ*HQ6%~@hxbt!j$f^h5_cMlX;@|E;L z-95B%*_Z4|6cPcT#3~wH)|D?(z<%7mp+zta3}FV!AKfFu8bVc7_Twaud4#%HHSgm7yrtrPgl%oo&;#+o5uO)OzL$Ecai^9`t0}`UHUJ5Wd(jHPh6@84u8>O6 zkYA&aTd4A#2}j1&a5;j>AMf{XX1Z{-qS9^s?5Zg?SweOImlGLq7^)TPf$)J)f{QeVT~qnl4uMOE)D~$^ zoQ#<)mA27bkzh6+uq9??0R?}yopswQXB08u7KwB8F#|jhMLPl7gTy40e#9nKNhzhvc zZKmtfq-1|i47GwnH}J|tX9w+R3oZAvUsp>m;rjAKSIytNipp-O8f;_XuVCz;@|tbh zL-fa9oZ1!FfCnJdy21#P$l$fWgt9)2TM*7~x)=r&gV;m5$pY!x@fh z6|#)H#n4$)xzw;{c7l5oeh^0u*BZEbj`8}sAsmq47_E#64krHeI5W3V5yF%2&KhnZ!dICy%;hF)TN8{*n zf{T>h`9ic*a`n)_fryUnrj0a>v+yfm>&B%n4i-OWNk-f_EEKaGQ9j++tX-tRjKz&+ zmD(9D%UA_qjS+Vof);ybpY-$4qn2c`yDpPd0*+ZY2656^tG(RT2jWhlZZ52+o>0>6 z5G0x_T2~9p( z4){ptlkad0xgSGeq}=EJB1(olF)u;Gp(+=GyiK4g)Ov}bAfffsndYJG7311qu2LN= zF^*DRXQgu>yinDCmhkx~-Ju3u7cTWLyRu^=AP4im^ST%hnh)p^nZB*xn=vjzv0@MG zRcn)bJ{ctZ;0Z!IT-K2^_Eg4Y#MG{G{2gmE!Latc-@g@aY`SI51yJ&yB$de7Br165BirC>i4I(fk&YX-XynlwS(b}qWui( zMoJKGMGk3EZ>cr%e>^+}s4~ndkbs!lj(Egko-tNTYf2-9&5(4p7Q5WYGC|nVgTpyp z-1gD5`6aEG_!AV8FrqiLi*g(U%!|?ltMR}eI?0MATyF$!$NDnZ!9T_j~;8=S1*YmHxqe1^A}(3vcWU zrG223cHjEgaeZC*_01Jbs|LpSF~7g`Fpt2s!Cm(R9GCed-)uT7{?=ON2tK6DvO$j$ zgV8Jkc}>LTRLbH}7~b1jtmD53;@j3Ng6?($oMK7{ft z{ZHX&m(?feVgG_wbHurHW~(uB9lvI5N`t5VjmxLX+EFPAciPxD~F<7$ehxK&uM$U)wPbG;?jYO%c@H#*B*Y9PHJXv&>-6% zS}C>S%uoxPrFQ=XisA?1s+QIyb*wZlye}U_Aw4*?mb~)x{wUJJE8xxwbZbjgP21(? zafaO?&@)$SJHb{e3#Ixc9_P7j*5uqRHrbpbe7Z2$(%XNm(e$4u zj+Rk!sDr0bWY}enLHl#6bDk%Rz12^VBuY?0YZtVc3lFUzpq8aYLi8$B(R;WHaC=Ku zVizH+=2S}?W)IY-y|%d5Rg-?u+UiBoTWqZ0IOJcTCxtx}d}Yny`1Xx%+NfmZw7~1& z+(8t^Mg*IJPo0W0<->4mTD|=iTYa&{;kCvN~0OX4tuj-K6K=&y>%UEabrw@EcV4<_Xt#ubbJvG z(SRQOI%GQIv7Q9)%v{(nrrt~Iu;9f7ahSg4C(Ooyd=7ZfD_;VL-tV|TdH6c|0u+{k ztv}=2Z`sH`f4i38&d7$l%q%tvMuwHcSS@n!K=bPR zWvMjY&^}A`o!~CZDRY`u2ar^MiZnr!z4>wp#m-U(IEt56){K+E97Qox$1M=mRlsot zo(vo8X8xt|S@5GQtlFyWR^nkqjw)y80};-Gb}D>72IqdE18J^Cf^V^roYEh1946Vv zDw*Ccf%#;=dH)i}H1e!P3XqgnWSqiEaQ7BoXA#9@gvCW`%pCq?* zN;``I^eAB6%zGXcDnkn<{m~YlzCRMDH=$kL*-aQN-ylN;3wtht-}^JcqyJYj#gDPIeik4WQRZbM>&I* zo`jgEERR&JfEh+=GKw$2EhFuJB)Vyuv|8|Vo&$)Z*_af$EzIKfP~33yj+LTxvsoiQ z=+oSLBW0NgC}=n}It*3LO{|X)?M$sF|FEPnY=f8eflMpn86KEI(5w3zYh)ylx_YmJ z8A(bXVaP-RPo}qqbH)ZRdRRqbuA+WHL~t+UU0=MGQ7Rnnu9z%XC-|v(-Xu`veuEb> zz!HE3#2|DgR9jA7IXI;O!|`MdErP*RlVJ#gwP?{SW!XCdz&g9YkV8X}^tyNpi#%)%L#;(E%G=up zGvx;Jj1i@gWB<@s2JWHkKoTRjXDtPNs$VMl2q0N=&hahGBdx-Wn^)MrGV)!!hLL+J zq`k@KAW^?t4sF_|N{h2QwgAa?>1Iv_bq%o;y4YjE3fMMg8P3ZEV*B$Pk?w6`&#I#8 z%P{8dhLy#_Vw-~%xI|}B4QD5Y1)br>lA7f<{m7+4*$kg_SX`tKF;vv(p3}Q=97-EV zEf~n1(+@TmV`^*pbgqNK1?LD#na4iJyjT(HS*@{e6lpREA~+zT5=ZXE;3hyvbB8@# z6Z^GIp>GRn?pVs~mL!~$$vE`nOgik@g0XA3^$an>r3_;l%9GnD=?mVTHv!=9krW;k z3i?L;PM6yn&eGu*5sEBrBH}P5@x7srIYN`#zk232k8Q~`%I~Ub)Z(6T5QF3(OgL@n zJ?d0|O-OyrRID5(PcktUS5MyYhErN=bdf9?3H!t<_WfPTx*_tx#DHsub+8g%7A(?K zobGh_V|!jxo;pN%8YKAL!Kh;SP)?4arIr*J7}7~o{+z|6Po{#Dpvz+xB294bwpONF2#1rbt7^DrEnXyMmxB^CtVsbBox8w zXuYiuLf*s6IenN%R$xRmdKR-R?Hk;%D$?S(8XfIHxGdt_F(T1m-cOYBHrt&8*+<@& zLe~8<^79djt+VvcW=LEdieE9QxeJ2fm$p+LFlZ&iO;m;A7E42wQvVaucPvg;@JFT- z5_;Yo>14elpTPPfpk-DKXYGnI^*!oHwv^TifI$A0m+)Pi~?~ zR>uu4&`8{s-N+zE4bM^R>Lk~CN_mj8TO;y~5buW$!4s-7m>(_yBK_xCQ3|Af=sXAQ za61xAIfpx4#0)q2onZYdV>6oJKa**KkyOiULfi5lRUfVrBSNzm=o4yEm>tU}X!vo- zSq9eE5mF!W1MC5hE5k%$^(JrBph^a9_E|QY)VS^UZRiqNFt9n43QN{Gpb zB8(H*z|->UGq4V*`@~2~l;QOPpb7+Xj$Ak#snR@CL+0HNyKXmP@KhWq|LlJckJ<;B z5tzdf`$Wth(`{mR2JCcxoSvr|9H)@1;I_ylFv!Q=S`hva*-ke_!~>cfK;9K(t&PCY zlyGO2B=?bMfHr9(5Yx}{du1?>X3oV30V>yMgZZ$u6v+nMSFewuBfwaY(0&BiSRopm#DEs&4_g>mkk?nD8tjAPgocH`w#9LOexWh4XJI2U9`&7 z_Uo+%{PSsklrTHg`94gS{yiup{gS@1y10&fBNyDnNdps{qE|KnA&XsXz}UQ67*GXK zD&HB8K%W`pnq&iTa@0&YsxkPW!3k+oMNH-v{Zv2Nmx3rbwl+6?d0vO`siu&gxTi<< z>3-dhuY1WZj^{Fhj?2<}aT7B?ETQASF;q9nEiTP7MKue@0(3sAjfSdPfGTCn^l6k( zA#)4XXoCZjJc!^G+ zDf%c;ZYFCtL1^?SBkd^rV>VR+g7r}^dIv#$$Qm26{{~QQ;3jQGeB-eJT@*HhKdm0VXnz%Gt* z7?frv!kBfrYX8&rS)K)J498M`)-68Cjj}7Y%VgfRa`{<2^<3~${C;ZQW{dJLwq#SE z&5WH`1J?0m`5sYsK0GVEcO4!p^DI2xAb4&o69uZ-a?d18IAP}kKw6=Fk4&nk55vZ7 zwTfCM<_h!b=^{|1)Mny_=3?Tmc>a{VCZvk9X-|90C~0uD`3b)?6OonDjl`U4Y38z& zR^>A(OYtx0FI<@ibDHY-5BEA52CxJsV^m@zmrTI5W2C+t=Sfj zPC*m14OG8y(MsR&G%TQKS*0pfggt?(TbRlXSk#G?1Clg_*mV#nBeivZ|0f)O#Nirl81UdOfi(b~TDa=1-~Y9M-6 z1hfpl(%|l zb!Y5^NY|;ON6+!WB1N=XTSDrJ3P@W86}6U&FkNhg)uS#pe6vPA8(v3=RbjEnU_c8E zm{wIr1f{Yv`0Rqa&2X~FYBuRH&97)}>|GD;Ox?vzi)0{rEc3x3ZI^ggXw^<}L^8xFZP$CTu@F`9FwsQgsTsnHPv?6g)6r|g-woYA7AWM{IB+D!1Z+F=1> z^tKr;>=)R+BeAH;VK%~tUZtuKLzKr?JT#y;aesH4QRDg%e^9(iMl3T367lfQzUVeK zzhp!knZiZ+Xt`5tccN{x#bqO3vsNBmvSa`1Rzhi6_H{KP(s+^MhQTF>2ma3c)B-!n z-N<9Z;6}EYaV-NnHi0R}*9GZ94DmN95ZFOvq1`!gqtHr4(!~k#i-LQCuYBJ%ZJlNX z*3py|$NC}|k^6I}sD*98SGZ1UH;t&3mRz=#yUE`o2VhY+L z!Uk%eIg)`uL+&wctTX|&AZLw(3_}Q%ZF3sMV0kNV)5 zO~Bncey?RWijO62iT#kPVJKnH)364o>fNbb?nD^E4 zmJe*jByZ9QZw1&Ia9W^dl|Or3hwgHm35vMD?7=?1DOag^)5OIinAJ{dn9irZXcU7q zq+S+BE&}0L@mXalhA<=BHl+qeJr=N6cKJ(x^nm?Gs_3~*8cY&`giM;$78Q|cu@?VH z6H?2oI6Q#nZR1FVGQty$X+f+84y*Q;CqJePfo=&{-eI9ks0e2|veKtT&-L-sK#(5Y zzn{AUC31W%RsqG6CE{F}gSK;dLoDg0!%9n!rw+#i!dQ+UJO>@%dvBf~2_9t`(8U2y zCqIU8Z?H)HJ$qB4wqBF%5hj)r8LuWOHB~mMkt-~%cnWPVlJSO)Eh71rY3Zlt4t&`a zYkUywP>M5Cc$~23vz={&xf(_Vup~ODG;tl4NjuaXMi5V#8%n^gI3Dg` zas!X2Wh{`??La5QevCD={JBjEdoU5ux^`^^l`LC#+a6@KQDo{Eqn|cH*hQHyf@d~) zwDkOPL1vqV{CadHk5xxTRPCWVu>hCyPS}Am}mZfdb2QvrWhzrM#iw1Qik)fdku5 zwzf*PiA{UW1aPEzEu1aeicC(YkOsZC^oNv$jONtS40dCG*rNy7mjVvH? zG4nOlz}aK71XFZE z^u}C1g72?*Vc)0{crbD$)a=reZMcwdb)GSj|D{K_4lTkej!d?AxV?++{*miy+cFzb zI>}uOBl?61W5-XU-UyrBB&td?`MM`T7o?>r$aDESY@4+f2WcOW2#;RAM4mLORz^&B zQEZ#o&8e{5;`Iv{gwyt-MmcXUT)w}8X+ct(MR#6)x&^vh7A{5yTaKCiac;sZ|oR$`^%Xgtg z^WpOLy=U`Bf5~WRLyBHZwXmffAXCpw5wG&6#dNeeG*=~x*q#VP&lxD}sl#d&eJ+XZC1!eoEYj-uWFWiO?m73R_-;`#-F91@?AKus=b!eiVal8u8CF0XgNZGMYT55 zw0qiEV7nn%lNFVsYjB>iWT<2ng6g5Iu4i#(#L;l`;LPlvDr@u4GCi*%3Hr}^1%@7fmtzE``SIYv6$X z0@~IMr~3D#7D2F>97?~5y1roEp;O04UO7kuCL*^k5B!MU;>B|dl;H>}Yne~eV0*7@ z3)Y~S%J|m!owZ|%5lGW&5+QKg13YfT-MY(5Aw7rVSO($xSN53@BH4* zwQ&4|>>XI5<0)y!2QUM!0Ktt8EpVa8V6KGf0A$N7m@Y|-8#rb#UIIs@k9qZKa}!$KI|FG z?aMENVlh}O^k^q5_=ltb$aGM9mV{9fneoICKakELdtZhF)9J;LPqv>6 z6G5P1RHWI`r-cVT#oHr}2)F&>5e9KbY%;9-p0%D-Y7aZKm5tI+3$=20$PY4oIA+Ht zS;%ct{jAL;9N}dAhW)gR&KK!YYh?8$)5)V1+V+y_=iW!c64_|W?FT61kA(w0G3F`W z^m$pnLn=?P0Lp|4=FGDvarDBC-8PcsiBEGaH5eCnhZ6{USRnSEY)!T<;b`vzlpZlZ z(CKunpe<5UKrIDDtroMNXgHB#<~h4Vt4%k(S4~OotTFHr<=CRV53mgmZez&PNH{{Q z9#F67nIVm8t0MNgI(SPV{5kOP3+Ehii7Y)1tP}fyZ_hj2&g4SfPgSQLX%5LSNLxGW zO`@jRNX(PW7SaidM-$ZJ+jbe(%qfG!yVc97@_fn`>APT7IKIomF4!XnD zDK;-5IJdP-?ruCh_A$%ovDMm!)1Fzds9)7e2C~SEM29Yl7)^5%=huDPwnC{~g8tQ}paA+;72A;v#q z(@z?fEbR>Al06UO@mL2qW`vSua!U`J2gDdHW1WpXmnq;%Cr!&y@aOG>bE*+(1%r)=tOCAj9Sy)pD2P16bFS`GlGS~m$ytIJU*lIJ=ak0F@5F*m~SzT_h*cT)s7)Nbb z-*32-+f0TPu|n*+Oz#x;V+hezbtgD5Q=F~!*IJ8dG^SFftEJCtowy|Otq2cvDgWL& zYEyC~8$kT|vL`XE1t5`lv*7vt$zEyYVpcAy_Bg&SwR*CaQbb#UVOCKHpfCTJ8Ya@X+y$=hE>?k8?h5%zUU|Ve|0d+86?adQ4 z4)HkoPi&D_w{nFmU|pX$utO5PuO6C=jit&aQeNI374=8%F-HElPU7DTnPJ*g?Vdo z0<#b6Q^7w`Zy02O^sRn+;1sf>Z=O@|j_g%v5iX^BdWwaIA|wtuEGvK|%~f*aB8Z`t z2Q2=~IK?V4R{)?}V{{=2C;0UyLyjPY#4yz2F|j30nytPdPe8xsq&$1iSOKUeIGJFqc9TK?)l^MH}mZeFwZS)q3fHo{ak(E|MV()169LK?v^{5)`vf@*r?)5S9*n(lT%wI?3uxF_86Xwqzi9tNKI6x5# z7gmf5&v*6SNp%3tF`Yx&Y-KWGAS6FnZiHq^$ifFOPZou8{u+XKqQSOsAG$%`JW5F( zt(A9G%pPwTpwfK$PUsO(;4QKqCa9CM6%ilyccO^0cu6!sh2=^)n{8&rpnrIO^#-yJ zEG%|qUxdx&^`Ofc)JUeoTZl{)s-6X_!i9%sv4G3Nfu72pZI7V^c2kQAXe6V{HD^u- zGZTK&r|^M-gFW9zxmO{_?&w^GK5d;XN=Fj@$=HCi?R*_zl6feI7p}r@@*Jd6oQEU& z9IFM1E`ZxyusX(R$e$FptmXL+iFNw=(p9SEG+r}TXz0ynj_Yzqg`vl{3t%I)uq?LY z!b6$@X*uxkfkv>#xl_3liDULZ;RO-mL^AoqG0$po*>3q-{?*6bjsj%lt}zT7;HY3*@%nGF1}hcj5w(^P|<}1Ak1YXz*VSjTJQ~p(W+s}fmTz9+E}4h z5R08Ag?;%573FBIo{TE>^nV&+_2l9io@mm;3rxeXkz>d$mTt)Y6ajFtORnHC3~Gy( z{;?%g;#3}RNVOK=3#Ld1_x{xZlwf=HGcE{$pC|&ZR67I^`>5o#?sWuuP*@O7I=~E@ zSln@}nXY{WIIllP5dP?cgLq7f*w2FdkE(j`rsnw*}TdX2$7dDQI(G+y|Q)~WUt>`|bGK4${@ds6TaRH)}c zhh06^Kqw5WZEGGi87_lJNh)lWI4>$~Dz8$S5omaJG0-V;8yJhwTopdLfc_KtIDh;K z@s97K#43u(Oj(DXP<{ksgY~ECxO;aFrekuMoHj{?%^SWmtJj*)JK8;LcKYWTwcsYJ zNYDzHlCGhaFF(agz94r;N`{2?@X`Qddg`k*XmPM@DHCj6xFYy5- z&boG69~l3~pA=5@E2~!5S1LX9M%YTUpEg$@!p_gL8m)NPRK)G&R$6FjdV7m!RZm2C zE^%h9SAz7P8n1&RL+Q%`j_U+BK?dBFv{0}W8lK}xQV}fJaB2I>cY4c<;MKpT-;GAU z>9E8yk5fMJfQLmu))5T!vU=L2%a;y368AVTfX6j^RR*^kEM^~=Gbtfl?$$S&9SsK` z0-g6RN40F0>Xc4)QF~MDV|28=fYc2)wVdMqW@^(5>`o*9)M3qF7o=ZoQJWIWX#pEp z+8q{s_K~cl_JpECrB0ZwRH7_~Xp5;Ue^kdvUY2B0TZHEpMqKPh{a5f#r%7gITni<8 zlSTJF!Nch&ZM6z`y_uY>PMN)ovu9nl4>rOPZ7MkjvfN?DL+`*>85^p=3d{>_ zqXnj7r_7C|(&ehHWr#IOk z(gi~bo91IiS(9RgN?1{|1!y$SbX@Hm*UZ#>9!tyLQU_#U8ubuNC$5tt3bfsAxaq28 zQI1*{Yge&fdS#)gRjF*<5NA@(SzQuUHb`VDA{X1hO$j6Bm1{@D_q~>FP>bW3?a3~6 z^&M)F-oEmhBt@YglG#fk_<0sMv!$xOC@WQG>_Sn9(og4Zutz?kQ2xR1k?J8z39>1@ z4-_F)aXw%NYhb9cIu{D5MeZH13Z!r=u`w(hMy{U2BEBg|nh1tk#zy{X*5;gmq3C&B zs3Vhl?G6{Kx)J*f?B=@azi?XWitfX)g&s<+BsF3pb98;eys~^4$V;VoU7VeY-*{TG zt;mpHrP`0#CkQrseB-?#{d4gsWD6bnqw)jx@W%hMOr!0@vTey@Qkf2?>KVDQUlwPN zEM(VmwZebmIT#qL$$JyP)wu!&FS_VpK-@-nx=o4?)9r>XAE!#5bSgX8(d1`W-CC&K z4%F`H@r`ovrCNDmf@^DTZ?TN8h`dgjC{~*gS&S*9M~Ag=;Kjby-B()@A1qeesQC)x zKlG+{Vs!-R zswO+RPBy_e*P`~Iy7*DdL3-n0raw7WLEc5T!}+Pnd4>WosyzBM8GfV|;KAYGpoL$$ zAzOc_G9uWgHjT*D!lDB|PImD_4g0c1W8P~amc6k|zC|tw!%6^H< z4!@3I^y;rwv2c#k=PO#k3CuAWx|Nz?>zbRY1T8&22}qc9_~M1H%M>kf11Q4gU>%fk{cDPzL* zL<9*#$vpn%R~QOqV?6r!&^d>aH(QB#DZb%3f<=gUu;+tMqe9&0IA(QuRz0wDJhcWV z38n`qKpFbf(H7P3^#G0Zn;WSk#KdRJKsr+jbI|ElHnN8g~LnN4k4v z7Ed?JZwE=Oyw)BbC28N9UYD!OvSCCS>N7{YXP9gc>c~rqm7m_`r!?w zNt}gLS8Qkmg30;={$XKcmD1>gP;8R(C6`J!+wvQH(C3!TszTU0@~V*d#Ex#(>c;bT z9c{~O`nO3jC%SZHZ^o?5vCff0f45EBQ7eb}#5!9P6R&A2J~_-wcmcm3#|y3!<(Q?Z zq%}+cSl5dWpc#y!zW{K3#uzKc4a?C8_+Zz9Lq|iC7^OgnXE;zBT}z{p7x3FcDMxV6 ztVVpA+8ta_Aghs7E;1wcsGLdVPE`|*)#li7Ft}+Hx|%wbP7I9-Tr?C5W}1sUbhNnh z4X$|GFQ~66DE)yzU?9Bq6np|!LGr3aSp%bmDzZaFZp#!<7X7f>tdVHO4)Q3mcJl_k zN9*d^K_~}W%|+&Op@0-$00@^+_w1L=b6LS6rUAa9P`Qp4Xqgnt8HK}D6X`-%_O+&{ zD`$)K0&|B{A`eVjI%B^>?7Sc^HbUD1UMVgA8vWW35hJ0Rl#>A6lMq{07>0d8RW)At zu2%8cSi(FC1u>&>HRu%13-I9EV7atuX4-k{X#WhWD-6UDg092$DH z^NRSXNtcRygVQ#7qFh0 zw*N-KquxJ0F4Zz=($QfVi79qZ&=IPV{73rB@!Wl$!z1JQh5nw3QH|I$)09N}uFMgf z!yaeadwtpv)>;f1!q5R~RPJ4)}joqse;^TQ1MG{Z|> zgTkfQ%(>whW_2vivsDu{D7|GyFuE2doxpjUAX^dbI%}}~!TG9iF3MPnjh0-gUAXx9 zNv#iNgHmup{!V@T8b8e47^xM91T@5vLmGJlgZl&+zD5-Eq7on2HPZN{^5_%LX-Hm~ zJ>!6NzMcp4T*@){Apg!{O;u9OktCPoS4TY+Cm4XuJi|Y!2}XTD;{%4NtaUerAD;vj zb1x$c-sb*7X!X5lqXVN7WJ~dM@tnhj6mAQV`{@X|u_c`fz|(huEh26K0lIY?nMXIl zD0eZM7q}f^?ysX>ymGpSbyAszS%EGA*b=~8ONUhh{`3Z@XdhXpCJ?6_|LmI~%D!zFwGPE7lRmk0e#Z9zLIn+*?t+NrTht;$0UP_< zq@l%=g>6>7-Z)T>X}^gHupPej5VBFg&E7#FErKc_cnPY$z&sJW==}5nZ&1pm-IVR| zyUgZ#s@A{La+4nbBQ@rIzkL*t()`$P*~?xHC8TwY41x7XVN$+W%5yXqX<}c(4|zyJ z(Gi_S9VYdbh<|!cu^73}LwXKUO*k+|CGLm)Yt`$oOU(oaUbrKpYa{5jI4`r>nn5W$ zDK+pG5T?RcYdg#u(kQvjERFfIBT&H|cr}?GnD%tzwYSYBHcuQdfISUOyB*xO!+b_s zM`Z{x*%YK8$Y^PPZMoh+TwTM)EHR7AJ0*+d?TeHul`;sXOE^H}18S&X5e-_mE`I7J zSa80sTf^^xYG_j9wdgVo$IT{>saH^d)+Q8xvA_nPg(yQ!E+TTp!nP!|Z-wB3)fn1h zCQEwQe~aI@HX{YkxvtR+9x@8TN4l~hMep0?ob^fHPbV+b>DxOd)EeD~KG*8q^U)$$<(#Au}lm(Sc=Fg1bCwjRcV$b;r8sn)%ll2@=@Dq|Yr}3?H z4Gb>UXy*xO94wghYl}v}q-N<}AKdEM4OF?iQFvSSs1e5g6#7@EuOo=b4M<@QyL+~V zI5*I+F-+d|)DvdpJ^*74It8IqxP?K)N`bl4GG6IWKWYv*($pM=)ND{Z4xxE^QD8## zogX$O;?c(=#eT8M5`FE9_04jIQ{QR_hL>FUQz)>^n`_&bs~x$YCMGk8 zFxQn+jX5lokCYfmY}!v(b=&1Ob2R6q#nePH0JX)T6sPYxKx(RhCQ)d zngDZUgTw#0Z+P&-3~gGcot8dluW(DTx+b#rWA)p;*7Yzr;?`k_m5?vjC^BWxMD^2f z+hXo=ac*I>ue=4?8cqkAJLGtT%#w=*85YmQ^l_i#7oTQCB4gIwt{%60BFwvb_pO6& zevZ|c=OMtT19#5z2Yuy-ntj(%UuQPXuTdv^4)ymJk9yZUdf|5oJ!b${JIb;1aZOz9iSVRt|t0ZYR6czMq&W ze!)~30*Wp~Gh6kTqz1QFZxU%*@iLWlqHW$n!E#0J_vWTw|o3eCEPls9>%B1*w zkkZlwJy=NQx(f6+ko1*%3nf;S=_dSh9ICx^>tjaD6aboe05N~u-v@o$0%_?#?(bcj z20A)p_lz|%X!ulnz3tcO>c(9$(xYXeO=>tR@yQO@R$M4J!DV6$i$p~K^AQZnI2@k$ zvL6#Zwbco|V7Xo`1&%&d_Za9x_u%BGM{?rPR<=-0d+)jOrzWPL;xJS3@e>~t{bP2# zmQd|zGQgw*T@O$L`6AMF{Z%a}6bfxIVbIjSoa(aVlv<<7r@#gqU5iJ73!Oe4SGAsk z$3f8jBIBO`R9mpF2gNVGHsmJ-wYh&my~|8Z{6X8tqv=z~-tu{VSo}T)(`wQy+I3Tf zPgPkAXtAu)t7oJ8sCtC~%W5GSR{D^di+8#%4HAiuesjbgeGg-cF1aDXfxuq$(D%) z$-<6+2Mcx(8i;B82|1oR55^KH#`vP1EThZT<+~<)xnn$D*HCy;7OX;$>hJ|9^ zguXn=;0;oHj1sN>f`D&5rDFvNyH_5}AJ*7eEcJ{AnBF=r{&6s0#KquOYE+SZ5mv%c7+76Or}kS@=ZR%36)Gu4+P`am>>1raK#!JGMVY4PUU3Rc1`% z982GGq$X4D$cZRoyO78t>^co~`kO@Gi%WsqOkjq~wHub!kkXBg#Rn_G40$xMU`3Ip zBbr6T`wBOJ!hCQpP>1U*f%buIkl-66HI$(t<0u+b#;&!VG>EXcjMf^Hcu{Cbi zEPF(VA?x1Q(`P2Ba^)sTJHrq`*+C!-h#xHFI9Shq~JZje@58zbxX&Qu}GPi z-YRe$l?2Sf-QW*-v1}GtfP!eq00-ONar=qsP#jyo#^lwn9Rne}y85_Mu+S0n<9K7B zA`n&uIk;!ThFrvc7GT#r26!QpB|2!#F4I-PE(JwM8*_JymDzim`BmnT63ZwPfYca? zbIQ&*(AA2lMLF%<-XF@?j+00PT85HqvFsao27t6YVd`4okFX;Cq7_E+eQyFtc5Xmt zwd66F26Eids!Yf8R#;@@?3qG6V{mJm4Wil`wF= z!X#m$9+pP+-q{4wYABr-d(ykL_$ii=4Myj&EtXPg>`Ui@c4?-rECTE7Q+0xaizF@n z+31iPe~DEv=pr`mZm$iA`N)g6X;lttlur*IoPv|J0F3L3k|z(tNkg3EGWgzMq1f5Q zhL{Iv&z(Hup|d$fK;#_d*0t+5US(VW+2F*TgHC=2IZ!!YCr|ApW%9(P0U6id$(y-e z&s{8qKs0V%VEp9m$m|na>2tLv2&(49789wKNDiW5&6GXcIP}aOKswY8|3qTo)$(c9 zwc_5%d%VWzK=_LY8vE|XI$(6U4ItHW(WDzb?R@%C`n{he7RNcK(-N<~uR z){mu2aw75eOMj|9%`cI%t0_M1mEW+RsOa*sh>4l-$T6kJggx}@^D7MI%7dN^dSNID ztmIoBF=uCZamf&DVm6o0XcF;m%8pLrf<2CnTlkZL2&+|VNU@@9Y+Is8W9;BF{K&Sm z+G3p$bDvKH0`_w`enoUrJR~AClFeUHCJ!r@TYG1~TJtq7#LK1HhHvtEj+6X{Z~E6s z??;Ky?*h<&Y1!x1nstP5zAs`n(T;85&E;FzAt1Q|hm7ECHaIunBPU(&ashQmQ<}}g zTAadMoObIf7qOUG)hJ;={1!$%U2i9DY}RHTz8nKy*QW_V-5)7ea3J?9bsr$e}_o$@CE&P13Z>B1JwJ)`Id@;Zysp zK-~tQ8R(n+k81joAltNy-~Tj_s4D-Es;=UlhU(aZsOevm*xFgnlg! zU}lF;iXRaJbJ_L?5$HxHtP5#u3tKaNXd?;m~JrH(*G%Tu%`g;8Yi$WtYbiF$- zon@5!Rh?*-em?jexI$!)6vix%xZ(`XsXlDyTQ+5IKiXXb{bCg1uurESCs|;PJ4DuP z2O(H+dh1RDa0+uX*WH^OV z@PI+~R3YWU97@V=pB@eSBkv|zT2B6C10Gn<>jSQ7A4bL+r+m;HIDt(`j}cC3E}gJF2>z^42j9PZnJpvPmf<%BXHuGwss*K$zW?meQ}3{ z1Y_ctU1dxqeXgdbTVb#Hz3CYvVe1uFS7Rw95&#Rm!0K`!mJ8|Kr6#)_q41SiRIsHq zPpKwAr+tSQ^&Dt)RMOokvTg~d=?9dUIi$@43m>GmXFFES>!D?57@YgeO;YZ?Ahz+x zLNQNfAK<;nDJ?yRCFokSd;{;oix*v1EL)GA8CLHg>vvKsw#eV{XYQJKG0GQ);x$X* z5GmM&sgDHXKZ=a*x(8mU4hFGrqHYaj#Q|1K74Z{^A#3=iIhKUW({(FjqiJ!7EE9U6 zc8ZnAk>%mRv9`@u*V86i@d{pbJC`t#TLm-V8?Dyh8|)R}hs*Zj#`l~4BT38w`6})X z(w-=mBO>Mm-G>}a?Ilf*z)k;wo?c0(D=giRWBR4jXMwOhDZN&ok#ocA&ILb>CCB;u zPk~S4T$&$qI#zjamz;>yw7T9vhW;fvs?kS?ji-;P=Gg7xRAS03G~~w)m>X#21TKf{ zwjHp^+Wko6fan;)KG?dvBjUBg#mkQ^Xvry@cwmf4bq;Hab#{V+5&}Q zt7pcSl__qC<34rnu!>*ZIJHEYc-uXVa?poP`>3w5x>RuL(;M<=c(G*Wn_@5hC)bsb z3)Sp*q;Fv^s~G)ghG+>Si^v3AJp-y9ZRlhvB*lT3IVquFx_JQCB8ycZ(JN>wH2)-Q zPY^1e8~1?3F;)C5Q>P~t#eF&`lY7m9X3TwH!TXN)6rf0+TntWC%nLxM#f2K8nz|Jq z8YS;VBDc>FdU@_BGlEP?7y7~xl*Y*=2yGJUy{8FB&6PVWZ1#QlLoIzcupsnp&}L-e zDI~@0CtMa9wZ2khHSez6MTTJgF-=tmL%9(AlkXrmB$|Tr`c^?GP6@dx0U{bmOGkNU z&{*dEEdk1`%;E=)+F>pCopv{beT)!7{8Q!s$`#>$MS=$b_^G9s-?+<3>vqniuA#V z1#$$b74#^@rx@G>u>~w;Gr5alxeuf#w?KQjZ#xr&`)#yQREq5w%o-X`!m_(e3(PV1wctBkp|3uQ0C5H)S9nUkK$9E9R->Nys~1 zagLtxKnOs^k)HnoUnQ^8Y99}2i73#poP3Jc4UF{vS!S}zrqGh1F*qeeyA zz2Em$TBw!PPt5=~FWx2PVw8-V>l!0-zS^E_b6~CP8&DsY!8Zj!#7DFrZN>q6ed|5Gc2M$C!HN(UXB0;{6h)wqMJBBp$5-`H?r782G_rfLd5jwHi||Q664U{sdY$LGL_rFBonHwZ@m- zp34veC$(+DlD>~}JGf&@4r?a#xnaOfaMYwVxpFp7F<|D_czM_#wNGRT9?$>ES!y#% z9<(SNTIi^uTy($BUDZyho^>t~8^O@4e7ju3Yqncah*`urrKhcctHZ^fAAVT;XRd-$ z6|U1`vh$q0tqmJnaXX87dpIrdo-T;*OZ18Wl@SVA zkB}7+_M=5%NEf=;7WQzOT!UkL?!%Q=x`77w4i#67jkY*eBY27g%Jfn-ZNFQ|_RS&` zA1)eg-vzbJMZxRA6R?$wx);1B#by!GMT3gzZ`^fOA z?*EVh19~mFLa;m2&ayPzD}?+wYEQZF;D)bx#ZkoU%Ot%v7KF8r^`AW=LPIXtrH&;zm*x|FFax>Jz_3NeaAE_USXVb2*IJyDzK7bxO-52PVmtMz1?gB0zsF5>(h4Bc6V_h^)2Ro50GlGy7O?pg@t8@C){a& zw1Bda?=@xH#qzZljQ3*PCFy)w{6fkC5b$Rix~cz>8|9VmM6(gdAG5`=>aV#s6yJAPVf zp?|~lk3OzWKzc3UAp0_+#u19z_M=?LccD7^tadmf)Gt)c!>havq{CY3No8Y!0}2== zJpfz9zQ0}59ruWDR@e1hK$0Zk+`^s+0ry|qp5F{9x$?!up5o!ccKNh@PFq7uvSt0r z5x~xf%=H*tFDxqE3#%;qsA#CnaO}>Dg*IJ*G(kE;^E*P>wzV*$q8{sMCDGI$> z@jwusHIP0vy_?PvO5*9kVRu;&XmNpZBEycVgdwlEE&ckd!5Pd$B%>IrQ4lUVMbE)1 zYtw3$RoSu0YbQw2T`U{2!Wq=ET#$FFp=xjKoFe@jd(7Iq&We+RGC7()842)iM5D;* zlh_uOrF?Ucej3!BEFa!ng--g=-fFQA_F!P`U+}5(+Z^@XV2lO*r~HZrmB+!$nhk^* z+$RlfJx7PYy;TA#Qbj7Ny*N6w&fe`(AdILaz=f2BiUj!p3{SM7F(CaJz7-N`5Z|*3 z+1Az#L~RkRcGJaRJq>9rsH>4GgZ&aRpaxpo3vsR|szl&fV|!!c*d`N!F3N?$QnTVs zi-@#=?ZmWd6D(_2@C*av0{x!5#EQ{jdm-RMNn9>$rx1THE~%IEqeS6s2ylp68R5W7 zA2I9sEsjOWcfUT6b2$9*!CzU4hR9(B(n}dqi?Fav3d5Tl0uBBXuU3EsqqI z!At`I3>Xrdj9%CCWIe1UIhh>Vg0a80rET8uTsnaDGNR@jm{d;zjJxWan*ui8?K|t< zpHG`Tee`J(H24mGEeqC9A;td~g&YiTwYsOT=3 zSS3#arZDIgw8bxAUb~@8BEA}$M5ujT!IBb=f=9B2nWs*v8&7-m!Xe*=$fT;U2eeS- z6UeuuLaK4K2^Vk>vxr9y)_ZR%MadK5hhG6z53tI|!UX+VY^a-M%5chpC?tM@s;*4% zMiL>Dc+%by6nb2}{xDY4R#AaAbM;1s{vs}CHBUyk6DX~OF_eU>YKuc|Q95Hr(G(q} z$id&0^aE>Us!a)eeHxU`(TWf(;M`|)BJUexFz=i z#=S|jmUTQ=D|!ADravbFL7c1RRpY%GksbVj!?PZ+?s5|dm?jQIReZIW@>9?%d%>S4 zBaHkj0p7dUShUvcd+LtJ_!Krf;^yP3*|C&Rg+b}i0i0@J4sV*vN};&*u$xLp55I6? z32~yL4|Tj_=(xk)0#h70{1GDCzwS5yMp@wyi`~vwi;p-iq{0w*5j}XVib(vurs#tp zuZ1qBy4*XTz-iZ}r3PiaeX^L>P#31Zj1?B_N%S8S^l?iOBQ=CzIoveYi>Y2> z?ZZf;|LV{(uF8o+KACZiT0#5aZJuSSNQ~8HamA^kq42BH!56UQJgh9TE|q~zX!1+x zX$zP_9F{LEHSF#M6t;4oWrQbq^V2fqipdOtz6)zd22Wp@4%dhwpaq>4m^=2ETn-Hb zbUIJ)0PFDKcFNuM`CZD8sAGXAfMmJ6q#wltEq$3B7sOnE-Y>2L)<1eZaKHTV#~*+E z@y8#3{PD*hfBf;sAAkJu#~*+E@y8#3{PD*hfBf;sAAkHK|LFfq-2MO6;%EQm{O7B0 z|89Nz&%XNhH}Ajr;mhy7`2L44|LTk1eEGwdU;NeAKYXel_f-G-SHHUdS%2~8i$B-; z)4%xjumAMVe^!51zy8&q{`%Lysz3YLs$c)v`qQ7?{v?|G{%+*&Zf}3~*I)kK`@j40 z!@oLp?$Y~zqW?U^!2cKI$3No#o$&a1`E{SHl8N0h$9X!+jO@6H!IPw47z~*RP_zvCuf9Os;Ak-&Zo9HVs`K~Ldt~KHRf5HEE zaR}?y`osTUm86>l)F{LMOa4w&Uz|@=A}mk`cT?!(oAB}fWZ+TO;@tse!@2eaiwD?+ zB;@~boHMF&4V}wubJF&pI@>J)Bt_60&0)qpG|Axqcf;~#1N^^vRG$Br|GlQ$NrbUL z_?&^A;8DM=eKqS2`%mE(e=*y!UAj)HKNLwt{i`Ieb{YR)G5{a7cT$dyC81U=!W=X+ zyz~w*i>PjVLNoq8!j5X8{q|Ho$f`qAb;(Ct^E zNmT)8Z|wt5sF_@x|GzWhfYJC(qS}<*{~u(Mq8HpH6_n-%-K&Tp=IJm59oUJqCwBXXxdWJas zvPB{|Xd2j0$c1TZVul5V*7!zuSBd2H>pbmowgP4!shHmfiYA4R|2J~XG`50h35!5; z0ks5>wN@U+i&|`T;0w@48Ns|$Jf3K!sc2jQ(26XtG6g|>ug<#zTFv6NBwkF2!`NuL4FX zEgt+V`4|QKgqGT%!IzTMpSbP3P`E&?YvoC!$8>D4-1(4eFHY=c+EW-KR(h9;@Uw;& zMoNb^=;=`?-YPlKu|h#{3Ges#l(C{FWL5CgKPV1&Yl8Mm={;@OeF`sB+@fIknHEQY zfH4iE12R~|1Su2nX(my)B6&DKzG;STj{)&15}W4o{KTe{eYH)5o}-`HBNLK3nV*A| z;h64WE!kD)xGW@ch{t-xEh+K13A}T4F|!hc6TVddq9Hg^G1Ta_p+U-6GHXFArChtF z;oJrVSI?~=N_WdLHWViY+j?Jmmtlo{n%sU|#VeT4RCq)utmo@J1*2A=^=p_RIqNgl zvL&kGuP`~~4j!X|mQsr5{j=C7YDsdPc2R&@9N(&jut_X;gZNj1!c%)4A%uQpRx2Tx zTi7bE>oDxau_Y`yFSYByNi4W!`7lBU`GzI(ZnqEqH6=LK%xG`mVA@8fov;w7d_0sE zkkfyfaRSe82m|L9=FMex@}FszC8@#$dMxy>?tch4D`0h2`)TBqgW2K~+f} z>i?8>#}U#fSXq?rjpo<@DT(@fUz@&KXsnwsEf;P$N>;NHIsvTiM2fgTZ8xyx63FC6 z(`ePDOm;LJ=BKytH5h)C)w*J-JbHUGHK$`Sg6zhP996=t1?mcD`g-#pHX2;`8W&32 zXefYHR(gA+=YD#k0~0sm!RNw*u{x1aby7j)NO4s)%s~lak2`->lDo?$WvDgKP(^+Pzm`53%0q4;p8K`3 zhCHJK< z<`$xyaJl+WE*rA)t%y>S>T!35ggV9c_Cy?`>@b~_>_QpNbeX}qu+mR~B4czd-l}~E zZ$Jp*uo(0^w`wJNgPz{z#)C8L*|a-c>`&4qb_eJTQ5{N}YG;WHs>u{Ri9OPjK;J|R z0VZJiO5=*EB~syt(#s93!NWU3NTL14$>Duq%2^~W%nv>77Va0pXST4xl-uqUUt=_D z0jZLB?N{3P;sFaCoXUAfB~umQlIHX~6g7+7AtXTM)wdP#F%dAm8Y3;VwL1ps)V35g zHg6#;DJ;U}kstep61?;8#A_LoE09DD8$tf4z1=eMd-GXWZ_os7hW6B#CM5~eymqU? zi(nODtWH$}aV~n#87Q2%n+hyy5y?w%_p_JFegW93&`AEnCwg7DfT(5HUKIc2~z z^tUsFv!XQ^7+E5Rioz%VG8F;ZF$UcQF_!UJE9nN@R;i2n&&<~djnMCKsL>;k~{HTLQ2d*jYCu#buN=U!6S-hL}ZL3#4 zT1nql&dDt*(FgjH1QD=EmyFJ>W%&w&?OYS?7XobxC?-ek-y4Ib#5q#nV8C+)5 znu9_m-N!EJeChPgBQ(AT0Wv&ImgrhBJqmwub9b=;V@H>6)7oKWsOcSntG#$+zQQy3%%Y>ijQ8U*PR8T z^;L)nGxP^q~zJvsDr&_|&nJjc4p&yckiba8O7&%#PHxWaKo78A;hFO zi~t_$=zcaz#oHcn_wC}d%{@1&Rt5&_K2$`i03K>}98~WUHOv~(kEjWU-3s(zf%1j{u_^0`ILS*Q! zVo$7mwNRXykOGjDwqHP~nPl%>9n?1}>jyvE?7hV>q(R0!nSX`zM+c-5DySJQ5CqoYM6Siqu(Y1NFa-ORJFmS{30sOr%y zp*e!jWaa)Xv_PipxD3be19eJz5PME;Ioo0I_ktlUp2zqgX{P3bS3um_VZpYd*CK3YbHmAe5}27$##dT%d4Z z89VZ96}$@^7=UtIOe(Enq==hb4>`xL8yOIevk^)fq~g2@f=NvZpdbe6>0oUSV~x3G zWiLwMWDa}ya(QyXjHv+1aLK5UDC4S_sbZp2V$!HHkbz&bK|*oNrGLtO`lzGet!Sru zHVzF-sL({Sbn$@wCzye#oj;(StQK2QFDTUlRQ~-YbJ!sXeJKL{JC;niyiArb954Z;!5_)aOEADr1)DZ4WeN(&5NHx0cPKNdxb);|++n)>V^<>9 zl=)Rnc~T2Ylf|%{ol8Wpsp1+VER3s{u(=J{3nf)v_7?HC$Dwn3w^os4*s#ZiYk4F$ zPS_Zf21ULIMs}{$x?91At5yiL>46@RD3k<|)U3Zd?FSK3!Z0nW)7iTR?1%OWk{W`w zF5U)?bsNmEVL9&~FtQiUemqi0M(Vrz-GnENvI1#vaoYdrqRpcC51`|V7|cmH_Rtt6 z6a@iFJC}Q>-QZP2VMK?TIY>196DiPe(n@m8Z%#vz82-M2nH3Wa2s=cUXd@a3!@4bC zZq3C(S1iA>uw)-6BDW`Wf(p~9nh*Rn$kKla71@EsX&t*Tkn^0~4qC960#=djn)Riy z7YVXjID$1;qk+-dvB|7dGnrQG=(Rd(;FQjgzN~#9;wFX=v44Kum}2Yc)};(%P40XfBkp*yvPH15 zDz>^~OZ0yj4|vENVo%IWR?QNtIA5WhzY#Q$eMwCOr4=(6V`kN24Mvp-ik3^kkSFNi zEVh7g_6$9AMW_8$7Qx|vAU|EMIg*Fsys&!ewLDv-E%Lb+!Ostkj519T72?WmM}o4k zc$q~0I!T0SqOHj{>KUOM7yaCEAk$DQ%r`HPKZB=vT?(}OeP3is(HFWyBZd% z|c$hh-F(yaPI34(!%Xy6Q4m@T4E12o|w7-fXKC5DziZ-kn`7Q0un zE6WKYei>w3p-*zzR)g_`+HF4SecON?8H?!rIc!{OD?TWM%M2#C<$tu9V0|F0;Kb_- zDM6|YlW@46#4~KbRk^#=yT?|h@}fw4E;b<-LEqhJPO`gmk42|0oW_{WI1>i8w>1a} ztJeYNv0*J}Y;46*G&zOQ$8AAzWUx{4Mfv2&Lolu%;(7SkRN%UE8 z34d8|Z;Zh>#u`(Rn6I}VAkDFNFTbk9_GJHe;?!J7&X2=3dvFj4JD#9#ve<%>jR(l1OYPih@FK#L;kSpTXF z4#LLQbO*z7F5~VajbOU$eCPlInHR8Q; zi`4|QiePHC2IVq$}tcjWFy7?v5%m>F(C^}D){h-5-CK3Y!Q}RG4Pj~_Fa<3?}s5N@vvyr{XwDQ@Qf@l(0L5FIC`m!e| zs`j0h0C<`f9vM3_C4A93moZX3UO9N@-|-|r>e5-W^&)WAPh}T_Ia~;#?*fq3*!v)CV8Jk=4Io1ln>zgcCmmr+n3=S>94EB?KJnz0$a5YV zcV}8`aFhdiu$49r$KX$Zb7k>PK+TPpSNJ1rvfQ%r(IUJ!QoHhLu!cbk^yv6ywAxKz zy27R&7OcDV{5(7K!^2#e=G{WEG8tEAouSIv+Nd?3nc^X$p>*d390_e{9Wsm2hWs^} zum+7sTVb<+K*vpE?Ys|KBW#WnPk{eOPGJ)3Dlv`;oIb%(1CN;NZMl)(j{(HFQVX~1 z(?OnX=8T)YPNzfoRsrqBgZ|?q()VBiS`R2N@=i5jZ#uIaV)1KQFd2FvS7LN4h%Ac= z4!Sg#QEVmB9!^=~q%pTA1)5}DhSV?&-*|TJ#Rtz%(X=&;+e}C8)np=JRt@Snxo^n-l5Mf4E%Cul~cu{DJcZccJv-q(+ zE8cSlEEZ<+^9c8&rs>TAlNMPDe##?&ljZ5y+s*lHV3&hjKPq6p$~)$xNj-Z(c8<;s ztMZ6<1m@AVk%M41Fnd$n9oWKhn?Tl-EmDA7M#0pY?KMfSA-1$CV{mQK;+fu&ZnJ`s zVGw&KiH{|zBjrnlI;AVnQXcDtY4TZLMA`{K65|v@PG`UheibQDA*fBAb<@3e-=^&` zlNWZQwnS+c;tteK7Mi$ZW*3IWQ1N(4{N_vl@!t=iZ*LWIw&HQVMJUJ{?+HhzkMW!0 zc%cllsfW|#xM?Wf*e6VV{o3POZU2|+6pIq3f|pAJj2@?%YFq5AnKYVB(xdaj+BA!x z?$OLBE$ZB)=*}VvG+rp~T0rY|OW(ArLAhZMU`IbHSjFQ7o?#?LES_R3N^23l$h=N0 zVu!p|Qh76VXd2wgv#oQ7SXp+Npb4`WQvefKQ&t|)A}vyq%p)t}8j*WmQ z7_(Lk?SOX+LLhKb4*QLv;37>^FjjJX87XBy=xnhMMl6$@TdWTi-&9QPjcaIL_`VJW z&1=iUqhXBFu&_Rr*T42y?l;*RkgyaYFqPj0qdpXl0<_T#mXU`+WdXNvh~!8KnqDfc zY)aUp*dz;3m0~>@SX#{H`wU4?vA_R3XDpY}fmEz~f6ccrx__6^Gl?eNh&c{l>%5(7 zO3gy#*d*zS+ZI}2Nx^#+y$lDn?HHMl=lA)X2*+AxZ)*VJjf~4S6a$~k%#SfkR}5oe zGxD1xJIJl3oD{TD6>ppwdB5#tt*Wga{DmV*G34!YLjkd22L zw47ZEeVkiPX;srxG?LxWOauK=wNk!$y#YZWF8MeZ%fc+en{e{b-~Uo>eJy&A^v6B( z)K*mJFDh~}VxpG?FKaUML)~BpJ3+dDGxO+u;%_v3w~3$9XySvEle?t@$ffZ%(geWG zOBL+xn6br}z0+I41-EKxuwMKgrKJE(9Kv?uqG2)s8Ghc`w+te7B`Clch{Bwd!|Q9% znq%#mH%KnCn@fAGI1v7wA(7A12AGIh#_bLmXp`SspNfjB(dJkUwiRSY-dnwK4Hflm ze(z=RqiW_llVU>%t2)ES71Nke>Mid3dfTh~tY=*)3fuatB}8GS+hkQh4&P=~nqfCK z$xpuNTmC9w9FCTOC^;G;!$+uPjGeM#BMguSU;*miRJ7b$M?Q%hHK`3OW@&%g+hrK? z4Cf8@bxOWsnygn;j*?(%#T)%eoEsmo6$}7Rz@<2|qS@SQoEu?^@c2RnxI*tmB0_FJ z@Ulv=Kf0E$k}eIwX=nubx8h1@4!Tr9GFSu&iOu6BM~A^V?Y_lIs*SbVhZm+JdgKT& zDIm7w_9$ZHc4@ybHCa);n8$JkW!(k#g(Nxt)I%ae7^`-up1c}gT=H0x!e1A+#QAGs zhw}S>oERv%G`|c0;j}tku!kM(RD*`s9->&4#0^Kv_sph1peI<3n6=d?Q-2IlL@jc{ zt%KtxBv~@ULY)AYF<0|$5+g{aW{obSkxm2&Y28kH)b}NZgf5~?=*O)<57{PzgLJO+ zIaS-zxkVRtB^x48$TA?Rn;-~w{7{AVYiB~n6~DJHV|(eNxEC~xgSFIh(X4}88LL*H zUb+hI`7qq3Q0RA(X9AlueD!Ff5jH5tj$fuU7j(cKn>4fKSoX3z`t%?H+{ zpTVidbQKA%mOp=bg5Lg+q&=Vcazj!Vm zU|_m8N)_%f!pgO-kC_J5_M%%oVGE;ugtQfbUgkPs<0!r~)Kp*u_@MJzl zPO!jMml7=|Cf93hHqkIf(KPmw_7h?{fnWGxKVSlwl~$)a_v#81W&s7BS|cshz$Won zp$hnh!-{ZQJNcskmc-C1y5xV2Dz`zmg5Z*b95R$zURnV%GY@uQlWxj+RJm0QT<_zi zt7z@KD}A!9i$Lv0#M$ka-EwqlJUU1MX#uBZ&?7-2H{|Sdw1+~3*6sOLq!n9B$0R(u8LCI0 zd^z!v21tzRkUjE(o2td`Y8T}iCx`^vq4aQ$h1C+m_~{=jgT@8}JF=+m!0^Nh zhshq2$}a7*5Vp1UAXT1?e6bf37K$#BdcaiqEPjz&<*I%3nH|5ySI&wC$i3D9h{V92 zSxO)lWyFK<%`duUrwDgm2FM`G&PY4aJX~S z8q-@#=TyQg3|MR}S?g>A;Frp&!K%HGlfn`DNBF%9pqDi+Lt@mNkpg>-W*GyrOUnW( zcbJLl`GT9_2`)XzYX~@Ft~?{{VLRmqc|{|uMkNpW6+f*DyhNjWBRUrp5!UxW`IL)* z%Gr(rUU^}BOVW;M=%(c4B5B8_3dm%i5`tWGVG~h1)HIzmouHL}M^30O2Zi?*a1a+) zj96-krYEaGIc8`W3W|^15N@f;&Jf57Z7iWQ?spuJJ?D?|kL4CUfyNP^T)jwEFGg=Q zzv#KTdO|0Hn6ZN-ee^vy*drQ>;Z4pJJEX109tWVvvOP8xiO zfdt8X(B8cVeT4^2b2GI(TWa3jma!r{Ucg>gx*smHNV_(g)%KS+o%hCLR}8`lhN3V;T?4;$ zL2K|wAr?@`4LxN$38_$M4wZ4baZ30){b=BD5(wnC4kAnikvRJR63C3W5T3V99U^lM z)-8^uqiE8mljzxH(mnD_iiY#!;&JaR&(jk3*z&18)9%8>9y!@CB}?{CZ7@o41_*00 z4(*89UBWtgVwDbAnBd}}?MYRf3a{qs+wKFwK>A#K~H&L_pJhK;&gCPF`zZI zuR0^>;o0p|IX)&jJAX_aMwI6m!L1gi#VlbIzS6!52djEni|S0O5#H;ZplbAZH3tIK z|WP<4#1TCKJ*=aC4wC7=Y zNa-MXX?f4kp5r1^%MP$O{958F zqyueM-3BJVk!$FdZZ+kvKp)n_y`_J`va4Od#kePIh#1-(7x&4M@2}!p?X&0f16Qr> zYX+Y6_W|U=n&wK=P0wKSnmUaX)mt%4+u1_{bI2FAE`-L)LgGXbjn|8Y;Vga*=Cd5E zM~}eI8aBB$!zwr%`t^2}m=V}9tf(oQtNa-;@*a~qlmG)4y&JJ}ib`P0!GWAc#Y_Hj z$^Chbq!Mstl!;s#nSE8PS;5$#qrY~-U^Q*i+e=Ak2Vwm!eUL_lZfc}oS59DZt&VV7 z0oCj}#5Pzo_6|?)Zhl7^U=p-Wx+eG9Qbsasjk-La1#nP?W*8Z8c%e!zz0JeYFAPAHO`U}8V9jsVI z${OtWZfZzLq+<A_yUOO^odH--|NvAe`0(B)Rz8%`-;Vd|}guf5?Bl}8XS6uovU`Qn@xR!CV zw4-o!hK;iO!+hp&iO*q|-E+y+gn>#S@G@9CEK9xZ(7k#i=P-W*Z$``W0DVm6IokRT z>?#SRw8azAO%iL~(vt{bp$)jG#>4)~34Emr-2c}E#KcH2k?wQ|-PmV6G+obuQmt^W zMS?=wEFi!EGk=ns%Ob?y$0fn=Ck88XEpL*A#mD$Oz1B=dF<(wNHd=gN&>}JbyjV%& zr>I3eA-efemUE+$!4;?VtG7T?;)OMxiZn>stc_Y(8OLj7Kc?qo?Z$dk8;cWmSl9)$ zT=SzZpVCv+#6Bp3M!pw{&b@1i^9_RGsI0;%y)G}UUe+2b`0JoepV<8i7oimLBAwma z!ShseL_CsNHu9BPSNq`!E<^+`JNCRUP&L5ew3$)0Xrls#Nzcu{|Z z8id_~b*sLvz&7@Rw|Z0fTak*lq7@HB7a~Dc5_IeyutWRulUSCl*3^5=k;43-#Ev&U zg|Ow7&j6J{7dyfKa9)#Hq*#XZeMu}sM)-Wvgd-<}Ru~~iB-etwh!DyILzz=V9Goo= z+hw>BJn0ZTPS_Y@@%yiK&u?^+ST^$g#k>~G~DcC{- z_N1xZz;nTXgU?FF3bn?w^t*B|i_nxUAs5;18_pwS&}d`xwj;nr(+>8!V4JIcfxW9O zntHeA-BCQ06EJ)9UG44x5W#XBx}gjtsbeI z8ene?FaV@d_>Dx%L=0e`VfJV{rg^!HsSiLC7d$j+f#Dm72_r3d+}ATBAim}mgSJt0 z5sdqSd}yHdz@hXioFtk&1aC0fb7DO2-d2BQ2*3`Ens)09xUDyx=>?A^x42$;sNpDoQ#1y?0D59EEtrao4HZ=(yf0uRC4A6c+Bf0C?v+;3NChXg+%J$7%; zG*c;h;ZEP-h>5!l&{I%P%>=$}!y2HVj5#Sh>0f-W)lnqfX(zbEMG9LB_o5(DO610} zkg6`K2*w0gdCytv%A&=)LF(a*+>q9g#8tGgsM~ZkiU-rCw^Us? z0a8C9jBWvzgv5AGmj*#3#a9d=h-vyFvfX|F9ngv&x)YS|t)U#%c6e@YZ5mBXiaC8x zDg&nl{9m%CP3$1bDUPK^2lt>;1L{0XS01}NTGlZ4T84yYk)b`+3cUBQE2}@2f>idj z9^Z06?j2SijLglw0$26;)~m*QJk&eSm_7wgS)%lov&s{be8X|+gw_+lG9`|M+A)f~ zKos;vxS@sbPK7ev6w1z zIy_Y1YgEzS9;U*}op-^s0twCup z>_|Yy;v|-IN>U8%xw8Zf|KgMRA@8^}`R3cTZ})L463#GDSQ0^NiAZwPu{DA|7E(6V z0hhnZ_+*$a6`wGH-7``s3?cjo)tK`1(UOQnz4dd-#0Jcq=b}PdWg5dNG~P0jop>{$ zfnkZBepIUHS)`?Z7N^nvKtM0vlB{w`;hoSg4xx6A&-9CFYwVJap6UPC9^M)mAlK?# zy8r}Sn!>rBEYTieaPZ|c$ZD?QrAJ((Erk`eptZ6XXv`7yp_yoY3BYWo1$`Hk^U1%5a^Z#V%!-cyAZ* zjj!b~^C6N%psW zk6iWgazUt=X|RtHE4@uyQz8x#;yLb!5RYRam>Zq-FECs<+7q3yT1XrMR10`8gPoIT zY$bK;(qOu8R#?XB?&BgsI71;L60qb1@ua{bZYJ(C$@0yZ>raq0CZr%MI2kJ>LCu^ZvIABU}8b5ewC#aH}BQ6Y|zAngXZ;9iC1;kWDR*V&kXI6rxjCBBJ`xIJx;Gf>2H}e9cW(yI0ac~aQ=t(ulAE2 zq(~kKEOmHj_z@)?aFn!$%b(D92<5GWa-z-tXzvD@X5)d_IBje_ zxOn5YK;ktQecT~(PmbU%B7tJFt*BG@JY*%5eKO~26od4HQvyHGf;wf@ZNYTYPGq84~VoinrRnhcsy{v z>%N&#O%r$w*cCAe(PN-aLA2}%B2B{2A#swL>#Nf1)+j8ZHE@?aw^M|KQsAUI=3wf$ zlW0+8tlMK24P98W7C*}l&rQSF42_FbT$NeCW*KougJPG;LCk_S9$gX^l0Z9-e1ekd zjPu2%j;s@M$K9^gP+kRH3yCNUfXGx&ZmlG_=I5&^?IIp%Z#Kml<}qdq7P85t1{(Zg z)Z{EU_X41kS4B%oDWbYW0iuOc@g5&eNDg=&4ZIV4?%-NFO&0|~*f@9+=UiYQ(8v&q zT7$snf^6z?M0}why=ntkLdnQLTWA`A0fB8V{ncO@Z$2;0gjwQ+1JLf(JWiBZG{rT5 z$koCaK8H#pe){2ysSOlCtsW%6WnBA12noWYu3FmhtCvhDXs7m+o(f)W$+W-Jx=yj$ zeZyvh6f;6xxUoa!L18~prNLui*zFCx?@z4;Z+THUu-TOCwktHypP+6L=7?KGX*6Jr za}OD}qKYVkk1Yy|-CI1rl(DG+Y`{&M(_=kx08G}RnW3Pzm7&Y*pP4=LBskm*-QWG9 z_9;cq2rqQr%_#Fs`bCoFCy|X`<12_D2o_*KA`EJ!S>PeAzO0pjlHvKCBbuQY4_i&O zfqOlSN%GN}y&aF$YaKDx+l^C2Q9eOln}RL_-Ju5X+p>_~BZ_dzWpijj3$1&VULXVg zpOAX_zxGehN7;3^No0Z5|&u>HciZ39c1SEj5DzHgx z9lvHxFvPecX3>BF(0hDD*Q&hOt$rkU2p66y54%%?QtSj`O9d*n*t>px< z&L<>~)hNxo2zFiz2~NsIwG!+_lFcr{Kv-W6Y{I>HguZuAljr*o!78lm z>SYkwkvh56dQsUbHO9d;2=1G(DZs$0(nYFxR2z`Z7b{wqMKX1UN@#dESLApZgBEc} zALouWJR%v)wg-cPctcWP4-HsGoO5NQ;+9-uSGSj)sj!^KrD0W9opIZ-=C{5J&TRO2~*zV2&u&RB2q(Zn0FO{}Y%((nt==6dTKoHSeH* zji-BF0WUMriv$Y??c=OT${B@3?yH#8SnWQ8LJ32oxMPfk>y}p1AZS=1r-ocU3v(?h z4P}x<$<-fqV68Z9+Wk^;wY9~Ddpj#$Fk%(aMH-=fypw*pnCR}I)Ha$Z^lpZsGX*fk zS_5yHhL%qB;iG0~u+{mEAT2%Vu8uGPM@w(GuSj;Pg0%f1jqehMD$;<_o`A zVCEc`U?MPIEF!Up4dmxLHK2%EA}BGwKWbMr>5r7cZ}7q*1=hZBZ4_N$xQ5+?gI!2K zr>D=NIBu+7EJ}vzl#0tS74>{NAFeUE6)ubeRLQjMkTuhL&PkyRZ^!-O72|7}OASLC zYdF6q1AmO>xixv|x@e2>u>`RIx`=*;$qUeR5UUKBrx0>;utyV~B-cTx)=Mt)SDSlh zBuOQzEzs25z>yAONa`hR0F0D2xxM9-CNUn?Hs#C=qfBpt_+?RmqAHym*~_(P^l}+I z=6f4Ye(+E_{D!?L(|?fCy|bwotNLm z=x`P4qe(X;2@BO^)byO2IcoZ|5y5{DSza0BXSNjzSR*evE+%~h0Gb-7G%}`T%$QQC zQ(s3q5{xM!{}c%odw_mXIZW!bMv--*b9%L%W24bFZd>F-Ai?}F3LK_LsGRD|Ag|~S z5;UYw+Nx0772UxSc-jkrc-Da zQNdutFVs5Q$iaftdrdjeX^dK|XH0YhmsSv^HXsAG(pc14HN*e?x|glz^?uDQW)8(M zq+~nEP1}hx!w9c-cvj0TFbF0nvK32+Kq=XwS{Rpm49V`pS|PF;FO%r>4l4wIwuVb| z3#(s~H}1!QShFqwMjptg9DkTQ*wCW|rC??O5~s?Y#?JI7MN&dbgRX8JY>E=@M=Pi0 zVT}B>XW4-hqivy5E2nrh6DftGW7;(fc%{4%-4nBRF3m<-%bZ4ntP_kEy5zRgWf+Bl>(y! zn``PQ?BADH<3&2!4nyn2-3-yIUDgH*bTs`Q>*PS7B#D046$5bO+D~?h<(P;x>q7Gi zmb{8(Km6MlVlID`?$9AaP*~@Ek5^o%FgCihwm66>qWToF_17O%a&K>|hLv+{ZP-D4 zaYZ%Z5NED|jw)G%=}aEJA;C0l+ut+AyJJ$r5H{gfrzKWGJwR+flxuqxjm5lZ(%QWb z>ZjS^p(1bihBY4&qg*aL(HF;5z%8rGR%un|q&Oc6dQtSO#mZEm{bo9x zON)x_hdCt2(h>cJDY%}!csOr*9P{YgoX?p5nGQk=RFz%z`*YhNifIZncZw;1uv)r4 zsKW&>z_s$Z3lY|K2V>?J3y;Y^uzzWa%VuCVeBg@bQVIj`&E?}rK(zrrNiRE zaWR1I1&YOwsq^#Rh2m^XDxJ(#si16Wip&N|bx%`N{vC(aFE`Tg)%;sPY(QqpHV8jv zs+GMNS}yrUC3-DfiFXd?L7po)mRNN>bTDerc{bcUCb*MQ!|(Kw-t!`WB}YJlD{mY) zLpS6$z6Dv$w-;^FoebJ;0FONM3DhLJ1rRB?_&eETnpzS8HK`LE_T!|2Ba6k z-7e}ThE*TH5H7igB|ON;FEr*-Bw<)~7zFdf(rto5Q!J|lFPRl)(yQH8fziS4P79M$ z9@n9lYoXC%Sz7gEKl;$t1I&P6P5m;|VeSePig8Gzhvv_@QIc#JvQSQ}%g}Rj#jxRk zyJI*KV;9lLrf3m4M_!W%UTxE38#)=+JH@&|E_giB%bnKstpK6O|DpJz*hJ(>897=zO%j=J9bpS$tEDRiobH~_p>`J84l0yVE4rtS(~A{AUhoRX`QX=W753V?$(PtCeO|vE&d}_j#qwqAq%d~Gyvy*|5_WTru$=Ns$~LM#h{cJy zdYC9gec9A&pq-GBGcpP>rAvpTZx+|e#tZCDTIE%%WB&t^Kv4e@uCExAQ#IXKtJcu_JzP z@<2>fVc{z}SDLQI(n5#K zlUZ~=n7*VdkYyX`m4qN^YAU)l-|8)F6}ii*D`;H!!)~=Cs#a~`?ASiH)J?q6P*g1E z{upx>`ocoUiX_1F2$+sUNk8gu3R}Y6i$hxQLZ$K0bAxX!TkqWPsVv`c1_RUXI^68k zKJT%CG8p!(c_?$GP2ph#g}bAhCV|VyL$r2EB?wLmTV-A`#Bv3_ngEfm+)w-wROyH7 zSz`;EuQ}>~S1d^LmM|%ivApm^z~fBUnZXa+IpD*IG^vy0{DyKWifD4*X&N)p@r9uF zSGP0}`F?CR!6(TwYubP+C)?(A_iD4g*&A@+61>4!u-eLAzFxSEPaTzGtNWkz7k|F^^MR&c)nELq{;Yoet3UnquYXm4_On%g{^x)C7eBjQ zpAy8We|~>A?RU4gKl|%1|L*~ z?&gb|&u@Nr^Yfc;Z@#+uyBB|QdvkO1&CQ3KU*7!Y=Jz-Mt($i@|K{d@dGqGx_08Lx zmpA{ln-@2q-MqT_>zn`j&42Iazw-9>hrfCM;q%+uo4Waj7k5AYt2h7coB#gJZ*TsO zH~;qLPj3FZFTQ(!^H(>2``PVZ-roEV-hB7|hu?qq;r7k#H{X8s5KOtZvNTLy7`wcfA{4NfAjXkS3i9H?T6c6yu3Sb z`{MieH-Gcu_Ag(2``yidc=P{y@y+`;pFh@n@ypL&{^jj&fB)j!4=->3@-J^+e0cxz zmv>j*{Py<`72e$a{{F*nKEL@t-2CS+Zhv_3;r7M1U%mL|+jkF7?@Hgk6HhOG|KY{$ z*Ej$1>+R!R)%QQVxqU3~>VD|E^1pfU;p>}!{@K?b{`%GJ?Oljo-s5=v{)Zp#o_u!K z`Nda1-28ht|G~|F@$RAe!_|90w=ci_@bwQb{_^(a1Dv1T{9kVV#jD%jeEa$BM$zYQ zzj^<~*B`!r|J|G0`-wh$_1RzE{`|$4-@Lf}?vA1NFTVcp;&0x+`0&+>+xIvB>g{j7 z{qVQ<72iD4^vgHDd?qeAoB#XkuYUjC_uqc^>Y>Za zKe_$;+jq_KKfJyD@c!E`zI*?#U)}!p+wX4QwZ^w^HgaCx)AjNfcO_rmpZx4jqgQw1 zfAjvuoe01A_U2D-{_N)8z4<@Cy~Fu)~4eRY5S{i}y6Z{9qL_3rBrzxnnb{=IL% zd;jhM+C39*fAjNSKK^n)^_Sm#|NgT(cf9`HmtTMP{VzVdJO1YTAHKWe_UA8t`1Ja z+xzIvqvY@V!FqH1{;uEWx3B-<0oZ4E?_aF-?u+{YzyG)2fARM2m*4-JFMjyy&0pUB z=l{js)px&mJb4$GKfn3Qn}7f2|M}(-{GGoa$-NWvU*BVVbBF1lefhiJy}R84@cz}$ z?>T*Q_xkJa-v8p|J=|9hEI;=9-S7YEi+6wX^*8TtfB5eA?_b_m{p{|K7kBaf-{1V- z?p=6a>E*pRZ|)}i`i`JC4@d8){_2}=zkmPsfrjsY|5tC`fA`(D-~Hm}Z@11ry#4mO zZ-0O1&-ZU1v3~vAw;K~5UOmYF_UC`{V7MP%{kwPffARM3zx?`}duiX^ZYjC*-#4%B z&<_1^Z$K$Z?1Q@ z8{qHWJ(%l1yR+WiK=;4??b`=)-9dkMKf}GfZr^V9|KZ)^9RL2m`Q5t@-~ax*_y572 z=iYt)#RG!x{_UIX=exi9{ny|8=FTDi;mhBD`1-3?_e|XZ{_g$TyF0)A^3E#ne)IMB zUw-q=xBu||-Irhe?O)%K@!>bGAEkYDZ>8_wegFQO_h0?+AAR`SH`~Oo?=aj|d;R&t z#}~K1z4?oq|M$)R=hXw|cMq&Tc=n$1Z{B~n8&P3@aMY^@TfBOx_1WDtZy$)QKe>Ik z{ruH09}Ihk^bW{p_r|zm^uxD5+@1d6Z(iQ3^7i*1{`SMS|M20Tzkbxqyub5ylk$uE+26l@Wbozv;IAJy&#Q;8pSRl@ z`ug4HZI!#t^WC<$Z{I$CRsHhLK96?VeDL|pd+J{N@cXyj^u=#)-#mW*e|Y`)ee~jo zzj^WD^P6Aa{6{zc+3W8fmhkJxuie*=J>PE2^1C;mKmOI??IZi|zj*bq(LcL;`S$S( z_4d2Bk6+Y3{Nm+5I@yLY`#?!L0yKyUlE*AKhs_OrWMuO61h zn}_}NC;mInS8pCw{uiI!wR^W2^loL{b-DX1&Tl@utMmHt>-Y8J-{fE33-#*Z+xe~j zim=i0X8Q}wXLtO)ex&5hhez|ie%w;`nRyKQn@4E3FYj@_dcg2@`zzar`@dlPe*1gJ zSMU1i9hvugYy0ZD!*_3(N3wqL^H&eC`0Va4nU728{oDQv#>)prHr?LKm+$Y%|Lx0% zzu7$e)kOab=GDWO)ysRH-!zX8#lC+1h~sVl)#bB0@!xLW=Rbe<_)T^9HS+TQ*xT*z z1OMX1*T22_pWOWF=6`$he|o$9o%OeG9#j1AcguT4UO#5&)dN@We(0~4x9_*V8@;@b z+Pm%VtM5O2c30!GJ0S1=W$*O2+uxCX`DXimeb-C$n>X8Def?PW_2XZl-fUTZd)toa zC3pL-WqsV|?;oeX`|tAx_Q3;GS!RiZk_aBOn&p~;V)@#wp70B&G7BR_xt-d8#8x*W&8Z)J*n@uaqrgP zgRfpajPS0P_}$XIW8~%im+!mn?;_vd?Zd~v>vs3Mze+y*Rk|PC)q425+_nk-#og@p zXvFRJ@BU5y)$JkM@4tQ5)ZIS(&xOz5wJvw1AKJd{@1D2)SK-%>#(e$wcha|ye~G`{ zR?VFvkAD-tzx4WXp!`@|KDa`e|D$hyZ*c9 zFWx-v*7q;(wSBk!{raxaCd1=j4&T4scI@rjp6=ztU(CPQ{`UOt?yo(Me+hm4xaaON z_juv;<9FdZ{T~?KY=pnrG<gAOF|Z z%ZHVEKg+vbDtCXoe{|=o2dBLId3)^D!{iVD%kJw(sU8;WCgr>Be|Ftj;_;j5_2cG! z{rFdhH`~j1{iXhwuls*4-bLW`L&$#nW;5@b?Tc^Qns)tKEU`f-`P z=>+%Rg>K({+bX`(|8eN;_Kki2g?8`y$4_sYrpHD5{_Vs6V7mW1?3RKpXm|gc?9H|^ z-fUayUFYP7&+deJd0*%;#sBd7@vkUvw*Nu;^8Uly_uF5CKf5ow{cYmmFJbp&yu3&L z?uY(PdE5V+<8A+CCzdIiPHg>mC?%uxH{zuZ=?SHP` zzWDmvoB!d>|M=#AdhcYOIGZ}mK{ls+9*l~OJY~>k{}C!+FdKoOfNFi&ZHmH=Ayr#SN#de zP5)5-Lf`j%9{}5%b~@9U?r5}J5(Ey;c|V@#dEbLSC*LPOBtIfQCO;uRBR?m}vd@*m{){|zPW|K?AH{`)_EjsIHz z{VsfTU+KU1@4xrf>D@p1?%j9)U;q8z`0-2ckPtQBjO@sktjLr^WI`y3$&#$ef?SZ4 z+>kwaO>%NZHsl4lBCkk7F3CB$ORkx)`;y#q(#XkjlxCkg8Fki?vx%IDI#EjQJ7MC) zIXQLm$O%&?%*jLY4At8YopnrRPEN_kPPiuD9x(4t96+=uC)CNep^d^5~E*7Su^{^2g2x)S*k@+6NG84gsgpLx`I6AkK2~juU6VBFR?{og7d&J-s4t zlh0A%CEwwi^gdN0^!CbGES&WgNyP+6Q-)&pC*%t!iJTcD%m)B8$)7pX8Tm^G0R0;9 zf|JBYB1<5Xa4-SoTP7g?72w*uHfKO~g5y1)?@*?1V;ZB*2_lxaVaDz(xj^!8$Rx%*-mq-VzkQhF0jTQ#@@RwV#WrO^ycE)% zJay>GfqbE$SjZA36ER_MaCPz*hj=wDWu;N=e7oFd&T4xsPMVSTAb|fh`9=o*!-(QK zMm*&mD)qCy36_lSAq@z z>>T3In2w4kz?=$cEIA5Ss}yg>!~Ln6bf`$-I8WBwdHDYc5(TDt(OF<4wVgabABgR~j^=x1Sy2%y5C2fvl#| z?vTspuh7bJRzyLTz=7Fv9q-PzVTuB_Lt_WV!;&_uAs|^!DEYd++$MRt9ZDq6!M4CV zh{#S(4k-BZ&&lumrI>LM4!5u4RRp*{-t5+Kw4!jo+q_qfnFnw_)G>n$4vG^nYBUj` zN$YqC6SfJ1I9cFyJl@i)FipcGzd`%irB1$Ax*>f24Ce^`rO`SH8Dm#<4}Y=Vht>d( zH!wGg^YvCpo5vZi%4A%*KKht1DEY}DMQkB~W9=@!K=kNx85mcvrDt4ebccALsAOaf zIgTfa%b<)3$mDlN7rXr;W5NkC?&eEl^L|yn*!4)zNaq%;h zV_YRRQj})ve9Zh92E+sj;Re_I0t8{-0^vsUOoj7l+%)912`H~p(8j8^P{#bf}QR2 z9PUR}GF(?FbE*KqdBP#i;t}QPp-vHe<(d{YMR3F^6tZAz=2ER*f<=FttfFggzgvZQ z^aLhzn@n4(V#uuJgiopx&9!RPR%`oW7q4E*!gB*q@NS<+sSv{(RKx@7$$Ar48l*PT zlq-t?8j_=AIIdnD?^Tpu#aXmqvAxcRME=Mx!CG0d7|rM}!PkT;q(mE`QTseRud^3& z3e201yg3c$^lVO-_-;$wIDBy~^i9k!uvo!ucvlt#6O?R(<>XCcTDexlG;JoE9%A_Q zlmLZqHC5H)-f45DWO`SeZr$F2&4m{@`Ii?jUo_O8N8**NBOS~2;N>Fce6OSowHmFt zu`uEa=boB26gHZM|Fw)f363+TG9kc$ysG8uFvghlXfkulnQ+oVEGXlbzCwKNO-*<7 z5XEILggWT+(JSq6<@z$RsGDe8$IzBIaxNnvi*aqs9>cnbL%AAFGEXbZ8HMY!qdH8RaQ zWjJ#vWbN0g^qfsMTl92U=6rEiEi7EMYuY$ophZQM6?M&4cpg0iWDQr_grgKbkI;cX zWHsg0l;r?l9W4*;f(N{>%Dvz+edZ~)Ndz+`<=N)rfs38$CD#@KPO(!8>=B2ga2gg^ zlKti^N+*VgxY}Yz%4(FH!xR~z$e{&_&$*eZyv;O1SG$(0R6r`%;Ukr4U>zR84_7u> zIAJ)1$4*ZbK{-Uhp^3thtL!!F%8ZkSSFhvfYAPz=9^_8#;j)6-mKa#0Cp2$YiuNBE zb&@6@29t2Ti5Xo~bsbAzo`62Qv!Nl|A!zeTHL$!mme{l}TN(^gYpAIfCAf~g%78D8 zJ88(a4BA^% zje#j|Vni}ZJ|MsFzf2jVPgRJQ>UqFSwL(k4wOK^h(Go)UhuKXc;lcSPN28y*!iV0t z)YTqTW89C`;R9HZQl5M1;w*?2To280GX6-zWYx2RG`qGA&FgK?GHQlZ>YQ-OJ_5kV z0(J~$qG`f(#qPw22Y3tZr#w_l*%0P6#zz7*Wd#n^N4HxOT?5Z&if9v{o8?3KPr+XyPOr!wunXJ#`|yW~-?D*%NI)l}B=m7PxYuvyyBjX<(o5D1ou|w+WXGp&SYjmxQ3!# zq6SdsC@d&XA{fSgmp2V%pl3z#D-KOmMXqm7x}>KV<$LS{D`W(81Gt%a3mO>Xnz_C)BC}fUp?5aw|hh$bAWnA#2Hs7eahRSRJmE!xG-eC z(KmGyM{58b02Q&))V9qkU=GOLWq&i*jHD;1OBtNZ!N6T%nU|ORX|3WBYkQRqm zsxgt}HE|cF+r_BprRnY+SAeTpbNu*sCTtda(cLtf5@p6KsLs6-SX3Kx8CMju`@chnMFE zS%m~RHZ?B;TbQc@7S=NTW@vn--^CV%larSA%b5$9QD)y>xyk~|Tso=VXAgwT`xJ~4hRUPnsIUa^3L~PdkB@iz>=nm`&$c4h zPA_M!Z?bj9RC*E)>8bFz?~C_Gs-f7JEV>$sRS@WUdJh-`#1KA3DP+ahkv}!;0wU1q z!q0ZmG7i_UY8RgXU|L6Q$ziz-czUrQf)1rTikMUAZPN*Bk&#W!yw9s;a^4}M9T~iO z8eeGXOm*ch+VZq7Cg41afH@zB3A_DzJ)H?;$y;lJ+scN47?G8C6IkEiw)$LP;%hUq zVmlf(FgK{o8^K%j-O6*gTF!Gd`4Zjz!CSXf2z&BK&4~jmEy=b)Z0BQd`POa0>c8r! zIp+Qy%!R8)(@A!dot#53yGp~|q-hx0A;#%GLp&y$nz^bytD!W@0EsV zr~;dWYfr`;oNqZYn3^W8wioFXGkpOE8}6IfWU6^I#Lp7YP@Hr>#o}Cop+&ev?LgRkGj? zRsHdDF9!QSw8srA29ofKfa20ks+V>Iv$Nkl*zRr~!;DXNVagy#LrLAv$qBYNW8VuO zUSRl=C0z#8BH~Y?izwk8-E6Jmyi@~XKgTk?cMF4F0{Y1J;rclTrw_J!%!y`xLq{oy zvj|aHF!IY*iozX|pQ70X5V$Z{71nEl{cm_iSfE`RoyXVDpUQc}TI>5+ooDr)Q2`Lf z$hsW+k=h9H00y&7U}`bKUL}0E+w)A5R@L3^Y9`qV z^&^1hurkY=N8+txspRx4uFz0))3YXC5R9ujA8S{ADEy;a;Ib5(90xo2&U%`KuOpE# zvYC4ej-An_QJ3iy@S+G_R_KCHX7j*~)goQ*cdLHI{HZ-R9cqWwz^daI9(5#4ZJ6D$ zf+?EzWIhl_S$+_hgEYxoU^yikpr|)A4YeuQs!ru-#mo-74!}l_WlgPVC?TwkU9~+n zsHlM_!%4OSHB{U8}Z6+dy@4$%#0=_PR6EYyNgmF zglV>eJgqj9(4}C=a{q?ha&{#4S+|Yi2JU*}0R9jq5Z;z7HVzz#dP0xqaaMeL2&iy- zF+G6j8_2-IN2YyhM879ANeg(3o_7rvGXpI0?Jg~oUo{QUI+)#($lOTzQPZ%3rXh+B ziddSF+q<_kjJbM#`xVHm&a;0*C8?IFBo7L@AKxCs2^8B;M1I>)5x!gOOYl^o2(RQ9 zjXxV^&jD$DqQn(8fpL&nHiy}IPEi0F(yHSc1&7rMBHc>RHaxDXbu} z<;n98KYcct8?OTUARVbkOhqVVbJt(&MkAbl`_Dgp-RC`vjqg&q1=)BS!eLMF;$Y`1O*DEi;NQWe|X4f+> z#xrl%6+4IIHO2+xCg;`H-Xa9O;XCx2t7~Y<^c|oq@Yk5dztxtm((vjtn38GCSV_~M z_3fFJs!AQMr(JD`T+{caW=0+rzrgk&M}4=fbo!>e8ojvxlJ?59OYV{4UNM-J@17n& z!l;X_3a~^6K&}EgWtR&qp|4^o{EO|iuI@tU8IhfP|HLv_2-J6V3R7FiT!)rlN?)Jh8i4t$5RjF1Wd!wXGn>JaDn< zcfw`%WfTLV|AgM5_hxQG^+yDp} zj+P<&CWxIYG=3S2;JRXK`>`~Ru~o^_#?~vNe8JRqC9tz=YJ;Vc1TF(Ex!6Xfo22~kw=@!EU3iIa6-@O(Hoj^ zF?+?;A5`fj91YAa3{z}s=T=Y3s9HvBC>nnx&|z1uhK%C+X#v3p)GTsn)Om=~;jwH} z(;II+vrCG0E$#|q@{3hK+E7iC0nwcN&*KfSlQZ@RgxXWEq`G3HL8=G`guO!OX68;+M3MZZQnuGbaKIS-{XY8Sm`z zOXRL?sv6%!qiVt4v&c%o?~m12r#ArmMLB1to+#nV1_sqvR%32q4@`tHL}3`CUb8^_ z_G`eA_jxE@toNQN>bOOe@mxHU!!N-)&+@fu69H2aw^F8pfmBu1698m{<4P*S+g3BU zZzLbaSnhikNbsz}oGMhAD~ctv0aKAuX%u~V%>m0MVIvDVc*+F#yDxqy_ zKIzb{>N;@f3E$$}D=Xw9T_iO_#n9g8AiMgNsG%P1(v?b*3@3FC5^IeAc$Qo~s5+-- z8RNqO<_*4TnZz|fCr9_0 z)3>=733kDsOx3ZA2#H^kH1&gW3~|%?(vd)x_;is23>(G8)Q^a38j_Z0_Qg(vGDPF9 z%^y+Mub^i^e2a>x9-&44lzgB3nEZnbchETdl(b0E|<)LWia z?d#z*vwPLJmX=yh(!M3a@mIZ~#6a^Qt*V^*rMkqBR%t}C%odHSS$x#7;r?!H)Va)v zJko*LM1%c`Xx}wR@fnb)Nz+(h&svEi(J5`RHZBuU9kCX5!D8=9$$<#{R(k+SgBJCdG**;9nq{M zy{qkw-$<`$de@KHV+_Z7=9kzdDH->;vdu4vJZkd7F;B~4x1mmWMzCnx4&s;GXkcs$ zP%4S9Bc|+N)6-^Y@;1Q`hqP@pG`eM!dX3E}rz~__31#-z(!TICch>P)c84n~{NZ3n zV$@9o3$&>f`^QBlNO@@{C^emmwHZ~ne;mtu_6yoTb~7vnWo8ybzKlveVU(1WXpadIir z5kjsKAxYEUZ=S#3%+IP+MU~pSmF%6FoyTu}kMHyI{eCTzPItYtZIhVh>a2i=8htE% z7SjV9A{+gMy-`nTW6)T%L8ln5lsI6l>AP zjcFRRN74o z6Fk4pY9Ka}$xc<+P@{5|4FeT6T`W)6T7oz0tj0=EilI2Er<% zGG!-g!P^>Q3}%8`qZ0jEOH94P(4cA!yQij>>ww%v$xJveM6+2bf&dz%n(QUf$a*1! zT8nn2<*M`$N*+s%AVV3CjaOs|pd3)yO*phL>$BwsP?Ej7v3_ytA*{yiXr!hPoH?h? z3W;|UreZTSsiCpf+omt_#oCvBjZPZ;1b`kzeS;cp!o?g$ESM&)XfwQ?WPpm!si#}5 z(R<5hwOSiDQP-a#k7y}7$f;>0QFZ}SlkgBh?2VH|N;Kf{auF?3wGjX+p4VrSGo7Y& zGk{2@C8Grh)l*{i>U6a>6Xo;M!RkXS=8vLUJpUvyrf@M&zH>7T{u!(odqHS8Iv_$!-a_^O6p%N#jzWY22#=| z*XTBS#o0qaNeWsN**hwP%fu2g=OU9fvQY~7Uu$E}rLtx8%YO^qT*k=p;(Xtu)Y-pis?Nlv!G0Cb? z8`Z)eUJ}k`*l!GO>oixi8%NOATWrCofo{CDPE(c*P${+x6OfD)(nb#D2AlSgnT{|4 zRNW@&vq@$ytcP9L5Yq3w zO`@b9GnPw@zIuEX1w+MPS%S>;^!+RyDj~!gX#8I*STIGYlA;4Z)i_S`9o%^ImEWrF zhP0YBRAmx0=_O%=9wK{~3!4y) z^xKJ3(6`@?HEjS`45x0na$)h{wH6VjS`&PX(BVLpWlW30b=&u7SXa z07fkPjMIFDI%~$5#z_!g^_1unt-#O}GPqKMlMYA z_7Lj22g~LF6%e)8>M2vd*5VrS+i7{7l^v0s029ZIGIurluP)4B;vqr@b^Ooj25W#C zdbg0+etU{vzg5NePOg@aa<(yOo!4RI0`t119ewUYNie zN)AKusOf*!&(%NlMti_5lJdjxC4b7<4p zs(|H%Mp`=%_RAV7M{3*3TCf};(h=dCtdr*DLs4|JxeUMRDFi-1&E4U*a~v185X>4; zMs+$?x58R|rvYHkf%OP#J00-s#@P_={m=2D*qP18LtfHG9H8@ksn(Nv zt*!vops&@3s>&=%9YPrz1d%$^{+* z@>Pc?#70?o^&()VaR@e!oSHhhz<>!_APNZ3I3}F(wk)J-7CDEZy=e885gyOfB!Gu# zn@!M0s)}0Yv4MtisDks#VR+?OLZ!zB0)fNuWaiqacnJ3*QoZwjf-osfU}?en=)2A; zrYZGf^<>;W8*JKVb3D1Q@n-2k6RD&QQ6Y^_b=JVLX{uzaR+A&WV#;y>I($@%0I+7~ z_1i>+Og+WVUr)gZ2UU)0Ymv%grz#QCEIok;m(i;CIIaHFHA*!;9VVj6M9s}cy+XZy zV*^1^wW;Q_i8rh^A#CcZOZEJzWX>kH)>_sCYlQ{r@`xK?%+!s?q&3*ERmje%nYdYH zdQxV#8_zi7A=1(KHEF|KLjYA8M&+GRrEf)tr3D_C>`(XUsEu^vgE>jsS|MPOqtv<` z9s+~x1{n2r#C18ss0YasTZnKko!b0*8f`7M9` z!0Z1h;|~Q4NL};INht573OpyaeXGy-@5aAn<}7Xe=ggkdG6#182SX*9#v>kBzbO1kqy0KCkbOxFj2;dHW2=q-(JBx~{{p08V%12rM)-nB-pD|fP zhPwJ^walJl(Er&jGZFoNv}Mj@>HNO!&mZ{upK>aB?!uJTkG5Z_>fD}Vif=N>RwgA> zEq`rA6*vg0dpZ<7vHDeRQ0$Y!(|V4Sp5hNw?M(MEzZha-ZOpnd)4i6FLrkl{M0%Oh z-!T9%sjNdt_qF!Kx)z<9x~U)y3d}){5jkeF#5mV7almu|W_mXh&sN8`&Chfl7@4{x z`rI*TYC5;0M`DCk3?HwWH}C9}xksX5Mo2MImMN}g4u`9D$2jJNZf55WhR@W%#w)Ofdi=cZa3^-P?IGU@;K+ZJ;g5g(}P1#>Pqy_~BcFS3lEGb~n@fAXiaSMQ+bX z<72x!wh3`r4b;B17i16gb#4|oXXVKy%O0Bx7AL^*hetmT!4`yMxD`Fd7sT>go3caM zLTlU5Rq!@A&Q%`YJd{nW8xhy>Lr`x{bCYp(cLei zo*x~&3SN;4yOizlcOnz9d~#=O*CKvTp;S!l8m=tPfY|wRHUXC8dKM^1o4(Q5j>MOR z?N4DMA_b&z+U|;BaC1*2UZKfpS5F%1AjnzPojM`r`_`MY=~? zHj4E)fHBDPQxpU$`*IK)%lJSb)kO3%iJC5ud`Wcemq`+ z%5x;*bpBraV2#s>`WJo=OGmf78df@cb^pqh>FkAKs3YWD6LD7FKUX~W2^TBzm%?yt z;B<;q-alCkoeWjpfBS>wp??gm_-FaIYbx)@dy+yNKX8FR5Q~Z*JRgpr-HyI-G4*Ae zlp4SOTtU2a>*|&iSn$*{VCT`w`>|Z%8Iix^eD{Mjl_&VzXz4$j-`)WG<@xYQ`L&4i zZP>zz)OqQt#S4owot1W>OPmXSaJlP;6*13s^2bN!BDcgSUjpz9QSR7P*Z|-Te9TY? z_F4#?CiZnCW5Qf`%Lv*n9Z5-ZK{T6vaCstIki;#S_{h?yVMkQZasaKjqr1*-OOL2(#cW5if9V)hf6Ki?&-G4DzY>~g= zQaxdD|INGiir;XM0*Z1{PM%qN1Mc19^MAALK=|I7fh3gA;N`vOI`{`30XMqeyZBsj zmV5);?7dgK2M(S++x;GVQfc%cxYvJTeMywziOzRmbIY5Llsl6LKI5a=j`H&|ob=}k z`C)l8T!Vukw>`EqCVciII6z}O=oFIqTj>oSSC(eijh(u=LA^%Wo)KY3@K?aagdoI6 z;A(9)~-UiY=(Uh|&aCs1cP-u+BV z-}`i4=)U-=6oL;rvHs0Z7wsuOlPO*2qYpx`6|a9aaY_dOZjz2&`8PO~55FFkP7f$x zFlqmuZJfuZ(p(hh3W8UM(EUkkUP{v zzl3{{m)8Gkm5j2;ys;MkP|Vzr!jjw`d1Ih`D_GwyzaEAszx0B?tB7@QbeAhB(R z3?`KVDCl(E$Y|%@;qEnO)=RVcuMKyvm-^pZ-Sj^eWPgK(`SYJYyPR+S`}xg( zJG1#ORyH*^J<>G2=}((}()3qN4>$c~)AFVjP2r|U)1NgpHGQ|~JD_P^)9R)*P0y}) zBox^PC)(&gz^9J>nhWg{M^fdRL+b9q(7v0H-75Ra!{GeNpWe7=kJJYedwTeE`Ql|L zF`ez)o9`M4ap1|URGtCG6nR4)E+-241L#DlPwfAnHn3?1(M0iITjcy)xPl_62lM-) z=ga8u&u7elC(W1vl$~drIHi8qzJuC<8Tx@4#F6hRM~rLG37q-6az3`NoXr8HC%%4y zKTv!cs)Gy=E8LnCnenGBR?;odiJdqMUSxOMImxVc1xTdTVv z-+4kv@9iqS%;}qQq9o|Y^vw@@`dZOG`jXT9s>d?wzP|Zk>~^fZnEe=i$#MP?+=Tz- zcruaLc@*s^8y_m$JCDkR9Nc=DLtp)nsZRX#D`({y5z$|8Ln@`qF}?(;=6nFmq!B5@@(ek9+K>?ohwnffeqW2h^6E&f{&6%yGJxICUsdt85T7cxSTvim5(Fg0s zkdOj-z)|?_96UJz%za3mA#E?k3$b#3b30Ivjz8erL3A8SQZm}hKn?(9nrInz;H~*f z=RXB+vUE#+C^~*el14y&8@g;)3cVm?o7~+v6b*{+e!;0i!rhZ-`{Z3HKHWiEnn2L~ z?iXKmZ-kunjx?&?fd>hp6QtprM~{!feRQwxi!0?0FbI;r45Pd5zuDUnKJy;BEHSvb zZ3Db4fp|(c`thso0oWtp@-0mA+uDnS@~d$2gyCPCYW~?0t9^Z0-C^9F9R}+c+E(C`<3%l96O2D-W+5YwhXdr48V} z*!vUssETZH0FLO)IGIIe{%_u_Z|2&LL${J98;gt!Aqm2;h6GWV4Bp<7Hoe*RraO_B z8EEP5D@mu*30Z{@3EQAyapHi8AuK~62GO8^`ksIrB8!AYQ9-|Rs_J&%?sNc^_x|7a z{r-X5_tvSs>eQ)oPF0;c{{c2dE%j`wb3&T{&s(996?&2!1UHDCTJsJ)X@vt(8#apyC(Jih0x`RANx3U^I6 zLXvylf;o84TlKymBrep6#R4Y3^36SOsp=Q)d8@~_e}9m8)A03+upDy#oI2Ek?n}OM zA4BpYEa$0(H1Iqi&WX>w0GKa84jd~B1lN)Zeg@gP>U~5`g6>hDb7^R-iQLhz=2QB1bjOGDk-8nV3-f`r9j(MEpwXSQewE#ToN&RDwMl>+`d7J- z_=L&m=aAJ~UxyPWa%77uwDV3DoBi{{WjMMEg!}pU<2`W#=56!tqaVEm-rzcM0%m%g z?T_xBzZ=~S{SwQ3{5e`eKFKe5v{*KX^YP~>PPX&$heU_*H6Na%;*-Tz-4pZa%Zoiq zy7eewN#>JZFPVDhzivDAxK*4_=V9Baptb3qd$?#m09XzcIFiuy(z|b~xN_e@t2nRx zXrsGDod3EAJe}*RiL6kjuo6tfRFc3lM^_2@zVzSl(^uqiL@B?hreEd0D7AOOu z^_eh2f;3vX`4#y27*IsD89wH-GF`N6eP>Mv$vAKUgMCcln}aC8&IUj}AV>Hc1S^Zz zIiK?B0Ep-i)EbCVf5u+qT|&@VZP^mE7uEa1QRgr5EnI?(|H5tFCCKt`^E$DRVU2^j z9f|Aa%IRc%v2P~_CE;E*kSQ4w)Ggnh7^sABoSuKFpw&#|Qla&wcS8q92P##1?cIg$ zdsU-PoPY)Z_Xl_5G!6hR_Y2z+&aXF`T~DA{msOl!a6AbU^-}ZV3a&eML$UMOccudd zRy4VJ@$3`AW{AA~?qe902(W@!Y%*br+xMO#etP<1=!(+zDCPT=uwe*_nB{ z2*f~zS{ikNZHILkH-08(tpF-sfnFuryURfkBZY!_aVPg8d))90O{u+J1KlsUIm7x{a zK(L*AlavAAScbqq2;?br|5N?cX6ghM3;_$&wza2Tv90|W?{#}Zb&Ab50GPNG@+ytY z=3D*&5dryASHAfH#3UR9&cw*EbS!MsR|Ahux)j=P4A6_+t>0?Ys~LrKeo zzNxvKP-ri<7;HnDbRa|*EyG^=mrxthp4oWm%u7~>z0p~E>5MqP{f)FOAn}-%R*+=s zeH(G`7x`F_i0(+VI%LJsmi-Io0=*!#!pt;OBGFBOlm~L5**xE@28r;T*$iWF8&|$* zAxp+=27-pv0CE``&V#+@l|?G=gvy^OZkVqsQC)0*BX!H;0(^hK9N4SH4f!PP{q%eO z>(IBS7H*rjf8pz>P^wW{R5^B+8HQ)6m**T$ zaQ-jx7dTTrgw-x${Ga|w;eAh2sjNhQ9UqI=AY27(n zXvptb^f-_co{|$2;k;fyrrCrHNpXYs7&L)q5z?4VEb4rI(?Z@0EyppyB|B!&Q=VPuo{r8@X)(D;NL+C z+{fu(JxAzOtsV92r{oq~MAF$q6FODSTIdooQ177@6`2xzLyH~T{K|8b3KOXpv7S)h z&5!fW0s%R!$D8#B;CJnOs-_DtZ5@4)W95OzNowP&tTTis)aK`qn|vU9`a_)H*kCr9 z^<3zY=k>i@q0v8jUZw5H4&1$^!i((JP05CEsMu{%g@FPcV-DU4LQ0=%kBKj~H0|Xa zc8ghGs^WBq>~2T~gL5FYgWR!mUL{J*+##VB0JbNM^MdB*0N>JAzDW`VZj(CydJoOI ze$m2hAKRWx5=z%We%#ZgsNcduP=E@U)P)d*u$Kxh~MA8+4_vsjDD+wQfU+P|MBKVN+=91yth*TPKrykO*;BOdMK zEeEdmRe}VKL-t)rr|BT)@Vh)sRGzieJ|7Z2y-T3Rq;j=_gSYzRnyOF9>^)g`Le`k0 z6J^s*u5ec$nQLpGdDS2l3whX?3kse8`mrqw6{G0&mE|zB{z3e*OT_sRufV5KsIPQ{y;nj~>Sb5qD=x40_$+G_;! zlc+7JE2@2V5yVR+gSQ=KD;o}EnEreuLp75WZ5n8yPX!b*kt=>;{_Bg^Z+T_$dd6{V zdAzOwMko)VO;@|1iDNUW_g*Ua4}4_y&l)* z;5ix!*c{+#1OMo^%Cq^k=jJ~bcx~qaq_h>aq-r2o_Nmw!M~kS^&Lb#HnygRL&Xm#ltB4uBB+QeU0(bQ8?wM=F5-IW6{)a&T&3fe?k> z`h(|wUr0_h1;-zexM-{Br?fx~oBiY(851eN~-7cwtiVt$P8O-u}) zBQq_T{zK2IG%GTJbiI3y&c+0^@@0AO1|Ao!&P#O3CuIb8WF9)t{L3BDYw7%a(K4u> zP#eKUR7*m~CUGI@Mg6W?K#*N+>))N4Nfr?e4V++K4-?JjVSYT^v&eM` z+dFs;yy}TR#=wabzpeZ#tu>^EPcKObS!u|seo@iT0c@9Bu@1Q3UgAkYrWQ z;fvdUc>ZCSJt;PAshnVZt-94%|VO-O;S%( zo`qV~MF#MqCQ6+uYvmBC(QJPC<^S9JZT`RQkL~|77_}nr{J*jPD`oh|#2)x)H|OAVG_}qHv#P_a13TzeB9;2czuh}*)rl?m9b=yS~bYQ58_4K687YixC5&q z^!)%}e|?5tzh;oxI!MC}a@uclS1xtqmMxJRRP6k|_?fn{+9?h)3O8>xe{mVAW*byl za1$OP9i-Nf4Po3M-gzTT?zo-HU>{V)-Gpr5Ad7L(6HnkqF{2arg9#$pzh$=#vOB*U z5TCJexDPCm8|3G3a~Ij>WgN7?a1+$^MjEx4;| z(ERx~hPXlV<_$_n_~P=gC!cuy@%i%-UVL%n@ZtaUU+{)Mwz)EGL`wR|k+``&B{eO9 z8~)Gv#r4Yo@&EgY|NiGcF%m@It`kTS^ZF%_G9qncT1x5&9Gz*&>BFy(z*lG_VzJ9~ z0@%$bpTNSv;HPP&q$H0RPE$)C4yoW??-9vq$uQRYrB;_$xN~PnmtqWXcXRURYc7L`Y>@v4lN~MO@aNwPf6xYMVHKd_(2sdK_=XSp5Xyoj! zMy|npV*m8FpRqMHw63?eZM>{a>|RKskc-qM$Ff}=HFG`q?Zcm;p6$Tmt>9|r&Q*AE3?tbc(ic|8V$s;)U0Ar~I$LRS#peKo}YLvS9i_Ct|k6AB2CM7rABsy3)r(wwx4TKc_~ z(`Ejr)fQ>4Ds#2|I5*YNxarN&oC=~q#j9%0VEgzh%6iYwkzD^`32d)lv0-TyiRC&8 z!J2C#1xB`Mg{BH(9Iml=qFRf^4g;bZucTLz2n#8DtHlycS9@7vMR&OI9xyw_;ua80 z2}Y<*0+v%UL9ch5!{2fb6rJ?)W@I@H+{QM$V*zl3&*+UR(&z17nv0M25hk&>qb~RD zVh6#URouqQp_&2uN`)|$bPRJ!?IIbb_QlQca=n&h*VXAYY~pc=^W`vAxyLJdy!u*`*=gOA zb=-HxBcAqC)XJJLokMJK@hhKi80sfDRpqsvE~~PgJgw4dRRlY5^y~tZs5)N+NQ9Yf zuUA9b8k@-5Jv-XJ_53 zg7CK4x7kSY=#4cv7m3mnX@|W%kg*7*!O{kRf&UQdgtetTkyUG?J%FPjlBQ~Mk(Q%1 zlUrwQ4{goK6QMn|&}u__WEzA7rzbLm_73e)5*$qrhk1X1R{Kd)LF*ByvJkhbBvI2- z(OibbsImDghWZs_(r#$|>pk3sq5i0Jt7`U2FrS(Oo9ToAh(?SrBi29;*tET!Wu6)_ z6d^O?CQQnX;DStFY=pkpq%bk9qUeA$B`D`!UPXgUbu6H5GH~vgH6<@J3LS|w*((!= z0aHAq>4o%Yaui1}J!Pj>_3u=SQe*R6aXJ8!b!cIPypYi*hQ!mX!Lp`5kULrxMTyUw z1T!!}rV~J7xusR!Eig3A+Jd(y@w($Hs?KdGZ{FflacJsSRdu`?9ivq%w*bn*h%qlQ zop_xDn36pep~tHkR5V&0ir7N&NB!iWz+qvme0e7srm8!`cEqs*c%qY(aI{9E~ zVX~!JsY2}A!p2k#K`=|IVX6r3#7<59doENXCLXGxotOAe_(N`pF-g@`T{7}$*DSn2Oy58wi z&Hb}Y@*O@9Y@uIq`C*gs3euBlIE6aR&W(v zL1#)|jWgBLeyB`?-3A zB?LB~%BfR@fCgSJ=fL6CsknA8@<2YrJ}vMLY7A=Y@WQ8WZ^*k4=6UA|&pB|Gb2Xg^ zJ>!Wqi60_C2sI|qRngIY4%7A2%=H7%hf#<614n(wEDK;1S{8hH2d^q`_MY{rRLx#J zW(Z6MMwKF*hNhXYCQ!Yev%a${^*sZIt7xt{i!=!P*s@>)T27`I@!F&X1!VVM;3#JW z_FUIW;M}$$ckn}08!D=56e(I3z?33kQA5Y8qe~7fkr8=BQA0CEp_t<|q-f)WEBH4bTli33tyWN74eFA$0YTm#>Rps(tURt~YO zi4SmJxQr~mel@q0TP!r4HR_9+8dh_~LU9YnH!bICEeCm%$@qQ~O&8Js*i#)|s9vLR zx-8@sovQ`QrZ?&LvlM2x7^Y|V-uZ_Bn7(vcu~4WM9g_H|1nf{(P;`7*q=k^GKCj6K z@0Z0-^Zo4YyWkI+%BxIhtE9KHljf3ox(o^69GL(TAP~W)=~t>$)YVBO8tMcemmjz3Kq)>k9Xf`{UZBYm1x80 zxM4+^hgIz}?N-OyBK1B^SIs`cLP0qo!&8pbUV`9`RLz&z;HvT}ujs=(HO=0AHXnR6 z2lv^QI8w@c9I3=SOLGMbJ=UTxJ5uv~Vii{EWij8k*MGd4IvgqJ>V!GZT(B_!V!&2C zWW*wYBfp$QQh=aktCVhN=))usb>IYAm*FfZ2IK{_Fg+(WuF`ty#%+6n2aJ|>BY-;( zoz&zuH*gGrp@EC5Il%SJv_GN6yXvOc#ny(_7aZI5%kd(NFP{0-XkE|-R6~5$Xn!jS zLZ9GfRCCU)8ExAdT2a0&;b0a*x*{w#IIicuSiB(CFm0snI#xoR90a```^+Le;rOClK0jS8X_q%~v;lE7WBn z-^SA`GEL?^T(JWRs`WtmpsV0h!q!FXd`CFDr+9JRvyEziYVv&mC#{wXrEc0PJ_jj@ z&$g-D2s*0XcrT?~LDTpE+ZiFXH2me4>ySMDOzE8WJ2D5S=LZS5b)na1atMuZq_U zAlT4MuzL<4j@whgNNy{j7Y=tKFHPq2$aG$P8RA_f|rS@mIiOaAYiQby1ed5P zPwby;H{b@EO>auh1-x|?x9##`@l6i88b-lqT($n0dsqKi=-%*T^Mt6F4_hW^6BN-7OmH zxrUuMH3`d$H@ykSY7B4!zeN$X$qk@NZuLQ!wYEa1*6)EF&r^~>PEsyCvg7C;t^p^M z^;Rh11e@4sdt2I8$vKw6#D`0$LBVb{*0!1!xtAGeP*mfA(4$`j6VHU{ncPmCYAgpG z0Z}}N)x#08kt--(wpuiqBEqXN62LmP^l(3E)7Zbv{^0JKT9 zl~5*=^Hb}tJzS;OXj%(6P{|E>YDlQ=JqIS1;UFCbo!nroMx-m`U9Crx3hjC>fRl5f z*>QrK(6%%C!D-o41w`)5oD)d?;=DN`e~Kx-10%UfIdCOJ{)52QOAxfdM9 z_rZ+^KGqb8b_a*&Y@b_R8mgOQ);X6!kyV)HM$Tz2C=>-15U&Q~L6}e05Do9a9Y;Uo zbUSo-pk-1q&wX)O8-hkN9>hpEl3Zq-8P(3kuH#U|ri~mB6OxV-8i-b3Mi!X; zofJ^{G?PFPfpAGRUQuRI8UJ z;Hi*gOL9`OrUL{v^riiZ`E?vRM6@PkNh?YMCweqGXGcxhsVO7Ei%Y|aA*m7RBd+I^ zjq5{(+97Q^9CtW!KX){8m4*dvFpB}w@7pE4D+R=HTlJC&Q6F_hiQRe&F914OSAS|$ zB}Vj>RBZP!Ux9ZSRVcJF_l~0~5HGtOf#(Cb;?u3y>wFiw7wUD$u;W0Ij8vHc9w=~h zoC^r$9va;6;asL$AE%wH<+7d5MXIo3-Ex}g(Bq94BMgDzs8hGhF3LacB8qWjtB4A` z#uBafJrk|)-OyPEJ=VRD6?uYs9mQd49ub#I)gc`*UO4O$?KAuqN@@^^d@o0$~ zJOPmE2||Q$)%t>4N|umvlvmYY9O{tHNT@5Nnfp6CgO=G_O7iOHg%DHNow*aO`ms%4=d^?eLx!W&I5k$2PMAS zEdHq0E3X3J2PNozI7kBC%Y9H%UPU|4e^@S3FD`p~I)j+Oi*b@qy2j*}B(ts1FM@s=SIJ@!#K|AJVD6TNbeNHzXa7aFdQfx9$@qUeZbWuHZiLOXzAT%BcEi^)B?X%6Zyhhy$J?m1@#zITZ)fME5!$oAQQBDanAwl3u4tOk60p0ull& zkKU)G4M@@Sp>u#i9KsE!SZHyX1hUXV$f+i=X5oquDb)&yjAcqZw7-JW z9R)hPi^z9RJ`q;Ry&Fd-mztKGk|IwN!>PTw^pPnk*KwM7H>{F->$&B?pVo57wgMxW z?J@@Hxj%6Gc8%UozhRmb3c1fkPb%?J4rZ)^B;f4VCNyDG?{H}A(n25)# z{dIw+oeiz)ZuQHBnH@N>CEr)%#{^IM0s?T(`*y)pv|w|QmT}A~>DU~p#Ml+QZC%s7 zTykHq#Q3G$X604N#Sg4(b8N*lRfjv}ldUXD#xkzBaIo=6PY4}-6hLpdF0aXB@VT#hDvf$WwF#T8GpY#?gC!H)#efQ^rGD^!33Z>HHBd5; zH8KO6j7>b-kh9Fb)xh!GI&Fwh9i#79G)8xM*PSl&c-Ljx1E(*9u^p9r8(4AHVIyv+ zfIvk)==(blc%FtXmM}(FKlELv4OELX552CJwVht)4_e*aHd|qN6-EOD_1WC?GYviq zfn1~GB=tVYs2mF_v2eYeo$It9=-?97!WI6S7;jG}qmHzSy>dowzno8@KVB{v7E=aR z!FQ}gDn*K{E09bDy>e(Wv}hCvBt?b6n7C{L1&U4_X>C;mAqi{?YIw;fs&;X#Awj5F z2Yoi}s9_b+_=k{J0S-~JERgiO0+Rl%F5nAsvJ<m$cbikozi@`^6oj6saSt+hm_~05c^XY|oSM)`EkHSRQ8PvbkC&CmfN~bIfx;k;Q zL0#SpZFIXAGFu`oqc&8RAqd4*V^gWUc!;ajxs?kuS0A(mfd+FrV~DZL$n8q*F0akv z6F(Vksx)l=vrW|%v|0MRfXWDaaFH446RVLR`G>4YyeHO*Iwk?+Z;4=_Z}$k2?94U zb4!DorU!K(Kbj4Hy$3uw2zjQbqPe0uXfG=7VTJISn=7ggA12lNMEWG}6aP8pQ(jd! zHozBgd>elt$+&ELBd3G0yX;_<*PV@vJ3e<+RDN#BO>=6lyPqiH_Hes(twcK~*qh}z z_|mr}9RQJpWa%SuPf>48)h9B91%#Fd%ut4;rE5hVD;$`??mV!;f7oj(wpb$Fl7}7h zv>JiZDZ+Qtnz}W;H3$TJpG&})rv~Q0x)~F=anmyFli5~C5rNBb2 zllb0svY;XlN4JL27b1Mpx&oSm%y#cRoJ(5@*@O7Tsa@KGcY?c6Q{Lm!S}-w}wgk9U zHIK(Aw51zB4kHOktUN`yd<6x8yl2%yaFVp7Ut4JG#nC~W+Ctn3WAT|$tV9d%&uX-H8IABKiAI6p;R;mT+TfpEuM3@9o;rDr(n zs2GY;M8Qdc-s1jPZd7Yk9|)2|hK6v*DwuN8Y(EB3@`MQpJ!jJDziY=-02G1Ub; zi7p`&3R^iAcBT3g#8fmh%6H{e^2kI8igx8yNQBhudOIs5NXHmzS7_}h-(aa+(^WIq zU*ann>M!+`4)wdqv<={snxXze5X~#s5G4>%20=DH7#K9-9(j;1et(aqsxEW&kTzW_ zIyl=RYm4QeVCRq>#O(nl%coV8T(CT6L-c$ae*>Vnzq5>#jVc;x$=qEvN*yDD=59`s zDNR`isf$Yyp|A_L5qe}Th;6nx->3Rd+@}J z;41pq>VA8F+Xw}qYGW~)|GJsolw5FDPiJ87sijYcA&r8ClA+(f4usCVAg zLQGl4vx-ERar4W&23qq#ZM&43+@)NFps}K7ElL%_^E3pS&F3pL@(Myh^(j;wv4J4{^b5|Ae*{pnHXUlgV6SY&x$iE@-O6 z!{e(s_m)=Zbcp8M+GOJE8#zO9E5tmztSRYU4tlET?CJs|6bZLmu?;o%-FF{nG8YsF zID2s$ZW!3Tlw)38CD+i3C!fg*{gerr*^?gX2Euweq?%&1W2M4%QVk8M{*od6C0F`O z&S-9u{iu}7yNuElqnr3-N`HAk`b*Ym4);V$)A)L$M0UDQ0^}J=mQkxY(QW7W0BY>p zb_X1mwXK9;pj6ee{9q+_|CAZrl-2f79UwmLOqqb2(zY~033bML{I&z{`a;{D<=dbh z4aNWr3RXyN=W6bbXP0k!^A2oKo^#l@)dFd1*rb81xfk?CM;kQcD)0e@+hpP0obF&{ zz40jb0d&Ei$Yu##-{j5*aBT}Re9ut<;XcLK&<_o*xaUB>nzPyi+_uF+(=y$1=d$Mx zejpTbqP@V_&4lCZw>K= zQYMxq?w?@d0=V|R3j1qF6DtBYdOtWhAVN)clZnHv8!GH(qY4`CGT97L&haL(kz38J z72o9Sdi^s^f_wQ{W7BRGG?|LSZAy2nKB#|2*oFaiIvPRn+;azR0Bm*h2Pcr#_J&nW zxc8ph2^;}#@*sh@Kb3P6)d7cb(}p{+XYY^*3gO}qhQWBd$)+!0DENb_%k}Fa7w3XD zR&Zp`fyz+Wod-NMdqeFtXE3^~f>gVm%U3a0sRI>>(K>2Pe_bL*=V+sXg|`iVL;Hj7Xs>{V?`*^ z!h1vEQty?HL7s}n_XGn%9}(i9B~U~~Q!EES;yrS`?q$+&B3*c7TOTx5Q%R&1f0 zPjtpmoplY&#cp$hR;vxw!B4~LB2=Z6hP=*)d}qud&D?S7z^jXQSPbP{I~6YdxlCG!px3#3=y4!v7_$p79fSwALMXjo38W# zhswh}_lCS8u#Rs)2+8@NM6!dD!f?b=vW%S%!oUgzDP<`41f35pdG(<_T2?^7D)M#r zJrEHjeB?fXue9K>o<{o7TTwzG2*A#R93j+7)g0BziV|F`XeU@e7+4F8Ybd}{4+Ih| zD^;8dhO=nF^O1(*FuMaK0I_nHf*QQ~&=QpQpj_~kf(UyOum#s%0101x2$yRyEQUcP zaQpFUkN6oq{)G7T>O&pvH6#FcK#0G|#ESh#aXJ@PE#}THTPrqpFMLUy^tRZjKHCvI z`{kdVxT6QyR39T{9##Y&@1dv)nV}M>i{=Zo2#10P@jle9j2Pm5{K~VTaP*bB5Tjr` zG&ELq-y9UB<)!bAV0cvG+0RfrS(?79+`~xp(jyc~o#h_7QhtVGOW5UH-3*5xs5Rg# zG)7Puk1NyQPVpb6WL#eCB(5$REqN5g%d#I~5$`jzPe9}@NaIRk_n{;^=J6o1WL z7AX}g=cgDIhNfe*Oux+Hz?>?NO_o3U|H&`Ufh?(!0G#L#QfPSw%s#P1CWXCTn|NB@AYNkTP+e~mrBe{% zjZ+9ffwc+}K>)gmL>QgKVHuevv4raVZ6ZAqO`)jyhf*QN)gjx2H(!JhLd zsi#xHC6LLVVJ|DfU9<>GkH|%UuK|j1*VT$}XG{_9<&dagG4MT5Nz#xqJ;>b)<$cgc zI2NQ$BtFninMPGH3cwH!=m755s5#^B?2IHeoUl5O2GEwEBDX%$Afz;Mig%I}Qxwrt z?z*d-QlvM;=&5c9sE{!74j;NN`c^dDx)>bu$x9ZDoj3vkXMOb5_lsfTGK%o5=(%o>GC zqT^5n@VPKKCX!!_#@OhMZS*5l7jQLJj}9dz4a`V%c=bYbS*P972VZIV z@~Q%@P}P+xq^as(BY@e$+uq=1twh;ljU+Fp8fOpBhjbv`222vD6(E@Hp(+Ko(+x!{ z{D*0In0A~_na0`a`4Xl9KO=C_goZ_ZGYK4}Tq1!YQM4?Pc^Z~F?utdfij1QPo0+^$an8=MIh7U`K%)mWF~Z#U6f-*G1L4uC5?N21@U;^kFJ4i>LExHAz=e zY}m$E6L6v~+}T_=7F?VoAXFQ)ey?K-*5;iTjQY2Xq)T1B=Nwzgt0Kx=H9hCt=+sCm zY>{lIQ-y2_-5Xs+Dg(1pg$B1lQ(Z2W3HNN@MoV&m?I(``)8Aw64w_Pkrj!`9*;=Ma z=*KM$F^ZIk$5~~?>sLZjB~!c3kJ7uQr=+Kab+{=b$#t!1sKdQ(*diq9oaTDF1uu%n z-Eo3Gut3^TP|1C|Yd`ec9y}9MY-rs*%~EQ$7dLQfMK}%(3RH4}-P&rYEH2>;=KA#l zZo+P{G)^ljkjQ%rdFASzco;IVyWk}WqxvpL7rKSQx0W8swl)?l(3cVgMv?Xl>q}xI z8K&Sx2JeYNT!Ndk^a$YT{!3gTkGm|OWA|{S#x`6t!Q)f9*2^vA1dC-;W4EAp0)MS{ zj_-Cav#kQ`Ox&L#qD=*{X*ZMw7`9sO5_cYiBHq+WGU{GPUh06(ZWlYemt<|qS0~6u z@{Zu8a?d5LB1~6=WcZczf=FV@YOy47uQnM^Sx(-)A`~v6uizzZ!Q0c<*e!3pxgrD( z({mQ}sZ(Kp31r0%09T9ZR4G+bMNSc^h)Uq7izcW@+gmJrYLt0Bm?ZH8!(^j%QRxa` zH|-}(0V8#77=}h3!ilFzXljC+0g=%x10>RlTTUm!{H9vTQj1EAMAxiTO;i!K%n|}$Hs?eA_h%A~5=Zoox`U?5mTBv)j<($fvjEfJvs^>#2bG-lm2Ifk z=qCEeEb8OCkl4-kTV~Z3y)yZgMe0k_q1e6)A+J!ZbJ*>c(`6yj9~;{WUIL~jsEppH zbbu&TcWFAelgGWyWWf!!n+>gyFQ&uo-00>4M@zMyx(Oz3BXP*~gsT=qsc z_+8@U@bCp3; zP^iyVcv$HXev*sED6S6Ie$E4}EB-)dImiR%ZWQS$M1Q|@I>Qa(smrCuU5!mdi)&nL zUC_4MxY)I+bvN#hbvVt7mX~_Gc3`1ea^3IwE_i}iLaK|yG*B7mT7t0h=5VN@X50&b zJ3xXmtj{aB-^=h}l-V*Y-yiKHz9$Lrqz{98=xJ`6kKYTu3Dv+J0@@uccnKuV0=*6f z$BL>Te4r+d)l9;sbd_nE0St&Xc5P9?`mF|aatRR2WKABwS64`xkO+$Lh+s5a76MJOHNKD!q(N+JT~>z`o< zX6WfhJ?KHsOGBCsc_kx#G#~{;H zcuc*jLOO;Q1~vzaj0f+%hr=Bbm^(c5tONMi)R+)mIF1mF@{mGT}^ z3*VWZJcLQfpQyfr;^!at*7x!{PzO`2p` zh9s*g8%lGbop7zW(4JbQ%w#XkBn`%=BKfE+X&&J$X(wN6me8V=>`Zwp!wQl)>z*j& z-P^;uj}$3Asz@8CgOw$^Nvv}D9PXi>G7s&C@K#HL=vV+?nPRpj7A+y)<;^j400(?? z3=xoN!}03a(99<`0-+ieRgAcX4>rIL2-K&@d_dbt;dOFF@8LRJhTe@EsQhs=>g}IT zZ{5BHZD?5pyVma&%mvZJ)gJ^<6g4fcs+-x08=iLuDwh+Ux@jY4-6S@0?!rylev}eK zc#=YxB`&W*0F-%2%JA~$x`v$}6d9X@1=YZnLz8~eOuK;ma<_A8))$&6_?-u^G3mZG z@{6ak)R=5qKA9`qWiGQui6*Ghci8J0?X4SYLV;-3qV(>TOmy2>$(>zRU<}ob1LoOMD$$6o?8x|TG|$km ziW3%)4H~#+=x)V>wMD?~!T{Er3V=r;outAE{94iFEtn}45N7Fv62>ffD2VFN zMkPxHGc^)*qz(rUnhp)CCPBO6@KNnvH?CCH8y&)Fj|yb#ODd^OjiZPg&1Ke_%mq>| z7HgW_-Plz($=KGwqdOZM>GpXpJ}%$Sg;8am*+E>~REMvX~$R1>EBDLa!uKXLL9 z8x6NyHHG-^P#GzACaUXi!wMvZ`txwtz`uP?ZdnMAqkS-}cDEDnL0t;S>qW9*^z@-Q3+At5A8f*A|vb-5^&o_=Y>U)ZxQ5 z(d1lhXYxY0>A(&DKP5EuN1-9F6CA6N27)+VRl z1p-RN{*3pFTe#{+ix=pPiHSj`FXHG?{W^A7b2W#`n#$b`J9nEF>4Ea2Rto7!sBVG{ zM0d2hw4B?aFKQwYq=p4#-_%$_6SbkbkTP8)131f|(F?M6P3RTVOaW~zGCR24DoSE0 z`P`%8)U+fJwd?k z#QCX?$0Jy+UkUnJ6KWng!xoNB6t2dDx}(Z0r`S29o?33E*|Ca4gSrLJYtspIxOtdi6OS6sOT)sM;VIcHJL+p-!d+e3fZGa*7>3(9 z=x$0mmr#^8ZEpwmUgDuJ<3Wv9%vUH|t)Zu@TMoFn*~$5wnlcfkwzoAy_j8KBZMeG+!reb@ z#xR_!@L((l*szDw9lWI7uljhc5fdiZiOrpaHfjujKdU&0^V#LVo$XhxQ*m;T;%X-e z5p|^V#5ly-^+FRyHG;R` zSS@?s7voKs9Px#=)$-O8Q^7D@0r$m@XNVy};9(XEO=Lr8i=~NgvO64hXlrO{yTu@H z@x^-49f*ZTA(cXNK_QnpZ3c(xP3``Sjo7Hb<82gMaTg=4X#H~*sB9D6ye3FGdjogg zh&!0f3-kw}Fxz#`We4@Ot_9#m(^?JoVn~(PyL-!S-9(l<@Sp~_uBjG{H#S}78=zyy z+ua-`E1cL;)U+EJ!_oUwv@#IMPO*b=b*#;o8esw)son>_q?l5j>HJDM)Ub;U`i>o-;R67cqD)*;{<2tuCsTjwsk{0kf%PNxG zDm?ja3bbAnB-|?cIgAm@L4$dXcK>j>WF%KQ$Ve!_O=jx}S!+%QjJ&Xagd7^;4hsm+ z9}%Q&6_^>fQ{Mv2coIk$*t|f51%kUYG%8S;B`8$(@=%ldO|6v&wEIVD*+AI2lh!~I z?6`GdcPd5wZQ#KZ@-FbMMy}9aPfbHL;TUnPN@_qFTfeN0RX>QP2aQcz(O%UaOQ{yq zfLUSnK`4;auyfxov^R#dqG@+3w=Es_rb79qt;aJeNU5Cimd?a;VUKdI<`4;n^^6M2 zBo`Jq?2Qrj-*0cTzV*TyEjIDMf^G{!pE=a)qrw)e{=U$ZP>6b#; zhQfaO=Juf-%hCIbj0cN&t_Udfk^Pp+*3#~e*RH{$WEqcQM#2!XKN_UR#jA0vPJmn~ z0K<_OgIE_kg!Jg0gc+7URNh((1Bkd_MQ zp6GlJyaW|l3*iYh+;`Ln_(=WAf%nocUS@$TngYB~3xktC*aFjepkSE+sC(D|NBySa z6CP;Hy&gmns=bCT0v3gc{;t_0@+C6WNGZLskkl@+^>zRKPF}|;2&KDl0oPzWNUR|e zSa&53O6;(O&WgrWXmD)LiV&H{nV?P#Gjh8f0oQ`IXB|6$km0Eht62bQfAK`9hV}=F z-O#QXqMD#x2T@d!(t3iflS?l41xv`mQRpBLD-M#+G(1LGLQat4HH3F^s6*0}_XH0T zP#OgdM-W$2B&kct6=kXU+sri1wJbz z6!O|k_%$Lw6a*OZdAfpfPt<~luAmEp`g8@M_81+2|eHUMbpim$yl;`A%&^c=XdO*9kR=(60 zD0maeTP+&EM7>mQ_LSUgV9Yb|NXja1W+q2;Wm3bYAuw02CRR_uduHbNj0Z>Kq#DB3 zK2Yu{@s;3?DJoio+UtN!N|nHV>MGHwCCuJKKtM3!p5}w{3~J%)xi2imRvXTT>o~(R zt2ik9kfEVEpaVErTb7HBt3oWvx+@Od!lKyOeiud18S1|tK;UL}k*VxbwxigODV$GxTX>@v=6 zG&>EpH9}P|I=}K}W$#-HB)YaGC2N|k1w@A#6}~MtcPvp77o8^6b2i6T42|YSx_36+ zy)2djKF5Rl_5yg#Y%w2DW-}R{VyOltzjHAasEWx)AojbWfqh}*@efel-fOEZIp7za zHV!PTFkK2mYn@YVIAy8BQ%OhA`pUMuao-(x(FY^H9o;aP)$o1i0S!V^xc0hn{Bx@~ zBAy(tmIAKEw%rgcIfS(P9u_&7YcFByDz^WtL<1!JVm^+0dPwnrrlT}ENGS`FPJ$GY zAT^|LKFA0_U4sNrTlA*oL?hY0D z3gKNCg3u?Cm|?B(l}2Cb^abS%XBc8<%R@oCb&0jy6STXRxch?k!X#xXOLYflWV1*80xl`8eQ7Hk}2Y zWGEz>F=fisJg&e3oC;CUVuS)a@QNta(QC1GS~fL8P?(-^#|yQn>t0ku!iSI70fIm) zw&ET?kf;C~s)7ol-R#xtVAxsnPp)VV>UHHkFdg6)ZQ8m>?U8nX3#KJ|DYf;`-X7_- z=#C&K>pLR8)(EGDh6@ras9j&X$yD8jtLlseBrH3wr|xC|KA`PhXg3L@>&fm!$xtF0 zN;|wSJSe^JkPksGlbIF3#6jj%Ln+KVn57bLiFZoAL}Jpw(8J^n=o>~bn#%<;$JfZ| zCvgx`9H$Sa@e?+B{ZIHkHbBpukmik41_M(yl0(fiUQ5H!EAS{LYB z32D=>cQ|m-4boX;F+Ai`sU3dpWrk`R+qC#-({8G60@1U{ zT6~ssF9MNdH3tX*Sm5TH7Mt2yYK<7%L{8dTRu>e13fR;{n4cyfVtA$$w^yMdA=GQ} z+`1unsr>Rcu_LSSpc)i^0>=wQAlta57uJfFQVC;KiWQu-bvIhyUVdLy-DG+UwZXXP zAWGHeK{{$8l%=7yy1=@iZ6{3ZsZif0HPnx8S`qZlO=q7sXt4UUp{(YDLTDz@Y1V@{ zMP(zrlC27m0%VO=5M+pLYJwU-XFt~)_kf^|%fpxmF)ZB*l&)eGHw*QqjiW zOx({Nfu#XVU|cL20}@1s=b6BvwqE|%? z4oFJ@@R|LGm7~LqrzVucqrF|>LTZR-@W&yARD)cL^wKDSd_ZO#uT4n7vYiYuh>yNo zx6Oq)8$40ikz?WX%|83&4`g8JE_mroS0~2kgGT|~3(#;Z#q`HOC#7&oKEwp3t7Rq2_^D%!=__;qR9cZjDb2YuMD(ioZ~iYX*51hsQ@`vC*+5 zx{+-^BPg^CjWw6ZSC0Kz*l+nne1qy1};vv6y zX30zL6=}(GemWlSl<|CwyzVjC_D9|1;(CtUjDTwKeY*sIa9{WYMkHO{e>h^>Dmpn}@PT|dDtX+vX0M5SzxZM^9w1aDshWe~_AKww zG0z@TI7SZ!yA$`Xd0mJG@Zgu7o%G2XBf(}ThJtYeY5x{Y2T(XdHd70Cu01dt5o773LDRoE-oc4Tm=0ZV23GhLlt zyWlhtis^Y8q^32}sgJuT!Fc)Oe4k^BM?q{MB-$7P?6zzf>Q`9A)KtNcMC_=FGZr;f z@dsm-cTOy`{4q#jLFWyL}N6<)X%skDU5*uE=eXm62S@(-R?XPv1tTtN6m|dI}dPyPM%c}3}9yTi0%N!z><&4d*lO=h%H5$ zu(dULTIf+?%qeQ8t`3JEs@8U+?WxNxgeh8mFz`X8&=Z;QqPm~p@W(jM(IlAt!^53r zp+gm#_!D0Cl&oA%4eUS2&}6|1fOMS@_4iASO}a&^i0uPSV$@$%COjC7{m}|vNDRR=~RsEI!*51PrjgJ4EB5aM-k9R7?v`TJvZtjGsQ^F0C zxPRtkPAFU?>fa)ZBN-MkY1U{i7gs=_zll5BCN_@dCgH&_;-29cmSsOO43D}GBd69! zbCc~ZTwdrl3lIQ2eP`e^Q*_eLg;D4D>Fh}PF?NQZ3kP0$gd?YNhmSxYON;_S;5jI&$iV2=P>dN6`gQs07c+#olnBc>&6g(<4 zRx~v#bd}fUQ;xM1O%)~4HceGzjM;jXX{7blLGxOYu=6rG^{w~8zgv5Qa-)}5;d}*d9({{amX;L%n$0z+HVo%s&#X`HIoVwktZrmiG`{2C&O`WRzNTjJg2; z62=uN^~Saseh|0|1{3Vy zG<~tiP`PQ1Tn56{^@TO3RYBCOE_pdMA2=JF92rH2)WXyq3ZiND3R@&giDZ$N8;Xdk zs5vNXDF=R!4!Ir>hN2Ki*n)er$RuwQG*NU~(__OnCB>l$BjXZ2&_fH0Oj}>wG+t=h zP0$pTtos&lL3=T>AZSup@GFMApY>Q(xO&Zz>h%PRmN4B|c@IbGs*Y3^SW%`cBP(H% zn#&$^S&Wl$0ZT?&pr@h-3r)3?$E!UN(&UK{tWZ0tki5aM+!LPoJXE!{b0@tyQ;o|{ zgv}DWyyB+FXphzy}XAeH_&vE>!Usp^Crv zs*~W{vaU{fhK=IMQaWgDlsm@(yHfMNB&(l*p>&q2!jn{F{vneOVibbNQ7SSb3tn0Q zYy(2d*;%QVq7F+vt-dIbBUUd{<_xG^Qc9VoneK>Un+wSOXX|k7nJg=#p)#TyvEdG< zi`wS8NyYl2=SrmpV_-4HemRiwdPO&5_BE zq9oLCM}3^JgKMsGD__L^P{fomx?Ry`WYL~A8QGGdij`e`fO!5$$5**#Gy2whINT*5 z%g$HYO5}wiYk@P)X0zlG=_AtE1;rzh(^JXqNXaSJ`II-ye>9heIx?tY<9Y1EAB5`bCD*W#E^|7gzgKYFn*Qqe|>1R|}==H{wknsKc8J%$)cM zghO5Ou4(J_lg#y}%M!a6qKa-(<%hNoZ@_>Dv9^@>)a2@+J2~41TyMiV7@O`q(BZA$ z)3i zR>Dngs+F{9R;q4Sd7v75L&vM3c&X(cNJ%w0kvsU$+m{}_h0@ZIqEhq4G0YkZLRm3L!{f+uf z(kWqPlz9)J*l`2ExCsYC<0EuGLZ+fvYKJIU935U!XCYS+>ny44od$1uq7+S|0Fl;N zB-hC<3^ChvGT-Ntx3#-YVmVjRjqDZ&dTOwdL+wCLghe98q`N-g1CqkD>GfPRt^Bf3 zyRxNx7$C8t+Y!d~#K_iXN3>}PTP(j~i!w=KlWlqQ$rz0HuXIv4yB~-!SvJ{1NFRKT zz>O#va>*!S&0Eol*!M8;!YEevho7Vu5ku7B`Djn8nT#)bMb`mH2tRPSgbq8dqWQep z7a2Ml3C+iFtf1x%ilmZ9Dbu?1z||rWLT!_e62LsY(H(9}bWF&Lq8T2qnC07u$`~c3 z@p#P$osg%5dl-3Pwp!F`F$=uSSsR9NV%CN`4!qbEMXWZuJrOd6X(f8RHlv%-BTqCv z@_12)il^m$$sVsmM4K1TyaJSOhrR`~mG?R!M*8cB?5TeVlJ=wC6OGv=`-9O$50R0q zs}=RTX%q$QValIxM_epDy$0i>j%3-3H6v&;tQ*wPOJaeF0`B8{MW=0^0^&vc*@IjF=%N%%rQK_0m z>hRhf3&yWDEXEtUXs)vzTk^?~d&Tusav;2sixs1~B;OC!3z9}#q1|4zhoIuV z1#O5+f}PW^9)gSC#}DF7zs7(c`lnbxbRc(v1AY}(H}PD}zFk^Bh$N@W{IbofWNG1w zsyfBRoZQY*V;eya71`Xro1W>k0#k7iSrnDF$_sOcj2ViUfHmX_&0_&!1FO@^;-?_a zaHK6ahr>zYrxJvzpx12DnrW((Q7{94MQ@GxDY-6v8sE@Fl$&@Y6cKqC_bjm+TqKKHm^ghh~?MO(D-W;Jy%qY&iUUgO7F0%I6#W@1W2D39FxPkXV=Y2A^*j z{l;woxQ!(>ES%6Vj&G}gL~5|7x7VvN+?)e5R z3SK2{#A2L!z9CgEO3D?>!UCmUrNAkQ5~uhfyuzKTtima|3JO?izj|T&rNpn893&O% zo_dAKV`V?2RmHjk5@F5pvcYTW1QG@UlR!GVeevpWFudv&!Vw@xj2&yPQ?GeVZmHi8 zay#F{dlFB)F0tZ!?RuYySb_4>7b@ND`W4}UVsaDxuhL1zO^wNoqlTQ7`rpS!B0*C` z1TOx6Gy8Lx{R`%L0ixlm;|1<;&D<&knuYKH(F`RJ!Ti{VVF&OdlkEn)FC7B(mJyOu z@b)BLcYIj2h%aKQd?OyTSV}i$m<10^u*MnH1|La{eh($UJYX%uP;?CSn1$)aqf>2` zQXef1bA?d*o|qWEf>1H_NyqkyF}H75>m7DWWJ(6CLCAJ}sjA}~@hc}cFrVo{t?SsM z5sso1O>;ClJK9Mo^}EugsFXF)g`nE4NdCALzato#y~;h2?-d~AM5eV1p&$kZffu+p za?%OUIIbd=1Mr#v_4(~4qrOzXm^0`Ky6WCBvLkplJe;6(f{>!Hv=(yD>92QJ4^12?tUFFc${u5Sdf^M^tHIwLkiY(;nE{Jj;f!rbeyA& zRdYd7ZRBVRa_!#0qnHY5JTe|h$iSoJ9tbB}{_AM>+KXsrT4JRlv({#Oe?{nAw7c8` zZem_OI<7%POFqhj_cqCviirh|uJD|*^|5IFpe?n$3gX&Q{qmXUPBe{c`x1?P2-^z^ z@j%|{f<`-Ve7fQ`6ae(AId|*Q`_R%pnt{l(#~hj--g_AGH;5~7iG*bosxgSTPbzQ} zulQaOsskzo{oC{hZo5thc^8_6NyR)GS9Ad#c9BbPz9dI)`)cq6Isv73wIjZKq&T_m zd0H)ZvGh?F>Gjzk<)8MeGB`&dsj?o={%xzan37DjcnZzb3g1 z_3!nRg~F*5UF zh5PMcRwKds!iGA$FqyIRArw*3kxV>vto5Ncty{Erry}Lkstg;4H$-#0oTbu^dTuv# zo>nDYK<;XkUzqc1z?&A#M;T6baKFo@vyr2zj^HXKmsUgUMh(Vna%^y&h&1 z;#cm8(BaLp*%1&L-9{Z(X?TIoE0PMFxWkPegHK9Q&~BOo4REG|xO@~y?0aiQ7g#r) z-KISaW1-STCH z3O~HNd~&x!3d1#$MK&ACsk(x@`gWaE#^$!Ere#de&E~SFPoFwn<==&uw#tn|;xnWn zJJHx^NemKNT^^!sn|LUZY5(ND(Z~SOGnzy~Rmt~;r6ENZx-^N02$)zYgoeba!iXeK z{ZR)HLcH%biFd$sHhqz)b3$%NQj`c%#SCAADTc4J7ug7aLP(%wC52k&u zRVeVOa*OpK*53*v#AN96zMf?kiejaE?dyK8$w$1j!0|>BNy`WP(y4l>7hdUMl1v8X z1iGd+;fNsF$QX>J(8745CRRP9Rg(^Q!V}91PaQc84&wC=yMtafM3+6>wL{uoSk8%d zJ7-*mCm$8K4p{(8vbRg_n?oTlOp3y3kMfGTQ>Wrx`USnHk2CG|!vvl;-ttpoW|2f(lRn)$%ZkaS!g$I^^e{*Y^74|ni(lpcBHnZARRg|H< z+H-QpqeaC2N%TY|(L`9UOd{KMg%lvaxJlrep90_d6zR=CZKH}_Y**IRsVuBIq00|62%e78`NGDFOQe)!i5;lw!c$6j za_ZY$CpX;5rNV@WSSRW59z--doR*A%KVsH~sf&a-=I)9f0HGKo!-u*H7Pu=VQVGg+ zP5aacoEZ5;3MCV*#KeV>nuf?H-ny;E1wIMWP|L9;IW8ujh+ZHe78oU?31A)G=L^<^ zuUaA?knKivD25TKeaa~5l

Kf&hg6 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

rB(7YtA`&IOUI=} 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 V^#APuJUAfuPqD80KYYUf{2#CQUibh2 literal 0 HcmV?d00001 diff --git a/repository/app-eeprog.lua b/repository/app-eeprog.lua new file mode 100644 index 0000000..6594e73 --- /dev/null +++ b/repository/app-eeprog.lua @@ -0,0 +1,48 @@ +-- This is released into the public domain. +-- No warranty is provided, implied or otherwise. + +-- app-eeprom: Tiny EEPROM flasher +-- Example of a tiny app a user could write relatively quickly if they have NEO system knowledge +-- Note the high amount of synchronous routines used here. +-- For a tiny app like this, it's fine, and KittenOS NEO makes sure it won't interfere. +-- (Plus, this isn't a library, so that's not a concern) +-- Really, in KittenOS NEO, the only program you break is your own + +local event = require("event")(neo) +local neoux = require("neoux")(event, neo) + +local eeprom = neo.requestAccess("c.eeprom") +if eeprom then + eeprom = eeprom.list()() +end +if not eeprom then + error("No EEPROM access") +end + +neoux.startDialog("NOTE: If this program is used improperly, it can require EEPROM replacement.\nOnly use trusted EEPROMs.", "eeprom-flash", true) + +local fd = neoux.fileDialog(false) +if not fd then return end +local eepromCode = fd.read("*a") +fd.close() +eeprom.set(eepromCode) + +neoux.startDialog("The flash was successful - the next dialog can change the label.", "eeprom-flash", true) + +-- text dialog +local done = false +neoux.create(20, 1, "label", neoux.tcwindow(20, 1, { + neoux.tcfield(1, 1, 20, function (nv) + if not nv then + return eeprom.getLabel() + end + eeprom.setLabel(nv) + end) +}, function (w) + w.close() + done = true +end, 0xFFFFFF, 0)) + +while not done do + event.pull() +end diff --git a/repository/list b/repository/list new file mode 100644 index 0000000..669e29d --- /dev/null +++ b/repository/list @@ -0,0 +1,3 @@ +app app-eeprog +This flashes EEPROMs, an example of a package that does not come by default with KittenOS NEO. +end