aboutsummaryrefslogtreecommitdiff
path: root/src/lua
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-10-23 12:23:58 +0800
committerchai <chaifix@163.com>2018-10-23 12:23:58 +0800
commit40fc27154fe754181934dc7ee31375e6bdfb33fc (patch)
tree897ad98d759bc308ef66561181ba88b85f2ccd47 /src/lua
parent1480c9445100075c9e1a894eb07c0ef727b509a1 (diff)
*merge from minimal
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/common/Proxy.h79
-rw-r--r--src/lua/common/Reference.hpp144
-rw-r--r--src/lua/common/common.h1
-rw-r--r--src/lua/common/error.h28
-rw-r--r--src/lua/embed/boot.lua.h (renamed from src/lua/modules/embed/boot.lua.h)93
-rw-r--r--src/lua/embed/embed.h (renamed from src/lua/modules/embed/embed.h)31
-rw-r--r--src/lua/embed/graphics.lua.h46
-rw-r--r--src/lua/embed/keyboard.lua.h (renamed from src/lua/modules/embed/keyboard.lua.h)2
-rw-r--r--src/lua/embed/mouse.lua.h (renamed from src/lua/modules/embed/mouse.lua.h)0
-rw-r--r--src/lua/embed/net.lua.h (renamed from src/lua/modules/embed/net.lua.h)0
-rw-r--r--src/lua/embed/path.lua.h (renamed from src/lua/modules/embed/path.lua.h)0
-rw-r--r--src/lua/jin.cpp110
-rw-r--r--src/lua/jin.h34
-rw-r--r--src/lua/libraries/luax/luax.h88
-rw-r--r--src/lua/luax.h7
-rw-r--r--src/lua/main.cpp44
-rw-r--r--src/lua/modules/audio/audio.cpp203
-rw-r--r--src/lua/modules/audio/source.cpp214
-rw-r--r--src/lua/modules/bit/bit.cpp136
-rw-r--r--src/lua/modules/core/core.cpp74
-rw-r--r--src/lua/modules/embed/graphics.lua.h4
-rw-r--r--src/lua/modules/event/event.cpp192
-rw-r--r--src/lua/modules/filesystem/filesystem.cpp215
-rw-r--r--src/lua/modules/graphics/bitmap.cpp113
-rw-r--r--src/lua/modules/graphics/canvas.cpp108
-rw-r--r--src/lua/modules/graphics/font.cpp49
-rw-r--r--src/lua/modules/graphics/graphics.cpp1157
-rw-r--r--src/lua/modules/graphics/image.cpp89
-rw-r--r--src/lua/modules/graphics/jsl.cpp146
-rw-r--r--src/lua/modules/graphics/page.cpp73
-rw-r--r--src/lua/modules/graphics/shader.cpp135
-rw-r--r--src/lua/modules/graphics/text.cpp32
-rw-r--r--src/lua/modules/graphics/texture.cpp65
-rw-r--r--src/lua/modules/graphics/texture_font.cpp67
-rw-r--r--src/lua/modules/graphics/ttf.cpp73
-rw-r--r--src/lua/modules/graphics/ttfData.cpp51
-rw-r--r--src/lua/modules/jin.cpp104
-rw-r--r--src/lua/modules/jin.h42
-rw-r--r--src/lua/modules/joypad/joypad.cpp28
-rw-r--r--src/lua/modules/keyboard/keyboard.cpp22
-rw-r--r--src/lua/modules/luax.h7
-rw-r--r--src/lua/modules/math/math.cpp44
-rw-r--r--src/lua/modules/mouse/mouse.cpp59
-rw-r--r--src/lua/modules/net/Buffer.cpp242
-rw-r--r--src/lua/modules/net/Buffer.h149
-rw-r--r--src/lua/modules/net/net.cpp17
-rw-r--r--src/lua/modules/net/socket.cpp212
-rw-r--r--src/lua/modules/physics/physics.cpp16
-rw-r--r--src/lua/modules/thread/Thread.cpp419
-rw-r--r--src/lua/modules/thread/Thread.h174
-rw-r--r--src/lua/modules/time/time.cpp54
-rw-r--r--src/lua/modules/types.h35
-rw-r--r--src/lua/resources/font.ttf.h3654
53 files changed, 3554 insertions, 5627 deletions
diff --git a/src/lua/common/Proxy.h b/src/lua/common/Proxy.h
index 8323ead..5ebb5b2 100644
--- a/src/lua/common/Proxy.h
+++ b/src/lua/common/Proxy.h
@@ -3,46 +3,65 @@
#include "Reference.hpp"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- class Proxy
+ namespace Lua
{
- public:
- void bind(RefBase* ref)
- {
- if (ref == nullptr)
- return;
- reference = ref;
- }
- void release()
+ class Proxy
{
- if (reference != nullptr)
+ public:
+ void bind(RefBase* ref)
{
- reference->release();
- reference = nullptr;
+ if (ref == nullptr)
+ return;
+ reference = ref;
}
- }
- template<class T>
- Ref<T>& getRef()
- {
- return *(Ref<T>*) reference;
- }
+ void release()
+ {
+ if (reference != nullptr)
+ {
+ reference->release();
+ reference = nullptr;
+ }
+ }
- const char* getObjectType()
- {
- return reference->type;
- }
+ void retain()
+ {
+ if (reference != nullptr)
+ reference->retain();
+ }
+
+ void setUserdata(void* data)
+ {
+ if (reference != nullptr)
+ reference->setUserdata(data);
+ }
+
+ template<class T>
+ Ref<T>& getRef()
+ {
+ return *(Ref<T>*) reference;
+ }
+
+ template<class T>
+ T* getObject()
+ {
+ Ref<T>& ref = getRef<T>();
+ return ref.getObject();
+ }
+
+ const char* getObjectType()
+ {
+ return reference->type;
+ }
- RefBase* reference;
+ RefBase* reference;
- };
+ };
-} // lua
-} // jin
+ } // namespace Lua
+} // namespace JinEngine
#endif // __JIN_COMMON_PROXY_H \ No newline at end of file
diff --git a/src/lua/common/Reference.hpp b/src/lua/common/Reference.hpp
index feb96bb..ba918bb 100644
--- a/src/lua/common/Reference.hpp
+++ b/src/lua/common/Reference.hpp
@@ -1,78 +1,88 @@
#ifndef __JIN_COMMON_REFERENCE_H
#define __JIN_COMMON_REFERENCE_H
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- /*abstract*/class RefBase
+ namespace Lua
{
- public:
- void retain()
- {
- ++count;
- }
- void release()
+ /*abstract*/class RefBase
{
- if (--count <= 0)
- delete this;
- }
-
- // object type string
- const char* const type;
-
- protected:
- RefBase(void* obj, const char* t)
- : count(1)
- , object(obj)
- , type(t)
- {
- }
-
- RefBase(const RefBase&);
-
- virtual ~RefBase()
- {
- }
-
- void* object;
- int count;
-
- };
-
- template<class T>
- class Ref : public RefBase
- {
- public:
- Ref(T* obj, const char* type)
- : RefBase(obj, type)
+ public:
+ void retain()
+ {
+ ++count;
+ }
+
+ void release()
+ {
+ if (--count <= 0)
+ delete this;
+ }
+
+ // object type string
+ const char* const type;
+
+ void setUserdata(void* data)
+ {
+ userdata = data;
+ }
+
+ void* getUserdata()
+ {
+ return userdata;
+ }
+
+ protected:
+ RefBase(void* obj, const char* t)
+ : count(1)
+ , object(obj)
+ , type(t)
+ {
+ }
+
+ RefBase(const RefBase&);
+
+ virtual ~RefBase()
+ {
+ }
+
+ void* object;
+ int count;
+ void* userdata;
+ };
+
+ template<class T>
+ class Ref : public RefBase
{
- }
-
- ~Ref()
- {
- T* obj = (T*)object;
- delete obj;
- }
-
- T* operator->()
- {
- return (T*)object;
- }
-
- T* getObject()
- {
- return (T*)object;
- }
-
- private:
- Ref(const Ref<T>& ref);
-
- };
-
-}
+ public:
+ Ref(T* obj, const char* type)
+ : RefBase(obj, type)
+ {
+ }
+
+ ~Ref()
+ {
+ T* obj = static_cast<T*>(object);
+ delete obj;
+ }
+
+ T* operator->()
+ {
+ return (T*)object;
+ }
+
+ T* getObject()
+ {
+ return (T*)object;
+ }
+
+ private:
+ Ref(const Ref<T>& ref);
+
+ };
+
+ }
}
#endif \ No newline at end of file
diff --git a/src/lua/common/common.h b/src/lua/common/common.h
index 536b897..0ee72cc 100644
--- a/src/lua/common/common.h
+++ b/src/lua/common/common.h
@@ -3,5 +3,6 @@
#include "Proxy.h"
#include "Reference.hpp"
+#include "error.h"
#endif \ No newline at end of file
diff --git a/src/lua/common/error.h b/src/lua/common/error.h
new file mode 100644
index 0000000..c254486
--- /dev/null
+++ b/src/lua/common/error.h
@@ -0,0 +1,28 @@
+#ifndef __JIN_ERROR_H
+#define __JIN_ERROR_H
+#include "../../luax.h"
+#include "../jin.h"
+#include <string.h>
+
+namespace JinEngine
+{
+namespace Lua
+{
+
+ static const int FORMAT_MSG_BUFFER_SIZE = 2048;
+
+ inline void error(lua_State* L, const char* fmt, ...)
+ {
+ char err[FORMAT_MSG_BUFFER_SIZE + 1] = { 0 };
+ va_list args;
+ va_start(args, fmt);
+ vsnprintf(err + strlen(err), FORMAT_MSG_BUFFER_SIZE, fmt, args);
+ va_end(args);
+ luax_getglobal(L, MODULE_NAME);
+ luax_setfieldstring(L, "error", err);
+ }
+
+}
+}
+
+#endif \ No newline at end of file
diff --git a/src/lua/modules/embed/boot.lua.h b/src/lua/embed/boot.lua.h
index d84ca21..99e657b 100644
--- a/src/lua/modules/embed/boot.lua.h
+++ b/src/lua/embed/boot.lua.h
@@ -1,8 +1,8 @@
/* boot.lua */
static const char* boot_lua = R"(
-jin._argv[2] = jin._argv[2] or '.'
+jin.args[2] = jin.args[2] or '.'
jin.filesystem.init()
-jin.filesystem.mount(jin._argv[2])
+jin.filesystem.mount(jin.args[2])
-------------------------------------------------------------------------
-- Config game
@@ -14,10 +14,11 @@ if jin.filesystem.exist("config.lua") then
end
jin.config.width = jin.config.width or 576
jin.config.height = jin.config.height or 448
-jin.config.vsync = jin.config.vsync or false
-jin.config.title = jin.config.title or ("jin v" .. jin.version())
+jin.config.vsync = jin.config.vsync or true
+jin.config.title = jin.config.title or ("jin v" .. jin.version)
jin.config.resizable = jin.config.resizable or false
jin.config.fullscreen = jin.config.fullscreen or false
+jin.config.fps = jin.config.fps or 60
-------------------------------------------------------------------------
-- Initialize sub systems
@@ -25,6 +26,7 @@ jin.config.fullscreen = jin.config.fullscreen or false
jin.graphics.init(jin.config)
jin.audio.init()
+-- TODO: ϵͳģ
-------------------------------------------------------------------------
-- Default game loop
@@ -36,49 +38,30 @@ local function call(func, ...)
end
end
-jin.core.setHandler = function(handler)
- if handler == nil then
- return
- end
- jin.core.onLoad = handler.onLoad
- jin.core.onEvent = handler.onEvent
- jin.core.onUpdate = handler.onUpdate
- jin.core.onDraw = handler.onDraw
-end
-
function jin.core.run()
call(jin.core.onLoad)
+ jin.graphics.reset()
local dt = 0
local previous = jin.time.second()
local current = previous
while jin.core.running() do
for _, e in pairs(jin.event.poll()) do
- if e.type == "keydown" then
+ if e.type == "KeyDown" then
jin.keyboard.set(e.key, true)
- elseif e.type == "keyup" then
+ elseif e.type == "KeyUp" then
jin.keyboard.set(e.key, false)
end
call(jin.core.onEvent, e)
end
-
previous = current
current = jin.time.second()
dt = current - previous
-
- call(jin.core.onUpdate, dt)
-
- if jin.graphics then
- jin.graphics.unbindCanvas()
- jin.graphics.clear()
- jin.graphics.setColor()
- jin.graphics.setFont()
- call(jin.core.onDraw)
- jin.graphics.present()
- end
-
- if jin.time then
- jin.time.sleep(0.001)
- end
+ call(jin.core.onUpdate, dt)
+ jin.graphics.clear()
+ call(jin.core.onDraw)
+ jin.graphics.present()
+ -- Sleep 1 ms
+ jin.time.sleep(0.001)
end
end
@@ -86,6 +69,17 @@ end
-- No game handler
-------------------------------------------------------------------------
+jin.core.setHandler = function(handler)
+ if handler == nil then
+ return
+ end
+ jin.core.onLoad = handler.onLoad
+ jin.core.onEvent = handler.onEvent
+ jin.core.onUpdate = handler.onUpdate
+ jin.core.onDraw = handler.onDraw
+end
+
+-- TODO: Ĭͼbase64
jin.nogame = {
cs = 64,
sw = jin.graphics.getWidth(),
@@ -103,11 +97,12 @@ jin.nogame = {
nogame.t = nogame.ww - 1
end,
onEvent = function(e)
- if e.type == 'quit' then
+ if e.type == 'Quit' then
jin.core.stop()
end
end,
onUpdate = function(dt)
+ print(dt)
local nogame = jin.nogame
nogame.t = nogame.t + dt * nogame.speed
if nogame.t > nogame.ww2 then
@@ -144,27 +139,29 @@ jin.nogame = {
-------------------------------------------------------------------------
local function onError(msg)
- local tab = ' '
- print("Error:\n" .. msg)
- function jin.core.onEvent(e)
- if e.type == 'quit' then
- jin.core.stop()
+ jin.graphics.reset()
+ jin.graphics.setClearColor(100, 100, 100, 255)
+ jin.graphics.clear()
+ jin.graphics.print("Error:\n" .. msg .. "\n" .. debug.traceback(), 5, 5)
+ jin.graphics.present()
+ while jin.core.running() do
+ for _, e in pairs(jin.event.poll()) do
+ if e.type == "Quit" then
+ jin.core.stop()
+ end
end
- end
- local ww, wh = jin.graphics.getSize()
- function jin.core.onDraw()
- jin.graphics.write("Error: ", 10, 10, 30, 3, 30)
- jin.graphics.write(msg, 10, 50)
- end
+ jin.time.sleep(0.001)
+ end
+ jin.core.quit()
end
local function boot()
if jin.filesystem.exist("main.lua") then
- -- require main game script
+ -- Require main game script
xpcall(function() require"main" end, onError)
- jin.core.run()
+ xpcall(function() jin.core.run() end, onError)
else
- -- no game
+ -- No game
jin.core.setHandler(jin.nogame)
jin.core.run()
end
@@ -175,4 +172,4 @@ end
xpcall(boot, onError)
-)";
+)"; \ No newline at end of file
diff --git a/src/lua/modules/embed/embed.h b/src/lua/embed/embed.h
index 18ed1d8..18373c8 100644
--- a/src/lua/modules/embed/embed.h
+++ b/src/lua/embed/embed.h
@@ -2,14 +2,11 @@
#define __JIN_LUA_EMBED_H
#include <cstring>
-namespace jin
+namespace JinEngine
{
namespace embed
{
- /**
- * embed lua script to context.
- */
#define embed(L, script, name)\
if(luax_loadbuffer(L, script, strlen(script), name) == 0)\
lua_call(L, 0, 0);
@@ -25,25 +22,25 @@ namespace embed
static void boot(lua_State* L)
{
// embed scripts
- #include "graphics.lua.h" // graphics
- #include "keyboard.lua.h" // keyboard
- #include "mouse.lua.h" // mouse
- #include "boot.lua.h" // boot
+ #include "graphics.lua.h"
+ #include "keyboard.lua.h"
+ #include "mouse.lua.h"
+ #include "boot.lua.h"
- // embed scripts
+ // in order
const jin_Embed scripts[] = {
- { "graphics.lua", graphics_lua },
- { "keyboard.lua", keyboard_lua },
- { "mouse.lua", mouse_lua },
- { "boot.lua", boot_lua },
- { 0, 0 }
+ { "graphics.lua", graphics_lua },
+ { "keyboard.lua", keyboard_lua },
+ { "mouse.lua", mouse_lua },
+ { "boot.lua", boot_lua },
+ { 0, 0 }
};
- // load all emebd lua scripts
for (int i = 0; scripts[i].file; ++i)
embed(L, scripts[i].source, scripts[i].file);
}
-}
-}
+
+} // embed
+} // namespace JinEngine
#endif \ No newline at end of file
diff --git a/src/lua/embed/graphics.lua.h b/src/lua/embed/graphics.lua.h
new file mode 100644
index 0000000..5fa5dad
--- /dev/null
+++ b/src/lua/embed/graphics.lua.h
@@ -0,0 +1,46 @@
+/* graphics.lua */
+static const char* graphics_lua = R"(
+jin.graphics = jin.graphics or {}
+
+local default_shader = nil
+local default_shader_source = [[
+#VERTEX_SHADER
+
+Vertex vert(Vertex v)
+{
+ return v;
+}
+
+#END_VERTEX_SHADER
+
+#FRAGMENT_SHADER
+
+Color frag(Color col, Texture tex, Vertex v)
+{
+ return col * texel(tex, v.uv);
+}
+
+#END_FRAGMENT_SHADER
+]]
+
+local _init = jin.graphics.init
+
+jin.graphics.init = function(setting)
+ _init(setting);
+ default_shader = jin.graphics.newShader(default_shader_source)
+ jin.graphics.useShader(default_shader)
+end
+
+jin.graphics.unuseShader = function()
+ jin.graphics.useShader(default_shader)
+end
+
+-- Reset all attributes to default value.
+jin.graphics.reset = function()
+ jin.graphics.setColor(255, 255, 255, 255)
+ jin.graphics.setClearColor(0, 0, 0, 255)
+ jin.graphics.clear()
+ jin.graphics.unsetFont()
+end
+
+)";
diff --git a/src/lua/modules/embed/keyboard.lua.h b/src/lua/embed/keyboard.lua.h
index 77bf3a9..ee8428f 100644
--- a/src/lua/modules/embed/keyboard.lua.h
+++ b/src/lua/embed/keyboard.lua.h
@@ -4,7 +4,7 @@ jin.keyboard = jin.keyboard or {}
local keys = {}
-function jin.keyboard.isDown(k)
+function jin.keyboard.isPressed(k)
return keys[k]
end
diff --git a/src/lua/modules/embed/mouse.lua.h b/src/lua/embed/mouse.lua.h
index 3c222f3..3c222f3 100644
--- a/src/lua/modules/embed/mouse.lua.h
+++ b/src/lua/embed/mouse.lua.h
diff --git a/src/lua/modules/embed/net.lua.h b/src/lua/embed/net.lua.h
index 4d89dc7..4d89dc7 100644
--- a/src/lua/modules/embed/net.lua.h
+++ b/src/lua/embed/net.lua.h
diff --git a/src/lua/modules/embed/path.lua.h b/src/lua/embed/path.lua.h
index 648adf8..648adf8 100644
--- a/src/lua/modules/embed/path.lua.h
+++ b/src/lua/embed/path.lua.h
diff --git a/src/lua/jin.cpp b/src/lua/jin.cpp
new file mode 100644
index 0000000..faae9b2
--- /dev/null
+++ b/src/lua/jin.cpp
@@ -0,0 +1,110 @@
+#include "jin.h"
+#include "lua/modules/luax.h"
+#include "embed/embed.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ extern int luaopen_core(lua_State* L);
+ extern int luaopen_graphics(lua_State* L);
+ extern int luaopen_audio(lua_State* L);
+ extern int luaopen_net(lua_State* L);
+ extern int luaopen_event(lua_State* L);
+ extern int luaopen_time(lua_State* L);
+ extern int luaopen_mouse(lua_State* L);
+ extern int luaopen_keyboard(lua_State* L);
+ extern int luaopen_filesystem(lua_State* L);
+ extern int luaopen_joypad(lua_State* L);
+ extern int luaopen_math(lua_State* L);
+ extern int luaopen_thread(lua_State* L);
+ extern int luaopen_bit(lua_State* L);
+
+ static int l_getversion(lua_State* L)
+ {
+ luax_pushstring(L, VERSION);
+ return 1;
+ }
+
+ static int l_getAuthor(lua_State* L)
+ {
+ luax_pushstring(L, AUTHOR);
+ return 1;
+ }
+
+ static int l_getOS(lua_State* L)
+ {
+ #ifdef _WIN32
+ luax_pushstring(L, "windows");
+ #elif defined __unix__
+ luax_pushstring(L, "unix");
+ #elif defined __APPLE__
+ luax_pushstring(L, "macos");
+ #endif
+ return 1;
+ }
+
+ static int l_revision(lua_State* L)
+ {
+ luax_pushnumber(L, REVISION);
+ return 1;
+ }
+
+ static const luax_Str s[] = {
+ { "version", VERSION },
+ { "author", AUTHOR },
+ { "codename", CODE_NAME },
+ { 0, 0 }
+ };
+
+ static const luax_Num n[] = {
+ { "revision", REVISION },
+ { 0, 0 }
+ };
+
+ /* sub modules */
+ static const luax_Ref mods[] = {
+ { "core", luaopen_core },
+ { "event", luaopen_event },
+ { "graphics", luaopen_graphics },
+ { "time", luaopen_time },
+ { "mouse", luaopen_mouse },
+ { "keyboard", luaopen_keyboard },
+ { "filesystem", luaopen_filesystem },
+ { "net", luaopen_net },
+ { "audio", luaopen_audio },
+ { "joypad", luaopen_joypad },
+ { "math", luaopen_math },
+ { "thread", luaopen_thread },
+ { "bit", luaopen_bit },
+ //{"ai", luaopen_ai },
+ { 0, 0 }
+ };
+
+ /* register jin module, keep it on the top of stack */
+ int luaopen_jin(lua_State* L)
+ {
+ luax_globaltable(L, MODULE_NAME);
+
+ /* register values */
+ luax_setfieldstrings(L, s);
+ luax_setfieldnumbers(L, n);
+
+ /* register submodules */
+ for (int i = 0; mods[i].name; ++i)
+ {
+ mods[i].func(L);
+ luax_setfield(L, -2, mods[i].name);
+ }
+
+ return 1;
+ }
+
+ void boot(lua_State* L)
+ {
+ JinEngine::embed::boot(L);
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/jin.h b/src/lua/jin.h
new file mode 100644
index 0000000..71ad51b
--- /dev/null
+++ b/src/lua/jin.h
@@ -0,0 +1,34 @@
+/**
+* Copyright (C) 2016~2018 chai
+*/
+
+#ifndef __JIN_M_JIN_H
+#define __JIN_M_JIN_H
+#include "luax.h"
+
+#define MODULE_NAME "jin"
+#define CODE_NAME "Side Part"
+#define VERSION "0.1.1"
+#define REVISION_S "101"
+#define REVISION 101
+#define AUTHOR "chai"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ ///
+ /// open jin module.
+ ///
+ int luaopen_jin(lua_State* L);
+
+ ///
+ /// Boot jin.
+ ///
+ void boot(lua_State* L);
+
+ } // namespace JinEngine
+} // namespace Lua
+
+#endif // __JIN_M_JIN_H \ No newline at end of file
diff --git a/src/lua/libraries/luax/luax.h b/src/lua/libraries/luax/luax.h
index 56023b3..fd10737 100644
--- a/src/lua/libraries/luax/luax.h
+++ b/src/lua/libraries/luax/luax.h
@@ -39,13 +39,18 @@
#define luax_dostring luaL_dostring
#define luax_pcall lua_pcall
#define luax_setglobal lua_setglobal
+#define luax_setglobali(L, i, name)\
+lua_pushvalue(L, i);\
+lua_setglobal(L, name);
#define luax_pop lua_pop
#define luax_newtable lua_newtable
#define luax_getglobal lua_getglobal
+
+#define luax_clear(L) lua_settop(L, 0)
/**
*
*/
-#define luax_setglobal_string(L, n, v) (lua_pushstring(L, v), lua_setglobal(L, n))
+#define luax_setglobalstring(L, n, v) (lua_pushstring(L, v), lua_setglobal(L, n))
/**
* Get number of args
@@ -82,6 +87,7 @@ inline bool luax_checkbool(lua_State *L, int numArg)
/**
* Oprating tables.
*/
+/* get value and leaves it on top of stack */
#define luax_rawgetnumber(L, i, k) (lua_rawgeti(L,i, k), lua_tonumber(L, -1))
/**
@@ -104,6 +110,7 @@ inline bool luax_checkbool(lua_State *L, int numArg)
#define luax_pushinteger lua_pushinteger
#define luax_pushboolean lua_pushboolean
#define luax_pushlightuserdata lua_pushlightuserdata
+#define luax_pushnil lua_pushnil
//inline void luax_pushuserdata(lua_State* L, void* p)
//{
@@ -124,37 +131,38 @@ inline bool luax_checkbool(lua_State *L, int numArg)
#define luax_setfield_(T, L, k, v)\
do { lua_push##T(L, v); lua_setfield(L, -2, k); } while (0)
-#define luax_setfield_number(L, k, v) luax_setfield_(number, L, k, v)
-#define luax_setfield_string(L, k, v) luax_setfield_(string, L, k, v)
-#define luax_setfield_bool(L, k, v) luax_setfield_(boolean, L, k, v)
-#define luax_setfield_udata(L, k, v) luax_setfield_(lightuserdata, L, k, v)
-#define luax_setfield_cfunc(L, k, v) luax_setfield_(cfunction, L, k, v)
-#define luax_setfield_fstring(L, k, ...)\
+#define luax_setfieldnumber(L, k, v) luax_setfield_(number, L, k, v)
+#define luax_setfieldinteger(L, k, v) luax_setfield_(integer, L, k, v)
+#define luax_setfieldstring(L, k, v) luax_setfield_(string, L, k, v)
+#define luax_setfieldbool(L, k, v) luax_setfield_(boolean, L, k, v)
+#define luax_setfieldudata(L, k, v) luax_setfield_(lightuserdata, L, k, v)
+#define luax_setfieldcfunc(L, k, v) luax_setfield_(cfunction, L, k, v)
+#define luax_setfieldfstring(L, k, ...)\
do { lua_pushfstring(L, __VA_ARGS__); lua_setfield(L, -2, k); } while (0)
/**
* If nosuch field push a nil at the top of stack.
*/
#define luax_getfield(L, I, N) lua_getfield(L, I, N)
-inline float luax_getfield_number(lua_State* L, int I, const char* N)
+inline float luax_getfieldnumber(lua_State* L, int I, const char* N)
{
luax_getfield(L, I, N);
float n = luax_checknumber(L, -1);
return n;
}
-inline int luax_getfield_integer(lua_State* L, int I, const char* N)
+inline int luax_getfieldinteger(lua_State* L, int I, const char* N)
{
luax_getfield(L, I, N);
int bin = luax_checkinteger(L, -1);
return bin;
}
-inline const char* luax_getfield_string(lua_State* L, int I, const char* N)
+inline const char* luax_getfieldstring(lua_State* L, int I, const char* N)
{
luax_getfield(L, I, N);
const char* str = luax_checkstring(L, -1);
return str;
}
-inline char luax_getfield_bool(lua_State* L, int I, const char* N)
+inline char luax_getfieldbool(lua_State* L, int I, const char* N)
{
luax_getfield(L, I, N);
char bin = lua_toboolean(L, -1);
@@ -164,12 +172,12 @@ inline char luax_getfield_bool(lua_State* L, int I, const char* N)
/**
* Set raw
*/
-#define luax_setraw_(T, L, idx, i, v)\
+#define luax_setraw(T, L, idx, i, v)\
(lua_push##T(L, v), lua_rawseti(L, idx, i))
-#define luax_setraw_string(L, idx, i, v) luax_setraw_(string, L, idx, i, v)
-#define luax_setraw_number(L, idx, i, v) luax_setraw_(number, L, idx, i, v)
-#define luax_setraw_bool(L, idx, i, v) luax_setraw_(boolean, L, idx, i, v)
+#define luax_setrawstring(L, idx, i, v) luax_setraw(string, L, idx, i, v)
+#define luax_setrawnumber(L, idx, i, v) luax_setraw(number, L, idx, i, v)
+#define luax_setrawbool(L, idx, i, v) luax_setraw(boolean, L, idx, i, v)
/**
*
@@ -315,7 +323,7 @@ inline int luax_tableidxlen(lua_State* L, int i)
}
/**
-* Get table hash size
+* Get table hash size
inline int luax_tbalehashlen(lua_State* L, int i)
{
@@ -323,20 +331,20 @@ inline int luax_tbalehashlen(lua_State* L, int i)
*/
/**
-* Get table hash and index size
+* Get table hash and index size
inline int luax_tablelen(lua_State* L, int i)
{
}
*/
-/**
-* Set value i in stack a global value called v, and
-* don't pop it.
-*/
-#define luax_justglobal(L, i, v) (lua_pushvalue(L, i), lua_setglobal(L, v))
+/* create a global tbale and stay it on the top of stack */
+#define luax_globaltable(L, name)\
+lua_newtable(L);\
+lua_pushvalue(L, 1);\
+lua_setglobal(L, name);
-inline int luax_table_insert(lua_State * L, int tindex, int vindex, int pos)
+inline int luax_tableinsert(lua_State * L, int tindex, int vindex, int pos)
{
if (tindex < 0)
tindex = lua_gettop(L) + 1 + tindex;
@@ -363,7 +371,7 @@ inline int luax_table_insert(lua_State * L, int tindex, int vindex, int pos)
/**
* Add the package loader to the package.loaders table.
*/
-inline int luax_register_searcher(lua_State * L, lua_CFunction f, int pos)
+inline int luax_registersearcher(lua_State * L, lua_CFunction f, int pos)
{
lua_getglobal(L, "package");
@@ -376,11 +384,41 @@ inline int luax_register_searcher(lua_State * L, lua_CFunction f, int pos)
return luaL_error(L, "Can't register searcher: package.loaders table does not exist.");
lua_pushcfunction(L, f);
- luax_table_insert(L, -2, -1, pos);
+ luax_tableinsert(L, -2, -1, pos);
lua_pop(L, 3);
return 0;
}
+typedef struct luax_Str
+{
+ const char* name;
+ const char* value;
+} luax_Str;
+
+inline void luax_setfieldstrings(lua_State* L, const luax_Str* strs)
+{
+ for (int i = 0; strs[i].name != 0; ++i)
+ {
+ luax_setfieldstring(L, strs[i].name, strs[i].value);
+ }
+}
+
+typedef struct luax_Num
+{
+ const char* name;
+ float number;
+};
+
+inline void luax_setfieldnumbers(lua_State* L, const luax_Num* strs)
+{
+ for (int i = 0; strs[i].name != 0; ++i)
+ {
+ luax_setfieldnumber(L, strs[i].name, strs[i].number);
+ }
+}
+
+typedef luaL_Reg luax_Ref;
+
#endif // #if LUA_VERSION_NUM == 501
#endif // __LUAX_H \ No newline at end of file
diff --git a/src/lua/luax.h b/src/lua/luax.h
new file mode 100644
index 0000000..89e456e
--- /dev/null
+++ b/src/lua/luax.h
@@ -0,0 +1,7 @@
+#ifndef __JIN_LUA_LUAX_H
+#define __JIN_LUA_LUAX_H
+
+#include "LuaJIT/lua.hpp"
+#include "lua/libraries/luax/luax.h"
+
+#endif \ No newline at end of file
diff --git a/src/lua/main.cpp b/src/lua/main.cpp
new file mode 100644
index 0000000..95862ec
--- /dev/null
+++ b/src/lua/main.cpp
@@ -0,0 +1,44 @@
+#ifdef _WIN32
+ #include <SDL2/SDL_Main.h>
+ #include <direct.h>
+#endif
+
+#include "luax.h"
+#include "jin.h"
+#include "libjin/jin.h"
+#include <Windows.h>
+
+using namespace JinEngine::Lua;
+using namespace JinEngine::Filesystem;
+
+int main(int argc, char* argv[])
+{
+ lua_State* L = luax_newstate();
+
+ /* open lua standard module */
+ luax_openlibs(L);
+ /* open jin module */
+ luaopen_jin(L);
+ /* add args to field */
+ luax_newtable(L);
+ for (int i = 0; i < argc; ++i)
+ luax_setrawstring(L, -2, i + 1, argv[i]);
+ luax_setfield(L, -2, "args");
+ /* push current working directory */
+ /* absolute directory */
+ Buffer cwd = Buffer(1024);
+#ifdef _WIN32
+ _getcwd((char*)&cwd, cwd.size());
+#elif defined __unix__
+#elif defined __APPLE__
+#endif
+ luax_setfieldstring(L, "cwd", (char*)&cwd);
+ luax_clear(L);
+
+ /* boot jin and run it */
+ boot(L);
+
+ luax_close(L);
+
+ return 0;
+} \ No newline at end of file
diff --git a/src/lua/modules/audio/audio.cpp b/src/lua/modules/audio/audio.cpp
index 8e11b88..198323d 100644
--- a/src/lua/modules/audio/audio.cpp
+++ b/src/lua/modules/audio/audio.cpp
@@ -3,108 +3,121 @@
#include "lua/common/common.h"
#include "libjin/jin.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
+ namespace Lua
+ {
- using namespace jin::audio;
- using namespace jin::filesystem;
+ using namespace JinEngine::Audio;
+ using namespace JinEngine::Filesystem;
- typedef SDLAudio Audio;
- typedef SDLSource Source;
+ typedef SDLAudio Audio;
+ typedef SDLSource Source;
- static int l_init(lua_State* L)
- {
- Audio::Setting setting;
- setting.samplerate = 44100;
- setting.samples = 44100;
- if (!Audio::get()->init(&setting))
+ static int l_init(lua_State* L)
{
- luax_error(L, "could not init audio");
- luax_pushboolean(L, false);
+ Audio::Setting setting;
+ setting.samplerate = 44100;
+ setting.samples = 44100;
+ if (!Audio::get()->init(&setting))
+ {
+ luax_error(L, "could not init audio");
+ luax_pushboolean(L, false);
+ return 1;
+ }
+ luax_pushboolean(L, true);
return 1;
}
- luax_pushboolean(L, true);
- return 1;
- }
-
- static int l_play(lua_State* L)
- {
- Audio::get()->play();
- return 0;
- }
-
- static int l_stop(lua_State* L)
- {
- Audio::get()->stop();
- return 0;
- }
-
- static int l_pause(lua_State* L)
- {
- Audio::get()->pause();
- return 0;
- }
-
- static int l_resume(lua_State* L)
- {
- Audio::get()->resume();
- return 0;
- }
-
- static int l_setVolume(lua_State* L)
- {
- float volume = luax_checknumber(L, 1);
- Audio::get()->setVolume(volume);
- return 0;
- }
-
- static int l_newSource(lua_State* L)
- {
- Filesystem* fs = Filesystem::get();
- const char* f = luax_checkstring(L, 1);
- if (!fs->exists(f))
+
+ static int l_play(lua_State* L)
+ {
+ Audio::get()->play();
+ return 0;
+ }
+
+ static int l_stop(lua_State* L)
+ {
+ Audio::get()->stop();
+ return 0;
+ }
+
+ static int l_pause(lua_State* L)
+ {
+ Audio::get()->pause();
+ return 0;
+ }
+
+ static int l_resume(lua_State* L)
+ {
+ Audio::get()->resume();
+ return 0;
+ }
+
+ static int l_setVolume(lua_State* L)
+ {
+ float volume = luax_checknumber(L, 1);
+ Audio::get()->setVolume(volume);
+ return 0;
+ }
+
+ static int l_newSource(lua_State* L)
{
- printf("Error: no such image %s\n", f);
- exit(1);
+ AssetDatabase* fs = AssetDatabase::get();
+ const char* f = luax_checkstring(L, 1);
+ Buffer b;
+ if (!fs->exists(f))
+ {
+ error(L, "No such image %s", f);
+ goto fail;
+ }
+ if (!fs->read(f, b))
+ {
+ error(L, "Failed to read source file %s", f);
+ goto fail;
+ }
+ Source* src = Source::createSource((void*)&b, b.size());
+ if (src == nullptr)
+ {
+ error(L, "Failed to decode source file %s", f);
+ goto fail;
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_AUDIO_SOURCE, sizeof(Proxy));
+ proxy->bind(new Ref<Source>(src, JIN_AUDIO_SOURCE));
+ return 1;
+ fail:
+ luax_pushnil(L);
+ return 1;
}
- Buffer b;
- fs->read(f, &b);
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_AUDIO_SOURCE, sizeof(Proxy));
- Source* src = Source::createSource(b.data, b.size);
- proxy->bind(new Ref<Source>(src, JIN_AUDIO_SOURCE));
- return 1;
- }
- static int l_destroy(lua_State* L)
- {
- Audio* audio = Audio::get();
- audio->quit();
- return 0;
- }
-
- static const luaL_Reg f[] = {
- { "init", l_init },
- { "play", l_play },
- { "stop", l_stop },
- { "pause", l_pause },
- { "resume", l_resume },
- { "setVolume", l_setVolume },
- { "newSource", l_newSource },
- { "destroy", l_destroy },
- { 0, 0 }
- };
-
- extern int luaopen_Source(lua_State* L);
-
- int luaopen_audio(lua_State* L)
- {
- luaopen_Source(L);
-
- luax_newlib(L, f);
-
- return 1;
- }
-}
-} \ No newline at end of file
+ static int l_destroy(lua_State* L)
+ {
+ Audio* audio = Audio::get();
+ audio->quit();
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "init", l_init },
+ { "play", l_play },
+ { "stop", l_stop },
+ { "pause", l_pause },
+ { "resume", l_resume },
+ { "setVolume", l_setVolume },
+ { "newSource", l_newSource },
+ { "destroy", l_destroy },
+ { 0, 0 }
+ };
+
+ extern int luaopen_Source(lua_State* L);
+
+ int luaopen_audio(lua_State* L)
+ {
+ luaopen_Source(L);
+
+ luax_newlib(L, f);
+
+ return 1;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/audio/source.cpp b/src/lua/modules/audio/source.cpp
index 1953121..bf43ceb 100644
--- a/src/lua/modules/audio/source.cpp
+++ b/src/lua/modules/audio/source.cpp
@@ -3,114 +3,114 @@
#include "lua/common/common.h"
#include "lua/modules/types.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- using namespace jin::audio;
-
- typedef Ref<Source>& SourceRef;
-
- static inline SourceRef checkSource(lua_State* L)
+ namespace Lua
{
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE);
- return proxy->getRef<Source>();
- }
- static int l_play(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- ref->play();
- return 0;
- }
-
- static int l_stop(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- ref->stop();
- return 0;
- }
-
- static int l_pause(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- ref->pause();
- return 0;
- }
-
- static int l_rewind(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- ref->rewind();
- return 0;
- }
-
- static int l_resume(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- ref->resume();
- return 0;
- }
-
- static int l_isStop(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- bool isStop = ref->isStopped();
- luax_pushboolean(L, isStop);
- return 1;
- }
-
- static int l_isPaused(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- bool isPaused = ref->isPaused();
- luax_pushboolean(L, isPaused);
- return 1;
- }
-
- static int l_setVolume(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- float volume = luax_checknumber(L, 2);
- ref->setVolume(volume);
- return 0;
- }
-
- static int l_setLoop(lua_State* L)
- {
- SourceRef ref = checkSource(L);
- bool loop = luax_checkbool(L, 2);
- ref->setLoop(loop);
- return 0;
- }
-
- static int l_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE);
- proxy->release();
- return 0;
- }
-
- static const luaL_Reg f[] = {
- { "__gc", l_gc },
- { "play", l_play },
- { "stop", l_stop },
- { "pause", l_pause },
- { "resume", l_resume },
- { "rewind", l_rewind },
- { "isStop", l_isStop },
- { "isPaused", l_isPaused },
- { "setVolume", l_setVolume },
- { "setLoop", l_setLoop },
- { 0, 0 }
- };
+ using namespace JinEngine::Audio;
+
+ typedef Ref<Source>& SourceRef;
+
+ static inline SourceRef checkSource(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE);
+ return proxy->getRef<Source>();
+ }
+
+ static int l_play(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ ref->play();
+ return 0;
+ }
+
+ static int l_stop(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ ref->stop();
+ return 0;
+ }
+
+ static int l_pause(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ ref->pause();
+ return 0;
+ }
+
+ static int l_rewind(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ ref->rewind();
+ return 0;
+ }
+
+ static int l_resume(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ ref->resume();
+ return 0;
+ }
+
+ static int l_isStop(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ bool isStop = ref->isStopped();
+ luax_pushboolean(L, isStop);
+ return 1;
+ }
+
+ static int l_isPaused(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ bool isPaused = ref->isPaused();
+ luax_pushboolean(L, isPaused);
+ return 1;
+ }
+
+ static int l_setVolume(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ float volume = luax_checknumber(L, 2);
+ ref->setVolume(volume);
+ return 0;
+ }
+
+ static int l_setLoop(lua_State* L)
+ {
+ SourceRef ref = checkSource(L);
+ bool loop = luax_checkbool(L, 2);
+ ref->setLoop(loop);
+ return 0;
+ }
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_AUDIO_SOURCE);
+ proxy->release();
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "play", l_play },
+ { "stop", l_stop },
+ { "pause", l_pause },
+ { "resume", l_resume },
+ { "rewind", l_rewind },
+ { "isStop", l_isStop },
+ { "isPaused", l_isPaused },
+ { "setVolume", l_setVolume },
+ { "setLoop", l_setLoop },
+ { 0, 0 }
+ };
- int luaopen_Source(lua_State* L)
- {
- luax_newtype(L, JIN_AUDIO_SOURCE, f);
- return 0;
- }
-
-} // lua
-} // jin \ No newline at end of file
+ int luaopen_Source(lua_State* L)
+ {
+ luax_newtype(L, JIN_AUDIO_SOURCE, f);
+ return 0;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/bit/bit.cpp b/src/lua/modules/bit/bit.cpp
index 5b18125..cedd60a 100644
--- a/src/lua/modules/bit/bit.cpp
+++ b/src/lua/modules/bit/bit.cpp
@@ -2,83 +2,83 @@
#include "libjin/jin.h"
#include <cstdlib>
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- static int l_and(lua_State* L)
+ namespace Lua
{
- int a = luax_checkinteger(L, 1);
- int b = luax_checkinteger(L, 2);
- luax_pushinteger(L, a & b);
- return 1;
- }
- static int l_or(lua_State* L)
- {
- int a = luax_checkinteger(L, 1);
- int b = luax_checkinteger(L, 2);
- luax_pushinteger(L, a | b);
- return 1;
- }
+ static int l_and(lua_State* L)
+ {
+ int a = luax_checkinteger(L, 1);
+ int b = luax_checkinteger(L, 2);
+ luax_pushinteger(L, a & b);
+ return 1;
+ }
- static int l_xor(lua_State* L)
- {
- int a = luax_checkinteger(L, 1);
- int b = luax_checkinteger(L, 2);
- luax_pushinteger(L, a ^ b);
- return 1;
- }
+ static int l_or(lua_State* L)
+ {
+ int a = luax_checkinteger(L, 1);
+ int b = luax_checkinteger(L, 2);
+ luax_pushinteger(L, a | b);
+ return 1;
+ }
- static int l_not(lua_State* L)
- {
- int n = luax_checkinteger(L, 1);
- luax_pushinteger(L, ~n);
- return 1;
- }
+ static int l_xor(lua_State* L)
+ {
+ int a = luax_checkinteger(L, 1);
+ int b = luax_checkinteger(L, 2);
+ luax_pushinteger(L, a ^ b);
+ return 1;
+ }
- static int l_lshift(lua_State* L)
- {
- int a = luax_checkinteger(L, 1);
- int b = luax_checkinteger(L, 2);
- luax_pushinteger(L, a << b);
- return 1;
- }
+ static int l_not(lua_State* L)
+ {
+ int n = luax_checkinteger(L, 1);
+ luax_pushinteger(L, ~n);
+ return 1;
+ }
- static int l_rshift(lua_State* L)
- {
- int a = luax_checkinteger(L, 1);
- int b = luax_checkinteger(L, 2);
- luax_pushinteger(L, a >> b);
- return 1;
- }
+ static int l_lshift(lua_State* L)
+ {
+ int a = luax_checkinteger(L, 1);
+ int b = luax_checkinteger(L, 2);
+ luax_pushinteger(L, a << b);
+ return 1;
+ }
- static int l_include(lua_State* L)
- {
- int a = luax_checkinteger(L, 1);
- int b = luax_checkinteger(L, 2);
- luax_pushboolean(L, (a & b) == b);
- return 1;
- }
+ static int l_rshift(lua_State* L)
+ {
+ int a = luax_checkinteger(L, 1);
+ int b = luax_checkinteger(L, 2);
+ luax_pushinteger(L, a >> b);
+ return 1;
+ }
- static const luaL_Reg f[] = {
- { "bAnd", l_and },
- { "bOr" , l_or },
- { "bXor", l_xor },
- { "bNot", l_not },
- { "bLs", l_lshift },
- { "bRs", l_rshift },
- { "bInc", l_include },
- { 0, 0 }
- };
+ static int l_include(lua_State* L)
+ {
+ int a = luax_checkinteger(L, 1);
+ int b = luax_checkinteger(L, 2);
+ luax_pushboolean(L, (a & b) == b);
+ return 1;
+ }
- int luaopen_bit(lua_State* L)
- {
- luax_newlib(L, f);
+ static const luaL_Reg f[] = {
+ { "bAnd", l_and },
+ { "bOr" , l_or },
+ { "bXor", l_xor },
+ { "bNot", l_not },
+ { "bLs", l_lshift },
+ { "bRs", l_rshift },
+ { "bInc", l_include },
+ { 0, 0 }
+ };
+
+ int luaopen_bit(lua_State* L)
+ {
+ luax_newlib(L, f);
- return 1;
- }
+ return 1;
+ }
-}
-} \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/core/core.cpp b/src/lua/modules/core/core.cpp
index 0243554..a576bec 100644
--- a/src/lua/modules/core/core.cpp
+++ b/src/lua/modules/core/core.cpp
@@ -1,44 +1,46 @@
#include "lua/modules/luax.h"
#include "libjin/jin.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
- using namespace jin::core;
-
- static int l_running(lua_State* L)
+ namespace Lua
{
- static Game* game = Game::get();
- bool running = game->running();
- luax_pushboolean(L, running);
- return 1;
- }
- static int l_stop(lua_State* L)
- {
- Game::get()->stop();
- return 0;
- }
+ using namespace JinEngine::Core;
- static int l_quit(lua_State* L)
- {
- Game::get()->quit();
- return 0;
- }
-
- static const luaL_Reg f[] = {
- {"running", l_running },
- {"stop", l_stop },
- {"quit", l_quit },
- {0, 0 }
- };
-
- int luaopen_core(lua_State* L)
- {
- luax_newlib(L, f);
+ static int l_running(lua_State* L)
+ {
+ static Game* game = Game::get();
+ bool running = game->running();
+ luax_pushboolean(L, running);
+ return 1;
+ }
+
+ static int l_stop(lua_State* L)
+ {
+ Game::get()->stop();
+ return 0;
+ }
+
+ static int l_quit(lua_State* L)
+ {
+ Game::get()->quit();
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "running", l_running },
+ { "stop", l_stop },
+ { "quit", l_quit },
+ { 0, 0 }
+ };
+
+ int luaopen_core(lua_State* L)
+ {
+ luax_newlib(L, f);
+
+ return 1;
+ }
- return 1;
- }
-}
-} \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/embed/graphics.lua.h b/src/lua/modules/embed/graphics.lua.h
deleted file mode 100644
index 1414efc..0000000
--- a/src/lua/modules/embed/graphics.lua.h
+++ /dev/null
@@ -1,4 +0,0 @@
-/* graphics.lua */
-static const char* graphics_lua = R"(
-jin.graphics = jin.graphics or {}
-)";
diff --git a/src/lua/modules/event/event.cpp b/src/lua/modules/event/event.cpp
index af9f8fc..9f565d0 100644
--- a/src/lua/modules/event/event.cpp
+++ b/src/lua/modules/event/event.cpp
@@ -4,103 +4,127 @@
#include "lua/modules/luax.h"
#include "libjin/jin.h"
-namespace jin
-{
-namespace lua
+namespace JinEngine
{
+ namespace Lua
+ {
- using namespace jin::input;
+ using namespace JinEngine;
+ using namespace JinEngine::Input;
- /**
- * Load event poll, return a iterator(a table).
- */
- static int l_event_poll(lua_State *L)
- {
- // table to store events
- luax_newtable(L);
- static Event e;
- int i = 1;
- poll:
- while (pollEvent(&e))
+ /**
+ * Load event poll, return a iterator(a table).
+ */
+ static int l_event_poll(lua_State *L)
{
- // each event is a table
+ /* table to store events */
luax_newtable(L);
- switch (e.type)
+ static Event e;
+ int i = 1;
+ poll:
+ while (pollEvent(&e))
{
- case EventType::QUIT:
- luax_setfield_string(L, "type", "quit");
- break;
+ /**
+ * TODO: ڴСıʱҪtransform
+ *
+ */
+ luax_newtable(L);
+ switch (e.type)
+ {
+ case EventType::QUIT:
+ luax_setfieldstring(L, "type", "Quit");
+ break;
- case EventType::KEY_DOWN:
- luax_setfield_string(L, "type", "keydown");
- luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym));
- break;
-
- case EventType::KEY_UP:
- luax_setfield_string(L, "type", "keyup");
- luax_setfield_string(L, "key", getKeyName(e.key.keysym.sym));
- break;
+ case EventType::KEY_DOWN:
+ case EventType::KEY_UP:
+ luax_setfieldstring(L, "type", e.type == EventType::KEY_DOWN ? "KeyDown" : "KeyUp");
+ luax_setfieldstring(L, "key", getKeyName(e.key.keysym.sym));
+ break;
- case EventType::MOUSE_MOTION:
- luax_setfield_string(L, "type", "mousemotion");
- luax_setfield_number(L, "x", e.motion.x);
- luax_setfield_number(L, "y", e.motion.y);
- break;
+ case EventType::MOUSE_MOTION:
+ luax_setfieldstring(L, "type", "MouseMotion");
+ luax_setfieldnumber(L, "x", e.motion.x);
+ luax_setfieldnumber(L, "y", e.motion.y);
+ break;
- case EventType::MOUSE_BUTTON_DOWN:
- luax_setfield_string(L, "type", "mousebuttondown");
- luax_setfield_string(L, "button", getButtonName(e.button.button));
- luax_setfield_number(L, "x", e.button.x);
- luax_setfield_number(L, "y", e.button.y);
- break;
+ case EventType::MOUSE_BUTTON_DOWN:
+ case EventType::MOUSE_BUTTON_UP:
+ luax_setfieldstring(L, "type", e.type == EventType::MOUSE_BUTTON_DOWN ? "MouseButtonDown" : "MouseButtonUp");
+ luax_setfieldstring(L, "button", getButtonName(e.button.button));
+ luax_setfieldnumber(L, "x", e.button.x);
+ luax_setfieldnumber(L, "y", e.button.y);
+ break;
- case EventType::MOUSE_BUTTON_UP:
- luax_setfield_string(L, "type", "mousebuttonup");
- luax_setfield_string(L, "button", getButtonName(e.button.button));
- luax_setfield_number(L, "x", e.button.x);
- luax_setfield_number(L, "y", e.button.y);
- break;
+ case EventType::MOUSE_WHEEL:
+ luax_setfieldstring(L, "type", "Wheel");
+ if(e.wheel.x == -1)
+ luax_setfieldstring(L, "x", "Left");
+ else if(e.wheel.x == 1)
+ luax_setfieldstring(L, "x", "Right");
+ else
+ luax_setfieldstring(L, "x", "None");
+ if (e.wheel.y == -1)
+ luax_setfieldstring(L, "y", "Near");
+ else if (e.wheel.y == 1)
+ luax_setfieldstring(L, "y", "Far");
+ else
+ luax_setfieldstring(L, "y", "None");
+ break;
- case EventType::MOUSE_WHEEL:
- luax_setfield_string(L, "type", "wheel");
- if(e.wheel.x == -1)
- luax_setfield_string(L, "x", "left");
- else if(e.wheel.x == 1)
- luax_setfield_string(L, "x", "right");
- else
- luax_setfield_string(L, "x", "none");
- if (e.wheel.y == -1)
- luax_setfield_string(L, "y", "near");
- else if (e.wheel.y == 1)
- luax_setfield_string(L, "y", "far");
- else
- luax_setfield_string(L, "y", "none");
- break;
-
- default:
- /* ignore other events */
- luax_pop(L, 1); // pop table out
- goto poll;
- break;
+ case EventType::JOYBUTTONDOWN:
+ case EventType::JOYBUTTONUP:
+ luax_setfieldstring(L, "type", e.type == EventType::JOYBUTTONDOWN ? "JoyButtonDown" : "JoyButtonUp");
+ luax_setfieldinteger(L, "which", e.jbutton.which);
+ luax_setfieldstring(L, "button", Input::getJoyButtonName(e.jbutton.button));
+ break;
+
+ case EventType::JOYAXISMOTION:
+ luax_setfieldstring(L, "type", "JoyAxisMotion");
+ luax_setfieldinteger(L, "which", e.jaxis.which);
+ luax_setfieldfstring(L, "axis", Input::getJoyAxisName(e.jaxis.axis));
+ break;
+
+ case EventType::JOYBALLMOTION:
+ case EventType::JOYHATMOTION:
+
+ case EventType::JOYDEVICEADDED:
+ case EventType::JOYDEVICEREMOVED:
+ luax_setfieldfstring(L, "type", e.type == EventType::JOYDEVICEADDED ? "JoyDeviceAdded" : "JoyDeviceRemoved");
+ luax_setfieldinteger(L, "which", e.jdevice.which);
+ break;
+
+ //https://stackoverflow.com/questions/50022316/what-is-sdl-joystick-and-what-is-sdl-gamecontroller-what-are-the-relationships
+ case EventType::CONTROLLERBUTTONDOWN:
+ case EventType::CONTROLLERBUTTONUP:
+
+
+ case EventType::CONTROLLERAXISMOTION:
+
+
+ default:
+ /* ignore other events */
+ luax_pop(L, 1); // pop table out
+ goto poll;
+ break;
+ }
+ luax_rawseti(L, -2, i++);
}
- luax_rawseti(L, -2, i++);
+ return 1;
}
- return 1;
- }
- static const luaL_Reg f[] = {
- { "poll", l_event_poll },
- { 0, 0 }
- };
+ static const luaL_Reg f[] = {
+ { "poll", l_event_poll },
+ { 0, 0 }
+ };
- /**
- * load event module
- */
- int luaopen_event(lua_State* L)
- {
- luax_newlib(L, f);
- return 1;
- }
+ /**
+ * load event module
+ */
+ int luaopen_event(lua_State* L)
+ {
+ luax_newlib(L, f);
+ return 1;
+ }
-} // lua
-} // jin \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/filesystem/filesystem.cpp b/src/lua/modules/filesystem/filesystem.cpp
index 55f4c06..7466ce8 100644
--- a/src/lua/modules/filesystem/filesystem.cpp
+++ b/src/lua/modules/filesystem/filesystem.cpp
@@ -2,136 +2,139 @@
#include "libjin/jin.h"
#include <string>
-using namespace jin::filesystem;
+using namespace JinEngine::Filesystem;
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- static struct
+ namespace Lua
{
- Filesystem* fs;
- } context;
- static int l_init(lua_State* L)
- {
- context.fs = Filesystem::get();
- return 0;
- }
-
- /**
- * set current game root, like
- * C:/jin/games/tank/
- */
- static int l_mount(lua_State* L)
- {
- const char* path = luax_checkstring(L, 1);
- context.fs->mount(path);
- return 0;
- }
-
- /**
- *
- */
- static int l_isDir(lua_State *L)
- {
- const char* path = luax_checkstring(L, 1);
- int r = context.fs->isDir(path);
- luax_pushboolean(L, r);
- return 1;
- }
-
- /**
- *
- */
- static int l_exist(lua_State * L)
- {
- const char* path = luax_checkstring(L, 1);
- int r = context.fs->exists(path);
- luax_pushboolean(L, r);
- return 1;
- }
+ static struct
+ {
+ AssetDatabase* fs;
+ } context;
- static int l_isdir(lua_State* L)
- {
- const char* path = luax_checkstring(L, 1);
- int r = context.fs->isDir(path);
- luax_pushboolean(L, r);
- return 1;
- }
-
- // load but dont run it
- static int loadf(lua_State* L)
- {
- const char* filename = lua_tostring(L, -1);
- Buffer bf;
- context.fs->read(filename, &bf);
- luax_loadbuffer(L, (const char*)bf.data, bf.size, filename);
- return 1;
- }
-
- static int loader(lua_State* L)
- {
- const char * filename = lua_tostring(L, -1);
+ static int l_init(lua_State* L)
+ {
+ context.fs = AssetDatabase::get();
+ return 0;
+ }
- std::string tmp(filename);
- tmp += ".lua";
+ static int l_mount(lua_State* L)
+ {
+ const char* path = luax_checkstring(L, 1);
+ context.fs->mount(path);
+ return 0;
+ }
- int size = tmp.size();
+ static int l_exist(lua_State * L)
+ {
+ const char* path = luax_checkstring(L, 1);
+ int r = context.fs->exists(path);
+ luax_pushboolean(L, r);
+ return 1;
+ }
- for (int i = 0; i<size - 4; ++i)
+ static int l_isDir(lua_State* L)
{
- if (tmp[i] == '.')
- {
- tmp[i] = '/';
- }
+ const char* path = luax_checkstring(L, 1);
+ int r = context.fs->isDir(path);
+ luax_pushboolean(L, r);
+ return 1;
}
- if (context.fs->exists(tmp.c_str()))
+ static int l_isFile(lua_State* L)
{
- lua_pop(L, 1);
- lua_pushstring(L, tmp.c_str());
- return loadf(L);
+ const char* path = luax_checkstring(L, 1);
+ int r = context.fs->isFile(path);
+ luax_pushboolean(L, r);
+ return 1;
}
- tmp = filename;
- size = tmp.size();
- for (int i = 0; i<size; ++i)
+ static int loadbuffer(lua_State* L)
{
- if (tmp[i] == '.')
- tmp[i] = '/';
+ const char* filename = lua_tostring(L, -1);
+ Buffer bf;
+ context.fs->read(filename, bf);
+ luax_loadbuffer(L, (const char*)&bf, bf.size(), filename);
+ return 1;
}
- if (context.fs->isDir(tmp.c_str()))
+ static int loader(lua_State* L)
{
- tmp += "/init.lua";
+ const char * filename = lua_tostring(L, -1);
+
+ std::string tmp(filename);
+ tmp += ".lua";
+
+ int size = tmp.size();
+
+ for (int i = 0; i<size - 4; ++i)
+ {
+ if (tmp[i] == '.')
+ {
+ tmp[i] = '/';
+ }
+ }
+
if (context.fs->exists(tmp.c_str()))
{
lua_pop(L, 1);
lua_pushstring(L, tmp.c_str());
- return loadf(L);
+ return loadbuffer(L);
+ }
+
+ tmp = filename;
+ size = tmp.size();
+ for (int i = 0; i<size; ++i)
+ {
+ if (tmp[i] == '.')
+ tmp[i] = '/';
}
- }
- lua_pushfstring(L, "\n\tno file \"%s\" in jin game directories.\n", (tmp + ".lua").c_str());
- return 1;
- }
+ if (context.fs->isDir(tmp.c_str()))
+ {
+ tmp += "/init.lua";
+ if (context.fs->exists(tmp.c_str()))
+ {
+ lua_pop(L, 1);
+ lua_pushstring(L, tmp.c_str());
+ return loadbuffer(L);
+ }
+ }
- static const luaL_Reg f[] = {
- { "init", l_init },
- { "mount", l_mount },
- { "isdir", l_isDir },
- { "exist", l_exist },
- { 0, 0 }
- };
+ lua_pushfstring(L, "\n\tno file \"%s\" in jin game directories.\n", (tmp + ".lua").c_str());
+ return 1;
+ }
- int luaopen_filesystem(lua_State* L)
- {
- luax_newlib(L, f);
- luax_register_searcher(L, loader, 1);
- return 0;
- }
+ static int l_read(lua_State* L)
+ {
+ AssetDatabase* fs = context.fs;
+ const char* file = luax_checkstring(L, 1);
+ unsigned int len;
+ Buffer buffer;
+ fs->read(file, buffer);
+ luax_pushstring(L, (char*)&buffer);
+ luax_pushinteger(L, buffer.size());
+ return 2;
+ }
+
+ static const luaL_Reg f[] = {
+ { "init", l_init },
+ { "mount", l_mount },
+ { "isDirectory", l_isDir },
+ { "isFile", l_isFile },
+ { "exist", l_exist },
+ { "read", l_read },
+ { 0, 0 }
+ };
+
+ int luaopen_filesystem(lua_State* L)
+ {
+ luax_newlib(L, f);
+ luax_registersearcher(L, loader, 1);
+ return 0;
+ }
-}
-} \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/bitmap.cpp b/src/lua/modules/graphics/bitmap.cpp
new file mode 100644
index 0000000..13517f9
--- /dev/null
+++ b/src/lua/modules/graphics/bitmap.cpp
@@ -0,0 +1,113 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ typedef Ref<Bitmap>& BitmapRef;
+
+ static inline BitmapRef checkBitmap(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP);
+ return proxy->getRef<Bitmap>();
+ }
+
+ static int l_gc(lua_State* L)
+ {
+ BitmapRef ref = checkBitmap(L);
+ ref.release();
+ return 0;
+ }
+
+ static int l_getWidth(lua_State* L)
+ {
+ BitmapRef ref = checkBitmap(L);
+ int w = ref->getWidth();
+ luax_pushinteger(L, w);
+ return 1;
+ }
+
+ static int l_getHeight(lua_State* L)
+ {
+ BitmapRef ref = checkBitmap(L);
+ int h = ref->getHeight();
+ luax_pushinteger(L, h);
+ return 1;
+ }
+
+ static int l_getSize(lua_State* L)
+ {
+ BitmapRef ref = checkBitmap(L);
+ int w = ref->getWidth();
+ int h = ref->getHeight();
+ luax_pushinteger(L, w);
+ luax_pushinteger(L, h);
+ return 2;
+ }
+
+ static int l_getPixel(lua_State* L)
+ {
+ BitmapRef ref = checkBitmap(L);
+ int x = luax_checkinteger(L, 2);
+ int y = luax_checkinteger(L, 3);
+ Color col = ref->getPixel(x, y);
+ luax_pushinteger(L, col.r);
+ luax_pushinteger(L, col.g);
+ luax_pushinteger(L, col.b);
+ luax_pushinteger(L, col.a);
+ return 4;
+ }
+
+ static int l_setPixel(lua_State* L)
+ {
+ BitmapRef ref = checkBitmap(L);
+ int x = luax_checkinteger(L, 2);
+ int y = luax_checkinteger(L, 3);
+ if (!luax_istable(L, 4))
+ {
+ luax_typerror(L, 4, "table");
+ return 1;
+ }
+ unsigned int r = luax_rawgetnumber(L, 4, 1);
+ unsigned int g = luax_rawgetnumber(L, 4, 2);
+ unsigned int b = luax_rawgetnumber(L, 4, 3);
+ unsigned int a = luax_rawgetnumber(L, 4, 4);
+ ref->setPixel(Color(r, g, b, a), x, y);
+ return 0;
+ }
+
+ static int l_clone(lua_State* L)
+ {
+ BitmapRef ref = checkBitmap(L);
+ Bitmap* bitmap = ref.getObject();
+ Bitmap* b = Bitmap::clone(bitmap);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_BITMAP, sizeof(Proxy));
+ proxy->bind(new Ref<Bitmap>(b, JIN_GRAPHICS_BITMAP));
+ return 1;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "getWidth", l_getWidth },
+ { "getHeight", l_getHeight },
+ { "getSize", l_getSize },
+ { "getPixel", l_getPixel },
+ { "setPixel", l_setPixel },
+ { "clone", l_clone },
+ { 0, 0 }
+ };
+
+ int luaopen_Bitmap(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_BITMAP, f);
+ return 0;
+ }
+
+ } // graphics
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/canvas.cpp b/src/lua/modules/graphics/canvas.cpp
index f42dfba..e49e209 100644
--- a/src/lua/modules/graphics/canvas.cpp
+++ b/src/lua/modules/graphics/canvas.cpp
@@ -3,73 +3,63 @@
#include "lua/common/common.h"
#include "libjin/jin.h"
-namespace jin
-{
-namespace lua
+namespace JinEngine
{
+ namespace Lua
+ {
- using namespace jin::graphics;
+ using namespace JinEngine::Graphics;
- typedef Ref<Canvas>& CanvasRef;
+ typedef Ref<Canvas>& CanvasRef;
- static inline CanvasRef checkCanvas(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS);
- return proxy->getRef<Canvas>();
- }
-
- static int l_getWidth(lua_State* L)
- {
- CanvasRef ref = checkCanvas(L);
- luax_pushnumber(L, ref->getWidth());
- return 1;
- }
+ static inline CanvasRef checkCanvas(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS);
+ return proxy->getRef<Canvas>();
+ }
- static int l_getHeight(lua_State* L)
- {
- CanvasRef ref = checkCanvas(L);
- luax_pushnumber(L, ref->getHeight());
- return 1;
- }
+ static int l_getWidth(lua_State* L)
+ {
+ CanvasRef ref = checkCanvas(L);
+ luax_pushnumber(L, ref->getWidth());
+ return 1;
+ }
- static int l_getSize(lua_State* L)
- {
- CanvasRef ref = checkCanvas(L);
- luax_pushnumber(L, ref->getWidth());
- luax_pushnumber(L, ref->getHeight());
- return 2;
- }
+ static int l_getHeight(lua_State* L)
+ {
+ CanvasRef ref = checkCanvas(L);
+ luax_pushnumber(L, ref->getHeight());
+ return 1;
+ }
- static int l_setAnchor(lua_State* L)
- {
- CanvasRef ref = checkCanvas(L);
- int x = luax_checknumber(L, 1);
- int y = luax_checknumber(L, 2);
- ref->setAnchor(x, y);
- return 0;
- }
+ static int l_getSize(lua_State* L)
+ {
+ CanvasRef ref = checkCanvas(L);
+ luax_pushnumber(L, ref->getWidth());
+ luax_pushnumber(L, ref->getHeight());
+ return 2;
+ }
- static int l_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS);
- proxy->release();
- return 0;
- }
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS);
+ proxy->release();
+ return 0;
+ }
- static const luaL_Reg f[] = {
- { "__gc", l_gc },
- { "getWidth", l_getWidth },
- { "getHeight", l_getHeight },
- { "getSize", l_getSize },
- { "setAnchor", l_setAnchor },
- { 0, 0 }
- };
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "getWidth", l_getWidth },
+ { "getHeight", l_getHeight },
+ { "getSize", l_getSize },
+ { 0, 0 }
+ };
- int luaopen_Canvas(lua_State* L)
- {
- luax_newtype(L, JIN_GRAPHICS_CANVAS, f);
- return 0;
- }
+ int luaopen_Canvas(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_CANVAS, f);
+ return 0;
+ }
-}// lua
-}// jin \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/font.cpp b/src/lua/modules/graphics/font.cpp
deleted file mode 100644
index 926f2cc..0000000
--- a/src/lua/modules/graphics/font.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "lua/modules/luax.h"
-#include "lua/modules/types.h"
-#include "lua/common/common.h"
-#include "libjin/jin.h"
-
-namespace jin
-{
-namespace lua
-{
-
- using namespace jin::graphics;
-
- static int l_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_FONT);
- proxy->release();
- return 0;
- }
-
- static int l_box(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_FONT, sizeof(Proxy));
- Ref<Font>& ref = proxy->getRef<Font>();
- const char* text = luax_checkstring(L, 2);
- int fheight = luax_checknumber(L, 3);
- int spacing = luax_checknumber(L, 4);
- int lheight = luax_checknumber(L, 5);
- int w, h;
- ref->box(text, fheight, lheight, spacing, &w, &h);
- luax_pushnumber(L, w);
- luax_pushnumber(L, h);
- return 2;
- }
-
- static const luaL_Reg f[] = {
- { "__gc", l_gc },
- { "box", l_box },
- { 0, 0 }
- };
-
- int luaopen_Font(lua_State* L)
- {
- luax_newtype(L, JIN_GRAPHICS_FONT, f);
-
- return 0;
- }
-
-} // lua
-} // jin \ No newline at end of file
diff --git a/src/lua/modules/graphics/graphics.cpp b/src/lua/modules/graphics/graphics.cpp
index 9c1d404..8b2d7cd 100644
--- a/src/lua/modules/graphics/graphics.cpp
+++ b/src/lua/modules/graphics/graphics.cpp
@@ -1,516 +1,819 @@
+#include <iostream>
+#include <fstream>
+
+#include "libjin/jin.h"
#include "lua/modules/luax.h"
#include "lua/modules/types.h"
-#include "libjin/jin.h"
#include "lua/common/common.h"
-#include "lua/modules/embed/graphics.lua.h"
-namespace jin
-{
-namespace lua
-{
- using namespace jin::graphics;
- using jin::filesystem::Filesystem;
- using jin::filesystem::Buffer;
-
- typedef Texture Image;
+using namespace std;
+using namespace JinEngine;
+using namespace JinEngine::Graphics;
+using JinEngine::Filesystem::AssetDatabase;
+using JinEngine::Filesystem::Buffer;
- static struct
+namespace JinEngine
+{
+ namespace Lua
{
- color curRenderColor;
- color curClearColor;
- Font* curFont = nullptr;
- Font* defaultFont = nullptr;
- } context;
- static int l_init(lua_State* L)
- {
- Window* wnd = Window::get();
- Window::Setting setting;
- setting.width = luax_getfield_integer(L, 1, "width");
- setting.height = luax_getfield_integer(L, 1, "height");
- setting.title = luax_getfield_string(L, 1, "title");
- setting.vsync = luax_getfield_bool(L, 1, "vsync");
- setting.fullscreen = luax_getfield_bool(L, 1, "fullscreen");
- setting.resizable= luax_getfield_bool(L, 1, "resizable");
- if (!wnd->init(&setting))
- {
- luax_pushboolean(L, false);
- return 1;
- }
- luax_pushboolean(L, true);
- return 1;
- }
+#include "../../resources/font.ttf.h"
- static int l_destroy(lua_State* L)
- {
- Window* wnd = Window::get();
- wnd->quit();
- return 0;
- }
-
- static int l_getSize(lua_State* L)
- {
- Window* wnd = Window::get();
- luax_pushnumber(L, wnd->getW());
- luax_pushnumber(L, wnd->getH());
- return 2;
- }
+ static struct
+ {
+ Color curRenderColor;
+ Color curClearColor;
+ Font* curFont = nullptr;
+ Font* defaultFont = nullptr;
+ } context;
- static int l_getWidth(lua_State* L)
- {
- Window* wnd = Window::get();
- luax_pushnumber(L, wnd->getW());
- return 1;
- }
+ static int l_init(lua_State* L)
+ {
+ Window* wnd = Window::get();
+ Window::Setting setting;
+ setting.width = luax_getfieldinteger(L, 1, "width");
+ setting.height = luax_getfieldinteger(L, 1, "height");
+ setting.title = luax_getfieldstring(L, 1, "title");
+ setting.vsync = luax_getfieldbool(L, 1, "vsync");
+ setting.fullscreen = luax_getfieldbool(L, 1, "fullscreen");
+ setting.resizable = luax_getfieldbool(L, 1, "resizable");
+ if (!wnd->init(&setting))
+ {
+ luax_pushboolean(L, false);
+ return 1;
+ }
+ {
+ /* load default font */
+ Bitmap* bitmap = Bitmap::createBitmap(default_font_bitmap, sizeof(default_font_bitmap));
+ const Color* pixels = bitmap->getPixels();
+ ofstream f = ofstream();
+ f.open("font.pixels", ios_base::app);
+ for (int y = 0; y < bitmap->getHeight(); ++y)
+ {
+ for (int x = 0; x < bitmap->getWidth(); ++x)
+ {
+ Color c = pixels[x + y * bitmap->getWidth()];
+ f << (int)c.r << ",";
+ f << (int)c.g << ",";
+ f << (int)c.b << ",";
+ f << (int)c.a << ",";
+ }
+ }
+
+ TextureFont* tf = TextureFont::createTextureFont(bitmap, Text(Encode::UTF8, default_charset), default_font_split, bitmap->getHeight());
+ context.defaultFont = tf;
+ delete bitmap;
+ }
+ context.curFont = context.defaultFont;
- static int l_getHeight(lua_State* L)
- {
- Window* wnd = Window::get();
- luax_pushnumber(L, wnd->getH());
- return 1;
- }
+ luax_pushboolean(L, true);
+ return 1;
+ }
- static int l_newImage(lua_State* L)
- {
- Filesystem* fs = Filesystem::get();
- const char* f = luax_checkstring(L, 1);
- if (!fs->exists(f))
+ static int l_setTitle(lua_State* L)
{
- printf("Error: no such image %s\n", f);
- exit(1);
+ Window* wnd = Window::get();
+ const char* title = luax_checkstring(L, 1);
+ wnd->setTitle(title);
+ return 0;
}
- Buffer b;
- fs->read(f, &b);
-
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_IMAGE, sizeof(Proxy));
- Image* img = Image::createTexture(b.data, b.size);
- proxy->bind(new Ref<Image>(img, JIN_GRAPHICS_IMAGE));
- return 1;
- }
- static int l_newShader(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy));
- const char* program = luax_checkstring(L, 1);
- JSLProgram* jsl = JSLProgram::createJSLProgram(program);
- proxy->bind(new Ref<JSLProgram>(jsl, JIN_GRAPHICS_SHADER));
- return 1;
- }
-
- static int l_newCanvas(lua_State* L)
- {
- int w = luax_checknumber(L, 1);
- int h = luax_checknumber(L, 2);
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_CANVAS, sizeof(Proxy));
- Canvas* cvs = Canvas::createCanvas(w, h);
- proxy->bind(new Ref<Canvas>(cvs, JIN_GRAPHICS_CANVAS));
- return 1;
- }
-
- static int l_clear(lua_State* L)
- {
- if (luax_gettop(L) == 0)
- {
- glClearColor(0, 0, 0, 1);
- }
- else
- {
- int r = luax_checknumber(L, 1);
- int g = luax_checknumber(L, 2);
- int b = luax_checknumber(L, 3);
- int a = luax_checknumber(L, 4);
- glClearColor(r / 255.f, g / 255.f, b / 255.f, a / 255.f);
- }
- glClear(GL_COLOR_BUFFER_BIT);
- return 0;
- }
-
- static int l_setClearColor(lua_State* L)
- {
- if (luax_gettop(L) == 0)
- {
- glClearColor(1, 1, 1, 1);
- return 0;
- }
-
- context.curClearColor.rgba.r = luax_checknumber(L, 1);
- context.curClearColor.rgba.g = luax_checknumber(L, 2);
- context.curClearColor.rgba.b = luax_checknumber(L, 3);
- context.curClearColor.rgba.a = luax_checknumber(L, 4);
-
- glClearColor(context.curClearColor.rgba.r / 255.f,
- context.curClearColor.rgba.g / 255.f,
- context.curClearColor.rgba.b / 255.f,
- context.curClearColor.rgba.a / 255.f);
- return 0;
- }
-
- static int l_present(lua_State* L)
- {
- Window::get()->swapBuffers();
- return 0;
- }
+ static int l_destroy(lua_State* L)
+ {
+ Window* wnd = Window::get();
+ wnd->quit();
+ return 0;
+ }
- static int l_draw(lua_State* L)
- {
- int x = luax_optnumber(L, 2, 0);
- int y = luax_optnumber(L, 3, 0);
- float sx = luax_optnumber(L, 4, 1);
- float sy = luax_optnumber(L, 5, 1);
- float r = luax_optnumber(L, 6, 0);
- if (luax_istype(L, 1, JIN_GRAPHICS_IMAGE))
+ static int l_getSize(lua_State* L)
{
- Proxy* proxy = (Proxy*)luax_toudata(L, 1);
- Ref<Image>& tex = proxy->getRef<Image>();
- tex->draw(x, y, sx, sy, r);
+ Window* wnd = Window::get();
+ luax_pushnumber(L, wnd->getW());
+ luax_pushnumber(L, wnd->getH());
+ return 2;
}
- else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS))
+
+ static int l_getWidth(lua_State* L)
{
- Proxy* proxy = (Proxy*)luax_toudata(L, 1);
- Ref<Canvas>& p = proxy->getRef<Canvas>();
- p->draw(x, y, sx, sy, r);
+ Window* wnd = Window::get();
+ luax_pushnumber(L, wnd->getW());
+ return 1;
}
- else
+
+ static int l_getHeight(lua_State* L)
{
- /* wrong type */
- luax_typerror(L, 1, "image or canvas");
+ Window* wnd = Window::get();
+ luax_pushnumber(L, wnd->getH());
+ return 1;
}
- return 0;
- }
- static int l_setColor(lua_State* L)
- {
- if (luax_gettop(L) == 0)
+ static int l_newBitmap(lua_State* L)
{
- glColor4f(1, 1, 1, 1);
- return 0;
+ Bitmap* bitmap = nullptr;
+ if (luax_gettop(L) == 2)
+ {
+ int w = luax_checkinteger(L, 1);
+ int h = luax_checkinteger(L, 2);
+ bitmap = Bitmap::createBitmap(w, h);
+ }
+ else if (luax_gettop(L) == 3)
+ {
+ int w = luax_checkinteger(L, 1);
+ int h = luax_checkinteger(L, 2);
+ if (!luax_istable(L, 3))
+ {
+ luax_typerror(L, 3, "table");
+ return 1;
+ }
+ unsigned int r = luax_rawgetnumber(L, 3, 1);
+ unsigned int g = luax_rawgetnumber(L, 3, 2);
+ unsigned int b = luax_rawgetnumber(L, 3, 3);
+ unsigned int a = luax_rawgetnumber(L, 3, 4);
+ bitmap = Bitmap::createBitmap(w, h, Color(r, g, b, a));
+ }
+ else
+ {
+ const char* f = luax_checkstring(L, 1);
+ AssetDatabase* fs = AssetDatabase::get();
+ if (!fs->exists(f))
+ {
+ error(L, "No such image file %s", f);
+ goto fail;
+ }
+ Buffer b;
+ if (!fs->read(f, b))
+ {
+ error(L, "Failed to read image %s", f);
+ goto fail;
+ }
+ bitmap = Bitmap::createBitmap(&b, b.size());
+ if (bitmap == nullptr)
+ {
+ error(L, "Failed to decode image file %s", f);
+ goto fail;
+ }
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_BITMAP, sizeof(Proxy));
+ proxy->bind(new Ref<Bitmap>(bitmap, JIN_GRAPHICS_BITMAP));
+ return 1;
+ fail:
+ luax_pushnil(L);
+ return 1;
}
- context.curRenderColor.rgba.r = luax_checknumber(L, 1);
- context.curRenderColor.rgba.g = luax_checknumber(L, 2);
- context.curRenderColor.rgba.b = luax_checknumber(L, 3);
- context.curRenderColor.rgba.a = luax_checknumber(L, 4);
+ /* jin.graphics.newTexture(bitmap) */
+ static int l_newTexture(lua_State* L)
+ {
+ Texture* texture = nullptr;
+ if (luax_istype(L, 1, JIN_GRAPHICS_BITMAP))
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP);
+ Ref<Bitmap>& refBitmap = p->getRef<Bitmap>();
+ Bitmap* bitmap = refBitmap.getObject();
+ texture = Texture::createTexture(bitmap);
+ }
+ else if (luax_isstring(L, 1))
+ {
+ const char* path = luax_checkstring(L, 1);
+ texture = Texture::createTexture(path);
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXTURE, sizeof(Proxy));
+ proxy->bind(new Ref<Texture>(texture, JIN_GRAPHICS_TEXTURE));
+ return 1;
+ }
- glColor4f(context.curRenderColor.rgba.r / 255.f,
- context.curRenderColor.rgba.g / 255.f,
- context.curRenderColor.rgba.b / 255.f,
- context.curRenderColor.rgba.a / 255.f);
- return 0;
- }
+ static int l_newShader(lua_State* L)
+ {
+ const char* program = luax_checkstring(L, 1);
+ Shader* jsl = Shader::createShader(program);
+ if (jsl == nullptr)
+ {
+ error(L, "Failed to compile shader");
+ luax_pushnil(L);
+ return 1;
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy));
+ proxy->bind(new Ref<Shader>(jsl, JIN_GRAPHICS_SHADER));
+ return 1;
+ }
- static int l_getColor(lua_State * L)
- {
- luax_pushnumber(L, context.curRenderColor.rgba.r);
- luax_pushnumber(L, context.curRenderColor.rgba.g);
- luax_pushnumber(L, context.curRenderColor.rgba.b);
- luax_pushnumber(L, context.curRenderColor.rgba.a);
- return 4;
- }
+ static int l_newShaderf(lua_State* L)
+ {
+ const char* path = luax_checkstring(L, 1);
+ AssetDatabase* fs = AssetDatabase::get();
+ if (!fs->exists(path))
+ {
+ error(L, "No such shader file %s\n", path);
+ luax_pushnil(L);
+ return 1;
+ }
+ Buffer b;
+ fs->read(path, b);
+ Shader* jsl = Shader::createShader((char*)&b);
+ if (jsl == nullptr)
+ {
+ error(L, "Failed to compile shader");
+ luax_pushnil(L);
+ return 1;
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_SHADER, sizeof(Proxy));
+ proxy->bind(new Ref<Shader>(jsl, JIN_GRAPHICS_SHADER));
+ return 1;
+ }
+
+ static int l_newCanvas(lua_State* L)
+ {
+ int w = luax_checknumber(L, 1);
+ int h = luax_checknumber(L, 2);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_CANVAS, sizeof(Proxy));
+ Canvas* cvs = Canvas::createCanvas(w, h);
+ proxy->bind(new Ref<Canvas>(cvs, JIN_GRAPHICS_CANVAS));
+ return 1;
+ }
- static int l_bindCanvas(lua_State* L)
- {
- if (luax_gettop(L) == 0)
+ static int l_clear(lua_State* L)
{
- // bind to default canvas
- Canvas::unbind();
+ glClear(GL_COLOR_BUFFER_BIT);
return 0;
}
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS);
- Ref<Canvas>& ref = proxy->getRef<Canvas>();
- ref->bind();
- return 0;
- }
-
- static int l_unbindCanvas(lua_State* L)
- {
- Canvas::unbind();
- return 0;
- }
- static int l_useShader(lua_State* L)
- {
- if (luax_gettop(L) == 0)
+ static int l_setClearColor(lua_State* L)
+ {
+ if (luax_gettop(L) == 0)
+ {
+ glClearColor(0, 0, 0, 1);
+ return 0;
+ }
+
+ context.curClearColor.r = luax_checknumber(L, 1);
+ context.curClearColor.g = luax_checknumber(L, 2);
+ context.curClearColor.b = luax_checknumber(L, 3);
+ context.curClearColor.a = luax_checknumber(L, 4);
+
+ gl.setClearColor(context.curClearColor.r,
+ context.curClearColor.g,
+ context.curClearColor.b,
+ context.curClearColor.a);
+ return 0;
+ }
+
+ static int l_present(lua_State* L)
{
- JSLProgram::unuse();
+ Window::get()->swapBuffers();
return 0;
}
- if (luax_istype(L, 1, JIN_GRAPHICS_SHADER))
+
+ static void l_draw_texture(lua_State* L)
+ {
+ if (!luax_istype(L, 1, JIN_GRAPHICS_TEXTURE))
+ return;
+ int x = luax_optnumber(L, 2, 0);
+ int y = luax_optnumber(L, 3, 0);
+ float sx = luax_optnumber(L, 4, 1);
+ float sy = luax_optnumber(L, 5, 1);
+ float r = luax_optnumber(L, 6, 0);
+ float ox = luax_optnumber(L, 7, 0);
+ float oy = luax_optnumber(L, 8, 0);
+ Proxy* proxy = (Proxy*)luax_toudata(L, 1);
+ Ref<Texture>& tex = proxy->getRef<Texture>();
+ tex->draw(x, y, sx, sy, r, ox, oy);
+ }
+
+ static void l_draw_canvas(lua_State* L)
+ {
+ if (!luax_istype(L, 1, JIN_GRAPHICS_CANVAS))
+ return;
+ int x = luax_optnumber(L, 2, 0);
+ int y = luax_optnumber(L, 3, 0);
+ float sx = luax_optnumber(L, 4, 1);
+ float sy = luax_optnumber(L, 5, 1);
+ float r = luax_optnumber(L, 6, 0);
+ float ox = luax_optnumber(L, 7, 0);
+ float oy = luax_optnumber(L, 8, 0);
+ Proxy* proxy = (Proxy*)luax_toudata(L, 1);
+ Ref<Canvas>& p = proxy->getRef<Canvas>();
+ p->draw(x, y, sx, sy, r, ox, oy);
+ }
+
+ /* jin.graphics.draw(text, font, x, y) */
+ static void l_draw_text(lua_State* L)
+ {
+ if (!luax_istype(L, 1, JIN_GRAPHICS_TEXT))
+ return;
+ Proxy* p = (Proxy*)luax_toudata(L, 1);
+ Text* text = p->getObject<Text>();
+ int x = luax_optnumber(L, 3, 0);
+ int y = luax_optnumber(L, 4, 0);
+ int spacing = luax_optnumber(L, 6, 0);
+ Font* font = nullptr;
+ Proxy* p2 = (Proxy*)luax_toudata(L, 2);
+ if (luax_istype(L, 2, JIN_GRAPHICS_TEXTUREFONT))
+ {
+ TextureFont* tf = p2->getObject<TextureFont>();
+ font = tf;
+ }
+ else if (luax_istype(L, 2, JIN_GRAPHICS_TTF))
+ {
+ TTF* ttf = p2->getObject<TTF>();
+ font = ttf;
+ }
+ else
+ {
+ font = context.defaultFont;
+ }
+ int lineheight = luax_optnumber(L, 5, font->getFontSize());
+ font->print(*text, x, y, lineheight, spacing);
+ }
+
+ /* jin.graphics.draw(page, x, y) */
+ static void l_draw_page(lua_State* L)
+ {
+ if (!luax_istype(L, 1, JIN_GRAPHICS_PAGE))
+ return;
+ int x = luax_optnumber(L, 2, 0);
+ int y = luax_optnumber(L, 3, 0);
+ Proxy* p = (Proxy*)luax_toudata(L, 1);
+ Page* page = p->getObject<Page>();
+ Font* font = page->font;
+ font->print(page, x, y);
+ }
+
+ static int l_draw(lua_State* L)
{
- Proxy* proxy = (Proxy*)luax_toudata(L, 1);
- Ref<JSLProgram>& jsl = proxy->getRef<JSLProgram>();
- jsl->use();
+ if (luax_istype(L, 1, JIN_GRAPHICS_TEXTURE))
+ l_draw_texture(L);
+ else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS))
+ l_draw_canvas(L);
+ else if (luax_istype(L, 1, JIN_GRAPHICS_TEXT))
+ l_draw_text(L);
+ else if (luax_istype(L, 1, JIN_GRAPHICS_PAGE))
+ l_draw_page(L);
+ else
+ {
+ luax_typerror(L, 1, "texture or canvas");
+ return 1;
+ }
+ return 0;
}
- else
+
+ // draw(tex, quad, x, y, sx, sy, r, ax, ay)
+ static int l_drawq(lua_State* L)
{
- luax_typerror(L, 1, "JSL shader");
+ if (!luax_istable(L, 2))
+ {
+ luax_typerror(L, 2, "table");
+ return 1;
+ }
+ Math::Quad q;
+ q.x = luax_rawgetnumber(L, 2, 1);
+ q.y = luax_rawgetnumber(L, 2, 2);
+ q.w = luax_rawgetnumber(L, 2, 3);
+ q.h = luax_rawgetnumber(L, 2, 4);
+ luax_pop(L, 4);
+ int x = luax_optnumber(L, 3, 0);
+ int y = luax_optnumber(L, 4, 0);
+ float sx = luax_optnumber(L, 5, 1);
+ float sy = luax_optnumber(L, 6, 1);
+ float r = luax_optnumber(L, 7, 0);
+ float ox = luax_optnumber(L, 8, 0);
+ float oy = luax_optnumber(L, 9, 0);
+
+ if (luax_istype(L, 1, JIN_GRAPHICS_TEXTURE))
+ {
+ Proxy* proxy = (Proxy*)luax_toudata(L, 1);
+ Ref<Texture>& tex = proxy->getRef<Texture>();
+ tex->draw(q, x, y, sx, sy, r, ox, oy);
+ }
+ else if (luax_istype(L, 1, JIN_GRAPHICS_CANVAS))
+ {
+ Proxy* proxy = (Proxy*)luax_toudata(L, 1);
+ Ref<Canvas>& p = proxy->getRef<Canvas>();
+ p->draw(q, x, y, sx, sy, r, ox, oy);
+ }
+ else
+ {
+ luax_typerror(L, 1, "texture or canvas");
+ }
}
- return 0;
- }
-
- static int l_unuseShader(lua_State* L)
- {
- JSLProgram::unuse();
- return 0;
- }
- static int l_setBlend(lua_State* L)
- {
-
- return 0;
- }
+ /* print(string, x, y, lineheight, spacing) */
+ /* need set font */
+ static int l_print(lua_State* L)
+ {
+ Font* font = context.curFont;
+ if (font == nullptr)
+ return 0;
+ unsigned length;
+ const char* str = luax_checklstring(L, 1, &length);
+ Text text(Encode::UTF8, str, length);
+ int x = luax_optnumber(L, 2, 0);
+ int y = luax_optnumber(L, 3, 0);
+ int lineheight = luax_optnumber(L, 4, font->getFontSize());
+ int spacing = luax_optnumber(L, 5, 0);
+ font->print(text, x, y, lineheight, spacing);
+ return 0;
+ }
- static RENDER_MODE strtomode(const char* str)
- {
- std::string s = std::string(str);
- if (s == "fill") return RENDER_MODE::FILL;
- else if (s == "line") return RENDER_MODE::LINE;
- else return RENDER_MODE::NONE;
- }
+ static int l_setColor(lua_State* L)
+ {
+ if (luax_gettop(L) == 0)
+ {
+ glColor4f(1, 1, 1, 1);
+ return 0;
+ }
- static int l_drawpoint(lua_State* L)
- {
- int x = luax_checknumber(L, 1);
- int y = luax_checknumber(L, 2);
- jin::graphics::point(x, y);
-
- return 0;
- }
-
- static int l_drawLine(lua_State* L)
- {
- int x1 = luax_checknumber(L, 1);
- int y1 = luax_checknumber(L, 2);
- int x2 = luax_checknumber(L, 3);
- int y2 = luax_checknumber(L, 4);
- jin::graphics::line(x1, y1, x2, y2);
-
- return 0;
- }
+ context.curRenderColor.r = luax_checknumber(L, 1);
+ context.curRenderColor.g = luax_checknumber(L, 2);
+ context.curRenderColor.b = luax_checknumber(L, 3);
+ if (luax_gettop(L) == 4)
+ context.curRenderColor.a = luax_checknumber(L, 4);
+ else
+ context.curRenderColor.a = 255;
+ glColor4f(context.curRenderColor.r / 255.f,
+ context.curRenderColor.g / 255.f,
+ context.curRenderColor.b / 255.f,
+ context.curRenderColor.a / 255.f);
+ return 0;
+ }
- static int l_drawRect(lua_State* L)
- {
- const char* modestr = luax_checkstring(L, 1);
- RENDER_MODE mode = strtomode(modestr);
- if (mode != RENDER_MODE::NONE)
+ static int l_getColor(lua_State * L)
{
- int x = luax_checknumber(L, 2);
- int y = luax_checknumber(L, 3);
- int w = luax_checknumber(L, 4);
- int h = luax_checknumber(L, 5);
- rect(mode, x, y, w, h);
+ luax_pushnumber(L, context.curRenderColor.r);
+ luax_pushnumber(L, context.curRenderColor.g);
+ luax_pushnumber(L, context.curRenderColor.b);
+ luax_pushnumber(L, context.curRenderColor.a);
+ return 4;
}
- else
+
+ static int l_bindCanvas(lua_State* L)
{
- luax_typerror(L, 1, "'fill' or 'line'");
- return 1;
+ if (luax_gettop(L) == 0)
+ {
+ // bind to default canvas
+ Canvas::unbind();
+ return 0;
+ }
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_CANVAS);
+ Ref<Canvas>& ref = proxy->getRef<Canvas>();
+ Canvas::bind(ref.getObject());
+ return 0;
}
- return 0;
- }
+ static int l_unbindCanvas(lua_State* L)
+ {
+ Canvas::unbind();
+ return 0;
+ }
- static int l_drawCircle(lua_State* L)
- {
- const char* modestr = luax_checkstring(L, 1);
- RENDER_MODE mode = strtomode(modestr);
- if (mode != RENDER_MODE::NONE)
+ static int l_useShader(lua_State* L)
{
- int x = luax_checknumber(L, 2);
- int y = luax_checknumber(L, 3);
- float r = luax_checknumber(L, 4);
- circle(mode, x, y, r);
+ if (luax_gettop(L) == 0)
+ {
+ Shader::unuse();
+ return 0;
+ }
+ if (luax_istype(L, 1, JIN_GRAPHICS_SHADER))
+ {
+ Proxy* proxy = (Proxy*)luax_toudata(L, 1);
+ Ref<Shader>& jsl = proxy->getRef<Shader>();
+ jsl->use();
+ }
+ else
+ {
+ luax_typerror(L, 1, "JSL shader");
+ }
+ return 0;
}
- else
+
+ static int l_setBlend(lua_State* L)
{
- luax_typerror(L, 1, "'fill' or 'line'");
- return 1;
+
+ return 0;
}
- return 0;
- }
+ static RenderMode strtomode(const char* str)
+ {
+ std::string s = std::string(str);
+ if (s == "fill") return RenderMode::FILL;
+ else if (s == "line") return RenderMode::LINE;
+ else return RenderMode::NONE;
+ }
- static int l_drawTriangle(lua_State* L)
- {
- const char* modestr = luax_checkstring(L, 1);
- RENDER_MODE mode = strtomode(modestr);
- if (mode != RENDER_MODE::NONE)
+ static int l_point(lua_State* L)
{
- int x = luax_checknumber(L, 2);
- int y = luax_checknumber(L, 3);
+ int x = luax_checknumber(L, 1);
+ int y = luax_checknumber(L, 2);
+ JinEngine::Graphics::point(x, y);
+ return 0;
+ }
+
+ static int l_line(lua_State* L)
+ {
+ int x1 = luax_checknumber(L, 1);
+ int y1 = luax_checknumber(L, 2);
int x2 = luax_checknumber(L, 3);
int y2 = luax_checknumber(L, 4);
+ JinEngine::Graphics::line(x1, y1, x2, y2);
+
+ return 0;
+ }
- int x3 = luax_checknumber(L, 5);
- int y3 = luax_checknumber(L, 6);
+ static int l_rect(lua_State* L)
+ {
+ const char* modestr = luax_checkstring(L, 1);
+ RenderMode mode = strtomode(modestr);
+ if (mode != RenderMode::NONE)
+ {
+ int x = luax_checknumber(L, 2);
+ int y = luax_checknumber(L, 3);
+ int w = luax_checknumber(L, 4);
+ int h = luax_checknumber(L, 5);
+ rect(mode, x, y, w, h);
+ }
+ else
+ {
+ luax_typerror(L, 1, "'fill' or 'line'");
+ return 1;
+ }
- triangle(mode, x, y, x2, y2, x3, y3);
+ return 0;
}
- else
+
+ static int l_circle(lua_State* L)
{
- luax_typerror(L, 1, "'fill' or 'line'");
- return 1;
+ const char* modestr = luax_checkstring(L, 1);
+ RenderMode mode = strtomode(modestr);
+ if (mode != RenderMode::NONE)
+ {
+ int x = luax_checknumber(L, 2);
+ int y = luax_checknumber(L, 3);
+ float r = luax_checknumber(L, 4);
+ circle(mode, x, y, r);
+ }
+ else
+ {
+ luax_typerror(L, 1, "'fill' or 'line'");
+ return 1;
+ }
+
+ return 0;
}
- return 0;
- }
-
- static int l_drawPolygon(lua_State* L)
- {
- const char* modestr = luax_checkstring(L, 1);
- int n = luax_checknumber(L, 2);
- RENDER_MODE mode = strtomode(modestr);
- if (mode != RENDER_MODE::NONE)
+ static int l_triangle(lua_State* L)
{
- if (!luax_istable(L, 3))
+ const char* modestr = luax_checkstring(L, 1);
+ RenderMode mode = strtomode(modestr);
+ if (mode != RenderMode::NONE)
{
- luax_typerror(L, 3, "table");
- return 1;
+ int x = luax_checknumber(L, 2);
+ int y = luax_checknumber(L, 3);
+
+ int x2 = luax_checknumber(L, 3);
+ int y2 = luax_checknumber(L, 4);
+
+ int x3 = luax_checknumber(L, 5);
+ int y3 = luax_checknumber(L, 6);
+
+ triangle(mode, x, y, x2, y2, x3, y3);
}
- int tn = luax_tableidxlen(L, 3);
- if (tn != n * 2)
+ else
{
- static char* emsg = \
- "number of polygon vertices doesn't match " \
- "provided n, expect %d numbers but get %d";
- luax_error(L, emsg, n * 2, tn);
+ luax_typerror(L, 1, "'fill' or 'line'");
return 1;
}
- float* p = new float[2 * n];
- for (int i = 1; i <= 2 * n; ++i)
- p[i - 1] = luax_rawgetnumber(L, 3, i);
- polygon(mode, p, n);
- delete[] p;
+
+ return 0;
}
- else
+
+ static int l_polygon(lua_State* L)
{
- luax_typerror(L, 1, "'fill' or 'line'");
- return 1;
- }
+ const char* modestr = luax_checkstring(L, 1);
+ int n = luax_checknumber(L, 2);
+ RenderMode mode = strtomode(modestr);
+ if (mode != RenderMode::NONE)
+ {
+ if (!luax_istable(L, 3))
+ {
+ luax_typerror(L, 3, "table");
+ return 1;
+ }
+ int tn = luax_tableidxlen(L, 3);
+ if (tn != n * 2)
+ {
+ static char* emsg = \
+ "number of polygon vertices doesn't match " \
+ "provided n, expect %d numbers but get %d";
+ luax_error(L, emsg, n * 2, tn);
+ return 1;
+ }
+ float* p = (float*)alloca(2 * n * sizeof(float));
+ for (int i = 1; i <= 2 * n; ++i)
+ p[i - 1] = luax_rawgetnumber(L, 3, i);
+ polygon(mode, p, n);
+ }
+ else
+ {
+ luax_typerror(L, 1, "'fill' or 'line'");
+ return 1;
+ }
- return 0;
- }
+ return 0;
+ }
- static int l_newFont(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_FONT, sizeof(Proxy));
- Font* font = new Font();
+ static int l_newTTFData(lua_State* L)
{
- const char* path = luax_checkstring(L, 1);
- Filesystem* fs = Filesystem::get();
- Buffer b = {};
- if (!fs->exists(path))
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TTFDATA, sizeof(Proxy));
+ TTFData* fd = nullptr;
{
- printf("Error: no such font %s\n", path);
- exit(1);
+ const char* path = luax_checkstring(L, 1);
+ AssetDatabase* fs = AssetDatabase::get();
+ if (!fs->exists(path))
+ {
+ error(L, "No such font %s\n", path);
+ luax_pushnil(L);
+ return 1;
+ }
+ Buffer b;
+ fs->read(path, b);
+ fd = TTFData::createTTFData(&b, b.size());
}
- fs->read(path, &b);
- font->loadb((const unsigned char*)b.data);
+ proxy->bind(new Ref<TTFData>(fd, JIN_GRAPHICS_TTFDATA));
+ return 1;
}
- proxy->bind(new Ref<Font>(font, JIN_GRAPHICS_FONT));
- return 1;
- }
- static int l_study(lua_State* L)
- {
- int n = luax_gettop(L);
- if (n == 0)
- {
- if (context.defaultFont == 0)
+ /* newText(str[, encode]) */
+ static int l_newText(lua_State* L)
+ {
+ Encode encode = Encode::UTF8;
+ if (luax_gettop(L) == 2)
+ {
+ const char* e = luax_checkstring(L, 2);
+ if (strcmp(e, "UTF8") == 0) encode = Encode::UTF8;
+ //else if (strcmp(e, "UTF16") == 0) encode = Encode::UTF16;
+ else if (strcmp(e, "ASCII") == 0) encode = Encode::ASCII;
+ else
+ {
+ luax_error(L, "wrong text encode %s", e);
+ return 0;
+ }
+ }
+ unsigned length;
+ const char* data = luax_checklstring(L, 1, &length);
+ Text* text = new Text(encode, data, length);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXT, sizeof(Proxy));
+ proxy->bind(new Ref<Text>(text, JIN_GRAPHICS_TEXT));
+ return 1;
+ }
+
+ /* newTextureFont(bitmap, text, color | cellw, cellh) */
+ static int l_newTextureFont(lua_State* L)
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_BITMAP);
+ Bitmap* bitmap = p->getObject<Bitmap>();
+ Text* text;
+ if (luax_istype(L, 2, JIN_GRAPHICS_TEXT))
{
- #include "lua/resources/font.ttf.h"
- // load default font
- context.defaultFont = new Font();
- context.defaultFont->loadb(font_ttf);
+ Proxy* pt = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT);
+ text = pt->getObject<Text>();
}
+ else if (luax_isstring(L, 2))
+ {
+ unsigned len;
+ const char* str = luax_checklstring(L, 2, &len);
+ text = new Text(Encode::UTF8, str, len);
+ }
+ else
+ {
+ luax_typerror(L, 2, "Text or string");
+ return 1;
+ }
+ float cellh = luax_checknumber(L, 4);
+ TextureFont* textureFont = nullptr;
+ if (luax_istable(L, 3))
+ {
+ unsigned int r = luax_rawgetnumber(L, 3, 1);
+ unsigned int g = luax_rawgetnumber(L, 3, 2);
+ unsigned int b = luax_rawgetnumber(L, 3, 3);
+ unsigned int a = luax_rawgetnumber(L, 3, 4);
+ textureFont = TextureFont::createTextureFont(bitmap, *text, Color(r, g, b, a), cellh);
+ }
+ else if (luax_isnumber(L, 3))
+ {
+ float cellw = luax_checknumber(L, 3);
+ textureFont = TextureFont::createTextureFont(bitmap, *text, cellw, cellh);
+ }
+ else
+ {
+ luax_error(L, "bad arguments #3 to 'newTextureFont', need to be table or number");
+ return 0;
+ }
+ if (luax_isstring(L, 2))
+ {
+ // Delete temporary text.
+ delete text;
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TEXTUREFONT, sizeof(Proxy));
+ proxy->bind(new Ref<TextureFont>(textureFont, JIN_GRAPHICS_TEXTUREFONT));
+ return 1;
+ }
+
+ /* setFont(font) */
+ static int l_setFont(lua_State* L)
+ {
+ if (luax_istype(L, 1, JIN_GRAPHICS_TTF))
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF);
+ TTF* ttf = p->getObject<TTF>();
+ context.curFont = ttf;
+ }
+ else if (luax_istype(L, 1, JIN_GRAPHICS_TEXTUREFONT))
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT);
+ TextureFont* tf = p->getObject<TextureFont>();
+ context.curFont = tf;
+ }
+ return 0;
+ }
+
+ static int l_unsetFont(lua_State* L)
+ {
context.curFont = context.defaultFont;
return 0;
}
- Font* font = (Font*)luax_checktype(L, 1, JIN_GRAPHICS_FONT);
- context.curFont = font;
- return 0;
- }
-
- static int l_write(lua_State* L)
- {
- if (context.curFont == 0)
- return 0;
-
- const char* text = luax_checkstring(L, 1);
- int x = luax_checknumber(L, 2);
- int y = luax_checknumber(L, 3);
-
- int fh = luax_optnumber(L, 4, 15);
- int spacing = luax_optnumber(L, 5, 1);
- int lh = luax_optnumber(L, 6, 18);
-
- context.curFont->render(text, x, y, fh, spacing, lh);
- return 0;
- }
-
- static int l_box(lua_State* L)
- {
- const char* text = luax_checkstring(L, 1);
- int fontheight = luax_checknumber(L, 2);
- int spacing = luax_checknumber(L, 3);
- int lineheight = luax_checknumber(L, 4);
- int w, h;
- context.curFont->box(text, fontheight, spacing, lineheight, &w, &h);
- luax_pushnumber(L, w);
- luax_pushnumber(L, h);
- return 2;
- }
-
- static const luaL_Reg f[] = {
- { "init", l_init },
- { "getSize", l_getSize },
- { "getWidth", l_getWidth },
- { "getHeight", l_getHeight },
- { "newImage", l_newImage },
- { "newShader", l_newShader },
- { "newCanvas", l_newCanvas },
- { "newFont", l_newFont },
- { "box", l_box },
- { "write", l_write },
- { "setClearColor", l_setClearColor },
- { "clear", l_clear },
- { "draw", l_draw },
- { "setColor", l_setColor },
- { "palette", l_getColor },
- { "present", l_present },
- { "setFont", l_study },
- { "bindCanvas", l_bindCanvas },
- { "unbindCanvas", l_unbindCanvas },
- { "useShader", l_useShader },
- { "unuseShader", l_unuseShader },
- { "point", l_drawpoint },
- { "line", l_drawLine },
- { "rect", l_drawRect },
- { "circle", l_drawCircle },
- { "triangle", l_drawTriangle },
- { "polygon", l_drawPolygon },
- { "destroy", l_destroy },
- { 0, 0 }
- };
-
- extern int luaopen_Image(lua_State* L);
- extern int luaopen_Font(lua_State* L);
- extern int luaopen_Canvas(lua_State* L);
- extern int luaopen_JSL(lua_State* L);
+ static const luaL_Reg f[] = {
+ /* window */
+ { "init", l_init },
+ { "setTitle", l_setTitle },
+ { "getSize", l_getSize },
+ { "getWidth", l_getWidth },
+ { "getHeight", l_getHeight },
+ { "destroy", l_destroy },
+ /* creators */
+ { "newBitmap", l_newBitmap },
+ { "newTexture", l_newTexture },
+ { "newShader", l_newShader },
+ { "newShaderf", l_newShaderf },
+ { "newCanvas", l_newCanvas },
+ { "newTTFData", l_newTTFData },
+ { "newText", l_newText },
+ { "newTextureFont", l_newTextureFont },
+ /* render */
+ { "setClearColor", l_setClearColor },
+ { "clear", l_clear },
+ { "draw", l_draw },
+ { "print", l_print },
+ { "drawq", l_drawq },
+ { "setColor", l_setColor },
+ { "getColor", l_getColor },
+ { "present", l_present },
+ /* canvas */
+ { "bindCanvas", l_bindCanvas },
+ { "unbindCanvas", l_unbindCanvas },
+ /* shader */
+ { "useShader", l_useShader },
+ /* shapes */
+ { "point", l_point },
+ { "line", l_line },
+ { "rect", l_rect },
+ { "circle", l_circle },
+ { "triangle", l_triangle },
+ { "polygon", l_polygon },
+ /* font */
+ { "setFont", l_setFont },
+ { "unsetFont", l_unsetFont },
+ { 0, 0 }
+ };
+
+ extern int luaopen_Texture(lua_State* L);
+ extern int luaopen_Text(lua_State* L);
+ extern int luaopen_TTF(lua_State* L);
+ extern int luaopen_TextureFont(lua_State* L);
+ extern int luaopen_TTFData(lua_State* L);
+ extern int luaopen_Page(lua_State* L);
+ extern int luaopen_Canvas(lua_State* L);
+ extern int luaopen_JSL(lua_State* L);
+ extern int luaopen_Bitmap(lua_State* L);
- int luaopen_graphics(lua_State* L)
- {
- // register types
- luaopen_Image(L);
- luaopen_Canvas(L);
- luaopen_Font(L);
- luaopen_JSL(L);
-
- // load whole lib
- luax_newlib(L, f);
+ int luaopen_graphics(lua_State* L)
+ {
+ // register types
+ luaopen_Bitmap(L);
+ luaopen_Texture(L);
+ luaopen_Canvas(L);
+ luaopen_TTFData(L);
+ luaopen_TTF(L);
+ luaopen_Text(L);
+ luaopen_TextureFont(L);
+ luaopen_Page(L);
+ luaopen_JSL(L);
+
+ // load whole lib
+ luax_newlib(L, f);
- return 1;
- }
+ return 1;
+ }
-}// lua
-}// jin \ No newline at end of file
+ }// lua
+}// jin \ No newline at end of file
diff --git a/src/lua/modules/graphics/image.cpp b/src/lua/modules/graphics/image.cpp
deleted file mode 100644
index 5824660..0000000
--- a/src/lua/modules/graphics/image.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#include "lua/modules/luax.h"
-#include "lua/modules/types.h"
-#include "lua/common/common.h"
-#include "libjin/jin.h"
-
-namespace jin
-{
-namespace lua
-{
-
- using namespace jin::graphics;
-
- typedef Texture Image;
-
- static inline Ref<Image>& checkImage(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_IMAGE);
- return proxy->getRef<Image>();
- }
-
- static int l_getWidth(lua_State* L)
- {
- Ref<Image>& ref = checkImage(L);
- luax_pushnumber(L, ref->getWidth());
- return 1;
- }
-
- static int l_getHeight(lua_State *L)
- {
- Ref<Image>& ref = checkImage(L);
- luax_pushnumber(L, ref->getHeight());
- return 1;
- }
-
- static int l_getPixel(lua_State* L)
- {
- Ref<Image>& ref = checkImage(L);
- int x = luax_checknumber(L, 2);
- int y = luax_checknumber(L, 3);
- color c = ref->getPixel(x, y);
- luax_pushnumber(L, c.rgba.r);
- luax_pushnumber(L, c.rgba.g);
- luax_pushnumber(L, c.rgba.b);
- luax_pushnumber(L, c.rgba.a);
- return 4;
- }
-
- static int l_setAnchor(lua_State* L)
- {
- Ref<Image>& ref = checkImage(L);
- int x = luax_checknumber(L, 2);
- int y = luax_checknumber(L, 3);
- ref->setAnchor(x, y);
- return 0;
- }
-
- static int l_getSize(lua_State* L)
- {
- Ref<Image>& ref = checkImage(L);
- luax_pushnumber(L, ref->getWidth());
- luax_pushnumber(L, ref->getHeight());
- return 2;
- }
-
- static int l_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_IMAGE);
- proxy->release();
- return 0;
- }
-
- static const luaL_Reg f[] = {
- { "__gc", l_gc },
- { "getWidth", l_getWidth },
- { "getHeight", l_getHeight },
- { "getSize", l_getSize },
- { "getPixel", l_getPixel },
- { "setAnchor", l_setAnchor },
- { 0, 0 }
- };
-
- int luaopen_Image(lua_State* L)
- {
- luax_newtype(L, JIN_GRAPHICS_IMAGE, f);
- return 0;
- }
-
-}// graphics
-}// jin \ No newline at end of file
diff --git a/src/lua/modules/graphics/jsl.cpp b/src/lua/modules/graphics/jsl.cpp
deleted file mode 100644
index ccd9ebd..0000000
--- a/src/lua/modules/graphics/jsl.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-#include "lua/modules/luax.h"
-#include "lua/modules/types.h"
-#include "lua/common/common.h"
-#include "libjin/jin.h"
-
-namespace jin
-{
-namespace lua
-{
-
- using namespace jin::graphics;
-
- typedef Texture Image;
-
- static inline Ref<JSLProgram>& checkJSLProgram(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER);
- return proxy->getRef<JSLProgram>();
- }
-
- static enum VARIABLE_TYPE
- {
- INVALID = 0,
-
- NUMBER,
- IMAGE,
- CANVAS,
- VEC2,
- VEC3,
- VEC4,
- COLOR,
- };
-
- static VARIABLE_TYPE strToType(const char* str)
- {
- std::string s = std::string(str);
- if (s == "number") return NUMBER;
- else if (s == "Image") return IMAGE;
- else if (s == "Canvas") return CANVAS;
- else if (s == "vec2") return VEC2;
- else if (s == "vec3") return VEC3;
- else if (s == "vec4") return VEC4;
- else if (s == "Color") return COLOR;
- else return INVALID;
- }
-
- /**
- * Use send function send variables to JSL program.
- */
- static int l_send(lua_State* L)
- {
- Ref<JSLProgram>& ref = checkJSLProgram(L);
- // number Image Texel
- const char* typestr = luax_checkstring(L, 2);
- // variable name
- const char* variable = luax_checkstring(L, 3);
- if (typestr != nullptr)
- {
- int type = strToType(typestr);
- switch (type)
- {
- case NUMBER:
- {
- float number = luax_checknumber(L, 4);
- ref->sendFloat(variable, number);
- break;
- }
- case IMAGE:
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 4, JIN_GRAPHICS_IMAGE);
- Ref<Image>& tex = proxy->getRef<Image>();
- ref->sendTexture(variable, tex.getObject());
- break;
- }
- case CANVAS:
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 4, JIN_GRAPHICS_CANVAS);
- Ref<Canvas>& canvas = proxy->getRef<Canvas>();
- ref->sendCanvas(variable, canvas.getObject());
- break;
- }
- case VEC2:
- {
- float x = luax_checknumber(L, 4);
- float y = luax_checknumber(L, 5);
- ref->sendVec2(variable, x, y);
- break;
- }
- case VEC3:
- {
- float x = luax_checknumber(L, 4);
- float y = luax_checknumber(L, 5);
- float z = luax_checknumber(L, 6);
- ref->sendVec3(variable, x, y, z);
- break;
- }
- case VEC4:
- {
- float x = luax_checknumber(L, 4);
- float y = luax_checknumber(L, 5);
- float z = luax_checknumber(L, 6);
- float w = luax_checknumber(L, 7);
- ref->sendVec4(variable, x, y, z, w);
- break;
- }
- case COLOR:
- {
- color col;
- col.rgba.r = luax_checkinteger(L, 4);
- col.rgba.g = luax_checkinteger(L, 5);
- col.rgba.b = luax_checkinteger(L, 6);
- col.rgba.a = luax_checkinteger(L, 7);
- ref->sendColor(variable, &col);
- break;
- }
- default:
- return 0;
- }
- }
- return 1;
- }
-
- static int l_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER);
- proxy->release();
- return 0;
- }
-
- static const luaL_Reg f[] = {
- { "__gc", l_gc },
- { "send", l_send },
- { 0, 0 }
- };
-
- /**
- * JSL program
- */
- int luaopen_JSL(lua_State* L)
- {
- luax_newtype(L, JIN_GRAPHICS_SHADER, f);
- return 0;
- }
-
-}
-} \ No newline at end of file
diff --git a/src/lua/modules/graphics/page.cpp b/src/lua/modules/graphics/page.cpp
new file mode 100644
index 0000000..8c9e918
--- /dev/null
+++ b/src/lua/modules/graphics/page.cpp
@@ -0,0 +1,73 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+#include <iostream>
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ typedef Ref<Font>& FontRef;
+
+ Page* getPage(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_PAGE);
+ return proxy->getObject<Page>();
+ }
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_PAGE);
+ {
+ /* release font */
+ Ref<Page>* page = &proxy->getRef<Page>();
+ RefBase* font = (RefBase*)page->getUserdata();
+ font->release();
+ }
+ proxy->release();
+ return 0;
+ }
+
+ static int l_getSize(lua_State* L)
+ {
+ Page* page = getPage(L);
+ luax_pushinteger(L, page->size.w);
+ luax_pushinteger(L, page->size.h);
+ return 2;
+ }
+
+ static int l_getWidth(lua_State* L)
+ {
+ Page* page = getPage(L);
+ luax_pushinteger(L, page->size.w);
+ return 1;
+ }
+
+ static int l_getHeight(lua_State* L)
+ {
+ Page* page = getPage(L);
+ luax_pushinteger(L, page->size.h);
+ return 1;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "getSize", l_getSize },
+ { "getWidth", l_getWidth },
+ { "getHeight", l_getHeight },
+ { 0, 0 }
+ };
+
+ int luaopen_Page(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_PAGE, f);
+ return 0;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/shader.cpp b/src/lua/modules/graphics/shader.cpp
new file mode 100644
index 0000000..d7733d4
--- /dev/null
+++ b/src/lua/modules/graphics/shader.cpp
@@ -0,0 +1,135 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ typedef Ref<Shader>& ShaderRef;
+
+ static inline ShaderRef checkShader(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER);
+ return proxy->getRef<Shader>();
+ }
+
+ /**
+ * jsl:sendNumber("variable", 0.1)
+ */
+ static int l_sendNumber (lua_State* L)
+ {
+ ShaderRef ref = checkShader(L);
+ const char* variable = luax_checkstring(L, 2);
+ float number = luax_checknumber(L, 3);
+ ref->sendFloat(variable, number);
+ return 0;
+ }
+
+ static int l_sendTexture (lua_State* L)
+ {
+ ShaderRef ref = checkShader(L);
+ const char* variable = luax_checkstring(L, 2);
+ Proxy* proxy = (Proxy*)luax_checktype(L, 3, JIN_GRAPHICS_TEXTURE);
+ Ref<Texture>& tex = proxy->getRef<Texture>();
+ ref->sendTexture(variable, tex.getObject());
+ return 0;
+ }
+
+ static int l_sendCanvas (lua_State* L)
+ {
+ ShaderRef ref = checkShader(L);
+ const char* variable = luax_checkstring(L, 2);
+ Proxy* proxy = (Proxy*)luax_checktype(L, 3, JIN_GRAPHICS_CANVAS);
+ Ref<Canvas>& canvas = proxy->getRef<Canvas>();
+ ref->sendCanvas(variable, canvas.getObject());
+ return 0;
+ }
+
+ static int l_sendVec2 (lua_State* L)
+ {
+ ShaderRef ref = checkShader(L);
+ const char* variable = luax_checkstring(L, 2);
+ if (!luax_istable(L, 3))
+ {
+ luax_typerror(L, 3, "table");
+ return 1;
+ }
+ float x = luax_rawgetnumber(L, 3, 1);
+ float y = luax_rawgetnumber(L, 3, 2);
+ ref->sendVec2(variable, x, y);
+ return 0;
+ }
+
+ static int l_sendVec3 (lua_State* L)
+ {
+ ShaderRef ref = checkShader(L);
+ const char* variable = luax_checkstring(L, 2);
+ if (!luax_istable(L, 3))
+ {
+ luax_typerror(L, 3, "table");
+ return 1;
+ }
+ float x = luax_rawgetnumber(L, 3, 1);
+ float y = luax_rawgetnumber(L, 3, 2);
+ float z = luax_rawgetnumber(L, 3, 3);
+ ref->sendVec3(variable, x, y, z);
+ return 0;
+ }
+
+ static int l_sendVec4 (lua_State* L)
+ {
+ ShaderRef ref = checkShader(L);
+ const char* variable = luax_checkstring(L, 2);
+ if (!luax_istable(L, 3))
+ {
+ luax_typerror(L, 3, "table");
+ return 1;
+ }
+ float x = luax_rawgetnumber(L, 3, 1);
+ float y = luax_rawgetnumber(L, 3, 2);
+ float z = luax_rawgetnumber(L, 3, 3);
+ float w = luax_rawgetnumber(L, 3, 4);
+ ref->sendVec4(variable, x, y, z, w);
+ return 0;
+ }
+
+ static int l_sendColor (lua_State* L)
+ {
+ return l_sendVec4(L);
+ }
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_SHADER);
+ proxy->release();
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "sendNumber", l_sendNumber },
+ { "sendTexture", l_sendTexture },
+ { "sendCanvas", l_sendCanvas },
+ { "sendVec2", l_sendVec2 },
+ { "sendVec3", l_sendVec3 },
+ { "sendVec4", l_sendVec4 },
+ { "sendColor", l_sendColor },
+ { 0, 0 }
+ };
+
+ /**
+ * JSL program
+ */
+ int luaopen_JSL(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_SHADER, f);
+ return 0;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/text.cpp b/src/lua/modules/graphics/text.cpp
new file mode 100644
index 0000000..cbc82f1
--- /dev/null
+++ b/src/lua/modules/graphics/text.cpp
@@ -0,0 +1,32 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXT);
+ p->release();
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { 0, 0 }
+ };
+
+ int luaopen_Text(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_TEXT, f);
+ return 0;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/texture.cpp b/src/lua/modules/graphics/texture.cpp
new file mode 100644
index 0000000..61bfaee
--- /dev/null
+++ b/src/lua/modules/graphics/texture.cpp
@@ -0,0 +1,65 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ typedef Ref<Texture>& TextureRef;
+
+ static inline TextureRef checkTexture(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTURE);
+ return proxy->getRef<Texture>();
+ }
+
+ static int l_getWidth(lua_State* L)
+ {
+ TextureRef ref = checkTexture(L);
+ luax_pushnumber(L, ref->getWidth());
+ return 1;
+ }
+
+ static int l_getHeight(lua_State *L)
+ {
+ TextureRef ref = checkTexture(L);
+ luax_pushnumber(L, ref->getHeight());
+ return 1;
+ }
+
+ static int l_getSize(lua_State* L)
+ {
+ TextureRef ref = checkTexture(L);
+ luax_pushnumber(L, ref->getWidth());
+ luax_pushnumber(L, ref->getHeight());
+ return 2;
+ }
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTURE);
+ proxy->release();
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "getWidth", l_getWidth },
+ { "getHeight", l_getHeight },
+ { "getSize", l_getSize },
+ { 0, 0 }
+ };
+
+ int luaopen_Texture(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_TEXTURE, f);
+ return 0;
+ }
+
+ }// lua
+}// jin \ No newline at end of file
diff --git a/src/lua/modules/graphics/texture_font.cpp b/src/lua/modules/graphics/texture_font.cpp
new file mode 100644
index 0000000..a2e88ba
--- /dev/null
+++ b/src/lua/modules/graphics/texture_font.cpp
@@ -0,0 +1,67 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT);
+ proxy->release();
+ return 0;
+ }
+
+ /* typeset(Text | string, lineheight, spacing) */
+ static int l_typeset(lua_State* L)
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TEXTUREFONT);
+ TextureFont* tf = p->getObject<TextureFont>();
+ int lineheight = luax_checkinteger(L, 3);
+ int spacing = luax_optnumber(L, 4, 0);
+ Page* page = nullptr;
+ if (luax_isstring(L, 2))
+ {
+ unsigned length;
+ const char* str = luax_checklstring(L, 2, &length);
+ Text text(Encode::UTF8, str, length);
+ page = tf->typeset(text, lineheight, spacing);
+ }
+ else if (luax_istype(L, 2, JIN_GRAPHICS_TEXT))
+ {
+ Proxy* p2 = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT);
+ Text* text = p2->getObject<Text>();
+ page = tf->typeset(*text, lineheight, spacing);
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_PAGE, sizeof(Proxy));
+ Ref<Page>* refPage = new Ref<Page>(page, JIN_GRAPHICS_PAGE);
+ {
+ /* retain related ttf */
+ Ref<TextureFont>& refTF = p->getRef<TextureFont>();
+ refTF.retain();
+ refPage->setUserdata(&refTF);
+ }
+ proxy->bind(refPage);
+ return 1;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "typeset", l_typeset },
+ { 0, 0 }
+ };
+
+ int luaopen_TextureFont(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_TEXTUREFONT, f);
+
+ return 0;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/ttf.cpp b/src/lua/modules/graphics/ttf.cpp
new file mode 100644
index 0000000..414c7eb
--- /dev/null
+++ b/src/lua/modules/graphics/ttf.cpp
@@ -0,0 +1,73 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF);
+ {
+ /* release ttf data */
+ Ref<TTF>* ttf = &proxy->getRef<TTF>();
+ RefBase* data = (RefBase*)ttf->getUserdata();
+ data->release();
+ }
+ proxy->release();
+ return 0;
+ }
+
+ /* typeset(Text | string, lineheight, spacing) */
+ static int l_typeset(lua_State* L)
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTF);
+ TTF* ttf = p->getObject<TTF>();
+ int lineheight = luax_optnumber(L, 3, ttf->getFontSize());
+ int spacing = luax_optnumber(L, 4, 0);
+ Page* page = nullptr;
+ if (luax_isstring(L, 2))
+ {
+ unsigned length;
+ const char* str = luax_checklstring(L, 2, &length);
+ Text text(Encode::UTF8, str, length);
+ page = ttf->typeset(text, lineheight, spacing);
+ }
+ else if (luax_istype(L, 2, JIN_GRAPHICS_TEXT))
+ {
+ Proxy* p2 = (Proxy*)luax_checktype(L, 2, JIN_GRAPHICS_TEXT);
+ Text* text = p2->getObject<Text>();
+ page = ttf->typeset(*text, lineheight, spacing);
+ }
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_PAGE, sizeof(Proxy));
+ Ref<Page>* refPage = new Ref<Page>(page, JIN_GRAPHICS_PAGE);
+ {
+ /* retain related ttf */
+ Ref<TTF>& refTTF = p->getRef<TTF>();
+ refTTF.retain();
+ refPage->setUserdata(&refTTF);
+ }
+ proxy->bind(refPage);
+ return 1;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "typeset", l_typeset },
+ { 0, 0 }
+ };
+
+ int luaopen_TTF(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_TTF, f);
+
+ return 0;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/graphics/ttfData.cpp b/src/lua/modules/graphics/ttfData.cpp
new file mode 100644
index 0000000..43c3613
--- /dev/null
+++ b/src/lua/modules/graphics/ttfData.cpp
@@ -0,0 +1,51 @@
+#include "lua/modules/luax.h"
+#include "lua/modules/types.h"
+#include "lua/common/common.h"
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+ using namespace JinEngine::Graphics;
+
+ static int l_newTTF(lua_State* L)
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTFDATA);
+ int fontsize = luax_checkinteger(L, 2);
+ Ref<TTFData>& refFontData = p->getRef<TTFData>();
+ TTFData* fontData = refFontData.getObject();
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_GRAPHICS_TTF, sizeof(Proxy));
+ TTF* font = fontData->createTTF(fontsize);
+ Ref<TTF>* refTTF = new Ref<TTF>(font, JIN_GRAPHICS_TTF);
+ {
+ Ref<TTFData>& refTTFData = p->getRef<TTFData>();
+ refTTFData.retain();
+ refTTF->setUserdata(&refTTFData);
+ }
+ proxy->bind(refTTF);
+ return 1;
+ }
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* p = (Proxy*)luax_checktype(L, 1, JIN_GRAPHICS_TTFDATA);
+ p->release();
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "__gc", l_gc },
+ { "newTTF", l_newTTF },
+ { 0, 0 }
+ };
+
+ int luaopen_TTFData(lua_State* L)
+ {
+ luax_newtype(L, JIN_GRAPHICS_TTFDATA, f);
+ return 0;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/jin.cpp b/src/lua/modules/jin.cpp
deleted file mode 100644
index a25ec6c..0000000
--- a/src/lua/modules/jin.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-#include "jin.h"
-#include "lua/modules/luax.h"
-#include "embed/embed.h"
-
-namespace jin
-{
-namespace lua
-{
-
- extern int luaopen_core(lua_State* L);
- extern int luaopen_graphics(lua_State* L);
- extern int luaopen_audio(lua_State* L);
- extern int luaopen_net(lua_State* L);
- extern int luaopen_event(lua_State* L);
- extern int luaopen_time(lua_State* L);
- extern int luaopen_mouse(lua_State* L);
- extern int luaopen_keyboard(lua_State* L);
- extern int luaopen_filesystem(lua_State* L);
- extern int luaopen_joypad(lua_State* L);
- extern int luaopen_math(lua_State* L);
- extern int luaopen_thread(lua_State* L);
- extern int luaopen_bit(lua_State* L);
-
- static int l_getversion(lua_State* L)
- {
- luax_pushstring(L, VERSION);
- return 1;
- }
-
- static int l_getAuthor(lua_State* L)
- {
- luax_pushstring(L, AUTHOR);
- return 1;
- }
-
- static int l_getOS(lua_State* L)
- {
- #ifdef _WIN32
- luax_pushstring(L, "windows");
- #elif defined __unix__
- luax_pushstring(L, "unix");
- #elif defined __APPLE__
- luax_pushstring(L, "macos");
- #endif
- return 1;
- }
-
- static int l_revision(lua_State* L)
- {
- luax_pushnumber(L, REVISION);
- return 1;
- }
-
- static const luaL_Reg f[] = {
- { "version", l_getversion },
- { "revision", l_revision },
- { "author", l_getAuthor },
- { "os", l_getOS },
- { 0, 0 }
- };
-
- // submodules
- static const luaL_Reg mods[] = {
- { "core", luaopen_core },
- { "event", luaopen_event },
- { "graphics", luaopen_graphics },
- { "time", luaopen_time },
- { "mouse", luaopen_mouse },
- { "keyboard", luaopen_keyboard },
- { "filesystem", luaopen_filesystem },
- { "net", luaopen_net },
- { "audio", luaopen_audio },
- { "joypad", luaopen_joypad },
- { "math", luaopen_math },
- { "thread", luaopen_thread },
- { "bit", luaopen_bit },
- { 0, 0 }
- };
-
- int luaopen_jin(lua_State* L)
- {
- // jin module is on top of the stack
- luax_newlib(L, f);
-
- // set to global field
- luax_justglobal(L, -1, MODULE_NAME);
-
- // register submodules
- for (int i = 0; mods[i].name; ++i)
- {
- mods[i].func(L);
- luax_setfield(L, -2, mods[i].name);
- }
-
- return 1;
- }
-
- void boot(lua_State* L)
- {
- jin::embed::boot(L);
- }
-
-} // lua
-} // jin \ No newline at end of file
diff --git a/src/lua/modules/jin.h b/src/lua/modules/jin.h
deleted file mode 100644
index 07531b2..0000000
--- a/src/lua/modules/jin.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
-* Copyright (C) 2016~2018 chai
-*
-* Permission is hereby granted, free of charge, to any person obtaining a copyof
-* this software and associated documentation files (the "Software"), to deal in
-* the Software without restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-* Software, and to permit persons to whom the Software is furnished to do so,
-* subject to the following conditions:
-*
-* The above copyright notice and this permission notice shall be included in all
-* copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef __JIN_M_JIN_H
-#define __JIN_M_JIN_H
-#include "luax.h"
-
-#define MODULE_NAME "jin"
-#define VERSION "0.1.1"
-#define REVISION 101
-#define AUTHOR "chai"
-
-namespace jin
-{
-namespace lua
-{
-
- int luaopen_jin(lua_State* L);
- void boot(lua_State* L);
-
-} // jin
-} // lua
-
-#endif // __JIN_M_JIN_H \ No newline at end of file
diff --git a/src/lua/modules/joypad/joypad.cpp b/src/lua/modules/joypad/joypad.cpp
index d305878..d67a624 100644
--- a/src/lua/modules/joypad/joypad.cpp
+++ b/src/lua/modules/joypad/joypad.cpp
@@ -1,21 +1,21 @@
#include "libjin/jin.h"
#include "lua/modules/luax.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- static const luaL_Reg f[] = {
- { 0, 0 }
- };
-
- int luaopen_joypad(lua_State* L)
+ namespace Lua
{
- luax_newlib(L, f);
- return 1;
- }
+ static const luaL_Reg f[] = {
+ { 0, 0 }
+ };
+
+ int luaopen_joypad(lua_State* L)
+ {
+ luax_newlib(L, f);
-}
-} \ No newline at end of file
+ return 1;
+ }
+ /*SDL_JoystickGetButton*/
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/keyboard/keyboard.cpp b/src/lua/modules/keyboard/keyboard.cpp
index 9d27a4f..727a51e 100644
--- a/src/lua/modules/keyboard/keyboard.cpp
+++ b/src/lua/modules/keyboard/keyboard.cpp
@@ -1,16 +1,16 @@
#include "lua/modules/luax.h"
-#include "lua/modules/embed/keyboard.lua.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- int luaopen_keyboard(lua_State* L)
+ namespace Lua
{
- luax_newlib(L, 0);
- return 1;
- }
+ //https://wiki.libsdl.org/SDL_Keycode
+
+ int luaopen_keyboard(lua_State* L)
+ {
+ luax_newlib(L, 0);
+ return 1;
+ }
-}
-} \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/luax.h b/src/lua/modules/luax.h
index 89e456e..f45af39 100644
--- a/src/lua/modules/luax.h
+++ b/src/lua/modules/luax.h
@@ -1,7 +1,6 @@
-#ifndef __JIN_LUA_LUAX_H
-#define __JIN_LUA_LUAX_H
+#ifndef __JIN_MODULES_LUAX_H
+#define __JIN_MODULES_LUAX_H
-#include "LuaJIT/lua.hpp"
-#include "lua/libraries/luax/luax.h"
+#include "../luax.h"
#endif \ No newline at end of file
diff --git a/src/lua/modules/math/math.cpp b/src/lua/modules/math/math.cpp
index fa59e04..4891762 100644
--- a/src/lua/modules/math/math.cpp
+++ b/src/lua/modules/math/math.cpp
@@ -1,30 +1,30 @@
#include "lua/modules/luax.h"
#include "libjin/jin.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- static int l_mod(lua_State* L)
+ namespace Lua
{
- int n = luax_checkinteger(L, 1);
- int m = luax_checkinteger(L, 2);
- int mod = n % m;
- luax_pushinteger(L, mod);
- return 1;
- }
- static const luaL_Reg f[] = {
- { "mod", l_mod },
- { 0, 0 }
- };
+ static int l_mod(lua_State* L)
+ {
+ int n = luax_checkinteger(L, 1);
+ int m = luax_checkinteger(L, 2);
+ int mod = n % m;
+ luax_pushinteger(L, mod);
+ return 1;
+ }
- int luaopen_math(lua_State* L)
- {
- luax_newlib(L, f);
- return 1;
- }
+ static const luaL_Reg f[] = {
+ { "mod", l_mod },
+ { 0, 0 }
+ };
+
+ int luaopen_math(lua_State* L)
+ {
+ luax_newlib(L, f);
+ return 1;
+ }
-}
-} \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/mouse/mouse.cpp b/src/lua/modules/mouse/mouse.cpp
index f907abb..9d45178 100644
--- a/src/lua/modules/mouse/mouse.cpp
+++ b/src/lua/modules/mouse/mouse.cpp
@@ -1,31 +1,42 @@
#include "lua/modules/luax.h"
#include "libjin/jin.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
- using namespace jin::input;
-
- static int l_pos(lua_State* L)
+ namespace Lua
{
- static Mouse* mouse = Mouse::get();
- int x, y;
- mouse->getState(&x, &y);
- luax_pushnumber(L, x);
- luax_pushnumber(L, y);
- return 2;
- }
- static const luaL_Reg f[] = {
- { "position", l_pos },
- { 0, 0 }
- };
+ using namespace JinEngine::Input;
+
+ static int l_pos(lua_State* L)
+ {
+ static Mouse* mouse = Mouse::get();
+ int x, y;
+ mouse->getState(&x, &y);
+ luax_pushnumber(L, x);
+ luax_pushnumber(L, y);
+ return 2;
+ }
+
+ static int l_setVisible(lua_State* L)
+ {
+ bool visible = luax_checkbool(L, 1);
+ Mouse* mouse = Mouse::get();
+ mouse->setVisible(visible);
+ return 0;
+ }
+
+ static const luaL_Reg f[] = {
+ { "position", l_pos },
+ { "setVisible", l_setVisible },
+ { 0, 0 }
+ };
- int luaopen_mouse(lua_State* L)
- {
- luax_newlib(L, f);
- return 1;
- }
-}
-} \ No newline at end of file
+ int luaopen_mouse(lua_State* L)
+ {
+ luax_newlib(L, f);
+ return 1;
+ }
+
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/net/Buffer.cpp b/src/lua/modules/net/Buffer.cpp
index 3354518..ddfbd6b 100644
--- a/src/lua/modules/net/Buffer.cpp
+++ b/src/lua/modules/net/Buffer.cpp
@@ -4,133 +4,139 @@
#include "libjin/jin.h"
#include "Buffer.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-namespace net
-{
-
- static inline Ref<Buffer>& checkNetBuffer(lua_State* L)
+ namespace Lua
{
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER);
- return proxy->getRef<Buffer>();
- }
-
- // net.Buffer:append(value) -> value_length
- static int l_append(lua_State* L)
- {
- Ref<Buffer>& ref = checkNetBuffer(L);
- const int vp = 2;
- if (luax_isintegerstrict(L, vp))
- {
- int n = luax_checkinteger(L, vp);
- int size = sizeof(n);
- ref->append(&n, size);
- luax_pushinteger(L, size);
- return 1;
- }
- else if (luax_isfloatstrict(L, vp))
- {
- float n = luax_checknumber(L, vp);
- int size = sizeof(n);
- ref->append(&n, size);
- luax_pushinteger(L, size);
- return 1;
- }
- else if (luax_isbooleanstrict(L, vp))
- {
- bool n = luax_checkbool(L, vp);
- int size = sizeof(n);
- ref->append(&n, size);
- luax_pushinteger(L, size);
- return 1;
- }
- else if (luax_isstringstrict(L, vp))
+ namespace Net
{
- const char* str = luax_checkstring(L, vp);
- int size = strlen(str) + 1;
- ref->append(str, size);
- luax_pushinteger(L, size);
- return 1;
- }
- else
- {
- luax_typerror(L, vp, "number, bool or string");
- return 0;
- }
- }
- // net.Buffer:grabString(offset) -> string, length
- static int l_grabString(lua_State* L)
- {
- Ref<Buffer>& ref = checkNetBuffer(L);
- int offset = luax_checkinteger(L, 2);
- int len;
- const char* str = ref->grabString(&len, offset);
- luax_pushstring(L, str);
- luax_pushinteger(L, len);
- return 2;
- }
+ using namespace JinEngine;
- // net.Buffer:grabInteger(offset) -> integer, length
- static int l_grabInteger(lua_State* L)
- {
- Ref<Buffer>& ref = checkNetBuffer(L);
- int offset = luax_checkinteger(L, 2);
- int len;
- int integer = ref->grabInteger(&len, offset);
- luax_pushinteger(L, integer);
- luax_pushinteger(L, len);
- return 2;
- }
+ typedef Ref<Buffer>& BufferRef;
- static int l_grabFloat(lua_State* L)
- {
- Ref<Buffer>& ref = checkNetBuffer(L);
- int offset = luax_checkinteger(L, 2);
- int len;
- float floatv = ref->grabFloat(&len, offset);
- luax_pushnumber(L, floatv);
- luax_pushinteger(L, len);
- return 2;
- }
+ static inline BufferRef checkNetBuffer(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER);
+ return proxy->getRef<Buffer>();
+ }
- static int l_grabBoolean(lua_State* L)
- {
- Ref<Buffer>& ref = checkNetBuffer(L);
- int offset = luax_checkinteger(L, 2);
- int len;
- bool boolean = ref->grabBoolean(&len, offset);
- luax_pushboolean(L, boolean);
- luax_pushinteger(L, len);
- return 2;
- }
+ // net.Buffer:append(value) -> value_length
+ static int l_append(lua_State* L)
+ {
+ BufferRef ref = checkNetBuffer(L);
+ const int vp = 2;
+ if (luax_isintegerstrict(L, vp))
+ {
+ int n = luax_checkinteger(L, vp);
+ int size = sizeof(n);
+ ref->append(&n, size);
+ luax_pushinteger(L, size);
+ return 1;
+ }
+ else if (luax_isfloatstrict(L, vp))
+ {
+ float n = luax_checknumber(L, vp);
+ int size = sizeof(n);
+ ref->append(&n, size);
+ luax_pushinteger(L, size);
+ return 1;
+ }
+ else if (luax_isbooleanstrict(L, vp))
+ {
+ bool n = luax_checkbool(L, vp);
+ int size = sizeof(n);
+ ref->append(&n, size);
+ luax_pushinteger(L, size);
+ return 1;
+ }
+ else if (luax_isstringstrict(L, vp))
+ {
+ const char* str = luax_checkstring(L, vp);
+ int size = strlen(str) + 1;
+ ref->append(str, size);
+ luax_pushinteger(L, size);
+ return 1;
+ }
+ else
+ {
+ luax_typerror(L, vp, "number, bool or string");
+ return 0;
+ }
+ }
- static int l_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER);
- proxy->release();
- return 0;
- }
+ // net.Buffer:grabString(offset) -> string, length
+ static int l_grabString(lua_State* L)
+ {
+ BufferRef ref = checkNetBuffer(L);
+ int offset = luax_checkinteger(L, 2);
+ unsigned int len;
+ char* data = ref->grabString(&len, offset);
+ Array<char> str;
+ str.bind(data, len);
+ luax_pushstring(L, &str);
+ luax_pushinteger(L, str.count());
+ return 2;
+ }
- static const luaL_Reg netbuffer_function[] = {
- { "__gc", l_gc },
- { "append", l_append },
- { "grabString", l_grabString },
- { "grabInteger", l_grabInteger },
- { "grabBoolean", l_grabBoolean },
- { "grabFloat", l_grabFloat },
- { 0, 0 }
- };
+ // net.Buffer:grabInteger(offset) -> integer, length
+ static int l_grabInteger(lua_State* L)
+ {
+ BufferRef ref = checkNetBuffer(L);
+ int offset = luax_checkinteger(L, 2);
+ int len;
+ int integer = ref->grabInteger(&len, offset);
+ luax_pushinteger(L, integer);
+ luax_pushinteger(L, len);
+ return 2;
+ }
-} // net
+ static int l_grabFloat(lua_State* L)
+ {
+ BufferRef ref = checkNetBuffer(L);
+ int offset = luax_checkinteger(L, 2);
+ int len;
+ float floatv = ref->grabFloat(&len, offset);
+ luax_pushnumber(L, floatv);
+ luax_pushinteger(L, len);
+ return 2;
+ }
- int luaopen_Buffer(lua_State* L)
- {
- luax_newtype(L, JIN_NETWORK_BUFFER, net::netbuffer_function);
- return 0;
- }
+ static int l_grabBoolean(lua_State* L)
+ {
+ BufferRef ref = checkNetBuffer(L);
+ int offset = luax_checkinteger(L, 2);
+ int len;
+ bool boolean = ref->grabBoolean(&len, offset);
+ luax_pushboolean(L, boolean);
+ luax_pushinteger(L, len);
+ return 2;
+ }
+
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_BUFFER);
+ proxy->release();
+ return 0;
+ }
+
+ static const luaL_Reg netbuffer_function[] = {
+ { "__gc", l_gc },
+ { "append", l_append },
+ { "grabString", l_grabString },
+ { "grabInteger", l_grabInteger },
+ { "grabBoolean", l_grabBoolean },
+ { "grabFloat", l_grabFloat },
+ { 0, 0 }
+ };
+
+ } // namespace Net
+
+ int luaopen_Buffer(lua_State* L)
+ {
+ luax_newtype(L, JIN_NETWORK_BUFFER, Net::netbuffer_function);
+ return 0;
+ }
-} // lua
-} // jin \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/net/Buffer.h b/src/lua/modules/net/Buffer.h
index 31e6df8..8733778 100644
--- a/src/lua/modules/net/Buffer.h
+++ b/src/lua/modules/net/Buffer.h
@@ -5,92 +5,93 @@
#include <cstdlib>
#include "lua/common/common.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-namespace net
-{
-
- class Buffer
+ namespace Lua
{
- public:
- Buffer(size_t s = 0)
- : size(s)
+ namespace Net
{
- buffer = new char[size];
- memset(buffer, 0, size);
- }
- Buffer(const char* data, size_t s)
- : size(s)
- {
- buffer = new char[size];
- memcpy(buffer, data, size);
- }
-
- ~Buffer()
- {
- if (buffer != nullptr)
+ class Buffer
{
- delete[] buffer;
- buffer = nullptr;
- size = 0;
- }
- }
+ public:
+ Buffer(size_t s = 0)
+ : size(s)
+ {
+ buffer = new char[size];
+ memset(buffer, 0, size);
+ }
- void append(const void* data, size_t s)
- {
- if (data == nullptr)
- return;
- char* buf = buffer;
- buffer = new char[size + s];
- memcpy(buffer, buf, size);
- memcpy(buffer + size, data, s);
- delete[] buf;
- size += s;
- return;
- }
+ Buffer(const char* data, size_t s)
+ : size(s)
+ {
+ buffer = new char[size];
+ memcpy(buffer, data, size);
+ }
- const char* grabString(int* length, int offset = 0)
- {
- int l = offset;
- for (; l < size; ++l)
- {
- if (buffer[l] == 0)
- break;
- }
- *length = l - offset + 1;
- char* str = (char*)malloc(*length);
- memcpy(str, buffer + offset, *length);
- return str;
- }
+ ~Buffer()
+ {
+ if (buffer != nullptr)
+ {
+ delete[] buffer;
+ buffer = nullptr;
+ size = 0;
+ }
+ }
- int grabInteger(int* length, int offset = 0)
- {
- *length = sizeof(int);
- return *((int*)(buffer + offset));
- }
+ void append(const void* data, size_t s)
+ {
+ if (data == nullptr)
+ return;
+ char* buf = buffer;
+ buffer = new char[size + s];
+ memcpy(buffer, buf, size);
+ memcpy(buffer + size, data, s);
+ delete[] buf;
+ size += s;
+ return;
+ }
- float grabFloat(int* length, int offset = 0)
- {
- *length = sizeof(float);
- return *((float*)(buffer + offset));
- }
+ /* grab and create a string */
+ char* grabString(unsigned int* length, int offset = 0)
+ {
+ int l = offset;
+ for (; l < size; ++l)
+ {
+ if (buffer[l] == 0)
+ break;
+ }
+ *length = l - offset + 1;
+ char* str = (char*)malloc(*length);
+ memcpy(str, buffer + offset, *length);
+ return str;
+ }
- bool grabBoolean(int* length, int offset = 0)
- {
- *length = sizeof(bool);
- return *((bool*)(buffer + offset));
- }
+ int grabInteger(int* length, int offset = 0)
+ {
+ *length = sizeof(int);
+ return *((int*)(buffer + offset));
+ }
+
+ float grabFloat(int* length, int offset = 0)
+ {
+ *length = sizeof(float);
+ return *((float*)(buffer + offset));
+ }
+
+ bool grabBoolean(int* length, int offset = 0)
+ {
+ *length = sizeof(bool);
+ return *((bool*)(buffer + offset));
+ }
- char* buffer;
- size_t size;
+ char* buffer;
+ size_t size;
- };
+ };
-} // net
-} // lua
-} // jin
+ } // namespace Net
+ } // namespace Lua
+} // namespace JinEngine
#endif \ No newline at end of file
diff --git a/src/lua/modules/net/net.cpp b/src/lua/modules/net/net.cpp
index a984920..4ef9ece 100644
--- a/src/lua/modules/net/net.cpp
+++ b/src/lua/modules/net/net.cpp
@@ -4,16 +4,17 @@
#include "lua/common/common.h"
#include "Buffer.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
+namespace Lua
{
- using namespace jin::lua::net;
- using namespace jin::net;
+
+ using namespace JinEngine::Lua::Net;
+ using namespace JinEngine::Net;
static int l_initNetwork(lua_State* L)
{
- jin::net::Net::get()->init();
+ JinEngine::Net::NetManager::get()->init();
return 1;
}
@@ -56,7 +57,7 @@ namespace lua
{
int size = luax_checkinteger(L, 1);
Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy));
- net::Buffer* buffer = new net::Buffer(size);
+ Net::Buffer* buffer = new Net::Buffer(size);
proxy->bind(new Ref<Buffer>(buffer, JIN_NETWORK_BUFFER));
return 1;
}
@@ -81,5 +82,5 @@ namespace lua
return 1;
}
-} // lua
-} // jin \ No newline at end of file
+} // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/net/socket.cpp b/src/lua/modules/net/socket.cpp
index 6d3fdfb..d6de730 100644
--- a/src/lua/modules/net/socket.cpp
+++ b/src/lua/modules/net/socket.cpp
@@ -4,124 +4,126 @@
#include "libjin/jin.h"
#include "Buffer.h"
-namespace jin
-{
-namespace lua
+namespace JinEngine
{
+ namespace Lua
+ {
- using namespace jin::net;
- using namespace lua::net;
+ using namespace JinEngine::Net;
+ using namespace Lua::Net;
- const int BUFFER_SIZE = 1024;
+ typedef Ref<Socket>& SocketRef;
- static inline Ref<Socket>& checkSocket(lua_State* L, int pos = 1)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_SOCKET);
- return proxy->getRef<Socket>();
- }
+ const int BUFFER_SIZE = 1024;
- static inline Ref<Buffer>& checkNetBuffer(lua_State* L, int pos = 1)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_BUFFER);
- return proxy->getRef<Buffer>();
- }
+ static inline SocketRef checkSocket(lua_State* L, int pos = 1)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_SOCKET);
+ return proxy->getRef<Socket>();
+ }
- // return net.Socket
- static int l_accept(lua_State* L)
- {
- Ref<Socket>& socket = checkSocket(L);
- Socket* client = socket->accept();
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_SOCKET, sizeof(Proxy));
- proxy->bind(new Ref<Socket>(client, JIN_NETWORK_SOCKET));
- return 1;
- }
+ static inline Ref<Buffer>& checkNetBuffer(lua_State* L, int pos = 1)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, pos, JIN_NETWORK_BUFFER);
+ return proxy->getRef<Buffer>();
+ }
+
+ // return net.Socket
+ static int l_accept(lua_State* L)
+ {
+ SocketRef socket = checkSocket(L);
+ Socket* client = socket->accept();
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_SOCKET, sizeof(Proxy));
+ proxy->bind(new Ref<Socket>(client, JIN_NETWORK_SOCKET));
+ return 1;
+ }
- // return net.Buffer
- static int l_receive(lua_State* L)
- {
- Ref<Socket>& socket = checkSocket(L);
- char buffer[BUFFER_SIZE] = {0};
- int size = socket->receive(buffer, BUFFER_SIZE);
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy));
- net::Buffer* netBuffer = new net::Buffer(buffer, size);
- proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER));
- return 1;
- }
+ // return net.Buffer
+ static int l_receive(lua_State* L)
+ {
+ SocketRef socket = checkSocket(L);
+ char buffer[BUFFER_SIZE] = {0};
+ int size = socket->receive(buffer, BUFFER_SIZE);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy));
+ Net::Buffer* netBuffer = new Net::Buffer(buffer, size);
+ proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER));
+ return 1;
+ }
- // Socket:receiveFrom(address, port)
- static int l_receiveFrom(lua_State* L)
- {
- Ref<Socket>& socket = checkSocket(L);
- int address = luax_checkinteger(L, 2);
- int port = luax_checkinteger(L, 3);
- char buffer[BUFFER_SIZE];
- int size = socket->receiveFrom(buffer, BUFFER_SIZE, address, port);
- net::Buffer* netBuffer = new net::Buffer(buffer, size);
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy));
- proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER));
- return 1;
- }
+ // Socket:receiveFrom(address, port)
+ static int l_receiveFrom(lua_State* L)
+ {
+ SocketRef socket = checkSocket(L);
+ int address = luax_checkinteger(L, 2);
+ int port = luax_checkinteger(L, 3);
+ char buffer[BUFFER_SIZE];
+ int size = socket->receiveFrom(buffer, BUFFER_SIZE, address, port);
+ Net::Buffer* netBuffer = new Net::Buffer(buffer, size);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_NETWORK_BUFFER, sizeof(Proxy));
+ proxy->bind(new Ref<Buffer>(netBuffer, JIN_NETWORK_BUFFER));
+ return 1;
+ }
- // Socket:send(net.Buffer) -> data_length
- static int l_send(lua_State* L)
- {
- Ref<Socket>& socket = checkSocket(L);
- Ref<Buffer>& ref = checkNetBuffer(L, 2);
- int len = socket->send(ref->buffer, ref->size);
- luax_pushinteger(L, len);
- return 1;
- }
+ // Socket:send(net.Buffer) -> data_length
+ static int l_send(lua_State* L)
+ {
+ SocketRef socket = checkSocket(L);
+ Ref<Buffer>& ref = checkNetBuffer(L, 2);
+ int len = socket->send(ref->buffer, ref->size);
+ luax_pushinteger(L, len);
+ return 1;
+ }
- // Socket:sendTo(address, port, net.Buffer)
- static int l_sendTo(lua_State* L)
- {
- Ref<Socket>& socket = checkSocket(L);
- int address = luax_checkinteger(L, 2);
- int port = luax_checkinteger(L, 3);
- Ref<Buffer>& buffer = checkNetBuffer(L, 4);
- socket->sendTo(buffer->buffer, buffer->size, address, port);
- return 0;
- }
+ // Socket:sendTo(address, port, net.Buffer)
+ static int l_sendTo(lua_State* L)
+ {
+ SocketRef socket = checkSocket(L);
+ int address = luax_checkinteger(L, 2);
+ int port = luax_checkinteger(L, 3);
+ Ref<Buffer>& buffer = checkNetBuffer(L, 4);
+ socket->sendTo(buffer->buffer, buffer->size, address, port);
+ return 0;
+ }
- static int l_close(lua_State* L)
- {
- Ref<Socket>& socket = checkSocket(L);
- socket->close();
- return 0;
- }
+ static int l_close(lua_State* L)
+ {
+ SocketRef socket = checkSocket(L);
+ socket->close();
+ return 0;
+ }
- static int l_configBlocking(lua_State* L)
- {
- Ref<Socket>& socket = checkSocket(L);
- bool blocking = luax_checkbool(L, 2);
- socket->configureBlocking(blocking);
- return 0;
- }
+ static int l_configBlocking(lua_State* L)
+ {
+ SocketRef socket = checkSocket(L);
+ bool blocking = luax_checkbool(L, 2);
+ socket->configureBlocking(blocking);
+ return 0;
+ }
- static int l_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_SOCKET);
- proxy->release();
- return 0;
- }
+ static int l_gc(lua_State* L)
+ {
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_NETWORK_SOCKET);
+ proxy->release();
+ return 0;
+ }
- static const luaL_Reg socket_function[] = {
- { "__gc", l_gc },
- { "accept", l_accept },
- { "receive", l_receive },
- { "receiveFrom", l_receiveFrom },
- { "send", l_send },
- { "sendTo", l_sendTo },
- { "close", l_close },
- { "configBlocking", l_configBlocking },
- { 0, 0 }
- };
+ static const luaL_Reg socket_function[] = {
+ { "__gc", l_gc },
+ { "accept", l_accept },
+ { "receive", l_receive },
+ { "receiveFrom", l_receiveFrom },
+ { "send", l_send },
+ { "sendTo", l_sendTo },
+ { "close", l_close },
+ { "configBlocking", l_configBlocking },
+ { 0, 0 }
+ };
- int luaopen_Socket(lua_State* L)
- {
- luax_newtype(L, JIN_NETWORK_SOCKET, socket_function);
- return 0;
- }
+ int luaopen_Socket(lua_State* L)
+ {
+ luax_newtype(L, JIN_NETWORK_SOCKET, socket_function);
+ return 0;
+ }
-} // lua
-} // jin \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/physics/physics.cpp b/src/lua/modules/physics/physics.cpp
deleted file mode 100644
index a5b9162..0000000
--- a/src/lua/modules/physics/physics.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "../luax.h"
-#include "libjin/Physics/Physics.h"
-
-namespace jin
-{
-namespace lua
-{
-
- using namespace jin::physics;
-
- int luaopen_physics(lua_State* L)
- {
- }
-
-} // physics
-} // jin \ No newline at end of file
diff --git a/src/lua/modules/thread/Thread.cpp b/src/lua/modules/thread/Thread.cpp
index 5c9cb1f..e1c5a92 100644
--- a/src/lua/modules/thread/Thread.cpp
+++ b/src/lua/modules/thread/Thread.cpp
@@ -1,249 +1,252 @@
#include "lua/modules/luax.h"
#include "lua/modules/types.h"
#include "libjin/jin.h"
-#include "lua/modules/jin.h"
+#include "lua/jin.h"
#include "lua/common/common.h"
#include "thread.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-
- using thread::Thread;
-
- int luaopen_thread(lua_State* L);
-
- static inline Ref<Thread>& checkThread(lua_State* L)
+ namespace Lua
{
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD);
- return proxy->getRef<Thread>();
- }
- static int threadRunner(void* t)
- {
- Ref<Thread>& ref = *(Ref<Thread>*)t;
- lua_State* L = lua_open();
- luax_openlibs(L);
- luaopen_jin(L);
- luax_getglobal(L, MODULE_NAME);
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy));
- ref.retain();
- proxy->bind(&ref);
- luax_setfield(L, -2, "_curThread");
- luax_dostring(L, ref->code.c_str());
- luax_close(L);
- return 0;
- }
-
- static int l_thread_gc(lua_State* L)
- {
- Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD);
- proxy->release();
- return 0;
- }
+ using thread::Thread;
- static int l_start(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- bool result = ref->start(&ref);
- luax_pushboolean(L, result);
- return 1;
- }
+ typedef Ref<Thread>& ThreadRef;
- static int l_wait(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- ref->wait();
- return 0;
- }
+ int luaopen_thread(lua_State* L);
- static int l_send(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- const int vp = 3;
- if (luax_isnumberstrict(L, vp))
+ static inline ThreadRef checkThread(lua_State* L)
{
- float real = luax_checknumber(L, vp);
- ref->send(slot, real);
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD);
+ return proxy->getRef<Thread>();
}
- else if (luax_isbooleanstrict(L, vp))
+
+ static int threadRunner(void* t)
{
- bool bol = luax_checkbool(L, vp);
- ref->send(slot, bol);
+ ThreadRef ref = *(Ref<Thread>*)t;
+ lua_State* L = lua_open();
+ luax_openlibs(L);
+ luaopen_jin(L);
+ luax_getglobal(L, MODULE_NAME);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy));
+ ref.retain();
+ proxy->bind(&ref);
+ luax_setfield(L, -2, "_curThread");
+ luax_dostring(L, ref->code.c_str());
+ luax_close(L);
+ return 0;
}
- else if (luax_isstringstrict(L, vp))
+
+ static int l_thread_gc(lua_State* L)
{
- const char* str = luax_checkstring(L, vp);
- ref->send(slot, str);
+ Proxy* proxy = (Proxy*)luax_checktype(L, 1, JIN_THREAD_THREAD);
+ proxy->release();
+ return 0;
}
- else if (luax_isuserdata(L, vp))
+
+ static int l_start(lua_State* L)
{
- void* p = luax_touserdata(L, vp);
- ref->send(slot, p);
+ ThreadRef ref = checkThread(L);
+ bool result = ref->start(&ref);
+ luax_pushboolean(L, result);
+ return 1;
}
- else if (luax_islightuserdata(L, vp))
+
+ static int l_wait(lua_State* L)
{
- void* p = luax_tolightuserdata(L, vp);
- ref->send(slot, p);
+ ThreadRef ref = checkThread(L);
+ ref->wait();
+ return 0;
}
- return 0;
- }
- static int l_receive(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- bool result = ref->receive(slot);
- luax_pushboolean(L, result);
- return 1;
- }
-
- static int l_fetch(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- Thread::Variant v = ref->fetch(slot);
- switch (v.type)
+ static int l_send(lua_State* L)
{
- case thread::Thread::Variant::INTERGER:
- luax_pushinteger(L, v.integer);
- break;
-
- case thread::Thread::Variant::BOOLEAN:
- luax_pushboolean(L, v.boolean);
- break;
-
- case thread::Thread::Variant::CSTRING:
- luax_pushstring(L, v.cstring);
- break;
-
- case thread::Thread::Variant::REAL:
- luax_pushnumber(L, v.real);
- break;
+ ThreadRef ref = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ const int vp = 3;
+ if (luax_isnumberstrict(L, vp))
+ {
+ float real = luax_checknumber(L, vp);
+ ref->send(slot, real);
+ }
+ else if (luax_isbooleanstrict(L, vp))
+ {
+ bool bol = luax_checkbool(L, vp);
+ ref->send(slot, bol);
+ }
+ else if (luax_isstringstrict(L, vp))
+ {
+ const char* str = luax_checkstring(L, vp);
+ ref->send(slot, str);
+ }
+ else if (luax_isuserdata(L, vp))
+ {
+ void* p = luax_touserdata(L, vp);
+ ref->send(slot, p);
+ }
+ else if (luax_islightuserdata(L, vp))
+ {
+ void* p = luax_tolightuserdata(L, vp);
+ ref->send(slot, p);
+ }
+ return 0;
+ }
- case thread::Thread::Variant::POINTER:
- Proxy* p = (Proxy*)v.pointer;
- Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy));
- p->reference->retain();
- proxy->bind(p->reference);
- break;
+ static int l_receive(lua_State* L)
+ {
+ ThreadRef ref = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ bool result = ref->receive(slot);
+ luax_pushboolean(L, result);
+ return 1;
+ }
+ static int l_fetch(lua_State* L)
+ {
+ ThreadRef ref = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ Thread::Variant v = ref->fetch(slot);
+ switch (v.type)
+ {
+ case thread::Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case thread::Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case thread::Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case thread::Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+
+ case thread::Thread::Variant::POINTER:
+ Proxy* p = (Proxy*)v.pointer;
+ Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy));
+ p->reference->retain();
+ proxy->bind(p->reference);
+ break;
+
+ }
+ return 1;
}
- return 1;
- }
- static int l_demand(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- Thread::Variant v = ref->demand(slot);
- switch (v.type)
+ static int l_demand(lua_State* L)
{
- case thread::Thread::Variant::INTERGER:
- luax_pushinteger(L, v.integer);
- break;
+ ThreadRef ref = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ Thread::Variant v = ref->demand(slot);
+ switch (v.type)
+ {
+ case thread::Thread::Variant::INTERGER:
+ luax_pushinteger(L, v.integer);
+ break;
+
+ case thread::Thread::Variant::BOOLEAN:
+ luax_pushboolean(L, v.boolean);
+ break;
+
+ case thread::Thread::Variant::CSTRING:
+ luax_pushstring(L, v.cstring);
+ break;
+
+ case thread::Thread::Variant::REAL:
+ luax_pushnumber(L, v.real);
+ break;
+
+ case thread::Thread::Variant::POINTER:
+ Proxy* p = (Proxy*)v.pointer;
+ const char* objType = p->getObjectType();
+ Proxy* proxy = (Proxy*)luax_newinstance(L, objType, sizeof(Proxy));
+ p->reference->retain();
+ proxy->bind(p->reference);
+ break;
+
+ }
+ return 1;
+ }
- case thread::Thread::Variant::BOOLEAN:
- luax_pushboolean(L, v.boolean);
- break;
+ static int l_remove(lua_State* L)
+ {
+ ThreadRef ref = checkThread(L);
+ int slot = luax_checkinteger(L, 2);
+ ref->remove(slot);
+ return 0;
+ }
- case thread::Thread::Variant::CSTRING:
- luax_pushstring(L, v.cstring);
- break;
+ static int l_getName(lua_State* L)
+ {
+ ThreadRef ref = checkThread(L);
+ const char* name = ref->getName();
+ luax_pushstring(L, name);
+ return 1;
+ }
- case thread::Thread::Variant::REAL:
- luax_pushnumber(L, v.real);
- break;
+ static int l_isRunning(lua_State* L)
+ {
+ ThreadRef ref = checkThread(L);
+ bool running = ref->isRunning();
+ luax_pushboolean(L, running);
+ return 1;
+ }
- case thread::Thread::Variant::POINTER:
- Proxy* p = (Proxy*)v.pointer;
- Proxy* proxy = (Proxy*)luax_newinstance(L, p->getObjectType(), sizeof(Proxy));
- p->reference->retain();
- proxy->bind(p->reference);
- break;
+ static const luaL_Reg thread_function[] = {
+ { "__gc", l_thread_gc },
+ { "start", l_start },
+ { "wait", l_wait },
+ { "send", l_send },
+ { "receive", l_receive },
+ { "fetch", l_fetch },
+ { "demand", l_demand },
+ { "remove", l_remove },
+ { "getName", l_getName },
+ { "isRunning", l_isRunning },
+ { 0, 0 }
+ };
+
+ static int luaopen_Thread(lua_State* L)
+ {
+ luax_newtype(L, JIN_THREAD_THREAD, thread_function);
+ return 0;
+ }
+
+ static int l_newThread(lua_State* L)
+ {
+ const char* name = luax_checkstring(L, 1);
+ const char* code = luax_checkstring(L, 2);
+ Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy));
+ Thread* thread = new Thread(name, code, threadRunner);
+ proxy->bind(new Ref<Thread>(thread, JIN_THREAD_THREAD));
+ return 1;
}
- return 1;
- }
-
- static int l_remove(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- int slot = luax_checkinteger(L, 2);
- ref->remove(slot);
- return 0;
- }
- static int l_getName(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- const char* name = ref->getName();
- luax_pushstring(L, name);
- return 1;
- }
+ static int l_getThread(lua_State* L)
+ {
+ luax_getglobal(L, MODULE_NAME);
+ luax_getfield(L, -1, "_curThread");
+ return 1;
+ }
- static int l_isRunning(lua_State* L)
- {
- Ref<Thread>& ref = checkThread(L);
- bool running = ref->isRunning();
- luax_pushboolean(L, running);
- return 1;
- }
-
- static const luaL_Reg thread_function[] = {
- { "__gc", l_thread_gc },
- { "start", l_start },
- { "wait", l_wait },
- { "send", l_send },
- { "receive", l_receive },
- { "fetch", l_fetch },
- { "demand", l_demand },
- { "remove", l_remove },
- { "getName", l_getName },
- { "isRunning", l_isRunning },
- { 0, 0 }
- };
-
- static int luaopen_Thread(lua_State* L)
- {
- luax_newtype(L, JIN_THREAD_THREAD, thread_function);
+ static const luaL_Reg f[] = {
+ { "newThread", l_newThread },
+ { "getThread", l_getThread },
+ { 0, 0 }
+ };
- return 0;
- }
-
- static int l_newThread(lua_State* L)
- {
- const char* name = luax_checkstring(L, 1);
- const char* code = luax_checkstring(L, 2);
- Proxy* proxy = (Proxy*)luax_newinstance(L, JIN_THREAD_THREAD, sizeof(Proxy));
- Thread* thread = new Thread(name, code, threadRunner);
- proxy->bind(new Ref<Thread>(thread, JIN_THREAD_THREAD));
- return 1;
- }
-
- static int l_getThread(lua_State* L)
- {
- luax_getglobal(L, MODULE_NAME);
- luax_getfield(L, -1, "_curThread");
- return 1;
- }
-
- static const luaL_Reg f[] = {
- { "newThread", l_newThread },
- { "getThread", l_getThread },
- { 0, 0 }
- };
-
- int luaopen_thread(lua_State* L)
- {
- luaopen_Thread(L);
+ int luaopen_thread(lua_State* L)
+ {
+ luaopen_Thread(L);
- luax_newlib(L, f);
+ luax_newlib(L, f);
- return 1;
- }
+ return 1;
+ }
-} // lua
-} // jin \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/thread/Thread.h b/src/lua/modules/thread/Thread.h
index 645d4a1..60d588a 100644
--- a/src/lua/modules/thread/Thread.h
+++ b/src/lua/modules/thread/Thread.h
@@ -1,94 +1,94 @@
#include "libjin/jin.h"
#include "lua/common/common.h"
-namespace jin
+namespace JinEngine
{
-namespace lua
-{
-namespace thread
-{
-
- class Thread
+ namespace Lua
{
- public:
- typedef jin::thread::Thread::Variant Variant;
- typedef jin::thread::Thread::ThreadRunner ThreadRunner;
-
- Thread(std::string _name, std::string _code, ThreadRunner runner)
- : name(_name)
- , code(_code)
- {
- thread = new jin::thread::Thread(_name, runner);
- }
-
- ~Thread()
- {
- delete thread;
- }
-
- bool start(void* p)
- {
- return thread->start(p);
- }
-
- void wait()
- {
- thread->wait();
- }
-
- void send(int slot, const Variant& value)
- {
- thread->send(slot, value);
- }
-
- bool receive(int slot)
- {
- return thread->receive(slot);
- }
-
- Variant fetch(int slot)
+ namespace thread
{
- return thread->fetch(slot);
- }
-
- Variant demand(int slot)
- {
- return thread->demand(slot);
- }
-
- void remove(int slot)
- {
- thread->remove(slot);
- }
-
- const char* getName()
- {
- return name.c_str();
- }
-
- bool isRunning()
- {
- return thread->isRunning();
- }
-
- void lock()
- {
- thread->lock();
- }
-
- void unlock()
- {
- thread->unlock();
- }
-
- const std::string name;
- const std::string code;
-
- private:
- jin::thread::Thread* thread;
-
- };
-} // thread
-} // lua
-} // jin \ No newline at end of file
+ class Thread
+ {
+ public:
+ typedef JinEngine::MultiThread::Thread::Variant Variant;
+ typedef JinEngine::MultiThread::Thread::ThreadRunner ThreadRunner;
+
+ Thread(std::string _name, std::string _code, ThreadRunner runner)
+ : name(_name)
+ , code(_code)
+ {
+ thread = new JinEngine::MultiThread::Thread(_name, runner);
+ }
+
+ ~Thread()
+ {
+ delete thread;
+ }
+
+ bool start(void* p)
+ {
+ return thread->start(p);
+ }
+
+ void wait()
+ {
+ thread->wait();
+ }
+
+ void send(int slot, const Variant& value)
+ {
+ thread->send(slot, value);
+ }
+
+ bool receive(int slot)
+ {
+ return thread->receive(slot);
+ }
+
+ Variant fetch(int slot)
+ {
+ return thread->fetch(slot);
+ }
+
+ Variant demand(int slot)
+ {
+ return thread->demand(slot);
+ }
+
+ void remove(int slot)
+ {
+ thread->remove(slot);
+ }
+
+ const char* getName()
+ {
+ return name.c_str();
+ }
+
+ bool isRunning()
+ {
+ return thread->isRunning();
+ }
+
+ void lock()
+ {
+ thread->lock();
+ }
+
+ void unlock()
+ {
+ thread->unlock();
+ }
+
+ const std::string name;
+ const std::string code;
+
+ private:
+ JinEngine::MultiThread::Thread* thread;
+
+ };
+
+ } // thread
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/time/time.cpp b/src/lua/modules/time/time.cpp
index 39743b4..f6e6f26 100644
--- a/src/lua/modules/time/time.cpp
+++ b/src/lua/modules/time/time.cpp
@@ -2,37 +2,37 @@
#include <SDL2/SDL.h>
#include "libjin/jin.h"
-namespace jin
-{
-namespace lua
+namespace JinEngine
{
+ namespace Lua
+ {
- using namespace jin::time;
+ using namespace JinEngine::Time;
- static int l_sec(lua_State* L)
- {
- luax_pushnumber(L, getSecond());
- return 1;
- }
+ static int l_sec(lua_State* L)
+ {
+ luax_pushnumber(L, getSecond());
+ return 1;
+ }
- static int l_sleep(lua_State* L)
- {
- double sec = luax_checknumber(L, 1);
- sleep(sec * 1000.0f);
- return 0;
- }
+ static int l_sleep(lua_State* L)
+ {
+ double sec = luax_checknumber(L, 1);
+ sleep(sec * 1000.0f);
+ return 0;
+ }
- static const luaL_Reg f[] = {
- { "second", l_sec },
- { "sleep", l_sleep },
- { 0, 0 },
- };
+ static const luaL_Reg f[] = {
+ { "second", l_sec },
+ { "sleep", l_sleep },
+ { 0, 0 },
+ };
- int luaopen_time(lua_State* L)
- {
- luax_newlib(L, f);
- return 1;
- }
+ int luaopen_time(lua_State* L)
+ {
+ luax_newlib(L, f);
+ return 1;
+ }
-} // lua
-} // jin \ No newline at end of file
+ } // namespace Lua
+} // namespace JinEngine \ No newline at end of file
diff --git a/src/lua/modules/types.h b/src/lua/modules/types.h
index 318f5fa..123604e 100644
--- a/src/lua/modules/types.h
+++ b/src/lua/modules/types.h
@@ -1,20 +1,25 @@
#ifndef __JIN_MODULES_TYPES_H
#define __JIN_MODULES_TYPES_H
-// graphics module
-#define JIN_GRAPHICS_IMAGE "jin.graphics.Image"
-#define JIN_GRAPHICS_SHADER "jin.graphics.Shader"
-#define JIN_GRAPHICS_CANVAS "jin.graphics.Canvas"
-#define JIN_GRAPHICS_FONT "jin.graphics.Font"
-
-// audio module
-#define JIN_AUDIO_SOURCE "jin.Audio.Source"
-
-// thread module
-#define JIN_THREAD_THREAD "jin.thread.Thread"
-
-// network module
-#define JIN_NETWORK_SOCKET "jin.net.Socket"
-#define JIN_NETWORK_BUFFER "jin.net.Buffer"
+// graphics module
+#define JIN_GRAPHICS_TEXTURE "Texture"
+#define JIN_GRAPHICS_SHADER "Shader"
+#define JIN_GRAPHICS_CANVAS "Canvas"
+#define JIN_GRAPHICS_TEXT "Text"
+#define JIN_GRAPHICS_TTFDATA "TTFData"
+#define JIN_GRAPHICS_TTF "TTF"
+#define JIN_GRAPHICS_TEXTUREFONT "TextureFont"
+#define JIN_GRAPHICS_PAGE "Page"
+#define JIN_GRAPHICS_BITMAP "Bitmap"
+
+// audio module
+#define JIN_AUDIO_SOURCE "Source"
+
+// thread module
+#define JIN_THREAD_THREAD "Thread"
+
+// network module
+#define JIN_NETWORK_SOCKET "Socket"
+#define JIN_NETWORK_BUFFER "Buffer"
#endif \ No newline at end of file
diff --git a/src/lua/resources/font.ttf.h b/src/lua/resources/font.ttf.h
index 519d723..bb0734f 100644
--- a/src/lua/resources/font.ttf.h
+++ b/src/lua/resources/font.ttf.h
@@ -1,3291 +1,365 @@
-/* font.ttf */
-static const unsigned char font_ttf[] =
-{0,1,0,0,0,15,0,128,0,3,0,112,71,68,69,70,6,99,6,86,0,1,47,228,0,0,0,48,71,80,
-79,83,21,171,160,97,0,1,48,20,0,0,25,64,71,83,85,66,114,98,110,249,0,1,73,84,
-0,0,1,0,79,83,47,50,184,195,53,95,0,0,1,120,0,0,0,96,86,68,77,88,110,234,118,
-79,0,0,16,160,0,0,5,224,99,109,97,112,181,231,186,55,0,0,22,128,0,0,14,170,
-103,108,121,102,106,45,90,154,0,0,37,44,0,0,193,8,104,101,97,100,247,103,158,
-41,0,0,0,252,0,0,0,54,104,104,101,97,16,38,141,60,0,0,1,52,0,0,0,36,104,109,
-116,120,249,22,238,10,0,0,1,216,0,0,14,200,107,101,114,110,54,23,29,253,0,0,
-237,156,0,0,32,214,108,111,99,97,165,22,115,246,0,0,230,52,0,0,7,102,109,97,
-120,112,3,209,0,248,0,0,1,88,0,0,0,32,110,97,109,101,115,18,167,225,0,1,14,
-116,0,0,3,36,112,111,115,116,65,210,41,113,0,1,17,152,0,0,30,73,0,1,0,0,0,1,0,
-0,56,128,33,235,95,15,60,245,0,9,8,0,0,0,0,0,196,240,17,46,0,0,0,0,202,162,65,
-188,255,85,253,206,9,99,8,115,0,0,0,9,0,2,0,0,0,0,0,0,0,1,0,0,7,108,254,12,0,
-0,9,129,255,85,129,252,9,99,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,178,0,1,0,0,3,
-178,0,151,0,22,0,95,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,3,3,147,1,144,0,
-5,0,4,5,154,5,51,0,0,1,31,5,154,5,51,0,0,3,209,0,102,2,0,0,0,0,0,0,0,0,0,0,0,
-0,0,224,0,2,239,72,0,32,91,20,160,0,32,0,0,0,0,112,121,114,115,0,64,0,32,255,
-253,6,0,254,0,0,102,7,154,2,0,32,0,1,159,79,1,0,0,4,58,5,176,0,0,0,32,0,2,1,
-253,0,0,0,0,0,0,1,253,0,0,1,253,0,0,4,169,0,127,5,218,0,104,4,252,0,64,1,189,
-0,126,2,167,0,132,2,175,0,6,3,116,0,88,4,138,0,78,1,199,0,117,3,155,0,167,2,
-36,0,161,3,82,0,16,4,129,0,113,4,129,0,195,4,129,0,133,4,129,0,115,4,129,0,72,
-4,129,0,152,4,129,0,137,4,129,0,97,4,129,0,102,4,129,0,93,2,5,0,161,2,13,0,
-162,4,16,0,71,4,129,0,152,4,48,0,136,3,206,0,58,7,41,0,96,5,15,0,43,5,15,0,
-163,5,17,0,118,5,106,0,169,4,99,0,163,4,99,0,163,5,107,0,121,5,159,0,169,2,65,
-0,190,4,99,0,74,5,15,0,163,4,99,0,168,6,229,0,163,5,159,0,169,5,116,0,113,5,
-15,0,163,5,147,0,113,5,17,0,165,4,228,0,121,4,201,0,37,5,106,0,147,5,15,0,22,
-6,227,0,37,5,15,0,66,5,15,0,40,4,201,0,97,2,40,0,143,3,78,0,39,2,40,0,11,3,88,
-0,61,3,163,0,4,2,129,0,82,4,102,0,106,4,140,0,143,4,48,0,97,4,140,0,98,4,48,0,
-97,2,112,0,28,4,140,0,108,4,140,0,143,2,4,0,159,2,18,255,190,4,26,0,144,2,4,0,
-159,6,254,0,143,4,140,0,143,4,140,0,97,4,140,0,143,4,140,0,98,2,205,0,143,4,
-47,0,103,2,141,0,26,4,140,0,139,4,6,0,46,6,14,0,45,4,6,0,46,4,6,0,26,4,6,0,94,
-2,184,0,63,1,251,0,145,2,184,0,21,5,111,0,128,1,252,0,144,4,98,0,97,4,170,0,
-70,5,176,0,104,4,219,0,30,1,243,0,145,4,235,0,90,4,21,0,160,6,68,0,88,3,149,0,
-120,3,198,0,77,4,113,0,127,6,68,0,88,3,182,0,103,2,251,0,128,4,73,0,99,3,100,
-0,113,3,108,0,106,2,142,0,131,4,140,0,153,3,238,0,63,2,28,0,161,1,253,0,119,2,
-45,0,95,3,165,0,120,3,198,0,166,5,175,0,184,6,172,0,184,6,245,0,122,3,246,0,
-117,7,207,0,14,4,72,0,88,5,106,0,108,4,185,0,163,4,170,0,137,6,253,0,88,4,178,
-0,72,4,146,0,71,4,142,0,97,4,162,0,153,5,162,0,30,2,3,0,153,4,120,0,153,4,53,
-0,40,2,46,0,37,5,136,0,160,4,140,0,143,7,168,0,104,7,113,0,97,2,165,0,19,2,4,
-0,159,2,191,255,233,5,243,0,108,4,207,0,97,6,97,0,147,5,186,0,139,2,11,255,
-188,3,211,0,110,3,154,0,85,3,108,0,129,2,44,0,160,2,184,0,165,2,50,0,18,3,211,
-0,135,2,250,0,100,2,161,0,182,2,14,0,36,2,14,0,210,3,191,0,135,0,0,255,187,2,
-14,0,148,4,21,0,161,2,29,0,161,4,99,0,163,5,167,0,30,5,116,0,113,5,65,0,49,4,
-149,0,123,5,159,0,168,4,149,0,70,5,159,0,84,5,136,0,87,5,86,0,112,4,134,0,98,
-4,189,0,157,4,7,0,46,4,140,0,97,4,79,0,98,4,47,0,115,4,140,0,143,4,141,0,119,
-2,160,0,197,4,140,0,56,4,19,0,45,4,165,0,79,4,140,0,143,4,78,0,98,4,140,0,97,
-4,48,0,81,4,140,0,141,5,170,0,83,5,160,0,91,6,205,0,108,5,234,0,57,5,106,0,
-135,8,153,0,69,8,153,0,168,5,254,0,73,5,160,0,169,5,12,0,163,6,39,0,54,6,151,
-0,26,5,105,0,120,5,159,0,173,5,159,0,69,5,17,0,66,5,253,0,161,5,117,0,147,8,
-31,0,164,8,100,0,164,5,171,0,1,6,213,0,163,5,10,0,163,5,105,0,181,7,33,0,190,
-4,187,0,44,4,109,0,97,4,140,0,144,2,231,0,143,5,17,0,69,5,193,0,26,4,79,0,100,
-4,140,0,143,4,96,0,153,4,109,0,65,5,248,0,153,4,140,0,143,4,140,0,143,4,24,0,
-71,7,34,0,98,4,194,0,143,4,107,0,115,6,109,0,143,6,196,0,143,4,119,255,244,6,
-81,0,153,4,89,0,153,4,78,0,99,6,135,0,153,4,139,0,117,4,140,255,242,4,79,0,97,
-6,246,0,65,6,245,0,143,4,140,255,242,4,140,0,143,6,206,0,108,6,88,0,127,5,117,
-0,113,4,141,0,97,4,141,0,212,4,185,0,251,4,175,1,231,4,174,1,231,4,170,0,105,
-4,170,0,105,5,136,0,179,6,124,0,187,2,12,0,145,2,4,0,160,2,28,0,168,1,188,0,
-85,3,97,0,145,3,97,0,160,3,88,0,176,4,105,0,70,4,146,0,87,2,183,0,137,5,100,0,
-161,7,164,0,64,2,103,0,88,2,103,0,144,3,165,0,59,3,173,0,71,4,170,0,70,4,64,0,
-79,5,4,0,103,6,191,0,107,7,86,0,110,7,134,0,111,6,223,0,107,4,162,0,72,5,156,
-0,168,4,178,0,70,4,146,0,168,4,215,0,63,8,47,0,104,2,14,255,188,4,48,0,152,4,
-56,0,158,4,64,0,154,0,0,0,169,0,0,0,93,4,9,0,125,4,10,255,85,4,15,0,110,4,10,
-0,110,3,164,0,129,3,164,0,129,3,165,0,129,1,145,0,96,2,4,0,161,2,4,255,190,3,
-12,255,160,3,38,0,113,4,69,0,83,4,170,0,105,4,170,0,73,4,170,0,132,4,170,0,
-142,3,251,0,37,4,170,0,130,4,170,0,92,4,170,0,123,4,186,0,39,3,165,0,109,4,
-121,0,153,4,146,0,112,4,170,0,153,4,71,0,153,4,31,0,153,4,211,0,112,4,251,0,
-153,2,3,0,153,4,15,0,64,4,97,0,153,3,189,0,153,5,248,0,153,5,28,0,153,4,203,0,
-112,4,121,0,153,4,227,0,112,4,173,0,153,4,113,0,93,4,48,0,71,5,4,0,137,4,187,
-0,39,6,2,0,63,4,137,0,55,4,97,0,30,4,64,0,78,4,121,0,120,2,94,0,78,3,229,0,89,
-4,22,0,90,4,104,0,71,4,31,0,90,4,48,0,120,3,189,0,71,4,48,0,88,4,40,0,71,3,
-165,0,120,2,45,0,95,3,91,0,113,3,108,0,106,3,148,0,87,3,124,0,114,3,124,0,120,
-3,17,0,95,3,132,0,112,3,108,0,104,2,8,0,120,5,15,0,22,4,7,0,46,5,56,0,118,4,
-75,0,98,5,15,0,163,4,96,0,153,4,214,0,163,4,8,0,143,8,38,0,168,6,252,0,143,5,
-145,0,89,4,66,0,94,7,185,0,169,5,176,0,143,7,55,0,63,5,147,0,73,6,203,0,77,4,
-191,255,223,5,118,0,138,3,160,0,116,6,211,0,74,5,199,0,49,7,45,0,191,5,250,0,
-151,4,211,0,43,4,73,0,13,8,3,0,169,6,162,0,143,6,118,0,65,7,194,0,69,4,247,0,
-118,4,30,0,98,5,174,0,36,5,33,0,70,6,164,0,91,6,229,0,98,6,87,0,54,5,44,0,49,
-4,75,0,80,4,9,0,123,5,7,0,91,5,105,0,156,4,100,0,163,3,99,0,143,4,8,0,41,5,15,
-0,163,4,104,0,153,5,118,0,147,4,108,0,115,4,140,0,143,5,159,0,169,4,37,0,74,3,
-218,0,73,7,13,0,209,6,13,0,186,5,13,0,163,4,139,0,143,4,140,0,95,2,7,0,160,6,
-72,0,78,4,65,255,234,5,116,0,113,4,140,0,97,6,210,0,108,6,91,0,127,6,223,0,
-149,5,236,0,149,9,22,0,190,7,227,0,153,4,20,0,0,8,41,0,0,4,20,0,0,8,41,0,0,2,
-185,0,0,2,10,0,0,1,92,0,0,4,127,0,0,2,48,0,0,1,162,0,0,0,209,0,0,8,52,0,91,8,
-53,0,92,3,167,0,5,5,116,0,113,4,140,0,97,0,0,0,0,0,0,0,0,4,241,0,113,5,2,0,
-112,8,28,0,59,7,216,0,77,3,96,0,122,5,24,0,152,3,78,0,105,5,233,0,124,8,204,0,
-169,3,210,0,106,6,146,0,164,4,140,0,98,3,202,0,161,3,108,0,129,1,253,127,255,
-5,106,0,34,5,106,0,34,4,140,0,18,4,201,0,37,3,155,0,167,5,15,0,43,5,15,0,43,5,
-15,0,43,5,15,0,43,5,15,0,43,5,15,0,43,5,15,0,43,5,17,0,118,4,99,0,163,4,99,0,
-163,4,99,0,163,4,99,0,163,2,65,255,221,2,65,0,190,2,65,255,179,2,65,255,192,5,
-159,0,169,5,116,0,113,5,116,0,113,5,116,0,113,5,116,0,113,5,116,0,113,5,106,0,
-147,5,106,0,147,5,106,0,147,5,106,0,147,5,15,0,40,4,102,0,106,4,102,0,106,4,
-102,0,106,4,102,0,106,4,102,0,106,4,102,0,106,4,102,0,106,4,48,0,97,4,48,0,97,
-4,48,0,97,4,48,0,97,4,48,0,97,2,3,255,184,2,3,0,153,2,3,255,142,2,3,255,155,4,
-140,0,143,4,140,0,97,4,140,0,97,4,140,0,97,4,140,0,97,4,140,0,97,4,140,0,139,
-4,140,0,139,4,140,0,139,4,140,0,139,4,6,0,26,4,6,0,26,5,15,0,43,4,102,0,106,5,
-15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,17,0,118,4,48,0,97,5,17,0,118,4,
-48,0,97,5,17,0,118,4,48,0,97,5,17,0,118,4,48,0,97,5,106,0,169,4,140,0,98,4,99,
-0,163,4,48,0,97,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0,
-97,4,99,0,163,4,48,0,97,5,107,0,121,4,140,0,108,5,107,0,121,4,140,0,108,5,107,
-0,121,4,140,0,108,5,107,0,121,4,140,0,108,5,159,0,169,4,140,255,127,2,65,255,
-199,2,3,255,162,2,65,255,171,2,3,255,134,2,65,255,247,2,3,255,210,2,65,0,57,2,
-4,0,27,2,65,0,180,6,164,0,190,4,22,0,159,4,99,0,74,2,11,255,160,5,15,0,163,4,
-26,0,144,4,99,0,168,2,4,0,159,4,99,0,168,2,4,0,121,4,99,0,168,2,4,0,159,4,99,
-0,156,2,4,0,150,5,159,0,169,4,140,0,143,5,159,0,169,4,140,0,143,5,159,0,169,4,
-140,0,143,4,140,0,143,5,116,0,113,4,140,0,97,5,116,0,113,4,140,0,97,5,116,0,
-113,4,140,0,97,5,17,0,165,2,205,0,143,5,17,0,165,2,205,0,119,5,17,0,165,2,205,
-0,45,4,228,0,121,4,47,0,103,4,228,0,121,4,47,0,103,4,228,0,121,4,47,0,103,4,
-228,0,121,4,47,0,103,4,201,0,37,2,141,0,26,4,201,0,37,2,141,0,26,5,106,0,147,
-4,140,0,139,5,106,0,147,4,140,0,139,5,106,0,147,4,140,0,139,5,106,0,147,4,140,
-0,139,5,106,0,147,4,140,0,139,5,106,0,147,4,140,0,139,6,227,0,37,6,14,0,45,5,
-15,0,40,4,6,0,26,5,15,0,40,4,201,0,97,4,6,0,94,4,201,0,97,4,6,0,94,4,201,0,97,
-4,6,0,94,7,207,0,14,6,253,0,88,5,106,0,108,4,142,0,97,4,228,0,121,4,47,0,103,
-5,15,0,43,4,99,0,163,5,159,0,169,2,65,0,185,5,116,0,113,5,15,0,40,5,86,0,112,
-2,160,255,204,5,15,0,43,5,15,0,163,4,99,0,163,4,201,0,97,5,159,0,169,2,65,0,
-190,5,15,0,163,6,229,0,163,5,159,0,169,5,116,0,113,5,15,0,163,4,201,0,37,5,15,
-0,40,5,15,0,66,2,65,255,192,5,15,0,40,4,134,0,98,4,79,0,98,4,140,0,143,2,160,
-0,197,4,140,0,141,4,120,0,153,4,140,0,97,4,140,0,153,4,6,0,46,2,160,255,205,4,
-140,0,141,4,140,0,97,4,140,0,141,6,205,0,108,4,99,0,163,4,99,0,163,4,228,0,
-121,2,65,0,190,2,65,255,192,4,99,0,74,2,142,0,131,5,17,0,66,5,15,0,163,5,15,0,
-43,5,15,0,163,4,99,0,163,4,99,0,163,5,159,0,173,6,229,0,163,5,159,0,169,5,116,
-0,113,5,159,0,168,5,15,0,163,5,17,0,118,4,201,0,37,5,159,0,84,5,15,0,66,4,102,
-0,106,4,48,0,97,4,140,0,143,4,140,0,97,4,140,0,143,4,48,0,97,4,6,0,26,4,6,0,
-46,4,48,0,97,2,231,0,143,4,47,0,103,2,4,0,159,2,3,255,155,2,18,255,190,4,96,0,
-153,4,6,0,26,6,227,0,37,6,14,0,45,6,227,0,37,6,14,0,45,6,227,0,37,6,14,0,45,5,
-15,0,40,4,6,0,26,1,189,0,126,2,221,0,126,4,54,0,171,4,116,0,28,4,116,0,28,2,
-11,255,158,2,4,0,160,6,229,0,163,6,254,0,143,5,15,0,43,4,102,0,106,5,116,0,
-113,6,228,0,28,6,228,0,28,4,99,0,163,5,159,0,173,4,48,0,97,4,140,0,143,5,136,
-0,87,5,160,0,91,5,15,0,22,4,7,0,46,8,116,0,97,9,129,0,113,5,105,0,120,4,79,0,
-100,5,17,0,118,4,48,0,97,5,15,0,40,4,7,0,46,2,65,0,190,6,151,0,26,5,193,0,26,
-2,65,0,190,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,7,207,0,14,6,253,0,88,
-4,99,0,163,4,48,0,97,5,145,0,89,4,66,0,94,6,151,0,26,5,193,0,26,5,105,0,120,4,
-79,0,100,5,159,0,173,4,140,0,143,5,159,0,173,4,140,0,143,5,116,0,113,4,140,0,
-97,5,117,0,113,4,141,0,97,5,117,0,113,4,141,0,97,5,105,0,181,4,78,0,99,5,17,0,
-66,4,6,0,26,5,17,0,66,4,6,0,26,5,17,0,66,4,6,0,26,5,117,0,147,4,107,0,115,6,
-213,0,163,6,81,0,153,5,15,0,66,4,6,0,46,4,140,0,98,5,159,0,69,4,109,0,65,5,15,
-0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,0,4,102,
-255,163,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,
-15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4,102,0,106,5,15,0,43,4,
-102,0,106,5,15,0,43,4,102,0,106,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,4,
-99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,4,99,255,220,4,48,255,165,4,99,0,163,
-4,48,0,97,4,99,0,163,4,48,0,97,4,99,0,163,4,48,0,97,2,65,0,190,2,3,0,153,2,65,
-0,180,2,4,0,149,5,116,0,113,4,140,0,97,5,116,0,113,4,140,0,97,5,116,0,113,4,
-140,0,97,5,116,0,51,4,140,255,190,5,116,0,113,4,140,0,97,5,116,0,113,4,140,0,
-97,5,116,0,113,4,140,0,97,5,243,0,108,4,207,0,97,5,243,0,108,4,207,0,97,5,243,
-0,108,4,207,0,97,5,243,0,108,4,140,0,97,5,243,0,108,4,207,0,97,5,106,0,147,4,
-140,0,139,5,106,0,147,4,140,0,139,6,97,0,147,5,186,0,139,6,97,0,147,5,186,0,
-139,6,97,0,147,5,186,0,139,6,97,0,147,5,186,0,139,6,97,0,147,5,186,0,139,5,15,
-0,40,4,6,0,26,5,15,0,40,4,6,0,26,5,15,0,40,4,6,0,26,4,140,0,98,5,15,0,163,4,
-24,0,71,5,159,0,169,4,140,0,143,4,201,0,37,4,24,0,71,5,15,0,66,4,6,0,46,5,117,
-0,147,4,107,0,115,5,117,0,147,4,107,0,115,4,99,0,163,2,231,0,143,6,151,0,26,5,
-193,0,26,6,203,0,77,4,191,255,223,4,140,0,143,4,89,255,156,5,10,255,175,4,89,
-255,156,5,10,255,175,4,99,255,205,2,231,255,213,5,15,255,179,4,26,255,157,5,
-159,0,173,4,140,0,143,5,159,0,169,4,140,0,143,6,229,0,163,5,248,0,153,4,109,0,
-65,5,159,0,69,5,15,0,40,4,7,0,46,5,15,0,66,4,6,0,46,4,99,255,206,2,231,255,
-214,6,206,0,108,6,88,0,127,4,79,0,98,4,99,255,237,6,124,0,187,4,252,0,70,2,27,
-0,171,2,221,0,126,0,0,0,1,0,1,1,1,1,1,0,12,0,248,8,255,0,8,0,8,255,254,0,9,0,
-9,255,253,0,10,0,10,255,253,0,11,0,11,255,253,0,12,0,12,255,253,0,13,0,13,255,
-252,0,14,0,14,255,252,0,15,0,15,255,252,0,16,0,16,255,252,0,17,0,17,255,251,0,
-18,0,18,255,251,0,19,0,19,255,251,0,20,0,20,255,251,0,21,0,20,255,250,0,22,0,
-21,255,250,0,23,0,22,255,250,0,24,0,23,255,250,0,25,0,24,255,249,0,26,0,25,
-255,249,0,27,0,26,255,249,0,28,0,27,255,249,0,29,0,28,255,248,0,30,0,29,255,
-248,0,31,0,30,255,248,0,32,0,31,255,248,0,33,0,32,255,247,0,34,0,33,255,247,0,
-35,0,34,255,247,0,36,0,35,255,247,0,37,0,36,255,246,0,38,0,37,255,246,0,39,0,
-38,255,246,0,40,0,39,255,246,0,41,0,39,255,245,0,42,0,40,255,245,0,43,0,41,
-255,245,0,44,0,42,255,245,0,45,0,43,255,244,0,46,0,44,255,244,0,47,0,45,255,
-244,0,48,0,46,255,244,0,49,0,47,255,243,0,50,0,48,255,243,0,51,0,49,255,243,0,
-52,0,50,255,243,0,53,0,51,255,242,0,54,0,52,255,242,0,55,0,53,255,242,0,56,0,
-54,255,242,0,57,0,55,255,241,0,58,0,56,255,241,0,59,0,57,255,241,0,60,0,58,
-255,241,0,61,0,58,255,240,0,62,0,59,255,240,0,63,0,60,255,240,0,64,0,61,255,
-240,0,65,0,62,255,239,0,66,0,63,255,239,0,67,0,64,255,239,0,68,0,65,255,239,0,
-69,0,66,255,238,0,70,0,67,255,238,0,71,0,68,255,238,0,72,0,69,255,238,0,73,0,
-70,255,237,0,74,0,71,255,237,0,75,0,72,255,237,0,76,0,73,255,237,0,77,0,74,
-255,236,0,78,0,75,255,236,0,79,0,76,255,236,0,80,0,77,255,236,0,81,0,77,255,
-235,0,82,0,78,255,235,0,83,0,79,255,235,0,84,0,80,255,235,0,85,0,81,255,234,0,
-86,0,82,255,234,0,87,0,83,255,234,0,88,0,84,255,234,0,89,0,85,255,233,0,90,0,
-86,255,233,0,91,0,87,255,233,0,92,0,88,255,233,0,93,0,89,255,232,0,94,0,90,
-255,232,0,95,0,91,255,232,0,96,0,92,255,232,0,97,0,93,255,231,0,98,0,94,255,
-231,0,99,0,95,255,231,0,100,0,96,255,231,0,101,0,96,255,230,0,102,0,97,255,
-230,0,103,0,98,255,230,0,104,0,99,255,230,0,105,0,100,255,229,0,106,0,101,255,
-229,0,107,0,102,255,229,0,108,0,103,255,229,0,109,0,104,255,228,0,110,0,105,
-255,228,0,111,0,106,255,228,0,112,0,107,255,228,0,113,0,108,255,227,0,114,0,
-109,255,227,0,115,0,110,255,227,0,116,0,111,255,227,0,117,0,112,255,226,0,118,
-0,113,255,226,0,119,0,114,255,226,0,120,0,115,255,226,0,121,0,115,255,225,0,
-122,0,116,255,225,0,123,0,117,255,225,0,124,0,118,255,225,0,125,0,119,255,224,
-0,126,0,120,255,224,0,127,0,121,255,224,0,128,0,122,255,224,0,129,0,123,255,
-223,0,130,0,124,255,223,0,131,0,125,255,223,0,132,0,126,255,223,0,133,0,127,
-255,222,0,134,0,128,255,222,0,135,0,129,255,222,0,136,0,130,255,222,0,137,0,
-131,255,221,0,138,0,132,255,221,0,139,0,133,255,221,0,140,0,134,255,221,0,141,
-0,134,255,220,0,142,0,135,255,220,0,143,0,136,255,220,0,144,0,137,255,220,0,
-145,0,138,255,219,0,146,0,139,255,219,0,147,0,140,255,219,0,148,0,141,255,219,
-0,149,0,142,255,218,0,150,0,143,255,218,0,151,0,144,255,218,0,152,0,145,255,
-218,0,153,0,146,255,217,0,154,0,147,255,217,0,155,0,148,255,217,0,156,0,149,
-255,217,0,157,0,150,255,216,0,158,0,151,255,216,0,159,0,152,255,216,0,160,0,
-153,255,216,0,161,0,153,255,215,0,162,0,154,255,215,0,163,0,155,255,215,0,164,
-0,156,255,215,0,165,0,157,255,214,0,166,0,158,255,214,0,167,0,159,255,214,0,
-168,0,160,255,214,0,169,0,161,255,213,0,170,0,162,255,213,0,171,0,163,255,213,
-0,172,0,164,255,213,0,173,0,165,255,212,0,174,0,166,255,212,0,175,0,167,255,
-212,0,176,0,168,255,212,0,177,0,169,255,211,0,178,0,170,255,211,0,179,0,171,
-255,211,0,180,0,172,255,211,0,181,0,172,255,210,0,182,0,173,255,210,0,183,0,
-174,255,210,0,184,0,175,255,210,0,185,0,176,255,209,0,186,0,177,255,209,0,187,
-0,178,255,209,0,188,0,179,255,209,0,189,0,180,255,208,0,190,0,181,255,208,0,
-191,0,182,255,208,0,192,0,183,255,208,0,193,0,184,255,207,0,194,0,185,255,207,
-0,195,0,186,255,207,0,196,0,187,255,207,0,197,0,188,255,206,0,198,0,189,255,
-206,0,199,0,190,255,206,0,200,0,191,255,206,0,201,0,191,255,205,0,202,0,192,
-255,205,0,203,0,193,255,205,0,204,0,194,255,205,0,205,0,195,255,204,0,206,0,
-196,255,204,0,207,0,197,255,204,0,208,0,198,255,204,0,209,0,199,255,203,0,210,
-0,200,255,203,0,211,0,201,255,203,0,212,0,202,255,203,0,213,0,203,255,202,0,
-214,0,204,255,202,0,215,0,205,255,202,0,216,0,206,255,202,0,217,0,207,255,201,
-0,218,0,208,255,201,0,219,0,209,255,201,0,220,0,210,255,201,0,221,0,210,255,
-200,0,222,0,211,255,200,0,223,0,212,255,200,0,224,0,213,255,200,0,225,0,214,
-255,199,0,226,0,215,255,199,0,227,0,216,255,199,0,228,0,217,255,199,0,229,0,
-218,255,198,0,230,0,219,255,198,0,231,0,220,255,198,0,232,0,221,255,198,0,233,
-0,222,255,197,0,234,0,223,255,197,0,235,0,224,255,197,0,236,0,225,255,197,0,
-237,0,226,255,196,0,238,0,227,255,196,0,239,0,228,255,196,0,240,0,229,255,196,
-0,241,0,229,255,195,0,242,0,230,255,195,0,243,0,231,255,195,0,244,0,232,255,
-195,0,245,0,233,255,194,0,246,0,234,255,194,0,247,0,235,255,194,0,248,0,236,
-255,194,0,249,0,237,255,193,0,250,0,238,255,193,0,251,0,239,255,193,0,252,0,
-240,255,193,0,253,0,241,255,192,0,254,0,242,255,192,0,255,0,243,255,192,0,0,0,
-3,0,0,0,3,0,0,8,104,0,1,0,0,0,0,0,28,0,3,0,1,0,0,2,38,0,6,2,10,0,0,0,0,1,0,0,
-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,3,176,3,177,3,175,0,4,0,5,
-0,6,0,7,0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,
-22,0,23,0,24,0,25,0,26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,
-0,38,0,39,0,40,0,41,0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,
-53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,
-0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,
-84,0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,0,93,0,94,0,0,1,222,1,223,1,225,1,
-227,1,234,1,239,1,243,1,246,1,245,1,247,1,249,1,248,1,250,1,252,1,254,1,253,1,
-255,2,0,2,2,2,1,2,3,2,4,2,5,2,7,2,6,2,8,2,10,2,9,2,12,2,11,2,13,2,14,1,14,0,
-109,0,96,0,97,0,101,1,16,0,115,0,129,0,107,0,103,1,25,0,113,0,102,1,37,0,125,
-0,127,1,35,0,110,1,38,1,39,0,99,0,114,1,30,1,32,1,31,0,189,1,36,0,104,0,119,0,
-177,0,130,0,133,0,124,0,95,0,106,1,34,0,146,0,0,0,169,0,105,0,120,1,17,0,3,1,
-218,1,221,1,238,0,142,0,143,1,5,1,6,1,11,1,12,1,7,1,8,0,132,1,155,2,16,2,123,
-1,21,1,24,1,19,1,20,2,224,2,225,1,15,0,116,1,9,1,13,1,18,1,220,1,228,1,219,1,
-229,1,226,1,231,1,232,1,233,1,230,1,236,1,237,0,0,1,235,1,241,1,242,1,240,0,
-136,0,152,0,158,0,108,0,154,0,155,0,156,0,117,0,159,0,157,0,153,0,4,6,66,0,0,
-0,210,0,128,0,6,0,82,0,35,0,126,0,160,0,172,0,173,0,191,0,198,0,207,0,230,0,
-239,0,254,1,15,1,17,1,37,1,39,1,48,1,56,1,64,1,83,1,101,1,103,1,126,1,127,1,
-146,1,161,1,176,1,240,1,251,1,255,2,25,2,55,2,188,2,199,2,221,2,243,3,1,3,3,3,
-15,3,138,3,140,3,146,3,161,3,176,3,185,3,201,3,206,3,210,3,214,4,37,4,47,4,69,
-4,79,4,130,4,134,4,206,4,215,4,225,4,245,5,19,30,1,30,63,30,133,30,241,30,243,
-30,249,31,77,32,10,32,11,32,21,32,23,32,30,32,34,32,38,32,48,32,51,32,58,32,
-60,32,68,32,116,32,127,32,164,32,167,32,172,33,5,33,19,33,22,33,34,33,38,33,
-46,33,94,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,96,34,101,37,202,251,2,
-251,4,254,255,255,253,255,255,0,0,0,32,0,36,0,160,0,161,0,173,0,174,0,192,0,
-199,0,208,0,231,0,240,0,255,1,16,1,18,1,38,1,40,1,49,1,57,1,65,1,84,1,102,1,
-104,1,127,1,146,1,160,1,175,1,240,1,250,1,252,2,24,2,55,2,188,2,198,2,216,2,
-243,3,0,3,3,3,15,3,132,3,140,3,142,3,147,3,163,3,177,3,186,3,202,3,209,3,214,
-4,0,4,38,4,48,4,70,4,80,4,131,4,136,4,207,4,216,4,226,4,246,30,0,30,62,30,128,
-30,160,30,242,30,244,31,77,32,0,32,11,32,19,32,23,32,24,32,32,32,37,32,48,32,
-50,32,57,32,60,32,68,32,116,32,127,32,163,32,167,32,171,33,5,33,19,33,22,33,
-34,33,38,33,46,33,91,34,2,34,6,34,15,34,17,34,26,34,30,34,43,34,96,34,100,37,
-202,251,1,251,3,254,255,255,252,255,255,0,0,255,224,0,0,255,190,0,0,255,189,0,
-0,1,26,0,0,1,21,0,0,1,17,0,0,1,15,0,0,1,13,0,0,1,11,0,0,1,5,0,0,1,3,0,0,255,0,
-254,243,254,230,0,242,0,0,0,134,0,110,254,96,0,39,253,210,253,194,253,173,253,
-161,253,160,253,149,0,0,255,0,254,255,0,0,0,0,253,1,0,0,254,223,0,0,253,212,0,
-0,252,173,0,0,252,165,0,0,252,124,0,0,254,47,0,0,254,43,0,0,228,230,228,166,
-228,85,228,136,227,233,228,134,227,155,225,180,225,185,0,0,0,0,224,239,224,
-238,0,0,224,226,226,171,224,218,226,163,224,209,224,162,225,75,0,0,225,41,0,0,
-224,200,224,188,224,184,223,247,223,139,224,157,223,191,223,28,222,163,223,16,
-223,15,223,8,223,5,222,249,222,197,222,194,219,209,7,223,7,230,2,198,1,195,0,
-1,0,210,0,0,0,214,0,0,0,212,0,0,0,210,0,0,0,220,0,0,1,6,0,0,1,32,0,0,1,32,0,0,
-1,32,0,0,1,44,0,0,1,78,0,0,1,78,0,0,0,0,0,0,0,0,1,70,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,1,52,0,0,0,0,1,60,1,88,0,0,1,112,0,0,1,140,0,0,1,140,0,0,1,
-212,0,0,1,252,0,0,2,94,0,0,2,232,0,0,2,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,3,32,3,36,0,0,0,0,3,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,20,0,0,3,20,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,3,3,176,3,177,3,175,1,212,1,217,1,218,1,219,1,220,1,221,1,222,1,223,0,125,1,
-214,1,234,1,235,1,236,1,237,1,238,1,239,0,126,0,127,1,240,1,241,1,242,1,243,1,
-244,0,128,0,129,1,245,1,246,1,247,1,248,1,249,1,250,0,130,0,131,2,5,2,6,2,7,2,
-8,2,9,2,10,0,132,0,133,2,11,2,12,2,13,2,14,2,15,0,134,1,213,1,209,0,135,1,215,
-0,136,2,62,2,63,2,64,2,65,2,66,2,67,0,137,0,138,0,139,2,76,2,77,2,78,2,79,2,
-80,2,81,2,82,0,140,0,141,2,83,2,84,2,85,2,86,2,87,2,88,0,142,0,143,1,216,0,
-144,0,145,1,224,1,251,0,165,0,166,2,136,0,167,2,137,2,138,2,139,0,168,0,169,2,
-146,2,147,2,148,0,170,2,149,2,150,0,171,2,151,2,152,0,172,2,153,0,173,2,154,0,
-174,2,155,2,156,0,175,2,157,0,176,0,177,2,158,2,159,2,160,2,161,2,162,2,163,2,
-164,2,165,0,187,2,167,2,168,0,188,2,166,0,189,0,190,0,191,0,192,0,193,0,194,0,
-195,1,168,0,196,0,197,1,198,1,171,2,235,2,174,0,198,2,175,0,199,2,176,2,177,2,
-178,2,179,0,200,0,201,0,202,2,180,2,236,2,181,0,203,2,183,0,204,2,184,2,185,0,
-205,2,186,0,206,0,207,0,208,2,187,2,182,0,209,2,188,2,189,2,190,2,191,2,192,2,
-193,2,194,0,210,2,195,2,196,2,197,0,221,0,222,0,223,0,224,2,198,0,225,0,226,0,
-227,2,199,0,228,0,229,0,230,0,231,2,200,0,232,2,201,2,202,0,233,2,203,0,234,2,
-204,2,237,2,205,0,245,2,206,0,246,2,207,2,208,2,209,2,210,0,247,0,248,0,249,2,
-211,2,238,2,212,0,250,0,251,0,252,3,151,3,150,1,133,1,134,1,135,1,136,1,164,1,
-165,1,176,1,177,1,178,1,179,1,162,1,163,2,239,2,240,0,253,0,254,1,111,1,112,2,
-241,2,242,2,244,2,243,1,172,1,173,3,170,3,171,1,174,1,175,1,113,1,114,1,199,1,
-200,1,201,3,156,3,157,3,149,3,148,1,166,1,167,1,153,1,154,3,152,3,153,1,117,1,
-118,3,143,3,144,2,245,2,246,3,129,3,130,1,156,1,157,3,154,3,155,1,131,1,132,3,
-131,3,132,1,123,1,124,1,119,1,120,1,194,1,195,2,247,2,248,3,133,3,134,2,249,2,
-250,3,164,3,165,3,135,3,136,1,125,1,126,3,137,3,138,1,158,1,159,1,129,3,147,1,
-127,1,128,3,145,3,146,2,251,2,252,2,253,1,115,1,116,3,162,3,163,1,161,1,160,3,
-158,3,159,3,139,3,140,3,160,3,161,1,121,1,122,3,7,3,8,3,9,3,10,3,11,3,12,1,3,
-1,4,3,141,3,142,3,33,3,34,3,168,3,169,3,35,3,36,3,166,3,167,1,151,3,37,1,145,
-1,146,1,147,1,148,1,149,1,150,1,140,1,139,1,137,1,138,1,141,1,142,1,143,1,144,
-1,152,3,172,3,38,3,39,1,5,1,6,3,174,1,193,1,210,1,17,3,173,1,23,3,128,1,24,0,
-4,6,66,0,0,0,210,0,128,0,6,0,82,0,35,0,126,0,160,0,172,0,173,0,191,0,198,0,
-207,0,230,0,239,0,254,1,15,1,17,1,37,1,39,1,48,1,56,1,64,1,83,1,101,1,103,1,
-126,1,127,1,146,1,161,1,176,1,240,1,251,1,255,2,25,2,55,2,188,2,199,2,221,2,
-243,3,1,3,3,3,15,3,138,3,140,3,146,3,161,3,176,3,185,3,201,3,206,3,210,3,214,
-4,37,4,47,4,69,4,79,4,130,4,134,4,206,4,215,4,225,4,245,5,19,30,1,30,63,30,
-133,30,241,30,243,30,249,31,77,32,10,32,11,32,21,32,23,32,30,32,34,32,38,32,
-48,32,51,32,58,32,60,32,68,32,116,32,127,32,164,32,167,32,172,33,5,33,19,33,
-22,33,34,33,38,33,46,33,94,34,2,34,6,34,15,34,18,34,26,34,30,34,43,34,96,34,
-101,37,202,251,2,251,4,254,255,255,253,255,255,0,0,0,32,0,36,0,160,0,161,0,
-173,0,174,0,192,0,199,0,208,0,231,0,240,0,255,1,16,1,18,1,38,1,40,1,49,1,57,1,
-65,1,84,1,102,1,104,1,127,1,146,1,160,1,175,1,240,1,250,1,252,2,24,2,55,2,188,
-2,198,2,216,2,243,3,0,3,3,3,15,3,132,3,140,3,142,3,147,3,163,3,177,3,186,3,
-202,3,209,3,214,4,0,4,38,4,48,4,70,4,80,4,131,4,136,4,207,4,216,4,226,4,246,
-30,0,30,62,30,128,30,160,30,242,30,244,31,77,32,0,32,11,32,19,32,23,32,24,32,
-32,32,37,32,48,32,50,32,57,32,60,32,68,32,116,32,127,32,163,32,167,32,171,33,
-5,33,19,33,22,33,34,33,38,33,46,33,91,34,2,34,6,34,15,34,17,34,26,34,30,34,43,
-34,96,34,100,37,202,251,1,251,3,254,255,255,252,255,255,0,0,255,224,0,0,255,
-190,0,0,255,189,0,0,1,26,0,0,1,21,0,0,1,17,0,0,1,15,0,0,1,13,0,0,1,11,0,0,1,5,
-0,0,1,3,0,0,255,0,254,243,254,230,0,242,0,0,0,134,0,110,254,96,0,39,253,210,
-253,194,253,173,253,161,253,160,253,149,0,0,255,0,254,255,0,0,0,0,253,1,0,0,
-254,223,0,0,253,212,0,0,252,173,0,0,252,165,0,0,252,124,0,0,254,47,0,0,254,43,
-0,0,228,230,228,166,228,85,228,136,227,233,228,134,227,155,225,180,225,185,0,
-0,0,0,224,239,224,238,0,0,224,226,226,171,224,218,226,163,224,209,224,162,225,
-75,0,0,225,41,0,0,224,200,224,188,224,184,223,247,223,139,224,157,223,191,223,
-28,222,163,223,16,223,15,223,8,223,5,222,249,222,197,222,194,219,209,7,223,7,
-230,2,198,1,195,0,1,0,210,0,0,0,214,0,0,0,212,0,0,0,210,0,0,0,220,0,0,1,6,0,0,
-1,32,0,0,1,32,0,0,1,32,0,0,1,44,0,0,1,78,0,0,1,78,0,0,0,0,0,0,0,0,1,70,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,52,0,0,0,0,1,60,1,88,0,0,1,112,0,0,1,140,
-0,0,1,140,0,0,1,212,0,0,1,252,0,0,2,94,0,0,2,232,0,0,2,248,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,3,32,3,36,0,0,0,0,3,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,20,0,0,
-3,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,3,3,176,3,177,3,175,1,212,1,217,1,218,1,219,1,220,1,221,1,
-222,1,223,0,125,1,214,1,234,1,235,1,236,1,237,1,238,1,239,0,126,0,127,1,240,1,
-241,1,242,1,243,1,244,0,128,0,129,1,245,1,246,1,247,1,248,1,249,1,250,0,130,0,
-131,2,5,2,6,2,7,2,8,2,9,2,10,0,132,0,133,2,11,2,12,2,13,2,14,2,15,0,134,1,213,
-1,209,0,135,1,215,0,136,2,62,2,63,2,64,2,65,2,66,2,67,0,137,0,138,0,139,2,76,
-2,77,2,78,2,79,2,80,2,81,2,82,0,140,0,141,2,83,2,84,2,85,2,86,2,87,2,88,0,142,
-0,143,1,216,0,144,0,145,1,224,1,251,0,165,0,166,2,136,0,167,2,137,2,138,2,139,
-0,168,0,169,2,146,2,147,2,148,0,170,2,149,2,150,0,171,2,151,2,152,0,172,2,153,
-0,173,2,154,0,174,2,155,2,156,0,175,2,157,0,176,0,177,2,158,2,159,2,160,2,161,
-2,162,2,163,2,164,2,165,0,187,2,167,2,168,0,188,2,166,0,189,0,190,0,191,0,192,
-0,193,0,194,0,195,1,168,0,196,0,197,1,198,1,171,2,235,2,174,0,198,2,175,0,199,
-2,176,2,177,2,178,2,179,0,200,0,201,0,202,2,180,2,236,2,181,0,203,2,183,0,204,
-2,184,2,185,0,205,2,186,0,206,0,207,0,208,2,187,2,182,0,209,2,188,2,189,2,190,
-2,191,2,192,2,193,2,194,0,210,2,195,2,196,2,197,0,221,0,222,0,223,0,224,2,198,
-0,225,0,226,0,227,2,199,0,228,0,229,0,230,0,231,2,200,0,232,2,201,2,202,0,233,
-2,203,0,234,2,204,2,237,2,205,0,245,2,206,0,246,2,207,2,208,2,209,2,210,0,247,
-0,248,0,249,2,211,2,238,2,212,0,250,0,251,0,252,3,151,3,150,1,133,1,134,1,135,
-1,136,1,164,1,165,1,176,1,177,1,178,1,179,1,162,1,163,2,239,2,240,0,253,0,254,
-1,111,1,112,2,241,2,242,2,244,2,243,1,172,1,173,3,170,3,171,1,174,1,175,1,113,
-1,114,1,199,1,200,1,201,3,156,3,157,3,149,3,148,1,166,1,167,1,153,1,154,3,152,
-3,153,1,117,1,118,3,143,3,144,2,245,2,246,3,129,3,130,1,156,1,157,3,154,3,155,
-1,131,1,132,3,131,3,132,1,123,1,124,1,119,1,120,1,194,1,195,2,247,2,248,3,133,
-3,134,2,249,2,250,3,164,3,165,3,135,3,136,1,125,1,126,3,137,3,138,1,158,1,159,
-1,129,3,147,1,127,1,128,3,145,3,146,2,251,2,252,2,253,1,115,1,116,3,162,3,163,
-1,161,1,160,3,158,3,159,3,139,3,140,3,160,3,161,1,121,1,122,3,7,3,8,3,9,3,10,
-3,11,3,12,1,3,1,4,3,141,3,142,3,33,3,34,3,168,3,169,3,35,3,36,3,166,3,167,1,
-151,3,37,1,145,1,146,1,147,1,148,1,149,1,150,1,140,1,139,1,137,1,138,1,141,1,
-142,1,143,1,144,1,152,3,172,3,38,3,39,1,5,1,6,3,174,1,193,1,210,1,17,3,173,1,
-23,3,128,1,24,0,0,0,1,0,127,255,48,4,38,6,157,0,44,0,0,1,52,38,39,46,1,53,52,
-54,55,53,51,21,30,1,21,35,52,38,35,34,6,21,20,22,23,30,1,21,20,6,7,21,35,53,
-46,1,63,1,51,20,22,51,50,54,3,97,127,147,202,206,190,166,158,167,185,196,126,
-111,118,118,122,158,204,198,206,180,157,172,220,4,2,190,156,112,129,145,1,120,
-90,127,50,61,204,170,165,208,21,221,222,22,230,193,127,158,123,107,97,120,54,
-66,197,169,172,203,19,192,191,18,215,208,5,154,131,123,0,0,0,0,5,0,104,255,
-235,5,131,5,197,0,13,0,27,0,41,0,55,0,59,0,0,19,52,54,51,50,22,29,1,20,6,35,
-34,38,53,51,20,22,51,50,54,61,1,52,38,35,34,6,21,1,52,54,51,50,22,29,1,20,6,
-35,34,38,53,51,20,22,51,50,54,61,1,52,38,35,34,6,21,5,39,1,23,104,164,137,137,
-164,163,136,138,165,146,81,76,73,80,81,74,75,80,2,47,164,137,136,165,164,135,
-138,165,146,81,76,73,80,82,73,74,81,254,15,109,2,199,109,4,152,127,174,173,
-128,77,127,172,172,127,74,103,102,75,77,74,105,105,74,252,205,127,173,173,127,
-78,128,172,172,128,75,103,103,75,78,74,104,104,74,247,67,4,114,67,0,0,0,3,0,
-64,255,235,4,208,5,197,0,33,0,44,0,57,0,0,19,52,54,55,46,1,53,52,54,51,50,22,
-21,20,6,15,1,1,62,1,53,51,20,6,7,23,7,35,39,14,1,35,34,36,5,50,54,55,1,7,14,1,
-21,20,22,3,20,22,23,55,62,1,53,52,38,35,34,6,64,141,140,78,76,195,171,158,198,
-105,103,109,1,84,41,46,176,78,74,185,2,229,85,80,194,104,217,254,255,1,218,72,
-140,62,254,151,40,91,59,142,15,54,54,138,57,41,97,78,81,88,1,136,122,183,92,
-99,155,82,169,183,182,128,98,143,75,80,254,103,65,158,88,132,224,89,223,5,102,
-60,63,230,76,49,46,1,179,29,68,124,50,113,146,3,226,53,115,68,95,38,89,54,61,
-94,113,0,0,1,0,126,3,183,1,68,5,176,0,5,0,0,1,3,35,19,53,51,1,68,101,97,1,197,
-4,209,254,230,1,9,240,0,0,0,0,1,0,132,254,49,2,157,6,100,0,17,0,0,19,16,0,55,
-31,1,6,2,17,21,16,18,23,7,35,38,0,17,132,1,62,175,6,38,137,203,202,138,38,6,
-175,254,194,2,79,1,138,2,46,93,1,116,107,254,40,254,165,13,254,165,254,40,116,
-108,93,2,45,1,139,0,0,0,0,1,0,6,254,49,2,31,6,100,0,17,0,0,1,16,0,7,35,39,54,
-18,17,53,16,2,39,55,51,22,0,17,2,31,254,193,174,6,38,135,205,211,129,38,6,174,
-1,63,2,70,254,117,253,211,93,108,105,1,225,1,93,13,1,86,1,227,110,108,93,253,
-210,254,118,0,0,0,0,1,0,88,1,134,3,27,4,57,0,14,0,0,1,39,55,23,39,51,3,55,23,
-7,23,7,39,7,39,1,68,236,49,236,10,161,10,233,48,242,153,132,140,135,133,2,184,
-67,154,90,254,254,252,89,156,68,200,96,218,210,92,0,0,0,0,1,0,78,0,146,4,52,4,
-182,0,11,0,0,1,33,21,33,17,35,17,33,53,33,17,51,2,165,1,143,254,113,197,254,
-110,1,146,197,3,15,178,254,53,1,203,178,1,167,0,1,0,117,254,254,1,59,0,221,0,
-5,0,0,5,7,35,19,53,51,1,59,101,97,1,197,8,250,1,3,220,0,0,1,0,167,2,26,2,245,
-2,180,0,3,0,0,1,33,53,33,2,245,253,178,2,78,2,26,154,0,0,1,0,161,0,0,1,102,0,
-202,0,3,0,0,33,35,53,51,1,102,197,197,202,0,0,1,0,16,255,131,3,23,5,176,0,3,0,
-0,23,35,1,51,184,168,2,96,167,125,6,45,0,0,0,2,0,113,255,235,4,16,5,197,0,13,
-0,27,0,0,1,20,2,35,34,2,53,17,52,18,51,50,18,21,39,52,38,35,34,6,21,17,20,22,
-51,50,54,53,4,16,251,212,211,253,251,211,212,253,197,140,128,127,138,141,126,
-128,138,2,2,247,254,224,1,32,247,1,172,245,1,34,254,222,245,41,157,182,182,
-157,254,3,157,184,183,158,0,0,0,1,0,195,0,0,2,198,5,197,0,5,0,0,33,35,17,5,53,
-37,2,198,198,254,195,2,3,4,250,3,152,54,0,1,0,133,0,0,4,30,5,197,0,26,0,0,41,
-1,53,1,62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,1,23,33,4,30,
-252,120,1,201,122,87,118,104,129,135,190,2,5,248,213,195,224,127,130,254,145,
-2,2,151,135,2,33,148,175,89,101,129,158,118,6,178,247,216,171,115,220,166,254,
-82,5,0,1,0,115,255,235,4,15,5,197,0,42,0,0,1,50,54,53,52,38,35,34,6,21,35,39,
-38,36,51,50,22,21,20,6,7,30,1,21,20,6,35,34,36,63,1,51,20,22,51,50,54,53,52,
-38,43,1,53,2,67,132,109,119,117,114,149,188,3,5,1,2,201,203,230,107,96,110,
-115,253,202,186,254,229,5,2,188,153,121,120,138,127,136,162,3,60,131,118,110,
-135,141,106,6,164,232,205,199,102,168,47,44,179,127,200,227,219,180,6,106,145,
-149,120,137,136,153,0,0,2,0,72,0,0,4,70,5,176,0,10,0,15,0,0,1,51,21,35,17,35,
-17,33,53,1,51,1,33,17,39,7,3,125,201,201,196,253,143,2,101,208,253,158,1,158,
-6,19,1,234,154,254,176,1,80,111,3,241,252,58,2,171,1,50,0,1,0,152,255,235,4,
-19,5,176,0,31,0,0,27,1,33,21,33,3,62,1,55,54,18,21,20,2,35,34,38,63,1,51,20,
-22,51,50,54,53,52,38,35,34,6,7,175,84,2,217,253,205,47,47,114,73,202,229,235,
-225,185,246,5,2,178,137,109,125,138,139,124,116,104,25,2,135,3,41,175,254,93,
-35,45,1,2,254,255,224,219,254,246,202,196,6,119,131,176,153,139,172,70,73,0,0,
-0,2,0,137,255,235,4,40,5,197,0,26,0,39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62,
-1,51,50,22,21,20,2,35,34,0,25,1,16,0,19,34,6,7,21,20,22,51,50,54,53,52,38,2,
-129,86,168,55,42,57,126,84,137,171,61,167,96,188,219,245,208,202,254,240,1,35,
-166,93,133,35,161,117,123,133,143,5,197,34,26,151,25,31,234,179,113,61,70,252,
-205,224,254,245,1,51,1,10,1,79,1,0,1,78,253,71,79,67,101,185,215,187,150,142,
-168,0,0,0,1,0,97,0,0,4,39,5,176,0,12,0,0,1,0,2,17,21,35,53,16,18,19,33,53,33,
-4,39,254,236,194,197,243,230,252,252,3,198,5,21,254,184,254,10,254,200,159,
-159,1,74,2,17,1,27,155,0,3,0,102,255,235,4,26,5,197,0,23,0,35,0,47,0,0,1,20,6,
-7,30,1,21,20,4,35,34,36,53,52,54,55,46,1,53,52,54,51,50,22,3,52,38,35,34,6,21,
-20,22,51,50,54,3,52,38,35,34,6,21,20,22,51,50,54,3,242,128,106,124,150,254,
-251,202,214,254,241,153,130,112,130,245,197,186,239,156,155,114,124,162,161,
-127,114,153,41,131,97,107,138,140,107,97,129,4,60,114,173,43,43,188,123,201,
-220,220,201,123,188,44,42,173,114,191,202,203,252,154,119,154,154,119,123,148,
-149,3,31,105,136,131,110,111,138,138,0,0,2,0,93,255,235,3,248,5,197,0,26,0,39,
-0,0,37,50,54,61,1,14,1,35,34,2,53,52,18,51,50,0,21,17,20,0,35,34,38,39,55,30,
-1,19,50,54,55,53,52,38,35,34,6,21,20,22,1,245,142,175,48,143,85,210,239,254,
-187,218,1,8,254,224,227,77,161,70,30,66,127,126,103,141,32,146,132,107,143,
-132,133,196,180,124,71,73,1,3,230,220,1,23,254,238,250,254,70,251,254,231,32,
-31,150,32,27,1,254,94,73,172,163,177,191,153,150,185,255,255,0,161,0,0,1,102,
-4,54,0,38,0,14,0,0,0,7,0,14,0,0,3,108,255,255,0,162,254,254,1,110,4,54,0,39,0,
-14,0,1,3,108,0,6,0,12,51,0,0,1,0,71,0,107,3,119,3,245,0,9,0,0,1,7,21,23,5,21,
-1,53,1,21,1,72,85,85,2,47,252,208,3,48,2,67,18,6,19,228,201,1,123,149,1,122,
-201,0,0,2,0,152,1,151,3,218,3,219,0,3,0,7,0,0,1,33,53,33,17,33,53,33,3,218,
-252,190,3,66,252,190,3,66,3,55,164,253,188,164,0,1,0,136,0,87,3,224,3,225,0,9,
-0,0,19,53,1,21,1,53,37,55,53,39,136,3,88,252,168,2,86,85,85,3,30,195,254,134,
-149,254,133,196,238,17,6,20,0,0,0,2,0,58,0,0,3,118,5,197,0,26,0,30,0,0,1,62,1,
-55,62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,14,1,21,19,35,53,
-51,1,99,1,48,102,99,84,113,105,91,128,188,3,3,233,180,197,218,141,116,54,23,7,
-206,206,1,154,145,112,92,117,126,89,106,114,99,96,6,161,194,201,180,129,214,
-112,54,86,91,254,102,208,0,0,0,2,0,96,254,59,6,213,5,151,0,51,0,67,0,0,1,6,2,
-35,34,38,39,14,1,35,34,38,55,26,1,51,50,22,23,7,51,3,6,22,51,50,54,55,18,0,33,
-32,0,3,2,0,33,50,54,55,23,14,1,35,32,0,19,18,0,33,32,0,1,6,22,51,50,54,55,38,
-54,55,19,46,1,35,34,6,6,196,9,222,221,73,106,23,50,144,96,125,138,18,23,229,
-165,105,128,75,4,6,51,9,61,51,123,148,8,16,254,192,254,176,254,204,254,137,15,
-18,1,80,1,58,88,181,62,38,67,207,99,254,132,254,97,18,19,1,204,1,116,1,123,1,
-149,251,251,11,65,74,64,106,44,1,1,2,47,26,57,31,125,132,1,246,214,254,203,83,
-76,80,79,241,196,1,3,1,57,52,54,4,253,183,110,83,227,175,1,126,1,171,254,50,
-254,141,254,136,254,75,43,35,107,42,47,1,243,1,176,1,167,2,18,254,12,253,253,
-142,148,49,63,12,27,16,2,26,12,14,219,0,0,2,0,43,0,0,4,227,5,176,0,7,0,11,0,0,
-1,33,3,35,1,51,1,35,1,33,3,35,3,154,253,220,130,201,2,13,169,2,2,201,253,149,
-1,179,212,6,1,119,254,137,5,176,250,80,2,28,2,113,0,0,0,3,0,163,0,0,4,198,5,
-176,0,14,0,24,0,33,0,0,51,17,33,50,4,21,20,6,7,30,1,21,20,4,35,1,17,33,50,54,
-53,52,38,39,35,37,33,50,54,53,52,38,35,33,163,1,219,228,1,2,116,96,143,167,
-254,252,222,254,132,1,124,135,149,152,129,13,254,142,1,63,110,138,149,140,254,
-234,5,176,197,197,94,149,39,20,208,141,200,211,2,171,253,239,133,122,121,148,
-5,154,121,108,118,117,0,0,0,1,0,118,255,235,4,191,5,197,0,29,0,0,1,23,22,0,35,
-34,0,25,1,16,0,51,50,0,15,1,35,52,38,35,34,2,21,17,20,18,51,50,54,53,4,185,2,
-4,254,216,243,247,254,201,1,55,247,247,1,36,4,2,189,180,164,165,196,196,165,
-164,180,1,210,6,205,254,236,1,94,1,13,1,3,1,13,1,95,254,249,217,6,153,178,254,
-246,197,254,251,199,254,246,177,156,0,0,2,0,169,0,0,4,235,5,176,0,9,0,19,0,0,
-51,17,33,32,0,17,21,16,0,33,1,17,33,50,18,61,1,52,2,35,169,1,202,1,29,1,91,
-254,165,254,227,254,251,1,5,202,233,233,202,5,176,254,161,254,234,199,254,233,
-254,163,5,21,251,133,1,10,208,201,206,1,10,0,0,0,0,1,0,163,0,0,4,36,5,176,0,
-11,0,0,1,33,17,33,21,33,17,33,21,33,17,33,3,190,253,170,2,188,252,127,3,118,
-253,79,2,86,2,163,253,247,154,5,176,155,254,41,0,0,0,1,0,163,0,0,4,52,5,176,0,
-9,0,0,1,33,17,35,17,33,21,33,17,33,3,206,253,154,197,3,145,253,52,2,102,2,132,
-253,124,5,176,155,254,10,0,1,0,121,255,235,4,193,5,197,0,32,0,0,37,6,4,35,34,
-0,25,1,16,0,51,50,0,15,1,35,52,38,35,34,6,21,17,20,22,51,50,54,55,17,33,53,33,
-4,193,52,254,255,205,252,254,182,1,62,251,243,1,26,4,2,189,172,158,167,204,
-216,168,129,151,37,254,182,2,15,196,81,136,1,78,1,9,1,44,1,9,1,78,254,253,200,
-6,133,177,250,192,254,210,194,251,67,46,1,72,154,0,1,0,169,0,0,4,246,5,176,0,
-11,0,0,33,35,17,33,17,35,17,51,17,33,17,51,4,246,197,253,61,197,197,2,195,197,
-2,131,253,125,5,176,253,110,2,146,0,0,0,1,0,190,0,0,1,132,5,176,0,3,0,0,33,35,
-17,51,1,132,198,198,5,176,0,1,0,74,255,235,3,188,5,176,0,16,0,0,1,51,17,20,6,
-35,34,38,63,1,51,20,22,51,50,54,53,2,247,197,247,197,201,237,5,2,189,126,116,
-109,138,5,176,251,246,203,240,213,203,6,136,132,158,131,0,0,0,1,0,163,0,0,4,
-251,5,176,0,14,0,0,1,35,17,35,17,51,17,51,1,51,23,9,1,7,35,1,251,147,197,197,
-128,2,8,222,2,253,196,2,103,3,239,2,146,253,110,5,176,253,124,2,132,5,253,80,
-253,10,5,0,0,0,0,1,0,168,0,0,4,51,5,176,0,5,0,0,37,33,21,33,17,51,1,109,2,198,
-252,117,197,154,154,5,176,0,0,1,0,163,0,0,6,65,5,176,0,15,0,0,1,51,1,51,17,35,
-17,39,1,35,1,7,17,35,17,33,3,117,6,1,209,245,197,6,254,71,137,254,58,6,197,1,
-3,1,17,4,159,250,80,4,67,1,251,188,4,104,1,251,153,5,176,0,0,0,0,1,0,169,0,0,
-4,246,5,176,0,11,0,0,33,35,1,7,17,35,17,51,1,55,17,51,4,246,197,253,67,6,197,
-197,2,189,6,197,4,88,2,251,170,5,176,251,169,2,4,85,0,0,0,2,0,113,255,235,5,2,
-5,197,0,13,0,27,0,0,1,16,0,33,34,0,25,1,16,0,51,32,0,17,39,52,2,35,34,2,21,17,
-20,18,51,50,54,53,5,2,254,181,254,248,255,254,193,1,63,255,1,8,1,75,197,216,
-182,172,205,205,172,183,215,2,86,254,245,254,160,1,96,1,11,1,3,1,10,1,98,254,
-159,254,245,2,200,1,0,255,0,200,254,251,202,255,0,255,203,0,0,2,0,163,0,0,4,
-188,5,176,0,10,0,19,0,0,1,17,35,17,33,50,4,21,20,4,35,37,33,50,54,53,52,38,35,
-33,1,104,197,2,45,233,1,3,254,253,233,254,152,1,104,148,146,147,147,254,152,2,
-72,253,184,5,176,240,196,198,238,154,159,121,121,162,0,2,0,113,255,113,5,90,5,
-197,0,19,0,33,0,0,1,20,6,7,23,7,39,14,1,35,34,0,25,1,16,0,51,32,0,17,39,52,2,
-35,34,2,21,17,20,18,51,50,54,53,5,2,67,62,217,135,222,70,164,92,255,254,193,1,
-63,255,1,8,1,75,197,216,182,172,205,205,172,183,215,2,86,115,205,81,211,129,
-213,45,46,1,96,1,11,1,3,1,10,1,98,254,159,254,245,2,200,1,0,255,0,200,254,251,
-202,255,0,255,203,0,0,0,0,2,0,165,0,0,4,213,5,175,0,26,0,35,0,0,1,17,35,17,33,
-50,22,21,20,6,7,30,1,29,1,20,22,23,21,35,46,1,61,1,52,38,35,37,33,50,54,53,52,
-38,35,33,1,106,197,2,5,239,253,117,112,120,105,30,37,203,39,22,138,116,254,
-155,1,45,167,147,143,152,254,192,2,119,253,137,5,175,212,202,112,166,49,39,
-175,129,137,68,108,34,24,34,132,70,133,118,144,155,127,130,123,135,0,0,0,1,0,
-121,255,235,4,131,5,197,0,39,0,0,1,52,38,39,46,1,53,52,36,51,50,0,15,1,35,52,
-38,35,34,6,21,20,22,23,30,1,21,20,4,35,34,36,63,1,51,20,22,51,50,54,3,190,144,
-185,220,243,1,4,212,230,1,17,4,3,188,173,135,137,138,155,179,225,233,254,233,
-221,211,254,189,5,2,188,208,131,138,165,1,130,95,118,48,54,214,163,172,227,
-254,251,174,6,124,162,133,108,96,127,47,59,204,160,178,231,236,198,6,137,149,
-143,0,0,0,1,0,37,0,0,4,164,5,176,0,7,0,0,1,33,17,35,17,33,53,33,4,164,254,32,
-197,254,38,4,127,5,21,250,235,5,21,155,0,0,0,1,0,147,255,235,4,220,5,176,0,17,
-0,0,1,17,20,0,35,34,0,53,17,51,17,20,22,51,50,54,53,17,4,220,254,200,246,237,
-254,210,197,191,151,160,201,5,176,252,57,240,254,242,1,15,239,3,199,252,57,
-167,189,189,167,3,199,0,0,0,0,1,0,22,0,0,4,249,5,176,0,9,0,0,1,23,51,55,1,51,
-1,35,1,51,2,100,33,6,33,1,120,213,253,227,169,253,227,214,1,126,121,121,4,50,
-250,80,5,176,0,1,0,37,0,0,6,191,5,176,0,21,0,0,1,31,1,55,1,51,1,23,51,55,19,
-51,1,35,1,39,35,7,1,35,1,51,1,206,25,6,34,1,2,193,1,4,34,6,27,208,214,254,160,
-176,254,221,22,6,21,254,217,176,254,161,213,1,249,191,1,192,3,183,252,73,195,
-195,3,183,250,80,3,242,131,131,252,14,5,176,0,1,0,66,0,0,4,214,5,176,0,11,0,0,
-9,1,51,9,1,35,9,1,35,9,1,51,2,138,1,84,238,254,50,1,216,235,254,163,254,162,
-238,1,216,254,50,236,3,120,2,56,253,46,253,34,2,66,253,190,2,222,2,210,0,0,0,
-1,0,40,0,0,4,226,5,176,0,8,0,0,9,1,51,1,17,35,17,1,51,2,133,1,124,225,254,1,
-196,254,9,225,2,204,2,228,252,80,254,0,2,15,3,161,0,0,0,1,0,97,0,0,4,109,5,
-176,0,9,0,0,37,33,21,33,53,1,33,53,33,21,1,63,3,46,251,244,3,10,253,1,3,224,
-154,154,146,4,131,155,141,0,0,1,0,143,254,200,2,16,6,128,0,7,0,0,1,35,17,51,
-21,33,17,33,2,16,188,188,254,127,1,129,5,229,249,126,155,7,184,0,0,0,0,1,0,39,
-255,131,3,65,5,176,0,3,0,0,19,51,1,35,39,186,2,96,186,5,176,249,211,0,0,1,0,
-11,254,200,1,141,6,128,0,7,0,0,19,33,17,33,53,51,17,35,11,1,130,254,126,189,
-189,6,128,248,72,155,6,130,0,1,0,61,2,217,3,24,5,176,0,9,0,0,19,35,1,51,1,35,
-3,39,35,7,244,183,1,43,134,1,42,181,166,16,6,16,2,217,2,215,253,41,1,163,70,
-70,0,0,0,1,0,4,255,102,3,159,0,0,0,3,0,0,5,33,53,33,3,159,252,101,3,155,154,
-154,0,0,0,1,0,82,4,228,1,234,5,238,0,4,0,0,1,35,3,55,51,1,234,158,250,3,230,4,
-228,1,4,6,0,0,0,2,0,106,255,235,3,243,4,78,0,32,0,43,0,0,33,46,1,39,14,1,35,
-34,38,53,52,54,59,1,53,52,38,35,34,6,21,7,39,38,54,51,50,22,21,17,20,22,23,37,
-50,54,55,53,35,34,6,21,20,22,3,40,10,11,1,55,177,102,169,177,251,215,214,116,
-106,96,118,187,2,7,235,186,184,224,12,16,253,238,107,172,26,221,119,143,90,49,
-75,38,78,105,173,152,155,175,107,95,111,96,67,2,6,118,196,187,176,253,247,58,
-108,52,144,110,71,176,120,81,72,84,0,2,0,143,255,235,4,43,6,24,0,17,0,31,0,0,
-1,20,2,35,34,38,39,7,35,17,51,17,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1,
-51,50,54,53,4,43,225,197,108,159,52,32,151,197,51,151,101,200,224,197,137,140,
-91,125,37,38,123,94,139,136,1,244,234,254,225,85,83,147,6,24,253,162,72,76,
-254,192,254,251,186,235,89,75,254,43,80,90,198,163,0,0,0,1,0,97,255,235,3,217,
-4,78,0,29,0,0,37,50,54,53,51,23,22,6,35,34,2,61,1,52,18,51,50,22,15,1,35,52,
-38,35,34,6,29,1,20,22,2,61,91,136,178,3,4,248,164,228,248,249,227,181,231,4,2,
-179,129,98,145,133,131,133,121,88,6,140,217,1,54,231,42,229,1,55,224,163,6,99,
-139,225,160,42,163,224,0,0,0,2,0,98,255,235,3,245,6,24,0,17,0,31,0,0,19,16,18,
-51,50,22,23,17,51,17,35,39,14,1,35,34,2,53,51,20,22,51,50,54,55,17,46,1,35,34,
-6,21,98,223,201,95,147,52,197,151,30,53,156,103,198,224,197,134,141,88,120,38,
-38,121,85,142,135,2,9,1,5,1,64,70,67,2,83,249,232,137,78,80,1,31,234,164,197,
-80,72,1,249,67,79,234,187,0,0,0,0,2,0,97,255,235,3,226,4,78,0,22,0,31,0,0,5,
-34,0,61,1,52,0,51,50,18,29,1,33,7,6,22,51,50,54,55,23,14,1,3,34,6,7,23,33,53,
-52,38,2,100,242,254,239,1,13,194,217,217,253,76,2,1,155,158,98,116,79,49,54,
-155,185,103,135,15,2,1,232,116,21,1,43,242,44,233,1,49,254,242,224,104,5,162,
-204,41,42,139,39,59,3,200,159,124,5,16,118,154,0,0,0,1,0,28,0,0,2,173,6,45,0,
-23,0,0,51,17,35,53,51,53,52,54,51,50,22,23,7,46,1,35,34,6,29,1,51,21,35,17,
-198,170,170,180,162,34,69,42,24,18,51,27,87,83,196,196,3,168,146,137,173,189,
-11,10,150,4,6,103,98,137,146,252,88,0,0,2,0,108,254,75,4,0,4,78,0,29,0,43,0,0,
-19,16,18,51,50,22,23,55,51,17,20,6,35,34,38,39,55,30,1,51,50,54,61,1,14,1,35,
-34,2,53,51,20,22,51,50,54,55,17,46,1,35,34,6,21,108,223,200,103,156,53,24,157,
-242,228,78,181,69,30,57,161,78,144,131,53,148,97,198,223,197,134,140,89,120,
-39,38,122,86,141,135,2,9,1,5,1,64,83,78,141,251,192,208,223,43,37,153,30,37,
-131,134,123,68,70,1,31,234,163,198,81,74,1,242,69,81,234,187,0,0,1,0,143,0,0,
-4,0,6,24,0,19,0,0,1,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,51,1,
-84,56,163,99,173,193,197,115,114,88,130,40,197,197,3,169,78,87,208,216,253,90,
-2,168,134,128,69,62,252,213,6,24,0,0,2,0,159,0,0,1,100,6,24,0,3,0,7,0,0,33,35,
-17,51,17,35,53,51,1,100,197,197,197,197,4,58,1,21,201,0,0,2,255,190,254,75,1,
-114,6,24,0,15,0,19,0,0,1,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,19,35,53,
-51,1,114,172,153,31,51,29,14,14,52,17,65,77,191,197,197,4,58,251,109,167,181,
-9,9,155,5,7,88,99,4,147,1,25,197,0,0,0,1,0,144,0,0,4,11,6,24,0,12,0,0,1,35,17,
-35,17,51,17,51,1,51,9,1,35,1,206,121,197,197,119,1,49,236,254,137,1,153,233,1,
-243,254,13,6,24,252,120,1,170,254,14,253,184,0,0,1,0,159,0,0,1,100,6,24,0,3,0,
-0,33,35,17,51,1,100,197,197,6,24,0,1,0,143,0,0,6,111,4,78,0,35,0,0,1,23,62,1,
-51,50,22,23,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,21,17,35,17,52,38,35,34,
-6,7,17,35,17,1,63,14,53,163,108,108,155,39,52,167,112,165,192,197,110,109,101,
-125,11,198,113,106,90,116,31,197,4,58,142,77,85,100,100,93,107,227,228,253,
-121,2,137,160,133,140,107,8,253,81,2,137,152,141,74,67,252,223,4,58,0,0,0,0,1,
-0,143,0,0,3,253,4,78,0,19,0,0,1,23,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,
-17,35,17,1,63,14,54,163,104,175,192,197,113,116,91,127,37,197,4,58,161,86,95,
-205,214,253,85,2,167,143,120,73,66,252,221,4,58,0,2,0,97,255,235,4,42,4,78,0,
-13,0,27,0,0,19,52,0,51,50,0,29,1,20,0,35,34,0,53,51,20,22,51,50,54,61,1,52,38,
-35,34,6,21,97,1,4,223,225,1,5,254,252,224,224,254,251,197,145,143,141,146,147,
-142,141,145,2,39,240,1,55,254,202,241,22,242,254,204,1,53,241,172,224,224,172,
-22,170,226,226,170,0,0,0,2,0,143,254,96,4,41,4,78,0,17,0,31,0,0,1,20,2,35,34,
-38,39,17,35,17,51,23,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1,51,50,54,53,
-4,41,224,197,100,151,53,197,151,31,53,158,105,201,223,197,145,141,85,120,37,
-37,120,87,140,144,1,244,234,254,225,67,67,253,239,5,218,140,78,82,254,193,254,
-250,184,237,77,67,253,245,67,75,205,162,0,0,0,2,0,98,254,96,3,234,4,78,0,17,0,
-31,0,0,19,16,18,51,50,22,23,55,51,17,35,17,14,1,35,34,2,53,51,20,22,51,50,54,
-55,17,46,1,35,34,6,21,98,223,201,98,150,53,28,151,197,52,142,91,198,224,197,
-135,140,81,115,39,39,115,79,141,136,2,9,1,5,1,64,75,71,126,250,38,2,6,61,62,1,
-31,234,164,203,72,65,2,34,61,70,239,187,0,0,0,0,1,0,143,0,0,2,170,4,78,0,15,0,
-0,1,39,34,6,7,17,35,17,51,23,62,1,51,50,22,23,2,143,101,78,107,29,197,176,14,
-45,138,91,22,40,13,3,140,6,74,67,252,251,4,58,168,88,100,7,4,0,0,1,0,103,255,
-235,3,201,4,78,0,39,0,0,1,52,38,39,46,1,53,52,54,51,50,22,15,1,35,52,38,35,34,
-6,21,20,22,23,30,1,21,20,6,35,34,38,63,1,51,30,1,51,50,54,3,4,99,138,191,205,
-225,179,184,228,5,2,188,123,94,104,103,89,139,199,206,233,188,207,238,6,2,188,
-5,146,98,105,119,1,35,65,82,31,41,148,124,132,188,200,133,6,70,114,94,65,64,
-70,29,42,154,124,144,182,210,140,6,105,97,89,0,0,0,1,0,26,255,235,2,98,5,63,0,
-23,0,0,1,17,51,21,35,17,20,22,51,50,54,55,23,14,1,35,34,38,53,17,35,53,51,17,
-1,138,205,205,63,52,17,41,16,27,23,86,42,119,143,171,171,5,63,254,251,146,253,
-111,76,62,8,6,135,18,23,145,155,2,145,146,1,5,0,1,0,139,255,235,3,252,4,58,0,
-19,0,0,37,14,1,35,34,38,53,17,51,17,20,22,51,50,54,55,17,51,17,35,3,62,51,161,
-104,177,198,197,102,108,105,137,35,197,177,161,87,95,226,239,2,126,253,128,
-173,130,86,79,3,10,251,198,0,0,0,1,0,46,0,0,3,228,4,58,0,9,0,0,1,23,51,55,19,
-51,1,35,1,51,1,248,17,6,19,249,201,254,114,149,254,109,202,1,63,76,76,2,251,
-251,198,4,58,0,0,1,0,45,0,0,5,220,4,58,0,21,0,0,1,23,51,55,19,51,19,23,51,55,
-19,51,1,35,3,39,35,7,3,35,1,51,1,164,25,6,26,216,158,217,28,6,32,160,206,254,
-198,159,214,41,6,38,210,159,254,198,205,1,138,139,139,2,176,253,80,155,155,2,
-176,251,198,2,147,172,172,253,109,4,58,0,0,1,0,46,0,0,3,212,4,58,0,11,0,0,1,
-19,51,9,1,35,11,1,35,9,1,51,1,254,230,230,254,161,1,105,226,240,240,228,1,105,
-254,161,227,2,171,1,143,253,233,253,221,1,153,254,103,2,35,2,23,0,0,1,0,26,
-254,75,3,232,4,58,0,21,0,0,1,23,51,1,51,1,14,1,35,34,38,39,55,38,22,51,50,54,
-63,1,1,51,1,218,35,6,1,10,219,254,57,41,153,130,24,74,20,20,6,83,11,63,80,27,
-47,254,110,220,1,145,136,3,49,251,32,109,162,11,5,155,1,6,112,68,113,4,36,0,0,
-0,0,1,0,94,0,0,3,186,4,58,0,9,0,0,37,33,21,33,53,1,33,53,33,21,1,73,2,113,252,
-164,2,73,253,190,3,51,154,154,138,3,20,156,134,0,0,1,0,63,254,148,2,159,6,61,
-0,30,0,0,1,46,1,61,1,52,38,35,53,50,54,61,1,52,54,55,23,14,1,29,1,20,6,7,30,1,
-29,1,20,22,23,2,119,195,164,103,106,106,103,164,195,40,110,92,85,85,85,85,92,
-110,254,148,55,240,170,205,112,125,147,123,113,206,171,239,55,117,35,181,132,
-206,105,160,45,46,161,103,205,132,179,36,0,0,0,1,0,145,254,242,1,86,5,176,0,3,
-0,0,1,35,17,51,1,86,197,197,254,242,6,190,0,0,0,1,0,21,254,148,2,118,6,61,0,
-30,0,0,23,62,1,61,1,52,54,55,46,1,61,1,52,38,39,55,30,1,29,1,20,22,51,21,34,6,
-29,1,20,6,7,21,109,94,90,94,94,90,94,109,41,194,165,101,108,108,101,165,194,
-246,36,179,132,205,107,160,43,41,160,109,206,132,181,35,117,55,239,171,206,
-113,123,147,125,112,205,170,240,55,0,1,0,128,1,145,4,240,3,35,0,25,0,0,1,20,6,
-35,34,38,39,46,1,35,34,6,21,39,52,54,51,50,22,23,30,1,51,50,54,53,4,240,174,
-130,90,147,85,59,98,50,67,95,141,171,132,88,150,85,58,96,52,66,97,2,228,137,
-202,66,74,48,48,106,75,18,136,193,69,70,51,46,114,77,0,0,255,255,0,144,254,
-138,1,86,4,58,0,71,3,176,255,229,4,58,64,0,192,1,0,0,0,1,0,97,255,11,3,218,5,
-38,0,35,0,0,37,50,54,53,51,23,22,6,7,21,35,53,38,2,61,1,52,18,55,53,51,21,30,
-1,15,1,35,52,38,35,34,6,29,1,20,22,2,61,91,136,180,2,3,178,131,198,184,197,
-198,183,198,140,170,3,3,180,129,98,145,133,131,133,121,88,5,116,198,31,237,
-233,31,1,40,205,42,202,1,40,33,225,227,30,209,138,5,99,139,225,160,42,163,224,
-0,0,0,1,0,70,0,0,4,87,5,197,0,34,0,0,1,23,20,6,7,33,7,33,53,51,62,1,53,39,35,
-53,51,3,52,54,51,50,22,15,1,35,52,38,35,34,6,21,19,33,21,1,174,6,31,29,2,223,
-1,252,48,10,48,48,6,164,158,10,224,188,200,220,4,2,190,126,98,99,116,10,1,162,
-2,103,149,90,163,59,154,154,13,196,103,149,155,1,14,204,233,209,172,6,118,114,
-149,133,254,242,155,0,0,2,0,104,255,229,5,90,4,241,0,35,0,47,0,0,37,14,1,35,
-34,38,39,7,39,55,46,1,53,52,54,55,39,55,23,62,1,51,50,22,23,55,23,7,30,1,21,
-20,6,7,23,7,1,20,18,51,50,18,53,52,2,35,34,2,4,73,77,185,101,101,185,75,130,
-139,138,50,53,57,54,146,139,143,74,178,96,97,178,75,146,140,150,52,57,53,48,
-142,140,252,115,241,172,170,241,241,170,172,241,108,62,66,65,61,132,138,140,
-76,181,99,102,188,78,149,139,146,55,61,62,56,149,140,153,78,185,101,98,179,76,
-143,139,2,123,188,254,247,1,9,188,186,1,8,254,248,0,1,0,30,0,0,4,175,5,176,0,
-22,0,0,9,1,51,1,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,1,51,2,103,
-1,104,224,254,94,1,56,254,129,1,127,254,129,197,254,137,1,119,254,137,1,55,
-254,93,226,3,25,2,151,253,50,123,167,122,254,186,1,70,122,167,123,2,206,0,0,0,
-2,0,145,254,242,1,86,5,176,0,3,0,7,0,0,19,17,51,25,1,35,17,51,145,197,197,197,
-254,242,3,24,252,232,3,200,2,246,0,0,0,2,0,90,254,17,4,124,5,197,0,51,0,69,0,
-0,1,20,6,7,30,1,21,20,4,35,34,36,63,2,20,22,51,50,54,53,52,38,39,46,1,53,52,
-54,55,46,1,53,52,36,51,50,4,15,1,35,52,38,35,34,6,21,20,22,23,30,1,37,46,1,39,
-14,1,21,20,22,23,30,1,23,62,1,53,52,38,4,124,96,87,69,70,254,246,225,221,254,
-210,5,2,188,193,135,137,157,144,204,239,226,94,87,68,68,1,12,224,233,1,4,4,3,
-188,158,140,145,150,134,211,244,223,253,223,47,83,36,73,73,136,210,56,74,33,
-72,80,147,1,175,94,140,40,51,136,98,172,195,205,220,6,2,143,135,119,91,91,101,
-63,63,186,177,91,141,41,50,139,97,166,201,223,202,6,118,158,119,91,99,99,58,
-69,181,83,12,25,15,19,100,69,100,103,59,17,22,12,20,99,69,91,107,0,0,0,2,0,
-160,4,232,3,101,5,176,0,3,0,7,0,0,1,35,53,51,5,35,53,51,3,101,219,219,254,22,
-219,219,4,232,200,200,200,0,0,0,0,3,0,88,255,235,5,227,5,196,0,29,0,41,0,53,0,
-0,1,23,22,6,35,34,38,61,1,52,54,51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,51,
-50,54,53,37,16,0,51,50,0,17,16,0,35,34,0,3,16,0,33,32,0,17,16,0,33,32,0,4,87,
-2,4,176,157,160,188,188,160,157,177,4,2,146,91,91,94,102,102,94,91,90,253,12,
-1,87,246,245,1,88,254,168,245,246,254,169,121,1,158,1,40,1,39,1,158,254,97,
-254,218,254,216,254,98,2,84,6,151,157,213,174,119,173,214,158,149,6,95,87,141,
-114,120,117,140,86,98,133,254,247,254,148,1,108,1,9,1,7,1,106,254,150,254,249,
-1,59,1,176,254,80,254,197,254,196,254,78,1,178,0,0,2,0,120,2,180,3,19,5,197,0,
-32,0,43,0,0,1,46,1,39,14,1,35,34,38,53,52,54,59,1,53,52,38,35,34,6,21,47,1,38,
-54,51,50,22,21,17,20,22,23,37,50,54,55,53,35,34,6,21,20,22,2,101,8,10,3,33,
-113,77,119,130,169,161,139,60,58,67,73,162,1,6,169,140,134,156,12,14,254,136,
-51,109,18,138,75,83,58,2,194,21,48,26,47,62,122,106,110,120,52,63,68,54,49,13,
-6,98,130,142,134,254,198,50,88,43,125,60,35,110,66,46,45,48,0,0,255,255,0,77,
-0,37,3,30,3,125,0,38,1,19,245,221,0,7,1,19,1,68,255,221,0,1,0,127,1,119,3,194,
-3,34,0,5,0,0,1,35,17,33,53,33,3,194,198,253,131,3,67,1,119,1,6,165,0,4,0,88,
-255,235,5,227,5,196,0,11,0,23,0,50,0,59,0,0,19,16,0,33,32,0,17,16,0,33,32,0,
-19,16,0,51,50,0,17,16,0,35,34,0,1,17,35,17,33,50,22,21,20,6,7,30,1,29,1,20,22,
-23,21,35,46,1,61,1,52,38,35,39,51,62,1,53,52,38,43,1,88,1,158,1,40,1,39,1,158,
-254,97,254,218,254,216,254,98,121,1,87,246,244,1,88,254,169,245,246,254,169,1,
-188,149,1,24,152,173,66,63,66,59,7,10,153,9,4,67,77,159,152,65,91,79,98,131,2,
-217,1,59,1,176,254,80,254,197,254,196,254,78,1,178,1,60,254,246,254,149,1,108,
-1,9,1,8,1,105,254,151,254,173,254,174,3,82,131,126,62,94,31,26,106,75,56,41,
-65,21,16,21,81,42,54,72,68,130,1,63,56,73,59,0,0,0,1,0,103,5,30,3,86,5,176,0,
-3,0,0,1,33,53,33,3,86,253,17,2,239,5,30,146,0,0,2,0,128,3,191,2,125,5,197,0,
-11,0,23,0,0,19,52,54,51,50,22,21,20,6,35,34,38,55,20,22,51,50,54,53,52,38,35,
-34,6,128,152,105,103,149,148,104,106,151,131,73,53,52,71,72,51,53,73,4,192,
-106,155,155,106,108,149,149,108,55,72,72,55,55,75,75,0,0,2,0,99,0,4,3,247,4,
-243,0,11,0,15,0,0,1,33,21,33,17,35,17,33,53,33,17,51,1,33,53,33,2,145,1,102,
-254,154,177,254,131,1,125,177,1,58,252,189,3,67,3,88,154,254,99,1,157,154,1,
-155,251,17,155,0,0,1,0,113,2,155,2,202,5,199,0,26,0,0,1,33,53,1,62,1,53,52,38,
-35,34,6,21,35,39,38,54,51,50,22,21,20,6,15,1,23,33,2,202,253,176,1,46,69,44,
-57,58,67,73,161,2,6,168,141,135,152,89,116,153,2,1,105,2,155,130,1,6,60,75,42,
-50,62,64,50,6,99,140,128,116,80,112,105,135,6,0,1,0,106,2,143,2,228,5,198,0,
-42,0,0,1,50,54,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20,
-6,35,34,38,63,1,51,20,22,51,50,54,53,52,38,43,1,53,1,168,67,65,73,69,56,69,
-162,2,6,169,126,145,168,71,62,70,76,180,146,127,181,6,1,163,75,63,72,84,73,73,
-132,4,113,57,52,43,58,48,40,6,94,119,119,110,55,91,26,23,96,68,111,124,116,
-111,6,46,57,59,48,62,57,126,0,0,0,0,1,0,131,4,228,2,36,5,238,0,4,0,0,1,51,23,
-1,35,1,60,230,2,254,243,148,5,238,6,254,252,0,0,1,0,153,254,96,3,242,4,58,0,
-21,0,0,1,17,30,1,51,50,54,55,17,51,17,35,39,14,1,35,34,38,39,17,35,17,1,93,2,
-111,100,98,121,32,197,177,9,44,127,83,72,109,40,196,4,58,253,126,178,129,72,
-70,3,39,251,198,108,63,66,33,35,254,49,5,218,0,0,1,0,63,0,0,3,68,5,176,0,10,0,
-0,33,17,35,34,0,53,52,0,51,33,17,2,127,84,233,254,253,1,3,233,1,25,2,8,1,3,
-209,207,1,5,250,80,0,0,0,1,0,161,2,112,1,103,3,68,0,3,0,0,1,35,53,51,1,103,
-198,198,2,112,212,0,0,0,0,1,0,119,254,77,1,175,0,0,0,15,0,0,33,7,30,1,21,20,6,
-35,39,50,54,53,52,38,39,55,1,36,12,65,86,158,147,7,72,88,72,87,32,52,11,82,80,
-96,114,109,49,49,48,38,7,135,0,1,0,95,2,153,1,140,5,197,0,5,0,0,1,35,17,35,53,
-37,1,140,174,127,1,45,2,153,2,143,134,23,0,2,0,120,2,179,3,43,5,197,0,13,0,27,
-0,0,19,52,54,51,50,22,29,1,20,6,35,34,38,53,51,20,22,51,50,54,61,1,52,38,35,
-34,6,21,120,188,157,158,188,187,157,158,189,173,88,86,83,89,90,84,84,88,4,118,
-148,187,187,148,117,149,185,185,149,88,105,106,87,117,84,107,107,84,0,0,255,
-255,0,166,0,71,3,131,3,159,0,38,1,20,22,0,0,7,1,20,1,112,0,0,255,255,0,184,0,
-0,5,236,5,196,0,39,1,101,0,89,2,152,0,39,1,21,1,24,0,8,0,7,1,104,2,196,0,0,0,
-0,255,255,0,184,0,0,5,245,5,196,0,39,1,21,1,37,0,8,0,39,1,101,0,89,2,152,0,7,
-1,102,3,43,0,0,0,0,255,255,0,122,0,0,6,159,5,199,0,39,1,21,1,207,0,8,0,39,1,
-104,3,119,0,0,0,7,1,103,0,16,2,155,0,0,255,255,0,117,254,118,3,177,4,59,0,15,
-0,31,3,235,4,59,192,1,0,2,0,14,0,0,7,132,5,176,0,15,0,19,0,0,41,1,3,33,3,35,1,
-33,21,33,19,33,21,33,19,33,1,33,3,39,7,132,252,129,15,253,211,201,242,3,113,3,
-199,253,77,20,2,78,253,184,22,2,193,250,172,1,191,31,5,1,94,254,162,5,176,155,
-254,46,155,253,242,1,119,2,198,2,0,0,0,1,0,88,0,225,3,225,4,121,0,11,0,0,19,9,
-1,55,9,1,23,9,1,7,9,1,88,1,71,254,185,126,1,70,1,71,126,254,184,1,72,126,254,
-185,254,186,1,95,1,78,1,78,126,254,179,1,77,126,254,178,254,178,126,1,76,254,
-180,0,0,3,0,108,255,162,4,253,5,237,0,25,0,37,0,49,0,0,1,16,0,33,34,38,39,7,
-35,55,46,1,53,17,16,0,51,50,22,23,55,51,7,30,1,21,1,20,22,31,1,1,46,1,35,34,2,
-21,33,52,38,47,1,1,30,1,51,50,54,53,4,253,254,181,254,248,85,151,64,91,149,
-139,84,89,1,63,255,94,169,71,81,150,132,77,85,252,52,37,36,6,2,31,49,124,72,
-172,205,3,7,33,30,6,253,227,44,106,62,183,215,2,86,254,245,254,160,41,40,154,
-235,83,236,138,1,3,1,10,1,98,51,46,137,221,84,226,129,254,253,85,146,52,1,3,
-149,40,44,255,0,200,75,134,50,1,252,113,34,34,255,203,0,0,0,2,0,163,0,0,4,96,
-5,176,0,12,0,21,0,0,1,17,33,50,4,21,20,4,35,33,17,35,17,19,17,33,50,54,53,52,
-38,35,1,104,1,13,232,1,3,254,253,232,254,243,197,197,1,13,147,147,147,147,5,
-176,254,219,236,189,190,235,254,199,5,176,254,65,253,226,156,113,114,159,0,0,
-0,1,0,137,255,235,4,92,6,19,0,39,0,0,33,35,17,52,54,51,50,22,21,14,1,21,20,18,
-21,20,6,35,34,38,39,55,30,1,51,50,54,53,52,2,53,52,54,55,52,38,35,34,6,21,1,
-77,196,221,198,186,247,51,48,226,198,169,89,184,40,78,40,119,56,99,91,226,58,
-53,152,86,105,128,4,77,218,236,201,180,87,152,75,82,254,166,115,168,170,51,38,
-141,28,48,105,88,76,1,94,110,99,164,91,72,113,156,144,0,0,3,0,88,255,235,6,
-154,4,78,0,46,0,57,0,66,0,0,5,34,38,39,14,1,35,34,38,53,52,54,59,1,53,52,38,
-35,34,6,21,47,1,38,54,51,50,22,23,62,1,51,50,18,29,1,33,7,30,1,51,50,54,55,23,
-14,1,37,50,54,55,53,35,34,6,21,20,22,1,34,6,7,23,33,53,52,38,5,12,136,208,66,
-56,223,160,170,185,230,220,229,104,97,103,122,188,2,5,230,190,114,175,50,64,
-175,101,214,231,253,59,2,1,157,155,103,133,78,67,53,188,252,74,76,166,43,227,
-120,135,100,3,92,113,138,11,2,1,252,120,21,97,90,79,108,174,151,157,172,87,
-106,121,110,78,18,6,138,181,81,77,75,83,254,252,228,119,5,159,198,55,51,138,
-44,78,154,87,57,214,111,80,74,93,3,46,169,133,5,31,122,154,0,0,2,0,72,255,235,
-4,48,5,237,0,32,0,45,0,0,1,22,18,29,1,20,0,35,34,0,53,52,0,51,50,22,23,55,46,
-1,39,5,39,37,46,1,39,55,30,1,23,55,23,1,50,54,61,1,46,1,35,34,6,21,20,22,3,
-105,95,104,254,224,215,218,254,233,1,20,213,90,159,52,4,9,85,68,254,222,77,1,
-0,39,83,44,60,79,144,63,218,77,254,17,133,169,35,161,118,131,161,164,5,17,104,
-254,237,163,220,245,254,201,1,24,207,228,1,28,74,60,5,109,176,66,165,102,146,
-22,34,14,164,19,66,46,125,102,251,4,228,174,148,59,81,208,149,132,201,0,0,3,0,
-71,0,180,4,45,4,178,0,3,0,7,0,11,0,0,1,33,53,33,37,35,53,51,17,35,53,51,4,45,
-252,26,3,230,254,113,198,198,198,198,2,85,188,214,203,252,2,203,0,0,0,3,0,97,
-255,121,4,42,4,185,0,25,0,37,0,49,0,0,19,52,0,51,50,22,23,55,51,7,30,1,29,1,
-20,0,35,34,38,39,7,35,55,46,1,53,51,20,22,23,51,1,46,1,35,34,6,21,33,52,38,39,
-35,1,30,1,51,50,54,53,97,1,4,223,56,104,46,74,129,105,88,94,254,252,224,50,92,
-42,72,129,100,97,103,197,40,41,6,1,77,30,67,37,141,145,2,63,34,33,6,254,185,
-25,56,32,141,146,2,39,240,1,55,22,20,149,212,74,231,141,22,242,254,204,17,16,
-147,203,72,240,149,91,152,48,2,162,17,18,226,170,80,140,47,253,106,12,11,224,
-172,0,0,2,0,153,254,96,4,51,6,24,0,17,0,31,0,0,1,20,2,35,34,38,39,17,35,17,51,
-17,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1,51,50,54,53,4,51,224,197,100,
-151,53,197,197,53,150,98,201,223,197,145,141,85,120,37,37,120,87,140,144,1,
-244,234,254,225,67,67,253,239,7,184,253,170,68,72,254,193,254,250,184,237,77,
-67,253,245,67,75,205,162,0,0,0,2,0,30,0,0,5,139,5,176,0,19,0,23,0,0,1,35,17,
-35,17,33,17,35,17,35,53,51,17,51,17,33,17,51,17,51,1,33,53,33,5,139,140,197,
-253,61,197,148,148,197,2,195,197,140,251,236,2,195,253,61,4,4,251,252,2,131,
-253,125,4,4,146,1,26,254,230,1,26,254,230,254,136,230,0,0,0,1,0,153,0,0,1,94,
-4,58,0,3,0,0,33,35,17,51,1,94,197,197,4,58,0,1,0,153,0,0,4,64,4,58,0,14,0,0,1,
-35,17,35,17,51,17,51,1,51,23,9,1,7,35,1,195,101,197,197,84,1,132,231,2,254,62,
-1,227,2,241,1,203,254,53,4,58,254,55,1,201,5,253,254,253,210,5,0,0,0,0,1,0,40,
-0,0,4,46,5,176,0,13,0,0,1,37,21,5,17,33,21,33,17,7,53,55,17,51,1,104,1,13,254,
-243,2,198,252,117,123,123,197,3,75,86,166,86,253,245,154,2,103,39,166,39,2,
-163,0,1,0,37,0,0,2,14,6,24,0,11,0,0,1,55,21,7,17,35,17,7,53,55,17,51,1,120,
-150,150,197,142,142,197,3,104,58,165,58,253,61,2,120,54,165,54,2,251,0,1,0,
-160,254,75,4,237,5,176,0,24,0,0,1,17,20,6,35,34,38,39,55,30,1,51,50,54,61,1,1,
-7,17,35,17,51,1,55,17,4,237,172,154,31,52,29,14,13,68,17,61,68,253,67,6,197,
-197,2,189,6,5,176,249,247,167,181,9,9,150,5,8,103,90,89,4,88,2,251,170,5,176,
-251,168,2,4,86,0,0,0,1,0,143,254,75,3,245,4,78,0,31,0,0,1,23,62,1,51,50,22,21,
-17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,52,38,35,34,6,7,17,35,17,1,63,13,
-54,160,101,174,192,172,154,31,53,28,14,13,67,18,61,68,114,116,85,123,38,197,4,
-58,150,81,89,205,214,252,252,167,181,9,9,160,5,7,94,88,3,0,143,120,66,59,252,
-207,4,58,0,0,2,0,104,255,235,7,10,5,197,0,23,0,37,0,0,41,1,14,1,35,34,0,25,1,
-16,0,51,50,22,23,33,21,33,17,33,21,33,17,33,5,50,54,55,17,46,1,35,34,6,21,17,
-20,22,7,10,252,175,92,130,67,249,254,201,1,53,249,69,143,79,3,70,253,79,2,86,
-253,170,2,188,251,142,61,122,58,61,122,60,169,192,194,10,11,1,76,1,9,1,48,1,9,
-1,76,12,9,155,254,41,155,253,247,20,9,9,4,127,8,11,227,213,254,206,214,228,0,
-3,0,97,255,235,6,219,4,78,0,36,0,56,0,65,0,0,5,34,38,39,14,1,35,34,0,61,1,52,
-0,51,50,22,23,62,1,51,50,18,29,1,33,20,6,7,30,1,51,50,54,55,23,14,1,1,20,22,
-51,50,54,55,46,1,61,1,52,54,55,46,1,35,34,6,21,1,34,6,7,23,33,53,52,38,5,93,
-136,209,66,64,193,123,224,254,251,1,4,223,124,194,64,64,187,108,217,217,253,
-78,2,2,16,155,141,98,116,79,49,54,155,251,68,145,143,120,141,20,3,2,2,3,20,
-143,120,141,145,4,3,103,135,15,2,1,232,116,21,98,90,90,98,1,53,241,22,240,1,
-55,100,90,89,101,254,242,224,104,15,28,21,140,167,41,42,139,39,59,2,38,172,
-224,165,136,22,42,22,44,19,41,21,135,167,226,170,1,140,159,124,5,16,118,154,0,
-0,1,0,19,255,235,2,117,5,63,0,31,0,0,1,17,51,21,35,21,51,21,35,17,20,22,51,50,
-54,55,23,14,1,35,34,38,53,17,35,53,51,53,35,53,51,17,1,131,205,205,242,242,63,
-52,17,41,16,27,23,86,42,119,143,162,162,171,171,5,63,254,251,146,149,146,254,
-150,76,62,8,6,135,18,23,145,155,1,106,146,149,146,1,5,0,1,0,159,0,0,2,135,6,
-45,0,15,0,0,51,17,52,54,51,50,22,23,7,46,1,35,34,6,21,17,159,182,162,33,69,42,
-24,20,44,25,87,91,4,195,173,189,11,10,145,5,6,109,98,251,61,0,0,1,255,233,254,
-75,2,192,6,45,0,37,0,0,33,21,20,6,35,34,38,39,55,30,1,51,50,54,53,17,35,53,51,
-53,52,54,51,50,22,23,7,46,1,35,34,6,29,1,51,21,35,17,1,157,172,153,31,52,28,
-14,13,66,18,59,69,169,170,180,162,34,69,42,24,18,51,27,87,83,196,196,89,167,
-181,9,9,150,5,8,103,90,4,1,146,137,173,189,11,10,150,4,6,103,98,137,146,252,
-88,0,0,2,0,108,255,235,6,49,5,197,0,23,0,37,0,0,1,16,0,33,34,0,25,1,16,0,51,
-50,4,23,62,1,53,51,20,6,7,30,1,21,39,52,2,35,34,2,21,17,20,18,51,50,54,53,4,
-253,254,181,254,248,255,254,193,1,63,255,183,1,23,72,84,88,197,166,154,5,7,
-197,216,182,172,205,205,172,183,215,2,86,254,245,254,160,1,96,1,11,1,3,1,10,1,
-98,179,152,31,160,121,187,240,40,33,67,34,2,200,1,0,255,0,200,254,251,202,255,
-0,255,203,0,0,2,0,97,255,235,4,242,4,78,0,23,0,37,0,0,19,52,0,51,50,22,23,62,
-1,53,51,20,6,7,30,1,29,1,20,0,35,34,0,53,51,20,22,51,50,54,61,1,52,38,35,34,6,
-21,97,1,4,223,136,208,62,51,51,178,112,108,9,11,254,252,224,224,254,251,197,
-145,143,141,146,147,142,141,145,2,39,240,1,55,120,107,27,110,76,137,189,41,41,
-85,44,22,242,254,204,1,53,241,172,224,224,172,22,170,226,226,170,0,0,1,0,147,
-255,235,6,88,5,177,0,27,0,0,1,17,23,62,1,53,51,23,22,6,7,17,20,0,35,34,0,53,
-17,51,17,20,22,51,50,54,53,17,4,220,6,86,93,190,3,2,196,184,254,200,246,237,
-254,210,197,191,151,160,201,5,176,254,217,1,25,154,118,5,193,243,33,254,18,
-240,254,242,1,15,239,3,199,252,57,167,189,189,167,3,199,0,0,0,0,1,0,139,255,
-235,5,106,4,59,0,29,0,0,1,23,22,6,7,17,35,39,14,1,35,34,38,53,17,51,17,20,22,
-51,50,54,55,17,51,21,23,62,1,53,5,100,3,3,177,189,177,13,51,161,104,177,198,
-197,102,108,105,137,35,197,6,100,85,4,59,6,177,192,14,253,74,161,87,95,226,
-239,2,126,253,128,173,130,86,79,3,10,241,2,7,120,117,0,0,1,255,188,254,75,1,
-112,4,58,0,15,0,0,1,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,1,112,172,153,
-31,51,29,14,14,65,18,59,69,4,58,251,109,167,181,9,9,150,5,8,103,90,4,147,0,0,
-0,1,0,110,4,228,3,77,5,235,0,8,0,0,1,7,35,39,7,35,39,1,51,3,77,2,170,196,196,
-169,2,1,12,198,4,234,6,176,176,6,1,1,0,0,0,1,0,85,4,228,3,54,5,235,0,8,0,0,1,
-55,51,23,1,35,1,55,51,1,197,196,171,2,254,242,198,254,243,2,170,5,59,176,6,
-254,255,1,1,6,0,1,0,129,4,164,2,216,5,176,0,15,0,0,1,23,22,6,35,34,38,63,1,51,
-20,22,51,50,54,53,2,210,2,4,162,137,138,162,5,2,151,68,74,72,70,5,176,6,116,
-146,146,116,6,66,82,83,65,0,0,0,0,1,0,160,4,231,1,122,5,176,0,3,0,0,1,35,53,
-51,1,122,218,218,4,231,201,0,0,0,0,2,0,165,4,118,2,2,5,197,0,11,0,23,0,0,19,
-52,54,51,50,22,21,20,6,35,34,38,55,20,22,51,50,54,53,52,38,35,34,6,165,103,73,
-72,101,101,72,73,103,100,44,32,30,43,43,30,32,44,5,27,72,98,98,72,73,92,93,72,
-32,43,42,33,33,45,45,0,0,1,0,18,254,98,1,224,0,0,0,15,0,0,33,23,14,1,7,21,33,
-21,33,46,1,53,52,54,55,53,1,156,2,75,115,1,1,1,254,56,3,3,122,83,109,3,79,67,
-23,133,19,41,17,122,168,23,24,0,0,0,0,1,0,135,4,225,3,61,5,243,0,19,0,0,1,20,
-6,35,34,38,35,34,6,21,39,52,54,51,50,22,51,50,54,53,3,61,119,90,71,154,51,43,
-58,108,118,91,56,168,52,41,60,5,211,94,130,93,65,46,26,93,137,94,65,47,0,2,0,
-100,4,228,3,74,5,238,0,5,0,10,0,0,1,51,23,1,35,39,3,51,23,3,35,2,98,229,3,254,
-212,171,2,85,211,2,240,157,5,238,6,254,252,5,1,5,5,254,251,0,255,255,0,182,
-254,131,1,236,255,173,0,15,0,156,0,36,250,142,56,209,255,255,0,36,4,240,1,64,
-6,79,0,71,0,64,255,235,254,123,44,156,84,128,0,0,255,255,0,210,4,239,1,239,6,
-80,0,71,0,113,0,121,254,118,43,177,84,192,0,0,255,255,0,135,4,225,3,61,5,243,
-0,6,0,158,0,0,255,255,255,187,4,228,2,161,5,238,0,71,0,159,3,5,0,0,192,1,64,0,
-0,0,0,1,0,148,4,246,1,100,5,252,0,3,0,0,19,51,3,35,148,208,67,83,5,252,254,
-250,0,0,0,3,0,161,4,232,3,101,6,165,0,3,0,7,0,11,0,0,1,35,55,51,5,35,53,51,55,
-51,7,35,3,101,219,20,199,254,22,218,198,48,219,38,142,4,232,200,200,200,245,
-233,0,0,255,255,0,161,2,112,1,103,3,68,0,6,0,116,0,0,0,1,0,163,0,0,4,32,5,176,
-0,5,0,0,1,33,17,35,17,33,4,32,253,72,197,3,125,5,21,250,235,5,176,0,0,0,0,2,0,
-30,0,0,5,112,5,176,0,3,0,7,0,0,1,51,1,33,37,33,1,35,2,135,169,2,64,250,174,1,
-8,3,70,254,112,6,5,176,250,80,154,4,26,0,0,0,0,3,0,113,255,235,5,2,5,197,0,3,
-0,17,0,31,0,0,1,33,53,33,5,16,0,33,34,0,25,1,16,0,51,32,0,17,39,52,2,35,34,2,
-21,17,20,18,51,50,54,53,3,191,254,3,1,253,1,67,254,181,254,248,255,254,193,1,
-63,255,1,8,1,75,197,216,182,172,205,205,172,183,215,2,147,154,215,254,245,254,
-160,1,96,1,11,1,3,1,10,1,98,254,159,254,245,2,200,1,0,255,0,200,254,251,202,
-255,0,255,203,0,0,0,0,1,0,49,0,0,5,7,5,176,0,7,0,0,1,35,1,35,1,51,1,35,2,159,
-6,254,97,201,2,22,170,2,22,201,4,147,251,109,5,176,250,80,0,0,0,3,0,123,0,0,4,
-36,5,176,0,3,0,7,0,11,0,0,55,33,21,33,19,33,21,33,3,33,21,33,123,3,169,252,87,
-83,2,249,253,7,82,3,156,252,100,154,154,3,65,155,3,10,155,0,0,0,0,1,0,168,0,0,
-4,247,5,176,0,7,0,0,33,35,17,33,17,35,17,33,4,247,197,253,59,197,4,79,5,21,
-250,235,5,176,0,1,0,70,0,0,4,72,5,176,0,14,0,0,9,1,23,33,21,33,53,9,1,53,33,
-21,33,7,1,2,246,254,67,3,3,12,251,254,1,224,254,32,3,208,253,38,3,1,189,2,203,
-253,213,5,155,147,2,69,2,69,147,155,5,253,211,0,0,0,0,3,0,84,0,0,5,77,5,176,0,
-17,0,26,0,35,0,0,1,22,0,21,20,0,7,21,35,53,38,0,53,52,0,55,53,51,1,20,22,63,1,
-17,39,38,6,5,52,38,35,7,17,23,22,54,3,52,230,1,51,254,205,230,197,232,254,205,
-1,51,232,197,253,227,177,161,6,6,160,178,3,114,178,157,6,6,157,178,4,205,5,
-254,229,218,221,254,227,4,213,213,3,1,28,221,219,1,30,4,226,253,33,161,187,1,
-2,2,179,2,1,189,158,159,187,2,253,77,2,1,189,0,0,1,0,87,0,0,5,27,5,176,0,25,0,
-0,1,23,62,1,53,17,51,17,20,0,7,17,35,17,38,0,53,17,51,17,20,22,23,55,17,51,3,
-19,6,144,173,197,254,226,234,198,227,254,237,196,164,136,6,198,1,229,2,19,211,
-172,2,59,253,197,245,254,215,24,254,193,1,64,24,1,40,245,2,59,253,197,170,210,
-20,1,3,202,0,0,0,1,0,112,0,0,4,208,5,197,0,35,0,0,37,54,18,61,1,52,38,35,34,6,
-29,1,20,18,23,21,33,53,51,38,2,61,1,16,0,51,50,0,17,21,20,2,7,33,21,33,2,223,
-141,157,193,170,169,192,161,143,254,17,253,120,139,1,53,249,249,1,55,139,118,
-1,3,254,15,159,25,1,31,251,118,233,249,249,233,118,251,254,224,24,159,154,92,
-1,53,167,116,1,28,1,99,254,157,254,228,116,167,254,204,93,154,0,0,0,0,2,0,98,
-255,235,4,128,4,78,0,28,0,43,0,0,1,17,20,22,51,50,54,55,23,14,1,35,34,38,39,
-14,1,35,34,2,61,1,16,18,51,50,22,23,55,1,20,22,51,50,54,55,53,17,46,1,35,34,6,
-21,3,233,41,35,15,26,11,23,29,60,37,75,100,24,55,153,99,198,224,223,201,101,
-155,55,51,253,179,135,140,81,114,39,39,115,78,141,136,4,57,252,219,72,56,3,4,
-142,20,14,64,69,66,67,1,31,234,21,1,5,1,64,72,68,119,253,187,164,203,71,64,8,
-2,29,60,70,239,187,0,2,0,157,254,31,4,79,5,197,0,20,0,42,0,0,1,50,22,21,20,6,
-7,30,1,21,20,6,35,34,38,39,17,35,17,52,36,19,50,54,53,52,38,35,34,6,21,17,30,
-1,51,50,54,53,52,38,43,1,53,2,95,195,236,100,87,119,133,253,202,83,154,57,197,
-1,10,180,122,116,125,109,107,146,44,141,89,129,149,131,111,143,5,197,220,174,
-91,153,45,44,196,129,209,237,51,51,253,206,6,18,165,239,253,151,121,106,95,
-140,143,106,252,194,52,58,160,128,112,172,155,0,0,1,0,46,254,95,3,228,4,58,0,
-11,0,0,1,51,1,17,35,17,1,51,1,23,51,55,3,27,201,254,137,197,254,134,202,1,0,
-17,6,19,4,58,252,4,254,33,1,228,3,247,253,5,76,76,0,0,0,2,0,97,255,235,4,42,5,
-176,0,20,0,34,0,0,1,21,33,7,1,30,1,29,1,20,0,35,34,0,61,1,52,18,55,37,53,1,34,
-6,29,1,20,22,51,50,54,61,1,52,38,3,170,254,57,1,1,97,110,121,254,252,224,224,
-254,251,220,192,254,208,1,119,141,145,145,143,141,146,147,5,176,151,6,254,246,
-69,253,160,22,242,254,204,1,53,241,22,219,1,45,26,241,118,254,3,226,170,22,
-172,224,224,172,22,170,226,0,0,0,1,0,98,255,237,3,233,4,76,0,42,0,0,1,34,6,21,
-20,22,51,50,54,53,51,23,22,4,35,34,38,53,52,54,55,46,1,53,52,54,51,50,22,15,1,
-35,52,38,35,34,6,21,20,22,59,1,21,2,26,121,121,137,118,112,145,186,2,5,254,
-246,184,202,251,103,99,87,96,233,201,183,249,5,2,186,139,100,116,121,109,115,
-209,1,221,85,87,73,100,112,76,6,162,171,173,151,91,128,32,35,122,73,150,164,
-175,139,6,70,98,95,67,74,85,150,0,0,0,1,0,115,254,88,3,202,5,176,0,33,0,0,1,
-21,1,14,1,21,20,22,59,1,50,22,21,14,1,7,39,62,1,53,52,38,43,1,34,38,53,52,18,
-55,1,39,33,53,3,202,254,170,129,113,105,102,32,159,180,2,155,109,81,66,94,82,
-90,52,179,185,139,144,1,12,2,253,145,5,176,112,254,80,153,227,145,116,117,127,
-128,111,165,47,127,31,86,70,52,58,214,168,120,1,65,169,1,48,5,155,0,1,0,143,
-254,97,3,245,4,78,0,19,0,0,1,23,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17,
-35,17,1,63,13,54,160,101,177,189,197,114,116,85,123,38,197,4,58,150,81,89,195,
-224,251,182,4,70,143,125,67,60,252,204,4,58,0,3,0,119,255,235,4,22,5,197,0,13,
-0,22,0,31,0,0,1,20,2,35,34,2,53,17,52,18,51,50,18,21,5,33,17,52,38,35,34,6,21,
-1,33,21,20,22,51,50,54,53,4,22,251,212,211,253,251,211,212,253,253,38,2,21,
-140,128,127,138,2,21,253,235,141,126,128,138,2,2,247,254,224,1,32,247,1,172,
-245,1,34,254,222,245,229,1,14,157,182,182,157,254,88,85,157,184,183,158,0,0,0,
-1,0,197,255,235,2,115,4,57,0,15,0,0,1,17,20,22,51,50,54,55,23,14,1,35,34,38,
-53,17,1,138,53,45,25,48,18,44,45,89,53,119,124,4,57,252,211,73,56,15,11,133,
-31,22,142,158,3,34,0,0,0,1,0,56,255,239,4,94,5,238,0,33,0,0,33,35,1,39,46,1,
-35,34,6,35,53,62,1,51,50,22,23,1,30,1,51,50,54,55,7,14,1,35,34,38,39,3,15,1,1,
-19,219,1,135,55,32,87,60,10,54,4,20,63,24,129,153,40,1,104,22,71,44,14,9,24,3,
-11,37,11,118,143,53,202,6,29,4,4,145,84,106,5,145,5,10,162,108,252,78,71,84,1,
-4,154,5,10,130,140,2,19,1,113,0,0,0,1,0,45,254,68,3,235,5,176,0,46,0,0,1,21,
-33,14,1,21,20,22,59,1,21,35,34,6,21,20,22,59,1,50,22,21,14,1,7,39,62,1,53,52,
-38,43,1,34,36,53,52,54,55,46,1,53,52,54,55,35,53,3,235,254,95,123,125,145,155,
-142,142,159,164,150,130,61,161,178,2,155,109,79,65,94,70,75,69,213,254,248,
-134,129,113,127,64,61,221,5,176,155,8,142,105,105,116,155,135,133,119,149,127,
-129,111,164,47,127,31,85,70,52,60,226,199,127,174,42,42,155,96,86,131,42,155,
-0,0,0,0,1,0,79,255,235,4,204,4,58,0,23,0,0,1,35,17,20,22,51,50,54,55,23,14,1,
-35,34,38,53,17,33,17,35,17,35,53,33,4,94,123,53,45,25,48,18,44,45,89,53,119,
-124,254,145,197,155,4,15,3,158,253,110,73,56,15,11,133,31,22,142,158,2,135,
-252,98,3,158,156,0,0,0,2,0,143,254,96,4,36,4,78,0,16,0,30,0,0,1,20,2,35,34,38,
-39,17,35,17,53,52,0,51,50,18,17,35,52,38,35,34,6,21,17,30,1,51,50,54,53,4,36,
-219,197,97,152,55,197,1,1,192,227,241,197,132,139,123,129,37,120,87,139,140,1,
-244,235,254,226,60,58,253,255,3,224,1,247,1,22,254,195,254,248,189,237,231,
-140,254,211,67,75,204,163,0,0,1,0,98,254,87,3,225,4,78,0,34,0,0,1,50,22,15,1,
-35,52,38,35,34,6,29,1,20,22,51,50,22,21,14,1,7,39,62,1,53,52,38,35,34,0,61,1,
-52,18,2,61,187,233,4,2,178,122,114,138,140,155,163,170,190,2,155,109,81,66,94,
-83,90,246,254,243,255,4,78,209,178,6,103,135,230,155,42,152,215,127,129,111,
-164,47,127,31,85,70,53,58,1,42,223,42,227,1,57,0,0,0,2,0,97,255,235,4,124,4,
-58,0,16,0,30,0,0,1,33,30,1,29,1,20,0,35,34,0,61,1,52,0,51,33,1,20,22,51,50,54,
-61,1,52,38,35,34,6,21,4,124,254,187,108,135,254,248,220,224,254,251,1,4,223,2,
-56,252,170,145,143,141,146,147,142,141,145,3,158,74,222,118,22,210,254,211,1,
-53,241,22,232,1,43,253,215,172,224,224,172,22,161,214,214,161,0,0,0,0,1,0,81,
-0,0,3,220,4,58,0,7,0,0,1,33,17,35,17,33,53,33,3,220,254,154,197,254,160,3,139,
-3,161,252,95,3,161,153,0,0,0,1,0,141,255,235,4,38,4,58,0,21,0,0,1,17,20,22,51,
-50,54,53,38,2,39,51,22,18,21,20,2,35,34,38,53,17,1,82,138,117,137,135,5,86,73,
-206,69,86,222,237,221,241,4,58,253,156,175,162,253,176,127,1,1,136,106,254,
-253,155,255,254,184,242,251,2,98,0,0,2,0,83,254,34,5,87,4,58,0,24,0,33,0,0,1,
-50,0,21,20,0,5,17,35,17,36,0,53,52,18,55,51,6,2,7,20,22,23,55,17,1,46,1,15,1,
-17,23,62,1,3,46,228,1,69,254,241,254,230,197,254,238,254,252,64,52,206,57,66,
-2,163,168,6,2,41,4,186,160,6,6,177,173,4,58,254,191,237,218,254,213,23,254,50,
-1,206,25,1,65,234,153,1,1,108,134,254,254,126,155,238,23,2,3,164,253,210,163,
-237,4,2,252,253,2,21,217,0,1,0,91,254,38,5,77,4,58,0,29,0,0,1,17,23,62,1,53,
-38,2,39,51,22,18,21,20,0,5,17,35,17,38,0,25,1,51,17,20,22,23,55,17,3,37,6,177,
-172,3,66,56,207,51,64,254,246,254,226,198,247,254,243,197,169,144,6,4,57,252,
-92,2,23,241,156,125,1,1,133,106,255,0,153,240,254,190,22,254,55,1,203,25,1,46,
-1,28,1,230,254,24,207,219,19,2,3,162,0,0,0,1,0,108,255,235,6,96,4,58,0,40,0,0,
-1,6,2,7,20,22,51,50,54,53,17,51,17,20,22,51,50,54,53,38,2,39,51,22,18,21,20,2,
-35,34,38,39,14,1,35,34,2,53,52,18,55,1,213,74,86,4,112,120,107,127,198,126,
-108,120,112,5,86,73,207,68,86,202,216,127,175,42,43,175,125,217,202,85,70,4,
-58,134,254,253,127,190,239,162,175,1,44,254,212,175,162,237,192,127,1,3,134,
-106,254,252,154,255,254,184,122,119,119,122,1,72,255,155,1,4,105,0,0,1,0,57,
-255,206,5,150,5,176,0,23,0,0,1,33,17,51,50,0,21,6,2,7,39,62,1,53,46,1,43,1,17,
-35,17,33,53,33,4,184,254,32,171,235,1,40,2,195,190,51,128,112,1,182,150,171,
-197,254,38,4,127,5,21,254,91,255,0,220,138,254,230,34,148,34,157,115,147,164,
-253,53,5,21,155,0,0,1,0,135,255,236,4,208,5,198,0,33,0,0,1,33,7,30,1,51,50,54,
-53,51,23,22,0,35,34,0,25,1,16,0,51,50,0,15,1,35,52,38,35,34,2,29,1,33,3,126,
-253,214,3,4,194,158,164,180,189,2,4,254,216,243,247,254,201,1,55,247,247,1,36,
-4,2,189,180,164,165,196,2,50,2,57,5,185,245,177,156,6,205,254,236,1,94,1,13,1,
-3,1,13,1,95,254,249,217,6,153,178,254,246,197,137,0,0,0,0,2,0,69,0,0,8,73,5,
-176,0,22,0,31,0,0,1,17,33,50,4,21,20,4,35,33,17,33,3,16,2,43,1,53,51,50,18,27,
-1,1,17,33,50,54,53,52,38,35,4,247,1,103,232,1,3,254,253,232,253,212,254,27,1,
-215,251,53,41,149,132,1,1,3,110,1,103,147,147,147,147,5,176,253,201,247,198,
-198,246,5,21,253,237,254,111,254,143,154,1,30,1,74,2,174,253,47,253,187,169,
-123,121,168,0,0,0,2,0,168,0,0,8,73,5,176,0,18,0,27,0,0,1,33,17,51,17,33,50,4,
-21,20,4,35,33,17,33,17,35,17,51,1,17,33,50,54,53,52,38,35,1,109,2,197,197,1,
-103,233,1,2,254,253,232,253,212,253,59,197,197,3,138,1,103,148,146,146,148,3,
-59,2,117,253,152,228,188,189,235,2,161,253,95,5,176,252,253,253,248,148,113,
-112,147,0,0,1,0,73,0,0,5,120,5,176,0,19,0,0,1,33,17,51,50,22,21,17,35,17,52,
-38,43,1,17,35,17,33,53,33,4,200,254,32,167,238,251,197,140,152,167,197,254,38,
-4,127,5,21,254,91,220,238,254,90,1,166,166,137,253,43,5,21,155,0,0,1,0,169,
-254,218,4,247,5,176,0,11,0,0,19,51,17,33,17,51,17,33,17,35,17,33,169,197,2,
-196,197,254,65,197,254,54,5,176,250,235,5,21,250,80,254,218,1,38,0,2,0,163,0,
-0,4,187,5,176,0,12,0,21,0,0,1,33,17,33,50,4,21,20,4,35,33,17,33,1,17,33,50,54,
-53,52,38,35,4,32,253,72,1,103,233,1,3,254,252,232,253,212,3,125,253,72,1,103,
-147,148,147,148,5,21,254,91,239,197,198,246,5,176,253,37,253,197,169,123,119,
-160,0,2,0,54,255,69,5,238,5,176,0,14,0,21,0,0,37,51,17,35,53,33,21,35,17,51,
-50,18,27,1,33,1,6,2,7,33,17,33,5,39,199,197,251,210,197,104,141,158,44,73,2,
-233,253,149,31,102,83,2,126,254,142,154,254,171,187,187,1,85,1,104,1,97,2,77,
-253,179,251,254,156,106,4,123,0,0,0,1,0,26,0,0,6,124,5,176,0,21,0,0,1,35,17,
-35,17,35,1,35,9,1,51,1,51,17,51,17,51,1,51,9,1,35,3,231,54,196,63,254,97,245,
-1,239,254,57,230,1,132,65,196,57,1,132,230,254,57,1,239,245,2,156,253,100,2,
-156,253,100,3,2,2,174,253,135,2,121,253,135,2,121,253,83,252,253,0,0,0,1,0,
-120,255,235,4,223,5,197,0,42,0,0,1,20,6,7,30,1,21,20,4,33,34,36,63,1,51,20,22,
-51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,21,35,39,38,36,51,32,4,4,
-201,136,120,135,143,254,193,254,254,226,254,188,5,2,188,198,157,178,202,184,
-180,183,183,174,168,181,177,141,193,188,1,6,1,49,224,1,1,1,42,4,38,101,167,47,
-42,174,125,201,226,214,205,6,114,157,149,120,133,129,156,132,114,112,144,142,
-105,6,176,220,216,0,0,1,0,173,0,0,4,250,5,176,0,11,0,0,1,51,17,35,17,39,1,35,
-17,51,17,23,4,53,197,197,6,253,67,197,197,6,5,176,250,80,4,86,2,251,168,5,176,
-251,171,2,0,0,0,1,0,69,0,0,4,247,5,176,0,15,0,0,1,17,35,17,33,3,16,2,43,1,53,
-51,50,18,27,1,4,247,197,254,27,1,215,251,53,41,149,132,1,1,5,176,250,80,5,21,
-253,237,254,111,254,143,154,1,30,1,74,2,174,0,0,1,0,66,255,235,4,200,5,176,0,
-21,0,0,1,23,51,1,51,1,14,1,35,34,38,39,55,30,1,51,50,54,63,1,1,51,2,56,74,6,1,
-92,228,253,239,56,160,154,65,113,33,25,33,96,36,82,98,30,39,254,25,221,3,7,
-191,3,104,251,63,124,136,22,15,144,10,17,85,67,83,4,64,0,0,0,0,1,0,161,254,
-213,5,174,5,176,0,11,0,0,19,51,17,33,17,51,17,51,17,35,17,33,161,197,2,197,
-197,190,197,251,184,5,176,250,235,5,21,250,240,254,53,1,43,0,0,1,0,147,0,0,4,
-204,5,176,0,15,0,0,1,17,35,17,33,34,38,53,17,51,17,20,22,51,33,17,4,204,197,
-254,117,241,248,198,138,153,1,139,5,176,250,80,2,74,211,237,1,166,254,90,165,
-127,2,202,0,0,0,1,0,164,0,0,7,143,5,176,0,11,0,0,1,17,33,17,51,17,33,17,51,17,
-33,17,1,105,2,80,196,2,77,197,249,21,5,176,250,234,5,22,250,234,5,22,250,80,5,
-176,0,0,0,1,0,164,254,210,8,60,5,176,0,15,0,0,1,35,17,33,17,51,17,33,17,51,17,
-33,17,51,17,51,8,60,197,249,45,197,2,80,196,2,77,197,173,254,210,1,46,5,176,
-250,234,5,22,250,234,5,22,250,237,0,0,2,0,1,0,0,5,94,5,176,0,12,0,21,0,0,19,
-33,17,33,50,4,21,20,4,35,33,17,33,1,17,33,50,54,53,52,38,35,1,2,10,1,103,233,
-1,3,254,252,232,253,212,254,187,2,10,1,103,147,148,147,148,5,176,253,192,239,
-197,198,246,5,22,253,191,253,197,169,123,119,160,0,0,3,0,163,0,0,6,50,5,176,0,
-10,0,19,0,23,0,0,1,33,50,4,21,20,4,35,33,17,51,25,1,33,50,54,53,52,38,35,1,35,
-17,51,1,104,1,103,233,1,3,254,252,232,253,212,197,1,103,147,148,147,148,3,99,
-198,198,3,112,239,197,198,246,5,176,253,37,253,197,169,123,119,160,253,43,5,
-176,0,0,0,0,2,0,163,0,0,4,187,5,176,0,10,0,19,0,0,1,33,50,4,21,20,4,35,33,17,
-51,25,1,33,50,54,53,52,38,35,1,104,1,103,233,1,3,254,252,232,253,212,197,1,
-103,147,148,147,148,3,112,239,197,198,246,5,176,253,37,253,197,169,123,119,
-160,0,0,1,0,181,255,236,4,255,5,198,0,33,0,0,19,39,38,0,51,50,0,25,1,16,0,35,
-34,0,63,1,51,20,22,51,50,18,61,1,33,53,33,53,52,2,35,34,6,21,188,2,5,1,41,242,
-247,1,56,254,200,247,247,254,220,5,2,189,178,165,164,197,253,194,2,62,197,164,
-165,178,3,222,6,203,1,23,254,161,254,243,254,253,254,242,254,163,1,5,218,6,
-154,177,1,9,198,81,155,25,198,1,11,178,155,0,0,2,0,190,255,235,6,226,5,197,0,
-20,0,34,0,0,1,16,0,33,34,0,39,35,17,35,17,51,17,51,53,16,0,51,32,0,17,39,52,2,
-35,34,2,21,17,20,18,51,50,54,53,6,226,254,181,254,248,244,254,197,14,206,198,
-198,205,1,63,255,1,8,1,75,197,216,182,172,205,205,172,183,215,2,86,254,245,
-254,160,1,67,250,253,216,5,176,253,18,151,1,10,1,98,254,159,254,245,2,200,1,0,
-255,0,200,254,251,202,255,0,255,203,0,0,2,0,44,0,0,4,54,5,176,0,13,0,22,0,0,
-51,35,1,46,1,53,52,36,51,33,17,35,17,33,1,33,34,6,21,20,22,51,33,253,209,1,86,
-142,147,1,18,241,1,210,197,254,189,1,67,254,243,156,162,163,153,1,15,2,149,51,
-190,136,199,219,250,80,2,97,2,180,139,122,123,152,0,2,0,97,255,235,4,42,6,17,
-0,32,0,46,0,0,1,50,0,29,1,20,0,35,34,0,61,1,60,1,55,53,16,18,55,62,1,53,51,23,
-22,6,7,14,1,7,23,62,1,23,34,6,29,1,20,22,51,50,54,61,1,52,38,2,68,225,1,5,254,
-252,224,224,254,251,1,254,233,119,99,151,2,4,162,196,128,186,14,4,53,163,86,
-141,144,144,143,141,146,147,4,78,254,202,241,22,242,254,204,1,53,241,22,8,11,
-7,143,1,60,1,102,30,15,48,66,6,156,107,26,18,168,128,4,70,92,155,226,170,22,
-172,224,224,172,22,170,226,0,3,0,144,0,0,4,35,4,58,0,14,0,23,0,32,0,0,51,17,
-33,50,22,21,20,6,7,30,1,21,20,6,35,1,17,33,50,54,53,52,38,35,37,51,50,54,53,
-52,38,43,1,144,1,171,214,236,92,84,101,113,221,198,254,213,1,43,109,112,112,
-109,254,213,231,125,127,128,125,230,4,58,149,149,76,119,31,25,137,88,152,156,
-1,218,254,190,83,78,77,84,151,74,75,77,78,0,0,1,0,143,0,0,2,190,4,58,0,5,0,0,
-1,33,17,35,17,33,2,190,254,150,197,2,47,3,158,252,98,4,58,0,0,0,0,2,0,69,255,
-69,4,203,4,58,0,14,0,21,0,0,55,50,54,27,1,33,17,51,17,35,53,33,21,35,17,1,14,
-1,7,33,17,33,174,99,81,25,37,2,156,143,197,253,4,197,1,251,17,54,48,1,174,254,
-222,154,247,1,18,1,151,252,96,254,171,187,187,1,85,2,9,184,255,82,2,241,0,1,0,
-26,0,0,5,166,4,58,0,21,0,0,1,35,17,35,17,35,1,35,9,1,51,1,51,17,51,17,51,1,51,
-9,1,35,3,124,58,197,58,254,207,248,1,148,254,142,238,1,30,53,197,54,1,31,237,
-254,142,1,148,248,1,213,254,43,1,213,254,43,2,60,1,254,254,66,1,190,254,66,1,
-190,254,2,253,196,0,0,0,1,0,100,255,237,3,236,4,76,0,42,0,0,1,50,54,53,52,38,
-35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20,6,35,34,36,63,1,51,20,22,
-51,50,54,53,52,38,43,1,53,2,51,115,109,121,115,102,138,186,2,6,250,184,200,
-233,97,86,98,105,252,201,185,254,246,6,2,186,144,113,117,138,122,121,208,2,
-120,80,74,67,95,98,70,6,139,175,163,151,73,122,35,32,128,91,151,173,171,162,6,
-76,112,100,73,86,81,160,0,0,0,1,0,143,0,0,3,252,4,58,0,11,0,0,1,51,17,35,17,
-39,1,35,17,51,17,23,3,55,197,197,6,254,34,196,196,6,4,58,251,198,3,0,2,252,
-254,4,58,253,0,2,0,0,0,1,0,153,0,0,4,64,4,58,0,14,0,0,1,35,17,35,17,51,17,51,
-1,51,23,9,1,7,35,1,195,101,197,197,84,1,131,231,2,254,63,1,227,2,242,1,203,
-254,53,4,58,254,55,1,201,5,253,254,253,210,5,0,0,0,0,1,0,65,0,0,3,252,4,58,0,
-15,0,0,1,17,35,17,33,17,16,2,43,1,63,1,50,54,53,17,3,252,197,254,196,178,207,
-57,4,41,108,91,4,58,251,198,3,158,254,206,254,194,254,210,168,1,209,242,1,206,
-0,1,0,153,0,0,5,85,4,58,0,15,0,0,1,51,1,51,17,35,17,39,1,35,1,7,17,35,17,51,2,
-247,6,1,98,246,197,6,254,180,136,254,174,6,197,254,1,2,3,56,251,198,2,239,2,
-253,15,3,2,2,253,0,4,58,0,1,0,143,0,0,3,251,4,58,0,11,0,0,33,35,17,33,17,35,
-17,51,17,33,17,51,3,251,197,254,30,197,197,1,226,197,1,204,254,52,4,58,254,44,
-1,212,0,0,0,1,0,143,0,0,3,252,4,58,0,7,0,0,33,35,17,33,17,35,17,33,3,252,197,
-254,29,197,3,109,3,158,252,98,4,58,0,1,0,71,0,0,3,209,4,58,0,7,0,0,1,33,17,35,
-17,33,53,33,3,209,254,155,197,254,160,3,138,3,161,252,95,3,161,153,0,0,0,3,0,
-98,254,96,6,191,6,24,0,31,0,45,0,59,0,0,19,16,18,51,50,22,23,17,51,17,62,1,51,
-50,18,17,21,20,2,35,34,38,39,17,35,17,14,1,35,34,2,53,37,52,38,35,34,6,7,17,
-30,1,51,50,54,53,33,20,22,51,50,54,55,17,46,1,35,34,6,21,98,223,201,88,142,53,
-197,55,151,96,200,223,224,197,97,152,55,197,54,141,90,198,224,5,152,145,141,
-85,120,37,37,120,87,140,144,251,45,135,140,81,115,39,39,115,79,141,136,2,9,1,
-5,1,64,55,53,2,54,253,186,61,63,254,193,254,250,21,234,254,225,60,58,253,255,
-1,247,54,54,1,31,234,21,185,241,79,68,253,243,67,75,204,163,164,203,72,65,2,
-34,61,70,239,187,0,0,1,0,143,255,69,4,128,4,58,0,11,0,0,19,51,17,33,17,51,17,
-51,17,35,53,33,143,197,1,227,197,132,197,252,212,4,58,252,96,3,160,252,96,254,
-171,187,0,0,0,1,0,115,0,0,3,220,4,58,0,15,0,0,33,35,17,35,34,38,53,17,51,17,
-20,22,59,1,17,51,3,220,197,208,236,232,197,124,147,208,197,1,165,174,222,1,9,
-254,247,145,96,1,250,0,0,0,0,1,0,143,0,0,5,216,4,58,0,11,0,0,1,17,33,17,51,17,
-33,17,51,17,33,17,1,84,1,125,197,1,125,197,250,183,4,58,252,96,3,160,252,96,3,
-160,251,198,4,58,0,0,0,1,0,143,255,84,6,136,4,58,0,15,0,0,1,17,33,17,51,17,33,
-17,51,17,51,17,35,53,33,17,1,84,1,125,197,1,125,197,176,195,250,202,4,58,252,
-96,3,160,252,96,3,160,252,88,254,194,172,4,58,0,0,2,255,244,0,0,4,82,4,58,0,
-14,0,23,0,0,1,33,50,22,21,20,6,35,33,17,35,53,51,53,51,25,1,33,50,54,53,52,38,
-35,1,176,1,13,192,213,215,190,254,46,247,247,197,1,13,106,101,102,105,2,158,
-184,147,148,191,3,47,154,113,253,202,254,150,102,76,74,110,0,0,0,0,3,0,153,0,
-0,5,172,4,58,0,10,0,14,0,23,0,0,1,33,50,22,21,20,6,35,33,17,51,1,35,17,51,1,
-17,33,50,54,53,52,38,35,1,94,1,13,192,213,215,190,254,46,197,4,78,197,197,251,
-178,1,13,106,101,102,105,2,158,184,147,148,191,4,58,251,198,4,58,253,202,254,
-150,102,76,74,110,0,0,0,0,2,0,153,0,0,4,0,4,58,0,10,0,19,0,0,1,33,50,22,21,20,
-6,35,33,17,51,25,1,33,50,54,53,52,38,35,1,94,1,13,192,213,215,190,254,46,197,
-1,13,106,101,102,105,2,158,184,147,148,191,4,58,253,202,254,150,102,76,74,110,
-0,0,0,0,1,0,99,255,235,3,227,4,78,0,33,0,0,1,34,6,21,35,39,38,54,51,50,18,29,
-1,20,0,35,34,38,63,1,51,20,22,51,50,54,55,39,33,53,33,55,46,1,2,8,92,143,178,
-2,6,255,166,220,255,255,0,219,183,238,5,2,179,135,100,126,138,8,3,254,62,1,
-192,2,10,137,3,179,122,87,6,139,219,254,199,227,42,228,254,199,223,163,6,99,
-139,196,140,5,154,5,131,183,0,0,0,2,0,153,255,235,6,36,4,78,0,21,0,35,0,0,1,
-52,0,51,50,0,29,1,20,0,35,34,38,39,33,17,35,17,51,17,51,53,51,20,22,51,50,54,
-61,1,52,38,35,34,6,21,2,91,1,4,223,225,1,5,254,252,224,185,246,38,254,243,197,
-197,253,197,145,143,141,146,147,142,141,145,2,39,240,1,55,254,202,241,22,242,
-254,204,214,179,254,140,4,58,253,212,3,172,224,224,172,22,170,226,226,170,0,0,
-0,2,0,117,0,0,3,242,4,58,0,13,0,22,0,0,1,17,35,17,33,3,35,19,46,1,53,52,54,51,
-3,20,22,51,33,17,33,34,6,3,242,197,254,252,224,212,238,114,123,222,193,217,
-109,107,1,25,254,232,107,110,4,58,251,198,1,164,254,92,1,189,36,162,108,146,
-185,254,179,72,102,1,98,107,0,0,0,1,255,242,254,75,4,3,6,24,0,43,0,0,1,35,21,
-62,1,51,50,22,29,1,51,17,20,6,35,34,38,39,55,30,1,51,50,54,61,1,35,17,52,38,
-35,34,6,7,17,35,17,35,53,51,17,51,17,51,2,64,236,56,163,99,173,193,3,172,154,
-33,52,28,15,13,68,17,60,68,2,115,114,88,130,40,197,157,157,197,236,4,104,191,
-78,87,208,216,222,253,223,167,181,8,9,151,5,8,103,90,89,2,168,134,128,69,62,
-252,213,4,104,124,1,52,254,204,0,1,0,97,255,235,3,217,4,78,0,34,0,0,1,33,7,30,
-1,51,50,54,53,51,23,22,6,35,34,2,61,1,52,18,51,50,22,15,1,35,52,38,35,34,6,29,
-2,33,2,215,254,108,2,21,125,106,91,136,178,3,4,248,164,228,248,249,227,181,
-231,4,2,179,129,98,145,133,1,176,1,100,6,97,120,121,88,6,140,217,1,54,231,42,
-229,1,55,224,163,6,99,139,225,160,42,10,0,2,0,65,0,0,6,158,4,58,0,22,0,31,0,0,
-1,17,33,50,22,21,20,6,35,33,17,33,17,16,2,43,1,63,1,50,54,53,17,1,17,33,50,54,
-53,52,38,35,3,252,1,13,191,214,215,190,254,46,254,196,178,207,57,4,41,107,92,
-2,199,1,13,105,102,101,106,4,58,254,101,185,147,148,191,3,158,254,206,254,194,
-254,210,158,1,217,244,1,206,253,203,254,147,112,77,73,103,0,0,0,0,2,0,143,0,0,
-6,157,4,58,0,18,0,27,0,0,1,33,17,51,17,33,50,22,21,20,6,35,33,17,33,17,35,17,
-51,1,17,33,50,54,53,52,38,35,1,84,1,226,197,1,13,192,213,215,190,254,46,254,
-30,197,197,2,167,1,13,105,102,101,106,2,162,1,152,254,100,184,147,148,191,2,9,
-253,247,4,58,253,203,254,147,112,77,73,103,0,0,0,0,1,255,242,0,0,4,0,6,24,0,
-27,0,0,1,35,21,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,35,53,51,17,
-51,17,51,2,64,236,56,163,99,173,193,197,115,114,88,130,40,197,157,157,197,236,
-4,154,241,78,87,208,216,253,90,2,168,134,128,69,62,252,213,4,154,124,1,2,254,
-254,0,0,0,0,1,0,143,255,29,3,252,4,58,0,11,0,0,1,17,33,17,51,17,33,21,35,53,
-33,17,1,84,1,227,197,254,175,197,254,169,4,58,252,96,3,160,251,198,227,227,4,
-58,0,1,0,108,255,235,6,98,5,176,0,42,0,0,1,6,2,7,20,18,55,51,22,54,53,17,51,
-17,20,22,55,51,22,18,53,38,2,39,51,22,18,21,16,2,35,34,38,39,14,1,35,34,2,17,
-52,18,55,1,213,65,95,4,112,116,6,101,132,198,131,101,6,115,114,5,95,64,206,61,
-94,205,214,125,176,43,44,176,124,215,204,93,62,5,176,131,254,51,162,234,254,
-179,5,6,255,221,2,22,253,234,221,255,6,5,1,76,235,162,1,205,131,105,254,54,
-191,254,213,254,88,173,155,155,173,1,168,1,43,192,1,201,105,0,0,1,0,127,255,
-235,5,210,4,58,0,40,0,0,1,6,2,7,20,22,51,50,54,53,17,51,17,20,22,51,50,54,53,
-38,2,39,51,22,18,21,20,2,35,34,38,39,14,1,35,34,2,53,52,18,55,1,212,65,76,3,
-83,89,98,116,198,115,99,87,84,4,76,65,207,60,75,174,184,119,165,40,41,164,118,
-185,173,74,61,4,58,136,254,254,126,190,239,162,175,1,44,254,212,175,162,238,
-191,127,1,3,134,106,254,252,154,254,254,183,121,116,117,120,1,73,254,154,1,4,
-106,0,0,3,0,113,255,235,5,2,5,197,0,13,0,30,0,47,0,0,1,16,0,33,34,0,25,1,16,0,
-51,32,0,17,5,50,54,55,53,52,2,35,34,2,29,1,62,1,51,50,4,5,14,1,35,34,38,35,34,
-6,7,21,20,18,51,50,54,53,5,2,254,181,254,248,255,254,193,1,63,255,1,8,1,75,
-254,138,55,95,27,216,182,172,205,36,87,49,87,1,2,1,2,37,90,50,109,237,80,55,
-92,25,205,172,183,215,2,86,254,245,254,160,1,96,1,11,1,3,1,10,1,98,254,159,
-254,245,140,41,33,68,200,1,0,255,0,200,68,28,32,134,99,27,29,133,47,35,15,202,
-255,0,255,203,0,0,0,3,0,97,255,235,4,42,4,78,0,13,0,29,0,45,0,0,19,52,0,51,50,
-0,29,1,20,0,35,34,0,53,37,50,54,55,46,1,35,34,6,7,23,62,1,51,50,22,5,34,6,7,
-30,1,51,50,54,55,39,14,1,35,34,38,97,1,4,223,225,1,5,254,252,224,224,254,251,
-2,128,43,74,9,19,143,121,134,142,2,4,20,70,41,62,182,254,249,38,67,14,16,143,
-124,131,142,4,3,21,75,43,76,167,2,39,240,1,55,254,202,241,22,242,254,204,1,53,
-241,27,50,38,135,168,201,149,5,23,31,90,44,40,30,139,170,193,148,4,26,31,91,0,
-1,0,212,4,164,3,163,5,252,0,7,0,0,1,21,39,55,33,39,23,21,1,131,175,1,2,32,1,
-175,5,34,126,1,235,108,1,217,0,0,0,1,0,251,5,23,3,243,6,21,0,17,0,0,1,50,36,
-51,50,22,29,1,35,53,52,38,35,34,4,43,1,53,1,39,113,1,36,73,113,125,134,59,49,
-43,254,213,130,46,5,153,124,110,108,36,18,52,54,124,130,0,0,1,1,231,5,11,2,
-241,6,116,0,5,0,0,1,53,51,7,23,7,1,231,188,1,79,81,5,220,152,170,125,66,0,1,1,
-231,5,11,2,241,6,116,0,5,0,0,1,39,55,39,51,21,2,56,81,79,1,188,5,11,66,125,
-170,152,0,1,0,105,255,235,4,45,5,176,0,28,0,0,1,39,33,53,33,23,1,30,1,21,20,4,
-35,34,36,63,1,51,20,22,51,50,54,53,52,38,43,1,53,3,13,2,253,137,3,101,1,254,
-103,219,241,254,238,221,192,254,235,5,2,189,152,121,139,159,161,160,146,5,16,
-5,155,120,254,21,13,227,199,200,227,214,205,6,114,157,149,120,153,143,154,0,0,
-0,0,1,0,105,254,117,4,45,4,58,0,28,0,0,1,39,33,53,33,23,1,30,1,21,20,4,35,34,
-36,63,1,51,20,22,51,50,54,53,52,38,43,1,53,2,248,3,253,159,3,101,1,254,116,
-214,233,254,237,220,191,254,234,5,2,189,152,121,139,159,162,160,147,3,153,5,
-156,120,254,19,16,226,196,198,228,215,203,6,112,157,149,118,154,142,154,0,0,0,
-255,255,0,179,2,136,4,240,3,35,0,70,1,33,217,0,83,51,64,0,255,255,0,187,2,136,
-5,243,3,35,0,70,1,33,175,0,102,102,64,0,0,1,0,145,3,149,1,87,5,176,0,5,0,0,19,
-55,51,3,17,35,145,101,97,1,197,4,181,251,255,0,254,229,0,1,0,160,3,149,1,102,
-5,176,0,5,0,0,1,7,35,55,17,51,1,102,101,97,1,197,4,144,251,248,1,35,0,1,0,168,
-255,1,1,110,0,249,0,5,0,0,37,3,35,19,53,51,1,110,101,97,1,197,26,254,231,1,7,
-241,255,255,0,85,3,149,1,27,5,176,0,71,1,8,1,187,0,0,192,1,64,0,0,0,255,255,0,
-145,3,149,2,170,5,176,0,38,1,7,0,0,0,7,1,7,1,83,0,0,255,255,0,160,3,149,2,193,
-5,176,0,38,1,8,0,0,0,7,1,8,1,91,0,0,0,2,0,176,255,17,2,170,1,24,0,5,0,11,0,0,
-37,7,35,55,17,51,1,7,35,55,17,51,1,118,101,97,1,197,1,52,100,98,1,197,10,249,
-240,1,23,254,242,249,247,1,16,0,0,1,0,70,0,0,4,36,5,176,0,11,0,0,1,33,17,35,
-17,33,53,33,17,51,17,33,4,36,254,113,197,254,118,1,138,197,1,143,3,158,252,98,
-3,158,156,1,118,254,138,0,0,0,0,1,0,87,254,96,4,52,5,176,0,19,0,0,41,1,17,35,
-17,33,53,33,17,33,53,33,17,51,17,33,21,33,17,33,4,52,254,113,197,254,119,1,
-137,254,119,1,137,197,1,143,254,113,1,143,254,96,1,160,154,3,4,156,1,118,254,
-138,156,252,252,0,0,0,0,1,0,137,2,23,2,39,3,225,0,13,0,0,19,52,54,51,50,22,29,
-1,20,6,35,34,38,53,137,112,94,95,113,112,95,95,112,3,25,88,112,112,88,60,89,
-109,110,88,255,255,0,161,0,0,4,197,0,202,0,38,0,14,0,0,0,39,0,14,1,187,0,0,0,
-7,0,14,3,95,0,0,0,6,0,64,255,235,7,85,5,197,0,25,0,39,0,53,0,67,0,81,0,85,0,0,
-1,52,54,51,50,22,23,62,1,51,50,22,29,1,20,6,35,34,38,39,14,1,35,34,38,53,1,52,
-54,51,50,22,29,1,20,6,35,34,38,53,1,20,22,51,50,54,61,1,52,38,35,34,6,21,5,20,
-22,51,50,54,61,1,52,38,35,34,6,21,1,20,22,51,50,54,61,1,52,38,35,34,6,21,19,
-39,1,23,3,51,164,136,74,117,37,37,117,74,137,165,164,136,75,118,37,37,116,73,
-138,164,253,13,164,136,138,164,164,136,137,165,3,133,81,75,74,80,82,74,74,80,
-1,200,81,75,73,80,81,74,74,80,251,69,81,75,73,81,82,74,74,80,248,109,2,199,
-109,1,101,126,174,63,54,54,63,173,127,78,128,172,61,55,55,61,172,128,3,129,
-127,174,173,128,77,127,172,172,127,252,204,75,103,103,75,78,74,104,104,74,78,
-75,103,103,75,78,74,104,104,74,2,230,74,103,102,75,77,74,105,105,74,251,214,
-67,4,114,67,0,0,0,0,1,0,88,0,72,1,218,3,160,0,10,0,0,19,7,31,1,21,7,1,53,1,23,
-21,245,61,61,229,5,254,131,1,125,5,2,21,34,36,204,184,3,1,97,150,1,97,3,184,0,
-0,0,0,1,0,144,0,71,2,19,3,159,0,10,0,0,19,53,55,1,21,1,39,53,63,1,39,144,5,1,
-126,254,130,5,230,61,61,2,228,185,2,254,159,150,254,159,2,185,208,34,36,0,0,0,
-0,1,0,59,0,110,3,111,5,35,0,3,0,0,55,39,1,23,168,109,2,199,109,110,67,4,114,
-67,0,2,0,71,2,48,3,83,5,197,0,10,0,15,0,0,1,51,21,35,21,35,53,33,39,1,51,1,33,
-17,39,7,2,190,149,149,172,254,57,4,1,198,177,254,71,1,13,6,13,3,105,129,184,
-184,96,2,125,253,164,1,121,1,26,0,0,1,0,70,0,0,4,87,5,197,0,40,0,0,1,14,1,7,
-33,7,33,53,51,62,1,55,35,53,51,39,35,53,51,39,52,54,51,50,22,15,1,35,52,38,35,
-34,6,21,23,33,21,33,23,33,21,1,179,2,30,27,2,223,1,252,48,10,45,47,4,170,165,
-6,158,152,5,224,188,200,220,4,2,190,126,98,99,116,5,1,166,254,96,5,1,155,1,
-185,83,150,54,154,154,12,173,102,155,143,155,146,204,233,209,172,6,118,114,
-149,133,146,155,143,155,0,0,0,0,1,0,79,255,235,3,213,5,197,0,42,0,0,1,33,7,6,
-22,51,50,54,55,23,14,1,35,34,0,53,35,53,51,53,35,53,51,53,52,0,51,50,22,23,7,
-46,1,35,34,6,29,1,33,21,33,21,33,3,146,254,27,2,4,171,147,57,112,52,19,56,123,
-61,231,254,227,146,146,146,146,1,27,231,59,117,66,19,54,113,56,146,171,1,236,
-254,20,1,236,2,0,5,169,205,17,17,157,15,16,1,33,244,124,166,125,15,244,1,35,
-16,15,159,16,19,206,172,17,125,166,0,0,2,0,103,3,151,4,96,5,176,0,15,0,23,0,0,
-1,39,3,35,3,7,17,35,17,51,19,51,19,51,17,35,1,35,17,35,17,35,53,33,4,3,6,150,
-51,156,6,93,116,161,6,162,110,93,253,228,145,94,145,1,128,4,238,2,254,167,1,
-103,2,254,155,2,25,254,122,1,134,253,231,1,199,254,57,1,199,82,0,0,255,255,0,
-107,255,245,6,82,5,178,0,39,1,101,0,12,2,134,0,39,1,21,1,6,0,0,0,7,1,108,3,75,
-0,0,0,0,255,255,0,110,255,245,6,233,5,192,0,39,1,103,0,4,2,148,0,39,1,21,1,
-191,0,0,0,7,1,108,3,226,0,0,0,0,255,255,0,111,255,245,7,25,5,175,0,39,1,105,
-255,253,2,142,0,39,1,21,1,247,0,0,0,7,1,108,4,18,0,0,0,0,255,255,0,107,255,
-245,6,114,5,175,0,39,1,107,0,12,2,142,0,39,1,21,1,54,0,0,0,7,1,108,3,107,0,0,
-0,0,0,2,0,72,255,235,4,48,5,237,0,20,0,33,0,0,1,4,0,17,21,20,0,35,34,0,53,52,
-18,51,50,22,23,55,46,1,39,19,50,54,61,1,46,1,35,34,6,21,20,22,1,231,1,7,1,66,
-254,224,215,218,254,233,250,218,95,168,54,3,22,235,176,146,133,169,36,172,127,
-136,135,164,5,237,63,254,108,254,217,220,245,254,201,1,24,207,233,1,23,59,52,
-5,193,236,52,251,60,228,174,129,67,92,201,156,132,201,0,0,0,1,0,168,255,45,4,
-244,5,176,0,7,0,0,5,35,17,33,17,35,17,33,4,244,197,253,62,197,4,76,211,5,232,
-250,24,6,131,0,0,0,0,1,0,70,254,243,4,174,5,176,0,14,0,0,9,1,23,33,21,33,53,9,
-1,53,33,21,33,7,1,3,101,253,210,2,3,117,251,152,2,98,253,158,4,25,252,216,2,2,
-48,2,36,253,111,5,155,146,2,201,2,207,147,155,5,253,103,0,0,0,0,1,0,168,2,136,
-3,235,3,35,0,3,0,0,1,33,53,33,3,235,252,189,3,67,2,136,155,0,0,1,0,63,0,0,4,
-173,5,176,0,11,0,0,1,23,51,55,1,51,1,35,3,35,53,33,2,42,18,6,19,1,143,201,253,
-219,149,248,188,1,72,1,84,83,83,4,92,250,80,2,116,156,0,3,0,104,255,235,7,187,
-4,78,0,25,0,39,0,53,0,0,1,20,2,35,34,38,39,14,1,35,34,2,61,1,52,18,51,50,22,
-23,62,1,51,50,18,21,5,20,22,51,50,18,55,53,38,2,35,34,6,21,33,52,38,35,34,2,7,
-21,22,18,51,50,54,53,7,187,247,208,165,238,80,80,239,163,209,246,245,208,164,
-240,81,79,240,165,206,247,249,114,132,126,137,213,27,28,213,138,125,131,5,201,
-133,123,138,212,30,29,212,137,125,133,1,220,221,254,236,215,156,155,216,1,20,
-221,128,220,1,22,216,155,154,217,254,234,220,128,151,192,1,23,108,42,106,1,23,
-195,148,148,195,254,235,108,42,110,254,235,193,150,0,1,255,188,254,75,2,147,6,
-45,0,27,0,0,19,50,54,53,17,52,54,51,50,22,23,7,46,1,35,34,6,21,17,20,6,35,34,
-38,39,55,30,1,43,59,69,182,162,33,69,42,24,20,44,25,87,91,172,153,31,51,29,14,
-14,65,254,230,103,90,5,28,173,189,11,10,145,5,6,109,98,250,228,167,181,9,9,
-150,5,8,0,1,0,152,0,167,3,218,4,227,0,19,0,0,1,51,21,33,7,33,21,33,7,39,55,35,
-53,33,55,33,53,33,19,23,3,25,193,254,228,140,1,168,253,253,133,87,100,199,1,
-34,140,254,82,2,9,147,87,3,219,164,252,164,240,60,180,164,252,164,1,8,60,0,
-255,255,0,158,0,6,3,230,4,75,0,103,0,28,0,87,0,188,64,0,57,154,0,7,1,33,255,
-251,253,126,0,0,255,255,0,154,0,4,3,242,4,76,0,103,0,30,0,18,0,207,64,0,57,
-154,0,7,1,33,255,251,253,124,0,0,255,255,0,169,254,176,1,131,255,121,0,7,0,
-155,0,9,249,201,0,0,0,1,0,93,4,23,1,148,5,179,0,15,0,0,19,39,62,1,53,52,38,35,
-55,50,22,21,20,6,15,1,112,1,76,65,88,71,7,146,158,87,64,1,4,23,154,4,31,38,39,
-38,108,103,86,70,73,9,71,0,0,0,0,2,0,125,4,228,4,113,6,152,0,8,0,12,0,0,1,51,
-5,7,35,39,7,47,1,1,51,3,35,1,149,156,1,31,2,195,157,165,202,2,3,33,211,204,
-147,5,224,235,6,137,148,9,5,1,166,254,252,0,0,0,0,2,255,85,4,228,3,71,6,152,0,
-8,0,12,0,0,1,15,1,39,7,35,39,37,51,5,35,3,51,3,71,2,201,165,158,194,2,1,31,
-155,254,132,147,203,210,4,242,5,9,148,137,6,235,76,1,4,0,2,0,110,4,228,4,49,6,
-209,0,8,0,24,0,0,1,35,1,23,51,55,23,51,55,47,1,62,1,53,52,38,35,55,50,22,21,
-20,6,15,1,2,64,198,254,244,2,169,196,196,170,2,25,1,66,55,75,62,6,127,137,75,
-57,1,5,235,254,255,6,186,186,6,132,133,4,26,32,34,32,94,87,75,61,64,7,61,0,0,
-0,2,0,110,4,228,3,77,6,252,0,8,0,28,0,0,1,7,35,39,7,35,39,1,51,55,20,6,35,34,
-38,35,34,6,21,39,52,54,51,50,22,51,50,54,53,3,77,2,170,196,196,169,2,1,33,157,
-182,97,66,53,113,38,31,51,80,96,66,42,123,39,30,54,4,234,6,176,176,6,1,1,250,
-69,107,71,59,34,19,69,111,69,56,35,0,2,0,129,4,223,2,224,6,139,0,15,0,20,0,0,
-1,23,22,6,35,34,38,63,1,51,20,22,51,50,54,53,39,51,23,7,35,2,216,2,6,164,139,
-140,164,7,2,151,69,75,73,70,93,155,2,159,106,5,176,6,89,114,114,89,6,51,63,63,
-51,219,5,192,0,2,0,129,4,224,2,202,7,42,0,15,0,32,0,0,1,20,6,35,34,38,53,35,7,
-6,22,51,50,54,47,1,37,39,62,1,39,53,54,38,35,55,50,22,21,20,6,15,1,2,49,68,71,
-72,68,144,2,7,158,135,134,158,6,2,254,179,1,73,60,5,5,81,70,7,142,152,83,63,1,
-5,176,51,63,64,50,6,89,113,113,89,6,56,126,3,23,26,6,28,27,83,78,66,53,55,7,
-63,0,0,0,2,0,129,4,219,2,211,6,212,0,15,0,35,0,0,1,23,22,6,35,34,38,63,1,51,
-20,22,51,50,54,53,19,20,6,35,34,38,35,34,6,21,39,52,54,51,50,22,51,50,54,53,2,
-203,2,6,160,136,137,161,7,2,148,67,74,71,69,148,95,71,58,124,41,34,45,88,94,
-73,45,135,43,32,48,5,176,6,91,116,116,91,6,52,65,65,52,1,12,75,107,76,52,37,
-21,74,111,76,51,38,0,1,0,96,254,210,1,37,0,157,0,3,0,0,1,35,17,51,1,37,197,
-197,254,210,1,203,0,0,0,1,0,161,254,75,2,87,0,178,0,15,0,0,37,17,20,22,51,50,
-54,55,23,14,1,35,34,38,53,17,1,92,75,63,18,66,14,15,29,53,31,154,171,178,254,
-245,87,95,7,5,160,9,9,181,167,1,11,0,0,0,0,1,255,190,254,75,1,114,0,154,0,15,
-0,0,37,21,20,6,35,34,38,39,55,30,1,51,50,54,61,1,1,114,172,153,31,51,29,14,14,
-64,19,60,68,154,243,167,181,9,9,160,5,7,94,88,243,0,0,1,255,160,255,206,2,202,
-3,112,0,15,0,0,3,33,50,0,21,6,2,7,39,62,1,53,46,1,35,33,96,1,23,235,1,40,2,
-195,190,51,128,112,1,182,150,254,233,3,112,255,0,220,138,254,230,34,148,34,
-157,115,147,164,0,0,0,1,0,113,0,0,2,85,5,197,0,5,0,0,33,35,17,5,53,37,2,85,
-197,254,225,1,228,4,250,3,162,44,0,1,0,83,0,0,3,231,5,197,0,26,0,0,41,1,53,1,
-62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,1,23,33,3,231,252,143,
-1,175,125,92,122,112,120,133,189,2,5,245,204,198,233,159,159,254,224,2,2,128,
-154,1,245,138,169,82,121,157,159,117,6,178,247,227,208,125,233,179,254,166,5,
-0,1,0,105,255,235,4,45,5,197,0,42,0,0,1,50,54,53,52,38,35,34,6,21,35,39,38,36,
-51,50,22,21,20,6,7,30,1,21,20,4,35,34,36,63,1,51,20,22,51,50,54,53,52,38,43,1,
-53,2,78,132,128,140,136,107,146,189,2,5,1,4,189,219,253,115,100,115,123,254,
-238,221,192,254,235,5,2,189,152,121,139,159,143,139,182,3,51,132,115,112,144,
-142,105,6,176,220,215,200,101,166,48,42,174,125,200,227,214,205,6,114,157,149,
-120,133,129,155,0,2,0,73,0,0,4,111,5,176,0,10,0,15,0,0,1,51,21,35,17,35,17,33,
-53,1,51,1,33,17,39,7,3,156,211,211,197,253,114,2,131,208,253,141,1,174,6,18,1,
-212,154,254,198,1,58,111,4,7,252,36,2,208,1,45,0,1,0,132,255,235,4,61,5,176,0,
-31,0,0,27,1,33,21,33,3,62,1,55,54,22,21,20,2,35,34,36,63,2,20,22,51,50,54,53,
-52,38,35,34,6,7,176,84,3,2,253,164,47,49,125,80,213,239,246,234,202,254,241,5,
-2,180,162,124,134,149,150,133,125,113,28,2,125,3,51,175,254,84,34,45,2,2,249,
-223,219,254,246,202,197,6,18,120,149,176,153,138,163,70,72,0,0,0,2,0,142,255,
-235,4,86,5,197,0,26,0,39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62,1,51,50,22,21,
-20,0,35,34,0,53,17,52,0,19,34,6,7,21,20,22,51,50,54,53,52,38,2,165,86,168,54,
-42,65,118,83,148,190,58,164,97,211,241,255,0,218,211,254,229,1,56,165,103,141,
-36,171,126,134,143,143,5,197,33,26,151,26,29,224,170,148,67,77,244,220,223,
-254,254,1,20,239,1,176,239,1,56,253,48,68,62,133,168,193,178,149,151,146,0,0,
-0,0,1,0,37,0,0,3,213,5,176,0,12,0,0,1,10,1,17,21,35,53,16,0,55,33,53,33,3,213,
-222,196,197,1,13,153,253,17,3,176,5,21,254,244,254,77,254,145,231,231,1,98,2,
-41,163,155,0,0,3,0,130,255,235,4,55,5,197,0,23,0,35,0,47,0,0,1,20,6,7,30,1,21,
-20,4,35,34,36,53,52,54,55,46,1,53,52,54,51,50,22,3,52,38,35,34,6,21,20,22,51,
-50,54,3,52,38,35,34,6,21,20,22,51,50,54,4,14,129,109,126,153,254,250,201,214,
-254,240,156,133,115,133,247,196,185,239,156,155,113,124,163,163,126,114,152,
-41,131,96,109,137,140,108,96,129,4,52,114,168,40,41,181,124,202,227,226,203,
-124,181,41,39,169,114,192,209,209,252,160,119,154,154,119,122,149,149,3,31,
-105,136,131,110,111,138,138,0,0,2,0,92,255,235,4,32,5,197,0,26,0,39,0,0,37,50,
-54,61,1,14,1,35,34,38,53,52,0,51,50,0,21,17,20,0,35,34,38,39,55,30,1,19,50,54,
-55,53,52,38,35,34,6,21,20,22,2,28,142,176,53,163,95,223,232,1,9,203,220,1,20,
-254,224,228,82,172,74,31,69,138,97,114,162,35,159,133,125,152,125,133,186,169,
-169,73,76,231,239,223,1,20,254,236,248,254,49,242,254,243,32,31,150,32,27,2,
-18,92,69,138,170,190,187,157,160,155,0,2,0,123,255,235,4,47,5,197,0,13,0,27,0,
-0,1,20,2,35,34,2,53,17,52,18,51,50,0,21,39,52,38,35,34,6,21,17,20,22,51,50,54,
-53,4,47,254,219,220,255,254,219,219,1,0,198,142,135,135,141,143,135,135,140,2,
-2,248,254,225,1,31,248,1,172,246,1,33,254,223,246,2,176,202,203,175,254,82,
-177,204,203,178,0,0,2,0,39,0,0,4,138,4,141,0,7,0,11,0,0,1,33,3,35,1,51,1,35,1,
-33,3,35,3,87,254,3,103,204,1,213,186,1,212,203,253,214,1,135,193,6,1,12,254,
-244,4,141,251,115,1,166,1,242,0,0,0,2,0,109,4,165,2,237,6,168,0,15,0,20,0,0,1,
-23,22,6,35,34,38,63,1,51,20,22,51,50,54,53,39,35,39,55,51,2,230,2,5,174,146,
-147,173,6,2,149,79,84,83,79,76,157,208,2,220,5,176,6,115,146,146,115,6,65,82,
-82,65,43,199,6,0,3,0,153,0,0,4,13,4,141,0,14,0,24,0,33,0,0,51,17,33,50,22,21,
-20,6,7,30,1,21,20,6,35,1,17,33,50,54,53,52,38,39,35,37,51,50,54,53,52,38,43,1,
-153,1,141,213,237,94,87,102,116,221,197,254,243,1,13,109,111,106,103,11,254,
-243,200,124,129,123,130,200,4,141,159,159,84,130,33,25,150,96,162,167,2,9,254,
-143,94,88,84,100,3,141,89,85,86,70,0,0,0,1,0,112,255,239,4,38,4,157,0,29,0,0,
-1,23,22,4,35,34,0,61,1,52,0,51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,51,50,
-54,53,4,30,2,5,254,253,206,207,254,235,1,21,207,212,254,5,2,189,142,128,123,
-164,164,123,127,142,1,125,6,189,203,1,12,210,243,209,1,12,203,187,6,121,122,
-186,137,244,139,187,122,124,0,0,0,2,0,153,0,0,4,49,4,141,0,9,0,19,0,0,51,17,
-33,50,0,29,1,20,0,35,3,17,51,50,54,61,1,52,38,35,153,1,165,211,1,32,254,224,
-211,224,224,126,176,176,126,4,141,254,243,209,210,210,254,245,3,244,252,164,
-186,139,211,137,187,0,0,0,0,1,0,153,0,0,3,200,4,141,0,11,0,0,1,33,17,33,21,33,
-17,33,21,33,17,33,3,113,253,237,2,106,252,209,3,47,253,150,2,19,2,18,254,134,
-152,4,141,153,254,184,0,0,0,1,0,153,0,0,3,202,4,141,0,9,0,0,1,33,17,35,17,33,
-21,33,17,33,3,115,253,235,197,3,49,253,148,2,21,1,245,254,11,4,141,153,254,
-155,0,1,0,112,255,239,4,75,4,157,0,32,0,0,37,14,1,35,34,0,61,1,52,0,51,50,22,
-15,1,35,52,38,35,34,6,29,1,20,22,51,50,54,55,53,33,53,33,4,75,45,242,181,231,
-254,224,1,34,225,222,243,4,2,188,145,126,140,178,176,146,105,137,31,254,254,1,
-197,157,65,109,1,9,213,243,211,1,10,201,157,6,101,110,184,139,244,142,184,42,
-27,250,154,0,1,0,153,0,0,4,90,4,141,0,11,0,0,33,35,17,33,17,35,17,51,17,33,17,
-51,4,90,198,253,202,197,197,2,54,198,1,235,254,21,4,141,253,247,2,9,0,0,0,1,0,
-153,0,0,1,93,4,141,0,3,0,0,33,35,17,51,1,93,196,196,4,141,0,1,0,64,255,239,3,
-119,4,141,0,16,0,0,1,51,17,20,6,35,34,38,63,1,51,20,22,51,50,54,53,2,179,196,
-227,175,195,226,6,2,188,118,107,88,118,4,141,252,213,170,201,178,170,6,101,
-101,121,98,0,0,0,1,0,153,0,0,4,65,4,141,0,14,0,0,1,35,17,35,17,51,17,51,1,51,
-23,9,1,7,35,1,193,99,197,197,84,1,132,231,3,254,57,1,232,3,241,1,244,254,12,4,
-141,254,4,1,252,5,253,214,253,167,5,0,0,0,0,1,0,153,0,0,3,107,4,141,0,5,0,0,
-37,33,21,33,17,51,1,94,2,13,253,46,197,152,152,4,141,0,0,1,0,153,0,0,5,85,4,
-141,0,15,0,0,1,51,1,51,17,35,17,39,1,35,1,7,17,35,17,51,2,247,6,1,98,246,197,
-6,254,180,136,254,174,6,197,254,1,3,3,138,251,115,3,41,2,252,213,3,61,2,252,
-197,4,141,0,1,0,153,0,0,4,118,4,141,0,11,0,0,33,35,1,7,17,35,17,51,1,55,17,51,
-4,118,196,253,178,6,197,197,2,78,6,196,3,91,2,252,167,4,141,252,165,2,3,89,0,
-0,0,2,0,112,255,239,4,91,4,157,0,13,0,27,0,0,1,20,0,35,34,0,61,1,52,0,51,50,0,
-21,39,52,38,35,34,6,29,1,20,22,51,50,54,53,4,91,254,235,224,223,254,233,1,21,
-223,224,1,23,197,164,142,141,162,163,142,142,162,1,205,214,254,248,1,9,213,
-243,212,1,9,254,247,212,1,151,172,172,151,244,154,172,172,154,0,2,0,153,0,0,4,
-31,4,141,0,10,0,19,0,0,1,17,35,17,33,50,22,21,20,6,35,37,33,50,54,53,52,38,35,
-33,1,94,197,1,210,203,233,233,203,254,243,1,13,117,121,121,117,254,243,1,164,
-254,92,4,141,208,165,166,206,154,126,90,92,130,0,0,0,2,0,112,255,138,4,154,4,
-157,0,19,0,33,0,0,1,20,6,7,23,7,39,14,1,35,34,0,61,1,52,0,51,50,0,21,39,52,38,
-35,34,6,29,1,20,22,51,50,54,53,4,91,52,48,163,135,167,56,133,73,223,254,233,1,
-21,223,224,1,23,197,164,142,141,162,163,142,142,162,1,205,89,155,60,159,116,
-161,30,30,1,9,213,243,212,1,9,254,247,212,1,151,172,172,151,244,154,172,172,
-154,0,2,0,153,0,0,4,44,4,141,0,26,0,35,0,0,1,17,35,17,33,50,22,21,20,6,7,30,1,
-29,1,20,22,23,21,35,46,1,61,1,52,38,35,37,33,50,54,53,52,38,35,33,1,94,197,1,
-205,205,225,99,96,104,91,11,13,203,12,6,104,98,254,217,1,8,120,112,113,119,
-254,248,1,223,254,33,4,141,180,162,89,126,39,30,144,105,118,45,86,22,19,23,98,
-52,116,90,100,154,94,88,92,105,0,0,0,1,0,93,255,239,4,17,4,157,0,39,0,0,1,52,
-38,39,46,1,53,52,54,51,50,22,15,1,35,52,38,35,34,6,21,20,22,23,30,1,21,20,6,
-35,34,36,63,1,51,20,22,51,50,54,3,76,124,162,223,203,243,206,210,235,5,2,187,
-132,119,125,127,115,178,215,204,254,218,202,254,238,6,1,188,163,118,131,144,1,
-48,71,88,40,58,149,150,147,174,186,168,6,92,115,93,74,73,81,43,58,156,145,154,
-168,170,184,6,108,100,94,0,0,0,1,0,71,0,0,3,209,4,141,0,7,0,0,1,33,17,35,17,
-33,53,33,3,209,254,155,197,254,160,3,138,3,244,252,12,3,244,153,0,0,0,1,0,137,
-255,239,4,116,4,141,0,17,0,0,1,17,20,4,35,34,36,53,17,51,17,20,22,51,50,54,53,
-17,4,116,254,233,223,221,254,232,196,169,136,137,169,4,141,253,1,195,220,220,
-195,2,255,253,1,123,140,139,124,2,255,0,0,1,0,39,0,0,4,131,4,141,0,9,0,0,1,23,
-51,55,1,51,1,35,1,51,2,59,23,6,23,1,65,211,254,46,185,254,47,211,1,41,82,80,3,
-102,251,115,4,141,0,1,0,63,0,0,5,192,4,141,0,17,0,0,1,21,55,19,51,19,21,55,19,
-51,1,35,3,35,3,35,1,51,1,199,1,221,183,221,1,179,211,254,218,182,225,6,227,
-181,254,218,211,1,8,3,5,3,131,252,123,3,5,3,131,251,115,3,87,252,169,4,141,0,
-0,1,0,55,0,0,4,66,4,141,0,11,0,0,9,1,51,9,1,35,9,1,35,9,1,51,2,58,1,22,233,
-254,120,1,145,230,254,225,254,227,233,1,146,254,119,232,2,220,1,177,253,191,
-253,180,1,186,254,70,2,76,2,65,0,0,0,1,0,30,0,0,4,53,4,141,0,8,0,0,9,1,51,1,
-17,35,17,1,51,2,41,1,47,221,254,84,197,254,90,221,2,77,2,64,253,13,254,102,1,
-163,2,234,0,0,0,1,0,78,0,0,3,216,4,141,0,9,0,0,37,33,21,33,53,1,33,53,33,21,1,
-61,2,155,252,118,2,129,253,161,3,80,152,152,118,3,126,153,114,0,0,2,0,120,255,
-239,3,250,4,157,0,13,0,27,0,0,1,20,6,35,34,38,53,17,52,54,51,50,22,21,39,52,
-38,35,34,6,21,17,20,22,51,50,54,53,3,250,247,201,202,248,247,201,202,248,197,
-136,117,115,136,137,116,116,135,1,155,197,231,232,196,1,87,195,232,232,195,1,
-124,149,150,123,254,168,125,151,150,126,0,0,0,1,0,78,0,0,1,195,4,157,0,5,0,0,
-33,35,17,7,53,37,1,195,197,176,1,117,3,222,2,160,33,0,0,1,0,89,0,0,3,115,4,
-157,0,26,0,0,41,1,53,1,62,1,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,
-15,1,23,33,3,115,252,243,1,150,102,69,92,87,101,114,188,2,6,224,187,175,201,
-117,158,248,3,2,15,152,1,150,97,114,62,84,113,115,83,6,143,202,184,168,109,
-153,160,249,6,0,0,0,1,0,90,255,239,3,163,4,157,0,42,0,0,1,50,54,53,52,38,35,
-34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20,6,35,34,38,63,1,51,20,22,51,
-50,54,53,52,38,43,1,53,2,0,104,99,110,106,84,114,187,2,6,226,167,192,221,96,
-84,96,103,240,192,168,241,5,2,186,121,95,108,126,111,110,168,2,157,95,84,76,
-104,96,71,6,140,174,172,160,80,133,38,35,138,99,161,182,171,162,6,77,110,109,
-82,98,95,150,0,0,0,0,2,0,71,0,0,4,21,4,141,0,10,0,14,0,0,1,51,21,35,21,35,53,
-33,39,1,51,3,17,39,1,3,82,195,195,197,253,190,4,2,63,204,197,6,254,153,1,133,
-154,235,235,122,3,40,252,248,1,251,2,254,3,0,0,0,0,1,0,90,255,239,3,168,4,141,
-0,31,0,0,27,1,33,21,33,3,62,1,55,54,22,21,20,6,35,34,38,63,2,20,22,51,50,54,
-53,52,38,35,34,6,7,135,71,2,166,254,5,33,37,114,56,181,204,210,219,178,239,5,
-1,189,123,99,118,114,111,101,102,99,24,1,248,2,149,164,254,202,25,37,2,3,202,
-185,178,210,161,157,6,14,83,103,124,110,107,125,57,53,0,2,0,120,255,239,3,215,
-4,157,0,26,0,39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62,1,51,50,22,21,20,6,35,
-34,38,53,17,52,36,19,34,6,7,21,20,22,51,50,54,53,52,38,2,79,66,147,67,33,58,
-114,73,121,155,50,143,88,185,200,239,191,186,247,1,17,161,88,122,27,134,102,
-105,128,114,4,157,28,23,148,24,22,163,125,106,52,58,198,179,171,213,248,196,1,
-55,195,248,253,177,64,54,45,125,167,134,98,104,119,0,1,0,71,0,0,3,103,4,141,0,
-12,0,0,1,6,2,17,21,35,53,16,18,55,33,53,33,3,103,189,163,197,231,142,253,144,
-3,32,3,244,232,254,192,254,237,185,185,1,12,1,150,153,153,0,0,0,0,3,0,88,255,
-239,3,201,4,157,0,23,0,35,0,47,0,0,1,20,6,7,30,1,21,20,6,35,34,38,53,52,54,55,
-46,1,53,52,54,51,50,22,3,52,38,35,34,6,21,20,22,51,50,54,3,52,38,35,34,6,21,
-20,22,51,50,54,3,166,102,86,102,121,247,185,194,255,123,106,91,104,233,180,
-172,227,163,139,97,105,145,145,107,98,136,35,119,82,93,123,125,93,83,116,3,92,
-87,132,37,39,144,94,162,182,182,162,94,145,38,37,132,87,153,168,168,253,86,84,
-111,111,84,87,109,109,2,100,74,98,94,78,77,99,99,0,0,0,0,2,0,71,255,239,3,160,
-4,157,0,26,0,39,0,0,37,50,54,61,1,14,1,35,34,38,53,52,54,51,50,22,21,17,20,4,
-35,34,38,39,55,30,1,19,50,54,55,53,52,38,35,34,6,21,20,22,1,222,108,145,45,
-127,72,195,221,240,190,185,242,255,0,194,68,148,67,31,60,117,91,88,124,25,133,
-99,102,128,116,135,148,110,117,50,52,207,175,166,225,249,195,254,169,181,230,
-26,24,149,26,21,1,163,74,54,55,124,167,146,92,102,134,0,0,2,0,120,255,245,3,
-30,3,44,0,13,0,27,0,0,1,20,6,35,34,38,61,1,52,54,51,50,22,21,39,52,38,35,34,6,
-29,1,20,22,51,50,54,53,3,30,187,151,153,187,186,152,152,188,173,89,78,78,88,
-89,79,77,88,1,27,136,158,158,136,235,134,160,160,134,1,76,86,86,76,236,78,86,
-86,78,0,1,0,95,0,0,1,140,3,44,0,5,0,0,33,35,17,35,53,37,1,140,174,127,1,45,2,
-143,134,23,0,0,0,1,0,113,0,0,2,202,3,44,0,26,0,0,41,1,53,1,62,1,53,52,38,35,
-34,6,21,35,39,38,54,51,50,22,21,20,6,15,1,23,33,2,202,253,176,1,46,69,44,57,
-58,67,73,161,2,6,168,141,135,152,89,116,153,2,1,105,130,1,6,60,75,42,50,62,64,
-50,6,99,140,128,116,80,112,105,135,6,0,0,0,1,0,106,255,245,2,228,3,44,0,42,0,
-0,1,50,54,53,52,38,35,34,6,21,35,39,38,54,51,50,22,21,20,6,7,30,1,21,20,6,35,
-34,38,63,1,51,20,22,51,50,54,53,52,38,43,1,53,1,168,67,65,73,69,56,69,162,2,6,
-169,126,145,168,71,62,70,76,180,146,127,181,6,1,163,75,63,72,84,73,73,132,1,
-215,57,52,43,58,48,40,6,94,119,119,110,55,91,26,23,96,68,111,124,116,111,6,46,
-57,59,48,62,57,126,0,0,0,0,2,0,87,0,0,3,40,3,33,0,10,0,15,0,0,1,51,21,35,21,
-35,53,33,39,1,51,1,51,17,39,7,2,170,126,126,170,254,95,8,1,166,173,254,99,243,
-6,13,1,26,130,152,152,102,2,35,253,249,1,54,1,22,0,0,0,1,0,114,255,245,2,246,
-3,33,0,31,0,0,27,1,33,21,33,7,62,1,55,54,22,21,20,6,35,34,38,63,2,20,22,51,50,
-54,53,52,38,35,34,6,7,146,52,2,4,254,149,26,30,79,42,132,150,159,166,137,182,
-6,1,162,82,68,78,76,77,67,65,67,15,1,90,1,199,133,185,17,25,1,2,145,128,122,
-144,110,106,6,10,48,54,69,66,66,81,34,30,0,0,2,0,120,255,245,3,4,3,44,0,26,0,
-39,0,0,1,50,22,23,7,46,1,35,34,6,29,1,62,1,51,50,22,21,20,6,35,34,38,61,1,52,
-54,19,34,6,7,21,20,22,51,50,54,53,52,38,1,222,53,108,43,30,39,82,51,83,105,36,
-101,63,132,148,182,144,141,185,205,128,64,83,14,86,68,71,84,74,3,44,19,16,127,
-16,15,94,78,66,34,38,140,122,118,146,170,135,214,135,169,254,86,44,38,10,78,
-97,75,59,63,70,0,0,0,1,0,95,0,0,2,172,3,33,0,12,0,0,1,14,1,29,1,35,53,52,18,
-55,33,53,33,2,172,134,111,172,155,89,254,96,2,77,2,158,158,203,182,127,127,
-181,1,23,83,131,0,0,0,3,0,112,255,245,3,7,3,44,0,23,0,35,0,47,0,0,1,20,6,7,30,
-1,21,20,6,35,34,38,53,52,54,55,46,1,53,52,54,51,50,22,3,52,38,35,34,6,21,20,
-22,51,50,54,3,52,38,35,34,6,21,20,22,51,50,54,2,239,73,62,73,86,185,140,146,
-192,89,76,66,74,177,135,130,172,146,92,64,70,96,95,72,65,90,26,75,55,61,79,81,
-60,53,76,2,80,59,91,27,28,99,63,112,124,124,112,63,100,28,27,90,59,105,115,
-115,254,47,51,67,66,52,52,61,61,1,147,45,53,52,46,46,57,57,0,0,0,0,2,0,104,
-255,245,2,236,3,44,0,26,0,39,0,0,37,50,54,61,1,14,1,35,34,38,53,52,54,51,50,
-22,29,1,20,6,35,34,38,39,55,30,1,19,50,54,55,53,52,38,35,34,6,21,20,22,1,151,
-72,96,31,84,47,145,164,180,143,138,183,195,146,51,110,50,28,43,84,72,60,79,13,
-88,66,66,80,75,119,84,67,73,33,34,145,122,114,155,172,134,235,125,157,18,16,
-127,17,14,1,23,49,35,24,76,99,83,55,66,79,0,0,0,0,1,0,120,255,45,1,103,0,243,
-0,5,0,0,37,3,35,19,53,51,1,103,132,107,42,197,46,254,255,1,10,188,0,1,0,22,0,
-0,5,23,5,196,0,21,0,0,1,23,51,55,19,62,1,51,50,22,23,7,46,1,35,34,6,7,1,35,1,
-51,2,89,32,6,33,224,47,156,95,33,51,25,22,6,21,13,52,70,26,254,139,168,253,
-238,214,1,126,120,120,3,37,148,141,11,15,151,2,5,65,78,251,117,5,176,0,1,0,46,
-0,0,4,14,4,77,0,21,0,0,1,23,51,55,19,62,1,51,50,22,23,7,46,1,35,34,6,7,1,35,1,
-51,1,227,17,6,19,149,41,132,82,34,51,24,22,5,22,13,32,59,13,254,216,149,254,
-131,202,1,63,76,76,2,23,127,120,10,15,151,3,5,52,42,252,185,4,58,0,1,0,118,
-254,128,4,191,5,197,0,25,0,0,1,35,17,38,0,53,17,16,0,51,50,0,15,1,35,52,38,35,
-34,2,21,17,20,18,59,1,3,23,196,215,254,250,1,55,247,247,1,36,4,2,189,180,164,
-165,196,196,165,115,254,128,1,113,29,1,82,246,1,3,1,13,1,95,254,249,217,6,153,
-178,254,246,197,254,251,199,254,246,0,0,0,1,0,98,254,128,3,225,4,78,0,25,0,0,
-1,35,17,38,2,61,1,52,18,51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,59,1,2,167,
-197,181,203,255,220,182,238,4,2,178,137,99,138,140,139,139,106,254,128,1,115,
-32,1,42,203,42,227,1,57,224,163,6,98,140,230,155,42,159,228,0,0,0,0,1,0,163,
-255,104,4,209,5,176,0,23,0,0,1,22,4,21,6,2,7,39,62,1,53,46,1,35,33,17,35,17,
-51,17,51,1,51,23,2,195,232,1,25,2,225,221,51,160,142,2,178,154,254,183,197,
-197,128,2,8,222,3,3,43,5,250,232,144,254,217,37,150,34,170,122,165,159,253,
-120,5,176,253,124,2,132,5,0,0,0,0,1,0,153,254,254,4,30,4,58,0,23,0,0,1,30,1,
-21,6,2,7,39,62,1,53,46,1,43,1,17,35,17,51,17,51,1,51,23,2,137,184,215,2,194,
-190,51,128,113,2,178,154,168,197,197,84,1,131,231,2,2,101,30,222,185,133,254,
-245,34,150,32,145,107,144,139,254,53,4,58,254,55,1,201,5,0,0,1,0,163,255,201,
-4,116,5,176,0,21,0,0,1,33,17,51,50,0,21,6,2,7,39,62,1,53,46,1,43,1,17,35,17,
-33,4,32,253,72,249,235,1,40,2,195,190,51,128,112,1,182,150,249,197,3,125,5,21,
-254,86,255,0,220,138,254,230,34,148,34,157,115,147,164,253,58,5,176,0,0,0,1,0,
-143,254,255,3,196,4,58,0,21,0,0,1,33,21,51,50,0,21,6,2,7,39,62,1,53,46,1,43,1,
-17,35,17,33,2,190,254,150,93,235,1,40,2,195,190,51,128,112,1,182,150,93,197,2,
-47,3,158,253,255,0,220,138,254,230,34,148,35,156,115,147,164,254,4,4,58,0,0,0,
-0,1,0,168,255,206,7,227,5,176,0,23,0,0,1,51,50,0,21,6,2,7,39,62,1,53,46,1,43,
-1,17,35,17,33,17,35,17,33,4,247,217,235,1,40,2,195,190,51,128,112,1,182,150,
-217,197,253,59,197,4,79,3,112,255,0,220,138,254,230,34,148,34,157,115,147,164,
-253,53,5,21,250,235,5,176,0,0,1,0,143,255,2,6,184,4,58,0,23,0,0,1,51,50,0,21,
-6,2,7,39,62,1,53,46,1,43,1,17,35,17,33,17,35,17,33,3,252,169,235,1,40,2,195,
-190,51,128,112,1,182,150,169,197,254,29,197,3,109,2,164,255,0,220,138,254,230,
-34,148,35,156,115,147,164,254,1,3,158,252,98,4,58,0,0,2,0,89,255,235,5,33,5,
-197,0,22,0,31,0,0,1,32,0,17,21,16,0,35,32,0,17,53,33,55,54,2,35,34,6,7,39,62,
-1,19,50,18,55,39,33,21,20,22,2,102,1,74,1,113,254,162,252,254,208,254,194,3,
-252,2,4,249,252,108,153,74,49,50,191,240,170,210,17,3,252,205,199,5,197,254,
-113,254,186,49,254,196,254,104,1,97,1,56,108,5,248,1,61,47,37,139,35,65,250,
-192,1,13,210,5,31,207,246,0,255,255,0,94,255,236,3,223,4,78,0,15,0,69,4,64,4,
-58,192,1,0,1,0,169,0,0,7,111,5,176,0,13,0,0,1,33,17,33,21,33,17,35,17,33,17,
-35,17,51,1,110,2,195,3,62,253,135,197,253,61,197,197,3,30,2,146,155,250,235,2,
-131,253,125,5,176,0,0,0,1,0,143,0,0,5,101,4,58,0,13,0,0,1,33,17,33,21,33,17,
-35,17,33,17,35,17,51,1,84,1,226,2,47,254,150,197,254,30,197,197,2,102,1,212,
-156,252,98,1,204,254,52,4,58,0,0,0,1,0,63,255,48,6,156,5,176,0,19,0,0,1,33,17,
-33,17,51,17,51,17,35,53,33,17,33,53,33,53,51,21,33,3,239,254,122,2,197,197,
-169,197,251,205,254,155,1,101,197,1,134,4,165,251,246,5,21,251,75,254,53,208,
-4,165,154,113,113,0,1,0,73,255,69,5,29,4,58,0,19,0,0,1,33,17,33,17,51,17,51,
-17,35,53,33,17,35,53,51,53,51,21,33,3,13,254,228,1,227,197,132,197,252,212,
-227,227,197,1,28,3,46,253,108,3,160,252,96,254,171,187,3,46,154,114,114,0,0,0,
-2,0,77,255,233,6,44,5,195,0,30,0,39,0,0,5,32,0,17,53,46,1,63,1,51,20,22,23,18,
-0,51,32,0,17,21,33,7,6,18,51,50,54,55,23,14,1,3,34,2,7,23,33,53,52,38,4,71,
-254,182,254,145,158,163,4,2,151,83,85,27,1,81,233,1,27,1,42,252,46,2,5,247,
-253,107,154,75,48,50,192,238,171,210,15,3,3,9,181,23,1,141,1,71,6,20,196,154,
-5,93,125,18,1,23,1,94,254,157,254,201,108,5,249,254,196,46,38,139,36,63,5,63,
-254,242,209,5,31,206,247,0,0,0,0,2,255,223,255,235,4,94,4,78,0,29,0,38,0,0,5,
-34,0,61,1,46,1,53,51,20,22,23,62,1,51,50,18,29,1,33,7,6,22,51,50,54,55,23,14,
-1,3,34,6,7,23,33,53,52,38,2,224,242,254,239,125,129,157,51,54,30,255,170,217,
-217,253,76,2,1,155,158,98,116,79,49,54,155,185,103,135,15,2,1,232,116,21,1,43,
-242,6,26,177,138,73,101,23,193,239,254,242,224,104,5,162,204,41,42,139,39,59,
-3,200,159,124,5,16,118,154,0,0,1,0,138,0,0,4,195,5,176,0,15,0,0,51,17,51,17,
-33,50,22,21,17,35,17,52,38,35,33,17,138,197,1,139,240,249,198,139,152,254,117,
-5,176,253,182,212,236,254,90,1,166,164,128,253,54,0,0,1,0,116,2,136,3,58,3,35,
-0,3,0,0,1,33,53,33,3,58,253,58,2,198,2,136,155,0,0,1,0,74,0,0,6,185,5,176,0,
-16,0,0,1,35,17,35,17,33,53,33,17,51,1,51,23,9,1,7,35,3,185,147,197,253,233,2,
-220,128,2,8,222,2,253,196,2,103,3,239,2,146,253,110,5,21,155,253,124,2,132,5,
-253,80,253,10,5,0,0,1,0,49,0,0,5,188,4,58,0,16,0,0,1,35,17,35,17,33,53,33,17,
-51,1,51,23,9,1,7,35,3,63,101,197,254,28,2,169,84,1,131,231,2,254,63,1,227,2,
-242,1,203,254,53,3,158,156,254,55,1,201,5,253,254,253,210,5,0,0,1,0,191,255,
-236,6,146,5,198,0,40,0,0,1,33,7,30,1,51,50,54,53,51,23,22,0,35,34,0,3,35,17,
-35,17,51,17,51,53,16,0,51,50,0,15,1,35,52,38,35,34,2,29,1,33,4,237,254,41,3,4,
-194,158,164,180,189,2,4,254,216,243,240,254,203,9,196,198,198,196,1,55,247,
-247,1,36,4,2,189,180,164,165,196,1,223,2,57,5,185,245,177,156,6,205,254,236,1,
-74,1,3,253,199,5,176,253,35,135,1,13,1,95,254,249,217,6,153,178,254,246,197,
-137,0,0,0,1,0,151,255,235,5,131,4,78,0,39,0,0,1,33,7,30,1,51,50,54,53,51,23,
-22,6,35,34,2,39,35,17,35,17,51,17,51,54,18,51,50,22,15,1,35,52,38,35,34,6,7,
-23,33,4,72,254,146,2,6,132,133,91,136,178,3,4,248,164,213,246,15,177,197,197,
-177,15,246,213,181,231,4,2,179,129,98,133,133,5,2,1,110,1,205,5,139,184,121,
-88,6,140,217,1,16,210,254,51,4,58,254,46,210,1,20,224,163,6,99,139,189,137,5,
-0,0,0,2,0,43,0,0,4,227,5,176,0,11,0,15,0,0,1,35,17,35,17,35,3,35,1,51,1,35,1,
-33,3,35,3,133,161,196,148,152,201,2,13,169,2,2,201,253,171,1,136,191,6,1,182,
-254,74,1,182,254,74,5,176,250,80,2,90,2,51,0,0,2,0,13,0,0,4,41,4,58,0,11,0,17,
-0,0,1,35,17,35,17,35,3,35,1,51,1,35,1,33,3,39,35,7,2,233,106,196,113,116,201,
-1,184,169,1,187,201,254,39,1,36,126,18,6,18,1,38,254,218,1,38,254,218,4,58,
-251,198,1,193,1,56,68,68,0,0,0,0,1,0,169,255,232,7,126,5,176,0,29,0,0,1,17,6,
-22,51,62,1,55,54,38,39,55,30,1,7,2,0,35,6,38,39,17,33,17,35,17,51,17,33,17,4,
-242,1,90,77,135,148,4,1,32,30,190,34,36,2,5,254,236,203,169,186,8,253,65,197,
-197,2,191,5,176,251,169,95,117,1,210,185,97,202,103,1,124,187,92,254,246,254,
-228,3,177,192,1,42,253,125,5,176,253,110,2,146,0,0,0,0,1,0,143,255,232,6,85,4,
-58,0,29,0,0,1,33,17,35,17,51,17,33,17,51,17,6,22,51,62,1,55,54,38,39,51,30,1,
-7,6,2,35,6,38,39,3,64,254,20,197,197,1,236,197,1,91,76,106,117,4,1,31,30,189,
-34,36,2,4,242,178,169,186,8,1,204,254,52,4,58,254,43,1,213,253,31,95,117,1,
-187,164,91,193,97,123,172,86,244,254,250,3,177,192,0,0,0,0,1,0,65,255,232,6,
-65,4,58,0,33,0,0,1,33,17,16,2,43,1,63,1,50,54,53,17,33,17,6,22,51,62,1,55,54,
-38,39,51,30,1,7,6,2,35,6,38,39,3,45,254,205,178,206,57,4,41,107,92,2,189,1,90,
-76,107,116,4,1,32,30,191,33,36,2,4,243,177,168,186,8,3,158,254,208,254,195,
-254,207,168,1,212,241,1,204,253,31,95,117,1,187,164,92,192,97,120,175,86,244,
-254,250,3,177,192,0,0,0,0,1,0,69,255,232,7,117,5,176,0,33,0,0,1,33,17,16,2,43,
-1,53,51,50,18,25,1,33,17,6,22,51,62,1,55,54,38,39,55,30,1,7,2,0,35,6,38,39,4,
-36,254,40,216,250,53,41,149,133,3,97,1,91,77,135,147,4,1,31,30,190,33,36,2,4,
-254,236,203,170,186,8,5,21,253,235,254,114,254,142,154,1,32,1,70,2,176,251,
-169,95,117,1,210,185,97,203,102,1,122,189,92,254,246,254,228,3,177,192,0,1,0,
-118,255,235,4,159,5,197,0,33,0,0,5,32,0,25,1,16,0,33,50,22,23,7,46,1,35,34,2,
-21,17,20,18,51,62,1,55,54,38,39,51,30,1,7,6,4,2,185,255,0,254,189,1,67,1,0,
-113,178,68,63,67,144,85,175,207,207,175,136,148,4,1,27,24,190,42,16,1,4,254,
-235,21,1,94,1,12,1,6,1,11,1,95,45,43,135,33,35,254,246,195,254,248,198,254,
-246,1,154,137,83,181,97,197,86,78,216,230,0,0,0,0,1,0,98,255,235,3,198,4,78,0,
-33,0,0,37,62,1,55,52,38,39,51,30,1,21,14,1,35,34,0,61,1,52,18,51,50,22,23,7,
-46,1,35,34,6,29,1,20,22,2,81,95,78,3,10,9,189,13,14,4,204,165,230,254,247,255,
-219,94,142,47,46,47,122,68,137,140,149,133,1,83,84,58,122,56,68,115,53,158,
-164,1,58,227,42,226,1,58,35,31,147,27,31,231,154,42,158,229,0,0,0,0,1,0,36,
-255,232,5,77,5,176,0,25,0,0,1,33,53,33,21,33,17,6,22,51,62,1,55,54,38,39,55,
-30,1,7,2,0,35,6,38,39,1,252,254,40,4,128,254,29,1,91,76,135,149,4,1,32,31,191,
-34,35,2,4,254,236,204,169,186,8,5,21,155,155,252,68,95,117,1,210,185,96,202,
-104,1,124,187,92,254,246,254,228,3,177,192,0,0,0,0,1,0,70,255,232,4,189,4,58,
-0,25,0,0,1,33,53,33,21,33,17,6,22,51,62,1,55,54,38,39,51,30,1,7,14,1,35,6,38,
-39,1,168,254,158,3,139,254,156,1,90,77,106,117,4,1,32,29,189,34,36,2,4,243,
-177,169,186,8,3,161,153,153,253,184,95,117,1,155,137,76,167,80,103,148,72,216,
-231,3,177,192,0,0,0,0,2,0,91,0,0,6,110,5,176,0,24,0,33,0,0,33,34,36,53,52,36,
-51,33,17,51,17,55,62,1,55,54,38,39,51,30,1,7,14,1,35,37,17,33,34,6,21,20,22,
-51,2,70,233,254,254,1,1,234,1,103,197,83,106,116,4,1,31,30,190,33,36,2,4,243,
-176,254,232,254,153,148,146,146,148,246,198,197,239,2,64,250,233,1,1,141,126,
-77,167,79,100,151,72,204,218,154,2,59,160,119,123,169,0,0,0,2,0,98,255,233,6,
-116,6,24,0,34,0,51,0,0,19,16,18,51,50,22,23,17,51,17,6,22,51,62,1,55,54,38,39,
-55,30,1,7,2,0,35,6,38,39,14,1,35,34,2,53,1,46,1,35,34,6,29,1,20,22,51,50,54,
-55,46,1,53,98,223,201,89,140,52,197,2,92,77,134,148,4,1,31,30,190,33,36,2,4,
-254,236,203,120,163,41,53,161,109,198,224,2,193,39,114,78,142,135,134,141,84,
-116,39,3,3,2,9,1,5,1,64,62,59,2,67,251,65,95,117,1,210,185,97,203,102,1,122,
-189,92,254,246,254,228,2,85,93,87,89,1,31,234,1,61,58,67,234,187,21,164,197,
-73,66,15,34,18,0,1,0,54,255,232,5,211,5,176,0,44,0,0,1,52,38,43,1,53,51,50,54,
-53,52,38,35,33,53,33,50,22,21,20,6,7,30,1,29,1,6,22,51,62,1,55,54,38,39,51,30,
-1,7,10,1,35,6,38,39,2,191,137,116,191,136,166,147,143,152,254,153,1,103,239,
-253,117,111,118,105,1,79,67,116,128,4,1,31,30,190,34,34,1,4,254,187,160,174,8,
-1,114,118,145,155,126,131,121,135,155,212,201,113,165,49,40,176,128,68,76,95,
-1,212,183,97,204,102,134,179,90,254,247,254,227,3,157,171,0,0,1,0,49,255,227,
-4,235,4,58,0,45,0,0,37,6,22,51,62,1,55,54,38,39,51,30,1,7,14,1,35,6,38,39,53,
-52,38,43,1,39,51,50,54,53,52,38,35,33,39,33,50,22,21,20,6,7,30,1,29,1,2,236,1,
-39,47,106,117,4,1,32,30,190,34,36,2,5,242,177,138,138,6,106,98,211,2,184,119,
-113,114,119,254,250,6,1,12,206,226,96,93,99,89,213,42,44,2,153,137,76,164,79,
-102,146,71,215,230,3,114,129,75,71,79,154,83,77,81,95,153,170,152,81,114,36,
-28,122,89,77,0,2,0,80,254,219,3,253,5,176,0,33,0,39,0,0,19,53,51,50,54,53,52,
-38,35,33,53,33,50,22,21,20,6,7,30,1,29,1,20,22,23,21,35,46,1,61,1,52,38,35,1,
-3,35,19,53,51,112,221,167,149,143,152,254,238,1,18,239,252,117,111,119,105,31,
-37,203,41,21,137,116,2,118,132,107,42,197,2,120,154,127,130,122,136,155,212,
-203,112,166,48,40,176,128,136,68,108,34,25,35,131,71,132,118,145,253,100,254,
-255,1,10,188,0,0,2,0,123,254,219,3,187,4,58,0,33,0,39,0,0,19,53,33,50,54,53,
-52,38,35,33,53,33,50,22,21,20,6,7,30,1,29,1,20,22,23,21,35,46,1,61,1,52,38,35,
-1,3,35,19,53,51,125,1,22,120,112,113,119,254,232,1,24,205,225,97,94,102,89,29,
-34,203,37,20,106,98,2,11,132,107,42,197,1,183,154,83,78,81,94,153,169,153,81,
-116,36,29,132,97,97,45,86,22,19,23,99,51,95,80,91,254,37,254,255,1,10,188,0,2,
-0,91,0,0,4,114,5,176,0,10,0,19,0,0,1,17,51,17,33,34,36,53,52,36,51,1,17,33,34,
-6,21,20,22,51,3,173,197,253,212,233,254,254,1,1,234,1,103,254,153,148,146,146,
-148,3,112,2,64,250,80,246,198,197,239,253,42,2,59,160,119,123,169,0,0,0,0,1,0,
-156,255,235,5,2,5,197,0,42,0,0,1,34,6,21,20,22,51,50,54,53,51,23,22,4,35,32,
-36,53,52,54,55,46,1,53,52,36,33,50,4,15,1,35,52,38,35,34,6,21,20,22,59,1,21,2,
-205,181,183,202,178,156,199,188,2,4,254,188,225,254,254,254,193,142,135,120,
-135,1,42,1,1,223,1,50,5,1,188,195,140,178,180,167,175,184,2,152,129,133,120,
-149,157,114,6,205,214,227,200,126,173,42,48,166,101,199,216,220,176,6,105,142,
-144,112,114,132,156,0,0,1,0,163,0,0,4,34,6,218,0,9,0,0,1,35,53,33,17,35,17,33,
-17,51,4,34,197,254,11,197,2,186,197,5,15,6,250,235,5,176,1,42,0,0,0,1,0,143,0,
-0,3,16,5,100,0,9,0,0,1,35,53,35,17,35,17,33,17,51,3,16,197,247,197,1,188,197,
-3,153,5,252,98,4,58,1,42,0,0,0,0,2,0,41,0,0,3,223,5,176,0,5,0,15,0,0,1,51,9,1,
-35,1,33,1,39,35,7,3,1,23,51,55,1,183,150,1,146,254,113,149,254,110,2,237,254,
-255,17,6,18,250,1,1,17,6,18,5,176,253,39,253,41,2,215,2,0,50,50,254,0,254,1,
-50,50,0,0,0,0,1,0,163,0,0,4,255,5,176,0,20,0,0,9,2,35,1,35,21,35,53,35,17,35,
-17,51,17,51,53,51,21,51,1,4,213,254,114,1,184,246,254,172,78,157,98,197,197,
-98,157,76,1,61,5,176,253,79,253,1,2,146,243,243,253,110,5,176,253,124,255,255,
-2,132,0,0,0,0,1,0,153,0,0,4,99,4,58,0,20,0,0,9,2,35,1,35,21,35,53,35,17,35,17,
-51,17,51,53,51,21,51,19,4,64,254,173,1,118,249,254,243,23,157,75,197,197,75,
-157,15,255,4,58,254,0,253,198,1,203,191,191,254,53,4,58,254,55,211,211,1,201,
-0,2,0,147,0,0,4,204,5,176,0,3,0,19,0,0,1,35,17,51,1,17,35,17,33,34,38,53,17,
-51,17,20,22,51,33,17,3,30,158,158,1,174,197,254,117,241,248,198,138,153,1,139,
-1,60,2,189,1,183,250,80,2,74,211,237,1,166,254,90,165,127,2,202,0,2,0,115,0,0,
-3,220,4,58,0,3,0,19,0,0,37,35,17,51,1,35,17,35,34,38,53,17,51,17,20,22,59,1,
-17,51,2,135,158,158,1,85,197,208,236,232,197,124,147,208,197,229,2,54,252,229,
-1,165,174,222,1,9,254,247,145,96,1,250,0,1,0,143,254,75,3,251,4,58,0,23,0,0,1,
-17,33,17,51,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,33,17,35,17,1,84,1,226,
-197,173,153,31,53,28,15,13,67,17,60,69,254,30,197,4,58,254,44,1,212,251,109,
-167,181,9,9,150,5,8,103,90,2,37,254,52,4,58,0,1,0,169,254,75,4,246,5,176,0,23,
-0,0,1,17,33,17,51,17,20,6,35,34,38,39,55,30,1,51,50,54,53,17,33,17,35,17,1,
-110,2,195,197,173,153,31,53,28,14,14,67,17,60,69,253,61,197,5,176,253,110,2,
-146,249,247,167,181,9,9,150,5,8,103,90,2,220,253,125,5,176,0,2,0,74,254,68,3,
-164,7,114,0,44,0,53,0,0,1,50,54,53,52,38,35,33,53,33,50,4,21,20,6,7,30,1,21,
-20,4,43,1,34,6,21,20,22,23,7,46,1,39,52,54,59,1,50,54,53,52,38,43,1,53,1,55,
-51,23,1,35,1,55,51,1,156,154,146,143,137,254,208,1,48,211,1,11,130,115,129,
-138,254,247,211,50,76,69,93,66,79,111,155,1,179,161,42,129,149,164,158,143,1,
-10,196,171,2,254,242,198,254,243,2,170,3,57,127,114,102,133,155,213,181,103,
-164,44,41,176,127,200,227,59,53,70,85,30,127,47,164,111,129,128,149,119,133,
-134,155,3,137,176,6,254,255,1,1,6,0,0,0,0,2,0,73,254,68,3,121,6,26,0,44,0,53,
-0,0,1,50,54,53,52,38,35,33,53,33,50,22,21,20,6,7,30,1,21,20,6,43,1,34,6,21,20,
-22,23,7,46,1,39,52,54,59,1,50,54,53,52,38,43,1,53,19,55,51,23,1,35,1,55,51,1,
-154,133,126,123,116,254,209,1,47,192,245,103,91,105,111,243,192,49,76,69,94,
-66,80,111,155,1,179,161,41,110,127,143,138,143,196,196,171,2,254,242,198,254,
-243,2,170,2,106,83,75,65,85,156,168,142,73,119,35,33,122,86,151,173,59,53,70,
-86,29,127,47,164,111,129,128,91,74,82,81,155,3,0,176,6,254,255,1,1,6,0,0,0,2,
-0,209,0,0,6,244,5,176,0,19,0,23,0,0,1,33,1,51,1,35,3,35,17,35,17,35,3,35,19,
-33,17,35,17,51,1,33,3,35,1,151,1,126,1,52,169,2,2,201,149,161,196,148,152,201,
-158,254,189,198,198,2,63,1,136,191,6,2,91,3,85,250,80,1,182,254,74,1,182,254,
-74,1,183,254,73,5,176,252,170,2,51,0,0,2,0,186,0,0,5,232,4,58,0,19,0,25,0,0,1,
-33,1,51,1,35,3,35,17,35,17,35,3,35,19,35,17,35,17,51,1,33,3,39,35,7,1,127,1,3,
-1,2,169,1,187,201,119,106,196,113,116,201,119,196,197,197,1,199,1,36,126,18,6,
-18,1,193,2,121,251,198,1,38,254,218,1,38,254,218,1,37,254,219,4,58,253,135,1,
-56,68,68,255,255,0,163,0,0,4,188,5,176,0,99,1,49,1,217,2,204,51,51,76,205,0,2,
-0,48,0,0,0,3,0,143,254,96,4,41,4,78,0,3,0,21,0,35,0,0,5,7,3,55,37,20,2,35,34,
-38,39,17,35,17,51,23,62,1,51,50,18,17,35,52,38,35,34,6,7,17,30,1,51,50,54,53,
-3,125,147,175,148,1,90,224,197,100,151,53,197,151,31,53,158,105,201,223,197,
-145,141,85,120,37,37,120,87,140,144,136,55,1,217,55,163,234,254,225,67,67,253,
-239,5,218,140,78,82,254,193,254,250,184,237,77,67,253,245,67,75,205,162,0,0,0,
-0,1,0,95,254,75,4,75,4,73,0,37,0,0,19,50,22,31,1,51,19,51,1,19,30,1,51,50,54,
-55,7,14,1,35,34,38,39,3,35,1,35,1,3,46,1,35,34,6,35,53,62,1,202,129,151,42,92,
-6,233,198,254,171,204,33,62,42,14,10,22,3,10,36,13,116,139,53,127,6,254,247,
-209,1,127,163,33,86,60,10,54,4,20,63,4,73,160,108,222,1,219,253,61,254,20,75,
-79,2,3,156,6,9,130,142,1,44,253,218,3,14,1,130,83,106,5,145,5,10,0,0,0,1,0,
-160,4,140,1,122,6,23,0,5,0,0,19,55,51,3,21,35,160,121,97,21,197,5,32,247,254,
-255,138,0,0,2,0,78,255,235,6,25,4,58,0,22,0,44,0,0,1,35,30,1,21,20,2,35,34,38,
-39,14,1,35,34,2,53,52,54,55,35,53,33,1,46,1,39,33,14,1,7,20,22,51,50,54,61,1,
-51,21,20,22,51,50,54,6,25,133,29,33,174,184,119,165,40,41,164,118,185,173,32,
-30,111,5,203,254,244,3,40,34,252,209,35,40,2,83,89,98,116,198,115,99,87,84,3,
-158,81,182,101,254,254,183,121,116,117,120,1,73,254,101,182,81,156,253,248,89,
-182,93,94,182,88,190,239,162,175,250,250,175,162,238,0,1,255,234,0,0,4,83,5,
-187,0,35,0,0,1,62,1,51,50,22,23,7,46,1,35,34,6,7,1,17,35,17,1,46,1,35,34,6,7,
-39,62,1,51,50,22,23,19,23,51,55,2,230,51,123,81,34,50,26,23,5,22,13,33,55,16,
-254,212,196,254,212,17,55,32,14,21,5,22,24,50,35,80,123,52,178,19,6,19,4,215,
-124,104,10,14,152,3,5,35,39,253,121,253,190,2,66,2,135,39,35,5,3,152,14,10,
-104,124,254,106,70,70,0,255,255,0,113,255,85,5,2,6,68,2,38,0,47,0,0,0,39,1,49,
-1,248,0,131,0,7,1,49,1,248,5,167,255,255,0,97,255,99,4,42,4,217,2,38,0,79,0,0,
-0,39,1,49,1,132,0,145,0,7,1,49,1,132,4,60,0,2,0,108,255,235,6,98,7,7,0,11,0,
-54,0,0,1,21,39,55,33,21,35,53,35,21,35,53,5,6,2,21,16,18,51,50,54,55,30,1,51,
-50,18,17,52,2,39,35,22,18,23,20,2,39,35,6,38,53,17,35,17,20,6,39,35,6,2,53,54,
-18,55,2,138,175,1,3,53,177,153,178,253,242,62,93,204,215,124,176,44,43,176,
-125,214,205,94,61,206,64,95,5,114,115,6,101,131,198,132,101,6,116,112,4,95,65,
-6,154,130,1,238,239,130,130,130,234,105,254,55,192,254,213,254,88,173,155,155,
-173,1,168,1,43,191,1,202,105,131,254,51,162,235,254,180,5,6,255,221,2,22,253,
-234,221,255,6,5,1,77,234,162,1,205,131,0,0,0,2,0,127,255,235,5,210,5,182,0,11,
-0,52,0,0,1,21,39,55,33,21,35,53,35,21,35,53,1,6,2,21,20,18,51,50,54,55,30,1,
-51,50,18,53,52,2,39,35,22,18,23,20,6,35,34,38,53,17,35,17,20,6,35,34,38,53,54,
-18,55,2,92,175,1,3,53,176,154,178,254,31,61,74,173,185,118,164,41,40,165,119,
-184,174,75,60,207,65,76,4,84,87,99,115,198,116,98,89,83,3,76,65,5,73,130,1,
-238,239,130,130,130,254,241,106,254,252,154,254,254,183,120,117,116,121,1,73,
-254,154,1,4,106,134,254,253,127,191,238,162,175,1,44,254,212,175,162,239,190,
-126,1,2,136,0,0,2,0,149,0,0,6,75,5,176,0,33,0,37,0,0,1,51,50,22,21,17,35,17,
-52,38,43,1,7,17,35,17,39,35,34,6,21,17,35,17,52,54,59,1,1,51,23,55,53,33,1,51,
-1,33,4,76,22,239,250,197,139,153,116,25,197,17,131,153,137,197,247,240,37,254,
-121,226,5,6,3,204,253,159,10,1,28,253,190,3,46,209,234,254,141,1,115,162,126,
-42,253,151,2,120,27,126,162,254,141,1,115,234,209,2,130,9,2,7,253,126,1,231,0,
-2,0,149,0,0,5,87,4,59,0,31,0,34,0,0,1,51,1,30,1,29,1,35,53,52,38,43,1,7,17,35,
-17,39,35,34,6,29,1,35,53,52,54,55,1,51,53,33,1,19,33,4,99,123,254,227,198,208,
-198,119,132,47,11,197,6,60,133,118,197,212,205,254,228,158,2,171,254,153,176,
-254,160,4,58,254,33,10,210,221,162,162,163,125,19,254,81,1,184,10,125,163,162,
-162,226,208,7,1,223,1,254,36,1,64,0,4,0,190,0,0,8,130,5,176,0,3,0,7,0,41,0,45,
-0,0,1,33,53,33,1,35,17,51,1,51,50,22,21,17,35,17,52,38,43,1,7,17,35,17,39,35,
-34,6,21,17,35,17,52,54,59,1,1,51,23,55,53,33,1,51,1,33,4,252,252,109,3,147,
-252,136,198,198,4,255,22,239,250,197,139,153,116,25,197,17,131,153,137,197,
-247,240,37,254,121,226,5,6,3,204,253,159,10,1,28,253,190,2,148,154,252,210,5,
-176,253,126,209,234,254,141,1,115,162,126,42,253,151,2,120,27,126,162,254,141,
-1,115,234,209,2,130,9,2,7,253,126,1,231,0,0,0,0,4,0,153,0,0,7,81,4,59,0,3,0,7,
-0,39,0,42,0,0,1,33,53,33,1,35,17,51,33,51,1,30,1,29,1,35,53,52,38,43,1,7,17,
-35,17,39,35,34,6,29,1,35,53,52,54,55,1,51,53,33,1,19,33,4,248,252,11,3,245,
-252,102,197,197,4,255,123,254,227,198,208,198,119,132,47,11,197,6,60,133,118,
-197,212,205,254,228,158,2,171,254,153,176,254,160,1,194,155,253,163,4,58,254,
-33,10,210,221,162,162,163,125,19,254,81,1,184,10,125,163,162,162,226,208,7,1,
-223,1,254,36,1,64,0,0,22,0,91,254,114,7,238,5,174,0,13,0,28,0,42,0,59,0,65,0,
-71,0,77,0,83,0,93,0,97,0,101,0,105,0,109,0,113,0,117,0,126,0,130,0,134,0,138,
-0,142,0,146,0,150,0,0,1,52,38,35,34,6,29,1,20,22,51,50,54,53,5,50,54,53,52,38,
-39,62,1,53,52,38,43,1,17,39,20,6,35,34,38,61,1,52,54,51,50,22,21,5,20,6,35,34,
-38,53,35,7,6,22,51,50,54,53,17,35,1,17,51,21,51,21,33,53,51,53,51,17,1,17,33,
-21,35,21,37,53,33,17,35,53,1,51,30,1,21,20,6,43,1,53,1,53,33,21,33,53,33,21,
-33,53,33,21,1,53,33,21,33,53,33,21,33,53,33,21,19,51,50,22,21,20,6,43,1,5,35,
-53,51,53,35,53,51,17,35,53,51,37,35,53,51,53,35,53,51,17,35,53,51,3,57,129,
-102,102,128,128,104,101,128,1,32,92,105,54,48,40,44,111,101,188,159,74,63,66,
-74,74,64,64,75,3,186,55,40,50,54,84,2,6,105,91,81,106,92,249,196,113,196,5,40,
-199,111,248,109,1,53,196,5,236,1,54,111,252,218,5,47,51,53,50,126,1,78,1,22,
-253,91,1,21,253,92,1,20,2,10,1,22,253,91,1,21,253,92,1,20,188,93,61,57,60,58,
-93,252,241,113,113,113,113,113,113,7,34,111,111,111,111,111,111,2,68,96,123,
-123,96,112,98,121,121,98,216,79,76,45,70,13,15,62,39,75,75,253,219,216,69,78,
-78,69,112,68,79,79,68,155,44,54,45,46,6,77,81,92,79,1,122,251,79,1,59,202,113,
-113,202,254,197,6,31,1,29,116,169,169,116,254,227,169,252,182,2,46,38,40,43,
-169,3,74,116,116,116,116,116,116,249,56,113,113,113,113,113,113,4,91,32,39,40,
-40,150,252,126,250,252,21,249,126,252,126,250,252,21,249,0,0,5,0,92,253,213,7,
-215,8,98,0,3,0,30,0,34,0,38,0,42,0,0,9,3,5,52,54,55,62,1,53,52,38,35,34,6,31,
-1,51,62,1,51,50,22,21,20,6,7,14,1,21,23,35,21,51,3,51,21,35,3,51,21,35,4,24,3,
-191,252,65,252,68,4,15,26,40,72,94,169,147,136,167,3,3,194,1,59,43,54,59,51,
-42,79,59,202,202,202,75,4,4,2,4,4,6,82,252,49,252,49,3,207,241,53,61,26,39,
-131,78,128,151,130,130,6,51,52,63,53,50,77,28,55,90,88,91,170,253,76,4,10,141,
-4,255,255,0,5,254,103,3,160,0,0,0,39,0,63,0,1,255,1,0,6,0,63,1,0,0,2,0,113,
-255,235,5,2,5,195,0,33,0,48,0,0,1,53,52,54,51,50,22,29,1,16,0,33,34,0,25,1,16,
-0,31,1,21,34,2,21,17,20,18,51,50,54,55,46,1,53,5,53,52,38,35,34,6,29,1,20,22,
-23,62,1,53,2,29,206,165,165,205,254,181,254,248,254,254,192,1,62,250,6,172,
-205,205,172,63,109,45,168,195,2,32,93,80,80,94,151,134,30,32,2,145,59,176,231,
-229,178,80,254,229,254,138,1,96,1,10,1,6,1,9,1,95,4,2,154,254,255,197,254,248,
-201,255,0,34,34,42,241,166,21,83,107,136,138,105,64,122,167,14,59,145,80,0,2,
-0,97,255,235,4,42,4,76,0,33,0,48,0,0,1,53,52,54,51,50,22,29,1,20,0,35,34,0,61,
-1,52,0,31,1,21,34,6,29,1,20,22,51,50,54,55,46,1,53,5,53,52,38,35,34,6,29,1,20,
-22,51,62,1,53,1,210,169,130,129,172,254,240,203,219,254,237,1,17,215,6,136,
-161,160,137,29,55,25,109,125,1,147,62,42,44,58,91,80,16,19,1,233,37,132,174,
-187,140,33,211,254,230,1,36,222,54,239,1,58,4,2,153,219,173,56,155,198,12,12,
-35,174,116,17,36,67,96,82,61,41,82,101,36,86,46,0,0,2,0,113,255,235,4,176,5,
-197,0,26,0,38,0,0,1,53,52,54,51,50,22,21,17,16,0,35,34,0,25,1,55,17,20,22,51,
-50,54,55,38,36,53,37,52,38,35,34,6,29,1,20,22,23,55,2,9,189,151,157,182,254,
-207,248,238,254,216,197,182,155,165,190,2,218,254,247,1,227,73,70,66,77,150,
-130,6,4,12,62,172,207,202,177,254,6,254,234,254,177,1,92,1,9,2,148,2,253,106,
-200,252,237,208,8,251,192,62,108,109,109,108,64,120,158,4,2,0,1,0,112,0,0,4,
-148,5,62,0,19,0,0,1,5,7,37,3,35,19,37,55,5,19,37,55,5,19,51,3,5,7,37,2,92,1,
-33,71,254,221,181,174,225,254,223,71,1,37,202,254,222,73,1,35,185,171,229,1,
-37,75,254,224,1,191,172,125,170,254,192,1,142,171,124,171,1,108,171,126,171,1,
-74,254,105,171,124,170,0,0,8,0,59,254,196,7,212,5,175,0,15,0,31,0,47,0,63,0,
-79,0,95,0,111,0,127,0,0,1,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21,1,39,38,
-54,51,50,22,15,1,35,52,38,35,34,6,21,19,39,38,54,51,50,22,15,1,35,52,38,35,34,
-6,21,1,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21,1,39,38,54,51,50,22,15,1,35,
-52,38,35,34,6,21,1,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21,1,39,38,54,51,
-50,22,15,1,35,52,38,35,34,6,21,19,39,38,54,51,50,22,15,1,35,52,38,35,34,6,21,
-3,47,2,5,112,97,96,113,4,2,104,49,50,50,47,1,230,2,5,113,96,96,114,4,2,105,48,
-51,50,46,81,2,5,113,96,96,113,4,2,104,48,51,50,47,254,210,2,5,113,96,96,113,4,
-2,104,48,51,50,47,253,87,2,5,112,97,96,113,4,2,104,49,50,50,47,253,85,2,5,113,
-97,96,113,4,2,104,49,50,50,47,254,230,2,5,113,96,96,113,4,2,104,48,51,50,47,
-61,2,5,113,96,96,114,4,2,105,48,51,50,46,4,243,6,79,103,103,79,6,43,58,58,43,
-254,235,6,78,104,103,79,6,44,57,58,43,254,9,6,78,104,103,79,6,44,57,58,43,253,
-249,6,78,104,103,79,6,44,57,58,43,254,228,6,80,102,102,80,6,44,57,57,44,5,26,
-6,79,103,103,79,6,43,58,58,43,254,9,6,78,104,103,79,6,44,57,58,43,253,249,6,
-78,104,103,79,6,44,57,58,43,0,0,0,8,0,77,254,99,7,141,5,198,0,4,0,9,0,14,0,19,
-0,25,0,30,0,35,0,40,0,0,5,23,3,35,19,3,39,19,51,3,1,55,5,21,37,5,7,37,53,5,1,
-55,37,23,6,5,1,7,5,39,37,3,39,3,55,19,1,23,19,7,3,4,80,11,122,96,70,58,12,122,
-96,70,2,30,13,1,77,254,166,251,116,13,254,179,1,90,3,156,2,1,65,68,37,254,255,
-252,243,2,254,192,69,1,38,43,17,148,65,198,3,96,17,149,66,197,60,14,254,173,1,
-97,4,162,14,1,82,254,160,254,17,12,124,98,71,59,12,124,98,71,1,174,16,153,68,
-23,177,252,142,17,153,69,200,2,228,2,1,70,69,254,213,252,227,2,254,187,71,1,
-43,0,0,1,0,122,2,139,2,250,5,186,0,19,0,0,1,23,62,1,51,50,22,21,17,35,17,52,
-38,35,34,6,7,17,35,17,1,2,31,36,110,70,122,135,180,71,65,53,72,19,180,5,171,
-120,64,71,151,156,254,4,1,219,102,91,54,47,253,201,3,32,0,2,0,152,255,236,4,
-147,4,78,0,21,0,30,0,0,37,14,1,35,34,0,53,52,0,51,50,0,29,1,33,17,30,1,51,50,
-54,55,1,34,6,7,17,33,17,46,1,4,22,87,188,95,218,254,206,1,67,201,207,1,32,253,
-0,55,141,77,95,186,87,254,144,74,141,58,2,28,54,139,94,55,59,1,73,232,226,1,
-79,254,202,231,47,254,184,53,57,60,62,3,42,65,57,254,235,1,30,52,61,0,0,2,0,
-105,4,111,2,206,5,197,0,5,0,11,0,0,1,19,51,21,3,35,5,51,53,55,35,7,1,150,102,
-210,229,83,254,211,189,81,108,162,4,140,1,57,21,254,193,2,137,204,198,0,0,4,0,
-124,255,235,5,131,5,197,0,29,0,43,0,57,0,61,0,0,1,23,22,6,35,34,38,61,1,52,54,
-51,50,22,15,1,35,52,38,35,34,6,29,1,20,22,51,50,54,53,1,20,22,51,50,54,61,1,
-52,38,35,34,6,21,51,52,54,51,50,22,29,1,20,6,35,34,38,53,19,39,1,23,2,165,2,4,
-150,126,129,154,153,128,126,152,4,2,138,70,64,65,70,71,66,63,69,1,14,165,138,
-135,164,165,136,137,164,146,81,74,73,82,80,73,76,81,203,109,253,57,109,4,32,6,
-105,145,172,127,77,127,174,148,103,6,57,78,105,74,77,74,103,80,54,252,247,128,
-172,172,128,78,127,173,173,127,74,104,104,74,78,75,103,103,75,3,201,67,251,
-142,67,0,0,0,255,255,0,169,0,0,8,78,5,193,0,34,0,46,0,0,0,35,0,119,5,35,255,
-252,0,3,0,13,5,32,255,21,0,2,0,106,255,237,3,115,5,197,0,27,0,40,0,0,5,7,6,38,
-61,1,14,1,35,53,50,54,55,17,52,54,51,50,22,29,1,20,2,7,21,20,22,51,3,53,52,38,
-35,34,6,21,17,23,62,1,53,2,206,6,199,205,49,101,52,55,101,46,159,139,122,155,
-203,175,96,117,32,44,36,51,50,6,85,90,13,2,4,239,211,12,12,12,180,13,13,1,217,
-177,202,172,144,42,158,254,174,100,92,145,146,3,209,44,76,78,109,108,254,155,
-1,64,204,109,0,0,0,3,0,164,255,235,6,17,5,176,0,10,0,19,0,43,0,0,1,17,35,17,
-33,50,4,21,20,4,35,39,51,50,54,53,52,38,43,1,37,17,51,21,35,17,20,22,51,50,54,
-55,23,14,1,35,34,38,53,17,35,53,51,17,1,105,197,1,98,232,1,4,254,252,232,157,
-157,147,147,147,147,157,3,208,205,205,63,52,17,41,16,27,23,86,42,119,143,171,
-171,2,52,253,204,5,176,249,197,199,247,155,167,122,123,170,42,254,251,146,253,
-111,76,62,8,6,135,18,23,145,155,2,145,146,1,5,0,2,0,98,255,235,4,126,6,24,0,
-25,0,39,0,0,1,35,17,35,39,14,1,35,34,2,61,1,16,18,51,50,22,23,53,33,53,33,17,
-51,17,51,1,20,22,51,50,54,55,17,46,1,35,34,6,21,4,126,137,151,30,53,156,103,
-198,224,223,201,95,147,52,255,0,1,0,197,137,252,169,134,141,88,120,38,38,121,
-85,142,135,4,112,251,144,137,78,80,1,31,234,21,1,5,1,64,70,67,171,154,1,14,
-254,242,252,234,164,197,80,72,1,249,67,79,234,187,255,255,0,161,0,0,3,33,0,
-202,0,38,0,14,0,0,0,7,0,14,1,187,0,0,255,255,0,129,4,164,2,216,5,176,2,6,0,
-154,0,0,255,255,127,255,127,255,128,1,128,1,2,6,0,3,0,0,0,2,0,34,0,0,4,235,5,
-176,0,13,0,27,0,0,51,17,35,53,51,17,33,32,0,17,21,16,0,33,19,33,17,33,50,18,
-61,1,52,2,35,33,17,33,169,135,135,1,202,1,29,1,91,254,165,254,227,117,254,134,
-1,5,202,233,233,202,254,251,1,122,2,151,155,2,126,254,161,254,234,199,254,233,
-254,163,2,151,254,3,1,10,208,201,206,1,10,254,29,0,0,0,0,2,0,34,0,0,4,235,5,
-176,0,13,0,27,0,0,51,17,35,53,51,17,33,32,0,17,21,16,0,33,19,33,17,33,50,18,
-61,1,52,2,35,33,17,33,169,135,135,1,202,1,29,1,91,254,165,254,227,117,254,134,
-1,5,202,233,233,202,254,251,1,122,2,151,155,2,126,254,161,254,234,199,254,233,
-254,163,2,151,254,3,1,10,208,201,206,1,10,254,29,0,0,0,0,1,0,18,0,0,4,0,6,24,
-0,27,0,0,1,33,17,62,1,51,50,22,21,17,35,17,52,38,35,34,6,7,17,35,17,35,53,51,
-53,51,21,33,2,216,254,124,56,163,99,173,193,197,115,114,88,130,40,197,125,125,
-197,1,132,4,207,254,218,78,87,208,216,253,90,2,168,134,128,69,62,252,213,4,
-207,155,174,174,0,0,0,1,0,37,0,0,4,164,5,176,0,15,0,0,1,33,17,35,17,35,53,51,
-53,33,53,33,21,33,21,33,3,199,254,253,197,254,254,254,38,4,127,254,32,1,3,3,
-156,252,100,3,156,155,222,155,155,222,255,255,0,167,2,26,2,245,2,180,2,6,0,13,
-0,0,255,255,0,43,0,0,4,227,7,75,2,38,0,33,0,0,0,7,0,64,0,241,1,93,255,255,0,
-43,0,0,4,227,7,71,2,38,0,33,0,0,0,7,0,113,1,171,1,89,255,255,0,43,0,0,4,227,7,
-72,2,38,0,33,0,0,0,7,0,152,0,171,1,93,255,255,0,43,0,0,4,227,7,84,2,38,0,33,0,
-0,0,7,0,158,0,166,1,97,255,255,0,43,0,0,4,227,7,13,2,38,0,33,0,0,0,7,0,102,0,
-134,1,93,255,255,0,43,0,0,4,227,7,113,2,38,0,33,0,0,0,7,0,156,1,50,1,172,255,
-255,0,43,0,0,4,227,7,113,2,38,0,33,0,0,0,39,0,156,1,50,1,172,0,7,0,113,1,171,
-1,89,255,255,0,118,254,68,4,191,5,197,2,38,0,35,0,0,0,7,0,117,1,206,255,247,
-255,255,0,163,0,0,4,36,7,75,2,38,0,37,0,0,0,7,0,64,0,205,1,93,255,255,0,163,0,
-0,4,36,7,71,2,38,0,37,0,0,0,7,0,113,1,135,1,89,255,255,0,163,0,0,4,36,7,72,2,
-38,0,37,0,0,0,7,0,152,0,135,1,93,255,255,0,163,0,0,4,36,7,13,2,38,0,37,0,0,0,
-7,0,102,0,98,1,93,255,255,255,221,0,0,1,132,7,75,2,38,0,41,0,0,0,7,0,64,255,
-139,1,93,255,255,0,190,0,0,2,104,7,71,2,38,0,41,0,0,0,7,0,113,0,68,1,89,255,
-255,255,179,0,0,2,146,7,72,2,38,0,41,0,0,0,7,0,152,255,69,1,93,255,255,255,
-192,0,0,2,133,7,13,2,38,0,41,0,0,0,7,0,102,255,32,1,93,255,255,0,169,0,0,4,
-246,7,84,2,38,0,46,0,0,0,7,0,158,0,236,1,97,255,255,0,113,255,235,5,2,7,96,2,
-38,0,47,0,0,0,7,0,64,1,36,1,114,255,255,0,113,255,235,5,2,7,92,2,38,0,47,0,0,
-0,7,0,113,1,222,1,110,255,255,0,113,255,235,5,2,7,93,2,38,0,47,0,0,0,7,0,152,
-0,222,1,114,255,255,0,113,255,235,5,2,7,105,2,38,0,47,0,0,0,7,0,158,0,217,1,
-118,255,255,0,113,255,235,5,2,7,34,2,38,0,47,0,0,0,7,0,102,0,185,1,114,255,
-255,0,147,255,235,4,220,7,75,2,38,0,53,0,0,0,7,0,64,1,34,1,93,255,255,0,147,
-255,235,4,220,7,71,2,38,0,53,0,0,0,7,0,113,1,220,1,89,255,255,0,147,255,235,4,
-220,7,72,2,38,0,53,0,0,0,7,0,152,0,220,1,93,255,255,0,147,255,235,4,220,7,13,
-2,38,0,53,0,0,0,7,0,102,0,183,1,93,255,255,0,40,0,0,4,226,7,70,2,38,0,57,0,0,
-0,7,0,113,1,169,1,88,255,255,0,106,255,235,3,243,6,9,2,38,0,65,0,0,0,7,0,64,0,
-148,0,27,255,255,0,106,255,235,3,243,6,5,2,38,0,65,0,0,0,7,0,113,1,78,0,23,
-255,255,0,106,255,235,3,243,6,6,2,38,0,65,0,0,0,6,0,152,78,27,0,0,255,255,0,
-106,255,235,3,243,6,18,2,38,0,65,0,0,0,6,0,158,73,31,0,0,255,255,0,106,255,
-235,3,243,5,203,2,38,0,65,0,0,0,6,0,102,41,27,0,0,255,255,0,106,255,235,3,243,
-6,47,2,38,0,65,0,0,0,7,0,156,0,213,0,106,255,255,0,106,255,235,3,243,6,47,2,
-38,0,65,0,0,0,39,0,156,0,213,0,106,0,7,0,113,1,78,0,23,255,255,0,97,254,68,3,
-217,4,78,2,38,0,67,0,0,0,7,0,117,1,75,255,247,255,255,0,97,255,235,3,226,6,10,
-2,38,0,69,0,0,0,7,0,64,0,150,0,28,255,255,0,97,255,235,3,226,6,6,2,38,0,69,0,
-0,0,7,0,113,1,80,0,24,255,255,0,97,255,235,3,226,6,7,2,38,0,69,0,0,0,6,0,152,
-80,28,0,0,255,255,0,97,255,235,3,226,5,204,2,38,0,69,0,0,0,6,0,102,43,28,0,0,
-255,255,255,184,0,0,1,94,5,244,2,38,0,136,0,0,0,7,0,64,255,102,0,6,255,255,0,
-153,0,0,2,67,5,240,2,38,0,136,0,0,0,6,0,113,31,2,0,0,255,255,255,142,0,0,2,
-109,5,241,2,38,0,136,0,0,0,7,0,152,255,32,0,6,255,255,255,155,0,0,2,96,5,182,
-2,38,0,136,0,0,0,7,0,102,254,251,0,6,255,255,0,143,0,0,3,253,6,18,2,38,0,78,0,
-0,0,6,0,158,96,31,0,0,255,255,0,97,255,235,4,42,6,9,2,38,0,79,0,0,0,7,0,64,0,
-175,0,27,255,255,0,97,255,235,4,42,6,5,2,38,0,79,0,0,0,7,0,113,1,105,0,23,255,
-255,0,97,255,235,4,42,6,6,2,38,0,79,0,0,0,6,0,152,105,27,0,0,255,255,0,97,255,
-235,4,42,6,18,2,38,0,79,0,0,0,6,0,158,100,31,0,0,255,255,0,97,255,235,4,42,5,
-203,2,38,0,79,0,0,0,6,0,102,68,27,0,0,255,255,0,139,255,235,3,252,5,244,2,38,
-0,85,0,0,0,7,0,64,0,173,0,6,255,255,0,139,255,235,3,252,5,240,2,38,0,85,0,0,0,
-7,0,113,1,103,0,2,255,255,0,139,255,235,3,252,5,241,2,38,0,85,0,0,0,6,0,152,
-103,6,0,0,255,255,0,139,255,235,3,252,5,182,2,38,0,85,0,0,0,6,0,102,66,6,0,0,
-255,255,0,26,254,75,3,232,5,240,2,38,0,89,0,0,0,7,0,113,1,37,0,2,255,255,0,26,
-254,75,3,232,5,182,2,38,0,89,0,0,0,6,0,102,0,6,0,0,255,255,0,43,0,0,4,227,6,
-250,2,38,0,33,0,0,0,7,0,108,0,170,1,74,255,255,0,106,255,235,3,243,5,184,2,38,
-0,65,0,0,0,6,0,108,77,8,0,0,255,255,0,43,0,0,4,227,7,78,2,38,0,33,0,0,0,7,0,
-154,0,220,1,158,255,255,0,106,255,235,3,243,6,12,2,38,0,65,0,0,0,6,0,154,127,
-92,0,0,255,255,0,43,254,98,5,39,5,176,2,38,0,33,0,0,0,7,0,157,3,71,0,0,255,
-255,0,106,254,98,4,57,4,78,2,38,0,65,0,0,0,7,0,157,2,89,0,0,255,255,0,118,255,
-235,4,191,7,92,2,38,0,35,0,0,0,7,0,113,1,201,1,110,255,255,0,97,255,235,3,217,
-6,5,2,38,0,67,0,0,0,7,0,113,1,70,0,23,255,255,0,118,255,235,4,191,7,93,2,38,0,
-35,0,0,0,7,0,152,0,201,1,114,255,255,0,97,255,235,3,217,6,6,2,38,0,67,0,0,0,6,
-0,152,70,27,0,0,255,255,0,118,255,235,4,191,7,34,2,38,0,35,0,0,0,7,0,155,1,
-153,1,114,255,255,0,97,255,235,3,217,5,203,2,38,0,67,0,0,0,7,0,155,1,22,0,27,
-255,255,0,118,255,235,4,191,7,94,2,38,0,35,0,0,0,7,0,153,0,224,1,115,255,255,
-0,97,255,235,3,217,6,7,2,38,0,67,0,0,0,6,0,153,93,28,0,0,255,255,0,169,0,0,4,
-235,7,73,2,38,0,36,0,0,0,7,0,153,0,156,1,94,255,255,0,98,255,235,3,245,6,24,2,
-6,0,68,0,0,255,255,0,163,0,0,4,36,6,250,2,38,0,37,0,0,0,7,0,108,0,134,1,74,
-255,255,0,97,255,235,3,226,5,185,2,38,0,69,0,0,0,6,0,108,79,9,0,0,255,255,0,
-163,0,0,4,36,7,78,2,38,0,37,0,0,0,7,0,154,0,184,1,158,255,255,0,97,255,235,3,
-226,6,13,2,38,0,69,0,0,0,7,0,154,0,129,0,93,255,255,0,163,0,0,4,36,7,13,2,38,
-0,37,0,0,0,7,0,155,1,87,1,93,255,255,0,97,255,235,3,226,5,204,2,38,0,69,0,0,0,
-7,0,155,1,32,0,28,255,255,0,163,254,98,4,36,5,176,2,38,0,37,0,0,0,7,0,157,1,
-56,0,0,255,255,0,97,254,98,3,226,4,78,2,38,0,69,0,0,0,7,0,157,1,31,0,0,255,
-255,0,163,0,0,4,36,7,73,2,38,0,37,0,0,0,7,0,153,0,158,1,94,255,255,0,97,255,
-235,3,226,6,8,2,38,0,69,0,0,0,6,0,153,103,29,0,0,255,255,0,121,255,235,4,193,
-7,93,2,38,0,39,0,0,0,7,0,152,0,192,1,114,255,255,0,108,254,75,4,0,6,6,2,38,0,
-71,0,0,0,6,0,152,90,27,0,0,255,255,0,121,255,235,4,193,7,99,2,38,0,39,0,0,0,7,
-0,154,0,241,1,179,255,255,0,108,254,75,4,0,6,12,2,38,0,71,0,0,0,7,0,154,0,139,
-0,92,255,255,0,121,255,235,4,193,7,34,2,38,0,39,0,0,0,7,0,155,1,144,1,114,255,
-255,0,108,254,75,4,0,5,203,2,38,0,71,0,0,0,7,0,155,1,42,0,27,255,255,0,121,
-253,207,4,193,5,197,2,38,0,39,0,0,0,7,1,110,1,157,254,162,255,255,0,108,254,
-75,4,0,6,112,2,38,0,71,0,0,0,7,1,169,1,46,0,89,255,255,0,169,0,0,4,246,7,72,2,
-38,0,40,0,0,0,7,0,152,0,234,1,93,255,255,255,127,0,0,4,0,7,71,2,38,0,72,0,0,0,
-7,0,152,255,17,1,92,255,255,255,199,0,0,2,125,7,84,2,38,0,41,0,0,0,7,0,158,
-255,64,1,97,255,255,255,162,0,0,2,88,5,253,2,38,0,136,0,0,0,7,0,158,255,27,0,
-10,255,255,255,171,0,0,2,154,6,250,2,38,0,41,0,0,0,7,0,108,255,68,1,74,255,
-255,255,134,0,0,2,117,5,164,2,38,0,136,0,0,0,7,0,108,255,31,255,244,255,255,
-255,247,0,0,2,78,7,78,2,38,0,41,0,0,0,7,0,154,255,118,1,158,255,255,255,210,0,
-0,2,41,5,247,2,38,0,136,0,0,0,7,0,154,255,81,0,71,255,255,0,57,254,98,2,7,5,
-176,2,38,0,41,0,0,0,6,0,157,39,0,0,0,255,255,0,27,254,98,1,233,6,24,2,38,0,73,
-0,0,0,6,0,157,9,0,0,0,255,255,0,180,0,0,1,142,7,13,2,38,0,41,0,0,0,7,0,155,0,
-20,1,93,255,255,0,190,255,235,5,253,5,176,0,38,0,41,0,0,0,7,0,42,2,65,0,0,255,
-255,0,159,254,75,3,118,6,24,0,38,0,73,0,0,0,7,0,74,2,4,0,0,255,255,0,74,255,
-235,4,193,7,60,2,38,0,42,0,0,0,7,0,152,1,116,1,81,255,255,255,160,254,75,2,
-127,5,222,2,38,0,151,0,0,0,7,0,152,255,50,255,243,255,255,0,163,253,224,4,251,
-5,176,2,38,0,43,0,0,0,7,1,110,1,106,254,179,255,255,0,144,253,226,4,11,6,24,2,
-38,0,75,0,0,0,7,1,110,1,23,254,181,255,255,0,168,0,0,4,51,7,8,2,38,0,44,0,0,0,
-7,0,113,0,43,1,26,255,255,0,159,0,0,2,73,7,83,2,38,0,76,0,0,0,7,0,113,0,37,1,
-101,255,255,0,168,253,226,4,51,5,176,2,38,0,44,0,0,0,7,1,110,1,104,254,181,
-255,255,0,121,253,226,1,104,6,24,2,38,0,76,0,0,0,7,1,110,0,1,254,181,255,255,
-0,168,0,0,4,51,5,176,2,6,0,44,0,0,255,255,0,159,0,0,1,100,6,24,2,6,0,76,0,0,
-255,255,0,156,0,0,4,51,6,206,2,38,0,44,0,0,0,7,0,155,255,252,1,30,255,255,0,
-150,0,0,1,112,7,25,2,38,0,76,0,0,0,7,0,155,255,246,1,105,255,255,0,169,0,0,4,
-246,7,71,2,38,0,46,0,0,0,7,0,113,1,241,1,89,255,255,0,143,0,0,3,253,6,5,2,38,
-0,78,0,0,0,7,0,113,1,101,0,23,255,255,0,169,253,226,4,246,5,176,2,38,0,46,0,0,
-0,7,1,110,1,205,254,181,255,255,0,143,253,226,3,253,4,78,2,38,0,78,0,0,0,7,1,
-110,1,65,254,181,255,255,0,169,0,0,4,246,7,73,2,38,0,46,0,0,0,7,0,153,1,8,1,
-94,255,255,0,143,0,0,3,253,6,7,2,38,0,78,0,0,0,6,0,153,124,28,0,0,255,255,0,
-143,0,0,4,223,5,179,2,38,0,78,0,0,0,7,1,110,3,120,4,192,255,255,0,113,255,235,
-5,2,7,15,2,38,0,47,0,0,0,7,0,108,0,221,1,95,255,255,0,97,255,235,4,42,5,184,2,
-38,0,79,0,0,0,6,0,108,104,8,0,0,255,255,0,113,255,235,5,2,7,99,2,38,0,47,0,0,
-0,7,0,154,1,15,1,179,255,255,0,97,255,235,4,42,6,12,2,38,0,79,0,0,0,7,0,154,0,
-154,0,92,255,255,0,113,255,235,5,2,7,96,2,38,0,47,0,0,0,7,0,159,1,107,1,114,
-255,255,0,97,255,235,4,64,6,9,2,38,0,79,0,0,0,7,0,159,0,246,0,27,255,255,0,
-165,0,0,4,213,7,71,2,38,0,50,0,0,0,7,0,113,1,129,1,89,255,255,0,143,0,0,2,228,
-6,5,2,38,0,82,0,0,0,7,0,113,0,192,0,23,255,255,0,165,253,226,4,213,5,175,2,38,
-0,50,0,0,0,7,1,110,1,93,254,181,255,255,0,119,253,226,2,170,4,78,2,38,0,82,0,
-0,0,7,1,110,255,255,254,181,255,255,0,165,0,0,4,213,7,73,2,38,0,50,0,0,0,7,0,
-153,0,152,1,94,255,255,0,45,0,0,3,14,6,7,2,38,0,82,0,0,0,6,0,153,216,28,0,0,
-255,255,0,121,255,235,4,131,7,92,2,38,0,51,0,0,0,7,0,113,1,161,1,110,255,255,
-0,103,255,235,3,201,6,5,2,38,0,83,0,0,0,7,0,113,1,58,0,23,255,255,0,121,255,
-235,4,131,7,93,2,38,0,51,0,0,0,7,0,152,0,161,1,114,255,255,0,103,255,235,3,
-201,6,6,2,38,0,83,0,0,0,6,0,152,58,27,0,0,255,255,0,121,254,68,4,131,5,197,2,
-38,0,51,0,0,0,7,0,117,1,166,255,247,255,255,0,103,254,69,3,201,4,78,2,38,0,83,
-0,0,0,7,0,117,1,63,255,248,255,255,0,121,255,235,4,131,7,94,2,38,0,51,0,0,0,7,
-0,153,0,184,1,115,255,255,0,103,255,235,3,201,6,7,2,38,0,83,0,0,0,6,0,153,81,
-28,0,0,255,255,0,37,253,226,4,164,5,176,2,38,0,52,0,0,0,7,1,110,1,100,254,181,
-255,255,0,26,253,216,2,98,5,63,2,38,0,84,0,0,0,7,1,110,0,191,254,171,255,255,
-0,37,0,0,4,164,7,72,2,38,0,52,0,0,0,7,0,153,0,159,1,93,255,255,0,26,255,235,2,
-98,5,63,2,6,0,84,0,0,255,255,0,147,255,235,4,220,7,84,2,38,0,53,0,0,0,7,0,158,
-0,215,1,97,255,255,0,139,255,235,3,252,5,253,2,38,0,85,0,0,0,6,0,158,98,10,0,
-0,255,255,0,147,255,235,4,220,6,250,2,38,0,53,0,0,0,7,0,108,0,219,1,74,255,
-255,0,139,255,235,3,252,5,164,2,38,0,85,0,0,0,6,0,108,102,244,0,0,255,255,0,
-147,255,235,4,220,7,78,2,38,0,53,0,0,0,7,0,154,1,13,1,158,255,255,0,139,255,
-235,3,252,5,247,2,38,0,85,0,0,0,7,0,154,0,152,0,71,255,255,0,147,255,235,4,
-220,7,113,2,38,0,53,0,0,0,7,0,156,1,99,1,172,255,255,0,139,255,235,3,252,6,26,
-2,38,0,85,0,0,0,7,0,156,0,238,0,85,255,255,0,147,255,235,4,220,7,75,2,38,0,53,
-0,0,0,7,0,159,1,105,1,93,255,255,0,139,255,235,4,62,5,244,2,38,0,85,0,0,0,7,0,
-159,0,244,0,6,255,255,0,147,254,98,4,220,5,176,2,38,0,53,0,0,0,7,0,157,1,188,
-0,0,255,255,0,139,254,98,4,65,4,58,2,38,0,85,0,0,0,7,0,157,2,97,0,0,255,255,0,
-37,0,0,6,191,7,72,2,38,0,55,0,0,0,7,0,152,1,148,1,93,255,255,0,45,0,0,5,220,5,
-241,2,38,0,87,0,0,0,7,0,152,1,40,0,6,255,255,0,40,0,0,4,226,7,71,2,38,0,57,0,
-0,0,7,0,152,0,169,1,92,255,255,0,26,254,75,3,232,5,241,2,38,0,89,0,0,0,6,0,
-152,37,6,0,0,255,255,0,40,0,0,4,226,7,12,2,38,0,57,0,0,0,7,0,102,0,132,1,92,
-255,255,0,97,0,0,4,109,7,71,2,38,0,58,0,0,0,7,0,113,1,132,1,89,255,255,0,94,0,
-0,3,186,5,240,2,38,0,90,0,0,0,7,0,113,1,47,0,2,255,255,0,97,0,0,4,109,7,13,2,
-38,0,58,0,0,0,7,0,155,1,84,1,93,255,255,0,94,0,0,3,186,5,182,2,38,0,90,0,0,0,
-7,0,155,0,255,0,6,255,255,0,97,0,0,4,109,7,73,2,38,0,58,0,0,0,7,0,153,0,155,1,
-94,255,255,0,94,0,0,3,186,5,242,2,38,0,90,0,0,0,6,0,153,70,7,0,0,255,255,0,14,
-0,0,7,132,7,71,2,38,0,125,0,0,0,7,0,113,2,238,1,89,255,255,0,88,255,235,6,154,
-6,6,2,38,0,130,0,0,0,7,0,113,2,156,0,24,255,255,0,108,255,162,4,253,7,133,2,
-38,0,127,0,0,0,7,0,113,1,216,1,151,255,255,0,97,255,121,4,42,6,111,2,38,0,133,
-0,0,0,7,0,113,1,105,0,129,255,255,0,121,253,206,4,131,5,197,2,38,0,51,0,0,0,7,
-1,110,1,125,254,161,255,255,0,103,253,207,3,201,4,78,2,38,0,83,0,0,0,7,1,110,
-1,22,254,162,255,255,0,43,0,0,4,227,7,72,2,38,0,33,0,0,0,7,0,165,1,140,1,76,
-255,255,0,163,0,0,4,36,7,72,2,38,0,37,0,0,0,7,0,165,1,104,1,76,255,255,0,169,
-0,0,4,246,7,72,2,38,0,40,0,0,0,7,0,165,1,203,1,76,255,255,0,185,0,0,1,137,7,
-72,2,38,0,41,0,0,0,7,0,165,0,37,1,76,255,255,0,113,255,235,5,2,7,93,2,38,0,47,
-0,0,0,7,0,165,1,191,1,97,255,255,0,40,0,0,4,226,7,71,2,38,0,57,0,0,0,7,0,165,
-1,138,1,75,255,255,0,112,0,0,4,208,7,114,2,38,0,177,0,0,0,7,0,165,255,221,1,
-118,255,255,255,204,255,235,2,144,6,92,2,38,0,186,0,0,0,7,0,166,255,43,255,
-183,255,255,0,43,0,0,4,227,5,176,2,6,0,33,0,0,255,255,0,163,0,0,4,198,5,176,2,
-6,0,34,0,0,255,255,0,163,0,0,4,36,5,176,2,6,0,37,0,0,255,255,0,97,0,0,4,109,5,
-176,2,6,0,58,0,0,255,255,0,169,0,0,4,246,5,176,2,6,0,40,0,0,255,255,0,190,0,0,
-1,132,5,176,2,6,0,41,0,0,255,255,0,163,0,0,4,251,5,176,2,6,0,43,0,0,255,255,0,
-163,0,0,6,65,5,176,2,6,0,45,0,0,255,255,0,169,0,0,4,246,5,176,2,6,0,46,0,0,
-255,255,0,113,255,235,5,2,5,197,2,6,0,47,0,0,255,255,0,163,0,0,4,188,5,176,2,
-6,0,48,0,0,255,255,0,37,0,0,4,164,5,176,2,6,0,52,0,0,255,255,0,40,0,0,4,226,5,
-176,2,6,0,57,0,0,255,255,0,66,0,0,4,214,5,176,2,6,0,56,0,0,255,255,255,192,0,
-0,2,133,7,13,2,38,0,41,0,0,0,7,0,102,255,32,1,93,255,255,0,40,0,0,4,226,7,12,
-2,38,0,57,0,0,0,7,0,102,0,132,1,92,255,255,0,98,255,235,4,128,6,6,2,38,0,178,
-0,0,0,7,0,165,1,117,0,10,255,255,0,98,255,237,3,233,6,5,2,38,0,182,0,0,0,7,0,
-165,1,43,0,9,255,255,0,143,254,97,3,245,6,6,2,38,0,184,0,0,0,7,0,165,1,70,0,
-10,255,255,0,197,255,235,2,115,5,242,2,38,0,186,0,0,0,6,0,165,50,246,0,0,255,
-255,0,141,255,235,4,38,6,92,2,38,0,194,0,0,0,6,0,166,84,183,0,0,255,255,0,153,
-0,0,4,64,4,58,2,6,0,137,0,0,255,255,0,97,255,235,4,42,4,78,2,6,0,79,0,0,255,
-255,0,153,254,96,3,242,4,58,2,6,0,114,0,0,255,255,0,46,0,0,3,228,4,58,2,6,0,
-86,0,0,255,255,255,205,255,235,2,146,5,182,2,38,0,186,0,0,0,7,0,102,255,45,0,
-6,255,255,0,141,255,235,4,38,5,182,2,38,0,194,0,0,0,6,0,102,86,6,0,0,255,255,
-0,97,255,235,4,42,6,6,2,38,0,79,0,0,0,7,0,165,1,74,0,10,255,255,0,141,255,235,
-4,38,5,242,2,38,0,194,0,0,0,7,0,165,1,92,255,246,255,255,0,108,255,235,6,96,5,
-242,2,38,0,197,0,0,0,7,0,165,2,106,255,246,255,255,0,163,0,0,4,36,7,13,2,38,0,
-37,0,0,0,7,0,102,0,98,1,93,255,255,0,163,0,0,4,32,7,71,2,38,0,168,0,0,0,7,0,
-113,1,133,1,89,0,1,0,121,255,235,4,131,5,197,0,39,0,0,1,52,38,39,46,1,53,52,
-36,51,50,0,15,1,35,52,38,35,34,6,21,20,22,23,30,1,21,20,4,35,34,36,63,1,51,20,
-22,51,50,54,3,190,144,185,220,243,1,4,212,230,1,17,4,3,188,173,135,137,138,
-155,179,225,233,254,233,221,211,254,189,5,2,188,208,131,138,165,1,130,95,118,
-48,54,214,163,172,227,254,251,174,6,124,162,133,108,96,127,47,59,204,160,178,
-231,236,198,6,137,149,143,0,0,255,255,0,190,0,0,1,132,5,176,2,6,0,41,0,0,255,
-255,255,192,0,0,2,133,7,13,2,38,0,41,0,0,0,7,0,102,255,32,1,93,255,255,0,74,
-255,235,3,188,5,176,2,6,0,42,0,0,255,255,0,131,4,228,2,36,5,238,2,6,0,113,0,0,
-255,255,0,66,255,235,4,200,7,78,2,38,0,210,0,0,0,7,0,154,0,218,1,158,255,255,
-0,163,0,0,4,251,5,176,2,6,0,43,0,0,255,255,0,43,0,0,4,227,5,176,2,6,0,33,0,0,
-255,255,0,163,0,0,4,198,5,176,2,6,0,34,0,0,255,255,0,163,0,0,4,32,5,176,2,6,0,
-168,0,0,255,255,0,163,0,0,4,36,5,176,2,6,0,37,0,0,255,255,0,173,0,0,4,250,7,
-78,2,38,0,208,0,0,0,7,0,154,1,42,1,158,255,255,0,163,0,0,6,65,5,176,2,6,0,45,
-0,0,255,255,0,169,0,0,4,246,5,176,2,6,0,40,0,0,255,255,0,113,255,235,5,2,5,
-197,2,6,0,47,0,0,255,255,0,168,0,0,4,247,5,176,2,6,0,173,0,0,255,255,0,163,0,
-0,4,188,5,176,2,6,0,48,0,0,255,255,0,118,255,235,4,191,5,197,2,6,0,35,0,0,255,
-255,0,37,0,0,4,164,5,176,2,6,0,52,0,0,255,255,0,84,0,0,5,77,5,176,2,6,0,175,0,
-0,255,255,0,66,0,0,4,214,5,176,2,6,0,56,0,0,255,255,0,106,255,235,3,243,4,78,
-2,6,0,65,0,0,255,255,0,97,255,235,3,226,4,78,2,6,0,69,0,0,255,255,0,143,0,0,3,
-252,5,247,2,38,0,227,0,0,0,7,0,154,0,153,0,71,255,255,0,97,255,235,4,42,4,78,
-2,6,0,79,0,0,255,255,0,143,254,96,4,41,4,78,2,6,0,80,0,0,0,1,0,97,255,235,3,
-217,4,78,0,29,0,0,37,50,54,53,51,23,22,6,35,34,2,61,1,52,18,51,50,22,15,1,35,
-52,38,35,34,6,29,1,20,22,2,61,91,136,178,3,4,248,164,228,248,249,227,181,231,
-4,2,179,129,98,145,133,131,133,121,88,6,140,217,1,54,231,42,229,1,55,224,163,
-6,99,139,225,160,42,163,224,0,0,255,255,0,26,254,75,3,232,4,58,2,6,0,89,0,0,
-255,255,0,46,0,0,3,212,4,58,2,6,0,88,0,0,255,255,0,97,255,235,3,226,5,204,2,
-38,0,69,0,0,0,6,0,102,43,28,0,0,255,255,0,143,0,0,2,237,5,240,2,38,0,223,0,0,
-0,7,0,113,0,201,0,2,255,255,0,103,255,235,3,201,4,78,2,6,0,83,0,0,255,255,0,
-159,0,0,1,100,6,24,2,6,0,73,0,0,255,255,255,155,0,0,2,96,5,182,2,38,0,136,0,0,
-0,7,0,102,254,251,0,6,255,255,255,190,254,75,1,114,6,24,2,6,0,74,0,0,255,255,
-0,153,0,0,4,64,5,239,2,38,0,228,0,0,0,7,0,113,1,62,0,1,255,255,0,26,254,75,3,
-232,5,247,2,38,0,89,0,0,0,6,0,154,86,71,0,0,255,255,0,37,0,0,6,191,7,75,2,38,
-0,55,0,0,0,7,0,64,1,218,1,93,255,255,0,45,0,0,5,220,5,244,2,38,0,87,0,0,0,7,0,
-64,1,110,0,6,255,255,0,37,0,0,6,191,7,71,2,38,0,55,0,0,0,7,0,113,2,148,1,89,
-255,255,0,45,0,0,5,220,5,240,2,38,0,87,0,0,0,7,0,113,2,40,0,2,255,255,0,37,0,
-0,6,191,7,13,2,38,0,55,0,0,0,7,0,102,1,111,1,93,255,255,0,45,0,0,5,220,5,182,
-2,38,0,87,0,0,0,7,0,102,1,3,0,6,255,255,0,40,0,0,4,226,7,74,2,38,0,57,0,0,0,7,
-0,64,0,239,1,92,255,255,0,26,254,75,3,232,5,244,2,38,0,89,0,0,0,6,0,64,107,6,
-0,0,255,255,0,126,3,183,1,68,5,176,2,6,0,7,0,0,255,255,0,126,3,168,2,121,5,
-176,2,6,3,177,0,0,255,255,0,171,0,0,3,140,5,176,0,38,3,176,0,0,0,7,3,176,2,27,
-0,0,255,255,0,28,0,0,3,212,6,45,0,38,0,70,0,0,0,7,0,73,2,112,0,0,255,255,0,28,
-0,0,3,212,6,45,0,38,0,70,0,0,0,7,0,76,2,112,0,0,255,255,255,158,254,75,2,127,
-5,223,2,38,0,151,0,0,0,7,0,153,255,73,255,244,255,255,0,160,3,149,1,102,5,176,
-2,6,1,8,0,0,255,255,0,163,0,0,6,65,7,71,2,38,0,45,0,0,0,7,0,113,2,150,1,89,
-255,255,0,143,0,0,6,111,6,5,2,38,0,77,0,0,0,7,0,113,2,183,0,23,255,255,0,43,0,
-0,4,227,7,113,2,38,0,33,0,0,0,7,0,156,1,50,1,172,255,255,0,106,255,235,3,243,
-6,47,2,38,0,65,0,0,0,7,0,156,0,213,0,106,255,255,0,113,255,235,5,2,7,59,2,38,
-0,47,0,0,0,7,1,204,0,8,1,118,255,255,0,28,0,0,6,68,6,45,0,38,0,70,0,0,0,39,0,
-70,2,112,0,0,0,7,0,73,4,224,0,0,255,255,0,28,0,0,6,68,6,45,0,38,0,70,0,0,0,39,
-0,70,2,112,0,0,0,7,0,76,4,224,0,0,255,255,0,163,0,0,4,36,7,75,2,38,0,37,0,0,0,
-7,0,64,0,205,1,93,255,255,0,173,0,0,4,250,7,75,2,38,0,208,0,0,0,7,0,64,1,63,1,
-93,255,255,0,97,255,235,3,226,6,10,2,38,0,69,0,0,0,7,0,64,0,150,0,28,255,255,
-0,143,0,0,3,252,5,244,2,38,0,227,0,0,0,7,0,64,0,174,0,6,255,255,0,87,0,0,5,27,
-5,176,2,6,0,176,0,0,255,255,0,91,254,38,5,77,4,58,2,6,0,196,0,0,255,255,0,22,
-0,0,5,23,7,7,2,38,1,111,0,0,0,7,0,159,1,35,1,25,255,255,0,46,0,0,4,14,5,224,2,
-38,1,112,0,0,0,7,0,159,0,189,255,242,255,255,0,97,254,75,8,86,4,78,0,38,0,79,
-0,0,0,7,0,89,4,110,0,0,255,255,0,113,254,75,9,99,5,197,0,38,0,47,0,0,0,7,0,89,
-5,123,0,0,255,255,0,120,254,8,4,223,5,197,2,38,0,207,0,0,0,7,1,50,1,174,255,
-189,255,255,0,100,254,9,3,236,4,76,2,38,0,226,0,0,0,7,1,50,1,42,255,190,255,
-255,0,118,253,206,4,191,5,197,2,38,0,35,0,0,0,7,1,51,1,162,255,131,255,255,0,
-97,253,206,3,217,4,78,2,38,0,67,0,0,0,7,1,51,1,31,255,131,255,255,0,40,0,0,4,
-226,5,176,2,6,0,57,0,0,255,255,0,46,254,95,3,228,4,58,2,6,0,180,0,0,255,255,0,
-190,0,0,1,132,5,176,2,6,0,41,0,0,255,255,0,26,0,0,6,124,7,78,2,38,0,206,0,0,0,
-7,0,154,1,160,1,158,255,255,0,26,0,0,5,166,5,247,2,38,0,225,0,0,0,7,0,154,1,
-52,0,71,255,255,0,190,0,0,1,132,5,176,2,6,0,41,0,0,255,255,0,43,0,0,4,227,7,
-78,2,38,0,33,0,0,0,7,0,154,0,220,1,158,255,255,0,106,255,235,3,243,6,12,2,38,
-0,65,0,0,0,6,0,154,127,92,0,0,255,255,0,43,0,0,4,227,7,13,2,38,0,33,0,0,0,7,0,
-102,0,134,1,93,255,255,0,106,255,235,3,243,5,203,2,38,0,65,0,0,0,6,0,102,41,
-27,0,0,255,255,0,14,0,0,7,132,5,176,2,6,0,125,0,0,255,255,0,88,255,235,6,154,
-4,78,2,6,0,130,0,0,255,255,0,163,0,0,4,36,7,78,2,38,0,37,0,0,0,7,0,154,0,184,
-1,158,255,255,0,97,255,235,3,226,6,13,2,38,0,69,0,0,0,7,0,154,0,129,0,93,255,
-255,0,89,255,235,5,33,6,223,2,38,1,121,0,0,0,7,0,102,0,115,1,47,255,255,0,94,
-255,236,3,223,5,204,0,47,0,69,4,64,4,58,192,1,0,6,0,102,43,28,0,0,255,255,0,
-26,0,0,6,124,7,13,2,38,0,206,0,0,0,7,0,102,1,74,1,93,255,255,0,26,0,0,5,166,5,
-182,2,38,0,225,0,0,0,7,0,102,0,222,0,6,255,255,0,120,255,235,4,223,7,34,2,38,
-0,207,0,0,0,7,0,102,0,169,1,114,255,255,0,100,255,237,3,236,5,202,2,38,0,226,
-0,0,0,6,0,102,37,26,0,0,255,255,0,173,0,0,4,250,6,250,2,38,0,208,0,0,0,7,0,
-108,0,248,1,74,255,255,0,143,0,0,3,252,5,164,2,38,0,227,0,0,0,6,0,108,103,244,
-0,0,255,255,0,173,0,0,4,250,7,13,2,38,0,208,0,0,0,7,0,102,0,212,1,93,255,255,
-0,143,0,0,3,252,5,182,2,38,0,227,0,0,0,6,0,102,67,6,0,0,255,255,0,113,255,235,
-5,2,7,34,2,38,0,47,0,0,0,7,0,102,0,185,1,114,255,255,0,97,255,235,4,42,5,203,
-2,38,0,79,0,0,0,6,0,102,68,27,0,0,255,255,0,113,255,235,5,2,5,197,2,6,0,253,0,
-0,255,255,0,97,255,235,4,42,4,78,2,6,0,254,0,0,255,255,0,113,255,235,5,2,7,38,
-2,38,0,253,0,0,0,7,0,102,0,184,1,118,255,255,0,97,255,235,4,42,5,176,2,38,0,
-254,0,0,0,6,0,102,68,0,0,0,255,255,0,181,255,236,4,255,7,35,2,38,0,218,0,0,0,
-7,0,102,0,178,1,115,255,255,0,99,255,235,3,227,5,203,2,38,0,242,0,0,0,6,0,102,
-33,27,0,0,255,255,0,66,255,235,4,200,6,250,2,38,0,210,0,0,0,7,0,108,0,168,1,
-74,255,255,0,26,254,75,3,232,5,164,2,38,0,89,0,0,0,6,0,108,36,244,0,0,255,255,
-0,66,255,235,4,200,7,13,2,38,0,210,0,0,0,7,0,102,0,132,1,93,255,255,0,26,254,
-75,3,232,5,182,2,38,0,89,0,0,0,6,0,102,0,6,0,0,255,255,0,66,255,235,4,200,7,
-75,2,38,0,210,0,0,0,7,0,159,1,54,1,93,255,255,0,26,254,75,3,252,5,244,2,38,0,
-89,0,0,0,7,0,159,0,178,0,6,255,255,0,147,0,0,4,204,7,13,2,38,0,212,0,0,0,7,0,
-102,0,174,1,93,255,255,0,115,0,0,3,220,5,182,2,38,0,236,0,0,0,6,0,102,38,6,0,
-0,255,255,0,163,0,0,6,50,7,13,0,38,0,217,0,0,0,39,0,41,4,174,0,0,0,7,0,102,1,
-105,1,93,255,255,0,153,0,0,5,172,5,182,0,38,0,241,0,0,0,39,0,136,4,78,0,0,0,7,
-0,102,1,34,0,6,255,255,0,66,254,75,5,35,5,176,2,38,0,56,0,0,0,7,1,51,3,177,0,
-0,255,255,0,46,254,75,4,62,4,58,2,38,0,88,0,0,0,7,1,51,2,204,0,0,255,255,0,98,
-255,235,3,245,6,24,2,6,0,68,0,0,255,255,0,69,254,75,5,187,5,176,2,38,0,209,0,
-0,0,7,1,51,4,73,0,0,255,255,0,65,254,75,4,192,4,58,2,38,0,229,0,0,0,7,1,51,3,
-78,0,0,255,255,0,43,0,0,4,227,7,13,2,38,0,33,0,0,0,7,0,155,1,123,1,93,255,255,
-0,106,255,235,3,243,5,203,2,38,0,65,0,0,0,7,0,155,1,30,0,27,255,255,0,43,0,0,
-4,227,7,157,2,38,0,33,0,0,0,7,1,41,1,214,1,234,255,255,0,106,255,235,3,243,6,
-91,2,38,0,65,0,0,0,7,1,41,1,121,0,168,255,255,0,43,0,0,5,11,7,241,2,38,0,33,0,
-0,0,7,1,42,0,154,1,89,255,255,0,106,255,235,4,174,6,175,2,38,0,65,0,0,0,6,1,
-42,61,23,0,0,255,255,0,0,0,0,4,227,7,224,2,38,0,33,0,0,0,7,1,43,0,171,1,72,
-255,255,255,163,255,235,3,243,6,158,2,38,0,65,0,0,0,6,1,43,78,6,0,0,255,255,0,
-43,0,0,4,227,8,5,2,38,0,33,0,0,0,7,1,44,0,163,1,52,255,255,0,106,255,235,4,
-119,6,196,2,38,0,65,0,0,0,6,1,44,70,243,0,0,255,255,0,43,0,0,4,227,8,50,2,38,
-0,33,0,0,0,7,1,45,0,167,1,54,255,255,0,106,255,235,3,243,6,241,2,38,0,65,0,0,
-0,6,1,45,74,245,0,0,255,255,0,43,254,176,4,227,7,72,2,38,0,33,0,0,0,39,0,152,
-0,171,1,93,0,7,0,155,1,112,249,201,255,255,0,106,254,176,3,243,6,6,2,38,0,65,
-0,0,0,38,0,152,78,27,0,7,0,155,0,206,249,201,0,0,255,255,0,43,0,0,4,227,7,223,
-2,38,0,33,0,0,0,7,1,46,0,210,1,84,255,255,0,106,255,235,3,243,6,157,2,38,0,65,
-0,0,0,6,1,46,117,18,0,0,255,255,0,43,0,0,4,227,8,34,2,38,0,33,0,0,0,7,1,64,0,
-214,1,122,255,255,0,106,255,235,3,243,6,224,2,38,0,65,0,0,0,6,1,64,121,56,0,0,
-255,255,0,43,0,0,4,227,8,115,2,38,0,33,0,0,0,7,1,47,0,214,1,73,255,255,0,106,
-255,235,3,243,7,49,2,38,0,65,0,0,0,6,1,47,121,7,0,0,255,255,0,43,0,0,4,227,8,
-37,2,38,0,33,0,0,0,7,1,48,0,214,1,81,255,255,0,106,255,235,3,243,6,227,2,38,0,
-65,0,0,0,6,1,48,121,15,0,0,255,255,0,43,254,176,4,227,7,78,2,38,0,33,0,0,0,39,
-0,154,0,220,1,158,0,7,0,155,1,112,249,201,255,255,0,106,254,176,3,243,6,12,2,
-38,0,65,0,0,0,38,0,154,127,92,0,7,0,155,0,206,249,201,0,0,255,255,0,163,0,0,4,
-36,7,13,2,38,0,37,0,0,0,7,0,155,1,87,1,93,255,255,0,97,255,235,3,226,5,204,2,
-38,0,69,0,0,0,7,0,155,1,32,0,28,255,255,0,163,0,0,4,36,7,157,2,38,0,37,0,0,0,
-7,1,41,1,178,1,234,255,255,0,97,255,235,3,226,6,92,2,38,0,69,0,0,0,7,1,41,1,
-123,0,169,255,255,0,163,0,0,4,36,7,84,2,38,0,37,0,0,0,7,0,158,0,130,1,97,255,
-255,0,97,255,235,3,226,6,19,2,38,0,69,0,0,0,6,0,158,75,32,0,0,255,255,0,163,0,
-0,4,231,7,241,2,38,0,37,0,0,0,7,1,42,0,118,1,89,255,255,0,97,255,235,4,176,6,
-176,2,38,0,69,0,0,0,6,1,42,63,24,0,0,255,255,255,220,0,0,4,36,7,224,2,38,0,37,
-0,0,0,7,1,43,0,135,1,72,255,255,255,165,255,235,3,226,6,159,2,38,0,69,0,0,0,6,
-1,43,80,7,0,0,255,255,0,163,0,0,4,176,8,5,2,38,0,37,0,0,0,7,1,44,0,127,1,52,
-255,255,0,97,255,235,4,121,6,197,2,38,0,69,0,0,0,6,1,44,72,244,0,0,255,255,0,
-163,0,0,4,36,8,50,2,38,0,37,0,0,0,7,1,45,0,131,1,54,255,255,0,97,255,235,3,
-226,6,242,2,38,0,69,0,0,0,6,1,45,76,246,0,0,255,255,0,163,254,186,4,36,7,72,2,
-38,0,37,0,0,0,39,0,152,0,135,1,93,0,7,0,155,1,86,249,211,255,255,0,97,254,176,
-3,226,6,7,2,38,0,69,0,0,0,38,0,152,80,28,0,7,0,155,1,86,249,201,0,0,255,255,0,
-190,0,0,2,3,7,157,2,38,0,41,0,0,0,7,1,41,0,111,1,234,255,255,0,153,0,0,1,222,
-6,70,2,38,0,136,0,0,0,7,1,41,0,74,0,147,255,255,0,180,0,0,1,142,7,13,2,38,0,
-41,0,0,0,7,0,155,0,20,1,93,255,255,0,149,254,186,1,111,6,24,2,38,0,73,0,0,0,7,
-0,155,255,245,249,211,255,255,0,113,255,235,5,2,7,34,2,38,0,47,0,0,0,7,0,155,
-1,174,1,114,255,255,0,97,255,235,4,42,5,203,2,38,0,79,0,0,0,7,0,155,1,57,0,27,
-255,255,0,113,255,235,5,2,7,178,2,38,0,47,0,0,0,7,1,41,2,9,1,255,255,255,0,97,
-255,235,4,42,6,91,2,38,0,79,0,0,0,7,1,41,1,148,0,168,255,255,0,113,255,235,5,
-62,8,6,2,38,0,47,0,0,0,7,1,42,0,205,1,110,255,255,0,97,255,235,4,201,6,175,2,
-38,0,79,0,0,0,6,1,42,88,23,0,0,255,255,0,51,255,235,5,2,7,245,2,38,0,47,0,0,0,
-7,1,43,0,222,1,93,255,255,255,190,255,235,4,42,6,158,2,38,0,79,0,0,0,6,1,43,
-105,6,0,0,255,255,0,113,255,235,5,7,8,26,2,38,0,47,0,0,0,7,1,44,0,214,1,73,
-255,255,0,97,255,235,4,146,6,196,2,38,0,79,0,0,0,6,1,44,97,243,0,0,255,255,0,
-113,255,235,5,2,8,71,2,38,0,47,0,0,0,7,1,45,0,218,1,75,255,255,0,97,255,235,4,
-42,6,241,2,38,0,79,0,0,0,6,1,45,101,245,0,0,255,255,0,113,254,167,5,2,7,93,2,
-38,0,47,0,0,0,39,0,152,0,222,1,114,0,7,0,155,1,172,249,192,255,255,0,97,254,
-166,4,42,6,6,2,38,0,79,0,0,0,38,0,152,105,27,0,7,0,155,1,56,249,191,0,0,255,
-255,0,108,255,235,6,49,6,253,2,38,0,147,0,0,0,7,0,113,1,224,1,15,255,255,0,97,
-255,235,4,242,6,30,2,38,0,148,0,0,0,7,0,113,1,107,0,48,255,255,0,108,255,235,
-6,49,7,1,2,38,0,147,0,0,0,7,0,64,1,38,1,19,255,255,0,97,255,235,4,242,6,30,2,
-38,0,148,0,0,0,7,0,113,1,107,0,48,255,255,0,108,255,235,6,49,7,83,2,38,0,147,
-0,0,0,7,1,41,2,11,1,160,255,255,0,97,255,235,4,242,6,116,2,38,0,148,0,0,0,7,1,
-41,1,150,0,193,255,255,0,108,255,235,6,49,7,10,2,38,0,147,0,0,0,7,0,158,0,219,
-1,23,255,255,0,97,255,235,4,42,6,18,2,38,0,79,0,0,0,6,0,158,100,31,0,0,255,
-255,0,108,255,235,6,49,6,195,2,38,0,147,0,0,0,7,0,155,1,176,1,19,255,255,0,97,
-255,235,4,242,5,228,2,38,0,148,0,0,0,7,0,155,1,59,0,52,255,255,0,147,255,235,
-4,220,7,13,2,38,0,53,0,0,0,7,0,155,1,172,1,93,255,255,0,139,255,235,3,252,5,
-182,2,38,0,85,0,0,0,7,0,155,1,55,0,6,255,255,0,147,255,235,4,220,7,157,2,38,0,
-53,0,0,0,7,1,41,2,7,1,234,255,255,0,139,255,235,3,252,6,70,2,38,0,85,0,0,0,7,
-1,41,1,146,0,147,255,255,0,147,255,235,6,88,6,244,2,38,0,149,0,0,0,7,0,113,1,
-202,1,6,255,255,0,139,255,235,5,106,5,253,2,38,0,150,0,0,0,7,0,113,1,88,0,15,
-255,255,0,147,255,235,6,88,6,248,2,38,0,149,0,0,0,7,0,64,1,16,1,10,255,255,0,
-139,255,235,5,106,6,1,2,38,0,150,0,0,0,7,0,64,0,158,0,19,255,255,0,147,255,
-235,6,88,7,74,2,38,0,149,0,0,0,7,1,41,1,245,1,151,255,255,0,139,255,235,5,106,
-6,83,2,38,0,150,0,0,0,7,1,41,1,131,0,160,255,255,0,147,255,235,6,88,7,1,2,38,
-0,149,0,0,0,7,0,158,0,197,1,14,255,255,0,139,255,235,5,106,6,10,2,38,0,150,0,
-0,0,6,0,158,83,23,0,0,255,255,0,147,255,235,6,88,6,186,2,38,0,149,0,0,0,7,0,
-155,1,154,1,10,255,255,0,139,255,235,5,106,5,195,2,38,0,150,0,0,0,7,0,155,1,
-40,0,19,255,255,0,40,0,0,4,226,7,12,2,38,0,57,0,0,0,7,0,155,1,121,1,92,255,
-255,0,26,254,75,3,232,5,182,2,38,0,89,0,0,0,7,0,155,0,245,0,6,255,255,0,40,0,
-0,4,226,7,156,2,38,0,57,0,0,0,7,1,41,1,212,1,233,255,255,0,26,254,75,3,232,6,
-70,2,38,0,89,0,0,0,7,1,41,1,80,0,147,255,255,0,40,0,0,4,226,7,83,2,38,0,57,0,
-0,0,7,0,158,0,164,1,96,255,255,0,26,254,75,3,232,5,253,2,38,0,89,0,0,0,6,0,
-158,32,10,0,0,255,255,0,98,255,12,4,126,6,24,2,38,1,209,0,0,0,7,0,63,0,148,
-255,166,255,255,0,163,254,210,5,58,5,176,2,38,0,43,0,0,0,7,1,49,4,21,0,0,255,
-255,0,71,254,210,3,209,4,58,2,38,0,233,0,0,0,7,1,49,1,216,0,0,255,255,0,169,
-254,210,5,135,5,176,2,38,0,40,0,0,0,7,1,49,4,98,0,0,255,255,0,143,254,210,4,
-140,4,58,2,38,0,231,0,0,0,7,1,49,3,103,0,0,255,255,0,37,254,210,4,164,5,176,2,
-38,0,52,0,0,0,7,1,49,2,48,0,0,255,255,0,71,254,210,3,209,4,58,2,38,0,233,0,0,
-0,7,1,49,1,216,0,0,255,255,0,66,254,210,4,240,5,176,2,38,0,56,0,0,0,7,1,49,3,
-203,0,0,255,255,0,46,254,210,4,11,4,58,2,38,0,88,0,0,0,7,1,49,2,230,0,0,255,
-255,0,147,254,210,5,93,5,176,2,38,0,212,0,0,0,7,1,49,4,56,0,0,255,255,0,115,
-254,210,4,109,4,58,2,38,0,236,0,0,0,7,1,49,3,72,0,0,255,255,0,147,254,210,4,
-204,5,176,2,38,0,212,0,0,0,7,1,49,3,21,0,0,255,255,0,115,254,210,3,220,4,58,2,
-38,0,236,0,0,0,7,1,49,2,36,0,0,255,255,0,163,254,210,4,32,5,176,2,38,0,168,0,
-0,0,7,1,49,0,212,0,0,255,255,0,143,254,210,2,190,4,58,2,38,0,223,0,0,0,7,1,49,
-0,177,0,0,255,255,0,26,254,210,6,195,5,176,2,38,0,206,0,0,0,7,1,49,5,158,0,0,
-255,255,0,26,254,210,5,202,4,58,2,38,0,225,0,0,0,7,1,49,4,165,0,0,255,255,0,
-77,254,98,6,44,5,195,2,38,1,127,0,0,0,7,0,157,2,108,0,0,255,255,255,223,254,
-98,4,94,4,78,2,38,1,128,0,0,0,7,0,157,1,102,0,0,255,255,0,143,0,0,4,0,6,24,2,
-6,0,72,0,0,0,2,255,156,0,0,4,0,4,58,0,18,0,27,0,0,1,33,21,33,50,22,21,20,6,35,
-33,17,35,53,51,53,51,21,33,1,17,33,50,54,53,52,38,35,2,98,254,252,1,13,192,
-213,215,190,254,46,253,253,197,1,4,254,252,1,13,106,101,102,105,3,31,129,184,
-147,148,191,3,31,155,128,128,254,74,254,150,102,76,74,110,0,0,0,0,2,255,175,0,
-0,4,187,5,176,0,18,0,27,0,0,1,33,21,33,50,4,21,20,4,35,33,17,35,53,51,53,51,
-21,33,1,17,33,50,54,53,52,38,35,2,117,254,243,1,103,233,1,3,254,252,232,253,
-212,244,244,197,1,13,254,243,1,103,147,148,147,148,4,77,221,239,197,198,246,4,
-77,155,200,200,253,237,253,197,169,123,119,160,0,0,2,255,156,0,0,4,0,4,58,0,
-18,0,27,0,0,1,33,21,33,50,22,21,20,6,35,33,17,35,53,51,53,51,21,33,1,17,33,50,
-54,53,52,38,35,2,98,254,252,1,13,192,213,215,190,254,46,253,253,197,1,4,254,
-252,1,13,106,101,102,105,3,31,129,184,147,148,191,3,31,155,128,128,254,74,254,
-150,102,76,74,110,0,0,0,0,2,255,175,0,0,4,187,5,176,0,18,0,27,0,0,1,33,21,33,
-50,4,21,20,4,35,33,17,35,53,51,53,51,21,33,1,17,33,50,54,53,52,38,35,2,117,
-254,243,1,103,233,1,3,254,252,232,253,212,244,244,197,1,13,254,243,1,103,147,
-148,147,148,4,77,221,239,197,198,246,4,77,155,200,200,253,237,253,197,169,123,
-119,160,0,0,1,255,205,0,0,4,32,5,176,0,13,0,0,1,33,17,35,17,35,53,51,17,33,21,
-33,17,33,2,147,254,213,197,214,214,3,125,253,72,1,43,2,169,253,87,2,169,155,2,
-108,155,254,47,0,0,0,0,1,255,213,0,0,2,190,4,58,0,13,0,0,1,33,17,35,17,35,53,
-51,17,33,21,33,17,33,2,155,254,185,197,186,186,2,47,254,150,1,71,1,220,254,36,
-1,220,155,1,195,156,254,217,0,0,0,0,1,255,179,0,0,4,251,5,176,0,22,0,0,1,35,
-17,35,17,35,53,51,53,51,21,33,21,33,17,51,1,51,23,9,1,7,35,1,251,147,197,240,
-240,197,1,17,254,239,128,2,8,222,2,253,196,2,103,3,239,2,146,253,110,4,130,
-155,147,147,155,254,170,2,132,5,253,80,253,10,5,0,0,1,255,157,0,0,4,11,6,24,0,
-20,0,0,1,35,17,35,17,35,53,51,53,51,21,33,21,33,17,51,1,51,9,1,35,1,206,121,
-197,243,243,197,1,14,254,242,119,1,49,236,254,137,1,153,233,1,243,254,13,4,
-190,155,191,191,155,253,210,1,170,254,14,253,184,0,0,0,255,255,0,173,254,224,
-5,133,7,78,2,38,0,208,0,0,0,39,0,154,1,42,1,158,0,7,1,110,4,30,255,179,255,
-255,0,143,254,224,4,135,5,247,2,38,0,227,0,0,0,39,0,154,0,153,0,71,0,7,1,110,
-3,32,255,179,255,255,0,169,254,224,5,129,5,176,2,38,0,40,0,0,0,7,1,110,4,26,
-255,179,255,255,0,143,254,224,4,134,4,58,2,38,0,231,0,0,0,7,1,110,3,31,255,
-179,255,255,0,163,254,224,6,204,5,176,2,38,0,45,0,0,0,7,1,110,5,101,255,179,
-255,255,0,153,254,224,5,224,4,58,2,38,0,230,0,0,0,7,1,110,4,121,255,179,255,
-255,0,65,254,224,4,135,4,58,2,38,0,229,0,0,0,7,1,110,3,32,255,179,255,255,0,
-69,254,224,5,130,5,176,2,38,0,209,0,0,0,7,1,110,4,27,255,179,0,1,0,40,0,0,4,
-226,5,176,0,15,0,0,9,1,51,1,51,21,35,7,17,35,17,33,53,51,1,51,2,133,1,124,225,
-254,93,159,243,8,196,254,249,179,254,93,225,2,204,2,228,252,250,155,15,254,0,
-2,15,155,3,6,0,0,0,1,0,46,254,95,3,228,4,58,0,17,0,0,5,33,17,35,17,35,53,51,1,
-51,1,23,51,55,19,51,1,51,3,120,254,245,197,246,218,254,162,202,1,0,17,6,19,
-249,201,254,166,238,13,254,108,1,148,155,3,172,253,5,76,76,2,251,252,84,0,1,0,
-66,0,0,4,214,5,176,0,17,0,0,1,35,1,35,9,1,35,1,35,53,51,1,51,9,1,51,1,51,3,
-252,211,1,173,235,254,163,254,162,238,1,173,185,171,254,107,236,1,82,1,84,238,
-254,106,198,2,155,253,101,2,66,253,190,2,155,155,2,122,253,200,2,56,253,134,0,
-0,0,0,1,0,46,0,0,3,212,4,58,0,17,0,0,1,35,1,35,11,1,35,1,35,53,51,1,51,27,1,
-51,1,51,3,95,199,1,60,226,240,240,228,1,59,208,197,254,218,227,227,230,230,
-254,217,188,1,222,254,34,1,153,254,103,1,222,155,1,193,254,113,1,143,254,63,0,
-0,0,255,255,255,206,254,75,4,32,5,176,2,38,0,168,0,0,0,39,1,130,255,90,0,33,0,
-7,1,51,1,153,0,0,255,255,255,214,254,75,2,190,4,58,2,38,0,223,0,0,0,39,1,130,
-255,98,255,85,0,7,1,51,0,219,0,0,255,255,0,108,255,235,6,98,7,114,2,38,0,251,
-0,0,0,7,0,255,1,43,1,118,255,255,0,127,255,235,5,210,5,252,2,38,0,252,0,0,0,7,
-0,255,0,240,0,0,255,255,0,98,255,237,3,233,4,76,2,6,0,182,0,0,255,255,255,237,
-0,0,4,52,5,176,2,38,0,38,0,0,0,7,1,130,255,121,254,127,255,255,0,187,2,136,5,
-243,3,35,0,70,1,33,175,0,102,102,64,0,0,2,0,70,0,0,4,162,5,176,0,27,0,31,0,0,
-1,35,3,35,19,35,53,33,19,33,53,33,19,51,3,51,19,51,3,51,21,35,3,51,21,35,3,35,
-3,51,19,35,2,200,255,80,151,80,236,1,8,68,255,0,1,28,82,151,82,255,82,151,82,
-199,226,68,219,247,80,152,147,255,68,255,1,154,254,102,1,154,140,1,92,142,1,
-160,254,96,1,160,254,96,142,254,164,140,254,102,2,38,1,92,0,2,0,171,0,0,1,113,
-5,176,0,3,0,7,0,0,1,35,17,51,19,35,53,51,1,112,197,197,1,198,198,1,222,3,210,
-250,80,205,0,0,0,2,0,126,3,168,2,121,5,176,0,4,0,10,0,0,1,7,35,17,51,1,7,35,
-55,17,51,2,121,101,97,198,254,203,101,97,1,197,4,162,250,2,8,254,242,250,240,
-1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,152,0,242,1,4,1,42,1,80,1,112,1,136,1,
-152,1,166,1,178,1,192,1,238,1,254,2,42,2,104,2,136,2,188,2,252,3,24,3,96,3,
-158,3,170,3,182,3,206,3,226,3,250,4,44,4,160,4,190,4,246,5,42,5,82,5,108,5,
-130,5,184,5,208,5,220,5,250,6,26,6,42,6,76,6,102,6,154,6,190,6,250,7,50,7,112,
-7,132,7,166,7,190,7,234,8,10,8,34,8,56,8,76,8,90,8,108,8,132,8,146,8,162,8,
-226,9,22,9,68,9,120,9,174,9,210,10,20,10,54,10,72,10,108,10,136,10,148,10,204,
-10,238,11,28,11,80,11,132,11,162,11,222,12,4,12,38,12,62,12,104,12,134,12,176,
-12,198,12,246,13,4,13,50,13,92,13,104,13,158,13,212,14,32,14,74,14,94,14,198,
-14,218,15,52,15,118,15,130,15,146,15,246,16,4,16,42,16,74,16,118,16,180,16,
-196,16,234,17,2,17,16,17,44,17,60,17,102,17,114,17,132,17,150,17,168,17,178,
-17,220,17,254,18,82,18,122,18,180,19,22,19,98,19,124,19,202,19,254,20,40,20,
-52,20,84,20,112,20,136,20,180,20,230,21,36,21,136,21,182,21,210,22,8,22,72,22,
-130,22,178,22,226,23,0,23,22,23,44,23,74,23,88,23,126,23,156,23,188,23,214,23,
-224,23,236,23,248,24,0,24,12,24,26,24,52,24,60,24,78,24,102,24,162,24,184,24,
-212,24,230,25,8,25,72,25,118,25,176,25,244,26,52,26,80,26,138,26,200,26,254,
-27,32,27,86,27,116,27,172,27,240,28,24,28,74,28,128,28,180,28,200,28,238,29,
-44,29,98,29,162,29,204,30,6,30,62,30,110,30,144,30,168,30,208,30,250,31,38,31,
-102,31,128,31,160,31,202,31,226,32,0,32,26,32,56,32,96,32,140,32,176,32,232,
-33,36,33,76,33,148,33,200,33,218,34,2,34,46,34,108,34,134,34,166,34,196,34,
-228,34,252,35,14,35,34,35,124,35,148,35,176,35,202,35,232,36,16,36,60,36,96,
-36,150,36,206,36,248,37,54,37,106,37,160,37,208,37,252,38,20,38,90,38,154,38,
-234,39,52,39,72,39,102,39,118,39,134,39,182,39,230,39,240,39,250,40,10,40,26,
-40,42,40,54,40,66,40,78,40,104,40,130,40,166,40,190,40,206,41,74,41,100,41,
-126,41,140,41,172,41,234,42,42,42,86,42,104,42,122,42,140,42,158,42,216,42,
-236,43,14,43,28,43,54,43,136,43,180,43,216,43,232,43,248,44,2,44,32,44,62,44,
-90,44,134,44,180,44,216,45,14,45,68,45,82,45,112,45,140,45,172,45,188,45,232,
-46,38,46,70,46,122,46,186,46,214,47,30,47,92,47,138,47,168,47,204,48,2,48,50,
-48,86,48,112,48,134,48,184,48,208,48,220,48,250,49,26,49,42,49,74,49,100,49,
-146,49,182,49,236,50,36,50,96,50,116,50,148,50,172,50,208,50,240,51,8,51,30,
-51,74,51,90,51,134,51,196,51,228,52,22,52,82,52,110,52,182,52,242,53,28,53,44,
-53,88,53,150,53,182,53,232,54,36,54,62,54,134,54,194,54,210,54,250,55,34,55,
-80,55,122,55,166,55,208,55,248,56,32,56,74,56,116,56,174,56,184,56,212,56,240,
-57,18,57,52,57,122,57,184,57,212,57,226,58,4,58,38,58,104,58,166,58,200,58,
-238,59,36,59,88,59,146,59,204,60,8,60,62,60,110,60,156,60,212,61,38,61,106,61,
-174,61,234,62,38,62,76,62,140,62,162,62,184,62,222,63,4,63,40,63,76,63,110,63,
-150,63,190,64,16,64,96,64,142,64,190,64,204,65,8,65,72,65,88,65,156,65,216,65,
-232,65,248,66,78,66,158,66,218,67,18,67,94,67,164,67,164,67,164,67,164,67,164,
-67,164,67,164,67,164,67,164,67,164,67,164,67,164,68,126,68,196,68,208,69,28,
-69,100,69,100,69,100,69,162,69,206,70,136,70,224,71,2,71,56,71,82,71,172,71,
-188,71,250,72,60,72,122,72,134,72,142,72,150,72,200,72,250,73,38,73,66,73,74,
-73,86,73,98,73,110,73,122,73,134,73,146,73,162,73,174,73,186,73,198,73,210,73,
-222,73,234,73,246,74,2,74,14,74,26,74,38,74,50,74,62,74,74,74,86,74,98,74,110,
-74,122,74,134,74,146,74,158,74,170,74,182,74,194,74,206,74,218,74,234,74,246,
-75,2,75,14,75,26,75,38,75,50,75,62,75,74,75,86,75,98,75,110,75,122,75,134,75,
-146,75,158,75,170,75,182,75,194,75,206,75,218,75,230,75,242,75,254,76,10,76,
-22,76,34,76,46,76,58,76,70,76,82,76,94,76,106,76,118,76,130,76,142,76,154,76,
-162,76,174,76,186,76,198,76,210,76,222,76,234,76,246,77,2,77,14,77,26,77,38,
-77,50,77,62,77,74,77,86,77,98,77,110,77,122,77,134,77,146,77,158,77,170,77,
-182,77,194,77,206,77,218,77,230,77,242,77,254,78,10,78,22,78,34,78,46,78,58,
-78,70,78,82,78,94,78,106,78,118,78,126,78,134,78,146,78,158,78,170,78,182,78,
-194,78,206,78,218,78,230,78,242,78,254,79,10,79,22,79,34,79,46,79,58,79,70,79,
-82,79,94,79,106,79,118,79,130,79,142,79,154,79,166,79,178,79,190,79,202,79,
-214,79,226,79,238,79,250,80,6,80,14,80,26,80,38,80,50,80,62,80,74,80,86,80,98,
-80,110,80,122,80,134,80,146,80,158,80,170,80,182,80,194,80,206,80,218,80,230,
-80,242,80,254,81,10,81,22,81,34,81,46,81,58,81,70,81,82,81,94,81,106,81,118,
-81,130,81,142,81,154,81,166,81,178,81,190,81,202,81,210,81,218,81,226,81,234,
-81,242,81,250,82,2,82,10,82,18,82,26,82,34,82,42,82,50,82,58,82,70,82,82,82,
-94,82,106,82,118,82,130,82,142,82,150,82,158,82,166,82,174,82,186,82,198,82,
-210,82,222,82,234,82,246,83,2,83,64,83,72,83,84,83,92,83,100,83,112,83,120,83,
-128,83,136,83,144,83,152,83,164,83,172,83,180,83,188,83,196,83,204,83,212,83,
-220,83,228,83,236,83,244,83,252,84,8,84,16,84,24,84,70,84,78,84,86,84,98,84,
-110,84,118,84,126,84,138,84,146,84,158,84,170,84,182,84,194,84,206,84,218,84,
-230,84,242,84,254,85,10,85,18,85,26,85,38,85,50,85,62,85,74,85,82,85,94,85,
-106,85,118,85,130,85,142,85,158,85,174,85,186,85,198,85,210,85,222,85,230,85,
-238,85,250,86,6,86,18,86,30,86,42,86,54,86,66,86,78,86,86,86,94,86,102,86,114,
-86,126,86,134,86,146,86,158,86,170,86,182,86,190,86,198,86,210,86,222,86,234,
-86,248,87,4,87,16,87,28,87,40,87,52,87,64,87,76,87,88,87,100,87,112,87,120,87,
-128,87,140,87,152,87,164,87,176,87,188,87,200,87,212,87,224,87,236,87,248,88,
-4,88,16,88,32,88,48,88,60,88,72,88,80,88,92,88,104,88,116,88,128,88,140,88,
-152,88,164,88,176,88,188,88,200,88,212,88,224,88,236,88,248,89,8,89,24,89,36,
-89,48,89,60,89,72,89,84,89,96,89,108,89,120,89,136,89,152,89,164,89,176,89,
-188,89,200,89,212,89,224,89,236,89,248,90,4,90,16,90,28,90,40,90,52,90,64,90,
-80,90,96,90,108,90,120,90,132,90,144,90,156,90,168,90,180,90,192,90,204,90,
-216,90,228,90,240,90,252,91,8,91,20,91,32,91,48,91,64,91,76,91,88,91,100,91,
-112,91,124,91,136,91,148,91,160,91,172,91,184,91,196,91,208,91,220,91,232,91,
-244,92,0,92,12,92,24,92,36,92,48,92,60,92,72,92,84,92,96,92,108,92,120,92,132,
-92,144,92,156,92,168,92,180,92,192,92,204,92,216,92,228,92,240,92,252,93,8,93,
-20,93,32,93,44,93,56,93,68,93,80,93,92,93,104,93,116,93,128,93,140,93,148,93,
-194,93,240,94,30,94,76,94,104,94,132,94,172,94,210,94,226,94,242,94,254,95,10,
-95,22,95,34,95,46,95,58,95,90,95,124,95,164,95,202,95,218,95,234,95,246,96,2,
-96,10,96,22,96,32,96,86,96,106,96,132,0,0,0,0,0,1,0,0,32,210,0,1,5,118,24,0,0,
-10,8,196,0,8,0,42,255,162,0,8,0,54,0,40,0,8,0,55,0,37,0,8,0,57,0,45,0,16,0,16,
-0,4,0,16,0,17,255,221,0,16,0,19,255,252,0,16,0,20,0,5,0,16,0,21,255,253,0,16,
-0,22,0,4,0,16,0,23,255,213,0,16,0,25,0,6,0,17,0,18,255,250,0,17,0,19,255,250,
-0,17,0,21,255,250,0,17,0,23,255,254,0,18,0,16,255,239,0,18,0,17,255,239,0,18,
-0,18,0,8,0,18,0,21,255,242,0,18,0,22,255,239,0,18,0,23,255,233,0,18,0,24,255,
-238,0,18,0,25,0,2,0,19,0,17,255,236,0,19,0,18,255,253,0,19,0,19,0,7,0,19,0,20,
-0,15,0,19,0,21,0,4,0,19,0,22,255,253,0,19,0,23,255,228,0,19,0,24,0,5,0,19,0,
-25,255,255,0,20,0,16,0,3,0,20,0,18,255,225,0,20,0,20,0,34,0,20,0,21,0,17,0,20,
-0,22,0,3,0,20,0,23,255,173,0,20,0,24,0,19,0,21,0,17,255,252,0,21,0,18,255,234,
-0,21,0,19,0,6,0,21,0,20,0,17,0,21,0,21,0,5,0,21,0,22,255,254,0,21,0,23,255,
-253,0,21,0,24,0,6,0,21,0,25,255,229,0,22,0,16,0,2,0,22,0,17,255,217,0,22,0,18,
-255,232,0,22,0,20,0,23,0,22,0,21,0,9,0,22,0,22,0,2,0,22,0,23,255,216,0,22,0,
-24,0,11,0,23,0,17,0,36,0,23,0,20,255,94,0,23,0,21,255,225,0,23,0,22,255,217,0,
-23,0,23,0,38,0,23,0,24,255,234,0,23,0,25,255,249,0,24,0,16,255,255,0,24,0,17,
-255,234,0,24,0,19,0,11,0,24,0,20,0,20,0,24,0,21,0,8,0,24,0,22,255,255,0,25,0,
-16,0,3,0,25,0,17,255,218,0,25,0,18,255,247,0,25,0,20,0,5,0,25,0,21,255,252,0,
-25,0,22,0,3,0,25,0,23,255,209,0,25,0,25,0,5,0,33,0,35,255,218,0,33,0,39,255,
-217,0,33,0,47,255,214,0,33,0,49,255,217,0,33,0,52,255,104,0,33,0,53,255,211,0,
-33,0,54,255,108,0,33,0,55,255,157,0,33,0,57,255,93,0,33,0,65,0,5,0,33,0,67,
-255,236,0,33,0,68,255,229,0,33,0,69,255,232,0,33,0,71,255,240,0,33,0,79,255,
-232,0,33,0,81,255,240,0,33,0,83,0,3,0,33,0,84,255,192,0,33,0,85,255,233,0,33,
-0,86,255,173,0,33,0,87,255,188,0,33,0,90,0,24,0,33,1,8,255,120,0,33,1,12,255,
-120,0,33,1,66,255,236,0,33,1,70,255,233,0,33,1,78,255,233,0,33,1,80,255,236,0,
-33,1,83,255,139,0,33,1,84,255,225,0,33,1,85,255,152,0,33,1,86,255,185,0,33,1,
-88,255,133,0,34,0,57,255,93,0,34,0,65,0,10,0,34,0,73,255,252,0,34,0,76,255,
-252,0,34,0,79,0,6,0,34,0,82,0,2,0,34,0,85,0,5,0,34,0,89,0,4,0,35,0,35,255,250,
-0,35,0,39,255,250,0,35,0,47,255,247,0,35,0,49,255,250,0,35,0,73,255,244,0,35,
-0,82,255,250,0,35,0,85,255,250,0,35,0,89,0,11,0,35,0,90,255,247,0,35,1,66,255,
-250,0,35,1,70,255,249,0,35,1,78,255,249,0,35,1,80,255,250,0,36,0,54,255,213,0,
-36,0,55,255,230,0,36,0,65,255,253,0,36,0,69,0,4,0,36,0,79,0,4,0,36,0,85,0,4,0,
-37,0,54,0,17,0,37,0,55,0,16,0,37,0,57,0,18,0,37,0,66,255,245,0,37,0,67,255,
-218,0,37,0,68,255,213,0,37,0,69,255,217,0,37,0,70,255,219,0,37,0,71,255,222,0,
-37,0,73,255,246,0,37,0,74,255,249,0,37,0,75,255,248,0,37,0,76,255,246,0,37,0,
-77,255,238,0,37,0,78,255,238,0,37,0,79,255,217,0,37,0,80,255,242,0,37,0,81,
-255,222,0,37,0,82,255,240,0,37,0,84,255,212,0,37,0,85,255,222,0,37,0,86,255,
-203,0,37,0,87,255,210,0,37,0,88,0,5,0,37,0,89,255,207,0,37,0,90,0,6,0,37,1,85,
-255,224,0,37,1,86,255,218,0,37,1,88,255,223,0,38,0,12,254,205,0,38,0,14,254,
-205,0,38,0,33,255,135,0,38,0,65,255,187,0,38,0,69,255,212,0,38,0,73,255,249,0,
-38,0,76,255,247,0,38,0,79,255,212,0,38,0,82,255,203,0,38,0,85,255,210,0,38,0,
-89,255,206,0,38,1,63,255,124,0,39,0,65,0,1,0,39,0,69,0,4,0,39,0,78,255,255,0,
-39,0,79,0,1,0,39,0,82,0,2,0,39,0,85,0,1,0,39,0,89,0,1,0,40,0,65,255,250,0,40,
-0,69,255,246,0,40,0,79,255,246,0,40,0,85,255,247,0,40,0,89,255,253,0,41,0,65,
-255,248,0,41,0,67,255,248,0,41,0,68,255,238,0,41,0,70,255,244,0,41,0,71,255,
-248,0,41,0,77,255,248,0,41,0,78,255,248,0,41,0,79,255,244,0,41,0,80,255,252,0,
-41,0,82,255,248,0,41,0,83,255,248,0,41,0,84,255,247,0,41,0,85,255,248,0,41,0,
-86,255,250,0,41,0,87,255,252,0,41,0,89,255,250,0,42,0,65,255,247,0,42,0,79,
-255,247,0,43,0,35,255,200,0,43,0,39,255,196,0,43,0,47,255,193,0,43,0,49,255,
-196,0,43,0,65,255,246,0,43,0,69,255,202,0,43,0,73,255,247,0,43,0,79,255,201,0,
-43,0,82,255,248,0,43,0,85,255,208,0,43,0,87,255,177,0,43,0,89,255,175,0,43,1,
-66,255,207,0,43,1,70,255,203,0,43,1,78,255,204,0,43,1,80,255,204,0,44,0,33,0,
-39,0,44,0,35,255,213,0,44,0,39,255,209,0,44,0,47,255,205,0,44,0,49,255,209,0,
-44,0,52,255,100,0,44,0,53,255,206,0,44,0,54,255,71,0,44,0,55,255,147,0,44,0,
-57,255,79,0,44,0,74,255,254,0,44,0,85,255,227,0,44,0,87,255,170,0,44,0,89,255,
-147,0,44,1,8,254,233,0,44,1,12,254,230,0,44,1,63,0,38,0,44,1,66,255,229,0,44,
-1,70,255,225,0,44,1,78,255,227,0,44,1,80,255,227,0,44,1,83,255,118,0,44,1,84,
-255,220,0,44,1,85,255,109,0,44,1,86,255,172,0,44,1,88,255,106,0,45,0,65,255,
-249,0,45,0,69,255,245,0,45,0,74,255,248,0,45,0,78,255,249,0,45,0,79,255,245,0,
-45,0,85,255,249,0,45,0,89,255,252,0,46,0,69,255,247,0,46,0,79,255,247,0,46,0,
-89,255,253,0,47,0,33,255,214,0,47,0,52,255,201,0,47,0,54,255,211,0,47,0,55,
-255,233,0,47,0,56,255,210,0,47,0,57,255,198,0,47,0,67,0,2,0,47,0,68,255,252,0,
-47,0,69,0,2,0,47,0,70,0,1,0,47,0,71,0,2,0,47,0,74,255,245,0,47,0,79,0,2,0,47,
-0,80,255,255,0,47,0,81,0,5,0,47,0,83,255,255,0,47,0,84,0,4,0,47,0,85,0,2,0,47,
-0,88,255,244,0,47,0,89,0,7,0,47,0,90,255,241,0,47,1,63,255,215,0,47,1,85,255,
-254,0,47,1,86,255,255,0,47,1,87,255,233,0,48,0,12,254,176,0,48,0,14,254,176,0,
-48,0,33,255,146,0,48,0,37,255,250,0,48,0,40,255,250,0,48,0,41,255,250,0,48,0,
-65,255,234,0,48,0,69,255,230,0,48,0,72,255,254,0,48,0,73,255,248,0,48,0,76,
-255,250,0,48,0,78,255,250,0,48,0,79,255,230,0,48,0,82,255,252,0,48,0,83,255,
-244,0,48,0,84,0,29,0,48,0,89,0,31,0,48,1,63,255,138,0,48,1,68,255,253,0,48,1,
-71,255,253,0,48,1,72,255,253,0,49,0,33,0,28,0,49,0,52,255,188,0,49,0,53,255,
-242,0,49,0,54,255,199,0,49,0,55,255,216,0,49,0,56,0,24,0,49,0,57,255,185,0,49,
-0,65,255,255,0,49,0,85,255,252,0,49,1,63,0,28,0,49,1,83,255,244,0,49,1,84,255,
-249,0,49,1,85,255,240,0,49,1,86,255,244,0,49,1,87,0,13,0,49,1,88,255,238,0,50,
-0,35,255,245,0,50,0,39,255,245,0,50,0,47,255,242,0,50,0,49,255,245,0,50,0,52,
-255,215,0,50,0,53,255,242,0,50,0,54,255,217,0,50,0,55,255,226,0,50,0,57,255,
-158,0,50,0,65,255,252,0,50,0,69,255,241,0,50,0,79,255,241,0,50,0,85,255,248,0,
-50,0,89,255,254,0,50,1,66,255,246,0,50,1,70,255,245,0,50,1,78,255,245,0,50,1,
-80,255,245,0,50,1,83,255,253,0,50,1,84,255,245,0,50,1,86,255,248,0,51,0,65,0,
-1,0,51,0,69,255,253,0,51,0,74,255,247,0,51,0,77,255,250,0,51,0,78,255,250,0,
-51,0,79,255,253,0,51,0,80,255,254,0,51,0,81,255,255,0,51,0,85,255,254,0,51,0,
-87,0,6,0,51,0,89,0,5,0,52,0,12,255,92,0,52,0,13,255,96,0,52,0,14,255,92,0,52,
-0,26,255,102,0,52,0,27,255,100,0,52,0,33,255,94,0,52,0,35,255,204,0,52,0,39,
-255,200,0,52,0,47,255,199,0,52,0,49,255,202,0,52,0,51,255,223,0,52,0,52,0,32,
-0,52,0,54,0,32,0,52,0,55,0,31,0,52,0,56,0,21,0,52,0,57,0,33,0,52,0,65,255,97,
-0,52,0,69,255,94,0,52,0,73,255,249,0,52,0,77,255,122,0,52,0,79,255,94,0,52,0,
-82,255,122,0,52,0,83,255,101,0,52,0,85,255,122,0,52,0,87,255,159,0,52,0,89,
-255,156,0,52,0,90,255,133,0,52,1,8,0,7,0,52,1,63,255,91,0,52,1,66,255,110,0,
-52,1,70,255,110,0,52,1,78,255,110,0,52,1,80,255,110,0,52,1,82,255,117,0,52,1,
-83,255,225,0,52,1,85,255,235,0,52,1,86,255,225,0,52,1,87,255,218,0,52,1,88,
-255,236,0,53,0,33,255,211,0,53,0,68,255,240,0,53,0,70,255,252,0,53,0,71,255,
-248,0,53,0,77,255,248,0,53,0,78,255,248,0,53,0,80,255,248,0,53,0,82,255,248,0,
-53,0,83,255,244,0,53,0,84,255,255,0,53,0,88,255,241,0,53,0,90,255,237,0,53,1,
-63,255,212,0,54,0,9,0,40,0,54,0,12,255,76,0,54,0,13,255,181,0,54,0,14,255,81,
-0,54,0,26,255,193,0,54,0,27,255,193,0,54,0,33,255,103,0,54,0,35,255,213,0,54,
-0,39,255,213,0,54,0,47,255,210,0,54,0,49,255,213,0,54,0,61,0,34,0,54,0,65,255,
-161,0,54,0,69,255,165,0,54,0,79,255,161,0,54,0,82,255,194,0,54,0,85,255,198,0,
-54,0,89,255,234,0,54,0,93,0,38,0,54,1,8,0,12,0,54,1,12,0,12,0,54,1,63,255,100,
-0,54,1,66,255,177,0,54,1,70,255,177,0,54,1,78,255,177,0,54,1,80,255,177,0,55,
-0,9,0,31,0,55,0,12,255,138,0,55,0,13,255,213,0,55,0,14,255,138,0,55,0,26,255,
-212,0,55,0,27,255,211,0,55,0,33,255,147,0,55,0,35,255,228,0,55,0,39,255,228,0,
-55,0,47,255,225,0,55,0,49,255,228,0,55,0,52,0,29,0,55,0,61,0,25,0,55,0,65,255,
-189,0,55,0,69,255,193,0,55,0,79,255,193,0,55,0,82,255,213,0,55,0,85,255,217,0,
-55,0,89,255,247,0,55,0,93,0,29,0,55,1,8,0,9,0,55,1,12,0,9,0,55,1,63,255,148,0,
-55,1,66,255,209,0,55,1,70,255,205,0,55,1,78,255,205,0,55,1,80,255,205,0,55,1,
-83,255,254,0,56,0,35,255,209,0,56,0,39,255,209,0,56,0,47,255,205,0,56,0,49,
-255,209,0,56,0,69,255,203,0,56,0,85,255,212,0,56,0,89,255,192,0,56,1,8,255,
-249,0,56,1,66,255,209,0,56,1,70,255,205,0,56,1,78,255,205,0,56,1,80,255,208,0,
-57,0,9,0,41,0,57,0,12,255,69,0,57,0,13,255,150,0,57,0,14,255,69,0,57,0,26,255,
-167,0,57,0,27,255,168,0,57,0,33,255,88,0,57,0,35,255,202,0,57,0,39,255,200,0,
-57,0,47,255,196,0,57,0,49,255,200,0,57,0,52,0,34,0,57,0,54,0,36,0,57,0,55,0,
-34,0,57,0,56,0,27,0,57,0,57,0,37,0,57,0,61,0,37,0,57,0,65,255,127,0,57,0,69,
-255,122,0,57,0,79,255,122,0,57,0,81,255,131,0,57,0,84,255,210,0,57,0,85,255,
-176,0,57,0,86,255,216,0,57,0,93,0,39,0,57,1,63,255,81,0,57,1,66,255,151,0,57,
-1,70,255,147,0,57,1,78,255,147,0,57,1,80,255,147,0,57,1,83,255,230,0,57,1,85,
-255,238,0,57,1,86,255,230,0,57,1,87,255,222,0,57,1,88,255,239,0,58,0,33,0,27,
-0,58,0,35,255,209,0,58,0,39,255,205,0,58,0,47,255,202,0,58,0,49,255,205,0,58,
-0,65,255,254,0,58,0,69,255,213,0,58,0,73,255,247,0,58,0,79,255,212,0,58,0,85,
-255,218,0,58,0,87,255,200,0,58,0,89,255,201,0,58,1,63,0,27,0,58,1,66,255,218,
-0,58,1,70,255,214,0,58,1,78,255,216,0,58,1,80,255,216,0,59,0,42,255,219,0,65,
-1,8,255,225,0,65,1,12,255,225,0,66,0,86,255,233,0,66,0,87,255,240,0,66,0,89,
-255,233,0,66,1,8,255,197,0,66,1,12,255,197,0,67,1,8,255,246,0,67,1,12,255,246,
-0,68,1,8,255,247,0,68,1,12,255,247,0,69,0,89,255,230,0,69,1,8,255,227,0,69,1,
-12,255,227,0,70,0,7,0,32,0,70,0,9,0,41,0,70,0,61,0,37,0,70,0,71,255,207,0,70,
-0,93,0,39,0,70,1,8,0,32,0,70,1,12,0,32,0,70,3,177,0,28,0,71,1,8,255,247,0,71,
-1,12,255,247,0,72,1,8,255,198,0,72,1,12,255,198,0,73,1,8,255,249,0,73,1,12,
-255,249,0,75,0,69,255,215,0,76,1,8,255,245,0,76,1,12,255,245,0,77,1,8,255,220,
-0,77,1,12,255,220,0,78,1,8,255,227,0,78,1,12,255,227,0,79,0,86,255,226,0,79,0,
-87,255,237,0,79,0,88,255,214,0,79,0,89,255,226,0,79,1,8,255,216,0,79,1,12,255,
-216,0,80,0,87,255,240,0,80,1,8,255,223,0,80,1,12,255,223,0,82,0,12,255,126,0,
-82,0,14,255,126,0,82,0,67,255,218,0,82,0,68,255,220,0,82,0,69,255,218,0,82,0,
-70,0,31,0,82,0,75,0,1,0,82,0,79,255,216,0,82,0,81,255,221,0,82,0,84,0,34,0,82,
-0,85,0,1,0,82,0,86,0,36,0,82,0,87,0,35,0,82,0,88,0,18,0,82,0,89,0,36,0,82,0,
-90,0,10,0,82,1,8,0,32,0,82,1,12,0,32,0,83,1,8,255,247,0,83,1,12,255,247,0,84,
-1,8,255,249,0,84,1,12,255,249,0,85,1,8,255,248,0,85,1,12,255,248,0,86,0,12,
-255,135,0,86,0,14,255,139,0,86,0,65,255,226,0,86,0,67,255,229,0,86,0,68,255,
-229,0,86,0,69,255,229,0,86,0,79,255,225,0,86,0,81,255,229,0,86,1,8,0,34,0,86,
-1,12,0,34,0,87,0,12,255,162,0,87,0,14,255,166,0,87,0,67,255,236,0,87,0,68,255,
-236,0,87,0,69,255,232,0,87,0,81,255,236,0,88,0,67,255,215,0,88,0,68,255,219,0,
-88,0,69,255,215,0,88,0,79,255,215,0,88,0,81,255,219,0,88,1,8,0,18,0,88,1,12,0,
-18,0,89,0,12,255,118,0,89,0,14,255,128,0,89,0,67,255,223,0,89,0,68,255,223,0,
-89,0,69,255,223,0,89,0,79,255,223,0,89,0,81,255,217,0,89,1,8,0,28,0,89,1,12,0,
-28,0,90,0,67,255,223,0,90,0,68,255,226,0,90,0,69,255,223,0,90,0,79,255,223,0,
-90,1,8,0,7,0,90,1,12,0,7,0,91,0,42,255,215,0,168,0,12,254,206,0,168,0,13,254,
-204,0,168,0,14,254,210,0,168,0,35,255,199,0,168,0,39,255,197,0,168,0,47,255,
-197,0,168,0,49,255,197,0,168,0,52,0,34,0,168,0,54,0,33,0,168,0,55,0,30,0,168,
-0,57,0,33,0,168,0,105,254,208,0,168,0,120,254,210,0,168,0,127,255,195,0,168,0,
-142,255,195,0,168,0,169,255,66,0,168,0,170,255,197,0,168,0,171,255,66,0,168,0,
-175,255,108,0,168,0,178,254,244,0,168,0,180,254,241,0,168,0,181,255,223,0,168,
-0,182,254,249,0,168,0,184,255,14,0,168,0,186,254,246,0,168,0,189,255,70,0,168,
-0,190,254,237,0,168,0,191,254,240,0,168,0,192,254,231,0,168,0,193,255,92,0,
-168,0,194,254,250,0,168,0,195,254,252,0,168,0,196,255,1,0,168,0,197,254,244,0,
-168,1,5,254,207,0,168,1,6,254,207,0,170,0,12,255,217,0,170,0,14,255,226,0,170,
-0,33,255,224,0,170,0,52,255,203,0,170,0,54,255,224,0,170,0,55,255,238,0,170,0,
-56,255,216,0,170,0,57,255,206,0,170,0,58,255,219,0,170,0,125,255,206,0,170,0,
-169,255,217,0,170,0,171,255,224,0,170,0,172,255,228,0,170,0,174,255,217,0,171,
-0,7,255,115,0,171,0,31,255,140,0,171,0,33,0,36,0,171,0,35,255,219,0,171,0,39,
-255,215,0,171,0,47,255,215,0,171,0,49,255,215,0,171,0,52,255,75,0,171,0,53,
-255,212,0,171,0,54,255,113,0,171,0,55,255,156,0,171,0,57,255,85,0,171,0,67,
-255,234,0,171,0,68,255,229,0,171,0,69,255,234,0,171,0,71,255,238,0,171,0,79,
-255,234,0,171,0,81,255,238,0,171,0,85,255,235,0,171,0,125,0,38,0,171,0,127,
-255,236,0,171,0,133,255,238,0,171,0,142,255,215,0,171,0,143,255,238,0,171,0,
-169,0,38,0,171,0,170,255,215,0,171,0,175,255,202,0,171,0,176,255,156,0,171,0,
-193,255,149,0,171,1,8,255,119,0,171,1,12,255,119,0,171,3,177,255,119,0,172,0,
-170,255,225,0,172,0,187,0,27,0,174,0,7,255,246,0,174,0,35,255,211,0,174,0,39,
-255,209,0,174,0,47,255,209,0,174,0,49,255,209,0,174,0,127,255,232,0,174,0,142,
-255,205,0,174,0,170,255,209,0,174,0,175,255,151,0,174,0,187,0,36,0,174,1,8,
-255,246,0,174,1,12,255,246,0,174,3,177,255,246,0,175,0,171,255,199,0,175,0,
-187,255,193,0,176,0,12,255,84,0,176,0,14,255,88,0,176,0,171,255,157,0,176,0,
-181,255,243,0,176,0,190,255,224,0,176,0,192,255,237,0,176,0,195,255,244,0,176,
-0,197,255,240,0,178,0,187,0,34,0,180,0,7,0,32,0,180,0,70,0,29,0,180,0,181,255,
-239,0,180,0,189,0,27,0,180,0,190,255,211,0,180,0,193,0,30,0,180,0,197,255,236,
-0,180,1,8,0,32,0,180,1,12,0,32,0,180,3,177,0,32,0,181,0,193,255,225,0,182,0,7,
-255,239,0,182,0,191,255,243,0,182,0,192,255,243,0,182,0,195,255,242,0,182,1,8,
-255,244,0,182,1,12,255,244,0,182,3,177,255,240,0,183,0,178,255,209,0,183,0,
-180,0,10,0,183,0,181,255,216,0,183,0,182,255,226,0,183,0,184,255,233,0,183,0,
-186,255,237,0,183,0,187,0,11,0,183,0,188,255,223,0,183,0,189,0,14,0,183,0,191,
-255,199,0,183,0,192,255,205,0,183,0,193,0,15,0,183,0,194,255,238,0,183,0,195,
-255,219,0,183,0,196,255,239,0,183,0,197,255,217,0,184,0,7,255,217,0,184,1,8,
-255,227,0,184,1,12,255,227,0,186,0,7,255,186,0,186,0,178,255,225,0,186,0,180,
-255,191,0,186,0,185,255,217,0,186,0,186,255,239,0,186,0,187,0,37,0,186,0,189,
-255,214,0,186,0,193,255,190,0,186,0,195,255,212,0,186,1,8,255,249,0,186,1,12,
-255,249,0,186,3,177,255,184,0,187,0,7,255,58,0,187,0,70,255,209,0,187,0,180,
-255,145,0,187,0,185,255,212,0,187,0,187,0,33,0,187,0,189,255,212,0,187,0,193,
-255,125,0,187,1,8,255,63,0,187,1,12,255,63,0,187,3,177,255,58,0,188,0,178,255,
-179,0,188,0,187,0,17,0,190,0,87,255,240,0,190,0,88,255,226,0,190,0,90,255,232,
-0,190,0,193,255,215,0,190,1,8,255,223,0,190,1,12,255,223,0,192,0,180,0,17,0,
-192,0,189,0,19,0,192,0,193,0,20,0,193,0,7,0,34,0,193,0,70,0,29,0,193,0,120,
-255,233,0,193,0,180,0,27,0,193,0,181,255,223,0,193,0,189,0,29,0,193,0,191,255,
-214,0,193,0,192,255,211,0,193,0,193,0,29,0,193,1,8,0,34,0,193,1,12,0,34,0,193,
-1,63,255,122,0,193,1,66,255,220,0,193,1,70,255,216,0,193,1,78,255,218,0,193,1,
-80,255,216,0,193,1,82,255,234,0,193,1,83,0,29,0,193,1,85,0,27,0,193,1,86,0,20,
-0,193,1,87,0,8,0,193,1,88,0,27,0,193,3,177,0,34,0,195,0,88,255,220,0,195,0,90,
-255,220,0,196,0,88,255,228,0,196,0,90,255,228,0,197,0,88,255,226,0,197,0,90,
-255,226,0,197,0,180,255,234,0,198,0,7,255,170,0,198,0,198,255,185,0,198,0,202,
-255,186,0,198,0,206,255,233,0,198,0,210,255,223,0,198,0,212,255,194,0,198,0,
-215,255,188,0,198,0,233,255,164,0,198,0,236,255,239,0,198,0,239,255,200,0,198,
-1,8,255,175,0,198,1,12,255,175,0,198,3,177,255,171,0,200,0,7,255,126,0,200,0,
-202,255,67,0,200,0,206,255,232,0,200,0,209,255,243,0,200,0,210,255,220,0,200,
-0,212,255,194,0,200,0,215,255,141,0,200,0,233,255,161,0,200,0,236,255,241,0,
-200,0,239,255,201,0,200,1,8,255,146,0,200,1,12,255,146,0,200,3,177,255,135,0,
-201,0,7,255,125,0,201,0,198,255,68,0,201,0,202,255,66,0,201,0,206,255,230,0,
-201,0,210,255,219,0,201,0,212,255,193,0,201,0,215,255,140,0,201,0,233,255,159,
-0,201,0,236,255,240,0,201,0,239,255,200,0,201,1,8,255,144,0,201,1,12,255,144,
-0,201,3,177,255,134,0,202,0,198,255,181,0,202,0,202,255,179,0,202,0,215,255,
-184,0,202,0,233,255,158,0,202,0,236,255,225,0,202,0,239,255,194,0,204,0,198,
-255,206,0,204,0,210,255,225,0,204,0,212,255,202,0,204,0,215,255,208,0,204,0,
-225,255,227,0,204,0,233,255,168,0,204,0,236,255,242,0,204,0,239,255,204,0,205,
-0,198,255,196,0,205,0,200,0,40,0,205,0,202,255,197,0,205,0,205,0,46,0,205,0,
-209,0,40,0,205,0,212,255,197,0,205,0,215,255,199,0,205,0,224,0,44,0,205,0,229,
-0,40,0,205,0,236,255,196,0,205,0,247,0,40,0,205,0,253,255,213,0,206,0,13,255,
-141,0,206,0,199,255,206,0,206,0,200,0,36,0,206,0,209,0,36,0,206,0,221,255,210,
-0,206,0,229,0,37,0,206,0,233,255,181,0,206,0,236,255,161,0,206,0,247,0,37,0,
-206,0,253,255,206,0,207,0,17,255,236,0,207,0,18,255,253,0,207,0,19,0,7,0,207,
-0,20,0,15,0,207,0,21,0,4,0,207,0,22,255,253,0,207,0,23,255,228,0,207,0,24,0,5,
-0,207,0,25,255,255,0,207,0,207,0,11,0,207,0,209,255,239,0,207,0,210,255,236,0,
-207,0,215,255,228,0,208,0,65,255,252,0,208,0,69,255,255,0,208,0,79,255,252,0,
-208,0,85,255,255,0,208,0,89,0,2,0,210,0,7,0,15,0,210,0,13,255,177,0,210,0,14,
-255,135,0,210,0,67,255,229,0,210,0,68,255,229,0,210,0,69,255,229,0,210,0,79,
-255,229,0,210,0,81,255,225,0,210,0,199,255,210,0,210,0,200,255,138,0,210,0,
-205,255,53,0,210,0,209,255,138,0,210,0,215,0,36,0,210,0,222,255,187,0,210,0,
-223,255,187,0,210,0,224,255,69,0,210,0,227,255,187,0,210,0,228,255,187,0,210,
-0,229,255,116,0,210,0,230,255,187,0,210,0,231,255,187,0,210,0,232,255,187,0,
-210,0,234,255,154,0,210,0,235,255,187,0,210,0,236,255,207,0,210,0,237,255,187,
-0,210,0,238,255,185,0,210,0,240,255,187,0,210,0,241,255,187,0,210,0,243,255,
-185,0,210,0,244,255,172,0,210,0,246,255,150,0,210,0,247,255,116,0,210,0,248,
-255,187,0,210,0,250,255,187,0,210,0,254,255,153,0,210,1,8,0,31,0,210,1,12,0,
-31,0,210,3,177,0,13,0,211,0,200,0,39,0,211,0,205,0,96,0,211,0,209,0,49,0,211,
-0,212,255,195,0,211,0,224,0,104,0,211,0,229,0,58,0,211,0,236,255,194,0,211,0,
-247,0,39,0,214,0,198,255,218,0,214,0,200,0,42,0,214,0,205,0,48,0,214,0,209,0,
-42,0,214,0,210,0,22,0,214,0,212,255,218,0,214,0,215,255,219,0,214,0,218,255,
-242,0,214,0,224,0,45,0,214,0,229,0,40,0,214,0,233,255,223,0,214,0,236,255,217,
-0,214,0,239,255,225,0,214,0,247,0,40,0,215,0,7,255,124,0,215,0,198,255,65,0,
-215,0,202,255,63,0,215,0,212,255,190,0,215,0,215,255,137,0,215,0,233,255,158,
-0,215,0,239,255,198,0,215,1,8,255,139,0,215,1,12,255,139,0,215,3,177,255,133,
-0,217,0,7,255,131,0,217,0,198,255,69,0,217,0,202,255,67,0,217,0,212,255,194,0,
-217,0,215,255,141,0,217,0,233,255,164,0,217,0,239,255,200,0,217,1,8,255,145,0,
-217,1,12,255,145,0,217,3,177,255,135,0,218,0,198,255,206,0,218,0,200,255,207,
-0,218,0,202,255,205,0,218,0,205,255,202,0,218,0,206,255,207,0,218,0,209,255,
-207,0,218,0,210,255,217,0,218,0,229,255,214,0,218,0,247,255,214,0,219,0,198,
-255,202,0,219,0,200,255,206,0,219,0,202,255,202,0,219,0,205,255,203,0,219,0,
-206,255,207,0,219,0,209,255,206,0,219,0,210,255,217,0,219,0,224,255,203,0,219,
-0,229,255,214,0,219,0,247,255,214,0,220,0,35,255,250,0,220,0,39,255,250,0,220,
-0,47,255,253,0,220,0,49,255,250,0,220,0,52,255,214,0,220,0,53,255,249,0,220,0,
-54,255,236,0,220,0,55,255,243,0,220,0,57,255,229,0,220,0,69,255,252,0,220,0,
-79,255,250,0,220,0,85,255,253,0,220,0,89,0,6,0,220,1,66,255,253,0,220,1,70,
-255,249,0,220,1,78,255,249,0,220,1,80,255,249,0,220,1,83,0,1,0,220,1,84,255,
-253,0,220,1,85,0,1,0,220,1,88,0,1,0,221,0,224,255,225,0,221,0,225,255,224,0,
-221,0,233,255,223,0,221,0,239,255,241,0,222,0,7,255,191,0,222,0,225,255,237,0,
-222,0,233,255,230,0,222,0,236,255,238,0,222,0,239,255,235,0,222,1,8,255,230,0,
-222,1,12,255,230,0,222,3,177,255,190,0,223,0,224,255,132,0,223,0,229,255,171,
-0,223,0,246,255,211,0,223,0,247,255,171,0,224,0,224,0,42,0,224,0,233,255,219,
-0,224,0,236,255,216,0,224,0,239,255,223,0,225,0,7,0,11,0,225,0,234,255,236,0,
-225,0,236,255,245,0,225,0,246,255,218,0,225,0,254,255,220,0,225,1,8,0,11,0,
-225,1,12,0,11,0,225,3,177,0,11,0,226,0,7,255,232,0,226,0,233,255,237,0,226,0,
-236,255,240,0,226,1,8,255,236,0,226,1,12,255,236,0,226,3,177,255,232,0,228,0,
-221,255,233,0,228,0,234,255,224,0,228,0,236,255,242,0,228,0,246,255,211,0,228,
-0,254,255,213,0,228,1,8,0,12,0,228,1,12,0,12,0,228,1,66,255,212,0,228,1,70,
-255,208,0,228,1,78,255,212,0,228,1,80,255,212,0,233,0,7,0,34,0,233,0,70,0,29,
-0,233,0,224,255,133,0,233,0,229,255,172,0,233,0,234,255,223,0,233,0,246,255,
-211,0,233,0,247,255,172,0,233,0,254,255,213,0,233,1,8,0,31,0,233,1,12,0,31,0,
-233,1,63,255,122,0,233,1,66,255,220,0,233,1,70,255,216,0,233,1,78,255,218,0,
-233,1,80,255,216,0,233,1,82,255,234,0,233,1,83,0,29,0,233,1,85,0,27,0,233,1,
-86,0,20,0,233,1,87,0,8,0,233,1,88,0,27,0,233,3,177,0,34,0,234,0,88,255,244,0,
-234,0,90,255,244,0,234,0,225,255,236,0,234,0,229,255,246,0,234,0,233,255,229,
-0,234,0,239,255,237,0,234,0,247,255,246,0,235,0,224,0,37,0,235,0,229,0,32,0,
-235,0,233,255,222,0,235,0,236,255,220,0,235,0,239,255,224,0,235,0,247,0,32,0,
-238,0,224,0,43,0,238,0,229,0,38,0,238,0,233,255,206,0,238,0,236,255,203,0,238,
-0,239,255,215,0,238,0,242,255,242,0,238,0,246,255,224,0,238,0,247,0,38,0,239,
-0,233,255,122,0,239,0,236,255,203,0,239,0,239,255,178,0,241,0,7,254,253,0,241,
-0,233,255,118,0,241,0,236,255,202,0,241,0,239,255,174,0,241,1,8,255,35,0,241,
-1,12,255,39,0,241,3,177,255,10,0,242,0,224,255,218,0,242,0,225,255,218,0,242,
-0,229,255,225,0,242,0,239,255,222,0,242,0,247,255,225,0,243,0,224,255,217,0,
-243,0,225,255,217,0,243,0,226,255,245,0,243,0,229,255,223,0,243,0,239,255,232,
-0,246,0,7,255,240,0,246,1,8,255,244,0,246,1,12,255,244,0,246,3,177,255,240,0,
-247,0,225,255,232,0,247,0,233,255,116,0,247,0,234,0,11,0,247,0,236,255,200,0,
-247,0,239,255,172,0,248,0,225,255,236,0,248,0,233,255,121,0,248,0,236,255,203,
-0,248,0,239,255,177,1,7,0,33,255,120,1,7,0,52,0,12,1,7,0,54,0,16,1,7,0,55,0,
-18,1,7,0,57,0,9,1,7,0,65,255,225,1,7,0,67,255,217,1,7,0,68,255,197,1,7,0,69,
-255,217,1,7,0,70,0,5,1,7,0,71,255,222,1,7,0,77,255,247,1,7,0,78,255,247,1,7,0,
-79,255,217,1,7,0,81,255,222,1,7,0,83,255,237,1,7,0,84,0,11,1,7,0,85,255,254,1,
-7,0,86,0,36,1,7,0,87,0,32,1,7,0,88,0,18,1,7,0,89,0,36,1,7,0,90,0,8,1,7,1,7,
-255,241,1,8,0,68,255,172,1,8,0,77,255,243,1,8,0,82,255,247,1,8,0,83,255,216,1,
-8,0,84,0,6,1,8,0,86,0,27,1,8,1,8,255,245,1,11,0,33,255,118,1,11,0,52,0,9,1,11,
-0,54,0,10,1,11,0,55,0,12,1,11,0,57,0,7,1,11,0,65,255,223,1,11,0,67,255,215,1,
-11,0,68,255,191,1,11,0,69,255,215,1,11,0,71,255,215,1,11,0,77,255,245,1,11,0,
-78,255,245,1,11,0,79,255,211,1,11,0,80,255,249,1,11,0,81,255,219,1,11,0,82,
-255,245,1,11,0,83,255,230,1,11,0,84,0,4,1,11,0,85,255,252,1,11,0,86,0,27,1,11,
-0,87,0,23,1,11,0,88,0,12,1,11,0,89,0,27,1,11,0,90,0,3,1,63,1,66,255,227,1,63,
-1,70,255,227,1,63,1,78,255,227,1,63,1,80,255,227,1,63,1,83,255,125,1,63,1,84,
-255,216,1,63,1,85,255,139,1,63,1,86,255,175,1,63,1,88,255,123,1,66,1,66,255,
-254,1,66,1,70,255,254,1,66,1,78,255,254,1,66,1,80,255,254,1,67,1,85,255,220,1,
-67,1,86,255,234,1,68,1,85,0,4,1,68,1,88,0,4,1,69,1,63,255,162,1,74,1,66,255,
-212,1,74,1,70,255,208,1,74,1,78,255,212,1,74,1,80,255,212,1,75,1,63,0,35,1,75,
-1,66,255,224,1,75,1,70,255,220,1,75,1,78,255,222,1,75,1,80,255,223,1,75,1,83,
-255,115,1,75,1,84,255,215,1,75,1,85,255,107,1,75,1,86,255,167,1,75,1,88,255,
-101,1,78,1,63,255,229,1,78,1,83,255,219,1,78,1,85,255,225,1,78,1,86,255,239,1,
-78,1,87,255,215,1,78,1,88,255,211,1,79,1,63,255,168,1,79,1,68,255,245,1,79,1,
-71,255,245,1,79,1,72,255,245,1,80,1,63,0,13,1,80,1,83,255,208,1,80,1,84,255,
-246,1,80,1,85,255,213,1,80,1,86,255,226,1,80,1,88,255,201,1,81,1,66,255,252,1,
-81,1,70,255,252,1,81,1,78,255,252,1,81,1,80,255,252,1,81,1,83,255,228,1,81,1,
-84,255,245,1,81,1,85,255,226,1,81,1,86,255,233,1,81,1,88,255,219,1,83,1,63,
-255,122,1,83,1,66,255,220,1,83,1,70,255,216,1,83,1,78,255,218,1,83,1,80,255,
-216,1,83,1,82,255,234,1,83,1,83,0,29,1,83,1,85,0,27,1,83,1,86,0,20,1,83,1,87,
-0,8,1,83,1,88,0,27,1,84,1,63,255,221,1,85,1,63,255,140,1,85,1,66,255,228,1,85,
-1,70,255,224,1,85,1,78,255,224,1,85,1,80,255,224,1,86,1,63,255,182,1,86,1,66,
-255,239,1,86,1,70,255,239,1,86,1,78,255,239,1,86,1,80,255,239,1,86,1,83,0,28,
-1,87,1,66,255,218,1,87,1,70,255,214,1,87,1,78,255,214,1,87,1,80,255,214,1,88,
-1,63,255,124,1,88,1,66,255,217,1,88,1,70,255,213,1,88,1,78,255,213,1,88,1,80,
-255,213,1,88,1,83,0,31,1,88,1,85,0,33,1,88,1,86,0,27,1,88,1,87,0,14,1,88,1,88,
-0,33,1,89,1,63,0,25,1,89,1,66,255,224,1,89,1,70,255,224,1,89,1,78,255,224,1,
-89,1,80,255,224,1,111,0,9,0,40,1,111,0,12,255,76,1,111,0,13,255,181,1,111,0,
-14,255,81,1,111,0,26,255,193,1,111,0,27,255,193,1,111,0,33,255,103,1,111,0,35,
-255,213,1,111,0,39,255,213,1,111,0,47,255,210,1,111,0,49,255,213,1,111,0,61,0,
-34,1,111,0,65,255,161,1,111,0,69,255,165,1,111,0,79,255,161,1,111,0,82,255,
-194,1,111,0,85,255,198,1,111,0,89,255,234,1,111,0,93,0,38,1,111,1,8,0,12,1,
-111,1,12,0,12,1,111,1,63,255,100,1,111,1,66,255,177,1,111,1,70,255,177,1,111,
-1,78,255,177,1,111,1,80,255,177,1,112,0,12,255,135,1,112,0,14,255,139,1,112,0,
-65,255,226,1,112,0,67,255,229,1,112,0,68,255,229,1,112,0,69,255,229,1,112,0,
-79,255,225,1,112,0,81,255,229,1,112,1,8,0,34,1,112,1,12,0,34,1,113,0,35,255,
-253,1,113,0,39,255,253,1,113,0,47,255,254,1,113,0,49,255,253,1,113,0,65,0,8,1,
-113,0,73,255,247,1,113,0,82,255,255,1,113,0,85,255,252,1,113,0,89,0,16,1,113,
-0,90,0,2,1,114,1,8,255,234,1,114,1,12,255,234,1,137,0,65,255,250,1,137,0,69,
-255,246,1,137,0,79,255,246,1,137,0,85,255,247,1,137,0,89,255,253,1,141,0,35,
-255,250,1,141,0,39,255,250,1,141,0,47,255,247,1,141,0,49,255,250,1,141,0,73,
-255,244,1,141,0,82,255,250,1,141,0,85,255,250,1,141,0,89,0,11,1,141,0,90,255,
-247,1,141,1,66,255,250,1,141,1,70,255,249,1,141,1,78,255,249,1,141,1,80,255,
-250,1,142,1,8,255,246,1,142,1,12,255,246,0,0,0,0,0,22,1,14,0,1,0,0,0,0,0,0,0,
-31,0,0,0,1,0,0,0,0,0,1,0,6,0,31,0,1,0,0,0,0,0,2,0,7,0,37,0,1,0,0,0,0,0,3,0,18,
-0,44,0,1,0,0,0,0,0,4,0,14,0,62,0,1,0,0,0,0,0,5,0,21,0,76,0,1,0,0,0,0,0,6,0,14,
-0,97,0,1,0,0,0,0,0,7,0,32,0,111,0,1,0,0,0,0,0,9,0,6,0,143,0,1,0,0,0,0,0,11,0,
-10,0,149,0,1,0,0,0,0,0,12,0,19,0,159,0,3,0,1,4,9,0,0,0,62,0,178,0,3,0,1,4,9,0,
-1,0,12,0,240,0,3,0,1,4,9,0,2,0,14,0,252,0,3,0,1,4,9,0,3,0,36,1,10,0,3,0,1,4,9,
-0,4,0,28,1,46,0,3,0,1,4,9,0,5,0,42,1,74,0,3,0,1,4,9,0,6,0,28,1,116,0,3,0,1,4,
-9,0,7,0,64,1,144,0,3,0,1,4,9,0,9,0,12,1,208,0,3,0,1,4,9,0,11,0,20,1,220,0,3,0,
-1,4,9,0,12,0,38,1,240,70,111,110,116,32,100,97,116,97,32,99,111,112,121,114,
-105,103,104,116,32,71,111,111,103,108,101,32,50,48,49,49,82,111,98,111,116,
-111,82,101,103,117,108,97,114,71,111,111,103,108,101,58,82,111,98,111,116,111,
-58,50,48,49,49,82,111,98,111,116,111,32,82,101,103,117,108,97,114,86,101,114,
-115,105,111,110,32,49,46,48,48,48,48,48,59,32,50,48,49,49,82,111,98,111,116,
-111,45,82,101,103,117,108,97,114,82,111,98,111,116,111,32,105,115,32,97,32,
-116,114,97,100,101,109,97,114,107,32,111,102,32,71,111,111,103,108,101,46,71,
-111,111,103,108,101,71,111,111,103,108,101,46,99,111,109,67,104,114,105,115,
-116,105,97,110,32,82,111,98,101,114,116,115,111,110,0,70,0,111,0,110,0,116,0,
-32,0,100,0,97,0,116,0,97,0,32,0,99,0,111,0,112,0,121,0,114,0,105,0,103,0,104,
-0,116,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,32,0,50,0,48,0,49,0,49,0,82,0,
-111,0,98,0,111,0,116,0,111,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,71,0,111,
-0,111,0,103,0,108,0,101,0,58,0,82,0,111,0,98,0,111,0,116,0,111,0,58,0,50,0,48,
-0,49,0,49,0,82,0,111,0,98,0,111,0,116,0,111,0,32,0,82,0,101,0,103,0,117,0,108,
-0,97,0,114,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32,0,49,0,46,0,48,0,48,
-0,48,0,48,0,48,0,59,0,32,0,50,0,48,0,49,0,49,0,82,0,111,0,98,0,111,0,116,0,
-111,0,45,0,82,0,101,0,103,0,117,0,108,0,97,0,114,0,82,0,111,0,98,0,111,0,116,
-0,111,0,32,0,105,0,115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97,
-0,114,0,107,0,32,0,111,0,102,0,32,0,71,0,111,0,111,0,103,0,108,0,101,0,46,0,
-71,0,111,0,111,0,103,0,108,0,101,0,71,0,111,0,111,0,103,0,108,0,101,0,46,0,99,
-0,111,0,109,0,67,0,104,0,114,0,105,0,115,0,116,0,105,0,97,0,110,0,32,0,82,0,
-111,0,98,0,101,0,114,0,116,0,115,0,111,0,110,0,2,0,0,0,0,0,0,255,106,0,100,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,178,0,0,1,2,0,2,0,3,0,7,0,8,0,9,0,10,
-0,11,0,12,0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,0,21,0,22,0,23,0,24,0,25,0,
-26,0,27,0,28,0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,0,37,0,38,0,39,0,40,0,41,
-0,42,0,43,0,44,0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,0,53,0,54,0,55,0,56,0,
-57,0,58,0,59,0,60,0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0,72,
-0,73,0,74,0,75,0,76,0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,0,85,0,86,0,87,0,
-88,0,89,0,90,0,91,0,92,0,93,0,94,0,95,0,96,0,97,0,163,0,132,0,133,0,189,0,150,
-0,232,0,134,0,142,0,139,0,157,0,169,0,164,0,138,1,3,0,131,0,147,0,242,0,243,0,
-141,0,151,0,136,1,4,0,222,0,241,0,158,0,170,0,245,0,244,0,246,0,162,0,144,0,
-240,0,145,0,237,0,137,0,160,0,234,0,184,0,161,0,238,1,5,0,215,1,6,0,226,0,227,
-1,7,1,8,0,176,0,177,1,9,1,10,0,166,1,11,1,12,1,13,1,14,1,15,0,216,0,225,0,219,
-0,220,0,221,0,224,0,217,0,223,1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23,1,24,1,
-25,1,26,1,27,1,28,1,29,1,30,1,31,1,32,0,159,1,33,1,34,1,35,1,36,1,37,1,38,1,
-39,1,40,1,41,1,42,1,43,0,155,1,44,1,45,1,46,1,47,1,48,1,49,1,50,1,51,1,52,1,
-53,1,54,1,55,1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63,1,64,1,65,1,66,1,67,1,68,
-1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,
-84,1,85,1,86,1,87,1,88,1,89,1,90,1,91,1,92,1,93,1,94,1,95,1,96,1,97,1,98,1,99,
-1,100,1,101,1,102,1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110,1,111,1,112,
-1,113,1,114,0,178,0,179,0,182,0,183,0,196,1,115,0,180,0,181,0,197,0,130,0,194,
-0,135,0,171,0,198,0,190,0,191,0,188,1,116,1,117,1,118,0,140,1,119,1,120,1,121,
-1,122,0,152,0,154,0,153,0,239,0,165,0,146,0,156,0,143,0,148,0,149,1,123,1,124,
-1,125,1,126,1,127,1,128,1,129,1,130,1,131,1,132,1,133,1,134,1,135,1,136,1,137,
-1,138,1,139,1,140,1,141,1,142,1,143,1,144,1,145,1,146,1,147,1,148,1,149,1,150,
-1,151,1,152,1,153,1,154,1,155,1,156,1,157,1,158,1,159,1,160,1,161,1,162,1,163,
-1,164,1,165,1,166,1,167,1,168,1,169,1,170,1,171,1,172,1,173,1,174,1,175,1,176,
-1,177,1,178,1,179,1,180,1,181,1,182,1,183,1,184,1,185,1,186,1,187,1,188,1,189,
-1,190,1,191,1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199,1,200,1,201,1,202,
-1,203,1,204,1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212,1,213,1,214,1,215,
-1,216,1,217,1,218,1,219,1,220,1,221,1,222,1,223,1,224,1,225,1,226,1,227,1,228,
-1,229,1,230,1,231,1,232,1,233,1,234,1,235,1,236,1,237,0,185,1,238,1,239,1,240,
-1,241,1,242,1,243,1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,251,1,252,1,253,
-1,254,1,255,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,
-2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,2,26,2,27,2,28,2,29,2,
-30,2,31,2,32,2,33,2,34,2,35,2,36,2,37,0,172,2,38,0,233,2,39,2,40,2,41,0,173,0,
-201,0,199,0,174,0,98,0,99,2,42,0,100,0,203,0,101,0,200,0,202,0,207,0,204,0,
-205,0,206,0,102,0,211,0,208,0,209,0,175,0,103,0,214,0,212,0,213,0,104,0,235,0,
-106,0,105,0,107,0,109,0,108,0,110,2,43,0,111,0,113,0,112,0,114,0,115,0,117,0,
-116,0,118,0,119,0,120,0,122,0,121,0,123,0,125,0,124,0,127,0,126,0,128,0,129,0,
-236,0,186,2,44,2,45,2,46,2,47,2,48,2,49,0,253,0,254,2,50,2,51,2,52,2,53,0,255,
-1,0,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,64,2,65,2,66,2,67,0,
-248,0,249,2,68,2,69,2,70,2,71,2,72,2,73,2,74,2,75,2,76,2,77,2,78,2,79,2,80,2,
-81,2,82,2,83,2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91,2,92,2,93,2,94,2,95,2,96,
-2,97,2,98,2,99,2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107,2,108,2,109,2,
-110,2,111,2,112,2,113,2,114,2,115,2,116,2,117,2,118,2,119,0,251,0,252,0,228,0,
-229,2,120,2,121,2,122,2,123,2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131,2,
-132,2,133,2,134,2,135,2,136,2,137,2,138,2,139,0,187,2,140,2,141,2,142,2,143,0,
-230,0,231,2,144,2,145,2,146,2,147,2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,
-155,2,156,2,157,2,158,2,159,2,160,2,161,2,162,2,163,2,164,2,165,2,166,2,167,2,
-168,2,169,2,170,2,171,2,172,2,173,2,174,2,175,2,176,2,177,2,178,2,179,2,180,2,
-181,2,182,2,183,2,184,2,185,2,186,2,187,2,188,2,189,2,190,2,191,2,192,2,193,2,
-194,2,195,2,196,2,197,2,198,2,199,2,200,2,201,2,202,2,203,2,204,2,205,2,206,2,
-207,2,208,2,209,2,210,2,211,2,212,2,213,2,214,2,215,2,216,2,217,2,218,2,219,2,
-220,2,221,2,222,2,223,2,224,2,225,2,226,2,227,2,228,2,229,2,230,2,231,2,232,2,
-233,2,234,2,235,2,236,2,237,2,238,2,239,2,240,2,241,2,242,2,243,2,244,2,245,2,
-246,2,247,2,248,2,249,2,250,2,251,2,252,2,253,2,254,2,255,3,0,3,1,3,2,3,3,3,4,
-3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12,3,13,3,14,3,15,3,16,3,17,3,18,3,19,3,20,3,
-21,3,22,3,23,3,24,3,25,3,26,3,27,3,28,3,29,3,30,3,31,3,32,3,33,3,34,3,35,3,36,
-3,37,3,38,3,39,3,40,3,41,3,42,3,43,3,44,3,45,3,46,3,47,3,48,3,49,3,50,3,51,3,
-52,3,53,3,54,3,55,3,56,3,57,3,58,3,59,3,60,3,61,3,62,3,63,3,64,3,65,3,66,3,67,
-3,68,3,69,3,70,3,71,3,72,3,73,3,74,3,75,3,76,3,77,3,78,3,79,3,80,3,81,3,82,3,
-83,3,84,3,85,3,86,3,87,3,88,3,89,3,90,3,91,3,92,3,93,3,94,3,95,3,96,3,97,3,98,
-3,99,3,100,3,101,3,102,3,103,3,104,3,105,3,106,3,107,3,108,3,109,3,110,3,111,
-3,112,3,113,3,114,3,115,3,116,3,117,3,118,3,119,3,120,3,121,3,122,3,123,3,124,
-3,125,3,126,3,127,3,128,3,129,3,130,3,131,3,132,3,133,3,134,3,135,3,136,3,137,
-3,138,3,139,3,140,3,141,3,142,3,143,3,144,3,145,3,146,3,147,3,148,3,149,3,150,
-3,151,3,152,3,153,3,154,3,155,3,156,3,157,3,158,3,159,3,160,3,161,3,162,3,163,
-3,164,3,165,3,166,3,167,3,168,3,169,3,170,3,171,3,172,3,173,3,174,3,175,3,176,
-3,177,3,178,3,179,3,180,3,181,3,182,3,183,3,184,3,185,3,186,0,247,3,187,0,6,0,
-4,0,5,5,46,110,117,108,108,6,109,97,99,114,111,110,14,112,101,114,105,111,100,
-99,101,110,116,101,114,101,100,4,72,98,97,114,12,107,103,114,101,101,110,108,
-97,110,100,105,99,3,69,110,103,3,101,110,103,4,116,98,97,114,5,108,111,110,
-103,115,5,79,104,111,114,110,5,111,104,111,114,110,5,85,104,111,114,110,5,117,
-104,111,114,110,7,117,110,105,48,50,51,55,7,117,110,105,48,50,70,51,9,103,114,
-97,118,101,99,111,109,98,9,97,99,117,116,101,99,111,109,98,9,116,105,108,100,
-101,99,111,109,98,7,117,110,105,48,51,48,70,5,116,111,110,111,115,13,100,105,
-101,114,101,115,105,115,116,111,110,111,115,9,97,110,111,116,101,108,101,105,
-97,5,71,97,109,109,97,5,68,101,108,116,97,5,84,104,101,116,97,6,76,97,109,98,
-100,97,2,88,105,2,80,105,5,83,105,103,109,97,3,80,104,105,3,80,115,105,5,97,
-108,112,104,97,4,98,101,116,97,5,103,97,109,109,97,5,100,101,108,116,97,7,101,
-112,115,105,108,111,110,4,122,101,116,97,3,101,116,97,5,116,104,101,116,97,4,
-105,111,116,97,6,108,97,109,98,100,97,2,120,105,3,114,104,111,6,115,105,103,
-109,97,49,5,115,105,103,109,97,3,116,97,117,7,117,112,115,105,108,111,110,3,
-112,104,105,3,112,115,105,5,111,109,101,103,97,7,117,110,105,48,52,48,50,7,
-117,110,105,48,52,48,52,7,117,110,105,48,52,48,57,7,117,110,105,48,52,48,65,7,
-117,110,105,48,52,48,66,7,117,110,105,48,52,48,70,7,117,110,105,48,52,49,49,7,
-117,110,105,48,52,49,52,7,117,110,105,48,52,49,54,7,117,110,105,48,52,49,55,7,
-117,110,105,48,52,49,56,7,117,110,105,48,52,49,66,7,117,110,105,48,52,50,51,7,
-117,110,105,48,52,50,54,7,117,110,105,48,52,50,55,7,117,110,105,48,52,50,56,7,
-117,110,105,48,52,50,57,7,117,110,105,48,52,50,65,7,117,110,105,48,52,50,66,7,
-117,110,105,48,52,50,67,7,117,110,105,48,52,50,68,7,117,110,105,48,52,50,69,7,
-117,110,105,48,52,50,70,7,117,110,105,48,52,51,49,7,117,110,105,48,52,51,50,7,
-117,110,105,48,52,51,51,7,117,110,105,48,52,51,52,7,117,110,105,48,52,51,54,7,
-117,110,105,48,52,51,55,7,117,110,105,48,52,51,56,7,117,110,105,48,52,51,65,7,
-117,110,105,48,52,51,66,7,117,110,105,48,52,51,67,7,117,110,105,48,52,51,68,7,
-117,110,105,48,52,51,70,7,117,110,105,48,52,52,50,7,117,110,105,48,52,52,52,7,
-117,110,105,48,52,52,54,7,117,110,105,48,52,52,55,7,117,110,105,48,52,52,56,7,
-117,110,105,48,52,52,57,7,117,110,105,48,52,52,65,7,117,110,105,48,52,52,66,7,
-117,110,105,48,52,52,67,7,117,110,105,48,52,52,68,7,117,110,105,48,52,52,69,7,
-117,110,105,48,52,52,70,7,117,110,105,48,52,53,50,7,117,110,105,48,52,53,52,7,
-117,110,105,48,52,53,57,7,117,110,105,48,52,53,65,7,117,110,105,48,52,53,66,7,
-117,110,105,48,52,53,70,7,117,110,105,48,52,54,48,7,117,110,105,48,52,54,49,7,
-117,110,105,48,52,55,50,7,117,110,105,48,52,55,51,7,117,110,105,48,52,56,51,7,
-117,110,105,48,52,56,52,7,117,110,105,48,52,56,53,7,117,110,105,48,52,56,54,7,
-117,110,105,48,52,69,48,7,117,110,105,48,52,69,49,13,113,117,111,116,101,114,
-101,118,101,114,115,101,100,7,117,110,105,50,48,55,52,4,108,105,114,97,4,69,
-117,114,111,9,111,110,101,101,105,103,104,116,104,12,116,104,114,101,101,101,
-105,103,104,116,104,115,11,102,105,118,101,101,105,103,104,116,104,115,12,115,
-101,118,101,110,101,105,103,104,116,104,115,8,100,111,116,98,101,108,111,119,
-4,104,111,111,107,19,99,105,114,99,117,109,102,108,101,120,97,99,117,116,101,
-99,111,109,98,19,99,105,114,99,117,109,102,108,101,120,103,114,97,118,101,99,
-111,109,98,18,99,105,114,99,117,109,102,108,101,120,104,111,111,107,99,111,
-109,98,19,99,105,114,99,117,109,102,108,101,120,116,105,108,100,101,99,111,
-109,98,14,98,114,101,118,101,97,99,117,116,101,99,111,109,98,13,98,114,101,
-118,101,104,111,111,107,99,111,109,98,14,98,114,101,118,101,116,105,108,100,
-101,99,111,109,98,11,99,121,114,105,108,108,105,99,116,105,99,16,99,121,114,
-105,108,108,105,99,104,111,111,107,108,101,102,116,12,99,121,114,105,108,108,
-105,99,104,111,111,107,14,108,97,114,103,101,114,105,103,104,116,104,111,111,
-107,8,111,110,101,46,108,110,117,109,8,116,119,111,46,108,110,117,109,10,116,
-104,114,101,101,46,108,110,117,109,9,102,111,117,114,46,108,110,117,109,9,102,
-105,118,101,46,108,110,117,109,8,115,105,120,46,108,110,117,109,10,115,101,
-118,101,110,46,108,110,117,109,10,101,105,103,104,116,46,108,110,117,109,9,
-110,105,110,101,46,108,110,117,109,9,122,101,114,111,46,108,110,117,109,6,65,
-46,115,109,99,112,14,98,114,101,118,101,103,114,97,118,101,99,111,109,98,6,66,
-46,115,109,99,112,6,67,46,115,109,99,112,6,68,46,115,109,99,112,6,69,46,115,
-109,99,112,6,70,46,115,109,99,112,6,71,46,115,109,99,112,6,72,46,115,109,99,
-112,6,73,46,115,109,99,112,6,74,46,115,109,99,112,6,75,46,115,109,99,112,6,76,
-46,115,109,99,112,6,77,46,115,109,99,112,6,78,46,115,109,99,112,6,79,46,115,
-109,99,112,6,80,46,115,109,99,112,6,81,46,115,109,99,112,6,82,46,115,109,99,
-112,6,83,46,115,109,99,112,6,84,46,115,109,99,112,6,85,46,115,109,99,112,6,86,
-46,115,109,99,112,6,87,46,115,109,99,112,6,88,46,115,109,99,112,6,89,46,115,
-109,99,112,6,90,46,115,109,99,112,9,122,101,114,111,46,115,109,99,112,8,111,
-110,101,46,115,109,99,112,8,116,119,111,46,115,109,99,112,10,116,104,114,101,
-101,46,115,109,99,112,9,102,111,117,114,46,115,109,99,112,9,102,105,118,101,
-46,115,109,99,112,8,115,105,120,46,115,109,99,112,10,115,101,118,101,110,46,
-115,109,99,112,10,101,105,103,104,116,46,115,109,99,112,9,110,105,110,101,46,
-115,109,99,112,8,122,101,114,111,46,115,117,112,7,111,110,101,46,115,117,112,
-7,116,119,111,46,115,117,112,9,116,104,114,101,101,46,115,117,112,8,102,111,
-117,114,46,115,117,112,8,102,105,118,101,46,115,117,112,7,115,105,120,46,115,
-117,112,9,115,101,118,101,110,46,115,117,112,9,101,105,103,104,116,46,115,117,
-112,8,110,105,110,101,46,115,117,112,11,99,111,109,109,97,97,99,99,101,110,
-116,7,117,110,105,48,52,55,52,7,117,110,105,48,52,55,53,7,117,110,105,48,52,
-56,48,7,117,110,105,48,52,56,49,7,117,110,105,48,52,67,51,7,117,110,105,48,52,
-67,52,7,117,110,105,48,52,57,52,7,117,110,105,48,52,57,53,7,117,110,105,48,52,
-65,54,7,117,110,105,48,52,65,55,7,117,110,105,48,52,68,56,7,117,110,105,48,52,
-68,57,7,117,110,105,48,52,65,52,7,117,110,105,48,52,65,53,7,117,110,105,48,52,
-66,52,7,117,110,105,48,52,66,53,7,117,110,105,48,52,66,67,7,117,110,105,48,52,
-66,68,7,117,110,105,48,52,66,65,8,99,114,111,115,115,98,97,114,7,117,110,105,
-48,52,65,48,7,117,110,105,48,52,65,49,7,117,110,105,48,52,54,52,7,117,110,105,
-48,52,54,53,7,117,110,105,48,52,54,54,7,117,110,105,48,52,54,55,7,117,110,105,
-48,53,48,65,7,117,110,105,48,53,48,66,7,117,110,105,48,53,48,57,7,117,110,105,
-48,53,48,56,7,117,110,105,48,53,48,67,7,117,110,105,48,53,48,68,7,117,110,105,
-48,53,48,69,7,117,110,105,48,53,48,70,7,117,110,105,48,53,48,50,7,117,110,105,
-48,53,48,51,7,117,110,105,48,53,48,52,7,117,110,105,48,53,48,53,7,117,110,105,
-48,53,48,54,7,117,110,105,48,53,48,55,7,117,110,105,48,53,48,48,7,117,110,105,
-48,53,49,48,7,117,110,105,48,52,57,48,7,117,110,105,48,52,57,49,7,117,110,105,
-48,52,57,67,7,117,110,105,48,52,57,68,7,117,110,105,48,52,66,56,7,117,110,105,
-48,52,66,57,7,117,110,105,48,52,67,56,7,117,110,105,48,52,67,55,7,117,110,105,
-48,52,54,69,7,117,110,105,48,52,54,70,7,117,110,105,48,52,54,56,7,117,110,105,
-48,52,54,57,7,117,110,105,48,52,56,69,7,117,110,105,48,52,56,70,3,99,104,105,
-17,99,111,109,109,97,97,99,99,101,110,116,114,111,116,97,116,101,7,117,110,
-105,48,51,68,54,7,117,110,105,48,51,68,50,7,117,110,105,48,52,55,65,7,117,110,
-105,48,52,55,66,7,117,110,105,48,52,55,69,7,117,110,105,48,52,55,70,7,117,110,
-105,48,52,54,65,7,117,110,105,48,52,54,66,7,117,110,105,48,52,54,67,7,117,110,
-105,48,52,54,68,7,117,110,105,50,48,48,48,7,117,110,105,50,48,48,49,7,117,110,
-105,50,48,48,50,7,117,110,105,50,48,48,51,7,117,110,105,50,48,48,52,7,117,110,
-105,50,48,48,53,7,117,110,105,50,48,48,54,7,117,110,105,50,48,48,55,7,117,110,
-105,50,48,48,56,7,117,110,105,50,48,48,57,7,117,110,105,50,48,48,65,7,117,110,
-105,70,70,70,67,7,117,110,105,70,70,70,68,13,117,110,100,101,114,115,99,111,
-114,101,100,98,108,7,117,110,105,48,52,65,56,7,117,110,105,48,52,65,57,7,117,
-110,105,50,48,48,66,7,117,110,105,70,69,70,70,7,117,110,105,48,51,68,49,7,117,
-110,105,48,52,56,50,7,117,110,105,48,52,56,56,7,117,110,105,48,52,56,57,9,110,
-115,117,112,101,114,105,111,114,9,101,115,116,105,109,97,116,101,100,9,100,97,
-115,105,97,111,120,105,97,7,117,110,105,50,49,48,53,7,117,110,105,50,49,49,54,
-7,117,110,105,50,49,49,51,6,112,101,115,101,116,97,6,100,99,114,111,97,116,7,
-117,110,105,50,48,50,53,13,99,121,114,105,108,108,105,99,98,114,101,118,101,6,
-68,99,114,111,97,116,4,104,98,97,114,4,84,98,97,114,7,117,110,105,48,48,65,68,
-10,65,114,105,110,103,97,99,117,116,101,10,97,114,105,110,103,97,99,117,116,
-101,7,65,109,97,99,114,111,110,7,97,109,97,99,114,111,110,6,65,98,114,101,118,
-101,6,97,98,114,101,118,101,7,65,111,103,111,110,101,107,7,97,111,103,111,110,
-101,107,11,67,99,105,114,99,117,109,102,108,101,120,11,99,99,105,114,99,117,
-109,102,108,101,120,4,67,100,111,116,4,99,100,111,116,6,68,99,97,114,111,110,
-6,100,99,97,114,111,110,7,69,109,97,99,114,111,110,7,101,109,97,99,114,111,
-110,6,69,98,114,101,118,101,6,101,98,114,101,118,101,10,69,100,111,116,97,99,
-99,101,110,116,10,101,100,111,116,97,99,99,101,110,116,7,69,111,103,111,110,
-101,107,7,101,111,103,111,110,101,107,6,69,99,97,114,111,110,6,101,99,97,114,
-111,110,11,71,99,105,114,99,117,109,102,108,101,120,11,103,99,105,114,99,117,
-109,102,108,101,120,4,71,100,111,116,4,103,100,111,116,12,71,99,111,109,109,
-97,97,99,99,101,110,116,12,103,99,111,109,109,97,97,99,99,101,110,116,11,72,
-99,105,114,99,117,109,102,108,101,120,11,104,99,105,114,99,117,109,102,108,
-101,120,6,73,116,105,108,100,101,6,105,116,105,108,100,101,7,73,109,97,99,114,
-111,110,7,105,109,97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,
-118,101,7,73,111,103,111,110,101,107,7,105,111,103,111,110,101,107,10,73,100,
-111,116,97,99,99,101,110,116,2,73,74,2,105,106,11,74,99,105,114,99,117,109,
-102,108,101,120,11,106,99,105,114,99,117,109,102,108,101,120,12,75,99,111,109,
-109,97,97,99,99,101,110,116,12,107,99,111,109,109,97,97,99,99,101,110,116,6,
-76,97,99,117,116,101,6,108,97,99,117,116,101,12,76,99,111,109,109,97,97,99,99,
-101,110,116,12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99,97,114,111,
-110,6,108,99,97,114,111,110,4,76,100,111,116,4,108,100,111,116,6,78,97,99,117,
-116,101,6,110,97,99,117,116,101,12,78,99,111,109,109,97,97,99,99,101,110,116,
-12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99,97,114,111,110,6,110,99,
-97,114,111,110,11,110,97,112,111,115,116,114,111,112,104,101,7,79,109,97,99,
-114,111,110,7,111,109,97,99,114,111,110,6,79,98,114,101,118,101,6,111,98,114,
-101,118,101,13,79,104,117,110,103,97,114,117,109,108,97,117,116,13,111,104,
-117,110,103,97,114,117,109,108,97,117,116,6,82,97,99,117,116,101,6,114,97,99,
-117,116,101,12,82,99,111,109,109,97,97,99,99,101,110,116,12,114,99,111,109,
-109,97,97,99,99,101,110,116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6,
-83,97,99,117,116,101,6,115,97,99,117,116,101,11,83,99,105,114,99,117,109,102,
-108,101,120,11,115,99,105,114,99,117,109,102,108,101,120,12,84,99,111,109,109,
-97,97,99,99,101,110,116,12,116,99,111,109,109,97,97,99,99,101,110,116,6,84,99,
-97,114,111,110,6,116,99,97,114,111,110,6,85,116,105,108,100,101,6,117,116,105,
-108,100,101,7,85,109,97,99,114,111,110,7,117,109,97,99,114,111,110,6,85,98,
-114,101,118,101,6,117,98,114,101,118,101,5,85,114,105,110,103,5,117,114,105,
-110,103,13,85,104,117,110,103,97,114,117,109,108,97,117,116,13,117,104,117,
-110,103,97,114,117,109,108,97,117,116,7,85,111,103,111,110,101,107,7,117,111,
-103,111,110,101,107,11,87,99,105,114,99,117,109,102,108,101,120,11,119,99,105,
-114,99,117,109,102,108,101,120,11,89,99,105,114,99,117,109,102,108,101,120,11,
-121,99,105,114,99,117,109,102,108,101,120,6,90,97,99,117,116,101,6,122,97,99,
-117,116,101,10,90,100,111,116,97,99,99,101,110,116,10,122,100,111,116,97,99,
-99,101,110,116,7,65,69,97,99,117,116,101,7,97,101,97,99,117,116,101,11,79,115,
-108,97,115,104,97,99,117,116,101,11,111,115,108,97,115,104,97,99,117,116,101,
-12,83,99,111,109,109,97,97,99,99,101,110,116,12,115,99,111,109,109,97,97,99,
-99,101,110,116,10,65,108,112,104,97,116,111,110,111,115,12,69,112,115,105,108,
-111,110,116,111,110,111,115,8,69,116,97,116,111,110,111,115,9,73,111,116,97,
-116,111,110,111,115,12,79,109,105,99,114,111,110,116,111,110,111,115,12,85,
-112,115,105,108,111,110,116,111,110,111,115,10,79,109,101,103,97,116,111,110,
-111,115,17,105,111,116,97,100,105,101,114,101,115,105,115,116,111,110,111,115,
-5,65,108,112,104,97,4,66,101,116,97,7,69,112,115,105,108,111,110,4,90,101,116,
-97,3,69,116,97,4,73,111,116,97,5,75,97,112,112,97,2,77,117,2,78,117,7,79,109,
-105,99,114,111,110,3,82,104,111,3,84,97,117,7,85,112,115,105,108,111,110,3,67,
-104,105,12,73,111,116,97,100,105,101,114,101,115,105,115,15,85,112,115,105,
-108,111,110,100,105,101,114,101,115,105,115,10,97,108,112,104,97,116,111,110,
-111,115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101,116,97,116,
-111,110,111,115,9,105,111,116,97,116,111,110,111,115,20,117,112,115,105,108,
-111,110,100,105,101,114,101,115,105,115,116,111,110,111,115,5,107,97,112,112,
-97,7,111,109,105,99,114,111,110,7,117,110,105,48,51,66,67,2,110,117,12,105,
-111,116,97,100,105,101,114,101,115,105,115,15,117,112,115,105,108,111,110,100,
-105,101,114,101,115,105,115,12,111,109,105,99,114,111,110,116,111,110,111,115,
-12,117,112,115,105,108,111,110,116,111,110,111,115,10,111,109,101,103,97,116,
-111,110,111,115,7,117,110,105,48,52,48,49,7,117,110,105,48,52,48,51,7,117,110,
-105,48,52,48,53,7,117,110,105,48,52,48,54,7,117,110,105,48,52,48,55,7,117,110,
-105,48,52,48,56,7,117,110,105,48,52,48,67,7,117,110,105,48,52,48,69,7,117,110,
-105,48,52,49,65,7,117,110,105,48,52,49,48,7,117,110,105,48,52,49,50,7,117,110,
-105,48,52,49,51,7,117,110,105,48,52,49,53,7,117,110,105,48,52,49,57,7,117,110,
-105,48,52,49,67,7,117,110,105,48,52,49,68,7,117,110,105,48,52,49,69,7,117,110,
-105,48,52,49,70,7,117,110,105,48,52,50,48,7,117,110,105,48,52,50,49,7,117,110,
-105,48,52,50,50,7,117,110,105,48,52,50,52,7,117,110,105,48,52,50,53,7,117,110,
-105,48,52,51,48,7,117,110,105,48,52,51,53,7,117,110,105,48,52,51,57,7,117,110,
-105,48,52,51,69,7,117,110,105,48,52,52,48,7,117,110,105,48,52,52,49,7,117,110,
-105,48,52,52,51,7,117,110,105,48,52,52,53,7,117,110,105,48,52,53,49,7,117,110,
-105,48,52,53,51,7,117,110,105,48,52,53,53,7,117,110,105,48,52,53,54,7,117,110,
-105,48,52,53,55,7,117,110,105,48,52,53,56,7,117,110,105,48,52,53,67,7,117,110,
-105,48,52,53,69,6,87,103,114,97,118,101,6,119,103,114,97,118,101,6,87,97,99,
-117,116,101,6,119,97,99,117,116,101,9,87,100,105,101,114,101,115,105,115,9,
-119,100,105,101,114,101,115,105,115,6,89,103,114,97,118,101,6,121,103,114,97,
-118,101,6,109,105,110,117,116,101,6,115,101,99,111,110,100,9,101,120,99,108,
-97,109,100,98,108,7,117,110,105,70,66,48,49,7,117,110,105,70,66,48,50,7,117,
-110,105,48,49,70,48,7,117,110,105,48,50,66,67,7,117,110,105,49,69,51,69,7,117,
-110,105,49,69,51,70,7,117,110,105,49,69,48,48,7,117,110,105,49,69,48,49,7,117,
-110,105,49,70,52,68,7,117,110,105,70,66,48,51,7,117,110,105,70,66,48,52,7,117,
-110,105,48,52,48,48,7,117,110,105,48,52,48,68,7,117,110,105,48,52,53,48,7,117,
-110,105,48,52,53,68,7,117,110,105,48,52,55,48,7,117,110,105,48,52,55,49,7,117,
-110,105,48,52,55,54,7,117,110,105,48,52,55,55,7,117,110,105,48,52,55,57,7,117,
-110,105,48,52,55,56,7,117,110,105,48,52,57,56,7,117,110,105,48,52,57,57,7,117,
-110,105,48,52,65,65,7,117,110,105,48,52,65,66,7,117,110,105,48,52,65,69,7,117,
-110,105,48,52,65,70,7,117,110,105,48,52,67,48,7,117,110,105,48,52,67,49,7,117,
-110,105,48,52,67,50,7,117,110,105,48,52,67,70,7,117,110,105,48,52,68,48,7,117,
-110,105,48,52,68,49,7,117,110,105,48,52,68,50,7,117,110,105,48,52,68,51,7,117,
-110,105,48,52,68,52,7,117,110,105,48,52,68,53,7,117,110,105,48,52,68,54,7,117,
-110,105,48,52,68,55,7,117,110,105,48,52,68,65,7,117,110,105,48,52,68,66,7,117,
-110,105,48,52,68,67,7,117,110,105,48,52,68,68,7,117,110,105,48,52,68,69,7,117,
-110,105,48,52,68,70,7,117,110,105,48,52,69,50,7,117,110,105,48,52,69,51,7,117,
-110,105,48,52,69,52,7,117,110,105,48,52,69,53,7,117,110,105,48,52,69,54,7,117,
-110,105,48,52,69,55,7,117,110,105,48,52,69,56,7,117,110,105,48,52,69,57,7,117,
-110,105,48,52,69,65,7,117,110,105,48,52,69,66,7,117,110,105,48,52,69,67,7,117,
-110,105,48,52,69,68,7,117,110,105,48,52,69,69,7,117,110,105,48,52,69,70,7,117,
-110,105,48,52,70,48,7,117,110,105,48,52,70,49,7,117,110,105,48,52,70,50,7,117,
-110,105,48,52,70,51,7,117,110,105,48,52,70,52,7,117,110,105,48,52,70,53,7,117,
-110,105,48,52,70,56,7,117,110,105,48,52,70,57,7,117,110,105,48,52,70,67,7,117,
-110,105,48,52,70,68,7,117,110,105,48,53,48,49,7,117,110,105,48,53,49,50,7,117,
-110,105,48,53,49,51,7,117,110,105,49,69,65,48,7,117,110,105,49,69,65,49,7,117,
-110,105,49,69,65,50,7,117,110,105,49,69,65,51,7,117,110,105,49,69,65,52,7,117,
-110,105,49,69,65,53,7,117,110,105,49,69,65,54,7,117,110,105,49,69,65,55,7,117,
-110,105,49,69,65,56,7,117,110,105,49,69,65,57,7,117,110,105,49,69,65,65,7,117,
-110,105,49,69,65,66,7,117,110,105,49,69,65,67,7,117,110,105,49,69,65,68,7,117,
-110,105,49,69,65,69,7,117,110,105,49,69,65,70,7,117,110,105,49,69,66,48,7,117,
-110,105,49,69,66,49,7,117,110,105,49,69,66,50,7,117,110,105,49,69,66,51,7,117,
-110,105,49,69,66,52,7,117,110,105,49,69,66,53,7,117,110,105,49,69,66,54,7,117,
-110,105,49,69,66,55,7,117,110,105,49,69,66,56,7,117,110,105,49,69,66,57,7,117,
-110,105,49,69,66,65,7,117,110,105,49,69,66,66,7,117,110,105,49,69,66,67,7,117,
-110,105,49,69,66,68,7,117,110,105,49,69,66,69,7,117,110,105,49,69,66,70,7,117,
-110,105,49,69,67,48,7,117,110,105,49,69,67,49,7,117,110,105,49,69,67,50,7,117,
-110,105,49,69,67,51,7,117,110,105,49,69,67,52,7,117,110,105,49,69,67,53,7,117,
-110,105,49,69,67,54,7,117,110,105,49,69,67,55,7,117,110,105,49,69,67,56,7,117,
-110,105,49,69,67,57,7,117,110,105,49,69,67,65,7,117,110,105,49,69,67,66,7,117,
-110,105,49,69,67,67,7,117,110,105,49,69,67,68,7,117,110,105,49,69,67,69,7,117,
-110,105,49,69,67,70,7,117,110,105,49,69,68,48,7,117,110,105,49,69,68,49,7,117,
-110,105,49,69,68,50,7,117,110,105,49,69,68,51,7,117,110,105,49,69,68,52,7,117,
-110,105,49,69,68,53,7,117,110,105,49,69,68,54,7,117,110,105,49,69,68,55,7,117,
-110,105,49,69,68,56,7,117,110,105,49,69,68,57,7,117,110,105,49,69,68,65,7,117,
-110,105,49,69,68,66,7,117,110,105,49,69,68,67,7,117,110,105,49,69,68,68,7,117,
-110,105,49,69,68,69,7,117,110,105,49,69,68,70,7,117,110,105,49,69,69,48,7,117,
-110,105,49,69,69,49,7,117,110,105,49,69,69,50,7,117,110,105,49,69,69,51,7,117,
-110,105,49,69,69,52,7,117,110,105,49,69,69,53,7,117,110,105,49,69,69,54,7,117,
-110,105,49,69,69,55,7,117,110,105,49,69,69,56,7,117,110,105,49,69,69,57,7,117,
-110,105,49,69,69,65,7,117,110,105,49,69,69,66,7,117,110,105,49,69,69,67,7,117,
-110,105,49,69,69,68,7,117,110,105,49,69,69,69,7,117,110,105,49,69,69,70,7,117,
-110,105,49,69,70,48,7,117,110,105,49,69,70,49,7,117,110,105,49,69,70,52,7,117,
-110,105,49,69,70,53,7,117,110,105,49,69,70,54,7,117,110,105,49,69,70,55,7,117,
-110,105,49,69,70,56,7,117,110,105,49,69,70,57,7,117,110,105,50,48,65,66,7,117,
-110,105,48,52,57,65,7,117,110,105,48,52,57,66,7,117,110,105,48,52,65,50,7,117,
-110,105,48,52,65,51,7,117,110,105,48,52,65,67,7,117,110,105,48,52,65,68,7,117,
-110,105,48,52,66,50,7,117,110,105,48,52,66,51,7,117,110,105,48,52,66,54,7,117,
-110,105,48,52,66,55,7,117,110,105,48,52,67,66,7,117,110,105,48,52,67,67,7,117,
-110,105,48,52,70,54,7,117,110,105,48,52,70,55,7,117,110,105,48,52,57,54,7,117,
-110,105,48,52,57,55,7,117,110,105,48,52,66,69,7,117,110,105,48,52,66,70,7,117,
-110,105,48,52,66,66,7,117,110,105,48,52,56,68,7,117,110,105,48,52,56,67,7,117,
-110,105,48,52,54,51,7,117,110,105,48,52,54,50,7,117,110,105,48,52,57,50,7,117,
-110,105,48,52,57,51,7,117,110,105,48,52,57,69,7,117,110,105,48,52,57,70,7,117,
-110,105,48,52,56,65,7,117,110,105,48,52,56,66,7,117,110,105,48,52,67,57,7,117,
-110,105,48,52,67,65,7,117,110,105,48,52,67,68,7,117,110,105,48,52,67,69,7,117,
-110,105,48,52,67,53,7,117,110,105,48,52,67,54,7,117,110,105,48,52,66,48,7,117,
-110,105,48,52,66,49,7,117,110,105,48,52,70,69,7,117,110,105,48,52,70,70,7,117,
-110,105,48,52,70,65,7,117,110,105,48,52,70,66,7,117,110,105,48,52,55,67,7,117,
-110,105,48,52,55,68,7,117,110,105,48,53,49,49,7,117,110,105,50,48,49,53,0,0,0,
-0,1,0,0,0,12,0,0,0,0,0,0,0,2,0,4,0,255,1,2,0,1,1,180,1,192,0,1,1,196,1,204,0,
-1,1,206,1,207,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,10,0,30,0,44,0,1,108,97,116,110,0,
-8,0,4,0,0,0,0,255,255,0,1,0,0,0,1,107,101,114,110,0,8,0,0,0,1,0,0,0,1,0,4,0,2,
-0,0,0,1,0,8,0,1,24,50,0,4,0,0,0,148,1,50,1,68,1,102,1,120,1,154,1,192,1,222,2,
-4,2,38,2,68,2,94,2,128,3,6,3,40,3,94,3,120,3,238,4,32,4,62,4,84,4,150,4,160,4,
-226,5,76,5,106,5,120,5,222,6,52,6,118,6,204,6,250,7,152,7,206,8,56,8,170,8,
-220,9,106,9,176,9,182,9,192,9,214,9,224,9,234,9,248,10,26,10,36,10,46,10,56,
-10,62,10,72,10,82,10,92,10,118,10,132,10,206,10,216,10,226,10,236,11,22,11,48,
-11,78,11,116,11,142,11,148,12,38,12,96,12,226,12,236,13,34,13,44,13,78,13,84,
-13,126,13,132,13,162,13,228,13,242,14,36,14,78,14,88,14,114,14,128,14,222,14,
-232,14,242,15,0,15,54,15,108,15,162,15,188,15,222,16,16,16,58,16,112,16,134,
-17,36,17,70,17,128,17,170,17,212,17,250,18,36,18,122,18,140,18,174,18,192,18,
-210,18,244,19,14,19,60,19,150,19,180,19,206,19,240,19,254,20,28,20,50,20,72,
-20,90,20,112,20,130,20,228,21,2,21,100,21,138,21,156,21,166,21,176,21,182,21,
-200,21,242,22,12,22,30,22,56,22,94,22,140,22,146,22,168,22,194,22,212,22,254,
-23,20,23,126,23,168,23,210,23,220,23,242,24,40,0,4,0,42,255,162,0,54,0,40,0,
-55,0,37,0,57,0,45,0,8,0,16,0,4,0,17,255,221,0,19,255,252,0,20,0,5,0,21,255,
-253,0,22,0,4,0,23,255,213,0,25,0,6,0,4,0,18,255,250,0,19,255,250,0,21,255,250,
-0,23,255,254,0,8,0,16,255,239,0,17,255,239,0,18,0,8,0,21,255,242,0,22,255,239,
-0,23,255,233,0,24,255,238,0,25,0,2,0,9,0,17,255,236,0,18,255,253,0,19,0,7,0,
-20,0,15,0,21,0,4,0,22,255,253,0,23,255,228,0,24,0,5,0,25,255,255,0,7,0,16,0,3,
-0,18,255,225,0,20,0,34,0,21,0,17,0,22,0,3,0,23,255,173,0,24,0,19,0,9,0,17,255,
-252,0,18,255,234,0,19,0,6,0,20,0,17,0,21,0,5,0,22,255,254,0,23,255,253,0,24,0,
-6,0,25,255,229,0,8,0,16,0,2,0,17,255,217,0,18,255,232,0,20,0,23,0,21,0,9,0,22,
-0,2,0,23,255,216,0,24,0,11,0,7,0,17,0,36,0,20,255,94,0,21,255,225,0,22,255,
-217,0,23,0,38,0,24,255,234,0,25,255,249,0,6,0,16,255,255,0,17,255,234,0,19,0,
-11,0,20,0,20,0,21,0,8,0,22,255,255,0,8,0,16,0,3,0,17,255,218,0,18,255,247,0,
-20,0,5,0,21,255,252,0,22,0,3,0,23,255,209,0,25,0,5,0,33,0,35,255,218,0,39,255,
-217,0,47,255,214,0,49,255,217,0,52,255,104,0,53,255,211,0,54,255,108,0,55,255,
-157,0,57,255,93,0,65,0,5,0,67,255,236,0,68,255,229,0,69,255,232,0,71,255,240,
-0,79,255,232,0,81,255,240,0,83,0,3,0,84,255,192,0,85,255,233,0,86,255,173,0,
-87,255,188,0,90,0,24,1,8,255,120,1,12,255,120,1,66,255,236,1,70,255,233,1,78,
-255,233,1,80,255,236,1,83,255,139,1,84,255,225,1,85,255,152,1,86,255,185,1,88,
-255,133,0,8,0,57,255,93,0,65,0,10,0,73,255,252,0,76,255,252,0,79,0,6,0,82,0,2,
-0,85,0,5,0,89,0,4,0,13,0,35,255,250,0,39,255,250,0,47,255,247,0,49,255,250,0,
-73,255,244,0,82,255,250,0,85,255,250,0,89,0,11,0,90,255,247,1,66,255,250,1,70,
-255,249,1,78,255,249,1,80,255,250,0,6,0,54,255,213,0,55,255,230,0,65,255,253,
-0,69,0,4,0,79,0,4,0,85,0,4,0,29,0,54,0,17,0,55,0,16,0,57,0,18,0,66,255,245,0,
-67,255,218,0,68,255,213,0,69,255,217,0,70,255,219,0,71,255,222,0,73,255,246,0,
-74,255,249,0,75,255,248,0,76,255,246,0,77,255,238,0,78,255,238,0,79,255,217,0,
-80,255,242,0,81,255,222,0,82,255,240,0,84,255,212,0,85,255,222,0,86,255,203,0,
-87,255,210,0,88,0,5,0,89,255,207,0,90,0,6,1,85,255,224,1,86,255,218,1,88,255,
-223,0,12,0,12,254,205,0,14,254,205,0,33,255,135,0,65,255,187,0,69,255,212,0,
-73,255,249,0,76,255,247,0,79,255,212,0,82,255,203,0,85,255,210,0,89,255,206,1,
-63,255,124,0,7,0,65,0,1,0,69,0,4,0,78,255,255,0,79,0,1,0,82,0,2,0,85,0,1,0,89,
-0,1,0,5,0,65,255,250,0,69,255,246,0,79,255,246,0,85,255,247,0,89,255,253,0,16,
-0,65,255,248,0,67,255,248,0,68,255,238,0,70,255,244,0,71,255,248,0,77,255,248,
-0,78,255,248,0,79,255,244,0,80,255,252,0,82,255,248,0,83,255,248,0,84,255,247,
-0,85,255,248,0,86,255,250,0,87,255,252,0,89,255,250,0,2,0,65,255,247,0,79,255,
-247,0,16,0,35,255,200,0,39,255,196,0,47,255,193,0,49,255,196,0,65,255,246,0,
-69,255,202,0,73,255,247,0,79,255,201,0,82,255,248,0,85,255,208,0,87,255,177,0,
-89,255,175,1,66,255,207,1,70,255,203,1,78,255,204,1,80,255,204,0,26,0,33,0,39,
-0,35,255,213,0,39,255,209,0,47,255,205,0,49,255,209,0,52,255,100,0,53,255,206,
-0,54,255,71,0,55,255,147,0,57,255,79,0,74,255,254,0,85,255,227,0,87,255,170,0,
-89,255,147,1,8,254,233,1,12,254,230,1,63,0,38,1,66,255,229,1,70,255,225,1,78,
-255,227,1,80,255,227,1,83,255,118,1,84,255,220,1,85,255,109,1,86,255,172,1,88,
-255,106,0,7,0,65,255,249,0,69,255,245,0,74,255,248,0,78,255,249,0,79,255,245,
-0,85,255,249,0,89,255,252,0,3,0,69,255,247,0,79,255,247,0,89,255,253,0,25,0,
-33,255,214,0,52,255,201,0,54,255,211,0,55,255,233,0,56,255,210,0,57,255,198,0,
-67,0,2,0,68,255,252,0,69,0,2,0,70,0,1,0,71,0,2,0,74,255,245,0,79,0,2,0,80,255,
-255,0,81,0,5,0,83,255,255,0,84,0,4,0,85,0,2,0,88,255,244,0,89,0,7,0,90,255,
-241,1,63,255,215,1,85,255,254,1,86,255,255,1,87,255,233,0,21,0,12,254,176,0,
-14,254,176,0,33,255,146,0,37,255,250,0,40,255,250,0,41,255,250,0,65,255,234,0,
-69,255,230,0,72,255,254,0,73,255,248,0,76,255,250,0,78,255,250,0,79,255,230,0,
-82,255,252,0,83,255,244,0,84,0,29,0,89,0,31,1,63,255,138,1,68,255,253,1,71,
-255,253,1,72,255,253,0,16,0,33,0,28,0,52,255,188,0,53,255,242,0,54,255,199,0,
-55,255,216,0,56,0,24,0,57,255,185,0,65,255,255,0,85,255,252,1,63,0,28,1,83,
-255,244,1,84,255,249,1,85,255,240,1,86,255,244,1,87,0,13,1,88,255,238,0,21,0,
-35,255,245,0,39,255,245,0,47,255,242,0,49,255,245,0,52,255,215,0,53,255,242,0,
-54,255,217,0,55,255,226,0,57,255,158,0,65,255,252,0,69,255,241,0,79,255,241,0,
-85,255,248,0,89,255,254,1,66,255,246,1,70,255,245,1,78,255,245,1,80,255,245,1,
-83,255,253,1,84,255,245,1,86,255,248,0,11,0,65,0,1,0,69,255,253,0,74,255,247,
-0,77,255,250,0,78,255,250,0,79,255,253,0,80,255,254,0,81,255,255,0,85,255,254,
-0,87,0,6,0,89,0,5,0,39,0,12,255,92,0,13,255,96,0,14,255,92,0,26,255,102,0,27,
-255,100,0,33,255,94,0,35,255,204,0,39,255,200,0,47,255,199,0,49,255,202,0,51,
-255,223,0,52,0,32,0,54,0,32,0,55,0,31,0,56,0,21,0,57,0,33,0,65,255,97,0,69,
-255,94,0,73,255,249,0,77,255,122,0,79,255,94,0,82,255,122,0,83,255,101,0,85,
-255,122,0,87,255,159,0,89,255,156,0,90,255,133,1,8,0,7,1,63,255,91,1,66,255,
-110,1,70,255,110,1,78,255,110,1,80,255,110,1,82,255,117,1,83,255,225,1,85,255,
-235,1,86,255,225,1,87,255,218,1,88,255,236,0,13,0,33,255,211,0,68,255,240,0,
-70,255,252,0,71,255,248,0,77,255,248,0,78,255,248,0,80,255,248,0,82,255,248,0,
-83,255,244,0,84,255,255,0,88,255,241,0,90,255,237,1,63,255,212,0,26,0,9,0,40,
-0,12,255,76,0,13,255,181,0,14,255,81,0,26,255,193,0,27,255,193,0,33,255,103,0,
-35,255,213,0,39,255,213,0,47,255,210,0,49,255,213,0,61,0,34,0,65,255,161,0,69,
-255,165,0,79,255,161,0,82,255,194,0,85,255,198,0,89,255,234,0,93,0,38,1,8,0,
-12,1,12,0,12,1,63,255,100,1,66,255,177,1,70,255,177,1,78,255,177,1,80,255,177,
-0,28,0,9,0,31,0,12,255,138,0,13,255,213,0,14,255,138,0,26,255,212,0,27,255,
-211,0,33,255,147,0,35,255,228,0,39,255,228,0,47,255,225,0,49,255,228,0,52,0,
-29,0,61,0,25,0,65,255,189,0,69,255,193,0,79,255,193,0,82,255,213,0,85,255,217,
-0,89,255,247,0,93,0,29,1,8,0,9,1,12,0,9,1,63,255,148,1,66,255,209,1,70,255,
-205,1,78,255,205,1,80,255,205,1,83,255,254,0,12,0,35,255,209,0,39,255,209,0,
-47,255,205,0,49,255,209,0,69,255,203,0,85,255,212,0,89,255,192,1,8,255,249,1,
-66,255,209,1,70,255,205,1,78,255,205,1,80,255,208,0,35,0,9,0,41,0,12,255,69,0,
-13,255,150,0,14,255,69,0,26,255,167,0,27,255,168,0,33,255,88,0,35,255,202,0,
-39,255,200,0,47,255,196,0,49,255,200,0,52,0,34,0,54,0,36,0,55,0,34,0,56,0,27,
-0,57,0,37,0,61,0,37,0,65,255,127,0,69,255,122,0,79,255,122,0,81,255,131,0,84,
-255,210,0,85,255,176,0,86,255,216,0,93,0,39,1,63,255,81,1,66,255,151,1,70,255,
-147,1,78,255,147,1,80,255,147,1,83,255,230,1,85,255,238,1,86,255,230,1,87,255,
-222,1,88,255,239,0,17,0,33,0,27,0,35,255,209,0,39,255,205,0,47,255,202,0,49,
-255,205,0,65,255,254,0,69,255,213,0,73,255,247,0,79,255,212,0,85,255,218,0,87,
-255,200,0,89,255,201,1,63,0,27,1,66,255,218,1,70,255,214,1,78,255,216,1,80,
-255,216,0,1,0,42,255,219,0,2,1,8,255,225,1,12,255,225,0,5,0,86,255,233,0,87,
-255,240,0,89,255,233,1,8,255,197,1,12,255,197,0,2,1,8,255,246,1,12,255,246,0,
-2,1,8,255,247,1,12,255,247,0,3,0,89,255,230,1,8,255,227,1,12,255,227,0,8,0,7,
-0,32,0,9,0,41,0,61,0,37,0,71,255,207,0,93,0,39,1,8,0,32,1,12,0,32,3,177,0,28,
-0,2,1,8,255,247,1,12,255,247,0,2,1,8,255,198,1,12,255,198,0,2,1,8,255,249,1,
-12,255,249,0,1,0,69,255,215,0,2,1,8,255,245,1,12,255,245,0,2,1,8,255,220,1,12,
-255,220,0,2,1,8,255,227,1,12,255,227,0,6,0,86,255,226,0,87,255,237,0,88,255,
-214,0,89,255,226,1,8,255,216,1,12,255,216,0,3,0,87,255,240,1,8,255,223,1,12,
-255,223,0,18,0,12,255,126,0,14,255,126,0,67,255,218,0,68,255,220,0,69,255,218,
-0,70,0,31,0,75,0,1,0,79,255,216,0,81,255,221,0,84,0,34,0,85,0,1,0,86,0,36,0,
-87,0,35,0,88,0,18,0,89,0,36,0,90,0,10,1,8,0,32,1,12,0,32,0,2,1,8,255,247,1,12,
-255,247,0,2,1,8,255,249,1,12,255,249,0,2,1,8,255,248,1,12,255,248,0,10,0,12,
-255,135,0,14,255,139,0,65,255,226,0,67,255,229,0,68,255,229,0,69,255,229,0,79,
-255,225,0,81,255,229,1,8,0,34,1,12,0,34,0,6,0,12,255,162,0,14,255,166,0,67,
-255,236,0,68,255,236,0,69,255,232,0,81,255,236,0,7,0,67,255,215,0,68,255,219,
-0,69,255,215,0,79,255,215,0,81,255,219,1,8,0,18,1,12,0,18,0,9,0,12,255,118,0,
-14,255,128,0,67,255,223,0,68,255,223,0,69,255,223,0,79,255,223,0,81,255,217,1,
-8,0,28,1,12,0,28,0,6,0,67,255,223,0,68,255,226,0,69,255,223,0,79,255,223,1,8,
-0,7,1,12,0,7,0,1,0,42,255,215,0,36,0,12,254,206,0,13,254,204,0,14,254,210,0,
-35,255,199,0,39,255,197,0,47,255,197,0,49,255,197,0,52,0,34,0,54,0,33,0,55,0,
-30,0,57,0,33,0,105,254,208,0,120,254,210,0,127,255,195,0,142,255,195,0,169,
-255,66,0,170,255,197,0,171,255,66,0,175,255,108,0,178,254,244,0,180,254,241,0,
-181,255,223,0,182,254,249,0,184,255,14,0,186,254,246,0,189,255,70,0,190,254,
-237,0,191,254,240,0,192,254,231,0,193,255,92,0,194,254,250,0,195,254,252,0,
-196,255,1,0,197,254,244,1,5,254,207,1,6,254,207,0,14,0,12,255,217,0,14,255,
-226,0,33,255,224,0,52,255,203,0,54,255,224,0,55,255,238,0,56,255,216,0,57,255,
-206,0,58,255,219,0,125,255,206,0,169,255,217,0,171,255,224,0,172,255,228,0,
-174,255,217,0,32,0,7,255,115,0,31,255,140,0,33,0,36,0,35,255,219,0,39,255,215,
-0,47,255,215,0,49,255,215,0,52,255,75,0,53,255,212,0,54,255,113,0,55,255,156,
-0,57,255,85,0,67,255,234,0,68,255,229,0,69,255,234,0,71,255,238,0,79,255,234,
-0,81,255,238,0,85,255,235,0,125,0,38,0,127,255,236,0,133,255,238,0,142,255,
-215,0,143,255,238,0,169,0,38,0,170,255,215,0,175,255,202,0,176,255,156,0,193,
-255,149,1,8,255,119,1,12,255,119,3,177,255,119,0,2,0,170,255,225,0,187,0,27,0,
-13,0,7,255,246,0,35,255,211,0,39,255,209,0,47,255,209,0,49,255,209,0,127,255,
-232,0,142,255,205,0,170,255,209,0,175,255,151,0,187,0,36,1,8,255,246,1,12,255,
-246,3,177,255,246,0,2,0,171,255,199,0,187,255,193,0,8,0,12,255,84,0,14,255,88,
-0,171,255,157,0,181,255,243,0,190,255,224,0,192,255,237,0,195,255,244,0,197,
-255,240,0,1,0,187,0,34,0,10,0,7,0,32,0,70,0,29,0,181,255,239,0,189,0,27,0,190,
-255,211,0,193,0,30,0,197,255,236,1,8,0,32,1,12,0,32,3,177,0,32,0,1,0,193,255,
-225,0,7,0,7,255,239,0,191,255,243,0,192,255,243,0,195,255,242,1,8,255,244,1,
-12,255,244,3,177,255,240,0,16,0,178,255,209,0,180,0,10,0,181,255,216,0,182,
-255,226,0,184,255,233,0,186,255,237,0,187,0,11,0,188,255,223,0,189,0,14,0,191,
-255,199,0,192,255,205,0,193,0,15,0,194,255,238,0,195,255,219,0,196,255,239,0,
-197,255,217,0,3,0,7,255,217,1,8,255,227,1,12,255,227,0,12,0,7,255,186,0,178,
-255,225,0,180,255,191,0,185,255,217,0,186,255,239,0,187,0,37,0,189,255,214,0,
-193,255,190,0,195,255,212,1,8,255,249,1,12,255,249,3,177,255,184,0,10,0,7,255,
-58,0,70,255,209,0,180,255,145,0,185,255,212,0,187,0,33,0,189,255,212,0,193,
-255,125,1,8,255,63,1,12,255,63,3,177,255,58,0,2,0,178,255,179,0,187,0,17,0,6,
-0,87,255,240,0,88,255,226,0,90,255,232,0,193,255,215,1,8,255,223,1,12,255,223,
-0,3,0,180,0,17,0,189,0,19,0,193,0,20,0,23,0,7,0,34,0,70,0,29,0,120,255,233,0,
-180,0,27,0,181,255,223,0,189,0,29,0,191,255,214,0,192,255,211,0,193,0,29,1,8,
-0,34,1,12,0,34,1,63,255,122,1,66,255,220,1,70,255,216,1,78,255,218,1,80,255,
-216,1,82,255,234,1,83,0,29,1,85,0,27,1,86,0,20,1,87,0,8,1,88,0,27,3,177,0,34,
-0,2,0,88,255,220,0,90,255,220,0,2,0,88,255,228,0,90,255,228,0,3,0,88,255,226,
-0,90,255,226,0,180,255,234,0,13,0,7,255,170,0,198,255,185,0,202,255,186,0,206,
-255,233,0,210,255,223,0,212,255,194,0,215,255,188,0,233,255,164,0,236,255,239,
-0,239,255,200,1,8,255,175,1,12,255,175,3,177,255,171,0,13,0,7,255,126,0,202,
-255,67,0,206,255,232,0,209,255,243,0,210,255,220,0,212,255,194,0,215,255,141,
-0,233,255,161,0,236,255,241,0,239,255,201,1,8,255,146,1,12,255,146,3,177,255,
-135,0,13,0,7,255,125,0,198,255,68,0,202,255,66,0,206,255,230,0,210,255,219,0,
-212,255,193,0,215,255,140,0,233,255,159,0,236,255,240,0,239,255,200,1,8,255,
-144,1,12,255,144,3,177,255,134,0,6,0,198,255,181,0,202,255,179,0,215,255,184,
-0,233,255,158,0,236,255,225,0,239,255,194,0,8,0,198,255,206,0,210,255,225,0,
-212,255,202,0,215,255,208,0,225,255,227,0,233,255,168,0,236,255,242,0,239,255,
-204,0,12,0,198,255,196,0,200,0,40,0,202,255,197,0,205,0,46,0,209,0,40,0,212,
-255,197,0,215,255,199,0,224,0,44,0,229,0,40,0,236,255,196,0,247,0,40,0,253,
-255,213,0,10,0,13,255,141,0,199,255,206,0,200,0,36,0,209,0,36,0,221,255,210,0,
-229,0,37,0,233,255,181,0,236,255,161,0,247,0,37,0,253,255,206,0,13,0,17,255,
-236,0,18,255,253,0,19,0,7,0,20,0,15,0,21,0,4,0,22,255,253,0,23,255,228,0,24,0,
-5,0,25,255,255,0,207,0,11,0,209,255,239,0,210,255,236,0,215,255,228,0,5,0,65,
-255,252,0,69,255,255,0,79,255,252,0,85,255,255,0,89,0,2,0,39,0,7,0,15,0,13,
-255,177,0,14,255,135,0,67,255,229,0,68,255,229,0,69,255,229,0,79,255,229,0,81,
-255,225,0,199,255,210,0,200,255,138,0,205,255,53,0,209,255,138,0,215,0,36,0,
-222,255,187,0,223,255,187,0,224,255,69,0,227,255,187,0,228,255,187,0,229,255,
-116,0,230,255,187,0,231,255,187,0,232,255,187,0,234,255,154,0,235,255,187,0,
-236,255,207,0,237,255,187,0,238,255,185,0,240,255,187,0,241,255,187,0,243,255,
-185,0,244,255,172,0,246,255,150,0,247,255,116,0,248,255,187,0,250,255,187,0,
-254,255,153,1,8,0,31,1,12,0,31,3,177,0,13,0,8,0,200,0,39,0,205,0,96,0,209,0,
-49,0,212,255,195,0,224,0,104,0,229,0,58,0,236,255,194,0,247,0,39,0,14,0,198,
-255,218,0,200,0,42,0,205,0,48,0,209,0,42,0,210,0,22,0,212,255,218,0,215,255,
-219,0,218,255,242,0,224,0,45,0,229,0,40,0,233,255,223,0,236,255,217,0,239,255,
-225,0,247,0,40,0,10,0,7,255,124,0,198,255,65,0,202,255,63,0,212,255,190,0,215,
-255,137,0,233,255,158,0,239,255,198,1,8,255,139,1,12,255,139,3,177,255,133,0,
-10,0,7,255,131,0,198,255,69,0,202,255,67,0,212,255,194,0,215,255,141,0,233,
-255,164,0,239,255,200,1,8,255,145,1,12,255,145,3,177,255,135,0,9,0,198,255,
-206,0,200,255,207,0,202,255,205,0,205,255,202,0,206,255,207,0,209,255,207,0,
-210,255,217,0,229,255,214,0,247,255,214,0,10,0,198,255,202,0,200,255,206,0,
-202,255,202,0,205,255,203,0,206,255,207,0,209,255,206,0,210,255,217,0,224,255,
-203,0,229,255,214,0,247,255,214,0,21,0,35,255,250,0,39,255,250,0,47,255,253,0,
-49,255,250,0,52,255,214,0,53,255,249,0,54,255,236,0,55,255,243,0,57,255,229,0,
-69,255,252,0,79,255,250,0,85,255,253,0,89,0,6,1,66,255,253,1,70,255,249,1,78,
-255,249,1,80,255,249,1,83,0,1,1,84,255,253,1,85,0,1,1,88,0,1,0,4,0,224,255,
-225,0,225,255,224,0,233,255,223,0,239,255,241,0,8,0,7,255,191,0,225,255,237,0,
-233,255,230,0,236,255,238,0,239,255,235,1,8,255,230,1,12,255,230,3,177,255,
-190,0,4,0,224,255,132,0,229,255,171,0,246,255,211,0,247,255,171,0,4,0,224,0,
-42,0,233,255,219,0,236,255,216,0,239,255,223,0,8,0,7,0,11,0,234,255,236,0,236,
-255,245,0,246,255,218,0,254,255,220,1,8,0,11,1,12,0,11,3,177,0,11,0,6,0,7,255,
-232,0,233,255,237,0,236,255,240,1,8,255,236,1,12,255,236,3,177,255,232,0,11,0,
-221,255,233,0,234,255,224,0,236,255,242,0,246,255,211,0,254,255,213,1,8,0,12,
-1,12,0,12,1,66,255,212,1,70,255,208,1,78,255,212,1,80,255,212,0,22,0,7,0,34,0,
-70,0,29,0,224,255,133,0,229,255,172,0,234,255,223,0,246,255,211,0,247,255,172,
-0,254,255,213,1,8,0,31,1,12,0,31,1,63,255,122,1,66,255,220,1,70,255,216,1,78,
-255,218,1,80,255,216,1,82,255,234,1,83,0,29,1,85,0,27,1,86,0,20,1,87,0,8,1,88,
-0,27,3,177,0,34,0,7,0,88,255,244,0,90,255,244,0,225,255,236,0,229,255,246,0,
-233,255,229,0,239,255,237,0,247,255,246,0,6,0,224,0,37,0,229,0,32,0,233,255,
-222,0,236,255,220,0,239,255,224,0,247,0,32,0,8,0,224,0,43,0,229,0,38,0,233,
-255,206,0,236,255,203,0,239,255,215,0,242,255,242,0,246,255,224,0,247,0,38,0,
-3,0,233,255,122,0,236,255,203,0,239,255,178,0,7,0,7,254,253,0,233,255,118,0,
-236,255,202,0,239,255,174,1,8,255,35,1,12,255,39,3,177,255,10,0,5,0,224,255,
-218,0,225,255,218,0,229,255,225,0,239,255,222,0,247,255,225,0,5,0,224,255,217,
-0,225,255,217,0,226,255,245,0,229,255,223,0,239,255,232,0,4,0,7,255,240,1,8,
-255,244,1,12,255,244,3,177,255,240,0,5,0,225,255,232,0,233,255,116,0,234,0,11,
-0,236,255,200,0,239,255,172,0,4,0,225,255,236,0,233,255,121,0,236,255,203,0,
-239,255,177,0,24,0,33,255,120,0,52,0,12,0,54,0,16,0,55,0,18,0,57,0,9,0,65,255,
-225,0,67,255,217,0,68,255,197,0,69,255,217,0,70,0,5,0,71,255,222,0,77,255,247,
-0,78,255,247,0,79,255,217,0,81,255,222,0,83,255,237,0,84,0,11,0,85,255,254,0,
-86,0,36,0,87,0,32,0,88,0,18,0,89,0,36,0,90,0,8,1,7,255,241,0,7,0,68,255,172,0,
-77,255,243,0,82,255,247,0,83,255,216,0,84,0,6,0,86,0,27,1,8,255,245,0,24,0,33,
-255,118,0,52,0,9,0,54,0,10,0,55,0,12,0,57,0,7,0,65,255,223,0,67,255,215,0,68,
-255,191,0,69,255,215,0,71,255,215,0,77,255,245,0,78,255,245,0,79,255,211,0,80,
-255,249,0,81,255,219,0,82,255,245,0,83,255,230,0,84,0,4,0,85,255,252,0,86,0,
-27,0,87,0,23,0,88,0,12,0,89,0,27,0,90,0,3,0,9,1,66,255,227,1,70,255,227,1,78,
-255,227,1,80,255,227,1,83,255,125,1,84,255,216,1,85,255,139,1,86,255,175,1,88,
-255,123,0,4,1,66,255,254,1,70,255,254,1,78,255,254,1,80,255,254,0,2,1,85,255,
-220,1,86,255,234,0,2,1,85,0,4,1,88,0,4,0,1,1,63,255,162,0,4,1,66,255,212,1,70,
-255,208,1,78,255,212,1,80,255,212,0,10,1,63,0,35,1,66,255,224,1,70,255,220,1,
-78,255,222,1,80,255,223,1,83,255,115,1,84,255,215,1,85,255,107,1,86,255,167,1,
-88,255,101,0,6,1,63,255,229,1,83,255,219,1,85,255,225,1,86,255,239,1,87,255,
-215,1,88,255,211,0,4,1,63,255,168,1,68,255,245,1,71,255,245,1,72,255,245,0,6,
-1,63,0,13,1,83,255,208,1,84,255,246,1,85,255,213,1,86,255,226,1,88,255,201,0,
-9,1,66,255,252,1,70,255,252,1,78,255,252,1,80,255,252,1,83,255,228,1,84,255,
-245,1,85,255,226,1,86,255,233,1,88,255,219,0,11,1,63,255,122,1,66,255,220,1,
-70,255,216,1,78,255,218,1,80,255,216,1,82,255,234,1,83,0,29,1,85,0,27,1,86,0,
-20,1,87,0,8,1,88,0,27,0,1,1,63,255,221,0,5,1,63,255,140,1,66,255,228,1,70,255,
-224,1,78,255,224,1,80,255,224,0,6,1,63,255,182,1,66,255,239,1,70,255,239,1,78,
-255,239,1,80,255,239,1,83,0,28,0,4,1,66,255,218,1,70,255,214,1,78,255,214,1,
-80,255,214,0,10,1,63,255,124,1,66,255,217,1,70,255,213,1,78,255,213,1,80,255,
-213,1,83,0,31,1,85,0,33,1,86,0,27,1,87,0,14,1,88,0,33,0,5,1,63,0,25,1,66,255,
-224,1,70,255,224,1,78,255,224,1,80,255,224,0,26,0,9,0,40,0,12,255,76,0,13,255,
-181,0,14,255,81,0,26,255,193,0,27,255,193,0,33,255,103,0,35,255,213,0,39,255,
-213,0,47,255,210,0,49,255,213,0,61,0,34,0,65,255,161,0,69,255,165,0,79,255,
-161,0,82,255,194,0,85,255,198,0,89,255,234,0,93,0,38,1,8,0,12,1,12,0,12,1,63,
-255,100,1,66,255,177,1,70,255,177,1,78,255,177,1,80,255,177,0,10,0,12,255,135,
-0,14,255,139,0,65,255,226,0,67,255,229,0,68,255,229,0,69,255,229,0,79,255,225,
-0,81,255,229,1,8,0,34,1,12,0,34,0,10,0,35,255,253,0,39,255,253,0,47,255,254,0,
-49,255,253,0,65,0,8,0,73,255,247,0,82,255,255,0,85,255,252,0,89,0,16,0,90,0,2,
-0,2,1,8,255,234,1,12,255,234,0,5,0,65,255,250,0,69,255,246,0,79,255,246,0,85,
-255,247,0,89,255,253,0,13,0,35,255,250,0,39,255,250,0,47,255,247,0,49,255,250,
-0,73,255,244,0,82,255,250,0,85,255,250,0,89,0,11,0,90,255,247,1,66,255,250,1,
-70,255,249,1,78,255,249,1,80,255,250,0,2,1,8,255,246,1,12,255,246,0,2,0,35,0,
-8,0,8,0,0,0,16,0,25,0,1,0,33,0,59,0,11,0,65,0,73,0,38,0,75,0,80,0,47,0,82,0,
-91,0,53,0,168,0,168,0,63,0,170,0,172,0,64,0,174,0,176,0,67,0,178,0,178,0,70,0,
-180,0,184,0,71,0,186,0,188,0,76,0,190,0,190,0,79,0,192,0,193,0,80,0,195,0,198,
-0,82,0,200,0,202,0,86,0,204,0,208,0,89,0,210,0,211,0,94,0,214,0,215,0,96,0,
-217,0,226,0,98,0,228,0,228,0,108,0,233,0,235,0,109,0,238,0,239,0,112,0,241,0,
-243,0,114,0,246,0,248,0,117,1,7,1,8,0,120,1,11,1,11,0,122,1,63,1,63,0,123,1,
-66,1,69,0,124,1,74,1,75,0,128,1,78,1,81,0,130,1,83,1,89,0,134,1,111,1,114,0,
-141,1,137,1,137,0,145,1,141,1,142,0,146,0,1,0,0,0,10,0,32,0,58,0,1,108,97,116,
-110,0,8,0,4,0,0,0,0,255,255,0,2,0,0,0,1,0,2,108,105,103,97,0,14,115,109,99,
-112,0,20,0,0,0,1,0,0,0,0,0,1,0,1,0,2,0,6,0,14,0,4,0,0,0,1,0,16,0,1,0,0,0,1,0,
-26,0,1,0,148,0,1,0,8,0,1,0,4,0,130,0,2,0,69,0,2,0,136,0,62,1,90,1,91,1,92,1,
-93,1,94,1,95,1,96,1,97,1,98,1,99,1,63,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,
-1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,
-88,1,89,1,63,1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72,1,73,1,74,1,75,1,76,1,77,
-1,78,1,79,1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88,1,89,0,1,0,1,0,65,0,2,
-0,3,0,16,0,25,0,0,0,33,0,58,0,10,0,65,0,90,0,36};
+static const char
+default_font_bitmap[] =
+{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,3,154,0,0,0,14,8,6,0,0,0,78,
+234,99,67,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,9,112,72,89,115,
+0,0,14,194,0,0,14,194,1,21,40,74,128,0,0,0,25,116,69,88,116,83,111,102,116,
+119,97,114,101,0,112,97,105,110,116,46,110,101,116,32,52,46,48,46,50,49,241,
+32,105,149,0,0,29,22,73,68,65,84,120,94,237,92,61,168,109,75,82,126,8,134,166,
+26,138,32,152,152,60,16,68,12,6,28,159,130,136,129,58,193,168,136,99,96,224,4,
+38,47,83,208,64,197,224,129,168,32,19,61,13,12,100,20,20,196,72,196,216,159,
+200,68,19,49,209,72,65,20,19,17,217,246,87,95,215,174,175,126,122,239,117,206,
+61,87,158,48,181,169,123,86,87,125,93,93,127,221,107,173,125,238,189,31,220,
+62,184,221,192,31,20,114,249,164,115,82,204,35,28,232,10,238,10,6,116,21,7,
+122,132,123,169,141,43,248,9,247,104,222,132,159,104,194,169,76,229,87,232,
+234,188,171,56,208,251,192,42,238,132,125,164,3,93,153,251,104,62,232,165,184,
+61,124,74,111,105,247,173,48,78,142,189,106,243,25,206,233,125,224,21,115,5,
+183,135,15,73,237,93,153,243,8,127,146,59,61,211,43,93,193,94,193,76,164,243,
+174,206,125,41,30,116,117,206,85,92,165,151,204,187,130,123,169,173,183,198,
+130,94,138,175,116,117,238,75,214,120,107,155,142,59,97,85,127,194,40,93,197,
+190,47,123,255,223,112,239,34,175,58,167,147,254,165,114,167,103,122,208,85,
+125,197,60,155,7,58,97,92,94,117,39,185,147,234,79,24,167,215,98,183,40,209,
+85,253,30,38,250,44,233,78,228,115,222,199,188,43,24,165,151,226,157,238,243,
+238,179,11,87,73,30,5,87,73,30,5,87,201,73,174,60,75,201,251,74,13,236,208,44,
+56,149,143,137,169,24,227,219,237,211,197,159,96,164,100,200,140,221,154,32,
+67,60,192,108,41,237,63,192,41,65,119,199,125,225,126,5,255,64,159,222,37,87,
+109,56,95,141,243,118,251,207,197,95,18,153,95,125,105,241,191,44,254,72,116,
+160,143,22,67,14,253,182,58,218,197,218,234,191,243,158,241,152,128,147,57,
+199,121,134,186,128,3,25,242,141,177,134,202,184,132,13,73,215,57,153,246,160,
+47,186,113,62,200,80,47,199,109,233,153,10,254,157,236,190,22,115,31,9,155,60,
+99,111,183,95,76,163,96,236,171,44,225,124,149,40,87,252,201,238,98,179,195,
+79,72,39,60,100,85,250,28,71,251,170,87,238,113,53,155,105,254,35,31,186,46,
+143,170,190,172,147,248,9,214,124,226,231,136,1,59,37,121,181,13,158,236,203,
+120,152,147,71,19,243,19,146,193,63,227,151,246,214,98,211,95,181,15,86,108,
+220,35,50,171,31,143,108,213,92,20,172,249,230,227,11,88,208,93,246,0,159,112,
+39,214,249,101,173,196,15,112,109,157,215,216,204,81,100,230,39,75,116,148,
+237,144,79,53,3,87,123,87,234,187,174,156,18,6,156,113,87,237,129,243,200,185,
+198,115,202,97,197,93,93,247,5,254,89,188,252,60,151,187,159,83,61,106,12,29,
+51,219,124,34,119,50,237,3,61,200,16,131,254,46,169,62,241,185,235,171,246,
+211,101,37,14,167,53,138,185,154,223,154,83,159,95,215,42,118,155,158,188,87,
+203,4,185,96,140,183,106,164,132,173,189,48,244,64,26,169,95,213,103,126,56,
+170,118,31,205,203,107,102,221,213,245,234,188,194,78,107,148,145,213,230,137,
+235,188,136,239,227,197,246,204,63,229,206,214,84,137,114,181,249,12,239,172,
+243,170,206,185,74,242,40,184,74,242,40,184,74,110,183,111,177,171,42,87,158,
+165,228,125,165,6,44,120,144,73,67,62,54,115,197,24,127,150,95,52,127,198,254,
+140,23,185,223,16,221,85,27,206,95,123,209,108,100,200,55,198,26,42,227,18,54,
+36,93,231,100,90,215,127,238,126,69,198,56,75,246,172,76,134,122,57,110,75,
+207,84,240,239,100,247,181,152,61,66,191,253,215,98,28,166,91,107,31,31,129,
+208,155,255,97,87,65,31,167,27,4,56,231,24,125,170,212,241,92,179,18,15,116,
+112,173,209,140,255,56,97,136,171,107,35,190,105,47,130,43,246,147,230,39,152,
+107,227,129,228,195,197,154,191,121,63,234,126,206,58,191,58,157,3,176,143,
+117,162,30,92,163,198,0,106,103,198,146,103,223,163,118,147,239,96,207,233,
+148,71,215,225,204,83,13,108,230,135,51,112,212,223,99,80,98,60,189,166,19,
+246,211,39,189,5,127,148,162,103,122,252,115,47,64,171,190,240,97,164,246,121,
+238,217,217,87,167,220,3,90,223,37,145,156,247,126,9,187,17,71,240,132,71,252,
+181,38,192,193,119,91,111,115,239,49,214,33,114,16,56,158,1,129,59,249,132,49,
+228,31,10,214,251,164,18,253,113,92,212,16,54,156,24,71,237,11,222,179,29,155,
+237,56,19,83,107,50,219,99,125,61,78,16,99,128,141,192,89,157,64,91,18,121,
+201,56,183,87,251,240,211,182,238,28,115,206,31,184,219,114,202,251,146,235,
+106,190,89,75,237,211,25,199,28,214,56,118,204,38,189,34,143,124,79,231,133,
+238,159,169,102,179,205,39,114,39,211,62,208,131,12,81,244,50,3,53,168,123,
+169,159,101,148,165,115,21,180,116,97,155,189,135,154,125,210,114,202,121,167,
+179,253,247,22,255,214,226,222,3,228,189,90,38,200,5,99,188,85,35,37,44,123,1,
+107,195,223,143,90,175,68,143,118,191,217,67,244,21,18,245,131,57,240,30,203,
+245,14,57,251,83,115,20,235,193,159,156,7,250,192,61,7,137,174,151,253,244,
+125,76,251,148,123,236,49,7,76,223,177,14,40,98,9,121,95,11,204,188,229,179,
+170,230,46,143,126,121,49,124,1,127,197,100,213,102,196,0,174,123,62,98,1,206,
+81,129,207,92,37,121,20,92,37,252,243,27,23,255,210,226,239,218,227,9,247,23,
+139,191,167,201,149,103,41,121,95,169,97,43,16,200,164,33,31,155,185,98,140,
+125,211,149,41,134,204,216,173,9,50,196,3,204,150,210,254,3,156,18,116,119,28,
+27,6,5,196,38,255,176,52,203,158,209,201,80,129,35,95,141,19,27,43,31,64,170,
+173,58,208,243,195,141,184,126,88,146,247,140,199,4,156,204,57,206,51,212,5,
+28,200,144,111,140,53,84,198,37,108,72,186,206,201,180,174,231,161,136,220,
+242,32,173,249,31,230,131,12,245,114,220,150,158,169,224,223,201,238,107,48,
+247,43,246,211,191,46,158,111,38,224,210,155,251,39,110,44,249,197,135,57,246,
+195,187,30,232,216,55,245,198,155,111,98,100,224,40,235,123,164,227,123,29,65,
+220,35,42,85,220,116,163,11,44,230,158,94,186,238,88,203,105,224,251,126,212,
+156,101,157,95,69,47,170,158,246,177,14,111,126,252,201,155,120,189,201,149,
+186,152,79,252,76,24,216,112,155,206,88,11,103,34,117,170,1,199,218,113,227,
+39,195,38,124,204,190,179,254,240,5,120,228,197,53,192,195,78,127,137,239,241,
+250,56,159,245,180,237,118,180,182,142,167,76,111,208,96,175,79,72,48,6,62,
+247,87,216,86,63,240,64,24,15,65,244,193,57,234,135,177,218,2,23,189,213,134,
+154,222,47,248,226,83,253,10,77,228,198,37,96,250,88,177,136,17,164,117,226,
+90,250,197,42,215,2,86,115,130,235,79,6,28,108,33,39,140,81,253,81,108,206,11,
+56,112,90,111,226,212,166,227,166,190,0,14,132,254,236,251,4,76,123,136,209,
+99,14,123,189,30,88,15,113,2,115,90,87,235,4,142,156,62,239,91,114,237,63,204,
+163,143,154,239,222,47,61,135,176,11,251,245,133,20,125,133,252,217,158,95,28,
+125,243,28,151,123,129,204,152,249,121,46,215,184,85,78,221,111,46,246,94,65,
+188,245,92,156,109,62,145,59,153,246,129,30,100,136,162,223,35,248,197,179,50,
+244,32,200,17,79,244,23,123,31,249,2,155,212,236,168,109,214,149,251,166,247,
+6,114,206,103,205,44,71,238,32,199,11,73,215,147,187,132,210,166,49,167,14,
+148,176,209,35,248,137,117,115,93,216,123,238,91,254,210,162,230,66,251,155,
+57,64,159,178,183,181,167,57,47,114,174,54,185,94,228,93,123,146,243,194,166,
+174,23,126,178,255,40,245,216,32,39,114,190,7,208,255,243,53,230,212,121,190,
+7,127,97,49,112,95,94,156,251,7,107,241,10,235,195,103,196,133,121,244,79,115,
+2,102,206,208,31,245,30,9,198,92,236,217,220,83,25,19,92,37,121,20,92,37,252,
+243,231,23,255,227,98,212,156,26,197,128,111,183,111,93,252,223,77,174,204,63,
+127,120,241,15,236,107,240,183,217,207,61,82,195,187,61,135,205,28,87,193,181,
+144,96,223,116,89,218,177,81,152,224,90,140,9,227,246,179,52,143,148,117,93,
+54,111,108,126,109,236,71,54,170,95,224,171,113,98,110,158,175,218,110,91,55,
+229,99,28,214,238,15,182,192,101,201,204,147,159,170,119,174,235,214,145,242,
+85,155,224,138,197,88,245,206,125,253,110,87,49,147,29,93,43,122,128,15,45,
+185,7,174,231,225,10,238,132,81,126,75,187,47,197,196,149,223,92,112,40,70,
+239,241,227,88,80,237,205,24,43,142,57,70,127,230,131,223,57,251,0,242,131,
+188,98,185,199,106,141,10,126,60,175,136,227,30,217,24,144,161,92,207,195,254,
+186,159,224,105,109,106,230,253,120,202,81,88,142,94,84,61,237,99,29,172,7,76,
+60,44,214,189,83,234,98,62,241,51,97,226,91,244,208,98,30,234,207,30,208,121,
+224,136,25,55,90,127,57,128,6,63,33,207,190,179,254,243,249,168,177,168,52,
+199,235,82,92,159,94,198,172,174,133,225,15,108,247,223,60,245,57,240,131,121,
+87,108,228,34,247,67,217,55,150,99,142,194,142,105,236,227,56,80,210,203,188,
+222,47,241,240,17,181,38,135,13,151,128,59,214,235,1,214,220,179,22,243,67,30,
+243,69,198,117,206,7,113,181,54,248,137,241,248,155,192,251,72,115,222,207,
+224,218,31,97,211,37,96,174,15,158,115,0,158,239,29,92,91,99,6,135,61,231,9,
+167,122,248,133,126,96,252,213,30,115,3,189,214,235,180,71,97,131,125,114,194,
+173,145,228,48,108,247,117,177,158,246,233,156,31,173,1,57,252,80,156,175,203,
+207,115,185,250,166,114,112,206,49,215,87,137,235,115,239,156,229,107,164,100,
+218,7,122,144,33,138,126,143,230,62,155,242,130,156,151,60,155,29,181,77,12,
+242,59,245,6,108,66,247,232,69,243,43,109,30,217,175,114,223,240,163,184,30,
+188,80,194,254,142,253,137,120,248,133,33,198,170,103,44,200,79,223,179,212,
+133,47,90,163,58,143,159,58,15,189,153,251,152,186,200,239,35,157,174,199,62,
+65,14,225,11,214,197,56,214,247,158,171,125,196,223,46,194,166,227,129,123,92,
+95,206,243,61,228,115,122,143,242,12,2,102,162,83,191,249,217,235,177,128,32,
+131,63,158,235,184,31,199,108,231,239,94,252,199,77,122,187,253,219,226,31,
+219,163,224,60,2,225,207,127,88,252,125,54,186,221,190,121,241,9,215,229,202,
+183,219,175,217,159,164,95,89,12,233,191,47,254,38,199,168,1,75,52,200,164,33,
+7,225,79,77,228,244,235,99,16,48,254,48,227,212,55,97,52,18,154,222,41,63,228,
+16,131,66,84,202,47,154,113,163,81,255,88,92,109,136,110,43,214,155,109,160,
+49,185,65,92,235,220,227,68,28,249,175,6,16,247,78,127,117,118,49,214,161,237,
+140,235,7,56,229,110,23,135,152,147,111,16,167,233,219,55,95,23,243,188,38,
+204,161,226,230,60,209,191,107,54,249,48,51,247,195,243,90,131,185,54,106,3,
+91,240,49,242,64,59,234,91,254,107,76,125,141,156,67,173,11,37,113,160,101,28,
+242,201,252,100,92,248,219,109,97,109,198,31,227,186,62,236,42,6,177,228,58,
+244,181,29,167,107,99,62,236,40,209,174,99,34,43,240,195,237,193,14,248,233,
+11,205,226,152,151,113,145,179,45,85,90,146,106,87,215,39,134,154,147,253,132,
+55,174,251,142,56,238,17,149,230,243,160,249,153,120,182,217,215,38,115,45,
+149,128,53,103,89,231,87,209,35,170,15,223,176,119,80,183,240,145,31,197,166,
+186,88,254,206,24,216,209,26,130,145,35,200,249,83,231,129,115,204,209,31,180,
+9,249,195,51,204,9,215,139,35,231,121,206,84,139,158,211,130,115,194,245,102,
+248,54,157,111,181,23,34,142,124,62,192,247,156,111,112,206,167,174,25,245,
+235,56,80,210,203,188,30,27,250,45,226,131,222,53,196,246,47,92,106,206,176,
+22,30,82,240,133,0,228,208,71,45,52,39,113,142,99,46,244,96,218,209,124,100,
+28,108,194,94,172,153,207,136,184,162,62,206,49,126,168,161,95,240,83,123,48,
+242,228,18,242,51,189,97,156,182,36,114,88,251,32,226,1,71,254,116,175,7,198,
+115,135,223,96,16,215,251,10,24,61,103,129,59,253,45,12,196,12,189,83,183,151,
+71,152,211,123,20,28,47,235,172,3,123,100,250,82,174,246,125,244,131,226,214,
+44,203,31,63,207,229,90,67,149,131,35,127,145,95,213,107,125,178,28,53,70,46,
+71,223,156,48,22,93,211,131,12,33,122,65,51,103,61,79,222,215,209,95,121,63,
+90,158,155,109,212,207,109,214,90,114,126,191,143,184,220,185,214,150,236,87,
+225,23,165,29,203,26,79,52,229,151,123,200,125,86,61,99,97,31,65,162,107,69,
+46,88,115,141,149,243,162,87,117,30,117,209,115,125,30,124,130,205,199,47,154,
+170,139,252,97,77,167,56,107,232,127,127,63,209,216,226,154,121,8,84,175,7,
+253,192,243,43,176,156,95,49,209,243,192,226,217,20,185,2,158,62,213,30,208,
+124,169,221,240,9,215,196,196,28,191,250,206,197,127,184,248,239,23,255,248,
+93,234,124,187,125,126,241,31,217,149,190,112,118,220,143,44,254,171,61,250,
+179,197,191,106,215,29,199,171,42,87,190,221,254,103,241,183,239,209,31,64,
+176,232,119,23,223,231,169,1,219,72,32,147,134,28,132,160,189,32,209,56,138,
+33,14,73,226,139,7,37,248,217,15,15,202,129,139,34,247,98,196,92,74,176,46,
+198,121,3,177,41,189,113,92,202,130,233,129,194,195,25,182,216,188,170,11,27,
+216,212,104,18,31,51,22,199,57,247,56,49,158,30,6,222,229,69,51,252,153,55,
+205,244,96,139,121,190,41,32,65,126,65,192,99,12,253,84,15,207,173,199,239,
+227,233,48,98,172,33,197,26,192,78,177,168,77,72,35,166,140,13,191,40,241,56,
+114,173,137,197,218,92,207,165,161,131,47,186,94,62,20,162,7,152,251,94,175,
+208,81,2,59,176,87,111,150,208,123,157,32,137,121,129,193,92,30,204,148,248,
+203,177,247,60,226,200,118,233,31,228,200,19,230,245,131,246,202,218,249,102,
+22,120,181,19,135,163,175,135,235,168,101,223,143,176,3,157,82,255,102,84,115,
+182,36,149,12,157,241,169,102,134,161,166,199,21,120,165,211,30,69,76,74,140,
+43,244,201,207,205,200,133,211,212,123,117,109,165,105,63,70,238,179,206,175,
+78,49,186,111,32,248,100,26,203,77,207,95,234,135,11,24,228,197,109,198,250,
+148,229,126,228,92,173,15,240,200,55,100,152,3,121,245,189,249,3,194,245,102,
+246,155,74,122,45,96,131,123,229,1,78,9,227,197,140,109,62,47,149,124,157,156,
+43,158,111,208,129,216,47,208,228,7,11,93,79,243,151,109,129,139,94,230,209,
+79,197,198,126,196,250,158,111,48,207,144,26,19,207,10,173,37,174,193,88,139,
+117,225,250,60,67,242,126,246,43,207,231,189,199,246,167,226,96,11,113,224,
+139,15,218,123,140,101,237,66,19,218,176,101,253,177,57,242,228,18,242,51,189,
+98,156,17,11,243,87,207,48,230,216,235,11,162,143,138,227,217,169,125,22,215,
+181,6,196,42,99,237,233,57,0,117,209,231,5,216,205,231,17,217,175,162,238,148,
+102,123,113,159,80,154,94,160,176,78,93,119,58,47,217,155,117,157,147,92,253,
+83,57,56,231,111,250,210,39,116,89,14,31,145,147,108,179,230,88,107,69,54,31,
+149,12,33,250,125,21,61,84,109,176,39,225,83,212,35,239,199,121,127,240,188,
+128,110,252,210,96,240,229,46,119,50,109,214,107,204,225,23,198,61,246,30,188,
+80,194,62,203,99,244,20,226,165,87,174,203,207,10,57,86,230,32,114,164,243,
+168,139,253,174,243,184,30,230,33,190,233,183,150,81,47,237,107,234,188,135,
+160,7,107,143,195,143,211,47,83,208,95,32,204,197,23,114,196,6,245,58,50,6,
+216,198,26,92,167,98,34,183,136,7,140,181,96,27,126,78,47,175,88,211,113,81,
+95,202,152,71,174,249,21,153,243,19,139,127,127,49,98,248,185,197,212,184,62,
+112,126,245,29,139,255,124,241,223,44,254,98,194,128,111,183,63,93,252,179,
+123,244,189,139,241,79,167,190,110,192,241,170,202,149,187,228,235,239,215,91,
+162,6,118,123,142,7,11,254,244,100,59,77,15,37,94,56,149,66,86,31,24,128,241,
+132,158,214,76,152,205,180,175,146,104,186,74,108,96,199,69,195,240,70,169,
+205,18,54,80,104,151,198,6,113,137,115,143,19,243,242,122,196,189,246,69,19,
+62,210,30,52,115,163,158,94,52,105,151,146,136,161,142,243,188,138,3,79,185,
+158,112,145,187,231,88,200,128,173,113,95,171,53,184,231,94,235,8,251,216,136,
+188,137,67,170,7,88,244,0,252,154,254,189,91,232,40,153,99,139,67,217,125,166,
+79,122,32,18,3,63,193,176,7,140,31,110,115,30,232,159,199,16,135,167,214,63,
+236,250,218,188,214,181,227,42,247,181,218,225,225,232,107,121,223,199,56,219,
+3,65,167,245,116,219,15,95,26,42,45,76,181,27,123,103,227,241,51,201,31,224,
+141,181,198,129,211,28,145,21,87,252,44,204,122,86,233,180,54,153,107,169,4,
+172,57,203,58,191,138,126,83,125,248,230,191,157,138,56,248,81,108,170,139,
+229,239,49,6,140,26,227,39,227,36,10,215,211,153,94,99,6,30,243,127,106,49,
+228,167,51,236,238,15,8,215,139,35,231,121,142,203,149,250,77,95,231,47,137,
+19,174,55,51,158,62,79,123,193,253,135,159,57,87,241,64,229,56,80,251,171,149,
+178,38,98,100,253,76,99,31,199,129,146,94,230,209,31,197,198,76,205,95,228,
+190,246,56,207,10,96,112,175,192,156,120,49,241,90,146,25,183,238,253,136,19,
+126,248,189,198,114,154,112,121,69,207,7,113,212,78,54,177,158,231,154,49,43,
+142,53,84,95,193,145,39,151,144,159,233,117,93,228,0,117,189,175,93,98,169,
+245,5,211,87,173,111,63,95,163,231,234,153,184,70,78,91,50,251,153,237,129,
+231,125,16,254,69,221,49,230,39,112,212,71,15,115,93,238,105,197,177,71,188,
+110,32,228,157,185,87,220,142,3,63,69,118,150,107,13,85,14,142,53,25,111,173,
+1,239,59,253,204,62,201,163,174,78,245,140,50,31,149,32,187,235,35,167,103,
+159,184,6,242,173,117,243,171,208,81,26,26,198,10,155,111,251,162,153,107,166,
+212,238,73,219,204,72,5,187,165,36,140,69,7,202,251,50,235,253,10,126,229,243,
+149,57,136,115,70,231,81,135,188,241,60,211,121,92,135,123,5,18,173,187,247,
+130,238,3,151,112,127,98,45,248,226,82,239,127,124,17,70,155,167,254,34,123,
+77,113,15,131,45,196,14,27,136,63,63,111,228,61,9,61,158,203,234,253,11,115,
+245,221,72,233,227,161,223,216,51,186,38,53,204,47,175,153,211,152,243,235,
+246,39,34,9,75,217,46,56,143,190,127,241,63,45,254,235,36,5,223,110,63,36,35,
+240,15,46,254,134,36,1,251,85,149,43,207,82,242,190,82,3,187,5,199,38,68,81,
+88,112,50,174,167,135,146,218,0,51,150,24,54,166,115,63,96,58,198,237,171,68,
+215,200,216,233,191,76,142,194,230,166,159,108,196,6,113,137,115,143,19,243,
+152,159,140,123,205,139,38,54,12,190,93,136,27,73,111,84,230,70,101,148,135,
+93,74,34,134,58,206,243,42,14,60,229,122,194,157,106,60,97,195,191,140,189,86,
+107,112,207,125,228,134,135,16,24,235,96,227,231,154,68,15,208,7,237,1,176,
+234,40,153,99,203,118,226,129,91,123,56,247,27,94,24,224,51,236,210,30,190,
+173,170,15,46,156,3,12,106,63,191,104,242,192,244,181,127,116,49,236,95,249,
+109,37,244,129,137,7,170,137,114,222,192,244,11,107,210,39,50,235,166,184,176,
+91,235,73,238,251,60,246,142,226,220,247,154,163,130,31,207,43,226,238,62,56,
+25,202,245,131,159,134,225,53,215,246,145,243,180,54,53,61,15,96,205,89,214,
+249,149,247,71,205,117,244,93,244,3,214,56,61,36,221,235,98,62,105,156,3,102,
+49,226,139,127,26,16,178,233,76,175,245,113,223,156,243,94,102,94,153,191,144,
+58,99,45,196,82,207,31,141,55,52,53,214,199,189,229,121,122,246,111,52,125,
+173,158,79,238,45,229,169,126,204,49,71,136,7,122,224,96,167,174,91,243,238,
+76,127,84,146,103,122,254,34,143,53,23,244,213,237,35,111,192,122,141,48,199,
+231,51,167,234,91,156,77,172,5,49,184,174,15,104,199,88,77,222,109,134,157,
+141,1,37,220,92,107,92,67,150,247,65,204,138,181,179,94,207,67,143,197,52,109,
+221,192,42,119,187,244,29,182,38,202,53,187,98,15,204,248,188,255,192,145,3,
+197,209,94,207,79,141,67,251,130,60,219,139,251,128,51,252,235,231,205,178,
+254,48,95,248,169,114,174,199,251,142,202,193,156,227,189,215,109,174,209,139,
+214,114,185,115,213,175,81,37,67,184,158,243,243,62,84,61,152,122,228,79,235,
+166,136,200,119,63,47,184,199,14,126,153,116,144,59,153,54,235,53,230,240,11,
+227,190,6,8,126,77,84,239,95,123,69,18,198,162,211,115,155,125,167,250,232,35,
+234,245,89,35,246,125,175,55,117,145,123,157,199,245,98,223,107,108,140,63,
+246,18,176,174,211,222,163,196,25,182,64,189,78,100,29,121,156,176,129,251,32,
+100,176,11,121,222,187,81,11,224,97,155,177,42,134,177,196,252,192,18,81,125,
+161,14,28,185,225,53,206,29,216,232,251,153,127,242,223,101,222,110,255,188,
+248,139,38,115,125,198,225,37,242,47,23,255,237,226,159,52,217,140,235,92,37,
+39,185,242,44,37,239,43,53,176,91,112,104,66,38,0,201,195,8,63,65,211,67,9,
+146,116,191,209,44,6,150,227,140,67,98,33,247,102,193,207,47,23,12,230,198,
+195,54,127,98,156,55,16,155,25,69,99,195,82,138,185,249,155,4,226,96,131,7,
+109,111,122,248,174,54,96,147,235,59,206,153,216,104,36,174,199,185,25,247,46,
+127,117,54,114,167,190,18,135,181,167,7,219,176,75,137,218,203,227,60,175,226,
+192,140,81,113,145,39,176,75,79,53,134,77,200,21,203,185,122,112,16,123,173,
+214,196,210,47,149,134,142,255,35,24,71,248,201,92,184,62,122,128,242,238,135,
+251,12,127,32,193,79,208,163,7,2,124,41,192,24,251,77,200,243,10,140,251,5,44,
+198,253,55,47,145,95,196,135,181,217,83,122,8,231,67,31,220,49,140,19,54,180,
+159,243,141,42,252,167,239,193,240,147,123,83,165,17,139,199,225,243,115,141,
+34,238,90,123,224,49,174,125,18,113,134,116,142,235,132,175,24,226,184,71,214,
+200,201,80,174,63,251,9,198,120,234,189,180,182,217,164,230,180,31,35,103,42,
+231,218,96,206,235,125,232,185,197,122,144,32,231,216,15,211,111,249,106,93,
+122,62,58,198,237,105,220,184,158,206,244,169,62,62,31,185,203,245,100,108,
+174,71,124,174,241,92,63,250,235,116,22,175,147,161,20,119,174,153,207,167,
+108,190,177,43,30,254,193,70,253,150,29,235,43,110,170,31,125,227,8,118,160,7,
+142,222,6,238,116,95,137,181,21,155,237,194,15,96,136,51,173,125,2,223,207,
+129,26,31,214,196,189,174,251,22,249,242,250,68,254,114,47,170,79,41,86,147,
+103,155,94,23,239,217,96,237,71,158,77,218,83,190,246,248,91,161,125,21,107,
+103,125,61,51,179,182,239,3,172,171,56,230,77,99,102,143,41,135,127,125,159,
+34,102,232,21,55,253,213,237,154,27,175,111,142,135,185,1,22,118,230,60,131,
+117,62,37,115,79,229,88,206,121,118,220,156,175,238,39,115,254,65,203,7,184,
+230,175,238,197,243,90,115,12,11,165,132,177,232,154,30,100,8,215,247,126,203,
+122,176,230,60,228,180,197,17,124,227,115,163,250,77,219,228,26,143,207,231,
+167,201,157,76,155,245,134,217,87,169,23,246,71,113,61,120,161,130,221,82,18,
+198,162,243,88,98,31,169,158,53,155,251,39,242,203,243,71,231,81,7,223,121,
+134,246,121,145,215,171,186,216,239,92,143,236,190,129,40,175,245,136,243,50,
+124,213,53,244,218,145,96,230,3,115,192,184,230,218,138,97,126,16,39,116,176,
+133,151,87,216,155,115,173,57,161,93,16,122,31,191,180,192,79,80,190,79,198,
+108,240,231,22,255,201,226,233,55,149,248,13,230,223,45,254,233,197,161,81,12,
+56,143,130,171,228,36,87,158,165,228,125,165,6,44,41,32,147,134,28,132,4,59,
+161,24,108,56,197,16,135,68,251,191,69,3,225,97,35,55,24,152,141,228,9,6,193,
+94,46,48,49,186,46,48,88,59,63,0,230,27,174,19,27,73,15,57,54,67,52,147,54,98,
+222,72,78,241,141,191,227,156,105,159,27,146,140,88,122,12,239,254,159,1,121,
+252,57,102,202,255,239,95,52,231,60,241,70,84,107,28,54,241,159,38,57,49,71,
+154,123,240,213,90,131,123,238,195,86,247,45,31,138,221,255,156,195,238,199,
+220,235,249,208,98,143,99,204,79,197,192,95,198,93,231,212,60,100,172,251,89,
+255,7,53,191,242,253,131,159,185,215,233,15,214,80,226,154,25,195,27,251,146,
+216,190,167,6,12,63,114,110,88,79,223,215,78,253,165,33,226,174,181,152,207,
+130,136,67,41,234,171,113,61,194,43,134,56,238,145,53,114,90,242,176,21,126,
+130,129,83,98,79,43,2,204,181,239,181,52,155,212,112,45,197,130,117,95,101,
+185,247,24,215,233,125,224,185,99,109,201,30,119,61,11,166,186,124,117,192,
+232,254,158,236,35,7,87,95,52,193,192,247,60,69,94,39,191,184,94,175,105,242,
+199,201,80,138,59,247,22,40,246,97,207,231,189,23,132,49,102,92,46,233,251,31,
+84,31,204,233,27,71,88,15,121,69,172,244,54,112,167,243,18,52,190,84,137,93,
+159,67,255,76,107,159,132,223,87,222,23,90,203,199,243,181,118,49,7,177,32,
+135,218,3,234,83,138,213,228,221,230,68,185,71,162,134,138,71,206,123,95,196,
+40,214,206,122,208,148,95,16,99,87,44,235,171,235,18,83,206,87,167,45,113,251,
+211,111,202,107,143,195,118,143,131,235,122,126,65,243,89,200,126,73,251,205,
+252,224,167,218,211,62,61,157,173,213,191,211,254,131,111,124,46,202,114,224,
+115,253,40,119,187,253,188,96,125,225,27,99,232,107,33,46,172,85,207,68,248,0,
+155,89,190,102,43,97,44,186,166,7,25,194,245,241,98,194,30,179,25,246,241,17,
+8,241,192,95,141,147,182,56,10,159,53,199,148,99,222,39,83,239,218,124,126,
+154,220,201,180,89,111,152,125,21,126,81,218,176,219,204,72,5,187,165,36,140,
+69,231,61,133,122,247,30,166,46,124,209,125,80,231,169,221,152,199,123,143,
+230,142,186,232,187,71,58,93,143,123,196,243,174,4,31,84,158,239,147,236,75,
+216,140,243,154,236,251,104,222,67,244,69,207,140,254,69,18,109,143,252,36,
+215,32,252,84,109,176,214,160,234,200,159,111,146,219,237,183,101,20,92,37,
+121,20,92,37,39,185,242,44,37,239,43,53,96,73,1,153,52,228,32,29,145,235,161,
+11,102,19,116,174,155,112,42,76,181,119,42,94,95,55,143,148,249,225,168,218,
+83,159,102,191,163,41,171,230,20,103,245,13,227,44,243,171,217,246,235,237,
+134,60,75,102,158,236,169,222,185,226,78,53,1,107,62,193,122,192,40,14,92,177,
+179,93,222,28,170,116,242,213,175,38,157,174,85,215,185,26,95,197,213,81,72,
+85,147,117,19,215,60,76,254,131,231,24,112,64,225,80,197,225,202,149,93,115,
+178,163,113,20,140,211,93,86,99,190,226,27,57,143,42,95,141,121,177,249,195,
+79,72,39,124,245,21,44,56,167,53,82,28,101,62,170,252,196,38,56,205,127,132,
+175,186,98,231,37,57,121,106,11,124,5,51,113,157,7,46,115,83,204,224,62,39,
+143,38,230,39,36,195,26,160,53,202,184,58,202,140,115,6,15,11,124,96,80,141,
+216,55,187,161,201,254,199,222,202,156,235,211,109,220,53,246,9,201,201,30,
+184,214,252,145,93,112,181,93,71,207,88,231,151,124,39,206,245,60,250,100,242,
+87,218,76,58,101,181,231,18,29,101,59,228,235,235,190,168,190,160,132,1,215,
+154,157,214,230,39,36,215,214,29,113,230,199,107,237,93,245,143,247,146,254,
+207,20,124,126,205,227,73,14,174,190,85,159,248,92,128,123,123,126,169,61,219,
+180,28,56,153,246,129,30,100,8,215,235,179,214,146,52,61,49,208,241,37,42,228,
+196,6,10,47,36,231,223,126,215,56,125,62,63,77,238,100,218,172,55,76,147,80,
+218,52,219,204,72,5,187,165,36,140,69,231,177,204,47,212,124,89,71,252,124,89,
+215,88,227,165,137,47,154,90,63,206,139,231,64,181,201,245,34,239,154,87,206,
+11,155,186,94,237,175,19,215,62,186,58,175,214,49,230,113,143,76,152,53,122,
+68,134,86,124,216,68,252,250,69,144,19,214,202,243,98,118,230,42,201,163,224,
+42,201,163,224,42,57,201,149,103,41,121,95,169,129,157,150,158,152,45,78,84,
+49,155,183,54,19,228,130,25,113,134,120,130,1,25,234,2,14,100,200,3,46,233,88,
+120,20,151,5,38,163,201,251,95,107,35,111,43,153,32,23,140,225,246,135,227,56,
+152,250,161,69,222,150,50,25,170,224,246,71,101,38,191,66,192,201,156,227,60,
+67,93,192,129,12,169,88,61,96,150,68,169,97,215,72,105,75,231,23,77,193,134,
+164,235,156,76,123,208,23,221,56,31,100,168,151,227,182,244,76,5,127,205,46,
+15,246,248,38,245,62,211,62,215,237,28,48,78,5,123,213,230,17,231,100,232,55,
+198,27,34,99,174,224,182,116,166,130,125,58,7,58,193,37,60,126,138,236,46,119,
+50,237,3,189,146,33,159,96,13,241,4,51,145,205,202,243,158,206,133,94,176,79,
+241,32,155,113,97,142,161,174,224,20,1,174,15,25,135,121,32,67,62,193,93,193,
+128,10,238,205,176,32,67,191,0,95,201,102,95,152,123,21,7,186,138,125,37,174,
+97,77,155,245,13,163,4,157,224,142,88,67,189,63,123,159,125,156,255,85,191,
+195,190,49,233,53,249,93,231,132,177,232,64,124,96,215,151,14,242,140,223,114,
+39,211,170,62,158,169,130,53,14,127,214,218,186,209,134,190,240,132,220,176,
+160,45,113,76,188,38,40,166,218,220,58,147,14,114,39,211,102,125,195,56,65,46,
+24,227,173,26,169,96,183,148,132,177,232,52,170,254,75,16,214,12,177,159,190,
+212,134,30,148,127,251,29,114,126,249,167,117,137,245,80,27,218,118,9,125,192,
+28,62,143,235,122,235,234,10,149,57,239,52,47,141,40,105,152,71,100,232,130,
+79,163,19,235,188,170,115,174,146,60,10,174,146,60,10,174,146,147,92,121,150,
+146,247,149,26,216,105,233,137,217,226,68,21,179,121,107,51,65,46,152,17,103,
+136,39,24,144,161,46,224,64,134,60,224,146,238,11,247,43,52,189,19,155,191,31,
+136,224,109,37,19,228,130,49,220,254,112,204,67,15,196,13,121,56,108,43,25,
+170,224,246,71,101,38,191,66,192,201,156,227,60,67,93,192,129,12,169,88,30,
+204,95,123,209,124,64,5,127,205,110,28,222,143,110,158,38,171,116,5,227,84,
+176,87,109,30,113,78,134,126,99,188,33,50,230,10,110,75,103,42,216,167,115,
+160,19,92,194,227,167,200,238,114,39,211,62,208,43,25,242,9,214,16,79,48,19,
+217,172,60,239,233,92,232,5,251,20,15,178,25,23,230,24,234,2,174,146,205,186,
+56,207,144,79,112,87,48,160,130,123,51,44,200,208,47,192,87,178,217,23,230,94,
+197,129,174,98,95,137,107,88,211,102,125,195,40,65,39,184,35,214,80,239,207,
+222,103,31,199,47,47,63,176,231,32,149,239,249,38,189,38,191,235,156,48,22,
+221,171,215,114,50,173,234,243,51,155,83,252,51,6,95,111,177,211,26,85,27,87,
+94,52,201,249,153,109,35,206,126,155,116,144,59,153,54,235,27,198,9,114,193,
+24,111,213,72,5,187,165,36,140,69,103,250,52,210,56,37,135,198,58,55,158,157,
+201,143,230,229,154,103,221,213,245,214,213,21,42,115,222,116,158,33,158,96,
+148,12,253,2,188,147,205,242,57,58,91,185,74,242,40,184,74,242,40,184,74,78,
+114,229,89,74,182,63,111,183,255,5,75,238,218,119,32,100,170,216,0,0,0,0,73,
+69,78,68,174,66,96,130 };
+static const char*
+default_charset = R"( abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.!?;:-_/|\!'"+=*()[]{}&%$#@<>^`~)";
+#include "libjin/jin.h"
+
+static const JinEngine::Graphics::Color default_font_split(255, 0, 255, 255);